iaxmodem-1.2.0/0000755000175000017500000000000011150047622012651 5ustar julienjulieniaxmodem-1.2.0/iaxmodem.init.suse0000644000175000017500000000357411150047201016321 0ustar julienjulien#! /bin/sh # abcona e. K. Steinbach, Germany, # Free to use without guarantee # # Author: Angelo Malaguarnera # # /etc/init.d/iaxmodem # and its symbolic link # /usr/sbin/iaxmodem # ### BEGIN INIT INFO # Provides: iaxmodem # Required-Stop: # Default-Start: 3 5 # Default-Stop: 0 1 2 6 # Description: IAXMODEM for asterix to hylafax ### END INIT INFO IAXMODEM_BIN="/usr/sbin/iaxmodem" PID_FILE="/var/run/iaxmodem.pid" . /etc/rc.status rc_reset # Check for missing binary if [ ! -x ${IAXMODEM_BIN} ]; then echo -n >&2 "IAXmodem daemon, ${IAXMODEM_BIN} is not installed. " rc_status -s exit 5 fi # be extra carefull cause connection fail if TMPDIR is not writeable export TMPDIR="/var/tmp" case "$1" in start) echo -n "Starting iaxmodem daemon " checkproc -p ${PID_FILE} ${IAXMODEM_BIN} case $? in 0) echo -n "- Warning: daemon already running. " ;; 1) echo -n "- Warning: ${PID_FILE} exists. " ;; esac startproc -p ${PID_FILE} ${IAXMODEM_BIN} rc_status -v ;; stop) echo -n "Shutting down iaxmodem daemon " checkproc -p ${PID_FILE} ${IAXMODEM_BIN} || \ echo -n " Warning: daemon not running. " killproc -p ${PID_FILE} -t 10 ${IAXMODEM_BIN} rc_status -v ;; restart) $0 stop $0 start rc_status ;; status) echo -n "Checking for iaxmodem daemon " checkproc -p ${PID_FILE} ${IAXMODEM_BIN} rc_status -v ;; *) echo "Usage: $0 {start|stop|status|restart}" exit 1 ;; esac rc_exit iaxmodem-1.2.0/iaxmodem.c0000644000175000017500000015111411150047201014614 0ustar julienjulien/* * Copyright (C) 2005-2006 Lee Howard * Copyright (C) 2006 Julien BLACHE / Linbox FAS * * 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. * * The GNU General Public License can be found at * http://www.gnu.org/licenses/gpl.html. */ #define _GNU_SOURCE #include #include #include #ifndef __OpenBSD__ # ifndef USE_UNIX98_PTY # include # endif /* !USE_UNIX98_PTY */ #else # include #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifndef O_LARGEFILE #define O_LARGEFILE 0 #endif #include #ifdef STATICLIBS #include #else #include #endif #ifndef MODEMVER #define MODEMVER "0.0.0" #endif #ifndef DSPVER #define DSPVER "0.0.0" #endif #ifndef IAXVER #define IAXVER "0.0.0" #endif /* Forward declaration - defined in iax.c from libiax2 */ extern void iax_disable_jitterbuffer(void); #define MODEM_ONHOOK 0 #define MODEM_OFFHOOK 1 #define MODEM_RINGING 2 #define MODEM_CALLING 3 #define MODEM_CONNECTED 4 #define PHONE_FREED 0 #define PHONE_CALLACCEPTED 1 #define PHONE_RINGING 2 #define PHONE_ANSWERED 3 #define PHONE_CONNECTED 4 #define UNREGISTERED 0 #define REGISTERED 1 #define PENDING 2 /* Packet length is 20 ms. At 8000 Hz that's 160 samples. */ #define VOIP_PACKET_LENGTH 20000 #define VOIP_PACKET_SIZE 160 #define CODEC_SUPPORT AST_FORMAT_SLINEAR|AST_FORMAT_ULAW|AST_FORMAT_ALAW #define DSP_BUFSIZE T31_TX_BUF_LEN static int amaster, aslave; static int modemstate = MODEM_ONHOOK; static int phonestate = PHONE_FREED; static int regstate = UNREGISTERED; static struct iax_session *session[2]; /* one for calls, the other for registration */ static int dspaudiofd = -1, iaxaudiofd = -1; static char dspaudiofile[50]; static char iaxaudiofile[50]; static char dspnowaudiofile[50]; static char iaxnowaudiofile[50]; static struct timeval now, lasthangup, nextaudio; /* target time for next audio */ static int window = 1000; /* u-sec prior to target that we will let audio go */ static int codec = AST_FORMAT_SLINEAR; /* negotiated codec */ static int port = 4569; static int refreshreq = 300; /* requested refresh */ static int refresh = 300; /* negotiated refresh, initialize equal to refreshreq */ static int codecreq = AST_FORMAT_SLINEAR; /* requested codec */ static char devlink[64]; static char devowner[64]; /* owner:group for the slave tty */ static char devmode[64]; /* mode for the slave tty */ static char server[64]; static char regpeer[64]; static char regsecret[64]; static char cidname[64]; static char cidnumber[64]; static char call_time[16]; static char call_date[16]; static char *dialextra = NULL; static int record = 0; static int replay = 0; static int nojitterbuffer = 0; static int iax2debug = 0; static int dspdebug = 0; static int nodaemon = 0; static int commalen = 2; static int defskew = 0; static int skew; struct modem { int pid; char *config; struct modem *next; }; static int numchild; /* number of children */ static int gothup; /* got SIGHUP ? */ static struct modem *modems; /* linked list of children */ /* Mode for the log files */ int logmode = S_IRUSR | S_IWUSR | S_IRGRP; #define LOG_ERROR stderr #define LOG_INFO stdout #ifdef SOLARIS #include "compat/daemon.c" #include "compat/timers.c" #include "compat/strings.c" #include "compat/headers.h" #include "sys/stropts.h" #endif void printlog(FILE *fp, char *fmt, ...) { va_list ap; char buf[32]; time_t tt; struct tm *ttm; time(&tt); ttm = localtime(&tt); strftime(buf, sizeof(buf), "[%Y-%m-%d %H:%M:%S] ", ttm); fprintf(fp, "%s", buf); va_start(ap, fmt); vfprintf(fp, fmt, ap); va_end(ap); } void checklog(char* filename) { struct stat fs; if (stat(filename, &fs) == 0) { if (fs.st_size > 0x40000000) { char oname[256]; snprintf(oname, sizeof(oname), "%s.old", filename); rename(filename, oname); } } } void cleanup(int sig) { if (refreshreq && regstate == REGISTERED) { struct iax_event *iaxevent = 0; session[1] = iax_session_new(); iax_unregister(session[1], server, regpeer, regsecret, "Exiting"); while (!(iaxevent = iax_get_event(1))); iax_event_free(iaxevent); iax_destroy(session[1]); iax_destroy(session[0]); } /* Escalate privileges */ seteuid(0); setegid(0); unlink(devlink); close(amaster); close(aslave); if (record) { if (dspaudiofd > 0) { close(dspaudiofd); rename(dspnowaudiofile, dspaudiofile); } if (iaxaudiofd > 0) { close(iaxaudiofd); rename(iaxnowaudiofile, iaxaudiofile); } } else if (replay) { close(dspaudiofd); close(iaxaudiofd); } _exit(sig); } void sighandler(int sig) { signal(SIGINT, NULL); signal(SIGTERM, NULL); printlog(LOG_ERROR, "Terminating on signal %d...\n", sig); cleanup(sig); } void sighandler_hup(int sig) { if (phonestate != PHONE_FREED || modemstate != MODEM_ONHOOK) { gothup = 1; } else { sighandler(sig); } } void sighandler_alarm(int sig) { int other = 0; char dtmf[2]; dtmf[1] = '\0'; while (dialextra && *dialextra != '\0' && *dialextra != ',') { dtmf[0] = *dialextra; printlog(LOG_INFO, "Dialing DTMF '%s'\n", dtmf); iax_send_dtmf(session[0], *dialextra); dialextra++; } while (dialextra && *dialextra == ',') { other += commalen; dialextra++; } if (other) { printlog(LOG_INFO, "Dialing pause %d second(s)\n", other); alarm(other); } else dialextra = NULL; } void orderbytes(int16_t *buf, int len) { int i = 0; for (; i < len; i++) { buf[i] = ntohs(buf[i]); } } int timediff(struct timeval a, struct timeval b) { struct timeval tv; timersub(&a, &b, &tv); /* The return value, in microseconds, will overflow a signed 32-bit integer every 36 minutes. As we don't need to account for timings that long anyway we cap the timer at 5-minutes. */ return (tv.tv_sec > 300 ? 300000000 : tv.tv_sec * 1000000 + tv.tv_usec); } void printtime() { char buf[32]; gettimeofday(&now, NULL); strftime(buf, sizeof(buf), "%h %d %T", localtime((time_t*) &now.tv_sec)); printf("%s", buf); printf(".%02ld: ", now.tv_usec/10000); } void setconfigline(char *line) { if (strchr(line, '%')) return; /* don't allow troublesome "%" in configs */ /* trim comments */ if (strchr(line, ';')) line[strchr(line, ';') - line] = '\0'; /* trim trailing whitespace */ while (line[strlen(line) - 1] == ' ' || line[strlen(line) - 1] == '\t') line[strlen(line) - 1] = '\0'; if (strncasecmp(line, "device", 6) == 0) { line += 6; while (*line == '\t' || *line == ' ') line++; strncpy(devlink, line, 64); printlog(LOG_INFO, "Setting device = '%s'\n", devlink); } if (strncasecmp(line, "owner", 5) == 0) { line += 5; while (*line == '\t' || *line == ' ') line++; strncpy(devowner, line, 64); printlog(LOG_INFO, "Setting owner = '%s'\n", devowner); } if (strncasecmp(line, "mode", 4) == 0) { line += 4; while (*line == '\t' || *line == ' ') line++; strncpy(devmode, line, 64); printlog(LOG_INFO, "Setting mode = '%s'\n", devmode); } if (strncasecmp(line, "port", 4) == 0) { line += 4; while (*line == '\t' || *line == ' ') line++; port = atoi(line); printlog(LOG_INFO, "Setting port = %d\n", port); } if (strncasecmp(line, "refresh", 7) == 0) { line += 7; while (*line == '\t' || *line == ' ') line++; refreshreq = atoi(line); printlog(LOG_INFO, "Setting refresh = %d\n", refreshreq); } if (strncasecmp(line, "server", 6) == 0) { line += 6; while (*line == '\t' || *line == ' ') line++; strncpy(server, line, 64); printlog(LOG_INFO, "Setting server = '%s'\n", server); } if (strncasecmp(line, "peername", 8) == 0) { line += 8; while (*line == '\t' || *line == ' ') line++; strncpy(regpeer, line, 64); printlog(LOG_INFO, "Setting peername = '%s'\n", regpeer); } if (strncasecmp(line, "secret", 6) == 0) { line += 6; while (*line == '\t' || *line == ' ') line++; strncpy(regsecret, line, 64); printlog(LOG_INFO, "Setting secret = '%s'\n", regsecret); } if (strncasecmp(line, "cidname", 7) == 0) { line += 7; while (*line == '\t' || *line == ' ') line++; strncpy(cidname, line, 64); printlog(LOG_INFO, "Setting cidname = '%s'\n", cidname); } if (strncasecmp(line, "cidnumber", 9) == 0) { line += 9; while (*line == '\t' || *line == ' ') line++; strncpy(cidnumber, line, 64); printlog(LOG_INFO, "Setting cidnumber = '%s'\n", cidnumber); } if (strncasecmp(line, "codec", 5) == 0) { line += 5; while (*line == '\t' || *line == ' ') line++; if (strcasecmp(line, "slinear") == 0) { codecreq = AST_FORMAT_SLINEAR; printlog(LOG_INFO, "Setting codec = slinear\n"); } else if (strcasecmp(line, "ulaw") == 0) { codecreq = AST_FORMAT_ULAW; printlog(LOG_INFO, "Setting codec = ulaw\n"); } else if (strcasecmp(line, "alaw") == 0) { codecreq = AST_FORMAT_ALAW; printlog(LOG_INFO, "Setting codec = alaw\n"); } } if (strncasecmp(line, "record", 6) == 0) { record = 1; printlog(LOG_INFO, "Enabling record\n"); } if (strncasecmp(line, "replay", 6) == 0) { replay = 1; printlog(LOG_INFO, "Enabling replay\n"); } if (strncasecmp(line, "nojitterbuffer", 12) == 0) { nojitterbuffer = 1; printlog(LOG_INFO, "Disabling jitterbuffer\n"); } if (strncasecmp(line, "iax2debug", 9) == 0) { iax2debug = 1; printlog(LOG_INFO, "Enabling IAX2 debugging\n"); } if (strncasecmp(line, "dspdebug", 8) == 0) { dspdebug = 1; printlog(LOG_INFO, "Enabling DSP debugging\n"); } if (strncasecmp(line, "nodaemon", 8) == 0) { nodaemon = 1; printlog(LOG_INFO, "This modem is exempt from daemon use.\n"); } if (strncasecmp(line, "skew", 4) == 0) { line += 4; while (*line == '\t' || *line == ' ') line++; defskew = atoi(line); printlog(LOG_INFO, "Setting skew = %d\n", defskew); } } void readconfig(const char *name) { if (!strchr(name, '%')) { char filename[256]; snprintf(filename, sizeof(filename), "/etc/iaxmodem/%s", name); int fd = open(filename, O_RDONLY); if (fd < 0) { printlog(LOG_ERROR, "Cannot open %s.\n", filename); cleanup(-1); } int cc, pos = 0; char line[1024]; memset(line, 0, 1024); while ((cc = read(fd, &line[pos], 1))) { if (line[pos] == '\n' || pos == 1023) { line[pos] = '\0'; setconfigline(line); memset(line, 0, 1024); pos = 0; } else pos++; } if (strlen(line)) { setconfigline(line); } if (replay && record) { record = 0; printlog(LOG_INFO, "Disabling record\n"); } close(fd); } } int at_tx_handler(at_state_t *s, void *user_data, const uint8_t *buf, size_t len) { ssize_t wrote = write(amaster, buf, len); if (wrote != len) { printlog(LOG_ERROR, "Unable to pass the full buffer onto the device file. %zd bytes of %d written: %s\n", wrote, len, strerror(errno)); if (wrote == -1) wrote = 0; /* nothing was written */ /* The pty has a limited buffer size. (On my system it's 4095 bytes.) Being here tells us that the pty buffer is full, and that generally indicates that nothing is reading the tty on the other end. In order to make room for future writes we need to flush the pty buffer. */ if (tcflush(amaster, TCOFLUSH)) { printlog(LOG_ERROR, "Unable to flush pty master buffer: %s\n", strerror(errno)); } else if (tcflush(aslave, TCOFLUSH)) { printlog(LOG_ERROR, "Unable to flush pty slave buffer: %s\n", strerror(errno)); } else { printlog(LOG_INFO, "Successfully flushed pty buffer\n"); } } return wrote; } static int t31_call_control_handler(t31_state_t *s, void *user_data, int op, const char *num) { int info = 0; switch (op) { case AT_MODEM_CONTROL_CALL: /* Dialing */ if (modemstate == MODEM_CONNECTED && num[0] == '\0') { // play CNG for an off-hook call t31_call_event(s, AT_CALL_EVENT_CONNECTED); break; } if (modemstate != MODEM_ONHOOK && modemstate != MODEM_OFFHOOK) return -1; if (!strchr(num, '%')) { session[0] = iax_session_new(); char *nnum = strndup(num, 256); char *nnump = strchr(nnum, ','); if (nnump) { dialextra = strndup(nnump, 64); nnump[0] = '\0'; } printlog(LOG_INFO, "Dialing '%s'\n", nnum); char ich[256]; snprintf(ich, sizeof(ich), "%s:%s@%s/%s", regpeer, regsecret, server, nnum); iax_call(session[0], cidnumber, cidname, ich, NULL, 0, codecreq, CODEC_SUPPORT); modemstate = MODEM_CALLING; } break; case AT_MODEM_CONTROL_OFFHOOK: /* Take receiver off-hook (busy-out) */ if (modemstate == MODEM_ONHOOK) { printlog(LOG_INFO, "Taking receiver off-hook.\n"); modemstate = MODEM_OFFHOOK; break; } else if (modemstate != MODEM_RINGING) { return -1; } info = 1; // indicator to not play CED /* pass a ringing modem through... */ case AT_MODEM_CONTROL_ANSWER: /* Answering */ if (modemstate == MODEM_CONNECTED) { // play CED for an off-hook call t31_call_event(s, AT_CALL_EVENT_ANSWERED); break; } if (modemstate != MODEM_RINGING) return -1; printlog(LOG_INFO, "Answering\n"); /* Unset V.24 Circuit 125, "ring indicator". */ int tioflags; ioctl(aslave, TIOCMGET, &tioflags); tioflags |= TIOCM_RI; ioctl(aslave, TIOCMSET, &tioflags); iax_answer(session[0]); if (!info) t31_call_event(s, AT_CALL_EVENT_ANSWERED); modemstate = MODEM_CONNECTED; gettimeofday(&nextaudio, NULL); nextaudio.tv_usec += (VOIP_PACKET_LENGTH + skew); if (nextaudio.tv_usec >= 1000000) { nextaudio.tv_sec += 1; nextaudio.tv_usec -= 1000000; } if (record) { if (dspaudiofd > 0) { close(dspaudiofd); rename(dspnowaudiofile, dspaudiofile); } if (iaxaudiofd > 0) { close(iaxaudiofd); rename(iaxnowaudiofile, iaxaudiofile); } dspaudiofd = open(dspnowaudiofile, O_WRONLY|O_CREAT, 00660); iaxaudiofd = open(iaxnowaudiofile, O_WRONLY|O_CREAT, 00660); } else if (replay) { if (dspaudiofd > 0) close(dspaudiofd); if (iaxaudiofd > 0) close(iaxaudiofd); dspaudiofd = open(dspaudiofile, O_RDONLY); iaxaudiofd = open(iaxaudiofile, O_RDONLY); } break; case AT_MODEM_CONTROL_HANGUP: /* Hang up */ printlog(LOG_INFO, "Hanging Up\n"); modemstate = MODEM_ONHOOK; if (record) { if (dspaudiofd > 0) { close(dspaudiofd); rename(dspnowaudiofile, dspaudiofile); } if (iaxaudiofd > 0) { close(iaxaudiofd); rename(iaxnowaudiofile, iaxaudiofile); } } else if (replay) { if (dspaudiofd > 0) close(dspaudiofd); if (iaxaudiofd > 0) close(iaxaudiofd); } dspaudiofd = -1; iaxaudiofd = -1; gettimeofday(&lasthangup, NULL); if (phonestate != PHONE_FREED) { iax_hangup(session[0], "Normal disconnect"); iax_destroy(session[0]); phonestate = PHONE_FREED; if (gothup) sighandler(SIGHUP); } if (modemstate != MODEM_CALLING && modemstate != MODEM_CONNECTED) return -1; break; case AT_MODEM_CONTROL_CTS: { if (num) { u_char xon[1]; xon[0] = 0x11; at_tx_handler(&s->at_state, NULL, xon, 1); // printtime(); printf("XON\n"); } else { u_char xoff[1]; xoff[0] = 0x13; at_tx_handler(&s->at_state, NULL, xoff, 1); // printtime(); printf("XOFF\n"); } } break; case AT_MODEM_CONTROL_SETID: /* Set Caller*ID */ { char id[65]; strncpy(id, num, 64); id[64] = '\0'; char *marker = (strstr(id, "\",\"")); if (!marker) { cidname[0] = '\0'; strcpy(cidnumber, id); } else { char *fquote = strchr(id, '"'); char *lquote = strrchr(id, '"'); int len = marker - fquote - 1; if (len < 0) len = 0; strncpy(cidname, fquote + 1, len); cidname[len] = '\0'; len = lquote - marker - 3; if (len < 0) len = 0; strncpy(cidnumber, marker + 3, len); cidnumber[len] = '\0'; } } break; case AT_MODEM_CONTROL_RNG: /* Ring indicator, ignore it */ break; case AT_MODEM_CONTROL_ONHOOK: /* Hangup indicator, ignore it */ break; default: printlog(LOG_ERROR, "Unknown DSP control handler: %d\n", op); break; } return 0; } void iaxmodem(const char *config, int nondaemon) { /* * IAXmodem is started as root, but drops privileges once the * required superuser tasks are performed. */ uid_t uucp_uid; gid_t uucp_gid; struct passwd *pwent; int fd; char logfile[256]; printlog(LOG_ERROR, "Modem started\n"); pwent = getpwnam("uucp"); if (pwent == NULL) { printlog(LOG_ERROR, "Fatal error: uucp user not found in passwd file\n"); _exit(-1); } uucp_uid = pwent->pw_uid; uucp_gid = pwent->pw_gid; strcpy(devlink, "/dev/iaxmodem"); strcpy(server, "127.0.0.1"); strcpy(regpeer, ""); strcpy(cidname, "IAXmodem"); strcpy(cidnumber, ""); if (!nondaemon) { /* We don't read it, so close stdin. */ close(STDIN_FILENO); /* Redirect stdout to /dev/null. */ fd = open("/dev/null", O_WRONLY); if (fd < 0) { printlog(LOG_ERROR, "Error: could not open /dev/null: %s\n", strerror(errno)); } else { dup2(fd, STDOUT_FILENO); } close(fd); /* Redirect stderr to the log file */ snprintf(logfile, sizeof(logfile), "/var/log/iaxmodem/%s", config); checklog(logfile); fd = open(logfile, O_WRONLY | O_APPEND | O_CREAT | O_LARGEFILE, logmode); if (fd < 0) { printlog(LOG_ERROR, "Error: could not open %s: %s\n", logfile, strerror(errno)); } else { dup2(fd, STDERR_FILENO); } close(fd); } readconfig(config); if (!nondaemon && nodaemon) { /* This modem is exempted from daemon use. */ _exit(0); } gothup = 0; signal(SIGINT, sighandler); signal(SIGTERM, sighandler); signal(SIGHUP, sighandler_hup); signal(SIGALRM, sighandler_alarm); int iaxnetfd; struct iax_event *iaxevent = 0; session[0] = NULL; session[1] = NULL; struct timeval lastreg, lastring, lastdtedata; gettimeofday(&lastdtedata, NULL); lastdtedata.tv_sec -= 60; gettimeofday(&lastreg, NULL); lastreg.tv_sec -= (refreshreq > refresh ? (refreshreq+1) : (refresh+1)); gettimeofday(&lastring, NULL); lastring.tv_sec -= 60; gettimeofday(&lasthangup, NULL); lasthangup.tv_sec -= 5; char modembuf[DSP_BUFSIZE]; uint8_t dspbuf[sizeof(int16_t)*VOIP_PACKET_SIZE]; int16_t iaxbuf[VOIP_PACKET_SIZE]; static t31_state_t t31_state; int t31buflen; int tioflags; struct group *grent; char *devgroup; char *pmode; uid_t devuid = 0; gid_t devgid = 0; int dmode = 0; int i; unsigned int last_ts = 0; snprintf(dspnowaudiofile, sizeof(dspnowaudiofile), "/tmp/%s-dsp.raw.recording", regpeer); snprintf(iaxnowaudiofile, sizeof(iaxnowaudiofile), "/tmp/%s-iax.raw.recording", regpeer); snprintf(dspaudiofile, sizeof(dspaudiofile), "/tmp/%s-dsp.raw", regpeer); snprintf(iaxaudiofile, sizeof(iaxaudiofile), "/tmp/%s-iax.raw", regpeer); /* Get the uid/gid corresponding to devowner */ devgroup = strchr(devowner, ':'); if (devgroup != NULL) { *devgroup = '\0'; devgroup++; grent = getgrnam(devgroup); if (grent == NULL) { printlog(LOG_ERROR, "Error: %s group not found in group file, using root instead\n", devgroup); } else { devgid = grent->gr_gid; } } else { printlog(LOG_ERROR, "Error: group unspecified, using root instead\n"); } pwent = getpwnam(devowner); if (pwent == NULL) { printlog(LOG_ERROR, "Error: %s user not found in passwd file, using root instead\n", devowner); } else { devuid = pwent->pw_uid; } /* Compute the mode */ pmode = NULL; if (strlen(devmode) != 4) { if (strlen(devmode) != 3) { printlog(LOG_ERROR, "Error: invalid mode string (%s) ? Leaving default modes on %s\n", devmode, devlink); } else { pmode = devmode; } } else { /* If mode is specified as 0664 for instance, skip the first value (special modes) */ pmode = devmode + 1; } if (pmode != NULL) { for (i = 0; i < 3; i++) { if ((!isdigit(pmode[i])) || (pmode[i] > '6')) { dmode = 0; printlog(LOG_ERROR, "Error: invalid mode string (%s), leaving default modes on %s\n", devmode, devlink); break; } /* Mode is specified as an octal string representing the bitfield, like 664 */ /* convert to numeric shift 3 bits */ dmode |= (pmode[i] - '0') << (3 * (2 - i)); } } #ifndef USE_UNIX98_PTY if (openpty(&amaster, &aslave, NULL, NULL, NULL)) { printlog(LOG_ERROR, "Fatal error: failed to initialize pty\n"); cleanup(-1); } char *stty = ttyname(aslave); if (stty == NULL) { printlog(LOG_ERROR, "Fatal error: failed to obtain slave pty filename\n"); cleanup(-1); } stty = strdup(stty); #else /* USE_UNIX98_PTY */ #ifdef SOLARIS amaster = open("/dev/ptmx", O_RDWR); #else amaster = posix_openpt(O_RDWR | O_NOCTTY); #endif if (amaster < 0) { printlog(LOG_ERROR, "Fatal error: failed to initialize UNIX98 master pty\n"); cleanup(-1); } if (grantpt(amaster) < 0) { printlog(LOG_ERROR, "Fatal error: failed to grant access to slave pty\n"); cleanup(-1); } if (unlockpt(amaster) < 0) { printlog(LOG_ERROR, "Fatal error: failed to unlock slave pty\n"); cleanup(-1); } char *stty = ptsname(amaster); if (stty == NULL) { printlog(LOG_ERROR, "Fatal error: failed to obtain slave pty filename\n"); cleanup(-1); } stty = strdup(stty); aslave = open(stty, O_RDWR); if (aslave < 0) { printlog(LOG_ERROR, "Fatal error: failed to open slave pty %s\n", stty); cleanup(-1); } #ifdef SOLARIS ioctl(aslave, I_PUSH, "ptem"); /* push ptem */ ioctl(aslave, I_PUSH, "ldterm"); /* push ldterm*/ #endif #endif /* !USE_UNIX98_PTY */ printlog(LOG_INFO, "Opened pty, slave device: %s\n", stty); if (!unlink(devlink)) { printlog(LOG_ERROR, "Removed old %s\n", devlink); } int ret = symlink(stty, devlink); free(stty); if (ret < 0) { printlog(LOG_ERROR, "Fatal error: failed to create %s symbolic link\n", devlink); cleanup(-1); } printlog(LOG_INFO, "Created %s symbolic link\n", devlink); if (dmode == 0) { printlog(LOG_ERROR, "Error: mode is 0, leaving default permissions\n"); } else { if (fchown(aslave, devuid, devgid)) { printlog(LOG_ERROR, "Error: cannot set tty owner to %s:%s: %s\n", devowner, devgroup, strerror(errno)); } } if (fchmod(aslave, dmode)) { printlog(LOG_ERROR, "Error: cannot set tty mode to %s: %s\n", devmode, strerror(errno)); } if (fcntl(amaster, F_SETFL, fcntl(amaster, F_GETFL, 0) | O_NONBLOCK)) { printlog(LOG_ERROR, "Cannot set up non-blocking read on %s\n", ttyname(amaster)); cleanup(-1); } /* Root privileges not needed anymore, drop privs. */ setegid(uucp_gid); seteuid(uucp_uid); if ((port = iax_init(port) < 0)) { printlog(LOG_ERROR, "Fatal error: failed to initialize iax with port %d\n", port); cleanup(-1); } iaxnetfd = iax_get_fd(); /* * Disabling the jitterbuffer shouldn't be necessary, and in fact it probably * would be even useful if it worked right, but alas, enabling the jitterbuffer * seems to only make things worse. */ iax_disable_jitterbuffer(); /* * We disable debugging because the screen writes can slow things down. */ if (iax2debug) { iax_enable_debug(); } else { iax_disable_debug(); } if (t31_init(&t31_state, at_tx_handler, NULL, t31_call_control_handler, NULL, NULL, NULL) < 0) { printlog(LOG_ERROR, "Cannot initialize the T.31 modem\n"); cleanup(-1); } /* * Again, debugging should be minimal for normal use as the writes slow things too much. */ if (dspdebug) { t31_state.logging.level = SPAN_LOG_SHOW_SEVERITY | SPAN_LOG_SHOW_PROTOCOL | SPAN_LOG_FLOW; t31_state.audio.modems.v17_rx.logging.level = SPAN_LOG_SHOW_SEVERITY | SPAN_LOG_SHOW_PROTOCOL | SPAN_LOG_FLOW; t31_state.audio.modems.v29_rx.logging.level = SPAN_LOG_SHOW_SEVERITY | SPAN_LOG_SHOW_PROTOCOL | SPAN_LOG_FLOW; t31_state.audio.modems.v27ter_rx.logging.level = SPAN_LOG_SHOW_SEVERITY | SPAN_LOG_SHOW_PROTOCOL | SPAN_LOG_FLOW; } int selectfd, selectretval, selectblock, avail, audiobalance = 0; skew = defskew; struct timeval tv; fd_set select_rfds; for (;;) { gettimeofday(&now, NULL); /* * Here we stop and wait for some socket or device activity or for some needed * action such as DSP audio transmission, a follow-up RING message, a registration * renewal, or an expected IAX event. (The last item here because sometimes * iax_get_event returns data even when no socket activity occurred.) * * When we're in a connected state so much activity occurs on the device node * and on the IAX socket that we'd loop too fast (using too much CPU) in trying * to address it all. As we loop "rather rapidly" anyway (every 20 ms) during * the connected state, and as that's fast enough to address their needs, * we ignore that activity during the connected state and rather focus on the * audio frame timings instead. * * The transmisison of audio frames must be based on a reliable clock, and ideally * that clock would be the same between the two IAX2 endpoints (the same system). * However, even then the "window" value can tend to make audio transmission happen * ever so slightly faster than audio reception. Also, resource consumption and * other things can slow us down. Thus, the "clocking" needs to be slightly * dynamic and must adjust quickly in time to try to keep the transmission and * reception of audio frames at a 1-to-1 ratio. We do this with the "skew", aiming * to keep the "audiobalance" value somewhere between -5 and 5 (+/- 100 ms), * ideally at zero (which would mean a perfect 1-to-1 ratio of rx vs tx frames). */ selectfd = 1, selectretval = -1, selectblock = 0; FD_ZERO(&select_rfds); if (modemstate != MODEM_CONNECTED) { FD_SET(amaster, &select_rfds); FD_SET(iaxnetfd, &select_rfds); selectfd = iaxnetfd > amaster ? iaxnetfd + 1 : amaster + 1; } if (modemstate == MODEM_CONNECTED) { tv.tv_sec = 0; tv.tv_usec = timediff(nextaudio, now) - window; } else if (modemstate == MODEM_RINGING) { tv.tv_sec = 5; tv.tv_usec = 0; /* ring every 5 seconds */ timeradd(&lastring, &tv, &tv); timersub(&tv, &now, &tv); } else if (modemstate == MODEM_CALLING) { tv.tv_sec = 45; tv.tv_usec = 0; /* give up after 45 seconds */ timeradd(&lastdtedata, &tv, &tv); timersub(&tv, &now, &tv); } else if (refreshreq) { /* Handle maintaining registration every refresh - 5 seconds. */ tv.tv_sec = refresh - 5; tv.tv_usec = 0; timeradd(&lastreg, &tv, &tv); timersub(&tv, &now, &tv); } else if (iax_time_to_next_event() >= 0) { /* The actual calculations will be done later. */ tv.tv_sec = 60; tv.tv_usec = 0; } else { /* select may block, no time-based activity */ tv.tv_sec = 0; tv.tv_usec = 0; selectblock = 1; } /* * Ending up here with a slightly negative tv during a connected call will * not be uncommon. We have to send voice frames rather rapidly (20 ms * apart); if the processing of this loop took that much time or * slightly more to perform, then we'll end up with a negative tv * here. As long as most loops do not lag like this then there is not * a problem as the "drift" is corrected in the following iterations * by maintaining a focus on the fixed schedule of sending voice frames. * * The select call here is intended to "throttle" our looping. However, * in cases where tv is zero or negative then there is no throttle. This * presumes, then, that in those cases the rest of the loop has served as * the throttle for that iteration. */ if ((tv.tv_sec == 0 && tv.tv_usec > 0) || (tv.tv_sec > 0 && tv.tv_sec < 3600)) { int nexteventms = iax_time_to_next_event(); /* * iax_time_to_next_event will return 0 when a response is "pending", * like an ACK. These responses are not extremely time sensitive in * comparison to the rest of the things we do, so in order to prevent * fast looping solely for these "pending" events we prevent nexteventms * from causing fast looping. During a call, we pace our looping with * tv, so our "sluggishness" here shouldn't affect audio. * * iax_time_to_next_event will return -1 when there are no pending events, * thus nexteventms less than zero are ignored. */ if (nexteventms >= 0 && nexteventms < 2) nexteventms = 2; if (nexteventms > 0 && nexteventms < tv.tv_sec * 1000 + tv.tv_usec / 1000) { /* Handle expected IAX events perhaps not triggered by IAX socket activity. */ tv.tv_sec = nexteventms / 1000; tv.tv_usec = (nexteventms % 1000) * 1000; } selectretval = select(selectfd, &select_rfds, NULL, NULL, &tv); } else if (selectblock) { /* * There is no time-based activity to worry about. Just watch the fds. */ selectretval = select(selectfd, &select_rfds, NULL, NULL, NULL); } else { /* * We're behind schedule, but in testing this doesn't seem to be a problem. * * We still need to run select in order to flag the select_rfds. */ tv.tv_sec = 0; tv.tv_usec = 0; selectretval = select(selectfd, &select_rfds, NULL, NULL, &tv); } gettimeofday(&now, NULL); /* * Is it time to send more audio? (This comes first for a reason, as it's our priority.) */ if (modemstate == MODEM_CONNECTED && timediff(nextaudio, now) <= window) { nextaudio.tv_usec += (VOIP_PACKET_LENGTH + skew); if (nextaudio.tv_usec >= 1000000) { nextaudio.tv_sec += 1; nextaudio.tv_usec -= 1000000; } memset(dspbuf, (int16_t) 0, sizeof(int16_t)*VOIP_PACKET_SIZE); t31buflen = 0; int gotlen = 0; if (!dialextra) { do { /* * If t31_tx returns less than VOIP_PACKET_SIZE but not zero then it means we're switching * carriers. If it returns zero, then it means we're silent. */ gotlen = t31_tx(&t31_state, (int16_t *) (dspbuf + sizeof(int16_t)*t31buflen), VOIP_PACKET_SIZE - t31buflen); t31buflen += gotlen; } while (t31buflen < VOIP_PACKET_SIZE && gotlen > 0 && modemstate == MODEM_CONNECTED); } if (record) write(dspaudiofd, (uint8_t *) dspbuf, VOIP_PACKET_SIZE*sizeof(int16_t)); if (replay) read(dspaudiofd, (uint8_t *) dspbuf, VOIP_PACKET_SIZE*sizeof(int16_t)); if (modemstate == MODEM_CONNECTED) { /* t31_tx can change modemstate */ audiobalance++; if (audiobalance > 5) { /* * We seem to be getting ahead in our audio transmissions, relative * to the audio receptions. So we lengthen the time between transmissions * (by increasing our perception of VOIP_PACKET_LENGTH), hoping to improve the ratio. * * We are deliberately less-sensitive to getting ahead than we are to getting behind * because having a little bit of buffer in-front of us is better than not. */ audiobalance = 0; /* don't try to make up */ skew += 10; printlog(LOG_INFO, "Adjusting skew to %d.\n", skew); } if (codec == AST_FORMAT_SLINEAR) { orderbytes((int16_t *) dspbuf, VOIP_PACKET_SIZE); iax_send_voice(session[0], AST_FORMAT_SLINEAR, (uint8_t *) dspbuf, VOIP_PACKET_SIZE*(sizeof(int16_t)), VOIP_PACKET_SIZE); } else { unsigned char convertedbuf[VOIP_PACKET_SIZE]; int i = 0; if (codec == AST_FORMAT_ULAW) for (; i < VOIP_PACKET_SIZE; i++) convertedbuf[i] = linear_to_ulaw(((int16_t *) dspbuf)[i]); else for (; i < VOIP_PACKET_SIZE; i++) convertedbuf[i] = linear_to_alaw(((int16_t *) dspbuf)[i]); iax_send_voice(session[0], codec, convertedbuf, VOIP_PACKET_SIZE, VOIP_PACKET_SIZE); } } } /* * Is there tty data coming in from the DTE? * * We don't overfill the buffer... */ avail = DSP_BUFSIZE - t31_state.tx.in_bytes + t31_state.tx.out_bytes - 1; if (avail < 0) { avail = 0; printlog(LOG_INFO, "strange... tx.in_bytes: %d, tx.out_bytes: %d, DSP_BUFSIZE: %d\n", t31_state.tx.in_bytes, t31_state.tx.out_bytes, DSP_BUFSIZE); } else if (avail > DSP_BUFSIZE) { avail = DSP_BUFSIZE; printlog(LOG_INFO, "strange... tx.in_bytes: %d, tx.out_bytes: %d, DSP_BUFSIZE: %d\n", t31_state.tx.in_bytes, t31_state.tx.out_bytes, DSP_BUFSIZE); } if ((modemstate != MODEM_CONNECTED && selectretval && FD_ISSET(amaster, &select_rfds)) || (modemstate == MODEM_CONNECTED && !t31_state.tx.holding && avail)) { ssize_t len; do { len = read(amaster, modembuf, avail); if (len > 0) { int taken = t31_at_rx(&t31_state, modembuf, len); if (taken != len) { /* As we checked the available buffer beforehand and only read and sent that number of bytes, this should not happen, and if it does will cause data loss and possibly timing problems. */ printlog(LOG_ERROR, "Unexpected modem buffering. Sent %zd bytes, modem buffered %d.\n", len, taken); } len -= taken; /* ??? */ avail -= taken; lastdtedata = now; } } while (len > 0 && avail > 0); } /* * Is it time to send another RING message to the DTE? */ if (modemstate == MODEM_RINGING && (lastring.tv_sec + 5 < now.tv_sec || (lastring.tv_sec + 5 == now.tv_sec && lastring.tv_usec <= now.tv_sec))) { t31_call_event(&t31_state, AT_CALL_EVENT_ALERTING); lastring = now; } /* * Did the DCE timeout in sending CONNECT response? */ if (modemstate == MODEM_CALLING && timediff(now, lastdtedata) >= 45000000) { t31_call_event(&t31_state, AT_CALL_EVENT_NO_ANSWER); /* * One would think that this would be appropriate here: * * iax_hangup(session[0], "Give up"); * * Yet, it is sometimes not. It's probably a bug in libiax2, and is * triggered by an incoming call occurring simultaneous with an outgoing * one. In any case, omitting it seems harmless, as iax_destroy seems * to do the necessary job. */ iax_destroy(session[0]); phonestate = PHONE_FREED; modemstate = MODEM_ONHOOK; if (gothup) sighandler(SIGHUP); } /* * Is there any IAX event that we should handle? */ if ((modemstate != MODEM_CONNECTED && selectretval && FD_ISSET(iaxnetfd, &select_rfds)) || modemstate == MODEM_CONNECTED || !iax_time_to_next_event()) { while ((iaxevent = iax_get_event(0))) { switch (iaxevent->etype) { #ifdef IAX_EVENT_NULL case IAX_EVENT_NULL: /* Just ignore it, per lib/libiax2/src/iax-client.h */ break; #endif case IAX_EVENT_REGACK: printlog(LOG_INFO, "Registration completed successfully.\n"); if (iaxevent->ies.refresh > 0) refresh = iaxevent->ies.refresh; regstate = REGISTERED; iax_destroy(session[1]); break; case IAX_EVENT_REGREJ: printlog(LOG_ERROR, "Registration failed.\n"); /* To prevent fast looping with registration-attempts, we leave regstate PENDING. */ //regstate = UNREGISTERED; iax_destroy(session[1]); break; case IAX_EVENT_TIMEOUT: if (regstate == PENDING) { printlog(LOG_ERROR, "Registration timed out.\n"); } break; case IAX_EVENT_ACCEPT: phonestate = PHONE_CALLACCEPTED; printlog(LOG_INFO, "Call accepted.\n"); codec = iaxevent->ies.format; last_ts = 0; break; case IAX_EVENT_RINGA: phonestate = PHONE_RINGING; /* meaning the server detected ringing on the channel */ printlog(LOG_INFO, "Ringing heard.\n"); break; case IAX_EVENT_PONG: /* informative only */ break; case IAX_EVENT_ANSWER: /* the other side answered our call */ phonestate = PHONE_ANSWERED; printlog(LOG_INFO, "Remote answered.\n"); t31_call_event(&t31_state, AT_CALL_EVENT_CONNECTED); gettimeofday(&nextaudio, NULL); nextaudio.tv_usec += (VOIP_PACKET_LENGTH + skew); if (nextaudio.tv_usec >= 1000000) { nextaudio.tv_sec += 1; nextaudio.tv_usec -= 1000000; } modemstate = MODEM_CONNECTED; audiobalance = 0; skew = defskew; if (record) { if (dspaudiofd > 0) { close(dspaudiofd); rename(dspnowaudiofile, dspaudiofile); } if (iaxaudiofd > 0) { close(iaxaudiofd); rename(iaxnowaudiofile, iaxaudiofile); } dspaudiofd = open(dspnowaudiofile, O_WRONLY|O_CREAT, 00660); iaxaudiofd = open(iaxnowaudiofile, O_WRONLY|O_CREAT, 00660); } else if (replay) { if (dspaudiofd > 0) close(dspaudiofd); if (iaxaudiofd > 0) close(iaxaudiofd); dspaudiofd = open(dspaudiofile, O_RDONLY); iaxaudiofd = open(iaxaudiofile, O_RDONLY); } commalen = t31_state.at_state.p.s_regs[8]; // initialize per modem's S-register sighandler_alarm(0); // process dialextra break; case IAX_EVENT_CONNECT: /* incoming call detected */ if (phonestate != PHONE_FREED || modemstate != MODEM_ONHOOK || timediff(now, lasthangup) < 5000000) { /* we can only handle one call at a time, enforce automatic post-hangup busy-out */ iax_reject(iaxevent->session, "Busy"); break; } codec = CODEC_SUPPORT; codec &= iaxevent->ies.format; if (!codec) { codec = codecreq & iaxevent->ies.capability; if (!codec) { codec = CODEC_SUPPORT; codec &= iaxevent->ies.capability; if (codec) { /* we have some matching codec support, so just pick one */ if (codec & AST_FORMAT_SLINEAR) codec = AST_FORMAT_SLINEAR; else if (codec & AST_FORMAT_ALAW) codec = AST_FORMAT_ALAW; else codec = AST_FORMAT_ULAW; } else { /* we cannot support the audio format */ iax_reject(iaxevent->session, "No matching codec support"); break; } } } audiobalance = 0; skew = defskew; last_ts = 0; phonestate = PHONE_CONNECTED; modemstate = MODEM_RINGING; lastring = now; session[0] = iaxevent->session; iax_accept(session[0], codec); iax_ring_announce(session[0]); /* Set V.24 Circuit 125, "ring indicator". */ ioctl(aslave, TIOCMGET, &tioflags); tioflags |= TIOCM_RI; ioctl(aslave, TIOCMSET, &tioflags); printlog(LOG_INFO, "Incoming call connected %s, %s, %s.\n", iaxevent->ies.called_number, iaxevent->ies.calling_number, iaxevent->ies.calling_name); strftime(call_date, sizeof(call_date), "%m%d", localtime((time_t*) &now.tv_sec)); strftime(call_time, sizeof(call_time), "%H%M", localtime((time_t*) &now.tv_sec)); at_reset_call_info(&t31_state.at_state); at_set_call_info(&t31_state.at_state, "DATE", call_date); at_set_call_info(&t31_state.at_state, "TIME", call_time); at_set_call_info(&t31_state.at_state, "NAME", iaxevent->ies.calling_name); at_set_call_info(&t31_state.at_state, "NMBR", iaxevent->ies.calling_number); at_set_call_info(&t31_state.at_state, "ANID", iaxevent->ies.calling_ani); at_set_call_info(&t31_state.at_state, "USER", iaxevent->ies.username); at_set_call_info(&t31_state.at_state, "PASS", iaxevent->ies.password); at_set_call_info(&t31_state.at_state, "CDID", iaxevent->ies.called_context); at_set_call_info(&t31_state.at_state, "NDID", iaxevent->ies.called_number); t31_call_event(&t31_state, AT_CALL_EVENT_ALERTING); break; case IAX_EVENT_BUSY: phonestate = PHONE_FREED; modemstate = MODEM_ONHOOK; t31_call_event(&t31_state, AT_CALL_EVENT_BUSY); iax_hangup(session[0], "Normal disconnect"); if (gothup) sighandler(SIGHUP); break; case IAX_EVENT_HANGUP: printlog(LOG_INFO, "Remote hangup.\n"); if (modemstate != MODEM_ONHOOK) { if (modemstate == MODEM_CALLING) t31_call_event(&t31_state, AT_CALL_EVENT_BUSY); t31_call_event(&t31_state, AT_CALL_EVENT_HANGUP); modemstate = MODEM_ONHOOK; } phonestate = PHONE_FREED; gettimeofday(&lasthangup, NULL); if (record) { if (dspaudiofd > 0) { close(dspaudiofd); rename(dspnowaudiofile, dspaudiofile); } if (iaxaudiofd > 0) { close(iaxaudiofd); rename(iaxnowaudiofile, iaxaudiofile); } } else if (replay) { if (dspaudiofd > 0) close(dspaudiofd); if (iaxaudiofd > 0) close(iaxaudiofd); } dspaudiofd = -1; iaxaudiofd = -1; if (gothup) sighandler(SIGHUP); break; case IAX_EVENT_CNG: /* pseudo-silence */ memset(dspbuf, (int16_t) 0, VOIP_PACKET_SIZE); if (replay) read(iaxaudiofd, (uint8_t *) dspbuf, VOIP_PACKET_SIZE*sizeof(int16_t)); if (!dialextra && modemstate == MODEM_CONNECTED && t31_rx(&t31_state, (int16_t *) dspbuf, VOIP_PACKET_SIZE)) { printlog(LOG_ERROR, "Error sending silence to DSP.\n"); } if (record) write(iaxaudiofd, (uint8_t *) dspbuf, VOIP_PACKET_SIZE*sizeof(int16_t)); break; case IAX_EVENT_VOICE: /* * Watch for IAX2 jitter... the 32-bit timestamp shouldn't ever "wrap" * unless we expect a single call to last more than a month. */ if (!nojitterbuffer && last_ts && iaxevent->ts <= last_ts) { /* * We've already sent audio corresponding to this time. */ break; } if (!nojitterbuffer && last_ts && iaxevent->ts != last_ts + 20) { printlog(LOG_ERROR, "IAX2 jitter - last_ts: %d, ts: %d\n", last_ts, iaxevent->ts); int16_t fillbuf[VOIP_PACKET_SIZE]; memcpy(fillbuf, iaxbuf, VOIP_PACKET_SIZE*sizeof(int16_t)); while (last_ts + 20 < iaxevent->ts) { /* * This audio packet skips ahead. Oops, audio was lost. * Compensate by repeating the last audio packet enough * to fill in the missing time. * * It is important to make sure that we do not replace a * period of non-silence with silence and that silence is * not replaced with non-silence... in order to keep as * syncrhonous with the remote as possible. */ if (replay) read(iaxaudiofd, fillbuf, VOIP_PACKET_SIZE*sizeof(int16_t)); if (!dialextra && modemstate == MODEM_CONNECTED && t31_rx(&t31_state, fillbuf, VOIP_PACKET_SIZE)) { printlog(LOG_ERROR, "Error sending %d units of IAX make-up audio to DSP.\n", VOIP_PACKET_SIZE); } if (record) write(iaxaudiofd, fillbuf, VOIP_PACKET_SIZE*sizeof(int16_t)); last_ts += 20; audiobalance--; } } last_ts = iaxevent->ts; if (modemstate == MODEM_CONNECTED) { audiobalance--; if (audiobalance < -1) { /* * We seem to be getting behind in our audio transmissions, relative * to the audio receptions. So we decrease our perception of VOIP_PACKET_LENGTH, * hoping to improve the ratio. * * We are deliberately very sensitive to getting behind because in many cases * this will result in missing audio (possibly an unintended carrier drop). */ audiobalance = 0; /* don't try to make up */ skew -= 10; printlog(LOG_INFO, "Adjusting skew to %d.\n", skew); } } /* Here's an audio frame from the IAX server, send it to the DSP. */ { int units = iaxevent->datalen; int16_t convertedbuf[iaxevent->datalen]; int16_t* audiodata; int i = 0; switch (codec) { case AST_FORMAT_SLINEAR: units = iaxevent->datalen/sizeof(int16_t); orderbytes((int16_t *) iaxevent->data, units); audiodata = (int16_t*) iaxevent->data; break; case AST_FORMAT_ALAW: for (; i < iaxevent->datalen; i++) convertedbuf[i] = alaw_to_linear((iaxevent->data)[i]); audiodata = convertedbuf; break; case AST_FORMAT_ULAW: for (; i < iaxevent->datalen; i++) convertedbuf[i] = ulaw_to_linear((iaxevent->data)[i]); audiodata = convertedbuf; break; default: printlog(LOG_ERROR, "Unknown codec!\n"); break; } memcpy(iaxbuf, audiodata, units >= VOIP_PACKET_SIZE ? VOIP_PACKET_SIZE*sizeof(int16_t) : units*sizeof(int16_t)); if (replay) read(iaxaudiofd, audiodata, units*sizeof(int16_t)); if (!dialextra && modemstate == MODEM_CONNECTED && t31_rx(&t31_state, audiodata, units)) { printlog(LOG_ERROR, "Error sending %d units of IAX audio to DSP.\n", units); } if (record) write(iaxaudiofd, audiodata, units*sizeof(int16_t)); } break; case IAX_EVENT_TRANSFER: last_ts = 0; audiobalance = 0; skew = defskew; printlog(LOG_INFO, "Call transfer occurred.\n"); session[0] = iaxevent->session; break; case IAX_EVENT_REJECT: printlog(LOG_INFO, "Rejected call.\n"); if (modemstate != MODEM_ONHOOK) { t31_call_event(&t31_state, AT_CALL_EVENT_NO_DIALTONE); modemstate = MODEM_ONHOOK; } phonestate = PHONE_FREED; if (gothup) sighandler(SIGHUP); break; case IAX_EVENT_DTMF: /* only report DTMF if the modem is in command-mode */ if (t31_state.at_state.at_rx_mode == AT_MODE_OFFHOOK_COMMAND || t31_state.at_state.at_rx_mode == AT_MODE_ONHOOK_COMMAND) { char dtmf[16]; snprintf(dtmf, sizeof(dtmf), "\r\nDTMF=%d\r\n", iaxevent->subclass - 48); at_tx_handler(&t31_state.at_state, NULL, (u_char*) dtmf, strlen(dtmf)); } printlog(LOG_INFO, "Received DTMF '%d'\n", iaxevent->subclass - 48); break; default: printlog(LOG_ERROR, "Don't know what to do with IAX event %d.\n", iaxevent->etype); break; } iax_event_free(iaxevent); } } /* * Maintain registration. Registrations use a different * session than actual calls. */ if (refreshreq) { if (now.tv_sec > lastreg.tv_sec + refresh || (now.tv_sec == lastreg.tv_sec + refresh && now.tv_usec > lastreg.tv_usec)) regstate = UNREGISTERED; if (regstate == UNREGISTERED || now.tv_sec > lastreg.tv_sec + refresh - 5 || (now.tv_sec == lastreg.tv_sec + refresh - 5 && now.tv_usec >= lastreg.tv_usec)) { /* refresh our registration */ session[1] = iax_session_new(); iax_register(session[1], server, regpeer, regsecret, refreshreq); lastreg = now; regstate = PENDING; } } } } void add_modem(int pid, char *config) { struct modem *m; struct modem *nm; nm = malloc(sizeof(struct modem)); for (m = modems; (m != NULL) && (m->next != NULL); m = m->next); nm->pid = pid; nm->config = config; nm->next = NULL; if (m != NULL) m->next = nm; else modems = nm; numchild++; } void restart_modem(pid_t pid) { struct modem *m; for (m = modems; m != NULL; m = m->next) { if (m->pid == pid) { pid_t newpid = fork(); if (newpid == 0) { /* child */ iaxmodem(m->config, 0); _exit(255); /* shouldn't ever get here */ } else if (newpid > 0) { /* parent */ m->pid = newpid; } else { /* failed */ printlog(LOG_ERROR, "Error: fork failed: %s\n", strerror(errno)); } break; } } } void remove_modem(int pid) { struct modem *m; struct modem *p = NULL; for (m = modems; (m != NULL) && (m->next != NULL); p = m, m = m->next) { if (m->pid == pid) { if (p != NULL) p->next = m->next; if (m == modems) modems = NULL; free(m->config); free(m); numchild--; break; } } } void remove_all_modems() { struct modem *m; struct modem *p = NULL; for (m = modems; m != NULL; p = m, m = m->next) { free(p->config); free(p); } modems = NULL; } void wait_for_modems() { pid_t pid; int status; while (numchild > 0) { /* Wait for any child to exit */ pid = waitpid(-1, &status, 0); if (pid > 0) { if ((status & 0xFF) == 0x00) status >>= 8; if (status == SIGHUP) { printlog(LOG_ERROR, "iaxmodem process %d ended w/SIGHUP, attempting to restart\n", pid); restart_modem(pid); } else { printlog(LOG_ERROR, "iaxmodem process %d ended, status 0x%X\n", pid, status); remove_modem(pid); } } else { break; } } } void terminate_modems() { struct modem *m; for (m = modems; m != NULL; m = m->next) { kill(m->pid, SIGTERM); } } void reload_modems() { struct modem *m; for (m = modems; m != NULL; m = m->next) { kill(m->pid, SIGHUP); } } int spawn_modems(void) { DIR *cfdir; struct dirent *cf; struct stat st; int len; int pid = -1; char *config = NULL; char filename[256]; /* List configuration files */ cfdir = opendir("/etc/iaxmodem"); if (cfdir == NULL) { printlog(LOG_ERROR, "Error: could not open configuration directory: %s\n", strerror(errno)); return -1; } while ((cf = readdir(cfdir)) != NULL) { /* Skip dotfiles and backup files */ len = strlen(cf->d_name); if ((cf->d_name[0] == '.') || (cf->d_name[0] == '#') || (cf->d_name[len - 1] == '~')) continue; /* Skip anything that isn't a file */ snprintf(filename, sizeof(filename), "/etc/iaxmodem/%s", cf->d_name); if (stat(filename, &st) < 0) { printlog(LOG_INFO, "Could not stat configuration file %s: %s\n", cf->d_name, strerror(errno)); continue; } if (!S_ISREG(st.st_mode)) { printlog(LOG_INFO, "bouh !\n"); continue; } config = strdup(cf->d_name); /* Spawn modem processes */ pid = fork(); if (pid == 0) { /* Child, get out of this loop */ break; } else if (pid > 0) { /* Controlling process */ add_modem(pid, config); } else { /* Failed */ printlog(LOG_ERROR, "Error: fork failed: %s\n", strerror(errno)); if (numchild > 0) { printlog(LOG_ERROR, "%d children spawned, continuing anyway (stopped at %s)\n", numchild, config); } else { return -1; } free(config); break; } } closedir(cfdir); if (pid == 0) { /* Start the modem */ iaxmodem(config, 0); return 1; } return 0; } void ctrl_sighandler(int sig) { signal(SIGHUP, NULL); signal(SIGTERM, NULL); printlog(LOG_ERROR, "Terminating...\n"); /* Terminate children */ terminate_modems(); } void ctrl_hup_sighandler(int sig) { int fd; gothup = 1; printlog(LOG_ERROR, "Configuration changed, restarting...\n"); /* Reopen the log file */ checklog("/var/log/iaxmodem/iaxmodem"); fd = open("/var/log/iaxmodem/iaxmodem", O_WRONLY | O_APPEND | O_CREAT | O_LARGEFILE, logmode); if (fd < 0) { printlog(LOG_ERROR, "Error: could not open /var/log/iaxmodem/iaxmodem: %s\n", strerror(errno)); } else { dup2(fd, STDERR_FILENO); } close(fd); reload_modems(); } int main(int argc, char** argv) { int ret; char config[256]; int isdaemon = 1; int fd; FILE *pidfile; if (geteuid() != 0) { printlog(LOG_ERROR, "Error: run iaxmodem as root\n"); _exit(-1); } if (argc == 2 && strncmp(argv[1], "-V", 2) == 0) { printf("%s\n%s\n%s\n", MODEMVER, DSPVER, IAXVER); _exit(0); } /* If a config is specified, behave in non-daemon mode */ if (argc == 2) { snprintf(config, sizeof(config), "%s", argv[1]); if (!strncmp(config, "-F", 2)) { isdaemon = 0; } else { iaxmodem(config, 1); } } /* * iaxmodem() never returns, so the code below won't be reached if * a config file is specified on the command line */ /* Detach from the console */ if ((isdaemon) && (daemon(0, 1) != 0)) { printlog(LOG_ERROR, "Fatal error: daemon() failed: %s\n", strerror(errno)); exit(-1); } /* Write pid to pidfile */ pidfile = fopen("/var/run/iaxmodem.pid", "w"); if (pidfile == NULL) { printlog(LOG_ERROR, "Fatal error: could not open pidfile /var/run/iaxmodem.pid: %s\n", strerror(errno)); exit(-1); } fprintf(pidfile, "%d\n", (int) getpid()); fclose(pidfile); gothup = 1; signal(SIGTERM, ctrl_sighandler); signal(SIGHUP, ctrl_hup_sighandler); /* No config file specified, be a controlling process for modems */ numchild = 0; modems = NULL; /* Close stdin */ close(STDIN_FILENO); /* Redirect stdout to /dev/null */ fd = open("/dev/null", O_WRONLY); if (fd < 0) { printlog(LOG_ERROR, "Error: could not open /dev/null: %s\n", strerror(errno)); } else { dup2(fd, STDOUT_FILENO); } close(fd); /* Redirect stderr to the log file */ checklog("/var/log/iaxmodem/iaxmodem"); fd = open("/var/log/iaxmodem/iaxmodem", O_WRONLY | O_APPEND | O_CREAT | O_LARGEFILE, logmode); if (fd < 0) { printlog(LOG_ERROR, "Error: could not open /var/log/iaxmodem/iaxmodem: %s\n", strerror(errno)); } else { dup2(fd, STDERR_FILENO); } close(fd); while (gothup) { ret = spawn_modems(); gothup = 0; if (ret == 0) { wait_for_modems(); } else if (ret < 0) { exit(-1); } else { break; } } /* Control process only */ unlink("/var/run/iaxmodem.pid"); exit(0); } iaxmodem-1.2.0/iaxmodem.init.debian0000644000175000017500000000200111150047201016544 0ustar julienjulien#! /bin/sh PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin DAEMON=/usr/bin/iaxmodem NAME=iaxmodem DESC=iaxmodem test -x $DAEMON || exit 0 set -e case "$1" in start) echo -n "Starting $DESC: " start-stop-daemon --start --quiet --pidfile /var/run/$NAME.pid \ --exec $DAEMON echo "$NAME." ;; stop) echo -n "Stopping $DESC: " start-stop-daemon --stop --quiet --pidfile /var/run/$NAME.pid \ --exec $DAEMON echo "$NAME." ;; reload) echo -n "Reloading $DESC: " if [ -e /var/run/$NAME.pid ]; then kill -HUP $(cat /var/run/$NAME.pid) echo "$NAME." else echo "$NAME not running!" exit 1 fi ;; restart|force-reload) echo -n "Restarting $DESC: " start-stop-daemon --stop --quiet --pidfile \ /var/run/$NAME.pid --exec $DAEMON sleep 1 start-stop-daemon --start --quiet --pidfile \ /var/run/$NAME.pid --exec $DAEMON -- $DAEMON_OPTS echo "$NAME." ;; *) N=/etc/init.d/$NAME echo "Usage: $N {start|stop|restart|reload|force-reload}" >&2 exit 1 ;; esac exit 0 iaxmodem-1.2.0/Makefile.in0000644000175000017500000000146111150047201014711 0ustar julienjulienMODEMVER= @VERSION@ DSPVER= @DSPVER@ IAXVER= @IAXVER@ CFLAGS:= -DMODEMVER=\"${MODEMVER}\" -DDSPVER=\"${DSPVER}\" -DIAXVER=\"${IAXVER}\" \ -Wall -g -DSTATICLIBS -DUSE_UNIX98_PTY \ -std=c99 -Ilib/libiax2/src -Ilib/spandsp/src \ ${CFLAGS} OUR_CFLAGS= -Wall -g -DSTATICLIBS -DUSE_UNIX98_PTY \ -std=c99 -Ilib/libiax2/src -Ilib/spandsp/src OBJS= iaxmodem.o lib/spandsp/src/.libs/libspandsp.a lib/libiax2/src/.libs/libiax.a LDFLAGS+= -lm -lutil -ltiff all: iaxmodem iaxmodem: build-libiax build-libspandsp iaxmodem.o ${CC} ${CFLAGS} ${OBJS} -o iaxmodem ${LDFLAGS} iaxmodem.o: iaxmodem.c ${CC} ${CFLAGS} -c iaxmodem.c build-libiax: cd lib/libiax2 && ${MAKE} build-libspandsp: cd lib/spandsp && ${MAKE} clean: rm -f *.o && \ cd lib/libiax2 && ${MAKE} clean && \ cd ../../lib/spandsp && ${MAKE} clean iaxmodem-1.2.0/CHANGES0000644000175000017500000002232311150047201013637 0ustar julienjulien1.2.0 improve skew behavior, especially for faulty RTC; add "skew" config feature add support for command-dial (ATD...;) in spandsp add support for ATA for CED when off-hook and connected to a call add support for ATD for CNG when off-hook and connected to a call fix the ordering of the seteuid()/setegid() (Julien BLACHE) update spandsp to 20080725 snapshot 1.1.1 fix unaligned errors in libiax2 (Gus Bourg) improve training in spandsp V.27ter receive (Steve Underwood) fix a potential crash (divide by zero) in spandsp V.17 receive (Steve Underwood) 1.1.0 kill -HUP now makes the modems wait to restart when they're on-hook improve IAX2 call rejection when the modem is busy by using REJECT instead of ACCEPT+CONGSTN+HANGUP add "nodaemon" config file feature add "iax2debug" and "dspdebug" config file features update spandsp to 20080110 snapshot update libiax2 to current iaxclient/lib/libiax2 + patches 1.0.0 provide strndup for Solaris 0.3.2 support dialing of DTMF and commas support Solaris (thanks, Bruce McAlister) fix receive aborts when carrier is connected fix +FRH:3 from appearing at improper times set hang-up timer on unexpected disconnections as well stop fast looping on registration rejection fix numerous training issues with V.17 rx update spandsp to snapshot 20070802 0.3.1 add -F option to prevent detachment (Francesco P. Sileno) update spandsp to snapshot 20070619 fix possible initial failure to register 0.3.0 skip non-regular files in /etc/iaxmodem (Julien BLACHE) take caution against bad refresh negotiations from the server update spandsp to snapshot 20070502 (adds V.17 rx support) improve the ability to detect quiet signalling (spandsp: fsk min_power) improve the sensitivity to carrier loss (spandsp: power_meter) improve tcflushing when getty not reading pty and buffer fills, prevents fast looping when buffer is filled 0.2.1 update spandsp to snapshot 20070123 on startup rotate log files larger than 1GB, open with O_LARGEFILE use power level of detected signalling in silence identification 0.2.0 add CDID, USER, and PASS (context, username, password) in call identification information add feature-usage of posix_openpt (Julien BLACHE) fix the error of CONNECT appearing when in command-mode (spandsp) update spandsp to snapshot 20061217 add nojitterbuffer configuration option fix jitterbuffer to send non-null audio fix some array size off-by-one counting problems (Hans Petter Selasky) 0.1.16 update spandsp to snapshot 20061116 fix some select racing due to invalid selects and just before NO ANSWERs add "restart modem" feature (kill -HUP) for individual modems fix problem of sending DTE data after a final-frame HDLC message but before the OK and carrier drop add jitterbuffer 0.1.15 attempt to compensate for received jitter rename recorded files to "old" when done recording update spandsp to snapshot 20060907 (and fix spandsp) improve audio file closing add configure and Makefile.in (contrib: Anish Mistry) fix library versioning for static builds 0.1.14 take measures to avoid detecting echo as signalling ignore spandsp "on hook" handler messages ignore DTMF when not received in command-mode more finely tune V.29 and V.27ter rx training (spandsp) 0.1.13 properly terminate Phase C reception data when an unexpected disconnection occurs there fix idle-busy condition (report: Francesco Romano, Olaf Ferger) flush pty buffer if it fills 0.1.12 cause the AT command interpreter to be more strict (spandsp) fix condition where DTE input would not be passed on to spandsp when it should have been enable data flow if flow control is off on hangup (spandsp) add IAX2 DTMF recognition and reporting fix V.21 HDLC flags threshold detection (spandsp) 0.1.11 update spandsp to 0.0.3-snapshot-20060707 add support for comments begun by ";" in the config files fix "Setting refresh" output information 0.1.10 add 5-second automatic busy-out after hangups ensure use of iax_destroy(session) after iax_hangups removed -O2 from build script as reports claim it helps stability implement an inactivity timeout in stuffed tx mode (spandsp) fix -V version output for libiax2 and spandsp 0.1.9 configure and make libs automatically with 'build static' apply fix for CORE-2006-0327 libiax2 vulnerability properly place the modem on-hook on a hangup (spandsp) don't skew due to incoming audio before the call is answered 0.1.8 log received IAX2 jitter fix a logic error that could cause fast looping (report Lee Archer) fix "no room in buffer" error messages fix IAX2 timestamp interpretation on miniframes (libiax2) fix md5 auth on x86-64 (from iaxclient, Steve Kann, Steve Underwood) add quoting on version defines (Stefan Knoblich) 0.1.7 update spandsp to 0.0.3-snapshot-20060525 (fixes CNG, report Xavier Caro) 0.1.6 add support for AT+VSID="%s","%d", Caller*ID setting from DTE improve V.17 rx training (spandsp, Bartek Kania, Steve Underwood) update spandsp to 0.0.3-snapshot-20060523 0.1.5 fix x86-64 spandsp build problem (report: Julien BLACHE, fix: Steve Underwood) re-fix potentially missing V.21 CONNECT messages (spandsp) 0.1.4 handle error situation where DSP may not have any available space for more tty data (report: Martin Vit) adjust iaxmodem.c and libiax2 for OpenBSD (Todd T. Fries) update spandsp to 0.0.3-snapshot-20060427 add command-line -V (version) argument and response 0.1.3 fix potentially missing V.21 CONNECT messages (spandsp) ignore spandsp's ring indicator add auto-answer (e.g. ATS0=1) support (spandsp) make V.29 rx more sensitive (spandsp) 0.1.2 improve logging features (Julien BLACHE) cope with audio that is non-zero centered (spandsp, Steve Underwood) fix lrintf() warning on static builds (Julien BLACHE) 0.1.1 fix timeout on calling for initial carrier detection (spandsp) add silent dial support (spandsp) don't loop fast when not registering don't exit on registration failure (request: Julien BLACHE) add init script for Fedora (Erik L. Smith) reduce the amount of logging by V.17 receive improve the timing of OK results after AT+FRH=3 commands (spandsp) 0.1.0 use new spandsp-t31 CallID methods update spandsp to 0.0.3 20060226 snapshot add run as daemon option (Julien BLACHE) move config files to /etc/iaxmodem (Julien BLACHE) add owner and mode config file options (Julien BLACHE) drop privileges once the device is set up (Julien BLACHE) fix various warnings and missing includes (Julien BLACHE) add static library build support (Julien BLACHE) add init script (Julien BLACHE) add iaxmodem man page (Julien BLACHE) 0.0.14 fix libiax2 to support POKE (keepalive, qualify=yes) process more than one libiax2 event during a loop (this is a big fix, especially for senders) add "skew" self-clocking control to try to keep the transmit window from making us transmit too fast perform select even when we're behind to fix the flagging of the file descriptor checks update libiax2 from iaxclient reduce the amount of debugging output from libiax2 improve the timing of CONNECT responses after AT+FRH=3 commands (spandsp) 0.0.13 fix the return value of t31_at_tx_handler to prevent lock-ups ensure that DLE+ETX gets delivered upon some kinds of unexpected hangups 0.0.12 make ATH1 return OK if in command mode, even if the modem is already off-hook (spandsp) make ATZ put the modem on-hook state internally because it does hang-up (spandsp) replace libtool symlinks with files (libiax2) 0.0.11 fix flow control and buffer handling broken by 0.0.8 spandsp update (report: Russ Price) 0.0.10 fix tone generation in spandsp (fix by Steve Underwood., report by Russ Price) 0.0.9 update spandsp to 20060205 snapshot add ATH1 (busy-out) command support fix errors with pointers to call id strings close the config file after reading it change xon/xoff char to u_char change exit() to _exit() 0.0.8 add "refresh: 0" support (disable registration) update spandsp to 20051220 snapshot 0.0.7 update libiax2 from CVS (2005-12-02) add support for ulaw and alaw fix memory leaks in libiax2 usage 0.0.6 use ntohs instead of swapbytes improve error logging on short writes 0.0.5 some code optimizing (report: Martin Vit) added record and replay options improve transmission of audio before hangup Call ID integration into spandsp fix spandsp handling of Class 1.0 utilize select return value (report: Martin Vit) 0.0.4 add Class1AdaptRecvCmd to HylaFAX config fix CPU usage of the main loop (report: Martin Vit) 0.0.3 fix select error of using negative values (report: Martin Vit) move HDLC transmit timeout into spandsp update to spandsp-0.0.3pre3, fixing some of it add AT+FAR=1 support (spandsp) add proper +FCERROR reporting (spandsp) result NO CARRIER if hangup occurs during AT+FRS=n (spandsp) ensure RINGs don't occur after ATA added ANI reporting via "ANID" response change usage of iax_busy to iax_congestion added iax_congestion to libiax2 0.0.2 improved transmit flow control improved transmit buffer recycling (spandsp) enable V.17 in spandsp modify HylaFAX config to disable it on receiving improved AT command-response behavior (spandsp) improved timestamp syncrhonization on 16-bit overflow (libiax2) improved HDLC frame preamble detection (spandsp) 0.0.1 initial release iaxmodem-1.2.0/compat/0000755000175000017500000000000011150047201014125 5ustar julienjulieniaxmodem-1.2.0/compat/timers.c0000644000175000017500000000432411150047201015577 0ustar julienjulien/* Copyright (C) 1991-1994,1996-2002,2003 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. The GNU C Library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with the GNU C Library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ # define timeradd(a, b, result) \ do { \ (result)->tv_sec = (a)->tv_sec + (b)->tv_sec; \ (result)->tv_usec = (a)->tv_usec + (b)->tv_usec; \ if ((result)->tv_usec >= 1000000) \ { \ ++(result)->tv_sec; \ (result)->tv_usec -= 1000000; \ } \ } while (0) # define timersub(a, b, result) \ do { \ (result)->tv_sec = (a)->tv_sec - (b)->tv_sec; \ (result)->tv_usec = (a)->tv_usec - (b)->tv_usec; \ if ((result)->tv_usec < 0) { \ --(result)->tv_sec; \ (result)->tv_usec += 1000000; \ } \ } while (0) iaxmodem-1.2.0/compat/headers.h0000644000175000017500000000124011150047201015706 0ustar julienjulien/* Solaris headers are a rat's nest to figure out... These should be getting included already, but due to some missing define such as _XOPEN_SOURCE or something else they get missed. Attempts at defining _XOPEN_SOURCE result in spandsp compile failure. */ /* should be in strings.h */ extern int strcasecmp(const char *, const char *); extern int strncasecmp(const char *, const char *, size_t); /* should be in string.h */ extern char *strdup(const char *); /* should be in stdlib.h */ extern int posix_openpt(int); extern int grantpt(int); extern int unlockpt(int); extern char *ptsname(int); /* should be in signal.h */ extern int kill(pid_t, int); iaxmodem-1.2.0/compat/strings.c0000644000175000017500000000064111150047201015763 0ustar julienjulien//* http://www.asterisk.org/doxygen/1.2/utils_8c-source.html */ size_t strnlen(const char *s, size_t n) { size_t len; for (len=0; len < n; len++) if (s[len] == '\0') break; return len; } char *strndup(const char *s, size_t n) { size_t len = strnlen(s, n); char *new = malloc(len + 1); if (!new) return NULL; new[len] = '\0'; return memcpy(new, s, len); } iaxmodem-1.2.0/compat/daemon.c0000644000175000017500000000305311150047201015535 0ustar julienjulien/* * Copyright (c) 2007 Albert Lee . * * Permission is hereby granted, free of charge, to any person * obtaining a copy of this software and associated documentation * files (the "Software"), to deal in the Software without * restriction, including without limitation the rights to use, * copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following * conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR * OTHER DEALINGS IN THE SOFTWARE. */ int daemon(int nochdir, int noclose); int daemon(int nochdir, int noclose) { int fd, i; switch (fork()) { case 0: break; case -1: return -1; default: _exit(0); } if (!nochdir) { chdir("/"); } if (setsid() < 0) { return -1; } if (!noclose) { if ((fd = open("/dev/null", O_RDWR) >= 0)) { for (i = 0; i < 3; i++) { dup2(fd, i); } if (fd > 2) { close(fd); } } } return 0; } iaxmodem-1.2.0/lib/0000755000175000017500000000000011150047640013417 5ustar julienjulieniaxmodem-1.2.0/lib/spandsp/0000755000175000017500000000000011150072173015066 5ustar julienjulieniaxmodem-1.2.0/lib/spandsp/Makefile.am0000644000175000017500000000630011150047202017114 0ustar julienjulien## ## SpanDSP - a series of DSP components for telephony ## ## Makefile.am - Process this file with automake to produce Makefile.in ## ## This program is free software; you can redistribute it and/or modify ## it under the terms of the GNU Lesser General Public License version 2.1, ## as published by the Free Software Foundation. ## ## This program is distributed in the hope that it will be useful, ## but WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ## GNU Lesser General Public License for more details. ## ## You should have received a copy of the GNU Lesser General Public ## License along with this program; if not, write to the Free Software ## Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ## ## $Id: Makefile.am,v 1.40 2008/07/15 14:28:20 steveu Exp $ AM_CFLAGS = $(COMP_VENDOR_CFLAGS) AM_LDFLAGS = $(COMP_VENDOR_LDFLAGS) noinst_SCRIPTS = spandsp.spec MAINTAINERCLEANFILES = Makefile.in EXTRA_DIST = autogen.sh \ DueDiligence \ README.testdata \ spandsp.spec \ wrapper.xsl \ libspandsp.vcproj \ unpack_g722_data.sh \ unpack_g726_data.sh \ unpack_gsm0610_data.sh \ unpack_v56ter_data.sh \ doc/doxygen.in \ src/floating_fudge.h \ src/spandsp/version.h.in \ src/libspandsp.dsp \ src/libspandsp.sln \ src/msvc/gettimeofday.c \ src/msvc/inttypes.h \ src/msvc/tgmath.h \ src/msvc/unistd.h \ src/msvc/sys/time.h \ src/msvc/spandsp.def \ src/msvc/msvcproj.head \ src/msvc/msvcproj.foot \ src/msvc/vc8proj.head \ src/msvc/vc8proj.foot \ spandsp/global-tones.xml \ spandsp/tones.dtd \ spandsp/tsb85.xml \ debian/changelog \ debian/compat \ debian/control \ debian/copyright \ debian/libspandsp5.install \ debian/libspandsp-dev.install \ debian/libspandsp-doc.install \ debian/rules \ debian/watch if COND_DOC MAYBE_DOC=doc endif if COND_TESTS MAYBE_TESTS=spandsp-sim tests endif if COND_TESTDATA MAYBE_TESTDATA=test-data endif SUBDIRS = src $(MAYBE_DOC) $(MAYBE_TESTS) $(MAYBE_TESTDATA) DIST_SUBDIRS = src doc spandsp-sim tests test-data faq: faq.xml cd faq ; xsltproc ../wrapper.xsl ../faq.xml rpm: rpm-build rpm-build: $(MAKE) -$(MAKEFLAGS) bump.rpm.release $(MAKE) -$(MAKEFLAGS) dist rm -rf rpm/BUILD/* rm -f rpm/RPMS/*/* rm -f rpm/SOURCES/* rm -f rpm/SPECS/* rm -f rpm/SRPMS/* rpm -ta --sign @PACKAGE@-@VERSION@.tar.gz bump.rpm.release: spandsp.spec VERSION="x"; \ test -f $(srcdir)/rpm.release && . $(srcdir)/rpm.release; \ NEXT_RELEASE=0; \ test "$$VERSION" = "@VERSION@" && NEXT_RELEASE="$$RELEASE"; \ RELEASE=`expr $$NEXT_RELEASE + 1`; \ echo "VERSION=@VERSION@" >$(srcdir)/rpm.release; \ echo "RELEASE=$$RELEASE" >>$(srcdir)/rpm.release; \ sed 's/^Release: .*/Release: '$$RELEASE'/' \ spandsp.spec.new; \ mv spandsp.spec.new spandsp.spec iaxmodem-1.2.0/lib/spandsp/DueDiligence0000644000175000017500000000561011150047202017327 0ustar julienjulienIntellectual Property Due Diligence ----------------------------------- Modems and voice coding are heavily patented areas. Implementing these without serious consideration of IP issues would be foolish. This document describes the basis on which the software has been implemented. A check of the intellectual property information at the ITU web site shows a number of patent claims against the current standards implemented by spandsp. It is important to realise, however, that some of these patents have long since expired (group III fax dates back to the 1970s). Also, many are related to recent additions to the FAX standard, such as colour FAX handling, which few people ever use. The V.14 rate adaption standard seems free of patent encumberance. One patent is listed as relevant to the V.17 standard. It is a patent from IBM, but the ITU database does not specify its nature. I believe it is related to the trellis coding used, and I think it has expired. I do not know for sure. The techniques used in the implementation should be free of patent encumberance. Most of the implementation is similar to the V.29 modem. The key addition the trellis code processing. The trellis encoding is trivial. The decoding uses Viterbi techniques, which are quite old. The V.21 standard dates from the 1950s. The V.23 standard is also very old. There is no possibility that any patents related to it are still in force. However, the implementation also needs to be free of patented techniques. The implementation only uses very mature numerical oscillator and quadrature correlation techniques, so there should be no patent issues. Only one patent is listed as relevant to the V.29 standard. This dates from the 1970s, and must have expired. The modem has been implemented using only very mature techniques, none of which can be less than 20 years old. There seem no possibility, therefore, that any patents are still in force related to the techniques used. Some aspect of the V.8 standard seems to have patents associated with it, according to the ITU patent database. I am unclear what these are. V.8 is a very simple standard. There seems to be nothing innovative about it. Many patents are listed as relevant to the T.30 standard. However, they all appear to relate to newer features, such as colour FAX, added in recent years. The current implementation only covers the original features from the late 1970s, where there appear to be patent issues. The T.4 standard defines the image compression and decompression techniques used for group 3 FAXes. The spandsp implementation is based on code derived from freely available implementations of T.4. These have existed for a number of years without IP issues. The standard is old enough for any patents to have expired, anyway. V.42bis compression uses the LZW algorithm. This is the same algorithm used in GIF files. Unisys patented this algorithm. However, the Unisys patent has now expired. iaxmodem-1.2.0/lib/spandsp/debian/0000755000175000017500000000000011150047202016303 5ustar julienjulieniaxmodem-1.2.0/lib/spandsp/debian/libspandsp-dev.install0000644000175000017500000000017111150047202022605 0ustar julienjuliendebian/tmp/usr/include debian/tmp/usr/lib/libspandsp.so debian/tmp/usr/lib/libspandsp.la debian/tmp/usr/lib/libspandsp.a iaxmodem-1.2.0/lib/spandsp/debian/control0000644000175000017500000000344211150047202017711 0ustar julienjulienSource: spandsp Section: libs Priority: optional Maintainer: Debian VoIP Team Uploaders: Jose Carlos Garcia Sogo , Kilian Krause , Santiago Garcia Mantinan , Mark Purcell , Tzafrir Cohen , Santiago Ruano Rincón Build-Depends: debhelper (>= 4.0.0), libtiff4-dev, libjpeg62-dev, dpatch, doxygen, autotools-dev, xsltproc Standards-Version: 3.7.2 XS-Vcs-Svn: svn://svn.debian.org/pkg-voip/ XS-Vcs-Browser: http://svn.debian.org/wsvn/pkg-voip/ Package: libspandsp5 Architecture: any Depends: ${shlibs:Depends} Conflicts: libspandsp0, libspandsp1, libspandsp2 Description: Telephony signal processing library This is a low-level signal processing library that modulate and demodulate signals commonly used in telephony, such as the "noise" generated by a fax modem or DTMF touchpad. . This package contains the shared library. Package: libspandsp-dev Section: libdevel Architecture: any Depends: libspandsp5 (= ${Source-Version}), libtiff4-dev, libjpeg62-dev Description: Telephony signal processing library This is a low-level signal processing library that modulate and demodulate signals commonly used in telephony, such as the "noise" generated by a fax modem or DTMF touchpad. . This package contains the static library and development headers. . Homepage: http://www.soft-switch.org/ Package: libspandsp-doc Section: doc Architecture: all Description: Documentation for the spandsp signal processing library This package contains the online API in HTML for the libspandsp, a low level signal processing library that modulate and demodulate siignals commonly used in telephony, such as the "noise" generated by a fax modem or DTMF touchpad. iaxmodem-1.2.0/lib/spandsp/debian/compat0000644000175000017500000000000211150047202017501 0ustar julienjulien4 iaxmodem-1.2.0/lib/spandsp/debian/rules0000755000175000017500000000452311150047202017367 0ustar julienjulien#!/usr/bin/make -f # Uncomment this to turn on verbose mode. #export DH_VERBOSE=1 DEB_HOST_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_HOST_GNU_TYPE) DEB_BUILD_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_BUILD_GNU_TYPE) DEBVERSION:=$(shell head -n 1 debian/changelog \ | sed -e 's/^[^(]*(\([^)]*\)).*/\1/') ORIGTARVER:=$(shell echo $(DEBVERSION) | sed -e 's/^.*://' -e 's/-[0-9.]*$$//')# -e 's/.dfsg$$//' -e 's/~//') UPVERSION:=$(shell echo $(ORIGTARVER) | tr -d '~') FILENAME := spandsp_$(ORIGTARVER).orig.tar.gz FULLNAME := spandsp-$(UPVERSION) URL := http://soft-switch.org/downloads/spandsp/spandsp-$(UPVERSION).tgz CFLAGS = -Wall -g ifneq (,$(findstring noopt,$(DEB_BUILD_OPTIONS))) CFLAGS += -O0 else CFLAGS += -O2 endif include /usr/share/dpatch/dpatch.make autotools: patch-stamp ln -s /usr/share/misc/config.sub config.sub ln -s /usr/share/misc/config.guess config.guess touch autotools config.status: autotools configure dh_testdir CFLAGS="$(CFLAGS)" ./configure \ --host=$(DEB_HOST_GNU_TYPE) \ --build=$(DEB_BUILD_GNU_TYPE) \ --prefix=/usr \ --mandir=\$${prefix}/share/man \ --infodir=\$${prefix}/share/info \ --enable-doc build: build-stamp build-stamp: config.status dh_testdir $(MAKE) touch build-stamp clean: clean-patched unpatch clean-patched: dh_testdir dh_testroot rm -f build-stamp autotools -$(MAKE) distclean -$(RM) -f config.sub -$(RM) -f config.guess dh_clean install: build-stamp dh_testdir dh_testroot dh_clean -k $(MAKE) install DESTDIR=$(CURDIR)/debian/tmp binary-indep: build-stamp install dh_testdir -i dh_testroot -i dh_installchangelogs -i ChangeLog dh_installdocs -i DueDiligence dh_install -i dh_compress -i dh_fixperms -i dh_installdeb -i dh_gencontrol -i dh_md5sums -i dh_builddeb -i binary-arch: build-stamp install dh_testdir -a dh_testroot -a dh_installchangelogs -a ChangeLog dh_installdocs -a DueDiligence dh_install -a dh_strip -a dh_compress -a dh_fixperms -a dh_makeshlibs -a dh_installdeb -a dh_shlibdeps -a dh_gencontrol -a dh_md5sums -a dh_builddeb -a get-orig-source: -@@dh_testdir @@[ -d ../tarballs/. ]||mkdir -p ../tarballs @@echo Downloading $(FILENAME) from $(URL) ... @@wget -N -nv -T10 -t3 -O ../tarballs/$(FILENAME) $(URL) binary: binary-indep binary-arch .PHONY: build clean binary-indep binary-arch binary install patch unpatch iaxmodem-1.2.0/lib/spandsp/debian/changelog0000644000175000017500000000643611150047202020166 0ustar julienjulienspandsp (0.0.5~pre2-1) unstable; urgency=low [ Massimo Cetra ] * New upstream release. * Fixed upstream file name for get-orig-source. * Updates to 64bit archs support * Removal of obsoleted files -- Massimo Cetra Mon, 5 May 2008 09:23:36 +0100 spandsp (0.0.4~pre3-1) unstable; urgency=low [ Santiago Ruano Rincón ] * Added Conflicts: libspandsp2 * Fixed URL in debian/rules [ Tzafrir Cohen ] * New upstream release. * Fixed upstream file name for get-orig-source. * standards version updated to 3.7.2 . -- Tzafrir Cohen Mon, 18 Jun 2007 09:53:06 +0300 spandsp (0.0.4~pre1-1) experimental; urgency=low * New upstream release. -- Santiago Ruano Rincón Fri, 11 May 2007 15:24:41 -0500 spandsp (0.0.3pre27-2) experimental; urgency=low * Conflict with libspandsp1 due to /usr/share/spandsp/global-tones.xml -- Kilian Krause Thu, 4 Jan 2007 00:29:10 +0100 spandsp (0.0.3pre27-1) experimental; urgency=low * New upstream release. * Bump library name due to API incompatibility with 0.0.2 versions. -- Kilian Krause Wed, 3 Jan 2007 21:31:17 +0100 spandsp (0.0.3pre26-1) experimental; urgency=low * New upstream release - New version of spandsp available (Closes: #339293) - Remove src/spandsp/mmx.h is not GPL and has no license attached (Closes: #357813) * Lintian: outdated-autotools-helper-file - Build-Depends: autotools-dev * Add debian/watch -- Mark Purcell Sat, 9 Dec 2006 14:00:57 +0000 spandsp (0.0.2pre26-1) unstable; urgency=low * New upstream release. * Added get-orig-source target. * Removed unneeded and buggy nommx.dpatch (Closes: #376249, #377374) -- Tzafrir Cohen Tue, 1 Aug 2006 06:27:47 +0100 spandsp (0.0.2pre25-1) unstable; urgency=low * New upstream version. * debian/copyright: Source's URL in copyright file updated to the new author' site. * Added -doc package, with the API documentation. * Fixed package name to follow new upstream's version. -- Kilian Krause Sat, 18 Feb 2006 22:10:21 +0100 spandsp (0.0.2pre17-1) unstable; urgency=low * New upstream version. -- Kilian Krause Mon, 9 May 2005 21:56:53 +0200 spandsp (0.0.2pre10-3) unstable; urgency=low * debian/control: fixed overrides. again. (Back to the old optional) -- Kilian Krause Mon, 21 Mar 2005 10:39:30 +0100 spandsp (0.0.2pre10-2) unstable; urgency=low * debian/control: fixed overrides. * debian/patches/mmx.dpatch: Added compilation on non-i386 and non-amd64. -- Kilian Krause Sun, 20 Mar 2005 23:32:48 +0100 spandsp (0.0.2pre10-1) unstable; urgency=low * New upstream release. * Debian VoIP Team takes this package from Simon. Thanks! * debian/rules: fixed how config.[sub,guess] files are linked from autotools-dev and cleaned. -- Kilian Krause Sat, 22 Jan 2005 13:44:28 +0100 spandsp (0.0.2-2) unstable; urgency=low * Corrected build dependencies. -- Simon Richter Mon, 3 Jan 2005 13:33:33 +0100 spandsp (0.0.2-1) unstable; urgency=low * Initial Release (Closes: #262032). -- Simon Richter Sun, 2 Jan 2005 15:22:58 +0100 iaxmodem-1.2.0/lib/spandsp/debian/watch0000644000175000017500000000030011150047202017325 0ustar julienjulien# See uscan(1) for format # Compulsory line, this is a version 3 file version=3 # http://soft-switch.org/downloads/spandsp/ spandsp-(.*)\.tgz debian svn-upgrade iaxmodem-1.2.0/lib/spandsp/debian/libspandsp-doc.install0000644000175000017500000000005711150047202022577 0ustar julienjuliendoc/api/html usr/share/doc/libspandsp-doc/api/ iaxmodem-1.2.0/lib/spandsp/debian/libspandsp5.install0000644000175000017500000000011211150047202022111 0ustar julienjuliendebian/tmp/usr/lib*/libspandsp.so.1.* debian/tmp/usr/lib*/libspandsp.so.1 iaxmodem-1.2.0/lib/spandsp/debian/copyright0000644000175000017500000000176311150047202020245 0ustar julienjulienThis package was debianized by Simon Richter on Sun, 2 Jan 2005 15:22:58 +0100. It was downloaded from http://soft-switch.org/downloads/spandsp/ Copyright: Steve Underwood License: This package 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; version 2 dated June, 1991. This package 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 package; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. On Debian systems, the complete text of the GNU General Public License can be found in `/usr/share/common-licenses/GPL'. iaxmodem-1.2.0/lib/spandsp/config/0000755000175000017500000000000011150047202016326 5ustar julienjulieniaxmodem-1.2.0/lib/spandsp/config/ax_c99_features.m40000644000175000017500000001217011150047202021563 0ustar julienjulien# @synopsis AX_C99_FLEXIBLE_ARRAY # # Does the compiler support the 1999 ISO C Standard "struct hack". # @version 1.1 Mar 15 2004 # @author Erik de Castro Lopo # # Permission to use, copy, modify, distribute, and sell this file for any # purpose is hereby granted without fee, provided that the above copyright # and this permission notice appear in all copies. No representations are # made about the suitability of this software for any purpose. It is # provided "as is" without express or implied warranty. AC_DEFUN([AX_C99_FLEXIBLE_ARRAY], [AC_CACHE_CHECK(C99 struct flexible array support, ac_cv_c99_flexible_array, # Initialize to unknown ac_cv_c99_flexible_array=no AC_TRY_LINK([[ #include typedef struct { int k; char buffer [] ; } MY_STRUCT ; ]], [ MY_STRUCT *p = calloc (1, sizeof (MY_STRUCT) + 42); ], ac_cv_c99_flexible_array=yes, ac_cv_c99_flexible_array=no ))] ) # AX_C99_FLEXIBLE_ARRAY # @synopsis AX_C99_FUNC_LRINT # # Check whether C99's lrint function is available. # @version 1.3 Feb 12 2002 # @author Erik de Castro Lopo # # Permission to use, copy, modify, distribute, and sell this file for any # purpose is hereby granted without fee, provided that the above copyright # and this permission notice appear in all copies. No representations are # made about the suitability of this software for any purpose. It is # provided "as is" without express or implied warranty. # AC_DEFUN([AX_C99_FUNC_LRINT], [AC_CACHE_CHECK(for lrint, ac_cv_c99_lrint, [ lrint_save_CFLAGS=$CFLAGS CFLAGS="-lm" AC_TRY_LINK([ #define _ISOC9X_SOURCE 1 #define _ISOC99_SOURCE 1 #define __USE_ISOC99 1 #define __USE_ISOC9X 1 #include ], if (!lrint(3.14159)) lrint(2.7183);, ac_cv_c99_lrint=yes, ac_cv_c99_lrint=no) CFLAGS=$lrint_save_CFLAGS ]) if test "$ac_cv_c99_lrint" = yes; then AC_DEFINE(HAVE_LRINT, 1, [Define if you have C99's lrint function.]) fi ])# AX_C99_FUNC_LRINT # @synopsis AX_C99_FUNC_LRINTF # # Check whether C99's lrintf function is available. # @version 1.3 Feb 12 2002 # @author Erik de Castro Lopo # # Permission to use, copy, modify, distribute, and sell this file for any # purpose is hereby granted without fee, provided that the above copyright # and this permission notice appear in all copies. No representations are # made about the suitability of this software for any purpose. It is # provided "as is" without express or implied warranty. # AC_DEFUN([AX_C99_FUNC_LRINTF], [AC_CACHE_CHECK(for lrintf, ac_cv_c99_lrintf, [ lrintf_save_CFLAGS=$CFLAGS CFLAGS="-lm" AC_TRY_LINK([ #define _ISOC9X_SOURCE 1 #define _ISOC99_SOURCE 1 #define __USE_ISOC99 1 #define __USE_ISOC9X 1 #include ], if (!lrintf(3.14159)) lrintf(2.7183);, ac_cv_c99_lrintf=yes, ac_cv_c99_lrintf=no) CFLAGS=$lrintf_save_CFLAGS ]) if test "$ac_cv_c99_lrintf" = yes; then AC_DEFINE(HAVE_LRINTF, 1, [Define if you have C99's lrintf function.]) fi ])# AX_C99_FUNC_LRINTF # @synopsis AX_C99_FUNC_LLRINT # # Check whether C99's llrint function is available. # @version 1.1 Sep 30 2002 # @author Erik de Castro Lopo # # Permission to use, copy, modify, distribute, and sell this file for any # purpose is hereby granted without fee, provided that the above copyright # and this permission notice appear in all copies. No representations are # made about the suitability of this software for any purpose. It is # provided "as is" without express or implied warranty. # AC_DEFUN([AX_C99_FUNC_LLRINT], [AC_CACHE_CHECK(for llrint, ac_cv_c99_llrint, [ llrint_save_CFLAGS=$CFLAGS CFLAGS="-lm" AC_TRY_LINK([ #define ISOC9X_SOURCE 1 #define _ISOC99_SOURCE 1 #define __USE_ISOC99 1 #define __USE_ISOC9X 1 #include ], long long int x ; x = llrint(3.14159) ;, ac_cv_c99_llrint=yes, ac_cv_c99_llrint=no) CFLAGS=$llrint_save_CFLAGS ]) if test "$ac_cv_c99_llrint" = yes; then AC_DEFINE(HAVE_LLRINT, 1, [Define if you have C99's llrint function.]) fi ])# AX_C99_FUNC_LLRINT # @synopsis AX_C99_FUNC_LLRINTF # # Check whether C99's llrintf function is available. # @version 1.1 Sep 30 2002 # @author Erik de Castro Lopo # # Permission to use, copy, modify, distribute, and sell this file for any # purpose is hereby granted without fee, provided that the above copyright # and this permission notice appear in all copies. No representations are # made about the suitability of this software for any purpose. It is # provided "as is" without express or implied warranty. # AC_DEFUN([AX_C99_FUNC_LLRINTF], [AC_CACHE_CHECK(for llrintf, ac_cv_c99_llrintf, [ llrintf_save_CFLAGS=$CFLAGS CFLAGS="-lm" AC_TRY_LINK([ #define _ISOC9X_SOURCE 1 #define _ISOC99_SOURCE 1 #define __USE_ISOC99 1 #define __USE_ISOC9X 1 #include ], long long int x ; x = llrintf(3.14159) ;, ac_cv_c99_llrintf=yes, ac_cv_c99_llrintf=no) CFLAGS=$llrintf_save_CFLAGS ]) if test "$ac_cv_c99_llrintf" = yes; then AC_DEFINE(HAVE_LLRINTF, 1, [Define if you have C99's llrintf function.]) fi ])# AX_C99_FUNC_LLRINTF iaxmodem-1.2.0/lib/spandsp/config/install-sh0000755000175000017500000002202111150047202020327 0ustar julienjulien#!/bin/sh # install - install a program, script, or datafile scriptversion=2005-05-14.22 # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the # following copyright and license. # # Copyright (C) 1994 X Consortium # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to # deal in the Software without restriction, including without limitation the # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or # sell copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN # AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- # TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # Except as contained in this notice, the name of the X Consortium shall not # be used in advertising or otherwise to promote the sale, use or other deal- # ings in this Software without prior written authorization from the X Consor- # tium. # # # FSF changes to this file are in the public domain. # # Calling this script install-sh is preferred over install.sh, to prevent # `make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. It can only install one file at a time, a restriction # shared with many OS's install programs. # set DOITPROG to echo to test this script # Don't use :- since 4.3BSD and earlier shells don't like it. doit="${DOITPROG-}" # put in absolute paths if you don't have them in your path; or use env. vars. mvprog="${MVPROG-mv}" cpprog="${CPPROG-cp}" chmodprog="${CHMODPROG-chmod}" chownprog="${CHOWNPROG-chown}" chgrpprog="${CHGRPPROG-chgrp}" stripprog="${STRIPPROG-strip}" rmprog="${RMPROG-rm}" mkdirprog="${MKDIRPROG-mkdir}" chmodcmd="$chmodprog 0755" chowncmd= chgrpcmd= stripcmd= rmcmd="$rmprog -f" mvcmd="$mvprog" src= dst= dir_arg= dstarg= no_target_directory= usage="Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE or: $0 [OPTION]... SRCFILES... DIRECTORY or: $0 [OPTION]... -t DIRECTORY SRCFILES... or: $0 [OPTION]... -d DIRECTORIES... In the 1st form, copy SRCFILE to DSTFILE. In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. In the 4th, create DIRECTORIES. Options: -c (ignored) -d create directories instead of installing files. -g GROUP $chgrpprog installed files to GROUP. -m MODE $chmodprog installed files to MODE. -o USER $chownprog installed files to USER. -s $stripprog installed files. -t DIRECTORY install into DIRECTORY. -T report an error if DSTFILE is a directory. --help display this help and exit. --version display version info and exit. Environment variables override the default commands: CHGRPPROG CHMODPROG CHOWNPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG " while test -n "$1"; do case $1 in -c) shift continue;; -d) dir_arg=true shift continue;; -g) chgrpcmd="$chgrpprog $2" shift shift continue;; --help) echo "$usage"; exit $?;; -m) chmodcmd="$chmodprog $2" shift shift continue;; -o) chowncmd="$chownprog $2" shift shift continue;; -s) stripcmd=$stripprog shift continue;; -t) dstarg=$2 shift shift continue;; -T) no_target_directory=true shift continue;; --version) echo "$0 $scriptversion"; exit $?;; *) # When -d is used, all remaining arguments are directories to create. # When -t is used, the destination is already specified. test -n "$dir_arg$dstarg" && break # Otherwise, the last argument is the destination. Remove it from $@. for arg do if test -n "$dstarg"; then # $@ is not empty: it contains at least $arg. set fnord "$@" "$dstarg" shift # fnord fi shift # arg dstarg=$arg done break;; esac done if test -z "$1"; then if test -z "$dir_arg"; then echo "$0: no input file specified." >&2 exit 1 fi # It's OK to call `install-sh -d' without argument. # This can happen when creating conditional directories. exit 0 fi for src do # Protect names starting with `-'. case $src in -*) src=./$src ;; esac if test -n "$dir_arg"; then dst=$src src= if test -d "$dst"; then mkdircmd=: chmodcmd= else mkdircmd=$mkdirprog fi else # Waiting for this to be detected by the "$cpprog $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if test ! -f "$src" && test ! -d "$src"; then echo "$0: $src does not exist." >&2 exit 1 fi if test -z "$dstarg"; then echo "$0: no destination specified." >&2 exit 1 fi dst=$dstarg # Protect names starting with `-'. case $dst in -*) dst=./$dst ;; esac # If destination is a directory, append the input filename; won't work # if double slashes aren't ignored. if test -d "$dst"; then if test -n "$no_target_directory"; then echo "$0: $dstarg: Is a directory" >&2 exit 1 fi dst=$dst/`basename "$src"` fi fi # This sed command emulates the dirname command. dstdir=`echo "$dst" | sed -e 's,/*$,,;s,[^/]*$,,;s,/*$,,;s,^$,.,'` # Make sure that the destination directory exists. # Skip lots of stat calls in the usual case. if test ! -d "$dstdir"; then defaultIFS=' ' IFS="${IFS-$defaultIFS}" oIFS=$IFS # Some sh's can't handle IFS=/ for some reason. IFS='%' set x `echo "$dstdir" | sed -e 's@/@%@g' -e 's@^%@/@'` shift IFS=$oIFS pathcomp= while test $# -ne 0 ; do pathcomp=$pathcomp$1 shift if test ! -d "$pathcomp"; then $mkdirprog "$pathcomp" # mkdir can fail with a `File exist' error in case several # install-sh are creating the directory concurrently. This # is OK. test -d "$pathcomp" || exit fi pathcomp=$pathcomp/ done fi if test -n "$dir_arg"; then $doit $mkdircmd "$dst" \ && { test -z "$chowncmd" || $doit $chowncmd "$dst"; } \ && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } \ && { test -z "$stripcmd" || $doit $stripcmd "$dst"; } \ && { test -z "$chmodcmd" || $doit $chmodcmd "$dst"; } else dstfile=`basename "$dst"` # Make a couple of temp file names in the proper directory. dsttmp=$dstdir/_inst.$$_ rmtmp=$dstdir/_rm.$$_ # Trap to clean up those temp files at exit. trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 trap '(exit $?); exit' 1 2 13 15 # Copy the file name to the temp name. $doit $cpprog "$src" "$dsttmp" && # and set any options; do chmod last to preserve setuid bits. # # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $cpprog $src $dsttmp" command. # { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } \ && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } \ && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } \ && { test -z "$chmodcmd" || $doit $chmodcmd "$dsttmp"; } && # Now rename the file to the real destination. { $doit $mvcmd -f "$dsttmp" "$dstdir/$dstfile" 2>/dev/null \ || { # The rename failed, perhaps because mv can't rename something else # to itself, or perhaps because mv is so ancient that it does not # support -f. # Now remove or move aside any old file at destination location. # We try this two ways since rm can't unlink itself on some # systems and the destination file might be busy for other # reasons. In this case, the final cleanup might fail but the new # file should still install successfully. { if test -f "$dstdir/$dstfile"; then $doit $rmcmd -f "$dstdir/$dstfile" 2>/dev/null \ || $doit $mvcmd -f "$dstdir/$dstfile" "$rmtmp" 2>/dev/null \ || { echo "$0: cannot unlink or rename $dstdir/$dstfile" >&2 (exit 1); exit 1 } else : fi } && # Now rename the file to the real destination. $doit $mvcmd "$dsttmp" "$dstdir/$dstfile" } } fi || { (exit 1); exit 1; } done # The final little trick to "correctly" pass the exit status to the exit trap. { (exit 0); exit 0 } # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-end: "$" # End: iaxmodem-1.2.0/lib/spandsp/config/missing0000755000175000017500000002540611150047202017734 0ustar julienjulien#! /bin/sh # Common stub for a few missing GNU programs while installing. scriptversion=2005-06-08.21 # Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005 # Free Software Foundation, Inc. # Originally by Fran,cois Pinard , 1996. # 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, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA # 02110-1301, USA. # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. if test $# -eq 0; then echo 1>&2 "Try \`$0 --help' for more information" exit 1 fi run=: # In the cases where this matters, `missing' is being run in the # srcdir already. if test -f configure.ac; then configure_ac=configure.ac else configure_ac=configure.in fi msg="missing on your system" case "$1" in --run) # Try to run requested program, and just exit if it succeeds. run= shift "$@" && exit 0 # Exit code 63 means version mismatch. This often happens # when the user try to use an ancient version of a tool on # a file that requires a minimum version. In this case we # we should proceed has if the program had been absent, or # if --run hadn't been passed. if test $? = 63; then run=: msg="probably too old" fi ;; -h|--h|--he|--hel|--help) echo "\ $0 [OPTION]... PROGRAM [ARGUMENT]... Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an error status if there is no known handling for PROGRAM. Options: -h, --help display this help and exit -v, --version output version information and exit --run try to run the given command, and emulate it if it fails Supported PROGRAM values: aclocal touch file \`aclocal.m4' autoconf touch file \`configure' autoheader touch file \`config.h.in' automake touch all \`Makefile.in' files bison create \`y.tab.[ch]', if possible, from existing .[ch] flex create \`lex.yy.c', if possible, from existing .c help2man touch the output file lex create \`lex.yy.c', if possible, from existing .c makeinfo touch the output file tar try tar, gnutar, gtar, then tar without non-portable flags yacc create \`y.tab.[ch]', if possible, from existing .[ch] Send bug reports to ." exit $? ;; -v|--v|--ve|--ver|--vers|--versi|--versio|--version) echo "missing $scriptversion (GNU Automake)" exit $? ;; -*) echo 1>&2 "$0: Unknown \`$1' option" echo 1>&2 "Try \`$0 --help' for more information" exit 1 ;; esac # Now exit if we have it, but it failed. Also exit now if we # don't have it and --version was passed (most likely to detect # the program). case "$1" in lex|yacc) # Not GNU programs, they don't have --version. ;; tar) if test -n "$run"; then echo 1>&2 "ERROR: \`tar' requires --run" exit 1 elif test "x$2" = "x--version" || test "x$2" = "x--help"; then exit 1 fi ;; *) if test -z "$run" && ($1 --version) > /dev/null 2>&1; then # We have it, but it failed. exit 1 elif test "x$2" = "x--version" || test "x$2" = "x--help"; then # Could not run --version or --help. This is probably someone # running `$TOOL --version' or `$TOOL --help' to check whether # $TOOL exists and not knowing $TOOL uses missing. exit 1 fi ;; esac # If it does not exist, or fails to run (possibly an outdated version), # try to emulate it. case "$1" in aclocal*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`acinclude.m4' or \`${configure_ac}'. You might want to install the \`Automake' and \`Perl' packages. Grab them from any GNU archive site." touch aclocal.m4 ;; autoconf) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`${configure_ac}'. You might want to install the \`Autoconf' and \`GNU m4' packages. Grab them from any GNU archive site." touch configure ;; autoheader) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`acconfig.h' or \`${configure_ac}'. You might want to install the \`Autoconf' and \`GNU m4' packages. Grab them from any GNU archive site." files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}` test -z "$files" && files="config.h" touch_files= for f in $files; do case "$f" in *:*) touch_files="$touch_files "`echo "$f" | sed -e 's/^[^:]*://' -e 's/:.*//'`;; *) touch_files="$touch_files $f.in";; esac done touch $touch_files ;; automake*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'. You might want to install the \`Automake' and \`Perl' packages. Grab them from any GNU archive site." find . -type f -name Makefile.am -print | sed 's/\.am$/.in/' | while read f; do touch "$f"; done ;; autom4te) echo 1>&2 "\ WARNING: \`$1' is needed, but is $msg. You might have modified some files without having the proper tools for further handling them. You can get \`$1' as part of \`Autoconf' from any GNU archive site." file=`echo "$*" | sed -n 's/.*--output[ =]*\([^ ]*\).*/\1/p'` test -z "$file" && file=`echo "$*" | sed -n 's/.*-o[ ]*\([^ ]*\).*/\1/p'` if test -f "$file"; then touch $file else test -z "$file" || exec >$file echo "#! /bin/sh" echo "# Created by GNU Automake missing as a replacement of" echo "# $ $@" echo "exit 0" chmod +x $file exit 1 fi ;; bison|yacc) echo 1>&2 "\ WARNING: \`$1' $msg. You should only need it if you modified a \`.y' file. You may need the \`Bison' package in order for those modifications to take effect. You can get \`Bison' from any GNU archive site." rm -f y.tab.c y.tab.h if [ $# -ne 1 ]; then eval LASTARG="\${$#}" case "$LASTARG" in *.y) SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'` if [ -f "$SRCFILE" ]; then cp "$SRCFILE" y.tab.c fi SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'` if [ -f "$SRCFILE" ]; then cp "$SRCFILE" y.tab.h fi ;; esac fi if [ ! -f y.tab.h ]; then echo >y.tab.h fi if [ ! -f y.tab.c ]; then echo 'main() { return 0; }' >y.tab.c fi ;; lex|flex) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a \`.l' file. You may need the \`Flex' package in order for those modifications to take effect. You can get \`Flex' from any GNU archive site." rm -f lex.yy.c if [ $# -ne 1 ]; then eval LASTARG="\${$#}" case "$LASTARG" in *.l) SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'` if [ -f "$SRCFILE" ]; then cp "$SRCFILE" lex.yy.c fi ;; esac fi if [ ! -f lex.yy.c ]; then echo 'main() { return 0; }' >lex.yy.c fi ;; help2man) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a dependency of a manual page. You may need the \`Help2man' package in order for those modifications to take effect. You can get \`Help2man' from any GNU archive site." file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'` if test -z "$file"; then file=`echo "$*" | sed -n 's/.*--output=\([^ ]*\).*/\1/p'` fi if [ -f "$file" ]; then touch $file else test -z "$file" || exec >$file echo ".ab help2man is required to generate this page" exit 1 fi ;; makeinfo) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a \`.texi' or \`.texinfo' file, or any other file indirectly affecting the aspect of the manual. The spurious call might also be the consequence of using a buggy \`make' (AIX, DU, IRIX). You might want to install the \`Texinfo' package or the \`GNU make' package. Grab either from any GNU archive site." # The file to touch is that specified with -o ... file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'` if test -z "$file"; then # ... or it is the one specified with @setfilename ... infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` file=`sed -n '/^@setfilename/ { s/.* \([^ ]*\) *$/\1/; p; q; }' $infile` # ... or it is derived from the source name (dir/f.texi becomes f.info) test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info fi # If the file does not exist, the user really needs makeinfo; # let's fail without touching anything. test -f $file || exit 1 touch $file ;; tar) shift # We have already tried tar in the generic part. # Look for gnutar/gtar before invocation to avoid ugly error # messages. if (gnutar --version > /dev/null 2>&1); then gnutar "$@" && exit 0 fi if (gtar --version > /dev/null 2>&1); then gtar "$@" && exit 0 fi firstarg="$1" if shift; then case "$firstarg" in *o*) firstarg=`echo "$firstarg" | sed s/o//` tar "$firstarg" "$@" && exit 0 ;; esac case "$firstarg" in *h*) firstarg=`echo "$firstarg" | sed s/h//` tar "$firstarg" "$@" && exit 0 ;; esac fi echo 1>&2 "\ WARNING: I can't seem to be able to run \`tar' with the given arguments. You may want to install GNU tar or Free paxutils, or check the command line arguments." exit 1 ;; *) echo 1>&2 "\ WARNING: \`$1' is needed, and is $msg. You might have modified some files without having the proper tools for further handling them. Check the \`README' file, it often tells you about the needed prerequisites for installing this package. You may also peek at any GNU archive site, in case some other package would contain this missing \`$1' program." exit 1 ;; esac exit 0 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-end: "$" # End: iaxmodem-1.2.0/lib/spandsp/config/ax_compiler_vendor.m40000644000175000017500000000606311150047202022454 0ustar julienjulien# =========================================================================== # http://autoconf-archive.cryp.to/ax_compiler_vendor.html # =========================================================================== # # SYNOPSIS # # AX_COMPILER_VENDOR # # DESCRIPTION # # Determine the vendor of the C/C++ compiler, e.g., gnu, intel, ibm, sun, # hp, borland, comeau, dec, cray, kai, lcc, metrowerks, sgi, microsoft, # watcom, etc. The vendor is returned in the cache variable # $ax_cv_c_compiler_vendor for C and $ax_cv_cxx_compiler_vendor for C++. # # LAST MODIFICATION # # 2008-04-12 # # COPYLEFT # # Copyright (c) 2008 Steven G. Johnson # Copyright (c) 2008 Matteo Frigo # # 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 3 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, see . # # As a special exception, the respective Autoconf Macro's copyright owner # gives unlimited permission to copy, distribute and modify the configure # scripts that are the output of Autoconf when processing the Macro. You # need not follow the terms of the GNU General Public License when using # or distributing such scripts, even though portions of the text of the # Macro appear in them. The GNU General Public License (GPL) does govern # all other use of the material that constitutes the Autoconf Macro. # # This special exception to the GPL applies to versions of the Autoconf # Macro released by the Autoconf Macro Archive. When you make and # distribute a modified version of the Autoconf Macro, you may extend this # special exception to the GPL to apply to your modified version as well. AC_DEFUN([AX_COMPILER_VENDOR], [ AC_CACHE_CHECK([for _AC_LANG compiler vendor], ax_cv_[]_AC_LANG_ABBREV[]_compiler_vendor, [ax_cv_[]_AC_LANG_ABBREV[]_compiler_vendor=unknown # note: don't check for gcc first since some other compilers define __GNUC__ for ventest in intel:__ICC,__ECC,__INTEL_COMPILER ibm:__xlc__,__xlC__,__IBMC__,__IBMCPP__ pathscale:__PATHCC__,__PATHSCALE__ gnu:__GNUC__ sun:__SUNPRO_C,__SUNPRO_CC hp:__HP_cc,__HP_aCC dec:__DECC,__DECCXX,__DECC_VER,__DECCXX_VER borland:__BORLANDC__,__TURBOC__ comeau:__COMO__ cray:_CRAYC kai:__KCC lcc:__LCC__ metrowerks:__MWERKS__ sgi:__sgi,sgi microsoft:_MSC_VER watcom:__WATCOMC__ portland:__PGI; do vencpp="defined("`echo $ventest | cut -d: -f2 | sed 's/,/) || defined(/g'`")" AC_COMPILE_IFELSE([AC_LANG_PROGRAM(,[ #if !($vencpp) thisisanerror; #endif ])], [ax_cv_]_AC_LANG_ABBREV[_compiler_vendor=`echo $ventest | cut -d: -f1`; break]) done ]) ]) iaxmodem-1.2.0/lib/spandsp/config/ax_fixed_point_machine.m40000644000175000017500000000262611150047202023262 0ustar julienjulien# AX_FIXED_POINT_MACHINE(MACHINE, [ACTION-IF-FIXED-POINT], [ACTION-IF-NOT-FIXED-POINT]) # ------------------------------------------------------------------------------------- # # Check if a specified machine type is a fixed point only machine. That is, if it lacks # fast floating point support. # # This is a simple lookup amongst machines known to the current autotools. So far we deal # with the embedded ARM, Blackfin, MIPS, TI DSP and XScale processors as things which lack # fast hardware floating point. # # Other candidates would be the small embedded Power PCs. # AC_DEFUN([AX_FIXED_POINT_MACHINE], [AS_VAR_PUSHDEF([ac_FixedPoint], [ac_cv_fixed_point_machine_$1])dnl AC_CACHE_CHECK([if $1 is fixed point only], ac_FixedPoint, [case $1 in arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] \ | bfin \ | mips | mipsbe | mipseb | mipsel | mipsle \ | tic54x | c54x* | tic55x | c55x* | tic6x | c6x* \ | xscale | xscalee[bl] \ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ | bfin-* \ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ | xscale-* | xscalee[bl]-* ) AS_VAR_SET(ac_FixedPoint, yes) ;; *) AS_VAR_SET(ac_FixedPoint, no) ;; esac]) AS_IF([test AS_VAR_GET(ac_FixedPoint) = yes], [$2], [$3])[]dnl AS_VAR_POPDEF([ac_FixedPoint])dnl ])# AX_FIXED_POINT_MACHINE iaxmodem-1.2.0/lib/spandsp/config/ax_misaligned_access_fails.m40000644000175000017500000000271411150047202024077 0ustar julienjulien# AX_MISALIGNED_ACCESS_FAILS(MACHINE, [ACTION-IF-MISALIGNED-FAILS], [ACTION-IF-MISALIGNED-OK]) # ------------------------------------------------------------------------------------- # # Check if a specified machine type cannot handle misaligned data. That is, multi-byte data # types which are not properly aligned in memory fail. Many machines are happy to work with # misaligned data, but slowing down a bit. Other machines just won't tolerate such data. # # This is a simple lookup amongst machines known to the current autotools. So far we only deal # with the ARM and sparc. # A lookup is used, as many of the devices which cannot handled misaligned access are embedded # processors, for which the code normally be cross-compiled. # AC_DEFUN([AX_MISALIGNED_ACCESS_FAILS], [AS_VAR_PUSHDEF([ac_MisalignedAccessFails], [ac_cv_misaligned_access_fails_$1])dnl AC_CACHE_CHECK([if $1 fails on misaligned memory access], ac_MisalignedAccessFails, [case $1 in arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] \ | bfin \ | sparc \ | xscale | xscalee[bl] \ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ | bfin-* \ | sparc-* \ | xscale-* | xscalee[bl]-* ) AS_VAR_SET(ac_MisalignedAccessFails, yes) ;; *) AS_VAR_SET(ac_MisalignedAccessFails, no) ;; esac]) AS_IF([test AS_VAR_GET(ac_MisalignedAccessFails) = yes], [$2], [$3])[]dnl AS_VAR_POPDEF([ac_MisalignedAccessFails])dnl ])# MISALIGNED_ACCESS_FAILS iaxmodem-1.2.0/lib/spandsp/config/depcomp0000755000175000017500000003710011150047202017704 0ustar julienjulien#! /bin/sh # depcomp - compile a program generating dependencies as side-effects scriptversion=2005-07-09.11 # Copyright (C) 1999, 2000, 2003, 2004, 2005 Free Software Foundation, Inc. # 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, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA # 02110-1301, USA. # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Originally written by Alexandre Oliva . case $1 in '') echo "$0: No command. Try \`$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: depcomp [--help] [--version] PROGRAM [ARGS] Run PROGRAMS ARGS to compile a file, generating dependencies as side-effects. Environment variables: depmode Dependency tracking mode. source Source file read by `PROGRAMS ARGS'. object Object file output by `PROGRAMS ARGS'. DEPDIR directory where to store dependencies. depfile Dependency file to output. tmpdepfile Temporary file to use when outputing dependencies. libtool Whether libtool is used (yes/no). Report bugs to . EOF exit $? ;; -v | --v*) echo "depcomp $scriptversion" exit $? ;; esac if test -z "$depmode" || test -z "$source" || test -z "$object"; then echo "depcomp: Variables source, object and depmode must be set" 1>&2 exit 1 fi # Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. depfile=${depfile-`echo "$object" | sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} rm -f "$tmpdepfile" # Some modes work just like other modes, but use different flags. We # parameterize here, but still list the modes in the big case below, # to make depend.m4 easier to write. Note that we *cannot* use a case # here, because this file can only contain one case statement. if test "$depmode" = hp; then # HP compiler uses -M and no extra arg. gccflag=-M depmode=gcc fi if test "$depmode" = dashXmstdout; then # This is just like dashmstdout with a different argument. dashmflag=-xM depmode=dashmstdout fi case "$depmode" in gcc3) ## gcc 3 implements dependency tracking that does exactly what ## we want. Yay! Note: for some reason libtool 1.4 doesn't like ## it if -MD -MP comes after the -MF stuff. Hmm. "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi mv "$tmpdepfile" "$depfile" ;; gcc) ## There are various ways to get dependency output from gcc. Here's ## why we pick this rather obscure method: ## - Don't want to use -MD because we'd like the dependencies to end ## up in a subdir. Having to rename by hand is ugly. ## (We might end up doing this anyway to support other compilers.) ## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like ## -MM, not -M (despite what the docs say). ## - Using -M directly means running the compiler twice (even worse ## than renaming). if test -z "$gccflag"; then gccflag=-MD, fi "$@" -Wp,"$gccflag$tmpdepfile" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz ## The second -e expression handles DOS-style file names with drive letters. sed -e 's/^[^:]*: / /' \ -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" ## This next piece of magic avoids the `deleted header file' problem. ## The problem is that when a header file which appears in a .P file ## is deleted, the dependency causes make to die (because there is ## typically no way to rebuild the header). We avoid this by adding ## dummy dependencies for each header file. Too bad gcc doesn't do ## this for us directly. tr ' ' ' ' < "$tmpdepfile" | ## Some versions of gcc put a space before the `:'. On the theory ## that the space means something, we add a space to the output as ## well. ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; sgi) if test "$libtool" = yes; then "$@" "-Wp,-MDupdate,$tmpdepfile" else "$@" -MDupdate "$tmpdepfile" fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files echo "$object : \\" > "$depfile" # Clip off the initial element (the dependent). Don't try to be # clever and replace this with sed code, as IRIX sed won't handle # lines with more than a fixed number of characters (4096 in # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; # the IRIX cc adds comments like `#:fec' to the end of the # dependency line. tr ' ' ' ' < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \ tr ' ' ' ' >> $depfile echo >> $depfile # The second pass generates a dummy entry for each header file. tr ' ' ' ' < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ >> $depfile else # The sourcefile does not contain any dependencies, so just # store a dummy comment line, to avoid errors with the Makefile # "include basename.Plo" scheme. echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; aix) # The C for AIX Compiler uses -M and outputs the dependencies # in a .u file. In older versions, this file always lives in the # current directory. Also, the AIX compiler puts `$object:' at the # start of each line; $object doesn't have directory information. # Version 6 uses the directory in both cases. stripped=`echo "$object" | sed 's/\(.*\)\..*$/\1/'` tmpdepfile="$stripped.u" if test "$libtool" = yes; then "$@" -Wc,-M else "$@" -M fi stat=$? if test -f "$tmpdepfile"; then : else stripped=`echo "$stripped" | sed 's,^.*/,,'` tmpdepfile="$stripped.u" fi if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi if test -f "$tmpdepfile"; then outname="$stripped.o" # Each line is of the form `foo.o: dependent.h'. # Do two passes, one to just change these to # `$object: dependent.h' and one to simply `dependent.h:'. sed -e "s,^$outname:,$object :," < "$tmpdepfile" > "$depfile" sed -e "s,^$outname: \(.*\)$,\1:," < "$tmpdepfile" >> "$depfile" else # The sourcefile does not contain any dependencies, so just # store a dummy comment line, to avoid errors with the Makefile # "include basename.Plo" scheme. echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; icc) # Intel's C compiler understands `-MD -MF file'. However on # icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c # ICC 7.0 will fill foo.d with something like # foo.o: sub/foo.c # foo.o: sub/foo.h # which is wrong. We want: # sub/foo.o: sub/foo.c # sub/foo.o: sub/foo.h # sub/foo.c: # sub/foo.h: # ICC 7.1 will output # foo.o: sub/foo.c sub/foo.h # and will wrap long lines using \ : # foo.o: sub/foo.c ... \ # sub/foo.h ... \ # ... "$@" -MD -MF "$tmpdepfile" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" # Each line is of the form `foo.o: dependent.h', # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. # Do two passes, one to just change these to # `$object: dependent.h' and one to simply `dependent.h:'. sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process this invocation # correctly. Breaking it into two sed invocations is a workaround. sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; tru64) # The Tru64 compiler uses -MD to generate dependencies as a side # effect. `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'. # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put # dependencies in `foo.d' instead, so we check for that too. # Subdirectories are respected. dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` test "x$dir" = "x$object" && dir= base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` if test "$libtool" = yes; then # With Tru64 cc, shared objects can also be used to make a # static library. This mecanism is used in libtool 1.4 series to # handle both shared and static libraries in a single compilation. # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d. # # With libtool 1.5 this exception was removed, and libtool now # generates 2 separate objects for the 2 libraries. These two # compilations output dependencies in in $dir.libs/$base.o.d and # in $dir$base.o.d. We have to check for both files, because # one of the two compilations can be disabled. We should prefer # $dir$base.o.d over $dir.libs/$base.o.d because the latter is # automatically cleaned when .libs/ is deleted, while ignoring # the former would cause a distcleancheck panic. tmpdepfile1=$dir.libs/$base.lo.d # libtool 1.4 tmpdepfile2=$dir$base.o.d # libtool 1.5 tmpdepfile3=$dir.libs/$base.o.d # libtool 1.5 tmpdepfile4=$dir.libs/$base.d # Compaq CCC V6.2-504 "$@" -Wc,-MD else tmpdepfile1=$dir$base.o.d tmpdepfile2=$dir$base.d tmpdepfile3=$dir$base.d tmpdepfile4=$dir$base.d "$@" -MD fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" # That's a tab and a space in the []. sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" else echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; #nosideeffect) # This comment above is used by automake to tell side-effect # dependency tracking mechanisms from slower ones. dashmstdout) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout, regardless of -o. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test $1 != '--mode=compile'; do shift done shift fi # Remove `-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done test -z "$dashmflag" && dashmflag=-M # Require at least two characters before searching for `:' # in the target name. This is to cope with DOS-style filenames: # a dependency such as `c:/foo/bar' could be seen as target `c' otherwise. "$@" $dashmflag | sed 's:^[ ]*[^: ][^:][^:]*\:[ ]*:'"$object"'\: :' > "$tmpdepfile" rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" tr ' ' ' ' < "$tmpdepfile" | \ ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; dashXmstdout) # This case only exists to satisfy depend.m4. It is never actually # run, as this mode is specially recognized in the preamble. exit 1 ;; makedepend) "$@" || exit $? # Remove any Libtool call if test "$libtool" = yes; then while test $1 != '--mode=compile'; do shift done shift fi # X makedepend shift cleared=no for arg in "$@"; do case $cleared in no) set ""; shift cleared=yes ;; esac case "$arg" in -D*|-I*) set fnord "$@" "$arg"; shift ;; # Strip any option that makedepend may not understand. Remove # the object too, otherwise makedepend will parse it as a source file. -*|$object) ;; *) set fnord "$@" "$arg"; shift ;; esac done obj_suffix="`echo $object | sed 's/^.*\././'`" touch "$tmpdepfile" ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" sed '1,2d' "$tmpdepfile" | tr ' ' ' ' | \ ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" "$tmpdepfile".bak ;; cpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test $1 != '--mode=compile'; do shift done shift fi # Remove `-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done "$@" -E | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' | sed '$ s: \\$::' > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" cat < "$tmpdepfile" >> "$depfile" sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; msvisualcpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout, regardless of -o, # because we must use -o when running libtool. "$@" || exit $? IFS=" " for arg do case "$arg" in "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") set fnord "$@" shift shift ;; *) set fnord "$@" "$arg" shift shift ;; esac done "$@" -E | sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::echo "`cygpath -u \\"\1\\"`":p' | sort | uniq > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s:: \1 \\:p' >> "$depfile" echo " " >> "$depfile" . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s::\1\::p' >> "$depfile" rm -f "$tmpdepfile" ;; none) exec "$@" ;; *) echo "Unknown depmode $depmode" 1>&2 exit 1 ;; esac exit 0 # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-end: "$" # End: iaxmodem-1.2.0/lib/spandsp/config/config.sub0000755000175000017500000010115311150047202020312 0ustar julienjulien#! /bin/sh # Configuration validation subroutine script. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, # 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 # Free Software Foundation, Inc. timestamp='2008-01-16' # This file is (in principle) common to ALL GNU software. # The presence of a machine in this file suggests that SOME GNU software # can handle that machine. It does not imply ALL GNU software can. # # This file is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA # 02110-1301, USA. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Please send patches to . Submit a context # diff and a properly formatted ChangeLog entry. # # Configuration subroutine to validate and canonicalize a configuration type. # Supply the specified configuration type as an argument. # If it is invalid, we print an error message on stderr and exit with code 1. # Otherwise, we print the canonical config type on stdout and succeed. # This file is supposed to be the same for all GNU packages # and recognize all the CPU types, system types and aliases # that are meaningful with *any* GNU software. # Each package is responsible for reporting which valid configurations # it does not support. The user should be able to distinguish # a failure to support a valid configuration from a meaningless # configuration. # The goal of this file is to map all the various variations of a given # machine specification into a single specification in the form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or in some cases, the newer four-part form: # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # It is wrong to echo any other type of specification. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] CPU-MFR-OPSYS $0 [OPTION] ALIAS Canonicalize a configuration name. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.sub ($timestamp) Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" exit 1 ;; *local*) # First pass through any local machine types. echo $1 exit ;; * ) break ;; esac done case $# in 0) echo "$me: missing argument$help" >&2 exit 1;; 1) ;; *) echo "$me: too many arguments$help" >&2 exit 1;; esac # Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). # Here we must recognize all the valid KERNEL-OS combinations. maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` case $maybe_os in nto-qnx* | linux-gnu* | linux-dietlibc | linux-newlib* | linux-uclibc* | \ uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | \ storm-chaos* | os2-emx* | rtmk-nova*) os=-$maybe_os basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` ;; *) basic_machine=`echo $1 | sed 's/-[^-]*$//'` if [ $basic_machine != $1 ] then os=`echo $1 | sed 's/.*-/-/'` else os=; fi ;; esac ### Let's recognize common machines as not being operating systems so ### that things like config.sub decstation-3100 work. We also ### recognize some manufacturers as not being operating systems, so we ### can provide default operating systems below. case $os in -sun*os*) # Prevent following clause from handling this invalid input. ;; -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ -apple | -axis | -knuth | -cray) os= basic_machine=$1 ;; -sim | -cisco | -oki | -wec | -winbond) os= basic_machine=$1 ;; -scout) ;; -wrs) os=-vxworks basic_machine=$1 ;; -chorusos*) os=-chorusos basic_machine=$1 ;; -chorusrdb) os=-chorusrdb basic_machine=$1 ;; -hiux*) os=-hiuxwe2 ;; -sco6) os=-sco5v6 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5) os=-sco3.2v5 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco4) os=-sco3.2v4 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2.[4-9]*) os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2v[4-9]*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5v6*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco*) os=-sco3.2v2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -udk*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -isc) os=-isc2.2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -clix*) basic_machine=clipper-intergraph ;; -isc*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -lynx*) os=-lynxos ;; -ptx*) basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` ;; -windowsnt*) os=`echo $os | sed -e 's/windowsnt/winnt/'` ;; -psos*) os=-psos ;; -mint | -mint[0-9]*) basic_machine=m68k-atari os=-mint ;; esac # Decode aliases for certain CPU-COMPANY combinations. case $basic_machine in # Recognize the basic CPU types without company name. # Some are omitted here because they have special meanings below. 1750a | 580 \ | a29k \ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ | am33_2.0 \ | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \ | bfin \ | c4x | clipper \ | d10v | d30v | dlx | dsp16xx \ | fido | fr30 | frv \ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | i370 | i860 | i960 | ia64 \ | ip2k | iq2000 \ | m32c | m32r | m32rle | m68000 | m68k | m88k \ | maxq | mb | microblaze | mcore | mep \ | mips | mipsbe | mipseb | mipsel | mipsle \ | mips16 \ | mips64 | mips64el \ | mips64vr | mips64vrel \ | mips64orion | mips64orionel \ | mips64vr4100 | mips64vr4100el \ | mips64vr4300 | mips64vr4300el \ | mips64vr5000 | mips64vr5000el \ | mips64vr5900 | mips64vr5900el \ | mipsisa32 | mipsisa32el \ | mipsisa32r2 | mipsisa32r2el \ | mipsisa64 | mipsisa64el \ | mipsisa64r2 | mipsisa64r2el \ | mipsisa64sb1 | mipsisa64sb1el \ | mipsisa64sr71k | mipsisa64sr71kel \ | mipstx39 | mipstx39el \ | mn10200 | mn10300 \ | mt \ | msp430 \ | nios | nios2 \ | ns16k | ns32k \ | or32 \ | pdp10 | pdp11 | pj | pjl \ | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \ | pyramid \ | score \ | sh | sh[1234] | sh[24]a | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ | sh64 | sh64le \ | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ | spu | strongarm \ | tahoe | thumb | tic4x | tic80 | tron \ | v850 | v850e \ | we32k \ | x86 | xc16x | xscale | xscalee[bl] | xstormy16 | xtensa \ | z8k) basic_machine=$basic_machine-unknown ;; m6811 | m68hc11 | m6812 | m68hc12) # Motorola 68HC11/12. basic_machine=$basic_machine-unknown os=-none ;; m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) ;; ms1) basic_machine=mt-unknown ;; # We use `pc' rather than `unknown' # because (1) that's what they normally are, and # (2) the word "unknown" tends to confuse beginning users. i*86 | x86_64) basic_machine=$basic_machine-pc ;; # Object if more than one company name word. *-*-*) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; # Recognize the basic CPU types with company name. 580-* \ | a29k-* \ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ | avr-* | avr32-* \ | bfin-* | bs2000-* \ | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \ | clipper-* | craynv-* | cydra-* \ | d10v-* | d30v-* | dlx-* \ | elxsi-* \ | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ | h8300-* | h8500-* \ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ | i*86-* | i860-* | i960-* | ia64-* \ | ip2k-* | iq2000-* \ | m32c-* | m32r-* | m32rle-* \ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ | m88110-* | m88k-* | maxq-* | mcore-* \ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ | mips16-* \ | mips64-* | mips64el-* \ | mips64vr-* | mips64vrel-* \ | mips64orion-* | mips64orionel-* \ | mips64vr4100-* | mips64vr4100el-* \ | mips64vr4300-* | mips64vr4300el-* \ | mips64vr5000-* | mips64vr5000el-* \ | mips64vr5900-* | mips64vr5900el-* \ | mipsisa32-* | mipsisa32el-* \ | mipsisa32r2-* | mipsisa32r2el-* \ | mipsisa64-* | mipsisa64el-* \ | mipsisa64r2-* | mipsisa64r2el-* \ | mipsisa64sb1-* | mipsisa64sb1el-* \ | mipsisa64sr71k-* | mipsisa64sr71kel-* \ | mipstx39-* | mipstx39el-* \ | mmix-* \ | mt-* \ | msp430-* \ | nios-* | nios2-* \ | none-* | np1-* | ns16k-* | ns32k-* \ | orion-* \ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \ | pyramid-* \ | romp-* | rs6000-* \ | sh-* | sh[1234]-* | sh[24]a-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ | sparclite-* \ | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | strongarm-* | sv1-* | sx?-* \ | tahoe-* | thumb-* \ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ | tron-* \ | v850-* | v850e-* | vax-* \ | we32k-* \ | x86-* | x86_64-* | xc16x-* | xps100-* | xscale-* | xscalee[bl]-* \ | xstormy16-* | xtensa*-* \ | ymp-* \ | z8k-*) ;; # Recognize the basic CPU types without company name, with glob match. xtensa*) basic_machine=$basic_machine-unknown ;; # Recognize the various machine names and aliases which stand # for a CPU type and a company and sometimes even an OS. 386bsd) basic_machine=i386-unknown os=-bsd ;; 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) basic_machine=m68000-att ;; 3b*) basic_machine=we32k-att ;; a29khif) basic_machine=a29k-amd os=-udi ;; abacus) basic_machine=abacus-unknown ;; adobe68k) basic_machine=m68010-adobe os=-scout ;; alliant | fx80) basic_machine=fx80-alliant ;; altos | altos3068) basic_machine=m68k-altos ;; am29k) basic_machine=a29k-none os=-bsd ;; amd64) basic_machine=x86_64-pc ;; amd64-*) basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; amdahl) basic_machine=580-amdahl os=-sysv ;; amiga | amiga-*) basic_machine=m68k-unknown ;; amigaos | amigados) basic_machine=m68k-unknown os=-amigaos ;; amigaunix | amix) basic_machine=m68k-unknown os=-sysv4 ;; apollo68) basic_machine=m68k-apollo os=-sysv ;; apollo68bsd) basic_machine=m68k-apollo os=-bsd ;; aux) basic_machine=m68k-apple os=-aux ;; balance) basic_machine=ns32k-sequent os=-dynix ;; blackfin) basic_machine=bfin-unknown os=-linux ;; blackfin-*) basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; c90) basic_machine=c90-cray os=-unicos ;; convex-c1) basic_machine=c1-convex os=-bsd ;; convex-c2) basic_machine=c2-convex os=-bsd ;; convex-c32) basic_machine=c32-convex os=-bsd ;; convex-c34) basic_machine=c34-convex os=-bsd ;; convex-c38) basic_machine=c38-convex os=-bsd ;; cray | j90) basic_machine=j90-cray os=-unicos ;; craynv) basic_machine=craynv-cray os=-unicosmp ;; cr16) basic_machine=cr16-unknown os=-elf ;; crds | unos) basic_machine=m68k-crds ;; crisv32 | crisv32-* | etraxfs*) basic_machine=crisv32-axis ;; cris | cris-* | etrax*) basic_machine=cris-axis ;; crx) basic_machine=crx-unknown os=-elf ;; da30 | da30-*) basic_machine=m68k-da30 ;; decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) basic_machine=mips-dec ;; decsystem10* | dec10*) basic_machine=pdp10-dec os=-tops10 ;; decsystem20* | dec20*) basic_machine=pdp10-dec os=-tops20 ;; delta | 3300 | motorola-3300 | motorola-delta \ | 3300-motorola | delta-motorola) basic_machine=m68k-motorola ;; delta88) basic_machine=m88k-motorola os=-sysv3 ;; djgpp) basic_machine=i586-pc os=-msdosdjgpp ;; dpx20 | dpx20-*) basic_machine=rs6000-bull os=-bosx ;; dpx2* | dpx2*-bull) basic_machine=m68k-bull os=-sysv3 ;; ebmon29k) basic_machine=a29k-amd os=-ebmon ;; elxsi) basic_machine=elxsi-elxsi os=-bsd ;; encore | umax | mmax) basic_machine=ns32k-encore ;; es1800 | OSE68k | ose68k | ose | OSE) basic_machine=m68k-ericsson os=-ose ;; fx2800) basic_machine=i860-alliant ;; genix) basic_machine=ns32k-ns ;; gmicro) basic_machine=tron-gmicro os=-sysv ;; go32) basic_machine=i386-pc os=-go32 ;; h3050r* | hiux*) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; h8300hms) basic_machine=h8300-hitachi os=-hms ;; h8300xray) basic_machine=h8300-hitachi os=-xray ;; h8500hms) basic_machine=h8500-hitachi os=-hms ;; harris) basic_machine=m88k-harris os=-sysv3 ;; hp300-*) basic_machine=m68k-hp ;; hp300bsd) basic_machine=m68k-hp os=-bsd ;; hp300hpux) basic_machine=m68k-hp os=-hpux ;; hp3k9[0-9][0-9] | hp9[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k2[0-9][0-9] | hp9k31[0-9]) basic_machine=m68000-hp ;; hp9k3[2-9][0-9]) basic_machine=m68k-hp ;; hp9k6[0-9][0-9] | hp6[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k7[0-79][0-9] | hp7[0-79][0-9]) basic_machine=hppa1.1-hp ;; hp9k78[0-9] | hp78[0-9]) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[0-9][13679] | hp8[0-9][13679]) basic_machine=hppa1.1-hp ;; hp9k8[0-9][0-9] | hp8[0-9][0-9]) basic_machine=hppa1.0-hp ;; hppa-next) os=-nextstep3 ;; hppaosf) basic_machine=hppa1.1-hp os=-osf ;; hppro) basic_machine=hppa1.1-hp os=-proelf ;; i370-ibm* | ibm*) basic_machine=i370-ibm ;; # I'm not sure what "Sysv32" means. Should this be sysv3.2? i*86v32) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv32 ;; i*86v4*) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv4 ;; i*86v) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv ;; i*86sol2) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-solaris2 ;; i386mach) basic_machine=i386-mach os=-mach ;; i386-vsta | vsta) basic_machine=i386-unknown os=-vsta ;; iris | iris4d) basic_machine=mips-sgi case $os in -irix*) ;; *) os=-irix4 ;; esac ;; isi68 | isi) basic_machine=m68k-isi os=-sysv ;; m68knommu) basic_machine=m68k-unknown os=-linux ;; m68knommu-*) basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; m88k-omron*) basic_machine=m88k-omron ;; magnum | m3230) basic_machine=mips-mips os=-sysv ;; merlin) basic_machine=ns32k-utek os=-sysv ;; mingw32) basic_machine=i386-pc os=-mingw32 ;; mingw32ce) basic_machine=arm-unknown os=-mingw32ce ;; miniframe) basic_machine=m68000-convergent ;; *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) basic_machine=m68k-atari os=-mint ;; mips3*-*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` ;; mips3*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown ;; monitor) basic_machine=m68k-rom68k os=-coff ;; morphos) basic_machine=powerpc-unknown os=-morphos ;; msdos) basic_machine=i386-pc os=-msdos ;; ms1-*) basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` ;; mvs) basic_machine=i370-ibm os=-mvs ;; ncr3000) basic_machine=i486-ncr os=-sysv4 ;; netbsd386) basic_machine=i386-unknown os=-netbsd ;; netwinder) basic_machine=armv4l-rebel os=-linux ;; news | news700 | news800 | news900) basic_machine=m68k-sony os=-newsos ;; news1000) basic_machine=m68030-sony os=-newsos ;; news-3600 | risc-news) basic_machine=mips-sony os=-newsos ;; necv70) basic_machine=v70-nec os=-sysv ;; next | m*-next ) basic_machine=m68k-next case $os in -nextstep* ) ;; -ns2*) os=-nextstep2 ;; *) os=-nextstep3 ;; esac ;; nh3000) basic_machine=m68k-harris os=-cxux ;; nh[45]000) basic_machine=m88k-harris os=-cxux ;; nindy960) basic_machine=i960-intel os=-nindy ;; mon960) basic_machine=i960-intel os=-mon960 ;; nonstopux) basic_machine=mips-compaq os=-nonstopux ;; np1) basic_machine=np1-gould ;; nsr-tandem) basic_machine=nsr-tandem ;; op50n-* | op60c-*) basic_machine=hppa1.1-oki os=-proelf ;; openrisc | openrisc-*) basic_machine=or32-unknown ;; os400) basic_machine=powerpc-ibm os=-os400 ;; OSE68000 | ose68000) basic_machine=m68000-ericsson os=-ose ;; os68k) basic_machine=m68k-none os=-os68k ;; pa-hitachi) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; paragon) basic_machine=i860-intel os=-osf ;; parisc) basic_machine=hppa-unknown os=-linux ;; parisc-*) basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; pbd) basic_machine=sparc-tti ;; pbb) basic_machine=m68k-tti ;; pc532 | pc532-*) basic_machine=ns32k-pc532 ;; pc98) basic_machine=i386-pc ;; pc98-*) basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium | p5 | k5 | k6 | nexgen | viac3) basic_machine=i586-pc ;; pentiumpro | p6 | 6x86 | athlon | athlon_*) basic_machine=i686-pc ;; pentiumii | pentium2 | pentiumiii | pentium3) basic_machine=i686-pc ;; pentium4) basic_machine=i786-pc ;; pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumpro-* | p6-* | 6x86-* | athlon-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium4-*) basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pn) basic_machine=pn-gould ;; power) basic_machine=power-ibm ;; ppc) basic_machine=powerpc-unknown ;; ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppcle | powerpclittle | ppc-le | powerpc-little) basic_machine=powerpcle-unknown ;; ppcle-* | powerpclittle-*) basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64) basic_machine=powerpc64-unknown ;; ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64le | powerpc64little | ppc64-le | powerpc64-little) basic_machine=powerpc64le-unknown ;; ppc64le-* | powerpc64little-*) basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ps2) basic_machine=i386-ibm ;; pw32) basic_machine=i586-unknown os=-pw32 ;; rdos) basic_machine=i386-pc os=-rdos ;; rom68k) basic_machine=m68k-rom68k os=-coff ;; rm[46]00) basic_machine=mips-siemens ;; rtpc | rtpc-*) basic_machine=romp-ibm ;; s390 | s390-*) basic_machine=s390-ibm ;; s390x | s390x-*) basic_machine=s390x-ibm ;; sa29200) basic_machine=a29k-amd os=-udi ;; sb1) basic_machine=mipsisa64sb1-unknown ;; sb1el) basic_machine=mipsisa64sb1el-unknown ;; sde) basic_machine=mipsisa32-sde os=-elf ;; sei) basic_machine=mips-sei os=-seiux ;; sequent) basic_machine=i386-sequent ;; sh) basic_machine=sh-hitachi os=-hms ;; sh5el) basic_machine=sh5le-unknown ;; sh64) basic_machine=sh64-unknown ;; sparclite-wrs | simso-wrs) basic_machine=sparclite-wrs os=-vxworks ;; sps7) basic_machine=m68k-bull os=-sysv2 ;; spur) basic_machine=spur-unknown ;; st2000) basic_machine=m68k-tandem ;; stratus) basic_machine=i860-stratus os=-sysv4 ;; sun2) basic_machine=m68000-sun ;; sun2os3) basic_machine=m68000-sun os=-sunos3 ;; sun2os4) basic_machine=m68000-sun os=-sunos4 ;; sun3os3) basic_machine=m68k-sun os=-sunos3 ;; sun3os4) basic_machine=m68k-sun os=-sunos4 ;; sun4os3) basic_machine=sparc-sun os=-sunos3 ;; sun4os4) basic_machine=sparc-sun os=-sunos4 ;; sun4sol2) basic_machine=sparc-sun os=-solaris2 ;; sun3 | sun3-*) basic_machine=m68k-sun ;; sun4) basic_machine=sparc-sun ;; sun386 | sun386i | roadrunner) basic_machine=i386-sun ;; sv1) basic_machine=sv1-cray os=-unicos ;; symmetry) basic_machine=i386-sequent os=-dynix ;; t3e) basic_machine=alphaev5-cray os=-unicos ;; t90) basic_machine=t90-cray os=-unicos ;; tic54x | c54x*) basic_machine=tic54x-unknown os=-coff ;; tic55x | c55x*) basic_machine=tic55x-unknown os=-coff ;; tic6x | c6x*) basic_machine=tic6x-unknown os=-coff ;; tile*) basic_machine=tile-unknown os=-linux-gnu ;; tx39) basic_machine=mipstx39-unknown ;; tx39el) basic_machine=mipstx39el-unknown ;; toad1) basic_machine=pdp10-xkl os=-tops20 ;; tower | tower-32) basic_machine=m68k-ncr ;; tpf) basic_machine=s390x-ibm os=-tpf ;; udi29k) basic_machine=a29k-amd os=-udi ;; ultra3) basic_machine=a29k-nyu os=-sym1 ;; v810 | necv810) basic_machine=v810-nec os=-none ;; vaxv) basic_machine=vax-dec os=-sysv ;; vms) basic_machine=vax-dec os=-vms ;; vpp*|vx|vx-*) basic_machine=f301-fujitsu ;; vxworks960) basic_machine=i960-wrs os=-vxworks ;; vxworks68) basic_machine=m68k-wrs os=-vxworks ;; vxworks29k) basic_machine=a29k-wrs os=-vxworks ;; w65*) basic_machine=w65-wdc os=-none ;; w89k-*) basic_machine=hppa1.1-winbond os=-proelf ;; xbox) basic_machine=i686-pc os=-mingw32 ;; xps | xps100) basic_machine=xps100-honeywell ;; ymp) basic_machine=ymp-cray os=-unicos ;; z8k-*-coff) basic_machine=z8k-unknown os=-sim ;; none) basic_machine=none-none os=-none ;; # Here we handle the default manufacturer of certain CPU types. It is in # some cases the only manufacturer, in others, it is the most popular. w89k) basic_machine=hppa1.1-winbond ;; op50n) basic_machine=hppa1.1-oki ;; op60c) basic_machine=hppa1.1-oki ;; romp) basic_machine=romp-ibm ;; mmix) basic_machine=mmix-knuth ;; rs6000) basic_machine=rs6000-ibm ;; vax) basic_machine=vax-dec ;; pdp10) # there are many clones, so DEC is not a safe bet basic_machine=pdp10-unknown ;; pdp11) basic_machine=pdp11-dec ;; we32k) basic_machine=we32k-att ;; sh[1234] | sh[24]a | sh[34]eb | sh[1234]le | sh[23]ele) basic_machine=sh-unknown ;; sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) basic_machine=sparc-sun ;; cydra) basic_machine=cydra-cydrome ;; orion) basic_machine=orion-highlevel ;; orion105) basic_machine=clipper-highlevel ;; mac | mpw | mac-mpw) basic_machine=m68k-apple ;; pmac | pmac-mpw) basic_machine=powerpc-apple ;; *-unknown) # Make sure to match an already-canonicalized machine name. ;; *) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; esac # Here we canonicalize certain aliases for manufacturers. case $basic_machine in *-digital*) basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` ;; *-commodore*) basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` ;; *) ;; esac # Decode manufacturer-specific aliases for certain operating systems. if [ x"$os" != x"" ] then case $os in # First match some system type aliases # that might get confused with valid system types. # -solaris* is a basic system type, with this one exception. -solaris1 | -solaris1.*) os=`echo $os | sed -e 's|solaris1|sunos4|'` ;; -solaris) os=-solaris2 ;; -svr4*) os=-sysv4 ;; -unixware*) os=-sysv4.2uw ;; -gnu/linux*) os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` ;; # First accept the basic system types. # The portable systems comes first. # Each alternative MUST END IN A *, to match a version number. # -sysv* is not here because it comes later, after sysvr4. -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ | -aos* \ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ | -openbsd* | -solidbsd* \ | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ | -chorusos* | -chorusrdb* \ | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ | -mingw32* | -linux-gnu* | -linux-newlib* | -linux-uclibc* \ | -uxpv* | -beos* | -mpeix* | -udk* \ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ | -skyos* | -haiku* | -rdos* | -toppers* | -drops*) # Remember, each alternative MUST END IN *, to match a version number. ;; -qnx*) case $basic_machine in x86-* | i*86-*) ;; *) os=-nto$os ;; esac ;; -nto-qnx*) ;; -nto*) os=`echo $os | sed -e 's|nto|nto-qnx|'` ;; -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) ;; -mac*) os=`echo $os | sed -e 's|mac|macos|'` ;; -linux-dietlibc) os=-linux-dietlibc ;; -linux*) os=`echo $os | sed -e 's|linux|linux-gnu|'` ;; -sunos5*) os=`echo $os | sed -e 's|sunos5|solaris2|'` ;; -sunos6*) os=`echo $os | sed -e 's|sunos6|solaris3|'` ;; -opened*) os=-openedition ;; -os400*) os=-os400 ;; -wince*) os=-wince ;; -osfrose*) os=-osfrose ;; -osf*) os=-osf ;; -utek*) os=-bsd ;; -dynix*) os=-bsd ;; -acis*) os=-aos ;; -atheos*) os=-atheos ;; -syllable*) os=-syllable ;; -386bsd) os=-bsd ;; -ctix* | -uts*) os=-sysv ;; -nova*) os=-rtmk-nova ;; -ns2 ) os=-nextstep2 ;; -nsk*) os=-nsk ;; # Preserve the version number of sinix5. -sinix5.*) os=`echo $os | sed -e 's|sinix|sysv|'` ;; -sinix*) os=-sysv4 ;; -tpf*) os=-tpf ;; -triton*) os=-sysv3 ;; -oss*) os=-sysv3 ;; -svr4) os=-sysv4 ;; -svr3) os=-sysv3 ;; -sysvr4) os=-sysv4 ;; # This must come after -sysvr4. -sysv*) ;; -ose*) os=-ose ;; -es1800*) os=-ose ;; -xenix) os=-xenix ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) os=-mint ;; -aros*) os=-aros ;; -kaos*) os=-kaos ;; -zvmoe) os=-zvmoe ;; -none) ;; *) # Get rid of the `-' at the beginning of $os. os=`echo $os | sed 's/[^-]*-//'` echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 exit 1 ;; esac else # Here we handle the default operating systems that come with various machines. # The value should be what the vendor currently ships out the door with their # machine or put another way, the most popular os provided with the machine. # Note that if you're going to try to match "-MANUFACTURER" here (say, # "-sun"), then you have to tell the case statement up towards the top # that MANUFACTURER isn't an operating system. Otherwise, code above # will signal an error saying that MANUFACTURER isn't an operating # system, and we'll never get to this point. case $basic_machine in score-*) os=-elf ;; spu-*) os=-elf ;; *-acorn) os=-riscix1.2 ;; arm*-rebel) os=-linux ;; arm*-semi) os=-aout ;; c4x-* | tic4x-*) os=-coff ;; # This must come before the *-dec entry. pdp10-*) os=-tops20 ;; pdp11-*) os=-none ;; *-dec | vax-*) os=-ultrix4.2 ;; m68*-apollo) os=-domain ;; i386-sun) os=-sunos4.0.2 ;; m68000-sun) os=-sunos3 # This also exists in the configure program, but was not the # default. # os=-sunos4 ;; m68*-cisco) os=-aout ;; mep-*) os=-elf ;; mips*-cisco) os=-elf ;; mips*-*) os=-elf ;; or32-*) os=-coff ;; *-tti) # must be before sparc entry or we get the wrong os. os=-sysv3 ;; sparc-* | *-sun) os=-sunos4.1.1 ;; *-be) os=-beos ;; *-haiku) os=-haiku ;; *-ibm) os=-aix ;; *-knuth) os=-mmixware ;; *-wec) os=-proelf ;; *-winbond) os=-proelf ;; *-oki) os=-proelf ;; *-hp) os=-hpux ;; *-hitachi) os=-hiux ;; i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) os=-sysv ;; *-cbm) os=-amigaos ;; *-dg) os=-dgux ;; *-dolphin) os=-sysv3 ;; m68k-ccur) os=-rtu ;; m88k-omron*) os=-luna ;; *-next ) os=-nextstep ;; *-sequent) os=-ptx ;; *-crds) os=-unos ;; *-ns) os=-genix ;; i370-*) os=-mvs ;; *-next) os=-nextstep3 ;; *-gould) os=-sysv ;; *-highlevel) os=-bsd ;; *-encore) os=-bsd ;; *-sgi) os=-irix ;; *-siemens) os=-sysv4 ;; *-masscomp) os=-rtu ;; f30[01]-fujitsu | f700-fujitsu) os=-uxpv ;; *-rom68k) os=-coff ;; *-*bug) os=-coff ;; *-apple) os=-macos ;; *-atari*) os=-mint ;; *) os=-none ;; esac fi # Here we handle the case where we know the os, and the CPU type, but not the # manufacturer. We pick the logical manufacturer. vendor=unknown case $basic_machine in *-unknown) case $os in -riscix*) vendor=acorn ;; -sunos*) vendor=sun ;; -aix*) vendor=ibm ;; -beos*) vendor=be ;; -hpux*) vendor=hp ;; -mpeix*) vendor=hp ;; -hiux*) vendor=hitachi ;; -unos*) vendor=crds ;; -dgux*) vendor=dg ;; -luna*) vendor=omron ;; -genix*) vendor=ns ;; -mvs* | -opened*) vendor=ibm ;; -os400*) vendor=ibm ;; -ptx*) vendor=sequent ;; -tpf*) vendor=ibm ;; -vxsim* | -vxworks* | -windiss*) vendor=wrs ;; -aux*) vendor=apple ;; -hms*) vendor=hitachi ;; -mpw* | -macos*) vendor=apple ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) vendor=atari ;; -vos*) vendor=stratus ;; esac basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` ;; esac echo $basic_machine$os exit # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: iaxmodem-1.2.0/lib/spandsp/config/ax_check_real_file.m40000644000175000017500000000151511150047202022341 0ustar julienjulien# AX_CHECK_REAL_FILE(FILE, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) # ------------------------------------------------------------------ # # Check for the existence of FILE, and make sure it is a real file or # directory, and not a symbolic link. # AC_DEFUN([AX_CHECK_REAL_FILE], [AC_DIAGNOSE([cross], [cannot check for file existence when cross compiling])dnl AS_VAR_PUSHDEF([ac_RealFile], [ac_cv_real_file_$1])dnl AC_CACHE_CHECK([for $1], ac_RealFile, [test "$cross_compiling" = yes && AC_MSG_ERROR([cannot check for file existence when cross compiling]) if test -r "$1" then if test -h "$1" then AS_VAR_SET(ac_RealFile, no) else AS_VAR_SET(ac_RealFile, yes) fi else AS_VAR_SET(ac_RealFile, no) fi]) AS_IF([test AS_VAR_GET(ac_RealFile) = yes], [$2], [$3])[]dnl AS_VAR_POPDEF([ac_RealFile])dnl ])# AX_CHECK_REAL_FILE iaxmodem-1.2.0/lib/spandsp/config/ltmain.sh0000644000175000017500000060603111150047202020154 0ustar julienjulien# ltmain.sh - Provide generalized library-building support services. # NOTE: Changing this file will not affect anything until you rerun configure. # # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, # 2007, 2008 Free Software Foundation, Inc. # Originally by Gordon Matzigkeit , 1996 # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. basename="s,^.*/,,g" # Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh # is ksh but when the shell is invoked as "sh" and the current value of # the _XPG environment variable is not equal to 1 (one), the special # positional parameter $0, within a function call, is the name of the # function. progpath="$0" # The name of this program: progname=`echo "$progpath" | $SED $basename` modename="$progname" # Global variables: EXIT_SUCCESS=0 EXIT_FAILURE=1 PROGRAM=ltmain.sh PACKAGE=libtool VERSION=1.5.26 TIMESTAMP=" (1.1220.2.493 2008/02/01 16:58:18)" # Be Bourne compatible (taken from Autoconf:_AS_BOURNE_COMPATIBLE). if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac fi BIN_SH=xpg4; export BIN_SH # for Tru64 DUALCASE=1; export DUALCASE # for MKS sh # Check that we have a working $echo. if test "X$1" = X--no-reexec; then # Discard the --no-reexec flag, and continue. shift elif test "X$1" = X--fallback-echo; then # Avoid inline document here, it may be left over : elif test "X`($echo '\t') 2>/dev/null`" = 'X\t'; then # Yippee, $echo works! : else # Restart under the correct shell, and then maybe $echo will work. exec $SHELL "$progpath" --no-reexec ${1+"$@"} fi if test "X$1" = X--fallback-echo; then # used as fallback echo shift cat <&2 $echo "Fatal configuration error. See the $PACKAGE docs for more information." 1>&2 exit $EXIT_FAILURE fi # Global variables. mode=$default_mode nonopt= prev= prevopt= run= show="$echo" show_help= execute_dlfiles= duplicate_deps=no preserve_args= lo2o="s/\\.lo\$/.${objext}/" o2lo="s/\\.${objext}\$/.lo/" extracted_archives= extracted_serial=0 ##################################### # Shell function definitions: # This seems to be the best place for them # func_mktempdir [string] # Make a temporary directory that won't clash with other running # libtool processes, and avoids race conditions if possible. If # given, STRING is the basename for that directory. func_mktempdir () { my_template="${TMPDIR-/tmp}/${1-$progname}" if test "$run" = ":"; then # Return a directory name, but don't create it in dry-run mode my_tmpdir="${my_template}-$$" else # If mktemp works, use that first and foremost my_tmpdir=`mktemp -d "${my_template}-XXXXXXXX" 2>/dev/null` if test ! -d "$my_tmpdir"; then # Failing that, at least try and use $RANDOM to avoid a race my_tmpdir="${my_template}-${RANDOM-0}$$" save_mktempdir_umask=`umask` umask 0077 $mkdir "$my_tmpdir" umask $save_mktempdir_umask fi # If we're not in dry-run mode, bomb out on failure test -d "$my_tmpdir" || { $echo "cannot create temporary directory \`$my_tmpdir'" 1>&2 exit $EXIT_FAILURE } fi $echo "X$my_tmpdir" | $Xsed } # func_win32_libid arg # return the library type of file 'arg' # # Need a lot of goo to handle *both* DLLs and import libs # Has to be a shell function in order to 'eat' the argument # that is supplied when $file_magic_command is called. func_win32_libid () { win32_libid_type="unknown" win32_fileres=`file -L $1 2>/dev/null` case $win32_fileres in *ar\ archive\ import\ library*) # definitely import win32_libid_type="x86 archive import" ;; *ar\ archive*) # could be an import, or static if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | \ $EGREP -e 'file format pe-i386(.*architecture: i386)?' >/dev/null ; then win32_nmres=`eval $NM -f posix -A $1 | \ $SED -n -e '1,100{ / I /{ s,.*,import, p q } }'` case $win32_nmres in import*) win32_libid_type="x86 archive import";; *) win32_libid_type="x86 archive static";; esac fi ;; *DLL*) win32_libid_type="x86 DLL" ;; *executable*) # but shell scripts are "executable" too... case $win32_fileres in *MS\ Windows\ PE\ Intel*) win32_libid_type="x86 DLL" ;; esac ;; esac $echo $win32_libid_type } # func_infer_tag arg # Infer tagged configuration to use if any are available and # if one wasn't chosen via the "--tag" command line option. # Only attempt this if the compiler in the base compile # command doesn't match the default compiler. # arg is usually of the form 'gcc ...' func_infer_tag () { if test -n "$available_tags" && test -z "$tagname"; then CC_quoted= for arg in $CC; do case $arg in *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") arg="\"$arg\"" ;; esac CC_quoted="$CC_quoted $arg" done case $@ in # Blanks in the command may have been stripped by the calling shell, # but not from the CC environment variable when configure was run. " $CC "* | "$CC "* | " `$echo $CC` "* | "`$echo $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$echo $CC_quoted` "* | "`$echo $CC_quoted` "*) ;; # Blanks at the start of $base_compile will cause this to fail # if we don't check for them as well. *) for z in $available_tags; do if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then # Evaluate the configuration. eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`" CC_quoted= for arg in $CC; do # Double-quote args containing other shell metacharacters. case $arg in *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") arg="\"$arg\"" ;; esac CC_quoted="$CC_quoted $arg" done case "$@ " in " $CC "* | "$CC "* | " `$echo $CC` "* | "`$echo $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$echo $CC_quoted` "* | "`$echo $CC_quoted` "*) # The compiler in the base compile command matches # the one in the tagged configuration. # Assume this is the tagged configuration we want. tagname=$z break ;; esac fi done # If $tagname still isn't set, then no tagged configuration # was found and let the user know that the "--tag" command # line option must be used. if test -z "$tagname"; then $echo "$modename: unable to infer tagged configuration" $echo "$modename: specify a tag with \`--tag'" 1>&2 exit $EXIT_FAILURE # else # $echo "$modename: using $tagname tagged configuration" fi ;; esac fi } # func_extract_an_archive dir oldlib func_extract_an_archive () { f_ex_an_ar_dir="$1"; shift f_ex_an_ar_oldlib="$1" $show "(cd $f_ex_an_ar_dir && $AR x $f_ex_an_ar_oldlib)" $run eval "(cd \$f_ex_an_ar_dir && $AR x \$f_ex_an_ar_oldlib)" || exit $? if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then : else $echo "$modename: ERROR: object name conflicts: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib" 1>&2 exit $EXIT_FAILURE fi } # func_extract_archives gentop oldlib ... func_extract_archives () { my_gentop="$1"; shift my_oldlibs=${1+"$@"} my_oldobjs="" my_xlib="" my_xabs="" my_xdir="" my_status="" $show "${rm}r $my_gentop" $run ${rm}r "$my_gentop" $show "$mkdir $my_gentop" $run $mkdir "$my_gentop" my_status=$? if test "$my_status" -ne 0 && test ! -d "$my_gentop"; then exit $my_status fi for my_xlib in $my_oldlibs; do # Extract the objects. case $my_xlib in [\\/]* | [A-Za-z]:[\\/]*) my_xabs="$my_xlib" ;; *) my_xabs=`pwd`"/$my_xlib" ;; esac my_xlib=`$echo "X$my_xlib" | $Xsed -e 's%^.*/%%'` my_xlib_u=$my_xlib while :; do case " $extracted_archives " in *" $my_xlib_u "*) extracted_serial=`expr $extracted_serial + 1` my_xlib_u=lt$extracted_serial-$my_xlib ;; *) break ;; esac done extracted_archives="$extracted_archives $my_xlib_u" my_xdir="$my_gentop/$my_xlib_u" $show "${rm}r $my_xdir" $run ${rm}r "$my_xdir" $show "$mkdir $my_xdir" $run $mkdir "$my_xdir" exit_status=$? if test "$exit_status" -ne 0 && test ! -d "$my_xdir"; then exit $exit_status fi case $host in *-darwin*) $show "Extracting $my_xabs" # Do not bother doing anything if just a dry run if test -z "$run"; then darwin_orig_dir=`pwd` cd $my_xdir || exit $? darwin_archive=$my_xabs darwin_curdir=`pwd` darwin_base_archive=`$echo "X$darwin_archive" | $Xsed -e 's%^.*/%%'` darwin_arches=`lipo -info "$darwin_archive" 2>/dev/null | $EGREP Architectures 2>/dev/null` if test -n "$darwin_arches"; then darwin_arches=`echo "$darwin_arches" | $SED -e 's/.*are://'` darwin_arch= $show "$darwin_base_archive has multiple architectures $darwin_arches" for darwin_arch in $darwin_arches ; do mkdir -p "unfat-$$/${darwin_base_archive}-${darwin_arch}" lipo -thin $darwin_arch -output "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" "${darwin_archive}" cd "unfat-$$/${darwin_base_archive}-${darwin_arch}" func_extract_an_archive "`pwd`" "${darwin_base_archive}" cd "$darwin_curdir" $rm "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" done # $darwin_arches ## Okay now we have a bunch of thin objects, gotta fatten them up :) darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print| xargs basename | sort -u | $NL2SP` darwin_file= darwin_files= for darwin_file in $darwin_filelist; do darwin_files=`find unfat-$$ -name $darwin_file -print | $NL2SP` lipo -create -output "$darwin_file" $darwin_files done # $darwin_filelist ${rm}r unfat-$$ cd "$darwin_orig_dir" else cd "$darwin_orig_dir" func_extract_an_archive "$my_xdir" "$my_xabs" fi # $darwin_arches fi # $run ;; *) func_extract_an_archive "$my_xdir" "$my_xabs" ;; esac my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | $NL2SP` done func_extract_archives_result="$my_oldobjs" } # End of Shell function definitions ##################################### # Darwin sucks eval std_shrext=\"$shrext_cmds\" disable_libs=no # Parse our command line options once, thoroughly. while test "$#" -gt 0 do arg="$1" shift case $arg in -*=*) optarg=`$echo "X$arg" | $Xsed -e 's/[-_a-zA-Z0-9]*=//'` ;; *) optarg= ;; esac # If the previous option needs an argument, assign it. if test -n "$prev"; then case $prev in execute_dlfiles) execute_dlfiles="$execute_dlfiles $arg" ;; tag) tagname="$arg" preserve_args="${preserve_args}=$arg" # Check whether tagname contains only valid characters case $tagname in *[!-_A-Za-z0-9,/]*) $echo "$progname: invalid tag name: $tagname" 1>&2 exit $EXIT_FAILURE ;; esac case $tagname in CC) # Don't test for the "default" C tag, as we know, it's there, but # not specially marked. ;; *) if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$" < "$progpath" > /dev/null; then taglist="$taglist $tagname" # Evaluate the configuration. eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$tagname'$/,/^# ### END LIBTOOL TAG CONFIG: '$tagname'$/p' < $progpath`" else $echo "$progname: ignoring unknown tag $tagname" 1>&2 fi ;; esac ;; *) eval "$prev=\$arg" ;; esac prev= prevopt= continue fi # Have we seen a non-optional argument yet? case $arg in --help) show_help=yes ;; --version) echo "\ $PROGRAM (GNU $PACKAGE) $VERSION$TIMESTAMP Copyright (C) 2008 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." exit $? ;; --config) ${SED} -e '1,/^# ### BEGIN LIBTOOL CONFIG/d' -e '/^# ### END LIBTOOL CONFIG/,$d' $progpath # Now print the configurations for the tags. for tagname in $taglist; do ${SED} -n -e "/^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$/,/^# ### END LIBTOOL TAG CONFIG: $tagname$/p" < "$progpath" done exit $? ;; --debug) $echo "$progname: enabling shell trace mode" set -x preserve_args="$preserve_args $arg" ;; --dry-run | -n) run=: ;; --features) $echo "host: $host" if test "$build_libtool_libs" = yes; then $echo "enable shared libraries" else $echo "disable shared libraries" fi if test "$build_old_libs" = yes; then $echo "enable static libraries" else $echo "disable static libraries" fi exit $? ;; --finish) mode="finish" ;; --mode) prevopt="--mode" prev=mode ;; --mode=*) mode="$optarg" ;; --preserve-dup-deps) duplicate_deps="yes" ;; --quiet | --silent) show=: preserve_args="$preserve_args $arg" ;; --tag) prevopt="--tag" prev=tag preserve_args="$preserve_args --tag" ;; --tag=*) set tag "$optarg" ${1+"$@"} shift prev=tag preserve_args="$preserve_args --tag" ;; -dlopen) prevopt="-dlopen" prev=execute_dlfiles ;; -*) $echo "$modename: unrecognized option \`$arg'" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE ;; *) nonopt="$arg" break ;; esac done if test -n "$prevopt"; then $echo "$modename: option \`$prevopt' requires an argument" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE fi case $disable_libs in no) ;; shared) build_libtool_libs=no build_old_libs=yes ;; static) build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac` ;; esac # If this variable is set in any of the actions, the command in it # will be execed at the end. This prevents here-documents from being # left over by shells. exec_cmd= if test -z "$show_help"; then # Infer the operation mode. if test -z "$mode"; then $echo "*** Warning: inferring the mode of operation is deprecated." 1>&2 $echo "*** Future versions of Libtool will require --mode=MODE be specified." 1>&2 case $nonopt in *cc | cc* | *++ | gcc* | *-gcc* | g++* | xlc*) mode=link for arg do case $arg in -c) mode=compile break ;; esac done ;; *db | *dbx | *strace | *truss) mode=execute ;; *install*|cp|mv) mode=install ;; *rm) mode=uninstall ;; *) # If we have no mode, but dlfiles were specified, then do execute mode. test -n "$execute_dlfiles" && mode=execute # Just use the default operation mode. if test -z "$mode"; then if test -n "$nonopt"; then $echo "$modename: warning: cannot infer operation mode from \`$nonopt'" 1>&2 else $echo "$modename: warning: cannot infer operation mode without MODE-ARGS" 1>&2 fi fi ;; esac fi # Only execute mode is allowed to have -dlopen flags. if test -n "$execute_dlfiles" && test "$mode" != execute; then $echo "$modename: unrecognized option \`-dlopen'" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE fi # Change the help message to a mode-specific one. generic_help="$help" help="Try \`$modename --help --mode=$mode' for more information." # These modes are in order of execution frequency so that they run quickly. case $mode in # libtool compile mode compile) modename="$modename: compile" # Get the compilation command and the source file. base_compile= srcfile="$nonopt" # always keep a non-empty value in "srcfile" suppress_opt=yes suppress_output= arg_mode=normal libobj= later= for arg do case $arg_mode in arg ) # do not "continue". Instead, add this to base_compile lastarg="$arg" arg_mode=normal ;; target ) libobj="$arg" arg_mode=normal continue ;; normal ) # Accept any command-line options. case $arg in -o) if test -n "$libobj" ; then $echo "$modename: you cannot specify \`-o' more than once" 1>&2 exit $EXIT_FAILURE fi arg_mode=target continue ;; -static | -prefer-pic | -prefer-non-pic) later="$later $arg" continue ;; -no-suppress) suppress_opt=no continue ;; -Xcompiler) arg_mode=arg # the next one goes into the "base_compile" arg list continue # The current "srcfile" will either be retained or ;; # replaced later. I would guess that would be a bug. -Wc,*) args=`$echo "X$arg" | $Xsed -e "s/^-Wc,//"` lastarg= save_ifs="$IFS"; IFS=',' for arg in $args; do IFS="$save_ifs" # Double-quote args containing other shell metacharacters. # Many Bourne shells cannot handle close brackets correctly # in scan sets, so we specify it separately. case $arg in *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") arg="\"$arg\"" ;; esac lastarg="$lastarg $arg" done IFS="$save_ifs" lastarg=`$echo "X$lastarg" | $Xsed -e "s/^ //"` # Add the arguments to base_compile. base_compile="$base_compile $lastarg" continue ;; * ) # Accept the current argument as the source file. # The previous "srcfile" becomes the current argument. # lastarg="$srcfile" srcfile="$arg" ;; esac # case $arg ;; esac # case $arg_mode # Aesthetically quote the previous argument. lastarg=`$echo "X$lastarg" | $Xsed -e "$sed_quote_subst"` case $lastarg in # Double-quote args containing other shell metacharacters. # Many Bourne shells cannot handle close brackets correctly # in scan sets, and some SunOS ksh mistreat backslash-escaping # in scan sets (worked around with variable expansion), # and furthermore cannot handle '|' '&' '(' ')' in scan sets # at all, so we specify them separately. *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") lastarg="\"$lastarg\"" ;; esac base_compile="$base_compile $lastarg" done # for arg case $arg_mode in arg) $echo "$modename: you must specify an argument for -Xcompile" exit $EXIT_FAILURE ;; target) $echo "$modename: you must specify a target with \`-o'" 1>&2 exit $EXIT_FAILURE ;; *) # Get the name of the library object. [ -z "$libobj" ] && libobj=`$echo "X$srcfile" | $Xsed -e 's%^.*/%%'` ;; esac # Recognize several different file suffixes. # If the user specifies -o file.o, it is replaced with file.lo xform='[cCFSifmso]' case $libobj in *.ada) xform=ada ;; *.adb) xform=adb ;; *.ads) xform=ads ;; *.asm) xform=asm ;; *.c++) xform=c++ ;; *.cc) xform=cc ;; *.ii) xform=ii ;; *.class) xform=class ;; *.cpp) xform=cpp ;; *.cxx) xform=cxx ;; *.[fF][09]?) xform=[fF][09]. ;; *.for) xform=for ;; *.java) xform=java ;; *.obj) xform=obj ;; *.sx) xform=sx ;; esac libobj=`$echo "X$libobj" | $Xsed -e "s/\.$xform$/.lo/"` case $libobj in *.lo) obj=`$echo "X$libobj" | $Xsed -e "$lo2o"` ;; *) $echo "$modename: cannot determine name of library object from \`$libobj'" 1>&2 exit $EXIT_FAILURE ;; esac func_infer_tag $base_compile for arg in $later; do case $arg in -static) build_old_libs=yes continue ;; -prefer-pic) pic_mode=yes continue ;; -prefer-non-pic) pic_mode=no continue ;; esac done qlibobj=`$echo "X$libobj" | $Xsed -e "$sed_quote_subst"` case $qlibobj in *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") qlibobj="\"$qlibobj\"" ;; esac test "X$libobj" != "X$qlibobj" \ && $echo "X$libobj" | grep '[]~#^*{};<>?"'"'"' &()|`$[]' \ && $echo "$modename: libobj name \`$libobj' may not contain shell special characters." objname=`$echo "X$obj" | $Xsed -e 's%^.*/%%'` xdir=`$echo "X$obj" | $Xsed -e 's%/[^/]*$%%'` if test "X$xdir" = "X$obj"; then xdir= else xdir=$xdir/ fi lobj=${xdir}$objdir/$objname if test -z "$base_compile"; then $echo "$modename: you must specify a compilation command" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE fi # Delete any leftover library objects. if test "$build_old_libs" = yes; then removelist="$obj $lobj $libobj ${libobj}T" else removelist="$lobj $libobj ${libobj}T" fi $run $rm $removelist trap "$run $rm $removelist; exit $EXIT_FAILURE" 1 2 15 # On Cygwin there's no "real" PIC flag so we must build both object types case $host_os in cygwin* | mingw* | pw32* | os2*) pic_mode=default ;; esac if test "$pic_mode" = no && test "$deplibs_check_method" != pass_all; then # non-PIC code in shared libraries is not supported pic_mode=default fi # Calculate the filename of the output object if compiler does # not support -o with -c if test "$compiler_c_o" = no; then output_obj=`$echo "X$srcfile" | $Xsed -e 's%^.*/%%' -e 's%\.[^.]*$%%'`.${objext} lockfile="$output_obj.lock" removelist="$removelist $output_obj $lockfile" trap "$run $rm $removelist; exit $EXIT_FAILURE" 1 2 15 else output_obj= need_locks=no lockfile= fi # Lock this critical section if it is needed # We use this script file to make the link, it avoids creating a new file if test "$need_locks" = yes; then until $run ln "$progpath" "$lockfile" 2>/dev/null; do $show "Waiting for $lockfile to be removed" sleep 2 done elif test "$need_locks" = warn; then if test -f "$lockfile"; then $echo "\ *** ERROR, $lockfile exists and contains: `cat $lockfile 2>/dev/null` This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support \`-c' and \`-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $run $rm $removelist exit $EXIT_FAILURE fi $echo "$srcfile" > "$lockfile" fi if test -n "$fix_srcfile_path"; then eval srcfile=\"$fix_srcfile_path\" fi qsrcfile=`$echo "X$srcfile" | $Xsed -e "$sed_quote_subst"` case $qsrcfile in *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") qsrcfile="\"$qsrcfile\"" ;; esac $run $rm "$libobj" "${libobj}T" # Create a libtool object file (analogous to a ".la" file), # but don't create it if we're doing a dry run. test -z "$run" && cat > ${libobj}T </dev/null`" != "X$srcfile"; then $echo "\ *** ERROR, $lockfile contains: `cat $lockfile 2>/dev/null` but it should contain: $srcfile This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support \`-c' and \`-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $run $rm $removelist exit $EXIT_FAILURE fi # Just move the object if needed, then go on to compile the next one if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then $show "$mv $output_obj $lobj" if $run $mv $output_obj $lobj; then : else error=$? $run $rm $removelist exit $error fi fi # Append the name of the PIC object to the libtool object file. test -z "$run" && cat >> ${libobj}T <> ${libobj}T </dev/null`" != "X$srcfile"; then $echo "\ *** ERROR, $lockfile contains: `cat $lockfile 2>/dev/null` but it should contain: $srcfile This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support \`-c' and \`-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $run $rm $removelist exit $EXIT_FAILURE fi # Just move the object if needed if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then $show "$mv $output_obj $obj" if $run $mv $output_obj $obj; then : else error=$? $run $rm $removelist exit $error fi fi # Append the name of the non-PIC object the libtool object file. # Only append if the libtool object file exists. test -z "$run" && cat >> ${libobj}T <> ${libobj}T <&2 fi if test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=yes ;; -static) if test -z "$pic_flag" && test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=built ;; -static-libtool-libs) if test -z "$pic_flag" && test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=yes ;; esac build_libtool_libs=no build_old_libs=yes break ;; esac done # See if our shared archives depend on static archives. test -n "$old_archive_from_new_cmds" && build_old_libs=yes # Go through the arguments, transforming them on the way. while test "$#" -gt 0; do arg="$1" shift case $arg in *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") qarg=\"`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`\" ### testsuite: skip nested quoting test ;; *) qarg=$arg ;; esac libtool_args="$libtool_args $qarg" # If the previous option needs an argument, assign it. if test -n "$prev"; then case $prev in output) compile_command="$compile_command @OUTPUT@" finalize_command="$finalize_command @OUTPUT@" ;; esac case $prev in dlfiles|dlprefiles) if test "$preload" = no; then # Add the symbol object into the linking commands. compile_command="$compile_command @SYMFILE@" finalize_command="$finalize_command @SYMFILE@" preload=yes fi case $arg in *.la | *.lo) ;; # We handle these cases below. force) if test "$dlself" = no; then dlself=needless export_dynamic=yes fi prev= continue ;; self) if test "$prev" = dlprefiles; then dlself=yes elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then dlself=yes else dlself=needless export_dynamic=yes fi prev= continue ;; *) if test "$prev" = dlfiles; then dlfiles="$dlfiles $arg" else dlprefiles="$dlprefiles $arg" fi prev= continue ;; esac ;; expsyms) export_symbols="$arg" if test ! -f "$arg"; then $echo "$modename: symbol file \`$arg' does not exist" exit $EXIT_FAILURE fi prev= continue ;; expsyms_regex) export_symbols_regex="$arg" prev= continue ;; inst_prefix) inst_prefix_dir="$arg" prev= continue ;; precious_regex) precious_files_regex="$arg" prev= continue ;; release) release="-$arg" prev= continue ;; objectlist) if test -f "$arg"; then save_arg=$arg moreargs= for fil in `cat $save_arg` do # moreargs="$moreargs $fil" arg=$fil # A libtool-controlled object. # Check to see that this really is a libtool object. if (${SED} -e '2q' $arg | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then pic_object= non_pic_object= # Read the .lo file # If there is no directory component, then add one. case $arg in */* | *\\*) . $arg ;; *) . ./$arg ;; esac if test -z "$pic_object" || \ test -z "$non_pic_object" || test "$pic_object" = none && \ test "$non_pic_object" = none; then $echo "$modename: cannot find name of object for \`$arg'" 1>&2 exit $EXIT_FAILURE fi # Extract subdirectory from the argument. xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'` if test "X$xdir" = "X$arg"; then xdir= else xdir="$xdir/" fi if test "$pic_object" != none; then # Prepend the subdirectory the object is found in. pic_object="$xdir$pic_object" if test "$prev" = dlfiles; then if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then dlfiles="$dlfiles $pic_object" prev= continue else # If libtool objects are unsupported, then we need to preload. prev=dlprefiles fi fi # CHECK ME: I think I busted this. -Ossama if test "$prev" = dlprefiles; then # Preload the old-style object. dlprefiles="$dlprefiles $pic_object" prev= fi # A PIC object. libobjs="$libobjs $pic_object" arg="$pic_object" fi # Non-PIC object. if test "$non_pic_object" != none; then # Prepend the subdirectory the object is found in. non_pic_object="$xdir$non_pic_object" # A standard non-PIC object non_pic_objects="$non_pic_objects $non_pic_object" if test -z "$pic_object" || test "$pic_object" = none ; then arg="$non_pic_object" fi else # If the PIC object exists, use it instead. # $xdir was prepended to $pic_object above. non_pic_object="$pic_object" non_pic_objects="$non_pic_objects $non_pic_object" fi else # Only an error if not doing a dry-run. if test -z "$run"; then $echo "$modename: \`$arg' is not a valid libtool object" 1>&2 exit $EXIT_FAILURE else # Dry-run case. # Extract subdirectory from the argument. xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'` if test "X$xdir" = "X$arg"; then xdir= else xdir="$xdir/" fi pic_object=`$echo "X${xdir}${objdir}/${arg}" | $Xsed -e "$lo2o"` non_pic_object=`$echo "X${xdir}${arg}" | $Xsed -e "$lo2o"` libobjs="$libobjs $pic_object" non_pic_objects="$non_pic_objects $non_pic_object" fi fi done else $echo "$modename: link input file \`$save_arg' does not exist" exit $EXIT_FAILURE fi arg=$save_arg prev= continue ;; rpath | xrpath) # We need an absolute path. case $arg in [\\/]* | [A-Za-z]:[\\/]*) ;; *) $echo "$modename: only absolute run-paths are allowed" 1>&2 exit $EXIT_FAILURE ;; esac if test "$prev" = rpath; then case "$rpath " in *" $arg "*) ;; *) rpath="$rpath $arg" ;; esac else case "$xrpath " in *" $arg "*) ;; *) xrpath="$xrpath $arg" ;; esac fi prev= continue ;; xcompiler) compiler_flags="$compiler_flags $qarg" prev= compile_command="$compile_command $qarg" finalize_command="$finalize_command $qarg" continue ;; xlinker) linker_flags="$linker_flags $qarg" compiler_flags="$compiler_flags $wl$qarg" prev= compile_command="$compile_command $wl$qarg" finalize_command="$finalize_command $wl$qarg" continue ;; xcclinker) linker_flags="$linker_flags $qarg" compiler_flags="$compiler_flags $qarg" prev= compile_command="$compile_command $qarg" finalize_command="$finalize_command $qarg" continue ;; shrext) shrext_cmds="$arg" prev= continue ;; darwin_framework|darwin_framework_skip) test "$prev" = "darwin_framework" && compiler_flags="$compiler_flags $arg" compile_command="$compile_command $arg" finalize_command="$finalize_command $arg" prev= continue ;; *) eval "$prev=\"\$arg\"" prev= continue ;; esac fi # test -n "$prev" prevarg="$arg" case $arg in -all-static) if test -n "$link_static_flag"; then compile_command="$compile_command $link_static_flag" finalize_command="$finalize_command $link_static_flag" fi continue ;; -allow-undefined) # FIXME: remove this flag sometime in the future. $echo "$modename: \`-allow-undefined' is deprecated because it is the default" 1>&2 continue ;; -avoid-version) avoid_version=yes continue ;; -dlopen) prev=dlfiles continue ;; -dlpreopen) prev=dlprefiles continue ;; -export-dynamic) export_dynamic=yes continue ;; -export-symbols | -export-symbols-regex) if test -n "$export_symbols" || test -n "$export_symbols_regex"; then $echo "$modename: more than one -exported-symbols argument is not allowed" exit $EXIT_FAILURE fi if test "X$arg" = "X-export-symbols"; then prev=expsyms else prev=expsyms_regex fi continue ;; -framework|-arch|-isysroot) case " $CC " in *" ${arg} ${1} "* | *" ${arg} ${1} "*) prev=darwin_framework_skip ;; *) compiler_flags="$compiler_flags $arg" prev=darwin_framework ;; esac compile_command="$compile_command $arg" finalize_command="$finalize_command $arg" continue ;; -inst-prefix-dir) prev=inst_prefix continue ;; # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:* # so, if we see these flags be careful not to treat them like -L -L[A-Z][A-Z]*:*) case $with_gcc/$host in no/*-*-irix* | /*-*-irix*) compile_command="$compile_command $arg" finalize_command="$finalize_command $arg" ;; esac continue ;; -L*) dir=`$echo "X$arg" | $Xsed -e 's/^-L//'` # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) ;; *) absdir=`cd "$dir" && pwd` if test -z "$absdir"; then $echo "$modename: cannot determine absolute directory name of \`$dir'" 1>&2 absdir="$dir" notinst_path="$notinst_path $dir" fi dir="$absdir" ;; esac case "$deplibs " in *" -L$dir "*) ;; *) deplibs="$deplibs -L$dir" lib_search_path="$lib_search_path $dir" ;; esac case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*) testbindir=`$echo "X$dir" | $Xsed -e 's*/lib$*/bin*'` case :$dllsearchpath: in *":$dir:"*) ;; *) dllsearchpath="$dllsearchpath:$dir";; esac case :$dllsearchpath: in *":$testbindir:"*) ;; *) dllsearchpath="$dllsearchpath:$testbindir";; esac ;; esac continue ;; -l*) if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos*) # These systems don't actually have a C or math library (as such) continue ;; *-*-os2*) # These systems don't actually have a C library (as such) test "X$arg" = "X-lc" && continue ;; *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) # Do not include libc due to us having libc/libc_r. test "X$arg" = "X-lc" && continue ;; *-*-rhapsody* | *-*-darwin1.[012]) # Rhapsody C and math libraries are in the System framework deplibs="$deplibs -framework System" continue ;; *-*-sco3.2v5* | *-*-sco5v6*) # Causes problems with __ctype test "X$arg" = "X-lc" && continue ;; *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) # Compiler inserts libc in the correct place for threads to work test "X$arg" = "X-lc" && continue ;; esac elif test "X$arg" = "X-lc_r"; then case $host in *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) # Do not include libc_r directly, use -pthread flag. continue ;; esac fi deplibs="$deplibs $arg" continue ;; # Tru64 UNIX uses -model [arg] to determine the layout of C++ # classes, name mangling, and exception handling. -model) compile_command="$compile_command $arg" compiler_flags="$compiler_flags $arg" finalize_command="$finalize_command $arg" prev=xcompiler continue ;; -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe|-threads) compiler_flags="$compiler_flags $arg" compile_command="$compile_command $arg" finalize_command="$finalize_command $arg" continue ;; -multi_module) single_module="${wl}-multi_module" continue ;; -module) module=yes continue ;; # -64, -mips[0-9] enable 64-bit mode on the SGI compiler # -r[0-9][0-9]* specifies the processor on the SGI compiler # -xarch=*, -xtarget=* enable 64-bit mode on the Sun compiler # +DA*, +DD* enable 64-bit mode on the HP compiler # -q* pass through compiler args for the IBM compiler # -m* pass through architecture-specific compiler args for GCC # -m*, -t[45]*, -txscale* pass through architecture-specific # compiler args for GCC # -p, -pg, --coverage, -fprofile-* pass through profiling flag for GCC # -F/path gives path to uninstalled frameworks, gcc on darwin # @file GCC response files -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \ -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*) # Unknown arguments in both finalize_command and compile_command need # to be aesthetically quoted because they are evaled later. arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` case $arg in *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") arg="\"$arg\"" ;; esac compile_command="$compile_command $arg" finalize_command="$finalize_command $arg" compiler_flags="$compiler_flags $arg" continue ;; -shrext) prev=shrext continue ;; -no-fast-install) fast_install=no continue ;; -no-install) case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin*) # The PATH hackery in wrapper scripts is required on Windows # and Darwin in order for the loader to find any dlls it needs. $echo "$modename: warning: \`-no-install' is ignored for $host" 1>&2 $echo "$modename: warning: assuming \`-no-fast-install' instead" 1>&2 fast_install=no ;; *) no_install=yes ;; esac continue ;; -no-undefined) allow_undefined=no continue ;; -objectlist) prev=objectlist continue ;; -o) prev=output ;; -precious-files-regex) prev=precious_regex continue ;; -release) prev=release continue ;; -rpath) prev=rpath continue ;; -R) prev=xrpath continue ;; -R*) dir=`$echo "X$arg" | $Xsed -e 's/^-R//'` # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) ;; *) $echo "$modename: only absolute run-paths are allowed" 1>&2 exit $EXIT_FAILURE ;; esac case "$xrpath " in *" $dir "*) ;; *) xrpath="$xrpath $dir" ;; esac continue ;; -static | -static-libtool-libs) # The effects of -static are defined in a previous loop. # We used to do the same as -all-static on platforms that # didn't have a PIC flag, but the assumption that the effects # would be equivalent was wrong. It would break on at least # Digital Unix and AIX. continue ;; -thread-safe) thread_safe=yes continue ;; -version-info) prev=vinfo continue ;; -version-number) prev=vinfo vinfo_number=yes continue ;; -Wc,*) args=`$echo "X$arg" | $Xsed -e "$sed_quote_subst" -e 's/^-Wc,//'` arg= save_ifs="$IFS"; IFS=',' for flag in $args; do IFS="$save_ifs" case $flag in *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") flag="\"$flag\"" ;; esac arg="$arg $wl$flag" compiler_flags="$compiler_flags $flag" done IFS="$save_ifs" arg=`$echo "X$arg" | $Xsed -e "s/^ //"` ;; -Wl,*) args=`$echo "X$arg" | $Xsed -e "$sed_quote_subst" -e 's/^-Wl,//'` arg= save_ifs="$IFS"; IFS=',' for flag in $args; do IFS="$save_ifs" case $flag in *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") flag="\"$flag\"" ;; esac arg="$arg $wl$flag" compiler_flags="$compiler_flags $wl$flag" linker_flags="$linker_flags $flag" done IFS="$save_ifs" arg=`$echo "X$arg" | $Xsed -e "s/^ //"` ;; -Xcompiler) prev=xcompiler continue ;; -Xlinker) prev=xlinker continue ;; -XCClinker) prev=xcclinker continue ;; # Some other compiler flag. -* | +*) # Unknown arguments in both finalize_command and compile_command need # to be aesthetically quoted because they are evaled later. arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` case $arg in *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") arg="\"$arg\"" ;; esac ;; *.$objext) # A standard object. objs="$objs $arg" ;; *.lo) # A libtool-controlled object. # Check to see that this really is a libtool object. if (${SED} -e '2q' $arg | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then pic_object= non_pic_object= # Read the .lo file # If there is no directory component, then add one. case $arg in */* | *\\*) . $arg ;; *) . ./$arg ;; esac if test -z "$pic_object" || \ test -z "$non_pic_object" || test "$pic_object" = none && \ test "$non_pic_object" = none; then $echo "$modename: cannot find name of object for \`$arg'" 1>&2 exit $EXIT_FAILURE fi # Extract subdirectory from the argument. xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'` if test "X$xdir" = "X$arg"; then xdir= else xdir="$xdir/" fi if test "$pic_object" != none; then # Prepend the subdirectory the object is found in. pic_object="$xdir$pic_object" if test "$prev" = dlfiles; then if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then dlfiles="$dlfiles $pic_object" prev= continue else # If libtool objects are unsupported, then we need to preload. prev=dlprefiles fi fi # CHECK ME: I think I busted this. -Ossama if test "$prev" = dlprefiles; then # Preload the old-style object. dlprefiles="$dlprefiles $pic_object" prev= fi # A PIC object. libobjs="$libobjs $pic_object" arg="$pic_object" fi # Non-PIC object. if test "$non_pic_object" != none; then # Prepend the subdirectory the object is found in. non_pic_object="$xdir$non_pic_object" # A standard non-PIC object non_pic_objects="$non_pic_objects $non_pic_object" if test -z "$pic_object" || test "$pic_object" = none ; then arg="$non_pic_object" fi else # If the PIC object exists, use it instead. # $xdir was prepended to $pic_object above. non_pic_object="$pic_object" non_pic_objects="$non_pic_objects $non_pic_object" fi else # Only an error if not doing a dry-run. if test -z "$run"; then $echo "$modename: \`$arg' is not a valid libtool object" 1>&2 exit $EXIT_FAILURE else # Dry-run case. # Extract subdirectory from the argument. xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'` if test "X$xdir" = "X$arg"; then xdir= else xdir="$xdir/" fi pic_object=`$echo "X${xdir}${objdir}/${arg}" | $Xsed -e "$lo2o"` non_pic_object=`$echo "X${xdir}${arg}" | $Xsed -e "$lo2o"` libobjs="$libobjs $pic_object" non_pic_objects="$non_pic_objects $non_pic_object" fi fi ;; *.$libext) # An archive. deplibs="$deplibs $arg" old_deplibs="$old_deplibs $arg" continue ;; *.la) # A libtool-controlled library. if test "$prev" = dlfiles; then # This library was specified with -dlopen. dlfiles="$dlfiles $arg" prev= elif test "$prev" = dlprefiles; then # The library was specified with -dlpreopen. dlprefiles="$dlprefiles $arg" prev= else deplibs="$deplibs $arg" fi continue ;; # Some other compiler argument. *) # Unknown arguments in both finalize_command and compile_command need # to be aesthetically quoted because they are evaled later. arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` case $arg in *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") arg="\"$arg\"" ;; esac ;; esac # arg # Now actually substitute the argument into the commands. if test -n "$arg"; then compile_command="$compile_command $arg" finalize_command="$finalize_command $arg" fi done # argument parsing loop if test -n "$prev"; then $echo "$modename: the \`$prevarg' option requires an argument" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE fi if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then eval arg=\"$export_dynamic_flag_spec\" compile_command="$compile_command $arg" finalize_command="$finalize_command $arg" fi oldlibs= # calculate the name of the file, without its directory outputname=`$echo "X$output" | $Xsed -e 's%^.*/%%'` libobjs_save="$libobjs" if test -n "$shlibpath_var"; then # get the directories listed in $shlibpath_var eval shlib_search_path=\`\$echo \"X\${$shlibpath_var}\" \| \$Xsed -e \'s/:/ /g\'\` else shlib_search_path= fi eval sys_lib_search_path=\"$sys_lib_search_path_spec\" eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\" output_objdir=`$echo "X$output" | $Xsed -e 's%/[^/]*$%%'` if test "X$output_objdir" = "X$output"; then output_objdir="$objdir" else output_objdir="$output_objdir/$objdir" fi # Create the object directory. if test ! -d "$output_objdir"; then $show "$mkdir $output_objdir" $run $mkdir $output_objdir exit_status=$? if test "$exit_status" -ne 0 && test ! -d "$output_objdir"; then exit $exit_status fi fi # Determine the type of output case $output in "") $echo "$modename: you must specify an output file" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE ;; *.$libext) linkmode=oldlib ;; *.lo | *.$objext) linkmode=obj ;; *.la) linkmode=lib ;; *) linkmode=prog ;; # Anything else should be a program. esac case $host in *cygwin* | *mingw* | *pw32*) # don't eliminate duplications in $postdeps and $predeps duplicate_compiler_generated_deps=yes ;; *) duplicate_compiler_generated_deps=$duplicate_deps ;; esac specialdeplibs= libs= # Find all interdependent deplibs by searching for libraries # that are linked more than once (e.g. -la -lb -la) for deplib in $deplibs; do if test "X$duplicate_deps" = "Xyes" ; then case "$libs " in *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; esac fi libs="$libs $deplib" done if test "$linkmode" = lib; then libs="$predeps $libs $compiler_lib_search_path $postdeps" # Compute libraries that are listed more than once in $predeps # $postdeps and mark them as special (i.e., whose duplicates are # not to be eliminated). pre_post_deps= if test "X$duplicate_compiler_generated_deps" = "Xyes" ; then for pre_post_dep in $predeps $postdeps; do case "$pre_post_deps " in *" $pre_post_dep "*) specialdeplibs="$specialdeplibs $pre_post_deps" ;; esac pre_post_deps="$pre_post_deps $pre_post_dep" done fi pre_post_deps= fi deplibs= newdependency_libs= newlib_search_path= need_relink=no # whether we're linking any uninstalled libtool libraries notinst_deplibs= # not-installed libtool libraries case $linkmode in lib) passes="conv link" for file in $dlfiles $dlprefiles; do case $file in *.la) ;; *) $echo "$modename: libraries can \`-dlopen' only libtool libraries: $file" 1>&2 exit $EXIT_FAILURE ;; esac done ;; prog) compile_deplibs= finalize_deplibs= alldeplibs=no newdlfiles= newdlprefiles= passes="conv scan dlopen dlpreopen link" ;; *) passes="conv" ;; esac for pass in $passes; do if test "$linkmode,$pass" = "lib,link" || test "$linkmode,$pass" = "prog,scan"; then libs="$deplibs" deplibs= fi if test "$linkmode" = prog; then case $pass in dlopen) libs="$dlfiles" ;; dlpreopen) libs="$dlprefiles" ;; link) libs="$deplibs %DEPLIBS% $dependency_libs" ;; esac fi if test "$pass" = dlopen; then # Collect dlpreopened libraries save_deplibs="$deplibs" deplibs= fi for deplib in $libs; do lib= found=no case $deplib in -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe|-threads) if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else compiler_flags="$compiler_flags $deplib" fi continue ;; -l*) if test "$linkmode" != lib && test "$linkmode" != prog; then $echo "$modename: warning: \`-l' is ignored for archives/objects" 1>&2 continue fi name=`$echo "X$deplib" | $Xsed -e 's/^-l//'` if test "$linkmode" = lib; then searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path" else searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path" fi for searchdir in $searchdirs; do for search_ext in .la $std_shrext .so .a; do # Search the libtool library lib="$searchdir/lib${name}${search_ext}" if test -f "$lib"; then if test "$search_ext" = ".la"; then found=yes else found=no fi break 2 fi done done if test "$found" != yes; then # deplib doesn't seem to be a libtool library if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" fi continue else # deplib is a libtool library # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib, # We need to do some special things here, and not later. if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then case " $predeps $postdeps " in *" $deplib "*) if (${SED} -e '2q' $lib | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then library_names= old_library= case $lib in */* | *\\*) . $lib ;; *) . ./$lib ;; esac for l in $old_library $library_names; do ll="$l" done if test "X$ll" = "X$old_library" ; then # only static version available found=no ladir=`$echo "X$lib" | $Xsed -e 's%/[^/]*$%%'` test "X$ladir" = "X$lib" && ladir="." lib=$ladir/$old_library if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" fi continue fi fi ;; *) ;; esac fi fi ;; # -l -L*) case $linkmode in lib) deplibs="$deplib $deplibs" test "$pass" = conv && continue newdependency_libs="$deplib $newdependency_libs" newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'` ;; prog) if test "$pass" = conv; then deplibs="$deplib $deplibs" continue fi if test "$pass" = scan; then deplibs="$deplib $deplibs" else compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" fi newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'` ;; *) $echo "$modename: warning: \`-L' is ignored for archives/objects" 1>&2 ;; esac # linkmode continue ;; # -L -R*) if test "$pass" = link; then dir=`$echo "X$deplib" | $Xsed -e 's/^-R//'` # Make sure the xrpath contains only unique directories. case "$xrpath " in *" $dir "*) ;; *) xrpath="$xrpath $dir" ;; esac fi deplibs="$deplib $deplibs" continue ;; *.la) lib="$deplib" ;; *.$libext) if test "$pass" = conv; then deplibs="$deplib $deplibs" continue fi case $linkmode in lib) valid_a_lib=no case $deplibs_check_method in match_pattern*) set dummy $deplibs_check_method match_pattern_regex=`expr "$deplibs_check_method" : "$2 \(.*\)"` if eval $echo \"$deplib\" 2>/dev/null \ | $SED 10q \ | $EGREP "$match_pattern_regex" > /dev/null; then valid_a_lib=yes fi ;; pass_all) valid_a_lib=yes ;; esac if test "$valid_a_lib" != yes; then $echo $echo "*** Warning: Trying to link with static lib archive $deplib." $echo "*** I have the capability to make that library automatically link in when" $echo "*** you link to this library. But I can only do this if you have a" $echo "*** shared version of the library, which you do not appear to have" $echo "*** because the file extensions .$libext of this argument makes me believe" $echo "*** that it is just a static archive that I should not used here." else $echo $echo "*** Warning: Linking the shared library $output against the" $echo "*** static library $deplib is not portable!" deplibs="$deplib $deplibs" fi continue ;; prog) if test "$pass" != link; then deplibs="$deplib $deplibs" else compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" fi continue ;; esac # linkmode ;; # *.$libext *.lo | *.$objext) if test "$pass" = conv; then deplibs="$deplib $deplibs" elif test "$linkmode" = prog; then if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then # If there is no dlopen support or we're linking statically, # we need to preload. newdlprefiles="$newdlprefiles $deplib" compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else newdlfiles="$newdlfiles $deplib" fi fi continue ;; %DEPLIBS%) alldeplibs=yes continue ;; esac # case $deplib if test "$found" = yes || test -f "$lib"; then : else $echo "$modename: cannot find the library \`$lib' or unhandled argument \`$deplib'" 1>&2 exit $EXIT_FAILURE fi # Check to see that this really is a libtool archive. if (${SED} -e '2q' $lib | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : else $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 exit $EXIT_FAILURE fi ladir=`$echo "X$lib" | $Xsed -e 's%/[^/]*$%%'` test "X$ladir" = "X$lib" && ladir="." dlname= dlopen= dlpreopen= libdir= library_names= old_library= # If the library was installed with an old release of libtool, # it will not redefine variables installed, or shouldnotlink installed=yes shouldnotlink=no avoidtemprpath= # Read the .la file case $lib in */* | *\\*) . $lib ;; *) . ./$lib ;; esac if test "$linkmode,$pass" = "lib,link" || test "$linkmode,$pass" = "prog,scan" || { test "$linkmode" != prog && test "$linkmode" != lib; }; then test -n "$dlopen" && dlfiles="$dlfiles $dlopen" test -n "$dlpreopen" && dlprefiles="$dlprefiles $dlpreopen" fi if test "$pass" = conv; then # Only check for convenience libraries deplibs="$lib $deplibs" if test -z "$libdir"; then if test -z "$old_library"; then $echo "$modename: cannot find name of link library for \`$lib'" 1>&2 exit $EXIT_FAILURE fi # It is a libtool convenience library, so add in its objects. convenience="$convenience $ladir/$objdir/$old_library" old_convenience="$old_convenience $ladir/$objdir/$old_library" tmp_libs= for deplib in $dependency_libs; do deplibs="$deplib $deplibs" if test "X$duplicate_deps" = "Xyes" ; then case "$tmp_libs " in *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; esac fi tmp_libs="$tmp_libs $deplib" done elif test "$linkmode" != prog && test "$linkmode" != lib; then $echo "$modename: \`$lib' is not a convenience library" 1>&2 exit $EXIT_FAILURE fi continue fi # $pass = conv # Get the name of the library we link against. linklib= for l in $old_library $library_names; do linklib="$l" done if test -z "$linklib"; then $echo "$modename: cannot find name of link library for \`$lib'" 1>&2 exit $EXIT_FAILURE fi # This library was specified with -dlopen. if test "$pass" = dlopen; then if test -z "$libdir"; then $echo "$modename: cannot -dlopen a convenience library: \`$lib'" 1>&2 exit $EXIT_FAILURE fi if test -z "$dlname" || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then # If there is no dlname, no dlopen support or we're linking # statically, we need to preload. We also need to preload any # dependent libraries so libltdl's deplib preloader doesn't # bomb out in the load deplibs phase. dlprefiles="$dlprefiles $lib $dependency_libs" else newdlfiles="$newdlfiles $lib" fi continue fi # $pass = dlopen # We need an absolute path. case $ladir in [\\/]* | [A-Za-z]:[\\/]*) abs_ladir="$ladir" ;; *) abs_ladir=`cd "$ladir" && pwd` if test -z "$abs_ladir"; then $echo "$modename: warning: cannot determine absolute directory name of \`$ladir'" 1>&2 $echo "$modename: passing it literally to the linker, although it might fail" 1>&2 abs_ladir="$ladir" fi ;; esac laname=`$echo "X$lib" | $Xsed -e 's%^.*/%%'` # Find the relevant object directory and library name. if test "X$installed" = Xyes; then if test ! -f "$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then $echo "$modename: warning: library \`$lib' was moved." 1>&2 dir="$ladir" absdir="$abs_ladir" libdir="$abs_ladir" else dir="$libdir" absdir="$libdir" fi test "X$hardcode_automatic" = Xyes && avoidtemprpath=yes else if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then dir="$ladir" absdir="$abs_ladir" # Remove this search path later notinst_path="$notinst_path $abs_ladir" else dir="$ladir/$objdir" absdir="$abs_ladir/$objdir" # Remove this search path later notinst_path="$notinst_path $abs_ladir" fi fi # $installed = yes name=`$echo "X$laname" | $Xsed -e 's/\.la$//' -e 's/^lib//'` # This library was specified with -dlpreopen. if test "$pass" = dlpreopen; then if test -z "$libdir"; then $echo "$modename: cannot -dlpreopen a convenience library: \`$lib'" 1>&2 exit $EXIT_FAILURE fi # Prefer using a static library (so that no silly _DYNAMIC symbols # are required to link). if test -n "$old_library"; then newdlprefiles="$newdlprefiles $dir/$old_library" # Otherwise, use the dlname, so that lt_dlopen finds it. elif test -n "$dlname"; then newdlprefiles="$newdlprefiles $dir/$dlname" else newdlprefiles="$newdlprefiles $dir/$linklib" fi fi # $pass = dlpreopen if test -z "$libdir"; then # Link the convenience library if test "$linkmode" = lib; then deplibs="$dir/$old_library $deplibs" elif test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$dir/$old_library $compile_deplibs" finalize_deplibs="$dir/$old_library $finalize_deplibs" else deplibs="$lib $deplibs" # used for prog,scan pass fi continue fi if test "$linkmode" = prog && test "$pass" != link; then newlib_search_path="$newlib_search_path $ladir" deplibs="$lib $deplibs" linkalldeplibs=no if test "$link_all_deplibs" != no || test -z "$library_names" || test "$build_libtool_libs" = no; then linkalldeplibs=yes fi tmp_libs= for deplib in $dependency_libs; do case $deplib in -L*) newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'`;; ### testsuite: skip nested quoting test esac # Need to link against all dependency_libs? if test "$linkalldeplibs" = yes; then deplibs="$deplib $deplibs" else # Need to hardcode shared library paths # or/and link against static libraries newdependency_libs="$deplib $newdependency_libs" fi if test "X$duplicate_deps" = "Xyes" ; then case "$tmp_libs " in *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; esac fi tmp_libs="$tmp_libs $deplib" done # for deplib continue fi # $linkmode = prog... if test "$linkmode,$pass" = "prog,link"; then if test -n "$library_names" && { { test "$prefer_static_libs" = no || test "$prefer_static_libs,$installed" = "built,yes"; } || test -z "$old_library"; }; then # We need to hardcode the library path if test -n "$shlibpath_var" && test -z "$avoidtemprpath" ; then # Make sure the rpath contains only unique directories. case "$temp_rpath " in *" $dir "*) ;; *" $absdir "*) ;; *) temp_rpath="$temp_rpath $absdir" ;; esac fi # Hardcode the library path. # Skip directories that are in the system default run-time # search path. case " $sys_lib_dlsearch_path " in *" $absdir "*) ;; *) case "$compile_rpath " in *" $absdir "*) ;; *) compile_rpath="$compile_rpath $absdir" esac ;; esac case " $sys_lib_dlsearch_path " in *" $libdir "*) ;; *) case "$finalize_rpath " in *" $libdir "*) ;; *) finalize_rpath="$finalize_rpath $libdir" esac ;; esac fi # $linkmode,$pass = prog,link... if test "$alldeplibs" = yes && { test "$deplibs_check_method" = pass_all || { test "$build_libtool_libs" = yes && test -n "$library_names"; }; }; then # We only need to search for static libraries continue fi fi link_static=no # Whether the deplib will be linked statically use_static_libs=$prefer_static_libs if test "$use_static_libs" = built && test "$installed" = yes ; then use_static_libs=no fi if test -n "$library_names" && { test "$use_static_libs" = no || test -z "$old_library"; }; then if test "$installed" = no; then notinst_deplibs="$notinst_deplibs $lib" need_relink=yes fi # This is a shared library # Warn about portability, can't link against -module's on # some systems (darwin) if test "$shouldnotlink" = yes && test "$pass" = link ; then $echo if test "$linkmode" = prog; then $echo "*** Warning: Linking the executable $output against the loadable module" else $echo "*** Warning: Linking the shared library $output against the loadable module" fi $echo "*** $linklib is not portable!" fi if test "$linkmode" = lib && test "$hardcode_into_libs" = yes; then # Hardcode the library path. # Skip directories that are in the system default run-time # search path. case " $sys_lib_dlsearch_path " in *" $absdir "*) ;; *) case "$compile_rpath " in *" $absdir "*) ;; *) compile_rpath="$compile_rpath $absdir" esac ;; esac case " $sys_lib_dlsearch_path " in *" $libdir "*) ;; *) case "$finalize_rpath " in *" $libdir "*) ;; *) finalize_rpath="$finalize_rpath $libdir" esac ;; esac fi if test -n "$old_archive_from_expsyms_cmds"; then # figure out the soname set dummy $library_names realname="$2" shift; shift libname=`eval \\$echo \"$libname_spec\"` # use dlname if we got it. it's perfectly good, no? if test -n "$dlname"; then soname="$dlname" elif test -n "$soname_spec"; then # bleh windows case $host in *cygwin* | mingw*) major=`expr $current - $age` versuffix="-$major" ;; esac eval soname=\"$soname_spec\" else soname="$realname" fi # Make a new name for the extract_expsyms_cmds to use soroot="$soname" soname=`$echo $soroot | ${SED} -e 's/^.*\///'` newlib="libimp-`$echo $soname | ${SED} 's/^lib//;s/\.dll$//'`.a" # If the library has no export list, then create one now if test -f "$output_objdir/$soname-def"; then : else $show "extracting exported symbol list from \`$soname'" save_ifs="$IFS"; IFS='~' cmds=$extract_expsyms_cmds for cmd in $cmds; do IFS="$save_ifs" eval cmd=\"$cmd\" $show "$cmd" $run eval "$cmd" || exit $? done IFS="$save_ifs" fi # Create $newlib if test -f "$output_objdir/$newlib"; then :; else $show "generating import library for \`$soname'" save_ifs="$IFS"; IFS='~' cmds=$old_archive_from_expsyms_cmds for cmd in $cmds; do IFS="$save_ifs" eval cmd=\"$cmd\" $show "$cmd" $run eval "$cmd" || exit $? done IFS="$save_ifs" fi # make sure the library variables are pointing to the new library dir=$output_objdir linklib=$newlib fi # test -n "$old_archive_from_expsyms_cmds" if test "$linkmode" = prog || test "$mode" != relink; then add_shlibpath= add_dir= add= lib_linked=yes case $hardcode_action in immediate | unsupported) if test "$hardcode_direct" = no; then add="$dir/$linklib" case $host in *-*-sco3.2v5.0.[024]*) add_dir="-L$dir" ;; *-*-sysv4*uw2*) add_dir="-L$dir" ;; *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \ *-*-unixware7*) add_dir="-L$dir" ;; *-*-darwin* ) # if the lib is a module then we can not link against # it, someone is ignoring the new warnings I added if /usr/bin/file -L $add 2> /dev/null | $EGREP ": [^:]* bundle" >/dev/null ; then $echo "** Warning, lib $linklib is a module, not a shared library" if test -z "$old_library" ; then $echo $echo "** And there doesn't seem to be a static archive available" $echo "** The link will probably fail, sorry" else add="$dir/$old_library" fi fi esac elif test "$hardcode_minus_L" = no; then case $host in *-*-sunos*) add_shlibpath="$dir" ;; esac add_dir="-L$dir" add="-l$name" elif test "$hardcode_shlibpath_var" = no; then add_shlibpath="$dir" add="-l$name" else lib_linked=no fi ;; relink) if test "$hardcode_direct" = yes; then add="$dir/$linklib" elif test "$hardcode_minus_L" = yes; then add_dir="-L$dir" # Try looking first in the location we're being installed to. if test -n "$inst_prefix_dir"; then case $libdir in [\\/]*) add_dir="$add_dir -L$inst_prefix_dir$libdir" ;; esac fi add="-l$name" elif test "$hardcode_shlibpath_var" = yes; then add_shlibpath="$dir" add="-l$name" else lib_linked=no fi ;; *) lib_linked=no ;; esac if test "$lib_linked" != yes; then $echo "$modename: configuration error: unsupported hardcode properties" exit $EXIT_FAILURE fi if test -n "$add_shlibpath"; then case :$compile_shlibpath: in *":$add_shlibpath:"*) ;; *) compile_shlibpath="$compile_shlibpath$add_shlibpath:" ;; esac fi if test "$linkmode" = prog; then test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs" test -n "$add" && compile_deplibs="$add $compile_deplibs" else test -n "$add_dir" && deplibs="$add_dir $deplibs" test -n "$add" && deplibs="$add $deplibs" if test "$hardcode_direct" != yes && \ test "$hardcode_minus_L" != yes && \ test "$hardcode_shlibpath_var" = yes; then case :$finalize_shlibpath: in *":$libdir:"*) ;; *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;; esac fi fi fi if test "$linkmode" = prog || test "$mode" = relink; then add_shlibpath= add_dir= add= # Finalize command for both is simple: just hardcode it. if test "$hardcode_direct" = yes; then add="$libdir/$linklib" elif test "$hardcode_minus_L" = yes; then add_dir="-L$libdir" add="-l$name" elif test "$hardcode_shlibpath_var" = yes; then case :$finalize_shlibpath: in *":$libdir:"*) ;; *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;; esac add="-l$name" elif test "$hardcode_automatic" = yes; then if test -n "$inst_prefix_dir" && test -f "$inst_prefix_dir$libdir/$linklib" ; then add="$inst_prefix_dir$libdir/$linklib" else add="$libdir/$linklib" fi else # We cannot seem to hardcode it, guess we'll fake it. add_dir="-L$libdir" # Try looking first in the location we're being installed to. if test -n "$inst_prefix_dir"; then case $libdir in [\\/]*) add_dir="$add_dir -L$inst_prefix_dir$libdir" ;; esac fi add="-l$name" fi if test "$linkmode" = prog; then test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs" test -n "$add" && finalize_deplibs="$add $finalize_deplibs" else test -n "$add_dir" && deplibs="$add_dir $deplibs" test -n "$add" && deplibs="$add $deplibs" fi fi elif test "$linkmode" = prog; then # Here we assume that one of hardcode_direct or hardcode_minus_L # is not unsupported. This is valid on all known static and # shared platforms. if test "$hardcode_direct" != unsupported; then test -n "$old_library" && linklib="$old_library" compile_deplibs="$dir/$linklib $compile_deplibs" finalize_deplibs="$dir/$linklib $finalize_deplibs" else compile_deplibs="-l$name -L$dir $compile_deplibs" finalize_deplibs="-l$name -L$dir $finalize_deplibs" fi elif test "$build_libtool_libs" = yes; then # Not a shared library if test "$deplibs_check_method" != pass_all; then # We're trying link a shared library against a static one # but the system doesn't support it. # Just print a warning and add the library to dependency_libs so # that the program can be linked against the static library. $echo $echo "*** Warning: This system can not link to static lib archive $lib." $echo "*** I have the capability to make that library automatically link in when" $echo "*** you link to this library. But I can only do this if you have a" $echo "*** shared version of the library, which you do not appear to have." if test "$module" = yes; then $echo "*** But as you try to build a module library, libtool will still create " $echo "*** a static module, that should work as long as the dlopening application" $echo "*** is linked with the -dlopen flag to resolve symbols at runtime." if test -z "$global_symbol_pipe"; then $echo $echo "*** However, this would only work if libtool was able to extract symbol" $echo "*** lists from a program, using \`nm' or equivalent, but libtool could" $echo "*** not find such a program. So, this module is probably useless." $echo "*** \`nm' from GNU binutils and a full rebuild may help." fi if test "$build_old_libs" = no; then build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi fi else deplibs="$dir/$old_library $deplibs" link_static=yes fi fi # link shared/static library? if test "$linkmode" = lib; then if test -n "$dependency_libs" && { test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes || test "$link_static" = yes; }; then # Extract -R from dependency_libs temp_deplibs= for libdir in $dependency_libs; do case $libdir in -R*) temp_xrpath=`$echo "X$libdir" | $Xsed -e 's/^-R//'` case " $xrpath " in *" $temp_xrpath "*) ;; *) xrpath="$xrpath $temp_xrpath";; esac;; *) temp_deplibs="$temp_deplibs $libdir";; esac done dependency_libs="$temp_deplibs" fi newlib_search_path="$newlib_search_path $absdir" # Link against this library test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs" # ... and its dependency_libs tmp_libs= for deplib in $dependency_libs; do newdependency_libs="$deplib $newdependency_libs" if test "X$duplicate_deps" = "Xyes" ; then case "$tmp_libs " in *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; esac fi tmp_libs="$tmp_libs $deplib" done if test "$link_all_deplibs" != no; then # Add the search paths of all dependency libraries for deplib in $dependency_libs; do case $deplib in -L*) path="$deplib" ;; *.la) dir=`$echo "X$deplib" | $Xsed -e 's%/[^/]*$%%'` test "X$dir" = "X$deplib" && dir="." # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;; *) absdir=`cd "$dir" && pwd` if test -z "$absdir"; then $echo "$modename: warning: cannot determine absolute directory name of \`$dir'" 1>&2 absdir="$dir" fi ;; esac if grep "^installed=no" $deplib > /dev/null; then path="$absdir/$objdir" else eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` if test -z "$libdir"; then $echo "$modename: \`$deplib' is not a valid libtool archive" 1>&2 exit $EXIT_FAILURE fi if test "$absdir" != "$libdir"; then $echo "$modename: warning: \`$deplib' seems to be moved" 1>&2 fi path="$absdir" fi depdepl= case $host in *-*-darwin*) # we do not want to link against static libs, # but need to link against shared eval deplibrary_names=`${SED} -n -e 's/^library_names=\(.*\)$/\1/p' $deplib` eval deplibdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` if test -n "$deplibrary_names" ; then for tmp in $deplibrary_names ; do depdepl=$tmp done if test -f "$deplibdir/$depdepl" ; then depdepl="$deplibdir/$depdepl" elif test -f "$path/$depdepl" ; then depdepl="$path/$depdepl" else # Can't find it, oh well... depdepl= fi # do not add paths which are already there case " $newlib_search_path " in *" $path "*) ;; *) newlib_search_path="$newlib_search_path $path";; esac fi path="" ;; *) path="-L$path" ;; esac ;; -l*) case $host in *-*-darwin*) # Again, we only want to link against shared libraries eval tmp_libs=`$echo "X$deplib" | $Xsed -e "s,^\-l,,"` for tmp in $newlib_search_path ; do if test -f "$tmp/lib$tmp_libs.dylib" ; then eval depdepl="$tmp/lib$tmp_libs.dylib" break fi done path="" ;; *) continue ;; esac ;; *) continue ;; esac case " $deplibs " in *" $path "*) ;; *) deplibs="$path $deplibs" ;; esac case " $deplibs " in *" $depdepl "*) ;; *) deplibs="$depdepl $deplibs" ;; esac done fi # link_all_deplibs != no fi # linkmode = lib done # for deplib in $libs dependency_libs="$newdependency_libs" if test "$pass" = dlpreopen; then # Link the dlpreopened libraries before other libraries for deplib in $save_deplibs; do deplibs="$deplib $deplibs" done fi if test "$pass" != dlopen; then if test "$pass" != conv; then # Make sure lib_search_path contains only unique directories. lib_search_path= for dir in $newlib_search_path; do case "$lib_search_path " in *" $dir "*) ;; *) lib_search_path="$lib_search_path $dir" ;; esac done newlib_search_path= fi if test "$linkmode,$pass" != "prog,link"; then vars="deplibs" else vars="compile_deplibs finalize_deplibs" fi for var in $vars dependency_libs; do # Add libraries to $var in reverse order eval tmp_libs=\"\$$var\" new_libs= for deplib in $tmp_libs; do # FIXME: Pedantically, this is the right thing to do, so # that some nasty dependency loop isn't accidentally # broken: #new_libs="$deplib $new_libs" # Pragmatically, this seems to cause very few problems in # practice: case $deplib in -L*) new_libs="$deplib $new_libs" ;; -R*) ;; *) # And here is the reason: when a library appears more # than once as an explicit dependence of a library, or # is implicitly linked in more than once by the # compiler, it is considered special, and multiple # occurrences thereof are not removed. Compare this # with having the same library being listed as a # dependency of multiple other libraries: in this case, # we know (pedantically, we assume) the library does not # need to be listed more than once, so we keep only the # last copy. This is not always right, but it is rare # enough that we require users that really mean to play # such unportable linking tricks to link the library # using -Wl,-lname, so that libtool does not consider it # for duplicate removal. case " $specialdeplibs " in *" $deplib "*) new_libs="$deplib $new_libs" ;; *) case " $new_libs " in *" $deplib "*) ;; *) new_libs="$deplib $new_libs" ;; esac ;; esac ;; esac done tmp_libs= for deplib in $new_libs; do case $deplib in -L*) case " $tmp_libs " in *" $deplib "*) ;; *) tmp_libs="$tmp_libs $deplib" ;; esac ;; *) tmp_libs="$tmp_libs $deplib" ;; esac done eval $var=\"$tmp_libs\" done # for var fi # Last step: remove runtime libs from dependency_libs # (they stay in deplibs) tmp_libs= for i in $dependency_libs ; do case " $predeps $postdeps $compiler_lib_search_path " in *" $i "*) i="" ;; esac if test -n "$i" ; then tmp_libs="$tmp_libs $i" fi done dependency_libs=$tmp_libs done # for pass if test "$linkmode" = prog; then dlfiles="$newdlfiles" dlprefiles="$newdlprefiles" fi case $linkmode in oldlib) case " $deplibs" in *\ -l* | *\ -L*) $echo "$modename: warning: \`-l' and \`-L' are ignored for archives" 1>&2 ;; esac if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then $echo "$modename: warning: \`-dlopen' is ignored for archives" 1>&2 fi if test -n "$rpath"; then $echo "$modename: warning: \`-rpath' is ignored for archives" 1>&2 fi if test -n "$xrpath"; then $echo "$modename: warning: \`-R' is ignored for archives" 1>&2 fi if test -n "$vinfo"; then $echo "$modename: warning: \`-version-info/-version-number' is ignored for archives" 1>&2 fi if test -n "$release"; then $echo "$modename: warning: \`-release' is ignored for archives" 1>&2 fi if test -n "$export_symbols" || test -n "$export_symbols_regex"; then $echo "$modename: warning: \`-export-symbols' is ignored for archives" 1>&2 fi # Now set the variables for building old libraries. build_libtool_libs=no oldlibs="$output" objs="$objs$old_deplibs" ;; lib) # Make sure we only generate libraries of the form `libNAME.la'. case $outputname in lib*) name=`$echo "X$outputname" | $Xsed -e 's/\.la$//' -e 's/^lib//'` eval shared_ext=\"$shrext_cmds\" eval libname=\"$libname_spec\" ;; *) if test "$module" = no; then $echo "$modename: libtool library \`$output' must begin with \`lib'" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE fi if test "$need_lib_prefix" != no; then # Add the "lib" prefix for modules if required name=`$echo "X$outputname" | $Xsed -e 's/\.la$//'` eval shared_ext=\"$shrext_cmds\" eval libname=\"$libname_spec\" else libname=`$echo "X$outputname" | $Xsed -e 's/\.la$//'` fi ;; esac if test -n "$objs"; then if test "$deplibs_check_method" != pass_all; then $echo "$modename: cannot build libtool library \`$output' from non-libtool objects on this host:$objs" 2>&1 exit $EXIT_FAILURE else $echo $echo "*** Warning: Linking the shared library $output against the non-libtool" $echo "*** objects $objs is not portable!" libobjs="$libobjs $objs" fi fi if test "$dlself" != no; then $echo "$modename: warning: \`-dlopen self' is ignored for libtool libraries" 1>&2 fi set dummy $rpath if test "$#" -gt 2; then $echo "$modename: warning: ignoring multiple \`-rpath's for a libtool library" 1>&2 fi install_libdir="$2" oldlibs= if test -z "$rpath"; then if test "$build_libtool_libs" = yes; then # Building a libtool convenience library. # Some compilers have problems with a `.al' extension so # convenience libraries should have the same extension an # archive normally would. oldlibs="$output_objdir/$libname.$libext $oldlibs" build_libtool_libs=convenience build_old_libs=yes fi if test -n "$vinfo"; then $echo "$modename: warning: \`-version-info/-version-number' is ignored for convenience libraries" 1>&2 fi if test -n "$release"; then $echo "$modename: warning: \`-release' is ignored for convenience libraries" 1>&2 fi else # Parse the version information argument. save_ifs="$IFS"; IFS=':' set dummy $vinfo 0 0 0 IFS="$save_ifs" if test -n "$8"; then $echo "$modename: too many parameters to \`-version-info'" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE fi # convert absolute version numbers to libtool ages # this retains compatibility with .la files and attempts # to make the code below a bit more comprehensible case $vinfo_number in yes) number_major="$2" number_minor="$3" number_revision="$4" # # There are really only two kinds -- those that # use the current revision as the major version # and those that subtract age and use age as # a minor version. But, then there is irix # which has an extra 1 added just for fun # case $version_type in darwin|linux|osf|windows|none) current=`expr $number_major + $number_minor` age="$number_minor" revision="$number_revision" ;; freebsd-aout|freebsd-elf|sunos) current="$number_major" revision="$number_minor" age="0" ;; irix|nonstopux) current=`expr $number_major + $number_minor` age="$number_minor" revision="$number_minor" lt_irix_increment=no ;; esac ;; no) current="$2" revision="$3" age="$4" ;; esac # Check that each of the things are valid numbers. case $current in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) $echo "$modename: CURRENT \`$current' must be a nonnegative integer" 1>&2 $echo "$modename: \`$vinfo' is not valid version information" 1>&2 exit $EXIT_FAILURE ;; esac case $revision in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) $echo "$modename: REVISION \`$revision' must be a nonnegative integer" 1>&2 $echo "$modename: \`$vinfo' is not valid version information" 1>&2 exit $EXIT_FAILURE ;; esac case $age in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) $echo "$modename: AGE \`$age' must be a nonnegative integer" 1>&2 $echo "$modename: \`$vinfo' is not valid version information" 1>&2 exit $EXIT_FAILURE ;; esac if test "$age" -gt "$current"; then $echo "$modename: AGE \`$age' is greater than the current interface number \`$current'" 1>&2 $echo "$modename: \`$vinfo' is not valid version information" 1>&2 exit $EXIT_FAILURE fi # Calculate the version variables. major= versuffix= verstring= case $version_type in none) ;; darwin) # Like Linux, but with the current version available in # verstring for coding it into the library header major=.`expr $current - $age` versuffix="$major.$age.$revision" # Darwin ld doesn't like 0 for these options... minor_current=`expr $current + 1` xlcverstring="${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision" verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" ;; freebsd-aout) major=".$current" versuffix=".$current.$revision"; ;; freebsd-elf) major=".$current" versuffix=".$current"; ;; irix | nonstopux) if test "X$lt_irix_increment" = "Xno"; then major=`expr $current - $age` else major=`expr $current - $age + 1` fi case $version_type in nonstopux) verstring_prefix=nonstopux ;; *) verstring_prefix=sgi ;; esac verstring="$verstring_prefix$major.$revision" # Add in all the interfaces that we are compatible with. loop=$revision while test "$loop" -ne 0; do iface=`expr $revision - $loop` loop=`expr $loop - 1` verstring="$verstring_prefix$major.$iface:$verstring" done # Before this point, $major must not contain `.'. major=.$major versuffix="$major.$revision" ;; linux) major=.`expr $current - $age` versuffix="$major.$age.$revision" ;; osf) major=.`expr $current - $age` versuffix=".$current.$age.$revision" verstring="$current.$age.$revision" # Add in all the interfaces that we are compatible with. loop=$age while test "$loop" -ne 0; do iface=`expr $current - $loop` loop=`expr $loop - 1` verstring="$verstring:${iface}.0" done # Make executables depend on our current version. verstring="$verstring:${current}.0" ;; sunos) major=".$current" versuffix=".$current.$revision" ;; windows) # Use '-' rather than '.', since we only want one # extension on DOS 8.3 filesystems. major=`expr $current - $age` versuffix="-$major" ;; *) $echo "$modename: unknown library version type \`$version_type'" 1>&2 $echo "Fatal configuration error. See the $PACKAGE docs for more information." 1>&2 exit $EXIT_FAILURE ;; esac # Clear the version info if we defaulted, and they specified a release. if test -z "$vinfo" && test -n "$release"; then major= case $version_type in darwin) # we can't check for "0.0" in archive_cmds due to quoting # problems, so we reset it completely verstring= ;; *) verstring="0.0" ;; esac if test "$need_version" = no; then versuffix= else versuffix=".0.0" fi fi # Remove version info from name if versioning should be avoided if test "$avoid_version" = yes && test "$need_version" = no; then major= versuffix= verstring="" fi # Check to see if the archive will have undefined symbols. if test "$allow_undefined" = yes; then if test "$allow_undefined_flag" = unsupported; then $echo "$modename: warning: undefined symbols not allowed in $host shared libraries" 1>&2 build_libtool_libs=no build_old_libs=yes fi else # Don't allow undefined symbols. allow_undefined_flag="$no_undefined_flag" fi fi if test "$mode" != relink; then # Remove our outputs, but don't remove object files since they # may have been created when compiling PIC objects. removelist= tempremovelist=`$echo "$output_objdir/*"` for p in $tempremovelist; do case $p in *.$objext) ;; $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*) if test "X$precious_files_regex" != "X"; then if echo $p | $EGREP -e "$precious_files_regex" >/dev/null 2>&1 then continue fi fi removelist="$removelist $p" ;; *) ;; esac done if test -n "$removelist"; then $show "${rm}r $removelist" $run ${rm}r $removelist fi fi # Now set the variables for building old libraries. if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then oldlibs="$oldlibs $output_objdir/$libname.$libext" # Transform .lo files to .o files. oldobjs="$objs "`$echo "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}'$/d' -e "$lo2o" | $NL2SP` fi # Eliminate all temporary directories. #for path in $notinst_path; do # lib_search_path=`$echo "$lib_search_path " | ${SED} -e "s% $path % %g"` # deplibs=`$echo "$deplibs " | ${SED} -e "s% -L$path % %g"` # dependency_libs=`$echo "$dependency_libs " | ${SED} -e "s% -L$path % %g"` #done if test -n "$xrpath"; then # If the user specified any rpath flags, then add them. temp_xrpath= for libdir in $xrpath; do temp_xrpath="$temp_xrpath -R$libdir" case "$finalize_rpath " in *" $libdir "*) ;; *) finalize_rpath="$finalize_rpath $libdir" ;; esac done if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; then dependency_libs="$temp_xrpath $dependency_libs" fi fi # Make sure dlfiles contains only unique files that won't be dlpreopened old_dlfiles="$dlfiles" dlfiles= for lib in $old_dlfiles; do case " $dlprefiles $dlfiles " in *" $lib "*) ;; *) dlfiles="$dlfiles $lib" ;; esac done # Make sure dlprefiles contains only unique files old_dlprefiles="$dlprefiles" dlprefiles= for lib in $old_dlprefiles; do case "$dlprefiles " in *" $lib "*) ;; *) dlprefiles="$dlprefiles $lib" ;; esac done if test "$build_libtool_libs" = yes; then if test -n "$rpath"; then case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos*) # these systems don't actually have a c library (as such)! ;; *-*-rhapsody* | *-*-darwin1.[012]) # Rhapsody C library is in the System framework deplibs="$deplibs -framework System" ;; *-*-netbsd*) # Don't link with libc until the a.out ld.so is fixed. ;; *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) # Do not include libc due to us having libc/libc_r. ;; *-*-sco3.2v5* | *-*-sco5v6*) # Causes problems with __ctype ;; *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) # Compiler inserts libc in the correct place for threads to work ;; *) # Add libc to deplibs on all other systems if necessary. if test "$build_libtool_need_lc" = "yes"; then deplibs="$deplibs -lc" fi ;; esac fi # Transform deplibs into only deplibs that can be linked in shared. name_save=$name libname_save=$libname release_save=$release versuffix_save=$versuffix major_save=$major # I'm not sure if I'm treating the release correctly. I think # release should show up in the -l (ie -lgmp5) so we don't want to # add it in twice. Is that correct? release="" versuffix="" major="" newdeplibs= droppeddeps=no case $deplibs_check_method in pass_all) # Don't check for shared/static. Everything works. # This might be a little naive. We might want to check # whether the library exists or not. But this is on # osf3 & osf4 and I'm not really sure... Just # implementing what was already the behavior. newdeplibs=$deplibs ;; test_compile) # This code stresses the "libraries are programs" paradigm to its # limits. Maybe even breaks it. We compile a program, linking it # against the deplibs as a proxy for the library. Then we can check # whether they linked in statically or dynamically with ldd. $rm conftest.c cat > conftest.c </dev/null` for potent_lib in $potential_libs; do # Follow soft links. if ls -lLd "$potent_lib" 2>/dev/null \ | grep " -> " >/dev/null; then continue fi # The statement above tries to avoid entering an # endless loop below, in case of cyclic links. # We might still enter an endless loop, since a link # loop can be closed while we follow links, # but so what? potlib="$potent_lib" while test -h "$potlib" 2>/dev/null; do potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'` case $potliblink in [\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";; *) potlib=`$echo "X$potlib" | $Xsed -e 's,[^/]*$,,'`"$potliblink";; esac done if eval $file_magic_cmd \"\$potlib\" 2>/dev/null \ | ${SED} 10q \ | $EGREP "$file_magic_regex" > /dev/null; then newdeplibs="$newdeplibs $a_deplib" a_deplib="" break 2 fi done done fi if test -n "$a_deplib" ; then droppeddeps=yes $echo $echo "*** Warning: linker path does not have real file for library $a_deplib." $echo "*** I have the capability to make that library automatically link in when" $echo "*** you link to this library. But I can only do this if you have a" $echo "*** shared version of the library, which you do not appear to have" $echo "*** because I did check the linker path looking for a file starting" if test -z "$potlib" ; then $echo "*** with $libname but no candidates were found. (...for file magic test)" else $echo "*** with $libname and none of the candidates passed a file format test" $echo "*** using a file magic. Last file checked: $potlib" fi fi else # Add a -L argument. newdeplibs="$newdeplibs $a_deplib" fi done # Gone through all deplibs. ;; match_pattern*) set dummy $deplibs_check_method match_pattern_regex=`expr "$deplibs_check_method" : "$2 \(.*\)"` for a_deplib in $deplibs; do name=`expr $a_deplib : '-l\(.*\)'` # If $name is empty we are operating on a -L argument. if test -n "$name" && test "$name" != "0"; then if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then case " $predeps $postdeps " in *" $a_deplib "*) newdeplibs="$newdeplibs $a_deplib" a_deplib="" ;; esac fi if test -n "$a_deplib" ; then libname=`eval \\$echo \"$libname_spec\"` for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do potential_libs=`ls $i/$libname[.-]* 2>/dev/null` for potent_lib in $potential_libs; do potlib="$potent_lib" # see symlink-check above in file_magic test if eval $echo \"$potent_lib\" 2>/dev/null \ | ${SED} 10q \ | $EGREP "$match_pattern_regex" > /dev/null; then newdeplibs="$newdeplibs $a_deplib" a_deplib="" break 2 fi done done fi if test -n "$a_deplib" ; then droppeddeps=yes $echo $echo "*** Warning: linker path does not have real file for library $a_deplib." $echo "*** I have the capability to make that library automatically link in when" $echo "*** you link to this library. But I can only do this if you have a" $echo "*** shared version of the library, which you do not appear to have" $echo "*** because I did check the linker path looking for a file starting" if test -z "$potlib" ; then $echo "*** with $libname but no candidates were found. (...for regex pattern test)" else $echo "*** with $libname and none of the candidates passed a file format test" $echo "*** using a regex pattern. Last file checked: $potlib" fi fi else # Add a -L argument. newdeplibs="$newdeplibs $a_deplib" fi done # Gone through all deplibs. ;; none | unknown | *) newdeplibs="" tmp_deplibs=`$echo "X $deplibs" | $Xsed -e 's/ -lc$//' \ -e 's/ -[LR][^ ]*//g'` if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then for i in $predeps $postdeps ; do # can't use Xsed below, because $i might contain '/' tmp_deplibs=`$echo "X $tmp_deplibs" | ${SED} -e "1s,^X,," -e "s,$i,,"` done fi if $echo "X $tmp_deplibs" | $Xsed -e 's/[ ]//g' \ | grep . >/dev/null; then $echo if test "X$deplibs_check_method" = "Xnone"; then $echo "*** Warning: inter-library dependencies are not supported in this platform." else $echo "*** Warning: inter-library dependencies are not known to be supported." fi $echo "*** All declared inter-library dependencies are being dropped." droppeddeps=yes fi ;; esac versuffix=$versuffix_save major=$major_save release=$release_save libname=$libname_save name=$name_save case $host in *-*-rhapsody* | *-*-darwin1.[012]) # On Rhapsody replace the C library is the System framework newdeplibs=`$echo "X $newdeplibs" | $Xsed -e 's/ -lc / -framework System /'` ;; esac if test "$droppeddeps" = yes; then if test "$module" = yes; then $echo $echo "*** Warning: libtool could not satisfy all declared inter-library" $echo "*** dependencies of module $libname. Therefore, libtool will create" $echo "*** a static module, that should work as long as the dlopening" $echo "*** application is linked with the -dlopen flag." if test -z "$global_symbol_pipe"; then $echo $echo "*** However, this would only work if libtool was able to extract symbol" $echo "*** lists from a program, using \`nm' or equivalent, but libtool could" $echo "*** not find such a program. So, this module is probably useless." $echo "*** \`nm' from GNU binutils and a full rebuild may help." fi if test "$build_old_libs" = no; then oldlibs="$output_objdir/$libname.$libext" build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi else $echo "*** The inter-library dependencies that have been dropped here will be" $echo "*** automatically added whenever a program is linked with this library" $echo "*** or is declared to -dlopen it." if test "$allow_undefined" = no; then $echo $echo "*** Since this library must not contain undefined symbols," $echo "*** because either the platform does not support them or" $echo "*** it was explicitly requested with -no-undefined," $echo "*** libtool will only create a static version of it." if test "$build_old_libs" = no; then oldlibs="$output_objdir/$libname.$libext" build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi fi fi fi # Done checking deplibs! deplibs=$newdeplibs fi # move library search paths that coincide with paths to not yet # installed libraries to the beginning of the library search list new_libs= for path in $notinst_path; do case " $new_libs " in *" -L$path/$objdir "*) ;; *) case " $deplibs " in *" -L$path/$objdir "*) new_libs="$new_libs -L$path/$objdir" ;; esac ;; esac done for deplib in $deplibs; do case $deplib in -L*) case " $new_libs " in *" $deplib "*) ;; *) new_libs="$new_libs $deplib" ;; esac ;; *) new_libs="$new_libs $deplib" ;; esac done deplibs="$new_libs" # All the library-specific variables (install_libdir is set above). library_names= old_library= dlname= # Test again, we may have decided not to build it any more if test "$build_libtool_libs" = yes; then if test "$hardcode_into_libs" = yes; then # Hardcode the library paths hardcode_libdirs= dep_rpath= rpath="$finalize_rpath" test "$mode" != relink && rpath="$compile_rpath$rpath" for libdir in $rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then if test -z "$hardcode_libdirs"; then hardcode_libdirs="$libdir" else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" dep_rpath="$dep_rpath $flag" fi elif test -n "$runpath_var"; then case "$perm_rpath " in *" $libdir "*) ;; *) perm_rpath="$perm_rpath $libdir" ;; esac fi done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir="$hardcode_libdirs" if test -n "$hardcode_libdir_flag_spec_ld"; then case $archive_cmds in *\$LD*) eval dep_rpath=\"$hardcode_libdir_flag_spec_ld\" ;; *) eval dep_rpath=\"$hardcode_libdir_flag_spec\" ;; esac else eval dep_rpath=\"$hardcode_libdir_flag_spec\" fi fi if test -n "$runpath_var" && test -n "$perm_rpath"; then # We should set the runpath_var. rpath= for dir in $perm_rpath; do rpath="$rpath$dir:" done eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var" fi test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs" fi shlibpath="$finalize_shlibpath" test "$mode" != relink && shlibpath="$compile_shlibpath$shlibpath" if test -n "$shlibpath"; then eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var" fi # Get the real and link names of the library. eval shared_ext=\"$shrext_cmds\" eval library_names=\"$library_names_spec\" set dummy $library_names realname="$2" shift; shift if test -n "$soname_spec"; then eval soname=\"$soname_spec\" else soname="$realname" fi if test -z "$dlname"; then dlname=$soname fi lib="$output_objdir/$realname" linknames= for link do linknames="$linknames $link" done # Use standard objects if they are pic test -z "$pic_flag" && libobjs=`$echo "X$libobjs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` # Prepare the list of exported symbols if test -z "$export_symbols"; then if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then $show "generating symbol list for \`$libname.la'" export_symbols="$output_objdir/$libname.exp" $run $rm $export_symbols cmds=$export_symbols_cmds save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" eval cmd=\"$cmd\" if len=`expr "X$cmd" : ".*"` && test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then $show "$cmd" $run eval "$cmd" || exit $? skipped_export=false else # The command line is too long to execute in one step. $show "using reloadable object file for export list..." skipped_export=: # Break out early, otherwise skipped_export may be # set to false by a later but shorter cmd. break fi done IFS="$save_ifs" if test -n "$export_symbols_regex"; then $show "$EGREP -e \"$export_symbols_regex\" \"$export_symbols\" > \"${export_symbols}T\"" $run eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' $show "$mv \"${export_symbols}T\" \"$export_symbols\"" $run eval '$mv "${export_symbols}T" "$export_symbols"' fi fi fi if test -n "$export_symbols" && test -n "$include_expsyms"; then $run eval '$echo "X$include_expsyms" | $SP2NL >> "$export_symbols"' fi tmp_deplibs= for test_deplib in $deplibs; do case " $convenience " in *" $test_deplib "*) ;; *) tmp_deplibs="$tmp_deplibs $test_deplib" ;; esac done deplibs="$tmp_deplibs" if test -n "$convenience"; then if test -n "$whole_archive_flag_spec"; then save_libobjs=$libobjs eval libobjs=\"\$libobjs $whole_archive_flag_spec\" else gentop="$output_objdir/${outputname}x" generated="$generated $gentop" func_extract_archives $gentop $convenience libobjs="$libobjs $func_extract_archives_result" fi fi if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then eval flag=\"$thread_safe_flag_spec\" linker_flags="$linker_flags $flag" fi # Make a backup of the uninstalled library when relinking if test "$mode" = relink; then $run eval '(cd $output_objdir && $rm ${realname}U && $mv $realname ${realname}U)' || exit $? fi # Do each of the archive commands. if test "$module" = yes && test -n "$module_cmds" ; then if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then eval test_cmds=\"$module_expsym_cmds\" cmds=$module_expsym_cmds else eval test_cmds=\"$module_cmds\" cmds=$module_cmds fi else if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then eval test_cmds=\"$archive_expsym_cmds\" cmds=$archive_expsym_cmds else eval test_cmds=\"$archive_cmds\" cmds=$archive_cmds fi fi if test "X$skipped_export" != "X:" && len=`expr "X$test_cmds" : ".*" 2>/dev/null` && test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then : else # The command line is too long to link in one step, link piecewise. $echo "creating reloadable object files..." # Save the value of $output and $libobjs because we want to # use them later. If we have whole_archive_flag_spec, we # want to use save_libobjs as it was before # whole_archive_flag_spec was expanded, because we can't # assume the linker understands whole_archive_flag_spec. # This may have to be revisited, in case too many # convenience libraries get linked in and end up exceeding # the spec. if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then save_libobjs=$libobjs fi save_output=$output output_la=`$echo "X$output" | $Xsed -e "$basename"` # Clear the reloadable object creation command queue and # initialize k to one. test_cmds= concat_cmds= objlist= delfiles= last_robj= k=1 output=$output_objdir/$output_la-${k}.$objext # Loop over the list of objects to be linked. for obj in $save_libobjs do eval test_cmds=\"$reload_cmds $objlist $last_robj\" if test "X$objlist" = X || { len=`expr "X$test_cmds" : ".*" 2>/dev/null` && test "$len" -le "$max_cmd_len"; }; then objlist="$objlist $obj" else # The command $test_cmds is almost too long, add a # command to the queue. if test "$k" -eq 1 ; then # The first file doesn't have a previous command to add. eval concat_cmds=\"$reload_cmds $objlist $last_robj\" else # All subsequent reloadable object files will link in # the last one created. eval concat_cmds=\"\$concat_cmds~$reload_cmds $objlist $last_robj\" fi last_robj=$output_objdir/$output_la-${k}.$objext k=`expr $k + 1` output=$output_objdir/$output_la-${k}.$objext objlist=$obj len=1 fi done # Handle the remaining objects by creating one last # reloadable object file. All subsequent reloadable object # files will link in the last one created. test -z "$concat_cmds" || concat_cmds=$concat_cmds~ eval concat_cmds=\"\${concat_cmds}$reload_cmds $objlist $last_robj\" if ${skipped_export-false}; then $show "generating symbol list for \`$libname.la'" export_symbols="$output_objdir/$libname.exp" $run $rm $export_symbols libobjs=$output # Append the command to create the export file. eval concat_cmds=\"\$concat_cmds~$export_symbols_cmds\" fi # Set up a command to remove the reloadable object files # after they are used. i=0 while test "$i" -lt "$k" do i=`expr $i + 1` delfiles="$delfiles $output_objdir/$output_la-${i}.$objext" done $echo "creating a temporary reloadable object file: $output" # Loop through the commands generated above and execute them. save_ifs="$IFS"; IFS='~' for cmd in $concat_cmds; do IFS="$save_ifs" $show "$cmd" $run eval "$cmd" || exit $? done IFS="$save_ifs" libobjs=$output # Restore the value of output. output=$save_output if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then eval libobjs=\"\$libobjs $whole_archive_flag_spec\" fi # Expand the library linking commands again to reset the # value of $libobjs for piecewise linking. # Do each of the archive commands. if test "$module" = yes && test -n "$module_cmds" ; then if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then cmds=$module_expsym_cmds else cmds=$module_cmds fi else if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then cmds=$archive_expsym_cmds else cmds=$archive_cmds fi fi # Append the command to remove the reloadable object files # to the just-reset $cmds. eval cmds=\"\$cmds~\$rm $delfiles\" fi save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" eval cmd=\"$cmd\" $show "$cmd" $run eval "$cmd" || { lt_exit=$? # Restore the uninstalled library and exit if test "$mode" = relink; then $run eval '(cd $output_objdir && $rm ${realname}T && $mv ${realname}U $realname)' fi exit $lt_exit } done IFS="$save_ifs" # Restore the uninstalled library and exit if test "$mode" = relink; then $run eval '(cd $output_objdir && $rm ${realname}T && $mv $realname ${realname}T && $mv "$realname"U $realname)' || exit $? if test -n "$convenience"; then if test -z "$whole_archive_flag_spec"; then $show "${rm}r $gentop" $run ${rm}r "$gentop" fi fi exit $EXIT_SUCCESS fi # Create links to the real library. for linkname in $linknames; do if test "$realname" != "$linkname"; then $show "(cd $output_objdir && $rm $linkname && $LN_S $realname $linkname)" $run eval '(cd $output_objdir && $rm $linkname && $LN_S $realname $linkname)' || exit $? fi done # If -module or -export-dynamic was specified, set the dlname. if test "$module" = yes || test "$export_dynamic" = yes; then # On all known operating systems, these are identical. dlname="$soname" fi fi ;; obj) case " $deplibs" in *\ -l* | *\ -L*) $echo "$modename: warning: \`-l' and \`-L' are ignored for objects" 1>&2 ;; esac if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then $echo "$modename: warning: \`-dlopen' is ignored for objects" 1>&2 fi if test -n "$rpath"; then $echo "$modename: warning: \`-rpath' is ignored for objects" 1>&2 fi if test -n "$xrpath"; then $echo "$modename: warning: \`-R' is ignored for objects" 1>&2 fi if test -n "$vinfo"; then $echo "$modename: warning: \`-version-info' is ignored for objects" 1>&2 fi if test -n "$release"; then $echo "$modename: warning: \`-release' is ignored for objects" 1>&2 fi case $output in *.lo) if test -n "$objs$old_deplibs"; then $echo "$modename: cannot build library object \`$output' from non-libtool objects" 1>&2 exit $EXIT_FAILURE fi libobj="$output" obj=`$echo "X$output" | $Xsed -e "$lo2o"` ;; *) libobj= obj="$output" ;; esac # Delete the old objects. $run $rm $obj $libobj # Objects from convenience libraries. This assumes # single-version convenience libraries. Whenever we create # different ones for PIC/non-PIC, this we'll have to duplicate # the extraction. reload_conv_objs= gentop= # reload_cmds runs $LD directly, so let us get rid of # -Wl from whole_archive_flag_spec and hope we can get by with # turning comma into space.. wl= if test -n "$convenience"; then if test -n "$whole_archive_flag_spec"; then eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\" reload_conv_objs=$reload_objs\ `$echo "X$tmp_whole_archive_flags" | $Xsed -e 's|,| |g'` else gentop="$output_objdir/${obj}x" generated="$generated $gentop" func_extract_archives $gentop $convenience reload_conv_objs="$reload_objs $func_extract_archives_result" fi fi # Create the old-style object. reload_objs="$objs$old_deplibs "`$echo "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}$'/d' -e '/\.lib$/d' -e "$lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test output="$obj" cmds=$reload_cmds save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" eval cmd=\"$cmd\" $show "$cmd" $run eval "$cmd" || exit $? done IFS="$save_ifs" # Exit if we aren't doing a library object file. if test -z "$libobj"; then if test -n "$gentop"; then $show "${rm}r $gentop" $run ${rm}r $gentop fi exit $EXIT_SUCCESS fi if test "$build_libtool_libs" != yes; then if test -n "$gentop"; then $show "${rm}r $gentop" $run ${rm}r $gentop fi # Create an invalid libtool object if no PIC, so that we don't # accidentally link it into a program. # $show "echo timestamp > $libobj" # $run eval "echo timestamp > $libobj" || exit $? exit $EXIT_SUCCESS fi if test -n "$pic_flag" || test "$pic_mode" != default; then # Only do commands if we really have different PIC objects. reload_objs="$libobjs $reload_conv_objs" output="$libobj" cmds=$reload_cmds save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" eval cmd=\"$cmd\" $show "$cmd" $run eval "$cmd" || exit $? done IFS="$save_ifs" fi if test -n "$gentop"; then $show "${rm}r $gentop" $run ${rm}r $gentop fi exit $EXIT_SUCCESS ;; prog) case $host in *cygwin*) output=`$echo $output | ${SED} -e 's,.exe$,,;s,$,.exe,'` ;; esac if test -n "$vinfo"; then $echo "$modename: warning: \`-version-info' is ignored for programs" 1>&2 fi if test -n "$release"; then $echo "$modename: warning: \`-release' is ignored for programs" 1>&2 fi if test "$preload" = yes; then if test "$dlopen_support" = unknown && test "$dlopen_self" = unknown && test "$dlopen_self_static" = unknown; then $echo "$modename: warning: \`AC_LIBTOOL_DLOPEN' not used. Assuming no dlopen support." fi fi case $host in *-*-rhapsody* | *-*-darwin1.[012]) # On Rhapsody replace the C library is the System framework compile_deplibs=`$echo "X $compile_deplibs" | $Xsed -e 's/ -lc / -framework System /'` finalize_deplibs=`$echo "X $finalize_deplibs" | $Xsed -e 's/ -lc / -framework System /'` ;; esac case $host in *darwin*) # Don't allow lazy linking, it breaks C++ global constructors if test "$tagname" = CXX ; then compile_command="$compile_command ${wl}-bind_at_load" finalize_command="$finalize_command ${wl}-bind_at_load" fi ;; esac # move library search paths that coincide with paths to not yet # installed libraries to the beginning of the library search list new_libs= for path in $notinst_path; do case " $new_libs " in *" -L$path/$objdir "*) ;; *) case " $compile_deplibs " in *" -L$path/$objdir "*) new_libs="$new_libs -L$path/$objdir" ;; esac ;; esac done for deplib in $compile_deplibs; do case $deplib in -L*) case " $new_libs " in *" $deplib "*) ;; *) new_libs="$new_libs $deplib" ;; esac ;; *) new_libs="$new_libs $deplib" ;; esac done compile_deplibs="$new_libs" compile_command="$compile_command $compile_deplibs" finalize_command="$finalize_command $finalize_deplibs" if test -n "$rpath$xrpath"; then # If the user specified any rpath flags, then add them. for libdir in $rpath $xrpath; do # This is the magic to use -rpath. case "$finalize_rpath " in *" $libdir "*) ;; *) finalize_rpath="$finalize_rpath $libdir" ;; esac done fi # Now hardcode the library paths rpath= hardcode_libdirs= for libdir in $compile_rpath $finalize_rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then if test -z "$hardcode_libdirs"; then hardcode_libdirs="$libdir" else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" rpath="$rpath $flag" fi elif test -n "$runpath_var"; then case "$perm_rpath " in *" $libdir "*) ;; *) perm_rpath="$perm_rpath $libdir" ;; esac fi case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*) testbindir=`$echo "X$libdir" | $Xsed -e 's*/lib$*/bin*'` case :$dllsearchpath: in *":$libdir:"*) ;; *) dllsearchpath="$dllsearchpath:$libdir";; esac case :$dllsearchpath: in *":$testbindir:"*) ;; *) dllsearchpath="$dllsearchpath:$testbindir";; esac ;; esac done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir="$hardcode_libdirs" eval rpath=\" $hardcode_libdir_flag_spec\" fi compile_rpath="$rpath" rpath= hardcode_libdirs= for libdir in $finalize_rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then if test -z "$hardcode_libdirs"; then hardcode_libdirs="$libdir" else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" rpath="$rpath $flag" fi elif test -n "$runpath_var"; then case "$finalize_perm_rpath " in *" $libdir "*) ;; *) finalize_perm_rpath="$finalize_perm_rpath $libdir" ;; esac fi done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir="$hardcode_libdirs" eval rpath=\" $hardcode_libdir_flag_spec\" fi finalize_rpath="$rpath" if test -n "$libobjs" && test "$build_old_libs" = yes; then # Transform all the library objects into standard objects. compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` finalize_command=`$echo "X$finalize_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` fi dlsyms= if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then if test -n "$NM" && test -n "$global_symbol_pipe"; then dlsyms="${outputname}S.c" else $echo "$modename: not configured to extract global symbols from dlpreopened files" 1>&2 fi fi if test -n "$dlsyms"; then case $dlsyms in "") ;; *.c) # Discover the nlist of each of the dlfiles. nlist="$output_objdir/${outputname}.nm" $show "$rm $nlist ${nlist}S ${nlist}T" $run $rm "$nlist" "${nlist}S" "${nlist}T" # Parse the name list into a source file. $show "creating $output_objdir/$dlsyms" test -z "$run" && $echo > "$output_objdir/$dlsyms" "\ /* $dlsyms - symbol resolution table for \`$outputname' dlsym emulation. */ /* Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP */ #ifdef __cplusplus extern \"C\" { #endif /* Prevent the only kind of declaration conflicts we can make. */ #define lt_preloaded_symbols some_other_symbol /* External symbol declarations for the compiler. */\ " if test "$dlself" = yes; then $show "generating symbol list for \`$output'" test -z "$run" && $echo ': @PROGRAM@ ' > "$nlist" # Add our own program objects to the symbol list. progfiles=`$echo "X$objs$old_deplibs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` for arg in $progfiles; do $show "extracting global C symbols from \`$arg'" $run eval "$NM $arg | $global_symbol_pipe >> '$nlist'" done if test -n "$exclude_expsyms"; then $run eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' $run eval '$mv "$nlist"T "$nlist"' fi if test -n "$export_symbols_regex"; then $run eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T' $run eval '$mv "$nlist"T "$nlist"' fi # Prepare the list of exported symbols if test -z "$export_symbols"; then export_symbols="$output_objdir/$outputname.exp" $run $rm $export_symbols $run eval "${SED} -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' case $host in *cygwin* | *mingw* ) $run eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' $run eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"' ;; esac else $run eval "${SED} -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"' $run eval 'grep -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T' $run eval 'mv "$nlist"T "$nlist"' case $host in *cygwin* | *mingw* ) $run eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' $run eval 'cat "$nlist" >> "$output_objdir/$outputname.def"' ;; esac fi fi for arg in $dlprefiles; do $show "extracting global C symbols from \`$arg'" name=`$echo "$arg" | ${SED} -e 's%^.*/%%'` $run eval '$echo ": $name " >> "$nlist"' $run eval "$NM $arg | $global_symbol_pipe >> '$nlist'" done if test -z "$run"; then # Make sure we have at least an empty file. test -f "$nlist" || : > "$nlist" if test -n "$exclude_expsyms"; then $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T $mv "$nlist"T "$nlist" fi # Try sorting and uniquifying the output. if grep -v "^: " < "$nlist" | if sort -k 3 /dev/null 2>&1; then sort -k 3 else sort +2 fi | uniq > "$nlist"S; then : else grep -v "^: " < "$nlist" > "$nlist"S fi if test -f "$nlist"S; then eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$dlsyms"' else $echo '/* NONE */' >> "$output_objdir/$dlsyms" fi $echo >> "$output_objdir/$dlsyms" "\ #undef lt_preloaded_symbols #if defined (__STDC__) && __STDC__ # define lt_ptr void * #else # define lt_ptr char * # define const #endif /* The mapping between symbol names and symbols. */ " case $host in *cygwin* | *mingw* ) $echo >> "$output_objdir/$dlsyms" "\ /* DATA imports from DLLs on WIN32 can't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs */ struct { " ;; * ) $echo >> "$output_objdir/$dlsyms" "\ const struct { " ;; esac $echo >> "$output_objdir/$dlsyms" "\ const char *name; lt_ptr address; } lt_preloaded_symbols[] = {\ " eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$dlsyms" $echo >> "$output_objdir/$dlsyms" "\ {0, (lt_ptr) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt_preloaded_symbols; } #endif #ifdef __cplusplus } #endif\ " fi pic_flag_for_symtable= case $host in # compiling the symbol table file with pic_flag works around # a FreeBSD bug that causes programs to crash when -lm is # linked before any other PIC object. But we must not use # pic_flag when linking with -static. The problem exists in # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1. *-*-freebsd2*|*-*-freebsd3.0*|*-*-freebsdelf3.0*) case "$compile_command " in *" -static "*) ;; *) pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND";; esac;; *-*-hpux*) case "$compile_command " in *" -static "*) ;; *) pic_flag_for_symtable=" $pic_flag";; esac esac # Now compile the dynamic symbol file. $show "(cd $output_objdir && $LTCC $LTCFLAGS -c$no_builtin_flag$pic_flag_for_symtable \"$dlsyms\")" $run eval '(cd $output_objdir && $LTCC $LTCFLAGS -c$no_builtin_flag$pic_flag_for_symtable "$dlsyms")' || exit $? # Clean up the generated files. $show "$rm $output_objdir/$dlsyms $nlist ${nlist}S ${nlist}T" $run $rm "$output_objdir/$dlsyms" "$nlist" "${nlist}S" "${nlist}T" # Transform the symbol file into the correct name. case $host in *cygwin* | *mingw* ) if test -f "$output_objdir/${outputname}.def" ; then compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}.def $output_objdir/${outputname}S.${objext}%" | $NL2SP` finalize_command=`$echo "X$finalize_command" | $SP2NL | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}.def $output_objdir/${outputname}S.${objext}%" | $NL2SP` else compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%" | $NL2SP` finalize_command=`$echo "X$finalize_command" | $SP2NL | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%" | $NL2SP` fi ;; * ) compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%" | $NL2SP` finalize_command=`$echo "X$finalize_command" | $SP2NL | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%" | $NL2SP` ;; esac ;; *) $echo "$modename: unknown suffix for \`$dlsyms'" 1>&2 exit $EXIT_FAILURE ;; esac else # We keep going just in case the user didn't refer to # lt_preloaded_symbols. The linker will fail if global_symbol_pipe # really was required. # Nullify the symbol file. compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e "s% @SYMFILE@%%" | $NL2SP` finalize_command=`$echo "X$finalize_command" | $SP2NL | $Xsed -e "s% @SYMFILE@%%" | $NL2SP` fi if test "$need_relink" = no || test "$build_libtool_libs" != yes; then # Replace the output file specification. compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e 's%@OUTPUT@%'"$output"'%g' | $NL2SP` link_command="$compile_command$compile_rpath" # We have no uninstalled library dependencies, so finalize right now. $show "$link_command" $run eval "$link_command" exit_status=$? # Delete the generated files. if test -n "$dlsyms"; then $show "$rm $output_objdir/${outputname}S.${objext}" $run $rm "$output_objdir/${outputname}S.${objext}" fi exit $exit_status fi if test -n "$shlibpath_var"; then # We should set the shlibpath_var rpath= for dir in $temp_rpath; do case $dir in [\\/]* | [A-Za-z]:[\\/]*) # Absolute path. rpath="$rpath$dir:" ;; *) # Relative path: add a thisdir entry. rpath="$rpath\$thisdir/$dir:" ;; esac done temp_rpath="$rpath" fi if test -n "$compile_shlibpath$finalize_shlibpath"; then compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command" fi if test -n "$finalize_shlibpath"; then finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command" fi compile_var= finalize_var= if test -n "$runpath_var"; then if test -n "$perm_rpath"; then # We should set the runpath_var. rpath= for dir in $perm_rpath; do rpath="$rpath$dir:" done compile_var="$runpath_var=\"$rpath\$$runpath_var\" " fi if test -n "$finalize_perm_rpath"; then # We should set the runpath_var. rpath= for dir in $finalize_perm_rpath; do rpath="$rpath$dir:" done finalize_var="$runpath_var=\"$rpath\$$runpath_var\" " fi fi if test "$no_install" = yes; then # We don't need to create a wrapper script. link_command="$compile_var$compile_command$compile_rpath" # Replace the output file specification. link_command=`$echo "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'` # Delete the old output file. $run $rm $output # Link the executable and exit $show "$link_command" $run eval "$link_command" || exit $? exit $EXIT_SUCCESS fi if test "$hardcode_action" = relink; then # Fast installation is not supported link_command="$compile_var$compile_command$compile_rpath" relink_command="$finalize_var$finalize_command$finalize_rpath" $echo "$modename: warning: this platform does not like uninstalled shared libraries" 1>&2 $echo "$modename: \`$output' will be relinked during installation" 1>&2 else if test "$fast_install" != no; then link_command="$finalize_var$compile_command$finalize_rpath" if test "$fast_install" = yes; then relink_command=`$echo "X$compile_var$compile_command$compile_rpath" | $SP2NL | $Xsed -e 's%@OUTPUT@%\$progdir/\$file%g' | $NL2SP` else # fast_install is set to needless relink_command= fi else link_command="$compile_var$compile_command$compile_rpath" relink_command="$finalize_var$finalize_command$finalize_rpath" fi fi # Replace the output file specification. link_command=`$echo "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` # Delete the old output files. $run $rm $output $output_objdir/$outputname $output_objdir/lt-$outputname $show "$link_command" $run eval "$link_command" || exit $? # Now create the wrapper script. $show "creating $output" # Quote the relink command for shipping. if test -n "$relink_command"; then # Preserve any variables that may affect compiler behavior for var in $variables_saved_for_relink; do if eval test -z \"\${$var+set}\"; then relink_command="{ test -z \"\${$var+set}\" || unset $var || { $var=; export $var; }; }; $relink_command" elif eval var_value=\$$var; test -z "$var_value"; then relink_command="$var=; export $var; $relink_command" else var_value=`$echo "X$var_value" | $Xsed -e "$sed_quote_subst"` relink_command="$var=\"$var_value\"; export $var; $relink_command" fi done relink_command="(cd `pwd`; $relink_command)" relink_command=`$echo "X$relink_command" | $SP2NL | $Xsed -e "$sed_quote_subst" | $NL2SP` fi # Quote $echo for shipping. if test "X$echo" = "X$SHELL $progpath --fallback-echo"; then case $progpath in [\\/]* | [A-Za-z]:[\\/]*) qecho="$SHELL $progpath --fallback-echo";; *) qecho="$SHELL `pwd`/$progpath --fallback-echo";; esac qecho=`$echo "X$qecho" | $Xsed -e "$sed_quote_subst"` else qecho=`$echo "X$echo" | $Xsed -e "$sed_quote_subst"` fi # Only actually do things if our run command is non-null. if test -z "$run"; then # win32 will think the script is a binary if it has # a .exe suffix, so we strip it off here. case $output in *.exe) output=`$echo $output|${SED} 's,.exe$,,'` ;; esac # test for cygwin because mv fails w/o .exe extensions case $host in *cygwin*) exeext=.exe outputname=`$echo $outputname|${SED} 's,.exe$,,'` ;; *) exeext= ;; esac case $host in *cygwin* | *mingw* ) output_name=`basename $output` output_path=`dirname $output` cwrappersource="$output_path/$objdir/lt-$output_name.c" cwrapper="$output_path/$output_name.exe" $rm $cwrappersource $cwrapper trap "$rm $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15 cat > $cwrappersource <> $cwrappersource<<"EOF" #include #include #include #include #include #include #include #include #include #if defined(PATH_MAX) # define LT_PATHMAX PATH_MAX #elif defined(MAXPATHLEN) # define LT_PATHMAX MAXPATHLEN #else # define LT_PATHMAX 1024 #endif #ifndef DIR_SEPARATOR # define DIR_SEPARATOR '/' # define PATH_SEPARATOR ':' #endif #if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \ defined (__OS2__) # define HAVE_DOS_BASED_FILE_SYSTEM # ifndef DIR_SEPARATOR_2 # define DIR_SEPARATOR_2 '\\' # endif # ifndef PATH_SEPARATOR_2 # define PATH_SEPARATOR_2 ';' # endif #endif #ifndef DIR_SEPARATOR_2 # define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR) #else /* DIR_SEPARATOR_2 */ # define IS_DIR_SEPARATOR(ch) \ (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2)) #endif /* DIR_SEPARATOR_2 */ #ifndef PATH_SEPARATOR_2 # define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR) #else /* PATH_SEPARATOR_2 */ # define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2) #endif /* PATH_SEPARATOR_2 */ #define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type))) #define XFREE(stale) do { \ if (stale) { free ((void *) stale); stale = 0; } \ } while (0) /* -DDEBUG is fairly common in CFLAGS. */ #undef DEBUG #if defined DEBUGWRAPPER # define DEBUG(format, ...) fprintf(stderr, format, __VA_ARGS__) #else # define DEBUG(format, ...) #endif const char *program_name = NULL; void * xmalloc (size_t num); char * xstrdup (const char *string); const char * base_name (const char *name); char * find_executable(const char *wrapper); int check_executable(const char *path); char * strendzap(char *str, const char *pat); void lt_fatal (const char *message, ...); int main (int argc, char *argv[]) { char **newargz; int i; program_name = (char *) xstrdup (base_name (argv[0])); DEBUG("(main) argv[0] : %s\n",argv[0]); DEBUG("(main) program_name : %s\n",program_name); newargz = XMALLOC(char *, argc+2); EOF cat >> $cwrappersource <> $cwrappersource <<"EOF" newargz[1] = find_executable(argv[0]); if (newargz[1] == NULL) lt_fatal("Couldn't find %s", argv[0]); DEBUG("(main) found exe at : %s\n",newargz[1]); /* we know the script has the same name, without the .exe */ /* so make sure newargz[1] doesn't end in .exe */ strendzap(newargz[1],".exe"); for (i = 1; i < argc; i++) newargz[i+1] = xstrdup(argv[i]); newargz[argc+1] = NULL; for (i=0; i> $cwrappersource <> $cwrappersource <> $cwrappersource <<"EOF" return 127; } void * xmalloc (size_t num) { void * p = (void *) malloc (num); if (!p) lt_fatal ("Memory exhausted"); return p; } char * xstrdup (const char *string) { return string ? strcpy ((char *) xmalloc (strlen (string) + 1), string) : NULL ; } const char * base_name (const char *name) { const char *base; #if defined (HAVE_DOS_BASED_FILE_SYSTEM) /* Skip over the disk name in MSDOS pathnames. */ if (isalpha ((unsigned char)name[0]) && name[1] == ':') name += 2; #endif for (base = name; *name; name++) if (IS_DIR_SEPARATOR (*name)) base = name + 1; return base; } int check_executable(const char * path) { struct stat st; DEBUG("(check_executable) : %s\n", path ? (*path ? path : "EMPTY!") : "NULL!"); if ((!path) || (!*path)) return 0; if ((stat (path, &st) >= 0) && ( /* MinGW & native WIN32 do not support S_IXOTH or S_IXGRP */ #if defined (S_IXOTH) ((st.st_mode & S_IXOTH) == S_IXOTH) || #endif #if defined (S_IXGRP) ((st.st_mode & S_IXGRP) == S_IXGRP) || #endif ((st.st_mode & S_IXUSR) == S_IXUSR)) ) return 1; else return 0; } /* Searches for the full path of the wrapper. Returns newly allocated full path name if found, NULL otherwise */ char * find_executable (const char* wrapper) { int has_slash = 0; const char* p; const char* p_next; /* static buffer for getcwd */ char tmp[LT_PATHMAX + 1]; int tmp_len; char* concat_name; DEBUG("(find_executable) : %s\n", wrapper ? (*wrapper ? wrapper : "EMPTY!") : "NULL!"); if ((wrapper == NULL) || (*wrapper == '\0')) return NULL; /* Absolute path? */ #if defined (HAVE_DOS_BASED_FILE_SYSTEM) if (isalpha ((unsigned char)wrapper[0]) && wrapper[1] == ':') { concat_name = xstrdup (wrapper); if (check_executable(concat_name)) return concat_name; XFREE(concat_name); } else { #endif if (IS_DIR_SEPARATOR (wrapper[0])) { concat_name = xstrdup (wrapper); if (check_executable(concat_name)) return concat_name; XFREE(concat_name); } #if defined (HAVE_DOS_BASED_FILE_SYSTEM) } #endif for (p = wrapper; *p; p++) if (*p == '/') { has_slash = 1; break; } if (!has_slash) { /* no slashes; search PATH */ const char* path = getenv ("PATH"); if (path != NULL) { for (p = path; *p; p = p_next) { const char* q; size_t p_len; for (q = p; *q; q++) if (IS_PATH_SEPARATOR(*q)) break; p_len = q - p; p_next = (*q == '\0' ? q : q + 1); if (p_len == 0) { /* empty path: current directory */ if (getcwd (tmp, LT_PATHMAX) == NULL) lt_fatal ("getcwd failed"); tmp_len = strlen(tmp); concat_name = XMALLOC(char, tmp_len + 1 + strlen(wrapper) + 1); memcpy (concat_name, tmp, tmp_len); concat_name[tmp_len] = '/'; strcpy (concat_name + tmp_len + 1, wrapper); } else { concat_name = XMALLOC(char, p_len + 1 + strlen(wrapper) + 1); memcpy (concat_name, p, p_len); concat_name[p_len] = '/'; strcpy (concat_name + p_len + 1, wrapper); } if (check_executable(concat_name)) return concat_name; XFREE(concat_name); } } /* not found in PATH; assume curdir */ } /* Relative path | not found in path: prepend cwd */ if (getcwd (tmp, LT_PATHMAX) == NULL) lt_fatal ("getcwd failed"); tmp_len = strlen(tmp); concat_name = XMALLOC(char, tmp_len + 1 + strlen(wrapper) + 1); memcpy (concat_name, tmp, tmp_len); concat_name[tmp_len] = '/'; strcpy (concat_name + tmp_len + 1, wrapper); if (check_executable(concat_name)) return concat_name; XFREE(concat_name); return NULL; } char * strendzap(char *str, const char *pat) { size_t len, patlen; assert(str != NULL); assert(pat != NULL); len = strlen(str); patlen = strlen(pat); if (patlen <= len) { str += len - patlen; if (strcmp(str, pat) == 0) *str = '\0'; } return str; } static void lt_error_core (int exit_status, const char * mode, const char * message, va_list ap) { fprintf (stderr, "%s: %s: ", program_name, mode); vfprintf (stderr, message, ap); fprintf (stderr, ".\n"); if (exit_status >= 0) exit (exit_status); } void lt_fatal (const char *message, ...) { va_list ap; va_start (ap, message); lt_error_core (EXIT_FAILURE, "FATAL", message, ap); va_end (ap); } EOF # we should really use a build-platform specific compiler # here, but OTOH, the wrappers (shell script and this C one) # are only useful if you want to execute the "real" binary. # Since the "real" binary is built for $host, then this # wrapper might as well be built for $host, too. $run $LTCC $LTCFLAGS -s -o $cwrapper $cwrappersource ;; esac $rm $output trap "$rm $output; exit $EXIT_FAILURE" 1 2 15 $echo > $output "\ #! $SHELL # $output - temporary wrapper script for $objdir/$outputname # Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP # # The $output program cannot be directly executed until all the libtool # libraries that it depends on are installed. # # This wrapper script should never be moved out of the build directory. # If it is, it will not operate correctly. # Sed substitution that helps us do robust quoting. It backslashifies # metacharacters that are still active within double-quoted strings. Xsed='${SED} -e 1s/^X//' sed_quote_subst='$sed_quote_subst' # Be Bourne compatible (taken from Autoconf:_AS_BOURNE_COMPATIBLE). if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in *posix*) set -o posix;; esac fi BIN_SH=xpg4; export BIN_SH # for Tru64 DUALCASE=1; export DUALCASE # for MKS sh # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH relink_command=\"$relink_command\" # This environment variable determines our operation mode. if test \"\$libtool_install_magic\" = \"$magic\"; then # install mode needs the following variable: notinst_deplibs='$notinst_deplibs' else # When we are sourced in execute mode, \$file and \$echo are already set. if test \"\$libtool_execute_magic\" != \"$magic\"; then echo=\"$qecho\" file=\"\$0\" # Make sure echo works. if test \"X\$1\" = X--no-reexec; then # Discard the --no-reexec flag, and continue. shift elif test \"X\`(\$echo '\t') 2>/dev/null\`\" = 'X\t'; then # Yippee, \$echo works! : else # Restart under the correct shell, and then maybe \$echo will work. exec $SHELL \"\$0\" --no-reexec \${1+\"\$@\"} fi fi\ " $echo >> $output "\ # Find the directory that this script lives in. thisdir=\`\$echo \"X\$file\" | \$Xsed -e 's%/[^/]*$%%'\` test \"x\$thisdir\" = \"x\$file\" && thisdir=. # Follow symbolic links until we get to the real thisdir. file=\`ls -ld \"\$file\" | ${SED} -n 's/.*-> //p'\` while test -n \"\$file\"; do destdir=\`\$echo \"X\$file\" | \$Xsed -e 's%/[^/]*\$%%'\` # If there was a directory component, then change thisdir. if test \"x\$destdir\" != \"x\$file\"; then case \"\$destdir\" in [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;; *) thisdir=\"\$thisdir/\$destdir\" ;; esac fi file=\`\$echo \"X\$file\" | \$Xsed -e 's%^.*/%%'\` file=\`ls -ld \"\$thisdir/\$file\" | ${SED} -n 's/.*-> //p'\` done # Try to get the absolute directory name. absdir=\`cd \"\$thisdir\" && pwd\` test -n \"\$absdir\" && thisdir=\"\$absdir\" " if test "$fast_install" = yes; then $echo >> $output "\ program=lt-'$outputname'$exeext progdir=\"\$thisdir/$objdir\" if test ! -f \"\$progdir/\$program\" || \\ { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | ${SED} 1q\`; \\ test \"X\$file\" != \"X\$progdir/\$program\"; }; then file=\"\$\$-\$program\" if test ! -d \"\$progdir\"; then $mkdir \"\$progdir\" else $rm \"\$progdir/\$file\" fi" $echo >> $output "\ # relink executable if necessary if test -n \"\$relink_command\"; then if relink_command_output=\`eval \$relink_command 2>&1\`; then : else $echo \"\$relink_command_output\" >&2 $rm \"\$progdir/\$file\" exit $EXIT_FAILURE fi fi $mv \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null || { $rm \"\$progdir/\$program\"; $mv \"\$progdir/\$file\" \"\$progdir/\$program\"; } $rm \"\$progdir/\$file\" fi" else $echo >> $output "\ program='$outputname' progdir=\"\$thisdir/$objdir\" " fi $echo >> $output "\ if test -f \"\$progdir/\$program\"; then" # Export our shlibpath_var if we have one. if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then $echo >> $output "\ # Add our own library path to $shlibpath_var $shlibpath_var=\"$temp_rpath\$$shlibpath_var\" # Some systems cannot cope with colon-terminated $shlibpath_var # The second colon is a workaround for a bug in BeOS R4 sed $shlibpath_var=\`\$echo \"X\$$shlibpath_var\" | \$Xsed -e 's/::*\$//'\` export $shlibpath_var " fi # fixup the dll searchpath if we need to. if test -n "$dllsearchpath"; then $echo >> $output "\ # Add the dll search path components to the executable PATH PATH=$dllsearchpath:\$PATH " fi $echo >> $output "\ if test \"\$libtool_execute_magic\" != \"$magic\"; then # Run the actual program with our arguments. " case $host in # Backslashes separate directories on plain windows *-*-mingw | *-*-os2*) $echo >> $output "\ exec \"\$progdir\\\\\$program\" \${1+\"\$@\"} " ;; *) $echo >> $output "\ exec \"\$progdir/\$program\" \${1+\"\$@\"} " ;; esac $echo >> $output "\ \$echo \"\$0: cannot exec \$program \$*\" exit $EXIT_FAILURE fi else # The program doesn't exist. \$echo \"\$0: error: \\\`\$progdir/\$program' does not exist\" 1>&2 \$echo \"This script is just a wrapper for \$program.\" 1>&2 $echo \"See the $PACKAGE documentation for more information.\" 1>&2 exit $EXIT_FAILURE fi fi\ " chmod +x $output fi exit $EXIT_SUCCESS ;; esac # See if we need to build an old-fashioned archive. for oldlib in $oldlibs; do if test "$build_libtool_libs" = convenience; then oldobjs="$libobjs_save" addlibs="$convenience" build_libtool_libs=no else if test "$build_libtool_libs" = module; then oldobjs="$libobjs_save" build_libtool_libs=no else oldobjs="$old_deplibs $non_pic_objects" fi addlibs="$old_convenience" fi if test -n "$addlibs"; then gentop="$output_objdir/${outputname}x" generated="$generated $gentop" func_extract_archives $gentop $addlibs oldobjs="$oldobjs $func_extract_archives_result" fi # Do each command in the archive commands. if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then cmds=$old_archive_from_new_cmds else # POSIX demands no paths to be encoded in archives. We have # to avoid creating archives with duplicate basenames if we # might have to extract them afterwards, e.g., when creating a # static archive out of a convenience library, or when linking # the entirety of a libtool archive into another (currently # not supported by libtool). if (for obj in $oldobjs do $echo "X$obj" | $Xsed -e 's%^.*/%%' done | sort | sort -uc >/dev/null 2>&1); then : else $echo "copying selected object files to avoid basename conflicts..." if test -z "$gentop"; then gentop="$output_objdir/${outputname}x" generated="$generated $gentop" $show "${rm}r $gentop" $run ${rm}r "$gentop" $show "$mkdir $gentop" $run $mkdir "$gentop" exit_status=$? if test "$exit_status" -ne 0 && test ! -d "$gentop"; then exit $exit_status fi fi save_oldobjs=$oldobjs oldobjs= counter=1 for obj in $save_oldobjs do objbase=`$echo "X$obj" | $Xsed -e 's%^.*/%%'` case " $oldobjs " in " ") oldobjs=$obj ;; *[\ /]"$objbase "*) while :; do # Make sure we don't pick an alternate name that also # overlaps. newobj=lt$counter-$objbase counter=`expr $counter + 1` case " $oldobjs " in *[\ /]"$newobj "*) ;; *) if test ! -f "$gentop/$newobj"; then break; fi ;; esac done $show "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj" $run ln "$obj" "$gentop/$newobj" || $run cp "$obj" "$gentop/$newobj" oldobjs="$oldobjs $gentop/$newobj" ;; *) oldobjs="$oldobjs $obj" ;; esac done fi eval cmds=\"$old_archive_cmds\" if len=`expr "X$cmds" : ".*"` && test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then cmds=$old_archive_cmds else # the command line is too long to link in one step, link in parts $echo "using piecewise archive linking..." save_RANLIB=$RANLIB RANLIB=: objlist= concat_cmds= save_oldobjs=$oldobjs # Is there a better way of finding the last object in the list? for obj in $save_oldobjs do last_oldobj=$obj done for obj in $save_oldobjs do oldobjs="$objlist $obj" objlist="$objlist $obj" eval test_cmds=\"$old_archive_cmds\" if len=`expr "X$test_cmds" : ".*" 2>/dev/null` && test "$len" -le "$max_cmd_len"; then : else # the above command should be used before it gets too long oldobjs=$objlist if test "$obj" = "$last_oldobj" ; then RANLIB=$save_RANLIB fi test -z "$concat_cmds" || concat_cmds=$concat_cmds~ eval concat_cmds=\"\${concat_cmds}$old_archive_cmds\" objlist= fi done RANLIB=$save_RANLIB oldobjs=$objlist if test "X$oldobjs" = "X" ; then eval cmds=\"\$concat_cmds\" else eval cmds=\"\$concat_cmds~\$old_archive_cmds\" fi fi fi save_ifs="$IFS"; IFS='~' for cmd in $cmds; do eval cmd=\"$cmd\" IFS="$save_ifs" $show "$cmd" $run eval "$cmd" || exit $? done IFS="$save_ifs" done if test -n "$generated"; then $show "${rm}r$generated" $run ${rm}r$generated fi # Now create the libtool archive. case $output in *.la) old_library= test "$build_old_libs" = yes && old_library="$libname.$libext" $show "creating $output" # Preserve any variables that may affect compiler behavior for var in $variables_saved_for_relink; do if eval test -z \"\${$var+set}\"; then relink_command="{ test -z \"\${$var+set}\" || unset $var || { $var=; export $var; }; }; $relink_command" elif eval var_value=\$$var; test -z "$var_value"; then relink_command="$var=; export $var; $relink_command" else var_value=`$echo "X$var_value" | $Xsed -e "$sed_quote_subst"` relink_command="$var=\"$var_value\"; export $var; $relink_command" fi done # Quote the link command for shipping. relink_command="(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)" relink_command=`$echo "X$relink_command" | $SP2NL | $Xsed -e "$sed_quote_subst" | $NL2SP` if test "$hardcode_automatic" = yes ; then relink_command= fi # Only create the output if not a dry run. if test -z "$run"; then for installed in no yes; do if test "$installed" = yes; then if test -z "$install_libdir"; then break fi output="$output_objdir/$outputname"i # Replace all uninstalled libtool libraries with the installed ones newdependency_libs= for deplib in $dependency_libs; do case $deplib in *.la) name=`$echo "X$deplib" | $Xsed -e 's%^.*/%%'` eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` if test -z "$libdir"; then $echo "$modename: \`$deplib' is not a valid libtool archive" 1>&2 exit $EXIT_FAILURE fi newdependency_libs="$newdependency_libs $libdir/$name" ;; *) newdependency_libs="$newdependency_libs $deplib" ;; esac done dependency_libs="$newdependency_libs" newdlfiles= for lib in $dlfiles; do name=`$echo "X$lib" | $Xsed -e 's%^.*/%%'` eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` if test -z "$libdir"; then $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 exit $EXIT_FAILURE fi newdlfiles="$newdlfiles $libdir/$name" done dlfiles="$newdlfiles" newdlprefiles= for lib in $dlprefiles; do name=`$echo "X$lib" | $Xsed -e 's%^.*/%%'` eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` if test -z "$libdir"; then $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 exit $EXIT_FAILURE fi newdlprefiles="$newdlprefiles $libdir/$name" done dlprefiles="$newdlprefiles" else newdlfiles= for lib in $dlfiles; do case $lib in [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; *) abs=`pwd`"/$lib" ;; esac newdlfiles="$newdlfiles $abs" done dlfiles="$newdlfiles" newdlprefiles= for lib in $dlprefiles; do case $lib in [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; *) abs=`pwd`"/$lib" ;; esac newdlprefiles="$newdlprefiles $abs" done dlprefiles="$newdlprefiles" fi $rm $output # place dlname in correct position for cygwin tdlname=$dlname case $host,$output,$installed,$module,$dlname in *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll) tdlname=../bin/$dlname ;; esac $echo > $output "\ # $outputname - a libtool library file # Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP # # Please DO NOT delete this file! # It is necessary for linking the library. # The name that we can dlopen(3). dlname='$tdlname' # Names of this library. library_names='$library_names' # The name of the static archive. old_library='$old_library' # Libraries that this one depends upon. dependency_libs='$dependency_libs' # Version information for $libname. current=$current age=$age revision=$revision # Is this an already installed library? installed=$installed # Should we warn about portability when linking against -modules? shouldnotlink=$module # Files to dlopen/dlpreopen dlopen='$dlfiles' dlpreopen='$dlprefiles' # Directory that this library needs to be installed in: libdir='$install_libdir'" if test "$installed" = no && test "$need_relink" = yes; then $echo >> $output "\ relink_command=\"$relink_command\"" fi done fi # Do a symbolic link so that the libtool archive can be found in # LD_LIBRARY_PATH before the program is installed. $show "(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)" $run eval '(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)' || exit $? ;; esac exit $EXIT_SUCCESS ;; # libtool install mode install) modename="$modename: install" # There may be an optional sh(1) argument at the beginning of # install_prog (especially on Windows NT). if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh || # Allow the use of GNU shtool's install command. $echo "X$nonopt" | grep shtool > /dev/null; then # Aesthetically quote it. arg=`$echo "X$nonopt" | $Xsed -e "$sed_quote_subst"` case $arg in *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") arg="\"$arg\"" ;; esac install_prog="$arg " arg="$1" shift else install_prog= arg=$nonopt fi # The real first argument should be the name of the installation program. # Aesthetically quote it. arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` case $arg in *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") arg="\"$arg\"" ;; esac install_prog="$install_prog$arg" # We need to accept at least all the BSD install flags. dest= files= opts= prev= install_type= isdir=no stripme= for arg do if test -n "$dest"; then files="$files $dest" dest=$arg continue fi case $arg in -d) isdir=yes ;; -f) case " $install_prog " in *[\\\ /]cp\ *) ;; *) prev=$arg ;; esac ;; -g | -m | -o) prev=$arg ;; -s) stripme=" -s" continue ;; -*) ;; *) # If the previous option needed an argument, then skip it. if test -n "$prev"; then prev= else dest=$arg continue fi ;; esac # Aesthetically quote the argument. arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` case $arg in *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") arg="\"$arg\"" ;; esac install_prog="$install_prog $arg" done if test -z "$install_prog"; then $echo "$modename: you must specify an install program" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE fi if test -n "$prev"; then $echo "$modename: the \`$prev' option requires an argument" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE fi if test -z "$files"; then if test -z "$dest"; then $echo "$modename: no file or destination specified" 1>&2 else $echo "$modename: you must specify a destination" 1>&2 fi $echo "$help" 1>&2 exit $EXIT_FAILURE fi # Strip any trailing slash from the destination. dest=`$echo "X$dest" | $Xsed -e 's%/$%%'` # Check to see that the destination is a directory. test -d "$dest" && isdir=yes if test "$isdir" = yes; then destdir="$dest" destname= else destdir=`$echo "X$dest" | $Xsed -e 's%/[^/]*$%%'` test "X$destdir" = "X$dest" && destdir=. destname=`$echo "X$dest" | $Xsed -e 's%^.*/%%'` # Not a directory, so check to see that there is only one file specified. set dummy $files if test "$#" -gt 2; then $echo "$modename: \`$dest' is not a directory" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE fi fi case $destdir in [\\/]* | [A-Za-z]:[\\/]*) ;; *) for file in $files; do case $file in *.lo) ;; *) $echo "$modename: \`$destdir' must be an absolute directory name" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE ;; esac done ;; esac # This variable tells wrapper scripts just to set variables rather # than running their programs. libtool_install_magic="$magic" staticlibs= future_libdirs= current_libdirs= for file in $files; do # Do each installation. case $file in *.$libext) # Do the static libraries later. staticlibs="$staticlibs $file" ;; *.la) # Check to see that this really is a libtool archive. if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : else $echo "$modename: \`$file' is not a valid libtool archive" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE fi library_names= old_library= relink_command= # If there is no directory component, then add one. case $file in */* | *\\*) . $file ;; *) . ./$file ;; esac # Add the libdir to current_libdirs if it is the destination. if test "X$destdir" = "X$libdir"; then case "$current_libdirs " in *" $libdir "*) ;; *) current_libdirs="$current_libdirs $libdir" ;; esac else # Note the libdir as a future libdir. case "$future_libdirs " in *" $libdir "*) ;; *) future_libdirs="$future_libdirs $libdir" ;; esac fi dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`/ test "X$dir" = "X$file/" && dir= dir="$dir$objdir" if test -n "$relink_command"; then # Determine the prefix the user has applied to our future dir. inst_prefix_dir=`$echo "$destdir" | $SED "s%$libdir\$%%"` # Don't allow the user to place us outside of our expected # location b/c this prevents finding dependent libraries that # are installed to the same prefix. # At present, this check doesn't affect windows .dll's that # are installed into $libdir/../bin (currently, that works fine) # but it's something to keep an eye on. if test "$inst_prefix_dir" = "$destdir"; then $echo "$modename: error: cannot install \`$file' to a directory not ending in $libdir" 1>&2 exit $EXIT_FAILURE fi if test -n "$inst_prefix_dir"; then # Stick the inst_prefix_dir data into the link command. relink_command=`$echo "$relink_command" | $SP2NL | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%" | $NL2SP` else relink_command=`$echo "$relink_command" | $SP2NL | $SED "s%@inst_prefix_dir@%%" | $NL2SP` fi $echo "$modename: warning: relinking \`$file'" 1>&2 $show "$relink_command" if $run eval "$relink_command"; then : else $echo "$modename: error: relink \`$file' with the above command before installing it" 1>&2 exit $EXIT_FAILURE fi fi # See the names of the shared library. set dummy $library_names if test -n "$2"; then realname="$2" shift shift srcname="$realname" test -n "$relink_command" && srcname="$realname"T # Install the shared library and build the symlinks. $show "$install_prog $dir/$srcname $destdir/$realname" $run eval "$install_prog $dir/$srcname $destdir/$realname" || exit $? if test -n "$stripme" && test -n "$striplib"; then $show "$striplib $destdir/$realname" $run eval "$striplib $destdir/$realname" || exit $? fi if test "$#" -gt 0; then # Delete the old symlinks, and create new ones. # Try `ln -sf' first, because the `ln' binary might depend on # the symlink we replace! Solaris /bin/ln does not understand -f, # so we also need to try rm && ln -s. for linkname do if test "$linkname" != "$realname"; then $show "(cd $destdir && { $LN_S -f $realname $linkname || { $rm $linkname && $LN_S $realname $linkname; }; })" $run eval "(cd $destdir && { $LN_S -f $realname $linkname || { $rm $linkname && $LN_S $realname $linkname; }; })" fi done fi # Do each command in the postinstall commands. lib="$destdir/$realname" cmds=$postinstall_cmds save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" eval cmd=\"$cmd\" $show "$cmd" $run eval "$cmd" || { lt_exit=$? # Restore the uninstalled library and exit if test "$mode" = relink; then $run eval '(cd $output_objdir && $rm ${realname}T && $mv ${realname}U $realname)' fi exit $lt_exit } done IFS="$save_ifs" fi # Install the pseudo-library for information purposes. name=`$echo "X$file" | $Xsed -e 's%^.*/%%'` instname="$dir/$name"i $show "$install_prog $instname $destdir/$name" $run eval "$install_prog $instname $destdir/$name" || exit $? # Maybe install the static library, too. test -n "$old_library" && staticlibs="$staticlibs $dir/$old_library" ;; *.lo) # Install (i.e. copy) a libtool object. # Figure out destination file name, if it wasn't already specified. if test -n "$destname"; then destfile="$destdir/$destname" else destfile=`$echo "X$file" | $Xsed -e 's%^.*/%%'` destfile="$destdir/$destfile" fi # Deduce the name of the destination old-style object file. case $destfile in *.lo) staticdest=`$echo "X$destfile" | $Xsed -e "$lo2o"` ;; *.$objext) staticdest="$destfile" destfile= ;; *) $echo "$modename: cannot copy a libtool object to \`$destfile'" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE ;; esac # Install the libtool object if requested. if test -n "$destfile"; then $show "$install_prog $file $destfile" $run eval "$install_prog $file $destfile" || exit $? fi # Install the old object if enabled. if test "$build_old_libs" = yes; then # Deduce the name of the old-style object file. staticobj=`$echo "X$file" | $Xsed -e "$lo2o"` $show "$install_prog $staticobj $staticdest" $run eval "$install_prog \$staticobj \$staticdest" || exit $? fi exit $EXIT_SUCCESS ;; *) # Figure out destination file name, if it wasn't already specified. if test -n "$destname"; then destfile="$destdir/$destname" else destfile=`$echo "X$file" | $Xsed -e 's%^.*/%%'` destfile="$destdir/$destfile" fi # If the file is missing, and there is a .exe on the end, strip it # because it is most likely a libtool script we actually want to # install stripped_ext="" case $file in *.exe) if test ! -f "$file"; then file=`$echo $file|${SED} 's,.exe$,,'` stripped_ext=".exe" fi ;; esac # Do a test to see if this is really a libtool program. case $host in *cygwin*|*mingw*) wrapper=`$echo $file | ${SED} -e 's,.exe$,,'` ;; *) wrapper=$file ;; esac if (${SED} -e '4q' $wrapper | grep "^# Generated by .*$PACKAGE")>/dev/null 2>&1; then notinst_deplibs= relink_command= # Note that it is not necessary on cygwin/mingw to append a dot to # foo even if both foo and FILE.exe exist: automatic-append-.exe # behavior happens only for exec(3), not for open(2)! Also, sourcing # `FILE.' does not work on cygwin managed mounts. # # If there is no directory component, then add one. case $wrapper in */* | *\\*) . ${wrapper} ;; *) . ./${wrapper} ;; esac # Check the variables that should have been set. if test -z "$notinst_deplibs"; then $echo "$modename: invalid libtool wrapper script \`$wrapper'" 1>&2 exit $EXIT_FAILURE fi finalize=yes for lib in $notinst_deplibs; do # Check to see that each library is installed. libdir= if test -f "$lib"; then # If there is no directory component, then add one. case $lib in */* | *\\*) . $lib ;; *) . ./$lib ;; esac fi libfile="$libdir/"`$echo "X$lib" | $Xsed -e 's%^.*/%%g'` ### testsuite: skip nested quoting test if test -n "$libdir" && test ! -f "$libfile"; then $echo "$modename: warning: \`$lib' has not been installed in \`$libdir'" 1>&2 finalize=no fi done relink_command= # Note that it is not necessary on cygwin/mingw to append a dot to # foo even if both foo and FILE.exe exist: automatic-append-.exe # behavior happens only for exec(3), not for open(2)! Also, sourcing # `FILE.' does not work on cygwin managed mounts. # # If there is no directory component, then add one. case $wrapper in */* | *\\*) . ${wrapper} ;; *) . ./${wrapper} ;; esac outputname= if test "$fast_install" = no && test -n "$relink_command"; then if test "$finalize" = yes && test -z "$run"; then tmpdir=`func_mktempdir` file=`$echo "X$file$stripped_ext" | $Xsed -e 's%^.*/%%'` outputname="$tmpdir/$file" # Replace the output file specification. relink_command=`$echo "X$relink_command" | $SP2NL | $Xsed -e 's%@OUTPUT@%'"$outputname"'%g' | $NL2SP` $show "$relink_command" if $run eval "$relink_command"; then : else $echo "$modename: error: relink \`$file' with the above command before installing it" 1>&2 ${rm}r "$tmpdir" continue fi file="$outputname" else $echo "$modename: warning: cannot relink \`$file'" 1>&2 fi else # Install the binary that we compiled earlier. file=`$echo "X$file$stripped_ext" | $Xsed -e "s%\([^/]*\)$%$objdir/\1%"` fi fi # remove .exe since cygwin /usr/bin/install will append another # one anyway case $install_prog,$host in */usr/bin/install*,*cygwin*) case $file:$destfile in *.exe:*.exe) # this is ok ;; *.exe:*) destfile=$destfile.exe ;; *:*.exe) destfile=`$echo $destfile | ${SED} -e 's,.exe$,,'` ;; esac ;; esac $show "$install_prog$stripme $file $destfile" $run eval "$install_prog\$stripme \$file \$destfile" || exit $? test -n "$outputname" && ${rm}r "$tmpdir" ;; esac done for file in $staticlibs; do name=`$echo "X$file" | $Xsed -e 's%^.*/%%'` # Set up the ranlib parameters. oldlib="$destdir/$name" $show "$install_prog $file $oldlib" $run eval "$install_prog \$file \$oldlib" || exit $? if test -n "$stripme" && test -n "$old_striplib"; then $show "$old_striplib $oldlib" $run eval "$old_striplib $oldlib" || exit $? fi # Do each command in the postinstall commands. cmds=$old_postinstall_cmds save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" eval cmd=\"$cmd\" $show "$cmd" $run eval "$cmd" || exit $? done IFS="$save_ifs" done if test -n "$future_libdirs"; then $echo "$modename: warning: remember to run \`$progname --finish$future_libdirs'" 1>&2 fi if test -n "$current_libdirs"; then # Maybe just do a dry run. test -n "$run" && current_libdirs=" -n$current_libdirs" exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs' else exit $EXIT_SUCCESS fi ;; # libtool finish mode finish) modename="$modename: finish" libdirs="$nonopt" admincmds= if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then for dir do libdirs="$libdirs $dir" done for libdir in $libdirs; do if test -n "$finish_cmds"; then # Do each command in the finish commands. cmds=$finish_cmds save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" eval cmd=\"$cmd\" $show "$cmd" $run eval "$cmd" || admincmds="$admincmds $cmd" done IFS="$save_ifs" fi if test -n "$finish_eval"; then # Do the single finish_eval. eval cmds=\"$finish_eval\" $run eval "$cmds" || admincmds="$admincmds $cmds" fi done fi # Exit here if they wanted silent mode. test "$show" = : && exit $EXIT_SUCCESS $echo "X----------------------------------------------------------------------" | $Xsed $echo "Libraries have been installed in:" for libdir in $libdirs; do $echo " $libdir" done $echo $echo "If you ever happen to want to link against installed libraries" $echo "in a given directory, LIBDIR, you must either use libtool, and" $echo "specify the full pathname of the library, or use the \`-LLIBDIR'" $echo "flag during linking and do at least one of the following:" if test -n "$shlibpath_var"; then $echo " - add LIBDIR to the \`$shlibpath_var' environment variable" $echo " during execution" fi if test -n "$runpath_var"; then $echo " - add LIBDIR to the \`$runpath_var' environment variable" $echo " during linking" fi if test -n "$hardcode_libdir_flag_spec"; then libdir=LIBDIR eval flag=\"$hardcode_libdir_flag_spec\" $echo " - use the \`$flag' linker flag" fi if test -n "$admincmds"; then $echo " - have your system administrator run these commands:$admincmds" fi if test -f /etc/ld.so.conf; then $echo " - have your system administrator add LIBDIR to \`/etc/ld.so.conf'" fi $echo $echo "See any operating system documentation about shared libraries for" $echo "more information, such as the ld(1) and ld.so(8) manual pages." $echo "X----------------------------------------------------------------------" | $Xsed exit $EXIT_SUCCESS ;; # libtool execute mode execute) modename="$modename: execute" # The first argument is the command name. cmd="$nonopt" if test -z "$cmd"; then $echo "$modename: you must specify a COMMAND" 1>&2 $echo "$help" exit $EXIT_FAILURE fi # Handle -dlopen flags immediately. for file in $execute_dlfiles; do if test ! -f "$file"; then $echo "$modename: \`$file' is not a file" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE fi dir= case $file in *.la) # Check to see that this really is a libtool archive. if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : else $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE fi # Read the libtool library. dlname= library_names= # If there is no directory component, then add one. case $file in */* | *\\*) . $file ;; *) . ./$file ;; esac # Skip this library if it cannot be dlopened. if test -z "$dlname"; then # Warn if it was a shared library. test -n "$library_names" && $echo "$modename: warning: \`$file' was not linked with \`-export-dynamic'" continue fi dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` test "X$dir" = "X$file" && dir=. if test -f "$dir/$objdir/$dlname"; then dir="$dir/$objdir" else if test ! -f "$dir/$dlname"; then $echo "$modename: cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'" 1>&2 exit $EXIT_FAILURE fi fi ;; *.lo) # Just add the directory containing the .lo file. dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` test "X$dir" = "X$file" && dir=. ;; *) $echo "$modename: warning \`-dlopen' is ignored for non-libtool libraries and objects" 1>&2 continue ;; esac # Get the absolute pathname. absdir=`cd "$dir" && pwd` test -n "$absdir" && dir="$absdir" # Now add the directory to shlibpath_var. if eval "test -z \"\$$shlibpath_var\""; then eval "$shlibpath_var=\"\$dir\"" else eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\"" fi done # This variable tells wrapper scripts just to set shlibpath_var # rather than running their programs. libtool_execute_magic="$magic" # Check if any of the arguments is a wrapper script. args= for file do case $file in -*) ;; *) # Do a test to see if this is really a libtool program. if (${SED} -e '4q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then # If there is no directory component, then add one. case $file in */* | *\\*) . $file ;; *) . ./$file ;; esac # Transform arg to wrapped name. file="$progdir/$program" fi ;; esac # Quote arguments (to preserve shell metacharacters). file=`$echo "X$file" | $Xsed -e "$sed_quote_subst"` args="$args \"$file\"" done if test -z "$run"; then if test -n "$shlibpath_var"; then # Export the shlibpath_var. eval "export $shlibpath_var" fi # Restore saved environment variables for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES do eval "if test \"\${save_$lt_var+set}\" = set; then $lt_var=\$save_$lt_var; export $lt_var fi" done # Now prepare to actually exec the command. exec_cmd="\$cmd$args" else # Display what would be done. if test -n "$shlibpath_var"; then eval "\$echo \"\$shlibpath_var=\$$shlibpath_var\"" $echo "export $shlibpath_var" fi $echo "$cmd$args" exit $EXIT_SUCCESS fi ;; # libtool clean and uninstall mode clean | uninstall) modename="$modename: $mode" rm="$nonopt" files= rmforce= exit_status=0 # This variable tells wrapper scripts just to set variables rather # than running their programs. libtool_install_magic="$magic" for arg do case $arg in -f) rm="$rm $arg"; rmforce=yes ;; -*) rm="$rm $arg" ;; *) files="$files $arg" ;; esac done if test -z "$rm"; then $echo "$modename: you must specify an RM program" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE fi rmdirs= origobjdir="$objdir" for file in $files; do dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` if test "X$dir" = "X$file"; then dir=. objdir="$origobjdir" else objdir="$dir/$origobjdir" fi name=`$echo "X$file" | $Xsed -e 's%^.*/%%'` test "$mode" = uninstall && objdir="$dir" # Remember objdir for removal later, being careful to avoid duplicates if test "$mode" = clean; then case " $rmdirs " in *" $objdir "*) ;; *) rmdirs="$rmdirs $objdir" ;; esac fi # Don't error if the file doesn't exist and rm -f was used. if (test -L "$file") >/dev/null 2>&1 \ || (test -h "$file") >/dev/null 2>&1 \ || test -f "$file"; then : elif test -d "$file"; then exit_status=1 continue elif test "$rmforce" = yes; then continue fi rmfiles="$file" case $name in *.la) # Possibly a libtool archive, so verify it. if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then . $dir/$name # Delete the libtool libraries and symlinks. for n in $library_names; do rmfiles="$rmfiles $objdir/$n" done test -n "$old_library" && rmfiles="$rmfiles $objdir/$old_library" case "$mode" in clean) case " $library_names " in # " " in the beginning catches empty $dlname *" $dlname "*) ;; *) rmfiles="$rmfiles $objdir/$dlname" ;; esac test -n "$libdir" && rmfiles="$rmfiles $objdir/$name $objdir/${name}i" ;; uninstall) if test -n "$library_names"; then # Do each command in the postuninstall commands. cmds=$postuninstall_cmds save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" eval cmd=\"$cmd\" $show "$cmd" $run eval "$cmd" if test "$?" -ne 0 && test "$rmforce" != yes; then exit_status=1 fi done IFS="$save_ifs" fi if test -n "$old_library"; then # Do each command in the old_postuninstall commands. cmds=$old_postuninstall_cmds save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" eval cmd=\"$cmd\" $show "$cmd" $run eval "$cmd" if test "$?" -ne 0 && test "$rmforce" != yes; then exit_status=1 fi done IFS="$save_ifs" fi # FIXME: should reinstall the best remaining shared library. ;; esac fi ;; *.lo) # Possibly a libtool object, so verify it. if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then # Read the .lo file . $dir/$name # Add PIC object to the list of files to remove. if test -n "$pic_object" \ && test "$pic_object" != none; then rmfiles="$rmfiles $dir/$pic_object" fi # Add non-PIC object to the list of files to remove. if test -n "$non_pic_object" \ && test "$non_pic_object" != none; then rmfiles="$rmfiles $dir/$non_pic_object" fi fi ;; *) if test "$mode" = clean ; then noexename=$name case $file in *.exe) file=`$echo $file|${SED} 's,.exe$,,'` noexename=`$echo $name|${SED} 's,.exe$,,'` # $file with .exe has already been added to rmfiles, # add $file without .exe rmfiles="$rmfiles $file" ;; esac # Do a test to see if this is a libtool program. if (${SED} -e '4q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then relink_command= . $dir/$noexename # note $name still contains .exe if it was in $file originally # as does the version of $file that was added into $rmfiles rmfiles="$rmfiles $objdir/$name $objdir/${name}S.${objext}" if test "$fast_install" = yes && test -n "$relink_command"; then rmfiles="$rmfiles $objdir/lt-$name" fi if test "X$noexename" != "X$name" ; then rmfiles="$rmfiles $objdir/lt-${noexename}.c" fi fi fi ;; esac $show "$rm $rmfiles" $run $rm $rmfiles || exit_status=1 done objdir="$origobjdir" # Try to remove the ${objdir}s in the directories where we deleted files for dir in $rmdirs; do if test -d "$dir"; then $show "rmdir $dir" $run rmdir $dir >/dev/null 2>&1 fi done exit $exit_status ;; "") $echo "$modename: you must specify a MODE" 1>&2 $echo "$generic_help" 1>&2 exit $EXIT_FAILURE ;; esac if test -z "$exec_cmd"; then $echo "$modename: invalid operation mode \`$mode'" 1>&2 $echo "$generic_help" 1>&2 exit $EXIT_FAILURE fi fi # test -z "$show_help" if test -n "$exec_cmd"; then eval exec $exec_cmd exit $EXIT_FAILURE fi # We need to display help for each of the modes. case $mode in "") $echo \ "Usage: $modename [OPTION]... [MODE-ARG]... Provide generalized library-building support services. --config show all configuration variables --debug enable verbose shell tracing -n, --dry-run display commands without modifying any files --features display basic configuration information and exit --finish same as \`--mode=finish' --help display this help message and exit --mode=MODE use operation mode MODE [default=inferred from MODE-ARGS] --quiet same as \`--silent' --silent don't print informational messages --tag=TAG use configuration variables from tag TAG --version print version information MODE must be one of the following: clean remove files from the build directory compile compile a source file into a libtool object execute automatically set library path, then run a program finish complete the installation of libtool libraries install install libraries or executables link create a library or an executable uninstall remove libraries from an installed directory MODE-ARGS vary depending on the MODE. Try \`$modename --help --mode=MODE' for a more detailed description of MODE. Report bugs to ." exit $EXIT_SUCCESS ;; clean) $echo \ "Usage: $modename [OPTION]... --mode=clean RM [RM-OPTION]... FILE... Remove files from the build directory. RM is the name of the program to use to delete files associated with each FILE (typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed to RM. If FILE is a libtool library, object or program, all the files associated with it are deleted. Otherwise, only FILE itself is deleted using RM." ;; compile) $echo \ "Usage: $modename [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE Compile a source file into a libtool library object. This mode accepts the following additional options: -o OUTPUT-FILE set the output file name to OUTPUT-FILE -prefer-pic try to building PIC objects only -prefer-non-pic try to building non-PIC objects only -static always build a \`.o' file suitable for static linking COMPILE-COMMAND is a command to be used in creating a \`standard' object file from the given SOURCEFILE. The output file name is determined by removing the directory component from SOURCEFILE, then substituting the C source code suffix \`.c' with the library object suffix, \`.lo'." ;; execute) $echo \ "Usage: $modename [OPTION]... --mode=execute COMMAND [ARGS]... Automatically set library path, then run a program. This mode accepts the following additional options: -dlopen FILE add the directory containing FILE to the library path This mode sets the library path environment variable according to \`-dlopen' flags. If any of the ARGS are libtool executable wrappers, then they are translated into their corresponding uninstalled binary, and any of their required library directories are added to the library path. Then, COMMAND is executed, with ARGS as arguments." ;; finish) $echo \ "Usage: $modename [OPTION]... --mode=finish [LIBDIR]... Complete the installation of libtool libraries. Each LIBDIR is a directory that contains libtool libraries. The commands that this mode executes may require superuser privileges. Use the \`--dry-run' option if you just want to see what would be executed." ;; install) $echo \ "Usage: $modename [OPTION]... --mode=install INSTALL-COMMAND... Install executables or libraries. INSTALL-COMMAND is the installation command. The first component should be either the \`install' or \`cp' program. The rest of the components are interpreted as arguments to that command (only BSD-compatible install options are recognized)." ;; link) $echo \ "Usage: $modename [OPTION]... --mode=link LINK-COMMAND... Link object files or libraries together to form another library, or to create an executable program. LINK-COMMAND is a command using the C compiler that you would use to create a program from several object files. The following components of LINK-COMMAND are treated specially: -all-static do not do any dynamic linking at all -avoid-version do not add a version suffix if possible -dlopen FILE \`-dlpreopen' FILE if it cannot be dlopened at runtime -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3) -export-symbols SYMFILE try to export only the symbols listed in SYMFILE -export-symbols-regex REGEX try to export only the symbols matching REGEX -LLIBDIR search LIBDIR for required installed libraries -lNAME OUTPUT-FILE requires the installed library libNAME -module build a library that can dlopened -no-fast-install disable the fast-install mode -no-install link a not-installable executable -no-undefined declare that a library does not refer to external symbols -o OUTPUT-FILE create OUTPUT-FILE from the specified objects -objectlist FILE Use a list of object files found in FILE to specify objects -precious-files-regex REGEX don't remove output files matching REGEX -release RELEASE specify package release information -rpath LIBDIR the created library will eventually be installed in LIBDIR -R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries -static do not do any dynamic linking of uninstalled libtool libraries -static-libtool-libs do not do any dynamic linking of libtool libraries -version-info CURRENT[:REVISION[:AGE]] specify library version info [each variable defaults to 0] All other options (arguments beginning with \`-') are ignored. Every other argument is treated as a filename. Files ending in \`.la' are treated as uninstalled libtool libraries, other files are standard or library object files. If the OUTPUT-FILE ends in \`.la', then a libtool library is created, only library objects (\`.lo' files) may be specified, and \`-rpath' is required, except when creating a convenience library. If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created using \`ar' and \`ranlib', or on Windows using \`lib'. If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file is created, otherwise an executable program is created." ;; uninstall) $echo \ "Usage: $modename [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE... Remove libraries from an installation directory. RM is the name of the program to use to delete files associated with each FILE (typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed to RM. If FILE is a libtool library, all the files associated with it are deleted. Otherwise, only FILE itself is deleted using RM." ;; *) $echo "$modename: invalid operation mode \`$mode'" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE ;; esac $echo $echo "Try \`$modename --help' for more information about other modes." exit $? # The TAGs below are defined such that we never get into a situation # in which we disable both kinds of libraries. Given conflicting # choices, we go for a static library, that is the most portable, # since we can't tell whether shared libraries were disabled because # the user asked for that or because the platform doesn't support # them. This is particularly important on AIX, because we don't # support having both static and shared libraries enabled at the same # time on that platform, so we default to a shared-only configuration. # If a disable-shared tag is given, we'll fallback to a static-only # configuration. But we'll never go from static-only to shared-only. # ### BEGIN LIBTOOL TAG CONFIG: disable-shared disable_libs=shared # ### END LIBTOOL TAG CONFIG: disable-shared # ### BEGIN LIBTOOL TAG CONFIG: disable-static disable_libs=static # ### END LIBTOOL TAG CONFIG: disable-static # Local Variables: # mode:shell-script # sh-indentation:2 # End: iaxmodem-1.2.0/lib/spandsp/config/config.guess0000755000175000017500000012753411150047202020662 0ustar julienjulien#! /bin/sh # Attempt to guess a canonical system name. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, # 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 # Free Software Foundation, Inc. timestamp='2008-01-23' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA # 02110-1301, USA. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Originally written by Per Bothner . # Please send patches to . Submit a context # diff and a properly formatted ChangeLog entry. # # This script attempts to guess a canonical system name similar to # config.sub. If it succeeds, it prints the system name on stdout, and # exits with 0. Otherwise, it exits with 1. # # The plan is that this can be called by configure scripts if you # don't specify an explicit build system type. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] Output the configuration name of the system \`$me' is run on. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" >&2 exit 1 ;; * ) break ;; esac done if test $# != 0; then echo "$me: too many arguments$help" >&2 exit 1 fi trap 'exit 1' 1 2 15 # CC_FOR_BUILD -- compiler used by this script. Note that the use of a # compiler to aid in system detection is discouraged as it requires # temporary files to be created and, as you can see below, it is a # headache to deal with in a portable fashion. # Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still # use `HOST_CC' if defined, but it is deprecated. # Portable tmp directory creation inspired by the Autoconf team. set_cc_for_build=' trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; : ${TMPDIR=/tmp} ; { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; dummy=$tmp/dummy ; tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; case $CC_FOR_BUILD,$HOST_CC,$CC in ,,) echo "int x;" > $dummy.c ; for c in cc gcc c89 c99 ; do if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then CC_FOR_BUILD="$c"; break ; fi ; done ; if test x"$CC_FOR_BUILD" = x ; then CC_FOR_BUILD=no_compiler_found ; fi ;; ,,*) CC_FOR_BUILD=$CC ;; ,*,*) CC_FOR_BUILD=$HOST_CC ;; esac ; set_cc_for_build= ;' # This is needed to find uname on a Pyramid OSx when run in the BSD universe. # (ghazi@noc.rutgers.edu 1994-08-24) if (test -f /.attbin/uname) >/dev/null 2>&1 ; then PATH=$PATH:/.attbin ; export PATH fi UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown # Note: order is significant - the case branches are not exclusive. case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in *:NetBSD:*:*) # NetBSD (nbsd) targets should (where applicable) match one or # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*, # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently # switched to ELF, *-*-netbsd* would select the old # object file format. This provides both forward # compatibility and a consistent mechanism for selecting the # object file format. # # Note: NetBSD doesn't particularly care about the vendor # portion of the name. We always set it to "unknown". sysctl="sysctl -n hw.machine_arch" UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ /usr/sbin/$sysctl 2>/dev/null || echo unknown)` case "${UNAME_MACHINE_ARCH}" in armeb) machine=armeb-unknown ;; arm*) machine=arm-unknown ;; sh3el) machine=shl-unknown ;; sh3eb) machine=sh-unknown ;; sh5el) machine=sh5le-unknown ;; *) machine=${UNAME_MACHINE_ARCH}-unknown ;; esac # The Operating System including object format, if it has switched # to ELF recently, or will in the future. case "${UNAME_MACHINE_ARCH}" in arm*|i386|m68k|ns32k|sh3*|sparc|vax) eval $set_cc_for_build if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep __ELF__ >/dev/null then # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). # Return netbsd for either. FIX? os=netbsd else os=netbsdelf fi ;; *) os=netbsd ;; esac # The OS release # Debian GNU/NetBSD machines have a different userland, and # thus, need a distinct triplet. However, they do not need # kernel version information, so it can be replaced with a # suitable tag, in the style of linux-gnu. case "${UNAME_VERSION}" in Debian*) release='-gnu' ;; *) release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` ;; esac # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: # contains redundant information, the shorter form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. echo "${machine}-${os}${release}" exit ;; *:OpenBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} exit ;; *:ekkoBSD:*:*) echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} exit ;; *:SolidBSD:*:*) echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} exit ;; macppc:MirBSD:*:*) echo powerpc-unknown-mirbsd${UNAME_RELEASE} exit ;; *:MirBSD:*:*) echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} exit ;; alpha:OSF1:*:*) case $UNAME_RELEASE in *4.0) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` ;; *5.*) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` ;; esac # According to Compaq, /usr/sbin/psrinfo has been available on # OSF/1 and Tru64 systems produced since 1995. I hope that # covers most systems running today. This code pipes the CPU # types through head -n 1, so we only detect the type of CPU 0. ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` case "$ALPHA_CPU_TYPE" in "EV4 (21064)") UNAME_MACHINE="alpha" ;; "EV4.5 (21064)") UNAME_MACHINE="alpha" ;; "LCA4 (21066/21068)") UNAME_MACHINE="alpha" ;; "EV5 (21164)") UNAME_MACHINE="alphaev5" ;; "EV5.6 (21164A)") UNAME_MACHINE="alphaev56" ;; "EV5.6 (21164PC)") UNAME_MACHINE="alphapca56" ;; "EV5.7 (21164PC)") UNAME_MACHINE="alphapca57" ;; "EV6 (21264)") UNAME_MACHINE="alphaev6" ;; "EV6.7 (21264A)") UNAME_MACHINE="alphaev67" ;; "EV6.8CB (21264C)") UNAME_MACHINE="alphaev68" ;; "EV6.8AL (21264B)") UNAME_MACHINE="alphaev68" ;; "EV6.8CX (21264D)") UNAME_MACHINE="alphaev68" ;; "EV6.9A (21264/EV69A)") UNAME_MACHINE="alphaev69" ;; "EV7 (21364)") UNAME_MACHINE="alphaev7" ;; "EV7.9 (21364A)") UNAME_MACHINE="alphaev79" ;; esac # A Pn.n version is a patched version. # A Vn.n version is a released version. # A Tn.n version is a released field test version. # A Xn.n version is an unreleased experimental baselevel. # 1.2 uses "1.2" for uname -r. echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` exit ;; Alpha\ *:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # Should we change UNAME_MACHINE based on the output of uname instead # of the specific Alpha model? echo alpha-pc-interix exit ;; 21064:Windows_NT:50:3) echo alpha-dec-winnt3.5 exit ;; Amiga*:UNIX_System_V:4.0:*) echo m68k-unknown-sysv4 exit ;; *:[Aa]miga[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-amigaos exit ;; *:[Mm]orph[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-morphos exit ;; *:OS/390:*:*) echo i370-ibm-openedition exit ;; *:z/VM:*:*) echo s390-ibm-zvmoe exit ;; *:OS400:*:*) echo powerpc-ibm-os400 exit ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) echo arm-acorn-riscix${UNAME_RELEASE} exit ;; arm:riscos:*:*|arm:RISCOS:*:*) echo arm-unknown-riscos exit ;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) echo hppa1.1-hitachi-hiuxmpp exit ;; Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. if test "`(/bin/universe) 2>/dev/null`" = att ; then echo pyramid-pyramid-sysv3 else echo pyramid-pyramid-bsd fi exit ;; NILE*:*:*:dcosx) echo pyramid-pyramid-svr4 exit ;; DRS?6000:unix:4.0:6*) echo sparc-icl-nx6 exit ;; DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) case `/usr/bin/uname -p` in sparc) echo sparc-icl-nx7; exit ;; esac ;; sun4H:SunOS:5.*:*) echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:6*:*) # According to config.sub, this is the proper way to canonicalize # SunOS6. Hard to guess exactly what SunOS6 will be like, but # it's likely to be more like Solaris than SunOS4. echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:*:*) case "`/usr/bin/arch -k`" in Series*|S4*) UNAME_RELEASE=`uname -v` ;; esac # Japanese Language versions have a version number like `4.1.3-JL'. echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` exit ;; sun3*:SunOS:*:*) echo m68k-sun-sunos${UNAME_RELEASE} exit ;; sun*:*:4.2BSD:*) UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 case "`/bin/arch`" in sun3) echo m68k-sun-sunos${UNAME_RELEASE} ;; sun4) echo sparc-sun-sunos${UNAME_RELEASE} ;; esac exit ;; aushp:SunOS:*:*) echo sparc-auspex-sunos${UNAME_RELEASE} exit ;; # The situation for MiNT is a little confusing. The machine name # can be virtually everything (everything which is not # "atarist" or "atariste" at least should have a processor # > m68000). The system name ranges from "MiNT" over "FreeMiNT" # to the lowercase version "mint" (or "freemint"). Finally # the system name "TOS" denotes a system which is actually not # MiNT. But MiNT is downward compatible to TOS, so this should # be no problem. atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) echo m68k-milan-mint${UNAME_RELEASE} exit ;; hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) echo m68k-hades-mint${UNAME_RELEASE} exit ;; *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) echo m68k-unknown-mint${UNAME_RELEASE} exit ;; m68k:machten:*:*) echo m68k-apple-machten${UNAME_RELEASE} exit ;; powerpc:machten:*:*) echo powerpc-apple-machten${UNAME_RELEASE} exit ;; RISC*:Mach:*:*) echo mips-dec-mach_bsd4.3 exit ;; RISC*:ULTRIX:*:*) echo mips-dec-ultrix${UNAME_RELEASE} exit ;; VAX*:ULTRIX*:*:*) echo vax-dec-ultrix${UNAME_RELEASE} exit ;; 2020:CLIX:*:* | 2430:CLIX:*:*) echo clipper-intergraph-clix${UNAME_RELEASE} exit ;; mips:*:*:UMIPS | mips:*:*:RISCos) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #ifdef __cplusplus #include /* for printf() prototype */ int main (int argc, char *argv[]) { #else int main (argc, argv) int argc; char *argv[]; { #endif #if defined (host_mips) && defined (MIPSEB) #if defined (SYSTYPE_SYSV) printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_SVR4) printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); #endif #endif exit (-1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && SYSTEM_NAME=`$dummy $dummyarg` && { echo "$SYSTEM_NAME"; exit; } echo mips-mips-riscos${UNAME_RELEASE} exit ;; Motorola:PowerMAX_OS:*:*) echo powerpc-motorola-powermax exit ;; Motorola:*:4.3:PL8-*) echo powerpc-harris-powermax exit ;; Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) echo powerpc-harris-powermax exit ;; Night_Hawk:Power_UNIX:*:*) echo powerpc-harris-powerunix exit ;; m88k:CX/UX:7*:*) echo m88k-harris-cxux7 exit ;; m88k:*:4*:R4*) echo m88k-motorola-sysv4 exit ;; m88k:*:3*:R3*) echo m88k-motorola-sysv3 exit ;; AViiON:dgux:*:*) # DG/UX returns AViiON for all architectures UNAME_PROCESSOR=`/usr/bin/uname -p` if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] then if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ [ ${TARGET_BINARY_INTERFACE}x = x ] then echo m88k-dg-dgux${UNAME_RELEASE} else echo m88k-dg-dguxbcs${UNAME_RELEASE} fi else echo i586-dg-dgux${UNAME_RELEASE} fi exit ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) echo m88k-dolphin-sysv3 exit ;; M88*:*:R3*:*) # Delta 88k system running SVR3 echo m88k-motorola-sysv3 exit ;; XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) echo m88k-tektronix-sysv3 exit ;; Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) echo m68k-tektronix-bsd exit ;; *:IRIX*:*:*) echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` exit ;; ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' i*86:AIX:*:*) echo i386-ibm-aix exit ;; ia64:AIX:*:*) if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} exit ;; *:AIX:2:3) if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include main() { if (!__power_pc()) exit(1); puts("powerpc-ibm-aix3.2.5"); exit(0); } EOF if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` then echo "$SYSTEM_NAME" else echo rs6000-ibm-aix3.2.5 fi elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then echo rs6000-ibm-aix3.2.4 else echo rs6000-ibm-aix3.2 fi exit ;; *:AIX:*:[456]) IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then IBM_ARCH=rs6000 else IBM_ARCH=powerpc fi if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${IBM_ARCH}-ibm-aix${IBM_REV} exit ;; *:AIX:*:*) echo rs6000-ibm-aix exit ;; ibmrt:4.4BSD:*|romp-ibm:BSD:*) echo romp-ibm-bsd4.4 exit ;; ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to exit ;; # report: romp-ibm BSD 4.3 *:BOSX:*:*) echo rs6000-bull-bosx exit ;; DPX/2?00:B.O.S.:*:*) echo m68k-bull-sysv3 exit ;; 9000/[34]??:4.3bsd:1.*:*) echo m68k-hp-bsd exit ;; hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) echo m68k-hp-bsd4.4 exit ;; 9000/[34678]??:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` case "${UNAME_MACHINE}" in 9000/31? ) HP_ARCH=m68000 ;; 9000/[34]?? ) HP_ARCH=m68k ;; 9000/[678][0-9][0-9]) if [ -x /usr/bin/getconf ]; then sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` case "${sc_cpu_version}" in 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 532) # CPU_PA_RISC2_0 case "${sc_kernel_bits}" in 32) HP_ARCH="hppa2.0n" ;; 64) HP_ARCH="hppa2.0w" ;; '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 esac ;; esac fi if [ "${HP_ARCH}" = "" ]; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #define _HPUX_SOURCE #include #include int main () { #if defined(_SC_KERNEL_BITS) long bits = sysconf(_SC_KERNEL_BITS); #endif long cpu = sysconf (_SC_CPU_VERSION); switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0"); break; case CPU_PA_RISC1_1: puts ("hppa1.1"); break; case CPU_PA_RISC2_0: #if defined(_SC_KERNEL_BITS) switch (bits) { case 64: puts ("hppa2.0w"); break; case 32: puts ("hppa2.0n"); break; default: puts ("hppa2.0"); break; } break; #else /* !defined(_SC_KERNEL_BITS) */ puts ("hppa2.0"); break; #endif default: puts ("hppa1.0"); break; } exit (0); } EOF (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` test -z "$HP_ARCH" && HP_ARCH=hppa fi ;; esac if [ ${HP_ARCH} = "hppa2.0w" ] then eval $set_cc_for_build # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler # generating 64-bit code. GNU and HP use different nomenclature: # # $ CC_FOR_BUILD=cc ./config.guess # => hppa2.0w-hp-hpux11.23 # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess # => hppa64-hp-hpux11.23 if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | grep __LP64__ >/dev/null then HP_ARCH="hppa2.0w" else HP_ARCH="hppa64" fi fi echo ${HP_ARCH}-hp-hpux${HPUX_REV} exit ;; ia64:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` echo ia64-hp-hpux${HPUX_REV} exit ;; 3050*:HI-UX:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include int main () { long cpu = sysconf (_SC_CPU_VERSION); /* The order matters, because CPU_IS_HP_MC68K erroneously returns true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct results, however. */ if (CPU_IS_PA_RISC (cpu)) { switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; default: puts ("hppa-hitachi-hiuxwe2"); break; } } else if (CPU_IS_HP_MC68K (cpu)) puts ("m68k-hitachi-hiuxwe2"); else puts ("unknown-hitachi-hiuxwe2"); exit (0); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } echo unknown-hitachi-hiuxwe2 exit ;; 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) echo hppa1.1-hp-bsd exit ;; 9000/8??:4.3bsd:*:*) echo hppa1.0-hp-bsd exit ;; *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) echo hppa1.0-hp-mpeix exit ;; hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) echo hppa1.1-hp-osf exit ;; hp8??:OSF1:*:*) echo hppa1.0-hp-osf exit ;; i*86:OSF1:*:*) if [ -x /usr/sbin/sysversion ] ; then echo ${UNAME_MACHINE}-unknown-osf1mk else echo ${UNAME_MACHINE}-unknown-osf1 fi exit ;; parisc*:Lites*:*:*) echo hppa1.1-hp-lites exit ;; C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) echo c1-convex-bsd exit ;; C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) echo c34-convex-bsd exit ;; C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) echo c38-convex-bsd exit ;; C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) echo c4-convex-bsd exit ;; CRAY*Y-MP:*:*:*) echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*[A-Z]90:*:*:*) echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ -e 's/\.[^.]*$/.X/' exit ;; CRAY*TS:*:*:*) echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*T3E:*:*:*) echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*SV1:*:*:*) echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; *:UNICOS/mp:*:*) echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; 5000:UNIX_System_V:4.*:*) FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} exit ;; sparc*:BSD/OS:*:*) echo sparc-unknown-bsdi${UNAME_RELEASE} exit ;; *:BSD/OS:*:*) echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} exit ;; *:FreeBSD:*:*) case ${UNAME_MACHINE} in pc98) echo i386-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; amd64) echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; *) echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; esac exit ;; i*:CYGWIN*:*) echo ${UNAME_MACHINE}-pc-cygwin exit ;; *:MINGW*:*) echo ${UNAME_MACHINE}-pc-mingw32 exit ;; i*:windows32*:*) # uname -m includes "-pc" on this system. echo ${UNAME_MACHINE}-mingw32 exit ;; i*:PW*:*) echo ${UNAME_MACHINE}-pc-pw32 exit ;; *:Interix*:[3456]*) case ${UNAME_MACHINE} in x86) echo i586-pc-interix${UNAME_RELEASE} exit ;; EM64T | authenticamd) echo x86_64-unknown-interix${UNAME_RELEASE} exit ;; IA64) echo ia64-unknown-interix${UNAME_RELEASE} exit ;; esac ;; [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) echo i${UNAME_MACHINE}-pc-mks exit ;; i*:Windows_NT*:* | Pentium*:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we # UNAME_MACHINE based on the output of uname instead of i386? echo i586-pc-interix exit ;; i*:UWIN*:*) echo ${UNAME_MACHINE}-pc-uwin exit ;; amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) echo x86_64-unknown-cygwin exit ;; p*:CYGWIN*:*) echo powerpcle-unknown-cygwin exit ;; prep*:SunOS:5.*:*) echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; *:GNU:*:*) # the GNU system echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` exit ;; *:GNU/*:*:*) # other systems with GNU libc and userland echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu exit ;; i*86:Minix:*:*) echo ${UNAME_MACHINE}-pc-minix exit ;; arm*:Linux:*:*) eval $set_cc_for_build if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_EABI__ then echo ${UNAME_MACHINE}-unknown-linux-gnu else echo ${UNAME_MACHINE}-unknown-linux-gnueabi fi exit ;; avr32*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; cris:Linux:*:*) echo cris-axis-linux-gnu exit ;; crisv32:Linux:*:*) echo crisv32-axis-linux-gnu exit ;; frv:Linux:*:*) echo frv-unknown-linux-gnu exit ;; ia64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; m32r*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; m68*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; mips:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #undef CPU #undef mips #undef mipsel #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=mipsel #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=mips #else CPU= #endif #endif EOF eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n ' /^CPU/{ s: ::g p }'`" test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } ;; mips64:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #undef CPU #undef mips64 #undef mips64el #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=mips64el #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=mips64 #else CPU= #endif #endif EOF eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n ' /^CPU/{ s: ::g p }'`" test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } ;; or32:Linux:*:*) echo or32-unknown-linux-gnu exit ;; ppc:Linux:*:*) echo powerpc-unknown-linux-gnu exit ;; ppc64:Linux:*:*) echo powerpc64-unknown-linux-gnu exit ;; alpha:Linux:*:*) case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in EV5) UNAME_MACHINE=alphaev5 ;; EV56) UNAME_MACHINE=alphaev56 ;; PCA56) UNAME_MACHINE=alphapca56 ;; PCA57) UNAME_MACHINE=alphapca56 ;; EV6) UNAME_MACHINE=alphaev6 ;; EV67) UNAME_MACHINE=alphaev67 ;; EV68*) UNAME_MACHINE=alphaev68 ;; esac objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} exit ;; parisc:Linux:*:* | hppa:Linux:*:*) # Look for CPU level case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in PA7*) echo hppa1.1-unknown-linux-gnu ;; PA8*) echo hppa2.0-unknown-linux-gnu ;; *) echo hppa-unknown-linux-gnu ;; esac exit ;; parisc64:Linux:*:* | hppa64:Linux:*:*) echo hppa64-unknown-linux-gnu exit ;; s390:Linux:*:* | s390x:Linux:*:*) echo ${UNAME_MACHINE}-ibm-linux exit ;; sh64*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; sh*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; sparc:Linux:*:* | sparc64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; vax:Linux:*:*) echo ${UNAME_MACHINE}-dec-linux-gnu exit ;; x86_64:Linux:*:*) echo x86_64-unknown-linux-gnu exit ;; xtensa*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; i*86:Linux:*:*) # The BFD linker knows what the default object file format is, so # first see if it will tell us. cd to the root directory to prevent # problems with other programs or directories called `ld' in the path. # Set LC_ALL=C to ensure ld outputs messages in English. ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \ | sed -ne '/supported targets:/!d s/[ ][ ]*/ /g s/.*supported targets: *// s/ .*// p'` case "$ld_supported_targets" in elf32-i386) TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu" ;; a.out-i386-linux) echo "${UNAME_MACHINE}-pc-linux-gnuaout" exit ;; coff-i386) echo "${UNAME_MACHINE}-pc-linux-gnucoff" exit ;; "") # Either a pre-BFD a.out linker (linux-gnuoldld) or # one that does not give us useful --help. echo "${UNAME_MACHINE}-pc-linux-gnuoldld" exit ;; esac # Determine whether the default compiler is a.out or elf eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include #ifdef __ELF__ # ifdef __GLIBC__ # if __GLIBC__ >= 2 LIBC=gnu # else LIBC=gnulibc1 # endif # else LIBC=gnulibc1 # endif #else #if defined(__INTEL_COMPILER) || defined(__PGI) || defined(__SUNPRO_C) || defined(__SUNPRO_CC) LIBC=gnu #else LIBC=gnuaout #endif #endif #ifdef __dietlibc__ LIBC=dietlibc #endif EOF eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n ' /^LIBC/{ s: ::g p }'`" test x"${LIBC}" != x && { echo "${UNAME_MACHINE}-pc-linux-${LIBC}" exit } test x"${TENTATIVE}" != x && { echo "${TENTATIVE}"; exit; } ;; i*86:DYNIX/ptx:4*:*) # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. # earlier versions are messed up and put the nodename in both # sysname and nodename. echo i386-sequent-sysv4 exit ;; i*86:UNIX_SV:4.2MP:2.*) # Unixware is an offshoot of SVR4, but it has its own version # number series starting with 2... # I am not positive that other SVR4 systems won't match this, # I just have to hope. -- rms. # Use sysv4.2uw... so that sysv4* matches it. echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} exit ;; i*86:OS/2:*:*) # If we were able to find `uname', then EMX Unix compatibility # is probably installed. echo ${UNAME_MACHINE}-pc-os2-emx exit ;; i*86:XTS-300:*:STOP) echo ${UNAME_MACHINE}-unknown-stop exit ;; i*86:atheos:*:*) echo ${UNAME_MACHINE}-unknown-atheos exit ;; i*86:syllable:*:*) echo ${UNAME_MACHINE}-pc-syllable exit ;; i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*) echo i386-unknown-lynxos${UNAME_RELEASE} exit ;; i*86:*DOS:*:*) echo ${UNAME_MACHINE}-pc-msdosdjgpp exit ;; i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} else echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} fi exit ;; i*86:*:5:[678]*) # UnixWare 7.x, OpenUNIX and OpenServer 6. case `/bin/uname -X | grep "^Machine"` in *486*) UNAME_MACHINE=i486 ;; *Pentium) UNAME_MACHINE=i586 ;; *Pent*|*Celeron) UNAME_MACHINE=i686 ;; esac echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} exit ;; i*86:*:3.2:*) if test -f /usr/options/cb.name; then UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ && UNAME_MACHINE=i586 (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ && UNAME_MACHINE=i686 (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ && UNAME_MACHINE=i686 echo ${UNAME_MACHINE}-pc-sco$UNAME_REL else echo ${UNAME_MACHINE}-pc-sysv32 fi exit ;; pc:*:*:*) # Left here for compatibility: # uname -m prints for DJGPP always 'pc', but it prints nothing about # the processor, so we play safe by assuming i386. echo i386-pc-msdosdjgpp exit ;; Intel:Mach:3*:*) echo i386-pc-mach3 exit ;; paragon:*:*:*) echo i860-intel-osf1 exit ;; i860:*:4.*:*) # i860-SVR4 if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 else # Add other i860-SVR4 vendors below as they are discovered. echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 fi exit ;; mini*:CTIX:SYS*5:*) # "miniframe" echo m68010-convergent-sysv exit ;; mc68k:UNIX:SYSTEM5:3.51m) echo m68k-convergent-sysv exit ;; M680?0:D-NIX:5.3:*) echo m68k-diab-dnix exit ;; M68*:*:R3V[5678]*:*) test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) OS_REL='' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4; exit; } ;; m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) echo m68k-unknown-lynxos${UNAME_RELEASE} exit ;; mc68030:UNIX_System_V:4.*:*) echo m68k-atari-sysv4 exit ;; TSUNAMI:LynxOS:2.*:*) echo sparc-unknown-lynxos${UNAME_RELEASE} exit ;; rs6000:LynxOS:2.*:*) echo rs6000-unknown-lynxos${UNAME_RELEASE} exit ;; PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*) echo powerpc-unknown-lynxos${UNAME_RELEASE} exit ;; SM[BE]S:UNIX_SV:*:*) echo mips-dde-sysv${UNAME_RELEASE} exit ;; RM*:ReliantUNIX-*:*:*) echo mips-sni-sysv4 exit ;; RM*:SINIX-*:*:*) echo mips-sni-sysv4 exit ;; *:SINIX-*:*:*) if uname -p 2>/dev/null >/dev/null ; then UNAME_MACHINE=`(uname -p) 2>/dev/null` echo ${UNAME_MACHINE}-sni-sysv4 else echo ns32k-sni-sysv fi exit ;; PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort # says echo i586-unisys-sysv4 exit ;; *:UNIX_System_V:4*:FTX*) # From Gerald Hewes . # How about differentiating between stratus architectures? -djm echo hppa1.1-stratus-sysv4 exit ;; *:*:*:FTX*) # From seanf@swdc.stratus.com. echo i860-stratus-sysv4 exit ;; i*86:VOS:*:*) # From Paul.Green@stratus.com. echo ${UNAME_MACHINE}-stratus-vos exit ;; *:VOS:*:*) # From Paul.Green@stratus.com. echo hppa1.1-stratus-vos exit ;; mc68*:A/UX:*:*) echo m68k-apple-aux${UNAME_RELEASE} exit ;; news*:NEWS-OS:6*:*) echo mips-sony-newsos6 exit ;; R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) if [ -d /usr/nec ]; then echo mips-nec-sysv${UNAME_RELEASE} else echo mips-unknown-sysv${UNAME_RELEASE} fi exit ;; BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. echo powerpc-be-beos exit ;; BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. echo powerpc-apple-beos exit ;; BePC:BeOS:*:*) # BeOS running on Intel PC compatible. echo i586-pc-beos exit ;; SX-4:SUPER-UX:*:*) echo sx4-nec-superux${UNAME_RELEASE} exit ;; SX-5:SUPER-UX:*:*) echo sx5-nec-superux${UNAME_RELEASE} exit ;; SX-6:SUPER-UX:*:*) echo sx6-nec-superux${UNAME_RELEASE} exit ;; SX-7:SUPER-UX:*:*) echo sx7-nec-superux${UNAME_RELEASE} exit ;; SX-8:SUPER-UX:*:*) echo sx8-nec-superux${UNAME_RELEASE} exit ;; SX-8R:SUPER-UX:*:*) echo sx8r-nec-superux${UNAME_RELEASE} exit ;; Power*:Rhapsody:*:*) echo powerpc-apple-rhapsody${UNAME_RELEASE} exit ;; *:Rhapsody:*:*) echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} exit ;; *:Darwin:*:*) UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown case $UNAME_PROCESSOR in unknown) UNAME_PROCESSOR=powerpc ;; esac echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} exit ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) UNAME_PROCESSOR=`uname -p` if test "$UNAME_PROCESSOR" = "x86"; then UNAME_PROCESSOR=i386 UNAME_MACHINE=pc fi echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} exit ;; *:QNX:*:4*) echo i386-pc-qnx exit ;; NSE-?:NONSTOP_KERNEL:*:*) echo nse-tandem-nsk${UNAME_RELEASE} exit ;; NSR-?:NONSTOP_KERNEL:*:*) echo nsr-tandem-nsk${UNAME_RELEASE} exit ;; *:NonStop-UX:*:*) echo mips-compaq-nonstopux exit ;; BS2000:POSIX*:*:*) echo bs2000-siemens-sysv exit ;; DS/*:UNIX_System_V:*:*) echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} exit ;; *:Plan9:*:*) # "uname -m" is not consistent, so use $cputype instead. 386 # is converted to i386 for consistency with other x86 # operating systems. if test "$cputype" = "386"; then UNAME_MACHINE=i386 else UNAME_MACHINE="$cputype" fi echo ${UNAME_MACHINE}-unknown-plan9 exit ;; *:TOPS-10:*:*) echo pdp10-unknown-tops10 exit ;; *:TENEX:*:*) echo pdp10-unknown-tenex exit ;; KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) echo pdp10-dec-tops20 exit ;; XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) echo pdp10-xkl-tops20 exit ;; *:TOPS-20:*:*) echo pdp10-unknown-tops20 exit ;; *:ITS:*:*) echo pdp10-unknown-its exit ;; SEI:*:*:SEIUX) echo mips-sei-seiux${UNAME_RELEASE} exit ;; *:DragonFly:*:*) echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` exit ;; *:*VMS:*:*) UNAME_MACHINE=`(uname -p) 2>/dev/null` case "${UNAME_MACHINE}" in A*) echo alpha-dec-vms ; exit ;; I*) echo ia64-dec-vms ; exit ;; V*) echo vax-dec-vms ; exit ;; esac ;; *:XENIX:*:SysV) echo i386-pc-xenix exit ;; i*86:skyos:*:*) echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' exit ;; i*86:rdos:*:*) echo ${UNAME_MACHINE}-pc-rdos exit ;; esac #echo '(No uname command or uname output not recognized.)' 1>&2 #echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 eval $set_cc_for_build cat >$dummy.c < # include #endif main () { #if defined (sony) #if defined (MIPSEB) /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, I don't know.... */ printf ("mips-sony-bsd\n"); exit (0); #else #include printf ("m68k-sony-newsos%s\n", #ifdef NEWSOS4 "4" #else "" #endif ); exit (0); #endif #endif #if defined (__arm) && defined (__acorn) && defined (__unix) printf ("arm-acorn-riscix\n"); exit (0); #endif #if defined (hp300) && !defined (hpux) printf ("m68k-hp-bsd\n"); exit (0); #endif #if defined (NeXT) #if !defined (__ARCHITECTURE__) #define __ARCHITECTURE__ "m68k" #endif int version; version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; if (version < 4) printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); else printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); exit (0); #endif #if defined (MULTIMAX) || defined (n16) #if defined (UMAXV) printf ("ns32k-encore-sysv\n"); exit (0); #else #if defined (CMU) printf ("ns32k-encore-mach\n"); exit (0); #else printf ("ns32k-encore-bsd\n"); exit (0); #endif #endif #endif #if defined (__386BSD__) printf ("i386-pc-bsd\n"); exit (0); #endif #if defined (sequent) #if defined (i386) printf ("i386-sequent-dynix\n"); exit (0); #endif #if defined (ns32000) printf ("ns32k-sequent-dynix\n"); exit (0); #endif #endif #if defined (_SEQUENT_) struct utsname un; uname(&un); if (strncmp(un.version, "V2", 2) == 0) { printf ("i386-sequent-ptx2\n"); exit (0); } if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ printf ("i386-sequent-ptx1\n"); exit (0); } printf ("i386-sequent-ptx\n"); exit (0); #endif #if defined (vax) # if !defined (ultrix) # include # if defined (BSD) # if BSD == 43 printf ("vax-dec-bsd4.3\n"); exit (0); # else # if BSD == 199006 printf ("vax-dec-bsd4.3reno\n"); exit (0); # else printf ("vax-dec-bsd\n"); exit (0); # endif # endif # else printf ("vax-dec-bsd\n"); exit (0); # endif # else printf ("vax-dec-ultrix\n"); exit (0); # endif #endif #if defined (alliant) && defined (i860) printf ("i860-alliant-bsd\n"); exit (0); #endif exit (1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } # Apollos put the system type in the environment. test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; } # Convex versions that predate uname can use getsysinfo(1) if [ -x /usr/convex/getsysinfo ] then case `getsysinfo -f cpu_type` in c1*) echo c1-convex-bsd exit ;; c2*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; c34*) echo c34-convex-bsd exit ;; c38*) echo c38-convex-bsd exit ;; c4*) echo c4-convex-bsd exit ;; esac fi cat >&2 < in order to provide the needed information to handle your system. config.guess timestamp = $timestamp uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` /bin/uname -X = `(/bin/uname -X) 2>/dev/null` hostinfo = `(hostinfo) 2>/dev/null` /bin/universe = `(/bin/universe) 2>/dev/null` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` /bin/arch = `(/bin/arch) 2>/dev/null` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` UNAME_MACHINE = ${UNAME_MACHINE} UNAME_RELEASE = ${UNAME_RELEASE} UNAME_SYSTEM = ${UNAME_SYSTEM} UNAME_VERSION = ${UNAME_VERSION} EOF exit 1 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: iaxmodem-1.2.0/lib/spandsp/unpack_v56ter_data.sh0000755000175000017500000000304111150047202021103 0ustar julienjulien#!/bin/sh # # SpanDSP - a series of DSP components for telephony # # unpack_v56ter_data.sh # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License version 2.1, # as published by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this program; if not, write to the Free Software # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. # # $Id: unpack_v56ter_data.sh,v 1.5 2008/05/03 07:55:04 steveu Exp $ # ITUDATA="../../../T-REC-V.56ter-199608-I!!ZPF-E.zip" cd test-data/itu if [ -d v56ter ] then cd v56ter else mkdir v56ter RETVAL=$? if [ $RETVAL != 0 ] then echo Cannot create test-data/itu/v56ter! exit $RETVAL fi cd v56ter fi rm -rf software rm -rf *.TST unzip ${ITUDATA} >/dev/null RETVAL=$? if [ $RETVAL != 0 ] then echo Cannot unpack the ITU test vectors for V.56ter! exit $RETVAL fi #rm ${ITUDATA} unzip software/V56ter/V56tere/Software.zip >/dev/null RETVAL=$? if [ $RETVAL != 0 ] then echo Cannot unpack the ITU test vectors for V.56ter! exit $RETVAL fi mv ./software/V56ter/V56tere/*.TST . chmod 644 *.TST rm -rf software echo The ITU test vectors for V.56ter should now be in the v56ter directory iaxmodem-1.2.0/lib/spandsp/Makefile.in0000644000175000017500000005403411150047457017150 0ustar julienjulien# Makefile.in generated by automake 1.9.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = . am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd INSTALL = @INSTALL@ install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in $(srcdir)/spandsp.spec.in \ $(top_srcdir)/configure AUTHORS COPYING ChangeLog INSTALL NEWS \ config/config.guess config/config.sub config/depcomp \ config/install-sh config/ltmain.sh config/missing subdir = . ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/config/ax_compiler_vendor.m4 \ $(top_srcdir)/config/ax_check_real_file.m4 \ $(top_srcdir)/config/ax_fixed_point_machine.m4 \ $(top_srcdir)/config/ax_misaligned_access_fails.m4 \ $(top_srcdir)/config/ax_c99_features.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ configure.lineno configure.status.lineno mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/src/config.h CONFIG_CLEAN_FILES = spandsp.spec SCRIPTS = $(noinst_SCRIPTS) SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-exec-recursive install-info-recursive \ install-recursive installcheck-recursive installdirs-recursive \ pdf-recursive ps-recursive uninstall-info-recursive \ uninstall-recursive ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) am__remove_distdir = \ { test ! -d $(distdir) \ || { find $(distdir) -type d ! -perm -200 -exec chmod u+w {} ';' \ && rm -fr $(distdir); }; } DIST_ARCHIVES = $(distdir).tar.gz GZIP_ENV = --best distuninstallcheck_listfiles = find . -type f -print distcleancheck_listfiles = find . -type f -print ACLOCAL = @ACLOCAL@ AMDEP_FALSE = @AMDEP_FALSE@ AMDEP_TRUE = @AMDEP_TRUE@ AMTAR = @AMTAR@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CC_FOR_BUILD = @CC_FOR_BUILD@ CFLAGS = @CFLAGS@ COMP_VENDOR_CFLAGS = @COMP_VENDOR_CFLAGS@ COMP_VENDOR_LDFLAGS = @COMP_VENDOR_LDFLAGS@ COND_DOC_FALSE = @COND_DOC_FALSE@ COND_DOC_TRUE = @COND_DOC_TRUE@ COND_MMX_FALSE = @COND_MMX_FALSE@ COND_MMX_TRUE = @COND_MMX_TRUE@ COND_SSE_FALSE = @COND_SSE_FALSE@ COND_SSE_TRUE = @COND_SSE_TRUE@ COND_TESTDATA_FALSE = @COND_TESTDATA_FALSE@ COND_TESTDATA_TRUE = @COND_TESTDATA_TRUE@ COND_TESTS_FALSE = @COND_TESTS_FALSE@ COND_TESTS_TRUE = @COND_TESTS_TRUE@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CPPFLAGS_FOR_BUILD = @CPPFLAGS_FOR_BUILD@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DSYMUTIL = @DSYMUTIL@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ GREP = @GREP@ INSERT_INTTYPES_HEADER = @INSERT_INTTYPES_HEADER@ INSERT_MATH_HEADER = @INSERT_MATH_HEADER@ INSERT_STDINT_HEADER = @INSERT_STDINT_HEADER@ INSERT_TGMATH_HEADER = @INSERT_TGMATH_HEADER@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ NMEDIT = @NMEDIT@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SPANDSP_LT_AGE = @SPANDSP_LT_AGE@ SPANDSP_LT_CURRENT = @SPANDSP_LT_CURRENT@ SPANDSP_LT_REVISION = @SPANDSP_LT_REVISION@ SPANDSP_MISALIGNED_ACCESS_FAILS = @SPANDSP_MISALIGNED_ACCESS_FAILS@ SPANDSP_USE_FIXED_POINT = @SPANDSP_USE_FIXED_POINT@ STRIP = @STRIP@ TESTLIBS = @TESTLIBS@ VERSION = @VERSION@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ AM_CFLAGS = $(COMP_VENDOR_CFLAGS) AM_LDFLAGS = $(COMP_VENDOR_LDFLAGS) noinst_SCRIPTS = spandsp.spec MAINTAINERCLEANFILES = Makefile.in EXTRA_DIST = autogen.sh \ DueDiligence \ README.testdata \ spandsp.spec \ wrapper.xsl \ libspandsp.vcproj \ unpack_g722_data.sh \ unpack_g726_data.sh \ unpack_gsm0610_data.sh \ unpack_v56ter_data.sh \ doc/doxygen.in \ src/floating_fudge.h \ src/spandsp/version.h.in \ src/libspandsp.dsp \ src/libspandsp.sln \ src/msvc/gettimeofday.c \ src/msvc/inttypes.h \ src/msvc/tgmath.h \ src/msvc/unistd.h \ src/msvc/sys/time.h \ src/msvc/spandsp.def \ src/msvc/msvcproj.head \ src/msvc/msvcproj.foot \ src/msvc/vc8proj.head \ src/msvc/vc8proj.foot \ spandsp/global-tones.xml \ spandsp/tones.dtd \ spandsp/tsb85.xml \ debian/changelog \ debian/compat \ debian/control \ debian/copyright \ debian/libspandsp5.install \ debian/libspandsp-dev.install \ debian/libspandsp-doc.install \ debian/rules \ debian/watch @COND_DOC_TRUE@MAYBE_DOC = doc @COND_TESTS_TRUE@MAYBE_TESTS = spandsp-sim tests @COND_TESTDATA_TRUE@MAYBE_TESTDATA = test-data SUBDIRS = src $(MAYBE_DOC) $(MAYBE_TESTS) $(MAYBE_TESTDATA) DIST_SUBDIRS = src doc spandsp-sim tests test-data all: all-recursive .SUFFIXES: am--refresh: @: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ echo ' cd $(srcdir) && $(AUTOMAKE) --gnu '; \ cd $(srcdir) && $(AUTOMAKE) --gnu \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ echo ' $(SHELL) ./config.status'; \ $(SHELL) ./config.status;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) $(SHELL) ./config.status --recheck $(top_srcdir)/configure: $(am__configure_deps) cd $(srcdir) && $(AUTOCONF) $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) spandsp.spec: $(top_builddir)/config.status $(srcdir)/spandsp.spec.in cd $(top_builddir) && $(SHELL) ./config.status $@ mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs distclean-libtool: -rm -f libtool uninstall-info-am: # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" mostlyclean-recursive clean-recursive distclean-recursive \ maintainer-clean-recursive: @failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) config-h.in $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) config-h.in $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) config-h.in $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) config-h.in $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) $(am__remove_distdir) mkdir $(distdir) $(mkdir_p) $(distdir)/. $(distdir)/config $(distdir)/debian $(distdir)/doc $(distdir)/spandsp $(distdir)/src $(distdir)/src/msvc $(distdir)/src/msvc/sys $(distdir)/src/spandsp @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ list='$(DISTFILES)'; for file in $$list; do \ case $$file in \ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ esac; \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ dir="/$$dir"; \ $(mkdir_p) "$(distdir)$$dir"; \ else \ dir=''; \ fi; \ if test -d $$d/$$file; then \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -d "$(distdir)/$$subdir" \ || $(mkdir_p) "$(distdir)/$$subdir" \ || exit 1; \ distdir=`$(am__cd) $(distdir) && pwd`; \ top_distdir=`$(am__cd) $(top_distdir) && pwd`; \ (cd $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$top_distdir" \ distdir="$$distdir/$$subdir" \ distdir) \ || exit 1; \ fi; \ done -find $(distdir) -type d ! -perm -777 -exec chmod a+rwx {} \; -o \ ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ ! -type d ! -perm -444 -exec $(SHELL) $(install_sh) -c -m a+r {} {} \; \ || chmod -R a+r $(distdir) dist-gzip: distdir tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz $(am__remove_distdir) dist-bzip2: distdir tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2 $(am__remove_distdir) dist-tarZ: distdir tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z $(am__remove_distdir) dist-shar: distdir shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz $(am__remove_distdir) dist-zip: distdir -rm -f $(distdir).zip zip -rq $(distdir).zip $(distdir) $(am__remove_distdir) dist dist-all: distdir tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz $(am__remove_distdir) # This target untars the dist file and tries a VPATH configuration. Then # it guarantees that the distribution is self-contained by making another # tarfile. distcheck: dist case '$(DIST_ARCHIVES)' in \ *.tar.gz*) \ GZIP=$(GZIP_ENV) gunzip -c $(distdir).tar.gz | $(am__untar) ;;\ *.tar.bz2*) \ bunzip2 -c $(distdir).tar.bz2 | $(am__untar) ;;\ *.tar.Z*) \ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ *.shar.gz*) \ GZIP=$(GZIP_ENV) gunzip -c $(distdir).shar.gz | unshar ;;\ *.zip*) \ unzip $(distdir).zip ;;\ esac chmod -R a-w $(distdir); chmod a+w $(distdir) mkdir $(distdir)/_build mkdir $(distdir)/_inst chmod a-w $(distdir) dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ && cd $(distdir)/_build \ && ../configure --srcdir=.. --prefix="$$dc_install_base" \ $(DISTCHECK_CONFIGURE_FLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) dvi \ && $(MAKE) $(AM_MAKEFLAGS) check \ && $(MAKE) $(AM_MAKEFLAGS) install \ && $(MAKE) $(AM_MAKEFLAGS) installcheck \ && $(MAKE) $(AM_MAKEFLAGS) uninstall \ && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ distuninstallcheck \ && chmod -R a-w "$$dc_install_base" \ && ({ \ (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ } || { rm -rf "$$dc_destdir"; exit 1; }) \ && rm -rf "$$dc_destdir" \ && $(MAKE) $(AM_MAKEFLAGS) dist \ && rm -rf $(DIST_ARCHIVES) \ && $(MAKE) $(AM_MAKEFLAGS) distcleancheck $(am__remove_distdir) @(echo "$(distdir) archives ready for distribution: "; \ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ sed -e '1{h;s/./=/g;p;x;}' -e '$${p;x;}' distuninstallcheck: @cd $(distuninstallcheck_dir) \ && test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \ || { echo "ERROR: files left after uninstall:" ; \ if test -n "$(DESTDIR)"; then \ echo " (check DESTDIR support)"; \ fi ; \ $(distuninstallcheck_listfiles) ; \ exit 1; } >&2 distcleancheck: distclean @if test '$(srcdir)' = . ; then \ echo "ERROR: distcleancheck can only run from a VPATH build" ; \ exit 1 ; \ fi @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left in build directory after distclean:" ; \ $(distcleancheck_listfiles) ; \ exit 1; } >&2 check-am: all-am check: check-recursive all-am: Makefile $(SCRIPTS) installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -f Makefile distclean-am: clean-am distclean-generic distclean-libtool \ distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive info: info-recursive info-am: install-data-am: install-exec-am: install-info: install-info-recursive install-man: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -rf $(top_srcdir)/autom4te.cache -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-info-am uninstall-info: uninstall-info-recursive .PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am am--refresh check \ check-am clean clean-generic clean-libtool clean-recursive \ ctags ctags-recursive dist dist-all dist-bzip2 dist-gzip \ dist-shar dist-tarZ dist-zip distcheck distclean \ distclean-generic distclean-libtool distclean-recursive \ distclean-tags distcleancheck distdir distuninstallcheck dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-exec install-exec-am \ install-info install-info-am install-man install-strip \ installcheck installcheck-am installdirs installdirs-am \ maintainer-clean maintainer-clean-generic \ maintainer-clean-recursive mostlyclean mostlyclean-generic \ mostlyclean-libtool mostlyclean-recursive pdf pdf-am ps ps-am \ tags tags-recursive uninstall uninstall-am uninstall-info-am faq: faq.xml cd faq ; xsltproc ../wrapper.xsl ../faq.xml rpm: rpm-build rpm-build: $(MAKE) -$(MAKEFLAGS) bump.rpm.release $(MAKE) -$(MAKEFLAGS) dist rm -rf rpm/BUILD/* rm -f rpm/RPMS/*/* rm -f rpm/SOURCES/* rm -f rpm/SPECS/* rm -f rpm/SRPMS/* rpm -ta --sign @PACKAGE@-@VERSION@.tar.gz bump.rpm.release: spandsp.spec VERSION="x"; \ test -f $(srcdir)/rpm.release && . $(srcdir)/rpm.release; \ NEXT_RELEASE=0; \ test "$$VERSION" = "@VERSION@" && NEXT_RELEASE="$$RELEASE"; \ RELEASE=`expr $$NEXT_RELEASE + 1`; \ echo "VERSION=@VERSION@" >$(srcdir)/rpm.release; \ echo "RELEASE=$$RELEASE" >>$(srcdir)/rpm.release; \ sed 's/^Release: .*/Release: '$$RELEASE'/' \ spandsp.spec.new; \ mv spandsp.spec.new spandsp.spec # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: iaxmodem-1.2.0/lib/spandsp/spandsp/0000755000175000017500000000000011150047202016531 5ustar julienjulieniaxmodem-1.2.0/lib/spandsp/spandsp/tones.dtd0000644000175000017500000001251211150047202020357 0ustar julienjulien iaxmodem-1.2.0/lib/spandsp/spandsp/global-tones.xml0000644000175000017500000066775411150047202021672 0ustar julienjulien iaxmodem-1.2.0/lib/spandsp/spandsp/tsb85.xml0000644000175000017500000061541611150047202020235 0ustar julienjulien iaxmodem-1.2.0/lib/spandsp/config-h.in0000644000175000017500000001730411150047202017110 0ustar julienjulien/* config-h.in. Generated from configure.ac by autoheader. */ /* Define to 1 if you have the acosf() function. */ #undef HAVE_ACOSF /* Define to 1 if you have the asinf() function. */ #undef HAVE_ASINF /* Define to 1 if you have the atan2f() function. */ #undef HAVE_ATAN2F /* Define to 1 if you have the atanf() function. */ #undef HAVE_ATANF /* Define to 1 if you have the header file. */ #undef HAVE_AUDIOFILE_H /* Define to 1 if you have the ceilf() function. */ #undef HAVE_CEILF /* Define to 1 if you have the cosf() function. */ #undef HAVE_COSF /* Define to 1 if you have the header file. */ #undef HAVE_DLFCN_H /* Define to 1 if you don't have `vprintf' but do have `_doprnt.' */ #undef HAVE_DOPRNT /* Define to 1 if you have the expf() function. */ #undef HAVE_EXPF /* Define to 1 if you have the header file. */ #undef HAVE_FCNTL_H /* Define to 1 if you have the header file. */ #undef HAVE_FFTW3_H /* Define to 1 if you have the header file. */ #undef HAVE_FFTW_H /* Define to 1 if you have the header file. */ #undef HAVE_FLOAT_H /* Define to 1 if you have the floorf() function. */ #undef HAVE_FLOORF /* Define to 1 if you have the header file. */ #undef HAVE_FL_FL_AUDIO_METER_H /* Define to 1 if you have the header file. */ #undef HAVE_FL_FL_CARTESIAN_H /* Define to 1 if you have the header file. */ #undef HAVE_FL_FL_DRAW_H /* Define to 1 if you have the header file. */ #undef HAVE_FL_FL_H /* Define to 1 if you have the header file. */ #undef HAVE_FL_FL_LIGHT_BUTTON_H /* Define to 1 if you have the header file. */ #undef HAVE_FL_FL_OVERLAY_WINDOW_H /* Define to 1 if you have the `gettimeofday' function. */ #undef HAVE_GETTIMEOFDAY /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H /* Define to 1 if you have the `m' library (-lm). */ #undef HAVE_LIBM /* Define to 1 if you have the `tiff' library (-ltiff). */ #undef HAVE_LIBTIFF /* Define to 1 if you have the 'libxml2' library (-lxml2). */ #undef HAVE_LIBXML2 /* Define to 1 if you have the header file. */ #undef HAVE_LIBXML_PARSER_H /* Define to 1 if you have the header file. */ #undef HAVE_LIBXML_XINCLUDE_H /* Define to 1 if you have the header file. */ #undef HAVE_LIBXML_XMLMEMORY_H /* Define if you have C99's llrint function. */ #undef HAVE_LLRINT /* Define if you have C99's llrintf function. */ #undef HAVE_LLRINTF /* Define to 1 if you have the log10f() function. */ #undef HAVE_LOG10F /* Define to 1 if you have the logf() function. */ #undef HAVE_LOGF /* Define to 1 if the system has the type `long double'. */ #undef HAVE_LONG_DOUBLE /* Define to 1 if the system has the type `long long'. */ #undef HAVE_LONG_LONG /* Define if you have C99's lrint function. */ #undef HAVE_LRINT /* Define if you have C99's lrintf function. */ #undef HAVE_LRINTF /* Define to 1 if your system has a GNU libc compatible `malloc' function, and to 0 otherwise. */ #undef HAVE_MALLOC /* Define to 1 if you have the header file. */ #undef HAVE_MALLOC_H /* Define to 1 if you have the header file. */ #undef HAVE_MATH_H /* Define to 1 if you have the `memmove' function. */ #undef HAVE_MEMMOVE /* Define to 1 if you have the header file. */ #undef HAVE_MEMORY_H /* Define to 1 if you have the `memset' function. */ #undef HAVE_MEMSET /* Define to 1 if you have the powf() function. */ #undef HAVE_POWF /* Define to 1 if you have the header file. */ #undef HAVE_PTHREAD_H /* Define to 1 if your system has a GNU libc compatible `realloc' function, and to 0 otherwise. */ #undef HAVE_REALLOC /* Define to 1 if you have the `select' function. */ #undef HAVE_SELECT /* Define to 1 if you have the sinf() function. */ #undef HAVE_SINF /* Define to 1 if you have the header file. */ #undef HAVE_SOCKET_H /* Define to 1 if you have the header file. */ #undef HAVE_STDINT_H /* Define to 1 if you have the header file. */ #undef HAVE_STDLIB_H /* Define to 1 if you have the `strcasecmp' function. */ #undef HAVE_STRCASECMP /* Define to 1 if you have the `strchr' function. */ #undef HAVE_STRCHR /* Define to 1 if you have the `strdup' function. */ #undef HAVE_STRDUP /* Define to 1 if you have the `strerror' function. */ #undef HAVE_STRERROR /* Define to 1 if you have the header file. */ #undef HAVE_STRINGS_H /* Define to 1 if you have the header file. */ #undef HAVE_STRING_H /* Define to 1 if you have the `strstr' function. */ #undef HAVE_STRSTR /* Define to 1 if you have the `strtol' function. */ #undef HAVE_STRTOL /* Define to 1 if you have the header file. */ #undef HAVE_SYS_FCNTL_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_IOCTL_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_SELECT_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_SOCKET_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_STAT_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TIME_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TYPES_H /* Define to 1 if you have that is POSIX.1 compatible. */ #undef HAVE_SYS_WAIT_H /* Define to 1 if you have the tanf() function. */ #undef HAVE_TANF /* Define to 1 if you have the header file. */ #undef HAVE_TGMATH_H /* Define to 1 if you have the header file. */ #undef HAVE_TIFFIO_H /* Define to 1 if you have the header file. */ #undef HAVE_UNICALL_H /* Define to 1 if you have the header file. */ #undef HAVE_UNISTD_H /* Define to 1 if you have the `vprintf' function. */ #undef HAVE_VPRINTF /* Define to 1 if you have the header file. */ #undef HAVE_X11_X_H /* Name of package */ #undef PACKAGE /* Define to the address where bug reports for this package should be sent. */ #undef PACKAGE_BUGREPORT /* Define to the full name of this package. */ #undef PACKAGE_NAME /* Define to the full name and version of this package. */ #undef PACKAGE_STRING /* Define to the one symbol short name of this package. */ #undef PACKAGE_TARNAME /* Define to the version of this package. */ #undef PACKAGE_VERSION /* Define as the return type of signal handlers (`int' or `void'). */ #undef RETSIGTYPE /* Define to the type of arg 1 for `select'. */ #undef SELECT_TYPE_ARG1 /* Define to the type of args 2, 3 and 4 for `select'. */ #undef SELECT_TYPE_ARG234 /* Define to the type of arg 5 for `select'. */ #undef SELECT_TYPE_ARG5 /* Do not expect a misaligned memory access to work correctly */ #undef SPANDSP_MISALIGNED_ACCESS_FAILS /* Enable fixed point processing, where possible, instead of floating point */ #undef SPANDSP_USE_FIXED_POINT /* Define to 1 if you have the ANSI C header files. */ #undef STDC_HEADERS /* Define to 1 if you can safely include both and . */ #undef TIME_WITH_SYS_TIME /* Version number of package */ #undef VERSION /* Define to empty if `const' does not conform to ANSI C. */ #undef const /* Define to `__inline__' or `__inline' if that's what the C compiler calls it, or to nothing if 'inline' is not supported under any name. */ #ifndef __cplusplus #undef inline #endif /* Define to rpl_malloc if the replacement function should be used. */ #undef malloc /* Define to rpl_realloc if the replacement function should be used. */ #undef realloc /* Define to empty if the keyword `volatile' does not work. Warning: valid code using `volatile' can become incorrect without. Disable with care. */ #undef volatile iaxmodem-1.2.0/lib/spandsp/tests/0000755000175000017500000000000011150047621016230 5ustar julienjulieniaxmodem-1.2.0/lib/spandsp/tests/t38_gateway_tests.c0000644000175000017500000005424711150047202021764 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * t38_gateway_tests.c - Tests for the T.38 FoIP gateway module. * * Written by Steve Underwood * * Copyright (C) 2005, 2006 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2, as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: t38_gateway_tests.c,v 1.74 2008/07/24 13:55:24 steveu Exp $ */ /*! \file */ /*! \page t38_gateway_tests_page T.38 gateway tests \section t38_gateway_tests_page_sec_1 What does it do? These tests exercise the path FAX machine <-> T.38 gateway <-> T.38 gateway <-> FAX machine */ #if defined(HAVE_CONFIG_H) #include #endif #if defined(HAVE_FL_FL_H) && defined(HAVE_FL_FL_CARTESIAN_H) && defined(HAVE_FL_FL_AUDIO_METER_H) #define ENABLE_GUI #endif #include #include #include #include #include #include #include #include #include #include #if !defined(__USE_MISC) #define __USE_MISC #endif #include #include #include #include #include "spandsp.h" #include "spandsp-sim.h" #if defined(ENABLE_GUI) #include "media_monitor.h" #endif #define SAMPLES_PER_CHUNK 160 #define INPUT_FILE_NAME "../test-data/itu/fax/itutests.tif" #define OUTPUT_FILE_NAME "t38.tif" #define OUTPUT_FILE_NAME_WAVE "t38_gateway.wav" #define OUTPUT_FILE_NAME_T30A "t38_gateway_t30a.wav" #define OUTPUT_FILE_NAME_T38A "t38_gateway_t38a.wav" #define OUTPUT_FILE_NAME_T30B "t38_gateway_t30b.wav" #define OUTPUT_FILE_NAME_T38B "t38_gateway_t38b.wav" fax_state_t fax_state_a; t38_gateway_state_t t38_state_a; t38_gateway_state_t t38_state_b; fax_state_t fax_state_b; g1050_state_t *path_a_to_b; g1050_state_t *path_b_to_a; double when = 0.0; int done[2] = {FALSE, FALSE}; int succeeded[2] = {FALSE, FALSE}; int simulate_incrementing_repeats = FALSE; static int phase_b_handler(t30_state_t *s, void *user_data, int result) { int i; i = (int) (intptr_t) user_data; printf("%c: Phase B handler on channel %c - (0x%X) %s\n", i, i, result, t30_frametype(result)); return T30_ERR_OK; } /*- End of function --------------------------------------------------------*/ static int phase_d_handler(t30_state_t *s, void *user_data, int result) { int i; t30_stats_t t; const char *u; i = (int) (intptr_t) user_data; printf("%c: Phase D handler on channel %c - (0x%X) %s\n", i, i, result, t30_frametype(result)); t30_get_transfer_statistics(s, &t); printf("%c: Phase D: bit rate %d\n", i, t.bit_rate); printf("%c: Phase D: ECM %s\n", i, (t.error_correcting_mode) ? "on" : "off"); printf("%c: Phase D: pages transferred %d\n", i, t.pages_transferred); printf("%c: Phase D: image size %d x %d\n", i, t.width, t.length); printf("%c: Phase D: image resolution %d x %d\n", i, t.x_resolution, t.y_resolution); printf("%c: Phase D: bad rows %d\n", i, t.bad_rows); printf("%c: Phase D: longest bad row run %d\n", i, t.longest_bad_row_run); printf("%c: Phase D: coding method %s\n", i, t4_encoding_to_str(t.encoding)); printf("%c: Phase D: image size %d bytes\n", i, t.image_size); if ((u = t30_get_tx_ident(s))) printf("%c: Phase D: local ident '%s'\n", i, u); if ((u = t30_get_rx_ident(s))) printf("%c: Phase D: remote ident '%s'\n", i, u); printf("%c: Phase D: bits per row - min %d, max %d\n", i, s->t4.min_row_bits, s->t4.max_row_bits); return T30_ERR_OK; } /*- End of function --------------------------------------------------------*/ static void phase_e_handler(t30_state_t *s, void *user_data, int result) { int i; t30_stats_t t; const char *u; i = (int) (intptr_t) user_data; printf("%c: Phase E handler on channel %c - (%d) %s\n", i, i, result, t30_completion_code_to_str(result)); t30_get_transfer_statistics(s, &t); printf("%c: Phase E: bit rate %d\n", i, t.bit_rate); printf("%c: Phase E: ECM %s\n", i, (t.error_correcting_mode) ? "on" : "off"); printf("%c: Phase E: pages transferred %d\n", i, t.pages_transferred); printf("%c: Phase E: image size %d x %d\n", i, t.width, t.length); printf("%c: Phase E: image resolution %d x %d\n", i, t.x_resolution, t.y_resolution); printf("%c: Phase E: bad rows %d\n", i, t.bad_rows); printf("%c: Phase E: longest bad row run %d\n", i, t.longest_bad_row_run); printf("%c: Phase E: coding method %s\n", i, t4_encoding_to_str(t.encoding)); printf("%c: Phase E: image size %d bytes\n", i, t.image_size); if ((u = t30_get_tx_ident(s))) printf("%c: Phase E: local ident '%s'\n", i, u); if ((u = t30_get_rx_ident(s))) printf("%c: Phase E: remote ident '%s'\n", i, u); succeeded[i - 'A'] = (result == T30_ERR_OK) && (t.pages_transferred == 12); done[i - 'A'] = TRUE; } /*- End of function --------------------------------------------------------*/ static void real_time_frame_handler(t38_gateway_state_t *s, void *user_data, int direction, const uint8_t *msg, int len) { int i; i = (intptr_t) user_data; printf("%d: Real time frame handler on channel %d - %s, %s, length = %d\n", i, i, (direction) ? "PSTN->T.38" : "T.38->PSTN", t30_frametype(msg[2]), len); } /*- End of function --------------------------------------------------------*/ static int tx_packet_handler_a(t38_core_state_t *s, void *user_data, const uint8_t *buf, int len, int count) { t38_terminal_state_t *t; int i; static int subst_seq = 0; /* This routine queues messages between two instances of T.38 processing */ t = (t38_terminal_state_t *) user_data; if (simulate_incrementing_repeats) { for (i = 0; i < count; i++) { span_log(&s->logging, SPAN_LOG_FLOW, "Send seq %d, len %d\n", subst_seq, len); g1050_put(path_a_to_b, buf, len, subst_seq, when); subst_seq = (subst_seq + 1) & 0xFFFF; } } else { span_log(&s->logging, SPAN_LOG_FLOW, "Send seq %d, len %d, count %d\n", s->tx_seq_no, len, count); for (i = 0; i < count; i++) g1050_put(path_a_to_b, buf, len, s->tx_seq_no, when); } return 0; } /*- End of function --------------------------------------------------------*/ static int tx_packet_handler_b(t38_core_state_t *s, void *user_data, const uint8_t *buf, int len, int count) { t38_terminal_state_t *t; int i; static int subst_seq = 0; /* This routine queues messages between two instances of T.38 processing */ t = (t38_terminal_state_t *) user_data; if (simulate_incrementing_repeats) { for (i = 0; i < count; i++) { span_log(&s->logging, SPAN_LOG_FLOW, "Send seq %d, len %d\n", subst_seq, len); g1050_put(path_b_to_a, buf, len, subst_seq, when); subst_seq = (subst_seq + 1) & 0xFFFF; } } else { span_log(&s->logging, SPAN_LOG_FLOW, "Send seq %d, len %d, count %d\n", s->tx_seq_no, len, count); for (i = 0; i < count; i++) g1050_put(path_b_to_a, buf, len, s->tx_seq_no, when); } return 0; } /*- End of function --------------------------------------------------------*/ int main(int argc, char *argv[]) { int16_t silence[SAMPLES_PER_CHUNK]; int16_t t30_amp_a[SAMPLES_PER_CHUNK]; int16_t t38_amp_a[SAMPLES_PER_CHUNK]; int16_t t38_amp_hist_a[8][SAMPLES_PER_CHUNK]; int16_t t38_amp_b[SAMPLES_PER_CHUNK]; int16_t t38_amp_hist_b[8][SAMPLES_PER_CHUNK]; int16_t t30_amp_b[SAMPLES_PER_CHUNK]; int16_t out_amp[SAMPLES_PER_CHUNK*4]; int t30_len_a; int t38_len_a; int t38_len_b; int t30_len_b; int hist_ptr; int log_audio; int msg_len; uint8_t msg[1024]; int outframes; AFfilesetup filesetup; AFfilehandle wave_handle; int use_ecm; int use_tep; int feedback_audio; int use_transmit_on_idle; int t38_version; const char *input_file_name; int i; int seq_no; int model_no; int speed_pattern_no; double tx_when; double rx_when; int supported_modems; int use_gui; int opt; t38_stats_t stats; t30_state_t *t30; log_audio = FALSE; use_ecm = FALSE; t38_version = 1; input_file_name = INPUT_FILE_NAME; simulate_incrementing_repeats = FALSE; model_no = 0; speed_pattern_no = 1; use_gui = FALSE; use_tep = FALSE; feedback_audio = FALSE; use_transmit_on_idle = TRUE; supported_modems = T30_SUPPORT_V27TER | T30_SUPPORT_V29 | T30_SUPPORT_V17; while ((opt = getopt(argc, argv, "efgi:Ilm:M:s:tv:")) != -1) { switch (opt) { case 'e': use_ecm = TRUE; break; case 'f': feedback_audio = TRUE; break; case 'g': #if defined(ENABLE_GUI) use_gui = TRUE; #else fprintf(stderr, "Graphical monitoring not available\n"); exit(2); #endif break; case 'i': input_file_name = optarg; break; case 'I': simulate_incrementing_repeats = TRUE; break; case 'l': log_audio = TRUE; break; case 'm': supported_modems = atoi(optarg); break; case 'M': model_no = optarg[0] - 'A' + 1; break; case 's': speed_pattern_no = atoi(optarg); break; case 't': use_tep = TRUE; break; case 'v': t38_version = atoi(optarg); break; default: //usage(); exit(2); break; } } printf("Using T.38 version %d\n", t38_version); if (use_ecm) printf("Using ECM\n"); filesetup = AF_NULL_FILESETUP; wave_handle = AF_NULL_FILEHANDLE; if (log_audio) { if ((filesetup = afNewFileSetup()) == AF_NULL_FILESETUP) { fprintf(stderr, " Failed to create file setup\n"); exit(2); } afInitSampleFormat(filesetup, AF_DEFAULT_TRACK, AF_SAMPFMT_TWOSCOMP, 16); afInitRate(filesetup, AF_DEFAULT_TRACK, (float) SAMPLE_RATE); afInitFileFormat(filesetup, AF_FILE_WAVE); afInitChannels(filesetup, AF_DEFAULT_TRACK, 4); if ((wave_handle = afOpenFile(OUTPUT_FILE_NAME_WAVE, "w", filesetup)) == AF_NULL_FILEHANDLE) { fprintf(stderr, " Cannot create wave file '%s'\n", OUTPUT_FILE_NAME_WAVE); exit(2); } } memset(silence, 0, sizeof(silence)); srand48(0x1234567); if ((path_a_to_b = g1050_init(model_no, speed_pattern_no, 100, 33)) == NULL) { fprintf(stderr, "Failed to start IP network path model\n"); exit(2); } if ((path_b_to_a = g1050_init(model_no, speed_pattern_no, 100, 33)) == NULL) { fprintf(stderr, "Failed to start IP network path model\n"); exit(2); } if (fax_init(&fax_state_a, TRUE) == NULL) { fprintf(stderr, "Cannot start FAX\n"); exit(2); } t30 = fax_get_t30_state(&fax_state_a); fax_set_transmit_on_idle(&fax_state_a, use_transmit_on_idle); fax_set_tep_mode(&fax_state_a, use_tep); t30_set_supported_modems(t30, supported_modems); t30_set_tx_ident(t30, "11111111"); t30_set_tx_nsf(t30, (const uint8_t *) "\x50\x00\x00\x00Spandsp\x00", 12); t30_set_tx_file(t30, input_file_name, -1, -1); t30_set_phase_b_handler(t30, phase_b_handler, (void *) (intptr_t) 'A'); t30_set_phase_d_handler(t30, phase_d_handler, (void *) (intptr_t) 'A'); t30_set_phase_e_handler(t30, phase_e_handler, (void *) (intptr_t) 'A'); t30_set_ecm_capability(t30, use_ecm); if (use_ecm) t30_set_supported_compressions(t30, T30_SUPPORT_T4_1D_COMPRESSION | T30_SUPPORT_T4_2D_COMPRESSION | T30_SUPPORT_T6_COMPRESSION); span_log_set_level(&fax_state_a.logging, SPAN_LOG_DEBUG | SPAN_LOG_SHOW_TAG | SPAN_LOG_SHOW_SAMPLE_TIME); span_log_set_tag(&fax_state_a.logging, "FAX-A "); span_log_set_level(&t30->logging, SPAN_LOG_DEBUG | SPAN_LOG_SHOW_TAG | SPAN_LOG_SHOW_SAMPLE_TIME); span_log_set_tag(&t30->logging, "FAX-A "); memset(t30_amp_a, 0, sizeof(t30_amp_a)); memset(t38_amp_hist_a, 0, sizeof(t38_amp_hist_a)); memset(t38_amp_hist_b, 0, sizeof(t38_amp_hist_b)); if (t38_gateway_init(&t38_state_a, tx_packet_handler_a, &t38_state_b) == NULL) { fprintf(stderr, "Cannot start the T.38 channel\n"); exit(2); } t38_gateway_set_transmit_on_idle(&t38_state_a, use_transmit_on_idle); t38_gateway_set_supported_modems(&t38_state_a, supported_modems); //t38_gateway_set_nsx_suppression(&t38_state_a, NULL, 0, NULL, 0); t38_gateway_set_real_time_frame_handler(&t38_state_a, real_time_frame_handler, NULL); t38_set_t38_version(&t38_state_a.t38x.t38, t38_version); t38_gateway_set_ecm_capability(&t38_state_a, use_ecm); span_log_set_level(&t38_state_a.logging, SPAN_LOG_DEBUG | SPAN_LOG_SHOW_TAG | SPAN_LOG_SHOW_SAMPLE_TIME); span_log_set_tag(&t38_state_a.logging, "T.38-A"); span_log_set_level(&t38_state_a.t38x.t38.logging, SPAN_LOG_DEBUG | SPAN_LOG_SHOW_TAG | SPAN_LOG_SHOW_SAMPLE_TIME); span_log_set_tag(&t38_state_a.t38x.t38.logging, "T.38-A"); memset(t38_amp_a, 0, sizeof(t38_amp_a)); if (t38_gateway_init(&t38_state_b, tx_packet_handler_b, &t38_state_a) == NULL) { fprintf(stderr, "Cannot start the T.38 channel\n"); exit(2); } t38_gateway_set_transmit_on_idle(&t38_state_b, use_transmit_on_idle); t38_gateway_set_supported_modems(&t38_state_b, supported_modems); //t38_gateway_set_nsx_suppression(&t38_state_b, FALSE); t38_set_t38_version(&t38_state_b.t38x.t38, t38_version); t38_gateway_set_ecm_capability(&t38_state_b, use_ecm); span_log_set_level(&t38_state_b.logging, SPAN_LOG_DEBUG | SPAN_LOG_SHOW_TAG | SPAN_LOG_SHOW_SAMPLE_TIME); span_log_set_tag(&t38_state_b.logging, "T.38-B"); span_log_set_level(&t38_state_b.t38x.t38.logging, SPAN_LOG_DEBUG | SPAN_LOG_SHOW_TAG | SPAN_LOG_SHOW_SAMPLE_TIME); span_log_set_tag(&t38_state_b.t38x.t38.logging, "T.38-B"); memset(t38_amp_b, 0, sizeof(t38_amp_b)); if (fax_init(&fax_state_b, FALSE) == NULL) { fprintf(stderr, "Cannot start FAX\n"); exit(2); } t30 = fax_get_t30_state(&fax_state_b); fax_set_transmit_on_idle(&fax_state_b, use_transmit_on_idle); fax_set_tep_mode(&fax_state_b, use_tep); t30_set_supported_modems(t30, supported_modems); t30_set_tx_ident(t30, "22222222"); t30_set_tx_nsf(t30, (const uint8_t *) "\x50\x00\x00\x00Spandsp\x00", 12); t30_set_rx_file(t30, OUTPUT_FILE_NAME, -1); t30_set_phase_b_handler(t30, phase_b_handler, (void *) (intptr_t) 'B'); t30_set_phase_d_handler(t30, phase_d_handler, (void *) (intptr_t) 'B'); t30_set_phase_e_handler(t30, phase_e_handler, (void *) (intptr_t) 'B'); t30_set_ecm_capability(t30, use_ecm); if (use_ecm) t30_set_supported_compressions(t30, T30_SUPPORT_T4_1D_COMPRESSION | T30_SUPPORT_T4_2D_COMPRESSION | T30_SUPPORT_T6_COMPRESSION); span_log_set_level(&fax_state_b.logging, SPAN_LOG_DEBUG | SPAN_LOG_SHOW_TAG | SPAN_LOG_SHOW_SAMPLE_TIME); span_log_set_tag(&fax_state_b.logging, "FAX-B "); span_log_set_level(&t30->logging, SPAN_LOG_DEBUG | SPAN_LOG_SHOW_TAG | SPAN_LOG_SHOW_SAMPLE_TIME); span_log_set_tag(&t30->logging, "FAX-B "); memset(t30_amp_b, 0, sizeof(t30_amp_b)); #if defined(ENABLE_GUI) if (use_gui) start_media_monitor(); #endif hist_ptr = 0; for (;;) { t30 = fax_get_t30_state(&fax_state_a); span_log_bump_samples(&fax_state_a.logging, SAMPLES_PER_CHUNK); span_log_bump_samples(&t30->logging, SAMPLES_PER_CHUNK); span_log_bump_samples(&t38_state_a.logging, SAMPLES_PER_CHUNK); span_log_bump_samples(&t38_state_a.t38x.t38.logging, SAMPLES_PER_CHUNK); span_log_bump_samples(&t38_state_b.logging, SAMPLES_PER_CHUNK); span_log_bump_samples(&t38_state_b.t38x.t38.logging, SAMPLES_PER_CHUNK); t30 = fax_get_t30_state(&fax_state_b); span_log_bump_samples(&fax_state_b.logging, SAMPLES_PER_CHUNK); span_log_bump_samples(&t30->logging, SAMPLES_PER_CHUNK); memset(out_amp, 0, sizeof(out_amp)); t30_len_a = fax_tx(&fax_state_a, t30_amp_a, SAMPLES_PER_CHUNK); if (!use_transmit_on_idle) { /* The receive side always expects a full block of samples, but the transmit side may not be sending any when it doesn't need to. We may need to pad with some silence. */ if (t30_len_a < SAMPLES_PER_CHUNK) { memset(t30_amp_a + t30_len_a, 0, sizeof(int16_t)*(SAMPLES_PER_CHUNK - t30_len_a)); t30_len_a = SAMPLES_PER_CHUNK; } } if (log_audio) { for (i = 0; i < t30_len_a; i++) out_amp[i*4] = t30_amp_a[i]; } if (feedback_audio) { for (i = 0; i < t30_len_a; i++) t30_amp_a[i] += t38_amp_hist_a[hist_ptr][i] >> 1; memcpy(t38_amp_hist_a[hist_ptr], t38_amp_a, sizeof(int16_t)*SAMPLES_PER_CHUNK); } if (t38_gateway_rx(&t38_state_a, t30_amp_a, t30_len_a)) break; t38_len_a = t38_gateway_tx(&t38_state_a, t38_amp_a, SAMPLES_PER_CHUNK); if (!use_transmit_on_idle) { if (t38_len_a < SAMPLES_PER_CHUNK) { memset(t38_amp_a + t38_len_a, 0, sizeof(int16_t)*(SAMPLES_PER_CHUNK - t38_len_a)); t38_len_a = SAMPLES_PER_CHUNK; } } if (log_audio) { for (i = 0; i < t38_len_a; i++) out_amp[i*4 + 1] = t38_amp_a[i]; } if (fax_rx(&fax_state_a, t38_amp_a, SAMPLES_PER_CHUNK)) break; t30_len_b = fax_tx(&fax_state_b, t30_amp_b, SAMPLES_PER_CHUNK); if (!use_transmit_on_idle) { /* The receive side always expects a full block of samples, but the transmit side may not be sending any when it doesn't need to. We may need to pad with some silence. */ if (t30_len_b < SAMPLES_PER_CHUNK) { memset(t30_amp_b + t30_len_b, 0, sizeof(int16_t)*(SAMPLES_PER_CHUNK - t30_len_b)); t30_len_b = SAMPLES_PER_CHUNK; } } if (log_audio) { for (i = 0; i < t30_len_b; i++) out_amp[i*4 + 3] = t30_amp_b[i]; } if (feedback_audio) { for (i = 0; i < t30_len_b; i++) t30_amp_b[i] += t38_amp_hist_b[hist_ptr][i] >> 1; memcpy(t38_amp_hist_b[hist_ptr], t38_amp_b, sizeof(int16_t)*SAMPLES_PER_CHUNK); } if (t38_gateway_rx(&t38_state_b, t30_amp_b, t30_len_b)) break; t38_len_b = t38_gateway_tx(&t38_state_b, t38_amp_b, SAMPLES_PER_CHUNK); if (!use_transmit_on_idle) { if (t38_len_b < SAMPLES_PER_CHUNK) { memset(t38_amp_b + t38_len_b, 0, sizeof(int16_t)*(SAMPLES_PER_CHUNK - t38_len_b)); t38_len_b = SAMPLES_PER_CHUNK; } } if (log_audio) { for (i = 0; i < t38_len_b; i++) out_amp[i*4 + 2] = t38_amp_b[i]; } if (fax_rx(&fax_state_b, t38_amp_b, SAMPLES_PER_CHUNK)) break; when += 0.02; while ((msg_len = g1050_get(path_a_to_b, msg, 1024, when, &seq_no, &tx_when, &rx_when)) >= 0) { #if defined(ENABLE_GUI) if (use_gui) media_monitor_rx(seq_no, tx_when, rx_when); #endif t38_core_rx_ifp_packet(&t38_state_b.t38x.t38, msg, msg_len, seq_no); } while ((msg_len = g1050_get(path_b_to_a, msg, 1024, when, &seq_no, &tx_when, &rx_when)) >= 0) { #if defined(ENABLE_GUI) if (use_gui) media_monitor_rx(seq_no, tx_when, rx_when); #endif t38_core_rx_ifp_packet(&t38_state_a.t38x.t38, msg, msg_len, seq_no); } if (log_audio) { outframes = afWriteFrames(wave_handle, AF_DEFAULT_TRACK, out_amp, SAMPLES_PER_CHUNK); if (outframes != SAMPLES_PER_CHUNK) break; } if (done[0] && done[1]) break; #if defined(ENABLE_GUI) if (use_gui) media_monitor_update_display(); #endif if (++hist_ptr > 3) hist_ptr = 0; } t38_gateway_get_transfer_statistics(&t38_state_a, &stats); printf("A side exchanged %d pages at %dbps, in %s mode\n", stats.pages_transferred, stats.bit_rate, (stats.error_correcting_mode) ? "ECM" : "non-ECM"); t38_gateway_get_transfer_statistics(&t38_state_a, &stats); printf("B side exchanged %d pages at %dbps, in %s mode\n", stats.pages_transferred, stats.bit_rate, (stats.error_correcting_mode) ? "ECM" : "non-ECM"); fax_release(&fax_state_a); fax_release(&fax_state_b); if (log_audio) { if (afCloseFile(wave_handle) != 0) { fprintf(stderr, " Cannot close wave file '%s'\n", OUTPUT_FILE_NAME_WAVE); exit(2); } afFreeFileSetup(filesetup); } if (!succeeded[0] || !succeeded[1]) { printf("Tests failed\n"); exit(2); } printf("Tests passed\n"); return 0; } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/tests/Makefile.am0000644000175000017500000002465511150047202020273 0ustar julienjulien## ## SpanDSP - a series of DSP components for telephony ## ## Makefile.am - Process this file with automake to produce Makefile.in ## ## This program is free software; you can redistribute it and/or modify ## it under the terms of the GNU General Public License version 2, as ## published by the Free Software Foundation. ## ## This program is distributed in the hope that it will be useful, ## but WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ## GNU General Public License for more details. ## ## You should have received a copy of the GNU General Public License ## along with this program; if not, write to the Free Software ## Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ## ## $Id: Makefile.am,v 1.99 2008/07/15 14:28:20 steveu Exp $ AM_CFLAGS = $(COMP_VENDOR_CFLAGS) AM_LDFLAGS = $(COMP_VENDOR_LDFLAGS) LIBS += $(TESTLIBS) noinst_DATA = sound_c1_8k.wav sound_c3_8k.wav EXTRA_DIST = regression_tests.sh v42bis_tests.sh fax_tests.sh MAINTAINERCLEANFILES = Makefile.in INCLUDES = -I$(top_builddir)/src -I$(top_builddir)/spandsp-sim -DDATADIR="\"$(pkgdatadir)\"" LIBDIR = -L$(top_builddir)/src noinst_PROGRAMS = adsi_tests \ async_tests \ at_interpreter_tests \ awgn_tests \ bell_mf_rx_tests \ bell_mf_tx_tests \ bert_tests \ bit_operations_tests \ crc_tests \ dc_restore_tests \ dds_tests \ dtmf_rx_tests \ dtmf_tx_tests \ echo_tests \ fax_decode \ fax_tests \ fsk_tests \ g1050_tests \ g168_tests \ g711_tests \ g722_tests \ g726_tests \ gsm0610_tests \ hdlc_tests \ ima_adpcm_tests \ line_model_tests \ logging_tests \ lpc10_tests \ make_g168_css \ modem_echo_tests \ modem_connect_tones_tests \ noise_tests \ oki_adpcm_tests \ playout_tests \ plc_tests \ power_meter_tests \ queue_tests \ r2_mf_rx_tests \ r2_mf_tx_tests \ rfc2198_sim_tests \ schedule_tests \ sig_tone_tests \ super_tone_rx_tests \ super_tone_tx_tests \ t4_tests \ t31_tests \ t38_core_tests \ t38_gateway_tests \ t38_gateway_to_terminal_tests \ t38_terminal_tests \ t38_terminal_to_gateway_tests \ time_scale_tests \ tone_detect_tests \ tone_generate_tests \ tsb85_tests \ v17_tests \ v22bis_tests \ v27ter_tests \ v29_tests \ v42_tests \ v42bis_tests \ v8_tests \ vector_float_tests \ vector_int_tests \ testadsi \ testfax \ tsb85_tests noinst_HEADERS = echo_monitor.h \ fax_tester.h \ line_model_monitor.h \ media_monitor.h \ modem_monitor.h adsi_tests_SOURCES = adsi_tests.c adsi_tests_LDADD = $(LIBDIR) -lspandsp async_tests_SOURCES = async_tests.c async_tests_LDADD = $(LIBDIR) -lspandsp at_interpreter_tests_SOURCES = at_interpreter_tests.c at_interpreter_tests_LDADD = $(LIBDIR) -lspandsp awgn_tests_SOURCES = awgn_tests.c awgn_tests_LDADD = $(LIBDIR) -lspandsp bell_mf_rx_tests_SOURCES = bell_mf_rx_tests.c bell_mf_rx_tests_LDADD = $(LIBDIR) -lspandsp bell_mf_tx_tests_SOURCES = bell_mf_tx_tests.c bell_mf_tx_tests_LDADD = $(LIBDIR) -lspandsp bert_tests_SOURCES = bert_tests.c bert_tests_LDADD = $(LIBDIR) -lspandsp bit_operations_tests_SOURCES = bit_operations_tests.c bit_operations_tests_LDADD = $(LIBDIR) -lspandsp crc_tests_SOURCES = crc_tests.c crc_tests_LDADD = $(LIBDIR) -lspandsp dc_restore_tests_SOURCES = dc_restore_tests.c dc_restore_tests_LDADD = $(LIBDIR) -lspandsp dds_tests_SOURCES = dds_tests.c dds_tests_LDADD = $(LIBDIR) -lspandsp dtmf_rx_tests_SOURCES = dtmf_rx_tests.c dtmf_rx_tests_LDADD = -L$(top_builddir)/spandsp-sim -lspandsp-sim $(LIBDIR) -lspandsp dtmf_tx_tests_SOURCES = dtmf_tx_tests.c dtmf_tx_tests_LDADD = $(LIBDIR) -lspandsp echo_tests_SOURCES = echo_tests.c echo_monitor.cpp echo_tests_LDADD = $(LIBDIR) -lspandsp fax_decode_SOURCES = fax_decode.c fax_decode_LDADD = $(LIBDIR) -lspandsp fax_tests_SOURCES = fax_tests.c fax_tests_LDADD = $(LIBDIR) -lspandsp fsk_tests_SOURCES = fsk_tests.c fsk_tests_LDADD = -L$(top_builddir)/spandsp-sim -lspandsp-sim $(LIBDIR) -lspandsp g1050_tests_SOURCES = g1050_tests.c media_monitor.cpp g1050_tests_LDADD = -L$(top_builddir)/spandsp-sim -lspandsp-sim $(LIBDIR) -lspandsp g168_tests_SOURCES = g168_tests.c g168_tests_LDADD = $(LIBDIR) -lspandsp g711_tests_SOURCES = g711_tests.c g711_tests_LDADD = $(LIBDIR) -lspandsp g722_tests_SOURCES = g722_tests.c g722_tests_LDADD = $(LIBDIR) -lspandsp g726_tests_SOURCES = g726_tests.c g726_tests_LDADD = $(LIBDIR) -lspandsp gsm0610_tests_SOURCES = gsm0610_tests.c gsm0610_tests_LDADD = $(LIBDIR) -lspandsp hdlc_tests_SOURCES = hdlc_tests.c hdlc_tests_LDADD = $(LIBDIR) -lspandsp ima_adpcm_tests_SOURCES = ima_adpcm_tests.c ima_adpcm_tests_LDADD = $(LIBDIR) -lspandsp line_model_tests_SOURCES = line_model_tests.c line_model_tests_LDADD = -L$(top_builddir)/spandsp-sim -lspandsp-sim $(LIBDIR) -lspandsp logging_tests_SOURCES = logging_tests.c logging_tests_LDADD = $(LIBDIR) -lspandsp lpc10_tests_SOURCES = lpc10_tests.c lpc10_tests_LDADD = $(LIBDIR) -lspandsp make_g168_css_SOURCES = make_g168_css.c make_g168_css_LDADD = $(LIBDIR) -lspandsp modem_echo_tests_SOURCES = modem_echo_tests.c echo_monitor.cpp modem_echo_tests_LDADD = $(LIBDIR) -lspandsp modem_connect_tones_tests_SOURCES = modem_connect_tones_tests.c modem_connect_tones_tests_LDADD = $(LIBDIR) -lspandsp noise_tests_SOURCES = noise_tests.c noise_tests_LDADD = $(LIBDIR) -lspandsp oki_adpcm_tests_SOURCES = oki_adpcm_tests.c oki_adpcm_tests_LDADD = $(LIBDIR) -lspandsp playout_tests_SOURCES = playout_tests.c media_monitor.cpp playout_tests_LDADD = -L$(top_builddir)/spandsp-sim -lspandsp-sim $(LIBDIR) -lspandsp plc_tests_SOURCES = plc_tests.c plc_tests_LDADD = $(LIBDIR) -lspandsp power_meter_tests_SOURCES = power_meter_tests.c power_meter_tests_LDADD = $(LIBDIR) -lspandsp queue_tests_SOURCES = queue_tests.c queue_tests_LDADD = $(LIBDIR) -lspandsp r2_mf_rx_tests_SOURCES = r2_mf_rx_tests.c r2_mf_rx_tests_LDADD = $(LIBDIR) -lspandsp r2_mf_tx_tests_SOURCES = r2_mf_tx_tests.c r2_mf_tx_tests_LDADD = $(LIBDIR) -lspandsp rfc2198_sim_tests_SOURCES = rfc2198_sim_tests.c media_monitor.cpp rfc2198_sim_tests_LDADD = -L$(top_builddir)/spandsp-sim -lspandsp-sim $(LIBDIR) -lspandsp schedule_tests_SOURCES = schedule_tests.c schedule_tests_LDADD = $(LIBDIR) -lspandsp sig_tone_tests_SOURCES = sig_tone_tests.c sig_tone_tests_LDADD = $(LIBDIR) -lspandsp super_tone_rx_tests_SOURCES = super_tone_rx_tests.c super_tone_rx_tests_LDADD = $(LIBDIR) -lspandsp super_tone_tx_tests_SOURCES = super_tone_tx_tests.c super_tone_tx_tests_LDADD = $(LIBDIR) -lspandsp t4_tests_SOURCES = t4_tests.c t4_tests_LDADD = $(LIBDIR) -lspandsp t31_tests_SOURCES = t31_tests.c media_monitor.cpp t31_tests_LDADD = -L$(top_builddir)/spandsp-sim -lspandsp-sim $(LIBDIR) -lspandsp t38_core_tests_SOURCES = t38_core_tests.c t38_core_tests_LDADD = $(LIBDIR) -lspandsp t38_gateway_tests_SOURCES = t38_gateway_tests.c media_monitor.cpp t38_gateway_tests_LDADD = -L$(top_builddir)/spandsp-sim -lspandsp-sim $(LIBDIR) -lspandsp t38_gateway_to_terminal_tests_SOURCES = t38_gateway_to_terminal_tests.c media_monitor.cpp t38_gateway_to_terminal_tests_LDADD = -L$(top_builddir)/spandsp-sim -lspandsp-sim $(LIBDIR) -lspandsp t38_terminal_tests_SOURCES = t38_terminal_tests.c media_monitor.cpp t38_terminal_tests_LDADD = -L$(top_builddir)/spandsp-sim -lspandsp-sim $(LIBDIR) -lspandsp t38_terminal_to_gateway_tests_SOURCES = t38_terminal_to_gateway_tests.c media_monitor.cpp t38_terminal_to_gateway_tests_LDADD = -L$(top_builddir)/spandsp-sim -lspandsp-sim $(LIBDIR) -lspandsp time_scale_tests_SOURCES = time_scale_tests.c time_scale_tests_LDADD = $(LIBDIR) -lspandsp tone_detect_tests_SOURCES = tone_detect_tests.c tone_detect_tests_LDADD = $(LIBDIR) -lspandsp tone_generate_tests_SOURCES = tone_generate_tests.c tone_generate_tests_LDADD = $(LIBDIR) -lspandsp tsb85_tests_SOURCES = tsb85_tests.c fax_tester.c tsb85_tests_LDADD = $(LIBDIR) -lspandsp v17_tests_SOURCES = v17_tests.c line_model_monitor.cpp modem_monitor.cpp v17_tests_LDADD = -L$(top_builddir)/spandsp-sim -lspandsp-sim $(LIBDIR) -lspandsp v22bis_tests_SOURCES = v22bis_tests.c line_model_monitor.cpp modem_monitor.cpp v22bis_tests_LDADD = -L$(top_builddir)/spandsp-sim -lspandsp-sim $(LIBDIR) -lspandsp v27ter_tests_SOURCES = v27ter_tests.c line_model_monitor.cpp modem_monitor.cpp v27ter_tests_LDADD = -L$(top_builddir)/spandsp-sim -lspandsp-sim $(LIBDIR) -lspandsp v29_tests_SOURCES = v29_tests.c line_model_monitor.cpp modem_monitor.cpp v29_tests_LDADD = -L$(top_builddir)/spandsp-sim -lspandsp-sim $(LIBDIR) -lspandsp v42_tests_SOURCES = v42_tests.c v42_tests_LDADD = $(LIBDIR) -lspandsp v42bis_tests_SOURCES = v42bis_tests.c v42bis_tests_LDADD = $(LIBDIR) -lspandsp v8_tests_SOURCES = v8_tests.c v8_tests_LDADD = $(LIBDIR) -lspandsp vector_float_tests_SOURCES = vector_float_tests.c vector_float_tests_LDADD = $(LIBDIR) -lspandsp vector_int_tests_SOURCES = vector_int_tests.c vector_int_tests_LDADD = $(LIBDIR) -lspandsp testadsi_SOURCES = testadsi.c testadsi_LDADD = $(LIBDIR) -lspandsp testfax_SOURCES = testfax.c testfax_LDADD = $(LIBDIR) -lspandsp # We need to create the CSS files for echo cancellation tests. sound_c1_8k.wav sound_c3_8k.wav: make_g168_css$(EXEEXT) ./make_g168_css$(EXEEXT) sox sound_c1.wav -r8000 sound_c1_8k.wav sox sound_c3.wav -r8000 sound_c3_8k.wav rm sound_c1.wav sound_c3.wav iaxmodem-1.2.0/lib/spandsp/tests/v17_tests.c0000644000175000017500000004460211150047202020234 0ustar julienjulien//#define ADD_MAINS_INTERFERENCE /* * SpanDSP - a series of DSP components for telephony * * v17_tests.c * * Written by Steve Underwood * * Copyright (C) 2004 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2, as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: v17_tests.c,v 1.84 2008/07/16 17:01:49 steveu Exp $ */ /*! \page v17_tests_page V.17 modem tests \section v17_tests_page_sec_1 What does it do? These tests test one way paths, as V.17 is a half-duplex modem. They allow either: - A V.17 transmit modem to feed a V.17 receive modem through a telephone line model. BER testing is then used to evaluate performance under various line conditions. This is effective for testing the basic performance of the receive modem. It is also the only test mode provided for evaluating the transmit modem. - A V.17 receive modem is used to decode V.17 audio, stored in a wave file. This is good way to evaluate performance with audio recorded from other models of modem, and with real world problematic telephone lines. If the appropriate GUI environment exists, the tests are built such that a visual display of modem status is maintained. \section v17_tests_page_sec_2 How is it used? */ #if defined(HAVE_CONFIG_H) #include "config.h" #endif #if defined(HAVE_FL_FL_H) && defined(HAVE_FL_FL_CARTESIAN_H) && defined(HAVE_FL_FL_AUDIO_METER_H) #define ENABLE_GUI #endif #include #include #include #include #include #include #include "spandsp.h" #include "spandsp-sim.h" #if defined(ENABLE_GUI) #include "modem_monitor.h" #include "line_model_monitor.h" #endif #define BLOCK_LEN 160 #define OUT_FILE_NAME "v17.wav" char *decode_test_file = NULL; int use_gui = FALSE; int symbol_no = 0; int rx_bits = 0; int tx_bits = 0; int test_bps; bert_state_t bert; one_way_line_model_state_t *line_model; #if defined(ENABLE_GUI) qam_monitor_t *qam_monitor; #endif bert_results_t latest_results; static void reporter(void *user_data, int reason, bert_results_t *results) { switch (reason) { case BERT_REPORT_SYNCED: printf("BERT report synced\n"); break; case BERT_REPORT_UNSYNCED: printf("BERT report unsync'ed\n"); break; case BERT_REPORT_REGULAR: printf("BERT report regular - %d bits, %d bad bits, %d resyncs\n", results->total_bits, results->bad_bits, results->resyncs); memcpy(&latest_results, results, sizeof(latest_results)); break; case BERT_REPORT_GT_10_2: printf("BERT report > 1 in 10^2\n"); break; case BERT_REPORT_LT_10_2: printf("BERT report < 1 in 10^2\n"); break; case BERT_REPORT_LT_10_3: printf("BERT report < 1 in 10^3\n"); break; case BERT_REPORT_LT_10_4: printf("BERT report < 1 in 10^4\n"); break; case BERT_REPORT_LT_10_5: printf("BERT report < 1 in 10^5\n"); break; case BERT_REPORT_LT_10_6: printf("BERT report < 1 in 10^6\n"); break; case BERT_REPORT_LT_10_7: printf("BERT report < 1 in 10^7\n"); break; default: printf("BERT report reason %d\n", reason); break; } } /*- End of function --------------------------------------------------------*/ static int v17_rx_status(void *user_data, int status) { v17_rx_state_t *rx; int i; int len; complexf_t *coeffs; printf("V.17 rx status is %d\n", status); rx = (v17_rx_state_t *) user_data; switch (status) { case PUTBIT_TRAINING_FAILED: printf("Training failed\n"); break; case PUTBIT_TRAINING_IN_PROGRESS: printf("Training in progress\n"); break; case PUTBIT_TRAINING_SUCCEEDED: printf("Training succeeded\n"); len = v17_rx_equalizer_state(rx, &coeffs); printf("Equalizer:\n"); for (i = 0; i < len; i++) printf("%3d (%15.5f, %15.5f) -> %15.5f\n", i, coeffs[i].re, coeffs[i].im, powerf(&coeffs[i])); break; case PUTBIT_CARRIER_UP: printf("Carrier up\n"); break; case PUTBIT_CARRIER_DOWN: printf("Carrier down\n"); break; default: printf("Eh! - %d\n", status); break; } return 0; } /*- End of function --------------------------------------------------------*/ static void v17putbit(void *user_data, int bit) { v17_rx_state_t *rx; if (bit < 0) { v17_rx_status(user_data, bit); return; } rx = (v17_rx_state_t *) user_data; if (decode_test_file) printf("Rx bit %d - %d\n", rx_bits++, bit); else bert_put_bit(&bert, bit); } /*- End of function --------------------------------------------------------*/ static int v17_tx_status(void *user_data, int status) { switch (status) { case MODEM_TX_STATUS_DATA_EXHAUSTED: printf("V.17 tx data exhausted\n"); break; case MODEM_TX_STATUS_SHUTDOWN_COMPLETE: printf("V.17 tx shutdown complete\n"); break; default: printf("V.17 tx status is %d\n", status); break; } return 0; } /*- End of function --------------------------------------------------------*/ static int v17getbit(void *user_data) { return bert_get_bit(&bert); } /*- End of function --------------------------------------------------------*/ static void qam_report(void *user_data, const complexf_t *constel, const complexf_t *target, int symbol) { int i; int len; complexf_t *coeffs; float fpower; v17_rx_state_t *rx; static float smooth_power = 0.0f; static int update_interval = 100; rx = (v17_rx_state_t *) user_data; if (constel) { #if defined(ENABLE_GUI) if (use_gui) { qam_monitor_update_constel(qam_monitor, constel); qam_monitor_update_carrier_tracking(qam_monitor, v17_rx_carrier_frequency(rx)); qam_monitor_update_symbol_tracking(qam_monitor, v17_rx_symbol_timing_correction(rx)); } #endif fpower = (constel->re - target->re)*(constel->re - target->re) + (constel->im - target->im)*(constel->im - target->im); smooth_power = 0.95f*smooth_power + 0.05f*fpower; printf("%8d [%8.4f, %8.4f] [%8.4f, %8.4f] %2x %8.4f %8.4f %9.4f %7.3f %7.2f\n", symbol_no, constel->re, constel->im, target->re, target->im, symbol, fpower, smooth_power, v17_rx_carrier_frequency(rx), v17_rx_signal_power(rx), v17_rx_symbol_timing_correction(rx)); printf("Carrier %d %f %f\n", symbol_no, v17_rx_carrier_frequency(rx), v17_rx_symbol_timing_correction(rx)); symbol_no++; if (--update_interval <= 0) { len = v17_rx_equalizer_state(rx, &coeffs); printf("Equalizer A:\n"); for (i = 0; i < len; i++) printf("%3d (%15.5f, %15.5f) -> %15.5f\n", i, coeffs[i].re, coeffs[i].im, powerf(&coeffs[i])); #if defined(ENABLE_GUI) if (use_gui) qam_monitor_update_equalizer(qam_monitor, coeffs, len); #endif update_interval = 100; } } } /*- End of function --------------------------------------------------------*/ int main(int argc, char *argv[]) { v17_rx_state_t rx; v17_tx_state_t tx; bert_results_t bert_results; int16_t gen_amp[BLOCK_LEN]; int16_t amp[BLOCK_LEN]; AFfilehandle inhandle; AFfilehandle outhandle; AFfilesetup filesetup; int outframes; int samples; int tep; int block_no; int noise_level; int signal_level; int bits_per_test; int line_model_no; int log_audio; int channel_codec; int rbs_pattern; float x; int opt; channel_codec = MUNGE_CODEC_NONE; rbs_pattern = 0; test_bps = 14400; tep = FALSE; line_model_no = 0; decode_test_file = NULL; use_gui = FALSE; noise_level = -70; signal_level = -13; bits_per_test = 50000; log_audio = FALSE; while ((opt = getopt(argc, argv, "b:c:d:glm:n:r:s:t")) != -1) { switch (opt) { case 'b': bits_per_test = atoi(optarg); break; case 'c': channel_codec = atoi(optarg); break; case 'd': decode_test_file = optarg; break; case 'g': #if defined(ENABLE_GUI) use_gui = TRUE; #else fprintf(stderr, "Graphical monitoring not available\n"); exit(2); #endif break; case 'l': log_audio = TRUE; break; case 'm': line_model_no = atoi(optarg); break; case 'n': noise_level = atoi(optarg); break; case 'r': rbs_pattern = atoi(optarg); break; case 's': signal_level = atoi(optarg); break; case 't': tep = TRUE; break; default: //usage(); exit(2); break; } } argc -= optind; argv += optind; if (argc > 0) { if (strcmp(argv[0], "14400") == 0) test_bps = 14400; else if (strcmp(argv[0], "12000") == 0) test_bps = 12000; else if (strcmp(argv[0], "9600") == 0) test_bps = 9600; else if (strcmp(argv[0], "7200") == 0) test_bps = 7200; else { fprintf(stderr, "Invalid bit rate\n"); exit(2); } } inhandle = NULL; outhandle = NULL; filesetup = AF_NULL_FILESETUP; if (log_audio) { if ((filesetup = afNewFileSetup()) == AF_NULL_FILESETUP) { fprintf(stderr, " Failed to create file setup\n"); exit(2); } afInitSampleFormat(filesetup, AF_DEFAULT_TRACK, AF_SAMPFMT_TWOSCOMP, 16); afInitRate(filesetup, AF_DEFAULT_TRACK, (float) SAMPLE_RATE); afInitFileFormat(filesetup, AF_FILE_WAVE); afInitChannels(filesetup, AF_DEFAULT_TRACK, 1); if ((outhandle = afOpenFile(OUT_FILE_NAME, "w", filesetup)) == AF_NULL_FILEHANDLE) { fprintf(stderr, " Cannot create wave file '%s'\n", OUT_FILE_NAME); exit(2); } } if (decode_test_file) { /* We will decode the audio from a wave file. */ if ((inhandle = afOpenFile(decode_test_file, "r", NULL)) == AF_NULL_FILEHANDLE) { fprintf(stderr, " Cannot open wave file '%s'\n", decode_test_file); exit(2); } if ((x = afGetFrameSize(inhandle, AF_DEFAULT_TRACK, 1)) != 2.0f) { printf(" Unexpected frame size in speech file '%s' (%f)\n", decode_test_file, x); exit(2); } if ((x = afGetRate(inhandle, AF_DEFAULT_TRACK)) != (float) SAMPLE_RATE) { printf(" Unexpected sample rate in speech file '%s' (%f)\n", decode_test_file, x); exit(2); } if ((x = afGetChannels(inhandle, AF_DEFAULT_TRACK)) != 1.0f) { printf(" Unexpected number of channels in speech file '%s' (%f)\n", decode_test_file, x); exit(2); } } else { /* We will generate V.17 audio, and add some noise to it. */ v17_tx_init(&tx, test_bps, tep, v17getbit, NULL); v17_tx_power(&tx, signal_level); v17_tx_set_modem_status_handler(&tx, v17_tx_status, (void *) &tx); /* Move the carrier off a bit */ tx.carrier_phase_rate = dds_phase_ratef(1792.0f); tx.carrier_phase = 0x40000000; bert_init(&bert, bits_per_test, BERT_PATTERN_ITU_O152_11, test_bps, 20); bert_set_report(&bert, 10000, reporter, NULL); if ((line_model = one_way_line_model_init(line_model_no, (float) noise_level, channel_codec, rbs_pattern)) == NULL) { fprintf(stderr, " Failed to create line model\n"); exit(2); } one_way_line_model_set_dc(line_model, 0.0f); #if defined(ADD_MAINS_INTERFERENCE) one_way_line_model_set_mains_pickup(line_model, 50, -40.0f); #endif } v17_rx_init(&rx, test_bps, v17putbit, &rx); v17_rx_set_modem_status_handler(&rx, v17_rx_status, (void *) &rx); v17_rx_set_qam_report_handler(&rx, qam_report, (void *) &rx); span_log_set_level(&rx.logging, SPAN_LOG_SHOW_SEVERITY | SPAN_LOG_SHOW_PROTOCOL | SPAN_LOG_FLOW); span_log_set_tag(&rx.logging, "V.17 rx"); #if defined(ENABLE_GUI) if (use_gui) { qam_monitor = qam_monitor_init(10.0f, NULL); if (!decode_test_file) { start_line_model_monitor(129); line_model_monitor_line_model_update(line_model->near_filter, line_model->near_filter_len); } } #endif memset(&latest_results, 0, sizeof(latest_results)); for (block_no = 0; block_no < 100000000; block_no++) { if (decode_test_file) { samples = afReadFrames(inhandle, AF_DEFAULT_TRACK, amp, BLOCK_LEN); #if defined(ENABLE_GUI) if (use_gui) qam_monitor_update_audio_level(qam_monitor, amp, samples); #endif if (samples == 0) break; } else { samples = v17_tx(&tx, gen_amp, BLOCK_LEN); #if defined(ENABLE_GUI) if (use_gui) qam_monitor_update_audio_level(qam_monitor, gen_amp, samples); #endif if (samples == 0) { printf("Restarting on zero output\n"); /* Push a little silence through, to ensure all the data bits get out of the buffers */ memset(amp, 0, BLOCK_LEN*sizeof(int16_t)); v17_rx(&rx, amp, BLOCK_LEN); /* Note that we might get a few bad bits as the carrier shuts down. */ bert_result(&bert, &bert_results); fprintf(stderr, "Final result %ddBm0, %d bits, %d bad bits, %d resyncs\n", signal_level, bert_results.total_bits, bert_results.bad_bits, bert_results.resyncs); fprintf(stderr, "Last report %ddBm0, %d bits, %d bad bits, %d resyncs\n", signal_level, latest_results.total_bits, latest_results.bad_bits, latest_results.resyncs); /* See if bit errors are appearing yet. Also check we are getting enough bits out of the receiver. The last regular report should be error free, though the final report will generally contain bits errors as the carrier was dying. The total number of bits out of the receiver should be at least the number we sent. Also, since BERT sync should have occurred rapidly at the start of transmission, the last report should have occurred at not much less than the total number of bits we sent. */ if (bert_results.total_bits < bits_per_test || latest_results.total_bits < bits_per_test - 100 || latest_results.bad_bits != 0) { break; } memset(&latest_results, 0, sizeof(latest_results)); signal_level--; /* Bump the receiver AGC gain by 1dB, to compensate for the above */ rx.agc_scaling_save *= 1.122f; v17_tx_restart(&tx, test_bps, tep, TRUE); v17_tx_power(&tx, signal_level); v17_rx_restart(&rx, test_bps, TRUE); //rx.eq_put_step = rand()%(192*10/3); bert_init(&bert, bits_per_test, BERT_PATTERN_ITU_O152_11, test_bps, 20); bert_set_report(&bert, 10000, reporter, NULL); one_way_line_model_release(line_model); if ((line_model = one_way_line_model_init(line_model_no, (float) noise_level, channel_codec, 0)) == NULL) { fprintf(stderr, " Failed to create line model\n"); exit(2); } } if (log_audio) { outframes = afWriteFrames(outhandle, AF_DEFAULT_TRACK, amp, samples); if (outframes != samples) { fprintf(stderr, " Error writing wave file\n"); exit(2); } } one_way_line_model(line_model, amp, gen_amp, samples); } #if defined(ENABLE_GUI) if (use_gui && !decode_test_file) line_model_monitor_line_spectrum_update(amp, samples); #endif v17_rx(&rx, amp, samples); } if (!decode_test_file) { bert_result(&bert, &bert_results); fprintf(stderr, "At completion:\n"); fprintf(stderr, "Final result %ddBm0, %d bits, %d bad bits, %d resyncs\n", signal_level, bert_results.total_bits, bert_results.bad_bits, bert_results.resyncs); fprintf(stderr, "Last report %ddBm0, %d bits, %d bad bits, %d resyncs\n", signal_level, latest_results.total_bits, latest_results.bad_bits, latest_results.resyncs); one_way_line_model_release(line_model); if (signal_level > -43) { printf("Tests failed.\n"); exit(2); } printf("Tests passed.\n"); } #if defined(ENABLE_GUI) if (use_gui) qam_wait_to_end(qam_monitor); #endif if (log_audio) { if (afCloseFile(outhandle)) { fprintf(stderr, " Cannot close wave file '%s'\n", OUT_FILE_NAME); exit(2); } afFreeFileSetup(filesetup); } return 0; } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/tests/bit_operations_tests.c0000644000175000017500000001630211150047202022634 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * bit_operations_tests.c * * Written by Steve Underwood * * Copyright (C) 2006 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2, as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: bit_operations_tests.c,v 1.14 2008/05/13 13:17:25 steveu Exp $ */ /*! \page bit_operations_tests_page Bit operations tests \section bit_operations_tests_page_sec_1 What does it do? These tests check the operation of efficient bit manipulation routines, by comparing their operation with very dumb brute force versions of the same functionality. \section bit_operations_tests_page_sec_2 How is it used? */ #if defined(HAVE_CONFIG_H) #include "config.h" #endif #include #include #include #include #include #include "spandsp.h" uint8_t from[1000000]; uint8_t to[1000000]; static __inline__ int top_bit_dumb(unsigned int data) { int i; if (data == 0) return -1; for (i = 31; i >= 0; i--) { if ((data & (1 << i))) return i; } return -1; } /*- End of function --------------------------------------------------------*/ static __inline__ int bottom_bit_dumb(unsigned int data) { int i; if (data == 0) return -1; for (i = 0; i < 32; i++) { if ((data & (1 << i))) return i; } return -1; } /*- End of function --------------------------------------------------------*/ static __inline__ uint8_t bit_reverse8_dumb(uint8_t data) { int i; int result; result = 0; for (i = 0; i < 8; i++) { result = (result << 1) | (data & 1); data >>= 1; } return result; } /*- End of function --------------------------------------------------------*/ static __inline__ uint32_t bit_reverse_4bytes_dumb(uint32_t data) { int i; uint32_t result; result = 0; for (i = 0; i < 8; i++) { result = (result << 1) | (data & 0x01010101); data >>= 1; } return result; } /*- End of function --------------------------------------------------------*/ static __inline__ uint16_t bit_reverse16_dumb(uint16_t data) { int i; uint16_t result; result = 0; for (i = 0; i < 16; i++) { result = (result << 1) | (data & 1); data >>= 1; } return result; } /*- End of function --------------------------------------------------------*/ static __inline__ uint32_t bit_reverse32_dumb(uint32_t data) { int i; uint32_t result; result = 0; for (i = 0; i < 32; i++) { result = (result << 1) | (data & 1); data >>= 1; } return result; } /*- End of function --------------------------------------------------------*/ static __inline__ int parity8_dumb(uint8_t x) { uint8_t y; int i; for (y = 0, i = 0; i < 8; i++) { y ^= (x & 1); x >>= 1; } return y; } /*- End of function --------------------------------------------------------*/ static __inline__ int one_bits32_dumb(uint32_t x) { int i; int bits; bits = 0; for (i = 0; i < 32; i++) { if (x & 1) bits++; x >>= 1; } return bits; } /*- End of function --------------------------------------------------------*/ int main(int argc, char *argv[]) { int i; uint32_t x; uint8_t ax; uint8_t bx; uint16_t ax16; uint16_t bx16; uint32_t ax32; uint32_t bx32; for (i = 0, x = 0; i < 100000; i++) { ax = top_bit_dumb(x); bx = top_bit(x); if (ax != bx) { printf("Test failed: top bit mismatch 0x%" PRIx32 " -> %u %u\n", x, ax, bx); exit(2); } ax = bottom_bit_dumb(x); bx = bottom_bit(x); if (ax != bx) { printf("Test failed: bottom bit mismatch 0x%" PRIx32 " -> %u %u\n", x, ax, bx); exit(2); } x = rand(); } for (i = 0; i < 256; i++) { ax = bit_reverse8_dumb(i); bx = bit_reverse8(i); if (ax != bx) { printf("Test failed: bit reverse 8 - %02x %02x %02x\n", i, ax, bx); exit(2); } } for (i = 0; i < 1000000; i++) from[i] = rand(); bit_reverse(to, from, 1000000); for (i = 0; i < 1000000; i++) { if (bit_reverse8_dumb(from[i]) != to[i]) { printf("Test failed: bit reverse - at %d, %02x %02x %02x\n", i, from[i], bit_reverse8(from[i]), to[i]); exit(2); } } for (i = 0; i < 256; i++) { x = i | (((i + 1) & 0xFF) << 8) | (((i + 2) & 0xFF) << 16) | (((i + 3) & 0xFF) << 24); ax32 = bit_reverse_4bytes_dumb(x); bx32 = bit_reverse_4bytes(x); if (ax32 != bx32) { printf("Test failed: bit reverse 4 bytes - %" PRIx32 " %" PRIx32 " %" PRIx32 "\n", x, ax32, bx32); exit(2); } } for (i = 0; i < 65536; i++) { ax16 = bit_reverse16_dumb(i); bx16 = bit_reverse16(i); if (ax16 != bx16) { printf("Test failed: bit reverse 16 - %x %x %x\n", i, ax16, bx16); exit(2); } } for (i = 0; i < 0x7FFFFF00; i += 127) { ax32 = bit_reverse32_dumb(i); bx32 = bit_reverse32(i); if (ax32 != bx32) { printf("Test failed: bit reverse 32 - %d %" PRIx32 " %" PRIx32 "\n", i, ax32, bx32); exit(2); } } for (i = 0; i < 256; i++) { ax = parity8(i); bx = parity8_dumb(i); if (ax != bx) { printf("Test failed: parity 8 - %x %x %x\n", i, ax, bx); exit(2); } } for (i = -1; i < 32; i++) { ax32 = most_significant_one32(1 << i); if (ax32 != (1 << i)) { printf("Test failed: most significant one 32 - %x %" PRIx32 " %x\n", i, ax32, (1 << i)); exit(2); } ax32 = least_significant_one32(1 << i); if (ax32 != (1 << i)) { printf("Test failed: least significant one 32 - %x %" PRIx32 " %x\n", i, ax32, (1 << i)); exit(2); } } for (i = 0x80000000; i < 0x800FFFFF; i++) { ax = one_bits32_dumb(i); bx = one_bits32(i); if (ax != bx) { printf("Test failed: one bits - %d, %x %x\n", i, ax, bx); exit(2); } } printf("Tests passed.\n"); return 0; } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/tests/v8_tests.c0000644000175000017500000002160011150047202020145 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * v8_tests.c * * Written by Steve Underwood * * Copyright (C) 2004 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2, as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: v8_tests.c,v 1.25 2008/05/13 13:17:27 steveu Exp $ */ /*! \page v8_tests_page V.8 tests \section v8_tests_page_sec_1 What does it do? */ #if defined(HAVE_CONFIG_H) #include "config.h" #endif #include #include #include #include #include #include #include "spandsp.h" #define FALSE 0 #define TRUE (!FALSE) #define SAMPLES_PER_CHUNK 160 #define OUTPUT_FILE_NAME "v8.wav" int negotiations_ok = 0; static void handler(void *user_data, v8_result_t *result) { const char *s; s = (const char *) user_data; if (result == NULL) { printf("%s V.8 negotiation failed\n", s); return; } printf("%s V.8 negotiation result:\n", s); printf(" Call function '%s'\n", v8_call_function_to_str(result->call_function)); printf(" Negotiated modulation '%s'\n", v8_modulation_to_str(result->negotiated_modulation)); printf(" Protocol '%s'\n", v8_protocol_to_str(result->protocol)); printf(" PSTN access '%s'\n", v8_pstn_access_to_str(result->pstn_access)); printf(" PCM modem availability '%s'\n", v8_pcm_modem_availability_to_str(result->pcm_modem_availability)); if (result->call_function == V8_CALL_V_SERIES && result->negotiated_modulation == V8_MOD_V90 && result->protocol == V8_PROTOCOL_LAPM_V42) { negotiations_ok++; } } int main(int argc, char *argv[]) { int i; int16_t amp[SAMPLES_PER_CHUNK]; int16_t out_amp[2*SAMPLES_PER_CHUNK]; v8_state_t v8_caller; v8_state_t v8_answerer; int outframes; int samples; int remnant; int caller_available_modulations; int answerer_available_modulations; AFfilehandle inhandle; AFfilehandle outhandle; AFfilesetup filesetup; int opt; char *decode_test_file; float x; decode_test_file = NULL; while ((opt = getopt(argc, argv, "d:")) != -1) { switch (opt) { case 'd': decode_test_file = optarg; break; default: //usage(); exit(2); break; } } caller_available_modulations = V8_MOD_V17 | V8_MOD_V21 | V8_MOD_V22 | V8_MOD_V23HALF | V8_MOD_V23 | V8_MOD_V26BIS | V8_MOD_V26TER | V8_MOD_V27TER | V8_MOD_V29 | V8_MOD_V32 | V8_MOD_V34HALF | V8_MOD_V34 | V8_MOD_V90 | V8_MOD_V92; answerer_available_modulations = V8_MOD_V17 | V8_MOD_V21 | V8_MOD_V22 | V8_MOD_V23HALF | V8_MOD_V23 | V8_MOD_V26BIS | V8_MOD_V26TER | V8_MOD_V27TER | V8_MOD_V29 | V8_MOD_V32 | V8_MOD_V34HALF | V8_MOD_V34 | V8_MOD_V90 | V8_MOD_V92; if (decode_test_file == NULL) { if ((filesetup = afNewFileSetup()) == AF_NULL_FILESETUP) { fprintf(stderr, " Failed to create file setup\n"); exit(2); } afInitSampleFormat(filesetup, AF_DEFAULT_TRACK, AF_SAMPFMT_TWOSCOMP, 16); afInitRate(filesetup, AF_DEFAULT_TRACK, (float) SAMPLE_RATE); afInitFileFormat(filesetup, AF_FILE_WAVE); afInitChannels(filesetup, AF_DEFAULT_TRACK, 2); if ((outhandle = afOpenFile(OUTPUT_FILE_NAME, "w", filesetup)) == AF_NULL_FILEHANDLE) { fprintf(stderr, " Cannot create wave file '%s'\n", OUTPUT_FILE_NAME); exit(2); } v8_init(&v8_caller, TRUE, caller_available_modulations, handler, (void *) "caller"); v8_init(&v8_answerer, FALSE, answerer_available_modulations, handler, (void *) "answerer"); span_log_set_level(&v8_caller.logging, SPAN_LOG_FLOW | SPAN_LOG_SHOW_TAG); span_log_set_tag(&v8_caller.logging, "caller"); span_log_set_level(&v8_answerer.logging, SPAN_LOG_FLOW | SPAN_LOG_SHOW_TAG); span_log_set_tag(&v8_answerer.logging, "answerer"); for (i = 0; i < 1000; i++) { samples = v8_tx(&v8_caller, amp, SAMPLES_PER_CHUNK); if (samples < SAMPLES_PER_CHUNK) { memset(amp + samples, 0, sizeof(int16_t)*(SAMPLES_PER_CHUNK - samples)); samples = SAMPLES_PER_CHUNK; } remnant = v8_rx(&v8_answerer, amp, samples); for (i = 0; i < samples; i++) out_amp[2*i] = amp[i]; samples = v8_tx(&v8_answerer, amp, SAMPLES_PER_CHUNK); if (samples < SAMPLES_PER_CHUNK) { memset(amp + samples, 0, sizeof(int16_t)*(SAMPLES_PER_CHUNK - samples)); samples = SAMPLES_PER_CHUNK; } if (v8_rx(&v8_caller, amp, samples) && remnant) break; for (i = 0; i < samples; i++) out_amp[2*i + 1] = amp[i]; outframes = afWriteFrames(outhandle, AF_DEFAULT_TRACK, out_amp, samples); if (outframes != samples) { fprintf(stderr, " Error writing wave file\n"); exit(2); } } if (afCloseFile(outhandle)) { fprintf(stderr, " Cannot close wave file '%s'\n", OUTPUT_FILE_NAME); exit(2); } afFreeFileSetup(filesetup); v8_release(&v8_caller); v8_release(&v8_answerer); if (negotiations_ok != 2) { printf("Tests failed.\n"); exit(2); } printf("Tests passed.\n"); } else { printf("Decode file '%s'\n", decode_test_file); v8_init(&v8_answerer, FALSE, answerer_available_modulations, handler, (void *) "answerer"); span_log_set_level(&v8_answerer.logging, SPAN_LOG_FLOW | SPAN_LOG_SHOW_TAG); span_log_set_tag(&v8_answerer.logging, "decoder"); if ((inhandle = afOpenFile(decode_test_file, "r", 0)) == AF_NULL_FILEHANDLE) { fprintf(stderr, " Cannot open speech file '%s'\n", decode_test_file); exit (2); } /*endif*/ if ((x = afGetFrameSize(inhandle, AF_DEFAULT_TRACK, 1)) != 2.0) { fprintf(stderr, " Unexpected frame size in speech file '%s'\n", decode_test_file); exit (2); } /*endif*/ if ((x = afGetRate(inhandle, AF_DEFAULT_TRACK)) != (float) SAMPLE_RATE) { fprintf(stderr, " Unexpected sample rate in speech file '%s'\n", decode_test_file); exit(2); } /*endif*/ if ((x = afGetChannels(inhandle, AF_DEFAULT_TRACK)) != 1.0) { fprintf(stderr, " Unexpected number of channels in speech file '%s'\n", decode_test_file); exit(2); } /*endif*/ while ((samples = afReadFrames(inhandle, AF_DEFAULT_TRACK, amp, SAMPLES_PER_CHUNK))) { remnant = v8_rx(&v8_answerer, amp, samples); } /*endwhile*/ v8_release(&v8_answerer); if (afCloseFile(inhandle) != 0) { fprintf(stderr, " Cannot close speech file '%s'\n", decode_test_file); exit(2); } /*endif*/ } return 0; } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/tests/v22bis_tests.c0000644000175000017500000003022311150047202020720 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * v22bis_tests.c * * Written by Steve Underwood * * Copyright (C) 2004 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2, as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: v22bis_tests.c,v 1.50 2008/05/13 13:17:26 steveu Exp $ */ /*! \page v22bis_tests_page V.22bis modem tests \section v22bis_tests_page_sec_1 What does it do? These tests connect two V.22bis modems back to back, through a telephone line model. BER testing is then used to evaluate performance under various line conditions. If the appropriate GUI environment exists, the tests are built such that a visual display of modem status is maintained. \section v22bis_tests_page_sec_2 How is it used? */ #if defined(HAVE_CONFIG_H) #include "config.h" #endif #if defined(HAVE_FL_FL_H) && defined(HAVE_FL_FL_CARTESIAN_H) && defined(HAVE_FL_FL_AUDIO_METER_H) #define ENABLE_GUI #endif #include #include #include #include #include #include #include "spandsp.h" #include "spandsp-sim.h" #if defined(ENABLE_GUI) #include "modem_monitor.h" #endif #define BLOCK_LEN 160 #define IN_FILE_NAME "v22bis_samp.wav" #define OUT_FILE_NAME "v22bis.wav" int in_bit = 0; int out_bit = 0; int in_bit_no = 0; int out_bit_no = 0; uint8_t tx_buf[1000]; int rx_ptr = 0; int tx_ptr = 0; int rx_bits = 0; int rx_bad_bits = 0; int use_gui = FALSE; both_ways_line_model_state_t *model; v22bis_state_t caller; v22bis_state_t answerer; struct qam_report_control_s { v22bis_state_t *s; #if defined(ENABLE_GUI) qam_monitor_t *qam_monitor; #endif float smooth_power; int symbol_no; }; struct qam_report_control_s qam_caller; struct qam_report_control_s qam_answerer; static void v22bis_putbit(void *user_data, int bit) { v22bis_state_t *s; int i; int len; complexf_t *coeffs; s = (v22bis_state_t *) user_data; if (bit < 0) { /* Special conditions */ switch (bit) { case PUTBIT_TRAINING_FAILED: printf("Training failed\n"); break; case PUTBIT_TRAINING_IN_PROGRESS: printf("Training in progress\n"); break; case PUTBIT_TRAINING_SUCCEEDED: printf("Training succeeded\n"); len = v22bis_equalizer_state(s, &coeffs); printf("Equalizer:\n"); for (i = 0; i < len; i++) printf("%3d (%15.5f, %15.5f) -> %15.5f\n", i, coeffs[i].re, coeffs[i].im, powerf(&coeffs[i])); break; case PUTBIT_CARRIER_UP: printf("Carrier up\n"); break; case PUTBIT_CARRIER_DOWN: printf("Carrier down\n"); break; default: printf("Eh! - %d\n", bit); break; } return; } if (bit != tx_buf[rx_ptr]) { printf("Rx bit %d - %d\n", rx_bits, bit); rx_bad_bits++; } rx_ptr++; if (rx_ptr > 1000) rx_ptr = 0; rx_bits++; if ((rx_bits % 100000) == 0) { printf("%d bits received, %d bad bits\r", rx_bits, rx_bad_bits); fflush(stdout); } } /*- End of function --------------------------------------------------------*/ static int v22bis_getbit(void *user_data) { int bit; static int tx_bits = 0; bit = rand() & 1; tx_buf[tx_ptr++] = bit; if (tx_ptr > 1000) tx_ptr = 0; //printf("Tx bit %d\n", bit); if (++tx_bits > 100000) { tx_bits = 0; bit = 2; } return bit; } /*- End of function --------------------------------------------------------*/ static void qam_report(void *user_data, const complexf_t *constel, const complexf_t *target, int symbol) { int i; int len; complexf_t *coeffs; float fpower; struct qam_report_control_s *s; s = (struct qam_report_control_s *) user_data; if (constel) { #if defined(ENABLE_GUI) if (use_gui) { qam_monitor_update_constel(s->qam_monitor, constel); qam_monitor_update_carrier_tracking(s->qam_monitor, v22bis_rx_carrier_frequency(s->s)); qam_monitor_update_symbol_tracking(s->qam_monitor, v22bis_symbol_timing_correction(s->s)); } #endif fpower = (constel->re - target->re)*(constel->re - target->re) + (constel->im - target->im)*(constel->im - target->im); s->smooth_power = 0.95f*s->smooth_power + 0.05f*fpower; printf("%8d [%8.4f, %8.4f] [%8.4f, %8.4f] %2x %8.4f %8.4f\n", s->symbol_no, constel->re, constel->im, target->re, target->im, symbol, fpower, s->smooth_power); s->symbol_no++; } else { printf("Gardner step %d\n", symbol); len = v22bis_equalizer_state(s->s, &coeffs); printf("Equalizer A:\n"); for (i = 0; i < len; i++) printf("%3d (%15.5f, %15.5f) -> %15.5f\n", i, coeffs[i].re, coeffs[i].im, powerf(&coeffs[i])); #if defined(ENABLE_GUI) if (use_gui) qam_monitor_update_equalizer(s->qam_monitor, coeffs, len); #endif } } /*- End of function --------------------------------------------------------*/ int main(int argc, char *argv[]) { int16_t caller_amp[BLOCK_LEN]; int16_t answerer_amp[BLOCK_LEN]; int16_t caller_model_amp[BLOCK_LEN]; int16_t answerer_model_amp[BLOCK_LEN]; int16_t out_amp[2*BLOCK_LEN]; AFfilehandle outhandle; AFfilesetup filesetup; int outframes; int samples; int i; int test_bps; int line_model_no; int bits_per_test; int noise_level; int signal_level; int log_audio; int channel_codec; int opt; channel_codec = MUNGE_CODEC_NONE; test_bps = 2400; line_model_no = 0; noise_level = -70; signal_level = -13; bits_per_test = 50000; log_audio = FALSE; while ((opt = getopt(argc, argv, "b:c:glm:n:s:")) != -1) { switch (opt) { case 'b': bits_per_test = atoi(optarg); break; case 'c': channel_codec = atoi(optarg); break; case 'g': #if defined(ENABLE_GUI) use_gui = TRUE; #else fprintf(stderr, "Graphical monitoring not available\n"); exit(2); #endif break; case 'l': log_audio = TRUE; break; case 'm': line_model_no = atoi(optarg); break; case 'n': noise_level = atoi(optarg); break; case 's': signal_level = atoi(optarg); break; default: //usage(); exit(2); break; } } argc -= optind; argv += optind; if (argc > 0) { if (strcmp(argv[0], "2400") == 0) test_bps = 2400; else if (strcmp(argv[0], "1200") == 0) test_bps = 1200; else { fprintf(stderr, "Invalid bit rate\n"); exit(2); } } filesetup = AF_NULL_FILESETUP; outhandle = AF_NULL_FILEHANDLE; if (log_audio) { if ((filesetup = afNewFileSetup()) == AF_NULL_FILESETUP) { fprintf(stderr, " Failed to create file setup\n"); exit(2); } afInitSampleFormat(filesetup, AF_DEFAULT_TRACK, AF_SAMPFMT_TWOSCOMP, 16); afInitRate(filesetup, AF_DEFAULT_TRACK, (float) SAMPLE_RATE); afInitFileFormat(filesetup, AF_FILE_WAVE); afInitChannels(filesetup, AF_DEFAULT_TRACK, 2); if ((outhandle = afOpenFile(OUT_FILE_NAME, "w", filesetup)) == AF_NULL_FILEHANDLE) { fprintf(stderr, " Cannot create wave file '%s'\n", OUT_FILE_NAME); exit(2); } } v22bis_init(&caller, test_bps, 2, TRUE, v22bis_getbit, v22bis_putbit, &caller); v22bis_tx_power(&caller, signal_level); /* Move the carrier off a bit */ caller.tx.carrier_phase_rate = dds_phase_ratef(1207.0f); v22bis_init(&answerer, test_bps, 2, FALSE, v22bis_getbit, v22bis_putbit, &answerer); v22bis_tx_power(&answerer, signal_level); answerer.tx.carrier_phase_rate = dds_phase_ratef(2407.0f); v22bis_set_qam_report_handler(&caller, qam_report, (void *) &qam_caller); v22bis_set_qam_report_handler(&answerer, qam_report, (void *) &qam_answerer); span_log_set_level(&caller.logging, SPAN_LOG_SHOW_SEVERITY | SPAN_LOG_SHOW_PROTOCOL | SPAN_LOG_SHOW_TAG | SPAN_LOG_FLOW); span_log_set_tag(&caller.logging, "caller"); span_log_set_level(&answerer.logging, SPAN_LOG_SHOW_SEVERITY | SPAN_LOG_SHOW_PROTOCOL | SPAN_LOG_SHOW_TAG | SPAN_LOG_FLOW); span_log_set_tag(&answerer.logging, "answerer"); qam_caller.s = &caller; qam_caller.smooth_power = 0.0f; qam_caller.symbol_no = 0; qam_answerer.s = &answerer; qam_answerer.smooth_power = 0.0f; qam_answerer.symbol_no = 0; #if defined(ENABLE_GUI) if (use_gui) { qam_caller.qam_monitor = qam_monitor_init(6.0f, "Calling modem"); qam_answerer.qam_monitor = qam_monitor_init(6.0f, "Answering modem"); } #endif if ((model = both_ways_line_model_init(line_model_no, (float) noise_level, line_model_no, (float) noise_level, channel_codec, 0)) == NULL) { fprintf(stderr, " Failed to create line model\n"); exit(2); } for (;;) { samples = v22bis_tx(&caller, caller_amp, BLOCK_LEN); #if defined(ENABLE_GUI) if (use_gui) qam_monitor_update_audio_level(qam_caller.qam_monitor, caller_amp, samples); #endif if (samples == 0) { printf("Restarting on zero output\n"); v22bis_restart(&caller, test_bps); rx_ptr = 0; tx_ptr = 0; } samples = v22bis_tx(&answerer, answerer_amp, BLOCK_LEN); #if defined(ENABLE_GUI) if (use_gui) qam_monitor_update_audio_level(qam_answerer.qam_monitor, answerer_amp, samples); #endif if (samples == 0) { printf("Restarting on zero output\n"); v22bis_restart(&answerer, test_bps); rx_ptr = 0; tx_ptr = 0; } both_ways_line_model(model, caller_model_amp, caller_amp, answerer_model_amp, answerer_amp, samples); v22bis_rx(&answerer, caller_model_amp, samples); for (i = 0; i < samples; i++) out_amp[2*i] = caller_model_amp[i]; for ( ; i < BLOCK_LEN; i++) out_amp[2*i] = 0; v22bis_rx(&caller, answerer_model_amp, samples); for (i = 0; i < samples; i++) out_amp[2*i + 1] = answerer_model_amp[i]; for ( ; i < BLOCK_LEN; i++) out_amp[2*i + 1] = 0; if (log_audio) { outframes = afWriteFrames(outhandle, AF_DEFAULT_TRACK, out_amp, BLOCK_LEN); if (outframes != BLOCK_LEN) { fprintf(stderr, " Error writing wave file\n"); exit(2); } } } if (log_audio) { if (afCloseFile(outhandle) != 0) { fprintf(stderr, " Cannot close wave file '%s'\n", OUT_FILE_NAME); exit(2); } afFreeFileSetup(filesetup); } return 0; } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/tests/v29_tests.c0000644000175000017500000004406511150047202020242 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * v29_tests.c * * Written by Steve Underwood * * Copyright (C) 2003 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2, as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: v29_tests.c,v 1.99 2008/07/16 17:01:49 steveu Exp $ */ /*! \page v29_tests_page V.29 modem tests \section v29_tests_page_sec_1 What does it do? These tests test one way paths, as V.29 is a half-duplex modem. They allow either: - A V.29 transmit modem to feed a V.29 receive modem through a telephone line model. BER testing is then used to evaluate performance under various line conditions. This is effective for testing the basic performance of the receive modem. It is also the only test mode provided for evaluating the transmit modem. - A V.29 receive modem is used to decode V.29 audio, stored in a wave file. This is good way to evaluate performance with audio recorded from other models of modem, and with real world problematic telephone lines. If the appropriate GUI environment exists, the tests are built such that a visual display of modem status is maintained. \section v29_tests_page_sec_2 How is it used? */ #if defined(HAVE_CONFIG_H) #include "config.h" #endif #if defined(HAVE_FL_FL_H) && defined(HAVE_FL_FL_CARTESIAN_H) && defined(HAVE_FL_FL_AUDIO_METER_H) #define ENABLE_GUI #endif #include #include #include #include #include #include #include "spandsp.h" #include "spandsp-sim.h" #if defined(ENABLE_GUI) #include "modem_monitor.h" #include "line_model_monitor.h" #endif #define BLOCK_LEN 160 #define OUT_FILE_NAME "v29.wav" char *decode_test_file = NULL; int use_gui = FALSE; int symbol_no = 0; int rx_bits = 0; bert_state_t bert; one_way_line_model_state_t *line_model; #if defined(ENABLE_GUI) qam_monitor_t *qam_monitor; #endif bert_results_t latest_results; static void reporter(void *user_data, int reason, bert_results_t *results) { switch (reason) { case BERT_REPORT_SYNCED: printf("BERT report synced\n"); break; case BERT_REPORT_UNSYNCED: printf("BERT report unsync'ed\n"); break; case BERT_REPORT_REGULAR: printf("BERT report regular - %d bits, %d bad bits, %d resyncs\n", results->total_bits, results->bad_bits, results->resyncs); memcpy(&latest_results, results, sizeof(latest_results)); break; case BERT_REPORT_GT_10_2: printf("BERT report > 1 in 10^2\n"); break; case BERT_REPORT_LT_10_2: printf("BERT report < 1 in 10^2\n"); break; case BERT_REPORT_LT_10_3: printf("BERT report < 1 in 10^3\n"); break; case BERT_REPORT_LT_10_4: printf("BERT report < 1 in 10^4\n"); break; case BERT_REPORT_LT_10_5: printf("BERT report < 1 in 10^5\n"); break; case BERT_REPORT_LT_10_6: printf("BERT report < 1 in 10^6\n"); break; case BERT_REPORT_LT_10_7: printf("BERT report < 1 in 10^7\n"); break; default: printf("BERT report reason %d\n", reason); break; } } /*- End of function --------------------------------------------------------*/ static int v29_rx_status(void *user_data, int status) { v29_rx_state_t *rx; int i; int len; complexf_t *coeffs; printf("V.29 rx status is %d\n", status); rx = (v29_rx_state_t *) user_data; switch (status) { case PUTBIT_TRAINING_FAILED: printf("Training failed\n"); break; case PUTBIT_TRAINING_IN_PROGRESS: printf("Training in progress\n"); break; case PUTBIT_TRAINING_SUCCEEDED: printf("Training succeeded\n"); len = v29_rx_equalizer_state(rx, &coeffs); printf("Equalizer:\n"); for (i = 0; i < len; i++) printf("%3d (%15.5f, %15.5f) -> %15.5f\n", i, coeffs[i].re, coeffs[i].im, powerf(&coeffs[i])); break; case PUTBIT_CARRIER_UP: printf("Carrier up\n"); break; case PUTBIT_CARRIER_DOWN: printf("Carrier down\n"); break; default: printf("Eh! - %d\n", status); break; } return 0; } /*- End of function --------------------------------------------------------*/ static void v29putbit(void *user_data, int bit) { v29_rx_state_t *rx; if (bit < 0) { v29_rx_status(user_data, bit); return; } rx = (v29_rx_state_t *) user_data; if (decode_test_file) printf("Rx bit %d - %d\n", rx_bits++, bit); else bert_put_bit(&bert, bit); } /*- End of function --------------------------------------------------------*/ static int v29_tx_status(void *user_data, int status) { switch (status) { case MODEM_TX_STATUS_DATA_EXHAUSTED: printf("V.29 tx data exhausted\n"); break; case MODEM_TX_STATUS_SHUTDOWN_COMPLETE: printf("V.29 tx shutdown complete\n"); break; default: printf("V.29 tx status is %d\n", status); break; } return 0; } /*- End of function --------------------------------------------------------*/ static int v29getbit(void *user_data) { return bert_get_bit(&bert); } /*- End of function --------------------------------------------------------*/ static void qam_report(void *user_data, const complexf_t *constel, const complexf_t *target, int symbol) { int i; int len; complexf_t *coeffs; float fpower; v29_rx_state_t *rx; static float smooth_power = 0.0f; static int update_interval = 100; rx = (v29_rx_state_t *) user_data; if (constel) { fpower = (constel->re - target->re)*(constel->re - target->re) + (constel->im - target->im)*(constel->im - target->im); smooth_power = 0.95f*smooth_power + 0.05f*fpower; #if defined(ENABLE_GUI) if (use_gui) { qam_monitor_update_constel(qam_monitor, constel); qam_monitor_update_carrier_tracking(qam_monitor, v29_rx_carrier_frequency(rx)); //qam_monitor_update_carrier_tracking(qam_monitor, (fpower) ? fpower : 0.001f); qam_monitor_update_symbol_tracking(qam_monitor, v29_rx_symbol_timing_correction(rx)); } #endif printf("%8d [%8.4f, %8.4f] [%8.4f, %8.4f] %2x %8.4f %8.4f %9.4f %7.3f %7.2f\n", symbol_no, constel->re, constel->im, target->re, target->im, symbol, fpower, smooth_power, v29_rx_carrier_frequency(rx), v29_rx_signal_power(rx), v29_rx_symbol_timing_correction(rx)); symbol_no++; if (--update_interval <= 0) { len = v29_rx_equalizer_state(rx, &coeffs); printf("Equalizer A:\n"); for (i = 0; i < len; i++) printf("%3d (%15.5f, %15.5f) -> %15.5f\n", i, coeffs[i].re, coeffs[i].im, powerf(&coeffs[i])); #if defined(ENABLE_GUI) if (use_gui) qam_monitor_update_equalizer(qam_monitor, coeffs, len); #endif update_interval = 100; } } } /*- End of function --------------------------------------------------------*/ int main(int argc, char *argv[]) { v29_rx_state_t rx; v29_tx_state_t tx; bert_results_t bert_results; int16_t gen_amp[BLOCK_LEN]; int16_t amp[BLOCK_LEN]; AFfilehandle inhandle; AFfilehandle outhandle; AFfilesetup filesetup; int outframes; int samples; int tep; int test_bps; int noise_level; int signal_level; int bits_per_test; int line_model_no; int block; int log_audio; int channel_codec; int rbs_pattern; float x; int opt; channel_codec = MUNGE_CODEC_NONE; rbs_pattern = 0; test_bps = 9600; tep = FALSE; line_model_no = 0; decode_test_file = NULL; use_gui = FALSE; noise_level = -70; signal_level = -13; bits_per_test = 50000; log_audio = FALSE; while ((opt = getopt(argc, argv, "b:c:d:glm:n:r:s:t")) != -1) { switch (opt) { case 'b': bits_per_test = atoi(optarg); break; case 'c': channel_codec = atoi(optarg); break; case 'd': decode_test_file = optarg; break; case 'g': #if defined(ENABLE_GUI) use_gui = TRUE; #else fprintf(stderr, "Graphical monitoring not available\n"); exit(2); #endif break; case 'l': log_audio = TRUE; break; case 'm': line_model_no = atoi(optarg); break; case 'n': noise_level = atoi(optarg); break; case 'r': rbs_pattern = atoi(optarg); break; case 's': signal_level = atoi(optarg); break; case 't': tep = TRUE; break; default: //usage(); exit(2); break; } } argc -= optind; argv += optind; if (argc > 0) { if (strcmp(argv[0], "9600") == 0) test_bps = 9600; else if (strcmp(argv[0], "7200") == 0) test_bps = 7200; else if (strcmp(argv[0], "4800") == 0) test_bps = 4800; else { fprintf(stderr, "Invalid bit rate\n"); exit(2); } } inhandle = NULL; outhandle = NULL; filesetup = AF_NULL_FILESETUP; if (log_audio) { if ((filesetup = afNewFileSetup()) == AF_NULL_FILESETUP) { fprintf(stderr, " Failed to create file setup\n"); exit(2); } afInitSampleFormat(filesetup, AF_DEFAULT_TRACK, AF_SAMPFMT_TWOSCOMP, 16); afInitRate(filesetup, AF_DEFAULT_TRACK, (float) SAMPLE_RATE); afInitFileFormat(filesetup, AF_FILE_WAVE); afInitChannels(filesetup, AF_DEFAULT_TRACK, 1); if ((outhandle = afOpenFile(OUT_FILE_NAME, "w", filesetup)) == AF_NULL_FILEHANDLE) { fprintf(stderr, " Cannot create wave file '%s'\n", OUT_FILE_NAME); exit(2); } } if (decode_test_file) { /* We will decode the audio from a wave file. */ if ((inhandle = afOpenFile(decode_test_file, "r", NULL)) == AF_NULL_FILEHANDLE) { fprintf(stderr, " Cannot open wave file '%s'\n", decode_test_file); exit(2); } if ((x = afGetFrameSize(inhandle, AF_DEFAULT_TRACK, 1)) != 2.0f) { printf(" Unexpected frame size in speech file '%s'\n", decode_test_file); exit(2); } if ((x = afGetRate(inhandle, AF_DEFAULT_TRACK)) != (float) SAMPLE_RATE) { printf(" Unexpected sample rate in speech file '%s'\n", decode_test_file); exit(2); } if ((x = afGetChannels(inhandle, AF_DEFAULT_TRACK)) != 1.0f) { printf(" Unexpected number of channels in speech file '%s'\n", decode_test_file); exit(2); } } else { /* We will generate V.29 audio, and add some noise to it. */ v29_tx_init(&tx, test_bps, tep, v29getbit, NULL); v29_tx_power(&tx, signal_level); v29_tx_set_modem_status_handler(&tx, v29_tx_status, (void *) &tx); /* Move the carrier off a bit */ tx.carrier_phase_rate = dds_phase_ratef(1710.0f); tx.carrier_phase = 0; bert_init(&bert, bits_per_test, BERT_PATTERN_ITU_O152_11, test_bps, 20); bert_set_report(&bert, 10000, reporter, NULL); if ((line_model = one_way_line_model_init(line_model_no, (float) noise_level, channel_codec, rbs_pattern)) == NULL) { fprintf(stderr, " Failed to create line model\n"); exit(2); } } v29_rx_init(&rx, test_bps, v29putbit, &rx); v29_rx_signal_cutoff(&rx, -45.5f); v29_rx_set_modem_status_handler(&rx, v29_rx_status, (void *) &rx); v29_rx_set_qam_report_handler(&rx, qam_report, (void *) &rx); /* Rotate the starting phase */ rx.carrier_phase = 0x80000000; span_log_set_level(&rx.logging, SPAN_LOG_SHOW_SEVERITY | SPAN_LOG_SHOW_PROTOCOL | SPAN_LOG_FLOW); span_log_set_tag(&rx.logging, "V.29-rx"); #if defined(ENABLE_GUI) if (use_gui) { qam_monitor = qam_monitor_init(6.0f, NULL); if (!decode_test_file) { start_line_model_monitor(129); line_model_monitor_line_model_update(line_model->near_filter, line_model->near_filter_len); } } #endif memset(&latest_results, 0, sizeof(latest_results)); for (block = 0; ; block++) { if (decode_test_file) { samples = afReadFrames(inhandle, AF_DEFAULT_TRACK, amp, BLOCK_LEN); #if defined(ENABLE_GUI) if (use_gui) qam_monitor_update_audio_level(qam_monitor, amp, samples); #endif if (samples == 0) break; } else { samples = v29_tx(&tx, gen_amp, BLOCK_LEN); #if defined(ENABLE_GUI) if (use_gui) qam_monitor_update_audio_level(qam_monitor, gen_amp, samples); #endif if (samples == 0) { /* Push a little silence through, to ensure all the data bits get out of the buffers */ memset(amp, 0, BLOCK_LEN*sizeof(int16_t)); v29_rx(&rx, amp, BLOCK_LEN); /* Note that we might get a few bad bits as the carrier shuts down. */ bert_result(&bert, &bert_results); fprintf(stderr, "Final result %ddBm0, %d bits, %d bad bits, %d resyncs\n", signal_level, bert_results.total_bits, bert_results.bad_bits, bert_results.resyncs); fprintf(stderr, "Last report %ddBm0, %d bits, %d bad bits, %d resyncs\n", signal_level, latest_results.total_bits, latest_results.bad_bits, latest_results.resyncs); /* See if bit errors are appearing yet. Also check we are getting enough bits out of the receiver. The last regular report should be error free, though the final report will generally contain bits errors as the carrier was dying. The total number of bits out of the receiver should be at least the number we sent. Also, since BERT sync should have occurred rapidly at the start of transmission, the last report should have occurred at not much less than the total number of bits we sent. */ if (bert_results.total_bits < bits_per_test || latest_results.total_bits < bits_per_test - 100 || latest_results.bad_bits != 0) { break; } memset(&latest_results, 0, sizeof(latest_results)); signal_level--; v29_tx_restart(&tx, test_bps, tep); v29_tx_power(&tx, signal_level); v29_rx_restart(&rx, test_bps, FALSE); rx.eq_put_step = rand()%(48*10/3); bert_init(&bert, bits_per_test, BERT_PATTERN_ITU_O152_11, test_bps, 20); bert_set_report(&bert, 10000, reporter, NULL); one_way_line_model_release(line_model); if ((line_model = one_way_line_model_init(line_model_no, (float) noise_level, channel_codec, 0)) == NULL) { fprintf(stderr, " Failed to create line model\n"); exit(2); } } if (log_audio) { outframes = afWriteFrames(outhandle, AF_DEFAULT_TRACK, gen_amp, samples); if (outframes != samples) { fprintf(stderr, " Error writing wave file\n"); exit(2); } } one_way_line_model(line_model, amp, gen_amp, samples); } #if defined(ENABLE_GUI) if (use_gui && !decode_test_file) line_model_monitor_line_spectrum_update(amp, samples); #endif v29_rx(&rx, amp, samples); if (decode_test_file == NULL && block%500 == 0) printf("Noise level is %d\n", noise_level); } if (!decode_test_file) { bert_result(&bert, &bert_results); fprintf(stderr, "At completion:\n"); fprintf(stderr, "Final result %ddBm0, %d bits, %d bad bits, %d resyncs\n", signal_level, bert_results.total_bits, bert_results.bad_bits, bert_results.resyncs); fprintf(stderr, "Last report %ddBm0, %d bits, %d bad bits, %d resyncs\n", signal_level, latest_results.total_bits, latest_results.bad_bits, latest_results.resyncs); one_way_line_model_release(line_model); if (signal_level > -43) { printf("Tests failed.\n"); exit(2); } printf("Tests passed.\n"); } #if defined(ENABLE_GUI) if (use_gui) qam_wait_to_end(qam_monitor); #endif if (log_audio) { if (afCloseFile(outhandle)) { fprintf(stderr, " Cannot close wave file '%s'\n", OUT_FILE_NAME); exit(2); } afFreeFileSetup(filesetup); } return 0; } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/tests/Makefile.in0000644000175000017500000016120511150047457020311 0ustar julienjulien# Makefile.in generated by automake 1.9.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = .. am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd INSTALL = @INSTALL@ install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ noinst_PROGRAMS = adsi_tests$(EXEEXT) async_tests$(EXEEXT) \ at_interpreter_tests$(EXEEXT) awgn_tests$(EXEEXT) \ bell_mf_rx_tests$(EXEEXT) bell_mf_tx_tests$(EXEEXT) \ bert_tests$(EXEEXT) bit_operations_tests$(EXEEXT) \ crc_tests$(EXEEXT) dc_restore_tests$(EXEEXT) \ dds_tests$(EXEEXT) dtmf_rx_tests$(EXEEXT) \ dtmf_tx_tests$(EXEEXT) echo_tests$(EXEEXT) fax_decode$(EXEEXT) \ fax_tests$(EXEEXT) fsk_tests$(EXEEXT) g1050_tests$(EXEEXT) \ g168_tests$(EXEEXT) g711_tests$(EXEEXT) g722_tests$(EXEEXT) \ g726_tests$(EXEEXT) gsm0610_tests$(EXEEXT) hdlc_tests$(EXEEXT) \ ima_adpcm_tests$(EXEEXT) line_model_tests$(EXEEXT) \ logging_tests$(EXEEXT) lpc10_tests$(EXEEXT) \ make_g168_css$(EXEEXT) modem_echo_tests$(EXEEXT) \ modem_connect_tones_tests$(EXEEXT) noise_tests$(EXEEXT) \ oki_adpcm_tests$(EXEEXT) playout_tests$(EXEEXT) \ plc_tests$(EXEEXT) power_meter_tests$(EXEEXT) \ queue_tests$(EXEEXT) r2_mf_rx_tests$(EXEEXT) \ r2_mf_tx_tests$(EXEEXT) rfc2198_sim_tests$(EXEEXT) \ schedule_tests$(EXEEXT) sig_tone_tests$(EXEEXT) \ super_tone_rx_tests$(EXEEXT) super_tone_tx_tests$(EXEEXT) \ t4_tests$(EXEEXT) t31_tests$(EXEEXT) t38_core_tests$(EXEEXT) \ t38_gateway_tests$(EXEEXT) \ t38_gateway_to_terminal_tests$(EXEEXT) \ t38_terminal_tests$(EXEEXT) \ t38_terminal_to_gateway_tests$(EXEEXT) \ time_scale_tests$(EXEEXT) tone_detect_tests$(EXEEXT) \ tone_generate_tests$(EXEEXT) tsb85_tests$(EXEEXT) \ v17_tests$(EXEEXT) v22bis_tests$(EXEEXT) v27ter_tests$(EXEEXT) \ v29_tests$(EXEEXT) v42_tests$(EXEEXT) v42bis_tests$(EXEEXT) \ v8_tests$(EXEEXT) vector_float_tests$(EXEEXT) \ vector_int_tests$(EXEEXT) testadsi$(EXEEXT) testfax$(EXEEXT) \ tsb85_tests$(EXEEXT) subdir = tests DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/config/ax_compiler_vendor.m4 \ $(top_srcdir)/config/ax_check_real_file.m4 \ $(top_srcdir)/config/ax_fixed_point_machine.m4 \ $(top_srcdir)/config/ax_misaligned_access_fails.m4 \ $(top_srcdir)/config/ax_c99_features.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/src/config.h CONFIG_CLEAN_FILES = PROGRAMS = $(noinst_PROGRAMS) am_adsi_tests_OBJECTS = adsi_tests.$(OBJEXT) adsi_tests_OBJECTS = $(am_adsi_tests_OBJECTS) am__DEPENDENCIES_1 = adsi_tests_DEPENDENCIES = $(am__DEPENDENCIES_1) am_async_tests_OBJECTS = async_tests.$(OBJEXT) async_tests_OBJECTS = $(am_async_tests_OBJECTS) async_tests_DEPENDENCIES = $(am__DEPENDENCIES_1) am_at_interpreter_tests_OBJECTS = at_interpreter_tests.$(OBJEXT) at_interpreter_tests_OBJECTS = $(am_at_interpreter_tests_OBJECTS) at_interpreter_tests_DEPENDENCIES = $(am__DEPENDENCIES_1) am_awgn_tests_OBJECTS = awgn_tests.$(OBJEXT) awgn_tests_OBJECTS = $(am_awgn_tests_OBJECTS) awgn_tests_DEPENDENCIES = $(am__DEPENDENCIES_1) am_bell_mf_rx_tests_OBJECTS = bell_mf_rx_tests.$(OBJEXT) bell_mf_rx_tests_OBJECTS = $(am_bell_mf_rx_tests_OBJECTS) bell_mf_rx_tests_DEPENDENCIES = $(am__DEPENDENCIES_1) am_bell_mf_tx_tests_OBJECTS = bell_mf_tx_tests.$(OBJEXT) bell_mf_tx_tests_OBJECTS = $(am_bell_mf_tx_tests_OBJECTS) bell_mf_tx_tests_DEPENDENCIES = $(am__DEPENDENCIES_1) am_bert_tests_OBJECTS = bert_tests.$(OBJEXT) bert_tests_OBJECTS = $(am_bert_tests_OBJECTS) bert_tests_DEPENDENCIES = $(am__DEPENDENCIES_1) am_bit_operations_tests_OBJECTS = bit_operations_tests.$(OBJEXT) bit_operations_tests_OBJECTS = $(am_bit_operations_tests_OBJECTS) bit_operations_tests_DEPENDENCIES = $(am__DEPENDENCIES_1) am_crc_tests_OBJECTS = crc_tests.$(OBJEXT) crc_tests_OBJECTS = $(am_crc_tests_OBJECTS) crc_tests_DEPENDENCIES = $(am__DEPENDENCIES_1) am_dc_restore_tests_OBJECTS = dc_restore_tests.$(OBJEXT) dc_restore_tests_OBJECTS = $(am_dc_restore_tests_OBJECTS) dc_restore_tests_DEPENDENCIES = $(am__DEPENDENCIES_1) am_dds_tests_OBJECTS = dds_tests.$(OBJEXT) dds_tests_OBJECTS = $(am_dds_tests_OBJECTS) dds_tests_DEPENDENCIES = $(am__DEPENDENCIES_1) am_dtmf_rx_tests_OBJECTS = dtmf_rx_tests.$(OBJEXT) dtmf_rx_tests_OBJECTS = $(am_dtmf_rx_tests_OBJECTS) dtmf_rx_tests_DEPENDENCIES = $(am__DEPENDENCIES_1) am_dtmf_tx_tests_OBJECTS = dtmf_tx_tests.$(OBJEXT) dtmf_tx_tests_OBJECTS = $(am_dtmf_tx_tests_OBJECTS) dtmf_tx_tests_DEPENDENCIES = $(am__DEPENDENCIES_1) am_echo_tests_OBJECTS = echo_tests.$(OBJEXT) echo_monitor.$(OBJEXT) echo_tests_OBJECTS = $(am_echo_tests_OBJECTS) echo_tests_DEPENDENCIES = $(am__DEPENDENCIES_1) am_fax_decode_OBJECTS = fax_decode.$(OBJEXT) fax_decode_OBJECTS = $(am_fax_decode_OBJECTS) fax_decode_DEPENDENCIES = $(am__DEPENDENCIES_1) am_fax_tests_OBJECTS = fax_tests.$(OBJEXT) fax_tests_OBJECTS = $(am_fax_tests_OBJECTS) fax_tests_DEPENDENCIES = $(am__DEPENDENCIES_1) am_fsk_tests_OBJECTS = fsk_tests.$(OBJEXT) fsk_tests_OBJECTS = $(am_fsk_tests_OBJECTS) fsk_tests_DEPENDENCIES = $(am__DEPENDENCIES_1) am_g1050_tests_OBJECTS = g1050_tests.$(OBJEXT) media_monitor.$(OBJEXT) g1050_tests_OBJECTS = $(am_g1050_tests_OBJECTS) g1050_tests_DEPENDENCIES = $(am__DEPENDENCIES_1) am_g168_tests_OBJECTS = g168_tests.$(OBJEXT) g168_tests_OBJECTS = $(am_g168_tests_OBJECTS) g168_tests_DEPENDENCIES = $(am__DEPENDENCIES_1) am_g711_tests_OBJECTS = g711_tests.$(OBJEXT) g711_tests_OBJECTS = $(am_g711_tests_OBJECTS) g711_tests_DEPENDENCIES = $(am__DEPENDENCIES_1) am_g722_tests_OBJECTS = g722_tests.$(OBJEXT) g722_tests_OBJECTS = $(am_g722_tests_OBJECTS) g722_tests_DEPENDENCIES = $(am__DEPENDENCIES_1) am_g726_tests_OBJECTS = g726_tests.$(OBJEXT) g726_tests_OBJECTS = $(am_g726_tests_OBJECTS) g726_tests_DEPENDENCIES = $(am__DEPENDENCIES_1) am_gsm0610_tests_OBJECTS = gsm0610_tests.$(OBJEXT) gsm0610_tests_OBJECTS = $(am_gsm0610_tests_OBJECTS) gsm0610_tests_DEPENDENCIES = $(am__DEPENDENCIES_1) am_hdlc_tests_OBJECTS = hdlc_tests.$(OBJEXT) hdlc_tests_OBJECTS = $(am_hdlc_tests_OBJECTS) hdlc_tests_DEPENDENCIES = $(am__DEPENDENCIES_1) am_ima_adpcm_tests_OBJECTS = ima_adpcm_tests.$(OBJEXT) ima_adpcm_tests_OBJECTS = $(am_ima_adpcm_tests_OBJECTS) ima_adpcm_tests_DEPENDENCIES = $(am__DEPENDENCIES_1) am_line_model_tests_OBJECTS = line_model_tests.$(OBJEXT) line_model_tests_OBJECTS = $(am_line_model_tests_OBJECTS) line_model_tests_DEPENDENCIES = $(am__DEPENDENCIES_1) am_logging_tests_OBJECTS = logging_tests.$(OBJEXT) logging_tests_OBJECTS = $(am_logging_tests_OBJECTS) logging_tests_DEPENDENCIES = $(am__DEPENDENCIES_1) am_lpc10_tests_OBJECTS = lpc10_tests.$(OBJEXT) lpc10_tests_OBJECTS = $(am_lpc10_tests_OBJECTS) lpc10_tests_DEPENDENCIES = $(am__DEPENDENCIES_1) am_make_g168_css_OBJECTS = make_g168_css.$(OBJEXT) make_g168_css_OBJECTS = $(am_make_g168_css_OBJECTS) make_g168_css_DEPENDENCIES = $(am__DEPENDENCIES_1) am_modem_connect_tones_tests_OBJECTS = \ modem_connect_tones_tests.$(OBJEXT) modem_connect_tones_tests_OBJECTS = \ $(am_modem_connect_tones_tests_OBJECTS) modem_connect_tones_tests_DEPENDENCIES = $(am__DEPENDENCIES_1) am_modem_echo_tests_OBJECTS = modem_echo_tests.$(OBJEXT) \ echo_monitor.$(OBJEXT) modem_echo_tests_OBJECTS = $(am_modem_echo_tests_OBJECTS) modem_echo_tests_DEPENDENCIES = $(am__DEPENDENCIES_1) am_noise_tests_OBJECTS = noise_tests.$(OBJEXT) noise_tests_OBJECTS = $(am_noise_tests_OBJECTS) noise_tests_DEPENDENCIES = $(am__DEPENDENCIES_1) am_oki_adpcm_tests_OBJECTS = oki_adpcm_tests.$(OBJEXT) oki_adpcm_tests_OBJECTS = $(am_oki_adpcm_tests_OBJECTS) oki_adpcm_tests_DEPENDENCIES = $(am__DEPENDENCIES_1) am_playout_tests_OBJECTS = playout_tests.$(OBJEXT) \ media_monitor.$(OBJEXT) playout_tests_OBJECTS = $(am_playout_tests_OBJECTS) playout_tests_DEPENDENCIES = $(am__DEPENDENCIES_1) am_plc_tests_OBJECTS = plc_tests.$(OBJEXT) plc_tests_OBJECTS = $(am_plc_tests_OBJECTS) plc_tests_DEPENDENCIES = $(am__DEPENDENCIES_1) am_power_meter_tests_OBJECTS = power_meter_tests.$(OBJEXT) power_meter_tests_OBJECTS = $(am_power_meter_tests_OBJECTS) power_meter_tests_DEPENDENCIES = $(am__DEPENDENCIES_1) am_queue_tests_OBJECTS = queue_tests.$(OBJEXT) queue_tests_OBJECTS = $(am_queue_tests_OBJECTS) queue_tests_DEPENDENCIES = $(am__DEPENDENCIES_1) am_r2_mf_rx_tests_OBJECTS = r2_mf_rx_tests.$(OBJEXT) r2_mf_rx_tests_OBJECTS = $(am_r2_mf_rx_tests_OBJECTS) r2_mf_rx_tests_DEPENDENCIES = $(am__DEPENDENCIES_1) am_r2_mf_tx_tests_OBJECTS = r2_mf_tx_tests.$(OBJEXT) r2_mf_tx_tests_OBJECTS = $(am_r2_mf_tx_tests_OBJECTS) r2_mf_tx_tests_DEPENDENCIES = $(am__DEPENDENCIES_1) am_rfc2198_sim_tests_OBJECTS = rfc2198_sim_tests.$(OBJEXT) \ media_monitor.$(OBJEXT) rfc2198_sim_tests_OBJECTS = $(am_rfc2198_sim_tests_OBJECTS) rfc2198_sim_tests_DEPENDENCIES = $(am__DEPENDENCIES_1) am_schedule_tests_OBJECTS = schedule_tests.$(OBJEXT) schedule_tests_OBJECTS = $(am_schedule_tests_OBJECTS) schedule_tests_DEPENDENCIES = $(am__DEPENDENCIES_1) am_sig_tone_tests_OBJECTS = sig_tone_tests.$(OBJEXT) sig_tone_tests_OBJECTS = $(am_sig_tone_tests_OBJECTS) sig_tone_tests_DEPENDENCIES = $(am__DEPENDENCIES_1) am_super_tone_rx_tests_OBJECTS = super_tone_rx_tests.$(OBJEXT) super_tone_rx_tests_OBJECTS = $(am_super_tone_rx_tests_OBJECTS) super_tone_rx_tests_DEPENDENCIES = $(am__DEPENDENCIES_1) am_super_tone_tx_tests_OBJECTS = super_tone_tx_tests.$(OBJEXT) super_tone_tx_tests_OBJECTS = $(am_super_tone_tx_tests_OBJECTS) super_tone_tx_tests_DEPENDENCIES = $(am__DEPENDENCIES_1) am_t31_tests_OBJECTS = t31_tests.$(OBJEXT) media_monitor.$(OBJEXT) t31_tests_OBJECTS = $(am_t31_tests_OBJECTS) t31_tests_DEPENDENCIES = $(am__DEPENDENCIES_1) am_t38_core_tests_OBJECTS = t38_core_tests.$(OBJEXT) t38_core_tests_OBJECTS = $(am_t38_core_tests_OBJECTS) t38_core_tests_DEPENDENCIES = $(am__DEPENDENCIES_1) am_t38_gateway_tests_OBJECTS = t38_gateway_tests.$(OBJEXT) \ media_monitor.$(OBJEXT) t38_gateway_tests_OBJECTS = $(am_t38_gateway_tests_OBJECTS) t38_gateway_tests_DEPENDENCIES = $(am__DEPENDENCIES_1) am_t38_gateway_to_terminal_tests_OBJECTS = \ t38_gateway_to_terminal_tests.$(OBJEXT) \ media_monitor.$(OBJEXT) t38_gateway_to_terminal_tests_OBJECTS = \ $(am_t38_gateway_to_terminal_tests_OBJECTS) t38_gateway_to_terminal_tests_DEPENDENCIES = $(am__DEPENDENCIES_1) am_t38_terminal_tests_OBJECTS = t38_terminal_tests.$(OBJEXT) \ media_monitor.$(OBJEXT) t38_terminal_tests_OBJECTS = $(am_t38_terminal_tests_OBJECTS) t38_terminal_tests_DEPENDENCIES = $(am__DEPENDENCIES_1) am_t38_terminal_to_gateway_tests_OBJECTS = \ t38_terminal_to_gateway_tests.$(OBJEXT) \ media_monitor.$(OBJEXT) t38_terminal_to_gateway_tests_OBJECTS = \ $(am_t38_terminal_to_gateway_tests_OBJECTS) t38_terminal_to_gateway_tests_DEPENDENCIES = $(am__DEPENDENCIES_1) am_t4_tests_OBJECTS = t4_tests.$(OBJEXT) t4_tests_OBJECTS = $(am_t4_tests_OBJECTS) t4_tests_DEPENDENCIES = $(am__DEPENDENCIES_1) am_testadsi_OBJECTS = testadsi.$(OBJEXT) testadsi_OBJECTS = $(am_testadsi_OBJECTS) testadsi_DEPENDENCIES = $(am__DEPENDENCIES_1) am_testfax_OBJECTS = testfax.$(OBJEXT) testfax_OBJECTS = $(am_testfax_OBJECTS) testfax_DEPENDENCIES = $(am__DEPENDENCIES_1) am_time_scale_tests_OBJECTS = time_scale_tests.$(OBJEXT) time_scale_tests_OBJECTS = $(am_time_scale_tests_OBJECTS) time_scale_tests_DEPENDENCIES = $(am__DEPENDENCIES_1) am_tone_detect_tests_OBJECTS = tone_detect_tests.$(OBJEXT) tone_detect_tests_OBJECTS = $(am_tone_detect_tests_OBJECTS) tone_detect_tests_DEPENDENCIES = $(am__DEPENDENCIES_1) am_tone_generate_tests_OBJECTS = tone_generate_tests.$(OBJEXT) tone_generate_tests_OBJECTS = $(am_tone_generate_tests_OBJECTS) tone_generate_tests_DEPENDENCIES = $(am__DEPENDENCIES_1) am_tsb85_tests_OBJECTS = tsb85_tests.$(OBJEXT) fax_tester.$(OBJEXT) tsb85_tests_OBJECTS = $(am_tsb85_tests_OBJECTS) tsb85_tests_DEPENDENCIES = $(am__DEPENDENCIES_1) am_v17_tests_OBJECTS = v17_tests.$(OBJEXT) \ line_model_monitor.$(OBJEXT) modem_monitor.$(OBJEXT) v17_tests_OBJECTS = $(am_v17_tests_OBJECTS) v17_tests_DEPENDENCIES = $(am__DEPENDENCIES_1) am_v22bis_tests_OBJECTS = v22bis_tests.$(OBJEXT) \ line_model_monitor.$(OBJEXT) modem_monitor.$(OBJEXT) v22bis_tests_OBJECTS = $(am_v22bis_tests_OBJECTS) v22bis_tests_DEPENDENCIES = $(am__DEPENDENCIES_1) am_v27ter_tests_OBJECTS = v27ter_tests.$(OBJEXT) \ line_model_monitor.$(OBJEXT) modem_monitor.$(OBJEXT) v27ter_tests_OBJECTS = $(am_v27ter_tests_OBJECTS) v27ter_tests_DEPENDENCIES = $(am__DEPENDENCIES_1) am_v29_tests_OBJECTS = v29_tests.$(OBJEXT) \ line_model_monitor.$(OBJEXT) modem_monitor.$(OBJEXT) v29_tests_OBJECTS = $(am_v29_tests_OBJECTS) v29_tests_DEPENDENCIES = $(am__DEPENDENCIES_1) am_v42_tests_OBJECTS = v42_tests.$(OBJEXT) v42_tests_OBJECTS = $(am_v42_tests_OBJECTS) v42_tests_DEPENDENCIES = $(am__DEPENDENCIES_1) am_v42bis_tests_OBJECTS = v42bis_tests.$(OBJEXT) v42bis_tests_OBJECTS = $(am_v42bis_tests_OBJECTS) v42bis_tests_DEPENDENCIES = $(am__DEPENDENCIES_1) am_v8_tests_OBJECTS = v8_tests.$(OBJEXT) v8_tests_OBJECTS = $(am_v8_tests_OBJECTS) v8_tests_DEPENDENCIES = $(am__DEPENDENCIES_1) am_vector_float_tests_OBJECTS = vector_float_tests.$(OBJEXT) vector_float_tests_OBJECTS = $(am_vector_float_tests_OBJECTS) vector_float_tests_DEPENDENCIES = $(am__DEPENDENCIES_1) am_vector_int_tests_OBJECTS = vector_int_tests.$(OBJEXT) vector_int_tests_OBJECTS = $(am_vector_int_tests_OBJECTS) vector_int_tests_DEPENDENCIES = $(am__DEPENDENCIES_1) DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)/src depcomp = $(SHELL) $(top_srcdir)/config/depcomp am__depfiles_maybe = depfiles COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) --tag=CXX --mode=compile $(CXX) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CXXFLAGS) $(CXXFLAGS) CXXLD = $(CXX) CXXLINK = $(LIBTOOL) --tag=CXX --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ SOURCES = $(adsi_tests_SOURCES) $(async_tests_SOURCES) \ $(at_interpreter_tests_SOURCES) $(awgn_tests_SOURCES) \ $(bell_mf_rx_tests_SOURCES) $(bell_mf_tx_tests_SOURCES) \ $(bert_tests_SOURCES) $(bit_operations_tests_SOURCES) \ $(crc_tests_SOURCES) $(dc_restore_tests_SOURCES) \ $(dds_tests_SOURCES) $(dtmf_rx_tests_SOURCES) \ $(dtmf_tx_tests_SOURCES) $(echo_tests_SOURCES) \ $(fax_decode_SOURCES) $(fax_tests_SOURCES) \ $(fsk_tests_SOURCES) $(g1050_tests_SOURCES) \ $(g168_tests_SOURCES) $(g711_tests_SOURCES) \ $(g722_tests_SOURCES) $(g726_tests_SOURCES) \ $(gsm0610_tests_SOURCES) $(hdlc_tests_SOURCES) \ $(ima_adpcm_tests_SOURCES) $(line_model_tests_SOURCES) \ $(logging_tests_SOURCES) $(lpc10_tests_SOURCES) \ $(make_g168_css_SOURCES) $(modem_connect_tones_tests_SOURCES) \ $(modem_echo_tests_SOURCES) $(noise_tests_SOURCES) \ $(oki_adpcm_tests_SOURCES) $(playout_tests_SOURCES) \ $(plc_tests_SOURCES) $(power_meter_tests_SOURCES) \ $(queue_tests_SOURCES) $(r2_mf_rx_tests_SOURCES) \ $(r2_mf_tx_tests_SOURCES) $(rfc2198_sim_tests_SOURCES) \ $(schedule_tests_SOURCES) $(sig_tone_tests_SOURCES) \ $(super_tone_rx_tests_SOURCES) $(super_tone_tx_tests_SOURCES) \ $(t31_tests_SOURCES) $(t38_core_tests_SOURCES) \ $(t38_gateway_tests_SOURCES) \ $(t38_gateway_to_terminal_tests_SOURCES) \ $(t38_terminal_tests_SOURCES) \ $(t38_terminal_to_gateway_tests_SOURCES) $(t4_tests_SOURCES) \ $(testadsi_SOURCES) $(testfax_SOURCES) \ $(time_scale_tests_SOURCES) $(tone_detect_tests_SOURCES) \ $(tone_generate_tests_SOURCES) $(tsb85_tests_SOURCES) \ $(v17_tests_SOURCES) $(v22bis_tests_SOURCES) \ $(v27ter_tests_SOURCES) $(v29_tests_SOURCES) \ $(v42_tests_SOURCES) $(v42bis_tests_SOURCES) \ $(v8_tests_SOURCES) $(vector_float_tests_SOURCES) \ $(vector_int_tests_SOURCES) DIST_SOURCES = $(adsi_tests_SOURCES) $(async_tests_SOURCES) \ $(at_interpreter_tests_SOURCES) $(awgn_tests_SOURCES) \ $(bell_mf_rx_tests_SOURCES) $(bell_mf_tx_tests_SOURCES) \ $(bert_tests_SOURCES) $(bit_operations_tests_SOURCES) \ $(crc_tests_SOURCES) $(dc_restore_tests_SOURCES) \ $(dds_tests_SOURCES) $(dtmf_rx_tests_SOURCES) \ $(dtmf_tx_tests_SOURCES) $(echo_tests_SOURCES) \ $(fax_decode_SOURCES) $(fax_tests_SOURCES) \ $(fsk_tests_SOURCES) $(g1050_tests_SOURCES) \ $(g168_tests_SOURCES) $(g711_tests_SOURCES) \ $(g722_tests_SOURCES) $(g726_tests_SOURCES) \ $(gsm0610_tests_SOURCES) $(hdlc_tests_SOURCES) \ $(ima_adpcm_tests_SOURCES) $(line_model_tests_SOURCES) \ $(logging_tests_SOURCES) $(lpc10_tests_SOURCES) \ $(make_g168_css_SOURCES) $(modem_connect_tones_tests_SOURCES) \ $(modem_echo_tests_SOURCES) $(noise_tests_SOURCES) \ $(oki_adpcm_tests_SOURCES) $(playout_tests_SOURCES) \ $(plc_tests_SOURCES) $(power_meter_tests_SOURCES) \ $(queue_tests_SOURCES) $(r2_mf_rx_tests_SOURCES) \ $(r2_mf_tx_tests_SOURCES) $(rfc2198_sim_tests_SOURCES) \ $(schedule_tests_SOURCES) $(sig_tone_tests_SOURCES) \ $(super_tone_rx_tests_SOURCES) $(super_tone_tx_tests_SOURCES) \ $(t31_tests_SOURCES) $(t38_core_tests_SOURCES) \ $(t38_gateway_tests_SOURCES) \ $(t38_gateway_to_terminal_tests_SOURCES) \ $(t38_terminal_tests_SOURCES) \ $(t38_terminal_to_gateway_tests_SOURCES) $(t4_tests_SOURCES) \ $(testadsi_SOURCES) $(testfax_SOURCES) \ $(time_scale_tests_SOURCES) $(tone_detect_tests_SOURCES) \ $(tone_generate_tests_SOURCES) $(tsb85_tests_SOURCES) \ $(v17_tests_SOURCES) $(v22bis_tests_SOURCES) \ $(v27ter_tests_SOURCES) $(v29_tests_SOURCES) \ $(v42_tests_SOURCES) $(v42bis_tests_SOURCES) \ $(v8_tests_SOURCES) $(vector_float_tests_SOURCES) \ $(vector_int_tests_SOURCES) DATA = $(noinst_DATA) HEADERS = $(noinst_HEADERS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMDEP_FALSE = @AMDEP_FALSE@ AMDEP_TRUE = @AMDEP_TRUE@ AMTAR = @AMTAR@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CC_FOR_BUILD = @CC_FOR_BUILD@ CFLAGS = @CFLAGS@ COMP_VENDOR_CFLAGS = @COMP_VENDOR_CFLAGS@ COMP_VENDOR_LDFLAGS = @COMP_VENDOR_LDFLAGS@ COND_DOC_FALSE = @COND_DOC_FALSE@ COND_DOC_TRUE = @COND_DOC_TRUE@ COND_MMX_FALSE = @COND_MMX_FALSE@ COND_MMX_TRUE = @COND_MMX_TRUE@ COND_SSE_FALSE = @COND_SSE_FALSE@ COND_SSE_TRUE = @COND_SSE_TRUE@ COND_TESTDATA_FALSE = @COND_TESTDATA_FALSE@ COND_TESTDATA_TRUE = @COND_TESTDATA_TRUE@ COND_TESTS_FALSE = @COND_TESTS_FALSE@ COND_TESTS_TRUE = @COND_TESTS_TRUE@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CPPFLAGS_FOR_BUILD = @CPPFLAGS_FOR_BUILD@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DSYMUTIL = @DSYMUTIL@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ GREP = @GREP@ INSERT_INTTYPES_HEADER = @INSERT_INTTYPES_HEADER@ INSERT_MATH_HEADER = @INSERT_MATH_HEADER@ INSERT_STDINT_HEADER = @INSERT_STDINT_HEADER@ INSERT_TGMATH_HEADER = @INSERT_TGMATH_HEADER@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ $(TESTLIBS) LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ NMEDIT = @NMEDIT@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SPANDSP_LT_AGE = @SPANDSP_LT_AGE@ SPANDSP_LT_CURRENT = @SPANDSP_LT_CURRENT@ SPANDSP_LT_REVISION = @SPANDSP_LT_REVISION@ SPANDSP_MISALIGNED_ACCESS_FAILS = @SPANDSP_MISALIGNED_ACCESS_FAILS@ SPANDSP_USE_FIXED_POINT = @SPANDSP_USE_FIXED_POINT@ STRIP = @STRIP@ TESTLIBS = @TESTLIBS@ VERSION = @VERSION@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ AM_CFLAGS = $(COMP_VENDOR_CFLAGS) AM_LDFLAGS = $(COMP_VENDOR_LDFLAGS) noinst_DATA = sound_c1_8k.wav sound_c3_8k.wav EXTRA_DIST = regression_tests.sh v42bis_tests.sh fax_tests.sh MAINTAINERCLEANFILES = Makefile.in INCLUDES = -I$(top_builddir)/src -I$(top_builddir)/spandsp-sim -DDATADIR="\"$(pkgdatadir)\"" LIBDIR = -L$(top_builddir)/src noinst_HEADERS = echo_monitor.h \ fax_tester.h \ line_model_monitor.h \ media_monitor.h \ modem_monitor.h adsi_tests_SOURCES = adsi_tests.c adsi_tests_LDADD = $(LIBDIR) -lspandsp async_tests_SOURCES = async_tests.c async_tests_LDADD = $(LIBDIR) -lspandsp at_interpreter_tests_SOURCES = at_interpreter_tests.c at_interpreter_tests_LDADD = $(LIBDIR) -lspandsp awgn_tests_SOURCES = awgn_tests.c awgn_tests_LDADD = $(LIBDIR) -lspandsp bell_mf_rx_tests_SOURCES = bell_mf_rx_tests.c bell_mf_rx_tests_LDADD = $(LIBDIR) -lspandsp bell_mf_tx_tests_SOURCES = bell_mf_tx_tests.c bell_mf_tx_tests_LDADD = $(LIBDIR) -lspandsp bert_tests_SOURCES = bert_tests.c bert_tests_LDADD = $(LIBDIR) -lspandsp bit_operations_tests_SOURCES = bit_operations_tests.c bit_operations_tests_LDADD = $(LIBDIR) -lspandsp crc_tests_SOURCES = crc_tests.c crc_tests_LDADD = $(LIBDIR) -lspandsp dc_restore_tests_SOURCES = dc_restore_tests.c dc_restore_tests_LDADD = $(LIBDIR) -lspandsp dds_tests_SOURCES = dds_tests.c dds_tests_LDADD = $(LIBDIR) -lspandsp dtmf_rx_tests_SOURCES = dtmf_rx_tests.c dtmf_rx_tests_LDADD = -L$(top_builddir)/spandsp-sim -lspandsp-sim $(LIBDIR) -lspandsp dtmf_tx_tests_SOURCES = dtmf_tx_tests.c dtmf_tx_tests_LDADD = $(LIBDIR) -lspandsp echo_tests_SOURCES = echo_tests.c echo_monitor.cpp echo_tests_LDADD = $(LIBDIR) -lspandsp fax_decode_SOURCES = fax_decode.c fax_decode_LDADD = $(LIBDIR) -lspandsp fax_tests_SOURCES = fax_tests.c fax_tests_LDADD = $(LIBDIR) -lspandsp fsk_tests_SOURCES = fsk_tests.c fsk_tests_LDADD = -L$(top_builddir)/spandsp-sim -lspandsp-sim $(LIBDIR) -lspandsp g1050_tests_SOURCES = g1050_tests.c media_monitor.cpp g1050_tests_LDADD = -L$(top_builddir)/spandsp-sim -lspandsp-sim $(LIBDIR) -lspandsp g168_tests_SOURCES = g168_tests.c g168_tests_LDADD = $(LIBDIR) -lspandsp g711_tests_SOURCES = g711_tests.c g711_tests_LDADD = $(LIBDIR) -lspandsp g722_tests_SOURCES = g722_tests.c g722_tests_LDADD = $(LIBDIR) -lspandsp g726_tests_SOURCES = g726_tests.c g726_tests_LDADD = $(LIBDIR) -lspandsp gsm0610_tests_SOURCES = gsm0610_tests.c gsm0610_tests_LDADD = $(LIBDIR) -lspandsp hdlc_tests_SOURCES = hdlc_tests.c hdlc_tests_LDADD = $(LIBDIR) -lspandsp ima_adpcm_tests_SOURCES = ima_adpcm_tests.c ima_adpcm_tests_LDADD = $(LIBDIR) -lspandsp line_model_tests_SOURCES = line_model_tests.c line_model_tests_LDADD = -L$(top_builddir)/spandsp-sim -lspandsp-sim $(LIBDIR) -lspandsp logging_tests_SOURCES = logging_tests.c logging_tests_LDADD = $(LIBDIR) -lspandsp lpc10_tests_SOURCES = lpc10_tests.c lpc10_tests_LDADD = $(LIBDIR) -lspandsp make_g168_css_SOURCES = make_g168_css.c make_g168_css_LDADD = $(LIBDIR) -lspandsp modem_echo_tests_SOURCES = modem_echo_tests.c echo_monitor.cpp modem_echo_tests_LDADD = $(LIBDIR) -lspandsp modem_connect_tones_tests_SOURCES = modem_connect_tones_tests.c modem_connect_tones_tests_LDADD = $(LIBDIR) -lspandsp noise_tests_SOURCES = noise_tests.c noise_tests_LDADD = $(LIBDIR) -lspandsp oki_adpcm_tests_SOURCES = oki_adpcm_tests.c oki_adpcm_tests_LDADD = $(LIBDIR) -lspandsp playout_tests_SOURCES = playout_tests.c media_monitor.cpp playout_tests_LDADD = -L$(top_builddir)/spandsp-sim -lspandsp-sim $(LIBDIR) -lspandsp plc_tests_SOURCES = plc_tests.c plc_tests_LDADD = $(LIBDIR) -lspandsp power_meter_tests_SOURCES = power_meter_tests.c power_meter_tests_LDADD = $(LIBDIR) -lspandsp queue_tests_SOURCES = queue_tests.c queue_tests_LDADD = $(LIBDIR) -lspandsp r2_mf_rx_tests_SOURCES = r2_mf_rx_tests.c r2_mf_rx_tests_LDADD = $(LIBDIR) -lspandsp r2_mf_tx_tests_SOURCES = r2_mf_tx_tests.c r2_mf_tx_tests_LDADD = $(LIBDIR) -lspandsp rfc2198_sim_tests_SOURCES = rfc2198_sim_tests.c media_monitor.cpp rfc2198_sim_tests_LDADD = -L$(top_builddir)/spandsp-sim -lspandsp-sim $(LIBDIR) -lspandsp schedule_tests_SOURCES = schedule_tests.c schedule_tests_LDADD = $(LIBDIR) -lspandsp sig_tone_tests_SOURCES = sig_tone_tests.c sig_tone_tests_LDADD = $(LIBDIR) -lspandsp super_tone_rx_tests_SOURCES = super_tone_rx_tests.c super_tone_rx_tests_LDADD = $(LIBDIR) -lspandsp super_tone_tx_tests_SOURCES = super_tone_tx_tests.c super_tone_tx_tests_LDADD = $(LIBDIR) -lspandsp t4_tests_SOURCES = t4_tests.c t4_tests_LDADD = $(LIBDIR) -lspandsp t31_tests_SOURCES = t31_tests.c media_monitor.cpp t31_tests_LDADD = -L$(top_builddir)/spandsp-sim -lspandsp-sim $(LIBDIR) -lspandsp t38_core_tests_SOURCES = t38_core_tests.c t38_core_tests_LDADD = $(LIBDIR) -lspandsp t38_gateway_tests_SOURCES = t38_gateway_tests.c media_monitor.cpp t38_gateway_tests_LDADD = -L$(top_builddir)/spandsp-sim -lspandsp-sim $(LIBDIR) -lspandsp t38_gateway_to_terminal_tests_SOURCES = t38_gateway_to_terminal_tests.c media_monitor.cpp t38_gateway_to_terminal_tests_LDADD = -L$(top_builddir)/spandsp-sim -lspandsp-sim $(LIBDIR) -lspandsp t38_terminal_tests_SOURCES = t38_terminal_tests.c media_monitor.cpp t38_terminal_tests_LDADD = -L$(top_builddir)/spandsp-sim -lspandsp-sim $(LIBDIR) -lspandsp t38_terminal_to_gateway_tests_SOURCES = t38_terminal_to_gateway_tests.c media_monitor.cpp t38_terminal_to_gateway_tests_LDADD = -L$(top_builddir)/spandsp-sim -lspandsp-sim $(LIBDIR) -lspandsp time_scale_tests_SOURCES = time_scale_tests.c time_scale_tests_LDADD = $(LIBDIR) -lspandsp tone_detect_tests_SOURCES = tone_detect_tests.c tone_detect_tests_LDADD = $(LIBDIR) -lspandsp tone_generate_tests_SOURCES = tone_generate_tests.c tone_generate_tests_LDADD = $(LIBDIR) -lspandsp tsb85_tests_SOURCES = tsb85_tests.c fax_tester.c tsb85_tests_LDADD = $(LIBDIR) -lspandsp v17_tests_SOURCES = v17_tests.c line_model_monitor.cpp modem_monitor.cpp v17_tests_LDADD = -L$(top_builddir)/spandsp-sim -lspandsp-sim $(LIBDIR) -lspandsp v22bis_tests_SOURCES = v22bis_tests.c line_model_monitor.cpp modem_monitor.cpp v22bis_tests_LDADD = -L$(top_builddir)/spandsp-sim -lspandsp-sim $(LIBDIR) -lspandsp v27ter_tests_SOURCES = v27ter_tests.c line_model_monitor.cpp modem_monitor.cpp v27ter_tests_LDADD = -L$(top_builddir)/spandsp-sim -lspandsp-sim $(LIBDIR) -lspandsp v29_tests_SOURCES = v29_tests.c line_model_monitor.cpp modem_monitor.cpp v29_tests_LDADD = -L$(top_builddir)/spandsp-sim -lspandsp-sim $(LIBDIR) -lspandsp v42_tests_SOURCES = v42_tests.c v42_tests_LDADD = $(LIBDIR) -lspandsp v42bis_tests_SOURCES = v42bis_tests.c v42bis_tests_LDADD = $(LIBDIR) -lspandsp v8_tests_SOURCES = v8_tests.c v8_tests_LDADD = $(LIBDIR) -lspandsp vector_float_tests_SOURCES = vector_float_tests.c vector_float_tests_LDADD = $(LIBDIR) -lspandsp vector_int_tests_SOURCES = vector_int_tests.c vector_int_tests_LDADD = $(LIBDIR) -lspandsp testadsi_SOURCES = testadsi.c testadsi_LDADD = $(LIBDIR) -lspandsp testfax_SOURCES = testfax.c testfax_LDADD = $(LIBDIR) -lspandsp all: all-am .SUFFIXES: .SUFFIXES: .c .cpp .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu tests/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu tests/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh clean-noinstPROGRAMS: @list='$(noinst_PROGRAMS)'; for p in $$list; do \ f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ echo " rm -f $$p $$f"; \ rm -f $$p $$f ; \ done adsi_tests$(EXEEXT): $(adsi_tests_OBJECTS) $(adsi_tests_DEPENDENCIES) @rm -f adsi_tests$(EXEEXT) $(LINK) $(adsi_tests_LDFLAGS) $(adsi_tests_OBJECTS) $(adsi_tests_LDADD) $(LIBS) async_tests$(EXEEXT): $(async_tests_OBJECTS) $(async_tests_DEPENDENCIES) @rm -f async_tests$(EXEEXT) $(LINK) $(async_tests_LDFLAGS) $(async_tests_OBJECTS) $(async_tests_LDADD) $(LIBS) at_interpreter_tests$(EXEEXT): $(at_interpreter_tests_OBJECTS) $(at_interpreter_tests_DEPENDENCIES) @rm -f at_interpreter_tests$(EXEEXT) $(LINK) $(at_interpreter_tests_LDFLAGS) $(at_interpreter_tests_OBJECTS) $(at_interpreter_tests_LDADD) $(LIBS) awgn_tests$(EXEEXT): $(awgn_tests_OBJECTS) $(awgn_tests_DEPENDENCIES) @rm -f awgn_tests$(EXEEXT) $(LINK) $(awgn_tests_LDFLAGS) $(awgn_tests_OBJECTS) $(awgn_tests_LDADD) $(LIBS) bell_mf_rx_tests$(EXEEXT): $(bell_mf_rx_tests_OBJECTS) $(bell_mf_rx_tests_DEPENDENCIES) @rm -f bell_mf_rx_tests$(EXEEXT) $(LINK) $(bell_mf_rx_tests_LDFLAGS) $(bell_mf_rx_tests_OBJECTS) $(bell_mf_rx_tests_LDADD) $(LIBS) bell_mf_tx_tests$(EXEEXT): $(bell_mf_tx_tests_OBJECTS) $(bell_mf_tx_tests_DEPENDENCIES) @rm -f bell_mf_tx_tests$(EXEEXT) $(LINK) $(bell_mf_tx_tests_LDFLAGS) $(bell_mf_tx_tests_OBJECTS) $(bell_mf_tx_tests_LDADD) $(LIBS) bert_tests$(EXEEXT): $(bert_tests_OBJECTS) $(bert_tests_DEPENDENCIES) @rm -f bert_tests$(EXEEXT) $(LINK) $(bert_tests_LDFLAGS) $(bert_tests_OBJECTS) $(bert_tests_LDADD) $(LIBS) bit_operations_tests$(EXEEXT): $(bit_operations_tests_OBJECTS) $(bit_operations_tests_DEPENDENCIES) @rm -f bit_operations_tests$(EXEEXT) $(LINK) $(bit_operations_tests_LDFLAGS) $(bit_operations_tests_OBJECTS) $(bit_operations_tests_LDADD) $(LIBS) crc_tests$(EXEEXT): $(crc_tests_OBJECTS) $(crc_tests_DEPENDENCIES) @rm -f crc_tests$(EXEEXT) $(LINK) $(crc_tests_LDFLAGS) $(crc_tests_OBJECTS) $(crc_tests_LDADD) $(LIBS) dc_restore_tests$(EXEEXT): $(dc_restore_tests_OBJECTS) $(dc_restore_tests_DEPENDENCIES) @rm -f dc_restore_tests$(EXEEXT) $(LINK) $(dc_restore_tests_LDFLAGS) $(dc_restore_tests_OBJECTS) $(dc_restore_tests_LDADD) $(LIBS) dds_tests$(EXEEXT): $(dds_tests_OBJECTS) $(dds_tests_DEPENDENCIES) @rm -f dds_tests$(EXEEXT) $(LINK) $(dds_tests_LDFLAGS) $(dds_tests_OBJECTS) $(dds_tests_LDADD) $(LIBS) dtmf_rx_tests$(EXEEXT): $(dtmf_rx_tests_OBJECTS) $(dtmf_rx_tests_DEPENDENCIES) @rm -f dtmf_rx_tests$(EXEEXT) $(LINK) $(dtmf_rx_tests_LDFLAGS) $(dtmf_rx_tests_OBJECTS) $(dtmf_rx_tests_LDADD) $(LIBS) dtmf_tx_tests$(EXEEXT): $(dtmf_tx_tests_OBJECTS) $(dtmf_tx_tests_DEPENDENCIES) @rm -f dtmf_tx_tests$(EXEEXT) $(LINK) $(dtmf_tx_tests_LDFLAGS) $(dtmf_tx_tests_OBJECTS) $(dtmf_tx_tests_LDADD) $(LIBS) echo_tests$(EXEEXT): $(echo_tests_OBJECTS) $(echo_tests_DEPENDENCIES) @rm -f echo_tests$(EXEEXT) $(CXXLINK) $(echo_tests_LDFLAGS) $(echo_tests_OBJECTS) $(echo_tests_LDADD) $(LIBS) fax_decode$(EXEEXT): $(fax_decode_OBJECTS) $(fax_decode_DEPENDENCIES) @rm -f fax_decode$(EXEEXT) $(LINK) $(fax_decode_LDFLAGS) $(fax_decode_OBJECTS) $(fax_decode_LDADD) $(LIBS) fax_tests$(EXEEXT): $(fax_tests_OBJECTS) $(fax_tests_DEPENDENCIES) @rm -f fax_tests$(EXEEXT) $(LINK) $(fax_tests_LDFLAGS) $(fax_tests_OBJECTS) $(fax_tests_LDADD) $(LIBS) fsk_tests$(EXEEXT): $(fsk_tests_OBJECTS) $(fsk_tests_DEPENDENCIES) @rm -f fsk_tests$(EXEEXT) $(LINK) $(fsk_tests_LDFLAGS) $(fsk_tests_OBJECTS) $(fsk_tests_LDADD) $(LIBS) g1050_tests$(EXEEXT): $(g1050_tests_OBJECTS) $(g1050_tests_DEPENDENCIES) @rm -f g1050_tests$(EXEEXT) $(CXXLINK) $(g1050_tests_LDFLAGS) $(g1050_tests_OBJECTS) $(g1050_tests_LDADD) $(LIBS) g168_tests$(EXEEXT): $(g168_tests_OBJECTS) $(g168_tests_DEPENDENCIES) @rm -f g168_tests$(EXEEXT) $(LINK) $(g168_tests_LDFLAGS) $(g168_tests_OBJECTS) $(g168_tests_LDADD) $(LIBS) g711_tests$(EXEEXT): $(g711_tests_OBJECTS) $(g711_tests_DEPENDENCIES) @rm -f g711_tests$(EXEEXT) $(LINK) $(g711_tests_LDFLAGS) $(g711_tests_OBJECTS) $(g711_tests_LDADD) $(LIBS) g722_tests$(EXEEXT): $(g722_tests_OBJECTS) $(g722_tests_DEPENDENCIES) @rm -f g722_tests$(EXEEXT) $(LINK) $(g722_tests_LDFLAGS) $(g722_tests_OBJECTS) $(g722_tests_LDADD) $(LIBS) g726_tests$(EXEEXT): $(g726_tests_OBJECTS) $(g726_tests_DEPENDENCIES) @rm -f g726_tests$(EXEEXT) $(LINK) $(g726_tests_LDFLAGS) $(g726_tests_OBJECTS) $(g726_tests_LDADD) $(LIBS) gsm0610_tests$(EXEEXT): $(gsm0610_tests_OBJECTS) $(gsm0610_tests_DEPENDENCIES) @rm -f gsm0610_tests$(EXEEXT) $(LINK) $(gsm0610_tests_LDFLAGS) $(gsm0610_tests_OBJECTS) $(gsm0610_tests_LDADD) $(LIBS) hdlc_tests$(EXEEXT): $(hdlc_tests_OBJECTS) $(hdlc_tests_DEPENDENCIES) @rm -f hdlc_tests$(EXEEXT) $(LINK) $(hdlc_tests_LDFLAGS) $(hdlc_tests_OBJECTS) $(hdlc_tests_LDADD) $(LIBS) ima_adpcm_tests$(EXEEXT): $(ima_adpcm_tests_OBJECTS) $(ima_adpcm_tests_DEPENDENCIES) @rm -f ima_adpcm_tests$(EXEEXT) $(LINK) $(ima_adpcm_tests_LDFLAGS) $(ima_adpcm_tests_OBJECTS) $(ima_adpcm_tests_LDADD) $(LIBS) line_model_tests$(EXEEXT): $(line_model_tests_OBJECTS) $(line_model_tests_DEPENDENCIES) @rm -f line_model_tests$(EXEEXT) $(LINK) $(line_model_tests_LDFLAGS) $(line_model_tests_OBJECTS) $(line_model_tests_LDADD) $(LIBS) logging_tests$(EXEEXT): $(logging_tests_OBJECTS) $(logging_tests_DEPENDENCIES) @rm -f logging_tests$(EXEEXT) $(LINK) $(logging_tests_LDFLAGS) $(logging_tests_OBJECTS) $(logging_tests_LDADD) $(LIBS) lpc10_tests$(EXEEXT): $(lpc10_tests_OBJECTS) $(lpc10_tests_DEPENDENCIES) @rm -f lpc10_tests$(EXEEXT) $(LINK) $(lpc10_tests_LDFLAGS) $(lpc10_tests_OBJECTS) $(lpc10_tests_LDADD) $(LIBS) make_g168_css$(EXEEXT): $(make_g168_css_OBJECTS) $(make_g168_css_DEPENDENCIES) @rm -f make_g168_css$(EXEEXT) $(LINK) $(make_g168_css_LDFLAGS) $(make_g168_css_OBJECTS) $(make_g168_css_LDADD) $(LIBS) modem_connect_tones_tests$(EXEEXT): $(modem_connect_tones_tests_OBJECTS) $(modem_connect_tones_tests_DEPENDENCIES) @rm -f modem_connect_tones_tests$(EXEEXT) $(LINK) $(modem_connect_tones_tests_LDFLAGS) $(modem_connect_tones_tests_OBJECTS) $(modem_connect_tones_tests_LDADD) $(LIBS) modem_echo_tests$(EXEEXT): $(modem_echo_tests_OBJECTS) $(modem_echo_tests_DEPENDENCIES) @rm -f modem_echo_tests$(EXEEXT) $(CXXLINK) $(modem_echo_tests_LDFLAGS) $(modem_echo_tests_OBJECTS) $(modem_echo_tests_LDADD) $(LIBS) noise_tests$(EXEEXT): $(noise_tests_OBJECTS) $(noise_tests_DEPENDENCIES) @rm -f noise_tests$(EXEEXT) $(LINK) $(noise_tests_LDFLAGS) $(noise_tests_OBJECTS) $(noise_tests_LDADD) $(LIBS) oki_adpcm_tests$(EXEEXT): $(oki_adpcm_tests_OBJECTS) $(oki_adpcm_tests_DEPENDENCIES) @rm -f oki_adpcm_tests$(EXEEXT) $(LINK) $(oki_adpcm_tests_LDFLAGS) $(oki_adpcm_tests_OBJECTS) $(oki_adpcm_tests_LDADD) $(LIBS) playout_tests$(EXEEXT): $(playout_tests_OBJECTS) $(playout_tests_DEPENDENCIES) @rm -f playout_tests$(EXEEXT) $(CXXLINK) $(playout_tests_LDFLAGS) $(playout_tests_OBJECTS) $(playout_tests_LDADD) $(LIBS) plc_tests$(EXEEXT): $(plc_tests_OBJECTS) $(plc_tests_DEPENDENCIES) @rm -f plc_tests$(EXEEXT) $(LINK) $(plc_tests_LDFLAGS) $(plc_tests_OBJECTS) $(plc_tests_LDADD) $(LIBS) power_meter_tests$(EXEEXT): $(power_meter_tests_OBJECTS) $(power_meter_tests_DEPENDENCIES) @rm -f power_meter_tests$(EXEEXT) $(LINK) $(power_meter_tests_LDFLAGS) $(power_meter_tests_OBJECTS) $(power_meter_tests_LDADD) $(LIBS) queue_tests$(EXEEXT): $(queue_tests_OBJECTS) $(queue_tests_DEPENDENCIES) @rm -f queue_tests$(EXEEXT) $(LINK) $(queue_tests_LDFLAGS) $(queue_tests_OBJECTS) $(queue_tests_LDADD) $(LIBS) r2_mf_rx_tests$(EXEEXT): $(r2_mf_rx_tests_OBJECTS) $(r2_mf_rx_tests_DEPENDENCIES) @rm -f r2_mf_rx_tests$(EXEEXT) $(LINK) $(r2_mf_rx_tests_LDFLAGS) $(r2_mf_rx_tests_OBJECTS) $(r2_mf_rx_tests_LDADD) $(LIBS) r2_mf_tx_tests$(EXEEXT): $(r2_mf_tx_tests_OBJECTS) $(r2_mf_tx_tests_DEPENDENCIES) @rm -f r2_mf_tx_tests$(EXEEXT) $(LINK) $(r2_mf_tx_tests_LDFLAGS) $(r2_mf_tx_tests_OBJECTS) $(r2_mf_tx_tests_LDADD) $(LIBS) rfc2198_sim_tests$(EXEEXT): $(rfc2198_sim_tests_OBJECTS) $(rfc2198_sim_tests_DEPENDENCIES) @rm -f rfc2198_sim_tests$(EXEEXT) $(CXXLINK) $(rfc2198_sim_tests_LDFLAGS) $(rfc2198_sim_tests_OBJECTS) $(rfc2198_sim_tests_LDADD) $(LIBS) schedule_tests$(EXEEXT): $(schedule_tests_OBJECTS) $(schedule_tests_DEPENDENCIES) @rm -f schedule_tests$(EXEEXT) $(LINK) $(schedule_tests_LDFLAGS) $(schedule_tests_OBJECTS) $(schedule_tests_LDADD) $(LIBS) sig_tone_tests$(EXEEXT): $(sig_tone_tests_OBJECTS) $(sig_tone_tests_DEPENDENCIES) @rm -f sig_tone_tests$(EXEEXT) $(LINK) $(sig_tone_tests_LDFLAGS) $(sig_tone_tests_OBJECTS) $(sig_tone_tests_LDADD) $(LIBS) super_tone_rx_tests$(EXEEXT): $(super_tone_rx_tests_OBJECTS) $(super_tone_rx_tests_DEPENDENCIES) @rm -f super_tone_rx_tests$(EXEEXT) $(LINK) $(super_tone_rx_tests_LDFLAGS) $(super_tone_rx_tests_OBJECTS) $(super_tone_rx_tests_LDADD) $(LIBS) super_tone_tx_tests$(EXEEXT): $(super_tone_tx_tests_OBJECTS) $(super_tone_tx_tests_DEPENDENCIES) @rm -f super_tone_tx_tests$(EXEEXT) $(LINK) $(super_tone_tx_tests_LDFLAGS) $(super_tone_tx_tests_OBJECTS) $(super_tone_tx_tests_LDADD) $(LIBS) t31_tests$(EXEEXT): $(t31_tests_OBJECTS) $(t31_tests_DEPENDENCIES) @rm -f t31_tests$(EXEEXT) $(CXXLINK) $(t31_tests_LDFLAGS) $(t31_tests_OBJECTS) $(t31_tests_LDADD) $(LIBS) t38_core_tests$(EXEEXT): $(t38_core_tests_OBJECTS) $(t38_core_tests_DEPENDENCIES) @rm -f t38_core_tests$(EXEEXT) $(LINK) $(t38_core_tests_LDFLAGS) $(t38_core_tests_OBJECTS) $(t38_core_tests_LDADD) $(LIBS) t38_gateway_tests$(EXEEXT): $(t38_gateway_tests_OBJECTS) $(t38_gateway_tests_DEPENDENCIES) @rm -f t38_gateway_tests$(EXEEXT) $(CXXLINK) $(t38_gateway_tests_LDFLAGS) $(t38_gateway_tests_OBJECTS) $(t38_gateway_tests_LDADD) $(LIBS) t38_gateway_to_terminal_tests$(EXEEXT): $(t38_gateway_to_terminal_tests_OBJECTS) $(t38_gateway_to_terminal_tests_DEPENDENCIES) @rm -f t38_gateway_to_terminal_tests$(EXEEXT) $(CXXLINK) $(t38_gateway_to_terminal_tests_LDFLAGS) $(t38_gateway_to_terminal_tests_OBJECTS) $(t38_gateway_to_terminal_tests_LDADD) $(LIBS) t38_terminal_tests$(EXEEXT): $(t38_terminal_tests_OBJECTS) $(t38_terminal_tests_DEPENDENCIES) @rm -f t38_terminal_tests$(EXEEXT) $(CXXLINK) $(t38_terminal_tests_LDFLAGS) $(t38_terminal_tests_OBJECTS) $(t38_terminal_tests_LDADD) $(LIBS) t38_terminal_to_gateway_tests$(EXEEXT): $(t38_terminal_to_gateway_tests_OBJECTS) $(t38_terminal_to_gateway_tests_DEPENDENCIES) @rm -f t38_terminal_to_gateway_tests$(EXEEXT) $(CXXLINK) $(t38_terminal_to_gateway_tests_LDFLAGS) $(t38_terminal_to_gateway_tests_OBJECTS) $(t38_terminal_to_gateway_tests_LDADD) $(LIBS) t4_tests$(EXEEXT): $(t4_tests_OBJECTS) $(t4_tests_DEPENDENCIES) @rm -f t4_tests$(EXEEXT) $(LINK) $(t4_tests_LDFLAGS) $(t4_tests_OBJECTS) $(t4_tests_LDADD) $(LIBS) testadsi$(EXEEXT): $(testadsi_OBJECTS) $(testadsi_DEPENDENCIES) @rm -f testadsi$(EXEEXT) $(LINK) $(testadsi_LDFLAGS) $(testadsi_OBJECTS) $(testadsi_LDADD) $(LIBS) testfax$(EXEEXT): $(testfax_OBJECTS) $(testfax_DEPENDENCIES) @rm -f testfax$(EXEEXT) $(LINK) $(testfax_LDFLAGS) $(testfax_OBJECTS) $(testfax_LDADD) $(LIBS) time_scale_tests$(EXEEXT): $(time_scale_tests_OBJECTS) $(time_scale_tests_DEPENDENCIES) @rm -f time_scale_tests$(EXEEXT) $(LINK) $(time_scale_tests_LDFLAGS) $(time_scale_tests_OBJECTS) $(time_scale_tests_LDADD) $(LIBS) tone_detect_tests$(EXEEXT): $(tone_detect_tests_OBJECTS) $(tone_detect_tests_DEPENDENCIES) @rm -f tone_detect_tests$(EXEEXT) $(LINK) $(tone_detect_tests_LDFLAGS) $(tone_detect_tests_OBJECTS) $(tone_detect_tests_LDADD) $(LIBS) tone_generate_tests$(EXEEXT): $(tone_generate_tests_OBJECTS) $(tone_generate_tests_DEPENDENCIES) @rm -f tone_generate_tests$(EXEEXT) $(LINK) $(tone_generate_tests_LDFLAGS) $(tone_generate_tests_OBJECTS) $(tone_generate_tests_LDADD) $(LIBS) tsb85_tests$(EXEEXT): $(tsb85_tests_OBJECTS) $(tsb85_tests_DEPENDENCIES) @rm -f tsb85_tests$(EXEEXT) $(LINK) $(tsb85_tests_LDFLAGS) $(tsb85_tests_OBJECTS) $(tsb85_tests_LDADD) $(LIBS) v17_tests$(EXEEXT): $(v17_tests_OBJECTS) $(v17_tests_DEPENDENCIES) @rm -f v17_tests$(EXEEXT) $(CXXLINK) $(v17_tests_LDFLAGS) $(v17_tests_OBJECTS) $(v17_tests_LDADD) $(LIBS) v22bis_tests$(EXEEXT): $(v22bis_tests_OBJECTS) $(v22bis_tests_DEPENDENCIES) @rm -f v22bis_tests$(EXEEXT) $(CXXLINK) $(v22bis_tests_LDFLAGS) $(v22bis_tests_OBJECTS) $(v22bis_tests_LDADD) $(LIBS) v27ter_tests$(EXEEXT): $(v27ter_tests_OBJECTS) $(v27ter_tests_DEPENDENCIES) @rm -f v27ter_tests$(EXEEXT) $(CXXLINK) $(v27ter_tests_LDFLAGS) $(v27ter_tests_OBJECTS) $(v27ter_tests_LDADD) $(LIBS) v29_tests$(EXEEXT): $(v29_tests_OBJECTS) $(v29_tests_DEPENDENCIES) @rm -f v29_tests$(EXEEXT) $(CXXLINK) $(v29_tests_LDFLAGS) $(v29_tests_OBJECTS) $(v29_tests_LDADD) $(LIBS) v42_tests$(EXEEXT): $(v42_tests_OBJECTS) $(v42_tests_DEPENDENCIES) @rm -f v42_tests$(EXEEXT) $(LINK) $(v42_tests_LDFLAGS) $(v42_tests_OBJECTS) $(v42_tests_LDADD) $(LIBS) v42bis_tests$(EXEEXT): $(v42bis_tests_OBJECTS) $(v42bis_tests_DEPENDENCIES) @rm -f v42bis_tests$(EXEEXT) $(LINK) $(v42bis_tests_LDFLAGS) $(v42bis_tests_OBJECTS) $(v42bis_tests_LDADD) $(LIBS) v8_tests$(EXEEXT): $(v8_tests_OBJECTS) $(v8_tests_DEPENDENCIES) @rm -f v8_tests$(EXEEXT) $(LINK) $(v8_tests_LDFLAGS) $(v8_tests_OBJECTS) $(v8_tests_LDADD) $(LIBS) vector_float_tests$(EXEEXT): $(vector_float_tests_OBJECTS) $(vector_float_tests_DEPENDENCIES) @rm -f vector_float_tests$(EXEEXT) $(LINK) $(vector_float_tests_LDFLAGS) $(vector_float_tests_OBJECTS) $(vector_float_tests_LDADD) $(LIBS) vector_int_tests$(EXEEXT): $(vector_int_tests_OBJECTS) $(vector_int_tests_DEPENDENCIES) @rm -f vector_int_tests$(EXEEXT) $(LINK) $(vector_int_tests_LDFLAGS) $(vector_int_tests_OBJECTS) $(vector_int_tests_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/adsi_tests.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/async_tests.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/at_interpreter_tests.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/awgn_tests.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bell_mf_rx_tests.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bell_mf_tx_tests.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bert_tests.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bit_operations_tests.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/crc_tests.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dc_restore_tests.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dds_tests.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dtmf_rx_tests.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dtmf_tx_tests.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/echo_monitor.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/echo_tests.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fax_decode.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fax_tester.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fax_tests.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fsk_tests.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/g1050_tests.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/g168_tests.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/g711_tests.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/g722_tests.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/g726_tests.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gsm0610_tests.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hdlc_tests.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ima_adpcm_tests.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/line_model_monitor.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/line_model_tests.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/logging_tests.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lpc10_tests.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/make_g168_css.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/media_monitor.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/modem_connect_tones_tests.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/modem_echo_tests.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/modem_monitor.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/noise_tests.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/oki_adpcm_tests.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/playout_tests.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plc_tests.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/power_meter_tests.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/queue_tests.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/r2_mf_rx_tests.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/r2_mf_tx_tests.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rfc2198_sim_tests.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/schedule_tests.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sig_tone_tests.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/super_tone_rx_tests.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/super_tone_tx_tests.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t31_tests.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t38_core_tests.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t38_gateway_tests.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t38_gateway_to_terminal_tests.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t38_terminal_tests.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t38_terminal_to_gateway_tests.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t4_tests.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/testadsi.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/testfax.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/time_scale_tests.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tone_detect_tests.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tone_generate_tests.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tsb85_tests.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/v17_tests.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/v22bis_tests.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/v27ter_tests.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/v29_tests.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/v42_tests.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/v42bis_tests.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/v8_tests.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vector_float_tests.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vector_int_tests.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ if $(LTCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< .cpp.o: @am__fastdepCXX_TRUE@ if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ @am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ @am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cpp.lo: @am__fastdepCXX_TRUE@ if $(LTCXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ @am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs distclean-libtool: -rm -f libtool uninstall-info-am: ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ list='$(DISTFILES)'; for file in $$list; do \ case $$file in \ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ esac; \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ dir="/$$dir"; \ $(mkdir_p) "$(distdir)$$dir"; \ else \ dir=''; \ fi; \ if test -d $$d/$$file; then \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) $(DATA) $(HEADERS) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-am clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-libtool distclean-tags dvi: dvi-am dvi-am: html: html-am info: info-am info-am: install-data-am: install-exec-am: install-info: install-info-am install-man: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-info-am .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstPROGRAMS ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-exec \ install-exec-am install-info install-info-am install-man \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am tags uninstall uninstall-am \ uninstall-info-am # We need to create the CSS files for echo cancellation tests. sound_c1_8k.wav sound_c3_8k.wav: make_g168_css$(EXEEXT) ./make_g168_css$(EXEEXT) sox sound_c1.wav -r8000 sound_c1_8k.wav sox sound_c3.wav -r8000 sound_c3_8k.wav rm sound_c1.wav sound_c3.wav # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: iaxmodem-1.2.0/lib/spandsp/tests/ima_adpcm_tests.c0000644000175000017500000001650311150047202021530 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * ima_adpcm_tests.c - Test the IMA/DVI/Intel ADPCM encode and decode * software. * * Written by Steve Underwood * * Copyright (C) 2004 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2, as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: ima_adpcm_tests.c,v 1.31 2008/05/13 13:17:25 steveu Exp $ */ /*! \file */ /*! \page ima_adpcm_tests_page IMA ADPCM tests \section ima_adpcm_tests_page_sec_1 What does it do? To perform a general audio quality test, ima_adpcm_tests should be run. The test file ../test-data/local/short_nb_voice.wav will be compressed to the specified bit rate, decompressed, and the resulting audio stored in post_ima_adpcm.wav. A simple SNR test is automatically performed. Listening tests may be used for a more detailed evaluation of the degradation in quality caused by the compression. \section ima_adpcm_tests_page_sec_2 How is it used? */ #if defined(HAVE_CONFIG_H) #include "config.h" #endif #include #include #include #include #include #include #include #include "spandsp.h" #define IN_FILE_NAME "../test-data/local/short_nb_voice.wav" #define OUT_FILE_NAME "post_ima_adpcm.wav" #define HIST_LEN 2000 int main(int argc, char *argv[]) { int i; AFfilehandle inhandle; AFfilehandle outhandle; AFfilesetup filesetup; int frames; int dec_frames; int outframes; int ima_bytes; float x; double pre_energy; double post_energy; double diff_energy; int16_t pre_amp[HIST_LEN]; int16_t post_amp[HIST_LEN]; uint8_t ima_data[HIST_LEN]; int16_t history[HIST_LEN]; int hist_in; int hist_out; ima_adpcm_state_t *ima_enc_state; ima_adpcm_state_t *ima_dec_state; int xx; int total_pre_samples; int total_compressed_bytes; int total_post_samples; const char *in_file_name; int variant; int chunk_size; int enc_chunk_size; int log_encoded_data; int opt; variant = IMA_ADPCM_DVI4; in_file_name = IN_FILE_NAME; chunk_size = 160; enc_chunk_size = 0; log_encoded_data = FALSE; while ((opt = getopt(argc, argv, "ac:i:lv")) != -1) { switch (opt) { case 'a': variant = IMA_ADPCM_IMA4; chunk_size = 505; break; case 'c': enc_chunk_size = atoi(optarg); break; case 'i': in_file_name = optarg; break; case 'l': log_encoded_data = TRUE; break; case 'v': variant = IMA_ADPCM_VDVI; break; default: //usage(); exit(2); break; } } if ((inhandle = afOpenFile(in_file_name, "r", 0)) == AF_NULL_FILEHANDLE) { fprintf(stderr, " Cannot open wave file '%s'\n", in_file_name); exit(2); } if ((x = afGetFrameSize(inhandle, AF_DEFAULT_TRACK, 1)) != 2.0) { fprintf(stderr, " Unexpected frame size in wave file '%s'\n", in_file_name); exit(2); } if ((x = afGetRate(inhandle, AF_DEFAULT_TRACK)) != (float) SAMPLE_RATE) { fprintf(stderr, " Unexpected sample rate in wave file '%s'\n", in_file_name); exit(2); } if ((x = afGetChannels(inhandle, AF_DEFAULT_TRACK)) != 1.0) { fprintf(stderr, " Unexpected number of channels in wave file '%s'\n", in_file_name); exit(2); } if ((filesetup = afNewFileSetup()) == AF_NULL_FILESETUP) { fprintf(stderr, " Failed to create file setup\n"); exit(2); } afInitSampleFormat(filesetup, AF_DEFAULT_TRACK, AF_SAMPFMT_TWOSCOMP, 16); afInitRate(filesetup, AF_DEFAULT_TRACK, (float) SAMPLE_RATE); afInitFileFormat(filesetup, AF_FILE_WAVE); afInitChannels(filesetup, AF_DEFAULT_TRACK, 1); if ((outhandle = afOpenFile(OUT_FILE_NAME, "w", filesetup)) == AF_NULL_FILEHANDLE) { fprintf(stderr, " Cannot create wave file '%s'\n", OUT_FILE_NAME); exit(2); } if ((ima_enc_state = ima_adpcm_init(NULL, variant, enc_chunk_size)) == NULL) { fprintf(stderr, " Cannot create encoder\n"); exit(2); } if ((ima_dec_state = ima_adpcm_init(NULL, variant, enc_chunk_size)) == NULL) { fprintf(stderr, " Cannot create decoder\n"); exit(2); } hist_in = 0; hist_out = 0; pre_energy = 0.0; post_energy = 0.0; diff_energy = 0.0; total_pre_samples = 0; total_compressed_bytes = 0; total_post_samples = 0; while ((frames = afReadFrames(inhandle, AF_DEFAULT_TRACK, pre_amp, chunk_size))) { total_pre_samples += frames; ima_bytes = ima_adpcm_encode(ima_enc_state, ima_data, pre_amp, frames); if (log_encoded_data) write(1, ima_data, ima_bytes); total_compressed_bytes += ima_bytes; dec_frames = ima_adpcm_decode(ima_dec_state, post_amp, ima_data, ima_bytes); total_post_samples += dec_frames; for (i = 0; i < frames; i++) { history[hist_in++] = pre_amp[i]; if (hist_in >= HIST_LEN) hist_in = 0; pre_energy += (double) pre_amp[i] * (double) pre_amp[i]; } for (i = 0; i < dec_frames; i++) { post_energy += (double) post_amp[i] * (double) post_amp[i]; xx = post_amp[i] - history[hist_out++]; if (hist_out >= HIST_LEN) hist_out = 0; diff_energy += (double) xx * (double) xx; } outframes = afWriteFrames(outhandle, AF_DEFAULT_TRACK, post_amp, dec_frames); } if (afCloseFile(inhandle) != 0) { fprintf(stderr, " Cannot close wave file '%s'\n", in_file_name); exit(2); } if (afCloseFile(outhandle) != 0) { fprintf(stderr, " Cannot close wave file '%s'\n", OUT_FILE_NAME); exit(2); } afFreeFileSetup(filesetup); ima_adpcm_release(ima_enc_state); ima_adpcm_release(ima_dec_state); printf("Pre samples: %d\n", total_pre_samples); printf("Compressed bytes: %d\n", total_compressed_bytes); printf("Post samples: %d\n", total_post_samples); printf("Output energy is %f%% of input energy.\n", 100.0*post_energy/pre_energy); printf("Residual energy is %f%% of the total.\n", 100.0*diff_energy/post_energy); if (fabs(1.0 - post_energy/pre_energy) > 0.05 || fabs(diff_energy/post_energy) > 0.03) { printf("Tests failed.\n"); exit(2); } printf("Tests passed.\n"); return 0; } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/tests/dtmf_rx_tests.c0000644000175000017500000007261311150047203021266 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * dtmf_rx_tests.c - Test the DTMF detector against the spec., whatever the spec. * may be :) * * Written by Steve Underwood * * Copyright (C) 2001, 2006 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2, as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: dtmf_rx_tests.c,v 1.39 2008/06/13 14:46:52 steveu Exp $ */ /* * These tests include conversion to and from A-law. I assume the * distortion this produces is comparable to u-law, so it should be * a fair test. * * These tests mirror those on the CM7291 test tape from Mitel. * Many of these tests are highly questionable, but they are a * well accepted industry standard. * * However standard these tests might be, Mitel appears to have stopped * selling copies of their tape. * * For the talk-off test the Bellcore tapes may be used. However, they are * copyright material, so the test data files produced from the Bellcore * tapes cannot be distributed as a part of this package. * */ /*! \page dtmf_rx_tests_page DTMF receiver tests \section dtmf_rx_tests_page_sec_1 What does it do? The DTMF detection test suite performs similar tests to the Mitel test tape, traditionally used for testing DTMF receivers. Mitel seem to have discontinued this product, but all it not lost. The first side of the Mitel tape consists of a number of tone and tone+noise based tests. The test suite synthesizes equivalent test data. Being digitally generated, this data is rather more predictable than the test data on the nasty old stretchy cassette tapes which Mitel sold. The second side of the Mitel tape contains fragments of real speech from real phone calls captured from the North American telephone network. These are considered troublesome for DTMF detectors. A good detector is expected to achieve a reasonably low number of false detections on this data. Fresh clean copies of this seem to be unobtainable. However, Bellcore produce a much more aggressive set of three cassette tapes. All six side (about 30 minutes each) are filled with much tougher fragments of real speech from the North American telephone network. If you can do well in this test, nobody cares about your results against the Mitel test tape. A fresh set of tapes was purchased for these tests, and digitised, producing 6 wave files of 16 bit signed PCM data, sampled at 8kHz. They were transcribed using a speed adjustable cassette player. The test tone at the start of the tapes is pretty accurate, and the new tapes should not have had much opportunity to stretch. It is believed these transcriptions are about as good as the source material permits. PLEASE NOTE These transcriptions may be freely used by anyone who has a legitimate copy of the original tapes. However, if you don't have a legitimate copy of those tapes, you also have no right to use this data. The original tapes are the copyright material of BellCore, and they charge over US$200 for a set. I doubt they sell enough copies to consider this much of a business. However, it is their data, and it is their right to do as they wish with it. Currently I see no indication they wish to give it away for free. */ #if defined(HAVE_CONFIG_H) #include "config.h" #endif #include #include #include #include #include #include #include #include "spandsp.h" #include "spandsp-sim.h" /* Basic DTMF specs: * * Minimum tone on = 40ms * Minimum tone off = 50ms * Maximum digit rate = 10 per second * Normal twist <= 8dB accepted * Reverse twist <= 4dB accepted * S/N >= 15dB will detect OK * Attenuation <= 26dB will detect OK * Frequency tolerance +- 1.5% will detect, +-3.5% will reject */ #define DEFAULT_DTMF_TX_LEVEL -10 #define DEFAULT_DTMF_TX_ON_TIME 50 #define DEFAULT_DTMF_TX_OFF_TIME 50 #define SAMPLES_PER_CHUNK 160 #define ALL_POSSIBLE_DIGITS "123A456B789C*0#D" #define MITEL_DIR "../test-data/mitel/" #define BELLCORE_DIR "../test-data/bellcore/" const char *bellcore_files[] = { MITEL_DIR "mitel-cm7291-talkoff.wav", BELLCORE_DIR "tr-tsy-00763-1.wav", BELLCORE_DIR "tr-tsy-00763-2.wav", BELLCORE_DIR "tr-tsy-00763-3.wav", BELLCORE_DIR "tr-tsy-00763-4.wav", BELLCORE_DIR "tr-tsy-00763-5.wav", BELLCORE_DIR "tr-tsy-00763-6.wav", "" }; static tone_gen_descriptor_t my_dtmf_digit_tones[16]; float dtmf_row[] = { 697.0f, 770.0f, 852.0f, 941.0f }; float dtmf_col[] = { 1209.0f, 1336.0f, 1477.0f, 1633.0f }; char dtmf_positions[] = "123A" "456B" "789C" "*0#D"; int callback_hit; int callback_ok; int callback_roll; int step; int use_dialtone_filter = FALSE; char *decode_test_file = NULL; static int16_t amp[1000000]; static int16_t amp2[1000000]; codec_munge_state_t *munge = NULL; static void my_dtmf_gen_init(float low_fudge, int low_level, float high_fudge, int high_level, int duration, int gap) { int row; int col; for (row = 0; row < 4; row++) { for (col = 0; col < 4; col++) { make_tone_gen_descriptor(&my_dtmf_digit_tones[row*4 + col], dtmf_row[row]*(1.0f + low_fudge), low_level, dtmf_col[col]*(1.0f + high_fudge), high_level, duration, gap, 0, 0, FALSE); } } } /*- End of function --------------------------------------------------------*/ static int my_dtmf_generate(int16_t amp[], const char *digits) { int len; char *cp; tone_gen_state_t tone; len = 0; while (*digits) { cp = strchr(dtmf_positions, *digits); if (cp) { tone_gen_init(&tone, &my_dtmf_digit_tones[cp - dtmf_positions]); len += tone_gen(&tone, amp + len, 1000); } digits++; } return len; } /*- End of function --------------------------------------------------------*/ static void digit_delivery(void *data, const char *digits, int len) { int i; int seg; const char *s = ALL_POSSIBLE_DIGITS; const char *t; callback_hit = TRUE; if (data == (void *) 0x12345678) { t = s + callback_roll; seg = 16 - callback_roll; for (i = 0; i < len; i += seg, seg = 16) { if (i + seg > len) seg = len - i; if (memcmp(digits + i, t, seg)) { callback_ok = FALSE; printf("Fail at %d %d\n", i, seg); break; } t = s; callback_roll = (callback_roll + seg)%16; } } else { callback_ok = FALSE; } } /*- End of function --------------------------------------------------------*/ static void digit_status(void *data, int signal, int level, int delay) { const char *s = ALL_POSSIBLE_DIGITS; int len; static int last_step = 0; static int first = TRUE; callback_hit = TRUE; len = step - last_step; if (data == (void *) 0x12345678) { if (len < 320 || len > 480) { if (first) { /* At the beginning the apparent duration is expected to be wrong */ first = FALSE; } else { printf("Failed for signal %s length %d at %d\n", (callback_roll & 1) ? "on" : "off", len, step); callback_ok = FALSE; } } if (callback_roll & 1) { if (signal != 0) { printf("Failed for signal 0x%X instead of 0\n", signal); callback_ok = FALSE; } } else { if (signal != s[callback_roll >> 1]) { printf("Failed for signal 0x%X instead of 0x%X\n", signal, s[callback_roll >> 1]); callback_ok = FALSE; } if (level < DEFAULT_DTMF_TX_LEVEL + 3 - 1 || level > DEFAULT_DTMF_TX_LEVEL + 3 + 1) { printf("Failed for level %d instead of %d\n", level, DEFAULT_DTMF_TX_LEVEL + 3); callback_ok = FALSE; } } if (++callback_roll >= 32) callback_roll = 0; } else { callback_ok = FALSE; } last_step = step; } /*- End of function --------------------------------------------------------*/ static void mitel_cm7291_side_1_tests(void) { int i; int j; int len; int sample; const char *s; char digit[2]; char buf[128 + 1]; int actual; int nplus; int nminus; float rrb; float rcfo; dtmf_rx_state_t dtmf_state; awgn_state_t noise_source; dtmf_rx_init(&dtmf_state, NULL, NULL); if (use_dialtone_filter) dtmf_rx_parms(&dtmf_state, TRUE, -1, -1, -99); /* Test 1: Mitel's test 1 isn't really a test. Its a calibration step, which has no meaning here. */ printf("Test 1: Calibration\n"); printf(" Passed\n"); /* Test 2: Decode check This is a sanity check, that all digits are reliably detected under ideal conditions. Each possible digit repeated 10 times, with 50ms bursts. The level of each tone is about 6dB down from clip. 6dB down actually causes trouble with G.726, so we use 7dB down. */ printf("Test 2: Decode check\n"); my_dtmf_gen_init(0.0f, -4, 0.0f, -4, 50, 50); s = ALL_POSSIBLE_DIGITS; digit[1] = '\0'; while (*s) { digit[0] = *s++; for (i = 0; i < 10; i++) { len = my_dtmf_generate(amp, digit); codec_munge(munge, amp, len); dtmf_rx(&dtmf_state, amp, len); actual = dtmf_rx_get(&dtmf_state, buf, 128); if (actual != 1 || buf[0] != digit[0]) { printf(" Sent '%s'\n", digit); printf(" Received '%s'\n", buf); printf(" Failed\n"); exit(2); } } } printf(" Passed\n"); /* Test 3: Recognition bandwidth and channel centre frequency check. Use only the diagonal pairs of tones (digits 1, 5, 9 and D). Each tone pair requires four test to complete the check, making 16 sections overall. Each section contains 40 pulses of 50ms duration, with an amplitude of -20dB from clip per frequency. Four sections covering the tests for one tone (1 digit) are: a. H frequency at 0% deviation from center, L frequency at +0.1%. L frequency is then increments in +01.% steps up to +4%. The number of tone bursts is noted and designated N+. b. H frequency at 0% deviation, L frequency at -0.1%. L frequency is then incremental in -0.1% steps, up to -4%. The number of tone bursts is noted and designated N-. c. The test in (a) is repeated with the L frequency at 0% and the H frequency varied up to +4%. d. The test in (b) is repeated with the L frequency and 0% and the H frequency varied to -4%. Receiver Recognition Bandwidth (RRB) is calculated as follows: RRB% = (N+ + N-)/10 Receiver Center Frequency Offset (RCFO) is calculated as follows: RCFO% = X + (N+ - N-)/20 Note that this test doesn't test what it says it is testing at all, and the results are quite inaccurate, if not a downright lie! However, it follows the Mitel procedure, so how can it be bad? :) */ printf("Test 3: Recognition bandwidth and channel centre frequency check\n"); s = "159D"; digit[1] = '\0'; while (*s) { digit[0] = *s++; for (nplus = 0, i = 1; i <= 60; i++) { my_dtmf_gen_init((float) i/1000.0f, -17, 0.0f, -17, 50, 50); len = my_dtmf_generate(amp, digit); codec_munge(munge, amp, len); dtmf_rx(&dtmf_state, amp, len); nplus += dtmf_rx_get(&dtmf_state, buf, 128); } for (nminus = 0, i = -1; i >= -60; i--) { my_dtmf_gen_init((float) i/1000.0f, -17, 0.0f, -17, 50, 50); len = my_dtmf_generate(amp, digit); codec_munge(munge, amp, len); dtmf_rx(&dtmf_state, amp, len); nminus += dtmf_rx_get(&dtmf_state, buf, 128); } rrb = (float) (nplus + nminus)/10.0f; rcfo = (float) (nplus - nminus)/10.0f; printf(" %c (low) rrb = %5.2f%%, rcfo = %5.2f%%, max -ve = %5.2f, max +ve = %5.2f\n", digit[0], rrb, rcfo, (float) nminus/10.0f, (float) nplus/10.0f); if (rrb < 3.0f + rcfo || rrb >= 15.0f + rcfo) { printf(" Failed\n"); exit(2); } for (nplus = 0, i = 1; i <= 60; i++) { my_dtmf_gen_init(0.0f, -17, (float) i/1000.0f, -17, 50, 50); len = my_dtmf_generate(amp, digit); codec_munge(munge, amp, len); dtmf_rx(&dtmf_state, amp, len); nplus += dtmf_rx_get(&dtmf_state, buf, 128); } for (nminus = 0, i = -1; i >= -60; i--) { my_dtmf_gen_init(0.0f, -17, (float) i/1000.0f, -17, 50, 50); len = my_dtmf_generate(amp, digit); codec_munge(munge, amp, len); dtmf_rx(&dtmf_state, amp, len); nminus += dtmf_rx_get(&dtmf_state, buf, 128); } rrb = (float) (nplus + nminus)/10.0f; rcfo = (float) (nplus - nminus)/10.0f; printf(" %c (high) rrb = %5.2f%%, rcfo = %5.2f%%, max -ve = %5.2f, max +ve = %5.2f\n", digit[0], rrb, rcfo, (float) nminus/10.0f, (float) nplus/10.0f); if (rrb < 3.0f + rcfo || rrb >= 15.0f + rcfo) { printf(" Failed\n"); exit(2); } } printf(" Passed\n"); /* Test 4: Acceptable amplitude ratio (twist). Use only the diagonal pairs of tones (digits 1, 5, 9 and D). There are eight sections to the test. Each section contains 200 pulses with a 50ms duration for each pulse. Initially the amplitude of both tones is 6dB down from clip. The two sections to test one tone pair are: a. Standard Twist: H tone amplitude is maintained at -6dB from clip, L tone amplitude is attenuated gradually until the amplitude ratio L/H is -20dB. Note the number of responses from the receiver. b. Reverse Twist: L tone amplitude is maintained at -6dB from clip, H tone amplitude is attenuated gradually until the amplitude ratio is 20dB. Note the number of responses from the receiver. All tone bursts are of 50ms duration. The Acceptable Amplitude Ratio in dB is equal to the number of responses registered in (a) or (b), divided by 10. TODO: This is supposed to work in 1/10dB steps, but here I used 1dB steps, as the current tone generator has its amplitude set in 1dB steps. */ printf("Test 4: Acceptable amplitude ratio (twist)\n"); s = "159D"; digit[1] = '\0'; while (*s) { digit[0] = *s++; for (nplus = 0, i = -30; i >= -230; i--) { my_dtmf_gen_init(0.0f, -3, 0.0f, i/10, 50, 50); len = my_dtmf_generate(amp, digit); codec_munge(munge, amp, len); dtmf_rx(&dtmf_state, amp, len); nplus += dtmf_rx_get(&dtmf_state, buf, 128); } printf(" %c normal twist = %.2fdB\n", digit[0], (float) nplus/10.0); if (nplus < 80) { printf(" Failed\n"); exit(2); } for (nminus = 0, i = -30; i >= -230; i--) { my_dtmf_gen_init(0.0f, i/10, 0.0f, -3, 50, 50); len = my_dtmf_generate(amp, digit); codec_munge(munge, amp, len); dtmf_rx(&dtmf_state, amp, len); nminus += dtmf_rx_get(&dtmf_state, buf, 128); } printf(" %c reverse twist = %.2fdB\n", digit[0], (float) nminus/10.0); if (nminus < 40) { printf(" Failed\n"); exit(2); } } printf(" Passed\n"); /* Test 5: Dynamic range This test utilizes tone pair L1 H1 (digit 1). Thirty-five tone pair pulses are transmitted, with both frequencies stating at -6dB from clip. The amplitude of each is gradually attenuated by -35dB at a rate of 1dB per pulse. The Dynamic Range in dB is equal to the number of responses from the receiver during the test. Well not really, but that is the Mitel test. Lets sweep a bit further, and see what the real range is */ printf("Test 5: Dynamic range\n"); for (nplus = 0, i = +3; i >= -50; i--) { my_dtmf_gen_init(0.0f, i, 0.0f, i, 50, 50); len = my_dtmf_generate(amp, "1"); codec_munge(munge, amp, len); dtmf_rx(&dtmf_state, amp, len); nplus += dtmf_rx_get(&dtmf_state, buf, 128); } printf(" Dynamic range = %ddB\n", nplus); /* We ought to set some pass/fail condition, even if Mitel did not. If we don't, regression testing is weakened. */ if (nplus < 35) { printf(" Failed\n"); exit(2); } printf(" Passed\n"); /* Test 6: Guard time This test utilizes tone pair L1 H1 (digit 1). Four hundred pulses are transmitted at an amplitude of -6dB from clip per frequency. Pulse duration starts at 49ms and is gradually reduced to 10ms. Guard time in ms is equal to (500 - number of responses)/10. That is the Mitel test, and we will follow it. Its totally bogus, though. Just what the heck is a pass or fail here? */ printf("Test 6: Guard time\n"); for (nplus = 0, i = 490; i >= 100; i--) { my_dtmf_gen_init(0.0f, -3, 0.0f, -3, i/10, 50); len = my_dtmf_generate(amp, "1"); codec_munge(munge, amp, len); dtmf_rx(&dtmf_state, amp, len); nplus += dtmf_rx_get(&dtmf_state, buf, 128); } printf(" Guard time = %dms\n", (500 - nplus)/10); printf(" Passed\n"); /* Test 7: Acceptable signal to noise ratio This test utilizes tone pair L1 H1, transmitted on a noise background. The test consists of three sections in which the tone pair is transmitted 1000 times at an amplitude -6dB from clip per frequency, but with a different white noise level for each section. The first level is -24dBV, the second -18dBV and the third -12dBV.. The acceptable signal to noise ratio is the lowest ratio of signal to noise in the test where the receiver responds to all 1000 pulses. Well, that is the Mitel test, but it doesn't tell you what the decoder can really do. Lets do a more comprehensive test */ printf("Test 7: Acceptable signal to noise ratio\n"); my_dtmf_gen_init(0.0f, -4, 0.0f, -4, 50, 50); for (j = -13; j > -50; j--) { awgn_init_dbm0(&noise_source, 1234567, (float) j); for (i = 0; i < 1000; i++) { len = my_dtmf_generate(amp, "1"); // TODO: Clip for (sample = 0; sample < len; sample++) amp[sample] = saturate(amp[sample] + awgn(&noise_source)); codec_munge(munge, amp, len); dtmf_rx(&dtmf_state, amp, len); if (dtmf_rx_get(&dtmf_state, buf, 128) != 1) break; } if (i == 1000) break; } printf(" Acceptable S/N ratio is %ddB\n", -4 - j); if (-4 - j > 26) { printf(" Failed\n"); exit(2); } printf(" Passed\n"); } /*- End of function --------------------------------------------------------*/ static void mitel_cm7291_side_2_and_bellcore_tests(void) { int i; int j; int len; int hits; int hit_types[256]; char buf[128 + 1]; AFfilehandle inhandle; int frames; float x; dtmf_rx_state_t dtmf_state; dtmf_rx_init(&dtmf_state, NULL, NULL); if (use_dialtone_filter) dtmf_rx_parms(&dtmf_state, TRUE, -1, -1, -99); /* The remainder of the Mitel tape is the talk-off test */ /* Here we use the Bellcore test tapes (much tougher), in six wave files - 1 from each side of the original 3 cassette tapes */ /* Bellcore say you should get no more than 470 false detections with a good receiver. Dialogic claim 20. Of course, we can do better than that, eh? */ printf("Test 8: Talk-off test\n"); memset(hit_types, '\0', sizeof(hit_types)); for (j = 0; bellcore_files[j][0]; j++) { if ((inhandle = afOpenFile(bellcore_files[j], "r", 0)) == AF_NULL_FILEHANDLE) { printf(" Cannot open speech file '%s'\n", bellcore_files[j]); exit(2); } if ((x = afGetFrameSize(inhandle, AF_DEFAULT_TRACK, 1)) != 2.0) { printf(" Unexpected frame size in speech file '%s'\n", bellcore_files[j]); exit(2); } if ((x = afGetRate(inhandle, AF_DEFAULT_TRACK)) != (float) SAMPLE_RATE) { printf(" Unexpected sample rate in speech file '%s'\n", bellcore_files[j]); exit(2); } if ((x = afGetChannels(inhandle, AF_DEFAULT_TRACK)) != 1.0) { printf(" Unexpected number of channels in speech file '%s'\n", bellcore_files[j]); exit(2); } hits = 0; while ((frames = afReadFrames(inhandle, AF_DEFAULT_TRACK, amp, SAMPLE_RATE))) { dtmf_rx(&dtmf_state, amp, frames); len = dtmf_rx_get(&dtmf_state, buf, 128); if (len > 0) { for (i = 0; i < len; i++) hit_types[(int) buf[i]]++; hits += len; } } if (afCloseFile(inhandle) != 0) { printf(" Cannot close speech file '%s'\n", bellcore_files[j]); exit(2); } printf(" File %d gave %d false hits.\n", j + 1, hits); } for (i = 0, j = 0; i < 256; i++) { if (hit_types[i]) { printf(" Digit %c had %d false hits\n", i, hit_types[i]); j += hit_types[i]; } } printf(" %d hits in total\n", j); if (j > 470) { printf(" Failed\n"); exit(2); } printf(" Passed\n"); } /*- End of function --------------------------------------------------------*/ static void dial_tone_tolerance_tests(void) { int i; int j; int len; int sample; char buf[128 + 1]; dtmf_rx_state_t dtmf_state; tone_gen_descriptor_t dial_tone_desc; tone_gen_state_t dial_tone; dtmf_rx_init(&dtmf_state, NULL, NULL); if (use_dialtone_filter) dtmf_rx_parms(&dtmf_state, TRUE, -1, -1, -99); /* Test dial tone tolerance */ printf("Test: Dial tone tolerance.\n"); my_dtmf_gen_init(0.0f, -15, 0.0f, -15, DEFAULT_DTMF_TX_ON_TIME, DEFAULT_DTMF_TX_OFF_TIME); for (j = -30; j < -3; j++) { make_tone_gen_descriptor(&dial_tone_desc, 350, j, 440, j, 1, 0, 0, 0, TRUE); tone_gen_init(&dial_tone, &dial_tone_desc); for (i = 0; i < 10; i++) { len = my_dtmf_generate(amp, ALL_POSSIBLE_DIGITS); tone_gen(&dial_tone, amp2, len); for (sample = 0; sample < len; sample++) amp[sample] = saturate(amp[sample] + amp2[sample]); codec_munge(munge, amp, len); dtmf_rx(&dtmf_state, amp, len); if (dtmf_rx_get(&dtmf_state, buf, 128) != strlen(ALL_POSSIBLE_DIGITS)) break; } if (i != 10) break; } printf(" Acceptable signal to dial tone ratio is %ddB\n", -15 - j); if ((use_dialtone_filter && (-15 - j) > -12) || (!use_dialtone_filter && (-15 - j) > 10)) { printf(" Failed\n"); exit(2); } printf(" Passed\n"); } /*- End of function --------------------------------------------------------*/ static void callback_function_tests(void) { int i; int j; int len; int sample; dtmf_rx_state_t dtmf_state; /* Test the callback mode for delivering detected digits */ printf("Test: Callback digit delivery mode.\n"); callback_hit = FALSE; callback_ok = TRUE; callback_roll = 0; dtmf_rx_init(&dtmf_state, digit_delivery, (void *) 0x12345678); if (use_dialtone_filter) dtmf_rx_parms(&dtmf_state, TRUE, -1, -1, -99); my_dtmf_gen_init(0.0f, DEFAULT_DTMF_TX_LEVEL, 0.0f, DEFAULT_DTMF_TX_LEVEL, DEFAULT_DTMF_TX_ON_TIME, DEFAULT_DTMF_TX_OFF_TIME); for (i = 1; i < 10; i++) { len = 0; for (j = 0; j < i; j++) len += my_dtmf_generate(amp + len, ALL_POSSIBLE_DIGITS); dtmf_rx(&dtmf_state, amp, len); if (!callback_hit || !callback_ok) break; } if (!callback_hit || !callback_ok) { printf(" Failed\n"); exit(2); } printf(" Passed\n"); /* Test the realtime callback mode for reporting detected digits */ printf("Test: Realtime callback digit delivery mode.\n"); callback_hit = FALSE; callback_ok = TRUE; callback_roll = 0; dtmf_rx_init(&dtmf_state, NULL, NULL); dtmf_rx_set_realtime_callback(&dtmf_state, digit_status, (void *) 0x12345678); if (use_dialtone_filter) dtmf_rx_parms(&dtmf_state, TRUE, -1, -1, -99); my_dtmf_gen_init(0.0f, DEFAULT_DTMF_TX_LEVEL, 0.0f, DEFAULT_DTMF_TX_LEVEL, DEFAULT_DTMF_TX_ON_TIME, DEFAULT_DTMF_TX_OFF_TIME); step = 0; for (i = 1; i < 10; i++) { len = 0; for (j = 0; j < i; j++) len += my_dtmf_generate(amp + len, ALL_POSSIBLE_DIGITS); for (sample = 0, j = SAMPLES_PER_CHUNK; sample < len; sample += SAMPLES_PER_CHUNK, j = ((len - sample) >= SAMPLES_PER_CHUNK) ? SAMPLES_PER_CHUNK : (len - sample)) { dtmf_rx(&dtmf_state, &[sample], j); if (!callback_ok) break; step += j; } if (!callback_hit || !callback_ok) break; } if (!callback_hit || !callback_ok) { printf(" Failed\n"); exit(2); } } /*- End of function --------------------------------------------------------*/ static void decode_test(const char *test_file) { int16_t amp[SAMPLES_PER_CHUNK]; AFfilehandle inhandle; dtmf_rx_state_t dtmf_state; char buf[128 + 1]; int actual; int samples; int total; dtmf_rx_init(&dtmf_state, NULL, NULL); if (use_dialtone_filter) dtmf_rx_parms(&dtmf_state, TRUE, -1, -1, -99); /* We will decode the audio from a wave file. */ if ((inhandle = afOpenFile(decode_test_file, "r", NULL)) == AF_NULL_FILEHANDLE) { fprintf(stderr, " Cannot open wave file '%s'\n", decode_test_file); exit(2); } total = 0; while ((samples = afReadFrames(inhandle, AF_DEFAULT_TRACK, amp, SAMPLES_PER_CHUNK)) > 0) { codec_munge(munge, amp, samples); dtmf_rx(&dtmf_state, amp, samples); //printf("Status 0x%X\n", dtmf_rx_status(&dtmf_state)); if ((actual = dtmf_rx_get(&dtmf_state, buf, 128)) > 0) printf("Received '%s'\n", buf); total += actual; } printf("%d digits received\n", total); } /*- End of function --------------------------------------------------------*/ int main(int argc, char *argv[]) { int duration; time_t now; int channel_codec; int opt; use_dialtone_filter = FALSE; channel_codec = MUNGE_CODEC_NONE; decode_test_file = NULL; while ((opt = getopt(argc, argv, "c:d:f")) != -1) { switch (opt) { case 'c': channel_codec = atoi(optarg); break; case 'd': decode_test_file = optarg; break; case 'f': use_dialtone_filter = TRUE; break; default: //usage(); exit(2); break; } } munge = codec_munge_init(channel_codec, 0); if (decode_test_file) { decode_test(decode_test_file); } else { time(&now); mitel_cm7291_side_1_tests(); mitel_cm7291_side_2_and_bellcore_tests(); dial_tone_tolerance_tests(); callback_function_tests(); printf(" Passed\n"); duration = time(NULL) - now; printf("Tests passed in %ds\n", duration); } return 0; } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/tests/v42bis_tests.sh0000755000175000017500000000533011150047203021117 0ustar julienjulien#!/bin/sh # # V.42bis compression/decompression tests, as specified in V.56ter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License version 2.1, # as published by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this program; if not, write to the Free Software # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. # # $Id: v42bis_tests.sh,v 1.5 2008/05/03 09:34:26 steveu Exp $ # BASE=../test-data/itu/v56ter ./v42bis_tests ${BASE}/1.TST RETVAL=$? if [ $RETVAL != 0 ] then exit $RETVAL fi diff ${BASE}/1.TST v42bis_tests.out RETVAL=$? if [ $RETVAL != 0 ] then exit $RETVAL fi ./v42bis_tests ${BASE}/1X04.TST RETVAL=$? if [ $RETVAL != 0 ] then exit $RETVAL fi diff ${BASE}/1X04.TST v42bis_tests.out RETVAL=$? if [ $RETVAL != 0 ] then exit $RETVAL fi ./v42bis_tests ${BASE}/1X30.TST RETVAL=$? if [ $RETVAL != 0 ] then exit $RETVAL fi diff ${BASE}/1X30.TST v42bis_tests.out RETVAL=$? if [ $RETVAL != 0 ] then exit $RETVAL fi ./v42bis_tests ${BASE}/2.TST RETVAL=$? if [ $RETVAL != 0 ] then exit $RETVAL fi diff ${BASE}/2.TST v42bis_tests.out RETVAL=$? if [ $RETVAL != 0 ] then exit $RETVAL fi ./v42bis_tests ${BASE}/2X10.TST RETVAL=$? if [ $RETVAL != 0 ] then exit $RETVAL fi diff ${BASE}/2X10.TST v42bis_tests.out RETVAL=$? if [ $RETVAL != 0 ] then exit $RETVAL fi ./v42bis_tests ${BASE}/3.TST RETVAL=$? if [ $RETVAL != 0 ] then exit $RETVAL fi diff ${BASE}/3.TST v42bis_tests.out RETVAL=$? if [ $RETVAL != 0 ] then exit $RETVAL fi ./v42bis_tests ${BASE}/3X06.TST RETVAL=$? if [ $RETVAL != 0 ] then exit $RETVAL fi diff ${BASE}/3X06.TST v42bis_tests.out RETVAL=$? if [ $RETVAL != 0 ] then exit $RETVAL fi ./v42bis_tests ${BASE}/4.TST RETVAL=$? if [ $RETVAL != 0 ] then exit $RETVAL fi diff ${BASE}/4.TST v42bis_tests.out RETVAL=$? if [ $RETVAL != 0 ] then exit $RETVAL fi ./v42bis_tests ${BASE}/4X04.TST RETVAL=$? if [ $RETVAL != 0 ] then exit $RETVAL fi diff ${BASE}/4X04.TST v42bis_tests.out RETVAL=$? if [ $RETVAL != 0 ] then exit $RETVAL fi ./v42bis_tests ${BASE}/5.TST RETVAL=$? if [ $RETVAL != 0 ] then exit $RETVAL fi diff ${BASE}/5.TST v42bis_tests.out RETVAL=$? if [ $RETVAL != 0 ] then exit $RETVAL fi ./v42bis_tests ${BASE}/5X16.TST RETVAL=$? if [ $RETVAL != 0 ] then exit $RETVAL fi diff ${BASE}/5X16.TST v42bis_tests.out RETVAL=$? if [ $RETVAL != 0 ] then exit $RETVAL fi iaxmodem-1.2.0/lib/spandsp/tests/super_tone_tx_tests.c0000644000175000017500000002155211150047203022515 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * super_tone_generate_tests.c * * Written by Steve Underwood * * Copyright (C) 2003 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2, as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: super_tone_tx_tests.c,v 1.22 2008/05/13 13:17:26 steveu Exp $ */ /*! \file */ /*! \page super_tone_tx_tests_page Supervisory tone generation tests \section super_tone_tx_tests_page_sec_1 What does it do? */ #if defined(HAVE_CONFIG_H) #include "config.h" #endif #include #include #include #include #include #include #include #include #include #include #if defined(HAVE_LIBXML_XMLMEMORY_H) #include #endif #if defined(HAVE_LIBXML_PARSER_H) #include #endif #if defined(HAVE_LIBXML_XINCLUDE_H) #include #endif #include "spandsp.h" #define OUT_FILE_NAME "super_tone.wav" AFfilehandle outhandle; AFfilesetup filesetup; super_tone_tx_step_t *tone_tree = NULL; static void play_tones(super_tone_tx_state_t *tone, int max_samples) { int16_t amp[8000]; int len; int outframes; int i; int total_length; i = 500; total_length = 0; do { len = super_tone_tx(tone, amp, 160); outframes = afWriteFrames(outhandle, AF_DEFAULT_TRACK, amp, len); if (outframes != len) { fprintf(stderr, " Error writing wave file\n"); exit(2); } total_length += len; } while (len > 0 && --i > 0); printf("Tone length = %d samples (%dms)\n", total_length, total_length/8); } /*- End of function --------------------------------------------------------*/ #if defined(HAVE_LIBXML2) static int parse_tone(super_tone_tx_step_t **tree, xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur) { xmlChar *x; float f1; float f2; float f_tol; float l1; float l2; float length; float length_tol; int cycles; super_tone_tx_step_t *treep; cur = cur->xmlChildrenNode; while (cur) { if (xmlStrcmp(cur->name, (const xmlChar *) "step") == 0) { printf("Step - "); /* Set some defaults */ f1 = 0.0; f2 = 0.0; f_tol = 1.0; l1 = -11.0; l2 = -11.0; length = 0.0; length_tol = 10.0; cycles = 1; if ((x = xmlGetProp(cur, (const xmlChar *) "freq"))) { sscanf((char *) x, "%f [%f%%]", &f1, &f_tol); sscanf((char *) x, "%f+%f [%f%%]", &f1, &f2, &f_tol); printf("Frequency=%.2f+%.2f [%.2f%%]", f1, f2, f_tol); xmlFree(x); } if ((x = xmlGetProp(cur, (const xmlChar *) "level"))) { if (sscanf((char *) x, "%f+%f", &l1, &l2) < 2) l2 = l1; printf("Level=%.2f+%.2f", l1, l2); xmlFree(x); } if ((x = xmlGetProp(cur, (const xmlChar *) "length"))) { sscanf((char *) x, "%f [%f%%]", &length, &length_tol); printf("Length=%.2f [%.2f%%]", length, length_tol); xmlFree(x); } if ((x = xmlGetProp(cur, (const xmlChar *) "recognition-length"))) { printf("Recognition length='%s'", x); xmlFree(x); } if ((x = xmlGetProp(cur, (const xmlChar *) "cycles"))) { if (strcasecmp((char *) x, "endless") == 0) cycles = 0; else cycles = atoi((char *) x); printf("Cycles=%d ", cycles); xmlFree(x); } if ((x = xmlGetProp(cur, (const xmlChar *) "recorded-announcement"))) { printf("Recorded announcement='%s'", x); xmlFree(x); } printf("\n"); treep = super_tone_tx_make_step(NULL, f1, l1, f2, l2, length*1000.0 + 0.5, cycles); *tree = treep; tree = &(treep->next); parse_tone(&(treep->nest), doc, ns, cur); } /*endif*/ cur = cur->next; } /*endwhile*/ return 0; } /*- End of function --------------------------------------------------------*/ static void parse_tone_set(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur) { super_tone_tx_state_t tone; printf("Parsing tone set\n"); cur = cur->xmlChildrenNode; while (cur) { if (strcmp((char *) cur->name + strlen((char *) cur->name) - 5, "-tone") == 0) { printf("Hit %s\n", cur->name); tone_tree = NULL; parse_tone(&tone_tree, doc, ns, cur); super_tone_tx_init(&tone, tone_tree); //printf("Len %p %p %d %d\n", (void *) tone.levels[0], (void *) tone_tree, tone_tree->length, tone_tree->tone); play_tones(&tone, 99999999); super_tone_tx_free(tone_tree); } /*endif*/ cur = cur->next; } /*endwhile*/ } /*- End of function --------------------------------------------------------*/ static void get_tone_set(const char *tone_file, const char *set_id) { xmlDocPtr doc; xmlNsPtr ns; xmlNodePtr cur; #if 0 xmlValidCtxt valid; #endif xmlChar *x; ns = NULL; xmlKeepBlanksDefault(0); xmlCleanupParser(); doc = xmlParseFile(tone_file); if (doc == NULL) { fprintf(stderr, "No document\n"); exit(2); } /*endif*/ xmlXIncludeProcess(doc); #if 0 if (!xmlValidateDocument(&valid, doc)) { fprintf(stderr, "Invalid document\n"); exit(2); } /*endif*/ #endif /* Check the document is of the right kind */ if ((cur = xmlDocGetRootElement(doc)) == NULL) { fprintf(stderr, "Empty document\n"); xmlFreeDoc(doc); exit(2); } /*endif*/ if (xmlStrcmp(cur->name, (const xmlChar *) "global-tones")) { fprintf(stderr, "Document of the wrong type, root node != global-tones"); xmlFreeDoc(doc); exit(2); } /*endif*/ cur = cur->xmlChildrenNode; while (cur && xmlIsBlankNode(cur)) cur = cur->next; /*endwhile*/ if (cur == NULL) exit(2); /*endif*/ while (cur) { if (xmlStrcmp(cur->name, (const xmlChar *) "tone-set") == 0) { if ((x = xmlGetProp(cur, (const xmlChar *) "uncode"))) { if (strcmp((char *) x, set_id) == 0) parse_tone_set(doc, ns, cur); /*endif*/ xmlFree(x); } /*endif*/ } /*endif*/ cur = cur->next; } /*endwhile*/ xmlFreeDoc(doc); } /*- End of function --------------------------------------------------------*/ #endif int main(int argc, char *argv[]) { if ((filesetup = afNewFileSetup ()) == AF_NULL_FILESETUP) { fprintf(stderr, " Failed to create file setup\n"); exit(2); } afInitSampleFormat(filesetup, AF_DEFAULT_TRACK, AF_SAMPFMT_TWOSCOMP, 16); afInitRate(filesetup, AF_DEFAULT_TRACK, 8000.0); afInitFileFormat(filesetup, AF_FILE_WAVE); afInitChannels(filesetup, AF_DEFAULT_TRACK, 1); if ((outhandle = afOpenFile(OUT_FILE_NAME, "w", filesetup)) == AF_NULL_FILEHANDLE) { fprintf(stderr, " Cannot open audio file '%s'\n", OUT_FILE_NAME); exit(2); } #if defined(HAVE_LIBXML2) get_tone_set("../spandsp/global-tones.xml", (argc > 1) ? argv[1] : "hk"); #endif if (afCloseFile (outhandle) != 0) { fprintf(stderr, " Cannot close audio file '%s'\n", OUT_FILE_NAME); exit(2); } afFreeFileSetup(filesetup); printf("Done\n"); return 0; } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/tests/hdlc_tests.c0000644000175000017500000005711111150047203020531 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * hdlc_tests.c * * Written by Steve Underwood * * Copyright (C) 2003 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2, as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: hdlc_tests.c,v 1.43 2008/05/13 13:17:25 steveu Exp $ */ /*! \file */ /*! \page hdlc_tests_page HDLC tests \section hdlc_tests_page_sec_1 What does it do? The HDLC tests exercise the HDLC module, and verifies correct operation using both 16 and 32 bit CRCs. */ #if defined(HAVE_CONFIG_H) #include "config.h" #endif #include #include #include #include "spandsp.h" int ref_len; uint8_t buf[1000]; int abort_reported; int frame_handled; int frame_failed; int frame_len_errors; int frame_data_errors; int underflow_reported; int framing_ok_reported; int framing_ok_reports; hdlc_rx_state_t rx; hdlc_tx_state_t tx; int frames_sent; int bytes_sent; uint64_t start; uint64_t end; /* Use a local random generator, so the results are consistent across platforms. We have hard coded correct results for a message sequence generated by this particular PRNG. */ static int my_rand(void) { static int rndnum = 1234567; return (rndnum = 1664525U*rndnum + 1013904223U) >> 8; } /*- End of function --------------------------------------------------------*/ static int cook_up_msg(uint8_t *buf) { int i; int len; /* Use medium length messages, with some randomised length variation. */ /* TODO: this doesn't exercise extremely short or long messages. */ len = (my_rand() & 0x3F) + 100; for (i = 0; i < len; i++) buf[i] = my_rand(); return len; } /*- End of function --------------------------------------------------------*/ static void frame_handler(void *user_data, const uint8_t *pkt, int len, int ok) { if (len < 0) { /* Special conditions */ switch (len) { case PUTBIT_TRAINING_IN_PROGRESS: printf("Training in progress\n"); break; case PUTBIT_TRAINING_FAILED: printf("Training failed\n"); break; case PUTBIT_TRAINING_SUCCEEDED: printf("Training succeeded\n"); break; case PUTBIT_CARRIER_UP: printf("Carrier up\n"); break; case PUTBIT_CARRIER_DOWN: printf("Carrier down\n"); break; case PUTBIT_FRAMING_OK: framing_ok_reported = TRUE; framing_ok_reports++; //printf("Framing OK\n"); break; case PUTBIT_END_OF_DATA: printf("End of data\n"); break; case PUTBIT_ABORT: abort_reported = TRUE; //printf("Abort\n"); break; case PUTBIT_BREAK: printf("Break\n"); break; case PUTBIT_OCTET_REPORT: printf("Octet report\n"); break; default: printf("Eh!\n"); break; } return; } if (ok) { if (len != ref_len) { printf("Len error - %d %d\n", len, ref_len); frame_len_errors++; return; } if (memcmp(pkt, buf, len)) { printf("Frame data error\n"); frame_data_errors++; return; } frame_handled = TRUE; } else { frame_failed = TRUE; } } /*- End of function --------------------------------------------------------*/ static void underflow_handler(void *user_data) { //printf("Underflow reported\n"); underflow_reported = TRUE; } /*- End of function --------------------------------------------------------*/ static void check_result(void) { hdlc_rx_stats_t rx_stats; hdlc_rx_get_stats(&rx, &rx_stats); printf("%lu bytes\n", rx_stats.bytes); printf("%lu good frames\n", rx_stats.good_frames); printf("%lu CRC errors\n", rx_stats.crc_errors); printf("%lu length errors\n", rx_stats.length_errors); printf("%lu aborts\n", rx_stats.aborts); printf("%d frame length errors\n", frame_len_errors); printf("%d frame data errors\n", frame_data_errors); printf("Test duration %" PRIu64 " ticks\n", end - start); if (rx_stats.bytes != bytes_sent || rx_stats.good_frames != frames_sent || rx_stats.crc_errors != 0 || rx_stats.length_errors != 0 || rx_stats.aborts != 0 || frame_len_errors != 0 || frame_data_errors != 0) { printf("Tests failed.\n"); exit(2); } printf("Test passed.\n\n"); } /*- End of function --------------------------------------------------------*/ static int test_hdlc_modes(void) { int i; int j; int len; int nextbyte; int progress; int progress_delay; uint8_t bufx[100]; /* Try sending HDLC messages with CRC-16 */ printf("Testing with CRC-16 (byte by byte)\n"); frame_len_errors = 0; frame_data_errors = 0; hdlc_tx_init(&tx, FALSE, 1, FALSE, underflow_handler, NULL); hdlc_rx_init(&rx, FALSE, FALSE, 5, frame_handler, NULL); underflow_reported = FALSE; start = rdtscll(); hdlc_tx_flags(&tx, 40); /* Push an initial message so we should NOT get an underflow after the preamble. */ ref_len = cook_up_msg(buf); hdlc_tx_frame(&tx, buf, ref_len); frame_handled = FALSE; frame_failed = FALSE; frames_sent = 0; bytes_sent = 0; for (i = 0; i < 1000000; i++) { nextbyte = hdlc_tx_get_byte(&tx); hdlc_rx_put_byte(&rx, nextbyte); if (underflow_reported) { underflow_reported = FALSE; nextbyte = hdlc_tx_get_byte(&tx); hdlc_rx_put_byte(&rx, nextbyte); frames_sent++; bytes_sent += ref_len; if (!frame_handled) { printf("Frame not received.\n"); return -1; } ref_len = cook_up_msg(buf); hdlc_tx_frame(&tx, buf, ref_len); frame_handled = FALSE; } } end = rdtscll(); check_result(); /* Now try sending HDLC messages with CRC-16 */ printf("Testing with CRC-16 (chunk by chunk)\n"); frame_len_errors = 0; frame_data_errors = 0; hdlc_tx_init(&tx, FALSE, 1, FALSE, underflow_handler, NULL); hdlc_rx_init(&rx, FALSE, FALSE, 5, frame_handler, NULL); underflow_reported = FALSE; start = rdtscll(); hdlc_tx_flags(&tx, 40); /* Push an initial message so we should NOT get an underflow after the preamble. */ ref_len = cook_up_msg(buf); hdlc_tx_frame(&tx, buf, ref_len); frame_handled = FALSE; frame_failed = FALSE; frames_sent = 0; bytes_sent = 0; for (i = 0; i < 10000; i++) { len = hdlc_tx_get(&tx, bufx, 100); hdlc_rx_put(&rx, bufx, len); if (underflow_reported) { underflow_reported = FALSE; len = hdlc_tx_get(&tx, bufx, 100); hdlc_rx_put(&rx, bufx, len); frames_sent++; bytes_sent += ref_len; if (!frame_handled) { printf("Frame not received.\n"); return -1; } ref_len = cook_up_msg(buf); hdlc_tx_frame(&tx, buf, ref_len); frame_handled = FALSE; } } end = rdtscll(); check_result(); /* Now try sending HDLC messages with CRC-16 bit by bit */ printf("Testing with CRC-16 (bit by bit)\n"); frame_len_errors = 0; frame_data_errors = 0; hdlc_tx_init(&tx, FALSE, 2, FALSE, underflow_handler, NULL); hdlc_rx_init(&rx, FALSE, FALSE, 5, frame_handler, NULL); underflow_reported = FALSE; start = rdtscll(); hdlc_tx_flags(&tx, 40); /* Don't push an initial message so we should get an underflow after the preamble. */ /* Lie for the first message, as there isn't really one */ frame_handled = TRUE; frame_failed = FALSE; frames_sent = 0; bytes_sent = 0; ref_len = 0; for (i = 0; i < 8*1000000; i++) { nextbyte = hdlc_tx_get_bit(&tx); hdlc_rx_put_bit(&rx, nextbyte); if (underflow_reported) { underflow_reported = FALSE; for (j = 0; j < 20; j++) { nextbyte = hdlc_tx_get_bit(&tx); hdlc_rx_put_bit(&rx, nextbyte); } if (ref_len) { frames_sent++; bytes_sent += ref_len; } if (!frame_handled) { printf("Frame not received.\n"); return -1; } ref_len = cook_up_msg(buf); hdlc_tx_frame(&tx, buf, ref_len); frame_handled = FALSE; } } end = rdtscll(); check_result(); /* Now try sending HDLC messages with CRC-32 */ printf("Testing with CRC-32 (byte by byte)\n"); frame_len_errors = 0; frame_data_errors = 0; hdlc_tx_init(&tx, TRUE, 1, FALSE, underflow_handler, NULL); hdlc_rx_init(&rx, TRUE, FALSE, 1, frame_handler, NULL); underflow_reported = FALSE; start = rdtscll(); hdlc_tx_flags(&tx, 40); /* Don't push an initial message so we should get an underflow after the preamble. */ /* Lie for the first message, as there isn't really one */ frame_handled = TRUE; frame_failed = FALSE; frames_sent = 0; bytes_sent = 0; ref_len = 0; for (i = 0; i < 1000000; i++) { nextbyte = hdlc_tx_get_byte(&tx); hdlc_rx_put_byte(&rx, nextbyte); if (underflow_reported) { underflow_reported = FALSE; nextbyte = hdlc_tx_get_byte(&tx); hdlc_rx_put_byte(&rx, nextbyte); if (ref_len) { frames_sent++; bytes_sent += ref_len; } if (!frame_handled) { printf("Frame not received.\n"); return -1; } ref_len = cook_up_msg(buf); hdlc_tx_frame(&tx, buf, ref_len); frame_handled = FALSE; } } end = rdtscll(); check_result(); /* Now try progressive mode with CRC-16 */ printf("Testing progressive mode with CRC-16 (byte by byte)\n"); frame_len_errors = 0; frame_data_errors = 0; hdlc_tx_init(&tx, TRUE, 1, TRUE, underflow_handler, NULL); hdlc_rx_init(&rx, TRUE, FALSE, 1, frame_handler, NULL); underflow_reported = FALSE; start = rdtscll(); hdlc_tx_flags(&tx, 40); /* Don't push an initial message so we should get an underflow after the preamble. */ /* Lie for the first message, as there isn't really one */ frame_handled = TRUE; frame_failed = FALSE; progress = 9999; progress_delay = 9999; frames_sent = 0; bytes_sent = 0; ref_len = 0; for (i = 0; i < 1000000; i++) { nextbyte = hdlc_tx_get_byte(&tx); hdlc_rx_put_byte(&rx, nextbyte); if (underflow_reported) { underflow_reported = FALSE; nextbyte = hdlc_tx_get_byte(&tx); hdlc_rx_put_byte(&rx, nextbyte); if (ref_len) { frames_sent++; bytes_sent += ref_len; } if (!frame_handled) { printf("Frame not received.\n"); return -1; } ref_len = cook_up_msg(buf); hdlc_tx_frame(&tx, buf, 10); progress = 10; progress_delay = 8; frame_handled = FALSE; } if (progress < ref_len && progress_delay-- <= 0) { if (hdlc_tx_frame(&tx, buf + progress, (progress + 10 <= ref_len) ? 10 : ref_len - progress) < 0) { printf("Failed to add progressively\n"); return -1; } progress += 10; progress_delay = 8; } } end = rdtscll(); check_result(); printf("Tests passed.\n"); return 0; } /*- End of function --------------------------------------------------------*/ static int test_hdlc_frame_length_error_handling(void) { int i; int j; int nextbyte; printf("Testing frame length error handling using CRC-16 (bit by bit)\n"); frame_len_errors = 0; frame_data_errors = 0; hdlc_tx_init(&tx, FALSE, 2, FALSE, underflow_handler, NULL); hdlc_rx_init(&rx, FALSE, TRUE, 5, frame_handler, NULL); hdlc_rx_set_max_frame_len(&rx, 100); underflow_reported = FALSE; framing_ok_reported = FALSE; framing_ok_reports = 0; hdlc_tx_flags(&tx, 10); /* Don't push an initial message so we should get an underflow after the preamble. */ /* Lie for the first message, as there isn't really one */ frame_handled = TRUE; frame_failed = FALSE; frames_sent = 0; bytes_sent = 0; ref_len = 0; for (i = 0; i < 8*1000000; i++) { nextbyte = hdlc_tx_get_bit(&tx); hdlc_rx_put_bit(&rx, nextbyte); if (framing_ok_reported) { printf("Framing OK reported at bit %d (%d)\n", i, framing_ok_reports); framing_ok_reported = FALSE; } if (underflow_reported) { underflow_reported = FALSE; for (j = 0; j < 20; j++) { nextbyte = hdlc_tx_get_bit(&tx); hdlc_rx_put_bit(&rx, nextbyte); if (framing_ok_reported) { printf("Framing OK reported at bit %d (%d) - %d\n", i, framing_ok_reports, frame_handled); framing_ok_reported = FALSE; } } if (ref_len) { frames_sent++; bytes_sent += ref_len; } if (!frame_handled) { /* We should get a failure when the length reaches 101 */ if (ref_len == 101) { printf("Tests passed.\n"); return 0; } if (frame_failed) printf("Frame failed.\n"); printf("Frame not received at length %d.\n", ref_len); return -1; } else { /* We should get a failure when the length reaches 101 */ if (ref_len > 100) { printf("Tests failed.\n"); return -1; } } ref_len++; hdlc_tx_frame(&tx, buf, ref_len); frame_handled = FALSE; } } /* We shouldn't reach here */ printf("Tests failed.\n"); return -1; } /*- End of function --------------------------------------------------------*/ static int test_hdlc_crc_error_handling(void) { int i; int j; int nextbyte; int corrupt; printf("Testing CRC error handling using CRC-16 (bit by bit)\n"); frame_len_errors = 0; frame_data_errors = 0; hdlc_tx_init(&tx, FALSE, 2, FALSE, underflow_handler, NULL); hdlc_rx_init(&rx, FALSE, TRUE, 5, frame_handler, NULL); underflow_reported = FALSE; framing_ok_reported = FALSE; framing_ok_reports = 0; hdlc_tx_flags(&tx, 10); /* Don't push an initial message so we should get an underflow after the preamble. */ /* Lie for the first message, as there isn't really one */ frame_handled = TRUE; frame_failed = FALSE; frames_sent = 0; bytes_sent = 0; ref_len = 100; corrupt = FALSE; for (i = 0; i < 8*1000000; i++) { nextbyte = hdlc_tx_get_bit(&tx); hdlc_rx_put_bit(&rx, nextbyte); if (framing_ok_reported) { printf("Framing OK reported at bit %d (%d)\n", i, framing_ok_reports); framing_ok_reported = FALSE; } if (underflow_reported) { underflow_reported = FALSE; for (j = 0; j < 20; j++) { nextbyte = hdlc_tx_get_bit(&tx); hdlc_rx_put_bit(&rx, nextbyte); if (framing_ok_reported) { printf("Framing OK reported at bit %d (%d) - %d\n", i, framing_ok_reports, frame_handled); framing_ok_reported = FALSE; } } if (ref_len) { frames_sent++; bytes_sent += ref_len; } if (!frame_handled) { if (!corrupt) { printf("Frame not received when it should be correct.\n"); return -1; } } else { if (corrupt) { printf("Frame received when it should be corrupt.\n"); return -1; } } ref_len = cook_up_msg(buf); hdlc_tx_frame(&tx, buf, ref_len); if ((corrupt = rand() & 1)) hdlc_tx_corrupt_frame(&tx); frame_handled = FALSE; } } printf("Tests passed.\n"); return 0; } /*- End of function --------------------------------------------------------*/ static int test_hdlc_abort_handling(void) { int i; int j; int nextbyte; int abort; printf("Testing abort handling using CRC-16 (bit by bit)\n"); frame_len_errors = 0; frame_data_errors = 0; hdlc_tx_init(&tx, FALSE, 2, FALSE, underflow_handler, NULL); hdlc_rx_init(&rx, FALSE, TRUE, 0, frame_handler, NULL); underflow_reported = FALSE; framing_ok_reported = FALSE; framing_ok_reports = 0; hdlc_tx_flags(&tx, 10); /* Don't push an initial message so we should get an underflow after the preamble. */ /* Lie for the first message, as there isn't really one */ frame_handled = TRUE; frame_failed = FALSE; frames_sent = 0; bytes_sent = 0; ref_len = 0; abort = FALSE; abort_reported = FALSE; for (i = 0; i < 8*1000000; i++) { nextbyte = hdlc_tx_get_bit(&tx); hdlc_rx_put_bit(&rx, nextbyte); if (framing_ok_reported) { printf("Framing OK reported at bit %d (%d)\n", i, framing_ok_reports); framing_ok_reported = FALSE; } if (underflow_reported) { underflow_reported = FALSE; for (j = 0; j < 20; j++) { nextbyte = hdlc_tx_get_bit(&tx); hdlc_rx_put_bit(&rx, nextbyte); if (framing_ok_reported) { printf("Framing OK reported at bit %d (%d) - %d\n", i, framing_ok_reports, frame_handled); framing_ok_reported = FALSE; } } if (ref_len) { frames_sent++; bytes_sent += ref_len; } if (abort) { if (abort && !abort_reported) { printf("Abort not received when sent\n"); return -1; } if (frame_handled) { if (frame_failed) printf("Frame failed.\n"); printf("Frame received when abort sent.\n"); return -1; } } else { if (abort_reported) { printf("Abort received when not sent\n"); return -1; } if (!frame_handled) { if (frame_failed) printf("Frame failed.\n"); printf("Frame not received.\n"); return -1; } } ref_len = cook_up_msg(buf); hdlc_tx_frame(&tx, buf, ref_len); if ((abort = rand() & 1)) hdlc_tx_abort(&tx); frame_handled = FALSE; abort_reported = FALSE; } } printf("Tests passed.\n"); return 0; } /*- End of function --------------------------------------------------------*/ #if 0 static int test_hdlc_octet_count_handling(void) { int i; int j; int nextbyte; printf("Testing the octet_counting handling using CRC-16 (bit by bit)\n"); frame_len_errors = 0; frame_data_errors = 0; hdlc_tx_init(&tx, FALSE, 2, FALSE, underflow_handler, NULL); hdlc_rx_init(&rx, FALSE, TRUE, 0, frame_handler, NULL); //hdlc_rx_set_max_frame_len(&rx, 50); hdlc_rx_set_octet_counting_report_interval(&rx, 16); underflow_reported = FALSE; framing_ok_reported = FALSE; framing_ok_reports = 0; hdlc_tx_flags(&tx, 10); /* Don't push an initial message so we should get an underflow after the preamble. */ /* Lie for the first message, as there isn't really one */ frame_handled = TRUE; frame_failed = FALSE; frames_sent = 0; bytes_sent = 0; ref_len = 0; for (i = 0; i < 8*1000000; i++) { nextbyte = hdlc_tx_get_bit(&tx); hdlc_rx_put_bit(&rx, nextbyte); if (framing_ok_reported) { printf("Framing OK reported at bit %d (%d)\n", i, framing_ok_reports); framing_ok_reported = FALSE; } if (underflow_reported) { underflow_reported = FALSE; for (j = 0; j < 20; j++) { nextbyte = hdlc_tx_get_bit(&tx); hdlc_rx_put_bit(&rx, nextbyte); if (framing_ok_reported) { printf("Framing OK reported at bit %d (%d) - %d\n", i, framing_ok_reports, frame_handled); framing_ok_reported = FALSE; } } if (ref_len) { frames_sent++; bytes_sent += ref_len; } if (!frame_handled) { if (frame_failed) printf("Frame failed.\n"); printf("Frame not received.\n"); return -1; } ref_len = cook_up_msg(buf); hdlc_tx_frame(&tx, buf, ref_len); hdlc_tx_abort(&tx); //hdlc_tx_corrupt_frame(&tx); frame_handled = FALSE; } } printf("Tests passed.\n"); return 0; } /*- End of function --------------------------------------------------------*/ #endif int main(int argc, char *argv[]) { printf("HDLC module tests\n"); if (test_hdlc_modes()) { printf("Tests failed\n"); exit(2); } if (test_hdlc_frame_length_error_handling()) { printf("Tests failed\n"); exit(2); } if (test_hdlc_crc_error_handling()) { printf("Tests failed\n"); exit(2); } if (test_hdlc_abort_handling()) { printf("Tests failed\n"); exit(2); } #if 0 if (test_hdlc_octet_count_handling()) { printf("Tests failed\n"); exit(2); } #endif printf("Tests passed.\n"); return 0; } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/tests/echo_tests.c0000644000175000017500000011743211150047203020540 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * echo_tests.c * * Written by Steve Underwood * * Copyright (C) 2001 Steve Underwood * * Based on a bit from here, a bit from there, eye of toad, * ear of bat, etc - plus, of course, my own 2 cents. * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2, as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: echo_tests.c,v 1.33 2008/05/13 13:17:25 steveu Exp $ */ /*! \page echo_can_tests_page Line echo cancellation for voice tests \section echo_can_tests_page_sec_1 What does it do? The echo cancellation tests test the echo cancellor against the G.168 spec. Not all the tests in G.168 are fully implemented at this time. \section echo_can_tests_page_sec_2 How does it work? \section echo_can_tests_page_sec_2 How do I use it? */ #if defined(HAVE_CONFIG_H) #include "config.h" #endif #if defined(HAVE_FL_FL_H) && defined(HAVE_FL_FL_CARTESIAN_H) && defined(HAVE_FL_FL_AUDIO_METER_H) #define ENABLE_GUI #endif #include #include #include #include #include #include #include #define GEN_CONST #include #include "spandsp.h" #include "spandsp/g168models.h" #if defined(ENABLE_GUI) #include "echo_monitor.h" #endif #define TEST_EC_TAPS 256 #define PERFORM_TEST_2A (1 << 1) #define PERFORM_TEST_2B (1 << 2) #define PERFORM_TEST_2C (1 << 3) #define PERFORM_TEST_3A (1 << 4) #define PERFORM_TEST_3B (1 << 5) #define PERFORM_TEST_3C (1 << 6) #define PERFORM_TEST_4 (1 << 7) #define PERFORM_TEST_5 (1 << 8) #define PERFORM_TEST_6 (1 << 9) #define PERFORM_TEST_7 (1 << 10) #define PERFORM_TEST_8 (1 << 11) #define PERFORM_TEST_9 (1 << 12) #define PERFORM_TEST_10A (1 << 13) #define PERFORM_TEST_10B (1 << 14) #define PERFORM_TEST_10C (1 << 15) #define PERFORM_TEST_11 (1 << 16) #define PERFORM_TEST_12 (1 << 17) #define PERFORM_TEST_13 (1 << 18) #define PERFORM_TEST_14 (1 << 19) #define PERFORM_TEST_15 (1 << 20) int test_list; #if !defined(NULL) #define NULL (void *) 0 #endif typedef struct { const char *name; int max; int cur; AFfilehandle handle; int16_t signal[SAMPLE_RATE]; } signal_source_t; typedef struct { int type; fir_float_state_t *fir; float history[35*8]; int pos; float factor; float power; } level_measurement_device_t; signal_source_t local_css; signal_source_t far_css; fir32_state_t line_model; AFfilehandle residuehandle; int16_t residue_sound[SAMPLE_RATE]; int residue_cur = 0; static inline void put_residue(int16_t amp) { int outframes; residue_sound[residue_cur++] = amp; if (residue_cur >= SAMPLE_RATE) { outframes = afWriteFrames(residuehandle, AF_DEFAULT_TRACK, residue_sound, residue_cur); if (outframes != residue_cur) { fprintf(stderr, " Error writing residue sound\n"); exit(2); } residue_cur = 0; } } /*- End of function --------------------------------------------------------*/ static void signal_load(signal_source_t *sig, const char *name) { float x; sig->name = name; if ((sig->handle = afOpenFile(sig->name, "r", 0)) == AF_NULL_FILEHANDLE) { fprintf(stderr, " Cannot open wave file '%s'\n", sig->name); exit(2); } if ((x = afGetFrameSize(sig->handle, AF_DEFAULT_TRACK, 1)) != 2.0) { fprintf(stderr, " Unexpected frame size in wave file '%s'\n", sig->name); exit(2); } if ((x = afGetRate(sig->handle, AF_DEFAULT_TRACK)) != (float) SAMPLE_RATE) { printf(" Unexpected sample rate in wave file '%s'\n", sig->name); exit(2); } if ((x = afGetChannels(sig->handle, AF_DEFAULT_TRACK)) != 1.0) { printf(" Unexpected number of channels in wave file '%s'\n", sig->name); exit(2); } sig->max = afReadFrames(sig->handle, AF_DEFAULT_TRACK, sig->signal, SAMPLE_RATE); if (sig->max < 0) { fprintf(stderr, " Error reading sound file '%s'\n", sig->name); exit(2); } } /*- End of function --------------------------------------------------------*/ static void signal_free(signal_source_t *sig) { if (afCloseFile(sig->handle) != 0) { fprintf(stderr, " Cannot close sound file '%s'\n", sig->name); exit(2); } } /*- End of function --------------------------------------------------------*/ static void signal_restart(signal_source_t *sig) { sig->cur = 0; } /*- End of function --------------------------------------------------------*/ static int16_t signal_amp(signal_source_t *sig) { int16_t tx; tx = sig->signal[sig->cur++]; if (sig->cur >= sig->max) sig->cur = 0; return tx; } /*- End of function --------------------------------------------------------*/ static inline int16_t codec_munge(int16_t amp) { return alaw_to_linear(linear_to_alaw(amp)); } /*- End of function --------------------------------------------------------*/ static int channel_model_create(int model) { static const int32_t *line_models[] = { line_model_d2_coeffs, line_model_d3_coeffs, line_model_d4_coeffs, line_model_d5_coeffs, line_model_d6_coeffs, line_model_d7_coeffs, line_model_d8_coeffs, line_model_d9_coeffs }; static int line_model_sizes[] = { sizeof(line_model_d2_coeffs)/sizeof(int32_t), sizeof(line_model_d3_coeffs)/sizeof(int32_t), sizeof(line_model_d4_coeffs)/sizeof(int32_t), sizeof(line_model_d5_coeffs)/sizeof(int32_t), sizeof(line_model_d6_coeffs)/sizeof(int32_t), sizeof(line_model_d7_coeffs)/sizeof(int32_t), sizeof(line_model_d8_coeffs)/sizeof(int32_t), sizeof(line_model_d9_coeffs)/sizeof(int32_t) }; if (model < 0 || model >= (int) (sizeof(line_model_sizes)/sizeof(line_model_sizes[0]))) return -1; fir32_create(&line_model, line_models[model], line_model_sizes[model]); return 0; } /*- End of function --------------------------------------------------------*/ static int16_t channel_model(int16_t *new_local, int16_t *new_far, int16_t local, int16_t far) { int16_t echo; int16_t rx; /* Channel modelling is merely simulating the effects of A-law or u-law distortion and using one of the echo models from G.168. Simulating the codec is very important, as this is usually the limiting factor in how much echo reduction is achieved. */ /* The local tx signal will usually have gone through an A-law munging before it reached the line's analogue area, where the echo occurs. */ local = codec_munge(local); /* Now we need to model the echo. We only model a single analogue segment, as per the G.168 spec. However, there will generally be near end and far end analogue/echoey segments in the real world, unless an end is purely digital. */ echo = fir32(&line_model, local/8); /* The far end signal will have been through an A-law munging, although this should not affect things. */ rx = echo + codec_munge(far); /* This mixed echo and far end signal will have been through an A-law munging when it came back into the digital network. */ rx = codec_munge(rx); if (new_far) *new_far = rx; if (new_local) *new_local = local; return rx; } /*- End of function --------------------------------------------------------*/ static level_measurement_device_t *level_measurement_device_create(int type) { level_measurement_device_t *dev; int i; dev = (level_measurement_device_t *) malloc(sizeof(level_measurement_device_t)); dev->fir = (fir_float_state_t *) malloc(sizeof(fir_float_state_t)); fir_float_create(dev->fir, level_measurement_bp_coeffs, sizeof(level_measurement_bp_coeffs)/sizeof(float)); for (i = 0; i < 35*8; i++) dev->history[i] = 0.0; dev->pos = 0; dev->factor = exp(-1.0/((float) SAMPLE_RATE*0.035)); dev->power = 0; dev->type = type; return dev; } /*- End of function --------------------------------------------------------*/ static int level_measurement_device_release(level_measurement_device_t *s) { fir_float_free(s->fir); free(s->fir); free(s); return 0; } /*- End of function --------------------------------------------------------*/ static float level_measurement_device(level_measurement_device_t *dev, int16_t amp) { float signal; signal = fir_float(dev->fir, amp); signal *= signal; if (dev->type == 0) { dev->power = dev->power*dev->factor + signal*(1.0 - dev->factor); signal = sqrt(dev->power); } else { dev->power -= dev->history[dev->pos]; dev->power += signal; dev->history[dev->pos++] = signal; signal = sqrt(dev->power/(35.8*8.0)); } return signal; } /*- End of function --------------------------------------------------------*/ int main(int argc, char *argv[]) { echo_can_state_t *ctx; awgn_state_t local_noise_source; awgn_state_t far_noise_source; int i; int clean; int residue; int16_t rx; int16_t tx; int j; int k; tone_gen_descriptor_t tone_desc; tone_gen_state_t tone_state; int16_t local_sound[40000]; int local_max; int local_cur; int16_t hoth_noise; //int16_t far_sound[SAMPLE_RATE]; //int16_t result_sound[64000]; //int32_t coeffs[200][128]; //int coeff_index; int far_cur; int result_cur; //int far_tx; AFfilehandle resulthandle; AFfilesetup filesetup; AFfilesetup filesetup2; //int outframes; time_t now; int tone_burst_step; level_measurement_device_t *power_meter_1; level_measurement_device_t *power_meter_2; float pp1; float pp2; int model_number; int use_gui; power_meter_1 = NULL; power_meter_2 = NULL; /* Check which tests we should run */ if (argc < 2) fprintf(stderr, "Usage: echo tests \n"); test_list = 0; model_number = 0; use_gui = FALSE; for (i = 1; i < argc; i++) { if (strcasecmp(argv[i], "2a") == 0) test_list |= PERFORM_TEST_2A; else if (strcasecmp(argv[i], "2b") == 0) test_list |= PERFORM_TEST_2B; else if (strcasecmp(argv[i], "2c") == 0) test_list |= PERFORM_TEST_2C; else if (strcasecmp(argv[i], "3a") == 0) test_list |= PERFORM_TEST_3A; else if (strcasecmp(argv[i], "3b") == 0) test_list |= PERFORM_TEST_3B; else if (strcasecmp(argv[i], "3c") == 0) test_list |= PERFORM_TEST_3C; else if (strcasecmp(argv[i], "4") == 0) test_list |= PERFORM_TEST_4; else if (strcasecmp(argv[i], "5") == 0) test_list |= PERFORM_TEST_5; else if (strcasecmp(argv[i], "6") == 0) test_list |= PERFORM_TEST_6; else if (strcasecmp(argv[i], "7") == 0) test_list |= PERFORM_TEST_7; else if (strcasecmp(argv[i], "8") == 0) test_list |= PERFORM_TEST_8; else if (strcasecmp(argv[i], "9") == 0) test_list |= PERFORM_TEST_9; else if (strcasecmp(argv[i], "10a") == 0) test_list |= PERFORM_TEST_10A; else if (strcasecmp(argv[i], "10b") == 0) test_list |= PERFORM_TEST_10B; else if (strcasecmp(argv[i], "10c") == 0) test_list |= PERFORM_TEST_10C; else if (strcasecmp(argv[i], "11") == 0) test_list |= PERFORM_TEST_11; else if (strcasecmp(argv[i], "12") == 0) test_list |= PERFORM_TEST_12; else if (strcasecmp(argv[i], "13") == 0) test_list |= PERFORM_TEST_13; else if (strcasecmp(argv[i], "14") == 0) test_list |= PERFORM_TEST_14; else if (strcasecmp(argv[i], "15") == 0) test_list |= PERFORM_TEST_15; else if (strcmp(argv[i], "-m") == 0) { if (++i < argc) model_number = atoi(argv[i]); } else if (strcmp(argv[i], "-g") == 0) { use_gui = TRUE; } else { fprintf(stderr, "Unknown test '%s' specified\n", argv[i]); exit(2); } } if (test_list == 0) { fprintf(stderr, "No tests have been selected\n"); exit(2); } time(&now); tone_burst_step = 0; ctx = echo_can_create(TEST_EC_TAPS, 0); awgn_init_dbm0(&far_noise_source, 7162534, -50.0f); signal_load(&local_css, "sound_c1_8k.wav"); signal_load(&far_css, "sound_c3_8k.wav"); filesetup = afNewFileSetup(); if (filesetup == AF_NULL_FILESETUP) { fprintf(stderr, " Failed to create file setup\n"); exit(2); } afInitSampleFormat(filesetup, AF_DEFAULT_TRACK, AF_SAMPFMT_TWOSCOMP, 16); afInitRate(filesetup, AF_DEFAULT_TRACK, (float) SAMPLE_RATE); afInitFileFormat(filesetup, AF_FILE_WAVE); afInitChannels(filesetup, AF_DEFAULT_TRACK, 6); filesetup2 = afNewFileSetup(); if (filesetup2 == AF_NULL_FILESETUP) { fprintf(stderr, " Failed to create file setup\n"); exit(2); } afInitSampleFormat(filesetup2, AF_DEFAULT_TRACK, AF_SAMPFMT_TWOSCOMP, 16); afInitRate(filesetup2, AF_DEFAULT_TRACK, (float) SAMPLE_RATE); afInitFileFormat(filesetup2, AF_FILE_WAVE); afInitChannels(filesetup2, AF_DEFAULT_TRACK, 1); resulthandle = afOpenFile("result_sound.wav", "w", filesetup); if (resulthandle == AF_NULL_FILEHANDLE) { fprintf(stderr, " Failed to open result file\n"); exit(2); } residuehandle = afOpenFile("residue_sound.wav", "w", filesetup2); if (residuehandle == AF_NULL_FILEHANDLE) { fprintf(stderr, " Failed to open residue file\n"); exit(2); } local_cur = 0; far_cur = 0; result_cur = 0; if (channel_model_create(model_number)) { fprintf(stderr, " Failed to create line model\n"); exit(2); } #if defined(ENABLE_GUI) if (use_gui) { start_echo_can_monitor(TEST_EC_TAPS); echo_can_monitor_line_model_update(line_model.coeffs, line_model.taps); } #endif power_meter_1 = level_measurement_device_create(0); power_meter_2 = level_measurement_device_create(0); level_measurement_device(power_meter_1, 0); #if 0 echo_can_flush(ctx); /* Converge the canceller */ signal_restart(&local_css); for (i = 0; i < 800*2; i++) { clean = echo_can_update(ctx, 0, 0); put_residue(clean); } for (i = 0; i < SAMPLE_RATE*5; i++) { tx = signal_amp(&local_css); channel_model(&tx, &rx, tx, 0); clean = echo_can_update(ctx, tx, rx); put_residue(clean); } echo_can_adaption_mode(ctx, ECHO_CAN_USE_ADAPTION | ECHO_CAN_USE_NLP | ECHO_CAN_USE_CNG); for (i = 0; i < SAMPLE_RATE*5; i++) { tx = signal_amp(&local_css); channel_model(&tx, &rx, tx, 0); clean = echo_can_update(ctx, tx, rx); put_residue(clean); } echo_can_adaption_mode(ctx, ECHO_CAN_USE_ADAPTION); for (i = 0; i < SAMPLE_RATE*10; i++) { tx = signal_amp(&local_css); #if 0 if ((i/10000)%10 == 9) { /* Inject a burst of far sound */ if (far_cur >= far_max) { far_max = afReadFrames(farhandle, AF_DEFAULT_TRACK, far_sound, SAMPLE_RATE); if (far_max < 0) { fprintf(stderr, " Error reading far sound\n"); exit(2); } if (far_max == 0) break; far_cur = 0; } far_tx = far_sound[far_cur++]; } else { far_tx = 0; } #else far_sound[0] = 0; far_tx = 0; #endif channel_model(&tx, &rx, tx, far_tx); //rx += awgn(&far_noise_source); //tx += awgn(&far_noise_source); clean = echo_can_update(ctx, tx, rx); #if defined(XYZZY) if (i%SAMPLE_RATE == 0) { if (coeff_index < 200) { for (j = 0; j < ctx->taps; j++) coeffs[coeff_index][j] = ctx->fir_taps32[j]; coeff_index++; } } #endif result_sound[result_cur++] = tx; result_sound[result_cur++] = rx; result_sound[result_cur++] = clean - far_tx; //result_sound[result_cur++] = ctx->tx_power[2]; //result_sound[result_cur++] = ctx->tx_power[1]; result_sound[result_cur++] = (ctx->tx_power[1] > 64) ? SAMPLE_RATE : -SAMPLE_RATE; //result_sound[result_cur++] = ctx->tap_set*SAMPLE_RATE; //result_sound[result_cur++] = (ctx->nonupdate_dwell > 0) ? SAMPLE_RATE : -SAMPLE_RATE; //result_sound[result_cur++] = ctx->latest_correction >> 8; //result_sound[result_cur++] = level_measurement_device(tx)/(16.0*65536.0); //result_sound[result_cur++] = level_measurement_device(tx)/4096.0; result_sound[result_cur++] = (ctx->tx_power[1] > ctx->rx_power[0]) ? SAMPLE_RATE : -SAMPLE_RATE; //result_sound[result_cur++] = (ctx->tx_power[1] > ctx->rx_power[0]) ? SAMPLE_RATE : -SAMPLE_RATE; //result_sound[result_cur++] = (ctx->narrowband_score)*5; // ? SAMPLE_RATE : -SAMPLE_RATE; //result_sound[result_cur++] = ctx->tap_rotate_counter*10; result_sound[result_cur++] = ctx->vad; put_residue(clean - far_tx); if (result_cur >= 6*SAMPLE_RATE) { outframes = afWriteFrames(resulthandle, AF_DEFAULT_TRACK, result_sound, result_cur/6); if (outframes != result_cur/6) { fprintf(stderr, " Error writing result sound\n"); exit(2); } result_cur = 0; } } if (result_cur > 0) { outframes = afWriteFrames(resulthandle, AF_DEFAULT_TRACK, result_sound, result_cur/6); if (outframes != result_cur/4) { fprintf(stderr, " Error writing result sound\n"); exit(2); } } #endif /* Test 1 - Steady state residual and returned echo level test */ /* This functionality has been merged with test 2 in newer versions of G.168, so test 1 no longer exists. */ /* Test 2 - Convergence and steady state residual and returned echo level test */ if ((test_list & PERFORM_TEST_2A)) { printf("Performing test 2A - Convergence with NLP enabled\n"); /* Test 2A - Convergence with NLP enabled */ echo_can_flush(ctx); echo_can_adaption_mode(ctx, ECHO_CAN_USE_ADAPTION | ECHO_CAN_USE_NLP); /* Converge the canceller */ signal_restart(&local_css); for (i = 0; i < 800*2; i++) { clean = echo_can_update(ctx, 0, 0); put_residue(clean); } for (i = 0; i < SAMPLE_RATE*50; i++) { tx = signal_amp(&local_css); channel_model(&tx, &rx, tx, 0); clean = echo_can_update(ctx, tx, rx); pp1 = level_measurement_device(power_meter_1, rx); pp2 = level_measurement_device(power_meter_2, clean); residue = 100.0*pp1/pp2; put_residue(residue); #if defined(ENABLE_GUI) if (use_gui) echo_can_monitor_can_update(ctx->fir_taps16[ctx->tap_set], TEST_EC_TAPS); #endif } #if defined(ENABLE_GUI) if (use_gui) echo_can_monitor_can_update(ctx->fir_taps16[ctx->tap_set], TEST_EC_TAPS); #endif } if ((test_list & PERFORM_TEST_2B)) { printf("Performing test 2B - Convergence with NLP disabled\n"); /* Test 2B - Convergence with NLP disabled */ echo_can_flush(ctx); echo_can_adaption_mode(ctx, ECHO_CAN_USE_ADAPTION); /* Converge a canceller */ signal_restart(&local_css); for (i = 0; i < 800*2; i++) { clean = echo_can_update(ctx, 0, 0); put_residue(clean); } for (i = 0; i < SAMPLE_RATE*5; i++) { tx = signal_amp(&local_css); channel_model(&tx, &rx, tx, 0); clean = echo_can_update(ctx, tx, rx); put_residue(clean); #if defined(ENABLE_GUI) if (use_gui) echo_can_monitor_can_update(ctx->fir_taps16[ctx->tap_set], TEST_EC_TAPS); #endif } #if defined(ENABLE_GUI) if (use_gui) echo_can_monitor_can_update(ctx->fir_taps16[ctx->tap_set], TEST_EC_TAPS); #endif } if ((test_list & PERFORM_TEST_2C)) { printf("Performing test 2C - Convergence with background noise present\n"); /* Test 2C - Convergence with background noise present */ echo_can_flush(ctx); echo_can_adaption_mode(ctx, ECHO_CAN_USE_ADAPTION); /* Converge a canceller */ signal_restart(&local_css); for (i = 0; i < 800*2; i++) { clean = echo_can_update(ctx, 0, 0); put_residue(clean); } /* TODO: This uses a crude approx. to Hoth noise. We need the real thing. */ awgn_init_dbm0(&far_noise_source, 7162534, -40.0f); hoth_noise = 0; for (i = 0; i < SAMPLE_RATE*5; i++) { hoth_noise = hoth_noise*0.625 + awgn(&far_noise_source)*0.375; tx = signal_amp(&local_css); channel_model(&tx, &rx, tx, hoth_noise); clean = echo_can_update(ctx, tx, rx); put_residue(clean); } /* Now freeze adaption, and measure the echo. */ echo_can_adaption_mode(ctx, 0); for (i = 0; i < SAMPLE_RATE*5; i++) { tx = signal_amp(&local_css); channel_model(&tx, &rx, tx, 0); clean = echo_can_update(ctx, tx, rx); put_residue(clean); } echo_can_adaption_mode(ctx, ECHO_CAN_USE_ADAPTION); #if defined(ENABLE_GUI) if (use_gui) echo_can_monitor_can_update(ctx->fir_taps16[ctx->tap_set], TEST_EC_TAPS); #endif } /* Test 3 - Performance under double talk conditions */ if ((test_list & PERFORM_TEST_3A)) { printf("Performing test 3A - Double talk test with low cancelled-end levels\n"); /* Test 3A - Double talk test with low cancelled-end levels */ echo_can_flush(ctx); echo_can_adaption_mode(ctx, ECHO_CAN_USE_ADAPTION); signal_restart(&local_css); signal_restart(&far_css); /* Apply double talk, with a weak far end signal */ for (i = 0; i < SAMPLE_RATE*5; i++) { tx = signal_amp(&local_css); rx = signal_amp(&far_css)/20; channel_model(&tx, &rx, tx, rx); clean = echo_can_update(ctx, tx, rx); put_residue(clean - rx); } /* Now freeze adaption. */ echo_can_adaption_mode(ctx, 0); for (i = 0; i < 800*5; i++) { tx = signal_amp(&local_css); channel_model(&tx, &rx, tx, 0); clean = echo_can_update(ctx, tx, rx); put_residue(clean); } /* Now measure the echo */ for (i = 0; i < SAMPLE_RATE*5; i++) { tx = signal_amp(&local_css); channel_model(&tx, &rx, tx, 0); clean = echo_can_update(ctx, tx, rx); put_residue(clean); } echo_can_adaption_mode(ctx, ECHO_CAN_USE_ADAPTION); #if defined(ENABLE_GUI) if (use_gui) echo_can_monitor_can_update(ctx->fir_taps16[ctx->tap_set], TEST_EC_TAPS); #endif } if ((test_list & PERFORM_TEST_3B)) { printf("Performing test 3B - Double talk test with high cancelled-end levels\n"); /* Test 3B - Double talk test with high cancelled-end levels */ echo_can_flush(ctx); echo_can_adaption_mode(ctx, ECHO_CAN_USE_ADAPTION); signal_restart(&local_css); signal_restart(&far_css); /* Converge the canceller */ for (i = 0; i < SAMPLE_RATE*5; i++) { tx = signal_amp(&local_css); channel_model(&tx, &rx, tx, 0); clean = echo_can_update(ctx, tx, rx); put_residue(clean); } /* Apply double talk */ for (i = 0; i < SAMPLE_RATE*5; i++) { tx = signal_amp(&local_css); rx = signal_amp(&far_css); channel_model(&tx, &rx, tx, rx); clean = echo_can_update(ctx, tx, rx); put_residue(clean - rx); } /* Now freeze adaption. */ echo_can_adaption_mode(ctx, 0); for (i = 0; i < 800*5; i++) { tx = signal_amp(&local_css); channel_model(&tx, &rx, tx, 0); clean = echo_can_update(ctx, tx, rx); put_residue(clean); } /* Now measure the echo */ for (i = 0; i < SAMPLE_RATE*5; i++) { tx = signal_amp(&local_css); channel_model(&tx, &rx, tx, 0); clean = echo_can_update(ctx, tx, rx); put_residue(clean); } echo_can_adaption_mode(ctx, ECHO_CAN_USE_ADAPTION); #if defined(ENABLE_GUI) if (use_gui) echo_can_monitor_can_update(ctx->fir_taps16[ctx->tap_set], TEST_EC_TAPS); #endif } if ((test_list & PERFORM_TEST_3C)) { printf("Performing test 3C - Double talk test with simulated conversation\n"); /* Test 3C - Double talk test with simulated conversation */ echo_can_flush(ctx); echo_can_adaption_mode(ctx, ECHO_CAN_USE_ADAPTION); signal_restart(&local_css); signal_restart(&far_css); /* Apply double talk */ for (i = 0; i < 800*56; i++) { tx = signal_amp(&local_css); rx = signal_amp(&far_css); channel_model(&tx, &rx, tx, rx); clean = echo_can_update(ctx, tx, rx); put_residue(clean - rx); } /* Stop the far signal */ for (i = 0; i < 800*14; i++) { tx = signal_amp(&local_css); channel_model(&tx, &rx, tx, 0); clean = echo_can_update(ctx, tx, rx); put_residue(clean); } /* Continue measuring the resulting echo */ for (i = 0; i < 800*50; i++) { tx = signal_amp(&local_css); channel_model(&tx, &rx, tx, 0); clean = echo_can_update(ctx, tx, rx); put_residue(clean); } /* Reapply double talk */ signal_restart(&far_css); for (i = 0; i < 800*56; i++) { tx = signal_amp(&local_css); rx = signal_amp(&far_css); channel_model(&tx, &rx, tx, rx); clean = echo_can_update(ctx, tx, rx); put_residue(clean - rx); } /* Now the far signal only */ for (i = 0; i < 800*56; i++) { tx = 0; rx = signal_amp(&far_css); channel_model(&tx, &rx, 0, rx); clean = echo_can_update(ctx, tx, rx); put_residue(clean - rx); } #if defined(ENABLE_GUI) if (use_gui) echo_can_monitor_can_update(ctx->fir_taps16[ctx->tap_set], TEST_EC_TAPS); #endif } if ((test_list & PERFORM_TEST_4)) { printf("Performing test 4 - Leak rate test\n"); /* Test 4 - Leak rate test */ echo_can_flush(ctx); echo_can_adaption_mode(ctx, ECHO_CAN_USE_ADAPTION); /* Converge a canceller */ signal_restart(&local_css); for (i = 0; i < SAMPLE_RATE*5; i++) { tx = signal_amp(&local_css); channel_model(&tx, &rx, tx, 0); clean = echo_can_update(ctx, tx, rx); put_residue(clean); } /* Put 2 minutes of silence through it */ for (i = 0; i < SAMPLE_RATE*120; i++) { clean = echo_can_update(ctx, 0, 0); put_residue(clean); } /* Now freeze it, and check if it is still well adapted. */ echo_can_adaption_mode(ctx, 0); for (i = 0; i < SAMPLE_RATE*5; i++) { tx = signal_amp(&local_css); channel_model(&tx, &rx, tx, 0); clean = echo_can_update(ctx, tx, rx); put_residue(clean); } echo_can_adaption_mode(ctx, ECHO_CAN_USE_ADAPTION); #if defined(ENABLE_GUI) if (use_gui) echo_can_monitor_can_update(ctx->fir_taps16[ctx->tap_set], TEST_EC_TAPS); #endif } if ((test_list & PERFORM_TEST_5)) { printf("Performing test 5 - Infinite return loss convergence test\n"); /* Test 5 - Infinite return loss convergence test */ echo_can_flush(ctx); echo_can_adaption_mode(ctx, ECHO_CAN_USE_ADAPTION); /* Converge the canceller */ signal_restart(&local_css); for (i = 0; i < SAMPLE_RATE*5; i++) { tx = signal_amp(&local_css); channel_model(&tx, &rx, tx, 0); clean = echo_can_update(ctx, tx, rx); put_residue(clean); } /* Now stop echoing, and see we don't do anything unpleasant as the echo path is open looped. */ for (i = 0; i < SAMPLE_RATE*5; i++) { tx = signal_amp(&local_css); rx = 0; tx = codec_munge(tx); clean = echo_can_update(ctx, tx, rx); put_residue(clean); } #if defined(ENABLE_GUI) if (use_gui) echo_can_monitor_can_update(ctx->fir_taps16[ctx->tap_set], TEST_EC_TAPS); #endif } if ((test_list & PERFORM_TEST_6)) { printf("Performing test 6 - Non-divergence on narrow-band signals\n"); /* Test 6 - Non-divergence on narrow-band signals */ echo_can_flush(ctx); echo_can_adaption_mode(ctx, ECHO_CAN_USE_ADAPTION); /* Converge the canceller */ signal_restart(&local_css); for (i = 0; i < SAMPLE_RATE*5; i++) { tx = signal_amp(&local_css); channel_model(&tx, &rx, tx, 0); clean = echo_can_update(ctx, tx, rx); put_residue(clean); } /* Now put 5s bursts of a list of tones through the converged canceller, and check that bothing unpleasant happens. */ for (k = 0; tones_6_4_2_7[k][0]; k++) { make_tone_gen_descriptor(&tone_desc, tones_6_4_2_7[k][0], -11, tones_6_4_2_7[k][1], -9, 1, 0, 0, 0, 1); tone_gen_init(&tone_state, &tone_desc); j = 0; for (i = 0; i < 5; i++) { local_max = tone_gen(&tone_state, local_sound, SAMPLE_RATE); for (j = 0; j < SAMPLE_RATE; j++) { tx = local_sound[j]; channel_model(&tx, &rx, tx, 0); clean = echo_can_update(ctx, tx, rx); put_residue(clean); } #if defined(ENABLE_GUI) if (use_gui) { echo_can_monitor_can_update(ctx->fir_taps16[ctx->tap_set], TEST_EC_TAPS); echo_can_monitor_update_display(); usleep(100000); } #endif } } #if defined(ENABLE_GUI) if (use_gui) echo_can_monitor_can_update(ctx->fir_taps16[ctx->tap_set], TEST_EC_TAPS); #endif } if ((test_list & PERFORM_TEST_7)) { printf("Performing test 7 - Stability\n"); /* Test 7 - Stability */ /* Put tones through an unconverged canceller, and check nothing unpleasant happens. */ echo_can_flush(ctx); echo_can_adaption_mode(ctx, ECHO_CAN_USE_ADAPTION); make_tone_gen_descriptor(&tone_desc, tones_6_4_2_7[0][0], -11, tones_6_4_2_7[0][1], -9, 1, 0, 0, 0, 1); tone_gen_init(&tone_state, &tone_desc); j = 0; for (i = 0; i < 120; i++) { local_max = tone_gen(&tone_state, local_sound, SAMPLE_RATE); for (j = 0; j < SAMPLE_RATE; j++) { tx = local_sound[j]; channel_model(&tx, &rx, tx, 0); clean = echo_can_update(ctx, tx, rx); put_residue(clean); } #if defined(ENABLE_GUI) if (use_gui) { echo_can_monitor_can_update(ctx->fir_taps16[ctx->tap_set], TEST_EC_TAPS); echo_can_monitor_update_display(); usleep(100000); } #endif } #if defined(ENABLE_GUI) if (use_gui) echo_can_monitor_can_update(ctx->fir_taps16[ctx->tap_set], TEST_EC_TAPS); #endif } if ((test_list & PERFORM_TEST_8)) { printf("Performing test 8 - Non-convergence on No 5, 6, and 7 in-band signalling\n"); /* Test 8 - Non-convergence on No 5, 6, and 7 in-band signalling */ fprintf(stderr, "Test 8 not yet implemented\n"); } if ((test_list & PERFORM_TEST_9)) { printf("Performing test 9 - Comfort noise test\n"); /* Test 9 - Comfort noise test */ /* Test 9 part 1 - matching */ echo_can_flush(ctx); echo_can_adaption_mode(ctx, ECHO_CAN_USE_ADAPTION); /* Converge the canceller */ signal_restart(&local_css); for (i = 0; i < SAMPLE_RATE*5; i++) { tx = signal_amp(&local_css); channel_model(&tx, &rx, tx, 0); clean = echo_can_update(ctx, tx, rx); put_residue(clean); } echo_can_adaption_mode(ctx, ECHO_CAN_USE_ADAPTION | ECHO_CAN_USE_NLP | ECHO_CAN_USE_CNG); awgn_init_dbm0(&far_noise_source, 7162534, -45.0f); for (i = 0; i < SAMPLE_RATE*30; i++) { tx = 0; rx = awgn(&far_noise_source); channel_model(&tx, &rx, tx, rx); clean = echo_can_update(ctx, tx, rx); put_residue(clean); } awgn_init_dbm0(&local_noise_source, 1234567, -10.0f); for (i = 0; i < SAMPLE_RATE*2; i++) { tx = awgn(&local_noise_source); rx = awgn(&far_noise_source); channel_model(&tx, &rx, tx, rx); clean = echo_can_update(ctx, tx, rx); put_residue(clean); } /* Test 9 part 2 - adjust down */ awgn_init_dbm0(&far_noise_source, 7162534, -55.0f); for (i = 0; i < SAMPLE_RATE*10; i++) { tx = 0; rx = awgn(&far_noise_source); channel_model(&tx, &rx, tx, rx); clean = echo_can_update(ctx, tx, rx); put_residue(clean); } for (i = 0; i < SAMPLE_RATE*2; i++) { tx = awgn(&local_noise_source); rx = awgn(&far_noise_source); channel_model(&tx, &rx, tx, rx); clean = echo_can_update(ctx, tx, rx); put_residue(clean); } #if defined(ENABLE_GUI) if (use_gui) echo_can_monitor_can_update(ctx->fir_taps16[ctx->tap_set], TEST_EC_TAPS); #endif } /* Test 10 - FAX test during call establishment phase */ if ((test_list & PERFORM_TEST_10A)) { printf("Performing test 10A - Canceller operation on the calling station side\n"); /* Test 10A - Canceller operation on the calling station side */ fprintf(stderr, "Test 10A not yet implemented\n"); } if ((test_list & PERFORM_TEST_10B)) { printf("Performing test 10B - Canceller operation on the called station side\n"); /* Test 10B - Canceller operation on the called station side */ fprintf(stderr, "Test 10B not yet implemented\n"); } if ((test_list & PERFORM_TEST_10C)) { printf("Performing test 10C - Canceller operation on the calling station side during page\n" "transmission and page breaks (for further study)\n"); /* Test 10C - Canceller operation on the calling station side during page transmission and page breaks (for further study) */ fprintf(stderr, "Test 10C not yet implemented\n"); } if ((test_list & PERFORM_TEST_11)) { printf("Performing test 11 - Tandem echo canceller test (for further study)\n"); /* Test 11 - Tandem echo canceller test (for further study) */ fprintf(stderr, "Test 11 not yet implemented\n"); } if ((test_list & PERFORM_TEST_12)) { printf("Performing test 12 - Residual acoustic echo test (for further study)\n"); /* Test 12 - Residual acoustic echo test (for further study) */ fprintf(stderr, "Test 12 not yet implemented\n"); } if ((test_list & PERFORM_TEST_13)) { printf("Performing test 13 - Performance with ITU-T low-bit rate coders in echo path (Optional, under study)\n"); /* Test 13 - Performance with ITU-T low-bit rate coders in echo path (Optional, under study) */ fprintf(stderr, "Test 13 not yet implemented\n"); } if ((test_list & PERFORM_TEST_14)) { printf("Performing test 14 - Performance with V-series low-speed data modems\n"); /* Test 14 - Performance with V-series low-speed data modems */ fprintf(stderr, "Test 14 not yet implemented\n"); } if ((test_list & PERFORM_TEST_15)) { printf("Performing test 15 - PCM offset test (Optional)\n"); /* Test 15 - PCM offset test (Optional) */ fprintf(stderr, "Test 15 not yet implemented\n"); } echo_can_free(ctx); signal_free(&local_css); signal_free(&far_css); if (afCloseFile(resulthandle) != 0) { fprintf(stderr, " Cannot close speech file '%s'\n", "result_sound.wav"); exit(2); } if (afCloseFile(residuehandle) != 0) { fprintf(stderr, " Cannot close speech file '%s'\n", "residue_sound.wav"); exit(2); } afFreeFileSetup(filesetup); afFreeFileSetup(filesetup2); #if defined(XYZZY) for (j = 0; j < ctx->taps; j++) { for (i = 0; i < coeff_index; i++) fprintf(stderr, "%d ", coeffs[i][j]); fprintf(stderr, "\n"); } #endif printf("Run time %lds\n", time(NULL) - now); #if defined(ENABLE_GUI) if (use_gui) echo_can_monitor_wait_to_end(); #endif if (power_meter_1) level_measurement_device_release(power_meter_1); if (power_meter_2) level_measurement_device_release(power_meter_2); printf("Tests passed.\n"); return 0; } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/tests/t4_tests.c0000644000175000017500000005046711150047203020155 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * t4_tests.c - ITU T.4 FAX image to and from TIFF file tests * * Written by Steve Underwood * * Copyright (C) 2003 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2, as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: t4_tests.c,v 1.57 2008/05/03 07:37:06 steveu Exp $ */ /*! \file */ /*! \page t4_tests_page T.4 tests \section t4_tests_page_sec_1 What does it do These tests exercise the image compression and decompression methods defined in ITU specifications T.4 and T.6. */ #if defined(HAVE_CONFIG_H) #include "config.h" #endif #include #include #include #include #include #include "spandsp.h" #define IN_FILE_NAME "../test-data/itu/fax/itutests.tif" #define OUT_FILE_NAME "t4_tests_receive.tif" #define XSIZE 1728 t4_state_t send_state; t4_state_t receive_state; /* The following are some test cases from T.4 */ #define FILL_70 " " #define FILL_80 " " #define FILL_100 " " #define FILL_670 FILL_100 FILL_100 FILL_100 FILL_100 FILL_100 FILL_100 FILL_70 #define FILL_980 FILL_100 FILL_100 FILL_100 FILL_100 FILL_100 FILL_100 FILL_100 FILL_100 FILL_100 FILL_80 static const char t4_test_patterns[][1728 + 1] = { "XXXXXX " FILL_980 " XXX XXX X " FILL_670 " XXXX", "XXXXXX " FILL_980 " XXX X " FILL_670 " XXXX", /* Line start should code to V(0). Line middle codes to VR(3) VL(2) V(0). Line end should code to V(0) V(0). */ " XXXX " FILL_980 " XXXXXXX " FILL_670 " XX ", "XXXXX " FILL_980 "XX XX " FILL_670 " XXXX", /* Line start should code to VL(1). Line middle codes to H(7,2). Line end should code to V(0) VR(2) */ "XXX " FILL_980 " XX XX XX XXX " FILL_670 " X ", " " FILL_980 " X XXX XXXX " FILL_670 " X XX", /* Line start should code to P. Line middle codes to P VL(1) V(0) H(3,4) P. Line end codes to V(0) VL(2) V(0). */ "XXXXX " FILL_980 " " FILL_670 " XXXX", " XXX " FILL_980 " " FILL_670 " XX ", /* Line start should code to VR(2). Line end codes to V(0) VL(2) V(0). */ " XX " FILL_980 " " FILL_670 " X XXX", "XXX X " FILL_980 " " FILL_670 " X ", /* Line start should code to H(0,3) VR(1). Line end codes to V(0) VR(3). */ " " FILL_980 " " FILL_670 " XX ", " " FILL_980 " " FILL_670 " ", /* Line end codes to P V(0) a'0. */ " " FILL_980 " " FILL_670 " XXXXXXXXXX", " " FILL_980 " " FILL_670 " XXXXXX XXXXXX", /* Line end codes to H(2,6). */ " " FILL_980 " " FILL_670 " XX XXXXX", " " FILL_980 " " FILL_670 " XX ", /* Line end codes to V(0) H(7,0). */ }; static void dump_image_as_xxx(t4_state_t *state) { uint8_t *s; int i; int j; int k; /* Dump the entire image as text 'X's and spaces */ printf("Image (%d x %d):\n", receive_state.image_width, receive_state.image_length); s = state->image_buffer; for (i = 0; i < state->image_length; i++) { for (j = 0; j < state->bytes_per_row; j++) { for (k = 0; k < 8; k++) { printf((state->image_buffer[i*state->bytes_per_row + j] & (0x80 >> k)) ? "X" : " "); } } printf("\n"); } } /*- End of function --------------------------------------------------------*/ static void display_page_stats(t4_state_t *s) { t4_stats_t stats; t4_get_transfer_statistics(s, &stats); printf("Pages = %d\n", stats.pages_transferred); printf("Image size = %d x %d pixels\n", stats.width, stats.length); printf("Image resolution = %d/m x %d/m\n", stats.x_resolution, stats.y_resolution); printf("Bad rows = %d\n", stats.bad_rows); printf("Longest bad row run = %d\n", stats.longest_bad_row_run); printf("Bits per row - min %d, max %d\n", s->min_row_bits, s->max_row_bits); } /*- End of function --------------------------------------------------------*/ static int row_read_handler(void *user_data, uint8_t buf[], size_t len) { int i; int j; const char *s; static int row = 0; s = t4_test_patterns[row++]; if (row >= 16) return 0; memset(buf, 0, len); for (i = 0; i < len; i++) { for (j = 0; j < 8; j++) { if (*s++ != ' ') buf[i] |= (0x80 >> j); } } if (*s) printf("Oops - '%c' at end of row %d\n", *s, row); return len; } /*- End of function --------------------------------------------------------*/ static int row_write_handler(void *user_data, const uint8_t buf[], size_t len) { int i; int j; const char *s; static int row = 0; uint8_t ref[8192]; if (len == 0) return 0; s = t4_test_patterns[row++]; if (row >= 16) row = 0; memset(ref, 0, len); for (i = 0; i < len; i++) { for (j = 0; j < 8; j++) { if (*s++ != ' ') ref[i] |= (0x80 >> j); } } if (*s) printf("Oops - '%c' at end of row %d\n", *s, row); if (memcmp(buf, ref, len)) { printf("Failed at row %d\n", row); exit(2); } return len; } /*- End of function --------------------------------------------------------*/ int main(int argc, char *argv[]) { int sends; int page_no; int bit; int end_of_page; int end_marks; int decode_test; int compression; int compression_step; int add_page_headers; int min_row_bits; int restart_pages; int block_size; char buf[1024]; uint8_t block[1024]; const char *in_file_name; int opt; int i; int bit_error_rate; int dump_as_xxx; int tests_failed; tests_failed = 0; decode_test = FALSE; compression = -1; add_page_headers = FALSE; restart_pages = FALSE; in_file_name = IN_FILE_NAME; min_row_bits = 0; block_size = 0; bit_error_rate = 0; dump_as_xxx = FALSE; while ((opt = getopt(argc, argv, "126b:dehri:m:x")) != -1) { switch (opt) { case '1': compression = T4_COMPRESSION_ITU_T4_1D; break; case '2': compression = T4_COMPRESSION_ITU_T4_2D; break; case '6': compression = T4_COMPRESSION_ITU_T6; break; case 'b': block_size = atoi(optarg); if (block_size > 1024) block_size = 1024; break; case 'd': decode_test = TRUE; break; case 'e': bit_error_rate = 0x3FF; break; case 'h': add_page_headers = TRUE; break; case 'r': restart_pages = TRUE; break; case 'i': in_file_name = optarg; break; case 'm': min_row_bits = atoi(optarg); break; case 'x': dump_as_xxx = TRUE; break; default: //usage(); exit(2); break; } } /* Create a send and a receive end */ memset(&send_state, 0, sizeof(send_state)); memset(&receive_state, 0, sizeof(receive_state)); end_of_page = FALSE; if (decode_test) { if (compression < 0) compression = T4_COMPRESSION_ITU_T4_1D; /* Receive end puts TIFF to a new file. We assume the receive width here. */ if (t4_rx_init(&receive_state, OUT_FILE_NAME, T4_COMPRESSION_ITU_T4_2D) == NULL) { printf("Failed to init T.4 rx\n"); exit(2); } t4_rx_set_rx_encoding(&receive_state, compression); t4_rx_set_x_resolution(&receive_state, T4_X_RESOLUTION_R8); //t4_rx_set_y_resolution(&receive_state, T4_Y_RESOLUTION_FINE); t4_rx_set_y_resolution(&receive_state, T4_Y_RESOLUTION_STANDARD); t4_rx_set_image_width(&receive_state, XSIZE); page_no = 1; t4_rx_start_page(&receive_state); while (fgets(buf, 1024, stdin)) { if (sscanf(buf, "HDLC: FCD: 06 %x", &bit) == 1) { /* Useful for breaking up T.38 ECM logs */ for (i = 0; i < 256; i++) { if (sscanf(&buf[18 + 3*i], "%x", &bit) != 1) break; if ((end_of_page = t4_rx_put_byte(&receive_state, bit))) break; } } else if (strlen(buf) > 62 && sscanf(buf + 62, "Rx %d: IFP %x %x", &bit, &bit, &bit) == 3) { /* Useful for breaking up T.38 non-ECM logs */ for (i = 0; i < 256; i++) { if (sscanf(&buf[62 + 29 + 3*i], "%x", &bit) != 1) break; bit = bit_reverse8(bit); if ((end_of_page = t4_rx_put_byte(&receive_state, bit))) break; } } else if (sscanf(buf, "Rx bit %*d - %d", &bit) == 1) { if ((end_of_page = t4_rx_put_bit(&receive_state, bit))) { printf("End of page detected\n"); break; } } } if (dump_as_xxx) dump_image_as_xxx(&receive_state); t4_rx_end_page(&receive_state); display_page_stats(&receive_state); t4_rx_end(&receive_state); } else { #if 1 /* Send end gets TIFF from a file */ if (t4_tx_init(&send_state, in_file_name, -1, -1) == NULL) { printf("Failed to init T.4 send\n"); exit(2); } t4_tx_set_min_row_bits(&send_state, min_row_bits); t4_tx_set_local_ident(&send_state, "111 2222 3333"); /* Receive end puts TIFF to a new file. */ if (t4_rx_init(&receive_state, OUT_FILE_NAME, T4_COMPRESSION_ITU_T4_2D) == NULL) { printf("Failed to init T.4 rx\n"); exit(2); } t4_rx_set_x_resolution(&receive_state, t4_tx_get_x_resolution(&send_state)); t4_rx_set_y_resolution(&receive_state, t4_tx_get_y_resolution(&send_state)); t4_rx_set_image_width(&receive_state, t4_tx_get_image_width(&send_state)); /* Now send and receive all the pages in the source TIFF file */ page_no = 1; sends = 0; /* Select whether we step round the compression schemes, or use a single specified one. */ compression_step = (compression < 0) ? 0 : -1; for (;;) { end_marks = 0; /* Add a header line to alternate pages, if required */ if (add_page_headers && (sends & 2)) t4_tx_set_header_info(&send_state, "Header"); else t4_tx_set_header_info(&send_state, NULL); if (restart_pages && (sends & 1)) { /* Use restart, to send the page a second time */ if (t4_tx_restart_page(&send_state)) break; } else { switch (compression_step) { case 0: compression = T4_COMPRESSION_ITU_T4_1D; compression_step++; break; case 1: compression = T4_COMPRESSION_ITU_T4_2D; compression_step++; break; case 2: compression = T4_COMPRESSION_ITU_T6; compression_step = 0; break; } t4_tx_set_tx_encoding(&send_state, compression); t4_rx_set_rx_encoding(&receive_state, compression); if (t4_tx_start_page(&send_state)) break; } t4_rx_start_page(&receive_state); if (block_size == 0) { do { bit = t4_tx_get_bit(&send_state); if (bit == PUTBIT_END_OF_DATA) { /* T.6 data does not contain an image termination sequence. T.4 1D and 2D do, and should locate that sequence. */ if (compression == T4_COMPRESSION_ITU_T6) break; if (++end_marks > 50) { printf("Receiver missed the end of page mark\n"); tests_failed++; break; } } if (bit_error_rate) { if ((rand() % bit_error_rate) == 0) bit ^= 1; } end_of_page = t4_rx_put_bit(&receive_state, bit & 1); } while (!end_of_page); } else if (block_size == 1) { do { bit = t4_tx_get_byte(&send_state); if ((bit & 0x100)) { /* T.6 data does not contain an image termination sequence. T.4 1D and 2D do, and should locate that sequence. */ if (compression == T4_COMPRESSION_ITU_T6) break; if (++end_marks > 50) { printf("Receiver missed the end of page mark\n"); tests_failed++; break; } } end_of_page = t4_rx_put_byte(&receive_state, bit & 0xFF); } while (!end_of_page); } else { do { bit = t4_tx_get_chunk(&send_state, block, block_size); if (bit > 0) end_of_page = t4_rx_put_chunk(&receive_state, block, bit); if (bit < block_size) { /* T.6 data does not contain an image termination sequence. T.4 1D and 2D do, and should locate that sequence. */ if (compression == T4_COMPRESSION_ITU_T6) break; if (++end_marks > 50) { printf("Receiver missed the end of page mark\n"); tests_failed++; break; } } } while (!end_of_page); } if (dump_as_xxx) dump_image_as_xxx(&receive_state); display_page_stats(&receive_state); if (!restart_pages || (sends & 1)) t4_tx_end_page(&send_state); t4_rx_end_page(&receive_state); sends++; } t4_tx_end(&send_state); t4_rx_end(&receive_state); /* And we should now have a matching received TIFF file. Note this will only match at the image level. TIFF files allow a lot of ways to express the same thing, so bit matching of the files is not the normal case. */ fflush(stdout); sprintf(buf, "tiffcmp -t %s " OUT_FILE_NAME, in_file_name); if (tests_failed)// || system(buf)) { printf("Tests failed\n"); exit(2); } #endif #if 0 /* Send end gets TIFF from a function */ if (t4_tx_init(&send_state, in_file_name, -1, -1) == NULL) { printf("Failed to init T.4 tx\n"); exit(2); } t4_tx_set_row_read_handler(&send_state, row_read_handler, NULL); t4_tx_set_min_row_bits(&send_state, min_row_bits); t4_tx_set_local_ident(&send_state, "111 2222 3333"); /* Receive end puts TIFF to a function. */ if (t4_rx_init(&receive_state, OUT_FILE_NAME, T4_COMPRESSION_ITU_T4_2D) == NULL) { printf("Failed to init T.4 rx\n"); exit(2); } t4_rx_set_row_write_handler(&receive_state, row_write_handler, NULL); t4_rx_set_x_resolution(&receive_state, t4_tx_get_x_resolution(&send_state)); t4_rx_set_y_resolution(&receive_state, t4_tx_get_y_resolution(&send_state)); t4_rx_set_image_width(&receive_state, t4_tx_get_image_width(&send_state)); /* Now send and receive all the pages in the source TIFF file */ page_no = 1; /* Select whether we step round the compression schemes, or use a single specified one. */ compression_step = (compression < 0) ? 0 : -1; for (;;) { end_marks = 0; /* Add a header line to alternate pages, if required */ switch (compression_step) { case 0: compression = T4_COMPRESSION_ITU_T4_1D; compression_step++; break; case 1: compression = T4_COMPRESSION_ITU_T4_2D; compression_step++; break; case 2: compression = T4_COMPRESSION_ITU_T6; compression_step = 0; break; } t4_tx_set_tx_encoding(&send_state, compression); t4_rx_set_rx_encoding(&receive_state, compression); if (t4_tx_start_page(&send_state)) break; t4_rx_start_page(&receive_state); do { bit = t4_tx_get_bit(&send_state); if (bit == PUTBIT_END_OF_DATA) { /* T.6 data does not contain an image termination sequence. T.4 1D and 2D do, and should locate that sequence. */ if (compression == T4_COMPRESSION_ITU_T6) break; if (++end_marks > 50) { printf("Receiver missed the end of page mark\n"); tests_failed++; break; } } end_of_page = t4_rx_put_bit(&receive_state, bit & 1); } while (!end_of_page); t4_tx_end_page(&send_state); t4_rx_end_page(&receive_state); break; } t4_tx_end(&send_state); t4_rx_end(&receive_state); #endif printf("Tests passed\n"); } return 0; } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/tests/testadsi.c0000644000175000017500000005142011150047203020212 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * testadsi.c * * Written by Steve Underwood * * Copyright (C) 2003 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2, as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: testadsi.c,v 1.22 2008/05/13 13:17:26 steveu Exp $ */ #if defined(HAVE_CONFIG_H) #include #endif #include #include #include #include #include #include #include #include #include #include #include #include #if defined(HAVE_LIBUNICALL) #include #include #include #include #include "unicall.h" //#include "../libmfcr2/libmfcr2.h" //#include "../libpri/libpri.h" #include "spandsp.h" #define FALSE 0 #define TRUE (!FALSE) int caller_mode = FALSE; static AFfilehandle rxhandle; static AFfilehandle txhandle; #if 0 int adsi_create_message(adsi_tx_state_t *s, uint8_t *msg) { int len; len = adsi_add_field(s, msg, -1, CLASS_SDMF_CALLERID, 0); len = adsi_add_field(s, msg, len, 0, "10011750", 8); len = adsi_add_field(s, msg, len, 0, "6095551212", 10); return len; } #endif #if 0 int adsi_create_message(adsi_tx_state_t *s, uint8_t *msg) { int len; len = adsi_add_field(s, msg, -1, CLIP_MDMF_CALLERID, 0); len = adsi_add_field(s, msg, len, CLIP_CALLTYPE, "\x81", 1); len = adsi_add_field(s, msg, len, CLIP_DATETIME, "10011750", 8); len = adsi_add_field(s, msg, len, CLIP_CALLER_NUMBER, "12345678", 8); len = adsi_add_field(s, msg, len, CLIP_DIALED_NUMBER, "87654321", 8); len = adsi_add_field(s, msg, len, CLIP_CALLER_NAME, "Steve Underwood", 15); return len; } #endif #if 0 int adsi_create_message(adsi_tx_state_t *s, uint8_t *msg) { int len; len = adsi_add_field(s, msg, -1, CLIP_MDMF_CALLERID, 0); len = adsi_add_field(s, msg, len, CLIP_NUM_MSG, "\x03", 1); return len; } #endif #if 0 int adsi_create_message(adsi_tx_state_t *s, uint8_t *msg) { int len; len = adsi_add_field(s, msg, -1, CLIP_MDMF_MSG_WAITING, NULL, 0); len = adsi_add_field(s, msg, len, CLIP_VISUAL_INDICATOR, "\x00", 1); return len; } #endif #if 0 int adsi_create_message(adsi_tx_state_t *s, uint8_t *msg) { int len; len = adsi_add_field(s, msg, -1, CLIP_MDMF_MSG_WAITING, NULL, 0); len = adsi_add_field(s, msg, len, CLIP_VISUAL_INDICATOR, "\xFF", 1); len = adsi_add_field(s, msg, len, CLIP_NUM_MSG, "\x05", 1); return len; } #endif #if 1 int adsi_create_message(adsi_tx_state_t *s, uint8_t *msg) { int len; len = adsi_add_field(s, msg, -1, CLASS_SDMF_MSG_WAITING, NULL, 0); len = adsi_add_field(s, msg, len, 0, "\x6F", 1); len = adsi_add_field(s, msg, len, 0, "\x6F", 1); len = adsi_add_field(s, msg, len, 0, "\x6F", 1); return len; } #endif #if 0 int adsi_create_message(adsi_tx_state_t *s, uint8_t *msg) { int len; len = adsi_add_field(s, msg, -1, CLASS_SDMF_MSG_WAITING, NULL, 0); len = adsi_add_field(s, msg, len, 0, "\x42", 1); len = adsi_add_field(s, msg, len, 0, "\x42", 1); len = adsi_add_field(s, msg, len, 0, "\x42", 1); return len; } #endif #if 0 int adsi_create_message(adsi_tx_state_t *s, uint8_t *msg) { int len; len = adsi_add_field(s, msg, -1, CLIP_MDMF_SMS, NULL, 0); len = adsi_add_field(s, msg, len, CLIP_DISPLAY_INFO, "\x00ABC", 4); return len; } #endif struct { pthread_t thread; int chan; int sig_fd; int fd; uc_call_t *call; uc_crn_t crn; int xxx; int cause; dtmf_rx_state_t dtmf_state; char dtmf[101]; int dtmf_ptr; char *tag; char originating_number[32]; char destination_number[32]; adsi_rx_state_t adsi_rx; adsi_tx_state_t adsi_tx; } chan_stuff[30]; tone_gen_descriptor_t tone_desc; tone_gen_state_t gen; void channel_read_adsi_channel(uc_t *uc, int chan, void *user_data, uint8_t *buf, int len); int channel_write_adsi_channel(uc_t *uc, int chan, void *user_data, uint8_t *buf, int max_len); int channel_error(uc_t *uc, int chan, void *user_data, int cause); int signaling_error(uc_t *uc, void *user_data, int cause); void channel_read_adsi_channel(uc_t *uc, int chan, void *user_data, uint8_t *buf, int len) { int i; int xlen; int16_t pcm_buf[1024]; char *s; int outframes; for (i = 0; i < len; i++) pcm_buf[i] = alaw_to_linear(buf[i]); /*endfor*/ outframes = afWriteFrames(rxhandle, AF_DEFAULT_TRACK, pcm_buf, len); if (outframes != len) { printf("Failed to write %d samples\n", len); exit(2); } dtmf_rx(&chan_stuff[chan].dtmf_state, pcm_buf, len); xlen = dtmf_rx_get(&chan_stuff[chan].dtmf_state, chan_stuff[chan].dtmf + chan_stuff[chan].dtmf_ptr, 100 - chan_stuff[chan].dtmf_ptr); if (xlen > 0) { s = chan_stuff[chan].dtmf + chan_stuff[chan].dtmf_ptr; while (*s) { if (*s == '#') { uc_set_channel_read_callback(uc, 0, NULL, 0); uc_set_channel_write_callback(uc, 0, NULL, 0); if (uc_call_control(uc, UC_OP_DROPCALL, chan_stuff[chan].crn, (void *) UC_CAUSE_NORMAL_CLEARING)) printf ("A Drop Call failed\n"); /*endif*/ break; } /*endif*/ s++; } /*endwhile*/ printf("Got '%s'\n", chan_stuff[chan].dtmf); chan_stuff[chan].dtmf_ptr += xlen; } /*endif*/ adsi_rx(&(chan_stuff[chan].adsi_rx), pcm_buf, len); } /*- End of function --------------------------------------------------------*/ int channel_write_adsi_channel(uc_t *uc, int chan, void *user_data, uint8_t *buf, int max_len) { int16_t pcm_buf[1024]; int len; int i; static int block = 0; uint8_t adsi_msg[256]; int adsi_msg_len; if (++block == 100) { adsi_send_alert_tone(&(chan_stuff[chan].adsi_tx)); printf("Alert tone sent\n"); adsi_msg_len = adsi_create_message(&(chan_stuff[chan].adsi_tx), adsi_msg); if ((len = adsi_put_message(&(chan_stuff[chan].adsi_tx), adsi_msg, adsi_msg_len)) > 0) printf("Message put - %d bytes\n", len); } len = adsi_tx(&(chan_stuff[chan].adsi_tx), pcm_buf, max_len); afWriteFrames(txhandle, AF_DEFAULT_TRACK, pcm_buf, len); for (i = 0; i < len; i++) buf[i] = linear_to_alaw(pcm_buf[i]); /*endfor*/ return len; } /*- End of function --------------------------------------------------------*/ int channel_error(uc_t *uc, int chan, void *user_data, int cause) { printf("Error %d\n", cause); return 0; } /*- End of function --------------------------------------------------------*/ int signaling_error(uc_t *uc, void *user_data, int cause) { printf("Error %d\n", cause); return 0; } /*- End of function --------------------------------------------------------*/ static void initiate_call(uc_t *uc, int chan, uc_event_t *e) { uc_makecall_t makecall; uc_callparms_t *callparms; int ret; printf ("Initiating call\n"); if ((callparms = uc_new_callparms(NULL)) == NULL) return; /*endif*/ uc_callparm_originating_number(callparms, chan_stuff[chan].originating_number); uc_callparm_destination_number(callparms, chan_stuff[chan].destination_number); makecall.callparms = callparms; makecall.crn = 0; if (ret = uc_call_control(uc, UC_OP_MAKECALL, 0, (void *) &makecall) != UC_RET_OK) fprintf(stderr, "Make Call failed - %d\n", ret); /*endif*/ chan_stuff[chan].crn = makecall.crn; free(callparms); } /*- End of function --------------------------------------------------------*/ static void handle_uc_event(uc_t *uc, void *user_data, uc_event_t *e) { int chan; chan = (int) user_data; printf ("-- %s (%d)\n", uc_event2str(e->e), chan); switch (e->e) { case UC_EVENT_DEVICEFAIL: break; case UC_EVENT_PROTOCOLFAIL: printf("-- Protocol failure on channel %d, cause %d\n", e->gen.channel, e->gen.data); break; case UC_EVENT_SIGCHANSTATUS: printf("-- Signalling channel status - %s\n", e->sigchanstatus.ok ? "Up" : "Down"); break; case UC_EVENT_ALARM: printf("-- Alarm - 0x%X 0x%X\n", e->alarm.raised, e->alarm.cleared); break; case UC_EVENT_FARBLOCKED: printf("-- Channel far end blocked! :-(\n"); chan_stuff[chan].xxx &= ~1; break; case UC_EVENT_FARUNBLOCKED: printf("-- Channel far end unblocked! :-)\n"); chan_stuff[chan].xxx |= 1; if (chan_stuff[chan].xxx == 3) { if (caller_mode) initiate_call(uc, chan, e); /*endif*/ } /*endif*/ break; case UC_EVENT_LOCALBLOCKED: printf("-- Channel local end blocked! :-(\n"); chan_stuff[chan].xxx &= ~2; break; case UC_EVENT_LOCALUNBLOCKED: printf("-- Channel local end unblocked! :-)\n"); chan_stuff[chan].xxx |= 2; if (chan_stuff[chan].xxx == 3) { if (caller_mode) initiate_call(uc, chan, e); /*endif*/ } /*endif*/ break; case UC_EVENT_DIALING: printf("-- Dialing on channel %d\n", e->gen.channel); break; case UC_EVENT_ACCEPTED: printf("-- Accepted on channel %d\n", e->gen.channel); if (uc_call_control(uc, UC_OP_ANSWERCALL, e->gen.crn, (void *) -1)) fprintf(stderr, "Answer Call failed\n"); /*endif*/ break; case UC_EVENT_DETECTED: printf("-- Detected on channel %d\n", e->gen.channel); break; case UC_EVENT_ALERTING: printf("-- Alerting on channel %d\n", e->gen.channel); /* This is just a notification of call progress. We need take no action at this point. */ break; case UC_EVENT_FARDISCONNECTED: printf("-- Far end disconnected on channel %d\n", e->fardisconnected.channel); /* Kill any outstanding audio processing */ uc_set_channel_read_callback(uc, 0, NULL, 0); uc_set_channel_write_callback(uc, 0, NULL, 0); if (uc_call_control(uc, UC_OP_DROPCALL, e->fardisconnected.crn, (void *) UC_CAUSE_NORMAL_CLEARING)) fprintf(stderr, "C Drop Call failed\n"); /*endif*/ break; case UC_EVENT_DROPCALL: printf("-- Drop call on channel %d\n", e->gen.channel); if (uc_call_control(uc, UC_OP_RELEASECALL, e->gen.crn, NULL)) fprintf(stderr, "uc_ReleaseCall failed\n"); /*endif*/ break; case UC_EVENT_RELEASECALL: printf("-- Released on channel %d\n", e->gen.channel); if (caller_mode) initiate_call(uc, chan, e); /*endif*/ break; case UC_EVENT_OFFERED: printf("-- Offered on channel %d, CRN %d (ANI: %s, DNIS: %s)\n", e->offered.channel, e->offered.crn, e->offered.parms.originating_number, e->offered.parms.destination_number); if (!caller_mode) { switch (chan_stuff[chan].cause) { case 0: if (uc_call_control(uc, UC_OP_ACCEPTCALL, e->offered.crn, (void *) -1)) fprintf(stderr, "uc_AcceptCall failed\n"); /*endif*/ break; case 1: if (uc_call_control(uc, UC_OP_ANSWERCALL, e->offered.crn, (void *) -1)) fprintf(stderr, "uc_AnswerCall failed\n"); /*endif*/ break; case 2: if (uc_call_control(uc, UC_OP_DROPCALL, e->offered.crn, (void *) UC_CAUSE_USER_BUSY)) fprintf(stderr, "E Drop Call failed\n"); /*endif*/ break; case 3: if (uc_call_control(uc, UC_OP_DROPCALL, e->offered.crn, (void *) UC_CAUSE_UNASSIGNED_NUMBER)) fprintf(stderr, "F Drop Call failed\n"); /*endif*/ break; case 4: if (uc_call_control(uc, UC_OP_DROPCALL, e->offered.crn, (void *) UC_CAUSE_NETWORK_CONGESTION)) fprintf(stderr, "G Drop Call failed\n"); /*endif*/ break; case 5: if (uc_call_control(uc, UC_OP_DROPCALL, e->offered.crn, (void *) UC_CAUSE_DEST_OUT_OF_ORDER)) fprintf(stderr, "H Drop Call failed\n"); /*endif*/ break; } /*endswitch*/ if (++chan_stuff[chan].cause > 5) chan_stuff[chan].cause = 0; /*endif*/ } /*endif*/ break; case UC_EVENT_ANSWERED: printf("-- Answered on channel %d\n", e->gen.channel); uc_set_channel_read_callback(uc, 0, channel_read_adsi_channel, (void *) chan); printf("XXX read callback set\n"); uc_set_channel_write_callback(uc, 0, channel_write_adsi_channel, (void *) chan); printf("XXX write callback set\n"); adsi_tx_init(&(chan_stuff[chan].adsi_tx), ADSI_STANDARD_CLASS); printf("XXX ADSI inited\n"); dtmf_rx_init(&chan_stuff[chan].dtmf_state, NULL, NULL); printf("XXX DTMF inited\n"); break; case UC_EVENT_CONNECTED: printf("-- Connected on channel %d\n", e->gen.channel); if (uc_call_control(uc, UC_OP_DROPCALL, e->offered.crn, (void *) UC_CAUSE_NORMAL_CLEARING)) printf ("I Drop Call failed\n"); /*endif*/ break; default: fprintf(stderr, "--!! Unknown signaling event %d\n", e->e); break; } /*endswitch*/ } /*- End of function --------------------------------------------------------*/ static void *run_uc(void *arg) { uc_t *uc; uc_event_t *e; struct timeval tv = {0,0}; struct timeval *next; fd_set rfds; fd_set wfds; fd_set efds; int res; int dfd; int chan; chan = *((int *) arg); dfd = chan_stuff[chan].fd; uc = uc_new(dfd, dfd, "mfcr2", "cn", UC_MODE_CPE, 1); //uc = uc_new(dfd, dfd, "pri", "ctr4", UC_MODE_CPE, 1); if (uc == NULL) { fprintf(stderr, "Unable to create instance\n"); return NULL; } /*endif*/ uc_set_signaling_callback(uc, handle_uc_event, (void *) chan); uc_set_signaling_error_callback(uc, signaling_error, (void *) chan); uc_set_channel_error_callback(uc, 0, channel_error, (void *) chan); uc_set_logging(uc, 0x7FFFFFFF, 0, chan_stuff[chan].tag); uc_call_control(uc, UC_OP_UNBLOCK, 0, (void *) -1); for (;;) { FD_ZERO(&rfds); FD_ZERO(&wfds); FD_ZERO(&efds); FD_SET(dfd, &rfds); FD_SET(dfd, &wfds); FD_SET(dfd, &efds); if ((next = uc_schedule_next(uc))) { gettimeofday(&tv, NULL); tv.tv_sec = next->tv_sec - tv.tv_sec; tv.tv_usec = next->tv_usec - tv.tv_usec; if (tv.tv_usec < 0) { tv.tv_usec += 1000000; tv.tv_sec -= 1; } /*endif*/ if (tv.tv_sec < 0) { tv.tv_sec = 0; tv.tv_usec = 0; } /*endif*/ } /*endif*/ res = select(dfd + 1, &rfds, NULL, &efds, next ? &tv : NULL); e = NULL; if (res == 0) { uc_schedule_run(uc); } else if (res > 0) { e = uc_check_event(uc); } else if (errno != EINTR) { fprintf(stderr, "Error (%d) on select: %s\n", errno, strerror(errno)); } /*endif*/ if (e) { printf("Non-callback signaling event\n"); handle_uc_event(uc, (void *) chan, e); } /*endif*/ } /*endfor*/ return NULL; } /*- End of function --------------------------------------------------------*/ int main(int argc, char *argv[]) { pthread_attr_t attr; struct zt_bufferinfo b; struct zt_gains g; int chan; int chanx; char dev_name[20]; AFfilesetup filesetup; int j; filesetup = afNewFileSetup(); if (filesetup == AF_NULL_FILESETUP) { fprintf(stderr, " Failed to create file setup\n"); exit(2); } afInitSampleFormat(filesetup, AF_DEFAULT_TRACK, AF_SAMPFMT_TWOSCOMP, 16); afInitRate(filesetup, AF_DEFAULT_TRACK, (float) SAMPLE_RATE); afInitFileFormat(filesetup, AF_FILE_WAVE); afInitChannels(filesetup, AF_DEFAULT_TRACK, 1); rxhandle = afOpenFile("rxadsi.wav", "w", filesetup); if (rxhandle == AF_NULL_FILEHANDLE) { fprintf(stderr, " Failed to open adsi audio file\n"); exit(2); } txhandle = afOpenFile("txadsi.wav", "w", filesetup); if (txhandle == AF_NULL_FILEHANDLE) { fprintf(stderr, " Failed to open adsi audio file\n"); exit(2); } uc_start(); pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); if (argc < 1) { fprintf(stderr, "Usage: testcall [call]\n"); exit(1); } /*endif*/ for (chan = 0; chan < 1/*30*/; chan++) { chan_stuff[chan].sig_fd = open("/dev/zap/channel", O_RDWR | O_NONBLOCK); if (chan_stuff[chan].sig_fd < 0) { fprintf(stderr, "Failed to open channel: %s\n", strerror(errno)); exit(1); } /*endif*/ chan_stuff[chan].fd = chan_stuff[chan].sig_fd; /* Allow for the missing channel at TS16 */ if (chan < 15) chanx = chan + 1; else chanx = chan + 2; /*endif*/ if (ioctl(chan_stuff[chan].fd, ZT_SPECIFY, &chanx)) { fprintf(stderr, "Failed to specify channel %d: %s\n", chanx, strerror(errno)); exit(1); } /*endif*/ if (ioctl(chan_stuff[chan].fd, ZT_GET_BUFINFO, &b)) { fprintf(stderr, "Unable to get buffer info on channel %d: %s\n", chanx, strerror(errno)); exit(1); } /*endif*/ printf ("%d %d %d %d %d %d\n", b.rxbufpolicy, b.txbufpolicy, b.numbufs, b.bufsize, b.readbufs, b.writebufs); b.rxbufpolicy = ZT_POLICY_IMMEDIATE; b.txbufpolicy = ZT_POLICY_IMMEDIATE; b.numbufs = 4; b.bufsize = 160; if (ioctl(chan_stuff[chan].fd, ZT_SET_BUFINFO, &b)) { fprintf(stderr, "Unable to set buffer info on channel %d: %s\n", chanx, strerror(errno)); exit(1); } /*endif*/ if (ioctl(chan_stuff[chan].fd, ZT_GET_BUFINFO, &b)) { fprintf(stderr, "Unable to get buffer info on channel %d: %s\n", chanx, strerror(errno)); exit(1); } /*endif*/ for (j = 0; j < 256; j++) { g.rxgain[j] = j; g.txgain[j] = j; } ioctl(chan_stuff[chan].fd, ZT_SETGAINS, &g); printf("%d %d %d %d %d %d\n", b.rxbufpolicy, b.txbufpolicy, b.numbufs, b.bufsize, b.readbufs, b.writebufs); if (argc > 1) caller_mode = TRUE; /*endif*/ chan_stuff[chan].chan = chan; sprintf(dev_name, "Chan %2d:", chanx); chan_stuff[chan].tag = strdup(dev_name); sprintf(chan_stuff[chan].originating_number, "%d", 987654321 + chan); sprintf(chan_stuff[chan].destination_number, "%d", 1234 + chan); printf("Thread for channel %d\n", chan); if (pthread_create(&chan_stuff[chan].thread, &attr, run_uc, &chan_stuff[chan].chan)) exit(2); /*endif*/ } /*endfor*/ for (;;) { sleep(5); printf("Main thread\n"); } /*endfor*/ exit(0); return 0; } /*- End of function --------------------------------------------------------*/ #else int main(int argc, char *argv[]) { printf("This program was not built with Unicall available\n"); } /*- End of function --------------------------------------------------------*/ #endif /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/tests/v42_tests.c0000644000175000017500000001006011150047203020222 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * v42_tests.c * * Written by Steve Underwood * * Copyright (C) 2004 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2, as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: v42_tests.c,v 1.25 2008/05/13 13:17:26 steveu Exp $ */ /* THIS IS A WORK IN PROGRESS. IT IS NOT FINISHED. */ /*! \page v42_tests_page V.42 tests \section v42_tests_page_sec_1 What does it do? These tests connect two instances of V.42 back to back. V.42 frames are then exchanged between them. */ #if defined(HAVE_CONFIG_H) #include #endif #include #include #include #include #include "spandsp.h" v42_state_t caller; v42_state_t answerer; int rx_next[3] = {0}; int tx_next[3] = {0}; static void v42_status(void *user_data, int status) { int x; x = (intptr_t) user_data; printf("%d: Status is '%s' (%d)\n", x, lapm_status_to_str(status), status); //if (status == LAPM_DATA) // lapm_tx_iframe((x == 1) ? &caller.lapm : &answerer.lapm, "ABCDEFGHIJ", 10, 1); } static void v42_frames(void *user_data, const uint8_t *msg, int len) { int i; int x; x = (intptr_t) user_data; for (i = 0; i < len; i++) { if (msg[i] != (rx_next[x] & 0xFF)) printf("%d: Mismatch 0x%02X 0x%02X\n", x, msg[i], rx_next[x] & 0xFF); rx_next[x]++; } printf("%d: Got frame len %d\n", x, len); } int main(int argc, char *argv[]) { int i; int bit; uint8_t buf[1024]; v42_init(&caller, TRUE, TRUE, v42_frames, (void *) 1); v42_init(&answerer, FALSE, TRUE, v42_frames, (void *) 2); v42_set_status_callback(&caller, v42_status, (void *) 1); v42_set_status_callback(&answerer, v42_status, (void *) 2); span_log_set_level(&caller.logging, SPAN_LOG_SHOW_SEVERITY | SPAN_LOG_SHOW_PROTOCOL | SPAN_LOG_DEBUG); span_log_set_tag(&caller.logging, "caller"); span_log_set_level(&caller.lapm.logging, SPAN_LOG_SHOW_SEVERITY | SPAN_LOG_SHOW_PROTOCOL | SPAN_LOG_DEBUG); span_log_set_tag(&caller.lapm.logging, "caller"); span_log_set_level(&caller.lapm.sched.logging, SPAN_LOG_SHOW_SEVERITY | SPAN_LOG_SHOW_PROTOCOL | SPAN_LOG_DEBUG); span_log_set_tag(&caller.lapm.sched.logging, "caller"); span_log_set_level(&answerer.logging, SPAN_LOG_SHOW_SEVERITY | SPAN_LOG_SHOW_PROTOCOL | SPAN_LOG_DEBUG); span_log_set_tag(&answerer.logging, "answerer"); span_log_set_level(&answerer.lapm.logging, SPAN_LOG_SHOW_SEVERITY | SPAN_LOG_SHOW_PROTOCOL | SPAN_LOG_DEBUG); span_log_set_tag(&answerer.lapm.logging, "answerer"); span_log_set_level(&answerer.lapm.sched.logging, SPAN_LOG_SHOW_SEVERITY | SPAN_LOG_SHOW_PROTOCOL | SPAN_LOG_DEBUG); span_log_set_tag(&answerer.lapm.sched.logging, "answerer"); for (i = 0; i < 100000; i++) { bit = v42_tx_bit(&caller); v42_rx_bit(&answerer, bit); bit = v42_tx_bit(&answerer); //if (i%10000 == 0) // bit ^= 1; v42_rx_bit(&caller, bit); span_schedule_update(&caller.lapm.sched, 4); span_schedule_update(&answerer.lapm.sched, 4); buf[0] = tx_next[1]; if (lapm_tx(&caller.lapm, buf, 1) == 1) tx_next[1]++; buf[0] = tx_next[2]; if (lapm_tx(&answerer.lapm, buf, 1) == 1) tx_next[2]++; } return 0; } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/tests/regression_tests.sh0000755000175000017500000003753011150047203022175 0ustar julienjulien#!/bin/sh # # SpanDSP - a series of DSP components for telephony # # regression_tests.sh # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License version 2.1, # as published by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this program; if not, write to the Free Software # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. # # $Id: regression_tests.sh,v 1.51 2008/05/03 07:37:06 steveu Exp $ # ITUTESTS_TIF=../test-data/itu/fax/itutests.tif STDOUT_DEST=xyzzy STDERR_DEST=xyzzy2 echo Performing basic spandsp regression tests echo ./adsi_tests >$STDOUT_DEST 2>$STDERR_DEST RETVAL=$? if [ $RETVAL != 0 ] then echo adsi_tests failed! exit $RETVAL fi echo adsi_tests completed OK ./async_tests >$STDOUT_DEST 2>$STDERR_DEST RETVAL=$? if [ $RETVAL != 0 ] then echo async_tests failed! exit $RETVAL fi echo async_tests completed OK ./at_interpreter_tests >$STDOUT_DEST 2>$STDERR_DEST RETVAL=$? if [ $RETVAL != 0 ] then echo at_interpreter_tests failed! exit $RETVAL fi echo at_interpreter_tests completed OK ./awgn_tests >$STDOUT_DEST 2>$STDERR_DEST RETVAL=$? if [ $RETVAL != 0 ] then echo awgn_tests failed! exit $RETVAL fi echo awgn_tests completed OK ./bell_mf_rx_tests >$STDOUT_DEST 2>$STDERR_DEST RETVAL=$? if [ $RETVAL != 0 ] then echo bell_mf_rx_tests failed! exit $RETVAL fi echo bell_mf_rx_tests completed OK ./bell_mf_tx_tests >$STDOUT_DEST 2>$STDERR_DEST RETVAL=$? if [ $RETVAL != 0 ] then echo bell_mf_tx_tests failed! exit $RETVAL fi echo bell_mf_tx_tests completed OK ./bert_tests >$STDOUT_DEST 2>$STDERR_DEST RETVAL=$? if [ $RETVAL != 0 ] then echo bert_tests failed! exit $RETVAL fi echo bert_tests completed OK ./bit_operations_tests >$STDOUT_DEST 2>$STDERR_DEST RETVAL=$? if [ $RETVAL != 0 ] then echo bit_operations_tests failed! exit $RETVAL fi echo bit_operations_tests completed OK ./crc_tests >$STDOUT_DEST 2>$STDERR_DEST RETVAL=$? if [ $RETVAL != 0 ] then echo crc_tests failed! exit $RETVAL fi echo crc_tests completed OK ./dc_restore_tests >$STDOUT_DEST 2>$STDERR_DEST RETVAL=$? if [ $RETVAL != 0 ] then echo dc_restore_tests failed! exit $RETVAL fi echo dc_restore_tests completed OK ./dds_tests >$STDOUT_DEST 2>$STDERR_DEST RETVAL=$? if [ $RETVAL != 0 ] then echo dds_tests failed! exit $RETVAL fi echo dds_tests completed OK ./dtmf_rx_tests >$STDOUT_DEST 2>$STDERR_DEST RETVAL=$? if [ $RETVAL != 0 ] then echo dtmf_rx_tests failed! exit $RETVAL fi echo dtmf_rx_tests completed OK ./dtmf_tx_tests >$STDOUT_DEST 2>$STDERR_DEST RETVAL=$? if [ $RETVAL != 0 ] then echo dtmf_tx_tests failed! exit $RETVAL fi echo dtmf_tx_tests completed OK #./echo_tests >$STDOUT_DEST 2>$STDERR_DEST #RETVAL=$? #if [ $RETVAL != 0 ] #then # echo echo_tests failed! # exit $RETVAL #fi #echo echo_tests completed OK echo echo_tests not enabled rm -f fax_tests_1.tif ./fax_tests >$STDOUT_DEST 2>$STDERR_DEST RETVAL=$? if [ $RETVAL != 0 ] then echo fax_tests failed! exit $RETVAL fi # Now use tiffcmp to check the results. It will return non-zero if any page images differ. The -t # option means the normal differences in tags will be ignored. tiffcmp -t ${ITUTESTS_TIF} fax_tests_1.tif >/dev/null RETVAL=$? if [ $RETVAL != 0 ] then echo fax_tests failed! exit $RETVAL fi rm -f fax_tests_1.tif ./fax_tests -e >$STDOUT_DEST 2>$STDERR_DEST RETVAL=$? if [ $RETVAL != 0 ] then echo fax_tests -e failed! exit $RETVAL fi # Now use tiffcmp to check the results. It will return non-zero if any page images differ. The -t # option means the normal differences in tags will be ignored. tiffcmp -t ${ITUTESTS_TIF} fax_tests_1.tif >/dev/null RETVAL=$? if [ $RETVAL != 0 ] then echo fax_tests -e failed! exit $RETVAL fi echo fax_tests completed OK ./fsk_tests >$STDOUT_DEST 2>$STDERR_DEST RETVAL=$? if [ $RETVAL != 0 ] then echo fsk_tests failed! exit $RETVAL fi echo fsk_tests completed OK #./g1050_tests >$STDOUT_DEST 2>$STDERR_DEST #RETVAL=$? #if [ $RETVAL != 0 ] #then # echo g1050_tests failed! # exit $RETVAL #fi #echo g1050_tests completed OK ./g711_tests >$STDOUT_DEST 2>$STDERR_DEST RETVAL=$? if [ $RETVAL != 0 ] then echo g711_tests failed! exit $RETVAL fi echo g711_tests completed OK ./g722_tests >$STDOUT_DEST 2>$STDERR_DEST RETVAL=$? if [ $RETVAL != 0 ] then echo g722_tests failed! exit $RETVAL fi echo g722_tests completed OK ./g726_tests >$STDOUT_DEST 2>$STDERR_DEST RETVAL=$? if [ $RETVAL != 0 ] then echo g726_tests failed! exit $RETVAL fi echo g726_tests completed OK ./gsm0610_tests >$STDOUT_DEST 2>$STDERR_DEST RETVAL=$? if [ $RETVAL != 0 ] then echo gsm0610_tests failed! exit $RETVAL fi echo gsm0610_tests completed OK ./hdlc_tests >$STDOUT_DEST 2>$STDERR_DEST RETVAL=$? if [ $RETVAL != 0 ] then echo hdlc_tests failed! exit $RETVAL fi echo hdlc_tests completed OK ./ima_adpcm_tests >$STDOUT_DEST 2>$STDERR_DEST RETVAL=$? if [ $RETVAL != 0 ] then echo ima_adpcm_tests failed! exit $RETVAL fi echo ima_adpcm_tests completed OK ./logging_tests >$STDOUT_DEST 2>$STDERR_DEST RETVAL=$? if [ $RETVAL != 0 ] then echo logging_tests failed! exit $RETVAL fi echo logging_tests completed OK ./lpc10_tests >$STDOUT_DEST 2>$STDERR_DEST RETVAL=$? if [ $RETVAL != 0 ] then echo lpc10_tests failed! exit $RETVAL fi echo lpc10_tests completed OK ./modem_echo_tests >$STDOUT_DEST 2>$STDERR_DEST RETVAL=$? if [ $RETVAL != 0 ] then echo modem_echo_tests failed! exit $RETVAL fi echo modem_echo_tests completed OK ./modem_connect_tones_tests >$STDOUT_DEST 2>$STDERR_DEST RETVAL=$? if [ $RETVAL != 0 ] then echo modem_connect_tones_tests failed! exit $RETVAL fi echo modem_connect_tones_tests completed OK ./noise_tests >$STDOUT_DEST 2>$STDERR_DEST RETVAL=$? if [ $RETVAL != 0 ] then echo noise_tests failed! exit $RETVAL fi echo noise_tests completed OK ./oki_adpcm_tests >$STDOUT_DEST 2>$STDERR_DEST RETVAL=$? if [ $RETVAL != 0 ] then echo oki_adpcm_tests failed! exit $RETVAL fi echo oki_adpcm_tests completed OK #./playout_tests >$STDOUT_DEST 2>$STDERR_DEST #RETVAL=$? #if [ $RETVAL != 0 ] #then # echo playout_tests failed! # exit $RETVAL #fi #echo playout_tests completed OK echo playout_tests not enabled #./plc_tests >$STDOUT_DEST 2>$STDERR_DEST #RETVAL=$? #if [ $RETVAL != 0 ] #then # echo plc_tests failed! # exit $RETVAL #fi #echo plc_tests completed OK echo plc_tests not enabled ./power_meter_tests >$STDOUT_DEST 2>$STDERR_DEST RETVAL=$? if [ $RETVAL != 0 ] then echo power_meter_tests failed! exit $RETVAL fi echo power_meter_tests completed OK ./queue_tests >$STDOUT_DEST 2>$STDERR_DEST RETVAL=$? if [ $RETVAL != 0 ] then echo queue_tests failed! exit $RETVAL fi echo queue_tests completed OK ./r2_mf_rx_tests >$STDOUT_DEST 2>$STDERR_DEST RETVAL=$? if [ $RETVAL != 0 ] then echo r2_mf_rx_tests failed! exit $RETVAL fi echo r2_mf_rx_tests completed OK ./r2_mf_tx_tests >$STDOUT_DEST 2>$STDERR_DEST RETVAL=$? if [ $RETVAL != 0 ] then echo r2_mf_tx_tests failed! exit $RETVAL fi echo r2_mf_tx_tests completed OK #./rfc2198_sim_tests >$STDOUT_DEST 2>$STDERR_DEST #RETVAL=$? #if [ $RETVAL != 0 ] #then # echo rfc2198_sim_tests failed! # exit $RETVAL #fi #echo rfc2198_sim_tests completed OK ./schedule_tests >$STDOUT_DEST 2>$STDERR_DEST RETVAL=$? if [ $RETVAL != 0 ] then echo schedule_tests failed! exit $RETVAL fi echo schedule_tests completed OK #./sig_tone_tests >$STDOUT_DEST 2>$STDERR_DEST #RETVAL=$? #if [ $RETVAL != 0 ] #then # echo sig_tone_tests failed! # exit $RETVAL #fi #echo sig_tone_tests completed OK echo sig_tone_tests not enabled #./super_tone_rx_tests >$STDOUT_DEST 2>$STDERR_DEST #RETVAL=$? #if [ $RETVAL != 0 ] #then # echo super_tone_rx_tests failed! # exit $RETVAL #fi #echo super_tone_rx_tests completed OK echo super_tone_rx_tests not enabled #./super_tone_tx_tests >$STDOUT_DEST 2>$STDERR_DEST #RETVAL=$? #if [ $RETVAL != 0 ] #then # echo super_tone_tx_tests failed! # exit $RETVAL #fi #echo super_tone_tx_tests completed OK echo super_tone_tx_tests not enabled ./t31_tests -r >$STDOUT_DEST 2>$STDERR_DEST RETVAL=$? if [ $RETVAL != 0 ] then echo t31_tests -r failed! exit $RETVAL fi ./t31_tests -s >$STDOUT_DEST 2>$STDERR_DEST RETVAL=$? if [ $RETVAL != 0 ] then echo t31_tests -s failed! exit $RETVAL fi echo t31_tests completed OK ./t38_core_tests >$STDOUT_DEST 2>$STDERR_DEST RETVAL=$? if [ $RETVAL != 0 ] then echo t38_core_tests failed! exit $RETVAL fi echo t38_core_tests completed OK rm -f t38.tif ./t38_gateway_tests >$STDOUT_DEST 2>$STDERR_DEST RETVAL=$? if [ $RETVAL != 0 ] then echo t38_gateway_tests failed! exit $RETVAL fi # Now use tiffcmp to check the results. It will return non-zero if any page images differ. The -t # option means the normal differences in tags will be ignored. tiffcmp -t ${ITUTESTS_TIF} t38.tif >/dev/null RETVAL=$? if [ $RETVAL != 0 ] then echo t38_gateway_tests failed! exit $RETVAL fi rm -f t38.tif ./t38_gateway_tests -e >$STDOUT_DEST 2>$STDERR_DEST RETVAL=$? if [ $RETVAL != 0 ] then echo t38_gateway_tests -e failed! exit $RETVAL fi # Now use tiffcmp to check the results. It will return non-zero if any page images differ. The -t # option means the normal differences in tags will be ignored. tiffcmp -t ${ITUTESTS_TIF} t38.tif >/dev/null RETVAL=$? if [ $RETVAL != 0 ] then echo t38_gateway_tests -e failed! exit $RETVAL fi echo t38_gateway_tests completed OK rm -f t38.tif ./t38_gateway_to_terminal_tests >$STDOUT_DEST 2>$STDERR_DEST RETVAL=$? if [ $RETVAL != 0 ] then echo t38_gateway_to_terminal_tests failed! exit $RETVAL fi # Now use tiffcmp to check the results. It will return non-zero if any page images differ. The -t # option means the normal differences in tags will be ignored. tiffcmp -t ${ITUTESTS_TIF} t38.tif >/dev/null RETVAL=$? if [ $RETVAL != 0 ] then echo t38_gateway_to_terminal_tests failed! exit $RETVAL fi rm -f t38.tif ./t38_gateway_to_terminal_tests -e >$STDOUT_DEST 2>$STDERR_DEST RETVAL=$? if [ $RETVAL != 0 ] then echo t38_gateway_to_terminal_tests -e failed! exit $RETVAL fi # Now use tiffcmp to check the results. It will return non-zero if any page images differ. The -t # option means the normal differences in tags will be ignored. tiffcmp -t ${ITUTESTS_TIF} t38.tif >/dev/null RETVAL=$? if [ $RETVAL != 0 ] then echo t38_gateway_to_terminal_tests -e failed! exit $RETVAL fi echo t38_gateway_to_terminal_tests completed OK rm -f t38.tif ./t38_terminal_to_gateway_tests >$STDOUT_DEST 2>$STDERR_DEST RETVAL=$? if [ $RETVAL != 0 ] then echo t38_terminal_to_gateway_tests failed! exit $RETVAL fi # Now use tiffcmp to check the results. It will return non-zero if any page images differ. The -t # option means the normal differences in tags will be ignored. tiffcmp -t ${ITUTESTS_TIF} t38.tif >/dev/null RETVAL=$? if [ $RETVAL != 0 ] then echo t38_terminal_to_gateway_tests failed! exit $RETVAL fi rm -f t38.tif ./t38_terminal_to_gateway_tests -e >$STDOUT_DEST 2>$STDERR_DEST RETVAL=$? if [ $RETVAL != 0 ] then echo t38_terminal_to_gateway_tests -e failed! exit $RETVAL fi # Now use tiffcmp to check the results. It will return non-zero if any page images differ. The -t # option means the normal differences in tags will be ignored. tiffcmp -t ${ITUTESTS_TIF} t38.tif >/dev/null RETVAL=$? if [ $RETVAL != 0 ] then echo t38_terminal_to_gateway_tests -e failed! exit $RETVAL fi echo t38_terminal_to_gateway_tests completed OK rm -f t38.tif ./t38_terminal_tests >$STDOUT_DEST 2>$STDERR_DEST RETVAL=$? if [ $RETVAL != 0 ] then echo t38_terminal_tests failed! exit $RETVAL fi # Now use tiffcmp to check the results. It will return non-zero if any page images differ. The -t # option means the normal differences in tags will be ignored. tiffcmp -t ${ITUTESTS_TIF} t38.tif >/dev/null RETVAL=$? if [ $RETVAL != 0 ] then echo t38_terminal_tests failed! exit $RETVAL fi rm -f t38.tif ./t38_terminal_tests -e >$STDOUT_DEST 2>$STDERR_DEST RETVAL=$? if [ $RETVAL != 0 ] then echo t38_terminal_tests -e failed! exit $RETVAL fi # Now use tiffcmp to check the results. It will return non-zero if any page images differ. The -t # option means the normal differences in tags will be ignored. tiffcmp -t ${ITUTESTS_TIF} t38.tif >/dev/null RETVAL=$? if [ $RETVAL != 0 ] then echo t38_terminal_tests -e failed! exit $RETVAL fi echo t38_terminal_tests completed OK rm -f t4_tests_receive.tif ./t4_tests >$STDOUT_DEST 2>$STDERR_DEST RETVAL=$? if [ $RETVAL != 0 ] then echo t4_tests failed! exit $RETVAL fi echo t4_tests completed OK #./time_scale_tests >$STDOUT_DEST 2>$STDERR_DEST #RETVAL=$? #if [ $RETVAL != 0 ] #then # echo time_scale_tests failed! # exit $RETVAL #fi #echo time_scale_tests completed OK echo time_scale_tests not enabled #./tone_detect_tests >$STDOUT_DEST 2>$STDERR_DEST #RETVAL=$? #if [ $RETVAL != 0 ] #then # echo tone_detect_tests failed! # exit $RETVAL #fi #echo tone_detect_tests completed OK echo tone_detect_tests not enabled #./tone_generate_tests >$STDOUT_DEST 2>$STDERR_DEST #RETVAL=$? #if [ $RETVAL != 0 ] #then # echo tone_generate_tests failed! # exit $RETVAL #fi #echo tone_generate_tests completed OK echo tone_generate_tests not enabled ./v17_tests -s -42 14400 >$STDOUT_DEST 2>$STDERR_DEST RETVAL=$? if [ $RETVAL != 0 ] then echo v17_tests failed! exit $RETVAL fi ./v17_tests -s -42 12000 >$STDOUT_DEST 2>$STDERR_DEST RETVAL=$? if [ $RETVAL != 0 ] then echo v17_tests failed! exit $RETVAL fi ./v17_tests -s -42 9600 >$STDOUT_DEST 2>$STDERR_DEST RETVAL=$? if [ $RETVAL != 0 ] then echo v17_tests failed! exit $RETVAL fi ./v17_tests -s -42 7200 >$STDOUT_DEST 2>$STDERR_DEST RETVAL=$? if [ $RETVAL != 0 ] then echo v17_tests failed! exit $RETVAL fi echo v17_tests completed OK #./v22bis_tests >$STDOUT_DEST 2>$STDERR_DEST #RETVAL=$? #if [ $RETVAL != 0 ] #then # echo v22bis_tests failed! # exit $RETVAL #fi #echo v22bis_tests completed OK echo v22bis_tests not enabled ./v27ter_tests -s -42 2400 >$STDOUT_DEST 2>$STDERR_DEST RETVAL=$? if [ $RETVAL != 0 ] then echo v27ter_tests failed! exit $RETVAL fi ./v27ter_tests -s -42 4800 >$STDOUT_DEST 2>$STDERR_DEST RETVAL=$? if [ $RETVAL != 0 ] then echo v27ter_tests failed! exit $RETVAL fi echo v27ter_tests completed OK ./v29_tests -s -42 4800 >$STDOUT_DEST 2>$STDERR_DEST RETVAL=$? if [ $RETVAL != 0 ] then echo v29_tests failed! exit $RETVAL fi ./v29_tests -s -42 7200 >$STDOUT_DEST 2>$STDERR_DEST RETVAL=$? if [ $RETVAL != 0 ] then echo v29_tests failed! exit $RETVAL fi ./v29_tests -s -42 9600 >$STDOUT_DEST 2>$STDERR_DEST RETVAL=$? if [ $RETVAL != 0 ] then echo v29_tests failed! exit $RETVAL fi echo v29_tests completed OK #./v42_tests >$STDOUT_DEST 2>$STDERR_DEST #RETVAL=$? #if [ $RETVAL != 0 ] #then # echo v42_tests failed! # exit $RETVAL #fi #echo v42_tests completed OK echo v42_tests not enabled ./v42bis_tests.sh >/dev/null RETVAL=$? if [ $RETVAL != 0 ] then echo v42bis_tests failed! exit $RETVAL fi echo v42bis_tests completed OK ./v8_tests >$STDOUT_DEST 2>$STDERR_DEST RETVAL=$? if [ $RETVAL != 0 ] then echo v8_tests failed! exit $RETVAL fi echo v8_tests completed OK ./vector_float_tests >$STDOUT_DEST 2>$STDERR_DEST RETVAL=$? if [ $RETVAL != 0 ] then echo vector_float_tests failed! exit $RETVAL fi echo vector_float_tests completed OK ./vector_int_tests >$STDOUT_DEST 2>$STDERR_DEST RETVAL=$? if [ $RETVAL != 0 ] then echo vector_int_tests failed! exit $RETVAL fi echo vector_int_tests completed OK echo echo All regression tests successfully completed iaxmodem-1.2.0/lib/spandsp/tests/make_g168_css.c0000644000175000017500000002726011150047203020731 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * makecss.c - Create the composite source signal (CSS) for G.168 testing. * * Written by Steve Underwood * * Copyright (C) 2003 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2, as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: make_g168_css.c,v 1.14 2008/05/13 13:17:26 steveu Exp $ */ /*! \page makecss_page CSS construction for G.168 testing \section makecss_page_sec_1 What does it do? ???. \section makecss_page_sec_2 How does it work? ???. */ #if defined(HAVE_CONFIG_H) #include "config.h" #endif #include #include #include #include #include #include #include #if defined(HAVE_FFTW3_H) #include #else #include #endif #if defined(HAVE_MATH_H) #define GEN_CONST #endif #include "spandsp.h" #include "spandsp/g168models.h" #if !defined(NULL) #define NULL (void *) 0 #endif #define FAST_SAMPLE_RATE 44100.0 static double scaling(double f, double start, double end, double start_gain, double end_gain) { double scale; scale = start_gain + (f - start)*(end_gain - start_gain)/(end - start); return scale; } int main(int argc, char *argv[]) { #if defined(HAVE_FFTW3_H) double in[8192][2]; double out[8192][2]; #else fftw_complex in[8192]; fftw_complex out[8192]; #endif fftw_plan p; int16_t voiced_sound[8192]; int16_t noise_sound[8192]; int16_t silence_sound[8192]; int i; int j; int outframes; int voiced_length; float f; double peak; double ms; double scale; AFfilehandle filehandle; AFfilesetup filesetup; awgn_state_t noise_source; filesetup = afNewFileSetup(); if (filesetup == AF_NULL_FILESETUP) { fprintf(stderr, " Failed to create file setup\n"); exit(2); } afInitSampleFormat(filesetup, AF_DEFAULT_TRACK, AF_SAMPFMT_TWOSCOMP, 16); afInitRate(filesetup, AF_DEFAULT_TRACK, FAST_SAMPLE_RATE); afInitFileFormat(filesetup, AF_FILE_WAVE); afInitChannels(filesetup, AF_DEFAULT_TRACK, 1); filehandle = afOpenFile("sound_c1.wav", "w", filesetup); if (filehandle == AF_NULL_FILEHANDLE) { fprintf(stderr, " Failed to open result file\n"); exit(2); } for (i = 0; i < (int)(sizeof(css_c1)/sizeof(css_c1[0])); i++) voiced_sound[i] = css_c1[i]; voiced_length = i; ms = 0; peak = 0; for (i = 0; i < voiced_length; i++) { if (abs(voiced_sound[i]) > peak) peak = abs(voiced_sound[i]); ms += voiced_sound[i]*voiced_sound[i]; } ms = 20.0*log10(sqrt(ms/voiced_length)/32767.0) + DBM0_MAX_POWER; printf("Voiced level = %.2fdB\n", ms); #if defined(HAVE_FFTW3_H) p = fftw_plan_dft_1d(8192, in, out, FFTW_BACKWARD, FFTW_ESTIMATE); #else p = fftw_create_plan(8192, FFTW_BACKWARD, FFTW_ESTIMATE); #endif for (i = 0; i < 8192; i++) { #if defined(HAVE_FFTW3_H) in[i][0] = 0.0; in[i][1] = 0.0; #else in[i].re = 0.0; in[i].im = 0.0; #endif } for (i = 1; i <= 3715; i++) { f = FAST_SAMPLE_RATE*i/8192.0; #if 1 if (f < 50.0) scale = -60.0; else if (f < 100.0) scale = scaling(f, 50.0, 100.0, -25.8, -12.8); else if (f < 200.0) scale = scaling(f, 100.0, 200.0, -12.8, 17.4); else if (f < 215.0) scale = scaling(f, 200.0, 215.0, 17.4, 17.8); else if (f < 500.0) scale = scaling(f, 215.0, 500.0, 17.8, 12.2); else if (f < 1000.0) scale = scaling(f, 500.0, 1000.0, 12.2, 7.2); else if (f < 2850.0) scale = scaling(f, 1000.0, 2850.0, 7.2, 0.0); else if (f < 3600.0) scale = scaling(f, 2850.0, 3600.0, 0.0, -2.0); else if (f < 3660.0) scale = scaling(f, 3600.0, 3660.0, -2.0, -20.0); else if (f < 3680.0) scale = scaling(f, 3600.0, 3680.0, -20.0, -30.0); else scale = -60.0; #else scale = 0.0; #endif #if defined(HAVE_FFTW3_H) in[i][0] = 0.0; in[i][1] = (rand() & 0x1) ? 1.0 : -1.0; in[i][1] *= pow(10.0, scale/20.0); in[i][1] *= 35.0; //305360 //printf("%10d %15.5f %15.5f\n", i, in[i].re, in[i].im); in[8192 - i][0] = 0.0; in[8192 - i][1] = -in[i][1]; //printf("%10d %15.5f %15.5f\n", i, in[i][0], in[i][1]); #else in[i].re = 0.0; in[i].im = (rand() & 0x1) ? 1.0 : -1.0; in[i].im *= pow(10.0, scale/20.0); in[i].im *= 35.0; //305360 in[8192 - i].re = 0.0; in[8192 - i].im = -in[i].im; //printf("%10d %15.5f %15.5f\n", i, in[i].re, in[i].im); #endif } #if defined(HAVE_FFTW3_H) fftw_execute(p); #else fftw_one(p, in, out); #endif for (i = 0; i < 8192; i++) { //printf("%10d %15.5f %15.5f\n", i, out[i].re, out[i].im); #if defined(HAVE_FFTW3_H) noise_sound[i] = out[i][0]; #else noise_sound[i] = out[i].re; #endif } peak = 0; ms = 0; for (i = 0; i < 8192; i++) { if (abs(noise_sound[i]) > peak) peak = abs(noise_sound[i]); ms += noise_sound[i]*noise_sound[i]; } printf("Noise level = %.2fdB\n", 20.0*log10(sqrt(ms/8192.0)/32767.0) + DBM0_MAX_POWER); printf("Crest factor = %.2fdB\n", 20.0*log10(peak/sqrt(ms/8192.0))); for (i = 0; i < 8192; i++) silence_sound[i] = 0.0; for (j = 0; j < 16; j++) { outframes = afWriteFrames(filehandle, AF_DEFAULT_TRACK, voiced_sound, voiced_length); } printf("%d samples of voice\n", 16*voiced_length); outframes = afWriteFrames(filehandle, AF_DEFAULT_TRACK, noise_sound, 8192); outframes = afWriteFrames(filehandle, AF_DEFAULT_TRACK, noise_sound, 8820 - 8192); printf("%d samples of noise\n", 8820); outframes = afWriteFrames(filehandle, AF_DEFAULT_TRACK, silence_sound, 4471); printf("%d samples of silence\n", 4471); for (j = 0; j < voiced_length; j++) voiced_sound[j] = -voiced_sound[j]; for (j = 0; j < 8192; j++) noise_sound[j] = -noise_sound[j]; for (j = 0; j < 16; j++) { outframes = afWriteFrames(filehandle, AF_DEFAULT_TRACK, voiced_sound, voiced_length); } printf("%d samples of voice\n", 16*voiced_length); outframes = afWriteFrames(filehandle, AF_DEFAULT_TRACK, noise_sound, 8192); outframes = afWriteFrames(filehandle, AF_DEFAULT_TRACK, noise_sound, 8820 - 8192); printf("%d samples of noise\n", 8820); outframes = afWriteFrames(filehandle, AF_DEFAULT_TRACK, silence_sound, 4471); printf("%d samples of silence\n", 4471); if (afCloseFile(filehandle) != 0) { fprintf(stderr, " Cannot close speech file '%s'\n", "sound_c1.wav"); exit(2); } afInitSampleFormat(filesetup, AF_DEFAULT_TRACK, AF_SAMPFMT_TWOSCOMP, 16); afInitRate(filesetup, AF_DEFAULT_TRACK, FAST_SAMPLE_RATE); afInitFileFormat(filesetup, AF_FILE_WAVE); afInitChannels(filesetup, AF_DEFAULT_TRACK, 1); filehandle = afOpenFile("sound_c3.wav", "w", filesetup); if (filehandle == AF_NULL_FILEHANDLE) { fprintf(stderr, " Failed to open result file\n"); exit(2); } for (i = 0; i < (int) (sizeof(css_c3)/sizeof(css_c3[0])); i++) voiced_sound[i] = css_c3[i]; voiced_length = i; ms = 0; for (i = 0; i < voiced_length; i++) { if (abs(voiced_sound[i]) > peak) peak = abs(voiced_sound[i]); ms += voiced_sound[i]*voiced_sound[i]; } ms = 20.0*log10(sqrt(ms/voiced_length)/32767.0) + DBM0_MAX_POWER; printf("Voiced level = %.2fdB\n", ms); awgn_init_dbm0(&noise_source, 7162534, ms); for (i = 0; i < 8192; i++) noise_sound[i] = awgn(&noise_source); peak = 0; ms = 0; for (i = 0; i < 8192; i++) { if (abs(noise_sound[i]) > peak) peak = abs(noise_sound[i]); ms += noise_sound[i]*noise_sound[i]; } printf("Noise level = %.2fdB\n", 20.0*log10(sqrt(ms/8192.0)/32767.0) + DBM0_MAX_POWER); printf("Crest factor = %.2fdB\n", 20.0*log10(peak/sqrt(ms/8192.0))); for (j = 0; j < 14; j++) { outframes = afWriteFrames(filehandle, AF_DEFAULT_TRACK, voiced_sound, voiced_length); } printf("%d samples of voice\n", 14*i); outframes = afWriteFrames(filehandle, AF_DEFAULT_TRACK, noise_sound, 8192); outframes = afWriteFrames(filehandle, AF_DEFAULT_TRACK, noise_sound, 8820 - 8192); printf("%d samples of noise\n", 8820); outframes = afWriteFrames(filehandle, AF_DEFAULT_TRACK, silence_sound, 5614); printf("%d samples of silence\n", 5614); for (j = 0; j < voiced_length; j++) voiced_sound[j] = -voiced_sound[j]; for (j = 0; j < 8192; j++) noise_sound[j] = -noise_sound[j]; for (j = 0; j < 14; j++) { outframes = afWriteFrames(filehandle, AF_DEFAULT_TRACK, voiced_sound, voiced_length); } printf("%d samples of voice\n", 14*i); outframes = afWriteFrames(filehandle, AF_DEFAULT_TRACK, noise_sound, 8192); outframes = afWriteFrames(filehandle, AF_DEFAULT_TRACK, noise_sound, 8820 - 8192); printf("%d samples of noise\n", 8820); outframes = afWriteFrames(filehandle, AF_DEFAULT_TRACK, silence_sound, 5614); printf("%d samples of silence\n", 5614); if (afCloseFile(filehandle) != 0) { fprintf(stderr, " Cannot close speech file '%s'\n", "sound_c3.wav"); exit(2); } afFreeFileSetup(filesetup); fftw_destroy_plan(p); return 0; } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/tests/t38_core_tests.c0000644000175000017500000002135511150047203021246 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * t38_core_tests.c - Tests for the T.38 FoIP core module. * * Written by Steve Underwood * * Copyright (C) 2007 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2, as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: t38_core_tests.c,v 1.13 2008/05/13 13:17:26 steveu Exp $ */ /*! \file */ /*! \page t38_core_tests_page T.38 core tests \section t38_core_tests_page_sec_1 What does it do? These tests exercise the T.38 core ASN.1 processing code. */ #if defined(HAVE_CONFIG_H) #include #endif #include #include #include #include #include #include #include #include #include #if !defined(__USE_MISC) #define __USE_MISC #endif #include #include #include #include #include "spandsp.h" #define MAX_FIELDS 42 #define MAX_FIELD_LEN 8192 int t38_version; int succeeded = TRUE; int ok_indicator_packets; int bad_indicator_packets; int ok_data_packets; int bad_data_packets; int missing_packets; int current_indicator; int current_data_type; int current_field_type; int skip; uint8_t field_body[MAX_FIELDS][MAX_FIELD_LEN]; int field_len[MAX_FIELDS]; static int rx_missing_handler(t38_core_state_t *s, void *user_data, int rx_seq_no, int expected_seq_no) { missing_packets++; //printf("Hit missing\n"); return 0; } /*- End of function --------------------------------------------------------*/ static int rx_indicator_handler(t38_core_state_t *s, void *user_data, int indicator) { if (indicator == current_indicator) ok_indicator_packets++; else bad_indicator_packets++; //printf("Hit indicator %d\n", indicator); return 0; } /*- End of function --------------------------------------------------------*/ static int rx_data_handler(t38_core_state_t *s, void *user_data, int data_type, int field_type, const uint8_t *buf, int len) { if (--skip >= 0) { if (data_type == current_data_type && field_type == current_field_type) ok_data_packets++; else bad_data_packets++; } else { if (data_type == current_data_type && field_type == T38_FIELD_T4_NON_ECM_SIG_END) ok_data_packets++; else bad_data_packets++; } //printf("Hit data %d, field %d\n", data_type, field_type); return 0; } /*- End of function --------------------------------------------------------*/ static int tx_packet_handler(t38_core_state_t *s, void *user_data, const uint8_t *buf, int len, int count) { t38_core_state_t *t; static int seq_no = 0; t = (t38_core_state_t *) user_data; span_log(&s->logging, SPAN_LOG_FLOW, "Send seq %d, len %d, count %d\n", s->tx_seq_no, len, count); if (t38_core_rx_ifp_packet(t, buf, len, seq_no) < 0) succeeded = FALSE; seq_no++; return 0; } /*- End of function --------------------------------------------------------*/ static int encode_decode_tests(t38_core_state_t *a, t38_core_state_t *b) { t38_data_field_t field[MAX_FIELDS]; int i; int j; ok_indicator_packets = 0; bad_indicator_packets = 0; ok_data_packets = 0; bad_data_packets = 0; missing_packets = 0; /* Try all the indicator types */ for (i = 0; i < 100; i++) { current_indicator = i; if (t38_core_send_indicator(a, i, 3) < 0) break; } /* Try all the data types, as single field messages with no data */ for (i = 0; i < 100; i++) { for (j = 0; j < 100; j++) { current_data_type = i; current_field_type = j; skip = 99; if (t38_core_send_data(a, i, j, (uint8_t *) "", 0, 1) < 0) break; } if (j == 0) break; } /* Try all the data types and field types, as single field messages with data */ for (i = 0; i < 100; i++) { for (j = 0; j < 100; j++) { current_data_type = i; current_field_type = j; skip = 99; if (t38_core_send_data(a, i, j, (uint8_t *) "ABCD", 4, 1) < 0) break; } if (j == 0) break; } /* Try all the data types and field types, as multi-field messages */ for (i = 0; i < 100; i++) { for (j = 0; j < 100; j++) { current_data_type = i; current_field_type = j; skip = 1; field_len[0] = 444; field_len[1] = 333; field[0].field_type = j; field[0].field = field_body[0]; field[0].field_len = field_len[0]; field[1].field_type = T38_FIELD_T4_NON_ECM_SIG_END; field[1].field = field_body[1]; field[1].field_len = field_len[1]; if (t38_core_send_data_multi_field(a, i, field, 2, 1) < 0) break; } if (j == 0) break; } printf("Indicator packets: OK = %d, bad = %d\n", ok_indicator_packets, bad_indicator_packets); printf("Data packets: OK = %d, bad = %d\n", ok_data_packets, bad_data_packets); printf("Missing packets = %d\n", missing_packets); if (t38_version == 0) { if (ok_indicator_packets != 16 || bad_indicator_packets != 0) { printf("Tests failed\n"); return -1; } if (ok_data_packets != 288 || bad_data_packets != 0) { printf("Tests failed\n"); return -1; } } else { if (ok_indicator_packets != 23 || bad_indicator_packets != 0) { printf("Tests failed\n"); return -1; } if (ok_data_packets != 720 || bad_data_packets != 0) { printf("Tests failed\n"); return -1; } } if (missing_packets > 0) { printf("Tests failed\n"); return -1; } return 0; } /*- End of function --------------------------------------------------------*/ static int attack_tests(t38_core_state_t *s) { return 0; } /*- End of function --------------------------------------------------------*/ int main(int argc, char *argv[]) { t38_core_state_t t38_core_a; t38_core_state_t t38_core_b; for (t38_version = 0; t38_version < 2; t38_version++) { printf("Using T.38 version %d\n", t38_version); if (t38_core_init(&t38_core_a, rx_indicator_handler, rx_data_handler, rx_missing_handler, &t38_core_b, tx_packet_handler, &t38_core_b) == NULL) { fprintf(stderr, "Cannot start the T.38 core\n"); exit(2); } if (t38_core_init(&t38_core_b, rx_indicator_handler, rx_data_handler, rx_missing_handler, &t38_core_a, tx_packet_handler, &t38_core_a) == NULL) { fprintf(stderr, "Cannot start the T.38 core\n"); exit(2); } t38_set_t38_version(&t38_core_a, t38_version); t38_set_t38_version(&t38_core_b, t38_version); span_log_set_level(&t38_core_a.logging, SPAN_LOG_DEBUG | SPAN_LOG_SHOW_TAG); span_log_set_tag(&t38_core_a.logging, "T.38-A"); span_log_set_level(&t38_core_b.logging, SPAN_LOG_DEBUG | SPAN_LOG_SHOW_TAG); span_log_set_tag(&t38_core_b.logging, "T.38-B"); if (encode_decode_tests(&t38_core_a, &t38_core_b)) { printf("Encode/decode tests failed\n"); exit(2); } if (attack_tests(&t38_core_a)) { printf("Attack tests failed\n"); exit(2); } } if (!succeeded) { printf("Tests failed\n"); exit(2); } printf("Tests passed\n"); return 0; } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/tests/v27ter_tests.c0000644000175000017500000004470511150047203020755 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * v27ter_tests.c * * Written by Steve Underwood * * Copyright (C) 2003 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2, as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: v27ter_tests.c,v 1.88 2008/07/16 17:01:49 steveu Exp $ */ /*! \page v27ter_tests_page V.27ter modem tests \section v27ter_tests_page_sec_1 What does it do? These tests test one way paths, as V.27ter is a half-duplex modem. They allow either: - A V.27ter transmit modem to feed a V.27ter receive modem through a telephone line model. BER testing is then used to evaluate performance under various line conditions. This is effective for testing the basic performance of the receive modem. It is also the only test mode provided for evaluating the transmit modem. - A V.27ter receive modem is used to decode V.27ter audio, stored in a wave file. This is good way to evaluate performance with audio recorded from other models of modem, and with real world problematic telephone lines. If the appropriate GUI environment exists, the tests are built such that a visual display of modem status is maintained. \section v27ter_tests_page_sec_2 How is it used? */ #if defined(HAVE_CONFIG_H) #include "config.h" #endif #if defined(HAVE_FL_FL_H) && defined(HAVE_FL_FL_CARTESIAN_H) && defined(HAVE_FL_FL_AUDIO_METER_H) #define ENABLE_GUI #endif #include #include #include #include #include #include #include "spandsp.h" #include "spandsp-sim.h" #if defined(ENABLE_GUI) #include "modem_monitor.h" #include "line_model_monitor.h" #endif #define BLOCK_LEN 160 #define OUT_FILE_NAME "v27ter.wav" char *decode_test_file = NULL; int use_gui = FALSE; int symbol_no = 0; int rx_bits = 0; bert_state_t bert; one_way_line_model_state_t *line_model; #if defined(ENABLE_GUI) qam_monitor_t *qam_monitor; #endif bert_results_t latest_results; static void reporter(void *user_data, int reason, bert_results_t *results) { switch (reason) { case BERT_REPORT_SYNCED: printf("BERT report synced\n"); break; case BERT_REPORT_UNSYNCED: printf("BERT report unsync'ed\n"); break; case BERT_REPORT_REGULAR: printf("BERT report regular - %d bits, %d bad bits, %d resyncs\n", results->total_bits, results->bad_bits, results->resyncs); memcpy(&latest_results, results, sizeof(latest_results)); break; case BERT_REPORT_GT_10_2: printf("BERT report > 1 in 10^2\n"); break; case BERT_REPORT_LT_10_2: printf("BERT report < 1 in 10^2\n"); break; case BERT_REPORT_LT_10_3: printf("BERT report < 1 in 10^3\n"); break; case BERT_REPORT_LT_10_4: printf("BERT report < 1 in 10^4\n"); break; case BERT_REPORT_LT_10_5: printf("BERT report < 1 in 10^5\n"); break; case BERT_REPORT_LT_10_6: printf("BERT report < 1 in 10^6\n"); break; case BERT_REPORT_LT_10_7: printf("BERT report < 1 in 10^7\n"); break; default: printf("BERT report reason %d\n", reason); break; } } /*- End of function --------------------------------------------------------*/ static int v27ter_rx_status(void *user_data, int status) { printf("V.27ter rx status is %d\n", status); switch (status) { case PUTBIT_TRAINING_FAILED: printf("Training failed\n"); break; case PUTBIT_TRAINING_IN_PROGRESS: printf("Training in progress\n"); break; case PUTBIT_TRAINING_SUCCEEDED: printf("Training succeeded\n"); break; case PUTBIT_CARRIER_UP: printf("Carrier up\n"); break; case PUTBIT_CARRIER_DOWN: printf("Carrier down\n"); break; default: printf("Eh! - %d\n", status); break; } return 0; } /*- End of function --------------------------------------------------------*/ static void v27terputbit(void *user_data, int bit) { if (bit < 0) { v27ter_rx_status(user_data, bit); return; } if (decode_test_file) printf("Rx bit %d - %d\n", rx_bits++, bit); else bert_put_bit(&bert, bit); } /*- End of function --------------------------------------------------------*/ static int v27ter_tx_status(void *user_data, int status) { switch (status) { case MODEM_TX_STATUS_DATA_EXHAUSTED: printf("V.27ter tx data exhausted\n"); break; case MODEM_TX_STATUS_SHUTDOWN_COMPLETE: printf("V.27ter tx shutdown complete\n"); break; default: printf("V.27ter tx status is %d\n", status); break; } return 0; } /*- End of function --------------------------------------------------------*/ static int v27tergetbit(void *user_data) { return bert_get_bit(&bert); } /*- End of function --------------------------------------------------------*/ static void qam_report(void *user_data, const complexf_t *constel, const complexf_t *target, int symbol) { int i; int len; complexf_t *coeffs; float fpower; float error; v27ter_rx_state_t *rx; static float smooth_power = 0.0f; #if defined(ENABLE_GUI) static int reports = 0; #endif rx = (v27ter_rx_state_t *) user_data; if (constel) { fpower = (constel->re - target->re)*(constel->re - target->re) + (constel->im - target->im)*(constel->im - target->im); smooth_power = 0.95f*smooth_power + 0.05f*fpower; #if defined(ENABLE_GUI) if (use_gui) { qam_monitor_update_constel(qam_monitor, constel); qam_monitor_update_carrier_tracking(qam_monitor, v27ter_rx_carrier_frequency(rx)); qam_monitor_update_symbol_tracking(qam_monitor, v27ter_rx_symbol_timing_correction(rx)); } #endif error = constel->im*target->re - constel->re*target->im; printf("Tracking error %f %f %f %f %f %f\n", error, v27ter_rx_carrier_frequency(rx), constel->re, constel->im, target->re, target->im); printf("%8d [%8.4f, %8.4f] [%8.4f, %8.4f] %2x %8.4f %8.4f %9.4f %7.3f %7.2f\n", symbol_no, constel->re, constel->im, target->re, target->im, symbol, fpower, smooth_power, v27ter_rx_carrier_frequency(rx), v27ter_rx_signal_power(rx), v27ter_rx_symbol_timing_correction(rx)); len = v27ter_rx_equalizer_state(rx, &coeffs); printf("Equalizer B:\n"); for (i = 0; i < len; i++) printf("%3d (%15.5f, %15.5f) -> %15.5f\n", i, coeffs[i].re, coeffs[i].im, powerf(&coeffs[i])); printf("Gardtest %d %f %d\n", symbol_no, v27ter_rx_symbol_timing_correction(rx), rx->gardner_integrate); printf("Carcar %d %f\n", symbol_no, v27ter_rx_carrier_frequency(rx)); #if defined(ENABLE_GUI) if (use_gui) { if (++reports >= 1000) { qam_monitor_update_equalizer(qam_monitor, coeffs, len); reports = 0; } } #endif symbol_no++; } else { printf("Gardner step %d\n", symbol); len = v27ter_rx_equalizer_state(rx, &coeffs); printf("Equalizer A:\n"); for (i = 0; i < len; i++) printf("%3d (%15.5f, %15.5f) -> %15.5f\n", i, coeffs[i].re, coeffs[i].im, powerf(&coeffs[i])); #if defined(ENABLE_GUI) if (use_gui) qam_monitor_update_equalizer(qam_monitor, coeffs, len); #endif } } /*- End of function --------------------------------------------------------*/ int main(int argc, char *argv[]) { v27ter_rx_state_t rx; v27ter_tx_state_t tx; bert_results_t bert_results; int16_t gen_amp[BLOCK_LEN]; int16_t amp[BLOCK_LEN]; AFfilehandle inhandle; AFfilehandle outhandle; AFfilesetup filesetup; int outframes; int samples; int tep; int test_bps; int noise_level; int signal_level; int bits_per_test; int line_model_no; int block; int log_audio; int channel_codec; int rbs_pattern; float x; int opt; channel_codec = MUNGE_CODEC_NONE; rbs_pattern = 0; test_bps = 4800; tep = FALSE; line_model_no = 0; decode_test_file = NULL; use_gui = FALSE; noise_level = -70; signal_level = -13; bits_per_test = 50000; log_audio = FALSE; while ((opt = getopt(argc, argv, "b:c:d:glm:n:r:s:t")) != -1) { switch (opt) { case 'b': bits_per_test = atoi(optarg); break; case 'c': channel_codec = atoi(optarg); break; case 'd': decode_test_file = optarg; break; case 'g': #if defined(ENABLE_GUI) use_gui = TRUE; #else fprintf(stderr, "Graphical monitoring not available\n"); exit(2); #endif break; case 'l': log_audio = TRUE; break; case 'm': line_model_no = atoi(optarg); break; case 'n': noise_level = atoi(optarg); break; case 'r': rbs_pattern = atoi(optarg); break; case 's': signal_level = atoi(optarg); break; case 't': tep = TRUE; break; default: //usage(); exit(2); break; } } argc -= optind; argv += optind; if (argc > 0) { if (strcmp(argv[0], "4800") == 0) test_bps = 4800; else if (strcmp(argv[0], "2400") == 0) test_bps = 2400; else { fprintf(stderr, "Invalid bit rate\n"); exit(2); } } inhandle = NULL; outhandle = NULL; filesetup = AF_NULL_FILESETUP; if (log_audio) { if ((filesetup = afNewFileSetup()) == AF_NULL_FILESETUP) { fprintf(stderr, " Failed to create file setup\n"); exit(2); } afInitSampleFormat(filesetup, AF_DEFAULT_TRACK, AF_SAMPFMT_TWOSCOMP, 16); afInitRate(filesetup, AF_DEFAULT_TRACK, (float) SAMPLE_RATE); afInitFileFormat(filesetup, AF_FILE_WAVE); afInitChannels(filesetup, AF_DEFAULT_TRACK, 1); if ((outhandle = afOpenFile(OUT_FILE_NAME, "w", filesetup)) == AF_NULL_FILEHANDLE) { fprintf(stderr, " Cannot create wave file '%s'\n", OUT_FILE_NAME); exit(2); } } if (decode_test_file) { /* We will decode the audio from a wave file. */ if ((inhandle = afOpenFile(decode_test_file, "r", NULL)) == AF_NULL_FILEHANDLE) { fprintf(stderr, " Cannot open wave file '%s'\n", decode_test_file); exit(2); } if ((x = afGetFrameSize(inhandle, AF_DEFAULT_TRACK, 1)) != 2.0f) { printf(" Unexpected frame size in speech file '%s' (%f)\n", decode_test_file, x); exit(2); } if ((x = afGetRate(inhandle, AF_DEFAULT_TRACK)) != (float) SAMPLE_RATE) { printf(" Unexpected sample rate in speech file '%s' (%f)\n", decode_test_file, x); exit(2); } if ((x = afGetChannels(inhandle, AF_DEFAULT_TRACK)) != 1.0f) { printf(" Unexpected number of channels in speech file '%s' (%f)\n", decode_test_file, x); exit(2); } } else { /* We will generate V.27ter audio, and add some noise to it. */ v27ter_tx_init(&tx, test_bps, tep, v27tergetbit, NULL); v27ter_tx_power(&tx, signal_level); v27ter_tx_set_modem_status_handler(&tx, v27ter_tx_status, (void *) &tx); /* Move the carrier off a bit */ tx.carrier_phase_rate = dds_phase_ratef(1810.0f); bert_init(&bert, bits_per_test, BERT_PATTERN_ITU_O152_11, test_bps, 20); bert_set_report(&bert, 10000, reporter, NULL); if ((line_model = one_way_line_model_init(line_model_no, (float) noise_level, channel_codec, rbs_pattern)) == NULL) { fprintf(stderr, " Failed to create line model\n"); exit(2); } } v27ter_rx_init(&rx, test_bps, v27terputbit, NULL); v27ter_rx_set_modem_status_handler(&rx, v27ter_rx_status, (void *) &rx); v27ter_rx_set_qam_report_handler(&rx, qam_report, (void *) &rx); span_log_set_level(&rx.logging, SPAN_LOG_SHOW_SEVERITY | SPAN_LOG_SHOW_PROTOCOL | SPAN_LOG_FLOW); span_log_set_tag(&rx.logging, "V.27ter-rx"); #if defined(ENABLE_GUI) if (use_gui) { qam_monitor = qam_monitor_init(2.0f, NULL); if (!decode_test_file) { start_line_model_monitor(129); line_model_monitor_line_model_update(line_model->near_filter, line_model->near_filter_len); } } #endif memset(&latest_results, 0, sizeof(latest_results)); for (block = 0; ; block++) { if (decode_test_file) { samples = afReadFrames(inhandle, AF_DEFAULT_TRACK, amp, BLOCK_LEN); #if defined(ENABLE_GUI) if (use_gui) qam_monitor_update_audio_level(qam_monitor, amp, samples); #endif if (samples == 0) break; } else { samples = v27ter_tx(&tx, gen_amp, BLOCK_LEN); #if defined(ENABLE_GUI) if (use_gui) qam_monitor_update_audio_level(qam_monitor, gen_amp, samples); #endif if (samples == 0) { printf("Restarting on zero output\n"); /* Push a little silence through, to ensure all the data bits get out of the buffers */ memset(amp, 0, BLOCK_LEN*sizeof(int16_t)); v27ter_rx(&rx, amp, BLOCK_LEN); v27ter_rx(&rx, amp, BLOCK_LEN); v27ter_rx(&rx, amp, BLOCK_LEN); /* Note that we might get a few bad bits as the carrier shuts down. */ bert_result(&bert, &bert_results); fprintf(stderr, "Final result %ddBm0, %d bits, %d bad bits, %d resyncs\n", signal_level, bert_results.total_bits, bert_results.bad_bits, bert_results.resyncs); fprintf(stderr, "Last report %ddBm0, %d bits, %d bad bits, %d resyncs\n", signal_level, latest_results.total_bits, latest_results.bad_bits, latest_results.resyncs); /* See if bit errors are appearing yet. Also check we are getting enough bits out of the receiver. The last regular report should be error free, though the final report will generally contain bits errors as the carrier was dying. The total number of bits out of the receiver should be at least the number we sent. Also, since BERT sync should have occurred rapidly at the start of transmission, the last report should have occurred at not much less than the total number of bits we sent. */ if (bert_results.total_bits < bits_per_test || latest_results.total_bits < bits_per_test - 100 || latest_results.bad_bits != 0) { break; } memset(&latest_results, 0, sizeof(latest_results)); signal_level--; v27ter_tx_restart(&tx, test_bps, tep); v27ter_tx_power(&tx, signal_level); v27ter_rx_restart(&rx, test_bps, FALSE); bert_init(&bert, bits_per_test, BERT_PATTERN_ITU_O152_11, test_bps, 20); bert_set_report(&bert, 10000, reporter, NULL); one_way_line_model_release(line_model); if ((line_model = one_way_line_model_init(line_model_no, (float) noise_level, channel_codec, 0)) == NULL) { fprintf(stderr, " Failed to create line model\n"); exit(2); } } if (log_audio) { outframes = afWriteFrames(outhandle, AF_DEFAULT_TRACK, gen_amp, samples); if (outframes != samples) { fprintf(stderr, " Error writing wave file\n"); exit(2); } } one_way_line_model(line_model, amp, gen_amp, samples); } #if defined(ENABLE_GUI) if (use_gui && !decode_test_file) line_model_monitor_line_spectrum_update(amp, samples); #endif v27ter_rx(&rx, amp, samples); if (decode_test_file == NULL && block%500 == 0) printf("Noise level is %d\n", noise_level); } if (!decode_test_file) { bert_result(&bert, &bert_results); fprintf(stderr, "At completion:\n"); fprintf(stderr, "Final result %ddBm0, %d bits, %d bad bits, %d resyncs\n", signal_level, bert_results.total_bits, bert_results.bad_bits, bert_results.resyncs); fprintf(stderr, "Last report %ddBm0, %d bits, %d bad bits, %d resyncs\n", signal_level, latest_results.total_bits, latest_results.bad_bits, latest_results.resyncs); one_way_line_model_release(line_model); if (signal_level > -43) { printf("Tests failed.\n"); exit(2); } printf("Tests passed.\n"); } #if defined(ENABLE_GUI) if (use_gui) qam_wait_to_end(qam_monitor); #endif if (log_audio) { if (afCloseFile(outhandle)) { fprintf(stderr, " Cannot close wave file '%s'\n", OUT_FILE_NAME); exit(2); } afFreeFileSetup(filesetup); } return 0; } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/tests/g1050_tests.c0000644000175000017500000001613211150047203020351 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * g1050_tests.c - Tests for the G.1050/TIA-921 model. * * Written by Steve Underwood * * Copyright (C) 2007 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2, as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: g1050_tests.c,v 1.16 2008/05/13 13:17:25 steveu Exp $ */ #if defined(HAVE_CONFIG_H) #include "config.h" #endif #if defined(HAVE_FL_FL_H) && defined(HAVE_FL_FL_CARTESIAN_H) && defined(HAVE_FL_FL_AUDIO_METER_H) #define ENABLE_GUI #endif #include #include #include #include #include #include #include #if defined(HAVE_MATH_H) #define GEN_CONST #endif #include "spandsp.h" #include "spandsp-sim.h" #if defined(ENABLE_GUI) #include "media_monitor.h" #endif #define PACKET_SIZE 256 #define PACKET_INTERVAL 20 #define SIMULATION_TIME 300 #define MODEL_NO 8 #define SPEED_PATTERN_NO 133 int main(int argc, char *argv[]) { g1050_state_t *s; double *packet_arrival_times; int packets_per_sec; int num_packets; int model_no; int speed_pattern_no; int use_gui; int simulation_time; int i; int len; uint8_t put_pkt[256]; uint8_t get_pkt[256]; int put_pkt_len; int get_pkt_len; int get_seq_no; double get_departure_time; double get_arrival_time; int packets_put; int packets_really_put; int packets_got; int oos_packets_got; int missing_packets_got; int highest_seq_no_got; int opt; FILE *out_file; model_no = MODEL_NO; speed_pattern_no = SPEED_PATTERN_NO; simulation_time = SIMULATION_TIME; use_gui = FALSE; while ((opt = getopt(argc, argv, "gm:s:t:")) != -1) { switch (opt) { case 'g': #if defined(ENABLE_GUI) use_gui = TRUE; #else fprintf(stderr, "Graphical monitoring not available\n"); exit(2); #endif break; case 'm': model_no = optarg[0] - 'A' + 1; if (model_no < 0 || model_no > 8) { fprintf(stderr, "Bad model ID '%s'\n", optarg); exit(2); } break; case 's': speed_pattern_no = atoi(optarg); if (speed_pattern_no < 1 || speed_pattern_no > 133) { fprintf(stderr, "Bad link speed pattern %s\n", optarg); exit(2); } break; case 't': simulation_time = atoi(optarg); break; default: //usage(); exit(2); break; } } argc -= optind; argv += optind; if ((out_file = fopen("g1050_tests.txt", "w")) == NULL) { fprintf(stderr, "Can't open %s\n", "g1050_tests.txt"); return 2; } packets_per_sec = 1000/PACKET_INTERVAL; num_packets = packets_per_sec*simulation_time; if ((packet_arrival_times = calloc(num_packets, sizeof(double))) == NULL) { fprintf(stderr, "Can't allocate the data buffers\n"); return 2; } for (i = 0; i < num_packets; i++) packet_arrival_times[i] = 0.0; /* If we don't initialise this random number generator it gives endless zeros on some systems. */ /* Use a fixed seed to produce identical results in successive runs of the simulation, for debug purposes. */ srand48(0x1234567); if ((s = g1050_init(model_no, speed_pattern_no, PACKET_SIZE, packets_per_sec)) == NULL) { fprintf(stderr, "Failed to start the G.1050 model\n"); exit(2); } g1050_dump_parms(model_no, speed_pattern_no); #if defined(ENABLE_GUI) if (use_gui) start_media_monitor(); #endif for (i = 0; i < 256; i++) put_pkt[i] = i; put_pkt_len = 256; get_pkt_len = -1; get_seq_no = -1; get_arrival_time = -1; packets_put = 0; packets_really_put = 0; packets_got = 0; oos_packets_got = 0; missing_packets_got = 0; highest_seq_no_got = -1; for (i = 0; i < num_packets; i++) { if ((len = g1050_put(s, put_pkt, put_pkt_len, i, (double) i*0.001*PACKET_INTERVAL)) > 0) packets_really_put++; packets_put++; if (i == 5) g1050_queue_dump(s); if (i >= 5) { do { get_pkt_len = g1050_get(s, get_pkt, 256, (double) i*0.001*PACKET_INTERVAL, &get_seq_no, &get_departure_time, &get_arrival_time); if (get_pkt_len >= 0) { #if defined(ENABLE_GUI) if (use_gui) media_monitor_rx(get_seq_no, get_departure_time, get_arrival_time); #endif packets_got++; if (get_seq_no < highest_seq_no_got) oos_packets_got++; else if (get_seq_no > highest_seq_no_got + 1) missing_packets_got += (get_seq_no - highest_seq_no_got - 1); if (get_seq_no > highest_seq_no_got) highest_seq_no_got = get_seq_no; fprintf(out_file, "%d, %.3f, %.8f\n", get_seq_no, get_seq_no*0.001*PACKET_INTERVAL, get_arrival_time); } } while (get_pkt_len >= 0); } #if defined(ENABLE_GUI) if (use_gui) media_monitor_update_display(); #endif } /* Clear out anything remaining in the queue, by jumping forwards in time */ do { get_pkt_len = g1050_get(s, get_pkt, 256, (double) i*0.001*PACKET_INTERVAL + 5.0, &get_seq_no, &get_departure_time, &get_arrival_time); if (get_pkt_len >= 0) { packets_got++; fprintf(out_file, "%d, %.3f, %.8f\n", get_seq_no, get_seq_no*0.001*PACKET_INTERVAL, get_arrival_time); } } while (get_pkt_len >= 0); fclose(out_file); printf("Put %d packets. Really put %d packets. Got %d packets.\n", packets_put, packets_really_put, packets_got); printf("%d OOS packets, %d missing packets\n", oos_packets_got, missing_packets_got - oos_packets_got); if (packets_really_put != packets_got) { printf("%d packets queued, but only %d received\n", packets_really_put, packets_got); exit(2); } printf("%.3f%% of packets lost\n", 100.0*(packets_put - packets_really_put)/packets_put); return 0; } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/tests/lpc10_tests.c0000644000175000017500000002345211150047203020537 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * lpc10_tests.c - Test the LPC10 low bit rate speech codec. * * Written by Steve Underwood * * Copyright (C) 2006 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2, as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: lpc10_tests.c,v 1.18 2008/05/13 13:17:26 steveu Exp $ */ /*! \file */ /*! \page lpc10_tests_page LPC10 codec tests \section lpc10_tests_page_sec_1 What does it do? \section lpc10_tests_page_sec_2 How is it used? To perform a general audio quality test, lpc10 should be run. The file ../test-data/local/short_nb_voice.wav will be compressed to LPC10 data, decompressed, and the resulting audio stored in post_lpc10.wav. */ #if defined(HAVE_CONFIG_H) #include "config.h" #endif #include #include #include #include #include #include #include #include #include "spandsp.h" #define BLOCK_LEN 180 #define BLOCKS_PER_READ 5 #define IN_FILE_NAME "../test-data/local/dam9.wav" #define REF_FILE_NAME "../test-data/local/dam9_lpc55.wav" #define COMPRESS_FILE_NAME "lpc10_out.lpc10" #define DECOMPRESS_FILE_NAME "lpc10_in.lpc10" #define OUT_FILE_NAME "post_lpc10.wav" int main(int argc, char *argv[]) { AFfilehandle inhandle; AFfilehandle refhandle; AFfilehandle outhandle; AFfilesetup filesetup; int frames; int outframes; float x; double pre_energy; double post_energy; double ref_energy; double diff_energy; int16_t pre_amp[BLOCKS_PER_READ*BLOCK_LEN]; int16_t post_amp[BLOCKS_PER_READ*BLOCK_LEN]; int16_t ref_amp[BLOCKS_PER_READ*BLOCK_LEN]; int16_t log_amp[BLOCKS_PER_READ*BLOCK_LEN*3]; uint8_t lpc10_data[BLOCKS_PER_READ*7]; double xx; lpc10_encode_state_t *lpc10_enc_state; lpc10_decode_state_t *lpc10_dec_state; int i; int block_no; int log_error; int compress; int decompress; const char *in_file_name; int compress_file; int decompress_file; int len; int enc_len; int dec_len; compress = FALSE; decompress = FALSE; log_error = TRUE; in_file_name = IN_FILE_NAME; for (i = 1; i < argc; i++) { if (strcmp(argv[i], "-c") == 0) { compress = TRUE; continue; } if (strcmp(argv[i], "-d") == 0) { decompress = TRUE; continue; } if (strcmp(argv[i], "-i") == 0) { in_file_name = argv[++i]; continue; } if (strcmp(argv[i], "-l") == 0) { log_error = FALSE; continue; } } compress_file = -1; decompress_file = -1; inhandle = AF_NULL_FILEHANDLE; refhandle = AF_NULL_FILEHANDLE; outhandle = AF_NULL_FILEHANDLE; if (!decompress) { if ((inhandle = afOpenFile(in_file_name, "r", 0)) == AF_NULL_FILEHANDLE) { fprintf(stderr, " Cannot open wave file '%s'\n", in_file_name); exit(2); } if ((x = afGetFrameSize(inhandle, AF_DEFAULT_TRACK, 1)) != 2.0) { fprintf(stderr, " Unexpected frame size in wave file '%s'\n", in_file_name); exit(2); } if ((x = afGetRate(inhandle, AF_DEFAULT_TRACK)) != (float) SAMPLE_RATE) { fprintf(stderr, " Unexpected sample rate in wave file '%s'\n", in_file_name); exit(2); } if ((x = afGetChannels(inhandle, AF_DEFAULT_TRACK)) != 1.0) { fprintf(stderr, " Unexpected number of channels in wave file '%s'\n", in_file_name); exit(2); } if ((filesetup = afNewFileSetup()) == AF_NULL_FILESETUP) { fprintf(stderr, " Failed to create file setup\n"); exit(2); } if ((refhandle = afOpenFile(REF_FILE_NAME, "r", 0)) == AF_NULL_FILEHANDLE) { fprintf(stderr, " Cannot open wave file '%s'\n", REF_FILE_NAME); exit(2); } if ((x = afGetFrameSize(refhandle, AF_DEFAULT_TRACK, 1)) != 2.0) { fprintf(stderr, " Unexpected frame size in wave file '%s'\n", REF_FILE_NAME); exit(2); } if ((x = afGetRate(refhandle, AF_DEFAULT_TRACK)) != (float) SAMPLE_RATE) { fprintf(stderr, " Unexpected sample rate in wave file '%s'\n", REF_FILE_NAME); exit(2); } if ((x = afGetChannels(refhandle, AF_DEFAULT_TRACK)) != 1.0) { fprintf(stderr, " Unexpected number of channels in wave file '%s'\n", REF_FILE_NAME); exit(2); } } else { if ((decompress_file = open(DECOMPRESS_FILE_NAME, O_RDONLY)) < 0) { fprintf(stderr, " Cannot open decompressed data file '%s'\n", DECOMPRESS_FILE_NAME); exit(2); } } if ((filesetup = afNewFileSetup()) == AF_NULL_FILESETUP) { fprintf(stderr, " Failed to create file setup\n"); exit(2); } afInitSampleFormat(filesetup, AF_DEFAULT_TRACK, AF_SAMPFMT_TWOSCOMP, 16); afInitRate(filesetup, AF_DEFAULT_TRACK, (float) SAMPLE_RATE); afInitFileFormat(filesetup, AF_FILE_WAVE); afInitChannels(filesetup, AF_DEFAULT_TRACK, 1); if ((outhandle = afOpenFile(OUT_FILE_NAME, "w", filesetup)) == AF_NULL_FILEHANDLE) { fprintf(stderr, " Cannot create wave file '%s'\n", OUT_FILE_NAME); exit(2); } if ((lpc10_enc_state = lpc10_encode_init(NULL, TRUE)) == NULL) { fprintf(stderr, " Cannot create encoder\n"); exit(2); } if ((lpc10_dec_state = lpc10_decode_init(NULL, TRUE)) == NULL) { fprintf(stderr, " Cannot create decoder\n"); exit(2); } if (compress) { if ((compress_file = open(COMPRESS_FILE_NAME, O_WRONLY | O_CREAT | O_TRUNC, 0666)) < 0) { fprintf(stderr, " Cannot create compressed data file '%s'\n", COMPRESS_FILE_NAME); exit(2); } } pre_energy = 0.0; post_energy = 0.0; ref_energy = 0.0; diff_energy = 0.0; if (decompress) { while ((len = read(decompress_file, lpc10_data, BLOCKS_PER_READ*7)) > 0) { lpc10_decode(lpc10_dec_state, post_amp, lpc10_data, len/7); outframes = afWriteFrames(outhandle, AF_DEFAULT_TRACK, post_amp, BLOCK_LEN*len/7); } } else { block_no = 0; while ((frames = afReadFrames(inhandle, AF_DEFAULT_TRACK, pre_amp, BLOCKS_PER_READ*BLOCK_LEN)) == BLOCKS_PER_READ*BLOCK_LEN && (frames = afReadFrames(refhandle, AF_DEFAULT_TRACK, ref_amp, BLOCKS_PER_READ*BLOCK_LEN)) == BLOCKS_PER_READ*BLOCK_LEN) { enc_len = lpc10_encode(lpc10_enc_state, lpc10_data, pre_amp, BLOCKS_PER_READ*BLOCK_LEN); if (compress) write(compress_file, lpc10_data, enc_len); dec_len = lpc10_decode(lpc10_dec_state, post_amp, lpc10_data, enc_len); for (i = 0; i < dec_len; i++) { pre_energy += (double) pre_amp[i]*(double) pre_amp[i]; post_energy += (double) post_amp[i]*(double) post_amp[i]; ref_energy += (double) ref_amp[i]*(double) ref_amp[i]; /* The reference file has some odd clipping, so eliminate this from the energy measurement. */ if (ref_amp[i] == 32767 || ref_amp[i] == -32768) xx = 0.0; else xx = post_amp[i] - ref_amp[i]; diff_energy += (double) xx*(double) xx; log_amp[i] = xx; } block_no++; if (log_error) outframes = afWriteFrames(outhandle, AF_DEFAULT_TRACK, log_amp, dec_len); else outframes = afWriteFrames(outhandle, AF_DEFAULT_TRACK, post_amp, dec_len); } if (afCloseFile(inhandle) != 0) { fprintf(stderr, " Cannot close wave file '%s'\n", in_file_name); exit(2); } if (afCloseFile(refhandle) != 0) { fprintf(stderr, " Cannot close wave file '%s'\n", REF_FILE_NAME); exit(2); } } if (afCloseFile(outhandle) != 0) { fprintf(stderr, " Cannot close wave file '%s'\n", OUT_FILE_NAME); exit(2); } afFreeFileSetup(filesetup); if (compress) close(compress_file); if (decompress) close(decompress_file); lpc10_encode_release(lpc10_enc_state); lpc10_decode_release(lpc10_dec_state); if (!decompress) { printf("Output energy is %f%% of input energy.\n", 100.0*post_energy/pre_energy); printf("Difference energy is %f%% of the total.\n", 100.0*diff_energy/ref_energy); if (fabs(1.0 - post_energy/pre_energy) > 0.05 || fabs(diff_energy/post_energy) > 0.03) { printf("Tests failed.\n"); exit(2); } printf("Tests passed.\n"); } return 0; } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/tests/fax_tester.h0000644000175000017500000002132011150047203020537 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * fax_tester.h * * Written by Steve Underwood * * Copyright (C) 2003, 2005, 2006 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: fax_tester.h,v 1.4 2008/07/21 12:59:48 steveu Exp $ */ /*! \file */ #if !defined(_SPANDSP_FAX_TESTER_H_) #define _SPANDSP_FAX_TESTER_H_ /*! \page fax_tester_page FAX over analogue modem handling \section fax_tester_page_sec_1 What does it do? \section fax_tester_page_sec_2 How does it work? */ typedef struct faxtester_state_s faxtester_state_t; typedef void (faxtester_flush_handler_t)(faxtester_state_t *s, void *user_data, int which); /*! FAX tester real time frame handler. \brief FAX tester real time frame handler. \param s The FAX tester context. \param user_data An opaque pointer. \param direction TRUE for incoming, FALSE for outgoing. \param msg The HDLC message. \param len The length of the message. */ typedef void (faxtester_real_time_frame_handler_t)(faxtester_state_t *s, void *user_data, int direction, const uint8_t *msg, int len); typedef void (faxtester_front_end_step_complete_handler_t)(faxtester_state_t *s, void *user_data); /*! FAX tester descriptor. */ struct faxtester_state_s { /*! \brief Pointer to our current step in the test. */ xmlNodePtr cur; /*! TRUE is talker echo protection should be sent for the image modems */ int use_tep; faxtester_flush_handler_t *flush_handler; void *flush_user_data; /*! \brief A pointer to a callback routine to be called when frames are exchanged. */ faxtester_real_time_frame_handler_t *real_time_frame_handler; /*! \brief An opaque pointer supplied in real time frame callbacks. */ void *real_time_frame_user_data; faxtester_front_end_step_complete_handler_t *front_end_step_complete_handler; void *front_end_step_complete_user_data; /*! The current receive signal handler */ span_rx_handler_t *rx_handler; void *rx_user_data; int rx_trained; /*! The current transmit signal handler */ span_tx_handler_t *tx_handler; void *tx_user_data; const uint8_t *image_buffer; int image_len; int image_ptr; int image_bit_ptr; int final_delayed; /*! If TRUE, transmission is in progress */ int transmit; /*! If TRUE, transmit silence when there is nothing else to transmit. If FALSE return only the actual generated audio. Note that this only affects untimed silences. Timed silences (e.g. the 75ms silence between V.21 and a high speed modem) will alway be transmitted as silent audio. */ int transmit_on_idle; /*! \brief A tone generator context used to generate supervisory tones during FAX handling. */ tone_gen_state_t tone_gen; /*! \brief An HDLC context used when receiving HDLC over V.21 messages. */ hdlc_rx_state_t hdlcrx; /*! \brief An HDLC context used when transmitting HDLC over V.21 messages. */ hdlc_tx_state_t hdlctx; /*! \brief A V.21 FSK modem context used when transmitting HDLC over V.21 messages. */ fsk_tx_state_t v21_tx; /*! \brief A V.21 FSK modem context used when receiving HDLC over V.21 messages. */ fsk_rx_state_t v21_rx; /*! \brief A V.17 modem context used when sending FAXes at 7200bps, 9600bps 12000bps or 14400bps*/ v17_tx_state_t v17_tx; /*! \brief A V.29 modem context used when receiving FAXes at 7200bps, 9600bps 12000bps or 14400bps*/ v17_rx_state_t v17_rx; /*! \brief A V.27ter modem context used when sending FAXes at 2400bps or 4800bps */ v27ter_tx_state_t v27ter_tx; /*! \brief A V.27ter modem context used when receiving FAXes at 2400bps or 4800bps */ v27ter_rx_state_t v27ter_rx; /*! \brief A V.29 modem context used when sending FAXes at 7200bps or 9600bps */ v29_tx_state_t v29_tx; /*! \brief A V.29 modem context used when receiving FAXes at 7200bps or 9600bps */ v29_rx_state_t v29_rx; /*! \brief Used to insert timed silences. */ silence_gen_state_t silence_gen; /*! \brief */ dc_restore_state_t dc_restore; /*! \brief TRUE is the short training sequence should be used. */ int short_train; /*! \brief The currently select receiver type */ int current_rx_type; /*! \brief The currently select transmitter type */ int current_tx_type; /*! \brief Error and flow logging control */ logging_state_t logging; }; #if defined(__cplusplus) extern "C" { #endif /*! Apply T.30 receive processing to a block of audio samples. \brief Apply T.30 receive processing to a block of audio samples. \param s The FAX tester context. \param amp The audio sample buffer. \param len The number of samples in the buffer. \return The number of samples unprocessed. This should only be non-zero if the software has reached the end of the FAX call. */ int faxtester_rx(faxtester_state_t *s, int16_t *amp, int len); /*! Apply T.30 transmit processing to generate a block of audio samples. \brief Apply T.30 transmit processing to generate a block of audio samples. \param s The FAX tester context. \param amp The audio sample buffer. \param max_len The number of samples to be generated. \return The number of samples actually generated. This will be zero when there is nothing to send. */ int faxtester_tx(faxtester_state_t *s, int16_t *amp, int max_len); void faxtester_set_tx_type(void *user_data, int type, int short_train, int use_hdlc); void faxtester_set_rx_type(void *user_data, int type, int short_train, int use_hdlc); void faxtester_send_hdlc_flags(faxtester_state_t *s, int flags); void faxtester_send_hdlc_msg(faxtester_state_t *s, const uint8_t *msg, int len); void faxtester_set_flush_handler(faxtester_state_t *s, faxtester_flush_handler_t *handler, void *user_data); /*! Select whether silent audio will be sent when FAX transmit is idle. \brief Select whether silent audio will be sent when FAX transmit is idle. \param s The FAX tester context. \param transmit_on_idle TRUE if silent audio should be output when the FAX transmitter is idle. FALSE to transmit zero length audio when the FAX transmitter is idle. The default behaviour is FALSE. */ void faxtester_set_transmit_on_idle(faxtester_state_t *s, int transmit_on_idle); /*! Select whether talker echo protection tone will be sent for the image modems. \brief Select whether TEP will be sent for the image modems. \param s The FAX tester context. \param use_tep TRUE if TEP should be sent. */ void faxtester_set_tep_mode(faxtester_state_t *s, int use_tep); void faxtester_set_real_time_frame_handler(faxtester_state_t *s, faxtester_real_time_frame_handler_t *handler, void *user_data); void faxtester_set_front_end_step_complete_handler(faxtester_state_t *s, faxtester_front_end_step_complete_handler_t *handler, void *user_data); void faxtester_set_image_buffer(faxtester_state_t *s, const uint8_t *buf, int len); /*! Initialise a FAX context. \brief Initialise a FAX context. \param s The FAX tester context. \param calling_party TRUE if the context is for a calling party. FALSE if the context is for an answering party. \return A pointer to the FAX context, or NULL if there was a problem. */ faxtester_state_t *faxtester_init(faxtester_state_t *s, int calling_party); /*! Release a FAX context. \brief Release a FAX context. \param s The FAX tester context. \return 0 for OK, else -1. */ int faxtester_release(faxtester_state_t *s); /*! Free a FAX context. \brief Free a FAX context. \param s The FAX tester context. \return 0 for OK, else -1. */ int faxtester_free(faxtester_state_t *s); #if defined(__cplusplus) } #endif #endif /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/tests/modem_monitor.cpp0000644000175000017500000004026011150047203021602 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * modem_monitor.cpp - Display QAM constellations, using the FLTK toolkit. * * Written by Steve Underwood * * Copyright (C) 2004 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2, as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: modem_monitor.cpp,v 1.15 2008/05/27 15:08:21 steveu Exp $ */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #if defined(HAVE_FL_FL_H) && defined(HAVE_FL_FL_CARTESIAN_H) #define __STDC_LIMIT_MACROS #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "spandsp.h" #define SYMBOL_TRACKER_POINTS 12000 #define CARRIER_TRACKER_POINTS 12000 struct qam_monitor_s { Fl_Double_Window *w; Fl_Group *c_const; Fl_Group *c_right; Fl_Group *c_eq; Fl_Group *c_symbol_track; /* Constellation stuff */ Ca_Canvas *canvas_const; Ca_X_Axis *sig_i; Ca_Y_Axis *sig_q; Ca_Point *constel_point[100000]; int constel_window; int next_constel_point; int skip; /* Equalizer stuff */ Ca_Canvas *canvas_eq; Ca_X_Axis *eq_x; Ca_Y_Axis *eq_y; Ca_Line *eq_re; Ca_Line *eq_im; double eq_re_plot[200]; double eq_im_plot[200]; /* Carrier and symbol tracking stuff */ Ca_Canvas *canvas_track; Ca_X_Axis *track_x; Ca_Y_Axis *symbol_track_y; Ca_Y_Axis *carrier_y; Ca_Line *symbol_track; Ca_Line *carrier; float symbol_tracker[SYMBOL_TRACKER_POINTS]; double symbol_track_plot[SYMBOL_TRACKER_POINTS*2]; int symbol_track_points; int symbol_track_ptr; int symbol_track_window; float carrier_tracker[CARRIER_TRACKER_POINTS]; double carrier_plot[CARRIER_TRACKER_POINTS*2]; int carrier_points; int carrier_ptr; int carrier_window; /* Audio meter stuff */ Fl_Audio_Meter *audio_meter; Fl_Output *audio_level; int32_t power_reading; }; #include "modem_monitor.h" int qam_monitor_clear_constel(qam_monitor_t *s) { int i; s->canvas_const->current(s->canvas_const); for (i = 0; i < s->constel_window; i++) { if (s->constel_point[i]) { delete s->constel_point[i]; s->constel_point[i] = NULL; } } s->next_constel_point = 0; Fl::check(); return 0; } /*- End of function --------------------------------------------------------*/ int qam_monitor_update_constel(qam_monitor_t *s, const complexf_t *pt) { int i; s->canvas_const->current(s->canvas_const); if (s->constel_point[s->next_constel_point]) delete s->constel_point[s->next_constel_point]; s->constel_point[s->next_constel_point++] = new Ca_Point(pt->re, pt->im, FL_BLACK); if (s->next_constel_point >= s->constel_window) s->next_constel_point = 0; if (++s->skip >= 100) { s->skip = 0; Fl::check(); } return 0; } /*- End of function --------------------------------------------------------*/ int qam_monitor_update_equalizer(qam_monitor_t *s, const complexf_t *coeffs, int len) { int i; float min; float max; /* Protect against screwy values */ for (i = 0; i < len; i++) { if (isnan(coeffs[i].re) || isinf(coeffs[i].re)) break; if (isnan(coeffs[i].im) || isinf(coeffs[i].im)) break; if (coeffs[i].re < -20.0 || coeffs[i].re > 20.0) break; if (coeffs[i].im < -20.0 || coeffs[i].im > 20.0) break; } if (i != len) return -1; if (s->eq_re) delete s->eq_re; if (s->eq_im) delete s->eq_im; s->canvas_eq->current(s->canvas_eq); i = 0; min = coeffs[i].re; if (min > coeffs[i].im) min = coeffs[i].im; max = coeffs[i].re; if (max < coeffs[i].im) max = coeffs[i].im; for (i = 0; i < len; i++) { s->eq_re_plot[2*i] = (i - len/2)/2.0; s->eq_re_plot[2*i + 1] = coeffs[i].re; if (min > coeffs[i].re) min = coeffs[i].re; if (max < coeffs[i].re) max = coeffs[i].re; s->eq_im_plot[2*i] = (i - len/2)/2.0; s->eq_im_plot[2*i + 1] = coeffs[i].im; if (min > coeffs[i].im) min = coeffs[i].im; if (max < coeffs[i].im) max = coeffs[i].im; } s->eq_x->minimum(-len/4.0); s->eq_x->maximum(len/4.0); s->eq_y->maximum((max == min) ? max + 0.2 : max); s->eq_y->minimum(min); s->eq_re = new Ca_Line(len, s->eq_re_plot, 0, 0, FL_BLUE, CA_NO_POINT); s->eq_im = new Ca_Line(len, s->eq_im_plot, 0, 0, FL_RED, CA_NO_POINT); Fl::check(); return 0; } /*- End of function --------------------------------------------------------*/ int qam_monitor_update_symbol_tracking(qam_monitor_t *s, float total_correction) { int i; int j; float min; float max; s->symbol_tracker[s->symbol_track_ptr++] = total_correction; if (s->symbol_track_points < SYMBOL_TRACKER_POINTS) s->symbol_track_points++; if (s->symbol_track_ptr >= SYMBOL_TRACKER_POINTS) s->symbol_track_ptr = 0; s->canvas_track->current(s->canvas_track); if (s->symbol_track) delete s->symbol_track; s->track_x->current(); s->symbol_track_y->current(); min = max = s->symbol_tracker[0]; for (i = s->symbol_track_ptr, j = 0; i < s->symbol_track_points; i++, j++) { s->symbol_track_plot[2*j] = j; s->symbol_track_plot[2*j + 1] = s->symbol_tracker[i]; if (min > s->symbol_tracker[i]) min = s->symbol_tracker[i]; if (max < s->symbol_tracker[i]) max = s->symbol_tracker[i]; } for (i = 0; i < s->symbol_track_ptr; i++, j++) { s->symbol_track_plot[2*j] = j; s->symbol_track_plot[2*j + 1] = s->symbol_tracker[i]; if (min > s->symbol_tracker[i]) min = s->symbol_tracker[i]; if (max < s->symbol_tracker[i]) max = s->symbol_tracker[i]; } s->symbol_track_y->maximum((fabs(max - min) < 0.05) ? max + 0.05 : max); s->symbol_track_y->minimum(min); s->symbol_track = new Ca_Line(s->symbol_track_points, s->symbol_track_plot, 0, 0, FL_RED, CA_NO_POINT); //Fl::check(); return 0; } /*- End of function --------------------------------------------------------*/ int qam_monitor_update_audio_level(qam_monitor_t *s, const int16_t amp[], int len) { int i; char buf[11]; double val; for (i = 0; i < len; i++) { s->audio_meter->sample(amp[i]/32768.0); s->power_reading += ((amp[i]*amp[i] - s->power_reading) >> 10); } if (s->power_reading <= 0) val = -90.0; else val = log10((double) s->power_reading/(32767.0f*32767.0f))*10.0f + 3.14 + 3.02; snprintf(buf, sizeof(buf), "%5.1fdBm0", val); s->audio_level->value(buf); return 0; } /*- End of function --------------------------------------------------------*/ int qam_monitor_update_carrier_tracking(qam_monitor_t *s, float carrier_freq) { int i; int j; float min; float max; s->carrier_tracker[s->carrier_ptr++] = carrier_freq; if (s->carrier_points < CARRIER_TRACKER_POINTS) s->carrier_points++; if (s->carrier_ptr >= CARRIER_TRACKER_POINTS) s->carrier_ptr = 0; s->canvas_track->current(s->canvas_track); if (s->carrier) delete s->carrier; s->track_x->current(); s->carrier_y->current(); min = max = s->carrier_tracker[0]; for (i = s->carrier_ptr, j = 0; i < s->carrier_points; i++, j++) { s->carrier_plot[2*j] = j; s->carrier_plot[2*j + 1] = s->carrier_tracker[i]; if (min > s->carrier_tracker[i]) min = s->carrier_tracker[i]; if (max < s->carrier_tracker[i]) max = s->carrier_tracker[i]; } for (i = 0; i < s->carrier_ptr; i++, j++) { s->carrier_plot[2*j] = j; s->carrier_plot[2*j + 1] = s->carrier_tracker[i]; if (min > s->carrier_tracker[i]) min = s->carrier_tracker[i]; if (max < s->carrier_tracker[i]) max = s->carrier_tracker[i]; } s->carrier_y->maximum((fabs(max - min) < 0.05) ? max + 0.05 : max); s->carrier_y->minimum(min); s->carrier = new Ca_Line(s->carrier_points, s->carrier_plot, 0, 0, FL_BLUE, CA_NO_POINT); //Fl::check(); return 0; } /*- End of function --------------------------------------------------------*/ qam_monitor_t *qam_monitor_init(float constel_width, const char *tag) { char buf[132 + 1]; float x; float y; qam_monitor_t *s; if ((s = (qam_monitor_t *) malloc(sizeof(*s))) == NULL) return NULL; s->w = new Fl_Double_Window(905, 400, (tag) ? tag : "QAM monitor"); s->c_const = new Fl_Group(0, 0, 380, 400); s->c_const->box(FL_DOWN_BOX); s->c_const->align(FL_ALIGN_TOP | FL_ALIGN_INSIDE); s->canvas_const = new Ca_Canvas(60, 30, 300, 300, "Constellation"); s->canvas_const->box(FL_PLASTIC_DOWN_BOX); s->canvas_const->color(7); s->canvas_const->align(FL_ALIGN_TOP); s->canvas_const->border(15); s->sig_i = new Ca_X_Axis(65, 330, 290, 30, "I"); s->sig_i->align(FL_ALIGN_BOTTOM); s->sig_i->minimum(-constel_width); s->sig_i->maximum(constel_width); s->sig_i->label_format("%g"); s->sig_i->minor_grid_color(fl_gray_ramp(20)); s->sig_i->major_grid_color(fl_gray_ramp(15)); s->sig_i->label_grid_color(fl_gray_ramp(10)); s->sig_i->grid_visible(CA_LABEL_GRID | CA_ALWAYS_VISIBLE); s->sig_i->minor_grid_style(FL_DOT); s->sig_i->major_step(5); s->sig_i->label_step(1); s->sig_i->axis_color(FL_BLACK); s->sig_i->axis_align(CA_BOTTOM | CA_LINE); s->sig_q = new Ca_Y_Axis(20, 35, 40, 290, "Q"); s->sig_q->align(FL_ALIGN_LEFT); s->sig_q->minimum(-constel_width); s->sig_q->maximum(constel_width); s->sig_q->minor_grid_color(fl_gray_ramp(20)); s->sig_q->major_grid_color(fl_gray_ramp(15)); s->sig_q->label_grid_color(fl_gray_ramp(10)); //s->sig_q->grid_visible(CA_MINOR_TICK | CA_MAJOR_TICK | CA_LABEL_GRID | CA_ALWAYS_VISIBLE); s->sig_q->grid_visible(CA_LABEL_GRID | CA_ALWAYS_VISIBLE); s->sig_q->minor_grid_style(FL_DOT); s->sig_q->major_step(5); s->sig_q->label_step(1); s->sig_q->axis_color(FL_BLACK); s->sig_q->current(); s->c_const->end(); s->c_right = new Fl_Group(440, 0, 465, 405); s->c_eq = new Fl_Group(380, 0, 265, 200); s->c_eq->box(FL_DOWN_BOX); s->c_eq->align(FL_ALIGN_TOP | FL_ALIGN_INSIDE); s->c_eq->current(); s->canvas_eq = new Ca_Canvas(460, 35, 150, 100, "Equalizer"); s->canvas_eq->box(FL_PLASTIC_DOWN_BOX); s->canvas_eq->color(7); s->canvas_eq->align(FL_ALIGN_TOP); Fl_Group::current()->resizable(s->canvas_eq); s->canvas_eq->border(15); s->eq_x = new Ca_X_Axis(465, 135, 140, 30, "Symbol"); s->eq_x->align(FL_ALIGN_BOTTOM); s->eq_x->minimum(-8.0); s->eq_x->maximum(8.0); s->eq_x->label_format("%g"); s->eq_x->minor_grid_color(fl_gray_ramp(20)); s->eq_x->major_grid_color(fl_gray_ramp(15)); s->eq_x->label_grid_color(fl_gray_ramp(10)); s->eq_x->grid_visible(CA_LABEL_GRID | CA_ALWAYS_VISIBLE); s->eq_x->minor_grid_style(FL_DOT); s->eq_x->major_step(5); s->eq_x->label_step(1); s->eq_x->axis_align(CA_BOTTOM | CA_LINE); s->eq_x->axis_color(FL_BLACK); s->eq_x->current(); s->eq_y = new Ca_Y_Axis(420, 40, 40, 90, "Amp"); s->eq_y->align(FL_ALIGN_LEFT); s->eq_y->minimum(-0.1); s->eq_y->maximum(0.1); s->eq_y->minor_grid_color(fl_gray_ramp(20)); s->eq_y->major_grid_color(fl_gray_ramp(15)); s->eq_y->label_grid_color(fl_gray_ramp(10)); s->eq_y->grid_visible(CA_LABEL_GRID | CA_ALWAYS_VISIBLE); s->eq_y->minor_grid_style(FL_DOT); s->eq_y->major_step(5); s->eq_y->label_step(1); s->eq_y->axis_color(FL_BLACK); s->eq_y->current(); s->c_eq->end(); s->c_symbol_track = new Fl_Group(380, 200, 525, 200); s->c_symbol_track->box(FL_DOWN_BOX); s->c_symbol_track->align(FL_ALIGN_TOP | FL_ALIGN_INSIDE); s->c_symbol_track->current(); s->canvas_track = new Ca_Canvas(490, 235, 300, 100, "Symbol and carrier tracking"); s->canvas_track->box(FL_PLASTIC_DOWN_BOX); s->canvas_track->color(7); s->canvas_track->align(FL_ALIGN_TOP); Fl_Group::current()->resizable(s->canvas_track); s->canvas_track->border(15); s->track_x = new Ca_X_Axis(495, 335, 290, 30, "Time (symbols)"); s->track_x->align(FL_ALIGN_BOTTOM); s->track_x->minimum(0.0); s->track_x->maximum(2400.0*5.0); s->track_x->label_format("%g"); s->track_x->minor_grid_color(fl_gray_ramp(20)); s->track_x->major_grid_color(fl_gray_ramp(15)); s->track_x->label_grid_color(fl_gray_ramp(10)); s->track_x->grid_visible(CA_LABEL_GRID | CA_ALWAYS_VISIBLE); s->track_x->minor_grid_style(FL_DOT); s->track_x->major_step(5); s->track_x->label_step(1); s->track_x->axis_align(CA_BOTTOM | CA_LINE); s->track_x->axis_color(FL_BLACK); s->track_x->current(); s->symbol_track_y = new Ca_Y_Axis(420, 240, 70, 90, "Cor"); s->symbol_track_y->align(FL_ALIGN_LEFT); s->symbol_track_y->minimum(-0.1); s->symbol_track_y->maximum(0.1); s->symbol_track_y->minor_grid_color(fl_gray_ramp(20)); s->symbol_track_y->major_grid_color(fl_gray_ramp(15)); s->symbol_track_y->label_grid_color(fl_gray_ramp(10)); s->symbol_track_y->grid_visible(CA_LABEL_GRID | CA_ALWAYS_VISIBLE); s->symbol_track_y->minor_grid_style(FL_DOT); s->symbol_track_y->major_step(5); s->symbol_track_y->label_step(1); s->symbol_track_y->axis_color(FL_RED); s->symbol_track_y->current(); s->carrier_y = new Ca_Y_Axis(790, 240, 70, 90, "Freq"); s->carrier_y->align(FL_ALIGN_RIGHT); s->carrier_y->minimum(-0.1); s->carrier_y->maximum(0.1); s->carrier_y->minor_grid_color(fl_gray_ramp(20)); s->carrier_y->major_grid_color(fl_gray_ramp(15)); s->carrier_y->label_grid_color(fl_gray_ramp(10)); s->carrier_y->grid_visible(CA_LABEL_GRID | CA_ALWAYS_VISIBLE); s->carrier_y->minor_grid_style(FL_DOT); s->carrier_y->major_step(5); s->carrier_y->label_step(1); s->carrier_y->axis_align(CA_RIGHT); s->carrier_y->axis_color(FL_BLUE); s->carrier_y->current(); s->c_symbol_track->end(); s->audio_meter = new Fl_Audio_Meter(672, 10, 16, 150, ""); s->audio_meter->box(FL_PLASTIC_UP_BOX); s->audio_meter->type(FL_VERT_AUDIO_METER); s->audio_level = new Fl_Output(650, 170, 60, 20, ""); s->audio_level->textsize(10); s->c_right->end(); Fl_Group::current()->resizable(s->c_right); s->w->end(); s->w->show(); s->next_constel_point = 0; s->constel_window = 10000; s->carrier_points = 0; s->carrier_ptr = 0; s->carrier_window = 100; s->symbol_track_points = 0; s->symbol_track_window = 10000; Fl::check(); return s; } /*- End of function --------------------------------------------------------*/ void qam_wait_to_end(qam_monitor_t *s) { fd_set rfds; int res; struct timeval tv; fprintf(stderr, "Processing complete. Press the key to end\n"); do { usleep(100000); Fl::check(); FD_ZERO(&rfds); FD_SET(0, &rfds); tv.tv_usec = 100000; tv.tv_sec = 0; res = select(1, &rfds, NULL, NULL, &tv); } while (res <= 0); } /*- End of function --------------------------------------------------------*/ #endif /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/tests/crc_tests.c0000644000175000017500000000603111150047203020361 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * crc_tests.c * * Written by Steve Underwood * * Copyright (C) 2003 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2, as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: crc_tests.c,v 1.6 2008/05/13 13:17:25 steveu Exp $ */ /*! \file */ /*! \page crc_tests_page CRC tests \section crc_tests_page_sec_1 What does it do? The CRC tests exercise the ITU-16 and ITU-32 CRC module, and verifies correct operation. */ #if defined(HAVE_CONFIG_H) #include "config.h" #endif #include #include #include #include "spandsp.h" int ref_len; uint8_t buf[1000]; /* Use a local random generator, so the results are consistent across platforms. We have hard coded correct results for a message sequence generated by this particular PRNG. */ static int my_rand(void) { static int rndnum = 1234567; return (rndnum = 1664525U*rndnum + 1013904223U) >> 8; } /*- End of function --------------------------------------------------------*/ static int cook_up_msg(uint8_t *buf) { int i; int len; /* Use medium length messages, with some randomised length variation. */ /* TODO: this doesn't exercise extremely short or long messages. */ len = (my_rand() & 0x3F) + 100; for (i = 0; i < len; i++) buf[i] = my_rand(); return len; } /*- End of function --------------------------------------------------------*/ int main(int argc, char *argv[]) { int i; int len; printf("HDLC module tests\n"); /* TODO: This doesn't check every function in the module */ /* Try a few random messages through the CRC logic. */ printf("Testing the CRC-16 routines\n"); for (i = 0; i < 100; i++) { ref_len = cook_up_msg(buf); len = crc_itu16_append(buf, ref_len); if (!crc_itu16_check(buf, len)) { printf("CRC-16 failure\n"); exit(2); } } printf("Test passed.\n\n"); printf("Testing the CRC-32 routines\n"); for (i = 0; i < 100; i++) { ref_len = cook_up_msg(buf); len = crc_itu32_append(buf, ref_len); if (!crc_itu32_check(buf, len)) { printf("CRC-32 failure\n"); exit(2); } } printf("Test passed.\n"); return 0; } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/tests/time_scale_tests.c0000644000175000017500000001103211150047203021714 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * time_scale_tests.c * * Written by Steve Underwood * * Copyright (C) 2004 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2, as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: time_scale_tests.c,v 1.21 2008/05/13 13:17:26 steveu Exp $ */ /*! \page time_scale_tests_page Time scaling tests \section time_scale_tests_page_sec_1 What does it do? These tests run a speech file through the time scaling routines. \section time_scale_tests_page_sec_2 How are the tests run? These tests process a speech file called pre_time_scale.wav. This file should contain 8000 sample/second 16 bits/sample linear audio. The tests read this file, change the time scale of its contents, and write the resulting audio to post_time_scale.wav. This file also contains 8000 sample/second 16 bits/sample linear audio. */ #if defined(HAVE_CONFIG_H) #include "config.h" #endif #include #include #include #include #include "spandsp.h" #define BLOCK_LEN 160 #define IN_FILE_NAME "../test-data/local/short_nb_voice.wav" #define OUT_FILE_NAME "post_time_scaling.wav" int main(int argc, char *argv[]) { AFfilehandle inhandle; AFfilehandle outhandle; AFfilesetup filesetup; int frames; int new_frames; int out_frames; int count; time_scale_state_t state; float x; float rate; int16_t in[BLOCK_LEN]; int16_t out[5*BLOCK_LEN]; if ((inhandle = afOpenFile(IN_FILE_NAME, "r", 0)) == AF_NULL_FILEHANDLE) { printf(" Cannot open wave file '%s'\n", IN_FILE_NAME); exit(2); } if ((x = afGetFrameSize(inhandle, AF_DEFAULT_TRACK, 1)) != 2.0) { printf(" Unexpected frame size in wave file '%s'\n", IN_FILE_NAME); exit(2); } if ((x = afGetRate(inhandle, AF_DEFAULT_TRACK)) != (float) SAMPLE_RATE) { printf(" Unexpected sample rate in wave file '%s'\n", IN_FILE_NAME); exit(2); } if ((x = afGetChannels(inhandle, AF_DEFAULT_TRACK)) != 1.0) { printf(" Unexpected number of channels in wave file '%s'\n", IN_FILE_NAME); exit(2); } if ((filesetup = afNewFileSetup()) == AF_NULL_FILESETUP) { fprintf(stderr, " Failed to create file setup\n"); exit(2); } afInitSampleFormat(filesetup, AF_DEFAULT_TRACK, AF_SAMPFMT_TWOSCOMP, 16); afInitRate(filesetup, AF_DEFAULT_TRACK, (float) SAMPLE_RATE); afInitFileFormat(filesetup, AF_FILE_WAVE); afInitChannels(filesetup, AF_DEFAULT_TRACK, 1); if ((outhandle = afOpenFile(OUT_FILE_NAME, "w", filesetup)) == AF_NULL_FILEHANDLE) { fprintf(stderr, " Cannot create wave file '%s'\n", OUT_FILE_NAME); exit(2); } rate = 1.8; time_scale_init(&state, rate); count = 0; while ((frames = afReadFrames(inhandle, AF_DEFAULT_TRACK, in, BLOCK_LEN))) { new_frames = time_scale(&state, out, in, frames); out_frames = afWriteFrames(outhandle, AF_DEFAULT_TRACK, out, new_frames); if (out_frames != new_frames) { fprintf(stderr, " Error writing wave file\n"); exit(2); } if (++count > 100) { if (rate > 0.5) { rate -= 0.1; if (rate >= 0.99 && rate <= 1.01) rate -= 0.1; printf("Rate is %f\n", rate); time_scale_init(&state, rate); } count = 0; } } if (afCloseFile(inhandle) != 0) { printf(" Cannot close wave file '%s'\n", IN_FILE_NAME); exit(2); } if (afCloseFile(outhandle) != 0) { printf(" Cannot close wave file '%s'\n", OUT_FILE_NAME); exit(2); } afFreeFileSetup(filesetup); return 0; } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/tests/adsi_tests.c0000644000175000017500000007256011150047203020544 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * adsi_tests.c - tests for analogue display service handling. * * Written by Steve Underwood * * Copyright (C) 2003 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2, as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: adsi_tests.c,v 1.41 2008/05/13 13:17:25 steveu Exp $ */ /*! \page adsi_tests_page ADSI tests \section adsi_tests_page_sec_1 What does it do? These tests exercise the ADSI module, for all supported standards. A transmit and a receive instance of the ADSI module are connected together. A quantity of messages is passed between these instances, and checked for accuracy at the receiver. Since the FSK modems used for this are exercised fully by other tests, these tests do not include line modelling. \section adsi_tests_page_sec_2 How does it work? */ #if defined(HAVE_CONFIG_H) #include "config.h" #endif #include #include #include #include #include #include #include #include "spandsp.h" #define OUT_FILE_NAME "adsi.wav" #define BLOCK_LEN 160 char *decode_test_file = NULL; int errors = 0; adsi_rx_state_t rx_adsi; adsi_tx_state_t tx_adsi; int current_standard = 0; int good_message_received; static int adsi_create_message(adsi_tx_state_t *s, uint8_t *msg) { const char *t; int len; static int cycle = 0; len = 0; switch (current_standard) { case ADSI_STANDARD_CLASS: if (cycle > 3) cycle = 0; switch (cycle) { case 0: len = adsi_add_field(s, msg, -1, CLASS_MDMF_CALLERID, NULL, 0); /* Date and time as MMDDHHMM */ len = adsi_add_field(s, msg, len, MCLASS_DATETIME, (uint8_t *) "10011750", 8); len = adsi_add_field(s, msg, len, MCLASS_CALLER_NUMBER, (uint8_t *) "12345678", 8); len = adsi_add_field(s, msg, len, MCLASS_DIALED_NUMBER, (uint8_t *) "87654321", 8); len = adsi_add_field(s, msg, len, MCLASS_CALLER_NAME, (uint8_t *) "Chan Dai Man", 15); break; case 1: len = adsi_add_field(s, msg, -1, CLASS_SDMF_MSG_WAITING, NULL, 0); /* Active */ len = adsi_add_field(s, msg, len, 0, (uint8_t *) "\x42", 1); len = adsi_add_field(s, msg, len, 0, (uint8_t *) "\x42", 1); len = adsi_add_field(s, msg, len, 0, (uint8_t *) "\x42", 1); break; case 2: len = adsi_add_field(s, msg, -1, CLASS_SDMF_MSG_WAITING, NULL, 0); /* Inactive */ len = adsi_add_field(s, msg, len, 0, (uint8_t *) "\x6F", 1); len = adsi_add_field(s, msg, len, 0, (uint8_t *) "\x6F", 1); len = adsi_add_field(s, msg, len, 0, (uint8_t *) "\x6F", 1); break; case 3: len = adsi_add_field(s, msg, -1, CLASS_SDMF_CALLERID, NULL, 0); /* Date and time as MMDDHHMM */ len = adsi_add_field(s, msg, len, 0, (uint8_t *) "10011750", 8); len = adsi_add_field(s, msg, len, 0, (uint8_t *) "6095551212", 10); break; } break; case ADSI_STANDARD_CLIP: if (cycle > 4) cycle = 0; switch (cycle) { case 0: len = adsi_add_field(s, msg, -1, CLIP_MDMF_CALLERID, NULL, 0); len = adsi_add_field(s, msg, len, CLIP_CALLTYPE, (uint8_t *) "\x81", 1); /* Date and time as MMDDHHMM */ len = adsi_add_field(s, msg, len, CLIP_DATETIME, (uint8_t *) "10011750", 8); len = adsi_add_field(s, msg, len, CLIP_DIALED_NUMBER, (uint8_t *) "12345678", 8); len = adsi_add_field(s, msg, len, CLIP_CALLER_NUMBER, (uint8_t *) "87654321", 8); len = adsi_add_field(s, msg, len, CLIP_CALLER_NAME, (uint8_t *) "Chan Dai Man", 15); break; case 1: len = adsi_add_field(s, msg, -1, CLIP_MDMF_MSG_WAITING, NULL, 0); /* Inactive */ len = adsi_add_field(s, msg, len, CLIP_VISUAL_INDICATOR, (uint8_t *) "\x00", 1); break; case 2: len = adsi_add_field(s, msg, -1, CLIP_MDMF_MSG_WAITING, NULL, 0); /* Active */ len = adsi_add_field(s, msg, len, CLIP_VISUAL_INDICATOR, (uint8_t *) "\xFF", 1); len = adsi_add_field(s, msg, len, CLIP_NUM_MSG, (uint8_t *) "\x05", 1); break; case 3: len = adsi_add_field(s, msg, -1, CLIP_MDMF_SMS, NULL, 0); /* Active */ len = adsi_add_field(s, msg, len, CLIP_DISPLAY_INFO, (uint8_t *) "\x00" "ABC", 4); break; case 4: len = adsi_add_field(s, msg, -1, CLIP_MDMF_CALLERID, NULL, 0); len = adsi_add_field(s, msg, len, CLIP_NUM_MSG, (uint8_t *) "\x03", 1); break; } break; case ADSI_STANDARD_ACLIP: if (cycle > 0) cycle = 0; switch (cycle) { case 0: len = adsi_add_field(s, msg, -1, ACLIP_MDMF_CALLERID, NULL, 0); /* Date and time as MMDDHHMM */ len = adsi_add_field(s, msg, len, ACLIP_DATETIME, (uint8_t *) "10011750", 8); len = adsi_add_field(s, msg, len, ACLIP_DIALED_NUMBER, (uint8_t *) "12345678", 8); len = adsi_add_field(s, msg, len, ACLIP_CALLER_NUMBER, (uint8_t *) "87654321", 8); len = adsi_add_field(s, msg, len, ACLIP_CALLER_NAME, (uint8_t *) "Chan Dai Man", 15); break; } break; case ADSI_STANDARD_JCLIP: len = adsi_add_field(s, msg, -1, JCLIP_MDMF_CALLERID, NULL, 0); len = adsi_add_field(s, msg, len, JCLIP_CALLER_NUMBER, (uint8_t *) "12345678", 8); len = adsi_add_field(s, msg, len, JCLIP_CALLER_NUM_DES, (uint8_t *) "215", 3); len = adsi_add_field(s, msg, len, JCLIP_DIALED_NUMBER, (uint8_t *) "87654321", 8); len = adsi_add_field(s, msg, len, JCLIP_DIALED_NUM_DES, (uint8_t *) "215", 3); break; case ADSI_STANDARD_CLIP_DTMF: if (cycle > 4) cycle = 0; switch (cycle) { case 0: len = adsi_add_field(s, msg, -1, CLIP_DTMF_C_TERMINATED, NULL, 0); len = adsi_add_field(s, msg, len, CLIP_DTMF_C_CALLER_NUMBER, (uint8_t *) "12345678", 8); len = adsi_add_field(s, msg, len, CLIP_DTMF_C_ABSENCE, (uint8_t *) "10", 2); len = adsi_add_field(s, msg, len, CLIP_DTMF_C_REDIRECT_NUMBER, (uint8_t *) "87654321", 8); break; case 1: len = adsi_add_field(s, msg, -1, CLIP_DTMF_HASH_TERMINATED, NULL, 0); len = adsi_add_field(s, msg, len, CLIP_DTMF_HASH_CALLER_NUMBER, (uint8_t *) "12345678", 8); break; case 2: len = adsi_add_field(s, msg, -1, CLIP_DTMF_HASH_TERMINATED, NULL, 0); len = adsi_add_field(s, msg, len, CLIP_DTMF_HASH_ABSENCE, (uint8_t *) "1", 1); break; case 3: /* Test the DC format, used in Taiwan and Kuwait */ len = adsi_add_field(s, msg, -1, CLIP_DTMF_HASH_TERMINATED, NULL, 0); len = adsi_add_field(s, msg, len, CLIP_DTMF_HASH_ABSENCE, (uint8_t *) "12345678", 8); break; case 4: /* Test the # format, with no header */ len = adsi_add_field(s, msg, -1, CLIP_DTMF_HASH_TERMINATED, NULL, 0); len = adsi_add_field(s, msg, len, CLIP_DTMF_HASH_UNSPECIFIED, (uint8_t *) "12345678", 8); break; } break; case ADSI_STANDARD_TDD: t = "The quick Brown Fox Jumps Over The Lazy dog 0123456789!@#$%^&*()"; len = adsi_add_field(s, msg, -1, 0, (uint8_t *) t, strlen(t)); break; } cycle++; return len; } /*- End of function --------------------------------------------------------*/ static void put_adsi_msg(void *user_data, const uint8_t *msg, int len) { int i; int l; uint8_t field_type; const uint8_t *field_body; int field_len; int message_type; uint8_t body[256]; printf("Good message received (%d bytes)\n", len); good_message_received = TRUE; for (i = 0; i < len; i++) { printf("%02x ", msg[i]); if ((i & 0xF) == 0xF) printf("\n"); } printf("\n"); l = -1; message_type = -1; printf("Message breakdown\n"); do { l = adsi_next_field(&rx_adsi, msg, len, l, &field_type, &field_body, &field_len); if (l > 0) { if (field_body) { memcpy(body, field_body, field_len); body[field_len] = '\0'; printf("Field type 0x%x, len %d, '%s' - ", field_type, field_len, body); switch (current_standard) { case ADSI_STANDARD_CLASS: switch (message_type) { case CLASS_SDMF_CALLERID: break; case CLASS_MDMF_CALLERID: switch (field_type) { case MCLASS_DATETIME: printf("Date and time (MMDDHHMM)"); break; case MCLASS_CALLER_NUMBER: printf("Caller's number"); break; case MCLASS_DIALED_NUMBER: printf("Dialed number"); break; case MCLASS_ABSENCE1: printf("Caller's number absent: 'O' or 'P'"); break; case MCLASS_REDIRECT: printf("Call forward: universal ('0'), on busy ('1'), or on unanswered ('2')"); break; case MCLASS_QUALIFIER: printf("Long distance: 'L'"); break; case MCLASS_CALLER_NAME: printf("Caller's name"); break; case MCLASS_ABSENCE2: printf("Caller's name absent: 'O' or 'P'"); break; } break; case CLASS_SDMF_MSG_WAITING: break; case CLASS_MDMF_MSG_WAITING: switch (field_type) { case MCLASS_VISUAL_INDICATOR: printf("Message waiting/not waiting"); break; } break; } break; case ADSI_STANDARD_CLIP: switch (message_type) { case CLIP_MDMF_CALLERID: case CLIP_MDMF_MSG_WAITING: case CLIP_MDMF_CHARGE_INFO: case CLIP_MDMF_SMS: switch (field_type) { case CLIP_DATETIME: printf("Date and time (MMDDHHMM)"); break; case CLIP_CALLER_NUMBER: printf("Caller's number"); break; case CLIP_DIALED_NUMBER: printf("Dialed number"); break; case CLIP_ABSENCE1: printf("Caller's number absent"); break; case CLIP_CALLER_NAME: printf("Caller's name"); break; case CLIP_ABSENCE2: printf("Caller's name absent"); break; case CLIP_VISUAL_INDICATOR: printf("Visual indicator"); break; case CLIP_MESSAGE_ID: printf("Message ID"); break; case CLIP_CALLTYPE: printf("Voice call, ring-back-when-free call, or msg waiting call"); break; case CLIP_NUM_MSG: printf("Number of messages"); break; #if 0 case CLIP_REDIR_NUMBER: printf("Redirecting number"); break; #endif case CLIP_CHARGE: printf("Charge"); break; case CLIP_DURATION: printf("Duration of the call"); break; case CLIP_ADD_CHARGE: printf("Additional charge"); break; case CLIP_DISPLAY_INFO: printf("Display information"); break; case CLIP_SERVICE_INFO: printf("Service information"); break; } break; } break; case ADSI_STANDARD_ACLIP: switch (message_type) { case ACLIP_SDMF_CALLERID: break; case ACLIP_MDMF_CALLERID: switch (field_type) { case ACLIP_DATETIME: printf("Date and time (MMDDHHMM)"); break; case ACLIP_CALLER_NUMBER: printf("Caller's number"); break; case ACLIP_DIALED_NUMBER: printf("Dialed number"); break; case ACLIP_NUMBER_ABSENCE: printf("Caller's number absent: 'O' or 'P'"); break; case ACLIP_REDIRECT: printf("Call forward: universal, on busy, or on unanswered"); break; case ACLIP_QUALIFIER: printf("Long distance call: 'L'"); break; case ACLIP_CALLER_NAME: printf("Caller's name"); break; case ACLIP_NAME_ABSENCE: printf("Caller's name absent: 'O' or 'P'"); break; } break; } break; case ADSI_STANDARD_JCLIP: switch (message_type) { case JCLIP_MDMF_CALLERID: switch (field_type) { case JCLIP_CALLER_NUMBER: printf("Caller's number"); break; case JCLIP_CALLER_NUM_DES: printf("Caller's number data extension signal"); break; case JCLIP_DIALED_NUMBER: printf("Dialed number"); break; case JCLIP_DIALED_NUM_DES: printf("Dialed number data extension signal"); break; case JCLIP_ABSENCE: printf("Caller's number absent: 'C', 'O', 'P' or 'S'"); break; } break; } break; case ADSI_STANDARD_CLIP_DTMF: switch (message_type) { case CLIP_DTMF_HASH_TERMINATED: switch (field_type) { case CLIP_DTMF_HASH_CALLER_NUMBER: printf("Caller's number"); break; case CLIP_DTMF_HASH_ABSENCE: printf("Caller's number absent: private (1), overseas (2) or not available (3)"); break; case CLIP_DTMF_HASH_UNSPECIFIED: printf("Unspecified"); break; } break; case CLIP_DTMF_C_TERMINATED: switch (field_type) { case CLIP_DTMF_C_CALLER_NUMBER: printf("Caller's number"); break; case CLIP_DTMF_C_REDIRECT_NUMBER: printf("Redirect number"); break; case CLIP_DTMF_C_ABSENCE: printf("Caller's number absent"); break; } break; } break; case ADSI_STANDARD_TDD: if (len != 59 || memcmp(msg, "THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG 0123456789#$*()", 59)) { printf("\n"); printf("String error\n"); exit(2); } break; } } else { printf("Message type 0x%x - ", field_type); message_type = field_type; switch (current_standard) { case ADSI_STANDARD_CLASS: switch (message_type) { case CLASS_SDMF_CALLERID: printf("Single data message caller ID"); break; case CLASS_MDMF_CALLERID: printf("Multiple data message caller ID"); break; case CLASS_SDMF_MSG_WAITING: printf("Single data message message waiting"); break; case CLASS_MDMF_MSG_WAITING: printf("Multiple data message message waiting"); break; default: printf("Unknown"); break; } break; case ADSI_STANDARD_CLIP: switch (message_type) { case CLIP_MDMF_CALLERID: printf("Multiple data message caller ID"); break; case CLIP_MDMF_MSG_WAITING: printf("Multiple data message message waiting"); break; case CLIP_MDMF_CHARGE_INFO: printf("Multiple data message charge info"); break; case CLIP_MDMF_SMS: printf("Multiple data message SMS"); break; default: printf("Unknown"); break; } break; case ADSI_STANDARD_ACLIP: switch (message_type) { case ACLIP_SDMF_CALLERID: printf("Single data message caller ID frame"); break; case ACLIP_MDMF_CALLERID: printf("Multiple data message caller ID frame"); break; default: printf("Unknown"); break; } break; case ADSI_STANDARD_JCLIP: switch (message_type) { case JCLIP_MDMF_CALLERID: printf("Multiple data message caller ID frame"); break; default: printf("Unknown"); break; } break; case ADSI_STANDARD_CLIP_DTMF: switch (message_type) { case CLIP_DTMF_HASH_TERMINATED: printf("# terminated"); break; case CLIP_DTMF_C_TERMINATED: printf("C terminated"); break; default: printf("Unknown"); break; } break; case ADSI_STANDARD_TDD: printf("Unknown"); break; } } printf("\n"); } } while (l > 0); if (l < -1) { /* This message appears corrupt */ printf("Bad message contents\n"); exit(2); } printf("\n"); } /*- End of function --------------------------------------------------------*/ int main(int argc, char *argv[]) { int16_t amp[BLOCK_LEN]; uint8_t adsi_msg[256 + 42]; int adsi_msg_len; AFfilehandle inhandle; AFfilehandle outhandle; AFfilesetup filesetup; int outframes; int len; int i; int push; int log_audio; int short_preamble; int test_standard; int first_standard; int last_standard; int opt; log_audio = FALSE; decode_test_file = NULL; test_standard = -1; short_preamble = FALSE; while ((opt = getopt(argc, argv, "d:lps:")) != -1) { switch (opt) { case 'd': decode_test_file = optarg; break; case 'l': log_audio = TRUE; break; case 'p': short_preamble = TRUE; break; case 's': if (strcasecmp("CLASS", optarg) == 0) test_standard = ADSI_STANDARD_CLASS; else if (strcasecmp("CLIP", optarg) == 0) test_standard = ADSI_STANDARD_CLIP; else if (strcasecmp("A-CLIP", optarg) == 0) test_standard = ADSI_STANDARD_ACLIP; else if (strcasecmp("J-CLIP", optarg) == 0) test_standard = ADSI_STANDARD_JCLIP; else if (strcasecmp("CLIP-DTMF", optarg) == 0) test_standard = ADSI_STANDARD_CLIP_DTMF; else if (strcasecmp("TDD", optarg) == 0) test_standard = ADSI_STANDARD_TDD; else test_standard = atoi(optarg); break; default: //usage(); exit(2); break; } } filesetup = AF_NULL_FILESETUP; outhandle = AF_NULL_FILEHANDLE; #if 0 /* This part tests internal static routines in the ADSI module. It can only be run with a modified version of the ADSI module, which makes the routines visible. */ /* Check the character encode/decode cycle */ current_standard = ADSI_STANDARD_TDD; adsi_tx_init(&tx_adsi, ADSI_STANDARD_TDD); adsi_rx_init(&rx_adsi, ADSI_STANDARD_TDD, put_adsi_msg, NULL); s = "The quick Brown Fox Jumps Over The Lazy dog 0123456789!@#$%^&*()"; while ((ch = *s++)) { xx = adsi_encode_baudot(&tx_adsi, ch); if ((xx & 0x3E0)) { yy = adsi_decode_baudot(&rx_adsi, (xx >> 5) & 0x1F); if (yy) printf("%c", yy); } yy = adsi_decode_baudot(&rx_adsi, xx & 0x1F); if (yy) printf("%c", yy); } printf("\n"); #endif if (decode_test_file) { /* We will decode the audio from a wave file. */ if ((inhandle = afOpenFile(decode_test_file, "r", NULL)) == AF_NULL_FILEHANDLE) { fprintf(stderr, " Cannot open wave file '%s'\n", decode_test_file); exit(2); } if (test_standard < 0) current_standard = ADSI_STANDARD_CLASS; else current_standard = test_standard; adsi_rx_init(&rx_adsi, current_standard, put_adsi_msg, NULL); span_log_set_level(&rx_adsi.logging, SPAN_LOG_SHOW_SEVERITY | SPAN_LOG_SHOW_PROTOCOL | SPAN_LOG_FLOW); span_log_set_tag(&rx_adsi.logging, "ADSI"); for (;;) { len = afReadFrames(inhandle, AF_DEFAULT_TRACK, amp, BLOCK_LEN); if (len == 0) break; adsi_rx(&rx_adsi, amp, len); } if (afCloseFile(inhandle) != 0) { fprintf(stderr, " Cannot close wave file '%s'\n", decode_test_file); exit(2); } } else { if (log_audio) { if ((filesetup = afNewFileSetup()) == AF_NULL_FILESETUP) { fprintf(stderr, " Failed to create file setup\n"); exit(2); } afInitSampleFormat(filesetup, AF_DEFAULT_TRACK, AF_SAMPFMT_TWOSCOMP, 16); afInitRate(filesetup, AF_DEFAULT_TRACK, (float) SAMPLE_RATE); afInitFileFormat(filesetup, AF_FILE_WAVE); afInitChannels(filesetup, AF_DEFAULT_TRACK, 1); if ((outhandle = afOpenFile(OUT_FILE_NAME, "w", filesetup)) == AF_NULL_FILEHANDLE) { fprintf(stderr, " Cannot create wave file '%s'\n", OUT_FILE_NAME); exit(2); } } /* Go through all the standards */ /* This assumes standard 0 is NULL, and TDD is the last in the list */ if (test_standard < 0) { first_standard = ADSI_STANDARD_CLASS; last_standard = ADSI_STANDARD_TDD; } else { first_standard = last_standard = test_standard; } for (current_standard = first_standard; current_standard <= last_standard; current_standard++) { printf("Testing %s\n", adsi_standard_to_str(current_standard)); adsi_tx_init(&tx_adsi, current_standard); if (short_preamble) adsi_tx_set_preamble(&tx_adsi, 50, 20, 5, -1); adsi_rx_init(&rx_adsi, current_standard, put_adsi_msg, NULL); /* Fake an OK condition for the first message test */ good_message_received = TRUE; push = 0; for (i = 0; i < 100000; i++) { if (push == 0) { if ((len = adsi_tx(&tx_adsi, amp, BLOCK_LEN)) == 0) push = 10; } else { len = 0; /* Push a little silence through, to flush things out */ if (--push == 0) { if (!good_message_received) { printf("No message received %s (%d)\n", adsi_standard_to_str(current_standard), i); exit(2); } good_message_received = FALSE; adsi_msg_len = adsi_create_message(&tx_adsi, adsi_msg); adsi_msg_len = adsi_tx_put_message(&tx_adsi, adsi_msg, adsi_msg_len); } } if (len < BLOCK_LEN) { memset(&[len], 0, sizeof(int16_t)*(BLOCK_LEN - len)); len = BLOCK_LEN; } if (log_audio) { outframes = afWriteFrames(outhandle, AF_DEFAULT_TRACK, amp, len); if (outframes != len) { fprintf(stderr, " Error writing wave file\n"); exit(2); } } adsi_rx(&rx_adsi, amp, len); } } if (log_audio) { if (afCloseFile(outhandle) != 0) { fprintf(stderr, " Cannot close wave file '%s'\n", OUT_FILE_NAME); exit(2); } afFreeFileSetup(filesetup); } } printf("Tests passed.\n"); return 0; } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/tests/modem_echo_tests.c0000644000175000017500000003357211150047203021723 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * modem_echo_tests.c * * Written by Steve Underwood * * Copyright (C) 2004 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2, as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: modem_echo_tests.c,v 1.28 2008/05/13 13:17:26 steveu Exp $ */ /*! \page modem_echo_can_tests_page Line echo cancellation for modems tests \section modem_echo_can_tests_page_sec_1 What does it do? Currently the echo cancellation tests only provide simple exercising of the cancellor in the way it might be used for line echo cancellation. The test code is in echotests.c. The goal is to test the echo cancellor again the G.16X specs. Clearly, that also means the goal for the cancellor itself is to comply with those specs. Right now, the only aspect of these tests implemented is the line impulse response models in g168tests.c. \section modem_echo_can_tests_page_sec_2 How does it work? The current test consists of feeding a wave file of real speech to the echo cancellor as the transmit signal. A very simple model of a telephone line is used to simulate a simple echo from the transmit signal. A second wave file of real speech is also used to simulate a signal received form the far end of the line. This is gated so it is only placed for one second every 10 seconds, simulating the double talk condition. The resulting echo cancelled signal can either be store in a file for further analysis, or played back as the data is processed. A number of modified versions of this test have been performed. The signal level of the two speech sources has been varied. Several simple models of the telephone line have been used. Although the current cancellor design has known limitations, it seems stable for all these test conditions. No instability has been observed in the current version due to arithmetic overflow when the speech is very loud (with earlier versions, well, ....:) ). The lack of saturating arithmetic in general purpose CPUs is a huge disadvantage here, as software saturation logic would cause a major slow down. Floating point would be good, but is not usable in the Linux kernel. Anyway, the bottom line seems to be the current design is genuinely useful, if imperfect. \section modem_echo_can_tests_page_sec_2 How do I use it? Build the tests with the command "./build". Currently there is no proper make setup, or way to build individual tests. "./build" will built all the tests which currently exist for the DSP functions. The echo cancellation test assumes there are two wave files containing mono, 16 bit signed PCM speech data, sampled at 8kHz. These should be called local_sound.wav and far_sound.wav. A third wave file will be produced. This very crudely starts with the first 256 bytes from the local_sound.wav file, followed by the results of the echo cancellation. The resulting audio is also played to the /dev/dsp device. A printf near the end of echo_tests.c is commented out with a \#if. If this is enabled, detailed information about the results of the echo cancellation will be written to stdout. By saving this into a file, Grace (recommended), GnuPlot, or some other plotting package may be used to graphically display the functioning of the cancellor. */ #if defined(HAVE_CONFIG_H) #include "config.h" #endif #if defined(HAVE_FL_FL_H) && defined(HAVE_FL_FL_CARTESIAN_H) && defined(HAVE_FL_FL_AUDIO_METER_H) #define ENABLE_GUI #endif #include #include #include #include #include #include #if defined(HAVE_MATH_H) #define GEN_CONST #endif #include "spandsp.h" #include "spandsp/g168models.h" #if defined(ENABLE_GUI) #include "echo_monitor.h" #endif #if !defined(NULL) #define NULL (void *) 0 #endif typedef struct { const char *name; int max; int cur; AFfilehandle handle; int16_t signal[8000]; } signal_source_t; signal_source_t local_css; fir32_state_t line_model; AFfilehandle resulthandle; int16_t residue_sound[8000]; int residue_cur = 0; int do_codec_munge = TRUE; int use_gui = FALSE; static const int16_t tone_1khz[] = {10362, 7327, 0, -7327, -10362, -7327, 0, 7327}; static inline void put_residue(int16_t tx, int16_t residue) { int outframes; residue_sound[residue_cur++] = tx; residue_sound[residue_cur++] = residue; if (residue_cur >= 8000) { residue_cur >>= 1; outframes = afWriteFrames(resulthandle, AF_DEFAULT_TRACK, residue_sound, residue_cur); if (outframes != residue_cur) { fprintf(stderr, " Error writing residue sound\n"); exit(2); } residue_cur = 0; } } /*- End of function --------------------------------------------------------*/ static void signal_load(signal_source_t *sig, const char *name) { float x; sig->name = name; if ((sig->handle = afOpenFile(sig->name, "r", 0)) == AF_NULL_FILEHANDLE) { fprintf(stderr, " Cannot open sound file '%s'\n", sig->name); exit(2); } if ((x = afGetFrameSize(sig->handle, AF_DEFAULT_TRACK, 1)) != 2.0) { fprintf(stderr, " Unexpected frame size in wave file '%s'\n", sig->name); exit(2); } if ((x = afGetRate(sig->handle, AF_DEFAULT_TRACK)) != (float) SAMPLE_RATE) { printf(" Unexpected sample rate in wave file '%s'\n", sig->name); exit(2); } if ((x = afGetChannels(sig->handle, AF_DEFAULT_TRACK)) != 1.0) { printf(" Unexpected number of channels in wave file '%s'\n", sig->name); exit(2); } sig->max = afReadFrames(sig->handle, AF_DEFAULT_TRACK, sig->signal, 8000); if (sig->max < 0) { fprintf(stderr, " Error reading sound file '%s'\n", sig->name); exit(2); } } /*- End of function --------------------------------------------------------*/ static void signal_free(signal_source_t *sig) { if (afCloseFile(sig->handle) != 0) { fprintf(stderr, " Cannot close sound file '%s'\n", sig->name); exit(2); } } /*- End of function --------------------------------------------------------*/ static void signal_restart(signal_source_t *sig) { sig->cur = 0; } /*- End of function --------------------------------------------------------*/ static int16_t signal_amp(signal_source_t *sig) { int16_t tx; tx = sig->signal[sig->cur++]; if (sig->cur >= sig->max) sig->cur = 0; return tx; } /*- End of function --------------------------------------------------------*/ static inline int16_t codec_munge(int16_t amp) { if (do_codec_munge) return alaw_to_linear(linear_to_alaw(amp)); return amp; } /*- End of function --------------------------------------------------------*/ static void channel_model_create(int model) { static const int32_t *line_models[] = { line_model_d2_coeffs, line_model_d3_coeffs, line_model_d4_coeffs, line_model_d5_coeffs, line_model_d6_coeffs, line_model_d7_coeffs, line_model_d8_coeffs, line_model_d9_coeffs }; static int line_model_sizes[] = { sizeof(line_model_d2_coeffs)/sizeof(int32_t), sizeof(line_model_d3_coeffs)/sizeof(int32_t), sizeof(line_model_d4_coeffs)/sizeof(int32_t), sizeof(line_model_d5_coeffs)/sizeof(int32_t), sizeof(line_model_d6_coeffs)/sizeof(int32_t), sizeof(line_model_d7_coeffs)/sizeof(int32_t), sizeof(line_model_d8_coeffs)/sizeof(int32_t), sizeof(line_model_d9_coeffs)/sizeof(int32_t) }; fir32_create(&line_model, line_models[model], line_model_sizes[model]); } /*- End of function --------------------------------------------------------*/ static int16_t channel_model(int16_t local, int16_t far) { int16_t echo; int16_t rx; /* Channel modelling is merely simulating the effects of A-law distortion and using one of the echo models from G.168 */ /* The local tx signal will have gone through an A-law munging before it reached the line's analogue area where the echo occurs. */ echo = fir32(&line_model, codec_munge(local/8)); /* The far end signal will have been through an A-law munging, although this should not affect things. */ rx = echo + codec_munge(far); /* This mixed echo and far end signal will have been through an A-law munging when it came back into the digital network. */ rx = codec_munge(rx); return rx; } /*- End of function --------------------------------------------------------*/ int main(int argc, char *argv[]) { modem_echo_can_state_t *ctx; //awgn_state_t local_noise_source; awgn_state_t far_noise_source; int i; int clean; int16_t rx; int16_t tx; int local_cur; int far_cur; int result_cur; AFfilesetup filesetup; int line_model_no; time_t now; power_meter_t power_before; power_meter_t power_after; float unadapted_output_power; float unadapted_echo_power; float adapted_output_power; float adapted_echo_power; #if defined(ENABLE_GUI) int16_t amp[2]; #endif line_model_no = 0; use_gui = FALSE; for (i = 1; i < argc; i++) { if (strcmp(argv[i], "-g") == 0) { use_gui = TRUE; continue; } line_model_no = atoi(argv[1]); } time(&now); ctx = modem_echo_can_create(256); awgn_init_dbm0(&far_noise_source, 7162534, -50.0f); signal_load(&local_css, "sound_c1_8k.wav"); filesetup = afNewFileSetup(); if (filesetup == AF_NULL_FILESETUP) { fprintf(stderr, " Failed to create file setup\n"); exit(2); } afInitSampleFormat(filesetup, AF_DEFAULT_TRACK, AF_SAMPFMT_TWOSCOMP, 16); afInitRate(filesetup, AF_DEFAULT_TRACK, (float) SAMPLE_RATE); afInitFileFormat(filesetup, AF_FILE_WAVE); afInitChannels(filesetup, AF_DEFAULT_TRACK, 2); resulthandle = afOpenFile("modem_echo.wav", "w", filesetup); if (resulthandle == AF_NULL_FILEHANDLE) { fprintf(stderr, " Failed to open result file\n"); exit(2); } #if defined(ENABLE_GUI) if (use_gui) start_echo_can_monitor(256); #endif local_cur = 0; far_cur = 0; result_cur = 0; channel_model_create(line_model_no); #if defined(ENABLE_GUI) if (use_gui) echo_can_monitor_line_model_update(line_model.coeffs, line_model.taps); #endif modem_echo_can_flush(ctx); power_meter_init(&power_before, 5); power_meter_init(&power_after, 5); /* Measure the echo power before adaption */ modem_echo_can_adaption_mode(ctx, FALSE); for (i = 0; i < 8000*5; i++) { tx = tone_1khz[i & 7]; rx = channel_model(tx, 0); clean = modem_echo_can_update(ctx, tx, rx); power_meter_update(&power_before, rx); power_meter_update(&power_after, clean); } unadapted_output_power = power_meter_current_dbm0(&power_before); unadapted_echo_power = power_meter_current_dbm0(&power_after); printf("Pre-adaption: output power %10.5fdBm0, echo power %10.5fdBm0\n", unadapted_output_power, unadapted_echo_power); /* Converge the canceller */ signal_restart(&local_css); modem_echo_can_adaption_mode(ctx, TRUE); for (i = 0; i < 800*2; i++) { clean = modem_echo_can_update(ctx, 0, 0); put_residue(0, clean); } for (i = 0; i < 8000*50; i++) { tx = signal_amp(&local_css); rx = channel_model(tx, 0); clean = modem_echo_can_update(ctx, tx, rx); power_meter_update(&power_before, rx); power_meter_update(&power_after, clean); #if 0 if (i%800 == 0) printf("Powers %10.5fdBm0 %10.5fdBm0\n", power_meter_current_dbm0(&power_before), power_meter_current_dbm0(&power_after)); #endif put_residue(tx, clean); #if defined(ENABLE_GUI) if (use_gui) { echo_can_monitor_can_update(ctx->fir_taps16, 256); amp[0] = tx; echo_can_monitor_line_spectrum_update(amp, 1); } #endif } /* Now lets see how well adapted we are */ modem_echo_can_adaption_mode(ctx, FALSE); for (i = 0; i < 8000*5; i++) { tx = tone_1khz[i & 7]; rx = channel_model(tx, 0); clean = modem_echo_can_update(ctx, tx, rx); power_meter_update(&power_before, rx); power_meter_update(&power_after, clean); } adapted_output_power = power_meter_current_dbm0(&power_before); adapted_echo_power = power_meter_current_dbm0(&power_after); printf("Post-adaption: output power %10.5fdBm0, echo power %10.5fdBm0\n", adapted_output_power, adapted_echo_power); if (fabsf(adapted_output_power - unadapted_output_power) > 0.1f || adapted_echo_power > unadapted_echo_power - 30.0f) { printf("Tests failed.\n"); exit(2); } modem_echo_can_free(ctx); signal_free(&local_css); if (afCloseFile(resulthandle) != 0) { fprintf(stderr, " Cannot close speech file '%s'\n", "result_sound.wav"); exit(2); } afFreeFileSetup(filesetup); #if defined(ENABLE_GUI) if (use_gui) echo_can_monitor_wait_to_end(); #endif printf("Tests passed.\n"); return 0; } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/tests/fax_tests.c0000644000175000017500000004617411150047203020404 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * fax_tests.c * * Written by Steve Underwood * * Copyright (C) 2003 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2, as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: fax_tests.c,v 1.91 2008/07/25 13:56:54 steveu Exp $ */ /*! \page fax_tests_page FAX tests \section fax_tests_page_sec_1 What does it do? \section fax_tests_page_sec_2 How does it work? */ #if defined(HAVE_CONFIG_H) #include "config.h" #endif #include #include #include #include #include #include #include "spandsp.h" #define SAMPLES_PER_CHUNK 160 #define INPUT_TIFF_FILE_NAME "../test-data/itu/fax/itutests.tif" #define OUTPUT_FILE_NAME_WAVE "fax_tests.wav" #define FAX_MACHINES 2 struct machine_s { int chan; int16_t amp[SAMPLES_PER_CHUNK]; int len; fax_state_t fax; int done; int succeeded; char tag[50]; int error_delay; int total_audio_time; } machines[FAX_MACHINES]; int use_receiver_not_ready = FALSE; int test_local_interrupt = FALSE; int t30_state_to_wreck = -1; static int phase_b_handler(t30_state_t *s, void *user_data, int result) { int i; const char *u; i = (intptr_t) user_data; if ((u = t30_get_rx_ident(s))) printf("%d: Phase B: remote ident '%s'\n", i, u); if ((u = t30_get_rx_sub_address(s))) printf("%d: Phase B: remote sub-address '%s'\n", i, u); if ((u = t30_get_rx_polled_sub_address(s))) printf("%d: Phase B: remote polled sub-address '%s'\n", i, u); if ((u = t30_get_rx_selective_polling_address(s))) printf("%d: Phase B: remote selective polling address '%s'\n", i, u); if ((u = t30_get_rx_sender_ident(s))) printf("%d: Phase B: remote sender ident '%s'\n", i, u); if ((u = t30_get_rx_password(s))) printf("%d: Phase B: remote password '%s'\n", i, u); printf("%d: Phase B handler on channel %d - (0x%X) %s\n", i, i, result, t30_frametype(result)); return T30_ERR_OK; } /*- End of function --------------------------------------------------------*/ static int phase_d_handler(t30_state_t *s, void *user_data, int result) { int i; t30_stats_t t; const char *u; i = (intptr_t) user_data; t30_get_transfer_statistics(s, &t); printf("%d: Phase D handler on channel %d - (0x%X) %s\n", i, i, result, t30_frametype(result)); printf("%d: Phase D: bit rate %d\n", i, t.bit_rate); printf("%d: Phase D: ECM %s\n", i, (t.error_correcting_mode) ? "on" : "off"); printf("%d: Phase D: pages transferred %d\n", i, t.pages_transferred); printf("%d: Phase D: pages in the file %d\n", i, t.pages_in_file); printf("%d: Phase D: image size %d x %d\n", i, t.width, t.length); printf("%d: Phase D: image resolution %d x %d\n", i, t.x_resolution, t.y_resolution); printf("%d: Phase D: bad rows %d\n", i, t.bad_rows); printf("%d: Phase D: longest bad row run %d\n", i, t.longest_bad_row_run); printf("%d: Phase D: compression type %d\n", i, t.encoding); printf("%d: Phase D: image size %d bytes\n", i, t.image_size); if ((u = t30_get_tx_ident(s))) printf("%d: Phase D: local ident '%s'\n", i, u); if ((u = t30_get_rx_ident(s))) printf("%d: Phase D: remote ident '%s'\n", i, u); printf("%d: Phase D: bits per row - min %d, max %d\n", i, s->t4.min_row_bits, s->t4.max_row_bits); if (use_receiver_not_ready) t30_set_receiver_not_ready(s, 3); if (test_local_interrupt) { if (i == 0) { printf("%d: Initiating interrupt request\n", i); t30_local_interrupt_request(s, TRUE); } else { switch (result) { case T30_PIP: case T30_PRI_MPS: case T30_PRI_EOM: case T30_PRI_EOP: printf("%d: Accepting interrupt request\n", i); t30_local_interrupt_request(s, TRUE); break; case T30_PIN: break; } } } return T30_ERR_OK; } /*- End of function --------------------------------------------------------*/ static void phase_e_handler(t30_state_t *s, void *user_data, int result) { int i; t30_stats_t t; const char *u; i = (intptr_t) user_data; printf("%d: Phase E handler on channel %d - (%d) %s\n", i, i, result, t30_completion_code_to_str(result)); t30_get_transfer_statistics(s, &t); printf("%d: Phase E: bit rate %d\n", i, t.bit_rate); printf("%d: Phase E: ECM %s\n", i, (t.error_correcting_mode) ? "on" : "off"); printf("%d: Phase E: pages transferred %d\n", i, t.pages_transferred); printf("%d: Phase E: pages in the file %d\n", i, t.pages_in_file); printf("%d: Phase E: image size %d x %d\n", i, t.width, t.length); printf("%d: Phase E: image resolution %d x %d\n", i, t.x_resolution, t.y_resolution); printf("%d: Phase E: bad rows %d\n", i, t.bad_rows); printf("%d: Phase E: longest bad row run %d\n", i, t.longest_bad_row_run); printf("%d: Phase E: coding method %s\n", i, t4_encoding_to_str(t.encoding)); printf("%d: Phase E: image size %d bytes\n", i, t.image_size); //printf("%d: Phase E: local ident '%s'\n", i, info->ident); if ((u = t30_get_rx_ident(s))) printf("%d: Phase E: remote ident '%s'\n", i, u); if ((u = t30_get_rx_country(s))) printf("%d: Phase E: Remote was made in '%s'\n", i, u); if ((u = t30_get_rx_vendor(s))) printf("%d: Phase E: Remote was made by '%s'\n", i, u); if ((u = t30_get_rx_model(s))) printf("%d: Phase E: Remote is model '%s'\n", i, u); machines[i].succeeded = (result == T30_ERR_OK) && (t.pages_transferred == 12); machines[i].done = TRUE; } /*- End of function --------------------------------------------------------*/ static void real_time_frame_handler(t30_state_t *s, void *user_data, int direction, const uint8_t *msg, int len) { int i; i = (intptr_t) user_data; printf("%d: Real time frame handler on channel %d - %s, %s, length = %d\n", i, i, (direction) ? "line->T.30" : "T.30->line", t30_frametype(msg[2]), len); } /*- End of function --------------------------------------------------------*/ static int document_handler(t30_state_t *s, void *user_data, int event) { int i; i = (intptr_t) user_data; printf("%d: Document handler on channel %d - event %d\n", i, i, event); return FALSE; } /*- End of function --------------------------------------------------------*/ int main(int argc, char *argv[]) { AFfilesetup filesetup; AFfilehandle wave_handle; AFfilehandle input_wave_handle; int i; int j; int k; struct machine_s *mc; int outframes; char buf[128 + 1]; int16_t silence[SAMPLES_PER_CHUNK]; int16_t out_amp[2*SAMPLES_PER_CHUNK]; int alldone; const char *input_tiff_file_name; const char *input_audio_file_name; int log_audio; int use_ecm; int use_tep; int use_transmit_on_idle; int use_line_hits; int polled_mode; int reverse_flow; int use_page_limits; int supported_modems; time_t start_time; time_t end_time; char *page_header_info; int opt; t30_state_t *t30; log_audio = FALSE; input_tiff_file_name = INPUT_TIFF_FILE_NAME; input_audio_file_name = NULL; use_ecm = FALSE; use_line_hits = FALSE; use_tep = FALSE; polled_mode = FALSE; page_header_info = NULL; reverse_flow = FALSE; use_transmit_on_idle = TRUE; use_receiver_not_ready = FALSE; use_page_limits = FALSE; supported_modems = T30_SUPPORT_V27TER | T30_SUPPORT_V29 | T30_SUPPORT_V17; while ((opt = getopt(argc, argv, "ehH:i:I:lm:prRtTw:")) != -1) { switch (opt) { case 'e': use_ecm = TRUE; break; case 'h': use_line_hits = TRUE; break; case 'H': page_header_info = optarg; break; case 'i': input_tiff_file_name = optarg; break; case 'I': input_audio_file_name = optarg; break; case 'l': log_audio = TRUE; break; case 'm': supported_modems = atoi(optarg); break; case 'p': polled_mode = TRUE; break; case 'r': reverse_flow = TRUE; break; case 'R': use_receiver_not_ready = TRUE; break; case 't': use_tep = TRUE; break; case 'T': use_page_limits = TRUE; break; case 'w': t30_state_to_wreck = atoi(optarg); break; default: //usage(); exit(2); break; } } input_wave_handle = AF_NULL_FILEHANDLE; if (input_audio_file_name) { if ((input_wave_handle = afOpenFile(input_audio_file_name, "r", NULL)) == AF_NULL_FILEHANDLE) { fprintf(stderr, " Cannot open wave file '%s'\n", input_audio_file_name); exit(2); } } filesetup = AF_NULL_FILESETUP; wave_handle = AF_NULL_FILEHANDLE; if (log_audio) { if ((filesetup = afNewFileSetup()) == AF_NULL_FILESETUP) { fprintf(stderr, " Failed to create file setup\n"); exit(2); } afInitSampleFormat(filesetup, AF_DEFAULT_TRACK, AF_SAMPFMT_TWOSCOMP, 16); afInitRate(filesetup, AF_DEFAULT_TRACK, (float) SAMPLE_RATE); afInitFileFormat(filesetup, AF_FILE_WAVE); afInitChannels(filesetup, AF_DEFAULT_TRACK, 2); if ((wave_handle = afOpenFile(OUTPUT_FILE_NAME_WAVE, "w", filesetup)) == AF_NULL_FILEHANDLE) { fprintf(stderr, " Cannot create wave file '%s'\n", OUTPUT_FILE_NAME_WAVE); exit(2); } } memset(silence, 0, sizeof(silence)); for (j = 0; j < FAX_MACHINES; j++) { machines[j].chan = j; mc = &machines[j]; i = mc->chan + 1; sprintf(buf, "%d%d%d%d%d%d%d%d", i, i, i, i, i, i, i, i); if (reverse_flow) fax_init(&mc->fax, (mc->chan & 1) ? TRUE : FALSE); else fax_init(&mc->fax, (mc->chan & 1) ? FALSE : TRUE); fax_set_transmit_on_idle(&mc->fax, use_transmit_on_idle); fax_set_tep_mode(&mc->fax, use_tep); t30 = fax_get_t30_state(&mc->fax); t30_set_tx_ident(t30, buf); t30_set_tx_sub_address(t30, "Sub-address"); t30_set_tx_sender_ident(t30, "Sender ID"); t30_set_tx_password(t30, "Password"); t30_set_tx_polled_sub_address(t30, "Polled sub-address"); t30_set_tx_selective_polling_address(t30, "Selective polling address"); t30_set_tx_page_header_info(t30, page_header_info); t30_set_tx_nsf(t30, (const uint8_t *) "\x50\x00\x00\x00Spandsp\x00", 12); t30_set_ecm_capability(t30, use_ecm); t30_set_supported_t30_features(t30, T30_SUPPORT_IDENTIFICATION | T30_SUPPORT_SELECTIVE_POLLING | T30_SUPPORT_SUB_ADDRESSING); if ((mc->chan & 1)) t30->local_min_scan_time_code = 4; t30_set_supported_image_sizes(t30, T30_SUPPORT_US_LETTER_LENGTH | T30_SUPPORT_US_LEGAL_LENGTH | T30_SUPPORT_UNLIMITED_LENGTH | T30_SUPPORT_215MM_WIDTH | T30_SUPPORT_255MM_WIDTH | T30_SUPPORT_303MM_WIDTH); t30_set_supported_resolutions(t30, T30_SUPPORT_STANDARD_RESOLUTION | T30_SUPPORT_FINE_RESOLUTION | T30_SUPPORT_SUPERFINE_RESOLUTION | T30_SUPPORT_R8_RESOLUTION | T30_SUPPORT_R16_RESOLUTION | T30_SUPPORT_300_300_RESOLUTION | T30_SUPPORT_400_400_RESOLUTION | T30_SUPPORT_600_600_RESOLUTION | T30_SUPPORT_1200_1200_RESOLUTION | T30_SUPPORT_300_600_RESOLUTION | T30_SUPPORT_400_800_RESOLUTION | T30_SUPPORT_600_1200_RESOLUTION); t30_set_supported_modems(t30, supported_modems); if (use_ecm) t30_set_supported_compressions(t30, T30_SUPPORT_T4_1D_COMPRESSION | T30_SUPPORT_T4_2D_COMPRESSION | T30_SUPPORT_T6_COMPRESSION); if ((mc->chan & 1)) { if (polled_mode) { if (use_page_limits) t30_set_tx_file(t30, input_tiff_file_name, 3, 6); else t30_set_tx_file(t30, input_tiff_file_name, -1, -1); } else { sprintf(buf, "fax_tests_%d.tif", (mc->chan + 1)/2); t30_set_rx_file(t30, buf, -1); } } else { if (polled_mode) { sprintf(buf, "fax_tests_%d.tif", (mc->chan + 1)/2); t30_set_rx_file(t30, buf, -1); } else { if (use_page_limits) t30_set_tx_file(t30, input_tiff_file_name, 3, 6); else t30_set_tx_file(t30, input_tiff_file_name, -1, -1); } } t30_set_phase_b_handler(t30, phase_b_handler, (void *) (intptr_t) mc->chan); t30_set_phase_d_handler(t30, phase_d_handler, (void *) (intptr_t) mc->chan); t30_set_phase_e_handler(t30, phase_e_handler, (void *) (intptr_t) mc->chan); t30_set_real_time_frame_handler(t30, real_time_frame_handler, (void *) (intptr_t) mc->chan); t30_set_document_handler(t30, document_handler, (void *) (intptr_t) mc->chan); sprintf(mc->tag, "FAX-%d", j + 1); span_log_set_level(&t30->logging, SPAN_LOG_SHOW_SEVERITY | SPAN_LOG_SHOW_PROTOCOL | SPAN_LOG_SHOW_TAG | SPAN_LOG_SHOW_SAMPLE_TIME | SPAN_LOG_FLOW); span_log_set_tag(&t30->logging, mc->tag); span_log_set_level(&mc->fax.fe.modems.v29_rx.logging, SPAN_LOG_SHOW_SEVERITY | SPAN_LOG_SHOW_PROTOCOL | SPAN_LOG_SHOW_TAG | SPAN_LOG_SHOW_SAMPLE_TIME | SPAN_LOG_FLOW); span_log_set_tag(&mc->fax.fe.modems.v29_rx.logging, mc->tag); span_log_set_level(&mc->fax.logging, SPAN_LOG_SHOW_SEVERITY | SPAN_LOG_SHOW_PROTOCOL | SPAN_LOG_SHOW_TAG | SPAN_LOG_SHOW_SAMPLE_TIME | SPAN_LOG_FLOW); span_log_set_tag(&mc->fax.logging, mc->tag); memset(mc->amp, 0, sizeof(mc->amp)); mc->total_audio_time = 0; mc->done = FALSE; } time(&start_time); for (;;) { alldone = TRUE; for (j = 0; j < FAX_MACHINES; j++) { mc = &machines[j]; if ((j & 1) == 0 && input_audio_file_name) { mc->len = afReadFrames(input_wave_handle, AF_DEFAULT_TRACK, mc->amp, SAMPLES_PER_CHUNK); if (mc->len == 0) break; } else { mc->len = fax_tx(&mc->fax, mc->amp, SAMPLES_PER_CHUNK); } mc->total_audio_time += SAMPLES_PER_CHUNK; if (!use_transmit_on_idle) { /* The receive side always expects a full block of samples, but the transmit side may not be sending any when it doesn't need to. We may need to pad with some silence. */ if (mc->len < SAMPLES_PER_CHUNK) { memset(mc->amp + mc->len, 0, sizeof(int16_t)*(SAMPLES_PER_CHUNK - mc->len)); mc->len = SAMPLES_PER_CHUNK; } } span_log_bump_samples(&mc->fax.t30.logging, mc->len); span_log_bump_samples(&mc->fax.fe.modems.v29_rx.logging, mc->len); span_log_bump_samples(&mc->fax.logging, mc->len); if (log_audio) { for (k = 0; k < mc->len; k++) out_amp[2*k + j] = mc->amp[k]; } if (machines[j ^ 1].len < SAMPLES_PER_CHUNK) memset(machines[j ^ 1].amp + machines[j ^ 1].len, 0, sizeof(int16_t)*(SAMPLES_PER_CHUNK - machines[j ^ 1].len)); if (use_line_hits) { /* TODO: This applies very crude line hits. improve it */ if (mc->fax.t30.state == 22) { if (++mc->error_delay == 100) { fprintf(stderr, "HIT %d!\n", j); mc->error_delay = 0; for (k = 0; k < 5; k++) mc->amp[k] = 0; } } } if (mc->fax.t30.state == t30_state_to_wreck) memset(machines[j ^ 1].amp, 0, sizeof(int16_t)*SAMPLES_PER_CHUNK); if (fax_rx(&mc->fax, machines[j ^ 1].amp, SAMPLES_PER_CHUNK)) break; if (!mc->done) alldone = FALSE; } if (log_audio) { outframes = afWriteFrames(wave_handle, AF_DEFAULT_TRACK, out_amp, SAMPLES_PER_CHUNK); if (outframes != SAMPLES_PER_CHUNK) break; } if (alldone || j < FAX_MACHINES) break; } time(&end_time); for (j = 0; j < FAX_MACHINES; j++) { mc = &machines[j]; fax_release(&mc->fax); } if (log_audio) { if (afCloseFile(wave_handle)) { fprintf(stderr, " Cannot close wave file '%s'\n", OUTPUT_FILE_NAME_WAVE); exit(2); } afFreeFileSetup(filesetup); } if (input_audio_file_name) { if (afCloseFile(input_wave_handle)) { fprintf(stderr, " Cannot close wave file '%s'\n", input_audio_file_name); exit(2); } afFreeFileSetup(filesetup); } printf("Total audio time = %ds (wall time %ds)\n", machines[0].total_audio_time/8000, (int) (end_time - start_time)); return 0; } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/tests/logging_tests.c0000644000175000017500000002050511150047203021242 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * logging_tests.c - Tests for the logging functions. * * Written by Steve Underwood * * Copyright (C) 2006 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2, as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: logging_tests.c,v 1.14 2008/05/13 13:17:26 steveu Exp $ */ /*! \page logging_tests_page Logging tests \section logging_tests_page_sec_1 What does it do? */ #if defined(HAVE_CONFIG_H) #include "config.h" #endif #define _POSIX_SOURCE #define _POSIX_C_SOURCE 200112L #include #include #include #include #include #include "spandsp.h" static int tests_failed = FALSE; static int msg_step = 0; static int msg2_step = 0; static int error_step = 0; static int msg_done = FALSE; static int msg2_done = FALSE; static int error_done = FALSE; static void message_handler(int level, const char *text) { const char *ref[] = { "TAG Log with tag 1 2 3\n", "Log with protocol 1 2 3\n", "FLOW NewTag Log with new tag 1 2 3\n", "FLOW Protocol NewTag Log with protocol 1 2 3\n", "FLOW Protocol NewTag Buf 00 01 02 03 04 05 06 07 08 09\n", "FLOW Protocol NewTag Buf 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f 20 21 22 23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f 30 31 32 33 34 35 36 37 38 39 3a 3b 3c 3d 3e 3f 40 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58 59 5a 5b 5c 5d 5e 5f 60 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 7b 7c 7d 7e 7f 80 81 82 83 84 85 86 87 88 89 8a 8b 8c 8d 8e 8f 90 91 92 93 94 95 96 97 98 99 9a 9b 9c 9d 9e 9f a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 aa ab ac ad ae af b0 b1 b2 b3 b4 b5 b6 b7 b8 b9 ba bb bc bd be bf c0 c1 c2 c3 c4 c5 c6 c7 c8 c9 ca cb cc cd ce cf d0 d1 d2 d3 d4 d5 d6 d7 d8 d9 da db dc dd de df e0 e1 e2 e3 e4 e5 e6 e7 e8 e9 ea eb ec ed ee ef f0 f1 f2 f3 f4 f5 f6 f7 f8 f9 fa fb fc fd fe ff 00 01 02 03 04 05 06 07 08 09\n", "00:00:00.000 FLOW Protocol NewTag Time tagged log 1 2 3\n", "00:00:00.020 FLOW Protocol NewTag Time tagged log 1 2 3\n", "00:00:00.040 FLOW Protocol NewTag Time tagged log 1 2 3\n", "00:00:00.060 FLOW Protocol NewTag Time tagged log 1 2 3\n", "00:00:00.080 FLOW Protocol NewTag Time tagged log 1 2 3\n", "00:00:00.100 FLOW Protocol NewTag Time tagged log 1 2 3\n", "00:00:00.120 FLOW Protocol NewTag Time tagged log 1 2 3\n", "00:00:00.140 FLOW Protocol NewTag Time tagged log 1 2 3\n", "00:00:00.160 FLOW Protocol NewTag Time tagged log 1 2 3\n", "00:00:00.180 FLOW Protocol NewTag Time tagged log 1 2 3\n", "" }; if (strcmp(ref[msg_step], text)) { printf(">>>: %s", ref[msg_step]); tests_failed = TRUE; } if (ref[++msg_step][0] == '\0') msg_done = TRUE; printf("MSG: %s", text); } /*- End of function --------------------------------------------------------*/ static void message_handler2(int level, const char *text) { /* TODO: This doesn't check if the date/time field makes sense */ if (strcmp(" FLOW Protocol NewTag Date/time tagged log 1 2 3\n", text + 23)) { printf(">>>: %s", text + 23); tests_failed = TRUE; } if (++msg2_step == 10) msg2_done = TRUE; printf("MSG: %s", text); } /*- End of function --------------------------------------------------------*/ static void error_handler(const char *text) { const char *ref[] = { "ERROR Log with severity log 1 2 3\n", "" }; if (strcmp(ref[error_step], text)) { printf(">>>: %s", ref[error_step]); tests_failed = TRUE; } if (ref[++error_step][0] == '\0') error_done = TRUE; printf("ERR: %s", text); } /*- End of function --------------------------------------------------------*/ int main(int argc, char *argv[]) { logging_state_t log; int i; uint8_t buf[1000]; struct timespec delay; /* Set up a logger */ if (span_log_init(&log, 123, "TAG")) { fprintf(stderr, "Failed to initialise log.\n"); exit(2); } /* Try it */ span_log_set_level(&log, SPAN_LOG_SHOW_SEVERITY | SPAN_LOG_SHOW_PROTOCOL | SPAN_LOG_SHOW_TAG | SPAN_LOG_FLOW); if (span_log(&log, SPAN_LOG_FLOW, "Logging to fprintf, as simple as %d %d %d\n", 1, 2, 3)) fprintf(stderr, "Logged.\n"); else fprintf(stderr, "Not logged.\n"); /* Now set a custom log handler */ span_log_set_message_handler(&log, &message_handler); span_log_set_error_handler(&log, &error_handler); span_log_set_sample_rate(&log, 44100); /* Try the different logging elements */ span_log_set_level(&log, SPAN_LOG_SHOW_TAG | SPAN_LOG_FLOW); if (span_log(&log, SPAN_LOG_FLOW, "Log with tag %d %d %d\n", 1, 2, 3)) fprintf(stderr, "Logged.\n"); else fprintf(stderr, "Not logged.\n"); span_log_set_level(&log, SPAN_LOG_SHOW_PROTOCOL | SPAN_LOG_FLOW); if (span_log(&log, SPAN_LOG_FLOW, "Log with protocol %d %d %d\n", 1, 2, 3)) fprintf(stderr, "Logged.\n"); else fprintf(stderr, "Not logged.\n"); span_log_set_level(&log, SPAN_LOG_SHOW_SEVERITY | SPAN_LOG_FLOW); if (span_log(&log, SPAN_LOG_ERROR, "Log with severity log %d %d %d\n", 1, 2, 3)) fprintf(stderr, "Logged.\n"); else fprintf(stderr, "Not logged.\n"); span_log_set_level(&log, SPAN_LOG_SHOW_SEVERITY | SPAN_LOG_SHOW_PROTOCOL | SPAN_LOG_SHOW_TAG | SPAN_LOG_FLOW); span_log_set_tag(&log, "NewTag"); if (span_log(&log, SPAN_LOG_FLOW, "Log with new tag %d %d %d\n", 1, 2, 3)) fprintf(stderr, "Logged.\n"); else fprintf(stderr, "Not logged.\n"); span_log_set_protocol(&log, "Protocol"); if (span_log(&log, SPAN_LOG_FLOW, "Log with protocol %d %d %d\n", 1, 2, 3)) fprintf(stderr, "Logged.\n"); else fprintf(stderr, "Not logged.\n"); /* Test logging of buffer contents */ for (i = 0; i < 1000; i++) buf[i] = i; if (span_log_buf(&log, SPAN_LOG_FLOW, "Buf", buf, 10)) fprintf(stderr, "Logged.\n"); else fprintf(stderr, "Not logged.\n"); if (span_log_buf(&log, SPAN_LOG_FLOW, "Buf", buf, 1000)) fprintf(stderr, "Logged.\n"); else fprintf(stderr, "Not logged.\n"); /* Test the correct severities will be logged */ for (i = 0; i < 10; i++) { if (!span_log_test(&log, i)) { if (i != 6) tests_failed = TRUE; break; } } /* Check timestamping by samples */ span_log_set_level(&log, SPAN_LOG_SHOW_SEVERITY | SPAN_LOG_SHOW_PROTOCOL | SPAN_LOG_SHOW_TAG | SPAN_LOG_FLOW | SPAN_LOG_SHOW_SAMPLE_TIME); for (i = 0; i < 10; i++) { span_log(&log, SPAN_LOG_FLOW, "Time tagged log %d %d %d\n", 1, 2, 3); span_log_bump_samples(&log, 441*2); } /* Check timestamping by current date and time */ span_log_set_message_handler(&log, &message_handler2); span_log_set_level(&log, SPAN_LOG_SHOW_SEVERITY | SPAN_LOG_SHOW_PROTOCOL | SPAN_LOG_SHOW_TAG | SPAN_LOG_FLOW | SPAN_LOG_SHOW_DATE); for (i = 0; i < 10; i++) { span_log(&log, SPAN_LOG_FLOW, "Date/time tagged log %d %d %d\n", 1, 2, 3); delay.tv_sec = 0; delay.tv_nsec = 20000000; nanosleep(&delay, NULL); } if (tests_failed || !msg_done || !error_done) { printf("Tests failed - %d %d %d.\n", tests_failed, msg_done, error_done); return 2; } span_log_set_message_handler(&log, &message_handler); printf("Tests passed.\n"); return 0; } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/tests/plc_tests.c0000644000175000017500000001360311150047203020373 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * plc_tests.c * * Written by Steve Underwood * * Copyright (C) 2004 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2, as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: plc_tests.c,v 1.25 2008/05/13 13:17:26 steveu Exp $ */ /*! \page plc_tests_page Packet loss concealment tests \section plc_tests_page_sec_1 What does it do? These tests run a speech file through the packet loss concealment routines. The loss rate, in percent, and the packet size, in samples, may be specified on the command line. \section plc_tests_page_sec_2 How are the tests run? These tests process a speech file called pre_plc.wav. This file should contain 8000 sample/second 16 bits/sample linear audio. The tests read this file in blocks, of a size specified on the command line. Some of these blocks are dropped, to simulate packet loss. The rate of loss is also specified on the command line. The PLC module is then used to reconstruct an acceptable approximation to the original signal. The resulting audio is written to a new audio file, called post_plc.wav. This file contains 8000 sample/second 16 bits/sample linear audio. */ #if defined(HAVE_CONFIG_H) #include "config.h" #endif #include #include #include #include #include #include "spandsp.h" #define INPUT_FILE_NAME "../test-data/local/short_nb_voice.wav" #define OUTPUT_FILE_NAME "post_plc.wav" int main(int argc, char *argv[]) { AFfilehandle inhandle; AFfilehandle outhandle; AFfilesetup filesetup; plc_state_t plc; int inframes; int outframes; int16_t amp[1024]; int block_no; int lost_blocks; int block_len; int loss_rate; int dropit; int block_real; int block_synthetic; int tone; int i; uint32_t phase_acc; int32_t phase_rate; int opt; loss_rate = 25; block_len = 160; block_real = FALSE; block_synthetic = FALSE; tone = -1; while ((opt = getopt(argc, argv, "b:l:rst:")) != -1) { switch (opt) { case 'b': block_len = atoi(optarg); break; case 'l': loss_rate = atoi(optarg); break; case 'r': block_real = TRUE; break; case 's': block_synthetic = TRUE; break; case 't': tone = atoi(optarg); break; } } if ((filesetup = afNewFileSetup()) == AF_NULL_FILESETUP) { fprintf(stderr, " Failed to create file setup\n"); exit(2); } afInitSampleFormat(filesetup, AF_DEFAULT_TRACK, AF_SAMPFMT_TWOSCOMP, 16); afInitRate(filesetup, AF_DEFAULT_TRACK, (float) SAMPLE_RATE); afInitFileFormat(filesetup, AF_FILE_WAVE); afInitChannels(filesetup, AF_DEFAULT_TRACK, 1); phase_rate = 0; inhandle = NULL; if (tone < 0) { if ((inhandle = afOpenFile(INPUT_FILE_NAME, "r", NULL)) == AF_NULL_FILEHANDLE) { fprintf(stderr, " Failed to open wave file '%s'\n", INPUT_FILE_NAME); exit(2); } } else { phase_rate = dds_phase_ratef((float) tone); } if ((outhandle = afOpenFile(OUTPUT_FILE_NAME, "w", filesetup)) == AF_NULL_FILEHANDLE) { fprintf(stderr, " Failed to open wave file '%s'\n", OUTPUT_FILE_NAME); exit(2); } plc_init(&plc); lost_blocks = 0; for (block_no = 0; ; block_no++) { if (tone < 0) { inframes = afReadFrames(inhandle, AF_DEFAULT_TRACK, amp, block_len); if (inframes != block_len) break; } else { if (block_no > 10000) break; for (i = 0; i < block_len; i++) amp[i] = (int16_t) dds_modf(&phase_acc, phase_rate, 10000.0, 0); inframes = block_len; } dropit = rand()/(RAND_MAX/100); if (dropit > loss_rate) { plc_rx(&plc, amp, inframes); if (block_real) memset(amp, 0, sizeof(int16_t)*inframes); } else { lost_blocks++; plc_fillin(&plc, amp, inframes); if (block_synthetic) memset(amp, 0, sizeof(int16_t)*inframes); } outframes = afWriteFrames(outhandle, AF_DEFAULT_TRACK, amp, inframes); if (outframes != inframes) { fprintf(stderr, " Error writing out sound\n"); exit(2); } } printf("Dropped %d of %d blocks\n", lost_blocks, block_no); if (tone < 0) { if (afCloseFile(inhandle) != 0) { fprintf(stderr, " Cannot close wave file '%s'\n", INPUT_FILE_NAME); exit(2); } } if (afCloseFile(outhandle) != 0) { fprintf(stderr, " Cannot close wave file '%s'\n", OUTPUT_FILE_NAME); exit(2); } afFreeFileSetup(filesetup); return 0; } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/tests/oki_adpcm_tests.c0000644000175000017500000001701111150047203021540 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * oki_adpcm_tests.c - Test the Oki (Dialogic) ADPCM encode and decode * software at 24kbps and 32kbps. * * Written by Steve Underwood * * Copyright (C) 2004 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2, as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: oki_adpcm_tests.c,v 1.31 2008/05/13 13:17:26 steveu Exp $ */ /*! \file */ /*! \page oki_adpcm_tests_page OKI (Dialogic) ADPCM tests \section oki_adpcm_tests_page_sec_1 What does it do? To perform a general audio quality test, oki_adpcm_tests should be run. The test file ../test-data/local/short_nb_voice.wav will be compressed to the specified bit rate, decompressed, and the resulting audio stored in post_oki_adpcm.wav. A simple SNR test is automatically performed. Listening tests may be used for a more detailed evaluation of the degradation in quality caused by the compression. Both 32k bps and 24k bps compression may be tested. \section oki_adpcm_tests_page_sec_2 How is it used? */ #if defined(HAVE_CONFIG_H) #include "config.h" #endif #include #include #include #include #include #include #include #include "spandsp.h" #define IN_FILE_NAME "../test-data/local/short_nb_voice.wav" #define OUT_FILE_NAME "post_oki_adpcm.wav" #define HIST_LEN 1000 int main(int argc, char *argv[]) { int i; AFfilehandle inhandle; AFfilehandle outhandle; AFfilesetup filesetup; int frames; int dec_frames; int outframes; int oki_bytes; int bit_rate; float x; double pre_energy; double post_energy; double diff_energy; int16_t pre_amp[HIST_LEN]; int16_t post_amp[HIST_LEN]; uint8_t oki_data[HIST_LEN]; int16_t history[HIST_LEN]; int hist_in; int hist_out; oki_adpcm_state_t *oki_enc_state; oki_adpcm_state_t *oki_dec_state; int xx; int total_pre_samples; int total_compressed_bytes; int total_post_samples; const char *in_file_name; int log_encoded_data; int opt; bit_rate = 32000; in_file_name = IN_FILE_NAME; log_encoded_data = FALSE; while ((opt = getopt(argc, argv, "2i:l")) != -1) { switch (opt) { case '2': bit_rate = 24000; break; case 'i': in_file_name = optarg; break; case 'l': log_encoded_data = TRUE; break; default: //usage(); exit(2); break; } } if ((inhandle = afOpenFile(in_file_name, "r", 0)) == AF_NULL_FILEHANDLE) { fprintf(stderr, " Cannot open wave file '%s'\n", in_file_name); exit(2); } if ((x = afGetFrameSize(inhandle, AF_DEFAULT_TRACK, 1)) != 2.0) { fprintf(stderr, " Unexpected frame size in wave file '%s'\n", in_file_name); exit(2); } if ((x = afGetRate(inhandle, AF_DEFAULT_TRACK)) != (float) SAMPLE_RATE) { fprintf(stderr, " Unexpected sample rate in wave file '%s'\n", in_file_name); exit(2); } if ((x = afGetChannels(inhandle, AF_DEFAULT_TRACK)) != 1.0) { fprintf(stderr, " Unexpected number of channels in wave file '%s'\n", in_file_name); exit(2); } if ((filesetup = afNewFileSetup()) == AF_NULL_FILESETUP) { fprintf(stderr, " Failed to create file setup\n"); exit(2); } afInitSampleFormat(filesetup, AF_DEFAULT_TRACK, AF_SAMPFMT_TWOSCOMP, 16); afInitRate(filesetup, AF_DEFAULT_TRACK, (float) SAMPLE_RATE); afInitFileFormat(filesetup, AF_FILE_WAVE); afInitChannels(filesetup, AF_DEFAULT_TRACK, 1); outhandle = afOpenFile(OUT_FILE_NAME, "w", filesetup); if (outhandle == AF_NULL_FILEHANDLE) { fprintf(stderr, " Cannot create wave file '%s'\n", OUT_FILE_NAME); exit(2); } if ((oki_enc_state = oki_adpcm_init(NULL, bit_rate)) == NULL) { fprintf(stderr, " Cannot create encoder\n"); exit(2); } if ((oki_dec_state = oki_adpcm_init(NULL, bit_rate)) == NULL) { fprintf(stderr, " Cannot create decoder\n"); exit(2); } hist_in = 0; if (bit_rate == 32000) hist_out = 0; else hist_out = HIST_LEN - 27; memset(history, 0, sizeof(history)); pre_energy = 0.0; post_energy = 0.0; diff_energy = 0.0; total_pre_samples = 0; total_compressed_bytes = 0; total_post_samples = 0; while ((frames = afReadFrames(inhandle, AF_DEFAULT_TRACK, pre_amp, 159))) { total_pre_samples += frames; oki_bytes = oki_adpcm_encode(oki_enc_state, oki_data, pre_amp, frames); if (log_encoded_data) write(1, oki_data, oki_bytes); total_compressed_bytes += oki_bytes; dec_frames = oki_adpcm_decode(oki_dec_state, post_amp, oki_data, oki_bytes); total_post_samples += dec_frames; for (i = 0; i < frames; i++) { history[hist_in++] = pre_amp[i]; if (hist_in >= HIST_LEN) hist_in = 0; pre_energy += (double) pre_amp[i] * (double) pre_amp[i]; } for (i = 0; i < dec_frames; i++) { post_energy += (double) post_amp[i] * (double) post_amp[i]; xx = post_amp[i] - history[hist_out++]; if (hist_out >= HIST_LEN) hist_out = 0; diff_energy += (double) xx * (double) xx; //post_amp[i] = xx; } outframes = afWriteFrames(outhandle, AF_DEFAULT_TRACK, post_amp, dec_frames); } if (afCloseFile(inhandle) != 0) { fprintf(stderr, " Cannot close wave file '%s'\n", in_file_name); exit(2); } if (afCloseFile(outhandle) != 0) { fprintf(stderr, " Cannot close wave file '%s'\n", OUT_FILE_NAME); exit(2); } afFreeFileSetup(filesetup); oki_adpcm_release(oki_enc_state); oki_adpcm_release(oki_dec_state); printf("Pre samples: %d\n", total_pre_samples); printf("Compressed bytes: %d\n", total_compressed_bytes); printf("Post samples: %d\n", total_post_samples); printf("Output energy is %f%% of input energy.\n", 100.0*post_energy/pre_energy); printf("Residual energy is %f%% of the total.\n", 100.0*diff_energy/post_energy); if (bit_rate == 32000) { if (fabs(1.0 - post_energy/pre_energy) > 0.05 || fabs(diff_energy/post_energy) > 0.03) { printf("Tests failed.\n"); exit(2); } } else { if (fabs(1.0 - post_energy/pre_energy) > 0.20 || fabs(diff_energy/post_energy) > 0.10) { printf("Tests failed.\n"); exit(2); } } printf("Tests passed.\n"); return 0; } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/tests/fsk_tests.c0000644000175000017500000005000411150047203020374 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * fsk_tests.c - Tests for the low speed FSK modem code (V.21, V.23, etc.). * * Written by Steve Underwood * * Copyright (C) 2003 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2, as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: fsk_tests.c,v 1.45 2008/07/16 17:01:49 steveu Exp $ */ /*! \page fsk_tests_page FSK modem tests \section fsk_tests_page_sec_1 What does it do? These tests allow either: - An FSK transmit modem to feed an FSK receive modem, of the same type, through a telephone line model. BER testing is then used to evaluate performance under various line conditions. This is effective for testing the basic performance of the receive modem. It is also the only test mode provided for evaluating the transmit modem. - An FSK receive modem is used to decode FSK audio, stored in a wave file. This is good way to evaluate performance with audio recorded from other models of modem, and with real world problematic telephone lines. \section fsk_tests_page_sec_2 How does it work? */ #if defined(HAVE_CONFIG_H) #include "config.h" #endif #include #include #include #include #include #include #include "spandsp.h" #include "spandsp-sim.h" #define BLOCK_LEN 160 #define OUTPUT_FILE_NAME "fsk.wav" char *decode_test_file = NULL; both_ways_line_model_state_t *model; int rx_bits = 0; int cutoff_test_carrier = FALSE; static int rx_status(void *user_data, int status) { printf("FSK rx status is %d\n", status); switch (status) { case PUTBIT_TRAINING_FAILED: printf("Training failed\n"); break; case PUTBIT_TRAINING_SUCCEEDED: printf("Training succeeded\n"); break; case PUTBIT_CARRIER_UP: printf("Carrier up\n"); break; case PUTBIT_CARRIER_DOWN: printf("Carrier down\n"); break; default: printf("Eh! - %d\n", status); break; } return 0; } /*- End of function --------------------------------------------------------*/ static int tx_status(void *user_data, int status) { switch (status) { case MODEM_TX_STATUS_DATA_EXHAUSTED: printf("FSK tx data exhausted\n"); break; case MODEM_TX_STATUS_SHUTDOWN_COMPLETE: printf("FSK tx shutdown complete\n"); break; default: printf("FSK tx status is %d\n", status); break; } return 0; } /*- End of function --------------------------------------------------------*/ static void put_bit(void *user_data, int bit) { if (bit < 0) { rx_status(user_data, bit); return; } printf("Rx bit %d - %d\n", rx_bits++, bit); } /*- End of function --------------------------------------------------------*/ static int cutoff_test_rx_status(void *user_data, int status) { printf("FSK rx status is %d\n", status); switch (status) { case PUTBIT_TRAINING_FAILED: printf("Training failed\n"); break; case PUTBIT_TRAINING_SUCCEEDED: printf("Training succeeded\n"); break; case PUTBIT_CARRIER_UP: //printf("Carrier up\n"); cutoff_test_carrier = TRUE; break; case PUTBIT_CARRIER_DOWN: //printf("Carrier down\n"); cutoff_test_carrier = FALSE; break; default: printf("Eh! - %d\n", status); break; } return 0; } /*- End of function --------------------------------------------------------*/ static void cutoff_test_put_bit(void *user_data, int bit) { if (bit < 0) { cutoff_test_rx_status(user_data, bit); return; } } /*- End of function --------------------------------------------------------*/ static void reporter(void *user_data, int reason, bert_results_t *results) { int channel; channel = (int) (intptr_t) user_data; switch (reason) { case BERT_REPORT_SYNCED: printf("%d: BERT report synced\n", channel); break; case BERT_REPORT_UNSYNCED: printf("%d: BERT report unsync'ed\n", channel); break; case BERT_REPORT_REGULAR: printf("%d: BERT report regular - %d bits, %d bad bits, %d resyncs\n", channel, results->total_bits, results->bad_bits, results->resyncs); break; case BERT_REPORT_GT_10_2: printf("%d: BERT report > 1 in 10^2\n", channel); break; case BERT_REPORT_LT_10_2: printf("%d: BERT report < 1 in 10^2\n", channel); break; case BERT_REPORT_LT_10_3: printf("%d: BERT report < 1 in 10^3\n", channel); break; case BERT_REPORT_LT_10_4: printf("%d: BERT report < 1 in 10^4\n", channel); break; case BERT_REPORT_LT_10_5: printf("%d: BERT report < 1 in 10^5\n", channel); break; case BERT_REPORT_LT_10_6: printf("%d: BERT report < 1 in 10^6\n", channel); break; case BERT_REPORT_LT_10_7: printf("%d: BERT report < 1 in 10^7\n", channel); break; default: printf("%d: BERT report reason %d\n", channel, reason); break; } } /*- End of function --------------------------------------------------------*/ int main(int argc, char *argv[]) { fsk_tx_state_t caller_tx; fsk_rx_state_t caller_rx; fsk_tx_state_t answerer_tx; fsk_rx_state_t answerer_rx; bert_state_t caller_bert; bert_state_t answerer_bert; bert_results_t bert_results; power_meter_t caller_meter; power_meter_t answerer_meter; int16_t caller_amp[BLOCK_LEN]; int16_t answerer_amp[BLOCK_LEN]; int16_t caller_model_amp[BLOCK_LEN]; int16_t answerer_model_amp[BLOCK_LEN]; int16_t out_amp[2*BLOCK_LEN]; AFfilehandle inhandle; AFfilehandle outhandle; AFfilesetup filesetup; int outframes; int i; int j; int samples; int test_bps; int noise_level; int noise_sweep; int bits_per_test; int line_model_no; int modem_under_test_1; int modem_under_test_2; int modems_set; int log_audio; int channel_codec; int rbs_pattern; int on_at; int off_at; tone_gen_descriptor_t tone_desc; tone_gen_state_t tone_tx; int opt; channel_codec = MUNGE_CODEC_NONE; rbs_pattern = 0; line_model_no = 0; decode_test_file = NULL; noise_sweep = FALSE; modem_under_test_1 = FSK_V21CH1; modem_under_test_2 = FSK_V21CH2; log_audio = FALSE; modems_set = 0; while ((opt = getopt(argc, argv, "c:dlm:nr:s:")) != -1) { switch (opt) { case 'c': channel_codec = atoi(optarg); break; case 'd': decode_test_file = optarg; break; case 'l': log_audio = TRUE; break; case 'm': line_model_no = atoi(optarg); break; case 'n': noise_sweep = TRUE; break; case 'r': rbs_pattern = atoi(optarg); break; case 's': switch (modems_set++) { case 0: modem_under_test_1 = atoi(optarg); break; case 1: modem_under_test_2 = atoi(optarg); break; } break; default: //usage(); exit(2); break; } } if (modem_under_test_1 >= 0) printf("Modem channel 1 is '%s'\n", preset_fsk_specs[modem_under_test_1].name); if (modem_under_test_2 >= 0) printf("Modem channel 2 is '%s'\n", preset_fsk_specs[modem_under_test_2].name); filesetup = AF_NULL_FILESETUP; outhandle = AF_NULL_FILEHANDLE; if (log_audio) { if ((filesetup = afNewFileSetup()) == AF_NULL_FILESETUP) { fprintf(stderr, " Failed to create file setup\n"); exit(2); } afInitSampleFormat(filesetup, AF_DEFAULT_TRACK, AF_SAMPFMT_TWOSCOMP, 16); afInitRate(filesetup, AF_DEFAULT_TRACK, (float) SAMPLE_RATE); afInitFileFormat(filesetup, AF_FILE_WAVE); afInitChannels(filesetup, AF_DEFAULT_TRACK, 2); if ((outhandle = afOpenFile(OUTPUT_FILE_NAME, "w", filesetup)) == AF_NULL_FILEHANDLE) { fprintf(stderr, " Cannot create wave file '%s'\n", OUTPUT_FILE_NAME); exit(2); } } noise_level = -200; bits_per_test = 0; inhandle = NULL; memset(caller_amp, 0, sizeof(*caller_amp)); memset(answerer_amp, 0, sizeof(*answerer_amp)); memset(caller_model_amp, 0, sizeof(*caller_model_amp)); memset(answerer_model_amp, 0, sizeof(*answerer_model_amp)); power_meter_init(&caller_meter, 7); power_meter_init(&answerer_meter, 7); if (decode_test_file) { if ((inhandle = afOpenFile(decode_test_file, "r", NULL)) == AF_NULL_FILEHANDLE) { fprintf(stderr, " Cannot open wave file '%s'\n", decode_test_file); exit(2); } fsk_rx_init(&caller_rx, &preset_fsk_specs[modem_under_test_1], TRUE, put_bit, NULL); fsk_rx_set_modem_status_handler(&caller_rx, rx_status, (void *) &caller_rx); test_bps = preset_fsk_specs[modem_under_test_1].baud_rate; for (;;) { samples = afReadFrames(inhandle, AF_DEFAULT_TRACK, caller_model_amp, BLOCK_LEN); if (samples < BLOCK_LEN) break; for (i = 0; i < samples; i++) power_meter_update(&caller_meter, caller_model_amp[i]); fsk_rx(&caller_rx, caller_model_amp, samples); } if (afCloseFile(inhandle) != 0) { fprintf(stderr, " Cannot close wave file '%s'\n", decode_test_file); exit(2); } } else { printf("Test cutoff level\n"); fsk_rx_init(&caller_rx, &preset_fsk_specs[modem_under_test_1], TRUE, cutoff_test_put_bit, NULL); fsk_rx_signal_cutoff(&caller_rx, -30.0f); fsk_rx_set_modem_status_handler(&caller_rx, cutoff_test_rx_status, (void *) &caller_rx); on_at = 0; for (i = -40; i < -25; i++) { make_tone_gen_descriptor(&tone_desc, 1500, i, 0, 0, 1, 0, 0, 0, TRUE); tone_gen_init(&tone_tx, &tone_desc); for (j = 0; j < 10; j++) { samples = tone_gen(&tone_tx, caller_model_amp, 160); fsk_rx(&caller_rx, caller_model_amp, samples); } if (cutoff_test_carrier) break; } on_at = i; off_at = 0; for ( ; i > -40; i--) { make_tone_gen_descriptor(&tone_desc, 1500, i, 0, 0, 1, 0, 0, 0, TRUE); tone_gen_init(&tone_tx, &tone_desc); for (j = 0; j < 10; j++) { samples = tone_gen(&tone_tx, caller_model_amp, 160); fsk_rx(&caller_rx, caller_model_amp, samples); } if (!cutoff_test_carrier) break; } off_at = i; printf("Carrier on at %d, off at %d\n", on_at, off_at); if (on_at < -29 || on_at > -26 || off_at < -35 || off_at > -31) { printf("Tests failed.\n"); exit(2); } printf("Test with BERT\n"); test_bps = preset_fsk_specs[modem_under_test_1].baud_rate; if (modem_under_test_1 >= 0) { fsk_tx_init(&caller_tx, &preset_fsk_specs[modem_under_test_1], (get_bit_func_t) bert_get_bit, &caller_bert); fsk_tx_set_modem_status_handler(&caller_tx, tx_status, (void *) &caller_tx); fsk_rx_init(&answerer_rx, &preset_fsk_specs[modem_under_test_1], TRUE, (put_bit_func_t) bert_put_bit, &answerer_bert); fsk_rx_set_modem_status_handler(&answerer_rx, rx_status, (void *) &answerer_rx); } if (modem_under_test_2 >= 0) { fsk_tx_init(&answerer_tx, &preset_fsk_specs[modem_under_test_2], (get_bit_func_t) bert_get_bit, &answerer_bert); fsk_tx_set_modem_status_handler(&answerer_tx, tx_status, (void *) &answerer_tx); fsk_rx_init(&caller_rx, &preset_fsk_specs[modem_under_test_2], TRUE, (put_bit_func_t) bert_put_bit, &caller_bert); fsk_rx_set_modem_status_handler(&caller_rx, rx_status, (void *) &caller_rx); } test_bps = preset_fsk_specs[modem_under_test_1].baud_rate; bits_per_test = 500000; noise_level = -24; bert_init(&caller_bert, bits_per_test, BERT_PATTERN_ITU_O152_11, test_bps, 20); bert_set_report(&caller_bert, 100000, reporter, (void *) (intptr_t) 1); bert_init(&answerer_bert, bits_per_test, BERT_PATTERN_ITU_O152_11, test_bps, 20); bert_set_report(&answerer_bert, 100000, reporter, (void *) (intptr_t) 2); if ((model = both_ways_line_model_init(line_model_no, (float) noise_level, line_model_no, noise_level, channel_codec, rbs_pattern)) == NULL) { fprintf(stderr, " Failed to create line model\n"); exit(2); } for (;;) { samples = fsk_tx(&caller_tx, caller_amp, BLOCK_LEN); for (i = 0; i < samples; i++) power_meter_update(&caller_meter, caller_amp[i]); samples = fsk_tx(&answerer_tx, answerer_amp, BLOCK_LEN); for (i = 0; i < samples; i++) power_meter_update(&answerer_meter, answerer_amp[i]); both_ways_line_model(model, caller_model_amp, caller_amp, answerer_model_amp, answerer_amp, samples); //printf("Powers %10.5fdBm0 %10.5fdBm0\n", power_meter_current_dbm0(&caller_meter), power_meter_current_dbm0(&answerer_meter)); fsk_rx(&answerer_rx, caller_model_amp, samples); for (i = 0; i < samples; i++) out_amp[2*i] = caller_model_amp[i]; for ( ; i < BLOCK_LEN; i++) out_amp[2*i] = 0; fsk_rx(&caller_rx, answerer_model_amp, samples); for (i = 0; i < samples; i++) out_amp[2*i + 1] = answerer_model_amp[i]; for ( ; i < BLOCK_LEN; i++) out_amp[2*i + 1] = 0; if (log_audio) { outframes = afWriteFrames(outhandle, AF_DEFAULT_TRACK, out_amp, BLOCK_LEN); if (outframes != BLOCK_LEN) { fprintf(stderr, " Error writing wave file\n"); exit(2); } } if (samples < BLOCK_LEN) { bert_result(&caller_bert, &bert_results); fprintf(stderr, "%ddB AWGN, %d bits, %d bad bits, %d resyncs\n", noise_level, bert_results.total_bits, bert_results.bad_bits, bert_results.resyncs); if (!noise_sweep) { if (bert_results.total_bits != bits_per_test - 43 || bert_results.bad_bits != 0 || bert_results.resyncs != 0) { printf("Tests failed.\n"); exit(2); } } bert_result(&answerer_bert, &bert_results); fprintf(stderr, "%ddB AWGN, %d bits, %d bad bits, %d resyncs\n", noise_level, bert_results.total_bits, bert_results.bad_bits, bert_results.resyncs); if (!noise_sweep) { if (bert_results.total_bits != bits_per_test - 43 || bert_results.bad_bits != 0 || bert_results.resyncs != 0) { printf("Tests failed.\n"); exit(2); } break; } /* Put a little silence between the chunks in the file. */ memset(out_amp, 0, sizeof(out_amp)); if (log_audio) { for (i = 0; i < 200; i++) { outframes = afWriteFrames(outhandle, AF_DEFAULT_TRACK, out_amp, BLOCK_LEN); } } if (modem_under_test_1 >= 0) { fsk_tx_init(&caller_tx, &preset_fsk_specs[modem_under_test_1], (get_bit_func_t) bert_get_bit, &caller_bert); fsk_tx_set_modem_status_handler(&caller_tx, tx_status, (void *) &caller_tx); fsk_rx_init(&answerer_rx, &preset_fsk_specs[modem_under_test_1], TRUE, (put_bit_func_t) bert_put_bit, &answerer_bert); fsk_rx_set_modem_status_handler(&answerer_rx, rx_status, (void *) &answerer_rx); } if (modem_under_test_2 >= 0) { fsk_tx_init(&answerer_tx, &preset_fsk_specs[modem_under_test_2], (get_bit_func_t) bert_get_bit, &answerer_bert); fsk_tx_set_modem_status_handler(&answerer_tx, tx_status, (void *) &answerer_tx); fsk_rx_init(&caller_rx, &preset_fsk_specs[modem_under_test_2], TRUE, (put_bit_func_t) bert_put_bit, &caller_bert); fsk_rx_set_modem_status_handler(&caller_rx, rx_status, (void *) &caller_rx); } noise_level++; if ((model = both_ways_line_model_init(line_model_no, (float) noise_level, line_model_no, noise_level, channel_codec, 0)) == NULL) { fprintf(stderr, " Failed to create line model\n"); exit(2); } bert_init(&caller_bert, bits_per_test, BERT_PATTERN_ITU_O152_11, test_bps, 20); bert_set_report(&caller_bert, 100000, reporter, (void *) (intptr_t) 1); bert_init(&answerer_bert, bits_per_test, BERT_PATTERN_ITU_O152_11, test_bps, 20); bert_set_report(&answerer_bert, 100000, reporter, (void *) (intptr_t) 2); } } printf("Tests passed.\n"); } if (log_audio) { if (afCloseFile(outhandle) != 0) { fprintf(stderr, " Cannot close wave file '%s'\n", OUTPUT_FILE_NAME); exit(2); } afFreeFileSetup(filesetup); } return 0; } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/tests/g711_tests.c0000644000175000017500000002432511150047203020277 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * g711_tests.c * * Written by Steve Underwood * * Copyright (C) 2006 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2, as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: g711_tests.c,v 1.12 2008/05/13 13:17:25 steveu Exp $ */ /*! \page g711_tests_page A-law and u-law conversion tests \section g711_tests_page_sec_1 What does it do? \section g711_tests_page_sec_2 How is it used? */ #if defined(HAVE_CONFIG_H) #include "config.h" #endif #include #include #include #include #include #include "spandsp.h" #define OUT_FILE_NAME "g711.wav" int16_t amp[65536]; uint8_t ulaw_data[65536]; uint8_t alaw_data[65536]; const uint8_t alaw_1khz_sine[] = {0x34, 0x21, 0x21, 0x34, 0xB4, 0xA1, 0xA1, 0xB4}; const uint8_t ulaw_1khz_sine[] = {0x1E, 0x0B, 0x0B, 0x1E, 0x9E, 0x8B, 0x8B, 0x9E}; int main(int argc, char *argv[]) { AFfilehandle outhandle; AFfilesetup filesetup; power_meter_t power_meter; int outframes; int i; int block; int pre; int post; int post_post; int alaw_failures; int ulaw_failures; float worst_alaw; float worst_ulaw; float tmp; int len; g711_state_t *encode; g711_state_t *transcode; g711_state_t *decode; if ((filesetup = afNewFileSetup()) == AF_NULL_FILESETUP) { fprintf(stderr, " Failed to create file setup\n"); exit(2); } afInitSampleFormat(filesetup, AF_DEFAULT_TRACK, AF_SAMPFMT_TWOSCOMP, 16); afInitRate(filesetup, AF_DEFAULT_TRACK, (float) SAMPLE_RATE); afInitFileFormat(filesetup, AF_FILE_WAVE); afInitChannels(filesetup, AF_DEFAULT_TRACK, 1); if ((outhandle = afOpenFile(OUT_FILE_NAME, "w", filesetup)) == AF_NULL_FILEHANDLE) { fprintf(stderr, " Cannot create wave file '%s'\n", OUT_FILE_NAME); exit(2); } printf("Conversion accuracy tests.\n"); alaw_failures = 0; ulaw_failures = 0; worst_alaw = 0.0; worst_ulaw = 0.0; for (block = 0; block < 1; block++) { for (i = 0; i < 65536; i++) { pre = i - 32768; post = alaw_to_linear(linear_to_alaw(pre)); if (abs(pre) > 140) { tmp = (float) abs(post - pre)/(float) abs(pre); if (tmp > 0.10) { printf("A-law: Excessive error at %d (%d)\n", pre, post); alaw_failures++; } if (tmp > worst_alaw) worst_alaw = tmp; } else { /* Small values need different handling for sensible measurement */ if (abs(post - pre) > 15) { printf("A-law: Excessive error at %d (%d)\n", pre, post); alaw_failures++; } } amp[i] = post; } outframes = afWriteFrames(outhandle, AF_DEFAULT_TRACK, amp, 65536); if (outframes != 65536) { fprintf(stderr, " Error writing wave file\n"); exit(2); } for (i = 0; i < 65536; i++) { pre = i - 32768; post = ulaw_to_linear(linear_to_ulaw(pre)); if (abs(pre) > 40) { tmp = (float) abs(post - pre)/(float) abs(pre); if (tmp > 0.10) { printf("u-law: Excessive error at %d (%d)\n", pre, post); ulaw_failures++; } if (tmp > worst_ulaw) worst_ulaw = tmp; } else { /* Small values need different handling for sensible measurement */ if (abs(post - pre) > 4) { printf("u-law: Excessive error at %d (%d)\n", pre, post); ulaw_failures++; } } amp[i] = post; } outframes = afWriteFrames(outhandle, AF_DEFAULT_TRACK, amp, 65536); if (outframes != 65536) { fprintf(stderr, " Error writing wave file\n"); exit(2); } } printf("Worst A-law error (ignoring small values) %f%%\n", worst_alaw*100.0); printf("Worst u-law error (ignoring small values) %f%%\n", worst_ulaw*100.0); if (alaw_failures || ulaw_failures) { printf("%d A-law values with excessive error\n", alaw_failures); printf("%d u-law values with excessive error\n", ulaw_failures); printf("Tests failed\n"); exit(2); } printf("Cyclic conversion repeatability tests.\n"); /* Find what happens to every possible linear value after a round trip. */ for (i = 0; i < 65536; i++) { pre = i - 32768; /* Make a round trip */ post = alaw_to_linear(linear_to_alaw(pre)); /* A second round trip should cause no further change */ post_post = alaw_to_linear(linear_to_alaw(post)); if (post_post != post) { printf("A-law second round trip mismatch - at %d, %d != %d\n", pre, post, post_post); printf("Tests failed\n"); exit(2); } /* Make a round trip */ post = ulaw_to_linear(linear_to_ulaw(pre)); /* A second round trip should cause no further change */ post_post = ulaw_to_linear(linear_to_ulaw(post)); if (post_post != post) { printf("u-law round trip mismatch - at %d, %d != %d\n", pre, post, post_post); printf("Tests failed\n"); exit(2); } } printf("Reference power level tests.\n"); power_meter_init(&power_meter, 7); for (i = 0; i < 8000; i++) { amp[i] = ulaw_to_linear(ulaw_1khz_sine[i & 7]); power_meter_update(&power_meter, amp[i]); } printf("Reference u-law 1kHz tone is %fdBm0\n", power_meter_current_dbm0(&power_meter)); outframes = afWriteFrames(outhandle, AF_DEFAULT_TRACK, amp, 8000); if (outframes != 8000) { fprintf(stderr, " Error writing wave file\n"); exit(2); } if (0.1f < fabs(power_meter_current_dbm0(&power_meter))) { printf("Test failed.\n"); exit(2); } for (i = 0; i < 8000; i++) { amp[i] = alaw_to_linear(alaw_1khz_sine[i & 7]); power_meter_update(&power_meter, amp[i]); } printf("Reference A-law 1kHz tone is %fdBm0\n", power_meter_current_dbm0(&power_meter)); outframes = afWriteFrames(outhandle, AF_DEFAULT_TRACK, amp, 8000); if (outframes != 8000) { fprintf(stderr, " Error writing wave file\n"); exit(2); } if (0.1f < fabs(power_meter_current_dbm0(&power_meter))) { printf("Test failed.\n"); exit(2); } /* Check the transcoding functions. */ printf("Testing transcoding A-law -> u-law -> A-law\n"); for (i = 0; i < 256; i++) { if (alaw_to_ulaw(ulaw_to_alaw(i)) != i) { if (abs(alaw_to_ulaw(ulaw_to_alaw(i)) - i) > 1) { printf("u-law -> A-law -> u-law gave %d -> %d\n", i, alaw_to_ulaw(ulaw_to_alaw(i))); printf("Test failed\n"); exit(2); } } } printf("Testing transcoding u-law -> A-law -> u-law\n"); for (i = 0; i < 256; i++) { if (ulaw_to_alaw(alaw_to_ulaw(i)) != i) { if (abs(alaw_to_ulaw(ulaw_to_alaw(i)) - i) > 1) { printf("A-law -> u-law -> A-law gave %d -> %d\n", i, ulaw_to_alaw(alaw_to_ulaw(i))); printf("Test failed\n"); exit(2); } } } encode = g711_init(NULL, G711_ALAW); transcode = g711_init(NULL, G711_ALAW); decode = g711_init(NULL, G711_ULAW); len = 65536; for (i = 0; i < len; i++) amp[i] = i - 32768; len = g711_encode(encode, alaw_data, amp, len); len = g711_transcode(transcode, ulaw_data, alaw_data, len); len = g711_decode(decode, amp, ulaw_data, len); if (len != 65536) { printf("Block coding gave the wrong length - %d instead of %d\n", len, 65536); printf("Test failed\n"); exit(2); } for (i = 0; i < len; i++) { pre = i - 32768; post = amp[i]; if (abs(pre) > 140) { tmp = (float) abs(post - pre)/(float) abs(pre); if (tmp > 0.10) { printf("Block: Excessive error at %d (%d)\n", pre, post); exit(2); } } else { /* Small values need different handling for sensible measurement */ if (abs(post - pre) > 15) { printf("Block: Excessive error at %d (%d)\n", pre, post); exit(2); } } } g711_release(encode); g711_release(transcode); g711_release(decode); if (afCloseFile(outhandle)) { fprintf(stderr, " Cannot close wave file '%s'\n", OUT_FILE_NAME); exit(2); } afFreeFileSetup(filesetup); printf("Tests passed.\n"); return 0; } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/tests/bell_mf_rx_tests.c0000644000175000017500000004332511150047203021732 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * bell_mf_tests.c - Test the Bell MF detector against the spec., whatever the * spec. may be :) * * Written by Steve Underwood * * Copyright (C) 2003 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2, as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: bell_mf_rx_tests.c,v 1.12 2008/05/13 13:17:25 steveu Exp $ */ /*! \file */ /*! \page bell_mf_tests_page Bell MF tone generation and detection tests \section bell_mf_tests_page_sec_1 What does it do? These tests are fashioned after those on the CM7291 test tape from Mitel. Those tests are for DTMF, rather than Bell MF, but make a fair starting point for a set of meaningful tests of Bell MF. These tests include conversion to and from A-law. It is assumed the distortion this produces is comparable to u-law, so it should be a fair test of performance in a real PSTN channel. */ #if defined(HAVE_CONFIG_H) #include "config.h" #endif #include #include #include #include #include #include #include "spandsp.h" /* Basic Bell MF specs: * * Signal generation: * Tone on time = KP: 100+-7ms. All other signals: 68+-7ms * Tone off time (between digits) = 68+-7ms * Frequency tolerance +- 1.5% * Signal level -7+-1dBm per frequency * * Signal reception: * Frequency tolerance +- 1.5% +-10Hz * Signal level -14dBm to 0dBm * Perform a "two and only two tones present" test. * Twist <= 6dB accepted * Receiver sensitive to signals above -22dBm per frequency * Test for a minimum of 55ms if KP, or 30ms of other signals. * Signals to be recognised if the two tones arrive within 8ms of each other. * Invalid signals result in the return of the re-order tone. */ #define MF_DURATION (68*8) #define MF_PAUSE (68*8) #define MF_CYCLE (MF_DURATION + MF_PAUSE) typedef struct { float f1; /* First freq */ float f2; /* Second freq */ int8_t level1; /* Level of the first freq (dB) */ int8_t level2; /* Level of the second freq (dB) */ uint8_t on_time; /* Tone on time (ms) */ uint8_t off_time; /* Minimum post tone silence (ms) */ } mf_digit_tones_t; static const mf_digit_tones_t bell_mf_tones[] = { { 700.0, 900.0, -7, -7, 68, 68}, { 700.0, 1100.0, -7, -7, 68, 68}, { 900.0, 1100.0, -7, -7, 68, 68}, { 700.0, 1300.0, -7, -7, 68, 68}, { 900.0, 1300.0, -7, -7, 68, 68}, {1100.0, 1300.0, -7, -7, 68, 68}, { 700.0, 1500.0, -7, -7, 68, 68}, { 900.0, 1500.0, -7, -7, 68, 68}, {1100.0, 1500.0, -7, -7, 68, 68}, {1300.0, 1500.0, -7, -7, 68, 68}, { 700.0, 1700.0, -7, -7, 68, 68}, /* ST''' - use 'C' */ { 900.0, 1700.0, -7, -7, 68, 68}, /* ST' - use 'A' */ {1100.0, 1700.0, -7, -7, 100, 68}, /* KP - use '*' */ {1300.0, 1700.0, -7, -7, 68, 68}, /* ST'' - use 'B' */ {1500.0, 1700.0, -7, -7, 68, 68}, /* ST - use '#' */ {0.0, 0.0, 0, 0, 0, 0} }; static tone_gen_descriptor_t my_mf_digit_tones[16]; static char bell_mf_tone_codes[] = "1234567890CA*B#"; int callback_ok; int callback_roll; static void my_mf_gen_init(float low_fudge, int low_level, float high_fudge, int high_level, int duration, int gap) { int i; /* The fiddle factor on the tone duration is to make KP consistently 50% longer than the other digits, as the digit durations are varied for the tests. This is an approximation, as the real scaling should be 100/68 */ for (i = 0; i < 15; i++) { make_tone_gen_descriptor(&my_mf_digit_tones[i], bell_mf_tones[i].f1*(1.0 + low_fudge), low_level, bell_mf_tones[i].f2*(1.0 + high_fudge), high_level, (i == 12) ? 3*duration/2 : duration, gap, 0, 0, FALSE); } } /*- End of function --------------------------------------------------------*/ static int my_mf_generate(int16_t amp[], const char *digits) { int len; char *cp; tone_gen_state_t tone; len = 0; while (*digits) { if ((cp = strchr(bell_mf_tone_codes, *digits))) { tone_gen_init(&tone, &my_mf_digit_tones[cp - bell_mf_tone_codes]); len += tone_gen(&tone, amp + len, 9999); } digits++; } return len; } /*- End of function --------------------------------------------------------*/ static void codec_munge(int16_t amp[], int len) { int i; uint8_t alaw; for (i = 0; i < len; i++) { alaw = linear_to_alaw (amp[i]); amp[i] = alaw_to_linear (alaw); } } /*- End of function --------------------------------------------------------*/ #define ALL_POSSIBLE_DIGITS "1234567890CA*B#" static void digit_delivery(void *data, const char *digits, int len) { int i; int seg; const char *s = ALL_POSSIBLE_DIGITS; const char *t; if (data != (void *) 0x12345678) { callback_ok = FALSE; return; } callback_ok = TRUE; t = s + callback_roll; seg = 15 - callback_roll; for (i = 0; i < len; i += seg, seg = 15) { if (i + seg > len) seg = len - i; if (memcmp(digits + i, t, seg)) { callback_ok = FALSE; printf("Fail at %d %d\n", i, seg); break; } t = s; callback_roll = (callback_roll + seg)%15; } } /*- End of function --------------------------------------------------------*/ static int16_t amp[1000000]; int main(int argc, char *argv[]) { int duration; int i; int j; int len; int sample; const char *s; char digit[2]; char buf[MAX_BELL_MF_DIGITS + 1]; int actual; int nplus; int nminus; float rrb; float rcfo; time_t now; bell_mf_rx_state_t mf_state; awgn_state_t noise_source; time(&now); bell_mf_rx_init(&mf_state, NULL, NULL); /* Test 1: Mitel's test 1 isn't really a test. Its a calibration step, which has no meaning here. */ printf ("Test 1: Calibration\n"); printf (" Passed\n"); /* Test 2: Decode check This is a sanity check, that all digits are reliably detected under ideal conditions. Each possible digit is repeated 10 times, with 68ms bursts. The level of each tone is about 6dB down from clip */ printf ("Test 2: Decode check\n"); my_mf_gen_init(0.0, -3, 0.0, -3, 68, 68); s = ALL_POSSIBLE_DIGITS; digit[1] = '\0'; while (*s) { digit[0] = *s++; for (i = 0; i < 10; i++) { len = my_mf_generate(amp, digit); codec_munge(amp, len); bell_mf_rx(&mf_state, amp, len); actual = bell_mf_rx_get(&mf_state, buf, 128); if (actual != 1 || buf[0] != digit[0]) { printf (" Sent '%s'\n", digit); printf (" Received '%s' [%d]\n", buf, actual); printf (" Failed\n"); exit (2); } } } printf (" Passed\n"); /* Test 3: Recognition bandwidth and channel centre frequency check. Use all digits. Each digit types requires four tests to complete the check. Each section contains 40 pulses of 68ms duration, with an amplitude of -20dB from clip per frequency. Four sections covering the tests for one tone (1 digit) are: a. H frequency at 0% deviation from center, L frequency at +0.1%. L frequency is then increments in +01.% steps up to +4%. The number of tone bursts is noted and designated N+. b. H frequency at 0% deviation, L frequency at -0.1%. L frequency is then incremental in -0.1% steps, up to -4%. The number of tone bursts is noted and designated N-. c. The test in (a) is repeated with the L frequency at 0% and the H frequency varied up to +4%. d. The test in (b) is repeated with the L frequency and 0% and the H frequency varied to -4%. Receiver Recognition Bandwidth (RRB) is calculated as follows: RRB% = (N+ + N-)/10 Receiver Center Frequency Offset (RCFO) is calculated as follows: RCFO% = X + (N+ - N-)/20 Note that this test doesn't test what it says it is testing at all, and the results are quite inaccurate, if not a downright lie! However, it follows the Mitel procedure, so how can it be bad? :) The spec calls for +-1.5% +-10Hz of bandwidth. */ printf ("Test 3: Recognition bandwidth and channel centre frequency check\n"); s = ALL_POSSIBLE_DIGITS; digit[1] = '\0'; j = 0; while (*s) { digit[0] = *s++; for (nplus = 0, i = 1; i <= 60; i++) { my_mf_gen_init((float) i/1000.0, -17, 0.0, -17, 68, 68); len = my_mf_generate(amp, digit); codec_munge(amp, len); bell_mf_rx(&mf_state, amp, len); nplus += bell_mf_rx_get(&mf_state, buf, 128); } for (nminus = 0, i = -1; i >= -60; i--) { my_mf_gen_init((float) i/1000.0, -17, 0.0, -17, 68, 68); len = my_mf_generate(amp, digit); codec_munge(amp, len); bell_mf_rx(&mf_state, amp, len); nminus += bell_mf_rx_get(&mf_state, buf, 128); } rrb = (float) (nplus + nminus)/10.0; rcfo = (float) (nplus - nminus)/10.0; printf (" %c (low) rrb = %5.2f%%, rcfo = %5.2f%%, max -ve = %5.2f, max +ve = %5.2f\n", digit[0], rrb, rcfo, (float) nminus/10.0, (float) nplus/10.0); if (rrb < 3.0 + rcfo + (2.0*100.0*10.0/bell_mf_tones[j].f1) || rrb >= 15.0 + rcfo) { printf (" Failed\n"); exit (2); } for (nplus = 0, i = 1; i <= 60; i++) { my_mf_gen_init(0.0, -17, (float) i/1000.0, -17, 68, 68); len = my_mf_generate(amp, digit); codec_munge(amp, len); bell_mf_rx(&mf_state, amp, len); nplus += bell_mf_rx_get(&mf_state, buf, 128); } for (nminus = 0, i = -1; i >= -60; i--) { my_mf_gen_init(0.0, -17, (float) i/1000.0, -17, 68, 68); len = my_mf_generate(amp, digit); codec_munge(amp, len); bell_mf_rx(&mf_state, amp, len); nminus += bell_mf_rx_get(&mf_state, buf, 128); } rrb = (float) (nplus + nminus)/10.0; rcfo = (float) (nplus - nminus)/10.0; printf (" %c (high) rrb = %5.2f%%, rcfo = %5.2f%%, max -ve = %5.2f, max +ve = %5.2f\n", digit[0], rrb, rcfo, (float) nminus/10.0, (float) nplus/10.0); if (rrb < 3.0 + rcfo + (2.0*100.0*10.0/bell_mf_tones[j].f2) || rrb >= 15.0 + rcfo) { printf (" Failed\n"); exit (2); } j++; } printf (" Passed\n"); /* Test 4: Acceptable amplitude ratio (twist). Twist all digits in both directions, and check the maximum twist we can accept. The way this is done is styled after the Mitel DTMF test, and has good and bad points. */ printf ("Test 4: Acceptable amplitude ratio (twist)\n"); s = ALL_POSSIBLE_DIGITS; digit[1] = '\0'; while (*s) { digit[0] = *s++; for (nplus = 0, i = -50; i >= -250; i--) { my_mf_gen_init(0.0, -5, 0.0, i/10, 68, 68); len = my_mf_generate(amp, digit); codec_munge(amp, len); bell_mf_rx(&mf_state, amp, len); nplus += bell_mf_rx_get(&mf_state, buf, 128); } printf(" %c normal twist = %.2fdB\n", digit[0], (float) nplus/10.0); if (nplus < 60) { printf(" Failed\n"); exit(2); } for (nminus = 0, i = -50; i >= -250; i--) { my_mf_gen_init(0.0, i/10, 0.0, -5, 68, 68); len = my_mf_generate(amp, digit); codec_munge(amp, len); bell_mf_rx(&mf_state, amp, len); nminus += bell_mf_rx_get(&mf_state, buf, 128); } printf(" %c reverse twist = %.2fdB\n", digit[0], (float) nminus/10.0); if (nminus < 60) { printf(" Failed\n"); exit(2); } } printf(" Passed\n"); /* Test 5: Dynamic range This test sends all possible digits, with gradually increasing amplitude. We determine the span over which we achieve reliable detection. The spec says we should detect between -14dBm and 0dBm, but the tones clip above -3dBm, so this cannot really work. */ printf("Test 5: Dynamic range\n"); for (nplus = nminus = -1000, i = -50; i <= 3; i++) { my_mf_gen_init(0.0, i, 0.0, i, 68, 68); for (j = 0; j < 100; j++) { len = my_mf_generate(amp, ALL_POSSIBLE_DIGITS); codec_munge(amp, len); bell_mf_rx(&mf_state, amp, len); if (bell_mf_rx_get(&mf_state, buf, 128) != 15) break; if (strcmp(buf, ALL_POSSIBLE_DIGITS) != 0) break; } if (j == 100) { if (nplus == -1000) nplus = i; } else { if (nplus != -1000 && nminus == -1000) nminus = i; } } printf(" Dynamic range = %ddB to %ddB\n", nplus, nminus - 1); if (nplus > -22 || nminus <= -3) { printf(" Failed\n"); exit(2); } printf(" Passed\n"); /* Test 6: Guard time This test sends all possible digits, with a gradually reducing duration. The spec defines a narrow range of tone duration times we can expect, so as long as we detect reliably at the specified minimum we should be OK. However, the spec also says we should detect on a minimum of 55ms of KP, or 30ms of other digits. */ printf("Test 6: Guard time\n"); for (i = 30; i < 62; i++) { my_mf_gen_init(0.0, -5, 0.0, -3, i, 68); for (j = 0; j < 500; j++) { len = my_mf_generate(amp, ALL_POSSIBLE_DIGITS); codec_munge(amp, len); bell_mf_rx(&mf_state, amp, len); if (bell_mf_rx_get(&mf_state, buf, 128) != 15) break; if (strcmp(buf, ALL_POSSIBLE_DIGITS) != 0) break; } if (j == 500) break; } printf(" Guard time = %dms\n", i); if (i > 61) { printf(" Failed\n"); exit(2); } printf(" Passed\n"); /* Test 7: Acceptable signal to noise ratio We send all possible digits at -6dBm from clip, mixed with AWGN. We gradually reduce the noise until we get clean detection. */ printf("Test 7: Acceptable signal to noise ratio\n"); my_mf_gen_init(0.0, -3, 0.0, -3, 68, 68); for (i = -10; i > -50; i--) { awgn_init_dbm0(&noise_source, 1234567, (float) i); for (j = 0; j < 500; j++) { len = my_mf_generate(amp, ALL_POSSIBLE_DIGITS); for (sample = 0; sample < len; sample++) amp[sample] = saturate(amp[sample] + awgn(&noise_source)); codec_munge(amp, len); bell_mf_rx(&mf_state, amp, len); if (bell_mf_rx_get(&mf_state, buf, 128) != 15) break; if (strcmp(buf, ALL_POSSIBLE_DIGITS) != 0) break; } if (j == 500) break; } printf(" Acceptable S/N ratio is %ddB\n", -3 - i); if (-3 - i > 26) { printf(" Failed\n"); exit(2); } printf(" Passed\n"); /* The remainder of the Mitel tape is the talk-off test. This is meaningless for Bell MF. However the decoder's tolerance of out of band noise is significant. */ /* TODO: add a OOB tolerance test. */ /* Test the callback mode for delivering detected digits */ printf("Test: Callback digit delivery mode.\n"); callback_ok = FALSE; callback_roll = 0; bell_mf_rx_init(&mf_state, digit_delivery, (void *) 0x12345678); my_mf_gen_init(0.0, -10, 0.0, -10, 68, 68); for (i = 1; i < 10; i++) { len = 0; for (j = 0; j < i; j++) len += my_mf_generate(amp + len, ALL_POSSIBLE_DIGITS); bell_mf_rx(&mf_state, amp, len); if (!callback_ok) break; } if (!callback_ok) { printf(" Failed\n"); exit (2); } printf(" Passed\n"); duration = time (NULL) - now; printf ("Tests passed in %ds\n", duration); return 0; } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/tests/playout_tests.c0000644000175000017500000002627511150047203021323 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * playout_tests.c * * Written by Steve Underwood * * Copyright (C) 2005 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2, as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: playout_tests.c,v 1.25 2008/05/13 13:17:26 steveu Exp $ */ /*! \page playout_tests_page Playout (jitter buffering) tests \section playout_tests_page_sec_1 What does it do? These tests simulate timing jitter and packet loss in an audio stream, and see how well the playout module copes. */ #if defined(HAVE_CONFIG_H) #include "config.h" #endif #include #include #include #include #include "spandsp.h" #define INPUT_FILE_NAME "playout_in.wav" #define OUTPUT_FILE_NAME "playout_out.wav" #define BLOCK_LEN 160 static void dynamic_buffer_tests(void) { playout_state_t *s; playout_frame_t frame; playout_frame_t *p; plc_state_t plc; time_scale_state_t ts; int16_t *amp; int16_t fill[BLOCK_LEN]; int16_t buf[20*BLOCK_LEN]; int16_t out[10*BLOCK_LEN]; timestamp_t time_stamp; timestamp_t next_actual_receive; timestamp_t next_scheduled_receive; int near_far_time_offset; int rng; int i; int j; int ret; int len; int inframes; int outframes; AFfilehandle inhandle; AFfilehandle outhandle; AFfilesetup filesetup; filesetup = afNewFileSetup(); if (filesetup == AF_NULL_FILESETUP) { fprintf(stderr, " Failed to create file setup\n"); exit(2); } afInitSampleFormat(filesetup, AF_DEFAULT_TRACK, AF_SAMPFMT_TWOSCOMP, 16); afInitRate(filesetup, AF_DEFAULT_TRACK, (float) SAMPLE_RATE); afInitFileFormat(filesetup, AF_FILE_WAVE); afInitChannels(filesetup, AF_DEFAULT_TRACK, 2); inhandle = afOpenFile(INPUT_FILE_NAME, "r", NULL); if (inhandle == AF_NULL_FILEHANDLE) { fprintf(stderr, " Failed to open wave file '%s'\n", INPUT_FILE_NAME); exit(2); } outhandle = afOpenFile(OUTPUT_FILE_NAME, "w", filesetup); if (outhandle == AF_NULL_FILEHANDLE) { fprintf(stderr, " Failed to create wave file '%s'\n", OUTPUT_FILE_NAME); exit(2); } near_far_time_offset = 54321; time_stamp = 12345; next_actual_receive = time_stamp + near_far_time_offset; next_scheduled_receive = 0; for (i = 0; i < BLOCK_LEN; i++) fill[i] = 32767; if ((s = playout_new(2*BLOCK_LEN, 15*BLOCK_LEN)) == NULL) return; plc_init(&plc); time_scale_init(&ts, 1.0); for (i = 0; i < 1000000; i++) { if (i >= next_actual_receive) { amp = malloc(BLOCK_LEN*sizeof(int16_t)); inframes = afReadFrames(inhandle, AF_DEFAULT_TRACK, amp, BLOCK_LEN); if (inframes < BLOCK_LEN) break; ret = playout_put(s, amp, PLAYOUT_TYPE_SPEECH, inframes, time_stamp, next_actual_receive); #if 0 switch (ret) { case PLAYOUT_OK: printf("<< Record\n"); break; case PLAYOUT_ERROR: printf("<< Error\n"); break; default: printf("<< Eh?\n"); break; } #endif rng = rand() & 0xFF; if (i < 100000) rng = (rng*rng) >> 7; else if (i < 200000) rng = (rng*rng) >> 6; else if (i < 300000) rng = (rng*rng) >> 5; else if (i < 400000) rng = (rng*rng) >> 7; time_stamp += BLOCK_LEN; next_actual_receive = time_stamp + near_far_time_offset + rng; } if (i >= next_scheduled_receive) { do { ret = playout_get(s, &frame, next_scheduled_receive); if (ret == PLAYOUT_DROP) printf(">> Drop %d\n", next_scheduled_receive); } while (ret == PLAYOUT_DROP); switch (ret) { case PLAYOUT_OK: printf(">> Play %d\n", next_scheduled_receive); plc_rx(&plc, frame.data, frame.sender_len); len = time_scale(&ts, out, ((int16_t *) frame.data), frame.sender_len); printf("len = %d\n", len); for (j = 0; j < len; j++) { buf[2*j] = out[j]; buf[2*j + 1] = 10*playout_current_length(s); } outframes = afWriteFrames(outhandle, AF_DEFAULT_TRACK, buf, len); if (outframes != len) { fprintf(stderr, " Error writing out sound\n"); exit(2); } free(frame.data); next_scheduled_receive += BLOCK_LEN; break; case PLAYOUT_FILLIN: printf(">> Fill %d\n", next_scheduled_receive); plc_fillin(&plc, fill, BLOCK_LEN); time_scale_rate(&ts, 0.5); len = time_scale(&ts, out, fill, BLOCK_LEN); time_scale_rate(&ts, 1.0); printf("len = %d\n", len); for (j = 0; j < len; j++) { buf[2*j] = out[j]; buf[2*j + 1] = 10*playout_current_length(s); } outframes = afWriteFrames(outhandle, AF_DEFAULT_TRACK, buf, len); if (outframes != len) { fprintf(stderr, " Error writing out sound\n"); exit(2); } next_scheduled_receive += BLOCK_LEN; break; case PLAYOUT_DROP: printf(">> Drop %d\n", next_scheduled_receive); break; case PLAYOUT_NOFRAME: printf(">> No frame %d %d %d %d\n", next_scheduled_receive, playout_next_due(s), s->last_speech_sender_stamp, s->last_speech_sender_len); next_scheduled_receive += BLOCK_LEN; break; case PLAYOUT_EMPTY: printf(">> Empty %d\n", next_scheduled_receive); next_scheduled_receive += BLOCK_LEN; break; case PLAYOUT_ERROR: printf(">> Error %d\n", next_scheduled_receive); next_scheduled_receive += BLOCK_LEN; break; default: printf(">> Eh? %d\n", next_scheduled_receive); break; } } } if (afCloseFile(inhandle) != 0) { fprintf(stderr, " Cannot close wave file '%s'\n", INPUT_FILE_NAME); exit(2); } if (afCloseFile(outhandle) != 0) { fprintf(stderr, " Cannot close wave file '%s'\n", OUTPUT_FILE_NAME); exit(2); } afFreeFileSetup(filesetup); printf("%10" PRId32 " %10" PRId32 " %10d\n", s->state_just_in_time, s->state_late, playout_current_length(s)); /* Clear everything from the queue */ while ((p = playout_get_unconditional(s))) /*free(p->data)*/; /* Now free the context itself */ playout_free(s); } /*- End of function --------------------------------------------------------*/ static void static_buffer_tests(void) { playout_state_t *s; playout_frame_t frame; playout_frame_t *p; int type; uint8_t fr[BLOCK_LEN]; timestamp_t next_scheduled_send; int transit_time; timestamp_t next_actual_receive; timestamp_t next_scheduled_receive; int len; int i; int ret; next_scheduled_send = 0; transit_time = 320; next_actual_receive = next_scheduled_send + transit_time; next_scheduled_receive = 960; memset(fr, 0, sizeof(fr)); type = PLAYOUT_TYPE_SPEECH; len = BLOCK_LEN; if ((s = playout_new(2*BLOCK_LEN, 2*BLOCK_LEN)) == NULL) return; for (i = 0; i < 1000000; i++) { if (i >= next_actual_receive) { ret = playout_put(s, fr, type, len, next_scheduled_send, next_actual_receive); switch (ret) { case PLAYOUT_OK: printf("<< Record\n"); break; case PLAYOUT_ERROR: printf("<< Error\n"); break; default: printf("<< Eh?\n"); break; } next_scheduled_send += BLOCK_LEN; ret = rand() & 0xFF; ret = (ret*ret) >> 7; transit_time = 320 + ret; next_actual_receive = next_scheduled_send + transit_time; } if (i >= next_scheduled_receive) { do { ret = playout_get(s, &frame, next_scheduled_receive); } while (ret == PLAYOUT_DROP); switch (ret) { case PLAYOUT_OK: printf(">> Play\n"); next_scheduled_receive += BLOCK_LEN; break; case PLAYOUT_FILLIN: printf(">> Fill\n"); next_scheduled_receive += BLOCK_LEN; break; case PLAYOUT_DROP: printf(">> Drop\n"); break; case PLAYOUT_NOFRAME: printf(">> No frame\n"); next_scheduled_receive += BLOCK_LEN; break; case PLAYOUT_EMPTY: printf(">> Empty\n"); next_scheduled_receive += BLOCK_LEN; break; case PLAYOUT_ERROR: printf(">> Error\n"); next_scheduled_receive += BLOCK_LEN; break; default: printf(">> Eh?\n"); break; } } } /* Clear everything from the queue */ while ((p = playout_get_unconditional(s))) /*free(p->data)*/; /* Now free the context itself */ playout_free(s); } /*- End of function --------------------------------------------------------*/ int main(int argc, char *argv[]) { printf("Dynamic buffering tests\n"); dynamic_buffer_tests(); printf("Static buffering tests\n"); static_buffer_tests(); } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/tests/line_model_monitor.h0000644000175000017500000000423411150047203022256 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * line_model_monitor.h - Model activity in a telephone line model, using the FLTK toolkit. * * Written by Steve Underwood * * Copyright (C) 2004 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2, as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: line_model_monitor.h,v 1.7 2008/04/26 13:39:17 steveu Exp $ */ /*! \page line_model_monitor_page Telephone line model monitoring \section line_model_monitor_page_sec_1 What does it do? This code controls a GUI window, which provides monitoring of the internal status of a telephone line modem. It shows, graphically: - the spectrum of the received signal. - the line model in use (when a known line model is being used). - the adapted coefficients of the canceller. \section line_model_monitor_page_sec_2 How does it work? This code uses the FLTK cross platform GUI toolkit. It works on X11 and Windows platforms. In addition to the basic FLTK toolkit, fltk_cartesian is also required. */ #if !defined(_LINE_MODEL_MONITOR_H_) #define _LINE_MODEL_MONITOR_H_ #if defined(__cplusplus) extern "C" { #endif int start_line_model_monitor(int len); int line_model_monitor_can_update(const float *coeffs, int len); int line_model_monitor_line_model_update(const float *coeffs, int len); int line_model_monitor_line_spectrum_update(const int16_t amp[], int len); void line_model_monitor_wait_to_end(void); void line_model_monitor_update_display(void); #if defined(__cplusplus) } #endif #endif /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/tests/line_model_monitor.cpp0000644000175000017500000003026211150047203022611 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * line_model_monitor.cpp - Model activity in a telephone line model, using the FLTK toolkit. * * Written by Steve Underwood * * Copyright (C) 2006 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2, as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: line_model_monitor.cpp,v 1.4 2008/05/27 15:08:21 steveu Exp $ */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #if defined(HAVE_FL_FL_H) && defined(HAVE_FL_FL_CARTESIAN_H) #define __STDC_LIMIT_MACROS #include #include #include #include #include #include #include #if defined(HAVE_FFTW3_H) #include #else #include #endif #include #include #include #include #include #include #include "spandsp.h" #include "line_model_monitor.h" Fl_Double_Window *w; Fl_Audio_Meter *audio_meter; Fl_Group *c_spec; Fl_Group *c_right; Fl_Group *c_can; Fl_Group *c_line_model; Ca_Canvas *canvas_spec; Ca_X_Axis *spec_freq; Ca_Y_Axis *spec_amp; Ca_Line *spec_re = NULL; double spec_re_plot[2*512]; Ca_Canvas *canvas_can; Ca_X_Axis *can_x; Ca_Y_Axis *can_y; Ca_Line *can_re = NULL; double can_re_plot[512]; Ca_Canvas *canvas_line_model; Ca_X_Axis *line_model_x; Ca_Y_Axis *line_model_y; Ca_Line *line_model_re = NULL; double line_model_re_plot[512]; static int skip = 0; int in_ptr; #if defined(HAVE_FFTW3_H) double in[1024][2]; double out[1024][2]; #else fftw_complex in[1024]; fftw_complex out[1024]; #endif fftw_plan p; int line_model_monitor_can_update(const float *coeffs, int len) { int i; float min; float max; if (can_re) delete can_re; canvas_can->current(canvas_can); i = 0; min = coeffs[i]; max = coeffs[i]; for (i = 0; i < len; i++) { can_re_plot[2*i] = i; can_re_plot[2*i + 1] = coeffs[i]; if (min > coeffs[i]) min = coeffs[i]; if (max < coeffs[i]) max = coeffs[i]; } can_y->maximum((max == min) ? max + 0.2 : max); can_y->minimum(min); can_re = new Ca_Line(len, can_re_plot, 0, 0, FL_BLUE, CA_NO_POINT); if (++skip >= 100) { skip = 0; Fl::check(); } return 0; } /*- End of function --------------------------------------------------------*/ int line_model_monitor_line_model_update(const float *coeffs, int len) { int i; float min; float max; if (line_model_re) delete line_model_re; canvas_line_model->current(canvas_line_model); i = 0; min = coeffs[i]; max = coeffs[i]; for (i = 0; i < len; i++) { line_model_re_plot[2*i] = i; line_model_re_plot[2*i + 1] = coeffs[i]; if (min > coeffs[i]) min = coeffs[i]; if (max < coeffs[i]) max = coeffs[i]; } line_model_y->maximum((max == min) ? max + 0.2 : max); line_model_y->minimum(min); line_model_re = new Ca_Line(len, line_model_re_plot, 0, 0, FL_BLUE, CA_NO_POINT); if (++skip >= 100) { skip = 0; Fl::check(); } return 0; } /*- End of function --------------------------------------------------------*/ int line_model_monitor_line_spectrum_update(const int16_t amp[], int len) { int i; int x; for (i = 0; i < len; i++) audio_meter->sample(amp[i]/32768.0); if (in_ptr + len < 512) { /* Just add this fragment to the buffer. */ for (i = 0; i < len; i++) #if defined(HAVE_FFTW3_H) in[in_ptr + i][0] = amp[i]; #else in[in_ptr + i].re = amp[i]; #endif in_ptr += len; return 0; } if (len >= 512) { /* We have enough for a whole block. Use the last 512 samples we have. */ x = len - 512; for (i = 0; i < 512; i++) #if defined(HAVE_FFTW3_H) in[i][0] = amp[x + i]; #else in[i].re = amp[x + i]; #endif } else { /* We want the last 512 samples. */ x = 512 - len; for (i = 0; i < x; i++) #if defined(HAVE_FFTW3_H) in[i][0] = in[in_ptr - x + i][0]; #else in[i].re = in[in_ptr - x + i].re; #endif for (i = x; i < 512; i++) #if defined(HAVE_FFTW3_H) in[i][0] = amp[i - x]; #else in[i].re = amp[i - x]; #endif } in_ptr = 0; #if defined(HAVE_FFTW3_H) fftw_execute(p); #else fftw_one(p, in, out); #endif if (spec_re) delete spec_re; canvas_spec->current(canvas_spec); for (i = 0; i < 512; i++) { spec_re_plot[2*i] = i*4000.0/512.0; #if defined(HAVE_FFTW3_H) spec_re_plot[2*i + 1] = 20.0*log10(sqrt(out[i][0]*out[i][0] + out[i][1]*out[i][1])/(256.0*32768)) + 3.14; #else spec_re_plot[2*i + 1] = 20.0*log10(sqrt(out[i].re*out[i].re + out[i].im*out[i].im)/(256.0*32768)) + 3.14; #endif } spec_re = new Ca_Line(512, spec_re_plot, 0, 0, FL_BLUE, CA_NO_POINT); Fl::check(); return 0; } /*- End of function --------------------------------------------------------*/ int start_line_model_monitor(int len) { char buf[132 + 1]; float x; float y; int i; w = new Fl_Double_Window(850, 400, "Telephone line model monitor"); c_spec = new Fl_Group(0, 0, 380, 400); c_spec->box(FL_DOWN_BOX); c_spec->align(FL_ALIGN_TOP | FL_ALIGN_INSIDE); canvas_spec = new Ca_Canvas(60, 30, 300, 300, "Spectrum"); canvas_spec->box(FL_PLASTIC_DOWN_BOX); canvas_spec->color(7); canvas_spec->align(FL_ALIGN_TOP); canvas_spec->border(15); spec_freq = new Ca_X_Axis(65, 330, 290, 30, "Freq (Hz)"); spec_freq->align(FL_ALIGN_BOTTOM); spec_freq->minimum(0); spec_freq->maximum(4000); spec_freq->label_format("%g"); spec_freq->minor_grid_color(fl_gray_ramp(20)); spec_freq->major_grid_color(fl_gray_ramp(15)); spec_freq->label_grid_color(fl_gray_ramp(10)); spec_freq->grid_visible(CA_LABEL_GRID | CA_ALWAYS_VISIBLE); spec_freq->minor_grid_style(FL_DOT); spec_freq->major_step(5); spec_freq->label_step(1); spec_freq->axis_color(FL_BLACK); spec_freq->axis_align(CA_BOTTOM | CA_LINE); spec_amp = new Ca_Y_Axis(20, 35, 40, 290, "Amp (dBmO)"); spec_amp->align(FL_ALIGN_LEFT); spec_amp->minimum(-80.0); spec_amp->maximum(10.0); spec_amp->minor_grid_color(fl_gray_ramp(20)); spec_amp->major_grid_color(fl_gray_ramp(15)); spec_amp->label_grid_color(fl_gray_ramp(10)); //spec_amp->grid_visible(CA_MINOR_TICK | CA_MAJOR_TICK | CA_LABEL_GRID | CA_ALWAYS_VISIBLE); spec_amp->grid_visible(CA_LABEL_GRID | CA_ALWAYS_VISIBLE); spec_amp->minor_grid_style(FL_DOT); spec_amp->major_step(5); spec_amp->label_step(1); spec_amp->axis_color(FL_BLACK); spec_amp->current(); c_spec->end(); c_right = new Fl_Group(440, 0, 465, 405); c_can = new Fl_Group(380, 0, 415, 200); c_can->box(FL_DOWN_BOX); c_can->align(FL_ALIGN_TOP | FL_ALIGN_INSIDE); c_can->current(); canvas_can = new Ca_Canvas(460, 35, 300, 100, "??? coefficients"); canvas_can->box(FL_PLASTIC_DOWN_BOX); canvas_can->color(7); canvas_can->align(FL_ALIGN_TOP); Fl_Group::current()->resizable(canvas_can); canvas_can->border(15); can_x = new Ca_X_Axis(465, 135, 290, 30, "Tap"); can_x->align(FL_ALIGN_BOTTOM); can_x->minimum(0.0); can_x->maximum((float) len); can_x->label_format("%g"); can_x->minor_grid_color(fl_gray_ramp(20)); can_x->major_grid_color(fl_gray_ramp(15)); can_x->label_grid_color(fl_gray_ramp(10)); can_x->grid_visible(CA_LABEL_GRID | CA_ALWAYS_VISIBLE); can_x->minor_grid_style(FL_DOT); can_x->major_step(5); can_x->label_step(1); can_x->axis_align(CA_BOTTOM | CA_LINE); can_x->axis_color(FL_BLACK); can_x->current(); can_y = new Ca_Y_Axis(420, 40, 40, 90, "Amp"); can_y->align(FL_ALIGN_LEFT); can_y->minimum(-0.1); can_y->maximum(0.1); can_y->minor_grid_color(fl_gray_ramp(20)); can_y->major_grid_color(fl_gray_ramp(15)); can_y->label_grid_color(fl_gray_ramp(10)); can_y->grid_visible(CA_LABEL_GRID | CA_ALWAYS_VISIBLE); can_y->minor_grid_style(FL_DOT); can_y->major_step(5); can_y->label_step(1); can_y->axis_color(FL_BLACK); can_y->current(); c_can->end(); c_line_model = new Fl_Group(380, 200, 415, 200); c_line_model->box(FL_DOWN_BOX); c_line_model->align(FL_ALIGN_TOP | FL_ALIGN_INSIDE); c_line_model->current(); canvas_line_model = new Ca_Canvas(460, 235, 300, 100, "Line impulse response model"); canvas_line_model->box(FL_PLASTIC_DOWN_BOX); canvas_line_model->color(7); canvas_line_model->align(FL_ALIGN_TOP); Fl_Group::current()->resizable(canvas_line_model); canvas_line_model->border(15); line_model_x = new Ca_X_Axis(465, 335, 290, 30, "Tap"); line_model_x->align(FL_ALIGN_BOTTOM); line_model_x->minimum(0.0); line_model_x->maximum((float) len); line_model_x->label_format("%g"); line_model_x->minor_grid_color(fl_gray_ramp(20)); line_model_x->major_grid_color(fl_gray_ramp(15)); line_model_x->label_grid_color(fl_gray_ramp(10)); line_model_x->grid_visible(CA_LABEL_GRID | CA_ALWAYS_VISIBLE); line_model_x->minor_grid_style(FL_DOT); line_model_x->major_step(5); line_model_x->label_step(1); line_model_x->axis_align(CA_BOTTOM | CA_LINE); line_model_x->axis_color(FL_BLACK); line_model_x->current(); line_model_y = new Ca_Y_Axis(420, 240, 40, 90, "Amp"); line_model_y->align(FL_ALIGN_LEFT); line_model_y->minimum(-0.1); line_model_y->maximum(0.1); line_model_y->minor_grid_color(fl_gray_ramp(20)); line_model_y->major_grid_color(fl_gray_ramp(15)); line_model_y->label_grid_color(fl_gray_ramp(10)); line_model_y->grid_visible(CA_LABEL_GRID | CA_ALWAYS_VISIBLE); line_model_y->minor_grid_style(FL_DOT); line_model_y->major_step(5); line_model_y->label_step(1); line_model_y->axis_color(FL_BLACK); line_model_y->current(); c_line_model->end(); audio_meter = new Fl_Audio_Meter(810, 40, 10, 250, ""); audio_meter->box(FL_PLASTIC_UP_BOX); audio_meter->type(FL_VERT_AUDIO_METER); c_right->end(); Fl_Group::current()->resizable(c_right); w->end(); w->show(); #if defined(HAVE_FFTW3_H) p = fftw_plan_dft_1d(1024, in, out, FFTW_BACKWARD, FFTW_ESTIMATE); for (i = 0; i < 1024; i++) { in[i][0] = 0.0; in[i][1] = 0.0; } #else p = fftw_create_plan(1024, FFTW_BACKWARD, FFTW_ESTIMATE); for (i = 0; i < 1024; i++) { in[i].re = 0.0; in[i].im = 0.0; } #endif in_ptr = 0; Fl::check(); return 0; } /*- End of function --------------------------------------------------------*/ void line_model_monitor_wait_to_end(void) { fd_set rfds; int res; struct timeval tv; fprintf(stderr, "Processing complete. Press the key to end\n"); do { usleep(100000); Fl::check(); FD_ZERO(&rfds); FD_SET(0, &rfds); tv.tv_usec = 100000; tv.tv_sec = 0; res = select(1, &rfds, NULL, NULL, &tv); } while (res <= 0); } /*- End of function --------------------------------------------------------*/ void line_model_monitor_update_display(void) { Fl::check(); Fl::check(); Fl::check(); Fl::check(); Fl::check(); Fl::check(); Fl::check(); Fl::check(); Fl::check(); Fl::check(); Fl::check(); Fl::check(); } /*- End of function --------------------------------------------------------*/ #endif /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/tests/tsb85_tests.c0000644000175000017500000007050211150047203020563 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * faxtester_tests.c * * Written by Steve Underwood * * Copyright (C) 2003, 2005, 2006 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: tsb85_tests.c,v 1.8 2008/07/25 13:56:54 steveu Exp $ */ /*! \file */ #if defined(HAVE_CONFIG_H) #include #endif #include #include #include #include #include #include "floating_fudge.h" #if defined(HAVE_TGMATH_H) #include #endif #if defined(HAVE_MATH_H) #include #endif #include #include #include #include #include #if defined(HAVE_LIBXML_XMLMEMORY_H) #include #endif #if defined(HAVE_LIBXML_PARSER_H) #include #endif #if defined(HAVE_LIBXML_XINCLUDE_H) #include #endif #include "spandsp.h" #include "fax_tester.h" #define INPUT_TIFF_FILE_NAME "../test-data/itu/fax/itutests.tif" #define OUTPUT_TIFF_FILE_NAME "tsb85.tif" #define OUTPUT_FILE_NAME_WAVE "tsb85.wav" #define SAMPLES_PER_CHUNK 160 AFfilehandle out_handle; AFfilesetup filesetup; int use_receiver_not_ready = FALSE; int test_local_interrupt = FALSE; faxtester_state_t state; uint8_t image[1000000]; static int next_step(faxtester_state_t *s); static int phase_b_handler(t30_state_t *s, void *user_data, int result) { int i; const char *u; i = (intptr_t) user_data; if ((u = t30_get_rx_ident(s))) printf("%d: Phase B: remote ident '%s'\n", i, u); if ((u = t30_get_rx_sub_address(s))) printf("%d: Phase B: remote sub-address '%s'\n", i, u); if ((u = t30_get_rx_polled_sub_address(s))) printf("%d: Phase B: remote polled sub-address '%s'\n", i, u); if ((u = t30_get_rx_selective_polling_address(s))) printf("%d: Phase B: remote selective polling address '%s'\n", i, u); if ((u = t30_get_rx_sender_ident(s))) printf("%d: Phase B: remote sender ident '%s'\n", i, u); if ((u = t30_get_rx_password(s))) printf("%d: Phase B: remote password '%s'\n", i, u); printf("%d: Phase B handler on channel %d - (0x%X) %s\n", i, i, result, t30_frametype(result)); return T30_ERR_OK; } /*- End of function --------------------------------------------------------*/ static int phase_d_handler(t30_state_t *s, void *user_data, int result) { int i; t30_stats_t t; const char *u; i = (intptr_t) user_data; t30_get_transfer_statistics(s, &t); printf("%d: Phase D handler on channel %d - (0x%X) %s\n", i, i, result, t30_frametype(result)); printf("%d: Phase D: bit rate %d\n", i, t.bit_rate); printf("%d: Phase D: ECM %s\n", i, (t.error_correcting_mode) ? "on" : "off"); printf("%d: Phase D: pages transferred %d\n", i, t.pages_transferred); printf("%d: Phase D: pages in the file %d\n", i, t.pages_in_file); printf("%d: Phase D: image size %d x %d\n", i, t.width, t.length); printf("%d: Phase D: image resolution %d x %d\n", i, t.x_resolution, t.y_resolution); printf("%d: Phase D: bad rows %d\n", i, t.bad_rows); printf("%d: Phase D: longest bad row run %d\n", i, t.longest_bad_row_run); printf("%d: Phase D: compression type %d\n", i, t.encoding); printf("%d: Phase D: image size %d bytes\n", i, t.image_size); if ((u = t30_get_tx_ident(s))) printf("%d: Phase D: local ident '%s'\n", i, u); if ((u = t30_get_rx_ident(s))) printf("%d: Phase D: remote ident '%s'\n", i, u); printf("%d: Phase D: bits per row - min %d, max %d\n", i, s->t4.min_row_bits, s->t4.max_row_bits); if (use_receiver_not_ready) t30_set_receiver_not_ready(s, 3); if (test_local_interrupt) { if (i == 0) { printf("%d: Initiating interrupt request\n", i); t30_local_interrupt_request(s, TRUE); } else { switch (result) { case T30_PIP: case T30_PRI_MPS: case T30_PRI_EOM: case T30_PRI_EOP: printf("%d: Accepting interrupt request\n", i); t30_local_interrupt_request(s, TRUE); break; case T30_PIN: break; } } } return T30_ERR_OK; } /*- End of function --------------------------------------------------------*/ static void phase_e_handler(t30_state_t *s, void *user_data, int result) { int i; t30_stats_t t; const char *u; i = (intptr_t) user_data; printf("%d: Phase E handler on channel %d - (%d) %s\n", i, i, result, t30_completion_code_to_str(result)); t30_get_transfer_statistics(s, &t); printf("%d: Phase E: bit rate %d\n", i, t.bit_rate); printf("%d: Phase E: ECM %s\n", i, (t.error_correcting_mode) ? "on" : "off"); printf("%d: Phase E: pages transferred %d\n", i, t.pages_transferred); printf("%d: Phase E: pages in the file %d\n", i, t.pages_in_file); printf("%d: Phase E: image size %d x %d\n", i, t.width, t.length); printf("%d: Phase E: image resolution %d x %d\n", i, t.x_resolution, t.y_resolution); printf("%d: Phase E: bad rows %d\n", i, t.bad_rows); printf("%d: Phase E: longest bad row run %d\n", i, t.longest_bad_row_run); printf("%d: Phase E: coding method %s\n", i, t4_encoding_to_str(t.encoding)); printf("%d: Phase E: image size %d bytes\n", i, t.image_size); //printf("%d: Phase E: local ident '%s'\n", i, info->ident); if ((u = t30_get_rx_ident(s))) printf("%d: Phase E: remote ident '%s'\n", i, u); if ((u = t30_get_rx_country(s))) printf("%d: Phase E: Remote was made in '%s'\n", i, u); if ((u = t30_get_rx_vendor(s))) printf("%d: Phase E: Remote was made by '%s'\n", i, u); if ((u = t30_get_rx_model(s))) printf("%d: Phase E: Remote is model '%s'\n", i, u); } /*- End of function --------------------------------------------------------*/ static void t30_real_time_frame_handler(t30_state_t *s, void *user_data, int direction, const uint8_t *msg, int len) { printf("T.30: Real time frame handler - %s, %s, length = %d\n", (direction) ? "line->T.30" : "T.30->line", t30_frametype(msg[2]), len); } /*- End of function --------------------------------------------------------*/ static int document_handler(t30_state_t *s, void *user_data, int event) { int i; i = (intptr_t) user_data; printf("%d: Document handler on channel %d - event %d\n", i, i, event); return FALSE; } /*- End of function --------------------------------------------------------*/ static void faxtester_real_time_frame_handler(faxtester_state_t *s, void *user_data, int direction, const uint8_t *msg, int len) { printf("Tester: Real time frame handler - %s, %s, length = %d\n", (direction) ? "line->tester" : "tester->line", t30_frametype(msg[2]), len); if (msg[1] == 0x13) next_step(s); } /*- End of function --------------------------------------------------------*/ static void faxtester_front_end_step_complete_handler(faxtester_state_t *s, void *user_data) { next_step(s); } /*- End of function --------------------------------------------------------*/ static int string_to_msg(uint8_t msg[], uint8_t mask[], const char buf[]) { int i; int x; const char *t; msg[0] = 0; mask[0] = 0xFF; i = 0; t = (char *) buf; while (*t) { /* Skip white space */ while (isspace(*t)) t++; /* If we find ... we allow arbitrary addition info beyond this point in the message */ if (t[0] == '.' && t[1] == '.' && t[2] == '.') { return -i; } else if (isxdigit(*t)) { for ( ; isxdigit(*t); t++) { x = *t; if (x >= 'a') x -= 0x20; if (x >= 'A') x -= ('A' - 10); else x -= '0'; msg[i] = (msg[i] << 4) | x; } mask[i] = 0xFF; if (*t == '/') { /* There is a mask following the byte */ mask[i] = 0; for (t++; isxdigit(*t); t++) { x = *t; if (x >= 'a') x -= 0x20; if (x >= 'A') x -= ('A' - 10); else x -= '0'; mask[i] = (mask[i] << 4) | x; } } if (*t && !isspace(*t)) { /* Bad string */ return 0; } i++; } } return i; } /*- End of function --------------------------------------------------------*/ #if 0 static void string_test2(const uint8_t msg[], int len) { int i; if (len > 0) { for (i = 0; i < len - 1; i++) printf("%02X ", msg[i]); printf("%02X", msg[i]); } } /*- End of function --------------------------------------------------------*/ static void string_test3(const char buf[]) { uint8_t msg[1000]; uint8_t mask[1000]; int len; int i; len = string_to_msg(msg, mask, buf); printf("Len = %d: ", len); string_test2(msg, abs(len)); printf("/"); string_test2(mask, abs(len)); printf("\n"); } /*- End of function --------------------------------------------------------*/ static int string_test(void) { string_test3("FF C8 12 34 56 78"); string_test3("FF C8 12/55 34 56/aA 78 "); string_test3("FF C8 12/55 34 56/aA 78 ..."); string_test3("FF C8 12/55 34 56/aA 78..."); string_test3("FF C8 12/55 34 56/aA 78 ... 99 88 77"); exit(0); } /*- End of function --------------------------------------------------------*/ #endif static void corrupt_image(uint8_t image[], int len, const char *bad_rows) { int i; int j; int k; uint32_t bits; uint32_t bitsx; int list[1000]; int x; int row; const char *s; /* Form the list of rows to be hit */ x = 0; s = bad_rows; while (*s) { while (isspace(*s)) s++; if (sscanf(s, "%d", &list[x]) < 1) break; x++; while (isdigit(*s)) s++; if (*s == ',') s++; } /* Go through the image, and corrupt the first bit of every listed row */ bits = 0x7FF; bitsx = 0x7FF; row = 0; for (i = 0; i < len; i++) { bits ^= (image[i] << 11); bitsx ^= (image[i] << 11); for (j = 0; j < 8; j++) { if ((bits & 0xFFF) == 0x800) { /* We are at an EOL. Is this row in the list of rows to be corrupted? */ row++; for (k = 0; k < x; k++) { if (list[k] == row) { /* Corrupt this row. TSB85 says to hit the first bit after the EOL */ bitsx ^= 0x1000; } } } bits >>= 1; bitsx >>= 1; } image[i] = (bitsx >> 3) & 0xFF; } printf("%d rows found. %d corrupted\n", row, x); } /*- End of function --------------------------------------------------------*/ static int next_step(faxtester_state_t *s) { int delay; int flags; xmlChar *dir; xmlChar *type; xmlChar *modem; xmlChar *value; xmlChar *tag; xmlChar *bad_rows; uint8_t buf[1000]; uint8_t mask[1000]; int i; int hdlc; int short_train; int min_row_bits; int compression; int compression_step; int len; t4_state_t t4_state; if (s->cur == NULL) { if (!s->final_delayed) { /* Add a bit of waiting at the end, to ensure everything gets flushed through, any timers can expire, etc. */ faxtester_set_rx_type(s, T30_MODEM_NONE, FALSE, FALSE); faxtester_set_tx_type(s, T30_MODEM_PAUSE, 120000, FALSE); s->final_delayed = TRUE; return 1; } /* Finished */ exit(0); } while (s->cur && xmlStrcmp(s->cur->name, (const xmlChar *) "step") != 0) s->cur = s->cur->next; if (s->cur == NULL) { /* Finished */ exit(0); } dir = xmlGetProp(s->cur, (const xmlChar *) "dir"); type = xmlGetProp(s->cur, (const xmlChar *) "type"); modem = xmlGetProp(s->cur, (const xmlChar *) "modem"); value = xmlGetProp(s->cur, (const xmlChar *) "value"); tag = xmlGetProp(s->cur, (const xmlChar *) "tag"); bad_rows = xmlGetProp(s->cur, (const xmlChar *) "bad_rows"); s->cur = s->cur->next; printf("Dir - %s, type - %s, modem - %s, value - %s, tag - %s\n", (dir) ? (const char *) dir : "", (type) ? (const char *) type : "", (modem) ? (const char *) modem : "", (value) ? (const char *) value : "", (tag) ? (const char *) tag : ""); if (type == NULL) return 1; /*endif*/ if (dir && strcasecmp((const char *) dir, "R") == 0) { if (strcasecmp((const char *) type, "HDLC") == 0) { faxtester_set_rx_type(s, T30_MODEM_V21, FALSE, TRUE); faxtester_set_tx_type(s, T30_MODEM_NONE, FALSE, FALSE); i = string_to_msg(buf, mask, (const char *) value); bit_reverse(buf, buf, abs(i)); } else { return 0; } } else { if (modem) { hdlc = (strcasecmp((const char *) type, "PREAMBLE") == 0); short_train = (strcasecmp((const char *) type, "TCF") == 0); faxtester_set_rx_type(s, T30_MODEM_NONE, FALSE, FALSE); if (strcasecmp((const char *) modem, "V.21") == 0) { faxtester_set_tx_type(s, T30_MODEM_V21, FALSE, TRUE); } else if (strcasecmp((const char *) modem, "V.17/14400") == 0) { faxtester_set_tx_type(s, T30_MODEM_V17_14400, short_train, hdlc); } else if (strcasecmp((const char *) modem, "V.17/12000") == 0) { faxtester_set_tx_type(s, T30_MODEM_V17_12000, short_train, hdlc); } else if (strcasecmp((const char *) modem, "V.17/9600") == 0) { faxtester_set_tx_type(s, T30_MODEM_V17_9600, short_train, hdlc); } else if (strcasecmp((const char *) modem, "V.17/7200") == 0) { faxtester_set_tx_type(s, T30_MODEM_V17_7200, short_train, hdlc); } else if (strcasecmp((const char *) modem, "V.29/9600") == 0) { faxtester_set_tx_type(s, T30_MODEM_V29_9600, FALSE, hdlc); } else if (strcasecmp((const char *) modem, "V.29/7200") == 0) { faxtester_set_tx_type(s, T30_MODEM_V29_7200, FALSE, hdlc); } else if (strcasecmp((const char *) modem, "V.27ter/4800") == 0) { faxtester_set_tx_type(s, T30_MODEM_V27TER_4800, FALSE, hdlc); } else if (strcasecmp((const char *) modem, "V.27ter/2400") == 0) { faxtester_set_tx_type(s, T30_MODEM_V27TER_2400, FALSE, hdlc); } else { printf("Unrecognised modem\n"); } } if (strcasecmp((const char *) type, "CALL") == 0) { return 0; } else if (strcasecmp((const char *) type, "ANSWER") == 0) { return 0; } else if (strcasecmp((const char *) type, "CNG") == 0) { faxtester_set_rx_type(s, T30_MODEM_NONE, FALSE, FALSE); faxtester_set_tx_type(s, T30_MODEM_CNG, FALSE, FALSE); } else if (strcasecmp((const char *) type, "CED") == 0) { faxtester_set_rx_type(s, T30_MODEM_NONE, FALSE, FALSE); faxtester_set_tx_type(s, T30_MODEM_CED, FALSE, FALSE); } else if (strcasecmp((const char *) type, "WAIT") == 0) { delay = (value) ? atoi((const char *) value) : 1; faxtester_set_rx_type(s, T30_MODEM_NONE, FALSE, FALSE); faxtester_set_tx_type(s, T30_MODEM_PAUSE, delay, FALSE); } else if (strcasecmp((const char *) type, "PREAMBLE") == 0) { flags = (value) ? atoi((const char *) value) : 37; faxtester_send_hdlc_flags(s, flags); } else if (strcasecmp((const char *) type, "POSTAMBLE") == 0) { flags = (value) ? atoi((const char *) value) : 5; faxtester_send_hdlc_flags(s, flags); } else if (strcasecmp((const char *) type, "HDLC") == 0) { i = string_to_msg(buf, mask, (const char *) value); bit_reverse(buf, buf, abs(i)); faxtester_send_hdlc_msg(s, buf, abs(i)); } else if (strcasecmp((const char *) type, "TCF") == 0) { if (value) i = atoi((const char *) value); else i = 450; memset(image, 0, i); faxtester_set_image_buffer(s, image, i); } else if (strcasecmp((const char *) type, "MSG") == 0) { min_row_bits = 0; compression_step = 0; if (t4_tx_init(&t4_state, (const char *) value, -1, -1) == NULL) { printf("Failed to init T.4 send\n"); exit(2); } t4_tx_set_min_row_bits(&t4_state, min_row_bits); t4_tx_set_header_info(&t4_state, NULL); switch (compression_step) { case 0: compression = T4_COMPRESSION_ITU_T4_1D; break; case 1: compression = T4_COMPRESSION_ITU_T4_2D; break; case 2: compression = T4_COMPRESSION_ITU_T6; break; } t4_tx_set_tx_encoding(&t4_state, compression); if (t4_tx_start_page(&t4_state)) { printf("Failed to start T.4 send\n"); exit(2); } len = t4_tx_get_chunk(&t4_state, image, sizeof(image)); if (bad_rows) { printf("We need to corrupt the image\n"); corrupt_image(image, len, (const char *) bad_rows); } t4_tx_end(&t4_state); faxtester_set_image_buffer(s, image, len); } else { return 0; } /*endif*/ } /*endif*/ return 1; } /*- End of function --------------------------------------------------------*/ static void exchange(faxtester_state_t *s) { int16_t amp[SAMPLES_PER_CHUNK]; int16_t out_amp[2*SAMPLES_PER_CHUNK]; int len; int i; fax_state_t fax; int total_audio_time; const char *input_tiff_file_name; const char *output_tiff_file_name; int log_audio; t30_state_t *t30; log_audio = TRUE; input_tiff_file_name = INPUT_TIFF_FILE_NAME; output_tiff_file_name = OUTPUT_TIFF_FILE_NAME; if (log_audio) { if ((filesetup = afNewFileSetup()) == AF_NULL_FILESETUP) { fprintf(stderr, " Failed to create file setup\n"); exit(2); } afInitSampleFormat(filesetup, AF_DEFAULT_TRACK, AF_SAMPFMT_TWOSCOMP, 16); afInitRate(filesetup, AF_DEFAULT_TRACK, (float) SAMPLE_RATE); afInitFileFormat(filesetup, AF_FILE_WAVE); afInitChannels(filesetup, AF_DEFAULT_TRACK, 2); if ((out_handle = afOpenFile(OUTPUT_FILE_NAME_WAVE, "w", filesetup)) == AF_NULL_FILEHANDLE) { fprintf(stderr, " Cannot create wave file '%s'\n", OUTPUT_FILE_NAME_WAVE); exit(2); } } total_audio_time = 0; faxtester_set_transmit_on_idle(&state, TRUE); faxtester_set_real_time_frame_handler(&state, faxtester_real_time_frame_handler, NULL); faxtester_set_front_end_step_complete_handler(&state, faxtester_front_end_step_complete_handler, NULL); fax_init(&fax, FALSE); t30 = fax_get_t30_state(&fax); fax_set_transmit_on_idle(&fax, TRUE); fax_set_tep_mode(&fax, TRUE); t30_set_tx_ident(t30, "1234567890"); t30_set_tx_sub_address(t30, "Sub-address"); t30_set_tx_sender_ident(t30, "Sender ID"); t30_set_tx_password(t30, "Password"); t30_set_tx_polled_sub_address(t30, "Polled sub-address"); t30_set_tx_selective_polling_address(t30, "Sel polling address"); t30_set_tx_nsf(t30, (const uint8_t *) "\x50\x00\x00\x00Spandsp\x00", 12); t30_set_ecm_capability(t30, TRUE); t30_set_supported_t30_features(t30, T30_SUPPORT_IDENTIFICATION | T30_SUPPORT_SELECTIVE_POLLING | T30_SUPPORT_SUB_ADDRESSING); t30_set_supported_image_sizes(t30, T30_SUPPORT_US_LETTER_LENGTH | T30_SUPPORT_US_LEGAL_LENGTH | T30_SUPPORT_UNLIMITED_LENGTH | T30_SUPPORT_215MM_WIDTH | T30_SUPPORT_255MM_WIDTH | T30_SUPPORT_303MM_WIDTH); t30_set_supported_resolutions(t30, T30_SUPPORT_STANDARD_RESOLUTION | T30_SUPPORT_FINE_RESOLUTION | T30_SUPPORT_SUPERFINE_RESOLUTION | T30_SUPPORT_R8_RESOLUTION | T30_SUPPORT_R16_RESOLUTION | T30_SUPPORT_300_300_RESOLUTION | T30_SUPPORT_400_400_RESOLUTION | T30_SUPPORT_600_600_RESOLUTION | T30_SUPPORT_1200_1200_RESOLUTION | T30_SUPPORT_300_600_RESOLUTION | T30_SUPPORT_400_800_RESOLUTION | T30_SUPPORT_600_1200_RESOLUTION); t30_set_supported_modems(t30, T30_SUPPORT_V27TER | T30_SUPPORT_V29 | T30_SUPPORT_V17); t30_set_supported_compressions(t30, T30_SUPPORT_T4_1D_COMPRESSION | T30_SUPPORT_T4_2D_COMPRESSION | T30_SUPPORT_T6_COMPRESSION); t30_set_phase_b_handler(t30, phase_b_handler, (void *) (intptr_t) 1); t30_set_phase_d_handler(t30, phase_d_handler, (void *) (intptr_t) 1); t30_set_phase_e_handler(t30, phase_e_handler, (void *) (intptr_t) 1); t30_set_real_time_frame_handler(t30, t30_real_time_frame_handler, (void *) (intptr_t) 1); t30_set_document_handler(t30, document_handler, (void *) (intptr_t) 1); t30_set_rx_file(t30, output_tiff_file_name, -1); //t30_set_tx_file(t30, input_tiff_file_name, -1, -1); span_log_set_level(&t30->logging, SPAN_LOG_SHOW_SEVERITY | SPAN_LOG_SHOW_PROTOCOL | SPAN_LOG_SHOW_TAG | SPAN_LOG_SHOW_SAMPLE_TIME | SPAN_LOG_FLOW); span_log_set_tag(&t30->logging, "A"); span_log_set_level(&fax.fe.modems.v29_rx.logging, SPAN_LOG_SHOW_SEVERITY | SPAN_LOG_SHOW_PROTOCOL | SPAN_LOG_SHOW_TAG | SPAN_LOG_SHOW_SAMPLE_TIME | SPAN_LOG_FLOW); span_log_set_tag(&fax.fe.modems.v29_rx.logging, "A"); span_log_set_level(&fax.logging, SPAN_LOG_SHOW_SEVERITY | SPAN_LOG_SHOW_PROTOCOL | SPAN_LOG_SHOW_TAG | SPAN_LOG_SHOW_SAMPLE_TIME | SPAN_LOG_FLOW); span_log_set_tag(&fax.logging, "A"); while (next_step(s) == 0) ; for (;;) { len = fax_tx(&fax, amp, SAMPLES_PER_CHUNK); faxtester_rx(s, amp, len); if (log_audio) { for (i = 0; i < len; i++) out_amp[2*i + 0] = amp[i]; } total_audio_time += SAMPLES_PER_CHUNK; span_log_bump_samples(&fax.t30.logging, len); span_log_bump_samples(&fax.fe.modems.v29_rx.logging, len); span_log_bump_samples(&fax.logging, len); len = faxtester_tx(s, amp, 160); if (fax_rx(&fax, amp, len)) break; if (log_audio) { for (i = 0; i < len; i++) out_amp[2*i + 1] = amp[i]; if (afWriteFrames(out_handle, AF_DEFAULT_TRACK, out_amp, SAMPLES_PER_CHUNK) != SAMPLES_PER_CHUNK) break; } } if (log_audio) { if (afCloseFile(out_handle)) { fprintf(stderr, " Cannot close wave file '%s'\n", OUTPUT_FILE_NAME_WAVE); exit(2); } afFreeFileSetup(filesetup); } } /*- End of function --------------------------------------------------------*/ static int parse_test_group(faxtester_state_t *s, xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur, const char *test) { xmlChar *x; while (cur) { if (xmlStrcmp(cur->name, (const xmlChar *) "test") == 0) { if ((x = xmlGetProp(cur, (const xmlChar *) "name"))) { if (xmlStrcmp(x, (const xmlChar *) test) == 0) { printf("Found '%s'\n", (char *) x); s->cur = cur->xmlChildrenNode; return 0; } /*endif*/ } /*endif*/ } /*endif*/ cur = cur->next; } /*endwhile*/ return -1; } /*- End of function --------------------------------------------------------*/ static int get_test_set(faxtester_state_t *s, const char *test_file, const char *test) { xmlDocPtr doc; xmlNsPtr ns; xmlNodePtr cur; #if 0 xmlValidCtxt valid; #endif ns = NULL; xmlKeepBlanksDefault(0); xmlCleanupParser(); doc = xmlParseFile(test_file); if (doc == NULL) { fprintf(stderr, "No document\n"); exit(2); } /*endif*/ xmlXIncludeProcess(doc); #if 0 if (!xmlValidateDocument(&valid, doc)) { fprintf(stderr, "Invalid document\n"); exit(2); } /*endif*/ #endif /* Check the document is of the right kind */ if ((cur = xmlDocGetRootElement(doc)) == NULL) { fprintf(stderr, "Empty document\n"); xmlFreeDoc(doc); exit(2); } /*endif*/ if (xmlStrcmp(cur->name, (const xmlChar *) "fax-tests")) { fprintf(stderr, "Document of the wrong type, root node != fax-tests"); xmlFreeDoc(doc); exit(2); } /*endif*/ cur = cur->xmlChildrenNode; while (cur && xmlIsBlankNode(cur)) cur = cur->next; /*endwhile*/ if (cur == NULL) exit(2); /*endif*/ while (cur) { if (xmlStrcmp(cur->name, (const xmlChar *) "test-group") == 0) { if (parse_test_group(s, doc, ns, cur->xmlChildrenNode, test) == 0) { /* We found the test we want, so run it. */ exchange(s); break; } /*endif*/ } /*endif*/ cur = cur->next; } /*endwhile*/ xmlFreeDoc(doc); return 0; } /*- End of function --------------------------------------------------------*/ int main(int argc, char *argv[]) { const char *test_name; //string_test(); test_name = "MRGN01"; if (argc > 1) test_name = argv[1]; faxtester_init(&state, TRUE); get_test_set(&state, "../spandsp/tsb85.xml", test_name); printf("Done\n"); return 0; } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/tests/fax_tester.c0000644000175000017500000005713711150047203020551 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * faxtester_tests.c * * Written by Steve Underwood * * Copyright (C) 2003, 2005, 2006 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: fax_tester.c,v 1.4 2008/07/17 14:27:11 steveu Exp $ */ /*! \file */ #if defined(HAVE_CONFIG_H) #include #endif #include #include #include #include #include "floating_fudge.h" #if defined(HAVE_TGMATH_H) #include #endif #if defined(HAVE_MATH_H) #include #endif #include #include #include #include #if defined(HAVE_LIBXML_XMLMEMORY_H) #include #endif #if defined(HAVE_LIBXML_PARSER_H) #include #endif #if defined(HAVE_LIBXML_XINCLUDE_H) #include #endif #include "spandsp.h" #include "fax_tester.h" #define HDLC_FRAMING_OK_THRESHOLD 5 static void timer_update(faxtester_state_t *s, int len) { } /*- End of function --------------------------------------------------------*/ static void front_end_step_complete(faxtester_state_t *s) { if (s->front_end_step_complete_handler) s->front_end_step_complete_handler(s, s->front_end_step_complete_user_data); } /*- End of function --------------------------------------------------------*/ void faxtester_send_hdlc_flags(faxtester_state_t *s, int flags) { hdlc_tx_flags(&(s->hdlctx), flags); } /*- End of function --------------------------------------------------------*/ void faxtester_send_hdlc_msg(faxtester_state_t *s, const uint8_t *msg, int len) { hdlc_tx_frame(&(s->hdlctx), msg, len); } /*- End of function --------------------------------------------------------*/ static void hdlc_underflow_handler(void *user_data) { faxtester_state_t *s; s = (faxtester_state_t *) user_data; front_end_step_complete(s); } /*- End of function --------------------------------------------------------*/ static int modem_tx_status(void *user_data, int status) { faxtester_state_t *s; s = (faxtester_state_t *) user_data; switch (status) { case MODEM_TX_STATUS_DATA_EXHAUSTED: printf("Tx data exhausted\n"); break; case MODEM_TX_STATUS_SHUTDOWN_COMPLETE: printf("Tx shutdown complete\n"); front_end_step_complete(s); break; default: printf("Tx status is %d\n", status); break; } return 0; } /*- End of function --------------------------------------------------------*/ static int non_ecm_get_bit(void *user_data) { faxtester_state_t *s; int bit; s = (faxtester_state_t *) user_data; if (s->image_bit_ptr == 0) { if (s->image_ptr >= s->image_len) return PUTBIT_END_OF_DATA; s->image_bit_ptr = 8; s->image_ptr++; } s->image_bit_ptr--; bit = (s->image_buffer[s->image_ptr] >> (7 - s->image_bit_ptr)) & 0x01; //printf("Rx bit - %d\n", bit); return bit; } /*- End of function --------------------------------------------------------*/ void faxtester_set_image_buffer(faxtester_state_t *s, const uint8_t *buf, int len) { s->image_ptr = 0; s->image_bit_ptr = 8; s->image_len = len; s->image_buffer = buf; } /*- End of function --------------------------------------------------------*/ static void non_ecm_put_bit(void *user_data, int bit) { faxtester_state_t *s; s = (faxtester_state_t *) user_data; if (bit < 0) { /* Special conditions */ switch (bit) { case PUTBIT_TRAINING_IN_PROGRESS: break; case PUTBIT_TRAINING_FAILED: span_log(&s->logging, SPAN_LOG_FLOW, "Non-ECM carrier training failed\n"); s->rx_trained = FALSE; break; case PUTBIT_TRAINING_SUCCEEDED: /* The modem is now trained */ span_log(&s->logging, SPAN_LOG_FLOW, "Non-ECM carrier trained\n"); s->rx_trained = TRUE; break; case PUTBIT_CARRIER_UP: span_log(&s->logging, SPAN_LOG_FLOW, "Non-ECM carrier up\n"); break; case PUTBIT_CARRIER_DOWN: span_log(&s->logging, SPAN_LOG_FLOW, "Non-ECM carrier down\n"); s->rx_trained = FALSE; break; default: span_log(&s->logging, SPAN_LOG_WARNING, "Unexpected non-ECM special bit - %d!\n", bit); break; } return; } } /*- End of function --------------------------------------------------------*/ static void hdlc_accept(void *user_data, const uint8_t *msg, int len, int ok) { faxtester_state_t *s; s = (faxtester_state_t *) user_data; if (len < 0) { /* Special conditions */ switch (len) { case PUTBIT_TRAINING_IN_PROGRESS: break; case PUTBIT_TRAINING_FAILED: span_log(&s->logging, SPAN_LOG_FLOW, "HDLC carrier training failed\n"); s->rx_trained = FALSE; break; case PUTBIT_TRAINING_SUCCEEDED: /* The modem is now trained */ span_log(&s->logging, SPAN_LOG_FLOW, "HDLC carrier trained\n"); s->rx_trained = TRUE; break; case PUTBIT_CARRIER_UP: span_log(&s->logging, SPAN_LOG_FLOW, "HDLC carrier up\n"); break; case PUTBIT_CARRIER_DOWN: span_log(&s->logging, SPAN_LOG_FLOW, "HDLC carrier down\n"); s->rx_trained = FALSE; break; case PUTBIT_FRAMING_OK: span_log(&s->logging, SPAN_LOG_FLOW, "HDLC framing OK\n"); break; case PUTBIT_ABORT: /* Just ignore these */ break; default: span_log(&s->logging, SPAN_LOG_FLOW, "Unexpected HDLC special length - %d!\n", len); break; } return; } if (s->real_time_frame_handler) s->real_time_frame_handler(s, s->real_time_frame_user_data, TRUE, msg, len); } /*- End of function --------------------------------------------------------*/ static int dummy_rx(void *user_data, const int16_t amp[], int len) { return 0; } /*- End of function --------------------------------------------------------*/ static int early_v17_rx(void *user_data, const int16_t amp[], int len) { faxtester_state_t *s; s = (faxtester_state_t *) user_data; v17_rx(&(s->v17_rx), amp, len); fsk_rx(&(s->v21_rx), amp, len); if (s->rx_trained) { /* The fast modem has trained, so we no longer need to run the slow one in parallel. */ span_log(&s->logging, SPAN_LOG_FLOW, "Switching from V.17 + V.21 to V.17 (%.2fdBm0)\n", v17_rx_signal_power(&(s->v17_rx))); s->rx_handler = (span_rx_handler_t *) &v17_rx; s->rx_user_data = &(s->v17_rx); } return 0; } /*- End of function --------------------------------------------------------*/ static int early_v27ter_rx(void *user_data, const int16_t amp[], int len) { faxtester_state_t *s; s = (faxtester_state_t *) user_data; v27ter_rx(&(s->v27ter_rx), amp, len); fsk_rx(&(s->v21_rx), amp, len); if (s->rx_trained) { /* The fast modem has trained, so we no longer need to run the slow one in parallel. */ span_log(&s->logging, SPAN_LOG_FLOW, "Switching from V.27ter + V.21 to V.27ter (%.2fdBm0)\n", v27ter_rx_signal_power(&(s->v27ter_rx))); s->rx_handler = (span_rx_handler_t *) &v27ter_rx; s->rx_user_data = &(s->v27ter_rx); } return 0; } /*- End of function --------------------------------------------------------*/ static int early_v29_rx(void *user_data, const int16_t amp[], int len) { faxtester_state_t *s; s = (faxtester_state_t *) user_data; v29_rx(&(s->v29_rx), amp, len); fsk_rx(&(s->v21_rx), amp, len); if (s->rx_trained) { /* The fast modem has trained, so we no longer need to run the slow one in parallel. */ span_log(&s->logging, SPAN_LOG_FLOW, "Switching from V.29 + V.21 to V.29 (%.2fdBm0)\n", v29_rx_signal_power(&(s->v29_rx))); s->rx_handler = (span_rx_handler_t *) &v29_rx; s->rx_user_data = &(s->v29_rx); } return 0; } /*- End of function --------------------------------------------------------*/ int faxtester_rx(faxtester_state_t *s, int16_t *amp, int len) { int i; for (i = 0; i < len; i++) amp[i] = dc_restore(&(s->dc_restore), amp[i]); s->rx_handler(s->rx_user_data, amp, len); timer_update(s, len); return 0; } /*- End of function --------------------------------------------------------*/ int faxtester_tx(faxtester_state_t *s, int16_t *amp, int max_len) { int len; int required_len; required_len = max_len; len = 0; if (s->transmit) { while ((len += s->tx_handler(s->tx_user_data, amp + len, max_len - len)) < max_len) { /* Allow for a change of tx handler within a block */ front_end_step_complete(s); if (!s->transmit) { if (s->transmit_on_idle) { /* Pad to the requested length with silence */ memset(amp + len, 0, (max_len - len)*sizeof(int16_t)); len = max_len; } break; } } } else { if (s->transmit_on_idle) { /* Pad to the requested length with silence */ memset(amp, 0, max_len*sizeof(int16_t)); len = max_len; } } return len; } /*- End of function --------------------------------------------------------*/ void faxtester_set_rx_type(void *user_data, int type, int short_train, int use_hdlc) { faxtester_state_t *s; put_bit_func_t put_bit_func; void *put_bit_user_data; s = (faxtester_state_t *) user_data; span_log(&s->logging, SPAN_LOG_FLOW, "Set rx type %d\n", type); if (s->current_rx_type == type) return; s->current_rx_type = type; if (use_hdlc) { put_bit_func = (put_bit_func_t) hdlc_rx_put_bit; put_bit_user_data = (void *) &(s->hdlcrx); hdlc_rx_init(&(s->hdlcrx), FALSE, FALSE, HDLC_FRAMING_OK_THRESHOLD, hdlc_accept, s); } else { put_bit_func = non_ecm_put_bit; put_bit_user_data = (void *) s; } switch (type) { case T30_MODEM_V21: if (s->flush_handler) s->flush_handler(s, s->flush_user_data, 3); fsk_rx_init(&(s->v21_rx), &preset_fsk_specs[FSK_V21CH2], TRUE, (put_bit_func_t) hdlc_rx_put_bit, put_bit_user_data); fsk_rx_signal_cutoff(&(s->v21_rx), -45.5); s->rx_handler = (span_rx_handler_t *) &fsk_rx; s->rx_user_data = &(s->v21_rx); break; case T30_MODEM_V27TER_2400: v27ter_rx_restart(&(s->v27ter_rx), 2400, FALSE); v27ter_rx_set_put_bit(&(s->v27ter_rx), put_bit_func, put_bit_user_data); s->rx_handler = (span_rx_handler_t *) &early_v27ter_rx; s->rx_user_data = s; break; case T30_MODEM_V27TER_4800: v27ter_rx_restart(&(s->v27ter_rx), 4800, FALSE); v27ter_rx_set_put_bit(&(s->v27ter_rx), put_bit_func, put_bit_user_data); s->rx_handler = (span_rx_handler_t *) &early_v27ter_rx; s->rx_user_data = s; break; case T30_MODEM_V29_7200: v29_rx_restart(&(s->v29_rx), 7200, FALSE); v29_rx_set_put_bit(&(s->v29_rx), put_bit_func, put_bit_user_data); s->rx_handler = (span_rx_handler_t *) &early_v29_rx; s->rx_user_data = s; break; case T30_MODEM_V29_9600: v29_rx_restart(&(s->v29_rx), 9600, FALSE); v29_rx_set_put_bit(&(s->v29_rx), put_bit_func, put_bit_user_data); s->rx_handler = (span_rx_handler_t *) &early_v29_rx; s->rx_user_data = s; break; case T30_MODEM_V17_7200: v17_rx_restart(&(s->v17_rx), 7200, short_train); v17_rx_set_put_bit(&(s->v17_rx), put_bit_func, put_bit_user_data); s->rx_handler = (span_rx_handler_t *) &early_v17_rx; s->rx_user_data = s; break; case T30_MODEM_V17_9600: v17_rx_restart(&(s->v17_rx), 9600, short_train); v17_rx_set_put_bit(&(s->v17_rx), put_bit_func, put_bit_user_data); s->rx_handler = (span_rx_handler_t *) &early_v17_rx; s->rx_user_data = s; break; case T30_MODEM_V17_12000: v17_rx_restart(&(s->v17_rx), 12000, short_train); v17_rx_set_put_bit(&(s->v17_rx), put_bit_func, put_bit_user_data); s->rx_handler = (span_rx_handler_t *) &early_v17_rx; s->rx_user_data = s; break; case T30_MODEM_V17_14400: v17_rx_restart(&(s->v17_rx), 14400, short_train); v17_rx_set_put_bit(&(s->v17_rx), put_bit_func, put_bit_user_data); s->rx_handler = (span_rx_handler_t *) &early_v17_rx; s->rx_user_data = s; break; case T30_MODEM_DONE: span_log(&s->logging, SPAN_LOG_FLOW, "FAX exchange complete\n"); default: s->rx_handler = (span_rx_handler_t *) &dummy_rx; s->rx_user_data = s; break; } } /*- End of function --------------------------------------------------------*/ void faxtester_set_tx_type(void *user_data, int type, int short_train, int use_hdlc) { faxtester_state_t *s; tone_gen_descriptor_t tone_desc; get_bit_func_t get_bit_func; void *get_bit_user_data; s = (faxtester_state_t *) user_data; span_log(&s->logging, SPAN_LOG_FLOW, "Set tx type %d\n", type); if (s->current_tx_type == type) return; if (use_hdlc) { get_bit_func = (get_bit_func_t) hdlc_tx_get_bit; get_bit_user_data = (void *) &(s->hdlctx); } else { get_bit_func = non_ecm_get_bit; get_bit_user_data = (void *) s; } switch (type) { case T30_MODEM_PAUSE: silence_gen_alter(&(s->silence_gen), ms_to_samples(short_train)); s->tx_handler = (span_tx_handler_t *) &silence_gen; s->tx_user_data = &(s->silence_gen); s->transmit = TRUE; break; case T30_MODEM_CNG: /* 0.5s of 1100Hz+-38Hz + 3.0s of silence repeating. Timing +-15% */ make_tone_gen_descriptor(&tone_desc, 1100, -11, 0, 0, 500, 3000, 0, 0, TRUE); tone_gen_init(&(s->tone_gen), &tone_desc); s->tx_handler = (span_tx_handler_t *) &tone_gen; s->tx_user_data = &(s->tone_gen); s->transmit = TRUE; break; case T30_MODEM_CED: /* 0.2s of silence, then 2.6s to 4s of 2100Hz+-15Hz tone, then 75ms of silence. The 75ms of silence will be inserted by the pre V.21 pause we use for any switch to V.21. */ silence_gen_alter(&(s->silence_gen), ms_to_samples(200)); make_tone_gen_descriptor(&tone_desc, 2100, -11, 0, 0, 2600, 0, 0, 0, FALSE); tone_gen_init(&(s->tone_gen), &tone_desc); s->tx_handler = (span_tx_handler_t *) &tone_gen; s->tx_user_data = &(s->tone_gen); s->transmit = TRUE; break; case T30_MODEM_V21: fsk_tx_init(&(s->v21_tx), &preset_fsk_specs[FSK_V21CH2], get_bit_func, get_bit_user_data); fsk_tx_set_modem_status_handler(&(s->v21_tx), modem_tx_status, (void *) s); s->tx_handler = (span_tx_handler_t *) &fsk_tx; s->tx_user_data = &(s->v21_tx); s->transmit = TRUE; break; case T30_MODEM_V27TER_2400: v27ter_tx_restart(&(s->v27ter_tx), 2400, s->use_tep); v27ter_tx_set_get_bit(&(s->v27ter_tx), get_bit_func, get_bit_user_data); v27ter_tx_set_modem_status_handler(&(s->v27ter_tx), modem_tx_status, (void *) s); s->tx_handler = (span_tx_handler_t *) &v27ter_tx; s->tx_user_data = &(s->v27ter_tx); hdlc_tx_flags(&(s->hdlctx), 60); s->transmit = TRUE; break; case T30_MODEM_V27TER_4800: v27ter_tx_restart(&(s->v27ter_tx), 4800, s->use_tep); v27ter_tx_set_get_bit(&(s->v27ter_tx), get_bit_func, get_bit_user_data); v27ter_tx_set_modem_status_handler(&(s->v27ter_tx), modem_tx_status, (void *) s); s->tx_handler = (span_tx_handler_t *) &v27ter_tx; s->tx_user_data = &(s->v27ter_tx); hdlc_tx_flags(&(s->hdlctx), 120); s->transmit = TRUE; break; case T30_MODEM_V29_7200: v29_tx_restart(&(s->v29_tx), 7200, s->use_tep); v29_tx_set_get_bit(&(s->v29_tx), get_bit_func, get_bit_user_data); v29_tx_set_modem_status_handler(&(s->v29_tx), modem_tx_status, (void *) s); s->tx_handler = (span_tx_handler_t *) &v29_tx; s->tx_user_data = &(s->v29_tx); hdlc_tx_flags(&(s->hdlctx), 180); s->transmit = TRUE; break; case T30_MODEM_V29_9600: v29_tx_restart(&(s->v29_tx), 9600, s->use_tep); v29_tx_set_get_bit(&(s->v29_tx), get_bit_func, get_bit_user_data); v29_tx_set_modem_status_handler(&(s->v29_tx), modem_tx_status, (void *) s); s->tx_handler = (span_tx_handler_t *) &v29_tx; s->tx_user_data = &(s->v29_tx); hdlc_tx_flags(&(s->hdlctx), 240); s->transmit = TRUE; break; case T30_MODEM_V17_7200: v17_tx_restart(&(s->v17_tx), 7200, s->use_tep, short_train); v17_tx_set_get_bit(&(s->v17_tx), get_bit_func, get_bit_user_data); v17_tx_set_modem_status_handler(&(s->v17_tx), modem_tx_status, (void *) s); s->tx_handler = (span_tx_handler_t *) &v17_tx; s->tx_user_data = &(s->v17_tx); hdlc_tx_flags(&(s->hdlctx), 180); s->transmit = TRUE; break; case T30_MODEM_V17_9600: v17_tx_restart(&(s->v17_tx), 9600, s->use_tep, short_train); v17_tx_set_get_bit(&(s->v17_tx), get_bit_func, get_bit_user_data); v17_tx_set_modem_status_handler(&(s->v17_tx), modem_tx_status, (void *) s); s->tx_handler = (span_tx_handler_t *) &v17_tx; s->tx_user_data = &(s->v17_tx); hdlc_tx_flags(&(s->hdlctx), 240); s->transmit = TRUE; break; case T30_MODEM_V17_12000: v17_tx_restart(&(s->v17_tx), 12000, s->use_tep, short_train); v17_tx_set_get_bit(&(s->v17_tx), get_bit_func, get_bit_user_data); v17_tx_set_modem_status_handler(&(s->v17_tx), modem_tx_status, (void *) s); s->tx_handler = (span_tx_handler_t *) &v17_tx; s->tx_user_data = &(s->v17_tx); hdlc_tx_flags(&(s->hdlctx), 300); s->transmit = TRUE; break; case T30_MODEM_V17_14400: v17_tx_restart(&(s->v17_tx), 14400, s->use_tep, short_train); v17_tx_set_get_bit(&(s->v17_tx), get_bit_func, get_bit_user_data); v17_tx_set_modem_status_handler(&(s->v17_tx), modem_tx_status, (void *) s); s->tx_handler = (span_tx_handler_t *) &v17_tx; s->tx_user_data = &(s->v17_tx); hdlc_tx_flags(&(s->hdlctx), 360); s->transmit = TRUE; break; case T30_MODEM_DONE: span_log(&s->logging, SPAN_LOG_FLOW, "FAX exchange complete\n"); /* Fall through */ default: silence_gen_alter(&(s->silence_gen), 0); s->tx_handler = (span_tx_handler_t *) &silence_gen; s->tx_user_data = &(s->silence_gen); s->transmit = FALSE; break; } s->current_tx_type = type; } /*- End of function --------------------------------------------------------*/ void faxtester_set_transmit_on_idle(faxtester_state_t *s, int transmit_on_idle) { s->transmit_on_idle = transmit_on_idle; } /*- End of function --------------------------------------------------------*/ void faxtester_set_tep_mode(faxtester_state_t *s, int use_tep) { s->use_tep = use_tep; } /*- End of function --------------------------------------------------------*/ void faxtester_set_real_time_frame_handler(faxtester_state_t *s, faxtester_real_time_frame_handler_t *handler, void *user_data) { s->real_time_frame_handler = handler; s->real_time_frame_user_data = user_data; } /*- End of function --------------------------------------------------------*/ void faxtester_set_front_end_step_complete_handler(faxtester_state_t *s, faxtester_front_end_step_complete_handler_t *handler, void *user_data) { s->front_end_step_complete_handler = handler; s->front_end_step_complete_user_data = user_data; } /*- End of function --------------------------------------------------------*/ faxtester_state_t *faxtester_init(faxtester_state_t *s, int calling_party) { if (s == NULL) { if ((s = (faxtester_state_t *) malloc(sizeof(*s))) == NULL) return NULL; } memset(s, 0, sizeof(*s)); span_log_init(&s->logging, SPAN_LOG_NONE, NULL); span_log_set_protocol(&s->logging, "FAX"); hdlc_rx_init(&(s->hdlcrx), FALSE, FALSE, HDLC_FRAMING_OK_THRESHOLD, hdlc_accept, &s); fsk_rx_init(&(s->v21_rx), &preset_fsk_specs[FSK_V21CH2], TRUE, (put_bit_func_t) hdlc_rx_put_bit, &(s->hdlcrx)); fsk_rx_signal_cutoff(&(s->v21_rx), -45.5); hdlc_tx_init(&(s->hdlctx), FALSE, 2, FALSE, hdlc_underflow_handler, s); fsk_tx_init(&(s->v21_tx), &preset_fsk_specs[FSK_V21CH2], (get_bit_func_t) hdlc_tx_get_bit, &(s->hdlctx)); fsk_tx_set_modem_status_handler(&(s->v21_tx), modem_tx_status, (void *) s); v17_rx_init(&(s->v17_rx), 14400, non_ecm_put_bit, s); v17_tx_init(&(s->v17_tx), 14400, s->use_tep, non_ecm_get_bit, s); v17_tx_set_modem_status_handler(&(s->v17_tx), modem_tx_status, (void *) s); v29_rx_init(&(s->v29_rx), 9600, non_ecm_put_bit, s); v29_rx_signal_cutoff(&(s->v29_rx), -45.5); v29_tx_init(&(s->v29_tx), 9600, s->use_tep, non_ecm_get_bit, s); v29_tx_set_modem_status_handler(&(s->v29_tx), modem_tx_status, (void *) s); v27ter_rx_init(&(s->v27ter_rx), 4800, non_ecm_put_bit, s); v27ter_tx_init(&(s->v27ter_tx), 4800, s->use_tep, non_ecm_get_bit, s); v27ter_tx_set_modem_status_handler(&(s->v27ter_tx), modem_tx_status, (void *) s); silence_gen_init(&(s->silence_gen), 0); dc_restore_init(&(s->dc_restore)); s->rx_handler = (span_rx_handler_t *) &dummy_rx; s->rx_user_data = NULL; faxtester_set_tx_type(s, T30_MODEM_NONE, FALSE, FALSE); return s; } /*- End of function --------------------------------------------------------*/ int faxtester_release(faxtester_state_t *s) { return 0; } /*- End of function --------------------------------------------------------*/ int faxtester_free(faxtester_state_t *s) { free(s); return 0; } /*- End of function --------------------------------------------------------*/ void faxtester_set_flush_handler(faxtester_state_t *s, faxtester_flush_handler_t *handler, void *user_data) { s->flush_handler = handler; s->flush_user_data = user_data; } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/tests/tone_generate_tests.c0000644000175000017500000001271311150047203022435 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * tone_generate_tests.c * * Written by Steve Underwood * * Copyright (C) 2001 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2, as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: tone_generate_tests.c,v 1.18 2008/05/13 13:17:26 steveu Exp $ */ /*! \page tone_generate_tests_page Tone generation tests \section tone_generate_tests_page_sec_1 What does it do? */ #if defined(HAVE_CONFIG_H) #include "config.h" #endif #include #include #include #include #include #include #include "spandsp.h" #define OUTPUT_FILE_NAME "tone_generate.wav" int main(int argc, char *argv[]) { tone_gen_descriptor_t tone_desc; tone_gen_state_t tone_state; int i; int16_t amp[16384]; int len; AFfilehandle outhandle; AFfilesetup filesetup; int outframes; filesetup = afNewFileSetup (); if (filesetup == AF_NULL_FILESETUP) { fprintf(stderr, " Failed to create file setup\n"); exit(2); } afInitSampleFormat(filesetup, AF_DEFAULT_TRACK, AF_SAMPFMT_TWOSCOMP, 16); afInitRate(filesetup, AF_DEFAULT_TRACK, 8000.0); //afInitCompression(filesetup, AF_DEFAULT_TRACK, AF_COMPRESSION_G711_ALAW); afInitFileFormat(filesetup, AF_FILE_WAVE); afInitChannels(filesetup, AF_DEFAULT_TRACK, 1); outhandle = afOpenFile(OUTPUT_FILE_NAME, "w", filesetup); if (outhandle == AF_NULL_FILEHANDLE) { fprintf(stderr, " Cannot open wave file '%s'\n", OUTPUT_FILE_NAME); exit(2); } make_tone_gen_descriptor(&tone_desc, 440, -10, 620, -15, 100, 200, 300, 400, FALSE); tone_gen_init(&tone_state, &tone_desc); for (i = 0; i < 1000; i++) { len = tone_gen(&tone_state, amp, 160); printf("Generated %d samples\n", len); if (len <= 0) break; outframes = afWriteFrames(outhandle, AF_DEFAULT_TRACK, amp, len); } make_tone_gen_descriptor(&tone_desc, 350, -10, 440, -15, 100, 200, 300, 400, TRUE); tone_gen_init(&tone_state, &tone_desc); for (i = 0; i < 1000; i++) { len = tone_gen(&tone_state, amp, 160); printf("Generated %d samples\n", len); if (len <= 0) break; outframes = afWriteFrames(outhandle, AF_DEFAULT_TRACK, amp, len); } make_tone_gen_descriptor(&tone_desc, 400, -10, 450, -10, 100, 200, 300, 400, TRUE); tone_gen_init(&tone_state, &tone_desc); for (i = 0; i < 1000; i++) { len = tone_gen(&tone_state, amp, 160); printf("Generated %d samples\n", len); if (len <= 0) break; outframes = afWriteFrames(outhandle, AF_DEFAULT_TRACK, amp, len); } make_tone_gen_descriptor(&tone_desc, 425, -10, -50, 100, 100, 200, 300, 400, TRUE); tone_gen_init(&tone_state, &tone_desc); for (i = 0; i < 1000; i++) { len = tone_gen(&tone_state, amp, 160); printf("Generated %d samples\n", len); if (len <= 0) break; outframes = afWriteFrames(outhandle, AF_DEFAULT_TRACK, amp, len); } if (afCloseFile(outhandle) != 0) { fprintf(stderr, " Cannot close wave file '%s'\n", OUTPUT_FILE_NAME); exit (2); } afFreeFileSetup(filesetup); return 0; } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/tests/vector_float_tests.c0000644000175000017500000000361311150047203022304 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * vector_float_tests.c * * Written by Steve Underwood * * Copyright (C) 2006 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2, as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: vector_float_tests.c,v 1.9 2008/05/13 13:17:27 steveu Exp $ */ #if defined(HAVE_CONFIG_H) #include "config.h" #endif #include #include #include #include #include #include "spandsp.h" static double vec_dot_prod_dumb(const double x[], const double y[], int n) { int i; double z; z = 0.0; for (i = 0; i < n; i++) z += x[i]*y[i]; return z; } /*- End of function --------------------------------------------------------*/ int main(int argc, char *argv[]) { int i; double x[100]; double y[100]; double zsa; double zsb; for (i = 0; i < 99; i++) { x[i] = rand(); y[i] = rand(); } zsa = vec_dot_prod(x, y, 99); zsb = vec_dot_prod_dumb(x, y, 99); if (zsa != zsb) { printf("Tests failed\n"); exit(2); } printf("Tests passed.\n"); return 0; } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/tests/sig_tone_tests.c0000644000175000017500000001712311150047203021425 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * test_sig_tone.c * * Written by Steve Underwood * * Copyright (C) 2004 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2, as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: sig_tone_tests.c,v 1.20 2008/05/13 13:17:26 steveu Exp $ */ /*! \file */ /*! \page sig_tone_tests_page The signaling tone processor tests \section sig_tone_tests_sec_1 What does it do? ???. \section sig_tone_tests_sec_2 How does it work? ???. */ #if defined(HAVE_CONFIG_H) #include "config.h" #endif #include #include #include #include #include "spandsp.h" #define OUT_FILE_NAME "sig_tone.wav" static int sampleno = 0; static int tone_1_present = 0; static int tone_2_present = 0; static int ping = 0; void map_frequency_response(sig_tone_state_t *s); static int handler(void *user_data, int what) { //printf("What - %d\n", what); if ((what & SIG_TONE_1_CHANGE)) { tone_1_present = what & SIG_TONE_1_PRESENT; printf("Tone 1 is %s after %d samples\n", (tone_1_present) ? "on" : "off", (what >> 16) & 0xFFFF); } /*endif*/ if ((what & SIG_TONE_2_CHANGE)) { tone_2_present = what & SIG_TONE_2_PRESENT; printf("Tone 2 is %s after %d samples\n", (tone_2_present) ? "on" : "off", (what >> 16) & 0xFFFF); } /*endif*/ if ((what & SIG_TONE_UPDATE_REQUEST)) { /* The signaling processor wants to know what to do next */ if (sampleno < 800) { /* 100ms off-hook */ printf("100ms off-hook - %d samples\n", 800 - sampleno); return 0x02 | ((800 - sampleno) << 16) | SIG_TONE_RX_PASSTHROUGH; } /*endif*/ if (sampleno < 4800) { /* 500ms idle */ printf("500ms idle - %d samples\n", 4800 - sampleno); return 0x02 | SIG_TONE_1_PRESENT | ((4800 - sampleno) << 16) | SIG_TONE_RX_PASSTHROUGH; } /*endif*/ if (sampleno < 5600) { /* 100ms seize */ printf("100ms seize - %d samples\n", 5600 - sampleno); return 0x02 | ((5600 - sampleno) << 16) | SIG_TONE_RX_PASSTHROUGH; } /*endif*/ if (ping) { printf("33ms break - 262 samples\n"); ping = !ping; return 0x02 | (262 << 16) | SIG_TONE_RX_PASSTHROUGH; } else { printf("67ms make - 528 samples\n"); ping = !ping; return 0x02 | SIG_TONE_1_PRESENT | (528 << 16) | SIG_TONE_RX_PASSTHROUGH; } /*endif*/ } /*endif*/ return 0; } /*- End of function --------------------------------------------------------*/ void map_frequency_response(sig_tone_state_t *s) { int16_t buf[8192]; awgn_state_t noise_source; int i; int f; uint32_t phase_acc; int32_t phase_rate; int32_t scaling; double sum; /* Things like noise don't highlight the frequency response of the high Q notch very well. We use a slowly swept frequency to check it. */ awgn_init_dbm0(&noise_source, 1234567, -10.0f); for (f = 1; f < 4000; f++) { phase_rate = dds_phase_rate(f); scaling = dds_scaling_dbm0(-10); phase_acc = 0; for (i = 0; i < 8192; i++) buf[i] = dds_mod(&phase_acc, phase_rate, scaling, 0); /*endfor*/ sig_tone_rx(s, buf, 8192); sum = 0.0; for (i = 1000; i < 8192; i++) sum += (double) buf[i]*(double) buf[i]; /*endfor*/ sum = sqrt(sum); printf("%7d %f\n", f, sum); } /*endfor*/ } /*- End of function --------------------------------------------------------*/ int main(int argc, char *argv[]) { int16_t amp[160]; int16_t out_amp[2*160]; AFfilehandle outhandle; AFfilesetup filesetup; int outframes; int i; int rx_samples; int tx_samples; sig_tone_state_t state; awgn_state_t noise_source; filesetup = afNewFileSetup(); if (filesetup == AF_NULL_FILESETUP) { fprintf(stderr, " Failed to create file setup\n"); exit(2); } /*endif*/ afInitSampleFormat(filesetup, AF_DEFAULT_TRACK, AF_SAMPFMT_TWOSCOMP, 16); afInitRate(filesetup, AF_DEFAULT_TRACK, (float) SAMPLE_RATE); afInitFileFormat(filesetup, AF_FILE_WAVE); afInitChannels(filesetup, AF_DEFAULT_TRACK, 2); outhandle = afOpenFile(OUT_FILE_NAME, "w", filesetup); if (outhandle == AF_NULL_FILEHANDLE) { fprintf(stderr, " Cannot create wave file '%s'\n", OUT_FILE_NAME); exit(2); } /*endif*/ awgn_init_dbm0(&noise_source, 1234567, -30.0f); printf("2400Hz/26000Hz tests.\n"); sig_tone_init(&state, SIG_TONE_2400HZ_2600HZ, handler, NULL); state.current_tx_tone |= SIG_TONE_RX_PASSTHROUGH; map_frequency_response(&state); for (sampleno = 0; sampleno < 20000; sampleno += 160) { tx_samples = 160; for (i = 0; i < tx_samples; i++) amp[i] = alaw_to_linear(linear_to_alaw(awgn(&noise_source))); /*endfor*/ for (i = 0; i < tx_samples; i++) out_amp[2*i] = amp[i]; /*endfor*/ rx_samples = sig_tone_rx(&state, amp, tx_samples); for (i = 0; i < rx_samples; i++) out_amp[2*i + 1] = amp[i]; /*endfor*/ outframes = afWriteFrames(outhandle, AF_DEFAULT_TRACK, out_amp, rx_samples); if (outframes != rx_samples) { fprintf(stderr, " Error writing wave file\n"); exit(2); } /*endif*/ } printf("2280Hz tests.\n"); sig_tone_init(&state, SIG_TONE_2280HZ, handler, NULL); state.current_tx_tone |= SIG_TONE_RX_PASSTHROUGH; map_frequency_response(&state); for (sampleno = 0; sampleno < 20000; sampleno += 160) { memset(amp, 0, sizeof(int16_t)*160); tx_samples = sig_tone_tx(&state, amp, 160); for (i = 0; i < tx_samples; i++) out_amp[2*i] = amp[i]; /*endfor*/ rx_samples = sig_tone_rx(&state, amp, tx_samples); for (i = 0; i < rx_samples; i++) out_amp[2*i + 1] = amp[i]; /*endfor*/ outframes = afWriteFrames(outhandle, AF_DEFAULT_TRACK, out_amp, rx_samples); if (outframes != rx_samples) { fprintf(stderr, " Error writing wave file\n"); exit(2); } /*endif*/ } /*endfor*/ if (afCloseFile(outhandle) != 0) { fprintf(stderr, " Cannot close wave file '%s'\n", OUT_FILE_NAME); exit(2); } /*endif*/ afFreeFileSetup(filesetup); printf("Tests completed.\n"); return 0; } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/tests/noise_tests.c0000644000175000017500000002172011150047203020731 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * noise_tests.c * * Written by Steve Underwood * * Copyright (C) 2005 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2, as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: noise_tests.c,v 1.14 2008/05/13 13:17:26 steveu Exp $ */ /*! \page noise_tests_page Noise generator tests \section noise_tests_page_sec_1 What does it do? */ #if defined(HAVE_CONFIG_H) #include "config.h" #endif #include #include #include #include #include "spandsp.h" #if !defined(M_PI) # define M_PI 3.14159265358979323846 /* pi */ #endif #define OUT_FILE_NAME "noise.wav" /* Some simple sanity tests for the noise generation routines */ int main (int argc, char *argv[]) { int i; int j; int level; int clip_high; int clip_low; int total_samples; int seed = 1234567; int outframes; int16_t value; double total; double x; double p; double o; int bins[65536]; int16_t amp[1024]; noise_state_t noise_source; AFfilehandle outhandle; AFfilesetup filesetup; if ((filesetup = afNewFileSetup()) == AF_NULL_FILESETUP) { fprintf(stderr, " Failed to create file setup\n"); exit(2); } afInitSampleFormat(filesetup, AF_DEFAULT_TRACK, AF_SAMPFMT_TWOSCOMP, 16); afInitRate(filesetup, AF_DEFAULT_TRACK, (float) SAMPLE_RATE); afInitFileFormat(filesetup, AF_FILE_WAVE); afInitChannels(filesetup, AF_DEFAULT_TRACK, 1); if ((outhandle = afOpenFile(OUT_FILE_NAME, "w", filesetup)) == AF_NULL_FILEHANDLE) { fprintf(stderr, " Cannot create wave file '%s'\n", OUT_FILE_NAME); exit(2); } /* Generate AWGN at several RMS levels between -50dBOv and 0dBOv. Noise is generated for a large number of samples (1,000,000), and the RMS value of the noise is calculated along the way. If the resulting level is close to the requested RMS level, at least the scaling of the noise should be Ok. At high levels some clipping may distort the result a little. */ printf("Testing with quality 7 AWGN\n"); for (level = -50; level <= 0; level += 5) { clip_high = 0; clip_low = 0; total = 0.0; noise_init_dbov(&noise_source, seed, (float) level, NOISE_CLASS_AWGN, 7); total_samples = 1000000; for (i = 0; i < total_samples; i++) { value = noise(&noise_source); if (value == 32767) clip_high++; else if (value == -32768) clip_low++; total += ((double) value)*((double) value); } printf ("RMS = %.3f (expected %d) %.2f%% error [clipped samples %d+%d]\n", log10(sqrt(total/total_samples)/32768.0)*20.0, level, 100.0*(1.0 - sqrt(total/total_samples)/(pow(10.0, level/20.0)*32768.0)), clip_low, clip_high); if (level < -5 && fabs(log10(sqrt(total/total_samples)/32768.0)*20.0 - level) > 0.2) { printf("Test failed\n"); exit(2); } } printf("Testing with quality 20 AWGN\n"); for (level = -50; level <= 0; level += 5) { clip_high = 0; clip_low = 0; total = 0.0; noise_init_dbov(&noise_source, seed, (float) level, NOISE_CLASS_AWGN, 20); total_samples = 1000000; for (i = 0; i < total_samples; i++) { value = noise(&noise_source); if (value == 32767) clip_high++; else if (value == -32768) clip_low++; total += ((double) value)*((double) value); } printf ("RMS = %.3f (expected %d) %.2f%% error [clipped samples %d+%d]\n", log10(sqrt(total/total_samples)/32768.0)*20.0, level, 100.0*(1.0 - sqrt(total/total_samples)/(pow(10.0, level/20.0)*32768.0)), clip_low, clip_high); if (level < -5 && fabs(log10(sqrt(total/total_samples)/32768.0)*20.0 - level) > 0.2) { printf("Test failed\n"); exit(2); } } /* Now look at the statistical spread of the results, by collecting data in bins from a large number of samples. Use a fairly high noise level, but low enough to avoid significant clipping. Use the Gaussian model to predict the real probability, and present the results for graphing. */ memset(bins, 0, sizeof(bins)); clip_high = 0; clip_low = 0; level = -15; noise_init_dbov(&noise_source, seed, (float) level, NOISE_CLASS_AWGN, 7); total_samples = 10000000; for (i = 0; i < total_samples; i++) { value = noise(&noise_source); if (value == 32767) clip_high++; else if (value == -32768) clip_low++; bins[value + 32768]++; } /* Find the RMS power level to expect */ o = pow(10.0, level/20.0)*(32768.0*0.70711); for (i = 0; i < 65536 - 10; i++) { x = i - 32768; /* Find the real probability for this bin */ p = (1.0/(o*sqrt(2.0*M_PI)))*exp(-(x*x)/(2.0*o*o)); /* Now do a little smoothing on the real data to get a reasonably steady answer */ x = 0; for (j = 0; j < 10; j++) x += bins[i + j]; x /= 10.0; x /= total_samples; /* Now send it out for graphing. */ if (p > 0.0000001) printf("%6d %.7f %.7f\n", i - 32768, x, p); } printf("Generating AWGN at -15dBOv to file\n"); for (j = 0; j < 50; j++) { for (i = 0; i < 1024; i++) amp[i] = noise(&noise_source); outframes = afWriteFrames(outhandle, AF_DEFAULT_TRACK, amp, 1024); if (outframes != 1024) { fprintf(stderr, " Error writing wave file\n"); exit(2); } } /* Generate AWGN at several RMS levels between -50dBm and 0dBm. Noise is generated for a large number of samples (1,000,000), and the RMS value of the noise is calculated along the way. If the resulting level is close to the requested RMS level, at least the scaling of the noise should be Ok. At high levels some clipping may distort the result a little. */ printf("Testing with quality 7 Hoth noise.\n"); for (level = -50; level <= 0; level += 5) { clip_high = 0; clip_low = 0; total = 0.0; noise_init_dbov(&noise_source, seed, (float) level, NOISE_CLASS_HOTH, 7); total_samples = 1000000; for (i = 0; i < total_samples; i++) { value = noise(&noise_source); if (value == 32767) clip_high++; else if (value == -32768) clip_low++; total += ((double) value)*((double) value); } printf ("RMS = %.3f (expected %d) %.2f%% error [clipped samples %d+%d]\n", log10(sqrt(total/total_samples)/32768.0)*20.0, level, 100.0*(1.0 - sqrt(total/total_samples)/(pow(10.0, level/20.0)*32768.0)), clip_low, clip_high); if (level < -5 && fabs(log10(sqrt(total/total_samples)/32768.0)*20.0 - level) > 0.2) { printf("Test failed\n"); exit(2); } } printf("Generating Hoth noise at -15dBOv to file\n"); level = -15; noise_init_dbov(&noise_source, seed, (float) level, NOISE_CLASS_HOTH, 7); for (j = 0; j < 50; j++) { for (i = 0; i < 1024; i++) amp[i] = noise(&noise_source); outframes = afWriteFrames(outhandle, AF_DEFAULT_TRACK, amp, 1024); if (outframes != 1024) { fprintf(stderr, " Error writing wave file\n"); exit(2); } } if (afCloseFile(outhandle)) { fprintf(stderr, " Cannot close wave file '%s'\n", OUT_FILE_NAME); exit(2); } afFreeFileSetup(filesetup); printf("Tests passed.\n"); return 0; } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/tests/echo_monitor.cpp0000644000175000017500000003021611150047203021417 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * echo_monitor.cpp - Display echo canceller status, using the FLTK toolkit. * * Written by Steve Underwood * * Copyright (C) 2004 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2, as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: echo_monitor.cpp,v 1.12 2008/05/27 15:08:21 steveu Exp $ */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #if defined(HAVE_FL_FL_H) && defined(HAVE_FL_FL_CARTESIAN_H) #define __STDC_LIMIT_MACROS #include #include #include #include #include #include #include #if defined(HAVE_FFTW3_H) #include #else #include #endif #include #include #include #include #include #include #include "spandsp.h" #include "echo_monitor.h" Fl_Double_Window *w; Fl_Audio_Meter *audio_meter; Fl_Group *c_spec; Fl_Group *c_right; Fl_Group *c_can; Fl_Group *c_line_model; Ca_Canvas *canvas_spec; Ca_X_Axis *spec_freq; Ca_Y_Axis *spec_amp; Ca_Line *spec_re = NULL; double spec_re_plot[2*512]; Ca_Canvas *canvas_can; Ca_X_Axis *can_x; Ca_Y_Axis *can_y; Ca_Line *can_re = NULL; double can_re_plot[512]; Ca_Canvas *canvas_line_model; Ca_X_Axis *line_model_x; Ca_Y_Axis *line_model_y; Ca_Line *line_model_re = NULL; double line_model_re_plot[512]; static int skip = 0; int in_ptr; #if defined(HAVE_FFTW3_H) double in[1024][2]; double out[1024][2]; #else fftw_complex in[1024]; fftw_complex out[1024]; #endif fftw_plan p; int echo_can_monitor_can_update(const int16_t *coeffs, int len) { int i; float min; float max; if (can_re) delete can_re; canvas_can->current(canvas_can); i = 0; min = coeffs[i]; max = coeffs[i]; for (i = 0; i < len; i++) { can_re_plot[2*i] = i; can_re_plot[2*i + 1] = coeffs[i]; if (min > coeffs[i]) min = coeffs[i]; if (max < coeffs[i]) max = coeffs[i]; } can_y->maximum((max == min) ? max + 0.2 : max); can_y->minimum(min); can_re = new Ca_Line(len, can_re_plot, 0, 0, FL_BLUE, CA_NO_POINT); if (++skip >= 100) { skip = 0; Fl::check(); } return 0; } /*- End of function --------------------------------------------------------*/ int echo_can_monitor_line_model_update(const int32_t *coeffs, int len) { int i; float min; float max; if (line_model_re) delete line_model_re; canvas_line_model->current(canvas_line_model); i = 0; min = coeffs[i]; max = coeffs[i]; for (i = 0; i < len; i++) { line_model_re_plot[2*i] = i; line_model_re_plot[2*i + 1] = coeffs[i]; if (min > coeffs[i]) min = coeffs[i]; if (max < coeffs[i]) max = coeffs[i]; } line_model_y->maximum((max == min) ? max + 0.2 : max); line_model_y->minimum(min); line_model_re = new Ca_Line(len, line_model_re_plot, 0, 0, FL_BLUE, CA_NO_POINT); if (++skip >= 100) { skip = 0; Fl::check(); } return 0; } /*- End of function --------------------------------------------------------*/ int echo_can_monitor_line_spectrum_update(const int16_t amp[], int len) { int i; int x; for (i = 0; i < len; i++) audio_meter->sample(amp[i]/32768.0); if (in_ptr + len < 512) { /* Just add this fragment to the buffer. */ for (i = 0; i < len; i++) #if defined(HAVE_FFTW3_H) in[in_ptr + i][0] = amp[i]; #else in[in_ptr + i].re = amp[i]; #endif in_ptr += len; return 0; } if (len >= 512) { /* We have enough for a whole block. Use the last 512 samples we have. */ x = len - 512; for (i = 0; i < 512; i++) #if defined(HAVE_FFTW3_H) in[i][0] = amp[x + i]; #else in[i].re = amp[x + i]; #endif } else { /* We want the last 512 samples. */ x = 512 - len; for (i = 0; i < x; i++) #if defined(HAVE_FFTW3_H) in[i][0] = in[in_ptr - x + i][0]; #else in[i].re = in[in_ptr - x + i].re; #endif for (i = x; i < 512; i++) #if defined(HAVE_FFTW3_H) in[i][0] = amp[i - x]; #else in[i].re = amp[i - x]; #endif } in_ptr = 0; #if defined(HAVE_FFTW3_H) fftw_execute(p); #else fftw_one(p, in, out); #endif if (spec_re) delete spec_re; canvas_spec->current(canvas_spec); for (i = 0; i < 512; i++) { spec_re_plot[2*i] = i*4000.0/512.0; #if defined(HAVE_FFTW3_H) spec_re_plot[2*i + 1] = 20.0*log10(sqrt(out[i][0]*out[i][0] + out[i][1]*out[i][1])/(256.0*32768)) + 3.14; #else spec_re_plot[2*i + 1] = 20.0*log10(sqrt(out[i].re*out[i].re + out[i].im*out[i].im)/(256.0*32768)) + 3.14; #endif } spec_re = new Ca_Line(512, spec_re_plot, 0, 0, FL_BLUE, CA_NO_POINT); Fl::check(); return 0; } /*- End of function --------------------------------------------------------*/ int start_echo_can_monitor(int len) { char buf[132 + 1]; float x; float y; int i; w = new Fl_Double_Window(850, 400, "Echo canceller monitor"); c_spec = new Fl_Group(0, 0, 380, 400); c_spec->box(FL_DOWN_BOX); c_spec->align(FL_ALIGN_TOP | FL_ALIGN_INSIDE); canvas_spec = new Ca_Canvas(60, 30, 300, 300, "Spectrum"); canvas_spec->box(FL_PLASTIC_DOWN_BOX); canvas_spec->color(7); canvas_spec->align(FL_ALIGN_TOP); canvas_spec->border(15); spec_freq = new Ca_X_Axis(65, 330, 290, 30, "Freq (Hz)"); spec_freq->align(FL_ALIGN_BOTTOM); spec_freq->minimum(0); spec_freq->maximum(4000); spec_freq->label_format("%g"); spec_freq->minor_grid_color(fl_gray_ramp(20)); spec_freq->major_grid_color(fl_gray_ramp(15)); spec_freq->label_grid_color(fl_gray_ramp(10)); spec_freq->grid_visible(CA_LABEL_GRID | CA_ALWAYS_VISIBLE); spec_freq->minor_grid_style(FL_DOT); spec_freq->major_step(5); spec_freq->label_step(1); spec_freq->axis_color(FL_BLACK); spec_freq->axis_align(CA_BOTTOM | CA_LINE); spec_amp = new Ca_Y_Axis(20, 35, 40, 290, "Amp (dBmO)"); spec_amp->align(FL_ALIGN_LEFT); spec_amp->minimum(-80.0); spec_amp->maximum(10.0); spec_amp->minor_grid_color(fl_gray_ramp(20)); spec_amp->major_grid_color(fl_gray_ramp(15)); spec_amp->label_grid_color(fl_gray_ramp(10)); //spec_amp->grid_visible(CA_MINOR_TICK | CA_MAJOR_TICK | CA_LABEL_GRID | CA_ALWAYS_VISIBLE); spec_amp->grid_visible(CA_LABEL_GRID | CA_ALWAYS_VISIBLE); spec_amp->minor_grid_style(FL_DOT); spec_amp->major_step(5); spec_amp->label_step(1); spec_amp->axis_color(FL_BLACK); spec_amp->current(); c_spec->end(); c_right = new Fl_Group(440, 0, 465, 405); c_can = new Fl_Group(380, 0, 415, 200); c_can->box(FL_DOWN_BOX); c_can->align(FL_ALIGN_TOP | FL_ALIGN_INSIDE); c_can->current(); canvas_can = new Ca_Canvas(460, 35, 300, 100, "Canceller coefficients"); canvas_can->box(FL_PLASTIC_DOWN_BOX); canvas_can->color(7); canvas_can->align(FL_ALIGN_TOP); Fl_Group::current()->resizable(canvas_can); canvas_can->border(15); can_x = new Ca_X_Axis(465, 135, 290, 30, "Tap"); can_x->align(FL_ALIGN_BOTTOM); can_x->minimum(0.0); can_x->maximum((float) len); can_x->label_format("%g"); can_x->minor_grid_color(fl_gray_ramp(20)); can_x->major_grid_color(fl_gray_ramp(15)); can_x->label_grid_color(fl_gray_ramp(10)); can_x->grid_visible(CA_LABEL_GRID | CA_ALWAYS_VISIBLE); can_x->minor_grid_style(FL_DOT); can_x->major_step(5); can_x->label_step(1); can_x->axis_align(CA_BOTTOM | CA_LINE); can_x->axis_color(FL_BLACK); can_x->current(); can_y = new Ca_Y_Axis(420, 40, 40, 90, "Amp"); can_y->align(FL_ALIGN_LEFT); can_y->minimum(-0.1); can_y->maximum(0.1); can_y->minor_grid_color(fl_gray_ramp(20)); can_y->major_grid_color(fl_gray_ramp(15)); can_y->label_grid_color(fl_gray_ramp(10)); can_y->grid_visible(CA_LABEL_GRID | CA_ALWAYS_VISIBLE); can_y->minor_grid_style(FL_DOT); can_y->major_step(5); can_y->label_step(1); can_y->axis_color(FL_BLACK); can_y->current(); c_can->end(); c_line_model = new Fl_Group(380, 200, 415, 200); c_line_model->box(FL_DOWN_BOX); c_line_model->align(FL_ALIGN_TOP | FL_ALIGN_INSIDE); c_line_model->current(); canvas_line_model = new Ca_Canvas(460, 235, 300, 100, "Line impulse response model"); canvas_line_model->box(FL_PLASTIC_DOWN_BOX); canvas_line_model->color(7); canvas_line_model->align(FL_ALIGN_TOP); Fl_Group::current()->resizable(canvas_line_model); canvas_line_model->border(15); line_model_x = new Ca_X_Axis(465, 335, 290, 30, "Tap"); line_model_x->align(FL_ALIGN_BOTTOM); line_model_x->minimum(0.0); line_model_x->maximum((float) len); line_model_x->label_format("%g"); line_model_x->minor_grid_color(fl_gray_ramp(20)); line_model_x->major_grid_color(fl_gray_ramp(15)); line_model_x->label_grid_color(fl_gray_ramp(10)); line_model_x->grid_visible(CA_LABEL_GRID | CA_ALWAYS_VISIBLE); line_model_x->minor_grid_style(FL_DOT); line_model_x->major_step(5); line_model_x->label_step(1); line_model_x->axis_align(CA_BOTTOM | CA_LINE); line_model_x->axis_color(FL_BLACK); line_model_x->current(); line_model_y = new Ca_Y_Axis(420, 240, 40, 90, "Amp"); line_model_y->align(FL_ALIGN_LEFT); line_model_y->minimum(-0.1); line_model_y->maximum(0.1); line_model_y->minor_grid_color(fl_gray_ramp(20)); line_model_y->major_grid_color(fl_gray_ramp(15)); line_model_y->label_grid_color(fl_gray_ramp(10)); line_model_y->grid_visible(CA_LABEL_GRID | CA_ALWAYS_VISIBLE); line_model_y->minor_grid_style(FL_DOT); line_model_y->major_step(5); line_model_y->label_step(1); line_model_y->axis_color(FL_BLACK); line_model_y->current(); c_line_model->end(); audio_meter = new Fl_Audio_Meter(810, 40, 10, 250, ""); audio_meter->box(FL_PLASTIC_UP_BOX); audio_meter->type(FL_VERT_AUDIO_METER); c_right->end(); Fl_Group::current()->resizable(c_right); w->end(); w->show(); #if defined(HAVE_FFTW3_H) p = fftw_plan_dft_1d(1024, in, out, FFTW_BACKWARD, FFTW_ESTIMATE); for (i = 0; i < 1024; i++) { in[i][0] = 0.0; in[i][1] = 0.0; } #else p = fftw_create_plan(1024, FFTW_BACKWARD, FFTW_ESTIMATE); for (i = 0; i < 1024; i++) { in[i].re = 0.0; in[i].im = 0.0; } #endif in_ptr = 0; Fl::check(); return 0; } /*- End of function --------------------------------------------------------*/ void echo_can_monitor_wait_to_end(void) { fd_set rfds; int res; struct timeval tv; fprintf(stderr, "Processing complete. Press the key to end\n"); do { usleep(100000); Fl::check(); FD_ZERO(&rfds); FD_SET(0, &rfds); tv.tv_usec = 100000; tv.tv_sec = 0; res = select(1, &rfds, NULL, NULL, &tv); } while (res <= 0); } /*- End of function --------------------------------------------------------*/ void echo_can_monitor_update_display(void) { Fl::check(); Fl::check(); Fl::check(); Fl::check(); Fl::check(); Fl::check(); Fl::check(); Fl::check(); Fl::check(); Fl::check(); Fl::check(); Fl::check(); } /*- End of function --------------------------------------------------------*/ #endif /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/tests/gsm0610_tests.c0000644000175000017500000004702011150047203020712 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * gsm0610_tests.c - Test the GSM 06.10 FR codec. * * Written by Steve Underwood * * Copyright (C) 2006 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2, as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: gsm0610_tests.c,v 1.16 2008/05/13 13:17:25 steveu Exp $ */ /*! \file */ /*! \page gsm0610_tests_page GSM 06.10 full rate codec tests \section gsm0610_tests_page_sec_1 What does it do? Two sets of tests are performed: - The tests defined in the GSM 06.10 specification, using the test data files supplied with the specification. - A generally audio quality test, consisting of compressing and decompressing a speeech file for audible comparison. The speech file should be recorded at 16 bits/sample, 8000 samples/second, and named "pre_gsm0610.wav". \section gsm0610_tests_page_sec_2 How is it used? To perform the tests in the GSM 06.10 specification you need to obtain the test data files from the specification. These are copyright material, and so cannot be distributed with this test software. They can, however, be freely downloaded from the ETSI web site. The files, containing test vectors, which are supplied with the GSM 06.10 specification, should be copied to etsitests/gsm0610/unpacked so the files are arranged in the following directories. ./fr_A: Seq01-A.cod Seq01-A.inp Seq01-A.out Seq02-A.cod Seq02-A.inp Seq02-A.out Seq03-A.cod Seq03-A.inp Seq03-A.out Seq04-A.cod Seq04-A.inp Seq04-A.out Seq05-A.out ./fr_L: Seq01.cod Seq01.inp Seq01.out Seq02.cod Seq02.inp Seq02.out Seq03.cod Seq03.inp Seq03.out Seq04.cod Seq04.inp Seq04.out Seq05.cod Seq05.out ./fr_U: Seq01-U.cod Seq01-U.inp Seq01-U.out Seq02-U.cod Seq02-U.inp Seq02-U.out Seq03-U.cod Seq03-U.inp Seq03-U.out Seq04-U.cod Seq04-U.inp Seq04-U.out Seq05-U.out ./fr_homing_A: Homing01_A.out Seq01H_A.cod Seq01H_A.inp Seq01H_A.out Seq02H_A.cod Seq02H_A.inp Seq02H_A.out Seq03H_A.cod Seq03H_A.inp Seq03H_A.out Seq04H_A.cod Seq04H_A.inp Seq04H_A.out Seq05H_A.out Seq06H_A.cod Seq06H_A.inp ./fr_homing_L: Homing01.cod Homing01.out Seq01h.cod Seq01h.inp Seq01h.out Seq02h.cod Seq02h.inp Seq02h.out Seq03h.cod Seq03h.inp Seq03h.out Seq04h.cod Seq04h.inp Seq04h.out Seq05h.cod Seq05h.out Seq06h.cod Seq06h.inp ./fr_homing_U: Homing01_U.out Seq01H_U.cod Seq01H_U.inp Seq01H_U.out Seq02H_U.cod Seq02H_U.inp Seq02H_U.out Seq03H_U.cod Seq03H_U.inp Seq03H_U.out Seq04H_U.cod Seq04H_U.inp Seq04H_U.out Seq05H_U.out Seq06H_U.cod Seq06H_U.inp ./fr_sync_A: Seqsync_A.inp Sync000_A.cod --to-- Sync159_A.cod ./fr_sync_L: Bitsync.inp Seqsync.inp Sync000.cod --to-- Sync159.cod ./fr_sync_U: Seqsync_U.inp Sync000_U.cod --to-- Sync159_U.cod This is different from the directory structure in which they are supplied. Also, the files names are a little different. The supplied names are messy, and inconsistent across the sets. The names required by these tests just clean up these inconsistencies. Note that you will need a Windows machine to unpack some of the supplied files. To perform a general audio quality test, gsm0610_tests should be run. The file ../test-data/local/short_nb_voice.wav will be compressed to GSM 06.10 data, decompressed, and the resulting audio stored in post_gsm0610.wav. */ #if defined(HAVE_CONFIG_H) #include "config.h" #endif #include #include #include #include #include #include #include #include "spandsp.h" #define BLOCK_LEN 160 #define TESTDATA_DIR "../test-data/etsi/gsm0610/unpacked/fr_" #define IN_FILE_NAME "../test-data/local/short_nb_voice.wav" #define OUT_FILE_NAME "post_gsm0610.wav" #define HIST_LEN 1000 uint8_t law_in_vector[1000000]; int16_t in_vector[1000000]; uint16_t code_vector_buf[1000000]; uint8_t code_vector[1000000]; uint8_t ref_code_vector[1000000]; uint8_t decoder_code_vector[1000000]; uint8_t law_out_vector[1000000]; int16_t out_vector[1000000]; int16_t ref_out_vector[1000000]; uint8_t ref_law_out_vector[1000000]; int vector_len; static int get_test_vector(int full, int disk, const char *name) { char buf[500]; int in; int len; int i; if (full) { sprintf(buf, "%s%c/%s.inp", TESTDATA_DIR, 'L', name); if ((in = open(buf, O_RDONLY)) < 0) { fprintf(stderr, "Cannot open %s\n", buf); exit(2); } len = read(in, in_vector, 1000000); close(in); len /= sizeof(int16_t); vector_len = len; } sprintf(buf, "%s%c/%s.out", TESTDATA_DIR, 'L', name); if ((in = open(buf, O_RDONLY)) < 0) { fprintf(stderr, "Cannot open %s\n", buf); exit(2); } len = read(in, ref_out_vector, 1000000); close(in); len /= sizeof(int16_t); if (full) { if (len != vector_len) { fprintf(stderr, "Input and reference vector lengths do not match - %d %d\n", vector_len, len); exit(2); } } else { vector_len = len; } sprintf(buf, "%s%c/%s.cod", TESTDATA_DIR, 'L', name); if ((in = open(buf, O_RDONLY)) < 0) { fprintf(stderr, "Cannot open %s\n", buf); exit(2); } len = read(in, code_vector_buf, 1000000); close(in); len /= sizeof(int16_t); for (i = 0; i < len; i++) { ref_code_vector[i] = code_vector_buf[i]; decoder_code_vector[i] = code_vector_buf[i]; } if (len*BLOCK_LEN != vector_len*76) { fprintf(stderr, "Input and code vector lengths do not match - %d %d\n", vector_len, len); exit(2); } return len; } /*- End of function --------------------------------------------------------*/ static int get_law_test_vector(int full, int law, const char *name) { char buf[500]; int in; int len; int i; int law_uc; law_uc = toupper(law); if (full) { sprintf(buf, "%s%c/%s-%c.inp", TESTDATA_DIR, law_uc, name, law_uc); if ((in = open(buf, O_RDONLY)) < 0) { fprintf(stderr, "Cannot open %s\n", buf); exit(2); } len = read(in, law_in_vector, 1000000); close(in); vector_len = len; sprintf(buf, "%s%c/%s-%c.cod", TESTDATA_DIR, law_uc, name, law_uc); if ((in = open(buf, O_RDONLY)) < 0) { fprintf(stderr, "Cannot open %s\n", buf); exit(2); } len = read(in, code_vector_buf, 1000000); close(in); len /= sizeof(int16_t); for (i = 0; i < len; i++) ref_code_vector[i] = code_vector_buf[i]; if (len*BLOCK_LEN != vector_len*76) { fprintf(stderr, "Input and code vector lengths do not match - %d %d\n", vector_len, len); exit(2); } } sprintf(buf, "%s%c/%s-%c.out", TESTDATA_DIR, law_uc, name, law_uc); if ((in = open(buf, O_RDONLY)) < 0) { fprintf(stderr, "Cannot open %s\n", buf); exit(2); } len = read(in, ref_law_out_vector, 1000000); close(in); if (full) { if (len != vector_len) { fprintf(stderr, "Input and reference vector lengths do not match - %d %d\n", vector_len, len); exit(2); } } else { vector_len = len; } sprintf(buf, "%s%c/%s.cod", TESTDATA_DIR, 'L', name); if ((in = open(buf, O_RDONLY)) < 0) { fprintf(stderr, "Cannot open %s\n", buf); exit(2); } len = read(in, code_vector_buf, 1000000); close(in); len /= sizeof(int16_t); for (i = 0; i < len; i++) decoder_code_vector[i] = code_vector_buf[i]; return len; } /*- End of function --------------------------------------------------------*/ static int perform_linear_test(int full, int disk, const char *name) { gsm0610_state_t *gsm0610_enc_state; gsm0610_state_t *gsm0610_dec_state; int i; int xxx; int mismatches; printf("Performing linear test '%s' from disk %d\n", name, disk); get_test_vector(full, disk, name); if (full) { if ((gsm0610_enc_state = gsm0610_init(NULL, GSM0610_PACKING_NONE)) == NULL) { fprintf(stderr, " Cannot create encoder\n"); exit(2); } xxx = gsm0610_encode(gsm0610_enc_state, code_vector, in_vector, vector_len); printf("Check code vector of length %d\n", xxx); for (i = 0, mismatches = 0; i < xxx; i++) { if (code_vector[i] != ref_code_vector[i]) { printf("%8d/%3d: %6d %6d\n", i/76, i%76, code_vector[i], ref_code_vector[i]); mismatches++; } } gsm0610_release(gsm0610_enc_state); if (mismatches) { printf("Test failed: %d of %d samples mismatch\n", mismatches, xxx); exit(2); } printf("Test passed\n"); } if ((gsm0610_dec_state = gsm0610_init(NULL, GSM0610_PACKING_NONE)) == NULL) { fprintf(stderr, " Cannot create decoder\n"); exit(2); } xxx = gsm0610_decode(gsm0610_dec_state, out_vector, decoder_code_vector, vector_len); printf("Check output vector of length %d\n", vector_len); for (i = 0, mismatches = 0; i < vector_len; i++) { if (out_vector[i] != ref_out_vector[i]) { printf("%8d: %6d %6d\n", i, out_vector[i], ref_out_vector[i]); mismatches++; } } if (mismatches) { printf("Test failed: %d of %d samples mismatch\n", mismatches, vector_len); exit(2); } gsm0610_release(gsm0610_dec_state); printf("Test passed\n"); return 0; } /*- End of function --------------------------------------------------------*/ static int perform_law_test(int full, int law, const char *name) { gsm0610_state_t *gsm0610_enc_state; gsm0610_state_t *gsm0610_dec_state; int i; int xxx; int mismatches; if (law == 'a') printf("Performing A-law test '%s'\n", name); else printf("Performing u-law test '%s'\n", name); get_law_test_vector(full, law, name); if (full) { if ((gsm0610_enc_state = gsm0610_init(NULL, GSM0610_PACKING_NONE)) == NULL) { fprintf(stderr, " Cannot create encoder\n"); exit(2); } if (law == 'a') { for (i = 0; i < vector_len; i++) in_vector[i] = alaw_to_linear(law_in_vector[i]); } else { for (i = 0; i < vector_len; i++) in_vector[i] = ulaw_to_linear(law_in_vector[i]); } xxx = gsm0610_encode(gsm0610_enc_state, code_vector, in_vector, vector_len); printf("Check code vector of length %d\n", xxx); for (i = 0, mismatches = 0; i < xxx; i++) { if (code_vector[i] != ref_code_vector[i]) { printf("%8d/%3d: %6d %6d %6d\n", i/76, i%76, code_vector[i], ref_code_vector[i], decoder_code_vector[i]); mismatches++; } } if (mismatches) { printf("Test failed: %d of %d samples mismatch\n", mismatches, xxx); exit(2); } printf("Test passed\n"); gsm0610_release(gsm0610_enc_state); } if ((gsm0610_dec_state = gsm0610_init(NULL, GSM0610_PACKING_NONE)) == NULL) { fprintf(stderr, " Cannot create decoder\n"); exit(2); } xxx = gsm0610_decode(gsm0610_dec_state, out_vector, decoder_code_vector, vector_len); if (law == 'a') { for (i = 0; i < vector_len; i++) law_out_vector[i] = linear_to_alaw(out_vector[i]); } else { for (i = 0; i < vector_len; i++) law_out_vector[i] = linear_to_ulaw(out_vector[i]); } printf("Check output vector of length %d\n", vector_len); for (i = 0, mismatches = 0; i < vector_len; i++) { if (law_out_vector[i] != ref_law_out_vector[i]) { printf("%8d: %6d %6d\n", i, law_out_vector[i], ref_law_out_vector[i]); mismatches++; } } if (mismatches) { printf("Test failed: %d of %d samples mismatch\n", mismatches, vector_len); exit(2); } gsm0610_release(gsm0610_dec_state); printf("Test passed\n"); return 0; } /*- End of function --------------------------------------------------------*/ static int repack_gsm0610_voip_to_wav49(uint8_t c[], const uint8_t d[]) { gsm0610_frame_t frame[2]; int n; n = gsm0610_unpack_voip(&frame[0], d); gsm0610_unpack_voip(&frame[1], d + n); n = gsm0610_pack_wav49(c, frame); return n; } /*- End of function --------------------------------------------------------*/ static int repack_gsm0610_wav49_to_voip(uint8_t d[], const uint8_t c[]) { gsm0610_frame_t frame[2]; int n[2]; gsm0610_unpack_wav49(frame, c); n[0] = gsm0610_pack_voip(d, &frame[0]); n[1] = gsm0610_pack_voip(d + n[0], &frame[1]); return n[0] + n[1]; } /*- End of function --------------------------------------------------------*/ static int perform_pack_unpack_test(void) { uint8_t a[66]; uint8_t b[66]; uint8_t c[66]; int i; int j; printf("Performing packing/unpacking tests (not part of the ETSI conformance tests).\n"); /* Try trans-packing a lot of random data looking for before/after mismatch. */ for (j = 0; j < 1000; j++) { for (i = 0; i < 65; i++) a[i] = rand(); repack_gsm0610_wav49_to_voip(b, a); repack_gsm0610_voip_to_wav49(c, b); if (memcmp(a, c, 65)) { printf("Test failed: data mismatch\n"); exit(2); } for (i = 0; i < 66; i++) a[i] = rand(); /* Insert the magic code */ a[0] = (a[0] & 0xF) | 0xD0; a[33] = (a[33] & 0xF) | 0xD0; repack_gsm0610_voip_to_wav49(b, a); repack_gsm0610_wav49_to_voip(c, b); //for (i = 0; i < 66; i++) // printf("%2d: 0x%02X 0x%02X\n", i, a[i], c[i]); if (memcmp(a, c, 66)) { printf("Test failed: data mismatch\n"); exit(2); } } printf("Test passed\n"); return 0; } /*- End of function --------------------------------------------------------*/ int main(int argc, char *argv[]) { AFfilehandle inhandle; AFfilehandle outhandle; AFfilesetup filesetup; int frames; int outframes; float x; int16_t pre_amp[HIST_LEN]; int16_t post_amp[HIST_LEN]; uint8_t gsm0610_data[HIST_LEN]; gsm0610_state_t *gsm0610_enc_state; gsm0610_state_t *gsm0610_dec_state; int etsitests; int packing; int i; etsitests = TRUE; packing = GSM0610_PACKING_NONE; for (i = 1; i < argc; i++) { if (strcmp(argv[i], "-l") == 0) { etsitests = FALSE; continue; } if (strcmp(argv[i], "-p") == 0) { packing = atoi(argv[++i]); continue; } fprintf(stderr, "Unknown parameter %s specified.\n", argv[i]); exit(2); } if (etsitests) { perform_linear_test(TRUE, 1, "Seq01"); perform_linear_test(TRUE, 1, "Seq02"); perform_linear_test(TRUE, 1, "Seq03"); perform_linear_test(TRUE, 1, "Seq04"); perform_linear_test(FALSE, 1, "Seq05"); perform_law_test(TRUE, 'a', "Seq01"); perform_law_test(TRUE, 'a', "Seq02"); perform_law_test(TRUE, 'a', "Seq03"); perform_law_test(TRUE, 'a', "Seq04"); perform_law_test(FALSE, 'a', "Seq05"); perform_law_test(TRUE, 'u', "Seq01"); perform_law_test(TRUE, 'u', "Seq02"); perform_law_test(TRUE, 'u', "Seq03"); perform_law_test(TRUE, 'u', "Seq04"); perform_law_test(FALSE, 'u', "Seq05"); /* This is not actually an ETSI test */ perform_pack_unpack_test(); printf("Tests passed.\n"); } else { if ((inhandle = afOpenFile(IN_FILE_NAME, "r", 0)) == AF_NULL_FILEHANDLE) { fprintf(stderr, " Cannot open wave file '%s'\n", IN_FILE_NAME); exit(2); } if ((x = afGetFrameSize(inhandle, AF_DEFAULT_TRACK, 1)) != 2.0) { fprintf(stderr, " Unexpected frame size in wave file '%s'\n", IN_FILE_NAME); exit(2); } if ((x = afGetRate(inhandle, AF_DEFAULT_TRACK)) != (float) SAMPLE_RATE) { fprintf(stderr, " Unexpected sample rate in wave file '%s'\n", IN_FILE_NAME); exit(2); } if ((x = afGetChannels(inhandle, AF_DEFAULT_TRACK)) != 1.0) { fprintf(stderr, " Unexpected number of channels in wave file '%s'\n", IN_FILE_NAME); exit(2); } if ((filesetup = afNewFileSetup()) == AF_NULL_FILESETUP) { fprintf(stderr, " Failed to create file setup\n"); exit(2); } afInitSampleFormat(filesetup, AF_DEFAULT_TRACK, AF_SAMPFMT_TWOSCOMP, 16); afInitRate(filesetup, AF_DEFAULT_TRACK, (float) SAMPLE_RATE); afInitFileFormat(filesetup, AF_FILE_WAVE); afInitChannels(filesetup, AF_DEFAULT_TRACK, 1); if ((outhandle = afOpenFile(OUT_FILE_NAME, "w", filesetup)) == AF_NULL_FILEHANDLE) { fprintf(stderr, " Cannot create wave file '%s'\n", OUT_FILE_NAME); exit(2); } if ((gsm0610_enc_state = gsm0610_init(NULL, packing)) == NULL) { fprintf(stderr, " Cannot create encoder\n"); exit(2); } if ((gsm0610_dec_state = gsm0610_init(NULL, packing)) == NULL) { fprintf(stderr, " Cannot create decoder\n"); exit(2); } while ((frames = afReadFrames(inhandle, AF_DEFAULT_TRACK, pre_amp, 2*BLOCK_LEN))) { gsm0610_encode(gsm0610_enc_state, gsm0610_data, pre_amp, (packing == GSM0610_PACKING_WAV49) ? BLOCK_LEN : 2*BLOCK_LEN); gsm0610_decode(gsm0610_dec_state, post_amp, gsm0610_data, (packing == GSM0610_PACKING_WAV49) ? 33 : 65); outframes = afWriteFrames(outhandle, AF_DEFAULT_TRACK, post_amp, frames); } if (afCloseFile(inhandle) != 0) { fprintf(stderr, " Cannot close wave file '%s'\n", IN_FILE_NAME); exit(2); } if (afCloseFile(outhandle) != 0) { fprintf(stderr, " Cannot close wave file '%s'\n", OUT_FILE_NAME); exit(2); } afFreeFileSetup(filesetup); gsm0610_release(gsm0610_enc_state); gsm0610_release(gsm0610_dec_state); } return 0; } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/tests/r2_mf_tx_tests.c0000644000175000017500000001030711150047203021333 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * r2_mf_tx_tests.c - Test the Bell MF generator. * * Written by Steve Underwood * * Copyright (C) 2003 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2, as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: r2_mf_tx_tests.c,v 1.11 2008/05/13 13:17:26 steveu Exp $ */ /*! \file */ /*! \page r2_mf_tx_tests_page R2 MF generation tests \section r2_mf_tx_tests_page_sec_1 What does it do? ???. \section r2_mf_tx_tests_page_sec_2 How does it work? ???. */ #if defined(HAVE_CONFIG_H) #include "config.h" #endif #include #include #include #include #include #include #include "spandsp.h" #define OUTPUT_FILE_NAME "r2_mf.wav" int main(int argc, char *argv[]) { r2_mf_tx_state_t gen; int16_t amp[1000]; int len; AFfilehandle outhandle; AFfilesetup filesetup; int outframes; int digit; const char *digits = "0123456789BCDEF"; filesetup = afNewFileSetup(); if (filesetup == AF_NULL_FILESETUP) { fprintf(stderr, " Failed to create file setup\n"); exit(2); } afInitSampleFormat(filesetup, AF_DEFAULT_TRACK, AF_SAMPFMT_TWOSCOMP, 16); afInitRate(filesetup, AF_DEFAULT_TRACK, 8000.0); //afInitCompression(filesetup, AF_DEFAULT_TRACK, AF_COMPRESSION_G711_ALAW); afInitFileFormat(filesetup, AF_FILE_WAVE); afInitChannels(filesetup, AF_DEFAULT_TRACK, 1); outhandle = afOpenFile(OUTPUT_FILE_NAME, "w", filesetup); if (outhandle == AF_NULL_FILEHANDLE) { fprintf(stderr, " Cannot open wave file '%s'\n", OUTPUT_FILE_NAME); exit(2); } r2_mf_tx_init(&gen, FALSE); for (digit = 0; digits[digit]; digit++) { r2_mf_tx_put(&gen, digits[digit]); len = r2_mf_tx(&gen, amp, 1000); printf("Generated %d samples of %c\n", len, digits[digit]); if (len > 0) { outframes = afWriteFrames(outhandle, AF_DEFAULT_TRACK, amp, len); } r2_mf_tx_put(&gen, 0); len = r2_mf_tx(&gen, amp, 1000); printf("Generated %d samples\n", len); if (len > 0) { outframes = afWriteFrames(outhandle, AF_DEFAULT_TRACK, amp, len); } } r2_mf_tx_init(&gen, TRUE); for (digit = 0; digits[digit]; digit++) { r2_mf_tx_put(&gen, digits[digit]); len = r2_mf_tx(&gen, amp, 1000); printf("Generated %d samples of %c\n", len, digits[digit]); if (len > 0) { outframes = afWriteFrames(outhandle, AF_DEFAULT_TRACK, amp, len); } r2_mf_tx_put(&gen, 0); len = r2_mf_tx(&gen, amp, 1000); printf("Generated %d samples\n", len); if (len > 0) { outframes = afWriteFrames(outhandle, AF_DEFAULT_TRACK, amp, len); } } if (afCloseFile(outhandle) != 0) { fprintf(stderr, " Cannot close wave file '%s'\n", OUTPUT_FILE_NAME); exit (2); } afFreeFileSetup(filesetup); return 0; } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/tests/queue_tests.c0000644000175000017500000004706711150047203020754 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * queue_tests.c * * Written by Steve Underwood * * Copyright (C) 2007 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2, as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: queue_tests.c,v 1.10 2008/05/13 13:17:26 steveu Exp $ */ /* THIS IS A WORK IN PROGRESS. IT IS NOT FINISHED. */ /*! \page queue_tests_page Queue tests \section queue_tests_page_sec_1 What does it do? */ #if defined(HAVE_CONFIG_H) #include #endif #include #include #include #include #include #include #include #include "spandsp.h" #define BUF_LEN 10000 #define MSG_LEN 17 pthread_t thread[2]; queue_state_t *queue; volatile int put_oks; volatile int put_misses; volatile int got_oks; volatile int got_misses; int total_in; int total_out; static void tests_failed(void) { printf("Tests failed\n"); tests_failed(); } /*- End of function --------------------------------------------------------*/ static void display_queue_pointers(void) { printf("Pointers %d %d %d\n", queue->iptr, queue->optr, queue->len); } /*- End of function --------------------------------------------------------*/ static void *run_stream_write(void *arg) { uint8_t buf[MSG_LEN]; int i; int next; printf("Write thread\n"); next = 0; for (i = 0; i < MSG_LEN; i++) buf[i] = next; next = (next + 1) & 0xFF; put_oks = 0; put_misses = 0; for (;;) { if (queue_write(queue, buf, MSG_LEN) == MSG_LEN) { for (i = 0; i < MSG_LEN; i++) buf[i] = next; next = (next + 1) & 0xFF; put_oks++; if (put_oks%1000000 == 0) printf("%d puts, %d misses\n", put_oks, put_misses); } else { sched_yield(); put_misses++; } } return NULL; } /*- End of function --------------------------------------------------------*/ static void *run_stream_read(void *arg) { uint8_t buf[MSG_LEN]; int i; int len; int next; printf("Read thread\n"); next = 0; got_oks = 0; got_misses = 0; for (;;) { if ((len = queue_read(queue, buf, MSG_LEN)) >= 0) { if (len != MSG_LEN) { printf("AHH! - len %d\n", len); tests_failed(); } for (i = 0; i < len; i++) { if (buf[i] != next) { printf("AHH! - 0x%X 0x%X\n", buf[i], next); tests_failed(); } } next = (next + 1) & 0xFF; got_oks++; if (got_oks%1000000 == 0) printf("%d gots, %d misses\n", got_oks, got_misses); } else { sched_yield(); got_misses++; } } return NULL; } /*- End of function --------------------------------------------------------*/ static void threaded_stream_tests(void) { pthread_attr_t attr; if ((queue = queue_init(NULL, BUF_LEN, QUEUE_READ_ATOMIC | QUEUE_WRITE_ATOMIC)) == NULL) { printf("Failed to create the queue\n"); tests_failed(); } pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); if (pthread_create(&thread[0], &attr, run_stream_write, NULL)) { printf("Failed to create thread\n"); tests_failed(); } if (pthread_create(&thread[1], &attr, run_stream_read, NULL)) { printf("Failed to create thread\n"); tests_failed(); } for (;;) { sleep(5); printf("Main thread - %d %d\n", put_oks, got_oks); } queue_free(queue); } /*- End of function --------------------------------------------------------*/ static void *run_message_write(void *arg) { uint8_t buf[MSG_LEN]; int i; int next; printf("Write thread\n"); next = 0; for (i = 0; i < MSG_LEN; i++) buf[i] = next; next = (next + 1) & 0xFF; put_oks = 0; put_misses = 0; for (;;) { if (queue_write_msg(queue, buf, MSG_LEN) == MSG_LEN) { for (i = 0; i < MSG_LEN; i++) buf[i] = next; next = (next + 1) & 0xFF; put_oks++; if (put_oks%1000000 == 0) printf("%d puts, %d misses\n", put_oks, put_misses); } else { sched_yield(); put_misses++; } } return NULL; } /*- End of function --------------------------------------------------------*/ static void *run_message_read(void *arg) { uint8_t buf[1024]; int i; int len; int next; printf("Read thread\n"); next = 0; got_oks = 0; got_misses = 0; for (;;) { if ((len = queue_read_msg(queue, buf, 1024)) >= 0) { if (len != MSG_LEN) { printf("AHH! - len %d\n", len); tests_failed(); } for (i = 0; i < len; i++) { if (buf[i] != next) { printf("AHH! - 0x%X 0x%X\n", buf[i], next); tests_failed(); } } next = (next + 1) & 0xFF; got_oks++; if (got_oks%1000000 == 0) printf("%d gots, %d misses\n", got_oks, got_misses); } else { sched_yield(); got_misses++; } } return NULL; } /*- End of function --------------------------------------------------------*/ static void threaded_message_tests(void) { pthread_attr_t attr; if ((queue = queue_init(NULL, BUF_LEN, QUEUE_READ_ATOMIC | QUEUE_WRITE_ATOMIC)) == NULL) { printf("Failed to create the queue\n"); tests_failed(); } pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); if (pthread_create(&thread[0], &attr, run_message_write, NULL)) { printf("Failed to create thread\n"); tests_failed(); } if (pthread_create(&thread[1], &attr, run_message_read, NULL)) { printf("Failed to create thread\n"); tests_failed(); } for (;;) { sleep(5); printf("Main thread - %d %d\n", put_oks, got_oks); } queue_free(queue); } /*- End of function --------------------------------------------------------*/ static void check_contents(int total_in, int total_out) { if (queue_contents(queue) != (total_in - total_out)) { printf("Contents = %d (%d)\n", queue_contents(queue), (total_in - total_out)); display_queue_pointers(); tests_failed(); } if (queue_free_space(queue) != BUF_LEN - (total_in - total_out)) { printf("Free space = %d (%d)\n", queue_free_space(queue), BUF_LEN - (total_in - total_out)); display_queue_pointers(); tests_failed(); } } /*- End of function --------------------------------------------------------*/ static int monitored_queue_write(const uint8_t buf[], int len) { int lenx; lenx = queue_write(queue, buf, len); if (lenx >= 0) total_in += lenx; check_contents(total_in, total_out); return lenx; } /*- End of function --------------------------------------------------------*/ static int monitored_queue_write_byte(const uint8_t buf) { int res; if ((res = queue_write_byte(queue, buf)) >= 0) total_in++; check_contents(total_in, total_out); return res; } /*- End of function --------------------------------------------------------*/ static int monitored_queue_read(uint8_t buf[], int len) { int lenx; lenx = queue_read(queue, buf, len); if (lenx >= 0) total_out += lenx; check_contents(total_in, total_out); return lenx; } /*- End of function --------------------------------------------------------*/ static int monitored_queue_read_byte(void) { int res; if ((res = queue_read_byte(queue)) >= 0) total_out++; check_contents(total_in, total_out); return res; } /*- End of function --------------------------------------------------------*/ static void functional_stream_tests(void) { uint8_t buf[MSG_LEN]; int i; int res; total_in = 0; total_out = 0; for (i = 0; i < MSG_LEN; i++) buf[i] = i; if ((queue = queue_init(NULL, BUF_LEN, QUEUE_READ_ATOMIC | QUEUE_WRITE_ATOMIC)) == NULL) { printf("Failed to create the queue\n"); tests_failed(); } check_contents(total_in, total_out); /* Half fill the buffer, and check we can get out what we put in. */ for (i = 1; i < 5000; i++) { if (monitored_queue_write_byte(i & 0xFF) != 1) { printf("Byte by byte full at %d/%d\n", i, BUF_LEN); tests_failed(); } } for (i = 1; i < 5001; i++) { if ((res = monitored_queue_read_byte()) != (i & 0xFF)) break; } printf("Byte by byte read breaks at %d (expected %d) - %d\n", i, 5000, res); if (i != 5000) tests_failed(); /* Now completely fill the buffer, and we should roll around the end. Check we can get out what we put in. */ for (i = 1; i < 20000; i++) { if (monitored_queue_write_byte(i & 0xFF) != 1) break; } printf("Byte by byte full at %d (expected %d)\n", i, 10001); if (i != 10001) tests_failed(); for (i = 1; i < 20000; i++) { if ((res = monitored_queue_read_byte()) != (i & 0xFF)) break; } printf("Byte by byte read breaks at %d (expected %d) - %d\n", i, 10001, res); if (i != 10001) tests_failed(); /* Fill the buffer, checking the contents grow correctly */ for (i = 1; i < 1000; i++) { if (monitored_queue_write(buf, MSG_LEN) != MSG_LEN) break; } printf("Full at chunk %d (expected %d)\n", i, BUF_LEN/MSG_LEN + 1); if (i != BUF_LEN/MSG_LEN + 1) tests_failed(); if (monitored_queue_write(buf, 5) == 5) { printf("Write of 5 succeeded\n"); tests_failed(); } if (monitored_queue_write(buf, 4) != 4) { printf("Write of 4 failed\n"); tests_failed(); } /* Now full. Empty a little, and refill around the end */ if (monitored_queue_read(buf, MSG_LEN) != MSG_LEN) { printf("Read failed\n"); tests_failed(); } if (monitored_queue_write(buf, MSG_LEN) != MSG_LEN) { printf("Write failed\n"); tests_failed(); } /* Empty completely, checking the contents shrink correctly */ for (;;) { if (monitored_queue_read(buf, MSG_LEN) != MSG_LEN) break; } if (monitored_queue_read(buf, 4) != 4) { printf("Read failed\n"); tests_failed(); } /* Nudge around the buffer */ for (i = 1; i < 588; i++) { if (monitored_queue_write(buf, MSG_LEN) != MSG_LEN) { printf("Write failed\n"); tests_failed(); } if (monitored_queue_read(buf, MSG_LEN) != MSG_LEN) { printf("Read failed\n"); tests_failed(); } } /* Fill the buffer, checking the contents grow correctly */ for (i = 1; i < 1000; i++) { if (monitored_queue_write(buf, MSG_LEN) != MSG_LEN) break; } printf("Full at chunk %d (expected %d)\n", i, BUF_LEN/MSG_LEN + 1); if (i != BUF_LEN/MSG_LEN + 1) tests_failed(); display_queue_pointers(); if (monitored_queue_read(buf, MSG_LEN) != MSG_LEN) { printf("Read failed\n"); tests_failed(); } if (monitored_queue_write(buf, MSG_LEN) != MSG_LEN) { printf("Write failed\n"); tests_failed(); } display_queue_pointers(); for (i = 1; i < 5000; i++) { if (monitored_queue_read(buf, MSG_LEN) != MSG_LEN) { printf("Read failed\n"); tests_failed(); } if (monitored_queue_write(buf, MSG_LEN) != MSG_LEN) { printf("Write failed\n"); tests_failed(); } } display_queue_pointers(); if (monitored_queue_write(buf, 5) == 5) { printf("Write of 5 succeeded\n"); tests_failed(); } if (monitored_queue_write(buf, 4) != 4) { printf("Write of 4 failed\n"); tests_failed(); } display_queue_pointers(); for (i = 1; i < 5000; i++) { if (monitored_queue_read(buf, MSG_LEN) != MSG_LEN) { printf("Read failed\n"); tests_failed(); } if (monitored_queue_write(buf, MSG_LEN) != MSG_LEN) { printf("Write failed\n"); tests_failed(); } } display_queue_pointers(); queue_free(queue); } /*- End of function --------------------------------------------------------*/ static int monitored_queue_write_msg(const uint8_t buf[], int len) { int lenx; lenx = queue_write_msg(queue, buf, len); if (lenx >= 0) total_in += lenx + sizeof(uint16_t); check_contents(total_in, total_out); return lenx; } /*- End of function --------------------------------------------------------*/ static int monitored_queue_read_msg(uint8_t buf[], int len) { int lenx; lenx = queue_read_msg(queue, buf, len); if (lenx >= 0) total_out += lenx + sizeof(uint16_t); check_contents(total_in, total_out); return lenx; } /*- End of function --------------------------------------------------------*/ static void functional_message_tests(void) { uint8_t buf[MSG_LEN]; int i; int len; total_in = 0; total_out = 0; for (i = 0; i < MSG_LEN; i++) buf[i] = i; if ((queue = queue_init(NULL, BUF_LEN, QUEUE_READ_ATOMIC | QUEUE_WRITE_ATOMIC)) == NULL) { printf("Failed to create the queue\n"); tests_failed(); } check_contents(total_in, total_out); /* Fill the buffer, checking the contents grow correctly */ for (i = 1; i < 1000; i++) { if (monitored_queue_write_msg(buf, MSG_LEN) != MSG_LEN) break; } printf("Full at chunk %d (expected %d)\n", i, BUF_LEN/(MSG_LEN + sizeof(uint16_t)) + 1); if (i != BUF_LEN/(MSG_LEN + sizeof(uint16_t)) + 1) tests_failed(); if ((len = monitored_queue_write_msg(buf, 5)) == 5) { printf("Write of 5 succeeded\n"); tests_failed(); } if ((len = monitored_queue_write_msg(buf, 4)) != 4) { printf("Write of 4 failed\n"); tests_failed(); } /* Now full. Empty a little, and refill around the end */ if ((len = monitored_queue_read_msg(buf, MSG_LEN)) != MSG_LEN) { printf("Read failed - %d\n", len); tests_failed(); } if ((len = monitored_queue_write_msg(buf, MSG_LEN)) != MSG_LEN) { printf("Write failed - %d\n", len); tests_failed(); } /* Empty completely, checking the contents shrink correctly */ for (;;) { if ((len = monitored_queue_read_msg(buf, MSG_LEN)) != MSG_LEN) break; } if (len != 4) { printf("Read failed - %d\n", len); tests_failed(); } /* We should now have one MSG_LEN message in the buffer */ /* Nudge around the buffer */ for (i = 1; i < 527; i++) { if ((len = monitored_queue_write_msg(buf, MSG_LEN)) != MSG_LEN) { printf("Write failed - %d\n", len); tests_failed(); } if ((len = monitored_queue_read_msg(buf, MSG_LEN)) != MSG_LEN) { printf("Read failed - %d\n", len); tests_failed(); } } /* Fill the buffer, checking the contents grow correctly */ for (i = 1; i < 1000; i++) { if ((len = monitored_queue_write_msg(buf, MSG_LEN)) != MSG_LEN) break; } printf("Free space = %d (%d)\n", queue_free_space(queue), BUF_LEN - (total_in - total_out)); display_queue_pointers(); printf("Full at chunk %d (expected %d)\n", i, BUF_LEN/(MSG_LEN + sizeof(uint16_t))); if (i != BUF_LEN/(MSG_LEN + sizeof(uint16_t))) tests_failed(); display_queue_pointers(); if ((len = monitored_queue_read_msg(buf, MSG_LEN)) != MSG_LEN) { printf("Read failed - %d\n", len); tests_failed(); } if ((len = monitored_queue_write_msg(buf, MSG_LEN)) != MSG_LEN) { printf("Write failed - %d\n", len); tests_failed(); } display_queue_pointers(); for (i = 1; i < 5000; i++) { if ((len = monitored_queue_read_msg(buf, MSG_LEN)) != MSG_LEN) { printf("Read failed - %d\n", len); tests_failed(); } if ((len = monitored_queue_write_msg(buf, MSG_LEN)) != MSG_LEN) { printf("Write failed - %d\n", len); tests_failed(); } } display_queue_pointers(); if ((len = monitored_queue_write_msg(buf, 5)) == 5) { printf("Write of 5 succeeded\n"); tests_failed(); } if ((len = monitored_queue_write_msg(buf, 4)) != 4) { printf("Write of 4 failed\n"); tests_failed(); } display_queue_pointers(); for (i = 1; i < 5000; i++) { if (i == 527) { if ((len = monitored_queue_read_msg(buf, MSG_LEN)) != 4) { printf("Read failed - %d\n", len); tests_failed(); } } if ((len = monitored_queue_read_msg(buf, MSG_LEN)) != MSG_LEN) { printf("Read failed - %d\n", len); tests_failed(); } if ((len = monitored_queue_write_msg(buf, MSG_LEN)) != MSG_LEN) { printf("Write failed - %d\n", len); tests_failed(); } } display_queue_pointers(); queue_free(queue); } /*- End of function --------------------------------------------------------*/ int main(int argc, char *argv[]) { int threaded_messages; int threaded_streams; int opt; threaded_messages = FALSE; threaded_streams = FALSE; while ((opt = getopt(argc, argv, "ms")) != -1) { switch (opt) { case 'm': threaded_messages = TRUE; break; case 's': threaded_streams = TRUE; break; } } /* Test the basic functionality of the queueing code in stream and message modes */ printf("Stream mode functional tests\n"); functional_stream_tests(); printf("Message mode functional tests\n"); functional_message_tests(); /* Run separate write and read threads for a while, to verify there are no locking issues. */ if (threaded_streams) { printf("Stream mode threaded tests\n"); threaded_stream_tests(); } if (threaded_messages) { printf("Message mode threaded tests\n"); threaded_message_tests(); } return 0; } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/tests/tone_detect_tests.c0000644000175000017500000001052411150047203022111 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * tone_detect_tests.c * * Written by Steve Underwood * * Copyright (C) 2007 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2, as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: tone_detect_tests.c,v 1.10 2008/05/13 13:17:26 steveu Exp $ */ /*! \page tone_detect_tests_page Tone detection tests \section tone_detect_tests_page_sec_1 What does it do? */ #if defined(HAVE_CONFIG_H) #include "config.h" #endif #include #include #include #include #include #include #include "spandsp.h" #define DEC_SAMPLE_RATE 800 #define DEC_RATIO 10 #define BLOCK_LEN 56 #define PG_WINDOW 56 #define FREQ1 440.0f #define FREQ2 480.0f static int periodogram_tests(void) { int i; int j; int k; int len; complexf_t coeffs[PG_WINDOW/2]; complexf_t camp[BLOCK_LEN]; complexf_t last_result; complexf_t result; complexf_t phase_offset; float freq_error; float pg_scale; float level; float scale1; float scale2; int32_t phase_rate1; int32_t phase_rate2; uint32_t phase_acc1; uint32_t phase_acc2; awgn_state_t noise_source_re; awgn_state_t noise_source_im; phase_rate1 = DEC_RATIO*dds_phase_ratef(FREQ1 - 5.0f); phase_rate2 = DEC_RATIO*dds_phase_ratef(FREQ2); phase_acc1 = 0; phase_acc2 = 0; len = periodogram_generate_coeffs(coeffs, FREQ1, DEC_SAMPLE_RATE, PG_WINDOW); if (len != PG_WINDOW/2) { printf("Test failed\n"); return -1; } pg_scale = periodogram_generate_phase_offset(&phase_offset, FREQ1, DEC_SAMPLE_RATE, PG_WINDOW); scale1 = dds_scaling_dbm0f(-6.0f); scale2 = dds_scaling_dbm0f(-6.0f); for (k = -50; k < 0; k++) { printf("Setting noise to %ddBm0\n", k); awgn_init_dbm0(&noise_source_re, 1234567, (float) k); awgn_init_dbm0(&noise_source_im, 7654321, (float) k); last_result = complex_setf(0.0f, 0.0f); for (i = 0; i < 100; i++) { for (j = 0; j < PG_WINDOW; j++) { result = dds_complexf(&phase_acc1, phase_rate1); camp[j].re = result.re*scale1; camp[j].im = result.im*scale1; result = dds_complexf(&phase_acc2, phase_rate2); camp[j].re += result.re*scale2; camp[j].im += result.im*scale2; camp[j].re += awgn(&noise_source_re); camp[j].im += awgn(&noise_source_im); } result = periodogram(coeffs, camp, PG_WINDOW); level = sqrtf(result.re*result.re + result.im*result.im); freq_error = periodogram_freq_error(&phase_offset, pg_scale, &last_result, &result); last_result = result; if (i == 0) continue; printf("Signal level = %.5f, freq error = %.5f\n", level, freq_error); if (level < scale1*0.8f || level > scale1*1.2f) { printf("Test failed - %ddBm0 of noise, signal is %f (%f)\n", k, level, scale1); return -1; } if (freq_error < -10.0f || freq_error > 10.0f) { printf("Test failed - %ddBm0 of noise, %fHz error\n", k, freq_error); return -1; } } } return 0; } /*- End of function --------------------------------------------------------*/ int main(int argc, char *argv[]) { if (periodogram_tests()) exit(2); printf("Tests passed\n"); return 0; } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/tests/super_tone_rx_tests.c0000644000175000017500000003620711150047203022516 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * super_tone_detect_tests.c * * Written by Steve Underwood * * Copyright (C) 2003 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2, as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: super_tone_rx_tests.c,v 1.28 2008/05/13 13:17:26 steveu Exp $ */ /*! \file */ /*! \page super_tone_rx_tests_page Supervisory tone detection tests \section super_tone_rx_tests_page_sec_1 What does it do? */ #if defined(HAVE_CONFIG_H) #include "config.h" #endif #include #include #include #include #include #include #include #include #include #if defined(HAVE_LIBXML_XMLMEMORY_H) #include #endif #if defined(HAVE_LIBXML_PARSER_H) #include #endif #if defined(HAVE_LIBXML_XINCLUDE_H) #include #endif #include "spandsp.h" #define IN_FILE_NAME "super_tone.wav" #define MITEL_DIR "../test-data/mitel/" #define BELLCORE_DIR "../test-data/bellcore/" const char *bellcore_files[] = { MITEL_DIR "mitel-cm7291-talkoff.wav", BELLCORE_DIR "tr-tsy-00763-1.wav", BELLCORE_DIR "tr-tsy-00763-2.wav", BELLCORE_DIR "tr-tsy-00763-3.wav", BELLCORE_DIR "tr-tsy-00763-4.wav", BELLCORE_DIR "tr-tsy-00763-5.wav", BELLCORE_DIR "tr-tsy-00763-6.wav", "" }; const char *tone_names[20] = {NULL}; AFfilehandle inhandle; super_tone_rx_segment_t tone_segments[20][10]; super_tone_tx_step_t *dialtone_tree = NULL; super_tone_tx_step_t *ringback_tree = NULL; super_tone_tx_step_t *busytone_tree = NULL; super_tone_tx_step_t *nutone_tree = NULL; super_tone_tx_step_t *congestiontone_tree = NULL; super_tone_tx_step_t *waitingtone_tree = NULL; #if defined(HAVE_LIBXML2) static int parse_tone(super_tone_rx_descriptor_t *desc, int tone_id, super_tone_tx_step_t **tree, xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur) { xmlChar *x; float f1; float f2; float f_tol; float l1; float l2; float length; float length_tol; float recognition_length; float recognition_length_tol; int cycles; super_tone_tx_step_t *treep; int min_duration; int max_duration; cur = cur->xmlChildrenNode; while (cur) { if (xmlStrcmp(cur->name, (const xmlChar *) "step") == 0) { printf("Step - "); /* Set some defaults */ f1 = 0.0; f2 = 0.0; f_tol = 1.0; l1 = -11.0; l2 = -11.0; length = 0.0; length_tol = 10.0; recognition_length = 0.0; recognition_length_tol = 10.0; cycles = 1; if ((x = xmlGetProp(cur, (const xmlChar *) "freq"))) { sscanf((char *) x, "%f [%f%%]", &f1, &f_tol); sscanf((char *) x, "%f+%f [%f%%]", &f1, &f2, &f_tol); printf(" Frequency=%.2f+%.2f [%.2f%%]", f1, f2, f_tol); } if ((x = xmlGetProp(cur, (const xmlChar *) "level"))) { if (sscanf((char *) x, "%f+%f", &l1, &l2) < 2) l2 = l1; printf(" Level=%.2f+%.2f", l1, l2); } if ((x = xmlGetProp(cur, (const xmlChar *) "length"))) { sscanf((char *) x, "%f [%f%%]", &length, &length_tol); printf(" Length=%.2f [%.2f%%]", length, length_tol); } if ((x = xmlGetProp(cur, (const xmlChar *) "recognition-length"))) { sscanf((char *) x, "%f [%f%%]", &recognition_length, &recognition_length_tol); printf(" Recognition length=%.2f [%.2f%%]", recognition_length, recognition_length_tol); } if ((x = xmlGetProp(cur, (const xmlChar *) "cycles"))) { if (strcasecmp((char *) x, "endless") == 0) cycles = 0; else cycles = atoi((char *) x); printf(" Cycles='%d' ", cycles); } if ((x = xmlGetProp(cur, (const xmlChar *) "recorded-announcement"))) printf(" Recorded announcement='%s'", x); printf("\n"); if (f1 || f2 || length) { /* TODO: This cannot handle cycling patterns */ if (length == 0.0) { if (recognition_length) min_duration = recognition_length*1000.0 + 0.5; else min_duration = 700; max_duration = 0; } else { if (recognition_length) min_duration = recognition_length*1000.0 + 0.5; else min_duration = (length*1000.0 + 0.5)*(1.0 - length_tol/100.0) - 30; max_duration = (length*1000.0 + 0.5)*(1.0 + length_tol/100.0) + 30; } printf(">>>Detector element %10d %10d %10d %10d\n", (int) (f1 + 0.5), (int) (f2 + 0.5), min_duration, max_duration); super_tone_rx_add_element(desc, tone_id, f1 + 0.5, f2 + 0.5, min_duration, max_duration); } treep = super_tone_tx_make_step(NULL, f1, l1, f2, l2, length*1000.0 + 0.5, cycles); *tree = treep; tree = &(treep->next); parse_tone(desc, tone_id, &(treep->nest), doc, ns, cur); } /*endif*/ cur = cur->next; } /*endwhile*/ return 0; } /*- End of function --------------------------------------------------------*/ static void parse_tone_set(super_tone_rx_descriptor_t *desc, xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur) { int tone_id; printf("Parsing tone set\n"); cur = cur->xmlChildrenNode; while (cur) { if (strcmp((char *) cur->name, "dial-tone") == 0) { printf("Hit %s\n", cur->name); tone_id = super_tone_rx_add_tone(desc); dialtone_tree = NULL; parse_tone(desc, tone_id, &dialtone_tree, doc, ns, cur); tone_names[tone_id] = "Dial tone"; } else if (strcmp((char *) cur->name, "ringback-tone") == 0) { printf("Hit %s\n", cur->name); tone_id = super_tone_rx_add_tone(desc); ringback_tree = NULL; parse_tone(desc, tone_id, &ringback_tree, doc, ns, cur); tone_names[tone_id] = "Ringback tone"; } else if (strcmp((char *) cur->name, "busy-tone") == 0) { printf("Hit %s\n", cur->name); tone_id = super_tone_rx_add_tone(desc); busytone_tree = NULL; parse_tone(desc, tone_id, &busytone_tree, doc, ns, cur); tone_names[tone_id] = "Busy tone"; } else if (strcmp((char *) cur->name, "number-unobtainable-tone") == 0) { printf("Hit %s\n", cur->name); tone_id = super_tone_rx_add_tone(desc); nutone_tree = NULL; parse_tone(desc, tone_id, &nutone_tree, doc, ns, cur); tone_names[tone_id] = "NU tone"; } else if (strcmp((char *) cur->name, "congestion-tone") == 0) { printf("Hit %s\n", cur->name); tone_id = super_tone_rx_add_tone(desc); congestiontone_tree = NULL; parse_tone(desc, tone_id, &congestiontone_tree, doc, ns, cur); tone_names[tone_id] = "Congestion tone"; } else if (strcmp((char *) cur->name, "waiting-tone") == 0) { printf("Hit %s\n", cur->name); tone_id = super_tone_rx_add_tone(desc); waitingtone_tree = NULL; parse_tone(desc, tone_id, &waitingtone_tree, doc, ns, cur); tone_names[tone_id] = "Waiting tone"; } /*endif*/ cur = cur->next; } /*endwhile*/ } /*- End of function --------------------------------------------------------*/ static void get_tone_set(super_tone_rx_descriptor_t *desc, const char *tone_file, const char *set_id) { xmlDocPtr doc; xmlNsPtr ns; xmlNodePtr cur; #if 0 xmlValidCtxt valid; #endif xmlChar *x; ns = NULL; xmlKeepBlanksDefault(0); xmlCleanupParser(); doc = xmlParseFile(tone_file); if (doc == NULL) { fprintf(stderr, "No document\n"); exit(2); } /*endif*/ xmlXIncludeProcess(doc); #if 0 if (!xmlValidateDocument(&valid, doc)) { fprintf(stderr, "Invalid document\n"); exit(2); } /*endif*/ #endif /* Check the document is of the right kind */ if ((cur = xmlDocGetRootElement(doc)) == NULL) { fprintf(stderr, "Empty document\n"); xmlFreeDoc(doc); exit(2); } /*endif*/ if (xmlStrcmp(cur->name, (const xmlChar *) "global-tones")) { fprintf(stderr, "Document of the wrong type, root node != global-tones"); xmlFreeDoc(doc); exit(2); } /*endif*/ cur = cur->xmlChildrenNode; while (cur && xmlIsBlankNode (cur)) cur = cur->next; /*endwhile*/ if (cur == NULL) exit(2); /*endif*/ while (cur) { if (xmlStrcmp(cur->name, (const xmlChar *) "tone-set") == 0) { if ((x = xmlGetProp(cur, (const xmlChar *) "uncode"))) { if (strcmp((char *) x, set_id) == 0) parse_tone_set(desc, doc, ns, cur); } /*endif*/ } /*endif*/ cur = cur->next; } /*endwhile*/ xmlFreeDoc(doc); } /*- End of function --------------------------------------------------------*/ #endif static void super_tone_rx_fill_descriptor(super_tone_rx_descriptor_t *desc) { int tone_id; tone_id = super_tone_rx_add_tone(desc); super_tone_rx_add_element(desc, tone_id, 400, 0, 700, 0); tone_names[tone_id] = "XXX"; tone_id = super_tone_rx_add_tone(desc); super_tone_rx_add_element(desc, tone_id, 1100, 0, 400, 600); super_tone_rx_add_element(desc, tone_id, 0, 0, 2800, 3200); tone_names[tone_id] = "FAX tone"; } /*- End of function --------------------------------------------------------*/ static void wakeup(void *data, int code, int level, int delay) { if (code >= 0) printf("Current tone is %d '%s' '%s'\n", code, (tone_names[code]) ? tone_names[code] : "???", (char *) data); else printf("Tone off '%s'\n", (char *) data); } /*- End of function --------------------------------------------------------*/ static void tone_segment(void *data, int f1, int f2, int duration) { if (f1 < 0) printf("Result %5d silence\n", duration); else if (f2 < 0) printf("Result %5d %4d\n", duration, f1); else printf("Result %5d %4d + %4d\n", duration, f1, f2); } /*- End of function --------------------------------------------------------*/ int main(int argc, char *argv[]) { int x; int16_t amp[8000]; int sample; int frames; awgn_state_t noise_source; super_tone_rx_state_t *super; super_tone_rx_descriptor_t desc; if ((inhandle = afOpenFile(IN_FILE_NAME, "r", 0)) == AF_NULL_FILEHANDLE) { fprintf(stderr, " Cannot open wave file '%s'\n", IN_FILE_NAME); exit(2); } if ((x = afGetFrameSize(inhandle, AF_DEFAULT_TRACK, 1)) != 2.0) { printf(" Unexpected frame size in wave file '%s'\n", IN_FILE_NAME); exit(2); } if ((x = afGetRate(inhandle, AF_DEFAULT_TRACK)) != (float) SAMPLE_RATE) { printf(" Unexpected sample rate in wave file '%s'\n", IN_FILE_NAME); exit(2); } if ((x = afGetChannels(inhandle, AF_DEFAULT_TRACK)) != 1.0) { printf(" Unexpected number of channels in wave file '%s'\n", IN_FILE_NAME); exit(2); } super_tone_rx_make_descriptor(&desc); #if defined(HAVE_LIBXML2) get_tone_set(&desc, "../spandsp/global-tones.xml", (argc > 1) ? argv[1] : "hk"); #endif super_tone_rx_fill_descriptor(&desc); if ((super = super_tone_rx_init(NULL, &desc, wakeup, (void *) "test")) == NULL) { printf(" Failed to create detector.\n"); exit(2); } super_tone_rx_segment_callback(super, tone_segment); awgn_init_dbm0(&noise_source, 1234567, -30.0f); printf("Processing file\n"); while ((frames = afReadFrames(inhandle, AF_DEFAULT_TRACK, amp, 8000))) { /* Add some noise to the signal for a more meaningful test. */ //for (sample = 0; sample < frames; sample++) // amp[sample] += saturate(amp[sample] + awgn (&noise_source)); for (sample = 0; sample < frames; ) { x = super_tone_rx(super, amp + sample, frames - sample); sample += x; } } if (afCloseFile(inhandle)) { fprintf(stderr, " Cannot close audio file '%s'\n", IN_FILE_NAME); exit(2); } #if 0 /* Test for voice immunity */ for (j = 0; bellcore_files[j][0]; j++) { if ((inhandle = afOpenFile(bellcore_files[j], "r", 0)) == AF_NULL_FILEHANDLE) { printf(" Cannot open wave file '%s'\n", bellcore_files[j]); exit(2); } if ((x = afGetFrameSize(inhandle, AF_DEFAULT_TRACK, 1)) != 2.0) { printf(" Unexpected frame size in wave file '%s'\n", bellcore_files[j]); exit(2); } if ((x = afGetRate(inhandle, AF_DEFAULT_TRACK)) != (float) SAMPLE_RATE) { printf(" Unexpected sample rate in wave file '%s'\n", bellcore_files[j]); exit(2); } if ((x = afGetChannels(inhandle, AF_DEFAULT_TRACK)) != 1.0) { printf(" Unexpected number of channels in wave file '%s'\n", bellcore_files[j]); exit(2); } while ((frames = afReadFrames(inhandle, AF_DEFAULT_TRACK, amp, 8000))) { for (sample = 0; sample < frames; ) { x = super_tone_rx(super, amp + sample, frames - sample); sample += x; } } if (afCloseFile(inhandle) != 0) { printf(" Cannot close speech file '%s'\n", bellcore_files[j]); exit(2); } } #endif super_tone_rx_free(super); printf("Done\n"); return 0; } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/tests/rfc2198_sim_tests.c0000644000175000017500000001651211150047203021565 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * rfc2198_sim_tests.c - Tests for the G.1050/TIA-921 model * with redundant transmission in the * style of UDPTL or RFC2198.. * * Written by Steve Underwood * * Copyright (C) 2007 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2, as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: rfc2198_sim_tests.c,v 1.5 2008/05/13 13:17:26 steveu Exp $ */ #if defined(HAVE_CONFIG_H) #include "config.h" #endif #if defined(HAVE_FL_FL_H) && defined(HAVE_FL_FL_CARTESIAN_H) && defined(HAVE_FL_FL_AUDIO_METER_H) #define ENABLE_GUI #endif #include #include #include #include #include #include #include #if defined(HAVE_MATH_H) #define GEN_CONST #endif #include "spandsp.h" #include "spandsp-sim.h" #if defined(ENABLE_GUI) #include "media_monitor.h" #endif #define PACKET_SIZE 256 #define PACKET_INTERVAL 20 #define SIMULATION_TIME 300 #define MODEL_NO 8 #define SPEED_PATTERN_NO 133 int main(int argc, char *argv[]) { rfc2198_sim_state_t *s; double *packet_arrival_times; int packets_per_sec; int num_packets; int model_no; int speed_pattern_no; int use_gui; int simulation_time; int i; int len; uint8_t put_pkt[256]; uint8_t get_pkt[256]; int put_pkt_len; int get_pkt_len; int get_seq_no; double get_departure_time; double get_arrival_time; int packets_put; int packets_really_put; int packets_got; int oos_packets_got; int missing_packets_got; int highest_seq_no_got; int opt; FILE *out_file; model_no = MODEL_NO; speed_pattern_no = SPEED_PATTERN_NO; simulation_time = SIMULATION_TIME; use_gui = FALSE; while ((opt = getopt(argc, argv, "gm:s:t:")) != -1) { switch (opt) { case 'g': #if defined(ENABLE_GUI) use_gui = TRUE; #else fprintf(stderr, "Graphical monitoring not available\n"); exit(2); #endif break; case 'm': model_no = optarg[0] - 'A' + 1; if (model_no < 0 || model_no > 8) { fprintf(stderr, "Bad model ID '%s'\n", optarg); exit(2); } break; case 's': speed_pattern_no = atoi(optarg); if (speed_pattern_no < 1 || speed_pattern_no > 133) { fprintf(stderr, "Bad link speed pattern %s\n", optarg); exit(2); } break; case 't': simulation_time = atoi(optarg); break; default: //usage(); exit(2); break; } } argc -= optind; argv += optind; if ((out_file = fopen("rfc2198_sim_tests.txt", "w")) == NULL) { fprintf(stderr, "Can't open %s\n", "rfc2198_sim_tests.txt"); return 2; } packets_per_sec = 1000/PACKET_INTERVAL; num_packets = packets_per_sec*simulation_time; if ((packet_arrival_times = calloc(num_packets, sizeof(double))) == NULL) { fprintf(stderr, "Can't allocate the data buffers\n"); return 2; } for (i = 0; i < num_packets; i++) packet_arrival_times[i] = 0.0; /* If we don't initialise this random number generator it gives endless zeros on some systems. */ /* Use a fixed seed to produce identical results in successive runs of the simulation, for debug purposes. */ srand48(0x1234567); if ((s = rfc2198_sim_init(model_no, speed_pattern_no, PACKET_SIZE, packets_per_sec, 3)) == NULL) { fprintf(stderr, "Failed to start the G.1050 model\n"); exit(2); } //rfc2198_sim_dump_parms(model_no, speed_pattern_no); #if defined(ENABLE_GUI) if (use_gui) start_media_monitor(); #endif for (i = 0; i < 256; i++) put_pkt[i] = i; put_pkt_len = 256; get_pkt_len = -1; get_seq_no = -1; get_arrival_time = -1; packets_put = 0; packets_really_put = 0; packets_got = 0; oos_packets_got = 0; missing_packets_got = 0; highest_seq_no_got = -1; for (i = 0; i < num_packets; i++) { if ((len = rfc2198_sim_put(s, put_pkt, put_pkt_len, i, (double) i*0.001*PACKET_INTERVAL)) > 0) packets_really_put++; packets_put++; #if 0 if (i == 5) rfc2198_sim_queue_dump(s); #endif if (i >= 5) { do { get_pkt_len = rfc2198_sim_get(s, get_pkt, 256, (double) i*0.001*PACKET_INTERVAL, &get_seq_no, &get_departure_time, &get_arrival_time); if (get_pkt_len >= 0) { #if defined(ENABLE_GUI) if (use_gui) media_monitor_rx(get_seq_no, get_departure_time, get_arrival_time); #endif packets_got++; if (get_seq_no < highest_seq_no_got) oos_packets_got++; else if (get_seq_no > highest_seq_no_got + 1) missing_packets_got += (get_seq_no - highest_seq_no_got - 1); if (get_seq_no > highest_seq_no_got) highest_seq_no_got = get_seq_no; fprintf(out_file, "%d, %.3f, %.8f\n", get_seq_no, get_seq_no*0.001*PACKET_INTERVAL, get_arrival_time); } } while (get_pkt_len >= 0); } #if defined(ENABLE_GUI) if (use_gui) media_monitor_update_display(); #endif } /* Clear out anything remaining in the queue, by jumping forwards in time */ do { get_pkt_len = rfc2198_sim_get(s, get_pkt, 256, (double) i*0.001*PACKET_INTERVAL + 5.0, &get_seq_no, &get_departure_time, &get_arrival_time); if (get_pkt_len >= 0) { packets_got++; fprintf(out_file, "%d, %.3f, %.8f\n", get_seq_no, get_seq_no*0.001*PACKET_INTERVAL, get_arrival_time); } } while (get_pkt_len >= 0); fclose(out_file); printf("Put %d packets. Really put %d packets. Got %d packets.\n", packets_put, packets_really_put, packets_got); printf("%d OOS packets, %d missing packets\n", oos_packets_got, missing_packets_got - oos_packets_got); printf("%d packets queued, %d received\n", packets_really_put, packets_got); printf("%.3f%% of packets lost before redundancy\n", 100.0*(packets_put - packets_really_put)/packets_put); printf("%.3f%% of packets lost after redundancy\n", 100.0*(packets_put - packets_got)/packets_put); return 0; } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/tests/at_interpreter_tests.c0000644000175000017500000011612711150047203022651 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * at_interpreter_tests.c - Tests for the AT interpreter. * * Written by Steve Underwood * * Copyright (C) 2004, 2005, 2006 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2, as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: at_interpreter_tests.c,v 1.17 2008/06/29 03:28:48 steveu Exp $ */ /*! \file */ /*! \page at_interpreter_tests_page AT interpreter tests \section at_interpreter_tests_page_sec_1 What does it do? These tests exercise all the commands which should be understood by the AT interpreter. */ #if defined(HAVE_CONFIG_H) #include "config.h" #endif #include #include #include #include #include #include #include #include "spandsp.h" #define DLE 0x10 #define ETX 0x03 #define SUB 0x1A #define MANUFACTURER "www.soft-switch.org" struct command_response_s { const char *command; const char *response; }; static const struct command_response_s general_test_seq[] = { /* Try the various cases for "AT" */ {"atE1\r", "atE1\r\r\nOK\r\n"}, {"AtE1\r", "AtE1\r\r\nOK\r\n"}, {"aTE1\r", "aTE1\r\r\nOK\r\n"}, {"ATE1\r", "ATE1\r\r\nOK\r\n"}, {"ATE0\r", "ATE0\r\r\nOK\r\n"}, /* Try the various command formats */ {"ATS8?\r", "\r\n005\r\n\r\nOK\r\n"}, {"ATS8=1\r", "\r\nOK\r\n"}, {"ATS8.5?\r", "\r\n0\r\n\r\nOK\r\n"}, {"ATS8.5=1\r", "\r\nOK\r\n"}, {"ATS8.5?\r", "\r\n1\r\n\r\nOK\r\n"}, {"ATS8?\r", "\r\n033\r\n\r\nOK\r\n"}, {"AT+FCLASS=1\r", "\r\nOK\r\n"}, {"AT+FCLASS?\r", "\r\n1\r\n\r\nOK\r\n"}, {"AT+FCLASS=?\r", "\r\n0,1,1.0\r\n\r\nOK\r\n"}, /* Try all the commands */ {"AT&C\r", "\r\nOK\r\n"}, /* V.250 6.2.8 - Circuit 109 (received line signal detector), behaviour */ {"AT&D\r", "\r\nOK\r\n"}, /* V.250 6.2.9 - Circuit 108 (data terminal ready) behaviour */ {"AT&F\r", "\r\nOK\r\n"}, /* V.250 6.1.2 - Set to factory-defined configuration */ {"ATE0\r", "ATE0\r\r\nOK\r\n"}, /* Counteract the effects of the above */ {"AT+A8E=?\r", "\r\n+A8E:(0-6),(0-5),(00-FF)\r\n\r\nOK\r\n"}, /* V.251 5.1 - V.8 and V.8bis operation controls */ {"AT+A8M\r", "\r\nOK\r\n"}, /* V.251 5.2 - Send V.8 menu signals */ {"AT+A8T=?\r", "\r\n+A8T:(0-10)\r\n\r\nOK\r\n"}, /* V.251 5.3 - Send V.8bis signal and/or message(s) */ {"AT+ASTO=?\r", "\r\n+ASTO:\r\n\r\nOK\r\n"}, /* V.250 6.3.15 - Store telephone number */ {"AT+CAAP=?\r", "\r\n+CAAP:\r\n\r\nOK\r\n"}, /* 3GPP TS 27.007 7.25 - Automatic answer for eMLPP Service */ {"AT+CACM=?\r", "\r\n+CACM:\r\n\r\nOK\r\n"}, /* 3GPP TS 27.007 8.25 - Accumulated call meter */ {"AT+CACSP=?\r", "\r\n+CACSP:\r\n\r\nOK\r\n"}, /* 3GPP TS 27.007 11.1.7 - Voice Group or Voice Broadcast Call State Attribute Presentation */ {"AT+CAEMLPP=?\r", "\r\n+CAEMLPP:\r\n\r\nOK\r\n"}, /* 3GPP TS 27.007 7.22 - eMLPP Priority Registration and Interrogation */ {"AT+CAHLD=?\r", "\r\n+CAHLD:\r\n\r\nOK\r\n"}, /* 3GPP TS 27.007 11.1.3 - Leave an ongoing Voice Group or Voice Broadcast Call */ {"AT+CAJOIN=?\r", "\r\n+CAJOIN:\r\n\r\nOK\r\n"}, /* 3GPP TS 27.007 11.1.1 - Accept an incoming Voice Group or Voice Broadcast Call */ {"AT+CALA=?\r", "\r\n+CALA:\r\n\r\nOK\r\n"}, /* 3GPP TS 27.007 8.16 - Alarm */ {"AT+CALCC=?\r", "\r\n+CALCC:\r\n\r\nOK\r\n"}, /* 3GPP TS 27.007 11.1.6 - List current Voice Group and Voice Broadcast Calls */ {"AT+CALD=?\r", "\r\n+CALD:\r\n\r\nOK\r\n"}, /* 3GPP TS 27.007 8.38 - Delete alar m */ {"AT+CALM=?\r", "\r\n+CALM:\r\n\r\nOK\r\n"}, /* 3GPP TS 27.007 8.20 - Alert sound mode */ {"AT+CAMM=?\r", "\r\n+CAMM:\r\n\r\nOK\r\n"}, /* 3GPP TS 27.007 8.26 - Accumulated call meter maximum */ {"AT+CANCHEV=?\r", "\r\n+CANCHEV:\r\n\r\nOK\r\n"}, /* 3GPP TS 27.007 11.1.8 - NCH Support Indication */ {"AT+CAOC=?\r", "\r\n+CAOC:\r\n\r\nOK\r\n"}, /* 3GPP TS 27.007 7.16 - Advice of Charge */ {"AT+CAPD=?\r", "\r\n+CAPD:\r\n\r\nOK\r\n"}, /* 3GPP TS 27.007 8.39 - Postpone or dismiss an alarm */ {"AT+CAPTT=?\r", "\r\n+CAPTT:\r\n\r\nOK\r\n"}, /* 3GPP TS 27.007 11.1.4 - Talker Access for Voice Group Call */ {"AT+CAREJ=?\r", "\r\n+CAREJ:\r\n\r\nOK\r\n"}, /* 3GPP TS 27.007 11.1.2 - Reject an incoming Voice Group or Voice Broadcast Call */ {"AT+CAULEV=?\r", "\r\n+CAULEV:\r\n\r\nOK\r\n"}, /* 3GPP TS 27.007 11.1.5 - Voice Group Call Uplink Status Presentation */ {"AT+CBC=?\r", "\r\n+CBC:\r\n\r\nOK\r\n"}, /* 3GPP TS 27.007 8.4 - Battery charge */ {"AT+CBCS=?\r", "\r\n+CBCS:\r\n\r\nOK\r\n"}, /* 3GPP TS 27.007 11.3.2 - VBS subscriptions and GId status */ {"AT+CBST=?\r", "\r\n+CBST:\r\n\r\nOK\r\n"}, /* 3GPP TS 27.007 6.7 - Select bearer service type */ {"AT+CCFC=?\r", "\r\n+CCFC:\r\n\r\nOK\r\n"}, /* 3GPP TS 27.007 7.11 - Call forwarding number and conditions */ {"AT+CCLK=?\r", "\r\n+CCLK:\r\n\r\nOK\r\n"}, /* 3GPP TS 27.007 8.15 - Clock */ {"AT+CCUG=?\r", "\r\n+CCUG:\r\n\r\nOK\r\n"}, /* 3GPP TS 27.007 7.10 - Closed user group */ {"AT+CCWA=?\r", "\r\n+CCWA:\r\n\r\nOK\r\n"}, /* 3GPP TS 27.007 7.12 - Call waiting */ {"AT+CCWE=?\r", "\r\n+CCWE:\r\n\r\nOK\r\n"}, /* 3GPP TS 27.007 8.28 - Call Meter maximum event */ {"AT+CDIP=?\r", "\r\n+CDIP:\r\n\r\nOK\r\n"}, /* 3GPP TS 27.007 7.9 - Called line identification presentation */ {"AT+CDIS=?\r", "\r\n+CDIS:\r\n\r\nOK\r\n"}, /* 3GPP TS 27.007 8.8 - Display control */ {"AT+CEER=?\r", "\r\n+CEER:\r\n\r\nOK\r\n"}, /* 3GPP TS 27.007 6.10 - Extended error report */ {"AT+CFCS=?\r", "\r\n+CFCS:\r\n\r\nOK\r\n"}, /* 3GPP TS 27.007 7.24 - Fast call setup conditions */ {"AT+CFUN=?\r", "\r\n+CFUN:\r\n\r\nOK\r\n"}, /* 3GPP TS 27.007 8.2 - Set phone functionality */ {"AT+CGACT=?\r", "\r\n+CGACT:\r\n\r\nOK\r\n"}, /* 3GPP TS 27.007 10.1.10 - PDP context activate or deactivate */ {"AT+CGANS=?\r", "\r\n+CGANS:\r\n\r\nOK\r\n"}, /* 3GPP TS 27.007 10.1.16 - Manual response to a network request for PDP context activation */ {"AT+CGATT=?\r", "\r\n+CGATT:\r\n\r\nOK\r\n"}, /* 3GPP TS 27.007 10.1.9 - PS attach or detach */ {"AT+CGAUTO=?\r", "\r\n+CGAUTO:\r\n\r\nOK\r\n"}, /* 3GPP TS 27.007 10.1.15 - Automatic response to a network request for PDP context activation */ {"AT+CGCLASS=?\r", "\r\n+CGCLASS:\r\n\r\nOK\r\n"}, /* 3GPP TS 27.007 10.1.17 - GPRS mobile station class (GPRS only) */ {"AT+CGCLOSP=?\r", "\r\n+CGCLOSP:\r\n\r\nOK\r\n"}, /* 3GPP TS 27.007 10.1.13 - Configure local octet stream PAD parameters (Obsolete) */ {"AT+CGCLPAD=?\r", "\r\n+CGCLPAD:\r\n\r\nOK\r\n"}, /* 3GPP TS 27.007 10.1.12 - Configure local triple-X PAD parameters (GPRS only) (Obsolete) */ {"AT+CGCMOD=?\r", "\r\n+CGCMOD:\r\n\r\nOK\r\n"}, /* 3GPP TS 27.007 10.1.11 - PDP Context Modify */ {"AT+CGCS=?\r", "\r\n+CGCS:\r\n\r\nOK\r\n"}, /* 3GPP TS 27.007 11.3.1 - VGCS subscriptions and GId status */ {"AT+CGDATA=?\r", "\r\n+CGDATA:\r\n\r\nOK\r\n"}, /* 3GPP TS 27.007 10.1.12 - Enter data state */ {"AT+CGDCONT=?\r", "\r\n+CGDCONT:\r\n\r\nOK\r\n"}, /* 3GPP TS 27.007 10.1.1 - Define PDP Context */ {"AT+CGDSCONT=?\r", "\r\n+CGDSCONT:\r\n\r\nOK\r\n"}, /* 3GPP TS 27.007 10.1.2 - Define Secondary PDP Context */ {"AT+CGEQMIN=?\r", "\r\n+CGEQMIN:\r\n\r\nOK\r\n"}, /* 3GPP TS 27.007 10.1.7 - 3G Quality of Service Profile (Minimum acceptable) */ {"AT+CGEQNEG=?\r", "\r\n+CGEQNEG:\r\n\r\nOK\r\n"}, /* 3GPP TS 27.007 10.1.8 - 3G Quality of Service Profile (Negotiated) */ {"AT+CGEQREQ=?\r", "\r\n+CGEQREQ:\r\n\r\nOK\r\n"}, /* 3GPP TS 27.007 10.1.6 - 3G Quality of Service Profile (Requested) */ {"AT+CGEREP=?\r", "\r\n+CGEREP:\r\n\r\nOK\r\n"}, /* 3GPP TS 27.007 10.1.18 - Packet Domain event reporting */ {"AT+CGMI=?\r", "\r\n+CGMI:\r\n\r\nOK\r\n"}, /* 3GPP TS 27.007 5.1 - Request manufacturer identification */ {"AT+CGMM=?\r", "\r\n+CGMM:\r\n\r\nOK\r\n"}, /* 3GPP TS 27.007 5.2 - Request model identification */ {"AT+CGMR=?\r", "\r\n+CGMR:\r\n\r\nOK\r\n"}, /* 3GPP TS 27.007 5.3 - Request revision identification */ {"AT+CGPADDR=?\r", "\r\n+CGPADDR:\r\n\r\nOK\r\n"}, /* 3GPP TS 27.007 10.1.14 - Show PDP address */ {"AT+CGQMIN=?\r", "\r\n+CGQMIN:\r\n\r\nOK\r\n"}, /* 3GPP TS 27.007 10.1.5 - Quality of Service Profile (Minimum acceptable) */ {"AT+CGQREQ=?\r", "\r\n+CGQREQ:\r\n\r\nOK\r\n"}, /* 3GPP TS 27.007 10.1.4 - Quality of Service Profile (Requested) */ {"AT+CGREG=?\r", "\r\n+CGREG:\r\n\r\nOK\r\n"}, /* 3GPP TS 27.007 10.1.19 - GPRS network registration status */ {"AT+CGSMS=?\r", "\r\n+CGSMS:\r\n\r\nOK\r\n"}, /* 3GPP TS 27.007 10.1.20 - Select service for MO SMS messages */ {"AT+CGSN=?\r", "\r\n+CGSN:\r\n\r\nOK\r\n"}, /* 3GPP TS 27.007 5.4 - Request product serial number identification */ {"AT+CGTFT=?\r", "\r\n+CGTFT:\r\n\r\nOK\r\n"}, /* 3GPP TS 27.007 10.1.3 - Traffic Flow Template */ {"AT+CHLD=?\r", "\r\n+CHLD:\r\n\r\nOK\r\n"}, /* 3GPP TS 27.007 7.13 - Call related supplementary services */ {"AT+CHSA=?\r", "\r\n+CHSA:\r\n\r\nOK\r\n"}, /* 3GPP TS 27.007 6.18 - HSCSD non-transparent asymmetry configuration */ {"AT+CHSC=?\r", "\r\n+CHSC:\r\n\r\nOK\r\n"}, /* 3GPP TS 27.007 6.15 - HSCSD current call parameters */ {"AT+CHSD=?\r", "\r\n+CHSD:\r\n\r\nOK\r\n"}, /* 3GPP TS 27.007 6.12 - HSCSD device parameters */ {"AT+CHSN=?\r", "\r\n+CHSN:\r\n\r\nOK\r\n"}, /* 3GPP TS 27.007 6.14 - HSCSD non-transparent call configuration */ {"AT+CHSR=?\r", "\r\n+CHSR:\r\n\r\nOK\r\n"}, /* 3GPP TS 27.007 6.16 - HSCSD parameters report */ {"AT+CHST=?\r", "\r\n+CHST:\r\n\r\nOK\r\n"}, /* 3GPP TS 27.007 6.13 - HSCSD transparent call configuration */ {"AT+CHSU=?\r", "\r\n+CHSU:\r\n\r\nOK\r\n"}, /* 3GPP TS 27.007 6.17 - HSCSD automatic user initiated upgrading */ {"AT+CHUP=?\r", "\r\n+CHUP:\r\n\r\nOK\r\n"}, /* 3GPP TS 27.007 6.5 - Hangup call */ {"AT+CIMI=?\r", "\r\n+CIMI:\r\n\r\nOK\r\n"}, /* 3GPP TS 27.007 5.6 - Request international mobile subscriber identity */ {"AT+CIND=?\r", "\r\n+CIND:\r\n\r\nOK\r\n"}, /* 3GPP TS 27.007 8.9 - Indicator control */ {"AT+CKPD=?\r", "\r\n+CKPD:\r\n\r\nOK\r\n"}, /* 3GPP TS 27.007 8.7 - Keypad control */ {"AT+CLAC=?\r", "\r\n+CLAC:\r\n\r\nOK\r\n"}, /* 3GPP TS 27.007 8.37 - List all available AT commands */ {"AT+CLAE=?\r", "\r\n+CLAE:\r\n\r\nOK\r\n"}, /* 3GPP TS 27.007 8.31 - Language Event */ {"AT+CLAN=?\r", "\r\n+CLAN:\r\n\r\nOK\r\n"}, /* 3GPP TS 27.007 8.30 - Set Language */ {"AT+CLCC=?\r", "\r\n+CLCC:\r\n\r\nOK\r\n"}, /* 3GPP TS 27.007 7.18 - List current calls */ {"AT+CLCK=?\r", "\r\n+CLCK:\r\n\r\nOK\r\n"}, /* 3GPP TS 27.007 7.4 - Facility lock */ {"AT+CLIP=?\r", "\r\n+CLIP:\r\n\r\nOK\r\n"}, /* 3GPP TS 27.007 7.6 - Calling line identification presentation */ {"AT+CLIR=?\r", "\r\n+CLIR:\r\n\r\nOK\r\n"}, /* 3GPP TS 27.007 7.7 - Calling line identification restriction */ {"AT+CLVL=?\r", "\r\n+CLVL:\r\n\r\nOK\r\n"}, /* 3GPP TS 27.007 8.23 - Loudspeaker volume level */ {"AT+CMAR=?\r", "\r\n+CMAR:\r\n\r\nOK\r\n"}, /* 3GPP TS 27.007 8.36 - Master Reset */ {"AT+CMEC=?\r", "\r\n+CMEC:\r\n\r\nOK\r\n"}, /* 3GPP TS 27.007 8.6 - Mobile Termination control mode */ {"AT+CMER=?\r", "\r\n+CMER:\r\n\r\nOK\r\n"}, /* 3GPP TS 27.007 8.10 - Mobile Termination event reporting */ {"AT+CMOD=?\r", "\r\n+CMOD:\r\n\r\nOK\r\n"}, /* 3GPP TS 27.007 6.4 - Call mode */ {"AT+CMUT=?\r", "\r\n+CMUT:\r\n\r\nOK\r\n"}, /* 3GPP TS 27.007 8.24 - Mute control */ {"AT+CMUX=?\r", "\r\n+CMUX:\r\n\r\nOK\r\n"}, /* 3GPP TS 27.007 5.7 - Multiplexing mode */ {"AT+CNUM=?\r", "\r\n+CNUM:\r\n\r\nOK\r\n"}, /* 3GPP TS 27.007 7.1 - Subscriber number */ {"AT+COLP=?\r", "\r\n+COLP:\r\n\r\nOK\r\n"}, /* 3GPP TS 27.007 7.8 - Connected line identification presentation */ {"AT+COPN=?\r", "\r\n+COPN:\r\n\r\nOK\r\n"}, /* 3GPP TS 27.007 7.21 - Read operator names */ {"AT+COPS=?\r", "\r\n+COPS:\r\n\r\nOK\r\n"}, /* 3GPP TS 27.007 7.3 - PLMN selection */ {"AT+COTDI=?\r", "\r\n+COTDI:\r\n\r\nOK\r\n"}, /* 3GPP TS 27.007 11.1.9 - Originator to Dispatcher Information */ {"AT+CPAS=?\r", "\r\n+CPAS:\r\n\r\nOK\r\n"}, /* 3GPP TS 27.007 8.1 - Phone activity status */ {"AT+CPBF=?\r", "\r\n+CPBF:\r\n\r\nOK\r\n"}, /* 3GPP TS 27.007 8.13 - Find phonebook entries */ {"AT+CPBR=?\r", "\r\n+CPBR:\r\n\r\nOK\r\n"}, /* 3GPP TS 27.007 8.12 - Read phonebook entries */ {"AT+CPBS=?\r", "\r\n+CPBS:\r\n\r\nOK\r\n"}, /* 3GPP TS 27.007 8.11 - Select phonebook memory storage */ {"AT+CPBW=?\r", "\r\n+CPBW:\r\n\r\nOK\r\n"}, /* 3GPP TS 27.007 8.14 - Write phonebook entry */ {"AT+CPIN=?\r", "\r\n+CPIN:\r\n\r\nOK\r\n"}, /* 3GPP TS 27.007 8.3 - Enter PIN */ {"AT+CPLS=?\r", "\r\n+CPLS:\r\n\r\nOK\r\n"}, /* 3GPP TS 27.007 7.20 - Selection of preferred PLMN list */ {"AT+CPOL=?\r", "\r\n+CPOL:\r\n\r\nOK\r\n"}, /* 3GPP TS 27.007 7.19 - Preferred PLMN list */ {"AT+CPPS=?\r", "\r\n+CPPS:\r\n\r\nOK\r\n"}, /* 3GPP TS 27.007 7.23 - eMLPP subscriptions */ {"AT+CPROT=?\r", "\r\n+CPROT:\r\n\r\nOK\r\n"}, /* 3GPP TS 27.007 8.42 - Enter protocol mode */ {"AT+CPUC=?\r", "\r\n+CPUC:\r\n\r\nOK\r\n"}, /* 3GPP TS 27.007 8.27 - Price per unit and currency table */ {"AT+CPWC=?\r", "\r\n+CPWC:\r\n\r\nOK\r\n"}, /* 3GPP TS 27.007 8.29 - Power class */ {"AT+CPWD=?\r", "\r\n+CPWD:\r\n\r\nOK\r\n"}, /* 3GPP TS 27.007 7.5 - Change password */ {"AT+CR=?\r", "\r\n+CR:\r\n\r\nOK\r\n"}, /* 3GPP TS 27.007 6.9 - Service reporting control */ {"AT+CRC=?\r", "\r\n+CRC:\r\n\r\nOK\r\n"}, /* 3GPP TS 27.007 6.11 - Cellular result codes */ {"AT+CREG=?\r", "\r\n+CREG:\r\n\r\nOK\r\n"}, /* 3GPP TS 27.007 7.2 - Network registration */ {"AT+CRLP=?\r", "\r\n+CRLP:\r\n\r\nOK\r\n"}, /* 3GPP TS 27.007 6.8 - Radio link protocol */ {"AT+CRMC=?\r", "\r\n+CRMC:\r\n\r\nOK\r\n"}, /* 3GPP TS 27.007 8.34 - Ring Melody Control */ {"AT+CRMP=?\r", "\r\n+CRMP:\r\n\r\nOK\r\n"}, /* 3GPP TS 27.007 8.35 - Ring Melody Playback */ {"AT+CRSL=?\r", "\r\n+CRSL:\r\n\r\nOK\r\n"}, /* 3GPP TS 27.007 8.21 - Ringer sound level */ {"AT+CRSM=?\r", "\r\n+CRSM:\r\n\r\nOK\r\n"}, /* 3GPP TS 27.007 8.18 - Restricted SIM access */ {"AT+CSCC=?\r", "\r\n+CSCC:\r\n\r\nOK\r\n"}, /* 3GPP TS 27.007 8.19 - Secure control command */ {"AT+CSCS=?\r", "\r\n+CSCS:\r\n\r\nOK\r\n"}, /* 3GPP TS 27.007 5.5 - Select TE character set */ {"AT+CSDF=?\r", "\r\n+CSDF:\r\n\r\nOK\r\n"}, /* 3GPP TS 27.007 6.22 - Settings date format */ {"AT+CSGT=?\r", "\r\n+CSGT:\r\n\r\nOK\r\n"}, /* 3GPP TS 27.007 8.32 - Set Greeting Text */ {"AT+CSIL=?\r", "\r\n+CSIL:\r\n\r\nOK\r\n"}, /* 3GPP TS 27.007 6.23 - Silence Command */ {"AT+CSIM=?\r", "\r\n+CSIM:\r\n\r\nOK\r\n"}, /* 3GPP TS 27.007 8.17 - Generic SIM access */ {"AT+CSNS=?\r", "\r\n+CSNS:\r\n\r\nOK\r\n"}, /* 3GPP TS 27.007 6.19 - Single numbering scheme */ {"AT+CSQ=?\r", "\r\n+CSQ:\r\n\r\nOK\r\n"}, /* 3GPP TS 27.007 8.5 - Signal quality */ {"AT+CSSN=?\r", "\r\n+CSSN:\r\n\r\nOK\r\n"}, /* 3GPP TS 27.007 7.17 - Supplementary service notifications */ {"AT+CSTA=?\r", "\r\n+CSTA:\r\n\r\nOK\r\n"}, /* 3GPP TS 27.007 6.1 - Select type of address */ {"AT+CSTF=?\r", "\r\n+CSTF:\r\n\r\nOK\r\n"}, /* 3GPP TS 27.007 6.24 - Settings time format */ {"AT+CSVM=?\r", "\r\n+CSVM:\r\n\r\nOK\r\n"}, /* 3GPP TS 27.007 8.33 - Set Voice Mail Number */ {"AT+CTFR=?\r", "\r\n+CTFR:\r\n\r\nOK\r\n"}, /* 3GPP TS 27.007 7.14 - Call deflection */ {"AT+CTZR=?\r", "\r\n+CTZR:\r\n\r\nOK\r\n"}, /* 3GPP TS 27.007 8.41 - Time Zone Reporting */ {"AT+CTZU=?\r", "\r\n+CTZU:\r\n\r\nOK\r\n"}, /* 3GPP TS 27.007 8.40 - Automatic Time Zone Update */ {"AT+CUSD=?\r", "\r\n+CUSD:\r\n\r\nOK\r\n"}, /* 3GPP TS 27.007 7.15 - Unstructured supplementary service data */ {"AT+CUUS1=?\r", "\r\n+CUUS1:\r\n\r\nOK\r\n"}, /* 3GPP TS 27.007 7.26 - User to User Signalling Service 1 */ {"AT+CV120=?\r", "\r\n+CV120:\r\n\r\nOK\r\n"}, /* 3GPP TS 27.007 6.21 - V.120 rate adaption protocol */ {"AT+CVHU=?\r", "\r\n+CVHU:\r\n\r\nOK\r\n"}, /* 3GPP TS 27.007 6.20 - Voice Hangup Control */ {"AT+CVIB=?\r", "\r\n+CVIB:\r\n\r\nOK\r\n"}, /* 3GPP TS 27.007 8.22 - Vibrator mode */ {"AT+DR=?\r", "\r\n+DR:\r\n\r\nOK\r\n"}, /* V.250 6.6.2 - Data compression reporting */ {"AT+DS=?\r", "\r\n+DS:\r\n\r\nOK\r\n"}, /* V.250 6.6.1 - Data compression */ {"AT+EB=?\r", "\r\n+EB:\r\n\r\nOK\r\n"}, /* V.250 6.5.2 - Break handling in error control operation */ {"AT+EFCS=?\r", "\r\n+EFCS:(0-2)\r\n\r\nOK\r\n"}, /* V.250 6.5.4 - 32-bit frame check sequence */ {"AT+EFCS?\r", "\r\n+EFCS:0\r\n\r\nOK\r\n"}, {"AT+EFRAM=?\r", "\r\n+EFRAM:(1-65535),(1-65535)\r\n\r\nOK\r\n"}, /* V.250 6.5.8 - Frame length */ {"AT+ER=?\r", "\r\n+ER:(0,1)\r\n\r\nOK\r\n"}, /* V.250 6.5.5 - Error control reporting */ {"AT+ES\r", "\r\nOK\r\n"}, /* V.250 6.5.1 - Error control selection */ {"AT+ESR\r", "\r\nOK\r\n"}, /* V.250 6.5.3 - Selective repeat */ {"AT+ETBM=?\r", "\r\n+ETBM:(0-2),(0-2),(0-30)\r\n\r\nOK\r\n"}, /* T.31 8.5.1 - Adaptive reception control */ {"AT+ETBM?\r", "\r\n+ETBM:0,0\r\n\r\nOK\r\n"}, {"AT+EWIND=?\r", "\r\n+EWIND:(1-127),(1-127)\r\n\r\nOK\r\n"}, /* V.250 6.5.7 - Window size */ {"AT+EWIND?\r", "\r\n+EWIND:0,0\r\n\r\nOK\r\n"}, {"AT+FAR=?\r", "\r\n0,1\r\n\r\nOK\r\n"}, /* T.31 8.5.1 - Adaptive reception control */ {"AT+FAR?\r", "\r\n0\r\n\r\nOK\r\n"}, {"AT+FCL=?\r", "\r\n(0-255)\r\n\r\nOK\r\n"}, /* T.31 8.5.2 - Carrier loss timeout */ {"AT+FCLASS=?\r", "\r\n0,1,1.0\r\n\r\nOK\r\n"}, /* T.31 8.2 - Capabilities identification and control */ {"AT+FCLASS?\r", "\r\n1\r\n\r\nOK\r\n"}, {"AT+FDD=?\r", "\r\n(0,1)\r\n\r\nOK\r\n"}, /* T.31 8.5.3 - Double escape character replacement */ {"AT+FDD?\r", "\r\n0\r\n\r\nOK\r\n"}, {"AT+FIT=?\r", "\r\n+FIT:(0-255),(0-1)\r\n\r\nOK\r\n"}, /* T.31 8.5.4 - DTE inactivity timeout */ {"AT+FIT?\r", "\r\n+FIT:0,0\r\n\r\nOK\r\n"}, {"AT+FLO\r", "\r\nOK\r\n"}, /* T.31 says to implement something similar to +IFC */ {"AT+FMI?\r", "\r\n" MANUFACTURER "\r\n\r\nOK\r\n"}, /* T.31 says to duplicate +GMI */ {"AT+FMM?\r", "\r\n" PACKAGE "\r\n\r\nOK\r\n"}, /* T.31 says to duplicate +GMM */ {"AT+FMR?\r", "\r\n" VERSION "\r\n\r\nOK\r\n"}, /* T.31 says to duplicate +GMR */ {"AT+FPR=?\r", "\r\n115200\r\n\r\nOK\r\n"}, /* T.31 says to implement something similar to +IPR */ {"AT+FPR?\r", "\r\n0\r\n\r\nOK\r\n"}, {"AT+FRH=?\r", "\r\n3\r\n\r\nOK\r\n"}, /* T.31 8.3.6 - HDLC receive */ {"AT+FRH?\r", "\r\n-1\r\n\r\nOK\r\n"}, {"AT+FRM=?\r", "\r\n24,48,72,73,74,96,97,98,121,122,145,146\r\n\r\nOK\r\n"}, /* T.31 8.3.4 - Facsimile receive */ {"AT+FRM?\r", "\r\n-1\r\n\r\nOK\r\n"}, {"AT+FRS=?\r", "\r\n0-255\r\n\r\nOK\r\n"}, /* T.31 8.3.2 - Receive silence */ {"AT+FRS?\r", "\r\n-1\r\n\r\nOK\r\n"}, {"AT+FTH=?\r", "\r\n3\r\n\r\nOK\r\n"}, /* T.31 8.3.5 - HDLC transmit */ {"AT+FTH?\r", "\r\n-1\r\n\r\nOK\r\n"}, {"AT+FTM=?\r", "\r\n24,48,72,73,74,96,97,98,121,122,145,146\r\n\r\nOK\r\n"}, /* T.31 8.3.3 - Facsimile transmit */ {"AT+FTM?\r", "\r\n-1\r\n\r\nOK\r\n"}, {"AT+FTS=?\r", "\r\n0-255\r\n\r\nOK\r\n"}, /* T.31 8.3.1 - Transmit silence */ {"AT+FTS?\r", "\r\n-1\r\n\r\nOK\r\n"}, {"AT+GCAP\r", "\r\nOK\r\n"}, /* V.250 6.1.9 - Request complete capabilities list */ {"AT+GCI=?\r", "\r\n+GCI:(00-FF)\r\n\r\nOK\r\n"}, /* V.250 6.1.10 - Country of installation, */ {"AT+GCI?\r", "\r\n+GCI:00\r\n\r\nOK\r\n"}, {"AT+GMI?\r", "\r\n" MANUFACTURER "\r\n\r\nOK\r\n"}, /* V.250 6.1.4 - Request manufacturer identification */ {"AT+GMM?\r", "\r\n" PACKAGE "\r\n\r\nOK\r\n"}, /* V.250 6.1.5 - Request model identification */ {"AT+GMR?\r", "\r\n" VERSION "\r\n\r\nOK\r\n"}, /* V.250 6.1.6 - Request revision identification */ {"AT+GOI\r", "\r\nOK\r\n"}, /* V.250 6.1.8 - Request global object identification */ {"AT+GSN?\r", "\r\n42\r\n\r\nOK\r\n"}, /* V.250 6.1.7 - Request product serial number identification */ {"AT+ICF?\r", "\r\n+ICF:0,0\r\n\r\nOK\r\n"}, /* V.250 6.2.11 - DTE-DCE character framing */ {"AT+ICLOK?\r", "\r\n+ICLOK:0\r\n\r\nOK\r\n"}, /* V.250 6.2.14 - Select sync transmit clock source */ {"AT+IDSR?\r", "\r\n+IDSR:0\r\n\r\nOK\r\n"}, /* V.250 6.2.16 - Select data set ready option */ {"AT+IFC\r", "\r\nOK\r\n"}, /* V.250 6.2.12 - DTE-DCE local flow control */ {"AT+ILRR\r", "\r\nOK\r\n"}, /* V.250 6.2.13 - DTE-DCE local rate reporting */ {"AT+ILSD=?\r", "\r\n+ILSD:(0,1)\r\n\r\nOK\r\n"}, /* V.250 6.2.15 - Select long space disconnect option */ {"AT+ILSD?\r", "\r\n+ILSD:0\r\n\r\nOK\r\n"}, {"AT+IPR=?\r", "\r\n+IPR:(115200),(115200)\r\n\r\nOK\r\n"}, /* V.250 6.2.10 - Fixed DTE rate */ {"AT+IPR?\r", "\r\n+IPR:0\r\n\r\nOK\r\n"}, {"AT+IRTS=?\r", "\r\n+IRTS:(0,1)\r\n\r\nOK\r\n"}, /* V.250 6.2.17 - Select synchronous mode RTS option */ {"AT+IRTS?\r", "\r\n+IRTS:0\r\n\r\nOK\r\n"}, {"AT+MA\r", "\r\nOK\r\n"}, /* V.250 6.4.2 - Modulation automode control */ {"AT+MR=?\r", "\r\n+MR:(0,1)\r\n\r\nOK\r\n"}, /* V.250 6.4.3 - Modulation reporting control */ {"AT+MR?\r", "\r\n+MR:0\r\n\r\nOK\r\n"}, {"AT+MS\r", "\r\nOK\r\n"}, /* V.250 6.4.1 - Modulation selection */ {"AT+MSC=?\r", "\r\n+MSC:(0,1)\r\n\r\nOK\r\n"}, /* V.250 6.4.8 - Seamless rate change enable */ {"AT+MSC?\r", "\r\n+MSC:0\r\n\r\nOK\r\n"}, {"AT+MV18AM\r", "\r\nOK\r\n"}, /* V.250 6.4.6 - V.18 answering message editing */ {"AT+MV18P=?\r", "\r\n+MV18P:(2-7)\r\n\r\nOK\r\n"}, /* V.250 6.4.7 - Order of probes */ {"AT+MV18P?\r", "\r\n+MV18P:0\r\n\r\nOK\r\n"}, {"AT+MV18R=?\r", "\r\n+MV18R:(0,1)\r\n\r\nOK\r\n"}, /* V.250 6.4.5 - V.18 reporting control */ {"AT+MV18R?\r", "\r\n+MV18R:0\r\n\r\nOK\r\n"}, {"AT+MV18S\r", "\r\nOK\r\n"}, /* V.250 6.4.4 - V.18 selection */ {"AT+TADR\r", "\r\nOK\r\n"}, /* V.250 6.7.2.9 - Local V.54 address */ {"AT+TAL=?\r", "\r\n+TAL:(0,1),(0,1)\r\n\r\nOK\r\n"}, /* V.250 6.7.2.15 - Local analogue loop */ {"AT+TAL?\r", "\r\n+TAL:0,0\r\n\r\nOK\r\n"}, {"AT+TALS=?\r", "\r\n+TALS:(0-3)\r\n\r\nOK\r\n"}, /* V.250 6.7.2.6 - Analogue loop status */ {"AT+TALS?\r", "\r\n+TALS:0\r\n\r\nOK\r\n"}, {"AT+TDLS=?\r", "\r\n+TDLS:(0-4)\r\n\r\nOK\r\n"}, /* V.250 6.7.2.7 - Local digital loop status */ {"AT+TDLS?\r", "\r\n+TDLS:0\r\n\r\nOK\r\n"}, {"AT+TE140=?\r", "\r\n+TE140:(0,1)\r\n\r\nOK\r\n"}, /* V.250 6.7.2.1 - Enable ckt 140 */ {"AT+TE140?\r", "\r\n+TE140:0\r\n\r\nOK\r\n"}, {"AT+TE141=?\r", "\r\n+TE141:(0,1)\r\n\r\nOK\r\n"}, /* V.250 6.7.2.2 - Enable ckt 141 */ {"AT+TE141?\r", "\r\n+TE141:0\r\n\r\nOK\r\n"}, {"AT+TEPAL=?\r", "\r\n+TEPAL:(0,1)\r\n\r\nOK\r\n"}, /* V.250 6.7.2.5 - Enable front panel analogue loop */ {"AT+TEPAL?\r", "\r\n+TEPAL:0\r\n\r\nOK\r\n"}, {"AT+TEPDL=?\r", "\r\n+TEPDL:(0,1)\r\n\r\nOK\r\n"}, /* V.250 6.7.2.4 - Enable front panel RDL */ {"AT+TEPDL?\r", "\r\n+TEPDL:0\r\n\r\nOK\r\n"}, {"AT+TERDL=?\r", "\r\n+TERDL:(0,1)\r\n\r\nOK\r\n"}, /* V.250 6.7.2.3 - Enable RDL from remote */ {"AT+TERDL?\r", "\r\n+TERDL:0\r\n\r\nOK\r\n"}, {"AT+TLDL=?\r", "\r\n+TLDL:(0,1)\r\n\r\nOK\r\n"}, /* V.250 6.7.2.13 - Local digital loop */ {"AT+TLDL?\r", "\r\n+TLDL:0\r\n\r\nOK\r\n"}, {"AT+TMODE=?\r", "\r\n+TMODE:(0,1)\r\n\r\nOK\r\n"}, /* V.250 6.7.2.10 - Set V.54 mode */ {"AT+TMODE?\r", "\r\n+TMODE:0\r\n\r\nOK\r\n"}, {"AT+TNUM\r", "\r\nOK\r\n"}, /* V.250 6.7.2.12 - Errored bit and block counts */ {"AT+TRDL=?\r", "\r\n+TRDL:(0,1)\r\n\r\nOK\r\n"}, /* V.250 6.7.2.14 - Request remote digital loop */ {"AT+TRDL?\r", "\r\n+TRDL:0\r\n\r\nOK\r\n"}, {"AT+TRDLS\r", "\r\nOK\r\n"}, /* V.250 6.7.2.8 - Remote digital loop status */ {"AT+TRES=?\r", "\r\n+TRES:(0-2)\r\n\r\nOK\r\n"}, /* V.250 6.7.2.17 - Self test result */ {"AT+TRES?\r", "\r\n+TRES:0\r\n\r\nOK\r\n"}, {"AT+TSELF=?\r", "\r\n+TSELF:(0,1)\r\n\r\nOK\r\n"}, /* V.250 6.7.2.16 - Self test */ {"AT+TSELF?\r", "\r\n+TSELF:0\r\n\r\nOK\r\n"}, {"AT+TTER=?\r", "\r\n+TTER:(0-65535),(0-65535)\r\n\r\nOK\r\n"}, /* V.250 6.7.2.11 - Test error rate */ {"AT+TTER?\r", "\r\n+TTER:0,0\r\n\r\nOK\r\n"}, {"AT+VBT\r", "\r\nOK\r\n"}, /* 3GPP TS 27.007 C.2.2 - Buffer threshold setting */ {"AT+VCID=?\r", "\r\n0,1\r\n\r\nOK\r\n"}, /* 3GPP TS 27.007 C.2.3 - Calling number ID presentation */ {"AT+VCID?\r", "\r\n0\r\n\r\nOK\r\n"}, {"AT+VDR\r", "\r\nOK\r\n"}, /* V.253 10.3.1 - Distinctive ring (ring cadence reporting) */ {"AT+VDT\r", "\r\nOK\r\n"}, /* V.253 10.3.2 - Control tone cadence reporting */ {"AT+VDX\r", "\r\nOK\r\n"}, /* V.253 10.5.6 - Speakerphone duplex mode */ {"AT+VEM\r", "\r\nOK\r\n"}, /* V.253 10.5.7 - Deliver event reports */ {"AT+VGM\r", "\r\nOK\r\n"}, /* V.253 10.5.2 - Microphone gain */ {"AT+VGR\r", "\r\nOK\r\n"}, /* V.253 10.2.1 - Receive gain selection */ {"AT+VGS\r", "\r\nOK\r\n"}, /* V.253 10.5.3 - Speaker gain */ {"AT+VGT\r", "\r\nOK\r\n"}, /* V.253 10.2.2 - Volume selection */ {"AT+VIP\r", "\r\nOK\r\n"}, /* V.253 10.1.1 - Initialize voice parameters */ {"AT+VIT\r", "\r\nOK\r\n"}, /* V.253 10.2.3 - DTE/DCE inactivity timer */ {"AT+VLS\r", "\r\nOK\r\n"}, /* V.253 10.2.4 - Analogue source/destination selection */ {"AT+VPP\r", "\r\nOK\r\n"}, /* V.253 10.4.2 - Voice packet protocol */ {"AT+VRA\r", "\r\nOK\r\n"}, /* V.253 10.2.5 - Ringing tone goes away timer */ {"AT+VRID?\r", "\r\n0\r\n\r\nOK\r\n"}, /* Extension - Find the originating and destination numbers */ {"AT+VRL\r", "\r\nOK\r\n"}, /* V.253 10.1.2 - Ring local phone */ {"AT+VRN\r", "\r\nOK\r\n"}, /* V.253 10.2.6 - Ringing tone never appeared timer */ {"AT+VRX\r", "\r\nOK\r\n"}, /* V.253 10.1.3 - Voice receive state */ {"AT+VSD\r", "\r\nOK\r\n"}, /* V.253 10.2.7 - Silence detection (QUIET and SILENCE) */ {"AT+VSID=12345\r", "\r\nOK\r\n"}, /* Extension - Set the originating number */ {"AT+VSID?\r", "\r\n12345\r\n\r\nOK\r\n"}, {"AT+VSM\r", "\r\nOK\r\n"}, /* V.253 10.2.8 - Compression method selection */ {"AT+VSP\r", "\r\nOK\r\n"}, /* V.253 10.5.1 - Voice speakerphone state */ {"AT+VTA\r", "\r\nOK\r\n"}, /* V.253 10.5.4 - Train acoustic echo-canceller */ {"AT+VTD\r", "\r\nOK\r\n"}, /* V.253 10.2.9 - Beep tone duration timer */ {"AT+VTH\r", "\r\nOK\r\n"}, /* V.253 10.5.5 - Train line echo-canceller */ {"AT+VTR\r", "\r\nOK\r\n"}, /* V.253 10.1.4 - Voice duplex state */ {"AT+VTS\r", "\r\nOK\r\n"}, /* V.253 10.1.5 - DTMF and tone generation in voice */ {"AT+VTX\r", "\r\nOK\r\n"}, /* V.253 10.1.6 - Transmit data state */ {"AT+WS46\r", "\r\nOK\r\n"}, /* 3GPP TS 27.007 5.9 - PCCA STD-101 [17] select wireless network */ {"ATA\r", "\r\nERROR\r\n"}, /* V.250 6.3.5 - Answer */ {"ATDT -1234567890ABCDPSTW*#+,!@\r", ""}, /* V.250 6.3.1 - Dial */ {"ATE1\r", "\r\nOK\r\n"}, /* V.250 6.2.4 - Command echo */ {"ATE0\r", "ATE0\r\r\nOK\r\n"}, /* V.250 6.2.4 - Command echo */ {"ATH\r", "\r\nOK\r\n"}, /* V.250 6.3.6 - Hook control */ {"ATI\r", "\r\n" PACKAGE "\r\n\r\nOK\r\n"}, /* V.250 6.1.3 - Request identification information */ {"ATL\r", "\r\nOK\r\n"}, /* V.250 6.3.13 - Monitor speaker loudness */ {"ATM\r", "\r\nOK\r\n"}, /* V.250 6.3.14 - Monitor speaker mode */ {"ATO\r", "\r\nCONNECT\r\n\r\nOK\r\n"}, /* V.250 6.3.7 - Return to online data state */ {"ATP\r", "\r\nOK\r\n"}, /* V.250 6.3.3 - Select pulse dialling (command) */ {"ATQ\r", "\r\nOK\r\n"}, /* V.250 6.2.5 - Result code suppression */ {"ATS0=?\r", "\r\n000\r\n\r\nOK\r\n"}, /* V.250 6.3.8 - Automatic answer */ {"ATS0?\r", "\r\n000\r\n\r\nOK\r\n"}, {"ATS10=?\r", "\r\n000\r\n\r\nOK\r\n"}, /* V.250 6.3.12 - Automatic disconnect delay */ {"ATS10?\r", "\r\n000\r\n\r\nOK\r\n"}, {"ATS3=?\r", "\r\n000\r\n\r\nOK\r\n"}, /* V.250 6.2.1 - Command line termination character */ {"ATS3?\r", "\r\n013\r\n\r\nOK\r\n"}, {"ATS4=?\r", "\r\n000\r\n\r\nOK\r\n"}, /* V.250 6.2.2 - Response formatting character */ {"ATS4?\r", "\r\n010\r\n\r\nOK\r\n"}, {"ATS5=?\r", "\r\n000\r\n\r\nOK\r\n"}, /* V.250 6.2.3 - Command line editing character */ {"ATS5?\r", "\r\n008\r\n\r\nOK\r\n"}, {"ATS6=?\r", "\r\n000\r\n\r\nOK\r\n"}, /* V.250 6.3.9 - Pause before blind dialling */ {"ATS6?\r", "\r\n001\r\n\r\nOK\r\n"}, {"ATS7=?\r", "\r\n000\r\n\r\nOK\r\n"}, /* V.250 6.3.10 - Connection completion timeout */ {"ATS7?\r", "\r\n060\r\n\r\nOK\r\n"}, {"ATS8=?\r", "\r\n000\r\n\r\nOK\r\n"}, /* V.250 6.3.11 - Comma dial modifier time */ {"ATS8?\r", "\r\n005\r\n\r\nOK\r\n"}, {"ATT\r", "\r\nOK\r\n"}, /* V.250 6.3.2 - Select tone dialling (command) */ {"ATV0\r", "0\r"}, /* V.250 6.2.6 - DCE response format */ {"ATV1\r", "\r\nOK\r\n"}, {"ATX4\r", "\r\nOK\r\n"}, /* V.250 6.2.7 - Result code selection and call progress monitoring control */ {"ATZ\r", "\r\nOK\r\n"}, /* V.250 6.1.1 - Reset to default configuration */ {"", ""} }; char *decode_test_file = NULL; int countdown = 0; int command_response_test_step = -1; char response_buf[1000]; int response_buf_ptr = 0; static int at_rx(at_state_t *s, const char *t, int len) { at_interpreter(s, t, len); return 0; } /*- End of function --------------------------------------------------------*/ static int at_send(at_state_t *s, const char *t) { printf("%s", t); at_rx(s, t, strlen(t)); return 0; } /*- End of function --------------------------------------------------------*/ static int at_send_at(at_state_t *s, const char *t) { uint8_t buf[500]; sprintf((char *) buf, "AT%s\r", t); printf("%s", t); at_rx(s, t, strlen(t)); return 0; } /*- End of function --------------------------------------------------------*/ static int at_expect(at_state_t *s, const char *t) { return 0; } /*- End of function --------------------------------------------------------*/ static int at_send_hdlc(at_state_t *s, uint8_t *t, int len) { uint8_t buf[100]; int i; int j; for (i = 0, j = 0; i < len; i++) { if (*t == DLE) buf[j++] = DLE; buf[j++] = *t++; } buf[j++] = DLE; buf[j++] = ETX; at_rx(s, (char *) buf, j); return 0; } /*- End of function --------------------------------------------------------*/ static int general_test(at_state_t *s) { int i; for (i = 0; general_test_seq[i].command[0]; i++) { response_buf_ptr = 0; response_buf[0] = '\0'; command_response_test_step = i; at_send(s, general_test_seq[i].command); if (strcmp(general_test_seq[command_response_test_step].response, response_buf) != 0) { printf("Incorrect response\n"); printf("Expected: '%s'\n", general_test_seq[command_response_test_step].response); printf("Received: '%s'\n", response_buf); return -1; } } return 0; } /*- End of function --------------------------------------------------------*/ static int modem_call_control(at_state_t *s, void *user_data, int op, const char *num) { switch (op) { case AT_MODEM_CONTROL_CALL: printf("\nModem control - Dialing '%s'\n", num); break; case AT_MODEM_CONTROL_ANSWER: printf("\nModem control - Answering\n"); /* Force an error response, so we get something well defined for the test. */ return -1; case AT_MODEM_CONTROL_HANGUP: printf("\nModem control - Hanging up\n"); break; case AT_MODEM_CONTROL_OFFHOOK: printf("\nModem control - Going off hook\n"); break; case AT_MODEM_CONTROL_ONHOOK: printf("\nModem control - Going on hook\n"); break; case AT_MODEM_CONTROL_DTR: printf("\nModem control - DTR %d\n", (int) (intptr_t) num); break; case AT_MODEM_CONTROL_RTS: printf("\nModem control - RTS %d\n", (int) (intptr_t) num); break; case AT_MODEM_CONTROL_CTS: printf("\nModem control - CTS %d\n", (int) (intptr_t) num); break; case AT_MODEM_CONTROL_CAR: printf("\nModem control - CAR %d\n", (int) (intptr_t) num); break; case AT_MODEM_CONTROL_RNG: printf("\nModem control - RNG %d\n", (int) (intptr_t) num); break; case AT_MODEM_CONTROL_DSR: printf("\nModem control - DSR %d\n", (int) (intptr_t) num); break; case AT_MODEM_CONTROL_SETID: printf("\nModem control - Set ID '%s'\n", num); break; case AT_MODEM_CONTROL_RESTART: printf("\nModem control - Restart %d\n", (int) (intptr_t) num); break; case AT_MODEM_CONTROL_DTE_TIMEOUT: printf("\nModem control - Set DTE timeout %d\n", (int) (intptr_t) num); break; default: printf("\nModem control - operation %d\n", op); break; } /*endswitch*/ return 0; } /*- End of function --------------------------------------------------------*/ static int at_tx_handler(at_state_t *s, void *user_data, const uint8_t *buf, size_t len) { int i; for (i = 0; i < len; i++) { response_buf[response_buf_ptr++] = buf[i]; putchar(buf[i]); } response_buf[response_buf_ptr] = '\0'; return 0; } /*- End of function --------------------------------------------------------*/ int main(int argc, char *argv[]) { at_state_t at_state; if (at_init(&at_state, at_tx_handler, NULL, modem_call_control, NULL) == NULL) { fprintf(stderr, "Cannot start the AT interpreter\n"); exit(2); } if (general_test(&at_state)) { printf("Tests failed.\n"); exit(2); } printf("Tests passed.\n"); return 0; } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/tests/g726_tests.c0000644000175000017500000012032711150047203020304 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * g726_tests.c - Test G.726 encode and decode. * * Written by Steve Underwood * * Copyright (C) 2006 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2, as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: g726_tests.c,v 1.24 2008/05/13 13:17:25 steveu Exp $ */ /*! \file */ /*! \page g726_tests_page G.726 tests \section g726_tests_page_sec_1 What does it do? Two sets of tests are performed: - The tests defined in the G.726 specification, using the test data files supplied with the specification. - A generally audio quality test, consisting of compressing and decompressing a speeech file for audible comparison. The speech file should be recorded at 16 bits/sample, 8000 samples/second, and named "pre_g726.wav". \section g726_tests_page_sec_2 How is it used? To perform the tests in the G.726 specification you need to obtain the test data files from the specification. These are copyright material, and so cannot be distributed with this test software. The files, containing test vectors, which are supplied with the G.726 specification, should be copied to itutests/g726 so the files are arranged in the same directory heirarchy in which they are supplied. That is, you should have file names like - itutests/g726/DISK1/INPUT/NRM.M - itutests/g726/DISK1/INPUT/OVR.M - itutests/g726/DISK2/INPUT/NRM.A - itutests/g726/DISK2/INPUT/OVR.A in your source tree. The ITU tests can then be run by executing g726_tests without any parameters. To perform a general audio quality test, g726_tests should be run with a parameter specifying the required bit rate for compression. The valid parameters are "-16", "-24", "-32", and "-40". The test file ../test-data/local/short_nb_voice.wav will be compressed to the specified bit rate, decompressed, and the resulting audio stored in post_g726.wav. */ #if defined(HAVE_CONFIG_H) #include #endif #include #include #include #include #include #include #include #include "spandsp.h" #define BLOCK_LEN 320 #define MAX_TEST_VECTOR_LEN 40000 #define TESTDATA_DIR "../test-data/itu/g726/" #define IN_FILE_NAME "../test-data/local/short_nb_voice.wav" #define OUT_FILE_NAME "post_g726.wav" int16_t outdata[MAX_TEST_VECTOR_LEN]; uint8_t adpcmdata[MAX_TEST_VECTOR_LEN]; int16_t itudata[MAX_TEST_VECTOR_LEN]; uint8_t itu_ref[MAX_TEST_VECTOR_LEN]; uint8_t unpacked[MAX_TEST_VECTOR_LEN]; uint8_t xlaw[MAX_TEST_VECTOR_LEN]; /* Table 4 - V Reset and homing sequences for u-law Normal I-input Overload Algorithm Input Intermediate Output Input Output Input Intermediate Output (PCM) (ADPCM) (PCM) (ADPCM) (PCM) (PCM) (ADPCM) (PCM) 16F NRM.M RN16FM.I RN16FM.O I16 RI16FM.O OVR.M RV16FM.I RV16FM.O HN16FM.I HN16FM.O HI16FM.O HV16FM.I HV16FM.O 24F NRM.M RN24FM.I RN24FM.O I24 RI24FM.O OVR.M RV24FM.I RV24FM.O HN24FM.I HN24FM.O HI24FM.O HV24FM.I HV24FM.O 32F NRM.M RN32FM.I RN32FM.O I32 RI32FM.O OVR.M RV32FM.I RV32FM.O HN32FM.I HN32FM.O HI32FM.O HV32FM.I HV32FM.O 40F NRM.M RN40FM.I RN40FM.O I40 RI40FM.O OVR.M RV40FM.I RV40FM.O HN40FM.I HN40FM.O HI40FM.O HV40FM.I HV40FM.O Table 5 - V Reset and homing sequences for A-law Normal I-input Overload Algorithm Input Intermediate Output Input Output Input Intermediate Output (PCM) (ADPCM) (PCM) (ADPCM) (PCM) (PCM) (ADPCM) (PCM) 16F NRM.A RN16FA.I RN16FA.O I16 RI16FA.O OVR.A RV16FA.I RV16FA.O HN16FA.I HN16FA.O HI16FA.O HV16FA.I HV16FA.O 24F NRM.A RN24FA.I RN24FA.O I24 RI24FA.O OVR.A RV24FA.I RV24FA.O HN24FA.I HN24FA.O HI24FA.O HV24FA.I HV24FA.O 32F NRM.A RN32FA.I RN32FA.O I32 RI32FA.O OVR.A RV32FA.I RV32FA.O HN32FA.I HN32FA.O HI32FA.O HV32FA.I HV32FA.O 40F NRM.A RN40FA.I RN40FA.O I40 RI40FA.O OVR.A RV40FA.I RV40FA.O HN40FA.I HN40FA.O HI40FA.O HV40FA.I HV40FA.O Table 6 ¡V Reset and homing cross sequences for u-law -> A-law Normal Overload Algorithm Input Intermediate Output Input Intermediate Output (PCM) (ADPCM) (PCM) (PCM) (ADPCM) (PCM) 16F NRM.M RN16FM.I RN16FC.O OVR.M RV16FM.I RV16FC.O HN16FM.I HN16FC.O HV16FM.I HV16FC.O 24F NRM.M RN24FM.I RN24FC.O OVR.M RV24FM.I RV24FC.O HN24FM.I HN24FC.O HV24FM.I HV24FC.O 32F NRM.M RN32FM.I RN32FC.O OVR.M RV32FM.I RV32FC.O HN32FM.I HN32FC.O HV32FM.I HV32FC.O 40F NRM.M RN40FM.I RN40FC.O OVR.M RV40FM.I RV40FC.O HN40FM.I HN40FC.O HV40FM.I HV40FC.O Table 7 ¡V Reset and homing cross sequences for A-law -> u-law Normal Overload Algorithm Input Intermediate Output Input Intermediate Output (PCM) (ADPCM) (PCM) (PCM) (ADPCM) (PCM) 16F NRM.A RN16FA.I RN16FX.O OVR.A RV16FA.I RV16FX.O HN16FA.I HN16FX.O HV16FA.I HV16FX.O 24F NRM.A RN24FA.I RN24FX.O OVR.A RV24FA.I RV24FX.O HN24FA.I HN24FX.O HV24FA.I HV24FX.O 32F NRM.A RN32FA.I RN32FX.O OVR.A RV32FA.I RV32FX.O HN32FA.I HN32FX.O HV32FA.I HV32FX.O 40F NRM.A RN40FA.I RN40FX.O OVR.A RV40FA.I RV40FX.O HN40FA.I HN40FX.O HV40FA.I HV40FX.O */ #define G726_ENCODING_NONE 9999 typedef struct { const char *conditioning_pcm_file; const char *pcm_file; const char *conditioning_adpcm_file; const char *adpcm_file; const char *output_file; int rate; int compression_law; int decompression_law; } test_set_t; static test_set_t itu_test_sets[] = { /* u-law to u-law tests */ { "", TESTDATA_DIR "DISK1/INPUT/NRM.M", "", TESTDATA_DIR "DISK1/RESET/16/RN16FM.I", TESTDATA_DIR "DISK1/RESET/16/RN16FM.O", 16000, G726_ENCODING_ULAW, G726_ENCODING_ULAW }, { "", "", "", TESTDATA_DIR "DISK1/INPUT/I16", TESTDATA_DIR "DISK1/RESET/16/RI16FM.O", 16000, G726_ENCODING_NONE, G726_ENCODING_ULAW }, { "", TESTDATA_DIR "DISK1/INPUT/OVR.M", "", TESTDATA_DIR "DISK1/RESET/16/RV16FM.I", TESTDATA_DIR "DISK1/RESET/16/RV16FM.O", 16000, G726_ENCODING_ULAW, G726_ENCODING_ULAW }, { "", TESTDATA_DIR "DISK1/INPUT/NRM.M", "", TESTDATA_DIR "DISK1/RESET/24/RN24FM.I", TESTDATA_DIR "DISK1/RESET/24/RN24FM.O", 24000, G726_ENCODING_ULAW, G726_ENCODING_ULAW }, { "", "", "", TESTDATA_DIR "DISK1/INPUT/I24", TESTDATA_DIR "DISK1/RESET/24/RI24FM.O", 24000, G726_ENCODING_NONE, G726_ENCODING_ULAW }, { "", TESTDATA_DIR "DISK1/INPUT/OVR.M", "", TESTDATA_DIR "DISK1/RESET/24/RV24FM.I", TESTDATA_DIR "DISK1/RESET/24/RV24FM.O", 24000, G726_ENCODING_ULAW, G726_ENCODING_ULAW }, { "", TESTDATA_DIR "DISK1/INPUT/NRM.M", "", TESTDATA_DIR "DISK1/RESET/32/RN32FM.I", TESTDATA_DIR "DISK1/RESET/32/RN32FM.O", 32000, G726_ENCODING_ULAW, G726_ENCODING_ULAW }, { "", "", "", TESTDATA_DIR "DISK1/INPUT/I32", TESTDATA_DIR "DISK1/RESET/32/RI32FM.O", 32000, G726_ENCODING_NONE, G726_ENCODING_ULAW }, { "", TESTDATA_DIR "DISK1/INPUT/OVR.M", "", TESTDATA_DIR "DISK1/RESET/32/RV32FM.I", TESTDATA_DIR "DISK1/RESET/32/RV32FM.O", 32000, G726_ENCODING_ULAW, G726_ENCODING_ULAW }, { "", TESTDATA_DIR "DISK1/INPUT/NRM.M", "", TESTDATA_DIR "DISK1/RESET/40/RN40FM.I", TESTDATA_DIR "DISK1/RESET/40/RN40FM.O", 40000, G726_ENCODING_ULAW, G726_ENCODING_ULAW }, { "", "", "", TESTDATA_DIR "DISK1/INPUT/I40", TESTDATA_DIR "DISK1/RESET/40/RI40FM.O", 40000, G726_ENCODING_NONE, G726_ENCODING_ULAW }, { "", TESTDATA_DIR "DISK1/INPUT/OVR.M", "", TESTDATA_DIR "DISK1/RESET/40/RV40FM.I", TESTDATA_DIR "DISK1/RESET/40/RV40FM.O", 40000, G726_ENCODING_ULAW, G726_ENCODING_ULAW }, /* A-law to A-law tests */ { "", TESTDATA_DIR "DISK2/INPUT/NRM.A", "", TESTDATA_DIR "DISK2/RESET/16/RN16FA.I", TESTDATA_DIR "DISK2/RESET/16/RN16FA.O", 16000, G726_ENCODING_ALAW, G726_ENCODING_ALAW }, { "", "", "", TESTDATA_DIR "DISK2/INPUT/I16", TESTDATA_DIR "DISK2/RESET/16/RI16FA.O", 16000, G726_ENCODING_NONE, G726_ENCODING_ALAW }, { "", TESTDATA_DIR "DISK2/INPUT/OVR.A", "", TESTDATA_DIR "DISK2/RESET/16/RV16FA.I", TESTDATA_DIR "DISK2/RESET/16/RV16FA.O", 16000, G726_ENCODING_ALAW, G726_ENCODING_ALAW }, { "", TESTDATA_DIR "DISK2/INPUT/NRM.A", "", TESTDATA_DIR "DISK2/RESET/24/RN24FA.I", TESTDATA_DIR "DISK2/RESET/24/RN24FA.O", 24000, G726_ENCODING_ALAW, G726_ENCODING_ALAW }, { "", "", "", TESTDATA_DIR "DISK2/INPUT/I24", TESTDATA_DIR "DISK2/RESET/24/RI24FA.O", 24000, G726_ENCODING_NONE, G726_ENCODING_ALAW }, { "", TESTDATA_DIR "DISK2/INPUT/OVR.A", "", TESTDATA_DIR "DISK2/RESET/24/RV24FA.I", TESTDATA_DIR "DISK2/RESET/24/RV24FA.O", 24000, G726_ENCODING_ALAW, G726_ENCODING_ALAW }, { "", TESTDATA_DIR "DISK2/INPUT/NRM.A", "", TESTDATA_DIR "DISK2/RESET/32/RN32FA.I", TESTDATA_DIR "DISK2/RESET/32/RN32FA.O", 32000, G726_ENCODING_ALAW, G726_ENCODING_ALAW }, { "", "", "", TESTDATA_DIR "DISK2/INPUT/I32", TESTDATA_DIR "DISK2/RESET/32/RI32FA.O", 32000, G726_ENCODING_NONE, G726_ENCODING_ALAW }, { "", TESTDATA_DIR "DISK2/INPUT/OVR.A", "", TESTDATA_DIR "DISK2/RESET/32/RV32FA.I", TESTDATA_DIR "DISK2/RESET/32/RV32FA.O", 32000, G726_ENCODING_ALAW, G726_ENCODING_ALAW }, { "", TESTDATA_DIR "DISK2/INPUT/NRM.A", "", TESTDATA_DIR "DISK2/RESET/40/RN40FA.I", TESTDATA_DIR "DISK2/RESET/40/RN40FA.O", 40000, G726_ENCODING_ALAW, G726_ENCODING_ALAW }, { "", "", "", TESTDATA_DIR "DISK2/INPUT/I40", TESTDATA_DIR "DISK2/RESET/40/RI40FA.O", 40000, G726_ENCODING_NONE, G726_ENCODING_ALAW }, { "", TESTDATA_DIR "DISK2/INPUT/OVR.A", "", TESTDATA_DIR "DISK2/RESET/40/RV40FA.I", TESTDATA_DIR "DISK2/RESET/40/RV40FA.O", 40000, G726_ENCODING_ALAW, G726_ENCODING_ALAW }, /* u-law to A-law tests */ { "", TESTDATA_DIR "DISK1/INPUT/NRM.M", "", TESTDATA_DIR "DISK1/RESET/16/RN16FM.I", TESTDATA_DIR "DISK1/RESET/16/RN16FC.O", 16000, G726_ENCODING_ULAW, G726_ENCODING_ALAW }, { "", TESTDATA_DIR "DISK1/INPUT/OVR.M", "", TESTDATA_DIR "DISK1/RESET/16/RV16FM.I", TESTDATA_DIR "DISK1/RESET/16/RV16FC.O", 16000, G726_ENCODING_ULAW, G726_ENCODING_ALAW }, { "", TESTDATA_DIR "DISK1/INPUT/NRM.M", "", TESTDATA_DIR "DISK1/RESET/24/RN24FM.I", TESTDATA_DIR "DISK1/RESET/24/RN24FC.O", 24000, G726_ENCODING_ULAW, G726_ENCODING_ALAW }, { "", TESTDATA_DIR "DISK1/INPUT/OVR.M", "", TESTDATA_DIR "DISK1/RESET/24/RV24FM.I", TESTDATA_DIR "DISK1/RESET/24/RV24FC.O", 24000, G726_ENCODING_ULAW, G726_ENCODING_ALAW }, { "", TESTDATA_DIR "DISK1/INPUT/NRM.M", "", TESTDATA_DIR "DISK1/RESET/32/RN32FM.I", TESTDATA_DIR "DISK1/RESET/32/RN32FC.O", 32000, G726_ENCODING_ULAW, G726_ENCODING_ALAW }, { "", TESTDATA_DIR "DISK1/INPUT/OVR.M", "", TESTDATA_DIR "DISK1/RESET/32/RV32FM.I", TESTDATA_DIR "DISK1/RESET/32/RV32FC.O", 32000, G726_ENCODING_ULAW, G726_ENCODING_ALAW }, { "", TESTDATA_DIR "DISK1/INPUT/NRM.M", "", TESTDATA_DIR "DISK1/RESET/40/RN40FM.I", TESTDATA_DIR "DISK1/RESET/40/RN40FC.O", 40000, G726_ENCODING_ULAW, G726_ENCODING_ALAW }, { "", TESTDATA_DIR "DISK1/INPUT/OVR.M", "", TESTDATA_DIR "DISK1/RESET/40/RV40FM.I", TESTDATA_DIR "DISK1/RESET/40/RV40FC.O", 40000, G726_ENCODING_ULAW, G726_ENCODING_ALAW }, /* A-law to u-law tests */ { "", TESTDATA_DIR "DISK2/INPUT/NRM.A", "", TESTDATA_DIR "DISK2/RESET/16/RN16FA.I", TESTDATA_DIR "DISK2/RESET/16/RN16FX.O", 16000, G726_ENCODING_ALAW, G726_ENCODING_ULAW }, { "", TESTDATA_DIR "DISK2/INPUT/OVR.A", "", TESTDATA_DIR "DISK2/RESET/16/RV16FA.I", TESTDATA_DIR "DISK2/RESET/16/RV16FX.O", 16000, G726_ENCODING_ALAW, G726_ENCODING_ULAW }, { "", TESTDATA_DIR "DISK2/INPUT/NRM.A", "", TESTDATA_DIR "DISK2/RESET/24/RN24FA.I", TESTDATA_DIR "DISK2/RESET/24/RN24FX.O", 24000, G726_ENCODING_ALAW, G726_ENCODING_ULAW }, { "", TESTDATA_DIR "DISK2/INPUT/OVR.A", "", TESTDATA_DIR "DISK2/RESET/24/RV24FA.I", TESTDATA_DIR "DISK2/RESET/24/RV24FX.O", 24000, G726_ENCODING_ALAW, G726_ENCODING_ULAW }, { "", TESTDATA_DIR "DISK2/INPUT/NRM.A", "", TESTDATA_DIR "DISK2/RESET/32/RN32FA.I", TESTDATA_DIR "DISK2/RESET/32/RN32FX.O", 32000, G726_ENCODING_ALAW, G726_ENCODING_ULAW }, { "", TESTDATA_DIR "DISK2/INPUT/OVR.A", "", TESTDATA_DIR "DISK2/RESET/32/RV32FA.I", TESTDATA_DIR "DISK2/RESET/32/RV32FX.O", 32000, G726_ENCODING_ALAW, G726_ENCODING_ULAW }, { "", TESTDATA_DIR "DISK2/INPUT/NRM.A", "", TESTDATA_DIR "DISK2/RESET/40/RN40FA.I", TESTDATA_DIR "DISK2/RESET/40/RN40FX.O", 40000, G726_ENCODING_ALAW, G726_ENCODING_ULAW }, { "", TESTDATA_DIR "DISK2/INPUT/OVR.A", "", TESTDATA_DIR "DISK2/RESET/40/RV40FA.I", TESTDATA_DIR "DISK2/RESET/40/RV40FX.O", 40000, G726_ENCODING_ALAW, G726_ENCODING_ULAW }, /* u-law to u-law tests */ { TESTDATA_DIR "DISK1/PCM_INIT.M", TESTDATA_DIR "DISK1/INPUT/NRM.M", TESTDATA_DIR "DISK1/HOMING/16/I_INI_16.M", TESTDATA_DIR "DISK1/HOMING/16/HN16FM.I", TESTDATA_DIR "DISK1/HOMING/16/HN16FM.O", 16000, G726_ENCODING_ULAW, G726_ENCODING_ULAW }, { "", "", TESTDATA_DIR "DISK1/HOMING/16/I_INI_16.M", TESTDATA_DIR "DISK1/INPUT/I16", TESTDATA_DIR "DISK1/HOMING/16/HI16FM.O", 16000, G726_ENCODING_NONE, G726_ENCODING_ULAW }, { TESTDATA_DIR "DISK1/PCM_INIT.M", TESTDATA_DIR "DISK1/INPUT/OVR.M", TESTDATA_DIR "DISK1/HOMING/16/I_INI_16.M", TESTDATA_DIR "DISK1/HOMING/16/HV16FM.I", TESTDATA_DIR "DISK1/HOMING/16/HV16FM.O", 16000, G726_ENCODING_ULAW, G726_ENCODING_ULAW }, { TESTDATA_DIR "DISK1/PCM_INIT.M", TESTDATA_DIR "DISK1/INPUT/NRM.M", TESTDATA_DIR "DISK1/HOMING/24/I_INI_24.M", TESTDATA_DIR "DISK1/HOMING/24/HN24FM.I", TESTDATA_DIR "DISK1/HOMING/24/HN24FM.O", 24000, G726_ENCODING_ULAW, G726_ENCODING_ULAW }, { "", "", TESTDATA_DIR "DISK1/HOMING/24/I_INI_24.M", TESTDATA_DIR "DISK1/INPUT/I24", TESTDATA_DIR "DISK1/HOMING/24/HI24FM.O", 24000, G726_ENCODING_NONE, G726_ENCODING_ULAW }, { TESTDATA_DIR "DISK1/PCM_INIT.M", TESTDATA_DIR "DISK1/INPUT/OVR.M", TESTDATA_DIR "DISK1/HOMING/24/I_INI_24.M", TESTDATA_DIR "DISK1/HOMING/24/HV24FM.I", TESTDATA_DIR "DISK1/HOMING/24/HV24FM.O", 24000, G726_ENCODING_ULAW, G726_ENCODING_ULAW }, { TESTDATA_DIR "DISK1/PCM_INIT.M", TESTDATA_DIR "DISK1/INPUT/NRM.M", TESTDATA_DIR "DISK1/HOMING/32/I_INI_32.M", TESTDATA_DIR "DISK1/HOMING/32/HN32FM.I", TESTDATA_DIR "DISK1/HOMING/32/HN32FM.O", 32000, G726_ENCODING_ULAW, G726_ENCODING_ULAW }, { "", "", TESTDATA_DIR "DISK1/HOMING/32/I_INI_32.M", TESTDATA_DIR "DISK1/INPUT/I32", TESTDATA_DIR "DISK1/HOMING/32/HI32FM.O", 32000, G726_ENCODING_NONE, G726_ENCODING_ULAW }, { TESTDATA_DIR "DISK1/PCM_INIT.M", TESTDATA_DIR "DISK1/INPUT/OVR.M", TESTDATA_DIR "DISK1/HOMING/32/I_INI_32.M", TESTDATA_DIR "DISK1/HOMING/32/HV32FM.I", TESTDATA_DIR "DISK1/HOMING/32/HV32FM.O", 32000, G726_ENCODING_ULAW, G726_ENCODING_ULAW }, { TESTDATA_DIR "DISK1/PCM_INIT.M", TESTDATA_DIR "DISK1/INPUT/NRM.M", TESTDATA_DIR "DISK1/HOMING/40/I_INI_40.M", TESTDATA_DIR "DISK1/HOMING/40/HN40FM.I", TESTDATA_DIR "DISK1/HOMING/40/HN40FM.O", 40000, G726_ENCODING_ULAW, G726_ENCODING_ULAW }, { "", "", TESTDATA_DIR "DISK1/HOMING/40/I_INI_40.M", TESTDATA_DIR "DISK1/INPUT/I40", TESTDATA_DIR "DISK1/HOMING/40/HI40FM.O", 40000, G726_ENCODING_NONE, G726_ENCODING_ULAW }, { TESTDATA_DIR "DISK1/PCM_INIT.M", TESTDATA_DIR "DISK1/INPUT/OVR.M", TESTDATA_DIR "DISK1/HOMING/40/I_INI_40.M", TESTDATA_DIR "DISK1/HOMING/40/HV40FM.I", TESTDATA_DIR "DISK1/HOMING/40/HV40FM.O", 40000, G726_ENCODING_ULAW, G726_ENCODING_ULAW }, /* A-law to A-law tests */ { TESTDATA_DIR "DISK2/PCM_INIT.A", TESTDATA_DIR "DISK2/INPUT/NRM.A", TESTDATA_DIR "DISK2/HOMING/16/I_INI_16.A", TESTDATA_DIR "DISK2/HOMING/16/HN16FA.I", TESTDATA_DIR "DISK2/HOMING/16/HN16FA.O", 16000, G726_ENCODING_ALAW, G726_ENCODING_ALAW }, { "", "", TESTDATA_DIR "DISK2/HOMING/16/I_INI_16.A", TESTDATA_DIR "DISK2/INPUT/I16", TESTDATA_DIR "DISK2/HOMING/16/HI16FA.O", 16000, G726_ENCODING_NONE, G726_ENCODING_ALAW }, { TESTDATA_DIR "DISK2/PCM_INIT.A", TESTDATA_DIR "DISK2/INPUT/OVR.A", TESTDATA_DIR "DISK2/HOMING/16/I_INI_16.A", TESTDATA_DIR "DISK2/HOMING/16/HV16FA.I", TESTDATA_DIR "DISK2/HOMING/16/HV16FA.O", 16000, G726_ENCODING_ALAW, G726_ENCODING_ALAW }, { TESTDATA_DIR "DISK2/PCM_INIT.A", TESTDATA_DIR "DISK2/INPUT/NRM.A", TESTDATA_DIR "DISK2/HOMING/24/I_INI_24.A", TESTDATA_DIR "DISK2/HOMING/24/HN24FA.I", TESTDATA_DIR "DISK2/HOMING/24/HN24FA.O", 24000, G726_ENCODING_ALAW, G726_ENCODING_ALAW }, { "", "", TESTDATA_DIR "DISK2/HOMING/24/I_INI_24.A", TESTDATA_DIR "DISK2/INPUT/I24", TESTDATA_DIR "DISK2/HOMING/24/HI24FA.O", 24000, G726_ENCODING_NONE, G726_ENCODING_ALAW }, { TESTDATA_DIR "DISK2/PCM_INIT.A", TESTDATA_DIR "DISK2/INPUT/OVR.A", TESTDATA_DIR "DISK2/HOMING/24/I_INI_24.A", TESTDATA_DIR "DISK2/HOMING/24/HV24FA.I", TESTDATA_DIR "DISK2/HOMING/24/HV24FA.O", 24000, G726_ENCODING_ALAW, G726_ENCODING_ALAW }, { TESTDATA_DIR "DISK2/PCM_INIT.A", TESTDATA_DIR "DISK2/INPUT/NRM.A", TESTDATA_DIR "DISK2/HOMING/32/I_INI_32.A", TESTDATA_DIR "DISK2/HOMING/32/HN32FA.I", TESTDATA_DIR "DISK2/HOMING/32/HN32FA.O", 32000, G726_ENCODING_ALAW, G726_ENCODING_ALAW }, { "", "", TESTDATA_DIR "DISK2/HOMING/32/I_INI_32.A", TESTDATA_DIR "DISK2/INPUT/I32", TESTDATA_DIR "DISK2/HOMING/32/HI32FA.O", 32000, G726_ENCODING_NONE, G726_ENCODING_ALAW }, { TESTDATA_DIR "DISK2/PCM_INIT.A", TESTDATA_DIR "DISK2/INPUT/OVR.A", TESTDATA_DIR "DISK2/HOMING/32/I_INI_32.A", TESTDATA_DIR "DISK2/HOMING/32/HV32FA.I", TESTDATA_DIR "DISK2/HOMING/32/HV32FA.O", 32000, G726_ENCODING_ALAW, G726_ENCODING_ALAW }, { TESTDATA_DIR "DISK2/PCM_INIT.A", TESTDATA_DIR "DISK2/INPUT/NRM.A", TESTDATA_DIR "DISK2/HOMING/40/I_INI_40.A", TESTDATA_DIR "DISK2/HOMING/40/HN40FA.I", TESTDATA_DIR "DISK2/HOMING/40/HN40FA.O", 40000, G726_ENCODING_ALAW, G726_ENCODING_ALAW }, { "", "", TESTDATA_DIR "DISK2/HOMING/40/I_INI_40.A", TESTDATA_DIR "DISK2/INPUT/I40", TESTDATA_DIR "DISK2/HOMING/40/HI40FA.O", 40000, G726_ENCODING_NONE, G726_ENCODING_ALAW }, { TESTDATA_DIR "DISK2/PCM_INIT.A", TESTDATA_DIR "DISK2/INPUT/OVR.A", TESTDATA_DIR "DISK2/HOMING/40/I_INI_40.A", TESTDATA_DIR "DISK2/HOMING/40/HV40FA.I", TESTDATA_DIR "DISK2/HOMING/40/HV40FA.O", 40000, G726_ENCODING_ALAW, G726_ENCODING_ALAW }, /* u-law to A-law tests */ { TESTDATA_DIR "DISK1/PCM_INIT.M", TESTDATA_DIR "DISK1/INPUT/NRM.M", TESTDATA_DIR "DISK2/HOMING/16/I_INI_16.A", TESTDATA_DIR "DISK1/HOMING/16/HN16FM.I", TESTDATA_DIR "DISK1/HOMING/16/HN16FC.O", 16000, G726_ENCODING_ULAW, G726_ENCODING_ALAW }, { TESTDATA_DIR "DISK1/PCM_INIT.M", TESTDATA_DIR "DISK1/INPUT/OVR.M", TESTDATA_DIR "DISK2/HOMING/16/I_INI_16.A", TESTDATA_DIR "DISK1/HOMING/16/HV16FM.I", TESTDATA_DIR "DISK1/HOMING/16/HV16FC.O", 16000, G726_ENCODING_ULAW, G726_ENCODING_ALAW }, { TESTDATA_DIR "DISK1/PCM_INIT.M", TESTDATA_DIR "DISK1/INPUT/NRM.M", TESTDATA_DIR "DISK2/HOMING/24/I_INI_24.A", TESTDATA_DIR "DISK1/HOMING/24/HN24FM.I", TESTDATA_DIR "DISK1/HOMING/24/HN24FC.O", 24000, G726_ENCODING_ULAW, G726_ENCODING_ALAW }, { TESTDATA_DIR "DISK1/PCM_INIT.M", TESTDATA_DIR "DISK1/INPUT/OVR.M", TESTDATA_DIR "DISK2/HOMING/24/I_INI_24.A", TESTDATA_DIR "DISK1/HOMING/24/HV24FM.I", TESTDATA_DIR "DISK1/HOMING/24/HV24FC.O", 24000, G726_ENCODING_ULAW, G726_ENCODING_ALAW }, { TESTDATA_DIR "DISK1/PCM_INIT.M", TESTDATA_DIR "DISK1/INPUT/NRM.M", TESTDATA_DIR "DISK2/HOMING/32/I_INI_32.A", TESTDATA_DIR "DISK1/HOMING/32/HN32FM.I", TESTDATA_DIR "DISK1/HOMING/32/HN32FC.O", 32000, G726_ENCODING_ULAW, G726_ENCODING_ALAW }, { TESTDATA_DIR "DISK1/PCM_INIT.M", TESTDATA_DIR "DISK1/INPUT/OVR.M", TESTDATA_DIR "DISK2/HOMING/32/I_INI_32.A", TESTDATA_DIR "DISK1/HOMING/32/HV32FM.I", TESTDATA_DIR "DISK1/HOMING/32/HV32FC.O", 32000, G726_ENCODING_ULAW, G726_ENCODING_ALAW }, { TESTDATA_DIR "DISK1/PCM_INIT.M", TESTDATA_DIR "DISK1/INPUT/NRM.M", TESTDATA_DIR "DISK2/HOMING/40/I_INI_40.A", TESTDATA_DIR "DISK1/HOMING/40/HN40FM.I", TESTDATA_DIR "DISK1/HOMING/40/HN40FC.O", 40000, G726_ENCODING_ULAW, G726_ENCODING_ALAW }, { TESTDATA_DIR "DISK1/PCM_INIT.M", TESTDATA_DIR "DISK1/INPUT/OVR.M", TESTDATA_DIR "DISK2/HOMING/40/I_INI_40.A", TESTDATA_DIR "DISK1/HOMING/40/HV40FM.I", TESTDATA_DIR "DISK1/HOMING/40/HV40FC.O", 40000, G726_ENCODING_ULAW, G726_ENCODING_ALAW }, /* A-law to u-law tests */ { TESTDATA_DIR "DISK2/PCM_INIT.A", TESTDATA_DIR "DISK2/INPUT/NRM.A", TESTDATA_DIR "DISK1/HOMING/16/I_INI_16.M", TESTDATA_DIR "DISK2/HOMING/16/HN16FA.I", TESTDATA_DIR "DISK2/HOMING/16/HN16FX.O", 16000, G726_ENCODING_ALAW, G726_ENCODING_ULAW }, { TESTDATA_DIR "DISK2/PCM_INIT.A", TESTDATA_DIR "DISK2/INPUT/OVR.A", TESTDATA_DIR "DISK1/HOMING/16/I_INI_16.M", TESTDATA_DIR "DISK2/HOMING/16/HV16FA.I", TESTDATA_DIR "DISK2/HOMING/16/HV16FX.O", 16000, G726_ENCODING_ALAW, G726_ENCODING_ULAW }, { TESTDATA_DIR "DISK2/PCM_INIT.A", TESTDATA_DIR "DISK2/INPUT/NRM.A", TESTDATA_DIR "DISK1/HOMING/24/I_INI_24.M", TESTDATA_DIR "DISK2/HOMING/24/HN24FA.I", TESTDATA_DIR "DISK2/HOMING/24/HN24FX.O", 24000, G726_ENCODING_ALAW, G726_ENCODING_ULAW }, { TESTDATA_DIR "DISK2/PCM_INIT.A", TESTDATA_DIR "DISK2/INPUT/OVR.A", TESTDATA_DIR "DISK1/HOMING/24/I_INI_24.M", TESTDATA_DIR "DISK2/HOMING/24/HV24FA.I", TESTDATA_DIR "DISK2/HOMING/24/HV24FX.O", 24000, G726_ENCODING_ALAW, G726_ENCODING_ULAW }, { TESTDATA_DIR "DISK2/PCM_INIT.A", TESTDATA_DIR "DISK2/INPUT/NRM.A", TESTDATA_DIR "DISK1/HOMING/32/I_INI_32.M", TESTDATA_DIR "DISK2/HOMING/32/HN32FA.I", TESTDATA_DIR "DISK2/HOMING/32/HN32FX.O", 32000, G726_ENCODING_ALAW, G726_ENCODING_ULAW }, { TESTDATA_DIR "DISK2/PCM_INIT.A", TESTDATA_DIR "DISK2/INPUT/OVR.A", TESTDATA_DIR "DISK1/HOMING/32/I_INI_32.M", TESTDATA_DIR "DISK2/HOMING/32/HV32FA.I", TESTDATA_DIR "DISK2/HOMING/32/HV32FX.O", 32000, G726_ENCODING_ALAW, G726_ENCODING_ULAW }, { TESTDATA_DIR "DISK2/PCM_INIT.A", TESTDATA_DIR "DISK2/INPUT/NRM.A", TESTDATA_DIR "DISK1/HOMING/40/I_INI_40.M", TESTDATA_DIR "DISK2/HOMING/40/HN40FA.I", TESTDATA_DIR "DISK2/HOMING/40/HN40FX.O", 40000, G726_ENCODING_ALAW, G726_ENCODING_ULAW }, { TESTDATA_DIR "DISK2/PCM_INIT.A", TESTDATA_DIR "DISK2/INPUT/OVR.A", TESTDATA_DIR "DISK1/HOMING/40/I_INI_40.M", TESTDATA_DIR "DISK2/HOMING/40/HV40FA.I", TESTDATA_DIR "DISK2/HOMING/40/HV40FX.O", 40000, G726_ENCODING_ALAW, G726_ENCODING_ULAW }, { NULL, NULL, NULL, NULL, NULL, 0, 0, 0 } }; static int hex_get(char *s) { int i; int value; int x; for (value = i = 0; i < 2; i++) { x = *s++ - 0x30; if (x > 9) x -= 0x07; if (x > 15) x -= 0x20; if (x < 0 || x > 15) return -1; value <<= 4; value |= x; } return value; } /*- End of function --------------------------------------------------------*/ static int get_vector(FILE *file, uint8_t vec[]) { char buf[132 + 1]; char *s; int i; int value; while (fgets(buf, 133, file)) { s = buf; i = 0; while ((value = hex_get(s)) >= 0) { vec[i++] = value; s += 2; } return i; } return 0; } /*- End of function --------------------------------------------------------*/ static int get_test_vector(const char *file, uint8_t buf[], int max_len) { int octets; int i; int sum; FILE *infile; if ((infile = fopen(file, "r")) == NULL) { fprintf(stderr, " Failed to open '%s'\n", file); exit(2); } octets = 0; while ((i = get_vector(infile, buf + octets)) > 0) octets += i; fclose(infile); /* The last octet is a sumcheck, so the real data octets are one less than the total we have */ octets--; /* Test the checksum */ for (sum = i = 0; i < octets; i++) sum += buf[i]; if (sum%255 != (int) buf[i]) { fprintf(stderr, " Sumcheck failed in '%s' - %x %x\n", file, sum%255, buf[i]); exit(2); } return octets; } /*- End of function --------------------------------------------------------*/ int main(int argc, char *argv[]) { g726_state_t enc_state; g726_state_t dec_state; int len2; int len3; int i; int test; int bits_per_code; int itutests; int bit_rate; int bad_samples; AFfilehandle inhandle; AFfilehandle outhandle; AFfilesetup filesetup; int16_t amp[1024]; int frames; int outframes; int conditioning_samples; int samples; int conditioning_adpcm; int adpcm; int packing; float x; i = 1; bit_rate = 32000; itutests = TRUE; packing = G726_PACKING_NONE; while (argc > i) { if (strcmp(argv[i], "-16") == 0) { bit_rate = 16000; itutests = FALSE; i++; } else if (strcmp(argv[i], "-24") == 0) { bit_rate = 24000; itutests = FALSE; i++; } else if (strcmp(argv[i], "-32") == 0) { bit_rate = 32000; itutests = FALSE; i++; } else if (strcmp(argv[i], "-40") == 0) { bit_rate = 40000; itutests = FALSE; i++; } else if (strcmp(argv[i], "-l") == 0) { packing = G726_PACKING_LEFT; i++; } else if (strcmp(argv[i], "-r") == 0) { packing = G726_PACKING_RIGHT; i++; } else { fprintf(stderr, "Unknown parameter %s specified.\n", argv[i]); exit(2); } } len2 = 0; conditioning_samples = 0; if (itutests) { for (test = 0; itu_test_sets[test].rate; test++) { printf("Test %2d: '%s' + '%s'\n" " -> '%s' + '%s'\n" " -> '%s' [%d, %d, %d]\n", test, itu_test_sets[test].conditioning_pcm_file, itu_test_sets[test].pcm_file, itu_test_sets[test].conditioning_adpcm_file, itu_test_sets[test].adpcm_file, itu_test_sets[test].output_file, itu_test_sets[test].rate, itu_test_sets[test].compression_law, itu_test_sets[test].decompression_law); switch (itu_test_sets[test].rate) { case 16000: bits_per_code = 2; break; case 24000: bits_per_code = 3; break; case 32000: default: bits_per_code = 4; break; case 40000: bits_per_code = 5; break; } if (itu_test_sets[test].compression_law != G726_ENCODING_NONE) { /* Test the encode side */ g726_init(&enc_state, itu_test_sets[test].rate, itu_test_sets[test].compression_law, G726_PACKING_NONE); if (itu_test_sets[test].conditioning_pcm_file[0]) { conditioning_samples = get_test_vector(itu_test_sets[test].conditioning_pcm_file, xlaw, MAX_TEST_VECTOR_LEN); printf("Test %d: Homing %d samples at %dbps\n", test, conditioning_samples, itu_test_sets[test].rate); } else { conditioning_samples = 0; } samples = get_test_vector(itu_test_sets[test].pcm_file, xlaw + conditioning_samples, MAX_TEST_VECTOR_LEN); memcpy(itudata, xlaw, samples + conditioning_samples); printf("Test %d: Compressing %d samples at %dbps\n", test, samples, itu_test_sets[test].rate); len2 = g726_encode(&enc_state, adpcmdata, itudata, conditioning_samples + samples); } /* Test the decode side */ g726_init(&dec_state, itu_test_sets[test].rate, itu_test_sets[test].decompression_law, G726_PACKING_NONE); if (itu_test_sets[test].conditioning_adpcm_file[0]) { conditioning_adpcm = get_test_vector(itu_test_sets[test].conditioning_adpcm_file, unpacked, MAX_TEST_VECTOR_LEN); printf("Test %d: Homing %d octets at %dbps\n", test, conditioning_adpcm, itu_test_sets[test].rate); } else { conditioning_adpcm = 0; } adpcm = get_test_vector(itu_test_sets[test].adpcm_file, unpacked + conditioning_adpcm, MAX_TEST_VECTOR_LEN); if (itu_test_sets[test].compression_law != G726_ENCODING_NONE) { /* Test our compressed version against the reference compressed version */ printf("Test %d: Compressed data check - %d/%d octets\n", test, conditioning_adpcm + adpcm, len2); if (conditioning_adpcm + adpcm == len2) { for (bad_samples = 0, i = conditioning_samples; i < len2; i++) { if (adpcmdata[i] != unpacked[i]) { bad_samples++; printf("Test %d: Compressed mismatch %d %x %x\n", test, i, adpcmdata[i], unpacked[i]); } } if (bad_samples > 0) { printf("Test failed\n"); exit(2); } printf("Test passed\n"); } else { printf("Test %d: Length mismatch - ref = %d, processed = %d\n", test, conditioning_adpcm + adpcm, len2); exit(2); } } len3 = g726_decode(&dec_state, outdata, unpacked, conditioning_adpcm + adpcm); /* Get the output reference data */ samples = get_test_vector(itu_test_sets[test].output_file, xlaw, MAX_TEST_VECTOR_LEN); memcpy(itu_ref, xlaw, samples); /* Test our decompressed version against the reference decompressed version */ printf("Test %d: Decompressed data check - %d/%d samples\n", test, samples, len3 - conditioning_adpcm); if (samples == len3 - conditioning_adpcm) { for (bad_samples = 0, i = 0; i < len3; i++) { if (itu_ref[i] != ((uint8_t *) outdata)[i + conditioning_adpcm]) { bad_samples++; printf("Test %d: Decompressed mismatch %d %x %x\n", test, i, itu_ref[i], ((uint8_t *) outdata)[i + conditioning_adpcm]); } } if (bad_samples > 0) { printf("Test failed\n"); exit(2); } printf("Test passed\n"); } else { printf("Test %d: Length mismatch - ref = %d, processed = %d\n", test, samples, len3 - conditioning_adpcm); exit(2); } } printf("Tests passed.\n"); } else { if ((inhandle = afOpenFile(IN_FILE_NAME, "r", 0)) == AF_NULL_FILEHANDLE) { fprintf(stderr, " Cannot open wave file '%s'\n", IN_FILE_NAME); exit(2); } if ((x = afGetFrameSize(inhandle, AF_DEFAULT_TRACK, 1)) != 2.0) { fprintf(stderr, " Unexpected frame size in wave file '%s'\n", IN_FILE_NAME); exit(2); } if ((x = afGetRate(inhandle, AF_DEFAULT_TRACK)) != (float) SAMPLE_RATE) { fprintf(stderr, " Unexpected sample rate in wave file '%s'\n", IN_FILE_NAME); exit(2); } if ((x = afGetChannels(inhandle, AF_DEFAULT_TRACK)) != 1.0) { fprintf(stderr, " Unexpected number of channels in wave file '%s'\n", IN_FILE_NAME); exit(2); } if ((filesetup = afNewFileSetup()) == AF_NULL_FILESETUP) { fprintf(stderr, " Failed to create file setup\n"); exit(2); } afInitSampleFormat(filesetup, AF_DEFAULT_TRACK, AF_SAMPFMT_TWOSCOMP, 16); afInitRate(filesetup, AF_DEFAULT_TRACK, (float) SAMPLE_RATE); afInitFileFormat(filesetup, AF_FILE_WAVE); afInitChannels(filesetup, AF_DEFAULT_TRACK, 1); outhandle = afOpenFile(OUT_FILE_NAME, "w", filesetup); if (outhandle == AF_NULL_FILEHANDLE) { fprintf(stderr, " Cannot create wave file '%s'\n", OUT_FILE_NAME); exit(2); } printf("ADPCM packing is %d\n", packing); g726_init(&enc_state, bit_rate, G726_ENCODING_LINEAR, packing); g726_init(&dec_state, bit_rate, G726_ENCODING_LINEAR, packing); while ((frames = afReadFrames(inhandle, AF_DEFAULT_TRACK, amp, 159))) { adpcm = g726_encode(&enc_state, adpcmdata, amp, frames); frames = g726_decode(&dec_state, amp, adpcmdata, adpcm); outframes = afWriteFrames(outhandle, AF_DEFAULT_TRACK, amp, frames); } if (afCloseFile(inhandle) != 0) { printf(" Cannot close wave file '%s'\n", IN_FILE_NAME); exit(2); } if (afCloseFile(outhandle) != 0) { printf(" Cannot close wave file '%s'\n", OUT_FILE_NAME); exit(2); } afFreeFileSetup(filesetup); printf("'%s' transcoded to '%s' at %dbps.\n", IN_FILE_NAME, OUT_FILE_NAME, bit_rate); } return 0; } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/tests/vector_int_tests.c0000644000175000017500000000543011150047203021770 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * vector_int_tests.c * * Written by Steve Underwood * * Copyright (C) 2006 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2, as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: vector_int_tests.c,v 1.8 2008/05/13 13:17:27 steveu Exp $ */ #if defined(HAVE_CONFIG_H) #include "config.h" #endif #include #include #include #include #include #include "spandsp.h" static int32_t vec_dot_prodi16_dumb(const int16_t x[], const int16_t y[], int n) { int32_t z; int i; z = 0; for (i = 0; i < n; i++) z += x[i]*y[i]; return z; } /*- End of function --------------------------------------------------------*/ static int32_t vec_min_maxi16_dumb(const int16_t x[], int n, int16_t out[]) { int i; int16_t min; int16_t max; int16_t temp; int32_t z; max = INT16_MIN; min = INT16_MAX; for (i = 0; i < n; i++) { temp = x[i]; if (temp > max) max = temp; /*endif*/ if (temp < min) min = temp; /*endif*/ } /*endfor*/ out[0] = max; out[1] = min; z = abs(min); if (z > max) return z; return max; } /*- End of function --------------------------------------------------------*/ int main(int argc, char *argv[]) { int i; int32_t za; int32_t zb; int16_t x[99]; int16_t y[99]; int16_t outa[2]; int16_t outb[2]; for (i = 0; i < 99; i++) { x[i] = rand(); y[i] = rand(); } za = vec_dot_prodi16(x, y, 99); zb = vec_dot_prodi16_dumb(x, y, 99); if (za != zb) { printf("Tests failed\n"); exit(2); } x[42] = -32768; za = vec_min_maxi16_dumb(x, 99, outa); zb = vec_min_maxi16(x, 99, outb); if (za != zb || outa[0] != outb[0] || outa[1] != outb[1]) { printf("Tests failed\n"); exit(2); } printf("Tests passed.\n"); return 0; } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/tests/t31_tests.c0000644000175000017500000005771711150047203020242 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * t31_tests.c - Tests for the T.31 modem. * * Written by Steve Underwood * * Copyright (C) 2004 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2, as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: t31_tests.c,v 1.59 2008/07/24 13:55:24 steveu Exp $ */ /*! \file */ /*! \page t31_tests_page T.31 tests \section t31_tests_page_sec_1 What does it do? */ #if defined(HAVE_CONFIG_H) #include "config.h" #endif #include #include #include #include #include #include #include #include "spandsp.h" #include "spandsp/t30_fcf.h" #include "spandsp-sim.h" #if defined(ENABLE_GUI) #include "media_monitor.h" #endif #define INPUT_FILE_NAME "../test-data/itu/fax/itu1.tif" #define OUTPUT_FILE_NAME "t31.tif" #define OUTPUT_WAVE_FILE_NAME "t31_tests.wav" #define DLE 0x10 #define ETX 0x03 #define SUB 0x1A #define MANUFACTURER "www.soft-switch.org" #define SAMPLES_PER_CHUNK 160 struct command_response_s { const char *command; int len_command; const char *response; int len_response; }; g1050_state_t *path_a_to_b; g1050_state_t *path_b_to_a; double when = 0.0; #define EXCHANGE(a,b) {a, sizeof(a) - 1, b, sizeof(b) - 1} #define RESPONSE(b) {"", 0, b, sizeof(b) - 1} #define FAST_RESPONSE(b) {NULL, -1, b, sizeof(b) - 1} #define FAST_SEND(b) {(const char *) 1, -2, b, sizeof(b) - 1} static const struct command_response_s fax_send_test_seq[] = { EXCHANGE("ATE0\r", "ATE0\r\r\nOK\r\n"), EXCHANGE("AT+FCLASS=1\r", "\r\nOK\r\n"), EXCHANGE("ATD123456789\r", "\r\nCONNECT\r\n"), // AT+FRH=3 is implied when dialing in the AT+FCLASS=1 state //RESPONSE("\xFF\x03\x10\x03"), //RESPONSE("\r\nOK\r\n"), //EXCHANGE("AT+FRH=3\r", "\r\nCONNECT\r\n"), // RESPONSE("\xFF\x03\x40\x31\x31\x31\x31\x31\x31\x31\x31\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x1e\x46\x10\x03"), RESPONSE("\r\nOK\r\n"), EXCHANGE("AT+FRH=3\r", "\r\nCONNECT\r\n"), // RESPONSE("\xFF\x13\x80\x00\xEE\xF8\x80\x80\x91\x80\x80\x80\x18\x78\x57\x10\x03"), RESPONSE("\r\nOK\r\n"), //EXCHANGE("AT+FRH=3\r", "\r\nNO CARRIER\r\n"), EXCHANGE("AT+FTH=3\r", "\r\nCONNECT\r\n"), // EXCHANGE("\xFF\x03\x43\x32\x32\x32\x32\x32\x32\x32\x32\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x10\x03", "\r\nCONNECT\r\n"), // EXCHANGE("\xFF\x13\x83\x01\xC6\x80\x80\x80\x80\x01\xFD\x13\x10\x03", "\r\nOK\r\n"), //Do a wait for timed silence at this point, or there won't be one in the tests EXCHANGE("AT+FRS=7\r", "\r\nOK\r\n"), //EXCHANGE("AT+FTS=8;+FTM=96\r", "\r\nCONNECT\r\n"), EXCHANGE("AT+FTS=8\r", "\r\nOK\r\n"), EXCHANGE("AT+FTM=96\r", "\r\nCONNECT\r\n"), // FAST_SEND("\r\nOK\r\n"), EXCHANGE("AT+FRH=3\r", "\r\nCONNECT\r\n"), // RESPONSE("\xFF\x13\x84\xEA\x7D\x10\x03"), RESPONSE("\r\nOK\r\n"), EXCHANGE("AT+FTM=96\r", "\r\nCONNECT\r\n"), // FAST_SEND("\r\nOK\r\n"), //EXCHANGE("AT+FTS=8;+FTH=3\r", "\r\nCONNECT\r\n"), EXCHANGE("AT+FTS=8\r", "\r\nOK\r\n"), EXCHANGE("AT+FTH=3\r", "\r\nCONNECT\r\n"), // EXCHANGE("\xFF\x13\x2E\x10\x03", "\r\nOK\r\n"), EXCHANGE("AT+FRH=3\r", "\r\nCONNECT\r\n"), // RESPONSE("\xFF\x13\x8C\xA2\xF1\x10\x03"), RESPONSE("\r\nOK\r\n"), EXCHANGE("AT+FTH=3\r", "\r\nCONNECT\r\n"), // EXCHANGE("\xFF\x13\xFB\x10\x03", "\r\nOK\r\n"), EXCHANGE("ATH0\r", "\r\nOK\r\n") }; static const struct command_response_s fax_receive_test_seq[] = { EXCHANGE("ATE0\r", "ATE0\r\r\nOK\r\n"), EXCHANGE("AT+FCLASS=1\r", "\r\nOK\r\n"), RESPONSE("\r\nRING\r\n"), EXCHANGE("ATA\r", "\r\nCONNECT\r\n"), // EXCHANGE("\xFF\x03\x40\x32\x32\x32\x32\x32\x32\x32\x32\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x10\x03", "\r\nCONNECT\r\n"), // EXCHANGE("\xFF\x13\x80\x01\xCE\xF4\x80\x80\x81\x80\x80\x80\x18\x10\x03", "\r\nOK\r\n"), EXCHANGE("AT+FRH=3\r", "\r\nCONNECT\r\n"), // RESPONSE("\xFF\x03\x43\x31\x31\x31\x31\x31\x31\x31\x31\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\xAA\x1F\x10\x03"), RESPONSE("\r\nOK\r\n"), EXCHANGE("AT+FRH=3\r", "\r\nCONNECT\r\n"), // RESPONSE("\xFF\x13\x83\x00\xC6\x74\x53\x00\x10\x03"), RESPONSE("\r\nOK\r\n"), EXCHANGE("AT+FRM=96\r", "\r\nCONNECT\r\n"), // FAST_RESPONSE(NULL), RESPONSE("\r\nNO CARRIER\r\n"), EXCHANGE("AT+FTH=3\r", "\r\nCONNECT\r\n"), // EXCHANGE("\xFF\x13\x84\x10\x03", "\r\nOK\r\n"), EXCHANGE("AT+FRM=96\r", "\r\nCONNECT\r\n"), // FAST_RESPONSE(NULL), RESPONSE("\r\nNO CARRIER\r\n"), EXCHANGE("AT+FRH=3\r", "\r\nCONNECT\r\n"), // RESPONSE("\xFF\x13\x2F\x33\x66\x10\x03"), RESPONSE("\r\nOK\r\n"), EXCHANGE("AT+FTH=3\r", "\r\nCONNECT\r\n"), // EXCHANGE("\xFF\x13\x8C\x10\x03", "\r\nOK\r\n"), EXCHANGE("AT+FRH=3\r", "\r\nCONNECT\r\n"), // RESPONSE("\xFF\x13\xfb\x9a\xf6\x10\x03"), RESPONSE("\r\nOK\r\n"), EXCHANGE("ATH0\r", "\r\nOK\r\n") }; char *decode_test_file = NULL; int countdown = 0; int command_response_test_step = -1; char response_buf[1000]; int response_buf_ptr = 0; int answered = FALSE; int kick = FALSE; int dled = FALSE; int done = FALSE; static const struct command_response_s *fax_test_seq; int test_seq_ptr = 0; t31_state_t t31_state; static int phase_b_handler(t30_state_t *s, void *user_data, int result) { int i; i = (intptr_t) user_data; printf("Phase B handler on channel %d - (0x%X) %s\n", i, result, t30_frametype(result)); return T30_ERR_OK; } /*- End of function --------------------------------------------------------*/ static int phase_d_handler(t30_state_t *s, void *user_data, int result) { int i; t30_stats_t t; const char *u; i = (int) (intptr_t) user_data; printf("%c: Phase D handler on channel %c - (0x%X) %s\n", i, i, result, t30_frametype(result)); t30_get_transfer_statistics(s, &t); printf("%c: Phase D: bit rate %d\n", i, t.bit_rate); printf("%c: Phase D: ECM %s\n", i, (t.error_correcting_mode) ? "on" : "off"); printf("%c: Phase D: pages transferred %d\n", i, t.pages_transferred); printf("%c: Phase D: image size %d x %d\n", i, t.width, t.length); printf("%c: Phase D: image resolution %d x %d\n", i, t.x_resolution, t.y_resolution); printf("%c: Phase D: bad rows %d\n", i, t.bad_rows); printf("%c: Phase D: longest bad row run %d\n", i, t.longest_bad_row_run); printf("%c: Phase D: coding method %s\n", i, t4_encoding_to_str(t.encoding)); printf("%c: Phase D: image size %d\n", i, t.image_size); if ((u = t30_get_tx_ident(s))) printf("%d: Phase D: local ident '%s'\n", i, u); if ((u = t30_get_rx_ident(s))) printf("%d: Phase D: remote ident '%s'\n", i, u); printf("%c: Phase D: bits per row - min %d, max %d\n", i, s->t4.min_row_bits, s->t4.max_row_bits); return T30_ERR_OK; } /*- End of function --------------------------------------------------------*/ static void phase_e_handler(t30_state_t *s, void *user_data, int result) { int i; i = (intptr_t) user_data; printf("Phase E handler on channel %d\n", i); //exit(0); } /*- End of function --------------------------------------------------------*/ static int modem_call_control(t31_state_t *s, void *user_data, int op, const char *num) { switch (op) { case AT_MODEM_CONTROL_ANSWER: printf("\nModem control - Answering\n"); answered = TRUE; break; case AT_MODEM_CONTROL_CALL: printf("\nModem control - Dialing '%s'\n", num); t31_call_event(&t31_state, AT_CALL_EVENT_CONNECTED); break; case AT_MODEM_CONTROL_HANGUP: printf("\nModem control - Hanging up\n"); done = TRUE; break; case AT_MODEM_CONTROL_OFFHOOK: printf("\nModem control - Going off hook\n"); break; case AT_MODEM_CONTROL_DTR: printf("\nModem control - DTR %d\n", (int) (intptr_t) num); break; case AT_MODEM_CONTROL_RTS: printf("\nModem control - RTS %d\n", (int) (intptr_t) num); break; case AT_MODEM_CONTROL_CTS: printf("\nModem control - CTS %d\n", (int) (intptr_t) num); break; case AT_MODEM_CONTROL_CAR: printf("\nModem control - CAR %d\n", (int) (intptr_t) num); break; case AT_MODEM_CONTROL_RNG: printf("\nModem control - RNG %d\n", (int) (intptr_t) num); break; case AT_MODEM_CONTROL_DSR: printf("\nModem control - DSR %d\n", (int) (intptr_t) num); break; default: printf("\nModem control - operation %d\n", op); break; } /*endswitch*/ return 0; } /*- End of function --------------------------------------------------------*/ static int at_tx_handler(at_state_t *s, void *user_data, const uint8_t *buf, size_t len) { size_t i; i = 0; if (fax_test_seq[test_seq_ptr].command == NULL) { /* TCF or non-ECM image data expected */ for ( ; i < len; i++) { if (dled) { if (buf[i] == ETX) { printf("\nFast data ended\n"); response_buf_ptr = 0; response_buf[response_buf_ptr] = '\0'; test_seq_ptr++; if (fax_test_seq[test_seq_ptr].command) kick = TRUE; break; } dled = FALSE; } else { if (buf[i] == DLE) dled = TRUE; } } i++; if (i >= len) return 0; } for ( ; i < len; i++) { response_buf[response_buf_ptr++] = buf[i]; putchar(buf[i]); } response_buf[response_buf_ptr] = '\0'; printf("Expected "); for (i = 0; i < response_buf_ptr; i++) printf("%02x ", fax_test_seq[test_seq_ptr].response[i] & 0xFF); printf("\n"); printf("Response "); for (i = 0; i < response_buf_ptr; i++) printf("%02x ", response_buf[i] & 0xFF); printf("\n"); printf("Match %d against %d\n", response_buf_ptr, fax_test_seq[test_seq_ptr].len_response); if (response_buf_ptr >= fax_test_seq[test_seq_ptr].len_response && memcmp(fax_test_seq[test_seq_ptr].response, response_buf, fax_test_seq[test_seq_ptr].len_response) == 0) { printf("\nMatched\n"); test_seq_ptr++; response_buf_ptr = 0; response_buf[response_buf_ptr] = '\0'; if (fax_test_seq[test_seq_ptr].command) kick = TRUE; else dled = FALSE; } return 0; } /*- End of function --------------------------------------------------------*/ static int tx_packet_handler(t38_core_state_t *s, void *user_data, const uint8_t *buf, int len, int count) { t38_terminal_state_t *t; int i; /* This routine queues messages between two instances of T.38 processing */ t = (t38_terminal_state_t *) user_data; span_log(&s->logging, SPAN_LOG_FLOW, "Send seq %d, len %d, count %d\n", s->tx_seq_no, len, count); for (i = 0; i < count; i++) { if (g1050_put(path_a_to_b, buf, len, s->tx_seq_no, when) < 0) printf("Lost packet %d\n", s->tx_seq_no); } return 0; } /*- End of function --------------------------------------------------------*/ static int t38_tests(int use_gui, int test_sending) { t38_terminal_state_t t38_state; int fast_send; int fast_blocks; uint8_t fast_buf[1000]; t30_state_t *t30; if (t31_init(&t31_state, at_tx_handler, NULL, modem_call_control, NULL, NULL, NULL) == NULL) { fprintf(stderr, " Cannot start the T.31 FAX modem\n"); exit(2); } span_log_set_level(&t31_state.logging, SPAN_LOG_SHOW_SEVERITY | SPAN_LOG_SHOW_PROTOCOL | SPAN_LOG_SHOW_TAG | SPAN_LOG_FLOW); span_log_set_tag(&t31_state.logging, "T.31"); if (t38_terminal_init(&t38_state, TRUE, tx_packet_handler, &t31_state) == NULL) { fprintf(stderr, "Cannot start the T.38 channel\n"); exit(2); } t30 = t38_terminal_get_t30_state(&t38_state); span_log_set_level(&t38_state.logging, SPAN_LOG_DEBUG | SPAN_LOG_SHOW_TAG | SPAN_LOG_SHOW_SAMPLE_TIME); span_log_set_tag(&t38_state.logging, "T.38"); span_log_set_level(&t38_state.t38_fe.t38.logging, SPAN_LOG_DEBUG | SPAN_LOG_SHOW_TAG | SPAN_LOG_SHOW_SAMPLE_TIME); span_log_set_tag(&t38_state.t38_fe.t38.logging, "T.38-A"); span_log_set_level(&t30->logging, SPAN_LOG_DEBUG | SPAN_LOG_SHOW_TAG | SPAN_LOG_SHOW_SAMPLE_TIME); span_log_set_tag(&t30->logging, "T.38"); t30_set_tx_ident(t30, "11111111"); t30_set_tx_nsf(t30, (const uint8_t *) "\x50\x00\x00\x00Spandsp\x00", 12); t30_set_tx_file(t30, INPUT_FILE_NAME, -1, -1); t30_set_phase_b_handler(t30, phase_b_handler, (void *) (intptr_t) 'A'); t30_set_phase_d_handler(t30, phase_d_handler, (void *) (intptr_t) 'A'); t30_set_phase_e_handler(t30, phase_e_handler, (void *) (intptr_t) 'A'); //t30_set_ecm_capability(t30, use_ecm); //if (use_ecm) // t30_set_supported_compressions(t30, T30_SUPPORT_T4_1D_COMPRESSION | T30_SUPPORT_T4_2D_COMPRESSION | T30_SUPPORT_T6_COMPRESSION); fast_send = FALSE; fast_blocks = 0; kick = TRUE; #if defined(ENABLE_GUI) if (use_gui) start_media_monitor(); #endif while (!done) { if (kick) { kick = FALSE; if (fax_test_seq[test_seq_ptr].command > (const char *) 1) { if (fax_test_seq[test_seq_ptr].command[0]) { printf("%s\n", fax_test_seq[test_seq_ptr].command); t31_at_rx(&t31_state, fax_test_seq[test_seq_ptr].command, fax_test_seq[test_seq_ptr].len_command); } } else { printf("Fast send\n"); fast_send = TRUE; fast_blocks = 100; } } if (fast_send) { /* Send fast modem data */ memset(fast_buf, 0, 36); if (fast_blocks == 1) { /* Insert EOLs */ fast_buf[35] = ETX; fast_buf[34] = DLE; fast_buf[31] = fast_buf[28] = fast_buf[25] = fast_buf[22] = fast_buf[19] = fast_buf[16] = 1; } t31_at_rx(&t31_state, (char *) fast_buf, 36); if (--fast_blocks == 0) fast_send = FALSE; } //t30_len = fax_tx(&fax_state, t30_amp, SAMPLES_PER_CHUNK); //if (t31_rx(&t31_state, t30_amp, t30_len)) // break; if (countdown) { if (answered) { countdown = 0; t31_call_event(&t31_state, AT_CALL_EVENT_ANSWERED); } else if (--countdown == 0) { t31_call_event(&t31_state, AT_CALL_EVENT_ALERTING); countdown = 250; } } //t31_len = t31_tx(&t31_state, t31_amp, SAMPLES_PER_CHUNK); //if (fax_rx(&fax_state, t31_amp, SAMPLES_PER_CHUNK)) // break; #if defined(ENABLE_GUI) if (use_gui) media_monitor_update_display(); #endif } return 0; } /*- End of function --------------------------------------------------------*/ static int t30_tests(int log_audio, int test_sending) { int k; int outframes; fax_state_t fax_state; int16_t t30_amp[SAMPLES_PER_CHUNK]; int16_t t31_amp[SAMPLES_PER_CHUNK]; int16_t silence[SAMPLES_PER_CHUNK]; int16_t out_amp[2*SAMPLES_PER_CHUNK]; int t30_len; int t31_len; AFfilesetup filesetup; AFfilehandle wave_handle; AFfilehandle in_handle; int fast_send; int fast_blocks; uint8_t fast_buf[1000]; t30_state_t *t30; filesetup = AF_NULL_FILESETUP; wave_handle = AF_NULL_FILEHANDLE; if (log_audio) { if ((filesetup = afNewFileSetup()) == AF_NULL_FILESETUP) { fprintf(stderr, " Failed to create file setup\n"); exit(2); } afInitSampleFormat(filesetup, AF_DEFAULT_TRACK, AF_SAMPFMT_TWOSCOMP, 16); afInitRate(filesetup, AF_DEFAULT_TRACK, (float) SAMPLE_RATE); afInitFileFormat(filesetup, AF_FILE_WAVE); afInitChannels(filesetup, AF_DEFAULT_TRACK, 2); if ((wave_handle = afOpenFile(OUTPUT_WAVE_FILE_NAME, "w", filesetup)) == AF_NULL_FILEHANDLE) { fprintf(stderr, " Cannot create wave file '%s'\n", OUTPUT_WAVE_FILE_NAME); exit(2); } } memset(silence, 0, sizeof(silence)); in_handle = NULL; if (decode_test_file) { if ((in_handle = afOpenFile(decode_test_file, "r", NULL)) == AF_NULL_FILEHANDLE) { fprintf(stderr, " Cannot create wave file '%s'\n", decode_test_file); exit(2); } } if (t31_init(&t31_state, at_tx_handler, NULL, modem_call_control, NULL, NULL, NULL) == NULL) { fprintf(stderr, " Cannot start the T.31 FAX modem\n"); exit(2); } span_log_set_level(&t31_state.logging, SPAN_LOG_SHOW_SEVERITY | SPAN_LOG_SHOW_PROTOCOL | SPAN_LOG_SHOW_TAG | SPAN_LOG_FLOW); span_log_set_tag(&t31_state.logging, "T.31"); if (test_sending) { fax_init(&fax_state, FALSE); t30 = fax_get_t30_state(&fax_state); t30_set_rx_file(t30, OUTPUT_FILE_NAME, -1); fax_test_seq = fax_send_test_seq; countdown = 0; } else { fax_init(&fax_state, TRUE); t30 = fax_get_t30_state(&fax_state); t30_set_tx_file(t30, INPUT_FILE_NAME, -1, -1); fax_test_seq = fax_receive_test_seq; countdown = 250; } t30_set_tx_ident(t30, "11111111"); t30_set_supported_modems(t30, T30_SUPPORT_V27TER | T30_SUPPORT_V29 | T30_SUPPORT_V17); t30_set_phase_b_handler(t30, phase_b_handler, (void *) 0); t30_set_phase_d_handler(t30, phase_d_handler, (void *) 0); t30_set_phase_e_handler(t30, phase_e_handler, (void *) 0); memset(t30_amp, 0, sizeof(t30_amp)); span_log_set_level(&t30->logging, SPAN_LOG_SHOW_SEVERITY | SPAN_LOG_SHOW_PROTOCOL | SPAN_LOG_SHOW_TAG | SPAN_LOG_FLOW); span_log_set_tag(&t30->logging, "FAX"); span_log_set_level(&fax_state.logging, SPAN_LOG_SHOW_SEVERITY | SPAN_LOG_SHOW_PROTOCOL | SPAN_LOG_SHOW_TAG | SPAN_LOG_FLOW); span_log_set_tag(&fax_state.logging, "FAX"); fast_send = FALSE; fast_blocks = 0; kick = TRUE; while (!done) { if (kick) { kick = FALSE; if (fax_test_seq[test_seq_ptr].command > (const char *) 1) { if (fax_test_seq[test_seq_ptr].command[0]) { printf("%s\n", fax_test_seq[test_seq_ptr].command); t31_at_rx(&t31_state, fax_test_seq[test_seq_ptr].command, fax_test_seq[test_seq_ptr].len_command); } } else { printf("Fast send\n"); fast_send = TRUE; fast_blocks = 100; } } if (fast_send) { /* Send fast modem data */ memset(fast_buf, 0, 36); if (fast_blocks == 1) { /* Insert EOLs */ fast_buf[35] = ETX; fast_buf[34] = DLE; fast_buf[31] = fast_buf[28] = fast_buf[25] = fast_buf[22] = fast_buf[19] = fast_buf[16] = 1; } t31_at_rx(&t31_state, (char *) fast_buf, 36); if (--fast_blocks == 0) fast_send = FALSE; } t30_len = fax_tx(&fax_state, t30_amp, SAMPLES_PER_CHUNK); /* The receive side always expects a full block of samples, but the transmit side may not be sending any when it doesn't need to. We may need to pad with some silence. */ if (t30_len < SAMPLES_PER_CHUNK) { memset(t30_amp + t30_len, 0, sizeof(int16_t)*(SAMPLES_PER_CHUNK - t30_len)); t30_len = SAMPLES_PER_CHUNK; } if (log_audio) { for (k = 0; k < t30_len; k++) out_amp[2*k] = t30_amp[k]; } if (t31_rx(&t31_state, t30_amp, t30_len)) break; if (countdown) { if (answered) { countdown = 0; t31_call_event(&t31_state, AT_CALL_EVENT_ANSWERED); } else if (--countdown == 0) { t31_call_event(&t31_state, AT_CALL_EVENT_ALERTING); countdown = 250; } } t31_len = t31_tx(&t31_state, t31_amp, SAMPLES_PER_CHUNK); if (t31_len < SAMPLES_PER_CHUNK) { memset(t31_amp + t31_len, 0, sizeof(int16_t)*(SAMPLES_PER_CHUNK - t31_len)); t31_len = SAMPLES_PER_CHUNK; } if (log_audio) { for (k = 0; k < t31_len; k++) out_amp[2*k + 1] = t31_amp[k]; } if (fax_rx(&fax_state, t31_amp, SAMPLES_PER_CHUNK)) break; if (log_audio) { outframes = afWriteFrames(wave_handle, AF_DEFAULT_TRACK, out_amp, SAMPLES_PER_CHUNK); if (outframes != SAMPLES_PER_CHUNK) break; } } if (decode_test_file) { if (afCloseFile(in_handle) != 0) { fprintf(stderr, " Cannot close wave file '%s'\n", decode_test_file); exit(2); } } if (log_audio) { if (afCloseFile(wave_handle) != 0) { fprintf(stderr, " Cannot close wave file '%s'\n", OUTPUT_WAVE_FILE_NAME); exit(2); } afFreeFileSetup(filesetup); } return 0; } /*- End of function --------------------------------------------------------*/ int main(int argc, char *argv[]) { int log_audio; int t38_mode; int test_sending; int use_gui; int opt; decode_test_file = NULL; log_audio = FALSE; test_sending = FALSE; t38_mode = FALSE; use_gui = FALSE; while ((opt = getopt(argc, argv, "d:glrst")) != -1) { switch (opt) { case 'd': decode_test_file = optarg; break; case 'g': #if defined(ENABLE_GUI) use_gui = TRUE; #else fprintf(stderr, "Graphical monitoring not available\n"); exit(2); #endif break; case 'l': log_audio = TRUE; break; case 'r': test_sending = FALSE; break; case 's': test_sending = TRUE; break; case 't': t38_mode = TRUE; break; default: //usage(); exit(2); break; } } if (t38_mode) t38_tests(use_gui, test_sending); else t30_tests(log_audio, test_sending); if (done) { printf("Tests passed\n"); } return 0; } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/tests/power_meter_tests.c0000644000175000017500000001323211150047203022143 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * power_meter_tests.c * * Written by Steve Underwood * * Copyright (C) 2003 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2, as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: power_meter_tests.c,v 1.21 2008/05/13 13:17:26 steveu Exp $ */ /*! \page power_meter_tests_page Power meter tests \section power_meter_tests_page_sec_1 What does it do? These tests assess the accuracy of power meters built from the power meter module. Both tones and noise are used to check the meter's behaviour. \section power_meter_tests_page_sec_2 How does it work? ???. */ #if defined(HAVE_CONFIG_H) #include #endif #include #include #include #include #include "spandsp.h" int main(int argc, char *argv[]) { awgn_state_t noise_source; power_meter_t meter; tone_gen_descriptor_t tone_desc; tone_gen_state_t gen; int i; int idum = 1234567; int16_t amp[1000]; int len; int32_t level; power_meter_init(&meter, 7); printf("Testing with a square wave 10dB from maximum\n"); for (i = 0; i < 1000; i++) { amp[i] = (i & 1) ? 10362 : -10362; level = power_meter_update(&meter, amp[i]); //printf("%12d %fdBm0 %fdBov\n", level, power_meter_current_dbm0(&meter), power_meter_current_dbov(&meter)); } printf("Level: expected %" PRId32 "/%" PRId32 ", got %" PRId32 "\n", power_meter_level_dbov(-10.0f), power_meter_level_dbm0(-10.0f + DBM0_MAX_POWER), level); printf("Power: expected %fdBm0, got %fdBm0\n", -10.0f + DBM0_MAX_POWER, power_meter_current_dbm0(&meter)); printf("Power: expected %fdBOv, got %fdBOv\n", -10.0f, power_meter_current_dbov(&meter)); if (level < power_meter_level_dbov(-10.0f)*0.99f || level > power_meter_level_dbov(-10.0f)*1.01f) { printf("Test failed (level)\n"); exit(2); } if (0.1f < fabsf(power_meter_current_dbm0(&meter) + 10.0f - DBM0_MAX_POWER)) { printf("Test failed (dBm0)\n"); exit(2); } if (0.1f < fabsf(power_meter_current_dbov(&meter) + 10.0)) { printf("Test failed (dBOv)\n"); exit(2); } printf("Testing with a sine wave tone 10dB from maximum\n"); make_tone_gen_descriptor(&tone_desc, 1000, -4, 0, 1, 1, 0, 0, 0, TRUE); tone_gen_init(&gen, &tone_desc); len = tone_gen(&gen, amp, 1000); for (i = 0; i < len; i++) { level = power_meter_update(&meter, amp[i]); //printf("%12d %fdBm0 %fdBov\n", level, power_meter_current_dbm0(&meter), power_meter_current_dbov(&meter)); } printf("Level: expected %" PRId32 "/%" PRId32 ", got %" PRId32 "\n", power_meter_level_dbov(-10.0f), power_meter_level_dbm0(-10.0f + DBM0_MAX_POWER), level); printf("Power: expected %fdBm0, got %fdBm0\n", -10.0f + DBM0_MAX_POWER, power_meter_current_dbm0(&meter)); printf("Power: expected %fdBOv, got %fdBOv\n", -10.0f, power_meter_current_dbov(&meter)); if (level < power_meter_level_dbov(-10.0f)*0.95f || level > power_meter_level_dbov(-10.0f)*1.05f) { printf("Test failed (level)\n"); exit(2); } if (0.2f < fabsf(power_meter_current_dbm0(&meter) + 10.0f - DBM0_MAX_POWER)) { printf("Test failed (dBm0)\n"); exit(2); } if (0.2f < fabsf(power_meter_current_dbov(&meter) + 10.0)) { printf("Test failed (dBOv)\n"); exit(2); } printf("Testing with AWGN 10dB from maximum\n"); awgn_init_dbov(&noise_source, idum, -10.0f); for (i = 0; i < 1000; i++) amp[i] = awgn(&noise_source); for (i = 0; i < 1000; i++) { level = power_meter_update(&meter, amp[i]); //printf("%12d %fdBm0 %fdBov\n", level, power_meter_current_dbm0(&meter), power_meter_current_dbov(&meter)); } printf("Level: expected %" PRId32 "/%" PRId32 ", got %" PRId32 "\n", power_meter_level_dbov(-10.0f), power_meter_level_dbm0(-10.0f + DBM0_MAX_POWER), level); printf("Power: expected %fdBm0, got %fdBm0\n", -10.0f + DBM0_MAX_POWER, power_meter_current_dbm0(&meter)); printf("Power: expected %fdBOv, got %fdBOv\n", -10.0f, power_meter_current_dbov(&meter)); if (level < power_meter_level_dbov(-10.0f)*0.95f || level > power_meter_level_dbov(-10.0f)*1.05f) { printf("Test failed (level)\n"); exit(2); } if (0.2f < fabsf(power_meter_current_dbm0(&meter) + 10.0f - DBM0_MAX_POWER)) { printf("Test failed (dBm0)\n"); exit(2); } if (0.2f < fabsf(power_meter_current_dbov(&meter) + 10.0f)) { printf("Test failed (dBOv)\n"); exit(2); } printf("Tests passed\n"); return 0; } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/tests/t38_gateway_to_terminal_tests.c0000644000175000017500000004325611150047203024360 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * t38_gateway_to_terminal_tests.c - Joint tests for the T.38 FoIP terminal and gateway modules. * * Written by Steve Underwood * * Copyright (C) 2005, 2006 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2, as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: t38_gateway_to_terminal_tests.c,v 1.59 2008/07/24 13:55:24 steveu Exp $ */ /*! \file */ /*! \page t38_gateway_to_terminal_tests_page T.38 mixed gateway and termination tests \section t38_gateway_to_terminal_tests_page_sec_1 What does it do? These tests exercise the path FAX machine -> T.38 gateway -> T.38 termination */ #if defined(HAVE_CONFIG_H) #include #endif #if defined(HAVE_FL_FL_H) && defined(HAVE_FL_FL_CARTESIAN_H) && defined(HAVE_FL_FL_AUDIO_METER_H) #define ENABLE_GUI #endif #include #include #include #include #include #include #include #include #include #include #if !defined(__USE_MISC) #define __USE_MISC #endif #include #include #include #include #include "spandsp.h" #include "spandsp-sim.h" #if defined(ENABLE_GUI) #include "media_monitor.h" #endif #define SAMPLES_PER_CHUNK 160 #define INPUT_FILE_NAME "../test-data/itu/fax/itutests.tif" #define OUTPUT_FILE_NAME "t38.tif" #define OUTPUT_FILE_NAME_WAVE "t38_gateway_to_terminal.wav" fax_state_t fax_state_a; t38_gateway_state_t t38_state_a; t38_terminal_state_t t38_state_b; g1050_state_t *path_a_to_b; g1050_state_t *path_b_to_a; double when = 0.0; int done[2] = {FALSE, FALSE}; int succeeded[2] = {FALSE, FALSE}; int simulate_incrementing_repeats = FALSE; static int phase_b_handler(t30_state_t *s, void *user_data, int result) { int i; i = (int) (intptr_t) user_data; printf("%c: Phase B handler on channel %c - (0x%X) %s\n", i, i, result, t30_frametype(result)); return T30_ERR_OK; } /*- End of function --------------------------------------------------------*/ static int phase_d_handler(t30_state_t *s, void *user_data, int result) { int i; t30_stats_t t; const char *u; i = (int) (intptr_t) user_data; printf("%c: Phase D handler on channel %c - (0x%X) %s\n", i, i, result, t30_frametype(result)); t30_get_transfer_statistics(s, &t); printf("%c: Phase D: bit rate %d\n", i, t.bit_rate); printf("%c: Phase D: ECM %s\n", i, (t.error_correcting_mode) ? "on" : "off"); printf("%c: Phase D: pages transferred %d\n", i, t.pages_transferred); printf("%c: Phase D: image size %d x %d\n", i, t.width, t.length); printf("%c: Phase D: image resolution %d x %d\n", i, t.x_resolution, t.y_resolution); printf("%c: Phase D: bad rows %d\n", i, t.bad_rows); printf("%c: Phase D: longest bad row run %d\n", i, t.longest_bad_row_run); printf("%c: Phase D: coding method %s\n", i, t4_encoding_to_str(t.encoding)); printf("%c: Phase D: image size %d bytes\n", i, t.image_size); if ((u = t30_get_tx_ident(s))) printf("%c: Phase D: local ident '%s'\n", i, u); if ((u = t30_get_rx_ident(s))) printf("%c: Phase D: remote ident '%s'\n", i, u); printf("%c: Phase D: bits per row - min %d, max %d\n", i, s->t4.min_row_bits, s->t4.max_row_bits); return T30_ERR_OK; } /*- End of function --------------------------------------------------------*/ static void phase_e_handler(t30_state_t *s, void *user_data, int result) { int i; t30_stats_t t; const char *u; i = (int) (intptr_t) user_data; printf("%c: Phase E handler on channel %c - (%d) %s\n", i, i, result, t30_completion_code_to_str(result)); t30_get_transfer_statistics(s, &t); printf("%c: Phase E: bit rate %d\n", i, t.bit_rate); printf("%c: Phase E: ECM %s\n", i, (t.error_correcting_mode) ? "on" : "off"); printf("%c: Phase E: pages transferred %d\n", i, t.pages_transferred); printf("%c: Phase E: image size %d x %d\n", i, t.width, t.length); printf("%c: Phase E: image resolution %d x %d\n", i, t.x_resolution, t.y_resolution); printf("%c: Phase E: bad rows %d\n", i, t.bad_rows); printf("%c: Phase E: longest bad row run %d\n", i, t.longest_bad_row_run); printf("%c: Phase E: coding method %s\n", i, t4_encoding_to_str(t.encoding)); printf("%c: Phase E: image size %d bytes\n", i, t.image_size); if ((u = t30_get_tx_ident(s))) printf("%c: Phase E: local ident '%s'\n", i, u); if ((u = t30_get_rx_ident(s))) printf("%c: Phase E: remote ident '%s'\n", i, u); succeeded[i - 'A'] = (result == T30_ERR_OK) && (t.pages_transferred == 12); done[i - 'A'] = TRUE; } /*- End of function --------------------------------------------------------*/ static int tx_packet_handler_a(t38_core_state_t *s, void *user_data, const uint8_t *buf, int len, int count) { t38_terminal_state_t *t; int i; static int subst_seq = 0; /* This routine queues messages between two instances of T.38 processing */ t = (t38_terminal_state_t *) user_data; if (simulate_incrementing_repeats) { for (i = 0; i < count; i++) { span_log(&s->logging, SPAN_LOG_FLOW, "Send seq %d, len %d\n", subst_seq, len); g1050_put(path_a_to_b, buf, len, subst_seq, when); subst_seq = (subst_seq + 1) & 0xFFFF; } } else { span_log(&s->logging, SPAN_LOG_FLOW, "Send seq %d, len %d, count %d\n", s->tx_seq_no, len, count); for (i = 0; i < count; i++) g1050_put(path_a_to_b, buf, len, s->tx_seq_no, when); } return 0; } /*- End of function --------------------------------------------------------*/ static int tx_packet_handler_b(t38_core_state_t *s, void *user_data, const uint8_t *buf, int len, int count) { t38_terminal_state_t *t; int i; static int subst_seq = 0; /* This routine queues messages between two instances of T.38 processing */ t = (t38_terminal_state_t *) user_data; if (simulate_incrementing_repeats) { for (i = 0; i < count; i++) { span_log(&s->logging, SPAN_LOG_FLOW, "Send seq %d, len %d\n", subst_seq, len); g1050_put(path_b_to_a, buf, len, subst_seq, when); subst_seq = (subst_seq + 1) & 0xFFFF; } } else { span_log(&s->logging, SPAN_LOG_FLOW, "Send seq %d, len %d, count %d\n", s->tx_seq_no, len, count); for (i = 0; i < count; i++) g1050_put(path_b_to_a, buf, len, s->tx_seq_no, when); } return 0; } /*- End of function --------------------------------------------------------*/ int main(int argc, char *argv[]) { int16_t t38_amp_a[SAMPLES_PER_CHUNK]; int16_t t30_amp_a[SAMPLES_PER_CHUNK]; int16_t out_amp[2*SAMPLES_PER_CHUNK]; int t38_len_a; int t30_len_a; int msg_len; uint8_t msg[1024]; int log_audio; int outframes; int t38_version; int use_ecm; int use_tep; int feedback_audio; int use_transmit_on_idle; AFfilesetup filesetup; AFfilehandle wave_handle; const char *input_file_name; int i; int seq_no; int model_no; int speed_pattern_no; double tx_when; double rx_when; int supported_modems; int use_gui; int opt; t30_state_t *t30; log_audio = FALSE; t38_version = 1; use_ecm = FALSE; input_file_name = INPUT_FILE_NAME; simulate_incrementing_repeats = FALSE; model_no = 0; speed_pattern_no = 1; use_gui = FALSE; use_tep = FALSE; feedback_audio = FALSE; use_transmit_on_idle = TRUE; supported_modems = T30_SUPPORT_V27TER | T30_SUPPORT_V29 | T30_SUPPORT_V17; while ((opt = getopt(argc, argv, "efgi:Ilm:M:s:tv:")) != -1) { switch (opt) { case 'e': use_ecm = TRUE; break; case 'f': feedback_audio = TRUE; break; case 'g': #if defined(ENABLE_GUI) use_gui = TRUE; #else fprintf(stderr, "Graphical monitoring not available\n"); exit(2); #endif break; case 'i': input_file_name = optarg; break; case 'I': simulate_incrementing_repeats = TRUE; break; case 'l': log_audio = TRUE; break; case 'm': supported_modems = atoi(optarg); break; case 'M': model_no = optarg[0] - 'A' + 1; break; case 's': speed_pattern_no = atoi(optarg); break; case 't': use_tep = TRUE; break; case 'v': t38_version = atoi(optarg); break; default: //usage(); exit(2); break; } } printf("Using T.38 version %d\n", t38_version); if (use_ecm) printf("Using ECM\n"); filesetup = AF_NULL_FILESETUP; wave_handle = AF_NULL_FILEHANDLE; if (log_audio) { if ((filesetup = afNewFileSetup()) == AF_NULL_FILESETUP) { fprintf(stderr, " Failed to create file setup\n"); exit(2); } afInitSampleFormat(filesetup, AF_DEFAULT_TRACK, AF_SAMPFMT_TWOSCOMP, 16); afInitRate(filesetup, AF_DEFAULT_TRACK, (float) SAMPLE_RATE); afInitFileFormat(filesetup, AF_FILE_WAVE); afInitChannels(filesetup, AF_DEFAULT_TRACK, 2); wave_handle = afOpenFile(OUTPUT_FILE_NAME_WAVE, "w", filesetup); if (wave_handle == AF_NULL_FILEHANDLE) { fprintf(stderr, " Cannot create wave file '%s'\n", OUTPUT_FILE_NAME_WAVE); exit(2); } } srand48(0x1234567); if ((path_a_to_b = g1050_init(model_no, speed_pattern_no, 100, 33)) == NULL) { fprintf(stderr, "Failed to start IP network path model\n"); exit(2); } if ((path_b_to_a = g1050_init(model_no, speed_pattern_no, 100, 33)) == NULL) { fprintf(stderr, "Failed to start IP network path model\n"); exit(2); } if (fax_init(&fax_state_a, TRUE) == NULL) { fprintf(stderr, "Cannot start FAX\n"); exit(2); } t30 = fax_get_t30_state(&fax_state_a); fax_set_transmit_on_idle(&fax_state_a, use_transmit_on_idle); fax_set_tep_mode(&fax_state_a, use_tep); t30_set_supported_modems(t30, supported_modems); t30_set_tx_ident(t30, "11111111"); t30_set_tx_nsf(t30, (const uint8_t *) "\x50\x00\x00\x00Spandsp\x00", 12); t30_set_tx_file(t30, input_file_name, -1, -1); t30_set_phase_b_handler(t30, phase_b_handler, (void *) (intptr_t) 'A'); t30_set_phase_d_handler(t30, phase_d_handler, (void *) (intptr_t) 'A'); t30_set_phase_e_handler(t30, phase_e_handler, (void *) (intptr_t) 'A'); t30_set_ecm_capability(t30, use_ecm); if (use_ecm) t30_set_supported_compressions(t30, T30_SUPPORT_T4_1D_COMPRESSION | T30_SUPPORT_T4_2D_COMPRESSION | T30_SUPPORT_T6_COMPRESSION); span_log_set_level(&fax_state_a.logging, SPAN_LOG_DEBUG | SPAN_LOG_SHOW_TAG | SPAN_LOG_SHOW_SAMPLE_TIME); span_log_set_tag(&fax_state_a.logging, "FAX-A "); span_log_set_level(&t30->logging, SPAN_LOG_DEBUG | SPAN_LOG_SHOW_TAG | SPAN_LOG_SHOW_SAMPLE_TIME); span_log_set_tag(&t30->logging, "FAX-A "); memset(t30_amp_a, 0, sizeof(t30_amp_a)); if (t38_gateway_init(&t38_state_a, tx_packet_handler_a, &t38_state_b) == NULL) { fprintf(stderr, "Cannot start the T.38 channel\n"); exit(2); } t38_gateway_set_transmit_on_idle(&t38_state_a, use_transmit_on_idle); t38_set_t38_version(&t38_state_a.t38x.t38, t38_version); t38_gateway_set_ecm_capability(&t38_state_a, use_ecm); span_log_set_level(&t38_state_a.logging, SPAN_LOG_DEBUG | SPAN_LOG_SHOW_TAG | SPAN_LOG_SHOW_SAMPLE_TIME); span_log_set_tag(&t38_state_a.logging, "T.38-A"); span_log_set_level(&t38_state_a.t38x.t38.logging, SPAN_LOG_DEBUG | SPAN_LOG_SHOW_TAG | SPAN_LOG_SHOW_SAMPLE_TIME); span_log_set_tag(&t38_state_a.t38x.t38.logging, "T.38-A"); memset(t38_amp_a, 0, sizeof(t38_amp_a)); if (t38_terminal_init(&t38_state_b, FALSE, tx_packet_handler_b, &t38_state_a) == NULL) { fprintf(stderr, "Cannot start the T.38 channel\n"); exit(2); } t30 = t38_terminal_get_t30_state(&t38_state_b); t38_set_t38_version(&t38_state_b.t38_fe.t38, t38_version); span_log_set_level(&t38_state_b.logging, SPAN_LOG_DEBUG | SPAN_LOG_SHOW_TAG | SPAN_LOG_SHOW_SAMPLE_TIME); span_log_set_tag(&t38_state_b.logging, "T.38-B"); span_log_set_level(&t38_state_b.t38_fe.t38.logging, SPAN_LOG_DEBUG | SPAN_LOG_SHOW_TAG | SPAN_LOG_SHOW_SAMPLE_TIME); span_log_set_tag(&t38_state_b.t38_fe.t38.logging, "T.38-B"); span_log_set_level(&t30->logging, SPAN_LOG_DEBUG | SPAN_LOG_SHOW_TAG | SPAN_LOG_SHOW_SAMPLE_TIME); span_log_set_tag(&t30->logging, "T.38-B"); t30_set_supported_modems(t30, supported_modems); t30_set_tx_ident(t30, "22222222"); t30_set_rx_file(t30, OUTPUT_FILE_NAME, -1); t30_set_phase_b_handler(t30, phase_b_handler, (void *) (intptr_t) 'B'); t30_set_phase_d_handler(t30, phase_d_handler, (void *) (intptr_t) 'B'); t30_set_phase_e_handler(t30, phase_e_handler, (void *) (intptr_t) 'B'); t30_set_ecm_capability(t30, use_ecm); if (use_ecm) t30_set_supported_compressions(t30, T30_SUPPORT_T4_1D_COMPRESSION | T30_SUPPORT_T4_2D_COMPRESSION | T30_SUPPORT_T6_COMPRESSION); #if defined(ENABLE_GUI) if (use_gui) start_media_monitor(); #endif for (;;) { span_log_bump_samples(&fax_state_a.logging, SAMPLES_PER_CHUNK); span_log_bump_samples(&fax_state_a.t30.logging, SAMPLES_PER_CHUNK); span_log_bump_samples(&t38_state_a.logging, SAMPLES_PER_CHUNK); span_log_bump_samples(&t38_state_a.t38x.t38.logging, SAMPLES_PER_CHUNK); span_log_bump_samples(&t38_state_b.logging, SAMPLES_PER_CHUNK); span_log_bump_samples(&t38_state_b.t38_fe.t38.logging, SAMPLES_PER_CHUNK); span_log_bump_samples(&t38_state_b.t30.logging, SAMPLES_PER_CHUNK); memset(out_amp, 0, sizeof(out_amp)); t38_terminal_send_timeout(&t38_state_b, SAMPLES_PER_CHUNK); t30_len_a = fax_tx(&fax_state_a, t30_amp_a, SAMPLES_PER_CHUNK); if (!use_transmit_on_idle) { /* The receive side always expects a full block of samples, but the transmit side may not be sending any when it doesn't need to. We may need to pad with some silence. */ if (t30_len_a < SAMPLES_PER_CHUNK) { memset(t30_amp_a + t30_len_a, 0, sizeof(int16_t)*(SAMPLES_PER_CHUNK - t30_len_a)); t30_len_a = SAMPLES_PER_CHUNK; } } if (log_audio) { for (i = 0; i < t30_len_a; i++) out_amp[2*i] = t30_amp_a[i]; } if (feedback_audio) { for (i = 0; i < t30_len_a; i++) t30_amp_a[i] += t38_amp_a[i] >> 1; } if (t38_gateway_rx(&t38_state_a, t30_amp_a, t30_len_a)) break; t38_len_a = t38_gateway_tx(&t38_state_a, t38_amp_a, SAMPLES_PER_CHUNK); if (!use_transmit_on_idle) { if (t38_len_a < SAMPLES_PER_CHUNK) { memset(t38_amp_a + t38_len_a, 0, sizeof(int16_t)*(SAMPLES_PER_CHUNK - t38_len_a)); t38_len_a = SAMPLES_PER_CHUNK; } } if (log_audio) { for (i = 0; i < t38_len_a; i++) out_amp[2*i + 1] = t38_amp_a[i]; } if (fax_rx(&fax_state_a, t38_amp_a, SAMPLES_PER_CHUNK)) break; when += 0.02; while ((msg_len = g1050_get(path_a_to_b, msg, 1024, when, &seq_no, &tx_when, &rx_when)) >= 0) { #if defined(ENABLE_GUI) if (use_gui) media_monitor_rx(seq_no, tx_when, rx_when); #endif t38_core_rx_ifp_packet(&t38_state_b.t38_fe.t38, msg, msg_len, seq_no); } while ((msg_len = g1050_get(path_b_to_a, msg, 1024, when, &seq_no, &tx_when, &rx_when)) >= 0) { #if defined(ENABLE_GUI) if (use_gui) media_monitor_rx(seq_no, tx_when, rx_when); #endif t38_core_rx_ifp_packet(&t38_state_a.t38x.t38, msg, msg_len, seq_no); } if (log_audio) { outframes = afWriteFrames(wave_handle, AF_DEFAULT_TRACK, out_amp, SAMPLES_PER_CHUNK); if (outframes != SAMPLES_PER_CHUNK) break; } if (done[0] && done[1]) break; #if defined(ENABLE_GUI) if (use_gui) media_monitor_update_display(); #endif } fax_release(&fax_state_a); t38_terminal_release(&t38_state_b); if (log_audio) { if (afCloseFile(wave_handle) != 0) { fprintf(stderr, " Cannot close wave file '%s'\n", OUTPUT_FILE_NAME_WAVE); exit(2); } afFreeFileSetup(filesetup); } if (!succeeded[0] || !succeeded[1]) { printf("Tests failed\n"); exit(2); } printf("Tests passed\n"); return 0; } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/tests/g722_tests.c0000644000175000017500000004166311150047203020305 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * g722_tests.c - Test G.722 encode and decode. * * Written by Steve Underwood * * Copyright (C) 2005 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2, as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: g722_tests.c,v 1.26 2008/05/13 13:17:25 steveu Exp $ */ /*! \file */ /*! \page g722_tests_page G.722 tests \section g722_tests_page_sec_1 What does it do? This modules implements two sets of tests: - The tests defined in the G.722 specification, using the test data files supplied with the specification. - A generally audio quality test, consisting of compressing and decompressing a speeech file for audible comparison. The speech file should be recorded at 16 bits/sample, 16000 samples/second, and named "pre_g722.wav". The ITU tests use the codec in a special mode, in which the QMFs, which split and recombine the sub-bands, are disabled. This means they do not test 100% of the codec. This is the reason for including the additional listening test. \section g722_tests_page_sec_2 How is it used? To perform the tests in the G.722 specification you need to obtain the test data files from the specification. These are copyright material, and so cannot be distributed with this test software. The files, containing test vectors, which are supplied with the G.722 specification, should be copied to itutests/g722. The ITU tests can then be run by executing g722_tests without any parameters. To perform a general audio quality test, g722_tests should be run with a parameter specifying the required bit rate for compression. The valid parameters are "-48", "-56", and "-64". The file ../test-data/local/short_wb_voice.wav will be compressed to the specified bit rate, decompressed, and the resulting audio stored in post_g722.wav. */ #if defined(HAVE_CONFIG_H) #include #endif #include #include #include #include #include #include #include #include "spandsp.h" #define G722_SAMPLE_RATE 16000 #define BLOCK_LEN 320 #define MAX_TEST_VECTOR_LEN 40000 #define TESTDATA_DIR "../test-data/itu/g722/" #define EIGHTK_IN_FILE_NAME "../test-data/local/short_nb_voice.wav" #define IN_FILE_NAME "../test-data/local/short_wb_voice.wav" #define OUT_FILE_NAME "post_g722.wav" #if 0 static const char *itu_test_files[] = { TESTDATA_DIR "T1C1.XMT", /* 69973 bytes */ TESTDATA_DIR "T1C2.XMT", /* 3605 bytes */ TESTDATA_DIR "T1D3.COD", /* 69973 bytes */ TESTDATA_DIR "T2R1.COD", /* 69973 bytes */ TESTDATA_DIR "T2R2.COD", /* 3605 bytes */ TESTDATA_DIR "T3L1.RC1", /* 69973 bytes */ TESTDATA_DIR "T3L1.RC2", /* 69973 bytes */ TESTDATA_DIR "T3L1.RC3", /* 69973 bytes */ TESTDATA_DIR "T3H1.RC0", /* 69973 bytes */ TESTDATA_DIR "T3L2.RC1", /* 3605 bytes */ TESTDATA_DIR "T3L2.RC2", /* 3605 bytes */ TESTDATA_DIR "T3L2.RC3", /* 3605 bytes */ TESTDATA_DIR "T3H2.RC0", /* 3605 bytes */ TESTDATA_DIR "T3L3.RC1", /* 69973 bytes */ TESTDATA_DIR "T3L3.RC2", /* 69973 bytes */ TESTDATA_DIR "T3L3.RC3", /* 69973 bytes */ TESTDATA_DIR "T3H3.RC0" /* 69973 bytes */ }; #endif static const char *encode_test_files[] = { TESTDATA_DIR "T1C1.XMT", TESTDATA_DIR "T2R1.COD", TESTDATA_DIR "T1C2.XMT", TESTDATA_DIR "T2R2.COD", NULL }; static const char *decode_test_files[] = { TESTDATA_DIR "T2R1.COD", TESTDATA_DIR "T3L1.RC1", TESTDATA_DIR "T3L1.RC2", TESTDATA_DIR "T3L1.RC3", TESTDATA_DIR "T3H1.RC0", TESTDATA_DIR "T2R2.COD", TESTDATA_DIR "T3L2.RC1", TESTDATA_DIR "T3L2.RC2", TESTDATA_DIR "T3L2.RC3", TESTDATA_DIR "T3H2.RC0", TESTDATA_DIR "T1D3.COD", TESTDATA_DIR "T3L3.RC1", TESTDATA_DIR "T3L3.RC2", TESTDATA_DIR "T3L3.RC3", TESTDATA_DIR "T3H3.RC0", NULL }; int16_t itu_data[MAX_TEST_VECTOR_LEN]; uint16_t itu_ref[MAX_TEST_VECTOR_LEN]; uint16_t itu_ref_upper[MAX_TEST_VECTOR_LEN]; uint8_t compressed[MAX_TEST_VECTOR_LEN]; int16_t decompressed[MAX_TEST_VECTOR_LEN]; static int hex_get(char *s) { int i; int value; int x; for (value = i = 0; i < 4; i++) { x = *s++ - 0x30; if (x > 9) x -= 0x07; if (x > 15) x -= 0x20; if (x < 0 || x > 15) return -1; value <<= 4; value |= x; } return value; } /*- End of function --------------------------------------------------------*/ static int get_vector(FILE *file, uint16_t vec[]) { char buf[132 + 1]; char *s; int i; int value; while (fgets(buf, 133, file)) { if (buf[0] == '/' && buf[1] == '*') continue; s = buf; i = 0; while ((value = hex_get(s)) >= 0) { vec[i++] = value; s += 4; } return i; } return 0; } /*- End of function --------------------------------------------------------*/ static int get_test_vector(const char *file, uint16_t buf[], int max_len) { int octets; int i; FILE *infile; if ((infile = fopen(file, "r")) == NULL) { fprintf(stderr, " Failed to open '%s'\n", file); exit(2); } octets = 0; while ((i = get_vector(infile, buf + octets)) > 0) octets += i; fclose(infile); return octets; } /*- End of function --------------------------------------------------------*/ int main(int argc, char *argv[]) { g722_encode_state_t enc_state; g722_decode_state_t dec_state; int len; int len_comp; int len_comp_upper; int len_data; int len2; int len3; int i; int j; int k; int file; AFfilehandle inhandle; AFfilehandle outhandle; AFfilesetup filesetup; int outframes; int samples; int mode; int itutests; int bit_rate; int eight_k_in; int eight_k_out; float x; int16_t indata[BLOCK_LEN]; int16_t outdata[BLOCK_LEN]; uint8_t adpcmdata[BLOCK_LEN]; i = 1; bit_rate = 64000; eight_k_in = FALSE; eight_k_out = FALSE; itutests = TRUE; while (argc > i) { if (strcmp(argv[i], "-48") == 0) { bit_rate = 48000; itutests = FALSE; i++; } else if (strcmp(argv[i], "-56") == 0) { bit_rate = 56000; itutests = FALSE; i++; } else if (strcmp(argv[i], "-64") == 0) { bit_rate = 64000; itutests = FALSE; i++; } else if (strcmp(argv[i], "-8k8k") == 0) { eight_k_in = TRUE; eight_k_out = TRUE; i++; } else if (strcmp(argv[i], "-8k16k") == 0) { eight_k_in = TRUE; eight_k_out = FALSE; i++; } else if (strcmp(argv[i], "-16k8k") == 0) { eight_k_in = FALSE; eight_k_out = TRUE; i++; } else if (strcmp(argv[i], "-16k16k") == 0) { eight_k_in = FALSE; eight_k_out = FALSE; i++; } else { fprintf(stderr, "Unknown parameter %s specified.\n", argv[i]); exit(2); } } if (itutests) { /* ITU G.722 encode tests, using configuration 1. The QMF is bypassed */ for (file = 0; encode_test_files[file]; file += 2) { printf("Testing %s -> %s\n", encode_test_files[file], encode_test_files[file + 1]); /* Get the input data */ len_data = get_test_vector(encode_test_files[file], (uint16_t *) itu_data, MAX_TEST_VECTOR_LEN); /* Get the reference output data */ len_comp = get_test_vector(encode_test_files[file + 1], itu_ref, MAX_TEST_VECTOR_LEN); /* Process the input data */ /* Skip the reset stuff at each end of the data */ for (i = 0; i < len_data; i++) { if ((itu_data[i] & 1) == 0) break; } for (j = i; j < len_data; j++) { if ((itu_data[j] & 1)) break; } len = j - i; g722_encode_init(&enc_state, 64000, 0); enc_state.itu_test_mode = TRUE; len2 = g722_encode(&enc_state, compressed, itu_data + i, len); /* Check the result against the ITU's reference output data */ j = 0; for (k = 0; k < len2; k++) { if ((compressed[k] & 0xFF) != ((itu_ref[k + i] >> 8) & 0xFF)) { printf(">>> %6d %4x %4x\n", k, compressed[k] & 0xFF, itu_ref[k + i] & 0xFFFF); j++; } } printf("%d bad samples, out of %d/%d samples\n", j, len, len_data); if (j) { printf("Test failed\n"); exit(2); } printf("Test passed\n"); } /* ITU G.722 decode tests, using configuration 2. The QMF is bypassed */ /* Run each of the tests for each of the modes - 48kbps, 56kbps and 64kbps. */ for (mode = 1; mode <= 3; mode++) { for (file = 0; decode_test_files[file]; file += 5) { printf("Testing mode %d, %s -> %s + %s\n", mode, decode_test_files[file], decode_test_files[file + mode], decode_test_files[file + 4]); /* Get the input data */ len_data = get_test_vector(decode_test_files[file], (uint16_t *) itu_data, MAX_TEST_VECTOR_LEN); /* Get the lower reference output data */ len_comp = get_test_vector(decode_test_files[file + mode], itu_ref, MAX_TEST_VECTOR_LEN); /* Get the upper reference output data */ len_comp_upper = get_test_vector(decode_test_files[file + 4], itu_ref_upper, MAX_TEST_VECTOR_LEN); /* Process the input data */ /* Skip the reset stuff at each end of the data */ for (i = 0; i < len_data; i++) { if ((itu_data[i] & 1) == 0) break; } for (j = i; j < len_data; j++) { if ((itu_data[j] & 1)) break; } len = j - i; for (k = 0; k < len; k++) compressed[k] = itu_data[k + i] >> ((mode == 3) ? 10 : (mode == 2) ? 9 : 8); g722_decode_init(&dec_state, (mode == 3) ? 48000 : (mode == 2) ? 56000 : 64000, 0); dec_state.itu_test_mode = TRUE; len2 = g722_decode(&dec_state, decompressed, compressed, len); /* Check the result against the ITU's reference output data */ j = 0; for (k = 0; k < len2; k += 2) { if ((decompressed[k] & 0xFFFF) != (itu_ref[(k >> 1) + i] & 0xFFFF) || (decompressed[k + 1] & 0xFFFF) != (itu_ref_upper[(k >> 1) + i] & 0xFFFF)) { printf(">>> %6d %4x %4x %4x %4x\n", k >> 1, decompressed[k] & 0xFFFF, decompressed[k + 1] & 0xFFFF, itu_ref[(k >> 1) + i] & 0xFFFF, itu_ref_upper[(k >> 1) + i] & 0xFFFF); j++; } } printf("%d bad samples, out of %d/%d samples\n", j, len, len_data); if (j) { printf("Test failed\n"); exit(2); } printf("Test passed\n"); } } printf("Tests passed.\n"); } else { if (eight_k_in) { if ((inhandle = afOpenFile(EIGHTK_IN_FILE_NAME, "r", NULL)) == AF_NULL_FILEHANDLE) { fprintf(stderr, " Cannot open wave file '%s'\n", EIGHTK_IN_FILE_NAME); exit(2); } if ((x = afGetFrameSize(inhandle, AF_DEFAULT_TRACK, 1)) != 2.0) { fprintf(stderr, " Unexpected frame size in wave file '%s'\n", EIGHTK_IN_FILE_NAME); exit(2); } if ((x = afGetRate(inhandle, AF_DEFAULT_TRACK)) != (float) SAMPLE_RATE) { fprintf(stderr, " Unexpected sample rate %f in wave file '%s'\n", x, EIGHTK_IN_FILE_NAME); exit(2); } if ((x = afGetChannels(inhandle, AF_DEFAULT_TRACK)) != 1.0) { fprintf(stderr, " Unexpected number of channels in wave file '%s'\n", EIGHTK_IN_FILE_NAME); exit(2); } } else { if ((inhandle = afOpenFile(IN_FILE_NAME, "r", NULL)) == AF_NULL_FILEHANDLE) { fprintf(stderr, " Cannot open wave file '%s'\n", IN_FILE_NAME); exit(2); } if ((x = afGetFrameSize(inhandle, AF_DEFAULT_TRACK, 1)) != 2.0) { fprintf(stderr, " Unexpected frame size in wave file '%s'\n", IN_FILE_NAME); exit(2); } if ((x = afGetRate(inhandle, AF_DEFAULT_TRACK)) != (float) G722_SAMPLE_RATE) { fprintf(stderr, " Unexpected sample rate %f in wave file '%s'\n", x, IN_FILE_NAME); exit(2); } if ((x = afGetChannels(inhandle, AF_DEFAULT_TRACK)) != 1.0) { fprintf(stderr, " Unexpected number of channels in wave file '%s'\n", IN_FILE_NAME); exit(2); } } if ((filesetup = afNewFileSetup()) == AF_NULL_FILESETUP) { fprintf(stderr, " Failed to create file setup\n"); exit(2); } afInitSampleFormat(filesetup, AF_DEFAULT_TRACK, AF_SAMPFMT_TWOSCOMP, 16); if (eight_k_out) afInitRate(filesetup, AF_DEFAULT_TRACK, (float) SAMPLE_RATE); else afInitRate(filesetup, AF_DEFAULT_TRACK, (float) G722_SAMPLE_RATE); afInitFileFormat(filesetup, AF_FILE_WAVE); afInitChannels(filesetup, AF_DEFAULT_TRACK, 1); if ((outhandle = afOpenFile(OUT_FILE_NAME, "w", filesetup)) == AF_NULL_FILEHANDLE) { fprintf(stderr, " Cannot create wave file '%s'\n", OUT_FILE_NAME); exit(2); } if (eight_k_in) g722_encode_init(&enc_state, bit_rate, G722_PACKED | G722_SAMPLE_RATE_8000); else g722_encode_init(&enc_state, bit_rate, G722_PACKED); if (eight_k_out) g722_decode_init(&dec_state, bit_rate, G722_PACKED | G722_SAMPLE_RATE_8000); else g722_decode_init(&dec_state, bit_rate, G722_PACKED); for (;;) { samples = afReadFrames(inhandle, AF_DEFAULT_TRACK, indata, BLOCK_LEN); if (samples <= 0) break; len2 = g722_encode(&enc_state, adpcmdata, indata, samples); len3 = g722_decode(&dec_state, outdata, adpcmdata, len2); outframes = afWriteFrames(outhandle, AF_DEFAULT_TRACK, outdata, len3); if (outframes != len3) { fprintf(stderr, " Error writing wave file\n"); exit(2); } } if (afCloseFile(inhandle)) { fprintf(stderr, " Cannot close wave file '%s'\n", IN_FILE_NAME); exit(2); } if (afCloseFile(outhandle)) { fprintf(stderr, " Cannot close wave file '%s'\n", OUT_FILE_NAME); exit(2); } afFreeFileSetup(filesetup); printf("'%s' transcoded to '%s' at %dbps.\n", IN_FILE_NAME, OUT_FILE_NAME, bit_rate); } return 0; } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/tests/r2_mf_rx_tests.c0000644000175000017500000004504211150047203021335 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * r2_mf_tests.c - Test the R2 MF detector against the spec., whatever the * spec. may be :) * * Written by Steve Underwood * * Copyright (C) 2003 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2, as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: r2_mf_rx_tests.c,v 1.10 2008/05/13 13:17:26 steveu Exp $ */ /*! \file */ /*! \page r2_mf_tests_page R2 MF tone generation and detection tests \section r2_mf_tests_page_sec_1 What does it do? These tests are fashioned after those on the CM7291 test tape from Mitel. Those tests are for DTMF, rather than R2 MF, but make a fair starting point for a set of meaningful tests of R2 MF. These tests include conversion to and from A-law. It is assumed the distortion this produces is comparable to u-law, so it should be a fair test of performance in a real PSTN channel. */ #if defined(HAVE_CONFIG_H) #include "config.h" #endif #include #include #include #include #include #include #include "spandsp.h" /* R2 tone generation specs. * Power: -11.5dBm +- 1dB * Frequency: within +-4Hz * Mismatch between the start time of a pair of tones: <=1ms. * Mismatch between the end time of a pair of tones: <=1ms. */ /* Basic MFC/R2 tone detection specs: * Receiver response range: -5dBm to -35dBm * Difference in level for a pair of frequencies * Adjacent tones: <5dB * Non-adjacent tones: <7dB * Receiver not to detect a signal of 2 frequencies of level -5dB and * duration <7ms. * Receiver not to recognise a signal of 2 frequencies having a difference * in level >=20dB. * Max received signal frequency error: +-10Hz * The sum of the operate and release times of a 2 frequency signal not to * exceed 80ms (there are no individual specs for the operate and release * times). * Receiver not to release for signal interruptions <=7ms. * System malfunction due to signal interruptions >7ms (typically 20ms) is * prevented by further logic elements. */ #define MF_DURATION (68*8) #define MF_PAUSE (68*8) #define MF_CYCLE (MF_DURATION + MF_PAUSE) typedef struct { float f1; /* First freq */ float f2; /* Second freq */ int8_t level1; /* Level of the first freq (dB) */ int8_t level2; /* Level of the second freq (dB) */ uint8_t on_time; /* Tone on time (ms) */ uint8_t off_time; /* Minimum post tone silence (ms) */ } mf_digit_tones_t; static const mf_digit_tones_t r2_mf_fwd_tones[] = { {1380.0, 1500.0, -11, -11, 1, 0}, {1380.0, 1620.0, -11, -11, 1, 0}, {1500.0, 1620.0, -11, -11, 1, 0}, {1380.0, 1740.0, -11, -11, 1, 0}, {1500.0, 1740.0, -11, -11, 1, 0}, {1620.0, 1740.0, -11, -11, 1, 0}, {1380.0, 1860.0, -11, -11, 1, 0}, {1500.0, 1860.0, -11, -11, 1, 0}, {1620.0, 1860.0, -11, -11, 1, 0}, {1740.0, 1860.0, -11, -11, 1, 0}, {1380.0, 1980.0, -11, -11, 1, 0}, {1500.0, 1980.0, -11, -11, 1, 0}, {1620.0, 1980.0, -11, -11, 1, 0}, {1740.0, 1980.0, -11, -11, 1, 0}, {1860.0, 1980.0, -11, -11, 1, 0}, {0.0, 0.0, 0, 0, 0, 0} }; static const mf_digit_tones_t r2_mf_back_tones[] = { {1140.0, 1020.0, -11, -11, 1, 0}, {1140.0, 900.0, -11, -11, 1, 0}, {1020.0, 900.0, -11, -11, 1, 0}, {1140.0, 780.0, -11, -11, 1, 0}, {1020.0, 780.0, -11, -11, 1, 0}, { 900.0, 780.0, -11, -11, 1, 0}, {1140.0, 660.0, -11, -11, 1, 0}, {1020.0, 660.0, -11, -11, 1, 0}, { 900.0, 660.0, -11, -11, 1, 0}, { 780.0, 660.0, -11, -11, 1, 0}, {1140.0, 540.0, -11, -11, 1, 0}, {1020.0, 540.0, -11, -11, 1, 0}, { 900.0, 540.0, -11, -11, 1, 0}, { 780.0, 540.0, -11, -11, 1, 0}, { 660.0, 540.0, -11, -11, 1, 0}, {0.0, 0.0, 0, 0, 0, 0} }; static tone_gen_descriptor_t my_mf_digit_tones[16]; static char r2_mf_tone_codes[] = "1234567890BCDEF"; int callback_ok; int callback_roll; static void my_mf_gen_init(float low_fudge, int low_level, float high_fudge, int high_level, int duration, int fwd) { const mf_digit_tones_t *tone; int i; for (i = 0; i < 15; i++) { if (fwd) tone = &r2_mf_fwd_tones[i]; else tone = &r2_mf_back_tones[i]; make_tone_gen_descriptor(&my_mf_digit_tones[i], tone->f1*(1.0 + low_fudge), low_level, tone->f2*(1.0 + high_fudge), high_level, duration, 0, 0, 0, FALSE); } } /*- End of function --------------------------------------------------------*/ static int my_mf_generate(int16_t amp[], char digit) { int len; char *cp; tone_gen_state_t tone; len = 0; if ((cp = strchr(r2_mf_tone_codes, digit))) { tone_gen_init(&tone, &my_mf_digit_tones[cp - r2_mf_tone_codes]); len += tone_gen(&tone, amp + len, 9999); } return len; } /*- End of function --------------------------------------------------------*/ static void codec_munge(int16_t amp[], int len) { int i; uint8_t alaw; for (i = 0; i < len; i++) { alaw = linear_to_alaw (amp[i]); amp[i] = alaw_to_linear (alaw); } } /*- End of function --------------------------------------------------------*/ static void digit_delivery(void *data, int digit, int level, int delay) { char ch; if (data != (void *) 0x12345678) { callback_ok = FALSE; return; } if ((callback_roll & 1)) ch = 0; else ch = r2_mf_tone_codes[callback_roll >> 1]; if (ch == digit) callback_ok = TRUE; else callback_ok = FALSE; if (r2_mf_tone_codes[callback_roll >> 1]) callback_roll++; else callback_ok = FALSE; } /*- End of function --------------------------------------------------------*/ static int test_a_tone_set(int fwd) { int i; int j; int len; int sample; const char *s; char digit; int actual; int nplus; int nminus; float rrb; float rcfo; int16_t amp[100000]; r2_mf_rx_state_t mf_state; awgn_state_t noise_source; const mf_digit_tones_t *tone; if (fwd) tone = &r2_mf_fwd_tones[0]; else tone = &r2_mf_back_tones[0]; r2_mf_rx_init(&mf_state, fwd, NULL, NULL); /* Test 1: Mitel's test 1 isn't really a test. Its a calibration step, which has no meaning here. */ printf ("Test 1: Calibration\n"); printf (" Passed\n"); /* Test 2: Decode check This is a sanity check, that all digits are reliably detected under ideal conditions. Each possible digit is repeated 10 times, with 68ms bursts. The level of each tone is about 6dB down from clip */ printf ("Test 2: Decode check\n"); my_mf_gen_init(0.0, -3, 0.0, -3, 68, fwd); s = r2_mf_tone_codes; while (*s) { digit = *s++; for (i = 0; i < 10; i++) { len = my_mf_generate(amp, digit); codec_munge (amp, len); r2_mf_rx(&mf_state, amp, len); actual = r2_mf_rx_get(&mf_state); if (actual != digit) { printf (" Sent '%c'\n", digit); printf (" Received 0x%X\n", actual); printf (" Failed\n"); exit (2); } } } printf (" Passed\n"); /* Test 3: Recognition bandwidth and channel centre frequency check. Use all digits. Each digit types requires four tests to complete the check. Each section contains 40 pulses of 68ms duration, with an amplitude of -20dB from clip per frequency. Four sections covering the tests for one tone (1 digit) are: a. H frequency at 0% deviation from center, L frequency at +0.1%. L frequency is then increments in +01.% steps up to +4%. The number of tone bursts is noted and designated N+. b. H frequency at 0% deviation, L frequency at -0.1%. L frequency is then incremental in -0.1% steps, up to -4%. The number of tone bursts is noted and designated N-. c. The test in (a) is repeated with the L frequency at 0% and the H frequency varied up to +4%. d. The test in (b) is repeated with the L frequency and 0% and the H frequency varied to -4%. Receiver Recognition Bandwidth (RRB) is calculated as follows: RRB% = (N+ + N-)/10 Receiver Center Frequency Offset (RCFO) is calculated as follows: RCFO% = X + (N+ - N-)/20 Note that this test doesn't test what it says it is testing at all, and the results are quite inaccurate, if not a downright lie! However, it follows the Mitel procedure, so how can it be bad? :) The spec calls for +-4 +-10Hz (ie +-14Hz) of bandwidth. */ printf ("Test 3: Recognition bandwidth and channel centre frequency check\n"); s = r2_mf_tone_codes; j = 0; while (*s) { digit = *s++; for (nplus = 0, i = 1; i <= 60; i++) { my_mf_gen_init((float) i/1000.0, -17, 0.0, -17, 68, fwd); len = my_mf_generate(amp, digit); codec_munge(amp, len); r2_mf_rx(&mf_state, amp, len); if (r2_mf_rx_get(&mf_state) == digit) nplus++; } for (nminus = 0, i = -1; i >= -60; i--) { my_mf_gen_init((float) i/1000.0, -17, 0.0, -17, 68, fwd); len = my_mf_generate(amp, digit); codec_munge(amp, len); r2_mf_rx(&mf_state, amp, len); if (r2_mf_rx_get(&mf_state) == digit) nminus++; } rrb = (float) (nplus + nminus)/10.0; rcfo = (float) (nplus - nminus)/10.0; printf (" %c (low) rrb = %5.2f%%, rcfo = %5.2f%%, max -ve = %5.2f, max +ve = %5.2f\n", digit, rrb, rcfo, (float) nminus/10.0, (float) nplus/10.0); if (rrb < rcfo + (2.0*100.0*14.0/r2_mf_fwd_tones[j].f1) || rrb >= 15.0 + rcfo) { printf (" Failed\n"); exit (2); } for (nplus = 0, i = 1; i <= 60; i++) { my_mf_gen_init(0.0, -17, (float) i/1000.0, -17, 68, fwd); len = my_mf_generate(amp, digit); codec_munge(amp, len); r2_mf_rx(&mf_state, amp, len); if (r2_mf_rx_get(&mf_state) == digit) nplus++; } for (nminus = 0, i = -1; i >= -60; i--) { my_mf_gen_init(0.0, -17, (float) i/1000.0, -17, 68, fwd); len = my_mf_generate(amp, digit); codec_munge(amp, len); r2_mf_rx(&mf_state, amp, len); if (r2_mf_rx_get(&mf_state) == digit) nminus++; } rrb = (float) (nplus + nminus)/10.0; rcfo = (float) (nplus - nminus)/10.0; printf (" %c (high) rrb = %5.2f%%, rcfo = %5.2f%%, max -ve = %5.2f, max +ve = %5.2f\n", digit, rrb, rcfo, (float) nminus/10.0, (float) nplus/10.0); if (rrb < rcfo + (2.0*100.0*14.0/r2_mf_fwd_tones[j].f2) || rrb >= 15.0 + rcfo) { printf (" Failed\n"); exit (2); } j++; } printf (" Passed\n"); /* Test 4: Acceptable amplitude ratio (twist). Twist all digits in both directions, and check the maximum twist we can accept. The way this is done is styled after the Mitel DTMF test, and has good and bad points. */ printf ("Test 4: Acceptable amplitude ratio (twist)\n"); s = r2_mf_tone_codes; while (*s) { digit = *s++; for (nplus = 0, i = -50; i >= -250; i--) { my_mf_gen_init(0.0, -5, 0.0, i/10, 68, fwd); len = my_mf_generate(amp, digit); codec_munge (amp, len); r2_mf_rx(&mf_state, amp, len); if (r2_mf_rx_get(&mf_state) == digit) nplus++; } printf (" %c normal twist = %.2fdB\n", digit, (float) nplus/10.0); if (nplus < 70) { printf (" Failed\n"); exit (2); } for (nminus = 0, i = -50; i >= -250; i--) { my_mf_gen_init(0.0, i/10, 0.0, -5, 68, fwd); len = my_mf_generate(amp, digit); codec_munge(amp, len); r2_mf_rx(&mf_state, amp, len); if (r2_mf_rx_get(&mf_state) == digit) nminus++; } printf (" %c reverse twist = %.2fdB\n", digit, (float) nminus/10.0); if (nminus < 70) { printf (" Failed\n"); exit (2); } } printf (" Passed\n"); /* Test 5: Dynamic range This test sends all possible digits, with gradually increasing amplitude. We determine the span over which we achieve reliable detection. */ printf ("Test 5: Dynamic range\n"); for (nplus = nminus = -1000, i = -50; i <= 3; i++) { s = r2_mf_tone_codes; while (*s) { digit = *s++; my_mf_gen_init(0.0, i, 0.0, i, 68, fwd); for (j = 0; j < 100; j++) { len = my_mf_generate(amp, digit); codec_munge(amp, len); r2_mf_rx(&mf_state, amp, len); if (r2_mf_rx_get(&mf_state) != digit) break; } if (j < 100) break; } if (j == 100) { if (nplus == -1000) nplus = i; } else { if (nplus != -1000 && nminus == -1000) nminus = i; } } printf (" Dynamic range = %ddB to %ddB\n", nplus, nminus - 1); if (nplus > -35 || nminus <= -5) { printf(" Failed\n"); exit(2); } printf (" Passed\n"); /* Test 6: Guard time This test sends all possible digits, with a gradually reducing duration. */ printf ("Test 6: Guard time\n"); for (i = 30; i < 62; i++) { s = r2_mf_tone_codes; j = 0; while (*s) { digit = *s++; my_mf_gen_init(0.0, -5, 0.0, -3, i, fwd); for (j = 0; j < 500; j++) { len = my_mf_generate(amp, digit); codec_munge(amp, len); r2_mf_rx(&mf_state, amp, len); if (r2_mf_rx_get(&mf_state) != digit) break; } if (j < 500) break; } if (j == 500) break; } printf (" Guard time = %dms\n", i); if (i > 61) { printf(" Failed\n"); exit(2); } printf (" Passed\n"); /* Test 7: Acceptable signal to noise ratio We send all possible digits at -6dBm from clip, mixed with AWGN. We gradually reduce the noise until we get clean detection. */ printf ("Test 7: Acceptable signal to noise ratio\n"); my_mf_gen_init(0.0, -3, 0.0, -3, 68, fwd); for (i = -3; i > -50; i--) { s = r2_mf_tone_codes; while (*s) { digit = *s++; awgn_init_dbm0(&noise_source, 1234567, (float) i); for (j = 0; j < 500; j++) { len = my_mf_generate(amp, digit); for (sample = 0; sample < len; sample++) amp[sample] = saturate(amp[sample] + awgn(&noise_source)); codec_munge(amp, len); r2_mf_rx(&mf_state, amp, len); if (r2_mf_rx_get(&mf_state) != digit) break; } if (j < 500) break; } if (j == 500) break; } printf(" Acceptable S/N ratio is %ddB\n", -3 - i); if (-3 - i > 26) { printf(" Failed\n"); exit(2); } printf(" Passed\n"); printf("Test 8: Callback digit delivery mode.\n"); callback_ok = FALSE; callback_roll = 0; r2_mf_rx_init(&mf_state, fwd, digit_delivery, (void *) 0x12345678); my_mf_gen_init(0.0, -3, 0.0, -3, 68, fwd); s = r2_mf_tone_codes; awgn_init_dbm0(&noise_source, 1234567, -40.0f); while (*s) { digit = *s++; len = my_mf_generate(amp, digit); for (sample = 0; sample < len; sample++) amp[sample] = saturate(amp[sample] + awgn(&noise_source)); codec_munge(amp, len); r2_mf_rx(&mf_state, amp, len); len = 160; memset(amp, '\0', len*sizeof(int16_t)); for (sample = 0; sample < len; sample++) amp[sample] = saturate(amp[sample] + awgn(&noise_source)); codec_munge(amp, len); r2_mf_rx(&mf_state, amp, len); } if (!callback_ok) { printf(" Failed\n"); exit (2); } printf(" Passed\n"); /* The remainder of the Mitel tape is the talk-off test. This is meaningless for R2 MF. However the decoder's tolerance of out of band noise is significant. */ /* TODO: add a OOB tolerance test. */ return 0; } /*- End of function --------------------------------------------------------*/ int main(int argc, char *argv[]) { time_t now; time_t duration; now = time(NULL); printf("R2 forward tones\n"); test_a_tone_set(TRUE); printf("R2 backward tones\n"); test_a_tone_set(FALSE); duration = time(NULL) - now; printf ("Tests passed in %lds\n", duration); return 0; } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/tests/awgn_tests.c0000644000175000017500000001063211150047203020550 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * awgn_tests.c * * Written by Steve Underwood * * Copyright (C) 2001 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2, as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: awgn_tests.c,v 1.17 2008/05/13 13:17:25 steveu Exp $ */ /*! \page awgn_tests_page AWGN tests \section awgn_tests_page_sec_1 What does it do? */ #if defined(HAVE_CONFIG_H) #include "config.h" #endif #include #include #include #include "spandsp.h" #if !defined(M_PI) # define M_PI 3.14159265358979323846 /* pi */ #endif #define OUT_FILE_NAME "awgn.wav" /* Some simple sanity tests for the Gaussian noise generation routines */ int main (int argc, char *argv[]) { int i; int j; int clip_high; int clip_low; int total_samples; int idum = 1234567; int16_t value; double total; double x; double p; double o; double error; int bins[65536]; awgn_state_t noise_source; /* Generate noise at several RMS levels between -50dBm and 0dBm. Noise is generated for a large number of samples (1,000,000), and the RMS value of the noise is calculated along the way. If the resulting level is close to the requested RMS level, at least the scaling of the noise should be Ok. At high level some clipping may distort the result a little. */ for (j = -50; j <= 0; j += 5) { clip_high = 0; clip_low = 0; total = 0.0; awgn_init_dbm0(&noise_source, idum, (float) j); total_samples = 1000000; for (i = 0; i < total_samples; i++) { value = awgn(&noise_source); if (value == 32767) clip_high++; else if (value == -32768) clip_low++; total += ((double) value)*((double) value); } error = 100.0*(1.0 - sqrt(total/total_samples)/noise_source.rms); printf("RMS = %.3f (expected %d) %.2f%% error [clipped samples %d+%d]\n", log10(sqrt(total/total_samples)/32768.0)*20.0 + DBM0_MAX_POWER, j, error, clip_low, clip_high); /* We don't check the result at 0dBm0, as there will definitely be a lot of error due to clipping */ if (j < 0 && fabs(error) > 0.2) { printf("Test failed.\n"); exit(2); } } /* Now look at the statistical spread of the results, by collecting data in bins from a large number of samples. Use a fairly high noise level, but low enough to avoid significant clipping. Use the Gaussian model to predict the real probability, and present the results for graphing. */ memset(bins, 0, sizeof(bins)); clip_high = 0; clip_low = 0; awgn_init_dbm0(&noise_source, idum, -15); total_samples = 10000000; for (i = 0; i < total_samples; i++) { value = awgn(&noise_source); if (value == 32767) clip_high++; else if (value == -32768) clip_low++; bins[value + 32768]++; } o = noise_source.rms; for (i = 0; i < 65536 - 10; i++) { x = i - 32768; /* Find the real probability for this bin */ p = (1.0/(o*sqrt(2.0*M_PI)))*exp(-(x*x)/(2.0*o*o)); /* Now do a little smoothing on the real data to get a reasonably steady answer */ x = 0; for (j = 0; j < 10; j++) x += bins[i + j]; x /= 10.0; x /= total_samples; /* Now send it out for graphing. */ printf("%6d %.7f %.7f\n", i - 32768, x, p); } printf("Tests passed.\n"); return 0; } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/tests/line_model_tests.c0000644000175000017500000002607411150047203021732 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * line_model_tests.c - Tests for the telephone line model. * * Written by Steve Underwood * * Copyright (C) 2004 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2, as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: line_model_tests.c,v 1.24 2008/05/13 13:17:26 steveu Exp $ */ /*! \page line_model_tests_page Telephony line model tests \section line_model_tests_page_sec_1 What does it do? ???. \section line_model_tests_page_sec_2 How does it work? ???. */ #if defined(HAVE_CONFIG_H) #include "config.h" #endif #include #include #include #include #include #include #include #include "spandsp.h" #include "spandsp-sim.h" #if !defined(NULL) #define NULL (void *) 0 #endif #define BLOCK_LEN 160 #define OUT_FILE_COMPLEXIFY "complexify.wav" #define IN_FILE_NAME1 "line_model_test_in1.wav" #define IN_FILE_NAME2 "line_model_test_in2.wav" #define OUT_FILE_NAME1 "line_model_one_way_test_out.wav" #define OUT_FILE_NAME "line_model_test_out.wav" int channel_codec; int rbs_pattern; static void complexify_tests(void) { complexify_state_t *s; complexf_t cc; int16_t amp; int i; AFfilehandle outhandle; AFfilesetup filesetup; int outframes; int16_t out[40000]; awgn_state_t noise1; if ((filesetup = afNewFileSetup()) == AF_NULL_FILESETUP) { fprintf(stderr, " Failed to create file setup\n"); exit(2); } afInitSampleFormat(filesetup, AF_DEFAULT_TRACK, AF_SAMPFMT_TWOSCOMP, 16); afInitRate(filesetup, AF_DEFAULT_TRACK, (float) SAMPLE_RATE); afInitFileFormat(filesetup, AF_FILE_WAVE); afInitChannels(filesetup, AF_DEFAULT_TRACK, 2); if ((outhandle = afOpenFile(OUT_FILE_COMPLEXIFY, "w", filesetup)) == AF_NULL_FILEHANDLE) { fprintf(stderr, " Cannot create wave file '%s'\n", OUT_FILE_COMPLEXIFY); exit(2); } awgn_init_dbm0(&noise1, 1234567, -10.0f); s = complexify_init(); for (i = 0; i < 20000; i++) { amp = awgn(&noise1); cc = complexify(s, amp); out[2*i] = cc.re; out[2*i + 1] = cc.im; } outframes = afWriteFrames(outhandle, AF_DEFAULT_TRACK, out, 20000); if (outframes != 20000) { fprintf(stderr, " Error writing wave file\n"); exit(2); } if (afCloseFile(outhandle)) { fprintf(stderr, " Cannot close wave file '%s'\n", OUT_FILE_COMPLEXIFY); exit(2); } afFreeFileSetup(filesetup); } /*- End of function --------------------------------------------------------*/ static void test_one_way_model(int line_model_no, int speech_test) { one_way_line_model_state_t *model; int16_t input1[BLOCK_LEN]; int16_t output1[BLOCK_LEN]; int16_t amp[2*BLOCK_LEN]; AFfilehandle inhandle1; AFfilehandle outhandle; AFfilesetup filesetup; int outframes; int samples; int i; int j; awgn_state_t noise1; if ((model = one_way_line_model_init(line_model_no, -50, channel_codec, rbs_pattern)) == NULL) { fprintf(stderr, " Failed to create line model\n"); exit(2); } awgn_init_dbm0(&noise1, 1234567, -10.0f); if ((filesetup = afNewFileSetup()) == AF_NULL_FILESETUP) { fprintf(stderr, " Failed to create file setup\n"); exit(2); } afInitSampleFormat(filesetup, AF_DEFAULT_TRACK, AF_SAMPFMT_TWOSCOMP, 16); afInitRate(filesetup, AF_DEFAULT_TRACK, (float) SAMPLE_RATE); afInitFileFormat(filesetup, AF_FILE_WAVE); afInitChannels(filesetup, AF_DEFAULT_TRACK, 1); if ((inhandle1 = afOpenFile(IN_FILE_NAME1, "r", NULL)) == AF_NULL_FILEHANDLE) { fprintf(stderr, " Cannot open wave file '%s'\n", IN_FILE_NAME1); exit(2); } if ((outhandle = afOpenFile(OUT_FILE_NAME1, "w", filesetup)) == AF_NULL_FILEHANDLE) { fprintf(stderr, " Cannot create wave file '%s'\n", OUT_FILE_NAME1); exit(2); } for (i = 0; i < 10000; i++) { if (speech_test) { samples = afReadFrames(inhandle1, AF_DEFAULT_TRACK, input1, BLOCK_LEN); if (samples == 0) break; } else { for (j = 0; j < BLOCK_LEN; j++) input1[j] = awgn(&noise1); samples = BLOCK_LEN; } for (j = 0; j < samples; j++) { one_way_line_model(model, &output1[j], &input1[j], 1); amp[j] = output1[j]; } outframes = afWriteFrames(outhandle, AF_DEFAULT_TRACK, amp, samples); if (outframes != samples) { fprintf(stderr, " Error writing wave file\n"); exit(2); } } if (afCloseFile(inhandle1)) { fprintf(stderr, " Cannot close wave file '%s'\n", IN_FILE_NAME1); exit(2); } if (afCloseFile(outhandle)) { fprintf(stderr, " Cannot close wave file '%s'\n", OUT_FILE_NAME1); exit(2); } afFreeFileSetup(filesetup); one_way_line_model_release(model); } /*- End of function --------------------------------------------------------*/ static void test_both_ways_model(int line_model_no, int speech_test) { both_ways_line_model_state_t *model; int16_t input1[BLOCK_LEN]; int16_t input2[BLOCK_LEN]; int16_t output1[BLOCK_LEN]; int16_t output2[BLOCK_LEN]; int16_t amp[2*BLOCK_LEN]; AFfilehandle inhandle1; AFfilehandle inhandle2; AFfilehandle outhandle; AFfilesetup filesetup; int outframes; int samples; int i; int j; awgn_state_t noise1; awgn_state_t noise2; if ((model = both_ways_line_model_init(line_model_no, -50, line_model_no + 1, -35, channel_codec, rbs_pattern)) == NULL) { fprintf(stderr, " Failed to create line model\n"); exit(2); } awgn_init_dbm0(&noise1, 1234567, -10.0f); awgn_init_dbm0(&noise2, 1234567, -10.0f); filesetup = afNewFileSetup(); if (filesetup == AF_NULL_FILESETUP) { fprintf(stderr, " Failed to create file setup\n"); exit(2); } afInitSampleFormat(filesetup, AF_DEFAULT_TRACK, AF_SAMPFMT_TWOSCOMP, 16); afInitRate(filesetup, AF_DEFAULT_TRACK, (float) SAMPLE_RATE); afInitFileFormat(filesetup, AF_FILE_WAVE); afInitChannels(filesetup, AF_DEFAULT_TRACK, 2); inhandle1 = afOpenFile(IN_FILE_NAME1, "r", NULL); if (inhandle1 == AF_NULL_FILEHANDLE) { fprintf(stderr, " Cannot open wave file '%s'\n", IN_FILE_NAME1); exit(2); } inhandle2 = afOpenFile(IN_FILE_NAME2, "r", NULL); if (inhandle2 == AF_NULL_FILEHANDLE) { fprintf(stderr, " Cannot open wave file '%s'\n", IN_FILE_NAME2); exit(2); } outhandle = afOpenFile(OUT_FILE_NAME, "w", filesetup); if (outhandle == AF_NULL_FILEHANDLE) { fprintf(stderr, " Cannot create wave file '%s'\n", OUT_FILE_NAME); exit(2); } for (i = 0; i < 10000; i++) { if (speech_test) { samples = afReadFrames(inhandle1, AF_DEFAULT_TRACK, input1, BLOCK_LEN); if (samples == 0) break; samples = afReadFrames(inhandle2, AF_DEFAULT_TRACK, input2, samples); if (samples == 0) break; } else { for (j = 0; j < BLOCK_LEN; j++) { input1[j] = awgn(&noise1); input2[j] = awgn(&noise2); } samples = BLOCK_LEN; } for (j = 0; j < samples; j++) { both_ways_line_model(model, &output1[j], &input1[j], &output2[j], &input2[j], 1); amp[2*j] = output1[j]; amp[2*j + 1] = output2[j]; } outframes = afWriteFrames(outhandle, AF_DEFAULT_TRACK, amp, samples); if (outframes != samples) { fprintf(stderr, " Error writing wave file\n"); exit(2); } } if (afCloseFile(inhandle1)) { fprintf(stderr, " Cannot close wave file '%s'\n", IN_FILE_NAME1); exit(2); } if (afCloseFile(inhandle2)) { fprintf(stderr, " Cannot close wave file '%s'\n", IN_FILE_NAME2); exit(2); } if (afCloseFile(outhandle)) { fprintf(stderr, " Cannot close wave file '%s'\n", OUT_FILE_NAME); exit(2); } afFreeFileSetup(filesetup); both_ways_line_model_release(model); } /*- End of function --------------------------------------------------------*/ int main(int argc, char *argv[]) { int line_model_no; int speech_test; int log_audio; int i; line_model_no = 0; speech_test = FALSE; log_audio = FALSE; channel_codec = MUNGE_CODEC_NONE; for (i = 1; i < argc; i++) { if (strcmp(argv[i], "-c") == 0) { channel_codec = atoi(argv[++i]); continue; } if (strcmp(argv[i], "-l") == 0) { log_audio = TRUE; continue; } if (strcmp(argv[i], "-m") == 0) { line_model_no = atoi(argv[++i]); continue; } if (strcmp(argv[i], "-r") == 0) { rbs_pattern = atoi(argv[++i]); continue; } if (strcmp(argv[i], "-s") == 0) { speech_test = TRUE; continue; } } complexify_tests(); test_one_way_model(line_model_no, speech_test); test_both_ways_model(line_model_no, speech_test); } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/tests/v42bis_tests.c0000644000175000017500000001217411150047203020730 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * v42bis_tests.c * * Written by Steve Underwood * * Copyright (C) 2005 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2, as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: v42bis_tests.c,v 1.23 2008/05/13 13:17:27 steveu Exp $ */ /* THIS IS A WORK IN PROGRESS. IT IS NOT FINISHED. */ /*! \page v42bis_tests_page V.42bis tests \section v42bis_tests_page_sec_1 What does it do? These tests compress the contents of a file specified on the command line, writing the compressed data to v42bis_tests.v42bis. They then read back the contents of the compressed file, decompress, and write the results to v42bis_tests.out. The contents of this file should exactly match the original file. */ #if defined(HAVE_CONFIG_H) #include #endif #include #include #include #include #include #include #include #include #include "spandsp.h" #define COMPRESSED_FILE_NAME "v42bis_tests.v42bis" #define OUTPUT_FILE_NAME "v42bis_tests.out" int in_octets_to_date = 0; int out_octets_to_date = 0; static void frame_handler(void *user_data, const uint8_t *buf, int len) { int ret; if ((ret = write((intptr_t) user_data, buf, len)) != len) fprintf(stderr, "Write error %d/%d\n", ret, errno); out_octets_to_date += len; } static void data_handler(void *user_data, const uint8_t *buf, int len) { int ret; if ((ret = write((intptr_t) user_data, buf, len)) != len) fprintf(stderr, "Write error %d/%d\n", ret, errno); out_octets_to_date += len; } int main(int argc, char *argv[]) { int len; v42bis_state_t state_a; v42bis_state_t state_b; uint8_t buf[1024]; int in_fd; int v42bis_fd; int out_fd; int do_compression; int do_decompression; time_t now; do_compression = TRUE; do_decompression = TRUE; if (argc < 2) { fprintf(stderr, "Usage: %s \n", argv[0]); exit(2); } if (do_compression) { if ((in_fd = open(argv[1], O_RDONLY)) < 0) { fprintf(stderr, "Error opening file '%s'.\n", argv[1]); exit(2); } if ((v42bis_fd = open(COMPRESSED_FILE_NAME, O_WRONLY | O_CREAT | O_TRUNC, 0666)) < 0) { fprintf(stderr, "Error opening file '%s'.\n", COMPRESSED_FILE_NAME); exit(2); } time(&now); v42bis_init(&state_a, 3, 512, 6, frame_handler, (void *) (intptr_t) v42bis_fd, 512, data_handler, NULL, 512); v42bis_compression_control(&state_a, V42BIS_COMPRESSION_MODE_ALWAYS); in_octets_to_date = 0; out_octets_to_date = 0; while ((len = read(in_fd, buf, 1024)) > 0) { if (v42bis_compress(&state_a, buf, len)) { fprintf(stderr, "Bad return code from compression\n"); exit(2); } in_octets_to_date += len; } v42bis_compress_flush(&state_a); printf("%d bytes compressed to %d bytes in %lds\n", in_octets_to_date, out_octets_to_date, time(NULL) - now); close(in_fd); close(v42bis_fd); } if (do_decompression) { /* Now open the files for the decompression. */ if ((v42bis_fd = open(COMPRESSED_FILE_NAME, O_RDONLY)) < 0) { fprintf(stderr, "Error opening file '%s'.\n", COMPRESSED_FILE_NAME); exit(2); } if ((out_fd = open(OUTPUT_FILE_NAME, O_WRONLY | O_CREAT | O_TRUNC, 0666)) < 0) { fprintf(stderr, "Error opening file '%s'.\n", OUTPUT_FILE_NAME); exit(2); } time(&now); v42bis_init(&state_b, 3, 512, 6, frame_handler, (void *) (intptr_t) v42bis_fd, 512, data_handler, (void *) (intptr_t) out_fd, 512); in_octets_to_date = 0; out_octets_to_date = 0; while ((len = read(v42bis_fd, buf, 1024)) > 0) { if (v42bis_decompress(&state_b, buf, len)) { fprintf(stderr, "Bad return code from decompression\n"); exit(2); } in_octets_to_date += len; } v42bis_decompress_flush(&state_b); printf("%d bytes decompressed to %d bytes in %lds\n", in_octets_to_date, out_octets_to_date, time(NULL) - now); close(v42bis_fd); close(out_fd); } return 0; } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/tests/media_monitor.h0000644000175000017500000000346611150047203021234 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * media_monitor.h - Display IP streaming media status, using the FLTK toolkit. * * Written by Steve Underwood * * Copyright (C) 2007 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2, as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: media_monitor.h,v 1.6 2008/04/26 13:39:17 steveu Exp $ */ /*! \page media_monitor_page IP streaming media performance monitoring \section media_monitor_page_sec_1 What does it do? This code controls a GUI window, which provides monitoring of the status of an IP media stream. It shows, graphically: \section media_monitor_page_sec_2 How does it work? This code uses the FLTK cross platform GUI toolkit. It works on X11 and Windows platforms. In addition to the basic FLTK toolkit, fltk_cartesian is also required. */ #if !defined(_MEDIA_MONITOR_H_) #define _MEDIA_MONITOR_H_ #if defined(__cplusplus) extern "C" { #endif int start_media_monitor(void); void media_monitor_rx(int seq_no, double departure_time, double arrival_time); void media_monitor_wait_to_end(void); void media_monitor_update_display(void); #if defined(__cplusplus) } #endif #endif /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/tests/g168_tests.c0000644000175000017500000001167411150047203020310 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * g168tests.c - Tests of the "test equipment" (filters, etc.) specified * in G.168. This code is only for checking out the tools, * not for testing an echo cancellor. * * Written by Steve Underwood * * Copyright (C) 2001 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2, as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: g168_tests.c,v 1.15 2008/05/13 13:17:25 steveu Exp $ */ #if defined(HAVE_CONFIG_H) #include "config.h" #endif #include #include #include #include "spandsp.h" #include "spandsp/g168models.h" #define FALSE 0 #define TRUE (!FALSE) int main (int argc, char *argv[]) { int f; int i; int16_t amp[8000]; int signal; int power[10]; tone_gen_descriptor_t tone_desc; tone_gen_state_t tone_state; fir32_state_t line_model_d2; fir32_state_t line_model_d3; fir32_state_t line_model_d4; fir32_state_t line_model_d5; fir32_state_t line_model_d6; fir32_state_t line_model_d7; fir32_state_t line_model_d8; fir_float_state_t level_measurement_bp; fir32_create(&line_model_d2, line_model_d2_coeffs, sizeof(line_model_d2_coeffs)/sizeof(int32_t)); fir32_create(&line_model_d3, line_model_d3_coeffs, sizeof(line_model_d3_coeffs)/sizeof(int32_t)); fir32_create(&line_model_d4, line_model_d4_coeffs, sizeof(line_model_d4_coeffs)/sizeof(int32_t)); fir32_create(&line_model_d5, line_model_d5_coeffs, sizeof(line_model_d5_coeffs)/sizeof(int32_t)); fir32_create(&line_model_d6, line_model_d6_coeffs, sizeof(line_model_d6_coeffs)/sizeof(int32_t)); fir32_create(&line_model_d7, line_model_d7_coeffs, sizeof(line_model_d7_coeffs)/sizeof(int32_t)); fir32_create(&line_model_d8, line_model_d8_coeffs, sizeof(line_model_d8_coeffs)/sizeof(int32_t)); fir_float_create(&level_measurement_bp, level_measurement_bp_coeffs, sizeof(level_measurement_bp_coeffs)/sizeof(float)); for (f = 10; f < 4000; f++) { make_tone_gen_descriptor(&tone_desc, f, -10, 0, 0, 1, 0, 0, 0, TRUE); tone_gen_init(&tone_state, &tone_desc); tone_gen(&tone_state, amp, 8000); memset(power, '\0', sizeof (power)); for (i = 0; i < 800; i++) { signal = fir32(&line_model_d2, amp[i]); power[0] += ((abs(signal) - power[0]) >> 5); signal = fir32(&line_model_d3, amp[i]); power[1] += ((abs(signal) - power[1]) >> 5); signal = fir32(&line_model_d4, amp[i]); power[2] += ((abs(signal) - power[2]) >> 5); signal = fir32(&line_model_d5, amp[i]); power[3] += ((abs(signal) - power[3]) >> 5); signal = fir32(&line_model_d6, amp[i]); power[4] += ((abs(signal) - power[4]) >> 5); signal = fir32(&line_model_d7, amp[i]); power[5] += ((abs(signal) - power[5]) >> 5); signal = fir32(&line_model_d8, amp[i]); power[6] += ((abs(signal) - power[6]) >> 5); signal = fir_float(&level_measurement_bp, amp[i]); power[7] += ((abs(signal) - power[7]) >> 5); } printf("%d %d %d %d %d %d %d %d %d\n", f, power[0], power[1], power[2], power[3], power[4], power[5], power[6], power[7]); } for (i = 0; i < (int) (sizeof(css_c1)/sizeof(css_c1[0])); i++) printf("%d\n", css_c1[i]); printf("\n"); for (i = 0; i < (int) (sizeof(css_c1)/sizeof(css_c3[0])); i++) printf("%d\n", css_c3[i]); return 0; } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/tests/bert_tests.c0000644000175000017500000003217711150047203020560 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * bert_tests.c - Tests for the BER tester. * * Written by Steve Underwood * * Copyright (C) 2004 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2, as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: bert_tests.c,v 1.24 2008/05/13 13:17:25 steveu Exp $ */ /*! \file */ /*! \page bert_tests_page BERT tests \section bert_tests_page_sec_1 What does it do? These tests exercise each of the BERT standards supported by the BERT module. */ #if defined(HAVE_CONFIG_H) #include "config.h" #endif #include #include #include #include #include #include "spandsp.h" /* Use a local random generator, so the results are consistent across platforms */ static int my_rand(void) { static int rndnum = 1234567; return (rndnum = 1664525U*rndnum + 1013904223U); } /*- End of function --------------------------------------------------------*/ static void reporter(void *user_data, int reason, bert_results_t *results) { int channel; channel = (int) (intptr_t) user_data; printf("BERT report '%s' ", bert_event_to_str(reason)); switch (reason) { case BERT_REPORT_REGULAR: printf("%d bits, %d bad bits, %d resyncs", results->total_bits, results->bad_bits, results->resyncs); break; } printf("\r"); } /*- End of function --------------------------------------------------------*/ int8_t test[0x800000]; int main(int argc, char *argv[]) { bert_state_t tx_bert; bert_state_t rx_bert; bert_state_t bert; bert_results_t bert_results; int i; int bit; int zeros; int max_zeros; int failed; bert_init(&tx_bert, 0, BERT_PATTERN_ZEROS, 300, 20); bert_init(&rx_bert, 0, BERT_PATTERN_ZEROS, 300, 20); for (i = 0; i < 511*2; i++) { bit = bert_get_bit(&tx_bert); bert_put_bit(&rx_bert, bit); } bert_result(&rx_bert, &bert_results); printf("Zeros: Bad bits %d/%d\n", bert_results.bad_bits, bert_results.total_bits); if (bert_results.bad_bits || bert_results.total_bits != 950) { printf("Test failed.\n"); exit(2); } bert_init(&tx_bert, 0, BERT_PATTERN_ONES, 300, 20); bert_init(&rx_bert, 0, BERT_PATTERN_ONES, 300, 20); for (i = 0; i < 511*2; i++) { bit = bert_get_bit(&tx_bert); bert_put_bit(&rx_bert, bit); } bert_result(&rx_bert, &bert_results); printf("Ones: Bad bits %d/%d\n", bert_results.bad_bits, bert_results.total_bits); if (bert_results.bad_bits || bert_results.total_bits != 950) { printf("Test failed.\n"); exit(2); } bert_init(&tx_bert, 0, BERT_PATTERN_1_TO_7, 300, 20); bert_init(&rx_bert, 0, BERT_PATTERN_1_TO_7, 300, 20); for (i = 0; i < 511*2; i++) { bit = bert_get_bit(&tx_bert); bert_put_bit(&rx_bert, bit); } bert_result(&rx_bert, &bert_results); printf("1 to 7: Bad bits %d/%d\n", bert_results.bad_bits, bert_results.total_bits); if (bert_results.bad_bits || bert_results.total_bits != 950) { printf("Test failed.\n"); exit(2); } bert_init(&tx_bert, 0, BERT_PATTERN_1_TO_3, 300, 20); bert_init(&rx_bert, 0, BERT_PATTERN_1_TO_3, 300, 20); for (i = 0; i < 511*2; i++) { bit = bert_get_bit(&tx_bert); bert_put_bit(&rx_bert, bit); } bert_result(&rx_bert, &bert_results); printf("1 to 3: Bad bits %d/%d\n", bert_results.bad_bits, bert_results.total_bits); if (bert_results.bad_bits || bert_results.total_bits != 950) { printf("Test failed.\n"); exit(2); } bert_init(&tx_bert, 0, BERT_PATTERN_1_TO_1, 300, 20); bert_init(&rx_bert, 0, BERT_PATTERN_1_TO_1, 300, 20); for (i = 0; i < 511*2; i++) { bit = bert_get_bit(&tx_bert); bert_put_bit(&rx_bert, bit); } bert_result(&rx_bert, &bert_results); printf("1 to 1: Bad bits %d/%d\n", bert_results.bad_bits, bert_results.total_bits); if (bert_results.bad_bits || bert_results.total_bits != 950) { printf("Test failed.\n"); exit(2); } bert_init(&tx_bert, 0, BERT_PATTERN_3_TO_1, 300, 20); bert_init(&rx_bert, 0, BERT_PATTERN_3_TO_1, 300, 20); for (i = 0; i < 511*2; i++) { bit = bert_get_bit(&tx_bert); bert_put_bit(&rx_bert, bit); } bert_result(&rx_bert, &bert_results); printf("3 to 1: Bad bits %d/%d\n", bert_results.bad_bits, bert_results.total_bits); if (bert_results.bad_bits || bert_results.total_bits != 950) { printf("Test failed.\n"); exit(2); } bert_init(&tx_bert, 0, BERT_PATTERN_7_TO_1, 300, 20); bert_init(&rx_bert, 0, BERT_PATTERN_7_TO_1, 300, 20); for (i = 0; i < 511*2; i++) { bit = bert_get_bit(&tx_bert); bert_put_bit(&rx_bert, bit); } bert_result(&rx_bert, &bert_results); printf("7 to 1: Bad bits %d/%d\n", bert_results.bad_bits, bert_results.total_bits); if (bert_results.bad_bits || bert_results.total_bits != 950) { printf("Test failed.\n"); exit(2); } bert_init(&tx_bert, 0, BERT_PATTERN_ITU_O153_9, 300, 20); bert_init(&rx_bert, 0, BERT_PATTERN_ITU_O153_9, 300, 20); for (i = 0; i < 0x200; i++) test[i] = 0; max_zeros = 0; zeros = 0; for (i = 0; i < 511*2; i++) { bit = bert_get_bit(&tx_bert); if (bit) { if (zeros > max_zeros) max_zeros = zeros; zeros = 0; } else { zeros++; } bert_put_bit(&rx_bert, bit); test[tx_bert.tx_reg]++; } failed = FALSE; if (test[0] != 0) { printf("XXX %d %d\n", 0, test[0]); failed = TRUE; } for (i = 1; i < 0x200; i++) { if (test[i] != 2) { printf("XXX %d %d\n", i, test[i]); failed = TRUE; } } bert_result(&rx_bert, &bert_results); printf("O.153(9): Bad bits %d/%d, max zeros %d\n", bert_results.bad_bits, bert_results.total_bits, max_zeros); if (bert_results.bad_bits || bert_results.total_bits != 986 || failed) { printf("Test failed.\n"); exit(2); } bert_init(&tx_bert, 0, BERT_PATTERN_ITU_O152_11, 300, 20); bert_init(&rx_bert, 0, BERT_PATTERN_ITU_O152_11, 300, 20); for (i = 0; i < 0x800; i++) test[i] = 0; max_zeros = 0; zeros = 0; for (i = 0; i < 2047*2; i++) { bit = bert_get_bit(&tx_bert); if (bit) { if (zeros > max_zeros) max_zeros = zeros; zeros = 0; } else { zeros++; } bert_put_bit(&rx_bert, bit); test[tx_bert.tx_reg]++; } failed = FALSE; if (test[0] != 0) { printf("XXX %d %d\n", 0, test[0]); failed = TRUE; } for (i = 1; i < 0x800; i++) { if (test[i] != 2) { printf("XXX %d %d\n", i, test[i]); failed = TRUE; } } bert_result(&rx_bert, &bert_results); printf("O.152(11): Bad bits %d/%d, max zeros %d\n", bert_results.bad_bits, bert_results.total_bits, max_zeros); if (bert_results.bad_bits || bert_results.total_bits != 4052 || failed) { printf("Test failed.\n"); exit(2); } bert_init(&tx_bert, 0, BERT_PATTERN_ITU_O151_15, 300, 20); bert_init(&rx_bert, 0, BERT_PATTERN_ITU_O151_15, 300, 20); for (i = 0; i < 0x8000; i++) test[i] = 0; max_zeros = 0; zeros = 0; for (i = 0; i < 32767*2; i++) { bit = bert_get_bit(&tx_bert); if (bit) { if (zeros > max_zeros) max_zeros = zeros; zeros = 0; } else { zeros++; } bert_put_bit(&rx_bert, bit); test[tx_bert.tx_reg]++; } failed = FALSE; if (test[0] != 0) { printf("XXX %d %d\n", 0, test[0]); failed = TRUE; } for (i = 1; i < 0x8000; i++) { if (test[i] != 2) { printf("XXX %d %d\n", i, test[i]); failed = TRUE; } } bert_result(&rx_bert, &bert_results); printf("O.151(15): Bad bits %d/%d, max zeros %d\n", bert_results.bad_bits, bert_results.total_bits, max_zeros); if (bert_results.bad_bits || bert_results.total_bits != 65480 || failed) { printf("Test failed.\n"); exit(2); } bert_init(&tx_bert, 0, BERT_PATTERN_ITU_O151_20, 300, 20); bert_init(&rx_bert, 0, BERT_PATTERN_ITU_O151_20, 300, 20); for (i = 0; i < 0x100000; i++) test[i] = 0; max_zeros = 0; zeros = 0; for (i = 0; i < 1048575*2; i++) { bit = bert_get_bit(&tx_bert); if (bit) { if (zeros > max_zeros) max_zeros = zeros; zeros = 0; } else { zeros++; } bert_put_bit(&rx_bert, bit); test[tx_bert.tx_reg]++; } failed = FALSE; if (test[0] != 0) { printf("XXX %d %d\n", 0, test[0]); failed = TRUE; } for (i = 1; i < 0x100000; i++) { if (test[i] != 2) printf("XXX %d %d\n", i, test[i]); } bert_result(&rx_bert, &bert_results); printf("O.151(20): Bad bits %d/%d, max zeros %d\n", bert_results.bad_bits, bert_results.total_bits, max_zeros); if (bert_results.bad_bits || bert_results.total_bits != 2097066 || failed) { printf("Test failed.\n"); exit(2); } bert_init(&tx_bert, 0, BERT_PATTERN_ITU_O151_23, 300, 20); bert_init(&rx_bert, 0, BERT_PATTERN_ITU_O151_23, 300, 20); for (i = 0; i < 0x800000; i++) test[i] = 0; max_zeros = 0; zeros = 0; for (i = 0; i < 8388607*2; i++) { bit = bert_get_bit(&tx_bert); if (bit) { if (zeros > max_zeros) max_zeros = zeros; zeros = 0; } else { zeros++; } bert_put_bit(&rx_bert, bit); test[tx_bert.tx_reg]++; } failed = FALSE; if (test[0] != 0) { printf("XXX %d %d\n", 0, test[0]); failed = TRUE; } for (i = 1; i < 0x800000; i++) { if (test[i] != 2) printf("XXX %d %d\n", i, test[i]); } bert_result(&rx_bert, &bert_results); printf("O.151(23): Bad bits %d/%d, max zeros %d\n", bert_results.bad_bits, bert_results.total_bits, max_zeros); if (bert_results.bad_bits || bert_results.total_bits != 16777136 || failed) { printf("Test failed.\n"); exit(2); } bert_init(&tx_bert, 0, BERT_PATTERN_QBF, 300, 20); bert_init(&rx_bert, 0, BERT_PATTERN_QBF, 300, 20); for (i = 0; i < 100000; i++) { bit = bert_get_bit(&tx_bert); bert_put_bit(&rx_bert, bit); } bert_result(&rx_bert, &bert_results); printf("QBF: Bad bits %d/%d\n", bert_results.bad_bits, bert_results.total_bits); if (bert_results.bad_bits || bert_results.total_bits != 100000) { printf("Test failed.\n"); exit(2); } /* Test the mechanism for categorising the error rate into <10^x bands */ /* TODO: The result of this test is not checked automatically */ bert_init(&bert, 15000000, BERT_PATTERN_ITU_O152_11, 300, 20); bert_set_report(&bert, 100000, reporter, (intptr_t) 0); for (;;) { if ((bit = bert_get_bit(&bert)) == PUTBIT_END_OF_DATA) { bert_result(&bert, &bert_results); printf("Rate test: %d bits, %d bad bits, %d resyncs\n", bert_results.total_bits, bert_results.bad_bits, bert_results.resyncs); if (bert_results.total_bits != 15000000 - 42 || bert_results.bad_bits != 58 || bert_results.resyncs != 0) { printf("Tests failed\n"); exit(2); } break; //bert_init(&bert, 15000000, BERT_PATTERN_ITU_O152_11, 300, 20); //bert_set_report(&bert, 100000, reporter, (intptr_t) 0); //continue; } if ((my_rand() & 0x3FFFF) == 0) bit ^= 1; //if ((my_rand() & 0xFFF) == 0) // bert_put_bit(&bert, bit); bert_put_bit(&bert, bit); } printf("Tests passed.\n"); return 0; } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/tests/bell_mf_tx_tests.c0000644000175000017500000001572211150047203021734 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * bell_mf_tx_tests.c - Test the Bell MF generator. * * Written by Steve Underwood * * Copyright (C) 2003 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2, as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: bell_mf_tx_tests.c,v 1.10 2008/05/13 13:17:25 steveu Exp $ */ /*! \file */ /*! \page bell_mf_tx_tests_page Bell MF generation tests \section bell_mf_tx_tests_page_sec_1 What does it do? ???. \section bell_mf_tx_tests_page_sec_2 How does it work? ???. */ #if defined(HAVE_CONFIG_H) #include "config.h" #endif #include #include #include #include #include #include #include "spandsp.h" #define OUTPUT_FILE_NAME "bell_mf.wav" int main(int argc, char *argv[]) { bell_mf_tx_state_t gen; int16_t amp[16384]; int len; AFfilehandle outhandle; AFfilesetup filesetup; int outframes; int add_digits; filesetup = afNewFileSetup(); if (filesetup == AF_NULL_FILESETUP) { fprintf(stderr, " Failed to create file setup\n"); exit(2); } afInitSampleFormat(filesetup, AF_DEFAULT_TRACK, AF_SAMPFMT_TWOSCOMP, 16); afInitRate(filesetup, AF_DEFAULT_TRACK, 8000.0); //afInitCompression(filesetup, AF_DEFAULT_TRACK, AF_COMPRESSION_G711_ALAW); afInitFileFormat(filesetup, AF_FILE_WAVE); afInitChannels(filesetup, AF_DEFAULT_TRACK, 1); outhandle = afOpenFile(OUTPUT_FILE_NAME, "w", filesetup); if (outhandle == AF_NULL_FILEHANDLE) { fprintf(stderr, " Cannot open wave file '%s'\n", OUTPUT_FILE_NAME); exit(2); } bell_mf_tx_init(&gen); len = bell_mf_tx(&gen, amp, 16384); printf("Generated %d samples\n", len); outframes = afWriteFrames(outhandle, AF_DEFAULT_TRACK, amp, len); if (bell_mf_tx_put(&gen, "123", -1)) printf("Ooops\n"); len = bell_mf_tx(&gen, amp, 16384); printf("Generated %d samples\n", len); outframes = afWriteFrames(outhandle, AF_DEFAULT_TRACK, amp, len); if (bell_mf_tx_put(&gen, "456", -1)) printf("Ooops\n"); len = bell_mf_tx(&gen, amp, 160); printf("Generated %d samples\n", len); outframes = afWriteFrames(outhandle, AF_DEFAULT_TRACK, amp, len); if (bell_mf_tx_put(&gen, "789", -1)) printf("Ooops\n"); len = bell_mf_tx(&gen, amp, 160); printf("Generated %d samples\n", len); outframes = afWriteFrames(outhandle, AF_DEFAULT_TRACK, amp, len); if (bell_mf_tx_put(&gen, "*#", -1)) printf("Ooops\n"); len = bell_mf_tx(&gen, amp, 160); printf("Generated %d samples\n", len); outframes = afWriteFrames(outhandle, AF_DEFAULT_TRACK, amp, len); add_digits = 1; do { len = bell_mf_tx(&gen, amp, 160); printf("Generated %d samples\n", len); if (len > 0) { outframes = afWriteFrames(outhandle, AF_DEFAULT_TRACK, amp, len); } if (add_digits) { if (bell_mf_tx_put(&gen, "1234567890", -1)) { printf("Digit buffer full\n"); add_digits = 0; } } } while (len > 0); bell_mf_tx_init(&gen); len = bell_mf_tx(&gen, amp, 16384); printf("Generated %d samples\n", len); outframes = afWriteFrames(outhandle, AF_DEFAULT_TRACK, amp, len); if (bell_mf_tx_put(&gen, "123", -1)) printf("Ooops\n"); len = bell_mf_tx(&gen, amp, 16384); printf("Generated %d samples\n", len); outframes = afWriteFrames(outhandle, AF_DEFAULT_TRACK, amp, len); if (bell_mf_tx_put(&gen, "456", -1)) printf("Ooops\n"); len = bell_mf_tx(&gen, amp, 160); printf("Generated %d samples\n", len); outframes = afWriteFrames(outhandle, AF_DEFAULT_TRACK, amp, len); if (bell_mf_tx_put(&gen, "789", -1)) printf("Ooops\n"); len = bell_mf_tx(&gen, amp, 160); printf("Generated %d samples\n", len); outframes = afWriteFrames(outhandle, AF_DEFAULT_TRACK, amp, len); if (bell_mf_tx_put(&gen, "0*#", -1)) printf("Ooops\n"); len = bell_mf_tx(&gen, amp, 160); printf("Generated %d samples\n", len); outframes = afWriteFrames(outhandle, AF_DEFAULT_TRACK, amp, len); if (bell_mf_tx_put(&gen, "ABC", -1)) printf("Ooops\n"); len = bell_mf_tx(&gen, amp, 160); printf("Generated %d samples\n", len); outframes = afWriteFrames(outhandle, AF_DEFAULT_TRACK, amp, len); add_digits = 1; do { len = bell_mf_tx(&gen, amp, 160); printf("Generated %d samples\n", len); if (len > 0) { outframes = afWriteFrames(outhandle, AF_DEFAULT_TRACK, amp, len); } if (add_digits) { if (bell_mf_tx_put(&gen, "1234567890", -1)) { printf("Digit buffer full\n"); add_digits = 0; } } } while (len > 0); if (afCloseFile(outhandle) != 0) { fprintf(stderr, " Cannot close wave file '%s'\n", OUTPUT_FILE_NAME); exit (2); } afFreeFileSetup(filesetup); return 0; } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/tests/fax_tests.sh0000755000175000017500000000744511150047203020575 0ustar julienjulien#!/bin/bash # # spandsp fax tests # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License version 2.1, # as published by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this program; if not, write to the Free Software # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. # # $Id: fax_tests.sh,v 1.5 2008/03/30 18:33:31 steveu Exp $ # run_fax_test() { rm -f fax_tests_1.tif echo -i ${FILE} ${OPTS} ./fax_tests -i ${FILE} ${OPTS} >xyzzy 2>xyzzy2 RETVAL=$? if [ $RETVAL != 0 ] then echo fax_tests failed! exit $RETVAL fi # Now use tiffcmp to check the results. It will return non-zero if any page images differ. The -t # option means the normal differences in tags will be ignored. tiffcmp -t ${FILE} fax_tests_1.tif #>/dev/null RETVAL=$? if [ $RETVAL != 0 ] then echo fax_tests failed! exit $RETVAL fi rm -f fax_tests_1.tif echo tested ${FILE} } OPTS="-e" FILE="../itutests/fax/R8_385_A4.tif" run_fax_test FILE="../itutests/fax/R8_385_B4.tif" run_fax_test FILE="../itutests/fax/R8_385_A3.tif" run_fax_test FILE="../itutests/fax/R8_77_A4.tif" run_fax_test FILE="../itutests/fax/R8_77_B4.tif" run_fax_test FILE="../itutests/fax/R8_77_A3.tif" run_fax_test FILE="../itutests/fax/R8_154_A4.tif" run_fax_test FILE="../itutests/fax/R8_154_B4.tif" run_fax_test FILE="../itutests/fax/R8_154_A3.tif" run_fax_test FILE="../itutests/fax/R300_300_A4.tif" run_fax_test FILE="../itutests/fax/R300_300_B4.tif" run_fax_test FILE="../itutests/fax/R300_300_A3.tif" run_fax_test FILE="../itutests/fax/R300_600_A4.tif" run_fax_test FILE="../itutests/fax/R300_600_B4.tif" run_fax_test FILE="../itutests/fax/R300_600_A3.tif" run_fax_test FILE="../itutests/fax/R16_154_A4.tif" run_fax_test FILE="../itutests/fax/R16_154_B4.tif" run_fax_test FILE="../itutests/fax/R16_154_A3.tif" run_fax_test FILE="../itutests/fax/R16_800_A4.tif" run_fax_test FILE="../itutests/fax/R16_800_B4.tif" run_fax_test FILE="../itutests/fax/R16_800_A3.tif" run_fax_test FILE="../itutests/fax/R600_600_A4.tif" run_fax_test FILE="../itutests/fax/R600_600_B4.tif" run_fax_test FILE="../itutests/fax/R600_600_A3.tif" run_fax_test FILE="../itutests/fax/R600_1200_A4.tif" run_fax_test FILE="../itutests/fax/R600_1200_B4.tif" run_fax_test FILE="../itutests/fax/R600_1200_A3.tif" run_fax_test FILE="../itutests/fax/R1200_1200_A4.tif" run_fax_test FILE="../itutests/fax/R1200_1200_B4.tif" run_fax_test FILE="../itutests/fax/R1200_1200_A3.tif" run_fax_test OPTS="" FILE="../itutests/fax/R8_385_A4.tif" run_fax_test FILE="../itutests/fax/R8_385_B4.tif" run_fax_test FILE="../itutests/fax/R8_385_A3.tif" run_fax_test FILE="../itutests/fax/R8_77_A4.tif" run_fax_test FILE="../itutests/fax/R8_77_B4.tif" run_fax_test FILE="../itutests/fax/R8_77_A3.tif" run_fax_test FILE="../itutests/fax/R8_154_A4.tif" run_fax_test FILE="../itutests/fax/R8_154_B4.tif" run_fax_test FILE="../itutests/fax/R8_154_A3.tif" run_fax_test FILE="../itutests/fax/R16_385_A4.tif" #run_fax_test FILE="../itutests/fax/R16_385_B4.tif" #run_fax_test FILE="../itutests/fax/R16_385_A3.tif" #run_fax_test FILE="../itutests/fax/R16_77_A4.tif" #run_fax_test FILE="../itutests/fax/R16_77_B4.tif" #run_fax_test FILE="../itutests/fax/R16_77_A3.tif" #run_fax_test FILE="../itutests/fax/R16_154_A4.tif" run_fax_test FILE="../itutests/fax/R16_154_B4.tif" run_fax_test FILE="../itutests/fax/R16_154_A3.tif" run_fax_test iaxmodem-1.2.0/lib/spandsp/tests/modem_connect_tones_tests.c0000644000175000017500000010407511150047203023643 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * modem_connect_tones_tests.c * * Written by Steve Underwood * * Copyright (C) 2006 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2, as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: modem_connect_tones_tests.c,v 1.21 2008/05/14 15:41:25 steveu Exp $ */ /*! \page modem_connect_tones_tests_page Modem connect tones tests \section modem_connect_tones_rx_tests_page_sec_1 What does it do? These tests... */ #if defined(HAVE_CONFIG_H) #include "config.h" #endif #include #include #include #include #include #include #include "spandsp.h" #define SAMPLES_PER_CHUNK 160 #define OUTPUT_FILE_NAME "modem_connect_tones.wav" #define MITEL_DIR "../test-data/mitel/" #define BELLCORE_DIR "../test-data/bellcore/" #define FALSE 0 #define TRUE (!FALSE) #define LEVEL_MAX 0 #define LEVEL_MIN -48 #define LEVEL_MIN_ACCEPT -43 #define LEVEL_MIN_REJECT -44 const char *bellcore_files[] = { MITEL_DIR "mitel-cm7291-talkoff.wav", BELLCORE_DIR "tr-tsy-00763-1.wav", BELLCORE_DIR "tr-tsy-00763-2.wav", BELLCORE_DIR "tr-tsy-00763-3.wav", BELLCORE_DIR "tr-tsy-00763-4.wav", BELLCORE_DIR "tr-tsy-00763-5.wav", BELLCORE_DIR "tr-tsy-00763-6.wav", "" }; enum { PERFORM_TEST_1A = (1 << 1), PERFORM_TEST_1B = (1 << 2), PERFORM_TEST_1C = (1 << 3), PERFORM_TEST_1D = (1 << 4), PERFORM_TEST_2A = (1 << 5), PERFORM_TEST_2B = (1 << 6), PERFORM_TEST_2C = (1 << 7), PERFORM_TEST_3A = (1 << 8), PERFORM_TEST_3B = (1 << 9), PERFORM_TEST_3C = (1 << 10), PERFORM_TEST_4 = (1 << 11), PERFORM_TEST_5 = (1 << 12), PERFORM_TEST_6 = (1 << 13) }; int preamble_count = 0; int preamble_on_at = -1; int preamble_off_at = -1; int hits = 0; int when = 0; static int preamble_get_bit(void *user_data) { static int bit_no = 0; int bit; /* Generate a section of HDLC flag octet preamble. Then generate some random bits, which should not look like preamble. */ if (++preamble_count < 255) { bit = (bit_no < 2) ? 0 : 1; if (++bit_no >= 8) bit_no = 0; #if 0 /* Inject some bad bits */ if (rand()%15 == 0) return bit ^ 1; #endif } else { bit = rand() & 1; } return bit; } /*- End of function --------------------------------------------------------*/ static void preamble_detected(void *user_data, int on, int level, int delay) { printf("Preamble declared %s at bit %d (%ddBm0)\n", (on) ? "on" : "off", preamble_count, level); if (on) preamble_on_at = preamble_count; else preamble_off_at = preamble_count; /*endif*/ } /*- End of function --------------------------------------------------------*/ static void ced_detected(void *user_data, int on, int level, int delay) { printf("FAX CED declared %s at %d (%ddBm0)\n", (on) ? "on" : "off", when, level); if (on) hits++; } /*- End of function --------------------------------------------------------*/ static void cng_detected(void *user_data, int on, int level, int delay) { printf("FAX CNG declared %s at %d (%ddBm0)\n", (on) ? "on" : "off", when, level); if (on) hits++; } /*- End of function --------------------------------------------------------*/ static void ec_dis_detected(void *user_data, int on, int level, int delay) { printf("EC disable tone declared %s at %d (%ddBm0)\n", (on) ? "on" : "off", when, level); if (on) hits++; } /*- End of function --------------------------------------------------------*/ int main(int argc, char *argv[]) { int i; int j; int pitch; int level; int interval; int16_t amp[8000]; modem_connect_tones_rx_state_t cng_rx; modem_connect_tones_rx_state_t ced_rx; modem_connect_tones_rx_state_t ans_pr_rx; modem_connect_tones_tx_state_t modem_tone_tx; awgn_state_t chan_noise_source; AFfilehandle inhandle; AFfilehandle outhandle; AFfilesetup filesetup; int outframes; int frames; int samples; int hit; int false_hit; int false_miss; float x; tone_gen_descriptor_t tone_desc; tone_gen_state_t tone_tx; power_meter_t power_state; int power; int max_power; int level2; int max_level2; int test_list; int opt; char *decode_test_file; fsk_tx_state_t preamble_tx; test_list = 0; decode_test_file = NULL; while ((opt = getopt(argc, argv, "d:")) != -1) { switch (opt) { case 'd': decode_test_file = optarg; break; default: //usage(); exit(2); break; } } argc -= optind; argv += optind; for (i = 0; i < argc; i++) { if (strcasecmp(argv[i], "1a") == 0) test_list |= PERFORM_TEST_1A; else if (strcasecmp(argv[i], "1b") == 0) test_list |= PERFORM_TEST_1B; else if (strcasecmp(argv[i], "1c") == 0) test_list |= PERFORM_TEST_1C; else if (strcasecmp(argv[i], "1d") == 0) test_list |= PERFORM_TEST_1D; else if (strcasecmp(argv[i], "2a") == 0) test_list |= PERFORM_TEST_2A; else if (strcasecmp(argv[i], "2b") == 0) test_list |= PERFORM_TEST_2B; else if (strcasecmp(argv[i], "2c") == 0) test_list |= PERFORM_TEST_2C; else if (strcasecmp(argv[i], "3a") == 0) test_list |= PERFORM_TEST_3A; else if (strcasecmp(argv[i], "3b") == 0) test_list |= PERFORM_TEST_3B; else if (strcasecmp(argv[i], "3c") == 0) test_list |= PERFORM_TEST_3C; else if (strcasecmp(argv[i], "4") == 0) test_list |= PERFORM_TEST_4; else if (strcasecmp(argv[i], "5") == 0) test_list |= PERFORM_TEST_5; else if (strcasecmp(argv[i], "6") == 0) test_list |= PERFORM_TEST_6; else { fprintf(stderr, "Unknown test '%s' specified\n", argv[i]); exit(2); } } if (decode_test_file == NULL && test_list == 0) test_list = 0xFFFFFFFF; if ((filesetup = afNewFileSetup()) == AF_NULL_FILESETUP) { fprintf(stderr, " Failed to create file setup\n"); exit(2); } afInitSampleFormat(filesetup, AF_DEFAULT_TRACK, AF_SAMPFMT_TWOSCOMP, 16); afInitRate(filesetup, AF_DEFAULT_TRACK, (float) SAMPLE_RATE); afInitFileFormat(filesetup, AF_FILE_WAVE); afInitChannels(filesetup, AF_DEFAULT_TRACK, 1); if ((outhandle = afOpenFile(OUTPUT_FILE_NAME, "w", filesetup)) == AF_NULL_FILEHANDLE) { fprintf(stderr, " Cannot create wave file '%s'\n", OUTPUT_FILE_NAME); exit(2); } if ((test_list & PERFORM_TEST_1A)) { printf("Test 1a: CNG generation to a file\n"); modem_connect_tones_tx_init(&modem_tone_tx, MODEM_CONNECT_TONES_FAX_CNG); for (i = 0; i < 20*SAMPLE_RATE; i += SAMPLES_PER_CHUNK) { samples = modem_connect_tones_tx(&modem_tone_tx, amp, SAMPLES_PER_CHUNK); outframes = afWriteFrames(outhandle, AF_DEFAULT_TRACK, amp, samples); if (outframes != samples) { fprintf(stderr, " Error writing wave file\n"); exit(2); } /*endif*/ } /*endfor*/ } /*endif*/ if ((test_list & PERFORM_TEST_1B)) { printf("Test 1b: CED generation to a file\n"); modem_connect_tones_tx_init(&modem_tone_tx, MODEM_CONNECT_TONES_FAX_CED); for (i = 0; i < 20*SAMPLE_RATE; i += SAMPLES_PER_CHUNK) { samples = modem_connect_tones_tx(&modem_tone_tx, amp, SAMPLES_PER_CHUNK); outframes = afWriteFrames(outhandle, AF_DEFAULT_TRACK, amp, samples); if (outframes != samples) { fprintf(stderr, " Error writing wave file\n"); exit(2); } /*endif*/ } /*endfor*/ } /*endif*/ if ((test_list & PERFORM_TEST_1C)) { printf("Test 1c: Modulated EC-disable generation to a file\n"); /* Some with modulation */ modem_connect_tones_tx_init(&modem_tone_tx, MODEM_CONNECT_TONES_ANSAM); for (i = 0; i < 20*SAMPLE_RATE; i += SAMPLES_PER_CHUNK) { samples = modem_connect_tones_tx(&modem_tone_tx, amp, SAMPLES_PER_CHUNK); outframes = afWriteFrames(outhandle, AF_DEFAULT_TRACK, amp, samples); if (outframes != samples) { fprintf(stderr, " Error writing wave file\n"); exit(2); } /*endif*/ } /*endfor*/ } /*endif*/ if ((test_list & PERFORM_TEST_1D)) { printf("Test 1d: EC-disable generation to a file\n"); /* Some without modulation */ modem_connect_tones_tx_init(&modem_tone_tx, MODEM_CONNECT_TONES_ANS_PR); for (i = 0; i < 20*SAMPLE_RATE; i += SAMPLES_PER_CHUNK) { samples = modem_connect_tones_tx(&modem_tone_tx, amp, SAMPLES_PER_CHUNK); outframes = afWriteFrames(outhandle, AF_DEFAULT_TRACK, amp, samples); if (outframes != samples) { fprintf(stderr, " Error writing wave file\n"); exit(2); } /*endif*/ } /*endfor*/ } /*endif*/ if (afCloseFile(outhandle) != 0) { printf(" Cannot close wave file '%s'\n", OUTPUT_FILE_NAME); exit(2); } /*endif*/ if ((test_list & PERFORM_TEST_2A)) { printf("Test 2a: CNG detection with frequency\n"); awgn_init_dbm0(&chan_noise_source, 7162534, -50.0f); false_hit = FALSE; false_miss = FALSE; for (pitch = 600; pitch < 1600; pitch++) { make_tone_gen_descriptor(&tone_desc, pitch, -11, 0, 0, 425, 3000, 0, 0, TRUE); tone_gen_init(&tone_tx, &tone_desc); modem_connect_tones_rx_init(&cng_rx, MODEM_CONNECT_TONES_FAX_CNG, NULL, NULL); power_meter_init(&power_state, 5); power = 0; max_power = 0; level2 = 0; max_level2 = 0; for (i = 0; i < 10*SAMPLE_RATE; i += SAMPLES_PER_CHUNK) { samples = tone_gen(&tone_tx, amp, SAMPLES_PER_CHUNK); for (j = 0; j < samples; j++) { amp[j] += awgn(&chan_noise_source); power = power_meter_update(&power_state, amp[j]); if (power > max_power) max_power = power; /*endif*/ level2 += ((abs(amp[j]) - level2) >> 5); if (level2 > max_level2) max_level2 = level2; } /*endfor*/ modem_connect_tones_rx(&cng_rx, amp, samples); } /*endfor*/ //printf("max power is %d %f\n", max_power, log10f((float) max_power/(32767.0f*32767.0f))*10.0f + DBM0_MAX_POWER); //printf("level2 %d (%f)\n", max_level2, log10f((float) max_level2/32768.0f)*20.0f + DBM0_MAX_POWER); hit = modem_connect_tones_rx_get(&cng_rx); if (pitch < (1100 - 70) || pitch > (1100 + 70)) { if (hit == MODEM_CONNECT_TONES_FAX_CNG) false_hit = TRUE; /*endif*/ } else if (pitch > (1100 - 50) && pitch < (1100 + 50)) { if (hit != MODEM_CONNECT_TONES_FAX_CNG) false_miss = TRUE; /*endif*/ } /*endif*/ if (hit) printf("Detected at %5dHz %12d %12d %d\n", pitch, cng_rx.channel_level, cng_rx.notch_level, hit); /*endif*/ } /*endfor*/ if (false_hit || false_miss) { printf("Test failed.\n"); exit(2); } /*endif*/ printf("Test passed.\n"); } /*endif*/ if ((test_list & PERFORM_TEST_2B)) { printf("Test 2b: CED detection with frequency\n"); awgn_init_dbm0(&chan_noise_source, 7162534, -50.0f); false_hit = FALSE; false_miss = FALSE; for (pitch = 1600; pitch < 2600; pitch++) { make_tone_gen_descriptor(&tone_desc, pitch, -11, 0, 0, 2600, 0, 0, 0, FALSE); tone_gen_init(&tone_tx, &tone_desc); modem_connect_tones_rx_init(&ced_rx, MODEM_CONNECT_TONES_FAX_CED, NULL, NULL); for (i = 0; i < 10*SAMPLE_RATE; i += SAMPLES_PER_CHUNK) { samples = tone_gen(&tone_tx, amp, SAMPLES_PER_CHUNK); for (j = 0; j < samples; j++) amp[j] += awgn(&chan_noise_source); /*endfor*/ modem_connect_tones_rx(&ced_rx, amp, samples); } /*endfor*/ hit = modem_connect_tones_rx_get(&ced_rx); if (pitch < (2100 - 70) || pitch > (2100 + 70)) { if (hit == MODEM_CONNECT_TONES_FAX_CED) false_hit = TRUE; } else if (pitch > (2100 - 50) && pitch < (2100 + 50)) { if (hit != MODEM_CONNECT_TONES_FAX_CED) false_miss = TRUE; } /*endif*/ if (hit) printf("Detected at %5dHz %12d %12d %d\n", pitch, ced_rx.channel_level, ced_rx.notch_level, hit); /*endif*/ } if (false_hit || false_miss) { printf("Test failed.\n"); exit(2); } /*endif*/ printf("Test passed.\n"); } /*endif*/ if ((test_list & PERFORM_TEST_2C)) { printf("Test 2c: EC disable detection with frequency\n"); awgn_init_dbm0(&chan_noise_source, 7162534, -50.0f); false_hit = FALSE; false_miss = FALSE; for (pitch = 2000; pitch < 2200; pitch++) { /* Use the transmitter to test the receiver */ modem_connect_tones_tx_init(&modem_tone_tx, MODEM_CONNECT_TONES_ANS_PR); /* Fudge things for the test */ modem_tone_tx.tone_phase_rate = dds_phase_rate(pitch); modem_tone_tx.level = dds_scaling_dbm0(-25); modem_connect_tones_rx_init(&ans_pr_rx, MODEM_CONNECT_TONES_ANS_PR, NULL, NULL); for (i = 0; i < 10*SAMPLE_RATE; i += SAMPLES_PER_CHUNK) { samples = modem_connect_tones_tx(&modem_tone_tx, amp, SAMPLES_PER_CHUNK); for (j = 0; j < samples; j++) amp[j] += awgn(&chan_noise_source); /*endfor*/ modem_connect_tones_rx(&ans_pr_rx, amp, samples); } /*endfor*/ hit = modem_connect_tones_rx_get(&ans_pr_rx); if (pitch < (2100 - 70) || pitch > (2100 + 70)) { if (hit == MODEM_CONNECT_TONES_ANS_PR) false_hit = TRUE; /*endif*/ } else if (pitch > (2100 - 50) && pitch < (2100 + 50)) { if (hit != MODEM_CONNECT_TONES_ANS_PR) false_miss = TRUE; /*endif*/ } /*endif*/ if (hit) printf("Detected at %5dHz %12d %12d %d\n", pitch, ans_pr_rx.channel_level, ans_pr_rx.notch_level, hit); /*endif*/ } /*endfor*/ if (false_hit || false_miss) { printf("Test failed.\n"); exit(2); } /*endif*/ printf("Test passed.\n"); } /*endif*/ if ((test_list & PERFORM_TEST_3A)) { printf("Test 3a: CNG detection with level\n"); awgn_init_dbm0(&chan_noise_source, 7162534, -60.0f); false_hit = FALSE; false_miss = FALSE; for (pitch = 1062; pitch <= 1138; pitch += 2*38) { for (level = LEVEL_MAX; level >= LEVEL_MIN; level--) { make_tone_gen_descriptor(&tone_desc, pitch, level, 0, 0, 500, 3000, 0, 0, TRUE); tone_gen_init(&tone_tx, &tone_desc); modem_connect_tones_rx_init(&cng_rx, MODEM_CONNECT_TONES_FAX_CNG, NULL, NULL); for (i = 0; i < 10*SAMPLE_RATE; i += SAMPLES_PER_CHUNK) { samples = tone_gen(&tone_tx, amp, SAMPLES_PER_CHUNK); for (j = 0; j < samples; j++) amp[j] += awgn(&chan_noise_source); /*endfor*/ modem_connect_tones_rx(&cng_rx, amp, samples); } /*endfor*/ hit = modem_connect_tones_rx_get(&cng_rx); if (level < LEVEL_MIN_REJECT) { if (hit == MODEM_CONNECT_TONES_FAX_CNG) { printf("False hit %d at %ddB\n", hit, level); false_hit = TRUE; } /*endif*/ } else if (level > LEVEL_MIN_ACCEPT) { if (hit != MODEM_CONNECT_TONES_FAX_CNG) { printf("False miss %d at %ddB\n", hit, level); false_miss = TRUE; } /*endif*/ } /*endif*/ if (hit) printf("Detected at %5dHz %4ddB %12d %12d %d\n", pitch, level, cng_rx.channel_level, cng_rx.notch_level, hit); /*endif*/ } /*endfor*/ } /*endfor*/ if (false_hit || false_miss) { printf("Test failed.\n"); exit(2); } /*endif*/ printf("Test passed.\n"); } /*endif*/ if ((test_list & PERFORM_TEST_3B)) { printf("Test 3b: CED detection with level\n"); awgn_init_dbm0(&chan_noise_source, 7162534, -60.0f); false_hit = FALSE; false_miss = FALSE; for (pitch = 2062; pitch <= 2138; pitch += 2*38) { for (level = LEVEL_MAX; level >= LEVEL_MIN; level--) { make_tone_gen_descriptor(&tone_desc, pitch, level, 0, 0, 2600, 0, 0, 0, FALSE); tone_gen_init(&tone_tx, &tone_desc); modem_connect_tones_rx_init(&ced_rx, MODEM_CONNECT_TONES_FAX_CED, NULL, NULL); for (i = 0; i < 10*SAMPLE_RATE; i += SAMPLES_PER_CHUNK) { samples = tone_gen(&tone_tx, amp, SAMPLES_PER_CHUNK); for (j = 0; j < samples; j++) amp[j] += awgn(&chan_noise_source); /*endfor*/ modem_connect_tones_rx(&ced_rx, amp, samples); } /*endfor*/ hit = modem_connect_tones_rx_get(&ced_rx); if (level < LEVEL_MIN_REJECT) { if (hit == MODEM_CONNECT_TONES_FAX_CED) false_hit = TRUE; /*endif*/ } else if (level > LEVEL_MIN_ACCEPT) { if (hit != MODEM_CONNECT_TONES_FAX_CED) false_miss = TRUE; /*endif*/ } /*endif*/ if (hit) printf("Detected at %5dHz %4ddB %12d %12d %d\n", pitch, level, ced_rx.channel_level, ced_rx.notch_level, hit); /*endif*/ } /*endfor*/ } /*endfor*/ if (false_hit || false_miss) { printf("Test failed.\n"); exit(2); } /*endif*/ printf("Test passed.\n"); } /*endif*/ if ((test_list & PERFORM_TEST_3C)) { printf("Test 3c: EC disable detection with level\n"); awgn_init_dbm0(&chan_noise_source, 7162534, -60.0f); false_hit = FALSE; false_miss = FALSE; for (pitch = 2062; pitch <= 2138; pitch += 2*38) { for (level = LEVEL_MAX; level >= LEVEL_MIN; level--) { /* Use the transmitter to test the receiver */ modem_connect_tones_tx_init(&modem_tone_tx, MODEM_CONNECT_TONES_ANS_PR); /* Fudge things for the test */ modem_tone_tx.tone_phase_rate = dds_phase_rate(pitch); modem_tone_tx.level = dds_scaling_dbm0(level); modem_connect_tones_rx_init(&ans_pr_rx, MODEM_CONNECT_TONES_ANS_PR, NULL, NULL); for (i = 0; i < 10*SAMPLE_RATE; i += SAMPLES_PER_CHUNK) { samples = modem_connect_tones_tx(&modem_tone_tx, amp, SAMPLES_PER_CHUNK); for (j = 0; j < samples; j++) amp[j] += awgn(&chan_noise_source); /*endfor*/ modem_connect_tones_rx(&ans_pr_rx, amp, samples); } /*endfor*/ hit = modem_connect_tones_rx_get(&ans_pr_rx); if (level < LEVEL_MIN_REJECT) { if (hit == MODEM_CONNECT_TONES_ANS_PR) false_hit = TRUE; /*endif*/ } else if (level > LEVEL_MIN_ACCEPT) { if (hit != MODEM_CONNECT_TONES_ANS_PR) false_miss = TRUE; /*endif*/ } /*endif*/ if (hit) printf("Detected at %5dHz %4ddB %12d %12d %d\n", pitch, level, ans_pr_rx.channel_level, ans_pr_rx.notch_level, hit); /*endif*/ } /*endfor*/ } /*endfor*/ if (false_hit || false_miss) { printf("Test failed.\n"); exit(2); } /*endif*/ printf("Test passed.\n"); } /*endif*/ if ((test_list & PERFORM_TEST_4)) { printf("Test 4: CED detection, when stimulated with V.21 preamble\n"); false_hit = FALSE; false_miss = FALSE; /* Send 255 bits of preamble (0.85s, the minimum specified preamble for T.30), and then some random bits. Check the preamble detector comes on, and goes off at reasonable times. */ fsk_tx_init(&preamble_tx, &preset_fsk_specs[FSK_V21CH2], preamble_get_bit, NULL); modem_connect_tones_rx_init(&ced_rx, MODEM_CONNECT_TONES_FAX_CED, preamble_detected, NULL); for (i = 0; i < 2*SAMPLE_RATE; i += SAMPLES_PER_CHUNK) { samples = fsk_tx(&preamble_tx, amp, SAMPLES_PER_CHUNK); modem_connect_tones_rx(&ced_rx, amp, samples); } /*endfor*/ for (i = 0; i < SAMPLE_RATE/10; i += SAMPLES_PER_CHUNK) { memset(amp, 0, sizeof(int16_t)*SAMPLES_PER_CHUNK); modem_connect_tones_rx(&ced_rx, amp, SAMPLES_PER_CHUNK); } /*endfor*/ if (preamble_on_at < 40 || preamble_on_at > 50 || preamble_off_at < 580 || preamble_off_at > 620) { printf("Test failed.\n"); exit(2); } /*endif*/ printf("Test passed.\n"); } /*endif*/ if ((test_list & PERFORM_TEST_5)) { printf("Test 5: EC disable detection with reversal interval\n"); awgn_init_dbm0(&chan_noise_source, 7162534, -60.0f); false_hit = FALSE; false_miss = FALSE; pitch = 2100; level = -15; for (interval = 400; interval < 500; interval++) { /* Use the transmitter to test the receiver */ modem_connect_tones_tx_init(&modem_tone_tx, MODEM_CONNECT_TONES_ANS_PR); /* Fudge things for the test */ modem_tone_tx.tone_phase_rate = dds_phase_rate(pitch); modem_tone_tx.level = dds_scaling_dbm0(level); modem_connect_tones_rx_init(&ans_pr_rx, MODEM_CONNECT_TONES_ANS_PR, NULL, NULL); for (i = 0; i < 10*SAMPLE_RATE; i += SAMPLES_PER_CHUNK) { samples = SAMPLES_PER_CHUNK; for (j = 0; j < samples; j++) { if (--modem_tone_tx.hop_timer <= 0) { modem_tone_tx.hop_timer = ms_to_samples(interval); modem_tone_tx.tone_phase += 0x80000000; } amp[j] = dds_mod(&modem_tone_tx.tone_phase, modem_tone_tx.tone_phase_rate, modem_tone_tx.level, 0); } for (j = 0; j < samples; j++) amp[j] += awgn(&chan_noise_source); /*endfor*/ modem_connect_tones_rx(&ans_pr_rx, amp, samples); } /*endfor*/ hit = modem_connect_tones_rx_get(&ans_pr_rx); if (interval < (450 - 25) || interval > (450 + 25)) { if (hit == MODEM_CONNECT_TONES_ANS_PR) false_hit = TRUE; } else if (interval > (450 - 25) && interval < (450 + 25)) { if (hit != MODEM_CONNECT_TONES_ANS_PR) false_miss = TRUE; } /*endif*/ if (hit) printf("Detected at %5dHz %4ddB %dms %12d %12d %d\n", pitch, level, interval, ans_pr_rx.channel_level, ans_pr_rx.notch_level, hit); /*endif*/ } /*endfor*/ if (false_hit || false_miss) { printf("Test failed.\n"); exit(2); } /*endif*/ printf("Test passed.\n"); } /*endif*/ if ((test_list & PERFORM_TEST_6)) { /* Talk-off test */ /* Here we use the BellCore and Mitel talk off test tapes, intended for DTMF detector testing. Presumably they should also have value here, but I am not sure. If those voice snippets were chosen to be tough on DTMF detectors, they might go easy on detectors looking for different pitches. However, the Mitel DTMF test tape is known (the hard way) to exercise 2280Hz tone detectors quite well. */ printf("Test 6: Talk-off test\n"); modem_connect_tones_rx_init(&cng_rx, MODEM_CONNECT_TONES_FAX_CNG, NULL, NULL); modem_connect_tones_rx_init(&ced_rx, MODEM_CONNECT_TONES_FAX_CED, NULL, NULL); modem_connect_tones_rx_init(&ans_pr_rx, MODEM_CONNECT_TONES_ANS_PR, NULL, NULL); hits = 0; for (j = 0; bellcore_files[j][0]; j++) { if ((inhandle = afOpenFile(bellcore_files[j], "r", 0)) == AF_NULL_FILEHANDLE) { fprintf(stderr, " Cannot open speech file '%s'\n", bellcore_files[j]); exit (2); } /*endif*/ if ((x = afGetFrameSize(inhandle, AF_DEFAULT_TRACK, 1)) != 2.0) { fprintf(stderr, " Unexpected frame size in speech file '%s'\n", bellcore_files[j]); exit (2); } /*endif*/ if ((x = afGetRate(inhandle, AF_DEFAULT_TRACK)) != (float) SAMPLE_RATE) { fprintf(stderr, " Unexpected sample rate in speech file '%s'\n", bellcore_files[j]); exit(2); } /*endif*/ if ((x = afGetChannels(inhandle, AF_DEFAULT_TRACK)) != 1.0) { fprintf(stderr, " Unexpected number of channels in speech file '%s'\n", bellcore_files[j]); exit(2); } /*endif*/ when = 0; hits = 0; while ((frames = afReadFrames(inhandle, AF_DEFAULT_TRACK, amp, 8000))) { when++; modem_connect_tones_rx(&cng_rx, amp, frames); modem_connect_tones_rx(&ced_rx, amp, frames); modem_connect_tones_rx(&ans_pr_rx, amp, frames); if (modem_connect_tones_rx_get(&cng_rx) != MODEM_CONNECT_TONES_NONE) { /* This is not a true measure of hits, as there might be more than one in a block of data. However, since the only good result is no hits, this approximation is OK. */ printf("Hit CNG at %ds\n", when); hits++; modem_connect_tones_rx_init(&cng_rx, MODEM_CONNECT_TONES_FAX_CNG, NULL, NULL); } /*endif*/ if (modem_connect_tones_rx_get(&ced_rx) != MODEM_CONNECT_TONES_NONE) { printf("Hit CED at %ds\n", when); hits++; modem_connect_tones_rx_init(&ced_rx, MODEM_CONNECT_TONES_FAX_CED, NULL, NULL); } /*endif*/ if (modem_connect_tones_rx_get(&ans_pr_rx) != MODEM_CONNECT_TONES_NONE) { printf("Hit EC disable at %ds\n", when); hits++; modem_connect_tones_rx_init(&ans_pr_rx, MODEM_CONNECT_TONES_ANS_PR, NULL, NULL); } /*endif*/ } /*endwhile*/ if (afCloseFile(inhandle) != 0) { fprintf(stderr, " Cannot close speech file '%s'\n", bellcore_files[j]); exit(2); } /*endif*/ printf(" File %d gave %d false hits.\n", j + 1, hits); } /*endfor*/ if (hits > 0) { printf("Test failed.\n"); exit(2); } /*endif*/ printf("Test passed.\n"); } /*endif*/ if (decode_test_file) { printf("Decode file '%s'\n", decode_test_file); modem_connect_tones_rx_init(&cng_rx, MODEM_CONNECT_TONES_FAX_CNG, cng_detected, NULL); modem_connect_tones_rx_init(&ced_rx, MODEM_CONNECT_TONES_FAX_CED, ced_detected, NULL); modem_connect_tones_rx_init(&ans_pr_rx, MODEM_CONNECT_TONES_ANS_PR, ec_dis_detected, NULL); hits = 0; if ((inhandle = afOpenFile(decode_test_file, "r", 0)) == AF_NULL_FILEHANDLE) { fprintf(stderr, " Cannot open speech file '%s'\n", decode_test_file); exit (2); } /*endif*/ if ((x = afGetFrameSize(inhandle, AF_DEFAULT_TRACK, 1)) != 2.0) { fprintf(stderr, " Unexpected frame size in speech file '%s'\n", decode_test_file); exit (2); } /*endif*/ if ((x = afGetRate(inhandle, AF_DEFAULT_TRACK)) != (float) SAMPLE_RATE) { fprintf(stderr, " Unexpected sample rate in speech file '%s'\n", decode_test_file); exit(2); } /*endif*/ if ((x = afGetChannels(inhandle, AF_DEFAULT_TRACK)) != 1.0) { fprintf(stderr, " Unexpected number of channels in speech file '%s'\n", decode_test_file); exit(2); } /*endif*/ when = 0; hits = 0; while ((frames = afReadFrames(inhandle, AF_DEFAULT_TRACK, amp, 8000))) { when++; modem_connect_tones_rx(&cng_rx, amp, frames); modem_connect_tones_rx(&ced_rx, amp, frames); modem_connect_tones_rx(&ans_pr_rx, amp, frames); } /*endwhile*/ if (afCloseFile(inhandle) != 0) { fprintf(stderr, " Cannot close speech file '%s'\n", decode_test_file); exit(2); } /*endif*/ printf(" File gave %d hits.\n", hits); } printf("Tests passed.\n"); return 0; } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/tests/echo_monitor.h0000644000175000017500000000415411150047203021066 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * echo_monitor.h - Display echo canceller status, using the FLTK toolkit. * * Written by Steve Underwood * * Copyright (C) 2004 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2, as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: echo_monitor.h,v 1.12 2008/04/26 13:39:16 steveu Exp $ */ /*! \page echo_monitor_page Echo canceller performance monitoring \section echo_monitor_page_sec_1 What does it do? This code controls a GUI window, which provides monitoring of the internal status of a time domain echo canceller. It shows, graphically: - the spectrum of the received signal. - the line model in use (when a known line model is being used). - the adapted coefficients of the canceller. \section echo_monitor_page_sec_2 How does it work? This code uses the FLTK cross platform GUI toolkit. It works on X11 and Windows platforms. In addition to the basic FLTK toolkit, fltk_cartesian is also required. */ #if !defined(_ECHO_MONITOR_H_) #define _ECHO_MONITOR_H_ #if defined(__cplusplus) extern "C" { #endif int start_echo_can_monitor(int len); int echo_can_monitor_can_update(const int16_t *coeffs, int len); int echo_can_monitor_line_model_update(const int32_t *coeffs, int len); int echo_can_monitor_line_spectrum_update(const int16_t amp[], int len); void echo_can_monitor_wait_to_end(void); void echo_can_monitor_update_display(void); #if defined(__cplusplus) } #endif #endif /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/tests/schedule_tests.c0000644000175000017500000000632011150047203021407 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * schedule_tests.c * * Written by Steve Underwood * * Copyright (C) 2004 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2, as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: schedule_tests.c,v 1.19 2008/05/13 13:17:26 steveu Exp $ */ /*! \page schedule_tests_page Event scheduler tests \section schedule_tests_page_sec_1 What does it do? ???. \section schedule_tests_page_sec_2 How does it work? ???. */ #if defined(HAVE_CONFIG_H) #include "config.h" #endif #include #include #include #include "spandsp.h" uint64_t when1; uint64_t when2; static void callback1(span_sched_state_t *s, void *user_data) { int id; uint64_t when; when = span_schedule_time(s); printf("1: Callback at %f %" PRId64 "\n", (float) when/1000000.0, when - when1); if ((when - when1)) { printf("Callback occured at the wrong time.\n"); exit(2); } id = span_schedule_event(s, 500000, callback1, NULL); when1 = when + 500000; when = span_schedule_next(s); printf("1: Event %d, earliest is %" PRId64 "\n", id, when); } static void callback2(span_sched_state_t *s, void *user_data) { int id; uint64_t when; when = span_schedule_time(s); printf("2: Callback at %f %" PRId64 "\n", (float) when/1000000.0, when - when2); id = span_schedule_event(s, 550000, callback2, NULL); if ((when - when2) != 10000) { printf("Callback occured at the wrong time.\n"); exit(2); } when2 = when + 550000; when = span_schedule_next(s); printf("2: Event %d, earliest is %" PRId64 "\n", id, when); } int main(int argc, char *argv[]) { int i; int id1; int id2; span_sched_state_t sched; uint64_t when; span_schedule_init(&sched); id1 = span_schedule_event(&sched, 500000, callback1, NULL); id2 = span_schedule_event(&sched, 550000, callback2, NULL); when1 = span_schedule_time(&sched) + 500000; when2 = span_schedule_time(&sched) + 550000; //span_schedule_del(&sched, id); for (i = 0; i < 100000000; i += 20000) { span_schedule_update(&sched, 20000); } when = span_schedule_time(&sched); if ((when1 - when) < 0 || (when1 - when) > 500000 || (when2 - when) < 0 || (when2 - when) > 550000) { printf("Callback failed to occur.\n"); exit(2); } span_schedule_release(&sched); printf("Tests passed.\n"); return 0; } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/tests/t38_terminal_to_gateway_tests.c0000644000175000017500000004323311150047203024353 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * t38_terminal_to_gateway_tests.c - Joint tests for the T.38 FoIP terminal and gateway modules. * * Written by Steve Underwood * * Copyright (C) 2005, 2006 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2, as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: t38_terminal_to_gateway_tests.c,v 1.58 2008/07/24 13:55:24 steveu Exp $ */ /*! \file */ /*! \page t38_terminal_to_gateway_tests_page T.38 mixed gateway and termination tests \section t38_terminal_to_gateway_tests_page_sec_1 What does it do? These tests exercise the path T.38 termination -> T.38 gateway -> FAX machine */ #if defined(HAVE_CONFIG_H) #include #endif #if defined(HAVE_FL_FL_H) && defined(HAVE_FL_FL_CARTESIAN_H) && defined(HAVE_FL_FL_AUDIO_METER_H) #define ENABLE_GUI #endif #include #include #include #include #include #include #include #include #include #include #if !defined(__USE_MISC) #define __USE_MISC #endif #include #include #include #include #include "spandsp.h" #include "spandsp-sim.h" #if defined(ENABLE_GUI) #include "media_monitor.h" #endif #define SAMPLES_PER_CHUNK 160 #define INPUT_FILE_NAME "../test-data/itu/fax/itutests.tif" #define OUTPUT_FILE_NAME "t38.tif" #define OUTPUT_FILE_NAME_WAVE "t38_terminal_to_gateway.wav" t38_terminal_state_t t38_state_a; t38_gateway_state_t t38_state_b; fax_state_t fax_state_b; g1050_state_t *path_a_to_b; g1050_state_t *path_b_to_a; double when = 0.0; int done[2] = {FALSE, FALSE}; int succeeded[2] = {FALSE, FALSE}; int simulate_incrementing_repeats = FALSE; static int phase_b_handler(t30_state_t *s, void *user_data, int result) { int i; i = (int) (intptr_t) user_data; printf("%c: Phase B handler on channel %c - (0x%X) %s\n", i, i, result, t30_frametype(result)); return T30_ERR_OK; } /*- End of function --------------------------------------------------------*/ static int phase_d_handler(t30_state_t *s, void *user_data, int result) { int i; t30_stats_t t; const char *u; i = (int) (intptr_t) user_data; printf("%c: Phase D handler on channel %c - (0x%X) %s\n", i, i, result, t30_frametype(result)); t30_get_transfer_statistics(s, &t); printf("%c: Phase D: bit rate %d\n", i, t.bit_rate); printf("%c: Phase D: ECM %s\n", i, (t.error_correcting_mode) ? "on" : "off"); printf("%c: Phase D: pages transferred %d\n", i, t.pages_transferred); printf("%c: Phase D: image size %d x %d\n", i, t.width, t.length); printf("%c: Phase D: image resolution %d x %d\n", i, t.x_resolution, t.y_resolution); printf("%c: Phase D: bad rows %d\n", i, t.bad_rows); printf("%c: Phase D: longest bad row run %d\n", i, t.longest_bad_row_run); printf("%c: Phase D: coding method %s\n", i, t4_encoding_to_str(t.encoding)); printf("%c: Phase D: image size %d bytes\n", i, t.image_size); if ((u = t30_get_tx_ident(s))) printf("%c: Phase D: local ident '%s'\n", i, u); if ((u = t30_get_rx_ident(s))) printf("%c: Phase D: remote ident '%s'\n", i, u); printf("%c: Phase D: bits per row - min %d, max %d\n", i, s->t4.min_row_bits, s->t4.max_row_bits); return T30_ERR_OK; } /*- End of function --------------------------------------------------------*/ static void phase_e_handler(t30_state_t *s, void *user_data, int result) { int i; t30_stats_t t; const char *u; i = (int) (intptr_t) user_data; printf("%c: Phase E handler on channel %c - (%d) %s\n", i, i, result, t30_completion_code_to_str(result)); t30_get_transfer_statistics(s, &t); printf("%c: Phase E: bit rate %d\n", i, t.bit_rate); printf("%c: Phase E: ECM %s\n", i, (t.error_correcting_mode) ? "on" : "off"); printf("%c: Phase E: pages transferred %d\n", i, t.pages_transferred); printf("%c: Phase E: image size %d x %d\n", i, t.width, t.length); printf("%c: Phase E: image resolution %d x %d\n", i, t.x_resolution, t.y_resolution); printf("%c: Phase E: bad rows %d\n", i, t.bad_rows); printf("%c: Phase E: longest bad row run %d\n", i, t.longest_bad_row_run); printf("%c: Phase E: coding method %s\n", i, t4_encoding_to_str(t.encoding)); printf("%c: Phase E: image size %d bytes\n", i, t.image_size); if ((u = t30_get_tx_ident(s))) printf("%c: Phase E: local ident '%s'\n", i, u); if ((u = t30_get_rx_ident(s))) printf("%c: Phase E: remote ident '%s'\n", i, u); succeeded[i - 'A'] = (result == T30_ERR_OK) && (t.pages_transferred == 12); done[i - 'A'] = TRUE; } /*- End of function --------------------------------------------------------*/ static int tx_packet_handler_a(t38_core_state_t *s, void *user_data, const uint8_t *buf, int len, int count) { t38_terminal_state_t *t; int i; static int subst_seq = 0; /* This routine queues messages between two instances of T.38 processing */ t = (t38_terminal_state_t *) user_data; if (simulate_incrementing_repeats) { for (i = 0; i < count; i++) { span_log(&s->logging, SPAN_LOG_FLOW, "Send seq %d, len %d\n", subst_seq, len); g1050_put(path_a_to_b, buf, len, subst_seq, when); subst_seq = (subst_seq + 1) & 0xFFFF; } } else { span_log(&s->logging, SPAN_LOG_FLOW, "Send seq %d, len %d, count %d\n", s->tx_seq_no, len, count); for (i = 0; i < count; i++) g1050_put(path_a_to_b, buf, len, s->tx_seq_no, when); } return 0; } /*- End of function --------------------------------------------------------*/ static int tx_packet_handler_b(t38_core_state_t *s, void *user_data, const uint8_t *buf, int len, int count) { t38_terminal_state_t *t; int i; static int subst_seq = 0; /* This routine queues messages between two instances of T.38 processing */ t = (t38_terminal_state_t *) user_data; if (simulate_incrementing_repeats) { for (i = 0; i < count; i++) { span_log(&s->logging, SPAN_LOG_FLOW, "Send seq %d, len %d\n", subst_seq, len); g1050_put(path_b_to_a, buf, len, subst_seq, when); subst_seq = (subst_seq + 1) & 0xFFFF; } } else { span_log(&s->logging, SPAN_LOG_FLOW, "Send seq %d, len %d, count %d\n", s->tx_seq_no, len, count); for (i = 0; i < count; i++) g1050_put(path_b_to_a, buf, len, s->tx_seq_no, when); } return 0; } /*- End of function --------------------------------------------------------*/ int main(int argc, char *argv[]) { int16_t t38_amp_b[SAMPLES_PER_CHUNK]; int16_t t30_amp_b[SAMPLES_PER_CHUNK]; int16_t out_amp[2*SAMPLES_PER_CHUNK]; int t38_len_b; int t30_len_b; int msg_len; uint8_t msg[1024]; int log_audio; int outframes; AFfilesetup filesetup; AFfilehandle wave_handle; int t38_version; int use_ecm; int use_tep; int feedback_audio; int use_transmit_on_idle; const char *input_file_name; int i; int seq_no; int model_no; int speed_pattern_no; double tx_when; double rx_when; int use_gui; int supported_modems; int opt; t30_state_t *t30; log_audio = FALSE; t38_version = 1; use_ecm = FALSE; input_file_name = INPUT_FILE_NAME; simulate_incrementing_repeats = FALSE; model_no = 0; speed_pattern_no = 1; use_gui = FALSE; use_tep = FALSE; feedback_audio = FALSE; use_transmit_on_idle = TRUE; supported_modems = T30_SUPPORT_V27TER | T30_SUPPORT_V29 | T30_SUPPORT_V17; while ((opt = getopt(argc, argv, "efgi:Ilm:M:s:tv:")) != -1) { switch (opt) { case 'e': use_ecm = TRUE; break; case 'f': feedback_audio = TRUE; break; case 'g': #if defined(ENABLE_GUI) use_gui = TRUE; #else fprintf(stderr, "Graphical monitoring not available\n"); exit(2); #endif break; case 'i': input_file_name = optarg; break; case 'I': simulate_incrementing_repeats = TRUE; break; case 'l': log_audio = TRUE; break; case 'm': supported_modems = atoi(optarg); break; case 'M': model_no = optarg[0] - 'A' + 1; break; case 's': speed_pattern_no = atoi(optarg); break; case 't': use_tep = TRUE; break; case 'v': t38_version = atoi(optarg); break; default: //usage(); exit(2); break; } } printf("Using T.38 version %d\n", t38_version); if (use_ecm) printf("Using ECM\n"); filesetup = AF_NULL_FILESETUP; wave_handle = AF_NULL_FILEHANDLE; if (log_audio) { if ((filesetup = afNewFileSetup()) == AF_NULL_FILESETUP) { fprintf(stderr, " Failed to create file setup\n"); exit(2); } afInitSampleFormat(filesetup, AF_DEFAULT_TRACK, AF_SAMPFMT_TWOSCOMP, 16); afInitRate(filesetup, AF_DEFAULT_TRACK, (float) SAMPLE_RATE); afInitFileFormat(filesetup, AF_FILE_WAVE); afInitChannels(filesetup, AF_DEFAULT_TRACK, 2); if ((wave_handle = afOpenFile(OUTPUT_FILE_NAME_WAVE, "w", filesetup)) == AF_NULL_FILEHANDLE) { fprintf(stderr, " Cannot create wave file '%s'\n", OUTPUT_FILE_NAME_WAVE); exit(2); } } srand48(0x1234567); if ((path_a_to_b = g1050_init(model_no, speed_pattern_no, 100, 33)) == NULL) { fprintf(stderr, "Failed to start IP network path model\n"); exit(2); } if ((path_b_to_a = g1050_init(model_no, speed_pattern_no, 100, 33)) == NULL) { fprintf(stderr, "Failed to start IP network path model\n"); exit(2); } if (t38_terminal_init(&t38_state_a, TRUE, tx_packet_handler_a, &t38_state_b) == NULL) { fprintf(stderr, "Cannot start the T.38 channel\n"); exit(2); } t30 = t38_terminal_get_t30_state(&t38_state_a); t38_set_t38_version(&t38_state_a.t38_fe.t38, t38_version); span_log_set_level(&t38_state_a.logging, SPAN_LOG_DEBUG | SPAN_LOG_SHOW_TAG | SPAN_LOG_SHOW_SAMPLE_TIME); span_log_set_tag(&t38_state_a.logging, "T.38-A"); span_log_set_level(&t38_state_a.t38_fe.t38.logging, SPAN_LOG_DEBUG | SPAN_LOG_SHOW_TAG | SPAN_LOG_SHOW_SAMPLE_TIME); span_log_set_tag(&t38_state_a.t38_fe.t38.logging, "T.38-A"); span_log_set_level(&t30->logging, SPAN_LOG_DEBUG | SPAN_LOG_SHOW_TAG | SPAN_LOG_SHOW_SAMPLE_TIME); span_log_set_tag(&t30->logging, "T.38-A"); t30_set_supported_modems(t30, supported_modems); t30_set_tx_ident(t30, "11111111"); t30_set_tx_file(t30, input_file_name, -1, -1); t30_set_phase_b_handler(t30, phase_b_handler, (void *) (intptr_t) 'A'); t30_set_phase_d_handler(t30, phase_d_handler, (void *) (intptr_t) 'A'); t30_set_phase_e_handler(t30, phase_e_handler, (void *) (intptr_t) 'A'); t30_set_ecm_capability(t30, use_ecm); if (use_ecm) t30_set_supported_compressions(t30, T30_SUPPORT_T4_1D_COMPRESSION | T30_SUPPORT_T4_2D_COMPRESSION | T30_SUPPORT_T6_COMPRESSION); if (t38_gateway_init(&t38_state_b, tx_packet_handler_b, &t38_state_a) == NULL) { fprintf(stderr, "Cannot start the T.38 channel\n"); exit(2); } t38_gateway_set_transmit_on_idle(&t38_state_b, use_transmit_on_idle); t38_set_t38_version(&t38_state_b.t38x.t38, t38_version); t38_gateway_set_ecm_capability(&t38_state_b, use_ecm); span_log_set_level(&t38_state_b.logging, SPAN_LOG_DEBUG | SPAN_LOG_SHOW_TAG | SPAN_LOG_SHOW_SAMPLE_TIME); span_log_set_tag(&t38_state_b.logging, "T.38-B"); span_log_set_level(&t38_state_b.t38x.t38.logging, SPAN_LOG_DEBUG | SPAN_LOG_SHOW_TAG | SPAN_LOG_SHOW_SAMPLE_TIME); span_log_set_tag(&t38_state_b.t38x.t38.logging, "T.38-B"); memset(t38_amp_b, 0, sizeof(t38_amp_b)); if (fax_init(&fax_state_b, FALSE) == NULL) { fprintf(stderr, "Cannot start FAX\n"); exit(2); } t30 = fax_get_t30_state(&fax_state_b); fax_set_transmit_on_idle(&fax_state_b, use_transmit_on_idle); fax_set_tep_mode(&fax_state_b, use_tep); t30_set_supported_modems(t30, supported_modems); t30_set_tx_ident(t30, "22222222"); t30_set_tx_nsf(t30, (const uint8_t *) "\x50\x00\x00\x00Spandsp\x00", 12); t30_set_rx_file(t30, OUTPUT_FILE_NAME, -1); t30_set_phase_b_handler(t30, phase_b_handler, (void *) (intptr_t) 'B'); t30_set_phase_d_handler(t30, phase_d_handler, (void *) (intptr_t) 'B'); t30_set_phase_e_handler(t30, phase_e_handler, (void *) (intptr_t) 'B'); t30_set_ecm_capability(t30, use_ecm); if (use_ecm) t30_set_supported_compressions(t30, T30_SUPPORT_T4_1D_COMPRESSION | T30_SUPPORT_T4_2D_COMPRESSION | T30_SUPPORT_T6_COMPRESSION); span_log_set_level(&fax_state_b.logging, SPAN_LOG_DEBUG | SPAN_LOG_SHOW_TAG | SPAN_LOG_SHOW_SAMPLE_TIME); span_log_set_tag(&fax_state_b.logging, "FAX-B "); span_log_set_level(&t30->logging, SPAN_LOG_DEBUG | SPAN_LOG_SHOW_TAG | SPAN_LOG_SHOW_SAMPLE_TIME); span_log_set_tag(&t30->logging, "FAX-B "); memset(t30_amp_b, 0, sizeof(t30_amp_b)); #if defined(ENABLE_GUI) if (use_gui) start_media_monitor(); #endif for (;;) { span_log_bump_samples(&t38_state_a.logging, SAMPLES_PER_CHUNK); span_log_bump_samples(&t38_state_a.t38_fe.t38.logging, SAMPLES_PER_CHUNK); span_log_bump_samples(&t38_state_a.t30.logging, SAMPLES_PER_CHUNK); span_log_bump_samples(&t38_state_b.logging, SAMPLES_PER_CHUNK); span_log_bump_samples(&t38_state_b.t38x.t38.logging, SAMPLES_PER_CHUNK); span_log_bump_samples(&fax_state_b.logging, SAMPLES_PER_CHUNK); span_log_bump_samples(&fax_state_b.t30.logging, SAMPLES_PER_CHUNK); memset(out_amp, 0, sizeof(out_amp)); t38_terminal_send_timeout(&t38_state_a, SAMPLES_PER_CHUNK); t30_len_b = fax_tx(&fax_state_b, t30_amp_b, SAMPLES_PER_CHUNK); if (!use_transmit_on_idle) { /* The receive side always expects a full block of samples, but the transmit side may not be sending any when it doesn't need to. We may need to pad with some silence. */ if (t30_len_b < SAMPLES_PER_CHUNK) { memset(t30_amp_b + t30_len_b, 0, sizeof(int16_t)*(SAMPLES_PER_CHUNK - t30_len_b)); t30_len_b = SAMPLES_PER_CHUNK; } } if (feedback_audio) { for (i = 0; i < t30_len_b; i++) t30_amp_b[i] += t38_amp_b[i] >> 1; } if (log_audio) { for (i = 0; i < t30_len_b; i++) out_amp[2*i + 1] = t30_amp_b[i]; } if (t38_gateway_rx(&t38_state_b, t30_amp_b, t30_len_b)) break; t38_len_b = t38_gateway_tx(&t38_state_b, t38_amp_b, SAMPLES_PER_CHUNK); if (!use_transmit_on_idle) { if (t38_len_b < SAMPLES_PER_CHUNK) { memset(t38_amp_b + t38_len_b, 0, sizeof(int16_t)*(SAMPLES_PER_CHUNK - t38_len_b)); t38_len_b = SAMPLES_PER_CHUNK; } } if (log_audio) { for (i = 0; i < t38_len_b; i++) out_amp[2*i] = t38_amp_b[i]; } if (fax_rx(&fax_state_b, t38_amp_b, SAMPLES_PER_CHUNK)) break; when += 0.02; while ((msg_len = g1050_get(path_a_to_b, msg, 1024, when, &seq_no, &tx_when, &rx_when)) >= 0) { #if defined(ENABLE_GUI) if (use_gui) media_monitor_rx(seq_no, tx_when, rx_when); #endif t38_core_rx_ifp_packet(&t38_state_b.t38x.t38, msg, msg_len, seq_no); } while ((msg_len = g1050_get(path_b_to_a, msg, 1024, when, &seq_no, &tx_when, &rx_when)) >= 0) { #if defined(ENABLE_GUI) if (use_gui) media_monitor_rx(seq_no, tx_when, rx_when); #endif t38_core_rx_ifp_packet(&t38_state_a.t38_fe.t38, msg, msg_len, seq_no); } if (log_audio) { outframes = afWriteFrames(wave_handle, AF_DEFAULT_TRACK, out_amp, SAMPLES_PER_CHUNK); if (outframes != SAMPLES_PER_CHUNK) break; } if (done[0] && done[1]) break; #if defined(ENABLE_GUI) if (use_gui) media_monitor_update_display(); #endif } t38_terminal_release(&t38_state_a); fax_release(&fax_state_b); if (log_audio) { if (afCloseFile(wave_handle) != 0) { fprintf(stderr, " Cannot close wave file '%s'\n", OUTPUT_FILE_NAME_WAVE); exit(2); } afFreeFileSetup(filesetup); } if (!succeeded[0] || !succeeded[1]) { printf("Tests failed\n"); exit(2); } printf("Tests passed\n"); return 0; } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/tests/fax_decode.c0000644000175000017500000004220111150047203020450 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * fax_decode.c - a simple FAX audio decoder * * Written by Steve Underwood * * Copyright (C) 2005 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2, as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: fax_decode.c,v 1.44 2008/07/22 13:48:16 steveu Exp $ */ /*! \page fax_decode_page FAX decoder \section fax_decode_page_sec_1 What does it do? ???. \section fax_decode_tests_page_sec_2 How does it work? ???. */ #if defined(HAVE_CONFIG_H) #include "config.h" #endif #include #include #include #include #include #include "spandsp.h" #define SAMPLES_PER_CHUNK 160 #define DISBIT1 0x01 #define DISBIT2 0x02 #define DISBIT3 0x04 #define DISBIT4 0x08 #define DISBIT5 0x10 #define DISBIT6 0x20 #define DISBIT7 0x40 #define DISBIT8 0x80 enum { FAX_NONE, FAX_V27TER_RX, FAX_V29_RX, FAX_V17_RX }; static const struct { int bit_rate; int modem_type; int which; uint8_t dcs_code; } fallback_sequence[] = { {14400, T30_MODEM_V17_14400, T30_SUPPORT_V17, DISBIT6}, {12000, T30_MODEM_V17_12000, T30_SUPPORT_V17, (DISBIT6 | DISBIT4)}, { 9600, T30_MODEM_V17_9600, T30_SUPPORT_V17, (DISBIT6 | DISBIT3)}, { 9600, T30_MODEM_V29_9600, T30_SUPPORT_V29, DISBIT3}, { 7200, T30_MODEM_V17_7200, T30_SUPPORT_V17, (DISBIT6 | DISBIT4 | DISBIT3)}, { 7200, T30_MODEM_V29_7200, T30_SUPPORT_V29, (DISBIT4 | DISBIT3)}, { 4800, T30_MODEM_V27TER_4800, T30_SUPPORT_V27TER, DISBIT4}, { 2400, T30_MODEM_V27TER_2400, T30_SUPPORT_V27TER, 0}, { 0, 0, 0, 0} }; int decode_test = FALSE; int rx_bits = 0; t30_state_t t30_dummy; t4_state_t t4_state; int t4_up = FALSE; hdlc_rx_state_t hdlcrx; int fast_trained = FAX_NONE; uint8_t ecm_data[256][260]; int16_t ecm_len[256]; int line_encoding = T4_COMPRESSION_ITU_T4_1D; int x_resolution = T4_X_RESOLUTION_R8; int y_resolution = T4_Y_RESOLUTION_STANDARD; int image_width = 1728; int octets_per_ecm_frame = 256; int error_correcting_mode = FALSE; int current_fallback = 0; static void print_frame(const char *io, const uint8_t *fr, int frlen) { int i; int type; const char *country; const char *vendor; const char *model; fprintf(stderr, "%s %s:", io, t30_frametype(fr[2])); for (i = 2; i < frlen; i++) fprintf(stderr, " %02x", fr[i]); fprintf(stderr, "\n"); type = fr[2] & 0xFE; if (type == T30_DIS || type == T30_DTC || type == T30_DCS) t30_decode_dis_dtc_dcs(&t30_dummy, fr, frlen); if (type == T30_NSF) { if (t35_decode(&fr[3], frlen - 3, &country, &vendor, &model)) { if (country) fprintf(stderr, "The remote was made in '%s'\n", country); if (vendor) fprintf(stderr, "The remote was made by '%s'\n", vendor); if (model) fprintf(stderr, "The remote is a '%s'\n", model); } } } /*- End of function --------------------------------------------------------*/ static int find_fallback_entry(int dcs_code) { int i; /* The table is short, and not searched often, so a brain-dead linear scan seems OK */ for (i = 0; fallback_sequence[i].bit_rate; i++) { if (fallback_sequence[i].dcs_code == dcs_code) break; } if (fallback_sequence[i].bit_rate == 0) return -1; return i; } /*- End of function --------------------------------------------------------*/ static int check_rx_dcs(const uint8_t *msg, int len) { static const int widths[3][4] = { { 864, 1024, 1216, -1}, /* R4 resolution - no longer used in recent versions of T.30 */ {1728, 2048, 2432, -1}, /* R8 resolution */ {3456, 4096, 4864, -1} /* R16 resolution */ }; uint8_t dcs_frame[T30_MAX_DIS_DTC_DCS_LEN]; /* Check DCS frame from remote */ if (len < 6) { printf("Short DCS frame\n"); return -1; } /* Make a local copy of the message, padded to the maximum possible length with zeros. This allows us to simply pick out the bits, without worrying about whether they were set from the remote side. */ if (len > T30_MAX_DIS_DTC_DCS_LEN) { memcpy(dcs_frame, msg, T30_MAX_DIS_DTC_DCS_LEN); } else { memcpy(dcs_frame, msg, len); if (len < T30_MAX_DIS_DTC_DCS_LEN) memset(dcs_frame + len, 0, T30_MAX_DIS_DTC_DCS_LEN - len); } octets_per_ecm_frame = (dcs_frame[6] & DISBIT4) ? 256 : 64; if ((dcs_frame[8] & DISBIT1)) y_resolution = T4_Y_RESOLUTION_SUPERFINE; else if (dcs_frame[4] & DISBIT7) y_resolution = T4_Y_RESOLUTION_FINE; else y_resolution = T4_Y_RESOLUTION_STANDARD; image_width = widths[(dcs_frame[8] & DISBIT3) ? 2 : 1][dcs_frame[5] & (DISBIT2 | DISBIT1)]; /* Check which compression we will use. */ if ((dcs_frame[6] & DISBIT7)) line_encoding = T4_COMPRESSION_ITU_T6; else if ((dcs_frame[4] & DISBIT8)) line_encoding = T4_COMPRESSION_ITU_T4_2D; else line_encoding = T4_COMPRESSION_ITU_T4_1D; fprintf(stderr, "Selected compression %d\n", line_encoding); if ((current_fallback = find_fallback_entry(dcs_frame[4] & (DISBIT6 | DISBIT5 | DISBIT4 | DISBIT3))) < 0) printf("Remote asked for a modem standard we do not support\n"); error_correcting_mode = ((dcs_frame[6] & DISBIT3) != 0); //v17_rx_restart(&v17, fallback_sequence[fallback_entry].bit_rate, FALSE); return 0; } /*- End of function --------------------------------------------------------*/ static void hdlc_accept(void *user_data, const uint8_t *msg, int len, int ok) { int type; int frame_no; int i; if (len < 0) { /* Special conditions */ switch (len) { case PUTBIT_CARRIER_UP: fprintf(stderr, "HDLC carrier up\n"); break; case PUTBIT_CARRIER_DOWN: fprintf(stderr, "HDLC carrier down\n"); break; case PUTBIT_FRAMING_OK: fprintf(stderr, "HDLC framing OK\n"); break; case PUTBIT_ABORT: /* Just ignore these */ break; default: fprintf(stderr, "Unexpected HDLC special length - %d!\n", len); break; } return; } if (ok) { if (msg[0] != 0xFF || !(msg[1] == 0x03 || msg[1] == 0x13)) { fprintf(stderr, "Bad frame header - %02x %02x", msg[0], msg[1]); return; } print_frame("HDLC: ", msg, len); type = msg[2] & 0xFE; switch (type) { case T4_FCD: if (len <= 4 + 256) { frame_no = msg[3]; /* Just store the actual image data, and record its length */ memcpy(&ecm_data[frame_no][0], &msg[4], len - 4); ecm_len[frame_no] = (int16_t) (len - 4); } break; case T30_DCS: check_rx_dcs(msg, len); break; } } else { fprintf(stderr, "Bad HDLC frame "); for (i = 0; i < len; i++) fprintf(stderr, " %02x", msg[i]); fprintf(stderr, "\n"); } } /*- End of function --------------------------------------------------------*/ static void t4_begin(void) { int i; //printf("Begin T.4 - %d %d %d %d\n", line_encoding, x_resolution, y_resolution, image_width); t4_rx_set_rx_encoding(&t4_state, line_encoding); t4_rx_set_x_resolution(&t4_state, x_resolution); t4_rx_set_y_resolution(&t4_state, y_resolution); t4_rx_set_image_width(&t4_state, image_width); t4_rx_start_page(&t4_state); t4_up = TRUE; for (i = 0; i < 256; i++) ecm_len[i] = -1; } /*- End of function --------------------------------------------------------*/ static void t4_end(void) { t4_stats_t stats; int i; int j; int k; if (!t4_up) return; if (error_correcting_mode) { for (i = 0; i < 256; i++) { for (j = 0; j < ecm_len[i]; j++) { for (k = 0; k < 8; k++) t4_rx_put_bit(&t4_state, (ecm_data[i][j] >> k) & 1); } fprintf(stderr, "%d", (ecm_len[i] < 0) ? 0 : 1); } fprintf(stderr, "\n"); } t4_rx_end_page(&t4_state); t4_get_transfer_statistics(&t4_state, &stats); fprintf(stderr, "Pages = %d\n", stats.pages_transferred); fprintf(stderr, "Image size = %dx%d\n", stats.width, stats.length); fprintf(stderr, "Image resolution = %dx%d\n", stats.x_resolution, stats.y_resolution); fprintf(stderr, "Bad rows = %d\n", stats.bad_rows); fprintf(stderr, "Longest bad row run = %d\n", stats.longest_bad_row_run); t4_up = FALSE; } /*- End of function --------------------------------------------------------*/ static void v21_put_bit(void *user_data, int bit) { if (bit < 0) { /* Special conditions */ switch (bit) { case PUTBIT_TRAINING_FAILED: fprintf(stderr, "V.21 Training failed\n"); break; case PUTBIT_TRAINING_SUCCEEDED: fprintf(stderr, "V.21 Training succeeded\n"); t4_begin(); break; case PUTBIT_CARRIER_UP: fprintf(stderr, "V.21 Carrier up\n"); break; case PUTBIT_CARRIER_DOWN: fprintf(stderr, "V.21 Carrier down\n"); t4_end(); break; default: fprintf(stderr, "V.21 Eh!\n"); break; } return; } if (fast_trained == FAX_NONE) hdlc_rx_put_bit(&hdlcrx, bit); //printf("V.21 Rx bit %d - %d\n", rx_bits++, bit); } /*- End of function --------------------------------------------------------*/ static void v17_put_bit(void *user_data, int bit) { if (bit < 0) { /* Special conditions */ switch (bit) { case PUTBIT_TRAINING_FAILED: fprintf(stderr, "V.17 Training failed\n"); break; case PUTBIT_TRAINING_SUCCEEDED: fprintf(stderr, "V.17 Training succeeded\n"); fast_trained = FAX_V17_RX; t4_begin(); break; case PUTBIT_CARRIER_UP: fprintf(stderr, "V.17 Carrier up\n"); break; case PUTBIT_CARRIER_DOWN: fprintf(stderr, "V.17 Carrier down\n"); t4_end(); if (fast_trained == FAX_V17_RX) fast_trained = FAX_NONE; break; default: fprintf(stderr, "V.17 Eh!\n"); break; } return; } if (error_correcting_mode) { hdlc_rx_put_bit(&hdlcrx, bit); } else { if (t4_rx_put_bit(&t4_state, bit)) { t4_end(); fprintf(stderr, "End of page detected\n"); } } //printf("V.17 Rx bit %d - %d\n", rx_bits++, bit); } /*- End of function --------------------------------------------------------*/ static void v29_put_bit(void *user_data, int bit) { if (bit < 0) { /* Special conditions */ switch (bit) { case PUTBIT_TRAINING_FAILED: //fprintf(stderr, "V.29 Training failed\n"); break; case PUTBIT_TRAINING_SUCCEEDED: fprintf(stderr, "V.29 Training succeeded\n"); fast_trained = FAX_V29_RX; t4_begin(); break; case PUTBIT_CARRIER_UP: //fprintf(stderr, "V.29 Carrier up\n"); break; case PUTBIT_CARRIER_DOWN: //fprintf(stderr, "V.29 Carrier down\n"); t4_end(); if (fast_trained == FAX_V29_RX) fast_trained = FAX_NONE; break; default: fprintf(stderr, "V.29 Eh!\n"); break; } return; } if (error_correcting_mode) { hdlc_rx_put_bit(&hdlcrx, bit); } else { if (t4_rx_put_bit(&t4_state, bit)) { t4_end(); fprintf(stderr, "End of page detected\n"); } } //printf("V.29 Rx bit %d - %d\n", rx_bits++, bit); } /*- End of function --------------------------------------------------------*/ static void v27ter_put_bit(void *user_data, int bit) { if (bit < 0) { /* Special conditions */ switch (bit) { case PUTBIT_TRAINING_FAILED: //fprintf(stderr, "V.27ter Training failed\n"); break; case PUTBIT_TRAINING_SUCCEEDED: fprintf(stderr, "V.27ter Training succeeded\n"); fast_trained = FAX_V27TER_RX; t4_begin(); break; case PUTBIT_CARRIER_UP: //fprintf(stderr, "V.27ter Carrier up\n"); break; case PUTBIT_CARRIER_DOWN: //fprintf(stderr, "V.27ter Carrier down\n"); if (fast_trained == FAX_V27TER_RX) fast_trained = FAX_NONE; break; default: fprintf(stderr, "V.27ter Eh!\n"); break; } return; } if (error_correcting_mode) { hdlc_rx_put_bit(&hdlcrx, bit); } else { if (t4_rx_put_bit(&t4_state, bit)) { t4_end(); fprintf(stderr, "End of page detected\n"); } } //printf("V.27ter Rx bit %d - %d\n", rx_bits++, bit); } /*- End of function --------------------------------------------------------*/ int main(int argc, char *argv[]) { fsk_rx_state_t fsk; v17_rx_state_t v17; v29_rx_state_t v29; v27ter_rx_state_t v27ter; int16_t amp[SAMPLES_PER_CHUNK]; AFfilehandle inhandle; int len; const char *filename; float x; filename = "fax_samp.wav"; if (argc > 1) filename = argv[1]; if ((inhandle = afOpenFile(filename, "r", NULL)) == AF_NULL_FILEHANDLE) { fprintf(stderr, " Cannot open wave file '%s'\n", filename); exit(2); } if ((x = afGetFrameSize(inhandle, AF_DEFAULT_TRACK, 1)) != 2.0) { printf(" Unexpected frame size in speech file '%s' (%f)\n", filename, x); exit(2); } if ((x = afGetRate(inhandle, AF_DEFAULT_TRACK)) != (float) SAMPLE_RATE) { printf(" Unexpected sample rate in speech file '%s' (%f)\n", filename, x); exit(2); } if ((x = afGetChannels(inhandle, AF_DEFAULT_TRACK)) != 1.0) { printf(" Unexpected number of channels in speech file '%s' (%f)\n", filename, x); exit(2); } memset(&t30_dummy, 0, sizeof(t30_dummy)); span_log_init(&t30_dummy.logging, SPAN_LOG_FLOW, NULL); span_log_set_protocol(&t30_dummy.logging, "T.30"); hdlc_rx_init(&hdlcrx, FALSE, TRUE, 5, hdlc_accept, NULL); fsk_rx_init(&fsk, &preset_fsk_specs[FSK_V21CH2], TRUE, v21_put_bit, NULL); v17_rx_init(&v17, 14400, v17_put_bit, NULL); v29_rx_init(&v29, 9600, v29_put_bit, NULL); //v29_rx_init(&v29, 7200, v29_put_bit, NULL); v27ter_rx_init(&v27ter, 4800, v27ter_put_bit, NULL); fsk_rx_signal_cutoff(&fsk, -45.5); v17_rx_signal_cutoff(&v17, -45.5); v29_rx_signal_cutoff(&v29, -45.5); v27ter_rx_signal_cutoff(&v27ter, -40.0); span_log_init(&v17.logging, SPAN_LOG_FLOW, NULL); span_log_set_protocol(&v17.logging, "V.17"); span_log_set_level(&v17.logging, SPAN_LOG_SHOW_SEVERITY | SPAN_LOG_SHOW_PROTOCOL | SPAN_LOG_SHOW_TAG | SPAN_LOG_FLOW); span_log_init(&v29.logging, SPAN_LOG_FLOW, NULL); span_log_set_protocol(&v29.logging, "V.29"); span_log_set_level(&v29.logging, SPAN_LOG_SHOW_SEVERITY | SPAN_LOG_SHOW_PROTOCOL | SPAN_LOG_SHOW_TAG | SPAN_LOG_FLOW); span_log_init(&v27ter.logging, SPAN_LOG_FLOW, NULL); span_log_set_protocol(&v27ter.logging, "V.27ter"); span_log_set_level(&v27ter.logging, SPAN_LOG_SHOW_SEVERITY | SPAN_LOG_SHOW_PROTOCOL | SPAN_LOG_SHOW_TAG | SPAN_LOG_FLOW); if (t4_rx_init(&t4_state, "fax_decode.tif", T4_COMPRESSION_ITU_T4_2D) == NULL) { fprintf(stderr, "Failed to init\n"); exit(0); } for (;;) { len = afReadFrames(inhandle, AF_DEFAULT_TRACK, amp, SAMPLES_PER_CHUNK); if (len < SAMPLES_PER_CHUNK) break; fsk_rx(&fsk, amp, len); v17_rx(&v17, amp, len); v29_rx(&v29, amp, len); v27ter_rx(&v27ter, amp, len); } t4_rx_end(&t4_state); if (afCloseFile(inhandle) != 0) { fprintf(stderr, " Cannot close wave file '%s'\n", filename); exit(2); } return 0; } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/tests/t38_terminal_tests.c0000644000175000017500000003433711150047203022135 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * t38_terminal_tests.c - Tests for the T.38 FoIP terminal module. * * Written by Steve Underwood * * Copyright (C) 2005, 2006 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2, as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: t38_terminal_tests.c,v 1.60 2008/07/24 13:55:24 steveu Exp $ */ /*! \file */ /*! \page t38_terminal_tests_page T.38 termination tests \section t38_terminal_tests_page_sec_1 What does it do? These tests exercise the path T.38 termination <-> T.38 termination */ #if defined(HAVE_CONFIG_H) #include #endif #if defined(HAVE_FL_FL_H) && defined(HAVE_FL_FL_CARTESIAN_H) && defined(HAVE_FL_FL_AUDIO_METER_H) #define ENABLE_GUI #endif #include #include #include #include #include #include #include #include #include #include #if !defined(__USE_MISC) #define __USE_MISC #endif #include #include #include #include "spandsp.h" #include "spandsp-sim.h" #if defined(ENABLE_GUI) #include "media_monitor.h" #endif #define SAMPLES_PER_CHUNK 160 #define INPUT_FILE_NAME "../test-data/itu/fax/itutests.tif" #define OUTPUT_FILE_NAME "t38.tif" t38_terminal_state_t t38_state_a; t38_terminal_state_t t38_state_b; g1050_state_t *path_a_to_b; g1050_state_t *path_b_to_a; double when = 0.0; int done[2] = {FALSE, FALSE}; int succeeded[2] = {FALSE, FALSE}; int simulate_incrementing_repeats = FALSE; static int phase_b_handler(t30_state_t *s, void *user_data, int result) { int i; i = (int) (intptr_t) user_data; printf("%c: Phase B handler on channel %c - (0x%X) %s\n", i, i, result, t30_frametype(result)); return T30_ERR_OK; } /*- End of function --------------------------------------------------------*/ static int phase_d_handler(t30_state_t *s, void *user_data, int result) { int i; t30_stats_t t; const char *u; i = (int) (intptr_t) user_data; printf("%c: Phase D handler on channel %c - (0x%X) %s\n", i, i, result, t30_frametype(result)); t30_get_transfer_statistics(s, &t); printf("%c: Phase D: bit rate %d\n", i, t.bit_rate); printf("%c: Phase D: ECM %s\n", i, (t.error_correcting_mode) ? "on" : "off"); printf("%c: Phase D: pages transferred %d\n", i, t.pages_transferred); printf("%c: Phase D: image size %d x %d\n", i, t.width, t.length); printf("%c: Phase D: image resolution %d x %d\n", i, t.x_resolution, t.y_resolution); printf("%c: Phase D: bad rows %d\n", i, t.bad_rows); printf("%c: Phase D: longest bad row run %d\n", i, t.longest_bad_row_run); printf("%c: Phase D: coding method %s\n", i, t4_encoding_to_str(t.encoding)); printf("%c: Phase D: image size %d bytes\n", i, t.image_size); if ((u = t30_get_tx_ident(s))) printf("%c: Phase D: local ident '%s'\n", i, u); if ((u = t30_get_rx_ident(s))) printf("%c: Phase D: remote ident '%s'\n", i, u); printf("%c: Phase D: bits per row - min %d, max %d\n", i, s->t4.min_row_bits, s->t4.max_row_bits); return T30_ERR_OK; } /*- End of function --------------------------------------------------------*/ static void phase_e_handler(t30_state_t *s, void *user_data, int result) { int i; t30_stats_t t; const char *u; i = (int) (intptr_t) user_data; printf("%c: Phase E handler on channel %c - (%d) %s\n", i, i, result, t30_completion_code_to_str(result)); t30_get_transfer_statistics(s, &t); printf("%c: Phase E: bit rate %d\n", i, t.bit_rate); printf("%c: Phase E: ECM %s\n", i, (t.error_correcting_mode) ? "on" : "off"); printf("%c: Phase E: pages transferred %d\n", i, t.pages_transferred); printf("%c: Phase E: image size %d x %d\n", i, t.width, t.length); printf("%c: Phase E: image resolution %d x %d\n", i, t.x_resolution, t.y_resolution); printf("%c: Phase E: bad rows %d\n", i, t.bad_rows); printf("%c: Phase E: longest bad row run %d\n", i, t.longest_bad_row_run); printf("%c: Phase E: coding method %s\n", i, t4_encoding_to_str(t.encoding)); printf("%c: Phase E: image size %d bytes\n", i, t.image_size); if ((u = t30_get_tx_ident(s))) printf("%c: Phase E: local ident '%s'\n", i, u); if ((u = t30_get_rx_ident(s))) printf("%c: Phase E: remote ident '%s'\n", i, u); succeeded[i - 'A'] = (result == T30_ERR_OK) && (t.pages_transferred == 12); //done[i - 'A'] = TRUE; } /*- End of function --------------------------------------------------------*/ static int tx_packet_handler_a(t38_core_state_t *s, void *user_data, const uint8_t *buf, int len, int count) { t38_terminal_state_t *t; int i; static int subst_seq = 0; /* This routine queues messages between two instances of T.38 processing */ t = (t38_terminal_state_t *) user_data; if (simulate_incrementing_repeats) { for (i = 0; i < count; i++) { span_log(&s->logging, SPAN_LOG_FLOW, "Send seq %d, len %d\n", subst_seq, len); if (g1050_put(path_a_to_b, buf, len, subst_seq, when) < 0) printf("Lost packet %d\n", subst_seq); subst_seq = (subst_seq + 1) & 0xFFFF; } } else { span_log(&s->logging, SPAN_LOG_FLOW, "Send seq %d, len %d, count %d\n", s->tx_seq_no, len, count); for (i = 0; i < count; i++) { if (g1050_put(path_a_to_b, buf, len, s->tx_seq_no, when) < 0) printf("Lost packet %d\n", s->tx_seq_no); } } return 0; } /*- End of function --------------------------------------------------------*/ static int tx_packet_handler_b(t38_core_state_t *s, void *user_data, const uint8_t *buf, int len, int count) { t38_terminal_state_t *t; int i; static int subst_seq = 0; /* This routine queues messages between two instances of T.38 processing */ t = (t38_terminal_state_t *) user_data; if (simulate_incrementing_repeats) { for (i = 0; i < count; i++) { span_log(&s->logging, SPAN_LOG_FLOW, "Send seq %d, len %d\n", subst_seq, len); g1050_put(path_b_to_a, buf, len, subst_seq, when); subst_seq = (subst_seq + 1) & 0xFFFF; } } else { span_log(&s->logging, SPAN_LOG_FLOW, "Send seq %d, len %d, count %d\n", s->tx_seq_no, len, count); for (i = 0; i < count; i++) g1050_put(path_b_to_a, buf, len, s->tx_seq_no, when); } return 0; } /*- End of function --------------------------------------------------------*/ int main(int argc, char *argv[]) { int msg_len; uint8_t msg[1024]; int t38_version; int seq_no; int use_ecm; int without_pacing; int use_tep; int model_no; int speed_pattern_no; const char *input_file_name; double tx_when; double rx_when; int use_gui; int supported_modems; int opt; t30_state_t *t30; t38_version = 1; without_pacing = FALSE; use_tep = FALSE; input_file_name = INPUT_FILE_NAME; use_ecm = FALSE; simulate_incrementing_repeats = FALSE; model_no = 0; speed_pattern_no = 1; use_gui = FALSE; supported_modems = T30_SUPPORT_V27TER | T30_SUPPORT_V29 | T30_SUPPORT_V17; while ((opt = getopt(argc, argv, "efgi:Im:M:ps:tv:")) != -1) { switch (opt) { case 'e': use_ecm = TRUE; break; case 'g': #if defined(ENABLE_GUI) use_gui = TRUE; #else fprintf(stderr, "Graphical monitoring not available\n"); exit(2); #endif break; case 'i': input_file_name = optarg; break; case 'I': simulate_incrementing_repeats = TRUE; break; case 'm': supported_modems = atoi(optarg); break; case 'M': model_no = optarg[0] - 'A' + 1; break; case 'p': without_pacing = TRUE; break; case 's': speed_pattern_no = atoi(optarg); break; case 't': use_tep = TRUE; break; case 'v': t38_version = atoi(optarg); break; default: //usage(); exit(2); break; } } printf("Using T.38 version %d\n", t38_version); if (use_ecm) printf("Using ECM\n"); srand48(0x1234567); if ((path_a_to_b = g1050_init(model_no, speed_pattern_no, 100, 33)) == NULL) { fprintf(stderr, "Failed to start IP network path model\n"); exit(2); } if ((path_b_to_a = g1050_init(model_no, speed_pattern_no, 100, 33)) == NULL) { fprintf(stderr, "Failed to start IP network path model\n"); exit(2); } if (t38_terminal_init(&t38_state_a, TRUE, tx_packet_handler_a, &t38_state_b) == NULL) { fprintf(stderr, "Cannot start the T.38 channel\n"); exit(2); } t30 = t38_terminal_get_t30_state(&t38_state_a); t38_set_t38_version(&t38_state_a.t38_fe.t38, t38_version); t38_terminal_set_config(&t38_state_a, without_pacing); t38_terminal_set_tep_mode(&t38_state_a, use_tep); span_log_set_level(&t38_state_a.logging, SPAN_LOG_DEBUG | SPAN_LOG_SHOW_TAG | SPAN_LOG_SHOW_SAMPLE_TIME); span_log_set_tag(&t38_state_a.logging, "T.38-A"); span_log_set_level(&t38_state_a.t38_fe.t38.logging, SPAN_LOG_DEBUG | SPAN_LOG_SHOW_TAG | SPAN_LOG_SHOW_SAMPLE_TIME); span_log_set_tag(&t38_state_a.t38_fe.t38.logging, "T.38-A"); span_log_set_level(&t30->logging, SPAN_LOG_DEBUG | SPAN_LOG_SHOW_TAG | SPAN_LOG_SHOW_SAMPLE_TIME); span_log_set_tag(&t30->logging, "T.38-A"); t30_set_supported_modems(t30, supported_modems); t30_set_tx_ident(t30, "11111111"); t30_set_tx_nsf(t30, (const uint8_t *) "\x50\x00\x00\x00Spandsp\x00", 12); t30_set_tx_file(t30, input_file_name, -1, -1); t30_set_phase_b_handler(t30, phase_b_handler, (void *) (intptr_t) 'A'); t30_set_phase_d_handler(t30, phase_d_handler, (void *) (intptr_t) 'A'); t30_set_phase_e_handler(t30, phase_e_handler, (void *) (intptr_t) 'A'); t30_set_ecm_capability(t30, use_ecm); if (use_ecm) t30_set_supported_compressions(t30, T30_SUPPORT_T4_1D_COMPRESSION | T30_SUPPORT_T4_2D_COMPRESSION | T30_SUPPORT_T6_COMPRESSION); if (t38_terminal_init(&t38_state_b, FALSE, tx_packet_handler_b, &t38_state_a) == NULL) { fprintf(stderr, "Cannot start the T.38 channel\n"); exit(2); } t30 = t38_terminal_get_t30_state(&t38_state_b); t38_set_t38_version(&t38_state_b.t38_fe.t38, t38_version); t38_terminal_set_config(&t38_state_b, without_pacing); t38_terminal_set_tep_mode(&t38_state_b, use_tep); span_log_set_level(&t38_state_b.logging, SPAN_LOG_DEBUG | SPAN_LOG_SHOW_TAG | SPAN_LOG_SHOW_SAMPLE_TIME); span_log_set_tag(&t38_state_b.logging, "T.38-B"); span_log_set_level(&t38_state_b.t38_fe.t38.logging, SPAN_LOG_DEBUG | SPAN_LOG_SHOW_TAG | SPAN_LOG_SHOW_SAMPLE_TIME); span_log_set_tag(&t38_state_b.t38_fe.t38.logging, "T.38-B"); span_log_set_level(&t30->logging, SPAN_LOG_DEBUG | SPAN_LOG_SHOW_TAG | SPAN_LOG_SHOW_SAMPLE_TIME); span_log_set_tag(&t30->logging, "T.38-B"); t30_set_supported_modems(t30, supported_modems); t30_set_tx_ident(t30, "22222222"); t30_set_tx_nsf(t30, (const uint8_t *) "\x50\x00\x00\x00Spandsp\x00", 12); t30_set_rx_file(t30, OUTPUT_FILE_NAME, -1); t30_set_phase_b_handler(t30, phase_b_handler, (void *) (intptr_t) 'B'); t30_set_phase_d_handler(t30, phase_d_handler, (void *) (intptr_t) 'B'); t30_set_phase_e_handler(t30, phase_e_handler, (void *) (intptr_t) 'B'); t30_set_ecm_capability(t30, use_ecm); if (use_ecm) t30_set_supported_compressions(t30, T30_SUPPORT_T4_1D_COMPRESSION | T30_SUPPORT_T4_2D_COMPRESSION | T30_SUPPORT_T6_COMPRESSION); #if defined(ENABLE_GUI) if (use_gui) start_media_monitor(); #endif for (;;) { span_log_bump_samples(&t38_state_a.logging, SAMPLES_PER_CHUNK); span_log_bump_samples(&t38_state_a.t38_fe.t38.logging, SAMPLES_PER_CHUNK); span_log_bump_samples(&t38_state_a.t30.logging, SAMPLES_PER_CHUNK); span_log_bump_samples(&t38_state_b.logging, SAMPLES_PER_CHUNK); span_log_bump_samples(&t38_state_b.t38_fe.t38.logging, SAMPLES_PER_CHUNK); span_log_bump_samples(&t38_state_b.t30.logging, SAMPLES_PER_CHUNK); done[0] = t38_terminal_send_timeout(&t38_state_a, SAMPLES_PER_CHUNK); done[1] = t38_terminal_send_timeout(&t38_state_b, SAMPLES_PER_CHUNK); when += 0.02; while ((msg_len = g1050_get(path_a_to_b, msg, 1024, when, &seq_no, &tx_when, &rx_when)) >= 0) { #if defined(ENABLE_GUI) if (use_gui) media_monitor_rx(seq_no, tx_when, rx_when); #endif t38_core_rx_ifp_packet(&t38_state_b.t38_fe.t38, msg, msg_len, seq_no); } while ((msg_len = g1050_get(path_b_to_a, msg, 1024, when, &seq_no, &tx_when, &rx_when)) >= 0) { #if defined(ENABLE_GUI) if (use_gui) media_monitor_rx(seq_no, tx_when, rx_when); #endif t38_core_rx_ifp_packet(&t38_state_a.t38_fe.t38, msg, msg_len, seq_no); } if (done[0] && done[1]) break; #if defined(ENABLE_GUI) if (use_gui) media_monitor_update_display(); #endif } t38_terminal_release(&t38_state_a); t38_terminal_release(&t38_state_b); if (!succeeded[0] || !succeeded[1]) { printf("Tests failed\n"); exit(2); } printf("Tests passed\n"); return 0; } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/tests/modem_monitor.h0000644000175000017500000000460711150047203021254 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * constel.h - Display QAM constellations, using the FLTK toolkit. * * Written by Steve Underwood * * Copyright (C) 2004 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2, as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: modem_monitor.h,v 1.15 2008/04/26 13:39:17 steveu Exp $ */ /*! \page constel_page Modem performance monitoring \section constel_page_sec_1 What does it do? This code controls a GUI window, which provides monitoring of the internal status of a modem. It shows, graphically: - the constellation, for PSK, QAM and other similar modulations. - the equalizer status, for modems with adaptive equalizers. - the carrier frequency. - the symbol timing correction. \section constel_page_sec_2 How does it work? This code uses the FLTK cross platform GUI toolkit. It works on X11 and Windows platforms. In addition to the basic FLTK toolkit, fltk_cartesian is also required. */ #if !defined(_MODEM_MONITOR_H_) #define _MODEM_MONITOR_H_ struct qam_monitor_s; typedef struct qam_monitor_s qam_monitor_t; #if defined(__cplusplus) extern "C" { #endif qam_monitor_t *qam_monitor_init(float constel_width, const char *tag); int qam_monitor_clear_constel(qam_monitor_t *s); int qam_monitor_update_constel(qam_monitor_t *s, const complexf_t *pt); int qam_monitor_update_equalizer(qam_monitor_t *s, const complexf_t *coeffs, int len); int qam_monitor_update_symbol_tracking(qam_monitor_t *s, float total_correction); int qam_monitor_update_carrier_tracking(qam_monitor_t *s, float carrier); int qam_monitor_update_audio_level(qam_monitor_t *s, const int16_t amp[], int len); void qam_wait_to_end(qam_monitor_t *s); #if defined(__cplusplus) } #endif #endif /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/tests/dds_tests.c0000644000175000017500000001775411150047203020402 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * dds_tests.c * * Written by Steve Underwood * * Copyright (C) 2003 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2, as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: dds_tests.c,v 1.24 2008/05/13 13:17:25 steveu Exp $ */ /*! \file */ /*! \page dds_tests_page Direct digital synthesis tests \section dds_tests_page_sec_1 What does it do? ???. \section dds_tests_page_sec_2 How does it work? ???. */ #if defined(HAVE_CONFIG_H) #include "config.h" #endif #include #include #include #include #include #include "spandsp.h" #define OUTPUT_FILE_NAME "dds.wav" #define OUTPUT_FILE_NAME_COMPLEX "complex_dds.wav" #define SAMPLES_PER_CHUNK 8000 int main(int argc, char *argv[]) { int i; uint32_t phase; int32_t phase_inc; int outframes; complexf_t camp; int16_t buf[2*SAMPLES_PER_CHUNK]; AFfilehandle outhandle; AFfilesetup filesetup; power_meter_t meter; power_meter_t meter_i; power_meter_t meter_q; int scale; power_meter_init(&meter, 10); printf("Non-complex DDS tests.\n"); if ((filesetup = afNewFileSetup()) == AF_NULL_FILESETUP) { fprintf(stderr, " Failed to create file setup\n"); exit(2); } afInitSampleFormat(filesetup, AF_DEFAULT_TRACK, AF_SAMPFMT_TWOSCOMP, 16); afInitRate(filesetup, AF_DEFAULT_TRACK, (float) SAMPLE_RATE); afInitFileFormat(filesetup, AF_FILE_WAVE); afInitChannels(filesetup, AF_DEFAULT_TRACK, 1); if ((outhandle = afOpenFile(OUTPUT_FILE_NAME, "w", filesetup)) == AF_NULL_FILEHANDLE) { fprintf(stderr, " Cannot create wave file '%s'\n", OUTPUT_FILE_NAME); exit(2); } phase = 0; printf("Test with 123.456789Hz.\n"); phase_inc = dds_phase_rate(123.456789f); scale = dds_scaling_dbm0(-10.0f); for (i = 0; i < SAMPLES_PER_CHUNK; i++) { buf[i] = alaw_to_linear(linear_to_alaw((dds(&phase, phase_inc)*scale) >> 15)); power_meter_update(&meter, buf[i]); } outframes = afWriteFrames(outhandle, AF_DEFAULT_TRACK, buf, SAMPLES_PER_CHUNK); if (outframes != SAMPLES_PER_CHUNK) { fprintf(stderr, " Error writing wave file\n"); exit(2); } printf("Level is %fdBOv/%fdBm0\n", power_meter_current_dbov(&meter), power_meter_current_dbm0(&meter)); if (fabs(power_meter_current_dbm0(&meter) + 10.0f) > 0.05f) { printf("Test failed.\n"); exit(2); } printf("Test with 12.3456789Hz.\n"); phase_inc = dds_phase_rate(12.3456789f); for (i = 0; i < SAMPLES_PER_CHUNK; i++) { buf[i] = alaw_to_linear(linear_to_alaw(dds(&phase, phase_inc))); power_meter_update(&meter, buf[i]); } outframes = afWriteFrames(outhandle, AF_DEFAULT_TRACK, buf, SAMPLES_PER_CHUNK); if (outframes != SAMPLES_PER_CHUNK) { fprintf(stderr, " Error writing wave file\n"); exit(2); } printf("Level is %fdBOv/%fdBm0\n", power_meter_current_dbov(&meter), power_meter_current_dbm0(&meter)); /* Use a wider tolerance for this very low frequency - the power meter will ripple */ if (fabs(power_meter_current_dbov(&meter) + 3.02f) > 0.2f) { printf("Test failed.\n"); exit(2); } printf("Test with 2345.6789Hz.\n"); phase_inc = dds_phase_rate(2345.6789f); scale = dds_scaling_dbov(-10.0f); for (i = 0; i < SAMPLES_PER_CHUNK; i++) { buf[i] = alaw_to_linear(linear_to_alaw((dds(&phase, phase_inc)*scale) >> 15)); power_meter_update(&meter, buf[i]); } outframes = afWriteFrames(outhandle, AF_DEFAULT_TRACK, buf, SAMPLES_PER_CHUNK); if (outframes != SAMPLES_PER_CHUNK) { fprintf(stderr, " Error writing wave file\n"); exit(2); } printf("Level is %fdBOv/%fdBm0\n", power_meter_current_dbov(&meter), power_meter_current_dbm0(&meter)); if (fabs(power_meter_current_dbov(&meter) + 10.0f) > 0.05f) { printf("Test failed.\n"); exit(2); } printf("Test with 3456.789Hz.\n"); phase_inc = dds_phase_rate(3456.789f); for (i = 0; i < SAMPLES_PER_CHUNK; i++) { buf[i] = alaw_to_linear(linear_to_alaw(dds(&phase, phase_inc))); power_meter_update(&meter, buf[i]); } outframes = afWriteFrames(outhandle, AF_DEFAULT_TRACK, buf, SAMPLES_PER_CHUNK); if (outframes != SAMPLES_PER_CHUNK) { fprintf(stderr, " Error writing wave file\n"); exit(2); } printf("Level is %fdBOv/%fdBm0\n", power_meter_current_dbov(&meter), power_meter_current_dbm0(&meter)); if (fabs(power_meter_current_dbov(&meter) + 3.02f) > 0.05f) { printf("Test failed.\n"); exit(2); } if (afCloseFile(outhandle) != 0) { fprintf(stderr, " Cannot close wave file '%s'\n", OUTPUT_FILE_NAME); exit(2); } afFreeFileSetup(filesetup); printf("Complex DDS tests,\n"); if ((filesetup = afNewFileSetup()) == AF_NULL_FILESETUP) { fprintf(stderr, " Failed to create file setup\n"); exit(2); } afInitSampleFormat(filesetup, AF_DEFAULT_TRACK, AF_SAMPFMT_TWOSCOMP, 16); afInitRate(filesetup, AF_DEFAULT_TRACK, (float) SAMPLE_RATE); afInitFileFormat(filesetup, AF_FILE_WAVE); afInitChannels(filesetup, AF_DEFAULT_TRACK, 2); if ((outhandle = afOpenFile(OUTPUT_FILE_NAME_COMPLEX, "w", filesetup)) == AF_NULL_FILEHANDLE) { fprintf(stderr, " Cannot create wave file '%s'\n", OUTPUT_FILE_NAME_COMPLEX); exit(2); } power_meter_init(&meter_i, 7); power_meter_init(&meter_q, 7); phase = 0; phase_inc = dds_phase_ratef(123.456789f); for (i = 0; i < SAMPLES_PER_CHUNK; i++) { camp = dds_complexf(&phase, phase_inc); buf[2*i] = camp.re*10000.0f; buf[2*i + 1] = camp.im*10000.0f; power_meter_update(&meter_i, buf[2*i]); power_meter_update(&meter_q, buf[2*i]); } outframes = afWriteFrames(outhandle, AF_DEFAULT_TRACK, buf, SAMPLES_PER_CHUNK); if (outframes != SAMPLES_PER_CHUNK) { fprintf(stderr, " Error writing wave file\n"); exit(2); } printf("Level is %fdBOv/%fdBm0, %fdBOv/%fdBm0\n", power_meter_current_dbov(&meter_i), power_meter_current_dbm0(&meter_i), power_meter_current_dbov(&meter_q), power_meter_current_dbm0(&meter_q)); if (fabs(power_meter_current_dbov(&meter_i) + 13.42f) > 0.05f || fabs(power_meter_current_dbov(&meter_q) + 13.42f) > 0.05f) { printf("Test failed.\n"); exit(2); } if (afCloseFile(outhandle) != 0) { fprintf(stderr, " Cannot close wave file '%s'\n", OUTPUT_FILE_NAME_COMPLEX); exit(2); } afFreeFileSetup(filesetup); printf("Tests passed.\n"); return 0; } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/tests/testfax.c0000644000175000017500000005152511150047203020056 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * testfax.c * * Written by Steve Underwood * * Copyright (C) 2003 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2, as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: testfax.c,v 1.32 2008/05/13 13:17:26 steveu Exp $ */ #if defined(HAVE_CONFIG_H) #include #endif #include #include #include #include #include #include #include #include #include #include #include #include #if defined(HAVE_LIBUNICALL) #include #include #include #include #include "unicall.h" //#include "../libmfcr2/libmfcr2.h" //#include "../libpri/libpri.h" //#include "../libpri/libfx.h" #include "spandsp.h" int caller_mode = FALSE; static AFfilehandle rxhandle; static AFfilehandle txhandle; typedef struct { pthread_t thread; int chan; int sig_fd; int fd; uc_call_t *call; uc_crn_t crn; int xxx; int cause; uc_t *uc; dtmf_rx_state_t dtmf_state; char dtmf[101]; int dtmf_ptr; char *tag; char originating_number[32]; char destination_number[32]; t30_state_t fax; } chan_stuff_t; chan_stuff_t chan_stuff[30]; tone_gen_descriptor_t tone_desc; tone_gen_state_t gen; pthread_mutex_t mutex; void channel_read_fax_channel(uc_t *uc, int chan, void *user_data, uint8_t *buf, int len); int channel_write_fax_channel(uc_t *uc, int chan, void *user_data, uint8_t *buf, int max_len); int channel_error(uc_t *uc, int chan, void *user_data, int cause); int signaling_error(uc_t *uc, void *user_data, int cause); void channel_read_fax_channel(uc_t *uc, int chan, void *user_data, uint8_t *buf, int len) { int i; int xlen; char *s; int outframes; #if 0 outframes = afWriteFrames(rxhandle, AF_DEFAULT_TRACK, buf, len >> 1); if (outframes != len) { printf("Failed to write %d samples\n", len); exit(2); } #endif dtmf_rx(&chan_stuff[chan].dtmf_state, (int16_t *) buf, len); xlen = dtmf_rx_get(&chan_stuff[chan].dtmf_state, chan_stuff[chan].dtmf + chan_stuff[chan].dtmf_ptr, 100 - chan_stuff[chan].dtmf_ptr); if (xlen > 0) { s = chan_stuff[chan].dtmf + chan_stuff[chan].dtmf_ptr; while (*s) { if (*s == '#') { uc_set_channel_read_callback(uc, 0, NULL, 0); uc_set_channel_write_callback(uc, 0, NULL, 0); if (uc_call_control(uc, UC_OP_DROPCALL, chan_stuff[chan].crn, (void *) UC_CAUSE_NORMAL_CLEARING)) printf ("A Drop Call failed\n"); /*endif*/ break; } /*endif*/ s++; } /*endwhile*/ printf("Got '%s'\n", chan_stuff[chan].dtmf); chan_stuff[chan].dtmf_ptr += xlen; } /*endif*/ t30_rx(&(chan_stuff[chan].fax), (int16_t *) buf, len); } /*- End of function --------------------------------------------------------*/ int channel_write_fax_channel(uc_t *uc, int chan, void *user_data, uint8_t *buf, int max_len) { int len; len = t30_tx(&(chan_stuff[chan].fax), (int16_t *) buf, max_len >> 1); afWriteFrames(txhandle, AF_DEFAULT_TRACK, buf, len); if (len > 0) len <<= 1; return len; } /*- End of function --------------------------------------------------------*/ int channel_error(uc_t *uc, int chan, void *user_data, int cause) { printf("Error %d\n", cause); return 0; } /*- End of function --------------------------------------------------------*/ int signaling_error(uc_t *uc, void *user_data, int cause) { printf("Error %d\n", cause); return 0; } /*- End of function --------------------------------------------------------*/ static void initiate_call(uc_t *uc, int chan, uc_event_t *e) { uc_makecall_t makecall; uc_callparms_t *callparms; int ret; printf ("Initiating call\n"); pthread_mutex_lock(&mutex); if ((callparms = uc_new_callparms(NULL)) == NULL) return; /*endif*/ pthread_mutex_unlock(&mutex); uc_callparm_originating_number(callparms, chan_stuff[chan].originating_number); uc_callparm_destination_number(callparms, chan_stuff[chan].destination_number); makecall.callparms = callparms; makecall.crn = 0; if (ret = uc_call_control(uc, UC_OP_MAKECALL, 0, (void *) &makecall) != UC_RET_OK) fprintf(stderr, "Make Call failed - %d\n", ret); /*endif*/ chan_stuff[chan].crn = makecall.crn; free(callparms); } /*- End of function --------------------------------------------------------*/ static void phase_b_handler(t30_state_t *s, void *user_data, int msg) { chan_stuff_t *t; t = (chan_stuff_t *) user_data; printf("Phase B - %d\n", msg); } /*- End of function --------------------------------------------------------*/ static void phase_d_handler(t30_state_t *s, void *user_data, int msg) { chan_stuff_t *t; t = (chan_stuff_t *) user_data; printf("Phase D - %d\n", msg); } /*- End of function --------------------------------------------------------*/ static void phase_e_handler(t30_state_t *s, void *user_data, int result) { chan_stuff_t *t; printf("Phase E - %d\n", result); t = (chan_stuff_t *) user_data; if (uc_call_control(t->uc, UC_OP_DROPCALL, t->crn, (void *) UC_CAUSE_NORMAL_CLEARING)) fprintf(stderr, "Phase E Drop Call failed\n"); /*endif*/ } /*- End of function --------------------------------------------------------*/ static void flush_handler(t30_state_t *s, void *user_data, int which) { chan_stuff_t *t; printf("Flush\n"); t = (chan_stuff_t *) user_data; } /*- End of function --------------------------------------------------------*/ static void handle_uc_event(uc_t *uc, void *user_data, uc_event_t *e) { int chan; chan = (int) user_data; printf ("-- %s (%d)\n", uc_event2str(e->e), chan); switch (e->e) { case UC_EVENT_DEVICEFAIL: break; case UC_EVENT_PROTOCOLFAIL: printf("-- Protocol failure on channel %d, cause %d\n", e->gen.channel, e->gen.data); break; case UC_EVENT_SIGCHANSTATUS: printf("-- Signalling channel status - %s\n", e->sigchanstatus.ok ? "Up" : "Down"); break; case UC_EVENT_ALARM: printf("-- Alarm - 0x%X 0x%X\n", e->alarm.raised, e->alarm.cleared); break; case UC_EVENT_FARBLOCKED: printf("-- Channel far end blocked! :-(\n"); chan_stuff[chan].xxx &= ~1; break; case UC_EVENT_FARUNBLOCKED: printf("-- Channel far end unblocked! :-)\n"); chan_stuff[chan].xxx |= 1; if (chan_stuff[chan].xxx == 3) { if (caller_mode) initiate_call(uc, chan, e); /*endif*/ } /*endif*/ break; case UC_EVENT_LOCALBLOCKED: printf("-- Channel local end blocked! :-(\n"); chan_stuff[chan].xxx &= ~2; break; case UC_EVENT_LOCALUNBLOCKED: printf("-- Channel local end unblocked! :-)\n"); chan_stuff[chan].xxx |= 2; if (chan_stuff[chan].xxx == 3) { if (caller_mode) initiate_call(uc, chan, e); /*endif*/ } /*endif*/ break; case UC_EVENT_DIALING: printf("-- Dialing on channel %d\n", e->gen.channel); break; case UC_EVENT_PROCEEDING: printf("-- Proceeding on channel %d\n", e->gen.channel); break; case UC_EVENT_ACCEPTED: printf("-- Accepted on channel %d\n", e->gen.channel); if (uc_call_control(uc, UC_OP_ANSWERCALL, e->gen.crn, (void *) -1)) fprintf(stderr, "Answer Call failed\n"); /*endif*/ break; case UC_EVENT_DETECTED: printf("-- Detected on channel %d\n", e->gen.channel); break; case UC_EVENT_MOREDIGITS: printf("-- More digits on channel %d, CRN %d (ANI: %s, DNIS: %s)\n", e->offered.channel, e->offered.crn, e->offered.parms.originating_number, e->offered.parms.destination_number); break; case UC_EVENT_ALERTING: printf("-- Alerting on channel %d\n", e->gen.channel); /* This is just a notification of call progress. We need take no action at this point. */ break; case UC_EVENT_FARDISCONNECTED: printf("-- Far end disconnected on channel %d\n", e->fardisconnected.channel); /* Kill any outstanding audio processing */ uc_set_channel_read_callback(uc, 0, NULL, 0); uc_set_channel_write_callback(uc, 0, NULL, 0); if (uc_call_control(uc, UC_OP_DROPCALL, e->fardisconnected.crn, (void *) UC_CAUSE_NORMAL_CLEARING)) fprintf(stderr, "C Drop Call failed\n"); /*endif*/ break; case UC_EVENT_DROPCALL: printf("-- Drop call on channel %d\n", e->gen.channel); if (uc_call_control(uc, UC_OP_RELEASECALL, e->gen.crn, NULL)) fprintf(stderr, "uc_ReleaseCall failed\n"); /*endif*/ break; case UC_EVENT_RELEASECALL: printf("-- Released on channel %d\n", e->gen.channel); if (caller_mode) initiate_call(uc, chan, e); /*endif*/ break; case UC_EVENT_OFFERED: printf("-- Offered on channel %d, CRN %d (ANI: %s, DNIS: %s)\n", e->offered.channel, e->offered.crn, e->offered.parms.originating_number, e->offered.parms.destination_number); if (!caller_mode) { switch (chan_stuff[chan].cause) { case 0: if (uc_call_control(uc, UC_OP_ACCEPTCALL, e->offered.crn, (void *) -1)) fprintf(stderr, "uc_AcceptCall failed\n"); /*endif*/ chan_stuff[chan].crn = e->offered.crn; break; case 1: if (uc_call_control(uc, UC_OP_ANSWERCALL, e->offered.crn, (void *) -1)) fprintf(stderr, "uc_AnswerCall failed\n"); /*endif*/ chan_stuff[chan].crn = e->offered.crn; break; case 2: if (uc_call_control(uc, UC_OP_DROPCALL, e->offered.crn, (void *) UC_CAUSE_USER_BUSY)) fprintf(stderr, "E Drop Call failed\n"); /*endif*/ break; case 3: if (uc_call_control(uc, UC_OP_DROPCALL, e->offered.crn, (void *) UC_CAUSE_UNASSIGNED_NUMBER)) fprintf(stderr, "F Drop Call failed\n"); /*endif*/ break; case 4: if (uc_call_control(uc, UC_OP_DROPCALL, e->offered.crn, (void *) UC_CAUSE_NETWORK_CONGESTION)) fprintf(stderr, "G Drop Call failed\n"); /*endif*/ break; case 5: if (uc_call_control(uc, UC_OP_DROPCALL, e->offered.crn, (void *) UC_CAUSE_DEST_OUT_OF_ORDER)) fprintf(stderr, "H Drop Call failed\n"); /*endif*/ break; } /*endswitch*/ if (++chan_stuff[chan].cause > 5) chan_stuff[chan].cause = 0; /*endif*/ } /*endif*/ break; case UC_EVENT_ANSWERED: printf("-- Answered on channel %d\n", e->gen.channel); uc_set_channel_read_callback(uc, 0, channel_read_fax_channel, (void *) chan); printf("XXX read callback set\n"); uc_set_channel_write_callback(uc, 0, channel_write_fax_channel, (void *) chan); printf("XXX write callback set\n"); t30_init(&(chan_stuff[chan].fax), FALSE, uc); t30_set_local_ident(&(chan_stuff[chan].fax), "12345678"); t30_set_tx_file(&(chan_stuff[chan].fax), "tx.tif"); //t30_set_rx_file(&(chan_stuff[chan].fax), "rx.tif"); t30_set_phase_b_handler(&(chan_stuff[chan].fax), phase_b_handler, &(chan_stuff[chan])); t30_set_phase_d_handler(&(chan_stuff[chan].fax), phase_d_handler, &(chan_stuff[chan])); t30_set_phase_e_handler(&(chan_stuff[chan].fax), phase_e_handler, &(chan_stuff[chan])); t30_set_flush_handler(&(chan_stuff[chan].fax), flush_handler, &(chan_stuff[chan])); printf("XXX FAX inited\n"); dtmf_rx_init(&chan_stuff[chan].dtmf_state, NULL, NULL); printf("XXX DTMF inited\n"); break; case UC_EVENT_CONNECTED: printf("-- Connected on channel %d\n", e->gen.channel); uc_set_channel_read_callback(uc, 0, channel_read_fax_channel, (void *) chan); printf("XXX read callback set\n"); uc_set_channel_write_callback(uc, 0, channel_write_fax_channel, (void *) chan); printf("XXX write callback set\n"); t30_init(&(chan_stuff[chan].fax), TRUE, uc); t30_set_local_ident(&(chan_stuff[chan].fax), "87654321"); t30_set_tx_file(&(chan_stuff[chan].fax), "tx.tif"); //t30_set_rx_file(&(chan_stuff[chan].fax), "rx.tif"); t30_set_phase_b_handler(&(chan_stuff[chan].fax), phase_b_handler, &(chan_stuff[chan])); t30_set_phase_d_handler(&(chan_stuff[chan].fax), phase_d_handler, &(chan_stuff[chan])); t30_set_phase_e_handler(&(chan_stuff[chan].fax), phase_e_handler, &(chan_stuff[chan])); printf("XXX FAX inited\n"); #if 0 if (uc_call_control(uc, UC_OP_DROPCALL, e->offered.crn, (void *) UC_CAUSE_NORMAL_CLEARING)) printf ("I Drop Call failed\n"); /*endif*/ #endif break; default: fprintf(stderr, "--!! Unknown signaling event %d\n", e->e); break; } /*endswitch*/ } /*- End of function --------------------------------------------------------*/ static void *run_uc(void *arg) { uc_t *uc; uc_event_t *e; struct timeval tv = {0,0}; struct timeval *next; fd_set rfds; fd_set wfds; fd_set efds; int res; int dfd; int chan; chan = *((int *) arg); dfd = chan_stuff[chan].fd; if (chan < 4) uc = uc_new(dfd, dfd, "fx", "ls,us", UC_MODE_CO, 1); else uc = uc_new(dfd, dfd, "fx", "ls", UC_MODE_CPE, 1); //uc = uc_new(dfd, dfd, "mfcr2", "cn", UC_MODE_CPE, 1); //uc = uc_new(dfd, dfd, "pri", "ctr4", UC_MODE_CPE, 1); if (uc == NULL) { fprintf(stderr, "Unable to create instance\n"); return NULL; } /*endif*/ uc_set_api_codec(uc, 0, UC_CODEC_LINEAR16); chan_stuff[chan].uc = uc; uc_set_signaling_callback(uc, handle_uc_event, (void *) chan); uc_set_signaling_error_callback(uc, signaling_error, (void *) chan); uc_set_channel_error_callback(uc, 0, channel_error, (void *) chan); uc_set_logging(uc, 0x7FFFFFFF, 0, chan_stuff[chan].tag); uc_call_control(uc, UC_OP_UNBLOCK, 0, (void *) -1); for (;;) { FD_ZERO(&rfds); FD_ZERO(&wfds); FD_ZERO(&efds); FD_SET(dfd, &rfds); FD_SET(dfd, &wfds); FD_SET(dfd, &efds); if ((next = uc_schedule_next(uc))) { gettimeofday(&tv, NULL); tv.tv_sec = next->tv_sec - tv.tv_sec; tv.tv_usec = next->tv_usec - tv.tv_usec; if (tv.tv_usec < 0) { tv.tv_usec += 1000000; tv.tv_sec -= 1; } /*endif*/ if (tv.tv_sec < 0) { tv.tv_sec = 0; tv.tv_usec = 0; } /*endif*/ } /*endif*/ res = select(dfd + 1, &rfds, NULL, &efds, next ? &tv : NULL); e = NULL; if (res == 0) { uc_schedule_run(uc); } else if (res > 0) { e = uc_check_event(uc); } else if (errno != EINTR) { fprintf(stderr, "Error (%d) on select: %s\n", errno, strerror(errno)); } /*endif*/ if (e) { printf("Non-callback signaling event\n"); handle_uc_event(uc, (void *) chan, e); } /*endif*/ } /*endfor*/ return NULL; } /*- End of function --------------------------------------------------------*/ int main(int argc, char *argv[]) { pthread_attr_t attr; struct zt_bufferinfo b; struct zt_gains g; int chan; int chanx; char dev_name[20]; AFfilesetup filesetup; int j; filesetup = afNewFileSetup(); if (filesetup == AF_NULL_FILESETUP) { fprintf(stderr, " Failed to create file setup\n"); exit(2); } afInitSampleFormat(filesetup, AF_DEFAULT_TRACK, AF_SAMPFMT_TWOSCOMP, 16); afInitRate(filesetup, AF_DEFAULT_TRACK, (float) SAMPLE_RATE); afInitFileFormat(filesetup, AF_FILE_WAVE); afInitChannels(filesetup, AF_DEFAULT_TRACK, 1); rxhandle = afOpenFile("rxfax.wav", "w", filesetup); if (rxhandle == AF_NULL_FILEHANDLE) { fprintf(stderr, " Failed to open fax audio file\n"); exit(2); } txhandle = afOpenFile("txfax.wav", "w", filesetup); if (txhandle == AF_NULL_FILEHANDLE) { fprintf(stderr, " Failed to open fax audio file\n"); exit(2); } if (argc < 1) { fprintf(stderr, "Usage: testcall [call]\n"); exit(1); } /*endif*/ uc_start(); pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); pthread_mutex_init(&mutex, NULL); for (chan = 0; chan < 5/*30*/; chan++) { chan_stuff[chan].sig_fd = open("/dev/zap/channel", O_RDWR | O_NONBLOCK); if (chan_stuff[chan].sig_fd < 0) { fprintf(stderr, "Failed to open channel: %s\n", strerror(errno)); exit(1); } /*endif*/ chan_stuff[chan].fd = chan_stuff[chan].sig_fd; /* Allow for the missing channel at TS16 */ chanx = chan + 1 + (chan + 15)%30; chanx = chan + 125; if (ioctl(chan_stuff[chan].fd, ZT_SPECIFY, &chanx)) { fprintf(stderr, "Failed to specify channel %d: %s\n", chanx, strerror(errno)); exit(1); } /*endif*/ if (ioctl(chan_stuff[chan].fd, ZT_GET_BUFINFO, &b)) { fprintf(stderr, "Unable to get buffer info on channel %d: %s\n", chanx, strerror(errno)); exit(1); } /*endif*/ printf ("%d %d %d %d %d %d\n", b.rxbufpolicy, b.txbufpolicy, b.numbufs, b.bufsize, b.readbufs, b.writebufs); b.rxbufpolicy = ZT_POLICY_IMMEDIATE; b.txbufpolicy = ZT_POLICY_IMMEDIATE; b.numbufs = 4; b.bufsize = 160; if (ioctl(chan_stuff[chan].fd, ZT_SET_BUFINFO, &b)) { fprintf(stderr, "Unable to set buffer info on channel %d: %s\n", chanx, strerror(errno)); exit(1); } /*endif*/ if (ioctl(chan_stuff[chan].fd, ZT_GET_BUFINFO, &b)) { fprintf(stderr, "Unable to get buffer info on channel %d: %s\n", chanx, strerror(errno)); exit(1); } /*endif*/ for (j = 0; j < 256; j++) { g.rxgain[j] = j; g.txgain[j] = j; } /*endif*/ ioctl(chan_stuff[chan].fd, ZT_SETGAINS, &g); printf("%d %d %d %d %d %d\n", b.rxbufpolicy, b.txbufpolicy, b.numbufs, b.bufsize, b.readbufs, b.writebufs); if (argc > 1) caller_mode = TRUE; /*endif*/ chan_stuff[chan].chan = chan; sprintf(dev_name, "Chan %2d:", chanx); chan_stuff[chan].tag = strdup(dev_name); sprintf(chan_stuff[chan].originating_number, "%d", 987654321 + chan); sprintf(chan_stuff[chan].destination_number, "%d", 1234 + chan); printf("Thread for channel %d\n", chan); if (pthread_create(&chan_stuff[chan].thread, &attr, run_uc, &chan_stuff[chan].chan)) exit(2); /*endif*/ } /*endfor*/ for (;;) { sleep(5); printf("Main thread\n"); } /*endfor*/ return 0; } /*- End of function --------------------------------------------------------*/ #else int main(int argc, char *argv[]) { printf("This program was not built with Unicall available\n"); } /*- End of function --------------------------------------------------------*/ #endif /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/tests/dc_restore_tests.c0000644000175000017500000000525711150047203021754 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * dc_restore_tests.c - Tests for the dc_restore functions. * * Written by Steve Underwood * * Copyright (C) 2001 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2, as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: dc_restore_tests.c,v 1.23 2008/05/13 13:17:25 steveu Exp $ */ /*! \page dc_restore_tests_page DC restoration tests \section dc_restore_tests_page_sec_1 What does it do? */ #if defined(HAVE_CONFIG_H) #include "config.h" #endif #include #include #include #include #include "spandsp.h" int main (int argc, char *argv[]) { awgn_state_t noise_source; dc_restore_state_t dc_state; int i; int idum = 1234567; int16_t dirty; int16_t clean; int estimate; int min; int max; int dc_offset; dc_offset = 5000; awgn_init_dbm0(&noise_source, idum, -10.0); dc_restore_init(&dc_state); for (i = 0; i < 100000; i++) { dirty = awgn(&noise_source) + dc_offset; clean = dc_restore(&dc_state, dirty); if ((i % 1000) == 0) { printf("Sample %6d: %d (expect %d)\n", i, dc_restore_estimate(&dc_state), dc_offset); } } /* We should have settled by now. Look at the variation we get */ min = 99999; max = -99999; for (i = 0; i < 100000; i++) { dirty = awgn(&noise_source) + dc_offset; clean = dc_restore(&dc_state, dirty); estimate = dc_restore_estimate(&dc_state); if (estimate < min) min = estimate; if (estimate > max) max = estimate; } printf("Spread of DC estimate for an offset of %d was %d to %d\n", dc_offset, min, max); if (min < dc_offset - 50 || max > dc_offset + 50) { printf("Test failed.\n"); exit(2); } printf("Test passed.\n"); return 0; } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/tests/dtmf_tx_tests.c0000644000175000017500000001445611150047203021271 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * dtmf_tx_tests.c - Test the DTMF generator. * * Written by Steve Underwood * * Copyright (C) 2003 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2, as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: dtmf_tx_tests.c,v 1.18 2008/05/13 13:17:25 steveu Exp $ */ /*! \file */ /*! \page dtmf_tx_tests_page DTMF generation tests \section dtmf_tx_tests_page_sec_1 What does it do? ???. \section dtmf_tx_tests_page_sec_2 How does it work? ???. */ #if defined(HAVE_CONFIG_H) #include "config.h" #endif #include #include #include #include #include #include #include "spandsp.h" #define OUTPUT_FILE_NAME "dtmf.wav" int main(int argc, char *argv[]) { dtmf_tx_state_t gen; int16_t amp[16384]; int len; AFfilehandle outhandle; AFfilesetup filesetup; int outframes; int add_digits; if ((filesetup = afNewFileSetup()) == AF_NULL_FILESETUP) { fprintf(stderr, " Failed to create file setup\n"); exit(2); } afInitSampleFormat(filesetup, AF_DEFAULT_TRACK, AF_SAMPFMT_TWOSCOMP, 16); afInitRate(filesetup, AF_DEFAULT_TRACK, 8000.0); //afInitCompression(filesetup, AF_DEFAULT_TRACK, AF_COMPRESSION_G711_ALAW); afInitFileFormat(filesetup, AF_FILE_WAVE); afInitChannels(filesetup, AF_DEFAULT_TRACK, 1); if ((outhandle = afOpenFile(OUTPUT_FILE_NAME, "w", filesetup)) == AF_NULL_FILEHANDLE) { fprintf(stderr, " Cannot open wave file '%s'\n", OUTPUT_FILE_NAME); exit(2); } dtmf_tx_init(&gen); len = dtmf_tx(&gen, amp, 16384); printf("Generated %d samples\n", len); outframes = afWriteFrames(outhandle, AF_DEFAULT_TRACK, amp, len); if (dtmf_tx_put(&gen, "123", -1)) printf("Ooops\n"); len = dtmf_tx(&gen, amp, 16384); printf("Generated %d samples\n", len); outframes = afWriteFrames(outhandle, AF_DEFAULT_TRACK, amp, len); if (dtmf_tx_put(&gen, "456", -1)) printf("Ooops\n"); len = dtmf_tx(&gen, amp, 160); printf("Generated %d samples\n", len); outframes = afWriteFrames(outhandle, AF_DEFAULT_TRACK, amp, len); if (dtmf_tx_put(&gen, "789", -1)) printf("Ooops\n"); len = dtmf_tx(&gen, amp, 160); printf("Generated %d samples\n", len); outframes = afWriteFrames(outhandle, AF_DEFAULT_TRACK, amp, len); if (dtmf_tx_put(&gen, "*#", -1)) printf("Ooops\n"); len = dtmf_tx(&gen, amp, 160); printf("Generated %d samples\n", len); outframes = afWriteFrames(outhandle, AF_DEFAULT_TRACK, amp, len); add_digits = 1; do { len = dtmf_tx(&gen, amp, 160); printf("Generated %d samples\n", len); if (len > 0) { outframes = afWriteFrames(outhandle, AF_DEFAULT_TRACK, amp, len); } if (add_digits) { if (dtmf_tx_put(&gen, "1234567890", -1)) { printf("Digit buffer full\n"); add_digits = 0; } } } while (len > 0); dtmf_tx_init(&gen); len = dtmf_tx(&gen, amp, 16384); printf("Generated %d samples\n", len); outframes = afWriteFrames(outhandle, AF_DEFAULT_TRACK, amp, len); if (dtmf_tx_put(&gen, "123", -1)) printf("Ooops\n"); len = dtmf_tx(&gen, amp, 16384); printf("Generated %d samples\n", len); outframes = afWriteFrames(outhandle, AF_DEFAULT_TRACK, amp, len); if (dtmf_tx_put(&gen, "456", -1)) printf("Ooops\n"); len = dtmf_tx(&gen, amp, 160); printf("Generated %d samples\n", len); outframes = afWriteFrames(outhandle, AF_DEFAULT_TRACK, amp, len); if (dtmf_tx_put(&gen, "789", -1)) printf("Ooops\n"); len = dtmf_tx(&gen, amp, 160); printf("Generated %d samples\n", len); outframes = afWriteFrames(outhandle, AF_DEFAULT_TRACK, amp, len); if (dtmf_tx_put(&gen, "0*#", -1)) printf("Ooops\n"); len = dtmf_tx(&gen, amp, 160); printf("Generated %d samples\n", len); outframes = afWriteFrames(outhandle, AF_DEFAULT_TRACK, amp, len); if (dtmf_tx_put(&gen, "ABCD", -1)) printf("Ooops\n"); len = dtmf_tx(&gen, amp, 160); printf("Generated %d samples\n", len); outframes = afWriteFrames(outhandle, AF_DEFAULT_TRACK, amp, len); /* Try modifying the level and length of the digits */ printf("Try different levels and timing\n"); dtmf_tx_set_level(&gen, -20, 5); dtmf_tx_set_timing(&gen, 100, 200); if (dtmf_tx_put(&gen, "123", -1)) printf("Ooops\n"); do { len = dtmf_tx(&gen, amp, 160); printf("Generated %d samples\n", len); if (len > 0) outframes = afWriteFrames(outhandle, AF_DEFAULT_TRACK, amp, len); } while (len > 0); printf("Restore normal levels and timing\n"); dtmf_tx_set_level(&gen, -10, 0); dtmf_tx_set_timing(&gen, 50, 55); if (dtmf_tx_put(&gen, "A", -1)) printf("Ooops\n"); add_digits = TRUE; do { len = dtmf_tx(&gen, amp, 160); printf("Generated %d samples\n", len); if (len > 0) { outframes = afWriteFrames(outhandle, AF_DEFAULT_TRACK, amp, len); } if (add_digits) { if (dtmf_tx_put(&gen, "1234567890", -1)) { printf("Digit buffer full\n"); add_digits = FALSE; } } } while (len > 0); if (afCloseFile(outhandle) != 0) { fprintf(stderr, " Cannot close wave file '%s'\n", OUTPUT_FILE_NAME); exit (2); } afFreeFileSetup(filesetup); return 0; } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/tests/async_tests.c0000644000175000017500000001640511150047203020735 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * async_tests.c - Tests for asynchronous serial processing. * * Written by Steve Underwood * * Copyright (C) 2004 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2, as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: async_tests.c,v 1.17 2008/05/13 13:17:25 steveu Exp $ */ /*! \file */ /*! \page async_tests_page Asynchronous bit stream tests \section async_tests_page_sec_1 What does it do? */ #if defined(HAVE_CONFIG_H) #include "config.h" #endif #include #include #include #include #include "spandsp.h" async_rx_state_t rx_async; async_tx_state_t tx_async; int full_len; uint8_t old_buf[1000]; uint8_t new_buf[1000]; volatile int tx_async_chars; volatile int rx_async_chars; volatile int rx_async_char_mask; int v14_test_async_tx_get_bit(void *user_data); int v14_test_async_tx_get_bit(void *user_data) { async_tx_state_t *s; int bit; static int destuff = 0; /* Special routine to test V.14 rate adaption, by randomly skipping stop bits. */ s = (async_tx_state_t *) user_data; if (s->bitpos == 0) { /* Start bit */ bit = 0; s->byte_in_progress = s->get_byte(s->user_data); s->parity_bit = 0; s->bitpos++; } else if (s->bitpos <= s->data_bits) { bit = s->byte_in_progress & 1; s->byte_in_progress >>= 1; s->parity_bit ^= bit; s->bitpos++; if (!s->parity && s->bitpos == s->data_bits + 1) { /* Drop the stop bit on every fourth character for V.14 simulation*/ if ((++destuff & 3) == 0) s->bitpos = 0; } } else if (s->parity && s->bitpos == s->data_bits + 1) { if (s->parity == ASYNC_PARITY_ODD) s->parity_bit ^= 1; bit = s->parity_bit; s->bitpos++; /* Drop the stop bit on every fourth character for V.14 simulation */ if ((++destuff & 3) == 0) s->bitpos = 0; } else { /* Stop bit(s) */ bit = 1; s->bitpos++; if (s->bitpos > s->data_bits + s->stop_bits) s->bitpos = 0; } return bit; } /*- End of function --------------------------------------------------------*/ static int test_get_async_byte(void *user_data) { int byte; byte = tx_async_chars & 0xFF; tx_async_chars++; return byte; } /*- End of function --------------------------------------------------------*/ static void test_put_async_byte(void *user_data, int byte) { if ((rx_async_chars & rx_async_char_mask) != byte) printf("Received byte is 0x%X (expected 0x%X)\n", byte, rx_async_chars); rx_async_chars++; } /*- End of function --------------------------------------------------------*/ int main(int argc, char *argv[]) { int bit; printf("Test with async 8N1\n"); async_tx_init(&tx_async, 8, ASYNC_PARITY_NONE, 1, FALSE, test_get_async_byte, NULL); async_rx_init(&rx_async, 8, ASYNC_PARITY_NONE, 1, FALSE, test_put_async_byte, NULL); tx_async_chars = 0; rx_async_chars = 0; rx_async_char_mask = 0xFF; while (rx_async_chars < 1000) { bit = async_tx_get_bit(&tx_async); async_rx_put_bit(&rx_async, bit); } printf("Chars=%d/%d, PE=%d, FE=%d\n", tx_async_chars, rx_async_chars, rx_async.parity_errors, rx_async.framing_errors); if (tx_async_chars != rx_async_chars || rx_async.parity_errors || rx_async.framing_errors) { printf("Test failed.\n"); exit(2); } printf("Test with async 7E1\n"); async_tx_init(&tx_async, 7, ASYNC_PARITY_EVEN, 1, FALSE, test_get_async_byte, NULL); async_rx_init(&rx_async, 7, ASYNC_PARITY_EVEN, 1, FALSE, test_put_async_byte, NULL); tx_async_chars = 0; rx_async_chars = 0; rx_async_char_mask = 0x7F; while (rx_async_chars < 1000) { bit = async_tx_get_bit(&tx_async); async_rx_put_bit(&rx_async, bit); } printf("Chars=%d/%d, PE=%d, FE=%d\n", tx_async_chars, rx_async_chars, rx_async.parity_errors, rx_async.framing_errors); if (tx_async_chars != rx_async_chars || rx_async.parity_errors || rx_async.framing_errors) { printf("Test failed.\n"); exit(2); } printf("Test with async 8O1\n"); async_tx_init(&tx_async, 8, ASYNC_PARITY_ODD, 1, FALSE, test_get_async_byte, NULL); async_rx_init(&rx_async, 8, ASYNC_PARITY_ODD, 1, FALSE, test_put_async_byte, NULL); tx_async_chars = 0; rx_async_chars = 0; rx_async_char_mask = 0xFF; while (rx_async_chars < 1000) { bit = async_tx_get_bit(&tx_async); async_rx_put_bit(&rx_async, bit); } printf("Chars=%d/%d, PE=%d, FE=%d\n", tx_async_chars, rx_async_chars, rx_async.parity_errors, rx_async.framing_errors); if (tx_async_chars != rx_async_chars || rx_async.parity_errors || rx_async.framing_errors) { printf("Test failed.\n"); exit(2); } printf("Test with async 8O1 and V.14\n"); async_tx_init(&tx_async, 8, ASYNC_PARITY_ODD, 1, TRUE, test_get_async_byte, NULL); async_rx_init(&rx_async, 8, ASYNC_PARITY_ODD, 1, TRUE, test_put_async_byte, NULL); tx_async_chars = 0; rx_async_chars = 0; rx_async_char_mask = 0xFF; while (rx_async_chars < 1000) { bit = v14_test_async_tx_get_bit(&tx_async); async_rx_put_bit(&rx_async, bit); } printf("Chars=%d/%d, PE=%d, FE=%d\n", tx_async_chars, rx_async_chars, rx_async.parity_errors, rx_async.framing_errors); if (tx_async_chars != rx_async_chars + 1 || rx_async.parity_errors || rx_async.framing_errors) { printf("Test failed.\n"); exit(2); } printf("Test with async 5N2\n"); async_tx_init(&tx_async, 5, ASYNC_PARITY_NONE, 2, FALSE, test_get_async_byte, NULL); async_rx_init(&rx_async, 5, ASYNC_PARITY_NONE, 2, FALSE, test_put_async_byte, NULL); tx_async_chars = 0; rx_async_chars = 0; rx_async_char_mask = 0x1F; while (rx_async_chars < 1000) { bit = async_tx_get_bit(&tx_async); async_rx_put_bit(&rx_async, bit); } printf("Chars=%d/%d, PE=%d, FE=%d\n", tx_async_chars, rx_async_chars, rx_async.parity_errors, rx_async.framing_errors); if (tx_async_chars != rx_async_chars || rx_async.parity_errors || rx_async.framing_errors) { printf("Test failed.\n"); exit(2); } printf("Tests passed.\n"); return 0; } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/tests/media_monitor.cpp0000644000175000017500000002061411150047203021561 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * media_monitor.cpp - Display IP streaming media status, using the FLTK toolkit. * * Written by Steve Underwood * * Copyright (C) 2007 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2, as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: media_monitor.cpp,v 1.4 2008/05/27 15:08:21 steveu Exp $ */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #if defined(HAVE_FL_FL_H) && defined(HAVE_FL_FL_CARTESIAN_H) #define __STDC_LIMIT_MACROS #include #include #include #include #include #include #include #include #include #include #include #include #include "spandsp.h" #include "media_monitor.h" Fl_Double_Window *w; Fl_Group *c_right; Fl_Group *c_sent; Fl_Group *c_received; Ca_Canvas *canvas_sent; Ca_X_Axis *sent_x; Ca_Y_Axis *sent_y; Ca_Line *sent_re = NULL; double sent_re_plot[1000]; double sent_re_plot_min; double sent_re_plot_max; Ca_Canvas *canvas_received; Ca_X_Axis *received_x; Ca_Y_Axis *received_y; Ca_Line *received_delays = NULL; double received_delays_plot[4000]; double received_delays_plot_max; int min_diff; int max_diff; int highest_seq_no_seen = -1; static int skip = 0; int in_ptr; void media_monitor_rx(int seq_no, double departure_time, double arrival_time) { double fdiff; int diff; int i; if (received_delays) delete received_delays; canvas_received->current(canvas_received); fdiff = (arrival_time - departure_time)*1000.0; diff = (int) fdiff; if (diff < 0) diff = 0; else if (diff > 1999) diff = 1999; received_delays_plot[2*diff + 1]++; if (received_delays_plot[2*diff + 1] > received_delays_plot_max) { received_delays_plot_max = received_delays_plot[2*diff + 1]; received_y->maximum(received_delays_plot_max); } if (diff > max_diff) { max_diff = diff; received_x->maximum((double) max_diff); } if (diff < min_diff) { min_diff = diff - 1; received_x->minimum((double) min_diff); } received_delays = new Ca_Line(2000, received_delays_plot, 0, 0, FL_BLUE, CA_NO_POINT); if (sent_re) delete sent_re; canvas_sent->current(canvas_sent); if (seq_no > highest_seq_no_seen + 1) { for (i = highest_seq_no_seen + 1; i < seq_no; i++) sent_re_plot[2*(i%500) + 1] = 0.0; } sent_re_plot[2*(seq_no%500) + 1] = fdiff; if (fdiff > sent_re_plot_max) { sent_re_plot_max = fdiff; sent_y->maximum(sent_re_plot_max); } if (fdiff < sent_re_plot_min) { sent_re_plot_min = fdiff - 1.0; sent_y->minimum(sent_re_plot_min); } sent_re = new Ca_Line(500, sent_re_plot, 0, 0, FL_BLUE, CA_NO_POINT); if (seq_no > highest_seq_no_seen) highest_seq_no_seen = seq_no; if (++skip >= 100) { skip = 0; Fl::check(); } } /*- End of function --------------------------------------------------------*/ int start_media_monitor(void) { char buf[132 + 1]; float x; float y; int i; int len; len = 128; w = new Fl_Double_Window(465, 400, "IP streaming media monitor"); c_right = new Fl_Group(0, 0, 465, 405); c_sent = new Fl_Group(0, 0, 465, 200); c_sent->box(FL_DOWN_BOX); c_sent->align(FL_ALIGN_TOP | FL_ALIGN_INSIDE); c_sent->current(); canvas_sent = new Ca_Canvas(110, 35, 300, 100, "Packet delays"); canvas_sent->box(FL_PLASTIC_DOWN_BOX); canvas_sent->color(7); canvas_sent->align(FL_ALIGN_TOP); Fl_Group::current()->resizable(canvas_sent); canvas_sent->border(15); sent_x = new Ca_X_Axis(115, 135, 290, 30, "Packet"); sent_x->align(FL_ALIGN_BOTTOM); sent_x->minimum(0.0); sent_x->maximum(500.0); sent_x->label_format("%g"); sent_x->minor_grid_color(fl_gray_ramp(20)); sent_x->major_grid_color(fl_gray_ramp(15)); sent_x->label_grid_color(fl_gray_ramp(10)); sent_x->grid_visible(CA_LABEL_GRID | CA_ALWAYS_VISIBLE); sent_x->minor_grid_style(FL_DOT); sent_x->major_step(5); sent_x->label_step(1); sent_x->axis_align(CA_BOTTOM | CA_LINE); sent_x->axis_color(FL_BLACK); sent_x->current(); sent_y = new Ca_Y_Axis(60, 40, 50, 90, "Delay\n(ms)"); sent_y->align(FL_ALIGN_LEFT); sent_y->minimum(0.0); sent_y->maximum(2000.0); sent_y->minor_grid_color(fl_gray_ramp(20)); sent_y->major_grid_color(fl_gray_ramp(15)); sent_y->label_grid_color(fl_gray_ramp(10)); sent_y->grid_visible(CA_LABEL_GRID | CA_ALWAYS_VISIBLE); sent_y->minor_grid_style(FL_DOT); sent_y->major_step(5); sent_y->label_step(1); sent_y->axis_color(FL_BLACK); sent_y->current(); c_sent->end(); c_received = new Fl_Group(0, 200, 465, 200); c_received->box(FL_DOWN_BOX); c_received->align(FL_ALIGN_TOP | FL_ALIGN_INSIDE); c_received->current(); canvas_received = new Ca_Canvas(110, 235, 300, 100, "Delay spread"); canvas_received->box(FL_PLASTIC_DOWN_BOX); canvas_received->color(7); canvas_received->align(FL_ALIGN_TOP); Fl_Group::current()->resizable(canvas_received); canvas_received->border(15); received_x = new Ca_X_Axis(115, 335, 290, 30, "Delay (ms)"); received_x->align(FL_ALIGN_BOTTOM); received_x->minimum(0.0); received_x->maximum(2000.0); received_x->label_format("%g"); received_x->minor_grid_color(fl_gray_ramp(20)); received_x->major_grid_color(fl_gray_ramp(15)); received_x->label_grid_color(fl_gray_ramp(10)); received_x->grid_visible(CA_LABEL_GRID | CA_ALWAYS_VISIBLE); received_x->minor_grid_style(FL_DOT); received_x->major_step(5); received_x->label_step(1); received_x->axis_align(CA_BOTTOM | CA_LINE); received_x->axis_color(FL_BLACK); received_x->current(); received_y = new Ca_Y_Axis(60, 240, 50, 90, "Freq"); received_y->align(FL_ALIGN_LEFT); received_y->minimum(0.0); received_y->maximum(50.0); received_y->minor_grid_color(fl_gray_ramp(20)); received_y->major_grid_color(fl_gray_ramp(15)); received_y->label_grid_color(fl_gray_ramp(10)); received_y->grid_visible(CA_LABEL_GRID | CA_ALWAYS_VISIBLE); received_y->minor_grid_style(FL_DOT); received_y->major_step(5); received_y->label_step(1); received_y->axis_color(FL_BLACK); received_y->current(); for (i = 0; i < 2000; i++) received_delays_plot[2*i] = i; received_delays_plot_max = 0.0; min_diff = 2000; max_diff = 0; for (i = 0; i < 500; i++) sent_re_plot[2*i] = i; sent_re_plot_min = 99999.0; sent_re_plot_max = 0.0; c_received->end(); c_right->end(); Fl_Group::current()->resizable(c_right); w->end(); w->show(); in_ptr = 0; Fl::check(); return 0; } /*- End of function --------------------------------------------------------*/ void media_monitor_wait_to_end(void) { fd_set rfds; int res; struct timeval tv; fprintf(stderr, "Processing complete. Press the key to end\n"); do { usleep(100000); Fl::check(); FD_ZERO(&rfds); FD_SET(0, &rfds); tv.tv_usec = 100000; tv.tv_sec = 0; res = select(1, &rfds, NULL, NULL, &tv); } while (res <= 0); } /*- End of function --------------------------------------------------------*/ void media_monitor_update_display(void) { Fl::check(); Fl::check(); Fl::check(); Fl::check(); Fl::check(); Fl::check(); Fl::check(); Fl::check(); Fl::check(); Fl::check(); Fl::check(); Fl::check(); } /*- End of function --------------------------------------------------------*/ #endif /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/test-data/0000755000175000017500000000000011150047620016753 5ustar julienjulieniaxmodem-1.2.0/lib/spandsp/test-data/Makefile.am0000644000175000017500000000163011150047203021004 0ustar julienjulien## ## SpanDSP - a series of DSP components for telephony ## ## Makefile.am - Process this file with automake to produce Makefile.in ## ## This program is free software; you can redistribute it and/or modify ## it under the terms of the GNU Lesser General Public License version 2.1, ## as published by the Free Software Foundation. ## ## This program is distributed in the hope that it will be useful, ## but WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ## GNU Lesser General Public License for more details. ## ## You should have received a copy of the GNU Lesser General Public ## License along with this program; if not, write to the Free Software ## Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ## ## $Id: Makefile.am,v 1.3 2008/07/10 12:44:54 steveu Exp $ SUBDIRS = itu etsi DIST_SUBDIRS = itu etsi local all: clean: iaxmodem-1.2.0/lib/spandsp/test-data/Makefile.in0000644000175000017500000003545211150047457021041 0ustar julienjulien# Makefile.in generated by automake 1.9.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = .. am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd INSTALL = @INSTALL@ install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = test-data DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/config/ax_compiler_vendor.m4 \ $(top_srcdir)/config/ax_check_real_file.m4 \ $(top_srcdir)/config/ax_fixed_point_machine.m4 \ $(top_srcdir)/config/ax_misaligned_access_fails.m4 \ $(top_srcdir)/config/ax_c99_features.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/src/config.h CONFIG_CLEAN_FILES = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-exec-recursive install-info-recursive \ install-recursive installcheck-recursive installdirs-recursive \ pdf-recursive ps-recursive uninstall-info-recursive \ uninstall-recursive ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMDEP_FALSE = @AMDEP_FALSE@ AMDEP_TRUE = @AMDEP_TRUE@ AMTAR = @AMTAR@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CC_FOR_BUILD = @CC_FOR_BUILD@ CFLAGS = @CFLAGS@ COMP_VENDOR_CFLAGS = @COMP_VENDOR_CFLAGS@ COMP_VENDOR_LDFLAGS = @COMP_VENDOR_LDFLAGS@ COND_DOC_FALSE = @COND_DOC_FALSE@ COND_DOC_TRUE = @COND_DOC_TRUE@ COND_MMX_FALSE = @COND_MMX_FALSE@ COND_MMX_TRUE = @COND_MMX_TRUE@ COND_SSE_FALSE = @COND_SSE_FALSE@ COND_SSE_TRUE = @COND_SSE_TRUE@ COND_TESTDATA_FALSE = @COND_TESTDATA_FALSE@ COND_TESTDATA_TRUE = @COND_TESTDATA_TRUE@ COND_TESTS_FALSE = @COND_TESTS_FALSE@ COND_TESTS_TRUE = @COND_TESTS_TRUE@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CPPFLAGS_FOR_BUILD = @CPPFLAGS_FOR_BUILD@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DSYMUTIL = @DSYMUTIL@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ GREP = @GREP@ INSERT_INTTYPES_HEADER = @INSERT_INTTYPES_HEADER@ INSERT_MATH_HEADER = @INSERT_MATH_HEADER@ INSERT_STDINT_HEADER = @INSERT_STDINT_HEADER@ INSERT_TGMATH_HEADER = @INSERT_TGMATH_HEADER@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ NMEDIT = @NMEDIT@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SPANDSP_LT_AGE = @SPANDSP_LT_AGE@ SPANDSP_LT_CURRENT = @SPANDSP_LT_CURRENT@ SPANDSP_LT_REVISION = @SPANDSP_LT_REVISION@ SPANDSP_MISALIGNED_ACCESS_FAILS = @SPANDSP_MISALIGNED_ACCESS_FAILS@ SPANDSP_USE_FIXED_POINT = @SPANDSP_USE_FIXED_POINT@ STRIP = @STRIP@ TESTLIBS = @TESTLIBS@ VERSION = @VERSION@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ SUBDIRS = itu etsi DIST_SUBDIRS = itu etsi local all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu test-data/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu test-data/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs distclean-libtool: -rm -f libtool uninstall-info-am: # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" mostlyclean-recursive clean-recursive distclean-recursive \ maintainer-clean-recursive: @failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ list='$(DISTFILES)'; for file in $$list; do \ case $$file in \ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ esac; \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ dir="/$$dir"; \ $(mkdir_p) "$(distdir)$$dir"; \ else \ dir=''; \ fi; \ if test -d $$d/$$file; then \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -d "$(distdir)/$$subdir" \ || $(mkdir_p) "$(distdir)/$$subdir" \ || exit 1; \ distdir=`$(am__cd) $(distdir) && pwd`; \ top_distdir=`$(am__cd) $(top_distdir) && pwd`; \ (cd $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$top_distdir" \ distdir="$$distdir/$$subdir" \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-libtool \ distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive info: info-recursive info-am: install-data-am: install-exec-am: install-info: install-info-recursive install-man: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-info-am uninstall-info: uninstall-info-recursive .PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am check check-am \ clean clean-generic clean-libtool clean-recursive ctags \ ctags-recursive distclean distclean-generic distclean-libtool \ distclean-recursive distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-exec install-exec-am install-info \ install-info-am install-man install-strip installcheck \ installcheck-am installdirs installdirs-am maintainer-clean \ maintainer-clean-generic maintainer-clean-recursive \ mostlyclean mostlyclean-generic mostlyclean-libtool \ mostlyclean-recursive pdf pdf-am ps ps-am tags tags-recursive \ uninstall uninstall-am uninstall-info-am all: clean: # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: iaxmodem-1.2.0/lib/spandsp/test-data/etsi/0000755000175000017500000000000011150047617017725 5ustar julienjulieniaxmodem-1.2.0/lib/spandsp/test-data/etsi/Makefile.am0000644000175000017500000000161111150047203021747 0ustar julienjulien## ## SpanDSP - a series of DSP components for telephony ## ## Makefile.am -- Process this file with automake to produce Makefile.in ## ## This program is free software; you can redistribute it and/or modify ## it under the terms of the GNU Lesser General Public License version 2.1, ## as published by the Free Software Foundation. ## ## This program is distributed in the hope that it will be useful, ## but WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ## GNU Lesser General Public License for more details. ## ## You should have received a copy of the GNU Lesser General Public ## License along with this program; if not, write to the Free Software ## Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ## ## $Id: Makefile.am,v 1.4 2008/07/10 12:44:54 steveu Exp $ SUBDIRS = fax DIST_SUBDIRS = fax all: clean: iaxmodem-1.2.0/lib/spandsp/test-data/etsi/Makefile.in0000644000175000017500000003545411150047457022007 0ustar julienjulien# Makefile.in generated by automake 1.9.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = ../.. am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd INSTALL = @INSTALL@ install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = test-data/etsi DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/config/ax_compiler_vendor.m4 \ $(top_srcdir)/config/ax_check_real_file.m4 \ $(top_srcdir)/config/ax_fixed_point_machine.m4 \ $(top_srcdir)/config/ax_misaligned_access_fails.m4 \ $(top_srcdir)/config/ax_c99_features.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/src/config.h CONFIG_CLEAN_FILES = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-exec-recursive install-info-recursive \ install-recursive installcheck-recursive installdirs-recursive \ pdf-recursive ps-recursive uninstall-info-recursive \ uninstall-recursive ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMDEP_FALSE = @AMDEP_FALSE@ AMDEP_TRUE = @AMDEP_TRUE@ AMTAR = @AMTAR@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CC_FOR_BUILD = @CC_FOR_BUILD@ CFLAGS = @CFLAGS@ COMP_VENDOR_CFLAGS = @COMP_VENDOR_CFLAGS@ COMP_VENDOR_LDFLAGS = @COMP_VENDOR_LDFLAGS@ COND_DOC_FALSE = @COND_DOC_FALSE@ COND_DOC_TRUE = @COND_DOC_TRUE@ COND_MMX_FALSE = @COND_MMX_FALSE@ COND_MMX_TRUE = @COND_MMX_TRUE@ COND_SSE_FALSE = @COND_SSE_FALSE@ COND_SSE_TRUE = @COND_SSE_TRUE@ COND_TESTDATA_FALSE = @COND_TESTDATA_FALSE@ COND_TESTDATA_TRUE = @COND_TESTDATA_TRUE@ COND_TESTS_FALSE = @COND_TESTS_FALSE@ COND_TESTS_TRUE = @COND_TESTS_TRUE@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CPPFLAGS_FOR_BUILD = @CPPFLAGS_FOR_BUILD@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DSYMUTIL = @DSYMUTIL@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ GREP = @GREP@ INSERT_INTTYPES_HEADER = @INSERT_INTTYPES_HEADER@ INSERT_MATH_HEADER = @INSERT_MATH_HEADER@ INSERT_STDINT_HEADER = @INSERT_STDINT_HEADER@ INSERT_TGMATH_HEADER = @INSERT_TGMATH_HEADER@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ NMEDIT = @NMEDIT@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SPANDSP_LT_AGE = @SPANDSP_LT_AGE@ SPANDSP_LT_CURRENT = @SPANDSP_LT_CURRENT@ SPANDSP_LT_REVISION = @SPANDSP_LT_REVISION@ SPANDSP_MISALIGNED_ACCESS_FAILS = @SPANDSP_MISALIGNED_ACCESS_FAILS@ SPANDSP_USE_FIXED_POINT = @SPANDSP_USE_FIXED_POINT@ STRIP = @STRIP@ TESTLIBS = @TESTLIBS@ VERSION = @VERSION@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ SUBDIRS = fax DIST_SUBDIRS = fax all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu test-data/etsi/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu test-data/etsi/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs distclean-libtool: -rm -f libtool uninstall-info-am: # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" mostlyclean-recursive clean-recursive distclean-recursive \ maintainer-clean-recursive: @failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ list='$(DISTFILES)'; for file in $$list; do \ case $$file in \ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ esac; \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ dir="/$$dir"; \ $(mkdir_p) "$(distdir)$$dir"; \ else \ dir=''; \ fi; \ if test -d $$d/$$file; then \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -d "$(distdir)/$$subdir" \ || $(mkdir_p) "$(distdir)/$$subdir" \ || exit 1; \ distdir=`$(am__cd) $(distdir) && pwd`; \ top_distdir=`$(am__cd) $(top_distdir) && pwd`; \ (cd $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$top_distdir" \ distdir="$$distdir/$$subdir" \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-libtool \ distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive info: info-recursive info-am: install-data-am: install-exec-am: install-info: install-info-recursive install-man: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-info-am uninstall-info: uninstall-info-recursive .PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am check check-am \ clean clean-generic clean-libtool clean-recursive ctags \ ctags-recursive distclean distclean-generic distclean-libtool \ distclean-recursive distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-exec install-exec-am install-info \ install-info-am install-man install-strip installcheck \ installcheck-am installdirs installdirs-am maintainer-clean \ maintainer-clean-generic maintainer-clean-recursive \ mostlyclean mostlyclean-generic mostlyclean-libtool \ mostlyclean-recursive pdf pdf-am ps ps-am tags tags-recursive \ uninstall uninstall-am uninstall-info-am all: clean: # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: iaxmodem-1.2.0/lib/spandsp/test-data/etsi/fax/0000755000175000017500000000000011150047617020503 5ustar julienjulieniaxmodem-1.2.0/lib/spandsp/test-data/etsi/fax/Makefile.am0000644000175000017500000000323111150047203022525 0ustar julienjulien## ## SpanDSP - a series of DSP components for telephony ## ## Makefile.am -- Process this file with automake to produce Makefile.in ## ## This program is free software; you can redistribute it and/or modify ## it under the terms of the GNU General Public License version 2, as ## published by the Free Software Foundation. ## ## This program is distributed in the hope that it will be useful, ## but WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ## GNU General Public License for more details. ## ## You should have received a copy of the GNU General Public License ## along with this program; if not, write to the Free Software ## Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ## ## $Id: Makefile.am,v 1.1 2008/07/10 12:44:54 steveu Exp $ AM_CFLAGS = $(COMP_VENDOR_CFLAGS) PBM2G3 = pbmtog3 FAX2TIFF = fax2tiff EXTRA_DIST = nobase_data_DATA = etsi_300_242_white.tif \ etsi_300_242_stairstep.tif \ etsi_300_242_diago1.tif \ etsi_300_242_diago2.tif \ etsi_300_242_impress.tif \ etsi_300_242_error.tif noinst_PROGRAMS = generate_etsi_300_242_pages generate_etsi_300_242_pages_SOURCES = generate_etsi_300_242_pages.c generate_etsi_300_242_pages_LDADD = -ltiff clean: rm -f *.tif *.g3 .g3.tif: ${FAX2TIFF} -M -o $*.tif $*.g3 .pbm.g3: ${PBM2G3} $*.pbm >$*.g3 etsi_300_242_white.tif \ etsi_300_242_stairstep.tif \ etsi_300_242_diago1.tif \ etsi_300_242_diago2.tif \ etsi_300_242_impress.tif \ etsi_300_242_error.tif: generate_etsi_300_242_pages$(EXEEXT) ./generate_etsi_300_242_pages$(EXEEXT) iaxmodem-1.2.0/lib/spandsp/test-data/etsi/fax/Makefile.in0000644000175000017500000004004011150047457022550 0ustar julienjulien# Makefile.in generated by automake 1.9.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = ../../.. am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd INSTALL = @INSTALL@ install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ noinst_PROGRAMS = generate_etsi_300_242_pages$(EXEEXT) subdir = test-data/etsi/fax DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/config/ax_compiler_vendor.m4 \ $(top_srcdir)/config/ax_check_real_file.m4 \ $(top_srcdir)/config/ax_fixed_point_machine.m4 \ $(top_srcdir)/config/ax_misaligned_access_fails.m4 \ $(top_srcdir)/config/ax_c99_features.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/src/config.h CONFIG_CLEAN_FILES = PROGRAMS = $(noinst_PROGRAMS) am_generate_etsi_300_242_pages_OBJECTS = \ generate_etsi_300_242_pages.$(OBJEXT) generate_etsi_300_242_pages_OBJECTS = \ $(am_generate_etsi_300_242_pages_OBJECTS) generate_etsi_300_242_pages_DEPENDENCIES = DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)/src depcomp = $(SHELL) $(top_srcdir)/config/depcomp am__depfiles_maybe = depfiles COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ SOURCES = $(generate_etsi_300_242_pages_SOURCES) DIST_SOURCES = $(generate_etsi_300_242_pages_SOURCES) am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = `echo $$p | sed -e 's|^.*/||'`; am__installdirs = "$(DESTDIR)$(datadir)" nobase_dataDATA_INSTALL = $(install_sh_DATA) DATA = $(nobase_data_DATA) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMDEP_FALSE = @AMDEP_FALSE@ AMDEP_TRUE = @AMDEP_TRUE@ AMTAR = @AMTAR@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CC_FOR_BUILD = @CC_FOR_BUILD@ CFLAGS = @CFLAGS@ COMP_VENDOR_CFLAGS = @COMP_VENDOR_CFLAGS@ COMP_VENDOR_LDFLAGS = @COMP_VENDOR_LDFLAGS@ COND_DOC_FALSE = @COND_DOC_FALSE@ COND_DOC_TRUE = @COND_DOC_TRUE@ COND_MMX_FALSE = @COND_MMX_FALSE@ COND_MMX_TRUE = @COND_MMX_TRUE@ COND_SSE_FALSE = @COND_SSE_FALSE@ COND_SSE_TRUE = @COND_SSE_TRUE@ COND_TESTDATA_FALSE = @COND_TESTDATA_FALSE@ COND_TESTDATA_TRUE = @COND_TESTDATA_TRUE@ COND_TESTS_FALSE = @COND_TESTS_FALSE@ COND_TESTS_TRUE = @COND_TESTS_TRUE@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CPPFLAGS_FOR_BUILD = @CPPFLAGS_FOR_BUILD@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DSYMUTIL = @DSYMUTIL@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ GREP = @GREP@ INSERT_INTTYPES_HEADER = @INSERT_INTTYPES_HEADER@ INSERT_MATH_HEADER = @INSERT_MATH_HEADER@ INSERT_STDINT_HEADER = @INSERT_STDINT_HEADER@ INSERT_TGMATH_HEADER = @INSERT_TGMATH_HEADER@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ NMEDIT = @NMEDIT@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SPANDSP_LT_AGE = @SPANDSP_LT_AGE@ SPANDSP_LT_CURRENT = @SPANDSP_LT_CURRENT@ SPANDSP_LT_REVISION = @SPANDSP_LT_REVISION@ SPANDSP_MISALIGNED_ACCESS_FAILS = @SPANDSP_MISALIGNED_ACCESS_FAILS@ SPANDSP_USE_FIXED_POINT = @SPANDSP_USE_FIXED_POINT@ STRIP = @STRIP@ TESTLIBS = @TESTLIBS@ VERSION = @VERSION@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ AM_CFLAGS = $(COMP_VENDOR_CFLAGS) PBM2G3 = pbmtog3 FAX2TIFF = fax2tiff EXTRA_DIST = nobase_data_DATA = etsi_300_242_white.tif \ etsi_300_242_stairstep.tif \ etsi_300_242_diago1.tif \ etsi_300_242_diago2.tif \ etsi_300_242_impress.tif \ etsi_300_242_error.tif generate_etsi_300_242_pages_SOURCES = generate_etsi_300_242_pages.c generate_etsi_300_242_pages_LDADD = -ltiff all: all-am .SUFFIXES: .SUFFIXES: .c .g3 .lo .o .obj .pbm .tif $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu test-data/etsi/fax/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu test-data/etsi/fax/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh clean-noinstPROGRAMS: @list='$(noinst_PROGRAMS)'; for p in $$list; do \ f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ echo " rm -f $$p $$f"; \ rm -f $$p $$f ; \ done generate_etsi_300_242_pages$(EXEEXT): $(generate_etsi_300_242_pages_OBJECTS) $(generate_etsi_300_242_pages_DEPENDENCIES) @rm -f generate_etsi_300_242_pages$(EXEEXT) $(LINK) $(generate_etsi_300_242_pages_LDFLAGS) $(generate_etsi_300_242_pages_OBJECTS) $(generate_etsi_300_242_pages_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/generate_etsi_300_242_pages.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ if $(LTCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs distclean-libtool: -rm -f libtool uninstall-info-am: install-nobase_dataDATA: $(nobase_data_DATA) @$(NORMAL_INSTALL) test -z "$(datadir)" || $(mkdir_p) "$(DESTDIR)$(datadir)" @$(am__vpath_adj_setup) \ list='$(nobase_data_DATA)'; for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ $(am__vpath_adj) \ echo " $(nobase_dataDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(datadir)/$$f'"; \ $(nobase_dataDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(datadir)/$$f"; \ done uninstall-nobase_dataDATA: @$(NORMAL_UNINSTALL) @$(am__vpath_adj_setup) \ list='$(nobase_data_DATA)'; for p in $$list; do \ $(am__vpath_adj) \ echo " rm -f '$(DESTDIR)$(datadir)/$$f'"; \ rm -f "$(DESTDIR)$(datadir)/$$f"; \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ list='$(DISTFILES)'; for file in $$list; do \ case $$file in \ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ esac; \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ dir="/$$dir"; \ $(mkdir_p) "$(distdir)$$dir"; \ else \ dir=''; \ fi; \ if test -d $$d/$$file; then \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) $(DATA) installdirs: for dir in "$(DESTDIR)$(datadir)"; do \ test -z "$$dir" || $(mkdir_p) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-libtool distclean-tags dvi: dvi-am dvi-am: html: html-am info: info-am info-am: install-data-am: install-nobase_dataDATA install-exec-am: install-info: install-info-am install-man: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-info-am uninstall-nobase_dataDATA .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstPROGRAMS ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-exec \ install-exec-am install-info install-info-am install-man \ install-nobase_dataDATA install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-info-am \ uninstall-nobase_dataDATA clean: rm -f *.tif *.g3 .g3.tif: ${FAX2TIFF} -M -o $*.tif $*.g3 .pbm.g3: ${PBM2G3} $*.pbm >$*.g3 etsi_300_242_white.tif \ etsi_300_242_stairstep.tif \ etsi_300_242_diago1.tif \ etsi_300_242_diago2.tif \ etsi_300_242_impress.tif \ etsi_300_242_error.tif: generate_etsi_300_242_pages$(EXEEXT) ./generate_etsi_300_242_pages$(EXEEXT) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: iaxmodem-1.2.0/lib/spandsp/test-data/etsi/fax/generate_etsi_300_242_pages.c0000644000175000017500000004240411150047203025610 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * generate_etsi_300_242_pages.c - Create the test pages defined in ETSI ETS 300 242. * * Written by Steve Underwood * * Copyright (C) 2006 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2, as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: generate_etsi_300_242_pages.c,v 1.1 2008/07/10 12:44:54 steveu Exp $ */ /*! \file */ #if defined(HAVE_CONFIG_H) #include "config.h" #endif #include #include #include #include #include #include #include #include #include #if defined(HAVE_TGMATH_H) #include #endif #if defined(HAVE_MATH_H) #include #endif #include "spandsp.h" struct { const char *name; int x_res; int y_res; int width; int length; int compression; int type; } sequence[] = { { "etsi_300_242_white.tif", T4_X_RESOLUTION_R8, T4_Y_RESOLUTION_STANDARD, T4_WIDTH_R8_A4, 1100, COMPRESSION_CCITT_T4, 0 }, { "etsi_300_242_stairstep.tif", T4_X_RESOLUTION_R8, T4_Y_RESOLUTION_STANDARD, T4_WIDTH_R8_A4, 1100, COMPRESSION_CCITT_T4, 1 }, { "etsi_300_242_diago1.tif", T4_X_RESOLUTION_R8, T4_Y_RESOLUTION_STANDARD, T4_WIDTH_R8_A4, 1100, COMPRESSION_CCITT_T4, 2 }, { "etsi_300_242_diago2.tif", T4_X_RESOLUTION_R8, T4_Y_RESOLUTION_STANDARD, T4_WIDTH_R8_A4, 1100, COMPRESSION_CCITT_T4, 3 }, { "etsi_300_242_impress.tif", T4_X_RESOLUTION_R8, T4_Y_RESOLUTION_STANDARD, T4_WIDTH_R8_A4, 1100, COMPRESSION_CCITT_T4, 4 }, { "etsi_300_242_duration1.tif", T4_X_RESOLUTION_R8, T4_Y_RESOLUTION_STANDARD, T4_WIDTH_R8_A4, 1100, COMPRESSION_CCITT_T4, 5 }, { "etsi_300_242_duration2.tif", T4_X_RESOLUTION_R8, T4_Y_RESOLUTION_STANDARD, T4_WIDTH_R8_A4, 1100, COMPRESSION_CCITT_T4, 6 }, { "etsi_300_242_error.tif", T4_X_RESOLUTION_R8, T4_Y_RESOLUTION_STANDARD, T4_WIDTH_R8_A4, 1100, COMPRESSION_CCITT_T4, 7 }, { NULL, 0, 0, 0, 0 }, }; static void clear_row(uint8_t buf[], int width) { memset(buf, 0, width/8 + 1); } /*- End of function --------------------------------------------------------*/ static void set_row(uint8_t buf[], int width) { memset(buf, 0xFF, width/8 + 1); } /*- End of function --------------------------------------------------------*/ static void set_pixel(uint8_t buf[], int row, int pixel) { row--; buf[row*1728/8 + pixel/8] |= (0x80 >> (pixel & 0x07)); } /*- End of function --------------------------------------------------------*/ static void clear_pixel(uint8_t buf[], int row, int pixel) { row--; buf[row*1728/8 + pixel/8] &= ~(0x80 >> (pixel & 0x07)); } /*- End of function --------------------------------------------------------*/ static void set_pixel_range(uint8_t buf[], int row, int start, int end) { int i; for (i = start; i <= end; i++) set_pixel(buf, row, i); } /*- End of function --------------------------------------------------------*/ static void clear_pixel_range(uint8_t buf[], int row, int start, int end) { int i; for (i = start; i <= end; i++) clear_pixel(buf, row, i); } /*- End of function --------------------------------------------------------*/ static int create_white_page(TIFF *tiff_file) { uint8_t image_buffer[8192]; int row; /* TSB-85 WHITE page. */ for (row = 0; row < 1100; row++) { clear_row(image_buffer, 1728); if (TIFFWriteScanline(tiff_file, image_buffer, row, 0) < 0) { printf("Write error at row %d.\n", row); exit(2); } } return 1100; } /*- End of function --------------------------------------------------------*/ static int create_stairstep_page(TIFF *tiff_file) { uint8_t image_buffer[8192]; int row; int start_pixel; /* TSB-85 STAIRSTEP page. */ start_pixel = 0; for (row = 0; row < 1728; row++) { clear_row(image_buffer, 1728); set_pixel_range(image_buffer, 1, start_pixel, start_pixel + 63); if (TIFFWriteScanline(tiff_file, image_buffer, row, 0) < 0) { printf("Write error at row %d.\n", row); exit(2); } start_pixel += 64; if (start_pixel >= 1728) start_pixel = 0; } return 1728; } /*- End of function --------------------------------------------------------*/ static int create_diago1_page(TIFF *tiff_file) { uint8_t image_buffer[1728/8]; int row; /* ETSI ETS 300 242 B.5.1 One dimensional coding test chart - the DIAGO1 page. */ for (row = 0; row < 1001; row++) { clear_row(image_buffer, 1728); set_pixel_range(image_buffer, 1, row, 1727); if (TIFFWriteScanline(tiff_file, image_buffer, row, 0) < 0) { printf("Write error at row %d.\n", row); exit(2); } } clear_row(image_buffer, 1728); set_pixel_range(image_buffer, 1, 0, 1727); if (TIFFWriteScanline(tiff_file, image_buffer, row, 0) < 0) { printf("Write error at row %d.\n", row); exit(2); } return 1002; } /*- End of function --------------------------------------------------------*/ static int create_diago2_page(TIFF *tiff_file) { uint8_t image_buffer[1728/8]; int row; /* ETSI ETS 300 242 B.5.1 One dimensional coding test chart - the DIAGO2 page. */ for (row = 0; row < 1001; row++) { clear_row(image_buffer, 1728); set_pixel_range(image_buffer, 1, row + 728, 1727); if (TIFFWriteScanline(tiff_file, image_buffer, row, 0) < 0) { printf("Write error at row %d.\n", row); exit(2); } } clear_row(image_buffer, 1728); set_pixel_range(image_buffer, 1, 0, 1727); if (TIFFWriteScanline(tiff_file, image_buffer, row, 0) < 0) { printf("Write error at row %d.\n", row); exit(2); } return 1002; } /*- End of function --------------------------------------------------------*/ static int create_impress_page(TIFF *tiff_file) { int j; int row; uint8_t *page; /* ETSI ETS 300 242 B.5.2 Printing resolution - the IMPRESS page */ if ((page = malloc(1079*1728/8)) == NULL) return 0; memset(page, 0, 1079*1728/8); set_pixel_range(page, 1, 0, 1727); for (row = 2; row <= 78; row++) { set_pixel_range(page, row, 850, 850 + 27); set_pixel_range(page, row, 850 + 27 + 745, 850 + 27 + 745 + 26); } for (row = 80; row <= 117; row++) { for (j = 0; j < 1728; j += 2) set_pixel(page, row, j); } for (row = 118; row <= 155; row++) { for (j = 1; j < 1728; j += 2) set_pixel(page, row, j); } for (row = 194; row <= 231; row += 2) set_pixel_range(page, row, 0, 1727); for (row = 270; row <= 276; row++) set_pixel_range(page, row, 60, 60 + 1607); for (j = 0; j < 1728; j += 27) set_pixel(page, 315, j); for (row = 354; row <= 480; row++) set_pixel_range(page, row, 209, 768); for (row = 358; row <= 476; row++) clear_pixel_range(page, row, 488, 489); clear_pixel_range(page, 417, 217, 760); for (row = 354; row <= 357; row++) set_pixel_range(page, row, 962, 1521); for (row = 477; row <= 480; row++) set_pixel_range(page, row, 962, 1521); for (row = 358; row <= 476; row++) set_pixel_range(page, row, 962, 969); for (row = 358; row <= 476; row++) set_pixel_range(page, row, 1514, 1521); for (row = 358; row <= 476; row++) set_pixel(page, row, 1241); set_pixel_range(page, 417, 970, 1513); for (row = 354; row <= 1079; row++) set_pixel(page, row, 864); for (row = 157; row <= 926; row++) set_pixel_range(page, row, 884, 899); for (row = 0; row < 1079; row++) { if (TIFFWriteScanline(tiff_file, page + row*1728/8, row, 0) < 0) { printf("Write error at row %d.\n", row); exit(2); } } free(page); return 1079; } /*- End of function --------------------------------------------------------*/ static int create_duration1_page(TIFF *tiff_file) { uint8_t image_buffer[1728/8]; int row; int i; /* ETSI ETS 300 242 B.5.3 Acceptance of total coded scan line duration - the DURATION1 page */ row = 0; clear_row(image_buffer, 1728); set_pixel_range(image_buffer, 1, 0, 1727); if (TIFFWriteScanline(tiff_file, image_buffer, row++, 0) < 0) { printf("Write error at row %d.\n", row); exit(2); } for ( ; row < 117; row++) { clear_row(image_buffer, 1728); if (TIFFWriteScanline(tiff_file, image_buffer, row, 0) < 0) { printf("Write error at row %d.\n", row); exit(2); } } clear_row(image_buffer, 1728); set_pixel_range(image_buffer, 1, 0, 1727); if (TIFFWriteScanline(tiff_file, image_buffer, row++, 0) < 0) { printf("Write error at row %d.\n", row); exit(2); } clear_row(image_buffer, 1728); for (i = 1; i < 1728; i += 2) set_pixel(image_buffer, 1, i); if (TIFFWriteScanline(tiff_file, image_buffer, row++, 0) < 0) { printf("Write error at row %d.\n", row); exit(2); } clear_row(image_buffer, 1728); set_pixel_range(image_buffer, 1, 0, 1727); if (TIFFWriteScanline(tiff_file, image_buffer, row++, 0) < 0) { printf("Write error at row %d.\n", row); exit(2); } for ( ; row < 236; row++) { clear_row(image_buffer, 1728); if (TIFFWriteScanline(tiff_file, image_buffer, row, 0) < 0) { printf("Write error at row %d.\n", row); exit(2); } } clear_row(image_buffer, 1728); set_pixel_range(image_buffer, 1, 0, 1727); if (TIFFWriteScanline(tiff_file, image_buffer, row, 0) < 0) { printf("Write error at row %d.\n", row); exit(2); } return 237; } /*- End of function --------------------------------------------------------*/ static int create_duration2_page(TIFF *tiff_file) { return create_duration1_page(tiff_file); } /*- End of function --------------------------------------------------------*/ static int create_error_page(TIFF *tiff_file) { uint8_t image_buffer[1728/8]; int row; int start_pixel; int i; /* ETSI ETS 300 242 B.5.4 Copy quality criteria - the ERROR page. */ for (row = 0; row < 68; row++) { clear_row(image_buffer, 1728); if (TIFFWriteScanline(tiff_file, image_buffer, row, 0) < 0) { printf("Write error at row %d.\n", row); exit(2); } } clear_row(image_buffer, 1728); set_pixel_range(image_buffer, 1, 0, 1727); if (TIFFWriteScanline(tiff_file, image_buffer, row++, 0) < 0) { printf("Write error at row %d.\n", row); exit(2); } clear_row(image_buffer, 1728); if (TIFFWriteScanline(tiff_file, image_buffer, row++, 0) < 0) { printf("Write error at row %d.\n", row); exit(2); } for (i = 0; i < 10; i++) { for (start_pixel = 16; start_pixel <= 1616; start_pixel += 64) { clear_row(image_buffer, 1728); set_pixel_range(image_buffer, 1, start_pixel, start_pixel + 63); if (TIFFWriteScanline(tiff_file, image_buffer, row, 0) < 0) { printf("Write error at row %d.\n", row); exit(2); } row++; } } clear_row(image_buffer, 1728); if (TIFFWriteScanline(tiff_file, image_buffer, row++, 0) < 0) { printf("Write error at row %d.\n", row); exit(2); } clear_row(image_buffer, 1728); set_pixel_range(image_buffer, 1, 0, 1727); if (TIFFWriteScanline(tiff_file, image_buffer, row++, 0) < 0) { printf("Write error at row %d.\n", row); exit(2); } for (row = 332; row < 400; row++) { clear_row(image_buffer, 1728); if (TIFFWriteScanline(tiff_file, image_buffer, row, 0) < 0) { printf("Write error at row %d.\n", row); exit(2); } } return 400; } /*- End of function --------------------------------------------------------*/ int main(int argc, char *argv[]) { int row; TIFF *tiff_file; struct tm *tm; time_t now; char buf[133]; float x_resolution; float y_resolution; int i; int image_length; for (i = 0; sequence[i].name; i++) { if ((tiff_file = TIFFOpen(sequence[i].name, "w")) == NULL) exit(2); /* Prepare the directory entry fully before writing the image, or libtiff complains */ TIFFSetField(tiff_file, TIFFTAG_COMPRESSION, sequence[i].compression); if (sequence[i].compression == COMPRESSION_CCITT_T4) { TIFFSetField(tiff_file, TIFFTAG_T4OPTIONS, GROUP3OPT_FILLBITS); // | GROUP3OPT_2DENCODING); TIFFSetField(tiff_file, TIFFTAG_FAXMODE, FAXMODE_CLASSF); } TIFFSetField(tiff_file, TIFFTAG_IMAGEWIDTH, sequence[i].width); TIFFSetField(tiff_file, TIFFTAG_BITSPERSAMPLE, 1); TIFFSetField(tiff_file, TIFFTAG_ORIENTATION, ORIENTATION_TOPLEFT); TIFFSetField(tiff_file, TIFFTAG_SAMPLESPERPIXEL, 1); TIFFSetField(tiff_file, TIFFTAG_ROWSPERSTRIP, -1L); TIFFSetField(tiff_file, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG); TIFFSetField(tiff_file, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_MINISWHITE); TIFFSetField(tiff_file, TIFFTAG_FILLORDER, FILLORDER_LSB2MSB); x_resolution = sequence[i].x_res/100.0f; y_resolution = sequence[i].y_res/100.0f; TIFFSetField(tiff_file, TIFFTAG_XRESOLUTION, floorf(x_resolution*2.54f + 0.5f)); TIFFSetField(tiff_file, TIFFTAG_YRESOLUTION, floorf(y_resolution*2.54f + 0.5f)); TIFFSetField(tiff_file, TIFFTAG_RESOLUTIONUNIT, RESUNIT_INCH); TIFFSetField(tiff_file, TIFFTAG_SOFTWARE, "spandsp"); if (gethostname(buf, sizeof(buf)) == 0) TIFFSetField(tiff_file, TIFFTAG_HOSTCOMPUTER, buf); TIFFSetField(tiff_file, TIFFTAG_IMAGEDESCRIPTION, "Blank test image"); TIFFSetField(tiff_file, TIFFTAG_MAKE, "soft-switch.org"); TIFFSetField(tiff_file, TIFFTAG_MODEL, "test data"); time(&now); tm = localtime(&now); sprintf(buf, "%4d/%02d/%02d %02d:%02d:%02d", tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec); TIFFSetField(tiff_file, TIFFTAG_DATETIME, buf); image_length = sequence[i].length; /* Write the image first.... */ row = 0; switch (sequence[i].type) { case 0: /* A white A4 page */ image_length = create_white_page(tiff_file); break; case 1: /* A stairstep of 64 pixel dashes */ image_length = create_stairstep_page(tiff_file); break; case 2: /* The DIAGO1 page */ image_length = create_diago1_page(tiff_file); break; case 3: /* The DIAGO2 page */ image_length = create_diago2_page(tiff_file); break; case 4: /* The IMPRESS page */ image_length = create_impress_page(tiff_file); break; case 5: /* The DURATION1 page */ image_length = create_duration1_page(tiff_file); break; case 6: /* The DURATION2 page */ image_length = create_duration2_page(tiff_file); break; case 7: /* The ERROR page */ image_length = create_error_page(tiff_file); break; } /* ....then the directory entry, and libtiff is happy. */ TIFFSetField(tiff_file, TIFFTAG_IMAGELENGTH, image_length); TIFFSetField(tiff_file, TIFFTAG_PAGENUMBER, 0, 1); TIFFSetField(tiff_file, TIFFTAG_CLEANFAXDATA, CLEANFAXDATA_CLEAN); TIFFWriteDirectory(tiff_file); TIFFClose(tiff_file); } return 0; } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/test-data/itu/0000755000175000017500000000000011150047620017554 5ustar julienjulieniaxmodem-1.2.0/lib/spandsp/test-data/itu/Makefile.am0000644000175000017500000000161011150047204021604 0ustar julienjulien## ## SpanDSP - a series of DSP components for telephony ## ## Makefile.am - Process this file with automake to produce Makefile.in ## ## This program is free software; you can redistribute it and/or modify ## it under the terms of the GNU Lesser General Public License version 2.1, ## as published by the Free Software Foundation. ## ## This program is distributed in the hope that it will be useful, ## but WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ## GNU Lesser General Public License for more details. ## ## You should have received a copy of the GNU Lesser General Public ## License along with this program; if not, write to the Free Software ## Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ## ## $Id: Makefile.am,v 1.3 2008/05/03 10:26:15 steveu Exp $ SUBDIRS = fax DIST_SUBDIRS = fax all: clean: iaxmodem-1.2.0/lib/spandsp/test-data/itu/Makefile.in0000644000175000017500000003545111150047457021641 0ustar julienjulien# Makefile.in generated by automake 1.9.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = ../.. am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd INSTALL = @INSTALL@ install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = test-data/itu DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/config/ax_compiler_vendor.m4 \ $(top_srcdir)/config/ax_check_real_file.m4 \ $(top_srcdir)/config/ax_fixed_point_machine.m4 \ $(top_srcdir)/config/ax_misaligned_access_fails.m4 \ $(top_srcdir)/config/ax_c99_features.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/src/config.h CONFIG_CLEAN_FILES = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-exec-recursive install-info-recursive \ install-recursive installcheck-recursive installdirs-recursive \ pdf-recursive ps-recursive uninstall-info-recursive \ uninstall-recursive ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMDEP_FALSE = @AMDEP_FALSE@ AMDEP_TRUE = @AMDEP_TRUE@ AMTAR = @AMTAR@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CC_FOR_BUILD = @CC_FOR_BUILD@ CFLAGS = @CFLAGS@ COMP_VENDOR_CFLAGS = @COMP_VENDOR_CFLAGS@ COMP_VENDOR_LDFLAGS = @COMP_VENDOR_LDFLAGS@ COND_DOC_FALSE = @COND_DOC_FALSE@ COND_DOC_TRUE = @COND_DOC_TRUE@ COND_MMX_FALSE = @COND_MMX_FALSE@ COND_MMX_TRUE = @COND_MMX_TRUE@ COND_SSE_FALSE = @COND_SSE_FALSE@ COND_SSE_TRUE = @COND_SSE_TRUE@ COND_TESTDATA_FALSE = @COND_TESTDATA_FALSE@ COND_TESTDATA_TRUE = @COND_TESTDATA_TRUE@ COND_TESTS_FALSE = @COND_TESTS_FALSE@ COND_TESTS_TRUE = @COND_TESTS_TRUE@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CPPFLAGS_FOR_BUILD = @CPPFLAGS_FOR_BUILD@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DSYMUTIL = @DSYMUTIL@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ GREP = @GREP@ INSERT_INTTYPES_HEADER = @INSERT_INTTYPES_HEADER@ INSERT_MATH_HEADER = @INSERT_MATH_HEADER@ INSERT_STDINT_HEADER = @INSERT_STDINT_HEADER@ INSERT_TGMATH_HEADER = @INSERT_TGMATH_HEADER@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ NMEDIT = @NMEDIT@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SPANDSP_LT_AGE = @SPANDSP_LT_AGE@ SPANDSP_LT_CURRENT = @SPANDSP_LT_CURRENT@ SPANDSP_LT_REVISION = @SPANDSP_LT_REVISION@ SPANDSP_MISALIGNED_ACCESS_FAILS = @SPANDSP_MISALIGNED_ACCESS_FAILS@ SPANDSP_USE_FIXED_POINT = @SPANDSP_USE_FIXED_POINT@ STRIP = @STRIP@ TESTLIBS = @TESTLIBS@ VERSION = @VERSION@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ SUBDIRS = fax DIST_SUBDIRS = fax all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu test-data/itu/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu test-data/itu/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs distclean-libtool: -rm -f libtool uninstall-info-am: # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" mostlyclean-recursive clean-recursive distclean-recursive \ maintainer-clean-recursive: @failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ list='$(DISTFILES)'; for file in $$list; do \ case $$file in \ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ esac; \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ dir="/$$dir"; \ $(mkdir_p) "$(distdir)$$dir"; \ else \ dir=''; \ fi; \ if test -d $$d/$$file; then \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -d "$(distdir)/$$subdir" \ || $(mkdir_p) "$(distdir)/$$subdir" \ || exit 1; \ distdir=`$(am__cd) $(distdir) && pwd`; \ top_distdir=`$(am__cd) $(top_distdir) && pwd`; \ (cd $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$top_distdir" \ distdir="$$distdir/$$subdir" \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-libtool \ distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive info: info-recursive info-am: install-data-am: install-exec-am: install-info: install-info-recursive install-man: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-info-am uninstall-info: uninstall-info-recursive .PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am check check-am \ clean clean-generic clean-libtool clean-recursive ctags \ ctags-recursive distclean distclean-generic distclean-libtool \ distclean-recursive distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-exec install-exec-am install-info \ install-info-am install-man install-strip installcheck \ installcheck-am installdirs installdirs-am maintainer-clean \ maintainer-clean-generic maintainer-clean-recursive \ mostlyclean mostlyclean-generic mostlyclean-libtool \ mostlyclean-recursive pdf pdf-am ps ps-am tags tags-recursive \ uninstall uninstall-am uninstall-info-am all: clean: # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: iaxmodem-1.2.0/lib/spandsp/test-data/itu/fax/0000755000175000017500000000000011150047620020332 5ustar julienjulieniaxmodem-1.2.0/lib/spandsp/test-data/itu/fax/itu8.pbm0000644000175000017500000175231511150047204021737 0ustar julienjulienP4 1728 2376 üøÿþ?ÿ€ÿÿÿÿþÿ€ÿþÿÀÿÀðàüÿÿ?À?ü?üø?ÿÿøàÿþÿÿÿðÿ?ÿüàÿÿ€ÿÿÀïüÿÿÀÿþðÿÿÀÿÿàçÿÿÿþüð~ü?àüðóÿ€ÿÿÿøüøÿððààððÀÿÿÿÀøøÿÿàðÀøøàÿÿÿþüxÿÿàðàðøþàÿïÿÿ€üøÿÿàüàøüÿƒà?ð?ÿðþ|Àÿðÿ€ÿÇÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀø>øÿàøÿøüxÀðÿÀþ<Ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€àü|ÿàüü|àð?üÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€Àü>üÿÀüø>xðàÿÀÿÿÿþ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà||ÿ€|ü>xü?ÿÿàÿÿÿþ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàx|ÿüx>øþ€ÿÿüÿÿÿü?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿî 0þðÿà|ü0?øÿÀÿÿÿÿà|ÿÿÿà?ÿþ?üøÿÿü8ÿø?€ð>?Àþÿÿøÿÿàÿþ?À?€~ÿÿÿÿà€ÿøððÿÀøÿÿÿÿÿÿ€?€?€>ÿÿÿÿøÀÿðþððÿ€ðÿÿÀÿÿÿð??~üÿÿð?ÿÀÿÿàÿÿðÿÿðÿÿÿÿ>?~?à?ÿÀð<?þÿÿÀÿ€|àÿÿüÿÿÿÿà>?~?àÿðøÿààÿ€ÿÀðÿþÿÿÿü>?~?ð?üø>ÿàðÿÿàðÿÿüþ?>~?þÿÿ??ÿààðÿøøÿÿ€ÿÿÀ?>~?ÿ€ÿ€ÿÿ€?ÿÀ€?üüÿ€ÿáÿàø>~>ðàÿÿ€ÀþÿÀ€ü?øÿ>~~>ÿàøïÿÀ~ÿÀ€ÿüðÿÿÿÿð>~>ÿÿÿïø€ÇÀÿà€ÿüüÿÿ€ÿÿø>>>?ÿÿÿø€À?€ÿðÿÿ€ÿüÿÿÿ€þ?ü>>>ÿÿÿøÀÀÀÿàÿÀÿÿüÿàÿÿ€ø?þ>>ÿÿøðÀà?ùÀ?€?ÿàÿþø?ÿøÿ€ðþ>>ðüÀø?€?€ÿàÿüÀÿü?€ðÿ>>€ÿÿ€þ??€ÿÿàÿðÀÿüð?ÿ>>Àÿÿ€ÿ?€?€ÿàÿÀÿüð?ÿ>?àÿà€üüà?ððÿ>>Àüð>ððààþ|ÿ~øðþüÿð?øÿ>ðÿð?þÿ€~ÿð>øÿ>øÿð?ÿ€ÿàÀ?ÿà~øþ>øÿð>?ÿ€ÿÿðÀÿÿÀ|ø8|ÿðÿð~?ÿàÿÿüàð?àÿÿø~>ÿøÿð>ÿàÿûüÀ?ø?ÿþÿøþ~|ÿðÿð~ðü?ÿþ|ÿàÿÿðøüà?ÿ?>ÿøð~|ðÿçüxÿÀÿÿÿøðáüàü|ÿðð~~øÿàà~ÿ€ÿÿÀ?ÿþðð~øü>ÿø?ð~|ðÿðÿà|øþÿ€ÿüñð~?ðÿð~ðà~>øÿþÿø>ÿÀøÀÏþðü?ðþÀø>ðÿð>~øÿóþ|þðÀþüðÿþÿÀü?þ~Àÿà~?üÿÀøÿþøøà~øþþ~?ÿÀ>?àÿð~?€üÿ€ðÿüàðà|ðüð~ÿÿÀ>ÿðÿà~À|ÿÀøüàüð~øüð?€ÿÿà>øÿð>à|ÿ€ðø?€üðøðÀ?Àþ?ð~ðÿà~ø<ÿ€øð?€~ð?€|ààðüø>ÿøÿð~ÿ€ÿ|à?ðÿ€>þøøü?ÿøÿð?ÿ€ü|ø?Áðÿ€>ÿÿÿÀüðü>ÿøÿð>ÿÀü?ÿÿààÿ€ÿÿÿÿÿüðþ>ÿøÿà?ÿÀü?ÿÿÿÿð@ÿ€€ÿÿÿÿÿüð~>ÿøÿÀ~?ÿÀÿx?ÿÿÿþÿÀÀÿÿÿÿüø~>Îxÿ€>?Ç€ÿ€øÿÿÿþÿà€ÿÿÿøø~>„pÿ~?€ÿÀÿü?ÿÿÿ?øÿ€ü>>ÿàÿÀ?ÿÀÿüÿþüü>>ÿðÿÀ~€ÿÀÿøþþ>ÿøÿà?€ÿÿ€ÿðþ>ÿøÿà~Àÿÿÿðþ?Çø>ÿøÿð?àÿþàÿþþÿÿ€>ÿðïð>øüÀÿÿÀÿüÿÿÿø>ÿà‡ð?üÿxÀÿÿÿÀÿüÿÿ€ÿÿþ>ÀƒðÿÿÿüÀÿÿÿÿÿð?ÿÿ€ÿÿÿÀ>ÀÇð?ÿÿÿÿÀÿÿÿÿðÿÀÿÿÿÿÿð>Àÿà??ÿÿÿðøÀ€ÿÿþàÿààÿøÿü>ÿà??ÿÁÿüüÀ?€ÿÿÀÿ?ðßþÿ>ÿà?ÿðÿ€þÀÀÿ€?øøƒÿÃÿÀ>ÿÀ?ÿÿðÿÀÿ€Àðÿ€àüÿðÿà>ÿ€?üð?ðÿðàü€ÿÿü?þø>ÿ>ðÀðÿðÀüüÿü>ÿø|ü~ððüþàÿ€þü~€ÿóþ>þ?ààüþ€ÿÿðü€ÿûþ|?ÿ€~øø~ÿÀðÿÀ€øü?àÿÿ€>ÿà?øð|ÿ€ÿðÿ€ÿ€ÿø~àÿÿ€~?ÿà~€üÿÀÿüÿ€ÿðÿþ|ðÿÀ>ÿð?ÿÀø8ÿ€ÿøþÿðÿÿàü?à?ÿÀ~ÿà~à>ÿÀÿþøÿøÿÿ€€ÿ€ÿà>ÿà?À|ÿáüÿ€ÿøÿÿøþÿÀÿÀ~ÿÀ~|ÿ?üüƒøÿÿþ?ÿð?|?ÿ~>ÿ?üøøÿÿþ?ÿü>ÿ~ÿÀ?~ø€|ÿÿ?ÿþ>ÿÀ?ÿ€~|ðüüÿü>ÿÀ~`€ÿÿÀ>~ø€|ø?þ>ÿà?øÿÿ€||`€0~|~ÿà~ÿ€ÿÿ€|~À`?€>ÿð??ÿ€ÿþ||Àþ?€~ÿà~ÿ€€ðxxÀ?ÿ€?€|?ÿÀ~ÿÿÀ€|8à?ÿàà>ÿ€~þÀ€|ðÿðð|?ø~üÀ€~üàÿÿøü>~ðÀ€>þðÿÇøÿÀ|~ðà€?ðüÿÿüÿàüÿø~~à?Àøÿÿÿðÿü÷ðüþÿü~|ðÀÿþÿàÿÿÿ€ÿþãø|ÿÀÿþ~<ð~ð€ÿþÿàÿÿÿàÿþáþü?ÿàÿþ|ÿø|ü€ÿþÿøüþÿþàÿüÿøçþ~ÿø~þ€ø<ÿøþÿ€þÀøÿÿøƒü|ÿøþÿÿüÇüÿ€ÿøüÀøÿü€8~ýð~þþÀüÀüøÀðüü€|xà~?þüÀ|àÿ€øàÀðþà~~?þþÀ|ðÿÀøààþà|~?þ?ÿ€à|ü?ðøàà~ø|~˜ÿÀà|þøøðÀ~ø|~~ÿÀøüþøðüÀ>ø|~üÿÿÀÿøþøàüÀ>ü|~øü?€ÿøþxðÀÀ?ÿ€~~øøÿð?üÿø?þà>ÿÀ~~øøðÿøÿü?ÿàÿð~~ðøÀÿàÿüÿ€à ÿð~~ðüÿýþ~€ðÿø|~ðþ€üø~|Àøÿø|~ðððø~|Àþ?ø~~ðþàü~~À€?ü~~øÿÿÀÀÿ~Àà?ü~~øÿÀÿðàÿþ?ÇÀ?ü>ü~~øøÿüàþÿÀÿ>ü~~|üüà?üÿÀÿ€>ü~~<ÿ€þÀøÿ€ÿÿÀ>ü~~ÿÀü<ÿàÿøÿ€þ?À?ü>~àüÿÿàÿðÿÀøÀ?x~~à?øÿÿðÿàÿÀüà€8>~?ÿà?ðÿûðø?ÿÀüà€~~ÿÿà?àÿùøð?À~à€>~ÿÿààûñøà~À‡à>~ÿÿÀðÿñüð~À?ÿàü>~ÿÿøÿáüÿ|€ÿÀÿ|~þüÿàüÿÿà|€ÿÀ?ÿà>~øÁüà|ÿÿÿÿð|ÿ€ÿð|~øÿüà<ÿÿÿÿü~ÿÿÿøÿÿ>~ø?ÿü?À8ÿÿÿÿþ~|ÿÿøÿÿÿÿ|~ÿü?€ÿÿÿÿÿ€?€ÿûüÿÿÿÿ€>~ÿøÿ€ÿÿÿÿÿ€€ðñøüÿÿÿÿ€~~Àÿøÿàüÿÿà€øñü~ÿÿÿÿ€>~?ø?üÿøçà?þ?ðÿøñÿþÿÿÿÿ~~þÿÿÿÿþÃð?ÿÿÀ?þüðþÿþ>~ÿÿÿÿÿÿÿ?ƒàÿÿÿÿþþðü?ÿÀ~~ÿÿ€àÿÿÿÿÿ€ð?ÿÿÿÿÿ€ÿ€ø?üÿø>~üÀÿðÿÿÿÿÿ€þà?ÿÿÿÿ€ÿÀøøÿþ~~ððÿþÿÿÀüàÿÿÿ€ÿð~àÿð>~ððÿÿÿÿÀüàÿÿ€?ð~ÿð~~üðÿÿ€÷àÿÿÀÿ€ø ÿÿø>~üðþÿÀÇàÿÿÀð€?øÿÿø~~~ Ïàƒàÿÿ€ø?€øÿÿÿø>|~Ÿàƒàþÿÿÿðÿÿÿð~ÿ€~àŸƒàÇàøÿþÿàðÿÿð>ÿð~øŸÃàÿÀÀÿþÿÀþÿ€~ÿø~þÿàÿÀø€ÿ€ü>ÿ€~?ÿ‡ÿàÿ€ð€?ÿÀþ~ÿà~ÿ€ƒÿÀÿ€?Àÿàÿ€~ÿø~ÿ€ÿ€þÀÿàÿÀ~ÿþ~þÀ€ÿÿüÿÀþð?ð~?ÿÀ~üÀÀ<ÿÿàÿÀüðü~ÿø~øÀÀàÿÿÿ€€?ÿÀüðÿ~ÿÿ~øÀàüÿÿÿð€ÿ€üøÿ€~ÿÿÀ~øÀà?ÿ€ÿÿÿÿþ?ÿüøð~ÿà~øÀð?ÿÀÿÿÿàÿ€?ø|ø?ü~ÿð~øÀøÿðÿÀÿüÿà~øÿ~ÿø~ø€xÿøàÿÿðüÿÀ>?ÿþ~xüüðÿ€?ÿð?Áøð>Ïÿ~|øáüøÿ€?ÿðÿü?ø>ÃÿÀ~|øø~ÿÀü€ÿðÿÿÿ|àÿà~ÿ~øü~ÿðü€ÿð€ÿÿÀÿ€>à?ø~ÿÀ>øþ>ÿøÿü|ÿÀàÿÿüà<ðü~ÿà?ü¾ÿüÿø|€øÿÿÿø>ðþ~ÿð|?þÿþÿðøþáƒÿÀþ~àøÿ~ÿð?ü?ü?ßþÿÀøÿ?€ÿàÿ|þðÿüøÀ>ü€€üøÿàüüà~ÿñø?À~~üð?ü?€€|ðþÿ€?ð>?ÿÿüà~|üÿ€ø€~~ø>ÿ€?ÿàü~?ÿÿüà~øøÿ€>ü€ø<ÿ€ÿÿðü|?ÿÿþÀüøüÿà€?ðü>ðÿÿüÿ~ÿÿðà~ðøÿàð>€øÿø<ðÿÿüÿ€|ÿÿÿÿÀüøüÿøÿ€àþÿü>üÿáÿ?À~ÿÿÿÀ~ðü?çð?ÿÀàÿÿð>ü÷àÿÀ|ÿÿÿ€üø|?øÿðÿÏøÿÀð~óð?€À~?ÿÿ€~ø|?øÿÿøÿüÿÀ?à?à~çð€€|?ÿþüü<øÿÿüÿþÿðøð€áüÀ~ø~ü?øøÿüÿþÿðøðáþ€|ü€øð~~ÿþÿðøÿøðÿÿÀ~~?ÀÁðàÿþÿüÿàøÿðàÿ€|üÿàðøà?þÿðÿø?ÿøðÿ€~~ÿàøpà?üþÀàÿðÿððþ|üÿðÿðüžàðÿø?ÿðøþ~~üûøÿÀøø€øðÿàÀ|>ð~ÿÀùøÿÀøðøðÿ€|~ø~ÿÿàøøÿÀ€üðà?>ü~ÿÿÿðøÿÀ€àà?~þà~ÿÿÿø>ðÿ€?€?€|ÿðüÿÿÿðÀ<À?À~ÿ€ø~ÿÿÀ?à€þÀÿüà|üÿÀðüÿÿø‡ðÀ`ðÿÀüÀÀð~ÿð?àø~ÿÿÿÿààÿ?€üÿáøàüð~ÿÿð?øð~ÿÿ€ÿÀàÿÀ?àþÿãð?ðþ`|ÿÿÿÀ?ø~þ?ðÿ€ÿàøþÿñÀ~?ðÿ>ÿÿÿÿÿü~~øÿ?ÿðþÿãðü?ø?ÿ>ÿÿÿÿÿþ~?þüÿÿÿøÀ0ÿÀðüø?ÿ>ÿÿÿÿ~ÿÿÿð~ø?à|ÿà€øüþø~~ÿÿÿÿ~€€À?ÿÿÿ€|øþÿ?ðøüx~~ÿÿÿÿ€~€ÀüÿÿÿàÀüøÿ€ÿðøøx>~ÿÿÿÿÀ~€àÿ€ÿÀÿøÿàøø?ð?ø>ð?ð?>ÿà?ÿà~Àðÿàþÿÿÿðøøþ?ø>ð?ð?€>ÿàÿà~Àøÿøø÷ÿÀÿø|øÿøÿøàÀø>ÿàÿð~€ðÿøàáÿà÷ðøðÿÿþð<?þ|ÿÀÿðü€ø?þÀÀ?ðÁøüðÿüÿà>?ÿ€|ÿÀÿðÿÀüÀüþàÀðÀø~ðÿøÿàÿÀ|ÿÀøÿàüÀ|þøÀøÀøÿàÿ€ÿÿà|ÿÿàøÿøüÀ|þþÀpÀø?€ÿðÿÿà|ÿÿøüÿüüüàþ€àðüÿüøþþð>ÿÿþþ?ÿÿÿ~ÿ€À>üÀóðÿÿ€Àüøà|ÿÿÿüÿÿøÿÿ|ÿüÀ>üÀÿðÿÿøüð|ÿÿÿÿðüÿÿÿîÿ€üÿÿÀþÀÿðÿÿÿü?ð|ÿÿÇÿüüÿÿÿðÀ|ÿûÀÿÀÿÀÿÿÿÀðÿø|ÿÿÿÿÿüÿÿÿø?Àü?ÿàÿ€ÀÀøÿððÿü|ÿüÿÿÿü?ÿÿøà~ÿð>ÿÿ€ÀÀüðüü|ÿ€ÿÿøÿøàüÿþ~ÿÿ€ÿàÀÀÿðø>|þÿÿüðð~ÿÿüÿÿÿàÀ€ÿ€à>|üÿÿø@ðüÿÿüÿþÿðà?À€?àÀÀ|üÿÿøø~ÿÿüÿøÿðàÿü€ðð>~?Àÿðü~ñÿðüÿ€àÿþ€ð|ü|9ÿðÀàü~ð€€Àðÿÿ€Àðÿÿ>ÿüøþ~p€àÿÿÀ€ÿÿÀ|ÿþøü~þð€@àÀ€ðþÿ€ÿþ|ÿþøüüÿÀþàÀÀàüüÀÿÿà|ÿÿøüþÿàÿà€Ààøà?Àÿÿø|þÿøüüøÿÀà€ÀðøÀ?ÿàÿÿÿ|þ?€ÿüü?üÀÿàÀ€ðð€ÿàð?ÿÀ|þ?€ÿÀøüÿ?ÿÿÿÿð€àx?àÀÿÿà€ÿð|ÿÀÿüø|ÿ€ÿÿÿÿøàÿÀÀÿÿÀ?ÿø?à|ÿÀÿÿðü?à?ÿÿÿÿþ€øÿÀðÿÿÀÿþ?ÿÀ|ÿÏÀÿÿð|àÿÿÿþü€ÿÀðü?ÿÿ?ÿþ|¿ßÀÿÿàüðÿÿüÿÿÿÀüøÿÿÀÿÿÿ|ßÿÀ€ÿÿÀüÿð? ÿþÿÿÏ€þxÿàÿÿÿðüÏÿ€€ÿüÿàÀàÿÿ€ÿÿÀÀ€ÿøÿÿÿÿà|Çÿ€€øüÿÿàÀðÿÿ€ÿÿ‡Àà€ÿüþÿÿøüãÿ€€üÿÿ€À€ÿøÿÿ€ÿÿÿÀøÀÿþÿÿÿÿ|áÿüÿÿ€ÿøùÿÿÀ?þàÿÿÿÿ|ðþüÿ€€øøàÿàÿÿÀøøÿÿ€?€ÿ|øüðÀðøÀøÿÿÀüøÿÿ€Àÿ|øüàÿÿÀøÀÿÿÿ€?ÿøÿÿÀø>|üüÿþ€ø€ÿàÿÿ?ÿ€püÿÀ?üüþüÿüƒð€Àÿþÿüÿ€øüÀÿü|~üÿüÿðàÿÿ€áüÿ€ø|€ÿü|ðüàÿððxðð||ø~ÿü|Ïøüÿà?ðxþø||ø>ÿþ|?ïüüàÿÀÿð|ÿÀü|>??ø|ÿþ|øÿÿÿàðüðÿü?ÿø?à?€|ÿþüÿøÿÿà?þüþüÿþ?€À|ÿÿþüÿø€8ÿÿàÿþÿ€?üÿþ?À|ÿÿÿüÿøð?Àþÿãàÿÿ€?þÿàøÿÿà|ÿÿ?üøÿðÿÿÀþÿƒàÿÿÀþ?ðøÿÿ€àð|ÿ?üüøÿÿÀþà8ÿŸàÿÿøàÀ€€ÿø|üüþøÿÿ€ÿà<ÿÇàÿÿüÀ€€ÿÁü|?ü|þøÿüÿÀà|ðÿÃàü?ü€à€ÿàþ|øüþüøðà~ÿ÷ãð|<€ÿ€ø€ÿð~|ð|üþø?ðà?ÿðãÿà~>€ÿ€ÿÿÿø|€üÿøøøð?ÿÿüãÿà>ÀÿÀÿÿ?ü?|~ÿÀ?€ü?øðÿÿÿ€áÿÀ?þÀÿÀÿþþ|üÿ?Àÿÿøð€þÿÀàÿÀþà?ÿÀþÿ~þ~?ðàÿÿÀÿàð€ðÿðàüð?Àøoÿ|ÿÀüÀøÿÿàÿÀøÀàÿüàüøààÿÿ€|ÿà~›ÿÿ€NüÿÿàÿøÀÀ?þàðø|àÿÿ€|ÿøüÿÿÿÿÀÿÿÿÿÿþðàü|ÿààÿ€ð8|ðÿÿ€|ÿü~ÿÿÿÿÀÿÿÿÿÿþÀ÷àð|?ÿÿÿÿÿÀàÿÀøüàÿþ|ÿþüÿÿÿÿÀÿÿÿÿþàÿàð>?ÿÿÿÿÿÿðÿðü|ðÿü|ÿÿ~ÿÿÿÿàÿÿÿÿüÀÿÀð<ÿÿÿÿÿÿüðÿðüà<øðà|üÿ|ÿÿÿÿÀÿøàÿà ?üÿÿÿàü?üÿþ|ð|þ€~ÿÿÿÿàÀÀ?àÿüüþÿ€ÿþøð|þ?€|ÿÿÿÿÀà?€ð?ÿÀ?ƒÿàÿþ|ðü|ÿÿ€ð~ÿÿÿÿààðÿàà€ÿðÿüxàÿ€|ÿÿü|ÿÿÿÿÀðøüÿÀ?ü?ø|ÿà|ÿÿ?ÿ~ÿÿÿÿÀøøüÿïÀþà|ÿð|ÿÿ?ÿ€þÿÿÿÿÀþüÿÿÿàÿ€À>ÿø|ÿþ€?ÿÀ~ÿÿÿÿÀ~xÿÿàÿÀ?>ÿø|÷þ€ÿÀ~ÿÿÿÿÀ?8€ÿÿðà>áü|ùø?À??ð~ÿÿÿÿ€€~?üð>ýü|ø€ð~ÿÿÿ€üàÀ?ÿ€ø>ÿü|þ€?ø~ÿ€þ?ø€?ÿÀø>ÿü|ÿø|ÿÀÿþ€€ÿøÿø øÿø|ÿ€~?ü|ÿÀÿÿÿ?€þÿÿøþÿø|?ÿÀþüüÿàÿÿ€àÿÿ€?€ÿ€ÿÿðäÿà|ÿàþü~ÿàÿÿ€àÿÿ€ÿÿàÿÿàð?ÿ€|ÿðþþüþÿàÿïÀðøÀÿ>?üÿÿÀø?ÿÀà|ÿðÿÿþü~ÿàÿÏàððÀþ>þüþÿÀð|ÿøÿÿüüþþÿàÿ‡àððÀ?ü>ÿ€üÿ€þàð|øÿÿüþ~ÿÿÿÿàÿàÀðÀðÿÀ|ÿÀüàÿð|üÿøþ~ÿÿÿÿàþàðÀ€à€?ðüðÿð|Áü?ÿðþ~ÿÿÿÿà|àøÀ~àÿ€ðüøðÿà|?ýüÿàþ|ÿÿÿÿàøÀ|à?ÿü?üüðÿ€|ÿü~?þ|ÿÿÿÿàüà<àÿÿþÿþüðø|ÿøü|ÿÿÿÿÀ>àÿøÿÿü~øÀ|ÿøü~ÿÿÿÿÀóàþÿÿü?øÀ|ÿðø~ÿÿÿÿ€ðÿÀð?ÿÀð?ÿ€ÿð?Áøð|ÿà?ð~ÿÿÿÿñÿÀü?ÿ€à?€ÿàðü|ÿÀþàà~ÿÿÿÿñÿàøÿ€ÿÀ?€ÿ€€püðÿ|øÿàø~ÿÿÿþóÿàþÿàÿÀÀÀÀøÿ €ÿ|àÿþü~ÿÿÿÿóóðÿà?ðü>ÿþÀàÿøÿ€ðÿ€|?€€ÿÿøþ~ÿÿÿÿàïÇàÿøðøÿ€ÿÀ?€àÿð?ÿÿðÿüÀÿÿÿþüÿÿÿÿÿÿÃàÿàüø?ÿàÿÿðÇÀðÿðÿ€ÿüÿ€|?à?à?ÿÿþÿ€~3ÿÿÿÀ?ÿÿƒÀÿÿþøðÿÀÿÿþï€ðÿÀ?þÿüÿüÿÿàÿÿÿðÿ€üÿ€ÿàÿÀÀÿÿ€|øÿÀÿÿÿó€ü€?ÿþþ|?ÿÿàÿÿÿà~ÿàÿÿàÿÿÿ€|ðþÿÿÿð€ø?ñþøü?ÿÿÀÿÿÿàüÿÀÿŸð??ÿ€<|~ÿÿø?ÿüÀàÿà|ÿÿÀÿÿ‡ð~ÿàøàþ|ø~ÿðÿøÀàÿÀüÿÿÿ‡ðüÿàððø||?€ðÿüðð?€ð|ÿüÿƒø~ÿðÀððø|?€ÿÿøàø?ðüø?ÿƒðüÿàÀøøø €~?ð`þ€ü|üÿø~ÿÿÿð€ðððþ8ðÿ€þü?ø?Þðüÿÿÿÿà€øÀüðÿüÿÿ€Ï€ÿ€|ÿüàø~ÿÿÿÿà€ø?ðþààÿüÿÿàÿ€€øÿÀÿüððüÿÿÿÿàÀøþÿàüÿüÿÿþ?ÿÀ?à|ÿàÿþüð~ÿÿÿÿàÀøÿþÿÀ?þÿøÿÿÿÿ€ÿÿ€ðüÿàÿþÿàüÿÿÿÿÀàøÿÿÿ€?ÿ€üÿàðÿàÿÿ€ü|ÿðÿÿÿÿà~ÿÿÿÿÀàðø>þÿ€?þ?ÿà€ÿøÿÿþüÿàÿÿÿÿÀüÿÿÿÿ€øðøðÿ€ÿ€€?ÿà€ÿþÿþÿ€|ÿðð€ÿÀ~ÿÿÿÿ€ü@øü€ÿ€ÿàðáÿ€øÀøÿàÀ?€?ÿüÿÿÿÿÿ€xøÀ?à€~À?ÿ€ðÀøà|ýðà€ÿ~ÿÿÿÿüÿÿüð€à|ÿÿ€Àðàðàø{àÀ€ðüÿÿÿü?þÿÿþðÀð€>ÿÿÀàøðüð|àà€~ÿÿÿøÿ€ÿÿþðÀðÀ€ðÿÿààøøþø~€ðð€~ÿÿÿàÿ€ÿÿþðÀÿð€€øþ?ðüðÿø|Áðø€ü~ÿÿÿ€ÿ€àÿÿðà€?ÿàÀððàø~ðøïàø?ÿÿüÿÿÿÀüÿÿàðÀÿàð?øðð|?p|ÿðþ?ÿÿ€~ÿÿÀÿÀÿÀø€ÿÿÀþøðø>ð|ÿðÿÿÿÀ~ÿÿð?ÿà?ÿ€ø€ÿÿÿÿððø>ÿÀ|ÿààÿÿ€~ÿÿø?àÿ€üþ|`<ðøàÿÿ|ÿÀÿÀÿÿ€~ÿÿü?àŸ€|ø<øø?þÿÿÀ|ÿÀÿÿøÿÿ~?ÿÿþ?àþ€€~>þøÿàÿÿÿø|ÿàÿÿÿ€þ~ÿÿÿ?àü€€?ÿ€>ÿñøÿà€ÿŸÿþ|ÿðÿÿÿàü~ÿÿÿÏàø€ÏÀ0ÿ€ÿøÿÿð€øÿ€|ÿðÿÿüø~ÿÿÿÿ€ÿàø€ÿÀüÿ€ÿøÿÿàÀøÿà|çðÿÿð~ÿÿÿÿ€ÿàþ€ÿ€ÿÿÀÿøüÀÀø?ü|ðÿÀ>ð~ÿÿÿÿÀÿÀ€?ÿÿ€ÿÀÿðüàüÿ|ð?€ÿðÿø~ÿÿÿÿÀÿÀÿ?ÿ#ÿÀðÿà|à~ÿÀ|ð?€üÿü~ÿÿÿÿàÿ€?ÿ~ÿsÿÀÿÀø|~à>ÿà|ð€þÿü~ÿÿÿÿàþ|÷çàÿþþ~?€ÿð?ø|ÿðÿþÿü~ÿÿÿÿàüü÷Ãàÿÿàÿ~ÀÿÿÀø|ÿðÿÿÿü~ÿïÿÿà`øÿÃðÿÿþÿ>àÿÿÿàø|ÿðþ>ÿü~ÿÇüÿàð>ÿƒàÿÿÿKþ|Àÿÿÿððø?ÿàø<Çøüÿøÿà?ü ü?ÿðøÿøÿÿÿÿÿþ0|ÿðøàü~ÿ‡üðÿø?€ü|ÿàøÿüÿþ<8?ÿþüÿà?àãøüÿüÿàü?ðþÿà~ÿÀÿþ?€>ÿÿÀ|ðÀÿü~ÿ‡üðÿøàøþ€þÿà?ÿø€üÿÿ€üà?ÿøüÿüÿà?ÿ?üø~?€üÿÀ?øþðÀ|ÿð€ÿø~ÿÇþÿàÿ€?þð|?€üà?üüàÀ|ÿà?ÿàüÿÏÿÿàÿðÿÀàð|àÿüøàà|ÿð€ÿà~ÿ÷ÿÿàÿðÿÀ?ð8ÿÀÿàÀÀ|ÿà€üÿïÿÿÀøÿøøüÀÿð?ÿÀÀÀø|ÿð€ÿÀ?~ÿÿÿÿàøøÿÀÿü?ð?àÿ€À€þüÿàÿ€ÿ€|ÿÿÿÿÀ?ðøÿÿþ€üþÿüàÿÿ€À€ÿÿÀøÿ€ÿƒÿàüÿÿÿÿ€ÿðøÿÿÿÀàøÿÿÿàÿ€à€ÿÿø|ÿ€ÿÿƒÿðüÿïÿÿ€ÿàÿøÿÿÿøÿðà?€ÿÿ€?ÿÀü€àÿÿþøþÿÿÿðüÿÿÿÿÿàÿøüÿÿÿüààÿÿÀÿÀþ€ÿÿøÿ€üüÿþÿøüÿïÿÿÿ€?ÿððÿÀÿü€àÿÿàÿÿÿ¿€ÿþÀÿÀøÿ€ÿøÿøüÿïÿüÿ€?ÿððÿøùü€à÷ÿàÿþÿ€ÿü€ÿøüÿàÿàÿøüïÿüÿÀÿÀÿððüà8Àçÿàþ€ÿÿøÿüøÿàÿ€ãøüïÿøð?Àÿÿüøÿà€ãÿàxþ?ð?ÿüÿàÿñøüïÿðøÿÿÿøüÿàãÿÀü€ÿ€øÿàÿñøüÏÿÀàÿøÿÿÿø?€ð€àÿ€øÿ€ÿÀüÿÀÿþýøüÏÿ€ðÿøÿÿÿðÇà€ààÿÿüÿàøÿÿþÿøüÿ€þÿøÿÀÿø€ð~ÿÿð0ðüÿÿÿÿÿøüÿÿÿ€ÿ€ÿðàÿøðÿÀÿÿþx?øøpÿÿÿÿÿøüÿÿÿÿ€ÿðÿ€àÿøpÿàÿÿÿð€|üü~øÿÿÿÿøüÿÿÿÿÀÿü€ðÿðxàÿàÿÿü€üüøÿøÿÿÿðüÿÿÿÿÀÿ€ÿþ~?üÿà€ÿÿÀÀ~üüÿøÿÿðüÿÿÿÿÀÿðÿÀüÿ`þÿà?ÀÿðÀ~xøþøÿÿàüÿÿÿÿÀÿþÿü?þàüÿÿ€?üðÿþà?ü<0ÿàüÿÿÿÿÀ?ÿÀþÿÿÀð>ÿÿÿ€þø?ÿ€ð?øÀüÿÿÿÿÀÿüÀÿÀÿÿüü>?ÿÀüÀÿ€üÿàü€øüÿÿÿÿÀÿÿàÿàÿÿÿ€þ>ÿàøÀÿÀþÿðþ€ø€`üÿÿÿÿÀ?ÿðü?àø?ÿàÿ€~ÿððàÀðÿÀ€ø|ÀüüÿÿÿÿÀÿüÿ€ÿààÿøÀ|ÿÏððà?À?ðÿð€øàÿüÿÿÿÿÀÿÿÀÿàÿààÿà|ÿãððà?ÿÀ€ðÿÿÀø€ðÀÿÀüÿÿÿÿÀÿÿðÿø?ÿÀàÿÀÿðøÿãððÀÿÀÿÿ€àÿïÀøÀøàÿàüÿÿÿÿ€ÿþüÿþððÿðøÿÿðøÀÿÿ€ÿÿ€?ÿÿÀøàøø?ÿðüÿÿÿÿ€ÿÿ€üÿøøüÿððóÿàøÀÿÿÿÿÿÿàøàüø?ÿðüÿÿÿ€ÿÿàüÿ€üÿ€ÿàðñÿà|€ÿüÿÿÿÿüüðþü?ÿøüÿ€ÿÿàüüþÿÀÿÀ`ðÿÀ~ÿÀÿþøÿÿ€üðþü?‡øüÿÀ?Ïà?øð?ð?ðÿ€ø?€~øçðøÿøüü?ü?ƒüüÿÀãà?øð?þøÿÀø?pÀüÿÿüþ?ÿøÃüüÿà‡ø?ððÿ€üÿàøÀüÿÿàüÿ€?ÿøãüüÿàÁü?àøÿÿÀüÿÿàüÿøüçÿøüÿÀ?ÿÿèñüüÿàÀþðþÿÿð8ÿÿð~ÿÿ€ÿüàþüÿð?€ÿÿÿÿÿüüÿàà€øÿÿÿðÿÿð€ÿÿà?€ÿüàÿ€üÿþ?€ÿÿÿÿÿøüÿÿÿààÀø?€ÿãøùÿàÿü?ÿÿüÿàÿøàÿÀü?ÿÿÿÿÿÿÿøüÿÿÿÿàðà?øà÷áøðà?ÿþ?ÿÿÿ€ÿøÿøàà|?‡ÿÿÿÿÿÿÿøüÿÿÿÿàøøÿøðóñøð?ÿÿÁÿàÿüÿàÀÀü?ÿÿÿÿÿàüÿÿÿÿàøøÿðüóÿøÿÿ~à?øÿþÿ€À|?ÿþÿÿàüÿÿÿÿàxþÿàÿñÿðÿþ|øþÿþü??üÿ€üÿÿÿÿÀ<ÿàÿ€ùÿðþ|üÿ€ð|?ø€~ÿÿÿÿÀ<€þ?àøÿàüÀ|ÿÀà?ü>üÿÿÿÿÀ>Àø|àÀÿÀ€|Ààà€| üÿÿÿÿ€àþøÿð|ððàüüÿÿÿÿðÿ€ÿþÿø€>üøð€|~ÿÿÿÿøð?àÿþÿðÿ€?€>ÿüðü€üÿÿÿþ€üÿüÀøÀÿþÇøÿÀÀÀøþü€|ÿð€~ÿÿÿÿð€~ÿþÿøþðøÀàÿÀøÀÿþü€@üÿüÀüÿÿÿÿÿÿÀ?ÿÿÿþÿ€üðpà?ÿàÿ€à€ÿþÿ€ü|ÿÿà~ÿÿÿÿ€ÿÿðÀÿÿ€ÿÿ€?àÿðøàÿàÿðð€ÿþÿüÿÿ€øÿðüÿÀ€ÿþàÀÿ?ÀÿÿÀüÿÀøxø?ÿàÀÿÿø€ü÷?ÿ€|ÿÿÀýÿø~ÿÀ€pÿƒàÀÿ€ÿÿÀþÿðøøü~Àðÿðøÿøÿ€üðÿÀÿÿøüÿÀÀñààÿÿÀÿÏð€?ü~xÿ?€øÿÿüÿüÿÿÀ|ààÿÿø~ÿàÀÿààÿÿ€ŸÇð?Àþøÿ€?€øÿÀ|ÿøÿÀüÀàÿûüüÿààÿððïÿ€‡ñððÿÀÀx?àÀøÿà>ÿøüà|àðÿùü~ÿðàððïÿ€‡ñðøÿÀÀp?àÀÿðÀ>ð`øÀüððÿáüüÿàðþøóÿÁÿðüÿàÿÿ€à€?ÿÀðøà|þðàþ|üÿððÿ€øñüÿàü?ÿÀÿÿðÿàÿüðøàüÿÿð?ÀþüÿÿÿÿàüøxÀàø?ÿÀÿÿÿÿÀÿÿð€ðþð|ÿÿð€~|ÿÿÿÿðüþøÀà0?ÿ€ÿÿÿ€þÿÿ€>€ðÿàüÿÿà|üÿÿÿÿà|?ÿóø|àà?ÿðÿðøÿà>ÀøÇà|ÿÿÀ<~ÿÿÿÿà>>ÿÿðþð€øÀ?øðÿ€>Àø÷àü?ÿ€üÿÿÿÿà?ÿðÿøüÿðÿÀàxûàüÿüÿÿÿÿàÿàÿüþÿ€ðÿð>à°ÿùÀüøüÿÿÿÿÀ€?ÀÀ~ÿ€?Àððüàøÿø|àüÿÿÿÿÀ€€?ð?ÿÿ€àøðüðþÿøüðüÿÿÿÿ€À€ø€ÿÿ€øþøþðÿ€ÿàüüüÿÿÿÿàÀü€ÿÿÀøÿðÿþ€ðÿÀøüþüÿÿÿþàÀþÿÿ€ÿÀüÿðÿü€xÿððüÿ€üÿÿÿüðÿÿÿ€ÿà|ÿàÿü€xÿøøüÿÀüÿÿÿøð?ÿà>ÿð<ÿÀÿðÀ<þüüÿøüÿÿÿÀøÿÿàÿøÿ€ÿÀ<ÿÿüÿüüÿÿ€øÿÿà?óøÿàÀ>ÿ€€üÿÿüÿÿÀ|ÿþð?áøðà|€€üóÿ€üÿÿà>ÿðøàø?øàÿÿÿ€üðÿàüÿÿø>þøáø?€øàÿÿÿ€œüððüÿÿüÿþÿ<ÿùð?€€ðñÿ€ÿÿ€?ÿÿ|ÿøðþ?ÿÿþÿÿàùÿðà?€ÀðÿÿÀÿÿÿÿàüÿüðþ?ÿÿþ€ÿÿþøÿðü?Àÿàð€ÿÿàÿþÿÿÿþ|ÿÿðüÿÿÿ€ÿÿÿ€øÿàþ>àÿøø€ÿÿàçøÿÿÿÿ€|ÿÿÀàþÿÿÿ€€?Àÿðøð?à?ÿ€>?ðÿüp€ÿÇðÿ?ÿàüÿÿàþÿÿÿÿ€À?ü€øðàÿÀ>?øùþÀÿÇðøÿø|ÿÿà~ÿÿÿÿÀà~ÿÀÿÿðüðÀÿÿà~øàÿÀÿðøŸÿüÿÀüÿÿÿÿÀà|ÿðÿÿÿþø€ÿïàþüà?ÀþðüƒÿÀ|ÿÀ~ÿÿÿÿàð|?þÿÿÿðÿøù÷ðøüÀÀøðÿ€àüð|ÿÿÿÿààx?ÿÿÿÿøþðãçàðýøÀÀàÿàøðüÿÿÿÿÀx<ÿààÿÿ€?߀xãáðð~øàÀ?À?€ðüðüÿøÿàx>ÿø?ÿà?€|áñðàüðàÿøÀð|ø~ÿøÿð<>þü>ÿø~€<áÿàÀøÿþÀÿàÿü€àüøüÿàÿà<>?ÿü>?øþ|ÃÿÀ€°ÿøÿþÿðÿü€øðüÿÀÿà€ÿÀ€þ?üÀÿÀÿÿÿÿøÿþÿüÿþÀüðüÿàÿð€ÿÀ€>þøÀÿ€ÿÿÿÿ€ÿøÿüøùüÀøÀüÿÀÿàÀð>ðà€ÿÿÿÿ€øóÿþðàüüÿàÿà€ðü€àà€ÿÿÿÿ€Àà€?ÿðà|ð~ÿðÿð€øü€àÿáÿþà?€Àþðàüþüÿðÿà€üüà€à€?ÀÿüðàøÿÿøüÿðÿàÀ~€àððÀÿàþøðüÿÿÀüÿüÿàààÀüøüàÿðüÿø|ÿÿà~ÿÿÿÿààðÀ?üøüàÿáøÿÀøüÿÿàüÿÿÿÿÀððàþ|àÿø@øÿøø|ÿà~ÿÿÿÿÀðÀÀÿ€|ƒÀÿÀøÿüøüÿÀüÿÿÿÿÀ8ÿðàÿðøÀ?ñÀÿøÿþ||€~ÿÿÿÿÀ8ÿÿàÿøÿÿàøüøÿþ||üÿÿÿÿ€ÿÿþ8ðþÿÿðÿüþ|ãþ|~ÿÿÿ€ÿÿÿ€|ðÿÿÿàÿüÿà|Áüü|ÿÿÿÿ‡ÿÿüÿðÿÀÿÿàÿüÿÿ~À||~?ÿÿþüÿÿÿxÿðÀ?ÿÀÿøÿà?ÀÀ||?ÿÿüøãÿðùÿ€xà€øÿþ€àà|~ÿÿøðð?üùÿ€xððÿÿŸÀðð€üüÿÿð€àþÿ€ùÿÀ<ð~ðÿÿàÿøÿÿ€||ÿÿà€àÿÿàóÿÀ>øà|ðÿðÿøÿÿ€|üÿÿ€Àà?àøû÷àÿÿà|ðÿøÿøÿÿ€|þ?þÀàøþÿçàÿÿÀøøÿüÿøÿüþÿÿþààþÿ€ÿãàÿÿ€øüþðþüþÿÿÿÿÀàðÿ€àÿÃàÿÿøþþ?øøüþÿÿÿÿÀpø?ððÁðƒàðþþüþÿÿÿÿàpüüüàð?Àþÿüþÿÿÿÿà8~ÿþàøÿà ÿ€|~ÿÿÿÿà<?àÿxÿüÿÀ|þÿÿÿÿàÀÿ?À0?ÿÿÀÿÀ|þÿÿÿÿàð>ÿÿàÿà?ÿÿð?ðÿÀ|~ÿÿÿÿàþ€?ÿðÿàÿÿ€ÿÿüÿøÿÀ|þÿÿÿÿàÿùÿ€ÿøÿðÿÿø~?ÿÿÿüÿ€|~ÿÿÿÿàÿÿÿÀøÿøÿÿÿ€|ûÿàÿþÿ||ÿÿÿÿàÿÿ€?øÿø?ÀÿÀø`ÿðÿþÿøüÿÿÿÿÀ€ÿÿ€øÿÿ?ü|þÿÿ€|~ÿÿÿÿÀ€ÿðð?øþ>þð|þÿÿ€øüÿÿÿÿ€Ààü?ÿàÿ?ÿÀÿŸ€pà|~ÿÿÿ€À€?þ>>ÿðÿ€>Àÿ€þàøüÿÿ€àÀÿÿþÿà€àþ€ÿ÷ð|þÿÀàÿ>þ÷ÿÿà€àü€ÿÿàøpüÿÀp?ÿ€þ€ðàÿðþðÿÿð|ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿàpÿÿ€üÀð?ðþ?ðÿàÿÿàü>þ~ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿà8ÿÿð‡üðøüüøÿÀÀÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿà8ÿÿðÃøøøüøðqÿÀÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿàþüð0þüÿøøýÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿðüüÿÀþø~ððÿÿðÿàÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿàÿ~ÿø|øøÿÿøÿÿüÿÿÿÿÿÿÿÿÿÿÿÿþüÿðÿ€|ÿþ|øðÿáøÿÿàÿþ?üüÿÿÀ?ø~ÿÿ€>8|øÿàøÿÿüÿÿ€ÿø|ü?ÿÿÀ>ÿüÿÿ€>üüðÿÀøýÿÿÿÿ€ÿüøüÿÿþ€ÿüÿÿÀþÿ~øÿÀxÀÿÀÿÿàÿÿ|þÿÿø€>ÿðÿÿÀÿÿðÿ€~ðÿ0ÿðÿŸàÿÿøüÿÿüÀðÿÿÀÿÿüÿÀ?ÿÿ€üÿÇðÿÿ€|~ÿÿþÀ>Àÿ€ÿÿÿøqÿÀ?ÿÿø~þÏÃðÀøü?ÿÿþàÇÿ€ÿàÿÿü€ÿÿàÿÿÿ€}ÿ€Çáøàü~?ÿÿÿ€àƒþ?ÿøgÿð€ÿçðÿÿÿà€ø€‡ÿðàøüÿÿÿÿ€ðÀÀà?ÿüðÀÿóðÿ¿ÿüà|ÀÃÿðøü~ÿÿÿÿÀàÀÀÀ~üÀ€ÿãðü?ÿð|ÀÃÿàüøüÿÿÿÿÀxà0>àà>üà€ÿáøÿÿÀø>ààÿàÿü~ÿÿÿÿàpðøÿàðð~8€Àÿáðÿ€ÿàà~Ààÿ€ÿ€øüÿÿÿÿÀ8ø~ÿüøø?€Ààáø?àø?Àð?€À|~ÿÿÿÿà8øþÿÿøø?À?€<ÀÁð>øøþÀ>àÿÀøüÿÿÿÿàÿp?ÿÿÀü~à?€ÇàÀøÿþÿÀÿðÀøÿÀ|~ÿÿÿÿð<ÿàð>Àÿðüÿ€àþÿçÀà>ÿàþÿàÿðÿðþÿ€øüÿÿÿÿàÿÿÿø€üÿàà~ÿÿà€þ€ÿøÿøÿþ€ÿÿàÿ€|~ÿüÿðÿÿø€ÿ?ÿøÿþ€ÿþ?À?ÿüÿüÿÿ€€ÿÿðü|~ÿøÿðÿÿðÀÿ€ÿü`ÿþÀÿÿÿà?ÿþøþÿÿÀ€ÿðð||~ÿðÿðÿÿÀ€à>ÿüÿðÁþÀÀÿÿÀüýþàüÿÿÀ?ÿðÀüøüÿàÿà€ÿ€øÿþÿøÀ?þðÿÿà|~?ð?ÿŸà€ÿðàÿ|À~ÿàÿà€€þ€?€?ÿðÀ?ÿþðà|??ø€χðÀàðÿ€|€À~ÿàÿà€€ÿŸ€??ÿðÀÿÿààÀ|?þü€ÏÃðÀ?€øÿ€|ÿ€ÿÀ~ÿðÿà€?ÿÿ|>ÿðÀþÿÿüàð?üüÿÀ€~þÿøÿ€ÿ€üÿàÿ€€?þ|??øÀþÿÿÿ€üø?øþÿÀ€üÿÿÿøÿ€ÿ€üÿðÿ€þ|þðüÿßÿøÿÿàøðÿ‡ÿ€€üÿÿþøÿÿ€ÿÿ€üÿøÿ€ü|þøüÿÁÿÿÿÿðøà?ÿ‡ÿ€€?üÿÿüøÿÿ€ÿ€üÿþ?ÿ€ø>ÿÿøðÿðÿÿðøÀþÃÿÀÿü?ÿøøÿÿ€ÿ€üÿÿÿÿÀÀ?ÿÿøðÿüÿÿàü€þàþÀÿüÿðøþ€ÿ€üÿÿÿÿÀà€þÿðøÿ€ÿÀ|øàÀÿüø€ÿüÿÿÿÿÀðÀÿþÿðüÿÀÿ~ @Àÿþøÿ€ÿüÿÿÿÿàüðþÿüÿðüàø>?ÿüøÿþüÿÿÿÿÀÿþÿÿÀÿøãà~àð€ðþø?ÿ?ÿüÿÿÿÿàÿÿ€ÿÿþÿÀ€|Ààÿ€ð8ø?þ?ÿüÿÿÿÿÀÿÿàÿÿÿÀþ€þàÿ€üÿø?ü?ÿ€üÿÿÿÿàÿÿÿþÿÿÿøð€ÿüà€ÿÀüàÿÿøøðÿ€üÿÿÿÿÀÿÿÿÿÀÿÿÿþðÀÿüðÿÀðþðÿÿÿ€øð?Àüÿÿÿÿàøÿüø~ÿ€Àÿøÿðÿà?ø<ðÿÿüøüþÀüÿÿÿÿÀðÿÿ€øÿààÿøÿðÿàþð?ÿÿÿ€ø?ÿ~ÀüÿÿÿÿÀ€?ÿàð?ððÿÀ?ÿðÿàÿ?àøÿÿðø?ÿ€þ€üÿÿÿÿ€ÿüðüøÀ?ÿøÿðÿ€?àüÿþøÿ€ÿÀüÿÿÿÿ€ÿÿ€ðÿü?ÿøÿø?à?Àÿ?ÿÀ|ÿÀ?ÿÀ~?ÿÿüÿÿÀðÿ€þÿøÿðÿÀ>ÿ€ÿðüÿ€?ÿ€üÿÿÿÿ€?ÿðð?€ÿüðÇðÿÀ€ÿüøÿ€?þüÿÿÿÿ€ÿüøÀÿÀüðáðÿàà?€ÿø?ÿ€þüÿÿÿÿÀàÿ|àð~øøøÿà?øÿÀÿÀ|?ÿü~ÿÿÿÿàøþÿ|À?ø~ðøðÿÀÿøÿ€ÿàøøðüÿÿÿÿÀÿ€þÿ~€øþàÿðÿÿüÿ?ðøÀüÿÿÿÿÀÿÿÿþ?Àÿüÿ?ãàÿðþÿþÿøø?€üÿÿÿÿÀÿÿÿþ?€€ÿüÿ€?ÿàÿàüÿüüðø8€8üÿÿÿÿÀÿÿþ€€ÿþÿÀ?ÿàÿà~ð~€ðøÀ?¾üÿÿÿÿÀÿø>?ÿüÿÀÿÀÿàðþ€`ø?ÿ€üüÿÿÿÿÀ>ÿüÿàÿÿ€ÿà?à~?àø?ÿÀþüÿÿÿÿÀ>?ÿðãðÿÿÿàÿÿà|øøÿ€|üÿÿÿÿ€>ñðüÿðÿÿ€À|ÿþøÿ€üÿÿÿÿ€>ùðø?ÿðÿÿ€À|ÿÿøÿ€üÿÿÿÿ€ÿðüðÿÿÀ|ÿÿ€øÿ€üÿÿÿÿÿðþ>ðÿÿÀ8ÿÿ€ø€üÿðÿ>ðãüÀÿÿÀø€üÿ€?ð>ððÀßÿ€øÿüÿ€€àø?øàÏÿ€øÿ€üÿÀÀÀüøàÿ€øÿ€üÿÀð?üàÇÿøÿ€üÿÀ?ððøàÃþøÿ€üÿà€~øüÿø€ðÁüøÿ€üÿà€~ÿøÿÿàÀøøÿ€üÿÿà€ÿÿüÿ€þà>üøÿ€üÿÿÿÿà€àÿüü?ÿÀÿà~|ø}ÿ€üÿÿÿÿàÀÿøø|?ÀÀ`@ÿøxÏüÿÿÿÿàÀÿüð|?€ððÿø8üÿÿÿÿàÀÿþ?àx??øùÿðøüÿÿÿÿÀÀÿþ€0?üóÿ€ðøøqÀüÿÿÿÿÀàð?€þçÿ€ÿÿüøûàüÿÿÿÿ€ààÀþøçÿ€ÿÿüøÿàüÿÿÿÿ€àð€ð?üÿÿÇÿÿøøÿàüÿÿÿÿðððü?üÿ€ÿÀÿÿøøûàüÿÿÿÿðüøþ?€?ÿÀÿ€?ÿøà€üÿÿÿþøÿ?üÿ??ÿàÿþüþÿÿÿüxÿþÿÿ?€ÿðþüøüÿÿÿð¿þÿ€ÿ?À?ðü|øþÿÿÿà€üÿàà~ð|øüÿÿ€àÿÀƒü?ðø?ð~ü~ÿÿàÿÿÿÀ€ðøþ?ƒð<øüÿÿðÿÿÿàÀü€ÿ€Ãðø~ÿÿøÿÿÿÀãÀþ€ÿÀ÷ðøøü?ÿÿüÿÿþ?óàÀðÿðÀþø|?ÿÿÿÿðøÿÀþÿüÿààÿøüÿÿÿàÿÀÿàÿÿÿüÿà?øÿÿÀø~ÿÿÿÿ€Àÿüÿà?þÿÿÀüÿÀÿŸøÿÿÀøüÿÿÿÿ€pÀ?ÿÿÿð?þÿÿü€0ÿÀÿßüÿÿàü~ÿÿÿÿÀð€?ûÿÿðü?ÿÿþ?À?ÿ€ÿßüùÿàøüÿÿÿÿÀøÀüÿð?ð?ÿÿÿ€?ðÿŸþðÿðü~ÿÿÿÿàð€øÿø?ð~ÿÿÀÿø?þþáÿàøüÿÿÿÿÀpÏÀÿø|ÿøÿü`>~¿àÿàøþÿÿÿÿàÿàøÿàø|üÿøð>?àÿÀøüÿÿÿÿàÿÿðÿðÿþþ~ÿüø>?ß¿àÀøþÿüÿàÿÿðÿüÿÿ€þ~ÿüø>?ÿ?€à€øþÿðÿàÿÿðÿÿÀ}ÿøÿþ?€€~øÿ€€Àð?øþÿðÿàÿÿàáÿðxþÿþ€€ðþ€Àðøüÿàÿàçÿððÿ|ÿ€ÿþ€€?Àð€þ€àøø@üÿàÿà‡ÏðüÿüÿàÿüÀð?€üàøøÿÀüÿàÿÀ‡Ãøþü?ðÿøÀà?àðüøÿÿüüÿàÿÀÁøüþððÿ@?àðüøÿÿþüÿàÿÀðüÿÀðøÿàüðÿáø~øÿÿÿ€üÿðÿ€ÿüðàüÿðüøÿÿÿü<øÿÿÿÀüÿøÿ€ÿø?ÿþ?ÿðþþþÿÿÿÿÀøÿÿÿÿàüÿþ?ÿÿÿðÿø?ÿÀ€?ÿøüÿÿ€ÿÿÿÿøøÿüÿàüÿÿÿÿÿÿð€ÿð>?ø?ÀƒøüÿÀ?ÿÀàÿÿàøÿ€?ðüÿÿÿÿÿÿø€à>þà~øþ?àÿÿàÀÿüøþðüÿÿÿÿÿÿøÀÿÀÿø|øÿ€ðÿÿðÀ?ÿÿàøøøüÿÿÿÿÿÿøààÿü|øÿ€øþðÀÿþøðøüÿÿÿÿÿÿøðüÿü~ø?€?üøøÀ?ÿÀøÀàüüÿÿÿÿÿÿøðÿÿü>øÀ?üðøÿðø?üàüüÿÿÿÿÿÿø ÿ€óø?ðÿ€?üàøþø?ÿààþüÿÿÿÿÿÿøxÀÀàÁðÿ€?üàøÿøÿüðþþÿÿÿÿÿÿøüàÀðàðÿððøÿ€øÿÿÀðÿþÿÿÿÿÿÿøþààðøà?ÿàüðÄÿÀøÿÿøøÿþÿÿÿÿÿÿøÃÿ?€àÀðÿü?üðÿ‡ðø?àøãÿÿÀø€ÿ€üÿÿÿÿÿÿðçÿÿðààÿÿÀ?àðÿÿà?ü?àø@?ÿðü€€~ÿÿÿÿÿÿð?ÿÿ€ÿøÀÿÿøÿðÿàþÀøÿþþ€€þÿÿÿÿÿp?ÿÿ€ÿü€ÿÿÿ?ÿðÿÀÿÀøÿÿÀ€~ÿÿÿ€?ÿŸÀÿü?ÿÿÿÀ?ÿð?ÿþ€Àøÿ?€ÿÀ€þÿÿÿÀÿŸÀüü?ƒÿÿà?ÿàüüÀøøÿøàÿÀ€~ÿÿÿÀÿÀÀð >ÿø<øÿ€ÿÀøÀþø~ÿüÿðÿÀ€þÿÿÿÀ?üÀ€€ð|ÿü~üþÿÀð€þø<?ÿÿÿÿø?ÿÀÿüÿÿÿÀüÀÀàÿø|ÿÿ€€?ÿ?ÀüÀðÿ€øÀ?ÿÿÿÿü?ÿàüÿÿÿÀð€ÀÀÿøx?ÿ€ÿÿà>Àþ€ÿÿØÿÀøÀ?ÿÿÿÿüþÀþüÿÿÿÿÀ€øàÿü>ÿàÿÿ€ÿÀ?øÿÿ€ÿÿÿÿÿàøðÿÿÿãÿüà~üÿÿÿÿÀüÀÿø>ÿàüÿÿÿøþÿÿ€ÿÿÿÿÿàøðÿÿÁÿÀàüüÿÿÿÿÀþÀÿ|ðð~€ÿÿ‡ÿÀ?ÿÿÿÿÿÿøøøÿ€€?Àð|üÿÿÿÿÀ~Àþ<Àðð~À?ÿÿàÿàÿÿÿÿÿü|üø?À?àð<~ÿÿÿÿà?à€ü|ÀðàüÀÿÿøðüÿÿüøüøÀ?àðüÿÿÿÿÀÿððxÀ?ÿðüÀ?ÿüÿàüøüøÀÀðüÿÿÿÿ€ÿüð?ÿÿþÀÿÿ€ÿà~øüøÀÀàüÿÿÿÿ€ÿüÀ?ÿÿþ€ÿÿ€ÿÀ~øüðÀÀüÿÿÿþÿþ?€?ÿÿÿ‡€ÿàÿ€€>ø~ðÀ|ÿøÿþÿàÿÿÿàÿðÿ?ÿð€~ðüàÀüÿàÿþÿøà?ÿøûüÿ?ÿøà>ø~ðÀüÿàÿþÿþàøþüþ?Àÿüð?ü>ðÀ~ÿàïüÿþãøÿø~?Àÿüà~ø~øÀüÿàóøùÿãüÿø>ÿÀÿü€~ø?ü?€~ÿàãðÀ€?üð>ÿÿÀÿð?üø>|þ8üÿàðÀÀ€ŸüÀ~ÿÿÀàÁüøÿáÿÿçÿ~ÿøð€€ÿüÿþÿÿ€?€ÿøøÿÿÿÿÿþÿ€|ÿÿÿÿø€ÿüÿüÿÿ?ÿðüÿÿÿÿÿüÿÀ~ÿÿÿÿÀø?€ÿ8ÿøü~ÿàøÿÿÿÿÿøÿ€|ÿÿÿÿÀþ?€þÿð0~ÿÀøÿÿÿð€|ÿÿÿÿÀÿ€?øÿÀ|ÿ€øÿþÿÀüÿÿÿÿÀÿàÀ~øÿü>~ÿÿÿÿàÿðð?þøøþÿÿÿÿàÿø€?þüøüþÿÿÿÿàÿü€ðÿüøüþÿÿÿÿÀñüÀÿ€ÿÿÀ?þøø~ÿÿÿÀàþÀÿÀÿÿà?ÿøø|ÿÿÿÀÀ~àÿÀþýÿðÿÀðøü?ÿÿÿÀ€?ðÿÀÿÿ€ùçøÿàþøþÿÿÿÀ€?üÀpÿÿðññøÿðÿ€øþþÿÿÿ€À?þxÿÿüñðøøÿÀøÿÀþÿÿÿà>€~ðÿ€ñøøüÿðøÿðÿ€~ÿÿÿð>?À~Àÿàñüøüßðø?àÿøÿÿÀ~ÿÿÿÀÿÿà>øðÿø€ø‡øøÿø?ÿüÿÿÀ~ÿÿÿÿàÿÿÿðüðøàÿøÁøøÿü?ÿüÿÿÀ~ÿÿÿÿàÿþÿø€ÿø?ðþÿààüøÿþÿüÿÿÿÀ~ÿÿÿÿàÿüÿøÀÿ€ð?àÿÿ€áøðÿüÿøÿÿÿüÿÿÿÿÀÿüÿü€xàÿÀàøÀÿð?ÀÿüøÿþÁüÿÿü~ÿÿÿÿàÿðÀøàøàÿÀðøÿð?Àÿøøñþçø?ÿÀüÿÿÿÿàðÀ?ðÿÿüøÿøü|ÿàÿøøð?ÿø?ð~ÿÿÿÿàÀÿàÿÿøðÿøü|ÿ€àÿðøà~?ÿðÿÀüÿÿÿÿàÀ€<ÿàÿÿøüÿþ?>ÿø?çð?ðøðøÿð€~ÿÿÿÿàÀ€|ÿàÿÿàÿüÿþ>>ÿÿÿÿðÀøþø~ÿàÿüÿÿÿÿÀÀðþÿð?ÿÀüÏÿ€ÿøÿÿðøÿûüÿðÿÀ€~ÿÿÿÿàÀàðüãð€øÿ€ÿÿüÿÿàøÿÿü~ÿø>ÀüÿÿÿÿÀøðþüàø€ø€‡ÿ€€~?þÿÿàøÿÿÿÿø?ð~ÿÿÿÿÀÿÿðÿ€ðÀøðÿ€€|üÿÿÀøÿÿÿþÿð?øüÿÿÿÿ€ÿÿðÿøàü€ü€ÿ€€~üüÀøÿÿÿþÿàÿ€ÿ~ÿÀÿÿàÿøàøÿ€üÿþ~ü?ÀøÿÿüÿÀÿðÿ€üÿÀÿÿàÿþø|?ÿÀÿÿÿÿÿ~¿ðøÿüþÿøÿà~ÿàÿÿÿþþøÿ€þxÿÿ€~ÿððÿüüÿøÿðüÿàÿÿÿÿüÿÿ€?þÿÿÀ?ÿøøüüÿü?ü~ÿà~ÿþøÿÿ€üÿÿàÿøøüøøþüÿà~ÿþ?øü?Àø€Àÿøüüøüþüÿ€~ÿð|¿üàðÀ€ÀþøüøøÿÀÿøÿàü0ÿà~øçàðàÀàÿ€ø~ø08ÿüÿ€øø~ÿÿÿÿðü‡€ðàçàÀðÿàð~øøÿÿÿð?üüÿÿÿÿàÿÀüàûðàø?üð?øü?ÿÿÿÿ~ÿÿÿÿðÿÀþÁÿààøÿà~øüÿÿüÿ€üÿÿÿÿàÿ€àÿ€Àÿð`|ÿÀà?øüÿÿøÿàþÿÿÿÿðÿÿ€àÀÀÿàðÀ<øü?ÿ€xðüÿÿÿÿÀÿÿÀððà?àüÀ ø~þ~ü~ÿÿÿÿàü€øðÀ?À8þø~þüüÿÿÿÿ€øÀþÿøàÀ??àÿ€ø?ÿÿÿ~ÿÿÿÿ€À€ÿÿðàÀxÿðÀø?ÿ€ÿÿüÿÿÿÿÀÀÿ€ÿøð?ÿüÿøàø€ÿà€€~ÿÿÿÿÀ€ÿàÿøø?ÿþÿüàðøÀ?ÿø?À~ÿÿÿÿ€€ðÿðüÿþÿþàðøÀ?ÿøÀ~ÿÿÿÿ€€üü~ÿüÿþàÃøø€ÿüÀ~ÿÿÿÿ€€þø?øñþçüøÿüÀ~ÿÿÿ€Àÿ8ÀÀø>?ÿþøÿýü€~ÿÀÀ?ÿÿð€ø>?ÿþøÿÿü~ÿààÿÿÿø€øþ>?ÿþøýÿü~ÿààÿþÿüþÿþ?ÿþøüÿü~ÿàøÿþ ûþÿ€þ?ÿ>øüø~ÿðøÿøðÁþ>ÿ€øü|ðøÿàüÿàÿÀðøÀ~ÿÿÀð?ð8ðø?€üÿà?ÿüðÇüÀÿàààðüüÿÿàÿÿ€øÏüÀ?øàðüüÿÿÿÿàÿÿðüßþà?øðøüüÿÿÿÿàÿÿüÿ?¿þð?ððÀøð|üÿÿÿÿààÿ€??>ø€ððàøð|üÿÿÿÿàðÿà?~>üÀðððøàðÿ€üÿÿÿÿÀü?ø?þþàðøÿðüøøÀÿÀüÿÿÿÿàüÿÿø?ø ÿŽÀðøÿàüþð€À?ÿàüÿÿÿÿÀÿÿÀÿÿøÿàÀøøÿÀüÿ€ø€ÀàÿðüÿÿÿÿÀÿðÿÿàðÿààøøü |?ÿÀðüÀàÿðüÿÿÿÿÿ€üÿÿüàÿàø|øø|ÿÀøÿÀðÿðüÿÿÿÿ?ÿüÿÿ€ÿÀþ|ø|?ÀðÿÿÀðþðüÿÿÿþ?ÿþüÿÀãÀÿ>ü|ƒÀøÿÿàøüðüÿÿÿüÿü<ð?øÀ??þ|ÀðÿÿàøüàüÿÿÿðÿàðþÀÿàÿ|àø?ÿüüþðüÿÿÿÀüàaÿÀÿþÿ?à|àðÿÿÀüþàü€øðøÀàÿÿÀÿÿÿø~ðàø?ÿø~àþüøðø?àð?ÿÿðþÿÿÿü`ððÿÿþ€ÿ€üøüøðø?þþþÿÿÿÿÀøøÿÿÿ?Àà?ÿÀüøþøðüþÿ€øüÿÿøøðÿÿÿ?ààÿàü~?|ðÿ~€ÿàà€ÿÿÀüøÿÿÿð?àÿðü?>p?ÿÀ>àøð?ÿü?ø~øþ?ÿ€ø?ðÿø~<?ÿü|ðþð?ÿÿ€ÿÿ€øüÿðÀÿÿøü<ÿÿÿ€|üþø~ÿàÿÿàðüþàÿþøüÿÿÿðü>ÿ€€ü>ÿüÿÿþø>?üþþüüÿÿÿüÿþ>ÿà?Àþ>?ÿÿÿÿðÿÿ€þüüüøÿÿÿþà€ÿààÿàøÿÿðüþþüðÿÀÿþÿÇðÀð€ÿøøÿÿþüþþüð?àÿþÀÿÿøðþ€þøÿÿÿ€üþÿüððø ð?ÿüøÿÀÿøüÿÿÿàøþÿü€ðüüüÿüþÎÿ€ü€øÿððÿøüþü€øþþþüÿÿÀÿð?Àø?ÿþàÿþþþüÀü€ÿ€üÀÿ€àÿüÀø?ÿÿðàÿÿ€ÿÃþüÀ~??À?ÿ€8?à?ÿ€àÿü€øÿÿÿÀàÿÿÀÿÿþüÀ>€€ð?ÿÀðÿ€àüø?ÿÿððøÿàÿÿüüà€ÿüð?Àðÿÿ€àøøÿÿðøø?ðÿüÿüà€ÿÿ€ø>àðüÀàøøÿðþüø?ÿø?ÿüðÿÿÀð?ààüÀÀðøÿðþüøÿð?ÿüðÿÿÀð?àþ€ðøàþüøÿÀ?þüø€ñÿÀ?à?ðÿ€ðø~þø~?þüxð€€€ƒðÿ€àø~pþüü|ÿü€Áð?€?ÿ€øÿàøü>ÿþÀ~ñðÿøÿð?ÿøüÿþàùðÿþþð?€ÿüüðøàxøàÿÿ€üüð€ÿÿüðþ?ÿü?øÿÿÀÿððÀÿÿÀüðÿ€ÿü?øÿÿÀ?ÿÿðÀÿðüøÿÀÿü?ðÿÿÀ?ÿÿàøàÿøüÿÀüà?Àÿø>ÿÿ€ÿÿüøàÿøüÿðþà?Àø?ÿÿ€€‡ÿÿ€øðüþÿø>ðÿ€à?ÿþÿà|ÿðøðÿøüÿüðÿ€à€ÿüÿð|ÿüøðÿøþóþðþàÀÿøÿð|?ÿðàÿðüàÿðüÀð~ÿð~ÿÀøÿðþàÿðÿÀÿà~ÿððÿàüà€ø|ÿÿ€à?üøÿðþð?>þþÿÿàÀ|þðÿøüø€ÿÿþÿÿüÀÿ€ÿ€ø?üþÿ€ü€ÿÿüøÿÿÿà€ÿÀÿ€ðþüÿÀàÿÀpÿüþÇÿÿÀøÀÿð?Àøÿÿ~ÿÿÀ?øŸ€ø?ÿÀÿ?üÿð?ø€ÿøÀðÀÿÿüÿÿÀü?ÿÀþÿ€ÿÀüø€ÿüàøøÿÿ~ÿÏÿþÿ€ïþ~ÿàþÿðÿüÀðÿ€ü?ÿþü?üÿÿÿÀÿþŸø€ÿ€ÿ€¿þÀøÿÿþþÿþ~àÿÿ?ÿÀÿþøÀÿÀü??þøÿÿÿÏÿÿüüÿ€ø?€?ÿàÿþüüøÏðþþøÿÿÿãÿ€ÿð~üð?€ÿÿÀÿ|?þüøÇðþ>þðÿÿÿàÿ€ üÿ€øð€ÿ€þ<ÿ€þøÁø€>þøÿÿÿà?À~ÿððà€üü8ÿÿ€>üÀüÀ>üð€?ÿÀÀüÿüüðÀøðÿÿàüà<ð>üøàÀþÿþÿ€ð€ðÿàøà8ø<øðà?øüÿÿÿÿø€øóƒàðøàþ>øøàÿþ€þ?ÿüü€øǃààþàÿ>pðàÿÿ€ü€ÿÿÿÿ€ü?À‡ãðàÿàÿÀøààÿÿàü ÿÿÿÿÏ€üð‡ãà€ÿ€àÿÀ>ðøàÿÿàü€ÿÿÿþþ€ÿüƒÿà?ÿÀðÿðøüàÿÿàüÀ€ÿÿüÿÃÿ€ÿþƒÿàÿÀðÿÿðøüàÿ¿ÀüààÿüÿÿÿÀÿÿÿÀ€~àðÿÿø€øøà€üàà?üÿÿÿ€ÿÿÿÀ€~ððÿÿð€øøÀ€€üàðxÿÿÿ€ÿ¿€À€À|ððÿŸà€øàÀ€?€üàÿÿþß߀à?À|ððÿÀ€øÀ€ü?üÀýüÿÀðà~ððÏÇàøÀ?€?ÿÀ?üÀø‡ÿÀðàððÏçàðà?€?ÿðüðƒÿ€ø@?ÿðð‡ÿàÿþðøÿÿÿüàðƒÿ€|ÿðð‡ÿàÿÿàøÿþÿÿÿÀüþð€ÿÿààƒÿÀ?ÿÿþøÿÀÿüÿÿÿðüÿ€øðÿà€~ÀÿàÀÿÀ?ÿÿÿÀøÿþÿüÿÿüüÿÀÿÿøÿà€8øÿÀÀÿ€ÿøøÿÿñÿøþÿÿüÿÀÿÿøÿð€ÿü?ÿÀÀ?€~þøÿÿÿÿð?ÿ€üÿÀÿÿøÿðÀÿþ?ÿ€À|ÿÀøÿÿÿÿÀÀÿàüÀÿÿðÿøàÿþ€|~ÿàøðÿÿþøÿàü?ð?ÿ€ßüàþÿ~ø|~?üðÀÿÿ€?ÿïÿðü?øü~ü€à~üøü|üðÀÿÀÿÿÿàüþ|>ÿà|ü??ÿ€øàÿøÿÿçàüüø|?þà?øüÀ?>ÿÀðàÿüÿÿó€üþ|>?€ð€|ÿøàðøïÀÿ€ÿÿÿü?üü|??ðøÿÿðàðàððÿÀÿÿÿ€üüþ<ÿ€ü€|ÿÿøà€üÿøÿüÿøÿÿÿðüÿðÿþ|?ÿþøÿðÀ€üÿüðÿþøÿÿÿüüÿÀÿÿ>ÿÿ€|ÿð€|ÿþøÿÿþÿãÿÿüþÿþ<þÿ|ÿ€À€|ÿþðÿÿþÿãÿÿ€üðÿÿ>üÿÀ>~øÀþøÿÿ€ÿÿñÿÿàüàðþ<ÿ€>|?ÿÿ‡€øðø€ÿ?ÿñùÿàüàð?ÿ€|?ÿÿÇÀøðÀ?ÿðø?ðüðð>>þü?ÿÿ‡ÀððÀ>?ÿáøðüøüø|ÿÿ‡Àøüà ?ÿÀüðüðÿ>øøÿÿÀðüàÂüàüÿþ€ü?À|þÀøÿÏà|üÿü€üÿàxø€ðÿÿà|üÿøÀÿð|ø€øÿÿð~üðÀÿðÀ?€ÿø|ððÿÿà~ü?ÿ€ÿøÿðàÀÿü>øøÿÿà?þÿÿðÿÿÿ?Áààÿ€?ÿü>ððÿÿÀ>üÿÿþÿÿÿÿ€ð?ÿø?Áüüðøÿÿ€üüÿ‡ÿÿÿÿÀðÿÿþ~üÿðøx?üøÿà?ÿÿÿðÿÿÿ€~~ÿÀøø€üÀøÿÿøÿÿÿàø|?ÿÀðø€üàþÿÿø?ø|>?ÿðøþÀüà€ÿ€ðþ|>?ïð?ðøÀàþà?ÀÿÀðÿ|~ðÿøøÿðÀüðøÿàð?À<~~øÿþøøÀþð‡üððŸÀ>~~øÿÿøøüüáþÿøðÇð>< ?øÿÿ€øüü~àÿÿøøÃð?<?€øýÿ€ø?þü?€ð?€ÿøüÁø€ÀàøàÀøÿü€ðÀùø~Àø€øøøÀàøÿüøÀÿø?ÀÀpàÿ€þø€àøÿ€üøÀÿðüÀàÿÀ€?ÿø€ðøÿÀüø€ÿðÀÿãàøÿð?€?ÿx€ðøÿàþ|ÿà?üÿÿàÿø?€þ0€ðøÿÿàþ|ÀÀ|ÿÀÿÿàÿÀþÿÀ€øøÿÿàþ|??ÿüÿÿðÿÿøÿÀþÿ€ü€ððÿÿÀü>ÿþÿÿÿøÿ€ÿðÿ€ÿÀ?Àøøÿÿàþ<ÿüðÿÿ€øÿÀÿðÿÿÀððÿÿ€ü>>üÿøÀ?ÿÀøÿðÇð?þþ?€ààðÿÿøÿ€ÿÿðÿð€ÿðüÿüƒø?þx€ðððàüÿàÿÿÿ€?üÿøüãÿøüàÿÿàðøÿøÿÿÿðþÿþüàÿÀ€ø?øðÿÿððüÿüÿÿÿÿ?ÿÿüàðÀø?àøÿÿüðøÿþ€ÿÿà€ÿ€ÿøàðàüðüÿÿÿ€ðüàÀ?àÿÀ€ÿàÿøðüü|üÿÿÿøø~üÀ>€?ðÿÀÀÀ€ÁÿàÿààxþüüÿÿøüðÿüÀ~€øÿðþ€€Àðøà ÿüþÿ€ÿüÿðÿÀøà~ÀþøÿÿÀÀàøððÿüÿÀûÿƒÿÀðÿðüÿü€ÿüÿÿ€ààðàÿøà?àðÿàÿððÿøüÿü€ÿ€üÿÿüðððÿÀÿÿðø?üüðÿüüÿðÿÀ8ÿþÿãð ðÏ€?ÿÿçøøÿþð?ÿüðÿÿÀðÿÿðxÿÿÿüüÿáÿ€ðÿÀüÀÿÿ€ÿÿÿð0€ÿüÿüüÿüÿÀðÿÀøþÿÀÿÿøÀÿüÿþ~ÿ¿ððÿðüüÿð?ÿÿüàðÿÿ?ÿÿøøÿøüüÿøçÿÀüð€ÿÿþ?€ÿüðÿðüüÿøàÿðþþÿàŸü?ðÿüðÿàü~Áþøüÿÿÿ€øÿþÀø?üÿþðÿàü€þøþÿÿÿÿ?ÿÿÀÿþÿüðÿÿÀø?À8?þÿÀÿ€ÿ€ÿÀ?ÿÿààÿÿþðøüð¾€>?ðþÀÿ€ÿà?øðÿÿ€þø?àü?ø€?<üþ€ÿÀÿà|þ>þ€0ð?üü€?|þÿÿàÿÀøÿ~ø?€ð>üÿü?ÿ€ü¾ÿ€ÿßø€|À€ðÀðüÿü?ÿÿÿüÿÀŸÿ?ø€|?à`ÿ€ðÀðüü|ÿÿÿ¾àÿþÀ|øÿÿÀðàððüøÿÿÿ¾àþþÀ~üÿÿÀðððüøøƒøÿÿ>àüÀÿð?9þÿÿàøððÿþüþ€Ààÿÿà€|ÿÿ€þÀ<€ÿÿðüüøÿÿ€þÿÿ€Àð€ÿÿÿ€À|?ÿçðþøðÿÿü€ÿÀ€ÿÿÿÀ€|ÿÇðÿƒøðÿÿü?ÿÿÿàð ÿþÿðø~ÿƒøÿãøðüüÿÿþÿü>ÿþÿðÿ>ÿøÿóððü?üÿÿüÿÀÿ€ÿÿøÿøÿð>øÿûððþüøÿðÿÿÿ€Ïðÿü>øÿùàðþüðÿøÿþÁðÿÿŸ ÷øðÿÿüÀÿüÿüÀÿÿÿ|áððÿÀ~üüÿþÿøààü?ÿ€àðÿø~üÿþÿÿàðàþÿÀàðÿü<üüÿ€ÿ?ÿ€€üðÿÀðððÿüü?ÿ?ÿÀÿ€ÿà€ÿø?€ÿð?øøðÿüüÿÿÀüÿàŸ€ÿðÿÀÿàÀüüüðüüÿÿàÿàŸÏÀÿøÿàÿðÀÿÿÿð?üüðøÿ€üàÿÀÿüøÿøÀÿÀÿ€ÿÿ€ð€ÿü?àø?ÿÀøà‡ÿÀñþüÿüàÿðÿàÿøðàÿ€üÿxÿàøàƒÿÀà~þ?Ÿþ?ÀŸü?ð?ÿÿ€ðàÿÿ€üþàðàÁÿÀð?ÿ?ŸþÀ‡þð?ÿÿàððÿÿÀüü|ððàÀÀð?ÿÿ€??ÿÿÀÿ€?ðÿÿüððÿÿÀüü|ðøàÀ?€ø€ÿÿ€?ÿÿÿ€€À?øÿ€ððÿÿÀü~|ðøà ü€ÿÿ€?ÿÿþ€?àð|ÿàððÿÿ€ü?€>ðøÀþÀ€ÿÿþ?ü€àð~ÿøðøÿÿ€üð>ðxÀ€ÿþüð€àÀ?þððÿþüþð<À€ÿüüð€à?à?€?ÿ€ðøþüÿÀð<ÿ€ðàÀÀà?ÿÀððÿàüþÁðÿ‡€ü€ð?ððøÿøüÿðãð ÿüÇð?ðððÿüüÿÿ‡óðÀÿ~ÿø‡üððÿþü?ÿÿÿàÿàðÿÀøø?ÿøƒüðàÿþüÿÿÿðÿøðÿà?ÿÀÿ?ÿüÀüðàÿÿü?ÿýÀÿøàÿàÿÿð?ÿ€?ÿüàÀ|ðà?ãþüÿüÿþðÿàÿÿþ?ÿàÿüøà<ðàÀü?øÁþðÿðÿÿÿ€ÿàÿø?üàðÀ?€þüÀüûøøÿð~ðóð?ÿððÿÿÀÀü~üùðà?ø|àðÿððÿÿÿÿà~ü€?þøðÿ|üÿÀððÿÿÿÿø>ü?Àÿøàÿ|üþÀððÿÿÿÿÿ<ü€ÿàøðÿà|~~Àøðÿÿÿÿÿøü€ÿü?øðßð|üüÀððÿÿÿÿÿàüÀ€ÿÿÀøüçø>ÿ~àøðÿÿðüà>À€ÿÿàð~Ãü?>ÿ€~àððÿàü÷ÿð€?Àÿüà?€à~€?ÿÀ?àpðàüÿÿÿÿ?þ?àà>€?ÿÀ?àðàüÿþÿÿÀ>ÿ€ààÀÿÀãÀð€üÿüÿÿð>Ààà  ‡À?ù€ðüÿðøÿÿþ?ðÿ€ðÿ€À?þðüÿàþÿÿÿ€?øÿððÿ€ÀþðüÀ?ÿÿÿÿðàü?ÿÿðÿÀ€ÿþðüÀÿ€Çþüà€þ?ÀÿÿÀð?ÿÀÿþðü?àÿÿÀáÿÇþà€>?üÿ‡ÿøø?ÿÀþ|ðüÿàÿÿààÿñÿ€?þü?þø?ÿÀüðüÿðüàðø?ÀÀÿøÿÀx?ÿÀøðüÿøðàüxàÀÿøÿàx?ÿÀøðüÿüððüðÀÿÀøÿü|?ÿÀððüÿüàð~ðàÿð|÷þ<?ç€àððüàüàð?Àøàø~ðÿ€<ÃÇøððüáüðððüàþ?ðÀïüøðüáøððÿü|àÿÀðð ÿüøðüñøððÿþ8ðÿ€ÀøøÿþüðüûðøðÿÿðÿÀ€øøÿÿüðüÿðüðÿÿ€øÿÀxøÿÿ~ðüÿà~ðÿ¿€xÿÀ|0àÿ€ÿ?€>ðüÿà?ðÏŸÀxÿÀ<ÿÿÿ€ÿ?€ ðüð?ÃàÏÀ<ÿ€<ÿÿÿ€þ?ÀðüøÿüÇ÷à<üÿÿÿ~Àðüðÿøÿÿ€‡ÿàÿüÿÿü<Àðüÿøÿðÿÿà‡ÿÀ?ÿü>ÿøÀàøÿÿÿÿþðÿÿþÁÿà?ÿþø€ÿÀðüÿÿÿÿøÿÿÿÀÿÀ?ÿüðƒÿÀàøÿÿÿÿøŸÿÿðð?€ÿüð?Çÿ€ðüÿÿÿþÿßþÿÏÇü€ùð?Çÿ€ðüÿÿ‡ÿÿðÀ€?ÿð~ÿðüÿÿ€>ÿàÿð€€ÿÿð~?ÿàøÿÀ?øÿü€Àÿÿð?ÿßÀðüÿà>þÿü€ÿÿð?ÿ€àø?ðÿùþÀÿÿøÿÀðüøø?Àà?~àùûüþàðüÿðþ€À?ÿÀàñùüøàðüÿøÿÀÀÀÿðððÿüðàðüÿøÿÀÀÿðððÿüÀàðüðøÿàà€ÿøxðøÀðüÀøÿààÿøxð?ððüÀøÇðð€Àüøð?àðüÁð‡ðøÀüøàððüÿð‡øÿÿ€àüxÿüðüÿà‡ðÿÿ€àøüÿÿðüÿàÃøÿðøøÿÿÿ€ðüÿÀÃðÿþÿøÿÀü€ðü€ñøÿÿÿ€ÿøðÿ€|€üðüùøÿÿÿàÿøxüÿÀ<>?ÿðüðüðøÿÿøÿøÿÿà8~ÿÿàðüÿøüpð?Ïþ?ÿðàÿ€?ÿðþþÿÿððüÿÿàüðáÿÿà‡üÿðÿðÿüÿÿøàø ÿïÿÿþÿãøýÿÿÿÿðÿøðø?øÿÿþüÿÿøøðÀÀÿþÀ?ÿ?øÿðÿüü?øðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿ€ÀðàÿÿàðÿðüüøÿÀøøøðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüð?ÿð€ððÿÿüøÿüüøøÿÀ`øøðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøàÿÀøøÿÿÿþûÿ€ÿüøøÇàø ðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿððÿÀÀøüÿÿÿøÿðÿøøøƒðøàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàüÿðð|~ÿÿ€üÿÿðøøƒðüàÿýÿŸÿà2þ?ðø<>ÿÿÀþÿÀÿðøøðüàÿ€ðþ>ÿÿð??øÿàøøãð~ÀÿÀðÿÿð?ÿøÿ€ÿ€ÿàøøÿð?€ÿÀÿÿ€ùüÿÀÿð?øøðÿà€ÿ€ÿÿÿàñøÿÀÿþ?øøÿ€ÿÀÿÿÿþø~ÿðÿÀÿþ|ÿ€?ÿÿüÿ€ð~ÿÿðÿÀÿþ|ÿ€øÿððüüàÿÿ>ü?àøÀ?ðøÀÿþø€àÃÿ€ø~€ÿÿü¿ÀàÀÁÿ€?ð~ÿüø?ÿÀþøàà€ðü?ÿàþüÀàÇþøþþÿàÿÀÿàøÿþÀÿÿÀÿ€ÿðÿ€ÿàøÿø€ÿ€ÿàÿÀÿÿðÿÀÿàð|ÿðøàÿðÿøðÿùø?€ÿààxÿÀþàÿðÿø?øÿáø€ÿøð8?ÿÁð?ÿøãüüàø?€xÿøà?€ÿÁà~øüƒüÀøÀ|ñþðÿÿÿðð~ü~?ÿü?€xÀøÀþðÿÿàÿÿð@~ü?~ÿüpðüÀ~ðÿÿüÿóø?ü€~ÿü0üøÀþðàÿÿñð?€ü€þÿðÿððþðÀàýùøà|À~?ÿðÿ€ÿþðøýÿðø|øü<ÿƒÿþð€þ~ÿðÿ~ÿü ÿÿ€ÿüà€ÿ~àÿüÿøþÀÿüàÀÿÀ?¿Àÿüÿøø€ÿøÀÀÿðŸ€?ÿøÿøøÀÿðà÷üÃ?ßøÿøð?ƒÀÀãü>?€Ïðø?€ðÿà€ðø~ðà>à€?8>ü€ð>øà€üø€À|ðø||Àà~øÿÀð€<>€~ð?ÿàÿðÀ<à>üÿàÿðÿ€à€|ðÀ<ðøÿÿðÿ€àÿÀ<ñà<ðøþðÿ€ãÿÀ?áð>ðøøðÿ€çÿÀð>ÿ€øðàÿÿÿÀð>ÿÿàüðÿ€ÿçÀ~ð>ÿÿÿ~ðÀÿÀ~ð<ÿÿÿÿøàÿð<ÿÿÿÿ€ü`àþ?Ãð8ÿÿÿÀ8ðàÿðÿÿàøÿðÿàÿðø?ÿðÿÀÿðø?ÿðÿ€ð?À?ÿàà?ð?ÿÀ@?ð~ø>øþÿ€ÿÀÀ àÿà>ÿð<ÿÿà>ÿÿà<ÿÿÀþ<ü8>ÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿðÿÿÃÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿpÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿgä_ÿÿÿÿÿÿÿÿÿÿÿþ€ÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ=€Ÿ0g÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿßÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿÿÿÿÿàÿÿÿÿÿþ ÿð ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿ€ÿ€ÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÀÿÿÿÿÿüþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿüÿÿÿÿÿÿ€ÿ€ÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÀÿÿÿÿÿüþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿüÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÿÀÿÿÿÿÿøþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿüÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÿÀÿÿÿÿÿøþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿøÿÿÿÿÿÿ€ÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÿÀÿÿÿÿÿøþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿøÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÿ€ÿÿÿÿÿøþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿøÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÿ€ÿÿÿÿÿøþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø?ÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÿ€ÿÿÿÿÿøþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø?ÿÿÿÿÿÿ€ÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿð?ÿÿÿÿÿ€ÿÿÿÿÿøþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø?ÿÿÿÿþÿ€ÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿ€ÿÿÿÿÿøþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø?ÿÿÿÿþÿ€ÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿ€ÿÿÿÿÿðþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿð?ÿÿÿÿþÿ€ÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿ€ÿÿÿÿÿðþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿð?ÿÿÿÿþÿ€ÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿ€ÿÿÿÿÿðþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿðÿÿÿÿþÿ€ÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿ€ÿÿÿÿÿðþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿðÿÿÿÿþÿ€ÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿð?þÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿðÿÿÿÿþÿ€ÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿð?þÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿðÿÿÿÿüÿ€ÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿà?þÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿðÿÿÿÿüÿ€ÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿð?þÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿàÿÿÿÿüÿ€ÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿþÿÿÿÿÿà?þÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿðÿÿÿÿüÿ€ÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿà?þÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿàÿÿÿÿüÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿþÿÿÿÿÿàþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿàÿÿÿÿüÿ€ÿÿ€ÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿþÿÿÿÿÿà?þÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿàÿÿÿÿøÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿþÿÿÿÿÿÀþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿàÿÿÿÿüÿÀÿÿ€ÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿþÿÿÿÿÿàþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÀÿÿÿÿøÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿüÿÿÿÿÿÀþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿàÿÿÿÿøÿÀÿÿ€ÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿþÿÿÿÿàþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀ?ÿÿÿÿÀÿÿÿÿøÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿüÿÿÿÿÿÀÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÀÿÿÿÿøÿÀÿÿ€ÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿþÿÿÿÿÀþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÀÿÿÿÿøÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿüÿÿÿÿÀÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿÿÿÀÿÿÿÿøÿÀÿÿ€ÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿüÿÿÿÿÀþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÀÿÿÿÿðÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿüÿÿÿÿ€ÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÀÿÿÿÿøÿÀÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿü?ÿÿÿÿÀÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿ€ÿÿÿÿðÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿøÿÿÿÿ€ÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÀÿÿÿÿðÿ€ÿÿ€ÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿü?ÿÿÿÿ€ÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿÿÿ€ÿÿÿÿðÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿø?ÿÿÿÿ€ÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿ€ÿÿÿÿðÿÀÿÿ€ÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø?ÿÿÿÿ€ÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿ€ÿÿÿÿðÿ€ÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø?ÿÿÿÿ€ÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿ€ÿÿÿÿðÿÀÿÿ€ÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø?ÿÿÿÿ€ÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿà?ÿ€ÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø?ÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿ€ÿÿÿÿàÿ€ÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿà?ÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿà?ÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿðÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿà?ÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿà?ÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿðÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÀ?ÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿðÿÿÿþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÀ?ÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿðÿÿÿþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿþÿÿÿÿÀÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿàÿÿÿþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿþÿÿÿÿÀÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿàÿÿÿþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿþÿÿÿÿÀÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿàÿÿÿüÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿþÿÿÿÿÀÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿàÿÿÿüÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿþÿÿÿÿÀÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿàÿÿÿüÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿþÿÿÿÿ€ÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿàÿÿÿüÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿþÿÿÿÿ€ÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿàÿÿÿüÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿüÿÿÿÿ€ÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÀÿÿÿüÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿüÿÿÿ€ÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÀÿÿÿüÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿüÿÿÿ€ÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÀÿÿÿüÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿüÿÿÿ€ÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÀÿÿÿüÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿüÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÀÿÿÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿüÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÀÿÿÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿüÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÀÿÿÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿü?ÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÀÿÿÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø?ÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿ€ÿÿÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø?ÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÀÿÿÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø?ÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿ€ÿÿÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø?ÿÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿ€ÿÿÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø?ÿÿþÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿ€ÿÿÿðÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿøÿÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿ€ÿÿÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿð?ÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿð?ÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿøÿÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿ€ÿÿÿðÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿðÿÿþÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿð?ÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿðÿÿþÿÿÀÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿÿðÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿðÿÿþÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿÿà?ÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿðÿÿþÿÿÀÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿÿð?ÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿàÿÿüÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿþÿÿÿà?ÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿðÿÿþÿÿÀÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿð?ÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿàÿÿüÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿþÿÿÿàÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀ?ÿÿðÿÿüÿÿÀÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿð?ÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿàÿÿüÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿþÿÿÿàÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀ?ÿÿàÿÿüÿÿÀÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿþÿÿàÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿàÿÿøÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿþÿÿÿÀÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿàÿÿüÿÿÀÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿþÿÿàÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀ?ÿÿÀÿÿøÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿüÿÿÀÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÀÿÿøÿÿÀÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿüÿÿÀÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÀÿÿøÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿüÿÿÀÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿÀÿÿøÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿüÿÿÀÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÀÿÿðÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿüÿÿÀÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿÀÿÿðÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿü?ÿÿÀÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿ€ÿÿðÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿø?ÿÿ€ÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿ€ÿÿðÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿø?ÿÿ€ÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿ€ÿÿðÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿø?ÿÿ€ÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿ€ÿÿðÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø?ÿÿ€ÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿ€ÿÿðÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø?ÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿ€ÿÿàÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø?ÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿ€ÿÿàÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø?ÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿà?ÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿà?ÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿà?ÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿðÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿà?ÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿðÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÀ?ÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿðÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÀ?ÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿðÿþÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÀ?ÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿðÿþÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÀ?ÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿðÿþÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿþÿÿÀÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿàÿþÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿþÿÿÀÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿàÿþÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿþÿÿÀÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿàÿþÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿþÿÿÀÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿàÿþÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿþÿÿ€ÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿàÿüÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿþÿÀÿÿÀÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿàÿþÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿüÿ€ÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÀÿüÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþÿ€ÿÿÀÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿàÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿüÿ€ÿÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÀÿüÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿü?ÿ€ÿÿÿÀÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÀÿüÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿüÿ€ÿÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÀÿøÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿü?ÿ€ÿÿÿÀÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÀÿüÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿø?ÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÀÿøÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿü?ÿ€ÿÿÿÀÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÀÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø?ÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿ€ÿøÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿü?ÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÀÿøÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø?ÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿ€ÿðÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÀ?ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿ€ÿøÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø?þÿÿÿ€ÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿ€ÿðÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿøÿÿÿÿÀÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿ€ÿøÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðþÿÿÿ€ÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿðÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿøþÿÿÿÀÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿ€ÿðÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿðþÿÿÿ€ÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿð?ÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ðþÿÿÿÀÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿðÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿðüÿÿÿ€ÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿà?ÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀðþÿÿÿ€ÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿð?ÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ðüÿÿÿ€ÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøþÿà?ÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀðüÿÿÿ€ÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿ€ÿà?ÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀàüÿÿÿ€ÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøþ€ÿàÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀàüÿÿÿ€ÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüþ€ÿàÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀà8üÿÿÿ€ÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüþ€ÿÀÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀ?à8üÿÿÿ€ÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüþ€ÀÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀ?à8øÿÿÿ€ÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüþÀÀÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀ?à8øÿÿÿ€ÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüüÀÀÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀ?À8øÿÿÿ€ÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüüÀÀÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?À<øÿÿÿ€ÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþüÀÀÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?À<øÿÿÿ€ÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþüÀÀÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?À|øÿÿÿ€ÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþüÀ?ÀÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÀ|øÿÿÿ€ÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþüà?€ÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÀ|ðÿÿÿ€ÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþøà?€ÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÀ|ðÿÿÿ€ÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþøà?€ÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿð€|ðÿÿÿ€ÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþøà?€ÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿð€~ðÿÿÿ€ÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøà?€ÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿð€þðÿÿÿ€ÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøà?ÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿð€þðÿÿÿ€ÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøð€ÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿð€þàÿÿÿ€ÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøðÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿð€þðÿÿÿ€ÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€øð€ÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðþà?ÿÿÿ€ÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿððÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿàÿÿÿÀÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€øðÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿà?ÿÿÿ€ÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ððÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿà?ÿÿÿÀÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ðøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿà?ÿÿÿ€ÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ðøÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿà?ÿÿÿÀÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀpøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÀ?ÿÿÿ€ÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€`?øÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ€à?ÿÿÿÀÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀpøÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÀÿÿÿ€ÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀ`?øÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ€@?ÿÿÿÀÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ€ÿÿÿ€ÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀ?øÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÀÿÿÿÀÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?üÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ€ÿÿÿ€ÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀüÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÀÿÿÿÀ?ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀ?üÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ€ÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀüÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÀÿÿÿÀÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?þÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÀÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàüÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÀÿÿÿÀ?ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÀÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàþÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÀÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿþÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðþÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿþÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿðÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿðÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿ?ÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿðÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿ€?ÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿðÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿ€?ÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿðÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿ€?ÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿðÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿ€?ÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿøÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿ€?ÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿøÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿ€?ÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀ?ÿøÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÀ?ÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀ?ÿøÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÀÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀ?ÿøÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÀÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀ?ÿøÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÀÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀ?ÿøÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÀÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿüÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿàÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿüÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÀÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿüÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿüÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿàÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿüÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿüÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿþÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿþÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿþÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿþÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿþÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿðÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿ?ÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿðÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿ€ÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿ?ÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿøÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿ€?ÿÿÿÿÀ?ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿ?ÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿøÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿ€?ÿÿÿÿÀ?ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿüÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿ€?ÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀ?ÿÿøÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿ€?ÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀ?ÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿ€ÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀ?ÿÿüÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÀ?ÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿüÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿ€ÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀ?ÿÿüÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÀÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿüÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÀÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿüÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÀÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿþÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÀÿÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿüÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÀÿÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿþÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÀÿÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿþÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÀÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿþÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÀÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿþÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿþÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿþÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿàÿÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿðÿÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿ€ÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿðÿÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿ€ÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿðÿÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿ€ÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿðÿÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿ€?ÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿðÿÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿðÿÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿ€?ÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿøÿÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÀ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿøÿÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÀ?ÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿøÿÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÀ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿøÿÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÀ?ÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿÿüÿÿÿÿÿÀ?ÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÀ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀ?ÿÿÿøÿÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÀÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿÿüÿÿÿÿÿÀ?ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿà?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿüÿÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÀÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿüÿÿÿÿÿÀ?ÿÿÿÿÿÿÿÿÿÿÀ?ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿüÿÿÿÿÿÀÿÿ€ÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿàÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿð?ÿÿÿüÿÿÿÿÿÀÿÿÀÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿÿÿÿ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿÿüÿÿÿÿÿÀÿÿ€ÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿàÿÿÿÿÿþ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿð?ÿÿÿþÿÿÿÿÿÀÿÿÀÿÿ€ÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿüÿÿÿÿÿÀÿÿ€ÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿÿÿÿþ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿð?ÿÿÿþÿÿÿÿÿÀÿÿÀÿÿ€ÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿþÿÿÿÿÿÀÿÿ€ÿÿ€ÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿþÿÿÿÿÿÀÿÿÀÿÿ€ÿÿÿÿÿÿà?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿðÿÿÿÿÿÿ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿþÿÿÿÿÿÀÿÿ€ÿÿ€ÿÿÿÿÿÿ€?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿþ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÀÿÿ€ÿÿ€ÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿðÿÿÿÿÿÿ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿþÿÿÿÿÿÀÿÿ€ÿÿ€ÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿðÿÿÿÿÿþ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÀÿÿÀÿÿ€ÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿøÿÿÿÿÿÿ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÀÿÿ€ÿÿ€ÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿøÿÿÿÿÿþ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÀÿÿÀÿÿ€ÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿøÿÿÿÿÿÿ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÀÿÿ€ÿÿ€ÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿøÿÿÿÿÿþ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÀÿÿ€ÿÿ€ÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿøÿÿÿÿÿÿ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿ?ÿÿÿÿÿÀÿÿ€ÿÿ€ÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿøÿÿÿÿÿþ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿ?ÿÿÿÿÿÀÿÿ€ÿÿ€ÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿøÿÿÿÿÿþ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿ?ÿÿÿÿÿÀÿÿ€ÿÿ€ÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿøÿÿÿÿÿþ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿ€?ÿÿÿÿÿÀÿÿ€ÿÿ€ÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿüÿÿÿÿÿþ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿ€?ÿÿÿÿÿÀÿÿ€ÿÿ€ÿÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀ?ÿÿÿÿüÿÿÿÿÿþ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿ€?ÿÿÿÿÿÀÿÿ€ÿÿ€ÿÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀ?ÿÿÿÿüÿÿÿÿÿþ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿ€ÿÿÿÿÿÀÿÿ€ÿÿ€ÿÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀ?ÿÿÿÿüÿÿÿÿÿþ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿ€ÿÿÿÿÿÀÿÿ€ÿÿ€ÿÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿüÿÿÿÿÿþ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿ€ÿÿÿÿÿÀÿÿ€ÿÿ€ÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿüÿÿÿÿÿþ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÀÿÿÿÿÿÀÿÿ€ÿÿ€ÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿüÿÿÿÿÿþ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÀÿÿÿÿÿÀÿÿ€ÿÿ€ÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿüÿÿÿÿÿþ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÀÿÿÿÿÿÀÿÿ€ÿÿ€ÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿÿÿþÿÿÿÿÿþ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÀÿÿÿÿÿÀÿÿ€ÿÿ€ÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿÿÿþÿÿÿÿÿÿ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÀÿÿÿÿÿÿÀÿÿ€ÿÿ€ÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿÿÿþÿÿÿÿÿþ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÀÿÿ€ÿÿ€ÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿþÿÿÿÿÿÿ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÀÿÿ€ÿÿ€ÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿþÿÿÿÿÿþ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿÿÿÿÿÀÿÿ€ÿÿ€ÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿÿÿÿÿÀÿÿ€ÿÿ€ÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿÿÿÿÿÀÿÿ€ÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿÿÿÿÿÀÿÿ€ÿÿ€ÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿþ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿàÿÿÿÿÿÿÀÿÿÀÿÿ€ÿÿÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿ€ÿÿÿÿÿÿ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿàÿÿÿÿÿÿÀÿÿ€ÿÿ€ÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿðÿÿÿÿÿÿÀÿÿÀÿÿ€ÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿÿ€ÿÿÿÿÿÿ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿðÿÿÿÿÿÿÀÿÿ€ÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿðÿÿÿÿÿÿÀÿÿÀÿÿÀÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŒÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿðÿÿÿÿÿÿàÿÿÿÿ÷þÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿð?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿßÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÏÿáÿÿÿÿÿÿÿÿý÷ÿÿÿÿÿß¹™á €ÀŒÇÿÿÿÿð#ÀÁßÿ?¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÿÿà?ÿÿ?ÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿð?ÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÿÿà?ÿÿ?ÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÿÿÀÿÿ?ÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÿÿÀÿÿ?ÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÿÿÀÿÿ?ÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿàÿÿÿÿÿÿÀÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÿÿ€ÿÿÿ?ÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿàÿÿÿÿÿÿ€ÿÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿÿà?ÿÿÿÿÿÿÿÿÿ?ÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿà?ÿÿÿÿÿþÿÿÿ?ÿÿà?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿà?ÿÿÿÿÿþÿÿÿ?ÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿàÿÿÿÿÿþÿÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿà?ÿÿÿÿÿüÿÿÿ?ÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿðÿÿÿÿÿüÿÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÿøÿÿÿ?ÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿðÿÿÿÿÿüÿÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿÿÿà?ÿÿÿÿÿøÿÿÿ?ÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿø?ÿÿÿÿÿÿðÿÿÿÿÿøÿÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÿÿà?ÿÿÿÿÿðÿÿþ?ÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿàÿÿÿÿÿÿðÿÿÿÿÿðÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿà?ÿÿÿÿÿàÿÿÿ?ÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿàÿÿÿÿÿàÿÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÿà?ÿÿþ?ÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿàÿÿÿÿÿà?ÿÿÿÿÿà?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿà?ÿÿÿÿÿÀÿÿþ?ÿÿà?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿÿÿÿÿÿÿüÿÿÿÿÿÿàÿÿÿÿÿÀÿÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿÿÿÿÿÿÿÿøÿÿÿÿÿÿà?ÿÿÿÿÿ€ÿÿÿþ?ÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿÿÿÿÿÿÿðÿÿÿÿÿàÿÿÿÿÿ€ÿÿÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿÿð?ÿÿÿÿÿà?ÿÿÿÿÿÿÿÿþ?ÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿÿàÿÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿÿÀÿÿÿÿÿà?ÿÿÿÿÿÿÿÿÿ?ÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿÿÀÿÿÿÿÿà?ÿÿÿÿÿÿÿÿÿ?ÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿ€ÿÿÿÿÿà?ÿÿÿÿþÿÿÿÿ?ÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€?ÿÿÿÿÿÿÿÿ€ÿÿÿÿÿà?ÿÿÿÿþÿÿÿÿ?ÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€?ÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿüÿÿÿÿ?ÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€?ÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿüÿÿÿÿ?ÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€?ÿÿÿÿÿÿÿþÿÿÿÿÿà?ÿÿÿÿüÿÿÿÿ?ÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ?ÿÿÿÿÿÿÿþÿÿÿÿÿà?ÿÿÿÿøÿÿÿÿ?ÿÿà?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿà?ÿÿÿÿøÿÿÿÿ?ÿÿà?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿà?ÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøþÿÿÿÿÿàÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÀÿÿÿÿà?ÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿàÿÿÿÿàÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿðÿøÿÿÿÿà?ÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿðÿÿø?ÿÿÿÿàÿÿÿÿà?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿàÿÿü?ÿÿÿÿà?ÿÿÿÿà?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿàÿÿþÿÿÿÿàÿÿÿÿà?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿàÿÿÿÿÿÿÿà?ÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿàÿÿÿ€ÿÿÿÿàÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿð?ÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÀÿÿÿ€ÿÿÿÿà?ÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿàÿÿÿÀÿÿÿÿðÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿð?ÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÀÿÿÿÀÿÿÿÿà?ÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÀÿÿÿàÿÿÿÿðÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿð?ÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿÿÿ€?ÿÿÿàÿÿÿÿà?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÀ?ÿÿÿðÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿÿÿ€ÿÿÿðÿÿÿÿà?ÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿÿÿ€?ÿÿÿøÿÿÿÿðÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿÿÿ€ÿÿÿøÿÿÿÿàÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿÿÿ€ÿÿÿüÿÿÿÿðÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿà?ÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿÿÿ€ÿÿÿüÿÿÿÿðÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿà?ÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿðÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿà?ÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿðÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿà?ÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿÿÿÿÿÿÿÿÿþÿÿÿÿðÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿà?ÿÿÿà?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿÿÿÿÿÿÿÿÿþÿÿÿÿðÿÿÿà?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿüÿÿÿÿà?ÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿþÿÿÿÿàÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿüÿÿÿÿà?ÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀ?ÿÿÿÿÿÿÿÿÿÿþÿÿÿÿàÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀ?ÿÿÿÿÿÿÿÿÿÿüÿÿÿÿà?ÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€?ÿÿÿÿÿÿÿÿÿÿþÿÿÿÿàÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€?ÿÿÿÿÿÿÿÿÿÿþÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€?ÿÿÿÿÿÿÿÿÿÿþÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€?ÿÿÿÿÿÿÿÿÿÿþÿÿÿÿà?ÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿþÿÿÿÿàÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿà?ÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿà?ÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿà?ÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿàÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿà?ÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿ€ÿÿÿþÿÿÿÿàÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿ€ÿÿÿþÿÿÿÿà?ÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿ€ÿÿÿþÿÿÿÿà?ÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿ€ÿÿÿþÿÿÿÿàÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿ€?ÿÿÿüÿÿÿÿà?ÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿ€?ÿÿÿþÿÿÿÿàÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿ€?ÿÿÿþÿÿÿÿà?ÿÿà?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÀÿÿÿþÿÿÿÿàÿÿà?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÀÿÿÿþÿÿÿÿà?ÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿà?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿð?ÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿð?ÿÿÿÿà?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿà?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿð?ÿÿÿÿà?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿàÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿø?ÿÿÿÿÿÿÿÿÿÿÿÿÿðÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿð?ÿÿÿÿà?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿÿÿÿÿø?ÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿðÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿð?ÿÿÿÿà?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà8ÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿðÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿà?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà<ÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿà?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀ<ÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà>?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀ~ÿÿÿÿÿÿ?ÿÿÿÿÿÿÿÿÿÿÿÿà?ÿà?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀ>?ÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿàÿà?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀ~?ÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀ~?ÿÿÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿàÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€~?ÿÿÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€?ÿÿÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿàÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿ?ÿÿÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿà?ÿ€ÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿàÿ€ÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿàþÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿàþÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿàþÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàüÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÀÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿàüÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÀÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿàüÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÀÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿàøÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÀÿÿÿÿÿÿÿà?ÿÿÿÿÿÿÿÿÿàøÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÀÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿàøÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿàÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿàðÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿàÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿàðÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿàÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿàðÿÿÿÿÿÿÿÿÿÿÿÿð?ÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿàÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿàà?ÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿðÿÿÿÿÿÿÿÿ?ÿÿÿÿÿÿÿÿðà?ÿÿÿÿÿÿÿÿÿÿÿÿð?ÿÿÿÿà?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿðÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿàÀ?ÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿðÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿÿðà?ÿÿÿÿÿÿÿÿÿÿÿÿð?ÿÿÿÿà?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿðÿÿÿÿÿÿÿÿàÿÿÿÿÿÿÿÿàÀÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿøÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÀÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿà?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿðÿÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿà€ÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿøÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿð€?ÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿà?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿøÿÿÿÿÿÿÿÿþ?ÿÿÿÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿøÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿà?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿøÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿüÿÿÿÿÿÿÿÿÿàÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿà?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿüÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿüÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿà?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿüÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿà?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀ?ÿüÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿþ?ÿÿÿÿÿÿÿÿÿàÿÿÿÿÿÿð?ÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿà?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀ?ÿþ?ÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿà?ÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿ?ÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿð€ÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿà?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿþ?ÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿ?ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿð€ÿÿÿÿÿÿÿÿÿÿÿð?ÿÿÿÿà?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿ?ÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿà€ÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿðÀÿÿÿÿÿÿÿÿÿÿÿð?ÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿ?ÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿàÀÿÿÿÿÿÿÿÍÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿðàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿð?ÿÿÿÿà?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿààÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿððÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÀ?ÿÿÿÿÿàðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÿàðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿàðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿàøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿàøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿàüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿàüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿàþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿàþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿàþ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿàÿ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿàÿ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿàÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿðÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿð?ÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿÿÿÿàÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿðÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿð?ÿÿÿÿà?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿðÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿü?ÿÿÿÿðÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿà?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿþ?ÿÿÿÿàÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿ?ÿÿÿÿðÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿà?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿ?ÿÿÿÿàÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿðÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿà?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿàÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿðÿüÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿà?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿàÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿÿÿðÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿà?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿÿÿàÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿðÿþ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿà?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿÿÿÿÿÿàÿÿÿÿàÿþ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿ€ÿÿÿÿðÿÿÿÿðÿÿ?ÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿà?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿðÿÿÿÿðÿÿ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿ€ÿÿÿÿøÿÿÿÿðÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿà?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀ?ÿÿÿÿÿÿÿøÿÿÿÿàÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿ€ÿÿÿÿüÿÿÿÿðÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿà?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀ?ÿÿÿÿÿÿÿøÿÿÿÿðÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿ€ÿÿÿÿüÿÿÿÿðÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿà?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿüÿÿÿÿàÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿüÿÿÿÿðÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿà?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿüÿÿÿÿðÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿþÿÿÿÿðÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿà?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿðÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿðÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿð?ÿÿÿÿà?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿðÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿðÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿð?ÿÿÿÿà?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿàÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿðÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿþÿÿÿÿðÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿþÿÿÿÿðÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿþÿÿÿÿàÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿþÿÿÿÿðÿÿÿ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿþÿÿÿÿðÿÿÿ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿþÿÿÿÿðÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿð?ÿÿÿÿà?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿþÿÿÿÿðÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿþÿÿÿÿðÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿþÿÿÿÿðÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿð?ÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿþÿÿÿÿðÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿÿÿþÿÿÿÿðÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿðÿÿÿÿÿÿÿüÿÿÿÿðÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿðÿÿÿ€ÿÿÿÿüÿÿÿÿðÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿð?ÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿøÿÿÿ€ÿÿÿüÿÿÿÿðÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿð?ÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿøÿÿÿ€ÿÿÿüÿÿÿÿðÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿøÿÿÿ€ÿÿÿüÿÿÿÿðÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿüÿÿÿ€ÿÿÿüÿÿÿÿðÿÿÿøÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿüÿÿÿ€?ÿÿÿøÿÿÿÿðÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿüÿÿÀ?ÿÿÿøÿÿÿÿðÿÿÿüÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿüÿÿÿÀ?ÿÿÿðÿÿÿÿðÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿüÿÿÀÿÿÿøÿÿÿÿðÿÿÿþÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿÿÿÿüÿÿÀÿÿÿðÿÿÿÿðÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿð?ÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿþÿÿàÿÿÿðÿÿÿÿðÿÿÿÿ?ÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿðÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÿþÿÿÀÿÿÿàÿÿÿÿðÿÿÿþ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿÿÿÿþ?ÿÿàÿÿÿàÿÿÿÿðÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿðÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀ?ÿÿÿÿÿþ?ÿÿàÿÿÿÀÿÿÿÿðÿÿÿÿ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÿÿ?ÿÿðÿÿÿÀÿÿÿÿðÿÿÿÿ€ÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿðÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿþ?ÿÿàÿÿÿÿÿÿÿðÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿïÿÿÿÿÿÿÿÿÿÿÿÀ?ÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿðÿÿÿÿÀÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿðÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿ?ÿÿðÿÿþ?ÿÿÿÿðÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿÿøÿü?ÿÿÿÿðÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿø?ÿøÿÿÿÿðÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿ€ÿÿüÿð?ÿÿÿÿðÿÿÿÿðÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿðÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿüÿÀÿÿÿÿàÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿ€ÿÿüÿÿÿÿÿðÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿ€ÿÿüÿÿÿÿÿðÿÿÿÿðÿÿÿ?ÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÀÿÿþÿÿÿÿÿðÿÿÿÿøÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿþÿÿÿÿÿðÿÿÿÿøÿÿÿÿÿð?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿÿðÿÿÿÿüÿÿÿÿÿð?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿÿðÿÿÿÿüÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿ€ÿÿÿÿÿðÿÿÿÿüÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿ€ÿÿÿÿÿðÿÿÿÿüÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÀÿÿÿÀÿÿÿÿÿðÿÿÿÿþÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÀÿÿÿÀÿÿÿÿÿðÿÿÿÿþÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿàÿÿÿàÿÿÿÿÿðÿÿÿÿÿ?ÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿàÿÿÿðÿÿÿÿÿðÿÿÿÿÿ?ÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿàÿÿÿð?ÿÿÿÿÿðÿÿÿÿÿ€ÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿàÿÿÿøÿÿÿÿÿðÿÿÿÿÿ€ÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿðÿÿÿüÿÿÿÿÿðÿÿÿÿÿ€ÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿðÿÿÿüÿÿÿÿÿÿðÿÿÿÿÿÀÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿðÿÿÿþÿÿÿÿÿÿðÿÿÿÿÿÀÿÿÿÿð?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÀÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿÿÿðÿÿÿÿ€ÿÿÿÿÿÿðÿÿÿÿÿàÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿÿÿøÿÿÿÿÀÿÿÿÿÿÿðÿÿÿÿÿàÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿÿÿøÿÿÿÿÀÿÿÿÿÿÿðÿÿÿÿÿðÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿÿÿøÿÿÿÿàÿÿÿÿÿÿðÿÿÿÿÿðÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿÿÿøÿÿÿÿð?ÿÿÿÿÿÿðÿÿÿÿÿðÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿÿÿøÿÿÿÿø?ÿÿÿÿÿÿðÿÿÿÿÿøÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿüÿÿÿÿüÿÿÿÿÿÿÿðÿÿÿÿÿøÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿüÿÿÿÿþÿÿÿÿÿÿÿðÿÿÿÿÿüÿÿ€ÿÿð?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿüÿÿÿÿ€ÿÿÿÿÿÿÿðÿÿÿÿÿüÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿþÿÿÿÿÀÿÿÿÿÿÿÿðÿÿÿÿÿþÿ€ÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿüÿÿÿÿàÿÿÿÿÿÿÿðÿÿÿÿÿþÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿþÿÿÿÿðÿÿÿÿÿÿÿðÿÿÿÿÿÿ?ÿ€ÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÿÿÿþÿÿÿÿüÿÿÿÿÿÿÿðÿÿÿÿÿÿ?ÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿÿÿÿÿÿþ?ÿÿÿÿþÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿ€ÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÿÿÿþ?ÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÿÿÿÿ?ÿÿÿÿÿÀÿÿÿÿÿÿÿÿðÿÿÿÿÿÿ€ÿ€ÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀ?ÿÿÿÿÿÿÿÿ?ÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿ€ÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÿÿÿÿÿÿÿÿÿü?ÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÀÿ€ÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿÿ?ÿÿÿÿÿþÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÀÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀ?ÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÀÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿàÿ€ÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿàÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿðÿ€ÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿàÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿøÿ€ÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿð?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿ÷ÿkûÿu6?ÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÀÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿÿÿÿÿÿÿÿ?ÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿ€ÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÀÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿÿÿÿÿÿÿàÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿ€ÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÀÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿÿÿÿÿÿüÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿ€ÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿðÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÀÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿ€ÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿ€ÿÿÿÿÿÿø?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÀÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿÿÿÿÿþÿÿÿÿÿÿð?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿ€ÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿüÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÀÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿÿÿÿÿðÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿ€ÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿàÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÀÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿÿÿÿÿ€ÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿ€ÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿø?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÀÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿÿÿÿþÿÿÿÿÿð?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿ€ÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿüÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿ€ÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿÿÿÿøÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿ€ÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿðÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿ€ÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿÿÿÿàÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿ€ÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÀÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿ€ÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿÿÿÿ€?ÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿ€ÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿ€ÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿßÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿÿÿþÿÿÿÿð?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿ€ÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿÿÿüÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿ€ÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿÿÿøÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿ€ÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿÿÿøÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿ€ÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿÿÿðÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿ€ÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿÿÿàÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿ€ÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿÿÿàÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿ€ÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿÿÿÀÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿ€ÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿ€ÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿ€ÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿ€?ÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿ€ÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿ€ÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿ€ÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿþÿÿÿð?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿ€ÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿüÿÿÿð?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿ€ÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿüÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÀÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿøÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿ€ÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿøÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÀÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿøÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿøøÿÿÿøÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿðÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿð?ÿÀÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿàÿÿàÿÿÿðÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿàÿÿðÿÿøÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÀÿÿøÿÿÿðÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÀÿÿüÿÿøÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÀÿÿüÿÿðÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿ?ÿÿøÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿûÿ€ÿÿÿ?ÿÿðÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿ€ÿÿøÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿ€?ÿÿÿ€?ÿÿðÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿ€?ÿÿÿÀÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿð¿ÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿøÿÿÿÿ€?ÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðßÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿðÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿøÿÿÿÿÀ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿÿÿÿÿÿÿÿÿþÿÿÿÿàÿÿðÿÿÿÿ€?ÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿþÿÿÿÿðÿÿøÿÿÿÿÀ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿÿÿÿÿÿÿÿÿþÿÿÿÿðÿÿðÿÿÿÿÀ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿþÿÿÿÿðÿÿøÿÿÿÿà?ÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿþÿÿÿÿðÿÿðÿÿÿÿÀ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿþÿÿÿÿøÿÿøÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿþÿÿÿÿðÿÿðÿÿÿÿà?ÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿüÿÿÿÿøÿÿðÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿÿÿÿÿÿÿÿÿüÿÿÿÿøÿÿðÿÿÿÿà?ÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿüÿÿÿÿøÿÿðÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿÿÿÿÿÿÿÿÿüÿÿÿÿøÿÿðÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿüÿÿÿÿøÿÿðÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿüÿÿÿÿøÿÿðÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿüÿÿÿÿøÿÿðÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿüÿÿÿÿøÿÿðÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿüÿÿÿÿøÿÿøÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿüÿÿÿÿøÿÿðÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿüÿÿÿÿøÿÿðÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿüÿÿÿÿøÿÿøÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿüÿÿÿÿøÿÿðÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿüÿÿÿÿøÿÿøÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿüÿÿÿÿøÿÿøÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿüÿÿÿÿøÿÿøÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿüÿÿÿÿøÿÿøÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿþÿÿÿÿüÿÿøÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿüÿÿÿÿøÿÿøÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿþÿÿÿÿüÿÿøÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿüÿÿÿÿøÿÿøÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿþÿÿÿÿüÿÿøÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿüÿÿÿÿøÿÿðÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿþÿÿÿÿüÿÿøÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÀ?ÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿüÿÿÿÿøÿÿðÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿþÿÿÿÿüÿÿøÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÀ?ÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿüÿÿÿÿøÿÿðÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿþÿÿÿÿüÿÿøÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÀ?ÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿüÿÿÿÿøÿÿðÿÿÿÿà?ÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿþÿÿÿÿüÿÿøÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿüÿÿÿÿøÿÿðÿÿÿÿà?ÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿþÿÿÿÿüÿÿøÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿüÿÿÿÿøÿÿðÿÿÿÿà?ÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿþÿÿÿÿüÿÿøÿÿÿÿà?ÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿüÿÿÿÿøÿÿðÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿþÿÿÿÿüÿÿøÿÿÿÿà?ÿÿÿÿÿÿÿÿÿÿÿÿÿÀ?ÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿüÿÿÿÿøÿÿðÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿþÿÿÿÿüÿÿøÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿüÿÿÿÿøÿÿðÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿþÿÿÿÿüÿÿøÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿüÿÿÿÿøÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿþÿÿÿÿøÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿüÿÿÿÿøÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿþÿÿÿÿøÿÿøÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿüÿÿÿÿøÿÿøÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿþÿÿÿÿøÿÿøÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿüÿÿÿÿøÿÿøÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿüÿÿÿÿøÿÿøÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿüÿÿÿÿøÿÿøÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿüÿÿÿÿøÿÿøÿÿÿà?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿüÿÿÿÿøÿÿøÿÿÿÀ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿüÿÿÿÿøÿÿøÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿüÿÿÿÿøÿÿøÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿþÿÿÿÿøÿÿøÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿþÿÿÿÿøÿÿøÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿüÿÿÿÿøÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿüÿÿÿÿøÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿüÿÿÿÿøÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿüÿÿÿÿøÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿþÿÿÿÿøÿÿø?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿþÿÿÿÿüÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿþÿÿÿÿøÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿþÿÿÿÿüÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿüÿÿÿÿøÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿþÿÿÿÿüÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀ?ÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿüÿÿÿÿøÿÿø?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿþÿÿÿÿüÿÿø?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀ?ÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿüÿÿÿÿøÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿþÿÿÿÿüÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀ?ÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿüÿÿÿÿøÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿþÿÿÿÿüÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀ?ÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿþÿÿÿÿøÿÿø?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿð?ÿÿÿþÿÿÿÿüÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿüÿÿÿÿøÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿð?ÿÿÿþÿÿÿÿüÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀ?ÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿüÿÿÿÿøÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿð?ÿÿÿþÿÿÿÿüÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀ?ÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿüÿÿÿÿøÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿð?ÿÿÿþÿÿÿÿüÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀ?ÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿüÿÿÿÿøÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿþÿÿÿÿüÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀ?ÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿüÿÿÿÿøÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿþÿÿÿÿüÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀ?ÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿüÿÿÿÿøÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿþÿÿÿÿüÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀ?ÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿüÿÿÿÿøÿÿð?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿþÿÿÿÿüÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿüÿÿÿÿøÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿþÿÿÿÿüÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿüÿÿÿÿøÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿþÿÿÿÿüÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿüÿÿÿÿøÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿþÿÿÿÿøÿÿø?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿüÿÿÿÿøÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿþÿÿÿÿøÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿþÿÿÿÿøÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿþÿÿÿÿøÿÿøÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿþÿÿÿÿøÿÿøÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿþÿÿÿÿøÿÿøÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿþÿÿÿÿøÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿþÿÿÿÿøÿÿøÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿþÿÿÿÿøÿÿøÿÿÿà?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿþÿÿÿÿøÿÿøÿÿÿð?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿþÿÿÿÿøÿÿøÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿþÿÿÿÿøÿÿøÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿþÿÿÿÿüÿÿøÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀ?ÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿþÿÿÿÿøÿÿøÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿþÿÿÿÿüÿÿøÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀ?ÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿþÿÿÿÿüÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿþÿÿÿÿüÿÿøÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿþÿÿÿÿøÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿþÿÿÿÿüÿÿøÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿþÿÿÿÿøÿÿøÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿþÿÿÿÿüÿÿøÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿþÿÿÿÿøÿÿøÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿþÿÿÿÿüÿÿøÿÿÿÿà?ÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿþÿÿÿÿøÿÿøÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿþÿÿÿÿüÿÿøÿÿÿÿà?ÿÿÿÿÿÿÿÿÿÿÿÿÿÀ?ÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿüÿÿÿÿøÿÿøÿÿÿÿà?ÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿþÿÿÿÿüÿÿøÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿüÿÿÿÿøÿÿøÿÿÿÿà?ÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿþÿÿÿÿüÿÿøÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿüÿÿÿÿøÿÿøÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿþÿÿÿÿüÿÿøÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÀ?ÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿþÿÿÿÿøÿÿøÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿþÿÿÿÿüÿÿøÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÀ?ÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿþÿÿÿÿøÿÿøÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿþÿÿÿÿüÿÿøÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÀ?ÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿþÿÿÿÿüÿÿøÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿþÿÿÿÿüÿÿøÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÀ?ÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿþÿÿÿÿøÿÿøÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿþÿÿÿÿüÿÿøÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿþÿÿÿÿøÿÿøÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿþÿÿÿÿüÿÿøÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿþÿÿÿÿøÿÿøÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿþÿÿÿÿøÿÿøÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿþÿÿÿÿøÿÿøÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿþÿÿÿÿøÿÿøÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿþÿÿÿÿøÿÿøÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿþÿÿÿÿüÿÿøÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿþÿÿÿÿüÿÿøÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿþÿÿÿÿüÿÿøÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿþÿÿÿÿüÿÿøÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿþÿÿÿÿüÿÿøÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿþÿÿÿÿüÿÿøÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿþÿÿÿÿüÿÿøÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿþÿÿÿÿüÿÿøÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿþÿÿÿÿüÿÿøÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿþÿÿÿÿüÿÿøÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÀ?ÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿþÿÿÿÿüÿÿøÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿþÿÿÿÿüÿÿøÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÀ?ÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿþÿÿÿÿüÿÿøÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿþÿÿÿÿüÿÿøÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿþÿÿÿÿüÿÿøÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿþÿÿÿÿüÿÿøÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿþÿÿÿÿøÿÿøÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿþÿÿÿÿüÿÿøÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿþÿÿÿÿøÿÿøÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿþÿÿÿÿüÿÿüÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿþÿÿÿÿøÿÿøÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿüÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿþÿÿÿÿðÿÿøÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿøÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿøÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿøÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿøÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿðÿÿøÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿøÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿ€?ÿÿÿàÿÿøÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÀ?ÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿ€?ÿÿÿÀÿÿøÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÀÿÿøÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿ€?ÿÿøÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿ€?ÿÿøÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÀ?ÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿ?ÿÿøÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÀÿÿþ?ÿÿøÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÀ?ÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÀÿÿüÿÿøÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿàÿÿøÿÿøÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÀ?ÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿàÿÿðÿÿÿøÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿðÿàÿÿÿøÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿð?ÿÀÿÿÿøÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿøÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿðüÿÿÿøÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿøÿÿÿøÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿøÿÿÿøÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿüÿÿÿøÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿüÿÿÿøÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿþÿÿÿøÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿþÿÿÿøÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿøÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿ€?ÿÿÿøÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÀ?ÿÿÿøÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿøÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿàÿÿÿøÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÀ?ÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿøÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿøÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿøÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿüÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿøÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿü?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿü?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿüÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿøÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿüÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿøÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿüÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿøÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿü?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿü?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀ?ÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿÿÿÿÿøÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿÿÿÿÿüÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿøÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿüÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿÿÿÿÿÿøÿÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÀ?ÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿøÿÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿøÿÿÿÿÿà?ÿÿÿÿÿÿÿÿÿÿÿÿàÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿøÿÿÿÿÿà?ÿÿÿÿÿÿÿÿÿÿÿÿàÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿiaxmodem-1.2.0/lib/spandsp/test-data/itu/fax/generate_sized_pages.c0000644000175000017500000002117011150047204024644 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * generate_sized_pages.c - Create a series of TIFF files in the various page sizes * and resolutions. * * Written by Steve Underwood * * Copyright (C) 2006 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2, as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: generate_sized_pages.c,v 1.2 2008/07/10 13:34:01 steveu Exp $ */ /*! \file */ #if defined(HAVE_CONFIG_H) #include "config.h" #endif #include #include #include #include #include #include #include #include #include #if defined(HAVE_TGMATH_H) #include #endif #if defined(HAVE_MATH_H) #include #endif #include "spandsp.h" struct { const char *name; int x_res; int y_res; int width; int length; } sequence[] = { { "R8_385_A4.tif", T4_X_RESOLUTION_R8, T4_Y_RESOLUTION_STANDARD, T4_WIDTH_R8_A4, 1100 }, { "R8_385_B4.tif", T4_X_RESOLUTION_R8, T4_Y_RESOLUTION_STANDARD, T4_WIDTH_R8_B4, 1200 }, { "R8_385_A3.tif", T4_X_RESOLUTION_R8, T4_Y_RESOLUTION_STANDARD, T4_WIDTH_R8_A3, 1556 }, { "R8_77_A4.tif", T4_X_RESOLUTION_R8, T4_Y_RESOLUTION_FINE, T4_WIDTH_R8_A4, 2200 }, { "R8_77_B4.tif", T4_X_RESOLUTION_R8, T4_Y_RESOLUTION_FINE, T4_WIDTH_R8_B4, 2400 }, { "R8_77_A3.tif", T4_X_RESOLUTION_R8, T4_Y_RESOLUTION_FINE, T4_WIDTH_R8_A3, 3111 }, { "R8_154_A4.tif", T4_X_RESOLUTION_R8, T4_Y_RESOLUTION_SUPERFINE, T4_WIDTH_R8_A4, 4400 }, { "R8_154_B4.tif", T4_X_RESOLUTION_R8, T4_Y_RESOLUTION_SUPERFINE, T4_WIDTH_R8_B4, 4800 }, { "R8_154_A3.tif", T4_X_RESOLUTION_R8, T4_Y_RESOLUTION_SUPERFINE, T4_WIDTH_R8_A3, 6222 }, { "R300_300_A4.tif", T4_X_RESOLUTION_300, T4_Y_RESOLUTION_300, T4_WIDTH_300_A4, 4400 }, { "R300_300_B4.tif", T4_X_RESOLUTION_300, T4_Y_RESOLUTION_300, T4_WIDTH_300_B4, 4800 }, { "R300_300_A3.tif", T4_X_RESOLUTION_300, T4_Y_RESOLUTION_300, T4_WIDTH_300_A3, 6222 }, { "R300_600_A4.tif", T4_X_RESOLUTION_300, T4_Y_RESOLUTION_600, T4_WIDTH_300_A4, 4400 }, { "R300_600_B4.tif", T4_X_RESOLUTION_300, T4_Y_RESOLUTION_600, T4_WIDTH_300_B4, 4800 }, { "R300_600_A3.tif", T4_X_RESOLUTION_300, T4_Y_RESOLUTION_600, T4_WIDTH_300_A3, 6222 }, { "R16_154_A4.tif", T4_X_RESOLUTION_R16, T4_Y_RESOLUTION_SUPERFINE, T4_WIDTH_R16_A4, 4400 }, { "R16_154_B4.tif", T4_X_RESOLUTION_R16, T4_Y_RESOLUTION_SUPERFINE, T4_WIDTH_R16_B4, 4800 }, { "R16_154_A3.tif", T4_X_RESOLUTION_R16, T4_Y_RESOLUTION_SUPERFINE, T4_WIDTH_R16_A3, 6222 }, { "R16_800_A4.tif", T4_X_RESOLUTION_R16, T4_Y_RESOLUTION_800, T4_WIDTH_R16_A4, 4400 }, { "R16_800_B4.tif", T4_X_RESOLUTION_R16, T4_Y_RESOLUTION_800, T4_WIDTH_R16_B4, 4800 }, { "R16_800_A3.tif", T4_X_RESOLUTION_R16, T4_Y_RESOLUTION_800, T4_WIDTH_R16_A3, 6222 }, { "R600_600_A4.tif", T4_X_RESOLUTION_600, T4_Y_RESOLUTION_600, T4_WIDTH_600_A4, 4400 }, { "R600_600_B4.tif", T4_X_RESOLUTION_600, T4_Y_RESOLUTION_600, T4_WIDTH_600_B4, 4800 }, { "R600_600_A3.tif", T4_X_RESOLUTION_600, T4_Y_RESOLUTION_600, T4_WIDTH_600_A3, 6222 }, { "R600_1200_A4.tif", T4_X_RESOLUTION_600, T4_Y_RESOLUTION_1200, T4_WIDTH_600_A4, 4400 }, { "R600_1200_B4.tif", T4_X_RESOLUTION_600, T4_Y_RESOLUTION_1200, T4_WIDTH_600_B4, 4800 }, { "R600_1200_A3.tif", T4_X_RESOLUTION_600, T4_Y_RESOLUTION_1200, T4_WIDTH_600_A3, 6222 }, { "R1200_1200_A4.tif", T4_X_RESOLUTION_1200, T4_Y_RESOLUTION_1200, T4_WIDTH_1200_A4, 4400 }, { "R1200_1200_B4.tif", T4_X_RESOLUTION_1200, T4_Y_RESOLUTION_1200, T4_WIDTH_1200_B4, 4800 }, { "R1200_1200_A3.tif", T4_X_RESOLUTION_1200, T4_Y_RESOLUTION_1200, T4_WIDTH_1200_A3, 6222 }, { NULL, 0, 0, 0, 0 }, }; int main(int argc, char *argv[]) { int row; uint8_t image_buffer[8192]; TIFF *tiff_file; struct tm *tm; time_t now; char buf[133]; float x_resolution; float y_resolution; int i; for (i = 0; sequence[i].name; i++) { if ((tiff_file = TIFFOpen(sequence[i].name, "w")) == NULL) exit(2); /* Prepare the directory entry fully before writing the image, or libtiff complains */ TIFFSetField(tiff_file, TIFFTAG_COMPRESSION, COMPRESSION_CCITT_T6); TIFFSetField(tiff_file, TIFFTAG_IMAGEWIDTH, sequence[i].width); TIFFSetField(tiff_file, TIFFTAG_BITSPERSAMPLE, 1); TIFFSetField(tiff_file, TIFFTAG_ORIENTATION, ORIENTATION_TOPLEFT); TIFFSetField(tiff_file, TIFFTAG_SAMPLESPERPIXEL, 1); TIFFSetField(tiff_file, TIFFTAG_ROWSPERSTRIP, -1L); TIFFSetField(tiff_file, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG); TIFFSetField(tiff_file, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_MINISWHITE); TIFFSetField(tiff_file, TIFFTAG_FILLORDER, FILLORDER_LSB2MSB); x_resolution = sequence[i].x_res/100.0f; y_resolution = sequence[i].y_res/100.0f; TIFFSetField(tiff_file, TIFFTAG_XRESOLUTION, floorf(x_resolution*2.54f + 0.5f)); TIFFSetField(tiff_file, TIFFTAG_YRESOLUTION, floorf(y_resolution*2.54f + 0.5f)); TIFFSetField(tiff_file, TIFFTAG_RESOLUTIONUNIT, RESUNIT_INCH); TIFFSetField(tiff_file, TIFFTAG_SOFTWARE, "spandsp"); if (gethostname(buf, sizeof(buf)) == 0) TIFFSetField(tiff_file, TIFFTAG_HOSTCOMPUTER, buf); TIFFSetField(tiff_file, TIFFTAG_IMAGEDESCRIPTION, "Blank test image"); TIFFSetField(tiff_file, TIFFTAG_MAKE, "soft-switch.org"); TIFFSetField(tiff_file, TIFFTAG_MODEL, "test data"); time(&now); tm = localtime(&now); sprintf(buf, "%4d/%02d/%02d %02d:%02d:%02d", tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec); TIFFSetField(tiff_file, TIFFTAG_DATETIME, buf); TIFFSetField(tiff_file, TIFFTAG_IMAGELENGTH, sequence[i].length); TIFFSetField(tiff_file, TIFFTAG_PAGENUMBER, 0, 1); TIFFSetField(tiff_file, TIFFTAG_CLEANFAXDATA, CLEANFAXDATA_CLEAN); TIFFSetField(tiff_file, TIFFTAG_IMAGEWIDTH, sequence[i].width); /* Write the image first.... */ for (row = 0; row < sequence[i].length; row++) { memset(image_buffer, 0, sequence[i].width/8 + 1); if (TIFFWriteScanline(tiff_file, image_buffer, row, 0) < 0) { printf("Write error at row %d.\n", row); exit(2); } } /* ....then the directory entry, and libtiff is happy. */ TIFFWriteDirectory(tiff_file); TIFFClose(tiff_file); } return 0; } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/test-data/itu/fax/Makefile.am0000644000175000017500000001216011150047204022364 0ustar julienjulien## ## SpanDSP - a series of DSP components for telephony ## ## Makefile.am - Process this file with automake to produce Makefile.in ## ## This program is free software; you can redistribute it and/or modify ## it under the terms of the GNU General Public License version 2, as ## as published by the Free Software Foundation. ## ## This program is distributed in the hope that it will be useful, ## but WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ## GNU General Public License for more details. ## ## You should have received a copy of the GNU General Public License ## License along with this program; if not, write to the Free Software ## Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ## ## $Id: Makefile.am,v 1.3 2008/05/03 13:05:04 steveu Exp $ AM_CFLAGS = $(COMP_VENDOR_CFLAGS) AM_LDFLAGS = $(COMP_VENDOR_LDFLAGS) PBM2G3 = pbmtog3 FAX2TIFF = fax2tiff EXTRA_DIST = itu1.pbm \ itu2.pbm \ itu3.pbm \ itu4.pbm \ itu5.pbm \ itu6.pbm \ itu7.pbm \ itu8.pbm \ test1.pbm \ test2.pbm \ test3.pbm \ test4.pbm nobase_data_DATA = itutests.tif \ itu1.tif \ itu2.tif \ itu3.tif \ itu4.tif \ itu5.tif \ itu6.tif \ itu7.tif \ itu8.tif \ test1.tif \ test2.tif \ test3.tif \ test4.tif \ dithered.tif \ 100pages.tif \ R1200_1200_A4.tif \ R1200_1200_B4.tif \ R1200_1200_A3.tif \ R600_1200_A4.tif \ R600_1200_B4.tif \ R600_1200_A3.tif \ R600_600_A4.tif \ R600_600_B4.tif \ R600_600_A3.tif \ R16_800_A4.tif \ R16_800_B4.tif \ R16_800_A3.tif \ R16_154_A3.tif \ R16_154_A4.tif \ R16_154_B4.tif \ R300_600_A4.tif \ R300_600_B4.tif \ R300_600_A3.tif \ R300_300_A4.tif \ R300_300_B4.tif \ R300_300_A3.tif \ R8_154_A3.tif \ R8_154_A4.tif \ R8_154_B4.tif \ R8_77_A3.tif \ R8_77_A4.tif \ R8_77_B4.tif \ R8_385_A3.tif \ R8_385_A4.tif \ R8_385_B4.tif noinst_PROGRAMS = generate_dithered_tif \ generate_sized_pages generate_dithered_tif_SOURCES = generate_dithered_tif.c generate_dithered_tif_LDADD = -ltiff generate_sized_pages_SOURCES = generate_sized_pages.c generate_sized_pages_LDADD = -ltiff clean: rm -f *.tif *.g3 itutests.tif: itu1.g3 itu2.g3 itu3.g3 itu4.g3 itu5.g3 itu6.g3 itu7.g3 itu8.g3 \ test1.g3 test2.g3 test3.g3 test4.g3 $(FAX2TIFF) -M -o $@ itu1.g3 itu2.g3 itu3.g3 itu4.g3 itu5.g3 itu6.g3 itu7.g3 itu8.g3 \ test1.g3 test2.g3 test3.g3 test4.g3 100pages.tif: itu1.g3 itu2.g3 itu3.g3 itu4.g3 itu5.g3 itu6.g3 itu7.g3 itu8.g3 \ test1.g3 test2.g3 test3.g3 test4.g3 $(FAX2TIFF) -M -o $@ \ itu1.g3 itu2.g3 itu3.g3 itu4.g3 itu5.g3 itu6.g3 itu7.g3 itu8.g3 test1.g3 test2.g3 test3.g3 test4.g3 \ itu1.g3 itu2.g3 itu3.g3 itu4.g3 itu5.g3 itu6.g3 itu7.g3 itu8.g3 test1.g3 test2.g3 test3.g3 test4.g3 \ itu1.g3 itu2.g3 itu3.g3 itu4.g3 itu5.g3 itu6.g3 itu7.g3 itu8.g3 test1.g3 test2.g3 test3.g3 test4.g3 \ itu1.g3 itu2.g3 itu3.g3 itu4.g3 itu5.g3 itu6.g3 itu7.g3 itu8.g3 test1.g3 test2.g3 test3.g3 test4.g3 \ itu1.g3 itu2.g3 itu3.g3 itu4.g3 itu5.g3 itu6.g3 itu7.g3 itu8.g3 test1.g3 test2.g3 test3.g3 test4.g3 \ itu1.g3 itu2.g3 itu3.g3 itu4.g3 itu5.g3 itu6.g3 itu7.g3 itu8.g3 test1.g3 test2.g3 test3.g3 test4.g3 \ itu1.g3 itu2.g3 itu3.g3 itu4.g3 itu5.g3 itu6.g3 itu7.g3 itu8.g3 test1.g3 test2.g3 test3.g3 test4.g3 \ itu1.g3 itu2.g3 itu3.g3 itu4.g3 itu5.g3 itu6.g3 itu7.g3 itu8.g3 test1.g3 test2.g3 test3.g3 test4.g3 \ itu1.g3 itu2.g3 itu3.g3 itu4.g3 .g3.tif: ${FAX2TIFF} -M -o $*.tif $*.g3 .pbm.g3: ${PBM2G3} $*.pbm >$*.g3 dithered.tif: generate_dithered_tif$(EXEEXT) ./generate_dithered_tif$(EXEEXT) R1200_1200_A4.tif \ R1200_1200_B4.tif \ R1200_1200_A3.tif \ R600_1200_A4.tif \ R600_1200_B4.tif \ R600_1200_A3.tif \ R600_600_A4.tif \ R600_600_B4.tif \ R600_600_A3.tif \ R16_800_A4.tif \ R16_800_B4.tif \ R16_800_A3.tif \ R16_154_A3.tif \ R16_154_A4.tif \ R16_154_B4.tif \ R300_600_A4.tif \ R300_600_B4.tif \ R300_600_A3.tif \ R300_300_A4.tif \ R300_300_B4.tif \ R300_300_A3.tif \ R8_154_A3.tif \ R8_154_A4.tif \ R8_154_B4.tif \ R8_77_A3.tif \ R8_77_A4.tif \ R8_77_B4.tif \ R8_385_A3.tif \ R8_385_A4.tif \ R8_385_B4.tif: generate_sized_pages$(EXEEXT) ./generate_sized_pages$(EXEEXT) iaxmodem-1.2.0/lib/spandsp/test-data/itu/fax/itu3.pbm0000644000175000017500000175231511150047204021732 0ustar julienjulienP4 1728 2376 ~€|<ÿ€þ€<ÿ€€þ?À<ÿ€€ÿ?À>èÀøüáà 0ÿ?€|?ÿ>þ?ðüÿçð~ü?€|ïÿ€ÿÿøüÿ‡÷ðÿÿþàÿÿÿÿÿ€ÿøüÿ‡÷ðÿÿ¿‡ÿÿðÿÿ€ÿÿÀÿü€ÿÁñðÿÿÿÿðÿÿ?ÿÿÁùøÿÁáð?ÿ?ÿÿÁÿðÿ€€ïÿáøøÿáñðŸÿÿÀÿÀ?ÿÁðpÿÁñð ?ÿÏà>>€€€ÿáðÿÁñðÿ‡à<>ÿÁð8 ÿóð?ÿŸƒð<>€€ó€ø|Û€óð}ÿŸà|>€‡€øüž‡ÿð<ð<0€€ïÀüþÿÀÿø|Ÿ‡à<ð?€ÿøÀÿÀøøÿ€ÿüÿÀ~Çà>øÿÀÿüðÿ€?ðøÿ€üÿà€þÏÿÀ?ðÿÁÿøÿðÿ?Àþ>ÿÃÿŸþ~ÿýÿÏÿÿÿßûÿùüÿðÿÏÿÿ~ÿïýþ~>ÿÃÿŸþ|ÿþÿïÿÿÿÿûÿùøÿðÿÏÿÿ~ÿïÿü>>>ÿÃÿßÿ|ÿþÿÿÿÿÿßûÿùøøÿïÿÿ~?ÿÿÿü~>>ðÇÿßÿüÿÿÿÿÿÿÿÿóÿùøÿøÿïÿÿþÿïÿøþ>>ÿÇÿßÿÿŸÿÿÿÿãÿÿÿƒÿùøÿøÿÿÿÿ?þÿïÿüþ>>ÿŸÏÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿñùÿøÿÿÿÿÿÿþþÁøþ>>ÿŸÏÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷ùøÿøÿÿÿÿÿÿþÿÿÁüþ?>ÿ‡ÿþÿÿÿÿÿÿÿÿÿÿÿ÷ùøÿøÿÿÿŸÿÿþÿÿÀÿþ?>`ðÿ‡ƒïþÿßüÿïÿûÿßÿóùøÿðãÿÿŸþüÿÿÀÿþ?>üáÁçþ?øü‡ð?ïøÇÿóçýáðøàÁ÷þüøÿÀþ>>ÿàüþûãçÿ?øü€ð€ ÃðÀà €€ñüø?àÿÀ?þ>>ÿàüÿûãçÿøü€ü>>ÿáüÿÿÿãçÿÿð€À`€ >>ÿáþÿ¿÷ãçßþçãÿøÿ‡œÀ>ø>>þþÃãçßàáÿŸ÷ÿýÿŽ?Ç¿Ïðü>>üþÃãçÿðùÿ?÷ÿýÿÏ?ç¿ßøÿü€>€üñÀ>çŽø>ÿÃÿ?Ããçÿ?ðøÿ?ÿß}÷Îç¿ßüÿÿüþøpÀ>?ƒÀÀÃþ?ûà>ÿƒßü>ÿãÿ?Ããçþ?ðøþ?ÿÏ=ãÏ?ç¿ÿüÿùøÿþüÿãÀÀÿçÿ?ÿà~ÿÿÃßü>ÿçÿ?Ããçÿ?À~?óÏ=ãÎ?ç¾?üßðÿŸÿþ|ÿÿýÿ€ø>?üøàÿÀ~ÿàü€ü>ÿçÀÁÿïÿ÷à~ÿïÇßü>ÿÇÿ?‡ãçß~~?÷Ÿ=ãÎï¾?üðÿßÿŸÿ>ÿÿÿÿÀø?þüðÿà~ÿðþ‡ÀÿøáÇþ€à ü>ÿ÷ÀáûïϼðþüãÇø>üÿŸÃãçß?ðÿ>w=ãÎç¾?øûàÿÿÿ¿ÿ}ÿÿÿÿÀøÿþüñÿàþÿàþ‡Àÿø?óïÿÁðø?øø?Ààx€þ>ó÷Àáñï|ðüøçÃà>øÿŸ‡ççßðùÿ<÷Ÿ=ÿÞ{ï¾>xÿðçÿÿ>ÿÃñÿÀü?Ÿþ?þ?û÷ðþÿÀÿ‡ÀÿÃø?ûïÿÁðþ?øþŸðùþ?Àÿ>à÷ÀñüÏç?çøþÿÏóÃà>øÿßÿÃÿÇÏ?øÿï¿÷Ï=ÿßç¾üÿüóÿþ}þãÿü¿ü?þ}ÿçñýøÿÀÿÃøûïÿÁð?þøþÿßðûÿÿàÿ>àçÀ?ñÿüçùüÿÏûÃÀ<øÿßÿƒÿÇßøÿÏ¿÷Ÿ=ÿžï<øÿüþ?‡þ~ÿáüþ?ßøÿ¾çùþÿ€ÿ‡ÀÏÇü?ÿãþáðÿ?øÿÿÿøÿÿÿàÿ>àÀ>øÿãÿ?÷ýþÿÏÿÃÀ>øÇÿ€ÿ‡?ðÿÃãÿ?çžø0~ÿü}ÿÃãÿüÿøÿüÇûÿÿÀÿÀ‡ü~ûáð?áð?~ÿÿÿøÿÿÿàÀ>ÀÀ}øãÿçûüÿÏÃÀ<øÇþ€Àø çà>ÿüþ~ÿÃãÿ€þ?ÿøÿþ?ÇýþÿÀÿ‡À‡þ>ÿáø?ñð¾ÿóþüÏûðÌ>àÀøÏòüÿþø?ÃÀ>`ðàüü}ÿÃãÿ€þÿøÿü?‡ÿþÿÀÿŸÀþûáðñð?ÿàÿóüø>Ïûðþ>À÷ÀÿûÇîx¿þø?ÃÀ<àÏþþ|ÿÃãÿÿ?ÿøûþ‡ÿþÿÀÿÏÀÿ?ûáð}ñðÿðóþ|Ïùðÿà÷Àÿýñÿü¿þøÃà>`>Ïþþ}ðãøÿ}ÿø?ûüÿÿøÿ߀ÿóáðÿóð>ÿðÿóüø>Ïóðþ>á÷ÁÿÿóïŸ÷¿¼ÿÏÃÀ<|ÿÿ¿¿?|øãð?ÿþÿü?ùþÿþøÿï‡Àƒßÿ¿óáøùðÿð?óþ|?Ïùðÿÿ÷ÿø?ÿçÿÿŸžÿÿÃà>|ÿ¿ÿ?þ}ÿÇÃÿ?ÿüÿÿþùü¿ÿÿÀÿÿ€ÿÿÃáðÿûð>üóüøÏóàü>ÿçÿð?ÿÇþ÷Ÿ<ÿïÃÀ<øÿþþ|ÿããÿÀ>þþøüß¾ÿà‡ïÿ€Ïÿÿ¾áðÿýðüßóþøÏûðÀ>ÿãÿðÃþ?óŽ ?çÁÀ>øþüü|ÿãÃÿÀ|ü>?üðüŸ=ÿàïÿ€ÿÿÿüáñÿÿÿ??àÿÿÿøÿÿÿà€>ƒþÀp>ðø?ðð|ðø<áÁÿÀ<¼øx|ÿàçÿÿþþáñøÿÀÿ?øÿÿßøÿÿàÀ> >áàãƒÃþþ?ðàÿÀ  À Ãþÿ|üáóðÿÀþøþßðûþÀ€>>óñ÷‡Ïÿÿðÿ€|þ<üàñð?ÿÀþ?øþ?ðñþ?À€>>óñ÷ÇïÿŸŸÿ?ðÿ€@Àÿ€øðøÀÀø>>óù÷ÏßÿŸ?¿àü>óýóçßß¿>ð>>óÿ÷ï¿ß>à>ñÿóÿ¿ß¿?ð>>óÿóÿ¿ß¾ðø~ÿǃ‡øøÀà1ÁÀðü>>óÿñÿ¿ÿ¿?ðüÿÿÏÇßüÿ‡Çà?øÿãÿþÿÇþ÷ðñð>>óÿñÿ?ß>Àþÿ€ÿïÇÿþÿÇçà?ÿøÿóÿÿÿçÿÿÿþùøð??à>óïñÿß¿þÿÿ€ÿïÇÿþÿïçà?ÿùÿãÿÿÿÿÿÿÿÿ?ÿøÿðàü€0áçÿÿÁÿÏÀ€ð>>óïñþ?ß??àÿÿÀÿÿçÿþÿ÷çð?ÿýÿóÿÿÿÿÿÿÿÿ¿ÿøÿøùþ?‡ðüñÿÿÿáÿÏÀÀÿøóçðþÿߟÿ?ðÿÿÀÿÿÇÿüÿÿçàüýÿóÿÿÿÿÿÿÿÿÿÿøÿðûÿÏûþùÿÿÿóÿïÀÁÿø>>óçðþÿŸÿøÿÿÀÿÿÇÿøÿÿçàüÿÿóóùÿÿÿŸïÿÿÿøÿðÿÿÿÿÿÿùÿÿÿ÷ÿÿÀ?Ãÿüóãð~ÿŸÿ?øÿÿÀÿïÇÿüóÿçàøÿ÷óóñÿÿÿÏÿÿýøÿàÿÿÿÿÿÿÿÿÿÿ÷ÿÿÀ?ãÿü>>óáð|þü?ðÿÿÀÿïçÿüóÿçàø÷óóøÿÿÿÏÿÿùøðÿÿÿÿÿÿ€ÿûüÿÿãÿÀ?ãðü>ñÀà<øð€ÿÿÀÿïçÿüóÿçàø÷óóùÿçÿŸÏÿ?ýøð?ÿÿÿÿÿÿ€ÿñøÿÿáÏÀçðø>ûÿÀÿïçÿüóÿçàøóóóùÿçÿŸÏÿ¿ÿøø?ÿÿÿÿÿÿ€ÿùøÿÿàÀ÷ñø>ýÿÌÿïïÿøóÿçàüçóóùÿÿÿßÏÿ¿ÿøÿð?ÿÿÿÿÿ€ÿñøÿÿàÀ÷óü>€ÿÿžûÿÿÿøÿÿïàþ?ã÷óùÿÿÿßÏÿÿÿøÿð?ÿÿÿÿÿÿ€ÿùøÿÿáÏÀÿóóü>pÀþÿ¾ûïÿßþÿ÷ÿà?þ?ÃÿóñûÿÿŸÿÿÿÿÿ?ÿÿÿÿÿÿ€ÿñøÿÿãÿÀÿûóü>ðÀþÿû÷ÿßþÿçÿà?ÿ?ÃÿãñûÿÿÏÿÿÿÿÀ~ÿÿÿÿÿÿ€ÿùøÿÿçÿøÿûùü>øÀü~>ûçÿŸþÿãÿÀÿÃÿãñûÿÿŸÏÿÿÿÿÀþÿÿÿÿÿÿ€ÿñøÿÿÿÿÿÿûÿüþ>øÀøñãÿŸþÿÃÿ€ÿÁðû÷ÿÿ¿ÿÿÀþÿÿÿÿÿÿ÷ñùÿÿÿïÿÿýÿüÿÿÿÿýÀÿÿÿÿÿÿÿÿÿÿÿÿ`>øÀþüÿÿ>>€€ðñãþ‡ÿùÿÀþÿÿÿÿÿÿ÷ñùÿóÿïÿðýÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüp>øÀ <øüðÿÀ|ùÿÏûÿóñøÿáÿÇÿðüÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿð>ðÀ8ðþ?‡ñþáðøÿÀÿƒþà8?øÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø>ðÀàxàüÀà >=ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿø>ðÀÿÿÿÿÿýóÿÿÿÿÿÿÿð>ðÀ>ÿà>ðÀø>ðÀüÀ >>ðÀüŸãð€x<?Àøx>ðÀüçøÿ>àø|€àøøÿðp@ >>ðÀøïüÿ¿?ðüþÿÀÿßøüüÿø8‡žxÿƒÿððÀðÏýÿ¿ñüýÿÀÿÿøüøÿø|<Ïþyÿ‡ÿŸð?>>ð€ðÿÀÏÿÿŸ€ùüþÿÀÿÿøþü€ø~>ÿïƒÿ}ÿïÿßø?€ðÀñÿßÀÿü€óüýÿÀÿÿøüûø?áøþ>ÿÿ‡þýÿÿÿßø>>ð€ñÿßàÇÿÿ€}ûüýÿ€þüþÿþÃþ>ÿÿÇÿ}ÿÿÇÿü€ðÀñÿßÀýÿ€;÷üÿÿ€Ýøþ?ÿü‡þ€ÿ>ûÿϾ}÷ÿ‡ÿƒü><ð€ñÿßÀýÿÏ€ÿüÿÿÀÁøÿ?ÿü‡ÿÀ¾ù÷Ï¿}ÿÿÿü€ðÀáÿŸüÿ€ïüÿÿÀÇðÿ~ÿøþÀÿþÿ÷ß>}ÿÿÿüÿ>>ð€ñÿß„~Ï€ïþÿÿÀïðÿ¾àÿÀþÿóÿ?}ÿßÿþÿ€ð€ñÿž€Ÿ?ÏÏ€?ßþÿ÷Á÷ÿàÿüÿÀ¿€ÿþÿãÿ>ýÿÿÿÿÿ><ð€ðÿÏÀÏÿÿÏ€?ïþÿ÷çûÿÀÿþÿàŸþÿáÿ>}ÿÿÿÿÿ€>ðÀðÿž<Àÿÿ€÷üÿÿÿßÿÿø?ÿÿÿÀàÿyþûáþ>ý÷ßÿƒÿÿ><à€ð>àÏÿÿ€ø|ø~ÿßÿÿø?ÿÿáðÿ€|þùñþ?ýóÿßïûïÿ€ðà ÀÀÇùÿ€ðxø|ÿŸÿÿø>ßûÁð‡ÿxÀøþùñþ?ÿùóÏÿßÿïÿ><ðpp8ðáüþ€ãð~€?ð8p<Ÿø>ÏûÁð‡ÿ|À|~ùðþ?ÿýóçÿÏÿçï€ÿ€þàð|x<øñÿÿÀÿã€Á@óÿà?ñàþxÀx~ñðü?ÿùãÇÿÏÿçÏ>>ÿÀ>ÿÿàð|<ð}ø?óÿÿ€ÿ¿÷çà?ÿÿà?@þ8€x>pð|ÿñáÁÿÇýÃÇÿà?ÿÿàð~>óðüÿÀð~<ðyü??£ÇŸ€€ø?çÁçà?çþü>áð€ðøð<ð}ü?ÇÞÀ€À<ÁçÏà<øø>>àðÿ€ðøð¼ð}ü?<ϼÀ€À<çà<ðü><àÀð`àxÿÀðÿÀðÜø|þ?óÿ¾À€þ?ÃÁçÏà?àøþŸ>ÿ‡þþðp?ûáÿÿ>àxóÀðÿàðüð}þ?óÿ¼À€ÿ?ççà?ððþŸ€`ü>ÿÃÿÇÿþ?øø?ûáÿÿàxóÀðàð{üð<ÿŸñÿ¾À€ÿ¿óÁçà?ðøþ??àðÿ?ÃøþŸ€?ðp>À@>ÿçÿçÿüüð?ûñÿÿàqÿàðÀðyüð=ïÿï¾À€þ?ãçà?àøü??áñÿ¿çüþŸ€?øxáø>€0ÿ÷ó÷ÿÏø~üð?ðóÿàyÿàðxðyüø<ç÷žÇžÀ€À<ÁçÏà<øðÿÇóñÿÿÿþüŸÏ€ùøÿ‡÷üÿçþÃüÿ€>áÿÁ÷ƒßü<ð<ùñðàóÿððxðxüøxççÇŸÀ€À<ÁçÏà<øðÿŸ?ç¾ÀóñÿÿÿþøŸÏ€?ùùÿ‡ÿþÿŸ÷ÿÿŸ÷ÿÿÀÁï÷ƒÿøð>üððáóÿððxðx|ÿùççûÇŸÿ€€À<ÁçÏà<øñÿß÷þà=÷ñüýÿüŸï€à?óùÿÏÿÿÿÿÿÿÿÿ÷ÿÿÀ>ÀO€÷ƒÿøøð?óüððÿçÀððàðx|ñãçûÇÿ€À?óÿÇÏýÿ¿øøñÿß÷þà?óñþýÿüøŸï€à?óùÿÏÿÿÿÿÿÿÿÿ÷ÿÿÀÀ€÷ÿüøø?ûþððÿç€ððððx¿øŒ0ñÿßÿóøñðÿÿÿþüŸÿ€ÀÀùÿ¿ÿÿóüøý÷ÙÿüÀïÿÃÿÿ¿ÿÿÿÏððàðø€ÿ€ñÿŸÿãø1ñðÿÿþøŸÿ€Àùÿÿ÷ÿóüøùçÃ÷þÁ÷ÿóÿÿ¿ûÿþÇððàðð€ÿ€?€ñÿß÷üÀyññÏÿÿ>Ÿ€ÀùÿÿÿÿóüøùçÇ÷þ?ÿñ÷çÿÿÿüÿÿÿÿÿÿÇñðàðÀ€ÿÀ€áÿÞÿþÀñóïûÿ~Ÿ€€€û÷ÿûÿ÷üùñçÏã¾>>?ÿÿ÷ÿÿÿÿþÿÿÿÿÿÃñðàðÿÀ>€ÿàÿ€àÿžïþàñóÿÿÿüŸ?€à€ùÿÿÿÿ÷üùñ÷ÿÇ>~?ÿÿãÿÿÿ¿þÿÿÿÿÿÁððàÿÁàðÿà|€‡àÿ€à?ïàáóÿÿïüŸ€à€ñÿÿÿÿÿÿùñ÷ÿÏ>|>?ÿÁÿ÷ÿþÿÿÿÿÿÿÁàðÿüÿðÿÁàðÿàx€ðÇÀ†À?àñÿ?Çüž€àùÿÁÿþÿÿóñÿÿÿþ|><>?€áþøÿçáüùÿ€`ÿþÿðÿÃÀðáðð€ð€€Ààþ?‡ðžàðÿïüÿ¿óáÿÿÿþü>x|À~øðÿ‡Àüø?ÿþÿð?ÿÃÃðÁðð€ð€`Ãøáàÿ¿ÿü|8üÀ>ðøÿÃûüÿÿþÙø<ÃÇ€ð€ùà€ð€ ð>Áà?÷üx>1ø€?ðøÿÃÿøÿà>€ð<ÃÇ€à€ùÿÀ€ð€àp8ðÀ?ÿÿ€çàÿøÿà>€ð<Ç€ðùÿð€ð€>à€?ÿÿÀÿøþà<ð8‡‡€àùÿø€ð€>àÀ>ÿÿàøÀ<à‡‡€ðyüü€ð€ü>ÀÀ|CþÀð>>xà€àyð<€ð€þƒÀà|ðÀð<xÀçððyà<€ðÀþ<ÿ>€àøð€àx>ð€>ÿðàùÀ<ƒà€þ8>ÿ€À€ýøø€àøðÿ€þ>ÿøð€yà€÷àÀü<xþÿ€8à>>€ÿðð?Àðàÿ€ÿþøÿðà€ñÀ<ÿÀ€ñþÿ?ðüÁø |þÿ€<€ð>€ÿðpÀðàÿÀÿÿø€ðáðð<€ÿ€ñÿÿ¿óþÿçüÿÿ?Ž=üø?Žþr?‡ð<|€ø>ÿ€ÿà`þÀÀÿ€>ÿþð€àçàøxþñÿÿ¿ûÿÿ÷þÿÿÿÏ?ÿøÏ>üÿ¿Ïü?˜€üÿ€?ÀüÿÀÀÿ€>?üð€ðÿàø€8ãýÿ¿ÿÿÿÿÿÿÿÿß?ÿøÿÿ>øÿÿßüÿžÿÿÏ¿Ïàø>ÿ?àü>|à€àÿÀ?àñüÿÿÿÿÿÿÿÿÿÿ?ÿøÿÿ¾üÿÿïþÿßÿï¿ÿøü?<?àx |à€ð€à€ãñÿ¾ûÿùÿŸþ|ÿÿ?þøÿÿ~øÿÿÿÿÿßÿïÿÿøü>?>xÀà<ññÿþýÿøÿŸü|ÿÿ?üøùÿ>üÿÿ¾ÿß~ï¿ÿüüxÀàããÿüûÿùÿŸø}ÿÿ?ðùóÿ>øøÿ>ÿŸ|ïÿÿüü>øÀàóãÿüÿÿùÿŸø|ÿÿ?ðùùÿ>øøÿ>ÿß>ÿ¿?üüxÀàããÿüÿÿÿÿÿø}ûÿÿðùûÿ~øøÿÿ?ÿß|ÿï¾üü>pÀÀññÿüÿÿ÷ÿøÿïÿðøÿÿþøøÿÿ¿ÿß~ÿï¾?üü0€áàÿ¼{ÿÿÇþøÿïÿðøÿÿþøøÿÿ?ÿßÿï¾?øü>ÀÀ89þÃüø?Ïýðüïþøøÿ?ÿß?ÿÿ¾?üüøàpüàþ?‡üøøï>ÿŸ?ÿï¾øø>x~üpxæ?ç¾ùüÿÿÿûð x>ñøÿÿÿÿÿÿÿÿ€?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€0Áøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿÿùð çìÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø0ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿ÿþƒÏÃþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÀxÀ€?ÿï8ÿüàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÀü>àÿÀãüøpÿÀÿ€àü?àÿÃá÷þ?üx?ÿàÿÀ€áü?àÿóá÷ÿþü?ÿàÿÀÀáü?àÿóá÷ÿþþ?ÿàÿÀÀáü?àóûá÷ÿþþÿÀÿÀÀñü?àñûá÷ßü?ÿ|ü?ãøüÀ€óüŸàðûáÿßøÿü>ð?ß÷ýÿà?Àûüßàðûáÿÿøÿü>ÿÿÿÿÿ?ðàÿü?ÿàðûá÷ÿøÿü>ÿÿÿÿÿÿÿðÿðÿüÿààÿáïÿøÿü~ÿÿÿÿÿÿÿðùøÿü?ÿààûá÷ÿøÿü>ÿÿÿçÿÿðÿ€ðøÿüÿàá÷Ãïñø?ûü~þ~ÿÇÿ¿ðþÿÁðxÿ|à=ÿá€óóãïÀüùü>à>ÿÇÿ¿ðÿÿÀÿÿÀðx|àyûç€ÿóÿï€ÿþñü~à|ÿÇÿÿðÿþðÿ€ÿÀðx?|à9ûçÀÿáÿïÀþøü>à~?ÿÃÿÿðÿÿÿøÿÀ<€øø8à8óç€ÿÁÿÏ€üðü|à|?ÿÃÿÿð€<ð<ÿøÿÀ<ÿð Àÿ€ÿ‡€øx|>à<óÁÿ¿ðƒÀ<à<ð|ƒà0<?à>àp8<À8ãÿ?à‡ÀÀ|à>><xàð<||à|€ÇÀà€pÇà|€à<><<àð<<ÿ€ÿð‡ÇÃðxÃüÿÿ?ÿƒøÿü~€|<<xÀð8xÿ€ÿøÏŸóûùÿ?÷þÿÿ¿ÿçüÿÏüÿ€€|<<üààx|ÿÁð|Ï¿÷ÿûÿ?ÿþÿÿ¿ÿïýÿßùÿ€ÿ8ðø|€ø?ã?ÿ‡ñüÿÿáà|ï¿ûûÿÿ€?ÿÿÿÿßÿçþÿßýÿÀÿ¼øðÿÃÿàø÷óÇ¿ÿÏùþÿÀÿÀñà<€ÿ>ûçÿÿ€|ÿŸûï¼ûçýçþûÿ€ÿyðàÿÇÿà?à?ÿÿó?ÿßýÿÿÀÿÀãÀ<ø€€xñðàÿ>}ãóÿ€|/ùçþyçÿóþ=ÿÀÿüðàÿÇÿð€?ÿƒÿûǾÿÏýÿÿÀÿ€ñàø€€ø÷ððÿ€þ|{çÇÿ€|óç¼ùïýçüÿ€ÏxðÀ<ÿðþ?ÿ‡ü<óßýñãÀxãÀ<ü€€ÀüÿððÿÀø?àøÁÏü~€þ{ϼñÿáãà<Àÿøüÿžßÿ¿Çüüøþÿçñÿÿÿÿÿÿþãÿÿÿïÿ߃ÿàü?ñÿÃÿ?÷üñç¼ùïýãßùÿ€ßyð<ÿðÿûßxóßýá÷Àx€àüÿŸÿÏ€ÿ¿÷þþyÿ?ÿ÷ýÿ€àÿÿÿÿÿóïÿÿïÿÿ€Ãÿð|ñûÁÿáüpãœxçüãÏøÿ€ÿ¿ðÿüÿûÿ¼ñïýàÿÀ8?ÀüÿÿŸÿï€ÿÿ÷þþûÿÿÿÿýÿÀÿŸ÷þÿŸûãñ÷ïÇ߇ãðxÀó€ü€ð€>ÿ?ðÿøÿóÿ8óÇùàÿ€þüùÿŸï€ÿÿÿþÿ{ÿÿÿÿýÿÀÿ€Ÿóþßÿãñÿïƒß€Çáð <ÿðÿøÿðÿpÃðà?€üüùÿŸÿ€ßÿÿþ¿ÿïÿ÷ïýÿÀÿ€ŸóüÿŸÿãáÿÿŸÿÇÃàpðþùÿŸÿÿ€ÏÿÿþŸÿçý÷Ïý÷àÿ€ßóþŸÿáñÿÿçÇðÀ|ùÿ¿ÿÿ€Ïÿ÷þŸÿÀù÷Çý÷àÿŸóüÿŸÿãñÿÿ€ÿïÇð üÿÿÿï€ÏÿÿÿŸûçý÷Çÿ÷ààßóþßÿáñÿÿßÿ÷Çðüÿÿÿÿÿÿÿþÿûÿÿ÷ÏýçÀàÿ÷þÿßßãñóÿ‡ÿÿ÷Ãðü?÷ÿÿï€ÿÿÿþÿûÿÿ÷Ïý÷ààÿÿÿÿÿßáñóÿÇÿƒÿ÷ãðð?÷þÿïÿ¿÷þþûÿÿ÷Ïý÷ÀàþÿÿÿÿÏãñÿÿÿÿÿÿÿÿððóþïÿ¿çüüùÿ?÷Ïý÷ÀàþÿŸ÷þÇãñÿÿÿßÿýûÿððÿÃøøpþã‡ðãÀÀüóüÇãáÿçÿßÿÀùÿðð@àA€€páüÃááÿÃÿŸÿÀùÿðàÀÀÿÿÿ€xà|ðaÀ €ÿàø€Ààÿàø€€àð8÷ÀøÀ€Ààáàxï€ð Àüà?<ÿÿðñð|Ãï„àþáÿàÿÀÿÿà|ÿÿøñáøü`Çÿßçð?ÿãÿðÿÿ€ÿþàÿøÿýøýóþÿÿ?À?÷ÿÿïü€?ÿÃÿøÿÿÌ8ÿÿ?àÿ`A„ãÀø0€ï@|ýçÿÿÿÀ?ÿÿÿÿü?€ÿƒÿøÿÿüxð><àÿñãŸÿáü?À|ÿ÷ÿÿÿÿà?ûÿßÿþ?€<sàýçßÿçþÿÿàøßÿ|üÿð|{ïŸþ?À<|x>ðÿÞ|à>>àýãß}÷ÿ|ðøßÿxñÿà|ûÏüÀ8ø>x|à>ç¼xÀ<<<à=çÞyÿÿøñððÏÿ|øÿð|{ïŸ>Àø>ü>ãÞ|<<>à=ãÞ<÷ÿxxð?ðÇÿŸ|ðûàóÏü{Àà|ø<ç¾xøþà=çÞyÿþðñðÀÃ÷ÿ~øÿà?ûïŸþyààxü|ãÞ|ð?ÿàÿààÿ€=ãÞ<÷xxðÿÃ÷þðÿà?óÏŸüûàÃðüðÿ¿øà?ÿÇÿðà?ÿ€=ïžy÷þxàøÁóü?ðàáÇŽøà‡ðx~ðÿßüàÿÇÿðà?ÿ€=ÿÞ<÷þx?àð€àø>ð?€àÿààxàÿøÀ<ÿðà?ÿ€<ÿžyóüx?Ààÿðàxà‡øÀÿðàÿÎ8ðü8Ààÿð>ƒÀxÀ€<Ààÿøùð>‡ÀxÀ€àÿüñø~¿€ÿþ€<àÿøùüÿ€ÿüàøñüÿÿøðü?ÿÿð>>||8ÿÿÿÿÿÿÿøƒÀ €ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀ8ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÌÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàxÜðÿ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ‡ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿöD?üÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿLpC€@ g€88€ð÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿ?ãýÿ¿ÿÿÿÿÿÿ‚ ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀ7ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûñÿÿ0ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀ~ ?×ü@ÿÿÿÿÿÿÿÿÿÿÿÿýÿ÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀ??ÿÿÿÿÿÿÿ€àÿðÿøÿøÿüàÿüðÿüÿøüÿüÿüþÿüÿüÿÿüÿü?ÿ€ÿ€ÿüÿþÿ€ÿàÿøÿþÿ€ÿàÿøÿþÿÀÿðÿðÿþÿÿÀÿðÿàÿþÿÀÿø?€ÿþÿÿÀÿøÿüÿÀÿøÿøÿ€ÿøÿð?ÿ€ÿøàÿÿð?ÀþÿðøÿàðÿÀÿ€&ð0ÿøÿÿðþàÿÃþÿÿø|ÿþÿÿƒüÿÿðÿÿãÿÿÿüüÿþÿÿÃýþÿ€ÿü€ÿßÿóþÿÿÿ~ÿþ?þÿáü~ÿ€þÏáÿ€€ÿàøð‡àÿü€ÿ¿ÿñþÿÿÿþÿþ àÏáü|ÿÀÿïûÿðàÿà?üüÇøÿüÀÿßÿðü|>ÿϾàƒðþ|ÿÀÿ?ïÿÿøðÿàÿü?þÏðÿüÀ??¾ýðø|<þ¾àñþxÿÀ?ÿçûÿüøÿàÿü?ÿçø÷|À?ž|ðø|>€ÿϾàøÿ|ÿ€ðÏóÿüøÿÿüÿãàïü?À|¼ùððx<ÿ>à?ñÿx~ðÇàü~ø|ýü~?‡óàÿü?à|ž}ðx|>ÿžà?ø÷ü~ðÏÁø~øüðøüóàÿ¸=àøñçø~ðÏÀø~ü~øxüÇûðÿ€=ð||ð||?þç€àøóü~ðÏ€øþü|ÿ±øÏÿàÿ}ðøxø|?üï€à?ñóü~ðÏ€ýþü|ÿàøÇÿàÿ€<ð||x|?üÿÀ€àøñü|ðÿ€ÿüü|ñøÏÿàÿð|€xø|?üÿÀàðñø~ðÿ€ÿüþ~?øøÇ¿àÿ€ð|À|||>~ÿÀàƒðñü|ðÿ€ÿðþ|ÿýøÏŸàïÿð~Àxø|>>ÿÀàÇáðø~ðÿ€ÿðþ|ñüøÇŸàçø?À||ü>>Ãà€ÿÿáø||ðÿÿøþ|ð~üÏààüø?ƒüø?ÇðÿðÿÿÃøx~ðÿùøÿ|ø~þÇÏàðøüÿ‡ÿ€øÿŸßçøÿð?ÿƒÿƒü8|ðþùø?ÿÿøüþ?àüøþÿÿ€?ðÿŸŸÇðÿð?ÿÿøÿŸÿþüü?ÿ‡ÿãÿüÿÇàþøÿþÿ€àÿÃððöü€ÿÿ?ÿþüþþ?Ïÿãÿü?ÿÇàþøþüÿ€|ÿÿÿ€þþþÿÏÿóÿüþãàüð<ðÿÿ?ÿ€üþ~ÿÏÿãÿðüÃÀÿþ?ÿ<þ>~ÇÿáÿàøÀÀ€€à.øÿð?€ÿø€þðÿÀ?üÿüÿøÿþÀ?ÿ>?€ðÿàüÿþÿøÿþ?À?ÿàøÿðÿþÿÿü?ÿ€À?ÿ?ààÿÿððÿñøü??ÿü<ÿÀ|€ü¿ÿïðÿøÿÿøøàùø|€|>>€ÿÀ<ÿüÿÿÿñÿüÿóø|><øàóð|€x<<€çÀ<`ÿüÿÿÿñÿüÿàüüø~?ÿüàóð<À|>>ÀÇÀ?øÿü?ÿŸßáÿøŸxÿüÿÿ€øÿóÀ8Àü<€À?üÿøþïÁñø|ÿþ?ƒÿÀüÿóàÀü€À?þþp~~<üÿãðøÿþ??ÿÀ¼ÿãÀÀø?ÿÀ?ÿúýüÿÿÿüÿãàøÿ‡ÿà¾ÿóàÀüþÀÿðÿþÿÿÿ€øÿÇÀð?¾ÿàþáûà€x~?øÀÿøÿþÿÀøÿ‡À€?ð‡ÿðþààÀ<ÀÀÿüÿþ??ÿÀðþ€ÿÀ>ÿàþàà>€x<Àÿþÿ‡ÿàðþÿÿàÿà}ð>€<Àpþ¾ÿàøü><øÀ>?ï€ÿàyð|?€x>À~?ÿðøü>>ðà>ÿãààøøüÿ|€À?>>ÿàüüü>àð>ÿÇÿà?ÇÿøøÿþÿþÿÀÀ~>>?ÿàü|ü>àpðÿÀÿÃÿàÇÿð?øÿüÿþÿÀÀü~à|ÿÀþ|ø>ÿüðÿÀÿÃÿÀÇÿà?àÿðÿø€€ø|ð~ÿÇÀ?ÿ|þ~ÿüøÿÀÿÀÿ€>Ãÿ€À!àÿðøüðÿÿ‡ÿÀÿÃÿƒÿþÿüð€~ÿàøðÿÀÿÇÿÀÿÇÿƒÿþÿøðÿÀððÿÀÿÃÿÀÿÇÿƒÿüðþððÿÀÿÿ€ÿ?Ãÿ€ÿüðpÿàðÿ€~0ÿàÿÀðàÿðÀþàðÀÀÀÁðÿüðþÿþþÀüÿ€?àçûÿüÿøþÿþÿ€?ðþÿÀ?øçýÿüÿøÿÿþà|à?þøÿþÿ€ÿøÿÿàÿüçùÿøðþÿþ?ÀøÿÀøøþÿüÿ€ÿÿÿàÿøÿƒÿðÿþãøÐàüÿÿÿàüÿ€ðþûþÿÿ?þÿÿÿ€Ïáùü?ÿ‡çñøþÃà€€ðùþÿð?þÿÀÿø?ÿùÿÿ?þÿÀÿÿ€Ãñð|?ÏÁûø~ãàÀ€ðùþÿøÿÿáÿü?ÿùþ?þüÿ€ÿÿ€óà|~ßûð~ãÀ€€àûìÿü~ÿãÿüÿ€ùþôüÿÿÀóà>|ÿ€ûð?ãÀ€€ðûààüüŸÇóðþþ€ñøààü>o€óà>üÿ€ÿàãÀ€€ðÿàà|üŸƒóð~þÀùøðàü>ÿÀñà>üÿ€ÿàãÀ€€ðÿàà|ø¿ƒÿàüÀùðààü>÷€Ãñð~üÿÿà÷€€€ðÿàà|ü¿ÿà?üÀùøðàü?û÷ñÿþüÿ€à÷€€Áð<àà||¿ÿà?øÀýðààü?øÿðÿþ|ÿ€ÿàÿ€€ƒáð|{îñü¿¿ÿà?üÀÿððàü?øÿðþ|ÿ€ÿð?ÿ€€Ãáð|yÏÿü?ÿ¿ÿà?øÀàààpü ?øÿð?ü~ïûð>ÿ€ƒáð|øÿü?ÿ¿ÿà?üÀàààðü?ÿÿàü~ÏÁûø>ÿ€ƒáð|øÿüÿ¿ÿà?üÀàààøü>>ÿ€à|Ïáñø~?üŸãðøü>üÿŸÿðüÀàðàøü?>Ààü?ŸÇóñÿü~ÿþÿïÿùÿþ üƒ÷ðþþÀÀàáøü?>ÀÀø?ÿ‡ÿàÿø~ÿþÿÿÿÿÿÿþøÇóðþÿ?€?Àðáøü?>ÀÀðÿÿÀø~ÿþÿÿÏÿÿÿþø>ÿãÿüÿ€?ÀÿÿÿÿÿÀ?€ðþÿ€?ð<ÿüÿÿóÿøø~ÿãÿø?ÿ?Àÿ¿ÿÿÿÿÿÿ€€àüÿÀðüÿÀÿø?þ?€ÿ¿ÿÿÿÿÿÿ€ÿ?Àààüÿ€ÿðþ?€ÿ?ÿÿÿÿÿÿ€þ€?Àøÿ?Àø?ÿ?ÿ÷ÿÿÿÿøÿ€à|€àïÇÿøÿà|ÿÀ€þ€|ÿÿÿÿÿÿÿÿÿÿÿÿþù0ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿòxÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ'ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿï˜ €xóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûð8ûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ=/ãÅÒÀ 0@;Àþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ1ŽÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÀqøÿÿÿÿÿÿÿÿÿÏÿÿÿÿÿöñÿÏÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÀ€ÀÀð0øü<ÃþÀ<þ`?€`?þ?þ~çÇÿŸ>à|ÿðÿãáðÿÀ>ƒÁüð|?þ?ÿçÇÿŸ¾àþ?ÿñÿóáøÿà~‡Ãÿð>?ãÿ€ü€‡ðÀ`€?ÿÿÿïÏÿß?àþÿûÿóñøÿàÿÇïÿƒø>óÿ€ÿ‡Àƒÿÿðûÿ‡ÿx<ÿÀ?ÿÿ?ÿïßÿß>áÿÿóÿûñðÿðÿÇïÿƒø>ÿÿÀÿÀÃÿÿðûÿÇÿü>ÿàüÿï߇߿áÿùûñÿýøÿðÿçÿÿÃü>ÿÿ€ÿ߇ÀÃÿÿøÿÿïÿü?ÿðøÀà~ðÀü>üÿïߟ>ãÿá÷áÿýðûñÿçߟÇü~ÿÿÿßÀÇÿÿùÿÿïÿüÿðþàð|ÿ€ÿãÿø8àpàqÿ€ €?üÿŸçß>áÿƒá÷àÿÿðÿñÿÿÿ‡Çü>|ÿàÏÿ‡Àçÿóüûÿÿþü~ÿðÿðø}ÿÀÿÃçÿü|?øùð{ÿÀ?ð>Çøð?ðÿðw‡ àø>øÿ¿ï¿>ÃÿãÿÀÿÿðÿãÿÿÿü>ýÿþ‡ÿÀïÿýÿãÿÀüÿðÿðøÿÿÀÿãïÿßþ|øùðûÿÀ?ð?ƒÏüü?øÿáÿÇùÿÏàÿçþ>üÿÿçß>ãÿƒá÷ÀÿÿðÿãÿÏÿÿþ>ûÿƒÿ‡Àïßûÿûáÿü|>ÿðÿðüû÷àÿñÿÿßþ|üýüûÿÀ?ü?Çÿþþ?øÿñÿïÿÿïŸðÿ÷‡ÿŸ€>üÿÿ￟>Çÿ‡ãÿÀÿÿðÿçÿŸÿþþ>ÿ÷ÿ‡ÿÀÿ¿ûÿÿáÿþüÿðÏø}ûçàçó߇ßþ|ü|ùüûÿ€üÏÿü?þøÿùÿßýÿÏ?ðÿïÿŸ>üÿÿçßß>çÿÃá÷àÿÿðÿ÷ÿÏÿÿŸÿ>óÿ€ƒÿ‡ÀÿŸÿÿûáÿÿ|>ÿðÏø?óûàáøŸÿ|ø<ùþûà>|ƒïž>?>ûýÿ>ø‡‡ß‡€?ÿþ?ÿïŸß>ÏÿÃá÷Áÿßðÿ÷ÿßÿÿ¿ÿ>÷ÿ‡ÿÀÿ?ûÿÿÁÿþø}ÿàߟø?óÿ€Áð?ÿ>}ð<ùþûþ||ÿƒÿ><>|ø}à>>?ðŸßÏ€?ÿ?ÿÿçÏÿß?óïÿãáóûûïðùÿÿï¿ßÿÿ¾|ûàÃÿ‡Àÿùÿûáÿþ|>ÿðÿŸ|áÿÀàø?ïþ|ð|ùÿ{ÿ€>üÿÁÿì¿àø<ðŒÏøžßç€?þ?þ{ûïÿŸ?ÿßÏãáóÿÿÇðÿÿÿÿ¿ßŸÿÿ¾|ÿà߀ÿ?ïÿãÿÀø}ÿðÿ?üÁÿÀÁð>ÿüyñüûÿûÿ€ø÷Áþø>ðð}ÿŸð>?Ïx¾ßï€?þþ}ûçÇÿŸ?ûÿƒóáñÿóãøÿÿÃÿïÿÿÿÿ|ûÿ€ÿïÿÀÿñ÷ûã÷À|~ùðÿ?þÁÿààø?ïþ|øþùÿûÿ€?øóàþþ¿ðø<ÿüÿ<žß÷€?øøxóLJÿ?ÿßãáñÿçÃðÿÿƒÿÏÿþþüÿÿ€ÿÏÿ€þ?ÿãÿÿïÿÿýûðüþƒßàáð>ÿþ}ñüùïûÿñÿàüü>ðð=ÿü>?ÿ|¼ßÿààþùÏáàðÃáðÿïÿ‡Çÿ¾þ|{ÿÀÿÇÿ€~ÿñûÿçÿÿüùðà?ÿƒãàáøï|ø~ù÷ûà?áÿà|þ¾x<ÿþÿþžþÿ€@€àÿŽïƒþ<¾xóÿ€ÿÿ|?ÿáûÿÇÿ?øùðÀÿ‡çàïðß>|ø|ùçûà<ÿàø<>|ð}à><ÿ?þ¾Þ€ü 1ÿ€þþ<ÿðùÿÇÿŸøùðÀ|ÃÿàÿðÿÏ|þyñûÿÀ>ÿð|><x}ð?ÿŸÞ?€xøÀqþþàpàÀøƒÿÀÿàÿŸ>|üùáûÿÀ<Áðx?~þðÿùù>>Àø|þþ?øøÿÿþ|ÿÏ€€`ÿÿþxüqàóÿ€<€ðxøü?øÿñÿßü<x‡ÿ€0À`pÿ€p8øøøàÿÏü8ƒÿ€àø?ÀàÿðÿþÿþÿþÿþÀ?Àüþ€ü?ðÿñÿÃÿ€üàx<ààqÿ€À?üÿùÿóÿÇÿ€üàø|ñðûÿÀøð?€€øÿýÿùÿ÷ÿ€þðü~ÿùðÿÿÀþüðÿðáàñàÿ‡ÿÿÀ@À ÿÿÿûÿ÷ÿþðü}ÿýðûÿÀ?þ?þÿøÿðÿóàóáÿ‡ßÿÿÀøð8ƒ€~üÿðÿóÿÿÿðþÿýðÿÿÀ?ÿÿüÿðÿûðûóÿï‡ÿÿÿàþ?ü~ïýÿÿüø8ü@À?Àðàÿáÿà¾ðþðÿðÿÿÿÿÿÿýÿàÿûáóçÿÿ‡ÿÿÿÀ?þþþïÿÿÿüüøŸýàÿÿ?€ÿƒÇüùà€@øà€ø?ààÿÿÿøÿÿððÿþþ?þÿÿÀýÿðû÷ÿÿÇÿÿÿÀ?ÿÿïÿÿÿþþ|ßÿøÿÀáÿãá÷ÿ‡ÿýðÿãàóÿÿÿïÏð€p?þÀðààÿÿþ?øÿÿàðûÿ€~ü?üøðûáóïçÿ‡ÿÿÿÿÿÿÿÿÿÿü?þü¿ÿðÿÿ€ÿãÿçáçÿ¿ÿóÿ÷á÷ÿÿÿ>ïßøÀðÿ‡ÿ€ðàïþ€Ààÿøààûÿÿ?üÿÿð?ðÿÀ~üü?ÿÀð{ñû÷ãïÇß°~þÿïÿÿÿü?ÿüßÿüÿÿÀÿóÿÿñ÷ÿÇßýóÿûð÷ÿ€ÿÏÿÿÃÿüÀùÿÇÿχÀþðÿÿ?ÿÀøÿ€üÿ€ð?ààÿÿÿüÿÿàðÿÿ€|øü?ÿÀãóáóïÁÏÿÿø|~øÿÿ¿>?~?ü¿ûüûÿÿ÷á÷ñïßÏŸùóãÿñÿÿ€ÿßþ?ï‡ßüÀóÿÏÿ߇€þðÿÿþÿ€üÿ€?üÿ€øððÿþÿþÿÿð?ðûÿ€~üü?ÿàóÿðûÿÀÿßü~~üÿŸï¿?ø~üßþøüðÿÀûù÷ÃçÃáóàûù÷ÇÀÇïÀ÷Çßþàû÷ÿ‡ïÇÀÿøÿþÿ‡À?þÿ€?ÿÿ€øÿðûá÷ÀŸþûÿðÿðûÿ|øü?ÿÀãûáóï€ÿÿü||øÿ¿ÿþ>?øü üŸûþøøà÷Àÿýïƒïƒá÷Àÿýÿç€Ãï€>çÇž>?àóãßÿç€ø€ÿÿŽÿ~ÿ?ÿÿÿýÿ÷ÿÿÿÿùÿùÿøûà~üü?ÿÀóÿðûÿÁïÿßü~~üÿÿïÿ?ü||ßýÿøüàÀÿÿ÷Ã÷Ãá÷Àÿ÷ÿÃÿüãçŸ>?ðûùßï÷À‡ø‡€x‡Ÿ~?€>|€>ÿýÿûÿ÷ÿ€ÿÿÿùýÿýÿûÿ€ü?|~øñÿáóïÃÿÿÿð~|øÿÿÿþ>?øüüŸûÿøüà€ÿÿïƒïƒÁ÷Àÿÿ÷ÿƒïü>ãïü}ðóÿÿ÷€xüðü|ü|øÿñÿçÿ€ÿü?øþÿüÿûÿÀ?ÿÿÿþÿÀøÿñû÷ãÿÇ߀~~üÿÿïü?ø||ßýÿøüàÀÿÿ÷Á÷Ãá÷Àÿóÿ€ÁÿþñïŸü<øùÿßïÿÀ<‡þpŸü€|ü€üðÿáÿÇÿ€ÿøøüÿüÿóÿÀ?ÿþýÿàÿûÿóçÿÿ‡ßü~?ü?ÿÿïð?|üŸ!ïøüàÿÀÿßçƒïƒá÷Àûß÷ÿ€Ãïüãÿüøðÿþÿÿ€Ÿ<üðøþðÿà?Áÿƒÿ€þøø|üóÿÀÿ?þüÿðÿýÿóóÿÿ‡ÿþ~?ÿÿÿÿÿ€€~üß÷ø|ðÿÀûÏ÷ÃçÃáóàûï÷ŸÀÃïÐáÿþüù¿ÿïÀŸþ‡þ0øÁÿ€ðƒÿ€€p8ø?ÁÿÀþüøÿðÿùÿããÿï‡ßþ~?ÿþÿûï€??üÿÿïŸù÷øüñÿá÷ÏçÏσáóáûÏÿ‡ÀÃï€áþ<ÿüóÇÿï?€þ€<ðƒÿ€ðƒÿÀ€€€üø?ðÿðøÿááÿχßþ>ÿ?þ}ûÿ€?þ?ÿÿßÿóü|ýûÿóÇ÷ÿçÃáóÿûÇ÷ÏÀÏï€ðþ>ÿüûãï‡ï?ÀŸÿ€|øÁÿÀðÿÀ ÀÀ?Àÿü<üü}ûï€>þþÿßÿñøüÿóÿ÷Ç÷ÿƒáñÿóÃ÷ÿ€ÿÏþûàü=ùüó÷ïÿ߀?ÿ€x?ÿðÿðð€Ãÿñð€Àüøxñç€þüÿßÿðø|ÿñÿãÃ÷ÿ‡Ãáðÿóã÷ÿ€ÿÏÿýà~ð>ûÿçÿÏÀÿ>‡þøÿñÿüøÀãÿøø€àüø?çýàøxàƒÁçÿƒÁàÃÁóÿÿÿûà|à>ùÿÇÿ€þ|ÿðÿãÿüø€Ãÿøø€Àà°à08?À€Aü€À`?Àñþþÿùà<àøÿÿÀü<‡ÿðÁÿüü€Áÿøü€À >xàþÀÿøüÁÿð|ÀÀüpÀ~?À€?þ€?þ€€?þ€?þ€ø~øþ€øþðü€øø€ðð€?À?À>~€~À~À>à~À>à~À>à>À>à€~ÿßðàðþ€€À>ÿÿüáøýÿŸøáÿŸüÿ€À>ÿÿüãùÿÿÿøÿóÿÿÿÿÀÀÀ€p>ÿÿþãýÿÿÿýÿûÿÿÿÿàÀðøçüø?àxÿ¸|þÀ0>>ÿÿþ?ãÿÿÿÿÿÿûÿÿÿÿàÀð>?üÿÿ‡Çÿ?øðûÿü=ÿ‡ÿùÿàø?ûáÿ‡ƒÀàpüp00@x>ÿÿþ?óÿÿÿÿÿÿÿÿÿÿÿðàð??þÿÿÇÏÿ¿üüÿþÿÏÿÿÿðü?ÿñÿÇÃàðxÿx<ÇÿÿÀàxÿŸøüpø8>?þ?óÿÿÿÿÿùÿÿÿÿÿàÀà>þÿÿÇßÿ¿øü{ÿþýÿßÿŸÿÿáü?ûçÿçÃàðð?ÿø<ÿçÿÿáàðÿƒÿƒ¿ÿÿðøøÀx?þ?óÿÿÿÿÿøÿÿçóÿààð>~>ÿÏçßß¿øþ{ÿ¿ýÿÿÏÏþÿáüû÷ÿ÷áàøx?‡ÿx>ÿçÿÿñðøÿçÿÏÃßýÿ€ø?üøà|>~?üóÿÿÿÿÿðÿÿçóÿÀÀà>ü>øçþ¾x~sà?ùóÿß>?üÃçÃ÷óàøð€øø<ÿçþÿùàðÿïÇÏßùÿÁø?øðà|??üûÿÿÿÿÿðÿÿçóÿààð>üÿ÷ß¿ð|>þñóÿïþÃçÁÿùàüx€øx>ù÷ÀðýðøÁïƒïãÃáçÁüððÀð>>~?üÿûÿûÿÿÿðÿÿÇñÿðÀà>øÿÏÿþ?ðx>ÿá÷þïþþÃï÷ûàþx€ðø<ñï€ð}àðïïãƒÁãÃü€áÿü?Ïüÿ‡ñáü?þÿýÿÿÿÿÿðÿÿçñÿðÀð>üÿïÿß?ø|ÿ‡àÿÿïþÿÁç€ÿýàÿxûÀøx<û÷þð<àøÀïÿóÃÁãÃþÀáÿþ?çþÿÇøãþ?~?þÿÿÿÿÿÿóùÿÿçóÿðÀà>ø ÿÏÿþ?ðø>ÿáÿþÿüßÃï€÷ÿàÿøóÀðø<ÿçþð}àð€ïûÃÁÿ‡þ€ãÿþÿïþÿÏùçþ??ÿÿÿÿÿÿÿÃÿÿÿçóÿðàð>üÿÏß¿ð|?ÿðÿÿïþÿÁç€ÿÿàïøóàøx<ÿçþð=àxÀÿÿÃÁÿ‡ÞÀáÿþùïþÿïüçÿ>~?ÿÿÿÿÿÿƒÿÿ÷çóÿðÀà>ü>ø?ÿ¾x>àùÿ?ÿ~ÿ‡Ãï÷Ÿàïùÿàðø<ÿçüð=àð€ïÃÁÿ‡ß€ÁçžñïóÏýçÿ?~?ÿÿÿûÿÿÿÿû÷çóÿðàð>~?ø¿ßþ|>à?ýøïÿ‡ÁçÀÿßà÷ùÿðøx<ûç€ð=ðxÀïÿ¿ÃÁÿÇÿÀáçŽð÷ñçü÷ÿ>>?øÿûûÿÿÿó÷çóÿàÀÿ¾þÿïßÿ¿øüÿ~ýðÏÿÇÃçá÷Ïàãûÿðøx<ñç€ð}ðøÁïïÃÁãÏÿ‡€ÁçžðÿñÏüçþ?<?ðñùÿŸ€ñóãñÿààÿþ?þÿÿÏÿ¿üüÿþðÿχÃÁãÿ÷Çàñûÿðø|<ñ÷ÀðøðøÁçƒïÃÁãÏÿƒÀáçžñÿñïü÷þ?àpÀáÃàÿ€àÿ¾?üÿÿÏÿ?üøÿüðÿŸ>ÇÃãÿçÇàáûÀøðüñçÿÿøÿðÿçÿÏÃÁãßï‡Àáçžùïñÿ|ç?>àÿžøÿÇÿ?üøÿü?ðÿãÁáÿÇÃàðûÀxø?øð÷ÿÿøÿðÿãÿÇÃÁãÞÇÀáçïñïü÷ÿ?àÿð?çüø?àÿøðþÃÁàÿƒƒààó€xðøpçÿÿààÿÃÿÃÁãÞÇÀáçŸÏñïýãþ?àp€>€ÀÀ10`àpãÿÿÀ?ÀÿÿÃÁãÜÀñç?Çñïüãþ?à€ø  @ÀÀø>?àø~?Àx|?à>à?À?Àøø?Àÿãÿü<à?ÀÿóÿÏÿ~ÿð?ðð<àÿóÿßÿ?~?ÿø?ü?øÿ?ýã€à|ð?€@Àÿûÿߟÿ¿ÿø?ÿ?ÿÿÿÿ÷áð~þðÿãáðÀñÿÿß?ÿ¿?ÿð>?ÿÿÿÿÿ÷ãðþ?ÿñÿ÷áðÀààÿïß¿¿Ÿü??ÿÿÿÿÿÿ÷ñðÿÿûÿûñøÀðü?ðàÿþðÿÀÀÿÿß>>þÿÀ>?ÿÿ÷ÿÿÿ÷ûñÿÿ÷ÿÿûøÀð??þøÿðÿÿðÿààÿß¾ÿÿà??ÿççã÷ýñÿùÿñÿýøÀø?¿ÿüÿøÿÿðÿðÀÿÿŸ~>þÿà>?ÿ÷ÿÇÃ÷ÿóÿá÷áÿýðÀøÿüÿðÿÿðÿðàÿß¾?Ÿÿÿð?ÿûÿ‡á÷ÿóÿƒñÿàÿÿøàü¿ÿÿÿð<øàøÀÿÿŸ~¾þÿà>?ÿûÿÇÃ÷ÿóÿƒá÷ÀÿÿðÀüÿþüþÀyŸøàðàÿçß¿Ÿ}ÿü?ÿùÿÇá÷ÿóÿÃðÿàÿøàüüþÿÀ=ïüàðóÿçß?¾}þø>?ÿçÿÇÃ÷ÿçÿÃá÷ÀÿÿðÀüÿüü?ÿà{Îøáðÿûçߟÿ¿|ÿÿð?ÿßçã÷ÿ÷ÿãñÿàÿÿøàþÿüþÿð?àüÿðÿóçßÿ¾|ÿð>?ÿÿïÏÇÃ÷ßïÿÃá÷áÿÿðÀÿÿüüÿàà¼ÿàÿãçßÿŸ|?ÿø??ÿ¿ÿÿçá÷ïÿÿóñûûÿïøàÿÿüþÿà?àœÿðÃßÿ|>ÿð??ÿÿÿÇÃ÷ÇÿÿãáóÿÿçðÀÿÿüü?øÀ<ÿð€û8?ð?ÿ?ÿÿÇá÷ãÿƒóñùÿóãøàÿÿþþ?ü?àþàø€?ü?ùÿ‡ÁçÃÿóáñÿããðÀÿÿÿþÿð{Àþàø?ðøÿÀãÁïñàðãáøàïÿ¿ÿþø=àÿàx?ÀàÀïßþüÿðxþàx?àçÏü?üø|àx?Àð?Àðÿ‡ÿø?à ÿ€Çÿø?Àÿ€Ïÿàà? ÿ€ÇÿÀ?àÀÿÃÁçþŸüàÿÃÀáþüþàƒü8?pàÿñÿãá÷ÿ‡ÿýðÿãáóÿÿÿðçÿ|Ïþð;ÿ€€ðx?àÿóÿ÷ñ÷ÿÏÿýñÿ÷á÷ÿ€ÿÿ?ø?ïÿ|Ïÿøÿ€ðx|€<àÿÿÿóñ÷ÿçßýóÿûñ÷ÿ€ÿÏÿü?ƒçÿ~ÏþøÿÀƒðx|Ç??àñÿáÿù÷ßïÏñóáûù÷Ï€ÿïü?üƒçþ~Ïüü{ÿ€àxøÇ??àðÿàÿý÷ÃçÃáóàûý÷ÇÀÇï€|ÃçÀÏ€þ|~À<{€ø ç€?ààÀÿý÷ÃïÃá÷Àÿý÷÷€Ãïø>|ÃçÀÏþx|>ðþÃü?øà=ï€ààÀÿÿ÷ÃïÃá÷Àÿÿ÷ÿÃÿü>|ÿÃçþÏøÿ||>ñÿãþÏüÿð=ï€?ààÀÿÿ÷ÃçÃá÷Àÿóÿ€Ãïþ?üûãçþŸÏüÿx|>?ûÿ÷þÏüÿßøþ€?àà7Àÿÿ÷ÃçÃá÷Àÿóÿ€Ãïþ?øûãçþ¿Ïüÿü|>?ûï÷ÿÏý÷ÿøýð€?ààÿÀÿß÷ÃçÃá÷Àûß÷ÿÀÃïü?ùÿãçþ¿Ïü÷ü|>?ûÇyÿÿß=ã¿øÿø€àðÿÀÿÏ÷ÃçÃá÷ÀûÏ÷¿ÀÃï€?ñÿóçÀÿï€÷ü|>?ûÀxÿÿ?ï=à?ø¿ø€?àùÿñÿÏ÷ÏçÃáóáûÇÿ‡ÀÃï€>ÿóç€{ÿÏóü|>?ûÃxÿþï=à?øø€àÿûÿ÷Ç÷ÿÏÃáóÿûÇ÷ÏÀßïü>ÿûçÀ{ûï€ñü|>>{Ïxÿÿï=ãÿøw¼€àÿóÿçÇ÷ÿÏÃáñÿóÃ÷ÿ€ÿÏþ>àûçÿ{ûïþðü<>?ûÿx÷ÿûï=÷þx÷ü0Á€àÿñÿãÃ÷ÿ‡ÃáñÿãÃ÷ÿ€ÿÏÿ>Àûçÿyûïþðü<ùÿx÷ÿÿï<ÿÿøàçøyç€ààÿƒÁçÿƒÁàÃÁóÿÿþ€{çÿyóÏþðx<ñÿxóþï<ÿŸùðãøùç€à?€>€Áø€À?€áüüþ9Çÿ0ñÏþðx8àþxñüî<ñðÃðùçà€ ÁààpÇ?à€à>àà<?àÀà€p?pà<Àÿ€üÿþÀ>ÿà~ÀÿÀü?ÿÿÀ>ÿ€à~Àÿðüÿÿ‡À?ÿÀàÀÿðü?ÿÿÀ>ÿÀàÿ€ÿøüÿÿ‡à?ÿààÿ€€ûø?ü?þ‡àà‡ààÿÿ€??àü?ðü€ýÿŸÿ€ÿøðàÿÿÀ?ÿÀàøàÿàÿø>ü?ÿÿ?ÿÿÁÿøààÿÿ€ÿÀà|øÿñÿü |€ÿ÷?ÿÿáÿøðàÿ€ÿÀ?ÿààüüÿãÿø|?ÿð?ÿÿáÿð?ààÿ€€?ÿÀÿü?ü?ÿáÿü|ðÿÿððÿààÿÀÀÿàÿøüÿƒÿø|ÿðÀÿð>ÿ€àÿÀ€çÀÿð?~ÿÿø|€öàÿðÿ€àÿÀÀÀÿà?üþÿø|ÿÿÀÿð>üàÿÀ€Àÿ€?þÿÿø|€}ÿ‡àÿð0øàÿàÀÀàüþÿü|}ÿÏÿð?|Ààÿà?€Ààþþÿü|€|‡ÿ‡ÿð?|€àÿðþÀðÿþüðü|ÿÿ‡ÿïð?ü?ÿÀàçñÿþ?ðüþþüÿü|€ÿÿƒÿ‡ÿøüÿðàçøÿþ?øþÿÿøÿü|ÿÿÿÿüøÿðàçøÿþ?øþÿ€üÿü|€ÿÿÿÿþøÿðàãøü?øüÿœøÿø8€ÿþþÿüàÿàà0ø?ÿ¾øÿð€ÿü|þ|€ÿÀà†ø€àð€àð€à?à€ðà€ðÀ€ð€ð€ð€ð€ð€ð€ð€à€à€à€à€à€à€à€à€à€à€ð€à€ðàðàà€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿñ& €ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÐÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÀháþñ÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÃÃÀ08öø?Ÿ?ÿÿ¾þ'ÿþ<ÀÁÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿïà@À èöÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÀ÷pÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÀ?ÿÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÇÿïÿûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ?ÿÿÿÿÿÿÿÿÿÿÿýàÀàÀà€x€ðÀÀÀ!ÿÀ@|ÀàÀüøðñàûÿŸð?ÿÿÀþ?ààÀüø?øÿùðûÿÿøÿÿ¾>ãþÁÿÁþààÀþÁü?üÿùðûÿÿüÿÿ€¾¿çÿñÿãÿ€à àÀþÃü?ýÿýðûÿÿüÿÿ¾ÿïÿÿ÷ÿ÷ÿ€àÀðÿƒÀãþüÿÿÀ<ÀÿŽÀ€p€À8àÀÿ?Çþ>ððûø|~øï¾¿ïþÿÿóÿÿÀàñóÿçà~ÿóÿ¿üÿÿÀ|áÿÿ¿ùÿÀàÿçüðàààÀxàÀÿ?Çþ?ÿð?ðûÿøàøÿÿ¿ÿüýÿáÿïÀðùÿÿ÷ðÿóÿ¿üÿÿà~áÿÿ¿ùÿàøÿ÷þ?øÿñðøÀþpÿˆ|@0àÀÿÇÿ?ÿà?ðûÿ¿øðøÿ¿¿ßÿüÿÀÿÿ€àùÿ÷ÿðþÿ÷ÿÿüÿÿÀáÿÿ¿ýÿÀüÿÿÿùÿùð?øÀƒÇÿ€ùÿÞà<üáÿ€ÇÿÿÿûÿxàÿÎÀàÀÿÿÏÿÿà?ðûÿ¿üðøÿ¾?ßÿþÿÀÿÿ€àýÿáÿøÿÿûÿÿøüÿ€ðÿß¿ýÿÀþÿÿÿÿýÿýðüÀÃÇÿùÿß>à~þ?óÿ€Áïÿÿÿûÿ€|ðx>€ÿïŸðàÀÿÿÏÿ?ÿà?ðûÿüðøÿ¾ßÿþÿÀûÿ€àÿÿÀÿøþýóçÿ>Ÿð>¾}ð|~øŸü}ð}ð||ÀÃÏÿÏùÿŸ?à~þóÿ€ÁÏÿÿÿûÿxðx>€ÿÏŸøàÀÿÿßÿ¿ÿððûþüàøÿ¾ÿÿÿþÿÀùÿÀàÿÿÀÿýþÿóÿÿøø>ßø>¾}ð|>øøð}ð~|àÀãσÏÁùà?à~|ûîáÏ€>ãüxðø€þŸüàÀÿÿßÿ¾}ñýðûà|||ø¾ÿÿüÿÿÁÿÿÀàÿÿÀÿýþÿóÿ¿øü>þ?ø>¿ýÿÀ|?ÿÏþð;à?ðøðÀóßÏÃùàÏ?àÿx{ÀñÏ>ÃÀxøð€ðž<àÀÿÿÿÿþ}ÿýùûÿ||~ø¿ÿÿÀýÿÁÿŸÀàÿÿÀÿÿþÿóÿ¿øü>ÿ>ø>¿ýÿÀ|?ÿïþðà?ð?ððÀóÞïãùóÏ?‡àÿ†|1ÀñÏÃÀxxðÿƒ€ðž<àÀû÷þþ<ÿýÿûÿÿüñø?¿ÿÿÿþý÷óÿÏÀàÿÿÀÿÿÿÿûÿ¿øü>ÿü>¿ùÿÀ|?ÿçÿðà?ð?øàÀûÞïãùÿŸï?áçøƒÿùÏüÃþxxà÷‡€ÿž<àÀó÷þþ<ÿüÿóÿÿüùø?¿ÿ}ÿÿÿù÷ÿÿÿÀàïÿÁÿÿÿÿûÿ¿ðø>}þü>¿ýÿ€|?ÿÃÿðà?ðüàÀÿÞïçùÿŸÿ?áç‡þ?ãÿÿÏü>ÃÿxyàçÇ€ÿŽŸøàÀq㜞<üãÿ¿øøøŸþ}ýÿÿøûÿ÷ÿÀàçÿãÿÿÿüûïÿ>|ÿþ>¾}ð|>ø?€ø?à?ð9üÀ¿Þï÷ùÿÿ~?Ïáçƒÿóÿ¿ÏüÃþxÁçÇ€ÿŽŸøàÀ ?ø?ÃÿŸðððþ|ùïÿøñÿãÿ€àçÿÿ÷ÿÿÿÿïÿð€>|ÿÿþ>¾}ð|>ø€ø?ð}ð|üÀ¿Þïÿùàÿ~?ßãÿÀÿûü¿ÏÀÃüx?ÁÿÇ€þŸøàÀ€à ø8pçÿxðÿÁÿàãóÿ÷ßÿÿÿçÿüþ>|ÿþ>ÿ¾}ÿÀþüߟ€ü}øýð||ÀÀŸßïÿyà~=ýãÿÎp{ÀŸÏÃÀx?ÁÿÇ€ðxàÀàüpþàãóÿçß¾ÿ÷ïÿüþ>|ø>>ÿ>}ÿÀüÿÿÿÿýÿýÿž~üàÀŸßÎyà<=ýãÿÏx{ÀÏÃÀxƒÿç€ðž<àÀàáðÿÇŸžóç¿üþ>|?ð>ÿ>}ÿàüÿÿÿøÿùÿß?üðÀÏÿÎyÿž?<ýçƒïx{ä‡ïðÃÿxƒÁçÐð<à€àÀàÿãÇŸüþ<x>àþ<}ÿÀðÿïþ?øÿñÿÞ?øàÀÏÿŽ~{ÿž<ùçïÿûÿ€‡Ïü<Ãÿx‡çþÿÏÿ<àÀàÀxøÀ?Àãüð?àÿŽðàÀƒÃÿ>yÿÞ<øççþ?ñÿ€ƒÏþÃÿ€x€÷þÿçþ<à€à@€ÀÀƒþà~üøx<€àqÿÁþ?øà<àÀà?ÀÿÇ‡Ïøàx<ÿ€p8`8à €àÿûÿÿÿçßÇÃüÿçÿïÃàÿãÿ€ÀÀà~þüø|àóÿÃÇþøÀ€Àÿ†ÀÀxàÀð?ð÷Çßüðü>ÿð|>ø|ø¿ðÿÏø?Àðÿÿÿÿßÿÿ¿‡÷ïçáþ?ÿ÷ÿ÷óðÿóÿÀÀà?ðÿ?þ|>Áøûÿãçÿ¿üàáÀàÿïŸøÿàxàÀððÿÿßÿþðü}ÿðüøÿø?¿ùÿÿüààùÿÿ¿ßþÿçÏçÃþóïãÿóàÿûÿ€À?ààÿÿþø|ÁøûÿãïÿÿøÀÿóÀáÿߟýÿÀxàÀøðÿ÷ß¿þøþ>ÿüþ?øü?¿ýÿÿþÿððøÿð?ïüÿ÷ïûãÿãÿÁÿûàñûàÀ?ð?‡ðÿŸ>?|>áüûãóïÏ¿ààÿóàðÿïŸþÿÀ|àÀøøÿÿÿ?~øÿÿüþ}øÿü?¿ýÿÿÿÿðàðÿÿ?ÿüÿçÏÿÇþÃïÿûàðûþÀ?à?áÿŸ|ø|?áüûáóÏ|ÀðóÀð>ž|ðxàÀüø}ÿÿ?¾øÿ?ùüÿ?ø}ü?¿ýÿßÿÿøðøÿ¿ÿüÿß÷ïÿçÿÃÿÀÿÿððÿ€À?ð?Ïñÿß|þ?ñþûàûçÿ?ðàðûàðž>ð|àÀüÿüÿ÷ü?üøÿýø|ÿÿøü¾ýð?ùøàðÿ¿ÿøÿÿçÏÿÏÿÃïÿÿàðÿÿ€}ð?ßóïÿxÿü}ñÿûáóÇþðÀàsÀðž|û€À|àÀþÿü÷üüüÿþø~ÿÿø}þ¿ýÿŸ¿ÿøðøÿ¿ÿüÿÿ÷ïÿïÿ‡ÃÿÀÿÿàðÿ€Àø?ÿóÿÏÿ|þ|ùÿûàûãÿ?øàààxŸüÿÀ8ïüp03ÿ<ðp=ÿÀ|àüàÀÿÿ?üÿçþþüÿÿø~ÿÿø}þÿ¿ýÿßþÿààðÿþ?ÿüÿÿçÏÿßÿ‡Ãïÿÿàðûÿ€ÿøÿçÿÏþxÿüùïûàóÁÿÿðÀàÀxŸøÿÀ|<ÿÿüðø÷ÿÿþÿÿ÷ï¿ïÿÇÃ÷ÁÿßàðÿàÀÿü?ÿ÷ÿïÿ|üÿùïûàûç¿ðààà|ŸüÿÀ|ÿÿüxøÿÿýóûáóïþààyà?þž<ððà|üó€ÿùþùüûÿøýÿÿ¾ðÿÿøàÿóÿþ?¿þ=ÿ÷ÏÿçÃãÿçÏàÿóÿÀÿð~=ýÿƒÿŸ?þx=ü}ãûÿãïÿÿøààûÀþž<ð<ðÀ}üç€<øpx<|ø|žàÀÿßþÿù÷Ïÿþÿýþÿüùþüýÿÿ¾ð?ùøàÿóÿþŸþ<ýóï‡þçÃóÿçÇðÿóÿÀÿð><ýÿÿ?þ|?ð?ñûÿãçÿ¿üàøùç|ÞÏž<ÿÀžxà=üóþ<ùÿ€÷üx=à=àûÿÃçÿ?üàÿóÿøÿ<ÿàœÿÃÀ=ýçþ<ð|ø<|žx8ŸøàÀçÏøø÷Çÿþüü~ÿøü~ÿù÷ï¿ÿÿÿ?ÿøð àჀ€à?àÿÀÿ€ÿàxççø8ààùÿãÿ?üàñÿøÿÿàÞÁà?ÿãþÿðø~ñ÷ï¿ýÿÿ>ÿðàÀø 0à?áÿðüÿÀ{üÿàßçü<ðþü<|Þü8ŸðàÀÃð0x<àx>?ñóïŸùÿÿððà€ÿø9þðàÏÃÀx<<<ü?ÿ<ƒžàÀðàx~ÿáàÇÿàð?àüàþáóÇÃÁãáàÿ|àÀðÇï‡ßûÿŸÿÿÀàø}ÿà||ñðøÿàþ?ø?ð?ÿðüóÿàÿáóãƒÁçÁáÿ€|àÀðÇÿÿƒÿÿŸÿÿàáø}ÿð|ýûðùÿð?ÿø?ø?ÿÏŸƒð?ü÷ÿ€àðÿÁóüÁçÀï<ðÀðçÿßÃûÿßýÿàðü}ÿð}ýûøûÿð?ÿÿø?øƒÿø?þÿÿ€àþïÁóÿÁçÀï<àÀàçßÿÇ÷ÿÿûÿàñüÿøùóùûÿð?ÿð?ø‡ÿï¿øþÿïÿ€àþÏÁñÿƒÁç€ï|àÀð÷ÿßÇûïÿóàñÿ}ñøðûüûðð~þ>üÿ‡ãïþø||žàÿÿƒÁðÃÁçÀãÿÏ<àÀàÿßÿÏ÷ÿÿñÿà?ñÿáøáóü÷àð|ü`|øÿÁïüø||ï¾À ÿƒÁãÇÁçÁçÿÏxàÀðÿÿ‡ßïûÿßýÿà?øÿýðüàûÿÿáð|ÿø>üÿÏÀøü|çþàÿÃÁóÃÃÁçÁ÷ÿÏ<ðÀàÿßÿï÷ÿ¿ùÿÀùÿûàøÁóÿ÷Ãðüÿð?ù÷Ï€ø|ü~çÿ>àÿÃÁçÇÇÁçãïÿï€xàÀðÿÿ‡ßÿûÿßýÿàüÿýðüàûÿÿãø|ÿø?ùÿïÀü>|óÿžàÿãáóÿÃÁãÿïïþ<àÀàÿß¿ÿûÿÿñÿÀÿýÿûðøñóÿ÷Çðüÿð?óÿï€ÏüþxÿçÿˆÀþÃÁãÿ‡ƒãÿÏïüxàÀð¿ÿßÿûçÿóàþûýðüøùïûãø~þ?ãÿ÷Áÿþÿ|?|ŸÀàþáÀñÿƒÁàÿÏçü<àÀà¿ßŸ¿ÿ÷Ïÿóàÿÿóûñø}ùóç÷áø~ü~ÿïÃï¾?ÿ|?ø€ÀøÁàþÀÇø<ÀxøÃÿðƒÏÿÿÀxàÀðïÿßÿûÿÿýóàÿÿùýÿø|üùóûÿø?ÿ¾>ÿ÷ãÿŸ¿ÿ¿?ïÏßàð€>à|þ?ãÿ€üãÁïÿÿà<àÀàÏÿ¾ÿÿÿÿÿ÷àøñÿÿð|ýóãóÿø?ÿ||Á÷ÿïü?ÿÿÿ¾À~ÀüþçÿüÿçƒÿÿÿÀxàÀð‡çÿŸ~ûÿßÿóàø?øýÿð<>ùáùÿøÿ>>Àùÿï‡üŸÿÿÿŸà>àþ¾xóÿüóÁçüÿÀ<€€?àÀà‡Çþ|óÿýãÀððyÿÀ|>ñÁðÿðü<<€ñÿøÿóÿà~Áþð÷€<ñ÷ƒááðxüáÿ<àÁÿƒÃüàÀðÁü <0üü`À`p8ÿ€ pÀp?ðø€pƒøþ?ñþà€?ÁÿxsÀ>xóÁáàð<ÿ‡€ùÿ¾?ðáÿãÁçþàÀàà?ÃÿÀþüüyçƒááÿxÿóÿ¾ñãÿçÁÏþàÀðà€?áïüãÿüãÁáðÿÀ<ÏÇÁùà?|yãÁóáïŸàÀààÀŸÃχþ?óþüÿÇÁàÿ€x‡ÏƒóÀ?xqç€÷ñÏàÀðàÁà;ßãÿÿóÿþãÁáðÿ€<ƒçÃùà?Ï|1ç€óñï‡àÀðàÃÀ{ÿÇÿŒ>aó€>qçáàðxƒÇÇóÿ?ÎÁï÷ùÏðàÀðàãÀ;ýÇÿÞð{ÀxóÁáàð<çãùÿï?ñç€sýçþàÀð?àáøð?ÁÃðÃüþøÀÀÀ <àãÁð{ùÏÿÞðóÀ>ðãÃÁàò|ÇŸçóÿ=îñç€ó¿ÃÿàÀðøóþüáçþÿ÷ƒÿ€ÿþð?ð?ðÿÀ€àóãü9ùïƒïxûÿþxóÿÁðÿà<çŽ÷ùþÿùç€sŸàÿðÀðüÿÿÿþóçÿÿÿÏÿŸ€ÿŸþøøùÿáÿÀàûÏüyñßïþóÿüpãÿÁáÿÀxƒÇÿóÀ<þpùÇ€÷ÎàÀðþÿÿÿ¿ÿû÷ÿÿÿÏÿßÇÀÿßþüÿüÿýÿñÿààûïþ€8ùïçü?ãÿ€üxðÿ€àÿà<ƒÇŽyàxxãÀóï€ðÀðþÿÿÿÿÿÿûïÿÿïßÿßÏ€ÿßüÿýüýýýÿûÿààÿÏ>0`ÌÃðÁÿà ~ÀÀxÇŽ~ûà<>xyããã‡ïàÀð~üßþ?û÷ÿ¿Ç߇ÿçÀ‡ÿàüøøùûóàà¿ï€<ÿÇŽ>yÿœøáÿãÃçÿðàð~?ÿÏÿü?ýûïߟ¿ÿï€?ÿø}ð?ððÿóààŸÿ<ÿ‡Ž>yÿœ?ñàÿÃçÿààð~ÿïÿ|û÷ÿŸ‡ßÿÿÀ?ÿüø=ð?ð?ðÿÀàŸï€<ÿŽ<ðyãÏðÀðàðñïÿà?xáùàü<<ðyãÎààðà€ð0ï÷þ?ð<ñüðÞ?€ðyçÏððÀðàðüÿÏóÿøxãùÿ‡ž?áàqÿøàÀðð€ðüï€ðÿ‡ü<óüÿ‡Ÿüðxÿü ðÀðàðüóïæ±üxóùÿžüàyÿùððàðà€øÿÞþ<ÿð< ð~ðÀðà€<>=ÿžþ<ÿð|À<ÿçßüÿ€ðàðð€>>=ÿŸÿ<ÿð<à>÷ÃßýÿÀðÀðà€>~9à><|à|ïÃßûÿÀðàðð€=à><<ð~xÃÇããÀðÀðð€yþ<<>|ðþxãÃÃãÀðàøð€yÿž<?þ<øþxóÃÃñ€ðàøð€÷ùÿž|ýþÏÃÀÿÀðàøð€÷ñà<<<ýþ¿Ãà?àðàðð€ãñà><|ÿÞxŸÃÃÇàðàøð€ãñÿŸ<|ßÞxŸÃãÃàðÀðð€ãáÿßÿ<|ßÞ|GÃããàðàøð€Ãáÿßÿ<<ßž÷‡Ãáÿàðàðð€ÁÀÿÎö<|Ïž÷‡ÃÁÿÀðàðð€À|ž÷ƒÁÀÿ€ðàøð€|<ƒ<ðÀðð€|<ðàðð>€< <ø?ÇÀðÀðð?>€à|<þÀÏàðàðð€>>€&ð|?<ÿÿàÏàðÀðð?¿€€àÿ€ü>€ÿà|<ÿƒÿðÏàðà0>Àððÿà?€øÿ€ü>€?ÿð|ÿÀððÿÀ€?üÿ€ø<0€?ÿà|ÿxð?ÇãøßðàøÀ>àð8€8ðÿÀÿ€þÿ€ø>ð|ÿ€|ð?ÇÀøÿðÀøÀ>Àðüÿ|ðÿ€þ?ð|ø|áøxÏyðÏ€øþàà€ðøÿÀ>à€ðþÿ€|ð€ÿ€<~ðï€|þðÀ?øðøþÿ>Àððþ?ÿ|ðÏ€üàxø|Àçüÿ€xñð|ïxüðàÿþ€àøø?ÿƒü>À?ø€øþÿ€~ð€ÀþÀøø€?üóüÿà|ðð|ï€|üðÀÿþÿðøð?ÿð~pÎü?€ðþÿÿ`ð<üÀàà€>ÿ€ðøüïðÿÀxÿÿ|ïxøààÿþÿøüùà?ÿ‡à>øÏþ?Àøþÿ?þÿüÿøþøàÿÿðÿð€À~ÿÀ€ðø€?ÿÿÀÀ|ÿÿüï€|üðÀÿþ<ÿø?øûàÿ€|øŸþ?Àðþü?ÿÿÿÿüÿÿøø?ÿ‡ÿð?ÿà€üÿÀÿþ?ÿÿ€>€xÿÿ|ï€xüðàò~>ÿü?üûà><€~üÏ€8??àø¾ü‡ÿ‡ÿýÿþÿ€ÿü?þÿÃÿø?ÿ€ð€Àøïàÿÿ€€ÿ€~|ÿ>ï€xþðÀà|>|Àüøóà|øýøŸ>Àð~øÿÇÿýÿÿÿÁÿüþÿƒÿð?ÿ€à€?ðÀ>ÿÿÿ€?üxð>Ï€ðþààà>>|>üóà?üÿ|üŸ??àø>üÿÇÿþÿÿÿáÿþ?þÿÀð?ÿ€ð€À?Àà>?ÿ€€ÿÀü|ð?Çàøÿðààü><üøóàþÿ€ùø~àð~ø?ÿÇÿü¿?ÁÿüþÏ€|?ÿà€~À|ð÷à?øxà?Çáð¿ðàÀ|>>üüóà?ÿÿÀøøŸ€þàð>øãÿþ?¿áÿü?ÿÇÀ~?ÿðÀ|Àüø€óð?ü|ðÿÃÿðÀðÀø|~øø÷ø?ÿŸÿÀÿÿ?ÿðüÿàð>ø?çß|~?áÿü?þÀ|?ÿà€øÀøð?óü?þxàÿÿà?ŸàðàøÿÀøüÿþ?ÿŸÏàÿÿŸÿøüÿðø>ø¿ãÿ~?¿áÿü?ÿ‡À~p?ÿ€ðÀøàÁøø€>ùþ?ÿ|àÿÿà?àðàðÿÀðøÿþŸàÿÿŸÿðøÿðð>ü¿çß|>?ãÿþÿþÀ|ðÿ€àþÿþ?ƒððüûþ?ÿx@ü€?ÀðàðÿààüÿÿÞàÿÿÏÿø€ðÿðø>þßãÿþ?Ÿ‡ãÿþÿÿÇÀ~ø~Àðþ€ÿÿðp€üùþ?ÿ€|øðààÿÀ<ÿüþÿþžà?Àÿÿà?Àÿÿðð~þ?¿Ÿçÿü?ÿÿÃûþþ~ÏÀøŸ€àüÿÿþà`€ø |€xðààÿÀþ|ÿþßð?àü€àþÿøø>ÿŸÿçÿþ?ÿÿÃÿþþÿÿà?øÿÀðøÿþÀ€ð|€|ðÀ€|ÿƒøøÿ€àŸàðøáøÿøð>ÿÿÇÿþ?ÿÿƒÿþÿÿÿÿð?ðÿ€ð?ø€€ÿÀ|€xðà€>ÿÃðüÿÀð‡àðø€ñú~ûþø>?ÿÿÇÿþ?þÿƒÿüÿÿÿððÿð?ð€€ÿ€?ÿ€|ðÀ|ÿÃÿøüÿ€àÿÀðøñÿÿûþð<üÿÿü?øþÿø?ÿßÿàÀ?üð?€€þ?ÿ|ðà>ÿÃÿþ|ÿÀðÿÿÀðøñÿÿýþøøþÿð€ø|ðàÁÿþÿ€àüÿ?à0?àÿÿðüøÿÀð€|ðà?€ÿüø|€€üðÿÀð€|àðà``ÿðøÿÀð€à|àðàÿÀðÿÀð€ø|àðàÿ€øÿð€ü|?Àðà|ðð€?ü|ðð|ðàðð€?~à<€ü?€üøðàðð€<à|?€ÿü€?üððàøð€|ð|ÿ€ÿüÿ€þàðàðð€|à|ÿ€øÿ€ýþÀðàðð€>>à|ÿ€ðÿ€ø?€ðàðð€?|à<ç€ðCÇøÀðÀðð€üáü<‡€àÏàø¿ßãÿ€ðÀðð€øóþÿÀ<€ð?ßðð¿ÿ÷ÿÀðÀðð€øçüÿÀ|€ø?ßàð¿ÿçÿÀðàðð€?þçüÿà|€üßÀðÿ‡ÃððÀðð€~~ïøÿÀ|€þÿðƒÿððàðð€|ÿ€?À<€þðþððÀðð€øÿ?|€üðüððàðð€xÿ<<€ü€øüpðÀðà€pÿ8|€>üðüððàðð€xûÀð<€>þ8ü€pÀðð€øãàð|<Î3þø€pàøð€|?ñøü~€|ÏüÃàÀpÀðð€~~ûü?ÿþøÏàø?Ïà€ðàøð€üÿþ?ÿ€~ðÏððÏàpàðàøûüÿ€ü?à?à€ààøð€ð@ <À|ÿ€pÀðàx€|ÿðàøð€?€|üpÀðà€?ÿ€|Àðàøð€ÿ€<pÀðà€þxðàøð€ø<ðàðà€|ðàøð€<pàøð€|ðàøð€<pÀøð€|ðàøð€<pàøð€|ðàøð€|ðàøð€|ðàøð€<pàøð€|ðàøð€<ðàøð€<ðàÿñÿïüñÿx?ûÿùøð€<pà?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøð€<pà?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀøð€<pà?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀøÿÿÿÿÿÿÿÿÿÿÿÿÿüøÿçÿÿÿóÿÿþþöŸÿÿÿÿÿì@î.=Æððüð€<pàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ€ð€€<pàb`‰ÏÿáÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿð€Àÿÿü€<àðà€„?ÎÿÿÿÿÿÿÿÿÿÿÿÿÿÀüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÁðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€<`pàøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÁðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€<ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€pàüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ð?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿð<ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ðàüðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿð<ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ðàøðÿÿÿÿÿÿãÿÿî0€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿð<ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ðàpøð€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà<pàð>àøð€ÿÿÿÿÿÿÿýüÿ÷¸ÿ<pàà!þÿƒø? ýÿ€Àð&üð€<pàðp8à÷ÿ9ÿÏø?ÿÿ€üãÿøð€<ðà?üx<Áðÿÿýÿÿü?ÿÿÿÀÿ?ÿÿ€üÀð€<pàüø|Ãðÿÿÿÿü??ÿ?ÿÿÀÿÿÿ€øÀð€|ðàþø>Áøÿÿ|ÿßüÏÿ€ÿÿÀÿÿÿÿ€üðàþø<ÀÿÇüðÀ€<ðàü>ø|?Ãøñø|?ø>?Ïÿ€?áÿÿÿÿÿø?ø?ãÿ>ü|>Ãÿßþ>à€€|ðàøx?ð>?ÿÿ?ø|ÿÿþø?þÿÿ¾?þþ?ãÿß¿ÿÿðÿ‡ƒÀøûÏþÿà€|à`ÀÀðàøø<}ñÿøø|üÿÿ€ü~ÿ¿óÿ€ü?ÿÿÿß?ÿðÿÏ¿ÿÿŸ€ðÿǃàü‡¿ûïÿÿà€€<À|?øx9ÿÁà<ÿàpàðø|{óÿðø|>ø>?ÿþø|ÿ÷ÿø>?ïϾ~¾ð~ÿŸàÿÏÁü?óÇüÿà€ø?ÁçƒÀxÀüøð{ÿƒà|=ÿàðàøx>ùïøø|üÿŽü>ÿ¿óÿ€ü?¾ÿß>ßø?¾ÿï€ðÃçƒÁþLJÁàðÿÀ€ÿ?ðçÃÀ<à|üü=ÿƒð>ÿàpàøø|ÿûïðø|>ð?>ÿ€à|ÿÿ÷ÿø>ïÿ>|þ?ø>|ÿÿàïƒÃþχƒàðð€ÿñçÇÀxàøð|üxüð~>?€ðà||<ÿùçøø<€>ÿ¿àü>¿÷ÿŸ~?ÿ?ü?þÿÿ€ð€÷ƒÁÿç‡ÁàðyÀ€ÿ¿øóç€<ðüøþ<<ø?pàüþü}ÿûçðø|>ø?>€ø|ÏþÀø>çÿ¾|þø>|ÿÿðçƒÃß÷‡ƒàðÿÀ€Ïxyáÿxñýðþx<ø¼>ðàþýø}ñøø<ü??€þ>Ï¿ÿàü?¿óÿß~ÿÿü?þÿÿ€ð÷ƒÃÏ÷‡Áàðà€Ǽxðÿ<ñüðÿ<<¼?Þpà?þûàáøø|>ü?>€þ|ÏÿÿÀ>ø>¿ÿ|?}þÿü>~þÿàïƒÇÿÿ‡ƒÀðÿÀ€}ñàþ|ñýàÿø<<Þðàþ?ùà=àøx<þ€þ>Ç¿ÿà?ü?<Ïß>üÿþ?¿þ€ð÷ƒÇÿƒÁàðÿ€€ÿ?øð~<ùüð÷ü<>;þpàüáÀÀpp<ü?þ<‡?ûÀ>ø?ÿ?ÿÏÿ?ÿ|ÿÿþ>?¿¾àçƒÏÿž?ƒÀðð€ÿñà||ûýð÷ø<þyþðà€à?üƒùÀü?ÿ?ÿÿß?ÿüü??Ÿÿ¾?€ð‡çÃÏÿ΃Áàðø€þ?ðð<¿üðóü<ÿ<þpà?ø?þ?ÿÿ¿ÿ|?ð?>Ÿÿ>?ðïÇÏžÞ‡ƒàðÿà€ø|ñáÿ|?¼ð<ñøpàø?üð€ÀþßãøÇùÿÇÿýø??ÿüøùÿ|þýø?øüð@àÿÀ<pà|ø>þ?ßçøÇýÿƒÿ±ÿ€?>þøøýøø}ø}ø>üð€óÀ÷þ?óÿ€À<ðpà|øÿ?ßçøÿçýÿÃÿýÿÀ>ÿðüüøø}ø=ø?ðüð€ûÀ÷þ÷ÿ€À<ÿÃüø€pàüðÿ?ßçøÿçÿÿÃÿýÿÀ>ÿðüüøø}øø?øüð€ûá÷ÿ÷ÿÀ†à<ðà<€ÿÏÿ?ø>Àpà|øÿ¿ß÷øÿçÿ÷ÃÿýÿÀÿðü?üðüøø?øüð€ûá÷ÿ÷þÀƒÏžð|üð<ÿßÿ?ø?Àpàüðÿÿßÿùÿ÷ÿÿÃÿýÿ€>ÿðø?üðø}øø?øüð€ñáç|ÀÀßžð~üÿà<ÿŸŸðÀpà|øÿÿßÿùÿóßÿÃÿùø>ÿ€ø?þøø}ø=ø?øüð€ñãç|ÀÀƒß‡žðþþÿà<>ƒÀ‡Àpà|ø>ÿÿßÿûÿ÷ÏÿÇÿð>üøÿ}øø}øø>üð€ðóÇÿãÿÀßÇž€þ>ø<<>À‡€ðà|?ü~ÿÿßÿûÿÿÇÿÿßýÿÀ?ÿàÿÀÿýøø|üø>üð€ðóÇÿãÿÀßÇžÿø<<>À÷‡€ðàþÿþû÷ßûáÿÇ÷ÿßÿÿà?ÿøÿàÿÿýøø|ÿýÿÿøüð€ðÿÇþçÿ€ßçžï>ÿÀ<><ÃÀ÷Ç€pà?þüó÷ß~ÿÀÿÃïÿŸÿÿà??þøÿàüùøø|ÿýÿÿüüð€ðÿ‡þãþ€ßçžïüÀ<><ÃÀãÇ€pàü?øóóÏ~{À{Áçÿÿÿàüøÿðøøðø|ùÿÿüüð€ð‡Ÿ|À€Ÿ÷žƒÇ‡üÿÀ<><ÃÿÇ€pàøðqãŽ>ÃÁÿç€ðàÀ€`€p0Àøüðüð?çÿÀŽžƒÿǼx<>ÃÃÿç€pà?üðüð÷ÿ€žÿÇ<ð<<ƒƒÿç€pà|ðþð>óÿ€€‡Ž?ž‡ÿÇð<>ÿƒÃÀ÷þxà?üðüð>÷ÿ€žƒÏÿà<<ÿ‡€÷þðàüðüpÀÿžçÿà<þÇ€wþpà?üà€ÿçÿà<ø‡cüðà€üðÀþã ?à<pàþàÀaãŸü€?üð€x<ðàÿÿððûáóÿÿÿÀüðÀ<pàÿÿðñÿá÷ÿÿÿÀ?üà€<ðàÿÿððûùÿÿÿÿàüððÀ<pàþÿàñÿó÷ÏÿÿÀ?üàð€|ðààÀðûý÷áñÿÀ€üðÿþ<8yÿÇøÀ<pàüðûý÷Ãóÿ?üðÿÿü|x<{ÿßø€<ðàÿ€ðûÿóáñÿÀüðÿÿþ<~yÿßüÀ>pàÿðûÿ÷ÁáÿÀ?üðÿßü|~pàþðûß÷Áñÿ€?üàðà|€<ðàà€ðûïóáñÿüðÿƒà<žx>ðÀ<pàÀðûç÷áóð?üðÿÃÀ|¼xÀø<øy÷ÿ€üÿçÇÿŸü<ÿ¿?ð~€pàÿáÁãÀáÿÀüððà<xüx<Àø=øyçÿýÿçÏÿŸø<ü|€þpàÿÀÀAÀÀ€|ððà>x~x>Àx<üyñþþûçÏÇß<<<‡€ÿ€pàüðÿãà?üx|x<øÀø<üyàð?ñçÏž<xxïpà€|ðÿáàüx>xüÀx<þyðxóçÏŸ<8x‡ƒÿ‡xà€|ðÀø<ïùàøüÿÇŸø<xxÿpà€|ðÀx<÷øðøøÿçÏß <<<‡ƒÿÇpà€|ðÀx<óùàøÀñçÏÞ<8<ÿÏpà€|ðÀx<óøðxñçχÞ<ÿÿÿÿãð|ðÀ<pàÿß‡Ãø?ÿÿÿÿãðüðÀ<xàÿ߇Ãü?Ÿÿßÿ÷à€|ðÀÀ>xàßÿÇüŸ?ÏóÿàüðøÀxÿÏ?ÿàÀ>xà‡ÿ‡Çü?ßÃáÿÀ€|ðþ>à|=ÿïÿÃàÀ>ø€pàÿ‡þÿÇáÿÀüðÿ>àü=ÿÏÿÃÀÀ>€ðþ<ÿÀxàÿÏþ?ÿÃàÿ€€üð?¿>ð~<ÿÏ?óçÀÀ>Áøÿ>|ÿàpà?ÿþÿ‡àÿ?üð><ðþ<>ƒï€À<Áøÿ>~ÿÀpàÿÏÿ?ÿÃà€|ð<¾ø<ÿ€À>Áø?>¾?€xà?ÿ¿ÿÿ‡À~?üð|¼øÿ<>ÿÀ<?Áü?>¼<>pàï‡ßÿ¾ÿ‡Ãà>€|ð|¾x¼€ÿÀ<?áü?<¼?žxàÿߟ¿ÿüÿ‡À~?üàx¼xÿü<€þ€<?áü|¼¼pðÿïÿ¿ÿþ‡Ãà>€|ð<žü{þÀ|À>=ðþ¼¼?þxàÿÏÿ|ü~‡À~?üà|¼?üóü<€|À<yñþÿx¼ü>pðÿÇÿ¾ü‡Ãà>€~ð<ž?þyüÀ<À<ðÿÿ<ž=þxàÿƒþ8¸À<?üà|?<þñü<€|À<ÿñÿÿ<¼yü>ðà|ø€~ð¿Ÿ?|x|€<À>ÿùïÿ¾ž8þxà?üàÿþðð|<€|€<ÿùïï>>>xü>ðð€~ðÿüxx<€<À>ð=ççŸÿþ<~xàüàþø`p€<à=çÏþüx|ðà€~ðÀÀ>àãǃüü8xàüà€<€ààpààü>€~ðÀ>xàü?ãÿ‡ÿãÿ¿ð€|ð€<ðð?þóÿÇÿÿóÿÿü€~ðÀ>xàþóÿïÿ÷ÿÿü€üàÀ<pðÿûÿçÿûÿÿþ€~ðÀ>xà~?ûÿ÷ìÿþ~ÿ€üàüþ0œãü?óÿÀ<pð~üÿã÷À|ûà~?€~ðÿƒÿ8Þÿóÿ?ûÿ€À>xàüÿûáÿþÿÿ|?€|ðÿÇÿxžÿ÷ÿ?ûÿÀÀ<pðüÿûáÿÿûÿ¾€€~ðÿçÿ|ßÿ÷ÿ¿ûÿàÀ>xàüÿóáÿþ÷ÿ|€|ðççÀxŸ|¼ÃðÀ>xðüÿûàÿþóÿ~€~ðá÷À<Ï|ǼÁðÀ>xàüÿûáÿüûþ|€|ðá÷À|žÇÏ¿óÁðÀ>xð|ÿûáÿÀ}ûà>?€~ðàûþ<‡žãÿŸóÀðÀ>xà~?|ûç÷À|ûð~ÿ€~ðàóþ<‡¾çÿ?óÀðÀ>pðÿ|ûÿ÷ÿ|ûÿÿÿ€~ðàóþ<‡þ?ãÿ?óàðÀ>xð?ÿ|ûÿçÿ|ûÿÿþ€~ðà÷à|ƒü|ß<ÀðÀ>xð?þ|ûÿçÿüûÿÿü€~ðàóÀ<ƒü|Ï<ÁðÀ>xðøxðð0ÿÿ80ÿð€~ðãóÂçøㇿóÿàÀ>xð€~ðÿãÿ÷øó‡¿ûÿÀÀ>xð€~ðÿÃÿ÷ðó‡¿ûÿÀÀ>xð€~ðÿƒÿ?ç€ð?ó‡ùÿÀ>xð€~ðþþ Á€Àxð€~ðÀ>xð€~ðÀ>xðà?< 0ÿÀ€~ðÀ>xàà|à<|{ÿÀ€~ðÀ>xðø~ÿø>~ÿà€~ðÀxàð~>ÿø~þ>ÿÿÀ€|ðÀ>xðøÿü>ÿ?}ÿÀ€~ðñßÀ>xàø>ÿü>ÿ>üÿ€üð€à1ÿ€x<ð8÷ÿ€À>xðüþü~>ÿÿ|?€~ðÀøyÿàx>ø<ûÿ€À>xàüþø|~ÿþü~€üðÁø{ÿàø<øy÷ÿ€À>xðþÿø>>ÿ|?€~ðàüyÿðxü<ñÿÀ>xàüþø~>ÿþü~€üðáü{ãðø<þyðxÀ>pðÿÿø>>ÿ|?€~ððþyàøxÿ<ð|À>xà?þþø|>ÿþü~€~à?áþ{áðø<ÿyðx€<pð?ÿ}ÿü~>}ÿ|?€~ð>øÿýàxxÿ¼ð|À>xàÿ|þÿü??}þü>€üà<ñÿûàøø<ÿøðxÀ<pðÿüÿüÿ||?€~ð?ø÷ùðxxóüð<Àxà|ü~ÿøþ|~ü~€üàù÷ùàðx<óøðxÀ>pð|ü>øþ|>|>€~ðüóýàø|<ñüð|Àxàx¸<àøx€üàÿýóùãð||ñýðxÀ<pðð€~ðø~ðýÿð?üðüð|À8ð€üàð?áùÿà?øðüð|À<pð€~ððð}ÿÀøð|ð|Àxð€|ðÀàqÿÀ``0À>pð€~ðÀxð€üðÀ>pð€~ðÀxð€|ðÀ>xð€~ðÀxð€|ðÀ>xðÀ~ðÀxð€|ðÀ>xðÀ~ðÀxð€~ðÀxðÀ~ðÀ8ð€~ðÀxðÀ~ðàxð€~ðÀ€ÿÀ8ðÀ~ðÀÀÿ€?ÀxðÀ~ðÀÀÿÀÿ?ÀxðÀ~ðÀàÿàþÀxð€~ðÀÀüÃàøÿ?ÿøðÀ~ðÀxàþÿÀ?ÿþ€þáàÀøÿøðÀ~ð ÀÀþÀ?ÿÿÀÿþàÿÁà€ðÿøð€ø~ÀðøÀÀþÀ?ÿÿÀÿþÿðÿƒÁàà?ÿøðÀþ~ðàðüÀ?ÀÿÆþÿÀ?ÿþÿøÿÃãÀÀ#øð€ÿþÀÀðððþÀÀÿƒÇþÀÿþÿø?ÃÿÀ€øðÀÿ€~àÀàxøðð?ÿÀÿÀ?ÃÏ€ø?€ñþà|>ÁÿÀ<„yøð€ÿ€À~ÿÀ?àààøðàð>?ÀÿÀ>Ç€ø¹þx|Áÿ€?øÿyøðÀxÿü€À?ø~ÿà?€ðààüðàðÀóÀ~Ç€ü½þx|ãÿÀ?üÿ€øøðü€øÿþ?ÿàü~ÿà€àààüÀ?ÀðÀÀ|Ï€üÿ€üþø|ãÿÀ?þÿ€øxðÿÀüÿÿÿðÿþ~ÿà?€àààü€ð€Àà|ï€ÿÿÀüø|çÃð?¿ÿÀø8ðÿ€üÿþ‡ÿñÿþüÿà?ÀàÀ<ü€ðÀÀxïÿÿÀü>ø|ïð|àøxðÿ€Àüÿÿÿ‡ÿùü~ïáÿ~ãàÀÿÀ?ÿÿðàÿó÷ðàðþÀà|ïÿðÿ€ÿàü?ð|ï€ðxàøxðÿ€€üÿþÿãùø~ü?ãþÿþÿÿàÿÀ?ÿ€ÿÀÿÿàðÿ÷ÿø?ððþÀÀøßÿð€àü>ÿà|ÏðpàpxðÀÀþÿÿÿàÿø~ƒãÿÿÿƒÿÏÿðÿàÿ€ÿà?ÿ‡ÿð?üÿÿÿü?øðüÀÀ|Ïÿð€ðü0ÿ€|Ïð8àpxðÀ€üÿþÿÀýð?ü?Ãÿÿÿ‡ÿÏÿðÿà?ÿ€ÿà?ÿ‡ÿàüÿÿÿüøàøÀÀ|Çÿà€àø>`ø~ÏðpàxðÀÀþÿþÿÀø?~?Áÿ€ÿÿ‡ÿçûø?àÿ€?àÿÁÿàþÿûÿüþð?ÀÀà>À€€ð˜ð?ÏÁð€<àxð€€þÿÜ?ÿŸÀýüü>?ÿÿÃóðàþàÿ€øÿþßñÿùÿüð~ÀÀ~€à>À?çà?€<‡À?xø?ÀÀÿÿàßïÀ~ÿÿ~?€ßçáñøàààÏ€|ÿÿÏàüxÿþð|àà?€€€à€ñÿƒÿà?ÀþÿÀÀxðÿ€€ßÿÀþ>ßÀüÿÿþ?À?Ÿ‡ÃñðààÀ€øÿþÿ€ø!ÿþàøÀÀ?ÿ?€~Àà>ÿøþÿÀ?€üÿ€ÿàpøÿ€Àÿ€ÿÀÿÿ>ïÀ~ÿ~?à€†ñøààà€|`ÿÿÿ€üÿþð¿ààÿ?À~Àðÿüþÿ€Àøÿàxðþ€ÿÿÀÿÿ~ïÀü?ÿþ?àÃóðàç€À€ùðÿüÿøÿüàÿÿÀÀü?€øÿð>ÿüø|?€À0€pøüÀÿ€ÿÀÿÿ?ïàüÿ~ƒð€Ãã÷øà÷ÀàÀð|<ÿ€üü|ðÿ€àüÀøþ?àÿøÀ8ðÀ€ÿÿ€ÿþ?Ïáü~|Çà߀Ïãÿð?þÿÀþŸÀÿð~|ÿÀþþüàÿÀ €àø>€xø€ÀÿÀû€þ?çñü~~ïáÿø?€ÿáÿüÿÿÀÿ?ÿððþÿçÿüðàÀÀø€xð?€ßÃþ?ÿÇÿøü~ÿÃÿøÿàÿáÿüÿÿ€ÿÿÿàà?üÿÿÿüàÀ€þÀ>pø?ÿÀÀÏ÷ÿÿÃÿøü~ÿÁÿüÿðÿÀÿþÿÿ€ÿ?ÿð?àüÿ÷ÿ€?üðÀ€0xð?ÿÀ€?ßÿÿÿÿðø~ÿÿøÿàÿ€þüÿÿ?þ?ŸàÀðß÷ÿððÀ>xø?ÿàÀ?Ïÿÿÿÿàø~ÿÿøàÿ<8þ~ €àðÆÀðàxð?ÿàÀ?ÏçÿüÀ?ð~|8ÿððÀ>xøÿàÀÃþ ?à~ÿððàÀxðÀ?€~ÿàðÀð>?àxøÀ~ÿàðÀüðxðÀ~ÿðÀþ>ÿøxøÀ~<ðàþ øü|ü?ÿøðÀ~ðÀ??ø?ÿþð|?ÿ?þÿÀÿøøÀ~ðÀøàÿÀüÿÀÿþðÿÀüÿàÿþðx?ÿÿÿ‡ÿà?ÿøøÀ?€à~ðàÿàÿÀüÿð?ÿþøxþÿÿ‡÷ðÙøøÀÿÀð~ð?àÿ€ÀÀüóð›þø|ÿ>ÏÁðøøÀÿàð~ðàÿ€Àž€üÁð™þøüß>ÏÁð¹øøÀÿàð~Àðÿà?ÀÀþüÁøýþ?ðø|ÏøüøøÀÿðð~ÿÀàðÿà>ÀÀü> |€øýþðü|ÿ€øüxøàþÀÿÃñð?ÿÃð~ÿààðûà|ÀÀþ~|€øýþøþ|ÿ€xøxøðÿÀÿãáðÿáð~ÿðàðsà|àÀþÿ€|€üüýüÿ|ÿ€xø8øðÿ€Àÿãáðÿóó€~ÿàà ðà|àÀ¿ÿÀ|xüð<ÿ€|ÿxøxøðÿÀÀÿãñðÿãçÀ~ÿà@æø|ðà|àÀ>€ÿà|xüð>Ï€|ÿxøxø?øÿàÀÿãÿðÿãçÀ~Çà?€ûø€øÿ?ÁüþÿÀðà|àà<€Ãà|€|üàÀ|ÏøøxøøÿàÀßÁÿà}ûçïÀ~‡àÿÁÿü?ÿÀþ?ÿ€ÿáüþÿàðà|àÀ|€ð|€xüàÀ|Ïø¸xøøƒðÀÇÀÿà}ûóçÀ~?ƒáÿñÿþ?ÿ€ÿðÿÿÿñþÿÿððà|àÀxÀð|€øøà€>Ïðxðð?ðÀ‡Áÿà}ó÷ÏÀ~?ãÿñÿþ?ÿÿð?ÿÿÿñþÿÿððà|ÀÀxÀð|Áø°à€?‡Áð€xø9ð?ðÀýÿð}ûïÇÀ~?ÃÿøÿþÿÁÿø?ÿÿÿø~~ÿððà~ÀÀ<€ð|áø€ð<€€Ÿ‡çà€xðð>ð€ÿÿðyóïÀ~>ÿøþÿÃÿøÿàÿø|~ÿàðà~ÀÀ|€à€xãð€øü€ÿÿà?Àxøø>ðÀÿ‡÷ø8ùÏÿø~?áø?>ÏÃÿü~?àÿø~>óàðà?€À?à?À|ÿà?ðø~ÀþÿÀð8ðð>ð€ÿÏÁøÿüðŸÿø|?ÏÁø|~Çÿø|àÿø|~á€ðÀ?ÿ€À?þÀ?ÀxÿÀðøþ€þÿ€ðxøø>ðÀÿçÀüÿÿøÿü~÷àø|>Ãÿü|àÿø~~àðàÿàþ€À8ÿ€ðàüÀø|?àxðð>ð€?ï€ùÿÿðÿø~?çÀø||Çÿø|Çÿð|þàðÀþÀüÀÿàø€xøøðÀ÷À|ÿÿøŸø~‡÷àø|>Ãÿð~?÷Ãøð?ÿàðÀüÀðþÀà€xðð?à€?ïÀøÿþð€|çóø||‡óðÿƒóðÿðððÀü€€€xøøƒðÀÃ÷ñüþøÀ~ÿãÿøþÏãÿø?ÿÿÁÿø?ÿŸüðàð€<€8ððà€?ÿçÿø \þ€~ÿÃÿóÿÿ?ÿãÿð?þÿÿðÿ¿üðÀÀ>xøøÿàÀ?ÿãÿøÿ€À~ÿÁÿñÿÿ¿ÿðÿðþÿÿðÿŸþðàxððÿÀ€?ÿÃÿàÿ€~ÿÿÃÿÿ?ÿàÿàüþÿàÿ?üðÀ>xøøÿÀÀÿÀÿàÿ€€~ÿ?€þßà?Àø<€0ðàxðàÿ€ÿÿ€ÿ~xðÀ>xøþÀ|~ðÀxð€~ðÀpøÀ~ðàxð€~ðÀð>ø?ð>€ðøÀ~ð@Àx€ü€ÿþüÿÀþ€?ÿøðÀ~ðüÀøÿàÿÿÀ?ÿþÿøÿÿàþÿÀÿðøÀ~Àð?Àÿàøÿðÿÿà?ÿÿÿüÿÁÿðÿƒÿð?ÿøøÀ~ àðÿðÿÀøÿðÿ‡ÿð?ÿþ?øÿÃãð?ÿ‡ÿð?ÿøøÀ~€øððÿøÿ€àüÿðŸÃ÷ðáÿøãàø?ÇãðøðÀ~?|?€øàðÿø?ÿÀÀøÀ@?Çð™þà>ÇÀø>Ïð7øøÀ~?€ÿ?À€üàðø|?ÿÀÀ|À>ïÀøüþà>çÀ|<Ï€ø;øðÀ`€Ý€~À?€ÿ€üÀðø|ÀÀx†|ï€øüþà|ï€x|Ï€øxøøÀðÿøøÿà~ÿð€?€ÿ€€üÀðø<~àà8ÿ€<ÿ€|þ~ø<ÿ€||ï€øøxøà?€Àÿãÿüüÿà~ÿð€?€ÿ~€øðð<~àÀxÿà|ÿ€|üü|ï€||ÿøøxøøÿàÀÿóÿüþÿð>ÿð€€€~€'>ð‡ð@|~àà<ÿð<ÿ€|üü|ÿ€<|ÿ€xø8øüÿàÀÿóÿøÿÿà~ÿð€þp`Ÿ<?ü0àaÿÿøÿÀàðø~ààxÿð<ÿ€|ü>|ï€||ÿxøxø?þÿàÀÿñÿøÿŸÿð~ÿ𠞀àÏÀüÿÿøÿ€?€ÿüþÿùÿÿøÿàððø~àà<ø<ÿ€|ü>çÀ|~ï€xø8ø?ÿÿàÀÿàÿ€ÿÿ¿à~‡ðàÿÿ?ÿÿàÿþÿàþÿÿüÿÿÀÿþÿÿýÿÿøÿàøðà~àà8ø>ï€|ü>çÀü|ï€x88ø?ÿÿÀÀÀ€þ?þà>ƒðÿðÿÿÿÿÿðÿ‡ÿ‡ÿðþÿÿþÿÿàÿþÿ‡ÿýÿÿüÿðüðÿ€~àà<x>ïÀ|Ü?çàü€>ï€ø88ø€ÀŸ€€üþà~ƒáÿðÿÿÿÿÃÿø?ÿÿ‡ÿðüÿ€ÿþÿÿðÿüÿÃÿüÿÿüÿðÿüðþ~àà<ø€>çÀøˆÃàøÀ?ÏÀðxøÎÀŸ€€üÞà~áÿøÿÿÿÿãÿø?ÿÿÇÿø?ü€þ?ÿƒÿð?øÿÁÿþûÿ€üùðÿþðü~àà<ð€Çáð€>ÃñøÀ?Çáð8ø?ÿ€À?øÜÀ~?ƒÿüÿÿŸÿçÿø?ÿÿÃÿð˜€>>?ÿðÿÀÿ|ûÿøñðÿþðð?ÀÀ<ðÀÏÃÿðÀ|ÿÃÿðÀÿ‡ÿà?ÀxøÿÿÀÀ~øÀÀ~?ñüÿÿ÷çáü?ÿÿÃùø€€~>>ÿø€ÿàþ|ûÿ€üñðÿþðð?ŸÀà<àÀÿƒÿð?ðüÿÿààÿÿààxøþÿàÀü`øÀ€~?àüÿÿÃçÀü?ÿÿÃñð€€|>>ÿð€ÿÀøÿ߀üñðÿüðÿü?ÿÀà<àÀÿÿàøøÿÀàÿÿÀàxøþÿðÀüøøÀ?€>?çàüÿÿÃ÷àü?ÿ‡ÿÃñð€€|>>ÿðœÿÀøÿ߀üáðÿüðÿþÿ€àÀÀþÿÀ?øðü?àü€àxøü÷ðÀùøøÀ>ƒóàüÿÿÃçàüÿÿÃñðž€|>>?ÿà¾ÿ€øÿ߀üáðøðÿþÿà?€Àp>ðàÀ`xø?øðÀñøüÀþ~ƒ÷àüûÿÃçáüÿßÿÃñðž€|>>?àà¾ÀøÿÿÿÃóøü<ðÿþÿàÿÀÀÀ8øÀðÀñø€þÀü>ÇóùüÿÿÏççûø~ßÿÃñøÿÿø~?ÿƒûðþÿÃþÿÿŸÿÇÿüüð€øÀüÀþ€8øÿðÀáø€þ?ø~Ïóÿøÿÿÿçÿøߟçÿøþÿüÿÿ¿ÿÁÿðþÿÇÿÿÿŸÿÏÿüüðàø€ø€8øüðÀáøÿøÿø>ÿáÿøÿÿÏÿÃÿðÿŸÿÿÿþþÿüÿÿŸÿáÿàüÿ‡ÿÿÿŸÿÏÿüøðàÀ€8øøàÀÿóÿüÿð~ÿÁÿðÿÿÏÿÁÿàÿŸÿÿÿþüÿøÿÿÿÀÿàøÿÿÿÏÿÏûøàðà8øÿÿàÀÿóÿü?ÿð~ÿÀÿàÿÿÏÿ€ÿàÿÿÿÿþüÿøÿÿ‡ÿÀ€ðþþðÀ8øÿÿÀÀÿóÿü?üð~ÿÀsÿÿ€þÿÿóøðp ðÀxüÿÿ€€Àÿñÿüüð>þüðàððà8øÿÿÿÀÿÀÿððà~?ððÀxü?þÿÀð>?øðà8ø?üÀà~øðÀ>xü?ðÀà>?øðà8ø?ÀÀ~?àðÀ>xüà>ðà8øÀ~ðÀ>xüÀ>ðà8øÀ~ðÀ>xüà?ðà8øÀ~ðÀxüà?ðà8øÀ>ðÀ>xüÀ?ðÀxøÀ>ðÀxüÀ?ðà8øÀ~ðÀ>x|À?ðÀ8øÀ~ðÀ>x|À?ðà8üÀ~ðÀx|à?ðà8üÀ~ðÀxüà?ðà8üÀ>ðÀ8üà?ðà8üÀ>ðàxüà?ðà8üÀ?ðà8üÀ?ðà8üÀ?ðÀ8üà?ðà8üÀ?ðà8|à?ðà8üÀ?ðÀ8üÀ?øÀ8üà?ðÀ8üÀ?øÀ8üÀ?øÀ8üÀ>ðÀ8üÀ?øÀ8øÀ~ðÀ8üà?ðÀ8üÀ~ðÀ8üà?øÀ8øÀ~ðÀxüà?ðÀ8üÀ~ðÀx|à?øÀxøÀ~ðÀx|à?øà<øÀ~ðÀx|à?øà<üÀ~ðÀx|à?øà<üÀ~ðÀx|à?øÀ8øÀ>ðÀx|à?øÀ8üÀ>ðÀx|à?øà8üÀ?ðÀx|à?ðÀ8|À?ðÀx|à?øÀ8|À?ðÀx|à?øÀ8|À?ðÀ8|à?øÀ8|à?øÀ8|à?øà8|à?øÀ8|à?øà8|à?øÀ8|à?øà8|à?øà8|à?øà8|à?øÀ8|à?øÀ<|à?øÀ8|à?øÀ8|à?øÀ8|à?øÀ>8|à?øÀ8|À?ðÀ>8|à?øÀ>8üÀ>ð€>8|à?øÀ>8üÀ>ð€>8|à?øÀ>8üÀ>ð€>x|à?øÀ8üÀ>ð€<x~à?øÀ8|À>ð€<x~à?øÀ<|À?ð€<x>à?øÀ<|À?ð€<x~à?øÀ8|À?ð€>x~à?øÀ<~À?ð€>x>à?øÀ<~À?ø€>8~à?øÀ8~à?ð€>x~à?øÀ<|à?ø€>x~à?øÀ8~à?ø€>x>à?øÀ8~à?øÀx>à?xÀ8~à?øÀ8~àxÀ8~à?øÀx~à?øÀx~à?øÀx>à?øÀx>à?øÀx>à?øÀ|>à?øÀ|>à?øÀ|>à?øÀ|>à?øÀ|>à?øÀx|à?ø€|>à?øÀ<|à?øÀ>x>à?øÀ<~à?ø€>x>à?øÀ||à?ø€>x>à?ø€x|à?ø€>x>àxÀx|à?ø€<x>à?øÀ8~à?ø€>x>àøÀ8~à?ø€<p>à?xÀ>x~à?ø€<p>à?øÀx~à?ø€>p>ð?xÀx>ð?ø€>p>øxÀx>ð?ø€>x>ðxÀx>à?ø€>p>ðxÀx>à?ø€>x>àxÀx>à?ø€>x>ð€xÀ8>à?ø€>p>àøÀx>àø€>p>àxÀx>àxÀx>àxÀ8?à?xÀx?àxÀx>àxÀx?ð€øÀx>àøÀx>à?øÀx>à?øÀx~à?øÀp>à€øÀx~à?øÀx>àxÀx~à?ø€>x>à€øÀx~à?ø€>p>à€xÀp~à?ø€>p?à€xÀx~À?ø€>p?à€xÀ8~à?ø€<p>à€xÀ8~à?ð€<p>à€xÀ8>à?ø€>p>à€xÀx>à?ø€>p?àxÀ8>à?ø€>x?à€xÀ8>à?ø€>x>à€xÀx>à?ø€>p>ð€xÀx>à?ø€>x?ðxÀ8>à?øÀx>ð€xÀ8>àø€x>ð€xÀx>ðxÀ>x?ð€xÀx>ðxÀx>ð|Àx>àxÀx>ðxÀx>ðxÀx>ð€xÀx>ðxÀx>ð€xÀx>ðxÀx>à?xÀx?ð€xÀx>à?xÀx>ðxÀ8~à?øÀx?àxÀx~à?ø€>x?àxÀ8~à?ø€>x?ð€|Àx>à?ø€>p?ð€|À8~à?ø€>p?ð€|À8>à?ø€<p>ð€xÀ8>à?ø€<p?ð€|À8>à?|€>x?ð€<À8>à?|€>x?ð<Àx?à?|€>x?ð€<À8>à?|€>x?ð€<À8?à?|€>x?ð€<À8?à|€>8?ð€<À8?ð|€8?ð€<À8?ð|À>8?ð€<À8?ð€<À8?ð€<À8?à€<À8?ð€<À8?ð€<À8?ð€<À8?ð€<À8?ð€<À8?ð€<À8?ð?<À8?ð€<À8?à?|À8?ð€<À8>à?|€x?ð|À8~à?|€>8?ð€|À8~à?|€>x?ð<À8>à?|€>x?ð<À8>à?|€>x?ð€<À8>à?|€>x?ð€<À<>à?x€>x?ð€<À8?à?x€>x?à€<À8?à?|€>x?ð€<À8?à|€>x?ð€<À8?àx€>x?ð€<€8?ð|€>x?ð€<€x?ð|€>x?ð€|À8?ð|€>x?ð€<À8?ð€|€xð€|€8?ð€|€8?ð€|€8?ð€|€8ð€|€8ð€|€8ð€|€8ð€|€xð€|€xð€|€8?ð|€8?ð€|€8?ð€|À8ð€|À8?ð?|€8ð€|€8?ð?€|€>8ð€|€8?ð?€x€>xð€|À8?ð?x€>xð€|À8?à?€x€>xð€|À8?ð?x€>xð€|€8?ð?x€>xð€<€8?ð?x€>xð€<€8?ð?x€>xð€<€8ð€x€>x€ø€|€8ð€x€<x€ø€|€8ð€|€>p€ø€|À8ð€|€x€ø€|À8€ø€|€>8€ø€|À8€ø€|€>x€ø€|€8€ø€|€8€ø€|À8€ð€|€x€ø€|À<€ø€|€8€ø€|€8€ø€|€8€ø€|€8€ø€|€8€ø€|€8€ø€|€8ð€|€8€ø€|€8ð|€8€ø€|€8ð?€x€8€ð€|€8ð?x€>x€ø€|€8ð?x€>x€ø€|€8ð?x€>x€ø€|€8ð?x€>x€ø€|À8ð?x€>x€ø€|À8ðx€>x€ø€|À8ðø€>x€ø€|À8€ðø€>x€ø€|À8€ðx€>x€ø€|À8€øx€>p€ø€|À8€ðx€>x€ø€|À8€øx€>xÀø€|À8€ø€x€>xÀø€|€8€ø€|€>xÀø€|À8Àø€|À>xÀø€|Àx€ø€|ÀxÀø€|À8€ø€|À8Àø€|À8€ø€|€8€ø€|À8€ø€|À8€ø€|À8€ø€|À8€ø€|À8€ø€|À8€ø€|€8€ø€|€8€ð?€|€>8€ø€|À8€ð?€x€>x€ø€|À8€ð?€x€>x€ø€|À8€ð?€x€>x€ø€|Àx€ð?€x€>x€ø€|Àx€ð?x€>p€ø€|À8€ð€x€>p€ø€|À8€ð€x€>pÀø€|À8€ð€x€>xÀø€|À8€ø€x€>xÀø€|€8€ø€x€>xÀø€|À8€ø€x€xÀø€|À8€ø€x€8Àø€|À8€ø€|€x€ø€|À8€ø€|ÀxÀø€|À8€ø€|À8ÀøÀ|À<€ø€|À8ÀøÀ|À<Àø€|À8Àø€|À8Àø€|À<Àø€|À<€ø€|À<€ø€|À<Àø€|À8€ø€|À8Àø€|À8€ø€|À8€ø€|À8€ø€|€xÀø€|À8€ø€xÀ>xÀøÀ|À8€ø€x€>xÀøÀ|À8€ø?€ø€>xÀøÀ|À8€ø€ø€>xÀøÀ|À8€ø€x€>xÀü€|Àx€ø€x€>xÀø€|À8€ø€x€>xÀø€|À8€ø€x€>pÀø€üÀ8€ø€|€>xÀø€|À8€ø€|€>xÀø€|À8Àø€x€xÀøÀ|À8Àø€|€xÀøÀ|À8Àø€x€8ÀøÀ|À8Àø€|À8ÀüÀ|À8ÀøÀ|À8ÀüÀ|À8ÀøÀ|À8ÀøÀ|À8Àø€|À8ÀüÀ|À8Àø€|À8Àø€|À8Àü€|À8Àø€|À8Àø€|À8€ø€xÀ8Àø€|À8€ø€|À8Àp|À8€x€8À|À8€x€xÀÿ¿ÿÀ |À8€ƒÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿïÿÿÿÿÿÿ¿ÿÿx€x€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀ|Àÿù† @€8ûÿÿïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø€>ßÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿpÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀ|ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÀ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€8?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ<¿ÿÿ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€xÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿp?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÏä@3|ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ8ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿæ€øÌÈ7ÿÿÿÿç¿ÿÿÿÿü€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðàp?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀ|À8ø€pÀ|À8àx€xð|À8àøx€xðþ|À8àþpxÀxðÿ||pÀÀ<à?€ðü?xÿ|ðÀ€ÁÀÀxð?Ÿáüÿ€|ÿ€|øÀð€Áàà8à>?çüÿÿ€xÿÀøðÀà€áàÀ8ð>?÷þÿÿÀ|ÿàøøÀðÀñààÂ0ð8à>|ÿþ|ÿÀ|ÃãøÿƒøáÎÃàÀð€ñãøÿ€Çü?xóøxð>|ÿþ|ÿÀ|ÁóüÿÇüñïçøÀñþãÞ<ùçüÿÀçþÏ|óü8à>øûþxÿ€|Á÷þÿïüóïïüÀóÿóž<ÿýïüÿÀçþÏx÷þxðøûþxÀ|À÷þÿÿþóïÿüÀóÿŸóÞ=ÿ€ýïóàçžùÏx÷þ8ðüÿþxÿÀ|ÁÿþùÿóïÏüÀóï¼óž=ÿ€Ÿïóàçžðx÷üxðÿÿÿÿ|ÿÀ|ÁÿÿùÿñïøÀñç¼sÞ=ÿ€ßïñàçžð8óü8ðÿ?÷þ~ÿÀ|ÁÿþñÿóÿøÀóǼž<ÿïñÀçžðÏ8ñþ8ðþãþ?ÿ€|ÁïþùÿóïüÀóǼÞ<ÿ€‡ïñÀçžñÏ8÷~8ðüÁü>?|Ççžùïóï|ÀóǼsž=ÿ€‡ï¼óÀçÏ=÷þ8ð`p |ÿÇþÿïþÿï|ÀóǼóŸ}瀃çüñÀçÏ?÷þ8ð|ÿƒþÇüÿÏüÀóÇ¿óýÿ€ƒãøñÀç?Ïóü8ð|ÿüÃüÎøÀñÇŸãüÿ€ÁðaÀÂáø8ðx ààÀñ‡Çøþ8à|À8à|@À8àxÀÀ8ðxÀ8àxÀ8ð|À8àxÀxðÿÿÿÿ<€ |À8à?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€xÀxð?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀ|À8à?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€xÀxðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€|ÿÿÿÿÿÿÿÿ‚D Üÿÿÿÿÿÿÿÿßÿÿÿÿÿÿïÿà8à?ÿÿÿÿÿÿÿÿÿÿÿÿÿýÿð0ÀÀ x?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüد€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€xð|ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀ8àxÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€xð|ÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿïÿÿÿÿÿÿÿáÿÿ~À8àxh€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðü<øxð|Àÿ€?à~x<àxÀ>ÿÀÿàþðxð|ÀÿàÿøÿøÀ8àxÀÇáûøþñÀpð<Àƒððxÿñàxà?ÀxÀà@xžñàpð?ðà|Àð<ñà8àðàx€Àðøáàxð?øð|?ÀÀžÀ€ðøáà8ð}øøáøÀxÿàÀžÀÃððÃàxð<ùü?Ï=çü?à|ÿàÀŸÀÿððÿþ8ð|ûþßýçþàxÿÀÀžÀÿðÀÿüxð?ûþÿý÷ÿð|øaÃØ‡žìàÀÿðÿ€ÿþ8àûþûÿùçÞûà|ðÿçþ?Çž?ÇüøÀÿáüøxð?óÿùïñ÷Ïùð|øÿóÿ?çŸ?çþÏøÀ?ñøÀà8ð?ãÿøáçžñà|ÿßÿ÷ÿ?çžïüÿßøÀáàðàxð?Ãÿøñ÷ñð|ÿϾûϽçŽ;ï¾ÿïüÀáàðà8ð<ÿùïñçŸùà|ÿÏ<óÏ?çž?ï?ÿïøÀÃÿüðàxð<ßùïùçŸÿà|ÿ<ûÇ¿çž?ïÿçøÀÃÿüøà8ð<ÿïýçà|ø<ûÇÿ÷žïÿ×øÀƒÿüø À8ð<ÿï}çð|ø<{Çÿ÷ž}ï¾ñÞüÀ?ÿüð8ð<ÿ?Ï<çŽà|ÿÏ<óï÷žïþûß|Àþð8ðö†à|ÿïxð|ÀxàxÀpð|ÀxðxÀ>xð|À8ðÀxÀ>pðÿà|À8ðÿ€ÀxÀxðÿÀà|ÿÀÀxðþ€À>|ÿÀÀxðÀ`‡ƒûþ?€|ÿàÀÀxð€ÿ?Çûÿ€|ÿÀÀÀxðüÿÿçŸÿÿÿÀ|>ÁžxƒðÀ8ðþÿç¿ûÿ¿€|>ïóÿçü?ÏÿðÀxðÿÿ÷¿ÿçž<ïûÿŸ÷ÿçÿðÀ8ðþøÿ÷¾{çž|>ÿûÿ¿÷ÿïÿàÀxðÌø÷þçž|ïÿÿ¿÷Ïø÷÷ÀÀ8ð€øÿ÷¾{Çž|>ûç¿ÿðÿ‡€ÀxðÀø}÷ÿÿçž|ÿçŸÿø÷ƒÀÀxð€ø÷ŸûÇŸ€|ÿçŸ÷ø÷ƒÀÀxðÀø÷ßûçŸÀ|ÿç¿÷Ïø÷ƒÀÀ8ð€x?çŸùÇŸ€|ÿç¾÷ÿ÷ƒðÀxð€pßùÀ|ýç¿÷ÿçƒðÀ8ðø|ýÇŸçþ?ǃðÀxðð|ýÃÇü‡ðÀ8ðà|€Àxð€|€À8ð|€Àxð|Àxð|Àxð|Àxð|Àxð|Àxð|ÀxðxÀxð?ÿÿÿÿÿÿÿÿÿü¼ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€|Àxð?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€xÀ>s3ÿÿÿÿÿÿÿÿÿÿÿÿ¾xð?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€|ÿÿÿÿÿïÿÿÿÿÿÿÿÿÿÿÿþÀ0 Ïïÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€xð?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø>ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€pð ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÜ|ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€xðxÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿð>ÿÿÿÿÿÿÿÿÿÿ¿ÿÿÿÿÿÿpð|z€'ƒsøŸÞàÀÿÿÿÿÿÿÿÿÿÿýÿÿÿ¸|ØxðxÀpø|ÀxðxÀ>pø|À8ðøÀ>pø|ÀxðxÀ>pøx|Àxðøx<À>pøü|>à8ðøÀ|~ÀpøüþÁ‡ÃüÃø|À8ðùÿ÷Ï¿çþÏøxÿpÀÀpø}ÿÏûÏ¿ÿ÷ÿïü|ÿø?9Ø~?àüƒðÀ8ðùÿßÿÏÿ¿÷ÿÿÿüxÿøÿ¼{ýÿóþÇøÀ>pøyÿßÿÏ¿¿÷ÿùÿþ|÷‡üÿžÿÿ?óÿïüÀxðù÷ßÿÏü÷ŸðŸü|ç‡üÿ¼{ýÿ¿÷ÿÿïüÀpø}óÏûϼ÷øþ|÷ÇüÿÞ}ýÿ¼ÿÏÿÿüÀxðyçÏÿÏü?÷Ÿñÿü|ÿÇüÿž{àÿ¼ÿ€ÿïüÀxøyóßÿϼ?÷ùÿ>|ÿãüž}áÿ¼ÿÀÿçüàxðyçÞûÿ¼?÷Ÿïü|ÿçþÿþ{áÿ¼ÿÇùïüÀxðyóßûÿ¼?÷ïü|ÿ÷þçÞ}áç¼ÿÏùï|Àxðyãßùÿ¼?÷?Çø|Áÿþÿßýáÿ¼{ÿïüÀxøxãÏñÿ<óŽƒð|€÷þÿßýáÿ¼{ÿïüÀxøÀ|€÷üùáÿ¼qþ?ÇøÀxø|sø?ùÀû˜püƒðàxø|Àxð|Àxð|Àxø|Àxø|Àxð|Àxø|€ xð|xø|xðxxøÿîÿÿÿÿÿÿþ|Ó¿ÿÿÿÿÿÿÿÿÿÿÿàxðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀxãÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðxøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà|ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþxðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀxÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþðøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀ|ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿûüÀÿ¿ÿüxðÿÏÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ³ßÀxÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿï@ðø<@xðxðø|xðxpø|xðø€?Àðø|àðxðÿÀ<xÀÿððøÿà>À@|`àùøxðÿàà<àà<x<ÀÀàÀà0à`ððøððøÿàð>àð>|>ààðàðxàðøðxþxðƒáð0<ààqÀx8c¸|x~à€øÀðààøÀÿðøðøþpøùü~>ãøÀÃñàü€Çÿðÿ<{þ€|?àÀ|àðààüàÿøüøø?ÿxð>ûýÿ<ïýãïùãü€?ïÿûÿ|÷ÿÿx?àðàøÃÀð@àÀà 8üÇ?ðøýðÿðøÿÿÿ>ïÿóÿýóþà?çÿûÿ¼ÿÿÿ€|?‡áüÏãøÿÀþÏãÀñøáøáø?ŸÜy¸~üç€ðüð>€pð}ûÿ<ïþóßýçþÿàï¾ûÏü÷ÿx?çþÿïïùÿ¿Àþÿ¿ßóÀ?óø÷ü÷üÿ¿ü÷ùÿüÇ€Àxà|€ðø>ùÿžïþûß}÷ßÿà?÷žçü{Ï>|?ÏçþïÿýÿßàÿÿßßñÀ?÷æçü÷üÿÿü{ýÿ€<Ç€à |ð|Àpð?ñÿ¼ïžÿþ=ïÿà?ÿž{ÇüóÏ<x?ÏçŸûçÏýÿßÀý÷ÏóÀ÷þïüçýÿß<ûûÿ€ |‡€ðxÿðx€ðø>ùÿ¾çŸÞ>÷€ÿà?÷žÇü{Ͼ|?Ï÷y÷ÇýóÏ€yóïùà|÷ÿçþÇþñÏ<{óÿ€<‡€ð|ÿøxÀxø<óÿ¼ïžž=çÿà÷ž{ǼûÏ<x?ÿçyç‡ýãÏyãïóÀxÿÿãþÇýà<ûÃÿ€|‡€?øxðøøÀðø~ûÿ¾ïŸ?Ÿ=÷ßùà}÷žç¾ûϼ|=ÿ÷y÷ÇýóÏyãïûÀx÷ÿçþÇÿð<{Ãÿ€<‡À?ü|ð|xÀxðüÿÿ¼ïž?ýçþÿàÿžyÿ¿ÿÏ?|=ýçqçÏýãÏyãÏ?ûÀx÷ÞïþÏÿóÏ<ûÃÿ€<ÿø||à|Àpøüÿÿ¾ïž?ýóÿà?÷ž}ÿûÏ€|<ý÷y÷Ï=ãÏyóÏ>ùÀ}÷ï¾ϾóÏ<ûÃç€<ÿø<|à|Àpøøýÿ¼çùãþÀ?ç 8~ó‡|<ý÷þyçïýãÏÀ~ÿÏÿûÀ÷ÿïþÏþÿÏÿûÁÿ€>ÿð<xà<|€pøð<ÿœçðàü€<|<ùóþyãÿÿãÏÀ~ÿÏßûÀ?óÿçþÇþÿÏÿûÁÿ<ð<|8ð<~€xø|xáüpã÷ýãÏÀ>‡ÏùÀñþçþÃþßóÀþ<€|xüð|?€pø|0`p0Áãüá‡À‚€àøãìÀƒÁ€<<€||þÿü?Ÿpø|<€ü|þÿøÿðø|<€ø|þðþpø|<€ð8þ?àüðø|ðþðpø|ÿÀ~pø|ÿ€>ðø|þ|ðø|ø|ðø|À|àðø|xððøÂ@gÿÿÿÿÿÿÀ|`Aÿÿÿÿÿÿÿÿÿÿÿÿÿþðø?ÿÿÿÿÿÿÿÿoÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€xÿà€‚PðLzƒÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðø?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀ|ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðø?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀ|ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþðøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€|ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýþCÀü P`øðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ逸ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÉy€€ðø|`ðøxðø|ððxðø|ððøàø|ðøqÀxàøpyà|ðøðùàÀxàðøøÀyðà|ððøðÀûàƒàxðÀðøø ƒðøyóýð~óø|øàðøñÿçóüùçÿùÿ?÷øxøƒðî<7ƒàøðøùÿŸ÷ûþy÷ÿýÿ¿ûø|üãüÿÿ?çùü?€ðøûÿ¿÷÷þùïÿûÿ¿ûàxøïüÿÿ÷ûþÀðøùÿßûãþyçßÿþyà|¼ÿþÿÿ¿ÿûÿàðøùçŸóãþyçžÿ¼yàxþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿÿÿøøÿÿÿûÿþ|Àü|þÿ€xà?ðüðxþðøþ~ÿÿüÿÏþüÿàþÀûÿà|?Ÿ¿ÿÿ?ñÿŸÿ>þÿà~ðÿøþx<ÿpøü}ÿÿüÿÿÿ?ýÿÀþÁóÿàø?Ÿÿÿ~óÿ?ÿ|þÿàüàÿøüøxÿðüÿ~ÿÿüÿÿÿ€?þÿàÿáûÿð|Ï¿ÿÿ€ûÿ¿ÿ~þÿðþá€ÿøþ~|ÿÀðøÿ}ÿøÿÿ?€ýøþ?áóóðx?ßçþÿÿÿ~?|øÿðüÇ€Ãðüø>€ðüÿþÿà~?À?þÿÀÿ?ñûñø|ÿ¿þÿ€ûÿ~~üÿðþãÀðü?ø>Àðøÿýÿ‡À~~€?üÿÀþáóáðx?ÿáøÿ€óþ| |üÿðüÇ€à|?ð|ÀðøÿþÿÇà~~ÀüÿÀþ?ðûñø|?ÿ¿ðøÿ€ûÿ~?~þÿð>ÇÀÀ|?ø|àøøÿýÿÇà~~€?üÿÀþñóáðxÿ?ñøÿ€óÿ|~üÿà<Ç€ð|ø|ÀðøÿþÿÇà~~ÀþÿÀüùùñø|?ÿ¿ðøÿÀûÿþ?¾üÿð>ÇÀü|þþ|àøøÿýøà~~€?~øðÿùóóðx?ÿøÿÀûþ~?~Àûà<‡€ü|ø>|àøxýüüà~?ÀÿàÀÿýû÷ð|?ÿ>øÿà~ûð??¿ÇÀýð>ÿðþ<ø|àxøùüÿçà~?ÿ€?þÿà€ÿýûÿðx>?ñøÿà|ûÿ?ÿÿþùð>ÿó ~|ð|àøøüþÿçà~ÿ€þÿðÀø}ûÿà|??¿øøÿð|ûÿ¿ÿ¿ÿÿýð>ÿù<ð~àxøøüÿçà~ÿüÿàð}ûÿÀ|???ùøóð|ûÿŸÿÿþùð<ÿð>|ð>Àð||~ÿãà~þüÿà€ð<ùÿ€|?øøÁð~ûÿÿ¿÷þyð>à><<ð?Àøøp<ÃÀ<øÀ|ðøð?€øü|>À|<þÿþÿ€xøx>Àü<þüÿx|8>€ø<ÿ?øÿxü€øÿðþx|ð~€øx|À>x|ÿ€>x|þ>ø|ø<øø8xøx|xøø|xøøÿÿÿç;?ÿÿÿÿÿÿÿÿÿÿÿÿŸà!ÿÿÿÿÿÿÿÿÿ/Çÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøßà€ `ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷Ï iaxmodem-1.2.0/lib/spandsp/test-data/itu/fax/Makefile.in0000644000175000017500000004766411150047457022430 0ustar julienjulien# Makefile.in generated by automake 1.9.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = ../../.. am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd INSTALL = @INSTALL@ install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ noinst_PROGRAMS = generate_dithered_tif$(EXEEXT) \ generate_sized_pages$(EXEEXT) subdir = test-data/itu/fax DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/config/ax_compiler_vendor.m4 \ $(top_srcdir)/config/ax_check_real_file.m4 \ $(top_srcdir)/config/ax_fixed_point_machine.m4 \ $(top_srcdir)/config/ax_misaligned_access_fails.m4 \ $(top_srcdir)/config/ax_c99_features.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/src/config.h CONFIG_CLEAN_FILES = PROGRAMS = $(noinst_PROGRAMS) am_generate_dithered_tif_OBJECTS = generate_dithered_tif.$(OBJEXT) generate_dithered_tif_OBJECTS = $(am_generate_dithered_tif_OBJECTS) generate_dithered_tif_DEPENDENCIES = am_generate_sized_pages_OBJECTS = generate_sized_pages.$(OBJEXT) generate_sized_pages_OBJECTS = $(am_generate_sized_pages_OBJECTS) generate_sized_pages_DEPENDENCIES = DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)/src depcomp = $(SHELL) $(top_srcdir)/config/depcomp am__depfiles_maybe = depfiles COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ SOURCES = $(generate_dithered_tif_SOURCES) \ $(generate_sized_pages_SOURCES) DIST_SOURCES = $(generate_dithered_tif_SOURCES) \ $(generate_sized_pages_SOURCES) am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = `echo $$p | sed -e 's|^.*/||'`; am__installdirs = "$(DESTDIR)$(datadir)" nobase_dataDATA_INSTALL = $(install_sh_DATA) DATA = $(nobase_data_DATA) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMDEP_FALSE = @AMDEP_FALSE@ AMDEP_TRUE = @AMDEP_TRUE@ AMTAR = @AMTAR@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CC_FOR_BUILD = @CC_FOR_BUILD@ CFLAGS = @CFLAGS@ COMP_VENDOR_CFLAGS = @COMP_VENDOR_CFLAGS@ COMP_VENDOR_LDFLAGS = @COMP_VENDOR_LDFLAGS@ COND_DOC_FALSE = @COND_DOC_FALSE@ COND_DOC_TRUE = @COND_DOC_TRUE@ COND_MMX_FALSE = @COND_MMX_FALSE@ COND_MMX_TRUE = @COND_MMX_TRUE@ COND_SSE_FALSE = @COND_SSE_FALSE@ COND_SSE_TRUE = @COND_SSE_TRUE@ COND_TESTDATA_FALSE = @COND_TESTDATA_FALSE@ COND_TESTDATA_TRUE = @COND_TESTDATA_TRUE@ COND_TESTS_FALSE = @COND_TESTS_FALSE@ COND_TESTS_TRUE = @COND_TESTS_TRUE@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CPPFLAGS_FOR_BUILD = @CPPFLAGS_FOR_BUILD@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DSYMUTIL = @DSYMUTIL@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ GREP = @GREP@ INSERT_INTTYPES_HEADER = @INSERT_INTTYPES_HEADER@ INSERT_MATH_HEADER = @INSERT_MATH_HEADER@ INSERT_STDINT_HEADER = @INSERT_STDINT_HEADER@ INSERT_TGMATH_HEADER = @INSERT_TGMATH_HEADER@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ NMEDIT = @NMEDIT@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SPANDSP_LT_AGE = @SPANDSP_LT_AGE@ SPANDSP_LT_CURRENT = @SPANDSP_LT_CURRENT@ SPANDSP_LT_REVISION = @SPANDSP_LT_REVISION@ SPANDSP_MISALIGNED_ACCESS_FAILS = @SPANDSP_MISALIGNED_ACCESS_FAILS@ SPANDSP_USE_FIXED_POINT = @SPANDSP_USE_FIXED_POINT@ STRIP = @STRIP@ TESTLIBS = @TESTLIBS@ VERSION = @VERSION@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ AM_CFLAGS = $(COMP_VENDOR_CFLAGS) AM_LDFLAGS = $(COMP_VENDOR_LDFLAGS) PBM2G3 = pbmtog3 FAX2TIFF = fax2tiff EXTRA_DIST = itu1.pbm \ itu2.pbm \ itu3.pbm \ itu4.pbm \ itu5.pbm \ itu6.pbm \ itu7.pbm \ itu8.pbm \ test1.pbm \ test2.pbm \ test3.pbm \ test4.pbm nobase_data_DATA = itutests.tif \ itu1.tif \ itu2.tif \ itu3.tif \ itu4.tif \ itu5.tif \ itu6.tif \ itu7.tif \ itu8.tif \ test1.tif \ test2.tif \ test3.tif \ test4.tif \ dithered.tif \ 100pages.tif \ R1200_1200_A4.tif \ R1200_1200_B4.tif \ R1200_1200_A3.tif \ R600_1200_A4.tif \ R600_1200_B4.tif \ R600_1200_A3.tif \ R600_600_A4.tif \ R600_600_B4.tif \ R600_600_A3.tif \ R16_800_A4.tif \ R16_800_B4.tif \ R16_800_A3.tif \ R16_154_A3.tif \ R16_154_A4.tif \ R16_154_B4.tif \ R300_600_A4.tif \ R300_600_B4.tif \ R300_600_A3.tif \ R300_300_A4.tif \ R300_300_B4.tif \ R300_300_A3.tif \ R8_154_A3.tif \ R8_154_A4.tif \ R8_154_B4.tif \ R8_77_A3.tif \ R8_77_A4.tif \ R8_77_B4.tif \ R8_385_A3.tif \ R8_385_A4.tif \ R8_385_B4.tif generate_dithered_tif_SOURCES = generate_dithered_tif.c generate_dithered_tif_LDADD = -ltiff generate_sized_pages_SOURCES = generate_sized_pages.c generate_sized_pages_LDADD = -ltiff all: all-am .SUFFIXES: .SUFFIXES: .c .g3 .lo .o .obj .pbm .tif $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu test-data/itu/fax/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu test-data/itu/fax/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh clean-noinstPROGRAMS: @list='$(noinst_PROGRAMS)'; for p in $$list; do \ f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ echo " rm -f $$p $$f"; \ rm -f $$p $$f ; \ done generate_dithered_tif$(EXEEXT): $(generate_dithered_tif_OBJECTS) $(generate_dithered_tif_DEPENDENCIES) @rm -f generate_dithered_tif$(EXEEXT) $(LINK) $(generate_dithered_tif_LDFLAGS) $(generate_dithered_tif_OBJECTS) $(generate_dithered_tif_LDADD) $(LIBS) generate_sized_pages$(EXEEXT): $(generate_sized_pages_OBJECTS) $(generate_sized_pages_DEPENDENCIES) @rm -f generate_sized_pages$(EXEEXT) $(LINK) $(generate_sized_pages_LDFLAGS) $(generate_sized_pages_OBJECTS) $(generate_sized_pages_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/generate_dithered_tif.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/generate_sized_pages.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ if $(LTCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs distclean-libtool: -rm -f libtool uninstall-info-am: install-nobase_dataDATA: $(nobase_data_DATA) @$(NORMAL_INSTALL) test -z "$(datadir)" || $(mkdir_p) "$(DESTDIR)$(datadir)" @$(am__vpath_adj_setup) \ list='$(nobase_data_DATA)'; for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ $(am__vpath_adj) \ echo " $(nobase_dataDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(datadir)/$$f'"; \ $(nobase_dataDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(datadir)/$$f"; \ done uninstall-nobase_dataDATA: @$(NORMAL_UNINSTALL) @$(am__vpath_adj_setup) \ list='$(nobase_data_DATA)'; for p in $$list; do \ $(am__vpath_adj) \ echo " rm -f '$(DESTDIR)$(datadir)/$$f'"; \ rm -f "$(DESTDIR)$(datadir)/$$f"; \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ list='$(DISTFILES)'; for file in $$list; do \ case $$file in \ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ esac; \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ dir="/$$dir"; \ $(mkdir_p) "$(distdir)$$dir"; \ else \ dir=''; \ fi; \ if test -d $$d/$$file; then \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) $(DATA) installdirs: for dir in "$(DESTDIR)$(datadir)"; do \ test -z "$$dir" || $(mkdir_p) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-libtool distclean-tags dvi: dvi-am dvi-am: html: html-am info: info-am info-am: install-data-am: install-nobase_dataDATA install-exec-am: install-info: install-info-am install-man: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-info-am uninstall-nobase_dataDATA .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstPROGRAMS ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-exec \ install-exec-am install-info install-info-am install-man \ install-nobase_dataDATA install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-info-am \ uninstall-nobase_dataDATA clean: rm -f *.tif *.g3 itutests.tif: itu1.g3 itu2.g3 itu3.g3 itu4.g3 itu5.g3 itu6.g3 itu7.g3 itu8.g3 \ test1.g3 test2.g3 test3.g3 test4.g3 $(FAX2TIFF) -M -o $@ itu1.g3 itu2.g3 itu3.g3 itu4.g3 itu5.g3 itu6.g3 itu7.g3 itu8.g3 \ test1.g3 test2.g3 test3.g3 test4.g3 100pages.tif: itu1.g3 itu2.g3 itu3.g3 itu4.g3 itu5.g3 itu6.g3 itu7.g3 itu8.g3 \ test1.g3 test2.g3 test3.g3 test4.g3 $(FAX2TIFF) -M -o $@ \ itu1.g3 itu2.g3 itu3.g3 itu4.g3 itu5.g3 itu6.g3 itu7.g3 itu8.g3 test1.g3 test2.g3 test3.g3 test4.g3 \ itu1.g3 itu2.g3 itu3.g3 itu4.g3 itu5.g3 itu6.g3 itu7.g3 itu8.g3 test1.g3 test2.g3 test3.g3 test4.g3 \ itu1.g3 itu2.g3 itu3.g3 itu4.g3 itu5.g3 itu6.g3 itu7.g3 itu8.g3 test1.g3 test2.g3 test3.g3 test4.g3 \ itu1.g3 itu2.g3 itu3.g3 itu4.g3 itu5.g3 itu6.g3 itu7.g3 itu8.g3 test1.g3 test2.g3 test3.g3 test4.g3 \ itu1.g3 itu2.g3 itu3.g3 itu4.g3 itu5.g3 itu6.g3 itu7.g3 itu8.g3 test1.g3 test2.g3 test3.g3 test4.g3 \ itu1.g3 itu2.g3 itu3.g3 itu4.g3 itu5.g3 itu6.g3 itu7.g3 itu8.g3 test1.g3 test2.g3 test3.g3 test4.g3 \ itu1.g3 itu2.g3 itu3.g3 itu4.g3 itu5.g3 itu6.g3 itu7.g3 itu8.g3 test1.g3 test2.g3 test3.g3 test4.g3 \ itu1.g3 itu2.g3 itu3.g3 itu4.g3 itu5.g3 itu6.g3 itu7.g3 itu8.g3 test1.g3 test2.g3 test3.g3 test4.g3 \ itu1.g3 itu2.g3 itu3.g3 itu4.g3 .g3.tif: ${FAX2TIFF} -M -o $*.tif $*.g3 .pbm.g3: ${PBM2G3} $*.pbm >$*.g3 dithered.tif: generate_dithered_tif$(EXEEXT) ./generate_dithered_tif$(EXEEXT) R1200_1200_A4.tif \ R1200_1200_B4.tif \ R1200_1200_A3.tif \ R600_1200_A4.tif \ R600_1200_B4.tif \ R600_1200_A3.tif \ R600_600_A4.tif \ R600_600_B4.tif \ R600_600_A3.tif \ R16_800_A4.tif \ R16_800_B4.tif \ R16_800_A3.tif \ R16_154_A3.tif \ R16_154_A4.tif \ R16_154_B4.tif \ R300_600_A4.tif \ R300_600_B4.tif \ R300_600_A3.tif \ R300_300_A4.tif \ R300_300_B4.tif \ R300_300_A3.tif \ R8_154_A3.tif \ R8_154_A4.tif \ R8_154_B4.tif \ R8_77_A3.tif \ R8_77_A4.tif \ R8_77_B4.tif \ R8_385_A3.tif \ R8_385_A4.tif \ R8_385_B4.tif: generate_sized_pages$(EXEEXT) ./generate_sized_pages$(EXEEXT) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: iaxmodem-1.2.0/lib/spandsp/test-data/itu/fax/test2.pbm0000644000175000017500000104125511150047204022101 0ustar julienjulienP4 1275 1745 ``` ÿÿøÀÀ00Àê€ÿÿÿÿà0€0>8ð€ÿùÀ0þÀ0ˆ0€0À€p0ÿP8À €À0ô88àÀ`0€ø8À€0 0¿ûÀ&€È08xÀà0À?øxÀ<ÿò€ 0vðx<0pàÀ00À0 øÀ|က€ 000€` àppc€08`@0ð ÀüÀ€€€p0ðàpÀð€pà€w}ü0À8`@0ðÀÜÀ 9À€€`0gÀpÀð€pàÀ>Àðà?ÿÿà@@0pÀÜààà/À0€ À`p ÀÀ0pø€`àÀ<€p#`?ÿÿà@À0 p!Àœà`?à0€Ì`p ð€00¼À\`À@0f`xÀ àÀà080€ø`à 8€0žÆø`À@<0|f`p€àÀ ÿ0 0 € àÀ08‡ÿ`À0|0þl`?üpààÀ ø8`0Àà 80ƒÀð@ÀxÎ 0ì`v~>`øàÀpà00ƒÀ< €8pÂÿÀ@vÇ 0ØaæLà<<Àà À0ÀøÀð €8À¿ÿèÀ@ÿø ƒ 0 0Øc†€ÀpÀà @0€üÀ À8ÿðÀç€ 0 @ðgÀÀÀÀà À0 ŸÀŒ àà08ðpÀÀ€ 0 ðüÀÀÿ€8Àà`8ÀÀ  `ÿü1à€8À€À 0àø À€ÿÀþxÀÀ`àðÀ€ `óŸ3€€À` 0#àð À€çü?üàà8€80ÿ€>À pÀÀ>€À€x8ÀcÀ` À€€€À 0ÿø8ÿ€€À pÀÀ;€À<ø€ÿãÀ ¿€ € À  àüà€à€à0À1€€€ÀÿøÀÃÀÿóÀðü€€à8À1à€€@?ÿÿÿà9€ Ðÿ€À€€€€8>€ÿÿþü€?à€€dÿøüÿÿ?ÿØ~€€ø€/þP À€ ø€ ~@üÀ `@@€ü0À€ÿ€À<0pÀ 0ü 0pÀpÀ0À À €0 À xø €€0À øpà €€Œ|À° x€€` €€Ÿî€À0€€ø€@pÀ À€Û‡øÀp€€80ø€8`>ÀÀ @ùÃÀ€`€À0À?üø Àà€p`{À `ðç ~ÀÀ8`€À`Àðœàðx€` Á€€ `ð~€ ò€€à00`€`Ààp ¸qÀÀÀ1€À€ 0ð|€ÀÀ€À00@1€p ð;€ÀÀ7@€ 0ð<ÀÇÀ€€àÿè0@p à€À€6``8À8Ïð €ð?ð0À€pÀ€À€> p`8À~ü8'€ž>@0€ÿøp8À€À0à`8Àoð8Ç€< €p8p8€À€0€ `8ÀãððÏ€€€ €p;p€À€0ÿþ˜?`8ÀÁÁà€ÿ€€€ à3€pÀ€0€ÿø`8ÀÀÁÀ€øÀÀ€ Àa€p @€0 ?À`àÀÁ€€@@€ÿ€ €ÀÀp 0 8àÀÀ€@| ÀÀüp Œ8`ÁÀ€0€`p`Ü 8ƒ@m€€800`|à0Ç?€00 À>?€0Æ80Ì<€?ø0vü8€00>8|x00xp08x 08x00€8<0Àd0xÀ9`0€ƒ M€< l?þ×  à €$ø= ÞzâÀø€ ¡þ`€ü€ € 0àÀ €X``0 € 8`ðþ8 @†ð`€`<ðÀpx˜x€px @ à<?ð€`@€Àp0~üÀà`áü€0€à`þøÀÀ`÷ÿ€€ÀÀ€0ð@ðÿÀÀÀa¿à€8 ÀÀ`xø€€àÀÀcpÀ06Àð`ÌÀ À€'À` 6@p ü€À8 Æÿÿ <0À€~À`@ |@ððÀ àþ ‚1€ÿ€€x`À€|Àÿà@ `ø0à@ÿç€ ƒq€È@àÿøÿàÀÀ€<À<3À à‚€ Ž 0`0`ýÀ!á€`pÿþÿðà€xà#€, @4†pþ àp``p!Á€`ð>à€8ÀC€@$ `0 À0ƒÀ`"À€` €à€0À€@d8€€ À0ÿ€`€"€À0` €ÀÀÀ@@ ```€À@À0?ÿ`€&€À?ü`€ÿøàÀ€@  @û@€€0 €`$Àø@€ÿð``@  @ à!€€0€`<ÀƒÀ €``A€ @03€0€`ÿø Àÿ€ €à0€@ÿ0€`ÿÀÀz<€€>àÀ8€@ 0€`ð0ÀpÀÀþàÀp€ 0À`p@àáþà€p0À`àÀÿüÀ !€À`ÀðÁ`€ €€ÀÀ€@€°y€€Ààp@ À@à€8p €?üp80@€ñà °€€À`€€`Àÿà à€?€€À0ðÀ`€Àÿà;0 à€0€`y°ß À@áÀÀøs`Àÿà€`Ý8þ€àüã€ÀÀà€``à?üƒ€À 9‡ðà €8`‡0<ÀÀà€|€ `(<€ 0pØÿÿà€à€p8`à€00€`{€ÿü€À€ @p0à€0ÀáÀ€ÀÀ€p0€0€PÀ ÀÀ €ààÀ€0 €˜1ü˜x`€@ð;€ aøÀ€< Àp?üÎà01@ÿðs7¾À€þ0`À0`?àx1`þc 8>€À€ð0 À`` 3` p<ÀÀ À0ø €``82` `8ÀÀÀ0?À0€À` p"`à0àÀ`þ€@ `"`Àp`À€0€@?ø b`€`À€  ?ø bÀ¯à`À€ ~€0À8cÀÿà`À€@>pc€ü€€ àaƒ€€ €€ø€`ÿ€ €€`|€ˆ@ø@x@@ @<@x`@   €0     €€þ€ @0À@0 À@ÀÀÀÀÀ€ @ ú€€€`?à€€€`€€A€@€€&€`0 €€ f1€`0 €€€B 0 À €€ 0@€€ÿ8€000À€0`À0 @À`@À@À@À@ÀÀÀÀÀÀÀÀÀÀÀ@À=ð@Àáü@€€@€@€À@€`@€88@€`@À @€@@€@€@ À@@@ƒÞ cû0·ÿ Ä 0 @8o¨,ߟÿÿë×êH0 @pü€ãä"``0@ø€àüÀ0€ûÿÀ`€@?Ø€€@€0?€àÀÀ@À0ð€À0 à0cðð.ÀpÀ@ð0Àü À0 08àÀ ÷8ø€à@@ $ ðÀ px8 Àü8|€À@ 0@0À 0ðà8ð<x8Á¶€xp€€@ p@ € øà8ð<0øÃÀ3ðÀðÀà@& ÀÀ Àþp|pø ÃÀ0<€ð8ÀÀ@ 0pü0Àƒ€pàX8ÃÀ0ð0€€@`þ0<ÿ€ðÀÀp ÀàÁá€0ð00€‡@@ â€3ÿ€þàÁ€àp àÁ¿€0p?ðŽÀÀ€?‡ÀÀa€`0ÀÀ{€ †pÿÜÀ€€<ÀÀa€80 àÀ`€pÿxÀ€xÀà€`À8   0À`€ƒ€pàpÀ€€0à`p0€ øÀ`€ƒþpÀðÀ €ÿ0à.`~8ààd€ƒÿ€pÀp@˜À€0àü ø€øàfÀpÀà`ŒÀ @À ð`þÀà0ÀðÀÀð?øþðÀü@À?€€¼ €ÀÀ@ À À À À €À€À€0ÀÀpÀ€–ïÿ¿kÿÿþÿ?þ`pÀÀÞ@?~ùÿ\ßÏÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿïÿßÿÀ`àÀ ÀgÄ?:™{*×ÿûÿÿýÿÿÿ'?ÿÿåÿÿ,8¥ Àÿÿÿÿï_ðüì~¶¼ „H‚ ™Oÿÿÿÿ÷ÿßÿÿÿÿÿÿÿÿÿÿÿÿÿïÿýÿÿÿÿÿÿÿÿÿÿÿÿ÷ÿÿ¼Oýd@Ÿ(@0€Ñ€£³ÿøÝýù½ÿÿúwÿþÿþÿ· Cä;ƒÆÀ€8p€0€À ÀÀ€<ÀàpÀ <ààÀð|€0Àxÿü 0À0 Àðk00øÀ0ø>ÿÀø `x€áÀð€þ0»˜À übÀ€˜Àüà€Àà€¸€@†ð0  À``8à‚€ ¼ÀÀÀ 1ì€À`À80 80À@àxÀð€38€ÀaÈÀÀ` €0üp00`À€À \€0a08€0CÈÀÀà 0p ü`à`ÀÀ€àŒ  Á€`0`ð€Àà8p€ÀàÀ€À à`Á€`à€8À p€óÀ0p Á€0€à€Àà Á€€`À€?8ø8€À`à ‡p€0€€B?à 0 €@€`'8?0|€àÀ`€ÀBüà`? @€ø` À`n€À€ À8þ†?ðÀ À@€ÿÀ€Cþ ð@F€ƒà0üÌ x€À€à~ €O0€G ÿþøÿÀ0°X€À€00€|p€Cøâ>€0øx€àð 9üp€À0øfðð8p0€ àø `?üp ÿÀ ?üðÿÀ~À àx€ À ð`|?ø7ø ðàÌ€ @< @ð?ð ÿ†À ø þ<@€€À à ð@À€ €À8@€`ø `€à € üð€?ø`€>àüî€ ü`€üþ€0þwü>àøøúà>ø?à8x `0€€à€0€€àÀÀ0À@ðàÀ8`@À Àp€ÀÀàpÀÀÿ€0p@ `Àð øÀ ÿ€Àÿà€àÿÀxà0 `€âÀ ð0Çø<ààóø^Ü0€GÀ`ÀÆÀ| 0Ç<~ŽA¼Ã00€ €N``Àƒ80 À`ì  xÄ€ðÿ€O¸Á€00À €`Ü`€ÀÀ<  €@à`Ì`üÀÀ Ài `1ÿàA€`À Àø0à?ÿð èîp 1€@à`€0`ŽÀÀp€Aˆ0#ÿÀO``@ð0 ð à?ÿð~ÿ€äøï¾ 0€`à 0ð0` ÀÀp˜‚``  à0ø pÀ?ÿ€?ÿ ÎØî`àÀ`à=°8`À À€ð ?ƒÀ `0@À0œøð€Àp€?à ǘ<`À`à?ð`ÿÀÀØ0`ð0 0 À0 þà<Àø€À@@`0ð@ó€€À<Ø  0€|0ü  €0>Ç1àpÀž€ÀžÀ@`0à€À€±€Àø @€à80€0<ƒ?à€`ÀÀÀ8ž<€`0à€À à€Àü`€€€€0 0à0<€?À€`ÀˆÀ€À8 ?ž `00ÀÀÀÀÀ/`0 ÀÀ`€008À?€@ÀÀŒÀ9ÀÀ8þÇ0`>8ÀÀÀ|`À€  0qàÀÀÀ<808À?`ÀÀ„ÀàÀ €l0à?8À€Çþ`À€> `ùà`À 1€?€€>8ppÀ?€ÿàÀ?à†ÀÿàÀÿð0À0€€þ`ÀÀÿx Ààà`ü€ € cÀ9Á€à<|`p€?ÀÿÀCü`ƒü`ÀÿþÀ0€€|8`À@ ã€ð0À ààð€ € Æð8Á€{€0<|`p€€òð`0ÿð``p}¸0€p0€ø 0À€@À€0üïÀÀ ` Èüpà€ñÀ8<Üàp ?€0@` `ðÀ0€`0€€0ÀpÀ€ÀÀÿ€ù<ÿÀ?€0 ÈŒpàÀ@ÀÀ` ü0`Ààpà0€€ø0` ÿ€ÀÀÁü€ÿü0?Ãü`  ÐpàÀ` À` øø?À?ðÀ0€€à`8@ ÿ€CXð ŸàÀ À0`Àp€`À€?à|À €`0€ÿ€`ø0€ À8À0€€àxÀ@ €üÀð€ 8À<@ð€À`00€ ð`p@@€€0`àpàÀ€€0 À8€ÀÀ0 €ÿŽ€À 0  €øüÀÁ ü 1À€ÿÀ€>À€x€ø€þpÀ€`ààÀÀ`0ÀÀ 00Á€0 Áø8 €0° €0ð €ÀpðÀ``ðà0ÀØp?0€Œ0ÿ€00üpÀpáàÀ`ÿÀ€€ ?üpþ |00 00088 pàÿÀþ ÀìÀ0``@ À€€€x0/€€øx;À ÀpøþyàÀ ø9ÏpðÀƒø1Ãàp€`3ƒ81àp<À 0`1‚<1Áðpî8Î`0€``aÆ|qÁøpnq†`8À``þ3Ççpãßð> àñ† pøÀ@`?ü?Áƒpƒ~ pñpüÀ``Àp>f pq` ð€ €``@p 0x€aà0€€``` 0x€aÀ0€€`þ@`€€ 0ÌÀ` 80€ ò@CG€ ÀÌÀà8€p `À`€@@8Ãÿïüÿ€ ÀÀÀà` 0À @ÀxÿÀü?€ °ÿþÀÀÀ À@ `À8@ÀÌàÿ€3?ððúÀ@à?ÿ€€€ ÀÀp@Á†ðüc€ |ð0 À€à`ÿÀ€`€Àà@Áƒ8à À@p<ÀÁþ0ÿ€`0ÀÀÀÃÀ@pðÀà0ø`ÀÀ€ÀƒpÀð€ÿ€6àCð`€€€Àƒ†88À€ð<þf`A€à`€?ðÀ‚†0À€_à`6€ pÁÀðñøÀð €?0À‚†0 @€ÿð`31À 0Àà 0î8À€0€Àƒ†0`ÿà `€0à8€à ?ÿ€0À€@ƒ†?þ `À0p8€` ÿ€ 0€€€@ƒ<ü `0À 08€àø8`8€€€@‡ø `0` 88ÀÀp`0€À`€þð€``0ðÁÀp`€€à`€8ü8 p0 àoàÐ@€8<`€ð8‡€00  oÀø@€€ø0xÿ00 ÿÀøÀ €ÿðð0ðÿ0p o`ÀÀð0 `Ü€0ÿ€àð00€`üÿ€€pp€À`p@€ Àà@`€À @€ À8€ p€ €< À?p Àxü{€øÀ`pð€ë€ø@ð`àqà03Ã0Œ0`€˜@>€3p#Ç!Œ0`ƒ„ fbàx?Ç 0ÀÌ Gƒø0Ø€~„0Àh à}Ç€œ0˜€<Œ1Àh ð0Äà Â8˜€< ü( `D æÀsø `Ä0r@cÀpâ` Ì 0€ðÀÃø€€À`†pÀÀðpÃÀÀ?à8€ @`Là€8þÀÀ0 @@8<p À€0 @€üÀ0` €üÁÀ0à0øá€?ÀÀ8|þ€à€ð€ðÿ€à€x€þ€€@?ÿ‚p|€† ð€€€†À€ „€€@€À€8`0€À €p`8€€à`0À0 0@0 <€d€à€  `p€üàxƒ`€üÀ ```?ðÿàg€0@ `€`@À€ÿà~€ `ð`0?@À€ À€ÿü|€ÿ€à 0Àð€0@ð€Àyÿ2 0x€€ŸÜ 00™€À € @ü€`ð pÀðà 0àðÀ €0@8?€0 €à p@xþ pÀÀ€0`|#0€À `@ð0`‚à€`f ðÀ`€€ `€ÿþ€`à‚ô€p ?àà€8àÀÀ àÀü€ƒ`ƒ àÀ€f8  à ÿÀ€ƒ`8ƒ €€ðþÇ`f xÇà ù€4|‡x8Æ € ÿ‡x`| ÿè€@Áðƒ€€ îÇ÷ |~ €€ÿ€‡€>À`x ÿ€`€à€p8 €0€A€fÃ`ì< À€ 0À F€80ø 0 À €00À €@Â0g€f‡€  Æ 0À€pà¸!‚€€ 0Œ àÀ°€x€`0 €€Æ0ÞÀ>À†@€ à`À``¿à#ÀÀ€`  €Á~h€LÀ`€€ä0ü>à0`€ À`ÀÀ` ü&`ü€8`` ÿðÁ3þ€†À`8€ÄpøŒøðð€ €0ÀÀ`0€8lp`>Áø@ `ÿ€Ã?ƒ@xÁ€ä`àø0üÜ?€ €€€`0€xÀ Çü€` „ B„ @xñÆàÿ ÀÀ€`8`€ €Ž€@`f<ðøB˜Àø†ðÃþ`ƒø ðàÀÀÿÿ€À €€ €À`"`|Ì<fð|ÁøŽ€~áø8 €ÀÀÀ ü@À`€à€`.à ~l€ðüŒÛ00 €À ø€8@ <À€`ü0€†@!äl ‡àÿÿàÜ4 ˆ€ €pp@ |€`%àà À† À1Ø?x ÿüÿÿü ÜŽØÀ à`?`ÀÆ€1€óx {ðŽà8üxxx8Àp@@€1€ Áx 8 xpü€0À0`Ã@9€€p8àø8€0ƒ`1€€p  ˆÀü€€> 0€€p€Ÿ€À ððÀ`€ÀøÀ@à`8 ÿÀàÀ`8ÿ0``€€   @ @@ @@ @@ `À@ `@@À@`0À`@08€`@€@ @€@@€@8@@€ >€Àøî€€@0Àÿÿÿÿÿð€Àð8À€`øÿÿÿÿÿÿÿÿÿÿÀÀ8`0À€0ûÿÿÿÿÁúÿÿÿþ€÷ÁÀð@€€0ü?óðÀ?àÿÿÿÿÿÿÿÀÁ€à`€FxÀ?ð€}ÿ÷ÿø|瀀{€€fð¸?€à  €þ?€æ>à?€>€ €@00àø€Æüÿ?€8  €`00Àÿ‡ï0ðÀ € à0pÀ¾‡€  €ÀÀ0àÀ  € @€À?À@€@€A€À€ À€A€,À€€CøÀ@ÀGßÀ@ @Éð? @p€ @@>@  @ö@ À@ÿ€ ÀD à ÀÇ `0 ÀÿøppÀVÀ0p€b€ 80ÀÀ€0À 0`€À€pC6 0@8 à€€àÀ< À<0€€ÀÀ8 `€€ïÀ€8€Á€8 `0€;€à€ ‡À€?€AÀ0 `€89Áà€€ €@À3þ†ÁÀ `€xá¸À€p€ 0ÀÿŒÀÀ``Xqœ€ð€x|€0À@7œÀÀ`` 1Ž€0<  €ŒF€8À`õÀ`À €1‡€0€`ÃgøÀ`06ààÀà 1Ç€ ÿà1Ã~À À`` þÀàÀ>0p `ÿ€€À€ àáà üàà<À! xÀÀ€€À`á€Àþøà>àÀ`À`Àü€ÿø €€€Àpá€ÿòà~üÀ``À€ €þ€ÿ€ À€€ €À á ŸÀ` ŸþÀ`0€ÀÀ €ÿÿ€€À À0€€ €à0á Âàÿ„8À €€@Àÿÿ€€ À>8€€ Àà0à 'âàÿÌ8ÀÀ€`0@ |€ Àc€€ ààÃ@>#ÌÁÿøx€€À```€€c€Ã€€€`àÃÀ>‡ÈÁÿøpÀÀ0À`€€A€ÀÀ€€Î?ÀÃÀ?OÀÁÿøðÀ € @€€Á€à€ü€ ÃÀ<7@Áïÿà0€ 0xÀ€€ÁÁ€p€p> €ƒÀ<ÀÁÏÿà0€ 0þÀ€€Á€p€þ €ƒÀ>@ÃßÿÀ0€À 0ÿÿ€€€€Ãp€ð€ƒà8@óÿ€0 €À  0ÿÿ€€Ã0€€€Ãà ƒ£ù€ @€À ƒü€€Ã0À€ƒà€!ñ€`G 1€À@"0ð€€Ã€0À€ƒp€`߀ a€À@C0Ð €Á€p€x€`ñÀ á€À@0Ð €Ã€Àà À>`ðÀÁ€ÀÀ€0ðóÀ D€À`àÀ €€À€€€`p~?€pN€ÀàÀ@ÀÀ€ÿàó` xŽ€ÀÁÀ@ÀÀ€|À0øž€ÀÁ€@ÀÀÀ€p8ø€`À@ÀÀ€À`À~HÀ`Ãà8Àà€Á €ààc€À`À8Àà€À|8 ÀÀ†`AÀ˜ à`€àÄÏÏ|àÀ†0Ààüà àx€àxÍÃî`@„@àüð`=ÿ`8à ÉÃþ0`aÀýø<ð0ùþ`8À˜ã€0€`ÿø<ø0ðþ`À˜cÀpàà0? €y˜>€0àÀ˜cÀàþ`À`pð~IÀù 0À8àˆãƒÀ €Ž0ÀàxÀ÷þ@à›cÀ0ÿH ÁÁÿ€p€ 0Áà|aþÀ``À0øŒa à ø8 3xƒ0>à~Àq>@`ÀŒ#àžð cȃgð~8@36`pÐ2`AÀÁ ‚c~8@36 0 ü02`0a€† A€ð s>0p §ÿþxOþ 6` a€„ AÀÿà=ãàÿÿÿÿÿÿÿÿÿÿÿŸÿÿÿð 4@`!€€„ ÀÀù€ÀîÀÿ€€?ÿþ d@@!€€ „ @Àpüp d@@`Ÿä`Àp  Ä @ à|8Æ8qÀ 3‚@?Àþðð€€?à`øÀÀÿÿà6ÿÿð @Gÿÿÿÿÿÿÿÿÿþÿ ?ÿÁÀÀÿÿÿÿ>ðÿþ÷ÿÿÿüOÿÿú ÿ€8Ãÿÿÿÿÿÿÿÿÿÿÿÿÿà#¦€ÿ€xÿð?ÿàÿÿÿÿÿÿÿà"€ÿÿÿ÷üƒÀðþvÀüçG`?ÿÿþð^€ }¾ÿþÿÿþ‚€ áðÿÿ¥þ©ÿÿàÿðÿÿÿÿÿÿÿÿ€>€ ÿà?ÿÿ‘€X?ÿÿ€ÿÀpð`ÿ~ÿ€``ÿÿàÿ`ø@``œÀ```à0pp ÀÀ`ðÀà0ð€~€ ð@¸#àÀ ð3ÀÀ@ ˜ À@xC¸Àcà00`ÁÀƒ` < cÀ@ €dGœÀg00 q€àîà <3o`@ €!€FM€ƒÀn0 9€0|è ðl1†à@ À ÀÂy€1ƒ8À|p`8x Ì!†ð@aðà`À€ 0ÀpÀxp €Àp3Œ Ìa„€`Àc0` `€@ Á€pÀp0€ð`€{3Œ ŒaÄ€€àÀgp0`€À 0áÇ€ Àp <=À1ñÀ{±Ì< á΀€9ÀÀn88àÀ 8àÿ€àp 8øÿü9ÁÀq Ì< A†€0€Àl0À€à`?ð9‡ÀpàÌ8 aƒ€pÀ|p€àp9ßÀxàÄ0 cƒà`8à8 €0xø|ÀXñÀ0 7þ#À`8ð€øÀxÛ€ '€80À ÁÜÀ)AáœÀ€O1þ0À(0ã€0ÀÀ0ÀÀ`€`À€`À€3ð;üàÀ>cƒ0ð_À€€€c‚0ÿ€Àào†8ƒÀ0‚øÀð °ÀÀÀx 0€0àð  x€pp8 0Ì`€`0 `3„ààÀ> `C€À€æ  `0m€@xÆ  ``€ úà`Àà€8@Àþ  €9üÁ¸ƒðþ0àÀþ €ðá¼€€8`ÿà ÁàüÏÿ80ö 8ÀÀ‡À ƒ0?øÿ88€ 8€à ƒ ø 8€À8€ÿ àó |p ž8€à )Àîð<ÿÿì0øpüp€08@àþ?0øÿÿìpàp à€`0@`÷ðàaÀðÀ€<€p 0€aã0àÀ ãà€ÿÿÿÿÿðÀx€ð1€qƒ`Àà 1ÃÀ?àÿÿÿÿÿð 0À` Ø !€3@ð à>3‡Ï€ðÀ<|ÀpðÌð!€?Üçqð?þüÿÿ÷€x€æ À8€àla€‡Ÿ†?€øÿüÿÿÿv˜ÀÁà|Aáó‡ÿŸþÀÿÿÿ ÀÿçœpÁÃÀ Âpà€<xÿãÿÿø óÿÿÿÿÿÀ€þÇœàÁÀÂ`pp?þ ðgðÿÿÿÿÿþ€‡€œÀ0ÁÀ€@0`øÀÿÿÿüý€vÀ ÁÀ€@8~€<À€0ÁÀ‚ 8p0øÀÿ0À0€@xà0à ` ÿ€ €0`€ÿ¸`p€g€0€ÿà0€`€` 80?àgø À°üx€``€À0€ `p?ðà<`€ÀF€ÀpàÀð`€9ßÿÿÿû€ ÿÿÿÿ€<1À€0ÀàÃ~ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿü>Àl`Á€8 À€ÇƒüÀààáààÿ0`€ Ì@ãÀþðÿÿñÿÀ`8€€ŒÀcÿ€ÿÿÿÿÿÿ€ø€€€ =À ÀbÿÿŸÿÿà€ÿ pà Àbø?ÿÿ< À`Àâ8 ÿÿÀÿüüÀ €p ÃÁ€ð ÿ€ÿÀÿÿøÿÿ°À`€ 0 áà€þÀÀ€€0€ €~?ÿÀÀ ƒÀ0ÿ€ÿÿÿü ÐÀð  Œ`þ 3Á0€@È080sxƒx`Þ0È0ø0`G˜2† ø0¿ x?þ€€`p€`Ç þ†1ó `xøÀC< 8 À0€Ì„0 1à @x Àƒ$.|à ¸€Œ0 #Ã@xàƒ/ÀD`†ðüÄ|0cƒ`ø8`aàÀ Æpƒ€Ï‡ø0c?ßà àù€@pÀ‚1€ð ‡ðþFàÀ€p@0€ƒ1ÀÀ<ü@0€`@81€àƒøÀ0€0`80ÁàÿàxÀ€xp`ÀŽð€€0?€ÀùüÀ<ø Àð€8<à 0pÀGÀà 8À‡€€p À‡?p<ÀøÎ`<~à Àø8þàÀx09ÎàÀp0€l{ €p`À ú0 €€pÿÀ°€ Þ0`€sƒ€03€ ;0à€v€¸cÀ ñÀ€üønà0 €€ÿœ8|``‡€ Àøp À‡ ø €p0ø€Ì0 €0€Æ€X € 00 0Àp1€1€ÌÈ€ `0 0àð`3ÿÀ0a„Œ8€à  8p~ðn3þÀ`€0€ À00?€8 À`ÿà``0ÿ°/€|0Ààð`€ƒÀ00yÀ< ` ÿ€`À0ÿþ|0=€x€À<`€‚À`0ø` fðxþÀ À@0ÿÿü0€|€ÿ@ À`qÀ0€ 3ØÀÀ À ÿÿ¸8`0€Ì>ÀÀc€0à #À@€`þp0` €Æ„ÀÁøg0ÿþ †€à0€`à`a†Œ@÷ÿøfÿÿÿ †€à8ÀÀ€`a‚ ÀŒ`ÿÿ€nøÿþ Ä€Àœ ÀÀÀaƒð0x < 08ÿÿøüðø ÌÀÁp€xÀCƒ8 8`8þ``~Œ áó€øà?€ ÌÀðÃ0€ÿÿóÀC0 `0ƒ€`ü0|„ÃøÀÌÀ ˜‚8 ÿÿ÷ÀFp @0ààà‚ €‡ð‡ÀÌÀ †0Çÿþ€~‡à0À`?à€øüÀ‡€ð8ðÌÀ †0ƒçü€|þÀ`0€`À€ ð8†€à0ÿÆÌÀ   0 ÿø€0ü€@8`ÀxàŽ?€à0ÿÿþÆÀ ˜0 à€xÀpàÀ€x<ÀÿÿÀpÿÿüƒ€ Œ0 ÿð€ÿàÿÀàÿÿüÀ`àø€Ãÿ ƒ`ø €~`ÿÀðxÿÿ€àÀ?à|0 þð`ÿü€ ` ƒ€à€0À`€À À€0À8Àx< ÀÀ`€0€ÿð€`` €`€, 88 €` ÿÿÿÿÿÿÿÿÿŸù€?À`p  x€àÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀ#ÿà`pÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀ?€ÀЀ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿ¨àïÿÿÿÿÀÿÿàPp@ x|| ÎÀþ‡<Àø€pÀ€À`€€`‡ÿ€`~ ÿ€ € €0€€€00€€þ€0€Àøþ€€`q€À€‡€@Á€À€ €€€À€€ À€€ÀÀ<€ÀÀ€(@0€Ž€à`À€ @0 À€<À00 € À€pÀ0  €0€ƒð€0 þ@ À  1ƒü Àà0ÀàæŸ€` €ÿà~`0€|€€à` 8Àÿ€ÿàÇ`00€€À0ð<ð <À€ÀÁ€` 00À€À8Îü gÿ0€À€0 p0 à€` ÀâÀ À`€À€À€0ø0 xÀ0> €`ÀÀÀ @€àÀ€0À 0 Àÿ?ÃÂ0À`@€À@€à€?€0€` þ€àÀwŸp€`<@ðÀ`€à Çàs€0€` ÿüÿÿÿÿÿøàÀ ç¼ð€`p`à À`€ÿà Þð#€8`ÿþÿýÿøþAÿø`@€  Î ø°`à`À0€ÿ€à ü~€0Àüÿÿ€``€ ˆð>0`Àp 0`Ààð€0À Àà`€€8àô00€p 8` ÀàÀ€00À`À`0€1€xÀP 8ð<8ÿÀ€àÀÀ00€@€``€á€ðÀ ‡ð<ÿÀ6ÀÀà€ÀÀ0@làÀ€ðÀ 0ÿ0€€ÿà3À`€ààÀÀ0@ƒ€Àÿàÿ°À0øÿ€À€1€pü`|ÀÀp€3ÿø>ã9À0Àÿ€ÀÀ!€0`€ÀÀ` à|ü€0€@a€0`Àà 0À€0@çÀ0`Àà8 `ÿÀ?ÀÀp0 ø@?Àà` €` €À?à(p€`€€ð?€þ `€ø0Ç `À<0ƒ0`0à 8€0 € àÃ0Àp p 8Ï ÿ |ð߀ làØ€ þÀ€` ÀÿA€`€¡G€`<À0 @`pà `0|àÀÀpÀØÀ€80€À0†À ÀÀ8ƒ€ @ÀÀ8 À8ø€0ÀÀ €8 c€0ÿðÀ0 à€`€8 7€0àà0`À8 €<x €`<`v €ýø80xp<8Á˜Àƒÿàðøp|pf€øÀà?àà>ø`N0FÀþ~<à@F30ÆÀ>x€€ÀÃ#0Àð àÀÃC8ÀÀÿüÀ8 Ã8€0À€ü @8 Ãÿÿ`À`p Ã|ÿüÀÀð Îü€€Àx?pÀ ø0@` 8€`à à` €8À`à àÿÈ`À6Àøàÿÿaà À€ÿø `‡€3Ø`ÿÀ ÿ‡àà€À?à0`ÿc>0þàà0Àxÿÿÿð0`xã€8ðàà 0€€Ó·ÿÿÿÿü0`ÿ€xÀàà 0Àwþø0`ù€üÀà€ð`0`€ŒÀ`àð@|08`€ÀÀààp@`ÿÿ°x`€à Àð``€Ç€ÿðø`€àÀð`?à€ðü`Àp`0ð€08<``aàþ0`ÿ`à`€ø0À Ÿ€`€ðà|0ÀÀ`€0àp` |0àÀ ‡`9ÀñÐ`x`ü€0ðÀŒÀ`s€à|0pü`pŒ€08àÿýð`þ ?00Ü`0pÀ8`ÿÀÀ àÀ8pÎ0ðX†8pøpÁà€àÀñÎ?ÀÌá‡üÀ8ÀpÀàÀÆxùÿÎÿ‡ŽþÀ0Àà1‡Æ|ÿ€Î>ø`0À|1€€ÿ€ 0xÀÀ0€<0Àÿ€àðÀà@ €€@xÀþƒƒàøÀÀ€8`ø`À€``xÀü0€ƒ€ÿ€ÿÿ€€Àà<À``Î @€€À`@€`À|ÿøÀ> àÀ@`@`€€0Àà8À8fø>àÁÀûpÀ7`À8À`pÀ0cÜ?À °¿à€C€< À€ p`ÀÃ0 à ˜ à€À@| ÀÀ€ 0pøÀ Á€00 ˜àà€@@ü ÀÀ  0ðÀÁ€008ŒÿÀÀ€`Ü ÀÀ  0ÿü€À€À00 €€XÀÀ 0 ÀÀ 0ÿþÀ€€À0p€€À0„ƒ€à 00Àà8 ÀA€À0`€Àà0‚ÇÀÁ` 00Àƒà€!€ð0p€Àp‚ÿôÁ@h00Àï0 <€ÿð00Á€p8†Àgç`ÿø00Àü8 |0€ø00øó€?Æ„ÿ€C€cÏð`ÿðÀ8<€îpÀ€À00ð?€‚pÿŒàÀÀg`ÿÀ€ð€Á‡àÀ€À00ðù¼À`þ`0€ðïïÀ€À`0ø€øÀÀ€x`0À||ÿÀ 0<€ÀÿøÁ€€``ÀÀð0€Àÿ€O€€``À€`à€`ÌÀÀ`ÀÀÃø€€p€` @àðàÀ€ÿÿÿÿÿÿÿÿÿþ8€à Ààp`À€ÿÿÿÿÿÿÿÿÿÿ÷/ëÀ àp `€Ûÿÿÿþÿÿ€ ð0`€þ|øü ~p`€p ðààÀ € 8`ÿ0ƒ€0€@€@€€À ÀÀ€€`à`ÿ€0à€`ÿ€€ àÀ@€ À?€ø€À|€8< þ<€Àd€€0€ "€0~ ÀÄ€@ü8`€c€3òÀ€ÌÀ€8†|<`€a€€pÀÿÿ†€€€€<‡|p`ÀaÀÀàÀü8€€€|ð€ÿ‡```æxðÀpÀÀÀÀ8€<|€ÿƒÀ`0ÿøà0À€à0û€?€á€À>?ð0ÿøàÀ€ 080ÿ€ÿÀ€€ÿÿøà ÀÀ`0€ðÿ€€€àƒ€€Î¸x|` €`0€xÿ€À€`¿€€<` p0  0ÀÀ0ðýÀà€pþ€0` 0 @ÀÄàøñà àÀ`€ðø€ `€  €€Ï€0à` ø€À0ƒà€ `ÀBÏ0€€À` à€ëÀ0€€  pÀ0Àw00€€Á€ Àøþ€8pÀ@c00À€Ç€ àw€ð3`à€`q€00À€ÇÀ y÷ €À#ƒàà€À`qÀ00à?€à`0 ;ÿç €€cÿ€ð ÿæÀp0qà08àø€àp0€3ÿÇ €€€ÿÀÿ0p à8ðp0p``0 €ü3€ €€ùà00 @ `À|0À`ð 0Àü1€ ÀÀ@à0810p000à `À?Àþ À@À >0 €ð00>À`ÀÀ?Àö àÀ `À>x €À80`€ÿÿ€`€À0à ÿðààÀ7€ûÿÿÿüØÀ@`@?àÿø@€À`ÿð`ðÀqÿÿÿþðûÿþÐ{Ð8À@ÿà@`?@Àp`ðÀpÿ?ÿÿÿÿÿEW?ÿÿï°À@þ``@0À00ðÀð†ÿÿÿþPxÿÿÿÿÀ@pà`@0À0 ðÀð à@ À`à@ 0À00`€ ðà`0€`ÿþ@ 0À8ø0`€ °Ž0à`0`ÿì@ pÀ8ÿð0ð€ °Æ0ð 0 `p€0ÿÀ œ °çàÐ 0``ø€pÀ~0øØ08`` Øp~ü0ðÈþ0`0 œàø`°à Ìæ0<`0  à€80 øÄ0fà¼Îà€0°0Æ 0GàøüÀÀp°8à ƒÁÀxÀà`ð pÁŒ÷ÿ€ €8àð `Àü@ €Àp À@Àx€€€<?€€??À€€3ðð'Àà0ÿÀ$`ø0$`<0` 0À0À#€(Àx00€`ð0 ü€€pà0 €@ 8@0 @ø`00 `üÀ 0 : ü €a 0 >00Àc0À |`ð|f0€ì`üð$0Ìà €<0ÀŒÀ €ø0ÿÀ Ä À ðÿø0 ?þÄ À€€è`8>Ä Àû€`pÄÀàø?ð`à€Ä€ðÀð`ÀÿÀì–ø°`À?þì<€|Cÿß°<`à?ð|ð€ðã€Ï8`p|à€€ó€€p`8<€<ps€Ààp <øð;€ÀÀ` ÿð ÀŽÀð€à0ÿÀ @øþà€à0ü @üþ<à€ð<0À 8@Ž8ðÀ‡€øð8À 0@8 À†ƒ‡€?ù¿€8  @€ø ÀÇ€~þ@€ø` à<Àçþø@€ñø0 áð@àÀ8÷øà@†ù¸0ÿáð`€8À?@Ž8þ¸`€ø@ü8œ`€à@ø8 œ`À0€@ 0À8 þ€`à`>@ 8€8þðøàpàŽü`` €8 <8ÿà8Àþà ‡ÿÿ»@0À €8 88ƒà9Àƒþ€Ïÿÿÿ¿ÿà@0€ €8 xøàÇÁü|`ÿÿü@  À àà ÿƒ€ð€ ÿÿÿ|àÿðü¢@@` àg€àü€àÿÀÿÿÿÿ‡ÿÿÿÿŸÿÿ¿ÿÿ @` ð€``<ð€?€àöÿÿÿÿÿ¿ÿÿÿÿÿÿ0@@À€þp€p€àôð|`þ8øïÿÿ€@À çÀ~8€pàáÁÀÿþðà?ÿ€ÿ@€À€8 áÀø€ À<àH€ ÿ€8 €>ƒ8ãÀÀþÿ0@€þ0 €Ã8þcÀø 0@€ð0 €üþÀÀ @L€0À0 €@Ìð>ø`àL€0à<€àÿxü0àl€ ðü?Ààÿ€@ÀÜ01d€`ÿpî3ÀàÀü†8 l€`ø 8c€À0`€pÿƒ³ €l€` <a€€À``p€ó Àh€`ücÀ€À`à 8àáà(€`€þ_ÀÀ0À`€àÞð8€`ÆÀÀpÀ`ÿ0ü|€8ÿð€``€`Àp?ÿÿ`øp€ýøÀ  €€€pÀ` ð€À 0€€€À`ÀÀ À00€€À?àà@ÀÀÀ00€€Áüxàÿÿð€ÀÿÀ0p€€÷ø?àÿÿà€ÀÿÿÀ8x€€ðÀ€ÀüÀÜ€€À`Œ €À `€à` þÞþÀ`pøüÿüÀp80`88ÿÿ@ <08xÿ€`à€p0xÀÀà?à à € |<8€0€Àà``p`8À À€ÿþPü€€ÿÿ€ÿÿ€àøààÀü>>ÿ€ÿÿÿÿÿþ`?€øÿä?âÿà1üÀÿð?À€@À``08€€0€0Ï€0À0Ç ì €0Ì ?ü À0ø>À0p@?À0`øÀ8`ÀÀ00>`0 x€pÀ8€`8<ðÀ0€0`À €€ðÀ0À?¸`ü`ü€0ÿ€0Á0€0ÿ1À€0`à€pÀ`À€pà€Æã€``àÀÿ î€À€ÀàÀÿàÿÀ€Àà€ç€ààÀáàÀðç€àà``à`xn àp`pppà|À0 ``ÀðpøÀ8oàÿ€`ÿÀ8€|à`€À0ðð`À`€pàp`À``0`þÀ`0€ 0 ÿ€ À`0€ 0ð€ p€` 0€ à€@0 € À€0 @0 >@ €€?þ@` 0€þ@`€þÀ` 80€ÿ€€€€0<€À` 88`€ð€€€1ð€À@88`€€€€?À@@8`€€€À>@@0`À€=€À0à`@0`yÀøÀñ à0ÿÿ``8 pàà8ÿþgá€p0ÿ0`| p{ðàü€ð0 00î`?ÀÀpð00?Ç`ñàÀ08 |€xà€00þñðà 8 ÿÀÀ0 €À0 € 0€`€8€€ð€àÀàÿ¿ÿð`ÿÿÿÿÿøpÿÿÿ?ÿÿÿ€8?ÿÿÿÿÿÿÿø?ÿÿÿÿÿÿÿþ ?ÿÿÿÿÿÿÿþÿÿÿÿÿÿÿþÿÿ€/à€à ßðàÿï€?ø àü€?ø0À0À?8 pÀ0 À?8€p à`À0 €À?ð0ð8ÿ€ à€ÀÀ0À€À7à`€„€` p@@0ÀÀà?ÀÀ Àà€À 8`@€0`àxà?À€0€À€0€€ 0à@€0`øðà€?€01€î€à €€@€00`¼À`€?€0a€À7ðÀÿ€  ÿ@€0 0 Ÿÿp€€  À€ÿü`€€à€ <ƒ@0 0 Ð0€<` €€àÀ 8` 8x 0 €8€0?€ ð €   À8ö00ÿ `p €8€ aà0ƒ8@€ 0 ÿøþ€À8`` `p €€ `@p0Æ€À`  Àƒàø€```p €€ÀÀ00Ä€pÀ €`†ø ¸À€`` ` €€À€0 Ì 8€ `0Œ\0à€@`0à € €à€0˜ 8€ 0p€€``Œ0p``à € €pÀ` <€ð€À` `ˆ0pø``À À€ÁÀð f|À”€À `ˆ€0`ð``€€?€à Æðð`_À9À0`ˆ€0à €`€€àþÀ`€8Ç€€àà€0` ƒÀ0À€`þÀø`p€€€`À0À€pøà À 0ÿ€øà?ðÀ à8à8ð0üc À@0<$ €ð|?àþ„>Àü8 À~øÀîÿ?ð8 €?ÿà ø8 €ÿ `€Ð€ `€ü x`€> ø €ð8ƒà Á€ð0ÿÀá€`ÿ=€`<€8 @``0 `€0 `Àð  1€0 `Àø !€0 ÀÀÀ a0ÀÀ0'ÀA °ÀÀ00<`CðÀÀ `€à80 ÂÀf€@a€à ø@80`ÂÇ€@ax/ÿÎ<[ÿÿÿÿþÿp sÿÿ¾8``† À€Ã``ÿð 0ÿÿÿÿá;ÿÿÿÿÿòÿ€0 ÀàŒ à €``ž 80·ÿÿÿþßÿoÿïŒx0 Á`ŒðÀ00 0`€ü÷ÿðàû€þ?`00‚ ˆ700p0€ 0`€þ7ÿ@Àß9ý €ÿÿþ00Ä €&`8€ 0À€ÈÿàÀ=ý¿ïÿð00ø0€< @0€3€€Ïÿÿ€7þ0€8€À8€?€oÿà3þ0€ÿ€?€à€_Â8f00 €àþ €À@€þ8Æ00€ðÀÀàð À8À°Ì` €àÀøø` pá°ˆ`€À€ð`à€`Ü0 €ÀŽa €`À€`à ÀpÌ00 €€€pÌcÀDÀ0`à À8 ` Æ  Á€€FXB@MÀ `` à<` †ø`ÀÃxF`€`€``€ à<0àpÆ¿à` À„0f€€`a€ à~ààpÆÀ À €n`a€àpàpÀxÀ€€ÿa€àp Àp€pàƒÀ€ðq€<à`àpš` à~À€àqÀ8ÀààpÎ  `8 À€à0àp€` àp|€€ `€À€`0`` `à8p€€ ><<àÀ `À€à01À8àÀ6<<`À €À0 àà,làÀ€À0à$dàÀ@8€ÀÀâÀ0ƒ€Áp@€`À€€À0Çù€`€@€€À0Á€B €@@À € €`€ À€€` ø€À` €@`€@à!€€@`2€€@`À€ `À@œ€€`À@ü€  À€?à€ À€00`¯€0ÿ€ð€ ¶€€`À?ÿÿþà8 €Àþ€0 ¬€0ÀpMÞ½Ä9ÿ×þ%ü(`€À€ é€0€pÀíßý† `ü€0€ ñ€ þ?p1€?†p00€` ñ€0ñp1À   ``€@ ဠ` aÀÀ @à€@0 € ```à08 0@À€À0 € `0Àà@? 7Œ81ø€€p `0pa Àpy€ c =0€€p `0ø d`€pøÞ †m€08€€ð Á`0ø`x0€0ð~ †0Ì€0à€€°`à`0 ØNx€0à  0 œÀ0@€€0` À`0 ˆ|ž0€ `@09à€€@ À`0 soÁà0€À'8|pà€€À˜À`0 € €c€C€0€ €Càpð€€€˜À`0 ÀaÀc0`€`ð€€ 0˜0 €`8à`pc0Àð`ü€0`€`0p`8C?€`ßÀ€À0à`À àƒð€0À€p€þp€<0€ ÇÀ0€À0 Î ~08Àø`<``00ÀøÿÀ `À8 œƒø `€€8 x  À€€0 à0 À€€0€ ,€0 ÀÀ€p $À € €gÀà Àð &À€0 À € €Ã€ÆÀƒ° € Àü 1À À€€€†àŽ€ @Þ a€  À€À€† `ø 80 0@a `€À€ ` ÿ0`p`< €ä0€à8X@ À€` ><f``À`x `à0€à00`2À€8`€À@À†06`p°@€aÀ€€ €€@p0`0€`À?€€0À0`À``€0@ p0` `8€> `0?üÿÿÿÿÿ€0À00?ÿÿÿÿÿÿÿÿÿÿàð€€0  ÿÿüàÀð0  üüÿü0`P ø?øðp`ðÀp À@Àp`ÀÀp`ÀÀÀ`à0?àÀÀ`à?à@?€0`ÀÀp°à >q€``ÀÀp˜àÀ  `ãÁ€øÀÀÀpøÿàþ  0Á€ƒŸ€ÀÀp<ðøÀ€Œ0€  p0ÀŽŽ?à>Àp>ððÀ‡€pp0!À 0?€ `àøpàÿÀpààà8PŸÀè@€a€ €0?€ k€€àÀàÃÀpÀ`x|8¹ÀÈÀ€C€ € € nñ€€À€Àp€áðî³ààÁ€€@ `>€ƒðÀ€p~àö`C€ € p|nƒ€‡0ÀÀ€p|0ÿAƒ¸` #€€:ÀÎø0Ïÿ°€Ì0ÀÀ€px8üCû€ €0€€€àŽèøÏü0ÁØ0À0Àpx8€ü?À 0Λ€ ?ÁÏðpÀ Àpxh€x€@€ïÎñÀ|°ðŠà`Àp8l€À1Üüp0ñà>áÀ?0ü`Àp8p€Ààxð `€`€À€<8 `ÀÀpðÿ€@€8`üÀÀpÀÀÀ €{ðþÀp€€üÀ?øÀp€ð€ÀÀp€ €Àþ€p €€Àþ€p €€€ÀÆ0À`€ @@€€À Ç`@ €9ŒÀ€`8þ` @à<ÀpüÁ€pp<` €ÀàðAàxó?ààà €€à~à?€ ~€à00À€€ð?àÀ øàø ‡€€à€üààð` À€À ÿÐ|à=ð`À€Àð?üþàð@à €€cÀ0ÿÿÌí8~Àà@€ 0 À€C€ fÿüóþpÿ€\ïøÀà@€` #2 €À€A‡€ Bÿà~'üp?ÿÿÿÿÿÿÿÿÿÿÐÀà@€À"€cc  €Aø0€‡€ €CÿƒØ/˜|ÿÿÿÿÿïÀ ÿÿõîÀà@À€$80ÀCA@ €À@0€‡Àp €ƒ~|~>ÿÿÀÀ@ƒÀ€8x °ÀƒÁ0` €À@`À‡Àð€ÿÀ|88€ÿÀÀ@‚À8 È0a0`0€À@àà‡ÿð€Aÿ1ÿþ°à€À †À `a à0A€@  ƒÿÀB€ÿû?ð>à€€ ŒD ÀÂ! à€@ ÿ€€s~<€€0Èxø€ƒƒ#00 À@ÿ €@á‡ð8 €=€Ðp À1‚8 Àü€@Áÿàyÿà€` àà À€ ø ÿ€p€@0€`0 À`ÿð`ðЀ˜ `@ÿÿÿ?üø€À `ÿÿÿÿÿÿü €ýÆuïÿ®00ÿþðü~€?ÿÿÿÿÿÿÿÿ@`þ€ãü€ÿÿÿÿÿÿÿÿÿÿÿÿÀÀ@<Ãð€ÿó?ÿÿÿÿÿÿÿÿÿÿÿç6ðïóÿÿÿÿü@0ðƒÿ€€ÿÿÿÿÿÿÿÿÿÿÿÿÿïüÀ0ÀÀÿÿÿÿÿÿÿÿÿ÷ÿÀ0üƒ€À 8àƒ€  9ƒp€`ÀÀ ˆpþ€``@@€üpÇ €`0``À„€|pƒ€ € `0@` @þ0ÀpÿŽ à À@`þ À0Œ€ pÀØc Àx8ðÀaÀ> € À`€Àd À|à˜€€gà€€ð€€` €d€Œ€€>l<Ѐ0À€€`€€ €<øx€  À€€`€à<€€Á€€ €Á€€0 À€ ÿ€€ÿÀ€ ~>€ À€ðC8ÿ€œ>0ø0 0 80ø  <0  0 A p?€àpøp ãà<0 ïÿÿøp` ?ðp@@?ÿÿÀÿÿÿãÀpC@¿ÿÿàÿÿÿÿÿñÀ`‚@ ÿÿÿüûÀ`€‚@?€`ÀÀ† À€``À`„ ÌŒ>`@`0   ØLx`À`  0 0øÜ‡à`Àà  0 0±†0à`ÿ€ 0°„ €`>À0 a0ø„` pÀ8 l0>°€@`à€à<€ ð00s˜À`À€xn€@@?À 8`8㘈À €À?€f€@¸Àp8@80Á€ „€`ÀÀþÀ0Àø0@00€€€` €€ÀÿÀƒÐ0€x0@0`` €€ÀƒÀ‹˜0€xp 0 à`€€ÀÀâp!xð0À`8€À€aÀ€À  Ðaýøp0€À€aÀÀ à`ÿŽpp€À€áÀ€ 9à@€? 0`€À€àÀ€1À@ 80`€àƒáÀ0p€À@€ppà €Àƒa€€`€`@pàÀÀÎ? €Àp`ðaÀ0x€€p`À?€0€|pà p8àp``p0`ààÐ00ÀÀ@88€À À€€ÀÀ€þ €>€€ €€ÆÀ€68€€ 8à€C`8|Àpƒgà8€€Àþ|Ã@8À€À0ÿƒà@ 8ÿðà€À0€p?À‡àø ÿà`‡€ÁðÁ€à€€xÀ?üðÿ€ðp8À<xÿÀà?€Çàøx€à€ÿüüüáÿ€?þ=ñÿ€ðø|à?€~üÿðð€Àçàü8€àðàÿƒþþ?þùÿ€?ÿ<ðÿ€ðÿø?øþà?€þüÿÿàðÿ€€pÃàø¼?Áüðàüàÿÿþ?þ=ûÿÀ>xððÿü?€üÿ`ð?€~üÿÿððÿ€Àxãàxx?ÀþãþøÿàþÏàŸŸŸ?ûÿÀ9ðøÿü?pøþðÀà€~üûÿàø÷€øƒÃàxxx?ãßþÿÀüÿÏçßùÿàþóÏûÿÀððÿü?€xüðàà€~ü0Àãñàøð€ ÃÀþ?ããáþxøûÿÃÿÿàþÿçÇÏùãàÿùÏ€ŸÏûÿ€?ððà|øø>€@Ãðàáàð`üƒàðü?ÿŸøÃñÀüàø?ŸÀÿŸðþãÃãÿxøÿûÿÇÿóàÙÿ營Ãàÿþ€xÀ|ððÀ<Àñþü>áó÷üÃÿðÿÃ÷çÃøøùþøø|ÀÿßßüðÀüðüßàÿÇÏߟøþóãçÿxøÿû÷çÿ€óàÁÿ烿Áàþ‡€Ï|À|ðð?€ÿðÇÿþø<óû÷üÿÇÿÏøÿãçççüüûÿŸüüüÿàÿÏߟüàþðþÿßàÿÏÏÏŸøøÿóãçÿ€xùóóãÏÿ€ïàÃÿÇÿÃà|;áÀxððà?€ÿŸŸøïÿþü8ñûÿýÿçÿïøÿóççïüüÿÿŸüþ|ÿðÿÏÏŸþàþðÿÿßàÿçÇÏŸxøÿûãçÿ€|xûããïÿ€?àÁàƒÿ‡Áà?Ç€Ÿ~{ÿÀüøð?ÿß?üÿÿýþÿøÿñùûùÿçÿçàÿóãçïüø÷ߟŸ|þýÿðÏÏ¿þà~ÀÿûÏ€çïÇÏŸðøÿóãïÿ€xxûããψàÁà‡ïÁà‡OÇ?ùÿÀüüøð?ÿß?üÿÿýøüü}øùûñ÷ãÿçàÿûããïüý÷ߟ|ýÿð‡ÏÏ¿þÀÀÿÿÏ€ÃçÇÏŸðøÿóãïÿ|xÿããï€ýàÁð‡ÏƒáàÏcç€ÏÏŸ?ùÿ€üüüð?ÿß>üÿÿýøøøñùóñÿãççÀñûããïøýçÿŸŸü~?ýÿð‡Ï¿þÀ>?Àÿÿ€ÃçÇÏŸðøøãï€xxÿÃãïƒñàÁùç‡ñàþsçðÿÇÿŸ?ðÿð>xø`?ÿÿüÿÿùøøøùùûðÿããçàñûããçøãÿþ~?ýÿà‡ÇÏ¿üÀ>?€þÏ€ÃçÇÏøøøãïÃ|xÃãïÇ€óàÁÿçÇÿσÿðþçðÿÃþŸà~?ÿßüÿÿýøøø?ñùûðÿãççÀñûããçüãÿŸü~?ýð‡ÇϾ€|€Ï€ÃçÇχøøüsãïç€|xÿãçÿÿøÀÿÇ÷ÿßÿøüÇàÿø?€ÿߟüÿçüøøüøùûñÿããçàðûãããþ?ÇÿŸþ~?ýø`‡ÇÏ¿€|Ÿ€†?ï€ÃçÇÏŸøøÿóãçÿ€üøÿããçÿÿøàÿÇ÷ÿÿÀÿðøƒÀà?€à?üøÿøøøÿùùóóÿãççÀñûããáþ?ÇÏ¿~~>ýÿðÏÇÏ¿þ€xßÿïï€ÃçÇÿœøÿ÷ãçÿüüÿó÷ãþÿøà?Ãç¿€|À`€áß?üüÿþøüüýøûûó÷ãççàñûã÷î~ß¿þ~~ýÿðÿÇÿßþ?€ÿÿßÿ÷ïàçÏÇÿßøÿ?ç÷óÿ|üÿû÷áü|ð€Àÿßþÿÿþÿüÿüÿûÿÿÿççøÿóãÿïþÿÿ¿ÿ?þüÿàÿÇÿßü€ÿÿÿþÿïðÿÏçÿÿø~Ç÷ñþ<ýÿø@€xðÿßÿÿÿÿÿÿþÿüÿùÿÿÿ÷çøÿçóÿïþÿÿÿÿ?ýþÿàÿÇÿÏøÀÿÿþþÿÏðÿãÿßø<ƒãàøàxÿûÿÿÿÿÿïüÿþÿüÿùÿÿÿ÷ãøÿÇñÿïüÿÿßÿøþÀÿÃÿ‡ðÀÿÿþü‡àþá÷àÿðÿñÿ¿¿ÿÏüþ?üøñýÿ÷çãðÿ‡ðÿÇøÿߟþàü?ÿÀÂà€?ÿþð€Àÿðÿàÿ?Ÿþ?‡ø|p>ð@pxÀ@þ0ðÀÀ|ÀÿàÿÀ~<àðÀøÀÿÀðÀøà<øÀðàøÀààð€8à>?€>üÿ€?À?à>€>ÀüÿÀà?à>?€>€~üÿÀÿð~à<?À~8€?ü÷Àÿð><à€~ø?>üã€ÿð|@|àðÀÀøƒ€?|ÿ€sÌ páø¾~Àüøðáþ??Çð<ÀüàðøÿŸþðà €ÿ?áüÿŸàÿþüÀÿÃÿÿ~?ãüðüÿùÿãþüÿðãÿÿÏø|?àþ?ñùùÿŸþ?ð÷þ?ƒÿ€ÿÀÿ€ÿÏûþÿÇÿ¿ñÿÏþ|àÿçÿÿ??÷þøþÿÏÿŸýÿŸóÿþÿ¿üãÿ€?ÿÿü~ðÿ?üüùÿßÿøÿÿþÿÏÿƒÿ€ÿ€ÿßÿþÿÏÿÿóÿÿþüÿàÿÏÿÿ?ÿÿðÿÿßÿŸÿÿ¿÷ÿÿþ~üçß?>ÿÿ|~ÿðÿ}üøùÿŸÿÿøÿÿÿÿïÿÇÿÀÿÀÿÿÿþÿÿÿÿùÿÿÿ|ÿðÿïÿß?ÿÿðÿÿïÿßÿÿþ÷ÿ¿þ~?üç߀¾ß|>ÿøü~|øûÿüÿÿÿÿÏÿÏÿ€ÿÀ÷ÿÿøÿÿÿýùÿþ>üÿàçÏ¿Ÿ??ÿÿàÿÿïÏßÿÿÿïÿ¾~|üçÿ€üüü}ÿðø~øøøÿø÷ÿÿ÷çÿÏÏÀïàãÿþøÿÿ¿?øø~>|ÿðçïߟ?ÿ€àãÿïÇï‡ÿÿïÿ¾>~üáÿ€ü|þ?ÿðø>|øøÿø÷çýÿççÏÀÿàáÿÿøÿÿ¿?ùø|>|ðçÏÿ?>ÿÀÃÿï‡ïÿ¿ÿÿ>~||ãÿ€øøü}ð@ø>øøøø÷çàÿççïÀÿðà?üøÿÏÿ?øø~>|ÿðççÿ„€ÃóÇï‡Àÿ€>>~~çÿ€ø|þ>øø>|øøüÿÇÀÿçç߀ÿðà~øàþùø|>}ÿðçÇþ?>€?ÃðO‡ï‡ÁŸÿÃ>>|~<ïÏ€ð|?|}øpø|xøøþxÿÇáÿççßÀÿøàÿ øñïüøø~>}ûðççþ?Ï>8ãùïÇï‡÷ûÿï¾>~?üç߀ð|?~>ÿðÿ|~|øøøÿ‡Ãÿçç߀øÿÿ¿øÿÿüÿùøýÿðçÏþÿ>ÿÿøÃÿïÏχÿýÿÿ¾>¿üïÿààü?ÿ~ÿðþüýøþðÿ‡ã÷ççïÏÇüÿÿÿÿÿÿÿÿÿø?ÿ€}ÿüçïÿŸÿ¿ÿÿüáÿïÿ߃ÿÿÿÿÿ??¿ü÷ÿààü?ÿ~ðþüÿüþ?ðÿÏãÿ÷çÏÿÏ€?üÿÿýÿÿßÿÿÿü?ÿÿÿüïÿÿßÿÿþÿøàÿÏÿ¿ƒÿ¿÷ÿ?Ÿø÷ÿÀãü?ÿ~àü?ðÿüøàÿÿãÿÿÿïÿïÀ?þÿßüÿÿßÿÿÿþÿþÿü÷ÿÿÏÿÿþÿøðÿÏÿ?Áÿ?óþ?‡ðóÿÀáþÿ?Àøà?ùüðÀÿÿñÿÿÿçÿÿÿøþÿÿýüÿþðçÿÿÇÞøÿðà?ü?€|Àü€Ã€ `ÿÿñÿÿÿãÿï€?ÿð|?ÿžxüü|8`ÿÁ` ÀÀÿÿðyãçÁÿ?ÿ€ÿÀÀñüÀ?ÿ€ÿÀÀÿðÿÿàðÿàþþàxðÿÀøø€üøÿ€àþø €þðÀàð>Àþ€€x€Àà?ðø~À~€àÀ8|ÀÿÀà?ðø~€>€ð€À?x~ÀÿÀà?ðø~€ð€Àø>ÀÿÀÀ??ðø>ð€ÀþøÀóÀ€~ ø> `àð>€øð‡ÀÀð€À€|<ÿÀ|g€>ƒ€œøàáÃð>ÃÃþø<<ûð?€ð >€øð‡ÀøÿðüðÿðÿçáÿÿÿðþÿàÿÃççþøÿøóïü>?ãççÿÿ€?þ~>ÿÿøàð?ßßøøÿ?ÁððÇÀüÿøü?ùÿðÿÿçãÿÿÿøþÿñÿãççÿùÿßøóïþ>?óçïÿÿ€þ~>ÿÿüÿà~ðÿÇÿ‡ÿ‡ü?üÿ€€ÿñðàÇÀþÿøüýÿùÿÿççÿÏÿ€ÿ?üþÿùÿóãçÿûÿÿøóÿþ>óãçÿÿ€?þ>>ÿüÿðþÿñÿïÿÏÿþüÿ€ÿûààÇÀÿÿøøÿýÿó÷ÿ‡ÏßÏÿ€??üüÿû÷óãçþûÿÿpóß~>ÿûãçÿû€?>>>?~}ÿðüÿóÿ÷ÿÇÿÏþ?þÿÿðàÇÀÿþüðø~ýûãï‡ï‡ïÏ€>üøùûáûóãàûÿÿðóÏþ>ÿùããáÿ€>>>>=ÿÿøø÷ó÷÷ÿÇÿßþ?þ|ÿÿàÀÇÀ?þüøñø|ùÿã߇߇~?ÿüðñÿáûãçÀ÷ÿÿàÿþ>ÿóãçÁÿ?>>>>~}ÿÿø`ãóáûçççÏÿ?>~‡ÿàÀçÀ?ÿ|üñø~øÿà‡ïƒïÏ€~øððÿáûóãàûÿøÿþ>ÿñããàÿ€>>>}ðøã÷á÷çÇÏÏþ>~|þÿàÀÇÀ?üüøñø~ùÿà‡ß‡ïŸ€~>üððÿáûãçÀ÷Àøÿþ~øãçÀÀ?>>>>|}ððá÷áûçççÇÿ??>ßÿàÀçÀ?|üñø~øûðO‡ïÃï€~~ððÿáûóãàûðÏøÿ¾>ü3ãçàßÀ>>>>>}ø÷ðã÷áÿçÇÏÏþ>~|¾ÿà€ÇÀ?üøñø|ùÿñÿ‡Ï‡ÏŸ€~?~|àðÿáóãçÀûÿýø~?~~üóççÁÏÀ?>>>>|}ÿà>`á÷áûçççßÿ?>~ÿÿàÀÇÀÿ|üðü|üûÿï‡ïçÏÏ€?ÿüàùûùñÿãàùÿþü~ÿ>ùÿ÷á÷À?ÿ>~~ÿàðøã÷ã÷çÇÏß¾>~~ÿÿà€ÇÀþüøðÿùùûÿßççÿ߀?ÿÿøàÿóÿãÿçàùÿÿø~ÿþñÿÿáÿÀ??ÿ~þÿà>ÿÀðøûóóóçççßÿ¿?Àÿûð€ÇÀþÿüøøýýÿÏïãÿßÀÿ¿øàÿñÿáÿ÷àüÿßø>ÿÿ?ñÿÿðÿÀ??ÿÿ~?ÀÿððøÿûÿçççïßÿÿÀÿãð‡Àüÿüø?ñýøÿïãÿßÀÿðÀÿàÿÁÿïàüÿð<ÿ~?Àÿÿàÿ>?þ~~þ>ÿððøÿýÿçÿïïÿÿÿÿ?Àÿáð‡Àø|üøÀùøÇàþ‡ÀþàÀÿ€?}ÃÀøàŽ>€8€ÿÿððÿøÿ‡ïïïÏÿ¿ÿ?ÿðÀà€O€ðÿ€>ùðàðà?çãÇÇÿ?þøŸÀÿ€øÿ€qð`ðxûþ>Àÿø€?Áð@?ð€|þ>ÀþüÀðð€ø?ø8€üøƒÿÀ?àÿð?xø€0àÇÿÀðñð À¿€ÿÀ?àáð>€¿ÀÿþÿÀààð>€€?€àÿÿÞ?ààð<€à€€?€àÿÿÿÿîà?ààð<>À?€à?@>{àÿüÿÿ>ÞÀ?ðàð|?à€ð?€à>{àÿÿ<ÞÀ?ððð|>À?€à>>ð|óàÿþÿüpÜÀ?ðùð|>À‡Àà>ƒ€ƒð|óàÿÿðÞ€À?ðÿø| €€0üà?Àüÿ‡üÿøÿƒÿñÿÇü€|÷ÀÿþÿÏŸÀà?àÿøxÿ†ðÀþàþ?ðûþÿÏþÿÏüÿÇÿŸûÿçüÿÀ>ÿÀÿþÿÏŸÀà?àðxÿøxø?‡ðÇÿÿŸÿ~áÿ?à?ÿøÿÿÿÿÿÿÿßÿÿÏÿ¿ûÿ÷ýÿÀ?ÿ€ÿÏ€àÀøÿþüüüÏøÏÿ‡ÿŸÿ??óÿ¿ð?ÿÿøÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿóùÿàÿÿÇ€?àðÿþ?þüüÿïøÏÿÿŸŸÿ??ÿÿÿð?ÿÿùÿÿÿ€ÿÿÿÿþÿÿÿýûóóÿàþ}ààÿþþ|ýÿÿüÏÿŸ¿ŸŸ¿Ÿ?ÿÿÿðŸÿùûÿÿ€ã÷Ãÿþ?ÿÿÿýùóóÿàø€}ðàÿ~~~|}ÿÿøÏ¿?ÿÿÿÿàÿùûÿÿ€ãÿÇÿþÿÿÿýùóóÿààüøÀþ>|~|ÿÿøÇÏß¿Ÿ?ÿÿÿÿàßùÿÿÿá÷Çÿþÿ¿ÿñùûóþÀüøð>ü~|ÿÿðÇÏ¿Ÿ¾?ÿÿÿ¿ðÿøÿï€á÷ÇàþàÿüùóóðÀð>ü~|ÿïøÇÏ¿Ÿ¾Ÿ?üÀðÿøÿïÀã÷Ãñÿñÿþ=ùóóùàÀð>ü~|ðüÇÏ¿Ÿ¿?ü?ÃÿðþøÿÏÿ€ã÷ÃÿÿÿÿÿßÿýùóÿÿçÀð~ü~|ÿðÿüÏÏ¿Ÿ¿?þÿÿûøŸÿÿÿïÿ€ÿïÃÿÿÿÿÿÿÿýùóÿÿï€ð>þ~|ýÿþüÏÏŸÿŸ¿ÿÿÿÿÿøÿÿÿ÷ÿÿÏáÿßýÿÏÿÿûÿùþÿÏ€ð~ÿüýÿþüÏÏŸÿß¿ÿÿÿÿÿðþÿÿÿÿÿñÿŸùÿÿßóÿùüÿ€ð~þÿÿÿüïÏÏÿߟÿÿ?óÿ?ðü?ÿÿùþÿàðÿáûøø?€Àð~ü?üÿßøïÏÏÿßÿÿ?áþ?àø?ÿøøüÀÀÀ ?àøüüøÏÏÃÿ‡ÿþÀ|À€ùøà=ðà>ü0?ð€ÿðàyð~€€ÿððxð|?ÿ€ÿàðxð~?€€ÿ€àxðþ?€>yð~xð<}à?àÀÞ€Üüøøðàÿ€8ÿÀÿÀ@Àÿÿÿÿÿÿÿÿÿÿÿÿÿüÿàÿà‡ÞÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÀÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÀÀÀÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüàÿÀÀÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüðÿàÀÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûþ`|àÿÿàÀ>ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøùãÿÿÿÿÿøp|àÿÿàà>ÿÿçÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‡ü|>ãàÀÀ<ð|>ÁààÀ<À|~ƒàÀÀ|À|þàÀ|À|þàÀ|À|þàÀ|À||ÀÀxÀ||Ààx€À|øÀÀøÀÀ|ø€ÀÀøàÀ|øàÀÀðàÀ|øð€ÀðàÀ|ð<ð€À€ð|àÀ|ð<ð€ÀÀøüàÀ|ð|øÀÀàøþÀÀ|Ǿð|x?àÀàðü€À|þÿÿ€àÀ8ÀðÀ|ÿÿÿÀ<ðÀ<xÀ?ðÀ|ÿ‡?À<ðÀ|xÀ?àÀ|€ƒ€àÀþxÿ?à?À€|€‚?ÀÀþxÿÀÀ|ƒÿ€Àþx?ÿ€€|ÿÀÀüx?þÀ|?€ÿÀÀøÿð¸€ü€|Àÿþÿ€˜Àø?ÿð8?ÿÿÿüÀ|Àÿþþÿÿÿÿÿÿÿ€Àø?ÿø8?ÿÿÿü€|<óÀÿþÿþ>Ü>ÿÿÿÿÿÿÿ€Àð?ÿðpÿÿÿøÀ||óàÿüÿÿ<Ü>øÿÿÿÿÿÿÿ€Àðxp€ø|óÀÿÿx¼>üÿÿÿÿþÀàxr>À||óÀÿþÿþð¼>þÀð8>€üyçÀÿþà8|žÀàx>~<ÀÀ||çÀÿþÿÏ¿€~žÀàx><€Àü}ÿ€ÿŸ?€þÀÀx<xÀà|?ÿÿÏ€ÿÀÀ8x€Ààü?þÿžþÀ'€0ðÀàð|üþžÀ?€Àð€Àð|À¾ÀÀ8ààÀàð|ÀþðÀ8ðÀÀÀÀÁð|Àü<ðÀ<|àÀƒà?ÀÀàð|Àø>øÀ|`€ƒÀÿÁàáñðü€>ðÀü<ÀÃàÿÁáððð|€>Àþ>€ÃÁÿÃãðñð|~ÀþþÀÃáÿããðøð|?ÀÿÿÀ?ÃÁÿÃÃðùð|ÿÿÀÿþÀ?ãáÿãÃðxð|ÿ€ÿ€À߀|À?ãáÿÃÃàxð|ï€ÀŸ€xÀ?óàÿÃÁàxð|ïÀ>ÀÀxÀ?ãàÿƒÁàñð|ÇÀ<ÀÀøÀãàáàðð|Çà|ÀÀøÀƒàpáàñð|ƒà|ÀàðÀƒàðàðð|ƒà|ÀàðÀƒàààð|ðxÀáðÀƒà`ð|ðxÀ?ÿñðÀƒàð|øøÀ?ÿñðÀƒàð|ÿøøÀ?ÿñàÀƒàð|ÿøðÀ?ÿãàÀƒàð|ÿððÀàÀƒàð|ðÀ?ÀÀàð| àÀ€Àƒà`|ÿÀàÿÀ€àüÿà?ÀÿÀ>À€À|ÿà€ÿÀÀ€üÿÀøÀ€|€€|À€|€üÀ€|€øÀ€|€øÀ€|€üÀ€|€øÀ€|€øÀ€|€øÀ€|€øÀ€|€üÀ€|€üÀ€|€€üÀ€|€üÀ€|€üÀ€|Àü p]ÀÀ€|><ðýà€|<<ƒÀ><àÜðÀ€|€~<‡à<ÀÌxÀ€à €€|Àü<‡à8€€xÀ€ðøÀÇÀ|ÿÀÀ~ƒà8€€<À€ðüÀïð|ÿàÀ>à€8x€<À€ñüÀÿð|ÿà`À8>€à|À>þà8þ€€àÁüÀÿð|ÇáÀà8Àx=ðŸÀƒÿ‡ÿÿðÿþø0ÿ?€ÀðÁþÀþð|ÀãÀðxÄ0xÁøþ?ø<Ãÿ€€ÿÇÿÏÿÃÿñÿ€~?øpÿŸ€Àð>Ãþ€þþð|€ÀÁðüÀÿ‡ÿüáþ?ãüÿ?ü|çÿ€€çÇÿÇÿÇžqïÀ?øpóÞ€ð>Ãÿ€ÿþðü€ðÿãùþàÿÇÿ‡þ?ãÿóü~?ü|÷ÿÀ€ÃççççχÞ3ÿÀ<ø`<óÞÀ€ð>Çßÿþð|‡ðÿŸóøþ?ðÿÇÿ¾?çÿ÷œx>~<ÿóÇÀ€ƒãÃçÃï߃ÿÀ<øà|ãÞ€àÇŸþþðüÿ‡ðÿ¿ùðüðÿçÿ<çÿÿ÷Èx<><ÿóÇÀ€ãÁçƒïßçÿ€<|àxãÞ€àÇÿÿÿð|ÿƒÀÇ¿ùàxøÃçÇÇ>?ÿ€ÿ÷ðx<<ÿãÃÀ€óÁçƒïÏ÷À<xàxçÞ<€à>ÿþÿðüÿƒÀ‡ÿùàøÿøÁçÇÇþ?ÿÿóøx<<ðCÃÀ€óÁçïÇÿÀ<|àyçž<€ð>‡ÿþÏàüÿ‡À€ùàxÿðÁóÇÃþï€ðþx<<ðÃÀ€ÁãÁçƒïƒÁûÁÀ>~ÀyÏŸ<8€à<‡þ‡àüÀ€ñàøðÁçLJþïøþx<<ð#ÇÀ€ÁãÃçƒÏ‡Èûã€>?øÀyß<|ÀÀð>ü€À€xàøøÁçÇÏžÿƒø2x<<üóÃÀ€ããÃÇÃÇÇœ{ÿ€ÿ?øÀ?þ8~€ãà<ø€À€|àðø ÃçÇŸ>3ÿÇüöx<<|ÿãÇÀ€÷Ãç‡ï‡ÿùÿÿð€?üx<~€ç€ð|€3Àãþ9àø|ðÃçÇÏ¿8÷ÿ÷ž?ü|ççÀÀÿƒÿ‡ÿþðÿþà€ð€x<>€ç€à<ø€÷ÀÿÿùðøðçÇÇßÿ½÷þçü?ø|Çïà€ÿþüøà|€€€€€px€ÿ€à|ÿóøÿ¿øü?ðÿïïÿ¿ãþ?Çü?à|ƒÇÀÀÀ€€€ðp<€ï@øÿçøÿ?ðü~?àÿÏÏß?ÁüƒðÀ€€ÌàðpÀÿàð|ÿáðþàx<Àü€ÀÀ€ïÀà €ÿøà<øÿÁàpÀÀÀo€€Àÿü€ðüÀàà€ÿüà<øÀÀÀÀÿüð|à€>üà<øÀ€ð<ü`|>ÿà€ø9ø@ð<øÿÿ¿ÿÿÿÿð€ø øðü|ÿÿßÿÿÿÿð€ðøààþøÀààüðø>ÿü€ààüðü€ÿ€øÀàà€øðþ>ÿÀÿ€ü€ÀÀ€à?ÿÀÿÀÀøÀÀàÀð?ÿ€ÿà8ÿà‡à|€€àÀà~ÿð|à8à?áÿà‡àø€ÀàÀ`~Áÿðþðð8ø¿Ÿñóðƒð|€€àÀ€ðþçÿÿÿÿÿÿÿÿÿÿÿÿÿÿûþÿßþ÷ÿ¿ùÿ¿üüÀ€àãàÏßóüüûÿŸÿ¿ÿûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüü€ƒÿÿÿÿûÀÿÿÿ÷ÿÿŸýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿ÿÿÿüüÀƒÿÿÿÿûàÿÿÿÿþÿÏþÿÿßÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿ýÿ¿ü|€ƒÿÿÿÿûàßÿóþÿüùÿŸÿ?ÿùÿÿÿÿÿÿÿÿÿ¿ûÿþÿÀÿüü>#ð0ü<ÀÃÿÿÿÿûà‡€<ððÿÀïüþ?ÇÿÿÿñýüÀüü|€ÀÀà€ððÿ€çüxpðøü?€?øü üÀàÀÀƒÀ€ðàÿ€?Ãøpà00?ðü|ÀÀà €à?€|‡Àðàÿ?Àðpà|üÀààÀ€€à?À|‡À€ðàÿ€`À~ü€<àà`Àà€ÀÀà?Àþ‡€àÀ~~ü€|àààÀ`€pð ðà3Ÿø|ðÀÀÀ?Àþ?‡€@À>ü€<ÀààÀ€Àð?€ïø?ùø?øðßÃüüøÿƒÀ€Áÿ?‡à€>üÀ<€àðχðð‡ðüÃÿÃü>ÿüü?øÿ߇¾þyÿƒÀÀÁÿ‚ð€>üÀ<€àøÀ€þþóü?ÿÇøÿøÿÏøÿüûÃÿÃü>?ÿüü||ÿÏ<>>xpxÿÃà€?ÿŸð?|ø>~øü?óÿãÿÇÿó¼øñç‡ÇÏž1àñááãÀxxþxÀà€‡ÿžà>ø?ø>>ü>|?óÿóÿÇsÏ¿øáçLJŸàóááãÀxxþxÀà€ÇÿÎð~ž|>x>>|<<ùññãß3ÏŸøàOç‡áàááÃÀx><||<ùáóãÃ?Á¿žøàçñà?áãÃÀx<<|<ÿùàñãáÿàÿÞxàLJùàÿááãÀx €þñááâ><<<x><|x<ÿóàóãÃÿóÿ‡þxàǃùàóáãÃÀx€?ãáãÇ><<<<|xx¿Ÿ?ùÿƒÀ€àøÞüü><||>øàñãçÏûç‡ü|ðoƒÇ‡ˆùáñááãàx>>>?x?øüïÿ¿ðÿÀ€áøþø?x><<||<ø3àóãïŸÿÏð~8øï‡‡œyáóáãÃø|xøùç€=ÿóãçü>>~~?ð?ñüÏÿ¿?àþ€€ñøþ|>|>><~>~9ññã矜ÿÏÏþ?øÿçyýÿùóáüðüñÿüÿóóçü>>>>?ÀÁøƒÏ€€€ãðüø|ü>~<|~~ñóããïÿÜÿÿïÿ?ðÿÃÿÏŸñýÿóãáøÁøàþøxáÁð8€óðþ|?ÿþ>|?ÿñÿç÷çÿßûÿïÿŸðÁþÏðx|ñáàðx€<€çàüø?þþ~~?ÿ?ãÿ‡÷çÿŸóÿÏÿà?xÀx€<€÷àþ|þþ~~þáÿÃáÇàA€xÀ~<€ïÀþø8˜àøà~0€oÀþ|àÿþ00€_€þøàþüÀÿ€~|ðü€ÿ~øððÀÿ>|à€þ>øÀþx€üøÀ€ü€x€øÀøÀ€øÀ|€ðàxÀ€ðð|€ððxÀðø|€€àøø<À€?>À€ðü|p>À€?>à€?à~üðÿÀ><€àÀ€?`~|>ðÿÿà<€ð€þð?|>ðÿÿàxxÀ€üð€|ÀðññÀxð8Àx€üðÀ|pÀðÃàÀÀð<€>ø|<<áƒÁÀ<à€€ð|à>À?ÿø|<àáÀ<à€ðüà>€ùøð px<àÃÀ€àü€gÁà€ðüÀ>Àðyàx@x àg€Àø<ÿáçðÿàøüáÿãø?€€p€üÀ<€<ð1à<€øáø>ƒ¼~àñþñáÿÀÃþ<ÿãÇñÿ¿ðüüáÿóøÀ€€ ÀÀüÀ€<€ð3À~€ü?ãü??ÇüðÿñþñóÿàÇþ<ÿáãáÿ¿ð<<|xñÿñðÿà€À>àüÀðx€gÀ~€||àøÀþ€üïþ>ïüÿxøøðñûà<áããÀø?ø~ðüÀþÀøïóçýçx~xxðññàÿ<ááãÀðø>|?øÀ|Àð>ÏÿçÁóx<?ø‡ÀxÀð>><ÿóÁùøyøñó燀><ø?‡ÀxÀð<þ¹ÿçÀþø>æ>xøññÏÇÀ><øÇÀxÀð>þ¹àÀÿø<ü<|ðñðÇÀ><xÇÀðÀð<Þñà€žx|>þ>|ðñðÿÇÀ><xçÀðÀð<žððgÀ¼x>>ÿ>ðññÿ‡À><|çÀðÀð<àøçÀǼx|xxùññàçþ<áããøð?ðÿ?þüÿáüÿÀ€€?þƒùÿç€üÀ<>><|8ÇÁàÀð<¿ƒàÿçÇ¿þ|xÿùñðçþ~óóáûøðÿþüÿàüÀ€?þáÿç€|À<>>Ÿ>ÀñóÇÇÀ><?ø‡ÃÁø€þ>ÿàÏÁÿ¿þ~|ññøÁü~óóáóøÀžü>xÿ€x?€€?üáÿã€øà|><<àñóÿÇÀÿ?Ÿ?ðÿÃÁø€þþÿÀßÁÿþ~ü>>áñð€ð|ÀáÀ@ ð €ü?À€|ÿø>>ß>ùùóÿçàÿ?Ÿ¿Ÿðÿáð€|þÏ€À~ð€ø?øÿð~ÿ~ýùûÿïàÿ?¿àÿààð€ üÿð??þ~üøñûÇàðø€øÀøûü`ðø€øø<x<`€øÿø<x€|ÿð `€øÿà €|€ÀÀ€øÀpxÀÀ€|@ðÿððx|ÀÀ€øÇðÿøðxx€ÀÀ|€€€çÀðÿø€x<<€À€øàÀ€€ÇÀ€ð>ÿðpxÀ€|àÀ€€ƒÀÀð|08 <Ïx€øàÀ€ ÀÀð0ø0`€ð|€~ñà÷ÀøƒÿƒÿüÀ|àà€Àà>¼ðø?ü?ãü?ÀÿÀÿ€øñÿàü?çÿÃÿÇþ€øàÀ€>€>ð~þ?ÇñÿüðøüçþÀÿŸ€ï€ðñÿà<øçÿÃÿ‡ž€|à0ð€ðàÀ‡‡ð>øÿÿ?çñÿ‡þðø?þ?çyÀÇÏãÀxxøð<>>Ïþù€ÿÎÇ€pððàxxÿóÁãÃÇÀ|ÿàÿÃÿÇÿÃþüþøñÿ¿Ÿü<<ÇÏþóÁç‡Èàððÿ~ÿÏÏÀxxððx<ÿñàóÃÀÀ€øÿáÿçÿÇÿÏþ|>xññÿ<ü|<‡ÀÿóÁχàðà<þÿ€pðððð<ðÁóÃÃþ?ÀÀ|ãáãóÿãÿÏ¿>>ðøð>Ÿþ||‡‡€àÿóÀ?ƒÁàðð?ÀÀÿÀxxððx<ðàóÃÃï?à€øÃãÁóãÃÇÏÿ|Ž>Áàyð>?ü|ü‡ÁðÀÿ‡àðàà<ÀÀç€pðððø<ð3ÁãÃÏž?ÀÀ|áãáóãããÏÿþ†þñà|ð¿ü|ü‡‡€àðÁ÷ÃÁàðàðààÏãÀxxðð|<ø1àóãÇ€øÁçÁóããÃÏþü‡þùàxð>¼|¼‡àð#ÃLJàðÀx<†càóÏÇÀxððð||ÿóáãÃÏŸÀüÁãàûãããÏþþýð|ð¾|<‡‡€àüsÃÇÃÁððÀ8þqàÿÏàÿðøøð?þñóÃãÇÿÀ€üÁçÀóãÃÃÏ€<Ÿ>ýðxð>¿|<Ï€àÿóãïÇ€ÿøÀ8¼>þÀÿàÿðùùðþ?áÿççÿ€À|áãàñãããσ>Ÿ|ðxðŸþ>?€ÿÇ€àãûÿçÀÿüÀ<üÿüÀÿÀÿà?yùøþÁÿçó瀀øóãáóãÃÃÏÿ€Ÿ?<øðøŸü>ÿ€ÿÏŸÀð?ÁñÿÏàø?à8ðÿð?<a€àÀüÿñùããããçÿÿ€Ïÿ€¼ðøÏÏøÿ€ÿÏßÀðÀðóÇà?àà<à€üÿùÿÇãçççþÿ€ÿ€ø?Áø‡ðžã8àÀüÿøÿÇó÷çãþÿ€‡ÿø€øà8à€øà?Áã€øŽàxðÀø€ð?€ð€øÀÀ?€øÀ€ø@Àü€p€0ßÿãÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿü€ÀÀøÀ Ïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø€€À?àøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø>À€À;àðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø@x€À€Àxààÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðð€üÀ À€ÀxÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿçþÿÿüð€øÀÀ€ÀxÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿßàø€|8àÀ€ÀÀü€œ?ïøþðçÿ>ø?€ÿÿÿÿÿÿßþ?üÀÀøxxàGx€wÀÀÿ€þÿàÃþ?ÃþÃÿÃüþüïÿÿøÀ8x þÁãÀüÀðññÿÀþ|ýÿàÿ‡ÀÿƒÿÿàÃÿÇþóÃÿÇüü~ïÿÿüÿàp`ðàx?€ÿÀƒþþãçãü?ÀðñóÿÀþ|?ýÿáσÏÿ€ÇüóÃóÇœx>?çÇÏž~óàüà?øüüãü?€ÿ‡øxÀÿàÿÇÿÿñóãþðøðñÿàÎñ€|xóàñóÁóàxùáçäÿðøññáàøÿü€ŸþxààûÁóàxøñãøÿðxððñàþ<<ðððÿÃÀƒç‡‡€ÃÏÀùááàþx<<LJžð ô;ñóïÿ€><þþ?üx?àà÷ÁóÀxüÁáãýðøðñáàþ<LJŸþÿàþ?ñÿÏ><À>xÿàà÷ÁóÀxxáà~ðpøññáà<ñóLJ€‡‡‡ ÏŸÁ÷óãÇx><<‡ŸüÿÀÿðÿÏ€>àžxñààóáóàx|9ñãüðøùññà<ððóÿçÀÿã燇‡ðçÿÀãÀÿûãçü|üÿçÏÇøÀýðÿƒ<GÀyóàáãããÀxùÿçžÿàðÿñáàÞ|ùñóÿçÀÿÃÿ‡àçÿ€ÇÀÿ÷ççøüðÿÏÇð?Ÿüøÿç€>ÿsàŸþyÿøñáûãà?øÿóþàðùñðþ~?üùùÿïàÿÀþσÀã瀃ÀxàðxÀÀŸÿùÿçÿ>>þóÀÿŸüùÿøÿÁÿÇà?àÿ÷ü?Áð~ñóðü~üñðó‡Ààpÿüÿóÿþ?þÀÿÇüþÿøÿÀ‡ðà|áü€ððþüÿóþø~ø€ÿ‡ðüxàþ<Àð8þ?yÿøüð>ð?€ààðÀÿøÿÀ€pÀpà€ÿðÿàÀñðð?àÿàÿÀÿà>ð ÿàÿàÿà?øðø÷àÿ€?Àñßüà>ðà?€ÿŸ¿üÀþðà€ÿÏþ<Àp‡€ïpðs€ÿÏü<€ÀxøŸ€Æ€àðàÿÏü~€àÿðxø€ `8À€àøàðü~?àÿøxð€`àx€À<àøàðþ>`?àÿøx`à‡€ðàxp€‡ð|àøðð¾ðÿààÀ0àÀ€Áø€ïƒø?ø;ðþñþÀÏðþàüðð¿ÿøÿàààðÀ‡ðÀÿÿóü?ÁÿÇø€üøþ?óþÀçàþà|àøßüðÿààÀ0?ãüÇð‡‡‡ü?áÿ‡ÿùüãÿãøÿÀþøx?÷Ÿ€óóÀxà>Àðüðÿà?à|àƒÇÃüx‡üÿóüÿÏøLJüyóïÇÿyðyáÿááçÀ>~xxgÿÿóÀxà>Àðƒð?€ÿáÿáÀÿÃÇÇþøÿÏüÿÏóøÿßü÷ç‡>ðóÃçÇ0ðñáñááÿàÿðg‡Ÿø7ÁãÇŒ|ðñááááñÀÞð矞pÿ÷ÃÇÇŽ<ôóñááéÿÀþ|x>þ<<ÃøÀñààÿÿÞÀáçÁ€ÀáããÃÀyñç€ûÌyôxýÿLJüüãÿ‡ÇÏxþÿùññüÿ€ü~üü8<?ðÀñààÿÞàãçã€ÀáãçÇÀùÿÏ€ÿÜyþxüÿÏüüÁÿ‡ÏÏøüÿûóñøÿ€ø~ü>øx<À€ñàààÿóÿ€àÿáÿçÀøÿÏ€ÿŸøþüøÏÇøü€~ÇÇðx<ð@àp>àp<€ñÀ@<Àÿóÿ€àÿÁÿçÁøÿŸ€ÿŸðüüð?ÏÃð|Àð8góÀ8€ÿñÿð€ÿçÁø?€>à0€<àx~€ð~àþà>q€ðxÀðü?€àp€àà€àp|ðx>øþð€€øþðþ<ð88<ƒà|ÿøÎ>€øø|‡àxî ð€~<üø|`ƒð<Àx€<|à|<||yÿàx<ÿð›øxñà€ÿÁàðxðà<àqà<ð<ñà> ŸžÀÿß><<<|}ÿàx<ÿðøxxà€ÿÁàø<ðø€ðyð øðà0ÀÇžÿŸ<<<||yñÀø<ðŸøxøà€ÏÁà`øxð0øƒ<ðyøà<xùàøÿýÇŸÀÀ><<<|}àx<ð¿xxxà‡€ÏÁðà|<øp<çøxÿà<<ÿùàüÿùçŸàÀ<|<|xyð`ø<ø0|øx|9à‡€ŸcÁÿÀ~|ÿà<<ÿ?ÀüÿÀx<ÿûÀüüñÿÀà><><|}øð|<üpüxxùàïÀÿÇÿãÀÿÀ?þà<<þÀ?üÀx<ÿûÀüüàÿ€ÿß><>||yÿà~~ðŸþxà?ñüÿàÿÇÿÏïà€þ?À8<üpp8€<ÿÏà>>?þ||ÿà?ÿðþ?þüàñüÿàÿÃÿ‡Ïà?ø€8xp< €8ÿà~~þþüÀÿ?àü?þüÀÀøûãÀx<àxgpÿà~þþþ?€þÀø<|€€p<àxà~À>˜|xðxÀð~àø€à|Àð€€À€Æø8îÀÀü8î?à€€ðü|îðÀ<€€ø˜|0€ÀÀ€g?ƒðøøð8ÿü8ðÿÏà<à€?Àð?p~ÿáÿÀÿðÿð?áÿ¿‡üøøÿø€8ßø8ð÷ÇÀð€ïÀþ€ÿƒüŸùÿÿóÿÁÿŸðÿøñÿ¿üxx÷ü>8Ÿð8àÿç~áÁÞ?€çÃÿ€ü|?ùÿáÿ€ÿÇþ?Ÿùÿÿ<ùÿãçžøüðøÿž>xxã?ü8€ð0àÿç€ÿÿÇÇþÀççÿ€ü|ûÿãÿ‡€Ͼ>ûÏŸ<ùóãÇ¿øxüðøðþxyð?ü<ÿðàpÀÿÇÿ€ÿãçÿÿàããÿÀÞ|yýÿãLJ€‡ÏÿƒÿÞøñヿüx<ð|ðþxxþ?ü<?ÿøÁàp€à€ï€çÃçþÿàãÇçÀŒ|ùùñãÏ€Ÿÿ<ÿ¾ùáç€øx=àxð?øxxÿ<x€?ÿðÃÀ`àçÀÃããäÿðáããÀàxáç€xx=àxð>xx?¼xà8ãÀà<ðÏÏÿÃããáÿàáããÀü<}ðññÿ‡€ƒÏÀ|ñçÀ<x=ðxðxxÇþx<ð8óÀà?üÿǰÿŸ÷ƒÃãÁàããÇÀþ|ááã燀‡Ÿ>Á¾|9áçÁ¾xyðxð¼xùÇ¿øð8ðx?ÿç€ÀÿøÿÇðÿÏÿÃããáóáãÃÀ|áçχ€ÇÏþ>ÿŸÿÿ?ñóãÿððáðÏø?ýÿðàxð8?ÿçÀÿð>ÀçÀãããàÿð÷ãÃÀŸ|ññóÿçÀÿçþ>ÿÿÿŸñûñÿðà?ãøƒøøÿàà?€|ÏxÀ€`ÿøÀüÿà€À|àðÿðÀ€ð€ðÿà?€à‡Àø€ðÏà@À€?ÀÀ‡€ðÀð‡8ðÁàÀ÷ÀÀƒàÀð€<ðÃðÀó€€ÀÀð€à€ððÃðÀð€€Àøÿþ><áü€ðÀÃðÀð€88ÀŽƒxð?€ðð€ÿ‡ÿ¾>?÷þÀðÀÁðÀÀ>àøàÏþüàÃÿÿ‡ÿŸøÀøð÷Àÿ‡ÿž?÷ÿ?àðÀ>àðàÀð0À~¾þøÿøüøÿßÿþøÇÿƒÿƒÿüÿà|ðóÀ‡??Ïÿà?þ>ø|à?€>àð?ÿ‡øÀàþü??ÇÁÿÿŸÿüÿ€øø?øÿßÿÿøÇÿ‡‡‡‡ž|óà<ðãÀ‡ÿðÿÀ~üþ€à?À>àðãÿÇøÀÁÿþ?çÃÿÿŸÿŸüç€xðx|Ÿ=øÃLJ‡‡ýÿà|ðçÀ‡ÿðÿàþþ€àÁ€àÿðÿãÿçøÀÿŸþ?ÿçÃïÏÿÏÿß~Ç€|ðxð?ÿð~~~€8ÀÃÀx<ÀóñóóÿãàÀÿßÿ÷ǃçÇLJßþÏ€üðð>x?øÃÃχ‡?ýüüðÀ‡ü>ð?Ÿø~?<~<x€{ÇÀø<€áóáñóãàÀÿÏœÿ÷ǃçƒç‡ÿþ¿€üðð>x<ÃÃχ‡<àüðûÀ‡‡ü<ðü>?~|ÀÀü€øà0€ ~?ÏàïÀà?ßñü~ÀáóáùããàÀÿϸÿ÷σçƒçƒÿøÿ€üðø>x<ÃÃχ‡>à <ñãÀ‡‡ø>‡à€?ü?ÿðø€øÀ>€ü~þáüüÿðñþà?üø|üïùÿŸóÿ?àðÿÇÿ‡ýþ~ÿ?>àáóàùããàÀÿŸ¹ÿÇσçƒçƒþÿ€xðø>x|ÃÇχ‡> ð`<|ñãÀ‡à><þñÃÀ?þÿÃÿÃüþÀãþð>?àÿþ~ÿ?óþÿÿøÿýþ?ðþü~|ÿÿÿÿ€ÿÿ÷ÿÿð?ùÿçÿÇýþ~??øáóàùããàÀÀùðσçƒçƒþç€>|ðøÃÇχ‡‡‡=ÿà>ñ÷ð‡ÿþ>þÿÃà?þÿçÿÇüÿÿà?÷ÿð>?ðþ~ÿ?÷ÿÿÿüÿýþðÿ?þ~|ÿÿÿÿ€ÿÿçÿÿðûÿçÿÏýü~~øáãàûããÀÀÀñð'σçƒÇ‡ÿÇ€<|ð|øþ~ÿ?ÿÿ€ÿŸÿ?üÿþüø?ÿ>>|ÿÿûïÀÿ÷Ãÿÿø|ûãó÷ïÜø>|øáóàñããÀÀãÏðø÷ÇÃÇÃLJßþïà?þðøxøçÇÇÿç‡ÿ‡ÿøÀÿøÿðßÏÿÞþø~à?ÿ÷çÿïü?ÿðýÿß?ð~ÿø?~~|?ïÿ€ß¿>üþøÿø?¿|?~|ßóÿÀÿÿÃñÿøøÿáóçÏüø~|øñãáóããÀÀÿŸàÿçÇÇÇÇÏŸüÿà?þð?ñøŸ¿ðççÃÿÏÇÿ‡ÿð€¾øùàžÿƒˆà?~ÿãóïüÿðøÿÿ¿ð>ÿø>>~|ÿ€ÿ¿Ÿþ|~øÿø?ü>~|ÿÀÿ÷Áðÿøø7áûãçøø>|øÿùùóóãüàÿŸàÿçÃÿ‡ÿ‡ÿøÿàŸþøáüŸŸàãÇÿ÷æàà?þÿãçïð>ÿðð÷ÿ?àÿø>~|ü?ÿÿ¾ü|~øÿð>ü?||üÿ€ÿïÃáÿàøÁóçÇøø~|ÿðÿùÿãóãüàÿ?ÀÏãÿÿþðÿÀ<ð€ÀþÿããçüÿàøÿŸð>ÿð?>~|þÿ¿Ÿü|?øü?ü>~|ƒÿÀðÁðøüáûããþø>||ÿøÃóñøðþÀ?àþüðÀ€þ€?ýÿãççü?ððÿðø>~|ü?€ÿ¾?ü|~øø0>ü?~|ü‡ÿ€ðoƒáøpü?á÷çÇþø||?üàãáðà|€€€üýûããçþ‡øpø?ÿŸø>ü8>>~|?Ç€ÿ¿¿||>øþx?þ?>~|‡ïÀý÷Ãðþøáóãï~ø>|?yàÀ€Àð?û÷ãçîþ?Ÿùðüÿß?ûÀ~üø>~|ü?ÿß¿?~ü||øÿø??~~üü‡ÿÀÿïóàÿðÿÿóççÏþ|Ÿÿûà€€À?Ÿùÿûóï¿ÿÿðÿÿÿþÿà>ÿø?>~¿ÿ€ÿßÿÿÿüÿø?ÿ?þ?ÿþ‡ÿðÿçûððùÿç÷ïþÿ~ÿ¿ûðÀÀ€ÿáÿÿçïþþÿàÿÿÿÿÿà~ÿð~þÿÿÿÿÿÿÿøÿð?þ?ü?ÿþ?‡ÿàÿÇÿðà?ñÿÇÿïüþþÿ?óðÀ€€ÿÁÿÿÿ÷þþà÷ÿÿÿð?ðÿ?ÿƒÿÿïÿÿÿøðüøÿÿÃÿà?Ãÿøààƒ÷çü~?ÿáø€ÀÀÿÿÿ÷÷çüüÀ?çÿÿ÷ð?àþ?ÿüÿÇÿŸþà~À?ðà¹þóÀ?çà€€>ƒð8<ˆðÀ8€þ€ø<àÃÃøð€Ãçáð?À>>>øãæ ~?ðÀ€àà<€ÿ€€à|?à ðÀàà8€ÿÀàþ€à8øà€àà€àÀþÿ€øø<>ðÀ‚À à€<<à€þ€|ü>> àƒÀà€><Àðø>|ø~xÀ>à8à8ï€þ€?xÀð<|?8>À€pxÀ#Ç€|ø?€àþü|?ùÿÁÿ€€xàøx> ppðàÃÇÿ?ÃüüãÿßÁþ?ü€áÿüøûÿÃÏ€ÀøÀðøðà> |Ààà8>~øþáþ?ü‡øçÇÿÿ‡Ï‡Ÿçþþóÿÿáÿ¿þ?€á|yùûãLJ€àø€xÀðàüüð~?ƒãàxøøøüÿÿûÿãþüü=çÇÿÿ‡‡žþ<ùÿÿãÏŸ¾ãÿ€€xññáãχ€ððø?àø€ðþþð~ãóð|üüüüÿÏÿŸûÿŸóÿ?þ<|<ãÃãçÃLJ?øøùóÿŸãÿÀà<ùññះ€øøxàø€àþþð~ÿñóà|>~ü|ÿçÏÿŸ÷ÿ¼gÿž<CÃÃLJ‡øðñçÿžçÿ€øxùááàÿ‡€øðxðø€ð~ÿð>óññð|>>>|>Ûÿç‡Ï‡ÿ¿'ÿž>áùñð||<||ƒÿÇÏÿ¿ÿ<<þƒÿLJÏÿŸïþ><<ãÃÃÃÃLJÿxðñÿÀçÀ€~|?ÀñãLJ€À|xx~ð?ðþð?çþ~àÿïÀþü?€àñþþþññÿŸà>ÿðÿ‡þóÿùÿ‡üÏüþ?à?àùñð||<<üƒÀÏ€ÿ€<<<óÃÃLJ‡ž|ðñÿÁžçÀx~áçχ€àøø?øÿüùÿüÿÿÿÿùÿÿñÿŸþÀ?ðóÿþ?ÿùûÿ¿ð~ÿùÿÏÿóÿ€ýÿÇüÿïþþ?øàùñð||><þƒà‡ÏÀ‡ÿž<> 1óÃÃÃÃLJ>ððÿãŽãÿ€|ññãÿç€ùøx?øÿŸþÿüþ?þÿÿÿÿÿÿÿóÿŸÿÀøóÿ€þÿùûÿÿøþÿýÿÏÿóÿ€?ÿÿÏýÿÿþ?þøàùñð||<<>ƒàÏñÿÞ>ñ€ÿ¿þüþ?þÿÿÿÿ¿ÿÿÿóÿßÿ?Àø÷ÿ€?þÿùûÿÿøÿÿý÷çþóïÀ>÷Ïýóÿ¿~>øðøñð|>><>ƒñLJÿ¸ÿÿž>?Ÿü<óããÃÃÿLJÿÿß?øøññÿŸÀñÿü|ùóùÿïàÿà<ñ€Ïþüü~?ïÿÿ¿ÿÿÿ÷ÿßÿ?}ø÷߀?>}üùùÿÿøÿüÿÿçüóÿÀ|=ÿÏÿñï|>ÿøðññð|>><<ÿÏÿ<óÿ>>?Ÿø?çççïãÿÏÇçÿŸ?ñùùøÿŸ€ð~ø<ÿøá€àÏþ?~|ü~?~ÏÏÿþüùÿÿߟ??øóÿ€??|üùùøÿøÿüÿãàñÿÀ|ÿÏûàÇÿ|>ÿøùðÿð|?¾><ÿ€ÁÿÏÿƒÿ?óÿ?ø?çççïáûÇÃïŸáùùø|à8à‡|~|ü|~ÏÏÿþøùÿÿߟ??øóÿ€?>~øùùðÿø?€ü~ÿçàñÿÀ|ÿÏÿàÿ|>ÿðÿðÿøüü~~ÿÀÿþ?Áþáü>>à€øxÀ€|~|||~ÏÏÿüüùÿÿߟ??øóÿ€??øùùðÿð€üÿãàóÿÀ|ÿÇÿðÿ|>øàÿøþø>~ßÀø?€|Àxÿð€€|~|ü|~Ïþøù÷ÀŸ?ø÷ÿ€?>?øùùðü€üÿçà÷ÿÀ~÷Ãÿðÿ|>ü0?€>à|à €ÿàÁþ~||~~ÏÏþ üùÿáߟ?ø÷ÿÀ???ðùùðü8ü÷çà÷ïÀ?çÎÿùÿ¿~>þx€Àçþ?~|ü~?~ÏÏ¿>øùÿÿߟ?}üÿÏ€??àùùðÿø>üÿÿ÷à÷ÿà?ÿÿïÿÿÿ?þø€ÿÿ?~|ü~~ÏÏ¿üøùûÿߟ?ÀþÿÿÀ??øÿùðøÿÿÿÿÿà÷ÿà?ÿÿÿÿÿÿÿ¿ÿø?Àÿ¿þ~~ü?þþÏß¿ýýùûÿߟàþ÷ÿà?üÿÿøðþÿûÿÿðÿÿàûÿÿþÿßÿŸÿ?ð?Àÿüþÿüüþÿßßùýÿùÿ¿¿àþÿÿàþÿÿø?ðüÿñÿÿðóÿàñÿïüÿþàþø~üøþÿŸÏùýýüÿŸÀ?þóÿÀ??ÿþÿøàð?ÿÀÿÿàñóÀàñÇø?Ï€€à€üà<|üà>߇àùùø~€xá÷€ÿþ>wð€Àø€à 8ð€ÿþ>ø`>|ð€ÿü>ø€€ðð8ð>|ð€0ÿü8üÀÀøÿ€xx<8€pÿøøÀÀðÿ€ð<0<88€x?ÀÀ€øŸ€àx<x8øÀÿþ<ÀÀðÀ€øÀ=àüÀïƒÃÀþ‡üàÿ‡ÿþ|?à€ÀøÀ<à€oáø‡ÿþüþð{ñþð?øÿñÿÃãàÿ‡þáÿÇþø>?ðÀ`ð?€üð?Áÿãü?Ÿÿþ?þþðÿñþø?ùþ?óÿÁãàÏ><ãÇÇüð>xøø<|?üx8ùñááàÏ€>cÁãÀxøÿ?àÇüχÿÿü?àðÀü€>xóóÿï>óÿŸž>><ø|ððx<||xùáááàŽ>?ãÀð<ÿøÿßàÇÿÇÏÿ¿þ=ðøð€ø€<<ðøð>ÿxLJÏ<øxxxx<xùáááà?€þ?ÇóÀpðÿÏ€ÏÿùÇ?¿|yððð€ð€x9àùà<þü‡Þ<øxpðxx>xÿñáááàÿ‡üçãÀð<ðÿï€Ïÿ€|ÇÏ><øøü€ðÀ<à|ðþ‡ƒßÏ<øxxxx<xxáááàÿ€ž÷ÁãÀx>xÿÏßÿ~Ÿ>>>?ðøüð€|àyð<‡ƒÞ<øxxðx8xxáááÀÏŸ>3ççÀð<ø0ÿÏ€Ïÿ‡ÏŸøø~ðÀ<àxðǃßÏ<>xxxx|<xxáááà‡€Ÿ0óÁãÀx|xÀß?Çþ>>?ððÀ|à€|àùà<OLJß<|xxxð|~øøà>à€>ðxð>ÏcçƒÏ‡<<<}?ùáàÿðÿàÏÿ€?ñÿà>?ðàÏ߇gçø><øððà|>ƒà€?ýùñà<þóÇÏßÿüxøþ?ø?ø?ããáÿðÿàÏÿ?àÿà~~ÀóÏ€ÏÏsçÏø>|øøð|ƒð€øÿóð>þçÿþŸÿ¿þüü~øð?ãóðÿð÷ÀÇÏÀ<À €ÿÏðÏÿ{ïþ>>ÿüøÿøƒððÇø~ø‡üüþ|øø|ÀÀ<€0‚ÿÏðçÿïÏÿ¿?ÿüÿøÁðð?ƒø>ø‡øðÀÿàãüÏÏÿ¿~?ùüÿàÁÀ€Àáø?‡ÏÿŽ8ø€à€€à<€ÿ€ð|ÀÿxðÀþ€8àøÀ€à€€|à€>€~0€ÿ€à€Àðÿ€ø€ÿÀà€ÀðÿŸ€øçàà€ À€@ð>ððÿ€øÀƒðà€ xχà>p>áøà>€ø>ððσxÀ?øà€àGOþàþ?þÃÿÇðÿø?€?óøð€ü>ððLJ€xà?ø€8àñð;ð3Ãà÷ÀàƒøÿÀƒÿŸ€þðþÃÿ?çÿçñÿøÀûøð?€Àü<àðÀ€xO‡ð?~üÿàþøÿøÿøÿÏùÿàà‡üÿÀÿÇÿÿÀ>øþÿÇŸyóÿãÁçÏøÀùøpð?€à|<àñààÿŸáþ?€ðø?ÃÿÇø€~}ÿðÿüÿøüÿÏùÿðÿàþÿáããÿÿÀ<|ý÷ïñáóÃÿÇ?Àüñøðð>€à8|€ññðÿŸçþÀø?øãÿçøÿÀ~}ÿðß>~?~|~üž|ùñáàþñãÁñããÀ?üÁÿïÿñÁóÃÿÏ?Àüqùðð8þ€ÿ‡ààÀ3À><<||x?üðñáàŸþáãÁñáÃÀ<?üÁÿïÿóÁóÃÿÿüÿñûø‡ðÿüÁø?€ÿƒþþþàÿøøÿŸðÿðÿ?‡øÿÿÀ>~ü}ÿðÿƒÿŸøñðñðσþóà>xøøóáóóáÿà~|øðx<<x?üðóÁàŸþáãÀñáÃÀ<>ÁàðàóÃÀþ??üÿùÿüÿÏøÿÇþçüÀÿÇþ?þþ?ðÿüùÿ¿ñÿñÿýÿÿÀ?~üþÿ?øÿÇÿŸŸŸøáðñðÇáÿðx?üðóÁàžáçÀñáÃÀ<8ÁàðÀóÃÀÿŸ¿þÿùûýÿÿüÿïÿ?÷þÿàÿçÿÿ?þøÿŸþùÿÿùÿûÿ¿ŸÿÿÿÀ?>þ~þ?øÿÏÿÏŸøáðñðǃÁÿàøðxoáàóÃÿÀ~üøðx<<x<ðóÁàžáãÀñáãÀ<<ÁàoƒøÀóÃÀÏ?þŸ?þÿùûýÿÿüÿïÿÿýÿàÿïÿ?ÿ?þøÿ¿þñÿÿùÿûÿ?ÿÿß?>þ~üüÿïÏŸøáðñð‡Áÿàøðx?áàóÃà~üððx<<<Áðï‡ø3ÁãÃáÏ??ŸŸÿýùùðÿÿþÿï¿~ÿÿÿðÿ÷ߟÿ~>ÿü¿þáÿ<øüûÿ??þýŸ>>>~|üÇï‡ï€àðððǃÁðüðxáàóÃà>üøð|<< ðóáàŸáãáááÃÀ?<ÁÿÏþóãÃÛÿÿ~>Ÿ??ùùóðÿÿþçÿÿïÿÿ÷ç÷÷ÿ¿~>ÿø¿þáø?øøûþ>?þø>>>~||üÃÿÏŸáðñð‡Áð>yðxûáàóÃàÀ?üððƒ|<<|xÿø¿þáøøüùÿ?üø>>>~|øÃÿ‡ï€áðñðÇÁø`<|øyñáàóáñǃðøðÿ><<<<|xxüðñÿøüñáÿÃããàÿŸðàƒü?áÿðÿÿÿ€ÿÿÿð|>?>ùùóðüüÃ÷ÿ?ïÿÿÿ÷ã÷ÿ?ü>ÿà?¾Áð?øùùÿ>>ø>>>||üüÃÿÏŸáðñðÁýà|xøùóááãáÿÏÇàùðÿ?ü~||ñøùùðÿøÇüóðÿƒóçàþàÀøÃþà~Æ?€ÿÿÿð~?ŸŸ?øùùð|~ãÿÿóÿðûáÿÿŸŸ~>ü¿áøøøøŸ?ø>>>~||Ãÿ‡ïÿøÿðÇÏãàÿà?þýÿùÿãüÿÏ€ÿÁùøþø~~~áøñøððÃðáà>áãàÀ€àÿÿÿà|>Ÿ?>ùùóðü~Ãÿÿ?óÿðÿ÷ãÿÿ?~>üx?¿Áð|øùù¿¾?ø?>>||ü~xÇÿ‡ÏŸÿøÿøÏßçÀÿÀ?þýÿûÿÃøÿÿûøüà~||Ðà<€€À??ŸŸ?øùùðü?þãÿ¿;ÿÿ÷ããÿߟŸ??üÏŸþøøüüùÏÿþøàÿ>>~ÿüçÏÏÇÿ€øøïÿÇãà?Àþ?üÿñÿð?|xà?ÿÿ?>ùùóüü?üçÿÿýÿ?ÿà÷ÿÿÿ??ÿÿøÿÿþùðÿþùûÿ¾ýøàÿ~~|¿øÿÏÿÿßàðÏχƒÀ?8`xãì xàÿ€ÿß¿ýýùÿüüÿïÿÿÿÿÿàÿïÿÿ¿Ÿÿÿøÿïüÿøÿýýÿ¿ÿüàÿ~~ŸøÿƒÿÿßÀà|ðÿ€ÿ¿ÿÿùÿüøÿŸÿÿÿþÿÀÿÏÿÿ¿Ÿÿ¿ðÿÏøÿøÿùùÿûøÀÿ~~þ?àþþÿŸ€àüÿ€ÿŸ¿ÿÿüÿþøÿ‡ÿ¿çüÀÿ‡ÿߟÿàÿƒðû8üxøÿ?ñø€Ì8Àüxà€ðüüÎýùðyøàüÏÃø?þÇ€€À€@8ÀðàÀðàÀ8àà0À|àÀà€ðÀøàÁáðÀx>À€<x>ƒáà€ð>€€8|ÃðàÀ€€< àÀ?>|Ãð€€Àžø€à?€?øà€€~>ÀðÀ@0`àþÀþÃÿƒþ?Àüàà€ÿ>øàÿ€~Àà@G߇‡ƒððÀïÀþø?ø?øÀðÿàÿ?çÿ‡þà?üà?ðÿ€ ÿ€?üà ÿÀ > à ðÀááÿßÃÿÇÇÃÃøø?áÿàþþ?üü?àøÿ?ðóÿÃþóà<<ðàðÿ€ðÿ øÀà÷€ð>ðƒÿŸƒÿ‡ü‡ðþ>øøÿÁÃãÿÿÇÿÃÇÇùðûñÿà>>?ü?ü{àó€ø>ÿ€øçÿÿÇÿÇþÏùÿ>üüÿÀóÿÿãÿããÇÏ8øðøùà>Áð?{üü<àü<>ÿüðÿÀ?ùÿçÿÿÇÿÇÿÿÏùÿ>>~üÇÀáóóãããÃÇϘñàøñà<<<<<ÿðøð<ÿãÃÃÁÿÀx<ÿðüÿðàÿðàÿÀ?ÏðáþùÿÿñøÏÿþÿ?ðÿŸ?þ>>ÿƒÿŸø÷À>}óóÿÿãÿçÿ÷ï9ç<>><ƒÀññáãáóÃÃÏÀùàxñà<<ž<ÿðø <ðãÃÁðx>ÿ‡ÿŸŸøãÀ|{áññããÃãÁÿï“ò|<<ƒÀáááãÁóÃÇÇðñàxáà<<><<ðøøøðÃÃÁàx<ðüþðþðÿàÿÿÿðÿçÿ€ŸÿÿÿŸûùÿÿÿüÿŸ??ùÿŸ?ÿ?>ÿÏÿŸŸøçà|;àùñããáóÁÿïáü<><ƒÀðñááàñãÃÃøyàxñà<>ž<ðxxøðãÃÀð0|ùûŸ¿>>ÿßÏŸð?ÀxàùáããÁóÁÿÇñþ|<<ƒÀáááãÁóÃÇÁüñàxñà<><<<ðûïÏïßùñÿÿùð??ýÿŸ€>ÇÿÏÿÀ|àùñããáóÁàøÿ|><ƒÀáñááàóãÃÀ|ùðxñð><ø0ùÿ?>>‡ÿÏŸÿÀ|àùñããÁóÁàüž|<<ÃÀáñáãáããÃÆ<øðxñà><ð>þÿ?ðþããçàà?ÿ?ðð?üÀ?ø€ÿþÃøüÿ÷àÃïÿ€>ÿÏÏŸñóÿïÁø>øÿŸ€>ÃÿÏóà|àùñããÁãÁðìýŸž><<ÃÀáñááááÿÃÏ<øøðñðÿž>><ð?þþ?ðþ?ããïð?Àþàà>ÿ€ÿƒðÿþÃøüÿçÀÃïß>ƒÿÏÏùóðÁð>?øß>>ÃÿÏŸãÀ9ññáããÃãÁÿî}Ïž><<ÿðññããÿÁÿçÏüøáñðÿü?>~~?àþüàÿÃÃïà€à€ÿÀ€ÿÀ‡øÿþøøøàÃïÀ>‡ÿÏÏÇýñðGÁø?Ÿü?߀>Ãÿ‡ÏŸÿð?ùùññãããÃÀÿÏ=ï¾ü>|ÿðóóóóÿÿççøø?Áñðÿø?>~~€<x€<àÿ€ÿð€ÿðüÿˆüøüwÀãïÇ€>‡ïÏÏŸýñùïÁø?ŸŸ~üï߀?>Ç߇ÏÿðøÿãóóóÿÏàÿÏùÿ?ø~~ÿàóóóóþù‡Ãð0À<áÿÀÿøÿð?þ€üøÿ÷àóçÿ€?‡ïÏÏžýñÿïÁþ?ÿŸÿýçßÿ>ÏÏÏÿÿððÃóãóÿàùÿ?ð|<y€à?þÁ÷À?ÿø??ÿð?¾ÿþðÿ÷øÿ÷ÿ€?߇ÿïÏŸÿñÿïÁþÿÿÿÿÿß??ÿÿÿÿßýàÀ?ÁÁãü€à|à?üÁ÷Àÿð>ÿð>>ÿþðÿ÷øÿ÷ÿ?ÿÇÿÿïßûøÿÿÀþÿÿÿÿÿ߀?¿ÿÿ€ÿÿÿ߀ààøÁóàÿÀ>ÿà>>ÿþàãøÿóÿ?ÿÃÿïïßûøŸÀþÿ‡ÿ?þÿŸ??ÿþüÿŸÀðÀ÷Àÿð>ÿð|>ÿþà?ÃðÿáþÃÿÏÏñð?ÀxÿÎx~€>ðp€àðóÀø|ø|>ÿþà@80À€€Àðàß÷Àø|ðø~ÿà7ÀÀàþÿÀðøðøþÀ€ÀÀüÿ€ððü€?€À€ <Àøðàø~€Ààžøÿ>>Àð~À€ð|€@€Ààü>ÿ‡€>Àáð<ÀÀðþÏÁÀÀ?ãð|ÀÀà<ü‡ÁÀÀ€€À€€àü>|}ñð~€Àð<€ >ƒáà€ÀÀ?ÏÀÀàÀ€~Çà~>ü~üùñð`<`Ààx<ƒáàþ ü<øÿÀÿÀàÿƒÿ¿€?ààððÀÿ€ÿçð>þ?~x`ðð>ðÀð>| à xàþÃàðþ>þ|?ýÿàÿƒÀ?ñÿÇÿÿÀÀ?à?ð?àÀÿÿçà~üp~|ðñà<ðÀüpàÿüñþ>þ|ýÿáç‡À}óççÿÿ€àà?ð?ðàÿ€ûãðÀ>>x?>ÿðóø?ÃðøþàÿãüÀ>Áÿpñÿþÿûÿ?ðÏð=ðü¾ÿÀxÆð>|ÿñ÷øÿÏøüü?áÿ÷üÀ|Çþyàãçý÷÷Ÿ?àÏðxðüÿ€ð<Æü>|üÀðàðóàÀð€<<øÿüÀwáüÿÀð?àø?ðÀ|Àÿøóüÿïüþþ?ñÿùøð>ÇyàñãÇüó÷ÿž÷Àð8ðþÿàxð<|øððÃÀðÀñãÃÏøøþøüüÀøÀðÀÿçïñÿŸàø?Àÿþüþ>þ?áÿãüÿáÿø>?ðøøáþ?àùñóðÿßü><|yñÿùàÿà<ÇŸ÷ÀãχÁãïÿ<<÷Àð3ð~<Ïàø<ü<|ðððÇÀðÁóãÃÏðüþüÿ€üøüÀøàÿó÷ùÿÿøüàÿÿÿþ?ÿ?ñÿóþÿóÿÏü??øþ?üñÿ?ðøùñð|þ><><øøýðÿðÿ÷ÀðŸÃÀñçÿžûàðð<Ãðx<þþñÿóüÿûÿŸø>|øþüûãþøðññàx?üþx<7ððyáÿàÀÿç€àÿ‡€ûÏ<óÀð?ð<ƒàø<þ??~øÿùøÿûçϼ?>ø?ÿ?|ùóçøøøñð|?üþ|>øø}ðÿ€Ãÿ÷ÀñÿƒÀÿÇ€óÀð<ð>Áðx>ü>>?>øùùðøûÿßø>?ø>?||óðÿøøññðx>þxƒàð><€ñóÇÇ€ÿóãÃÃÃÀðÿðÿ¾øüðÿÿ€xþ€óóóàøü>~ÿøÏ¿ü>???øøøøøüÿÏø?ø>>|?óüÿøøùñð|>¾|>~øø}ððÇyàóÇÇÀÿÞÇðxðÇàø¿<øøóÿóÀ?ñÿÃããÀàøà0ÿ¾ðþàÿÿÀð~€óãçáøÿø~}ÿðŸ>ü>>?>?øùùððùÿÏø>?ø<||óþÿøññàx? >|ðþð~ÿÿÀð€óóóàøø>ø`Ï¿ü>??øøùøðÿÇü??ø>>|ÿñÿøøðñð|þ>>>|øøyðÿð<çÿ€<ðóÿãÀÿóÿÿ>ŽxþüÿÿÀðÿ‡ÿ€þ~?üùøûçàÀóãàÀþáÿ€>àüàþÿÿ€àóóçáøü~ø Ÿ?ü>>?>øùùððÿïÃü>|ø>~|ùñü0øññüxüÿ?ÿÿüýñüÿà|ÏÿÀpóÿÿÀÿóþþþxøðÿÿà̈øð<Àÿ€áÿ€þàüáÿ€ÿÿà?€óóóàø~<>~üpÏŸ¿þ>??|øøùøøÿçÎþ?|ø>>|ùó¿þxøùùþ|üÿŸÿþÿðþà>çÿÀ0ùûïÀÿøüÌ8pÀÀàðÀÿðÃÿ€ÿ¾àÿàÃÿ€Àà?€>óóçùøü~~ÿ🟟?þ>?>ÿüùùþù÷ÿþ|>ü>~~}ÿûÏøÿùøü|ðÿþ?øÿÀü?€<ãÇ@Àp<ÀÿøÀ?üÃïÀÿ¿ààÿ€ã÷ÀàÿÿÀ?Àûóóýø?ü~~ÿðÏߟÿ?ÿ??þüøþÿóÿÿþ?þ?þ~~ÿÿÿ¿øýùø||ðÎØpÿxàpÀÿø€þ‡ï€ÿ?ÀÀüÃçÀÀÿÿÀ>Àû÷óÿø?ø~~àßßþÿ???ÿýøþÿãÿïüþ?øþ~ÿûÿ?àðÿàà€þƒïÀÿÀÀðÃçÀàÿÿÀ>ÀûÿûÿüøàÏßÇþÿ?þüøþÿÁÿïø??ü?øÿ?ùþàøÿà?À<‡ï€ü€€€ƒçÀÀÿÿÀ|Àó÷ñÿøà~~ÀÏŸƒøÈxp8ÿAƒà >xøÿ€ ïÀø€ƒçÀÀÿÿÀ|ÀðóàóàÀø>üþßï€ÿßïÀÀø€ð>ø þþÿ€ÿÿÿÀø€øpüþÿþþÿ€ðø~0€ðüüÿüüÿ€àü>`ü€ððð~xø~@8ÀðÀàþ~€p8<àð|ÀøÀðþ~€àð|ÀøÀðž`€àð|ÀxÀøŒà€C€€ÀÀà0àðÀÀø€ à'€ðø|øøáø?‡ðð?ÁÿÀÀà€ÀpàðÀÀø€À0>¾¾üûøÿƒüÿüÿü?ü?ãþ?ÇùðãÿàÀà€øà`¼>ÀøÀüààùÿÿŸÿÿûøÿ‡þÿþ?ÿþþçþÏyðóóÿàÀ à7Àgøø€áü€ÿÃøøüƒÃüÿÀüàðùÿÿŸÿ‡ÿùðÏþÏÿþ?þ?ïyÏ8ðàùñàÀxàÿñÿ¿ÿü?àùþáÿçøü?ýÿƒÇþï€Àþ€<øûLJÿÏÿÏùà‡þ‡žÿ|ñàøñàÀøÀ€0? ÿùÿÿÿüðùüãÿãøþýçÇÇÿÇ€À8>€ø³Ç‡ÇLJÏàþƒž<þ~àñàyñàÿÃø?€þðûððà|àáü?áü?‡øÿÇÏðÿŸÃüüÀøÿùÿ¿?ÿþ}ð?üðyñÿáàÿxùãÃÏÿÇ€À8>€ø‡ƒÇ‡ÞÏàŸþ€<<‡ðñàxáàÿ‡üÀÿøÿÿùÿðáÿ?ñÿóü€ÃüýÿÇßûÿ¿çþ?þÀøÿüÿŸ¿>ÿð?üðùáñáàÿxñçÇÏÿ€À8?€ð?‡ƒÇƒÞßàŸ€<Ÿ<?ÇøóàyáàÿÏþÿÀÿ¿üÿÿýÿüùÿ?ùÿùþÿÀçÿ?ÏÿÿÏçÿÿÿÿçÿ?ÿ?Àüø|øÿø?üðsðññàÿ|ðÃÏÿ€À0€xÿ‡ƒÇƒÞÏàž€>Ÿ<ÁøñàyáàÿŸÿÿÀÿÿþÿÿýÿüÿûÿùÿûüÿÀÏÿ?ÿÿÏÇÿÿÿÿïÿ?ÿ?øø|ð>ÿðüðáñãàþ|ðÿÇÏÿ€Àpx燃ǃÞàŸ€><<GÌüñàqáàßÿûÀÏþÿüÿÿøÿÿ~øÿùøûÀïÿ€?ÿ÷Ççÿÿÿÿ?pø|ø>ð<ð?ðññà?ñÿÃÏç€Àp<‡€|LJƒÇƒßà‡†Áž<þaì<ððññà¿ÿÿ€ü?~|üüÿðÿþ}øùùñÿ€ßÿ>óÿÇïÿðïÿ?>ø|ð>>ð|ðÿáñãà?áçÇÏÇ€Àpx|8LJƒÇ‡à‡þÿŸ><þsÎ8ðùááà‡ßÿÿ€‚|?>~||ðþ?øüùøÿÿÿÀÿÃÿýøÃÿ?ø|ø>ø0>ðùðññà†?ƒãÃÏÇÇ€À`xǃÀ?øïçLJÇÏüÿçþÿþü>üÏùøÃñð¿üÿ€ü?~||øðÿþ?øùùðÿ€ßþ>ÿÃÿùðçÿ?>øyð>>>üð?9ññááãàþãçÇÏþÿàÀàÿÿÏÀ>?ðÿçÿÿþ?üÿÇüþü?>??ø|øñø?ƒñð‡ßà€|>~||?ø~ÿ¿øüùøÀÿ€Ãÿáÿ~øÿÿ?øøø>ð?øþÿùññüþûÿ÷ÇþÿðÀàÿÿχààƒÿçþþü?€øÿƒðüð?à@À¿Àƒü?~|üøðüÿøùùð?À߆>ƒÿÁþ~ð?ÿÿ?>ÿñð??>>à?øþÿûóñüüûÿïÃüÿàÁÀÿÿχÀ~Àã‡øðð"``À0<Çßÿçàÿþ?>~||øÿßþüüøøïàïÿÃ÷àþ?ÿø{ÿߟøÿãü??¿?àð~ùñðøüüùçáøóÀÀ €à€€ÿßÿ÷Àÿþ~~|üüýýûßÿüùùüçÀÏÿ?χÿðü?ýð{ÿÿ¿??ÀøÿÃø?>~€àx|ñààðàø<`ÀÀ€>ÿïþÿàÿ?þ~~þüÿûÿÿÿüüþÿàïÿÿÃÿø|ýøÿÿß¿Ÿàüøø<ÀÀÀ€?ÿïüÿÀþ?øÿþüÿðÿóÿÿÿýùþÿÀçþÿÃÿðxûøÿÿÿ?Àüðÿø€ÀÀÿÃüÀþø~~ð?áÿ?þüü~ÀãüßÁÿð8ñü?çÿÏÀüøÿø€àÀ`àøÀ|À?óøàþÇÀü|Ïùüÿáÿ€‡Á€þ|ÿÏûüÿãÿ€þþÿï9ðããþþÿÿ9ðÃçÿ€€þüÿïàðÁçÿÀÿÿÀ€ÿ|ÿÏñðÃçÿ€ÿÿÀŸøðøðÁçÀÿÿÀ€€øàùðÃçÀÿÿÿÿÿÿøÿÿ€€ððlüðáçáÀÿÿÿÿÿÿü>Àøûü}ðãçÿ€?ÿÿÿÿÿÿüÿÿÀ?Áðÿï<þÿûÿ€ÿÿÿÿÿÿøÿÿàÁðÿßøþÿûÿÿÿÀ><ÁàÏø~ÿøÿ><áð?ð||À|~ÿãàÿ?ÿóàÿ?ÿÃÀÀ€?€€à~pÀ<ð>ðÀ<ðøÀ>ðð€~@ð€ð€ÿ~ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿ÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøð€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþðÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþðï€|ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþøÏÀ|ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿã¿ÿñ¿þx~ðÇÀ|2zñÿØøï?ÿÿÿÿÿðÿÿþÿÿ™ÿÿä~À~ð‡à|?~ð‡àx~øàø?~ððø?~ððø?~ðÿøø?~ø?ÿùð?>üÿñð?~ü8ÿñð?~8à?|8?À?~8?À?|p?€?~0?|?~?|?~?|~?|~?|>?|~?|x~?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ|ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ~?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ|ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ~?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ~?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿü?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ>?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø?ÿýãÿà~þü?€?>?ðø?€~ðü?€?>?ðø?€?~ðü?€?>?ðü?€?>ðü?€?>ðø?€?>ðü?€?>?ðø?€?>ðü?€?>?ðü?€?~?ðü?€?~?ðü?€?~?ðø?€~?ðü?€?~?ðø?€~?ðü?€?~?ðÿÿÿÿÿÿÿøø?€~?ðÿÿÿÿÿÿÿþü?€?~?ðÿÿÿÿÿÿÿÿþø?€|?ðÿÿÿÿÿÿÿÿþü?€?~?ðÿÿÿÿÿÿÿÿþø?€~ðü>ü?€?€~8?ðø|ø?€|<|øø>ü?€@ü?€>?À>8>?ðø<ø?€àü|À|x<?àðø>ü ?€ðÿ?€><ÿà|x?üðø<øü?€ðÇ?€||ÿÀx|?ÿÀøø>üÿÀÿ€øÇ€?ÀÀ‡?ùÿÿÿÀ>~ÿà|þ?ÿÿÿÿÿÿðø>ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€øßÿÿÿÿÿÿÿÿÿÿÀ~þÿ€xþ?ÿÿÿÿÿÿÿðø>ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€Üÿ€?ÿÿÿÿÿÿÿÿÿÿà>àxþ?ÿÿÿÿÿÿÿðø>ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€üÿ?ÿÿÿÿÿÿÿÿÿÿÀ~ÿàxx?ÿÿÿÿÿÿÿøø>ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€þþ?ÿÿÿÿÿÿÿÿÿÿ€>ÿ€ðx|?ÿ÷ÿÿûßðø>ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿåÿþÞ`à~ÿ€ÿàx|?ÿøø>üÿà€€ÿ1Ï€?€?€>ÿ€ÿà<~?øðø>üü?€ûßþsÏ€?<~ÿ€ÿÀ<~>?`øø>üx?€ùÎyÇ€?~ÿÀÀ>>>?ðø>ü?€ù„0?~ÿÀ<<?øø>ü€ð?~ÿÀ<?ðø>ü?€?~ÿÀ?øø>ü€?>ÿ€?ðø>ü?€?~<?øø>ü€?><?ðÿø?ÿüü?€?~<?øÿø?ÿþü?€?~<?ðÿø?ÿþü?€?~<?øÿø?ÿþü€?><?ðÿøÿþü€?><øøðÃüü?€?€><?øü?€?><~?øü?€?€><?øü?€?><ÿ?øü?€?€><ÿ?ðü?€?><ÿøü€?><÷øü€?€><ç?øü€?€><ç€?øü€?€>ç€?ðø?€?><ç€?øü€?€><ç€?ðø?€?><ç€?øü?€?€><ç€?ðø?ÿÿÿßÿÿ…Ÿýÿÿÿÿÿÿÿÿ~<ç€?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿü?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€>>ã€?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ~<ç€?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€><ãÀ>ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ~<ç€?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ><ãÀ>ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ~<À?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿüÿýÿÿÿÿÿþ>ãÀ>ð~<À?>ãÀ>~<ÃÀ?><áÀ?><ÃÀ?><ÿÀ>~<ÿÀ?><ýà?~<ÃÀ?>Áà?~<ÁÀ?>Áà?><Áà?>Àà?><Áà?>>Àà?><Àà?>Àà?><Àà?>Àð?>€ð?>Àð?>>Àð?>Àð?>€ð?>Àp?>Àp?>>€p?>€p?>>€p?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿì<óøï€>€p?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ><€p?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ>€x?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ>€xÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ€xÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ<€x€ÿŸÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø€x<€x€x<€x€x<€x¾8<>xœ8<x€8<x€8<8€<8€<><÷€ €<?~ÿà><þœ8ÿð€€<€ÿÎ~ÿàÿ€><< çÏœüÿò€ÿÀ‡€<>s€ÎüðÿŸøoÀÿ?ü〜þóß¿üÀÿ€øs€Þ~ÿßÿü€ÿ?ðã€8üÿßþ<Àÿ€üs€xü~ÿßü<À?ï?þþøüÿÏü~À?‡€>ÿà|ñü~À>0Àðü~@à€x>Àðþ}ðÀ€pÀðÿýðÿÀ€p€ø¿ýðÿ€€àøŸýðÿ€àððà|€<>?<€?À><ÿ€<øÇxüü<<à¹ÿ¼ýÿþþÿ<ÿ?ýÿÜÿÿÿþÿ€<ÿ?ÿÿýÿÿïÿï€ÿ9ÿÿÝÏççÿç€<þ9ÿ¿ýÏÏÏþðï¿ßÿÿÿÿÿ€<<ÿ¹Ï?ßýÿþþÿ?€€ØçÏ|üü>€<ÿ¸Æqñà0àà<ÁÀ€@@>€<€>€<€€<ÀÀàà<ÿÁàÿÁÀð<ãƒàðàƒðð<ÿ‡àð¿ƒàp?ÿƒÀpÇÿÀp<yÿ¿ÀpùÿŸÁðpàÿÁðà?žÀ<àðà?ààü`Àð>À ?€<€<€<<<<<<<€<<€<€<€€€Ÿ?Ÿ€€€€€€ø>|Àà8<€ü~€|áð|>>ðþxà ‡€€ü~€|ãøþ~?ðyÿxÿü‡À€ü~|ãøþ~?ðùÿüÿþ€‡À€?<~<8áü~<ÀððþüÿÿÀ‡À€>~|áø|ÀðàüüÿÀƒ€À€?ü~~ðü0àø`G€x~0Àðàüþ~?à€À€ÿü~ÿóþÿ??>øàùóñÿÀþ||?áÿÀþ?Àþ?áþx?ðÀüþ|?à€À€þ~ÿ?ÿÿÿŸŸ¿üÿàqùûÿãÿ€~þÿÿãÿàÿÿóÿüðÀüÿ~?ðÿÇðÿàÿðà€þ~ÿ?ÿÿ€ÿŸ¿??üÿàcûóÿçÿ€|üÿÿÿçÿ€ÿðÿÿÿ÷ÿŸýÿðÀüÿ|ðÿŸÏùÿñÿ?øà€?>~~ÿÿ€ÿŸŸ¿?>üÿàùûÿ÷ÿÀ~~ÿÿÿ÷ÿÀÿðÿÿÿãÿŸýÿðÀüÿ€þðÿÏßùÿûÿßø€>>|ü?ÿÿ€ÿŸ??|øçàùóÿÿÿÀ|ýÿûÿïÿ€ûðÿÿÿÇߟÿóð€ü¿€ÿþðߟùÿÿÿÿð€ÿÿÿà>>~|ÿ€ÿŸŸüüãàùùóÿÿÀ~~ýùóÿÿÀðáÿ÷ÃÿÃñð€üÿÀüøÇ߸ùÿÿ߀ÿÿÿà>~~ü?ÿÿ?øøÃàñóóÿÿ€|}ûóóïÿ€ðÃÿÿÃÿ‡áð€üÿÀÿøøŸÁðÿÿßð@€ÿÿÿð?>~|ÀÏŸŸøüãàùùóÿÿ€~~ÿñóÿÿðáÿçÃÿÃáð€üÿàüø‡ÇÏñðÿÿŸüàÀ@€ÿÿÿà>~|ü?ƒÿß?øøÃàùóóÿÀüüÿãóïÀÿðÃð‡ÿ‡ãð€ü?ÿÀýüøùðÿÀø@àÀ@??>~çÀÿø|ãðùùù÷ãÀ~~áó÷ãÀÿøáøwÇÿÏÃñð€ü?ÿà~ÿø‡ÇÃýðÀüøàáÁà`€>~~ÿ?ÿ€ïßÿ?ðøçàûóóÿÿ€|üÿÃóïÿ€ûøÃÿïÏ߃ãð€ü|àüð‹ùðÿãŸøø€àÿÁÁàp€??~ÿ‡ÿ€ÿïÿ¿ƒðüÿøÿùó÷ÿÀ~~ÿñó÷ÿÀÿþáÿ÷çÿïÁÿøÀþ?|ð~?øÏÇÎ|øûÿßüÀðÿƒÁàð€þÿ‡ÿÿÏÿÿƒáüÿøÿÿó÷ÿ€þüÿû÷÷ÿ€ÿþáÿïÿÿÿƒÿøÿÿüøþ?ÁðÿÏž}ù÷ÿŸð`LJ€ãàãƒðà€ÿ?ÿƒÿÿÇÿÿáþÿøÿûûÿ€ÿþÿÿÿûÿ€ÿþðç÷ÿÿàÿüÁÿÿ~ýÿáøÿïßüÿñÿŸýÎùÇïÿóà÷ððÃðp€~~?üÿÿ?Áüÿðûóñþþýÿÿ÷ñþÿüàÇçÿÿÀÿøÁÿþüýÿãðÿßßùÿÁÿ?ãýßÿÏÿÿÿàïðÿƒðð0€?À`ðà|~}ÿýóà|ð€øü>ø?ÿà€€p ü>øÿà?€ü8øÿð>€>üxøÿÿàü€ðpà`øÀÀøü?xÀÁ€ü €øøqøàø€ùóùóüãñ÷þ?þÀ???üÿñÿÿáÿÁüü?€ÿü?ÁÿÁþÿÏáü<ð;àø?ÿŒà|ÀcðÀà€ýùù÷ÿóùÿÿ?þÀ?¿¿þÿŸûÿÿóÿóþ?üÀÿŸþãÿáÿ‡ÿÿñþ~øø?ø€ÿÿðÿ‡Ï‡ÿøðÀ€ùùùÿÿÿóñÿÿ?ÿ€¿?ÿ¿ÿÿÿóÿ÷þüÿàÿßþÿóÿóÿÿÿùþ~?üÿøøÿÀÿÿûÿÏÏßÿüð€€¹ùùïÿ€ýñùÿÿÿ?Ÿ¿ÿ?ÿÿÿûÿÿÿÿýÿðÿÿÿÿûÿÿÿÿÿùþ~?þÿüÿùÿàÿÿóÿÏÏßÿÏþð?€Øøùÿÿ€ñûïÿ¿?ŸŸ¿>?þÿÿûÿÿþüýÿðÿïÿñûÿÿþøü>~~üùùÿàÿ¿÷ïçÇÏÿßþà|€ðøÿÿÿðûçÿ??ŸŸ?>þýùùùÿþøýÿðçïÛñÿùûÿŸ¿?üø>|?~|øûÿà¿?çÇçÇÏïÿþàü€øøßþðÿÃÿ??ŸŸ?~üýùùðÿüøÿÿðÇÿÃðÿñûÿ¿?üø>ü?||ðûÿà¿?Ã÷ÇÏÇÿþÀð€ýø߀ðÇÿ??ŸŸ?~üýùùðÿþøÿÿàÃÿÃðýðùÿÏÿüø>ü?||ðûÿàÿ?Ã÷ÇÇÃÿþÀà€ýøŸƒÿðÿ?>ŸŸ?>~ ýùùðùÿøÿðÃïÃðÿðÿÿþ?øø>ü?||ðûðþ>Ã÷ÇÏÃÿÀðÀ€Àÿø?ŸÏýðŸÿ?>ŸŸ?~ùùùðÿÿøÿøpÇïÃðÿðÿÿÏþøø>ü?||ðûð@þ?Ã÷ÇÏÃÿÀø€àø?ÿÿø?ŸÿŸ??ÿŸ?þýùùñÿ¿üýÿðÇïÃñûñÿïÏü|øø>ü>||øûùàü?ÃçÇχÿ€ø<€àýøÿÿü?ÿÿ??Àÿ¿?ÿýýùùûÿÿÿÿÿðïÏÃùûóÿÿßþÿüþ~~~|üýûÿàþ>ÇçÏχÿþ€øø?€àýøþÿüÿÿ¿?Àÿÿ¿?ÿýÿûýÿ÷ÿÿÿÿàÿÏÁÿóÿ÷ÿïÿÿþÿ~ü|üÿýÿàÿ?ÿÇÿÏÏßþ€øð?€ðùøüÿø>ÿÿ¿Àÿÿÿ?ŸûÿÿÿÿçÿþÿàÿŸÁÿóÿçÿÿÿÿþÿÿ?üþüÿýÿÀÿÿÿÇÿïÿŸü€øà?€ððøø>ð>ÿŸ¿€ÿ¿?ñÿýýÿÃþ?þÀÿÀÁÿÃÿÿÿÿþø~þü€ÿÿÿƒÿçÿüÿÀðÇÀ?€ðü†„áùñûÿüø?€üÀ?ƒÿ÷ÿï¿x~~à|ü?ø?ÿ¿þÿÏüøÿ€?àÿ€{€ðüðÀð?߀?€ÀÀ?ðÿ{€ðøðÀð?ÿ€?ÿ€ðü{€ðøøàøÿ?ÿÀ?øü{€ðððàøþ?þÀ}øü{€ðàðàøüüÀ|øü{€p€ààà€|xø{€ð`à{€xðð<<ó€ð€üø~>À€üüÀp{€xøðþ~ÀøþÀøü?ÿÿÿü÷€ðøøþ>À€üÿàü€ÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿóÀxðà~<€€øþÀøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ|óñ€à>~€Àü߀¼Àÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿóß{àÿƒàƒ8€àxðð~~àð ÀøŒÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿñÿþÿóŸžÿàÿ‡ø?çþ?áñþ?Çü?ü€><ø?ƒüñüùøÁÿðü?€þü?€À >àà€ðàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿÿÿóÀðÿŸüÿÿþÿóóÿÏþüÿ€~þÿøÏþ?÷þÿüçÿŸðþ?ÃÿøÿÀãþ?ÁÿÇχøð?Ãü~~>?ï‡ðÿÿÿÿÿÿÿÿÿÿÿüçó€ÿðÿŸþÿÿþÿùûÿïÿ?þ€>~ÿüÿïÿ??ÿÿÿþ÷ÿÏøÿ?Ÿÿ÷ÿ€üÿà÷ÿáÿãçÇþÿø÷þÿÿŸ??ÃÿÇü€ãóÀøŸ¿ÿûÿýùù÷ÿÿß¿?þ~~~ÿýÿÿÿ??ÿÿÿÿþÿ÷ÿÏðÿ??ÿÿÿ€ùÿàçÿÿ÷ÿÇÏÏþÿøÿÿÿÿÿ¿?>>ÿãÿÏøãó€ø¿ÿñ÷ýøýûÿï¿?¿>>~ýÿÿ¿?ÿÿ¿ÿþÿÿÿçàÿŸÿÿÏ€ýûðÃÿÿ÷çççÏÿüýÿÿ€ÿŸŸ??ûáÿçøãóÀ?ø¿ÿðÇÃðýóüÿÏÿ?>~~~|ÿÿÿÿ?ÿ¿>ÿ÷ççÀÿ¿ÿÿùÿàÃýÿÿÇçÇßÿ|ýñÿÿ|ó?<óáóãàÃó€x¿ÿðÁð}ûþÇÿ??>>~~ÿ÷ÿÿ¿>?ÿûççÀÿýÿÿ‡üÿàÃáÿÿÇçÇßÿ~}ðÿ€|þŸ¼÷áñãàáóÀ?<¾ðÃðýñÿ?ïÿ?>~~~|ÿïÿ?þ>>ÿçççÀÿýÿÿ€øÿàƒáÿÿ‡çÇÿþ|ÿðÿüÿ?øáóãàÁó€~|¿øwÁø}øÿŸÿÿ??>>~~ðÿÀ?>?øççÀÿýø€ýÿàÃáÿÏÇçÇ߀|}ð€üÿŸøññóààóÀ?<¿Ÿý÷Áøýû¿ÿÿ¿?>>~~|;øÿ¿?Ç¿>øwççÀÿùøÃùÿàƒáðÇçÇß|}ð‚øŸðÿáóãà ÀóÀ><ðïßþÿ÷Áüýûßûÿ¿???À~~~9ÿÿ¿?ÿ¿>~ÿÿççÀ¿ùÿÿï€ýûàÃáøÿçççß|}øÇøÿߟðûáñãàÀóÀ><øÿÿþÿïÀÿûûÿÿÿÿÿ??À~~~}ÿÿÿ¿?ÿ¿>~ÿ÷ççøÿÃñÿÿÿ€ÿÿøÃáÿ÷ÿçÿßÿ|}ÿÿÿøÏß¿ñóáóãà?ÀóÀ>?øÿïüÿàóûÿÿÿÿÿÿ?À~þþÿÿÿÿ¿ÿÿ?~÷÷çøÿÃðÿ÷ÿ€ýÿøÃàÿ÷ÿãÿïÿ~|ÿÿÿøçÏÿáÿùóóø€?ÀóÀ>?øÿÇø?Ïà?ãûÿïÿÿÿ?€ÿ~þüÿÏÿÿ¿ÿçÿçøÿÁàçÿÿÿøÇðÿçÿãÿïþþþçþðÿÿ¿áÿûóóüÀóÀ>?øóðàÁùþ?Çÿ¿?€~~|Çÿ¿¿ƒþ??çÿãøÿÀà?áþþÿøçðãÿáÿçü~~?Ãþðÿ‡ÿ¿àÿûóñü€ÀóÀ>?üø ÇÀàÇ€øü|àÇà€ÿàóƒø||øàÿï€}ñóàð?ÿÀóÀÿà7ààà<€8` €?ÿÀóÀÿðà;À?÷ÀóÀ¿ðàÀ€óÀóÀ¿ûÀð?€€óÀóÀ?ÿÀð?€{ãÀóÀ?ÿÀð€ûãÀóÀ?À€ùãÀóÀ?€‡À€€ñãÀóÀ>à€€ñãÀóÀ>~àÀ€ñãÀóÀ~à€áãÀóÀ>|Çð€áãÀóÀ>|‡à?áãÀóÀ>|Ãáü~øÿàÿÀø?üüà ?áãÀóÀ>||‡Çþÿûÿóÿ¿ãüŸ‡þ?üà=áãÀãÀ>|þÃÇÿûÿûÿÿÿþÿßÿ?þð€€=áãÀóÀ<ÿà€ÿûÿûÿÿÿÿÿߟÿþð€}ããÀãÀ><ÿðÀÿ¿ñÿýÿÿÿþÿÏŸŸ¿ÿð€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿü€ÿ¿áùÿðÿÿÿÿŸ¿¿>àÀaÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÀÿÀøýðÿÿþÿ¿ß?€€?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüó0ÿð€þÁðÿñÿ÷üÿŸ¾ÿ>ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÃÿÿÿÿÿçÿÀ>>>ÿ€À€àø}ðüÿÏ¿ß??ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàá=ñãÀóÀ>ü€‡?áðÿðü?þß¿¿>ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ€€=áÃÀãÀ>à`Àÿ¿øøýð~ÿÿï¿ß?Àÿÿÿÿÿ€€ ñãÀóÀ?à€ÿùùûðÿÿ¿÷ÿ¿Ÿ¿>à?ñãÀãÀ?à@0àÿ}üÿùøÿÿÿÿÏÿŸ¿ð€ñáÀñÀ?àp8?àþùýÿãø÷ÿÿÿÏþ?ðóãÀãÀ?à€à8àþ|üÿáø÷þÿßÇþ¿ð€çàñáÀñÀ?ÀÀàÀøxyÿðÃüðà€ïàóãÀãÀ€ÁÀ |<ø €?ÀïðûóÀñÀ>ñÀÎ~ø€?€þpÿãÀãÀ?xáÎðü€>îpóÀñÀüáÁÎ~ü€?þpãÀãÀ?øÁÎ>ü€?ÀîpóàñÀ?øÁÁÎ?Àîp÷àóÀðÁÁþ~€àîp?÷àñÀ}ðááþ~Àïð<ÿàóÀ?ø@ñáø0<€àïððñÀøðáà<€?ÀÇÀÿáóÀ?ðáÀ8€ÀA€ññÀ?ðaÀ€ñóÀ?àÀ€>ññÀ?à€óóÀx€ûñÀx€{ñÀø€ñÀø€ñÀð€ñàð€ñÀð€ùàà€?yÀà€yÀÀ€÷ÿÿÿÿÿÿýÿÿÿÿÿÿÿyÀ€€ÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿyÃÏÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿyÏÏÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüyÏÏÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþùCðyÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà€yÀÿüøyÀ€{À€yà€{À€}À€{À<€=À<€À<€?àü€?Àø€àø€?Àð€àð€À€à€ÀÿÿÀ€Àÿÿà€Àÿÿà€àÿÿà€Àÿÿà€àÇãÀ€ÀÇáÀ€àà€Àà€àÀ€ÀÀ€àÀ€àÀ€àÀ€àÀ€à€€çÇ€€ïÇðü€?€€ï‡ÿüÿÿ€~üÏ€?óÀ€Àà?ÿüÿÿÀüü?Ï€ÿÀ?ÿðÿÿàÀà?ÿüÿÿÀüüÇÀÿÀÿÿðÿÿðÀà?ÿüÿÿÀ€ðüÇàüÿÿðÿþøÀà|þ|ï瀀ðøÿƒàøÿÿðÿüøÀà8ü8À€àÀüðø`óðà€~|Àà0ü8À€à?Àüðð?ÃãÃøÀãðàÀ~|€àüÀ€Ààþøðçóçþ?ðÃð@ø~>€àøÿÿÀ€€ÀÀüøàÿçóïþððþ|>€àøÿÿà€€À?ÀüøðÿóóïÿÿøðÿÀü>€àøÿÿà?€ü€?€øøáÿã÷ßÿùøàÿðü>€Àøÿÿà€ÿÿ€?ÿþðüÿþ?Äàÿñÿßÿøøàþü?€àðàÿÿÀ?øÿÿŸ€?Àÿþðøÿÿÿÿàÿáÿ¿ÿðàÀþø>€Àøøÿÿà?þÿÿ€?øÿþðüÿÿÿÿ€àðÿŸÿøà?ÿø?€€€àðøÿÿà?þÿÿ€øÿþðøÿÿÿÿ€áÿàÿ?ð Àÿþø>€ÿ€ƒ€Àðüÿÿà?ÿÎÀ?þýøðüÿÿÿÿáÿðüxÀÿÀ?üø?€ÀÀààøÿÿÀ~ÿ€€~üàøÿÿÿüáÿà~?ÿÿøÁÿÀÿðð~€‡xÀðü€߀€À~¾ðøñÿü?ÿÿøÁ÷àÿ€ø>€ÇÇþàð?øÿŸ€€~~àøáÿø|þÿð?ƒçÀþð~€ðÎüàø?øÿ‡ß€ÀÀ~?àøðÿü>þðáóàøü~€>øÏÀçüàð?ðÿŸ€Àü~Àððÿø<ø?ÀÃçÀÀøü€~ðŸÁÎüÀ?ø߀€àü¾/Ààø<ðð€?ÁóàøüÀðÏáï~à€øÿïø|ÿ€Àø÷Àø€þðŸáþ~Àüÿÿøüÿ€À€>~ÿÀøÀðÏáþþà€þüþÿðøÿÀ~ÿ€à€þÁüüÀ~|þðøþàÿ€€àÀ€@ø à€80ø?Ààøàÿ>€€|ÀÀðÿ€ Ààà€ðþ€ÀàððÀà€ðð€ÀøøÀà?øðÀÇ?üøÀçç€üàÀçÇ~þàÀà€|þÀ€àüÀÀà€øÀ€àø?ÀÀà€ð?ÀÀà€ÿÿŸÀÀà€ÿÿŸ€Àà€ÿÿ߀Àà€ÿÿŸ€Àà€ÿÿ¿À<àüÀƒà€ÿÀ<ðüáÇà€þÀ~ðüãÇà€þÀ~àà÷Çà€üÀÿðøÿÇÿà€ðÀÿðøüÿçþÿà€ÀÀïƒàüþÿÇþ~à€ÀçÀüžÿçþ>à€ÀçÁÀøÝçþ|à€ÀÿÁÀüþÁç~àÀÿÁÀüþÁÇþàÀÿáÀøüÁÇÿà€€ÿÁ€øÁÆþàÀÿÀ€à€ÀàÀà€€àÀà€Àà€Àà€€àÀà€ÀàÀà€ÀïÀïÇ€ÀâÀð€ÀàÀð€ÀàÀð€À0‡ÀðÀÿïàð€ÀÿßàAÀðÀÿïðãðð€À8Ìðçðð€À<Áðçðð€À8øÃàçàð€À<øÃàçðð€À<ðÇ€ãøð€À<øÏ€ãøð€À<øÏàçðð€À<øÏðÇðð€ÀÀ<ÏðÀð€x€?àyÀÀ8‡Àð€ø€ðyðÀð€ø€ðýøÀððýðüüÀð€àøðü|Àð€Àø øü>Àð€‡ãÃþðÿà€ø>Àð€‡óçÿ¿øÿùÿðü?Àð€‡çÏÿ??øÿóÿðø?ÀðƒóÏÿߟøÿûÿøüÀð€矟Ÿ?ðùóÿð>ø?Àð÷Ÿߟùû÷à~ü€Àp€ÿ?ß?ùóÿÀÿüÀð€ÿŸߟøùÿàÿ€Àp€ÿ?ß?ùóÿÀÿþ?ÀñÇ€ÿ‡ßŸùùÿ€ÿ€Às÷€€þŸ?ùóÿ€þ?À÷ç€~ÿŸŸùûÿÇÀü¾Àp€€|ÿ?¿ûûÿïÀø?~ÀðÀ<ÿÿÀÿùÿ÷À|??Àp€À8ü?¿€ÿÿÿÿ€ø>~Àðàpx÷ÿó€x>Àx€àÿàüÀððÿàüàx€ðÿÀøÀppÿÀðÀx€ÿÀÀp8Àx€Àpàx€Àpàx€Àxàx€Àxàx€Àxàx€àx€àx€àx€à8€à8€à8€à8à8à8à8à<à<à?çÀ?ïà=ÏÀ8à<à8à<À8à<À8à<À8à<À<à<À<à<À<àÀ<àà<àÀ<àààààààÿÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿Áàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿààÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿñðà>ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþà>?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþà> ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþàþ? ÿÿÿÿÿÿïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàþ?<Ãó~0àd8(àþ?à?à>à>à>>à?à>>à<à<>>à<à<>>à<à<>>à8à¼>>à8à¼>>àxà¼>>àxàø>>àø?àü>>àøàø?>ààüà>þ>àþà>þ<>þÿ?ñÿ€>ñÿ€?ñÿ€>€ñÿÀ€ñÿ€??€ñÿ€?Àñÿ?Àñÿ€Àñÿ€àaÿÀàç€ÿàC€ÿðÿà?à???À>?>?>?>>ÿ€€>>ÿ€?ÿÀ>>Á€|Àð|>>€?ðþÿ|p€>>þð`?ÿð€?>€ðð€Àðø€>>€ðð€Àxyàç€?>À~óÀþàñàþ>ÀÁ€ø>>>?>?>>>>>?>?À>?ð>ü>þ>ÿÀ>ÿà>ø>ü>ÿ€>?ÿÀ>ø>?ü>ÿ>?ÿ€>ÿð>?ÿð>àþ>?ð?ÿ>øÿà>?øÿð>ø?ü>?àþ>Àÿ€?Àÿà>À?ü>?ÃÀ þ>Çð?÷óþ?óÿŸþþÿ€>Ïðÿÿÿÿÿÿÿÿÿÿÿÿÿà>Ïø?ÿÿÿÿÿÿÿÿÿÿÿÿÿø>ð?ÿÿÿÿÿÿÿÿÿÿÿÿÿü>øçóÿ?ûÿßÿ¿ÿÿÿÿÿð`ÿÀ>ðÿð?à¿ü>àÿ>ƒÿÀ>€ÿð>?ü>€þ>€ÿ€>€ÿà>€ø>€?ü>€ÿ>€ÿÀ>€ÿð>€?ü>€ÿ>€ÿ€>ÿà>ÿø>þ>?ÿ>€ÿÀ>ÿð>€ü>?>ÿ>€ÿÀ>?>ÿà>€?ü>?>þ>€ÿ€>?>ÿà>ø>?>?ü>€ÿ€?>ÿÀ>€ÿð>?ü>€€ÿ>ÿ€>€ÿð>?ø>€þ>À8ÿ€>?øøððÀ€ÿà>þ|øxðxð>ÿÿøðø?àx>ü>ü?€8ðx`àx>ÿ>ð€ðàÀ<>€€ÿÀ>ðÀðà€€ÿð>àÇ~üàp~?gÁ÷ÀÁÀ`àÀ<8x€gðà|x€€€ø>àÏÿþðøÿ?Àÿàÿãñãøð?ññàÿþüáÿÃøðþüà÷À€çÏ€|xÀþÀþ>àÏÿÿ?ñùÿ??€ÿðÿãáçùøñññÿŸÿþóÿãøø?ÿþñÿàãÿßÁþ?üàþàðÀwÇÀ€ÿ€>àïÿ€ï<øùÿŸ?€ÿøÿóñïüøÿøññÿŸÿÿùÿáðüÿþùÿàÿóÿÿáÿ?þðþøø?áÿïàÿà>àïæ<øùóýøùññÏùðððóÿŸ<ùñáà?üŸ<ùùááñûóãŸ><ø>=øx{ñÿÿà€ð>àï€ú<øyûøüñññÏØùðððóÿÏ?üñáà?ü‡?üðñàøññãÿŸ?ø=ü<<ðøýùðü>àÏþøùþð|ñðûÏðùàðð÷ÿøñáà?üÏüðñàøñáçÿžø<?ü<8ðxøðð€ÿ>àÏ€þøøÿð|ñðû‡øùàøð÷ÿøñáà?ØÏøñóàxñáçÿžø<?ø<ð|øðñøÿÀ>ðÏÿ?øøŸð|ñð‡üùàðð÷Àxñáà<Ïxñóàxñáç€x<x<à|ððóüð>ðï€üøø?Ÿð|ñðüùàðð÷À|ññà>Ï|ñóàxñáç€x<x<à|øðóüü>øÏŸüøùÏŸðxñð? |ùððñ÷á|ññà>|ññàùñáçÁž|<|<ð|ððóüÿ>þ€ÏýøùÇŸÀøøñð?<ùùðùóÿ?yñáä?ü‡?8ññððñáçãž>8>>> ðxøðð€ÿ€>þŸ€ÿüùÿŸÀýñùð><øÿðÿóÿŸ?ùññüŸüß?øññùññáãÿ?ø??ø?øøxðððÿà>?üŸ€ÿýýÿ¿ÀÿãÿøýøÿðÿùÿŸ¿ñññü?øþ?ŸŸñùðÿáóóãÿ>?ðÿ?øøøðøðð€?ø>ð€þ?|üÿ?€ÿÃÿøùøð~ðþŸ¿áñðø?‡ðü?ŸÏáùøÃû÷ñþ??àÿððñùùø>ü>| 0|ÿùø<ðð>ð88À`Àð‡Àðùóðü>Àþàð?áùùø€ÿ€>ðüðÀð`ðÿÀ>ðøð€ð>øðø€>?ø>øðø?À€ÿ>øÀü?À>ÿ€>0 ÿà>>ð>@þ>ð 88p À€>ÿ>ð>øxð|à<€€ÿà>ðü|ð~ð~þ€>ÿà>à>øxð|àüþ€ü>>|øà>?ÿÀ>þ>@@xx8ð<<|><À` ÿÀ>?øãø?ƒðàç€À#€8|`|ð@><<àp>ÿà>üçüóàÿƒÿ€áÿÀðüàxxð?ðþ?ããÀüð?€ï€ÿŸð<€€Àx8à<| xàà€?ø>þ÷þÏùðÿãÿàùÿàùÿø|üüøÿñóñÿðáÿŸáÿÏχüðóàÿïþø>?xÀðàwÁüÁð>ü>?þÿþóžóñ÷ãÿÀ?ûÿà?ûÿ>øxøÿŸøÿøþÿñóãÿðÿóÿÃÿü<ð?çãÿÿþø<ðÀðñÿãüÿÇøÿ€>??>Ïÿùß9ñáñûà?üýðûÏž|||óž|?ü|ñðñóÏ€ðñùÿ8çÇÇÇÏ>}øóãßïÿ<<ÀðÀðùÿóüÿïü>ÿÀ>><þþŸ±ãÁñãàýñàÿ¼xxyû|<|xáñáçÿ€ñàùð|χ‡Ÿþ<ÿð>>ÿáóàùñàüñðÿÝü||þü<<|àðð÷ÿÀñàùðO‡ÃÇŸþø!ãLJŽ<>ððø?üøðð~ßþ>ü>><ñóÀùãàññàÿø|xÿü<|xÁññçÿóàùà‡‡¿ü<ÿðÃçÏü<ñðð?üññàx?þÿ>>?Çùóàùñà|ñð€ü||ü><|àðð÷Àùà|ðïƒÃÇÞxñã燇þ>øðx?üððð<þ>ÿ€>><ÏËùóàóãà|ñà€>xxx?Ÿ|<|xáññç€óàyàž<øóãÿü<ùðø|ðñàx>€ÿà>>Ïçìýóàùñà~ñðÁ¾|||OÞ<<<|àðñ÷ÁÀñðxð'ÿ‡ÃÇŸ|ùáÿŸ<>€øðø<ððð<ø>?>~þóÞyóñóãàùñàç¼||xçþ|<|xñññç÷€ñðñàqïÇÇÇŸž>~p8óãø><<Àùð<ð<ðñð|€þ>þÿþÿÿýñÿãóà?ùñðÿ¿þ||ãÿÿ<|€ÿðÿóÿ€øøñðy÷ÿÃÿÏþ>øyãÿŸ>>Àøð?ø?ððð<ÿ€>?øÿüÿßûøÿÇ÷ðóùðƒÿ?þþüÿ¿ÿ~~€ÿðÿûÿøÿáðçÿÃÿÏü~?ð?óãÿÏŸÿ>ñðð?ð?øðñþ|üÿÀ>?ðÿøóøÃóðñùøÁÿþþþÿŸÿ~?ÿðùÿüáø?ãÿÁÿçøàóóÿÏÏŸÿ?ÿðx?ðøøðþüüð>> € À€ü<~|~œ>ð<À|øð?÷Àãà<€ÃãÿïßžÿÀx<àñùøýþø€ü>>ðÀà €<ààùø}þøÿ>>ðÀÀ<àÿÀ>ðÀÿÀÀð>øàÿ€€?ø>>üàÿ€?þ>øàü€?€ÿ€>?ÿÀ>€?ð>>ð`>ü>~ð>>ÀçøÀÿ€p|ø€Àà?À>þ>~ð~>ÀïøÀÿà|üüÀàÿàà?ÿÀ>>ð>Àçðàÿð<üþ€àÿàÿà>ÿà>>ð> Àƒààÿø|<€ààà?ø>>ð>Ààðñø| À`ÀÀ>þ>þÀwÀxð<>Ààððøxpÿ>ÿ€>þ?ñÿàÿðÿ€>üÿà€8~Áüð?Ààððø€|€€œxàÀðÿ>ÿÀ>?üñÿñÿñÿ€>>?ÿÿàÿ€Àøÿ?Çþ?øÿÀ>àøáø€xÀÇüÿŸƒðàøcÃÀÀÀ#ð@ÃÿŸþÿÏÿÀxà?ø>>~|ñÿñïñÿÀ>>?þÿñÿÀàýÿßÇþ?ùÿÀ>àøóøÀ|àÇþÿÃÿÏüÿðãüãããàñÿãüÃø?Ãÿžÿÿÿÿßÿÿ¿ùÿßüÿüÿçÿ?øÿ‡þ ü>||yðùóæóçÀ>>}üÿóïÀûàÿÿϾ?óÇÀ<àøÿð€xñàýÿÇ߇üÿðÿçþÿããçÀùÿãüÿÏü?áÿŸÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿ÿÿÿÿÿÿÿþýÿñÿÃàÿ€>|>?øøóøñçÀ>>|üøóÿàyðÛÿÏŸÃÀ<à<|ÿàÀ|ñàÉÿç‡Ç‡Ÿþ|xñï?áááãàýÿñðÿÏþÀþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÏÿÿøÿƒÿ€>ø>|øðóÿÀsàƒÿÏ>ƒÀ|à?üÿ€ÀxóàÁÿŸþxùáïþÁáããÀ?üùñàßü?àÿÿÿÿÿÿÿßýÿÿÿÿÿÿÿÿ¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿßÿÿÿÿÿÿð>|>?ðøñÿðÿÀ>>>øøóÿÀðƒÿÏÿƒÀ<àþÿÀÀ|àÁÿïLJŸþxyàÿÁñááà?üðñð|þÀ`?øÀðÿÏøüÿçÿ?ýÿÿÿÿýÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿø>ø|ðñðÿñÿ€>>ððóÀ?à‡ÀþƒÀ|àþçàÀxàƒïχ‡¿üxûàþÁáããÀøññàx?þ?à?|?üÿùÿçÿßÿÿþÿÿÿÿ>|>|øøñ?€ñ÷À>?ðøóà}ðƒÀ߃À<à }ÿóðÀ|ýàÁà‡Ç‡žxyàÁñááà<ðñð|€ ?À>O ~?øÿçÿÿ€>||ùðñóŸ€óÇ€>?ÿÿüøñÏ€óçÀ>>?ÀøûñÀùðƒñÏŸÃÀ>àðñüÀ|ñàÁðï‡Ç‡Ÿxyð/‡áñááà>ððð|>¿ø>?ÿÿýùóÿóÿà>>øñóÿÀÿüÿÿžçÀ<áûàƒàü€yûøÿÏÿ‡Ÿ¼xñùÿžááãÃÀ~ññàx> >þ>ÿýýùÿùÿð??üýùÿÀÿüÿÏÿÿßÿðÿûàãð€|ÿüÀÿÇÿÃÿÏüxxÿçÿÿñÿãà?üððò<þ> ÿ>ø~ùùùþùÿàÿ~ýûøÿÿø?Áÿïÿ¿ƒÿà>ÿ÷ð?çøüÿø?Ÿàÿ‡ÿƒÿÏøýøÿ‡üÿáÿçà?ùññüxü?ÿà>|€qÀ?>þùø>øÀÃï€ÿÀÿñðãø‡€ü<ðà?ÿÁ÷‡øüü?ƒüÿðÿ÷ðùùøþüü>ð>ðG€ÀðýàùÇðáñðùüð€€ü>ÿü€Àð€€à>€ÿ>ÿø€<€à?€ÿÀ>øÀ|Àð>€à>?Ààðàð?€ð>` àø>€ð>ð>€ð>>€à>ü€À€``0>€>üÁð<ààðÀðüÀ>>üpÁð|áððàðþÀ<€>>|pÁø>áøø?ððÿÀ>>€>|øáø`8|øàðž€~ÿ>€>|xàø8xxàð†€ÿ>€>|Àï€Î€Oxàp<xx|àð€æ>€>|?àÿãÿÃÿŸƒÁø?ãð€àð`g€xààþx<>Ãøð?ÀÀ>€>|ðÿóÿçÿÿÇÇþÿçüÀàáñÿáþÿøðÿø<ÿ÷üðÿ€óÿÀÿÇÇÁü=øàüøÀ8À€?€>|}ðÿóÿ÷ÿÿÇÇþÿïþÿààÁóÿáþŸøÿøÿø>ÿóüñÿÀóÿ?áÿãçãþøñþüðàþÀ>€>|yðÿûþÿóÿÿÇÏ?ï~óààñÿãÞ<>xøxø>ÿÞóàñçÀÃÿñçããÇþüóÿþ?ðÿŸãÿà?€?|{ððùðÿûããÃÏÿßÿóààñùãÎ<>||xxø>ÿÞsàñçÀþùóÃãÃÏ¿>|xÿŸ€þ<øÿŸóÿ€à>€>|ððùàÿñããÇßÿ|þ÷ààññóö<ø|xxø>ÿß±àñçÀàÿ÷ÃãÃÏÿ>|?ððùàÿñããçßÿ|þààðñóü<ü|xxø<ÿßáàðÀàÿ÷ƒããÏÿ<<ð7ÿ€8ùû>gÿ€>€>|ððùàøãããß<ààðññþ<ü||xø<ÀñàðÀàÿçƒããÏÿ<<ðÿùþ‡ÿ€>>|ùððùàøããÇß|ÿààðñðþ<ü|xxø<ÀñàñÿÀàðÃãÃÏ<<ð€øÿçÿ>>|ùððñàüsããÇχ|ñààññð<>|||xx|àÃùàñãÀàðÃãÃÏ<<ø€?ø÷€à>€>|ÿüñóàÿóããÇÏÏ|žóààññó<€>þÿüÿãàóããÇÏþ|þÿøàññó?¾ü|x|øÿÜyüóçðàÿ÷÷ãçÏÏ<<~ç€xøÏÙ÷Àø>€>þÿüÿïðããççÇþüüÿøàññóß?¿þ||?ðÿžùüóÿðƒàÿãÿáÿçþ<<÷ÿ|ùǸ÷ç€<€>þ~øÿø?Ãóççãýþüÿøðûóóþ?¿þ||àÿñüùÿðÇðáÿáÿçþ~~?ãÿüÿç¼óÿ€<<ø>€>`þðƒãÃçÁñþðýððóóóü¼x|>ÀþàøùûàÇð?ÁÿÁÿãü~~?ãþøýÿ¿óÿ<<ü>€>ð0€3à ð€øð?|ÿáþx<ü>€>àÀ 0~Àøx<|>€>ðàp<<>>ðàð>ððàxp>>àÀøà>>ð>>À>€>x>>ø>€?|ÿÿÀÿø€>>xÿÿÀþü€À>€?8ÿÿÀ üþ€ð>>xçÀ`ø<ð>€>øx80 À|ÃáÀð|ð>>üùøøÿ~ñþÇÁßà3Àg€`Ãà€àà00ø<à>€??üüüüÿÿ‡ýÿóãÿÀ‡øÿ÷ðÿàþÀøðøø€ü?çø~?‡üàÿxÀ€ <ÿÿÿÿÿÿÿãÀ>~ü|xøÿÿüþãçÿÀýÿÿñÿñþ€ÿø?ðùùÿ€üÿÏü~<ÿßýÿ?óÿøÀ?Çüÿƒð;àøøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿð€?|||||ÿÿ~xñóÿà?þÿÿùÿùÿÀü=üxxÿÀüï<>ÿïýÿ?ûÿxàÇþÁÿÇÏÇüø?ãþüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷ð>ø||xøÇÏŸþøáããÀ9÷ïûÇ}ùþøùàýÿÇÿ‡üÿøçþüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿü€þ>ø<|||ÇÇßÿxññãàþ|xøø}ó€<>x>xxxð<>9ÿçÁó?ýð|yðÿ÷çÇÃÇÏ>øy÷Ÿü?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿá¼ÿÀ>ø||xøÇÇ¿üøáããÀ>?üxøðð{ø|>ðø|||xÇÇÞxññãà?ü|xøø}þ<ø>xxxð<þùÿÇþ¹ðxðÁÿïƒÃÇßÿ<|ðoÿð>èSÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø>ø|xxøLJ¾øáããÀ<<xøððxÿ??|>ðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿü>ü|||xÇÇßxñáãà>>|xøø|€<ø>xxxð<>ñà'€?üàx}ðÁàƒÃÇÞ<|ðð>Àÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿü>ÿü~üøÇÇŸþxñããà>?xxððy>ÿÀ<>ø€ÿÿÿÿÿÿÿÿü?ü?þüÇÇÏþ€ÿñãà_þ|xøøy€>óÀ<>|<|xxð<>áýçÇ¿yàxùðÁðïƒÃÇßÿà>?ü?ÿüïÏïüÿóãà?ßü|øøýóÏ~óÀ>|~øüøþ|ÿÀÿÏÇ¿ùà<ÿþÿøÁÿïÇÇÇÏŽÿ€>üüþïïçü?ÿûóðÏüüýüÿñÿÿóÀ?ø?ø?ýüþüÿƒÀÿßÁÿŸ÷ð>ÿþüƒÀÿçÿÃÿÏþ<|ÿ÷ÿà>€ø>ü00ÇÏáð}ããð‡ðÿýüÿÁþÿóÀ?ðà{üýþßÀŸÁÿçð<ÿþøàÿÃÿÃÿïü||çþÀ>Àà?|à|üøÿ€üÿóÀ?ÀÀ!˜8þŽ€€þÂÿü>pðƒÿÁÿçü~|?ÃþÀ>€`>|øóÀ<÷Àóð |ø€>€ø€<>~øóÀ<À €>?ÀøÀ|<>þøÿÀ|À€>Àøà|~?þü€~Àï>üøàü|>|ü?~àþ>þø<ðþü? àü>þûÀ~ðüþ>Àÿ÷àÿŸðüü>ÿïñÿ¾øøü>ÿïñÿ¾øøø>ÿïðÿ¾üxx þïð|üøø>þïð<üxx>?|Ïð<øpð>à?ø0p>?à?ð`>ÿÿ€>ÿÿ€?>ÿÿ€ÏÇ€?>‡ƒ?>‚€?>?€?>?>>>€àpx>Àðx|>>€Àðüx>>>Ààðü8Àà>?>ÀÀðüÀð?<ÿpÀàð<Àð€ÿ€p8>?ÇÿñÿÀðð8x3À<àÿþð8p?çÿÏóÿŸðüðxüÿð?ƒøø?``û€áü<À xx>÷ÿÏãÿÿðüð`ùÿñÿ?ü?ü€à>ðÀùüÿàÿøþ?>üü€ïóÿÇÁÿÿø>ð|ÿùÿ¿Ïþ?þ?€à>ðÀýüÿŸøÿÿüÿþþãÿßÃßø>ÿóãÇÁðø<ðx|ùã>¾>ð<ÿðàüðߟ<øÿÿüþþþ?÷ÿÿÇÿÇüÿûãçÁðø~ð||yù>>>ð<ÿøà?üðÿß<øïÇ>xþø÷ÿÿçÿçüþóãÇÁðÿøüðxxyþþ><ðÿÿ|ÿðà?üðÿŸøLJŸþxøñóóãçç¼ðãçÁðxþð|xxÿþ>àÿÿ€|~ðð?üðÿøÇÇŸþxxùñáãá÷ÌøãÇÁðøþðxxøžþ><Àÿÿ€||àð<ð€xLJŸüxøÿñááãá÷àø3ãçÁð|>ðxxx?Ÿþ>Àÿÿ€||ÿøàð>ðÀ|ÇÇžxxøññáãà÷øÿóãÇÁðø>ðxxxÏž>><À|x?ÿøÀðÿÿÿÿ€> ðÀŸ|LJžxøøñáãàóüóãçùðøÿ€ð|xùÇß>><Àÿ|xÿøÀ>ðÿÿÿÿ€?ðáŸ>LJŸxøøñáãàñþççãûð?ðÿ€øüøùçŸßÿž>?€ÿÿ€|øÿðÀðÿÿÿÿ€üþÿŸ?øLJþxx|qñáãáâ~?ççã÷ððÿ€øüüýÿŸßÿŸ>€€ÿÿ€|øÀÿðôüÿÿŸ?ðÇÇþ€ÿzññáãáæ>€áãàÀÞøüüüÿÏÿ¿?€àÿÿ<øÁãÁàø~ÿ??ðÇÇÇü?ÿŸññãáãÇ~‡Ï>à<øãÁàð<þàÏÏÃø?ÿŸ~?ãóóñ÷ÇþÀ<ðãÃàà Æ<Ãóãùçüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðxñà@?€ðãÃÀñàøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀØàãÃÀàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÀ>àãÇ€àÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀþç‡àÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ¿€þ÷Ž8àþÿÿÿÿÿü¿ÿÃÿáÿÿÿÿÿççÿÿÿÿÿÿÿÿÿÿÿÿ¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ü€þàŽ ïÿÿçÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ¿ø~€þÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ€þ0€€üÀÀÀÀàÀ?àà?ðà{àÀyø€ñððø€àøà|À|À~À~ÿþÿþ<ÿà€ÿþ>ÿðÀ|ÿðà|ÿðÀøù÷‡üàøñŸßüÀàÿïÿþ?àÀÿÏÿüÀÿïÿàÿÏþ>ÿàÿÇþ?ÿððþ?ÿøøþ>pÿøøÿ>øðøßþøàøßþøÀøÏüxÀÿàð€ÿÿ€ÿÿ€ÿÿ€‡ƒƒ€>?>>À€| ÿøàð>>à<ÀÿøÀàxü<~à|ÀÿüÀðÿ€>ÿ?ð<à?ÿüàÿþ8><ð8À><÷€~<<`À8|8>>à€Ï>ƒ| x€ à€à>xx~>~ðÀÿÀÿ‡çÃþùÿÇáÿÃü?à?Ãøþ<<à>ð~0<€ü|þàÀÿáÿÇÇÏþÿ?óÿ?÷ÿÏüÿÀÿÏüü|||ðþðxþyþáøð;ßÁÀ|>ÿøàÿñçããçþ~ûχ?ûÿÏþàóïþþ>|øü|ÿYÿŸñþøÿãáÞø|þðàó÷ÃãÃÇü|wŽûþùßþ€ãÿþ<><<<<ø|>x|x>sÿ¿çü?üÿßÇÇþü||ðàáóÁñããÀ<χÎùà|ßÿ|áïÿ<><<<<ø<ø|xÿ¿gàx>|ƒÃìø?ÿü||?ÿøÀðàÿÁóããÀ<ÿƒþÑà?ßÀ|àü|><ø<ü<|ÿßÃøx<ãàøà?ÿø|øÿøÀàÿÿÿÿà÷ÁóÃÃÀ|ÿüøà?Þxà|><<<>ø<ø|x€ãüø>xÃÀøðÿø|ø?ÿøÀ~ðÿÿÿÿ€à÷ÁñããÀ<çü|àÿ|ð<<>x<ü<|Àñþx<ƒãÀð?ð|ø€ÿàÿÿÿÿ€á÷ÁãÃÃÀ|ø|9àgÿxðÿ~>><<|ø<<ü|xÀðþx>xƒÃÀð>ø<øÁÿðÿÿÿÿ€ñóááçãÀ=Ï€øùàqïþ|ÿïþ?>><ü<|áÙû?|<ƒãÀð<ø<ðçƒàÿãÿÁÿçÀ?Ÿÿàð?óà{ïü|€ÿÏþ?þþ<þðçÃàÿÀÿÁÿïð?¿ƒÿàp÷ðçü|€Çüþÿ~??þ||óãÀøðƒÇƒàÿûÏà?ƒ÷À`Çðƒø|€?øþþ~??ü~þ~??ÿóþøþóãàø<~¾~€þãþñþ÷óàøàçÇÀàð¿Àþç€ð>ðÿ€þÿø àÿøÿ|ðÀÞø~þ?8€þ€þÀÜÀÀÀÀ?àÀ?à?àà?à{ðÀóð€ñø€áøàüÀøÀ|€|>€ÿþÿþ>ÿÿ>ÿü|<ø€øð€à€€<ààð€>áðø>ãøðà Àà€@€áøp?ÿððÀÀðÀxð8áø0ÿð>àÀÀðÀøð~|x€€àø8?ÿø>ðàÀðÀøðÿàøà€àð`ç€p|xxøð|àÀààÀøà~ÿáðð€?ààðñÿÁþààüpøp8ðàðÀx÷ãàxààáóÿãþÿøñþaø`0ðàðÀxÃç€<€{ðàùÿóÿŸøùÿøüðð~||àïÃøøƒÀ`?À?Ÿüx€Áç€8<ùðàñùóÎ|>øøþðÿþáðÿÿþñÿçøø‡ÿñðÿÀÿÿƒþx?€ñðã¿üÀÏ€x€{ðàùñóæ<>|~üøðÿŸÿáñÿŸÿþûÿãøøÇÿñðÿÁÿÏÿ‡ÿxÀùðÿ÷ÿ‡üàÏøwðàññóø|ü||xðÿžÿùáóÿŸÿþ?ùÿãàüÇÿžqðÇÃççÿÇŸxÿàùñÿ÷ÿþøü€?ðàññóþ<ü||xàÿž~ùñóÿÏŸ?ýñáà|ÇÏŸ0ðÃãÃãçÏxÿà9ñç÷ÿ>üü€ðàñññÿ<ü||xàÿ¾|wá÷ÿÏýñáà?þ‡‡ŸðƒÇƒóÇÏyÿà‘óçÇÇ>þð€ýðàùñðÿ<ü||xàÿŸ|ñ÷ÿùñáà?þLJáðƒÇÁóÃÏyÿàÀóçÇLJ~þà€ùðàññó?<>|||xÀÀ€üñ÷Àxñáàþ‡‡ñðƒÇóÇßyö@ñóçÇÇþà€ùøàññóŸ<>|||xÀð€øýñ÷À|ññàÿ‡‡‡ùðƒçÁóÇÏyàùñÿÇLJþ?Ÿà€ÿüðùñóß?¿ü|||ÀðÁŸðùñ÷Á|ñáàð‡‡ùðÃÇÁãÇσyð`ùñÿ‡Çž8ŸÀ€ÿüðûûûÿ?¿þ||€<øçŸÀññóã~9ñãà`ð‡‡‡ˆùðÃÇÁãÇÏÇyðàùñÿÇ8ŸÀ€üøùûûþ?¿þ~üÀ8À<ðààñüþ~ü?€>à€ iaxmodem-1.2.0/lib/spandsp/test-data/itu/fax/test3.pbm0000644000175000017500000104125511150047204022102 0ustar julienjulienP4 1275 1745 @À€@ÀÀÀÀ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€pð€ÿÿ€€ÿÿÀ`€ÿÿ€`@€€@@à€ÿ€ÿxÿ€€8‚ÀpÀp€€ÿ€p @ÿ€` @`ÿ` á0ð  0 ` € ð €A€° È `€á„@ „ @€ñ†"p à @±‚"€L  @A1ƒ€0€8°@C1ƒÀ0üÀFƒ@ðçÀgÇ` ŽàÀoØN`øàÀl(`àÁè` ÓÈ` O€7àÀð€Àð8|€ø1€à€€0€À€Cpàbx8p ÂØx ÂÈÀ€  ÂŒ€‡À ÆŒïÀæüàÂþ>0?à;€Ãà?ð?Ã÷ÿÀ?ð€`€00€ >ÁÀßÀ?øàà€00>À "ÀÀÿàüóð€0À0€@ àÿ`ûüÿð8À0€`ÿð€ÿðøÿþø?àøÀ?ð0€¸0?ÿðÿàøÿþüðüðÿÀÿÀxþü øðà€€p?ÿà8Ÿÿÿþ?þøüøÿáÿÀ|þþø?ð€?ñÿÀÿÁƒÿþþàœƒ?ÿ8 x80àxÞó¡à<ü?ü?à€ñÿÁÿÁƒƒÿÿþ>àü€þ0 p80ÿøŒóàÀ€`8ÿáÿÿþ`Ààü€0p80ÿøœã`€ÿ| ü8pጇøà`þ€ 0p80ÿø ã`Àÿü ÿðpaü†ÿøã€|à€€`€ 8p80ðœs€`Àÿøü ÿðpaþ†ÿ¸€|À€€aƒðþ>üp8 ` s€àÁÎð à0c€aÿ†ÿ€<<€€aÿƒøþøp00?ð?Œaÿàÿ€‡ÿ€ðþ<àx0c€Á‡‡8ø?|üÿ€øüø 0?à?ƒ aÿÁÿ€ƒû€àþø?ðàáÿÁƒÿ‡üüøü€?€ÿ€ð00€/€?€ó@æð?ð?àáÿÁƒƒÿþþøþü?À8áÿ€9ü~ÿø8pÀÀÀÿþþðø?À8ÿàÿ€@1þÿ?ÿÿÿÿÿÿÿŸÿÿÿðþ?ðüàÀ8pà/ÿàqÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿¿ÿ÷ÿt ?ÿÂà0qàÿàsÿjóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþñþ0?àÀ#Ç€{ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþñÿ0?À€aÇ€€x ÷ÿÿïÿÿÿÿøÿþñÿ0€áÿtàÿà~@à@ø€ü<|Àøð?ÃàÀð?ðÿÀààà~ðÿàðð€€>áðpðÀÀ <Àø>xÀà<€ÿÿÿÿÿÿÿÿÿÿÿÿÿû‚ÝcÞ€€pxÀà0ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø0pð`<p0ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà0Ž<ðp880?ÿÿÿÿÿÿÿÿÿÿÿÿø8ž<à8x80?ÿÿÿøüøÿüð|0€ç‡ü?øÿ€üÿðü0Àóƒüàÿ€üÿðü0?Àá€üø€¸à€08À€ ` à00`x€ ` à0`àø` à0àÿþ` à0àÿÿÿÿÿÿÿÿÿÿÿÿÿÿü` à0Àÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ` à0Àÿÿÿÿÿÿÿÿÿÿÿÿþà À0gà³ÿÿÿÿÿþà à0cø<à À0c€<` À€à À0€€` À0€0` À €` À €` À 9À` À qÀà À0ùÀà À ÿà8à À ÿàÀ À ÿàÀ À €`À à `À À p8À À 08À À 08À À 8 xÀ À 00ø0À À 0yøpÀ À 0ûùðÀ À ÿ¿àÀ À `ÿ?€À À ß8À À žÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÀ À ÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÀÀ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÀ À ` À ¦@¸üÀ À `à|À À `?·Ï€€ð<À À `ÿÿÿÿÿÿÿïÿßÿ‡0ÀãÀp€ À `ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀ~À À `¯ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÀ À `ÿÿ ½ßÏïþÿÿÿÿÿ€þÀ À ÷€€À À ãÀ€À € ÀÀ€`€ € €`€ø€ À `0Ùø€ À `8ýüÀ À `}ü€À `x ü€À `ð€ À `à€ À `À€|€ À ` ?Àø€ À `øÀø€À`ü€ð€ À`üþ€ À`øÀ€ À `À€ € `À€€`À€€`0À€€`0À€€@à0À€ €@à0À €`ð0À €@ø0À€ €@ø0À€ €@Ü0À€ €A€ø??€Ì0À€ €ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿá÷ÿÿËÿ Œ›/ÜÄ0À€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÆ0@€@0ÿý=Çÿ‹ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ0ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà.€@0ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿä ÿÿÿÿÿÿÿÿÿÿÿÿOÁ€@ð0€€Çÿÿÿÿþ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþü0€€Àø0ÿÿÿÿÿÿÿÿÿÿÿÿþþ87 À0 ‚Aÿÿÿøÿÿþ؇¼€Àà0Ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿì ÿÿÿÿÿÿÿÿÿÿÿÿøÿ€ÀÀ0€aÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿð?ÿÿÿÿÿÿÿÿÿÿÿÿÌÿÿÿÿÿÿÿÿÿÿÿÿùû€À À?ÿÿÿÿÿŸð €ñÿâÿ ç°á€€ À0Á€À0À€À0À€À0ÀÀ0À0À €0€À0€0À0À0ÀpÀ0€ÀpÀ0€€ÀpÀ0€ÀpÀ€€ÀpÀ00ÀpÀ00À`À00À`À00À`À0 0À`€08À €0€0€ €0 €0À`€  €0À`€0 €8À`€0 €0€`€~0€0€`€ÿ0€0€`€ÿ00€p€€0€0€p€~0 €8€`€þ0 €8€`€þ0 €0€ €>þ00€ €~00€`€† 00€ €þ0 0€ € `àþ~00€`€?ÿÿÿÿÿÿÿÿÿ||00€`€?ÿÿÿÿÿÿÿÿÿÿð < 0€`€0ø‡ÿÿÿÿð €p€`€0x` €8€`€08`0 €8€`€0ücÀx0€`€0üÀø0€`€0œÿÿÿÿÿïÿÿÿÿÿÿÿü 0€p€0 ÿÿÿÿÿÿÿÿÿÿÿÿÿü 0€p€ 0ÿÿÿÿÿÿÿÿÿÿÿÿÿø 0€`€0ü€ø0€`€pø€ð8€à€pøa€08€à€px` 8€à€ð<à 88€àÿùð` <0€Àÿùðð` <0€À?øpø` >p€àpü` ? p€à`þÿÿÿÿÿÿþÿÿÿÿÿúð7 p€à0ÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿð?ÿÿÿÿÿÿÿÿÿÿÿó 0€àpÿà8sà¿ÿÿÿÿÿÿÿÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿópàp?à0`<`ÿÿÿÿÿÿÿÿÿÿÿÿñˆpàp@0` Èp€Àðÿà0` Èp€`ðÿà0` Èp€`ðà0` xpà<çð<` <p€àÿÿpü`p€àÿþpø`  p€à€|`àÿÿÿÿ÷À`<0€àx`ÿÿÿÿÿÿÿÿÿÿÿÿÿà|0€à8`ÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿáü 0p€à``€ÿÿÿÿÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿãü 0p€à```ÿÿ?ïÿÿÿÿÿÿÿÿØ0p€à`à@pÀ`à~p€À`à|pÀ`` xp€À`à<ÿ ðp€À`à>>ÿ€``pÀ`à~<`pÀcô[çïúÿüž@à÷8ÿ` pà€ÿÿÿÿÿÿÿÿÿÿànxÿ€` pà€ÿÿÿÿÿÿÿÿÿÿà~ü`p€à€ÿóÿÿà>ü`p€À€8`p€À>`pÀ>`pÀ€`0pÀ€ `0pÀ€`0pÀ€€`pÀ€À`pÀ?À``À{À€þ``ÀÀ?Ÿÿ`àÀ€ž?@ðà?qüþ``À8óüÿ`ðàÀë€ÿþþ``àÿÀ~À`0`ÀÿÀ~À`àÀÿ€€ààÀààÀààÀààÀ€à0`Àà0`Àà0àÀààÀààÀààÀà0àÀÀ@ àÀÀ`0àÀþÀ0àÀþà0àÀüÀ0àÀÀ0àÀà0à€€à0àÀàà0à€Ÿàà0à€Ÿðà0à€œqà0àÀÿÿÿÿÿÿÿÿöÀÀáà0àÀÿÿÿÿÿÿÿÿÿÿàÿ¿¾àà0ÀÀÿÿÿÿÿÿÿÿÿÿÿàÿ¿ŸÀÀ0ÀÀà!ÿÀþ?Ÿ€À0ÀÀ`ðÁÀ0ÀÀ`ðÇ€À ÀÀ`0ÿ€À ÀÀ@þà0ÀÀÀ8ÿÿÿÿÿÿÿÿ ÿÿÿÿÿð0à€@øÿÿÿÿÿÿÿÿÿÿÿÿÿÿð0àÀ`ðÿÿÿÿÿÿÿÿÿÿÿÿÿð0àÀpàà~øà0ÀÀxà`ßà ÀÀøàpÇ€À ÀÀüà0ÀÀ à€þàÀÀ0ÀÀÿîàÀàp0 ÀÀÿÇàÀàp0 ÀÀAÃàÀÀàx0 ÀÀàðààx0ÀÀà|ðààü0ÀÀàüxÿÿÿÿÿÿ÷ÿÿÿÿïÿpàì0ÀÀàø8ÿÿÿÿÿÿÿÿÿÿÿÿÿþàÿÿÿÿÿÿþB„€Ì0ÀÀàÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÆ0àÀà à€ ðíðÀÿÿÿÿÿÿÿÿÿÿÿÿÆ0ÀÀà<0 àÀÿÿÿ À€à0 ÀÀ  Àÿýðà€0 ÀÀ0 Àÿÿÿüàà0 ÀÀÐÀÿÿÿøàð0ÀÀøÀ£øàø8<ÀÀ x  ÀðàüÀÀø  Àààø`?‡Àø0ÀÀÀðÿÿÿÿÿÿÿÿÿÿÿÿÿþÀVÿø0À€àÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿ˜ Ààà8ÿûÿÿÿÿÿÿÿþÀÿÿÿÿÿÿÿÿÿÿÿÿ?0Ààà`Àà{ÿÿÿÿÿÿÿþ0 ÀààðÀøü0 Àààðð Àð0 àààð`ðøÀà0ÀÿÿÿÿÿÿÿþãþàpøøþÀÀ0À ÿÿÿÿÿÿÿÿÿÿÿÀ0#øøøÀ€0Àÿÿÿÿÿÿÿÿÿÿ03˜ÀàÀ À ü03<àÀÀ À03ÿàðÀ À03ÿðøÀ À0sãà|@ À0aÀ   À0à Àà€  ÀðÀ  ÀàÀ  À ÂÀ  À <àÀ  À þðÀ À þðÀ ÀÇxÀ À |?€<À  À þ?~À  À <þ8þÀ  € üŽ8üÀ  € ÀŒüøÀ À üœüøÀ À þü|ø€  € þ9ü|ÀÀ  À ø8ðÀ Àø€ Àð€ À ð€ À à€ÀÀÀ À€ À €€ € €  € € € à  € ?à€À ?à€€ x@€ € `à€€ `ð€€ ÿ,@ðÀ € ÿÿÿÿÿÿÿþü°@@àÀ € ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿð@cà€ € ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøƒ€€ € ÷ýÿ/ÿÿÿÿÿÿÿÿÿÿÿÿü?‡€€ € ßÿÿÿüÀ€   8À€  pÀ€ à ðà ð Àà€ øÿÿÿÿÿÿÿÿÿÿÿÿÿÿà € ÿÿÿÿÿÿÿÿÿÿÿÿÿÿð € xü±Ì5Çð € ø üà € ø >à € ðÀ  à € € ?€ `€`€ ÿ€p€ € ÿ€ € €    ƒ€€ ` €€` ‡€` ÿ€€  ÿÀ€` ÿà€ ` à`€ ` `€` p€` p€@ `€@ à€` à€` ÿÀ€` ÿ€X€@ ÿ8ü8 @  ü ùüø€  óßà€ @  ÿûÿð@À `  ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀ @ ùÿÿÿÿÿÿÿÿÿÿÿÿÿÀ  øÀ0 ÿÿùÿ@x€ÿÿÿÿÿÿÿŸü08€ ÿÿÿÿÿÿÿÿÿÿÿÿàqóü€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿù<Àÿÿÿÿÿÿÿÿÿÿÿÿÿÿüà€ Gÿÿÿÿÿÿÿøxà€ œÿÿà`€ àÀÀ  À9€ € À}€ € ãÿ€ € ÿ€€ ?‡ß€€ ‡Ï€€ ߀€ û€@€ ù€@€ y€ q€ € €   € @  `  @  €  @€ €@ €@ 8€@ 8 @ 8 @ @ 8>@ 8? @ 8`€ü? @ ÿÿÿÿÿÿÿÿÿÿü;K€3ƒ @ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ¤`1À  @ 0GÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÈ qÃÿÿÿÿî퀀 @ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðãÿÿÿÿÿÿÿÿÿûÿÿþ€ @ xÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðc‚ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿçp€€ @ ?ÿÀÃÿàswÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿù€ÿ¿ÿÿÿÿø¼ÿýÜ0À€ 3ïûÿÿÿÿÿÿÿÿÿÿù€ÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿ¼ûÿæ@Œ?;¡€ ÿÿÿÿÿÿÿÿÿÿÿÿÿp?ÿÿÿÿÿÿÿÿÿÿÿÿÿŒ Ò0@ ³ÿÿÿÿÿÿÿýŒ @Ì8€@Ì?ÿÿÿÿÿûl?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿà<?ÿÅøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø p‡çœ88Cø¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿãÿûÿþ{ÿÿÿÿÿÿÿÿÿý@0@0€ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿï¹½¸0@0`/ßÿÿÿÿÿÿÿà-ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€@0@0Àðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿðAßþÿ?ˆ~8€ÿ?øOÿûÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿñü8?^àpC÷ÿÿÿÿÿÿÿÿÿÿÿÿü0þ@ÿÿÿÌø0@? ð0@ À0@  @  @ 00 80 00 0 0 @ 0 @0 @ 0 @ 0 0 @ 0 @0 @0@0@0@ 0À 0À 0 ð 0ð À 0ð`À 0<`À00`À0` À0ÿÿ§à` @0ÿÿÿÿÿÿÿÿÿÿÀ`ƒ @0ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ` @0 ?ýgÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðg 0 Ü£½ÿÿÿÿÿÿÿÿÿÿÿÿø?ƒ 0 Ïÿÿð>ƒ 0 0?0 0? @0 À À0 à@€ 0 ?à3àÀ00 0à?áÿðÿÿïÿÿÿÿÿÀ0p !ÀÿÿÿÿÿÿÿÿÿÿÿÿÿÀ p?ÀÿÿÿÿÿÿÿÿÿÿÿÿÿÀp?Àÿÿð€ €p?€ÿ€ 0 À 0 g€1àÀ 0 üc€0À@0þaÀ0 @0þaÀ0 Àp0À p80@pp  @0`  @00`0 @00`0@p`0À p À`8  À`<0 À0 0 À00ÿ@0 À0pÿ`Áð`Àpøpãð @0 `sÃà0 `?Ç`€€0@ `?þ#À€ `~'À€ p|?ÿÇüx€ ` x?ÿÿÿÿÿÿþÿoÿÿÿ€€0 ` 0?ÿÿÿÿÿÿÿÿÿÿÿÿÿ€0 `€?ûÿÿÿÿÿÿÿÿÿÿÿÿ€À0 `ÿÿÿÿÿÿÿÿÐ?ÀÀ0pÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÏýÂ#À`À `ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿaÀ`€ `gÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà€`€ `8À#÷ýÿÿ|`€ `€þ` `Àþ `À€ `À `À` `€â€ `€;âÀ0 `€{ãÀ`€øóÃ`À `8€üqÃ`À0 `8€øqƒ `Àcƒ@€ `€cƒ@€ `Àg0 `€Ç` `€Ç@€0 `€À@ `€0€ `À€ `8À@€ `8À`€ `8€ € `8€ €`8€@ `8€0@0 `8€0€0 `À8€0€ `à8€€ ÿðð8€€€ ÿÿÿÿÿÿÿÿø#€ð8€`€ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿõ€¼8€0À à€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿp ž8ð0€À àÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿû8ÿÿÿÿÿÿÿüƒ‡ð@à `ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ8ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà0@€à0 ` `â æÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÃÿø`ÿÿÿÿÿÿÿ¿ÿÿÿþp0 ` ø€]ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿþ8 `øýÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÿÿÿÿÿÿÿþàx0 `þ`8oÿÿÿÿÿÿÿûÂÆx8 oÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþx0˜ `yÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ³‚Tø0€øà?ÿïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðø0@øàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûßú0`øà7À'¸ÿÿûÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÈ0`ø `~~ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø0 ð àø)ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ?ÿÿÿýÿÿü¿ü‡7÷{ˆ00 àðäÿÿÿÿÿÿÿÿÿÿÿÿ?ÿÿÿÿÿÿÿÿÿÿÿÿÿ?ÿÿÿÿÿÿÿÿÿÿÿü|0 àð` ÿÿÿ¿ÿ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýð €àÀ?0P‡þ^v(@‰ûÿà € à0À  À`€€À `€à0@ à0À À À0@ À0@ À@ À@ À @ À0@€À0@€À €0À@€0 À @€0À0@€0 À @ À @€ À @€ À @€ À0@ À0@€ À @€ À € Àø € Àü @€0 Àü0@€0 À0@€0 À 0@€ À0@€À0@€ À D`0@€ Àÿÿÿÿÿñÿÿ€8 @€ Àÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþ`ø @ÀÀ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüˆ@Çø `0 ÀÀ?òÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàïð``0 ÀÀÿ÷ÿÿÿÿÿàçð `0 ÀÀà€` @€0 ÀÀ``` @ ÀÀ`à0@ ÀÀÀÃÀ À€ ÀÀ?àÿ€> @€ 0€À0`ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ @€ 0€À` ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ @ €Àpÿÿÿÿÿÿÿÿÿÿÿÿÿþ @0 0€À ðü @€0 0€Ààÿ @0 0€ÀÀÇ€`@ ÀÀ€Ã€`@€ÀÀcÀ @€ 0€ÀðcÀ @€ 8À€øa€À @0 À€øaÀÀ`À0 À€ ÀÀ`À À€ ÀÀ `À €€ À `À €€ À € €ÀÀ €0 €À À € €À À À€ 0€À À 0À€`0€€8À0@€ 0€€8<À @€0€À?øÀ`@ 0€À?ø À`@€0 0€À?ÀÀ`@ 0€À9À`@€ 0€À`À0 0€€ƒÀÿÿÿÿÿÿÿÿÿÿÿÿÿþ`À0 0€€€€ÿCþÿÿÿÿÿÿÿÿÿþ@À0`0€†Ÿü¢üÀ~@€0 0€?ÿÿÿÿÿÿÿûðÿ€|@€0 €?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿóÏÿhÇÀ|@€0`0PÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÃÀ@À0`0€þ˜?ÿÿÿÿÿÿÿÿÿÿ€€€`À `0ÀC~À`À0` ÀÿÀ@€0`0Àà@À0`0@€@À0pÀ€@€0 pÀ `€0 `À `€0 `À8 @À0``À | @À ``Àþ @€0``À @€0``Àøü @€0 `Àð@€0`0Àü@€0@0Àü@€0 Àü@€0 Àp@€0 À@€0`pÀ @€0``À@8``À@8@pÀ@0`À@0 €À@€0 €À@€0`ÿÿÔÀÀ@€0@`ÿÿÿÿÿÿÿÿÿÿÿû€àÀ@€0@`ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþðÀ@€`0``ÿÿý¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿü?ÿðpÀ@€ð0@`ÿÿ¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ8À@€ø0@`ÿïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÀÿÿþó`@€ø0@`8h`4^ðÿÿÿÿÿÿþÀÿÿÿÿÿÿÿÿÿþàÐ@€Ü0@` Àÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿ€@€Î0@`Àùóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿü@EÞ"€Æp@`À@ÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿù€yEÃp@`ÀÿÇÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿý€ÿÿÿÿÿÿÿÿÿÿÿÿ÷Ãð@`€àA8¿ÿÿÿý€ÿÿÿÿÿÿÿÿÿÿÿÿÿÁð@`ÿÿÿÿÿÿðû„¸à@€÷ÿïÿÿÿ€ð@`ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÂYù0à@¾p@`ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿßÿÿÿÿÿãßÑ àð@€`@ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿüðÀ€`@0/ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø}ÿÿÿÿÿÿÿÿÿÿøÀ@À€à@0Q¯à8øÿÿÿÿÿÿÿÿÿÿÿÿÿÿgÈL@€ð@09à7ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŸ~8@€ðp?ÀÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÉÆÀàpÀïÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿßðx`à@02ƒ˜l ?Èÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿþ`@``€ÿÿÿÿÿÿÿÿÿ<`@`@€ÿø``` @€øà`` @€ð`@` @Àà`@` @ÀÀ`` @À€`` @À`@@ÀÀ`@@ ÀÀpà @€p@à@€``à@€```À€`@`À€`@`À€`@`À€``À€`@`À€`@`À€`@`À€`@`@ À€`àø À€`àÁ#€ À€@à€¼@ €À€@àÀüA3ÀÀ€`@àÀø@€€ ÀÀ€@@`@Ø`Œ`#ÀÀ€`@à!€`ˆÆ#‚ÀÀ€``à#‡€D `À€`@à‚0À€`à€À€`àÿÿÿÿð€0ÀÀ€@@Àÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿý€À€@@à ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÀ`@àøó=È7þãÿÿÿÿÿÿÿÿÿÿÀÀ€`@à†àÀ€`@à?àÀ€`@à}àÀ€@@à`pÀ@@àøàà@@àøàÀ€€@àxØðÀp€€@à€ø ø@ÀáøÀ€`€àƒø8àÀóø€€`ÀàÏøÀ`ó8€€`€à† ÿp;€sïðx€`àÆ þp?÷€?ïáø€`àç|p?÷ÇÃð€€`@Àxp?çãà€€`@À``s ÷ðÀ€`@À ``à çðÀ€`àÿÿÿÿÿÿ``pð |€€`àÿÿÿÿÿ`àÿð0ø8À€`@àÀ?€`àÿð8ÿ‡Rÿÿÿÿÿÿÿÿÿÿü€€`à€`À8ÿÿÿÿÿÿÿÿÿÿÿÿÿü€€`@àÿøÿÿÿÿÿÿÿÿÿÿÿÿÿü€€`Ààçø€ü€€`@àÇ? ðÀxÀ€ÀÀœÀð8À€`ÀÀó¸Àø€€`€ÀãøÀ?0` 8€€`€ÀÁðà?€0p †À€`€ÀÀðð7€00 ŒÀ€`€À €àp€00 Š ˜@À€`ÀÀàà Ó!@ €€`ÀÀ @?à£+a‚€€`À À€þ $c€À€@À Ãðcþ  @À@€€ÀÀ cƒøóÁþ?€  @À€à àxóÃŽ€ Àà ?àø CƒÀ €€`À áøÿóÀ 0À€`€À øþc€ 0À€`€À à@ €€`€À ÿÿÿ€€€> À€€@À ÿÿÿÿÿÿÿÿÿÿÿÿÿÿúÿð@  À€`À ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿü@8€€`À a€Çÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿü@8À€`À ü ýÿÿÿø€8À€`À ü€€`À þ8€€@À ‡À€€@À €€`À <€€@À øÀ €€`À àà€@À À`€`€À È88€€@€à þþ8€€€À þþ€@€Àþþ8€@À €€@€À €€`€À  €0€€`€À  €0€€@€À  €8€€@À €8€€@€À €8€€`€À €€€`À €€€`À  €€`€À €€`€À €€€`À €8€€`À  €€€`€À  €€€`À  €€€`À €À`À€€€àà€À ÿÿÿð€€ ð`€Àÿÿÿÿÿÿÿÿÿÿÿô¸ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€0€€ p@€ÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÿÐ?_÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûøÿÿÿÿÿÿþå„€ü8àÀÀ„}Éÿÿßÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ˜@ÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿüà€À 7ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûœÿœÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿø à€À€Aó©Ÿÿÿùÿñœ8€`€púàà€ÀÜ8€€à€Àü0€€à€Àx0€à€À |0€à€À<0€à€Àÿÿßìø“€0€à€ÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀü`80€à€ÀÿÿÿûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀxcw@D„0€à€À‹ÿ¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿáüÿÿÿÿÿÿÿÿÿÿÿÿÿÿðþÿà€à€ÀbG€þÿúÿÿÿÿÿÿÿÃüŸÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿûÿðà€ÀÜ€ _ÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿøÀÀ € /ßÿðäˆ÷‡ýøAÿû€0$ÿøøî¿ÿÿÿþø|@ÀÞ€0€ø`Àþ€0€ð`Àü€0€à`€ø €0€?À`€ð €0€€?`€€0€€`À€`À€`€ €€€`€€€`€ €0€`€ €0€`€€0 €`€€0 àÀ€0 `À€0€ @àÀ€0€0 @`À €0€1@ `€`À€0€0p@€`À€0€0@€`À€0€0 €`€€00`À€0x`À€0`Àüþ0€ €`Àüÿ0€þ €`€ø?0þ€à€ €0ƒà<€à€ >0‡€‚8€à€€ü0Â<l€`€Àð0Ž8€€fL€`€ðÀ0 ü€€À €@€p€0 ü € €@€ 80ø€@€ ~0ùø`€ À€ø0ùü`€ÿÿÿÿÿÿÿþÏýˆ/ðð`€8 ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýüÁ`€ 8N ~ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà0üaà€ 0ðÿÿÿÿÿÿÿÿÿÿÿÿÿÿà0€xaà€00`0ð;€`€0À`0þ¿ÏûßßÍ—:Oûê?€`€ 0?À`0ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€à€ 0?À`0ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€À€ 0À`0ø€`€ 0À`0ð?€@À 0À€ðà0À{€@À 0þà@pø`!À€ 0âàîðÃü` À€ 0ÇÁðÿðãü`0`À 0ÿçðÎp÷<`0ÀÀ 0çð÷ø@0€ÀÀ 0Àcø`0€à€ 0à@0à€À 0@0À€À 0`0€€ÀÀ 0`0€€ÀÀ 0`0€€@€ `0€€@€ `0€€À€€ 0à0€À€0à0€À€ 0à0À€ 0À0€€À€ 0à0€€ÀÀ 0`0€àÀ 0`0@À 0@à0àÀ 0ÀÀ0ÀÀ 0€ÀÀ0€€@€ 0ƒ€Àà0D€@€8 p€‡ €Àà0Ä€@€8 pÀ‡ €€à0€?ðÄü€à€8pà€ €À0€?øDüà€8?çÿÿïÿðp`?€ à€ÀÀ0€D`€?ÿÿÿÿÿð` û€0€ÇÀðƒãŸÿÀÀ0€F`€?ÿÿÿÿÿø``ñ„?ßïàŸñÇã?ÿÀÀ0€€à€>€ðà`áŒ?ßïà?ŸðÏç?÷?àxÀ0Á€À€ðñàጟœpÀ0ÿ¿wÿÿÿÿÿÿÿÿÿÿÿ€À€83†@€>€À0ðÿû€à€83ƒ€À0àû€à€83ƒ€ÀÀ0Àó€À€81À€ðÀ0€á€À€80À€pÀ0À€À€80à`À0àÀ€80ÿàÀ ðÀ€80ÿÆÀ0àÀ€80üßþÀ0À€80?üp㟠À 8€À€80?þpã À08€À€80?ÎqãÀ08€À€80;ÎcÃ?À08€À€80sŽoÃ?†À00àÀ€80aŒÀÀ 8ßà€À€80>À Ïà€À€80À0ÏÀð€À€80À0‡‡ðÀ€80À €ðÀ€80À ‡à€@€80À0€€`€00À0€à€00À €à€00À0à€80`?€À0à€80ð€À À€80ðþÀ € À€80àà€À`€ À€808À€À À€80p€??€À @€80` c€À`ÀÀ80`8ã€NÀ ÀÀ8pžáøÀ À€80?Žü<>À`€À€80 ø|?À`€À€0 ~?€À`€À€0?ÿØ!€ |À0€À€0?ÿÿÿÿðÿÿ÷ïÿà‡ÿý#ýóàÀ À€0ÿÿÿÿø?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ À€0ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ €À€0‘ÿÿö €À€0 À`€€À€0 À`€À€0 €`€À€0 €`€€À€0 À €À€0 À €À€0 À0€À€0 €`À€0 € €À€0 € €€À€p8€ €€À€p8€ À€08€`À€08€`À08€0À€08€p€À€08 € €À€08€0€à€p8 € €À€08 €`€À08À`€À€08 €`€À€08 €` À00€` À€00€`À€0€`À€0 €`€À€0 €` À€00À` À€08À` À08À` À08À`À€08 À`À€08 À`€À€08À`€À€pÀ`À€0À`À08À`À08À`€À€p8À`€Àp8 €`€À€p0À`€À€p0€` À€p0€`€ Àp0€€`Àp8Àà`À08€à`À08 €ð`À€p8 À28ø`À€p8 Àÿÿÿÿÿÿÿÿþ°ð€¸`À€p8 Àÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿœ` Àp8 ÀÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŽ`Àp0 ÀÀù÷ÿÿÿÿÿÿÿÿ` Àp0 ÀÀ` Àp0ÀÀð Àp8ÀÀàÀp0ÀÀàÀp0ÀÀà Àp0ÀÀÿÿó®à0à Àp0ÀÀÿÿÿÿÿÿÿÿÿÿŽDàÀp0ÀÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþà À`0ÀÀ8/ÿÿÿÿÿÿÿÿÿþ|` À€p0ÀÀ8ð` À€p8€À8à` À€p8ÀÀ8à`À`0ÀÀ8€`À`0€À0` À`0€À8 ` À`0ÀÀ8` À`0€À8` À`0|ÀÀ0` À`0øüÀ0@` À`0àüÀ8€ì` À`8€|€80È` À`0ÀüÀ0pxH€` Àp0ððÀ0`H` À€`0xÀÀ0ˆÀ0H` À`0?À0@`ŒÀH` À`0üÀ0€@p À`8wÀ@>óøpÿÿÿÿàÀø€0@Àh À`ÿÿÿÿÿÿÿÿÿÿüpÿÿÿÿÿÿÿÿÿÿÿcû à ÀÀ`ÿÿÿÿÿÿÿÿÿÿüpÿßÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿ÿÿL€d À` 0¢ÿÿÿÿÿÿÿÿÿÿÿÿÿ€d À` 0ûÿÿÿÿÿÿÿ€€` À` 0€à`€ À`| 0Àà`€ À` þ 0€Àü€À`€À` þ 0ƒÀàþ€ü` €` Øx‡À?àü€ð` À` €xùÏ€8‡€‚Àp@ À` àÿÿÿÿÿÿìvßøßp㎀€€€ ø` À` ðÿÿÿÿÿÿÿÿÿÿøÿž`8÷ŽaðÀ@€€?ü`Àà øßÿÿÿÿÿÿÿÿÿøùþÀ÷ óð€@a€@€ø`€Àà 8øøðüÀ<@ ûð€à†0p€€†ø`€ À€` øàxð<ñøx€a† 8€€ÿø` À€` ø˜`0þ8ñøðÀ€ €þø` À` ø@~0áñàà€ €@|øà Àà ø 80óÀ?à†€ð`€à 8póà<à` Àà 0`ñðqà¾à Àà 0`Àüà Àà 0€ÿÿÿÿÿÿÿûÀà Àà 0€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿà À` 0?€ÿ€€øÿÿÿÿÿÿÿÿÿà Àà cøs€Ã€üIdÿÿà Àà g@øc€Ã‡€ž`à Àà ÿÿÿÿÿÿÿÿ÷ÿÿøg<|ÁÇÀø` Àà ÿÿÿÿÿÿÿÿÿÿÿøþÁǃ€pÀ` Àà þóÇÿÿÿ?ø~xÿþ€ 8@@ À€à Ž ø|ø  @` Àà  8^>ø q0f` Àà Æ><<8€ !@ Àà à þxüpÀÀ ÀàÃþxøð€ à À€à x9áü€ ÀÀ À€à 8 ùü€à À` 8øø€` À`  8ø@ À€à  €@ Àà c€ €€€@  Àà cœ€À@ À` Cœ8€€à À` Çœ8O€€€0à €`  Æ??œ¸À€Ààƒ À` {ùÆ€?ø}Àÿÿÿÿÿÿÿÿþð‡àÀ Cd à àÀ` 1ÿù†ÿÀÿÿî}àjø`ÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿýà üÀà ?ÿûÿÀÿÿÿÿÿÿÿÿÿÿøaÀÀŸøÿþÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿøã ÿðÀÀ ?óÁÀÿ¿ÿÿÿÿÿÿÿÿøãÀ ø€ ïÀûða´ÿý‹ÿÿðc øÀüà >À?øï€|ø €@2 øÀþà ~ Àøÿüÿøp ÿ€€@? Àž€à gƒ€~¸üø;Àp ÿ€€à À€à ãçÇ€<8øð3àð áÀ€À À‡€à aç ÿ üxðsàð ÁÀ€@ ÀÇ€À Âþ ÿ 9ðcð7ð €€@ Àǃ€À < ÏŒàcð3ž` €ÿÿÿÿÿÿÿÿçx&À^€ ÀCÀÀ ƒøcà1ü` €ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿø? Àÿ€à øAÀ1ø`ÇÑÿ÷÷ÿÿÿÿÿÿÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿø÷ Àÿ€À 8ppð`þ€?ŸýcþàPþ3þƒŸÀþÿùã À€à 8```þ€@à Àà ?œ8``ü€@à Àà œ8?€``€@ €À qܸ€àà€` ÀÀ ßÿÿÿ÷ðøa€àà€ à ÀÀßÿÿÿÿÿÿÿÿÿÿøsÀˆÀ@€þxà ÀÀ ßÿÿÿÿÿÿÿÿÿÿøÿ‡€ÝÀÀ€þüÀ €Àœøÿ€ÿÀ€àüÀ €À ¸ÿÀÿÀ€€àÀ €À 8ÿßÿ€€€À ÀÀ ?œ9LJÿƒŸ€€qÇàÀ ÀÀ ˜9ÃÇÿ€àqÇðÀ ÀÀ 8€‡Ä€÷àqÇùðÀ €à 8À€ÿàùðÀ €À 8€€÷àùàà €À €àáðà €À0€Àðà Ÿø€À8€@ðÀ Ÿø€‚À ˜¸€àà ü€þÀ ?œøç€À ¼€þÀ øï<€À Ÿ¼€þÀ ÿÿÿÿÿÿãóûÿøþ~€À ü€ïÀ ÿÿÿÿÿÿÿÿÿÿùü|€À ø€ïÀ ÿÿÿÿÿùà<|€À €~À ùð8|ø€À €>À ;øüø€À €€À ;¼ø€Àÿ€€€øÀ?þø€Àÿü€ÿðÀÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿýÿßÿÿð†ñA8€à ü€€ÿÀÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€à8€€ÿÀÿÿÿÿÿÿÿøÿýÿÿÿÿÿ÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€À€€Àã¿ð@ÿÀ€€ÀÀ€€À0€<À€€À€8À€€€€ÀA<@ €‚ 0~x Àà€€àÀA&@ €>@ Àü€øÀá@b€ €> `À€>€0AÀ@B € $‚@ 8 ˆÀ€€€0AÀ@ 6€@ 8 @Àÿà€ÀÀ0AÀ`3 @ Àáà€àÀ A0`,'pà  Àð€ððÀ A`ð#€8 À`€ÀpÀ A@€À`€8 À Àà`€8À€Àà 8 ÀÀÀ 8 ÀÀÁî€÷€ ÀÀÃþ€ÿ€€Àƒþ€ÿ €À~€† €€~‚€€n€?À€à>€€Àð>€€À|€À€€>€à€€€ø €À€€>€ÀÀ€€ÀðÀ€À|à€€|x€€ü~€€ ðþ€€ ?þ€€ <ÿà€€ pø€€ @€ €€ €€ € € €€ € € € 0€ 08€ 0€ 08€ 08€ 08€ 08 0 8 à 08 à 0 8€ ?à 0 8€ | 08 p€ 0 8ð‡€ 0 8àÇÀ 0 0ÀÃÀ 0 8ÀÀ 0 8Á À 0 x€ÿÿÿÀÿ‡Ã 0 pÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿñ•‡  põÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€‡  pÀ@ÿùÿÿÿÿÿÿÿÿ€ƒ  0À? 0 pÀ  pÀ  pÀ pÀ` pÀ0 p€ p€` p €` p € p €` p ¼` ð üð?€` ð øÿü8€` p ÿÿÿààÿü8ð` à ÿÿÿÿÿÿÿý€À?À¼9à`àÿÏÿÿÿÿÿÿÿÿÿÿÿÿþÀþ9À`à‹ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷Øø0;€`àÿÿÿÿÿÿÿÿÿÿÿÿÿþÀ~>9Î|` ð?øoÿÿÿÿþ€ÿÿÿÿÿÿþ1þx`ð÷ ÿÿÿÿÿÿÿþ1þ|`à€à<|À=ÿÿþ0x|`8à€àþðÀ0|`8à€àüÿÿÿðÀ0<@8ààþÿÿÿÀÀ0À8ààþÿÿÿ€0 À8à8 ÀÀ†à€€0>Àààþÿ€€GàŽðÀÀ0~Àààÿÿ€?|ïà 8àÀ0þÀàð>ƒÁ€?üäàüxÿÿÿÿÿÀ>1ÀÀ8àð~ƒ€w?øÁÀü|ÿÿÿÿÿÿÿþ3€À8Àøîƒƒ€a¿ùáÀøà`3ŽpÀ8€ŸŽ‡þøÀ oÿøsþ øÀ8€Œ‡üð€ÿð sþ øÀ80€† ü pø üÀ80€0€ ÿ p üÀ80€8 þ pxÀ800üpÀ800 pÀ000 pÀ000 `À000 ÿÀ `8À000 ÿÿà `x8À000  ÿÿà`ü8À000  àÀaüÀ000  ?€cÌÀ000` øÿ÷ÿþ|g€8À000` ðÿÿÿÿÿÿÿþgp8À0ppà xàÿÿÿÿÿÿÿüfø8À0ppà~``Ïø ßÿünyð8À0pp?æ~þ!ñÏþxgðùà8À0p`1ÿþü03÷Ïÿÿügøxp0€pp`1ßüqÏü7ÿÿÿüãð000Àpp`?ŸøqÏüÿÿüà€008À```?œø†ÜÀ<`3ð0À```œñŒ ààà0Àpp`?"|ñœ ð€àÀpÀ`pàÿÿÿÿÿÿþ|áø`àÀ0€```ÿÿÿÿÿÿÿÿÿÿÿÿòøøÿÿÿúøà0€``@?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûö|ÿÿÿÿÿÿÿøáàp€``Àÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø?¯ÿÿÿÿÿÿøÇàp€```øÿÿÿÿÿÿÿÿÿÿÿðÀtÿøÇðp€```>|ÿÿÿÿÀøøÆ À`€à` `| ÿþÌð`€à` `ð€ ÿÌgð`€À` `àÀ þÜçÀp€@` à€à0 ØçÀp€`` `àp ÜàÃÀp€@à à|pp ÏàÀ``€@` àÿÀ8` ÏáÄà`€@` Àÿàø` LJà`À@à ÀÀø0 À‡À`ÀÀàÀÀÀp 0ÀÀ`€ÀàÀÀ 0Àà€€ÀÀÀ 0€à€€À ÀÀ` 0€à€€À ÀÀ` 0ÀÀ€€À €À` 0Àà€€À€€` 0€à€€ÀÀ€`0€à€€À€€`0€€à€À€€8` €Àà€À€€8` €€àà€€À€€8`ûÿÿp0€€ðà€€À€€0`ÿÿÿÿÿÿÿÿÿÿÿÿÿ €€qà€€À€€8`ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÃ?ÿÿÿÿÿÿðü1À€€À€€`ÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿü9À€À8€€8`!ÿÿàÿÿÿÿÿÿý~ÿÿÿÿøÀ€À8€€8à €À€À8€€0à €À€À0€à €À€€€à €À€€``€€€€€0ÿÿÿÿà``€€0€0?ÿÿÿÿÿÿÿÿÿÏÿà`€€0€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿD`À€`ÿ\;€€€0€Aoÿÿÿÿÿÿÿÿÿÿþ`ÿÿÿÿÿÿÿÿÿÿÿÿøù€€0€0ÀÏÿÿþ`ÿÿÿÿÿÿÿÿÿÿÿÿùက00@€?¿Á€€00 @€€00``€€ 0``>€€`0ÿ|à`<€€p0ÿüà`0€€00†ø?àÀÀ€`0ðæpxçÀÀ€`0xÇppÏ¿€À€€` þ 8 `Ç€À€€` þ x÷À€` 8 xÀ€`}  ??€À€`ÿÿÿÿÿÿà^`€€€`ÿÿÿÿÿÿÿÿÿÿþÿÿ÷à`€€€`½÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿûö@`€`Çãÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø‡`€`@‰KŸÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿû˜ù‡`À€`€?ÿÿÿÿÿÿÿÿÿÿÿÿÿùÃ`À`ÿÿ¿ÿÿÿÿÿÿñÇoÿÿþø|€`ðæÿÿÿÿÿÿÿÿÿÜðÀ‡`nÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùÿü€ÀÇ@ >ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿ¿€ Ç` ÿÿÿÿýÿÿÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿàçàÿÿÿÿýÿ À‡÷ÿÝÿÿÿÿÿÿÿÿàwàÿÿÿÿÿÿÿÿÿÿñ0x €?à ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀ YÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀ€€@ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¾€~€ À ?ÿÿÿÿÿÿÿÿÿÿÿÿþ@þ€ À €ÿÿÿÿÿÿÿÿÿÿãîÿÏúA€ ÀóøÿÿçŽ?ÿÿÿÿÿÿÿÿøCû€~ À @?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþßCð€€î À ~à|Ïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿûÿÿÿÁÆ À |ÀÿSÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿç† À ø Àÿÿãÿÿÿÿÿÿÿÿÿÿÿÿï À ðŒ@~ À Çü~| À üx @ ð?€p àð?€à À>ð@ Àÿÿÿÿ€Ïà  Àÿÿÿÿÿÿÿÿÿÿø@ÿà xÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿw8 øÀ8#ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€  øÀ ?ÿÿÿÿÿÿÿÿÿÿÿ€  0€ÿÿ€  €€  €8@€ €8@€ €8À  €8À  €8?À<  €8ÿ?Àü  €8þç€ü  €8Î1ðç¸ã‡À  €8Ž{ðç8ã€æ  €8þÿàÿÀgö  €8þàÿÀ ÷æ €8|sà~À> ÿ €8aàÀÿ ï† €0aàÀãðçŒ €0À€ƒðÏÌ €0àÏÌ €0ÿ> €0üþ 0øÿŽü/pÿÿÿÿÿÿÿÿÿÿÿÿð>80 Áßÿÿÿÿÿÿÿÿÿÿþ0 à€ÿßÿÿþp øþ8`x<8 p 8 ` 8 8`  88`  88`  80`88` 880`à0 800`øx €800`øþpp`  800`<8þppp  0800`0Ìpø  0800à0ø  0<00à0ø  0800àp0ÁÀ 0800À `p@?á€p8008@pñøÀ`Àဠ`80 @ãøÀü0aÀx€0 p800ÀÀ8ÀÿüpáÀƒ0 00008àÿ€0Àÿüpá€?Ã` 00008àÀpÀ÷`ã€Ã` p0008ÀÀðÁÇàÀÃ` p8p08ÀÀðÆáÃ@C€` `80 8ÀÀpsŽ8áÃÿÁøx `80 8ÀÀpcƒŽ8ÇÃðÁøx `xp`0À€üãŽ8ÿóø/€p8 `ppp0àü?ãŒ0ñð `pp`0à¼á€<ð `p0`0à8pp0`0À8`p `p À88`pp`p À88`pp`p À88`pp`p À8`p``p À`p``p À`p``p À`p``p €````p €<Àà```p€8>à¸À```p€8>@¸8Àà`@p€8`aǸøÀà`@p €8~àcÇ?ð@8à8Ààà`` €8üà#ÎÿÿÿÿÿÿÿÿxÀààà`€8üŽ8À?þÿÿÿÿÿÿÿÿÿÿÿÿÿøÀààÀ`€8¸ÃŽx?Àü?€\?ÿÿÿÿÿÿøÀà`@`€8¸;ÃŽ8?€8;Àà ÿøÀà`@`€8þ{ÀqáðÀÀðÀàà@`€8þ;Àóø0€pÀààÀ`€83€óø€ Ààààà€83€>cø8€< Ààààà€83ø88€þ À`àÀà€ÿÿÿÿ·óà88€ü ÀàÀÀà€ÿÿÿÿÿÿÿÿÿÿÿþ€00€€ ÀààÀà€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿæ˜0€€ À ÿàÿ€ÀÀ8¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€0€`€ÿàÿÀÀÀ8€ÿÀî}õÿÿÿÿÿÿÿÿÿ€0€‚`€ðÿÀÀà€€@7øò0Ï`€À8ÀÿÀÿð€ó€0ß`€ÿÀÿð€ÁÀpÜ`€€~Àð8€€àpñ¾`€Àø`À8€`pñ¿à€€ðà0€0p0a¿à€øÀ8>0|0p?à€ø8øp>`€>€ð8à pà€ üÀÀ8Àp`€@ðð€0΀p@ àp0ÿÿ€`@À÷ÿÀpþâàsà~`ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÌ€0ÿþ€ð0þ~€à`ÿÿÿÿÿÿÿÿÿÿùÌ0ø€àp<€À`€|0€€p0àÿÿÿÿÿÁ<0€00àÿÿÿÿÿÿÿÿÿÿù„0€00À ô?ÿÿÿÿÿÿÿÿà€08€00À ÿÿÿÿÿÿÿÿÿÿð00€00ÀÿÿÿÿÿÿÿÿÿÿÿÿÿÀ<00€p`àÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøàø|0€p`À?ãêÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿü`€``àßÿÿÿÿÿÿÿÿÿÿãœà€``à¯ÿÿÿÿÿà€``àÿÀ€``À üÀ€``À ø €€``À ð€€à`À€ à À€ à€ Àà€€ À8<€àÀ€`À8x `À€`À8€ø€``€À€`À8Ãð€`{ÀÀ€`À8ÿÀ€€`ÁÀ€`À<8ÿ€ @ÈàÿÁÀ€àÀ8>ÄàÿÃÿÀÀ888$ÀÀÁÃÿ‡þÀÀ80 @ÀÀÇÿüÀÀ88  > ÀÇüðÀÀ88  ú ÀƒÀÀ88  ÀÀ€880  ÀÀ€880 €@ÀÀ€88 AÀÀÀ€88 `BAàÀÀ€80pÑA`ÀÀ€80`‘@ÀàÀ€8p`°@ÀàÀ€8p`° ÀÀà€À€8pü``ÀÀÀÀÀ€xðþ`@@ÀÀ€€€xðþ`DÀ€À€€8àü`pbÀ@ø À€0àà`Dðø`€€0ô?`@óÏñø`€€0ÿÿÿø`À!ƒã†çüà€€0ÿÿÿÿÿÿÿþà`!ƒÆü`€€0ÿÿÿÿÿÿÿÿÿÿÿÿÿÀ`1ƒ†À€€€8ÿÿÿÿÿÿÿÿÿÿÿø`ƒŽ8=À€0ïÿÿÿÿÿÿÿÿÿÿÿÿÄ@à?ÿÿÿ¿ñÀ?ƒƒ8 ?Àÿ€€0%ÿÿÿÿÿÿÿÿÿÿÿþ@ÿÿÿÿÿÿÿÿÿÿŸ‡8†?€?þ€€0àÿÿÿÿÿÿÿÿÿ@?ÿÿÿÿÿÿÿÿÿÿŸÂ0‡ü8ᆀ€pðÀ?ÿÿà>ÿÀ‡øü8ᎀpðÀà<óð?‡|8áþÿ€€0ðÀÀ8<ã€~þó€€p ð€À8~ƒ>x pp€àÀþ ÿ÷Ào€pþ3ÃŽ<ƒàðÀðÀ<ÿÿÿÿÿø ?pþ{ÃŽ<ïàðÀÀ€ÿÿÿÿÿÿÿÿÿü<püs€?ÿààÀ0 ›ÿÿÿÿÿÿÿÿÿÿ¿ÿp3€?ïààÀ | ?ßÿÿÿÿÿÿÿÿÿþðp 7àÀÿÿÿÿðÀ üHÿÿÿÿÿÿÿÿù€p7À?€ÿÿÿÿÿÿÀ ü@ÿÿÿÿÿÿÿü` #?ÿÿÿÿÿÿÀ øüÀÿÿÿÿü` 3€ÀcÀ ?øxÀ<`3€à 9ðp~Àà !€üøðÀà x 0øÀÀà 8 8øÀà øÀà 8 Àà`@ 8À àð€ð 8À ààÀø 8À ààà8 8À à>àà 8 0Àà?ðàp 8Àà7|`àð 0Ààsø`?ð?àœ0Ààcð`?ð?Àœ0ÀÀaàpóð€#Ü pÀÀá€qàpÀ'ç 8pÀÀà1À09à?ï øp€ÀÀ1p8ð>þð0€À80p<|ÿÿÿþ÷ÿ<p€ À88xÿÿÿÿÿÿÿÿÿÿÿÿà|p€ À00ÿÿÿÿÿÿÿÿÿÿü0€ Àÿÿÿ€0 ÿÿÿÿþp€ Àÿÿÿÿÿÿÿÿÿý`ü`€Àãÿßÿÿÿÿÿÿÿÿÿÿ¿œ€x`€ÀŸÿÿÿÿÿÿÿÿÿÿÿÿÿÀ;Àx`€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿð€0`€€9àÿÿÿÿÿÿÿÿð~à€€|‡€ÿà€Àð`€À`€€à€88à€ÿøà8€€þÿø8à8ÀàÀüð8à8À0øðÀð8àÀqøøq€0p0ààà€€``8à88ÀÀ`8à88ÀÀ8à88€€À€0à8<€€à€8À8ÀÀà€0À0À>Ãà€0À0À|Á†à0À0<ÀøÁŒà8À0àð€üà0àp`à;€x 8ðþ0À0`À?Àx ?øü0à0pÀ?àp ðüpÿ€pp€Àààÿàp8Àà?ðpÀÀðp€ Àp€`À`€ü€p€À€pàÿÿÿÿÿ à8 àðÿÿÿÿÿÿÿÿøðx àø?ÿÿñÿÿÿÿÿÿÿÿxð à|ÿÿÿÿÿÿÿÿ€8à `>?·ÿÿÿÿÿÿÿ€ÀpÿÿÿÿÿÿÿÿýÀ`€ÿÿÿÿÿÿÿÿÿü‡€`ð ÿÿÿÿÿÿÿÿÿÂß`ÿÅÿÿÿÿÿÿÿÿÿÿàþ`?ÿÿÿøßÿÿÿÿÿÿÿÿÿà€üàÿÿÿÿÿÿû€ÿÿÿÿÿÿÿÿÿàà'ÿÿÿÿÿÿÿÒ‰ÿÿÿÿÿÿÿÿàÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðà?ÿÿÿÿÿÿßþÿÿÿÿÿÿÿÿÿÇÀàÉþÿÿÿÿÿÿÿÿÀ,ÜÿÿÿÿÿÿÿÿÿàÀ¼_ÿÿÿÿÿÿÿý?ÿÿÿÿÿÿÿÿÿÿˆÀ?ÿÿÿÿÿÿÿüZ`ÿÿÿÿÿÿÿÿÿÿÿÿ€Àÿÿÿÿÿÿÿÿþà ÿÿÿÿÿÿÿÿÿÿÿÿÌ@ÀþÈÿÿÿÿÿÿÿÿÿþ€ÿÿÿÿÿÿÿÿÿÿÿÿÿßýÀÿÿÿÿp"ÿÿÿÿÿÿÿÿÿ@ÿÿÿÿÿÿÿÿÿÿÿå8ÀÿÿÿÿÿÿÿÿÿÿçB;ÿÿÿÿÿÿÿø¿ÿÿÿÿÿÿÿÿÿÿÿÿüÀ\ÿçÿÿÿÿÿÿÿÿÿÿ÷ÿÿÿÿÿÿÿú÷ÿÿÿÿÿÿÿøÀ{ÿÏÿÿÿÿÿÿÿÿÿÿÿþÀ~IÿÿÿÿÿÿýÿüŸÿÿðÀ<°yÿÿÿÿÿÿÿÿÿÿÿøaïÿÿÿÿÿÿÿÿÀÀP/ƒøÿÿÿÿÿÿÿÿûÿÆ€ÿÿÿÿÿÿÿÿÿÿøÀ 8ÿÿÿÿÿÿÿÿÿÿÿâqÿÿÿÿÿÿÿÿü€À@¯ùÿÿÿÿÿÿÿÿÿÿÿÿø€ÿÿÿÿÿÿÿÿü@Àüÿÿÿÿÿÿÿÿÿÿÿÿýþ?ÿÿÿÿÿÿÿÿÿÿÿÔÀ@óÿÿÿÿÿÿÿÿÿÿîg¿ÿÿÿÿÿÿÿÿÿÿÿÿøÀ>?ÿÿÿÿÿÿÿÿÿÿý‚€ÿÿÿÿÿÿÿÿÿÿÿà€ÿÿÿÿÿÿÿÿÿ¾¿‡ÿÿÿÿÿÿÿÿÿÿÿð€€ÿÿ¿ÿÿÿÿÿÿ¼ ¿ÿÿÿÿÿÿÿÿÿÿó€ßÿïÿÿÿÿ€ÿÿÿÿÿÿÀ¸ÿýý‘»÷(ÿÿ€÷>S÷õàvƒÀ iaxmodem-1.2.0/lib/spandsp/test-data/itu/fax/itu2.pbm0000644000175000017500000175231511150047204021731 0ustar julienjulienP4 1728 2376 Ààðøüøüøü€øàøð?€ø?øüþþÿþÿüÀÿ€ü?ðÀøÿüÀøÿþ?àðÿþððÿþðàÿþøàü~ø?Àðü?€ðü€øþüþþÿÿþÿÀÿüÿàÿüÿðüøø?ü?øü?ð‡üàçüàÿüàÿüÀÿøÀÿøÿðÿÀ>`?ø?þÀÿ?ÿÿÿÿÿÿÿÿÿÿÿÿÿ€?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿ€ÿþOøÿŸðÿÿçøÿüÿüÿøÿðð?àààððððððððøøøøøøðøøøøøøøøøðøðøððàÿàÿ€ÿ€þüøÿàÿÀÿ€þüø?ü?ÿ?ÿø?ÿÿ€ÿÿàÿÿüÿÿÿÿÿàÿÿðÿÿüÿü?þþÿþÿü?ÿüÿÿàpÿÿ€þÿø?ÿ€ÿð€ÿÿÀÿÿÀÀÿÿàÿþàÿÿðÿøàÿÿøÿààÿÿüÿ€àøø?þððüøààüüðàþ?àÿÿÀà€üÿüÿüð€þÿÿÿÿÀàüÿÿ€?ÿÿøðü?ÿÿÀÿÿÿðà?øÿÿàÿÿÿüà?øÿÿðÿÿþàÿðÀÿðÿÿÿðÿàøÿÿðÿ€þøÿÿðÿþüÿþðþþüÿþðü~üÿøðø~üÿàðàüÿÿ€ðÿÀüÿþðÿ€€ü?ÿøøÿ?Àüÿÿðøþ?Àüÿÿøÿ€x€?àüÿþøÿÀüÿÿÿðÿÿÿàøÿóþÿÿÿøÿÿàÿ€üÿÿÿÿÿÿøÿÿð?þüÿÿÿÿÿÿøÿÿø?þüÿÿþÿÿÿøÿÿøÿ€üÿÿüÿÿÿøÿÿøÿàüÿÿðÿÿðÿÿøÿüüàÀ˜ÿÿðÿÿü€?€ÿçàÿÿàøÿøpÿÿ€ÿÿðÿüÿüÿÿÿÿÿÿþÿüÿðÿàÿÿÿþÿøÿð?ÿÿÿÿøÿðÿÀÿ€ÿàÿøÿþÿÿ€?ÿüÿþÿÿÿÿ€ÿ€ÿ€ÿ€€€€€€€€€€€€€€€€€ÿÿÿÿÿÿþÿþþþÿþÿþþÿÿ€þÿàÿøÿðÿüþÿÿøÿüûÿôÿÿÿÿÿÿø<ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ†þ@ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿƒÿÿÿÿßÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿoÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€p ü€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿøö<ï‹ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€Àÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿìÿÿÿÿÿÿÿ€?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðp€ÿÿÿÿÿÿ߀ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿüö€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿð€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüø|ÿàÿà€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ?ÿÀÿ€€ÿÿÿÿÿúŸÿÿÿÿÿßÀÿ€~€ÿÿÿàÿ€üþ€üþ€üþ€üþ€ü~€øþ€ø€øþ€ø€ð€ø€ð€üø€€ÿð€?ÿð€€ÿ€€ð€€ÿÿÀ?€ð€ÀÿÿàÀð€€ÿÿà€ð?€ÀÿŸð€ð?€?€üð@ð?€€üððð?€?Àððøð?Àÿðøüð?ÀÿðÀðüð?ÀÿþÀøü€ð?ÀÿÿÀÀðøÀàð?Àÿÿàà?ðxÀøð?Àÿÿøãÿà0?àøðÀÿÿøãÿÀ|?àüðÀÿÿþçÿ€Àþàüø?Àÿÿçÿðþÿàüø?Àÿ€óøøÿÿþÿÀøø?ÀÿÀàp8àýÀÿÿþÿÀøø?Àÿàð|ðàÿðÿÿþÿÀ?ðø?À?ðð?þüßø?ÿøÿÿþÿÀðø?Àøð?€þþÿÿü?ÿøÿÿþÿÀÿðø?Àüð?€ÿÿÿÿÿ?ÿøÿÿþÿÁÿðü?Àüð?€ÿÿÿÿÿÿøÿüþÿÃÿøü?Àþð?àÿÿÿÿÿ€ÿÿü?ÿðþÿÇÿüü?ÀÿðøÿÿÿÿÿÿÿüþþÿŸÿüü?ÀÿðþþÿÿÿÿÿÇüÿþÿÿ?ÿþü?Àÿ€ðÿþÿÿþÃÿÇýÿþÿÿùþü?À€ðÿþÿÿü?Çÿÿÿþÿÿüþþ?À€ðÿÿþÿ÷ü?ÏÿŸÿÿüÿÿþþü?Àÿ€?€ðÿÿþÿ÷ø?ßÿ¿ÿÿüÿÿÿ¿þþ?Àÿÿø?Àðÿÿþÿ÷øÿÿÿÿûüÿÿÿ?ÿþ?Àÿÿþ?Àðÿÿþ?ÿïðÿÿÿÿóüÿÿþ?þþ?ÀÿÿÿÀàøÿÿÿÿçðÿÿÿÿãü?ÿÿøþþ?Àÿÿÿðàð÷ÿÿÿ¿ïðÿ¿ÿÿÃøÿÿðüþ?Àÿÿÿþàøñÿÿÿ¿çðÿ¿ÿÿøÿÿàüþ?€ÿÿÿÿŸÀøðþþ?Çàÿþ~ðÿÿÀðþ?Àÿÿÿÿÿàøð8?þÁÀþü@ü?þ?€øÿÿÿÀøà?ü€üðÿ?Ààÿÿàøðøøàþ?ÀàÿÿÀðàð€?ÀðÿÀøðàÿ?ÀøÿÀðàÀüÿàøàÿ?Àÿ€ÿð€ÀÀÿðÿø?ÀÿÿðÿÿøÀÿÿÿÿþÀ?À?ÿÿÿÿþàÀÿÿÿãÿø?Àÿÿÿÿø?Àÿÿþÿü?À?ÿøÿ€ü?Àÿà€þ?ÀþÀ€þ?À€ðþ?À€øþ?Àüþ?Àøüþð?Àÿÿøþø?ÀÿÿÀÿøüü?Àÿÿøÿøüþ?Àÿÿþÿøþþ?ÀÿÿÿÿÃþøü?ÿÀÿÿÿÿÿþøü?€ÿ?Àÿÿÿÿÿüðü?€?ÿ?Àÿÿ?ÿÿøð€ü€?ÿ?ÀÿÀÿÿðð‡àü€?ÿÿ?ÀÿÿðàÇøàø€ÿÿ?Àøÿð?à?Ïüðøÿ€ÿþ?Àðÿð?à?ßþø>øÿ€ÿÿàüÿøà?ßÿø?ðÿ€ÿþþàþÿüàÿÿüðÿ€ÿþþøÿ€ÿÿüÀÿàÿÿÿƒü€ðÿÀÿüþüÿÿÿÿóþðÿàÿÿÿƒü€ðÿàÿøÿÿÿÿÿÿÁþùáÿàÿÿ¿Ãüÿ€?àÿÿÿðþÿ€ÿÿÿÿþÿÿÿàÿÿ?Ãøÿ€à?ÿÿÿàÿÿø?ÿÿþþ?ÿÿÿüÿÿÿ?ÃüÿÀðÿÿÿÀþÿÿÿÿøþ?ÿÿÿþÿÿþ?ƒýÿÀÿðÿÏÿÿ€ÿ?ÿøÿÿÀÿÿÿÿÿ€ÿÿþ?ÿÿÃÿóÿÿÿÿþÿüÿÿÿÿÏÿÿÿ€ÿÿþ?ƒÿÿÇÿÿÿÿÿÿ ÿÿþÿÿÿÿàÿÿþ?ÿÿïÿÿÿÿÿÿøþÿþÿÿÿÿÿàÿßüÿÿÿÿÿÿÿïÿøþþÿþÿ¿ßðÿŸüÿÿÿÿÿÿüÿàüþþþþÆ?ŸðþýþÿÿÿñÿñÿÀÿøþþÿþÀ?ÇøÿüÿïÿðÿàÀ?ÿðþþþü€?ƒøÿøÿ‡ÿÀÿÀ€ÿàþÿüþþÀ?Áüÿðƒÿ€>ÿÀþÿðüþ?€?üÿÀ>ÿÿþÿà?øþÿ?€?€üÿ€þÿþ?ÿ€ÿÿüÿÿ?üþ0øþ?ÿÿÿðüÿ€?Àüðþ€ÿüÿÿÿø?ÿ?€üðþÿüÿÿÿÿøÿ?€þðüÿðÿÿÿÿðü?€þàüÿÀÿÿÿÿðü?€þàüÿÿ?ÿÿÿÿàø?üàüÿþ?ðÿÿà`?üàüÿø?€ÿà?ƒøàþÿð?€ÿà?ƒøàü?ÿ€?€ÿð?‡øÀüÿ?€ÿÿø?ÏøÀüÿþ?ÿÿÿÿø?ÿðÀüÿüÿÿÿ÷üÿàÀüÿüÿÿÿÃüÿÀÀüÿÿ€ÿÿþüÿ€ÀüÿÿþÿÿøüÿÀüÿÿÿÀÿÿÀüþÀþÿÿÿøøüèþ?ÿÿþüþÿÿÿÀüþÿÿÿðþÀþ>ÿÿüþàÿûÿü@ÿþüÀàGÿÿÿÿþø>ÿ€ÿÿüàðÿÿÿÿÿÿÿþøÿÀÿàÿÿüàðÿÿÿÿÿÿÿÿ€üÿÀÿàÿøÿÿøàðÿÿÿÿÿÿÿÿÀüÿðÿàÿüÿÿøàà€ÿÿÿÿÿÿÿÿàüÿøÿðÿþ?ÿÿðààÀÿÿÿÿÿÿÿÿÀüÿü?ÿøÿþÿÿþ?ðàààÿÿÿÿÏàüÿþ÷üÿÿ€ÿÿ€ÿàààà?ÿÿè€àüÿÿÿÃüÿÿÀÿþ?ÿÀàààÿðø?ÿàþýÿ€ÿþãÿà?ÿðÿÿÿ€ÿÿœÀ0Ààÿøÿü?àþðÀÿÿ?€àÿ€ÿÿÿÿÿÿàÀüÀÀ?à?ÿþÿÿ÷ÿà€à~?ð?Àÿ€€ðÿþÿÿÿÿÿÿðÀðÿðxàÀÿÿÿÿÿÿÿààþÀ?àþ€?ðÿðÿÿÿüÿÿÿà?Ü?ùÿÿÿðüðÿ€ÿÿÿ€ÿÿÀÿÿð€ðÿÀðþ?À€ðÿàÿÿÿðÿÿÿ€?ßÿÿÿÿÿÿøþøÀÿ€ÿÿÿ€ÿÿàÿÿð€ðàþ€ðü?À?ðÿ€ÿÿÿÿÿþÿÿÿÿÿÿÿýþ‡üàÿÿÿÿÀÿÿÿðÿÿð€}ÿÿÿÿÿðÿ€øüÀ€øÿþÿÿðÿÿÿ€ÿÿÿÿÿÿÿýÿÏü÷?ÿÿáÿÀÿððÿÿà€ÿÿÿÿÿÿðþÿøüÀ?øÿðÿôïÒ€ÀÿÿÿÿÿÿÿÿÿÿÿßüÿÿþÿàÿÀøÿÿÀÇÿÿÿÿÿÿÿðÿøüà€øÿàøàààÀÿÿÿÿþÿÿÿÿÿÿÿüÿÿþüàÿøÿÿÿÿÿÿÿÿÿðþøøà?ðÿ€ðàÿðÿþ?ãÿÿÿÿùÿ¿ùÿÿÿÿü?ÿÿþøàüøàÿÿÿÿÿÿÿÿðÿüüà€øÿìøàÿÿÿ€óÿßÿÿøÿŸðÿÿÿÿü?ÿÿÿðÀøøàÿÿÿÿÿÿÿÿðþøøà?€øÿÿÿøàÿÿÿÿ€?<?÷ÿßà?Áþ?ÁÿÿÿÿøÿÿÿþàÀðüàÿÿÿÿÿÿÿÿðþüüà€øÿÿÿüüàÿÿÿÿÀ?À?ÿÿßð?Àüàÿÿÿÿüÿÿÿàÿ€àüàÿÿÿÿøü?Àþüøà?€ðÿÿÿÿðüàÿÿÿÿÀÁÿÿÿÏð?ø?Àÿÿïÿùÿÿøàÿ€Àüðÿÿz6þüüàÿÀøÿÿÿÿüüàÿÿÿÿàáÿ€ÿÿÇðÁüÀÿÿïÿûÿÿÀ€ÀþüàÿÀüüü?àÿÀ?ðÿÿÿÿÿ€üàÿÿÿÿÀÿçÿ€ÿÿÿÇðÃøÀÿ¿ïÿ÷ÿÿ€€?þüð€ðþüþ?áÿÿà?ðÿÿÿÿÀþðûÿÿÿàÿ÷ÿÁÿüßãøÃøÀÿŸçÿÿÿÿ?ÀÿüüÿÿÀ€ÿ€øÿ¿ÿÃÿÿàüxÿÿàþàûÿÿÿãÿÿÿÇÿüÃøãø?ÀÿÏÿÿÿþ?Àÿøüÿÿà?€à?øÿÿÿÃÿÿðÿÿÿÿðþðùÿ?ÿãÿÿÿçÿüãø÷ð?ÀÇÿÿÿþÀÿðüpÿÿà?€ðÿðÿÿÃÿÿðÿÿÀÿðþðñþ?ßçÿÿÿÿÿüÃøÿð?€‡ÿÿçþ?Àÿðü€xÿÿÀ?€ùÿðÿÿƒÿÿñÿÿÀÿðÿøñþ?ß÷ÿÿÿÿÿþãøÿð€>ÿÿçþÿàÿüüÀüÿÿ€?€?ÿÿà?ÿÿÿÿáÿÿàÿÿðÿøñþ?ÿÿóÿÏÿÿþÃøÿð€ÿÿ‡üÿàÿþøÀþÿÿ?€ÿÿÀÿþÿÿáÿÿàÿÿðø?ñþ?ÿÿóÿÿÿþãøÿðÿÿ‡üÿàÿÿðÀþÿø?€ÿÿÀÿÿÿà?ÿÿðüÿáþ?ÿÿãÿÿþãøÿÀþüÿàÿÀÿð?ÀþÿÀ€ÿÿ€þÿÿàÿü€ÿÿÁþ?ÿÿÁÿÿ€@ãø€øøÿàÿàÿÀ?ÀþüÀ€?¿Àÿÿà€ÿÿü?ÿÿþþÃð?ø?Àÿðÿ€?àþøÿð€€ÿÿ€ÿÿüÿÿþþÃðð€ðÿ€?àþðÿÿÿð€?ÿü?€ÿþüÿÿüøÇðÀø?ÿáþð`ÿÿÿÿÿðÿÿð?€þüýþü`Çðøÿðãþðÿÿÿÿÿÿÿøÿÿ€?€øàüüpÇàøÿàÿãþðÿÿÿÿÿÿÿÿøÿþÀ?ðøxÇàøÿÀÿçþðÿÿÿÿÿÿÿÿø?ÿð€ÀàÏàøÿÿïþøÿÿÿÿÿÿÿÿøÿÿÀÀÏàøþÿÿþðÿÿÿÿÿÿÿÿøÿÿÀÿàøþÿÿþðÿÿÿÿÿÿÿÿøÿüÀÿÀø?ÿÿðÿÿþðÿÿÿÿÿÿÿÿøÿøÀÿÀø?ÿÿøÿÿÿðÿÿÿÿÿÿÿÿøÿþàÿÀø?ÿÿüÿÿÿ€ðÿÿÿÿÿÿÿÿøÿÿààÿ€<ð?ÿÿüÿÿÿððÿÿÿÿÿÿÿÿøÿÿðàÿ€??ð?ÿÿüûþøðÿÿÿÿÿÿÿÿøÿÿàÿÿàÿÿøûüøàÿÿÿÿÿÿÿÿðÿÿààþ?áÿà?ÿÿððø?ø€ÿÿÿÿÿÿÿÿðÿÿøàþ?ÿÿÀ?ÿàð`?ðÿÿÿÿÿÿÿÿðÿÿüàüÿÿ ðàÿÿÿÿÿÿÿÿàÿÿÀððÿþà€ÿÿÿÿÿÿÿÿàÿÿàðàÿþàÿÿÿÿÿÿÿÿ€?ÿøð€€ÿøàÿÿÿÿÿÿÿÿ€ÿþð€€ÿðàÿÿÿÿÿÿÿÿ€ÿÿ€ðð€À?À?ÀÿÿÿÿÿÿÿþÿÀðð€8€?À?€ÿÿŸÿþðÿàðøÀ?à?ÀüàÿàðøÀà€àÿàðøà?€ð€ÿàÿàððÀ€ðÿþàÿàø0à?€øÿþàÿÿàðà€øüþðÿÿàøð?€þüøàÿÿðà?€þøøð?ÿþøà?ÀþøððÿÿÀüà?€þðððÿÿ€ÿþà?Àÿðððÿüÿÿððà?€ðàøÿøÿÿüøà?ÀàÀðÿàÿÿÿ€øãÿÿ€Ÿà€øüÿÿÿÀüÿÿÿ€?ßàððÿÿÿàøÿÿÿ€?ßÀøàÿÿÿðø€ÀÿÿÿÀÿÀðÿ€ÿÿÿðøààÿÿÿ€ÿ€ð€€?ÿøøðÿðÿÿÿ€ÿ€ð?€?øø?ùÿøÿÿÿ€ÿ€ð€øø?ýÿüÿÿÿ€€ÿ€àðüøÿÿüþ?€Àÿ€øðüøÿÿþø?€àÿüð?þøÿÿÿÿð?€ðÿüðþøÿÿøÿð?€ðÿüðþýÿÿð€ð?€ðþüðþÿþÿà‡€ð?€àþüðþÿüÿà?Ÿ€ð?Ààþxð?€þÿüÿÀ?ÿÀð?ÀÀxð?€þÿøÿ€?ÿÀð?€ ð?þÿøÿ€?ÿ€àð?þðÿ€àð?€þàÿð?€?ðþ?À~þð?€ÿøþ€~üø?€ÿÿþ ðð?€ÿÿÃüàø?€ÿÿÿüð?€ÿÿÿøø?€?ÿÿÿøð?€?ÿÿÿüø?€?ðÿþø€?Àÿþø?€?ðÿÿ€€ø€?ÿÿÿÿ€Àø?€ÿÿÿÿ€àø?€ÿÿÿÿ€Àü?€ÿÿÿ?À@àø?€ÿÿü?Ààø?€ÿøàðÀÿÿÿÿØ€ÿ€à€?à?ÿÿÿÿÿÿÿÿÿþ?€àÀ ð?ÿÿÿÿÿÿÿÿÿþ€àÀ?à?ÿÿÿÿÿÿÿÿÿÿ?€ðÀ€ð?ÿÿÿÿÿÿÿÿÿÿ€à€?€?ð?ÿÿÿÿÿÿÿÿÿÿ?€ð€?À?ðÿÿÿÿÿÿÿÿÿþ?€ð?À?ðÿÿÿÿÿÿÿÿÿþ?€ðóÿðÿÿþðàþ`?€à?ÿÿà?ðà?€?øàÿÿà?ð?€?ÿÿÿàÿÿÀ?ðÀ?ÀÿÿÿÿàÿÿÀ?ðÀ|€?€ÿÿÿÿÀÀ?ÿÿ€?ð?À?ÿÿÿð?ÀÿÿÿÿÀ?àÿÿ?ðÀ?Àÿÿÿÿÿÿ€?Àÿÿÿÿ€ÿà?ÿü?àà?€ÿÿÿÿÿÿ€?À?ÿÿÿÿÀÿàÀ?ÿø?àð€ÿÿÿÿÿÿÀ?Àÿÿÿÿàÿà<à?À?€?àø?ÿÿÿÿÿÿÀ?Àÿÿðÿðÿà~ð?À€?ÿü?ÿÿÿÿÿÿÀ?Àÿø?ÿðÿÀ~ø€?Àÿ€?ÿ€üÿ?ÿÿÿÿÿÿÀ?ÀÀÿøüþüÀ?Àÿ€?ÿÀüþÿÿÿÿñÿ€?ÀÀÿÿøðþþà?Àÿ?ÿàüþÿÀ}?€?øÿÇøðþÿÿàÀ?ÿ?ÿøüþ?À?ÿÿÿüøþÿÿàÀüÿø?üÿ?€ÿÿÿüüüÿÿàÀøÿø?üÿ?€ÿÿüüÿü8ÿÿàÿÀÿðÿÿüüÿ€?€ÿÿðþÿ€ü~ÿÿàÿÁÿàÿÿþøÿ€ÿÿÀ?€¿ÿÀþÿàüÿÿÿàÿãÿàÿùþø?ÿÀÿÿà?€?ÿþàüÿÿÿáÿïÿàÿðÿðÿÀÿÿð?€€þ?ðüÿƒÿÿãÿÿÿàÿàñÿÿÀÿÿð?€þøýÿƒøçÿÿÿðÿàÿçÿÿÀÿÿøÀþüÿÿÇøçÿÿÿÿÿÿÀÿïÿÿÀÿÿø?€üüÿÿÇøÿÿÿçÿÿÿÀ?ÿßÿÿÀÿÿø?ÀüþÿÿÿøÿçÿÇÿÿŸ€?ÿÿÿÿÀÿÿð?Àøñþÿÿÿðÿçÿƒÿÿÿÿÿÿ€¿€ÀøÿþÿÿÿðÿãÿÿüÿÿÄÿÀÿ€øÿüÿÏÿàÿÃüÿøÿÿ€ÀÿÿøÿüÿƒÿÀÿ€à?àÿÿÀÿÿÿðÿðÿÿ€ÿÿþà?ÿÿÿðÿð~ÿ€þøÀÿÿÿàà<þüÀàÿÿÿÿÀ >€ÀÿÿÿÿàÀàÿÿÿÿðÀàÿÿÿÿøÀàÿ€ÿüÀàø?ÿüÀàøÿÿüàüÿñüðÿÿÿÁþàÿÿÿþðÿÿþÿðÿÿøÿðÿàðþ€ðø€ð€ð€ð€ð€ð€øÿ€øÿøþøþøüøüøÿøøÿÿÿÀøÿÿÿ€øÿÿþø?ÿÿüøÿÿÿàøÿÿÿÀø3àÿÿÿÿÿÿÿøÿÀ`?À?ÿÿÿÿÿþÿÿÿÿÿÿÿÿþþÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿþþÿÿÿÿÿÿÿÿüüÿÿÿÿÿÿÿÿüþÿÿÿÿÿÿÿÿüüÿÿÿÿÿÿÿüþÿÿÿüÀüÿý¿üþüþ?þþÿÿüÿÿ€þÿÿÀüÿÿÀþÿÿàþÿÿðþÿÿøþÿÿøþÿÿüþÿÿþþ?ÿÿÿü?ÿÿÿ€þÿÿÿÀþÿÿÿÀþÿÿÿÿàþÿÿÿÿðþ8ÿÿÿÿðÿÿàÿÿÿÿøÿÿüÿÿÿÿøÿÿÿ€ÿÿÿÿüÿÿÿàÿÿÿÿþÿÿÿüÿÿÿÿÿÿÿÿÿ?ÿÿÿÿÿÿÿÿÿÀ ÿÿÿÿÿÿÿÿÿàÿÿÿÿÿ€ÿ€?ÿðÿÿÿÿÿÿ€ÿÿøÿÿÿÿÿÿÀxÿüÿÿÿÿÿÿà0üÿÿÿÿÿÿðþÿÿÿÿÿÿðÿÿÿÿÿÿÿøÿ?ÿÿÿÿÿÿøÿ?ÿÿÿÿÿÿü€ÿÿÿÿÿÿþ€ÿÿÿÿÿÿÿ?Àÿÿÿÿÿÿÿÿ?Àÿÿÿÿÿÿÿ€Àÿÿÿÿÿÿÿ€Àÿÿÿÿÿÿÿà?àÿÿÿÿÿÿÿÿàÿÀà€ÿÿÿÿÿÿÿðÿøà?€ÿÿÿÿÿÿÿÿðÿüÀ?ÀÿÿÿÿÿÿÿðÿÿÀÀÿÿÿÿÿÿÿàÿÿ€ÀÀÀ?ÿÿÿÿÿÿÿðÿÿàÀàÿÀAÿ€ÿþ?ÿÿø?€ðÿÀ?€?ðÿþ€ðÿÀ?€?À?ÿÿøÿÀ?€?€ÿÿøÿ€?€ÿüüÿ€?À?ÿþüÿ?€?€ÿþüÿ?€?àÿÿüüð€?ÿÿÿÿ€þüü?€ÿÿÿÿ€ÿüþ?€ÿÿð€ÿøÿ?€ÿÿÀ?Àÿøÿ€?€ÿþ?Àÿ€øÿÀ?€>ÀÀðÿà€ÀÀð?ÿà€À?à?ðÿà€À?à?àçà€À?ààÿÃà€ÀðÀÿÀ€ÀðÀ€€þ?€ðÿ€ð€ÿÀ?€ùÿ€þ€ÿü?€ùÿ€ÿ€€ÿÿðýÿ€?ÿÀ€?ÿÿÿýÿÿà€ÿÿÿÿÿÿÿø?€ÿÿÿÿÿÿþÿø?€ÿÿÿÿþÿþÿü?€ÿÿÿÿþÿüÿü?€ÿÿþÿüþ?€€ÿÿÿüÿþ?€€ÿÿüÿþ?€àÿÿ€ø?ÿü€?øÿÿ€?øÿü?€ÿÿÿÿÀ?ð?ÿø?€ÿÿþÀðÿð?€ÿÿüààÿÀ?€ÿÿðÀÀÀ?€ÿÿÀà?€ðà?Ààà?€À?Ààþ?à?€Àÿ€ÿÿÿðÀà€ÿÿÿÿÿÿðÀÀÿÿÿÿÿÿÿÿÿÿÿøÀÀÿÿÿÿÿÿÿÿÿÿÿøÀ?€ÿÿÿÿÿÿÿÿÿÿÿüÀÿð€ÿÿÿÿÿÿÿÿÿÿÿøÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðàÿÿÿþÿÿÿÿÿÿÿÿÿüxàÿÿÿþÿÿÿÿÿÿàÿÿÿþÿÿÿÿøàÿÿÿÿÿðàÿÿÿÿ€ÿàðÿùÿÿ€ÿÀðàÿÿÀÿÀðàÿÿàÿÀðúÿÿðÀðÿÿÿðÀðÿÿþøÀðÿÿüø?ÀðÿÿÀø?Àðÿ€ü?Àøüü?Àøøü?àøü?àøü?àøü?àøü?àøü?àøü?ðøü?àøø?ðøø?àøøðøø?àøððüð?àø?àðüà?ðøÿ€ðüÿ€ðø>ÿðüÿÀÿðøÿÿÿÿüðüÿÿÿÿøðüÿÿÿÿàðüÿÿÿÿàðüÿÿÿÿðüÿÿÿþðüÿÿÿððüø@àðüððþððþðàþðàþðàþðàþððþððþððþððþððþððþððþððþðøþðÿ€þàÿðþðÿüþðÿÿþàÿÿøþðÿÿÿþàÿÿÿÀþðÿÿðþàÿÿøþàÿÿüþàÿþþàÿþþàÿþþàþüàÿþþàÿøü?à?ÿàþðÿÿ€ü?àÿÿþàÿøü?àÿðþàÿÿ€ü?àÿÿþàÿðüÿÀ?àÿà€þÿààÿÿ€ ÿÀüÿà?àÿÿÿÿàþÄÿýßà¼üÿøÿøÿÿÿðÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿðÿÿÿüÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿà?ÿÿÿüÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿø?ÿÿÿþÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿ?ÿÿÿþÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿð?ÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿ€ÿÿÿüÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿàÿÿÿüþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿþ(ðþÀ?àÿø ÿÿÿ€ðþÿðÿÿÿø?àü?üÿàÿÿü?Àüÿ€?ÿàÿÿþÀüÿÿàÿ€ÿþ€ÿüÿÿøÿÿþ€ÿÿÿÿüüÿþÿÿÿÀÿÿþüÿþÿÿÿðÿÿÿüÿüþÿÿøøÿ€üÿÿðþÿÿüøÿÀüÿÿüÿÿþøÿÀüÿðüÿÿÿø?àüÿÿàüÿÏÿø?àüÿÿüÿüðüÿüø€üðü?ÿàðÀþøþÿÿà€þðüÿüà?€ÿøþÿà?À€ÿðüÿ€?À€€øþÿÿÀÀÿ€ðüÿÿø?Ààÿ€?Àøþÿÿþ€øÿÿÀðüÿÿÿð€þÿÿÿÿàñàþÿÿÿøÿÿŸüÿÿÿàÿÿü?ÿÿÿÀÿ€ÿÿüÿÿÿðÿÿ€þÿÿÿðÿÿÿðÿÿÿð?ÿÿÀþÿÿÿøþÿÿðÿÿÿø?ÿÿàþÿÿø|ÿÀÿÿÿð?ÿÿÀþÿþÿ€ÿÿÿàÿÿàþÿþÿÿÿÀþþ~þ?þþþÿþþÿøþÿàÿÿ€þÿþÿÿøÿÿðÿ?ÿ€ÿÿÿÿÿøÿÿðÿÿÀÿ?ÿÿþÿøÿàÿÀÿÿÿÿàÿÿÿÀ€ÿÿÿðÿÿÿþÿÿÿÿ€ÿÿÿà€ÿÿÿàÿÿð?ÿðÿÿøÿÿøÿÿøÿÿðÿ?ÿÀÿÿþÿÿøÿÿàþÿÀÿÿþþÿøþ?ðÿÀþ€ÿ€þ€ÿ€þ€ÿ€ÿ?Àÿ?Àÿ?Àÿ?Àÿ?À€?À€À€À?€à?€à>?€àÿÿà?ÀàÿÿÿÿÀàÿÿÿÿÿÀà?ÿÿÿÿÿÀàÿÿÿÿÿÿÀàÿÿÿÿÿÿðàÿÿÿÿÿÿøðÿÿÿÿÿÿÿþàÿÿÿÿáÿÿÿ€àÿÿüÿÿààÿÿÀÿÿðà?ÿüÿøàÿà?ÿüàÿÿ€?ÿþàÿþ?ÿþàÿø?ßÿ€Àÿàÿ€à?ÿÀ?Ãÿààÿ€ÿðàþÀøÀÿø€üàÿðÿÀÿÀÿÀÀÿ€ÿàÿ€øÿ€ÿ€ÀÿøþÿÀàþüþÿàÀ?üøøÿðà?øüÿðøÀÿðøÿÀøàÿàüÿÀüàÿ€øÿüàÿ€üþþÀÿüüþàÿüÿøÿàþüÿàÿàüüÿ€ÿ€àøüÿ€àøü?þÀàðüÿø?Ààðüÿð?Ààðüÿà?ààðüÿÀàààü?ÿàààüþðààýÿøðüàÿÿðøÿàÿÿàø?ÿ€àÿÿ€øÿ€Àÿÿüÿÿ€?Àÿüüÿÿ€?Àÿøü<_ÿÿ€?Àÿàü9 ?ÿÿÿÿ€ÀÿÀü?ø€ÿÿÿÿþÿÿüñÿÿÿÿÿÿÿ€?ÀÿüÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀ?Àþüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€?€üüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€?€üüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€?€üüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€?Àþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ?€üüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿ?€þþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿü€üüÿÿÿÿÿÿÿÿþ€ÿüàÀÿÿÿþþðÿÿÿÿÿðàÿÿÿÿüüð ?øÿþÿÿøÿÿÿÿÿþþð?ð>pÿÿÿÿÿÿÿÿÿÿÿÀ@ÿÿÿÿÿÿÿþüðøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþðøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþðø7ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþðøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþüðüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþàø_ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøþüðü?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðþþàø?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýþÿ(ÿÿÿÿÿÿÿÿÿààþüàü?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀ?ÿðÃÃÇÿÿÿÿøðÿþÀø?ÿÿÿÿÿÿÿÿÿûÀÿÀðþüàü?ÿÿÿÿÿÿÿÿÿàÿÀøÿþ?Àø?ÿÿÿÿÿÿüpÿ€øÿü?Àü?ÿÿÿÿàÿ€üÿþ?Àø?ÿÿÿ€üÿ€ü?ÀüÿÿÀ?€üÿÀü?Àüàð?þÿàü?ÀüÀp?€þÿðø?ÀüÀ`?þÿøø?ÀüÀ?€ÿÿüø?ÀüÀÿ€ÿþø?ÀüÀÿ€ÿÿø?ÀüÀ?ÿÀÿÿ€Àø?ÀüÀ?ÀÿÿÀàð?àüÀ?àÿÿààà?àþÀ??àÿÿøðà?àüÀ?€?ðÿ¿üð?À?àüÀ?€ðŸþðÀ?àüÀ?€ø‡ÿøÀ?àüÀ?€ø‡ÿøÿ€?àüÀ?ÀüÿÏüÿ?àüÀ?ÀüÿÿüÿàüÀ?Àþ€ÿþþ?àüÀ?Àþ€ÿþþàþÀÀÿ€ÿþüàüÀÀÿ€ÿÿüàþÀÀÿ€€ÿÿ€ø?àüÀÀÿÀÿÿÿ€øàþÀààÿÿÿÀðàüÀààÿ?ÿÿà?ððþÀà?ðÿ?ÿÿø?ààü?Àà?øÿÿÿøÿÀðþÀðüÿÿÿüÿÀàüÀàþÿÿÿüÿ€ðþàðÿ€ÿÿÿþÿ€àüÀðÿ€~ÿÿüÿðþàðÿà>?ÿÿþþðüàðÿð8ÿÿÿüðþàøÿþÿÿ€ÿøðüàðÿþÿÿƒÿðøþàø?ÿÀ/ÿÇÿàøþàø?ÿðÿÿÿÀøþðøÿüÿÿ€øþàøÿþ?ÿþüþðüÿÿÀÿÿþüþðüÿøÿÿÿøüþðüÿþ¿ÿÿÿàøþðüÿÿÿÿÿÿÿ€üþðüÿÿÿÿÿÿÿüþðüÿÿÿÿÿÿüüþøüÿÿÿÿÿðüþøüÿÿÿÿÿðüþøüÿÿÿÿÿðüþøþÿÿÿøðüþøþÿþ@ðüþøþððþþüþðþþüþðþþ>üþðþþüþðþþÀüþðþþÿàüþðþþ8ÿðüÿ€þøþþ~ÿøü??ÿàþð>þþþÿøü?€ÿàþð?þþþÿüü?€ÿÿøþøðÿþÿ?ÿüü?€ÿÿøþøø€ÿþÿ?çþþ?ÀÿÿüþðüÀ€ÿþÿÇþþ?ÀÿÿþþðþÀ€ÀÿÿÿÿÃÿþ?Àÿÿþþðþ?à€øÿþÿÿÿü?Àÿÿÿþðþà€üÿÿÿÿ€ÿ€ü?ÀüÿþøþÿðÀþ€ÿþÿþÿ€ü?Àøÿ€þøþÿð€þÀÿÿÿ€þÀþ?Àøÿ€þøþÿð?ÀÿàÿþÿøÀü?Àðÿ€þøþÿð€ÿ?àÿ€ÿ€ø?àþÀðÀþøþ?ÿð?€ÿ€?ðÿþÿ€ð?àü?ÀàÀþøþÿÿð€ÿ€ðÿ€ÿ€ðàþàð?ÀþøþÿÿøÀÀÀàÿÿÿ€à?àþ?Àà?Àþøþÿÿø€ÀÀÿÀÿ€ÿÀààþàð?àþøÿÿÿðÀà?àÿÀÿÿ€ààþàà?Àþøÿ?ÿÿð€ð?àÿ€ÿ€ÿ€€ààþàà?ÀþøÿÿÿøÀð?ðÿ€ÿÿ€à?Àþàà?Àüøÿÿÿÿð€ðàÿÿ€ÿ€Àðàþðð?ÀþøÿÿÿÿøÀøðÿÿÿ€ð?Àþàðÿ€üøÿÿÿÿðÿ€øðþÿ€€Àø?àÿðüÿ€þøÿÿÿÿøÿ€øøþÿÿÀøÿÀþàÿÿÿüüÿ?ÿÿÿðÿÀøøüÿ€ÿ€ÀüÿÀÿðÿÿÿ€þÿÿÿÿÿÿøÿàøüüÿÿÀÿÿÿ€ÿàÿÿÿüÿÿ€ÿÿÿÿÿðÿÿÿþÿûÿàÿüüøÿ€ÿ€?Àÿÿÿ€ÿðÿÿÿþÿÿÀÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿðÿÿàþüÿ€ÿ€ÀÿÿþÿàÿÿþüÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿð?ÿÿøþøÿ€ÿ€?Àÿÿþ€àÿÿüþÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø?ÿÿüÿøÿ€ÿ€?ÿÿø€àÿÿøüÿÿà?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿüÿŸðÿ€ÿ€ÿÿø€Àÿÿøþÿÿð~ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿð?ÿÿüÿ¿ðÿ€ÿ€ ÿà€€ÿàüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿüÿà€€ÿ€€€?€þÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿøÿàÿ€ÿ€ü€üÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿÿÿÿÿÿÿÿÀÿÿð?ÿàÿ€ÿ€ð?€þÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ@8ÿÿÀü?ÿÀÿ€ÿ?€þÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿü`ÿÀøÿÀ€ÿ?€þÿÿÿÿÿÿÿÿÿÿÿÿÿûÿÿÿÿÿÿüÿ€øÿÀ€ÿ?€þÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿøÿ€øÿ€ÿ€ÿ?ÐþÿÿÿÿÿÿÿÿÿïÀÿÿÿÿÿüÿ€øÿ€ÿ€ÿ?ÿÿþÿÿŸÿÿîÿÿÿÿÿøÿ€øÿ€ÿ€ÿÿð?ÿÿÀþÿÿ€ ÿ¿ÿÿÿøÿ€øÿÿ€ÿÿÿÀÿÿðþÿÿÿŸÿÿÿüÿ€øÿÿ€ÿÿÿðÿÿþþ?þÿÿÿÿüÿ€øÿÿ€ÿÿÿþÿÿÿÀþüÿ‡ÿÿÿü€ðÿÿ€ÿÿÿÿÀÿÿÿàþüÿƒÿÿÿü€@ÿÿ€ÿÿÿÿøÿÿÿøþüÿÿÿÿü€þÿ€ÿÿÿÿüÿÿÿþþüÿ€ÿÿÿü€þÿ€ÿÿÿÿÿùÿÿÿ€þþÿ€ÿÿÿü€|ÿ€ÿÿÿÿÿ€ÿÿÀþþÿÀÿÿü€ÿ€ÿÿÿÀÿÿðþþÿÀÿÿþ€?øÿ€þÿÿÀÿðþþÿÀÿÿþ€ÿÿÿÀÿ€þÿàÿøþüÿÀÿÿþ€ÿÿ€ÿàÿßïÿÿÀþÿàÿøþüÿÀÿÿþ€ÿÿÀ?ÿøÿÿÿÿÿÿðþð?üþüÿÀÿÿþ€?ÿÿÀÿüÿÿÿÿÿÿÿÿðü?ðþþüÿÀÿþ€ÿÿàÿÿþÿÿÿÿÿÿÿÿð0øþþþÿÀ?ÿþ€ÿÿÿàÿÿÿ?ÿÿÿÿÿÿÿÿÿðøþþüÿ€ÿþÿ€ÿÿÿàÿÿÿ€ÿÿÿÿÿÿÿÿÿÿðüÿÿþÿÀÿþÀÿÿÿàÿÿÿ€? ÿÿÿÿÿÿÿÿÿÿðøÿÿÿ€ÿ€ÿþ€ÿÿÿàÿÿÿÀÿÿ€ÿÿÿÿÿÿÿÿÿÿðøÿÿÀÿàÿÀÿþ?ÀÿÀ?àÿÿÿ€ÿÿÿ€ÿÿÿÿÿÿÿÿñ¿ðøÿÿàÿøÿ€üÀÿ€?àÿÀÀÿÿÿÀÿÿÿÿøøøøÿÿÿÀü?ÀþÿÀþÀÿÿÿÀÿÿ€ðøÿ?þÿ€ÿ€ø?€þÿàøÀÿÿÿÀÿ€øø€ÿÀ?ÿàÿÀø€øÿÀ?àÀÿÿÿ€€ððüÿÿð?ÿðÿ€ðÿÀàÀÿÿÿ€À€ÿÿÿÿøðÿü€ÿþÿþÿ€ð?ÿ€Àÿ€ÿÿÿ?ßÿÿÿÿÿÿÿÿð?àÿÿÿ€ÿÿÿ€ÿÿàÿÀÿÀÿÿÿ?ÿÿÿÿÿÿÿÿÿð€?àÿÿÿøÿÿÿøÿøÿþÿ€ÿ?ÿÿÿÿÿÿÿÿÿð?ÿÿ€ÿÀÿÿÿÿþÿÿÿÿüÿÿ€ÿ€ÿ?ÿÿÿÿÿÿÿÿÿðÿÿÿøÿÀÿÿÿÿçÿ?ÿÿÀÿþÿÿÀ?ÿÿ?ÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿþÿÿàÿÿÿð?ÿÿ€?ÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿþÿÿð?ÿ€ÿðÿüÿÿ€ÿÿÿÿÿÿÿÿÿÀÿÿÿÿþÿÿÿÿÿüÿÿàÿÿ€?ÿøÿüÿÿøÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÀÿÿøÿÿðÿÿ€ÿüÿø€<ÿÿüÿÿÿÿÿÿÿà?ÿÿÿÿÿÿÿÿÿÿøÿÿàÿÿÿ€ÿü?ÿøà~ÿÿÿüÏ€ÿÿÿÿÿ€ÿÿÿÿÿøÿÿðÿÿÿ?þÿà?àÿÿÿÿ?ÿÿÿÿÿ€ÿÿÿÿÿðÿÿÿàÿÿìþÿÿ€?àÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿðÿÿÿàÿþþÿü?ÁÿÿÿþÿÿÿÿÿÀÿÿÿÿÿüÿÿþÿÿàÿÿü?àÿ€ÿÿþÿÿÿÿÿàÿÿÿÿüÿÿüÿÿÀÿÿðáÿÿÿþÿÿÿÿÿà?ÿÿÿÏþÿÿÀ?ÿþÿÿàáÿ€ÿÿüÿÿÿþ?ðÿÿÜþÿÿüÿðüÿÿ€ãÿÿ€ÿÿÿøðøÏþþÿÿ€àÿÿ€ÿÿÿÀãÿ€ÿ€ÿÿÿÀøàþþÿþðÿÿÿ€ÿÿÿüàÿçÿ€ÿ€0à?ÿàøøÿàþ?ÿøÿðÿüÿ€ÿÿÿÿøÿïÿ€ÿ€?ÿÿÿÿáÿøøøÿÿþÿÀüÿðÿÀÿÀþÿÿÿüÿïÿ€ÿ€ÿÿÿÿÿÿÿÿüüÿøÿÿþþÿÿþÿÿð?ÿÿàþ?ÿÿÿüÿÿÿ€ÿ€ÿÿÿÿÿÿÿÿÿþøÿøÿÿÿþþÿþÿÿÿþÿÿð?þÿðþ?ÿÿÿüÿÿÿ†ÿ€ÿÿÿÿÿÿÿÿÿþøÿÿøÿÿÿÿþþÿÿ€ÿÿÿþÿÿð?ÿðøþÿÿÿüÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿþøÿÿøÿÿÿÿÿþÿÿÿÿÿÿÿÿÿð?ÿü?ÿÿüÿÿÿøÿÿÿÿ€ÿ€ÿÿÿÿÿÿÿÿÿüø?ÿÿàÿÿÿÿÿÿÀüÿÿÿÿÀÿÿÿÿÿÿàÿÿ€ÿÿüÿÿÿøÿÿÿÿ€ÿ€ÿÿÿÿÿÿÿÿÿøðÿÿÿ€ÿÿÿÿÿÿÿÿÿüüÿÿÿÿðÿÿÿÿÿÿ€ÿÿðÿÿøÿÿÿðÿÿÿÿ€ÿ€ÿÿÿÿÿÿÿÿÿüð?ÿÿüÿÿÿÿÿÿÿÿÿ€ÿÿàüÿÿÿÿþÿÿÿÿÿþðÿÿþÿÿðÿøðÿÿÿÿ€ÿ€ÿÿÿÿÿÿÿÿÿüðÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿøüÿÿÿÿ€ÿÿÿþÿø?üÿÿÿÀÿÿà?øÿÿÿÿÿÿÿÿÿÿÿÿüÿàðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿü?ÿÿÿÿðÿÿÿüÀÿÿÀ?ÿÿøÏ€ÿÿÀ?Àÿþþ~ÿÿÿÿÿÿÿÿÿüÿÿÿ?àÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ?ÿÿÿÿøÿÿÿÿüÿÿÿøÀÿÿàÿÿÿ€ÿà?Àÿ€ûüüÿÿÿÿÿÿÿÿÿüÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿø?ÿÿÿÿÿßðÀÿÿðÿÿüÀÿøÿøþ?óø?øÿÿÿÿÿÿÿÿÿüÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿðÿÿÿÿðÀÿÿøÿÿþÀÿøÿüü?ððÿÿÿÿÿÿÿÿÿüÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿøÿÿÿÿÿøÿÿÿ?àÀÿÿþÿÿÿÀ?ÿüÿþààÿÿÿÿÿÿÿÿÿøÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿü?ÿÿüÿÿÿ?à?ÀÿÿþÿÿÀÿÿüÿÿàÿÿÿÿÿÿÿÿÿøÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÀÿÿøÿÀÿÿþÿÿ?àÀÿÿÿ€ÿÿ€àÿÿþÿÿÀÿÀÿÿÿÿÿÿÿÿàÿÿÿÿÿüÿÿÿÿÿÿÿÿ€ÿÿÀÿ€ÿþÿÿÀ?ÿðüÿ€ÿÿÀÿûþ?ÿÿÀÿÀÿÿÿÿÿô?ÿÿþÿÿÿÿàÿÿÿàÿÿÿ?ÿÿÀÿþðÿÀÿÿÿ€àÿðÿÿÿðÿ€ÿüþÿÿÿÿþÿÿÿÿ€ÿøÿùÿÿÿþÿÿþ€?ÿÿàÿÀÿÿþàÿÀÿ?ððÿüÿÿÿÿÿÿÿÿÿÿàÿðÿÿÿÿÿÿÿþ€?ÿÿÀààÿÿþàþ?Àøþþÿÿÿÿçÿÿÿÿàÿ€ÿÿÿýÿÿÿÿàÿÿÿÀÀàÿÿù€àøÿ?€øþÿÿÿÿáÿ€ÿÿÿàÿÿÿÿüÿÿÿ€ÿ?ÿÿðà?àÿÿÀàø€?Àøüÿÿÿÿÿ€ÿÿàøÿÿÿðÿÿþþÿÿðà?àÿþàà?ÀøüÿÿÿÿÿÀ?ÿàÿÿÿ€€?ÿÿøÿ?ÿÿøððÿÿøàà?€?Àüøÿ?ÿÿÀÿÀÀÿÿþÿÿÿÀüÿÿøðàÿÿÀàÀ?ÀüøÿÿþÀÿø€ÿÿÿþ?ðüüðÿþðà€àüðÿÿ?Àð?ÿÿðüøüàÿÿà?Àÿàüðÿ¸?À?ÿÿÀüüþðÿÿÀðÀðüàÿ?Àÿþøøÿàÿÿðà?Àþðø?À?ÿøøøÿ€ðÿÿþðÀÿðøÿ?ÀÿøøøÿÀðÀÿÿÿ€ð?Àþøð€?À?ÿÿ øøÿðÿøÿÿÿàðàþøðÿÀ?ÿÿÿ€ðÀøÿðÿüÿÿúð?àüøà€ÀÿÿÿðøöøÿÿüÿüÿÿÀðàüüð€ÿ€ÿÿÿ€ÿÿÿÿÿ€ðÿÿðÿÿü?ÿüÿÿøðàÿüÿÿüà€ÿ€ÿÿÿøÿÿÿÿÿððÿÿðÿÿüÿüÿþøûÿüÿÿüà€ÿÿÿÿÿþÿÿÿÿüàÿÿð?ÿÿü?ÿüÿÿüÿÿø?ÿÿü?ÿð€ÿÿÿÿÿÿÿÿÿÿÿÿþàÿÿð?ÿÿüÿüÿÿþÿÿð?ÿÿü?ÿø€ÿÿÿÿþÿÿÿÿþ?ÿÿüÀÿÿà?ÿÿøÿðÿÿþÿÿà?ÿÿü?ÿü€ÿÿÿÿþÿÿÿÿþÿÿþÀÿÿÀ?ÿÿðÿàÿÿüÿÿÀÿÿü?ÿü€ÿÿÿÿü?ÿÿÿÿÿÿÿüÿÿ€?ÿÿðÿ€?ÿÿøÿÿÿÿø?ÿü€ÿÿÿÿø?þÿÿÿÿ?ÿüÿÿÿÃàøÿþøÿüÿÿà?ÿü€?ÿÿÿÿü?àÿÿÿÿüððÿÿððà€?ÿø€?ÿÿÿÿüàÿÿÿÀÿÿüÿÿÀàÿð€?ÿÿÿÿþàÿÿÀÿÿðÿü€?ø?ÿÿþø?ÿÿàÿÿÀÿÀ€?ÿÿÿÿÿüÿÿ¿àÿþÿÿÀ?ÿÿÿÿÿÿÿÿÿðÿÿüÿø?ÀÿÿÿÿÿÿÿÿþðÿÿÀÿð?Àÿÿÿñÿ€ÿÿÿøð?ÿÿ?ÿÀ?Àÿÿÿàÿ€ÿÿÿðøÿÿü?ÿ€?ÀÿÿÿÀÿ€ÿÿÿÀøÿÿðÿ?Àÿÿþÿ€?ÿþøÿÿÀÿþÀÿÿøÿ€ÿðøÿÿ€ÿÿ€?ÀÿÀ€ÿÀøÿÿø?ÿÿð?Àþ€øÿÿþ?ÿÿø@ÿÿÿÿñÿ€øÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿ€€øÿÿÿþÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÀ€øÿÿÿÿàÿÿøpÿ€ÿÿÿÿÿÿÿÿÿÿÀÿ€øÿÿÿÿüÿÿüÀÿÿÿÀÿÿÿÿÿÿÿÿÿÿàÿ€ø?ÿÿÿÿ/ÿÿàÀ|ÿÿÿÀÿÿÿÿÿÿÿÿÿÿÀÿøÿÿÿÿÿÿðàÀÿ€ÿÿÿàÿÿÿÿÿÿÿÿÿÿÀÿøÿÿÿÿ€?ÿÿ?àÿàÿðÿÿÿàÿÿÿÿÿÿÿÿÿÿÀþðÿÿÿ€ÿÿðÿþÿþÿÿÿàÿÿÿÿÿÿÿÿÿÿÀü?ðÿÿ€ÿÿ€?ðÿþÿÿÿÿÿÀÿÿÿÿÿáçÿüøÿàÿÿÿÿ€øÿÿ€ÿÿÀ?ÿÿÿàÿÿÿÀÿøÿàÿÿ€ÿÿ€?ðÿÿ€ÿÿÀÿÿÿ€ÿà?ÿÀÿÿÿÿ€øÿÿàÿÿðÿÿþÿÿàÿÿÀÿÿ?ÿÿ€øÿÿàÿÿÿðÿàÿÿÿ€ÿÿÿÿ€ÿÿøÿÿüøÿÿðÿÿÿøÿàÿÿÿ€ÿÿÿÿÿÿàÿÿÀø?ÿÿðÿÿÿüÿÀ88ÿÿÿþÿÿÿþ?ÿÿÀÿüø?ÿÿøÿçÿþÿÀÿÿþÿÿÿüÿÿÿüÿÿ?ÿøøðøÿ€?þøÿÿÿÿãÿÿÿÿÿÿð?ÿÿÿðÿÿüÿÿÀøðüÿ€ÿ?üÿÿÿÿÿÿÿÿ€ÿÿÿà?ÿÿÿÀÿÿðÿÿøÿàüÿÿþÿÿÿÿÿÿÿÿ€ÿÿÿÿÿøÿÿÿðøÿàþÿÿ€ÿ€ÿÿÿÿÿÿÿÿ€ÿÿø?ÿÿ€ÿüÿàøÿÀüþÿÿÿ€ÿÿÿÿÿÿÿÿÿÿ€ÿþðÿàÿøÿÀþþÿÿÿÀÿÿÿ€ÿÿÿÿÿÿÿ€ÿðÿÿøÿ€þüÿƒÿÿàÿÿÿ€ÿÿÿÿÿÿøðÿüøÿ€ÿüÿƒÿÿàÿÿÿÀÿÿÿÿÿÿøàÿøøÿÿøÿƒÿÿðÿÿÿÀ?ÿÿÿ¾ø€ÿàøÿÿüÿƒÿ?ðÿÿÿÀ ÿøø€€àøþÿüÿƒþðÿÿÿÀø€àøþÿüÿÃÿøÿÿÿÀü€àøþÿüÿƒÿÿøÿÿÿ€ÿÿðü€€àøþÿ‡þÿÿÿøÿÿüÿÿÿøü€€Àøþÿþÿÿÿøÿ€ÿÿÿøø€€?Àøþÿÿÿÿÿÿøÿ€ÿÿÿøü€€?Àøþÿÿÿÿÿÿðÿ€ÿÿÿøü€€Àøÿÿÿ¿ÿÿÿÿàÿ€ÿÿÿøü?€€Àøÿ€ÿþÿÿÿÿÿÿÀÿ€ÿÿÿøü?À?€?Àøÿáÿþÿÿÿþÿþÿ€ÿÿÿøü?À?€?Àøÿÿÿüÿÿüÿÿ€ÿÿÿðü?À?€Àøÿÿÿøÿÿøÿÿ€?ÿàü?À?€Àøÿÿð?ÿÿÀÿÿ€üÀ?€Àø?ÿÿà?ÿàÿÿ€øÀ?€?Àøÿÿ€ÿÀÿ€üÀ?ÀÀøÿþÿÀÿ€üÀ?€ÀøÿÀÿÀÿ?€üÀ?ÀÀøÿÿ€þ?øÀ?€Àøÿüà?ÀÀðþ?€üà?€ÀpÿÀüà?ÀàþÿÀüà?€Àÿàüð?ÀàÿÀüð?ÀàÿàüðÀàÿÀüð?Ààÿ?àþðÀàÞ?Àüð?ÀàÀþøÀàþð?Àà<ÿøÀð€þø?Àà€Àþøàð€àþøÀàÀðÿüàðÿÀ?ðþøàðàøÿüàøÿÀ?ðþüàðàøÿþàøÿà?ðÿüàøÿà?ðÿþðøÿà?ðÿþàøÿà?ðÿ€þðøÿà?ðÿ€þðøà?ð€ÿðøà?ð€þðøà?ð€ÿðøà?ð€ÿðøà?øÀÿðøà?ø?Àÿðøà?ÿÀ?Àðøà?ÿÿþÈ?À€ðøà?ÿÿÿÿðÿÿÿÿ€ü?À€øøÿà?ÿÿÿÿÿÿÿÿÿÿÿçÿ?À€øøÿà?ÿÿÿÿÿÿÿÿÿÿÿÿÿ€?à€øøàÿÿÿÿÿÿÿÿà?ÿÿÿÿÿÿÿÿÿÿÿÿÿ€à€øø?ÿÿÐÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÿÿÿÿÿÿÿÿÿ€à€øøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÿÿÿÿÿÿÿÿÿÀà€øøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÿÿÿÿÿÿÿÿÿÀà€øøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?øÿÿÿÿÿÿÿÿÿÿÿÀð€øðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?øÿÿÿþÿÿÿÿÿÿ€à€øðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàøøÿÿÿÿÀð€üð?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ðÿÿ€ð€øðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðøÿ€ðÀüð?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ðÿ€ð€øðÿÿÿÿÿÿÿÿùÀÿÿ€ðøÿÀð€øðþ?ÿÿÿÿÿÿðà?ðÿ€ð€øðàÿÿðÿÿÀ?ðøÿÀð€ü?ÿÿÿÿÿÿÿÿÿ€àà?ðÿ€ð€øÿÿÿÿÿÿÿÿÿ€ð?ðøÿ€ø?€üÿÿÿÿÿÿÿÿÿ€ðà?ðÿ€ð€øÿÿÿÿÿÿÿÿÿ€ð?ðøÿ€ø?Àøÿÿÿÿÿÿÿÿÿðà?ðÿø€øÿÿÿÿÿÿÿÿÿð?ðøÿ€ø?Àÿþÿ€?ÿÿÿÿÿÿÿÿÿðà?ðÿø€þäÿÿÿÿÿÿÿÀ?ÿÿÿÿÿÿÿÿøð?àøÿ€ø?€ÿÿÿÿÿÿÿÿÿÿàÿÿÿÿáðà?ðÿ€ø€ÿÿÿÿÿÿÿÿÿÿÀàø?àðÿ€ü?€€ÿÿÿÿÿÿÿÿÿÿàøà?ðÿøÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÀøà?ðÿ€üÿÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿàþøà?ðÿ øÿÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÀÿÿøà?ðÿ€ÿðüþ8ÿÿÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÀð?ÿÿÿ€øà?ðÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿðÿÿÿÿÿÿÿÿÀüà?øÿ€ÿÿÿÿüÿÿÿÿÿÿÿÿÿÿàçÿÃÀþÿÿÿÿÿàøà?ðÿ?ÿÿÿÿÿþ?ÿÿÿÿÿÿÿÿÿÿÀ?ÿÿÿÿÿàüà?øÿ€ÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿàøà?ðÿÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿ€€ÿÿÿÿÿÀøàøÿ€?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿüÿÿÿÿÿÀøÿà?ðÿ€ÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿ›ÿÿÿÿÿ€ÿÿÿÿÿ€øà?øÿ€ÿÿÿÿùÿÿÿÿàÿÿÿÿÿþÿÿÿÿÿ€ÿÿÿøøÀ?ðÿ€ÿÿÿðÿÿÿøÿÿÿü?ÿÿÿÿÿ€ üÀðÿ€ÿÿÿ€ÿÿþÿóÿ€?ÿÿÿÿÿ€ü?€ðÿ€?ÿÿÿÿÿ?ÿÿÿÿÿ€üðÿ€ÿðÿÿÿ€ÿ?ÿÿÿÿÿ€üàÿ€ÿÿ€üÿÿàÿÿ€?ÿÿÿÿÿüàÿ€ÿüü?ÿð~ÿÿÿÿ€ÿÿÿÿÿÿðüÿÿðüÿøÿÿÿÿÿÿ€ÿÿïÿþ?ÿøøÿÿÀüÿøÿÿÿÿÿÿ€€0?ÿüøÿÿ€üÿüÿÿÿÿÿÿ€ÿþøÿþüþÿÿÿÿÿÿ€ÿþøÿ?üüÿÿÿÿÿÿÿ€ÿþøÿøüÿ€ÿÿÿÿÿÿÿüøÿðüÿÀÿÿÿÿÿøø?ÿüðÿÿàüÿàÿÿÿÿÿàþÿøðÿÿÀ`üøÿÿÿø?ÿþ0ðÿÿ€ðüø0ÿþðÿÿüü?üÿÿðÿþø?øüÿÿþðÿüüøÿÿÿþàþøüÿøÿÿüÿÿüðÿ?øüÿðÿ€ÿþÿüàþðüÿÀÿ€ÿþ?ÿøðÿàüÿ€Àÿþà0?ÀðþÿÀü?ÿÀÿþÀðþÿÀþþ?àÿþÀðþÿüÿø?àÿþÿÀðþÿþÿøøÿþÀðüþüÿàøø€ðþþþÿÀü?€àüüüÿ€üðþüþ?ÿþø€àüøüüþüðþøþÿüÿþàþðüÿðÿÿðþðþÿðÿ€ÿðþàüÿÀÿ€Àÿðþàþÿ€Ààÿðþ?àþ?þÀ?ðþÀðþ?àþ?ü?ÀøþððþÀþÿø?à?øþøðþÀþÿðà?ðþüðþ€þÿàààxüðþÿ€ÿÿÀðàüðþÿÿÿ€ðàþðþÿÿ?ÿðÀþðàþÿÿþøÀþðø>þÿÿÿüøþðü€À þþÿÿðøÿðþÿ€àðþþÿÿàøÿðþÿÀðøþþÿÿÀüÿðþÿÀøüþþÿÿ€üÿðÿÿÀüþþüÿÿüÿðÿÿàüþþüÿüüÿð?ÿÿà?üÿþüÿøüÿðÿ€ÿàüÿþøÿðüÿøÿÿ€ÿðþÿ€þøÀþÿøÿÿ€ÿðÿþÿÀþøÿÀþÿøÿÿÀÿøÿþÿàþø€þÿøÿÿÀÿøÿþ?ÿàþð€þÿøÿÿÀÿüÿÿ?ÿðþø€þÿðÿÿÀ?ÿüÿÿÿøþø€üÿ€øÿÿà?ÿüÿÿÿüþøÀþÿøÿÿàÿüÿÿÿÿüþðÿÀüÿ€øÿ?ðÿþÿÿ€ÿïþÿø?ÿÿàþÿ€ð?þ?ðÿ÷þÿÿ€ÿþÿðÿüÿÿÿàüÿàÿøþøÿãÿþÿÀÿƒÿÿ€øÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðþ?ÿàÿðÿøøÿÃÿ?üÿÀÿƒÿ?ÿÀüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðü?ÿÿûÿø‡ÀÿøàÿøüÿÁÿ€üàÿÿ€?ÿÿà?üÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðþÿÿÿÿÿÿÿÿøàÿðt?ÿÿÿ€ÿðüÿÿ€?øàÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàüÿÿÿÿÿÿÿÿÿÿ€?ÿüÿÿÿÿÿÿÿÿàþÿ€ÿ€?ø?ðÿ€ÃÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀþÿÿ€?ð?ðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÀ?øøÿ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿœ?àþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿþÀðøþ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀ?àü?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿ‡þàðøþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ þàþ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿüààøüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€?ø?àüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÏü?ððüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøüðþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿßü?ðÿàü?øÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðøàüÿÿÿà?ÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÀÿÿüðÿàþ?øÿÿÿÀÿÿÿð7ÿÿÿÿÿÿÿÿÿüðþÿ€ÿÿÿÿÿÿðÏþÿøñÿÀþðÿþÿÀ?ÿÿÿÿÿÀüðüÿ€€ÿÿÿÿüÿüøÿàþðü?ÿÀÿÿáÿÿ€üðüÿ€ÿþðÿøùÿÀþÿà?ÿ€ÿþüðüÿ€ÿþ?ÿøýÿÀÿÿàÿ€þþøüÿ€ÿü?ÿøÿÿÀÿÿàÿ?øþðüÿ€ÿüÿøÿÿÀÿÿàÿ?øþøüÿ€ÿð?ÿøÿÿ€ÿÿÀ|?àþðøÿ€€ÿøÿÿ€ÿÿÀ0àÿøøÿ€ÿðÿÿÿÿ€?àÿøøÿ€ÿðÿÿÿ€àÿüøÿ€ÿàÿÿÿ€àÿ€þðÿ€ÿàÿÿÿ€àÿ€ÿðÿ€ÿàÿþ?ÿà€ÿ€ðÿ€ÿàÿþ?ÿðÀÿÀðÿ€ÿÀþÿðÀÿàðÿ€ÿÀüÿðÀÿøÀðÿ€ÿÀüþð?àÿüààÿ€ÿ€?üþð?àÿþààÿÿ€?øüð?àÿÿ€ð?àÿÿ€ðüð?ðÿÿÀð?ÀÿÿÀøððÿÿøø?Àÿþ ððÿÿüü?ÀÿðøýÿÿüÀÿÀ0ðøøÿÿ‡ü€ÿàÿðüü?ÿãþ€ÿð?ÿ€ðüøÿûþÿÿøÿÿàðþüÿÿÿÿþøÿÿà8ðþøÿÿÿÿÿøÿÿøÿÀðÿüÿÿÿ€ÿøÿÿøÿððÿøÿÿÀþüÿÿø?ÿøøÿ€üÿÿàþüÿÿøÿÿüÿøðÿ€øÿÿÿàüüÿÿüÿÿÿÿÿ€øÿÀüÿÿÿðüüÿÿøÿÿÿÿÿÀðÀøÿÿÿøøüøüÿÿÿÀÿÿàø?àüÿÿüøüð?øÿÿÿÀÿÿðð?ðøÿÿüðþð?øÿÿÿàÿÿøøøø?ÿÿþðüñÿøþÿð?ÿÿøðøøÿÿþàþÿÿøþ?ø?ÿÿþøüø?ÿÿÿàüÿÿðüøÿÿþøþðÿÿÿÿÀþÿÿðüüðÿøÿ€ðÿÿÿ€ÿÀüÿÿÀøüÀÿøÿÀÿÿÿ€ÿüÿÿÀøüÀÿ€øÿà?ÿÿÀÿ€üÿÿ?ðü€ÿ€øÿðÿÿÀþüÿþ?ðþÀÿ€øÿüÿàþüÿÿ?ðþ€ÿ€øþÿðüüÿÿ€?ðþÀÀøÿ€ÿø?üüÿÿÀ?àþÀÿ€øÿÀ?þðþÿÿà?ðþ?ÀÿÀüÿøÿÿðüÿÿà?àþÀÿ€üÿþþÿàþÿÿððþ?ÀÿÀüÿÿ€ÿÿÀüþððþ?Àÿ€üÿÀÿÿþÿøøþ?àÿ€þ?ÿðÿŸÿþþøüÿü?àÿüÿüÿÿþþþøþÿü€?àþüÿÿÿÿüþþüÿÿøÿÿðþþÿÿðÿÿðÿÿüÿÿÿø?ÿÿðüþ?ÿüÿÿàþÿÿüÿÿÿð?ÿÿø?ÿøþÿÿà?ÿÿÀþÿÿüÿÿÿà?ÿÿü?ÿüþÿÿÿÿÿÿ€þÿüÿÿÿÀ?ÿÿüÿüÿÿÿÿÿÁÿÿÿþþÿüÿÿø?ÿÿüÿþÿÿÿÿÿÿÿÿøþ?ÿø?ÿàÿÿüÿÿþÿÿÿÿÿÿÿÿÀþ?ÿøÿÀÿÿüÿÿþÿÿÿÿÿÿÿÿÀ˜ÿðÿÿÿøÿþÿÿÿÿÿÿÿÿÀÿàÿÿðÿþÿÿÿÿÿþÀÿ€?ÿüÿÿÿÿÿðÀàÿÿÿÿÀÿÿÀÀÿÀÿ€ÀÿÀÿ€ÀÿÀÿ€?ÀÿÀÿ€?ÀÿÀÿ€?ÀÿÀÿ€?ÀÿÀÿ€?ÀÿÀÿ€?Àÿ€ÿ€?Àÿ€€ÿ€?Àÿ€€ÿ€?Àÿ€Àÿ€?Àÿ€Àÿ€?À€À€?Àÿ€À€ÀàÀð?ÀüÀÿÀ?ÿÀÀÿðÀÿüÀÿÿ€Àÿÿð?Àÿÿü?Àÿÿ?Àÿÿ€?ÀÿÿÀ?ÀÿÿÀ?ÀÿÀ?ÀÿÿÀ?ÀàÿÿÀ?Àðÿÿ€?Àÿþ?ÿÿ€?Àÿþÿÿþ?À?ÿÿ€ÿÿð?àÿÿ€ÿÿ€?ÀÿÿÿÀÿÿþ?àÿÿÿÀÿÿø?Àÿÿÿàÿÿà?àÿÿÿàÿÿ€?Àÿÿÿðÿÿþ?àÿð?ðÿÿðÀÿÀøÿÿÀ?àÿÿøxÿüð?Àÿþøþÿþðø?àÿøøþÿÿÀ?üÿø?Àÿøøÿÿÿüÿÿÿÿü?àÿððÿÿÿþÿÿÿÿÿÿü?ÀðøÿÿÿÿÀÿÿÿÿƒÿÿü?àà?ðþÿÿÿðÿÿÿÿÿÿð?ààð?ÿÿÿÀÿÿÿÿ‡ÿÿðàà3ÿà>ÿÿÿÿÇÿÿÿÿ‡ÿÿ€?à?àÿàÿÿÿÿÃÿÿÿÿ‡ÿþüà?àÿÿÀÿÿÿáÿÿÿÿÿàÿ€?à?àÿÿÀÿÿÿàÿÿóÿÿ€ÿÀ?à?áÿÿÿÿà`þüÿÿð?à?àÿÿÿÿàþüÿÿøà?àÿþÿÿàüüÿÿþà?àþÿÿÿàüüÿÿÿà?à?üÿÿÿÀüüÿÿÿà?àðàÿÿÿøþÿÿÿ€à?àÀøÀÿÿàðÿðÿÿ€à?àðü{ðÿÿÿðÿüþÿ€ààð ü€ÿøÿÿø?à?ÿÿ€üÀààøþÀÀÿøÿÿà?à?ÿÿÀø?Àààø?€þÿðÿà?ÿø??ÿÿÀ?ÿÿàø?Ààÿàü€ÿÿñÿð?ÿü?€?€?ÿüÀ?ÿÿðøààÿàþÿÀÿÿûÿðÿÿüÀ€?€ÿàÿ€ÿÿøøààÿÀþÿÀÿÿÿÿøÿÿüÿàÀ?€ÿðÿ€ÿÿøøààÿÀÿ‡ÿÀÿÿÿÿøÿÿüÿðà?ÀÿþÿñÿøüààÿÀÿÿÀÿÿÿÿøÿÿøÿøà€ÿÿàÿ?øü?ààÿÀÿÿÿÀÿÿÿÿüÿÿüÿüàÀÿÿÿàþüü?Ààÿ€ÿÿÿÀ?ÿÿÿÿüÿÿøÿü?à€?ÿÿÿÿþüüÀàÿ€ÿÿÿÀ?ÿÿÿÿüÿÿüÿþÿð€ÿÿÿÿàþüþÿÀàÿ€ÿÿÿ€ÿÿÿ÷üÿÿüÿÿÿàÿ€ÿÿÿÿðüüþÿÀàÿ€ÿÿÿ€ÿýÿóþÿüÿÿÿáÿ€ÿÿÿøüüÿÿÿàÿÿÿÿ€ÿÿùÿçü?ÿø?ÿÿÿáÿ€ÿÿÿøøÀüÿÿÿÿ?àÿÿÿÿ€ÿÿñÿÇüÿü?ÿÿÿáÿ€?ÿÿüøþ?üÿÿÿƒÿÿ€àþÿÿÿÿÿñÿÇüÿþøÿÿÿÃÿ€ÿÿøøÿÿøÿÿÿƒÿÿ€?àÿùÿÿÿÿðÿÇüÿþùÿÿÿÿÇÿ€ÿÿøøÿÿøÿÿÿƒÿÿ€àÿðÿÿÿÿáÿ‡ýÿüÿÿÿÿÿÇÿ€?ÿÿððÿÿñÿÿÿÿÿ€?àÿøÿ‡ÿÿàÿ‡ýÿþÿÿÿÿÿÏÿ€ÿÿÿððÿÿàÿÿþÿÿ€àþ?ðÿÿÿÀÿÿÿü?ÿÿÿÿÿßÿ€ÿÿÿàÿÿÁÿÿüÿÿ?àÿøÿ¿ÿÀÿ‡ÿÿüÿÿÿÇÿÿÿ€ÿÿøàÿÿ€ÿÿÀþðþ?ðÿÿþÿÁÿÿÿüÿÿþÿ€ÿÿ€ÿÿÀÿÿøààþðÿþÀÿÿÿýÿÿþÀ?ÿÿÀ?ÿÿ?üðþ?àÿÿø€þÿÿÿÿÿøÿ€ÿÿ€ÿÿø`àþðÿø?€>ÿÿÿÿÿðÿ€?ÿÿÀÿÿàðþàÿð? ÿûÿÿÿÀÿÿÿ€ÿÿàþð?ÿàÿùÿÿÿÿ€?ÿ€ÿøðüàÿ€ÿóÿüÿþ€ÿàðþàÿ€ñÿøÿüÀÿøðüþàÿðÿ€€ÿÿÀð<þÀð€ÿÿøðÀÿ€ÿÿþð €ÿÿÿ€ðÿ€ÿÿÿððÿ€ÿÿÿþðÿÿÿÿ€ðÿÿÿÿàðÿÿÿøðxÿÿÿþð~þÿÿðƒþÿÿðÿþÿÿ€ðÿþÿÿ€ð?ÿüÿÿ€ð?ÿüÿÿðÿøÿÿÿðÿøÿÿþðÿðÿÿðð8ÿàÿÿÿÀð~?€ÿÿÿðÿ€ ÿÿøðÿÀÿÿàøÿ€?ÿÿøÿÀ?€ÿðøÿ€€ÿÀøÿøÀþøüÿ€øø þ€øøþÿ€øøþÿ€üüþÿøüþÿÿÀüüpüÿÿàüüþ<ÿÿðüüÿ€ÿÿðüüÿàÿÿðüüÿðÿÿàüüÿøÀÿÿàþüÿðà~ÿÿ€üüÿøðøÿÀÿþþü?ÿðøùÿóðÿÀüüÿðüýÿÿø|ÿ€þþ?ðÀüÿÿÿøüüþü?ðþÿÿÿüþ€üþþàü?ÿÿÿüÿÀøþþàüÿÿÿüÿààüþþÀüÿÿÿÿøÿ?àð?øþþÀüÿÿÿÿüÿàø?øþÿÀüÿÿøÿøÿÿàø?ø€þþÀüÿÿøÿøÿÿðü?ø€þþ€?üÿÿðÿàÿÿàüø€þþÀüÿÿðÿÀÿÿðüÿø€ÿþ€ÿüÿáÿ€ÿÿà?üÿø€ÿþÀÿþþáÿ€ÿÿð?üÿøÿ€ÿþÀÿþüáÿ?þÿàÿüÿûÿÿþÀÿÿÿüÁÿþ?ÿðÿüÿÿÿÿþ?àÿÿÿÿøÀÿÿþÿñÿüÿÿþ?ÿþ?ÿÿÿÿÿðÀÿÿÿÿÿóÿüÿÿÿü€ÿ€þÿÿÿÿÿðÀÿ‡ÿÿÿÿÿÿÿÿÿÿü€ÿ€þÿÿþÿÿàÀÿÏÿÿÿßÿÿÿÿÿÿøÀÿ€þÿÿøÿàÀÿÿÿÿÿÿÿÿãÿàÀÿ€þÿÿð?ÿà?ÀÿÿÿÿÿÿÿÿáÿÀ?Àÿ€þÿÿàÿÀ?€ÿüÿþÿûÿÿ€€?€ÿ€þÿÿ€ÿ€€?ÿøÿüÿóÿþ?€ÿ€þÿþÿ?ÿðøÿáÿüÀÿø<ÿàðÿáÿøÿÀÿÿÀ?àÀàÀÿÿ€À?ÀÿþÀÿüÀÿüÀï?ÿ€ÿÿ€ÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÀÿÿàÿÿÿÿÿÿÿÿÿÿÀøÿŸÿÿÿøÿÿÿÿÿÿÿÿÿÿÀÿÿ€pÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿÿÿàÿÿÿÿÿÿÿÿÿÿð?ÿÿÿÁàÿÿÿÿÿÿÿÿÿÿð?ÿÿÿÿÿÿÿÿÿúÀÿÿÿÿÿÿÿÿðÆÿÿÿïøÿÿÀÞÿÿÿÿÿ€ÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿàÿÿÿÿÿÿÿà ÿÐÿàÿÿÿÿÿÿÿà?ÿÿÿÿÿÿðÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿÿÿÀÿÿÿÿÿÿÿøÿÿÿÿ€ÿÿÿÿÿÿÿøþÿÿÿÿÿÿøÿÿÿÿÿÿð?ÿÿÿÿÿÿðÀ÷ÿÿÿÿþøÿÿÀÿþÿþÿÿÿÿÿÿÿþÀÿüûÿðÿüÿÿøð?ÿÿø?ÿÿø?ÿÿø?ÿÿøÿÿðÿÿà€ÿà€þÀþÿÀÿàÿÀÿàÿÀð?Àø?Àø€üøøøøðøüüüüüÿüÿüÿø>xÿø€øÿð? üÿø€Àüÿð?€Àü?ÿð?€ðü¿à?€ðü¿ð€üøÿÀ?€øøÿÀ?€üðüÿ€üðüÿÀ?€<àÀùÿáÿøñÿ€Çÿü?ãÿÿçÿþãÿÿ€?ßÿÿÿ‡üþ€ ?ÿÀÿ‡üÿÀ<þ?ÿüþÀ~ÿþ?ÿüþÀ~ÿøøðüÀ€þÿøøðüÀ€ÿÀð?àüpÀ€ÿÀð?àüøÀÀ>ÿ€àÀøü?ÀÀ?€ÿÀÿÀøü?ÀÀ?€þÿ€ððü?€€þÿ€ðøü?€€üÿàpüø€€øÿàøüø€€ðþàüþøÿàþàþþðÿÿÀü?à~ðÿþÀø?À<àþþ€?øÀ??àþ0þðÿ€?àþxþàÿ€Àü~þÀÿ€Àü~ÿÆÿÀÿÿÿü~xÿÿüÿ€ÿÿÿÿø>>øÿÿÿÿþðÿÿþø>üÿÿÿÿþøÿÿø÷øÿ>üðÿÿÿþü€üÿÿðÿø8ÿ~üøÿÿþüø ?€ü€ÿÿàÿðx~ÿþøøÿÿüüø|€üÀðÿÿ€?ÿðÀþÿÿþ?ð?üøøÿ€?øÿ€øx?ÀðÿþÿÿàðÀþÿÿüàÿüÀøøÿà|ÿ€ø|ø?àüþÿÿàñüàÿÿÿü~Àÿþÿ€ðøðÿàüÿ?À|xøàü<?þÿÿÀûü?Àÿÿÿøþÿ€ÿüÿ€ð?ððÿðÀþÿ€?€~|þøàþ?þÿÿàÿÿÿÀÿ‡ÿÿøÿÿÿüàÿÀðð?ð?à?ÿðÿÀüÿÿþüþüÿàþÿÿüþ?À?ÿÿÿ€ÿÏÿóÿüþàðÿÿ€ððà?à?ÿøÿàþÿ€þþÿÿðÿÿ€ÿþü?À?ÿÿÿ€ÿÇÿãÿ‡üüøøÿÿ€ðàøðÀÿøÿÀüÿÿüüÿ?ÿÿà?þÿÿüð€ÿÿÿÿ¿Ÿ‡ÿÿøøøøÿþ?àðøÿàÀÿüÿàþÿ€ÿþþÿ¿ÿ€ÿð?ÿÿÁþþð?Àÿÿÿ€ŸŸƒøÿððüÿÿÿüðøøÿðÿ€ÿÿøÿàü?ÿþüüÿÿÿÿÿàÿ~ÿƒýøÀ€ÿÿßÿþ??ðÿ¿ààüÿÿÿð?àððÿàÿ€ÿÿüÿðü?ÿ€üüþÿÿÿÿÿðÿ??ÿÃýü€€þÇÿ€þ¿ð?ÿ¿ààüÿÿÿÿðàøøÿðÿÿóø€ïàøÿÿ€øøüÿÿÿÿÿÿáþ~߇ûøÿÿüÿƒÿü?~àÿÿÿ€ÀøÿÿÿŸÀÿÀð?ðÿàÿÿãüÀ?çðüÿŸÀøüüÿ¿ÿÿÿáü?ÿÏÇñüÿüÿ€¿ø?þðÿŸÿ€ÀüþþàÿÀøðÿðþÿÇø?À?ÇàøÿÀðøüþ?üÿÿÇøþŸáøþÿùÿ?ð?üãÿþ?€øüà?€ÿ€?øÿàïàþÿÃø?àÇðøÿÀøøþþ?üÿÿÇøþßáüþÿøÿ€ð?üóþÿ€üüàÀÿ€?øÿàçðüÿøÿàÿàðüÀðø?üø?ø?÷ÿàüÿÃøøÿñÿ?à?øÿü?ü??üð€?€ÿ€ÿÿÿàÏàüÿøÿðÿððüàðø?þø?øÁøà?øÿáüüÿùÿà?üÿøü€?þð€?€ÿ€ÿÿÿàÇðøþûÿðþàððààøþð?ð?ƒø?ÀøÿÁø<øþáþÀ?ðÿð?ø?ÿþ?àþÿƒÿÿÿà‡ð~øþûÿðþàððààÿøÿþð?ð?ø?ÀðÿÁü<øÿáþÀ?ðÿðø€ÿÿ?àþ??ÿƒÿÿÿà‡øþ?ðøÿÿðø?àáÿààÀÿùÿþàÀø€?àÿüøðþáþ?€?àÿÀ?ð€þÿÁþ~ÿûÿÿàÿÿþ?ðøÿÿðø?ÀãÿÁÿààÿÿÿÀÀø€Àÿüøðÿ?áþÿ?àÿÀðÀü?ÿÁþ?ÿÿùÿÿáþÿü€?à?ðÿÿð?ðÀçÿ‡ÿÀàÿÿþÿ€€üÿ€ÿüøð?þƒüþ?Àÿ€?àÀü?ÿþ>ÿŸ¿ñÿÏãüÿø€?à?ðÿÿøð€ïÿÿÀàÿÿþ?ÿ€?€ýþþüðð?ÿÿƒüþÀÀàøÿþ?ÿÿðÿÏ÷üÿðÀà?àÿóùÿà€ÿüÿ€ÿÿøÿø?ÿ~ÿüüüððÿ>ÿøü€>?Àÿÿðþü?ÿþÿàÿøÿà?ÀÀ?ÀÿãûÿÀ>ÿüÿ€ÿÿðÿøþ~~üüþàðÿ?ÿøü ?€ÿÿàüüÿüÿÀ>ÿøÀàÿÀ?ÀÿÃÿÿ€ÿðþÿÿàðü>~øøÿÿÀûþ?þøø?€ÿÿÀøøÿøÿ€8ÿðÀÿ€€ÿÃÿÿ€ÿàøÿÿÀ?àü|?øøÿÿ€ÿþ?ÿüðð€ÿÿ€ðøÿðÿÿààÿ€ÿÿÿÀ@ÿÿ€Àø |ðàÿÿü?ÿøðàÿþøÿàþÿÀàÿ>ÿüÿ€ø€ð<à`þÿø?ÿððÀÿüðÿ€üÿ€ÀÿÿøÿÀàÀ?üðÿà@?ðþøþ€ÿðþ€àÀø?àÿÀà|ÿÀø€à?Àÿÿ€ €øÿ€À|€?ðÿøÿüÿþÿþÿÿ?ÿÿþÿ`ÿøøÿàüÿà€üÿ€€þÿ€þüüüþ?øÿþ€ðÿü€ÿ€þüÀÿþü?Àsÿüü?Àÿþüü?Àÿøüü?€ÿðø?ø€ÿðø?ü€ÿàðø€ÿÀðøÿ€ÿ€?àÿðÿÿ€?àÿøÿÿÀÿðþþ€ÿðþüÿÿðüüÿÿðüÿøþÿàøÿøþÿàøÿàüÿàðÿàüÿÀðÿÀøÿ€àÿàðÿÀ?ð?ÿ€ÿÀÿ€€?ÀÿÀÿÀÿ€?À?àÿÿ€ÿ?ÿ€ÀÀÿÿ€ÿ?ÿ€?àÀÿÿüÿ?àÿ€ÿÿø?ÿà€ÿþ?àþàÿÿþ€þàÿÿüÿü€ÿÿüÿüþÿÿüÿøþÿßüÿøþÿ¿øÿðüÿÿðÿðüüðÿðøÿøÿðÿàüÿñÿàÿÀøÿñÿàÿÀøÿÃÿÀÿ€ðÿƒÿÀÿðÿþÿ€ÿàÿüÿ€þ?àÿøÿü?àÿðÿüàCÿÿàþøÀÀÿÿÿ€ü?ðÿ€ÿ€àÿÿþ?ü?ðÿÀÿ€àÿÿü?ü?àÿÀÿ€àÿÿðøÀÿàÿàÿÿÀÿøÿ€?ÿàÿàÿþÿðÿ€ÿàþàÿøÿàÿÿÿàþÀÀÿàÿÿßàþÿÀþÿŸàüÿ€þþà?€þÿ?üü?ÀÀüÿ€?þ?øÀÿàüÿÿüðÁÿàüÿÿüÿàÁÿàþþÿýÿÀ?Çÿàüþÿÿÿ€Çÿðþüÿÿþ?Ÿÿàüüÿÿþ?ßÿðþ€?øûÿø?ÿ÷ð?þ€øÿùÿøÿóð?ÿ€?ðÿáÿà?ÿÃðþ€?ðÿÁÿàÿÃøÿ€ÀàÿÿÀÿƒðþÿ€€à?ÿÿ€ÿƒøþàÿ€ÿÀÿüþøü?ÿÿÿÀÿü>þøüÿÿÿÀ?ÿàøøøÿþÿÀÿÀøüøÿþÿ€ÿ@üðÿüÿ€ÿüðÿø>ÿüüðÿà|ÿ?øþà€þ?ð~?Ààþ€~ÀÀü~ÿ€3€ü?ÿ€vø?ÿðøÿðøþàðüÀðøààü`øà€?0~øøüÿøÿ`ý€ÿæÀ€ù€ÿ€î?ôÿàÿ`úü?ø?øý€û€ÿ?þøÿðûàó€?ðÿðÿàÿàç€Ï€ÿìÿà ÿÀ?ÿ€ÿþÿøÿà?ÿ€ÿÿÿüÿø?ÿðÿÿÿÿÿþÿøÿÿÀÿÿ€ÿþÿðÿàÿ€>Àðþðþ€àÿ€üÿÿþøàÿÿà?ÿ€ÿÿàÿÿÿàðÿÿðÿ€ÿÿàÿÿÿððÿÿüÿÿàÿÿøÿÿÿøø?ÿÿüÿÿàÿÿøÿÿÿøøÿÿþÿÿðøþÿÿÿüüÿÿŸþÿÿðà?üÿÿÿüøÿþÿÿÿøàÿÿÿÿüüÿðþüøÀÿÿÿÿøø€ÿøøàÿ€?¿ðü~þàøà0ÿ€?àøþàüø~À?àüü€øÿþ€Àøü€üðÿÿ?ÀÀüøøÿÿÿÀÿþ€ÿøÿøøÿÿÿðÿþ?Àù€ÿüÿàðÿÿÿøø€ÿÿÿðþøÿàðÿÿÿü?ø?Àÿÿÿüþü?ÿ€àÿÿÿüàÀÿÿÿüüøÿÿàÿÿÿþ€ÀÿÿÿþüüÿüÿÀÿÿÿü€ÿÿÿþøøÿðÿÀÿÿÿøÀÿÿÿÿüüÿÀÿ€ÿÿÿàÿ€ÿÿÿüðøÿ€ÿ€ÿ€ÿÿÿøðøþþÿÿÿààøü?øÿøðøüðÿàøÿÀÿàþ?àø?ÿøÿ€þ?Àø?ÿþÿÀü?Àüÿÿÿ€ÿàüüÀüÿÿÿ€ÿÿþ?øÀüÿÿÿÿ€ÿÿþÿðÿ€øÿÿÿÿ€ÿÿþÿðÿ€øÿÿÿÿÿÿþÿàÿ€øÿÿÿþÿÿüÿÀÿø€üÿÿøÿ€ÿø<ø@ÿàÿþøð?Àþüø€ü|øð0øÀøðð€ iaxmodem-1.2.0/lib/spandsp/test-data/itu/fax/test4.pbm0000644000175000017500000104125511150047204022103 0ustar julienjulienP4 1275 1745 +ùcùˆýÀÿÿÿÿÿÿoÿÿïÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿü+Øù?ÿÜýÐþÿÿïÿÿÿÿÿÿÿÿïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüûþØÙÿþÿÇöÿÿÿÿÿÿÿÿÿÿÿ÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿßÿÿü ëø_ÿÿÿoèÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿßÿÿüëù¸ÝŸÿ¯ÿþßÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿÿýŸßÿûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ@ÿÿÿùîÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÀïÿÿùîÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿÿûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀ¿¯ÜÿÿÿÿÿÿûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿßÿÿÿÿÿÀÿÿ?å÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿü ™ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ`ÿÿþ?ëÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ_çÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÓÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ ÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþàÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀïÿýßÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ`ÿÿ¿ÿÿÿÿÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ`ÿÿ¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿÿÿßÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ ÿÿÿÿßÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿíÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿïßÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿï÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿßÿÿÿÿÿÿ÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿÿÿÿÿÿÿÿ÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÐÿÿÿßÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÐÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÐÿÿÿÿ¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿø ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ°ÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿˆÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ°ÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿüsÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿà"ïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿèÿMÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿèü\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøð?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿòÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿôÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøwÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿô¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿü_ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÜÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿÿÿÿÿÿÿèÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ‰ÿÿÿÿÿÿÿÿÿÿÿÿÿÿø ÿÿÿÿÿÿÿÿÿøÿÿÿÿÿÿøÿÿÿÿÿðÿÿÿÿôÿÿÿøÿÿÿðÿÿÿøÿÿøÿÿøÿÿøÿÿøÿÿ€?ÿ€ÿþüøøøø|üŽøø€üø8€ŒøÈÜÆb„"†øˆìÆ"3Œf6„!ðˆÌ†"! f'Œø°s80àøˆˆ„b! fb˜a1H“ øˆˆ„FcDf°A#“𑙌ÄâD$Â"ƒ€ðù¡Œ‡cÄ0ÂbƒàøŽcŽ0†bƒ`ø„8‡cƒ@øÌ‚†á‡ø„ø„øÌððøøøøøøøðøøððøøøðøøøøðøüøøøððøøøøøøøøøðððøøøð<øfÀ#0ø& ÀABø ÀÀÆb€‚ø <ÌÀ€Àƒð 0ÈÀ€c¡°ä0€‚ 0ð 0ÈÀ€#30$g0á°€‚ pøf@ & @Àƒc $f1€† @øl`" pÀÁb2 8b1€Æ d™Ý‡ À@ø@60`€ÀÁ"28f1€‚€ÅˆˆŒIbŸ€xà@ð €Ìcc308f1€‚€ÁˆˆŒAˆfˆ€ÌÀ|üf>`ð €€ã1pb1€‚€ÁŒˆŒAˆfˆ€„ÀLÄf31cÏÄ@@ð€b³™† ÀÁˆˆŒIˆcˆ€„ÀÌDf333IÆf€xØ,Ãànð€™† `ÀÅ™ˆŒIˆ`Ј€„ÀìDf333ÆLÀÈÌLÃ`fðÀ(ñ™ŒÉ˜dÙ˜€ÄÀÀÄf#3# ÆLÀÌÄÆ B~ð ˜gÀÌÀÄÄf33€xÌ„ÇFÈ àÀ xÀxÌn333ÃŒÈÌ„Ç`l3m>6‚ˆ0@è@@ 31ã˜Ã ÀˆÌÄÆ`|3 2323€€0@€è@@ Á€ØÌÌÆ`L3Ž333€6~8€0€1€ èÀ Œ$Æ`D1Ç6333€"22=±™øáð1`ø„ňŒF v@ÃfF0a¢# #†v## 1™120ž3€„@0øˆÁˆÈF"ÀlØØ 0À?ÌAÄã2I&32#‡r"6 ±˜360’3ŽÆÇÌ@„bøˆÁˆHB&`D‰ˆ™``0€&H3ø>s2s0‚ " !±c601ÄDLÄfÄg1„ø ˆÁˆHCF`Áˆ‰ `óÌÆ02d‡€˜#0€Æ6c"!Ã01„LXÄ`Äb³°˜€ø ˆÈˆHCFÁ ™`äÍÈ13€ 0@Œ€˜ 0tc6q±™‹0„21ŒLXÄ@Äb1 f€ø ÈȈÈA„Á‰€à0@ÄŒ˜!“‹,þ @ˆÀƒ@ 0ó™™#pÆ61ŒDÄFÄb1f˜™ŒLŠðÄÍŒŒa†@E‰‰ˆ`00@„ˆŽ!“’Db À˜ÀÆfÁŒx ð8Î61ÌdHÄDÄb± f‰™ŒÄ ‘Øxð@dؘŠd000A‰†a3 DB``À˜ÀlF3!À 0Æ@É€1† ‚b&`€`ð311‘c ˜ÉÀ3‘™ Db102lìhó€`0À@@>8b3pÀ  Æ@ØŸ„1‚‚&2Íc0 0Ð 3#31‚c˜€`#‘™ Db!0"DDLÒb&ÇÃf1À@1ðÀ& LDØ1ƒÂ&2 Ɉc 6226( 0؃31²c˜ˆ 3‘˜Db302lDÌÀb,Ffb1™žÀ€€@xL ™€3#Â&2 Áˆc "3bhŒBGÀ0è# ˆÙ`7‘™ Db3<`DìÃf ddb1‘™’‰‡Ç €€Ì2 0Æ&2 ˆa2!c`ˆdf`30ð‹0 Æb308DDÀÆf dlb!™˜˜ ˆÍœœÆc€0 0À 0ærb1 Y˜aÀ`!c0ˆD&`c0ðÃf1 >lÄLÆf dlb!1™Žƒ˜˜ÁˆÈFfÀM˜¹€B008€ƒ1›8™˜aÀ"!cˆD&`c0à@#8ÎxÂæ,Ädb!‘‚™˜˜ÅˆÈBD@ʼnŒÄÀB 0xÀ ˜`€2&3b ˆDf`c ðÀcÇŒfæ1™™’™ ˜ÉˆÈBNÀÁ ŒLÀÂ0`À€b2&IŒdf`c øÀ&ž™˜ ˜ÉˆÈC„ ŒLÀÃaÀ 0`À0 ãÆ`60øà‰Œ͘ˆÁ„@Á ŒE€Æb`#1"Àl`À` 0ø  áÀÍ™ŒÆÆ&`"30@F`l{øl@pø€ xñùŒÇ€Æ'`&30ÀÆ@LiÌgcÆ1àüŒ€†0ÀÍÀÆ&&3"ÀÆ@ aÌfff30>||BÀüˆŒf,y‰Æ @`@Æ& &2@Æ@lAÄfff32FÄgc`øÈ„bdi™žfâ€Æ0`0Àfc`s3&ÀÆ@LaÄfff2`ÆÄb"`øÈŒcfa˜ffÆb@ãÆ6` añÆÀlàLcÌff2`ÆÄb&`øÈŒcdA˜ff†f`fbf237£€`€`|ãÌfff3 ÆÄb#`øˆŒc@a˜fc€„f`f&d3!#²Æ4Ìc†" €ÌfcÆ302FÌf#€ø Ìbda˜f`À„ff&D#!cF`ÄbÆ#±ð>€cà|Læcäød$a™fdÀ„ff&#!cÆ@D`D!0&23<~ccäø`fg€Äf@ffd##cF@DbÄ!0##$flßÌcø ø`fbÆ#373F@ÄfD! >##Œb`ÌÄcÈØaˆ€ø@ ø`"ã¶ÆdLdD#€&##Œs3ŒfbLŒÄcŒØØ`3€Œ`0`€@ø€ Œ~gLÌÌcŒÀ€a³€˜E–xü Ø` p@0 ü €p0ŒÎ#ÌøˆñðL²LÌLì` °@`ð €PpŒü™€™™3°F8 ÄÌÄ` yxd@@€ð €@CŒ€ñ¹³˜Gž|ÄÌÄ` ¸i˜lãÇ0à€ü˜Ø€Àc Àˆ˜A†ÌÄÀÄ` ¸a˜D&"f10:||BÀ€üˆŒˆØ€ÌÀc @ðŒŒI¦ÌÄÄÄ` a˜Db&f3bÆÄc#g€ñàd €ø‰ˆˆ€ŒÀC1 ?ð£Æ @Ï<|ÎLÌ@b  a˜D"'f3`ÆÄb2,3 v3ðð ø‰…ˆÈ€„ÀC30I$lðÇÀ0ÌÀf" a˜Äb&3`ÆÄb2f3b1˜Ø‘àxá!@ 0ø‰ˆ€€„ÀB30D˜Ç´À@`bcŒÎfb&3`Æ„b3g±À"1™™ 9“‘åž4lppøˆˆˆ€„ÀB3“Œ E˜Æ ÀÀ`FfsÂ302ÄÌb#°àb1‰™€! Òffcg±° pøŒÈÜÉ€ÌÀc3Ã$i€Ä8À@à|~æ3é²`b3™€!³ Øff b™ °sø€hÀc1 1Adq€Ä À&ÿûÀg3™‰€! df!b™°ƒø@31æÛlx˜ÄÀ0c™™‘€a`FcbÀñ2ø|°Î,Äü€ °ñ€q³³ ’dfbb`&ø„ dÌ€ À!,f#b &øÄÆ€ €€1ã9ó™f .ø8Ä1 ÀÀÀÄ 9Æ6øÌÌ™¸áÉ€ÁÀÀx`øðpÌØø™1"O€8˜xÁ€ÀXàŒøp0LŒÀ™1d€0Y˜°ã‡˜È`1`áÐø° Àc“3 ˜Ù牜Ø0`1áó#þ ð0`H‘æ Àcø“# `‘‘0%‰Èp`1†|øc23 |0Æ ð0` ̘¶  ÀcÀÆ£3 !a±“09›˜`!̈c"3 @p„ðø Ì‚  ŒÀe‘À‚`‚1Ç0#añp9“˜@!Í€cB3@À„ðp À˜ƒ@ˆˆÀ%ÆÀƒ`<9‘3²1Ÿ1˜@!Í€a¸C3&$xÈÄ9Œ ð10LÁ˜ƒ@ ˆˆÀ!¡ÌÌÀƒð @Ù†# ȈˆÀ8ÁŒ Àƒ @@bŒÌÆg’,¶>>  3ðxûá1‚# 0ÀD!ŒLÄ2#3lgð†!ØÌ ˜ˆÀÁŒ @ƒ3™21f&f61£ð`ÆÄÿ0€4x˜c€ð€ùç3Ÿfff&0ã`ÆÄp™™€ñá°FÀ €ð€ 3ãóæf0Ã0"ÆÄ™™ˆ“3sÀÀÀ@ ``ð€0!Â0Áà6lN™˜63›bÀøÀÀ@ à``ð1€€€36˜˜63‘&@˜ Ï$dÆ4pÀà € ð˜˜3€€ €€ ˜˜63›cLDÆbØ€ãÇ͇€ ð‰˜€Ì‘æ1B €€>>?€™™Œ’6#ž!ÀØLÀÆ`€ÆlLÆf>3€`ð‰1€„˜†2bLyŸ‡ð€ 33øÇóbs˜ À˜LfÀÆ@X€Fl Æbc1™žá†!€øˆ1€„†0b !ˆ‰Ý‹YðŒ€ 0À?#9ŸdÀ˜ ÌdÀÆ@È€FL Äbb1˜žbF,Š6 ø1ˆ€21€„†1bŒ!ˆ™ˆ‰˜ŒÄÀ ` ÀA>1€ø ŒfdÆf˜€Æ Äbb1;˜ F™1X£GÇ0ø1˜ð31€‘†3"Ìaˆ‰€˜ƒ˜ŒL€ |0 Áç™ ÀÂ1†À€1 6™˜fDd1Éæfb!˜€ð€„a™™™‰˜ŒÄ@@`ƒ8€DlŒÙ™ØÀÆ``€àæÆd1€&b6!1˜€ð€€˜ù™ŒÏÂB@ƒ €Dɉ‘˜€Ï<À`€1€B>;0É&Fb&!1™€ð€€ ÏÐüþæ‚3À̉‰‘±€‰,à@€30À 20AâÆb&1™€ð€@|‚#-€âÈ™1±‰L0 € €30À À0>3Ÿ˜ðÀ1€|x‘‘1ñ€Á‘Ìp!À1Ž8¡0À À0€ð00113üÃŒcÀ?ášI±˜±ðÀ À0àð p@ @p<9ÇÄ€3a˜`1™™˜À‘ØüÀ``Àø Pá B4ÐÌ€3aŽy±¹À™ˆŒÎÇÅÇ‹€  `À ø ˜dxc0Â6fdðà˜301ƒ ±€9‰ŒÄDÈÌÏÀ 0°À0à ˜b(c1C"b@1™°ˆÀ?01“M1€ù‰ŒÄDXÈÌÀ 0°{À@à ˜b c`Cb@q ˆ À@žY³™‘€™‰ŒÄDØØÌÀ 0°yüᆌ 6àaB a;bC bd0™â0@@` 㙀ˆ¹™Œ ,ÄG˜ØÌÀ 80`øaÌfbf1 >xlÌf#„3#˜ f0pјð f3ÀüÌ ÌȈÈC„DllNDb2 333˜‘€ÆfÆãÀ€Lfcä6# f ÁøÌÏÏŒA„@DdlDb3À33s‘€†`F`À €Æ 8 €ã ’è Á€îfDäLb3€33‘€†`Ä À À†ÁãáÄ á8æ0á¢ðƒãŒç3à332˜‘€„fÄa€€‡ã3âf (À@aÂà0s1ã™™€†dDAÀ€‹,xC&"8Dpððœ€à 0€ÎfÆ€À‰hCF"Äð‰°†€è(0 cÇ€À‰¦ `C0Æ",Æ1€ø<±9˜08ÀÀˆæl`Cp†bLÆ1à0†(`€8ø!˜‰²ÀxP0 €€íˆ €ˆÄD`@1ƒâLn1Ø0L³g™ø(Àø!™@HHsfÀÑÃî0 €þÀ€Ç €ŒÆL`À1bþ>ü1ˆ`͆&™ˆ™`|ÇŽ`€@ð!‚™ƒ3 B$À’cv31à>p6ÂF€ˆ|ãã#f@ 01ˆÀìæ›Lg›>æ`@à!™ƒÀX B,ÀÀb"13 b`;± Â@€€ÁÂÆ` L1‰€Àvù€ "1"b&,I`l`@ða“™ƒ@ˆÌBl@óâ"!#0b ‘ÉãÇ€ÀL@€ @`xp›ó Å6€àl&1†bà F`$yœhlð`¡°ØÉ’@ÈÌà 2b"!# c †±‰2H€øf>Dyð@`0@qóøi²&‰ˆ`Lf1¶bãÆ@$aˆdwaç0 ðƒ€Ø ÌÃÄÀ–b"!"c †1€3€ØffFI˜`31‰™1ƒ0ÈÀflÄyˆf`1ÌÌ~6À>?flš`F`da˜D"#&ð 31™€‹4H€Âfpƈ``3„ÄfbÀ<óÀlàlaˆÄb"3àÀ y÷€îf|Ɖˆ `<`3„Äbb€@@à „Äp0ÀŒÀLHÌÐ33±ãà< 0ð`„Ä €ŒXÀÌÌÀ£330Î>?ðã0ðüÏÀÌÄ @ÀŒÈÆLÀÀ£330Ä"313“b3˜ð€ØÆH@ÄŒˆÆLÀÀÃ30Ä"333b126À1‰ˆÈðv4a˜™˜’`±&3cÆÄÀÀ&`°DÉŸg08 Æ{€Ÿ3°fq˜ ˆÃ ±€ÌÈXÌÈÆd@HDFLÍÌ|1€€ðˆ³ f 1™&3c„ÀÀ#@ðL؈bøð9ñà0 Àb€„?˜!˜Ã Ì ‘€ÌÈẌÄd@ DÆÈÌff!€à±™˜"2cF„À@!àLÐÈb‰àXÜyøÄ bÁÃŒI±€ÌÌHÈÄfÀxDÄXÌff!€à€PøscbFÄÀ`!ÀFÈbˆÀ€LŒØÌÄb<ŒçÀ xñ€ÌÌÈ̈Äf€ÌÄÄXÌfdcáðð||xÌ3 ÄFˆbˆˆðŒ„Ä"døŒg?ñã`°€LJǜÆgÀÌÄÄXÌflcð`20DÇ™˜bˆˆ0ÝŒø„†4fÌB31#0Àÿ0fà|ÎnLÈÌfxCð` ÏÏc9™™03ȌȄ„4|ÌB3#À™0Í€ ` ÇÌf|€Cð`@™à9³€Ì̘Œ„8@ÌB3ãž&€  Ïð@f~€çó3ð À|üøÈÆdÌF33#fHÎ Á8€F³ððð€ðN<üæ33#&6@ŽÌn8óx€80F𘀠g33ó8&dxŒˆ0dIùƒX0Ã#A†€0ðɱ° €0ˆÀ,dŒˆ0dñ ƒ 1CàÃ2c†|xpØ€ð‹2@68ˆB<<ð À`€ |D ˆ0Dà ƒ 3c°B2a‚fÜ`™€>~ Ïž<ò08 ÁÆ`|ì˜ Œwº3"2ø@?pÌ@8ؘœÌŒ Æü`€3s É’dó;<ƒÎ@@<øù™ŒŒcÎ32"ðÀ`€ðˆÍÌ &F@Ÿ„!c Ù˜ÀC1³dÄnd@Ñœxb3Ì#2"8à€€ÇÌ &lL ‰€#c ÙžÀÃ1³`LfäÀ1ðÌ333""8ðL™€ 3# ˜ÀÃ1º8 LfàÀ±ñŸ¶fbð Ä6`qˆ¢DÃ1° Lg¸Ï>|Ã33L Lc8ÌfÛDDlÇ€h€ð 0õx çÃ0ÈfÃÆFmŒÀlxd ð@ 0„ ÈlsÄÆFŒÀÆÌ 6s,yㆠ8@à±±£3ˆ„ 0Œ À€È`äÆFˆÀÆÌ 3#$i3?ŸŒ8 @à3ÌX 3Ì €ÀˆdšdÆD ˆÀÆÜ7# `33ŒŒLÌxxb F0à33ȈñÌoÃÀ €À@<óÌlÆYˆÀÆÀ0#|aó!ˆŒÆìÈ™f3qàqÀ@Bà³3Ɉ 1ŒfDÆ@&ÌÜÇÃÀ0À@{À8îÏœÀÄÌ "cdc3#ˆŒÆL‰f3²`sgÁùñ‚@À ð3iÈ1ŒD@Ä``ÌŒÆfÀɳðÀ@@bð€À|x2rlc3#ˆŒÆɉ3Æ#"`&3ÌöFÆ<æ<$ð±3q€1ŒDgÄ``…ŒÄd@Á1›ŸøøÃÀ@b€~~có3ˆŒÆÉ‹3#"@f2Œ†lFfÆ"6ã`ð ðñ¹ó1pˆ1ŒDdÄ``…ŒÄdÀ€1‘ŒÈÄÄÏüxøãƒÀf1€`ÌÌ ™“sbc€f2Œ†ìF@Âc"c30<~1œÀ€`„`c€ffŒ†LF@Âc#â2fÈÎÉ€ð3?6`: ðññãç01™‡lÌL ÈŒÆÇçžd2 c30b33?ñùð3 0ð 0™ƒ0?ÄÄl XÈŒÄÆ†d2 c3 b331™›°1€ ; àÆ|ÏÌÌÂ,òf& c3àb1381ˆ 1 àÀ€øáϾgæ0²c3Àb123°;83Œl0Œà€ÀÀ‡p¾g3àf 3"338>ÌÌ~0 Œa`àÀÀÀ#3ð? 3631™€c86ÌLf< ±Ï†Ä`bàƒÀFxÀ033ŸÃ86ŒLf4†‘ŒÇ~!ˆ0 €àsð„hFÂÆDD"f~lÌ<üÀb@î `Æ9ÌÆfbc1l!b#,f33361‘ñð€às30øŒpDÂÆlD"fl3`ødFgþ>3aà`†@0`Ff0&#<0ã‚0˜Í˜&20Ì™šaçÎà8~|Æf>Àc1LŒ@Æ 2"13ù€ÀÌÌÌYƒff`0GÂ103?ûfc<0ó0˜Áž&20Í™b#Òà~€aiÆdƈ 2"13€ÀÏÌȃfF`0Fb3>8À#Æs>110˜Á†&20Ì™˜b"àBÆ8üÌ6f"33‰€ÂÀÌ Èƒ~B@0F"330ìüüð#c0ãð̉ƒf20ÀñŽc"àfÀÁÆg>Ù€ÆDÌL̆`F@0F"c0ÀÄd °À>cxùžbf0Äá‚bà8À0áÀ||ÄŒÌÙ†fF@0F"c0ÀÀ@Àÿ0>Ç08hù²b"à€À0 çü|ff`0Fbc0ÀÀÀÀ™ Ç€0ßœ3ç6@à1€p|f`†g #0ðàÀŽ&8€  Ïð8Œ@à8€?@`g >p0€Àø–~HÎdÁ8`À˜À9a€À1€€€&6@ŽÌ0n<óx€Á€lpÀ à8ÄÀÀà1€€&fpŒˆ0dI“ø€Á0D xÀ†ÀI1‘äd|ÀÁ< 01‰„,dŒˆ0dù‰€>à xÇ Ÿ™óñÀ@àH™„FÄÀÏÎ,{€6< 0€qùùü~D ˆ Lá ƒü LÌÜÀÁ‘˜ò`ÏÏ€p`À޹„ÂÆÀÌÄLi1‡ç€12  00ˆ0dNò˜`ÌÃ3 ƒ Æ NÈÌ€Á1˜"`LÏ€ `ÀÀŽ3„ÆÆÀÌD A1€†3168 qÀ00ˆ0ðB‘€pÌÃ"ƒÆ G˜Ì€Â1˜ð``ˆ `0ÀŒ‘„ÆÆÀÌDlA1€Æ23>>’ 1ð?b€0`ˆa‡FÆ C˜Ç€Æ˜°@@Á øp `à‘†fÄaŒÄLA1€Æ22? †031³1ñ˜ãà€0@‡?|@L A˜ÇĘÀÀa € ØØœ|à†<|Às ÄLC1F2c#æ031³™™³acð1ø @0p@| áŒÇŒ˜‡ìc€ˆˆ˜ v61ç8À@ Æ|ã00f&cFav031¿™ƒ36 ˜ ÏÜÜÈÀ @ ‚ Œƒ b€‰Ø˜ b&1í8à00çç&f@aˆ031°™â36 ˆgüíÈà8±àf € ‰€˜ bf1Œ0à <@á² 31±1˜r3& ˆfÈ̈ÀáàÄ ˜ ‰ˆ˜ b`10àˆáÀ9ð;231™23 ˆDÈ̘€@ 0€ñ˜ˆ˜ b`10ðáñó™#3&`ˆ L˜ˆ™€ |À`€ ˆp f"1°ðÀÇ1ãð9œ&Œ˜™ù€ rldxó€Ã€`€f<3‹0À €ç ™áù˜ €cDfÌÖÀÆÀüxဠ`!€€€à0@€€ €c,BÌÆÌ`f{&ÏŸœ„`q€€€à0@€ÀclFüÀÌ`Fc6™ˆÄ`qðð€€ààgÛXØà€0cDFÄÀÀÌ`FC÷›˜ˆÄ`!™<ñçã!€€@ àÂ$ÈÌÆ€ñø€ 0vlfÌÄÀÌ`FC؈Ä`!˜$“cc±€p€À€@à0ÌÌD€‘˜ ‰‹ŒÇÆ`€|4|xÆÀÎÀFC$؈Ä`!ø?0Ãb#1€˜ŸøqøÀ€@0à<ØŒFˆ ˜˜ŒÍægç331™™“±ùŒÇ€ã@CÀ@=óæs±‰˜ˆ‰€ˆÇƒŒ€ÌL ˆ3ü8ÄðŒg¹œ ™™˜ƒ€&fb3ò1›1˜˜ŒÄÀcãç1ø@1û€Ù™ŒˆŒÁƒŒ‡ÌLˆŒ3ŒäLÆ6ðà ƒ&fb 31°û˜˜ŒÌÀC3"ØÝŸˆÌ|à‡œùœÉ™Œ„ÌL ˆŒ3ŒDLÆbàÃ>3à;133"1™àƒ˜˜ŒÏÀB0bˆ X™ŒÄf6æ6~ÀoóÙÄÌHLYˆ Œ3ŒDìÆ@àáóç3™ð‹1˜˜ŒÌC3bˆ˜ŒÄfbBc3À À`ðÇÆŒæÙ˜ Œ3ŒDÀÆ@à8™øñ³1™™ŒÌÀB2"ˆ˜ŒÄb`Bc3 Àbð€˜Ì3ŒÄÄÆ`àc3™ÏÇ€b3bˆ˜ˆÄb`Bc3<ðx„€À"x€1™ÌÌlÆfà@ €&3ó09œ Ù™ŒÌbbBc#D‰˜ÎÇÀ øÀ` €F<àÄ à€È~fvF#3ÁˆÄDÀ ldÌCâ> À C€`Àg>sÁˆÄLÀ DÄÄFb;±È`x`@À  B€#Áˆ„DÀ DÀÄDb13ØÙøLj`€@À ÌÎ>ãã"ʼnˆÄG€ DÀÄDb13q™ LÌü`<,€À ÈÄ"#Ìããó9‚  |ù˜Ìgˆ DÀÄDb16a› hÌD`3fãó1Â@àèÄ"# C1™‰³ãâ> HÌçÈ ÆDÄÄb3qƒÌxÌD`0bb#œÇÏÀ@À`Ä"ã B1˜6b;~|ðù @€@ hÎ|Ççæ3ù‹ŒxÌD`0B"#‰ˆÌFÀ,~>@à0Ä"# B1˜6"13c=™9˜ùãÀñ€ À1ˆ@À @&3?¹˜™˜ hÌD`0B"#ˆLd`fbc# ™ƒ6Âl˜ŒÄ€Ù³ÿ?9Æ a@# Îp;ffs1™˜Ld`|bb˜ˆˆŒÌL@fv<ñÀà g3¹›‰’6b3?c#™ƒó€ÇçŒÆ‹3“1œÆgÀæls@> fsñù™ˆÌD`dbb°1øˆÈÌ @bbd{`Їóãç3`b!™‡ÀƘŒÇ‚³1ˆFD@fDcð||pÀ ŒçÎ`nfb°1€ˆŒÌ|@Bbl@`ð3`~qñ¹¹‹$ÀÆ!™ŒÁƒ¿1ˆBLànFc0lDÙàB>g?9™0‰ˆˆÌL@BclAâà!`` Ðøùç€Ãm™ŒÈ‹°1ˆCOÀoÄcDÆÃ0@0ùÜ̘ÌÌ@Bb@Cgà3`ÁÇœï›33±1ˆCŒ@;„cDÆãðà‡Æ|àffDB`à`qã3Ÿ1ˆÁ„@;„cÄÆ3æ>~||ã`à `ŒáÀ1Žc0ÄÆ›Æb2`à  38 î|ó Bc#`à 08áàÂc#àÀ  Âc"À˜ , Æb"ÀÈ L f6s ÀÈ L # àÈ ü àˆ à œ "à "Î à ù€ä lj€Ð `Ï €3ƒø€ôÀaŒÀâðà0Ãáøñøø0€Àˆ€Ãðü 0ƒq˜™ˆÌÌüÀ€ÇpŒ ðü 0;>0@ˆˆÌÄÌÀ €G01Œÿ0èŒ01€Ã8à CˆøˆÌ„ÄÀð‰€g!Á† 1Ì™0èÂ0@1@ 0É™ˆÌ„ÄÀ€˜€i#"Æg1È Bàb2bg1€€ǘ™™ˆÌÄÄÀ˜€i£0FLÏÈ& F óäb flÍ?€‡a†B0Œá˜ùœÌÌÌÀa˜€yÃóÂLÌH0v,Æ@ “ €þ0sâ flÌ6€‰"F3ãáÀ8B0àÜŒxÌÀs3™˜€1ÃÃŽÌp0flˆ801"ìg 1˜Æ  ˆ&F"20ÀÆDÀÂ'bbf3 ?Æc1ÿ? 00@0€ €pÌðŒùˆÌ"Æ" ˜G0˜00 Ÿóö2è œfæ230@ÄD €Â&"~3 0Äb1™“€ 000Á¡ˆ0`8ŒÙÈÌ2gÆ" ˜L10˜ 0›³¶"ê`#qç7ÀÌÆ ÀÂ&""`1@0Äb1™ƒ€ |<>Á矞#3€@†"bf3O˜Ì3 °1 0“#&&ê0ÎÀfcfbb1À0Äb1Ÿ€ ``0ÁÍ#óဠ˜ Ì ð2 0#&&xî!Æg<a€0Äb1“€@``Á‰™˜c³ a€ † à 82bdlþÀ€pÇç1™“€@`` c"˜ƒ @€ 8˜ `ž2bF~ö†€3¹Ÿ9˜âb`c"ùÍsd@€@(9˜€`@@Dfþ¶€þþ~ƒ“&€B"Ȉ&c&~@ŸŒæ À 1˜€ €@@ÿ ºà 8€âf`˜$B&d@ŒŒÄxóØæ`p1˜À €À÷€0ÀÀf `‘lBfd@ˆÌdÌÖHÆ`vp1˜ŒÀ 3ò`Æ700À@G ‘lÆfL@ˆŒhìÆÂ@b`1˜ŽÆÌpÀ1øE“?˜01ÀGˆá³óš|ÆdÌAŒxÀÈÃ@B`1ŒLÌØÌ0ÈÄÈÁ€b`1ŒHLðfÃó2gcÀ1ã0Æ`àþЈ"!0 ð‡à `ÄiŒˆcCc`@Ì€0à ÀqÇœá€f`1ŒLL8lóÀÂ0b"`1BÆ àøøÈ2aà0`À `Ä9ŒÐa¸Câtüxð!`Á`À`qÀ¸bb33È™ 2&f`||Ì|c€ãÆfw1¹˜È³1˜ÈÀc3¦3 €Ä!30ÌL žlF~öô?3™ð63Æf„Fbfbb3óIÙ€"ff@FÄÆv7<€c€1ùÏ»˜ŒÀc33Ä!30Ì̈ÆF33˜üÿû3óÆÌFf ffb3aÁà"~/@FÆDbc$ ÌÀcñà<0x€ÏœÀc13Ä!30Ìì ˆÆF3#ˆÄÿï€Ff >f&3#q€`b`;€FÆDbc0L@c30ÉØÌ|>|@#0áãÎ330ÌÀÆF#!ˆÄÿêð0 ñç0Û`bb9€FÆD"c<L@c30ˆÌfb&v2fÇÀÎ30ÌÌÆF##ˆÄûï`qÀw<1€fÄÄbc L@c3ðýˆÌfbb`df³8€þÀÌx˜ff##ˆÄÿ¬€||~g'l ÌÀc3ˆÌbB>"`df“8€2À0Ø8~s7˜Ì€ïî@ÆgxŒàc300‰ˆÌfbfb`( &9!0À80€Àüø€ÿn`ê#1à8Ù˜Ìfbfb`8 &M‘ð0`8€0€€ €Àÿþ` h|æ?~g68f M™0`l†0 €Àÿÿ`˜ 'ÆÎ“0ðl‹Ÿ?pÀ€Àÿüf#œ ?» Ž0p|±3˜üÌ8Ì™ö`sÁ€€@` ïý€2 ˆ ŒÃ€2D$3ddòÈI‹7 9À À„ †3™`63âf~|~É™†@bE˜ Ÿ˜€`0çý€ó`ȈŒÁ€&Äl"ddF˜A‘; Ió3"` À@âÀ†9Ÿá20Âf0 CÑù‚@`L“ÈØpq `0çýàBqÅœÌÀaFÄl&LDÆq124Á±³b, <Ì<Á " ダÄaãàâ`~0ŒÃqƒÀcÇ1±ŒˆÉ™ðØÇÌ`€`0ïÿà À?†Î|fLL„3"0ƒ13"&i€$lHcóâ1È@GÃÌ`<xـÀq‰ƒ€fC1±Œˆ‰˜ˆÌÄb@|8pÁðÿÿð€lóDÌÈ„3& ƒ##&$qÀllÈ㳦3EœÇ™ŽgÃ0À`Ù€fA1±ŒØùˆÌDf`fLÑ#`ÿÿÀà‡Ó2&@`‚#"&l@àLL˜ã3&" ˜ÌŸ’e#ñ˜â€a€wí˜ ‘±ŒðˆÈDgàb Ã6 ÿÿÀÀA@88â2cnlÀ XȘ c"$& È™0i¡™˜2b`€ €Ÿ™Ìð‰ˆÈDfb|ãö ÿÿ€€@"c4nq`|¸""dd˜™i¡™2"' 1€ À8Œü ùÛŒÌÄfbL3 ÿÿ €!€HØbFNf™‘9Áø2'@ÄÀ1€ŒÀh08ŒÜÎÆæ@fL& ÿÿ°pÀ`w‡„gŸ9Ù&8Á€à~7@gà1ðpŒÀ`aáÃ@ˆÂcÀ||³&pÿÿÀpÀ` Ž<€0Á€à 9Àf`1˜˜øñƒ€À`c3a`øÀ!ÃðßÿÀ0€ ö` €0ƒ˜ðc"9€ f`1™˜™™ÎÍÀ|àc2! `ÀÿÿÈ $hæ  A‚>€ f`!™ø™™ŒÌÈÀÆ``0aŒ`Àÿÿø ž$fLB A f`!™€™ùŒÈXÀÆ@``ᙜfx€ÀÿÿÐ,BD8@ à0€f`!™ˆ™ ÈXÀÆ@`Àa˜Œd|~yð@?ÿÿÐ ˆ0FlXHb~ €†`3™Ð™™ ÈXÀÆ@`€!˜ŒdfFÉ03vãóÂÿÿ€ È0f|˜x4#"F6<0`˜ñœÌÌÀÆ@a!˜ŒüFFã00c3#ïžy€€ÿÿð ˜8&ÌØÈ# f3$ €ØÌãᇀc€€ÇÀ|àcòa™Œ¸FÆ{ð0c"3ÐI˜€ìx÷8ÿÿà ˜lÄüÀ#!Æ#0€ÌÄfb"g³€ðð€0cãÁ0Œ8FF0c"3œa˜ˆ€ÆÌÓ3<ÿ‡ƒ€ÿÿ ˜f`FÄÂ#&F"<€ŒÄf"6f³0Ç0`Žæf›1b"3 yÈ€ÆÌÂc0ÌÍŒÌËáÀÿÿø`ll€Â&bff" €ŒÄf"7æ3˜Ø™?˜xÌ`F<ñà;fc3ˆ€ÆØÂc0ˆÁŒÌ€™3"g€ÿÿð€þfvfæ#L€ŒÄfb6ó˜Ø™1ˆÜÌ|ð<ñà `BÀ€üyÇ60ÌɌ̃4&ÿÿÀ`óñ¸˜™˜°1‰ŒÄäð €ÁŒŒÌd"I&33B€ÀÀ1ÌÏŒÌÙ“4&ÿÿÀ`ØÏ™3‰ˆÌÀ0€ÁŒŒÌd7a†33Ž`€À ÀÀÇÛ2&fÿÿÀ‡3™ÜØÌE€ÁŒŒÌd29æ13F`ãáÀ1€À`ÀããÆ?ÿÿÀ x|9ð9ñ€eŒŒÌD f3>f@Â#`yÇ`0 ÿÿ¨`A€<ùÜÎÌ2Ï&38 f@Â&0A‰˜˜‰Ÿnx8`60pÿÿ¸p‚ yæ3> c€Æ'àqƒ˜˜ˆFH˜X`xü>"pÀ ÿÿøcc# 3 c€Æ&9˜˜ˆF`˜X`Ldf`ðÀ@ ÿÿðb!à !ÀÆ" ‰™˜™ˆÆxØØ` FF~¸~?aÀ ÿÿðcaà 3fsàÙ™˜˜™ˆÆØü`|FÆsøf;±ÙçÆcÀ `?ÿÿðb  ™ÏߘfȘ`ÌFÆc0˜fˆ¬fDÍÀÇüd 0`?ÿÿøb!ã>xœ`ÌFFc0 fŒŒfLØÀÆfr#gþ|0 0ÿÿøcbc`|æn20 f1ŒfØ€Æfc"ff&v1ãñ° ÿÿø!Æ30`>>3 f3‰ŒcŒ€ÄFc&fbfb1#™Øœ4ÿÿà`0ç3¹™ŒcŒ€ÄFc&fbvb #ˆˆˆ 63Àÿÿà`039ñÇà ØÀÄFc&b`b!ãˆÈ "3@ÿÿà` À0€ÀÎffb&fbb##ˆÈ "3ÿÿàB @p€|cÆf&f3# ˆÈ b1ÀÿÿøB À€`f3󙈘 b0àÿÿøü8â @`qœœf2`ÿÿø€Ã€ìlÃããà0À@@@È`g3ÀÿÿøàÁ8pDÄÂ&6`3àäl>8F`Ìs?ÿÿø`ÁÀpDüÂ&6 3fLFlF`f0xpŒs?ÿÿà`ÁÀ `ÀÀ DÀÆ&6 3€nÄÆDF@#$ØØ ~xŒ6 ?ÿÿà`÷,€ @ÀÀÀ@ ÄÄÆ&6 1Àk„ÄüB@"0͈fXŒF €ÿþààÃ3 ÄÇ€`<|ÀÀp?cÀ îlÆf&`0`3„Ä`CÀ"8ýfLŒægœpù !€ÿÿðàÃ30ÄDà&v7 GŒ ÀÀ1#c€fsãð2@3 ÄDÀ" ÁfFŒ&l˜Øßø1€Ÿÿð`Ã0ÎÄ`bbüc–løøpáÀ0ab€À3À1~lÁ€"‰ˆfGŒÂNˆŒÉØÜxðq ŸÿðìÃ0 Ì`>bb b0ÄÌÌÈöà00c€Ì8á€?lÙ˜ f CŒ&ãG،̈ŒÈð1ððŽÿÿðÌÃDÄD`fbb bÀŒÄÌÄ@80p0€ÿÿøaÀÀ8|À|ù±ŒHÈ 3œÀ0d`Dffçþ> 0p`€@ÿÿø@l€€ñ‡œÌ1˜Àdœ $` fF#3;0Ø`@<ÿÿøÀ @À‡ÀŸ0ñˆÀý€L8`|fF331³0˜`ñðà0À`ÿø€$mÍÌŒÀ€Àüù€8l8@`LFFb#1¿0ø`™™ÙóÇÄ€0 ÿÿø€flŽÌŽÀÈÿ`€À0 ÁáÃÌ €?Ì0Àf`LFf#1² œ`™™ŒÆM4ÆÏÀ>p  ?ÿÿØ€DLŒÈˆxˆú`€€0 Ã#gÄxxøÀ@d`|æn"#1°0 `0™™Œ†l0Ìf`b01øøŒL ?ÿÿÀÀDLˆ‰ˆ˜Â ~pÂ6dLÌøðÀ€`À@@@>óçs322 `±™™Œ‡Ï8Ld`c ™ˆÌLnf<  ÿÿÐÀDɈ‰ˆ ˜„@33 F2dLŒ€1ÃÀàÀÀÀ#>s`p‘™™Œ„œÌd`c ‰ˆÄLÆb&`<øù˜ÿÿðrh™‰˜ °„@3# B3ÇÆ Œà0ÀÀðÀ@8€0@?Ÿ™Ù†I¦Ìd`c ‰ˆÆ„Æb $ɘˆÈøxñÀbÿÿø œ˜™ù„ƒ°# Cö`FÌøpÀÀ°ÇÀ@(€0ñÃÏ|ÌÎ`b ‰ˆÇŒÆb>`8߈ÌÌÉ›@bcÀÿÿø€ñ‘!°# À6`F|pÀ€° Ù™xÀ8ø@ €0€ÇŽ`>p9™ˆÃ Æbf`ˈ܌›&b@ÿÿø32# À6`F ø0À€ø Ù™™šHÀLìxFgÀ`1€ € 1˜üà Îff` ˆ€ŒóÀ4`Àÿÿø>3ÂfdÆ` 0À€ß™™˜ÀLDLFm™ >p8ð @ € ~>>`lɈˆŒà4cÀÿÿð ÁÃÇ„ÀüÙ˜0À€˜˜xÀ|D FLb`1ØØ@  8qøüÙÌÉ’`f@ÿÿà€`@pðáÁÆ ™˜ÈÀÌDlÂGÀB`1‰˜€  ŒxóÀfÀÿÿèp Äß™˜ÈÀÌDÌØàB`1‰øŸ>ÇŒ0 ÏÏ€càÿþø Â8üÀÜÆÌɘ B`1‰€“ÄŒÌxœ0ŒNÏÀÿÿÿøÀÀ@|î|á» f`1‰ˆ @ÌÌÌ’1ð<> Œ »0ÿÿøÀÀ@€ÀÀÈÀ?ÿÿøyóFc#LL€ Æ  l˜ŒÇà 613°>ùÇ0€ pñÆÀLdLl0ŒÀ?ÿø#ó æÌÈ Ä EŒhŒÆ|÷œ1€1zc 26|xxþÀ €GÇÎÄ@F`ŒÀ?ÿÿø p|ÌÌL™ŒÄ@ÌÏ1ñ@c "c@LÌÆ ÀÀ@†@>|ÌÍ€Âb ÄÀð>3?1™˜ ll`<|ÀF€ ?ÿÿø ˆHÄDF`HÄffÇÇÈø xyþ6٠Ā0f321™ ˜ D8`3fwãsÏ1Æ€0ÿÿø`ÄXDF@Ä$DÄDÈÌÌ ùã qóüÉ0f311™ ˜ ü8` Bf"3Ù´Ù?ÇÀ€0ÿÿð™ˆpÄÈÄF@ØÄ$@ÄLÈÄÌ k&b1çãö`p€ 1À>3;1™›˜ À8``Bf"°Á™€ÆbÆ8€0?ßÿðñ€Ø0ÄÈÌF@ˆÄ8EÄDÈÌÌ c6b#""6`fÌÌ~qÀ3™ù¸˜ D|``Âf"3œñ1™€ÆbF3"<à>1?ßÿð Ì|ÌÆfØÌ8 LÄGˆÄØ Cö"#b&@`ÌÄfc@ølÌ`3Æf"311™€Æ`Æ2c0á 33?ÿÿð xÌlLÌFÄP B"#"&@@„Ìf#€†`?~fc3&™1™€ÆfÄZc á€1?ÿÿðÀŒÇÌçØÌø C&b"&€@„Ìf#€€Fcç>Ó™€ÆfDÜc àà!?ÿÿðÀ ü ãçcs&&#€`„Ìf À€ C9€ÆfÆÌb ð0!?ÿÿðà@„ááçsá€fÌÌf``€ FcæŒ&a±0# ?ÿÿà ÀŒ`ÙØ1ð 0 ÿÿð5à`‰Œ‰‘1™¸ˆŽ€0!ÿýà€1æ ùŒƒ1™2ÌÎÏ9ö> 8?ÿýà€1C0`1Œ°1 Ìi0ö373c@€` ?ÿÿà€ f3€Ap`À`0‰™°1°>ŒÌl0†3323 €øà€b?ÿÿà€üf1ØñøA€p @`8Ù™™‘1 2ÌÌg0†33:3€˜ ɘüãÇÂb?ÿÿø9€ F!ˆ˜ˆA€˜ H  1ñŸ3™ð6ÌÌA°†3>þ3€ø˜ÌÆgÍÀqø`0?ÿÿø€ F!ˆˆA€ØnÃÎ< €ø?ÏÌÙ1†3<Ü3€øxØÌÆf˜À˜Üfxp?ÿÿð f!ˆˆA€˜ffL&"f<|0 @€Ç3>Œ3€˜øØÌÇæ˜ÀÌ Ážb6|Ÿf8@#?ÿÿð0 f!‰˜ˆÁ €DfL"bF3< ><ÏŸ†0À€?Œq™À˜Ø˜ÌƘÀøŒØb& ‘2f<óÇÀ€Àc?ÿÿà >3™™ˆÃ !€DgÌbcB!0 "&X‹1æcÎaÀð#™ÀøÙ˜ÌÆf˜À˜Œ b~ °`f4Öfcg€xàc€?ÿÿà˜¹œ€Ã3 €Dd bcB!0 "f ÈÈ1¦f$cgà80#ÌgÆŒÁ˜Œ b` 0°`f0Æf&,ÀÌÀcñà?ßÿÀ€@#@aÀfdLbbF!0 "p ÈŽ1†f&301øÇÆ>áÇ€ùÌ ™fb`°`f0Çf& ÀÆÀc10?ÿÿfc†f&f10 b` ȇ1„f&201ÈÆb31™ÿ€˜ç6`±bf0Æ$ €†@c0?ÿÿÀ>0 ff XÈÃ1†f&201ˆÆb31ÌÀ`2n0Æ& „Àc°?ÿÿÐf<ÏœÛ1†f$&201°ˆÄb3ŒÀ€>1ÃFflÀÄÀc?ÿÿÐÎ1ƒçæsb010ˆÄf3ˆÎ8ñó€€!Ç€|àc1?ÿÿð€ !Ç08ŒÆf31˜ˆÆm±ÝæcÀœƒ€À`31à?ÿÿð€ œÎf31¸ÌÀ`™™&c"Üûƒ0€€ ð?ÿÿø€ 0ÙÜÀxñ™™ƒ†b6{›€ƒ9ðp€`À?ÿÿØÀ€ à±™˜Æb7A™€Ã1ØÙŒ|øp€03?ÿߘ剈ÆÁà¸`M‘™˜fb3ÈC™Ã1‰ŒŒÌØp?9Ã3 ?ÿÿð ØŒÆfbGaf  `üÀyù™™‚fb0ÈCŸÂ1‰ŒŒÌŒ`12=ÍáÀ1?ïÿ° ØŒÆd F"&`6LLxà`@À€>çãdÈcžb1‰ŒŒØŒ`1³0˜Í33@|f#Ž€1€`?ÿÿp ˆÄd f&@`ÄÌͰÇbaÀÀ`€?nj㙟00c1‰ŒŒøŒ`1þ ˜Ì#3Ìf3™ž1€@`?ÿÿðŒÄd"f&@`†ŒÍ€óFãœÀÃ`€1pðŸ 8w1˜ÈÌñŒ`1ð ˜È#3€Äf3™31€|80@ ?ÿÿ茙ŒÄd&F&€`„ŒÍà Cdð‡ç€‡08˜ð˜€œøüýœ`1²!˜Ì#1ÀÄf#¹31€ÌLÙà>8 ?ÿÿàÏÆfff"!€`ÄŒÀp`ÆfÀ‹ Ç 1`0&<9ˆ0@€Œ p?6q˜Ì30`Äf30î?3€„ÄÉ 330Ÿ|æ@`?ÿÿàfsá€&ÌÌÉ0`ÆC€ž Æ"2`<~nQˆ3>6 Œ0!Ïœw6ÀÌf#1Î03€„†ýÀ3!0ŽFffbÀÿÿàx|yæ`ÄA˜`Æ6"&`p6L‘1Áãã€10& ø03€|~sÎ03€„„Àà3!°ÈÆddf`?ÿÿÀ9ÄI1˜`„3&&``dL±0ñ331  0 Ä3€ÌÄ€03!0ÈÆddf`?ÿÿà€N1ùžxÄ 36nf@`dxùø0;31¾ #9ÀüÌÉ0310ÈÆ8Dgà?ÿÿp8„`q¿~fÀbD010ó‚ €Àqà3;0˜F8Df?ÿÿðþNq€132 |Ì0€@|0æf@?ÿÿðùpã°23 L ÌØ±àxã`€@@ ÀcãÀ?ÿÿðƒÀ€ ˜à3ñãó"2 Í‘ I³³çÎ8‡@ÀÀ?ÿÿðÆfF€?Ì€ˆ0>~&| Ü1€ÁcÛ9€|8æÄ`?ÿÿðÆ$lÀŽ&l€ø"Ì Á±€sób˜ÌÀflÆf|qøÀ ?ÿÿðÆ$dÀ” €`Ì H‰€â˜ÈÀFÌÆdLÙØü||À `?ÿÿð„$g€„ €€À@|Üɱ€›b˜ÈÀFüÂtÌÌÌlDÌlÌ~>„€`?ÿÿð„&䀄ƀx‡À;€Œqó€ù³6b3˜ÈÀFÀüýøŒDÆÄÌÄf&ÇÃà8?ÿÿð„ lÏÂ1„ DÀȉ[ñÀÀb€ ãã癈ÀFÄøÁÀŒDÆÄìÄbfÆf`2l|cáà?ÿÿà†`lÀ1„ LÀÀ0ÁgcÇ€ÀŒÀbœÀllÃÄÈŒ DÆ„ÀÄb&Æd FÄc3`?ÿþàÆdLÀ„ L€a0f6f‰€ÌŒ|ø€gÀ€ a|ùÌ ÄÆÌÄÄb<Äd `ÆÄb2 ?ÿÿð‚‡€  L€™10æ6fˆ€ÜŒŒÄ̘Ìg>áÂ@À€À Œ î|ÎLÌb8Äd``ÆÄb2 ?ÿÿø0 Ì@Å™†0f6ˆ€ÜˆŒÀÌøÌb33cðøçŽ€n8Îg>Æf` ÆÄb#À?ÿÿð Ç€iÛ¶™f6ˆ€wÌÀÌÌB30#0ÌÇ›‡€fÎgà2æÌb3€?×ÿðSŸ³æ&F˜€gÌÀŒŒF31ã0ŒÆ1±ˆ›7øÇB8~g3ä?ÏÿÀCŽ™ÀbÌÄÌÌF33c0ŒÆ1±˜3#ˆÍvt?ÏÿðÌ}ÌÌf33#0ŒÆ1±˜?cˆÌ0?ÿÿð€|ç33c0ŒÆ1±˜0cˆÎ ?ÿÿðÀã09ÜÆ33˜±cˆÃÀ?ÿÿøFŸ›3ˆÁ€?ÿÿè@À`œÛ?ÿÿÀ ?ÿÿð@$wcb1À ?ÿÿð`&""33`løØÀ ?ÿÿð`"&23Å˜ÆÆÀÃŽ4?ÿÿð&"&23€ÁˆÄd@fFL66.?ÿÿðf"&20ÀÁÄd@DFL"bf?Ÿÿàff"30`ÁÄfÀDFÌ"cF?ÿÿà&3ãr@ʼn˜ÄFDD "cÆ?ÿÿà8øüÎgÀDDLbbF?ÿÿààægÄf&f?ïÿð `">`?ïÿð @?ÿÿð€?ÿÿ° ?ÿþð8?ÿÿà<8 @€?ÿÿð  @Àà?ÿÿð  ˜ÀÀ0?ÿÿð ñ˜ÌÃÇ€À0Ã?ÿÿà  1ˆÌFf€€xü<0Ã?ÿÿð  ˆÌFfHÌL!³ãÀ0€€?ÿÿð@ ˆÌFFÄÄÖlüÀ!ˆ€€p?ÿÿð<` ˜ŒD€xÄÄCÄDÃñà $`ˆˆ€p €|ü?ÿÿð<@ 9˜ÌFF€ÈÄÄcÆDÿ™~c1‘0‰™˜€ÄÌÞcÿ1†0€f€0à0€?ÿÿè¼xî@aÈà 1™ˆˆ"&c101‰™€DÈc3óáã€|€|ãÇÇ 0€ ?À?ÿÿè@AÉÇ09˜Œœcfc11301ˆñø€GÈc3™’2#€€|€LæmÝŸ1çÀxü€`àÀ?ÿ÷à@Çw>331³0ˆá˜€ÌÈc3™6#‘€~€|æìÙ36@Üü~ƒ1ñpàÀü?ÿ÷ð1Ÿ0˜û™™€ÌÈc3˜6#‘†n€üçí™Ü3ÿ€îæã1ùŸ>pcŒÏð?ÿÿà@ŸŒùÀï̲c3˜6#›Æç†Üæ˜3ÀüîÆó1™»r`gß>}ÏÏ€†0€ 3?ÿÿÀ`œg39™’6#žüóîüæOœ3ÀÜîæs1™¿p`|ù2}Îî6|ù€†8€ a€€@€?ÿÿð0`ÀÀ˜óãó9Ÿp?Ï—raÎæg08€†óŒÀ!#™˜;€Ï†?ÿÿð0ñ1Œd Î$HŽ0€``0€ >ñÏÆvq»„†;óŒÀ!c‰˜€ŒÆfx?ÿÿÐ11±ŒG fÀŒ˜pÃyŸ`a‚0|ð à‚qó݃†3s›ŒÀ!c‰˜1€ŒFFh?ÿÿð 11ŒC€ D€ œ`Â4ÞpCÏsÇ30Lø@€ ¸ó󿌀Á1c‰ð31€ŒFB`?ÿÿð±™™Œ@€D€Ž`8 xDsË?07`H@ÁãÃÄ„ý€€1ŸŒ€c331˜à311€ŒDBcÀ?ÿÿðÙ±†íD€ ‚`pƒ@Gc;>3&xx0Dc Ã2ff<|``ÀÌ€À€ 1™ð311€ŒDFa€?ÿÿðhâ’``ƒÀÌ0c202&|x Fc1Â6fbf`øñð¸qÄ@€À€ ˜3ŸÌÆf`?ÿÿðfæ`ƒ€ÀÌ0B3" 2dÄØ`FcÂ3dbf@8™‘0 ÌØÄl|@€À F<`?ÿÿð`0ã€üÌ0b2& "8ň@FbÃ3Äb`Ä̘2 ͉0Ã2v ?À‡p?ÿÿà d™>ÆÃ‡Œ0`0a>xÎȘ6 É‘™Œó"60À‡7?>qÀ8@?ÿÿà &ÄdÉ …€ÄpÀ 0`10„q˜3? ™‘3"d0À0…×3s6c@|þ??ÿÿà 7gÄlÈŒÀÄI°;8Fc8002Ï9± $"d0À0„÷scvgLff?ÿÿð 2ÄlÎÌÀÄA030ÆcÿŽ @0€ 0Á<ã4F 0À0„çsc~cÀ|ff?ÿÿð 2 ÌlŒ€Äs°!0Æc™‰€Ù±ó† À€ @D 0Ì0†„ç3cpaàüff?ÿÿàãe™0ÌLAˆÄ;!0F#˜ƒƒ3›€ñãæ €À€ €€ Ä8‡ŽG3w2dàìff?ÿÿð0ÇÆ›Ì€Ä#0Fc˜ƒ1™›3»žxó€ò0 „€ À €€@€?>vÀüæg?ÿþð˜Ç€~Ù0300Fc˜™‚1™Á‚šM–Àû1ø 0ø„ ï±°€ €€ Àpà€|î??ÿÿð€08çã1™™ƒ1ŸÁ‚˜Í†Ã˜ Lü}ÇÉ€ ϹøÙŸÌ8q€`@pà€?ÿýð#9™Ÿ™Û23˜‚˜ìç€Ãˆ ÌÌ̆DÀŒÝÉŒÌíјŽpÂ@@` ŒÀ?ÿÿð€qãó9Ÿ™‹31˜À1ÀÈ üÌÍ„LŒÀ ÁŒÌÍÑ€’cgþ<ƒÀ` ?Ì?ÿÿЀûó3˜Í4ÀÃ1˜ ÀÌÙ„GŒ@ ŒÌýñ€Œb""d ŒÌÀcãŽ@ fL€?ÿÿð1€38y¶ÀÃ1˜ ÀÌñŒC€ŒÀ 9ÁŒÌÀñ€Ígâ"`ŒÌÀc3ÿÇŽaÂ@ ?ÿÿàÁñ˜ÈÌùŒH€ŒÀ9ÜÉŒÌÁ9€Çf"8ŒÈ@c11šfÄÌfgà0ÿÿà pÌüÌíŒÀ˜yÏŽ}±0†f"" ŒÈ@b11˜D@Ìf& ÆÍ3@0?ÿÿÀ@08ŒŒÀᘆ6cfbL ˆÌÀc11˜DGÌd&  ÌÈÍ3fçR @0?ÿÿðˆ°‘ 1€ˆ`Œ€!Æw|œÌÀc31˜DDÌd"  ÏØÌ2gfdóö,æ<È ?ÿïðˆ‘@!‰Œàø€œÇàg3›ÄlÌf"  ÎÌ>ÀfDDcvLæDÜ&m²r€?ÿýø#ÂùøyñÃp€0?ÿÿøbÌÜÙócpyû÷1€€x?ÿÿð&üÌÝÂcpìûÿ` æÏ¿ða?ÿÿèñ˜2a€@ðyÜùÇçpÌû‡0†mŒÃ1ˆÌN˜Lg›¹±øùà?ÿÿð00A€`ƒgxyû·` ÆqŒÂ1ˆÌGLf˜1™‹0?ÿÿøp08 ÆÅ(A€ `c ;¾`pî|ÌÃ1ˆÌÁ€Ldq™ƒ0?ÿÿðp`< ÌIšLa€á  b ~yÇ9œÌɰÌd±™ð?ÿÿðp@>̘ w€±˜˜ œ>â„aÆÌÏ088ÌF1™ƒ?ÿÿðpÈ2 ̘A€1™ˆ‡¶66g€ à„@€€Ä8çÎ;™±™›0?ÿùðqû3 ÌÌA€ñ „" d€ $ÄÀH€0€`À@ 8ñ˜ñà?ÿûàñù1ŒÌX˜ÌA€1 "`f 4d€,ÿŸ˜œyŒ0#p€øà `€?ÿÿ…GÍLÀá™1 &"`g€0d€d팙œ™ÌÙ¸ópÈ1€˜à cÀà?ÿÿ°Àã™±™˜ &"`a€8<€D͈™‘Œ™Ñ"˜Üy˜œCCˆ€a€à ÀãˆÀ€?ÿÿø€Ø >s2aÀDɉ“‘ ™“"øÈ™¤Ég‰£ €`€ð|,ÀfœÀ€0ÿÿð#o˜f€ÀÌ™± ™2f¸È‘0È&™å”{±€`Çpüìç8ñðpÀlœÀ€8Œ?ÿßàF€~`™›ñ‘2f‰±8Î&ñ0Ùó€`Ï3ðÌÌg9¹øøÀxrœÀ€8Ì?ÿÿð< ³™³3晳 ‡&Ž8ñ³@›39ÌÌg;™˜˜Àx7sœ‡Œ8Ì?ÿÿðÂ3f™óƒ$Á3@“29ÌÌg;™˜9À|3r®ŒÏ¿¾çáøÌ8?ÿÿÐ0³iÚDƒ# Á’6ÌÌf™™ùÀü?4çœÎ3ºgóðÏÏŽ80€€?ÿÿð0 Œ„m‚#Ã66<üüç;™™™Àî0<çÌ3¼ã38ÏÛ>|û€|0€€0?ÿÿð?b€ 8Â3þ?<l~ã9±ùÀç2ÇÌ3žã30 Æ8ïÛ€L3~1†€@0?ÿÿð0`€ø,ð<˜ùÀç>Ç Ì3‡c30 Æ<ÿðü#31™Ÿÿ€0 ?ÿÿð ŒØ3È0À @€ 8 ÂÎ?·ç30 Î?üøŒc!1˜™™™‹‡€0€?ÿÿðŽÈ³ˆ“fà f @€ @€À¾çsøÎ;&ä8†c>!!™‘™‘ŒÉ€Æ>0€?ÿþðŒ‰£ ‚F`|vLÆQ°ã„pðpp€Î?>m»†c"#!Ž8™±ŸˆÈ€F3˜‘ˆX?ÿþ°1ˆ‘ƒ F@`fDÄÁ°ðöLLüØD 0˜`` 8ó‡7631†™±˜ˆÍ€F3™™ŒÈ?ßÿø ‰‘Ä@`dH„a0˜ŒdäÌÌÆcŒb0Œü >>3†™™±ˆÏF3™™€?ÿÿøa‰‚ÄÀ@dx„3 ŒdàÄÌFdÏlŒf3Ç 0Œî@1€0™Ÿ›™1ˆÏ3F3™ €ÿÿð†‡ÄÀBD0Œ ŒgpÄÄBLÌ`Œdcɖ؉óÆdÆÁ€r€ 1œÏÆ3™€?ÿÿðÀþL0Œ’2Œc0ÄÄCNÌ8Œ$°Àøôfdn<|<0FÆbÏÀ F pÐ8Æ3™‘ŒÈ?ÿÿð8ŒÂ&ù†C0ÄÌCŒ Œ<˜ààŒfFFfffxFÆ&LÀ6||ÇÀ€F Иñœø?ÿÿøˆ!ƒ‚0ÌÌCŒL Œ8p€ŒfFFff`Ì|Æ$€bÄÌGcàˆç  €0?ÿÿøˆàÌᆌLÌ€Œc„Æ~f@Ìø†/À€`ÆŒFf`ùˆæ?ãÇà?ÿÿøˆ(Ä 6›„c„F`f@À̆na`ÇŒF&`ŒF32c03vncáð?ÿÿð<óÇÃfdf`ÀÌlc`ÄŒF'ÀŒF"0b00FFc30?ÿÿønÈ ><æfÈ€Æ#€dbbÌÌF'€ŒF"3â0 BÆ#30?ÿÿðDH`@x€ç'"Ædf>xüæwÌŒÆ"&b0 BÆc30?ÿÿðÀ€"ÃÇÄ6ìüæc6b01FÆc3à?ÿÿð ü€$æs3çp;fFc3À?ÿÿèŒÐ±æÁ„ˆ8`<>c3ð?ÿÿøŒÀ¤É€™³ÌŒÀC€€€ À€0?ÿÿðŒà1ŒØ‹ÌLE³€€Ø€b@80?ÿÿà Œ0ñŒÙ‚ LLðì|ˆóà@f@ 0?ÿÿ𠌄˜ LNðÌȈ“0 >w>@ ÿÿðÌ1„‚ LÀÄɈÀfb22ãÇÀq€€ÿÿðñ‡É‹3 LÁƒ€ÄÙˆãÀBb3"&LÀccÀñãæ €ÿÿà Àñã ÇɃ3„Ìñˆ3àBf7"†h@&3A›3»™œxð @ ÿÿð@ óÌÌù‰00Bb0"æÈ@&2‚3™ˆÌð3?9‰@ ÿÿð À Äýó0 ff2"d@f2‚1™ˆÌÀ312=üxøã€ÿÿÀ ŒÀs»&LÀf2‚1‘ˆÌÀ?1³ ŒÌÌÌF€ÿÀŒÙÇÇÀsf›33™ˆÀÀ0 1þ ŒÌÌÌFßÿàpaÇùã3™ˆÌÀ01  ŒÌÈÌG?ÿÿðŒxÀ261" ŒÌÀÌÀ?ïð!0Àc?>qŒÌÈÌ@À>ÿÿð!@0€00ŒÌxÌm€?ÿÿðbfq  @0€€80?ÿÿðffa° XÌà20p?ÿÿð'F!Ìh@;3X€|ÿÿð?F!Ì0@1™ÇÀãÅÌ|ÿÿø9†!Ì0@01ŒÌÁ¦g~<Î 0 ÿþø†!À8@01ŒLÁ„&fffç3„f` 0 ÿÿø†3Ì\@101ŒM€ä&ff d2&ÄfãÆ`ÿÿðÀf<Î1›!„Äffc!1ŽLxL#¶0Œ "33É–|ü`ÿÿøÀŽá‡Î>fc31„ xÌ#0Œ "7°ÌÌ`ÿÿø>>33ÆLHÌ#0Œ "6¼ÌÄ@ÿÿàÃÏÏŒ320Œ "  ÌÄ@ÿÿÐ 1ãð9Ü c23ÀÄ@ÿÿÐ Œg>ã &ÌÄ@ÿÿð cãÀ`1˜àÀ`°À~ÿÿð €?!œÀaŒÀFbˆÌÀ„ÆD!â„B"fc16fÆ>1˜áÀ`0àÿÿÀAŒÀÆc8ɘÌÀŒÄD!æ„B"vc0 lf361°ãÀ`0`ÿÿà!0xüülÌÌÄ3f„F"`c  lF#"!ð¢€`açaœ~ÿÿð0Ìxî?fŒF"bc0 lF#6a™$€@Ãl"€~¿ÿà æÌff6c1 lF#<a<€@ÃLdˆ€~?ÿàBg3æDæ3<c8€ÀC0o€~¿ÿàx0Áƒæs>@c3€Àb0LÿàXØ`€#cãÀÌ3 0Ì}ÿà˜01€c€Ž`? ÿÿð0!ƒ€8lx€6€ ÿàð !Ã8FL8Ààÿÿð0ð` A‰ÆL8À ˜ l@ÿÿð!0À e˜FxXÀÄ@„ ßÿðA€"i‡˜fx˜À ÆGÇ€ßÿ°Ã0"9™˜.͘À ÆGç>ØøˆÀ„`Àÿÿðùãð#1™˜ÌüÀLnFf˜ŒÉŒ|ü€Ä "Àÿÿpà#›˜@DÌÀ?~nFfŒŒÄD3ÇÙÇÆì``ÿ<Ð ˜@lxÈ“ Æf1ŒŒÄD#b˜†G~>sáÀ`ÿþà0È L€Æf1ˆŒÄDab„b""c17gæ>€ÿÿö€ˆ  hÀÆf0‰˜ˆŒÄDaâ„b"vc0$b3øù€ÿÿÿ€Æc0øøüÉŒÌÄ#b„b"vc04b13ÌÌÀÿÿÿ°@8Ìxî7f„b"`c0,b13ŒÌÀÿÿð çÎæg2c1,b1„ÌÀÀÿÿð Àfc36ff3ŒÌÀÀ Àÿÿÿà„@àãÃç3?8ŒÌÀ<@`ÀÀÿÿ „€38xÌÀ,1@`À@þÿÿ ÏÀH!@lìlyÀ`À@@€þÿÿ ŒÄÀäÌÆÇã€2~ÌÆj@gŸ€ÿÿ Àƒ˜>‡Ì631™ÈL@€3†`aŒf& 0™˜Lba€ “2b&23Œ€ÿÿÿÀ31ó›31™ÈÌ@AÌcf"™˜Ìb9€ó0b##™ŒÀÿeÿ€€38ã9Ÿ˜ÌÌÄ Ær ù˜ÌÌf9€sb6##˜Œ@ÿcÿÀ€ÇŒìÆ9˜@øÇŒ>˜3b&##˜Œ@ÿÿþð ‚ ˆà˜1&f &##˜Œ@þÿð üð€`0Àf >s3™˜Œ@ÿÿÿÀ †€Ð` ` ŒÀÿ¿ÿð Cà!`€Ì @™£ì@ < @ÿÿÿðc33cgà €Äpø@™1ì@gã8fÀÿÿÿà7c24f"  €Ä`@˜1€3380ÄÈ0B?æÿ÷ÿà?€b3$$"  ;€Ìc`†@†`‘ñ€22100fþ~b8!À`3fpÀÿÿÿàb3d$"  €øfžxü8ü``0†`™ƒ1€²10 ffc#1±àp<ƒ & @ ÿÿÿ€0b3„f"   1€øf DLÌ`ñÿ`0î`1˜›3 3210 df##1™€Â8çÎfc71‘€‚ÀÌØf` Df2f{dc000 ÿ?ÿà  Æe¶ÌÄDÄ` ˜È`qÄÆDf3`p23€Çü8x F~?ó€ÆD̈ØfÀ Df0fcc #00ŒL!Ì@ÿ¿ÿà4ÆxÎ@f™™˜ÈDLÄD f3`p:3ˆÀÆfLÌ‘``A|}Ϝ̙0f DftaÄa #00ŒÍ1æ@ÿÿÿ @`øñ™œd–LÄDf36`pqÞ3ÀÄF Í›`Ç0 f@0„f``äa€!00Œˆ1@ÿÿ @8óÌ|Æf3&bxÜ3ŒÄF<É»€`0cÀŽfd`daÀ#00 ŒÈ1ÿÿ€DÆã6vlÌ3ˆÄFlyÀáÀ`Àfpö '† ÿò€Ì1ÀÈÃŒDfD&@…ŒÄdÀ <<<ÃÏŸ€ @€‚AŽ Ç€ŽóÃFÀ1 Ä8D@LAÀ0Ä1£ð¡Mff˜ö ñðÇ  ÿÿû€Œ1˜ÀÈÃŒDd&@…ŒÄdÀ ` 0‰ €,ý¹‰˜ÁŽÌÀ†€ ÎlfLAÀ0Ä0ãáÏæd ±˜±øðÇ`þßÀÀhÃŒFfD" `ŒÄg€ `` 0€DíÙ™øŽ<ÈÀÃà ãŒa€1Œ0Ã0áÆædxƒ@˜0Áˆ àþ^РFcÆs`dÌœÆg@``ƒ€DÍ‘‘Ž8ÌÀf$ÆfÇ€:0Aà0a† 6Fx˜ƒÀñˆ30€È `þCò `|ÆgÈbbbƒ3 ÀÄɉ‘1ŠHÀf?Æ$C0†væx˜À ±‰³ð@`þó¶€à~~~‚#DÀL™‰11H€ƒf33Æ&Áãæ~ùÁ† ±™“°xÓ`þÿý @€1€~h™™1ñ0ƒˆ€ƒf13†gÁFÁ†ù±™¹™08óðüþ @801±2ÀÂ3ˆ€ƒf1?ÃæÁFñ˜ùùðÌ8p`üßî0øü1‹ƒf30€la|Ì0`þ›×ÀÎf32€lAbüÛ÷€gÆÀ0 >3ÆdÃþOþÀf@ ŒŸ€0  ÃŒÀþoÿÀfÀˆ  0ˆ Àÿo¿€âÆÀ ˜   ÿýù`fÀ‚EŽÀ>`@`ˆÿÿè@ lFŒ˜‚ Ú`3cc`ÆcàˆF0üëü€ lG˜ØÄŒØ`#26"fc3p?áÇ ˆF0ÿÇÿdLÀØŒ1Ì`"66&f#3033"çÃ!ˆ 0ÿïíÃÆÀ ˆˆ h`"&6&f#3 #321³&f̘ñˆÌ8F0 ýoí fL’`""6&#3`"3b1á„,ÈˆÈ LÆlyáð8 @þo퀅à#3&b€"21áä/Ø1ˆH LFFk209¸ˆpq@þù#1ããÆc3à#2&1£d,±ˆH ð62c1倄 þÿö2`C1¬Ë1øÀ" üÆ2`C1ŒØ1˜“ˆü9Ä#€0ü¿Æ2`C1 Î1˜1‘ŒDDÄl|#cc1`ü¿È2`C1 1˜!‘ˆDÀ„Fd2cñäsáò0 þÿÈf"c1Œ1˜1‘ˆDÀ„ÆDr#€‘äc1¿‹9‡€ñÀ00 Àþ¿Èañ„“ 1˜±ˆDÀ„ÆDt"€„c1™™ˆ›3s€8` Àý¿p 1˜ ³1˜ŒÄÄ„ÆDœb€±„c1™˜‚3™€1°<ÀýŸð  ;˜üÎlÄDFœb‘„c1Ÿ˜‚3‘1361ó1àbÀðý«ð0D8æˆc™„c1˜‚3™3 "33 666xÀ0€@ý¯ü!€ù†c1™™ˆƒ63ž3 #±#0"`ÌÀ0@þ¿ü1™Ï›33ž33 #£à~`ìÀ0€ 0þÿìpáóŸ01˜33cÂ``èÎ2gŸøÀ`@0€ÿÿä°ð?s10 ".`ÀÆæb˜‰$ÌÏÀqà0€ÀûÓð €#8àÃà>ffÌÀf˜Œ`ÈL@b06lìÄ0Àÿƒt € xÀ˜8ÈL@f0`ÆÆDdÆ>1À8ÿ¾x€ l`€&˜ƒ ÈL@f0`ÆÆ`äF3318 À€@€þóðdf`6~ @F˜‘DÈÌ@f0`ÆÆhèF31‘dÈ ˆÀxð€@!€€þcðff`1b7#1åŽ)ƒ@‚™ß|ÌÌÀf0`ÆÆ8¸D11‘f̈ÀÌð;<=Àà1 €@þgðnf`0b"#¬ÚI‰€y㘄`ÇŒàc`2ÌÄ08F31‘~üˆÀŒÀ1&=€làqà0€@üwÐ`f`0B"#Ø`˜ÈÀk6ˆÌg€xü00Æ31‘@ÀˆŒÀ1!€Ä@!±Šþ0€þ[ø`f`0b"# žp˜ÈÀc6„DÀÆ33˜DÀ˜ŒÀ1¾ €Æ@!˜31#ÈP€ þ+ødf 1b"#˜ÈÀCwˆŒFÀ ŒdȘÀŒÀ1f €Æ@!œ3#3L˜€Å€³Ã ÿ:øf06f33 “ ˜ÈÀcÈŒC€ÀÀ8p™ÀØÀ3f!€Æ@!Ž3#3 €LÉŒ\ÿsð3£šIŒˆÀc$ÈŒ@€pÀ>>p€ÌÀ!ƒ36#X€FˆŒDÌýwʆÀáçÌd0€0 Àxà3“32#˜€G±ˆŒÄŒÿÿì gÀ0ž361# ˜€Aá ˆŒÄ„ÿÿøÀ0£ Ù€ÉሌÀŒÿÿøçž10ÀÀ# €Ïû ˜ÌDŒÿÿÿ€f±11¸ñððÀc`ÄxLÿ?ù8| ÀÀ&10üxÀcà`ÿüxx@Æ&130ÌÀc±°<|@@`€ÿ?ü@@Æ!@&13²0Ì€c303ffcÇãÇÀ`ˆÿ¼ x Ïs1àfgˆÌ#ˆˆ0€cϘ1™‘‰öÍ<ÇÏÀ3`€™ã8çÃã3#‘˜ f1ƒ1™™€ýÿþp>gïŒsŒÍ0€fð˜ø1‘ˆ„H ÌF@3ð`€?™˜f1ƒ1Ù€ÿ?ú0`!œÍð9‘€dɰ™™˜1‘ŒÎ0Ld`ã0`€€€æ0™“‚33ŽÿwÿÀ@ `ã€çÍ™™˜±‘ŽÌd@0`˜ñ€€€ÜÀ`ó“33™‘€ÿÿý€`@Ϙø ³1™‰ŒA„Ìd@0` X™€‘¹ŒññÀ1€ƒ À` 3˜‘€ÿÿü`;¹ù†ÙdÌD@0@ €‰±™‹ž1€‚àÀ0€ÿÿý `1€p` €ƒŽ<ÇÎä1Àù€{À1™‰™³1ðð†àÀ0@ÿÿÿ€ ` ÀÀw `€`3?Ì ‘ûÐñ˜™³1™˜ÆáÀ80@0þÿÿ€ |8‡œ0 ÿÿ÷ÀFfÁ ɘ˜ÈÀ` @ 0€x€øøañ˜Ÿ21™€fž@`ÆÆda330 ÌÌGG€p¸ 0„0€€ÿùü€F`q Ù˜˜ŒÀ|"fLy 0Œ€ÏŸž`1™c œ@`ÆÆ(a30ØÈDLÀØÜÜ>Ä0€Œýÿø€F` ٘،Àd"$ a™& 2±ð„€0€€ ˜ð8cŒŒÀbÆÆ8a30ØÈL ÀÌÌ3Ä( 0€Œÿß÷€ fd™" ˜˜ŒÀ`'d a >™±¹ñãØø8€À0€ø0€aùˆà6lÆ8a30ØÈLÀ8Œ„33„l Î6€€ýþ÷Àf<‘¶`q˜˜˜ŒÀ`& a 2™1™›3ˆÌÌàÇÎ`1™ž1™Ìø ŒÄÆcˆ€ñŽ|ùðÀ@ÀàÀ3xŒ|3„Ä L#0ˆŒ€1 ŒÌÿÿþ  ?™Ÿ±™³#Ìð ŒÄÆc19‰ŒÄÄ{0ÀDÀ ˜Îl Ì#0ˆŒ± ŒŒýÿþ áÇÌùŒŒÄÆC!ˆÄÆBÀÀ0Œ32‰Œ1 ŒŒýÏî€ÍøÏÌÎlc0 #‡ ˆÄÆB0ÀÆÀ ±ù™ŒÉ1 ŒŒýÿþ€àÀŒ8aøÃ9† ™ˆÄÆB0 ˜ˆÀÆhÏ0 Œy±œØÌÿ½öÀ cÈ‚¹ŒÌÄC0˜˜ÀÄ@‰˜ØŸ @PÌÿ?þ@ ÁÁ@ÀÏœÎ|ãs˜˜€Äp˜Œ ˜™›><áð@ ÿ?úÀÂ'â@À`‘˜˜ÀÄ8˜ü˜Ø‘&4±˜˜ÃÎ ÿ÷þ ÄcÆ4F@à`˜˜€Ä ™˜€˜Ø»01™ˆff##ÀC€ŒÿÿþpÄbÆ0F``Àp™ÏÀÆHÙ˜ˆ˜˜°60ñld"@D»9ž>Œ ÿÿøðÄbÆ0†À`؇b @FxψȘ˜‘& 1ld&`D33ÇŽÿÿþÄbÃp†`pÌÉŸg ˆf#321bf#30æ3€@À0à f~؆‰DaÎ&201ÿÿÿÀ`ÀxÀc3à31`b`f!ˆf#3â0cF#0"3`à € F@ Ù³ FdÃ&201ýÿÿà`À1ùãà6p&1ˆf#30CÆ#3 2#l|`㎠0À Ä€ Fd’b"01ÿþþà`p>qÌf33"0bÆ#à2#DDa$™!ç0á 0@0<€!Ç08ÿ¿üð@fw1ã9ð3ffc1À"3DLñ1±2f3ðxð`!À0€ÿ¿ú`@``<>s3æcsÄä1ç1° b Ìð`Ÿ˜Ð`€èÿÿþ€ @` @6Ãñ€ÄD0c±°#â ŒÀ`ÌÌìÄs?À0üÿÿÿ€±2c Œ@€@0 Æl :(±°&f ŒÀ`ÈÌÆÆc›Ã8dÿÿ߀3ƒ …€ÂÀ€0`Æ8 ;m›36f3 ŒÀ`ÈŒÆDc™a‰™?øùæ @ÿ¿ï€²ƒ‘ ÌÀÄFÏ€ùÀÇÀ0sã9³˜ ÌÀ0ØÈŒÆÄc™e°3ÈÙö @ðÿ¿î ²ƒ‘ÌÀÌDIˆ€ÆçÏ~À0ã˜øÀ0؈ŒÆÄcŸ9°1‰˜‚ A˜6~3Cýÿü€3ÞÌÀÌLÁŒ€Æd&gbgç00ÌÌncœ9™°1‰øƒ@A#323à@@ýÿÿÀ±7c˜ÌÌL Œ€Ædff&fb03;>yã˜ñðø~39Ÿ™‘3‰€ƒÀAa!23™žfLYàÀÀþÿÿ€£#9ŸˆÌ€ÌL €Ädvf'f"011fi3™ØÀƒŸ›3ŒˆÀÁ0a#3™˜fDÉ03ÀÂÀþÿÿ@œÇ€ÄÆI‰€Æd`&&">0!1ö`3ˆˆÀ1€3¹œÙÁ†Á˜c#2›˜nDã03@Ä`þÿóÀ1€B€ùÀÆfL"ff"60!1öaóˆ@`€ÀÁ†áø332˜+„sðÌ`ÿÿÿ`cÎ4fbfb6011`c3‰ˆ@bÀ `>3˜˜3„Ì`ÿÿþ@!†c?p36c3‰ˆ@bÀ A1 ›3Ì`þÿ~@>añ˜Ù€8ØŒ@`ÀÀ ñã#Ä`ÿÿþ€ œ€LÌÌlfÐ0ppÃfÀÿÿÿ€0ÌÄÌFFlüyãâ 0ÿþÿÀ0ìÄÌFB`Ìk6c1xð€0<ÿ~ÀÀÄÌFf8Œc6#1M6Æ@0#ÿÜÿ@ÄÄÌÆFŒc¦#1ÌÀ3&Gcð!ñÀ`@@ýÿÿphìüÄfLŒc#1üð3gf& !àóñáÄp@ÿÿÿ`ð||fhÌÀc6c1À06?~Æ&0C€Ã&lràÿÿÿàÀ ÌÀáããs˜Å&0`F&0Cã6c33gßøƒþÿÿàÀ@a³˜y°63bF& ƒsöc cÈÍ4ÇÏÀþÿÿàÀ`6æfqƒc`âˆÌ0LNÀ÷ÿÿÐpæsñ³€›&c "ˆÏ8Ld@ÿß÷Ð`Àóóçnc36"ˆÃLd@ü¿öðÎw>3gˆÁ„Ìd@øÿý ÁÇœËdÌÌDùþÿàÇŒäþÿþÀþÿÿÀüÿÀø?ß@ø?ÿ@ü¿ÿÀþßÿàþÿÿàÿÿÿàÿÿÿàÿÿùÿþ`ü_î@ü]ÿÀøÿÿÀüÿóàþÿçàþ¿ëàýÿúàýøàù?³Àøÿ€úÿþ€þÿþàÿÿÞÀÿÿïÀþÿÿ òÿÿÐÿÿÐ÷/_ÀÿÿßÀÿùÿðÿÿÿàûÿÿÀýÿÿ€þÿÀû/ÿ€ÿ·?÷¿ÿÀÿÿþ€ÿÿ~@ûçÀýÿÿðýÿþ ùþÿÀÿïÿ€ÿßþýÿþ€ùßÿ€ÿÏÿûŸßÿÿýþúë€ÿý€ÿÿï€ûÿÿÀó_üÿÿüÿÿïÿßí@ÿŸø@ÿßò€ÿßþ€ÿÝø€þÓøþÓù þÛþþßÕ€ÿåÿÿÿÿüþÿòÿÿÿÿÿÿÿÿÿüÓäàÿÿÿÿÿÿÿÿÿÿÿøÀøÿøà?ÿÿÿÿÿÿÿÿÿÿÿàøßzàÿÿÿÿÿÿÿÿÿÿþð¸À ÿÿÿÿÿÿÿÿÿÿÿÿàø˜À/ÿÿÿÿÿÿÿÿÿÿÿÿÿ øOŒÀ¿ÿÿÿÿÿÿÿÿÿÿÿÿøùÇHÀ#ÿÿÿÿÿÿÿÿÿÿÿÿÿÀùgÈÀ¿ÿÿÿÿÿÿÿÿÿÿÿÿñ€ù§ðÀ ÿÿÿÿÿÿÿÿÿÿÿÿÿû Àÿÿÿÿÿÿÿÿÿÿÿÿøÿ ØÀÿÿÿÿÿÿÿÿÿÿÿù@üCÀÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿèÀ/ÿÿÿÿÿÿÿÿÿÿÿàüß Àÿÿÿÿÿÿÿÿÿÿûý€ÀÿÿÿÿÿÿÿÿÿÿüÀýGÈÀÿÿÿÿÿÿÿÿÿÿøùŸÀÀ ÿÿÿÿÿÿÿÿÿÿüýû`ÀÿÿÿÿÿÿÿÿÿÿàüqÀÀÿÿÿÿÿÿÿÿÿÿþü³ÀÀÿÿÿÿÿÿÿÿÿï€ÿ3`Àÿÿÿÿÿÿÿÿÿÿðþ'À?ÿÿÿÿÿÿÿÿÿÿ€ü €ÀÿÿÿÿÿÿÿÿÀüƒ€ÀÿÿàüÀàþ Ààü Ààü0Ààü`À Àü„À?À€p`ÀøÌÀ?à??‡ãü à p`À8ÀøÀ9à?{Ïóþ?ñø~øø€`À8àøÀ8à9ǃð?Î?ñáÏü?ñþðÀ €ðÀÎsǾ9À à8?ñÿà9óóó÷€>9ƒƒðxyñÏ<?óÿøð?‡Â€øáÏaç9ÀN àø?ñÿà;ûóóçü9Ãðp9ñÎ8ÇŸøøÿÇÃçü`oþa€èÿϼàç9ÁÎàø<ñÀà;ÿs÷gþ9Ç0p9ùÏ8œ<>xÿÇÃçüàïþ÷ƒ‡ð€àÿ‡üàç8÷Ïðü8qÀ à3¿s¾gsûÇ8p9ùÏà>Gœ<8=àçÇï>ðçþ÷Ãø€è?ð`ç8ÿ‡üÿÜ<8qÀðsžs>g1óƒ8 `9ßÇø?çŸx8ÀçÇïàààgßü€à8øÿü8yÿ¼xóžs>çqóƒü p9ŸÁü?ïŸø8ÀççÎàààçãœ<€ðàØ8yÿüãžs<çÀpó‡ü p9À<8ŸðpÀçïïàààçã8 €ð1ÿƒð?Üsçþpóÿ pq‡Ü8œxpÀçïïüàààç÷¸à#gþpsÿ?ó‡Þ<8‡œ88Àç}Ïüàààç¸|à1ü ?ãƒÏø8Ï889Àç}Ïðàààç?8|ð Áƒ‡ø8ÿ8>ùñÏ}Îàààç?8|àÀ0þ8ðÿÎ}ÎñÀàç8ð8àŽyÎÀàç<ð€>9ÎÀàçüà?àçüàüàààÐðððààààààÀ à à À À À À €À à8à  80`à „ q† p0`ÿà Œ1Œ1‡ÿƒà`Ã8À ˆ`Œ0‡8Æp0` ÃÀ˜`Ì1‚Æ00`~|áñŽÃ`<àÐ`Ì1†Æ0` 6|ãŽüÀ@@0@dþàð`Ì1†Ïðà 0`Æ †ÌÎ ÇsñþðÌ00`‡ ÀàaŒ1†Îà 0`F† üÆ7ç¸ÿø|?ø8p`? Àà1Œ1†0Æ à 0`F†ÜìÇcf8Ç8üxÃñüðÇ à@?Ï9Æ  `# 0`Ɔ0ÌÌÌÂcÃÆÌ0Ãî7ñøüà à1Ãà00cœp`ÆŽ1ŒÆ ÂcÿÆ 0ÆÇ1clÿá„8à ÀáüpðãÎ1Œ‡LÆCâÆ|0ÆÆ0f `0Æ9‡1†<>?ÀÀÈppãðþ9üÃÎ6ÆCÀ0ÌÌ0ÆÆ<f `0Æ1††fðœ?€ÀüÇs1Æ8ÃÂ0ÆŒ0ÆÆf ``Æ1††ã|1œf?ÃñðàÁáÏ9ç8f8Æ9Œ0ÆÆf ``Æ1††ç0ŒcǘÀ<9ãùþ0Ç1Æcfà`Ä1††ÿ`ãÆÀtãáÏ>ã8àpÄ1††À`ÿÆœÀ8áðàŽ1Ž1†1ŽÂ`àÆøÀþsÏðþr8‡`˜ÂÆ€Àf|8Î1˜bÆ€€ ø<~9ç3˜Àƒ€ ãñðÀ8ƒœÀ8ƒœ?€`€0‚qÀ€pÀ0‚†0àÀ€püÀ0ÄÆ8ÃÿÀàÀ@pœ`À0Ä0ÆÜã0@À `pÀ0È0Æà cÀ€0ùñ‡`0€p8À0è0ÆÃg€0øù†gað0A€Øà8à0p0ÆÃgø€0ÀÁŒ#a8œÇãøÁ @À`8À0p0ÆÃf€0ÀÁŒað1œNsþãÿàøïààÀ8À0p1ÆÃf€0ÀÁœ`80q˜L1ŒaÎq˜wáðãƒÀ‡ø8€0 ŽããÀÆ0ÀÁœcø8˜1ŒaŒ1Œc˜a8ÃŽãø|ãÁ€‚8€0 Cãð8ÀÀÆ0ÁÁœcs81 aŒ3ŒaaÁœcœlÆqð ?‡‡€8À0<ÀsÇqÁÁŒcg8p81 aŒ3üa`8Á˜3 äŒ1Ð 9ÇÇÏÿƒÃÀ08€0±ÁÃãøã8q\3 aŒ3ac¸Á3 ðŒ1€ 0Ã8Çf9†ãÆð€08€pˆsøŽ?Ìc aŒsccÁ3 xŒ1€ 0Æ0B0Äa†0Æ0ÀÇ>x8b0€pÇãœóŒq˜cgÁc Œ1€ 0Æ0b0Àa†0Æ0ðÆfpüü<0€p sžqøçó8Øc ŒŒ1€ 0†0F1‡ápÆ0øÄb0Ì1Ìf0€`søcÜÌŒ1€ 0†0Æ1ŒcpÆ0dx1Ž1Œf0€`øÇã€1Æ0Æ1ŒcpÆ0l<1þ!Œp0`€yÏ1Œc0Æ0 xa€!Œ|p€`yÏãŽ1Ž0 xFa„aŒp`€Îxð0Fq„aŒ†p€`Á€à0|0ÜóŒÆp€`€„0póžüp€`žx~ p€`ÁŒ0ç€À€p€`ƒŒ0€Àü€p`ÂCaýà`Œ0€ÀïpàÆcaÎa¸ 1ÀÃpàd8caŒc  1€ãçæÀÀ`àl0caŒ#Œ 0ãóçŒpÃÀÃ`À`€àx0baŒcü paƒ'0Ì0Æ`ÃÃáðˆ0@Àð`€à8faŒc `aƒ0 0Ä`ü Æ3¸ÿðÿp€08€`€À0ÆáŒc `aƒ0 p€`Üîç8÷ø~?ÁøxxÀ€þ`À‡ãœcˆ`aƒ0 !‡àÌì ÂcÇÇ8Ì8Ãñþ0€‡`Àœqðsƒãƒ0 !Œ`ÎÌ ÂcÃÆÌ0Ææ3?€0€€`ÀsÇãƒ0ŒaŒ`Æ  ÆCÿÆ 0ÆÂ1 1À<xx€À€àÀþ㇎ñŒ`ÇLÆCÀÆ|0ÆÂ0 aŒ€ðfÜx|?€à€à€ÀñÏàÜÆ6ÆCÀ0ÎÌ0ÆÂ< `ŒàÃŒ0Æc€?ç Á80@ðà€ÀÁ‡óùÆ8ãÂ0ÆŒ0ÆÆ `Ì`ç 1†a€1Ž{óŽ8<<0xà€Ààç8ç<Ã8àÀ 8yãùü0Ç0Æc aŒ0ÀÌ!ÄÁ€`Ì1ކ0Æ;sÇø< 8 ƒàÀDãáÏvqŒ8ÂŒ1€Á`Ì1Œ†0Æ0Ž3ø~? 9à ƒÀÀ?f9Œ1„á€aÌ!ŒŽ0þ0ÌcÂs 9óø~|`ÀÀ |xþ0Üc€aŒ!Œ1Œ0À0ÌãÀcñ“Î~|?þ†pÀÀx?€þ3ŽaŽ1Œ0Â0`ìÃÀᆠ†tÆæ?†€0ÀÀüsqÞ0Æ0`ÌÀw † Æ`Æ3 ;€„€€0À>ÀÀþ8üx`Ì3FÀ` † Ì`Æ0 1€Œ1ŽÇãÆ`À>€ 0x?‡gœÆÂc † ü`îÆ> 1€ÈpÌfc†;ðØ`À>€þp Ç<öw‡ð`Æ0Æ !€È`Øc†0Î1˜`À>€ æ 0pÀÀ<>ƒ8ø`Î0Æ !€Ð`Øa0Æ1ˆ`À>€€æ 00ðà€ ÁñþðÎ1Æc1€ð`ØãpÄ0`À?€à0`ÀŽðþyÎvq€ð`˜ c`Ä0øaÀ?€À 0`À€<sÀ`q˜Lc`Ä1˜cÀÀ?€Àn?ŸÃ¸`xx0`€ÁÀ„€`;ŒÌã1Œ3`ÀÀ>€Àf1œãœqœü0x`€ÀÀ øÇáŽ;Ž3`À>€ÀÇ`aŒ3ŒÌ0Áü~ÃჀ ÀŽqüàÀ>€Àþ`a # 0á gÆ1‡À€à À ÀÀàÀ>€ÀÀ`a c<0óc8l1ŒÀ€ çÿÃùÃŒ À ?àÇÀ?€ÀÂ`c cÌ0;Ã0lŒ€cœaŽáŽ?ÇqÀ €p`À?€Àæqà cŒ0;Ã0ls aŒa†Ã1€>Àü„``À>€à|?8ãœcŒpÃ0l1‡€€3aŒa†Ã1€'aœ†8þà Ãøp0€>€ ãœñùüp3ˆÇ8Ì1À€caŒa„Ã1 c †÷€ÀÀÃpp0€€>püpáøçÎ1˜È˜caŒa†Ãc †c c€ÀðÀp00€€>pç‡ãÝŒÁ˜ca aŽÂf †C ÁœÀÆãáà‚`p00à > ÿÇãŒaŒ0Ægf †C Á˜ÀÆÌfs0‡ø` 0À€~ ãœñþ9Ç gc†0C Á˜À Æ0Ìf3 Ççp`ðx1 €0€|F9ç gc†0ÃØÀ Æ?ÌÏó€ÃÃá˜ì1ãø €| <óü‡xÃÃÀL†0ÏóàÆÃpãÌ1øÇ÷€ €|ƒùçÇðqÇ?€~qÇ?€~!À|`€|a€|?| | À| \8À|þ<øx˜€À€xxfŒyßããŒ<À`þ |BŒ`Ìbc f?džƒàa€ ø| B1 AŒcc Ã1€ 2#ÄÆcçÇ€A€ ü Æ1ŒAŒfc Ã1€<2ÀÆ3€ÇÌÇÿ@  Âø@€ø ç1ŒAŒfc Ã1€l0?ÁÄ31€ÃXFsÀÏÇÃÅÆÀ€Àø 8øáŒfc Â1€Ì<"ÅÄ3;€ÂfcÀØŒÄcí‡àñç€ààø gáœf1€ÌbŒÌ#0ÂfcÁÝÈlcÆ`™Ç€€0``ø 3€|79ŒÌc1ÂæcÁŸˆl3Æ Æ1ŒÀ‡àÁ€` Àø 39ÏÇçÇÄcÁ˜l3Æ †1ŒÀðÇq¹€`Æ ‡ÁÃø ƒï ÎcؘLb„  † ˆ@xÆ3ˆÀ`çsˆÃŒÃ‚cx<ø cÿ œÌg†`†1˜Çÿð†3˜À` f1˜‚cˆÇ†1Ìf6ü  ø‡ÇÎp 3†1ˆÀô†31À` &Æc›€Á€aÌÂcü7 øŽpñøÆ3À†3á` &àc˜€aÌÀc <3 x< øCÀ9†3á€`Lfàgã?ž€Áøüc,ÇãŒÆaþþcü0`<Çcðà€ÇãÜÆfÀ c€8` Æwðp|nÀ cˆx` Æ?ø€>ØÌaŒÆø€ñŽsÜÆbðø|~ðð8ð8ð8ð?àø?ÿÿÿþø?ÿÿÿÿÿÿÿþà8ø?ÿÿÿÿÿÿÿü@8øÿÿÿÿÿÿÿÿÿ@8øÿÿÿÿÿÿÿÿÿ€8øÿÿÿÿÿÿÿÿÿP8ðÿÿÿÿÿÿÿÿÿì8ð'ÿÿÿÿÿÿÿÿÿþ8ð ÿÿÿÿÿÿÿÿÿà0øÿÿÿÿÿÿÿÿÿÿò@0ðÿÿÿÿÿÿÿÿÿü 0ðÿÿÿÿÿÿÿÿÿÿà0àÿÿÿÿÿÿÿÿÿþ`0ðÿÿÿÿÿÿÿÿÿÿæ0à?ÿÿÿÿÿÿÿÿÿøpðÿÿÿÿÿÿÿÿÿúpðÿÿÿÿÿÿÿÿÿþüpð/ÿÿÿÿÿÿÿÿÿøpðÿÿÿÿÿÿÿÿÿpàÿÿÿÿÿÿÿÿÿøpàÿÿÿÿÿÿÿÿþäpÀ ÿÿÿÿÿÿÿÿÿ¸pðÿÿÿÿÿÿÿÿÿ(`ðÿÿÿÿÿÿÿþ`ðÿÿÿÿÿÿÿÿ`ðÿÿÿÿÿÿÿÿø`à?ÿÿÿÿÿÿÿÿ`àÿÿÿÿÿÿÿÿü`àÿÿÿÿÿÿÿÿÿèààÿÿÿÿÿÿÿÿàà?ÿÿÿÿàÀÿààÀààÀÀ€Àààà€€ àÀÀ€€€€€€ÀÀÀÀ€ÀÀÀÀ€€€€€À????€?€?€?€?€?€???€ ?€?€?€~€~€€€€}€~~~~üþþüüþþþþüþþüüüüüøüüøüüüüøøøüüüôüüüþþøøððôððüôððððàäüøððààððÀÐàÐðÐàÀàÀÀáÇÀÐÇÀðÀƒÌàøÀãÌà€æÌà À~ÌÀaàìÀ3»‰ˆ@€ÀðìÀ3»Üæ30`€pàáÏÀ3¹ÈF3Øñ† ÆüÀpàÀÏÀ33˜Ä31Î&gÇÆ ``à‡€#3˜Ìb1 Fs gÆ`À`àÀ&b#Üb3! Æf0fÆbà Œàà€çFgüf3c Äf< fŽfÀŒáàØÜF3ãÄD D GŒòà€F1ÇcÈÄ Ì Î3ˆ0@„CðÎL ŒÌaŒ<ÀÐp ÌÁŒ8ÀøÇÁŽ8À Ç÷À¡À 0àȈØÀ?À?À8?°8?ð0àáð?ð0‚aóøÃ?à3™Ì†308Ã0?à3™Ü\†3 0Ã0?ø!ÌØ†cà †0<?àc1ˆøãÀ`„0 "8?Àcq™ÀãàÀŒ&#˜ÌÀ€ c?Âcñ™€d`€Øfa˜ýÁÀ c?Äcó€Ìa€ðfaÌÅÀ„ÀÀlãñ™˜ Æ##ÝÆÅÏÀ?dÀxãñ‘˜ Æ#c0ÌŒLð?p1ŒÌaÃ1™ŒMŒø?ðøøaÃq™ŒÌ øpàÃñˆ˜ø`ÃsÀ °Àà€ àÀÀÀ ààÿàÿðÿpÿ@ÿÀÿÀÿÀÿÀÿðÿ@ÿÿÿÀÿPÿÿÿÿÿðÿ€ÿÿÿÿÿÿÿàÿ€ÿÿÿÿÿÿÿÿÿàÿ€ÿÿÿÿÿÿÿÿÿÿÿÿàþ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€þÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿDÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿöÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¼ÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÞÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ´ÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþˆÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿ`ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿäÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿèÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€?ÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðû¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿú@?ÿÿÿÿÿ½ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÏÿÿýÞÿïÿÿÿ½þ¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþMÃÿüÿÿÿÿ—ÿÿñ/ÿÿÿÿÿÿÿÿÿÿçÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ"ÿÿà ÿÿÿÿÿÿÿ›ÿëÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ ý lïXÿùÛsÿÿ·ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿü ëwÿÿÿÿýÿÿÿÿÿ¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿü ÿÐT3ýÿÝ—ÿï÷ÿ{ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿƒýuþïýÿÿÿÿÿÿÿÿÿÿÿÿïÿÿÿÿÿûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ ÷ßÿþ¿ÿÏÿÿÿÿÿÿ÷ÿÿñÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþß÷ßóÿÿ÷ÿüÿÿþÿÿÿÿÿÿÞÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿöøvìÙzïýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ >Ÿÿÿÿÿÿ÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿü Ý“Ýõÿÿóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøìýßÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿç gïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿæ å+ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿè oÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷ÿÿÿÿè &Pùÿÿÿÿÿÿÿÿÿÿçÿÿÿ¿è ˜?ÿÿÿ‡Ïÿÿý€  iaxmodem-1.2.0/lib/spandsp/test-data/itu/fax/itu7.pbm0000644000175000017500000175231511150047204021736 0ustar julienjulienP4 1728 2376 àà àÿ€€ÿðà€8€`àùà?ÿÿÿ€€?ÿðÿïø€ süøàà0ÿðþ@`ÿ?ðÿðø?ÿÿÀ`ðx??ÏøƒþqðøààÀÿø þà`ð```ƒüäøÿÿüÿ>8?ùþÿ7€à`ÀxÀÀÿÀ?ß÷°ùãpÿà8€8Àà€ÿÿÀþ0üx<€xá½€†0ÿq†gþ`>üÿÿç€áÃðÿà8›þðàãÿÀ€àp`üð<þx<†0øáƒ```?w<ÿÿ€€ÿ€ðÿì8ÿþðàãÿÀ€ðÀ À<|€xá6þðÀ`a`€ ?÷üþ€€á€ÿÿø?ÿŒààà€ƒð€<€xÇvÎð3ƒ€oÿà8À ÷¼?ÿ€<ó€÷ÿø ƒàãàÀ€ ƒø€<xc€07€€oÿàpà ÿyü?ÿÀ÷üƒÿÿ€ãÿÀ€‡ü€8<xìÃÀ€0?ð€```€ |wü qð8óÀçüóïÿà€†ì8p<0xáÁàü0~8 €``ÿüüþgà9ÿ€ÀüóÀàà€Žîÿàà<0xÀü0ü€gþ`ÿüÿþÀ?ÿ€ÁüóÀàãÿÀ€œç?ÿÀ€<0xcŒ0¼ 8€f`ŸÇÜüÀ8óÀÿü?ƒÿÀàãÿÀÀ˜ï€€<`xÿ€ãÿŒ08 pF `œÀœüÀ8ó€÷ü?ƒÿÀàãÀÀ8¿ÿàÀ<áxÿÀヌ00 àF `œ Àwü?ÿÌà€ü7€üÀàãÀððçýðð<Á€xÀ cø0p ÀÆ`?€v <€ÿŒü€üw€Àá€ãÀÿðÀàà~~Áÿ€üÀ cø0øÏþ`ßþxø¿ïÀü0àüÁþaÿÿ€ÿÿÀãÿÀ?À€à?üÿ€þÀヌ0˜80ü`ÿøÿÿð?ÿÿÀüÿþ8ÿßþÀÿÿÿÿÀãÿÀ€àð|ü€ãÿ€pp„àÿ~?ÀüþÁÏü?ÿÀãÀ€à€À c‡€ðÀà p?ø€ð|€ÀÀ€àÀ  ÿáÀÿÿ`ÿàppà€xÿàÿøÿà8üÀGÀ>€8€`ÿüÿàøÀàÿà€ÿÿÀÿðÀð?ÿà?ÿÿøÿÀ€ÿ`ÿÿÀ`?`p>xÏ?ÀÀÿÿøÇÀ?€€€ãààÀ0?ÿà0øÿÀÿçàÀpÿàÿÿ€8Çÿàÿ߀àÿÿü þàÀÿÿðÀðð€€?À8qà8áÀààÿÀ8ÁàÿÿÀÀ<xþþÿàÿ‡àààçxøüÀüÿÿð€àp€ €9À00pà0Ì8á€À0àÿ9€@€àÿÿ€à?øÿ€ÿaà€ààÿàÿþÿð€àÃþÂð€pÀ0à€€00p`9ÿÆøÿ€çÿø`GøÀÿð€`ppà?ÿø?Ç€ÎaÀÏÀÿÿà?þ|óÀ@€<ý¾€ àÄ €àð0 8Á€Çø@€ ˜à`àà€>0?ÀÇ!Àÿÿþà@àÿà? Çà€0Àÿà?À !øÀp8á€ü ÀËœÀàà€<8ÀÎc€vÿüÀààà|À<}¾ã€À?à<ð0 øÿ€Î€ÛàÀÀÿ3€€Àðgÿà~À>€=Öà€1þpøÿÀ8ÇÀÀÙœÿÜâÀ?ÿþ€þ7€ÿÀüïÿàÞ À<Á† €ÿðð1ÿÎ €àÁøw9€3€ÿþgàÿþ€Ï?€ÿ€Àÿg<àÎ à>ÿ€€ÿ€pÿÆ ÀÀÀxà?øÀ3ÿÀÿþ~à?ÎøÀ‡ïÿàÎÀ>@ã~à €Îð0 á€Àðà€ca€~à>ÏÿüÀƒ€gÿà~ À@aÇvx €Œp8†?áÀÀà0 Àc!Àÿž|0ÿÿp8ÀÏ€ïÿà~`Èÿþ0Æ<€ð0† pá€ÿÿø €01€ã3ÿþ<ÿç08À΀çÿà> `Äï€8†ÀpÆ0aÀÿÿø0€Àãÿþ€ç?ÀÇp8À¾€Ç8Àà‡ÿᆀp 0À?ðp0f 0aÀ`<0 ÀÆpãÁ‡?ðÇ8À<þ€Ã˜ÀƒÿÿÀðp`1ø pÿö?áÀ€à~0_ÜÀÆ€p?ÃçñøÇp8ãøöÓ™8ðÿ€€€ÿî0ÿÀ`à˜ø;ÿæ ?áÀøãÀGàýÀÆÁà?ÿÿÀÿàøÿ?üðà›™œ8øÿ€€€aÂ8ÿÀ?à?€Àü80`Àüÿ€càÀÄ?ÀÿÀ?ÿÿÀ|ÿ ÿø?€8;ÿœpp<ÿøàü8Àÿ€>?€Àèáøp?Ç883ÿŒ ÿøà?ÿþÀÇàÿÿÀéÀø€ ÿà8 €à€Àx`€Àà àÀ€ ÿðpÿÿ€|ÿ€À>p800 ÿÿà€ð0ðÀpÿÿ€ÿàÿø9àÿàp8ø30~?߀~f ‡>ÿÿÀ€8ø8à8?à0þ€Ãàÿø89ÿÀáðãqÀŒà¿ü?ü?ÿ€÷à€ïÿ€ÍÆÿàÿ€#€<8<À8?à0ÿÿÿàƒà<80Àðÿÿà„`sœÿÀ0€ÁàÀïó€íŽáð<{œ?€8àðîÿÏàà 8wø€ðøü„`vvØÀ0€€àÀ ÌÓo €ðà †ø`tÜ`à0€`€ ›œÿü`þÿðÿüø~Ï<ÿüp8< „þàÀÿÿ `0àeøp?à0 ¿ ø?ÿ?ÿœð>Ï<ÿžðp|ÿ¾øáÿàÿÿ€`0à`x8s8?ÿ€ ¿øÿÿœp>1ÿøãŽàðöx¼>0áÃÀƒ`0d0|ã?ÿ€ †€ÝðÀ<ûœàùÿüÃü8ÿÀ8Þ>0p`ÀÃç`0fïƒà8€ ÏÿàœxÀþóœàùÏ8ß?üxÿà° ÿþ>3øcÿàÿÿ` b_Çà?ÿ€ ËýàhÀÿsœÀ9ï<ƒ|8Àpü0ÃŽ>?`€` s8€ `8 ÀþsüÀ<9ÿø‡ðø€pþ0Çž><<`ƒ€À@`cÀ8€ `€8 ÀÿsüÀ<9ÿü‡àøp>8ÿþppaÃà0ÿÿà`hÿüÿÿà?ÿ€ ÿÿ€ÿí€?þsø„8;Ï<Ïðxpp8çœà<ðcÿà0ÀÀxnÿÿà8€0 ÀàÿÏ€0àÀsƒ†x9Ç<NÎpüð08ÃŽàðaÀà€p€À`xÀpc808€€p `瀀0œìàþs‡üp;Ïøþüpßà08ÿþƒÀ<ð<c€ÀÀàÀ@xçà`f0p`?ÿ€€à ÆÆ€`ÜnpüyþàÇx |üpÏÀ8xÿÞ`ÿÀñøq€àÿà9‡À`8Çppãà>áÀ ã€þ€áàž~pðÿþÀÿÆ|8ðàÿ€?ðÃpÿÿqðãÀÿ€s€`ðpþ a‡ïðÿ€ 0ÀŸÀÿÀþ0`?ÿ€çÿþÀÀ~àÿð<<qÿàჀ?à0qƒü>À 0áÀ?œøüþÃÿü€€ÿðã€Àƒ€`ðÀ CÁ€qðøàøÿÀ`€`ü€Àà ÀÀà À@€0€€?ÿ€ÀÀpàãþüÀþ8Àÿ€ÀÀÿðÀppÇþ€ø?Àþÿÿàÿ€à?ÿü`ÿøÿþÀþÿÿƒþx€àÀ}ðà0øpçŽÀÿþÿÿðÀø> 88ÿþàÿ €ÿãÿxÿ€à€<à0øyÇàþ<x?€€à<À|0þ<8ÿ¼À  xÿðÀ|C¾@<ÿ€ÿààÀ?ÿþàp8çþàþxÿàÀ`<ûÀþ0Œþ?ÿÿÀ<üpÀxsœà<ÿ¼ðÀ€{ÿüÀàpyÇþÀxÌp€à<ÿÿþ3ÿœÿÀ p0ÿü8€pÈ9€6À88€x€Àx0àÀàpçpxŒ8€Ïü`<þ<~1ÿÌñÀÿûøÀ <€0ÿÀ>€<x€88€øÿðÀÀÇþÿÿðxüà<8<€0ƒ@0€ 08€p qÀ8ÿ€<8ÃÀøÿðÀÀãþÿðx €Î`<8 <8 úàÿþpÀ<€0 0À€<ÿ€0pÿÀø`ÀüpÃx0 Œ`<px0Ç »ÀÀ àð8€p qÀ~ð8x€0ðÿÀøðÀÿpüx0€Î`<`x0ÿ à ¿þø8üpÿÀïüø<x€qàÀ¸ÿðÀÇ€qÿŽøx0` ˆÎ`<àð1Ç ÿàÿü 8ÿðÌ0À€p<ÿ€1ÀÀ8GðÀ€qÿŽÿàxà ˜€Î`<Àà0à ÿàà<€pÌ0À<ÿ€3€8À8@ À<ÀqÇŽýÿàxÀðÎ`<€À1à  8àà à€8€pŽyÀÿ<?ÿ€?€8À8ÿøÀ<ÀqÆýÀàxÀðÎ`<€€ 0à ÿàÿþÿÿ€<€0ÏÿÀ<p?pÀ8ÿøÀ;áÀqÆÀàx€8àÏü`<01Ç øàà €8€pÌ0À<pðÀ8ðxÀ ó€qÿ†Ààx8àÏ<`<8ÿ 8`à€<€0Ì0À<p8 àÀ8àxÀ<€qÿ†ÀàxàÌ`< üÿÀ0à ÿàÿü <€0Ì1Àþ<p8€À8àxáø?qç‡ÀàþÀÀpÿüÿÀ8€ àÿâø||€pÌ7À<|øÀp8ÿøàþqýÿàþÿpðÿü0ø 8Cx<€ÿÿðì3€ÿøøÀø8ÿøÀøp~ýÿàÿÿðø8üp8ðÿÿÀÿÀp|à ÿð?ðÿÿø8àpp>ÀàÀà0|ÿÀÿáÀ€ ÿà‡øÀ€ÿÿð €@€`0þ€pÀÿÀÿÿøƒ€0@ÿÀ8ÿÀ€€ƒ€À8p8ÿ?ø?ÿÿÀ?ÿà8ÿøÿÿÀ€ÿÿø?À~ÿàpÿàƒ€À=ð8ÿø?ÿÿ?à?ÿàÿþ0àçøÿÿÀ€8€ÿÿøƒüÿðwÿ€àÿð€€Ààðÿ>çp0áÈ?àø8pðÿgàÀxüÀxÿøÀ`8OÀ€8xðà>À8ð€ü€ààÀÿ€~Çp?ÏüÀþpðàþçà`À8üÀþÞÀ`0àÀ8ÀÀpxpÀÀ7À8pp>ŒðÀ¹àþçp?ïü€<Ç p ÿðþàî``ÀÿÀÀ3€ Àgÿ0wàÀp`øÀx0ÿÿ€ßÿàc?À80€p~þàÀ?€xàøçx`qÎqÀðÿðñÀìÿà€óƒ€1ÀqÀgÿ0Ààp?ÿx¿þßÿàaÀ8ñÀþÃÿÀ8ppàÿð?ïü áÁ€ppÀ|pàÇÀùÀ8`à0p`8?ÀÃÀøx?ÀÀÀ8ÿñà÷Þ‡ÿ€pàpÀ>þ|ðÏü8þÃÀðÿð8ààÇÀ1Àpà`'ÿð`0?ÿÿ€xÆ€ÎÀ8þ8ðsŽ€pà8À\0p0î?þƒÀpÿð6ÿàÿ 8À`À``8ÀwÀx€Çÿ€þÿü8ü8ðóœ€áÀ8€øppxÿüÿðÀð8ÿÿàÿ1ÀÁ€`ãþ0Àÿ÷ÀxìÀ€ÿø88ðÞ€aÀ8€üppÿüÿ€Àpÿüÿn`Ç0ÀÁ€pcž8?ÀÀ€xæ`À€€88pð?ÿþÀÀx€ÿðð®<îÀðø r.`‡1Àƒ`ã 0ÀxÌp ‡ÿ€ÿg˜888þàg€8€ÿÿð?üŽœÀp€ óÿpÀ8ÀÇ`cŽ8þx†8Àÿ3¸8ppçcˆÀ8op€ÿÿð?ÿü ¸€ðÿÿÿ€ ÿÿà€1ÀÎàÿÿþã 0ßþÿþx €7ð8pp瀀à>ð€üp?÷¼ ø€p<¾ÀÀøÀ|àcŽ8?Ìx€Ç¿€›À8áàœÀxÀ8<àÀøp?> àð<8þïÀ€<ñÀx€ãü0a˜ xÿÿ€ÿÀxçàÿÿüÀ8Àÿðüp?`øÿüÀ·ÎàÀ0À0€ cŽ80Ì xÇ€Þ;`8ÇÀÿÿÿø€pçðÿð08€ü<8øqŒððÀÀâ0a˜ 0x†€üöpxÃÀ>ÿÿðpÿðÿüwøðüü3Žxðð€À`80Ì0þÇ€ã<þ<þàøøáÿþà8r<0ðÿÿÀàðŸüÿþü‡ÿ€þ<þpÀ0Àþ`x0>€À`ð1Îÿ‡Çÿ€øx€@à` € †€0€† @ ÁÎ8<àp?ÿÀãÀ ø`<áÎ0à8=þðp?ÿà?ó€€à~ÿÀ?ÿüä€ ÿà<€ÿÀßÿøðx8ÿüà`>ÿà÷‡À€à€À̇À?Æü<|?ƒ€ ÿð00€ÿ€ÿðÿøàðÿà8ÀÿüÀ?àp8xðçÿà€àÀÐæÀ0 x< € €xðø€?ü~ðÿÀÿþøðÿà8Àÿÿüÿàøÿà0ð`<à€`À¹ÆÀ0Œð›ÿ ÿ€xpàxà08p€ÿàÿþÿüàà8Àÿÿüþðÿüÿÿà0p`8`€`À9ƒÀ1Ìà ?Ûÿ ÿ80àpðx80ðçÿÀàÇÀàxÿÿà8ãüðÙð€`ó;€€1ÿŒà ?†ä?þÿ80xààçÿø8ÿþçÿÀð‡ÀàÿýÀ8Çppøð‚`ã9À0 à€ð?þ|p¸8ùÀø8ÿÿçÿÀð€ÿàÿŽÿýÐ8pp?üðžcÀÆqð<0 À €„Ð àØx?€î8ÿÿÀçÿÀàðÿàó‡ÿÿø8yÿ€p¹øþÀÀfð<8 À ØÀè8 €ç€8ÿÿÀçÿÀÀüÿàá‡ÿÿø8p€yÿÀp£¿€ð~›ÿ<0ÿ À9œ€@xÿ€páü8?ÿÿàçÿÀÁÀ <þàᇀßð0`€ðC€ðÏ€Àxÿÿ€<0ÿ À³Ž€8ÿ€à@ü8àðÿÿðáÀ x>àÇÿýÀ0à 8ðgðŸÃÀÿÀ<0à À¦€x8à8ðÿÿø〠p|àÃÿýØ1Àpð'p‘Ä€Ø<0à à€xx À8ÿøÿøã€àxÿàƒ€ÿßü;€8ðp>p¿þðì`0à àŽxÿþà|8üðÿðã€àw‡ÿà‡€ÿßü€8àp>ð¿þøì`1Ç à?üxàÿÿü8üàÿÿøãÀ</çàÿßÀpÀpp3ƒŒØÎ@À1ÿ ð?Œ€x` 8øÿÿøç€xÿàóÝÀà€<p>ðc‡ ÚÀ`À1ç ð 1Œ €x` 8øðfpþà>ÁÝÀÀ0p€ü‡€ ÆÁpÇ€0€ |xà1Œ àx` Ü8øn?üà <ßÜpçðüŽþÿ€ ÎÃpÿ0 ?øÀ1Œ ~þ`ü~ø?ÿÿ€ðÿà‡ßþãøœøþ€Þç0x8üÀÿ?üþþ€þð>?ÿÿÿà‡ßüâðxøÜÿ€0|þ1üþ`çÀðÀ˜p€0 ` ÿÿðàð@ÿÿà~pððð8áÀÀþaÀ ÀßÀÀ>€À€x`€øàøÃÀ ÿÿþ€ã°àÿøÿÿÿÿÀÿàÀ€ü€ÿàÀ?ã0€øàð ü`?À80?ßÿþ€á¿ðà|ÀáðÇÀÇÀ€à<| ?ãÿÀÿÀøüà8à>3€<0pþƒ²À8 8ÿÿ€ÿ÷àÁàÿÿ@Ààp< 0ã€À8€ øøÀà`ÿÿùÀ<80 üÿÿÀÿÿð€pãð0À€`ð8ã‡`€`ðÀ €üøÀàN8áÿÿûÈ|ppü0ø88.À€ð` æ080Ààà8?ãþ `øÿ€`ø?ÿ€ €þøÀàÎàÿÿþ00à 0þ0ñÀ8àÿøöÿ}þÀ f8Àÿàà 08c‡ Àð˜à`9Îÿ€ €ÿðÀ€=Ï8Àÿÿü€pÿÀŽsç€ï€p0ÿà8.X€ÿüà<ÿàÀ`0 8`|ᆰÿ€?ðà ÏüÀÿñÜÀpÀÿÿ€?ÿƒÀχð0Àöü}ÿÿüÀÀ<€`ÀÀ?ãÿÆ000üÁƒ€ÿ€?ð?ÿÿàà8øÀÿ㜀`?ßÿ?ÿ€Ï£Àpÿþîø{¾€à<`À€?ãþüÃ00`0ðƒ€?ÿ€?À?ÿÿÀðüÀÿñÜÀ`=ÇxþϱÀ0ÿÿA‚ùð<€`À8øa€80``€€€ÿÿ€ð8ø€ÿ㜇À`}Îpþ<Ÿ±€` ÿüÿÿÿüÀ<ÿàÀ00Á€þ`À8@€?ÿ€ÿÿø:|Ðÿóœßð`}Ç8xÏùÀ ÃŽÿ¼sÿ<ÿàÀ8ÿ‡0cÀã€`À` €ÿ€€ÿü8>8ðÿãœüxðýÎpþàÀ ݹÀhÿŽŽ8ã†ÿÿ<àÀ€1ÿ†`Á€Á€a€0 @€8€€ÿà>@òÿóœð8x]Î8þà͹Àx ÷Žÿüÿÿÿ€ÿÿ``àÀ8Á‡`À;ÀÀ#€0`€ÿ€€<à`àà1ÆÁÀc€À6pàp>߀4€<€?ø@ñÿ€ÿ÷À8xÿàÎ8ì€ÙÙÀxÿàÃŽ†a‡€p >à`ðp8Á‡ÁÀcÀ>`ðð€ÀxÀð<8Ààÿ€Î8xñÏàÜpîÑÀxÇð9ÿŒÿøÿþÁà~ €`ð01ÿ†“€ÇÀÀüÀ?ÿ€ÿþ `ð0Á‡ù€Ä0?€øpàÿøÀ088áðÁÇÀ`‡àçøÿÿ€|àÀ 8€pÀ€`@Ààð0ã€Á‡€øÿàÿø þ€à 0> øà`Àƒ€øÿÀÿðÀÀ0àà ` € Œ0 Ž¿ßÀ8@ àð  €€žxþŽÿÿÀpxçÿüàðø€þàøp܃ðpàøüçžxþŽ€ÿüÿÛÀ|øçÿ?ÀàøÀ@üà8ÿøðþ ‡ðpÀà8ÿþžç<ŽpÀ;?ÿþÿÛ€À€~ÀxÀàp €øüÌð† €À°ÿÿ€þ?üqÆÿÙ€Ž8€ÀÀp ð8<ÿùŒ``€s?ÿÿàð|oüÿÿÀ?À>x>><ƒ¿ÙÀ€ÿxÀÂ?€p À€8ÿ€!àÀ?à80f`Àð?8|ÿüÿÿÀ?À~ðpƒÿùÀ ÿ€ÿÿøÀÃÿp €8Ìàñ‡àÀ?ç8ÿÿà8ÀðøüÿÿÀ—€~À€sþû€À8 €À€p€8Œ~€0çÿàà ðþøøœp‡€N€€p`g€à0€ 9À€p€8 €80æ08ÿþøüðÿ8œpÇÿÌy€ÿÿ€àp ‡ÿ€üsÀ€p€8€óÿþ?æð0üxüàÿ8œpÇýÎ8ÿÀÿÿ€à`0à‡ÿ`cÀ€p€8Cÿ‡?æñ€øÿ?ÿÿžp8ï88ÿÀxñÀÀðÀ €ÿð€ãà p€88€†0æÿÀ€ø89ÿÿŸð8þú8ó€?ÿÿÀðÀ„þÿð€8ÿðàp8ÿÿ€0Æ<€0æ1áÀÿÿÀø0<Ÿð8~ÿ€8ã€ÿÿÀà€‡ÿ€žà`À8ÿðáüp 8?ÿàðN8€?æûÁÀÀ€ø08ðp|û€8ã€ÿøàxÿ€ À`ÀðÀÃþð8p8áÀ0|sÀyÆ86ကð8ˆ à~ÝÀ8áƒÿüàð†€ À`ÿàÀÀðø€8áÀ0<ãpæ0ÿÀðð8€Áÿ€¹€pÃÿøàÀŽ À`ÿÀàÇ»€üð€xÿ€0<v`Æ00Á€ðø<ÿÿÃïððƒÇ€ÿüð‡€žàððÁøþ àÿŸà0À>pà0áÀ€ðð8ÿÿ‡ðÿ8ðÿ€ðøà`ÿüÿààÀ@üÀÿøñçÀøaÀ0ðá€Oÿ€ðê>ðÿàÿÿüÿø‡€Œàð|>?€Àsàð0ÿÀùÀð üÀxåøÿð„À` ð <aÀðÁ€~Àððøøàøøp`0üü<p àà<àp`üøÿþþÿðp>pÀÿÿðÿÿÿ€?ÿÀ€ÿþ8ÿøÿÿ€ø0ÿÿ|`ÀÀ?ÿþþø8ÿü`þà¸pàà| ÷€ÿÿà~ÿÿàÿÀ7ÿþüàøÿÿ˜`üÀðpÿðø€ßp€ÀøyÀpsÿ³€À`< ðxñàÿþpÿ8c ÿÀ `àx0 À?ð8xðÿüüø€p€Àÿÿ€àãs€à< p`ààŸÀp‡0ÿÿ÷€ÆaÀ8`˜ÿÿÀ8üüÿüüøà‡€p€ÿÀÿÀàá€3À`< 0`ð`9Œàpƒ€ÿøÿÿˆ€ÿçüÀ3ÿŒ?ÿÿÀ{œÿ><øÀáð€àøsàÁÀœvüà< Æà!Àpƒ€0€ðÏ€aÀ`0ÿÿÿœüx?àð€€þ88ÿ€ÿÿþ€ðœ6Ïü`< çðÀpp@ƒ€À`ÿŒ  `À08 ÿÿþÀÿüp€à?ÿ<pÿ€ÿÿüø°tŒà< `ÆàÿðpÀ€ÿðÿÿ€¼ øÀ`0ÿøþÿüp€ç|Ç{€ÿü»öÎ`< `Çð8}àƒÀÿø€¼ üÀ08 ÿð|È`€>‡þüÇÿ€ÿ߀ÿóŒà< `Çà0À‡€0?üÿðæ`Àb;Œxyð`ÀÿÀ~‡çøçÿ€8Àq€Î`< `Çðÿð{àÏÀÿðþàÿãÀ3ÿÌð<üùüàÀóàø‡‡€Çÿ€ `€ qÀÌ`< `Çð pÀÿ€08À ?ðÀp0 ðøùÿ€à8ÀÁàðÇÿ€0€@þpÀÎ`< `çðp`û€0üÿ€ ‡ðÀp; ð8ÀùßÀÀ8àáÇ{à8 ÀÿðþpàÎ`< áÇà?ÿþp€ÿðï€ Æ8pÀp3 ð8yÏÀàxàÁ€;Ïÿð8àÿðpàÏü`< çð?þp€€0<~€ Ã0À09Œð8qÀàðÿà‡€cßÿðð€`pàÎ<`< aÇð0ø p0ü 9€ 'pÀp0 ð`qÀaðÀ€ÿ€þ`Àxÿø€`àÎp< `Çðø x‡ÿø q€ spà08ÌðàqÀà€?àÿ€ü`àp€`wÀÀ`ÿ ð˜øÎáðüá€ÿ÷ðàwÿìpàáÀ?À€àÿx|ðð0~€`wÀÀpÿü˜|þþààüÁ€pà0 0ÁÀ?àþ0?ð?ÿøÿ€ÿàþpÿÿàÿÿøxüøÀxÿÿÀ€ àp Àðÿðï€ÿàpÿÿð0<ÿÿÀ<€ÿÿÀÿüÀÿàøìÀ`p€` < €ÿÿÀÿüøÎà€0 8Îà?89Îp?xÀø€9Žp8?ÀÀ`€ðÿàüÿÿÀ9pˆ8Á€8ÿðð@?ÿÀ<ø1@øF`?ðàðpÀxÿàÿðÿÿÀ8 xüÿÀ0àÿððàÿà?@þ< ÿ€?¿üýÿàÿ€wð??øÀðpà<ÃÀþpÁÁÀ8pç€vÿà8ðàxñà€€`ÿvÀ€ 3¿þýÿà‡Àæÿø?Àÿð#ÁxpñðÇ€ŒxÁÁÀ8 `ã€çà`80çàpðàãÀ€0Ç€ãx€ €33Ì ÀæÏ8?À?ÿÀ?óÿ€xpððïÎxÁÁÀø æüÿ€Îà`80æà`ð`ÁÀ€0‡€á€x€ €3xÿ€€ìý°?ÿß?ž?ûÿ€w€ððÿ€ÎpóãÀïÿþÿÿ€ìà8ÎÎàðÁÀ€0ÀÀÀð<€ €2~püÿÀ€m¸à?ÿ€><>÷Ç€€ðð€ Îã€ÿÿÀÇÿüÿã€üÿàxÎàðÁÀ~‡€€àÀ8°6ì0Á€<€é¸À?>À88€€ðøÿ€ÿÿÀóãÀø> püó€8à`8‡Ààðã€þ‡€xÿÀ8ð4<8¼ÿ€<ëð`?€p8~€üðøÿ€ÿÿÀÁÀ<püÿ€>ààx—ÀÀàÿ€ð€¾øÀx?À08üÿ€8Èðp?p8x€`ùøßþ<ÁÁÀ~ pã€ÿÿà8Ãàð ;ÿÏ€px€38€ Á€8laþ?8àh ÀàçÀ`x0øx03 øã€xÆ?x`ÿ€`À0 Àp€0<üÀ0ÿÀÀ>?Á€p€?€Ã€0?€Çp?ÿ€àú€gp€?ÿ†àÿàà~àà0€ø ÿüø:ð?ÿð?€ð€€ð|àð?ÿü€ÿ€€@ÿ€8ÿüÿ€?ÿø?ð|à<>àŸ€p8€€à{x00Àÿ€`€€p?ü<ã<€ƒþàÿ€p€À€pq€0Àÿ€`€ÿÿ€ÿü?ü|ÿÿ€x?¾ðü€pð€ààÀ80À€€`À€8à€{ÿ<ü<ÿÿ€x?¸pü€ð€à àp00 @€ÿaà<€|Ønÿà€à0|?ýðøÀðàÿà†Ød€x<0À1ÿœ€ÿøæ08wÛè<<ßw°<?üàøÀ€pÿ xŸþ0>0ÿÀ1ÿŒ€ì08 X <À0|8àøàÿà80À øþ?Æÿ€ 1ƒþø0xÛð8÷À<?8àøðð 80à àü†ÿçÀ 1ƒ ÿð0x>8q<pç€øxqð `<0à À†þ`1ƒ ‡€àpx8p?x À<¿ÿ€ø8xð à<0à €þ`1ƒ €àpxÿðóø<ÿÀ<ÿ€ø80ðøÀ<€0À@0þ<Þ`1ƒ €À`xpÁÀ<qÀ@<€ðx€8ðü€€0`pÿüh1ƒŒ€À`<pÀ<pÀ`<€à|€8ððþ€€pp0`x1ÿŒ€À`<Àÿð€<@ÿÀx|€à<€8ððÏ€€pp8x@ xÀ1ÿŒƒ€À`<Àp €ÀõÀ?ÿ€~€à?<ñð€`pü@œ8`8pÇà1ƒ ‡€À`€p€ÀqÀÿÿ€àþøÿà‡€€àqøpø0pxpÇà1 ‡€À`€ÿñ0€ÿÀþÿ€ã€üðÀ€À€?øþx`|ðpþ0ÿ À?€ÿa0ÿýÄÿÿÿøþÿÿÀðà?€€À€øþpÿüÀ0<?ÿüüÀ?ü€80þpÿÿÿø?ÿÀ€pþ?ÿüÀÿ€ø0x~ÿÿÿø€`€ 0ÿ€ø?þÿÿÿø€`øÿÿÿø€`ÿÿÿø €``?€ÿàòp€>ð`8€?ÿð‡€ÿpÀ?p`ÿÿÀxð`àø~€ €€€?ÿð ?0qÀ?Àc€æGø8ŽÀøÀøpÀ@@€üÿàŸü€Àü€€<|øïÿ>€øãÀ?þÿ?Àƒ€`w3p€000@à`ÿþà€?žx˜øøÿøðÿÀàÀü>3<€`0À0àþð3ÿÀ€þxáøðÿðÿ€ÿÇÀþøàü<àpñð `ÿ€ÿø À~mŒF€0à€`ÿÿððð`€?üþþpÀà Àÿø€ÀîxØl&€0àÁÀ ÿýààðt?þþüp?À€ðxàŽÀ ÀàøÌì7ð8ÿÀüÿÀ<<ü8>€ü8þðp€àüøàþÿÀàÌwà0ÿÀøüøü>?þp€àÎøÿàþÿÀÏø8Àþà€<€p€@ÿ€ð0 €€ ?€€€€€?€€€€?ƒðð8à€À`0`00 €ƒøøxà€Àð€80pÀüx ~÷üã€øàðàøxÿþà@ ÿ0 8à€ðÏÀxÀ€ÿÀ÷àÿüãüðpà€ððùÀÿþà=€ ÿø0 àÀøƒÀèàÀÀÁàÃ?~àðÿà€pà?ÿàÿœþøxÀ8ÿøp0 `ÀÀ8ÀÆ8pþÀ?À€àÿÿà €ðÿ€à€pà?ÿàüüðà<8ø0ÿðŒÀÀÆxpÿ€ÀðÀ`9Oÿÿ€ààüà<àøùÀàxxp 0ÿÿà8ÿþÀƒ€x81ÀÀð@`Ùn¯€ÿüààþààŸxñðÀ<ÿÿÀ`ppÀ8 <ÿüÀx80àÀàwÛèÿþààüà>àÿüÀø€?ÿûð8ÿÿà0 x8À<ðp88``ÀX à Ààðà?ÿàÿøÀø€ÿÀÃÁð0ÿÀ0Àx8À<|x80`0€Ûðà Àà`à?ÿàŽ€ðÿ÷ÀÀ`€00<ÿàø8à<<ÿ¾xx`à0€øÀüÿüÀàpà<àŽ€Çã€Çÿàð0xcÀ˜8æ<<çÿž8ø`À0€ø ÿÿÀøüÿüðàpà<àÿÿððàqð#€ÿÿ<<?øA€0€8ÿð8À<|à ðÀpà<à?ÿÿ€€ÿþoÿÀpÿ€ð3€ÿþ<<`øÃ€0€pÀà òÀ€ðà?ÿàÿÿ€€ÿþ΀0÷ÿ€°8À<?ÿðxG0€`Àÿüó€Àøà?ÿà?ÿ߀>x1Žp÷€08À`?ÿàxn`€0ÿà8ÀÿüÿÿÿðñÿÀÀŸþà<àÀ89΀|p s€00ÀÀ`p|à€€p`8Àà ÿÿÿøáÿ€ƒÀþà8À€88`9œ8Àþðw€00À<Àà8ð8À€À€``0Àà ÿÿÿøà>ÿ€þø<àÀø8x9Ø8ÀÏà w€0?€pÀ8‡€Á€8à€€8ÿüÁàÿñ0À@ÀÃ|ÿÿÿøÀÿàø<À€øpü90€ÿÀw€0wð8`ÀðÿÀ?À€ð?ü?€ÿÀÿã`ÀÀ?ÀÃ|ÿÿÿøü€ð?ÿàŸÿxàÿþÁ€0€÷ÿ€ñáüàààþÿð€ÿÀÀ€àÀÀ‡€?Àÿÿÿø?ÿÀ¿ÿüÿþÿÿÀp<÷ÿ€ó€ø9ÁÀ?ÿð€€ÀãÀóùþÿÆ@ÀþüÀÿÿÀ0 #€` ÀÀ0ÿ€€ÿà`ÿþ?€øÿü`þ€ø?ø{Þt€ðsœh?ÁàþÀø{Þ|€`À@ƒÀÿÿÀ?üóœy€à€qÐ 8üàÀ?€ÿÿÿÿ€ÀÀþ{Þà8ÿà<ãÀðÛð€8€ÿÀðð@ÿÀ~à8€€þÿÿçÏ€~#€ÿÀ¾÷œð=€xàÎøÿs€áÛðÿ€Àà?ðÐxà`þø€ðð?€ÿÀÿÿÃÀÿû€ùàßÿþp<Àü8à÷ðÿs€ÀÌ€?€ÿ€Àp?ðˆü`08gàÀ8€?ÿàïp‡Ã€ÿû€ñàßÿþpxÀ?þ0ÿÿ€w?üÁÀ€`8 ð`p xàÀÀ|8 ?8ð ö8ÀÿÿüððŽ3Œppp|Çÿvœ7ü€€ÁÀÀ`0ó€aàp 8àÁþÿþ?€ð ~€ÀÿçqàÿÀà8ð€?çàpàÌÜà€Àà88ÀÀ`ð88ÌÆø?€ ÀþÀÿî8óÀÿÀ8à9Ç wàÙÈÀ0ÀÀ xp€À`áÿ€80ÌÃÿ{ø?ÀþàÎ8ÿÀü€À8 0æwàøÀàð€Àƒ€üxpƒÀ`á‡À80ÌÁÿp8?€üÎ?ðÿÜxÿ€|püÿÀÀ8pÆwÀáÀà‡À?àÀÿx?à€à À€áüÀþ0ÌÀ`8?üŽðÿ™ø8püÿÀÿø1çþs€àÀàÿ€?àÀþpÀÿààÀ?`üÿ8ÎÀp8?€ð øðÀp€ÿøsÇÿpáÇÀþÀÿàÀ@?Ïþø?€€àÀ`à81ÃÿpÀÃÀÀ?€`0Îø€€€0`€€88Àþ€p€<@<àÀÿÿ€žÿø€ Á€püçþ1€Àp8?à8ÿþ?àÿÿ€žÿøÀ80üÿ€p€Àþçþàü9?ÿÿàÿð€ÀÿÀý€ÿŸð8ÿþðãÇ€Àxà>ÿü=àÿÿüÿ€`À?àÀøpÆ ðÿø?ÿÿxÃðÀŒ€ÿÁà|ÿð€ü€wÀÏxpãàðxÀpçüx0 €€vüC€<€ÿðÿÿàÿþqðÀ~ðÀp~ÿÿÀ8€0ã€`pƒððxÀpÇüpùÿ¸>8Œ‚ðŒC€8ÿðÿÿàÿþðÀþàÀpþÿÿ€ø€<üÿ€À0€ððx€p`wÀÿøøÿdž†ØŒCxÆ0ÿøÀÿþàÀÜ€Àpþxàxÿ€;øÿ€Àpððx€ð`Œà?p8øÃ€þŒÜŒCxÿðø8ÿøàÀÿð<÷¼<ðÿ€?ÿŽ€0}ø€pgÿÌ|ðüÿ`p80Á€þ9Žüfxÿðÿpÿÿø€ÀÿðpÏ?€ÿÿðÿ;ÿ΀þ8pø€ð`ïŒøpùó``0`À޳œfxüÆpÿ¸pøøÀÀpÀpžÏÀœ9þ‚€ÿpx ð`f pxÿü`0`ÃÀ†€Œ>xüÿðÿxpøÿø>À€pÀà}ïÀ9œ0€ppàð`îìðxÿüà0ÀÀ‚  <xÿðàü?ðøø<8À€xÀÀóá€yÇ€€† ppæpoÿüpxü30à0ÀÀ€ü¼<ÀÆÿÿø?ðùÿþxpÀ€pøÀÏüñŸÀ~ÿÿÿ€€p àÇð`î pp˜{pÀp€€?üü<<Àÿÿ€øà»ÿÿøÀ€xüð?>ÿÿðÿÿÿÿ€€‡p0xàÁÿ€ðpæxpŸñàÀ0€€Æ Ì>Àÿüÿÿàx;ÿÿÿðàpðpüüŸüðü€`8>`{ÀÀÿðaÆ xðñÀ€`3€1Œ €÷Ïð?áø8ð<ÿððxÀðóøÀ€ÿ`ð?€Àþq† àŸ3À`ðÆ  ãàÿüÿøxàxÿààÿð°ðàÁ€€þàà?€üc Àügèàà?Žƒàþ<ü€üÿø8pøÿ ð¸ðÿ€ÿÿÀÀàr<œð| à?‡ü Àøw€ø€>ÿà8`ð þàÿøãÿÀÀÀ`<à<€1ŽÃÿþð< ÿÀ€ ?üàãÀÀ8ààÀÀ8;ÀàÀÃŒ@0 0€ÿÿà?€€sÀàÀãŽ@8€?ÿÀp?ÿþað8€€ÿÿà;€ç€àÀcœ` 8``à?ÿàçà 8€à?ãÿ€ÿ€x<ƒÁà?Àøo€à ŸÀ#œp8Àppààcø8€ða‡€€|<€ƒàpü?þðÿÀ ŸÆsÀÿÀp `€0p>ÿ8ààçÿþü0Ì?€à8c†€ìxƒÀàÿþ?ÿø|ƒÀßÿÀ?ÿÀpÿþÀ0pÿ€ÿÀ8à`øƒÿ€;ÿÆ€ðáÿ€Æx€ƒàÿÿüŸÿ€ñÇ€€ð ¸ÿûÀÿ8`ÿþ€6`€8àp8f81À0€ð8ãÿ<€ƒøçßàp<Ÿÿ€ñÀàð øÇqÀÿÿ€p?ñÆ€`ppü<˜ 0à8€ðaƒ<€ƒ€øÿÿàpàŸÃÀð?ðŽaÀïÿ€` þþ`00ó?ü x1À ÿü8``0€ðãÇxÀðÿÿà{ÜàŽÇÀƒààÿà€À𠀆qÀÇÿÀp qÆ0À`àüðüØÿüÃ`À09ÿÆ€ðÿ€x;ÿ¾À~‡ààqßÀÇÀÀà€ 8€ŽqÀÇ8Àp þ0ÀaÀðp 〃Á€08€ðÿƒxàÀü‡ðàqÏÀÏàÀÀÀ‡qÀÇÿàp p0Ða€ðx ã€ÃC€08€ðÿÃxÀÿ€øxàqÏ€Îàø€ð>À†qÀÇÿàp üÀ0Ðc8ðxÿ€ø?ÿÿÀGp8†€ðÁƒ8€ÿðŽ<àqÏ€žðø€ü0>ÀŽqÀÃÀpüÁøñ70ðxÿÿÀüÿÿÀfp8Æ€ðÁƒ<@ÿÀþàœ?àãÏ„?xð<üpppÿÏÀc€|à8€ðÿ€Áƒ<ÀÀü?À¼àçßÎ<<àüà<øqÀÿÿðpxpÿÀàpðàcˆ<À8æ€ðÏàáƒÀÀp€°àÿÿþx?øÿðsøqÀÿÿàp`üÿp?ÀÀ8ðü€;ÿöÀðxxÿƒ€À ðàïùþð€ø8?˜ÀÀp‡ñ`?à?àwÀ8àüàãƒÀÿÿàÇà~àÀÀ üÀÀpÀ€Àã„8ðþ€ÀƒþÀÿÿàÀ~€À|ñÀÀ`ü÷þ?ßþðü8?`øÿÀ€À88`€Àüÿþ?ÿþ8ÿÿðÀ8`€@ÿÿð€ð€àÿà0à<ØpÀÿÿ€ @8ÿàpá¼Üpÿÿ€0÷€`xÿüx<ðœpãüÿð€€pÿÿÀüÀà ÿøÀøx`<øpÀü<àpÃøx?ÿà€€`€ €?À€à€0àø`ÿà€ràüÿðpãüÀÿ€ÿà€ÿó€ð8à€ €xàÀãÀÀÀ?ÿþp`€;`ð€<ÿàðÿÿàÿ€?ýàÿóð;îs€<€pà€ã€?àÀ8ÿžÿ€0àÃÿ€€8‡à<÷€ÿÿÀ?ÿ€ùÀ€x€ðpàÿ€~ÇÀï·Øx8`p€0àÃÿŸÿÀÿðÿÿÿÀÿ8xpp?ÿÿ€ ÿÀùÀ€pà?ðxàûÆþ†Á¸x<`0ýàÿ€àÃÿßÿÀ8ÿàÿÿÿ€Þ8ðàp?ÿž€ÿü€àø?ÀÀŸ† Ï·àx<`pÌðÿàƒÿŸÿÀÿàžpî8áàx?ÿÎÿó€?€€ ?ü?á€ÿÿü€?Àþ€ ÿ88<`3Œ?€8àÃÃßü8ÿàðÜ8ÀÃÀp?ÿœÿóÿ€~1À?〿ÿ80Àð€ ø0À8|çÿ˜€0àƒ‡žxÿàœpïÿàÀ8ÞÞÀqø €9Ä8ဇ€?ðÀÀ àÿàüÿaû €8àóÃÞ<8ÿàðÃÿàÇp7ÿüÀãà ?ü8〇0qðàÿÀ0€0àøÿàt0àÿûÇžxÿàžðà<ïp?ÿüó€GÀ?þ8ဇ4€ðxÿøÿà p 8à¼Ï`78€À0àÿûÿÞ88ÏàðÀ8þà?þø€c€Àÿ 1À8ã€<€àpàp@ à ÿÀ8àwÿÿ€€0àÿûÿžxÿàŸðà8|àøx€;€ Àÿ8Â?á€þ?Àà8>ü€øóïÿÿàx8À<à÷€àÿÿ€øpÿÿÀ8ÿÿüü€ûÿÿÿð@ üøààÿÿÿÿà ÿÿ€ð?¿ÀðàÀÀ@?ÛÁ€ðÿüáà<Çø8 Ààø€À{ƒÃÁø€ÿüáàÇø8À~@Ào `<à ÿÀÀ€€<Àøþâÿø€ÿ€ÿ{ÃÃáøÿÀ~Ÿ<ãÿÀxpàþ€pÿÿà?ÿþpÿþ€‡Àà?ÀÀ?øðüÎÿð€8ÀÿÀÿóƒÁóøÿ€ÿ€Ÿ<ÿÿÀ8ç8pÀþ€pÿÿà?ÿþpÿþ€Àà9ÀÀø¾ÍßpàqãÀ<óÃÁóøÿþÿàÿüÿÿÀÿÿø?÷1€`à>€p€àgÀ`€Ààqàü8xÍû`€8ðááÀ<ãƒÇÿøÿø½ðÿüÿÿ€ÿÿø÷;€À€p€À`€Ààpàüÿÿ<8ÉùÀÿøpAàÀ<cÃÏÿøøà8p<æ??Æ?À~0Æ?€þÀ 8ÿøaÿà ÿü€<a€àpà1€<8ÓðÀà<Ãÿx€xp8ÿüü?àÄüÿÿÀŒ8¿pÁþÿü€<?Á€àà€?üxÐàðÿøà<Ãüx€pà8ÿüüÿÀðÀpÿÿÀÎp8ÀÀ‡€<?Á€àÀ~>xØÁøÓøà<Ïð>x aà8{Àý÷ð>ðÏüpÀÀpÿÿÿÿÀÀ‡€<ƒ€àÀþ>ð<Íÿ¾€8à<ßÀ|xxaÀ8ùðçÃðüàÏüp1ÀÀàÿÿÿÿÀÀ‡€<à€n?üàxÌ ÿøà<Ï€øxxc€8ùþçðüÀ<pyÂÀÀЇ€<àNüÀðÌ€8à<Îðxxw€8ùÿ€çÿÀüÀ?Ã8€pqÿ€ÀÜð?ÿÿ€€<à€€àÍ x€8à<Äàxx€pñ߀ ãÿÀ€?ãø€€ðqÿ€€?ÿüð?ÿÿ€€`ÀÿÀÀýÿøÿøà<ÀÀxð€>ð sÇ€ãÃÀ€?áøÀüñÀ?ÿüð€àÀ8@€?ü‚Ø €8à<À?€ðà<àqÀãƒÀ€8áðÀ|þñÀÁ€à €À>Àpà8ÀÌ€8à<À?ðüÀóÀãƒÀÀ9áø€|?œù€ á€`€Àvàà 8?ø>ÁÌ`ÿøà<Àà~ãÀãÃÀÃÀãÿÀxùþ?ïÿùÀÿÀàÀ`A€8€ÿ.øøÿÀ€8?øþà 8àðøÿƒÀãÿÀxà~?ÿÿøðÿð€0€àü?üàøÄ À<ø~€ÃÀx88üþ8pÿà€ü8À|€nxÀ €88 8ø xpà8`àx8ü88ÀpüÀ ðàðpÀ0xÿøðppÃÿ`àÿ€ÿø`0ÿð<ÿ€ÿàÿÿÿÿÀøxàøÿüyÀppÿ€ÀÀpÃÿðà€ø`‡ÀÀà< Cžø8`>àÿÀÿðÿÿÿÿÀx`øpà<àþóàçðçÀÀÀxpƒ‡ðáûüÀ?øpÀàÀ<ÿü?ðpýñxv?àñãÀ€8÷üðÀãà󃀀dz‡ðÀñ€x€ðÀø?àpëÿÿÀxÿÿÿÿpx8€óþpàÿðóÀÀ Ãû‡þ€ÀÀ<€À`s>ð8`;ÿï€?üà8ÿÿÿÿÿÿø?€÷þp?ðÿà÷Àà‡û‡Ž;ÿÀ€xÿøþg80pp?ÿ€@ÿÀÀpÀð<ÿø?€€÷þpÿð@à¾à<ðƒÛ‡;ÿÀ€<ÿøø888ã€ó€à8Àð<ðøp{€à<÷þpðððà<ÀppƒxcÀ<À g08x0〄xÆÀxÀð<pxyÀáþwÿp€ xà>Àð8óÿx€ã€À€`À#8þ?ÿ€ÿø†àxÀð>pñàçÿ€þþp<ÃÀ~ÀÀ³‡wÃÿÀÀ À ÿþ88þ8ã€8Àxÿÿÿÿxðøçÿ€~öp€ãÀ~Àû‡çÿÀÀ Àÿþ88x8a€0à8ÿÿÿÿpà|Çÿ€tðpàÿ€àü»‡ þÀƒ€<€ xpx?ÿ€`ÀàxÿÿÿÿxÀÃø€pðpÿÿÀ|Û‡~€À ÿ€ø€<ð|?ÿŒ`ààxÿÿÿÿx€€Àðpáð€ü<8ƒ‡ÀøÀþð?àü0à Áøðøþ>x€pñð0ÿÿàðƒÀø9ÿÿ€Àüpÿøððþ>ppaà¿ÿàÀx ÿüø0|0@€€0þ?øÿÿÿÿðÿÿÿÿøÿÿÿÿøpÀà@À€?ÿÿÿÿøpü‡à8 àÃŽÀ€80 pÀ€pŽîÇà8€?€àà€ÃŒÿãÀ€þÿÀ<pÿøƒðÀp<;žîÿÿ€8€ÀðàÀƒŒÿÿÀ ø8 üÇÀ>pÀðpðà}ÿàÀ=Üçþp€üóÀ xàðpàüßüü0ð?€Àrÿÿ?ÿÀ¿88à?þ>ÿÿàà=Üç€þóž8‡€þóÀÿøxÿÿøÀ`ýÀ9Øÿþ8ðÿ€€ðÀãã€?àÿƒ8ðÀpà?ÿüÿÿààŸÿ?îÿ¿üÀþàÿø0ððxÀxäìÀ8p;˜À>0ðœà‡üÀÁ€ƒ€``?¼ðÀÀøø<à?ÿþ?þ0ÿ¿ü¹Àüàü8ààpð8ÆìÀÿÿðø |8ðp|@ÀÀ€à`qŽ?ÿÀüp<8?ÿæÿÿøøñÀÿ8ààpð<ÆÌœïðà8p 8`€àƒŽ€ã€ÿŽÃøÀÿqÿ€8?üçÿÿøÃð<áÀÿ€8áàpà8§ÏÀ8€8p8<ðÿþ?ÿ€ÿÿþàƒÀ?ÿÀùÿÀ8?üïÿÿàÃàÁÀÿÀøáøpÀÿÿÀ?ÿ ßø8p80<ÿþÀ8àà€Àÿðùÿ€0?üÿÿÿàÀ<ÁÀÿÀÿðáœpÃÿÿ€8ÿÿø8ð0`<ÿ߀À0`À€Àÿþüðg€0?ü~ÿÿàÿŽÀáàÿðãpßànÀ?þþÓ€8p0à<0€Ã€0`ÿ< €Àÿðþðo|?üþÿÿÀÿŽ8€ÁàpÇpøðÿÀþ|˜80ð À<`À0`p €ÀÿÀð?>?ü|¿ÿàÀÁàpîðà8æÿÀ0ÿÜ 0ð1€€@çƒÀ8àp?øÀ€Ààà~|À?ü|?ýÀÆ8€`ÃààÜðÀ0îo€þÿø0ð38ÿàÿÿÀÿÿðÿ?ø€0À p><ð?ÿx¿ýàÀ8€0ÁàààpÀxÿ÷€=¾oŸð0p?0Œ`à€àÃ0€`Àð~<ðÿù€?ýÀÀ8?€<ÃÀÿàÀp?€p ÿçÄý»ð`ð>`üÀààÃ0àÀpÀ<ðÿýÀ‡œàÀ8?þÿÀ÷ÀÿààpÁð þw0œäàÍó¸8`ð ÀþÀ`€`Ã0À Àáÿð8Ãÿ€‡9Àÿ€x?þÿ€ÿ€`Àpà¿ï`œìàÜc¼0Àü€øÇ€ààÃ08€8ƒ€óáøÇÏÀ‡8àÿ€xüàð‡ ‡ÿðœpŒãž Àþÿ`€`Ã0ÿà ÿãðÇ€‡1ÀÃð <Àð†yàŸþp @€üÿààÿ?øàþà`À€ÀðÀð€0ðü €€à€`Ã08à€À`àÀ€ 0ကÀ8`ãðààÀÿ»ø@0ÿð€Àp€€ãÿðÃààÿÿü`p8?ÿðÿà€ÀàþÀáÀÁÿ€Ãÿà¼Àÿÿøðÿ€p0à€?ÿàÀÇÇÀ@ü?ÀóÿÀßüÿ¼ƒÀÀx÷À€þ8¸8ÿü€à0ÀñÀæ803 c€ÿðø€ÓÁÀÿàqð€Àøøp÷ÀŸ€0€Àà€9à?ÿÄ €€xp>Àp€àÿÀæ80c c€ŽpÃÁÀÿàþ>àÀ üøðÿ€ÿÁà8ø?ûŒ€øàæÇ€À0`€æ80aÀÃÇÀ?Àÿ€|ðÀü8àâãÀ88x8`€þàÆÿ€€ `æ80a€ ÃÇÀ?€ðð€€8þ€ü€†|þ?ð±àÁ‡€<€Àà€?8þæ?ðà>ø à 8`88€À0ÿÿðÿø€88`<Àÿÿø@ÿÿðÿøàx8ð<€8ÿøp08@þ?€ÿüÀ÷ÿàÿøðw;ð<0ÿøàà8p€xà?€þÿ€ÿüÁÀÀ€xð÷¿à<pÿøàÀ8p€€8ÿø0€€à{€xÁáŽÁÀ€€8ðÿÿ<xðÏÿ8|ü€\8ÀÿÀ àaÀp€€ ãŽÀÀÿÿà€x`ÿü8pààÏþ0ü‡üø8€8À?ø€|àáÀp€À?þÿøü îÿ€ÿÿà÷ÿøáø<pÀ8`ÿøÀÀà8ð€|p7ÿÀ8üà`€8àáÀxÀ@çáŽÿþÿàÿÿàÇÿø‡8|ÿÿáÿÀ?ÿðÿø€Àà0Àpxã `€0;ñÃ`°àáÀpàÀáŒ?þÇ8`Ï9àÇÿøÿŸüÿÿ`ÿ€ÿðà<À`8À<¿ñÀà@;ü°øàà€p x`c€ÿøÆ00ÎyÀ‡€xÿø~î<ÀxÀî0€xþ0à¿ÿà?ü€ÿàÀp>ppÿø<A†8p0Ïøà€8ÇŸÀ>o†À8øÇÿ8ì8pàüxv0à?€x08p<þá~@Æp0`ÏùÀxÿ8~ÇŽÀpüÇþ00ð8Àðð pÀ?€p`8à?üÀn†@ÿÿð`À8Ïxà>€xÿÀì8@8ð8àÀ xàÀp8À ãþFÿÿà`ÀÎyà<ÿøÏ9ððÿÿþÀ`xÀî0À80 pÀ00ÀãÀpp€ ÇþF¿ÿàa€0Ïøà|ÿøÇ?ðs€øÿÿþïððàf8 È80ðààààxp€ ãvÀc€0Ïùàü€xÿ?€óÀñÿ<ÿàâÀæ0Œppàà080ÁàÀpà Ç>àgpÏyàü€8ÿ>áðñÿàÿàOÇàó¸‡þppð`88àààxàÀ |ã°>`ÎyàüxxÇ8ÁøóŸàÀþÿÿðÿÀ‡þïàðd€rpÁáÀðÀð?üÇþ0<Àÿàþø€8Ç8À~ñþ`þïÿ8Çà€xçà8~üøcðàùÀø€øãþÀÿÿàðÿøÏ8<àüøÀ8ÿàƒ€0<øüÃÀø€ü?ÿøÇÿÿà ÀÿøÏ?ü€ ðÿÿøþ€8<Àø?þøâ€ÀÀ€xŽø8ÿÿø`Àø00À€†ðÀ8àx`à€0`ÀƒŽ8p €àÀxÃÿxÿÿÿÿþ€vð0p ?ÿà`À@øày߀Ãÿ8?ÿÿÿþ€`à.ppÿÿÿàpÀÿÀÿøøðyÿ€ƒŽxþÿÿ€89΀`ÿððî 0 À à8@àÀðÿ€qÜ8xð?ÿŽ|ÿ8÷ÿÿÀ€x9ÎÀà8à€pÌ 0 À `> `À0 ÿàqŒ0à?äŽÿÿøç ÿ€¼ð€ðà?þÿÀÿà8€à0ÿŒà œ `ÿÿ0`ÀñÿüÿÿàÿaœÿÀ3Žÿÿøÿþ‡€pÀãàþÿ€ðÿÜàÿþ C?ÿÿ0`Àñÿè€ÿ€qŒÿ€sîÿÏ?ÿþ88ÇÀÃàù΀À ‡˜pݹÀ<8à ç0`Àÿ ?ÀqŒóÀóþûÏ?ÿ¾8ÇÀƒ€ùÎ À Àÿü í½€xà pç0`À³€ü`1ŒàãþûŽ<çÿ8pÇÀ€?þÀÀÇ8ý€xà `Çþ0`À1ø0à`1Œàãþ»çÿ0ðOÀ€?þø8ÇpÿØà `Çþ?û0`À<0~w@`1Œ?€?ðþ;8<ç~ÿpàÆ€Ì?üpÇ8àýŸø˜ÿ `ǃ€0`À``àÿ`qŒÿÀÿøÞ9ÿüç~qÀÌÀ€ÀŽp09ÿüÀíßðÿÿ `Ç€0`Àpøð`1ŒáàÿøƒŽ8¸Çþ3€88üÀÀÌÿà0ýÇ€íñ€8à `Ç€0`Àà À0às Ø€à€0ƒŽ8Çþ?€88ø€ÀÿþÞÀ09ÇÿÁˆà `çÀ0`Àÿÿþ€0ÀsØà€‡8?þþ?ppxà?Ÿþœ09ÿü<ÿÿü8à ã€À`Àÿ÷€0 ÀvØà€‡08<?þðàppþÀø9ÿüøÁÿü8à ç€ààÀƒ<0€t˜àà0x<üàÀpøÀ|þ9ÇàÁÁ€0à `ÃøcÀÀ‡~p>xÀÿŽxx<€€8`Àü ~9ÇÀÁÁ€pà €ðsÀÀþçà0øp€€Üøx<?ÿþ8Ç€Äö9Ç|Á€`àà€>€À€çÀ`p?€üø{ÿþ?ÿþÿÿ€€xà9Çø‡€ààÿÿÀ~>À?à€à ÿøð3ÿü<Ýÿ€`Æx€€à0ðð €üÿü ÿà~€À Àxx`Ãÿü0€ÿø8 <ÇÀ8x` àpf8Àÿ<çžàþÀÿð€0àpfxø3˜ÿþÿà€àÿx0çàÿüàãðÀ80_€0€Çá€f xðs8à9€€Àx8ÿ€çœüÿøàÀð€à8À8pÀÿÿÀÿÌæCÀëvÿÿ€ à0€ÀÀðxðÿÀàçüÿÿÀÀ€ð€à8?€€pÿð€ñüÿØÆæÀßîÿÿ€À1€€Ã€ðøùàÿðçžü8ÿÿà€pÀà8Àÿÿ€à>9ŒfÃæ Àÿ~€ÿà€?ÿÀ5€?Àðÿðÿ Àà€À0ÿãÀpàpÀÿÿðÀœÀàçƒþ`8;ÿüÿÿÿðÀà‡€Ç8þíð~ÿÀÀ 8ÿóÀpà8ÿàÿþ çàÿþàðx€pÀ<0þƒxÀÿø›Àÿ?ÿÿîÐ8 à€À¾|ÿã€áÀ8ÿàç?ÿÀÿüÀà<€`8?ð xÿðÿþƒ‡ÇÙ€;ÿ¾ Ï<ü?‡ð 0 ÀÀü0ð3€ãÀ8ÿÀçž>ÿ€€àÀ€`øxøÿÿÿÿÀp€?ÿüà?¸ÿøÿÀ€àààð?€ç€xç8ø€À€h?ÿÿø8øƒ‚ƒ €Àÿ €{ƒ¿ÿx0 Àÿÿàð?€ç€xçžðƒà€àhÿÿàØ{øƒÀ㇀€ }ÿÿ8À/à8ð?þðçüð?ÿÿ€À0À|y8À€˜ÿðÿÿÀÿÿÀƒ` Øqÿð8 ÿÀÀpø~ðÿ€çþp>ÿÿ€à€xãþxÀÎÀÀÇàã0 ÜpÜÿøüà€pü?<Àÿàç <€àÀðÇÿxÿà8?À ÀÇÀ>ã3xø 0?üÀ0Àü€Àÿðã€àáðÇ€xà?øàø Àÿ‡€Àk€ ~øŸøÿà €ñÿðÿðàÀ€àÿÀÇù€p83ðpÿø{€ƒ ÀÀ7 € ìñÿø€‡À<Ãóøþ0ÿÿàÿ€àÿ€Áø0?ðpp8s€ÜàÀ3; ÀÿàùÀƒÀ€üøüÿÿÀÿ€À€?ÿÿ€p`80ǃ0øÿÀsœÀÿÿÀàÿ€þp0ð€þ €ÿÿ0p8 ƒ‚Ïð|ÿÀsþÿÀ<pÁÀü€ø‡@üÿ€à0pÀø`0€à8 à<ÿÿü€ÿÿp`À8`Æ`ð<ø|Àÿÿ€vÿðÀ8à@ÀçþÀð`xà<àÿÿ€€ÿãðÀ8@0p€ø àaÀpçÏÿð xàœàãÇÿÀÿþÀð€ö}à8ø`€øçqÀpçÍØ s€çÿ¼àÿÿÿÀþð€ððÿÿà8€?ðàà<ã€8€83€?Çþ€€Œ@ ~ãÀæÿ<àÿÿ¯€þó€pÿøpø8ÀÿàðàÀw€8À030ç¿ÿÀ†à ÿ€çààp<àçÏÿÿ€ÿ çðp8Àïðÿ€ÿ€ð?p`p7ø?Çž¿ÿÀÿÀ ™Àÿÿðàp<àãÏÿ€?ÿ€‡àa€0€Ž~€ÿÀðüà8sÿø?Çþ€@€| `ÿÿðàp<àÿÿÿ€À?‡€ÀãÀp Àà <î€ðq€0C€0`à 00ÿàpãÿ¼Àÿÿÿ€ÿü8€ßÿÀp8À8pø ðq€0Æÿ`8ø 00`çÿ¼ÀŸò€ÿþ8 ÿÿà`08€00pð €ÿ÷Àðq€0g€Àïÿ<> 0`à€ãÿ8À>|€?ÿü88ÿþÀ`pp08p8àø €ÿóÀ0qˆ0æÆÀÿ> `àçÿÀà~<À~¼>ü xüþh`p00`8À< ?À7ÿü3ÿÆÿ€ãð `ÀÇ÷Àà<Àþÿàÿÿü~üðÀîx`à0`à8€ ÿà 7ÿü0ÀÃÀa€ÇÀàw<Àþðÿÿü~üþ€8 àøîy`À0aÀ €Àÿþ0a€0æ?ÿà‡€c€8‡Ààó8Àœóàn¼þ€pÀøîy€`pc€8> ÿþpa€wÿæ ÿÀ€g0ÇÀÿÿüÀpüþÀð€üîxÿà0€ðc€8ø 0a€0<ÿ À€>`‡ÀÿÿøÀ8<ðüÁàxÝÎ pÿà8ñüüwpð< Àpã€p| À1<àÇÀäÿ¼áøpà< €€p0á€pgŒ0ƒ€ €ÀLJÀà8ÿðxð?ÇðààÀðþþsüqÁ€qÆŽ?ÿààðøøÎðÀøÿþs€cüÿ?þà?øø€à8`ø`Äàøs€pŒ>`ð€à ðÀ1€ÿÿ€ÿÿðÀpÀqÃþÿÿÿ€€`€0ÿþÀ0ÿÿðÀ€àxð9Ûþ€à8ÿ€ÿÿÀ8@ÿþÿþ1ÀÀà€€ðøyÿÀ|gà0<ø€80à € À €1À€à€Àð@8?ÿÀ<ÿó€`:üÀ€À080ÿÿ€`àÀ ?À1€‡ƒÀÀ>ýÿàû€|ÿçà?À€ÿà€àÀÿøp €ðxðýœÿ€GsÿÿààÿÿàûÀ<€ãþ ÿàÀûƒÀà?ÿø0n˜àÿüŸüÿüÿÿàüø<?Áàøûÿ8`<ÿààpà†€?ñ€€c00;íô°þÀ üpÀ<ÏyàþxxÀàü?ÿÿ€p<€ÿf x€0x€ùÀ?Àa€?ŒÀ0À.ðÀ p`ÀŽyÀžxààøûþ˜à<çÀðfð0xÿ8q€ÀƒûŽ€7Àíðû\€‡ÿÏùà?Ž<ààø?ó܈à<ÿó€àà€ð0ÿÿ1ÀÀƒ€ðÇ€?Àÿü€‡€ÏùÀ<àüaààóœÀ<ÿçÿÿàÀÿààËÿÌ8q€ aƒ< 08À Ïùà<püpààûœÀ<ÀÀàþðàÀáÀ1À `Ç€xÿø8€À€ŽyÀx¼yÀ€ÿœ€<ç Àø8pÀáÀ08q€Áƒ†À 8pÀðÿÏyà<9à€ÿœ<ã€`x8`€áÀ1ÀÁ€†€8ààÿþ1Ïùàà}ßœ<gà p8ÀÁÀ?ñÀ8<€†ÿøÀ`ÝÌ ýàÏùà<<àÀyÜ<;€øðÀÁÀ?ñÀ0À>€Æ8€œÄ€ÿàÎyà{øÀ?à9Ç~ÿÿ€€?þà8Àƒ€81ÀpÀvÌ8À@À 0àÞyàyø>À|ð;ÿÿÿû€€8ÿð8àƒ€ÀpyÀ~ 7Ìÿø€8À`à 0`ÿÿà1ð€üÀxÀþÿ€€0ï0pð€ðÀ?ànøÿÀ0€0À`~ 0`ÿÿà`€üÀ0?àþ€€?ãà?ø?€ðÿÿÀÀð>ÿÀÀpÀà? 0`Àà€€À0ÿÿ€€ÀÀ8ÿÿÀÿÿþ€ÿÀÀÿà 3à€À€ÿÿ€@0ÀÿÀÀÿà 1à@0@8`>ÿüÿÀ 1€p8?øxÿüÿð ÿïøóÿÀ|pùÿ€pà€€@8ø|ü?ÿø0 €Àÿÿøs‡Àü`09Ç€p0à€€ààü <ýð>ÿÿp<|x<À€àÀîàpóÏ‘Ìÿÿøø9Ã00ð`Àƒx à?þ?÷þ~ðà>ÿÿø<|x<àðàÿ€îààóÿ¹Æÿÿø?øùÿ008p`àƒx ÀïÿÿþþáÀ ÿÿþø|0àððüà¿üîãÀ3‡{‡Àÿ€9Àð|øppÿàƒ8cÌÀóÇ€þÿþüãÎÿÿüøx8€ÀÿøþþpÿáÀs‡swÁ€?Æ9ƒÿðüp`ÿàƒÿÌÂãÃÀwà<ÿÿïûà ø|?ð8þðàÿáäóÿæsÀgÿÀ ùÿ€þ0À`pqÀ`ÀƒçǃÀ<ÿà|ÿÿÿàðxÿžÀøÀîÿþ8s‡Äcàç€1Ãð0ÀxÿÿÀ@Áƒþ‡ÀwÀ>ãÏ»à|ùÇ>€îÿþ€æàg€0ð€<pÀo€LJ<À<÷œÃyà>€xá‡?8ÿáÜ9 ç1Î@çÿ€`sð€xpÀÿÿÀwƒ€ãÇÿð<À|áÇ€ÿþ8ÿàøÿóÿÿg€`ÿó€8ðpÀðƒ€p<À8÷ÿÿÿàxàxÇ€ ãððÿÁð83‡ÿÇæ€@9ƒ0 À`€À?ð¼À8w€ÿÿàðð|ÁÁÇÀà|À;“Øgÿ€`ƒ€8ÿ€Ð€€ pø€8ÿÿþÿàààxƒ€€ÀðáÀ?ÿÿáØçÿ€@ÿûðçÿ€°€ `ð€8w€à`àÀ`|ƒ€ÀÿàÀÿûðÌg€`ÿû€ø÷€ó€„`àpï€Ààyàx9€€AÀ8s‡ñÜ€æ€`9ƒðf〠€ÿ†À@p÷ÿàààÿâ|?8àÀsƒ ÞÀàgÿ€89À0€g€àÿÀ€cƒÀáïüÿðÀàÿæþ~0üÁÀ8c‡Âàçÿ€>qƒ`ÿÀfà€ €cÀççþÿðàð8Gþ<8~ÀÀ8ムÎÃpfÀaÀ`‡àg€`ÿ€cƒðÇÏüÿ ÿÿàÿüøÿÀ9ƒŸÇ`ÿæø€Á‡Àþ@çÿ@ÿÿÿ€üÃÇ<ÿÿà?ÿ€üøÀ8ŸÜÿÿÿøÀ|çÿ€ÿÿ€¼>†ÿþ€€ÿÀÆãða€Àÿ€ÿ€?€üÀÿà<`À€ €ÿÿà€ÿÀÿÀÃþàÿø?øþ8¹Î€ßðØæ~@0F ÿÿÀ€ÿƒÀÏÀøÀ?ÿðÿðÀ8Àà||<1Ž€x€ÿ¼p¹ÎpçÀ`øpÎ`ÃÀÀóÇÀƒà0çàÁàà<|øñðàààx>˜9ÎÀpÀ 0˜Æø€Áà0ø0Æ`ÃÀ€üsÀÿáÀÿÿà8xpóÀàÿàøðø?Þ<`ÀóÀ80Îø8ÀÀ0às¿ØÃÀ€þ?À?ÁÀÿÿð|8ÿÀàOÿüðð?þ80Ìs€ ðþ8øp`à0à3ÿÜÇ€€ÿ7>>€ÁÇÁÀàx?ÀÀÿ8ùÀàÀ0 p8w8ppþàp@0à}þøç€À€:<À>?ÿÿ€ÁÀà|?àÃÿ€|8ñðàî `à> ˜0 0`~À80àþæpüç?ßàx€xqà|?ÿÿÃàà|àƒÿ`Àxàþ>àÀ€8`ÿØ0pÀð€0àpþüüçÿð€cà|ðÃðà|ÿÀ€üàÀxàü>ÀÀ?àp?ðŸð`À oÀ0àsÿü|ÿøð€ÿÀ|ÁÀÇüàxïÿ€À€ðàø.?ïÿûàóÿø p6üÿ÷À0àÿì~~àxÿ€>?ÁÀÇ>à|ßÿ€€À€à.ÿ 0àñø8 06?ÿÿÿóÀ0àà~~€8>þ><þÎà|<€€àðÀð8 0xàÀ0àþt>8~þ|à>9ßÿÞà|ü> €àøæ0?à ßðxâ€< 0à÷ÿþÿüxxÿñð>àßþøà|þ|à€àÿ¿þÿÿ0à¿ð_ÿÀðÿþ0àóÿþçþ?xÿcðàÜÐà|øáüÀàÿ?þ0ñÀ?àþÀ€ÿüø00à°ã0ãÿ?ðÿààqÜÀà|ðãÿàð08À1Û€øÀàáÀÿü`0à0ã¸Áÿ€ðxÀ‡ÀqÜÀà|àÇ?€ðx0?þ0sŸàÀçñ€ €à0à0ùðƒÇàÀx?ÿ€qÜÀàþ€Çÿ€ø?ü?þr8Âÿ?€8 ÃÀ0à1ùà‡ƒð€ x~ÿ€ßþÀàþ?Ãø?€øø€9àpÀpÆà0< ÿ€0<ø1™âøyøþßþÀàþüÀ`ðàð9çÿÿp{øÀç8ãüÿþ ~øü1ƒöøsà{ßþ€àðð?ÿÿÇqàø€ÿ?ÿ€ðÿÎ à3~ €À€ 8às€ ~?ÿÀ 7<> 60Àÿ€ppàÀ0€à€€8ÿÀøÿø<Àà>üÀ8Ãÿÿð~?ÿü€@>pÇÀþðÀà‚ÿàþ?þwàÀà?ÀÀ8ÿÿü<àÀx?íþ?üàÀþÁÁÀÃŒÀ‡üð€>ÀàŒðÿÿÿ?à Äà€ÀÀÀ À|þÀ``þàAà€ãŽ€ñø<|Áøüñàÿÿþ†àÿÀÿ€?€?€€ñÀ€á€àñÀÀÿø€‡€à|<|ÿü~à?ÁÎ<ÿçà~€g€ó€ƒÿ‡ÿ€ÀÁøßÿÀÀ`Á€àáŒÿ€À|~|ÿøÿà?ñÎpüã€À€ÿ€€øÁ€€€xÿ€àÀÁÿ€‡€Àxÿ|ÿ€ÿ}àùÎpøqÀà€à€à€ÀxÃþÜ`àÁŽÿ€Àÿü|ÿààÿóŽ`0ãÀÀøà`€€ß¶üà<ÀÁ€Àãð~ÿàûÎp0càààðüð€3€À`àÏÿœ€ÏÀ|îÿàÿóŽx`ãÀÀ0€ÿð@>ÿøð?ÿÀ°à ÀÇù€€À>àwpàÿûŽ`àà0à0@?ðxãßÿÀÜ`àÀpœ?€>à<îðàãŽÁÀà` Áøæ€ã?Ç7ˆà` ÀßÿØ€9€à<wà{óŽáÀðq€ÃþÆ€€ßÀ``àÏýœ8xp‡Àxþà÷Ÿ€ð<áÀ €†?€ 9ÿ?ÞàÀÀÀøxü0ÿ€p~à÷€Ÿ€~|àÿÀàÇ?€À€ ÿ¿ÿ`ÁÀ€àÀÌð8ü?øÿàìùðwŽ€?ðÿ€ÿ€ÿ€‡ð ÿø9ç<€àÿ€øðÁ˜à8øøþpøøþü€à€ÿ€?€Áàÿþ?ÀøÃÀ€`ÿüøÃ‡œ€~øáÀpüü€ÿü€üÀÿÿàÄø|ð`€8üxxÀÿÿàÀx 0€0€88 x€þp€8à 8`3þ`€|€|øÿÿÀþpà8€à€À8œ €pû¿Àÿ÷ÿ€þÀ>ÿüÿÿàøpà8À€ÀàÿðÀ87ÿÀxÀ|€ÿþçÀøppxxÀ€øÀðÿðÀü8À6}Àx€<€ü~ƒøwÿøÿøÀ?€ÿ€€üƒ€pÎsÿÀÁ€ÿ€0?øgï€x08üüŽøÿüÿøÀÿÀÿ€€ü8‡À Îc˜àÃà1À°sœmçx 88çøÿþøÿÿð88àà€€Àp˜ÀÀpÌ`0àðÃOÇxpÀ8ÿã€àÿþøþp08€`€€àðÀÿÀ80Ø`8``ðƒGƒ8ïÿà8üóÀÞøûþpø|?`€ÀàÀáÀ0ð`p`pðCÀxÇÿà8øóàÿþøsÿpÿÿÿàÿ€€àÀáÀ0pàà`À0àcð8À 8xóàÿþøsÿðÿÿþàÿ€€ÀÀÿÀ0àÀàÁÀ0@ 7þðxÀ8póàÿþøsÿàÀÿ€€ÀÿÿÀ`ÀÀÀÁ€0À€0 xÀ 8ðáÀƒ€øsÿà À€€ÀÀààaÀ€ÀÃpðÀ80ÀxÀ 8áà<ÿÿÀðsÿÀÿà€@àÀÿÿðc€8€ÀÇ`ø@pÿÀxÀ 8áà<ÿÿ€ðûÀÿà€@pÀÿÿð70€Àn`ø`àôp€xÀ 8ãÀxÀðÿÿÀàþ€`p€Ãàp>p€À|ÀÀ`Àb0xÀ <ÿßÀpðøÿÿìàþ€ÿ8€àpà €À8ÀÀ`€ 1xÀ <ÇàŸ€p<øü<ïÿüàüÀ?ÿ8?ÆàpÀ€Ã€Àà81€xÀ <<xàø?Àþ‡¾üà?àÿ€þãà€ÿáÀ` 1ÀþÀ üàÀðàü||ÿàÀüxãà€|€pÀþÀø€ààðÿà ààÀ€?ð@À|ÀÀÀÀ€ààÀ8à€>€üþÿ€ÿ€ þþÿ€ÿàÀÀÿþÀ p€ÿà0üÍà€ÿÿà€Ààÿþ`Àð÷à ÿ?ÿàÀp8€üÀÿÿàyñà€ð~ÿ€`xpÀøÁð8ÀpÀø€p>Àÿàü0x0ÀþpÀ>øÁøqÏðÿü?À8àÿðýààð8?ÀüÀð`~€Œà `p €ÇÿÀ0øðyÇðÀð8pxñÀ`x`ÀøøÀxüøÀ 8 p x8á€pÀpø`sðà€8ppp€àñà>0àxÀpà|‡  püpáÁ€qÀpø€ÿÿðà‡À8p8p`àþ8à<Àx`ß øxx áÀÀÿÀpø€pÿþðÀ?߀pà8ÿðàÿàð0ÀxÀðÀ<þ8pà`Àpƒ€Àp€püx€ðÿÿðÀÿ€pàÿð`àÀ0ÀÀx`ðp €ÿÿàxƒàp þøàÿþð€qðcÀ8@ààðà4€ÀpÀ€0àÿÿÀp0ÀÿðÿøÀÿþð€sðsÀ8à`x`4€ÀxÀ0À 8ax†àpvüøÿþðàwpààð8<€Àp€ 1€`aœp œÀÿÿþøø?ÿÿðà?pà`x0<ÀÀx8€ €``øxœÀÿÿÿðøüÿþð< @>àÿààð08àÀp€p 0À``pð€pppüøÿÿð< àÿàÀ`x0Æ p  à0`Àà ÀÀÀçðßÿ€ð ÿàð81ÀàðÞàÀppþþà00p<Ïü`0 À `ü¾ÿÀÿüÀÀ~ÿøÿàø8Àðàîrð8`ÿÀ808 8Ïüp€pÀ0À°`ÿ€çüÀfxÿÿàðpÀð8€Üfðpàþ€80`8pÎ`€à8 @0€°à?à ÀÎ 0ÿÿàüp¼ÀøÎx8px8cþðÄpáàpÀÀ°`xxÿÿÀ† 0x<üàüÀøÞxp~`3ÿþàÀ`ÿÀÀ€Ààþà ÀÿÿÀ0<~ø`üÀøÿxà;þÀÿÿð€ÿà?€þð€À80ü €ÿx à3àÿÿàüÀ?Àðÿð€À>sà|€þx8ÀpÀ€`ÿÿÀÀáà80 ÀÀÀ?àà@0€@€ÀàÀp@àÀp?ÿ p9ÀÿÿøÿÿÀ€?à?à€€€Áàð@ ÿÿ€¾8`àøp?ÿ08€1¹Àø8ÿÿÀÀ?À>ÀÀÀÀÿÿðàÿÿ?ü8qÀøàr|pÀ0Àÿ³€À88À8€ÀÀàþÀ>àÿÿøð<<qÀxls<8?à8࿱àâ?€;À€>ÀÃþ€|À€à?ÿÈ€ÿøtps8Üã€8wÿ?ÀÿðÏÿ0ÿÿÿç0À€ÀÁþ€|ø€?ÿð?€ÿücð8ÜÍÀ<?€ÜþÀûðf÷ÿÿ€ß¸ ÷2`€>ÀÀ<ùð?øÀ?<~ÿøþ>`Ž8Ãàÿø<ùœà8ü|0ðwÀ`0Çøa0|fpÀÀÀüðøÿÿà8?ÿøüpÿüƒÀÿð<Àñ˜ø<ð0dÿóàpãpáøÀ>€ÿ¼pàÿÿàp8Àx8œpÿøà ?ð`3x<`@fÿó`à`ÿÿ€ÐŒžàÀ>€xÀð`Àx8Ìpø?øl3<`Àgÿÿðàsÿÿ€@: ìàÀ>€xÀ9àà€p0àÿþ?ÿÿþ><ÿÿÀ<`€à9?àçÿÿÿàðÀ?€xÀ=ààÀp0Àÿÿ<ðÿÿü<<ÿýÀ<cð€þð93àp@ÿÿðpÀà<8À9÷ÀÀÀpp€àÿÿð8fÀ<ÿü€ü8ÿ³àvÿÿàû`0xÀ à<à8ÿÀàÀð`€?ÿÿàÿÿàÀ<ð6<ü €øÿ³ `wÿÿàY <<Àæ88àyÿÀàÿàà?ÿÿà¸9ð8üw<ð €p¿ðàc8pþ€x>Àçÿ8x?øyà`ÿðã8 8x<ü3<àÀ pÿ¿ð`p0pÿÀø‡€Ãÿ€{ø?üýàxÿàÀ ÿþ8 à<<n30<Àààç³àsØà€ÛÌðÀÿ€Áÿóð?üÿà>ÀÃÿÿþ8 à8e°¸<p ð8óïÿØÿàÀÛ\ ààÿÀcà?ÈÇàÀÿ€8 <øc°Üÿx?°0³àÇøþ˜Ü.€ðþ€À€ÇÿøÀ>ÿ€ðw0Üÿð€p»¸à>~™Üfàÿø>?þãÿþg?È€À¿üÿÿø|ßöÀð>8Àÿüf?À€8ÿÿøð€ð@àc÷¼€€àÀ÷½à8ýàÿÿðàÿà€ÿ€ŒÀ8``0ÿÿà<ýÁ€Ààÿ`àÿðþÀ€ÿÿ€þÿà ?ÿð|þüÿÿàÀ€ÀyÿÀ€àÿðà°xð€€þÿÿ€€Íþp€8p|ÿÿüÿÿ€ü€ðpãÿÀàçðà0 ;Ž|<ÿð<ÿÿ`px€ððßÿ¸àüÿøøÿÿ€xÀ€`‡à ¿ÿð€ÀŒ7þ8p~ð<ã0pð€àpÿÿ€Èàüüp?üÀ8ÿ ÀpÃÿþüÀÆ3Žà|àxçx€àà€ ÁÇŽàø`?ðx΀p`‡à ±˜À g8x<Àxã?ÿÀÀÀàáÇÿÿà|pð 8Æ€ü`ÃÃŽÁÌ@à cŽ8À€pçÿ€€81ÃŽþàÿ`ðxÆ€ÜÀ‡ÿþ ƒ˜à?ð gþ0ðpãŸÿÀÿ㇀àþpø€þÇðÇÀÀÿŽ à p0øcž8àÀÇžüÏ~€àð?àøÿÿ€þþ=øÿÿÿ€ƒ`Žp?Ø|‚pàÞøÞ~ÿÿàÀðÿùÀþøx~?ÿÿÀÿðÄ|€ø€p„˜< àð€ÇÀÿà€xÀà‚€8à`ð8€À0€€À@ p<€àÿþ8€ÿàÀp `À¼Àÿàâpð`8àÿþpÀÿð?øÿð3œøÀåà æàxxp8ðø<€?à€ÿ€Àðx|cœp!€ž~à æð<p`ùøðàüðÿ8À¿¼€ÿÿÿð€ÿïø8xpà<ÿàa€Žüÿÿø;ý€xqøÿÿøÿøüðÿ€8àÿü€þÿÿð€?ÀÁ€'ø80àÿà1€Ç€þ Áàx;ýÀ8óøÿÿøÿøøÀ>óÀ8Îÿø €ÿààÁàðÿþ?À€?ð8Àp?ÿÿÀ þÏpßï€ÿ<ðøxþøð€|ðà|Ÿ€€€ùãðÁÀpÿþÀ†8Àp0 ¾ï`îgþ8ðpxøððààÿÿ~À€àǀÃðÁÀp8ÿÿ8ÀÿÿøÀÿÿðá€ïÀü8ðpxðàñàpÿÿÀ?ðàðƒàÁðp€þ0ÿþ€8À€þÀÛÿð?ï€?ÿÀø8ðpxàà?€áÀp<À?øàx€Ãø`ÿÿ€ü0ဇÀ8Àû€À àÿþ@ø8ððxàà?€ÃÀp~??ðà<ü`ÿ€à0á€Ï€8ÀÿÀþÀ| 0C€ànð8ÿÿøÀÀ;ÀÇ€p~þ ðÀÇ`Ã4á€8ü8Àc€ààü ?ÿ€àvÀàxÿÿøÀÀ{€Ïð8þ à€Ïpã4á€À0ð8Àcÿ€à`œà0ã€ÿààxðøp€Àpþà÷€8~ÀÜðã<€ÿÿà!à8Àcÿ€à` ÿà8ã€?ÿààx`pÀðþà÷€pÀØðqÃ8<ÀÿÿÀà8À c€àpüÀà?ÿ€ 3àxpÁàüÀãÀq€€ÀpqÇ0<ñà€`8à cÿ€à0Àà0ã€?àxÀp>Ãàx€áðáàÀÀp{Ç08ð€ 8àc€æ8€Àà0〟ð?Àp<ÿÀÁøàÿÀððÀp Ç88à€ 8øxcÿ€üÀÀà?ÿˆžà?Àðxÿ€€þ@ÿÀ?þüÀðsÇü8€ þðcÿ€ð€Àà8㈞`àð ?€8Ààþü€þÿø€ýÿàÿü0÷àpp Àà~€`€ ÀàücÃà`€<€€@ÀBàÿxwp €€@€ÿ?øÿ<|ÿ?ð€>ÿ€ `ùÿ€a ÿÿø?€8€àÿŸø‡€À<üà8€ÀÇ8pÀ?ü€ðÀ€ÿð8ÁÀqŽp<ÿ€8ƒ€?àÏøø?ð€xáÀ€pÿ?ð`Àø xÿàxùÿ€cŒ À`8À8áÀÿøÿÿ€?ùþÀpàà pþ8Ãpc€À?ø `xp Á€ sŽx`0pÁÀÀÿøïÿþ{üü€áÀàð>ø8€`o€€8àðÿà 0á€ÿÿøÀ`8páÀø 8w=æ{þ8ÁÀpà0€0ÀGÿàø á€qŽ`spÁÀüÏüxçyþ.óþp8ƒ€àL8¿þ`ø€çÿà°` ±€cŒÇÿ|áÀÏþ8sóÿ?ûÿ8Ç€p<|8ƒ¸0àÀæ`˜ÿð ÿù€a†`p|ÁÀøÏüxçÇþ?Žóÿp0Žàp pƒ0p€Àÿ€€Æ8à0 €c Àl8|áÀðÏ8wÇüÇ;÷8ÎààŒp¿ÿ°Àÿ€€Àçÿà8 €a†`7|àÀ€ïÎ8ÿø†ww08üÀÀ àÿÿðÀ Æ8à0úð ÿù€cüàf8€|ÿðÀÿŽÏ8ÿø;w8üÀÀ àƒ80à €Œç`8ÿð ÿùÀaþ`pàxà€?þÏü8àð >r8p€€?‡8p à8ÀpþÆ8à0Àp €cŒàs˜ü8à€üÏþ8p:p8À À <‡80ð8 àpƒþæà8à0 Á€aoÿØþ8øÎxðþ8pxðÿð <Ž8pÿ€ðÀÿÀæÀ8àp 8ù€`@à<ðÆøóïï€þ8yøððüŒ8pÿ€àüÀþÐ8ðp 0yÀxà`€Àøçÿÿø8qðÀð€9ðøÿð8ÿð @?€ÿàÿÿø€øcÿÿà80ðÀ€àÿà8à0 €`ÿø@`80ãÀ€üÿÿø?çÿx{ÿ€ÿÿàìÀ8`?À?0€ŒÀÿø€ÿÿü=çŸxÿÿ€ÿÿà?üÀ;œà`?Àð;À ÿ€þâ  ÿÿ€Àÿÿø8çþðpÇ€à`x|€3œà` áðÀsÿÀþ ÿÿ€Îÿððÿþàüç?ð?çþþpŽÃÿÿðð<€8sœà` ÀðÀpÎ~aÀÍßpðsÎáþÿ?ð?çþÿpŽÃÿÏóøð€0<cÿàü €pàoÅðoüþaÀÙû`?à{ÎÁþÿð8çž?÷€pŽÃÿÿßðà €0ãÿàø <€0àïÿðÿ¼?ðÿÿ€ÛùÀü?ž?øÀ>çxð?çþxáÀpÛ‡ýßÀà€à0€á@À@æ€à°ùÀÀáÀÓqÀ þÿþÿøÀÿð?çþñáÀpÿþÿ‡ Ãàÿÿð0ÀáÆ€ðÆà€Àá†ààÀ×ñÀüÿÿþÿø€ÿ?ð8CáÀàxxÿüûÿßÀÿÿð0à€áÎxÿãÿÀþ7À`ÿÿ€Ðàð?øÿÿüüx€Çøð8ÿŽÀàøÃÿ}ÞÀÀ0`àãŒøÿàv`ÿÿ€ØÁøøðxp€ÿÿð9ÿ·€àø ÇÿÀÀ0€ppãÿðàÀÎpG±Íÿ¾<àxp€ÿÿð9÷·àpÇÿÿÀà1€p çÿð ãÿÀÿÜ8 8Íþÿþððpàþ|ð9ãÎŽàpÛÿqÇÀ`ð8ïŒ8 à8 >Ì0þÿüààààÿÿðyÿŽžàðÿüûÿãÏÀppðïœà 8 àp >?€Í€pÿ¾ðààæÿÿð9ÿÎüÀpÿüñÿÿà8Àãÿàx €ãÀþ?ð ö;øýÿðx><àÁàÇþÿÿðyÃŽøÀðžÁüÿÿà8€ãž p €8ÃÿÀþ?ð Æ9ðøpÿÜðƒàÃÿü|ø9ÿÎð€pÜ`qÏð>ãŒ`þø À0ãÀÆ0p8 ÁÌpÿøàÀÃÿùøxqÿŽ`ðœ`ÿÿð|<üÃÿàÿØ ÀpÃÀÎ0`0ÜÀ?ÀßøðÀÀÿð89ã pp÷ÿ8øxÀðãÿàÀ?Àøðÿàã€ÀÆ0pð 8ÃŒp?àœpà€€¿ÿøqÁ>ð >àáÂ8?ððàÀÃýÀÀ¸àÿÀÃÀþ0`ø8†pðpðÿøx>ÿÿÿ?ÿÿ€xðÿü€Àðãÿðø ãÿÀþ?ð888Äà àÿøp<ÿÿþ?ÿÿ€`àÿø€ÀÇÿðãÀÄ0`p8€x `àøò>ðCá0@8€8ƒ€ `€0€ƒø ÀpÿÀ€øøÿàÀÆü€?€ !ÿà0 €ÿàÀÀÿÿÀ øÿÿøÿàÀÿÿþž€ÿ€ þð|€àÀÿàà€8àÿÿÀ0ÿÿ€ààø80ðàø > >ð|àpÀñóàÀ€8àà‡ÀpÿþÀÀð'ø8pððþp ~ càøàþ|€ðøàØpðààðc€€üàÿø€0ÿþþààø?ÀÿøøðxðÀÆ ?áøø€ðøðÿüaðÀðøã€ðàÎx pÀ<ÿüÀÀð8ààp€ÿ† <À80€|ðÿüüðø|s€áðà€ŽÿþaÿÀ<8xÿàÀÿ|€€ 0Àx0üÇàþ<ðàðxã€óÀç€ ÿþaÿ€|ø€øÿà €ÿÿø € 0€@0üÿóÀðÐðà0q€ÿøàÀ„`|ÿÿàæà ‡À8àŸ€‡€0€`ðÿóÀ€øðÀã€þ8àÿ8žÀ ü8ÿÿÀÆ ?ÿ1À ÿ¿À8 `€`ðüyàüðÏàãÀ8ðøxÿþ`Ìø€üà pø9‡ ÿ€àp8`€`àøqà<øðÿàダ8ðà8ðÿˆÀœð=†ùÆ aàÿÿÿ Ï€`x 0àÀp8pð|Àðüx㇀8p€à€Ð xÏà àÿÿø €€px 0àÂàpðàð€ðàxÞ8pÀÿÿ€ðpxðÞýà Àà0`ø `À†€ðppàÀðÀ8Ãþ8xÀÿÿÀð üðxýÁ€ `ÿðü?€`€ø àÀƒÿðàà€?ÀðÀpƒøpp €8ÀñÿÀp8ðpƒ€øàü?Ààøp€€ øÿŸþððøð?ÀøðöðxàñÏà p0üÀü`üüÀü˜ðø~þïàÿüð?ÏðÀçàà<øðàÇàïï€þxÁœ@xç€ 9Àpp3€þ0@À0¯ÿÀÀøùáøxÀðÀàî€?þ8çÍÜàxçÿü9ƒ€ø ?àÿ0Á€0 ÿÿÀÀxÁðpüð€ïÿ€?†ÿçýßà‡ÿü9ƒ€ð?ø0þÀ0ÿÿÀÀ|€Ààüðïÿ€†ÿçÝÿà‡þ9ƒ€p<þ80øþÃp€àÀþà?øð î€>‡ßüàÿwûÿ€pø06ü€°€Æ`€àÀÆÀÀð ïÿ€ÇßÜàÿÿ`üûÿ€pø1€¼ €ÿÀ0Àlà€àÀÀÀÀð ïÿ€çÝÜàû÷8Ïü;ƒ€`<ÿð˜ À@8 ÿøxÿà`ÀxÀ€àÀÀÀð ÇÜà¸w8ïø€`øÿð àpà8 øþ`À88€€àÀÿðà?àðþï€÷™Üà8ç ïà€€`à0`ð?ð ø ?€`€p€àÿðà€pÿøðÿ€ïÿ€=¼ÿÿ™ßà8ÇoÀ€`0ðàøþ À`à€¿ÿ€ÀÀ|ÿøÿüø?àðïÿ€9øÿ÷9ßð9ÇÀp0þ8˜8ü8À`?¿ÿÀø€ÿøãþüàøî00ø9Ýð9‡ 8<Ã8€þ`0{ð8ppð`¿ÿ€þÀðÿŽüüàüÿÿø`ÿÿñÌ89pðÿ0ðð0xÀÀ`þ€øøxÿÿø?ÿÿñÿø8Aàÿ€ÿÿþ00` àà`ÿð~p?ÿà€p~  ` Àèsà8ÿÿ€áœ@ÿðùÀÜãþ0€?à €0ÿ €àaÌàÿøûÿÀœÁ€p<?óÿçŸü‚ø€?àÿø888øþàãÀð?À`9ÿàà8ÿÿà€  cpáÇïÿ€mb0€ð9ÿ÷€ãÿðçÇ€pœÀÇ<àÀàÀ 8ãœ?p‡8À ÿû€<à3ÿÀ€8ÿù€Càá†à<Àó€ãa°ð<ÿó€ÿáÿüðçžçpÄàçpààÀ <㌀pÿ˜Àp8<à9€à€0€  g†aãðàq€gq¸x?ÿÿ€ÿÿÿüàçüþà€<ðçüàà€À ?ãœáÇ8€`8|À3€À~0p ÿûÎcóÀ<8ÀÀîs˜ <?ÿÿ€?ÿÿÿüÀçþ~à€8áÁ€æÀ Àü=ÿ÷€xãÞ€|çüxÀx|ç<ðxð€ ÀÀÁÿ€Ã8 `8ü3€Àçàpþø øcÌÿǃÀ?€ÿàð€ €8àxàààà€€nÀ€ÀàNn`ßïϸ€p88ÀÿÀÇ8 ÿÿ€<ðpxðàðàÿþÀÀ€€ÿøü€€8GÀÿàvç`»îÿŸø€p8àxÏÿðï8ÿþÿÿ€àxàãpòÿü?ààÀ€?ÿøüqy€àÿøÿçøÀ8p~Ç`¿<ÀÜ8€0pÀ8øpŸþøïxÿþãÏ€ÿ€÷pÿÿ€páà?àÿÀ€?À€w€ÿðù€àÿðÿç?øÀ0p?Â`o8ÿÀÜ8€0àð8 øðÀ|=ÿøóàÿÿþ?óðßÿ€ÿàÿqÃÀÿü€;c1Àó€€Àÿ9À €À`p@`~üÿø€ ÿüøÀàðØ|9ÿøóÂÿÿ?áxùÿÿðü?ÿÿ€Àÿ8CàÇ€>€9€ €ÀÐqÀà`> €à € ?üpÿàà¼8xÿø?ÿÿ€ÿÿï<ðpàÀÿñàýÀ?ÿÿ€€8p?ÿð €Àœ €ÀÿÀÿü`€à 8€ ðàà<x÷ð?ÿÿ€ãÇÿÿüÿøpÿÿàùàÀðà xà € àÿü g˜Àp`w€8€Ü€`€àÀ à|øó€ïÿÿÿÿÿüÿÿpÿÿàð?€ÿðÀ€0`ù€@ÿüÿç?üÀp`—óÀ00Û€`ÿÿ€ÁÀ àøø÷€ÿðÿÿxïpÿýÀðÿÿðð€?ð?ÿàù€8ÿç?øÀp†f€` ßÿ€`ÿ÷€Á€ à?þùÿüÿðßÿ8‡zï9Àp÷€ãðü€ø,?ÿà0A€px~¼ ‡ Àp?ÀÀà À`€`€€ ð?ïûÿüãðx8ÃþÀp€ÿð>€ø8> pp0a€p0ùÿü ǰÀ~1ÿøà€üÿàpàÁðx€à†ÿü01€`0Ø1À ǸÀÿÿø~ÿà€`ßÿ˜€`€0ð/ÿÿ€ïðÿðþàqÿð?çÿùÿ€ðÿàÿðð€ÀŽÿü01€0˜qÀ GÀpîx`€`ßð8€`8xÿÿÀ?ÿøÿðþðñàxÿøñçðÿàÿðæÀž að €ø{€wŒÀpÎ`9ˆðÀøÀ`ÿÿ€ 'ü<ÿÀ{ÿøÿàü÷àáÀpÿ~ðÿÿðÀÌàߎÀ?8 Cð8ÿý€üÿ€ÿ÷ÿýÀp`1Œüœ8ÀÀÿÿ€>ø><?Ø9ïðÿàpÀñÀxçxŸÿðïÞø3¸ ð8ÀÿýÀ?Gà®çÀp`a‡~Ãÿ€øÀøÜqÿøÎLðáÀppààÎo9ü~sð qðà€ ~àÀp `8Á‡ì†8ÿ@àÏ9ÿø çgpñÀxxààøãw€ø?àü0ðàÀð8xÿñýÀpp‡ƒÀÀøóÏyÿø=ÇïxðñÿðpáÀÀþ9ÿç€à€øxpàÿÿ€ÀøpxÿÿÿÿÀ` `0€€ðñÇ€9ç¼<ÿ÷€xpqÿøxÿÿà€þ8ÿá€à`0À8àÀ ` ãÇyÿüyÿãàðáÿðpÿÿà0À`AÁ9ÿü8àÀ0 À0€1À00á†|xÿþø0ð<€8`0?ÿðÀ ÌÿÏüîðÿþ ü8à€€8À>üÿÀ@ÿüø8€ÿø<?ÿÿ€ïÿ`aÎÿ€ä ÀçÀÿÿ€ÿøÀ|ýÿÀðàÿøðpÀpÿþø?Ǹßç` ÿ| íó€ÄÿÿüÀpÃ|8€ÿÿÀààÿüÃÀÿáÀøp€8psÀ?ÿþpúøü Ý÷pÏü`ÏÛ?Ã>€€ÿ€ÀpÁÀ|À€àÿ€xà~3€ãüÿÀðø€xpÇ€Àÿÿþpàüø8¿¼` ÁŒø Ÿžþ€>ì6s€ €ÁÀ à°€s€àç€Àxüÿû€áÀüÿÀøüÿøsÿÀ Àù°ü8Áï< ·œ`ÀÏüø›Žàà;íô0àøÁ€ÀøðÀÿ÷€èÿ€ÿø?þÿÿ˜Áà=ãÀàøÿøÿÿÀ€ÿwð?÷ÿ€qÀ88 À?àÿüà ?Àÿø 00`` ?ðÀðð€ÿó€?þÿ€ÿøÿÿÿüøüÿÀàÀ`€8÷üÀ€Á0À÷ÿÀñÁÀ<㙀 aÿà`† àÿ?íø0`0 À‡àà ðÀ€þþ€xóÇ€ÿÿüÿÿüÿÀÀ€ð€x8€÷À€0ÃÀ8ÿÿ€ €ÀÎᎠŽÀÃÀp8 0ÀÀ`€ÀŸ€à€€?üþÀ8ãÃÀÿóÜÿ¿€üáÀÀ€øÿø9À€³ÀÿøÀÀ<ïÿ€ ?àÀaÎ Oýðÿà` @À0 ÀŽÀÿÀ`À€üÿøǃÀÿãœ<€áÀøðÿøÿÀqÀÀx‡À8<ã8 Ó9ÀÀçßœ `àÿÀ8àÿø0øÃ€p€˜€xÇøÀÀ€ó€þ€ÿø‡Àÿãœ87?ñÀþ€8óÿÀÿàÀ8‡à<>ã ÀÀgÿÌ`àÿð81þÀ0Àø€cðø`Àÿ÷€?þ€ÀxÀÿãœÿø?ñÀÿ€8÷9ÀqàÿðÀ8>ã À€Ðà0 Ï€À8 0>Æ`Àðpü`€ó€üÀÀ|Àÿóœÿø8qÀ€ÿøs9ÀÇyàÀ8œÀ<nãÿÿ€ð`9Ì€ÿÿÀÀÀÿð<n` À`0|`Àã€àÿàÿøÀÿçœ>`?ñÀ<€ÿøwÿÀãÿÀÿð¸À<NçÀÀðoÿÌÀàÀà 0x|Àð 8À`Àã€àÿàÿü¼Àÿçœp?ñÀ|€û¸wÿÀÃýàÿøø€<ç ŒÀðdx `àÀ 8p8À=ø@pÀó€àÀÿøø€ÿç<œððÿ€À€à?ýà8àÀy€ÿ?ð08ÀÿœàÿÁÀÿü¿üƒ€8a€ñý€üÿðx|øÜÀp€ÀýÿþcœsÀø€øÀ€ð¿üà<àÿÀÿð8€8àÆÀüq0Àá<9Œÿðø€@8€Ãÿ€yÿüãÿÀ?3€ÿüÀ?ð?ùÀ8ÀøÿÀ8p8€~qøàóÿ€ðáøÇÁƒ€à<û Æpø<ðÀÿƒÿ|8ÀÃÿÀ83€÷žßÿ€üƒ€à8àüqÀÿ?ðàÿžÿüà?ÿÿÿüÀØÿÿ€ã·þ ÿðàó»€0€~1€Ãœ`87À€Ïÿ€çüàpÿà øóÀþ?ð8ðÿŽÿøà#Àÿü€Àþ9ÿgüÿðÀ3€0p€þq¼Ãÿð0?à€~ÀÇ€øƒÜà0?€àŸÿÀÆp8áÇ8à/ÀÀÿ þãÀ< üæ0gàöaà0` ÿ€ðÿüãà0ö8€À‡à?ýÀpÀŸÿÀ€p8Àpãÿ˜à€€ÿ€8ÀíÁàxüîpßðôÁà ÀþñãÁÀpü€€€‡€`Ÿüàp àÞqÀÏüxÀxáÇ€ÿÜàÌÿüÇÀÿà€àpÿðx8€`81À€  ñãœàxp¼€<<àñà`ÀžÿÀŸüp€øÇs˜àüÿüƒÀÿÀðÎ`à#ƒð3€@³ÿüÿÿðà8€x€<pƒøàx€àßÿÀÎ8€8À;œ`ÞýÜÀ8Àñÿ€ð àñÿ€à8ÿáü8c€àà0 €ðx<à¹àxàŸÿÀž‡ðƒÜà|?ÀøÞqàÎ8ƒ€9œ`qÜ9€@€ÀpÀqƒð €`81€ àŽÃ€8üàÀ øÀàñ€|üŸÀxÿà?üœsÀŸüposœàc˜s€€ÀÇ€áÁ€ c‡ð`Çðqƒ€ Ç»€0ÿ€À€°8àÀñÀ~Ÿþÿÿàxÿð=þÞÀÏü8?;œ`qÜqÀÀþÿ€àÁÀñƒ¸à<ãàñÀŽÁø8c€Àpà€xáÿ€þxþÿÿàyÿð?ÌüwÀŽ8p >€àŸüãÀ~þÁÃÀãÿ0€ÿÀñÿþ€0ãœÀ8àÿÀ~üæ€à8 ÀÿÿðÄø?€àßþÁÿà€ÿÀaÿaÿþ1ÀŽ8þÀ^ðÀÿÿà0<ÿà€ðwàã¸ÿ€ÿü0à€àÿÿàÿà€ð8à` >pîÿÿà@0€pÌ@wÿp`€À~Œ€À8ïÿð@ÿþààp€€üÀÀüà€ÇþÿþÀþÿà<àî0ÿÿçð€ÿ÷ø€pØóÀãî€à<ƒÿÿøþÀÿÿÀ>ÀüøÇ?à?ðÿÿ€tÁ€xî€08€àüÀp`ÿÀ`üàÀ?Çþ.0ØÿàÁÀæƒð8€ÿþ|þÀÿÿ€Àü8ÿð??à=Ãàÿÿ€ÿÿø?ÿü€0€ÀáÀ` à~pÀÀpÇ?íôÐÀÀ€àçÿà€€€yð<þàÿÿÀ ø8ÿðÿ¸pÁÀþÿ€ÿÿÐïü€>À`À`À0ÿ pàÀ0ÃÐàà€xçþà€€€{ç€<ÀÿÏðyàÏyàÿ¿ðƒŒpÀ8þÀøÀAÿ€08þüÀÀÇþíøØàà?€çÌ`€€ÿÿÀ<ßÏÿÿðÿð?ûøpáÀüÀ0À?ðÀÀ!À`øàÀ1ÿ† 8Æçàîÿàð8€ÿøÿàpàÿÀýxð?þ¸pãÀøÀü€0<À8pÀð3€8€`0àÀ1ƒÿøÎç0ìÎ`<à€ÿøñàÿÿÀóÿÀÿð>þøyÿÀø€Ïü€08À8pÀð78`0àÀqƒÿøþãÿðìÎ`øÀ€ÿø€àÿÿÀûÃÀÿÿðüÿþã¸þÿ€€ïü‡øxÀ8pÀñÿ>p`0àÀqƒ 8Üã€þ°èÎ`à€8€ÿøðÿÿÀûÀÿÿðùÿÞó¸îÿ÷àþxÀ ?ðÀáÿÀààðàÀqÿÿøÀãÀèÏàÀpÀÿøøðÎp;Àü|øÃÿœ?w8€Îü € áŒ?xÀ8?ðÀãÀÀÀðàÀqÿ†ÿø€ÀþðàÍàðàÿðýàs€;Àüøxœ?w9ÀÇì0à>ã÷xàø8`ÀáüÀÀ0àÀqƒ† €ÃøxÀ€ÀÀà÷§ÿàsÀ{Àÿà8ÿ<39ÀƒÌ08yü8<〇àpàÀàø€àÀpþÀÇÀ<>>ç÷€ÿÀ<ñÀûÿÀ¿ÿøÿ<'?ÀŽpxðü0xÿ€€À@à€pþÿÀÇ?ÿþóûÀÿ€8ñàûÿÀÿø9ø8?Àðx€<!à€€À üþ>ÿóÀÿ3ðÀsƒÀÿðqð0€ð0À`ðÀà€àðàÀà€ `ð`x€à` ÿÀ~~ ÁŽà?ÿà8`@ÿ€|ÿà8üð€ãÀþ€p?þ?ÿÿüÀþÿÿøàp€<à‡ÿ€øþÀxýø?ðÀ à €ÿð€pÿÿÀ1ÇàðÀ þÿÿø!ÿà`ðÿþøxãÿ€p 0þŽÀðïøqŽàÿÿðÀÀ€À pÿ€€à`0Åü?øp<à›€?ðp`?¾ÿüøxàpÀpîŽ9ÀÀì8ãœàÿÿÀ €€ ÿÀà~gÿàp?Ïü?ð`xÀÿƒƒ?ð`qŽàü<ð>8?à8€çŽ9ÀŸþñÎàÜÿÀ€ÿÀàüð88ÎÜ p€xÀ?ÿ€ 3ÀpÁƒÀ<ø8àìÀÿÀx>ÿàpÿ€ƒ€þ9À?ü?㜠Ø€à~à ð00ÌàsÀpÀÿ?ðƒÿþø<ÿøÿðÿð8€p€Àþ9À8àñŽÈ Œ;¼Àl =ž0?ÏüïÿÀxÏ€†8<󸇀ÿüàÿÿüÿðÿààðxØ<`àŽ9Àwãü8ãœ?þÿÿþó> ÀÌó€ 0?ϼ`ðÿŒr88ïø€àá€ÿüÿÀ<àÿ€8;ð<pøŽ9ÀsùüqÎ?ÿÿÿþÃðÀ;€áƒð 0n `0øxÿ€¸8|€à<ÿÀxàÿàü8?à~à?ÿþ0€ ¾9Àçøà?ãŒ1Ç€à8ÿÀàà00ÿÿüà`ðÀ<`ð0à€ÿü?ÿ€xÿàïÿà8~ÿüàà?> Ž9Àçüà8ãœ1ÇpÇÀ@p0øpà0`pà> ÿð|xçð`Àpà?ü8ÿàï<à<øãðx@Ž9À÷îpqÎÿÿøÿàÿÿð`ð8Àÿÿð1Àoü÷€x€fÿü`Àðì<ÿà|ðïÿàxà€øÿÀŽ9Àæìà8ãœÿ€ÿÿðÀÿÿà@0à0€8ÿÿà0?ïüæx€ Ìà?ÀÀÀÿþýÀ?ÿøïÿðxÀÀù€ÿàþ8ÀwîpñÎÿÿÀðÀ88à8 0??çœw€<€ FcðÀÀÀÿüã€ÿðÏÿàà€?€ñÇÀÀþ9Ànî`?ãŒÀ0€8pø1Àp~08pÀ|>f< ÿðø€Àp8ÿü€<ÿ€ï<ðà€9€xÿààÎÀ~æpáŽÀ€?ðþàpgð?ðÀ8?wŸüÀø€áà0{À€xÿðï?à€ppÀÀÜÀhà`à aù€€ÿð >`àwàsüg°æüÿ àÃyÀ`À8Áÿøï?à?€À0pàÎÀpàppùÀ>àcþóà?À!ÿcÿÿ÷ÿ€ðÿs€@óÀàð8ßøþ;àÿà?ø`ÿÀÀ`ãà8p|€ðøþŸà€€Àÿþfÿ€ñÀàþ8 ÿ8ÿÿøÿàøÿàÀpãð08|Ààø~€À€üáÿà~ÿÿþþÿð€øÀ€`áà8€8ð€à€€Àáÿà>ÿÿþ8ÿð@Àá€ÿÀÿþ?Àù€ ÿÿ€??ùÀàøAó€ƒþÀ€àÿþàÿ@À`ÿà?øÁ㸀Ãþ€ À8 qÀüÿð€ÿÿ àÿ`àà€ðÿ€ÿÿøàÀÃŽ Æx‡ÀÀ>€8ÿÞ1Àà8à€þà`` À€€?à À?àÀŽÿÿ0{ÿÀÃÎà?à€8?ÿþ1Àà8àÀþà``€.ÿÀ€þ ŸAÿ€ÿÀ€†?ÿÿ8ñÿÀ€ãp€<ððp?À Àþ€à8ÿþÀÎ çÿ`ð÷ûÀ8€8<ÿÿÿ€?î ‡À†ø?ÿÿ<ðððóŽp€?ððó8gÀÿýÀýÿÀ`0ÿþÀ ï``ðá»x8€ÁÀ?.˜À3†àÿ{þð?ÿÿðÿøóœÿÀààÀÿ¿ü<ðÿýÀÿÀ`0@8ìÿ`` à<xxíàÿÿà86ðÀ#æÿàÿ€süð?ÿÿðï<sÝ€ãààÿ€>ÿ¿|ÿøÀü8À`€þ0ì÷ÿ` á<xxÌøÿÀ0>àÀcöÿÀ>óÀ;üþþüàÀÀŽÿÿÀÿpþ8ÿ€ð8ÿðÀ€8Àg€ûŒþ`çp` ÇfxØ ?€À8`ÀÀcþü|ñà?ÿÿø~ãÿÀ¿àÿÿÀüp?ÿ<áÀÃà88ÿÿÀ1Ø€áŽ`äçp` çø˜ €ÿÿü`ÀÀþ8ñààÿÿð>ãÿÀ?ððÇÀðpÇà?Ÿ€Ãà8r?ÿøÀÿÿü|Á‡þÿ€|çÿ` ýÀxÿþÀÀÞ|áÀðÿÿÿp>àÀ?Àp<€p‡pÿÀ8ÿÿùÿøðßÿþ>óÀ<çp`ãÀxÿ€ÀÀƒÿÃÀðÿÿìàãÿÀ€xx€p‡øñøÿœ8ÀÀƒ`ÿÀà çp`Àx:þ€ÿ€ÀÀƒÿþÇ€ðoÿààãÿÀxpÁàp‡øãàÿŽ8˜8Ààƒÿþƒ€` ÿÿ`Gþx€ ÿÿ€p€ÀÀƒçðÇ€ðààáÿ€xðÿÿððøxGÀÃŽ8;ÿüüÿàþþ€` þp` ãÿ<€pàÿ€`€ÏÀàÿÀÀà€>pàÿÿààÀÀƒ†8?ÿü Î8ààà<€p`ìp`80ã<€áÀÿ€p€‡0Ÿ€þàÿÀÀãÿà>ðÀÀÀ€ÀÀ8ãÀïÿ€ààFÿþ€üàÌà€ÿ`ø cû€p€<dž0?€üàÿÀŒçÿÀ~ð€<€?€€0€ƒ€8〠ÿÿ€Àà þÿþ€ÝÀœÁ€þ` ø ã8 ÿÀÿ€?€þŒ0{€øÀÿàŽãÁà~øxÀ~üð0À8ဠÝ÷ààÏ <|<ÏÀ> À<`ãü8ð~ÿ€€€|œøpð€ÿàüçƒÀþ?øð€`8øÿ€0ÿ€pÀ ß¾ùáàÿ€8ø>ÿ8ÿÀø`ãþð:<>ü`€¸ðpÿðþãÁà~ø@Àx?Àüÿ€p€ ¿œøÿà€à€x|ÿ€à€` C†;ÿüø øà àþçÿÀN€ €øƒà€ ?áà€€þ€€0à?øÿàãÿà€ðà€ À€?ðÿàçƒÀ€À €àÿàÁ Ïÿà` Ïùà@Œ0€€Æxp `€qÆ p€€øÿÀøÿÎÿøÿÀÀÇ8ÀñÀ à ÀÏüì€þùÿ€øÏœ0ÿ8€øÆp<<ÀÿàÀÿÿàÿÿ€<€€qÇf@ 8Á€à ü8ÿ¸0;ÀüÇ€ðüx<€€ÿÀÀÞÿÀÉâ?€?ÿøÀ€a†æ`ñã€À8àÿðüq¸ç0ÀðÆ€pþ<p<ÀÿÿÃÀà€ÃÀ Œàÿ€?Àà8`ðÇüsÀ0¸àøÿ€à4àÿø0àø÷6`ó€ÇÁó€þxÿþÀø<€ÿÿ@ÏÀGÇüg9À?øppÿà‡üÿ€x8pðÿð1ÀÀÀÀð~np†ÆÀÿÿÀx<ÿþàÿ?àÿÿpÿÇà?€?ã€ÿx8CÀüðpÇ øøp`øà 8Á€àÿãÀÿø€`?ÿÿðÿÿ€ÿüxÀÿ€8À <0Àðá¸?ÿàÀÀ€‡?àãÀ€ü?€ñÿ€Àÿç€ÿð8Œ¾?ÿÿàáðÿüx yãÀàðàp€€ø`8ð<0áÀÀøÿð€€?ÀàÇüŸó€À?àßø>ðÿ€àçð€0€: ìÇÁç¿óðÿþáÁÀ8àÿþ`Àÿðà>ðü~GÁ€€À0` ÿ÷àÀa†çÿûàçð €Àüÿðÿÿà0ÆÁç€ÿñàÿþãÁà8€ÿÿpàÿ ðà>ÿÿþÿ€ À€|ð ùà` ÷ àà<`ð A€à?>ÿøÿÿpà ÿÿ€ÿóÀwÿüÇà0ÿþqà¿üÀàLßÿœÃð€?ÿà0cÿ öàà@ ã€Àÿø€øÇÿÿÀ€;€pà0 àwàð|€àÀÿþÿüÿþà0c‡ ¼ÿÿÿÿð8 `Á€ÀmÿøùðÀþ€0Çøÿþ€€?Àpà>à?ððø€à?ŒÀÿþ`ÿüÿþ`s‡ ÿœ€ø8 pá€ànÿø€8ðÿÀÇüñü€€p¼À< ÿÿ>`ýà€ÀŒƒ€sÀà`ðx8c‡ ÙÜüà pá€àŒ 0ÿð~ûXœÆñþ€püÀ>àÿÿ?à€à ƒ€#€ÀÀà€aøðøaÇþ@nÀ á€àŽ 0ÿøÙÜ.€ÀùüƒŸpø€<ÿðÿ€à€€À‡ÀÀàà°€8þcÿ>~À g€ á€øpàà™ØnàÀÀùüƒŸpð€<ðÿàà €€ç€ €àÀá€ü¸ø?sÏ<÷à ÿà àp8ø`<à€` À ÀÏðÿñüÀ?üÿÿÀÀ`€àà0 `ÎðÀü?@àÀÌà€|€àð`€àà <ÿxpÿ?ÿþÿÿð üÿÿ€<<ðÿÿ0À€?ÿßð?ÿÿÿÿà<?ÿþà ÿðùç€rÈÇ|ÿÿàÀÿ0 ÿÿð8à`ü€À8;ßþÀÀÿáÀsÌÇàðüÿÿðÀ€üà8ÝÀà8ŽÀpüÀÀ80Á€À` ÀÁÁ€á€†ÿÿÿÿøüÿÿsÿ€ÿ8€ùÎà8ÝÁÀ;ÿÎÀpüÀÀ@?ÏüàsœÿÀÁÀ€ÁÀÿÿÿÿðþÿÿ€#üÿüÿîÿÀ?ÀÝÇ€;ÿÎŽp <€À`?ϼûÿ€Àsü ÀÀà€ðÀàÇðç?ÿÿ€<ïøÿþàÿþ?€ÿÀ8`€<À`0Ìóÿ€À€??ü à?àÀ0àxàpÇpÃÀ?ÿÿ€00 p÷<À0€ÿ8üÿÿðƒÀ?ÿþÿÿðïÿÿà|pàðþü?€Ýÿü0?ÿÀáÿ€<ƒü`€Ïø6€ü  0ç€À0ÿ߀ÿÿþÏçpøÿøÿÿøÿÿþÿÀÿŽààpp€Ýÿþ8ÎÁàÀ <€`À0Ì4€€€ àÀ0sÿÇÀO p8ð>þÿðÿÿðÿÿþûÀÿœàÀx`>ÿü3ÿÎ~ÀÀ <0`Àü80€?€ ÀÀ  xÀ|÷ÿÀxÿÀÿÿþÿøà8îàÀÿà€À8à0ÿƒà0:À <0fÀ??ñÃøÎ À|ÀÀ`ÿøÿàÀüàÿÿà8À@ÿøãÿàçþàÿœà€ À<À0€8ŽÐ<@>à>ü0ã  \€ÿÿàÀ8~ðÀÌsàÿÿ€xüðÿøÇÿàïÿþÀÿà€€xÀp=À09Žà <À8|@?ÿø8pãÀú€ÿûÀx€0À€aÀ0ÃÀÀ8ÿàð8ÿ0`pÀp8ðá¿ø‡àþxà€ÿqÀøüÁÿƒ€7ÿî€`ãýÀÿ‡ónx =ðÃø€0Çðð0~ÿø?ÿàp`ðÀàðþÿ¼?üpàpxð0Ãàÿó€Çàà9àþïÀ?üþ€ÿþüÿà@ÿÃÿþ8 ~à>À?`€`ÿÿüÿø;àçÿà`àøïÀð€?ÿþþýà€?ü>àø€ÿÿø?ÿøÿÀÇÿàà€€8 €À8ÿÿøþxÿÀÀàà €à0ÿ€À``€ÿÿü#pp ü`Àpð8ÿüÿÿ€ÿÿøäð8à`p@8þ8`à~pÀø`à8Ì0Àÿÿ€`?ÿþÀÿ8`~àÀ?=ÀÿþÏÿü<ðxp<c€ÀÀÿÀ? À8ƒ€€pà˜ à`ppÆs€ÿ€ÿüÁ€Çþ8?üÀ8 àaàxàÿþÄ€ýïpƒøxp`3€?ðàÿÀÿ€àƒ€‡ÿ€`ø ð`<Ç!€çÀÀ`pÂÀ ðaàxÀÿÿüÿÿÀÿî8<‡øðpð ?àÿ€üü Àƒ€?ÿÿ€ðÀüÿÀ À Àà`8ÿüààgxÀÿÿüÿÿÀÿÿðî<ðp``x€?üÿÿÏpüp~x0Àÿøÿ€àq€ oøppÀ0À À`t.ÿ€`à0p`pÿü‡ÿÿÎpüpxð0€€ÏÀ<ìc€ x8`p0 ÿüÀàw#ÿ` À8``p?þÿÿÎpœppà0€ÃÀ?þc€ pÿø0ÿüÀ`sŽl8 €8p`p†ÿÿÿÎp€ppÀp€|Àüc€ `àáð80À Ààps~ÿ€ <8``pçGÿÿ€ÿÎp€ppÀpÀ|À àc€ pàÁð80à Ààq˜s>|ÿ€~0p`pçÿÿþÿÿÞp˜pp€ðÀÌÀ þ〠?øà8à0ÿüÀïÿØsþ89øgðp`0pã€ÿ?üÿ€ÿÜp€ŸüppÀ8øà€ÁÀþÃðàx`0€ø|ðäÿsîy8øcàpp8p€ïþüÿ€ÿÜp†þppÿüþ|€ÿ€àÃÿÀçðaðàx<ðàý pÀpp8p€çþüŽ€ÿ¼ð·þpp8ÿü~?€€€ÿáƒÿ€ á€8qààððà8žpø0?€ïüøŽ€ÿxðîpp<ðö€ÿÀÀ~ÿ¿pp@€ÿÿø!€`?ð=þŸÿÿÿÿ€ÿÿàþpüàÿÀÀ8ÿ>`à?üþÿ=ÿÿ€ügàþp?øÃþðüÿ<ÿàGÀ~0?ðÃþ€ð@8Ž€€<€€ÀÿÏü€€ÈþÎ`øÿÏ€€0€ €<€ àxÿÿÝÿðþáÎÀÀ8ðáà0ÿÀÿüÿŽ€ðø8€@Ížp€g€ÏüÀÀðãÿÀ8?ÿÀ0ÿüÿ€Œ€pø08Àü›ûà€8á€ÿÏüÀÀÿÿøðãÿ€À<ÀüàÜ` ÀŽ€Ààx0p`ïÛûÀ€pÀÀa΀ÀÿÿøðÇÀðÿ8?G€ÿ€ð€8ÿþÀ ƒ€ÿþøÿà Àx 0àp<×q€Á€ÀÿÏü€?ÿÿüxÿÏÿÿøÿÀ?ÿ<ÿÀÀÿ¼À8?üÄ Àÿøð8p€x 8ÀpÁ€ÓáÀÁ€àa·ÿÞøpÿÿÿÿðÿàÿÿ8?ÿ€?€ÇÀ 0àpÇ À €€8ðxÆ3€Á€ÀàƒÀàƒø˜ŸÀxÿÿà à?€xÿÿ€€÷ÀÁ€ÀØÃü‡``Œ€ÿ~?ïÀq€ãÀð8€ƒ€ÿð€8xçðÿÿøç€8ÁþÀ8ðàÿ 80<Ç 8ãÁðÇ€€ŸøÀ€À8ƒÀÿð`pþ €`ÿÏxÿ0ÿ œ`øþ00ÿþŒ80Ä øÃÿ€ç€øà<€€ðÿð8~|À8~8~€8?üx08ÿ€|àxƒÿ€ÿÀ9àx€ü>øøÀ8̆0ÿðp8ÿÀÿà??ðp?€ð|x xÀÿÇ88ÿ€?€|?à?ð8À8ÿÆ0Àÿ€0à@À?Î8à ‡þßÎ0`à0À †0 ƒüÿÆ8À€p8€ÿð8ààÇ8À€Àà`€Þ0ÿÀÿÿðþà8ÀàÿàÆ0àÿÿÀü€Àÿàx€ÎÎ8À ðpÿÿþÿø0?Àÿÿø àÆ0øðÿÿàÿ€þ€Àÿà€€<?ÿþÿÜ0À €Àp`uÀø‡ÿžàcøÿþüÀ8ÿðÀpÿÿàÿ€þ€Àÿàÿ€À ðÿþÿÜ0ÀÀ€Àpð7Àü‡8㞀`8À`8 ç0ÿðà À€s€ÿÿðÿàÀÀ88ÿàþ@ÌpÿÀÿ€€Ïþpð7@8ÇpÂÀà8þïà?ÿþ?ÿxA0?ùÀÿ€s€ÿÿðÿà?€À?ÿüÿð?ÿÿøÀxÎúpÿÀü?ˆÏþpà3qÇ!Ã`à€`ÿü8xc€ùÀÿ€üs€ÿÿðÿàœÿøŽ8xÀÿøÃþÿóàÀ0ü?ÀpàÀ8á€Çƒ‡à8?ï€øc€?ùÀÿ€üs€Àpÿîþø>8ñÁ€8Çÿ€ÿáàpøÀp`À8Àþÿà8ï€øãÀ€ðüs€Îpÿÿÿþø>ÁÀ8Ç?€€ÀÿÿÿøÇp0€|ƒÀþ8ü`80A8¹ÿüÀÿ€ðs€Ïþpÿÿÿøø8ÃÀ8Çù€ÿÿþü|Çüp8€nÀÿ8~ÿø?ÿ€9ÿø¹Àÿ€8¼s€Ïüpÿüü?à€ð€8p‡Àœ8àÀÏð0Çp @€oÀÿ{À€ÿð8ã€8?ÿ;Ç?ýÀÿ€<üs€Ïp?ÿøð€0ÿ€8p‡ÀÿøÀ‡À0Çp Àxg À€ÿÀä`0á€ÿü;ç8?ùÀƒð`<üs€Îp?ÿøüx€0ýÀ0àÀøàÿà`Çp€8À€ƒ€qÀ~`8?ÿ€8ÿø?ùÀÿøà<¼s€Îp?ÿøð<€1Ýà9àÀ8àÿà>`Çp€À¸€€q€8`89 0ÇñÀ?ÿøà<s€Îp?ìðà€3ÜðÀÿÀ¸Àÿ€8ÀÀvàÇüpÀð€a€p`80á€Æà0Ç€0ùÀÿÿøÀ¼s€Ïüp?îðÀ<€sŸø€8ÿàø€ýÀ0ÀÀÀfÃÇüp€àƒ€að`8?ÿ€‡à0ÿøÿø¹Àóÿx€üs€Ïüpçà¿<?ð?ÿüxÿððœà ÿà€ÀÃÀÇp‡€ ÇÁÁà`8?óŒ‡p0çøÀÇžp€üs€ßüp?çàxÿøÿþðpàøð0ÿà€ÀÿÀpÏÿÁ€à`80á ‚08ÇÿÿÀøð¼€€ðÿçððãþx€`8?ppÁÀïàÀðxÿ€àïÿðüÿÿ1ÿüàyððž€Àðùÿÿ?à„xpp à8~àÀà~à@ð€Àsçà€€ðáþþp`qÇ€ÿÿø|ÀÀÿÿàÇà€€ðø0 ÷ÿÀÿþ8àÿÿÀÀààïù€à€"8à8à`à0ÿ€ 8ÿÿ0àÿ0Ã`ÀÀ xÿðÿÀÿ€ÏÿÀ8€x€ÿ€€ð0pøÿÿ€p>þÀ€ À€žðÀÿø™ÿðÀãÿ€ð~<<À8àÿà`<üÿüÿø?ÀsÀàðÿÿ€>€x8ð8ÿüÿÿ€@ðxó9Àp€ ðÿðø cãþÿ€À>|8qÀ8Î0`ç€ÿðÀÿÿààÀã€à8 €ÿþþÿ€?À?ÿþÌ`Àð0<?ÀüùÀ1üÁÀ`ü<ÀÀ 7 0€sŽðÿÿ€?àÿÀùð0ãÀ8àÿàð|þwýÀp€ ?ààpÎc÷ ÏÀ0€àwÿ€ N`üÀÿÀðãÀÿàÿüïþqÃp@oþÿ¿ü ÿÿ€ÿàÀøxÀC€Àã€Àðƒ€`ÿç€0ÿÿÀ0ÿ‡ðÿÿ/ÿЇÿþ0?ÿð8ÿßüÿÿÿÿÀþñpŸïà?þs8Àÿ€€ßÿÀÿÀ À0€ÿÏÀÀÿ߀À Àÿç€?ÿáÇ€ü~<†øyïÿÿ€ÿÿà`9€ €8áÀ0 sÀ0€z9ø=À;ÿäЀ8ÀïÇÀÿàù€0<@<>< `éøhàðÏ?àð|û€€ÀàÿÿþñÇ<8àÃàøø=ÿ€nïÿà€8ÿÀ ÿÿð8€€yÜ08À€`òÿÀ`Àwÿøpðàà€àÿÿ8càqæÿøü€ÿà3€óø8 À 80qÀ0Àÿ| 8`à8x€ààpðÿýðÀÀ€€ÿÿüáÏ€8ÿŽÿàÿø8ã€o†`s€8àÿð` ãÀ0x€~ûÿààÀÿàáï€ À À¸ðpààÀçpãÀãŽÀxp€à€þ0À ÿü1À0<@Ìÿðð0À8àÀðÿÿÀÀÀ†€ÎÀ8Çÿàÿø?ÿ€>ÿ`€8Ãàp0 À0p€p80Ààà€0à?€ 8ÀÿÿàpàïÀç€ààpáŽÿðüÀ8à€?ðüÀ aø ýÀ0<`8Œ0ø;ÿü0À8øÿÿ€À€ü>€Ž‡€xÀÜÀã€8ã€8àðø€8àp ÿûÀ0ð€xàpÀp|€püÀøç¸xàþÀpçßÀ<pà÷§¹ÉÀxÿâü8Àà8øðÀ0<pøx 8`à€þçð€ð€ð?ðã€8ÎÎs³€þ?óŒ¸à €8<ãàà À0`pÿÀàùÏ€x<€0<<ç€Á÷Àÿ>àÿ€89ÅÏqsÀ~0à8°ÀøðáÀÿÿßÿð~àw€Àÿð8ãÀ?€ƒãÀÀÿƒøyÿçùÀþ8ÿœàøààÿÿÏÿ`àÀpsáÀ€ÁÀ<þ€€ðqÿÂð€üÿ˜à`@à#áÀ?Àüþð ÿ€àð|àà ààøÀ0Øàà Àÿüààñðp`ÿøàüÿÀ˜pÿ€à0ÿð ðà€ppø `8àÀ0üÿà0ßßßþÿp€ð@8À p 0ð€ Ìp`ÿøÿþàÿð{àÿÿðàÀðßÿÿþð€x`€ÿÿ0Ç08à0ÀÿÿÀÀîÿðûøý>ðÿðÿÿ˜àÿÿðüÀðp»îXÿð €€<<` ÿÿ0æ<àxà<ÿÿÀÀÎ?ÿðpÀxÿÿœàÿÿðüwÀðp?|x €ø` ÿøpÌœ<àxàÿÿÀÀÎÀ€€pá<x;ÿü÷3œàÿÿðÿàÀð0o89·ÿ€à` ÿü`ÀsÎ<ÀðüøýÞÿÀ€Žÿðÿü8;ÿü3œàÀ`püüÿÀp p~8€a¿€ÆaÿÀÀ<ØðÀüøÿÿþÿ€ç¿øÿðÿüx3œàÀ`0ÀðüsÀpp|ÿžÁÿÆÿÿ`þƒ—€<þÿàüà€ðÿþøÿÿüpÀx@ð3œà`0à`pÀpßÿŸÿÿüÀÿøƒ€@ ?ƒÃ;<ÿÿàðàÀðŸþp>ÿ?ðpÀ<øÿð83œààppà>pÀpÿÿ€€w?€ÿÿüÀ ùÿø€À }ßø>ÀàØàø¸Üxþÿ€ÿðÿüø w3˜àðp0À„ èÀp=Ïp¿÷Àtsð€À ùÆÀÿüþàü?€|øcÿÿü|üÿ€ÿðÿüøpÿÀ?€à?øà@8€üÀpyÆp€€ñøðÀ 9Æ€À~ü ü€àÿ€>ÿ3¿ÿÿüÀ€pÀ¸ÿðùð?àÿàÀx€øÀp}Æp€ó¸ ÿ€à€ ÿø€Ð`àÿ€<ÿ€wÀÏðÿ€pÀ<8ÿðàpvÀÿ?À€x€ÀðùŽp;ÿþð8€ÿÀà  9ÿøð<?‡`<þpàÿàóÀ??ÿ€ÿ€ÿðÿü8À00ÀøÀ€€ÿþÀpÝÎp¿þ·ÿà€€à~Ç€ðÿ<>Çp8ÿxüxÂððÏÿÀÏÀÿàÿüÿÿ8<ÀxÀÀ`¿ÿp<c ÄàÝÿðÀàxÀq† À8ð€ ±ÌÀþ8à?àðÁà??ÿ?8ÿ€÷0ýÈ8ÿø<8à€ÀÀpÌp9ˆ0qÀ€ãÀÆø0€áÀ|6_ €p‡xð<À=àxŸÿ€ÀÿÀ{€` 8<¿€ðƒðp<÷ g8`Ààpçpa¾À80?þ†àøà{Àðÿçàÿÿb0p çyÀÀ8àpïð€að xÀüÜpaŽ0á€€áø‚0`€`x ðfwÀÀ‡pð8ÿðÀ7àpÿÿ€0;œœs€À<àp83ðÀ9üŽpÿ€ 0á€pà€à0yþÿÀ0¹î`ÀàÀðÿàÿƒÀ?ÿðþç;<Ç€áÁà8ÿøÀ0Àþ808ƒóŸ€þ€ÁÿüüÿpððøÀ>Aà?ÿ€?øÿsÿÏÃÿÀðÿð?ü€Àà€à À;‡À>àü€~þÀ<Àüàp€p?ÿ?ðüçÿœÿ€Áÿà8ðp€à€p€ïàÀþÀ€߀øaÿ€ÿ€À?à 0ÿÿð?üàÀð9>8 ÿÿÀ÷ð€ÀÀà1ÌÀ0 ÀÃ`€Àpðp>ð``ð€€àqÜ€8à<Àp€`àx?ü`€þ@03CÀÀÿàpÀð€ãðÀ€ãÿ€ü€à€ À€xs0Àsx?ÿÀ€ÿÿðpÿðÿÿøü€à9ø0Àqøÿ€ÿÿ€`üppð8À|xàÿÿxø8ÿÿÀàÀpÿÿð80€3àÀÀà=÷ÀüxðÀ`ð8ÿþáÀ?ðøÁÀ<ÀÿÀøþ€à÷8pàðxn€à0às€ƒ€qÄüÿàs€ÿðh<ðà8Çÿøùàà8ðüøøÎÿÀÿÀpÀ€ÿÿðÿþ€ÀÏqÃûÿ€pÇÿð88 €xØ8‡àx?ÿ€ÿÿ€<ÿ€àwÿÿðÿðÿ€Àá€ïüÿÿ€àpÀáÇÀáÁ€ ÀÀ0`àø?ü€/l À8€€üÿÿxûßðüÎÿÿàÀ?ÿÿÿ0€ à€ƒœÎƒÿ3€Á€À xð߀00ðÿÿ€?ø<€<€yáÀpxü÷øøpp?ÿÀÀàóø~pà~ÿœÿ€ ÀàÀ``>ÿóÀ À@ÿóÀž<À<_àñáàppÿÿø øÿðð€ÿü€àø÷ü<0à>Àÿ~ àáÀ00`6|€À€?ÿÀxÿàãÀàþü>ÿÿøøÿð÷Àÿü8À?ü|0`ð€ `ÀÀpoøN?ü ÿø€?ÿÀÿ€üðãÀðÿ€þþþ÷€¸€p?ÿà'ÿ€xÀ?|x8oÿøÿÀÿàüpàÀ0>ÿ€ß>9ÿø€ÿÿ<Àÿà pÇ€àÿÀÿøÜw€8pð à€8à0oÿ8ÃÀÿà 8àÇ`p ÿÿ€ÿþð ÿþ<ÀÿðpÇðóàÏàÞs€¼ÿøà0 €À8à0gÁàààî`ðñçÀþð?ÿÀàððÏà€àŸ€Üs€øÿðÿÿøÇü0>àpa˜ÀÀà à|àðÁÁ€?ü p  ?ÿÀÀxðÞàð?Þó€øÿð?àÿÿøçü8>àpaÙ€Àà`à|À°ÁÁÀ 008?ÿÀ€xðüÀðàþã€øçÿüøwà8<``c™ÀÁÀ8`ÀÀ0€ð|À 0 üþù€üxàüÀøàwþã€xçÿÿÜwáp8à<àc˜àãÀp`ÀÀóøÀ >p üþü8þðàx€ÿààüã€xÇ€À a€àÀàðÀgpÿ€àààþÀ`Àüÿÿÿþÿÿp8ÿðà`ßÀàýÀpÇ€à‡àa€ààaÀ€f0àà ÀÀüÿÿþþ8ÿàÀ ÿ€ðÃÀà‡ÿ€8`þ8|€À~Àl0€À€À € <|ÿÀ€ÿðÀàÿ€ |þ0ð€<üà`?€À|?ü8?ð€€>ÿà8€??üøÀøü8ðàüÀ àðüÀpAŒ À€€8ÿÿðÃÀàÀáœÿàøÀŒÀpÀ0ÿÿøÀøÀãÀÿàÿÀÿà€üpÀÀ8ÿÿàøÇÀ0€ÀpàøàgÀãÀÿÀ àð€ž|ø x€ïÿàx<€`ßÿðxÿ€8À0À0÷€`pnxࣀðs ÀÀ€þøøàÏÿÿÿàü8€àÝþðqŽ@8ü?üÀ?àÎ^pÀà0wÿøðÀ??÷ÿ À?Àøÿxüð€ÿÿðü?€€pßûàqÎà0ðøÃÀøÏþ0ÁÀ`x 8@ðùàpÀÿøþpÿÀøàÀÞûàüÿðáÿÛûÀñÎÿÀàðÀøÀàpÁ€àppàxÀp?ÀqÀÿÀÀÿðÿðÿ€ðððž8 xþÿø`×ñÀñÎ|pÀÜ`Àà0Á€`à€ùàø~ðÏÿÀÀ€ÿÝðÿðÿààà€xpðàÿðàçáÀñÎ8`ðà€àpã€ÀÀÀÿ€Àø8ûþ¸ À0ÿÿðž<üÁs€ÿÿàçû Àø€ÿÿÀ<<ðŸ€ÿÀ¿ÿÀú?ðÀÀxpÀ™ÇüqÎ| ÀÀþpÿÀÿþðpÿ8 ϳÀàÿÿÀ<p€ÿÀÀÀ<óŸàþøøÿøÀÝÿ¾ñÎ~þÀàÇþ0€`ù߀8 ™à à€ÿ߀8xàÿ€ÿ€xÇÿÿøÿðÀœñÎçðþ?ü€À€ÀpÿÀÀ  s?€ÿÿ0ÿþÿÀÿÀÿÿü8xàà?øüÀ<üÿÀŸÀ?ÀÐÎpqÆÃÀþ?þ€ÀÀn0ÃÀ`0wàÿÿ€pÿþã›ÿà€ÿÿø0àÁÀÿàà?€xÿüƒÀ>ð¿ÿðqÎ?üÀ€€ÌpÀÀpÆøãÇ€àþÛÀ€ÿÿð8àÀàùÀÀ{À<üà~€òýÿøq΀€ÀÀÀ`0Àà` 1Ç<?ÁÁÀÀý€ ÇÏ à€ðÿó€;ÀÀã€c€88<Àü€ã¹œñÎ;ÀÀ€ÃpÀÀw0ÿÀƒÁ€?ÙÀÿÀÿðÇøÿÿþÀ<à€€8ñÀîÿàñÿÀÁÌ@ñÆ1?¾€Àþßÿ°ÁÀ`0>‡ðÀ8Œx ÿž àÿøÃ¼üÿÿü?xÀ€€88ûÀ€ÿøáÿ€ƒœàáŽ`?üÏ?þŸÿpç€À88p<ðÀ~Ã>@Àÿøáÿüx?øÀÀ<8¿À€Ãüà?€ÃŒxp €?ü€þÀ0ÿ€qøqü|þÀ ç£àÿà~`ÁÃÀàøðÿ€€8<88ÿÁ€ÿ<À†xpðÀ?ø€8Àð~ÀáøÏÿüüÀ  ÏÀÀÁÁÀÀ?üüÿÀ€<<üÿÿàÿÆ|8<8~øÀÿÿð€ðÃÿüÀ à‡ÃÀ?ø|ÿ€øðøøÿÀ<€x 8|ð€€`@€ÀÀ‡ÁÀÀ€øàøÀ€8ÀÀ€p€€?üÀ €€?þÀ€€0@€?øÿÀðÀÀ0€8`À0?À q€ €ÿàÿÀÿðààÀpÿàÀ0xÀó‡€À€ÿC€80ÀÀäü€@8þ?ÿÀ€ðÀ88àãÇ€€8ÀÀ7xx;àà~pc€à8þ8p€ ðÀ<pqÀÿþÏ?€{€ÿÀÀwæð;`ðü ãÿÀÿø8à€``ÀøøxÀ8àÿÿ±ÎÀàÆ#€÷€ÿÀÀ÷‡ð€ðøãÿþÿøøàààpÀ?øÿpÀ~à0yßà?àîðîã?þqÀÿÀÿà8€ÇŸ|`Áƒ`¿ÿÀàÿøÿ€ð€ÿyàÿø?ÿÿðàÎ8~Ãþ8`àÀw†0ÿþà<€Æ xàà?ÿÀÀÿ‡€>ãÀðÿàÿøü~çÿà8 >þ pà`†wÿð<ÿüÀ<¨<øà€8`Àÿ€ƒÀxáÀð|àÿðø?à88 ü`À`ÿÿÿ7ð<€À>þp˜`Ï€ÿÿàñààð<8Ü€8À808|?ÀðÁÀ`àÿàx€€7‡ùóøœ8`ÿ€€ÿÿàáÀàà8?ÿþ?ÿÿÀpÃ808ðÀÁ€pÀÿÀø€€7€€ùƒÃàœpp0ÿ8 €ÃÀðÀp?ÿþ?ÿÿ€pǸà0pØ0þ?þøxÃ`À@pØ€€cÀ3Ç€ÜÀ ÿÿøþ8€Ç€ðÁ€p8þ pÇ¿ð4pøü?þð8Ç`ÿàp€€` ÿÀã€ü€ÿÿøà0À‡àáÀ8<ÿüûàÇ?à<à?üÀ0Î`÷àÿ€€à8À`C€xp€pàÏàùÀ<þÿüó¾àÇ8<€À?<€0|À€àÿ€€À€pp1€8ppàþàùÀùÿüáøÀÎ8<à€0>`xÀÀp€ÀðÀ30 €€ppðüÀñàãÿ¼áðÆÏ8<ð808`0€À0€Àÿ€30 0áÀø`8€>|ðÀ`ÿàðÀ ïÀÀþþðü?€~ðøð€?ð€<€8`ÿàààÿ€Àøóðà€ÀðÀ€>þÀ€à€ÀãàÀàà€ÀàŸ€€À>Àð0à 0àÀøÿÿøÀ8`€0x8ø`Àüÿÿx€pÀÿÿ`À0 8€À8ü €x<øóÿ€€0pþŒà8`0p0àÀ8Ààÿ€w8€ü÷ÿÀxp 8æx¿àx0`>€0`p ÿÀðÈcÜ0€Àc€€Às¼`ÿÀîs‡à8vÿŸ gØÿð|0<`ÿ?à`€pàøü!€|8ÀpÀÀ<àç¹àÿ€ÎwÀ8þßÿ€8îàc`ÿà<à8ÀÿÿÀ`€0`àÜGÀàp~‡ÿpàÀÀ÷þàà>pààóÿÇÿŽì`8`xÿqÀÿð0À0ÿü@0`™`aƒ€ÁÀpà?€ÿøàð|À>ð÷ƒü€ÌàpÀü0Àááà €0ÀÀ `À0 8øÁƒ`ààÿ¼à8|À?ÿþ{‡€?ÿàÿ€à ?àL0``à3øÀ0ã¸À`À ÿÀ0€Á‡€€Ãpÿÿàÿ8à8x€óÿw8ÁàÿÀÀÀ1àÀ?ü€$ÿøÀ c€0 1ÿÀÀƒ‚@Ž`ùàsœà `<ø0€à{ç€ðøðÀ0`ÿÿü<Ð4ÀÐ#€0 1ÁÀð€ÀÎàç8àÀ|øp€÷ÿ8àðp€þ0pÿÿüp  (€ÿøðv`0ñ€xÁøøÀÿÿs¼àÀ<8€ÿÀÿÿàpð8ÿÿà0pðó<Àà8ðÿ€>`üñÁÀÃÿx€ÿÿç?à€~8ÿÀwÀø<ààpþÿà``àãÏ8ÿàcáïÀ<Àüñ€ fÆ?€ ÿÿsŸà€:€À ãÿ~àà8pààü°àÿÀ8?ð3ƒ€áŽà€øýÁÀ>Çù€ç¿Ð€p8ÀÀÏÿüÀ3ÀpÃð`ÏÀþóøà?8@c“€áü@Á€ <ƒðpsœ€8<üÀ€Çÿ€þ€àpÿø€0ÇÀÿÀqð`0à`xÿÀ€à<ç¸80xþÀ8Çûþ>`àÿð€þ`€Çà`ùÀ€àÿsœ<øßÀxÁðàÀÿ0€ðð€€ÿ€ÿÿçÿüðÿÀ`€Àü`üp€ÿÿÿ€qÿüàÀøø øÿáÿø ð€?€8à@À €08À€àðpÿþà€÷ÿÀ8ÀyüpAŒÀ À àø pÀ ðÀóÿ€ààÿðÿüáÜ0ÿÿÀ|‚€<püÿþ|¿a€À 8às€~>ðìwÿüçÿÀ8ÿÿÀ>ÿ€üxÿ8þààÿÿaÀÀ8às€~þpÎcà?Þ<oÿÀø>À>ÿ€ÿàþ8ÿxpÀÿcÀÿüàcÀøøCðÿÿ€þ?ð<þþàœ8?øpqÿø@þà c€À àãþ‡øøà8ÿÀÿàüÿÿ€ÿ€ÿüx`ÿþÿÿàà88üà ?ÿÿ€øápàøcÀ c€ãþÿþ€ÀÿÀÿ€ü÷ÿ€?÷À÷žÿÿðÿþÿÿà€p8áÀ?ÿÿ€áÃð øþfÀ o€cû€À<áÀ<Þ<ïÿÀ|áàÇüÿàŽüàÀ`à€üÿþÿððÿÿüþÿ`ÿücæþ„ÿÀ|xþ<ÿÿÀpààÿþ >¸àÀààÿÿþÿðÀ@ÿøoç€ð`À xgƀǀÿÿÀp?ÿüÏÿÀáÀàÿþ~ÿàÀÿÀ?ÿü€pðÀÿðÀ Àw쀀àààßü ÇÿãÀðþžÿà8ÿ€>ûÿðþðÀpÀ€÷þ|€€ààp`‡÷ÿÀáÀ8À?ÿ3€¼p<ñà<øÿø08`0ÿþ€;ƒÀÿà€ÿÿøàçÿàãÀp<<€?ÿw€¿œàxÀàpÀ8f?ø`0þî 3Àÿà€áð8àÿþoÿðç€xx<€<?€ÿœpp€pàÿø?ø<à?ÿð\à>€ÀÃð0Àÿþÿÿàïpðx€ÿ?€ÿœà `À„ÿøg00|À?ÿðÀô€?àð0àçþñÿÀðàð?ÿ€½œðüüp€€ïsÀc?øÿð|€8à  Àaðqðà‡ø÷ÿÀ|ààà<æÿ¸àþüà€Àïcƒàg?ðÃøü00À`ÿ€€€c°aðx>¸ïÀ<ÀøÀÎrpÿ¸àÿ€Ïààüw€q³À~w08ƒ8Î8pàpÿÀ08þ?€xpà~8q€ÿÏ€0€88Üîð¼pàÿ€ÿðücasÀ~p0Ç pàÿà?€~à`À>9ÀÿÿðøÎ?8½ôàùÿ?ð3€øÀw0ø~?ÿøÀà`ÀøÀ÷ÿðøþ8ÿïÀð|Àÿ?ð`pð0€ø?àóÁðø‡þÿÇÀ0ÿ À?À €ðø€pþ0€Àpà0€ ÿÿÀðþx0àÿþÿÀ€ÿÀÿ ?ÿ€C€8g0p0àÿþ€À`€à€<ß?ð?ÿÀ?€qÀ08w8<8€pÀ€`À`ÿÿøÀ?øð€<‡€?ðÿ>8€ÿÿ€ó€09÷ü€1€pÿ€À¸8`ðàÀðÀðÿÀx‡€€à>øÿ€ÿ8ÀÿÀóÃÀ8ÿþÀ€€ðÿðÿüøÀøðàøÿÀþß`àðçxÀ€?ÿÿ€ü¸pÿþ?ÿ€þw€ÿÿÀp?ÿü?€€?pÿðÿüà?Àð€Àó|}þ€àpà>ð‡€€ÿÿÀ?ÿÿÿðoÿüÀ?ÿÀÿÿÀ0ðÿÿ|ÿÀÿðÀ àÀp€Ãà Ãàxòð€€ÿÿÏÿÿðÿãà8€8Àp?ðþw|÷pÀÀ ~0à|€ €ð8}ÿ€þü00ððùÀùÀ?ðóÃð8ÀpðÀpÿð<ÿÿøÀÿüþ`À€ð>À€cð00ð8ðñàãÃÀ8pxƒà?ÿ€ïø<€ð`÷?ÿþàÀÿüø0À6 €>}ÿŸ€ç``ð<?àñàãÀÿøx€?ÿÀÿø?Àÿÿøp?ÿòÿàÀ€àÜ0À€ óøÿ€¿àã`0ð<8€áÀ‡ÀÿÿðÿÀ8€ÿðÿÿð`vpàÆ€À 0€3€ÃÀaÇàà`8ðð8€áç‡àÿÿøÿð8Àþø`ƒÿpîÀÿþ4À1€Ç€qÇÀpc8`x€ð0€ÿÿÀ8pðð?ÿ€8ð8xûÿÿøüÀ ÿüÿ<€`0€ÿ€pã ` x€Á€8€ÿÿžà>øàx?ÿÀ0àÿÿxøÿüü|ÀÿÝÌÿ€<À€`0 €pÀps€ 0<€Á€<€Áà¼À?ð€8?ÿ€pÀÿÿxØqüøøxÿÀ<``€àp€00qÇ=€àc€ 8<ÿ€>ÀÁàüÀ¿ð¸8¸€pžðxyüÀ8ÿ8À@<ðÀÀpÀ80ÿ?ƒàs€0€ÿ€<ð9Áàø€?ßàþx8p?¼àxüø€1À@8àã€àÿÀð0qÀc€üÀ€üÿ<øÁàð9ÿÆÿøÀ88øà8îñà€pÀ`€@?Àðx`À€óÿÀüÀÀøþ<øÁà@xÿŽïðü8ðà ÁûàáÁàø>øÿüãÿ€€<øá〠pûÎÿàü8<€?àðÇÿ?Ààpàÿàøøÿø ~?ÿÿÀáóþ€||?ü€€ÿÿÀàü€ÿÀÿÿÀÃãþøüÿÿž€`þÀþàð`àÿ€x€ÀàÀ €0Àà0 ÿÿøÀ €0ƒÀÿàž<80€ÿøÏ@À8ÀÇø@À0`ƒÿÿðÿÿÀ“9à0À`0ÏÀàÀ8?€Àà0 ?çø€à€ÿ0ðƒÿÿðÿÿÀ88ƒ8ð2À<`0ïàðà89Àààpç8Àð ‚þ0ð?ÿü8pø€7ÿüÀàÀx`0ÏààqÆ89Àðø€àç8àðƒþ0p‡€`pøÇwÿøÁ€Àþxgþ0#Ï<?ðàðqÇ89Àð?üÿàœðÀ <ç8ààñ€ø?þ`ÿáÀà?œÿÿpÁ€ÿ€àxgþ0ÿÏüÿøOÿ€óÏ8?€p?øÜðüÿÿþ?çø@Àã€?þÀÿÿÿÀÀüäð€àÁ€û€dðg0Ïüÿ¼ÿÀÇ8€€8ü?øæÿ8€€€ƒ€à€0ñÿà€Àfðg0ÏÏÿ€ÿÏx88|€ÿŽø€€ÿÿøÿÿððƒ€à8ðç0Ïã€qÇ8À8üÿð€ÿ€xïþüüÿÿð°à€pÿàðg8Ï<ç€óÏx‡À8pø~ÿÿþø€ÿü‡ÀþÀqÿàƒ€ð0üððç0Ïþàã€Ç8ÿÀ0p°ÿÿþßÿ€ÿÿþÿø8aÀ0ƒ€øø8xç0Ïü8áçðÿÏx}ÿpàð`< ƒ€>þÿÿÿüþøðc€pà00p8ðç0Ï 8ÿÿøÇ88ø1àü0<à<|<€¹€à<€À<7€0ÿð€ px€çþ0ÎðÿÿðóÏx3às€8þpxøðp1Àÿøpx>qÿà0à8xÇþ0ïðÁðqÇ8ð?€8~8x?çÿq€sÀ8øà3Àü0À`€€à8â8çÿðÀøçœð€80|÷ÿ€gã€ÿ€ó€¿¾9€ó€Ì?8àpà ð8Ÿ`8ÿÏþÀÁøÇ8 ðp8ü|ç~ïÿ;ÿž1“€ÿ€0À` €~ püà8Ç€À>ÁÞ?Ã<à08ü8 g8~ÿ>p8Ùà>Ãð8ÿð ÀüàðÿøÏxƒŽ{À8€8xüðæpüü8088Àøüð0ÿðÀ€àx#Ç0LJ€}à<ÿðàçøøðÿü?ø`àp`8à0`Àñáøÿàçð~ÿø ð0Þø``øÿ€ f0ÿ€¼ð@ðûÀp 8`À€ppÀìø8€À 8p8øÿÿÿàþà`À<>ð8€8Àòp8< pà0@€ØÿþÀ`þÿàðÀ?€þp<à69€ààÿx¿ü` ?øÀpàpÀŒ€`ÿÿðøŽ`à0`ÿ€ÿpà÷8À9àƒÀÀ??ÿø?øà0| ø€aÀ8p àÿÿðð àÀ€pÁÀøÎà àïtÀœà€ÿÿø>€?ÿøðp¾àxð€aÀÌŽþ€Àpÿ€†p`Aà0Çàüp àà~gx»Àÿÿðÿ€xýàÿÿøà8|ÿàÙà3c€0ÀüøÿìÿþýþÀ?Î àÀÀàpÌ`ðÀÀÀ|Îx?ÿþ€àðÿàx€ ýàÿÿ€ûžp€˜Î8ÏÀ€78ÿðpðx`À þà?Àð0áø0ÀààÎÿþ€Àùàð?ÿÀçà€0à8€~`€0à}ßüaÀ?7Çð`€pÀÀ0Üÿÿ¾ø€?üÃÿ€pÿà8|Àøü8ÿþ}¾0 àÀ?ààÿÀÀnÿÀçÿˆøÀ?üÁÿpÿÀ8€8Àøøÿþ€  àÀ <Ààÿ€ÀÀÿÿàÇÿÀðÿÿàpðxðÿÿþ|À`0?à>€àÿ` àÀÿ€à€ÀñàÀÀÿð`‡‡ÀÿÿÀpà8ðÿÿþ~<€`8p yø&€ àÿ`þÿÀÁÀÀ€ÀÀàÀÀ³‡À1ÀaÀ8ðûüpn?ü 8€`0àðÀ> À8 8ÿþa‡@üÿÀÀ€€À€`àÀü;ÿÀ9ÀcÀ8ðøpN?ü 8€ `0ààÀ?ŒÀ8 8ÿþwÿ` ÀÀÀ€ÀpàÀþ€ÿ€yç€g€xðœðpà x9Àÿÿ€†À` pÜÌÿ`ÀÀ>À€Àx`ðÀ·9˜àyÿ€g€pø€ð8<ðàx€<ýø†À` àÀaÇp€ÀþÀ€À€ü`ðà³Øÿðqÿ€ðø€?À?üÀãÿxÿ€8àp À@ ÀÀ@ÿ8€Àþ€€ÃøÏà|xð±ØLÿðñþ~ð|€€?üÀãÿ€xÿàpàp À` €8À`ÿÀ~?ÿ€€ÿüÏÀ?ðø1Øn|ðÿàùÀ<à>÷À8xã¿ÀqÇðààp ÿøøÿÀpÀ`aÂ0ÀÀÿÀ€<ÿÀ3ì8ðÿðÿÀÀ?þçÿàxpãýÀqÿ`€àpÿø?øÿ€pààAÀ8ÀÀ?€€|3à8ðøÏÀü?ñü?üÁøp~ÿðüÀøàÿàÿø€0À9ðÿxÿððÀüüÀ0ÿððàÀÿàÿð9ðþÿð><<<àpÿà yàüÿð0 0À ÿ€8@À?œ€à>8|èÿÿð@ÿÿ€p~€8€À`àÀ<üÿÿ€ððÿðƒ€ÿÿÀ0:à€ààp0>ðp8ñãÀÌ€ÿÿ¿øÿðàx‡€Àp€0à?ÿàÀ``þppðÃÀŒÀÀÿÿßü€ð>ø>ƒ€À`8À8wð< À`~ü80ðÁàÀ‡àà€ß<€pÿ<€ùÀÿ``?ð0€ÿà0üøà0ðà€Àøüü|€ãœ8€ðþ8€ÿù€ÿÀÀüÀm_ÿÿÀc€àá€0àÀÀàøþøøã¼8ÿàÿá€8 €8ã€À8À?ø€Ïþà€€xaÀÀÀ8ðð?øÿpøóŸxÿðûÇÀ€€xáÀàÃÿÀ €À~€<€3ààÀxþð?€| ðÿ¿øæLJà>€áÁÀ`à‡þ€ø¿€À@x ?€ÀÀßÿþàÀøÿŸøÿÿ€à?ÿÿ€1€áÀàxà€xÿ?ÿÀà` >àà€ÿà€ðã¼8ÿÿÿ}ÿÿ󀃀à?çþc€À@ðÀÀÀüðÏÀøãÜ8þß~€ù€ƒ€`À<€€ñøq€ à`ààÀ?àpàÿ€ðã¼8àìC€à€pÀÃÀã À@€àÀÿàp}þøÿßüÿð N€a€Žàà`ÿàÀá€à` àààp9øøßüÿø€¹ÀÎàÀùŒpÿðÀÁÀàppààð#àø€ó¸8ùð €1ÀüÀ€óüÿ@€ÁÀÀüÿ€xÀ‡0pð|Àp¼Àp€ÀxÀ€óÿ€?‡ààÈÀ€ÿàà><ðÀ80ðà|€x<€à€ÿýÀp€€Ç€ðð0àø€g€‡àøÿÀððàüð ÿà€xàÀ€ÿýÀþàÃýÀÀÀ`|€q€ÿ xÿààð?ÿðüàÿàÿà<àø†ÀpðÁð þüpxÀ<?À`øÀÿàþÀüàüÿÿ À0ðÀüà<€€þøø?À8ÿÿÿÿÀp€ÿ8€ÿçÀþàþ ðø`€àìqÀÿà€àà àð  fÿ¿øqÀaÿàƒ~àøÀøxÿÿðÿü<îàÿÿøá€pÀûø ð €xà€`ü8Àÿÿøÿüÿ<€ÿÀðà8ã€`8€û€ð¶€€<`ÿÿðàø8àÀpp8;ÿxÀÿàpà0Ãÿðcp¾üÿà€àÿÀpðð<€ðÈpp8ÿppÀøpxd8€Çÿð sà?šþ Ìp€À €À0ppà?øÿÿ€ðßþpp8?ÿÿ`p`Àø8ÿ0gÿ8Æ`ÿø ãÀÈ8x 8€ü`gÎÁþÿpàÿüÿÿ€pÏþpp8?àì`ÿðÀp8ü`8Î`Î8À€Àxø€'þ0ÿÿÁþ?ÿpàÿøÀàpp8þ`ÿðÀ`8p`8Ì`À†8Ûÿ€€Àþ  €?†>ÿÿÀ~ÿpà¸Ààpp8þaÀÏà8``8ÜàÎ8ÿÿÿ àÀ8 €† >÷ßÀøsàà0øÀäpp8ÀÃÀÿà8à?sþ8 øà¹ÿø‹ü pˆó0 €~ÿþ€~ààüüÏþpp8ÿÿ€ã€ü`pÀÀcþ8 ð`ùŽ8þ8ˆ` €ð~ÿþ€ÿÀàü?þÏþpp8ÿÿ€wc€à àÀÀcŽ8À`9†8<¸à €ÿ€÷Þ€þ|à¼?üÁøpÿüðã`g€À€cŽ8À``1ÿøÿ8øðÀ €€ ÿþ€üðàœ8Àüpÿü>ç€pw€cŽ8Àð1ÿøÿpà@€€€ ÿþÀðààü8Àþpp>ï`? €ãŽ8Àð1އsƒà`8€€ÿþàp€àüxÀîpp6 þ`>Àcþ8À`1†çç``p€<€ø„ìðàüp<Áçppfø`>?Àãþ8À`1Žøöî <ààà<8øÿ€ç¿üà<àÿÿðpüþ>ðã8À`9†ø;v ~øÿàÀð8pÿÇÿ?þà8à8ÿÿpp<|Þø~cðà0Àà{„pw,8øàÿà`xï€Ãÿ€<ÿ€ÀøxÀ8ÀppüxÏ€á÷Àÿ˜àøÀ`ïðüC à€€xŸÀÀþÿ€ÿÀøð€x€ðpøáÇ€Çðþàð€àÇÿø8x?ÿ€€á€ÿÀøàøÿÿðpxáð``€`€?øxùÿ€À€Àðÿÿð`pÀàxð?€à€ €ü| ?ü@°x€ü À ÿðÿÿ<À€ÀÀÀðèað€?ÿðÀÿÿÀp†ÿÿ€°ûÈ@?ðÀ€?ÿÀn0Üÿà€@`üÀ‡‡€øÇÿÿÀ¼ÿÿð?øÁà<ñÀÿøÿ€îÀÿüü?à ƒƒÿùÏÃÏÿÿÀþ¼¿ÿà;ðÿÿà8áÀ?ÿðÿ€ÄÀ<Àüàà<ÿÀÀÿ€ƒþñïãÏÀ€ñãÀþŸ»ÿà;ðÀ?ÿÀ?wÀÿÿðÿüÀþÿw¸ó€€áÀ?€x€ÁÎÇœ€àãáÀþ>ÿ€€·÷€;ðÿÀ?ÿÀøÿÿÿÇ1€ÿÿà8Ààßo †>àð8€ÿ€ÁÏÇÿàðAàÀÿÿ€€·ó€c;°ÿŽ8aÀðáÀÿ瀡àÀà8pÀ€p€ø`ü€þ™Îÿàâ<àxÿÿÿ>ïã€w¿öp?ÿÀ?Àp?ÿà0p€ãpÿð€o€ à`œ€?ÿǾ?çà<àpÀü€ãáà?ÿÿ0œp?ÿÀÀ0pcü‚c€xÀ`ðp€?ÿÎ=€?àðàà À8€óÇð?ÿÿð<;ÿð?€À pàÿøÿgð`€8A€?ø`>€ùÇÿààðàÿÿÀ€»ÿüÀþ~¼ðŽ À?ÿàÿÿw˜ÿðÀÿÀ<`À€øáÎÇÿÀàààÿ€ýÀ8»ÿ|¿øÿø|ÿð€ÿà܆~8ÿð€8a€0ð àà€ÿ€ ùçç¾ààÿààà8œp?øÇÀüÇÿð€00‡>ÀñÀàÀx€‡À?ÿüùÎÇ=ÀààÁàÁÀp¼à8pØÎ>pÿø0†<8@ €@?ÿ€0À €<€€?ÿøýççÿàpð€ðàðpÿÿð?øœw8pú<‡øÀ qÀÏŽ€À™ÏÇÿÀpààÀààûÿà8?ðîÇxàáð80Ž<8åp€p8a€œü€<€=Áçãž<ðøpàpဓœx88s wÿÿüàø†>`0Àÿ€ÿÄÀüàsƒÎÇ<à8À<àùàþq€À‡¹Àx?ðÀÿð€ð8|þ 8àp€xÿ<áŒà9ðà81ÀÇçÿð8pðÿàü=ÀÁÿ€Çœð?ø`ƒÀ€8ø€¼ãðp8sðpðà<ŽÇÿàpàøŸÀ?ð?€ÿ€Ž8ð88pàÀ€ˆøp8qðà>ðàø`pp8À àx€~ÿðð0ðÀ`ÿð x€>?ÿðp@#ÿ€x€ÿÀ?Î0€ÿü<ÀøÀÿþ<ÀƒÀÀð `ç¿€ÿ€~Ãÿà@€0xà€ ø‡€€€<ÿÿÀ áŸÀ`À0~|øà€ƒ `þø‡‡ÿsÀà€ÿàs€€8À8ÿÿ€0à0ÿþüÀ`ÿ€ÀÿÁ€0÷€?øƒÁÿüsÇà€yñàs€ÏÀ€<|ÿÿÀ€8ø0ÿø<ÿðÿàÿÀÀ€àqÀû€À8øþsÿ€ðÀñðàs€ÏÀ€8þÀøø0ÿðæ8ÿðàÀ†pÀ8`ÀÃÀø?üqÿ€øÀ`ð`?Ãþ€ÿüüð?ð0ñÀ†ÿ`0pÀÿÿ8p``À0ÿû€sø?ø€ð>ãÿ€ÿøðp`€À0á€?€ ð`808Ï3ÿ`À` À0ÿÇÀqÀÀàðÿ〞Î8Àxó€ð8ÿÀ à0ÿ€ ÁÀp À0ÇÀóÁðððÿ€þŽ8À|ÿÿÿñÀð?〠ð0` ø/€Á€pÀ`ÀÿÿðøðøÀü9ÿøüÿÿü8à0À 8p0àÀ€ÃpÀÿÿÿððàø€ðûÿøÜ0à à <0p`À0€Œ0‡`€üÿ€{Ç€ðÜ€€ùÎ8ç0ð àpp!€`aŸüàÎ`ÀüsÇÀ<àsŽxæ8pà8 <à pc€0À ˜ÀÜÀ€ð ùÇð<ð 9ÿøÇþ808  À ð70Àa˜ ÀxÀÀp8óÏà8à8sÿø Çþp`  8<€à>`€c˜Àp€€ðáÏðð€09Î8?Çppþp8`àÀa˜ àpÃþ`üà€psŽxÿ€Æààþ€à<àà€ã¸ ààð‡þÿðÀ89Ïøÿà÷çàŸ€üÀÿ€ÀàÿŸüðpøÿ€øÀ?ü{Žðà~ÏÀ?€ø€ÿ€Àþÿ¿üðøø¿ÀüÀþÿÆþÿ`Óàƒ€ü€€a˜ pðàÿ€øÀüÏÿüüÿÀð @ðø?ÀøÁÿüÿÀ€pþð€ðx` pÿÿáœÀð0€?ÿþ ÿÿà ÿÿ€ÀÀaÌÀpÐàÿ€à?ÿþüþpqœÀÿ€ðÃ[°ÿð8  üð€ÿ€€ÿð<?þ|ÿ€ø=ÌÀ€pg¸?ÿü ùà€8À<Ð8ŽxüÇ€Æø˜ÿæø àÀ÷ûàÿÀüüàüÀï€ð9ã΀ðüÃÀÿç89ÍÌÿã?øðÀýÍàÀp€ü?ÿÀÿÀÿÿ€à?ÿü;ÿ΀À`8ƒ€ ày±˜  À ùùðÀÏÿðÀÿ<ÿàÿÀÀýÇ€;ÿü8>ƒ€üàp8€À àùÌ áÿøp‡øÿ€ï€x?ÿÏ€l  ?Àøfüø ü`<ðüÃðÇàñÀ8àp8<à8ÿÿüø|…‡ÿ8n8|9þþüùÿÿàƒààÿ€8ÿð8xÀþÿÿàø|ÿÿþl`<ÿ€þ€|ÿßÀÿ€€@€8ÿð?ÿÿÀ 8@‡À x¿À>8àp?ÿþ€ÿøþà €ÿø@@?ð@„ ÿø ÇþÀÿœ8€08?àÀqÆÀÃ8 ÿÇ`‡€à8àเþeà~€~À?ààqÇ @ÿøß€ÿ€ÿ›€ÿÿ€àxàÀc€`àü€üÿðæÀÿ à à8àÇü@ðÿøÿ€€àà€€ÿÿ€àÿþ<ÿààwà`øpwüÀpÂ?àã€ÿþ`Ì`1ü`Æ ÀüÃ8s€p?àÿ€à€ðÿþ;ÿà|ààøüfÿøÀ `Æ=ÀþÀÿþàÿÌâðpaÆ€øÿðpôÀà€ÿðÿüÎ||p`øþvþðÀÿ`~ÀþÁÀ à gÿðp Çü€Ã8ÿÿø€ÿÿ€ÿàüxààÀümüàL<à|ƒÀÏþÿÀð`† ‚0 pÿð€ÿÿ€?ÿßÿüùðxpà€Àuüp `Áà ÿ?˜~ð `Ç Ã0 ÿÿ€<ÿøÿÿüãðppÃÿ€€høxü>à8ƒÀ>ð&`°`Æ ƒ00ÿà€ 8 ÿüÿÿüÀxxpÁÿ€€àvxþ œ8ààÀpÃà ;†À€ ÿð0 pæÎßÿà0 ðÀ8ÿü<À|x8À>áð3ÿ€à 3àÿøøpãà 9Ç`?ßøÿà?ÿþ3ÿæÏÿ~x8€ ?àÿÿ€p8ÀpppÀ ÿàsï€?øþcÀÆ?üàÿà pæÀø0 p8Àað8?ÿ?øÿÀ`Ç80À88À?€3€><L€†<øà pw`88 0f@ÏÿØà8ÿüaá€àqÿø€ppÀ |sà>ø ðÞÀ ÀvÀw†p0 wÿîÀßÿ˜€8þ0üà8`?ÿÿ€yÿø€pðø?ÿþðþ7 ð‡€À €7`?Ãp8 3ü`ÀðŒ?ÿÿ€0ðÿÿüà?ÿÿ€ñàxpàøwüÀ þv` 8æÀÀ àqƒàÿ€0 p<xÁØ?803€`àÿÿüpÿÿ€ñà8pñÿ¸23€ÏŽθ8 8Îà〠þ1Áàÿð8 0wÿÁ3¸8€0à`ÿÿüàpáÀxàãÿ€pw8?œÏð8pÜ8àç 8ÿqƒðø0 pãÎþÇcàÿ8``À¿žà<qà8˜àãà0óžüÏðÜ pü `ÿ 0g€1ÇÿÏ8 1ÁæÆø?à>0`0Àüà?€ñÀx üÀãÿÀqÇ9øÿðÈ Àðü?ãž>þ3ÿüsþÀð>`Àp?øààqÿøü€áüÿ€qÃŽàÿ¿àÀ À >À0ü83ÿü0À0|€aÀ0?ðàÀñÿøÀpÿ€q€Ï?À€8qà àÀÁ€0Àà0àx?0€€8€ÀC€0à€ à€Çp`@fpÀ€œà€|ÀÀ€<þàþ{øÿàÿþøÿÎpÀ<À€€ÀÀ €ø ?üƒþÀpþðÁàx0œ àÀÿÿ€€Àà?ÀÏþàøx‡à0 À¾^086?ø ÿüÀð€àðƒ€pÏþø>? ðƒp0 Àÿÿ8à øüü@`Á€àð~s€p€ƒŽxxÀü`pþÜÀÿÀ8>mÀÿüþ``ÀÀýüÁ€`ðÿû€xÀûÎ<÷æ£þ `àÿàÿÀíþ~À?ü øãp€€üÁ€àÀàÿÿøp€ûÜ8Çÿó ÀÀàÀp\(ððüÿç€< °À`Á€àààÿÿüpûÜÿó¾ àüàÜ0øðÿç€<ÀÀ`Á€€ààÿÿüÿ8ÃÜÿþq†‡üààÿÿÿÝðŒ`>Ïà|€ãàüÁ€ààÿ÷¼ÿÃ߀ÿþq΃œ€Àÿ 8üÿÿþ `0œüÎÿ€`Á€à€àÿãœãŽÃÿÀ<À.þÿÿà€þýÿüÀÿð À<~<Î|`ÀÁ€àÀÀ<ÿãœÃŽçÿÀ|Àÿÿÿà‚œÿÀÿð À<îÎpÿÿàÁ€âÀÁ<ÿãœÃçc€üÀqLJ€ƒŽ0ÿàp €| nð÷€çàÀ8ÿ㜇çw€ÜÀsÏÇ€á€ÿø¼ðÿà=ð €íÿð~°c€þàñ€ 8ÿç‡Ç?œÀþÏÿÀñ€Âxþð€àÿð€Ìÿð<0aœ ~àñÀ<8ÿç<Î>Àï?ŸÿÀñ€€0Œ`pÀp Œp €`ð`|ÀñÀøxßç8Î>ÀqÇ>;ù€À€0Œ``À¿ð ` à`àp|Àð|ÿî8œ>ÀqÎ7ó€€€€0Œ`p€ÿñ8ü 8`ü`pp€ 8ÀÀþÿî8þÜ~Àqþ〠€ƒ€€8Œ`p€!pþp`8<ÿaüpÀƒÀ?ÿÜ8ü¸ÿÀñ¾À ?‡€ÿðüpà€€à|çà0ÿoŸpÀÏ€?Ç€ÿýø8ûçÀÀ?ø€{÷üÿÿøüðÿ€À9ÃÀüà0`ÿ€<‡€ÿ{ð0ÿ‡ÀÀqÿÿg?ðþ0ˆàà~ÿ€€ðÀ0`ÿ~€ð1ð†ÀÀ0?ÿ`€3à><€à€ €þ1„ðqÏ>`8ç€À€€80ÀààøÀüÀ €ðpà€€€ÿàøà@€üà ÿÿð8ðÀÀà¿ü€?Àÿÿ0ï°àÀÿ<ðç†?op΀?ÿüÀç8ãðÀðàÿpàáÇ€0€~€8àÆŽwÇàpÇÀ‡€ ~ ÿÿøáàÀpà€ÿÀ p~áÀÿçÀLJðÿ€ÀàÃðÿ ÿÿø?ïð€àÀàÀp ?Á€ü‚À‡Àÿ>€Àðþøïÿ¸=ÿþàÀ<øÿàŸÿp€ÁÀøÀÿÀþüÀxü€Àà€øüüþþƒ€ À8þÀøœÿÿøð?€ïààðx8 |>ƒ€àŒÿÿø€?ÿÿàÀ€ ?Ìð8ÿÿà€€ü À€0€à|àÿà€ÿ8ÀÀ€xÿ€üxÿ¿ÿà¸ÿ8À8ÀÀðýÀx‡ÿ€þ>|àŸ€€?üøöÀ2Àðÿðÿÿð?çÿðüÀ~œÀüp€Àø8pp€œÏ/ÿç8Üx0çÿÿð?÷ÿàþà|œð€àüp<€Àppx†¸þÿø?ÿÿç80ü<p¿ÿð<çøÿþüà8»ÿðÀáþ8p8€ÿ€8àÿÿðxÿø€À~øà`7¿ÿà8çüÿþÿàOÿà³ÿàÿ€áÿppxÿÀ 0à8pà<~À|`8€8¿óÀ8çÿžp÷€ÿàà øÀà0€xa€ a€`ÀxÈ@0€0ÿãÀ?ïþçŽpÇyàçÿø~pÀÁÀ1ÀÀxa€ã€Î€?ÀøÏü30`§áà?çþ‡sÿœyÀ¿ÿü÷pÀ¿à?ÀÀøÿ€àÿþÿóÀ˜Ïüÿ€0`£Ãð?ïžsÿœÿÀ¿ÿðÀü<€ÿÀ?€ÀøŸÿ€À þ€ ÿñ€˜‚ÿ˜0?À@»ÿü8ç€sÇœÏÿÀœç€þü€ü|Àøœa€ÿÿþ¸Àœ?8±Œ0øà@»ÿ|8î€ó‡ÎqÀÏø€Ïð€?ððøœa€ÿÿü ?øÆ˜;000àp`œx=ï<€s‡ÎyàŸŸø€€ |àÀxŸÿ€‡ €ÿÿøðô0€0`¼ð?ïþ xó‡8ßÿÀŸ?ðàqÀ€x€8Ÿû€ ÿàøàö0ppÿÿð?ÿþpsÿÏÿàüÀ€?æ€<€>œa€Ž ÿÿ9Àà³0p<ûÿà9þàãÿ8œqÀÿÿÀvÆ€<€?˜c€ü ÿþ18ð3`à? ³¼àsÿÎ9à›ÿàbãÿ€À?ðœ€?€ €1Á€0ü0`Àc€‡¹À<€<ã†ÜÀ€8ÀÁÿÀ¾1ü˜oÀá€p?€0àÀ‡œð<8pðþ7À€àÀ|ÿÀüÀüàñð?ÃÀÿÀ`8€8À?ƒŽ8ðð> à<ðü#à€888ÿà€~ÿÀðÇðÿÀÀðñÿþÿ€€ 0€Žpüp?ÿðŸÿü8?ð`ü ÿÀ?0p?þ>ˆøp<àø ÿÀ?ÿø ÀÇü€x 8ÿÀüp1ÿà<<óÿ?ÿ€ €0<ùÿ€ ``€8@?øÀpÿþ§€<|8s‡àã€øÀÿŸøðïÿppÿmŒ?߀àÿóžx|À8€8À pÿ€8€ÁÀpÀç€à€ ?ÿðÏÀaã€<ýŒpø83‡3ÿø~?ñÀ8€øÇþ8ÿÿ€8€ÁÀpÀÇà>ÿ?ÿðÿðŽqÀÀ€8€ƒpÁ€ àÌ€`à0ÿÿÀÀLÝŒÀÿûûÏ8ï<ñÀ8€ÿÀÇ8<?€8€ÇpðÀÿÿ€àü€pÀ8Œà mÌà ÿûsÿøî?ó€<€ûÿÀÇþ0?þs€8àÎ`øÀÿÿà|ÿðÀ8¼àÀ ÝÌ @ÿÀ À1ƒ;ÿø?ñÀ<€ûáÀÇþ8þþ!€8àîàøà?Ààÿ€?ÿðÀ8ü øÀ ÌÌ ÿÿà ?à1ƒ{ÿø~?ñÀ8qÀ<ð;ÀÇ8áÿ΀8ã¿€xÀÀà÷pàŽpÇà xŸ€  0€áƒ{Îø?ñÀøŽpÇÀÞþ þÁŸ{Ïø?ñÀ<ø;ÀÇþ8ÿ€8Ãù€ÁÀ‡€øÿpÀÿÀü |þŸÿŽø8sÀðÆÀ€À<à8ààÿÿ€ÀF€ƒÿðÆàÿÿÀ<ü|ÀàÿüÀàûÿ€üü~ðàÿøÀàáÀ<øàÀ ð€ÿÁ€?þ<ÿðÿçþð<ø€öðÿÿðÀ¸ÀÁÁ€9ü?øø ;¼n€À8d88ÿÏþà<?ü€ã?pÿÿðÇ9ÀƒÁ€1üs?ðó|À`p p?ÿüïà}Ï€Á€ÿ0ÀàpsßîñÿÀÀ1ÌÀÀàÃÿÿðáð€`wÿøþÀó‡€Àø8ÁÀ`ÿÿþãÿÀÀċàà†ÿÿàÏðÀ>ÀxàÿÀダ?ààpÁÀpÀãÀÀ3Ìð ÿ€yÀ&?ÿñÿà8þÀ‡€ÿàðà>Áà`ÿÀÆ€Àw˜ à îü€Fÿøÿð8ŸÿÀÀ‡À?þÿþà~ÁøpÿàœÀÀ?¼  €8çÀ8€xÀøð?€ÿÿÀÀ‡À8<ÿßÀÀÀáž0àþÀàœ €  €yáø0€xçøÿðàÿÿÀÀÀ`p€ÁÀÃpÿÀüaÀÀ88 8Ïð`?þ¸ÿðÿðýÿÀÀÀ`€Àç°ÿàÆpÀà8 0Ž<`ü€à8ààpÿ¿ÀÀ<€8ùà€Îð÷ÀÀ1ÀÀ` àó€`ÿü€8æ8À8ÿÀ฀8ÿðÀì°ÿàØÀàà|àãÀ0ð€ÿ8ÿð€xÿ?ÀàððàÀÀpÀØ€ÀÀþÿ€€€0?þ8ÿø|xßÿÀððà€à?àà0ÌÌÀàÿ€àÿð€à9øðþðÿÀø|ÀÀàðÀpŒœÌ€ð0€ àÿàø8ç8àxÿðqÀøÀ€àqøà0†ÇÀ€øüÀü`à€?ÿ€8àpÿàóÀ?ðà¸ÀðqÏÇÀ?ðø>08ÿøÀwÀÀÿà€àðxÿÃÀyÿð?g€àÀà`ÿ€€ 8ðp !€@0@ `ÿ€Ç ð€``8øá€88àÿÿ€ÿÿàì0€ðŽpÿøÿÿÀüÀ€ðÁÂçp08ð0à?üð?€`áÀ€þ`ð0ýðÀÿÿ€À8áÀC°ÈÆàÀà8à?ÿðÿ€|>øÿ€pÿàÀþÿü0àááÀà`ÀàoÀÁž¿þc``ßÀà?ÿàÿð<ÀøpçÀ8<ÿüüpàÁÁ€Àøÿ€8ào€‡?üÆ0À?àÿ?€xç<ÿð`AàÀàœÀãÿüàsàÌ3à1€`8ÿ€ÿàÿÀÿààÇÿðpoþðÿðÀÀá€å€`À?üþã€?ÃÀá€ÿà?Àÿ€8Àÿÿà`~ðçÀpÀøÀøã€l €ðþ3˜ÇãÀƒÀÀ|ÿàÀ|xÀø8€`>Àø<áÀpÀü`øÿ€l ðü3˜ÆàÀàxñà8 ãðÀÇÿÀ`|ýÀø1ðÀÿðÀ 0Á€ ø €`~?øÆpàÀpÿàxÿøÀÇÿÀ`~ðàð€øÿðÀ3 € ÜÀa€3œÆpàÀð?ÿàþ>ÿðÀ÷ÿÀ`çÀàyÿÀpÀ x?ဠpΟÿÀ;øÆpÀÀÿø3þÀÿþÿÀÿÿÀ`Ãüàçÿà€pÀ ø?á€3ÿøŽÿ?øþpàÀ|À0çðøÀÿ¿À`þà€8üÿðÀ pá€p€Žf‹Æà<Àü€ŸàÇÀ>pÀßÿÀ`ÿþà?üþÿðÀ 0áÀ𠀎gÿ€ÿÿ€ÀpÀ<ÀÜ€?Ÿü€pàÇÿÀ`ÿèÀžßÿüæ`À0a€p œc€ÇàÿþlÀ8ÀŸþ?€`à ý€`sÀÀ!þ‡æÀ880áÀp ˜a€|p€Æ`|À0ðóž|;€`ð À9À`ÀÀø€ÆÀsð?áÀp àà€ÇpLøÀ`€ž€ðqpø|ÃÿÀ`À€ð€Îðqð8áÀp üÁà€;Á€‡p àÀà€žÿø`<øÃÿÀpÀ€à€†ðà AÀ<øx‡à0ÿÿ€‚0àßÿø8€øà0pÀà€ÀÀ‡‡€øÀ?ÿÿÿð?ÿ€pÿàðüÀàïÿø0ÿàÿÀÿ€À0ÿà`àpøÀÏÿø ÿàüÿÀÿ€€0ø@€`à€80p `0 À8€€ ÿÿ pÀà80?ÿÿàÿÿÀÿÿàÿøã€€þÿà` ?àÿð ?ÿÿ0à`Ààÿÿà?ÿøãüçn?„Àà0àÿø?8p8ÿÿÀüp ƒ€c€þ:ÿ€Cààx€þ~8Îpì8ÿÿÀþpùÿ€‡Ç€8À?>Çà?ð<€ÿà€ÿ¿à0ÿÿÿç?ðp þÀw€ðüÿÀÆgÿÀ€ÿþ0 ìpÿà8Oÿð€ÿÿàÿø;ÿÎðàü8?öÿ8c€€ÀÿÿüÎÿþ`Èø`?ÿŒ?Î8€þ?ðñàðÀÀ'x`àüÿ€ï Ïðÿðð`?ü~8~8€þpàÀ8 €€€1àþøáÀÀýÿ€ÿÀÚ€ ÿð?ÿàà`<8€÷à€8=îÃà?€ƒ€`Ç€À8 88€Àpð>x€9<ð€ÿç÷à>ÿüÀ`€ÿÿÀÿÀ˜€ÿÿ0€`à?\0ð€ppà8?Žpÿø†àÀáÀ€8°ÿþ `0€Àà>|8ð€8?ðÇ|à‡Æ`ðààÿÀÀð€`0€`Àð1À€ÿÿà8Îð€ÿøÜÀ€`ÿ€ÿ€80à  @`€Ààà?œÀ€ÿøðÇ€Àø€ÿüüÀ€pþó€Àð€`pp€À`ÀÀ??€8€x{à88n€À08ð€àáóÀ881ð €pÀ€ÿàÀx€~?ð8ÿ÷ð<à€ÿü0àñààœœyü€€ €àÀ?p€àÀÿàà;ÿÿÿüàÀÿøÀ À÷Às œ÷ÿ€0>þ€€|Ààðç¼àà‡?þpÿà‡àÀàsÎp€ü€?ÀÿàüàÃ|ð€8pÿàÿà ÿÀãÿ„8ÀÿÿðÀðüÁøxÿÿ8ÿ€ÿàÿÀ`ÿ0€ÿÿð€àðà8?ÿÿÿ€À€iaxmodem-1.2.0/lib/spandsp/test-data/itu/fax/itu6.pbm0000644000175000017500000175231511150047204021735 0ustar julienjulienP4 1728 2376 €?üàÿ?ñÿÇÿÁü?ÿãýÿ÷ð~ñü?ðÿ‡Àøÿãÿø?ÃÀ|þ}ýü?ùÿçÿ€øþ?ÿûÿÿÿùÿÏÁûþùÿçàüÿ¿çýüÿãð|ÿýüûÿïÿ€üþ?ÿÿÿÿÿóÿÏá÷þÿûÿçàüü?¿ïýùÿóðxþ}øøÿóÿÿÀþ|¿ÿÿçããð÷Þø{áóðü~?|ï¼ùðùü8>xøøpÿãÿ€ü>||?ŸŸçÃãøçŽà?Áóñøþ?|ï¼óàùüx?ðøð0ñöÀü?||oîƒçÁóüwæàÀûùü~??oüûà|þ8àøøÿãð€ø?üïðïóüçðÿÿ€àÀûûøÿ?ðóà}ÿ8Àøðÿñø€ø|÷üƒïÀûÿóüÿÿÀàÀûÿüÿçøûà|ÿ¸Àxøûÿðø|ãüïó¿áþÿÿÀàÀûÿøÿÿóü÷À}ÏøÀøðùÿøø|ðþƒïûŸðÿÿÿ€àÀûÿüÿøþûà|çøàxøñÿð>ø||~ïóæàÁóÿ|ÿÿqü~óàùÃøðøøàÿð~ø||?ƒçÁó‡÷ð?áû¿|wÏpþ>ùðüáøøxøÀ?àüü>~<|ƒçÃãƒïø{ãóž|÷ßyÿ>ùñùàø<üøøÀàø~~?üÿþƒóÿãÁ÷ÿÿùÿãÞüûß¿ÿÿüÿñðx|þüüŒÃñÀ?ü?øÿÿü?ÇñÿÇÀçþàÿÇüÿû¿¿ÿýüãðxøÿýü?þÃÿàøøÿüÇøÿ‡Àgü?ÀƒìþùŸ?Ïùü?Áø8üþüüþÿ‡ÿÀøàð €<pÿÿÿÀþÿýüÿÀÿüøÿ€??ðþsÿàÿÿàÿÿðÿÿðÀƒ ÿ÷øþ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿãð?ÿÿÿÿÿÿÿÿÿú~~ð€çÿà07ÿÁÿÿÿÿÿ÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿøÿÿýÿÿÿÿÿÿÿÿÿÿãÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø?ÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø?ÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿãøàxÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŸüaãíÿó˜xpÀx~ÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûØÀpÀx~ÿÿøÿ³ïûÿÿÃÏÿ?ÿøÁ@ø€pÀx>ûãø€àøÀpÀxÿÿøàø€pÀx?ûÿð€àxÀpÀàx?ûÿààð€pÀðxûÿààxÀpÀþxñÿ€àð€ðÀþxp€àxÀpÀþxàð€pÀ>x ø€àxÀpÀþÿüxàð€pÀ>þÿüx€àxÀpÀÿÿþxàð€pÀ<~þÿþø€àxÀpÀüþÏÿxàð€pÀ>ÿþþÏžx€àxÀp ÀÿÿÏÿxÀàðÀpÀÿþßþà€àøÀp Àþÿüÿþààð€pÀýÿÿüÿà€àø€p ÀýÿÿøÿÀàð€pÀóÿxÿ€€àøÀpÀÿ€ÿ€àð€pÀÿ€ÿÀÿ€àøÀpÀÿÿÀÿÀàø€pÀÿàÿÀàøÀpÀÿàÿààx€pÀ?ÿàÿààx€pÀÿð÷ààð€pÀpŸÿðãà€àø€p ÀûÏÿðãà€àð €pÀÿïÿðãà€àø€pÀÿçÿðãààð€pÀÿçÿðãààð€pÀÿÇÿàãààð€pÀÿƒÿÀãààð€pÀþÿÀÿààø€pÀþÿÿààð€pÀÿ|ÿààð€p ÀÿxÿÀàð€pÀÿ€øÿ€àø€pÀ?ÿ€xþàð€pÀÿÀxàø€pÀÿÿÀxàð€pÀÿÿÀxàð€pÀÿÿ€xàð€pÀÿÿ€øàðÀpÀÿÿ€xàð€`À?ßÿÿxàøÀp ÀÿÏþxàð€`Àÿÿ‡üøàðÀp Àÿÿàxàð€`ÀÿþøàðÀp Àÿþxàð€pÀÿüøàðÀpÀÿüxàð€pÀÿüøàðÀp Àÿþxàð€pÀÿÿøàðÀp Àÿÿ€xàð €pÀÿÿ€øàðÀp ÀÿÿÀxàð€pÀÿÿÀxàðÀp Àÿÿàxàð€pÀ?ÿÿÀxàð€p ÀßÿÀxÀàð€pÀÿŸÿÀxÿààð€pÀÿÿÀxÿààð€pÀüÿ€xÿðàð€p Àüÿ€xùààð€pÀþþxðààp€pÀÿüxðàð€pÀ?ÿxðàð€p À?ÿx÷ðàð€p ÀþxÿðàpÀp Àÿþxÿðàp€pÀ{ƒþüxÿñàp€p ÀÇüüxÿ÷ðàp€p ÀÏùþxÿÿøàð€pÀÏñþxÿïüàp€p À?¿ãÿxÏüàð€pÀ??Áÿxüàp€pÀ€Îxüàð€pÀ?ÿxþàð€p À?¼xüàð€pÀØþxþàð€p ÀÀÿ€xüàð€pÀÀÿ€x¼àð€pÀ?€ÿÀx8àð€pÀ>ÿÀxàð€pÀ~ÃÀxàð€pÀþ‡ÀxàðÀpÀüÃÀxÀð€pÀø‡ÀøàðÀp ÀøÃÀxÀð€pÀüƒÀøàð€pÀÿ€ƒÀxàð€pÀ?ÿÀ‡ÀøàðÀpÀÿàÇÀxàð€`Àÿÿàÿ€øàð€p Àÿÿðÿ€xàð€pÏçÿÿàÿxàð€p ßÿÿÿðþxàð€pÿÿïÿàxàð€p ÿÿçÿðxàð€pÿÿ‡ÿàxàð€pÿÿ‡ÿàxàð€pÿÿÿÀxàðÀpÿÿÿÀxàð€`ÿþþxàð€0ÿþxàð€pÿþxàð€pÿþxÀð€pÿüxàð€p ÿøxàð€p÷àxàð€pøxàð€pøxàð€pøxàð€pðxÀàð€pàx>ðàð€pýÀx>øàð€pÿÀx~?øàð€ ÿÀxü?øàð€ÿÀxü?øàð€0ÿÀxø>øàð€pÿÀxø>øàð€€yq~áÿÿÿÿÿÿÿÿãýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøø>øàü缇ùÿóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿü€ü0ÇÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÇÿÿÿÿïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿ>øÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿ>øÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÇÿÿÿÿÇÿÿÿߨ@€@€?À‚à`ßÀ?ÿÀ€ ÿ÷ú& xøÿ¾øÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþüÀ @?ÿÿÿÿÿÿÿÿçÁâž pÿÀxÿ¾øÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿãý`€øÀ€pÿÿÀøÿ¿øàðÀpÿÿÀxÿ¿øÀð€pÿÿÀxÿŸøàð€p ùÿÀx?ðÀð€pð1Àøààð€p àÀx€Àð€p?À€øàð€p€ÀxÀð€ðÿÀøàð€pþÀxÀð€püÀøàð€püÀxÀð€pðÀðàð€pàÀxÀð€pÿÀÀøàð€pÿÀÀxàð€pÿÀxàð€p?þÀxàð€pþÀøàð€pÿÀxÀð€`ÿÀøàð€pÿÀxàð€pÿÀxàð€pÿÀxàð€pÿÿÀxàð€pÿÿÀxàð€pÿþÀxàð€pÿþÀxàð€pÿøÀxàð€pçðÀxàð€pÀÀ|àð€p<À~àð€pþÀ~àð€pþÀ|àð€püÀxàð€pøÀxàð€pðÀxàð€pàÀxàð€pÀxàð€p|Àxàð€p üÀxàð€püÀxàð€püÀxàð€pøÀxàð€pðÀxÀðpàÀxàð€p?ÀÀxÀð€p€Àxàð€pÿÀxÀð€pþÀøàð€püÀxÀð€`øÀxàð€pðÀ|Àð€`àÀxàð€p?ÀÀ|Àð€`ÿ€Àxàð€pÿÀxÀð€`þÀøàð€p?þÀxÀð€`þÀxàð€pÿÀ|àð€pÿÀøàð€pÿÀxÀð€pÿÀøàð€pÿÀ|Àð€pÿþÀxàð€pÿþÀ|Àð€pÿüÀxàð€pÿüÀ|àð€pÿðÀxàð €p?ààÀ|?àð €pÀÀxàð€pÿ€Àxàð€pÿÀxàð €pþÀxàð€p üÀxàð€pøÀxàð€pðÀ|àð€pàÀ|àð€p?ÀÀ|àð€p¼ÿ€Àxàð€püÿÀx?àð€püþÀ|àð€püüÀxÀð€pøøÀxàð€pøðÀxÀð€pðàÀxàð€pø?ÀÀxÀð€pø?€Àxàð€pÿ?Àx?Àð€pÿÿ¾ÀøÀð€pÿÿüÀx?Àð€ðÿÿøÀxàð€pÿÿüÀx?Àð€ðoÿÿüÀøÀð€pÿÿÿüÀxÀð€`ÿÿÿøÀxàð€pÿÿÿøÀxÀð€`ÿÿÿðÀxÀð€pÿÿøÀxÀð€`ÿÿðÀøàð€p?ÿÿøÀx?Àð€`ÿÿøÀxàð€pÿÿÿüÀ|Àð€`ÿÿŸxÀøàð€pÿÿ€ÀxÀð€p÷þÀxàð€püÀxÀð€ ÷‡øÀxàð€ÿÏøÀxàð€`ÿŸàÀxàð€pÿÿàÀxàð€pÿ€Àxàð€p?ÿ€ÀxÀð€pÀð<€ÿÿðp€Àxàð€àpÀx>Àð€àp|Àøàð€àp<Àx>Àà€àð€Àøàð€àpÀÀx?Àð€àp€ÀøÀð€àp?€Àx?Àð€àp?Àøàð€àp?ÀxÀð€Àp<Àøàð€àpÀx?Àð€ÀpÀøàð€àpÀx 8Àð€àpÀxü€àð€àp>ÀxþÿÀÀð€àp~ÀøÿÿÀàð€àpþÀ|ÿÿÀÀð€àpþÀøÿÿÀàð€àpþÀxÿÿÀð€àpüÀøÿÀàð€àpþàƒ°CÿÿÿøÿÿàÀð>€ð@pÀð€àp?ÿÿüÀÏàüýÿ€xÀð€àpÿøÿøÀÏïüüÿÀxÀð€àpÿàÿðÀÏÿÀü~÷ÀxÀð€àpÿÿðÀçÿàþ>Àx>Àð€ÀpüÿàÀ÷ÿàü<ÀøÀð€àpÇðÿàÀÿßàÀüÀø>Àð€àpÇ€ÿàÀÿàü€ù€Àð€àp?àÿÀÀŸàø€ûÀ>Àð€àpà?ÿ€À~?àðÿÀÀð€àpÿÀ?ÿ€À?ðÿð>Àà€Àpÿ€ÿÀ?ðÿðÀð€àp?þÿ€Àðÿø>Àð€àpÿðÿÀàÿøÀð€àpÿàÿ€Àÿÿð>Àà€7á€pÿÿÀÿÿÀÀð€çÀpþÿÿ ÀÿÿÀ>Àð€ÿÀpÿðÿþÀÀÿŸÿÿ€Àð€ÿÀpÿàÿü ÀáÿÏÿð>Àà€?ÿ€pÿÿøÀãÿÏÿðÀð€þpþûà À?óÿÀ8>Àà€üpø?üÀ`ÿóÿ<<Àð€ÿpðàþ Àxÿÿùø<>Àà€ÿÀpøþÀøÿÿ<þÀð€ÿàpøÿþ Àüÿÿþ>Àà€ÿÀp?øÿþÀüÿÿþþÀð€?óÀpðÿÿ ÀþÿÿþþÀà€ðpÿÀÿþÀÿÿü?ÿøÀð€ðpÿ€ÿþÀÿÿà?ÿø>Àà€çïàpþÿþÀÿÿÀ?þøÀð€ÿÿøpü?ÿüÀÇÿÿðøÀð€?ÿÿøpðÿøÀÿÿð?øøÀð€ÿÿøqÿÀŸøÀÿÿÀ?øø?€ð€ÿÿøøð?Àwÿ€ÿàÁÿÿÿ€øøÀðð€ÿïðüøÀÿþÇÿÿààøÀðø€à€þüÀø|ÿÿþÀøÀð?ü€àÀþþÀð0ÿÿðÀø>Àð?ü€ààþþ|À€?ÿÿ€ø?Àð?|€?àà>x€€ÿÿøø>Àð<‡€?àðà>~?€ÿÿ<ÿøÀð|ÿŸï?àx?øþ€x€ÿþÿÀøÀð|ÿ¿ÿ€àx<?øüÀ?pÿÿÞÿÀøÀð|üÿ¿ÿÀà<~?øþàðþ€?ùüÿàøÀð=ÿøÿ¿ÿàÿàøàþàÿðüÀÿ‡ÿÿãàø?Àð}ÿüþ½ÿàÿàü?ð>àÿpøÁÿ€ÿÿÃàøÀð<ÿþÿ¼ûàÿà?þ?ø>àþp ãÿ€ÿÿÁàø?Àð>ÿþÿ¼ûáÿàÿþ?ðþàøp ãÿÀLÁàøÀð?ýþÿ¿ÿáÿà€þþàü?àðp> qøÀÁàø>Àà?ùþü¿ÿÁÿà€ýþü?ÀÿÀpxÀÀÁàðÀðóþŸÿÃ÷àùþøÃÿ€pÿü8ÀÁàø>ÀàãþŸÿƒ÷àãþÀþpþø<ÀÃàðÀðÿ‡€óà ÿøpþü<ÀÃàð>Ààþ€çàpÿ?ðpøÿÿüÀÿÀðÀðÿ€ãàxàpÿ€ ÿÿþÀÿÀø>Àà`€Çàxÿ€`ÿ€?ÿÿüÀÿÀðÀð€Ãà<ÿp?ÿ€ÿþÀÿ€ø>Àà€Çà<þpÿ@8ÿøÀüðÀð€ƒàøpÿð<?ÿÀÀø>€à€‡ààpþ~ð<ÿþÀøÀð€ƒààpþ>øÿðÀø>€à€?à€àø~ùÿ€ÿÀÀðÀð€?à€ÀpÿøÿÀÿÀø>Àà€~à€àðÿàÿÿ€ÿøÀðÀð€~à€àpÿàÿ€ÿÿàÀø>Àà€~à€?àðÿ€÷<?ÿÀðÀð€~à€àpÿ€c<þÀø>Àà€üàÿ€p?ÿ€?ÿÿðÀðÀð€üàÿp?ÿÀÿ€ÿÀÀøÀà€øàþpÿ€ÿþÀøÀð€øà`üpÿÀÿøÀøÀà€øààðpÿÿ€ÿàÀøÀð€øàp?àpÿÿ€ÿÀÀøÀð€ðàpÿ€pÿÿ€püxÀðÀð€ðàxÿ€pÿÿ€xÿø|Àø>Àð€ààxþpÿþàxÿàüÀðÀð€ààxüpÿþáþÿ€üÀøÀð€àà8ðpÿøóÿüþÀðÀð€àà8àpÿøóÿ€?øïÀøÀð€Àà<?Àpÿøûÿ?àÇÀøÀð€Àà?€pÿð½þ€‡€ÀøÀð€€à>pÿàÀð€?àpÿà?ÿ?ðÀð>Àð€~àÿpÿðÿ?ÀÀø>Àð€~à þpÿð?ÀøÀð€~àüp_ÿðÀø>Àð€üàøpÿÿð<ÀøÀð€üààpÿðþÀø>ÀàøàÀpÿÿàþÀøÀðøàÿ€pÿÿàþÀø>€àøàÿpÿÿÀ?üÀðÀðƒðàþpÿÿÀÿðÀø>€àƒðàüpñÿ€ÿÀÀøÀðƒðàøpð>ÿÀø>€à‡àààðàüÀðÀð‡àààp?ÀøÀø>ÀàÀàÿ€pÿàÀðÀðÀàÿpÿÿ€Àø>ÀàŸÀàþ`þÿÀðÀðÀàüpü?üÀø>ÀàŸ€àð`ðÿðÀðÀðŸ€àðpð€ÿàÀø>Àà¿àÀ`ç8ÀÿÀðÀð¿à€p?ÇüàÿÀø>ÀàþàÀ`øà?øÀðÀðþààpÿøðÿðÀø>Ààþàà`üððÿÀÀðÀðþàðpüðxÿ€Àø>Ààüà?àpøð<8üÀðÀðüà?àpðø<<?øÀøÀàøàÿ€pÀøxÿàÀðÀðøàÿp?ÀüþÿÀÀxÀððàþp€üþÿÀðÀðøàþpÿüþþÀøÀàðüÀüpþ?þÀøÀðð?ÿÿüüpüþÀøÀðàÿÿü?üpøÿžÀøÀðà?ÿÿþ?üpðÿÀøÀðà?ÿÿü¼pàþÀøÀðÀ?ÿÿüÿ<p?ÀøðÀøÀðÀ¡ÿðþ8p€ððÀøÀðÀþxpÿÿÀðÀøÀð€üxpþÿü€ÀøÀð€ÀøxpüþþÿÀÀøÀð€ààppøøþÿÀÀøÀð?€ààðpð?ðüÿÀÀøÀ0ð?€à?ÀðpàÿÀðÀøÀÿÿð€à?€àpÀÿ€ðÀøÀÿÿÿ€ð€ààp€þðÀø>Àÿÿÿ€ð€à àpüÀøÀÿÿÿ€ð?ÿÿðÿ€àÀpð??øÀø>Àÿÿÿ€ðÿÿðÿ€à€Àpð?ÿüÀøÀÿÿÿðÿÿøÿ€àÀpðÿþÀø>Àÿüðÿÿøû€àÀpðÿ~ÀøÀþð?ÿÿðû€à?ÀpàóüÀø>€þà?ÿÿàó€à€p?Àáøÿ ÀøÀ~ðàó€àÿp€àñ÷€Àø>Àþààç€áþpÁáç€ ÀøÀþðàã€ãüp?ÿóÃÀÀø>Àþààã€çø>p<ÿ÷ÃÀÀøÀþðàã€çø<pxÿççàÀøø?>ÀþààÇ€ð|pøÿàÀøþÀÀþðàÀàxpø~ÿà ÀøþÿÀ>Àþàà‡€?ÀðöðüýÀÀðÿÿàÀþðàƒ€€ðÿ‡ðþÀøÿÿà>ÀþàÀ?€ÿàÿàü ÀðÿÿðÀ~ðà?€ÿàÿƒàøÀøûà>€þàÀ€þÀ?ÿààÀðûðÀ~ðà€þàÿðÿàfþ29î"ñÙð¿ÿóÿÿÿÿÿÿÿÿÿÿÿÿÿøÿûà?ÿÿÿÿÿÿþ`ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿûðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿûà?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿŸÇò(?ÀÀÿ?ÿÿœpÀ?ø?ÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿáÿÿá˜þÀ@ðÿÿ0>Àøÿÿà?Àà‡ÀþðÀø€à8ÿÿÿÀøÿÿðÀþðàü€à<ÿÿÿ€Àøÿÿà>ÀþðÀø€?àxÿÿÿ€ ÀðþàÀ~ðàø€?àxÿÿÿÀÀøü?À>€þðÀð€àðÿþ€ Àøø€À~ðàð€?àðÿþ>Àø>ÀþðÀà€àà?ÿüp<ÀøÀþðàà€àÀ?ÿþøÀø>Àþðàà€ƒà€ÿþø ÀøÀþðàà€ÁÀ€üÿÿ<øÀøÀþðÀÀ€àÿüÿ<øÀøÀþðàÀ€àÀ>ÿøÿ~?ðÀøÀþðà€€ÿÿüÿðòÿÿàÀøÀþðà€€ÿÿøÿàpÿÿ€Àø>Àþðà€€?¿ÿðÿàpçƒÿÀø?Àþðà?€?¿ÿÀÿÀpçþÀø>Àþðà?€<ÀÿÀpÃÿøÀø>Àþðà>€ÿ<ÀÿÀpƒÿðÀø>ÀþðÀð~€þ<ÀÿÀpÿÿÀÀø>ÀþðÀü|€ü<ÀÿÀpÿÿ€ÀøÀþðÀþü€ø<Àÿ€pÿþÀøÀþðÀþü€ø<ÀÿpüÀøÀþðÀÿø€ð<À?þp?ðÀø>€þàÀø€ð<ÀüpàÀøÀþðÀø€à<ÀpÿÀÀø>€þàÀð€ÀÿÀþpÿÀøÀþðÀð€À?ÿÀüpþÀø>€þàÀ~pà€?€?ÿÀøpøÀøÀþðÀþà€?€ÿ€ðp?ðÀø>€þàÀÿà€?8àpàÀðÀþðà?ÿ‡À€<?ÀpÿÀÀø>€þàÀÿÿÀ€þ<€pÿÀðÀþðÀÿÿÀ€þàÿpþÀø>€þàÀýÿŸ€üàþpüÀð>Àþðàü÷Ÿ€€üà€üp?ðÀø>€þàÀñÿ¿øà€øpÿàÀðÀþðàÿŸ€pàÀðpÿÀÀø>€þàÀï¾€àÀàpÿÀðÀþðàg¿€ðð?ÀpþÀø>€þàÀ~‚àð€pøÀð?Àþðà~€ðøÿp?ðÀð>€þàÀüŸ€àpüpÿÀÀð>ÀþðàüŸ€ð0üpÿ€Àø>€þàÀø¿àøpþÀðÀþààø¿ðøpþÀø>€þàÀøÿà?øp?ðÀð>Àþðàøÿà€?üp?ðÀø>€þàÀðþ€€ÿüpÿÀÀð>ÀþðàðþÀÿþpÿ€Àø>ÀþàÀàüÀÿþpþÀðÀþðààüàÿÿpüàø>ÀþàÀÀøààÿþpøÀøÀ~ðàÀøððÿþp?ðÀø>ÀþðÀÀðððÿþpÿÀàøÀþðàÀððx?ÿþpÿ€àøÀþðÀ€ððxÿüpÿàøÀ~ðà€àð<ÿ?üpþÀøÀþðààð<þøpøÀøÀþðà?Àð<üàp?ðàøÀþðà?€ðøpÀÀøÀþðà~€ðøp€àxÀþðà~?€ðàpàøÀþðà~€ðÀp|àøÀþðÀü€à€p8Àø>ÀþðÀüÿ€ðpÀøÀþðàø€ð€pxÀø>ÀþðÀø€à€qüÀø>Àþðàø;€à€ÀsüÀø>Àþðàð€àÀÀ øÀø>Àþðàðƒ€ÀÀð0ðÀø>€þðààÀÀ?ÀðxàÀø>Àþðààã€à€ð|ÀÀø>€þàÀàÀÀàðüÿ€Àø>ÀþðàÀÀààÿàþþÀø>€þðÀÀÀààþàþüÀø>Àþðà€ÀàðxàïxÀø>€þàÀ€?‡€àà0Àp Àø>Àþà€?€ððà‡°Àø>€üÀ?àðàð Àø>Àþà?€ðð>ðÿðÀø>€üÀ~þàðþðÿð Àø>Àþà~þ€ðpþpÿðÀø>€þÀ~ø€àaüáðÀðÀþà~ø€ðü<pÀø>ÀþÀüð€àøüpÀðÀþàüð€ððü0Àø>ÀþÀøà€à?ÀüpÀðÀþàøð€ð?Àø0Àø>Àþ Àðà€à€?ðpÀð>Àþø<àðÀ€Àÿ?à0Àx>€þø>x|Àà€€þÿÀp Àð>Àþü€x|àð€€üÿ€0Àø>€þøø|Àà?€àüþpÀð>À~üÏü>€ü>àà?€ðüü0Àø>Àþø?ÿŸþÿ?àüÿàÀ>€ðøøpÀø>Àþü¿ÿßÿÿ¿ðüÿ€àÀ>€ð?ü?ðpÀø>Àþø¿ÿßÿÿÿðýÿÀàÀ€ðüÀpÀøÀþü¿ÿßýÿÿðýÿÀà€€ðÿ¼ÿ€pÀø>Àþø¿÷ÞûÿÿàÿÀà€€ðþ8€þpÀø>Àþü¿÷ÿÿÿðÿÀà?€€ðþ<9ÀÀþpÀø>Àþü¿÷þûÿ¿ð>ÿ€à?à€ðø8?ÀÀø0Àø>Àþÿÿ¿ÿþÿÿÿðýÿ€à?à€ðø<à?àð0Àø>Àþÿÿ¿÷þÿÿÿðýÿ€à~à€ðð8?Àyà?ÀpÀø>Àþÿÿ¿ÿÞÿ¿ðüÿ€à~à€ðà8?ÀxðÿÀpÀøÀþÿÿ=÷Þ~ÿ?àüÿàüÀ€ð?À€ðñÿ0àøÀþÿ<óÞ>~àüàüÀ€ð€€ðþ8Àø>Àþàü€€ðÿ€ÿÿø8Àø>Àþÿø?€€ðþ?€ÿÿðxÀø>ÀþÀ ÿÿø?€ðüp?ÀÿÀ0Àø>€þð‡ð~€ÿÿð€ðøpÀÿ€0 Àø>€þøïø€ÿÿðþ€ÀðpÀÿ0 Àø>€þø€?ïøÿ€ððþ€àp9Àþ8Àø>Àþø€?ÿøÿŸðàü€?Àpü<àø>€þ?áþøü?Áø?€?ÿøÿ>ðàø€à€ðð|<Àø>Àþßùÿùÿãþ€?à>ÿðÿ~ðàø€ðÿð?àÿÿÀø>€þÿÿûÿÿûÿçþÿÀà}ÿøÿøðÀð€áþàÀÿÿ€ Àø€þÿÿÿÿÿûÿ÷ÿÿàà?ÿüøðÀð€ñüàÿ€ÿÿ€Àø>€þÿÿÿÿ¿ûÿÿÿÿÀà?ÿüðð€à€óøàþÿÿ Àø>€þùþçÿÿ}÷Åÿàðÿ~àð€à€ÿøàü||Àø>€üð~ÿï¾ÿÿ}ÿÿÀÿàþ|þð?À€ÿààøx8 Àø>€~ûþçßÿ}÷Ïÿàðÿ|ÿ€ÿÿ€€ÿààà8Àx>üÿÿÿï¾ÿÿ}ÿÿÿÀÿà?ÿüÿ€ÿÿ€€ÿÀÀÀ0Àø€þÿÿÿçßÿý÷ÿÿÀð?ÿüÿ€ÿÿ?€€ÿàÀÿ€àø>€üÿÿûï¾ûÿý÷þÿÀð?ïø>ÿ€þ€ÿà€ÿpàøÀ~Ïùçžyÿüñþ?€?ðçø>€þ~€ÿà€þ0àø>€þ?áÇpÿ8àøàƒàüÿ€Ïþ|€ÿàøp Àø€~ø€ÿÿ<€ÿøð0Àx>€üðÿÿ€ÿøàp ÀøÀ~pÿÿ€ÿüÿÀ0Àx>€üþ€?ÿøÿpÀÀøÀþ?ü€€?ÿøþ0À??àx>€þøÀ€ÿÿð>øpÀÿ€ÿ¿àøÀþþÀ€ÿÿðø8ÀÿÀÿÿàx>€þÿÿÀçÿÿà<?àp ÀÿÀÿüø>Àþÿÿ€Àÿÿÿð<À0À÷àóüx>Àþÿÿ?€ÿÿÿðxÿpÀÁ€ÿÿ€ø>Àþÿç?€€ÿÿÿøxÿ0Ààÿ€ÿàx>€þà€þÿÿøðüp ÀÀÿÿðøÀþ`à€~ÿÿøðø0ÀÀÿßðøÀþð?àþ€|ŸÿàààpÀÇÀÿðøÀ~ð?àþ€~ÿÀà?à€0Àïçÿ€?øxÀþð?àü€ÿÿÿ€À?€€0ÀïÿÀÿ~øxÀ~ðàü€ÿþÿ€?à0Àçÿàÿ~øxÀþðàøÿüþ ð0ÀÿÿàÿÏðxÀþðÿàø€ÿxø€?ð0ÀÿßàÿÏðxÀþðÿàð€Fp€?à0ÀÿàÿÏàxÀþðÿàð€ø?ÀÀ8ÀÿàÇÀxÀþðÿàà€øÿ€€0À?àxÀþðÿàÀ€>üÿ€0À?ðxÀþðÿàÀ€ø<þ0ÀðxÀþð÷à?€€þø|ü0ÀðøÀþð÷à?€þøxøpàøÀ<Àþð÷àüƒþøàpàøøÿ€Àþðçàøçÿ¾pÀ0Àøýÿ€€þðçàþðÿÿ¿`ápÀüÿÿ€ÀþðÇàü€àÿÿ¿ðxÀþÿÿ€>€þðÇáü€ÿÿ¿ðpÀÿ ÿþÀþð‡ãø€÷ÿ¾ðpÀ?ÿüÿü>€üð‡ÃðøÃÿð>pÀ?ÿÿÿÀþðÿÿà?‡áðüþ?àÿ€pà?ÿÿ€ÿÿ€>€þðÿÿÿà?ÀÀüüÿÀ?ÿpàÿÿÿÿ€ÿÿÀÀþðcÿÿÿûçÀÁüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýñ¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿßÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀýÿÀ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀüàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÀøÀ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ`;þü`8@ðÿÀÿàÿÿÿÿÿÿ?ü?ÿÿÀðàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ;OÃ9ƒžÁðÀþÿàÿ?ð!ÿø0ÿà èÿÿÿÿÿÿ?þÿÿÀüÀ?``FÀþð€üþ?€ÿÀñÿÀpÿàÿÿÿÿÿÿÿÿÿ?þ?ÿÿ€þÀÀþðÀüÿ?€Gÿ€øü0ÿðÿÿÿÿÿÿÿÿÿÿüÿÿ€þ€>Àþà€øþøÿ€þÿð@pÿÿð'ÿÿÿÿÿÿÿÿÿÿÿø?ÿŸ€þ€ÀþðÀøþÿÿ€þÿð0ÿÿø?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ü>>€þà€ðüÿÿøÿàpÿÿxÿÿÿÿÿÿÿÿðÿ?þÿþðÀþðÀðüÿÿ€ðÿÿ€0ÿÿøÿÿÿÿÿÿÿÿûÿðÿ?ÿÿü>€þà€àðÿ÷ÀÿüpÿÀÿÿðÿÿÿÿÿÿÿüÿðÿ?þ?ÿÀÀþðÀàðÿó€Àÿÿð0ÿÀÿÿø?Çÿÿÿÿÿÿüÿðw÷Ÿþÿ€>Àþà€Ààÿã€ÿÿþpÿÀÿÿðÿÇÿÿÿ€ÿøÿð÷ÿÀþðÀÀàÿã€þÿø0ÿàÿÿðøãÿÿþÿüÿðÿ€ÿ>Àþà€€Àÿã€øÿ€pÿÀÿÿÀÿøÿÃøÿüÿøÿàÿüÀþðÀ€àÿã€øÁþ0ÿàÿÿÀÿÿø?Àþÿü?ð>€þð€€?ÀÿÀ?àÀðpÿÀÿÿÇÿÿÿøüÿø?þðÀ~ðÀ€?àÿÀÀà0ÿàÿÿÿÿÿÿðþÿøüð>€þð€?Àÿƒ€ÿ€ÿàpÿÀÿÿÿÿÿÿ€üÀððÀþðÀ?àÿƒ€ÿÿÀ0ÿàÿÿÿÿÿÿ€þàÀð>Àþð€~ÿÀÿ€üÿpxÿÀÿÿÿÿŸÿ€þÀäðÀþðÀ~ÿàþ€øÿü0þÿà?ÿÿÿðÿ€þàÿðÀþð€þÿÀÀ€?ðÿàp?ÿÿÇÿÿÿøÿ€üÀÿÀðÀþðÀüÿà?Áƒ€à?ÿ€àÿ0?ÿÿÿÿÿÿÀÿ€?üàÿàðÀþð€üÿàÿóƒ€ÿ€ÿüðùÿp?ÿÿÿÿÿÀÿ€àÿàðÀþðÀüÿàÿÿÀÿ€ÿðüùÿ0?ÿðÿÿÿÿÀÿ€àÿàðÀþð€ø÷àÿÿÀþÿ€þýÿ0?ÿøÿüÿÀÿ€àãàðÀþðÀø÷àÿÿƒ€üþÿýð0?ÿøÿàÿ€ÿ€àáàðÀþðÀðçàÿÿƒ€øðÿ=àp?ÿ~?øÿ€àÁàðÀþðÀðÇàÿÿ€?ðÀü=üp?ÿÿøÿ€àáàðÀþðÀð‡àÿÿ€àþ}ÿ0?ÿÿÿàÿàáàð?ÀþðÀààÿÿ€ÿ€x<þ}ÿ€0?ÿÿÿàáàð>ÀþðÀàà?ÿÿÿüüùÿ€0?ÿÿÿþàáàðÀþðÀÀ<àÿÿƒ‡þü?üðï€0?ü?ÿÿÿøàáàð>Àþð€À|àÿÿƒø?øþà€pÿÿÿÿÿ€à÷àð>Àþð€ÀüàÿÿÿƒŸðÿøþà€pÿÿÿÿþÀÿàð>ÀþðÀüàÿÿãÿàÿà?ÿ€üÐ?€pÿÿÿÿàÿÀð>Àþð€?üàÿÿ€ÿÀÿ¿ÿ€ü€pÿÿÿø`àÿ€ð>ÀþðÀ?øàùÿÿ?üÿ€üpÿÿÿü€àÿð>€þð€?øàðxþÿðþ?€ü~pÿÿøüààð>Àþð€ðàÿüÿÀü€ø<pÿÿÿðÿÿðàð>€þð€~àà?ÿ€øÿøÿ€pÿÿÿðÿÿðÀðÀþðÀþàà?ÿàð?üÿ€p?ÿÿÿð?ÿÿøàð>€üð€üÀàÿàÀÿðÿ€pÿÿÿÿð?ÿÿøÀðÀþðÀüÀàÿÿÿƒÿÀ€pÿÿÿÿð;ÿÿüàð>€þà€ø?€àÿÿÿ‡ÿ?p?ÿÿÿÿÿð{ÿÿ¼ÀðÀþðÀø?€àÿÿÿãŸþpÿÿÿ?ÿÿð?ÿÿÜàð>€þð€ðàÿÿþã¿øpÿÿøÿàÿÿøÀðÀþðÀðà÷ÿþãŸà8ÿðÿÿÀ?ÿÿüàð>€þð€ðþàçÿü?߀pÿðÿü?óøÀðÀþðÀðþàÃÿüÃŽ8ÿðÿøÿûðàð>€þð€áüàƒÿüÿ€pÿÿÿÿÿðüÿàÀðÀ~ðÀáüàÿþþ€pÿÿÿÿ¿¸ø?Ààð>€þð€Ãøàþÿþýÿ€ pÿÿÿÿðÀðÀ~ðÀÃøàþÿÿ€€0ÿÿÿÿÿøàð>€þð€‡ààøÎÿ€àpÿÿÿ÷ÿðÀðÀþðÀ‡ààøÀû€?€àpÿÿÿÃóðàð>€þð€?Ààðàã€ÿÀàpÿÿþÿàÀð?ÀþðÀ?ÀàðñÿÀÿà?Àxÿÿþÿààð>Àþð€€àÀ÷þ€ÿàpÿÿþ€Àð?ÀþðÀàÀÿþ€àpÿÿþàð>€þð€þà?ÿð€pÿÿÿþàð?ÀþðÀþ8à?ÿà€pÿüþàð>Àþð€üüàÿ€€pÿàüàð?ÀþðÀüüàÿÿ€pÿÿ€?üàð>Àþð€ùüã€ÿü€pÿøÀðÀþðÀùüçÀÿø€0ÿààðÀþð€ûøïÀÿà€pÿÿðàðÀþðÀûøÿÀÿÀ€xÿÿüàð>Àþð€÷ðÿÀ?ÿ€pÿÿßþàðÀþðÀ÷ðÿ€þ€8ÿÿÿàø>ÀþðÀïàÿÿø€x?ÿð?ÿàð?ÀþðÀïàÿÿ0€xÿÿÀ?ÿ€àð?Àþð€ßÀüü€0ÿüÿ€àðÀþðÀßÀàü€8ÿðÿ€àðÀþðÀÿ€àü?ƒ€xÿÿ€àðÀþðÀÿ€à?üÿã€ðüÿ€àð>ÀþðÀ?ÿàøÿã€ÿðà?ÿ€àð>ÀþðÀ?þàÿðÿã€ÿðÿ?ÿàð>ÀÿÿððÀþàÿÀÀüÿùÿ?àð>ÀÿÿþðÀüàÿ€€?þÿñÿþàðÀÿÿÿ€ðÀÿüÿàÿ€?þÿñþøàð>Àÿÿÿ€ðÀÿøÿàþ€?þÿðððàð>Àÿÿÿ€ðÀÿøÿÿàø€?þÿðàð>Àÿÿÿ€ðÀÿðÿÿàÿð€?þÿðÀð>Àÿÿÿ€ðÀÿðÿ÷áÿÀ€ÿà?þÿðàð>€xCþð€ÿàÿççÿ€€ÿð?þÿðÀðÀð€ÿàÿçïÿ€ÿð?ÿÿðàð>€ð€ÿÀÿçÿü€ÿðÿÿÿðÀðÀðÀÿÀÿ÷ÿø€ÿð?ÿÿÿÿààð>€ð€ÿÿ÷ÿð€ÿðÿÿÀðÀðÀðÀæÿ÷ÿà€ÿð?ÿüøàð>€ð€Àÿçÿ€€ÿð?ÿðüøÀðÀðÀàÿ÷ÿ€xÿðÿ€ÿþàð>Àð€Àÿÿü€þÿðÿüÿüÀðÀðÀðÿÿþ€ÿ€ÿðÿðßþàð>€ð€?ðÿÿþ€ÿ€ÿðÿ€ßÞÀðÀðÀ?ø?ÿü€€Àÿñÿüßîàð>€à€øýø€€>àÿÿÿàÿüÀðÀðÀ?øð€€<à?ÿÀÿþàð>€ð€ðþà€€xàÿüüüÀðÀðÀðþàÀ€8ðÿøüàð>€ð€ÿàøÀÀ€xàÿ€ðÀðÀðÀÿÀøàÀ€xðÿþðàð>€ðÀÿÀàà€€xàÿðÀðÀðÀÿÀàðÀ€<ð?ÿÀ8àð€ðÀÿ€?Áÿð€€<àÿüpÀðÀðÀÿ€?ƒÿü€€?àÿø0àðÀðÀÿÿüÿ€ÏÀÿ€pÀðÀðÀÿÿü?þ€ÿÀÿÿ0àðÀðÀþüðü€ÿÿøpàðÀðÀþü?àð€þÿàpàðÀðÀüøÀà€ÿÿpàðÀðÀøøÿ€à€ÿü0àðÀðÀøáÿà€ÿÀpàðÀðÀøÃþà€8ÿxàðÀðÀ?ð?‡üà€ü|þàðÀðÿü?à‡øà€üÿ€àðÀðÿþ?àÿðà€?üÿÀàðÀðÿÿÀþàà€?üÿÀàðÀðÿÿÀü€à€øÿààðÀðø?ÿ€øà€àÀÿààðÀðàÿ€ñàà€?ðÿààð>Àðàÿóðà€ø?øþààðÀðàÿçðà€üüÿàÀð>Àðàþ?Ïðà€?üÿüÿàÀðÀðàüŸðà€ÿüÿþçÀÀð>Àðàøÿ?àà€ÿøÿþƒÀÀð>Àðàðþ€à€ÿÀÿî?ÀÀð>Àðààüÿà€þÿîÀðÀðÿÿàýÿà€ÿøÿþ~Àð>Àðÿþàóüà€ÿàÿüpÀðÀðÿþà÷øà€?ÿ€üü0àð>ÀðÿþÀïðà€ÿþüøpÀðÀðüÀ?ßðÿÿø€ÿð?ø0Àð>ÀðÀ?À¿Àÿÿÿø€ÿÀx?àpÀðÀðÀ?ÀÿÀÿÿÿü€ÿÿ0Àð>€àüþÿÿÿÿø€ÿøÿ€pÀðÀðÃÿ€þþÿÿü€ÿàÿÀ0àð>€àÿ€ÿüÿÿð€?ÿ€ÿÀpÀðÀðÏÿÀûü€ÿþÿà0àð>ÀàŸÿÀþ÷ð€ÿðÿàpÀðÀðßÿàþïðÀÿÀþà0àp>Àà¿ÿáü?ßÀ€þÿàpÀðÀðßÿáüÿÀÁÿøÿà0àp>Àð¿ÿãø?ÿ€ÿÀÿÀpÀðÀðßÿãø?ÿÿ€ïà0Àp>ÀðßÿÇð~ÿü߀pÀðÀðÏÿÇð<ÿðÿ€0àp>ÀðÇÿàÿ€þpÀðÀðÃÿ‡ç?ÿü0àp>ÀðÁþÏ€øpÀðÀðÀxßßÀÿà0àp€>ÀðÀÿ¿€ÿÿ€pàðøàÀðÀÿ¿€ÿ¿€8àpþðÀðÀ?ÿÿÿƒ€ÿðpàðÿ?ðÀðÀ?ÿÿÿƒ€ÿø8àðÿ?ø>ÀðÀýþÿƒ€ÿøpàðÿ?øÀðÀÿü?ÿƒ€ÿø8àðÿøÀðÀþsøÿÿƒ€ÿø0àðŸþøÀ ðÀþðÿÿƒ€ÿø8àð?~øÀðÀÿðÿÿƒÀÿøx à9ð~øàÀ|ö> >sÀøÀÿð9À ÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿÿÿÿÿÿÿÿÿÿóÿÿÿÿ‡ñÿÿÿÿÿÿÿÿÜÿÿÿÿÿûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðþ~øÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿßÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðþ~øÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðü~øÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿóìÃÿÿÿÿÿþ~ßÿÏÿÀÿø€xàðø?øÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùÿÿÿÿÿÿÿÿÿÿÿÿÿóÿÓü'€?þ@ÀÀÿÿÿÀ€ÿø0àðþ?øÀðÀÿþÿÀ€ÿðpàðÿ?ð>ÀðÀÿüÿÀ€àpàðÿ?ðÀðÀûø?ÏÿÀ€pàðÿàÀðÀ÷ðÿÏÿÀ€pàðþÀÀðÀ?ïðÿÿÀ€0àðø>ÀðÀßàÿÿ€€pàðÀðÀßÀ?þÿÀ€pàð>ÀðÁÿ¿Àÿøÿ€€ÀpàðÀðÁÿ€ÿàÿÀ€ðþpàð>ÀðÃþÿ°ÿ€€ÿðÿpÀðÀðÇþ?ü0ÿ€€ýøÿ€pàp>€ðÏüÿøÿøÏÀpÀðÀðßüÿàÁÿüÿàpàp>ÀàÿûÀÿ€ÃÿüÿÀpÀðÀðÿÿð?þûßþÿàpàp>ÀðÿÿàÿøÿƒÿÜýÀpÀðÀðÿÿðÿàÿÿþþàxàp>Ààÿÿàÿ€ÿÿÿüÿÀpÀðÀðÿÿà?þÿÿ€üüÿàxàp>Àðÿÿ€ÿøÿÿ€ÿðÏÀpÀðÀðÿÿÿðïÿÀðÿ€xàx>Àðÿÿ0ÿ€ÿÿ€?ÀÿpÀðÀðÿÿÿÿÿ€þxàpÀðÿþÿøÿÿ€pÀðÀðÿþÿð~ÿ€8àxÀðÿÿøÿÀÿ€pÀðÀðÿÿøÿ€?ûÀ8àxÀðÿÿðüó€pÀðÀðÿÿðÿøÀ8àxÀðÿÿàÿÀ€pÀðÀðÿÿàÿ€€8àxÀðÿÿÀ?þ€pàpÀð?ÿÿ€üÀ8àxÀðÿÿÿð€0àpÀðÿÿÿÿÀðÀ8àxÀðÿÿÿÿü€0àpÀðÿÿÿ?þþÀ0àxÀðÿÿÿø?ÿ€0àxÀðÿÿÿà?ÿ€àxÀpùïþ€ÿ€€0àxÀpðø{ÿ€À0àxÀð?àð8{û€À0àxÀð?À?àpû€À8àxÀð€?øø?ÿ€À8àxÀðÿüø?ÿ€€8àxÀðþÿþø>€8àpÀðþü?ø~€pàxÀðüüðþ€0àxÀðøüÀü€pàpÀððø€ƒðÀxàpÀð?àø€À€pàpÀð?Àø€?ÀÀ8àxÀð€ðÿÀ€pàpÀðÿ€ðÿÿÀ€0àx>Àðÿàÿ‡ÿ€€pàðÀðþðÿÏþ€8àx>Àðüø?ÿÿø€pàðÀðøÿÿÿÿøÀ8àxÀðð?ÿÿÿÿà€pÀðÀðà?ÿÿÿÿ€À8àxÀð?ÀŸÿÿþ€pàðÀðÀÿÿüÀ8àxÀðÿÿßÿð€pÀðÀðÿÿßÿàÀ8àxÀðüþßÿÀ€pÀðÀðüþÏÿÀ€8àxÀðøüÏÿ€pÀðÀðøüßü€8àxÀðàøÿð€pÀðÀðàøÿàÀ0àxÀð€ðÿ€€0ÀðÀð€ðÿ€À8àxÀðàü€pÀðÀøà?üÀ8àxÀðÀÀð€0ÀxÀðàÀÿàÀ0àxÀðÿÿÿðà?ƒÿÀ€0àxÀðÿÿÿøà?‡ÿÀ€8àxÀðÿÿÿøàÿÀ€8àxÀðÿÿÿü?ÀÿÀ€8àxÀðÿÿÿø€þÿÀ€8àxÀðÿÿð€þÿïÀÀ8àxÀðà~ÿÿÀÀ8àxÀðà>ÿÿÀÀ8àxÀðÀÿþÀ€8àxÀðÀÿøÀ€8àxÀðÀ€ÿðÀ€xàxÀðÀ€ÿàÀÀ8àxÀðÀ?€ÿ€ÀÀ8àxÀðÀ€ÿÀÀ8àxÀðÀÿ€þÀÀ8àxÀðÀÿüÀ€8àxÀðÀþ?ðÀ€8àx>ÀðÀüàÀ€8àxÀðÀøÿÀÀ€8àx>ÀðÀðÿ€À€0ÀxÀðÀàÿÀ€8àx>ÀðÀ?ÀþÀ€pàxÀðÀÀüÀ€8àx>ÀðÀÿ€?üÀ€pàxÀðÀÿøÀ€8àx>ÀðÀþÿðÀ€pÀøÀðÀüÿðÀÀ8àx>ÀðÀøÿàÀ€pÀðÀðÀøÿàÀÀ8àx>ÀðÀàÿÀÀ€pÀðÀðÀ?à?ÿÀÀÀ8àx>ÀðÀ€?ÿ€À€pÀøÀøÀ€?ßÀÀÀ8àx>ÀðÀÿ?À€pÀðÀøÀþ€?€À€8àx>ÀðÀüÀÀ€pÀðÀøÀüÀÀÀ8àxÀðÀðÀþÀ€pÀøÀøÀðÀþÀÀ8àxÀðÀ?àÿüÀ€pÀxÀøÀ?àÿüÀ€8àxÀðÀ€þøÀ€0àxÀøÀÿ€üøÀÀ8àxÀðÁÿøðÀ€0àxÀðÃþððÀÀ8àxÀðÇüÀàÀ€8àxÀðÇüàÀÀ8àxÀðÏøðÀÀ€0àxÀpÿøøÀÀÀ8àxÀðÿðø?€À€8àxÀðÿàø?€ÀÀ8àxÀðÿÀðÀ€8àxÀøÿ€?ðÀ€8àxÀðÿàþÀ€8àxÀøþÿÀþÀ€8àxÀðüÿ€üÀ€8àxÀøüÿüÀ€8àxÀøøüøÀ€8àxÀð?ðøøÀ€xàxÀðàððÀ€xàxÀðÿÀ?àðÀ€xàxÀðÿÀÀàÀ€8àxÀðÿÀÿ€àÀ€pàxÀðÿÀÿÀÀ€8àxÀðÿøþ?ÀÀ€pàxÀðÿþü?€À€8àxÀð?ÿþøÀ€pàxÀð?ÿÿðÀ€8àx>ÀðÿþàþÀ€pàxÀððÀþÀ€8àxÀðà?ÿÿàüÀ€pàxÀðàÿÿøüÀÀ8àxÀðÿÀÿÿøøÀ€pàpÀøÿàÿÿüøÀÀxàx>ÀðÿÀ?ùÿøðÀ€pàpÀðÿàùÿüðÀÀxàxð>€ðÿà?áÿøàÀ€pàpyþÀø?ûÿÿáÿüàÀÀxàxÿÿÀðóÿÿÿøÀÀ€xàðÿÿ€ÀøñÿÿÿüÀÀÀxàxÿÿÀðÁÿþÿø?€ÀÀxàpÿþÀðÀÿþÿü?€ÀÀxàxÿøÀð€üÿøÀÀxàðÿþÀøÿ€üÿøÀÀx€øÏ· "ÿÿÿøÿÿÿ€ùÁý†oÿÿ¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿãþ÷äƒ?ÿùÿÿø}çô}=ÿãóÿÿÿÿÿüx‡þgÄø}ÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ;8'ø€xàx|ÀÿÿþóÿÿÿÿÿÿÿÿÿÿÿÿÿáðCÿÁÿÀðÿðûÿÿÀÀÀ€pàxÀøÿððÿïÀÀÀÀ0àxÀðÿà>ÿŸÀ?€À€pàpÀxÿÀÀ?€ÀÀ0àxÀðÿ€ÿÀ€€pàpÀø?ÿÿÀÀÀ0àxÀðþþÀþÀ€p àpÀðþþÀþÀÀ0àxÀðÿüøÀüÀ€p àxÀðÿüøÀüÀÀ8àxÀðÿøàÀøÀ€p ÀpÀxÿðÀøÀÀ8àxÀðÿà|ÀðÀ€p ÀpÀxÿàþÀðÀÀ0àxÀð?ÿÁüÀàÀ€p àpÀøÿƒþÀàÀÀ8àxÀðÿÿüÀÀÀ€p àpÀøÿÿüÀÀÀÀ0àxÀñÿþøÀ?€À€p àpÀûÿüðÀ?€ÀÀ0àxÀÿÿøÀÀÀ€pàxÀÿøÀÀÀÀ0àxÀÿÿðÿ€ÀþÀ€0àxÀÿáÿ€ÁþÀÀ0àxÀÿÿÃþÁüÀ€pà{ÀÿÇþÃøÀÀ0àyÀÿÿøÃøÀÀ0àxÀÿÿŸøÇðÀÀ0àxÀÿÿ?ðÇðÀÀ0àxÀÿþ?àÏàÀÀ0àxÀÿüÿÀÏàÀÀ0àxÀÿøÿ€ßÀÀÀ0àxÀÿûÿÿÀÀÀ0àxÀ?ÿÿþÿ€?ÿÿÀÀ0àxÀÿÿüÿÿ€ÿÿðÀ0àxÀÿÿüÿÿ€ÿÿÿøÀ8àxÀÿÿðÿÿÿÿÿøÀ8àxÀÿÿàÿÿÿÿÿðÀ8àxÀ?ÿÿÀÿþÿÿðÀ0àxÀÿÿ€üÿÿÀÀ0àxÀƒÿÿüÀ0àxÀƒÿÿÿÿÀpàxÀ?Áÿþÿÿ€À8àxÀ€ÿüÿÿ€pàxÀÿŸÿøÿÿ€À0àxÀÿ?ÿðÿÿ€0àxÀÿ?ÿà?ÀÀ0àx>ÀüÿÀÀ€pàxÀ|ÿÿ€ÀÀ0àxÀ0ÿÿÿÀ€pàxÀÿþÿÀÀ0àx>ÀÿüÿÀ€pÀpÀ>üÿÀÀ8àxÀþ?øÿÀ€pàxÀþÿøÿðÀ8àx>Àþÿðÿø€pÀxÀþ?ÿøÿþÀ0àxÀüÿðÿþ€pàxÀüÿøü?À0àx>€ñÿþø?ð€€pÀxÀ?ñÿþx?ð€À0àxÀãÿøøà€€pÀxÀÃÿøxàÀÀ8àxÀÿ‡ÿàøÿÀ€€0àxÀÿÿàxÿàÀÀ8àxÀþÿøÿà€€0àxÀþÿxýð€À0àxÀø?þxùø€0àxÀøþxøü?À8àxÀðÿøxðÿÿÀ0àxÀ?àÿøxðþÀ8àxÀÁÿàxà?üÀ0àxÀÿÁÿàxàøÀ8àxÀÿƒþx?ÀàÀ8àxÀÿüx?€àÀ0àxÀþüx€àÀ0àxÀüüxÿàÀ0àxÀøüxÿÀÀ8àxÀøüxþÀÀ8àxÀ?à?øxüÀÀ8àxÀàðxüÀÀ8àxÀÿÀÿàxøÀÀ0àxÀÿ€ÿÀøðÀÀ8àxÀÿÿ€xðÀÀ8àxÀþÿøàÀÀ8àxÀüüxàÀÀ8àxÀùÿøø?ÀÀÀ0àxÀÿÿðx?€ÀÀ8àx>À?ÿÿðøÀ€pàxÀ?ïÿàxÿÀÀ8àx>ÀÿßÿÀðþÀ€pàxÀÿŸÿàxþÀÀ8àx>Àÿ?ÿàøüÀ€0àxÀÿÿàxüÀÀ8àx>Àü?ÿàðøÀ€pàxÀüÿàxðÀÀ8àx>€ðÿàðàÀ€0àxÀðÿàxàÀÀ0à8>Àà?ÿÀð?ÀÀ€pàxÀÀÿÀx?ÀàÀ0à8Àÿ€ÿÿð€À€pàxÀÿ€ÿþx€ÀÀ8à8ÀþÿððÿÀ€0àxÀþÿàxþÀÀ8àxÀøÿ€ðüÀ€0àpÀøÿ€xüÀÀ8à8À?ðÿþðøÀÀpàxÀ?à?ÿÿÿÿàxøàÀ8à8À?ÀÿÿÿÿàðàÀÀ0àxÀ?€ÿÿÿÿðxààÀ8à8À?ÿûÿÿÿðø?ÀÀÀ0àxÀÿûÿÿÿðx?ÀàÀ8àxÀ€ÿñÿÿÿàx€ÀÀ0àxÀÀÿðÿÿàx€ÀÀ8à8Ààÿà€øÿÀÀ0àxÀàÿÀ?€xÿÀÀ8àxÀ?à?ÿ€?€xþÀÀ0à8À?à?ÿ€?€xüàÀ8à8À?Àÿÿ?€xøàÀ0àxÀ?€ÿþ?€xøàÀ8àxÀ?ÿþ?€xðÀÀ8`xÀÿü?€xðàÀ8`xÀÿø?€xààÀ0àxÀÿð?€xààÀ0àxÀÿà?€x?ÀàÀ8àxÀ?ÿà?€x€àÀ8àxÀ?ÿÀ?€xÿàÀ8àxÀÿÿÿ€€xþÀÀ8àxÀÿÿÿ?€xþÀÀ8àxÀÀÿÿ>øüÀÀ0àx>àÀþÿü?€xøÀÀ8àx~?àÀüýð€øøÀ€0àxÿ?ðÀøÿü?€xðÀÀ8à8þðÀðþðàÀ€0àxÿøÀðÿ?€xàÀÀ8àxþð>Àà<þð?ÀÀÀ0àx~~øÀÀþ?€x€ÀÀ8 Çñýÿÿÿùÿÿÿÿÿÿÿø>}ð>Àÿ€ÿ?üøÿÀÀàøð~ýü@?ÿñÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø?~ø¿ü€€ƒÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø>}ðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø?~øÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿû?ÿÿù÷?þðñøaûàx>}ð?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿßÿÿûà@À0àx??øÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøþàÀ8`x~ðÀÿ‡ÿü€ÿøÀ€0àx??ðÀ?ÿÃ÷ü?€øàÀ8`x>?àÀÿÃÏðÿàÀ€0àxàÀÿÿøð?€ààÀ8ðxÀÿÿü?àÿÀÀÀ0àxÀÿÿþ?à?€ÀÀÀ8àxÀÿÿü€€ÿ€À€pàxÀÿÿþ€?€ÿ€ÀÀ8ðxÀÿÿýÿ?€ÿÀÀ0àxÀÿÿýÿ?€ÿÀÀ8pxÀ?ÿÿûþ?üÀÀ0àxÀïÿÿü?€üÀÀ8ðxÀÿ‡ÿÿø?øÀÀ0àxÀÿƒÿÿø?€øÀÀ8pxÀÿÿÿð?€?øÀÀ0àxÀþÿÿð?€?øÀÀ8à8ÀüÿÿÀ?€øÀÀ0àxÀüÿÿÀ?€øÀÀ8pxÀðÿÿ€?€ÿxÀÀ8`xÀðÿÿ€?€ÿxÀÀ8p8À?àÿÿ?€þxÀÀ0àxÀÀÿþ?€þxÀÀ8à8Àÿ€ÿþ?€üxÀÀ8à8àÿÿþ?€üxÀÀ8p<Àÿÿÿþ?€øxÀÀ8p8àþÿÿü?€øxÀÀ8p8Àüþ?ø?€?ðxÀÀ8`xÀøþ?à?€àxÀÀ8ðxàðüÀ?€ÀxÀÀ8àxÀ?àøÿ€?€ÿÀxÀÀ8àxàÀñÿ€?ÿ€xÀÀ8àxÀÿ€?áÿ?ƒÿ€xÀÀ8àxàÿÃþ?ƒÿxÀÀ8`xÀþÿ‡üþxÀÀ8àxàþÿø?þxÀÀ8`xÀüÿðüøÀÀ0àxàøþð?ŸøxÀÀ8`x>À?ðü?à?ðøÀ€0àxÀ?àø?À?ÿðxÀÀ8`x?ÀÀ?ðÿ€ÿàøÀ€0àxàÿÀ?ðÿ€ÿàxÀÀ8pxÀÿÁÿÿÿÀðÀ€pàxàÿÿÃÿÿÿÀxÀÀ8`xÀþÿ‡üÿÿøÀ€pàxàüÿüÿÿxÀÀ8`8ÀpþøãüøÀ€0àxàþðÿþxÀÀ8pxÀø?àÿüxÀ€0àxàø?àÿþxÀÀ8`8Àx?à€ÿþxÀ€0àxÀü?à€ÿþxÀÀ8`8ÀüÿÀÿÿüxÀ€0àxàþÿ€ÿþxÀÀ8`8Àüÿ|ãüxÀ€0àxàüÿüûüxÀÀ8`8ÀðüÀÿøxÀ€0àxàðüàÿðxÀÀ8`<ÀÀøàÿÀxÀÀ0àxÀð?Àÿ€xÀÀ8`<À?à?€?ÿxÀÀ8`xàÀ?à?€ÿ€xÀÀ8p8Áð?€?ÿÿxÀÀ8`xÃð?€?ÿÿ€xÀÀ8p8ÇðÿÿxÀÀ8pxïðÀÿÿ€xÀÀ8p8ÿðàÿÿxàÀ8`8ÿàð€ÿÿ€xÿÿøÀ8p<ÿÀðÀÿÿ€xÿÿÿüÀ8`8ÿÀàÿàÿÿøxÿÿÿüÀ8p<ÿ€?àÿà?ÿÿüxÿÿÿüÀ8`8ÿ?Àÿà?ÿÿüxÿÿÿüÀ8`8þ€ÀÿÿüxÿÿøÀ8`8ü??€ÿÿÿüxïŸàÀ8p8ø>ÿÿÿ€|xÀ8p8ðþÿÿ€|xÀ8`<?àÀðÿ÷€|xÀ8`|àÀðÿï€|xÀ8à|à?àðÿç€|xÀ8ð|ÿÀÀ?àÿÏ€|øÀ0à|ÿàÿÀ?à?ÿÇ€|xÀ8p<ÿÁÿ€ÿÀÿ€üøÀ0à|ÿáÿ€ÿ€ÿ‡ÿüxÀ8à<ÿÃÿÿÿþÿüø€0àxûçþÿÿþÿüxÀ8`8?çÏüþþüÿøø€0àx?ãïøüü|ÿðxÀ8p<ÿ‡ÿðøøøÀ0àxÿƒÿðø÷€?€xÀ8p<þÿÀ?à?ï€p€0àxþÿÀ?à?ïÀ?€xÀ8`<üÿ€ÿÀÿÀp€0àxüÿÿÀ¿À?€xÀ8p8ðþÿÿ€?ø€0àxðþÿÿ€?€xÀ8p8Àøüüÿ?xÀ0àxÀøüüÿ?€xÀ8p<ÿ€?àøñþ?xÀ0àxÿàøóü?€xÀ8p<þÿÀ?ð?çø?xÀ8àxüÿà?à?çø?€xÀ8p8øÿÀÀð?xÀ0àxüÿàÿÀð?€xÀ8p|?þÿÁÿÿà?xÀ8`x?ÿÿáÿþà?€xÀp|ÿóÃþÿÿÿÀü?€?€xÀ`xÿÿ¿óçþÿÿÿàü€?€xÀ`<ÿÿÿãÏøÿÿÿàðÿ?€xÀ8`8ÿÿÿÃÿøÿÿÿððÿ?€xÀ8p<ÿÿÿƒÿðÿÿÿà?áþ?€xÀ8`<ÿÿÿƒÿàÿÿÿà?Áþ?€xÀ`<ÿÿÿÿÀÿÿÿ€ü?€xÀ8p8ÿÿþÿ€þÿø?€xÀ8p<?ÿÿøÿüÿð€xÀ8p<ÿÿøÿüþà€xÀp<ÿÿÿðüüü?€xÀ8p<ÿÏÿàüÿø?€xÀ8p<ÿƒÿÀø?ÿÀð??€xÀ8p8ÿÿ€ðÿÀà??€xÀ8p8þÿ?àÿÀ?À?€xÀ8`8üþàÿÀ€ÿ?€xÀ0`<øþÿà|Àÿ€þ?€xÀ`<ðüÿÀxÀÿþ?€xÀ0`xàøÿà|àþü?€xÀ`|€?ðÿÀxÀüü€xÀ0`x`?àÿà|ÀøøÿÿÿÀxÀ`8ðÿÀûÀxÀððÿÿÿÀxÀ8àxøÿ€óà|ÀàðÿÿÿàxÀ`<øÿ?ãÀ|ÀÀàÿÿÿàx€0àxøÿ?ãàÿàÀàÿÿÿàxÀ`<ðþÃÀÿÀÿ€ÀÿÿÿÀp€0àxðüÿƒàÿÀÿ€ÿÿÿ€xÀp<àøÿÀÿÀþÿp€0àxÀðÿà?ÿ€þÿ8À`<€?àüÀüøþp€0àxðàüàüøþxÀ`<ðÿ€?ðÀø?àøp€0`xøÿ€ðàü?àøxÀ`8øþÿðÀøÀðx€0àxøÿðàüÿ€ðxÀ`<?ðÿ€ðÀøÿàpÀ0àx?ðÿÀðàüþàxÀ8`<ÿÀÿÀÀÀøüxÀ0àxÿÀÿÀ€àüøxÀp8ÿÿÀÀøð|xÀ8àxÿÿÿLJàüð~xÀp|þÿÿÏÀàøÀþxÀ8`xþÿÿßÀàüÀþxÀ`<üÿÿÿÀàøÿüxÀ8`xøÿÿÿÀàüÿüxÀ`<þ?ðÿÿÿ€àüþøxÀ`8ÿàÿÿÿ€àüüøxÀp<ÿÿÀ?ïÿÿàüøðxÀ8`<ÿ€ÿ€ÿþàüŸøð8€À8`|ÿÿÿüàÿÿààxÀ8`<þþøàÿÿà?ÀxÀ8p<þüàÿÿÀÀxÀ8p<ÿøàÿÿ€€xÀ8p|ÿ€ð€?€à?ÿÿÿxÀ8ðÆ?ÿçüÿÀ€?ðÀ€àÿþÿx€À<{ ‡‚"¯ïÿÿçÿ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿx üÿ8` 0ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÁÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÇÆ@p|Çÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ?ÿÿÿïàÀ8`<ÿÏÿÿÏÿÿÿÿþÀà`<ÿÿüøx€Àp<ÿŸÿ€üþøà{ÿÀðxÀ8p<ÿŸÿÀøü?ðàÿàxÀp<ÿ?ÿÀðøàÀþ?ÀxÀ8`xÿÿÿÀ?ðÀøx€8`xÿÿÿ€ààü8Àp<?ÿÿÿÿÿ€àÿà0€8`xÿÿÿþÿàÿÿÿ8Àp<?ÿÿÿøþÀÿÿÿxÀ8àxÿÿûüüàÿÿÿ€8Àp8?ÿÿÿø?ðÀÿÿÿx€8àxÿÿûøðàÿÿÿ8Àp<?ÿÿ÷øÿÀÀÿÿþxÀ8àx?ûÿóøÿ€àþü8Àp8?ãÿãøÿÀøxÀ8àxÿàÿÃøþà08Àp<?ÿ€ø?øÀxÀ8àxÿ€ø?ðà€8Àp<?ÿøÿààÀxÀ8àxþøÿÀàÀ8Àp<?üøÿÀ?ÀxÀ8`xüøÿà?À8Àp<<øøÿ€à€xÀ8`x~ðø?ÿààÿ€8Àp|þ?àøÿÿðàþxÀ`xÿÀøÿÿøàþ8€Àp|ÿ?€øÿÿøÀüxÀ`xÿ€øÿÿøàü8€Àp<ÿŸø?üüxàøx€Àp|ÿŸ€øøø0àøx€Àp<ÏŸøÿàøàðxÀp|Ïß3ÿÿÀùøàð8Àp<‡ßÿÿ€ûüàà8Àp<‡ÿÿÿûÿÀà?À8Àp<ÿÿüÿÿðàÀ8Àp|‡ÿÿøÿÿøà€8Àp|ÿÿ?ÿàÿÿüàÿ8Àp<ÿÿÿÀÿüàÿ8€Àp<ÿÿÿÿüàþ8Àp<ÿÿ?ÿ€?ÿüàü8Àp<ÿÿÿÀßüàx8Àp<ÿÿÀüàxÀ8p<ÿÀüç€8Àp<ÿÀüï€xÀp|ø<ÿÀ8Àp|?øÿÀxÀ8pxøÿÀ8Àpx?øÿ€xÀ8pxøÿ€8Àp<?ÿÿxÀ8ðx?ÿÀÿ8€À<p8?ÿÀþxÀ8ðx?ÿàü<€Àp8?ÿÀøxÀ8ðx>àø<€Àp8|ÀðxÀ8ðx>àð8€Àp8|À?àxÀ8ðp>à?à8€Àp8|àà8À8ðp>àà€À<p8~àÿàÀ8ðp?ÿàÿà8€À<p8??ÿàÿà8À8ðp?ÿàÿà<€Àp8ÿÀ{àxÀ8ðpÿ€à<Àp8øà8À8ðxüƒà<Àp8øƒà8À8px€ü?Ãà<Àp8üÃà8À8p8€üÁà<€Àp<ÿÿüÿƒàxÀ8p<€ÿÿÿÿà<€Àp<ÿÿÿÿà8À<p8€ÿÿÿþà<€Àp<ÿÿÿþà<À< ?ÇÀ<ÿÿÿüà<€À?øÿø~ðÿ<ÿÿÿøà8€Àÿ‡þÿøÿÃùÿ€<ÿÿüøà<€ÀÿÇÿÿøÿ?çýÿÀ<ðà8€Àÿïÿïðÿ?÷ÿÿÀ<àà8€Àñïàð?÷ÿÿ€<?Àà8€ÀàÏÀðð>€<Àà8€ÀàÀþð><ÿ€à8€ÀàÀÿàþ<ÿà8À8àÀÿ‡áü<€ÿà<€ÀàÀÿ‡àü><þàxÀ8ÀÀçÃðþ<8€þà8€ÀàÀÁð|<øàxÀ8óÏÀó>x|€øà8ÀÿïÿOÏãÀ?¿÷þx<ðàxÀ8ÿ÷ÿÿïãοçüð|€à8€ÀóþïïóÎ?çüð<àxÀ8?áüîÏãÎ~Ãðà|€?à8€À<ÀxÀ8xà8€À<ÿÀxÀ8xÿà<€À<`<þÀxÀ8àxþà<€Àp<øÀxÀ8àxøà<€Àp<ðÀxÀ8àx€ðà<€Àp<ààxÀ8àx?àà<€Àp<ÀàxÀ<àx€à8€À<p<ÿàxÀ8àxÿà|€À<p<þàxÀ<À<ðÿûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø€þà|€ à0?ýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÏÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÃçÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿü=Çýÿ÷÷ÿÿØx܆à€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùÿÿñ2#(àðàðøðà?¿à?üøð¿€óþ|ÀÇøø~ÿà¿üü?ðÿÀóþþ?à?ïüùÿÿà¾þþ?ð?ÿàûþÿð?ÿøùÿ€þÀ¼žþ?à?ÿà÷üÿð?ÿÀ÷€;þ¿>?À?ÿà÷àÿüð=ÿ€?ç€ÿ€ÿ¿þ?àûà÷øüðÿðÿç€ÿàÿ¿ü>?ðûà÷üüðÿøûç€ÿàÿ¿þ>?øûàóÿüðïüûç€ÿðÇ¿þ?øûàóÿ?üðïüûç€ÿðÇ<>þüûàóÿ?|ðÇüÿç€àðǼþøûàñÿ|üð€<{ç€àðÏ<~þüûàðü|ð>}ÿ€;çðÿ¿þÿøÿàðøð>üûÿßðÿ¿üÿøÿàðÿÿ?ðãüøÿÏàÿŸøÿ€ðÿÀñþÿ?àçøðþÀÿàÿð¿ÀðþÿŸà?óøà<€ÇÀ?€áüÿ€?ãà0Þ<€àþpÀ|Çð ÿðà€<Çø?ÿàÀ8ƒð?ŸàÀ€À0€|Áð8~ÀƒÀ3€~7€üÃø>ÃàóÏø|ÿçñÏÇáààÿ>Àø‡üþ?çÏð÷Ïü}ÿŸÿãßßáàÿñÿŸ>€øþÿ¿çïðûçÏþ}ÿ¾ÿãÏÞàðûçÏ€ðþŸÿæ÷=ãßp³Çÿ?ÿ¸wÃÏ`ðxûÇÏxðÿÿÿý½óï°ñãÏŸ?ÿø7ÃÏŸàðx{ÃÏxð~Ÿýü~ãÏàóÇ?àxƒÏÀðxÃÏxð|ŸÿŸóçðùãÏ?àüÃχðøxÃÏxð|ŸŽ?¿óãøùçÏ=óüƒÏððxÃÏxÿ€ð<ø|?ÀþŸÿýóíøýçÏ=ÿþÃÏ™ðøx{ÃÏxÿ€€ð|øøÀÿÏçýóîøyÿÏž<ÿ¿÷ûÏœðð|ó÷þxÿ€€ðà|ÿøÀ‡ýÿ÷ÿûïøùÿÏþ<ÿóûïŸððáÿ‡ÿþ?ÿ€€ðàpøÀÃùÿÿ¿ÿÿðùÿÇü<~ã÷ÿßàðÀþþþ~€€ðàð ?ðÀÁðþûïððÿƒù¼ãÿ‡Áð|8€üãÏŸ÷ü‡Àðñø?ãùüÀ€àà ÀøàxüŸ÷ïÿ÷þ?ßàø?óüóûþ¿ààðøÀ|ø?ûïÿ÷ÿÿðü÷þûÿÿÿÿààøðÀ|øûçß÷ÿÿÿàüûç¾ûçÿÿÿÀsÀ8À€øøÿçßgßÿÿà|ñçþ|ûïÿÿÿÀøøÿçßÿÿÀýñãþ|{ïÿÿÿ€ðÀøøç߇ÿÿàýñçþ|ïƒðàÀ`ð?ðÀüÏÿüøçßøoðýñïþx{ï‡ðÏàÿÿøà>üÿÀÿƒøÏÿ€üüç߇øÿðüùï¾|{çïûûàÿÿüà?þ÷ÀÿƒøÃïÀþüûÿŸÿýðýûïþ|óÿÿÿûà?ÿ?¾üà~ƒÀÿ‡ðÃÇÀÿûÿÿ‡ÿÿðÿÿÿÿÿñûþÿÿà?~þ€àÃÇÀüàÿÿƒüŸàþ?óÿÀðø>€üøÿà‡ùçÃÿÀ|øÿÿ€óàðÿü?çþ>Àÿà€ýãÃÿÀüðþÿÿ€ÿððþÿÿüï?þ|?€ö€{ÃÃÿÀ~ðÿÿ€ÿøð~ÿÿ€~ïÿ<€à=ãÃãàð|>pà|È>ï?|àÿà<;ÃÇÃàð|ÿÿ€8ð|€ÿÿÿ€>ð?ÿà|@=ãÃãàðøÿÿ€ððøïÿÿï<à?ÿÌ{ãÇÇàøü€ÿÿ€ÿðøxÿÿÿ€çÏàÿïùÿãÿàùø€÷àùñÿ€üÇÿ?þþ=ÀÿßáÿïÿÀøÀàÀøÿÀøÃÿ¿þþðÿÏàïÿ€ðÿ€?àÿàþøð?ðð9à÷€ÀÀ>ðïÀàÿÀ@ÿ€€ ||~ àþþ>ðþ þ~øþÿøüø~?ü>àÀÿøþø~?|>øÀÿüÿø>>~>|À|ÿ€ø>>?>>€<Àø>>?>ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€><Àø>>?>ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀü<Àø>~>>ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀø<<Àø>~>>ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀð<Àø>>>>ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀø<À ø>>~>ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀü<À ø>?~>ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€<ÿ€ø>ü>ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€>€<ÿøü>ÿÿÿÿÿßÿÿÿÿßðx€ÿøþøÿø>ðÀÿøüøà>`€ÿøþ|Àþÿðÿÿàÿþÿÿàþþÿÿà~|ÿÿàÿÀ<€þ~àüÿÿðþÿÿŸðþÿÿßø~ûÿŸð>ùÇÈø>øð>øÃð>ÿÿþÿÿÀÿÿÀ?ÿÿàø‡ð>ÿÿþÿÿÿÀÿÿÿÀÿÿÿàøƒø>ÿÿÿÿÿÿàÿÿÿàÿÿàø>ø>ÿÿÿÿÿÿÀÿÿÿÀÿÿÿàø>ü>ÿÿÿÿÿÿàÿÿÿàÿÿàø|ø>ÿÿÿÿÿÿÀÿÿÿÀÿÿÿàøýÀ|>ÿÿÿÿÿÿàÿÿÿàÿÿàùÿÿø>ÿÿþÿÿÿÀÿÿÿÀÿÿÀûÿÿø>ÿÿþÿÿÀÿÿ€:#èûÿÿð>ùÿßà>üþþþþþ~þ€þ<<þxÀüàÿ€||ÿ€ð?àøàÿà|€€~ÿàðøÿüøÿà|€|ÿðáÿøüxxÿðÀ€>ùøáøüð8|xóñð8gÃÀø>„<>€ñøÃðüà0|ÿÁþyóþóóþ|ÿÏ÷ðþÿŸÿ¿>ŸÀðøÃà|à>ÿãÿ<ûÿ÷ÿþÿÿïÿðÿÿ?ÿ¿<ÿÿÀáø‡ÀüÀ<ÿçÿ|ûþÿÿÿÿçÿøÿÿÏÿÿŸ>ÿÿàðü‡À|Ãøÿ÷¼yþÿÿ?}ÿïßðÿŸùÿŸ?ÿÿÀáø€ø‡ø>ñÿüùàÿÿþù÷ÏðŽÿÏøw?ÿÿÀàøÀüÁøðÿ‡¼yðÿŸýóïŸàÿŸøŸ?ÿÿ€Áððƒà>ñÿ¼ùàøþù÷Ïø€ÿÏø?ðàáøøÃàðÿ‡¼yðð}óïøÿŸüŸ?ñïàÇàƒàÃáü>ñï<ùàøþù÷ßøÿ÷Ïÿÿß?ÿûðÇðÇÇáàããü>ù÷Ï¿ýððÿ}ûçÿøÿÿÿ÷ÿ}ÿÿàÿÀ‡ÿÃàÿÇü<ÿÇþ?ÿðüÿÿ÷ÿøÿÿÿ¿÷ÿþÿÿàÿ€ÃÿƒðÿÇü<ÿÃþÿøüüÿÿ÷ÿðýÿÿ¿Ãÿþ?À?þÃþ3ðÿþxÿøqðüü~ÿûïðøÿïÁÿ>?Àøãÿøðþxø÷ÿñàÿðøÿÿñàÿàüzÁ€ù€ø€€ý€þóÿÀþÿ€?€þÿÀ?þûÿðþÿÀÁþÿÀÁþùÿø?ÿÿÀÿÁÿÿÀÃþøùøþÇÀÿãþ?ƒ€gÃàøøøþ?€ããü?€Çðøøøø~€Ãçø~‡ø?øùøø ~çø|‡ü?ðÿøðÿøùð|ÿþÃü|?€ÿÿÀþ|ðÿðñü?ÿøÿøü?€ÿþÃþø€ÿþÀ~xðÿøñþÿøÿüü?€ÿþ€>ø?€àxøøüáüÿðÿüø?>ø>ÿþÀøðøüðüÿøϾüÿÿ>ü>Àÿÿàxøø|áø~?ÿøÿüü>ÿþ|ø>àÿþÀ<|ðøüñøÿ€ÿøÿü|>àÿþÿà~>àÿÇüùÿüóñÿ÷àÿø~|?Àÿïüü?Àÿøÿÿøÿñÿøð?ü?àÿïüü?Àðûÿðÿóÿ?øÀÿïøøà|ÀóÿÀáÿ€ðà‡ð€?ð?ÿ€à€àÿ€ð?àÿà?Àÿ?À ?ÿ€ðð`ÿàððþÿà>ðð ÿÿà?ððÿ€ÿàð ð0€0xð8>œ?€ÿÀÿà€ðüàüñü?ðüÿÏÀÿø?Çþ?Çþ?ŸÀÿÀÿàÿÀ?óþóüóþûþ?ÿß?àÿøÿïþÇÿ??àÿàÿàóÀóþûüóþûÿ?ïŸ?àÿüûïÿ>{Çÿ9ðÿàÿàóàyóÞ?ûÌóž>ûÏÏð<á÷{ôóž<}ßð=á÷7ãÏžðÿàÿàÀðøðñþ<{øðþ<<ÿà=à÷ãÇž|ÿàÿàÀøÿøðñÿy>÷ž<Ï|pž<ðç>ùãÇžðÿ€ÿàÿþ÷ÿ¾{ž÷ÿ€<{ÿÞÏàŸ<ÿç?ÿóÏŸÿàÿ€ÿàÿþÿÿ¾ÿþÿÿ€?óÿÿÿ¿àÿþÏߟÿÿÿß¿àþÿà€ ?ûÿÿÿüûÿ€?ãÿÿߟÀÿþ?ߟ?÷ÿÏÀpÿàóÿýøñï?Á÷?€ž@<~~> Àðpà?ðøø€€ðÿøððàÀÿü øx‡€ààƒ€ÿþððà@àpÇÀ÷¿ø|ð|x|ð~çÃÀ‡áð~‡øñü?ãøüï€ÏŸñþ?ñüñþùþ?ÿßàÿçñþ¿üçüÿóóþÿ€ÿÿ ?ùÿ?ùþyÿ?ýÿÿïŸðÿŸ÷ùÿÿþçþùóÿþÿÿÿð|óÞ?ûÎóß?ÿÏçð¿ÿ3ÿß<ñç¼|ñçþþÿÿÿðxûß=öyÏ?χ¿ðÇ¿ÿÛƒÿïðó¾ÿãøïø÷ž?ÿÞï?ðï¿þ?ÿÿÏÿ÷ÿ¼yÿþ€ÿþ ?ÿÿÞ=ÿ{ÿÀùÿÿï¿ðÿßÿýÿÏŸÿÿþüûþÿü?ÿÿÿÿþÿÿÀñÿÿ‡ïŸàÿÏçùþ?Ÿÿ?÷ÿüùüøýÿÿÿþýÿ€ðÿÿƒïÀÿ‡çð|¿ãî>øpxàÃ>?? ?ÇÀÿÿÿÿÿÿÿÿÿ‡žÿÿÿÿÿÿàÿÿÿÿ‡ž?ÿÿÿÿÿÿÿÿð€ÿÿÿÿÿÿÿÿÿ‡ü?ÿÿÿÿÿÿà?ÿÿÿÿøÿÿÿÿÿÿÿÿàóÀÿÿÿÿÿÿÿÿÿÁø?ÿÿÿÿÿÿàÿÿÿÿø?ÿÿÿÿÿÿÿÿðñàÿÿÿÿÿÿÿÿÿð?ÿÿÿÿÿÿà?ÿÿÿÿðÿÿÿÿÿÿÿÿááàÿÿÿÿÿÿÿÿÿÁø?ÿÿÿÿÿÿàÿÿÿÿø?ÿÿÿÿÿÿÿÿñàðÿÿÿÿÿÿÿÿÿƒü?ÿÿÿþÿÿà?ÿÿÿÿøÿÿÿÿÿÿÿÿãÀðÿÿÿÿÿÿÿÿÿÇÞ?ÿÿÿÿÿÿàÿÿÿÿž?ÿÿÿÿÿÿÿÿóÀxÿÿÿÿÿÿÿÿÿ?ÿÿÿþÿÿÀÿÿÿÿ?ÿÿþÙøÿøÿþÿüÿþÀüÿþðÿÿ8?þ€ø<ÿ€ÿ<þ€?üx€~ÿþ€||x?€|ü€|>ø>Àøø?Ÿÿø?àø>ð|Àø€ðÏß¿ÿþßð áüÿÿÿÿàø>ð|Àð€ðÿïß¿ÿþÿÿàÿÿÿÿÿÿàÿþÿÿÿÿÿÿÿÿÿ€ÿøÿÿÿÿÿÿðø>ðø€ðþ€ðÿ÷Ï¿ÿÿÿÿðÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÀÿøÿÿÿÿÿÿøø>ðø€ðþÀàó÷Ï¿ßÿÿÿàÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÀÿøÿÿÿÿÿÿðð|ðø€à|ÀðñÿÏŸŸÿÿàÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÀÿøÿÿÿÿÿÿøð|ðø€ð|Àðá÷ß¾ÿÿàÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÀÿøÿÿÿÿÿÿððüðø?ðøÀøðÿÏŸŸøoðÿÿÿÿÿÿøÿÿ€ÿÿÿÿÿÿÿÿÿÀÿøÿÿÿÿÿÿøñøðx> øø?ƒÀøñ÷ß¾ùÿðÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÀÿøÿÿÿÿÿÿðçððøü<ùðÀþ?ù÷ÿŸŸÿÿøÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÀ?ÿøÿÿÿÿÿÿðÿàx?ø?øƒÀÿÿÿçÿþþÿÿðÿÿÿÿÿÿðÿþÿÿÿÿÿÿñ™pÿ€x?à>ñï€üÿãÿÿþÿðþ<ÃÀÿ€øÿÃÿÿü?¿à<ÿÿð?ÿøÀ?ÿÿü<ÿøÿ>8Àÿàÿðÿð>ð>ü?çãÿðÿ€ð>üÿïçÿøÿÀð>ýÿçãÿüÿÀà?üyàóÁÏ|ùÀð?üûàgÃß|û€ð?ü{ÁûÃÏü€ø>ÿÃÿÃßøÿ€ø> {ÁóÁÏø€x>ûÁçÃßøûð>yáóÃÏüxø~ûñãçŸ~ÿÀ?ð€üÿñÿŸ¿ÿÀ?àÿüÿÁÿ?¿ÿ€?À€ü€~xÀøüü?Ÿ¿Àþ€ÿàð?Àÿ¿ÿÿÿ€ÿþÿÿÿÿÿàÿ?Àÿ€àðÿà?ÿÿÿÿþ<ÿÿÿÿÃÿ€ÿÿÿðÿ?ÀÿàÇððÿð?ÿ¿ÿÿÿ>þÿÿÿãÿÿÿÿðþ?€?ÿðÇð?ñÿð=ÿ?ãü~ðÿÿÿñÿÁÿßÿðþ€Çøãð?ñùø<ÿ¿áüà?ßÿøÿÃÿŸåðþÿøÃà?óûøxüãøÿ<Àùð|À?Ïÿüÿãÿïðÿÿý÷à|ÿ÷àüüñÿø|?üáüƒÿßÿóÿøÿø?þüÿãÿÿàÿ>ÿÿÿóþÿÿóÿ?þñÿðx?øãøÿ‡ÿÿÿûÿñÿü?Áÿüÿçÿÿ`ÿ>ÿÿÿûÿÿÿÿóÿ¿ÿñÿðxðáüÿƒÿÿÿŸÿÿóÿ€ÿ?Áþüÿ÷ÿŸÿüÿÿÿ÷ÿÿÿÿ÷ÿÿÿðÿàððãøÿƒÿÿÿ¿ýÿÇï€?ÿ?Áþþÿÿÿÿüÿÿÿÿÿÿÿ÷ÿÿÿÿðððøáüÿÃÿÿÿÿüÿÇÿÀ?ÿ€?ÁþüÿÿÿŸÿøÿÿÿÿÿÿïçÿïÿÿðÿððøãøÿÃÿÿßÿü‡ÿÀ?¿€?Áþþÿÿÿÿ?øÿÿüÿÿÿÿÿÿïçÿïÿÿðÿøðüáüÿãÿÿÿÿþ?‡ÿÀ?Ÿ€?Áþü÷ÿŸÿ?ð?ÿÿþÿÿÿÿÿÿÿçÿïÿÿñÿùàüáüÿãÿÿßÿü?Çÿ€?Ÿ€?Àÿüûÿÿ8ð?ÿÿÿÿÿÿÿÿÿÿçÿïÿÿñÿùàþáüÿóÿÿÿÿ?çðŸ€?Àÿüûþïxð?ÿÿþÿÿÿÿàÿÿçÿïÿÿóûùà?ÿáü?ÿóÿÿßÿçñÀ¿€Àÿüùþçxðÿÿüƒýÿÿóÿÿçÿïÿÿóùùà~ÿáü?‡ûÿÿÿÿü÷ÿÀÿ€À‡øùüàøàÏùÿÿÿûÿÿÿÿÿÿñûûàüÿãü€ÿÿÿÿÿý÷ûÿÀÿ?ÀßùøüÿŸÿøà?ÿùÿÿÿÿÿÿÿÿÿÿ€ýÿûÁüÿÿÿþ€‡ÿÿÿÿßÿ÷ýÿ€þÿð?ÿóüýÿÿÿøÀÿáÿÿÿÿ÷ÿûÿ¿ÿ€?þÿóÃþÿÿÿÿ?€?ÏÿÿÿÿÏó÷üÿüÿðÿãþùÿÿÿøÀÿàÿûÿçÿùÿ?ÿ€?þãÃþÿÿÿÿ?€ÇÿÿÿÿÇá÷ø~øÿðÿƒüqÿÿÿð€ÿ€øü?Ã÷ð|ÿü?‡Áü?€àþüÿÿÿàÿÀ0À€ü€>?ü€>üøiaxmodem-1.2.0/lib/spandsp/test-data/itu/fax/itu4.pbm0000644000175000017500000175231511150047204021733 0ustar julienjulienP4 1728 2376 p€ðÿÀðÿàðáððáððáððÁððÁðpà<ð?À8p?€pðàppàóüþÿñÿÿÿÿñÿÿÿÿ€ÀøÿþÿÿàððþàðpÁððãàþÿÀÿ€þÿÿÿÿÿÿÿÿÿÿÿ‰' Cÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿü@€ ³ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûþÿ¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ@ÄÀ!€@à€€øpð€<€ÀxðÀà€Àøø?ð>ðàÀÀxÀ|€àøðþ€À?ð8€àø€øð>ððà0à<|À€~€àøðþÀà?ðx€Àx€øððøà8à<|À€€>ÀxpþÀàðx€€x€pððxà8à><À€€<€p€€ ÀøÀàðxgüáÀxÿà€aÀïøÿð`0Àxà<<p€Àg€xx€?àðàóàüðÏ€qððøüø>>?àðÀà8àð€ðø?À?ÁþÿƒþÿàÀx>ÿ‡øñðñÿðÿþÿ€ÿÿÃÿ€ð|üð?ãàÀçàðøà<ÀÁüðüðÿ€þþÀñøùÿðüü>>ÿÀqðø?üþü>>àðÀ?ç€ÿçÿÀÿÿøðÿàààÿñøøüàÿáÿÿ‡ÿÿðàÿ€x~ÿüóð?ùÿøÿþÿ€ÿƒÿãÿàð~þü?çà?ñÿð?øÁþÁþà<ø?øÃÿðüøÿÿƒÿÀùñøýÿø>|þ>ÿàðøx<<ß<ðÀÿ‡ÿÁÿçÿÁÿ€ÿüðÁÿð?ðàÿÿüüü?àÿñÿÿ€ÿøñÿÀx>Ïþáø?üÿøÿ€ÿÃÿóÿàð~ÿþãð?ùÿðø?Ãÿáÿà<ü?üÇÏð?þ><߃ç‡Ç‡Àððø><~x<ððpxx<ðÁÿÇÿãÿãÿãÿ€ÿþðÿáÿøøùðÿÿü>>?¾ððx‡‡€|ðøùóÀxƒ€ø|<|x‡‡€ãÁðñððð¾ðxxüøxxƒÿƒàüà<>?>LJƒ€<<<‡ÃLJÀð`xxx8> àððpx?ÀðÃÿãÿãçáûçÃÀðÿðüø|yðø~?<?ððxÿ€|ððyáàxû€xx>||ÿ‡ûãÁàñàðððø|øxx8Çàxà>>χƒ€||>‡ÃχÀÿ€xxx8?ààxppx?ðþðÃãáùçÃáñçÃà?ðøðøxøyÿø<>þÿøxŸÿ€xÿøÃàxÿÿ€xxx|ÿ‡þÁàùàøððð<øxÀ‡€àxà<<Ïÿƒ€xþ‡ÿÏÀàxxx8øþàxðpxøþð‡Áññçáðÿà>?ÿðpðøxø9ÿø<þ>ÿðxŸÿ€xÿøàxÿÿ€xxxxÿƒÿÿÁàùàøðÿðð<ðxð€àxà<<Ïÿƒ€xþ‡ÿÏÀàxxx8üþàxðpxüþðÁñðáàÿà>?ÿðððxøÿø<þÿàx€xÿðÿàxÿÿ€xxxxÿ€ÿÁàyàøðÿðð>ðxøÿ€àpà<<ÏÇ€x|‡áÀÇðxxx81üþàxðpx8<ð€ÁñàƒÁàÿÀ<?þðððxðûx~<ðx€øðÿàxŸþxø>xx€÷Áàñàððþðð<ðxoøÿ€àpà<<Ï€x|‡€Ààðpxx88àððpø8<>`ð€ÁñðáàÀ>>ðÿððxøð<>ð xƒ€xðáàx‡ß°xx>x8‡€ÃÁàñàðððð<ðxp8ç€àpà<<Ï€€<< ‡ÀÀððx<>x8<<?ðððø>|ÿðð€ÁñàƒÁàÀ>>ðýððxøø0x<> <Àøð{ï€øø3ãàxÏž?ðx||xxÏ€Çáñññðð‡>`ðø|ðxxx‡€àpà<<ǃ‡°<<><ƒÁ‡Çƒáÿðü>|ø|?|ÿùãü?ü?øŸŸÿÿ‡àð€ÁñðÃáðáÀŽðððøx|8ÿð|>þ>?àÿð€ÿÇÿ€þóÿûÿÇÿŸÿÇñþ?ýüþÿ‡ÿÿ€ÿùÿáÿçþ‡ÿ‡óüøøüøÁðð>?>ÃÿƒøþüÿÁÿƒÿøÿáÿùüþ?øÿÇÿ€ÿÇþü?ð?ŸÏÿ‡ïàøçãðÿçøÿÀÿþýûýøüøÿðþ~?üààÿÃÿþñÿÿÿÇÿÿÇóþùüþÿƒþÿÿñÿÁÿÇþÿÇþÿÇçü?ñýüø?Çÿçøüü?üÃÿðþøÿÁÿþøÿÃÿñüþ?ðÿ‡çÿƒü0à‡‡€€ÿÿ€ÿçüÿ÷üÿ€ÿ‡þþÿÿüþ?ø?àþ?ø?‡ÀÀ?ÿÀüüÀÿûÿÂ~÷ãþàü|çø|üáççüüÿÃÃþáüüð?Ãÿçü>üøøÀüðÌàð~x°øÀàÿÿÿÇüÿçøÿÿ‡øþÿýøüàÀþ~à>€x`9ààÇ€ø€Àƒûçüøðà3À@àÿþø<@>8àà=ÀàààÀððø?Àøðð?€ðÀÀà€€àpà@æÀàÿÿ?€À€x`À<à`øü?ÿà?ÿ€ààÿÿ€ÀÀ€À?ïÀ|pààðøü?ÿÀ<ðÿ?Ààÿÿ€>À€€À<ÏÀxàààø|þÿà<ðþ???ÀàÇÇ€~À€€À>?Çà|pàà>ðxð<àð||Àà>‡ƒ€øÀ>ÀÀx€?AðàøÀÿ€þÇø8ø>üàÿ€ð<€øà€ð|<|à€à€à‡Ã€üÀ€?€ƒÿÇàyðø>><øðÀà€xðü?€€Áóãþðüþøÿ€|‡ÇÁÿ€ÿçü|þ?þÿáÿÀÀ`ðøÀÀøx>øø?Ãà?ÃÿààÿÿÿÿƒüÀÿÀÿáÿÀÿàƒþÀÀÿÁÿÃÿÿðÿü~~üÿþø|øÿøþÀÿàxøþ€ÀÿÃÿóü>xüÿüÿ€ÿÏÇÃãÁããø|žþããÃÀÿƒñü~?ð?Áñøü?àø€|üÿüü?ãð?óÿðàÿŸÿÿÿÇþáóàÿá÷áÿðÀÿÀÿàÿáóáÿÿøÿþ>?þ€ÿÃÿø|üüþàÿà8>|>€ññáÿðð<<羇€ÿÃÁÃÁÁàààÁãÁàÿÃñü~øñùøüðü|üÿŸ>þ?ÃðÿñÿðÀçÏσçÃÿÇÿÁáàáãáááàÀ‡ƒÁðñáãáðøøx>ƒããσà|üÀøð8<<ðñàð|ðð|<<ƒÏƒÃÃÁÇÃáð`àçÿàÿÃðü~üøñøø|üøxþ€||ÿžðøøüøàÃïLJÃÁóÇãáðáããñøàÀƒÃÁðñàóÀððxxƒáãÃÀ>àøð8|>ðñÿðxpðþàƒÆùÁÃÁÇÿáÿàŽ€çÿàóÀð|xø|xøxxø|øx|<Ï>ñð|ððÀ?‡ãÃãá‡ÃÿðÁãÿñÿ€ÀÏÃÁÿóàCÀðàpx<ƒÁÁƒƒÀ><àÀððþøàcÿððàüøƒÀþþÃÁÇÿàÿÁàŽçÿÀãàp¼øàððþüàÿðpðüüçþÿÃÁÇøÀààŽ€ãÀÃàpñà|ðxà‡ÿï‡ÿÃÀÿãÿ€ÁãðàÀÿƒÁÿãàÀððpxƒÀÿƒÀ<¼þÀàð~þààpà|üƒÏþ€ÃÁÃÀÇáÀŽãÀÃàxpÿü?øxxð<ÿøþ€|€?þñð<ðxàÿLJ‡ÿÁàÿãàÀãàßðÀ€ÁðàÀððxxƒÀÿÁÀ<¼þàðð| þààpð|ƒÏŽ€ÁÃÃÀÀààŽÁãàÀÃàxàøøxxð<øþ€ø€>ñð|ðxàÀ‡‡ÀàïÁð`ááàAàðÀ€Áððaáððpx<ƒàÃÀ>¼Àðð<ð!ð`pæ><ƒÞ‡€ƒÁÇÁáÁááìãáÿÀÁàxàøøxxð<øþ€ø€ðð|ðxðà‡‡ÀàáøàãññáððÀ€Àøqðñóáðx|>?àgÃÈ<àðð>Àøpùðøþ?ü?~ÇŸ?‡ï€ÃÁÿáÿÁÿàü>ÿ€ÿðÿÀÃàxà|8øøxøx||8ð€ŽàðøøøøøñÏÃãÇðŸÏøÿàÿðÿáÿàðçŸðÿðÿàÿãýüþ?Ÿÿ¿áÿçÏáü?>ŸàðøüþÀðãþ~ø?üÿÿÇÿÿÁÿðÿÿÀü‡þ?Ÿ€ÿðãàøÀøùþüüø?Ÿ?€ÿð?àþÿãüùùü~?ÿßÏáÿÏøÿÿüÀÿøÁÿà?øÿŸøààÃýüü?Ÿ‡ÿÿ¿Ÿðÿãÿñüþ~?þ€ÏøùøøüÀ?àÃþ~ðøÿÿÇÿÿÀýð߀xü€<`çóþÀ?øþ?þ?þ?ðÿßÿÀ?ÿÀÿŸàüþçþ?áýü?ÿÿŸÏàÿ‡øÿïø?€>à?߀øþø€Ç?ŸðƒÿðøÿÇü?ü€?ÿüùøð ø€€ €€Ã9À÷óÿ€ðþ?þþðÿÏÿ€?ÿ€ÿŸàøüÇþÁøüû€€~ûÇð<àùàpÿø~ ø€?ÿø€ÀãÃþ€À?¾€‡ç€€€ÀàÀÀÀàÀà88xx€x|xx‡€Àðxx`p0Àðxxð>€À|ðÀ<à0<|àø88øÀà>ðà>À|àp|øàðxxð€à>à8ðà>àxøøàx88pà<€`À<à`ç€à>àÀpðà àð0xøþÀÀxïøã€€þpðþßüïÀð àà€àcÀüàï¾xàþ~ÿ€xàðŸ€>ðüþÿ‡ÿ€ñðøð<ø?ƒÇðà?€þð¾ßþþþÿþ¿€ÿÀÿàðÿƒøþüÿÿÁÿÿà>߀Ãøxñðð0>øÀÀÁààÿÇø?€qáðøÁÿãþøÿÿüøþÿÿÀððøÿÿ€ÿð?üþƒÿ‡ÿÀÃñðüøüÇßøÁûðÀüøÿÿƒþÿÿÿžÿ€ÿàÿƒÿàøÿüÿóãÿýàÀÇÿÀçþÿùø~ÿ‡þð?ðÿãùùÿçü?àÿûüüáÿóÿþÿÿþüÿÿ€ÿàx?üüÿÿÁÿÁø><σÃÃÿÀáðøþþ?þ?Çÿãÿàÿøùàþ><ÿÇÿÇσçƒÇƒ÷Àðñ÷Àüð<<<¾‡žàóÀùàÿÁÿçÿáÿçüÿÿùø~ÿ¾?øð÷ãñûÿÇøùðÿÿü>áÿñü¾=þÏ€ñàp||<<ããÃçÀð>ƒ‡ƒÃãÀùàððžûÇÿà~ùàà<<|<ÃÃ÷χ‡‡ƒžƒç€àñãÀøà88¾ÆÀóƒ€ðÀûáûóÿáññø?þøx>ÿŸ><øxááðóááàðx~?>àüxxž‡‡‡€àðxx<>Ááááàx?ðƒÇÿãáàpðpxñãÇ€à>yàð<>~ÁáãÏǃ‡ƒÞÿƒÃàxáÀø`?>8¿ÿüàp€ðáãáóñáðáà?>>àøxð>ÿ‡€àðxxxƒÁÁÃÀpøƒ‡ÿãÁÀððp<áÇà|qÿðxþãÀÏÿÜÿƒ€àxÀðü8¿þþÀñÿ€àáãàùááÿàðxxÇÿ€|<ÿüÿ€xÁÿàÿø<?ÿàøxxÿžÿÿ‡‡€àxxx|Áà?àxüÃÇÿÃÁàðpxžà€à8ÿð8þÁáÀÏÿÞÿÀàxÀðü8ÿßÿàsÿ€àÀÃÀûáàÿÁàxx€?ÿxÿøÿÀyÁÿÁÁÿø8?þàðxpÿ<?þÿ€àðpøxƒÁáÿÀp;üƒ‡ÀÁÀððp<žàÿàxÿàx|ãÀÏ€€àqÿÀðx8þ¾À÷Ç€ààÀùáðààxx€ÿxÿøà=Àÿáàÿp<?àøxpþüŒ€‡€àxxx|ÁÁáÿÀx<ƒÃÀÁàÿðpxžàÿ€à8à8<áÀÇ€€ÀàyñÀp<8ŽžàóÀàÀÀùááÿñàxx€xøŸà?¿áÀð8>àðxpø€àðxx>|ƒÁãÃÀp<>ƒƒáÃÁÀððððàÇàxà8< ÃÀ‡‡€‡€àóÁÀð<;žŸñçãøààùáñàðàxx€|øÀðÁáàø<àøxrðLJ€ððx<>>Ááãáàx?þσÁÿÃáàððyøAà‡€à8øp<>Áãà‡‡ÃÃÁÏÿ‡ÿ‡àùñãáü?ž‡ßþÿ€ÿãÿóüðaáóááññî>yø€‡<|xáàááüøp<àøx?€ŽÿŸÀÿãþ?üüçãóÿóþ?øÿñÿ‡çðÿüüÿþ??çðƒðþÿàþüÿÏðÿÿƒÿ‡ÿƒþðÿáÿûüøÿÏþøþ€ÿƒÿãøùñûóññÿðþ€üàÿ?>øÿàÿáüð~?þùüüÿüÀÿÿÏàÿãÿøüçóñÿûÿøþø‡óøÿþ?üÿþ?¿çøÿçýÿàÿøÿøÿÿÿÿþðÿÁÿûüðÿÇüø|€çøàÿàÿçóùÿàþÿ€?þßðþü?ðÿàÿÁü?àÿ?üýýü~þþÀüþÏÀ߃þàðÇáÁÿñþàÀÀ|8üü?‡Çøÿçýþ€Îàþ`x||àø`ÀàÀÇóùÿà~ÀþßðüøàÿÀÿÀüÀ?øüüüüÿ€ø0x `ð€ùçüÀà€à€8€`ÀÀÿ€ààœ<Àð€ øœ>àøÀðüÿàø€øüðøÀ ~€àÀ`ðø€þÀ`€ð|à>`>ø€~ÿÀÀ|Àà€€ð8|à<à|øÀÿÿÀÀ|?Àà€€ð8<à<ÿ€àøøÀÿ>ÀÀ|€à€€ðx<à8> ÿÁà Àðòðøøÿøï|ÀÀ8àp8ÿÿøðÀðx<à8üxŸðÿÃü|øàÿÿ<>>üü?ÿÿ€xð0pð æ€xÀ|À8ðàü€ð=ø€?€~ü~þ?þÿ€ÿƒþü?ðð?Àùð?Á÷Áÿ<àà0À~ÿÿÿþ??ÿÿ‡üÿÇüü?ðøÿÿ~>ÿƒþž?ÿãÀÏx<üÿÿ>üøøÿÿðøøÁÿÿø?øÿøðþàøø€ÿÀÿ‡ü~ÿ?þÿÿÿþ?àðÿàÿøáÿãÿð?ø>àøÁÿÿÿÿ‡ÿ?ÿÿþãÁø?üxxü>ÿ‡ŸÃÀÿÀ€x~þÿƒÿ€ÿ¿?ÿþþÿ‡ÿ‡ø?üøƒÿ‡ÿïøÁüüøþøþ?þÀùáÿÁø>ϟχ€Ÿž€ðùðüøñÿñÿø?ü?àü?ç€燇€çLJçƒ÷ÏÁàà>ÁñáãÁà‡žŸððà?yððüðxü><àxÃÀÇ€ƒÏǃçÃáà<ÿüÂÂÇ¿ÿÿàýñÿàx?‡÷LJ€‡ÇÏŸ‡Áàx8ðƒÁûãÀùð|?ø|<<ÁàñáààÏüžÞ€ðpð>yøøøxx>à<ÁàƒÿÀïÏÁÀÿààÿüþü€ÿ¿ÿÿàðñãÀð‡çƒÃ‡Ÿ‡‡à|8ðÁóÃÀñà8>=ÿüä<<<<ÃààÃÁàÏþžžðð<1ÿøððp<<à8Çà‡ÿ€ïÏ€Àþÿáàÿøþþ€ÿ¿þüàxáàxÿƒÃüþ‡Ÿÿ‡üüÀà?ððÿáðÃÀ`ð<>ÿüüüÁà?ààÏÿžÞðð<ÿøðxx><à<ÿàƒÿ€ïÏ€ÀþÀàøþÿÿ€Ààøàð?ÿ‡Àÿÿ?ÿþþà?ððÿÁàÀà8ÿ†ÿàwüøÏ€àÀÿà8<>à~x<<ÁàcãÁäž`ñðð8ð ððð><<à8€‡ƒ€ƒÏ€€ñÁü<|x~€ƒþ>ÿÀàyûàx€À€ƒÏ€€ƒÀàx<|ÇÀàÈðð<>p<<ÀøóãàþÿƒÀÿÇß¾ðøûü<üððx{<>àÃÀÀ‡Çÿ€çÇï‡ÿððÿÀÿÀþ€ø?ÿÿÿŸàÿþ€?¿ÿ€ðóáàø‡À‡€‡?ƒ‡Ÿ‡ƒà||~ÇçÃàùáð<<>à?>|þ>?þÏðÿãÿñþÇÿ?ŸÏÿÀÿÇþ?‡ðüÿüÿñùü<?|øþÃçÀÏÃÿÿƒÿÿŸððÿ€€üÿ€àÿÏþþïàþø€?þùñãûþÇÿðÿ€ÿÇÿ‡ÿÇÿÿÿÿóøü?ÿÃÿÃüüÿüÿÿ>?øþ?ÿüüïøáÿø~ãþ?ßÇþàÿÁü?¿ƒðþüÿ?áýü?ÿ¿ü?ïüÿÀÿ€Ïàþÿþ÷ðð÷€8#€ÿÀx8€x€ÿãÿÿÿçþðÿÿÿƒÿ‡ÿþÿÿÿøø>ÿÿ‡øùÿýÿÿ~?ðü?ÿø?øßø?ÿðxÀø0ÀÀü>8þÁøø>ÿ;ø?ïùÿ€ÿ€0€pƒÿáÿÿÿáüðÿÿÿÁÿÿüþþÿü?ð>þøøýÿÿ>àøßàx À ÇÀ` €çþù?À €xøà0ðp>ð<8þ€€€ðÀà~àøàø?>øÀ€ÀàÁðàà``?€Àðáø€àà<Àp?pÀÀð`€€ãø€àà<àp€à€Àðð€Àáü€àð<àpÿÀàÀÀðàð€Àà<€Á€ø|pÀ<ðàÀðÿÃøü|þþð÷çãÿðþÿüñÿðÿþþÿ‡ÿàøø€?ÇÀÁÿà?ðüøü?çÿÃþÿ?ÿÃüþ|xÿÀÿÁÿÁÿ€ðxðÿüÞ€ðÿÁÿà?Çÿƒþ?ðàüðÿðÿŸ¿üüÿáÿà?àøïÃÿà<ø?ÿþÿÿðÿ÷ãáÿðü?þxxÿøÿŸÿƒÿÇÿÀðüþøÇÀáÿððüü|?ÿóÿãþÿŸááüþx8ááñãÿ€ððx?ÿñÿãÿðÿçÿÇþü?ðüøÿøÿŸÿþÿÿ€ÿãÿÿà=àþÿÏÇÿà<>|?ÿÿÏ€ðñáàüðà<ø<|x<ÿñãÿàð|žü‡à|øüððp>|<<ðññàðÃÏÁààð<‡ÀñàãÀððx>ÿññññÿøÿ÷ÿãüþð><|xÿøÿÿŸÿŸñããÁãà9ðþ?ÏÇLJà<<<χ‡€ðqáàxðà<øüxx<ãÁàñáàà<<àðxøpðp<<<<àyðàðƒÏÿààÿü‡ƒÀñÀóÃÀðÿø<?ÿðóáð|ùàóñàð>xx>ø|~|<瞇‡ï‡àçƒÁààxðÃχÁà<|>‡Ÿÿ‡‡€ÿáàøàÿüxx<ÿÃÁàñÀðààðxðpÿx<<àyààðƒÏÿààÿü‡ƒÀñÀðÀðÿø<?þÿcÿð|ñàûáàð8x?Œÿü|<<ÇŸ¿‡ƒÇÏÿgïáü@pðÃÏÿÁà<þŸÿ‡€ááàðàÿüxx<ÿÁàñÀððàà<ðpàx<<àyààðÏÿààÿøÃÀñÀðÿÀðð<>ÿÃÿðxàùáàðøøÿüx<<ÀÿƒÇ€€ÿÇÿáÿ€ø>ÃÏÿÁà<üŸÿ‡€?ñáàðàøxx<ÿÁàñÀððþáà<ðp?ðx<<àyààðÏÀàøÿƒÀñÀóÿ€ðð<ÿãÿðøÀùáàð<?øüÿðx<<€ÿÇ€€ÿçÿÀÿÀÿø>ƒÏÿà<🇀Ïñáàðàøxx8ÿÁàñÀðà<þáà<ðp_ðx<<àyààðƒÏÀàxüƒÀñÀóã€ðð<ÿóàxàùáàðøþøx<<€ƒÇ€€ÿçÀÿàÿø>ƒÏ€à<|‡€àqãàðì|x8<ãÁàñÀððþàðxðpàxx<<àùààòƒÏààæ|8€Ááááダð|x<žàãóàðàûÁáà<üø8~øx<<€Ç€Á÷ÀÃàà|>‡Ï€à8|ƒ°ðñçàøþ~øxx;ŸŽÃÁáóáààAàðxðpðxx<<|ðñáàþ‡Ï¿ÿàþ??ø€ñóáûãÇãüð>?þ?‡àðñðàxàñáàöøx<|x<<‡€ƒÇ€à÷áÁáàà<ãÏÇÃàáàxøðøÿð<|þÀóóøþÿ‡ÿÀÿÀþ€ðÿøÿÁÿÃÿ÷þà¿ø?‡àûñÿàøñóãáþ>ùþ>>ðx|?ÀŸ‡€ûã÷Ãóà`À<ãÿÇÿùÿ?ü?ŸÇÿŸÇðxÿàÿóþüÿ€ñüþ?‡üÿñÿãÿÏüÿÿçøñùøÿð?üþ?àçóø~ÿÿ€€|€àÿŸð¿ƒÿ÷ü€~?àÀÿàÿáþÿçóøþþþ?ü?ð|~?ßðÿÿŸàñÿáÿÁÿàðàþáÿãÿÿÿø?ŸÏÁþŸÃðxïÀ<àü8€x|ðÿñÿÿþÿƒþÿ‡Çü?áùüàüž?àƒñð<œÀÿ€ð@ÿÀÃþÏ÷ðþ?üþ?øà|þŸðüÿ?àñÿÀÿÿÁððÿ‡üÁÿáþÿÿà?ŸðàxøáÄÎøÿøÿƒ‡ø€ð<€€€øƒáÀ<ðà€<àø¼Àð<øðÿø€p0øàÀ‚€€<ððÀÀ<€€€`àðà>àÿ>€ðð~ÀþÀðð>Àð`|€ð€ðÀ0<À~À` ÀÀ€€øÀø>àÀ?€À€ø~À|þÀàÀ>À€€pÀð8|ðà?ŸÀààÀø>à|?ÀpÀàÀ€x€`8xààŸ€ÀàÀxà|€à<À€€ðp Ãþà<ƒÇ€ðàŸÀÀàÀ8à<€ð?Ï€øà`€€ààÀ÷€x>|þŸxÀ<¿€ƒçÁðÿü߀‡Ãïàà€ó ðàÀxààxð<9àþ‡üÀÿ€ÿÇÿÀü|Ÿ€þüÿø?àøþøÿÀþ~ð~?ü|ÿþÿ?þþÿ€pàÿÿ€ÿÃÿãñÿþÿÁÿ‡Ãÿà?ð€ø>€€?àÿ‡ðàü|?à?üÀÇø x?Àþøà<ø?øÿÃþðÿÀÿãÿà>|~Ÿ€ÿÏÇüÿüð?øÿüÿÁÿÿø?þ~ÿƒÿŸÿŸÿÿ€x?ðÿ‡ÿÁñàÿñð<‡ùááÃÁÀýàÿàãü~ÿÀÿÀðÿÃûðþ?þÿàÿ‡ÿÇüø>?ÿïøÀ?øàþøà8?ø>üÿÁü?ø<ñññà<<~Ÿÿ‡ƒÃð?üððxx<ÃÃïÿƒà|<‡‡Çƒç€pxp‡‡çƒÁàùàð8€àãÁãÃÀñàÿð?ñþÿÁóàÿðÿãùøß?ÿÿàÿçÿãþü??ÿçøàøýðþ><à<<<<‡ÃÀðáãÀùàøùðð><à8|>øÃÀà<8<ÃÀñáà?àøÃÃÁÀ>8ÿøÆ?þð‡ƒÇ‡ƒ€χÿƒÂpøƒÇ€ƒÀððp8ÿ€Àw€ãƒÀàáðøxpǃÃáððpÃÀÀðááóáàààáÀøðøyðø<>>àþðÃÀð<ÃÀùààøøƒÃÃÁà<ÿø?àø?ÿÿ烃À8ç‡ÿƒÀxøÀÃÀððp8ÿ€às€óÁÀàÁðøxp‡ƒÃÿðÿ€þÀ?€ÿÿÀóááàÿÀpððyÿø<þàþàÃÀàø<ÃÀùáàøøÿÃÃÁÀ<ÿø?ðþ?þÿ燃€8Ç€€x?øÇ€ƒÀðàp8€ÀóãƒÀàÀðÿüp‡ÃÿðÿàÿàÿÿÃÀûáàà?ÿÁÀðð9ÿø<þàüàÁÀðü<ÃÀùàà3üüÿÃÃÁà<ðøÿ>ÿÇ烃À8LJÀx|xÀÃÀððp8àsãÃÀàÀðÿøp‡ÃÿÀðÿàþãÀóÁáàþãÀððyÿà<|à|ðÃÀà?ø<ÃÀñáà8üóÃÃÁÀ<ðp| <ƒÇ燃€ð>ǃ€xpxƒÃ€Áðàp9€àóÁãÇÀàÀðýðp‡ÃàÏðÁà?€ŸóÀñááàþŸáÀððyð<<à<øƒÁÀô|<<ƒÁàñáà<žÃÃÇÁì<øx<Áçƒçƒƒ€ð>‡‡ƒÇ‡ǃÀxxøƒÇÀÁááðp?‡Ã€ññãáÿáøÁðøp‡Ãà`àðÁÀÀÀóÀóÁáàÀóÀøððyð <> à>|‡ƒÀþxx?ÃÁûãñðp?|Ÿ€ÇÃÿÁü~|x|xããƒÇ‡ƒøàþÿÇÏÿÇÿðÿþÿððÿÃüþ?ƒÿ€ÿàÿÁÿãüáðøx‡áðàððƒÁà{à‡àñàñááìàñÜððøxøp>?àü>>?Çÿ‡øþ~ÿÏøÿçóøø?üßßÀÿñÿáüÿ€?ðøÿþÿÃÿÏÏãøàÿÿÃÿŸÏÿßÁÿðÿþÿðøÃüþÿÿÀ€ýãüÿð|xøŸÏÃðÿàÿðxÿÃûóðÿ€ÿñóããñþ?ÿ€ÿáüñüüÿðÿüüüüãÿø~?ÿøƒóøx?øߟÀÿñÿàüÿ€àðþøÿÿŸÏáøÀÿÿÁþÏÿÀüðþœ¼àð0þ|æÿøùþ?ÿÏïøÿàÿð|ÿÿûøÿ?ŸÀÿàÿçóðþÿÇÿÀÿáüÿþ?þðÿøüøøáþø<ÿðxàÏ€ýðxàx€#àüð¿~ÇÀðÀ†`|€àøóþÿÏÏø?€ÿà|ÿÿûøü?ŸÀÿÀ‡óðüÿÃÿ€ÿÀøüþÀÿðøÀø €à`áü?îø€<ø`À€8çÇp?<˜ð€àxàÀðø>Àðð?ðÀðÀp€øàxÀø>ÀøÀx>àxÀxÀxÀ <xðøx>|߀|páðü‡€?ƒß€x?ùøøþÿÿüÃðüàÿÀÏÿ€x>|ü|?þÿÁÿƒÿáø~øÀÿ÷ÿÀxx<<žãǃLJàx> <<Áàûáàxüx< Á‡ÿÇÀx?ð<8<ÃÀûÁàxþ<<Àÿà?àxü<Ãà{áàx~8<ÀÿÃÿÀxüü<ÃÀûÁÀx|<<ÀÀÿàxþüÁàyÁàx|<|ÀÀ‡Àx<>|<ÁàóÁàx?>üàÀ‡‡àx><<ÁÁðñáàÿü?þÀðÿÏŸÿùþ?ü||?ÏðÿçãðxÿøþÀøÿ‡ÿÿýÿü?ÿÏøçóðxÿàœ?€ðÿÿÿùÿð?ÿø?‡ãðø<ñÀþ@ßð øp€€€€`À À‡€ðà<|?xÀÿÀ à?øà<|?ø€ÀÿŸÀx À‡€€ðøà<<x€ÀÿÀøà`?‡À€ø¸à À8|ÀøÀ`‡€€|à<Àx?@`àø|à}ÀþÀø‡À0Àà{ƒ€8üÀ?à€ÇçÀ?üà„ >øÿøø}øþðþ?óãàÀ?ÀÿÀðñðþ~?ð}ùüþ?þðÿÁÿ€ÿàÿð‡øÀ<àp<x |þ|þàÿàÿÀÿÃÿàÿÃü?ðÿ€ÿüÿ?üüüþðøÿ÷çàààÿÀÿðÿñðþ~>øÿþžþàïÃãÀóáÿ€ð‡þüûƒþøþþÁðøÀÿ€‡ÿ€ÿ€ãüàà÷àü€?ÿþŸŸÿÿÿàÿáóàÿáÿñ÷áüxx€ÿŸþþüüü‡€póáà|ðøñáààðàñð<‚ž†‡Àþ1ààðñàñÿðÿÿx8üÿÇÿàÿƒÀàÏ€ŸÇÇÇÃÀð><>ø<ÁáóãÀÁáááà|xxxüxxáç€Ç€‡ÿ‡ÁãÿààððãÀð<ÿø<‡?ÿø¼<øÿ€ÁááàqàcÿðÿÀÿÀppÿüÿÇÿÀÿ€Àà‡‡‡ÿÀ‡‡ƒçƒãÀx<<ÃÀóáàóáø`àx|øÿ€?ñàáààÿàà?àxp€€ÇÀÁÿÀà€ÿ€ƒÇƒÃÀp|<<ÃÀóÁÀÿáÿàðxðxxxƒÿÿÿ€ÿ€‡€€ÀãÀàxðÀð<<àyááð1ð1àáàñàðpÀ|`ƒÃáÀÁ烀ð‡‡Ï‡‡€ÿ‡ãáÀx>üÃÀûÁààÃðàxð>xxxƒà€À‡€Ç€ááñàðððáà<~x=À€€Ž>‡ç€øøÿàøxøðÿàÿðÿðxÀ?ø>ÿŸ‡ðÿáÿÀÿãïðøƒ‡ƒÇƒÃÀx<><<ÃÁóÃÀàÁÁáàøð?þ?ãÿ€ÿðÿðÿððÿáÿáÿãþ€ð?¿‡þ?Ÿ‡àÿàÿ€ÿÃÿð‡ÏŸÏ‡ÿ‡ÿ€‡ƒÃÃÃÇðx<<Ãáñóáàùáñðþ|<||x|xÁðã÷€ÏàÿÿÀÿŸŸÃÿàøÀÿãþÿÀð€Ààüþþü?þÿŸü?ñÿàø?à?à?€ÿÀÿÃÿ€à?Ÿ€øŸà8À>ŸÿðþÏÿÏÿÿÇÿÿÇÿ‡ÿŸùþü>ÿ?ñÿççðÿÁÿáþøùøÿþáÿãÿ€ÿàÿÿŸÀÿ?Ÿüà~ð?ÿƒü<ÀÀàðøxø~> øÿ›ð?àx€|à€þøÀüÏçÿçÿƒÿÁþÿãÿƒÿŸùÿü?ÿŸøÇóðÁÿÀþøñüÿþøÀÿÿàûÿÏÀ8àœÀ‡ðÇóïãxÿǾ¼óþðÿð?ÃÀ>ŸxàÁøÿüð?€xà@ༀ€àƒ€€àü€€€ðø?€€ÀÀøø?€ÀàÀààÀàà€pà`€À€x‡ð€þpàÀ€ðà80€€þpð€À€ð€ð8p€€þpà€€ Àðxðx€€ððø>À~€!Ààðà#€}Ã?€8p€ðxðÀÿøp€<ü üþƒüÿ‡üà<}øø€ÿÁÿ?áÿàüø||~??~øÿüÿÿ€ÇçÿÀÿÀüðÿ|þ?þþà?ñÿü€Ã€?€ü|8güÀÀpðàž< 8<€ÿþ>ÿÿÿÇþÿ‡þÿðÿÿþÁÿáÿ€ñÿðþü||??þüÿƒþÿƒÿÀãçÿÁóàüøÿ~ÿ?þÿ€ð?øÿ?À?ãÿààáÿãþ?ÿ?þÿƒþàÇÿ€Àÿð?ÀÏÃÿüü?þøÿÿþð?þÿÿÿÁÿƒþ>ÿŸÿáãüÿññÿ€?ÿþÁáãÃÀðxþø><<>ÿ>‡‡ÿçƒÃÀáãñááà¾<8>€ðxx8?àóÿà?àÿáÿóÿ?ÿ¿ÿÿ‡ÿÿðÿçÿÀ?ðÿøàÏçÿþþ?ÿþÿÿÿøÿÿÿÿáÿÀø?‡ÏáàðŸàáóÀÁàçÁÀðx|x<Ï<‡‡Ç‡ÇƒÃÀááááàð><<ƒ€ðp<8>xðùñýð}ñððÿøüÇßÏ€ðññãÿÀðøð‡ÏÿÿŸ¾ßüÏǃáñáãÀðχ€áðàŸÿ€üaáÀÁüGÿàÿøxx¿ÿŽ?þ‡‡‡‡ƒý€áááãÿð<<ƒ€ðð<8?ÿðððyððøùàøøxxƒÏ‡€àáàóáàxx|xxð‡‡ïž<‡‡ƒáðááàðÏ€ÿðàŸÿ€ÿ€ÁÀÁÿ‡ÿàÿøxx>¿þ?þƒ‡‡ƒÿàááãÿð?þ<üÀðð<8?þðñàyðððñÿøð|pƒïŸÿ€ÿàóáà8xx8xpÇÃÿ‡‡>އƒÁàà?àðÏ€ÿààŸÿàÀÀÿÇÿÀÿøpx<¿þ8?þ€ÿ‡‡ÿ€àáÁãÿà?þ8ŽþÀððàaà}ðñðqÿøð‡ƒÁààÿàðÏ€ÿÀàŸ?àÿÀÀ?çÀðpx¾°<ƒÿ‡‡‚ÿÀàááãà>øŽþÀðð<8àà}àñðÿðð‡‡‡‡‡‡ƒÀãáÁáðà<?ÀŽƒ€ðxx;Ÿððxàðððð<ðƒÏ€ÀóÀóÁà|xx8üðüžü‡€<ø<ƒƒÁàãÃàö‡Ï€ðàîŸÏñóÃÀÁóã÷Àðøxþþà€¾ïLJÇÿÀÿóãðÿà<߀Ïçü?ø?þ€ð0ðyàðð1øpðxö‡ÏƒàñàóÁàxxxxøðüŸü‡>à<<ƒÁàóçðþ‡ÿŸÀÿàþÿÇÿÿãïð>ŸñÿáÿÀ?ñüüþüÿà?ÀüÿÇÿÿÏÇÿ€ÿÿ÷ðÀ€ü?øÇþ?Ÿ€ÿ÷þ?ð?ü€üøùññøüxÿðüøÿÇÿÏà߇ÿÿñóóãàxøx|ùüx߀€>Çóùùÿø~ÃÿßÀÀþÿÃþÿáÿø?ŸŸùÿÀÿáüüüøÿÀ?àøÿÇÿÿÏãÿ~ÿóð?€€øüÃü?Ÿ€ü÷üÀà€ðóóøðàÿð?ãÿ¿ŸÁàÿÇÿÿàÿççðþüþÿþÿ€xÿþÿ?àþü?À?ÿ?ßÏÇóûùÿø~ÁþÀ?|ÿøßÿð~ñŸ>€ø8ðàŽ€Ààqÿç€>8à?ü€ðà€?à?ãùø?à?Àà~?áÿÁàÿÁüÿÀ‡÷ðÿüþþÿÀpÿþþàüþ?ÀÿŸÇƒáðüð?Àp`€8€ðð€÷€ >À€À~€`Àðxøà|ÀpÀÿ€Àp€à €À<þÀðððø8àxÀ`|Àÿ€€àxÀð€Àà>àp?Àðøx8à|Àp|ÀÀøÀð<>€€À|Àð|€ààxx€0ÀàðàÀ|<>?àxÀð~€Àà<€ðxÀÈÀÀxcÀø€Àüüpà<À8ðÀüàÿp0øüÿÿÁÿÀ<<8À ð<ø€8à<€ü<ü>ü¿üðƒàüð?à?øÿð?øàáÿÃÿÿðÀýøøÿøø~À‡þ?ðþþþü?þþÿÃÿÿÀ<ð9à<<€àü€?Ï€ÃÀpp~€€~3Àÿà<€=ø=øÀ?à?ƒþ>ÿ?þÿÿüÃð?üøðø?áÿð?ø?ðÿñÿ?ãï€ÿø?ð?ÿøüüü>ÀÿãþÿŸÿÿƒïþƒð<||øxøøðüøxx|yððx‡€øxðxðø><><>>ÁáààxxžƒÇƒÃÁÀ<ÿÿàÿÿÿ‡ÿÃþáø~ðÏÀÿçÿàãàpÿƒÿÿŸÿÏÇÇÿáÿÀÿÃçÀà<ø?þ?þÀøðÿàð‡Ï÷ÇßÀð<øxðxxð|x|8xxðx8ƒÀ>xx8xp<<>Áàððx<‡‡žÇÿÁø@<ǃãÇçƒÃÃ÷ÇÿÀø<?øÁáãñàáàp<χÿŸƒÃÇÃÃÿãÃÀ‡‡ƒÀà<|ÁððñàðÏLJƒÏÀð?È<ÿøðxxðxxÀð9ÿøxÿÀ|pðxpp8h<<ÃÀðàÿüÇ¿ÿ<ÇÿÁÿ<‡ÃÁçÃÁÃóÇà8 <8Áàññàáàp<‡‡ç‡ƒÁãÁÀùçÁàƒÇÃÀàáàðpððÏÁÿÇÀp?ð?ÿÿüð80xxx?ðxÿø8ÿÀ8ÿüxp<8<øÃÀxðÿüÿ‡ÿÿ<ÇÿÀÿÀ<ƒƒÁ燇ÃãáÀxà<8ÃÀñáàáàp<‡ÇLJÿãÃÁñçÿàÇÿÀà ÁàààÏÀÿÀÿ€ðø?þÿøðxðpxøðÿàxÿ€xÿøxð8x<ø<ÃÀðàø@<ÿþ<Ç€à<@ÃÿçƒÇÿáÀà8ø<ÃÀùáàáàp<ÿÇ€‡ÿãÁÀðGÿàÇÿÀà~Áà?ððÏÀÿÃÿÀpü?þøð8?øxx'üxð8€8ü0?àx8xxøxxxx<|øp{gÁ€8x€<<<Áàðö|8çãóÁáà<ï‡þÀ‡‡ÀÀÏÀ8<><ÃÀñáàáàp8€€‡ÀÃÁàÀÇÀ€à>Àøqààþ‡ÀÁàð>|øüðøø|ø>|ðãÿ€þ|8x~?|~>>øÿàþ?øÿ‡ç‡ßþ?Ÿÿ€ÿáÿƒÿÀ<ï€üàƒÃàÀ‡à8><<ÁÁàñáàãàp=‡€€ƒàÁÃàðàÀƒÃáÀà<àÿùñðÿÇÿŸŸ€ðÿÏÿùþ?üþ?ø?þÿüþø?ø?ð?áÿ€ÿ?øàÿŸüü?ßøà~øÿƒÿÿü?ŸÇÿ€ÿðÿÿÀ?ÿïÿÀÀáÏÇÃóÇðø~?þ||Çñÿãñðÿðø?‡ÃÀƒÿÁÿáðÿÀÿãÿÀü>þþïøðÿü~?ãÿ?ŸÀðÿÿÿûþ?øüàüÿüü?ððÀÀþÿðñÿø~øßø?€|à÷þüðæ8€<ÿçÿàÿÿÏÏáÿÏøÿÿýÿ?ü?ÿÏøÿçóøÿÿþ?ƒÿŸðñÿÁÿóüÿÀÿáÿ€üÿŸüüïø?àÿü>?àþ€ðÿÿÿûþðð€?þÀÀÀ€>Àùÿà8`?À8ÿÇÿÀÿÀÿÏàÿ‡øÿïùÿø?ÿøƒóð~ÿþÿððÿ€ÿ÷üÿ€ÿàüÿøð?‡ð~xÁ€ ñø?ÿñÀÿÀ>ÿÏùÿàÞð8þþàð>xãü>xÇà8Óàðx>€àÿøÀÃÀ???ð?€ÿÀ??Àÿ€|0|ð?À€ÿ€ø@Àðþð€?0€@ðÀp€?€ÿø€à>ÿàààøðÀ>€øàðàààÀø?€ÿø€à>ÿàààø?ƒàÀ<ðü€ðp øð?€ðø€ððàx€Àà~€àààÀxÁÀ€€|àø€àpøð8?€ððààÀp€à>Àà€€xÁÀàÿà<ÀðpøøÀøxððÀøÀàãÀÿ>øxðx>`Ç€ñà8ðáÀßçÃàà|>üÿÿ€À8€àð<xð8€ðpà??à€@ü<ü|ÿü€þàïÁÿÿ‡üüøø<`ÃÿÀÁÿðxðáÀ?À~ÿƒÿïà?ð|?þÿÇ€ñà€ñáà<ñÀàÿÃÿÁÿÿð?ø|ÿ‡Àÿðà?óãð8ÀøððÁÿÃþøÿùøøü?ðÿ€À<áÿ€ðàÀøÀÿçãçÿÀÿàÿààÿáð|~ÿÿÿƒÿ€àýçÃÃãÁà|?¾xxñùàxðùÿÀx|<ñÀðñÿÃóÀøüpxx|ƒÀÿøøûñð<Ãÿø}øðÿóþ?üüøüþ?øÿ€àÿƒñÿ€Àp?ððŸþ?àÿ€ãáóÿáððñðxxøðø‡ÏÇ€žÁãÀàƒ€ùçÃãááà|x8ððxx~yñà8|>}Àðxñááàðx8p<ò‡ÿÀÿø|øøñáð8‡ÿÀððññùððx<|øx<<xx?Áÿƒðÿ€ðøÿø?<€‡áàáñáàðààðyððx> χÿƒÃÀà€ðçÿãÁÁÀ<xðø9ààðxxqáàxü}ÁððáãÁÀàpxð<üÿÀ|øx x<÷Àø<Àpx||<¼€ààñðñÿðÀðÿùðpxðÏ€Ÿÿ€ÀÀàƒ€ðÿãÀàž|øüàðÿøxàxþÀÿøáÁàðp8ðþ‡ðxpx|Áàð8‡‡€ÿ€àyàxàü<€àÀÀÀ<<àðààðxñàx|ÁàùãÁÀàpxð<ãÀx|0oøðð<ÿƒ€oøàxðxð|<88þøÿàp<Àð€ðáÃàáìàxàðxxáàx>Àð1ááÁàðx8x|€?ñÿ€xxðxáð8ÿ‡€àxàxàxà|<>‡€ŸÿÃÇÀÿüÃøÿÁÿáüþ>à|{áð|qþãûþ?üÿÀüñãÿãñùøü?ø¿?ÿ€ñþx|xxñð<燃øøxðøðxö><<ü|<€áàx=€Àx8ÿøÿùÿçƒøÿðÿñÿðþ?ü~~?ü?üø?ÀƒÃàø?€àxø|øþàÿÀÿûóøàø?ðãþ?üÃÿŸÀÿÃü?óÿðÿàóø~øÿ‡ø??ÿàãñøáþÿûÿàÿ€ÁÿÿãáøøpÀÿ¾x€<ÿøøùÿçÿãøÿðàÿà~ü?þüøÀá÷ùþ?€ø?øøüàÿàûùø?À?xàÁÿøÀþÀû€øðüððð0àþ ÀÀ|x¸~xÀþðà>yÿÇÿáðoÀ?ÀßÀ|ð~~¼øà€áÿûþ€?ø?ààðÀù€aÀ€À€ƒÿàà`€àÿûþðÀcÀg€€Àp`÷ÿÿþ|pðø`€8Àðø@<€ÀÀ€ð>À€xÀðxà>ÀàpàpüÀÀ€ð>À€|Àð8ð?€>À€àøàøþÀÀÀÀ€ð€€x€p8ð€ÀÀàøð|þÀÀÀÀ>`À€pÀøÀçÀÀðs€€€àxð>À€ÀÀ<øÀ?øÀyàÀxàø|8?à<<<øðƒÀ|~ððð{øyðà‡€?Çÿ€ pà?øñÿððàsÀp€à0<àÀÀàì{À|üŸ<ÇÀÿ€üðÿøøþ?óáüþ|?à€?À|~üüÇáÿÿøñøøÿøÿø?ðÀçÿÀ€p?ðø?ùÿð?ðÀ÷À?Àüþðð>|ðƒüðà€àÿ€?à??àø;ÀxÇÇøøøøþ?ÿÀÿÿÇÿÿ€ÿççáÿàü?øÿøüÿóñü~|?àÿÀà~>þ>Çãÿÿƒÿñøüüü?ø?‡Àÿ÷ÿÀÿÀpx8øxxx|x|x?àÿàÿãþþø?üüø?ÇþðÿàÃðÿ€ÿàÿ€àüÿÀ?ƒÿþÿÏøüüÿøþ?ÿÁÿÿÏÿÀÿçãááà<<>|üþσðøx|ñàð?<ƒÇÇÃãÇÿ€ø>>><><|?þ?þüÏðÿàÿáðÿ€ÿáÿÀÿàþÿÀÃÿãÿÿçøþ¾üÇÃÃÃóσ÷Àóááãáð<|>><‡‡ð8pàðxð>ǃÇÃÇǃ€8<><<8xÁà{áàñàpüð8ð<<>¾<<Ï€ãáññð<ãáãÁáàçÀûãÿçÿûãÀ>< ƒÇƒÃã߃ã€ááÁãÿà?Èx>|<ð8pàðpð?þǃǃLJ‡€xx<<8<øÁà{ÁÀáàðÿøàxð<<<øÇÿãÀÿƒÀÁáÁãÿàøðx<þð<àÿð?ð?üîç€ÿ‡€xx8<8xÁàyÁàÿàpxðxp8<<þÇÀÀÀáÁãà8|x>x<ðÀàøð>>þÇ€ÿ‡€8|8<8<<ƒ‡pðÀqð`ðð>|ƒÃáLJ‡¸8>><<8<|þÁÀðóÁááàð?øü?ùüü?øðàñð`ð|| x߀ÁáÀðp8ÁãÀÁðƒÃàÀ÷ÇàÀ<<<<‡ÃÀƒÀÇÀÁáÿáÿà>|||||?Ïðð€>ñðàñøþ>ü|ïƒÿχøü?üü~|~þÇðÿçãñãçü?ð?ü?ñýüðøpððüðx>?<Ïǃ¸ááàðx=€áñðaàð‡Ãáðà÷‡à܇<>þƒÿáñÇøÿðóàÿðÿà?üüþÿÃÿ‡óþ€ÿÇðàþÿÿ?‡ü8ÿÿÇÿãùÿüþþ~?þ‡ø?Çãðÿÿþà¼áøüàÿóñøÿáü?þü>€?üÇÿøÿñóàø?€ÿñóáûàÿÿáðáñçŸãøüþþþ~?ü?ãÿáÿøþðÿàÿð€?øðüþÿƒþçþÿ‡àÀÿüß?ð8þÿÿãñÿðþ~ü~œð?ƒÃÀÿÿüóùü?áþÿüþÀüÃÿøÿøáþÀÿøÿÁÿàÿÇÿÿðÿáÿçÿ÷üüþü~ü?àÿà‡øüðà<ððà0ç€|Ãþ€€?<<ûà@þÀ8?Ãùøƒüÿðø€ðÁüððƒþðÿÀÿÃüÿàÁÿ‡ÿçøøøð|<à?À`<àÀ À;Ààþ€ÿÀø8Àçùà0à{ÀààÀàð?€àð?€?€ðð?ð0x>À0|üÀ`>€à €Àÿ~xüxüÀð>€àp?À àÿÿ€x|x|Àð€àp€À`Àð€àÿ€x<ø<€à€àp€ÀpÀø>€à|€8<ð<ð€àðÀ0 ~C€?Às€ÀðÀð|àxøxÀ¼À¼üüx‡ÁÀqÀÀþ€¾øàø|?óþðü=ð~üðÿ}ø€}ùø~?ÿÇïÀÿÀqÀÀðÀpxàxþÿŸððüðü???þþ?ÁÿÏÇÃàÿð?àþ€þÿþáüþóþøþüüøÿüàÿüÿÿÿÏÏÃÿáÿàóàÁüx|þø>|€üðC€óÃüøÀãÀø pøðÿŽ~¿üàxÿÿŸðÿø?üü?ü???þÿãÿÇÇÃðÿø}ðþÿÿƒÿáü|yóþ><>üþ?üÿþ?ðÿþÿÿÃÃÏÃÁÿááàÿðÿáþü|þü?þÁÿøÿàÿóþ>þ??Àÿ÷ãðü}øüüÿüÿßÿÿƒþà|σÿÏðÿÁø~üþ||ßùóçÃÃÁð~|øxƒÿ‡ãÃÏàx8ðpp<¾<<<¾|ø?žÃãÃÁãÃÀùáààÿøùñüü|þ|?ÿÃÿŸŸøÿðÿÃÿóþ~ÿ?Áÿƒÿóð?üÿþþÿƒÿÿ߃ÿÇÿ‡ÿà|ƒÃ‡€ãàxx<x<€à÷ƒÃÁÀð<<ðxÃÃÇàÿ‡ÇχƒàÿùÿÀÿðü>ÏŸÁÿÁÿñø<|?ÿþÿ‡žƒÃÃãÇÇà<ƒÁƒ€áàxx<x<ÿ€ð÷ƒÃÁÀp8ÿø<ÃÃÃÇàx<àƒÁÃÀp8ð<ÿÃÇÇàÀàxð< üxà|xƒÁÃÀÃÇÀàÁàxàp<<ÿ<燃Àð<ÿàððÁÿÀðpü€‚ü‡ãƒÇÿà8ƒÇ€áàxx<x<‡ð'ƒÁÇÀp<>ø0ƒƒƒÇ‡àÀðxö>><<<xxƒÁÃóãÿáðóàxðp<<<ƒÇ‡ƒÀðyÿàðð€ÃÿÀðp8ü€ü‡ƒãƒÇ‡à<LJÃÇðãàx|ü~üÿŸÿøóÇÁÿàð>|ð‡‡ÇÇŸçø€ÿðÿü?þ>€?ü?À€yþ??ŸÇçñÿÁÿ÷üÿàxøpx>|?ǃǃØðyáàxöƒÃÃÀðx<<€€ƒÃǃÇàþÀ‡€ÃÿÏÇçÿïø<ÿÿàÿÿƒðÿûÿþüþÿÿŸƒüÁÿÀýóþ?ðàÿÿÿçãÿïüÿà~ðøø€ðü€?þ?ÇãÀ>ùãøþáþÿþü?ÀÃÿƒÿÃøÿñÿûþþ?Ãÿ‡ÿßûÿûþþ?ü?¿‡þàÿþñÿççÿïü|ÿÿàüÿàÿùÿœøˆÃp#À ü9ÀýàðÀ?þþ?ÁüÞüø?ÀÁÿÿÁðÿáÿûþ~ÃÿÿŸûÿóüþ?ø?¿‡üàþÿ?àÿÇãÿïø|ÿÀxqàà€8@Çx0 €8``ó€þx8?À|Ãðüñüþà<ðøÿŸÀÀ<À8îxð €8À|þ~üð€àþüüðàþø~ðüÿøüàà88áààà<<áàáà<<áàÀ€áà<<xø €À€áààÀ>€@Àáà8<xxøpø?€€0ÁÀàÀ~€àÀÀáàà8|x|ø|€À8€àààÀÿÀàà0ƒàáàà€x8<|ø<ð8<€Àp€ÁÀà€ïàÀ8€ƒààààÀ|<ð<à< €Àp€xàààâàà~>@xƒàÁÀàÀ888<À<ÀpÀ8Ãø €þsÀ<?ƒÏüÿƒüÀÀàð<>üø8ø>üÿÁÿÿÀxààààà8Àpð|ÿƒðüð~üðü|ÿçü¿ÿÿÀÿƒßÀãÿÁÿÿ‡ÿÿð?ãü~?þ‡ü~þ?þÿáÿÿà?þð<ð?€|Ç<ÿÃÃãÏ€ÀÀxáÀ€à~>>ÿððøøø?øðüÿø?üøüø?ø|ÿÏþÿƒï€ÿÁÿÿŸ‡ÿÿàÿçÿáþÿÿàãø~?þ‡ü~þ?þçÇÃÁãÀáÿüü?àÿ‡ÿÀÿããóÿÀ@ý÷àÇÇÁÿÀÿÀáÿ€?€‡ÿ€ƒÿ‡ÿøøüüü?üø?þÿþ?ü||?þ<|ü~Ï_ÿ€ƒÃÀÇÃçÁóLJûýððñýðx‡‡€áàøðð>ÀàÃçÁáààûáþ|ü?ÃÿŸŸ‡ÿÁÿ€ÿÇãçÿàÿÿðÿïÇÃÿáÿÀÿãÿÀÿÁÿÏÿÁÿÇLJÿÇðø|?<?<žx<ü<ø<‡ÿLJÿàÃãÁãƒàðñÿùàðpÿÀÀàøøàÀàçÿáÿ€àðx<>ƒç‡óÃÁàÁàáðàðàüñàóÁáðóÁàÁçÁàáãÁããÃÁç‡ÃÁãÀ8<><<< ?ÿð<ÿü?þð8ÿ€‡ÿÀÇ燃ÀàñÿñààpŸÿ€ÁáÿðààžÇÿÀÿÀÿðx?þç‡ñÃÁàÀÀðñððððxñàùáàð{ÿðÀ÷ÿààãÁóÁÃÁçÿÃÀñÀ<<<<|?ÿx<ÿü?þð<ÿ€‡ÿÀÇóÀƒààqÿñàðp€ÀðÿðàÁàçÀ¿àÿðxþç‡àÿà€àáààðàøÀ{Áàà{ÿðÁçÿàÀGóÃÃÀÿÃÀóÀ88<<ü|?þð<ø?üð8þ€‡€ÇãÀƒÀàñààðpÀáðààŽÇÀÁàÿðx?þçƒàÿàÀàñàðyàxàyáàð{ÿàÀçÿààÀóÁãÀàÀóÀ<<<<üø>x<><àx<|<>x|ð€ƒáÀÃÃÃãàãààððqàðw‡Ç€ãðø0àÁüçãÿÁÿàðx>ç‡ààÀðñàðÀxàyáàð{àÁãÀàÁóÁãàÀÁãÀ<<<<<>ü?ü?|ü€ÿÀãÿÀÿããáñãÿÁàðøÿññøÿÇÿ€ÿø|sø?ÿŸÏðþ?ÿ?ŸÀÿñÿÁÿàøp{gÃçàà‡ÀóñàðÿpàùãàðyààáãáÀðcÁãÁÃàããÃáãø<>>þ~?>Àøþ?þ?øÀü?þ‡þþà?ñÿ€ÿáÿÀÿÃÿçûùøãûøÿÃÿÿø?÷üÿŸßøüÇþ?ŸÀÿðÿÿÀÿðþ>ãçÃÿÃøðàÿÀÿùñøðüùñÿàøùÿàóñÿàùñãããáÿãÿÁ÷áüÿþ?€þ?ÿÿÀüüþðÀüþÇÿƒüððÿÿàÿ€ÿãûùøÃùø>ÿÀü?ðãüÿŸŸø|ÁüŸ€<à>à?ü?áÿÃÿçøÿÀÿàÿÿûøÿãþÿáÿðÿðÿàÿùÿÀÿáÿÏçðÿÁÿÿùÿø?ø~ÿ?ÀþøœÀ?€ð‡ÿ€`@à>` 0à8?À?ø??‡áÿÿçøÿÀÿÀÿùøÿóþÀÿðÿàÀÿøÿ€Àÿ‡çð€~ÿ€øÿð>à ÏÿÀÿÀ€~a€€?!àÿðü8`ÿ€>`>À<ÀÿøðÀ<ÀàxðÀ?þÿ€àøðàþÿÿðøðø|ÿàøà€Ààáà<<88áà|<xxáààÀ€<<x|áà|ÀxþÀ àðà€à0<<xx€ÀÁà|ÀxþÀàààÀ€ðà€ü|<<0À88ðÀààà>Àx~ÀàððÀðà?€ø|88ø?Àxxð<ÀàÁÀ<ÀxÀààð€>@ðà?Àü<xÀ88ð>Àààà€Àx€àð?àyàáñðýøð?Ÿ€ÿàðàs€8<88pÀx8ð<Àà8ÁÀ<àÀx>øðø‡€þàyð€ ?ñóà€àà?Àÿàÿðóñðÿøø?ÿÿàpà9€<À 88xàÀ~<€€ã€ûðüÀ?ð@ÀþøÀxÀøøÀÀü|þ?þÿÏÃàþüüÀ€ÿñÿðÿàðÿðàÿàü?ùøøüþ?¿ñà€÷€~ðð?Ãøþü8ð<à€xx<<8ǃÃÀàøÀ00Àq€ø>ÿÁÿÿ€ÁÿÀ?ÿð?üÿàðü?øÀxðüÿøÀÿÀÿ‡ü|þ?þÿÃàþüüÀÿÁÿáÿññàóàñàÿñàà>?àà?ààüü?çáþÿü<üøðü|>ÿççáøüÀÿÀøÀð|üÿÿÃÿÿÀ?ðÿààÿø?üððxð>~<<À8?ø?þ?~ÁñàÿÀð>ïÃÃÁð?ûáàð~ùàððpðpøyø`<x<þðÿð>|þ?Çáþþ?ü8ü?ü?øü|~~ÿ÷Çáð?üÁ÷À?ø?àðüÿïLJƒÇÀ|ñùàÿà~øpñàððp|<>ÃááãÁà‡ƒÃÀà<>ñáÀàxóááüaüaøñÿ8ðÏÏÿÃü€ðqààpðxppñÿðÿÀxüÀx<<ÃÀ@ÁÁàžƒÃÀàü<<ãÀàpÿàÿàáÿøà8ðpxþøÀààxð<þ>àxüxð<<<ü<<ààyáàxøÇÿàxxpx?þÏÿÿ€ðààðxãððxðñààxð8<àx ÿà<<<?ü<<ððyáàx?üÃÀx?øpx>Ç€ƒÀðàðÿðxðpðx|<|Àx8<<Áàãáá쇃ÏÀà<<Àááóðøùáñññðøñÿà?ü?øüÿÿàñÿÀðxx<>à8?À<><<<øðyáà88Ãà<øx8€ƒÇÁƒÁàxàððð|xýðüø?~?üð<|>>>Çðÿñãàþ?ÿŸƒ€ÇÁÿàøÿþ>?àóøÿùþÿàÿðÿðñÿàüð?þÿ€ÿÀàñÿÀðøøx?>ààx|<><<>ü|øù÷àx>>Áñà>xxpxž€ÏÃÿƒ÷À|ùñøññþÿÀàÿðÿøøÿ?ü?üÿßøÿáÿøüÿ‡þ?¿‡€ÿÿçüþüÀÿøûþÀÿàÿà?à߀;ðÀ8ÿÿ€Àà øþøþÿñøüÿ|ÿþþ>ÿþ>~ÿøÿðþ?þøÿà?>xxø|þàÿáÿƒÿÀ?ûùüÿÿÿð?àðÿøø?ÿüøÿÏøÀÿø|Ãþ?ŸƒÀÿÀýóþüø?Àÿü?yþ€oÀOÀà€ààÿðüþçýþþñÿü?ü?ÿÿ~ÿÿàÿùÿ?üøÿÀøÿüþÿ‡üàÿàÿÿ€ãùøÿüþÿø€O€ˆ€ðþ<à<Àðþð0x€€ðÀ|p8?ààøüçÿþüùÿ‡øøÿß~ÿà~ùÿøø?€ø?ÿüþÁøà}à<Àà@üÿø<€À<ï`ƒøøàŽðü€?¾à8<<€~÷ñ<ð à8>>Àÿð8ðÿøàÿüøøð?àþðøÀ|?ðø xà>~€?À?øà@>€þÀà>€8€àøàà>À~Àð<?À`?ÀðÀ<?Ààÿ<ààÀÀà8?€à`ÀøÀ<Àà÷<Àà€€à €8€àðÀøÀ0Àà>ð€8ÀÀ~àààÀáÀ?€àøø<øÿ€8€ÀàÀð<8Àà}€üðÃÁàÇÿðüøàx>øáÿøþøþpù÷àÀð€ðð€€~ü|üüÿÀx €8x?ðÀÀ|ø ððÁþ¿øøøÿÀÿø‡ããùø?ÁÿÁÿÃüü?ø?ðþÿüãÿ‡üþüþþùÿðÿàððüüÀÿÀÿ‡ü|þþŸ€ÿð<<þ€þÿàÿÁþχǀ€ÿ€?ð‡Çü|ƒàü€ÿü>>>ÿüø?ÃÿÿøøüÿÀÿøÿÇããùðÿáÿÃçÃü>||ø|øÿÿþãÇÃüþ>ÿñÿññàðð?ø?ü?üóáÿð|ž?àÿü~~ÿƒÿÿðÿÃÿÿßÏçÀ?àÿÀðÇçþ~Ãðü?àÿþ>?ÿÿþþ?ÃLJÿÏøü>>ƒÃÀ‡ƒÀÿááàùàøññãÁàð<xxx8‡‡ïçƒÀà<χ‡ƒÀ|ùàððpÁááãÁàŸÃàÿþ|~ÿ‡ïƒÿàÿÇÏÿßÏÀñãàñðÇãü~Ãð<|ðÿ>ÿÿ>ƒ‡çÃÀ|<ƒ€ƒ€ñááàÀðñáãÃàà>ð8øx‡ÏçßÁà<>>‡‡ƒ€xóÿðþ <8<ƒÁáÁÁàžüxðx‡ƒÃãÀÁLJû燃ÀøóáàðpÁàðÁð<|ø<ÃÃÃÀþÿ‡‡ƒ€xà_ðüÃÀÿÁàž€ðx<¼üÿÃÿ€ÿÿÀÎÁàÿààÁÁà€ðøø8?ÿ€þ¼ÿ‡ƒÃÀ<|ÿ€€ÿááà?€àÁãÀà3üð8ø‡ç€À<<ÿÿ‡‡€pààð?ø<<ÃÀÿÁàž€ðxžÿ‡ÿÿÀÿÏïàîÁàà?ðÁààÀpüø8€ÿÞŽ€ÃÃÀ<<ƒÀ€€ùááà?ÀðÀãà@à<p8x‡€€çÁÁàLJƒxð`ðp<8ÁàcÁÁ잇€ÿðx<œÿ€ÿÀÏÀüÁààÏðÃÁà€ð9üøx ?¼€ƒÃ€8> ƒÀƒááãàsàðqÁãáÀà<<xø|x‡€ããÁÜ>¿‡¸øùàùðxx>>>>ÁñãÃÁüŸ>ÿ€øpxž€‡ÀƒÁàçàüàðð`ðxãàäÀp<xx9€€žããÃÃÃÜ<þƒ÷Àÿƒøãðÿñóøÿóáñÿãø?ü?þ?øÿŸàÿáÿÁüÿþþãÿÃùþàÿð<ÿüüÿÏøÿãÿøüÇþ?¿ÿÀðð{~ÇÃÀÃÏǃÀøÁøqñáððïáþÀð><øx{Ÿž€ãÿÇãøÿüçÿ€ÿøÿøÿ÷÷øÿçóðÿÇø?ø?ü?ðÿ?àþáÿüÿøþÿãÿÃûþÀÿà?ÿ?ø?øÿßøÁÿðüÿƒü?þÀÿþ?ÿÿÿãÿÃÿàÿÃÿ‡øøøøÿàÿðÿðþÿùþ?ü}þ?‡ÿÿŸàÿÿþáÿçñøÿ‡øóÿ€þøÿü~ûûø?çóø?ƒüðüàüàüà~|ïð øÿàóÀðþG€ÿààðüð8€ðÀÿþþÿþ?óÿƒÿÀÿƒÿøøøàÿÀÿàÿðüÿÿóþ?øþ?‡üÿ¿àþþüÀþÇáñÿà?à>pàþø8@À `à0óÀž<<€üüïþ?ðÿÿ€ÿ€þøxüÀ€oÀ|à|ÿûþð?þøçà||ð€ `à<0àxÀ8> ðø?à<<Àà€€~~€€€àþ€àpàxþ?€€ü€`øø8àx~€ÿ€€x>þÀàüð8àx€ÿÀÀ€xÿàà<à8à0€ À€xŽðà€€€À€xà ?aÀÀàèøÿ0‡ÀàÀ€ppàð>8üà9ð9ððü<øàà|xàøàóàÿÀ>ü?àà?Àð?ðÁóãðøðøðüþÿ€þÏÀÿà<`8ÀxøÀÀaÀÀ øxïðà?øøþþøÿøÿøøüü?ðøüøüñÿñÿøþ?àààððÿáÿóùùøü?øüŸ߀ÿ‡ÇÀáàÿ?óÀ>€ŽÿÀþ~þ~þþ¾ñððÿððà}øüüÿü?þÿøà?þü?þþüüü?øüþ~xüüü>||øÿøÿü?þ?ààøðxøxùñàÿùðøø¾|<‡€σƒÁÁààÿ€ÿ÷ïàÿÇÿÿ€ÿÃÿÿÿÿÿÿÿŸñøùÿøø?ðÿþþÿþ?þÿðüàž<<ÿ>>?>¾><<ðx|x8>àðpxppqàð|øðàx>x<< ƒƒÃÁÁø@ÿÀÿ÷ÿáÿÏÏÇÿÃç€ÿÃÿ€ÿƒÿÿƒÿ‡‡ÿáø?|ÿøü?ø?ÿþÿÿžßüà<Ÿ<><>x<> x<<<<ðx|88áðx|0~1ÿð|ppà8<üÀÿ‡øƒÃÁÁÀÿ€ÃÀãÁýããçÇÃûçƒÀÇǃÀãÇÇÇLJLJÃÇ€x<|x<‡€?ÿþàÿüüx<<<øüÿ€<?üøøðx8xþáþøùàx9€8<xüÿ€ÃÁÀÇðgÿàÃÀðóƒÁÀÿÿÀÏÿÀ€ç‡ÿƒç€xxx8xð>Ç€?þþàü þ8<<xüx<<3üðx8xþáðwø`ùàx?€8<x€ÃÃÁÀðgÿ€ã€àóƒÁÀÿý€Ïÿ€€燀€ç€xxxxxð<Ç€>à¼<<<|8x<8øx88àð0pxðyð`x€8>|<‡‡€ƒƒÇáñðwÀÿ€àóÃÁÀÿ€Ï€€ƒç‡€ç€xxxx|ð<Ç€à><<<>><8> <<|xxx{žààüp|øüøýðü8?ü?~?‡ÿÿ€ÏŸñÿñÿàçÀÿàÁãÃÁà÷À€ƒÇÀ€ÀƒÇ‡‡ÀƒƒÇx<x8< x<‡€>à>ü?€þ>~>~??ü?ü€?ø?|€ü?ü?øüþ?Ÿÿÿ?àüðøðáþÿþø?üÿÃþÿÿøÿñÿÀãáÀðàÁãÇÁá÷áÀ‡Çã€ÁǃLJ‡Ã‡ç‡ÇÇðx>|x|>ÿÀðÀ€ÿ€ð |€>€øxþÀx~À` À€øp>|þÀø~<ÀÀ|àpàÀüp>àø<8þ<À€<Àpà€8p|Àø<|<àÀÀpàÀ<8pxÀx<ø<À€<8ð€ø~à p€À8ü?þþÿàüxp~À|ÿ€8ø`€<|à<LJð?Àðð€üþðŸüŸÿ‡ß‡ü>??üÿÿ€?ÿà?€ÿ‡þÿÿÇÿÇü>>üÿÿÿ€ÃÿðÀ8?ŸŸ~ÇÏ€ÿÃþÿþÿþÇ÷ÀÁÿƒÿàø|?‡ü>ÿüø}øüø?~=üðþ?øà~üþÿÃÿàÿÁü?ðÿ€ÿ‡øþüÿÿ‡ÿÁÿ‡ÿïøùðüüÀ=üÿÁþü?ÿÿÿÁáãÿãü?þÿÁ÷ç÷Ààþðà<žƒ€ÿàpž‡ÏÀáÀÁãÀðð?øüŸþ?ÿÿþþüþü?þüüþü?ðüÿãÿáÿÁüøðÿÃÇðÞ>ÏÿƒãÃÇÁûÃÁàð>>ÀpáóÀð<>çÃáÃÁãáÁàÁÃÁãÃÀðàøpðà8‡€áàð€ÁÀÃÁàðøü?žÿŸÿÿþÿ>ÿ?þþ?þ?øþùðÿñáà<øx<ÁáàÇÃÁáãÁáñãÀðp<àppñàð<ãƒÁáãÿááààÀãÁóÃÀpðxxpð<ŽðÿÀààpÃÀàÁÀàx€øx<<Ï>><ßž?þÿþüÿàxðÀðø`<‡ÀÀ‡ƒÁÀ÷áàÁð<à?àÿàð<ÀÀãàááàÀãÀóÁÀðpxÿð<ø€ðàp€€áàáÀàx ðx¸>€ÿ>¼>þ þ?øàxàÀð<ð8ÇÀÀƒÃÁçáà€ð <<Àáàö<ÀƒÁãàáÁáìÁãÁãÃÀðððpðð<ðÇç€áàöÏÃÁ€ãð?ÃÀñððxø>€ÿ€ž>?üàxðÀðø<ãàÁÀƒÁÁãÃáàØøpàpáàþ>ÀÇÁÁáÿááàîÿžóáããÃàððøxñðÿðÿãÿ€óøÏŸÃÿŸÃ÷€ÿøÿÀçøÿððxð€€>xx‡ðððáà<~x?ãóÁü‡ƒÃããÿÇøøðþ?þçøÿÁÿøþü?ÏðÿçóðÿÇóøüÿÿ?€ÿÁÿÏçðÿÿýüÿÿÿ€pþÁÿÿü~ÏÿÃÿ?ŸÁÿ€ÿøÿÀÿøÿÀøxðÞ€€‡Ÿ¾€‡¿x~??Ïÿùóüÿà?ø?ÇáÿÁüÿþÏçáÿÁÿ‡øø?àüüçüñÿü~ø?ïðþçóø‡óøüÿÿ¿€ÿ€ÿçðÿüüÿÿÿ€püÀþÿü>‡ÿÀþŸÀÿ~pÀÿøï€üÿðþàÿÿþ~?ÿþ?à??ÿþþÿÀçþÿãüÿÀð‡ÀÿøþüÏçáÿ€ÿøðÀøð?çøøÿø<ð?ÇàøÁà€ààxÂ>>€?|À<òà|0Á€x à?üÿàüàÿÿþ?‡ÿü?à?‡þüü?ÿÀãüÿÃü€à‡Àøüø‡Ãß>À`À€ÿø|€à<€à<à@ÿà€?€0ü|üüÿð<€ÿÀÿüüüüÿøÿáÿ‡ü|ÿ?þüxƒáãÿà|?>x<áããÁàŸx<ƒÁãÃÁÀ<¾xƒÀÁàžp<ƒÀÿÁÀ<¼xƒàÿÁàžx<ƒàcóÁÈž|<ðóÃÁþžøÿŸáÿãÇáüþ?‡€øÿßðÿãÿøüÿ‡þ¿‡ÀàÿŸð?ƒÿðøÿƒø?€xàÿð `€xxüþüÏðïøÿ€Áÿ€ÃÿÀÀ€ßøÿ€Ãÿ?À?Çÿø?à€?ƒü?ÿÀð€ãÿ?à?Çÿþ?àÀ?ÃüÿàÀÿøÿ€ÿÁüàðÿþÿàÿÀx|À À>Áþàƒÿþ?àÀ?ãøÿàÀ?ÿùÿƒÿãü?Àÿÿþÿ€ûÿàøÿÿáü€Ç÷ÿþÿ€ƒü??ð`8€ààxðð€àðpxøðÀøÿ‡ùùÿ€?ÿƒÿþÿà?ÿ‡ÿøüÿÿßñþÁÿàÇûÿÿÿøÃþ?ÿƒüÿÀÿÿÁÿÇÿþ|ÿà?ø€ø`8À<ÀxàÿðàðàððàÀ<<8>Àø~àÃðÿðøüÿßáüÃÿð‡óÿÿÿøÃü?ÿÃøÿàÿÿÃÿÇÿþ|ÿŸàÿÿ‡ùÿÿ?à?ÿü~ðø~€àüÿÿÀþÿþÿ€àÿ€xøÃÿþàÀxðoð€àøppðpà<€|?ƒ|€ð€øøà<üãÀxÀxÀpð>àøààÁðǃÀøÿ~ÿàÿÿÃùÿÿÀÿøÿÀÿÿøÿÿø?øñþÿÿà?ÿãÿÿÿàÿà?üÿà€€|þãÿÿÀ<Àxðïð9àø`àðà9à8<8<|‡øàùðà|üç€ð€|Àðà>ÀðààÀðÇÀðü|€ÿŸÁàÿÿÿüÿàÿþøÿÿŸðüáüÿÿÀ?ÿóÿÿÿðÿÿàÿüÿð€ÿ€üþ‡ÿþàÀxxïð€<ð|p ð`9ð<>;Ãð€ñÆ}ðð<ÞãÀx€>ÀpÃàÀøð`Àxç€Àðþ<€<ààÁð>àüøÃÇðøÀ8à€øxÀøàøÀøÀþþ?‡‡À<ÀxyÎð~8ð|`ð1à|<>sÇàó€>ààxžç€ð>ÀðÂàÀððàÀðÇÀð†Þ<<àÀ<ƒÀà?ƒøøƒƒƒà€pà€øpÀðáàÀøÀüüÀ€€x9Ïÿþ€8øpð8ð<9ãðÿÀ>?àÿøãÀxÀààÀðx`ÀøGàðÃÏ<€<ðàÇÀ€ðƒ¼¼ƒÁƒÃàƒÀ8à€xxCÀxaàÀx ÀÞÎ7ƒƒÀþ<p{ÿðð`ðpð<<>qçàÿÀ<?àÿðÇÿðÀÿÀà€ð xàÃðøüûÀ<€<ðÀ<1‡€à?ƒx<ƒƒƒÀƒ€pà€øðÃÀðãÀƒÀðÁüÞw‡Àÿ`x?ø€øððø<8ûðÀñÀ>?àÿàÿƒÿøÀààÀð>`ÿàøÿ€À‡€<€<xà8€‡ƒà;Ã8ÀÃÀƒÀ08€øxàÀðcÀÁÀð áÞÏ3ÀÀÿ<àx?ð8ÿøððÿø<<>pÿàÀá€<?àÁáðÿþÀðÀñÀà€ð>àÿÀøÿ€ÿÀ‡8<|À?ð€ÿÀ;Çx€‡€‚€pøðÀÿà8ÀƒÿàãœqçÀÿàxð€8ð<ððÿø<8€ðàðÆ>?àÁàðÿ€ÀxÀxàà€ðpÃÀàpÀ‡€€<>àð€‡ÿ€ç<ÀÇÀÃÀ8øÿðàÿÀüÀÁÿÀ 󞇀0ó€€À<àxðxà<ððà8<<>p?ð€à>ààðÿ€€p>ÀðÇàðàÁÀ0àðÀÿ€<€<À?ð€‡€9æx>€‡€ƒ€08ÿÀpÀÿÀøÀÃÏÀó<€0óÇøÿàxð€xàððà<<€>8€ð€ð}ðàxÀÀx?>ÀxàxðÁàÆàðÃÿÀ<€à8€‡ƒÀæ8ÿÀÇÀÃÀ8ÿxàÁàÀÁÁà {ÿ€0{€€ÿßøÿÿÀþ??‡ü?ÿÿà~ððÀ<<<€xpøàùðàx€€pÿü€ðàð ààÎàðÀ<€<à<0€À8üxÿÀ‡‚ƒ€p@€pÃÁàÀƒÁàÿ€pïüÿÿÀÿ?Ž?Çþ?ÿÿø¿àðþð€ÿ€>àøü€|ƒÿþøøð{ÀÀxóüÀxà>xðÀðÇàpÀ€à0ÀƒÀ|8€ÀÃÏǃÀ8`€xÀà àÃÀð ?À8?€€ÿ‡ü?ÿÿðÿ¿Ààþðÿÿ€ÿƒÿñþ?¿ÿþÿà~ø~ðÿ€Àøãøσÿÿðü|<àÁäÇÀðà><à<ÀƒÀ8üx€ÀƒßÏÀpÀ€pÁààƒÁà><À0ãàÀþðÿ€ÿÀÿáþÿ‡ÿþÿÀ?ÿ‡ü?øÿÀñþÁÿðÿƒÿÿÿü?ü?ÁððþÿÇããÿÿð<ààè|<€ÀÁüÿàpà€xÀððƒÀð >à8€€ç?ùÿûø>ðÿ€ãüÀÿàþÿþÿàð?ÀàðüÿÿÇÿ‡ÿþøþÿàÿð|áø|x||àÀÁøþàà?ÿÀ€ÿÿàþø>àþ<>ñü€ÀàpÀ?àxÿ€à?€@ð|ÿ‡ÿƒÿþ‡üþÿÿÁàÿÀÿü?ñüþ8ÿÿðøðþþÿàÿÿàðÿÿøþàþø~??ÿ‡ýÿ€?ðþ xðÿÿ€ÿ€?ð?àøþ0ÿþðøø?øÿÀÿÿÀ?ðÿþð|ÿà?øð|ÿ‡ýþ?ðþÀpø`ðøø?à8Àð8?þ8Àü}À|?À?€Àp@ðø€ðÀ0àxðøü€€pà€øàà€ø?Àx>ðøü€Àøà€øààÀ`ð8ø|ðxü€ÀøàÀx‡àààp?€ø<øxàx<€Àpà€xàÀÀpð<ðxà|øžóàþ€€x€<€üÀ?€ÀÀ@>x€€à€Àp€ð<pxðÿüÿ?Áÿð|ÿð?ãàãÿà?øà<ÿþùûðÿÁÿÃ÷áðüð¿ðþøðÿáÿ€?ø?àø?à?àÀÀÀqáðx<Ž<üx<û€?<|€@€ð€xøð€x?øþÿ?áÿø~ÿü?ãð?óÿðøð<ƒÿŸÿùÿøÿáÿãÿñðü?øŸÿ‡üÿþü€ÿáÿÀ?øð?ø?à€àðð?àÿóø?ü~ŸþÀÀþ>þþÿ€óàÿÏ?áÿûáðùð€ð?Àøxþ?Àþ>>þð?Àx||?þzðÿø~üãðùÿðÿøùð<ÇŸÿùÿùñáÿñÿñø><||ÿþÿÿüããÃÀøøxx¾<<|ø|x‡Ÿ¾ðø|üøðøðø<‡ƒÏçƒÀùàðøøÿðø>x<÷ŸÏ¾áãÁàøxøx<<ñàð|x|xüøÿ¾ÿÿ‡Ïÿ‡àðÿáþ>ÿÿ‡Ï€ÿñããÿáÿáóãçÀ>ûñðü€ðyðüøü¿?ãÇÿÿƒÇ€ÿðøð0x><<‡‡ƒ‡Àððñàð‡‡‡ƒ€üóÁáðóááàçƒÀx8ðð?|€ððx<à|ƒÇçƒÃǃÀðððxx<<0øxxþðð<ðxàyÿø<ÿLJƒÀ|sÿðð|ø`xøþÃÿ‡ÿàðxÿü?àûðàüøxð|<‡‡ƒÇ‡àðpðàðLJ‡ãxóãáàóÁñðÇãà|ðð><€pðxàƒÇÃÃǃÀàpðx0xx?øxxÿþðð<ðxàyÿø<ÿχƒÀxÿðð|ðxüÿü€ÿþ€ÿÇÿàðxÿøøÿðàÿüð1ð|8‡ƒÁàp`àðLJþpÿáà{Àñÿ‡ÿà?àðð<€ÿøÀøÿǃ‡ÇÿÀàqÿøpxøøxxÿþðð>ðxàyÿÀ<ÿ‡‡ƒÀxüàð<ðxþ~0€ÿŸþ€çàðxøøÿðàÿüðð<8‡ƒ‡Áààðǃÿpÿáà{ÀðÿÇÿÀ?øðp<€ÿø€þÿǃ‡€‡ÿÀàqÿøpx>?ðÿøxx?Ÿþðð<ðxàyð<€‡ƒÀxàð|ðxþx€ÿþßçÀðxø3üààxøð|8‡ƒ‡ÁðàðÇ€ÿ€pàà{ÀðçÀøðð<€þÀÿÿ‡ƒ‡€ðàqüàð|>>?ÀøøxxŸ ðø|ðxðxø0<Á‡‡ƒÈxð`ðxðx<|€àóàÀðxøx<ààxxð|8‡‡‡ÀðÿàðLJ€pÀà{ÀñŸç€7üðð<€ðÀ ÿ€ƒ‡€€àqð?ÿð?ü€~ùüøü?ÿž>ðð|øøøýøÿð~÷‡ƒø|ÿðøøøx>>?|À‡žÁñãÿÀxü~x||ñðað||8øø8ƒÏ‡Àø1ðàöLJ€pàÁàóÁñÀçÀÀx<ðð<€ø=à€‡ƒ‡ÀÀ€àðð0ÿð?øÿ€?øÿÿüþÏÿÿ‡óþùýüüðÿ€ÿŸÏÃýþÿàÿûþþ?þ?øðÿßÇÿŸÿñÿáÿÀü?øüñùçü?xüø|>‡ƒÿÿ‡àüyáàþ‡‡Ç€øñáðñáááããÀ|<ûð<€|x9ðçǃƒÀÇãÀððüxÿððÿ€?üÿüþÿÏþÿ‡çþ?óýü?ü?àÿ€ÿßáùÿÀÿãþÿ?üðŸðÿÿŸÃÿÿßùÿÀÿ€?üð?øàÿïþø?øðþ??ßÏãÿÿÏçøñÿøþÇÿÏÇÿ€üÿÁÿáÿáÿáÿÀøøÿ?àñùøÿãÿÇãÿÃÿ€ÿøð?ÿÀàüÿøüÿ„üÿƒçþÁøüø€ÿ€þÏÁùþ?€ÿÃüþøàŸàÿßÁþÿŸñÿ€øÀ?ðàÏüàð?àþ?ŸÏÁÿÿÏÏø?àÿü~ãÿßÇÿþÿàÿÁÿÀÿ€øüÿ?ð?áýüÿþáÿÏáÿÁÿ€ü?àxþ‚`ðÀÀxà À€a„ø€ø<Àü‡‚|üÿ€?Ÿ€~7à>xÿ?àÀùøÿüÀ~Çàÿ~xÀpð|<00à 0€<üð|àøø<àøüüøàøøðàð€ààð<þ~À À?@>€ððø>ÿ€àpxð?€Àð?à8 ÀøÀ?ø?øð|ÿÀÀðð>ð?€Àà>Àx<À0øÀ<ü>|ð>ààp€ð~ð€àààøà8üà|x|xàÀ<ÀàÀð€à8øà€ÀÀÀð<À8xÀ<||<ýøàþxø}øÿð?Àðð<àüðpx|xüø|àÀø`p8€à€ÀpààÀ à8<à8|x<ÿøð?þüüÿüÿøà?ðøàÿ??Àÿþ?ñùøÿüüþ?þ?àñÿüàÿùøüüÿøà?ðþÀøþÀ€8à€üøà€ÀøþsÀ~€øÀü|8àÀÀ|x<üü?þüÿþÿøÿðøþøÿ¿àÿÃþ?üøüþüÿ?ÿðøÿƒÿðÿþÿƒÿÿÇüð?øÿøüþàÿà?üðþüøø?ÿçàð|?üÿÿà|ÿ€ÿàÿø||?ÁÿÿÀ<øþŸãáðøøø<?|<|xðü?>ùðððð¾øçßÁÿÃü||øx?ü<<ŸÞÀ?|~ðþÿ‡ÿ‡÷Çð|øxxþøü>Áñàü?ð|>|üü>ÿÿð?ð|üÿÿÁÿÿÿÀÿüü|ÇÿÿÀ8øþÿÃãàøøx<><|xx<Ÿ‡yðxxx|ÃÏáñàð|>x<¾>€><‡€ð>‡‡ƒÇƒãÁàxøþüþø<|>žçáÿ‡ÿÁáàþ¾<?LJƒÃÀ<>ÿÀáñðxxàx<<0þxp<>¾øùÿøà><ƒÏÁáàðÿüxx?àŸ<8‡€ð<‡ƒ‡‡ÃÁÀø<<>ìãáðxx>><ðxxx<ƒÃLJÃÁÀx<ƒÁ€8<ÃÁÁààp0àx<<þxxžþyÿøð> ‡àGàðþ8<øÏ?þ<ÿÀðLJƒÃÁÀü?àøáÿð8xðð>ðx8x<òãÃÃÃÁþ@8ÿÃø€†Ááàðp€x<<üð<<¼ÿùÿð?ð<ü€ÀÿàðüxxüÞþ8ÿ€ð<‡ÿ‡ƒÁÀÿü?ð<ü<üãÿðøøø?þðp8ð<þƒÁƒ‡ƒÁÿ€p<<ÿÃÿ8þøáàààà|<<~?ðžÿùðø>þ€àÿàð|8<þÏ?ü<ÁpÃÿƒÃÁÀø/ø<þþáààøüü?þÿpx8pÿàÃÀÿÀxœÿÁÿ€<|x<|Àœñððx>?ü€áÿàà|xx8>ž<8€ð<‡‡ÿƒƒÁÀxpx<þ<þÁàøþ9ü<þàp8ð<ÿÁÿ‡ƒÁÿàp<€À8|þ€áàààø>|> žðøpøx>>ÀÇááàö~<ü<0>=‡€pƒ‡ÃƒÃÁÌ|x<áð |xpx8x€ÃÿÃÁÁàx€ƒÀ8<?Àààððpxü?øÿ?üÿàÿÿ~?ÿ€?ÿÀÿðÿøÿ<<Ã÷Çÿûçøþ?ü?ü€?üÿð>?‡Çø>ŸçÇÇáü|8|ø?<><>áøàxx>>>ðx8x<ƒÃÃǃÃÁàr<GƒÀ8> Ááàáðp8üðÿ€üøÿ‡þÿÀÿÀðøÿ?ÿÿáÿÇÿßýÿøÿø?þÿ€?üÿ?Ÿ‡ðü?ƒÿ€þ?¿ÿ?÷ÿÿçñü?øøÿŸÿ?þøÿà¾þ?þ?þž‡ÿ€øx|<|?ÿ€çãÃÇÃãóàþãçƒãÀ<ááðûð|x?øàÿøøÿƒü?üÀÿ?Àðü?ÿÿáÿ‡ÿßýÿø~ðþÿ€?øþ?Ÿƒàøÿþ¿þ?óÿÿçàøøðÿŸÿÿüüÀüþ?ü?üüÿÇÿ€ýüü?øÿ?ÿÿóÿÿïãÿÀþÿãÿƒÿÀÿüþÿÏüÿøøðàüÿð>xÀ?ü€gàøÿÿàóøÿø<à€àü€øþþ>øãÿ÷Áàxð'àÿÿþ?øü€ø?þøøøÿÃÿ€üüüðÿ¿þÿóÿÿçáÿÀ?üÿáÿÿ€ÿ‡øüÿüøðð<€Ç0à@‡ àã€ÀÀü|<ÁÿÿƒŸðŽÀ<>ÿà øÿü>0gÀð<øàÀÿø€ÀøÀ?À?àÀà€?àÀ`<Àü` à<Kðáø<à8ÿøð>€ÿÿáüüðààÿÀàü?ð`ÿÿ|àx?ÿøð>€ÿÿáüÿüøðàÿ@àðáüðþÃÿÿ€@Àà<à8~Àøð€>€ð|øüüøðþàððñü?€ðÿáÿÿ€à?àðƒàxàøÀp ð<€à<à<<|>xø|àðÀàüpïÀx€àð?àøþ?ÿÿÿÏü÷áþøþøç?‡Ç€|€ü yðüð?à pøŸ~?À<Àð<À<<<<àø€à<€pà8€àxø<øÿÿÿÿÿÏüÃÿãÿüþðÿÿÏÿþŸŸÏÇþÿðÿðü|áÿ€ÿà}ùøàüøÿÿÿÀ<Áà8€Àx<Ž<<<øxp 8~ðð?€ƒ<þ<|p<Àx€àxx0üÿÿÃÿãÿÇÿçüáÿñÿ>ÿðÿÿ€ÇÿãÿŸŸççÿÿÃðÿøü~ÿñÿÀÿàÿþüþþ‡ÿÃÿÁÿà<ÇÀà<€ øþÿÿßÀ€<<þ<Çãþþÿ‡üø?þïÀÿÁÿÀÿ?ð?À?ð<à8a€àxx8üÏǃãçÇÃûãàÿàüðx<>ðÿÿ€?‡ÿÇÿŸŸÇÏÿÃðÿø<|~ÿóãáóàÿþþÿþ‡ÿÃÇÁãà??ÇÁà8?øÿÿÿÿÀÿÀøx<þxÏÇþþÿ‡üxwƒÿÿÁÿÃÿ‡à8ÿðÿàðxÀxaàxx3<ƒÃÁá÷Ááñáàøðøxx>?‡ð÷ãÀóç‡ÇƒÇÀñàø~<>áóááð࿃áÃÁáàà?ÿÁÀð<€<ÏÇñùàÿàøx<ƒÏÁáð¼wƒÿƒÿáãçÃÃà<‡Ã€ùðððxøx?ðàx?à<ƒƒÁçƒááÃÀðððppþüð÷‡€ãÏLJƒ‡ÿ€áàð||?ÈÁ÷ÿáþÀ>ƒÃÇÿãøÀ?ÿƒÁà8<<‡ƒáñááàðx<x‡áàÿøçƒÀàçƒî€ÿàx<<þÀóàÿðÿƒÁçÀÿàãÁÀð<€>üƒÀàðà<ÿ<ÀîÏÿààŽçÿàÿÇÿÀà<‡ÿÀàqÿð?ðxø8a€øÀ8<ƒƒÁçƒáàÉýððpp> ø燀ÀLJüÿàpx<8>Á÷ÀÇð<ÿƒƒÇÀà<ÃÃÁà8€<ƒÀàñýà<<‡<À|ÀàLJçàÃçÀà<‡€àqðgø|à8€ü08ÿßïãÿÃÿÇøýÿýùüüÿ~‡ÀÇðχÿÀüÿçðø|~?ü÷ñÿÁûà>ÏÇÃãÿÃ÷à<ÃÿÁð|À|||ƒÁàááà<<à|€à88xxÿŸÇÃÿþøøÿÿùü>øü€þÏàÏøÿÿàxþÿûþþþ?øÿÀÿøÿÀ?¿ÿÃþ?¿Ÿÿçðÿÿ€ÿÿÿïÿÿÿü?ÿ?ßßÏ÷ûùÿøøðÿÀÿÿ€8þ?Ÿ€ÿüÇçÿçøÿÃÿ‡ÿÿÿãÿÀÿøÿàÿðÃÿÿàøpðpÄ0|@x€ü‡ÀƒðþñÀ0üÿûþ~>ðÀ?ðÏ€?žÿÁüŸóãàŸÿþxçÿÿ€üÿßÏÇóùøÿüððÿÀÿÿ€8þŸÀ€üãóÿçüÿÀÿÿÿÿñÿà?ü?àÿðÿãÿÿ€øø?ðÀã€þðppð0€áñÁðxýÿ?àxà OÀþÁ øðÀà pàüà?àðàÀðàÀàÀ€ÀAü?#>àÀÿÀáü€ÿð>?ÿàðüü?‡à€ÿøÀñü€ÿø>ÿðøþþ?à<ÿÿüþþ<?€€<À€?ðü?€ÿüÿðøþþ?‡ð<?ÿÿüÿþ>?À?À~àà€à<€à>xøðxø8€ð<?À<ÏŸÿÀ€þ>àà€<€~à>àpøpx€ø<€ðøÀÇþàïàà?Àà<ÿà>ø?~þøÀ||>>pøpƒãàxàðøüààøÀãÀ~ø€ðøðÁ?ÇŽà~ æ8àÀàà<ƒÿ€à>ü?þþüðü|?pxpÇãàxñøøü?ð?ðÿ€w‡øñÿðÿüü€ðøüÿÿðà ‡Ž?àþàÿÿàüþ>ÁÿàÀ?ðððà<‡ƒÀÿø?ÿ>>>?ü|><øûóáðx?|øx<Ÿ<>>><<øøðùððx|>x8>ø|ø<<sŒðx<<?þü<àøàyàðxxx8øÿüÿü<sÜpð<ðx8ÿÿ€ð?ÿ€ƒ‡ƒ€àÁÀ€xàyžüüçÿãÁÁàƒƒƒÇÿÀáàððqÿø€ƒ‡‡ƒÇ‡àðqÿðÿðáà<ÿ€à<xþü<<àðÀùáàpxxxüÿøÿø<søðð<ðxxÿþ€à?ü<>ðøàyáðxxxx?üøø<qøðð€ƒ‡ƒ€àÀ ÿà€pÿà?þÿÿþÿÃÁÁàƒƒÇÿ€áÀððqÿð?ðÿ€àðqÿð?ðñð>áà<Á€à<|>x<<øðàùáàðx>xxx<øø<qøðð|ðpx¾à<>‡‡‡€àÀÿÀðÿà?þÿ†ÿ€þÀƒÁÀ‡ƒ‡€ãÀààñàð‡ÿ€Ààqàøÿüÿáðÿ?ÃÿÀàð>>?>||>þ|øðøóðx<>|ü<>|8~8?€pøðx|ðx;Ÿ€ð€Ïǃ€ðÀ‡€ðáà‡€~ÀÃÁÁÀƒƒÇ€áÀððñð`xÏ€€àðqà`xÿüÿÿçÿÿÿãÿàÿþþÀ?ÿüÿ?þ~~üÿñÿûüüüüøø?€ððð}ùøøþ?çø<þÀÿχÀøàü€ðãð‡‡€|áÃÁÀ‡‡ÃáÀàññð`ðp€Ààñð ðxüÿÿçÿÿÿñÿðÿüüàÿü?ÿÿÿÿÿàÿÿÿü?þ?ü?øð€üñü?ùýü?ÿü?ÿþÿ‡þ?à€ÿïÏà~?ÿüƒÿðÿüÿÿÿ€<ÀÿÇããð??σÿãÿ‡ùñàÿøÿðüð‡ƒãLJàððøð|ø~0ÿÿÇÿÿÿàüðÿðøÀÿð?ÿÿþÿþÀÿÿþø?ü?øàà€üãüáùü?þø?ÿýÿ‡ø?à€ÿÿÏà?ÿÿø?Ãþðÿø??Ÿÿÿÿ8ÀÿçïøÿÿÿƒÿãÿýÿàÿøàÿðŸÏÏÿÃÿßÇûùøàÿðð`Ž€ü€cüà€€À8Àçøÿ@€€q‡€@û?Àüp~x?ÿ†þü8Àççøÿÿ?ÿÿàþüà?xÀàßÏÇÿáÿŸÏçÿùü?ÀààÀ`ÇpÀ`ÿü÷€ñ€8ø?àp€„ÿÀþÏÿððOÀà p€€à€<à€à€àÀð?€ÀÀø€àø€pÿüÃøððàÿðþ€àÿÿãüøøø?ÿùÿÀÀðpð`ÿÿãøüüü?ÿûÿÀ~Àððð8€àà€@€|À|€à|>þþ?ÿùÿààðøð<€àð€àà|À|€à|8xx|ðÿƒÀððà8€àà€àÀ<À<à<8|8|ð ÿÁÀðàÀ<8àÀ€ààÀxŸÁà<>8x8|ð?ø~üðÿ~ü<ø|¾ÿ€à?ÿÃßðÀø€ÿàþŸøùð€€?€Ààü<À € à€àxÀ<ÏÁà<~0|8|ü?üþüÿÿþà?þþÿ¿ÁÿÀÿàÁÿƒÿÀððüáÿøÿ‡ÿ‡üÿøðààÿóø>ü~þÿð?‡Ãàà?‡ÿ‡üàóàÀÀøðÀø<øÀþ‡?€œ`àÀþÇÁà<ü>>x|ü?þ?þ?üÿÿþ?ø?ÿÿÿÿÃ÷áÿàÿáÿƒÿÀðø?ü?øÿüƒÿ‡ÿÇüÿø?ððûàÿÿø?ÿÿÿÿðÿÇçàÿàÿÏÿÇüñÿðð?ðÿøàüüÿÃÿߟÇçÀ?ÀÿÀüÀÿøüÀÀ?ð?þÃÁà<ü>||>Ÿÿ>>=ÿ?øÿÿ‡÷ÿãáááàùñÿÃóàð><<<>x|üƒÃÃóÁøü>x~øððÿüÿÿ‡ÿðÿããàñðÿçÿÃü|øÿø?ø?øÿü|ð¾?þÿÃï‡ÿÏÇçÀ?àûàüðüþÀÿàðÿÃÁà<ü>>x|ž<<ž>|ƒãáãçáðàáñãÃáàð|<<x<8‡ƒÃãÁà>xx<øyðð|><‡‡ƒ€àñáààááóãÁàðx|x|xxx?|ðx>ÃǃÃûǃÇÀxñàð<||>|<<‡ƒÁáãÿñÿÀàñãáàðð|?à|<8‡ÿãÃÁà<8x<ðyÿø<>‡ÿLJƒ€àñáàüaàóáààùüxxxxx<><ðx>ÁǃÁóÃàðqàð8><>Áàðpp<ÃÃÁà<x|þx<|ƒÁáçÿàÿÀà@ãÀððþ?øü8þ‡ÿÃÃÁà<ÿüð1ÿð8<ÿƒ€àyáàÿÃÀóÁÀàÿøxxø8ð<<ÿø?ÿþÿÁáÃÇÀðqÿðx<<äÁÿðþ0<ÃÃÁà< |<þxüüƒÁáçÿàààÿãÀððþøü8þ‡ÿÃÁÁà<üðÿð8ÿ‡ƒ€ÀyáàãÀûÁààÿøxxøð<ÿø?ÿÿ‡ÿÁàÇÀð1ÿðx<<øÁÿðÀ|ÃÇÁà<|<þ|ø?üƒÁÁãàÿðàÿÃÀðð~ 7ü|8þ‡ÀÃÁà<þxðð8<€‡€Àyáà?ãÀóÁÁàÿxxðð<<ÿð?þÿÏÿÀîÀðÿàxü<üÁÿà?ð<ÃÏÁà<|<><ð?üƒÁÁãàaáðà#ÿÃàðð|x<|8>‡ÀÃÁà<xøð8<€‡€àùáàÃóÀóÁààøxxøð<<ð>?Ç€ÀîÀðàxü< þÁàð|ƒÿïùÿ>¾>||>?>>?À|<ƒÁÁãñáñððóÃÃáàð<|<|{¾>ƒáÃÃÁì<|ø8øp8<ƒ‡‡àñãààñÀóÁÁàøxxxð<<øƒÇ€ÀüÀðàx?ü<Áà`øÿÿƒÿÿÿÿ€üüþÿÿ€ÿÀ?þ?àÀ||Çãññÿáÿàÿóçóÿãþ>ü>?ÿÃÿ‡ð|à|øÿð>~<<<<àÿàøøÿø`Ïùÿðððÿÿ€ÿ€üÀøþÀ?ÿ?ŸßÏçóðÿÀÁÿûÿ‡þøðøÿ¿ðÿçðüÿð?ð?Àþ?ßÏÁþßÃðÀÿðÿàÿÇçðþ?ñüþø?ðÿ?ðü?€ÿÁÿøxøðàÿ?ÿþþøàÿðÿ`À?þÿüð¸àÀàÏàpÀÀ|>‚x‡ð?€<ð€?‡ãà|ÀüüààÿÀø?ÿ€þø8øà?Àþ?ÿþüø?Àÿà<~ €€0ø€ˆß|< ðøGÀ8?þ?ü?øààpðþðþð ð|ðÿ‡øÿø`øÿ€àÿàø>àøðÿ‡ðÿðàø<ÿÀà80ÿðÀÀø~ ~àxðÁà?ƒÀðð>?ïàð8€8ÿüààø`€x~Àà€p€ðÁÀ?ƒ€àÀ<ààxxà|Ààx>`x~ÀÀóðÀüðð=øüð?€ààÇ€áÀðÀÀÀp~ðx|xð<€àà8p€xÀÀÿð?à?ÿøüÿüþÿðÿÀñÀÿÿÀ?Ãüü?ã€ÿÿ‡üðøÀx~>?ñÿÿÀð~ÁÿþÏ€ÿ€Áþà|àx|àqàÀÀ`þÀààààxðà €ÿø?ø?ÿøþþþÿðÿàùàÿÃÿàáüþñÀÿÿÇþ?øüÀ~ÿ€ÿ€ûÿÿàðÿƒáÿÿ‡ÿÁÿÀÿáÿð<ø|~øø€ððþð¿üÿçüøÿþø}øÃÀ?À8þŽïüà øxøyñø>>þ>>ñóáðùÁÿÃÿðÿñøü=óÁÿÏÿÃü|ø<üÀüÿÿƒÿÀÿ÷ÇÃÿÀãÿƒáÿ?χÿÃÿÀóáÿñøüü|?øÿøÀøðÿüÿþÿÿÏøüþþüÿøÏÀÿàxÿÿ¿€ÿÇÿÃü??ñð€?à€~øx|xø|>?ðñðð|áóáøðøðxxùÁóÃóàð|<<<À~ïóÃãáóÇÃÁáàãÇÁð|‡ƒÁÿãÃÀðð~ÿø>>><ü?Çàðð8‡ÿÿàñãÿáþŸñøÀð?àxpÿüxðx|>?øàóÿð=Áãáðñàðxð<ÁàðxƒãñãÁáñààðÀàðxðxÿüxøx<>üàóÿð?àÇáðñðp<ð?ÀÃãáàðþ?øÀƒÁÃÁñáçÿáÿ€ÿ‡àðxÿÁñÃÿ€ÿøx÷ð<þ<À<üÏÇ€ÿáüAà?ÿÆÆ?ÿáðø8‡áðáàñððð‡€8Àðppxxÿø}ðx|<þÀóÿàÀÿáàñà?à?ÀÿÃÃáàÿü?øÀ ƒÃÇñãÏÿÁÿÀààxÿÁàÿ€ÿðpàðx<<ü8<xÿøÀ€ÿÁÿÀ?þüüþ<áÿðxÿƒÁàãÿáàààpÀÿàxxÿø?ð<<>þàóðáÿáðñààÁÿãÁàðüüÀƒÁÇÀðóÇÿÀÿààðxÿàÿÀÿðxðx<ü<<xøÃþ€ÿàÿÁà?ÿþþ?þ<áÿð8ÿÁàãÿñàðà‡€8ÀÀÿøxøÀx<<<àóðãÿáàñàÀÃÿÃÃáàø;üÀƒƒÇÁðÿ‡ÀŸàààx€à¿Àðpàxx<þþ~<áðxÁÀãààààxÀáÿøx|€<>>>ññøðãááðñð0ÀÃããÁàð|<>àƒÁÃÁðÿÀÃÁààðx‡ÁàÃàð0xàx<>|<<<xÏþ€ÀÇáÀ>><áð8€Ààáààðà‡€8À_ðÿðþøÿ€ÿþ~??þÿùÿðãçóñøýð€p|ÃçÿÃáþ|~| à|ƒÃÃãáàãÃãà`ÃÀð‡çƒàãÀýðà{<>~><<<<|8ž€áÁááÈ>><ÁáðpxÁÀáàaàààpÀàpðÿ?øñÿþ¿þÿüÿàÿÃáÿûùøÿð€xÿ‡Ãÿÿ÷ðþ?ü?üÿþÇãñÿáþÿÃÿàð?ÀÿÁøŸãÿÇøÿàÿðø>ÿ?ü~>À?>?ø‡žÀÇ€ÿÁñáüžŸ¾>áàüð<ÃÀàáðáàðæ‡°8Àðpðþðùÿøøø?ÀÿÁÿûûøàxÿƒÁÿÿ÷ðþð?øÿüÿßï÷ñÿÁÿÁÿƒÿÀðàÿ‡ü??áÿøÿÀàüüÿøþàüðÿÿŸàÿÿÿáüþþþüçøãÿÃÿãñðÿãñøþÿÇð|ÃÀÿðx0àýÿð>? ðp€€ÿûñøÀ|ÿÿÿãð~ð?øÿüÿÏï÷ðÿÿàÿ€øàÿþ??ðÿüÿ€À?ü?øÿø~àøðÿÿßðÿÿÿÀüüþþüçü?ãÿÿáÿóûøÃûø~ÿÃñÿïøÿð~ð÷üŽxp`8ÿàp<ü À à€Ààà€<÷†Àø>žxð ø øà~?ÇüÿÀüãñàñø|óÃñÿÿÏøÿÀ?àð<ÎøÍððàøÀáÿ?Çø€Àÿøþð>ÀðàÀÿøüà<ÿàÀÀ€ðüÿÀÀÀøÿ€À>ƒð €€çø€À?ÀÀÀðçð€À<>?€À€ðàø€À<~ÀÀÀðÀð€€<ü€€€ðçÀ?ÃãñûððÀ€óÁàà?€0€xà~øÀÀ€ÿàÇçãÿðüàÁÿçðøÿÁøü€ð|?ð?€ÿü€?ß¿¿Àñð?ÀÿðÿóóñÿøÿðÿñÿÿüþÇþÿÀx~ðàÿƒÿÀÇÿÃÿÿÏÿƒð?ùùøðÿñùóáðÿøÿÿñÿðÿÿüþþÿÀð~àÿàÿÿ€ÿçÿçÿƒÿÏÿƒðÿñùøýððyðxðð|ø€ðùðø|><߇ƒàx€ðø<‡ƒÀðññóóÃãçãÀðùøxxðxðyàùáðøðàóàøx|<<ƒÀðàðx‡Áàñá÷ÃÇÁçÃÀñððxyðøð=à|ððxÿ€ðqà|x<>Ãàxÿø<ÿÃÁÿùàûÃÃÁóÃÀñðxxyÿøð{àyàðøÿààxxx<<<ÿƒÀðÿðxÿ‡ƒÿóÀ÷ƒÇ÷ƒÀñàðxyÿøð}àxððxÿ€ðà|x<ÿÁàxÿð<ÿƒÁÿñàûÃÇÁóÃÀqàxxxøðyàùñðøÿðàøxx<<<ÿƒÀððx€ÃàÀ÷ƒÇçƒÀñàðxyðøxðøÿðü‡€øyðøx<χàx°ð=‡€ÁðàóÃÃÁóÃÀqðxxxø8ÿðÿðÿûþÏŸÀÿðÿðü~~?>ß߇÷üðøp‡Ãáðãá÷ÃÃãçÃÀñððøþðÿðàÿÿïÿàðñþÿþïÿïÿÿÿÇøð?ÃÿŸøÿñÿççñÿïçñþÿø?þøÿÀ?À~ûþïÿà?àÁüþ?øÏÿÏþÿþÇðà?ƒÿ?øãÿÏïñÿïçþð?ü?à>ó1ÃÿàÀ€ð0ð‡ÿæ|ÿþÁàÀ€ÿø?ÁÿÇçðçóþ?ø¼À>ð<Á0Àðð<ðàxø~àøüðüøðüðüÀ~Àð€àþàxpøÀ?<<ààÿàøøøÀ`?~<|€à8ð`> Ààà|øøÀðÿ>~€ð<ðð>Àà ààxøxÀðÿ><€ð|ðð<Àà`ðà?0pxÀðï€à<ðð|Àà`€ðà>ñøÃÿÀð~ü?ñÀx€ÇÃÀ|ãÃüïøþä ~>€€€€ààpðÀààðà‡ùüÿãÿáøþñøxàÿÇÇãÿÁÿÿçþÿüÿø|üøÿïÀÿÀÿàÀà?àøøø?|øþ`Ç€ÇÇp8üà@ÀãÀøîðð<à€ðxààø`øàÿÃùùÿóÿñøþÿóøx?ðÿƒÏçãÿáÿƒÿ÷þÿþÿ€øüþüƒÿ‡ÿáÿàÿðð?ðÿà?øøÀø?þüþþ?ÏÀÿÃÿÀp~þø?óðñÿðøþüü?~øà?ø?øÿ€ç€~ÇÃü<ü>ƒü|àþÿÏÀÿÃÿãÿàp~ÿüãð?ùÿð?øþþþ?ÿøÿàøüƒÿÀÿÀÿ‡Ççþÿþ>??Çþ?þ?ð8xÁñàðãÿñððxžøpxx|xÇÃÃááðûçÀýðà‡€à|‡ÃÁûãÁÀøð<|xyððx8xxùð|ß<ÿƒïÿáùñùðp>‡þð||üð88žÿðððxx?þƒÇ€ÿáÿÃÃãüÿ>‡Ïÿàø€áàñÃÿñððxÿàxx8xƒÃÃÁáàûÃÀùáà>?ÿÿà<‡ÿÁñãüÀððx<øyÿø8þ0ðð<Ÿ<>·þóáðñððp‡ðx<øx|8ÏÁàðx0ƒÁ€ñáãÁÁààÇž€üàyÃÿñàðxàxxøƒãÃááàxÿÀð@à>?ÿ‡þà‡ÿáàÁÿ€ðpüðyÿøààpð<?þø‡€üáààyàxppx>ðx?À<žŽÁÿøƒøàááÁÁààƒß†üà{ƒÿáàðxðxx?øƒÃÃÁáàyÿÀðà<?ÿÿÀ<<ÿÁàÿÀððüðÿð?ðð/ð8þü?øCáàyàxððð>ðp?ð<ÿžÁÿøàƒþààÁÁààßÿŽÿp>ÿà?ƒààðxÿøxxøƒãÃááà{ÿÀðà>?~ÿ€à‡ðàÀðpüðÿÀøøð<?ðþÿ‡€üààyàxpÿpððxø<ÿžÁÿð?ðÿ€ààÁÁààƒßÿŽÿà>ûà?ƒàaáðxáøxx~xƒÃÃÃÁàÿÿÀðà>>ÿ€À<<‡€àŸàððxððwøgøÿð8<þÿþÿáàyàxðþðð>ðp7ø<€Áàøÿ€àáÿÁÁÀàßÜàáà?ÿñàðxøøxxxxƒÃÁçáðÿÃÀðà‡ÀÁàÁàðpxøøpx LJƒÿûààxàxp€ž0px<ðxx<<ÁðpxƒÀàáÿÁÁààƒßÜð€ÿÀçø?ÿãóñþ€ÿñüþÿþÏŸóÿáñ÷Ïãøþÿÿ߀à<<‡ãÃàãàðð|üyüð|xøùáà<?<>¿‡Ÿááàñàððƒžððx|ððx<>™ð`ðxƒÀàãÃÁÃÁàßøøÀÿàÿüãûùÿÀ€ÿóÿÿÿÿŸùÿñÿãÿóüþÿÿÿ€øÿÿ?ñÿÇüÿÀùü?øøðøøÿüÿ?ÀüþŸçÿßßÀãðÿñÿóþ?‡ÿùü?ùøüüÿÇßÀƒøÿðø?Çÿ‡çÀàóÃÁÿàþ‡ÏÏ?ø‡pøÿÀÿÀÿø‡óûÿÀÿãÿþþÿ?ùÿñÿÃÿ÷üüÿ‡üþùÿ‡þÿ?ñÿøÿ€ùü?ø?ðàðÿñÿýÿÀøüÿçÿßÿÀÿùÿáÿçþÿÇÿÿÇóþ?ùùüøÿÿÿ?À?ãøàÿðþçÿÇÿ€óóÿñÿðþï‡þÿ€ðþ‡ð?€~xþ€þþœ¼ð8àÿÿñø|÷øüøÿü?ð>ø¿øøðà€'àoàÿüÿ?Àð øÿá÷ÏßÀÿøÿÀÿÇþÀþÿÃóþñøü?ðÿþüà?áø?ÀàüãÿÃÿóùÿøÿðüÿþÿ€ðþ?ŸÇð€ààþ@ÀÀ~xøóÀÿùæïü€xÿƒÃü€€€øø€?ÀàÀðÁã‚|ãñÿðyàxþøÇ€àø?ƒà?€ðàà€<€ðàààøøð>€ÀøðøÀðøø?À€€p0ààü ð~p à|?pààø>øþððÀxà|€>à0€xàà|øÿøøÀ|ð>€€ðx€€ ÿÀð€À<yîððÀxà€àx€Àÿáü8à<€pÀ€øø<9îààÀ8ð€€àx€àÿãþüðüÃÿðÀðþ?þÿ‡üžÏ€àü8ƒðÀxð€ðþÇð8ð8àpÀ?žü€€?Àð€€?ð<ÿãÿþ?ø?þ?óÿð?àðÿ?ÿÿÇÿÿ¿ÃÿÀÿàü~çøðÿøð~>üÿ‡ïÏø?€øüÿÏÀÿ€ûðÀþþ~ñóà€ðøø||ÿüø<øÀãÀ€À?Àðð8àø8€?ø<øóãþ?þ~|üñÿøðÿðߟÿÿŸÿÿÃÿáÿàü~?çøøÿüø~~üÿÃÿ‡ÿïøÀøüÿÿ‡ÿÿàÿáÿøÿàüÿÿóÿñÿÀ?ùùøþ~ÿþßÿüü?àÿàààà?ð?ðøþð?üüþ?þð?øÿŸ¿ü~?€áðøÿ|>xðøøÿøxøðø‡ï€>‡ÿÿáÿñáð|ü~Ãø>|üü>>?þÿãÇÇÿçøÿàü?þÿƒÿÃÿÿðÿðÿøñð?þÏÿñÿùóàLJ€üóÁàxxïüð<<áçÿáñáÀpð<Ãǃáððpðx|yðø<ÿLJƒ€|óçðxþÁçÿÁàÀ ð<ƒÇáàððàx|3ÿðxÿLJ‡€xcÿðÿüx8àÿއžðpx<ðyÿøÀÀàà8þÿüÇŸÿÁÁáàÿàðü}ðÿøxÿøðÿ€ÿÁáààxàð<àþ<þÀÿÁàÀð<ƒÇáàðpðx8ÿðxÿ‡‡ƒ€xÿðÿüx<ÀÿŽ€žðxüð1ÿøðàaà8þÿ€ü€ÿ€ÁÁÀààð|àøxøÿø€€ÁÁààxÿðð<àü<üÀÀàÀð<ƒÇáàðpðx8ðxŒ‡€xÿÀ|øx8àžÌ€žðpüðÿð?ð?ð?à8üÿø<€ÿ?ÃÀÿÀà`ò| Àøxøàx€ÁáàðyÁðø<à<<<ÀÀàÀÿð<ƒÇáàðpðx8à8€‡‡€xàxx8àÜ€žðx~xððoøoøÿà8|€x<€ÿÃÀÿÀùàÿ?|þüxøø0øøÇ€ÏǃÁáàðùàðx|à<<<>àGÁÁàÈðð<ƒÇƒáàðpðxxðp<‡‡‡Ðxà`|xxðü€žðxxøðpxpyùà8<x<€óÁàÿÀÿàÿÀ?üÿ€ùþ~xÿøÿŸÀÇÿ‡Ãáðùñÿðüð>~>ÿðãóÁðüñð<ƒÃÃÁàððøø|øð>>燇‡øxñà|<<øøø€ž ðx|xøpxxxyàà8< ƒx8ƒ€ÁÁàÿÀÀÀøÿð?óÿ?ðÿðÿ?ßÀÃÿçóøÿñÿà?þÿçøüÿ€ü<ÿÿ?€ÿáÿÇøüÿüÿ?ÇãÿÃóùüÿñÿàÿÿÏÃùþÿà?ø?þ|üÿÿøàÿ>?àøü<~xðÿøÿùáà|?€üï‡ð>x?‡ÀÏÃÁðð?€>?ÀðÿøáþðÿàþßÀþçóøÿáÿÀþÿçøüÿ€ü>ÿÿ?€ÿàÿ‡üüÿýÿÿ?€Ïáÿ‡ûýüÿáÿàÿÿßãûþÀø?þüþÿ‡ÿðàþ?‡àýü?ø?øàÿðñÿýÿÀø?ŸÇÿ?ŸÇð?øŸðÿÿðÿàÿø€€0`÷€ÿÃøððÇ|?€~øøüÿ¾ÇÀ~ñøðÏÀþ€ÎüÏÁñþ?€à¼üüÿøpàü?àøüðàÀààÿýÿ?Àð?ŸŸÁü?ŸÃððŸðüÿðÀàxàÀ ~8à ð0À àÀ€€yÿ€ÀxàÀàðÿð?€àxð|ÿøðxÿðøpàø ø~xüÿÀÀà?0àøøÿÀ>àà8ðàà€`üÀø|Àðð|?øàð?€?àðþà pxÀ>ðàüøàð?wÀðüà€àà <€ü€p€> x0øpàð€s‡€àðà€ÿÀðóððþÿ€?Ãüƒ÷àÿç‡À|ÿðÀ~ƒÇ?ÀãÀ?þ 8àà øøà~xp`àáÿàÿðÿñø?üÿƒÿÀ?ÏÃÿÃÿñÿÀÿïð~ÿ€üàÿÏÇÿÀ?áÿðÃÿßÀÿà?ø?þøø€8ÿüÿ‡ßðþþÿ€àÿƒçÇßààùðø€ÿü~ž€?Àóààà 00ãÀà~ÿóáàñðññøü‡ß€?ÏÿÃÿóçÀÿÿðþÿþãÿŸÇÿàÿñÿðÇÿ‡ÿÿáÿððþü?øxÿ‡þÿÿÿÃðÿþÿÿáÿÇÿïÿƒàñÿø?øÿü>ÿþÀÿÃÿðøðùüÿ?ÿƒïÀƒà?€áÿÀðóàðøpðpø>>ÇÃÀ‡‡Àÿûáàÿþø>‡€Ÿó÷çÃÃÿàðøÿøLJÃÿÿðÿøxxÿÿ><€|ÿÇÿÿÇÿÿáøÿ€÷ããáÿ÷ÿÃð|xüxx8ƒ€pÃÇÏÁàðþð><<<ŽçãÃÁàýáãáðùàããƒÁáààãÿðÿàÿàx<ÿÃÿ€ŽÃÀxgÿàðx8ÿ÷ÁóÃÀñàÿøxxÿÁàððx<Žþ8Á燃ãÃáààx‡Ÿÿ‡ùÀãÿàøóáàpü|>8<‡ƒÀpÃLJáàø|x><‡ÁáãÁàxñáàpxpÁãÁáàààÿàððxxÿƒÿ€ÞÃÀðÿàðxxÿþççƒÁàÿøðxÿÁààðð<àÿÿþãÀÁààpÿ‡þçÿàðCÁÀàÿø<àÿÀpƒ‡Ãÿðx`<xÁÇÿàðÃÁÀðpðçÿÁþ@àððÿðx<ùÿÀÞÃÀøÿÀðx8ÿÿ÷óÃÁðÿøxxÿàðpp0ÁïÀÁààxŸ‡‡€ÁãàÀàÁÀðø<p<Á€pÀÁà p<8ÁÃÀ@àÀpøðÁçÀÀàðÿàÿðÿñÿüçÿ‡ÿÁàøÿóþÿàøü|ÿ€ÿÀã÷ãÿãøøø|ãÿàððxx|ø€‡?þÀ<ãï‡àÁàðxÃÿ‡Ï€ãñÿàðÁàp~x<|<ƒãÀxàǃàøpx<ÁÀáðàðà`pðpÁãàÁàð?àÀÿàÿãÿøÿãþÿƒàðþûþÿ€ýüþÿÏÿÿÀáÿÁÿçüñüüÃÿ‡óùøðð?Àþüà|ÿÏÿïðóóùþÿ‡ÿÿÿñÿÃüçóü?ðÿø?áÿ€üÁÿÏÏÇøÿáþþü?‡ÃãáÿÃüÿáüñüÿ€÷ãÿÁûàÀG€OÁÿ3ðàüàpþùþýüþÇþÿÀàÿ€ÿçüáüüÀÿûùøðð?Àþøà|ÿ‡ÿïøóùùÿÿþÿÿøƒüóóþðÿ?ø?ðÿ€þ?áÿÏÏïüáþüü?ŸŸÇçóðÿÃüÿãþþÿÀÿðÿÁÿàà€€à<pÀÀ€À€w€€€üà?À8þÿÇàÀþüø|>à>øÃãü€'à?à|ü?àÏÏøþðð?çóà?üƒþüÿ€ðÿÀààppÀà€€ÀðÀÀü?mÀ?àpÀ€àøÀÀüà€üàÀð€€ÀÀøÀ€`øðÀÀøààøãÀÀðø<€øáÀàxüøü8|ð ÀàÀøçÀ€ðø<Àøãààxø<€Àøüx|`ðÀàÀxãÀÀð8<Àxóààx<>ÀøÞ|<`ðÀà x€=À€x8€xáÀàp8À8Üx<`pÀ|ÿ€?‡ÿ‡ß€€ðxà~?ƒßàà}øøàøxðÀãÏð€¸ððüÀ 8ààÀ<ÀÀÀ8ÀÌ<pàxÀÿÿÀÿÏÿÏÿÀÀÿàx?ðÿ€Ãÿƒà?ðÿø?øàøÿðãÿß?øÀøÿÿøø|~þÿð?ðxð?€?ïðà|øøàøà8>ð<<ðð8ðÀà<àüŽøÀ€p!ÀðÀ~ÿÿàÿçÿçÿàðÿðxøÿÀÿãÿÃà~øü?üø?üÿüóÿ÷?øÿðüÿÿþüÿÿƒÿÿøø8ü?‡ÀáÿÁø?øþ?ü?ø?üð|ÿþ~>ø?ø8øðøø?ø>ÿÿ€ü?ðððÿð|ö>>üÿÀÿ€àÿƒóáñ÷óçÿáùññðøxx|ñãçÃàøxüýøøø|xüøóÿðxùñðüÿÿþ><ÿÿ‡‡ÿðùðx<<?Àÿáÿáø|xþø|ø<|?ø|ÿþ|>øxøx>|ñøü?ü>ÿÿ€ü|øøðÿø|þ~>þÿÁÿÿàÃÁàñàûñãááðùþpx||<ÁàóÃÀðÿü?<ø|ø|<?<ðxøð|9ðø<<ÇǃÇÃÃÀxx8<Àðññàxx<¾xxx<<<||ïÀx88<Àø?<ƒ÷Ààx8<~x~x<>ÃÃÁÁáà‡ÀóÀóããÃáÿñÿàøÿü<ƒàãÃÀàÿø>8ðyÿøØ>yÿùðð±ÿð<>þ‡ÿ‡‡ƒ€ÿ0xþÁàñáàpþü<ðxÿø~xxÀx0x|€x<<<ƒç€àø8<ÿøðpñÿø?þƒÏÿǃÃÀà8þÁàaààxü ð<ÿü?ðx8€Àà8?þÀ8<ÿƒÁ€àü8x88<ÿÃÿáþ@ÿƒÀóÀûÁãÁáÿðÿàxÿø<ƒÀƒÀàÿð<ðyÿø?ø<ÿñðð?ñÿð<<þƒÿ‡‡ƒ€ðxüÃàÁàxÿøð8ÿø?øðÀàxþÀx|<ÿƒÀàÿøxpxx8<?ÿÇÿÁÿ€ÿÁàùàùáãááûàÿðxüÁàÁÀðxð<ø?ü<øðx?ùðü>ƒÏ€ƒÃÀø8|Áàààxxø<üüx€Àø8?€À8<ñÀà|8x88< <þÇÿÀÿÀçàóÁóÁãÁáðáðxø<àcƒÀàø<ðxøx|<ðððqùð<ø<<€‡ƒ€ãðx|ÁàÁàxøðxø0|øÀcøx|€x|8<Ààøxpxp8<>Ç€ÀÃÁðñññáãáàø1ððx~<<ÀðóÃàp~x>x||8<<<ø8ðxx<ø0ðƒÇÁ‡ƒÃ€ðx8 Áð1àà8|ø<|<|€Àx88>À8>€Àà|<x888ãÀÀàÿãÿáÿçãÿãðÿñÿððþ?øþàÿçÏãø?øÿøøü~ñðøøÿð<<¼‡‡ÿ‡‡Ãøùø8üüÁøñáàxø>ýøø|||8€~ƒØxxx>€x><<‡Àì|8< pxx8<>ÃÃáÃÁàÿñÿàÿçóÿóøñÿðxÿøÿøçïóþðÿ€?þ?ø?üÿ€?ñùüøðÿŸü?üÏçáÿÇáøÿø<ÿü?‡øóñùÿø€?þ?ø?ü?üŸàÿÿáüøÿüàþþ>?‡ÿ‡ðþ?øðð˜ÀàÁøøà€ÿÿ>à‡À|ÃÀð'À<ÿà?‡øÃñùÿÀ?€œàððàüÏðø'àÿðñÿø~??Àüð|àøüþü~‡þïøÿðÿÀøÿ<À<€Þ ø|<à>ðxÿ pü?ø€ÀÀ àÀ€à>8>à0àààÀàÀ?€<8>8øàxøààÀààÀ<€<><|ð|ø€àÀÀààÀ<€|ü<ðxø€à€€ààÀ<ø<ðx¸€|ÿ€?ƒßƒß€?àààûàƒÏ€ãçÀ>øÏðö à<à<ø0ðx€8ÿÿÀÇÿÇÿÀ?Àðøðÿøÿ€ÿ‡ÿÀÿãÿà‡ÿÇüÿüÿø€x¿øx?À~ÿ€ÀÃïÀðpþð|=àþÿ€?ðx~À?ãÀCƒÀÿ>Ÿ€ÿÿàÿçÿçÿààÿðüüÿøÿÁÿÇÿáÿãÿáÿÇÿÇüÿþÿÿßÿÿøü?àÿÿÀ?àãÿàðøþü?þð?øÿÿ€ÿðx>ÿàÿÃÿãÿçà?Àÿÿÿ€ÿÀÿÁýññóûãûàøððð?<>|ÿüÃããÿãçáÿñÿçÿãø?ÿσÿÿ‡ø|?ÁÿÃçÀðóÿà}ðüþþÿø?ü‡ï€ÿðx>ÿàÿãÿñÿÿðàÿÿÇÿÁÿÀãÁðñàùñáñáðyðp>>|>|<ÃÁáñçÁàýóÁãááàÇǃƒï‡ãÁÀ<áãÁÀxxðùøðøp|>ßü>>‡Ã€áàxχáàýðøüxyð8ƒÃããÁáÀÃÁàóàùááááùùÿà|?ÿæ‡ÇƒƒÇ‡ÃÁÀ<Áãá€ðyðyððø0<<Ž<<‡Ã€àà0‡Áðøàðxxxp8ƒÁãÃÃàÀ?Áà{àyááááÿøÿà| xx<<ÇÿááçàðÀóÁáà<?ÿüƒÇƒƒ‡‡ÃÁÀ<ÿãÿðqàyàðÀ<<ÿ<<ÿ‡þÀðƒÀðð`ðx8pp8‡ãÁÁÿÿÁàûÀûááááÿðÿà|xx<<‡ÿãÁçÀð€óÁáà<?ÿþ‡‡€ÿ‡ƒÃÀ<ÿáÿ€ðàyààà8<ÿ|8ÿƒÿÀðÀðððpxð8‡ãƒÁÿ€ÿÁà{àùááááð ÿð|xx<<ÃàáçàðÀóÁáà<?ÿƒÇƒƒÿ‡ƒÃÀÿÀÿÀðàyàð?ð<<ÿü<ÿ€Àð‡ƒÀðððp8?ð8‡óÀÿÀ÷ÁàóàóÁáááðáð|x>x|<‡ÀÁçƒÀàÁóÁÁà<>ÿ‡‡‡ÿ‡ƒƒÀ<À?Àðàyààoð88>ü8€ÀàÀððàpxð8‡ãƒÁ¿ÀÃÁðñññáááðð ðð~|>x<=ƒÃðááãÃàðÁãÁáìƒÇ‡‡ÇƒƒÃÀÀÀøàxàððx8<?<<ƒƒÀàð‡Áðððp8xð8‡ÁãÁÁàÿñÿáÿçã÷ãðøñÿð?|üø|?‡ÃÿÇããÿãøããÃáü?þŸ‡‡ß‡‡‡‡Ãø<ÃàƒÃÀø1ðñààðð8<><<<<LJ€áàáàðàpxðð{‡ÃãƒÃÁÀÿùÿàÿçóÿóøðÿðüùþþßðÿÇóùÿ÷üÿÇóðüÿþÿÿÃÿçÿÿÇáüÿáÿÃÿÀ?øÿóñøÿð~ÿÎ?À<~?üãÿ‡ÿ€ÿð?ßßÁÿãüðø|ùü?áÿÇÃãÿÀàÿñÿÀ‡÷ÿóðÁÿÀøñüþŸðÿ‡çðÿçüÿçðüÿüþÿƒÿÇÿÿÏáùÿÁÿ‡ÿ€?ðãñøÿàÿÿþÀ?ÿøÃÿÿÿðÿŸÿàÿÇüùüüÿü?áÿÇãÿÁàüð€€ààø8ðÁàð?áàxÆð üÿÀñÃÿïÇàðÿƒÀ?ÀððoÀÿîü?Àÿ3ðÀüþ?pÿŸà?ƒüøüxüðÃá¿ð'€ñÀò þàž€?€>8À< àÀà€àÀÀþ€àð€ÿÀðøÀ0€ààÿÀðø8À€8øÀðð0€|À€ðx8€àÀ|xãÀðð8`€xÀðx8Àààøxç€ððx à€|øÀÀ<€ð8xààðð8ã€pp8`€xü?ÃüÇÇÁÿÇà?àÿƒü?à|ðø?ÀÀùðþà?çðüàÀ8à 0ààxÀÀð€àððàÀ€xþ?ÇþÇçãÿÿð?ðÿ‡þ?ðÿð?øàð€ÿø?€áÿøïøþðÿƒð>|ø>|ð{ø8ð9ðÀüð>ƒß€|pàÿ<<>‡‡?Àùðð0yð€?üŸ‡øøx€0p~xÏÿÇÇáÿÿø~øÿãÿ€ðøÿð?ð?àÿøÀ?ñÿü?ÿüþøÿ‡ü?þø?þ?øÿøü?øðü?ø‡ÿÁÿððÿ||ÿÿ€?àÿððøÿøðÇþ?ÿ€øøÿÿÃüü?üƒ¿þïÀ?ñÿx€‡ŸƒÃáàÿþxx|>Ÿ‡ƒÿÀðüøøø~øðüàøþ<ÿ|¾þÿ><þ<<ü?þ?ø?ø<<|?Ãÿáÿ€pxð>>ÿ€‡‡ÿ€ðÿøðøüø?Çÿ€ÿøxÿƒÿÃüž?þÿÃÿƒÿÿàùÿ€xÿ€ƒÃÁàø|xûü<‡ãÀððyøøxxxð>|ùðøxx<Ï<ž<žx><>8xàð8><>x÷€óÀðqãñààŽáããÃÇýàáÃÃÀxÿ€ŽÃÁáàøx<ÿü‡ÃÀððyÿøx8xx>8xðøx8?þ?þæ Ž?þŽ|><<<< þüüþ||<8<øü|ÁÁáÿÀpøÿ€ƒƒƒ€à88àp88üÀàÀÁàààÞÀÁÿ€àáÇÿÀxσüƒÁãàðx<ø<‡ÿÀððxøxø<ÿðøx<€>ÿø<|<8 ð> ><8<<8<|ÁÁãÃÀpø€‡ƒƒ€ðx8àð88<<<ÀñàáÁààààǃ€àÿÀÿÿÇÿøÿùÿñøü~?ø?Ïÿóïóüüø~øøøðð|xŸ¾Àþ?>¼?<<8<||>>?<ÁáãÃÀð|x>€ÏÃÀøx|ðð8<<<<ÇǃÀáàƒÁÁààäàcLJ€àüÀÀÿÿƒþðþùÿóýþþð‡ÿóÿÿþ?ü?ð?øÿþÿÿü?øü?àüþÿ€øþ?Àü?Àü~~þ~~?ÿ?üø÷óóÿóþ?ðÿÿàÿçÇàðþÿøþ~>ÿÃÿÿðãàããáðþþ€ùãÃçÿáøàóÀÿÿüðüøÿñüþþàƒþóÿÿþüàðþÿÿüð?ø?àøüÿ€þþ?Àø?Àø~üþ?ÿ?üðÿóûÿ÷þðþÿàÿïçà?áÿøÿþ?ÿÁÿÿÏðÿøÿûóøþþ?Ÿ€ÿççóÿóüÿÿÀ` ððÁýóüÀþüÀàÀà øÆÿø€à?€à~>ø|~þðà÷áñÿóþÀüÏàñÇÇÀÀþxÿþ~ÿ€ü÷Ïðÿøÿûñð|ø?Ÿ€‡çóÿóüÿàÿp@~püpÀðàÿàŒÁð<Ü€pþ?øààüøÿàøðÿÀ?hðÀ€€€àøððààààðàÀ00~À0øð?ð?ð?ð?ð?ð?ððààpx€p<xþÀðø?€8p<À?øð?ø?ø?ø?ø?øðààxx€x>x~Àx<À<x>ð?€ð>|x|x|ø|x|xðÀÀpð€p>øÀðxÀ>ð~à?ÃÀ€xðxàü<<|<|<|<|<p€€xà €0<€0À0<Àpà€ÿÏÏÁÿ€ð?ñùø?ðü8x|x|xxx|xxÿÀÃïÃïÀ€ðüàüÿà`8xxx1àÀ8p8ðÀÀ€oÿïÇáÿàx?ùøüø?ü?à|<|>xx>xx>xÇ€x€ÿà<<8<ÁàpÀpðð8>ÀÿÁàÿ‡€àxà_ðø8<ÁãÀðpp8üƒàx8ƒ‡ààðpøÀÃÁãÃðàøðx|ü|<<><<<|<||x|||xøðx<ð<ðxðxxp8ÿðøp€ƒÃ€8ƒÀðà<ÁààxÀx~øx<ÀÿÀàÿƒÀÀð8à`xü<<ÁàáÀøx88>à88ƒÃ€ààpx3ø‡€çÁÿñÿãþøøþøü8x>ø<ø<ø<ø<øñðøøøøðøðøx0xxààx0÷‡ƒÇ°xÀ€áà<|<<ÁÀàxÀpððxxàCÃÁà‡ƒÀØð xð`ðx<<<|Ááàðpx8<à8xƒÃààðpp8À€ÿÁÿðÿçÿø?þ?ø?ü?øø?ø?ø?ø?øÿüÿøùøýøü~xøñð~xÞÿƒÿÃø|‡ƒáÀóüþ<>Ááðx?ð|xþ?ü¿ÿðáÃÁð‡àÁø|ð|üðxø<<þÁààñðxx<ð>üƒÃÁàðpx|<ƒáÀÿÀÿð‡þ?øþð?øðððàààÿüÿð?óùÿùü?ððÿü?ðþþÿƒñþ?ŸÏÁÿ€ÿüÿþçóùþÿÿûþþÿ€?üÿ‡þÿÃÿ÷øÿáÿÁø?áþàÿð?ÿþçóðÿãÿüþ?üƒü?þÏçáÿÃÿùüø?áÿÀÀxàþøÀðààààààüoàáøÿøüððÿüð>üþÿñÿ?ŸÏÀÿ€øß~óññÿÿûÿþ€þÿƒüÁÿ÷øÿðøÁÿ?Àð?ÿÿóóðÁÿü~øÃþþÏçàÿƒÿüüø?ðÿ€Àx<0À~x€`@ü<üü?ÿðùà`€ÿþ@àƒüÀ~ýðp3à?à>Àx8``†à|ðþàü@|Àpàø`ààøðÀÀøà>àøðÀ`€0àøààxðÀ€p€8àøàðà<xÀ€à€80Àxü8ü¿ÿ=àÿàøÁçÁçÀ€ÀøôðÀ`€pà€88€8ü|üÿÿÿãÿ€ÿà?øãÿãÿààÀ?øþø>|ðø€€?ƒï€€óáÇ€€?à>ƒÁàøüxxxüx<ÃÃãÀxÏçƒãÃÃÀxxñàà8à?ÿ‡úÁçÿãþÀðxð<ðñððø=ÿø0Æ~ž<>ðñàùðáðóáð|ñððàsáàð`<ðxðxÿÿø?ðü?ÿ<<ðqàxðððsÿðxpððð{ÿðÿ€< ÿƒüà 88ƒÿàðx8ÿüxx8øÿãÁÀx?þƒÁãü<0ð9ÿð8À?þ€ÿçÿÿÀàxð<ðñððÿýÿð?ðüþx<<ààyàñà#ÿàpàñÿóÿàÀ<xÿþàxÿààpxÿøðpxüÿÃÀp?þƒãÿxÿûÿðxà€ÿ€ÁçÀÿàðxð>ðxðxùð?øÿ><<ðà|ðñðð@xððÿùùÀ?ðüÿÿ€àøƒüÀðp8ÿøpx8ÿÿÃÀx?üƒƒÀáÿ€8ÿùÿà8à€ÁçÀƒÃààxð<ðñððøðsøþ|<<<ààyàáààpàñðÀÏð?øÿ€à?øÀàpxððpxÿ€ƒ€p<ƒàÿ€xùóàxáãáááðøxx<ðxðx|øpx<>>ððxðððð`xðððààx?|Àà>xƒàðp8xxx8€ÀÁÀx>ƒÀãÀ8xà8üþàÿÿãÿÃÿàÿü|ùñùðø|8ÿð|ø>?¾>><>Àøqðñàðøqñàøàðð!ðàððx8‡‡€ìxx#áÀàpxx8ðp{ÁƒƒÀr> ƒÁǃÀxðð`xþÇþðÿÿùÿÁÿàþ?ùýÿùü?üðøÿþ?Àþ~?àøóñøøÿáþùø|pÿàÿð<|?€ÿÇÿÿ€þ?€x|ðÿàðxx?øø|?ßÿÃÃàþƒÁãÃçÀ||8ÿàþøÿƒøàþÿðÿÿ€?ü?óùÿùüð?ÀðüøÀüþÀàãóøðÃþñøàÿÀÿàüþ€ÿƒþÿþ€þ‡ðÿƒùüü?ñýü?þÿçàøÏÃÿƒÿ€þðÃÿ8€`x>ðàøùøøð€'àüðÀø~?Àà?Ãñøàþùøà?€àø?ÿ?€ÿÁüÿ~€?ÿÁð?øü|áüüþçà?øÏÇÁÿÿþð?Áÿž0o€€ €€À€>Àà?àÀ€Àü?ð8`Ààþ?€À<ø€À|ðÀàü?€À|ø€`€ÀÀà<€ððÀÀà>€Àüø€`€àÀà€ø€ðàÀà<€Àð>>x€à8€àÀÀ€ppÀ?à>ø<>>ü?àÿÀÀð<€ð?€@ À€à<<8€€ðà8àÀ€xÀ9à??þ~~þÿáÿÿàð?€ü~~üøÃãáûð?ððø||>ø||Ÿ€|ÿ€Ç€xøxü<ààyððüŸÿøÿøï€þð?þÿãÿÁÿà?øàþ~~ƒÿøÿãóñÿøøüÿü~~?þþÿÿ€ÿÿ€ÿàxøüþþüðÿøøÿþ¿ÿ?ÿƒüÿðøÿÿ¿ÇãÀ?ðüÁûðüøðÿÀpüó÷à|àÿ‡ü>?ÿ¿‡üøqðÏ>?ŸççÃÃãà~øðß>>‡ÿñðóáðÿøxøþü~>ÿÿÿ‡ÿÁÿƒÏ€ÿðxøü~ÿþðø‡‡ÃãǃÇÁ€ðxx8< ‡€<<|<ƒßƒçƒÃáÃÁàà8À‡ƒÃÃÃÃàx0pàpqàp|p8xƒÀàp< xñáÀp8ƒÁÇÃÃÁÀx8ÿøçÿáÿ€ø8pðƒƒÁÿðàð|0àÿ<‡Ããã‡ÃÃüðxx8<ð€<<üƒßÿƒÃƒÁÇÿàà8ÀÿÃÁÃà€pàpqÿðx0xüƒÿðp?àxaÁÀp8ÿƒÁÇÿÃÃÁÀ€ÿøçÿÀÿÀøðÿƒÁÿðàðxðÿ<‡ÿãÀÿÃÿð8x88ü€8<üßÿƒ€ƒÁÇÿàà8ÀÿÃÁÆà?àðpqÿðxxüƒÿàpøpÀp8ÿƒÇÿÃÁÀ?ààøÇÀÿàøð<>ƒÿƒÃàààx?ð?þ<<ÿÃÀÿÁÿ€ð8xx8üÿ€8<|øßÿ€ƒÁÇÿÀà8þÀ<׃ÁÆàðàxáÿàxx~ƒñÀpøpÀp8þÇÿƒÁÀðÀ|çÀÃÁàøÿð‡ÿƒÁðàðxcø<‡ÀÀ€Àð8x8<þÿ€8‡ƒ™ðaáàxðx<<<€À€Àðxxxx<8<|ƒÏ€ƒÁÃÀàxžÀ€ƒ€üÀpxøàÁàxx|ƒàp8ðãÀp8Ç€ƒÁÀp8àÿÿŸÿ?€ÿãÿÃÿàüððÿÿÿ?çÃüÿðÿðüüø<>þƒÀƒÀÀ‡ÃÀðxx<üŸ°<<>8ƒÏ‡€ƒÁãáÀì{žÌÁƒƒÀ|àxxàðpøpx<<>¹ðàp<0pÁÀp9ƒÃÁÃÁÌx8áÿÿ‡ÿÿ?€ÿáÿƒÿÀøÿýÿþÿïÿãøÿàÿùþÿðþþÿ?Ããðã‡ÿ€ùóþ?ü?ü?‡ÿ‡ð||?øÇÿàÃãáÿÁüžüÿÿ‡ƒÀxà|ðààðÿàü?þøøÿãü?|ñøÃÀp?þƒƒÃÿ‡Ãáü|øðÿ‡ÿƒþÿ?€ÿðÿÿ€ðÿÿÿÃþÿ?÷ÿáø?Àùÿàü~ÿ?ŸÏÁÿðÿ‡ÿ€ÿãÿþüŸÏÿÃÿÃðþ~ðÿƒþðçóðÿ€ü?ŸÿŸðüÿ€ÿçà8øðÿüà?áþþøøÃþ?øóüÿñþ‡üÏçáÿçðüðÿÆøŽ>}À<ÀýÿøŽ?ãÿáðŽ?€ÿðÿþÿÃþ¼øŸÿÃ÷ƒàü~àþüàÇãà~ü?ÿŸðøÿþÇà0øoàÿüðþÞàð?þ?ðãüÿóþøÏçàþÇàøà<ðÁ€€Ã>8øøaŒ<ààx<ð€à8ð€ðpøÀðð€?Àþ€@þà<àÀ€€>àþÁð<>ðà€ÀÀp€?€àðøð8|àà€ €ÀÀðÀ?à0à<xÀð<üàà€€ÀÀxÀ€à8€ð<ð€ãÀüðg†@p€€€ÀÀp€€pà<øƒáÿáÿüÿß~À?ãÀá÷àžÏ€þ÷Ïþ€€?€gü>0€À À<€pð< ø‡áÿñÿþÿÿÿøçà?óÿðÿÿÃÿÿÿÿƒÿÿÁÿ‡ÃøüÿÀÿ‡þþ>ðÿÀàÀÿ€à`|<Áàðÿ€?‡ß€àùñøwàÿààø?ÀüÀóà€>þþ~à8øøÿðÿ>|xø>àÀÀqáð<>xƒñÿùÿÿÿßÿü?ãàùÿðÿÇÿãÿÿÿÿÇÿÿÃÿÇáøüÿàÿ‡ÿÃÿðÿàðÀÿÀðüÿÿÁðøàÀÃÿÀÿàýøøøøðøàƒþðÿðàþÿÿð<ü|ÿøÿ¿ÿþþÿàððùüþ?ÿ€øðüxxÿþàøxüðããÿçÇÃǃÿχƒÃLJáðyáàÏŸááàñàÁáàñàþÿÿƒÁðü?ð?óãÿÁáà<|øxø~||ø8xððß|ðÿøxx8ñàpƒÇÇàð<<><ƒ‡‡‡ï‡<8xx>?Ç㇃ƒãÀðððx8ÿ†àð<ðxÁñáÏÃÃÁáÿƒþþàxãÿðŸÿ€ÏƒÿðüÃåðþ`‡ƒÇƒÃÀp<<8ÃÀñááø@?xx<8ð><<ÁÀñààÀð88x8<x<8<ð‡‡€x8xðàpƒÇ€àð<<8‡Ç·€xp<8ÃÀÿÿ€ÿüþ?‡ÿüà?ãüùøüÿçøÿƒàðÿƒÿÇÿÃð€ÿàÿÇÿÇLJÿ‡ðÿàøðáùàñðƒÇÃÃÀx<<=Ááñááðà>8óøãÿÀÿøþ~~ÿ‡ÿ‡ÿ‡Ï‡ÿàð?ø?ø<>‡ÃÃÿÇÃàÿþÿøüþÿàÿ‡Çüáøøÿ‡øþÿÇøþÿƒÿü?€ÿÁþÁÿ÷ƒð?ÀÿàøÀÿàÿçÿÿùþü?ÿøÇóøÿÀ?øþ?ø?øð?ðÀ?óÿàðÿðÿü?áÿÏÀ?øÞþ~ÿ÷Çÿÿþààðð~?Ïçáÿïçð xÿ€ÿƒø€Î8ÿàxøpø€üãàOÀø?O€ÿçþþùþø?ÿð?ƒáð€à;à?ààà€áñàÀ~àøà~‡€ Œ||Ç>üøàààÀ~?ÇçÀùçÇà€ÀàáÇ€€Ž88€Àà€€88ÿàÿÀ€€8|€þàÿÀÀÀ~~À€üàÿÀà~~ÀÀ<€À|‡€‡€?€‡€À0xÀ €à>€ðà8?|àpxàðÿàÀ€ƒ€à øÀxxàððÀðÿð€À`pàx8àpð€àxÀøÀ€Àp8 ~ƒÇð€ÀÀøðüø8ÀààÀp€ø€<€à pÿ€ÿÏÇÿÀüãññÿüÿÿÿÀðø?þχŸþü~ÿÁÇ€À0ÀàxÀÀxaÀ`ÀÎð3À8ü|áÁðø?@ãÀ8ÀÐ~ÿÁÿÏÏÇÿÀøóóñÿüþÿÿ€øÿøÿÿÿÿ¿€ÿ‡þ~þ?þÿÇÇÿÁÿ€ü~à}ø|à|ßpà€pÿàñð?àþøÿ€ÿ¿~þÿ€óàï€÷ãü<üÿχƒïÀ?ð?àð|>þãáþ?ÿÀóããçÃÃÿàøùðð~ǃçÀøüƒÿ‡ÿÇÿÿàÿÃþ>ÿÿï€ããÿáóÀþ>øþ~ðÿÿÀx?øÀx?àÿðÙðø~ðþ¾ÿÀÿÇÿ‡ÿ€ÿƒÿÿÀÿøáÿàÿóþ>žÿçÇÁÿð?ø|ð?øÿÿ‡óóÿÿ€ÿàÁçÁãƒÁóàÀðxððp<‡ƒÃ€x><<‡Ã÷ÇãóáãÀð>‡€ÃÁûãÁÀ|<ÁǃÀýàðððpxxÏïƒÇ‡Á燇ÿƒÃÀÀóÀóÃÁñàÀð<ðpx?ÿöÇÃðÀ8>ƒÁóÃáààáàðLJ‡€ááðóÁà<8žáÁàðxx<ÿàxpxxxpxxxñà|ðpàáÁÀxðð8ð88‡ÃƒáàǃÃÃÁÁÀÀ÷ãƒÁàÁà<ððpþüÿÃþx<<ÃÁƒÁÁàÃààÏøÁáàçÿà?€¿À8<áÀÁàáÿàðÇ‚€ááàóÀ`>ÿáàppxÀ‡ãƒÇƒƒÀÀpðð9ùàpàÀダààpðp8ƒ‡À>€ƒƒƒÀóá÷ãÿãðü|øøþŸ‡çƒãÀ<<ƒÃàÁàããàö‡Ç‡ƒÀãáàñààà>áÁàðp<ÀóÃÁáàø?øÀxðøðxpxøðÿþÏÃÃÇÃǃÁàÇÿƒÇ€Àxx0ðqÁàøþþóáÿÁø}øð|øƒÃÇÀ燃ÃãÀÿÀ€ÿ÷üü?ð?ü?üþ?áÿÿ€ÿÿÿøóóùÿø~?ÃÿÇÿàÿóóøÿÀÀü€?ƒñÿñÿãþøÿøÿüü|x?ü?ðÿ‡þÿáÿÇçÿçàÿÁÿƒÿ€àþ>pñóùþ~?Ãþÿáÿóþ?ü?ð?øÇçáÿ€ÿ‡ÇáÿÀÀ ð€0àð?À|?ÿþ>þðãñàÿø|Áü‡þà}óóð?€ø€Ãáÿñÿƒþàÿàÿøü?ø?xÀÿøÿÀÿÇÿÇà€þÿàþààÿùü|Áøÿ€ùáü¸À?àÏçÀÿþÇãÿ€ÀÞ8<0?€8à`@ ð?ÁÀþðþ€ÿðø €`0>>àÀsÀø<ÁŸÀÀ8àpàÀ8àp8ð8€ðpð|øð|øà|0ÀÀÀàÀà8€ÀÀpàÀàÀð8€à Àøàà<€àÀðÀàx€àÀøà8à<ÀàÀ€ðÀ|ÀxÀ8ÀÀ€p€ð8à<ÀÀÀÀ`ÿÁÿ?ÇÏ€þð 8<þàà€>À<p à8à€€€ÀÿÁÿ€?çÿÀþáÿüÿÿÿŸøüàÇÀ?ÃÿÀãáøøð€óà€øààûðxx<8øÀ 0àã€8ðÀðüðàüÀ`?àÀÀÀãÀð ÿÇç€?ÇÿÁÿáÿüÿÿÿÿŸðü?ðÏÀÿçÿÀÿ‡çãùø?øÿ€ÿðÀûððÿðàøø~|üà€ðø|áÿ‡ã÷ïÀ~ùø?àùÿø>~üàø|~þ~ð€€<ø|€àÿ€àà‡ÇÃïÀ?áÿàüø?~|>øÃÇÃÀûãÿƒàx>ï÷‡ÃÇ÷Çà?¾<ø‡Àùóÿàÿããàùð||€ÿð}àÿñð?øÿø?ðøx~~¾à?øøø~ÿñãÇãóÿàÿ€üxð<øÿ>ÿÿàüÿÿÿð?àûà?ÿþÀ{ðÿàøðÿÇÃãÿàxñÿðþxxÁðññáÿááàÀx<<ÿðððãÀð|x~x}ðxx>x€øøx~óãÃÃÁÁÿáÿ€?|ðpxxxÿÿàøßÏÏÀxñáàŸßÀàáñà<ðx88<ÏÇ€à‡ƒ‡‡Àp9àð‡Àðqàð88ñÀáÁÀùàð8xp<‡ÃƒÇ€ÏÿÀà‡àxþƒÿǃ‡€<øÃàùáàáááà?ÿü<ðaùðáÀpðþƒ‡‡€ƒÇÿàÿÀàx?þƒÇÿÃÀ?øÁàyàðáàà€üxÿøáàpp8<ø88Àÿð888À÷ÿàã€ðÀ<ÿø?ð8?þ€àÿ‡ÀÿùÿðÀÃÿðxóÀñÁààÿøpx¿þƒ€€Ç€àÿàp|ƒ€ƒ‡€<øÃÀyáàÿááà€þ`<ðÿðóÀpðƒÇÀÃÀ|xáàyàðÿááà?ÀxxðÀpp8þáàðñàñáàÿðñð?<Àxð1àxx<<ðÁÀ<|88<9ƒ€àƒ‡ƒ‡ƒ€xð Àðqð`88qàáãààx0ppžƒ‡ƒ€ÿÿáÿ€çøÿçüü?ßÏáÿÏãð~þÏøÿçóùçøÿóóø?ø?€üüáþüøü|ùüü|ü ÞàððøããÿÀ<ðƒÀ~ð|øü€ð8‡ÿðx0ùàÁñáùàxøáãáÿáðððð‡€àçøÿ÷ü?øÏçàÿçñð??ÿÏüãûøÿüùûøøÀþñÿãÿøþ~þþ~þþð?øþ?€ÿðÿ€üÿðÿð?ø?‡üàÿçüÿÇÁÿÏÁø?pà<ŸÇøÿðà?ÿpÿÀÿóü?ñøüþü?àÏççÿà€ÿçøÀà< øƒáàÿø8ááðÀü?ÿãþàü|þ<üüüà?ø¼€ðøÿðÿÀ?à>ð?ÀÿïüÿÏüÁð?à?€8?ŸøÿÀ€?þà€ý÷øÁùøüð?ÀŸÏÇÿàð`|8ÿð€  À8?€ üðùà``ÀøpùàÀpp8àÀð>88ðÿà8x`àÿàüà€ü€`<ð€8|~€0 €`øÀ|>€Àx€pÀà?ÀðÀ?|À|?€Àx€xÁà?à0ðà?>À<€€Àx€<Áàà0xà?ŸÿŸ>þÀÀ€Àx€Àààpxàÿÿÿ€ÿþßøÏøp>|þðÿøçøÀxÀ<ðàÀ8àpxÿÃÿÏÿÁÿÃÿ€ÿÿÃþÿßøøþþøüþüÿ‡þÿ‡þÀxðûðÿ¿ü<ž?ààüÿà|ÿÀÀùð?Àþ€€ãÇüüÿ€xàø  ðÀãÀðþ>€óÃÃÇÿÁÿÇÇÀÿ€ÿãÿÿÏøø?þþ?üþÿþÿ¿ÿ‡ÿÀx?øÿøÿÿ‡þÿÿ€àÿÀðüÿàÿÿÃàÿøàÿÿÀàïÀÿÁþþßÿ€xðü¿?€<?ðþÿÃáÿð?øÿÿÀãÇÁããÃÃçƒÀÀáçÇûÃÀxß<>|<ÿÇÿ‡Àx<<|?ÿÿÿ€ááãÀøÀç€ÇÃàøðð‡ÇÀðÿàÃÿáþÿÃÇ€xƒÏƒ€À0x<><率ƒç‡€àãÁà<<ÃÀƒÁà?xàpƒƒÀxpùàáùàpƒóÀxx<ããÀÿÀáÁïÁÁà|pppƒÁÁÀÃÇÿãÃÃÁÇÿÀÀÀó‡áƒÀ<xþƒÇüÿ€Ÿÿ€À0ü<<ßÿ‡ÃǃðCáà8< ÿƒÀƒÀà<9àpÃÀ€ðpðàpàðàpƒãÇ€xx<< ÁÁÁáÀáÁÃàÀàxpx0ƒÁÀÀÁÇÿÃÃÃÀÿÀÿÀÀðÿàÀ<xüƒÀÿÿ€Ÿÿ€Àü<<Àÿ‡ÃÀÿÿàx?ÿüÀÀà<ÿøÿÁþðpààpðààpÿƒÁüxüÀÁÀáÀáÁƒÿàppÀÿÁþÁÇÀÃÃÀÀÿÀÀóÿÀÀ<xøÿÃÿÿŸÿŸÿÀü8<<€ÿÀ€ÿÃÿàx?ÿþÿ€ÿÁÿ‡Àà8ÿðÿÿ€àààñààpÿƒÀÿxüøÁÀÀáÀ€ÿ€àpp?ðÿÁÿ€ƒÇÀÃÃÀ€ç€Á÷ÿƒÀ€8xxÿÏÿÿŸŸÀx8<<€Ç€€ãàx>ÿÿÿÁÿ‡Àà8à€ÿ€àààñàðpþÀÿ€xxüÁÀ?ÀáÀÿ€Ààppðÿ€ÿÀÃÃáÃÃÃàçÁÀƒÀÁç‡ÀÀ8<|ƒÏßÀx8<<€À€ÁãÀxÿƒÃÁÿ‡Àà8à€ÀðààðààpÀ?€xxüÁÀÿÀÿÀàppcø€ÀÇãÿÇÇãÿãÿÀÀàãïƒÀ¸8<<><‡Ÿ‡‡‡À|8<<€‡€Àãàxÿƒ€ÿ‡ƒ€à8ð€ÀðààøáààðÀ€px8ÁûÀÿÃÀàðpp8€àçðÿçðÿÁÿðÿðÿÇÿïøøÿ?ÀþüÏ€ÿÇÿ‡ÿÿ‡ÿà?ü|ÞpÃÀÇÀà<øpãƒÃÀx0àààáààvÃÀƒ€x>8<ÁÁÁÁÀƒáÀàppxxÁÁàçàÿçàÿÿàÿðÿ‡ÿïøùÿÀþøÏÿÀÿÿÇÿþÿÇþðøü~?ŸàþÿàáÿáÿÀp?üþÿàÿðÿÃøþà?Ãÿƒÿ€|ñáðàãáð~ÿàÿƒ€þ?ø?|ƒÁãÃÁàÇÃÿÁðøøø8ÃÿƒãÀ<ððàÿÿçðñÿ?ÀþàçÿÀ~ÿÃþüÿüøð|~ðüÿðñÿÀ€xøüþàÿðÿçüÿ?À?àÿÿ€?óñøÿÿñø~?áþðÿÀÿð?øçãáÿñÿÃÿñÿ‡ýüüð<?ñÿÿÀàÀá€@þ;‡ã€ç€à€08Àðüàðÿ€>ðàðøÀðày‡ü~?à|>Ãñðÿÿñð8Àüñÿàà@ÀÀð€€à8ð€à€À`pà€Àáà`ÀÿÀÿàð€àð0€pÀÀàð>ðð8À|ƒàà ð€ø`àðx€xƒààð€ð`p@ðxÀxƒààð€x0?ÿ‡ƒÀÀó€?Áÿþsü€ƒÀà8ðppÿÏÃàðÿàáÿÿÿÁÿÿÀ?ðÁóáðøðððüÿàæσ€ÀÀqÀ<p€€ à<x€àÀÀpÿÿÇÇà?øÿðÿóÿþÿ‡ÿƒÿÀðÿáÿóùùøø?øüÿÀÿÿÀÇÿÇÿÁÿÿçð?ñÿðÿð?àøÿø>?ÿÿÀ?ð?Àøø>|üøyøyððüàãßÃÃð>xÿðøøÿÏÇǃãÀ}øùñÿûøùøü>|~ÿàÿÁÿàÿãÿÇÿÁÿÁÿÿø?øÿøÿ€p?ðüÿþÿ€Áÿ€ÿàøðþüþþüüüøÁþøÃÃÃÀðxxøñðøxƒÃÁÀðqàð~ðððø|<ÁÿÁñáñóñãñãÁàüþxxx|x<ðxx88ÿžóÃÁáàðððð¾Þ>? ÁñààñàñáááãÁàx|~„<<|<àð`<çÃÃÀðøðyÿðxþÏÿÁÿÀ?ñÿðxyÀ8< þü€áàyàyáááãÿàx8<ÿüx8pÿü?ðüÿ‚ƒÀÇÿàÿ€àxÿø¿ÿø<?þÿðp< ÿƒÃÀðøðqðpÿ€Àñö€x9€8<ðü€áàsÀyÁáÁãÿÀpx8ÿøx88ðÿøøþ?þ€œƒÀÿÀÿÀàpÿð¿þü<üÿð`<ÿÃÀðxðxðx?Ç€àgùàx?€8>|þ€ÿáàyàyàááãÀp8<øx8pøüÿ€˜ƒÀÀ?ààxð¾þ<<àp<ÀïÀð|ðxøp{‡ÇÁƒÁàðyð`x?€8>|€ñáàñàñÁáÁãÀp8|øøðŸÏÃ÷ƒãàøxøðx€8>€ááðñàñááááààp8<|x8<px8Ÿ€øàÀÀàðxøž<à`<ÿÿóüùùüðþÿãÿƒÿÀÿøñþþþüþÿÀãáùðÿóáóáñÿÀøxð`bÿÀýãþñüüà?þÿáÿÿ€ð?áþÿþøüÿÀÿùÿàÿãóÿóðÿÀüü~?øü~ƒÀþ?ø?üÿþàðàûáÿÁÿàü?ðŸüÀþþ>?>>ü?Àà~žÿàüÀðxøy€|?oàþÿüðøÿÀÿùßÀ?Ãó÷óðüþ~àü~ƒÀþð?øþüààðÀÿÿÀ?üàþø?Àüü~?~?øà?À~üàþðÀ`þp€ h8Àx8ÀüÀàüøà`ð?€>0€üðÀ øð><>à?à€<ø€àÀÿà€ÿÀÿ€€ø@þÀ€@ðð|pþ€Àðà|ø>0>> üÀàøð<üx €`øÀ<€xðüðÀÀðð<üÿøÿ>€à0ðÀ|øpðàüxÀàxpÜw€ø wžÀÀð8à€üxøÀðüð€>ûáàð?€ð?<æàæ Àà8pÀ>¸pp€ðxÀÿñð?øà?ðÀ?ðüÁøàÿðx~A€À@8@8À€<ˆ8€ ðÿÏûãðÿðÿàÿðÿÀð?ü>ãüøü?ðÿðÿƒÿø|üüÿïÀÿÀÀøø=øþ?Àþ<<ð<p€ãÀ€ð88à¼àç €ÀpÀ€ààxñáàððøøððùññðxø?ü?áüü?þ?øø‡ÿ€ü~ÿþÿÃÿàÿà?ðþþ?þÿãàÿ>>üþ?øáÿðàüü?~~À?ðüøÿ€~àðûðŸ€8ðü<Ÿ߀à1à€øþxÇø>ðÁãÀðñàñàðàóààðpx<€ð>þxxø>€ð~þƒÃÃÿáãà|ðþþ?þÃàþ>>ÿÿyðñÿð>ð?þÿ€p<ðøþÿ‡ÿ€ÿƒàÿðÀ<þÿþÿÃþÿxáñàðqàyÿøàñ÷ðü08€pžx<><ƒ€ð‡ÃÁàýñààÿüx<<øà‡ÿàñáü@0x‚àx<Ààpðxðpðx|‡Àð xxx<<€à‡ÀàÁàxx àx>ÿ€àpà<ðpð<ÀCðxx€€pp8€pøüǃÁÃÀ`8ð<þ€ÿÀÿ€ÿ€ÿÿ€ùáüøÿøÿðñðùðøx<>€ð|8<‡ƒ€ðÃàÀðàðxxž‡p8ãÀð8pƒ€ðøpxðpx8>Àðp<<>ƒ€€px8€p|8‡€ÁÁà@p8ààÀ‡‡ÀÀÿ€ÿÿÀü?x?ü?àøàÿðÿ?ÿóüþÀøþ~Çÿ€üÃÿŸŸÏñÿÃüÿàþÿÿ?ÿðø?ÿþÀÃÀ}ü<øøx>xü€ƒÁà}ðþüÏƒàƒ€88<Àx>x<<ƒ‡€ÁÀàð`p<ððŽàǃàƒà@` OÀÜ?ïãüü€àü~‡þüÁþ?ŸßðÿüÿÀ?þþü??þãü?ÿ‡üàÿð?ü?áøüðüø?ÀÏÇøÿàþøÿÁÿáÿüþ?Ïðþð?øÿà÷ãðÿáø?øÿüÿüþÿÇÿçøÿáÿÀÀø€8|øÀüð>ü߀œüøüãþçøàÿð¸àøxàüðÀLJüàþðûÀÿáÿü~?ïðÿð?øÿðÿóðÃþ?øþÿƒøüÿƒÿ÷üÿàÿÀpÀþ?€ðü9À>8<ùàóÀ8à8€<?€À~À~€ð<ÀàxÀð<àðÀü€Àð<àðà|€`p€ÀàÀà<ààÀ|€àxÀÀð?àÀ€`àð€<€à<ÀÀð<à8€øÀùðøþ?€ÁÀ? à<à<ÀÀp|à8€øðÿøüÿçàããàÀ?ðóÃà÷à€?àÿƒÀüøïüðÀ `pÀ0`ðàÀàÀ €pp€@8ð?ðÿøü>?ÇÀÿããàÿàðÿçÇàÿàÀÿáÿ€~ÇÀ?øüÿÿÿþü?áñð}øø=øø>>ø< pÀðð?Ïðñà€ðyøÀ€À008pp øpà€pÀxüø~>ÿ{ûøü?ÏøÿøÿàüüÿÀ?€?àÿÀ?øøøø}üøüþ¿ÿü¿pÀ~üðƒÀøÿ~Ÿ€x8ø|>Ÿï€ÿü‡ðÿùñà<<üÿÀÀááÀüøøøüüþþÿ‡ÿþÿp?àÿþøà?ø?ÿÿÿ€Àü<<øáàðàáÿðÿ ÀñààxððxøcÁáááÁÀx<ƒçžƒáÃÀàð8px<<Ž>œÃÀ>À>yàp<ÃÁÀóàðñÀà<<88žž‡ç÷€p}ðï|ƒàxxà~çÇÿÀ€ÿø88üÃÀááãÿðÿÀÀáÁàðaÿñÿ‡ÿááÃÃÀð8‡‡<ƒÃÇàÿøðp>8?>øƒ€<<€|qàð|><ƒÁÀááàóÀàx88<ÇŽÏðxðÏ<àp0ñàpƒÃãÀÀø<<þãÀðàñÿð?ðÀñààpÿøãÿàãÁÀð<À<ƒÁÀÿàÿøpxðŽŽÿðÀ<?þÀ8ÿð?þáÀ`ààsÿðx88ŽƒÃÿƒp0p†Ž€à€pp8ƒãÁÀ€ø88þÃÀááãàðÁáÁàðÿðçÿÀÃÃÀð8‡€<ƒƒÃÿàÿððp<øž?þð€8?þ€xÿàü<áÀáàÿàx88ž‡€ÿ€ðpÿàà`ðpãƒÀÈx<áàðáñààxÀñáàpðÏóÀÿáÁàp<ÀƒÁãÿàøpxüŽœþðÿÀ8<À8à<€áÀ?áààx8<ÿžƒ€þ€pðÿü€àððx‡€ãÀø|8|8ÁÃÁáãáð`ððÁáãàððàóÀÿÃÃÀðx‡€<ƒƒÇ‡Àððð<0<ž¸<üøÀ8<€xà<<ÁÀÿáàÀxx8þž‡€à?ðüàð?àpダü?øÿÿãøñðÿøÿðýøóðÿðøx0ðññáááçà||ƒÀÃÁçÇÀì|8xø<Žø¼ÃÀ8À8ð  áÀðàðà88<Žƒ€Ÿ€pxp€àp8ðx‡ãÁÀøñÿÿüÏøÿàÿøàÿðÿðÿðüÿñÿáÿÃÃÃÿàüÿàÿÇÃçÿáüðð~|xþð|<‡€8øxøà<<<ƒÁÁààð1àÀ8<8ø€àðp<àp8ðàpÃÀðà~ÿ…üÇü?ð>x?Ààøøþ?ðÿàÁÿøÿðþÿðÿÿãóÿðþð?ü€?ø?‡þÿ€ðþÿÿð|üáøÿàü>?÷Ïøáàðÿà|?ü?ÏŸàŸÿÀøpð€ÃÀð|xàð{ƒÃÃÁÀ€à€ @8àüÀ߀?ÿøùàüüàÿÿçãÿàüÀ?xÿ?ð?üïàøÿÿ??ÿàþ~>øÁñþ?€ð~~ÿùÿøà€üø?ü€ÿþþàÿ‡þàüÿü?Àþ?ÿ?çøñáðÃÿ‡Çàð~ppà`@8ð€`àÿƒÇø`8À€ð`ÀžøøÀøàœ?€ÿÌüüðÿüàþþàþÿ¿÷ü/àÿü?ðÿ‡çðà†€|pÃ>8ðÏøüà~ÃÀð€ø€øÀ>À~ÀÀÀ€>€ `ü`Ààà?pÀ?àxðþ€ ø<x ð<Àðà€øà?ÀxðþÀàøþ<üpð<<`Àøàw€€øà€xx~Àà8þ<üxp€<€p€ðpÀüàx €ç€pàxx€à8î<<<p€€ðÀðð8€ÿÇÇÀþ‡þ?ÁüŽ?€ƒ€ð€0€ Àxxà8æp€€pààà8€ÿÏÇÀÿ?ŸþÃþÿŸÀÿÀÃÿÁøð~ü<ø|ðáà>xà{Àøøøø8Ààðp€€ `ÀÀ0ïÇÃÀ?Çßÿÿàÿàãÿáüøþ?ýþüñð€xøð€?øÿü|þ?üø?àø€xøqàqÀ?À|ð?Àðø|þ>ðð€ÀáÀàœààáÀÀ`~ pÃÃÁÀƒóùááàáýàø?|?þ?ÿÿþáðx?üø€ùÿƒü|ÿ?þ?ø|ðø?à|çü?àÿøÿððÿðð=øü?þü>ÿüðÿÇÃá÷ðàüðó÷àðü|ø>ÿ€þÁÿààùø?ÿ~ŸÃÁÀ掆ƒáðáàðáððð<¾ø>x<<||€ñáçÀà>žxxpxàð|çžðøÿøxðÇ€ððppxxÞ>ï‡þàáãÃàÿðñàüx<€ááÃÀàžp8ðxàxpÇxð<<|<ðxÀàpðxp0Ž<LJÀáÀà|ðàà<x?|ÿà|çÇÿÀÃÁÀþÌþÿÁàãÿðáàðpx€x xx<ÀàáÁÀàžð8ÿøà0p‡>xp88<ðxƒ€àpðx|8ƒ‡ÀñÀàxpð`8x<€xñÀðp<ÃÁÃà888?ð88ðÿ€àpðø<8ƒÿƒàÀÀp?àxxpÀðpøþƒÇÿ€8püðpü<àpãÀÇÃÿÀðǃÁàáààÁààðxppx>x<€ÿãÁàžðxøÀøð>ð8xð<Ààpð`x<x‡ÿÀÁÀpàxxðÀðpüÇ€ðxxðp|88àpãÀÿáÿðþpþãÿƒááðÿàáàðð<>?°xð<<||ÁàÃÁäžxx|0àðp€ðp88ðƒ€àpð0p8<ƒàÁÀpàp8xpÀðp8ƒÃÀÀxðpx8ðàpãÀÿáÿàüàüÃÿãóðÿÀÿóûøü€?Ÿÿ‡ðø~€?ÿð?ü~øÿ‡ÁàÇÁüŸxøðàðð€žððxx?ðÿÿàø?ððü?Àþ?ÏÇÏ?ÃøÿÀÿáüÿà~øñøóàx><ŽƒÁÁûÀ8<ðx<<áà{ÃÃÀÀûáóøà?ÿƒãþÿÀÿààoàÿŸñÿáÿðøÿƒü~?üÀðüÿŸÀøÿüðð?áÿÿà?ø?Ààø?€þ?ßÏÏÿÃð€ÿñüÿÀþðóüÿÃþ?ø‡þÇãáÿ€À9øøøÿ÷øƒçÇÃàà9À€˜Àÿðøà~?@?<9À;à€ÿÀ?ÀçÀà8`ü€ÎÀáü?ƒþðøÇãà?øñøüðÿü?àÿçðð{€€ÀðxpÀ üÀ€?øààà~xàþÇàð?€Àp88pp?áàxp`àÿÀ|üp8àÿ€üüø€(ð8€xÀÀÀÀ>à``à@xà€p0ÀÀààààðà€<àðø€8ÀÀppààøðÀ>ð€xx€Àà<àñà€àààààà€Àp8€€€à<øûð?À🃀ðàÇðà?ðààÀ€ð>€À8<€À€ÀàùÿøÿàðÿŸŸÀðð?ÿÇüüÿÇüÿà‡üàøàÿ€ƒüƒÇ‡À8<øø<<þðþàü<x?€ÿýø8ÀÀ€ðøððxxÿχÀððÃÿãþüÿãþÿàÿÇüøüñÿÀÇþÏÇÃÿïà|?þü>>ÿüÿχÀàyðøøïÀÿÿÀ¸?Àx>øÿÿƒþààyð¼88Àø 8AÀ€à€À~yàðp0Ã燃Àðpððÿáùáø<<ááøãá÷ãø|<|ÿããÀ¿Ã‡‡Ãÿÿð|?þ>>ÿÿàðÿøüÿÃÏïÀ?øùà?ÿÿþσ‡Ÿÿøðÿøøøø|ààü?üïÀÿ‡ƒÀûð?Àþ||ðþ?Àø?Àžùüðà?ðþÿàÁÿÇÇÃàÿøàÿ|>üþ?áþÿ€Àxÿðàç‡Àÿ€ÿ€àáààð?ÀÿðàÀãÀñà<?ˆÀóûàƒƒƒÀðøp†<àðpx8<ñǃÃÁ€ðyàð‡‡ƒ€áÀ<8<<8p8888pŽùáá㇃ƒÃà?xðp<ƒÿÿ€À8ÿð?ðÀ÷ƒÀàà`ñàððøÿðàÀãÀðà>?ðÀóÿàŽÃÃÃÀðxxÿø?ÿðàppx<€ñÇÃÃàð9øðƒ‡‡ðð‡€áÀ<8<p<8<88ùáàãƒÁÁÀà>8ðxǃãÀÀxàøç‡À?ð?ð?áààðüÿààÀãÀñà?þøÀóÿàœƒƒƒÀàpx?ÿþ?þþàðpü8<àÿÁÿàyÿð€ÿþÿ€À8x88p8888?ÿðÁÀçÃÀà<0ýøÀÀƒƒƒÀÀ8ðaøÀç‡àoøoðñààðüààÀãÀøà?þüÀóàÜÃÃÀàp8¾ÿ?þÿàppü<ƒ€àÿ€ÿ€à9ÿð€ÿÿÿÀ888p<8<øÿðÿ÷ÃÁÀà<ÿøøøƒÀØxð pxÁç‡Ààxàpÿáààð8ààÁãÀñà<8üÀóÀøƒƒÃÀàpx>ÿàðpx8‡à€Àà9àƒÿ?€ÿÀ8x8p888 øàÿçÃÁÀà8ÿðþþƒƒÁÿ€ø|xpxxáãßàðxðxðñàðö<ð`àÁáàðà>8àñà@øƒÃÃÀðp8žàppx<ƒà€Àð9ð‡ÿÃÏùÀ<88p8<>xààÃÁÀà8ðÿþÿƒÁÿÀùÿàðÿÃÿÇðÿðÿñáóáðþ?|ÿàþóñáðþ><áñùàø‡ÃïÀàpxŽ>àpp<<àÁƒÀðxð ƒÇƒÇÁÀ<88p888x8ààÃÃÀà8ð  çƒÁÿÀùÿ?àðÿÿïøÿðÿðÿÿñøþ?üÿàþÿðÿàþœ?üÿðÿÀðÿñÿáðøx?¿þÿÿþÿàðp<<àãƒÃÀxxüðÃÃLJǀÁà<8x<<| x8ààƒÁÃÀp<øƒƒÁÿÀð|ÀßóÏøàÀÿÿñø~ø?À~ðÀüü?øø€ðþñÿãùüüÿ‡üÿþüþñøøø~?þçøÿƒÿÀ?üàÇÇÿÃÿ‡ÿƒþÀ÷ðü||>?üþðxþþ€ððcÇÁïÀà<|p~g‡ƒÀÀð€ÿàð<ð<>`?€|øð?ð?`üðùáøüxÿøïþøþñøøð~?üçøÿÿ€?ü?ÀÇÇÿãÿÿüàÿøüøþ~þþƒð?þþŸÀüÿáÿáÿãøÿ?ðþÿþþççÃàÀ@ÀðáðóÀ0àþðàà|<œžƒàžø?Ÿ€üÀÿàýãüÿÀüïüüãÿÿçðÀ€à0À00ÃüøŽðøÃýçÃàÀÀà€ 0àø€x~À ø€€x?àøÀ€xÀøÀ€Àà8ÀàðÀ€Àà0à>xÀÀøøøààÿóðøøÀ8ð~üÎãÀñø>øÁñàÿÿø?øÿü€x?ø?þþÿƒÿƒÿáÿ€Àx<áðð~<<<xx<‡ÇãÃáàýãÁÀ€8?þáÿø8<þ>8þ‡ÃÁááàðøóÀà€8üÃÿðx8<ü<<xÿü‡ƒÁÃÀàðÇÿà€8?üáÿà8<ü<8üÃÁáÀððÿà€8xÁàp8àøàx8><<€x|‡ƒÁÃÀààÀø~ü?Çøðx<ü<À|?ü‡‡‡ƒÁááàððàñÿøïüÀüþ~ø~ÀÿøÇÿÇããÿÃüÿÀpñÿðïüÀü~>ð~?ÀÿðÏÃÿçóñÿÃüÀø@øþÀ€üÃãÁŸø?øøpð>üÀüà€p@xøðƒà?€pàxü?àðÀ€pàxü?€à8<`ð€€ðà8<à8x`<Ààƒ€óÁàà€<Àøx<ø`ð~à€8<À0ðà <Àð‡Àÿóø?üüÿðþ>þþÿþÿü|à€ÿƒÿ‡üýð?àø8À€<`xàÀàÀàÁÿÿøüüÿñÿƒþ~ÿÿÿþÿþþ?àÿÁÿ‡ÿÇüÿøð?ø?øàà?€8ø||ÁçÁþø>|>|àÿü>ð€??ÃøÀ~A€Àðƒà~~<Þç‡ÁÿÀø>ÏÿÀóãÃÃûÃøüxx8x?øxð?ðà<þ|<€áÿñÿü?þ?þüÿ¾ÿÿüÏ€ÀÇÿÀãü<çÇÁÿƒçàþññ÷àüøÇ€>‚ðþÀ@àÀx<<‡‡ãÀà‡‡áçÁÃáÁÀ?|ðxx8xxðpxp{à8<<áÿðþ<þþ<>ÏïþùàóÃÿÀñãø|ÇÇÁÃÿáÿññÿðþü~?ÿ‡ïÀÿßÀøþÿøùð?Àðàx<‡ƒ€áàðÇ€ÿ€áχÇÁãÿãááà>8øxð8ðxpxpð<€àøpx<ƒÇ‡ÎàñÀñáÀà`àÁÃÀýáÇ€ðp|pžïÿƒÿÃÿáçÃÿÿàxLJÿ‡øÿøyààÀp8<?‡€ÀàÿüÿÁÇÿãÃÁÀ<ÿøàðyÿøðp`à8<àðpp<ÇüàãÀóÁÀà@àÁÇÀùãÀðpøp‡ÃááûÃÁñøàxƒ‡ÇÀxðððàx<ÿ‡‡€àðÇ€ÿÿÿÇÀÿÁÁáÀ<ÿøøð8ÿøðð<àðpx?þßÇ€øàcÀqÁÀÿ€àÁÇÿàða€pppxƒÁÁÀàñãáàðpÃÃÀ>xàpàÀp8<þ‡ÿÀàÿÀÀÃÃÀ8ðøàyùàð?à8<<ààðpüÿÇþðÀ€óÁÀÿÀÀÁÇÿÀà€ðpðpƒÀáà‡áÀàp8Àÿ‡ƒÀ¾?ïχÃùãàÿχ€Ÿÿ‡‡Ç‡‡ðñáÿÃááü>|x||xx|px8ðð<<àðppàƒÇŽðÀñÁÀàpàÁÃÀàÀpppx‡ÁÀðààÀàp~À8àÿþùüþ~üÏÿߟÇóÿøþÇÿŸ€ÿ‡þÿþÿàÿÁÿ‡çáøÿðøøà|ðáàþüààðw‡?ðaáãÁÁàáÌcÇÃÁ€àƒ€ðððpÀáÀÁÀà`8ƒ€8àÿþüþ~>ø?çÿÏÏÁñÿø~?ÁþÀÿƒþÿþÿàÀ‡óðüàðüàðÿýÿ‡þÿ?àýøü?ü?À?ÀÞø?ÃÿÏÏÿÇÿÀàÿããðÿàþáÿñÿÁøÃÀøpxƒÁàààÁÀààpÁƒƒÀ8ð ðã€Àþð8?€øÂðüð|À><ÁÀð~'Àø€àùÿüÞàÿùø>ð?À?ÀüüÃþÏÿ‡çŸŸ€À‡çáÿÀü‡àÿàÿøÿàùøüÿþƒãÇðÇáàð<ØxøàpÀüø0à€ øþ?Àü€÷€ÀÀ€€8ƒàxà>üÿð?=üüþüÏãáÿÇüÿƒñøøÿþÿÇáüÿ?à€?þøÀ €øðßðþáððÿøüÁùþ?À?€À0€<À?ÀþÀøÀàð`€ àÀø0 ÀøàÀð€À|xàpøðÀ`à>À0ð€À<øàðx>ððàà~àðüà€àøð€à<øàðxððàðàx~à€‡àü€ð€À<àààxðüÀðàpà;€‡à<üÁÀÿ€óÃãÏ€€ðÀ?€¼Àèà?`Àx0 ðð€¼€ðà8à9€€àÁà0ÿ€çãçÿàÿÀÿüÿŸðÀÿÀüðü|¿àÿ€}øð?ùðø|ÿüðàüø~~?À€Ç€üð?€à?Ç€`~xàà<8àÁÀ0ÿ€ãããÿáûàÿ‡þÿÏðÀÿà?üüü~ÿ€ÿáÿÀüøùøø~ÿþððþü~~?àààãïàÀyñøùƒÿðÀàÃÿÀàÿãÃà;Àøà8pà<À0€áàáñáàðÃÇÿ÷ÀÁàà||<<>ÿ€óãÁà?ü<øøxx>ÿžððp<>À>ð?ðñÿàðûüÿŸ‡ÏÿðóàÀñÃÿàññáÁÿïð?ðüÿáÿ€þðüà|?àÿÏ€À>~~Ç€ÀÀp€áàáðáàðÃçãÀÁàðx<<ç€áãÁà<ðxxxïžððxxÿáãÀ~üþ€à|?áï‡ÿÀð€ÿÿÏÀÿÃÃïÀþ<€àáàáÿðçÁƒ€Ãÿðx<<?àÀÀãÿà<ðxxx‡?ÿñÿøxü€ÀãÀ?üðxxx€>ðð<œüðà<àðà<8‡‡ÿ€Àñÿàÿáàà?ãïÀpp8xÿ€çÿÀ8€àÿÁàÇçàà‡ÀÀàð`àpダ€ááàáð ïÏÀ€Áð`x<>8€ÁãÀ<ðxxx€ððxðà<àðà<8‡‡ÀñààààóÀpp8p€çÀ8þ€àÿàü€çààÀÀàðàpダ€÷áááðàƒÏÀ°Áðàx|<€ÁãàÀ<<ðøxø€ðø0>xðàxàðàx8‡‡€ÀáààààÀsÀðp8p€çÀ8þà€àü€çáÀÀÀàààpダÿÀÿûóøÿàïÏŸÏðøøÿà?ü?üàóáÿÀ ü?üÀþøð‡~àxxðxàððx8‡‡Ã€àñð`ðààààñàÀpp8xÀãÀ8€à€à€çáÀÀÀàðàpダÿÀÿÿóøÀÿÿïððøÿÀ?þü?üŸàÿðÿÀÿüü?üŸàüüðÿþþà<8|xøñàðøð8‡ÿ‡ÿ€óðÿàÿááàñáûÀðp8|8ÁãáÀ8àÀÀÀÇÁÀÀÀààùàpダû€|óñø?€ÿÿïððø?€üü?øÏðÿð€øü¼ßàøþÀþüÿàø?ð?óùøð~?>çÿƒÿÁÿøÀàÃñøÿàÿÁøü|ø‡þ€ÿñÿÀ|ðcãààÃÃÃÁàÀààñààpÀˆóÀÀàðàÀ<à>ðŸÀàü€øðÎÀàà?Ãñø?àþ>?ãÿ÷Áþ?ð?€ÀƒñðßÀøü|ðÿƒü€ÿðÿ€þÿ‡þçüáÿƒðÿ<óÃçƒÇƒðÇÀààñáàsƒÃƒ€€Àã€@€àÀ<à>þÿü÷üÿ‡àøÿŸÿ€ÿÿøÿçÿùøÿø?Áÿ‡Ãà€€Ç`à8ÿ€<ðÿÏ?þþøÿçÿñøÿø>áÿçàÀ€€ø~8à~ãÀÀÀÀÀ€8 À|€>à<ðx€à<ÀðÀ>€Àøø|À>À<Àÿð>À€€øøx€€>ÀÀwpà€À|¼>Àçüÿ€xÀ@<àð à|À€€888xÀ0€0ÿƒÿÿÀþÿÁïÀ€?ðü‡ß€øàüÿÿøÎ€À@<Àx€€pÀ8À8ÿÿÿ€ÿÿÃÿáÿÀÿð?ü‡ÿÃøðüûüø?ãàð|üüÿÿøüüñûðÀ8ð€>|€8ðŸüÃÃÀ?àüàüàø!À~<€p€p ‡‡ƒÃÀãÏÿ‡Áÿñáàðð>|ÃÿÁü?ü?þ?ÿþüáð?ø~þŸ€çÇøþÿøÿøà?üð?þÀ8øßÃÿããàðüøþ¿üü?ÿÀÿÀà?ÁçÀþ<ððÀ0‡€ÃßÀðóÁàð`x<ÃáÀðx<¾>ðx8>ÀƒÁÀ<χƒÀùààþøþ?€8<<ÿσÁàðð<|x8÷ƒÿçÃÃçÀ?ðyãÿáþ>þøþøóðÀçÀ€ã€óáüà>8ÿÃø€ÁÿÀð{ÿðþ xÁáàðxpx<ƒÀÃÁÀ<ƒÇƒƒÁÀ>yàð|ß8<óσààðp8xpðxpññàøðyðÿð~ø?ü?ïÀÿÿ€ÿþ‡Àð?ÿàðxÁÁàpxþpxÿþ€ÿÁÀ<ƒƒƒÀ8ÿðˆ8?þàÿƒààÀpüÀƒŸÿ‚Ãÿáüp8øøðp0À<8ðxx8àðpxxpp~x0<ÃÀ€ÀÀÀà{àðp<ÃÁààxþpx>ÿÀÀ8ÿ‡ƒƒÀxÿàƒü8üÀÿÀààp<}ø€ÿŸþ€ÇÿÀÿ€ðÿðàpp?þð€80à8p8Àà`p8àxxpp €€ƒÀÀ‡Àð{ààðxÁÁàðxþpxÀÀ<ÿƒƒƒÀ8àü8<Àààðpx€ßž€Çã€Àpÿððpp?þüÀ8à8pÀàpp<à88 pà‡Ç‡ƒÀÀŸÀðyðàððx<ÃÁààx>p|ÀÀ<ǃ‡ƒ€xà?ü8<ÀÁààpp<‡ãÁ̃ƒÇÃÈ8ð ¼8>À€áààpx<|€€€ÃÀ€àxððpp<À8à8pÀàppà<8püÿ€ÿÃÿÿ€ÿ‡ÿÿÇøÿðÿÀÿðþÿóóøü€?ÿ‡ñüøÏþ?ÿÀÿüÿƒÿÃøüýð<<À<à燀çàøp<|?xƒ‡€€Ž€ÃÃàÁÀàxø0ðpp €8à8pÀàpp<à8xpü ?ÀÿÀþÿ€ÿƒÿÿÏøÿàÀÿàþÿóóüøÀ?ŸÿÃãþøÃü?ŸþÀÿüÿÿáÿáùÿà¿>?Ààÿüðÿàÿðÿð?þøÿàÃþÀçáÿÁóà<|pðpsÀ8ðxp<Ààpp<à88p<À>Ç`ø÷€€€ÿááøà?€>ÿÃüÀ€ðøÀ~øîÿàûÁøÿ?Àþÿ?ÀÀÿøøþà~ðàþðÿðÿüàÿàÿÿÀø?ñøøÀü¾ø|xðxxÀàpx8ppxs8< ÀðÀÀðÀð~€øÿÀÀÿàðxà<`€ˆÀüàüøà|à~ÿ€ðáùø??Àüþøÿ?ð~ðÃáðð|pxðü<|<ÃÃÀð€€ð0ÀðüðþÀwà?ãñøðà?áþ?ÿ~?ÃÿÀ€ð€pÀqÀÀþ>ÿ>?Ãÿ€€øpp€øpp?€ppøøøü<À?áÀ8~à8À`ƒÀãÀx~àxÁà<€àp~0xƒàŸãà|ø€>Àð<Àð|~À8pü€ƒÀ÷ãÀxø>>Àà8À àx~À8ðü€ÀÀü€p@ø8ð€ÀÀp<ð8ð€À€à0ü÷ƒø~€€ðüÿøwÀpøøà>{À@ùð‡ð8üÀà8p8ÀÀà0xðÿ‡Áþ‡À?àøÿÿ€þÿàÿÿ‡þÿ€þðÿ€ÿÃðÿü|ÿÇüÿøøøþ8ð?p€€À<x?8€ÀÀà0xpÿÁüÀÿàøŸ߀þÿÃÿÿ¾ÿ€þàÿ€ÿÃàÿøøÿŸü?ÿÿð?üøþàÿø€àÀ?ð=ð>üð;àü>ÿ€àøà?ððŽð|pàà‡Àxàøð|‡ƒ€‡ÇÇÃÿÏ÷€ÀãàÃÁð?ü|Žÿ€ÃÃðÿþ>øü?Àÿðÿàø?ü?þü?øþÿ¿ÁóÀ{à?øø€À~øøÿüÿÀ‡ƒÇþðà|@ƒÀð<Áðð8‡ƒƒ‡çžÇ€ÃÀƒÀà>|<<σÀü><ááààðð?>Þ<|>8çãÃÁÁààpx8óÁÿð8xþ<çÀÿÿ‡ÿÇÃþøàðŸþÏŸüüÀpÀðp8ÿƒþ€‡‡ƒÃßÿƒÃ€ÿ‡€àÀðÿ‡ïÁÀ>àñàðp0Ž<<ƒÁáãÀàà`p8àáã€À8ÁÀáááÃÁÿãàþÞð<ÿÃÿçÿÁÿ‡ÿÿÀð<Áà8ÿÿÿÿÀÿ€ÿÀÀà<<?ÿÿÀ8ð<Àãÿðþ x8ƒÁÃÿáüàx8ÁÁÃÀx<ÁÁÃÃǃóÁÀpà8÷ÇÿƒÏÿ‡ÀpÁà<ÿÿ€ÿ€ÏÿÃÀÿÀÿ€ÿàÀð?þ€ÿÁÀ¼üÀqÿðà8<ÿƒÀãÿàÿÀð8?þÀÀÁÁÀ?ÀÿüàãÁÃÀñÀà0ð8óǃóÃǃãÇ€ÀðÁà8€Ïþ€€€óÀÀà<<ü>€€8þü<Àãÿà?àx8þƒÁÃÿÀÀà8üÀÁÀð?þÿÿ瀃ƒÀÀpà||ÃσƒÇÇÏ€Àpàð<À‡€ü€ÀÀ€áàÀpü€€À¼ þþàqàø8<ÀãÀðð8>ƒÀÁÀøÁÿãÀƒÁààpÿð?þÀÿƒƒÀ烀çÿÀÀð<Àøp8χ€€€Ž€0ÃÀÇÀà<<>Áƒ€<<<Àáààpx8ÁÃÀÀàð88ÀÿÁÀ!ø<?ÃÀ€ƒÀÀpþà~À߇€ÇïÿüßÃñüøðãÿÿ€ÿà€á‡àÿàÿøÿøÿàø>ÿÀóÃØ<Ààððpp8<<Àáàààpx8<àáÁÀ8€áàÀƒÀààpð<ÀçÀ烀çÿÿÏûüÿø?áÿÿãþÿÿàÿÿðþðþðÿðÿãüÿÿþü?à>ÿƒøþüþ<<þ>Àûðÿàøð<<>€?ð?€Àø?Àð7ðÁüÇãà߀¸øÿŸðÿðø?ðÿ‡øÿ€ÿÀÿÃÿçøø~†ð8àïÀ‡‡ÇÃÀ€ï€Àð€àà?€p ððÿðxà÷ð¿€€ûçøü?þ€ÿÿøøÿððïƒÿƒÃÃÿ€€<p` @øü€ÿþàðüÿðþ÷Ãÿþ߀€<p€ÿÀp|ñÁ¿~ÿÿ?À€þþ€?À€?À€ÿÀÀÿà<àà0€`ð|€àp€p€ ð€þÀà8ÀÀp€p€ð<þàà|àÀp€ð€ð8ÎðàxàÀ?‡øgüxð 0€?ÀÀ<xA€>ðxÀpà8àÀ0‡ÿƒþÿƒþÿ€ü>ü€<à€çÃààóðÿçÀÿðÿàðààà<€À00ÿ¿ÀÿçÿÃþÿ‡ÿÿ€þ?þð~ðÿÁÿÿð?øÿøƒÿ€ÿáÿ€ð?àÿø?øøÿ€ãáð?ðøøx|>|ü‡8àÇ€ ì08ppp pÀ|€00ÿÿÁñçÿãüÿÏ€ü?þ?ð~áãáÿÿø|xÿø€ÿããÀðàÿð|øüÿÁããððøøü|?þþ߀ÿçÀ?ÃßÀàüðø|øü|ðü<>=ø}ÀÿÀ?Àðàðp0 ãñáàññàð‡ƒ€ðžÿÁÿ€ÿçÀóÿà{ð<øø?üÿþüþ>>?üÿÁÿ€ðà?øþøü?ÀÀ?ÁçÁþ<ðüü†pÃáÃãóáàðÿ‡Ãàüøü¾þŸŽü?‡ÁáãÿñáàðŸÿƒþð8ƒÿðpx8üx<þðÿàð0p8À?ÀÀñàðp8þŽ ãÃÁÃÃÀàyààð` 88ÃÀ88àp88xpàðüðpþ<ÿ‡‡ÿ‡ÿŸÀóÁþÇÿüƒÁÃÿãÁààÿÿàøÿàðp8ÿøx8<ÿàÿÀàðxÀàþÀáààðÀ8ü<< àã‡ÃƒÁàyààþ€x8ǃÀp8àpx<pqàðððpž8 ÃÏ÷ƒóóÁáÀü?‡ÿÃþÀáàáàðÿ€ðüƒàpx8|x<<ÿ€ðÀð?ð8ÀøþÀðàðð?ð8üüÀÿãÃÁàyààÀø88ÇÿÀpÿø?Àð?þðqûððpp8ÏãáðáÀàpóǃÁÃÀÁàà?€à?øÀðpxøxx8€àÀàðxÀgøüÁáàààð8|<<üÀÿÃÇÁÀyÁààøp8þÇÿ€ðÿð?àø?þà!ÿðàppüàÏÿƒÃƒÁàãÀàpãLJÁáðaáàòƒƒÀö<<à`px8|x<<€ðàÀðxp8Àp<Àðàðð`x8<þÀÀÿÁàyààOðþ88þÇ€pðøþ<Žðÿðàpp?üü€ïÿÀÀàáÿðpÀƒÁÁùãÃàþÿ‡€þxxñûÀðpx~8xx?€àãÁððð{Àxx<<Ááàáàðp8|8<À€þÁàùÁàÀðpxÇ€pà#øþ< àààà`üï€ÀãÿàpÀãóðÿãóøþÿÃÿÿ€þ?À?þ?ƒðÿáüü~øü~Çÿ€üÿÇüyü?Ÿçðøÿ€ããðð|ø<ü|ÀÀÀàðùààðp8xÃÀ€xðp8 Žððàpp<~€ïÀÀÀáÀpÀÿç÷àÇçðþÿƒþÿü€þƒàùüüñüüÿüÿüÿü??ïððÿ€ÿÏøÿøÿðþüþ?€?üàᇀàññááñà><ø>‡‡~ƒÃã€xøpx8>  ðààà`8Ï€ÀãÀà€ÿãñàáð<ó€ø~ü?þ÷ð7àï€ÿ‡ü?øðÿøÿ?ÀüøÿÃÿ‡øãñøÿàüþ€ÿŸÿƒÿÿ¿ÿáÿ€?xðø¾üà|8|àðpr ÁǃÀÀÀáà@pÀ‡ >8ÀÞð`þàž?€øðÿÿø?ÃóðÿÀø<ü?ÿüÏ~?ÿàÿð?ÀðüøþÀðáñø~?ø<ÇÿÀÀáðÀæƒÀÀÿÇø pÃÀ€#àøðüÀàÁùü>?ÀøüÿþðáñðÀÇð€ÀÀ `ðïüÀƒÃÁãÀ=àÏ€ãÀƒƒÿø€ðÀð€À€0€<ððÀ €À0~ÿƒþÀÿÇããÿààÇÿÃÿÀÿÁ÷ðÇÇÿÀÿ€ü€|€ð?à~ø€xøpðü À<80ðÀ ÀÀx?ÿÿÁ÷çããÿðÿ€ÿçÿÃÿáûáÿðÇÇÿÃãÀü?à|€ð|ðÿüƒþøø?Ÿøü~þÿð=ððx<þáø>üà8ø~À€ À8Ÿ‡€ÁáãáàÿðñóóÿáÿááàÿðÁãûãÁàðð|€ðøxÿƒÿøü?ž<ÿÿÏÿø?øø?üþÿÿãþÿþàüøö>ü€ÿ‡Ÿ‡øxðàóƒà<ð8ø€ÃáñáàüðÀáàñááðãáà|ðÁãáãÁààxð€ðð8Ï<ƒÇÀ|<LJ‡çƒà?ü<ÿÿÏÏgÿàþüþÿÁãÇÿ‡øøyðýx?þø>þàþ~‡ÃñàÇ€8<1ðÿ€ÃÿñààøðÀãàùááðóÿðxpÁááãÿàà8x€ðÿø?ÿƒÇÀ<<‡‡‡ÇƒÀ>‡‡ÃLJ‡ÇàŽþáãÁÃãÁÀ?áñàøÃàáàðÀãÀùÁáàãàpÁÁÁãÀà?ø€ðð>ƒÿÀ<¸‚‡ƒ€<8ãƒÿ‡ÿ€àÿÀÿãÁÁÀ<ÿø>~?þ‡†Àxpàxàà<Áàà8ÃàáàðÁãÀùááàãàpÃÁÁãÀàø€ðø>‡ÿÀ<¸<‡ƒ€<<ãÇÀÀàÿ<ÀÀûÃÁÁÀ<ÿð>|?þÿ‡†Àxàxàà<Ààà0ƒÁðáãàðáááñÁáàáðàpçãÁãáÀìxx€ðx0‡‡ƒÀ<ð<€ƒ€<<ÁþàþÀÀÁÁÀ<ð<<üÿÆÀpÀxàà<€Àà0¿‡ÿáÿáÿáüÿñóóáóáñÿáüÿããñÿÀüððãøð€þ‡‡ƒØ<ð>‡ƒƒ€<<ÃüðŽÀÀÁÁ€<ðø<<üÌÀpÀxàà<€Àà0ÿÿÃÿøÿÀÿóþÿðÿçóûóøÿÃþÿ÷óðÿ€üþ¿ÿþ?ð?àü?çÿáüàü‡ƒÿ‡ƒø<‡‡Ã€‡‡ÇøàcàÃÁÁÈx<€üÀpàxàà8€Àà0ÿÿþø€ÿóüÿðÇó÷óðƒüýççðøþÿ¿ÿüÀ?Àø?÷ÿáøÿàøŸÏÃÿÃø~>ü‡ƒÿ‡ÀÿÇÿ€~ŽÿþñáûÃÃÁø<|p  øÀpàpàà8Àà0ÿ`pð@8à€ 0?¼ã€ð?ãÿàðÿÀðÇ€|Áð~ø?ŸÏÿÿþÏÃþà?üŸÏÿÏþÿƒüÿÀÿ‡ãáøÿ?àøüÀüÀÿ€øÀxððàà|8€Àà0à€þà|>ðüÿüÀüàøÿÇþçø€çàøÿÀüð?Àø?À>ÿ€pñüûáñðþ|>Áàà8ÿÀà€À`ÿ€ €ÀÀÿü€pùþ?Ãñøß~~ãññþÀÀÀ~Ï ðàðŽ|>ãááþÀÀà€Ï€ÿþüüðÀ0ÀàÀÀÀø?ÃøÿøÀ?€ðÀÀÀ€Ç€øƒóÿ€ÿÿÀÀøƒààÀÀÀãÀxñÿÀÿÏà€ðÀÀ€À€=ÃxÀxàÁÀÀ0ƒààÀÀxÀ<à0áà€à÷àÿÀï?߇߀àÀ€<~¿ùñðƒ€xð 8<þáÀƒÁðùÿðÿÀÿÀÃÿÇÿÀ?ÀððÀÿÿ€?ùñø€<øþÿàà?ïÀð?ýÿøÿÁÿÿáÿãÿçÿÀÿàñà<ðÿ€ÿ€ùùððƒ€x<ÿÿÏ€áÀÿƒÿàÀø>~~xÁÿÁùñóñùãùàøððð‡ãÀøxðxÀ<Ï燇€áàÿáýà€px>xxááàóÁñáãááàñø`8xƒÃÀ<‡ÃÀðxðpÇ8<‡ƒ‡ÀŸÁÀááðàÀxxx8€ááàsàñàáááðøÿÀxÁÁÀÃÃÀðxpxç<ÿƒƒÇÿÀÿàààðð€pxxx€áàóÀñáãÁáÿðÿàøÀÀ<‡ƒÀàxðpî8?þƒÿ€ÀàààÀxxx<€?áà{Àùááááÿðð?øÀÿÀƒÃÀðxpxîxx€ááàñáñáãáàð!ððxxÃÃÀ<‡ƒÀøø{ø|8ƒ‡Ã€ááàààðü?üü~ÿ€ãáÿñÿóñÿóðüñÿð?þóÇà~ÿÃàüü|<þ‡ƒÃÿ€ááààðùþùüþÿÀÿùÿàÿÇóÿóðáÿà?þóÿðÿÿçà?ü?ü8ÿüÇáÿÀùÿûñø8ùþøü~ÿÀÿùÿÀÃñÿóð?àßÀÞñÿðÿãà¼88ÿƒøÇÇÀþÀüÿùñø< áüÀ`þð€øàÀÿ>À~x<x 8à€pøÀø€ø>?€øÀ€Àx àÀ<À€€à€€|€x`ø€À€xÀ€€À€x€ðà@ø?ðÀÿà~ÀàpøÀÀ>8€ðàxÀ€<€À€>€<€øðàž?øðà0ñÿüðÿàðàÀ€çƒÀ8ÿüà÷àx€8?ÿø?Àøøþ~þ>ðñà€à€0€x€8€ðÀàøàƒÀ`ðx<ñƒàððà?ðÿ÷ð~ÿþ?øÿøÿÀÿ€áÿÀ?ü?ðþüÿÿƒÿÿøÿøà?ðàÿ€~üð0xc€x€8€€p€à88ð€€pÀ8Á€àð8Àðÿÿð~ÿþùÿøÿÿ€ÿãÿÀøøðÿ<~ÿ‡Ïÿñÿøÿàððÿÿþà?€Àðøÿüø>àøà€ðãáçÀ€àp0à@à€xƒà8à|øüþx>‡Ÿ|<~|çÃÁ÷ÁñóÁàx|øx‡žãçÃÃãÃÀxððxxü‡ã‡ÿ‡ð?ðøø|ÿÿÿð?ü?ðÀpÀÿñÿðà?à`00pÀ>>{øþ߀ÃÁïÀ üðx8>ÃχÇÃÀ|yàððp<ƒƒ‡‡‡€ðð?øxxÏŸ xøxp€ð?àÿñÿðððàà``À||ÿøÿÿƒÏÃÿÀü?ðøø}ø€xƒÀ8<Çøà8xxx<þÿ€þx<ƒÃÀÃÁàçÿàð<ÿü?ÿüÁÇÿÃÃÁÀ<1ÿø€ƒÇƒÇƒƒ€ðx<8<ƒƒÏ‡€x<ǃûLJƒÀýàÀø<8<øøðxxŸ~xxx‡‡ÃÃÁðãóÀxø|p‡¾áÇ㇃ƒ˜xøàðp<<ƒ€‡ð<8xx€ð8ø€ðp8ðpxàà€`8ÀÁÀàààx88€p<€à<8ÿÿþþüü~?‡ÿÿ?øü~ÿŸûÿðÿñÿÀ?ü?øÿþÿÿÃÿ‡Çáüþðø<<ÏÁàÇǃ߃°x<<<|ƒÀ‡€x8|€x888px8ð`Àp<ÁÀ€Àààÿà`xÀ8ƒp<ÿÿüþøüüÏÿþñüþÿ?óÿðÀÿ€?ü?àþøþÿÿÏáùþàÿð?ÿÿÁÿÿÿÇðxp8x?ü¿ƒÃÿ‡ðxø|x€pppxðp8xpà€`<8<ƒƒÀÁÀááÀàx88€pƒà88<ÿü?þøü|Çþüàü|þñÿð?À?üÀüøü€~ÇàøÿÀàÿÿÀÿ‡ÿÿÃð?ð?ÿþÿÁÿÿÿÃð?þ?øðxøüøü?ð`Àpàÿ<Ãà‡€Ààðààv>|À8ƒÀàð@Ž><áàÀ?ÿ¼ÿ€ÿ ü÷ƒàüà?ðÿüÿùøø?ÀðøÀpàÿþ~ÿðÿÇóññãàþøþ€üƒƒáÀ888€Ž<8Áà€ð?þüøøðÀüøÀüàïþ?þðÿÇùñøÿø~ð߀ñþÇóÿÀxxÿ‡ÿ€ €€€þp8ð|ó?ààÿƒüÀ8ððÀÀû€üÀÀ€€÷À?ÿðÿ€À<?À8ðÀÿðÿ€À<?À<Àø€@ÀøðÀ<À|Àø ÀÀ@pàø€ÿàøÀðpà<à<€¼ ÀÀàðàü<À?ÿðøðÀ <Ààð yÀ~à@`øÀ<˜À€àðà<|àü?ÀÿÏÇ¿xøxø}øþ~À8€ààà<øà0xp8¸ÀpþÀÿ€àþÿÿÃÿáÿ€ÿÿÁðð?þ?áÿ‡ÿïÿÁÿøüþüðÿÿÿ‡ß€À8~À?óàáÁàÁÀ à€`àà 0x08pÁÿÀÀÿÿÿÃÿáÿ€ÿÿÿãðø<þ?ÃÇÃÿïÿÃÿøüþüø€ÿÃÿŸ‡ÿÀÀ8ÿàÁÿñ÷çðà€|ÇÃÀÿ€8øÀ<øþÀàÀ0p0À@8ÀÀÀÀ ÁóàÀ‡ãááðñçÀñáñàðòx<ÃÁûããÃçÀ<>|€ãÃÃLJƒóÀÀ8çÀÿàÿñÿÿø?ðÀÿããáãÀÿ?Çüð|?üÿ?áþàøø0x?ƒáà8ø||üðð{ðÀÀáãÀà8páÀÀ‡ÃÃÁàóÃÁáãáàðÿø<ÿÁóÃÃÇÇÀ<><€ÁǃǃãÀÀ8‡‡áð|ðüþx<ðÁçÁÁãÁÀÿ€ÿãøø|?þÃÿà8¼øpÃáà8ø|||ø?øÿøà?ƒáóïÁà?à}øÀàÀƒƒÁáàxÃÀáááàpÿüÿáðÃÁ‡À<¼ÿÀÁççƒá€À‡ƒàðxpx<88xÃÁááãÁàãÀððà<Ç€àxðààð88<8<><Àpáààÿáðxx?ü€ø€ÀÀ‡ƒÃÁàðÀáÃÁàñÿø<ÿÁàƒÀÿƒÀ<<¼<<ÿ€ïçƒÀÀ‡Àðø`px80xƒÁÁÁãÿàÃÀàñÀ8Àà< pàðàà8< xx<<8àáÀÀùàðpx¼€üÀÿàà‡ƒÁÁàyÿÀÿÁáàpøÀàÁÁÿÀ<<¼þ€Áçç‡ÀÀƒÀxpp88øÃÁááãÿàÀÿñà?þüƒ€àxÀpàp88àüü<àpàÀðàpp8<ÀƒÿÀà‡ƒƒÁÀóÿÀÿƒÁàðð<€àƒÇÿƒÀ<<<<üïǃÀÀÀðððx8ð<‡ÁÁÇÿÀÀÿñÀüþ€à8¿<pÀpàà8x<ðüü88ðpá€à@pÿø€Ááàø‡ƒÁáàóãÀÿÁàpx8áÁàÃÇÇÀ<ÁçƒÇ‡ÀÀƒÀðpp8ÿÿ€àüxÀpàp88üøø8ÿðq€`pÿøãÇÀü>‡ÃÁá÷ÇÁàÃàð~ð<ç÷ÃàƒÇ‡ƒØ<<<<<ÇÃLJǟƒÀÀÀðððp8xp8‡ÁÁÃÀÿÀàÀx ÿ€à8pÀpààpx<üxx88üàsàpøùÿøþÿçóðÿãÿñÿÇóñþ?ø¿áÿÇøç÷ÿáüþ~???ãÿ€÷ÃÿƒÿÇðð‡‡ñðøp8ÿ¿à|ß~óÇðøïÏßàÁþü~~?þùÿàÿðÿÀïðàüü??ÿãÏãüÿ†€þñàøþ<þ¾|?ø<<€p ðp|8àðCÿàá€~Ï€àÀÀ?üø|x?üðÿÀüàÿðÀøøÿÿ?üÇÿçýÿüÿþÿÀûÿøþ?üøðü~€xà<øðð~€àÀpÀ Ààÿð€xðžxÁýãüÿøÇþ?€>qÿðÎøðà|~à?àüþð€ÀàÁà€À`€À€øüÀÀÿÿ€ðÿàààÀ‡ÿÀðÿÀÀÀ€ƒà?€Àð€à €>>€à€p0x€€ÀðÀø€8x0ÀÀ8ÿÀ€ð8Àø?ÀxxpÀàøÀ8€|pÿÀà8Àøàx8xààüà8À<ÿÀx¾ÿÁçÃàà`xÀø8ŸÿÀã€|ÀððøðÀÀ0àà8à8xÀ<ÿðxÿ¿Áÿáÿÿð?ð=øüøþþ‡ÿ€ÿ€ááà?áÿàÿÿÀxñþ>øÏ€pþðü€ààà8øÀÀø8ÿÿÁ÷áÿÿøøÿþüÿþ‡ÿÃÿÀãóðñÿñÿÿÀðÿñÿ?ÿüÿÿÁøþøþÿàÿÁ÷áðøððàà`ÀðàxàÀÀ€x8ãóãáàÿÿø|x?ÿÿþïÿƒÿÃÃÀáãðøùÿðþÿÀpùñÿÿ>ÿÿàø><ÿÿðÿÁÿñøùðøøø?€ÿƒßƒü|øàîø>àÁáàçÀþð<<À0ÀÀÀ8Ãáãÿðø|xø|‡ƒãÃÁàÁÀððxøð8ƒÀqððxÏ<ñøðx<Ç€ðñáàþñðøð<<8þÿÁãÃÿÇüü=ðþüÿ€ÿàñáðÃÿáÿø?þ?þøÿ¾þþøÀüð€8à|ø¸àÁáãÿðøx<ÿüƒÁÇÿàãÀðÿøøp8ƒÀqÿøx?þàðð8<‡Ç€ðqàà|ððpxx<þñáÁáóáð?üxx>óÁÿ€àx?ü<ø8x?àðø||ÁÁãÿàðx8ÿøÿƒÁÇÿÀó€ðÿøðp8Àÿðxþààp8üþÿ‡‡€ÃÿðxxÀ8< üàãÿááààþøÁÁÀàx8àpàðp8<ŽŽLJÀ8xÿà8<¼8xÁÁãàðx8øþƒÁÇÀ÷ðøðp8ÀðÀx~Ààð8þ?øÿ€ãÿàp9Àp<üÀÿáÁààÿøÿÀÀ€àp0àpààp8?þÇÀ8üÿàxp8p88pp8pÁÁãð@ðx8øþƒÁÃÀðøðp8ƒÀðx>ààð8 þ<‡€óàp9Àx<|ÿÀÿÁÁààÿøÿÀ€àpàpààp8?þÿÇ€À8üÀøxp8ÿø8pp8àÃááÿàðx|~xƒƒÁÃáÀ~ðø0ðpxƒÀðpp> Ààð8>€€àqàp?€8<xÿàÀÁààðÀÿ€àðàpààpp<þǃÿÀpø€8pp8ÿøpp8Àçóñÿáøø|ø>?ÇÃáÿÀ>ðððø{ÇÀÿð€þÁàð<?ƒ€ðqà`p€8<|àÀÁáàøÀÿ€àpàðààpp<øÇ‡ÿÀxxÀ8ð!àÁÁáäxÀÀàxððààp0>ðÇÀxxÀ|xàÀà|ñð<ààðs ‡À8|À?Àðáðàÿ øàüÀÿÀ?üþüðÿÃÿ€àÿÇãðü?ðÿþÿÃÏçü?øøÿññø?üÀ?ÀŽÏà<|?xÀ<8<xx|8ppxøð d@ €øþðÀÿÃç€?€ãðüÿàÿüÿƒÿçüðùÿûùø?ø?À?Àþø?ÃÿÏÿÏøþøÀø>ø?ü?ðpð}øýãüÀ ÿùððà€Àüþ?áþÇÿÏøþàÿðð€þðþ?ü|ü`Àðþ?Àøãð€ÿÀàüÀ?þüüü8x8?üøÀ8wóÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷ðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿóƒÆ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿ÿÿÿÿÿÿ§ÀÀ 0€9ÌCÿ÷ÿßîßÿÿÿÿ÷ÿÿÿÿßÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ|ýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿð€üÿðÀxàÿÿƒàüÿü8ÀüøþÀøÿÿóð0þÿÿÿ0>àþÀøÿàüÿÿóðxÿð€p?Àü8ÀøþÀ<>øøxÿðÀ8€Ààxà€>øðpàÀp€À8Àx À<>üðxÿðàððpáàÀ0à?àð<à?xùÀÀø€>øðàþÿþ>~þàààü‡ãóðüø?þÿ‡çðàÿÀÿÀÿðüþÿðøÿÁÿø?ÿ€x ïáøÏãøÿÀÿà<üÿðüð>üóøÿƒÿƒÿ€?ÿ‡þððÿðÿÇóÿøÿþÿÁÿÇÿø?øÿàÿÀøøÿÿð?üÿàÿÇþ?ÿÁÿàxüÿóþÿóþÿÀðøþÿøþø>øÿüÿƒÿÿÀ?ÿƒøàáùøŸÇóÿÿÿ|ÿáÿƒþøpx‡ÀÁàxÿƒÁðxÁàÿü?÷ÇÁàxþüÿø‡Áàx?ŸƒÁø> >øÿü‡Áÿ‡àÿÀøðñð|>ƒÀñÿ?Ç€<áàxþ|ðàƒáà<‡ƒÀðxÀð|à÷ãÀðxŸø?ø>Áà<Àx€?ÿðü<àpàƒÀðóà<|ƒÀð|€xÁàp<øyàÀÃà|ƒÀpð€p<ÀÇÇ€ðxð<ð<ÃÀ|>Àx?ÿð|àxðƒÀðóà><ƒÀð|Àÿ‡Ààxø8ðÀ@Áÿþƒø0ÿÿÀø<àÃÇÿøx€ððáÿü€àx€?ÿ€øàxðÀøðãÀ>|Àðx€ÿ‡àp<ðÿþÿÃÿüƒÿÀÿÿÿø<À€ÿðx€à<à<ÃÿüÿÀx€ÿàøxðxðÀ?üðóÀ|ÀðxÀÿ‡€àxðÿþÿÀáÿüÿðÿÿÿø<à€ÿðxÀààÁüÿàx€ÿð>ð>àxðÀüðãÀ>|Àðx€xàp<ððÿàÃà€ðøÀ<À€€xÀà<à<ÁàãÀx€ÿð>xðxðÀ?þðãà><ÀðxÀx€àpððàáàŸøxÀ<à€€xÀðà<Áà‡Àx€ÿð>pàxðÀ?üðÃà>>ƒÁðxÀ|àpððàÁðƒ€xxÀ<À€À x€à<à<ÁðÀx>€>xàxðÀ0ðÁð€àpðø €ðàø<ƒÀx|à8<à€Àpx€àà<ƒÀø<‡ƒÀx>˜>x‡À{‡àÀÿðð?øøƒçðxÀŸàs€ãþ|Áà‡àÿüÃàø?¾øð<ÁÆðÿðÿ€ð<ð<€ÿðø‡Ïø?ÿœÿÀxÿÀ‡ÿÀ‡ðÿøÿÿÿøÿÿÿþ?Ïðþãø€çÿ?üÿàÿðøŸóÿøþÿàÿð?áî?øÿàÿÀüÿ¿çüÿ¿àÿø?ðçÿø?ÿƒüÿàüƒÿ€ƒÿ€?ÏøÿðÿüðÿÿÿÿÏðüãü?€ÇÿøÿÀÿðàŸóÿðøÿàÀÀþ?øÀÿÀþüÿ¿çüÿÀýðÀŸãüpßøÿàþÿ?ÿ?Ïøÿðÿð?àþþÿÏððáøÃþà€ùðŸñßààÿà€Àü?ø?€üüþà€à€ðÿÀü?08||0€?ÿà?À?ÿø>ÀÀ?à?€?ÿü€~ÀÀ€À€àÿÀà~À?ààÀÀÀxðñàÀ>€>ÀÀ€À€pðáàÀ>ÀàÀÀÀxðàðÀ>~€€ÀøÀøÀ€€À`ðÀðÀ>ÿÀþøþþ~?þ??ðýþ>þÇ€ðÀðùø?ðÀxÀ|ÿàþùüüü?üÿøÿÿÿßÀ?üø?øÿü?àÀpáüáà>?øþü~‡ü?€øüÿÿ?ÿƒÿà?þü?þÿþÀàxÿð€ð8€>àÀð>?Ãùðx€ø~àøÿà€ð<ÀàÀà?€ÃððxÀø|ðøáðÿø?€àÀà>€ãÀððƒ€ðxÿøàøÿø?øÀàÀà>€ãÀpðƒÀð€xÿøÀxÿðþ€àÀƒà<€ãÀððƒÀð€x>xà|€ÿÀàÀà>€ãÀððƒÀð€xxà|€ÿ€àƒÀà<€ãÀððƒÀðxpà|‡À8€àƒÀð<€ãÀðøƒÀðxàðà=Ãàp8ˆæƒÎð><€ÃÀðx€øxàðà?Ãùð<Œç?î€ø|<€ÃÀp|Œ|xáàü?ÿð?ÿüÿÀÿÿáþ?ðøÿàÿƒÀü?þÜþþ?Àãà?ü?€ÿà?ÿýÿàþÿáþøøÿ¿àÿóþüü?üþÀÿÀü?€;üùÿÀ|çÀ|?ðàÿ¿àþóþðüðþÀÿ€0ð`ÿ€0à~À0ñüàðÀˆ>€À€iaxmodem-1.2.0/lib/spandsp/test-data/itu/fax/itu1.pbm0000644000175000017500000175231511150047204021730 0ustar julienjulienP4 1728 2376 À?øÿÿÿÀÿÿÿðÿÿÿüÿÿÿÿþÿÿÿÿÿ€ÿÿÿÿÿÀÿÿÿÿÿðÿÿÿÿÿøÿÿÿÿÿÿüÿþÿÿÿþÿþÿÿÿÿÿþ?ÿÿÿÿÿÿ÷ÿÿÿÿÀÿÿÿ?ÿÿÿÀÿÿÿûÿÿÿà?ÿÿÿýÿÿÿà?ÿÿÿÿÿÿÿðÿÿÿ?ÿÿÿðÿÿÿ?ÿÿÿøÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿüÿÿÿÿÿçÿÿüÿÿÿÿÿøÿÿþÿÿÿÿÿðÿÿþÿÿÿÿÿÿÿÿÿÿþ?ÿÿÿÿÿÿÿÿ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿÿÿÿ€ÿÿÿÿùÿÿÿÿ€ÿÿÿÿÿÿÿÿÿ€ÿÿÿþ?ÿÿÿÿ€ÿÿÿÿ?ÿÿÿÿ€ÿÿÿÿßÿÿÿÿ€ÿÿÿÿóÿÿÿÿ€ÿÿÿÿüÿÿÿÿ€ÿÿÿÿüÿÿÿÿÀÿÿÿÿÿÿÿÿÿÀÿÿÿþÿÿÿÿÿÀÿÿÿþÿÿÿÿÿÀÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿÿÿÀÿÿÿÿüÿÿÿÿ€ÿÿÿÿüÿÿÿÿ€ÿÿÿÿùÿÿÿÿ€ÿÿÿþÿÿÿÿÿ€ÿÿÿþÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿïÿÿÿÿÿÿÿÿùÿÿÿÿÿÿÿÿùÿÿÿþÿÿÿþÿÿÿÿþÿÿÿþÿÿÿÿþÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿüÿÿÿÿûÿÿÿøÿÿÿÿùÿÿÿðÿÿÿùÿÿÿðÿÿÿÿÿÿÿà?ÿÿýÿÿÿÿàÿÿýÿÿÿÿÀÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿùÿÿÿÿÿÿøÿÿüÿÿÿøÿÿüÿÿÿÿÿÿðÿÿÿÿÿà?ÿÿÿÿÿÀÿÿÿÿÿ€ÿÿÿÿþÿÿÿÿøÿÿÿàÿÿÿ€ÿÿü?ÿÀx<Àÿÿÿàÿþÿÿÿÿøøÿÿà?Àÿ€ÿðÿùÿÿüÿø¾ÿïÿÿÿ€ÿÿÿàÿÿÿáÿÿÿÀÿÿÿÿøÿøÿÿðÿó€ÿàÿøÿûÿÿÿ€ÿüÿ¿ÿàÿàÿÿ€ÿüøÿùÿÿÿÿÿÿüÿÿÿÿÿùÿÿ?ÿÿÿÿÿÀÿþÿÿàÿÿÿðÿÿÿðÿÿÿÿøøÿÿøÿÿÀ?øÿøÿùÿÿÿàÀÿþÿ¿ÿððÿÿ€ÿüÿüÿýÿÿÿÿÿÿŸÿÿÿÿÿðÿÿÿûÿÿ?ÿÿÿÿÿÀÿüþ€ÿÿÿðÿøøÿÿ€ÿà€üøÀ?€~|?øÿ€?ð?àÀþ<ÿÀàÿÿÿýÿüÿùÿÿÿÿÿÿÿÿÿÿüÿÿÿùÿÿÿàÿà?Àþüøøøüÿ€€ð/üøÀÀþ~üÿ€ððàÿ€ÿ€ðàþÿÀøüÿ€ÿÿþàÿÃø?ðÿÿÀÀ<üüððøüÿ€€ðüø?€ü??üÿ€ðøàÿ€8ÿ€ðÀþÿÀð~øÿ?ÿàÿÁü?ðÿÀÀ<~üøøøþÿ€€?øü|?€Ãü?€þÿ€ðüàÿÀÿÀðÀþÿÀø|üÿÿ?€ÀÿÀø?ðÿÿÀÀ|<üððøüÿ€€?ø8ü8ÿ‡ø?À?þÿ€ðüðÿÀ8ÿÀðÀþÿÀøxøÿÿ?ÀÀÿÀ|?ðÿÀà|üøxüþÿ€€üxü<ÿÇø?Àþÿ€ðüðÿàÿàðÀÿÿÀøxüÿÿà€ÿÀx?ðÿÿÀÀþüðpøüÿ€€üðü<ÿø?à;þÿ€ðüðð8à8ðÀÿÀøðøÿÿà€ÿÀÿøøÿœÿ€ðø?þÿüàðàÿŽÀøüÿ€ÿøÿÀ?ðÿÃàÿøüùüÿÿÀÿÀÿÀüþÿø?øÿœÿ€ðð3þÿÿÀðÀÿÎÀøøÿ€ÿøÿÀ?ðÿ€ÿð?ÿüüÿüÿÿÿÿÀÿàÿþÿøøÿÜÿ€ð?àsþÿœÿÀðàÎÀøüÿ€ÿøÿÀ?ÿÿÿÿð?ÿþüÿüÿÿ€ÿÿÀÿàÿþÿøøøÿ€ÿÿ€sÿÿÜÿ€ðÀÜÀøüÿÿ€ÿøÿÀ?ÿÿÿ€ÿðÿÿüÿüüÀÿÿÀðÿþÿøøøÿ€ÿþaÿÿüÿ€ðàüÀøüÿÿ€ÿøÿÀ?ÿÿÿ€ÿðÿÿüùüü?àÿŸÀøü~ÿøøøÿ€ÿáÿÿüÿðÀ?üÀøüÿÿ€ÿøÿÀ?ÿÿÿ€çðÿÿüø|ü?ðÿ‡Àøü>ÿøøðÿ€ðáÿ€ÿüÿðà?üÀøüÿ€ÿøÿÀ?ðÿáðÿÿüø<üøÿƒÀÿüüÿøð?ðÿ€ðÀÿ€üÿðÀ?øÀøüÿ€ÿøÿÀ?øÿ€àðÿ‡üø<üøÿÀÿüüÿøð?ðÿ€ðÀÿ€?üÿðàøÀøüÿ€ÿøÿÀ?ðÿàðpÿüø<üøÿÁÀÏþüÿø?ð?ðÿ€ðÀÿÀüÿð8àøÀøüÿÿøÿÀ?øÿ€àððüø<üüÿÁÀ‡ÿüÿÏø?ààÿ€ðÿÿÀüÿðxàðÀøüÿƒÁÿøÿÀ?øÿ€à`ðà?üø<üüÿ€À‡ÿüÿÇü?ààÿ€ðÿÿÀüÿðxÀðÀøüÿƒÁÿðÿÀ?ðÿàðàü<ø|üüÿ€Àÿ€üÿÇü?Ààÿ€ð€àüÿðxÀðÀøüÿÁÿðÿÀ?øÿ€àððü|ø|üüÿ€Àÿ€ü>Ãü?ÀÀÿ€ð?àüÿðøààÀøüÿÿàÿÀ?ðÿÀðøü|øüüüÿ€À<ÿÀü~Áü?€8Àÿ€ð?ðüÿððÀàÀøüÿÿàÿÀ?øÿ€ààøüüøüüüÿ€À<ÿàüþ?€ÀüÀÿ€ððüÿððÀàÀøüÿÿÀÿÀ?ðÿ€Ààü>üüøüüüÿ€Àxÿàüþ€À~~€ÿ€ððüÿððÀàÀøüÿÿ?€ÿÀ?ðÿ€ààþ<üüøüOüÿÀÿ€ÀððüþÀ?À?ü<€ÿ€ðøüÿððÀÀÀøüÿ?ÿÿÀ?ðÿÿãÿàÿøÿÿýÿÿÿøÿÿÇÿÏÿÿÿÏÿÿþÿÿüðÿÀÿðÿ‡ÿûÿÿ€üÿàxÿÿýÿðð>ÀÀŸÿüÿÿÿþÿüÿÿÿÿÿÿÿàÿÿøÿÿÿýÿÿÿøÿÿÁÿßÿÿÿÏÿÿþÿÿþÿùÀÿàÿÇÿýÿÿ€ÿàÿþÿð<ÿøÿÿÿ÷ÿüÿã‡ÿýÿÿ€ÿÿÀ?ÿÿÿŸÿÿøÿüÿÿ?ÿÿÿÿÿàÿÿàÿÿÿùÿÿÿøÿÿ€ÿÿÿÿÿÿþÿÿüÿá€ÿÿ‚ÿùÿÿ€ÿàÿþÿà8?ÿøÿÿÿ÷ÿùÿÇÿýÿÿ€ÿÿÀ?ÿÿÿŸÿÿðÿüÿÿŸÿ÷ÿÿÿÀaÿÀÿðÿÀçüÿÿßÀÿÿÿëøÿþÀ<À€ €øüÀð<à¿ÿ€ÿàðþüÿøøÿÀü?ÿÿðÿðÏøø?ààÿðÿÀøÀøþÿ€ðø|à¿ÿÀÿðüÿ‡üÿøþÿÃÿðþ?ÿÿðÿüÏøü?àðÿùÿð?üàþÿÿÀÿøø>ð?ŸÿÀÿü?þÿÃøÿüÿÿáÿøþÿÏÿðÿþ?Çøþ?àøÿøÿüüà?ÿÿ‡ÿáùøà~ø‡Àðü~?‡áðø8?‡áðxü>ƒÏ~ðxþàþ?àxÿøÿüø<à>ÃÃáðxà~üÀð|øŸñðøÇ€øx|<Î>xx>à8<ð8<>ø<à|ÇÃáðxÀÿü€ð|øŸñððÏ€øø|>Œ<0ø>à08ð|>þðüããñüàÿþƒð|ø¾ñðø0ï€|x|?€ƒ>x>à?€xð <>ÿð|çÃáÿÀÿÿ‡ñùð¾ñððpÿxø|?à|ø~à€ðð`|>àø?|ãçàÿÀàïÿžÿÿùðþùðÿðï€|øüÿ>üÿà>?àðÿð<~ððÿøçÿÀÿàÀÏßœÿÿñð¾ñðÿðÿ|ÿðüÿ|ÿøÿàþÿà|ðøÿð?øü?øüøçÿøÀÿÇü‡ðýð¾ñððpàÿ|ÿàÿ|ø>àøàøðàðþ?ü|ãÿ€ƒüàÿÁãþƒð>øŸñðø0ðï€|yð0ƒ>xàðð|ð`=øà~ü|çÏÃÀüÀÿÁÃü€`~ð?ð¾ñàðàÏ€øùøp@|øààð<<ð|øð>þ~ãçáà|àƒáàþ€pð>øŸñð8øàÇÀøxüx€à>€xàÀðð<~ð>ð~~ÇÇãàxÀwáÀüàð|üƒáàxð‡Áðø~|à<ø>àÿaà><ð|~ü>ð>Çáùùøÿÿƒñà~ÿà?ÿü?ÿÁÿùÿþ?ÿƒóðü?¿ÿÿà~ÿþƒðÿùà<ø><€ÿýøÿÀÿñýÿðÿÿÿø??ÿàÿø?üÿ‡ÿûÿüþÿÃþ?¿ü?ÿáÿ€ÿüÏøþÿÀøÿýÿÀùøÿÿÀÿøþðÿÿÇÿø?ÿàÿðüÿÿûÿüüÿþ‡ü?ÿáÿ€ÿøÏøþ€ðÿýÿÀáðÀøð<ÀÿÀ#ðÀÀÀÿøÿ€@@ÁøÃþà`ÀðÀðÿàà~ðÀ8‡üÇþ|ððÁàðÿà<ðÿðÿ€ø‡þÇþþøxÇðƒðÿàüùÿðÿð>Çüüð|ÿÇà>ñÿàü?ùÿðÿƒà~ƒƒïþþà>€Çþ x>pð<ðÁà{÷þf¾><üøÇƒðàÀÿÿïáÿÿþÿÿ?ÇÇÿÿÿðÿ?ÃÿÀ‡€<ð>ààxðƒÀÿÿþþÿÿü|xðÀ€ÿÿÿàÿ÷ÿÿçãïÿ€ÿÏüÿßÁÿð?Çø>ðÿð€ðÀÿÿÿ~ÿ|<xðþ@ÿÿ÷À÷ßü>ù÷áÏŸ÷Þ}çÏÿà<‡ø<àÿàÿÁð€ïw|Ï>ø|øñÿð÷|wÀ|sϼ>øóñLJóþ?ãï€ðà<{Çþ>ðÁðÿàð€Ï7Ã<Ãð<ø?ðÿŸü ðxçÀxç¼<ðûùœ÷ü?ÃïñÀ|þ÷ƒþ<ðÁáÿáð€Œ|Žà|ððÿ¿üðçÀãϾ>øÿýÇþÿþáï€ûÀ<þÿà>øáðñðð€þ<þÀ<ð?œüÞ<ðÇ€çÿ?üðûýüÿ¼?Ãïÿ€|ÿÿà<øÁáááðþ|þÀ|À¿ü¼<ðãÀãþ?þð{¿Çüÿþáï€ÿÀ<ÿÿð><€áðððð?Àþ<þà>ÀÿüÞðxÇÀxçð<<ðóŸŒóü?Ãïñ€<=ÿà<<Ááááð?€Œ|Žà|ÿüüðxwÁ|sÀ<>øûǃóþ?ãï†ðÀ<|À><áððàð€Ã<Ãð> ßøÞðxwÇxwÀ|<ùóχóþ=ãÏðà<øŽ<‡|w‡<ø<ÿ‡€óÇž<ø÷ÿÿÿÀ>>óÇïÿ€ÿÿýÿÏþùàðÏü?øÿÃøãü‡ÿÿÿü|~?ÿÿ€ñ÷¼øÿÿÿÿÿàÿÿ?ïãÿÿÿøÿŸÿÿàÀøÿ?àÿø‡ü>?Ïÿÿÿÿüþÿûÿóÿøüÿÿÿÿ÷àÇáïþÿ‡ðÿÿà€ÇðÿàÿøüÏÿÿÿüþÿ?ùþñþð8 €8€p€`ÀÀð{>À<x?€àÿàüÿÀÿÀàà<ÀpüÿÀàÿàþÿÁÿ€€üààøøÀ?ðø|xÀÿøÿààÿàÿÁÇ€?àÿ?ðøüþÏÿ€?ð?ü<ÿþàÿ€8àà8à8àƒÃÀÿðÿ€à?ø?øþŸÿ€?ðüyÿþàÿ€8Àà8à8àƒƒÀÿøÿÀà?üøÿàÀ|<xþðƒ€<àà8à8Paàðà€Àùø€ø<|>>‡ÇàÀø<ø<ð€8ààÿàç€8ü<€ù÷óøàÀð|ÇÀx<>>€ƒÁàÀðð<ø€8ÿàÿàÿà<ÿÿãàÿáÿûûøà€€à|~|‡ÀüÿÀ|?À<ÃàÁðð<ìø>8ÿÁÿàÿà8ÿ?ÿÃáóÁÿùððà€à>øxÿÇÃÿÿà|ø>€ÁàÁðð<ð|>8Àxøð<‡‡‡áààà?ðàààøüÿÿÿ‡ÿƒÿÀüø|€ÃÀÁàà?àx<xÿÀpàð8ƒÁàÁà<ñààÿà?üüÿÿ‡ÿÁÿÀüü<€ïàÁðà?à<><óðxðp8Ààà<yààÿÀ}øüþÿ‡Àxøü|€<ÿ€ÃàÀ?à|<8Áàpàp8ÿƒÁàÿÀ8yÀÀï<<à>ø|ÀþŸà|þ><€<ÿ€ÁðÀ?àþ>8Àpxðp <ÿÀáÿà<=Àà<xà|ø|€þÿÀx~>|€|þÁà€<à?þ>8€ppàpp8ƒÁãáÀ8?€àxðà>|<€ßÿÀ|>>€|àÁð€><€øÀÁð<€<<€8ÀàpàpxxÁãÃà8€À<ðàÀð||<€ÏÏà|?>>€øàƒÀø<€<<‡À<àðððxø?LJñûÿøÀàüüðÿà?øøø|€ÏÀ€x>|>ðÀÏ€þ|<þÏÿ€ÿÁÿàñùø?ðÿÏïáÿùÿøÿÀÀþððÿÀ>ÿø|~€çÿÿàÿ€>þ¿ððÿÀüÿÿ?çÿ€ÿÀÀ?áüüàÿÏçàøþðÀàþàðÿÀÿðþ?ð÷ÿÿãÿÀüøþðüÿ€?øÿþÿ?Çþÿ<Ààðÿ?øóÿÿãÿà?€üøþðüÿðÿþ>üÀ?À?þ?øáñÿƒÿÀ>øàøàø8>\ø€þø|ÿ ðÀðà>ø€À<ðÀ >ü€þþÿàÿáüÿÀþÿÿðÿ€ãüÿ€þþÿüÿÀñüÿÀþÿüÿÀñø>€>>~Ãàøx>À|><|Ãàüp|ü€ÿ€>>ÿþÃàþx|??ÿÿÁÿÀ|ÿþÃàþpx?ÿÿƒÿÀ>>ÿÿÇàÿx|?¿ÿ‡ÿÁãÀ|þÿÀÿxø?‡ÃÀ>>Ÿþÿ€ïø|Ÿ‡ÀßÀ|€ÿïøüÿÀ>Ÿüçø|ŸÃÿÀ|Àçø|‡ÿÀ>ÀÀ>ãø€>‡ÇÃÀ€|?àÀáø€?Ÿ‡‡À>À>€ðàñøÀ?ÿŸß‡ÿçÿðàðàÿþ?ððøøø?Àþÿÿßçÿçÿñÿàÿðàÿü?øðüƒüøÀþÿÿÿãÿãÿðÿðÿðàÿøøðøüx€øÿßÏÁÿÁù€Àààð?øàø>ü0€ÿƒ0àÀ€`àøÀ|àø€ÿþà‡àøüÿþø‡àø?üÿ þø?‡àðüx>ü?ƒÀàüx><ü||€ÿx?ð>ü~à>ø<>~?ƒø?ŸÃÿøÿøüþÿ?À?üðÿàü<ø|ÿŸçþ?ßÃÿ€xøüÿþÀÿüð?ÿÿðþøüÿ¿ßþ?ŸÇÿ€øÿð?üÿÿ?àÿþðÿÁÿøÁü~ÿß¿‡Ç€x>?>ÿþ?Àÿþðÿƒ÷ðñøüþ?>çø<|<ÿÿà??ðÇÃáð?ø|<À?ÿ‡Ïþx>|ÿÞÀ>>ð‡Ããàüø<€?ÿÞÿø<x<÷ßÀ>ðƒÁóàü|>€Ÿ?ÿþÿ€x>x÷žÀ<ð‡ƒÿÀ`|ø<¾?þüÿ€ø<<ø<ààóŸÀ>ðƒÁÿÀp>|>€þ?ü‡Àx>|>øüðÀ>ð‡ÿ€ð|x|ü?ü€ø|>0~<ðüøà>ø‡Áÿ€ü||~€üÿ€üÿÀÿü?ü?ÿøþü?¿ü??ÿÏáÿàÿüÿ?ðøÿ€øÿ€ÿü?ü?ÿðüþÿþ?¿Ïÿÿñÿøü?ÿ?øøÿ€øÿÿüøÿðþþ¿þ¿ŸÿŸïãÿøðþ?øðüðü€€|þ?Ÿþ?¿ÿçóÿü?àüð`ÀðüÀxàøàüàøÿøÀàÿø€ÿà€àà?À|ðàÿø?€þðàÿü?€ÿÿ€ððþ€þðð>~€~?ðð>>€~Àð8ãàð>>àüÿ€~ððßÿ÷ø?ð>>øþÿ€|?üð?ÿÇÿ÷øÿð>~?üþÿ€|>?þðÿÇÿÏçñÿà?üþÿÿ€þþðÿÏÿÃãáÿà?ø|~€þü~ðÿ‡Ãããóà?ðø>?þøðàáóÃáà?øøÿ€þøðàá÷ÇÁà?øøþ|øðààÿ‡Áà>|øÿ€|>øðÀàÿ‡Áà<|ø?þø|üðàƒà‡áà>>ü>€ü|>ü>ðÀ‡Àãà>?ü~?Ÿÿþ~?þÿüÿÀ?ÿøŸÿü?ÿÏÿáþÿÿüÿüÿ€>ÿøÿŸÿø?ÿÿÁþÿÿ¿øÿþÿ>ÿøßøÿƒÿÀþÿŸðÿüþ|ÿð>àÌó|>€þ |þøüøøðàððð|þÿð?üÿü?€þÿü?€|þ€8<>€>>Àøƒø<>ðþÿ‡øÿÀð>~?øÿÿ‡üÿàü?ü?üÿÿ‡üÿàÿü?ü~~Ÿÿüÿàùü?ð|>€|ãáðø?ðÿþÿ€|áàðð?øÿþÿ€|áàùð>üÿþÿ?€|áðÿð<|ÿü?ÿ?€|áàà>~ü?Ÿ€|áàÀ€~?þ>?€üáàÀÀÿ¿ÿþ?ÿßÿÃÿÃãðÿðàÿŸÿþ?ÿÏÿÇÿçÿøÿüàÿŸ¿þÿÏÿÇÿÇÿùÿüàøÿƒÿÃÿÇóñÿþàÀâ€ð>Àð<Àÿü?€ÿüÿð?À?ÿàÿøÿøü>|€ü>|à?¿Ÿ?ÿ<|?ðÿŸ‡ÿ?üü?ÿŸ‡ÿ€?øÿü?ÿŸŸ€?øü~ÿŸþÇ€?üÿüàøÿ?þÿþÀðÿ>?ÿüÀðÿ€>ÿüÀüÿ€<>?üÀü€~>?ü À~Àþÿþø¿Ïÿ€ÿÿþþü?ÿïÿ€ÿüþü?ßÏÿ~ÿüüüÏÇþ>ðÀàp?ÿàÿ€ÿøÿàÿüÿàÿþÿð|~ðð>|>Àü€ðø?€ðà|?øþÿÀðøÀÿøð|?üþÿàðøÿàÿø?ø|üÿÿà÷ñÿðÿðü|þ¿ÿÀÿóñð|||ü~?ù€ÿãáø>ÿþ|ÿþÿðÿÃÿø>ÿþ|ÿþÿàÿÿø>ÿü|?ÿþÿàðÿð>ÿü|>ÿü?ÿàðÿÀ>þà|~ü>àðð>üðÿþÿ>ƒàðÿø?øþøÿüþÿüüÿø?üþøÿø?þ?ÿÏþþÿø?ü?þøÿð?þ?ÿþþÿðøüø9øïþü?€àÀø€ððàÀ` ÀðÀðð>€Àðxðð€øøp>ÿ€?àÀðøððð€üðø~ÿÀ€àøÿððøÀüðø<ÿsÀøÿÀððð€üàø€àxÿàà à`øàÀ88€àxÿðÀ€àðà€xx€àÀÀx|óøÀðxàÀàà8ø}Ãñøðþÿ€?À€?ð€ÿàxÿáðpÀÀ>>àÀàÿƒãà€ðøøÏà?øðÿƒŸ??ððøàxøÿçóøðþÿ€ÿÀÀàÿÿŸàxÿðø?Àÿüÿàÿÿà€øøðÿÿÃÿø?ðø|>þþçðÿÀøx?üüÿƒÿ€À?øüþð8üÿãñøüþÿûàÿàxð€ÿÁàxÃÀáðÿÁÿÿÿÿ?àÿÿáÿÀÿø?øà?ÿÿÇÿðÿððü~þþÇáÿáøø?øþÿƒÿÿÀøøþàxøÿÁàð<<€àáÁáàðà<óàxƒÀñùÿàÿÿÿÿŸàÿÿùÿàøüðÿƒÿƒÿøÿøø|>ßÃÁáðø|àáÁáàð8<xðð8Àpááààø €qÀàxƒÀÿóÿðÿýÿÿŸàüÿóãà~ø|àÏàÿáàøøð|<ÃÁððx<ÀƒÃÁà<àx8pðàp€àÁÀÀÿ€8áàxÿÀÿóñð?üÿ÷ÃàÀž{áð>x>ðƒÁð|à|ðx<?€ãƒÀpx<<àÁãÁà|ð8<xxàxÀpáÀà€qÀàxÿÀÿÃÿð?ùçƒà€žÿÿà<ð>ààøàyàð<ÿç€ðpxxÀÃÿàüàx8pyÀð€àÿÃÀ?à8óàxüÿƒÿðy÷ÃàÀžÿð>øðƒÁðxà=ðx<ÿ€÷Àxx<<àÁÃÿàüð8<xÀxÀpñÁÀcð€qÀàx€ðÿð>ùçƒà€žÿÿà>ðààøàyàp<>àÿÀðp8xÀÃÀ|<àx8p€x€ðÁÀàð8ãàx€ðÿà}÷ÃàÀžÿÀ>øðƒÁðxà=ðx<Àpx<<àÁÃÀxð8<x€|ÀpÁÁððp€qÁàxÁàðð>yçƒà€žà>ø>à‡àøðyðp<~ààx8>ÀÃÀx<àx<x |<Àÿÿñùðÿðø<óÏÿÿƒÿÀðð}÷ÃàÀž{ðð>|>øƒÁÿÀxøøüø>‡çÀ>ñà||þÿÃÁáøð€~ÿ‡‡ÿÿÿà?øøþÿÿøÿøÿðü?ûïÿÿÁÿÀøÿøÀ}çŸþÿ€žûÿð?üüÿïáÿáÿ€ÿðÿü?ÿÿÿ€<ÿÀþþüÿÇãñÿðø?ÿÿÿÿƒÿà?ððþÿÿðà€?ø~ûïþÿ€üþÿøðÿÿÿÿ€ÿýÿðþ?øÿïðÿáÿÀàþÿ‡ÿ‡ÿ€<ÿÀ?þþüÿÃóðàøÿÿÿÿÁÿààà<€þÿððÿÿÿÿÿ€ÿüÿàüðÿïàÿ€?€øþþøx>øà€~Àøþàðÿÿÿÿÿü€ðàðÀ>ÿ€Àx€ ðøðøàðÀàà€ð€ð€ðððÀ°x8ÿ~àøàø8øÿþþÿ‡ÿùÿðø?àþþüÿ‡ÿ?ÿÿÏÿýÿð?ü?àÿ?ÿ€üÿÿÿÿÏÿýÿÿðü?àÿ?ÿ€?ø?ÿÿ?ÿ‡çÏÿü?ùð~|àŸŸÿ€?ÿŸ?Ÿ‡ç‡ÿ€àÿ‡ÿÏ>ÿà?øà>χÀ>€ÿ‡ÿÏχÀ>€?ÿƒÿÃÏ€|À?߇¿Ãï¾óøyþà?‡À~>€>‡ÇÏ€?Ààüüøÿøþ<?Àà|<x?À@ø€~ñðÿøÀÀà<<x€`€ñðàðüøÇÀÀÀð9øþçðûø€€xÀ€à`Àð|<ððþ€†xüøþùøðð~?ÿ€ÿ€ÿø?ð?ðüüÿÀÿÀ?à?ðÿøÿÏñÿÁÿø€Àüüüÿü¸pÀðÿÿÿÀ?à?øðüü<<ÿ€øþÿÁàÿÀ?Âøþþÿ€ÿÿøøøÿÿÀÿÀÿø?ð?øüþÿàóÀð>øÿüÃáãÀ?øƒÿà?þþþÿüÿøÿÀøÿÿÿàðøøþþ|<ÿ?øÿÿÇáÿÀÿà?ðüþÿãÁÿøà|øþÿÀãÀðxpxxø€ÁÀðð8x<<‡ƒÃÁà>‡ÿðþþÿÿƒþÿüÿ€Àüÿ€ÿÁÿàÿø?ø?þÿÿ<<€8xx8ðàÀðp8x<ƒÃÃÁà>‡ÿðþþÿÿüÿüÀ>>Ï€Çáñáðø|>€<<x0‡‡ÃãÁÁàðøp<ƒÇÀ>ð€qÀÀ|ðÿàÿàð8ƒÃ‡ÿà<ƒÿøàŸ‡Ç€>ÿþ€À>Ç€Ááàñðxx€<<~‡ƒÁáøàðð8€Ãÿà<p8àÀ<ø?ðÿàÿ€àø<Áã‡ÿà<ðøÀ>ÿ<Ï<Àþ€Ááàñàxxÿ€<<?àÿƒÁáÿÿððp<€Çÿà<ðpÀÿÀxðø?þàÁàø8çü<ðøÀÿÿ>瞀Àþÿ€Áñàñà<xÿ€<>?ðÿƒÁàÿÁÿðð8<€Çÿà<ð8àÿÀ<ðøààà|x<€÷À<ðøÀþÿ€<Ç<Àþÿ€Ááàñà<øÿ€<<øÿƒÁàÁÿàðp<€Ç€<ðqÀÁÀ8ðpp8àÁàððx<€ÿÀ<ðøÀÿÿ€>瞀Àþÿ€Ááàñà<xÀ<7üǃÁá‡áàð8<€ÇÀ<x8àÀ8ðpx<àÁàððx<~àð<ðøÀ?þÿ€<ç¼À|Ç€Ãáàñðxx<<p<ƒÁãáàðp‡ÃÀ<x<1ÀƒÀxñüxxþÿà÷Àü8ÿþ>ÿ~ÿðÿÀðøÀ>À>ï¾€À~€ãáàñðx|€€<€x<ŸÃáãÁàø8øx‚ÿƒÿà<?À>xàyàÿðÿÀÿþøÿÿƒÿÿÀøþ?€þ<ÿàÿàðøà>ŸƒÀÃï¼?ðà?ÿÿàÿÁñðÿøü?üÏÿÀÿÀÿÀøøÿÏÿáÿûÿÀÿøþÿþÿÿàÿàð?øø?}ðÿðÿÀþ?ðþÿÿÿ€ð?ü?€ü€ÿÀùüüþ?ÿÏÿÏÿÿóÿþÿøü?ÿÿðÿÃùüÿðþ?üÿ‡ÿÁÿáÿàøøÿÏÿáÿùÿÀø?þþüþÿÀÿàðàø?}ðüàÿÀ8ÀøøþÀÿÿÿþ?þ?ÿÇÿÇÿƒÿóÿÿÿü?þÿÿàÿùüàüøÿƒÿÿáÿàø?àÿÿÀÿðÿ?Àüøð€<€ýÿþþÿÇÿ‡ÿÿãÿÿüüüÿÀüùøÀøàþüÿÀÿÀ€x€~@€ùüüüæþüÿƒ÷ž'ÀøÀÀ€ÀÀððøàððÀ€xÀÀx€Àø€À€Àø€Àà€ü€?àÀÀÀøÀüààÿÿ€ø?àÀÀ€ð€€üààÿÿÀøÀ€À€xÀÀüàÀÿÿ€ppð€Àx€Àüà€À<÷€xpÀÀ€8àÀ> ' à øÿ|ÀÀxç€ð€ð0€À>à?€ü?üðððÿÿÀðqÿþðüÿ|`>à€îg€øüÿÿÀà~ø>|ÿ‡ÇÁóáðùÿï<8>€üüþÿÃñûÿÀ?àþþÿ€ÿÀÿãÿñüþ<ÿÀÿàþŸü?ÿ‡øÿÁÿàþøÿüüÿƒÿ€ÿàþ?€þþÿÁáãÿðxp€€ƒÇáà8<<Çáààp8qç8Àüüþÿ‡ãóÿÀ?àþþÿÿÁÿóÿñøüxÿÁûàü~<ÿðãÁðøøþx<8€ðáà?Ø€~<€ÃÃÁÁààð`€ƒÁÀ8p8x‡ÃÁàðxqÇxü€?üþÿÿÃóûÿààþÿÿÿáùùùø||<ãÁðð<óøáàðð<<<>Àxàð€€ÁÃÀààp~€€ÁÁàx>ÀÃÃáððø|ø|ƒÃáð<< <ÀðÃÀðà?ÿ€ÿðûáðàÿ>ÀÁÃàøð|>ø<Ãáÿø<þÀø?àðð8øÀpàx€€Ãÿààp?ð€€¸áÀà8<üÇáÀp8qÇ|€?|>?ÿ€ÿƒðóáðàÿþ> À€Àøðx>ð|ƒÃÿðxü€ðÿÀðà?ÿ€ÿÁðûáøàþ>ÀÀÀxø|ð<ÃÃÿðx?üÀxÿÀðð8üÀpàp€€ÃÀàp`ø€øÁÀà<8<<ƒ‡áàx8qÃ<À>|>?ÿÿÃðóáðàÿü>ÀÀÀøðxàÀ|ƒÃàð~<€ðÃÀðð8x<8<€pàð€<€ƒÃÀàààp€ðƒÃÁÀ<p8<‡‡ÃÁðpp|qÇ?þÿ€~>?ðÿáðûáðà>ÀÀàøøøàð<ÃÁðð|ÀøÁÀðø<<<<€pñðÀ€áÃàðàðøððÿðïÁáðø~~þÿãÿ€ÿøþýÿŸþ?ŸÃÿ€?|>?ƒ‡Áñóãðàþ?ÀàãñðÿðÀðÿƒÁøøà|ÀÿÏðÿààýø|ÿÿãÿñùøÿàüÿàÿóøøþ~üÿáÿÿð?þÿïŸø?Ÿþü~?ÿ€ÿáùÿÿðàÿÿƒÿ€ÿñÿðÿðÀðÿÇçðÿøà?ÿüÿÃÿøÿðÿøø?üÿÿÀÿÀð?þ?¿ƒÿ€ÿðÿáýüà?üÿàþûøø~~øÿÀ~?àü}çƒàxþÿÿ€ÿÁÿÿÿàà?ÿÿƒÿ€ÿñÿàÿà€àÿÏçðÿðÀ?ÿüÿƒÿðàÿð?à?ðüÿ€þà?ü??ƒþÿà?øøðÀþÿ€ÿÀÿÿÿàðÿÿƒÿ€ÿàÿÀÿÀ€àÿÇ÷ð?àÀþüÿ€ÿð?Àð€>?àx€à?ÀðÀüþÿýÿ€àþþþ€?ð€À à?€ø?øþ?øðøøpøð?€÷àøÿø?ÿàüþü>ÿàþüøÿÀþü0Ààà<ðà||ð€àþ€|€ð€Àþø€ðø?€€|€à€ø?€ðø€€8€€ø€ðø?€€€€ø€0ðøp€€€€à€ð<?<ø€xðxx<€€€ÀƒøÀà€~?€?ð?Àÿ¿ÿÿ€<ø€xðøø€<p€€Àðÿ€€àðþÏÇø?€?à?Ÿàÿ€ÿÿÀð?Àÿ¿ÿÿ€ðøÿ~àûÀàüþÿàÀðððxÿà?€ðøüþ÷àÀÿðàü=ü‡¿€?à€ðþþ‡Áÿ€à€øþÿÿÃøàðàÿ÷ÁÿàxpÀŸãÀøüÿÿÿðÿðð?þÿÿÿààøøðøÿàÿÀþø?þÿÿàÿÀÿð?àþþÿÏÿÀà€?øÿþÃÿ€ÿà€?øþþÿÃøÿà}ð~àÿƒÃÁáàðp€ÃÀüþ?‡ÿÿÀÿðÿø?ü?ÿÿÿáÿàðüüðxÿàÿð?ÿþ?ÿÿ‡ÿñÿàÿðø¾þóÏÿàxð€||?‡Ãƒ€ðð€8<€øxáàpðàƒƒÃÀð~€€À?ü?þ?ÿÿÀÿðÿøü?ÿÿƒÿáÿáÿø?ü?üðøÿóð<~>>ÿƒÿáãÀ|øx?ãÇãÀðð€x<ƒÇƒàð€x<€ðxàà`ðà‡ƒÃ€ðÀ€Àþ¾?‡ãàÀþü~>ŸÇÇãðxðü>>>ðxøàø<<<Àøáà<ðxÁÁÁà0ð€p‡ƒÃøãð€ü€àxÀðà‡ÿã€p?ðÀÿÀ~|>?ÏÃà|øxü~‡‡Áðøàø|<|>ðøðÀøx<þÿðÀxÿø~ÃÁàðð<‡ƒƒþÿð€ÿü<€ÀxÀðàÿÇ€ð?ð€üÿ€|>þÿÿð|ø|þLJÇÀðxà||ÿðxøÀx<<ÿÿÀðÿà<ÿøþÿÁÀàð€ð<<‡ƒÁÿ€ÿð€ü<€à8Àÿðœà‡À€p`øÀø‡ƒÀ>üþÿÿà|øxÿþ‡ðøà|xþðøðÀø?øþÿ€ðÿÀxÿøþÿÃÁàÿàðø<ƒ€ÿ€ÿ€€ø<€ÀxÀðà¸à‡€€ààp€€€|?þ‡ÿÿà|ø|þLJÇÀðxà<|þðxøÀxøØþðûà<ðáÁÀàðð€pø‡ƒÃÀà€x€àxààðøàƒ‡Àààððø¾‡Ïð?üþÿÿ€|øxÿü‡ðøàxx|ðøðÀðà|ðÃÀxð<ƒƒÁÁààð<à>ƒ‡€àx>€Àxà!áàððLJãããÀÿð?üÿÏçÿñÿà~>?‡à|ø||‡ÇÁðxð|~>ðxøðø€>€€ðÁà<ø <ÃÁÀááø€|<ÃÇÇÀüøÀ?þƒÿüÿÀÿøÿü?øðÿÿáÿàÿÀà?þÿŸïãÿðÿà>~ üÿŸ‡ãàðøx~~ÿ‡‡ãàÿñùø~þðøÿãûð?ü?ÿÿÁüÿðøÿü?ÿŸÿóáñÿü?øøþþÿçÿÿð?ø?üÿÿþÿÀÿðÿüøàÿÿáÿ€ÿ€?øÿŸÏñ€ÿ€?ÿÿÿïÿ‡ÿð?üþþ?ÿÿïãÿàøÿð?ÿ?ÿÿÿ€ðÿàÿÿßÇÿÃÿƒÿø?øüÿŸßÀÿûùøÿü?üðÿ‡üÿóÿà?üøþþþÿÀ?à?x?øàþÿÀ< À?þÿÿÿÿÿàùþþ?þþïãÿÀðÿà?þþÿÿ€àÿÀ?ÿþ?ßÇÿ‡ÿÿð?ð?ðÿ?ŸÀÿçóðð?øÀÿƒàÿÃü?ððà€ÿ?ÿ‡ÿïÿÿà?øþÿþüïàÿ€?ð?àþüÿÿÀ?À?€?ÿøÏÀüÿxÀÀ€€ƒ€€€üÿÿÇüÿàüþð‡€€à€`€x8€ÿàñ €x>€þ€|>?ÿðà?þþÀøðÀð0`x€ðøxð€À€€0øüüø€ ?<ÀÀøðøü|ø€ø?€?üÀÀøðp|ÿÿþø€ø?€~ü€Àø@0à8<€ÿÿþø€ø?À?þÀxpð8<€ÿÿþðø€p<<ÀxpÀpàxÀ<üø?€ÿÿþàøÀx><Àxàþ€xøààø ã‡øÿÀÿàÀüþþÿÀûç¾øÀÀø<€<x0?ñðxð?À‡ñ߀þàðàÿÿáÿø?ðÿøü?ÿÇøÿÁÿààüþÿÿÀóç¿ððþÀÿàðüøüÀüøÀÿÀÀžøÿ<?Àÿðàüÿÿƒ÷ñûø€ð??ÇùÿÀÿðøðÿÿáÿü?ñÿüü?ÿçðÿÿÀ}ðüàáÀóç¿üðÿÿàÿþÿüþøþÿà|~üþÿ€ÿààÿÿüÿÀ<ÿÀÿð?ðþÿÿÃÿùÿø€ø?ÿƒñÿÀ?ø~øàð?øxpþ|<?}àpàxàp<<€€áÀsã?þðÿÿàÿ€ÿÿþÿøþÿàü~üÿÿÀÿàÿðÿÿŸþÿÀ<ÿàÿððþÿ÷Áÿðÿø€><ÿáñàxx|8àp?8p8<8àpàxàx|<€Àà?þðÿÿàÿ?ÿÿþÿøþÿàü~><Ÿÿ€þùøÿÿ¾>þ‡À<ñàxøx‡ÃÀ~ ?€8ÀáÁàpxx8à‚ð>p8À8àpàxÿøx<€Àà?þðóà<ÿþŸø>ñà|>>Ï€ðàxy缃À<áà8ðxƒÃÀ|>€x€9áÁàð0x<àüð<ð8ø8àpàpÿøx<€ÿÀà>?ðÿÿà<>>>ø>ÿÀ<?øÿ‡€ðà|yçø>ƒÀ<à8ÿøþÀx<€ü€=ÁÁàðx<àÿp<ð8ü8àpàpÿðp<€óÀà~?ðþÿÀ||<>ÿø>ÿ€|>?ø?ÿ€ðàxyçø<ƒÀ<àxÿøþÿ€x<ü€}ÁÁàðx8àÿð<ÿð8<ü8àpàpàp8€ÁÀà>ðÿÿà?ü>ÿø>ÿà|ü?ÿ€ðàxyçø<ƒÀ<ÿàxÿøþÿ€x<€À€}ÁÀàðx8à€ð<ðp888àpàpàx<€ƒÀà~?ðÿÿà?ø>>ÿø>ÿà|>ü?ÿ€ðàxyçø<ƒÀ<ÿÀxüžÀx<x€àÿÁàðx8àð<àp8<88àpàxð|8€Çðà>ðÿ€ÿðø>?ÿø>ßð<9þ>‡€ðàxyçü>ƒÀ<Áàxð<€ƒ€x<|€øÿÁàøx<ðø`<ñü8<><8ãÿ€ÿÀðÿø?þÿþÿøà~>ð€Çðð>>>ø>Ãà|>|>?‡€ððøyçü>ƒÀ<Ãàxø<€‡€x<| €üÿƒÁà€|<||ÿÿÿàÀÿþ~~?ü}÷ÿ€ÿÀðø?þÿþÿðð~?þŸ€ãð?à?ø>???Àøÿƒóð>>~ÿÿÀÿñÿðyç¿þÿ‡ÇàÿÃÿøøÿü?ÿÀÿÇÿðÿ€Àø?þøüïóøÿø?üþ~ÿþàÿàüøý÷ÿ€ÿ€?à?àþüøxÀüÿÿÿàÿø?þ¿ÿÇÿ€ÿãÿà?ÿÿüÿÿàÿðÿðÿÿÿüÿ‡ÿáÿÃÿøøüÿ€ÿÇÿñÿ€ÿÀøøøüÏóøÿð?øþ~ÿü?€ÿÀ>p~~À9à>þÿŸÿÿÿàÿø?ÿÿßÿÇÿÀÿóÿàÿ¿üÿƒÿàðàÿÿïøÿÿáÿàÿø?ð?ðÿ€ÿýáÿ€À?¸àø|†áà€?üŸÿŸþÿÀÿøÿÿŸÿÇÿ€ÿãÿ€ÿ?ðþÿàÀ?€ýÿÇàÿÿÁÿÀüÀÀ€„|€|ü??ÿüÿ€ðÿ¿?‡çÿ€÷€~üÀàx| `øø|€ðÿÀ?ÿ?üð€8ðÀ>øx€À|Àð€|À€€à€à~àð€øüÀÀà€€xÀà€üþÀàà€€Àà€øü€ÀÀ€ÀÀ€`üÀ|€àà€àà@€ðxÀÀÀ€€Àøþø€?àÀà~ŸÀø|à>p‚ à€À‡à€ÀpüqÃüð0gà?€øþÿƒüÿÃÿà?ðààÿŸà|üðçüÿÀ?€xàüÿø¿€?Àÿð€øüÿãø?€þüüßÀÿ€Áþàøÿ€€áÿ€ðþÿÿïÿùðûÿà?€üþÿøÿÇÿàyðÀàÿ‡€ÿþø?ÿÁÿÿàÀüøþÿ‡üÿÀàÿø€ü?þÿóøàÿþüÿÁÿÀÿàÿ?ðüÿÀÿÀáÿÀ€øÿÿŸÿÿÿùøÿÿð€þžü<ããÿàxpààǃŸÿþüÿçÿƒÿáÿàø?üþÿøÿÀÿàÿð€?þÿÿÏ÷øÿàÿþþÿÃÿÁÿÀþøþÿ€ÿàñáÿà€<8‡¾÷Ï9øxøp€À8áààð`àà‡¼ÿÿ?þÿçÿÃÿáÿðü?þþÿüÿàÿðð?€?þ?ÿççáùøðþÿÁãÃÿàx|<ù€áàðááð€<Çžs8x8pxÀÀ<€ðàðààƒÃøþ>ÿÿÏÁÿñðÿü|>?Àøóàñð<€|ƒáááàð€ðÃÃÁÀð<8àÁà`áàð€x<ÇsŽ8p8ðx€<þÀ8€áàààààƒø?ü~??ýÿ‡áðáðü||>þà|áàñð<€|áñáÿø>àÃÁàð<8àÀÀñàð€üÇ {‡àƒÃÁàð<<ÀÀàáàð€|‡s†8x8pxÀà|áààðððàÿƒÇÇð?~yÿƒáððø||>?À|Áãáà|À~Ãàð<>à‡Ãáàø8<Àà!áááà€>‡Ç‡sÎ8|~ø|?üÿÿÁÿÃÿáÿÁùøÿðþÿççóð??}ÿÇáøÃýøþüž>?ÿ€ÿáãóø?øø?~€çÀ?ÿø?ÿ€ðÿóÿðð~øþøÿñÿýÿàø?þÿÇÿÞïþ?ÿþþ?þÿÿÁÿÃÿàÿƒýüàþÿç÷ñàð?ÿ?ÿÿÿÁÿóÿøÿþÿ?þÿÇÿÇûûÿü?üü?þßÀÿÀ?ÿøð?ÿ€ÿÿñÿøÿøðüþÿñÿùÿÀ?üüÿƒþÿÿïþÿþþ?üüçÿÿÀ>øøüÿð?ÿ?ÿÿÿ€ÿñÿøÿ?ÿ?þÿÇÿçûùÿü?üþüßàÿ€ÿøðÿ€ÿÿðÿøÿøàøþàÿùÿ€?üðÿøÞï>Øøàðÿ?ÿûÿÿàÿð?þüüÿ‡ÿÇûøÿøø?üðßÀþ?€?ðŽþð€~À€€0ðþ?ÿñþàÀþøøþÿƒóð|`ÀÀ ?àà8€€àÀ€ü?ðàxà<Àüð~àøðü€ü ðþàøð?€ü€0<pþÀøðüx8p€<~àxð€<x8üpÀà?€<>àxà<<Àù€?Àø9ððãñþðàð?€>€pÀ€àð 0ð€|xðÀà€<€?à?àðÏÀþ?€?Àçàøþÿ‡ƒ€ÿàà?ü?øüãùþ?ð?ðü€ÿð?ø?øü÷ð?ÿxà?üøÿ€ùùþx€9øþxààÿ¾øÿ€À<ÀÿððÿøßÁÿÿÀãÿð?øüÿÀÿÁÿÀÿà?ø?øþãðþð|x<|Àÿø?üþþÿøÿÃÿþ?ø?þüÿÀÿÃÿÿÿþ?Àþÿxð?ñÿÿþÿ‡Çàÿàÿð€?øÿüÿãÿ€ÿàÿóÿðÀàððp8xÿÁÿðü?þÿÿñÿçÿþø?üþÿÿÃÿÿÿþ?€ÿþÿxÿàñÿÿ~ÿÇÀ<óàÿà|üÿ|ÿLJáÁàñøðx8ñƒƒÃÀðàà8ÁÀààð8x{àÿð?üÿÿ€ÿùÿóÿÿüøþáàûÿÿÀž‡xùðxxy羇‡Ãà<ðà<€x><ðƒÁááàxpx<àÃÁàpü<áÀàpÿüxóÀþ?¿€ÿãáó÷Þø|>àÁà~瞀>xààðxqÇ8ÁÀ<Áà8ð<8àÃÁÃÀxðpÀÀƒƒ€ðÿ€8?þã€Àðÿøpÿð|ÿ€üÿðóÏð>?ÿàÿð>óÏÀxàðÿüx㼃Áàà<€p<àûÃÀÀxpxðÀÃÀpà<?þó€àpÿðxÿà|>?ÿ€øÿñçŸð>ÿàÿàx瞀<ÿxÀàÿøqÇxÀ<ÿà8ð<àóƒÀÀxðpø€ƒ‡€ð?à8>÷Àððxÿð|ÿ€øÿðóÏð?ÿàÿà<óÏÀÿxàðÿøy缃Áàÿà<€pà€Ààxp80üÀÃÀpÁð<àpx|ÿð|>?ÿøÿáçŸð>þàÿ€|㞀<ïxÀàðqÇxÀ<áÀxð<àÀÀpðpp8€ƒƒÀðÀà8>ðàø|<ðø|€øàóÏø>>àà<óÏÀx|àðøy缃ÁàÁà<€xàÀàðpppx<ÀÃÁàpxaàðü<߀?ÿðÿüü?üàø|>?øàçŸø|>àà`|ãžÀxþðàüqÇ>ÃÀ<Ãà<€|x<àÿÁðñûàðð|øþøïãÿàÿáÿàü~?ÿ>ÿàÿø?øððþøþ?ŸÿÀüÿùóÏþüþÿ€ÿÃÿðóÏüÿÀÿ€ÿÿøü}çŸþÿÁçðÿáÿø?ø?ø?ø?€ÿÿÀÿðÿàþþ?øÿþÿðÿððÿÀþ?þÿà?øààûþøþ¿ßÿÀÿÿùÿÿÿøþÿÿÁÿñÿÁÿÿÿþ¿ŸÿÃÿÀÿÿø?øÿÿßøÿÁÿñÿÁÿø?øøð?€þÿàüü?àüüÿà€?€ààùþ?üÿ?ÿÇÿÀÿÀÿùÿÿÿøþÿÿÀÿàÿáÿÿ¿þ?¿ÇÿÃÿÀüøÿ÷ÇøÿÀÿðÿàÿðð?øÀ?€þ|€x0Àxñü?ðü?¿‡þÿ€ÁÿÿŸàüø~ÿóßð?Âÿ€>|@àø€üÿùÆà@~|ð`x>8àø€øü~€ø|ðüÀ€0øþ~€ü~ð~~üÀÀàÀ€øøþ<€|ðÿ~üÀÀàÀÿ€øp¼€<ðÿ~øÀ€àÀÿ€øà<€8àÿ~ðÀàÀà€8à<€<?ŸÀ?Àÿ>ÀàÀà€xàpÇø=à?àø€€ÀÀøø?ŸÀÿ€€>`ÀpàÀààá„xÀpüðÿóðà?ü?üïãüÿ€ÿðÿø?ÿþÿƒÃà?à?àøü?ÀÿÀøÀø~€ü?¿üðÿÿðÿÿ àøð?ïþ?À`0ø?üøÿƒÿ€øðüþðÿÏ÷ð?ð?ü?þÿãüÿÀÿðÿø?ÿÿ‡Ãàÿàxð?øþãÀ?ø?àÿ¿ÿÿ€þ¿þøÿƒÿÀÿ?ø‡ÿÿ€àÿøøÿƒÿÿÁñðøüüÿƒÿ€ÿÀøøþþðÿ‡áðø?ø?¿ÿà|ÿà|<|ïÿ‡Ãàðððx<8ÃÀü?àÿÿÿƒÿÀþ?¿ÿøÿÃÿÀÿø?ŸÿÿÀÿàø?üÿÇÿÿÃñø?ø?øþÿ÷Àóà?ø<<þpàáÀøxø€<áà<<<À‡Àáàààxx8ŽÀÿø?àÿÿÿƒÿÀü?¿ÿðÿÃÿà|ø?çÁÿà~~~ÿχÃÿÁðð<8àÃÁáàxxx<pàáÀð<ð<Áà88€Àáàaÿøð8ÎÿÀ|xàŸÿÿƒçÀøøÇÃãà€xx‡ƒÃñà<xqÏÇÃÀðx<<àÃÀððxx<àpàã€à<à<Àà88€<ƒÀáàÿøð8ÞÿÀÿøàŸƒçÀûß>ðÃÇÃàÿ0òŸÃáà<xðÃÁà€ð‡þÿãÁà<xqßǃÀðxü?þàÃÿððpüþpà{€àà<Àà88€<ƒÀáààp8üƒ€øà¿ƒÿÀÿþ>ð€Ãàð‡ÿÿÇÁà<øàÃÀðxx pà?ð<à<Àà<<<€‡àáðø8|8øßðÿüàþÿÀþ>ð€ÃàÿøŽ€Áà<øðxà|ÁÀ<?ø€ÏÁãñøøÿøþüpÿðøüàü‡ÇÀ€þøÀÃà€ø|‡‡Àáà>|qσÇÃÀðxøx>àÃÁðp|x>ÿùÀø?øþþÿÃñð?ø?øøþÿáÿøøø?þøðÿàýüüüà??Àü>ÿãÇÃààùøߟóã÷à?ø~ü<óÏ߇ÿÀñø€ÿþü?ÿÿÇÇáÿðü?þ??ŸþÿÿÀðøøþÿÇóø?ø?àøøÿÀÿðà?àþðàñ€ÿüÿÿŸïçÿøÿð?À?ü?¿Ïÿƒÿç÷ðÿøÿøÿïÿÿáÿøü?ü?ÿ÷ÿƒÿðþðÿþÿÿÇ÷ðÿð?þþ?¿üÿ€ÿÀÀ?øÀÿÿÃñøà<ø`û>`àÿø?ÿÿÿÿïÿñÿð?À>ø¿Ÿÿƒÿï÷ðÿøÿðÿïþÿÁÿøø?ðÿãþÿàüÿð?þüþÿ‡çà€üð??øþ~88 Àøÿÿÿïãÿðÿðàx?ŸÏÿ€ÿÇóøøàÿÇüÿððàyàøà¸?ðÀà8 8<Ààþ?ÿÿÏÃÿààÀp?þÁà"û <ð~?€àÀðÀ?à?€à?À~ÿà?€À€ÿ€>ÿ€ü<>8xø~øðx€€|ü>üø?~>ø€€üø8xø?~ýÿ?|üÀÀ|8<ø?þ~ÿÿ>üø€xÀ8<ø?>ÿÿ€>üø€à8<ðð>~8ÿÿ|Àãð€À9àü~üÿÀ?Àüàð <ÿ<€8üÿ<ððààø |ÿ‡óùïàð?ø¿ƒþÿüÿÀàü€ ø8|ÿ<Àð€?àðøà~þüþÿ€ÿûøðøüþÿ‡óóÿðø?øÿÿÿüãÀøð?üð??ð>ÿÀþÀà?üÇáü€À<þü?àüðÇð€?€øþÃßÁïà{øüøÿ€?ðþþþÿÿÿøðüþ?þçƒáóÿð?ü?<ÿÇ€<áàðx><ÿøÿŸðÿƒÿÃþÿðþþþïóþà?àñà?ü>>€ðóãáà<8ÃÁáÃáàðð<<xÁÀ8p„ÀÀ<~8þñÀðxp<À‡ƒ€<ÿÁÿøp<~~?ÿ‡ðÿÁÿ€?ÿø~?ÿÇÃà>ùðøø<‡€>ðà~<<€ðáãÁà€<ƒÀáÁàððx€<xÁàx~øÀÿà<à8þÿ{Àðxx<À‡ƒÀ<Áÿðx<|>àð‡Áð>øø|>>¿ÇãÀ>ðñúø<‡€>ÿx<<þðÀãÿà?Àø€Áàððp<xÁàðþþÀÿÀ<?ðxþÿ€{€ðxp<À‡ƒ€<áðx<|>Àð‡Áð>ø|||>ÿÃçÀ>ðñÿü<‡À>ÿÀx<ÿðÀCÿð€øþ€ÿÁàððx€<xÁàøþþÀÿ€<ðxžÀ?€pxx<À‡ƒ€<Áàðx<|>€ð‡Áð>ðx>ü|ÿÃç€>àÿø<‡À>àx<þŽðÀÿà€üÿ€ÿÁàððp<üxÁÀüp ?À€<àðx<ƒÀðxx<À‡ƒ€<Áàø8|<|>€ð‡Áð>øx?ü|ÿ÷€>àÿø<‡À>?ðx<þÞðÀÿ€€üÿ€áÁàððp<øxÁÀðpÀ€<àx<<ƒÀpx| <Àƒÿáûàü?ÿ|>€ð‡Áð>øxø~Ðÿ€>ðøà<‡€>Çðx<|üðÀÀ8<€Áààðp<€xÁÀàp<àƒàà<ðð>>ï€ø|?þ?üþçãÿáÿÀøÿ|~Àð‡Áð>øxð>€ÿ>ðøà<‡€>àð|<>üðàà €8<ÀÃÁààðp€<üþÁÀùüÀÿŸÿÿÃÿàÿÀÿðþ?ÿŸÏÀÿ€üþþ?üüçñÿáÿ€?àþþàþ‡Áÿà€øø?ø?ÿÿÀÿÿÁøxÿüðÿ‡ÀÿÁñð~?ÿüÿðóÿð?ð<|¿ûãÿùðøü|ø?ÿÿÇóðÿþ?ðÿþÿÁÿÀÿÀàþÿßÀÿüüø>?øð€ü?øÿÏáÿñÿñüü?þ?ÿÿÀ~ÿàÿøÿüðÿÏÏáÿáÿð?ÿÿøÿÁÿñÿðø?øþÿãÿóùýüþüÿ€ÿÇóðü?ðÿüÿ€ÿÿÀ?€øŒ‡<@ø?üÿŸÿðÿñÿñÿþ?ÿÿ‡ÿÀ~ÿàøüðÿÏïáÿðÿàÿþøÿÀÿðÿàø?ðüÿÁÿãùùüü?ø?ÿ€ÿñà8ð?üÿŸïðÿáÿñÿþÿÿƒÿ€<ÿàø?ðàÿÏáÿàÿÀþøpÿ€À?ðàð~0à`€ø|øÿçàÀÿáüþÿ€þüÀ€À€ð|ü€€ðÿ|€ÿÀÿÿþÿ?þøÿ?ü8ð€€>ÀÀÀ€xxpþ?€Àðà||øÿ€?ÀðààÀøüpøþ?Àð?€ððàü|xø€Àð?ðàÀøpÿøpàÀð€?€0ð`ð€€€À0|xð€<?€ÀðÀÀøðàxà€€€ü°xæàüü~ÿüÿxÀøà€xð€ð|àÀ€À€þþÀüüðüxÿÀðþþÿÿÁþÿþ€Àþð~ÀþüÿÁ÷€ðüþÿ€ÿáï€ÀþÏ€?Àn?€üþð>??ðà??ç‡ø¿?ÀÞÿÿÀÿüøü€xÿ€?ðüþÿƒÇ€üÿþ€üÿ¿àÿÿÿñÿàü?þÿ‡ÿÀÿñÿàðÿÿÀÿ‡ÿÀáÿþ?Àþÿøÿ€ðøø?ÿ¿ÿÇøÿÀðÎÿÿàÿþü<Àxÿ€<ÿ?ÿàxóàxpLJðà< ƒÀxàx€ƒƒþñÇ€À?ÿð?àüÿ€ÿÁÿø>|Àǃð|ùð||ÀýÃÃÇãáðàû€øÃÁààx<ÀyàxÁÀpðààüà€xàð€þÿ㎀À?þ÷¾àÀÇÀøøø>€ÇÁð|ððx>ÀøÃÃáàþ`ùÇÀ€ÀxÁààðx~À8àxÁàðÿ‡þ?àþøƒÀxà?ø€ÿÿÀñÇ€À?ìÿ¾àÀ‡€øðøüÿàxàðÿü€àÿÃÁàÿÀóÏÀ€€øÁáàü€yàxÁÀðÿƒÿÿàüü€xàÿp€ŽÀ㎀À<ÿþàÀ‡Àøðøþ€ÿÁð|ðøÿþÀàÿÃàààqÇÀ€ÀxÁàñàþ€8àxÁàÿðÿÿ€þà|þƒ€xàøx€€ƒÀñÆ€À>ÿüàÀ‡Àøðøüÿàxàðÿü€àÿÃÁà?ðóÏÀ€€xÁÀÀ|€yàxÁÁðà€†Áàx8ƒ€xà?ðp€€ƒÀãŽÀÀÿüðÀ‡Àøðøþ€ÿð|ððÿðÀàûÃáàßðqçÀ€ÀxÁàÀ|€8àxÁáàðÀÇ€Àà<ƒ€xð?€ðx€?ÇáãçÀÿàñÏ?üüÿ€ÿüàÀ‡€øðøþ~€à|àðø€à‡ÃááàðóÏÀ€€xÁÀ||€9àxÁÁàðÀÏçø>?þ?üÏáÿ€ÿà?€ÿþüÿÃÿãÿÿñûÿÿüþþÿüøã‡Àüaøø|~ÎÁðÀ~qðð~ãà‡áááððyÇàïãüÁà|ÀÜ?À9ãÿÃÁáûüÀàÇÿÿÿüàþüÿóÿÀÿà?€þþÿÁÿÃÿ€ÿðÿÿ¿üþøøÿÿŸÏàÿñýüÿÿÿñÿàûùüþÿ‡þÿóóùÿðÿï¿þÿÿ‡ÿÇóðÿøü?þü÷ÿÇóøÿüøà?Ç÷þÿøàüøÿãÿ€€€€~8@ø?ÿÿßïàÿùýþÿÿÿñÿàûýü?þÿ‡ÿÿ÷ûüÿàÿÿÿþÿÿ‡ÿÇûøÿüüþüÿ÷ÿÇûøüøÀÃÃü~p?àðàýþ€ð?ÿÿŸïàñýþ?ÿÿÿàÿà?óùü?üÿ‡ÿÿóûøÿÀÿÿÿüþÿÿÇóñÿüððø=ã˜áÀ<?à€<ðÿÿïà?ñüþÿþÿàÀáùüðþþùÃñø}ç Àøøàà<ø€à<>à<<ÿøÿð?ÀÀà€ø>ààà€À|üþààà€Àüüþðàð€À~øþðÀàÀx€>ðàðpÀ>>àààà€àðøÀ?ø> ø€ðàà ðððøðøÏ€þÀÀàøø?üÿÀÀÿð?ü?üþÿàáÿàðüÿà?Àà ¾üþÿÀþ?ðüÿƒþÿƒàð?à?àüþþ?ÿ?ßàÿðÿø?þþÿÿÃñùÿàðüÿÿ€ðÿðø~?ÿÿ‡þÿƒÿÀÿ?øþÿÃÿÿÃñøð?øþ?ü?þÿ?ßÀÿðÿð?ü?þÿÿÃóùÿàà?üÿÿÿáÿðøüÿÿÿ?ÿƒÿ€xð~>ÿ‡ƒÿƒáðøðxx?|?þ?ÿ?ÿŸÏÀÿøàüÿÏ€ãÁùùÿðð>àÿññø|x~?ÿÏÇÀðx8ðÃÁÀðpðpp<>~~|?Ï€áø>>€ãðùñðà|>Àáãàøøx<yçžà|Àǃàðàðñøx~|ŸÇï€àü€ÿÀÿ€ðyðøðÿààóàxø8<óßÿ‡ƒÀð?ààÇÀðpàÿü8üü‡ÿÀø>>ÿ€ÿðùàøàþÀÁãÀøð<xç¿ÿà?ðÀÏàñàÿøx||ŸÃÿà|€ÿ€ÿÀðyðxðþààóàxð<óßÿƒÀðøàÇÀðpàø8à|üƒþàø>>üÿÁðùàøàÀÁãÀøð<xçžàpøÀǃàñàðxð~~Ÿþàø€€Çàðyðøð|ààóàxø<ó߃Àðp|àƒÇÁÀðpðx>ø~?ÿüñø>Ž>Ç€ÇÁøùñðàƒáñãñðü>x矇‡‡óÀ€øøüàχÿÀñøüxü?þð?ÿ?ÿÿ€üÿøÿðÿ?ŸÿÀÿàÿÿÿøð?ÿÿÁÿÀÿùÿðü?¼óÏÿ‡çàÿàøøüþÿƒÿðüü?üÿø?ÿ?þþüÿáÿðÿ¿ÇÿÀÿÀÿÿÿàð?ÿÿÿÀÿøÿàüÿÿÿïÿïðÿàÿøððþþÿàü?ð?ðÿðÿüþüÿàÿðÿ?¿ÃÿÀÿÀÿÿàðþÿÿÀüÀüÿÿÿãÿçðÀø?àü|}à?øàÀìàüøðø€ÿàü?þþ?øÿ€ððü~@ àä<àðà€øÀ!ð€ðÿà?€àðÿð?€?ààÿà?€àÀÀÀ€ÀàÀð8ð|À>à|ð|àà8xø>|üðø|À€ÿü?€ü?€ø?|üðø|Àÿàü?€ü?ø>xüàø0ÿðþ?€þ?€ð€0x8Ààÿøþü<€xpðÀð~ü?àð?üÀüþÿø>€~<Àxxáà€`ŸÀ~ùøð?øÿÿþàø?üàþÿøüp<x€|Áàðà€øøÿ?àÀ||þ|ø€?ðððàxøÿÇóø?Àø?ŸÁÿáñÿø?øÿÿƒÿÿþûà?ø?øÀŸÿ€ø|üüð?àþü>÷ðýþðþƒñøÀ üþÿ€ÿð?ðþþÿþøÿ€øðüàxøÿçóø?ÀüÃÿƒáñÿø?ø?ÿÃÇÿÀðà<ÀÇ€ø}ÿþü?øÿþ|÷øýþü>ÿÿÇûüà~?þþÿ€ÿððÿþÿÿøÿÀø?øüàxøÿÁàðÀþ‡‡Ãáð?°x<懃ÁÀðà8À‡€øùÿþ?ü?üÿÿ>÷øýþ?ü?ÿÿçûüÿð~?þÿï€ÿðøþúÿøãÀ?Ð>xþàx8pðàÀ‡Áàð>pÀ‡ƒÁÀü8à‡€ÿøÿþþ?þÿÿ€<ãðøx~??ÿóçñüøð>‡‡€ðxŒ€xÁÀ<8àx8pñà€Áàð<ðƒÀÿ€øÀ‡€ÿøü~~?þÿÀ>ãà|x|>?‡ãáðñðx‡Ãð<€€xð€8àx8pyÀ€Îààp<ðÿƒÀàøà‡€ÿð?€ø>>¿‡À|óÀ|ðø‡€Çáðñÿøøÿ‡þà<€€xÿø<àx8pyÀÀÎáàp<ð€þÿÀàøà‡€<ÿà?ø>ÿ‡À<÷À}ðø‡€ÿàñáÿøüÿƒÿà<€€xÿ€ø<àx8p?ÀÀþÁàð<ð€ü‡ÀÁðx8à‡€>ø>ø>ÿ‡À<ÿÀ?àø‡ƒÿàùáÿðþÿÿ€à<€€xÀø<àx8ð?€ÀüÀàð<ð€ðÀàðp8À€~ø>ø>ÿ‡À|ÿ€?àø‡ƒÿÀ{Áÿàþø€<à<€€xÀxx<àx8ð€ÀüÁàð<x<€€Àààx~Üþ¿‡À~ø>ø>?Ÿ‡À<€àø‡‡ãÀÁð€<ðx€xÀðx<àx8pÀxÇÀðø~~øðÿÿããðÿðÿàÿþÿþïà~ð>ü>~>>À|À|>‡ÃÀÁð>‡€<øxÃxƒÀðx>ðxÿÀà?ü?€xÿ€ÿüÿÀ?ðøÿÿçóñÿðÿÀ?þþþøïà>ü?€~?~?ÿÏÿ€ÿ€?ÀþÀÇÇÿð?€ÿøÿŸþÿÇÿ€ÿàÿð?ðÿŸÏÃÿÃÿÀøþÿÿÿƒÿàð?þ?¿€pÿøÿÀàøÿÃû‡óðÿÀ?àþÿàüþ?ÿÏÿÿÀ>€üÿÀÏçÿø?€ÿøÿßþÿ‡ÿÿààðÿŸßÇÿÃÿ€øþÿÿÿƒÿÀà?ü?Ÿ€ðü?ðÿ€€ðÀÿÿð?ü?üÿÏÿÿà>€øÿÀïãÿððÿŸüÿþÿàÀðÿÃÿÿð˜üÆþàÀÿÿà?ð?øÿþÿÀ|àÿ€ÏÁÿà?Àÿðøø€8Àp<àÀüàÀà‚ø€|àüÀ߀øþø€ÿøþð€üðüàðüÀðüþüþÿüþ<x<<<<<ãð??ÿ‡þÿÁþÿðüüÿ‡ÿ<Áàà>|?ÿ‡‡ÁÀüøÿ‡ƒ€áÀÀð<àÁ€ðp<8à€<ãÀÀpààøp8<<~àÿÀñÀ€à€üÿ€ðx8þÀÿ€<ó€ÀðÀÿÿÀp8<?þÀÿ€{€€ð€ÿ?Àðp8|À<ÀðÀ€ƒàp8<<À?€€ð<€Àðp<<ÀÀ<>€À|<À€áààpxàÿÀ?ÀøøÿÏøþÿÿðüþÿþüÿÁÿÀÀø?øÿÏüþÿ€ÿðþþÿþþÿÿààøÀÿøø<üpø€8Àð8Àð€ð€àÀøøþÿÿÿ€<ÿÿ€|ÿÿÀþÿÿÀþ?ÿ?àÿÀÿü?ÀþÀÿøàþðÿààüðÿ€àþð¿ÿÀüàÿüàüð?ÿðÀø?à?ÿðÀü?àÿÀ?€ÿøÀÿ€?ÀÿøÀÿþÿðÿ€ÿþ€ÿðÿ€ÿøÿÿàÿÿðÿÿðÿÿàþÿàþÿÀþÿàþÿ€üÿÀþÿüÿÀþ?þ€øÿ€ü?þÀÿðÿ€üü?ÿÿàÿøü?ÿÿÀÿøÿøÿÿ€?þ?øÿðÿÿ?þ?øÿà?ÿüüðÿà?ÿðüðÿÀÿ€øÿàÿ€xÿøÿàÿ€ÿðÿÀ?ÿÿð>ÿÀþÿà?ÿÀÿþÿÀÿ€ÿüÿÀÿ€ÿøÿ€?ÿÿøÿÿÿðÿ þÿðþþÿàüü?ÿàüüÿÀøøÿÿ€øøÿÿ€?ð?ðÿÿ?ð?ðÿþàà?ÿþÀ?àÿÿüÿ€Àÿ÷üÿ€ÀÿÏøÿÿ€ÿÿÏøÿÿ€ÿÿðþÿÿüðþÿÿð?àüàþÿà?àü?ðþÿÀøÿøüüÀùÿüÀþÿ÷ÿþàüÿ€ÿÿþðüþÿÿÿþð?øþÿÿþþø?üüÿÿðþðøüÿÿàÿ?ðüøÿÿ€þðÿøøÿÿ€þðÿüÀðÿüþÿàÿøÀð?ÿüþÿàÿüà?àÿøþÿÀÿøà?àÿÿðþÿÀûüàÀàÿÿàüÿ€óüÀàÀÿÿÀüÿ€?ãü?ÀàÿÀÿÿ€øÿãü€ðÿ€?ÿÿø?ÿÿÃÿÿðÿÿÿþøÿÿÿÿðÿÿ÷üùÿþÿÿþðþÿÇøÿÿþþÿüàþÿ‡øÿÿþüÿüàüÿÿðÿÿþÿøðÀüÿþàÿýÿÿð?à€üÿøÿñÿÿà€øÿàÿàÿÿÀøÿ€ÿÀÿÿðÿ>þàx?ðà?ààÀÿ€ñÿÀÀüþÿøÿ€?ùÿððþÿÿøÿÿñÿðøþÿ~~øxxxx<<<<àppxð<<à8x8ð<<À0pyà<àxxð<<<À{ñà€à|àáàøü?ø<ÀàüþðàÀðþÿ<<Àsáà>àxðð€<Àx<pà8pðð<€à<øð8xxø<€<ð~<üøxpxxx<>ð?üüøþ>?øÿ€ðøüñþ>à?üþÿÀððüàÿÀüþÀpà 8|~ü€€ü~ðÿþø€ÿ~üÿ?ÿÿx€ÿ€þÿ?ÿ €‡€þþ€ƒ€<x€ƒ€8ÿÀ|üðøxxàþðþ€àƒþÿ€€?àÿüøüx>>øþx€ððÇ€pøüÿøÿøþ€ø‡ƒÿÿ€ÿàðÿþüþðÿüŸÿx?ÀøþüßÀpüþÿøÿøþ€?øŸÿƒÇñàxðü<ðÿÿßÿ€xðøþþÿàÿàðüþxÿü€<<þƒƒƒààpð€<ð?þ?Ï€xøðàÿàp|øðŽ8üžÿƒÿÿààxð‡ƒÃÀxÿøü<ÿà0üÿxÇ€üÿ€ÿƒÿàÿð8ðÿ<‡ƒÀx ÿð?ø<?ÿÀ ü<ÿpŽ8þ?ƒÀààxð~<‡ƒÃÀxÿà?ü<üà?€xÇ€x‡€ƒÁààð<ð<‡ƒÀpàx8<<Àx<<pŽ8x‡€‡àaáð>|‡ƒÃÃÀxðx8àx<€xÇ?À€?ó÷ÿÇÿ€ÿøÿü?ðÿ?ŸÀ|<‡Çÿ€úýø8ð~>à€|þ‡ßÿƒÏ<ÿð?ø?þó÷ÿÇÿÿðÿüàþ?¿€?þøÿÿóÿÿüüÿÿÿƒþÀ?ÿÿ‡ÿÿÃÿþÿø?üüðáÿþ?À>0?àø€ü?øüÿçþÿüøþÿÿþÿ€?þþüÿ‡ïþÿà?ðÀððøøÿãÀÿøàœÿüþø@ €À€ðà@ÿ€áð€ÿ€ðñøxàÿðàÀÀ‡€ððø?Áþñÿ€ÿøà0à€€pøpqãÞ8qÀÿüà8à¿à=†ƒœð8üpàã‡<9ÁÀ<<àxàüù¿ðÿÎÇþð|þp<àç8qã€<<‡ùáýþpüàÏþøøÿÆ?ãÿð|Þpðç›ñÿ€?øÿãýþ?ßñþ?ÀÞø9çŽ9ãÇð8Ï`ï€ñ΃ðÿ€?ð{Þ|ãœx}çûÏyàƒŽ8çáÇpÇðÀ'ǘyÿÀ?ðÿÞøçüpç³þqÀ‡žŽ9þ?ãÇ8pÇáÀ8;ƒ€÷߇øxøàÿ<ÿÃüàÿÿ¾?ßùûþ??ÏÀþøã€À> gÀð€>ÿðûÁüðñxÿüð8àøŸ¼pçÀáàüxq¸ÿüàxÀ>|;¿¸áÎ à瀀Àãøx‡ðs¹üÇÿ€>>`ü à|½˜wï€ ãøÿ¿À€ÁÀààãøüÇø™þÿãÿÀ<<üãýÿŸùüÀxþþx?àðÿÎçø{¹À€ãÿðÀããÞ=ßðƒœç<ãÿü?Ïüãüÿ?Ïùþ?àx~x?ðxù÷<;¹à€ñÿøÀáã‡Üxƒþÿ?ðþøyþüç¼xyç»Î{àð<>8{žxpðî¸8çøx?À€^ñãøÀáÇ<8ó›þÿ?à|øþ|çü8ç›ÿqàx<}ðü{†ãžóÿŸ<<8ñÞ8x?ÇþàŸçþü?ôÿÿýã9àùóñþýðÿûþÿçÿß¿¿ÿðÿÞ??çáÿ?ð?ü>><{øx?ƒüàçþü>ðÿïÿ÷Çùàùûðü>üðÿûüÿÇÿÏÿŸ?ßø{ü??Ïáþðø~~ðxð§Ç¿÷Ãðàñà€Ÿßø{ø‡À|ðð~~~àpàxÀø€ðàiaxmodem-1.2.0/lib/spandsp/test-data/itu/fax/generate_dithered_tif.c0000644000175000017500000001267211150047204025010 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * generate_dithered_tif.c - Create a fine checkerboard TIFF file for test purposes. * * Written by Steve Underwood * * Copyright (C) 2006 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2, as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: generate_dithered_tif.c,v 1.2 2008/07/10 13:34:01 steveu Exp $ */ /*! \file */ /* This program generates an A4 sized FAX image of a fine checkerboard. This doesn't compress well, so it results in a rather large file for a single page. This is good for testing the handling of extreme pages. Note that due to a bug in FAX image handling, versions of libtiff up to 3.8.2 fail to handle this complex image properly, if 2-D compression is used. The bug should be fixed in CVS at the time of writing, and so should be fixed in released versions after 3.8.2. This code uses 1-D compression to avoid the issue. */ #if defined(HAVE_CONFIG_H) #include "config.h" #endif #include #include #include #include #include #include #include #include #include #if defined(HAVE_TGMATH_H) #include #endif #if defined(HAVE_MATH_H) #include #endif #include #include "spandsp.h" int main(int argc, char *argv[]) { int image_width; int row; int resunit; int output_compression; int output_t4_options; uint8_t image_buffer[1024]; TIFF *tiff_file; struct tm *tm; time_t now; char buf[133]; float x_resolution; float y_resolution; int x_res; int y_res; int image_length; if ((tiff_file = TIFFOpen("dithered.tif", "w")) == NULL) exit(2); output_compression = COMPRESSION_CCITT_T4; /* Use 1-D compression until a fixed libtiff is the norm. */ //output_t4_options = GROUP3OPT_FILLBITS | GROUP3OPT_2DENCODING; output_t4_options = GROUP3OPT_FILLBITS; x_res = T4_X_RESOLUTION_R8; y_res = T4_Y_RESOLUTION_FINE; image_width = 1728; image_length = 2200; /* Prepare the directory entry fully before writing the image, or libtiff complains */ TIFFSetField(tiff_file, TIFFTAG_COMPRESSION, output_compression); if (output_compression == COMPRESSION_CCITT_T4) { TIFFSetField(tiff_file, TIFFTAG_T4OPTIONS, output_t4_options); TIFFSetField(tiff_file, TIFFTAG_FAXMODE, FAXMODE_CLASSF); } TIFFSetField(tiff_file, TIFFTAG_IMAGEWIDTH, image_width); TIFFSetField(tiff_file, TIFFTAG_BITSPERSAMPLE, 1); TIFFSetField(tiff_file, TIFFTAG_ORIENTATION, ORIENTATION_TOPLEFT); TIFFSetField(tiff_file, TIFFTAG_SAMPLESPERPIXEL, 1); TIFFSetField(tiff_file, TIFFTAG_ROWSPERSTRIP, -1L); TIFFSetField(tiff_file, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG); TIFFSetField(tiff_file, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_MINISWHITE); TIFFSetField(tiff_file, TIFFTAG_FILLORDER, FILLORDER_LSB2MSB); x_resolution = x_res/100.0f; y_resolution = y_res/100.0f; TIFFSetField(tiff_file, TIFFTAG_XRESOLUTION, floorf(x_resolution*2.54f + 0.5f)); TIFFSetField(tiff_file, TIFFTAG_YRESOLUTION, floorf(y_resolution*2.54f + 0.5f)); resunit = RESUNIT_INCH; TIFFSetField(tiff_file, TIFFTAG_RESOLUTIONUNIT, resunit); TIFFSetField(tiff_file, TIFFTAG_SOFTWARE, "spandsp"); if (gethostname(buf, sizeof(buf)) == 0) TIFFSetField(tiff_file, TIFFTAG_HOSTCOMPUTER, buf); TIFFSetField(tiff_file, TIFFTAG_IMAGEDESCRIPTION, "Checkerboard or dithered ones"); TIFFSetField(tiff_file, TIFFTAG_MAKE, "soft-switch.org"); TIFFSetField(tiff_file, TIFFTAG_MODEL, "test data"); time(&now); tm = localtime(&now); sprintf(buf, "%4d/%02d/%02d %02d:%02d:%02d", tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec); TIFFSetField(tiff_file, TIFFTAG_DATETIME, buf); TIFFSetField(tiff_file, TIFFTAG_IMAGELENGTH, image_length); TIFFSetField(tiff_file, TIFFTAG_PAGENUMBER, 0, 1); TIFFSetField(tiff_file, TIFFTAG_CLEANFAXDATA, CLEANFAXDATA_CLEAN); TIFFSetField(tiff_file, TIFFTAG_IMAGEWIDTH, image_width); /* Write the image first.... */ for (row = 0; row < image_length; row++) { if ((row & 1) == 0) memset(image_buffer, 0xAA, image_width/8 + 1); else memset(image_buffer, 0x55, image_width/8 + 1); if (TIFFWriteScanline(tiff_file, image_buffer, row, 0) < 0) { printf("Write error at row %d.\n", row); exit(2); } } /* ....then the directory entry, and libtiff is happy. */ TIFFWriteDirectory(tiff_file); TIFFClose(tiff_file); return 0; } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/test-data/itu/fax/test1.pbm0000644000175000017500000102301311150047204022070 0ustar julienjulienP4 1240 1754 ÿ€ÿ€çøþ<€p€€àAÀÀàÀOð` €ø€| 0>€`¸ppÀà`0à€þÀ`1À ÏñÀ p0À À €` xü á€8 0 x?àá€0 > |ŽÀá€p ~ lÎã`0 à &Î? Çà0À &·†øþÀ`€#?††~øüÀ`€aø€<àpÀ`€8 ø`ÿÀÀà€ð ü€Àžp€à€Àø0€€€Àð0<Ž€€ÁÀ0<¿€€Ã€0|ñÁ€€Ã€`xàÁ€€gàxàÁ€gÀøÁÁ€v€øÁÁ€8ð€|ðÀðàÿ€à€à ÀàÀÀ°p ƒ`8àà<<Æ8pÀÃì <00 âŒ08 |    `'€xð`0 Œcàþ€ðÿÀ`80 Œ8óÿÿÿÿø€ÀüÀ00„0ÿðÿ€ø€€€ 0À† Ÿ€ÿÿÿÿ€ÀÁþÿø€`ø0Àà†€Àÿ€Àøÿøÿÿûp`ü |À 0Œ €Àÿÿÿÿÿÿÿÿÿà0€À0?x€þ0Œ €Àÿÿÿÿÿÿÿt0A€0°øþ ˜ €À`0A ð?ÿàÿüa¸€À€ c ð€ÿÿúŸø Ë €À€ à °€'ÿÿÿ Ž ±€@€€`ÃЀ á€@þÀ€`À€ ø€`þÀÀ€`À ð€`ƒÀÀÀÀ`€ €`€8À€  <À`€ €`øÀpÀÀ 0xÀ`À €`øðÁ€@À€800Àø`€ € àøƒ€ÀÀÀ000Ãü`€ € 8€À€À `1þ`€ €0ð €À0 À0 @1‡`€ €0À0 €`pÀ0ÀŒ`€ €0€0 xÿð€@0ØÀ €`€ €0?€à~ €àÀ Ãx0À` `€ €0?ðxs€ÿ €`0ìaÇ€À`  `€ €0 € ú€ü @€üŒÁÿÀ1 @@   `0 ?À €ÿÀ€Ì~BÀÌ 1›€a€@À€œ`0ð`?À€ À€ø0&`€ÃŽ `‡`À@ø`0 À`€Àð`,`€ƒ<@2Î`Ãø <ð` €à <€ xá,0`p€†pÀ6\@ø dp`À<x€ Â880@ð€‡à€f8`00 f``€€ 8pà€ 8‚xp Á„‡ðn8`0 Âð@€ðàüÀ?€€€!oà!ÃðäÀx `0 !Ãð@€þÀ€ø€€!€ Ï`#‚ Çðx`0`0 a@€p~€À8À€@'ƒ`9‡ðh```0`Á`€|Àt@>à ƒðLàÀ`08áÀÃ`€x?€ü0<à'ðLç€`0Á€~ `€>ðð0ø<l ñ€Àp0ƒ€ `€€€ð8ããøp0ü`À 8€ ;À00ø`À 000 `À `00`À `À `Àþ`Àÿÿðþ`ÀÀÿàÿÿÿÿ`Àÿÿÿ€?ÿÿø`Àà?ÿàÀà```0`0`~0`Àð0``€À0`€ €0àÀð8?€?€8`€  €`ÿp?à?ÀpÀ`€ 8`0 Àl`@ÀÀx`€ p@@`À€ÀÀ€À8`€ à@@`€€€€<`€ À@À€€€ð`€ €@€ ü`€ €ð ÀÀx`À p ðà?€8Àÿ€`À  À08x€ø€`ð`À  ø0 €2ЀÀ€`À àp€€€àc?ø€€ `À À0 `À€€ÁÀ0þ€ `À à`€ `|ÀÀ€€|@€`À  À`  € `þ€ÀÀ€€€€`À €à € 8`‡€€À€€ €€€`àÀ8 € 8 ƒ€À€ø€€``p p0€À ¼€À`` þAÀ < à`>À |€À``p€ ðàðüxÀð€``€0àÁðð àƒÀÀ0 €``€x pðÀÜÿ€üùü `` €ð?àÿðøþøà@`` €ÀÀüÀx€``€à9``€€`€``€àÀ`p€ÀÀ`p€€@pp€€@pø0€€Àïð€0€€€7þ€þ<€€0p?ø€0ð€Ž00€ø00€@00€00€000000000000 0000000000000p0p8p8ppppppppppppp p p p p ` ` ` ` ` à à à  À LÀ ÌÀ LÀ @À @À @À `À @À `À @À`À`À`ÀÀÀ@À@À@À@À@À@À@À@À@À@À@À@À @À @À@À@ÀÀ€ €€ÀÀ ÿÿ€œP€§€À À#ø€,Àƒ8ÀÀÿøÀ€†À`ÿÿÿÿÿÿÿÀ€†ÿþ`ÿÿÿÿÿõ€„?à¿ÿÿÿÿÿÿþ`Œéÿ÷üþÀÀÿŒÀ €ðˆð22 âÆÄ‚X@ €€à`€pÀ`0€`` <À a€8€ÀÀ0 ÀÀÀp0`ÀÀàp`  ÀÀ ŒÀ`pÀ€ ØÀ`p€€øÀ`p8€ÿ€ÿø 0ð€Àp00ƒçÿ€ pø€Àp00 àü€Àp0 0 ÀÀô0ÿ0 Àþ0ü08€ÁÞ0800ð€Ç¼00008€€<pÀ80þ8€~<àðx?þ0ÀÀðð€pÀ8€`àp`8à€p08À`8€à ÀàüÀÀÀÀ€€€à0p00``à `À08 `À00 `€p08```00` `Àà00`à `ÀÀ 00`À 8`À À``0 àÀ 0`Áp>À```8ÀÀ 0`€Âp?€à``pÀÀ0À8Âc€€À`à`À€À`À0Æ`à€Ààà`ÀÀ€8à`ÀpƒÄ``€€à`@8?Àà8~€xxp`À`ÃÄ`0€à8àÀ8ÿÀ`xvÀppàÀ€ÀÆÄ`0€ÀpÀÀpÀsøîÀàaÀÀÀNÄ `0€À`ÀÀpØNóà€ÿÀ€mÌ À0€€ÀÁÀ€ðÿ€€ÿÀÀ€9Ì À0€ÀÁÀð8ž€ àÀ€ŒÀ0€ÀÀ°0À À†À0ÀÁÀÿ€ƒ° pÀ À †À`ÀÃÀ€Ï0w` @†8ÁààãÀ€~``8ƒpÇÀp瀀8à0pàÏ0~0ÀàÀþ8<€0€8Àü€ÿ0pø0€0Àp@Àà@ 0  À8ð À0€ €p à <À8€ ø€8€ð€À0€À@À0€€ÀÀ0€88€ À`0À00À €`0À00`€p:À000€pÿÀ00€püÀ0p€`ð€0`€€àp€0àÀ€ €Ç€?€p€à@€0Ï€þ`€ÿÿÀÀ0Ÿ€þÿÿÀà0ƒ›€€p 0Ç € 0~ 80àpüp ðpÀ`à< xððàÀ`àÀ€€Ààp0<8Ààxþ8À‡0 @€p€ @Àp@À `†À`ÀÀÀ `ŒÀ`ÀÀÀ `Ìàà€ÀÀ`Øàà€ÀÀ`Øà`€ÀÀ€`˜à`€ÀÀ`˜à`€ÀÀð`Àp€ÀÏÿð `À0€8™€~ÿÿð@À0€8›€@ À0€x @ðÀƒÀx ÁÀ€ƒÀŽ ÇÇ€ †lü ^ÿÌ<p|xp€0À?8ð800p`àÀà€€ÀÀ€€€€@ 0x€0 8€ÀÀ0€à`00€ð00` €p00`€€00 `€€00` 0 0x`8 `pð`ÿ0 `sÀ ÿÿðp ` ðp `x0` `00à 000À 000À00Àú800€ðø0€€0€0 €€€~?Æ€ ÿà ` ``@`p`øƒÀ †?ÿàÀŽ!þ ÀŒÿÿ€pÀ˜ÿÿø`€`€ 0À¾ `À€ÿøàÀÀÿ€ À€àè€à8ü€€Àð €€ 8À€p 0À€€`ÿ€€€À 0€À@ €  ` ÀÀ€ 0` à`À @€ p0€ð À``€ €À<€À€0ø¸ €p`€ü€€€À?üÀÁÀ0à à €p`ÆÀ€€0À|ÀÀøƒÀ00x 8p`€À€|Àà€ÀÿÿøàÃÀ06L 00@À€æ@Â0pw€80BÀÀÿÿøÀÃÀ8f0L `0@8À€?ÆaðÇpøÀ~À80bÀÀÀæÀ8æ0| à0À8p àpÀ€ÛÀ#øÇpìàä`00cÀÀÿàÀ.À0Æ0ø À p8À>à€ 0 `ÀüqÀ3Í`ÆàÀ0øüpc€ÀÁÀ80à€ þ0À'ÀÂÀ 0ü @€q€7Ùƒ`ÃÀÀ0ÿà`aàÀÿÀ8 À€ ð0 À€p` x `€a€6yà ÃÀÀ0þpÀcÀ€À88`Àà `0À€À ` H8`À`€Ä>aà ÃÀ@0`àÀcÀ8€À `À  p `0@€ÀpÌàð @€|>à8ƒÀ@pà€€cÀ0€À8 À  8`0`ÁÀp„À€@<ƒ``ÀcÀ0€À8€@`08`Á€Ü80àÀÀ0€À0ü àp`G€€à€Àþ!€0€&À0`à`0>A€€pÀü€0ÿæ@0`àCÀpÀ€€p?â0À`€ü`À€`0@€`ð€€`0`À`€p 0€>€<|ðàÀ00þ0?€Æ0qÀÿð`ÀÿÀC€8`€0 `à @08À0@À< à@À?ð À@€@0€ãð €ÿ€€@0€ÿÀ ò€€ `0€àÿ !€À € `€€@ Àÿ0€À € `0à€@xÀøÿ€ppq€Ø€À €`0€€ü>@àÀðØ0pà€„À€€'> €`0€þ~`€€ˆppÀ€à€€?À |ð@`0<€À‡f`ˆÐp€À0 €€<8ö ~ÿ@`0€ðƒ€ÀŽÌ`?ð ð €€À0€p€<ì`c ÿ@`0ÀàƒƒàøØ` ?ð 0À@ À†`€xØpÃŒ€ø``ø 0 àøƒƒpàð0ƒà@@ ÀøàÁ°xð€|Ç€0ü a‡ø<8 À?€ƒÁ€ÀÀ0Ž 0`ðÀÁüxà8Àv΀ø€àü aŒ?€ø€€ÀƒÁ ÀÀpàÀ0üà00à€ÁÁìx€p@s€€àÁÁÿð0c†0ãÀ€`ƒü†`Àp0?ð ÀÀ À€ƒáÆxÀà`a€€€pÀÁ€ `0s‚ àÿ†`ƒìþ>`@0ÿ€à@€€‡eÆØaÀ`က†€?€ÀÀ`0? 0>Ãàþ ~8ÿÿÿÿÿÿø€Þ=€Ø? À`àÀÀ†À€Àð0`ð üÀø€ ÿÿÿÿÿÿÿø xx€`àÀÃÀÀ< À  ?ƒüÿà}€ppÀ@o‚@ ÿüp<À| ø€ <àppðÿÿÿõÀÀàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÀàÿÿÿÿÿÿÿÿÿÿþùÿÿÿÿÿðÀàðÿüÿÿÿà0€àþüàŸÀÏ€þÀÿÿÿüð?üÀÃÀüÿÿÿÿÿÿÿÿßÿÿàÇÀð?‡€à€à|àðÀáÀÏ€ÿø` ` €88`ð Àÿ€€<€8@0 Àp€À`€€ÀÀ À~€À`À`8€`0€08€0 €?À0À@pÀðÀ08`@ü €€þø0@@ð0 €<€€àða€@à<`<à<cÀ€a€@àpÀ$>0<À`€A€cà à€0|€`À8 @À?` À0`ø`ðp` @Àÿ` `à`ðà` AÀÿ€` `À €Àà€€à cÀ` ÀÀ 8ÁÀÀÿÿÿÿÿ€ >À` à€0c€à<€ÿÿÿÿÿÿÀ Àð60ÿð€07?ÿ8ÿ€@ÿ€ Àà€4Œÿð0ÿp ÿ€ÿ€ À€à€ì€€0Üp À€`€ x`>Æà À à€`€8 `sÀÀ àà€`€0< `áÀÀ€0 pÀ€0@08> `Á€Àƒð `À€0Ààp0g€`€€àÿà àÀÀÀà`àã€À8`€ð| À˜À€À€àÀÀÁÀ À8`€ð€Ø8À€ÀÀÀ€€àpp`€ðøq€€ÀÀ ?à`0€8ဠ€€€`¿09ÀÁ€€pð 1ÀÁ€  gÀÀ8 €Ã8 Cxfðfà6€ @€<€<€€@<€ÀÀðø>€à€Àüþ€ƒ@8ÀÀ„ã~ø‚ƒ`0`@€<þð€ƒ 0`bÿ?@€ ~Ãá€3ð~ÿü?€ ÀÀ á€`?€?ðÿ€> ?€À8@`€€€ð|€~0gÿ€0Àx`FÀÀ€øl`€ Àh gÀ8À€àb`à ÀŽÌ 70€Àà@`9ð=€ýÿþÀœ 0?pÀÀ@`À8søø0Àÿ Àø 0þ`À€`À8þ8üàÀÀp 0À`?€ ÃàððÀÀÀð 0àÀ=À ÿÿ€àÿ€`ðp8À€ð 07À `ÿÿà€€8`000À€È 0gÁ€ 8ÀÀpÀpp À?€Œ pFÁ€ 0Àÿà`Ð`` À?€ àÎC€ `À ÿààø`ྠ€?€€À`ÀÀ? þÀø`ð?ÿÀp€€À`?àÀ? üàpÀðà˜8€ÿÀðÀ?  áüàþÀðÀ €€g<`p0ááÌ`¯À€À8 €ÿLð€9€À`ñÁ ÀÀà p  üþx€°€9Ààá 1ÀàÀàà üpà4„9À`ñŒ1ÀpÀ?À 0`>Æ9àpøÌqþ8üà?ÿ8 ü>Æyð0üÏðøpü@<þ?Àð2ƒðð0ÍÇàpPàð0Ç€`üÀÈ0ààøžF0àÀpð`Ààð˜  þà>ÿð€>ã0Àvà 0€Ãð€þ‚ €Ãp€7ðþ`€Ã8€pàü ÀàÀðð0  ü€ðà àð0@ €à ÃþÀ€00€ 0ÀÀ€Ãæ€p0@€0`p€ÀC<`0`?ÿÿ€0ü0ÿÿÀ`€xÀ `?ÿàPÿÿð€0ð?ÿÿÀð€<üà€`À‡ÿÿüÀ`ÀÿàðüÀþ`ÀÀÀ€à€ÿðà÷€ÀÀÀ€0_øÀ¿€ð€0`€€ À>8€0`øÀ À€ð`€øà 0€€à àx €ƒÿ€0ø 0þ0?þø0Àþà0àptøð8@?à?À  {€À€ÀÀÀÀ€0€ 0øà 0Þð0ž>080°¸60 aÀ€0Ààø €ð0qÀ€0€øþ?€ €ð0{À8€0€<çxø?€ð`À00€>ƒ€àÿÿà>_/˜`€ðp0€8þ|€€+ÿÿÿ€à`€?ø`0€pÿüà € û``À?ð` €àðÀ€   `Àw à`ƒ€ÀÀ `ÀgÀ`‡ÀÀœþ`ÀÇÀ`ŽÀÀøÏ0ü0ÀÆ€`þÀ€ðÎp8À€€à`þ?€`ð|pÀ€ð`Îüxø<`ÿ€ð`Ç€@üØx`<þ8 Ãàp˜ÿÀp80Àüp˜þ0ð0À?ÀàØàð@À`ðÿàÀ@@pÿ€< €Àà    0 Œ0 ÜpÀ  ø` øÿ€ ðà0>>þ@ðÀ0~ÿþü ÿüÀ€àÀÀà1ðÿà  Œ @ÿÿ€ÀÀø?€ øÀþ`  8Àÿÿÿÿ€ < œ0Ï>f?À þÀÿƒ8 8  €þÿÀàà ÷Àð8 80ð ÀÆøà?ø9þcx€ 8ÀÀ À À€  0þ > <À€ð`€?1€ŒÀ 0ðÀ ƒ þ@À€ ð  0@æ fÀ€à0À<cŸð„ `ðÀ ƒÿÀ€ÀÀ 0ƒÀ€à0À8€?fÿ F8À †ðÀü@3À 0 .€ÀÀ`À`À&~ð0G€À ü<< À€þ€€` üsÀ`Àæ<à0ÇÀÀð8 Á€OÀpÀ‡Àð8ð?€àÀ†?À 0fð€Àð8'ÿÀÀÀÁàžÃððÀÀÀü00><€@| 1ãÐ|ÀÀ€pþ¸8 ?€@` ÿ€@ð?ð€ùÀn0Ž>àü@ þÀà €0øÀ `ð0€ 0þp þp0€þ 0 à3à0?ðà€ @ 0€`€@` €€ÀÀ@8`ßÿÀ¿ÿÿÿÿ€€ `€ÿÿÿÿàÿÿÿÿÿÿ€ `€€ÿÿÿÿð€À`{€ÿ€p€À0@€à@``0€à@€€pÀ€``00€8pÀ€8À€` 00À08`€ÀÀ` p8Àpð0€ ÀÀp `8À` ø0€ ÀÀp0`À`ø€ ÀÀ00`€`ü€ Àà00@€àü € À`00À€à€ü € À`0pÀ€À€ø€€À`0p@€ÀÀð9€€À`0p@€ÀÀ€9€€À`0``€ÀàÀ1€€À`0``€À``1€€À`0`08€ÿÿð8q€€À`0`08`€ÿÿðက@`0`x@ÿ0က`à0`ð@€À8Á€€€`À`Àà`€À{àÀÀ€ À`ÿÿÀpÀð Àà0À`þ0À ðÀp€8À 8|ðÀ€8Àà À€ À?À `üÀ@`þ€ ð@€püø|@€€0øþ€8àþÀ€€pÀ@ €€0xÀ~oþ€0øsáÀ aøÀ`þ€ð`pHž€ü€€80 8À€p€¸àÀÀ<9`@€x `À@@Àp€pà >‡€à€ 0€@@áà O€üÿü¸€€@`~?€< ‡80üïüü~0@`0â>x x„þ@À€~øø @À>Oà h `¿ àà ÿ ÀÀ;€ `p=À7ð `æ€xp0062 ÁÀÀlp<þ~€6À  pÀÿpðÀ@ÀÆp?À?€ÿÃþl€6€ xÀ£ `øü À@ÀÆp8cÀ€Àø€ €$ø üÀàÈ0 6ÀÀÀÆp0`ààÀ€€ à`äà1˜€3Á€ÀÃp``0°@€<Âà¸üÀ3ÃÁƒpÀ @80`À? 0 aÆÁƒqÀ @`ÀÀ?€À aÌÁƒÀ À `PpÀ9Àÿèð8aÁðÁƒp À`üÀ0àÿø>ø8ÀÁðÁƒ€p À `@€ÀÿŸ00€ x0ÀÁðÀ` À `àà€ÁÁ€@?xÿà08À à00ÀÁœÃÀ` ÀŒ`püÃÁ€ø@!ÿ€ì0àÀ0€1ÿÁŽÃÿÀ` ÀŒààp† ÌÁ€‡€@|'ÁÀÆ À0 8pÀ €1ÀÁƒÃÀà À¾à8ƒ0x€œ`ø/`‚€ ð` 80€ ÀÿÀq€aƒ€ÃÀà8 @þÀð˜0!€¸`€Ü|0=‡€ €<` 08¸ @ýãa€ÃÀ`0 `XŽÀÀÿ€Ð8À€ð`Àžx0ðÀþÀ€<à8~¿ÿ€ 0@øós€ÀCÀ`p üÀüp|@p``³p0ÀÀx`€Àø?þŸÀ ̇`ós€àÀ` oÀ<ÀðxÇ``0áØ``ÀÀ0€€€Ãð?Ž€0@pn`ó1€`àà `pÀoƒÀ `p€àxàÀÿ€8 À0@<0o<`p`àxÀ `àÀ0þ@ `à ?Àüð<0?8 `ÀØ0À€Àð À,ã€@>p }‚0 `†0àÀ ƒ€Àá‚ÿ†p0ù‚~`` ` 0€ø~‚<=‚`03™|@Àð€ f‚ä  `@`0?¸B|ÀðÀ󀂠  0`ü @000  `àÀà ðpàÀðð0 àð`Ø0 8€ð@ü˜àÀð@† ð<`ð@ Øpð`` È`ðÿ€ `20ÀøÌœ`ðÿ€ b0?àþp†ÿð`ð €sÿ€ð?ø † `ð€ÿÁ€€ÿü† `ð@€ð€ À>pƒ `à` 0€ À3`ƒ `à Ÿ0€ À3`ÿÿø0ƒ `ÿ€ €€ƒ»<0€ àq€`ÿÀ`€ ÿàø ÁÀæ³f0€àa€€p`ƒ€ þ0<À€`þãâ  0€@`€ÀàÀ€þÀ8ý€ àp ÀÀàã ð0€@ Àxø ÀàÀ€àÀ8ÀÀ `àÀ°€ÃÃûø0€` Àü‡þ ƒàà€cøÀðÀ 0x 9ÀÃᜀ  àÁ@ ÿà€` ðàÀ 0@ ppƒ@€ˆ0 0€àœ À`€0 À@ðà€ÃøÐ?€08ðø |p€8| €`ððÀ}àðñ€0<ƒ¸ð ø0€?ÿ€  øøà€À0?þà à0ÿ€ |`À0càxÀÀ00`à€€0À   øøÀ€ü~0Àð0ðÀÀÀ€08@€€Àx @@?ÀÀØ `€@ü`À˜ `d€@à À˜ÀÀ`þÀ@à ÿÀÀ ÿÿàÀ0@`à ñÀü€ÿð`À8@G €?ü?Àöÿ``À"@Çà`€À3€€âÀð``8ð€@À ÀÆà`À0 € á üà`ð0ÿ€€@ÀÀ@@À00Çàÿÿ`@0 € ÁŽÀ`Äû€@Àøðà` À0Gÿ``0ÀÁ‚0?ÀÀ`†€€@ÀŒà8À ` `0ù€€ƒpÿ€€À`ༀ €Aàl  `€À`àG` 00á€8€ƒà€€À`€À´€ <€Aàx €ÿÀcðÀÀ`àÇ`00ƒ€0ƒ€ÀÀ`€ pä1€@8 t€C`ð @ƒøàoø;àÀ` àÂÀ9€À`ƒ€ÀÀ`„À |æ`€@pâ€F`Àà €Ç``ÿ3`0À`Àƒ?À?àðà Á‡€À Œ0oüÂà€?Àƒ€< ðà€Ä `üs`p`Àà€aãÀ3<~øà c€çÀ 8@@À€„@ €À€8È`àðc`ðÀÀÀ`aùÀ<1üøøø`7ü>@à€Ã€€ø0pÀAÀàC`˜À€ÀÀ2±œÀx`|àø`ÿ€ € à` ÀG€C@ ÀÀÀÀ€Àð`€ðàÀÀ@~Ã@àÀàÀÀ ƒÀÀ€ààÀ@@8Ã@ÀAüÀÀ  ‡€@€øà€p`Æt@@ü„ ‡þ@@€F@ÿ€„ÄÀð€F`kÀ Dà€f Ø€ €f ØÀˆ€~ ˆ0È<€† þÿÀ< à`€> x`À€À?À€ppÀ03ဠ€€~ð p€à ÀÀÿ€?þAÂÿ'ƒã€Ç€ÀÇ€?ÀÆ€üCðcà<0pÀ}À0?Ÿ€àÀ@ p 8  ü8  À0€0&0 ``Àü0&00`Àÿ0&ø00pÀ`€@fÿ€0 àÀ`0À8@L80€ÀÀ``À<@L0À€€€```<À 0 ÀÀ€€<``à<ÀÀœ0Àà<€€6pÀ?àÀ`à€À˜0À €Àxðb0Àñà0€0 gðÁxðpà €ÀðøÂ0ÀÀà0€p0ø  ðÿ°à8`à00@€À€ÄÃ0Á€ð€0€p1€Ø/À `7˜?ü0à@0€?à`08ð °@ü€€Ç‚ÿðpÃðÿ€0€8s€˜à @>gø0À`pàw€à8à08<70 0øðøÿÿþÀÃÿðpÃðþ0à 3 ø0@|cà Àà pðCÀÀ;Àpp~~ ø p0àø ÿüÀ‡`ÃpÀÿ„ƒð&0ð`pcÀÀ `(ÁÀ?€pðo| aÞ0x` Âã `‡`Ã00ƒ8,8 ð @pg€3ƒ˜€@`ÁÀ>1àÿðÃ0xÀ`À†€ € ‡àÁ8€80ƒ€ à;€à8~2fü€ ÀÁ€8?ÀqàÎøÃ`€€màä0†ÀÁø€|0 À @€>8vãþ€€À€˜ÌÃ`8 uÀ}pp>†€ÀÀðÀ|€0 0€€<0dÀƒÀ†€àð„ß`8 ð Àxð†€ÀÀ8À|ÿÀ 0€8`€àø 0@ù€à¸0Áðø€€Àp€~ð `0@Ø€`0à?0ÃÀ øÀpà€&8À0À€qð<€`ÁÃÀøÀ8Àðp0Àc0xÀeƒ€ð@€À €b `ÿ€pøP xx x<p80000pàÀ€``à0À€ €0àà àp Ààð€ àà`€0Ààp €``Àà\€À°àp0À< à€Àà€~€<@°ÀØ0`€48 àÀà€øGÀì`ðÀÌ0`€28 àcÀà€€8 LaÆ`àÀÌ0À€"xà3ÃþÀ>€|p0xc„`àÀÆ0À!øüà3á€8À€vÀ0àx3 `àÀ†1€ LŒþÀsàpÀ €c€€06p2 `ÀÀƒ3€ O̶Àãpp€€€c‡Àq€0fáp0`ÀÿÁã;`πĀ Ãp`€à€A†`€ 0n!p0`Àÿÿ?`ÅÀÄ€ †8àð€ÀÎ0À 0€Î0à0?ÿþ`€àƒ¿`Àì`€ Àð€ÀÌ0À 0ÀÎ0à0ÿþ`€`¹€`€~` <Àð€ÀüÀ @Ž00à0`À0¸À`€o`?þ püÀðð€ÀøÀ `Ž00à0`€8p`ï€`?þ à üÀàÀ€ÀØÀ 0 ``À àÃ8`ìÀ`6À À@ÿà€ÁØ€ü 00``À`à`Ä`à  À¹ü€À N00`ÀÀ`<À0„0À ü €Áƒ°€8`ÀÀ`xÀ€0„À ÀðÁƒ0€ 8a€€`pÀà€ ÀðƒÀ  a€@`€àüÀ0àð†€€€€ 8#ÿ€Àøà0}ðŽÀ€ ø€ ðœÀ €p¸@ 0ðpÀ>p<pÀ|pÀx`À8ààà?À?0àü€|`p üþ€À`øÿÿÏ€`œ†À€Çü€À?ÎÀÀ€x €Àp Àà €0 €€ `À8p€p€ 0p8À88€`à000€0€` ,p8`€0€€à€€0|àÀ€0 ÀÀÀ ?ÿÀÀ€0ÀÀ8 @ æÀà€€p0ÀÀ0 `àà€€p8xàüp 80°à`pàÿü~ ø``à{þàap€  aÀÈp€0À0 c€À0€0`0 8 `o€à 0 ð à~ÿø0 ƒÀ  àxðÿ0ÿ àpü0|† @ü˜ppðÀ €à€ÀÀ`08 pppààÀxÀðÿÀpïÀ8þÀøxøàÀø€üø?< À€€ÿÿø àÀx<x€€€üÀð ñà Àà|ààpÿ€þ€€ÿÿþ‚@`€ € ÀŒ€ððp@à€ÿÿþ †`À0€ü€øà`€€€3€ÿð Æ €08À8ÿƒ€<Üàà€À€3 €ü Ä0€0<À?À<ü€ÎáÀà€#  Ä0€`6Àpà6pøÆãÀà€c€  Ì€`À``2 pðÆç à€a€  Ì€@9†À``3p‡þ €a€ €ˆ€l0†à``1`8Ãø a€€ˆ€ü|Îà``1†`÷8ÿ€øà Á€þ€0 øl```0†`Çqàÿ€øà€ ÁÀü€0ø€<```pÆ`wÀ €üà ÁÀ€À0€``àpÆ` €€ìà ßÀ€à`< € ``àpF` >ü€ÎÀ<€À€``ð €ô ``à`np ø€ÇÀÀð€à€0àÀ ü ` À`lp €Ã€à@€€` ÿàÀ `1Àà<0 €AÀðpú€`€ÀÀð0€€@@ððÀ @Àp0À€p ÀÀpÀ`ààÀÀÀ€?Àiaxmodem-1.2.0/lib/spandsp/test-data/local/0000755000175000017500000000000011150047617020053 5ustar julienjulieniaxmodem-1.2.0/lib/spandsp/test-data/local/Makefile.am0000644000175000017500000000177011150047204022104 0ustar julienjulien## ## SpanDSP - a series of DSP components for telephony ## ## Makefile.am - Process this file with automake to produce Makefile.in ## ## This program is free software; you can redistribute it and/or modify ## it under the terms of the GNU Lesser General Public License version 2.1, ## as published by the Free Software Foundation. ## ## This program is distributed in the hope that it will be useful, ## but WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ## GNU Lesser General Public License for more details. ## ## You should have received a copy of the GNU Lesser General Public ## License along with this program; if not, write to the Free Software ## Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ## ## $Id: Makefile.am,v 1.1 2008/05/03 07:30:19 steveu Exp $ SUBDIRS = DIST_SUBDIRS = EXTRA_DIST = dam9_lpc55.wav \ dam9.wav \ short_nb_voice.wav \ short_wb_voice.wav all: clean: iaxmodem-1.2.0/lib/spandsp/test-data/local/short_wb_voice.wav0000644000175000017500000030102611150047204023600 0ustar julienjulienRIFF‚WAVEfmt €>}dataê£ÿ£ÿ¥ÿ§ÿ¨ÿ¨ÿ§ÿ¨ÿ§ÿ§ÿ¢ÿœÿ™ÿ—ÿ˜ÿ”ÿ’ÿÿÿ“ÿÿÿŒÿ‰ÿŠÿŒÿŒÿÿÿŽÿÿ‹ÿŒÿŒÿŽÿ’ÿ•ÿ–ÿ“ÿ“ÿ’ÿÿŒÿ‹ÿ‰ÿŠÿ‹ÿ‹ÿÿ’ÿ’ÿ’ÿ“ÿ–ÿ™ÿ•ÿ”ÿ‘ÿŒÿ‹ÿŠÿÿ“ÿ‘ÿ‘ÿÿÿÿÿŒÿŒÿ‹ÿ‡ÿˆÿˆÿ‡ÿ‡ÿ‰ÿˆÿ„ÿ‚ÿ„ÿ‚ÿ}ÿ€ÿ€ÿ|ÿwÿuÿtÿtÿlÿeÿeÿfÿgÿhÿiÿkÿkÿkÿmÿmÿjÿjÿkÿiÿgÿdÿdÿgÿjÿkÿiÿhÿgÿeÿbÿaÿbÿeÿfÿjÿnÿjÿeÿ`ÿdÿeÿeÿfÿeÿeÿ_ÿ^ÿ\ÿ^ÿ_ÿ^ÿaÿaÿaÿdÿhÿgÿfÿeÿfÿcÿ_ÿ`ÿbÿ_ÿ^ÿ]ÿ^ÿ_ÿ_ÿaÿ`ÿbÿaÿbÿbÿaÿbÿhÿiÿhÿnÿpÿqÿpÿrÿrÿtÿtÿvÿyÿrÿoÿoÿvÿyÿwÿwÿyÿwÿqÿsÿvÿpÿiÿhÿkÿmÿlÿoÿpÿlÿmÿpÿlÿiÿiÿgÿiÿoÿoÿqÿoÿtÿyÿ{ÿ|ÿˆÿÿ‚ÿ€ÿÿ„ÿˆÿŠÿÿ”ÿ—ÿ‘ÿ“ÿšÿ™ÿ–ÿ˜ÿšÿ˜ÿ•ÿ•ÿšÿœÿœÿ™ÿ˜ÿ™ÿ•ÿ‘ÿÿ•ÿ—ÿ—ÿ—ÿ‘ÿÿ‘ÿÿ‹ÿ‰ÿ‹ÿ‘ÿ—ÿ›ÿ˜ÿ—ÿ–ÿ˜ÿ—ÿ’ÿŽÿ’ÿ–ÿšÿœÿ•ÿ”ÿ”ÿ”ÿ•ÿ”ÿ•ÿ”ÿ–ÿ™ÿ ÿ£ÿžÿœÿžÿ¡ÿ¢ÿ¢ÿžÿ™ÿ”ÿ“ÿ’ÿ‘ÿ‘ÿ’ÿ‘ÿŽÿŽÿŒÿŠÿˆÿˆÿ‰ÿ†ÿ‡ÿŠÿŒÿ‹ÿ‡ÿ†ÿ‡ÿ‡ÿˆÿ†ÿ„ÿˆÿˆÿÿŒÿŠÿ‹ÿŒÿÿŠÿ†ÿ…ÿ†ÿ‡ÿˆÿŠÿÿ•ÿ’ÿÿŒÿŒÿŒÿˆÿŠÿŒÿÿˆÿ‰ÿÿ‘ÿÿ‰ÿ‰ÿ‰ÿ‚ÿ}ÿxÿwÿxÿzÿyÿuÿqÿlÿjÿgÿcÿaÿ^ÿ^ÿ[ÿVÿVÿYÿYÿVÿRÿSÿWÿVÿTÿRÿSÿTÿNÿMÿMÿJÿKÿFÿ@ÿAÿCÿJÿUÿYÿ\ÿ`ÿgÿjÿfÿgÿdÿ^ÿ`ÿeÿhÿjÿlÿoÿqÿqÿnÿgÿbÿbÿeÿcÿ\ÿZÿ\ÿ_ÿaÿaÿbÿ`ÿ^ÿ_ÿZÿXÿVÿSÿRÿQÿRÿVÿ\ÿ_ÿaÿ^ÿZÿ_ÿaÿ^ÿ_ÿaÿcÿcÿcÿdÿfÿeÿfÿrÿvÿqÿqÿqÿrÿsÿtÿwÿxÿwÿrÿpÿrÿuÿyÿ|ÿ|ÿ}ÿ€ÿ~ÿ|ÿ}ÿÿ‚ÿ…ÿ„ÿ†ÿŠÿÿ“ÿ•ÿÿ‰ÿŠÿ‰ÿ‚ÿ{ÿ{ÿ{ÿÿ~ÿyÿzÿ}ÿ|ÿ{ÿ}ÿ}ÿ{ÿ~ÿ€ÿ|ÿxÿuÿuÿzÿÿ…ÿ‰ÿ‰ÿŠÿŒÿÿÿ‹ÿ†ÿ…ÿˆÿ‹ÿŒÿÿ‘ÿ“ÿ™ÿ›ÿÿÿžÿ¤ÿ§ÿ¦ÿ¡ÿ¤ÿ§ÿ§ÿ¦ÿ©ÿ±ÿ¯ÿ­ÿ°ÿ¬ÿªÿ¬ÿ­ÿ¬ÿ¬ÿªÿ¨ÿ¦ÿ¡ÿ¥ÿ¥ÿ¡ÿšÿžÿ¤ÿ¥ÿ¢ÿÿŸÿžÿ–ÿÿÿ”ÿ–ÿ•ÿ“ÿ“ÿ•ÿ—ÿ•ÿ”ÿ“ÿÿÿÿÿŠÿŠÿŒÿÿ“ÿ”ÿ–ÿ–ÿ“ÿÿ‰ÿ‡ÿ‡ÿ‡ÿ†ÿ‰ÿˆÿ‡ÿŠÿŒÿ‰ÿ†ÿ€ÿ~ÿƒÿ„ÿÿxÿwÿzÿyÿvÿxÿ{ÿ{ÿzÿzÿxÿyÿzÿxÿqÿrÿvÿ{ÿzÿwÿyÿyÿvÿpÿnÿqÿvÿuÿrÿlÿnÿpÿoÿpÿpÿuÿuÿuÿrÿmÿkÿhÿdÿ^ÿ^ÿaÿ^ÿ_ÿ]ÿ^ÿeÿdÿbÿ`ÿ`ÿeÿbÿaÿeÿgÿeÿdÿbÿbÿcÿjÿrÿpÿpÿpÿsÿoÿjÿhÿfÿiÿeÿkÿmÿlÿmÿkÿgÿ`ÿbÿaÿ_ÿZÿUÿVÿUÿYÿ\ÿ^ÿ_ÿaÿaÿ]ÿaÿ`ÿcÿeÿgÿjÿfÿhÿmÿpÿpÿoÿuÿyÿzÿ~ÿ~ÿ}ÿ‚ÿ‡ÿ…ÿ‚ÿƒÿ†ÿ‡ÿŠÿŠÿŠÿŒÿŒÿ‰ÿ…ÿ†ÿŠÿ‹ÿ‹ÿ‹ÿŠÿŠÿŽÿÿÿÿ’ÿÿ‹ÿ‹ÿˆÿ‰ÿÿ’ÿ”ÿ”ÿ’ÿÿÿ’ÿ•ÿ—ÿ–ÿ—ÿ–ÿ”ÿ—ÿ˜ÿ™ÿšÿšÿÿ¡ÿ£ÿŸÿ›ÿšÿ—ÿ•ÿ’ÿŽÿŒÿ†ÿ…ÿƒÿ‚ÿ„ÿ…ÿÿ—ÿ—ÿ•ÿ˜ÿ–ÿ•ÿ–ÿ”ÿ•ÿ—ÿ›ÿžÿŸÿ ÿŸÿ¡ÿ¡ÿÿ›ÿ›ÿžÿÿŸÿÿ›ÿŸÿ¤ÿ¢ÿ¢ÿ£ÿ¥ÿ§ÿ©ÿ§ÿ£ÿ¢ÿ£ÿ¤ÿŸÿšÿ—ÿ—ÿ•ÿ•ÿ–ÿ•ÿ–ÿ–ÿ”ÿ“ÿ’ÿ‘ÿÿÿÿ’ÿ“ÿŽÿÿ“ÿ‘ÿÿÿÿÿ‡ÿ„ÿƒÿ‚ÿÿ~ÿ€ÿ„ÿ‹ÿ’ÿ‘ÿŽÿ‰ÿ‹ÿÿÿŠÿ†ÿ‡ÿ…ÿ†ÿ…ÿƒÿ‚ÿÿzÿuÿqÿoÿlÿjÿhÿgÿhÿgÿeÿdÿgÿgÿcÿfÿiÿjÿfÿbÿaÿ^ÿ\ÿZÿXÿ]ÿaÿaÿaÿ]ÿ[ÿZÿaÿdÿbÿbÿcÿoÿsÿqÿkÿeÿjÿkÿlÿlÿkÿeÿaÿdÿhÿkÿlÿnÿqÿoÿmÿsÿuÿuÿqÿiÿjÿlÿlÿlÿjÿgÿhÿiÿmÿpÿqÿsÿpÿjÿgÿgÿeÿ_ÿ[ÿZÿ\ÿ[ÿWÿXÿ`ÿbÿbÿ_ÿbÿfÿiÿkÿhÿhÿcÿaÿdÿjÿpÿqÿpÿqÿuÿ{ÿ€ÿzÿrÿpÿoÿsÿuÿzÿ‚ÿ…ÿÿ€ÿ‚ÿ…ÿ†ÿ‡ÿ‡ÿƒÿ„ÿ„ÿ†ÿ„ÿ„ÿ†ÿ…ÿ‡ÿ…ÿ…ÿÿÿÿ€ÿ€ÿ|ÿzÿ€ÿ‡ÿ†ÿ…ÿ‚ÿ†ÿŠÿˆÿ…ÿ„ÿ…ÿˆÿˆÿ…ÿ‰ÿ‰ÿŒÿŒÿŒÿ‘ÿ“ÿšÿ—ÿÿ‘ÿÿÿÿŒÿŠÿÿ–ÿ˜ÿ›ÿœÿÿ¡ÿ£ÿ¤ÿ¦ÿ¨ÿ¥ÿ ÿžÿ˜ÿ‘ÿŒÿ‰ÿƒÿÿ„ÿ†ÿ‰ÿ‰ÿ‰ÿ‡ÿ…ÿ„ÿ…ÿ„ÿ‚ÿÿ‚ÿ†ÿ‡ÿÿÿ‹ÿŽÿÿ‹ÿÿŽÿÿ’ÿ’ÿ”ÿ”ÿ™ÿœÿžÿžÿŸÿ¢ÿŸÿÿŸÿ¡ÿ ÿŸÿ™ÿ—ÿ—ÿ”ÿÿ‰ÿŒÿŒÿ†ÿƒÿ€ÿÿ„ÿ…ÿ‚ÿÿ„ÿ†ÿ…ÿƒÿƒÿ‡ÿ‰ÿ†ÿ†ÿ†ÿ€ÿ{ÿ}ÿ‚ÿ…ÿƒÿÿ~ÿ~ÿÿ|ÿwÿvÿnÿoÿoÿfÿcÿ^ÿ]ÿ]ÿaÿdÿjÿiÿdÿdÿgÿjÿdÿcÿbÿcÿcÿbÿaÿeÿfÿcÿdÿeÿgÿgÿdÿbÿ^ÿ\ÿ\ÿ[ÿ[ÿWÿTÿVÿZÿZÿYÿYÿZÿYÿ[ÿ\ÿYÿYÿ[ÿZÿ[ÿ^ÿ_ÿ_ÿYÿYÿ_ÿ`ÿ\ÿ[ÿ]ÿ`ÿaÿaÿfÿgÿjÿjÿiÿjÿmÿkÿdÿcÿgÿeÿbÿbÿbÿfÿgÿfÿeÿfÿiÿkÿnÿlÿjÿmÿnÿnÿoÿqÿuÿpÿpÿsÿsÿtÿoÿjÿfÿjÿlÿlÿhÿcÿcÿeÿnÿpÿmÿlÿnÿrÿuÿvÿwÿzÿ{ÿ~ÿÿƒÿ„ÿ…ÿ…ÿ†ÿ‡ÿŠÿŠÿ‰ÿŠÿÿ’ÿŽÿŒÿŒÿŽÿ’ÿ“ÿÿ”ÿ›ÿ¡ÿ¡ÿŸÿÿÿ¡ÿŸÿÿÿšÿœÿ¡ÿŸÿÿ›ÿžÿŸÿ›ÿœÿšÿ›ÿŸÿŸÿ›ÿšÿšÿ˜ÿšÿ™ÿ•ÿ”ÿ’ÿ’ÿÿÿŽÿ’ÿ”ÿ•ÿ—ÿ—ÿšÿœÿ™ÿ—ÿ›ÿ›ÿ™ÿ—ÿšÿœÿ™ÿ—ÿ”ÿ“ÿ”ÿ—ÿ“ÿÿ‘ÿÿŠÿ†ÿˆÿŒÿ‹ÿˆÿ‡ÿˆÿ†ÿƒÿ„ÿ‚ÿÿ€ÿƒÿˆÿ‹ÿŠÿ‰ÿ‰ÿŠÿ‹ÿÿÿÿÿ‘ÿÿœÿ›ÿ’ÿÿˆÿ‹ÿ‹ÿ‰ÿ‡ÿˆÿˆÿ‰ÿ‰ÿŠÿ‹ÿŒÿÿŠÿ…ÿ„ÿÿ„ÿ‰ÿˆÿƒÿÿ†ÿ‰ÿ†ÿÿ|ÿzÿyÿyÿxÿtÿpÿsÿuÿtÿlÿkÿmÿmÿjÿeÿaÿ^ÿ\ÿ\ÿVÿUÿUÿTÿRÿLÿLÿQÿWÿYÿWÿXÿ^ÿcÿbÿaÿbÿ^ÿ\ÿ]ÿcÿfÿcÿbÿfÿjÿmÿlÿfÿcÿ`ÿ^ÿ_ÿ_ÿ`ÿfÿeÿ`ÿ]ÿ`ÿdÿaÿbÿcÿeÿeÿjÿjÿiÿkÿkÿjÿhÿbÿ^ÿ^ÿ_ÿ]ÿ]ÿaÿbÿcÿeÿhÿjÿkÿlÿnÿoÿkÿjÿiÿkÿkÿhÿiÿjÿmÿmÿoÿtÿwÿ{ÿwÿsÿtÿxÿ|ÿÿ|ÿ}ÿ~ÿ|ÿÿ‚ÿ…ÿ†ÿƒÿ†ÿˆÿˆÿ‰ÿŠÿ‹ÿ‹ÿŠÿ‰ÿ‰ÿ‰ÿ‡ÿ‹ÿÿŒÿ‰ÿƒÿ‡ÿŒÿÿŠÿ‰ÿÿ“ÿ’ÿ“ÿ’ÿ”ÿ—ÿ•ÿ”ÿÿ’ÿ”ÿ“ÿ—ÿ˜ÿ™ÿ™ÿ–ÿ˜ÿÿÿžÿÿžÿœÿ—ÿ—ÿ˜ÿ›ÿÿ˜ÿ–ÿœÿ¦ÿ¨ÿ¨ÿ¨ÿ¥ÿ¨ÿ«ÿ©ÿ«ÿ­ÿ«ÿ¦ÿ¥ÿ¢ÿ¡ÿ¢ÿ¥ÿ¨ÿ¨ÿ¥ÿ¥ÿ¥ÿ¢ÿ¢ÿ£ÿ ÿŸÿžÿ¢ÿ¨ÿ§ÿ¬ÿªÿ¥ÿŸÿ–ÿÿ†ÿ…ÿ…ÿ„ÿ‚ÿÿ‚ÿ‰ÿ‹ÿŒÿŽÿ‘ÿ—ÿ˜ÿ–ÿ•ÿ—ÿ˜ÿ–ÿ—ÿ™ÿ™ÿ›ÿ–ÿ•ÿ–ÿ–ÿ’ÿŽÿÿŽÿÿÿŒÿ‰ÿ†ÿ„ÿ‡ÿ‡ÿ†ÿ…ÿ…ÿƒÿ~ÿÿ„ÿ…ÿ„ÿ†ÿ…ÿƒÿÿÿzÿwÿuÿrÿpÿpÿtÿvÿrÿsÿuÿtÿrÿtÿuÿxÿwÿxÿxÿsÿuÿoÿnÿhÿhÿhÿcÿbÿ_ÿ^ÿ^ÿ_ÿ]ÿ\ÿYÿWÿTÿOÿMÿHÿMÿPÿPÿUÿ]ÿbÿbÿbÿdÿfÿiÿgÿgÿhÿdÿfÿiÿiÿfÿfÿfÿeÿdÿcÿgÿfÿaÿcÿgÿjÿkÿhÿlÿlÿgÿfÿfÿeÿcÿ`ÿ`ÿfÿgÿjÿlÿnÿlÿiÿqÿsÿmÿjÿkÿjÿiÿkÿoÿrÿqÿrÿtÿyÿzÿxÿyÿwÿpÿkÿmÿkÿhÿhÿiÿiÿiÿpÿoÿpÿtÿyÿÿ‚ÿ€ÿ~ÿ~ÿ€ÿ‚ÿ‚ÿ}ÿÿ„ÿ‡ÿ…ÿ‚ÿ„ÿ…ÿŠÿ‰ÿ‡ÿ‡ÿ‡ÿˆÿ‰ÿŠÿ‹ÿŠÿ‰ÿŒÿÿ”ÿ“ÿ’ÿ‘ÿÿÿÿ‹ÿ‰ÿ‹ÿŽÿ‘ÿ’ÿ“ÿ’ÿÿŠÿ‡ÿŠÿ‹ÿŽÿŒÿ‹ÿ‰ÿˆÿ‰ÿ˜ÿŸÿ›ÿ›ÿœÿšÿ”ÿ‘ÿ”ÿšÿ”ÿŽÿÿ•ÿ™ÿŸÿ¡ÿŸÿŸÿ¡ÿ¤ÿ¤ÿ ÿžÿ¡ÿ¢ÿ¢ÿ ÿ¢ÿ¢ÿ¢ÿ¨ÿ­ÿ¯ÿ¬ÿ§ÿ¤ÿ¡ÿ›ÿ•ÿ“ÿÿÿ“ÿ“ÿ’ÿŽÿ‹ÿÿŒÿŒÿŽÿÿ‰ÿ…ÿ‡ÿ†ÿƒÿ€ÿ~ÿ~ÿ€ÿ„ÿ„ÿÿ|ÿyÿxÿzÿxÿvÿuÿvÿuÿtÿxÿ~ÿ‡ÿŒÿŒÿŽÿÿ‰ÿˆÿŒÿÿŒÿ‹ÿŠÿˆÿ‰ÿˆÿƒÿyÿvÿvÿsÿpÿnÿlÿgÿkÿnÿoÿnÿhÿeÿfÿbÿbÿcÿbÿ_ÿ\ÿ^ÿaÿbÿ`ÿXÿSÿRÿTÿVÿSÿPÿUÿ]ÿ]ÿ[ÿ\ÿ[ÿ^ÿ_ÿ_ÿbÿgÿoÿnÿoÿqÿqÿkÿdÿbÿ_ÿ]ÿ_ÿ_ÿZÿ[ÿ[ÿaÿbÿ^ÿZÿ]ÿbÿ]ÿ[ÿYÿZÿYÿZÿ[ÿ\ÿ^ÿ_ÿ_ÿ^ÿ^ÿ^ÿ]ÿ]ÿ]ÿaÿbÿgÿhÿgÿiÿjÿkÿiÿiÿjÿlÿmÿiÿkÿnÿnÿoÿpÿrÿqÿrÿpÿpÿqÿqÿqÿkÿjÿgÿfÿiÿmÿmÿlÿoÿrÿwÿzÿzÿyÿzÿ~ÿÿÿƒÿ…ÿƒÿÿ†ÿˆÿŒÿŽÿ‘ÿ’ÿ‘ÿ•ÿ—ÿ™ÿ˜ÿÿ›ÿ–ÿ–ÿ’ÿ‘ÿÿ‘ÿÿŽÿ‡ÿ|ÿ~ÿƒÿÿÿ€ÿ…ÿƒÿ‚ÿƒÿ†ÿ‰ÿŠÿŠÿŒÿÿ”ÿ•ÿ˜ÿ™ÿ›ÿÿŸÿ¡ÿ£ÿ¥ÿ¤ÿ¥ÿ¦ÿ§ÿ¥ÿ¦ÿ¥ÿ£ÿ¢ÿ¢ÿ¢ÿ¢ÿ ÿœÿ—ÿ”ÿ’ÿÿÿÿÿÿŽÿŽÿÿ“ÿ‘ÿÿÿ“ÿ“ÿ‘ÿŒÿ‹ÿŽÿÿŽÿ‹ÿŠÿŒÿŒÿŠÿ‰ÿŒÿÿ‘ÿ‘ÿ’ÿ™ÿ›ÿ ÿŸÿ›ÿšÿ—ÿ–ÿ“ÿ’ÿ’ÿÿ‘ÿÿ‹ÿÿŽÿŒÿÿÿŠÿ‡ÿƒÿ„ÿ‡ÿ‡ÿ†ÿ€ÿÿÿ€ÿÿ|ÿyÿ|ÿwÿsÿqÿsÿuÿoÿiÿjÿmÿmÿlÿlÿlÿmÿoÿmÿkÿnÿlÿkÿkÿhÿhÿgÿfÿfÿgÿjÿdÿ`ÿ`ÿ`ÿ_ÿ^ÿbÿcÿaÿcÿeÿcÿ_ÿ_ÿcÿdÿfÿeÿfÿgÿeÿcÿbÿaÿaÿbÿ`ÿ^ÿ`ÿbÿ_ÿZÿYÿUÿVÿ[ÿ^ÿ`ÿ_ÿ`ÿcÿgÿhÿfÿcÿ`ÿ_ÿ_ÿ`ÿ`ÿ`ÿaÿ`ÿ^ÿcÿgÿbÿdÿdÿcÿcÿ_ÿ^ÿ]ÿaÿfÿgÿeÿgÿgÿgÿcÿeÿhÿiÿmÿkÿmÿlÿmÿmÿtÿ{ÿ}ÿ~ÿ|ÿˆÿŒÿŠÿ‹ÿ‡ÿƒÿ‚ÿ‡ÿÿ€ÿÿ€ÿ~ÿyÿ}ÿ~ÿÿ}ÿ~ÿÿ|ÿ{ÿ{ÿ}ÿ}ÿ~ÿ~ÿ}ÿ~ÿ~ÿ€ÿ„ÿ…ÿ‡ÿŠÿÿÿ’ÿ”ÿ•ÿ˜ÿ˜ÿ—ÿ•ÿ–ÿ“ÿ’ÿÿŒÿÿÿ’ÿ’ÿÿÿÿŒÿŽÿ“ÿ”ÿ”ÿšÿœÿšÿ–ÿ’ÿ’ÿ’ÿ’ÿ”ÿ”ÿ—ÿ™ÿ—ÿ–ÿšÿŸÿÿ˜ÿ™ÿÿ ÿŸÿ¡ÿ§ÿ§ÿ£ÿ¡ÿ¢ÿ¥ÿ©ÿ¨ÿ¦ÿ¥ÿ¤ÿ¦ÿ¨ÿ¥ÿ£ÿ¢ÿœÿ“ÿ•ÿ›ÿœÿ¤ÿ¢ÿÿšÿšÿšÿšÿ™ÿœÿ›ÿ˜ÿ–ÿ–ÿžÿÿ˜ÿ—ÿ•ÿ”ÿŽÿ‹ÿ‰ÿˆÿˆÿ†ÿ‡ÿŒÿÿŽÿÿÿ‘ÿ‘ÿÿŒÿŽÿ’ÿ’ÿ’ÿ‘ÿÿÿŠÿˆÿÿÿÿ’ÿÿŠÿ†ÿƒÿÿ~ÿ~ÿ|ÿzÿsÿpÿrÿsÿqÿoÿnÿjÿiÿjÿnÿnÿlÿiÿdÿaÿbÿdÿdÿ`ÿ_ÿ`ÿaÿcÿbÿfÿgÿeÿiÿjÿkÿmÿqÿuÿuÿtÿpÿpÿrÿrÿoÿhÿeÿcÿfÿjÿjÿeÿcÿ`ÿ]ÿYÿTÿVÿZÿ\ÿZÿZÿ`ÿdÿdÿfÿfÿhÿhÿdÿaÿbÿfÿhÿeÿgÿsÿsÿnÿhÿdÿdÿfÿfÿ`ÿbÿeÿfÿgÿnÿoÿkÿlÿkÿqÿuÿsÿrÿwÿyÿyÿxÿxÿzÿ|ÿ}ÿ|ÿÿ…ÿ‡ÿ…ÿ‚ÿÿ€ÿ€ÿ‚ÿÿ}ÿÿ~ÿ{ÿxÿyÿ~ÿƒÿ€ÿzÿxÿ|ÿ{ÿwÿwÿvÿxÿ}ÿÿ‚ÿ€ÿ‚ÿ…ÿ†ÿ†ÿˆÿÿ‘ÿÿÿŒÿŽÿ‘ÿ‘ÿÿŽÿÿÿÿ‘ÿŽÿÿÿÿ’ÿÿ‹ÿÿÿ’ÿÿÿ‹ÿÿ”ÿ”ÿ•ÿ˜ÿÿšÿ—ÿ—ÿ›ÿ ÿ¡ÿ¡ÿŸÿžÿ˜ÿ“ÿ‘ÿÿŽÿÿ“ÿ“ÿ’ÿŽÿ’ÿ”ÿ’ÿ‘ÿÿ’ÿÿŠÿÿÿ‹ÿÿŽÿÿ‘ÿ“ÿ’ÿ‘ÿÿÿ“ÿ“ÿ’ÿ–ÿ—ÿ˜ÿžÿ¡ÿŸÿÿŸÿ ÿŸÿ ÿ ÿ›ÿ˜ÿ›ÿšÿ•ÿÿ‘ÿ”ÿ—ÿ–ÿ“ÿŽÿŒÿ‹ÿ‰ÿ…ÿ‚ÿ…ÿÿÿ„ÿ„ÿ‚ÿ~ÿzÿ{ÿ~ÿ{ÿvÿtÿrÿpÿrÿuÿtÿsÿtÿsÿyÿ|ÿ~ÿÿ{ÿxÿyÿyÿzÿ|ÿ{ÿxÿuÿxÿyÿyÿzÿzÿ|ÿ{ÿuÿkÿfÿeÿhÿhÿaÿ`ÿ`ÿcÿeÿdÿcÿbÿaÿcÿbÿ`ÿ_ÿ\ÿ[ÿZÿbÿ`ÿ^ÿ]ÿ[ÿ]ÿ`ÿbÿcÿ`ÿYÿWÿZÿ[ÿ[ÿ\ÿ\ÿ_ÿbÿbÿcÿhÿhÿjÿhÿeÿfÿkÿlÿiÿjÿmÿlÿeÿdÿfÿiÿkÿiÿgÿfÿiÿlÿpÿtÿsÿrÿsÿvÿvÿrÿpÿpÿqÿpÿkÿlÿhÿhÿfÿbÿbÿcÿbÿaÿdÿfÿjÿkÿkÿiÿhÿhÿkÿmÿoÿpÿtÿvÿuÿuÿtÿvÿuÿxÿ|ÿ}ÿ~ÿ‚ÿˆÿ‰ÿ…ÿ†ÿ‰ÿŠÿˆÿÿ’ÿÿ’ÿ”ÿ‘ÿ‹ÿ’ÿ–ÿ•ÿ”ÿ’ÿ•ÿ—ÿ™ÿ—ÿ“ÿ”ÿ˜ÿ™ÿ•ÿ•ÿ•ÿ•ÿ”ÿ”ÿ—ÿ˜ÿ™ÿ•ÿ˜ÿ—ÿ–ÿ–ÿ–ÿ•ÿ”ÿ’ÿ‘ÿ“ÿ”ÿ–ÿ’ÿÿŒÿÿÿ‘ÿŽÿŒÿ‘ÿ•ÿ™ÿœÿœÿšÿšÿ™ÿ—ÿ–ÿ“ÿÿŠÿ‡ÿ‡ÿ‡ÿˆÿŠÿŽÿ•ÿ˜ÿ•ÿ”ÿ–ÿ™ÿ˜ÿ’ÿ‘ÿÿ‘ÿ‘ÿ‹ÿˆÿ‡ÿˆÿŠÿŠÿ‰ÿŒÿÿÿ‰ÿ…ÿ‰ÿŠÿŠÿ‰ÿŒÿ‰ÿŠÿŽÿ”ÿ”ÿÿÿ’ÿŽÿˆÿˆÿ†ÿ‚ÿƒÿˆÿ†ÿ†ÿ„ÿÿ}ÿ~ÿÿ‚ÿ‚ÿ~ÿ|ÿyÿ|ÿ}ÿ~ÿ|ÿzÿwÿxÿuÿxÿyÿvÿqÿnÿzÿvÿtÿpÿmÿlÿhÿbÿ]ÿYÿNÿHÿEÿDÿAÿBÿAÿBÿJÿOÿPÿOÿOÿPÿQÿQÿMÿFÿCÿGÿNÿNÿKÿPÿXÿ^ÿ`ÿaÿfÿhÿdÿhÿgÿhÿlÿlÿqÿvÿzÿzÿ{ÿ}ÿ}ÿxÿpÿnÿnÿjÿdÿbÿeÿfÿcÿaÿ^ÿ\ÿWÿXÿZÿ[ÿ]ÿ[ÿ]ÿ]ÿ`ÿbÿaÿaÿcÿcÿaÿeÿcÿbÿaÿbÿgÿiÿjÿkÿoÿuÿvÿvÿ{ÿ~ÿ€ÿ}ÿ|ÿ{ÿwÿvÿrÿsÿsÿtÿxÿxÿvÿxÿwÿtÿqÿmÿqÿsÿuÿzÿ{ÿ|ÿÿ†ÿ‰ÿ‰ÿ‹ÿ‹ÿŒÿŠÿˆÿ‹ÿ‰ÿ…ÿ‹ÿÿ“ÿ”ÿ”ÿ•ÿ–ÿ”ÿ”ÿ–ÿ–ÿ–ÿ—ÿ˜ÿ”ÿ’ÿÿ‘ÿ“ÿÿŒÿŒÿŠÿŠÿÿÿÿÿŽÿ‘ÿ”ÿ–ÿšÿšÿœÿÿžÿŸÿžÿ™ÿ˜ÿžÿ¢ÿ¦ÿ¤ÿ¡ÿ¢ÿ¢ÿŸÿÿ›ÿÿ ÿžÿ›ÿœÿÿ›ÿšÿ›ÿšÿ™ÿšÿÿŸÿ¡ÿ¢ÿ ÿžÿŸÿ£ÿ¦ÿ¦ÿ£ÿ¤ÿ¥ÿ¡ÿÿžÿžÿÿ˜ÿšÿ›ÿÿšÿ˜ÿšÿ™ÿ—ÿ“ÿ’ÿ”ÿ–ÿÿŽÿÿÿ•ÿ–ÿ”ÿ”ÿœÿ™ÿ—ÿ”ÿÿŽÿŠÿŒÿŽÿÿ‰ÿ…ÿƒÿÿ}ÿ|ÿÿÿ|ÿ~ÿƒÿ…ÿ‚ÿ~ÿxÿwÿtÿqÿqÿmÿjÿgÿiÿgÿfÿhÿjÿmÿoÿtÿwÿuÿrÿlÿgÿfÿkÿmÿhÿeÿfÿjÿiÿfÿfÿfÿfÿdÿdÿaÿ`ÿ]ÿ]ÿ]ÿ\ÿ\ÿaÿgÿgÿfÿgÿjÿlÿnÿlÿlÿmÿiÿbÿ`ÿaÿcÿcÿaÿaÿfÿiÿiÿjÿkÿjÿkÿpÿuÿvÿvÿxÿxÿyÿzÿ~ÿÿ~ÿxÿuÿpÿpÿoÿoÿoÿjÿkÿoÿoÿkÿmÿjÿhÿeÿhÿgÿeÿeÿgÿmÿrÿuÿoÿoÿuÿvÿsÿtÿrÿlÿnÿrÿrÿvÿ}ÿ†ÿ‹ÿ‹ÿŠÿŠÿŠÿŠÿ‰ÿ‚ÿ‚ÿ‡ÿˆÿˆÿˆÿŒÿÿ‘ÿŽÿ‹ÿ‰ÿ„ÿ…ÿƒÿ‚ÿ‚ÿƒÿ‰ÿˆÿŠÿŽÿ“ÿ˜ÿ˜ÿ™ÿšÿšÿ—ÿ“ÿ‘ÿÿ‘ÿ’ÿ“ÿ•ÿ”ÿÿÿ“ÿÿŒÿŠÿŠÿ‰ÿ†ÿˆÿ‡ÿ‡ÿŠÿ’ÿ•ÿ–ÿšÿ›ÿšÿ™ÿ—ÿ“ÿ“ÿ—ÿœÿ ÿŸÿ¤ÿªÿ¬ÿ¬ÿªÿªÿªÿ©ÿ¤ÿ£ÿŸÿ›ÿžÿ ÿŸÿ ÿ¤ÿ¨ÿ§ÿ£ÿ¡ÿ§ÿ«ÿ ÿœÿ–ÿ“ÿ’ÿÿ‹ÿ‰ÿˆÿ‡ÿ‡ÿ†ÿ„ÿ…ÿ†ÿ…ÿ…ÿ‰ÿÿÿÿ‘ÿ•ÿ–ÿ“ÿ‘ÿ‘ÿÿŒÿ‹ÿÿŽÿŒÿˆÿ†ÿƒÿ€ÿ€ÿ‚ÿ„ÿ„ÿ„ÿ…ÿ„ÿ…ÿ†ÿ…ÿ…ÿ…ÿ„ÿƒÿ„ÿ…ÿ†ÿ…ÿ†ÿˆÿŒÿŠÿ„ÿƒÿ‚ÿ}ÿuÿwÿxÿvÿtÿrÿpÿoÿpÿqÿnÿmÿjÿbÿ]ÿYÿ[ÿYÿYÿWÿUÿZÿ[ÿWÿXÿ\ÿZÿZÿZÿYÿ\ÿ`ÿbÿdÿfÿdÿeÿhÿgÿcÿbÿcÿ^ÿ^ÿ^ÿ^ÿZÿWÿYÿYÿZÿWÿTÿVÿYÿWÿPÿQÿTÿWÿWÿXÿ\ÿ_ÿ`ÿaÿdÿdÿdÿdÿaÿaÿcÿaÿ^ÿ\ÿ\ÿ^ÿ[ÿWÿWÿZÿ\ÿ\ÿ_ÿbÿfÿgÿdÿeÿlÿpÿoÿnÿrÿxÿyÿyÿ{ÿyÿtÿuÿxÿ{ÿzÿ}ÿƒÿ‹ÿŒÿ‹ÿ‘ÿ’ÿÿ‹ÿ„ÿ‚ÿ€ÿÿ~ÿÿ€ÿ‚ÿ„ÿˆÿ‡ÿƒÿ„ÿƒÿ„ÿˆÿŠÿ‰ÿˆÿ‹ÿŒÿŠÿ‹ÿŽÿÿ’ÿ˜ÿ˜ÿ–ÿ’ÿŒÿŠÿ‹ÿŠÿˆÿ‰ÿŒÿ‘ÿÿŒÿ†ÿÿƒÿ†ÿ‚ÿ{ÿ{ÿÿ}ÿ}ÿÿ‡ÿÿÿÿ•ÿ§ÿ¦ÿ£ÿ¡ÿ¢ÿ£ÿ£ÿ¨ÿ¥ÿ£ÿ ÿžÿ ÿ¤ÿ¢ÿ ÿœÿ›ÿ™ÿ”ÿ“ÿ“ÿ”ÿ’ÿ‘ÿ”ÿ–ÿ“ÿ’ÿ•ÿ”ÿÿÿÿÿŒÿŽÿÿ‹ÿ‹ÿ‘ÿ—ÿ™ÿšÿžÿ ÿžÿšÿ™ÿ–ÿ”ÿ“ÿ”ÿ“ÿ’ÿ“ÿ’ÿÿŒÿ‰ÿ†ÿƒÿ~ÿzÿrÿqÿtÿsÿqÿpÿtÿqÿlÿiÿlÿoÿpÿoÿmÿlÿlÿnÿtÿyÿ}ÿÿ|ÿzÿyÿzÿwÿsÿnÿlÿiÿeÿfÿkÿnÿmÿnÿmÿjÿgÿhÿiÿeÿeÿcÿ^ÿ_ÿbÿdÿcÿaÿbÿeÿfÿbÿ^ÿ^ÿ`ÿ_ÿ`ÿ_ÿ[ÿ[ÿWÿVÿYÿZÿ[ÿ^ÿ^ÿ^ÿ^ÿ\ÿYÿWÿVÿWÿ[ÿYÿWÿ[ÿ^ÿ`ÿeÿhÿbÿbÿcÿaÿbÿaÿaÿfÿlÿpÿwÿyÿ{ÿ{ÿzÿyÿtÿoÿkÿmÿkÿiÿgÿgÿgÿjÿqÿsÿoÿmÿoÿmÿjÿhÿjÿlÿoÿlÿkÿkÿiÿhÿeÿeÿbÿ]ÿ\ÿ^ÿ_ÿ_ÿbÿfÿkÿqÿsÿuÿyÿ|ÿ|ÿ|ÿ€ÿ„ÿ‡ÿˆÿ‡ÿŠÿÿ•ÿ—ÿ˜ÿ–ÿšÿžÿœÿ–ÿ“ÿ“ÿÿŽÿ‰ÿ‰ÿˆÿŠÿ‹ÿŽÿœÿœÿ™ÿ’ÿÿÿ‘ÿ’ÿŽÿÿŒÿˆÿ‚ÿ}ÿ€ÿƒÿ‚ÿ~ÿ}ÿÿƒÿÿÿ…ÿˆÿ‡ÿ‹ÿ’ÿ™ÿ›ÿžÿ¡ÿ¢ÿ£ÿŸÿ›ÿ›ÿ™ÿ™ÿšÿ›ÿšÿ™ÿœÿ¡ÿ¤ÿ¥ÿ§ÿ©ÿ¨ÿ§ÿ¨ÿ©ÿ©ÿ¨ÿ§ÿ¨ÿ©ÿ«ÿ­ÿ«ÿ§ÿ¥ÿ¤ÿ£ÿ¡ÿ¢ÿ¢ÿ¡ÿ ÿšÿ™ÿšÿ–ÿ“ÿ’ÿ“ÿ’ÿÿˆÿƒÿ„ÿ„ÿƒÿ„ÿ‡ÿ†ÿ…ÿ…ÿ‚ÿÿ~ÿÿ‚ÿƒÿ€ÿzÿzÿ}ÿÿƒÿ‚ÿ‡ÿŠÿŠÿ‹ÿ‹ÿŠÿŠÿÿÿÿŒÿ†ÿ…ÿƒÿƒÿ‚ÿ„ÿ…ÿ}ÿxÿxÿvÿmÿgÿgÿhÿiÿeÿcÿdÿhÿjÿiÿgÿgÿjÿmÿnÿmÿjÿiÿfÿdÿcÿbÿ`ÿ]ÿ]ÿ[ÿXÿXÿVÿTÿTÿTÿRÿVÿ[ÿ]ÿ[ÿ^ÿcÿhÿgÿfÿhÿdÿbÿaÿdÿdÿ`ÿ`ÿ^ÿaÿjÿnÿoÿpÿrÿuÿrÿpÿsÿvÿrÿrÿsÿrÿwÿuÿtÿsÿpÿlÿeÿfÿeÿdÿaÿ^ÿbÿcÿfÿiÿlÿqÿsÿrÿpÿrÿuÿwÿuÿpÿlÿpÿxÿzÿ{ÿzÿyÿxÿxÿyÿ|ÿÿ~ÿ{ÿyÿwÿ~ÿ‰ÿ‡ÿ‡ÿ‡ÿ‰ÿ†ÿ†ÿÿ—ÿ”ÿÿ’ÿ’ÿ•ÿ˜ÿ˜ÿ›ÿšÿœÿšÿšÿ•ÿ‘ÿ‘ÿÿÿÿÿŒÿ‘ÿ–ÿ˜ÿœÿšÿšÿÿœÿ›ÿ—ÿ“ÿ•ÿ•ÿ–ÿ˜ÿ™ÿšÿšÿÿžÿÿžÿ¡ÿ¡ÿžÿ›ÿ›ÿžÿÿ›ÿ—ÿ•ÿ”ÿ”ÿ—ÿ•ÿ“ÿ‘ÿ“ÿÿÿÿŠÿŒÿ‹ÿÿÿ’ÿ“ÿ”ÿ’ÿ’ÿ–ÿ˜ÿ˜ÿ”ÿ“ÿ–ÿ˜ÿ–ÿ–ÿšÿÿ¡ÿ£ÿŸÿžÿžÿžÿšÿ–ÿšÿ™ÿ™ÿ™ÿšÿŸÿ¤ÿ©ÿ©ÿ¥ÿ ÿžÿŸÿ ÿœÿ™ÿ–ÿ‘ÿÿÿŽÿÿÿˆÿ‚ÿzÿ{ÿ}ÿ}ÿ|ÿÿÿƒÿ‡ÿ‰ÿŠÿ‡ÿˆÿ‡ÿ‡ÿ†ÿƒÿÿ‚ÿ‚ÿ{ÿzÿ{ÿ{ÿ{ÿ|ÿ}ÿzÿyÿwÿsÿvÿvÿvÿtÿtÿvÿtÿwÿtÿrÿtÿuÿtÿrÿoÿkÿlÿlÿlÿcÿ]ÿ_ÿ`ÿ]ÿYÿXÿVÿUÿYÿZÿYÿUÿTÿVÿSÿTÿYÿ\ÿ^ÿ]ÿaÿfÿeÿdÿ`ÿ^ÿ^ÿ[ÿXÿWÿ[ÿbÿ_ÿ[ÿcÿkÿnÿpÿpÿnÿoÿpÿqÿqÿmÿmÿkÿqÿvÿvÿtÿrÿkÿeÿgÿnÿoÿsÿxÿsÿtÿrÿnÿpÿrÿqÿqÿkÿjÿmÿnÿnÿmÿnÿlÿlÿkÿlÿjÿgÿfÿhÿjÿdÿ\ÿ\ÿ_ÿ`ÿcÿcÿgÿjÿmÿrÿoÿrÿwÿ}ÿÿzÿ|ÿ‚ÿ„ÿ„ÿ‡ÿŠÿ‰ÿ‰ÿŠÿŒÿÿ‹ÿŒÿÿÿ’ÿŽÿŽÿÿ•ÿ•ÿ“ÿ“ÿ‘ÿÿŽÿ‹ÿŒÿ‰ÿ…ÿ…ÿƒÿ†ÿƒÿ€ÿ~ÿÿ‡ÿ‹ÿˆÿ…ÿ†ÿ‡ÿˆÿƒÿ‚ÿ†ÿŠÿÿŒÿ‘ÿ•ÿ—ÿ™ÿÿ›ÿ•ÿ‘ÿŒÿÿ”ÿ’ÿŽÿÿÿ’ÿ“ÿ•ÿ™ÿ˜ÿ•ÿ–ÿ“ÿ“ÿ’ÿ“ÿ”ÿ”ÿ”ÿ™ÿžÿ›ÿ™ÿ˜ÿ˜ÿ›ÿšÿ–ÿ”ÿÿ’ÿ–ÿ–ÿ•ÿ–ÿ™ÿšÿ˜ÿ˜ÿ™ÿ™ÿ˜ÿ”ÿŽÿ‘ÿ–ÿ”ÿŒÿ‰ÿ†ÿ…ÿ€ÿ{ÿ}ÿ}ÿ}ÿ{ÿ}ÿ}ÿ{ÿÿÿ‚ÿ…ÿ‰ÿŽÿÿ‹ÿ‰ÿ‹ÿŽÿ’ÿÿŠÿ‡ÿ…ÿ…ÿ…ÿ…ÿƒÿ„ÿƒÿ‡ÿ†ÿ‚ÿyÿqÿpÿnÿpÿoÿkÿiÿmÿmÿjÿhÿfÿ`ÿ]ÿ^ÿ^ÿZÿTÿPÿOÿTÿVÿSÿPÿNÿQÿPÿPÿRÿSÿUÿTÿUÿ\ÿ\ÿYÿYÿaÿbÿbÿaÿ`ÿaÿcÿdÿjÿuÿnÿiÿeÿgÿeÿdÿdÿaÿdÿaÿaÿcÿ`ÿ_ÿaÿeÿiÿeÿfÿhÿgÿhÿjÿiÿfÿgÿeÿcÿfÿcÿaÿaÿ`ÿbÿ`ÿ\ÿ\ÿ_ÿbÿaÿaÿ^ÿ\ÿZÿ\ÿ]ÿ]ÿ\ÿ]ÿ`ÿgÿlÿmÿmÿlÿlÿoÿqÿoÿqÿqÿqÿoÿqÿtÿxÿwÿrÿuÿwÿxÿuÿvÿxÿvÿxÿxÿuÿsÿuÿ{ÿyÿuÿwÿxÿyÿzÿÿ„ÿ‚ÿÿ€ÿ„ÿŠÿŽÿŽÿŒÿ‹ÿŒÿ’ÿ–ÿ•ÿŽÿŠÿŒÿ‘ÿÿÿÿŠÿÿ‘ÿ‘ÿÿ’ÿ“ÿÿŽÿ‰ÿ…ÿƒÿ‚ÿÿ„ÿ‡ÿ‡ÿ‹ÿ‘ÿÿŽÿÿŽÿ‹ÿŽÿ‘ÿ’ÿ”ÿ–ÿ•ÿ•ÿšÿ¤ÿ¥ÿ£ÿ ÿžÿ ÿŸÿ›ÿœÿÿœÿ™ÿ™ÿŸÿžÿ›ÿ˜ÿ—ÿ›ÿšÿ˜ÿ‘ÿ‹ÿÿ‘ÿ‘ÿÿ‰ÿŽÿ–ÿ“ÿ“ÿ•ÿ™ÿ™ÿ–ÿ—ÿ™ÿÿ›ÿ—ÿ•ÿ–ÿ“ÿŽÿŒÿÿÿŒÿ‹ÿŒÿÿŽÿÿˆÿ†ÿ‚ÿ‚ÿ„ÿ„ÿ…ÿÿÿ‚ÿ„ÿÿ~ÿ}ÿ€ÿ‚ÿ‚ÿ€ÿ}ÿÿƒÿ„ÿƒÿ‚ÿ…ÿ„ÿ„ÿ†ÿˆÿ‰ÿ‰ÿ‹ÿŽÿŒÿ‡ÿ‰ÿ†ÿ‹ÿ“ÿÿ…ÿ{ÿyÿvÿsÿnÿgÿdÿ]ÿ[ÿ[ÿ\ÿ[ÿVÿSÿUÿUÿRÿQÿOÿPÿPÿRÿWÿXÿZÿ\ÿYÿUÿWÿWÿ[ÿ]ÿ\ÿ`ÿaÿeÿdÿfÿgÿiÿoÿpÿnÿlÿnÿnÿkÿnÿrÿtÿtÿtÿsÿvÿuÿwÿvÿuÿvÿuÿvÿtÿpÿmÿlÿjÿhÿkÿoÿuÿxÿsÿpÿoÿmÿiÿhÿgÿdÿfÿdÿcÿaÿbÿgÿiÿnÿpÿqÿmÿmÿqÿrÿqÿlÿnÿrÿsÿwÿwÿtÿsÿsÿwÿ}ÿÿƒÿƒÿƒÿ„ÿ‰ÿÿÿ‘ÿ‘ÿ’ÿ’ÿ“ÿ•ÿ‘ÿÿ“ÿ—ÿ–ÿ•ÿÿŒÿŽÿ‘ÿ’ÿ”ÿ–ÿ›ÿ—ÿ’ÿÿŒÿ‡ÿƒÿ„ÿ‡ÿŒÿŠÿ‹ÿŒÿŒÿŒÿÿÿ•ÿ˜ÿ™ÿ™ÿ™ÿ™ÿšÿ™ÿ™ÿœÿžÿÿÿ¡ÿ¢ÿ¤ÿ¦ÿ¥ÿ¤ÿ¢ÿ ÿ£ÿ¥ÿ¥ÿ¤ÿ£ÿ¡ÿ£ÿ¦ÿ¥ÿ§ÿ¥ÿ¦ÿ¨ÿ¦ÿ§ÿ¦ÿ£ÿ¢ÿ ÿÿÿÿšÿœÿÿ›ÿšÿœÿšÿœÿžÿžÿ¡ÿ›ÿ™ÿÿŸÿÿÿ¡ÿžÿžÿÿžÿÿ˜ÿ™ÿ”ÿÿŒÿŒÿŠÿÿÿŽÿÿŒÿŠÿŒÿ‹ÿ’ÿ˜ÿ‘ÿÿŠÿ…ÿ†ÿ‡ÿƒÿ}ÿ{ÿuÿoÿpÿnÿnÿpÿxÿyÿwÿyÿxÿyÿxÿzÿ{ÿ{ÿuÿoÿhÿdÿfÿgÿhÿgÿeÿcÿbÿ_ÿ`ÿ_ÿaÿeÿdÿbÿdÿbÿaÿaÿ`ÿ`ÿcÿcÿcÿfÿdÿbÿaÿdÿiÿkÿlÿkÿlÿrÿtÿqÿhÿbÿfÿhÿeÿ]ÿXÿWÿWÿWÿWÿVÿRÿSÿRÿRÿRÿSÿOÿKÿLÿPÿWÿ]ÿ\ÿ^ÿbÿeÿhÿiÿkÿjÿkÿpÿsÿuÿzÿxÿvÿyÿzÿtÿoÿtÿwÿ|ÿ~ÿ~ÿ}ÿxÿwÿyÿ{ÿwÿrÿnÿlÿoÿqÿrÿoÿpÿoÿqÿuÿsÿuÿsÿtÿrÿoÿoÿuÿwÿxÿ|ÿ€ÿƒÿˆÿˆÿ‡ÿˆÿ„ÿƒÿƒÿ‚ÿÿƒÿƒÿ‡ÿŠÿŒÿÿÿ‹ÿ‹ÿŠÿ‡ÿŒÿÿÿÿÿÿÿÿ’ÿ˜ÿšÿšÿ›ÿœÿŸÿ¢ÿ¢ÿ¢ÿ¡ÿžÿœÿœÿ˜ÿ’ÿÿÿÿÿÿŒÿŒÿ‹ÿˆÿˆÿŠÿŠÿÿÿÿ‹ÿŠÿÿ’ÿ•ÿ—ÿ˜ÿœÿ¡ÿ ÿÿŸÿ¢ÿ¢ÿ¡ÿŸÿ£ÿ¤ÿ¢ÿ¨ÿ«ÿªÿªÿ¦ÿ§ÿ¥ÿ¢ÿ¥ÿ¥ÿ ÿ©ÿ³ÿ­ÿ¨ÿ¢ÿ ÿœÿšÿ—ÿ•ÿ‘ÿŒÿ‰ÿ‰ÿ‰ÿŠÿŒÿ‹ÿŽÿÿÿŽÿŽÿŽÿÿˆÿ€ÿÿ„ÿˆÿ„ÿ|ÿwÿyÿyÿzÿ|ÿwÿpÿlÿnÿpÿqÿpÿnÿlÿqÿyÿ{ÿ{ÿzÿ|ÿÿ~ÿ{ÿwÿyÿÿ{ÿvÿrÿrÿpÿoÿqÿtÿtÿpÿnÿjÿjÿnÿjÿdÿaÿdÿfÿcÿeÿeÿeÿfÿeÿcÿ^ÿYÿVÿXÿVÿTÿRÿQÿTÿUÿXÿWÿ[ÿ\ÿ\ÿ`ÿfÿdÿeÿgÿiÿhÿdÿhÿhÿfÿgÿhÿfÿcÿbÿaÿ_ÿ]ÿZÿYÿWÿWÿ[ÿ`ÿ`ÿ`ÿ`ÿ^ÿ^ÿ`ÿcÿdÿ^ÿaÿdÿdÿfÿeÿcÿaÿbÿaÿ`ÿ^ÿ_ÿaÿbÿ`ÿ\ÿcÿeÿdÿeÿdÿdÿeÿgÿnÿuÿtÿpÿqÿrÿsÿvÿyÿvÿoÿpÿtÿxÿyÿyÿwÿyÿÿÿ€ÿˆÿÿÿŽÿÿ—ÿžÿ ÿ›ÿ™ÿ—ÿ“ÿ”ÿ“ÿŽÿÿ‹ÿ‹ÿˆÿ…ÿ…ÿ‡ÿˆÿ„ÿ{ÿuÿyÿ{ÿxÿpÿmÿoÿvÿyÿ{ÿÿ€ÿ‚ÿƒÿ„ÿ„ÿ‡ÿ‰ÿ…ÿ†ÿ†ÿ†ÿŽÿÿ”ÿ–ÿ›ÿ ÿŸÿ ÿŸÿ©ÿ¯ÿ§ÿ ÿŸÿ¡ÿŸÿ¡ÿ¡ÿ¥ÿ¢ÿÿœÿÿšÿ•ÿ”ÿÿ‹ÿƒÿ…ÿ†ÿ‚ÿÿÿÿ„ÿ‡ÿ…ÿ…ÿƒÿ‚ÿ†ÿˆÿ†ÿˆÿ‘ÿ—ÿ—ÿ”ÿ’ÿ•ÿ–ÿ—ÿ˜ÿ“ÿ–ÿ•ÿ•ÿ•ÿ•ÿ”ÿ”ÿ’ÿÿÿÿŒÿŠÿŠÿ‹ÿ‹ÿŒÿÿ‘ÿÿÿÿŽÿÿ‹ÿŒÿ‰ÿ…ÿ„ÿ}ÿvÿrÿoÿoÿoÿqÿsÿvÿzÿ~ÿƒÿ†ÿ‚ÿzÿvÿtÿrÿqÿoÿmÿkÿgÿeÿdÿfÿdÿaÿaÿeÿhÿfÿdÿeÿhÿhÿcÿbÿeÿfÿdÿdÿeÿdÿfÿhÿcÿZÿYÿZÿYÿ^ÿcÿbÿ`ÿbÿaÿbÿaÿ`ÿeÿgÿiÿhÿdÿaÿbÿcÿ`ÿ\ÿ]ÿaÿ`ÿ^ÿZÿ\ÿ`ÿ]ÿ]ÿ_ÿcÿeÿeÿfÿlÿlÿgÿcÿeÿdÿbÿeÿbÿeÿcÿfÿkÿnÿrÿsÿxÿyÿyÿxÿuÿsÿrÿqÿqÿqÿqÿyÿÿ~ÿxÿvÿxÿtÿmÿjÿiÿcÿcÿeÿeÿhÿkÿmÿpÿpÿqÿwÿ~ÿ‚ÿÿ~ÿ}ÿ}ÿƒÿ†ÿŠÿŽÿ‘ÿ“ÿ—ÿ›ÿ—ÿ•ÿ•ÿ—ÿšÿ—ÿ”ÿ™ÿžÿ¤ÿ ÿ ÿ£ÿ­ÿ´ÿ¬ÿ¨ÿ¢ÿžÿšÿ˜ÿ—ÿ˜ÿ—ÿ“ÿ”ÿ‘ÿ’ÿ•ÿ”ÿ•ÿ•ÿ“ÿ’ÿ–ÿ–ÿ—ÿ–ÿ™ÿžÿ¡ÿ¥ÿ¡ÿ—ÿ“ÿ”ÿ–ÿ–ÿ™ÿÿÿžÿžÿ¡ÿ¡ÿ¢ÿ¢ÿ ÿžÿ›ÿ™ÿ˜ÿ—ÿœÿžÿÿšÿ™ÿ›ÿœÿÿŸÿŸÿžÿžÿ¥ÿ§ÿ¢ÿŸÿÿ›ÿ˜ÿ—ÿ˜ÿœÿ ÿ¡ÿžÿÿŸÿ£ÿ¤ÿŸÿÿ›ÿšÿÿ ÿ£ÿ¤ÿ¤ÿŸÿ ÿžÿ–ÿŽÿÿˆÿ…ÿÿ|ÿ€ÿ}ÿÿÿƒÿ~ÿ€ÿ~ÿÿ€ÿ€ÿ~ÿ|ÿxÿtÿuÿvÿzÿxÿyÿyÿ|ÿzÿzÿzÿwÿyÿxÿwÿnÿjÿiÿkÿlÿiÿhÿgÿeÿbÿbÿ_ÿ^ÿ_ÿ`ÿfÿhÿdÿcÿfÿcÿaÿ`ÿcÿiÿgÿaÿ]ÿ]ÿaÿbÿbÿdÿeÿdÿgÿiÿgÿgÿgÿfÿfÿjÿjÿjÿiÿjÿjÿiÿlÿnÿsÿsÿtÿvÿsÿrÿrÿuÿyÿxÿ{ÿyÿyÿ}ÿzÿvÿtÿwÿtÿoÿnÿmÿlÿoÿnÿmÿnÿnÿpÿpÿmÿkÿiÿfÿfÿeÿdÿgÿeÿjÿoÿpÿpÿsÿsÿoÿrÿuÿvÿvÿsÿrÿuÿtÿyÿ{ÿ~ÿƒÿ‚ÿ…ÿ…ÿ‚ÿƒÿ†ÿÿ|ÿ€ÿ‚ÿÿ€ÿ‚ÿ‰ÿŠÿÿÿŽÿŽÿ‰ÿÿÿ‹ÿŽÿÿŒÿŠÿ„ÿ‡ÿÿÿ“ÿ“ÿ”ÿœÿ¡ÿŸÿžÿ›ÿžÿ¡ÿŸÿ™ÿ—ÿ™ÿšÿÿ›ÿ™ÿ•ÿ’ÿ”ÿ”ÿ‘ÿ’ÿ”ÿ’ÿ’ÿ—ÿœÿ›ÿ•ÿ’ÿ”ÿ“ÿ“ÿ‘ÿÿŽÿÿ“ÿ•ÿ•ÿ”ÿ™ÿ—ÿ’ÿ•ÿ“ÿ“ÿ’ÿ‘ÿÿ•ÿœÿŸÿ ÿžÿ¡ÿ ÿžÿœÿÿ ÿ›ÿ˜ÿ‘ÿÿÿŠÿŠÿŒÿÿ’ÿ’ÿŽÿ‹ÿŒÿÿŒÿ‹ÿŒÿÿ’ÿ”ÿ—ÿšÿ˜ÿ–ÿ˜ÿ—ÿ–ÿ”ÿŽÿ„ÿ}ÿÿÿ{ÿzÿ}ÿ|ÿ|ÿ}ÿ}ÿxÿsÿuÿxÿvÿvÿtÿtÿsÿrÿrÿtÿsÿpÿpÿmÿlÿnÿlÿkÿkÿnÿmÿpÿtÿrÿmÿjÿkÿeÿaÿ`ÿbÿfÿbÿ_ÿaÿeÿeÿcÿaÿbÿ_ÿbÿeÿdÿbÿ^ÿXÿXÿZÿ[ÿ\ÿYÿZÿaÿdÿeÿaÿ]ÿcÿiÿjÿbÿ]ÿ_ÿZÿVÿUÿZÿ^ÿ]ÿ^ÿ]ÿ]ÿ`ÿ^ÿ\ÿ[ÿ[ÿ^ÿfÿhÿjÿkÿmÿsÿsÿvÿxÿwÿuÿtÿtÿtÿvÿtÿ~ÿ~ÿxÿrÿmÿnÿmÿlÿcÿbÿ`ÿ]ÿ\ÿ^ÿ`ÿfÿjÿiÿiÿlÿnÿnÿqÿqÿnÿiÿfÿfÿhÿiÿkÿlÿmÿoÿoÿoÿtÿxÿ{ÿxÿtÿsÿuÿwÿxÿ{ÿ~ÿÿ‚ÿ‚ÿ…ÿ…ÿ…ÿ…ÿ„ÿ‚ÿ‚ÿ…ÿÿ‚ÿ…ÿ‰ÿÿŒÿŒÿÿ–ÿ–ÿ–ÿ•ÿ˜ÿ™ÿ–ÿ”ÿ‘ÿ“ÿ“ÿ’ÿ”ÿ”ÿ‹ÿ‡ÿ‡ÿ†ÿ…ÿ€ÿÿƒÿ‚ÿÿ„ÿ‡ÿ…ÿˆÿŠÿ‹ÿŒÿŒÿÿ‘ÿ“ÿ“ÿ—ÿ›ÿÿœÿšÿ˜ÿšÿ˜ÿ–ÿ•ÿÿŽÿ‘ÿ‘ÿÿ‘ÿ–ÿ™ÿœÿžÿŸÿ£ÿ¡ÿŸÿ›ÿ›ÿžÿšÿ“ÿŽÿÿ‹ÿ„ÿÿ„ÿˆÿˆÿ†ÿ€ÿ|ÿ}ÿzÿuÿwÿ}ÿÿ„ÿ‹ÿÿ‘ÿ‘ÿ’ÿ“ÿ‘ÿŒÿˆÿ„ÿƒÿ€ÿ~ÿ}ÿ}ÿÿyÿvÿzÿ~ÿ{ÿrÿsÿvÿsÿrÿuÿxÿvÿsÿtÿwÿxÿwÿtÿpÿjÿiÿkÿmÿiÿgÿiÿiÿeÿhÿkÿhÿfÿgÿmÿpÿnÿkÿiÿiÿgÿjÿmÿjÿeÿ]ÿ]ÿ^ÿ[ÿSÿPÿTÿVÿVÿSÿQÿVÿZÿZÿWÿYÿ`ÿgÿfÿdÿgÿjÿhÿaÿlÿrÿnÿjÿfÿlÿlÿiÿiÿlÿlÿgÿeÿaÿ_ÿ`ÿbÿdÿhÿiÿiÿkÿkÿlÿnÿlÿlÿkÿhÿiÿiÿkÿpÿuÿyÿwÿsÿsÿvÿvÿsÿqÿtÿuÿuÿvÿyÿ{ÿxÿtÿtÿtÿrÿrÿrÿnÿiÿjÿkÿgÿgÿkÿmÿqÿsÿtÿxÿ~ÿÿÿÿÿÿ€ÿ€ÿÿƒÿ…ÿƒÿƒÿ„ÿ…ÿ‡ÿ†ÿ€ÿ|ÿyÿ|ÿÿÿÿ€ÿ„ÿ‡ÿ…ÿ„ÿŠÿŒÿ‰ÿ‹ÿŽÿÿÿÿÿ‘ÿ’ÿ•ÿ˜ÿ•ÿ•ÿ—ÿ•ÿ”ÿ–ÿ–ÿ“ÿŽÿŽÿÿ‘ÿ“ÿ—ÿœÿ ÿ£ÿ¢ÿŸÿÿ™ÿ˜ÿ™ÿ—ÿ•ÿ’ÿÿŽÿ“ÿ“ÿ’ÿÿÿ‘ÿ”ÿ–ÿ”ÿ”ÿ•ÿ™ÿšÿŸÿ¤ÿ¥ÿ§ÿ¦ÿ¤ÿ¡ÿŸÿšÿ”ÿŒÿ‹ÿ‹ÿ‹ÿ‹ÿŽÿ”ÿ”ÿ–ÿšÿœÿ™ÿ™ÿ˜ÿ”ÿÿ‘ÿ–ÿ•ÿÿ“ÿ›ÿÿžÿžÿ›ÿ”ÿÿÿÿˆÿ‚ÿ|ÿxÿtÿuÿwÿvÿvÿtÿvÿyÿ}ÿ€ÿÿÿzÿvÿtÿsÿuÿyÿ|ÿ~ÿ~ÿÿ~ÿ{ÿ|ÿ}ÿ}ÿzÿyÿ}ÿ~ÿÿ€ÿ…ÿ‰ÿˆÿ‰ÿ‡ÿ†ÿ†ÿŒÿŒÿ„ÿ€ÿ|ÿyÿtÿqÿrÿvÿoÿeÿbÿdÿhÿjÿkÿhÿgÿgÿhÿkÿlÿoÿkÿcÿbÿbÿcÿbÿ\ÿ^ÿ^ÿ[ÿ\ÿYÿZÿ_ÿ_ÿ`ÿ`ÿaÿgÿhÿgÿeÿdÿdÿhÿmÿrÿwÿzÿzÿyÿ€ÿ€ÿ}ÿxÿsÿuÿqÿrÿqÿrÿrÿrÿtÿwÿ|ÿ|ÿ}ÿ|ÿ|ÿzÿxÿvÿwÿwÿtÿsÿuÿvÿrÿqÿuÿzÿuÿoÿhÿlÿiÿqÿjÿjÿ~ÿkÿzÿ„ÿsÿÿÿmÿ}ÿ|ÿyÿ|ÿwÿzÿ~ÿxÿzÿtÿpÿ_ÿQÿÿ÷þ`þôý¬ìþ´ÿØÿ|ÿ¬ÿŒÿ²ÿÀÿÜÿ|ÿLþUÿœÿšþlÿ–ÿwÿxÿÿ ÿ¸ÿlÿ^ÿDÿdÿŽÿ)ÿÿ1ÿ3ÿcÿ-ýþ¶ÿ#ÿúÿ%ÿÿÿÇþEÿìþoþ4ÿ-ÿ—ÿàÿaÿfÿÿ ÿnÿ-ÿjÿeÿLÿsÿ¡ÿXÿÿLÿÿ)ÿ ÿ(ÿ.ÿ[ÿFÿ$ÿBÿBÿ;ÿLÿ2ÿÜþÿÝþÅþÿÀþRÿÿjÿ\ÿ)ÿ?ÿ!ÿ*ÿ8ÿMÿ{ÿ˜ÿmÿvÿ›þ­þ?ÿ¡þ ÿÿ(ÿ$ÿÎþ'ÿ6ÿ?ÿíþ"ÿ¨ÿ½ÿ­ÿ|ÿ]ÿ…ÿ¸ÿRÿ}ÿÕÿ«ÿ•ÿ´ÿ©ÿ¨ÿœÿcÿoÿ¨ÿ™ÿ°ÿÍÿºÿ£ÿ›ÿÅÿÚÿãÿÌÿÂÿáÿ& øÿ ïÿñÿéÿ&4B.2E-->8øÿ.ÿÿ þÿòÿëÿéÿëÿàÿÙÿâÿÊÿÊÿÂÿãÿÄÿµÿ»ÿ£ÿÇÿÿšÿ²ÿ¨ÿ¯ÿœÿ¤ÿ¡ÿ¢ÿ’ÿ†ÿ¨ÿ¸ÿ¬ÿ¦ÿ©ÿ«ÿ¦ÿ²ÿÁÿÙÿ÷ÿçÿúÿ&>Pk„{“°³®»ÝÀÂÐÒ¾½«¹º®Úßî7RgUU¹Ðǵ¢Åت^+ÛXÏÿ„ÿNÿ(ÿÖþgþhþsþ*þÓý±ý¸ý¹ýý—ýÝýþüýÊýÑýëýÜý²ý¥ýÙýþþ÷ýôýïýÓý¥ýxýbýmýsý~ý›ýºýµýƒý]ý_ý†ýý¢ý·ýèý!þ<þHþ^þwþˆþ©þÝþ1ÿ‰ÿµÿÊÿìÿJuƒÔúH–í :{ÒÝþI¤ ‹Í RqÚï#SÿWfÆÿiÿïþ%þÅýwýØü:üºûÙûüwý¾ýÅýÚýéýþYþÀþÿ,ÿZÿ­ÿ4Àµ.Âÿbÿ:ÿÿíþÁþ’þTþûýÐý»ýýý’üTürüÄüý ý*ýWýtýªý÷ý.þHþkþ‘þÝþHÿsÿoÿ>ÿ ÿìþÝþ×þˆþ þ¯ý_ý3ýEý4ýýÆü]ü)üCü~ü–üšü üÝü ýýÐýíýþþBþ—þ ÿBÿ^ÿyÿ„ÿœÿÃÿËÿ­ÿ—ÿ‡ÿ‚ÿ¨ÿÕÿÖÿÁÿ³ÿ®ÿ³ÿÏÿòÿ$Z©Jw¨ê 0æ?y°Üóåõ-b“æÖ7VOK‡çÿHÿöþ¥þ[þ1þ þ¶ý3ý©ü?üüüûRüÄü0ý’ýÕýþuþ·þËþçþþþÿ^ÿ­ÿùÿ.>)øÿ¹ÿ…ÿGÿÿÁþuþ#þùýÙý™ýNýûü‘ü>ü üÝûØûßûõû#üaü¢üêü,ýfý–ýÃýþ`þ§þçþÿ(ÿ9ÿDÿ7ÿ ÿÿèþÇþÀþÄþÒþçþîþóþìþùþÿ ÿ7ÿZÿwÿ ÿÍÿûÿ(M{¦Ëû+S‚£Âð+Cav•µÛ?l¨à&KÄÛú€oLÖt;ßÿšÿ[ÿ ÿˆþçýiý-ýBý…ý¦ý¬ýŸý´ýþNþbþ\þVþdþ™þËþÿlÿ¹ÿßÿÚÿÆÿÈÿÏÿºÿŽÿRÿ&ÿÿÿ ÿõþÌþ„þ@þýýÉý™ýgýDýAýkýºýþbþ‡þ|þaþbþtþ‰þ™þ³þÂþÝþíþôþ÷þâþÏþµþ»þÖþþþÿÿÿÿÿÿ#ÿ#ÿ&ÿ(ÿ)ÿ,ÿ?ÿ_ÿyÿ‰ÿ‘ÿŸÿ´ÿËÿØÿÞÿçÿóÿ4Jas€‘¤±¶½Ïäù (Ch‘¯À©xA嵊mV6Øÿ£ÿbÿÿ¿þ{þRþ8þ!þ þûýôýüýþþ þþþ þ)þ7þNþdþzþþ|þzþ}þ~þxþrþqþtþƒþþ£þ®þ²þµþ²þ°þ­þ°þºþÂþÏþßþçþñþñþíþëþëþëþîþíþëþëþìþóþ÷þÿÿÿÿ ÿÿÿ%ÿ.ÿ7ÿBÿLÿXÿbÿoÿ{ÿ…ÿ‘ÿ ÿªÿ®ÿºÿÇÿÓÿÛÿæÿóÿ  +.6BKPWaku…“žª³½È×äôÿÿñãÔÌŲ ‹{o]H-îÿËÿ¬ÿŠÿpÿUÿ@ÿ'ÿÿÿïþÞþÐþÀþ­þŸþŽþ€þwþrþrþrþnþmþlþiþeþbþaþ`þaþhþlþrþwþ‚þ“þ›þ¡þ§þ®þµþ½þÃþÇþÐþÞþçþóþýþÿÿÿ ÿÿÿÿÿÿÿÿ$ÿ)ÿ,ÿ0ÿ5ÿ:ÿAÿCÿFÿLÿTÿ`ÿiÿlÿoÿsÿxÿ}ÿ‡ÿÿ–ÿžÿ¤ÿ¯ÿ¸ÿÀÿÍÿÖÿàÿéÿïÿôÿøÿ $-4:CJOUY_cjs|†Šˆ‚}~xutncXK9)øÿâÿÊÿ­ÿ”ÿÿmÿXÿAÿ*ÿÿÿöþéþÞþÏþÂþºþ¸þ¬þžþ˜þ–þ˜þ™þ—þ˜þ›þ þ¡þ¥þ©þªþ¸þÁþÀþÄþÏþÔþØþØþçþðþòþüþÿÿÿ"ÿ/ÿ:ÿ=ÿ>ÿ>ÿ>ÿIÿTÿTÿXÿ_ÿjÿtÿsÿvÿ{ÿ€ÿƒÿÿ‚ÿ…ÿ‰ÿŒÿÿ˜ÿŸÿ£ÿ¦ÿ¨ÿ¬ÿ°ÿ°ÿ²ÿ³ÿ·ÿÂÿÈÿÊÿÌÿÐÿÚÿâÿèÿìÿñÿúÿÿÿ%*08@DEISY[_dkponrnea]QHGG;) ñÿáÿÍÿ¹ÿ¨ÿšÿÿ|ÿiÿ[ÿKÿ6ÿÿÿÿôþèþáþÙþÇþÄþÂþ¿þ½þ´þ°þ¯þªþ¤þªþ¯þ²þ³þ³þ¶þ¼þÂþÊþÊþÎþÚþàþçþëþòþøþÿ ÿÿÿÿÿ$ÿ*ÿ1ÿ8ÿ=ÿAÿAÿAÿEÿNÿQÿOÿMÿQÿVÿ[ÿ\ÿ`ÿeÿdÿfÿpÿsÿuÿwÿyÿzÿxÿ{ÿ€ÿ†ÿ‰ÿ‘ÿ‘ÿ‘ÿ•ÿ™ÿ£ÿ¨ÿ«ÿ­ÿ°ÿ´ÿ¸ÿ»ÿ¼ÿÀÿÇÿËÿÐÿÔÿÚÿßÿâÿèÿèÿçÿçÿëÿîÿìÿìÿïÿöÿþÿ !$&'$õÿìÿÝÿÐÿÁÿ´ÿ¥ÿ•ÿ†ÿuÿhÿZÿMÿCÿ:ÿ,ÿÿÿÿ ÿÿûþñþêþâþßþÜþÚþÓþÐþÏþÎþÐþÎþÍþÎþÖþÝþÚþàþçþïþ÷þûþýþÿ ÿÿÿ$ÿ-ÿ2ÿ7ÿ?ÿEÿKÿRÿWÿ^ÿdÿfÿhÿiÿiÿlÿuÿ{ÿ}ÿ€ÿÿƒÿŽÿ™ÿžÿ ÿ¡ÿ¦ÿ®ÿ²ÿ±ÿ±ÿ·ÿºÿ¾ÿ¿ÿÄÿÍÿÒÿØÿØÿ×ÿÚÿàÿäÿãÿâÿâÿæÿîÿñÿ÷ÿÿÿÿÿ !""')($! !!$&$ÿÿñÿæÿãÿàÿÖÿÌÿÅÿ½ÿ²ÿ¥ÿ–ÿ‰ÿ~ÿoÿbÿWÿSÿKÿAÿ8ÿ5ÿ1ÿ+ÿ"ÿÿÿÿÿÿ ÿ ÿÿÿ ÿÿÿÿÿÿÿÿÿþÿÿÿÿÿ ÿ ÿÿÿÿÿÿÿ!ÿ'ÿ(ÿ-ÿ.ÿ1ÿ7ÿ:ÿ>ÿDÿMÿSÿVÿXÿWÿ[ÿaÿdÿhÿiÿmÿoÿnÿuÿxÿxÿzÿÿ„ÿ‡ÿ‰ÿ†ÿ†ÿ‚ÿ„ÿ“ÿ“ÿÿ’ÿ–ÿšÿœÿÿ ÿ ÿœÿ›ÿ›ÿŸÿ¡ÿ¡ÿ¤ÿ¬ÿ³ÿ¹ÿ¾ÿÂÿÄÿÆÿÌÿÑÿÕÿÖÿÜÿáÿãÿäÿãÿåÿåÿáÿàÿÝÿÜÿÚÿ×ÿÚÿØÿ×ÿÚÿÚÿÓÿÐÿÎÿÌÿÆÿÁÿ»ÿ´ÿ«ÿ¤ÿÿ—ÿÿ‡ÿ…ÿ}ÿrÿnÿjÿbÿYÿPÿJÿEÿ@ÿ=ÿ?ÿ<ÿ:ÿ7ÿ4ÿ2ÿ-ÿ-ÿ+ÿ*ÿ,ÿ)ÿ'ÿ$ÿ$ÿ$ÿ(ÿ+ÿ2ÿ3ÿ5ÿ6ÿ8ÿ3ÿ5ÿ6ÿ:ÿ;ÿ:ÿ@ÿ6ÿ6ÿÿ$ÿÌý÷ý±ÿ½ÿeÿTÿYÿGÿaÿcÿuÿsÿuÿ{ÿ‚ÿŒÿ˜ÿ‘ÿ‹ÿÿÿŒÿÿ®ÿ¯ÿ³ÿ¯ÿ®ÿ°ÿ¶ÿºÿ¶ÿ©ÿ¬ÿ»ÿÂÿ¸ÿªÿ¹ÿÇÿÅÿ¿ÿ»ÿºÿ¼ÿÀÿÂÿÀÿÃÿÅÿÊÿÎÿÑÿÒÿ×ÿÛÿäÿßÿÛÿâÿâÿåÿëÿëÿçÿãÿãÿàÿÖÿ×ÿ×ÿÕÿÐÿÎÿÔÿÈÿÅÿÓÿÏÿÍÿÊÿÆÿÅÿ·ÿ¯ÿ­ÿ©ÿ¦ÿžÿ™ÿ—ÿŠÿˆÿ”ÿ†ÿwÿwÿiÿcÿ`ÿ[ÿbÿPÿRÿLÿEÿDÿ=ÿ8ÿ3ÿÿÿÿÿÿþþùþîþüþóþ÷þöþñþñþçþçþïþðþïþñþñþ÷þñþóþöþéþîþüþñþçþêþïþõþùþûþÿþÿ ÿÿÿÿÿÿÿ#ÿ+ÿ,ÿ/ÿ!ÿ5ÿ9ÿ,ÿ@ÿHÿ7ÿGÿYÿ>ÿTÿXÿ8ÿZÿ[ÿYÿXÿ\ÿgÿjÿjÿvÿwÿuÿ‚ÿÿ‹ÿ‚ÿ‡ÿ†ÿ‰ÿÿ“ÿœÿªÿ¥ÿŸÿ¥ÿªÿ¯ÿ¦ÿ¦ÿŸÿ§ÿ¢ÿ¨ÿ°ÿ®ÿµÿªÿ®ÿ·ÿ°ÿ²ÿ·ÿ¸ÿ²ÿ²ÿ¾ÿ½ÿÃÿÆÿÃÿÉÿÈÿ¿ÿÆÿÎÿÅÿÓÿÐÿ¼ÿÂÿÂÿºÿ¸ÿ±ÿ±ÿ¸ÿ®ÿ­ÿªÿ—ÿšÿÿ–ÿŒÿ“ÿŒÿŒÿƒÿvÿƒÿ{ÿtÿsÿqÿkÿpÿgÿhÿiÿ_ÿ^ÿRÿYÿSÿOÿ[ÿMÿGÿJÿKÿMÿKÿIÿAÿ?ÿCÿAÿDÿ=ÿDÿMÿNÿNÿNÿQÿbÿcÿiÿoÿ^ÿfÿzÿwÿÿ‚ÿ|ÿŠÿÿŽÿ…ÿÿœÿ˜ÿ“ÿÿ¨ÿ ÿ¹ÿÉÿÀÿÐÿÈÿÞÿêÿãÿøÿùÿ-:GQ`dn‡’—œ«·ÉÕÕø  #286Ty|ƒ§¸Êâð$>kic{uiiz„’§´´ÎÄ»ÈØØØÈÄÑËÐu?8ïà)à´¢µÜ  =@%Êt:.PdQ,ë¨jCàÝ´pC'êÿ·ÿaÿÿÜþ­þdþ:þ þÎýý]ýýãü¶ümüNü*üèû‡ûdûHûûØúžú¤úlú=úüùÕùÄù—ù“ùxù^ù*ù ùùøûøùðøóøÿøâøÑøÃø¾øÒøòøù1ù,ù!ù4ùKùEùùåø¸ø¦ø¥øµø¡ølø/øì÷§÷…÷€÷‡÷™÷¦÷’÷t÷b÷\÷k÷€÷‘÷³÷Ù÷õ÷ øøAø|øÉø ù)ù)ù-ùIùwù¬ù÷ù9úmú’ú˜ú—úªúÎúðú ûûéú±úNúùùçùúNúŽúÄúóúûû%û1ûJûqûƒûŸûÂûÛûüWüxüˆü†ü„üŒüŠüÐü%ýjý¬ýÈý¾ý¦ý´ýëý+þ9þ6þFþdþ~þ‹þ•þ·þÿQÿzÿÃÿ"YŽã@‘×G~ÖA»;¡ÄF\ObÀV àÿÙÿÄÿ‚ÿÿÀþþcþ!þÚý´ýÚýCþæþÈÿËÈ•)ˆÁ}Ãcû‚óL…³ÒÏ£_5?|Ð$ _ t S ×5‰ÿ»¼þyÅ^ ¼ ï ü ó æ Ð Ù  ` ¦ Ñ Ó ³ b ñ ˆ 5   ; l œ ¹ ¸ – g :   V ´  l ¬ Ó î ß Å ¿ Ù ú - t ¾ O ›  U 1 ö è 8k VM…R–[ÿþÖüÂûýúuú/ú.úlúùú½û±ü°ý€þÄþiþ´ýýÂüæü^ý þ¶þÿÿ¤þêý#ýZü™ûÉúöù;ù¾ø‘ø‘øøYøý÷`÷‘ö›õáô·ôõ¼õ}öX÷$øÊø4ù’ùüùeú¯ú×úóú0ûŠûîû>ü|üšü_üÖû.û¡úGú'ú-úXúúÃúáúòúû3ûdû®û%ü´üMýúýÄþ¯ÿ–Y ²GÃ1¼oAPÀ%kU¤ýtûåù]ù’ùBú@úxùløw÷¿öö—õwõÛõaö6÷iøú*üþ‚ÿC)¦ÿÿÏþÿ…ÿH p"ckÿþŒý]ü0û'úJù£øTø‘ø4ùÜùúóùZù¦ø,øø|ø>ùNúKûüaü…üŸüÞü,ýiýuý`ýaýuýý™ý·ýÂýýèüü+ûºú¢úËú#û›û&üüÖüýý=þØþQÿ¶ÿ,·KÉ·lüJvÀ'ÌjU e R í­„þnûú¦ùTú™ûŒü4üûÇùÁøGøÒ÷Ø÷gø?ùsúàû™ýÒÿߌJøÌé»#ïåQ*à•ÿcþ3ý8üaû¯ú>ú2úÐúßûäüÅý þ¿ýøü!ü¿ûüîüþ3ÿ°¶zGATR# DuÏËaÿ´þ$þ þuþÿÑÿ™,w˜Ú^ü›-ÊdÚVÞv^¨ì@ 5 í î ä ñ W  9Vÿý;ü£ü þVÿ¶ÿ­þjýþûûkúú“úŽûÆü)þ§ÿ¡¨1 Å¿;ÇÔ©"õŸŒ¯M¬þ'ý§û}úÈùWù(ùùœù úÇû¹ü5ýFýÁüÑûþú¿ú.ûü ýâývþƒþ"þýýèüãüàüÖüæü ý)ý&ý0ý9ýý“üàûLû$ûfûõûÅüºý™þ&ÿbÿ‹ÿÛÿ\õ‚©)´3Ét€Þ6“)ö @ ‹ 5 ( |¸þäúwùhùµú[üQýþüÔû»úpùõø øù-ú>û˜üþÉÿödÉœÏ@gÿ{ÿ3L¶pÿØýüŠúFùÖø°øœøªøùÿù(ûEü%ýµý¼ýýøû!ûû§û¥üµýþÿéþ,þ[ý¾ü£ü¤ü°üáüýSýNý3ý1ý7ýý†üúû¯ûÈû4üðüþý)ÿ x”»m÷šg˜ðX Íy¸J ß z u ¯ S 7 þ5Wý5ú¯ø¹ø}ú¬üÃý ýœû8úùƒø_ølù+û¶üÿý ÿ”œ_©ýjÿ ÚþªþQÿ0tÐÿhþ…ü¬úÿøç÷Å÷ø›øñøYù2úTûpüNýÕýþÔýý üÉûüÈütýÎýìýšýýFü¹ûÉû(ü„ü©ü¶üÄü·üü¢üÊüáü½üiü,üBü¦üRý>þDÿAÄãù5ÅjÔp´ÐŒmeJ. Ø s ë Ž Ø ¦ ­ &'mý†úúøÂøÍúžý=ÿUþ˜üû úFùÃøåù1üNþ ÿW©’),ZÝ Háþ˜þsÿnÖLöþýìúùøÕ÷ø÷ÆøÇùfúíúÄû·ü}ýþ•þùþÃþÒýÚüeü‘ü:ýæý\þUþ±ý¯ü‹ûÆúÞúûuü$ýuý‚ý#ýüPüYüŽü¼üÆüÖüõü*ý¯ý€þ’ÿ‡ý"5„ü±–téDÅ„_^` _ $ ¼  ž ´ W²£ý¸údø…÷<ùÀü'ÿ”þ{ü(ûúéøš÷øåú¾ýVÿLoÈà¤Ô¡¸þþžþÇÿy/ ÿLý5ûäøéö„ö‘÷$ùIúðúæûýÜý þþJþ~þõýý{üÌü—ý7þ€þ_þÌýÄüuûhú;úôú"ü7ýÒýþ«ýý]üü5üyü¼üýdýµýþŽþrÿƒ4v ×=ŠöÎÉ”Çô„phC A S G …  ¦ßƒý¿ú”ø˜÷ù‹ühÿ&ÿæülûžú’ùñ÷Ö÷Šúòý¾ÊôÉCÏJ­Püþ1þ¥þ²ÿYÿyýûUù6÷]ö0÷ù“úqû[ü˜ý}þ£þZþ`þÂþ¹þþMýHýÞý†þÛþûþŸþ©ý:üºúëùóùÀúü?ýþþ˜ýóü€ü4ü!üNüàü§ýþVþ§þnÿQÌçP¨â;C+}v¡3Ú›{É O } á ’ ´ÉiüëùøÝ÷<úòý_ZÿÒüAû#úÌøl÷øVû°þ] 5SÎßdæ(‹.sþ,þ ÿQúpÿýÐú{øzö+ö©÷Ìùpû1üöü þˆþZþþmþ9ÿBÿeþ´ýý þ~þrþiþ,þ{ý ü*úùNùEú„û¼üÃýFþÓýâüü³ûÖû)üÄüý0þ‚þ¥þ÷þœÿbŸŒþTþàGk¨_2 v  ž Í š £ þåú°ø„÷ñøÈüfè'þ¦ûUúúøx÷éöŒùËýcØlLÓJÇg—¼§ÿÅþ<ÿzk3îÿþ²û[ù0÷+ö3÷kù“û©üý­ý+þþŸý­ý½þŽÿŠÿ4ÿÿ•ÿ¼ÿKÿµþ,þý~üDû•úŸú÷ú‹ûü°üõü§üCüü\üŸüÃüý‘ýþ1þ&þoþ:ÿÍÿõÿüÿd9Ð~[OÐÑì‰\,ñ ¹ ' o p ©ê£ýïú`ùšøeú þL5éý'ûÉùvø(÷÷ú’þ(á2†)F½–§Ôÿ°Ôc•Æÿ„ýûÏø÷¦ö3ø¦ú­üeý1ýCýHýÈüUü™üþ•ÿ 8oë4ÀØÿÂþQý•ûúUù®ùÉú"üDýýÿüÓûŸúúZúAû|ü¾ý»þùþVþ€ý$ý~ýþ‡þ(ÿ òmx„K®µÐq=þ×ü‚   1  h˜Öü¶ú‚ùwùÕûwÿüÒïüüù)øÄöëõíöûšÿÞ6-÷¦,n}øøIŠf±ý®þMü úpø“÷@øwú¬ü¿ý@ý8üµû8û±úÑú$ü]þûÿ|aPo[ÿfþ{ý¯üäûiû™û]üaýþÒýìü¸û¯ú.útú|ûåüþ¿þ­þíýëüVüšüŠý¦þ·ÿ³‰÷ìÛAðrÝtbrR\ ˜  K 8Ð ^ Dþü2ûÊúÉü2ŒsàüTùË÷®öößöëúßÿ0aµZè!ŽÚ¾°6x + oþOüŠúÊùÀù‘úüõýþ¡üˆú€ùFùgù?úü¤þg‘ÿ\ÿÿ^þœýUýcýLý=ý{ý+þ‰þþâü—ûµú^ú¢úÌûSýbþþáýþüüXûû§üfþÞÿ†½ïWmoñ,ž¯°›… Í  + ×  &Áÿ@ýý“ü‘ýxVÈIý·øJ÷¬ö•öE÷Aúôþ`á¢ÿSÿÞÿ›ÿ1‘W0,³$οMþýKüBüáülýOþ~þ.ýöúÀøØ÷rø}ùÎú¡üUþÿwþ?ý»üÔüñüý!ý˜ýþ$þ4þþþÓý ýfüüFüÏüfý þ]þîýøüÿûˆû·ûMüAý¤þ´ÿ%âÿwÿËÿwl„¡ò±öXfã  x u C z•qþˆþøþuÿ°dþþVùÃöaöÀöÍ÷ úÓýRÿ…ý•üÜü´ý1þ:ÿSôÜ ïZü¶ Qÿ`ÿÃÿdh#^ÿfýéúù«øÓù4û;ü)ý«ý)ý€ûøùÛùûUüeý\þâþ¹þÊýýøüYýìýCþuþËþäþÔþŠþ<þþ¬ý ýÑü ý¥ý/þšþùþ:ÿÿ¾þÇþÿÞ4R7Ú.b1 Ò X á & Øñ홈DÀ+þYùà÷cønù³ú™üÆþÿòüÐúOúûšüºýKÿ<&jðS3Ûx'Œ9¸Ç ÞXÿZýÀûdûIüËýþBþýIüÀúXùÀøÇù…ûÞü‚ýyýúü2üZûû°û¼üêý«þöþÿÌþTþØýšýáýþSþšþÚþ ÿÆþSþ+þ?þ„þçþŒÿ…cØEÂ9HˆA * ë Ø_ì¥7-’øý»ùœùªúüIý¥þzÿ:þ~ûŸùfùfúü™ýeÿ¢—:—ÿ_ÿŸÿ»ÿPŸ[´“éÍÿíþ3þ@þþþÜÿS¡ÿHþðüû³ú®úŒû ýÍýIý[üAûmúôùâù+ûÎüäý9þ£ýQýýëü@ýäýòþÀÿ¹ÿ<ÿ»þ}þˆþþÅþ|ÿ#pSQ½£hþ2W¾T ¨< ÀÉáiƒ§¦Ì°¨ýpüXý´þžÿ¾ÿuÿÎþ^ýåû…ûúûý8þäþDÿèþAþ"þIþ¯þÿ=ÿÂÿ?suI(¢ÿTÿ@ÿaÿÞÿLSçÿ ÿ\þþÈýãý?þ¿þÿ³þÇýÿüü•üîüsý6þÉþÿþÏþTþ þþ^þÓþ-ÿhÿ|ÿ@ÿãþ¹þ·þÿ]ÿƒÿÁÿÌÿ›ÿgÿHÿ}ÿ«ÿÓÿôÿíÿðÿÕÿËÿëÿ\‹š¢¡ºú\¨¶¶Í)~‹s*®.ØÿÌÿûÿ7VAãÿaÿöþÁþËþûþ&ÿ@ÿ?ÿ)ÿÿåþÐþÄþÛþöþ ÿ ÿþþòþêþçþãþäþÞþÞþÜþÜþÚþæþðþòþîþÜþÐþÂþÄþÕþâþãþÝþ×þÌþÃþµþªþµþÅþÌþÍþÀþ¶þ¸þ½þÎþ×þãþìþõþÿÿ ÿ#ÿAÿVÿ[ÿ[ÿ`ÿjÿuÿ€ÿŽÿÿ§ÿ¡ÿ ÿ¨ÿ¹ÿËÿÚÿïÿ'2ATi‚™¤¦«²»Á¿·±¤|eWLA5üÿßÿÄÿ«ÿ—ÿ‰ÿ}ÿsÿbÿQÿFÿ@ÿ:ÿ1ÿ,ÿ(ÿÿÿÿÿÿ ÿÿÿþúþúþøþõþôþöþþþýþûþ÷þóþìþîþôþüþÿ ÿÿÿÿÿÿ ÿÿÿ ÿ ÿÿÿ)ÿ1ÿ9ÿ<ÿ2ÿ#ÿÿÿ)ÿ:ÿIÿ[ÿgÿhÿ`ÿWÿ^ÿlÿwÿÿ…ÿ—ÿ¢ÿ²ÿ´ÿ®ÿºÿÉÿÛÿçÿìÿðÿñÿöÿùÿ0>FKHD?CS_c_[UNA/ùÿíÿÙÿ¾ÿ¯ÿ§ÿ ÿžÿ™ÿ“ÿ…ÿsÿbÿOÿAÿ:ÿ7ÿ6ÿ5ÿ3ÿ/ÿ'ÿÿ ÿÿ ÿ ÿ ÿÿÿ ÿÿÿÿÿÿÿ"ÿ%ÿ%ÿ"ÿ+ÿ.ÿ-ÿ.ÿ.ÿ/ÿ0ÿ2ÿ6ÿ8ÿ;ÿ9ÿ5ÿ4ÿ,ÿ-ÿ4ÿ>ÿAÿEÿMÿPÿLÿDÿDÿLÿ^ÿoÿxÿÿƒÿ†ÿ‰ÿˆÿ…ÿ‰ÿŽÿ’ÿ–ÿÿ ÿ¢ÿ¡ÿ˜ÿ‘ÿŒÿŠÿ‹ÿ–ÿ›ÿ™ÿ•ÿ“ÿ—ÿ—ÿ’ÿ•ÿÿ¨ÿ¶ÿ½ÿ½ÿ·ÿ´ÿ±ÿ´ÿ½ÿ¿ÿÂÿ¾ÿ´ÿ©ÿ£ÿšÿ’ÿ”ÿ—ÿ”ÿ‡ÿxÿmÿbÿYÿQÿPÿPÿNÿOÿOÿNÿGÿ8ÿ,ÿ*ÿ+ÿ-ÿ+ÿ,ÿ/ÿ3ÿ6ÿ,ÿ"ÿÿÿÿÿÿ"ÿ+ÿ+ÿ&ÿÿÿÿ!ÿ!ÿ"ÿ(ÿ+ÿ,ÿ*ÿ.ÿ6ÿ6ÿ8ÿ>ÿEÿNÿTÿYÿ`ÿdÿfÿmÿpÿqÿwÿ~ÿƒÿ‹ÿ’ÿœÿ¥ÿ¥ÿ¤ÿ¥ÿ§ÿ©ÿ­ÿ®ÿ¯ÿ®ÿ®ÿ±ÿ³ÿ¿ÿÉÿÑÿÓÿÑÿÐÿÌÿÊÿÄÿÇÿÊÿÊÿÐÿÖÿÓÿÊÿÆÿÅÿ¿ÿ´ÿ°ÿ­ÿ©ÿ¡ÿšÿ™ÿ“ÿÿ†ÿƒÿ…ÿ‡ÿ‡ÿ†ÿ†ÿ†ÿ…ÿÿ}ÿzÿ{ÿ~ÿ…ÿ‰ÿÿÿÿŠÿ…ÿ†ÿŠÿŠÿ‡ÿ†ÿ‚ÿ€ÿ{ÿyÿ}ÿ‚ÿƒÿ}ÿtÿuÿyÿtÿsÿrÿsÿqÿoÿlÿmÿrÿvÿwÿ{ÿ|ÿ|ÿ}ÿxÿqÿsÿxÿvÿwÿ|ÿ‡ÿ‹ÿÿ™ÿ£ÿªÿ¨ÿ¥ÿ¢ÿÿÿžÿžÿžÿŸÿ¡ÿ§ÿ§ÿ¤ÿ¥ÿ£ÿ¡ÿÿÿ ÿ¢ÿ ÿ£ÿ¤ÿ£ÿ¡ÿœÿ•ÿ’ÿÿÿˆÿ„ÿ€ÿxÿqÿmÿlÿlÿlÿmÿgÿgÿlÿrÿtÿpÿoÿoÿsÿuÿyÿ~ÿ€ÿ}ÿxÿxÿyÿxÿxÿyÿwÿrÿkÿeÿ_ÿZÿ]ÿ]ÿ[ÿ^ÿ`ÿbÿ`ÿ_ÿ`ÿcÿeÿ`ÿ\ÿ]ÿ^ÿbÿdÿbÿbÿdÿgÿhÿbÿ^ÿbÿeÿhÿbÿ]ÿ^ÿ]ÿ_ÿdÿkÿrÿtÿqÿpÿqÿqÿpÿnÿpÿpÿlÿjÿjÿgÿdÿbÿcÿhÿiÿfÿeÿfÿiÿlÿhÿcÿgÿlÿmÿiÿeÿhÿjÿjÿiÿgÿhÿbÿ^ÿbÿcÿoÿvÿyÿ|ÿxÿvÿvÿwÿtÿvÿvÿqÿrÿuÿxÿzÿ}ÿ„ÿ‹ÿÿ•ÿ”ÿ•ÿ—ÿ—ÿ“ÿÿÿÿ”ÿ–ÿ•ÿ–ÿ”ÿÿÿÿÿÿÿÿ‘ÿ“ÿ•ÿ”ÿ’ÿ”ÿ—ÿ•ÿ—ÿ˜ÿ—ÿ’ÿÿÿ‡ÿ‰ÿ‹ÿ‹ÿŠÿŠÿÿ‘ÿ‘ÿÿÿ’ÿ˜ÿœÿœÿžÿ¡ÿ¦ÿ¦ÿ¢ÿ¦ÿ¨ÿ«ÿ¯ÿ°ÿ²ÿ²ÿ¬ÿ§ÿ§ÿ¦ÿ¤ÿ¡ÿ›ÿ›ÿ£ÿ¨ÿ©ÿ£ÿœÿœÿœÿšÿœÿŸÿ¤ÿ©ÿ®ÿ¯ÿ­ÿ¨ÿ¨ÿ§ÿ¤ÿ¢ÿ¡ÿ£ÿ¥ÿ§ÿ£ÿÿ™ÿ›ÿ¡ÿ¥ÿ¢ÿœÿÿŸÿÿœÿÿšÿ—ÿ•ÿ‘ÿŒÿˆÿ‰ÿŒÿÿŽÿÿÿ’ÿÿ†ÿÿƒÿ‡ÿ…ÿƒÿ‡ÿŒÿŒÿÿÿŽÿŽÿˆÿ„ÿ…ÿƒÿÿÿƒÿÿ{ÿyÿzÿuÿtÿyÿvÿlÿiÿkÿkÿjÿiÿfÿbÿ^ÿ^ÿgÿoÿrÿuÿqÿpÿqÿoÿpÿnÿlÿkÿnÿpÿmÿkÿlÿjÿjÿgÿfÿgÿgÿdÿ`ÿ]ÿ]ÿbÿeÿjÿjÿiÿjÿjÿmÿsÿsÿnÿhÿcÿbÿbÿeÿeÿdÿgÿiÿlÿmÿnÿmÿjÿnÿkÿgÿqÿmÿgÿgÿaÿaÿdÿfÿaÿ\ÿUÿPÿQÿVÿZÿXÿVÿWÿ]ÿcÿfÿeÿgÿlÿiÿfÿgÿkÿqÿpÿlÿkÿoÿvÿyÿ}ÿÿ{ÿzÿyÿyÿ|ÿ|ÿ}ÿ~ÿ€ÿ…ÿŠÿÿ”ÿ–ÿ•ÿ˜ÿ›ÿ›ÿ™ÿ“ÿŒÿˆÿ„ÿ‚ÿÿÿˆÿŽÿŒÿŠÿ‹ÿÿÿŽÿŒÿ‰ÿ‰ÿ‰ÿÿÿ‘ÿ“ÿ”ÿ“ÿ“ÿ”ÿ•ÿ˜ÿ•ÿÿÿ“ÿœÿ˜ÿ’ÿ“ÿšÿŸÿÿœÿžÿŸÿŸÿšÿ•ÿ“ÿ”ÿÿÿ•ÿ–ÿ‘ÿÿŒÿŽÿŽÿÿŽÿŽÿ‘ÿÿŒÿ‰ÿŒÿÿ“ÿÿ–ÿ’ÿ–ÿŒÿŒÿƒÿƒÿvÿtÿÿ þòþÐÿ`9éþÄþ!ÿ ;ªÿ'ÿÿ“ÿáÿÒÿ{ÿVÿyÿ¨ÿ¼ÿ”ÿ„ÿqÿ˜ÿ¢ÿ…ÿŒÿ•ÿ¬ÿ‹ÿhÿoÿšÿ¯ÿ«ÿÿÿžÿÿ‰ÿ‚ÿ‚ÿ™ÿšÿ’ÿbÿ}ÿ”ÿ¼ÿ´ÿRÿiÿ´ÿ—ÿ­ÿ¯ÿ@ÿ\ÿlÿ«ÿ¥ÿYÿPÿ]ÿ®ÿtÿfÿ]ÿ:ÿ¢ÿcÿuÿXÿ&ÿžÿ€ÿLÿ1ÿWÿ{ÿÿÚÿ7ÿÔþGÿºÿ¦ÿmÿ;ÿ3ÿqÿtÿ~ÿ`ÿÿ¼ÿ°ÿíþ0ÿmÿëÿšÿÿÿíþ+²ÿ<ÿ¾ÿ—þïþÅÿëÿ©þtþZÿóÿzÿ’þøþ¬ÿàÿsÿŽÿ¼þ#ÿ£ÿ~ÿµÿXÿ½þNÿ›ÿ÷ÿ¤ÿÄþâþgÿ°ÿ×ÿ…ÿ´þ¸þ£ÿH÷ÿÿþÿ Öÿ(„þðþeÿÒÿÿ`ÿÿ ¦ÿäþyÿqÿ§ÿ…ÿ}ÿ¤ÿåþÜÿ¤ÿTÿÍþ«ÿ–ÿ†ÿôÿÿÿ-ÿ!ÿ_ 1ÿDþÿ:Õÿ×þšþ.ÿÃ;aÿ5þÌþ©´ÿ êþþÔÿ6ÿ—TFþsþüÕÿ•ÿ½ÿxþÁÿlÿ«VÌþÿþýþÿéq6ÃýÂü4AþHþþ’ý*Qÿ!ÿh ÿxþÉþËÿÀúþ–ÿ ÿÎþjÿ¡”ÿ0ÿnÿÿÐþSù3üÙÿÈ>Óý+üì¨ÿšýYþxÿ¼ÿ4†ýŠþ .JÿU ¡þ;þ±ýýßîüªýÊÌþYšÿéüú>þïÿˆ_Éþ±ÿ¤þüþf˜1Eýªþ,ÿARÿƒýÇþpÿa¿ÿ,ü6¶üÿÿÓŒúzýy]þä›ý ´úërÿ1ÿ,ü®žúUÿ“ü'ÿPÿ¢ÿŸÿQÿUþôÿÐý¼ÿ‡A¬ýóû[vþýxÿŠýzþ™ þýÿ­þÏÿ½þý‚#þ?þOþÌÿ6Wþ®¥ýæüì±ü ÝIýý+þ©J¸fÿ{ü¥þ—ÿ•3ý3û« ýyÿï•ûëþˆþÚü°ÿ+ü)eýpýDÒþšþõÿjû#«|ý:–þöûÌÿ°µ9¸û’ùÐ÷4xþðû>ÿxª;þ´ü4ýî"ýÖ}úŽþj üI¹üJýv1ý"Æýbý¬Šú• ü‚þ‰úb5ÿ|ˆùmûÌ$‘úàsþæÿÞ©þpèüüè}þÿî½ü­…ü—ögý#pþ¤ÿrý¨·ÿÀû!)ü—tý1ýÔþ‘0¤ÿ¿xýÕüïþaá%ûåÿÕüW£ý ,ýÿ¾þ½\þlúkœþó­ÔûmûÿÅMü=þ s3ü”ÚünÿØ%þpü¤ $þ_,þÌÿ"ÿŠþûHåþÿôþœÿ þÓœüpÿ*üjíøG»7sÿ‚øCCû{.ûlþTuüIÿâÿaþøéýxþmÿ©‡Ð#û~ûüðÿ—ûæÿ$þEï2þ%ü&åÿóÿ\ný#þYÿ(£ÿYÿÿÏü þUÓþÍôýíø?‘×ßý8û‘½ü€¯¦ý×…ý3ý6³þBš_ùa‰þMün;ûO.ÿTûÞ¸ý„ÿh3ú‚lÿ°ûºþ7ÿ×ýðýsŒû2iùéÿOâþå?ü¿xþäüõ$þ²ÿ²ýZý’éûeþÐ,úbþ­û[îûëýTýÛWþ‡úðœûš ÿÄüÅþÝþÌþ¹SþgÿÖý<äÿŽûÿçðþþ>äÿ'ûá$iýÛVý†ý|#?ÜûUþ+þwÿ^ýœû<ÿÈ¢ý9Åü ý´þ})ú‚DúyyþLùþ––ÿ½ùr€þ«@búiþ#ÿÿpýDlfâþ†ýÿNëµþÿ4þÜ6ù4ÿöhÿddþ§û#wÿßÿµpý°þµ Hÿþþ¯îüýùòûáÿ×ýáýåÿ[þ8eÆû¹üžê¶þ bzü²ý|ÿE gý^ýVþÐ/ý>ýÿê3YümXþUýµÕüöÍúþÔ]þÚüéÿàÿéû‹ÆoyýŒúž[ÜÕþ´üaý©ÿ×­ý¸úpþúþ¶÷ûd°ÿ’tøMÍïÿÅñú4ü¿Fÿ»œÿ®ú“îþ¬ÿwŠû\ùúD¬ÿ‰ÿ]cþýþ‰÷þ÷ûŒ ü½wýŒû¾ÿÆþ þ¶ým|þ9þéÖü€oÑûóóþþÐþ!:ýÌv þUAþ6þ$ºÿŠýßþõþ©¡ý•û´ý†è²þËûAEÓý“ÿ|iþ…þr»‚ýæüJÂÿ+ÿfÞÿM·ÿ¨þÃÿÿ•þZ‹¤ÿT¶ÿõýSÿ¡ ÿÖÿ¸ÿäÿ¾»ÿ±ÿþuþá´8úþdþ¹¬ÿ¸þ°ZÿNÿgQÿ\ÿµÿßÿ„)ÿäþëÿ#ÿ/ÿðþ*ÿµþpÙÿÚþ=jÿ“ÿ’þðþœÿÀÿ³ÿÿ^ÿÿ4ÿOÿ†ÿëÿ1"cÿµþÐþÿTÿéÿÞÿGÿAÿ6ÿÿÿ"ÿ;ÿPÿrÿ‰ÿTÿ!ÿãþÙþ@ÿjÿ~ÿŽÿ_ÿOÿgÿ>ÿ8ÿDÿÿ8ÿŽÿ˜ÿ®ÿ•ÿdÿ`ÿ©ÿ«ÿ9ÿöþÿþ?ÿ}ÿ¸ÿ©ÿFÿBÿKÿ<ÿlÿeÿYÿaÿ^ÿ}ÿZÿNÿbÿCÿ\ÿhÿfÿŠÿeÿPÿiÿ?ÿOÿƒÿtÿdÿTÿ\ÿjÿ_ÿdÿCÿBÿfÿ_ÿmÿhÿLÿIÿ@ÿQÿrÿoÿ\ÿ%ÿÿÿ=ÿ™ÿ¸ÿÿgÿ4ÿ)ÿ?ÿUÿfÿeÿxÿŽÿŠÿŒÿmÿ=ÿLÿjÿŽÿ§ÿ“ÿqÿIÿLÿ]ÿ[ÿrÿnÿaÿzÿ‚ÿoÿ[ÿXÿiÿoÿyÿ~ÿjÿrÿ{ÿwÿwÿsÿeÿjÿ}ÿtÿqÿeÿeÿvÿxÿqÿpÿoÿnÿqÿsÿwÿpÿpÿkÿcÿmÿoÿpÿsÿoÿdÿ^ÿrÿ}ÿmÿfÿtÿƒÿ†ÿ…ÿ~ÿwÿ~ÿÿ—ÿ–ÿÿÿ’ÿ”ÿÿÿ‘ÿÿÿ“ÿ†ÿÿ’ÿ„ÿŽÿœÿžÿ“ÿ’ÿÿÿ›ÿŒÿÿ’ÿ’ÿžÿ’ÿ‘ÿ‘ÿ†ÿ‘ÿ’ÿÿ“ÿ„ÿ‘ÿÿ‚ÿ‚ÿÿ¡ÿ¦ÿšÿœÿ¢ÿ’ÿ ÿ¦ÿ§ÿ¨ÿœÿ¨ÿ½ÿ©ÿ•ÿ§ÿ³ÿªÿ©ÿ©ÿ¤ÿšÿ“ÿ™ÿÿ›ÿ“ÿ’ÿ—ÿ™ÿ›ÿÿŠÿ“ÿ•ÿ™ÿ™ÿ ÿ¢ÿœÿœÿ£ÿ£ÿ©ÿ¥ÿ ÿ¦ÿ©ÿµÿ«ÿ¤ÿ®ÿŸÿ¤ÿµÿ§ÿ©ÿ¬ÿ«ÿÿ‘ÿŸÿ—ÿÿŽÿÿ’ÿ–ÿ˜ÿ“ÿ“ÿ–ÿ¡ÿŸÿŸÿ¥ÿžÿ¡ÿŸÿ™ÿ•ÿ—ÿ§ÿ¤ÿžÿ¦ÿŸÿ¥ÿ©ÿ¥ÿ¥ÿžÿ¦ÿ£ÿ—ÿ™ÿ¡ÿžÿ˜ÿœÿ›ÿ•ÿ—ÿ•ÿ…ÿ…ÿŽÿ~ÿ†ÿ€ÿoÿ}ÿ|ÿyÿvÿzÿ‡ÿÿpÿzÿƒÿ{ÿ{ÿ~ÿ€ÿŠÿ~ÿsÿ}ÿtÿqÿrÿlÿwÿyÿpÿrÿfÿ`ÿlÿpÿkÿeÿiÿoÿnÿlÿeÿcÿfÿkÿqÿhÿkÿjÿ_ÿcÿlÿ{ÿoÿcÿrÿtÿrÿnÿfÿhÿgÿcÿiÿmÿgÿgÿkÿiÿfÿ`ÿiÿmÿlÿ`ÿ\ÿkÿ_ÿ\ÿkÿhÿhÿjÿdÿcÿ_ÿ_ÿaÿWÿWÿ_ÿ`ÿdÿfÿ_ÿdÿjÿlÿmÿjÿqÿsÿrÿoÿjÿhÿpÿrÿjÿiÿmÿrÿlÿhÿhÿnÿoÿhÿgÿkÿoÿoÿoÿnÿsÿrÿyÿ†ÿ|ÿxÿrÿmÿoÿvÿÿ„ÿ‚ÿ}ÿzÿ„ÿÿ‰ÿ‹ÿ“ÿÿÿ‘ÿŽÿÿÿŽÿŽÿÿÿ‹ÿ„ÿ†ÿ‰ÿ†ÿ†ÿ…ÿˆÿ‰ÿ…ÿ‡ÿÿ‡ÿ†ÿ„ÿÿ“ÿ–ÿ“ÿ“ÿšÿ˜ÿ˜ÿœÿ—ÿšÿ•ÿÿÿŽÿŽÿÿŽÿŒÿÿ’ÿÿ‡ÿŒÿŽÿ–ÿœÿ˜ÿÿžÿšÿ™ÿ”ÿ˜ÿ—ÿÿ’ÿŽÿŒÿÿŠÿ“ÿ—ÿ—ÿ˜ÿ›ÿžÿžÿ˜ÿ‘ÿ’ÿ‘ÿ•ÿ”ÿ’ÿ–ÿ•ÿ—ÿœÿ›ÿŠÿ‰ÿ¬ÿ³ÿšÿ‹ÿÿŸÿ©ÿ›ÿ™ÿ£ÿªÿ¦ÿ•ÿŠÿ’ÿžÿŸÿ›ÿšÿÿ ÿšÿ‘ÿÿ‹ÿÿŠÿ…ÿ‚ÿ€ÿ…ÿƒÿ}ÿ}ÿÿvÿlÿhÿkÿoÿtÿnÿkÿpÿ{ÿ{ÿuÿxÿxÿyÿxÿpÿlÿtÿyÿtÿlÿjÿoÿqÿpÿiÿiÿsÿqÿjÿcÿeÿgÿcÿbÿdÿcÿgÿgÿeÿhÿdÿgÿeÿcÿ`ÿYÿYÿRÿNÿQÿTÿSÿPÿOÿTÿ[ÿ[ÿ]ÿcÿ]ÿaÿmÿnÿqÿnÿdÿhÿoÿsÿtÿoÿlÿgÿbÿ_ÿ[ÿ[ÿXÿZÿ_ÿbÿcÿgÿeÿeÿcÿ^ÿ`ÿbÿeÿaÿZÿ`ÿnÿjÿhÿhÿeÿaÿ_ÿ`ÿhÿhÿ]ÿYÿ[ÿcÿjÿlÿmÿpÿsÿpÿnÿpÿtÿtÿqÿxÿwÿwÿvÿvÿ„ÿ…ÿpÿnÿ‚ÿ…ÿ}ÿkÿfÿrÿtÿnÿgÿqÿ‚ÿ|ÿkÿmÿxÿ~ÿzÿtÿwÿÿ„ÿ„ÿ…ÿ„ÿ‡ÿ‡ÿˆÿ‹ÿ‰ÿˆÿˆÿ‡ÿŠÿŒÿ‹ÿˆÿ‹ÿŒÿŒÿŒÿŠÿŠÿÿ“ÿ–ÿ—ÿ•ÿÿŠÿ‹ÿŒÿÿÿ‘ÿ–ÿžÿ›ÿ˜ÿ–ÿ“ÿ’ÿ•ÿ˜ÿ•ÿ‘ÿ“ÿ‘ÿÿ–ÿ•ÿ–ÿ—ÿ–ÿšÿ›ÿ˜ÿ”ÿ’ÿ‘ÿÿ’ÿ–ÿ—ÿ•ÿ•ÿ—ÿ›ÿ“ÿŽÿ”ÿ–ÿÿ‹ÿ‹ÿÿŽÿ“ÿ”ÿ”ÿ–ÿ—ÿšÿ˜ÿ•ÿ“ÿ’ÿÿ†ÿ‚ÿ…ÿ…ÿ…ÿ„ÿ€ÿÿˆÿÿ’ÿ“ÿ‘ÿ’ÿ‘ÿÿŠÿ„ÿƒÿ„ÿ€ÿ~ÿ{ÿÿ†ÿ‰ÿˆÿ…ÿ‹ÿÿÿÿ‹ÿˆÿŒÿÿÿˆÿ†ÿ‹ÿŒÿˆÿÿ€ÿˆÿ†ÿ‚ÿ~ÿ~ÿ€ÿ}ÿ~ÿ}ÿwÿsÿnÿpÿsÿnÿhÿfÿaÿ^ÿ^ÿZÿZÿ\ÿ^ÿWÿRÿUÿ[ÿ[ÿWÿWÿXÿUÿVÿZÿTÿRÿTÿ[ÿaÿdÿgÿhÿhÿdÿ`ÿ]ÿ^ÿ`ÿlÿkÿiÿhÿlÿrÿrÿqÿkÿgÿgÿeÿdÿbÿ]ÿaÿfÿgÿgÿhÿlÿnÿhÿbÿaÿdÿdÿbÿaÿ]ÿaÿfÿkÿnÿmÿnÿnÿlÿlÿiÿiÿjÿdÿeÿfÿkÿpÿmÿkÿmÿrÿvÿxÿ|ÿÿ€ÿ‚ÿ~ÿzÿxÿwÿuÿpÿoÿoÿmÿjÿnÿpÿoÿmÿdÿdÿhÿkÿkÿiÿkÿrÿzÿ|ÿ~ÿ}ÿ~ÿ}ÿÿ‹ÿÿŒÿŒÿÿ’ÿŽÿˆÿŠÿˆÿ‰ÿÿŒÿ’ÿ•ÿ’ÿÿÿ“ÿ”ÿ”ÿ“ÿ“ÿ“ÿ”ÿ“ÿÿŒÿ‰ÿ‘ÿ”ÿ‘ÿŽÿŒÿÿ‘ÿ’ÿ–ÿ›ÿžÿ ÿ§ÿ©ÿ©ÿ§ÿ¤ÿ¤ÿ£ÿ¥ÿ§ÿ¨ÿªÿ±ÿ³ÿ¯ÿ­ÿ¯ÿ®ÿªÿ¥ÿ¡ÿ¢ÿ£ÿœÿ–ÿ–ÿ—ÿ—ÿ•ÿÿÿŽÿˆÿ„ÿÿÿ…ÿÿ…ÿ€ÿ…ÿ€ÿ„ÿ„ÿ„ÿÿ’ÿÿŽÿŠÿŠÿ‹ÿŒÿ–ÿ›ÿ–ÿ›ÿŸÿ¡ÿ£ÿ¡ÿ¢ÿ¡ÿŸÿ›ÿ–ÿ’ÿŒÿ‰ÿÿ‘ÿ“ÿ“ÿÿ’ÿ“ÿÿŽÿˆÿŠÿÿŒÿ‡ÿˆÿŠÿ†ÿ…ÿ‡ÿˆÿ„ÿ€ÿzÿxÿyÿ{ÿxÿxÿ}ÿƒÿˆÿ…ÿ‚ÿƒÿƒÿ‚ÿÿzÿzÿÿzÿxÿuÿqÿmÿpÿrÿqÿqÿkÿdÿ^ÿ^ÿ]ÿ\ÿZÿXÿXÿ[ÿ[ÿ^ÿcÿfÿaÿ^ÿZÿVÿTÿRÿKÿ=ÿ0ÿ)ÿÿùþ×þªþˆþrþ¥þœþþþÿîÿòÿÿÿÿÿ…ÿTÿ†ÿHÿ'þhýÏþ«Â g«ÿþžþ¨ÿ ¤ÿ“ÿÔÿ¿ÿÿÏþEÿ§ÿ‘ÿxÿ¬ÿ¤ÿÿlþ>þÈý;ý!þÂÿRãÿ™ÿÖÿÂÿ7ÿGÿ2ÜhÓÿÕÿßÿÿbÿòÿHnÿÿ³ÿFÿ×þÿàÿãÿ¡ÿtÿ[ÿÿÿ•ÿÄÿ ÿÿ ÿŒÿëÿ€ÿQÿÒÿíÿûÿØÿ™ÿñÿÔÿjÿªÿòÿØÿŠÿkÿŠÿzÿ¨ÿ¯ÿºÿšÿNÿ‚ÿµÿGÿÿdÿ]ÿTÿXÿTÿ}ÿ8ÿ)ÿlÿ¬ÿ‚ÿpÿ¡ÿ¬ÿ|ÿKÿxÿšÿ¬ÿ^ÿÅÿÐÿ¨ÿ¯ÿ©ÿ¨ÿªÿ—ÿ±ÿ±ÿŠÿÈÿØÿ›ÿˆÿÉÿîÿîÿ¼ÿ«ÿÚÿ±ÿ‡ÿÿ¢ÿUBÆÿŽÿÁÿ›ÿ6ÿkÿàÿ÷ÿìÿËÿdÿÅÿ1ÿ¹ÿžÿÔÿ×ÿ=ÿžÿÍÿÿLÿrÿiÿˆÿˆÿ»ÿ–ÿKÿfÿUÿhÿsÿwÿÆÿ‰ÿWÿRÿŽÿàÿ6ÿ©ÿßÿÿhÿÿ'ÿÁÿëÿ¢ÿ+ÿñþ`ÿqÿ…ÿuÿ´ÿ’ÿ‰ÿÿ#ÿ ÿtÿÿ÷þoþ´ÿšaÿþÕþšÿéÿZÿHÿÆÿ=ÿÿaÿƒÿ·ÿEÿ ÿ¯ÿvÿøþ³ÿfÿ¸þÞýÆýyþ½þ$ÿpÿ@ÿþrþÊþŽÿ*ÿ”þ1ÿÿ¸þMÿiÿEÿˆÿ3ÿQÿÿfÿ²ÿ{ÿÿMÿVÿ³ÿjÿAÿœÿèþ8ÿ¡ÿ´ÿRÿuÿæÿôÿÿÿ¥ÿQ<ÀþþÈÿ nìþ.ZáÿTÿwÿž“ÿIþÞÿRÝÿ$þ9ÿ/iéþ+ÿ?ÿðüMýPÿU+ÿUþÀþ‰þLþþéÿ^¶ÿªþMÿ5ÿ%T†ÿ§ÿëÿ¨ÿÉýÂÿùÿIþ™ÿºÿÜþSþ°þ£ÿIÿÔþ^ÿyÿ8ÿ`þÿþZÏÿRÿµÿAØÿ¬þSÿYÓÿ-?Ʀÿ{ÿÏÿÿ}ÿEÿ.›Žþ™þ‰ÿRÿÊþpþ‘ÿ«ÿìþ¢ÿ‹ ÿMÿ ÿÿcÿÅÿÁ ÿãÿ(xÿ|Gÿ¡ÿN]ÿùNÿÐþ¹UÿÿÏÿaþ þÐÿúÿÿÉÿâÿ˜ÿžÿñÿýÿïÿ¢ÿ-Ìÿ@®},Úþ‚ÿƒÿÇÿßûÿÈÿ—ÿ—ÿñÿwÿ¢ÿ¥ÿrÿ îÿçÿÏÿ<ÿ=¨ÿ]ÿYÿ³ÿ2+ìÿöÿ|êÿÿ¥ÿºÿV”Šÿ¢ÿ¯ÿ=þ†ÿ™½ÿ¤ÿlÿ“ÿÿÿÿŸÿ+ÿÆÿ+#éþÿÿWÿí_ÿJÿZ¨ÿÿxÿ'ÿßÿ®ÿyÿ84ÿÿþ6ÿæþ‹ÿÞþ:ÿTÿþ:æÿ$þÞþ"ÿbÿ¤ÿÑþÒþpÿÆÿYÿÆþêÿ¹ÿºþEÿÝÿ%ÿžþåÿíÿ@ÿÿÆþƒÿ±ÿwþqÿ2ÿYþ«ÿ¤þ_þQÿKÿRÿRÿÿqÿ ÿ¾þ„þÔþ²öÿ¿þ—ÿÛþËþ^þ‘þjÄÿÿGÿ&ÿXÿÛþDþkÿaÿIÿ…ÿ:ÿÁÿØÿÂþ¨ÿØÿìþÏÿpÿNÿÿüþ¥ÿ^„ÿ|ÿ,ÿÿ?ÿäþnÿ¤ÿ%ÿ¦ÿÞÿÿ3ÿÿŸÿ+ýþ‚ÿ ÿmþàÿ IÿI—ÿtÿiÿóþæÿcÿ¥ÿœÿ?ÿsÿ¼ÿ^ÿˆÿ ÿHÿaÿÿÿéÿ¦ÿ‰ÿÕÿñÿyÿ7ÿ®ÿÉÿ ÿƒÿN ÄÿÅÿzÿòþ,ÿßÿRÍÿ¨ÿœÿ†ÿÿBÿvÿ¯ÿ‡ÿ’ÿ›ÿÿÿ=ÿ”ÿªÿ>ÿØÿP³ÿ$ÿTÿeÿ)ÿ¡ÿOÿ@ÿÒÿ|ÿLÿ*ÿÿpÿrÿQÿ¿ÿ’ÿ9ÿÿæþlÿCÿNÿ}ÿBÿqÿ ÿîþUÿ¨þøþPÿKÿšÿ.ÿEÿÎþ½þ3ÿ=ÿqÿŒÿUÿÿäþÿ6ÿWÿ‰ÿ'ÿ•ÿÎÿTÿÿ¾þõþ"ÿÿ}ÿ’ÿ<ÿ_ÿUÿEÿAÿ ÿLÿ„ÿ_ÿŠÿPÿõþSÿqÿÿÿƒÿàÿ‚ÿFÿ8ÿDÿpÿ>ÿ#ÿÿ+ÿ¯ÿ¢ÿLÿ6ÿ*ÿFÿDÿCÿvÿ|ÿQÿâþÿ2ÿÆþ#ÿlÿÿ ÿÿÿUÿ;ÿÿÿÎþ ÿVÿXÿ(ÿÿ-ÿ#ÿÿ"ÿÿ4ÿ7ÿFÿYÿ+ÿ5ÿ%ÿíþøþÿMÿ1ÿ ÿNÿÿÿ,ÿ8ÿ&ÿïþ"ÿbÿ4ÿÿ!ÿxÿ_ÿÿ;ÿPÿTÿ\ÿFÿSÿ:ÿdÿžÿƒÿ›ÿºÿÅÿÜÿ®ÿ˜ÿ¢ÿäÿùÿ$ áÿ"þÿ42_>#,6)%1! îÿNO<N;CL)GlX2F^^˜Ä ëÆÌ,øÿ‰ÿüþ“þ!þ¸ý~ýEý ýëü¯ütü†ü¡ü¡ü´üÃüÈüÚüÐü›ü‘üüsübüŒü¦üÞüýÜüùüIýý¬ýÒýëýCþyþoþ{þ´þîþ/ÿiÿ€ÿÃÿ%rÑ"m½ cº2^~²ðsÓLšÌ †…7g«ë"¼¯r ÿþ#þçþGÿÇþ!þ-þ“þ þ=ýÜüýùýÁþÜþ£þ.þpý÷üõü>ý¡ý¿ýœýnýEýáü_ü)ü4üHüVü9ü,ü}üˆü/üÕû×û;üüü‚ü»üîü×üÍüöüHý¾ýäý¾ýÓýþþòý­ý²ýêýýýÜýºýÔý þAþ`þŠþÿþsÿ•ÿœÿÆÿšd¾4ŠõHÇPä[áoˆ>2oªµ$üÙfÆrÿåÿúB_ƒ{‚ÿ–þTþ ÿOjÿ=þCýðüêüýðü”üŸü¹üSü‰ûþúçúVû®ûðûZüåüÙüwüüÙûqüýýèüýXýQýäü}ü»üoýèýþ þþ þæý‘ýyý·ýþDþ6þ8þ\þpþbþjþÔþŸÿ]³°žÀômèj×]À%¯D¹z[iZÌñ7ÑKüYvpjÿ³ÿÊU© GñÿÇþ|þbÿyάêÿ‘þˆý6ýýý´ü<ü™üý³ü¬ûßú¿ú>û™û³û@üýýÊügülüÙüýáüñüGýˆý‰ýýšü·üQý¡ý¹ýËýþ>þ þŸý“ýËýæýçýêý"þnþ€þ9þþfþÿÐÿ>JMc•ürð5x½Pb¦ãeûÂ{cQäÁÉßÛ­U;÷û°ÿQÿéçåþcþ¤þpÿæÿYÿþ6ýý'ýÏü üÍûˆüPýßü™û…úsú*û«ûÉûü²ü3ýaý ý§ü™üäühýøý^þ^þ þrýîü×üýOýhý‡ýØý+þþ¬ýfýpý¯ýýý[þ©þºþ{þþãý þeþ½þÿOÿ¹ÿ 0Íÿíÿ3™ u…•ÃðV•Ì'…ä&DÞÅçÞ‹{zø›ׇ¨ÆÓe¤ÿ>ÿ7ÿ8ÿ8ÿçþ¶þÌþÁþŽþ>þçýÅýæýþýýÁý}ý;ýFýsý‰ýtý$ýÓüåü?ý™ý·ýqý ý$ýtýÆýåý¯ýrý„ýÅýþþïýÃýÀýÜý þ!þþîýéýþ&þ:þ(þþþþ2þAþ?þCþ_þ“þ¸þÈþÑþéþÿ[ÿœÿ¿ÿËÿÑÿRœãIŒåO°êZº)š«A×…Ç7Eü[Ë®µ¥j¨ÈeStŽLÿÉþ›þßþÿãþEþ©ý[ý‘ýþýþÅýDýäüìüRý…ýbý ý«ü§üýiýýzý)ýýXý®ýêýãý¥ýŠý³ýþ8þ4þ þåýöý"þKþ^þDþ!þ%þ9þOþaþCþ#þþþ*þ0þ$þþ5þGþZþbþdþzþ¡þÌþ÷þ$ÿDÿdÿ™ÿÒÿDj¥ùZÊ WˆÐ$™Q%³\M±ÿð„î•°‘*JˆFHufÅÿÿ³þ£þðþúþ‘þ÷ýzý_ý±ýÿýèý{ýüü»üêü=ýOýý¼ü‚ü¥üýHýWý+ýýüýiý²ýÝýÕý¿ýÖýþrþ©þŸþnþIþ?þUþþ˜þŽþxþtþ~þƒþyþZþ8þ+þ#þ(þ1þ6þ7þ4þ+þ#þ/þDþ`þyþ“þ²þÙþ ÿ:ÿhÿŽÿ²ÿÛÿ[›ÒO–ëR­÷=çQ eù™‚øF1º ±Á׺DN’fr¨ŽÙÿ4ÿÍþÉþ ÿ,ÿÀþþ›ýýòý;þþšýýåüýbý[ýý¸ü‰ü¾ü%ý_ýYý&ýý7ýŽýÓýðýßýÕýÿýJþ˜þ¾þ»þ™þ~þ…þ›þ«þ¥þþ…þ‘þ¡þ«þ”þnþ[þZþUþYþWþJþMþNþHþGþ<þ2þ=þ`þ‰þ¢þºþÒþúþ$ÿCÿnÿÿ»ÿ÷ÿ2kœÒhÀi§þP¶ g†"Âj”2ÞB¤w¥E¥¤,3Jv 6ÿ³þtþ›þÜþ©þþ|ý(ýRýÃýîýœýý¡ü¤üöü/ýý½üsü]ü»ü$ýHý5ýûüôü8ý…ý¸ýÄý¯ýÁýþPþ’þ£þšþyþhþ}þþþ}þpþyþþŠþþlþIþDþAþ;þ8þ+þ%þ/þ.þ þþþ þ%þGþ]þkþ€þþÍþøþÿCÿgÿ˜ÿÛÿSˆ»ýY¯X•Ô'‰ò<‚jô xÍ)¯•’¸Œ,^€BMfk×ÿÿ¸þ—þÑþòþ—þýý€ýNý˜ýþýøý–ýýÒüìü8ý\ý-ýÐüü¤üýmýwýVýý-ý‚ýÊýöýöýãýþýGþŸþÖþÑþ§þŽþ“þ¶þÕþËþ¯þ™þ£þ½þÆþ¶þ“þnþeþeþjþlþ]þKþAþ?þ:þ;þ;þEþ]þtþ‘þ²þÇþæþÿ5ÿ^ÿ‰ÿ¿ÿëÿ$\Ž»í1ˆá&i£ì?™õ@J܃pÐüƒí‚Ž¥nùQ-9U9…ÿÙþ‡þzþ»þÌþ\þ¸ýAý4ý’ýåýÏý]ýáü¯üçü6ýBýý¢ügü˜ü ýPýQýýïü ý_ý«ýÕýËý±ýÎý#þ~þ°þªþ|þkþ|þ¦þÂþ¸þ’þqþyþþþþkþIþ;þ5þ<þ@þ-þþ þþþþþþ"þ6þPþdþyþ”þ»þâþÿ0ÿ_ÿ•ÿÔÿ;j•Ò!zÈ OŽÙ1„×a>ÑwX¶ùˆèxixRà L!;.—ÿæþ}þcþ­þÌþpþØý\ýAý˜ýïýéýýýÍüøüHýdý3ýÐüü¶ü(ý|ý‡ýVý%ý:ý‰ýÑýþþèýöý>þ¡þåþåþ°þ“þ¡þÆþðþòþËþ¢þ›þµþÓþÒþ·þˆþgþeþvþƒþqþVþ:þ1þ4þ=þHþFþAþJþfþ‰þ¥þ¿þÛþïþÿ7ÿrÿ¬ÿßÿ<rªôAŽØa¯ìAŠÝ'w‰)Ãv¥ #Û=­€™™H•²@>STìÿ'ÿœþcþ†þÁþ’þþtý5ý`ýÁýçýŸý!ýËüÔü)ý`ýCýïü¡ü˜üìüWý†ývý:ý)ýgý¹ýóý þòýêýþrþÉþåþÇþ þ”þ­þÖþÜþËþ¡þŠþ“þ«þ¹þªþƒþVþ>þ<þLþTþ;þþþýôýÿýþþþþý þ.þZþ€þ›þ¶þÑþõþ"ÿXÿœÿÖÿ/b£è,f¥ïAÒ]£õIpžEeÛÌ.…BVYy‘ (Ôÿÿqþ+þJþ þ‚þþnýý5ý”ýÈýŸý"ý»ü¯üýUýMýý°üŽüÇü'ýkýsý<ýýIýœýëýþþóýþeþÃþüþðþ¼þ±þÉþúþÿÿþÙþ¹þ²þÈþæþÞþ²þ€þZþTþ`þfþ\þCþ)þ þ(þ+þ-þ#þþ%þ;þ^þ|þžþ¿þÕþñþÿDÿxÿ°ÿíÿF~½VÑWªýF‘Íe&¸k™ %çVº‚’V¦Ì[PRHïÿ6ÿ¥þdþ€þÑþ©þ þ¡ý`ýdýžý®ýˆý.ýåüçü8ýhýIý ýÛüÐüîü'ý`ý™ý”ý‡ýTý(ýý)þsþZþ þÓýþÆþ~ÿ’ÿ"ÿŠþZþþ­þËþÁþ…þdþªþÿÿyþÓý~ýýóýeþqþëýYý3ýzý»ý®ý©ýôýTþ¬þ ÿNÿ5ÿÔþÔþ~ÿhäôå&‘ú]¡œP¾Üëy#""-Ë›ßAÃÿŸÿ™'ê“ÿFÿÑÿ-$ÿþNýýGþ‘þáþtÿ¡ÿWþªüTüQýûýÏýgý ýçüßüÿü¼ü‰ûú1ûòüÌýøüçûËûpüÓüÒüý¦ýLþµþÍþÌþãþÿ4ÿIÿŠÿ"âÿCÿ¾þ3þåýÿý6þ0þÑýeýSýNýýØüžüµüýhýbý÷üü‡ü½üùü0ýoý®ýÈýäý'þzþÑþ(ÿ†ÿÂÿvë÷©Yè=”óSågäKÛŸE%  )°nvükÏîÿ¤—£ÿëÿ­‘Iÿ´þ‡þ;þ•ýÖüÏüþ%íXÿÜü–û™üÚýþêýÕý¼ý[ý›üBü!üÓûûüý«ýHýWüìû-üjüÕüÛýøþ>ÿšþFþ³þ:ÿ?ÿ4ÿÉÿ] Nºÿÿ^þ þþLþsþgþæýý˜üÁüþüôü¯ü¼üýýìü‘ü:üüYüúüýÁý½ý­ý¢ýÔýþ?ÿ½ÿßÿ v:6'ž\±Uµy~Äa`Z ÜàšgkPÆàÐÿ2ÿÜ_¹þ þvþœþ´ý'üü²ýº3ÿ)ýügüýwýöýjþþ5ý<ü&üRüùûbû¡ûžüQý(ýfüü÷û·ûÿûýeþöþƒþþ4þ†þÁþÜþLÿ£ÿåÿÌÿLÿiþµý€ý½ý6þ`þþAý´ü¨ü ü˜üxü}ü­üÁüÁüœüHüüúûOüòüœýþþèýïýnþ!ÿªÿ`Ï9Š¡ÄÊDú©g™Àt4™-ÎÌx 1Sîmq$÷;ÿ8óÿÍþ,ÿkeìþCþ‘þÿUþü×ûÍüÿ—wþýîü&ý\ýËýwþ§þþ*ýý>ýÐüÄû{ûOüýeýý ýÚüü™û:ü¡ý˜þžþ_þ‰þ½þµþ¤þáþ ÿiÿÿØÿïÿOÿ{þ¥ýlýÀýþþÚý…ýKýûü·üjüMücüüíüýçüœüdüAübü ýÕýlþ“þžþðþZÿ³ÿ m îLŸÚöD­w*Ÿ7¬Ól@ )µ2ÃO;b&ÿG+ÿJÿ8JÍþÂýlþÿóþ5ýüwüÔýrÿØÿSÿQþrý ýýÇý¿þ ÿ'þ6ý:ýæýÏý¾üÌû3üÄüêüÊüýŽýçü­û^ûü×ý+þÁýÐýGþsþXþþ¸þ¹þ¶þµþYÿªÿ9ÿIþ‚ý~ýëýþåý£ý€ýfýýÃüüuüLüDüWü”ü¼üŽü7üüûCüöüýâýþwþÿbÿ±ÿ€õVÂPÖZ›YŸŠÞg˃ Rè¨_vAШ—…ÿµþ%ÿüÿJÿÀý‹ý-þßþþCü¹ûvüþ\ÿ]ÿÍþþŒý2ýeý-þÿÿ þ‰ýêý}þþÕüNü³üñüäüóüƒýªý¥ü‹û·ûäü¬ý¢ýSý¨ýþ!þGþˆþÇþþþŸþ4ÿzÿ,ÿ“þãýîý;þ[þ7þÜý°ýýTý3ýýýÉü‘ü{üœüÒüÊü•üpü¶üMý½ý÷ý(þ•þÿ„ÿøÿvùO“õ‰È)½R¼(w‘‘r ¿:¼8õ˜û°Ÿ©ñ_ÿ–þÿ<ÿ»ýéüƒýãþbÿÆýGüòû›üïýzþ”þ—þ¢þþfþ„þ×þÿ0þkýÊýêþ®ÿÿ×ýlý5ýÒüzüÕü¶ýÏýàüBüÑü€ýlý§üXüøü~ýæýKþÏþ¹þ'þ¹ýÛý—þÀþ þ/þþfþ”þ‰þ-þÇý—ýký{ý•ý¬ýýýÁüŽü¸ü¿ü›üqüqüìüqýÈýòýþrþÕþ@ÿÊÿbð2±c«Cø•ï^úRÿ)  C‹d *â¯ÇÿŽþœþÂþcý_ü¾üãýÝþ®ýükû¦û®üzý¼ýíýCþIþPþqþ°þÿuþ‰ý¼ýÊþÌÿ·ÿ³þ8þ þ‘ýýý­ýúý@ý‡üèü‹ý—ýÚü2üiüÖüýýÿý@þØýeý^ýÉýþóýÃý˜ýíýUþyþ^þþÄýý}ý—ý¾ý¾ýtý)ýùüýýáü¨ü€üÅüQý¿ýþ0þ{þÌþÿcÿðÿ“êFÀb(ƒÔ<Û†>¤*­Rä¸ ‰ “'°K<~M‘ÚþÒþ˜þùüüƒüðýÅþuýîûXû~û]üõü6ý¡ýûý&þYþ¸þÿfÿ’þÂý þ4ÿUNÿCÿÿþÿýìýeþzþ©ýý—ýLþGþZý„ü•üÂüÔü%ý’ýâý_ý×üöüZý£ýJýòüûüŠýþfþfþ7þþãýÍýëýþþÏýý¤ýÅýÈý„ýýêüý‡ýéý2þmþ¾þòþÿvÿòÿt´“n,§÷i÷‘<Á‘Æ ò zÛ ¤Rg¸åïS¾3ÿãþ¸þ ý¿ûüHýVþEý±ûûÿúuûêûüoüåü5ýŽý*þ–þ ÿqþƒý£ý›þÌÿ¬ÿˆÿ«ÿPÿ½þˆþÃþÝþþUý®ý{þ§þñýûüÑüÖü®ü³üýkýGý›ü_üùü<ý1ý“ü?ü¦üý‚ýÉýßýÛý¶ý}ýŸýÝýÙýÀý~ýký³ýÚýàý ýCýBý{ý¾ýüýEþ þîþÿAÿ©ÿ^Šò™UÃ]ß}pÅWûz­ a Ñ·÷žn!f8rå}ÿgÿÎþçüåûDü¨ý!þÈüeû û?û¦û×ûÀûü•üØüwýþ þöþ0þ“ýôýÿêÿ÷ÿ—ÿÁÿÉÿpÿYÿ–ÿyÿ’þþ—þQÿJÿsþ¬ý¤ý¥ý_ýDýwýŽýXý½ü—üýIýýoüüsüëü,ýNýmýœýªýŒý¯ýþýýýÖý“ý“ýðý-þ9þþÊýÖýþAþbþšþðþAÿ\ÿ”ÿ _“¤ž;žŽNìVð¥; L ù×]€GB•9ÂÿŠÿÿýü<ü„ý*þäübûëúûfû™û[û„ûáû'üÌüƒýþpþÈý*ýýþ‘ÿÆÿgÿŒÿ ïÿÉÿ½ÿòÿäÿÿ€þþþÄÿÕÿÿ=þ(þ6þëý¶ý±ý¢ý[ýËüœüÌüßü«ü6ü¿ûÉû"ü_üŠü™ü½üÝüàü ýQýpýWý4ý:ý~ý¼ýÛýÔý»ýÃýþ;þiþ—þâþEÿ‚ÿºÿqŸ¼çSÝ6¬ ×ré8ÅHÙ’I( D³s(”àÅ åäqÇÿ˜ÿÿýTüüýþný¾ûòúû\û›ûOû"ûeûºû5üý¦ý2þèý'ý+ýþGÿÅÿ…ÿnÿpsi–³Vÿzÿ^µ<Eÿöþÿüþ™þ`þ8þøý…ý5ýHý,ýÞü\üüÀûÑûìûüüü?üiü™üÇüóüõüúüý`ý«ýÏýæýþ*þgþµþåþÿFÿ­ÿZ–Ö/b´ J‰ú™+«‹ÿOߕxø»p4óÿûþý2ü³üþ7þœü<ûû^ûËû¥ûFû]û§ûòû¸ü{ýþ0þ\ýýÇýÿÎÿÄÿoÿæÿ‹ª·¿õ¨Õÿ—ÿ` Ýôÿ3ÿRÿ`ÿÿ¤þ]þþªý5ýDýKýÀüü‡ûbûpûpûjû„û„û·ûõûüKüfüjüxü¡üý|ýžý±ýÖýþgþ«þÙþÿDÿžÿ&†Ïõ;†ê9eßKä9¡xÔd *”f’˜ŠðQ áÿÛÿÛþíüü»üþþuü+û/ûûÅû€û!ûMûŽûÞûµüƒýþ$þNýýÛý)ÿêÿÆÿpÿùÿ»Ü騶êÿµÿ‚5îñÿ.ÿ\ÿzÿ ÿžþFþþý›ý)ý'ý*ý£üèû7ûþú%ûUûXûWûNû‚ûÒûýû3üZühüƒü¼ü?ý×ýþþ)þ]þ»þÿLÿ{ÿ¨ÿ £G`q’ªîY‹Æ„$¨éBŒ “wýþõí3ÜKgΨ¡F÷ÿ¯ÿîýyü˜üæý£þRýŒû>ûŸûõûêû“û–ûÕûèû{ü|ýþVþ¨ýý§ýèþúÿ)ºÿ¾ÿ…ÛðãùýcäÿnPe†kÿKÿ£ÿ‚ÿõþþIþûýoýýgý*ý[üYû×úûqûmûQûKûcû³ûãûüQüSüRü†üúü°ý þ þ þ+þŒþõþ=ÿhÿŸÿùÿ’)^dT^Ì4œèü™ÍïE™RP…ƒº;™…Èz`*éÿßÿYÿ‹ý:ü„üþýzþÌü%ûýúûèû ûAû|û¶ûÒûoüWýóýþ(ýÚüªýôþéÿÝÿmÿ«ÿf¶Ê©ÎËCþÿ¡_=%ÿ:ÿŒÿbÿÎþXþ þÚýBýýýÌüëûéú‰úÿúxû^ûûû_û¬ûÂûæû ü=üKüˆüýÐýþíýîý4þµþÿ\ÿÿÐÿFÛ8LKTu¹þiË?¬(”·Ê]Ø@ºêמNñXKv‡¾lÏÿ^þ ýýþáþýÞû[ûÐûGü3üÂûÇû"ü8ü«üoýüý2þýý­ýÝþâÿ”ÿ¡ÿK¹Ò¿݃>²[XweÿLÿÀÿ¹ÿ2ÿ¢þXþ+þ¯ýOýýÂüüBû÷úXûÝûÕûvû:û†ûìûüöûü^ü©üëügýóýþþþý]þíþXÿÿÞÿ@¶1hhGT®g®Rw±sªõ®\6—lþÈR1ªWƒì üÿQÿ°ý#ýÓýÏþsþvüDûuûüRüü°ûÆûü*üÝüzý´ý‰ýÛü ý"þSÿÙÿ{ÿÿ~ÿ>ˆ~Zku->è.¬Œÿÿþtÿ×ÿ…ÿÌþVþ!þÖý%ýÑü­ü5üjûÏúûÉûæûUûæú û™ûÙûÑûêû2ünü²üÿüxýÒýÉýÌýþÅþfÿ±ÿÐÿ{ñN^L„ÓEkªIAwõQÃðg ØÀ¨bâ÷(¸]If”<Âÿþÿ6ÿÚý›ý]þÿòýäû@û½ûŠüÆümü8üBüCüWü×ü.ýzýgý,ý¾ý¹þ£ÿ»ÿ ÿ¯þNÿ*¢~²»cfÙìiƒÿ{ÿ@¡ÿÊþKþþ¸ý'ý ýûü™üÜû|û½û4üçûWû)ûŠû+üZüNüaü’üÀü ý[ýÅý þ,þiþÔþ_ÿÝÿ!aÌb£¿Þ?„¾ÿR™à]²úrMù>Á™SCA¿Fcó´áÿ#ôÿãþAþtþÿþ¿ü¥ûÎû“üýýºüšüpüuüËüóü ý:ý\ýÛý“þ9ÿzÿýþkþ©þÿ5c@d’X"=U0²ÿ’ÿ>ÚÿÿQþþÃýfý:ý3ýìüwüüü+üòû–û€ûÛû]ü‰ü}ütüü”üÚü=ý¦ýìýþlþÈþ%ÿ‚ÿÈÿôÿ/›÷4b¥Ñ÷$ZŽ–Ôo»ò 1˜N*µfù‡Œõo©ÍÏÅÓÿÇÿÁÿ)ÿ~þœþ#ÿÃþýþûüØülýMýïüºü‘ü®üëüý ýýMýíý|þèþÿ”þþXþÿçÿÒÿÎÿãÿ¾ÿ·ÿ¶ÿ{ÿtÿÇÿâÿoÿ£þûýëýÀýýqýkýWýãüzüTüfüMüüühüàüüüÞüÄüÐüýcýÃý#þqþÅþÿ<ÿzÿ¿ÿW´üY’zÄ´Ð!ïœöÕ¯½;«˜È%°ÿõT‚ÌÁÛü÷º·/N7ªÿRÿ8ÿZÿ­þ¥ýBýoýíý þ«ý[ýLý_ýiýfý<ýVý¤ýðýTþ|þ—þŒþ[þ_þÑþ^ÿ¬ÿˆÿnÿ›ÿËÿ¿ÿžÿœÿ˜ÿ±ÿ”ÿÁÿ¯ÿlÿÿŠþ†þkþ3þðýÆý»ýý;ýöüâüÝüìüèüáüýLýcý:ýOý´ýîýþjþ•þøþÿOÿTÿnÿõÿk•o`å·Äó¶òÁãÔ¥Òĉ X[â%ßXÅqÈupYÎ?Üÿ„ÿsÿkÿôþUþ¹ýÀýüýþþ³ý–ýtý_ýjýYýOý]ý˜ýöý)þ0þìýþ"þIþ–þéþÿéþúþÿÿîþæþ ÿÿ&ÿ$ÿÿüþßþ^þ1þŒþ­þ^þ#þþÄý©ýŠýˆý¡ýÏý´ýÑý»ýÂýåýþÈý8þLþÁþ£þžþÿþÿ‚þDÿÂÿCÿÜÿXÿ­´ÿŠÿÇ Xºüº;f_b¯Lä¸ ÃÍo‡ƒ­pÔ×oñ.ÂM¨F¿€OFÙÿhÿ½ÿ©ÿŸÿÄþðþÉþàþ—þ}þsþ…þŠþ‰þƒþXþ6þBþBþ§þÜþmþ‚þÔþïþªþ³þïþªþäþ ÿMÿÿ¶þëþ/ÿâþÞþÿÿÿ6ÿÞþþÿÛþûþ}þ'þ‰ÿ÷þuþOþ¨þµþìþ‘þuþËþ»þVÿèþ†þÿþÿõþ*ÿúþºÿ=ÿÆþÿÐþÞÿ(D«ÿ—ÿ•ÏÿÁöþçÁs/º`jP[±ÿçÁ,Š:'Do’Z.8ƒó k»Œom÷ÿ f,ÿôÿ˜ÿ©ÿØÿ“ÿmÿˆÿÿ'ÿËþqÿ™ÿÉþ“þøþ~ÿgþ ÿBÿKþXþHÿVÿÔþþqÿOþÃþ»ÿåýzÿšþ¹þÈÿ*þâþáþNÿôþ+þàþ‰ÿÿóþ(þ ÿ¨þàÿÿµý8ÿ¸ÿWÿþYÿeþpÿ%Iþ¦ý¨ÿîþjþŒþQÿÓaþèýøþ1+›ýÌþ'ÿJ¿ÿ{þþ1ÿŸÙþãý| ÿ—þ$ÿ{{þ‚þ0hþÿàÿïëÿ3ÿÊþÊ]¬ÿNÿèÿ¿ÿz<[þsÿMñÿ$ÿOÿhÿGvÿ“þÿÜ»þýÿ8ÿ»Íÿ³þÿ¹¤ÿÿÿnõÿ¥þÊþlé†ÿ+þ¦ÿGqÿèþéþ÷ÿxRÿLÿ<ÿ­ÿÂÿ­þBþxþKþUÑ þ!þýþ<Cÿ’þ‰þCÈÿáþÿcÿ;ÿÖÿ.ÿãþÿÿ»þ£Mþ4ÿ\ãþÿïþÉÿöÿbþÜÿ"aÿéýÇÿ{ÿÖþxÿ¡ÿpþtþÑÿ‚§þ¾ÿñÚýô{ÿÿ¥ÿ¤ÿÑÿÿ wfþÿðLÿûÿŸýáìÿ=ÿÇþÊÿ}ÿbèþ ÿ¶ÿ jÿiþR”ÿ½ÿÿnÿlÿ£§þ4ÿ:rÿ+ÿ£ÿ§ÿ½ÿ²þ ÿ”!þ Çþ•–ÿ*þ§ÿ:Îÿsþ ÿíÿ8mþ_Kýp™ÿ¶þHþ"‚Žþ¸þšþ–þÿ…þ‰ÿjÿwëýÿâÿE^þ-þ'ÞÿÌþrþNÿtÿ”þ«ÿxÿBÿáþŒÿ§ÿ™þ,ÿ,ÿÿÇÿ%ÿÒý{¤ÿ±þ'ÿ²ÿ]ÿuÿ©þK þªÿ|ÿÞþzÿÃÿ„þ €þŒÿOÿkþÿÈ%ÿtþ©þøæþ@ÿüþçÿ"ÿþ³ÿ-+ÿçý.FÿQþ¹ÿxÿÿ!ÿ<ÿ!Ÿÿ¸þŠÿ7ÿÝÿ®ÿ ÿÇþ€¬þýþùÿâÿ?ÿMÿžÿ'ÿ“ÿLÿÿÅÿ÷þ÷þ[2ÿÎýi-ÿsÿçþªÿ…þäÿ¿ÿmÿ­þÇÿé¿þmþLØþ¤ÿ<ÿ 'ÿÄÿoÿ'ÿ‡þ ¿ÿmÿ§þ©`ÿ‚þïÿƒìÿæþ×þg!ÿ{ÿKÿìÿiÿòÿ‹ÿŒÿ¹þâæþúÿLÿŽÿRÿ×ÿØÿ«ÿYþ!´ÿ›ÿcÿßþèþg.ÿ©ÿ[þzÿ$ÿÚþY^ØþÑþ2ÿšÿrÿÿ cþ!0ÿ/Ôÿ>ÿÔÿfÿ¡ÿÓÅþ“ÿ‰ÿ8Pÿ’þí*Lþ{ÿH…¤þôþ¬@þ,Üþ#×ÿ|ÿ¡þ>¤ÿ‹ÿUÿàþAýþÏþÌÿjÿRàþ`ÿŒÿ4ëþÖþ<ùÿþ~ÿÊÿ ÿ‡ÿ‘þvÿÿŠÿ45ÿËþtÿG­ÿÓþxÿ¹ÿ—ÿgÿNÿÿ;¾þìÿ×þªÿ¯ÿåþ<ÿ'§þuÿëÿ9ÿÿÌþ÷ÓþþJ0üþ’þ2®ÿŽÿiþ=ºÿ%ÿ¸þ<ÿlÍþeþa±ÿnÿ6þ;Øÿ§ÿàý¡†ÿLÿÿžÿÜþ¡2ÿÅþ/]ÿúþYÿNÿóþLÿ–•þxÿ¸ÿkÿÿ.ÿ§ÿuþ!œÿéý©ÿZýÿ¦ý§ÿƒÉü…29ÿëþEÿÜÿÅÿÿ)ÿ3€þEùþËÿ þuÿÿ¾þIÿÇþþ‘ÿäSþªÿÿ¸þSÿ}Fÿqÿ™ÿÉþô•ÿeþ[ÿmËþJÿ0ÿ—ŽÿÿDÿöÿKÿ‰þðÿÇþ¿ÿ:ÿõÿ„ÿ×þˆÿ ÿÜÿEÿ)ÿÄþ’ÿWÿÜÿuŸþ‡þ Ðÿÿÿ'ÿ;ÿ$ÿ£þLtÿšþ\ÿåŠÿoþÀÿa×ÿùþëÿ7ÿïÿwÿwfþ©ÿÌþþÿ—ÿDþÿܲÿÿ7ÿ8lþÕÿ,$ÿ–ÿóÿ?ÿÿçÍþyÿ|ÿŸÿO¤þhÿãþ"²ÿBþ<Uþ|ÿŽlÿ¹þ<ÿ,ãÿ<ÿÖþ’ÿMˆÿÍþÿ5ˆÿÿLÿ8ÿ æÿTþÅÿŽmþ‚ÿÔÿ¡ÿpÿ¨ÿ4þéÉÿhý|ÿ±ÿþÑÿ¥ýÿì$ÿTþeáþÿ3òþ:ÿ\ÿ0ÿ÷ÿ\þRÿ’ýAûþ–ÿ"ÿ3ÿfÿmÿGÿüþ8@þÍÿsÿZÿ±þØÿ¹ÿ5ÿEþÈÿ^{þ.ÿ´þDÿ§ýÆ0þˆÿ¸ÿÈþ‘òþŒþ¦¼þ­ÿ¨ÿ™þÐRþ~ÿÐÿÿAÿ»ÿtÿYÿ£þ!'ÿôÿ£þÿ¯þøþÿ´·þ«ÿmÿ³ÿ8ÿJÿÙÿyÿéÿïþOÿÁÿƒpþíþ¸®ÿìþMÿ3ÿIÿrþE¶ÿûÿ*þçþò_ÿeýêÿxÿþ˜ÿ¢ÿ©ÿ¿ý¿ž¡ýŸÿæ¹þoÿXÿõÿõþÛÿuÿÑÿÿHÿYÿ±ÿâÿ%þl%oÿòþÒþ•LÿôýÌÒÿ›ÿôþ<ÿúÿFÏþ$ÿN¿ÿ%qþ²ÿëÿ‡5þ`ÿOÿaþO'/ÿCÿoÿ­þ¦ÞÿYþò7ÿbÿÿ‹ÿŠþ{ÊÿnþŒêþÉkþzÿÈÿ8™™ývÿ«ëþþÍÿìçÿŸýE¢ÈÿþàÿAÿƒÿÿÿôþóþ¼ÿãÿÂÿAþ®ÿª3ÿ·ý“<ÿþ=å2þÞþRƒÿpÿþúÿ óþùþzÿÉËþ”þÏÿg ÿâþÿI´þZþ‘Ôÿ_þêÿZÿ*ÿ‰ðý7çþ"ˆÿþ¿ÿ(JÿNþUÿãþ™ýÇžÿÐÿ¸ý×þxþÂýäÿÑÿþ¹þ½þ­`ÿÿ§ÿ’þÿþ†ý¶óÿªþLÿòþ )*þÿÝÿËþËýE)ÿäþ£ÿ^ÿ<ÿÈÿ¤þñÿgÿ«þ7çþÿ€ÿ~ÿyÿ]ÿ‚þ]üþDþKAþÜý¾~ý·þÊÚÿaþ,ÿ0ÿÀÿ0ÿÿzÿ ÇþÿSÿ%ÿíÿkÿ/ÿvÿ ÿU’ÿ¾ýÔðÿPþ.öþ¦ÿ('ÿ—þßÿmŽÿ°þ£þçÛþ§ýAÐÿbÿxþ6r¦þ¶þfLýÍÿuwÿþöÿÁ=cý¼„²þ5þ>èþ§ÿwÿÞþÿ„þjðÿKÿ3ÿÏþæþ®þ™'sÿ`ýrýnEÿÖþÌÿ˜bþÿHØþõÿeÿù`þˆÿ5ýþøÿ-9ÿ<ÿÄqþ°ÿªÿÈÿ4ÿ0ÿf—æý‡ÿþý,4ÿòþªdÿRþæFÿpÿçÿþízýüÿ8Oþ ÿWWÿFÿjÿjÿ&pÿ5þ¸ÿsþ<ÿliÿÐþÍÿ}ÿ'òþÿ}½þUÿ3þ“úÿý4-Óüù)/þ£þšGÿ9ÿßþ{ÿé{þ›þÅÿPXþFþŽ1þÖþ{«ÿæþ’þ¿ÿyYÿþ’þÛ06üÛþ±ÿ¢ü ÿVÈÿ'ý@ÿ´Üÿþhþ f8ÿÊýNÿÇÉþ£ü{Tþý¶Úü´þ|ÓÿŸýpþì½þþ4ÿ‘Åÿ<þŸþT9Sþ³þðÿfNýÇþ…«ºý\þº5#ýþ…ÿ;þûý×P2ýnþæÙÿ(þcþèeŸü?ÿˆŒÿ9þFÿ­Tÿ|ÿ—þ2yþÓÿÿSÿ@þ_XÿnþWÿ£ÿƒÿ ÿìÿžÿ¶þÿ¼þ}ÿLÿÿÿPÿäÿÛþ¶ÿžSþˆÿ§'ÿjþ½jËý:ÿg'ÿéþuÿæÿÓ­ý£ÿ½ÒþóÿbÿHÿ"{ÿïþ+„ÿ²þnBÿëÿsÿ"ÿ§DþSoÿ,ÿ%ñþ*rÿ×ÿ´þ §7þþÍÿÿ¯ýðÿ¼>ÿâü]Wþþý$%Âü?þ¹þÿþvâSþqý&lÇý}þ€ çÿºþaÿ©ÿÝþJ›ÿ8Ûþ¯ÿ J-ÿNÿu´ÿ ÿ¿ÿ ÍþEÿ„“þoÿôÿÜþ=<ÿëýe|9ýÿÉõþšþ>ÿÉÿ<þÑÿ®ÿºÿñÿnþ¿ÿ4þÓþgåÿ×þ=þÛLþOþäòÿõý´þ¯?ÿ@ÿìýO·¢ýÉþ"æÿ—þ[þÒÿRþIÿ`ÿÜÿßþvý#äÿEýÛÿOÿ½ÿ¯ÿyý¢ÿþõþ‚ÿpÿYSýTÿ[šþÓý²‡ñýÍþqÿ{1þ¹þ5áþ¡þ*ÿÛÿ˜þ;ÿNÿÝþ…ÿkÿúÿ ÿùþÿ4ÿ•ÿ;ÿyÿxÿÔþ#Mÿ ÿÅÿ‹ÿàþÿ»¦þ×þ ’ÿFÿ)ÿ^ÿkÿÄÿ‰þ¥ÿ}þˆÿ8dþ1ÿ]òþíþôÿ®þ»ÿ’ÿ_ÿÆÿÒþùÿµÿºþãÿ·þþÿËÿ ÿªþ¶ÿ!ÿÖÿnÿ\ÿnÿ¦þϺÿ±þ;ÿÖòþÿ¥ÿºÿ:PþÛÿ´™þ.ÿM3ÿiÿ¯ÿ¤ÿIÿSÿÚÿ—ÿ9ÿBÿÄÿÊþÿaÍþiÿ#ÿ½ÿŒÿxÿbÿ3þ[þîµÿ³þÑÿ€ÿUÿ·ÿyÿ%ýƒþÊÌþïþ´$´ý9ÿ¤ÿÂþ/1Òþ ÿóÿlÿ2ÿ‹ÿ[¦þgþ}ïÿÿ¡ÿ#.ÿÿrÿìÿlÿMÿóÿUÿCÿ®ÿ ÿ~ÿnÿ“ÿýÿhÿBÿÇÿÿ¢ÿGNÿÿ¹ÿ†ÿ«ÿEÿšÿ„ÿúþßÿûÿÿwÿ°ÿ£ÿ]ÿ˜þ‰ÿÌÿÝþÿKÿ¦þÄÿ5ÿNÿ±ÿMÿPÿ´ÿ¡ÿ&ÿoÿ»ÿ}ÿJÿ¢ÿ_ÿtÿ¡ÿÈÿÿfÿËÿqÿhÿ­ÿ~ÿ8ÿ’ÿÿAÿtÿ¤ÿrÿÿ…ÿ—ÿdÿ{ÿGÿ¡ÿsÿLÿVÿ!ŠÿRÿÄÿÿNÿãÿÓÿHÿjÿ«ÿ˜ÿvÿ£ÿíÿÁÿèþ/ÿóÿ\ÿ~ÿCÿÖÿ|ÿ¹þÜÿôÿLÿ]ÿÙÿ1ÿwÿªÿœÿÿÿ?ÿ?ÿ ±ÿ?ÿÒÿòÿÛþWÿþÿ˜ÿ^ÿ»ÿÿ5ÿªÿ·ÿ°ÿ—ÿ×ÿaÿaÿÆÿÿ€ÿ‹ÿkÿ·ÿYÿ`ÿãÿ~ÿOÿ¼ÿ”ÿøþàÿ®ÿ[ÿŸÿÃÿÁÿ&ÿÀÿ+'ÿoÿÞÿëÿpÿ±ÿ”ÿKÿ ËÿrÿÛÿÇÿ^ÿÔÿ¥ÿsÿCÀÿVÿ#ÆÿFÿÓÿÉÿÑÿ¼ÿ^ÿ»ÿ…ÿ¡ÿ2tÿ'ÿ áÿ]ÿ¦ÿWQÿUÿiÿnÿ±ÿvÿÿÆÿ}ÿPÿåÿ©ÿTÿpÿmÿ‘ÿÉÿÀÿ“ÿ¼ÿÿgÿ†ÿ¿ÿŸÿ`ÿnÿaÿŠÿZÿ|ÿ ¹ÿ ÿ®ÿC^ÿ~ÿ¥ÿ¼ÿàÿ¤ÿºÿÙÿ—ÿ„ÿÖÿüÿ8ÿÿ²ÿGÿþÿ ÿÿ¯ÿéþðÿõþ°ÿãÿ}ÿ}ÿÀÿüÿÿ¢ÿRÿÿŸÿÿ„ÿ£ÿéÿZÿxÿÎÿvÿˆÿªÿÿÅÿ¶ÿMÿhÿîÿÔÿ\ÿ­ÿ­ÿŒÿ}ÿÚÿÄÿPÿ{ÿ¦ÿQÿ¦ÿÚÿ`ÿ*ÿ¼ÿ¤ÿ`ÿªÿsÿ+ÿKÿ•ÿ+ÿ+ÿ§ÿŠÿYÿÐþ(ÿÛÿ4ÿÿ_ÿÿÁþ8ÿxÿôþíþ!ÿïþ2ÿwÿÿñþÿÿÿ/ÿ5ÿ#ÿÿ0ÿ4ÿûþYÿÿÿÿ@ÿÿRÿ„ÿ9ÿùþÿ‚ÿUÿÿ‚ÿÿAÿWÿ1ÿvÿ‚ÿ5ÿþþ×ÿ€ÿÅþœÿàÿ9ÿZÿ™ÿ?ÿiÿ%ÿNÿïÿ9ÿrÿÿÿéÿZÿ`ÿøÿžÿ¯ÿ)±ÿ‰ÿÿºÿÿtÿÒÿ°ÿÒÿ$ªÿVÿÔÿÊÿ¿ÿïÿ¡ÿ[ÿÅÿ¹ÿªÿÀÿäÿŸÿJÿ±ÿÏÿ­ÿŠÿsÿœÿsÿ•ÿîÿ£ÿoÿÿ˜ÿ—ÿ’ÿ}ÿYÿPÿEÿkÿ’ÿ.ÿÿGÿ5ÿ ÿ*ÿÿ¨þæþÿ‚þÑþÿšþkþªþÑþ±þ¾þÂþŽþ§þÇþïþ2ÿ½þ’þíþUÿiÿÿÿðþEÿÀÿÿ~ÿ›ÿÿ®ÿ²„ÿáÿMp_Üÿp¥™OeÊ‹æ@Ñú…P&ÛÍ´\m†¥˜£^ Ñÿcÿqÿxÿüþ«þŸþuþ,þþþîýíýóýöýþFþDþCþrþþqþ‹þšþœþ£þÈþùþÿ(ÿ3ÿXÿÿŠÿrÿ_ÿuÿUÿQÿ_ÿÿãþæþçþõþÄþþ‹þ”þþSþQþþÚýúýöýÙýØý¼ýÖý"þMþCþ+þdþ‘þ«þ°þÁþÂþ•þÿ^ÿÿ4ÿzÿrÿÙÿþÿ¦ÿúÿDðÿOZ^l‚æ‚_f1øg™ö3êÏ€:ÃtMíÿ°ÿÿbÿ'ÿºþgþ]þþÅý­ý–ý}ýxýœýÏýÑýÐýîý1þUþQþEþ_þ—þµþÎþñþÿ0ÿiÿ–ÿ»ÿÀÿ¸ÿÑÿëÿÛÿ¿ÿ¨ÿ—ÿƒÿ”ÿ–ÿiÿKÿSÿhÿJÿÿÞþÅþþIþ'þãýµý˜ýyý£ýžýyý¥ý¯ýÂýãýÏýôý%þþ4þiþvþ’þ¿þíþýþ!ÿ/ÿeÿ’ÿmÿšÿÌÿàÿ &!\ ÉÞÂì%dee¿[xå>f±Jæ*ÑgXD2ÉÉœ"ûÿÞÿ¥ÿ`ÿ¾þþ þóýzý&ýÿüýcýbýˆý¾ý¿ýõý-þAþ8þþþLþˆþŽþ•þÐþ0ÿŸÿÁÿÃÿæÿøÿÐÿ¢ÿ{ÿbÿfÿ]ÿSÿGÿ?ÿSÿjÿMÿ ÿÑþ¯þ”þaþàýlýuý‘ýCý ý6ýGýUýqý|ý˜ýýpý¨ýãýÍý´ýãýDþ{þ\þfþÆþøþëþÿ-ÿFÿSÿjÿÍÿüÿÈÿóÿT‚th²ßÍó7Aeµ]~ÖbÁÌ6ãZú/ÙF6[½–+Ïÿaÿ ÿxþÏý±ý•ýý®ü´üÝü5ý+ý5ý˜ýºýÐýêýèý÷ýæýÐýþQþtþœþÜþLÿ·ÿÐÿÎÿùÿ ëÿ²ÿ¤ÿ¢ÿ}ÿ|ÿ“ÿ§ÿ³ÿŸÿžÿÀÿ¨ÿSÿÿëþÃþŽþ1þßýÀýÂý¶ýtýeýˆýnýný{ýgýýuýuý·ýÒýáý þCþ‰þ¥þ°þÒþÿÿÿ2ÿLÿƒÿ¾ÿáÿL^©ÛÎÄÛ b—¼v£éo‹Àx$uèÞ|&uàà¨gÆÿyÿSÿsþØýÿý¶ý-ýý=ýˆý¡ý\ý¡ýþòýÎýºýÖýþÏýÐý?þ}þ¯þìþ7ÿ¡ÿÓÿÇÿÞÿöÿòÿÝÿ®ÿ›ÿ¾ÿÇÿºÿÊÿçÿ"èÿÍÿÚÿ§ÿKÿÿÙþËþžþRþ%þþ#þûý‰ýˆý•ýYýcüjüyýiý ý¯ýÐýcý¢ýþ‘þhþóýfþ¦þ—þÕþ#ÿ ÿÿæÿ VMq±Š¨¥×Lh©‚ÉâJÙ6¥àÝÐôÍß_×èÙ–…>®ÿ/ÿ™þPþàý ýìüVýAýÑüÃü.ý­ý²ýhý ýüýíýÉýÞý'þ^þcþµþOÿ~ÿvÿ‘ÿ¹ÿÔÿ¼ÿwÿ\ÿqÿ~ÿtÿ`ÿhÿÿšÿqÿOÿ9ÿÿÓþxþAþBþ/þíýÄýéýþ ý<ýHýDýÔü‚ü üâüýBý¸ýUþ‚þkþ}þþiþ[þRþ~þ¦þyþoþðþãþ¥þ ÿwÿºÿÃÿøÿ<\œÐû!O¸*+†A©Ë]3®D쥺C5±añÿËÿŸ®Õÿ3ÿÐþþKýªü}üü0ûû?üAý]ýGýÉýŽþ´þZþgþ¿þáþ ÿ½ÿ”%M¹Ã.s ôÿÅÿnÿCÿTÿxÿPÿáþjþ÷ýpýÌüTüGüxü¤üÃüý´ýêý™ýIýRý>ýîüâü4ý¯ýþCþ²þ ÿÿºþ…þdþþúýþNþgþ|þ«þÅþ†þ;þþþþ þ¬þiÿ ›k¹Øõ9Ý~4ØZè„Ïžº±ö‚Ê¥PnIþ þÎþéþ£ý1üjûkú‘ùÔù¢ú­újú+û ý¼þÐþHþ³þÿ"]оI”3½S Ô’ÿ•þ[þsþ*þ€ýßüwü×ûÿúoúqú»úÕú û³û“ü$ý*ýýFýŸýáýåýþÌþ<ÿcÿ[ÿ=ÿ%ÿÂþ?þðýÑý»ý—ývýxýtý?ýîü­üü…üyü“üÝü6ý ýþjþíþ‡ÿš$±7¦ wîU¥Z¼'€ú_ÀÓö¢àç nÿ/ýýDþlþõüŽû¡ú²ù¦øEùUûaüJüüüÏþŠÿqÿAï8 /…ö£Çþ—þ[þµþpþÇýŽý£ýEýQü”û\ûû¤úÉúéû:ý½ý¯ýãý‰þ²þþ¾ýåýUþðþÿYÿjÿ(ÿÒþBþ¹ýKýõüøü0ýZý}ýý6ýÐüšü‰üaü3ü}ü#ý®ýÿý;þ²þ%ÿ\ÿ¨ÿJ3´ó‘aÃì N²ûaú§ì4½BñU —µâà‘é¬þ¬ý¦þ,ÿþCü%ûpú¿ù0úKüÐýñýÕý²þ6zoÿýþœÿ‹pK:Aþš,ÿ­ýpý5þˆþþ_ýéü)ü"ûœúÞú.û)ûnû üþnþ¸ýHý“ýÓýÝýæý:þîþbÿsÿ^ÿôþfþªýý ýOýaýý¨ý¥ýwý!ýü üÙû$ü’üìüAýœýäýòýæýþþÿ–ÿy~0m¼*Yàw˜+¦ÔÝF⳯hÚª+Õ¡@þÐýÅþ¾þ#ý‡ûû´úúúžüþþÔýiþmÿfÿÃþ3ÿ}Lpù °Hâÿ°ÿòþMþ}þÙþaþWýÈüŒü×ûú#úìúÖû/ü^üý¤ýlýÓüðüWý¡ýËýþáþmÿ^ÿÿŠþ&þçý“ý¸ýÛýêýþ#þâýsý ýÌü‡üJü—ü+ý‚ýŠý€ýŸýÁýý¬ýNþ:ÿùÿ‚5Þ1¥F˜2ßm ?ßX)Öé ͆97Šÿ þtÿoþ¿ûyú´ú´úúü—ý÷ýìý]þ ÿÏÿvþþ°ÿ˜…{Ü-SØC(—ÿ¶þ˜þsÿ ÿjþòü/ü²ûìú;ú±ú¿ûQüXü¸üaý`ýuüü—üñýŒþþËþƒÿ£ÿAÿRþ þ4þóý,þŽþ²þ¢þAþèý¿ýýŒü—üÃüýHý_ýjý7ý ý5ýUýƒýÿýÿ´<‚Éíd)ß½CóöýjÃgÓÅ á¤Íb£‰1ÿúýÿáÿaþqûÈù!úhú‹úùû›ý,þçý þ$ÿuÿMþãý^ÿ‘öÃÓáXÿ¥ÿ‡ÿâþ¸þaÿ„ÿGþüvûû‚ú(ú¯úÎûpümümüÌü³üóû†ûü›ýpþ‚þ þëþ)ÿªþóýÍýÚýþsþÕþõþªþþ›ýTýöü´ü´üý_ývýýRýðüÈüýuýÅýNþ7ÿ5·ÇÓ:¡ó”TªåD©ïxÇcA Ä ôÆpÀy_ÿ‰þ—ÿëÿËýýúìùoú³úû¢ü9þjþæý*þ!ÿÿþþRÒ¼¦Ÿ0ºÿöÿÊÿBÿIÿòÿÑÿGþ‡ü¥û=ûÉú úTûhüÈü‰üvü·ü€üÎûµûtü¨ýiþŸþ½þïþöþ€þþóýþ\þßþ9ÿ/ÿÀþXþüýšýZýIýRýbý“ýÆý»ýeýøüéüRý³ýÿý…þmÿJ®¹à?­,Ä€9Ð$oÁb¾J𣋠¤=æÞÔ6³ ÿSÿ9aÿâüÝú«úþú¹ú8ûáüþÙýý:þèþ)þ9ýþ@¼éÚD=+õÿ¹ÿLÿ²ÿ^êÿ]þý…üüAûüú®ûqüüFümü¤ü;ütû]û üÇü^ýºýþRþTþþÇýŸýÔýNþµþôþÿÿÞþƒþþßýÇý›ý•ýÜý3þ(þµýqý•ýÆýÒýüý›þrÿ JŽÊþ,gñ{ÿtÈûH~…¦ú®8‹‹nB²²GÃy¾å‘ÿñý;ý9ý²üünüfýßý¤ý®ý5þ5þnýýãý ÿpÿgÿÑÿ|‡ôÿŽÿ“ÿÿ#ÿÿdÿÎÿ¡ÿ ÿŸþsþ%þžýNýfý™ý—ý‰ý®ýãýÊýoýHývý–ývýsýÙýaþ€þLþSþ¥þÙþËþ¿þóþ.ÿ7ÿ/ÿJÿlÿ5ÿæþåþÿóþèþðþÿÿäþÞþèþûþÿÿ5ÿIÿaÿœÿ ÿ¯ÿ¸ÿÖÿñÿ'ZˆžÁè 0e—®Èý=lTüýÀˆL?K(Ô†\)×ÿŸÿÿ„ÿcÿ@ÿ!ÿ ÿãþ®þˆþzþ|þ…þ“þ©þ¹þÆþ½þ¢þŒþvþ\þRþ]þyþ‚þpþ`þ\þ_þOþ<þ@þQþYþ]þwþ–þ£þ¥þ«þ¿þØþÞþåþûþÿ.ÿ3ÿ:ÿDÿGÿBÿ<ÿ;ÿ;ÿ9ÿBÿOÿPÿDÿ5ÿ-ÿÿÿÿòþëþòþÿÿöþïþÿ ÿÿ÷þÿ+ÿIÿKÿZÿtÿ†ÿŠÿ‘ÿšÿ³ÿ»ÿÇÿéÿ $3FZi|”¢½Þ.W‚¡ŠI*?ßßÿ¶nR*Èÿ_ÿ7ÿ9ÿ*ÿ÷þÒþÝþÝþ°þyþpþ‘þ§þšþ™þ½þÖþ»þþƒþŒþ‡þeþ]þ‚þŸþ–þ„þšþµþ­þŒþ“þªþ¾þ·þËþÿÿÿ ÿ$ÿ?ÿCÿ5ÿ7ÿUÿtÿxÿZÿ^ÿYÿUÿ3ÿ'ÿ?ÿ(ÿ ÿøþÿÿÿÛþÝþýþÿâþëþÿßþÿ$ÿÊþçþÿèþÿÿÿÿpÿœÿ&ÿRÿyÿ¬ÿ‹ÿ{ÿÕÿC¡ÿiÿÄÿ!´ÿdzv˜ÓDb}Á:Lð¢c†O!Ì&ÑÿÁÿ‡ÿÿ±þ¬þÏþÄþ—þ‹þŒþRþþþ&þlþ“þ þØþÿ&ÿÿ×þñþÿëþ ÿCÿkÿxÿbÿcÿhÿ/ÿõþôþÿþ ÿ ÿÿ@ÿ,ÿÿíþÖþ×þñþåþ×þáþøþüþÏþ¦þ­þÆþ»þrþRþ{þþjþ þ'þOþRþ.þ&þoþtþXþlþ–þ›þPþþ‚þÚþ­þžþËþÿ5ÿÿÑþ ÿ¸ÿzÿkÿe°êÿ¤ÿ‹A”,³—— îkmèë<ÉôEmV pXÿûýIý ýƒüüûKüýšý‹ýÈýNþ*þ„ýwýtþ‡ÿåÿ€GˆGåÿôÿçÿ©ÿ­ÿãÿÅÿ"ÿ}þ þ¯ýòüxü¢üý*ýý#ýMý`ý@ý,ýOýÅýHþ£þÿjÿ™ÿDÿÿþÿFÿÿŸþhþmþJþóýýýîüñüïüéüÙüÛüñüøüýøüæüýˆýñý#þ.þnþæþ_ÿ¹ÿŸ:›»ÙJe£"‰Ê„ l©ÿ»‹DÏWG„Êa@•þlþ|ÿßÿ þêûoûéûýûØû‹ü+þTÿ¼ÿ0²€‚ÿ-ÿoƒÅG}=Nÿ4þöý–ý:ýGýŸý‰ý¸üüÍûµûQû ûwû¢ü¸ýFþŒþêþOÿ”ÿ“ÿ‡ÿ™ÿÂÿBÒí1dÿÛþ@þUý`üøûÿûÕûËûüzü†ü üäû^üßüàüµü ýçýlþAþãýìý_þÁþÁþ»þ:ÿßHq¡™owÌ&^­9óu¾ú©\®z 4 nÿ]èÿÉý ýFþ°ÿ¨þ%üûûòû|ûüþ±ðú¸À4ˆ¸ 1ÐF5ÿCýQü³û ûÅú2ûäû üÊû®ûþû6ü7ü=ü´üÒýÿ§ÈüC"\fÿÿcÿgÿuþŽýHýýKüåúNú½úûû0û1üuý¯ýGý(ý¿ý/þçývý¶ýwþÒþ†þ3þfþÕþÊþkþ‘þ€ÿtʶãIb=.”LÜY èÁ=¹1ûѲ ž¡%ÿ2ÿ‚ÿõýüIü@þ1ÿ”ýÚûÂûqü3üü”ý¤É~-ÐBþýt: h„ÿ¡ý#üBûgú€ùfùkúµûXüqüÚü¼ý‰þÛþ½þÆþoÿ”°û¼š²|TÚþÔýwýýütûœûÓûPû¯úöúÌûHü8ütü‚ýÂþHÿôþ·þãþÿþ þûý¼ýèý þþôý>þ’þšþˆþÄþˆÿ0UBz p•½$Õ¨SØn ³Hî©{ ã–ÁÿþwþŽýrû°úlüàþáþJý½üŽý´ý¾üýsÿÑ—çÙùo·Q÷PŠþzýÏýþý»ûû£úÚùáøäøKúü+ýÙýÈþ%yÿg5ÄC!¸ji êþ}ýbü­ûûYúúœúUû¹ûüƒü~ý"þ#þþLþõþGÿ ÿªþ¯þ¢þ3þ¼ýýäüýÙüéü?ý¹ýþBþœþ%ÿÿÜÿéÿøÿs&—âmÜyÙ‡ –¹|@ òÉ´ýýôüû¾ùúwý@ÿÉþjþ$ÿÿþ8ÿ¾bä åH ×ÿ/ÿ#ý-ûðúÕûñû5ûÙúDûsûÙúMúßú]ü·ýþŠÿÏ7è%6€ÿÇþ@þþþÙýXýÐüBü¼ûUûTûhûÊû[üýþÀþZÿ¼ÿ»ÿ¢ÿ&ÿóþ¶þRþèý”ý¥ý¨ý‘ý)ýâüóüý/ý+ýmýøý‚þÿvÿûÿw½Õø‰/É(±FªÂ†ðkÍ„]88Øþý'ýü_ú„úŽü#ÿ”ÿŠÿn£YœÿxÿD,02ÈÛ¥MŠÿÓþæü…ú‹ùZúûçúÜú¡û¦üÛü üÇü¥ýƒþëþ‚ÿ†Çž­Hްºÿ¬þÄýèüfüHüuüÄü ý,ýýýEý§ýµý£ýÞý\þÿãþÌþÿ2ÿÿ+þÕýÒý•ýýtüÅü.ýGýØüºüGý—ý™ý*ý=ýËý?þ‚þ«þdÿEÊì|öï¤Foò¥f£ƒ\UúõþDýdý¼ûbúÊúßüÿ.ÿ¨ÿû?g›ÿàÿ¢ã¾ègù¹[Ÿÿƒÿ³þ\ü ú}ùDúYúøùŒúüMýJý,ýÚýîþ*ÿéþRÿIK’‰›:a/ÿ>þ™ý½üÚûpûÌû{üûü<ývýþ¥þ ÿ'ÿÿÿYÿaÿ&ÿÃþñýÅýgý-ýöüÂüýý ýþüiý×ýœýPý0ýÓýþÉýgýMýåý)þCþ„þ1ÿ9Ñ,pÃôɨÛ.€´çÂ_›§m2ªHÁ¾[þþYýéútúßûeþ@ÿcÿßœìH¯<‰VSÒþÿÌÿÇý û¾ùúúiùµùhû ý|ý•ýþèÿ7‹ÿtÿ)ÐäÄ2hÙÝÿÿ®þÈýhüyûjûóûgü¹üUý;þ ÿÁÿTd"«ÿKÿ›þþÌý,ýý´ü¬üõüäüýüúü_ý¸ý²ý¨ý³ýþýþíý›ý_ý“ýµýØýþœþhÿ¨.‘¾Žq~š›À2¾‰-Ô‹´z]ž_ÈÿqþþºûúûýŠþˆþ˜ÿ(ðb'Ýyx ?,_‡ÿ7üˆúkú/úù…øúåû¶üôüþý·ÿVÕÿ“ÿx ÍÿHö«ÌÿJÿ.ÿ³þUýü§ûÀûâûøû„üžý¬þXÿòÿ€ëõ“{ÿØþÍýý‹ü üóûÈû.üŒü´ü/ýý þþâýþGþEþÐý{ýƒý‚ý|ýYý©ý9þÌþQÿãÿ³)LAMtN‹ó‚”X&›,Ù™%“ð£eÿ¾þ/ý‘úôúÄüÒþ-ÿ…ÿôæ¬æÙ–ÿÎO€¸ÿLÿI¤ÿýûŸúpúNùœø²ùiû\üæüaþuhö}Îç*Nÿ-ÿ™ÿlÿãþÏþñþÊþÙýçü–üüfüIü£üý¹þÈÿ—SËýÐ(8 ÿçýàüHüœû5ûYû£ûUü¬ü7ý×ý%þLþþOþsþ*þ×ýý˜ý”ýVýBý^ýÆýþŠþÿ«ÿI¢Ü(9tãVà„&¬-Êdµ®æÇ¢“ÿ þTûjû¢üÿý‰þØþ;<^F·ÙÆÿ€m¹|ÿsÿNÈÿíýzü³ûïú›ùËøVù.ú­úgûýûþ3`ÕÉ(ŠÿQÿLÿýþ«þÆþøþëþuþäý•ýMýõüšüwüÑüŠý[þ ÿÅÿ1†Fõ_Iÿ@þüü-ü«ûöúû`ûðûšüçü•ýéý&þJþ0þAþýýÇý²ýý“ýkýný—ýÅýþSþÕþSÿÁÿ1ß!Ix»W¥û„š´`š÷m[’½þOü ý‰ýYþ¶þÙþ]Ù\þ° *Õÿƒ§½ÿÿºÿˆäÿ§þôýý—üEû—ú§ú úmúöúaü˜ýHþÂþ’ÿXOìÿèÿÁÿTÿ%ÿVÿ`ÿGÿÿ ÿÿòþ þTþþþ!þþ4þþÿÿÍÿïÿ! ´ÿQÿÀþ=þ¢ý ý÷üìüüü0ýiýÔý þ+þIþJþ7þüýæýßýÓýÚýæý.þjþ’þÄþéþ*ÿjÿ’ÿÉÿþÿ9¿ý6ŠÎø>p´áVŒD etÜ!M¢8úÿ3ùÿ¬ÿ)X*Ä’=hÐÿ%ÿnÿZÿõþÏþÃþIÿŒÿøþ¡þ™þyþ@þÈýfý]ý3ýýý6ýDý]ý]ý‘ýÍýÌýÚýîýþ4þ;þ4þBþNþqþþ·þÐþìþÿ;ÿ`ÿiÿgÿXÿGÿAÿ=ÿ(ÿÿìþ×þÒþ¾þ‘þoþRþGþGþHþDþFþAþ@þOþFþ/þþüýøýãýÈý¼ý´ý²ý¾ýÐýãýøýþþ>þ\þ€þþºþìþÿ@ÿpÿ¦ÿÞÿ>q£ÖC…¿ú8s±èWr.æµÓ" Ö›£’WúP±k- äÿ†ÿGÿ)ÿÿÿÿ¦þOþ"þ þ þãýýý¤ýšýŸý‡ý„ýŒýrý€ýŒýuýyýý›ýÁýÆýÏýèýþ3þiþˆþ©þÆþòþ6ÿfÿrÿuÿpÿÿ˜ÿ ÿÿŽÿÿ‘ÿ–ÿÿ‘ÿ|ÿ`ÿEÿ.ÿ ÿáþ½þþþŠþþiþ]þUþJþCþ'þ þþþþþþ1þMþoþ›þ¾þÝþûþÿ5ÿeÿ‡ÿ±ÿßÿ E‡Æü3r³ò-k± N½†IÿûWR<·ËÅL£ü¢`1®ÿYÿ3ÿ$ÿ&ÿÿ¾þWþ8þþûýÒý…ý‚ý€ýcýwýfýXýkýMýaýyýWýRý\ýwý¨ý¬ý²ýÒýñýþGþgþ|þ‘þ¯þéþÿ$ÿ!ÿ#ÿ6ÿTÿWÿHÿ<ÿ;ÿCÿXÿ^ÿKÿ)ÿÿÿíþÇþšþoþZþTþQþWþGþ7þ/þ-þ/þþóýÛýÞýíýþþ-þ\þ€þ¨þÎþñþ ÿÿ5ÿbÿ‘ÿ¼ÿóÿ,fªãR…Åþ=Ê]’^ËÆ!+ÿÓˆž»‚2–ä–j,÷ÿÿ9ÿ8ÿ3ÿ3ÿ$ÿ¾þ_þ>þ$þþÝý€ýtý‘ý‰ý™ý‰ýyýý~ý}ý‰ýbýRýhý†ý¹ýÑýÒýñýþDþpþ…þ™þ±þÌþþþ#ÿÿÿ7ÿTÿgÿ^ÿMÿHÿOÿ_ÿqÿbÿAÿ/ÿ#ÿ&ÿÿéþÓþ­þþžþŸþšþ€þjþoþ{þeþIþ4þ9þIþJþUþsþ’þ­þÔþøþÿ%ÿ.ÿKÿuÿžÿËÿûÿ=~¸ô!W¿ø)` ï0yW¸Ç13׆«¦ƒ=ƒߌdO¦ÿWÿIÿ?ÿDÿ(ÿ¼þSþþþøý»ýpý~ýŒýˆý“ý€ýý‘ýkýý„ýhý_ý`ýýÀýÇýÌýåýþAþdþyþˆþ˜þ°þìþÿÿÿÿ?ÿ[ÿMÿEÿ:ÿ-ÿIÿJÿ:ÿ'ÿÿùþ÷þ×þ³þ‘þlþbþhþbþVþ>þ(þ;þ?þ"þþþþþ$þ;þWþkþŽþ´þÒþêþùþ ÿ/ÿSÿ}ÿ«ÿÕÿQÓý*W…Áó#mµÿ3i\ מÕõŵpMk=  ä}Gèÿ¢ÿIÿÿÿÿþþÁþZþþýýØýÀýý^ýsý^ýaýuýlý€ýoý]ýyýlý\ýfývý ý·ýºýÛýþ*þPþlþ{þþ«þÎþÿþ ÿÿ,ÿKÿgÿyÿ|ÿtÿnÿaÿkÿzÿvÿaÿBÿ2ÿ%ÿ ÿùþàþÍþºþ§þ›þŒþuþmþcþVþMþ?þ<þFþKþLþTþbþuþŒþ¨þÆþâþüþÿ6ÿ^ÿ…ÿ¨ÿÙÿ 9h“Åþ/b˜Çù0n¬Ü <hMÙÁòöÏ‹h[4…æ‡V6 Èÿuÿ>ÿÿÿÿ¹þZþþþñýÙý¨ý˜ýýý•ýžý—ý’ýyýyýýƒýrýtý“ýÃý×ýßýëýþ/þ\þ€þ‹þœþ·þßþÿ(ÿ4ÿAÿMÿmÿÿ¡ÿ™ÿˆÿ|ÿ|ÿˆÿpÿ\ÿDÿ)ÿ)ÿÿýþàþ·þ þ™þ|þbþGþ.þ(þ)þþ þþõýþþþ!þ"þ5þ]þqþ‹þ«þÁþíþÿ=ÿfÿŠÿ«ÿàÿ@i‹Ãú)Z„¬âG{¦Ø$ö¶Ñʧ`0 ïž‘T6ÀÿZÿÿåþÛþÙþ®þOþùýÔýÈýÂý›ýfýNýFýKý_ýdýQý>ý6ýJýaý\ýPý\ý„ý±ýÑýèýþ%þPþ|þ˜þªþÃþæþ ÿAÿ\ÿ`ÿgÿtÿ’ÿ§ÿ©ÿ¦ÿ“ÿ‹ÿŒÿ‰ÿxÿ]ÿ%ÿÕþÿùþºþ·þ‘þ|þþ]þXþUþ:þ4þ(þ0þ:þ$þ"þ3þ=þHþTþgþ‚þ‘þ§þÅþÕþýþ1ÿVÿyÿ›ÿ¶ÿåÿDmœ½çS”ÄçQÒõ<ÊâÙ®\É~c@Ô®mn}ë;Ôÿ´ÿDÿÿþÿ®þþzþ}þ¹þwþ(þ"þþþÖý°ý¸ý®ýžý¡ýÇýëýÚýÙýÎýÌýèýÉý½ýÎýÁýèýþþ:þUþsþ¡þ¥þÅþðþøþÿ3ÿPÿ}ÿ‰ÿ§ÿÑÿåÿëÿçÿâÿÛÿ½ÿ‰ÿ^ÿ9ÿûþÌþ²þþ†þ_þ>þTþ9þ#þ)þþþ þíýþ.þþþþ6þ\þKþLþlþ€þˆþÀþéþûþ8ÿBÿnÿ›ÿ¹ÿÒÿèÿ4Rz¬× N“¼ò0p¬Ï f±þes¨#Û—ªq£ í°}ÂÈÿ(ÿBÿËþdþÓýý*þùý¥ýßýþqþ:þíýþ þþ²ýÇýþùýþøýþnþ<þþëýý¿ý°ý‚ýˆýŒýÊýçýÚýþAþ:þþ"þ|þ©þ¨þÎþÿmÿžÿ´ÿõÿëÿòÿöÿøÿßÿ¸ÿ¶ÿ²ÿcÿ!ÿÿ¯þ`þòýµý­ýRý%ýCýgýýtý†ýÐýÞýêýéý þAþ6þPþyþ’þµþ¥þ¹þàþîþÿ,ÿMÿ…ÿ¸ÿ/Hd®ÅãóC„ˆÈM_ªó"«Ú÷U¸ÿiûSzŸõ5°žf01–ÿøÿïþ¸ýþÕýŽýý¡ü¾ý-þþIþqþÿÝþ†þÊþåþÜþ¤þ©þ0ÿeÿIÿ÷þÆþÓþžþNþÖý‡ý–ýˆýýýý­ý}ýaý‡ý«ý³ýý ý'þþËþçþ ÿoÿÿ¦ÿÀÿÎÿËÿÎÿäÿ ñÿÊÿ“ÿVÿ&ÿÊþbþæýuý\ýýÛüü`üyütütü³üÍüúü-ýmýáýþ%þKþˆþÀþÀþœþ¤þºþÀþÕþöþÿ(ÿHÿŠÿÔÿóÿüÿ/g•ÀôW›ò8kÉ%†éG¬øfœRæ"®áýó€Í¤ÿ1ÿÓþ°þêýiüôû„üÌüLüêûúüMþuþ2þ†þÿ4ÿ½þÕþ¯ÿúÿÇÿ¶ÿI»lÉÿFÿ,ÿêþŠþ5þóýìýØýÅý¬ýuýQýýªü¶üöü3ý/ýDýÑýfþ¤þœþ¢þàþÿ%ÿhÿ§ÿÓÿùÿûÿ2Göÿªÿ0ÿøþÝþ“þ>þíý}ý@ý"ý§üVüáû³ûóûøû;üü­üóü'ý‚ýéýèý÷ýNþ¾þÿ,ÿ5ÿjÿŠÿ‡ÿœÿ«ÿÈÿáÿ h®¿©ž»èþLšòP•ÖŠ!oІ £2î‘”¤Ûåbæÿþÿ­ÿûþÇþbþý/ûTû`üTü«û ûMý þSþþ‹þûþãþžþnÿt³á®êl„ùÿÁÿŽÿÿêþÚþ«þ_þõý—ý0ýüü]ü¾üÈü™üÈü€ýñýÔý½ýßý5þ€þÍþOÿ–ÿ¬ÿúÿFa0Äÿwÿ!ÿåþÎþ–þþ„ý^ýMýóüBü÷ûüüòûü„ü²ü±üÚüSý¥ý¨ýÃý%þ¦þôþÿ<ÿ}ÿ¥ÿ¸ÿÔÿðÿ MÀÆž ¾×êçú+u©î/ZÐ~ßoRçOÖ”€v¡ã:ûÿ\)ÿÛþ‚þ¦ýÐû$ûHüœüûû¯û¨ü-þþRý²ý6þDþÛýfþ¢ÿ/ùÿ×/Àøÿ±ÿÔÿ°ÿtÿNÿ1ÿ-ÿãþ{þ(þÎýgýçüüŸüûü÷üÏüÜüDýœýtýRý…ýÑý$þkþÂþ8ÿyÿ‘ÿ³ÿ²ÿ³ÿˆÿÿóþéþäþ¤þ/þýýúýÂýLýøüÖüÎü¦ü™üÚüýý ý/ý’ý´ý½ýåý>þ·þíþÿDÿ‰ÿ¾ÿçÿ=rºí 6PL:A{·ä.}Ê]€ÆI¼€Ä:“U©È¶ºÅÊx¡ÿqÿ ÿâýˆüˆüUýýaüˆü–ý þZý:ýÐýøý£ý”ý þXÿ:ÿ'ÿÂÿc$¼ÿƒÿ¸ÿ¯ÿwÿšÿŸÿ‘ÿWÿÿýþ¯þOþëý¨ýý¥ý­ý€ýhýgý ý§ýnýqý‘ýÍýûýþdþÃþÌþ¿þöþ'ÿÿ¢þzþ½þ¸þeþ3þ+þ=þëý“ý£ýœýXýýJý|ý~ýSýhý§ýžý³ýÑýþ5þWþ¤þÜþøþ$ÿ_ÿ”ÿ¹ÿêÿ+p ØèØÐ B$O`Ji”£³áá rTBµ*žµÕ c(÷X(|±„Àc¦ÿ‰ÿ]ÿzþZýlý'þ¶ýÏüýùýøý;ýý¦ý®ý1ý=ý2þŸþ6þþØþrÿÿ‘þÒþOÿ<ÿìþ'ÿ|ÿlÿÿÿ>ÿýþ¥þNþ]þ}þbþ/þþ#þþþÛýÈýØýñýôýøýþlþRþTþxþµþ±þ_þ]þ‡þŸþNþOþgþ–þpþAþ„þ™þcþMþvþ‘þsþOþ‡þþ©þþþíþÿ±þÇþ×ÿEÿ"ÿÁÿ•ÿ–¯ÿlÿƒ›Fÿ`%36Û‰<8ºÃd5¸vÀ›†q×Ú¨¼Çh—>Ä ù¦ýÍw…çgþÂ03©·ÿ\Ôñÿ4ÿëÿWñþ þÿ—ÿ›þÓýYþGÿ›þ–ýLþôþ*þŠýGþîþ^þ¶ý`þÿyþ þ¯þÙþkþbþÔþ¶þŠþ_þþ1ÿ§þ:þÐþÜþ–þeþjþÿ½þþ‡þ=ÿáþðý«þXÿ‚þ¢þ²þøþ¿þäþ–þîþ&ÿ³þeþêþÿmþ¤þ˜þ$ÿÿ{þÌþRÿÝþ¶þèþ`ÿšþ"ÿûþºþŠþâþ_ÿ´þ¸ÿóÿyÿµþ(¬…þ»ÿa¡ÿuÿ¡ÿ5[ÿFÐÿùÿÜÿŠgÿ/Ì ÿØÿ©þt° Ðÿ$ÿ:Iÿ‘ÿuÈ”þ¾ÿÏÿ…þk€›ÿ›þÿ´þ¦ÿÌþeŒÿþäÿßÿfŸþËþzÊÿýÿÕ9ÿGÿÿ±ÿøþTÿ¦ÿ×þÿÊÿ•ÿ ÿõþÿ;ÿÿUÿ"ÿŽÿøþKÿ¨ÿMÿ´þÿþŽþ¦mÿœþæþçÿîÿÚþÅþ<ÿ¾Êþ.þÿœ.þþ¥áþ³þZÿlÿsÿ¥þdÿnÿˆÿžþ¯þÚÉþuþÿµOÿaþWÿNùÿ)þYÿƒ& þËÿ9ÍÿÏþÑÿ;/ÿrÿöþÑÿeÿ‹[ÿÓþ’¤ÿÿ0ÿ+sÿ=ÿ'ÿÌeÿÿSÿOÿïÿ¨ ÿ/ÿ#w%ÿ¯þ¤q»þ*ÿSD'ÿôþ&X<ÿçþ41ôþyÿåÿ±ÿZÿ5ÿ»ÿEúþ›ÿ7úþÐÿ¦ÿÍþsÄÿEÿ£ÿ­ÿÿÿsÿfÿÿŒ›ÿŠþvDÿ\þ=8ãþEÿcÿ |ÿÅþÖÿ ÿ;ÿþÿîþ£ÿcÿNÿ@ÿ°ÿ‚ÿ¡þÜÿîÿøþ¨þF»ÿ–þÿ…ÿÔþ˜þpvÿSþ’ÿDÔþåþZÿUÝþgþ2¼ÿŒþÿùÿ:ÿÿJÿ“ÿ(ÿ ÿÿaÿÿRÿ“ÿ’ÿÕþýÿÿpÿÑÿÏþgÿèÿ"ÿøþ¤ÿ…ÿ’ÿÐþ¤ÿOÿØÿàþ(ÿãþÿ5ÿ~ÿ­ÿwÿ þ÷ÿ\þxÿ4ÿ=ÿ.ÿ}ÿâÿéþHÿÊÿ"ÿ¿ÿ-ÿ{ÿÏÿºþÃÿ˜ÿ:ÿÿîþžÿqþ÷ÿ'ÿÕþÄÿ(óþÆþ´ÿjÿ°þ+Èÿ1ÿ^ÿWÿïÿ¬ÿ‘ÿ ÿçÿðÿÃÿjþbüÿ0ÿàÿjÿüÿÄÿ,ÿßÿšÿ“ÿ¼ÿrÿ ÿ‹ÿÿeÿÇÿÔþ¶ÿÿ—ÿÖÿÿ|ÿ8ÿøþDvÿãþÆÿªþÜÿ$ÿ–ÿtÿ ÿ1ÿºÿÿïÿ0ÿbÿD†ÿ9ÿZÿM¢ÿúþªÿôÿæÿÿmÿ úÿ:ÿÿ`Êÿ ÿjÿéÿ"ÿ,ÿÉÿüÿIÿSÿ33ÿ‡ÿNÿ>ÿßÿÁÿÿ AÿªÿyÿYÿÑÿrÿ'ÿëÿàÿ×þ™ÿæÿ¡ÿ+ÿZÿ×ÿ©ÿgÿHÿÉÿÀÿMÿ—ÿ¬ÿAÿÝÿ žþIÿ1·ÿâþÿ+Ïÿêþ†ÿêÿ`ÿÿÆÿ’ÿÿWÿ5ÿëÿ…ÿÿnÿ–ÿ0ÿQÿ—ÿyÿ>ÿÿ+ÿ¼ÿÿŒÿ/ÿWÿÂÿ!ÿsÿ ÿvÿTÿ®ÿ ÿÀþ fÿÿnÿhÿ^ÿ—ÿ©þKÿ$Ðþÿµÿƒÿ¿þ¼ÿˆÿÌþQÿ°ÿaÿíþrÿ¼ÿ[ÿÿTÿÚÿÿÿÑÿ‡ÿÍþ¢ÿäÿÊþNÿ|ÿ“ÿ=ÿÿ•ÿÂÿ9ÿÿÜÿÎÿÈþúþHhÿÈþiÿ¾ÿüÿþlÿêÿ ÿËÿ=ÿ$ÿÄÿ|ÿBÿ ÿ±ÿTÿ‘ÿ’ÿâþòÿnÿSÿ_ÿžÿùÿìþ~ÿìÿ˜ÿ0ÿŽÿèÿ2ÿäÿòþÙÿ¢ÿ“ÿIÿfÿ@ÿNÿ¼ÿôÿ’ÿèþ•ÿ  ÿtÿQÿGÿ¶ÿÞþºÿúÿoÿÿ ¤ÿŸÿWÿšÿFÿrÿ_ÿdÿéÿ¡ÿÿ´ÿwÿÐÿHÿŸÿ*Qÿ5ÿâÿSÊþ}ÿ7nÿ÷þ) ÿœÿcÿÈÿâÿ'ÿ­ÿÉÿ²ÿ ÿPÿÆÿ7ÿRCÿ ÿ/ùÿ‚ÿCÿŸÿ+€ÿ%ÿöÿ€ÿ‘ÿÑÿ•ÿZÿuÿ;@ÿÿØÿËÿšÿ*ÿ\ÿìÿ¾þ-ÿOÿ2ÿžÿtÿüÿ$ÿdÿ¾ÿ=ÿÕÿhÿ»ÿOÿœÿ„ÿåÿ´ÿ#ÿ×ÿ’ÿ÷ÿ8ÿ$ÿUÇÿ¤þ{ÿ¸ÿºþ×ÿõÿ·ÿôþÐþÎvÿÑþIÿ§ÿg5þbÿ±ÿ ÿ£þªÿhþHþ±ÿ9ÿ»þTÿæÿ,þeÿToÿmþ±ÿÃÜýùÿ*ÿöþŒÿïþÿ,4ÿÿFÿ©ÿÿzÿIÿÌÿÒþ·ÿÿÿ~ÿTÿ[ÿ-ÿ†ÿÿôÿ ÿûþgÿæÿŒÿ¤þSÿ¶ÿ»ÿuÿúýENìþfþÏÿ–ˆþ•þ—ÿ`ÿ|ÿ ÿÿÿÿ–ý7æÿfÿÕþÿ6ñþxÿ.ÿßÿqÿÿÍÿ£ÿ-ÿ§ÿ-ÿyþ=ÿ³þ£ÿœÿÿ#Žÿþ…ÿ¥ÙþÿþÓÿóÿ²ý<)ÿmþ¢ÿ«ùÿý„ÿywÿ`ýbÿIþÿ!qÿÿßþY¦ÿYÿ‹ÿhÿÆÿîþºÿòÿ|ÿ†ÿYÿ>ÿÍÒþæþ >~þ€ÿ•ÿBÿ)ÿÎÿ¾Nþÿòÿ3½ÿˆþÒÿ£ðþRÿ7_ÿñÿÿþöÿÈÿ§ÿ;ÿ­ÿ£ÿøÿØÿñþÿŸÿp ÿÿþÒÿ”`ÿfþ!‰6ÿnþ »ÿþúþwÿtÍýõÿ&±ÿÿþÆÿ#×þÝÿâÿtÿZÿ ÿS¸ÿ’ÿõþVìÿØþ“ÿ!A”þ/ÿôÿøþ ÿ&þ¥ÿ ÿÈÿcÿ‚ÿXÿƒÿ ÿJÿþˆ-ÿ®þÓÿæþyÿDÿL(ÿ³þøÿºÿÿçþ€ÿÙÿ·ÿvþûÿ|ÿÿIÿîÿYÿ—þ;ÃþŠ5þçÿQÿÿ:ÿ…þ”¥þQÿûÿ^ÿÿ•þ^öÿûýgÿ‡ÿPÿŽþýþACþvÿ¯ÿÇÿSþ³ÿºÿ]ÿ2ÿÿQ þ0‡ÿQÿ’þµòþÿÜÿ%ÿ³ÿ)ÿÿ¶ÿíÿûþ þa¹ÿSþ_ÿ…ÿÔÿïþ3ÿ…ÿ…ÿøþ,uþ¸ÿˆºýÄÿ"Ôÿþ®ÿíÿyÿþ”ÿ  ÿSþæÿ\ÿ!ÿ^þÀÿ)ÿ'þ_ÿ[‘þÓýîSmý þ•ÿÿ»ÿ~þ ÿ„³ùýxþ)Ëÿÿrþ˜Iÿfþ>ÿDÿÚÿ°ÿzÿƒþªHÿáÿæþ¥ÿÇÿ—ÿ ÿfÿÐÿÜþCÿ•ÔþÍÿÃþbrÿEÿ^ÿÙÿãÿéþ‰ÿ:ÿÿeÿøÿÓÿÔþ]ÿ"/ÿÎþ'B"ÿ.ÿâÿ hÿˆÿIÿáÿ‚úþ“þGÉþ²ÿþþçÿi)ÿ>ÿ‘þ?ùÿÖþEþ{âÿËÿñþ>ÿKÿÚþåÿM#ÿ ÿ>`ÿÈþ.íÿSÿ=ÿ¢ÿ%ÿ®ÿG ÿšþ~•ÿWÿÒþøÿÓÿŠÿÿ€ÿVIÿÿÄÿòÿÿUÏþ1ÿ:ßÿÿaÿ‹ÿ¬ÿ'šþÃÿgÿ}ÿvÿšÿ ÿîÿõþiÿˆÿFÿ²ÿûþ]ÿñÿÖþ9ÿ÷ÿ³ÿñþ ÿQÿÿϸþOþ­ÿ[Ìÿúýïþ¡ÿÿFÿ¥ÿáÿFÿÿoÿ†ÿžþÃþ9ÿ”ÿ@ÿ¨þ1VÿŽÿöþÿXÿS<ÿQþÿhìþúþrÿŸÿdÿÐÿuþ»ÿB ÿÿ:ÿšÿÿþÀÿoÿêþÿjÿÎÿ-ÿyÿdÿ9ÿÿþ<`ÿ¶þÃþÛÿvÿKþÿ.ÿ ÿ¶þQýÿâþáþÿ†Íÿaþœþ6NuÿYþªþòÿþ¦þ0ÿ¬ÿpþÁþ [åÿIþ§þ´þÿ/ÿÿÙÿÏÿ¶ÿÿaÿaÿŠÿrÿåÿ!ÿ¶ÿ ÿbÿ‘ÿlÿÂÿ,ÿÿ¬ÿ³ÿQÿÿšÿ˜ÿZÿßþ %ÿ½ÿgÿžÿßÿ¶ÿgÿ:ÿ²ÿ´ÿ&}ÿ¿þÛÿ.Ùÿ.ÿ%ÿ¦ÿÿÿáÿJÿÿ™ÿB%ÿèþ@ ÿÿ_ÿ„ÿÉÿãþXÿ+™ÿÿ³ÿ¦ÿñÿ—ÿJÿ¢ÿÿ·ÿÿùþŠÿ dÿ—ÿ‡ÿŠÿ~ÿ²ÿÿzÿWÿÎÿÂÿÛÿÿ ÿ#|ÿ™ÿŸÿ3ÿyÿÿ£ÿjÿ)ÿ|ÿ;ÿÝÿÚÿ/ÿ ÿ§ÿ´ÿ¢ÿ^ÿþþeÿ¢ÿ¨ÿ…ÿ)ÿÿ¼ÿBÿ’ÿhÿ`ÿÿ…ÿeÿyÿ¹ÿªÿ ÿ8ÿŸÿÅÿIÿ^ÿtÿWÿØÿtÿ„ÿEÿÿCÿ£ÿ‡ÿ9ÿtÿ†ÿÿ?ÿ‹ÿsÿrÿQÿLÿ–ÿ¤ÿ?ÿFÿUÿ(ÿ€ÿÒÿZÿÿ"ÿCÿ‹ÿ‰ÿ~ÿBÿOÿcÿiÿ¬ÿŸÿÿ}ÿAÿkÿwÿ}ÿ¨ÿÊÿWÿDÿkÿ“ÿÒÿºÿJÿÿkÿŽÿ¨ÿ•ÿyÿ:ÿlÿ}ÿyÿ{ÿVÿ‡ÿ…ÿJÿÿÿ©ÿ–ÿ–ÿÿ÷þkÿœÿ›ÿ’ÿDÿ$ÿiÿˆÿyÿKÿKÿhÿÿÿ]ÿCÿlÿeÿTÿjÿpÿYÿ5ÿWÿVÿQÿnÿNÿCÿ5ÿ^ÿŠÿgÿ5ÿKÿXÿoÿˆÿ‰ÿmÿcÿoÿ|ÿ†ÿ…ÿŠÿ{ÿ`ÿcÿ€ÿ†ÿ~ÿ}ÿ†ÿoÿwÿuÿ{ÿ—ÿ—ÿˆÿ‹ÿlÿqÿ™ÿ„ÿ‚ÿxÿwÿ}ÿ‰ÿ ÿ¢ÿŸÿÿ|ÿšÿ´ÿÊÿÿ{ÿžÿÌÿÙÿ´ÿ—ÿ—ÿ·ÿ¨ÿŸÿ°ÿ¾ÿ¯ÿ«ÿ¨ÿ²ÿÉÿ¯ÿ™ÿ˜ÿµÿ¾ÿºÿÅÿ½ÿµÿ½ÿÉÿÐÿÐÿ¨ÿ~ÿ®ÿáÿÊÿ™ÿÿ¬ÿÕÿßÿ¬ÿÿ›ÿ²ÿ¸ÿ ÿ‘ÿžÿ£ÿ™ÿ¨ÿÿ›ÿ®ÿ£ÿ„ÿ~ÿ¤ÿ²ÿ—ÿšÿŠÿ‚ÿ™ÿ¯ÿ¶ÿ„ÿpÿŒÿ¿ÿ¶ÿŠÿÿ}ÿ¤ÿ¼ÿ‹ÿ‡ÿ­ÿ ÿ™ÿ™ÿŒÿ¦ÿ²ÿšÿ†ÿÿ…ÿˆÿpÿiÿÿÿdÿƒÿŠÿtÿxÿ{ÿkÿ_ÿhÿPÿ@ÿVÿcÿEÿ6ÿJÿ7ÿ7ÿKÿ?ÿ5ÿ&ÿ/ÿ?ÿ<ÿ%ÿÿÿÿÿÿÿÿÿÿÿÿ0ÿ.ÿÿÿ"ÿ+ÿ-ÿ6ÿ.ÿ)ÿ(ÿ%ÿ-ÿ1ÿ=ÿ9ÿ:ÿBÿHÿOÿRÿVÿ\ÿbÿjÿnÿwÿƒÿŽÿŒÿ‚ÿ•ÿ›ÿ›ÿ“ÿ–ÿ¤ÿ¼ÿ»ÿ¾ÿÏÿÑÿÜÿÛÿÝÿÛÿßÿÙÿéÿóÿùÿ#.# ûÿÝÿäÿéÿéÿîÿ÷ÿüÿøÿ÷ÿìÿéÿÖÿÂÿºÿ¬ÿ§ÿ°ÿ¤ÿšÿ–ÿ†ÿ{ÿqÿ`ÿRÿ@ÿ2ÿ&ÿÿÿ ÿÿùþðþíþçþßþÝþÎþËþÅþËþÈþ¿þÊþÍþÒþØþÐþÛþßþçþìþêþôþÿ ÿÿÿ'ÿ,ÿ3ÿ8ÿGÿMÿZÿeÿmÿyÿ}ÿ†ÿ‹ÿ”ÿ’ÿ•ÿšÿœÿ‘ÿÿŠÿ‹ÿÿÿÿŠÿ…ÿ…ÿŠÿˆÿ…ÿƒÿˆÿŽÿ–ÿžÿ ÿ£ÿ¤ÿ©ÿ¨ÿ¬ÿ±ÿ³ÿ½ÿ¼ÿ´ÿ¯ÿ·ÿ·ÿ¸ÿ¾ÿÂÿÂÿÀÿÌÿÐÿÑÿÊÿÎÿÒÿÅÿÉÿÓÿÕÿÐÿÒÿÏÿÓÿÑÿËÿÃÿ¿ÿ¾ÿ²ÿ«ÿ®ÿ²ÿ«ÿŸÿŒÿ¡ÿ“ÿ¢ÿ°ÿÿ§ÿ{ÿSÿ<ÿÿ7ÿ;ÿsÿrÿ{ÿŠÿ_ÿ{ÿcÿQÿSÿ*ÿ,ÿAÿ:ÿQÿOÿQÿBÿHÿKÿPÿZÿAÿAÿDÿ<ÿPÿUÿYÿ[ÿ_ÿZÿfÿkÿcÿgÿfÿiÿwÿvÿ„ÿ‰ÿ‹ÿˆÿŽÿ‚ÿÿ“ÿ‘ÿ—ÿŽÿ–ÿ¥ÿµÿµÿ¼ÿ¶ÿ°ÿ”ÿ‹ÿ‡ÿ€ÿšÿ}ÿÿ†ÿƒÿ˜ÿ•ÿ•ÿŠÿ}ÿuÿzÿyÿzÿ†ÿÿxÿÿ~ÿ|ÿÿÿwÿvÿoÿvÿwÿmÿwÿ~ÿtÿ‚ÿƒÿ€ÿÿÿ‚ÿ‚ÿÿ‚ÿ‡ÿ‰ÿÿ–ÿ‹ÿÿ—ÿ“ÿ•ÿ‘ÿÿÿ‡ÿƒÿzÿlÿeÿdÿWÿWÿZÿNÿEÿ>ÿ@ÿ>ÿ2ÿ)ÿ'ÿÿ ÿ ÿÿÿþþóþúþýþúþÿþÿ ÿÿÿ ÿÿ ÿ)ÿ0ÿ<ÿEÿNÿ\ÿlÿwÿ}ÿŠÿ™ÿ ÿ­ÿÁÿÖÿÚÿçÿöÿ --6KU`sŽ–¯¶¶ÃÇÛïéùÿäÇ´¬¸¨•ƒlZ8áÿ¶ÿzÿ]ÿ2ÿÿ ÿòþ×þ¼þžþ‰þ}þ^þ@þþúýýýþ þþ þþþþ#þ!þþ þþþ#þ-þ-þ1þ9þCþYþXþWþ[þMþMþ[þ`þmþzþ{þþ˜þ¡þ³þ¯þ­þ±þ°þ½þÎþÕþàþàþêþøþÿ ÿÿÿ!ÿ1ÿHÿ]ÿrÿ‡ÿ˜ÿ¨ÿ¿ÿÝÿõÿ6Vz Êñ6^¤ÉíQ¬ÐóèÈ’p~shCóا|6Ђ)ëÿÈÿ‘ÿ[ÿ'ÿäþºþ¤þ€þ^þþÐý£ý’ýŒýýyý]ýYýWýiýzýkýRý=ý5ýJýfývý„ý˜ý²ýÓý÷ýþ/þ7þ=þ@þOþ^þyþ‹þ›þ£þ£þ¸þ¾þ¼þ¾þ°þ©þ­þŸþ–þ•þ‡þ‰þƒþuþoþ`þZþbþYþNþDþAþMþ[þfþrþ~þ’þºþÝþüþÿ)ÿEÿiÿ–ÿÍÿ<xµñ)f˜Ó F‡¾E…ÎãªX$ERG±te5 ´ «GÙÿ‡ÿ>ÿÝþ«þ¯þ¤þ~þ$þ¬ýtý‚ý›ý©ý~ýCý1ýBýeý…ýoýDý%ý!ýMýuýˆýˆýŽý™ýÂýëýþ þþþ(þRþ{þ™þ’þŒþžþ¼þàþîþ×þÀþ¹þ¸þËþÒþ¿þ³þ¡þœþ­þ«þ¢þ–þ€þxþ€þˆþþþ†þþ¤þÁþáþøþ ÿÿ;ÿgÿšÿÆÿêÿJ…Æþ<m›ÎX“Ë÷H”ÜÀf "jl:×zq_&àB™0ÞÿàÿÛÿ‡ÿ$ÿ¾þmþ~þþfþ þŠý?ýTýýŒýiý ýáüóüý8ý&ýíüÍüÒüý?ýHý@ý=ý@ýjý–ý´ý¾ýºý°ýÑý þ:þVþAþ.þDþdþ‡þþnþ[þeþ~þ¥þŸþ…þxþqþvþ|þrþ^þFþ:þFþZþlþmþdþbþyþ™þºþÎþÙþìþÿEÿsÿ•ÿ®ÿÔÿAŠÁö)b­í0p‰Ì/o¼ðç°yVa<(䙃f1”ÿ‘ÑÿÃÿ‰ÿ?ÿåþ‚þoþ‹þŒþiþûý¢ý’ý¦ý§ýýýÏüÉüÑüàüÜüÃü¾üÄüßüýý"ý*ý.ý0ýMýtýý¸ýÏýóý0þnþþ˜þ„þ„þªþÄþÐþÎþ·þ´þÏþÙþáþÎþ°þxþ]þQþDþ.þþ þ þ)þ@þWþhþnþzþžþÆþñþ%ÿIÿrÿ³ÿõÿ9e–Ô I‹Ù'{Þ2‡Ù,æ6 ò匀¦¶‚³§§‹>ÄŠ<šÿëþeþ]þÁþìþÅþþqþ³þìþ¯þ$þŠý1ýýúü³ü“üü™üšü‹ü‹ü·ü¸üˆüRüIüüöü/ýWý‡ýæý^þ þ«þþ…þŽþŸþ‡þRþMþZþtþþþþ¬þŽþWþþðýëýÓý™ýzý‡ý¯ýÞýÔýµý¤ý¯ý¿ýÀý·ý¾ýèý$þrþÁþÿaÿ¢ÿÌÿéÿ (Lz¶\È#zÆe¦â(…Ï4†ýàˆ”_gËsîf8Ze |2úÿsÿ”þ¶ýkýÕýHþZþ3þ(þmþ¥þ|þýýaýïü³üaü ü#üeü–üˆüPüLü|ü™ü\üòûÀûü—üöü=ý‘ýþwþ¤þšþˆþƒþ{þYþ$þ#þPþƒþþ”þ•þ§þ²þuþþÄý¨ý´ý©ýýlý†ý¼ýØý¯ýoýVýYýYýXýgý¢ýéý/þþæþPÿ”ÿ§ÿ¨ÿÇÿ TŽÁ„þm²÷:ŠÄAª…Ô<°/kαMWÇfðrq¢‘1‡ÂÿÿKþ¬ýŽýþ¥þ¿þ»þÄþÄþÄþUþºýDýåü®üzüfüžüýýÒüüPübüUüüÝûöûtü ý|ýèýWþþ¡þˆþrþtþzþBþ$þ:þ”þðþòþÀþ”þ~þcþ&þ½ýsýiýŒý½ýÂý»ýÆýÆý³ý{ý/ý ýüüýýSý©ýþý8þbþ¥þèþÿ#ÿ$ÿYÿ´ÿwË!wÉOžè2‹øfÈ qº DÁ¿aiÙlý‚MaSÞ1›ÿ=ÿÉþþžýšýþ‰þ«þ’þƒþvþNþçýbýýäüÂü¢üüÂüýõü‹üüåûéûëûÊûÈûü‹ü ýrýÇý þ-þþíýõý)þhþqþXþZþ‹þ¿þ²þZþ þêýåýäý¼ýýœý­ý½ý»ý¢ýŒý^ý.ýýýý#ý/ýDýyý¹ýóý þþ[þ¸þÿMÿ}ÿ¬ÿ÷ÿMªö-`úbÕ3‰×OªBvÍCè_¢ƒwÜ”&ŠZ…4ÿ+ÿ þ þ´ýÌýaþæþùþëþÝþ½þ„þýý†ýWýEýGý:ý7ýPýwý1ý¨ü)üìû÷ûüýû3ü›üýtý©ýçý-þ)þõýãýþ’þèþýþðþÇþÜþÎþ§þWþþôýçýþ&þþóýÄýºý«ý}ýWý,ý ý-ý[ýXýnýmýný—ý¬ýÓýõýþzþâþDÿ–ÿâÿÿÿPôEwÇ0È?”¿dÄ3_­©C²áµéšˆ!Wwd¼¢ÿôþþîýyýdýÙý„þëþºþšþzþ<þÜýGýýýDýfý`ýSýOý9ý³üü•û~û²ûÖûùû]üÊüý!ý*ý`ý¤ý¢ý{ý›ýþ¹þ ÿýþ±þ˜þƒþeþ6þúýöýóýþ9þEþGþûýýDý/ý%ýýóüëü&ýCýWýPý$ýýý#ý_ý³ýþ€þøþRÿ›ÿÈÿÝÿöÿfÚAŸjäHk©ídÁ…ð‰üpõ©¦ÈNÝЯø‡‘1ÿ‡þ3þªýhýÒýxþÿéþ–þZþLþþ‘ý<ý;ý¨ýöýäýÓý¿ý¢ý&ýhüÞûÓû ü$üCü|üôü<ýýñü ýWý€ý…ý¼ýAþÌþÿ*ÿÿîþ—þMþ5þYþtþrþkþ†þ´þ±þ]þÞýyýHýSý^ýZý[ýaýtýaý<ý,ýýöüøü?ý¯ý1þ“þÕþ ÿsÿ´ÿÎÿÏÿòÿJ¾;ªp»ð+Ê'kòxÍ+uäV»/õ\9ýò±­…R¹´ÿþþšþþ¼ý·ý*þµþ÷þšþMþ7þ þòýšýyý±ýûý þþþÆýxýòüdü*ü4üiü…ü–üÈü ýýÒü°üÑüýWýwýÕýQþ°þàþÑþÝþÌþˆþ+þìý"þZþtþMþ:þRþIþþýCý'ý2ýDýBýTýKý6ýý×üÒüºü±ü»üúüqýìýZþ›þâþ!ÿWÿŒÿ³ÿíÿ:®0®l—·è#‚ð_ÚÞ€f7ÈMëÌ9ª‘aãèÿÿ¦þþ¬ýzýîýxþÓþþ"þ þõýèýýjý—ýçý(þ0þ&þüý©ý3ýüJüKüŠü¡üžüÆüýýÍü—üžüÑüý-ý…ýþgþ—þˆþ–þ¦þsþ2þþ8þ…þµþ­þþ™þ‰þXþýý§ýý—ý—ý…ý‡ý}ýfý0ýöüìüèüçüëüývýéýTþžþâþ0ÿtÿ²ÿâÿ+yÓPÊL¡ê_¹ q¨'—kÄŸcP  E /¹°åÖÿýþ®þ6þ³ý¦ýIþìþ%ÿ¤þ/þ þ8þ+þæýµýÿýrþ«þ§þþ_þ þoýÑü¡üÑüýùüÚüôü7ý ý¸üoüŽü×üýý„ý"þ€þgþBþPþ‚þTþÿýíýMþÄþÚþ¸þ™þ«þžþ@þÎý‰ýý¡ý¥ý§ýªý§ý`ýýÍüËüÓüÐüÑüýzýïý8þcþŽþÛþ#ÿbÿ§ÿ |äG±5¦Þë(¡-Œ¼(œîIól¼J²þû}£qAöA7ÿ­þ@þ®ýQý•ý0þ¤þþþéýîýÿýíý¥ýªýþcþƒþ‹þzþEþáý3ýÝüìü ýýîüáüý6ýëü‡üaü~ü¬ü²üòüfýïýþ×ýÂýòýþàýýÀýJþ¹þÊþ­þ¥þ³þ¢þ;þåý¾ýÊý×ýÓýÚýÛý¸ý]ýýáüØüéüåüîü'ýýôý0þUþ‘þÝþ+ÿvÿÖÿC¯‡qÎþC¬E•Ò9‰O¬î‚.Þ@7¾ö|k-‡ƒÿÐþmþ¼ýZý`ýþ¦þ¦þ.þçýþ1þ/þôýãýIþ³þÿ$ÿ*ÿÿ¸þ"þ®ý§ýÏýåý±ýý§ýÎý›ýýºüµüÎüÓüæüKýÎýþíý°ýÆýþþôýÒýæýWþ¨þÒþëþÞþÑþ­þxþNþPþEþ*þþ þþáýŽýDýý ýýüýüý\ý¥ýèý=þ…þÕþÿ?ÿˆÿñÿhÖCª'¢V£ûrÅ ŠïqÝ=®MæU+.Øõ|FdLÿ{þøý=ýÖüý°ýPþUþÎý…ýžýËý×ý™ý¥ýþþÿfÿuÿOÿäþMþîýöýþ.þìý´ý×ýòý§ýý“üeügü_üuüÒü7ýqýký(ýýDý4ý?ýAý€ýéý=þþ¦þ­þþnþEþ@þ^þYþ_þ`þTþ<þÜýˆýDý ý÷üîüôüýIýgý˜ýÀýöý@þ~þÄþÿ}ÿêÿaË9¯› yï\Ã3£Uût6ε…uü%£dò^hÿºþþ6ýÉüÜüƒýëýàýýZý‡ýªýÊý§ýÀý-þ”þ&ÿ‚ÿµÿªÿaÿôþºþÒþìþ÷þ´þˆþ¨þ¤þ]þÖýYýýíüÊüÉü ýBýNý/ýþüõüýõüèüýVýˆý¿ýþXþ…þuþZþ\þzþœþ¯þªþ»þÇþ´þzþ@þþèýªý‰ýƒý“ý²ýÉýÒýòý(þoþ¶þèþ"ÿiÿÄÿ6¯&•v… ‡ÞUÛYÆP»*jó¥õ ê<æ ,ÿþUþý¤üzüÂü]ýý0ý·üÃüöüýýôü\ýýý€þ%ÿ€ÿŸÿÿ>ÿóþÿPÿxÿwÿ7ÿ?ÿ}ÿLÿÔþ1þ¶ý…ýBýý(ýWýUý&ýØüÆüÙüaü#ü.ü’üéüý/ýaý¬ý·ý¼ýÃýíý0þ@þqþ³þÖþÍþƒþLþ'þþþîýÑýÊýóýýýôýàýØýúý(þnþ½þÿHÿÿÏÿ@µf×q¯£ ‹Zþwæ:ïòGGôDgòµ6(ÿ`þƒý‡üUü†üíüØürüüü^ühü`üiü¾üeýðýšþÿ>ÿ=ÿÿÿPÿ¦ÿÒÿÇÿÈÿìÿ(’ÿÿ¬þqþ5þþþþçýˆýFýýÿü ü÷ûü]ü‰ü¢ü¥üÁü ýý ýBý…ýºýøýþˆþåþÌþ›þqþeþoþ_þRþYþ\þ|þŸþ„þxþ|þeþ•þåþ&ÿvÿ›ÿ¸ÿõÿ6¥ÿ5™.Âpúià?«/Æ`î0I´| äo ¯§ÿâþÕýÚü»üÕüýöüKüüüü+üüøûjüéü€ýOþ´þÚþöþÔþ ÿ‚ÿÊÿ""~µ£^ÞÿsÿSÿ"ÿÿÿãþ§þDþèýÚý©ýý±üHü>ü¯ü‘ü|ü‰üUükürüuüÉüøü ýdýÏý+þ~þPþ.þMþ@þYþhþkþšþ¡þ­þÞþÓþ·þ©þ›þÙþMÿ‰ÿÄÿäÿäÿ?~ÃäBÊk sÂ#jÝpêl²‘÷(:9ù àÇÿðþþ ý¿üÀüÖüÝüHüíûúûíûýûÍû ûûûlüïüºý;þXþþþŸþ$ÿsÿ±ÿãÿùÿdÁ¼‰ Éÿ­ÿ„ÿ\ÿjÿEÿÿ»þUþ&þ÷ýbýæüˆü ücüü;üüûûÕûüûüüMümü«ü'ý|ýÐýêý¼ýØýúýþ<þNþvþ³þÍþÿ3ÿÿÿÿ1ÿ“ÿéÿ =Pc“µá :—ø`½ùqéRðg‡šÏ_ûC¿å¨U‚ŸÍÿ÷þþý_ýsý„ý`ý÷üiü\üfü<ü'üòûü^ü»ürý þ.þ@þWþuþèþZÿ…ÿÌÿHÄûå¦J)üÿòÿ¶ÿÿ1ÿÿþÓþ_þÔýfýýÕüöüÒü£ülüàûìû+ü)üHü9üWüÚü/ýzý®ý¤ý²ýØýþWþþœþÍþûþ.ÿ€ÿ…ÿwÿ‚ÿ†ÿÔÿ7aœ­Š­Ñã ?³d¬ÐhŸ­ìzÚæQþE™ScqDÞÇýÿtÿ]þÃýÒý²ýªýdýÎüâüÞüuüwü2üü~üšü!ýäýßýûý*þþ‡þÝþÎþ+ÿhÿœÿ%ZXPùÿÐÿ×ÿ¡ÿ¢ÿžÿ[ÿTÿ%ÿîþíþˆþþ¾ý^ýýûüÑüžü–üYü+ü[üRüPülüuüÄü$ýZý£ýËýãýþþ4þbþqþ¢þÛþ ÿSÿÿ”ÿ©ÿÀÿÖÿ÷ÿ"]k‰ª–Å×Óñ']“Ôõ1l¢î^¯ûbf¹Håâýnõ÷§_'~#ªÿÅþgþ~þMþþÄýcýý„ý:ý3ýýýEýYýÆý1þ*þBþ^þxþÙþæþæþ)ÿ6ÿfÿ¸ÿÅÿÐÿÅÿ‹ÿ‡ÿŒÿgÿ]ÿMÿ ÿÿ ÿøþðþ¸þmþUþ(þãýäýÍýÁý×ýaý4ýý[ýŽý£ýaý×ýþ þkþqþhþþqþ¤þõþÙþÿ1ÿ$ÿÿ¾ÿ¥ÿÄÿ¿ÿ×ÿ?D4±f]••Å~àëâh:;Ÿ¦—ï(8Ml@¼“‰h6ߟb æÿ…ÿ+ÿ,ÿýþñþïþ˜þ”þ þkþ~þuþEþUþKþQþþ¤þ…þþ|þšþªþ©þ«þ¢þ¥þ¸þ³þ»þæþÀþ‘þÄþÅþžþ¹þ³þŽþ¨þ®þ˜þ¬þ»þþšþŸþþ™þ•þ¦þšþ‚þ°þŸþ…þÊþƒþyþËþ¸þ»þÏþÊþÙþÎþÀþüþÌþØþ ÿãþêþÿÿþÿAÿ ÿKÿÿ(ÿœÿ³ÿ„ÿ¨ÿìÿàÿ¾ÿ ìÿäÿ#Eo1sŽLq„‚y€Œo›š{ˆ“žƒŽvR\B7ýÿ"óÿ áÿÍÿ×ÿ¡ÿ”ÿÿvÿkÿQÿDÿHÿ-ÿ ÿÿÿÿúþÛþÛþàþÒþ¼þÀþÌþÆþÔþÃþÑþëþËþØþÞþÔþðþîþÐþóþÿòþüþÿÿ"ÿÿÿ'ÿ!ÿ4ÿ ÿÿ;ÿ'ÿ%ÿ3ÿ1ÿBÿ9ÿ<ÿ?ÿ$ÿ;ÿ6ÿÿBÿ/ÿ.ÿLÿÿEÿ[ÿ?ÿeÿLÿ^ÿtÿhÿ‹ÿÿyÿÿ¾ÿÿ–ÿÐÿ·ÿ²ÿáÿ½ÿÅÿÛÿÐÿãÿÅÿÒÿÝÿÌÿÎÿðÿæÿÔÿûÿíÿìÿ æÿ úÿ %$5 13&':'/ðÿ ìÿåÿâÿÉÿÓÿÈÿ»ÿ¬ÿ¢ÿ™ÿÿqÿzÿcÿVÿTÿAÿ=ÿ,ÿ:ÿÿ%ÿ0ÿÿ!ÿ,ÿÿÿ,ÿÿÿ4ÿ*ÿÿ/ÿ0ÿ3ÿ?ÿ*ÿ$ÿ3ÿ6ÿÿ5ÿ=ÿÿBÿ&ÿ*ÿ;ÿ+ÿ$ÿ#ÿ%ÿ+ÿ&ÿ2ÿÿ(ÿ:ÿÿ2ÿ ÿ>ÿ,ÿ'ÿ5ÿ'ÿ?ÿ&ÿÿ4ÿ-ÿ4ÿLÿ/ÿ<ÿOÿ7ÿDÿSÿHÿ?ÿTÿkÿKÿWÿ^ÿWÿfÿ_ÿrÿeÿyÿÿ|ÿxÿÿÿxÿ‘ÿ…ÿuÿ¤ÿšÿ™ÿ·ÿ ÿ²ÿºÿ³ÿÄÿÀÿ³ÿ¾ÿ¼ÿ¾ÿÇÿºÿ®ÿ¶ÿ³ÿ°ÿ¸ÿ¢ÿ¦ÿœÿªÿ›ÿŸÿ•ÿžÿ‚ÿ‰ÿ´ÿ^ÿ‘ÿÿzÿŒÿ‚ÿ‚ÿ|ÿqÿÿyÿ{ÿ‚ÿ}ÿ…ÿÿŒÿ~ÿÿŠÿiÿ…ÿ£ÿjÿtÿ’ÿpÿlÿ•ÿkÿsÿ‡ÿoÿlÿxÿuÿaÿmÿ`ÿoÿPÿ`ÿsÿtÿGÿ€ÿlÿNÿ~ÿ`ÿkÿbÿkÿbÿ`ÿ}ÿqÿnÿ„ÿ‚ÿ‰ÿnÿŽÿÿ|ÿwÿ—ÿlÿvÿÿvÿ}ÿkÿ”ÿ‡ÿzÿ‚ÿ‰ÿÿ‰ÿŸÿÿŠÿŽÿ•ÿ£ÿ™ÿ¸ÿŸÿ¨ÿÄÿ¾ÿªÿ¸ÿ´ÿ‘ÿ¬ÿªÿœÿµÿªÿ®ÿ˜ÿšÿ²ÿ•ÿ™ÿ›ÿ™ÿyÿÿwÿtÿ¢ÿbÿÿšÿfÿzÿ”ÿsÿ|ÿsÿpÿfÿhÿ˜ÿeÿˆÿ•ÿÿœÿ†ÿ‚ÿ«ÿ|ÿ˜ÿŸÿqÿ{ÿœÿkÿ…ÿ£ÿ\ÿnÿšÿyÿcÿ…ÿXÿnÿnÿnÿ]ÿiÿpÿLÿxÿpÿDÿ‰ÿQÿXÿ…ÿTÿkÿnÿXÿtÿiÿCÿhÿiÿNÿQÿÿPÿdÿeÿ_ÿkÿ\ÿaÿ_ÿHÿlÿoÿ,ÿ†ÿAÿ^ÿ`ÿ%ÿoÿcÿ*ÿ<ÿnÿ6ÿ;ÿyÿCÿNÿGÿWÿeÿLÿˆÿKÿUÿ|ÿiÿ‰ÿjÿgÿ{ÿÿkÿwÿÿnÿŽÿoÿrÿfÿ^ÿaÿ3ÿtÿhÿ7ÿ‚ÿ^ÿ9ÿÿgÿ`ÿ;ÿ‘ÿWÿÿ±ÿBÿPÿ‡ÿAÿzÿhÿuÿiÿWÿ–ÿVÿIÿ¯ÿxÿ4ÿ¹ÿsÿFÿ±ÿsÿeÿ’ÿ©ÿQÿÿ¦ÿÿŸÿ”ÿŒÿqÿ°ÿxÿ†ÿÐÿYÿ’ÿžÿÿžÿ{ÿ¿ÿQÿ¿ÿ­ÿxÿÖÿ|ÿÿ¥ÿ°ÿÿÿ­ÿšÿˆÿ’ÿÄÿuÿaÿÃÿPÿŠÿŽÿxÿ“ÿ‡ÿ¸ÿÿ™ÿ«ÿIÿDÿ­ÿžÿ'ÿÈÿ–ÿ2ÿÊÿlÿxÿèÿÐÿ‘ÿ?ÿ~ÿHÿòÿzÿ|ÿÚÿ¢ÿŠÿÍÿ›ÿ{ÿÎÿ¬ÿ%ÿÿÿ©ÿmÿ ‘ÿŠÿèÿwÿKÿ°ÿŸÿ‘ÿÉÿ¯ÿÆÿóÿÿÿÿËÿ)ÿ“ÿäÿ–ÿ¦ÿúÿ~ÿÊÿðÿÞÿƒÿWÿÍÿîþ‰ÿKÿ:ÿ”ÿÿsÿsÿpÿæþ“ÿ¢ÿKÿBÿ»ÿ¶ÿCÿóÿnÿPÿ'#ÿÿRÿÿÄÿ!ÿ®ÿCÜþÉÿÿÿÿyÿÇÿÜÿ¥þ‘ÿäÿ¸þÿÿâÿ$ÿöÿ+ÿÿ6ÿ5ÿËÿÀÿ*ÿ7eÿ•ÿûÿõþºÿ¡ÿ4ÿõÿµÿÓþНÿ–þ%ÿÿþÕÿbÿ×þÃÿhÿ´þÃÿOÿJÿéÿpÿÿ,ÿßÿÞÿ/ÿ?<ÿôÿ£Xÿ8ÿƬÿÿòC ÿ"TŸÿ€ÿ ÿA Pÿ$ÿ µÿÚþ¤ÿkÿ­ÿ¶ÿmÿçÿŒÿŸÿÊÿtÿ™ÿ‡ÿõÿãÿÙÿ§ÿƒÿùÿ‰ÿ‹ÿÅÿÙÿ®ÿzÿZ¿ÿÆÿ*dÿÐÿùÿÚÿQÜÿ÷ÿVœÿ ôÿ™ÿæÿ>çÿçÿ3ãÿ—ÿ ”ÿÌÿÈÿôÿU±ÿ®ÿâÿ‡ÿ§ÿÑÿ,ãÿÈÿ/±ÿ×ÿÒÿ´ÿbÿ¤ÿ+Èÿ´ÿºÿ¢ÿ2ÿAÿÉÿnÿmÿ¸ÿ‰ÿ~ÿÊÿ¾ÿ)ÿ`ÿ¯ÿ¥ÿÿxÿ §ÿlÿÊÿÿ†ÿ˜ÿºÿ8ÿ¨ÿ±ÿPÿÿæÿeÿzÿ»ÿ…ÿƒÿÒÿðÿyÿçÿÿÿkÿƒÿÓÿÆÿcÿwÿñÿ¼ÿŒÿèÿ¸ÿ0ÿ†ÿàÿ_ÿŽÿÄÿÃÿ®ÿ÷ÿ(…ÿ.ÿWÿtÿÿÿüÿ‘ÿŠÿ¸ÿ‹ÿcÿ‰ÿyÿÿ;ÿ¹ÿ¨ÿQÿ”ÿÚÿ†ÿXÿ|ÿÿ ÿ>ÿFÿÿnÿÞÿ•ÿ6ÿXÿ{ÿ(ÿÈþÿ&ÿÿnÿ’ÿ=ÿ;ÿ–ÿlÿÿBÿaÿ ÿÉþÿÿÿYÿVÿêþXÿŸÿAÿ¼þ£þÙþ÷þÿ"ÿTÿvÿ]ÿÝþÜþ¾þþ»þçþîþÿŠÿÿþ¶þ¿þ›þ­þ½þÕþÿ7ÿßþ¯þíþ?ÿ³þbþÿ ÿýþ?ÿbÿðþÙþÖþáþÿ%ÿ ÿèþàþÍþÒþÅþæþÿüþ#ÿ-ÿëþ¢þ©þÌþãþôþØþÿCÿÿÿìþ³þÁþÈþ¬þ¹þüþAÿ=ÿËþÍþ¨þAþ˜þçþÅþ¤þÎþàþÿ+ÿÿãþ®þÍþúþ½þ€þÿ!ÿ¢þ*ÿÿ¼þçþÿ*ÿëþÿþÿòþÃþ:ÿjÿ&ÿ-ÿLÿ5ÿõþ#ÿÿäþ+ÿ…ÿÿ×þ]ÿ†ÿ@ÿòþÿ5ÿ:ÿ ÿ»þÔþEÿgÿ7ÿLÿjÿ™ÿkÿ&ÿ‰ÿ•ÿQÿyÿÿkÿsÿ(ÿdÿªÿsÿ´ÿˆÿYÿGÿgÿ›ÿÿVÿÿfÿrÿÿqÿ\ÿ{ÿÿpÿnÿ~ÿhÿ„ÿvÿÿ€ÿtÿpÿ‘ÿ´ÿŒÿ{ÿeÿlÿ€ÿyÿ«ÿ¬ÿoÿ™ÿ”ÿ‚ÿÿ­ÿµÿ‘ÿÿ…ÿ‹ÿ”ÿœÿ§ÿªÿŸÿ¶ÿÍÿ¹ÿ¹ÿ£ÿŸÿ·ÿ×ÿ½ÿ³ÿœÿ…ÿ­ÿÉÿ§ÿ’ÿÀÿÇÿ¥ÿ¨ÿ½ÿÓÿÆÿÇÿáÿÊÿËÿÂÿ¾ÿ×ÿÏÿ»ÿÚÿÐÿ¢ÿÁÿÚÿÓÿÇÿ¾ÿÆÿÜÿÒÿÅÿÊÿÁÿàÿÕÿÌÿåÿâÿòÿéÿÝÿéÿáÿÕÿæÿÜÿÑÿÙÿÖÿÏÿÈÿÔÿÝÿ¿ÿ»ÿÖÿÆÿ¼ÿÊÿÄÿ¹ÿÃÿÁÿ®ÿ¶ÿÊÿ²ÿ§ÿ³ÿ¹ÿ³ÿ¨ÿ¨ÿ¡ÿ•ÿšÿ¡ÿšÿ”ÿ”ÿ”ÿ‡ÿˆÿ…ÿˆÿŠÿ‹ÿ“ÿŽÿŽÿ”ÿ”ÿŠÿÿ‹ÿ‚ÿ‚ÿÿ~ÿxÿuÿsÿkÿiÿlÿlÿiÿdÿkÿpÿrÿsÿzÿwÿ}ÿ}ÿtÿrÿkÿnÿsÿuÿrÿoÿgÿgÿmÿmÿhÿgÿlÿnÿpÿmÿkÿkÿkÿlÿqÿsÿpÿjÿgÿhÿkÿnÿpÿvÿwÿwÿ{ÿƒÿ†ÿ‡ÿ†ÿ‡ÿŒÿŒÿÿÿŽÿÿŒÿ…ÿƒÿ‡ÿˆÿ„ÿ„ÿŒÿ’ÿ’ÿÿ“ÿ–ÿœÿÿ˜ÿšÿ›ÿ—ÿ•ÿ•ÿ—ÿ”ÿ™ÿ¡ÿ¥ÿ¢ÿžÿ£ÿ¥ÿ¢ÿŸÿ–ÿ•ÿŸÿ¨ÿ©ÿ©ÿ¨ÿªÿ®ÿ®ÿ¬ÿ¬ÿ©ÿ¡ÿ¢ÿ¥ÿ§ÿ§ÿ§ÿ§ÿ©ÿ©ÿªÿ®ÿ¯ÿ­ÿ«ÿ­ÿ²ÿ³ÿ°ÿ°ÿµÿ¸ÿºÿºÿ¹ÿ»ÿºÿ¹ÿ¹ÿ¹ÿ»ÿ¹ÿ·ÿ¸ÿ¹ÿ¸ÿ·ÿ·ÿ¸ÿ¸ÿ»ÿ»ÿ¼ÿ»ÿ¸ÿ¹ÿ·ÿ¶ÿ·ÿµÿ±ÿ±ÿ²ÿ´ÿ·ÿµÿ²ÿ¶ÿºÿºÿ·ÿ¹ÿºÿºÿ»ÿ»ÿ¼ÿ¼ÿ¼ÿ¶ÿ±ÿ²ÿ³ÿ±ÿ­ÿ­ÿ¬ÿªÿªÿ¨ÿ£ÿŸÿžÿ¥ÿ¦ÿ¥ÿ§ÿ¦ÿ¥ÿ¬ÿ­ÿ§ÿ¢ÿ£ÿ ÿžÿ¢ÿ¤ÿ£ÿ›ÿ˜ÿ“ÿÿ‘ÿÿŒÿÿŒÿˆÿˆÿ„ÿ‚ÿÿ…ÿ‡ÿ†ÿ†ÿƒÿÿ|ÿ{ÿvÿtÿwÿzÿ|ÿzÿvÿsÿuÿyÿxÿtÿqÿlÿgÿdÿfÿjÿjÿgÿhÿuÿwÿoÿlÿiÿiÿjÿhÿkÿmÿmÿkÿkÿlÿkÿhÿdÿ^ÿXÿ[ÿ[ÿ]ÿ]ÿ^ÿ_ÿ^ÿ`ÿaÿ`ÿ_ÿdÿhÿiÿkÿiÿlÿrÿwÿvÿoÿmÿoÿoÿkÿiÿkÿoÿpÿmÿoÿpÿqÿqÿoÿkÿnÿrÿsÿsÿuÿwÿqÿnÿrÿxÿyÿzÿzÿxÿvÿwÿwÿwÿtÿnÿlÿlÿtÿxÿuÿtÿtÿsÿwÿ}ÿÿƒÿ„ÿ†ÿ‡ÿ‰ÿŠÿ‡ÿƒÿ‚ÿƒÿ‚ÿ}ÿ}ÿ~ÿ~ÿ{ÿ{ÿ€ÿ†ÿŠÿ‰ÿ†ÿ‡ÿ‡ÿ‰ÿ‰ÿˆÿ‡ÿŒÿ‘ÿ’ÿÿŽÿÿ•ÿ—ÿ”ÿ“ÿ“ÿ•ÿ”ÿ—ÿ–ÿ“ÿ”ÿ•ÿ–ÿ–ÿ—ÿ—ÿ˜ÿœÿšÿšÿÿÿœÿ˜ÿ•ÿ”ÿ’ÿ’ÿ“ÿ’ÿ“ÿ”ÿ”ÿ”ÿ“ÿÿŽÿ‘ÿ—ÿ˜ÿ”ÿ”ÿ˜ÿšÿ›ÿšÿšÿŸÿÿ›ÿÿÿŸÿÿ™ÿ˜ÿ˜ÿÿ›ÿ–ÿ—ÿ—ÿ™ÿ˜ÿ’ÿÿ’ÿÿŒÿ‰ÿˆÿ‡ÿ‚ÿ€ÿÿÿ~ÿÿƒÿƒÿ‚ÿ}ÿtÿmÿnÿnÿlÿjÿmÿtÿuÿxÿyÿuÿrÿoÿpÿmÿpÿqÿtÿxÿzÿzÿ|ÿÿ~ÿ~ÿ|ÿxÿtÿyÿ~ÿÿ‰ÿƒÿ|ÿxÿyÿyÿtÿrÿrÿuÿnÿgÿgÿhÿmÿlÿjÿkÿjÿlÿiÿgÿdÿ\ÿ\ÿ^ÿbÿdÿfÿdÿ_ÿ`ÿ]ÿZÿYÿXÿYÿWÿUÿWÿTÿSÿVÿ[ÿZÿXÿZÿ\ÿ_ÿbÿ`ÿ]ÿ]ÿ`ÿaÿ`ÿ^ÿ_ÿ^ÿ`ÿdÿcÿiÿhÿgÿkÿnÿjÿdÿcÿ_ÿ^ÿ_ÿ]ÿYÿXÿYÿZÿYÿYÿ\ÿ^ÿ`ÿ`ÿcÿjÿmÿmÿjÿgÿjÿqÿvÿtÿqÿqÿmÿoÿqÿqÿsÿtÿrÿrÿvÿwÿ{ÿ}ÿÿƒÿ€ÿyÿvÿxÿzÿxÿwÿ{ÿzÿxÿwÿuÿvÿxÿvÿyÿ~ÿ}ÿxÿzÿÿ†ÿ…ÿ€ÿƒÿˆÿ‘ÿ˜ÿ”ÿ‘ÿÿ“ÿŒÿ‡ÿ†ÿƒÿ†ÿˆÿŠÿŒÿŒÿ‹ÿˆÿ‡ÿŒÿ‰ÿÿ€ÿÿÿ€ÿƒÿ†ÿ„ÿŠÿŽÿŒÿŽÿÿÿ”ÿ—ÿ–ÿ—ÿ–ÿ”ÿ”ÿ“ÿ•ÿ˜ÿ—ÿšÿšÿ—ÿ–ÿ–ÿ›ÿžÿÿšÿšÿ™ÿ—ÿ˜ÿ—ÿ—ÿ–ÿ–ÿ—ÿ–ÿ•ÿ”ÿ–ÿ•ÿ‘ÿ’ÿ’ÿ‘ÿÿÿ“ÿ“ÿ’ÿÿŒÿŽÿ“ÿ—ÿ“ÿÿ’ÿšÿ›ÿ“ÿ‘ÿ‘ÿ“ÿÿŠÿˆÿ‡ÿ…ÿ{ÿxÿ€ÿ}ÿxÿtÿsÿsÿpÿtÿvÿuÿqÿoÿsÿsÿsÿwÿyÿzÿ{ÿyÿwÿvÿwÿzÿwÿqÿpÿpÿnÿmÿnÿkÿdÿcÿhÿkÿnÿpÿpÿnÿoÿqÿnÿgÿdÿeÿfÿgÿeÿdÿdÿdÿeÿgÿgÿcÿ`ÿaÿ`ÿcÿhÿlÿjÿhÿlÿkÿjÿhÿeÿcÿ^ÿ[ÿZÿWÿTÿRÿTÿTÿQÿTÿVÿWÿVÿTÿTÿTÿWÿXÿVÿTÿTÿSÿQÿPÿOÿSÿ\ÿ^ÿ[ÿ^ÿ`ÿeÿdÿfÿgÿaÿ\ÿYÿcÿgÿgÿcÿcÿjÿnÿkÿfÿcÿbÿdÿaÿ`ÿbÿgÿlÿkÿqÿuÿzÿ|ÿxÿuÿrÿrÿjÿfÿhÿmÿmÿiÿiÿkÿpÿsÿoÿoÿqÿsÿsÿsÿrÿrÿtÿqÿrÿtÿzÿ{ÿ}ÿÿ}ÿyÿ{ÿ}ÿ|ÿƒÿ…ÿ‰ÿŒÿŒÿŒÿŽÿ‘ÿÿÿŽÿÿ’ÿ’ÿ’ÿ’ÿ’ÿ“ÿ–ÿÿ¤ÿ¤ÿ ÿ›ÿ˜ÿ›ÿ—ÿÿ‹ÿˆÿŽÿ’ÿ’ÿ‘ÿ‘ÿ“ÿ”ÿ“ÿ‘ÿ’ÿÿŠÿ‚ÿ~ÿ‚ÿ…ÿ‹ÿ“ÿ•ÿ“ÿ’ÿÿÿÿ’ÿ‘ÿ‹ÿŠÿÿ“ÿ”ÿ”ÿ”ÿ—ÿ˜ÿ™ÿŸÿ ÿ ÿ©ÿ¥ÿžÿ™ÿ–ÿ•ÿ—ÿœÿŸÿ£ÿ¡ÿÿžÿ ÿœÿŸÿ¡ÿ ÿ¡ÿŸÿ¢ÿ£ÿ¤ÿ£ÿŸÿ¡ÿ¡ÿ›ÿ“ÿÿŠÿŠÿˆÿƒÿ€ÿ‚ÿ†ÿ†ÿ‰ÿŠÿŠÿ†ÿƒÿ€ÿÿƒÿÿ}ÿxÿyÿzÿ{ÿ|ÿ|ÿ{ÿyÿxÿuÿtÿsÿpÿjÿgÿeÿgÿlÿoÿnÿkÿmÿpÿwÿwÿsÿrÿvÿwÿpÿoÿoÿqÿnÿqÿtÿvÿvÿsÿqÿnÿoÿkÿgÿhÿiÿlÿjÿeÿgÿkÿhÿcÿ`ÿcÿgÿfÿaÿ_ÿeÿiÿjÿgÿhÿmÿpÿsÿtÿtÿtÿvÿtÿsÿpÿpÿtÿxÿzÿxÿvÿuÿxÿyÿwÿoÿkÿjÿhÿjÿnÿpÿqÿpÿnÿnÿnÿnÿnÿpÿpÿoÿmÿpÿqÿpÿrÿpÿqÿnÿhÿdÿdÿeÿfÿhÿeÿcÿ]ÿ\ÿZÿVÿWÿ[ÿ^ÿdÿmÿlÿmÿpÿqÿnÿmÿtÿuÿtÿtÿvÿyÿ~ÿÿ„ÿÿÿ‚ÿÿ|ÿzÿƒÿˆÿˆÿ…ÿ‡ÿŠÿŒÿ‹ÿÿ’ÿ’ÿ‘ÿÿÿÿ’ÿ•ÿ•ÿ”ÿ—ÿœÿÿÿ¢ÿ™ÿ›ÿÿ ÿ†ÿ¢ÿ3ÿ/ÿRÿíþUÿ:ÿ+ÿMÿÿÿ‘þNþÐþÉþÀþæþÿ{ÿÿ`ÿˆÿ¹ÿ§ÿ€ÿyÿ­ÿ¨ÿ‘ÿˆÿÿ§ÿ¤ÿÿ|ÿ‡ÿ…ÿgÿZÿnÿdÿVÿTÿ@ÿ;ÿ;ÿ-ÿ9ÿ+ÿ9ÿ3ÿ8ÿ%ÿ{þÀþPÿUÿDÿKÿoÿ†ÿpÿoÿrÿhÿvÿfÿhÿœÿ ÿ`ÿWÿ‚ÿ•ÿ„ÿ^ÿ_ÿuÿpÿ\ÿ[ÿhÿfÿZÿ@ÿFÿTÿSÿ>ÿ*ÿ/ÿDÿ7ÿ,ÿ4ÿAÿIÿ<ÿTÿmÿ^ÿRÿIÿJÿYÿNÿ;ÿ5ÿHÿWÿVÿQÿHÿ\ÿ[ÿ9ÿ:ÿLÿRÿ&ÿ$ÿ4ÿ1ÿ?ÿ2ÿDÿTÿ`ÿ„ÿnÿpÿ¨ÿ•ÿ‚ÿ£ÿÅÿÊÿ¸ÿ·ÿáÿýÿìÿ* )ëÿ1%!Ta#5dXcRo²\Q“»›`ˆ÷´u²º«½Ïè àù8óî&ÿÜþí×û<æ‡2éÁÛYäè¬ö)—ô6¹¶×¾µzšªŽ«Ç›¤ªœoi½ž,xª{R‚Œúÿ dúÿØÿ:"©ÿˆÿùÿ#…ÿ<ÿ°ÿ¸ÿ:ÿ2ÿxÿKÿÿüþ7ÿÿÎþÿÿ‚þ¬þÿ¤þGþaþ†þþTþ,þyþUþþý@þcþäýÀýHþ?þ²ýªý½ýÑý”ýÅýêýNýYýÂýŽý:ýuý(ýýQýKýqý$ýýPýRýcýˆýýýœý¹ý°ýýhý¬ý³ýÁýáýnýŽýÝýÙýèýàýÕýþïýþÇþdþFþ¿þÄþÿÈþ—þ?ÿJÿÿ—ÿ©ÿ_ÿ¸ÿîÿàÿhYtÀz€æëúÅã UD;oFo‰tdpì-«ÜO’¶GPÄ€(W*íáÞ×¹¬¡“oaUY+ûÿýÿàÿÄÿœÿkÿ„ÿ3ÿýþÿÝþ—þÑþþJþSþþ þéýÁý»ýÑý”ýƒýý\ýAý)ýýýýØü…üÊüÔüü„ü üƒüpü†üXükü†ügü]ü\ü¨ü–ü5üƒüzü$ürü‹üüvü´ü&ü›üÉüpü®ü•ü¡üý½üxüÿüéüÒüÿüâüðüýúüýý ýMý?ý|ý\ýBýžý¨ývý˜ýÏýŒý™ýóýüýµýàý@þ+þ0þRþ#þ[þjþoþ~þšþ²þ±þÊþïþüþÐþÿ0ÿ:ÿ;ÿGÿgÿ|ÿŠÿxÿ±ÿÅÿ‘ÿÀÿáÿ×ÿ#9êÿ)D GYn³ÛÓßÛòçÜãÞøèàÙÓØàįî×è*Tr‘v£Éñü 2:(WSTgƒ_YZm9T-ÿ0é·íËݧ{Žšy^dRd:. éõ¶¸¦« šš›a[sCOK*:!!(#üÿäÿòÿóÿãÿÍÿ°ÿÿÿ™ÿˆÿ‘ÿ†ÿzÿrÿbÿlÿ_ÿkÿkÿPÿBÿWÿKÿ=ÿJÿ.ÿÿ8ÿDÿÿ(ÿÿÿÿÿ'ÿ&ÿÿ#ÿ(ÿÿ,ÿ.ÿ(ÿ2ÿ.ÿ ÿ5ÿXÿAÿ2ÿ;ÿ<ÿ8ÿ_ÿcÿ[ÿHÿ=ÿVÿeÿmÿuÿÿ“ÿ}ÿuÿtÿ„ÿŽÿ•ÿŠÿwÿ–ÿ±ÿ·ÿ°ÿ~ÿSÿUÿCÿHÿ@ÿ4ÿÿôþÿþ!ÿÿßþòþêþÛþØþìþçþ¿þ´þÃþÁþÉþèþíþÑþÖþóþùþÿÿõþÿþþ ÿ>ÿ&ÿÿ&ÿ.ÿ0ÿ"ÿ)ÿIÿ=ÿ(ÿGÿVÿDÿIÿkÿ]ÿJÿ[ÿ~ÿnÿVÿgÿcÿjÿkÿxÿYÿHÿOÿkÿ~ÿhÿPÿMÿ\ÿOÿbÿQÿFÿHÿSÿXÿEÿTÿXÿ]ÿiÿNÿYÿ]ÿSÿaÿjÿWÿbÿyÿqÿ™ÿŠÿuÿ‡ÿŒÿ|ÿ‡ÿ‡ÿoÿ}ÿŽÿwÿhÿyÿ‚ÿ“ÿ“ÿ–ÿ¯ÿ¨ÿžÿ¼ÿ˜ÿ”ÿ™ÿ…ÿÿ¥ÿ´ÿÃÿÉÿªÿ´ÿÉÿ¾ÿÂÿ¬ÿ®ÿ¦ÿ™ÿ²ÿ©ÿ¡ÿ³ÿ¹ÿ£ÿÿÿ—ÿ”ÿ…ÿ€ÿzÿoÿuÿxÿpÿbÿhÿtÿ`ÿWÿ[ÿXÿLÿ?ÿOÿRÿIÿEÿNÿGÿHÿJÿPÿGÿ6ÿ;ÿ)ÿ+ÿÿ#ÿÿ ÿ&ÿ(ÿ&ÿÿÿÿÿÿÿÿÿöþëþôþúþýþùþïþçþöþÿ ÿþþíþîþÿþûþÿÿÿþÿÿÿ$ÿ2ÿ6ÿ7ÿ2ÿ;ÿLÿkÿxÿpÿuÿpÿ‹ÿªÿ¬ÿ°ÿºÿ½ÿÊÿèÿ 7Qs‰¨Á´©°ÎÔØÝËÆÝÿ ,FO^rtjygJ ¿Wóÿ²ÿÿgÿ)ÿÜþ¯þ›þ¦þ­þ­þ¯þ–þ‰þþšþ§þ˜þyþWþ(þþþþóýÇý¬ý¸ýÍýÓýÑýºý£ý‡ýZýKýýèüÛüÅüÝüýýBýkýŽýÄýãýþþþ8þOþ[þjþmþeþhþþ’þ§þ¦þ©þ»þÇþèþ ÿ*ÿTÿzÿªÿäÿ<JO[x´Òñ3s®÷!>½uÀ T¡×€Aªd²Þbhtÿ³þ­þ„þÿ7ÿ4ÿ•ÿnÿyÿÅÿüÿ;·ÿRÿÿÿþþâþOþÏý¾ýÅý þþµýŸý_ý`ýxýgýZý%ýý!ýZý´ý þ[þ˜þÏþ*ÿ€ÿ«ÿ¯ÿgÿ=ÿ>ÿ ÿíþªþbþ#þþûýîýúýçýæý þþ:þsþ‚þ©þ¨þ®þÑþÂþ¹þŸþ}þlþ]þ\þ^þfþyþ™þÚþÿJÿÿÈÿ7[§ÎEl£ä$a´è8”ÚC¾n¨Âr·2|tk‘ÿòÿÿþcþþrÿÕÿ¼ÿ­”ƒÇ¬ºmŽÿÉþEþêýéýîýMýÈüàüøüiýiýÚüëüƒüVü‘ü[ükü…ü§ü-ý·ýKþ ÿ›ÿØÿ G8¾ÿøþ—þþ«ýiýûüéüÉüýYý—ýæýþþÑþÿXÿXÿNÿ5ÿÿÃþnþÿý¦ýKýýøüý,ýiý§ýþ¤þÿ‘ÿôÿ8kš—“ž’ËüPÐPÑuqùDšéJP{}âxbVNÿ½ýÈüÿýÍý†ýþ¿ÿ¤ÄÀ*lŽõëÿLÿóýóüÌüTüyü¹üJüÿûýûÙûäûÞûrûºû üTüzýgþ#ÿÚÿ6£àŒùÿWÿ‡þ¼ý=ýáü¶üáüàüý¿ýÖý;þ•þKþ^þþþý þúý/þgþàþîþÿÿÖþ¢þ þ¦ý-ýÁü¡ü§üØüýKýªýêý&þRþ¦þÚþëþ>ÿÿOžü@§ôR¡ãT¥|ç\Ê@°ßho³7ýÿ8þ0ýAû8ü(þ‰þfÿ ƨ2þ_nÿþžýoý©üÇü(ýý&ýÎüÊûû¢ú@ú úûsû¹üÖýÿƒ+TîPÿpþJý¡ümüUüšüý±ýTþÂþÚþ‰þFþÓýmýý3ýhýþyþ þÁþÇþ¿þµþóýŠýEý ý ý ý!ýGýký[ýQýýÙüàüÇü¦üÒüFýñý¨þ>ÿüÿ­1,ååÝ4žÃSÔKªã/z½š-»‹½r¥1þ&ýMû&ûªýÿ­ÿd%Íf£¤ìA/ÿAþ·ýòýËý’ý¶ý_ýÈü(ü+û3úÙùáù¢úþû?ý¾þþÿÒ¯íÿÎþçýgýõüÐü>ý¼ý7þ€þ—þ§þ~þCþþ þWþÙþ>ÿÿ®ÿÿžÿÐþ%þ“ý’ü“üdüxü!ýªý2þ¿þÑþþ<þ®ý#ý˜ü"üü\ü¢üý®ý/þ›þðþ!ÿuÿïÿK¬ëb”Œ·å£Qâk€ØNu¯|]ð`³ÿNýŽü$ü7ûÌýt# åCtC™ÏÿWÿñþÿøþñý ý$üûú«ù€ùÖùµúäû£ýÿýÿ†‚h$ÿÉþ3þëýãýïýãýðýãý¤ýTýüüåü/ý£ýSþ%ÿòÿ²#ëúþªý8üüµûoûSü±ü_ýÑýšýÎý%þÐýŠýtý6ýCý/ýýÐü üGü>üZüüýâýŽþ6ÿÞÿqûþÍ™C5B‹(Ò~#»?Î iÑ^ÿSÏIBžð=þDülûWû‘úaý^©‰…Ð^<{p?ÿþ9ü³úmù¢ø½ø¥ùÄú%ü‹ýÿ(_ ‹ÿTÿ[ÿkÿiÿPÿGÿÿÃþþAýŠüüü.üãüûý"ÿ!˜êõgNÿÓþ¯þ]þþ…ýgýUýàüPü$üMübü×üBýïý†þÆþ¥þ/þ‘ýý²üPüüLüâüŽýüý"þ[þ›þÈþûþQÿÖÿ^«â$ùâ+¯Büé˜L¨Ô ?±[®úæu˜þ²üÜûIüŠûZý Ã×ó3»øÎN‘I•ÿÕþRýVûÖùCù4ùáùûü ýÔý—þLÿÿ;ÿÿuÿ…}öÿNÿþŠý§üüÑûü»üsý=þêþ†ÿÚÿÄÿœÿÃÿqY #òÿîþdý—ûóú:û&û‰ûZüWýUþiþ0þþéý•ýüü®üÁü#ýZýüüüŽü»üÏü³üÏü’ýŸþ:ÿ™ÿãÿ CÅÿÁÿq¿)Éaæ5Šì‰ízÀ5ÁõÖאָtýñûÇû–ü/ü'þÑk½íÙc”¶.ø÷EÿþXüNú ù:ùöùäúüÞüAýTýzýþŒþÔþPÿ/jéÔÿþ&ý%ü¦û±û4üúüÔýeþžþ¼þÙþÖþ¶þöþÐÿÁ~€&”¿ÿ¼þdý/üKûÌú>ûü´ü0ý²ýðýþËý™ýÏýþ,þ þþýËýKýžüüîûAüÀüDýÂý@þèþ^ÿeÿNÿVÿÿêÿ`²é4PrÜ;Å\åB°ÚnŠ^S0Aý•ûŸû3ý ýþEæ4ûÅGO© §„¢þbý ü[úùJù úÖûÖü"ýýôüúüŠýpþ?ÿþÿÚ—¼JÿÄý‰ü¼û¼û\ü9ýÏýþþþþþoþûþÁÿ¾«þCÿnþ"ý–üuü5üâüñüéüýÍüËüÚügýÅýiþÁþ‘þ3þÄý:ýªü8üünüúü]ýýµýžý¥ýÑý(þ–þ'ÿ´ÿ[A,; O»-ò{ï&_ŽÏ+<ž7µ0D™êþ!~JýNü#ýGþþiÿËg„žˆ²ú„‡ÇNÿˆý¨üÞû¨úÛùžúàûüŸüUü ü!üfüIý»þõÿŠß™ƒÿþý“ü•üíüˆý þþªý-ý&ýsýòý«þyÿd,iUHÿ‚þÏýyýUýýýøüÇü«üMürü°ü#ýßýTþÔþ»þAþ¼ý6ýßü•üiüœüýdýƒý}ýlýgý›ýþ±þPÿÔÿ>oe:qùeðn±ö t=„ìQv€í‹¶sÚýüýôþÿZÿŸš“Pd®\ 1ŒS…{ÿ`ý±üqüÃûîúAûrüáünü§û2ûpû÷ûýÜþrD!¬-kÿVþwý:ýuýòýEþOþùý4ý€ülüý2þ-ÿüÿ±I^ô? ÿ_ÿiÿ/ÿÏþ¾þóýý%üIû^ûuûü@ý þÌþÁþXþþxýýšý©ý¥ýXýCýáüYüüöûZüýçý þÿWÿKÿ;ÿ-ÿgÿ¸ÿXƒÓýH×]ì‚ùBL„¶Ìt¢Cr­«Jpü£û[ýŽÿÿŸÿíFFÁþoÿ;Ïų“[ þžügü#ü’ûûPüÑü_üƒû·úúcúœû¢ý—ÿ¹ Çìÿÿjþ&þþþ9þ·þÞþþêüøûÆûjüfýŽþžÿ@ue1õÿ°ÿ¢ÿûÿ‚£ ÿ„ýXütûGû¦ûLüOýæýþçýtý@ý.ýiýþþ­þ5þnýâüMüüüSüýÁýNþoþgþIþAþ†þÿžÿ/¢d8<zÚAúªðFoØ7$j¡Áì/hé?ù#4ýý‰þÁÿKp®ÿÚþ=®†¾ töÿ†ý!ý(ýÇü[ü€üÿüÐüìû)ûºú‹ú%ûwü[þôÿ‘{ËÿÿÉþÃþõþûþ÷þÿÿ­þÄýÝüaüünýiþ+ÿ’ÿŸÿ¡ÿÿÿ¾ÿˆèµùÿÿÉýðü±übü…ü¶üDü}üýý<ýNý…ýþdþpþ1þêýƒýÑü°ü¬üü¢üŽüÉüTý¹ýùýþYþÔþ,ÿLÿgÿ„ÿ´ÿÔÿòÿAªIƒöTHoÚjgŠ¢¸ê#’èZóAT .âüßüáþŸdL \¾þ2þ®ÿ"6Í~|É ÿÖü4ýÅýpýý_ýŠýtüÚú4ú8údúâúOüþíÿèÿÿZþ)þ’þ$ÿ™ÿ¦ÿuÿ1ÿÅþþýüzüîü°ýtþäþÓþ^þ/þ þeÿsÀˆ ÿÖþAþóýþ'þçýãüDüüüôûÚûªü–ýâýþFþLþËýý-ýàý*þ¶ýöüçü-ý ýôüüüžý^þŠþ¤þÂþüþøþÛþ:ÿòÿ’¾¨ÙC¥¼¨í‘#8M‰Ý($‘H~9xè¢³ÈøNþ2ý.ÿQøûÿ€€ ÿ þiÿ¤°(p $Tÿ´ü´ý/ÿÛþ¸ý¶ýþ÷üÞúûù©ú>ûkû$üäý3ÿ ÿ+þµý!þíþ¾ÿ3-ÒÿWÿÖþLþ¾ý‚ý©ýÛý þWþ~þDþÂý®ý{þœÿN„™¿¸]èÿ§ÿ’ÿÿ~ÿOÿ˜þ„ýÓü,ü×ûúû¤üUý†ýkýbý„ýýfý­ýuþÛþ…þñýhýýÅü„üèüýþøý¹ýÅýåýãýòýnþ,ÿ­ÿÇÿºÿÄÿüÿ,cÕM¤Å¿×ñnÏMÓô×h½*w$Pzͤ-ÿsý(ÿQ„g´ÿÿ®þàýñþ ½F™Ç“ÓÿƒýßýZÿ¥ÿ³þHþ6þäüßúúÝúÜûöû üý þ&þ{ý%ý«ý”þŒÿ/4°ÿóþWþþþ@þ_þ5þåýÅýÑý°ýfýjý1þAÿèÿ ÿÿýÿýÿñÿôÿ2P*ÂÿNÿçþTþcýÓüñüýýßüèüÓüžü˜üÕühýÒýþmþuþþ‡ýZýwý°ýÈýÑýçýÐýýXý~ýÖý)þpþÆþ&ÿPÿTÿmÿÏÿfÐì Et}˜Ý_±ÿKtj¯ÛK‹±(m½ô%FÚZbþ²ÿ@¿ÓÿÂÿÿ]þÿBí ñ¹ÿ¿ý]þÿ{þ]þ>ýOû¤ú¹û¿üªüXüÍü|ýwýý4ý þúþ§ÿ Žÿæþ‚þ¥þÿ\ÿRÿÑþ+þÑý×ýäýØýþ°þRÿŒÿfÿWÿˆÿ¯ÿÔÿ.”¨8¤ÿ:ÿÿÔþvþþûýÅý[ý ýÃü¥ü“üßüsýÓýúýÒý™ýžý»ýýý5þþéýÞýÏý¹ýŒýyý¦ýÓýþ"þ7þTþaþ}þÎþ1ÿ€ÿ­ÿÖÿc€Ž»gœ¹Êû %…Ï d›Û3ŠÆéú^§¬þûþÏÿ ¶ÿ*ÿÓþoþ1ÿËJ¼àÞƒÿVþöþ7`ÿŽþþ5ýùû”ûfüýíü\ü=üü¨ü üýøýžþìþåþÛþÁþxþhþ¾þ6ÿ†ÿ8ÿ„þûýÊýåýþ6þsþ«þ¥þ’þ¥þíþGÿÿÏÿ!UBéÿ¤ÿ‰ÿ…ÿtÿ7ÿ ÿÀþþ^ýývý ýCýðüÿü9ý^ý‚ýÔý%þþþ;þTþ.þâýïý(þ"þîý¼ýºýÔýØýôý9þvþžþºþðþDÿxÿÿÃÿ)o–ªÄèPˆÁÕûUªÛRužå4¥ì!c³õŸØÿŽ®©fÐÿAÿÿôþºÿ J§RvnbÿÌþ¯ÿzEUÿ{þ<þ‘ýÝüèüjý‚ýãüQüLü‰üŽüÆürýþ<þ.þ2þ_þþ¬þôþdÿŽÿtÿ#ÿ¾þ—þˆþ¡þ¼þÁþÈþ®þ}þkþ þÿgÿ„ÿÿ”ÿŸÿ˜ÿ›ÿÂÿàÿÒÿªÿpÿ&ÿöþKþþþþ,þ·ý„ýýèüýsýÝýÓý›ý‰ýœý­ýåýýýþAþ+þþëýÀý¼ýÉýþþþþþSþŒþÔþ"ÿNÿqÿ±ÿêÿ<Yˆ²Íë!DYo²â:cºÄÍ /¨Èó&}qÊ[dou¾ß›ÿ6ÿÿPÿNÇ[ðÿ¹ÿÀÿÿÿSÿøÿòÿŽÿèþgþ0þÁý©ýàýÌý<ý¹ü‡üžüÜüøü4ýŽýšý}ý“ýÆýþSþ“þëþ+ÿÿïþÉþÔþÿ ÿ ÿôþÛþ¾þ¨þ§þÉþÿ+ÿ1ÿ9ÿ2ÿ'ÿÿ;ÿ~ÿ¹ÿ­ÿ„ÿ_ÿQÿQÿÿÿÛþ“þRþþ>þþØýœýý½ýØýâýÞýÐýÑýôýþXþZþ7þCþMþLþCþ>þMþaþiþlþzþ‡þ˜þØþ ÿ1ÿRÿ]ÿ‰ÿ»ÿ÷ÿ7k™¶ø'MVZŒ¯ó1`„‘ÃØõ)\œÄÚ¸§Ã`Hx¼Ü$çÿ«ÿ&ëøIºÿ ÿ½ÿ€ÿVÿÖÿöÿ¡ÿ#ÿºþ©þŠþFþSþ^þõýfý ý ýGý_ýXý`ýeý@ý9ýmý½ýüýþþfþ–þŸþ¤þ·þÕþÞþÜþãþÜþ×þÑþÓþúþ"ÿ3ÿ$ÿÿÿÿ*ÿ3ÿCÿSÿMÿ7ÿ8ÿIÿYÿYÿ;ÿ-ÿÿíþÁþ–þ–þ þxþUþþóýäýØýöýòýåýÛýÑýþ(þ%þ!þ þ3þ3þ-þ?þDþ;þ@þWþ{þþ›þºþÛþ ÿ,ÿ8ÿXÿ}ÿ£ÿÈÿïÿ-;FVz• «Àë)Wv„”®Ûòõ(OTlš¹’#Ì—µ‚O¿;TŸ‰U)Öÿ ÿ]ÿKÿ’ÿŠÿWÿ&ÿßþÊþªþ›þ¼þ”þEþ þáýàýíýöýþïýÅý­ý­ýÏýëýïýôýÿýþ9þ`þ}þŠþ“þ¬þÀþ×þíþÿþ ÿÿ.ÿNÿaÿeÿbÿ[ÿ_ÿkÿsÿ|ÿyÿmÿgÿhÿrÿ{ÿ}ÿoÿbÿTÿNÿMÿ:ÿ;ÿ2ÿ#ÿÿûþ÷þíþàþÊþÃþ³þ­þ©þ£þ¨þœþ•þ–þ™þžþþžþ¥þ¥þ°þÄþÑþÝþàþëþþþÿ%ÿ6ÿCÿKÿ[ÿwÿ“ÿªÿÁÿÕÿéÿþÿ *@Vm‹¥Äßïù &:QarŒ¨Ãßó02ï³|njB䬖{A´ÿ|ÿsÿ^ÿVÿ<ÿûþÊþ¡þ•þ£þþfþ<þþþþ!þ'þ þôýâýãýùýþþýýõýþþ7þPþ]þ\þcþuþþ®þÊþÜþêþûþÿ(ÿ<ÿMÿUÿ[ÿcÿmÿtÿwÿtÿpÿmÿmÿtÿnÿcÿLÿ9ÿ+ÿÿÿÿÿþîþÝþÓþÁþ¸þªþ˜þþ‚þuþpþeþkþiþ_þ^þQþOþUþTþ_þbþpþƒþþ¡þ²þÀþÑþâþõþÿ%ÿ>ÿOÿgÿ…ÿŸÿºÿÍÿáÿûÿ #;Ne}”ª¹ÉØê).Kdr„‰±ÄÎÚÖÁ¬lZGBòÙ³¤‹O#æÿ·ÿ«ÿˆÿwÿXÿ"ÿÿñþáþáþÃþ¡þ~þbþkþoþoþgþGþ:þ>þEþWþRþHþ@þ7þNþeþtþƒþ‡þ™þ²þ¾þØþñþþþ ÿÿ/ÿPÿaÿnÿwÿ‚ÿ–ÿšÿ¤ÿ¬ÿ­ÿ©ÿ¡ÿ£ÿ®ÿ¢ÿ›ÿ’ÿ€ÿxÿfÿYÿJÿ6ÿ3ÿ'ÿÿÿùþêþáþÕþÖþÉþ¼þµþ¬þ©þ®þ¢þžþ™þþ™þœþžþ¤þ§þ±þÁþÒþãþïþÿÿ"ÿ;ÿIÿ]ÿkÿ{ÿ˜ÿ´ÿÍÿåÿ÷ÿ'@Vduƒ“¤±ÀÊÖéû.9@HMW\d[L=öæÜ¯™y`Q"øÿÔÿšÿ~ÿkÿNÿAÿÿûþåþÈþ¹þªþŒþwþ]þKþCþ<þ7þ*þ þþþ$þ%þþ þþ+þ=þFþZþ_þlþþ“þ¦þ¸þÄþÌþÝþñþÿÿ(ÿ1ÿ=ÿAÿLÿTÿ^ÿdÿeÿ_ÿ]ÿfÿ^ÿOÿEÿ:ÿ+ÿ#ÿÿÿÿêþÖþÍþ½þ»þ¯þ¬þ«þ¦þ¥þ¡þ£þ þ›þ˜þ•þ˜þ¡þžþ¢þ¬þ·þÅþÍþ×þéþòþÿÿÿ8ÿKÿ^ÿpÿ‡ÿ¦ÿ¹ÿÊÿÙÿèÿþÿ6?I[m~Š•Ÿ­¸¾ÏÕØßãðôú &(.1 ûæÐ»¾›‰tSM8Ýÿ¿ÿ¦ÿÿÿxÿ[ÿCÿ"ÿÿÿûþìþÌþ´þªþ¤þ¥þþ’þ‡þwþ}þ†þ†þ‰þþþ‹þ–þ«þ¹þ¾þÊþÐþÝþîþúþÿÿÿ#ÿ1ÿHÿUÿVÿYÿbÿrÿ~ÿ‡ÿ|ÿ{ÿtÿxÿsÿnÿiÿSÿSÿ?ÿBÿ<ÿ+ÿ+ÿÿ ÿÿôþóþñþàþÝþÌþÀþ»þ¸þ»þ®þ¦þ¨þ«þ¶þ¼þ½þÅþÌþÚþæþòþÿÿ ÿÿ+ÿ@ÿOÿYÿfÿvÿŠÿÿ­ÿ¾ÿÎÿÛÿäÿïÿ%4AISTRW[^_^^dfhjgaafnmhlkx}xXI6,0 êÿåÿÝÿÜÿÖÿ¶ÿ—ÿxÿbÿaÿPÿDÿ-ÿÿÿÿ÷þóþÚþÀþ¶þ³þ½þ¼þ³þ¥þ”þ–þ˜þšþœþŽþ…þþŠþžþ¬þ²þ´þ·þ¹þÊþÕþßþãþæþðþùþ ÿÿ$ÿ#ÿ%ÿ)ÿ8ÿFÿKÿNÿPÿSÿUÿ[ÿgÿjÿfÿhÿiÿlÿnÿmÿhÿ^ÿZÿRÿPÿKÿOÿLÿHÿHÿFÿIÿEÿMÿNÿQÿUÿWÿaÿiÿsÿ€ÿ…ÿÿ–ÿ ÿªÿ²ÿ¿ÿÈÿÎÿÖÿçÿõÿóÿõÿúÿüÿÿÿÿÿúÿöÿóÿõÿ÷ÿðÿòÿëÿéÿåÿåÿáÿÞÿßÿØÿÐÿÊÿÆÿ¼ÿµÿ©ÿ¡ÿ™ÿÿ‡ÿ}ÿzÿvÿrÿkÿkÿpÿqÿrÿyÿ{ÿ…ÿŠÿ†ÿŽÿ”ÿœÿ§ÿ°ÿµÿÁÿÈÿÓÿÜÿâÿëÿóÿôÿøÿýÿ úÿ÷ÿôÿîÿåÿàÿÝÿ×ÿÎÿÇÿ»ÿªÿšÿÿ„ÿ|ÿoÿgÿbÿ]ÿVÿPÿLÿEÿCÿ;ÿ4ÿ-ÿ)ÿ&ÿÿÿÿÿÿÿÿÿÿÿ ÿÿ ÿ ÿÿÿÿÿÿÿÿÿÿÿ$ÿ'ÿ&ÿ.ÿ/ÿ6ÿ9ÿ9ÿ>ÿAÿCÿIÿGÿEÿJÿFÿJÿLÿRÿZÿ_ÿbÿjÿkÿlÿnÿeÿfÿjÿsÿyÿxÿzÿ~ÿ~ÿ„ÿ‡ÿÿ’ÿÿ‡ÿ‡ÿŠÿÿ’ÿ“ÿ—ÿšÿ—ÿžÿŸÿ ÿ¡ÿ¡ÿ¡ÿžÿ¢ÿ¡ÿ¡ÿ¥ÿ¤ÿ¢ÿÿ—ÿ–ÿ’ÿŠÿ†ÿƒÿ|ÿvÿrÿuÿvÿxÿyÿuÿsÿtÿsÿuÿxÿyÿyÿ}ÿ€ÿ‚ÿ‚ÿÿ}ÿuÿnÿnÿtÿvÿ|ÿ€ÿ}ÿ|ÿ€ÿ„ÿ„ÿ†ÿŠÿÿÿ‘ÿ”ÿ˜ÿžÿ ÿ¢ÿ ÿÿŸÿšÿ“ÿÿÿŽÿ’ÿ“ÿ“ÿ’ÿ”ÿ˜ÿšÿ™ÿ™ÿ—ÿ—ÿ™ÿ—ÿ˜ÿ–ÿ—ÿ—ÿ”ÿÿŽÿÿÿŒÿŠÿŠÿ‰ÿŠÿ‹ÿÿŒÿŒÿ“ÿ–ÿ•ÿ‘ÿ‘ÿÿÿ’ÿšÿ¤ÿªÿªÿ§ÿ¨ÿ¯ÿ°ÿ¬ÿ¥ÿÿžÿŸÿ¥ÿ©ÿ«ÿ¯ÿ°ÿ¯ÿ²ÿ¯ÿ©ÿ¦ÿ§ÿ¤ÿ£ÿ¥ÿ§ÿ©ÿ¨ÿ§ÿ¦ÿ¤ÿ¥ÿŸÿ˜ÿ•ÿÿ•ÿ™ÿ˜ÿ–ÿ•ÿ•ÿ•ÿ•ÿ—ÿ˜ÿ—ÿ•ÿ”ÿ•ÿ•ÿ–ÿ—ÿ˜ÿ™ÿ–ÿ•ÿ•ÿ”ÿ’ÿÿŽÿ‹ÿ†ÿ…ÿ†ÿ‰ÿ’ÿŠÿ„ÿ‡ÿ‡ÿ‚ÿ|ÿ}ÿ‚ÿ…ÿ|ÿtÿyÿ|ÿ{ÿ{ÿ|ÿ~ÿ}ÿ~ÿ€ÿÿyÿtÿuÿtÿrÿrÿoÿhÿeÿaÿ^ÿXÿSÿWÿ^ÿ_ÿ^ÿ]ÿ]ÿdÿgÿdÿbÿ`ÿZÿXÿVÿTÿRÿQÿRÿXÿ_ÿaÿ`ÿ`ÿdÿiÿoÿpÿrÿtÿrÿsÿvÿuÿtÿtÿqÿoÿqÿrÿkÿiÿhÿfÿeÿgÿiÿjÿkÿjÿgÿcÿbÿ_ÿ]ÿXÿUÿXÿYÿ]ÿbÿhÿmÿrÿuÿzÿÿÿ~ÿ{ÿ{ÿ{ÿÿ†ÿŠÿÿ˜ÿ˜ÿ—ÿ™ÿ“ÿ’ÿÿÿŒÿÿ”ÿÿŽÿŠÿ„ÿ…ÿ†ÿƒÿƒÿˆÿ‰ÿ†ÿ…ÿ‡ÿ‡ÿƒÿ‚ÿÿ~ÿ}ÿ{ÿ|ÿ€ÿƒÿ‡ÿ‰ÿƒÿÿ‚ÿƒÿƒÿÿ‚ÿ‡ÿˆÿŽÿ’ÿ”ÿ–ÿ™ÿ˜ÿ™ÿšÿ–ÿšÿŸÿœÿžÿ¦ÿ©ÿªÿªÿ§ÿ§ÿ®ÿ¨ÿ¢ÿ¥ÿ ÿ’ÿ“ÿÿŽÿˆÿŽÿÿÿˆÿ—ÿ{ÿ‡ÿ?ÿoþ§þÅþØþÿ©ÿ¡ÿªÿœÿuÿ\ÿSÿTÿkÿ´ÿÏÿçÿåÿãÿÄÿ·ÿŽÿ”ÿÿ°ÿÛÿ®ÿŸÿÆÿ˜ÿcÿ‰ÿ~ÿbÿvÿ’ÿŒÿÿ–ÿ“ÿuÿsÿŽÿ|ÿ~ÿ¡ÿ§ÿ•ÿ¡ÿ”ÿ‡ÿ†ÿŒÿˆÿ–ÿ¡ÿ«ÿ¬ÿ¡ÿšÿ“ÿ•ÿÿŒÿ”ÿšÿÿ©ÿ›ÿŸÿŒÿ˜ÿœÿ«ÿ¥ÿµÿ²ÿÌÿÌÿòÿäÿ­ÿ+ÿ’þ„þqþ»þÿŸÿÌÿòÿ½ÿ™ÿVÿÿ ÿÿZÿ|ÿ¾ÿÅÿÄÿ—ÿeÿ:ÿ0ÿ9ÿXÿkÿyÿŠÿ{ÿsÿUÿ:ÿ/ÿ:ÿ8ÿNÿYÿdÿ`ÿhÿRÿEÿNÿFÿQÿXÿqÿsÿuÿjÿeÿ^ÿ_ÿ]ÿ_ÿdÿjÿfÿ^ÿcÿjÿjÿbÿkÿaÿhÿZÿNÿWÿPÿ_ÿhÿYÿgÿXÿMÿXÿJÿMÿVÿPÿÅþÍþÿ×þûþXÿgÿ;ÿ‡ÿ†ÿTÿTÿkÿ7ÿnÿŽÿ–ÿÁÿØÿÏÿþþôÿÙÿ¼þôÿËÿÿ«ÿWÿãÿœÿ-ÿ”ÿŸÿ'ÿëÿŸÿ‰ÿéÿŠÿ|ÿÞÿ¾ÿÿüÿÈÿFÿ)Æÿ{ÿÁÿýþ@çþBGôþÿi-ÿKÿU‘ÿGÿZÿ ÿ1+ÿ ÿ8™ÿØþh|ÿFÿ$ËþÜÿ²ÿýþ¼ÿ¢ÿYÿ–ÿ5ÿ)ÿ©ÿnÿQÿQ[ÿÇþh‰ÿ€þJšÿ–þ¾ÿÿØÿQÿoÿ‚ÿPÿÑÿßþ½ÿåÿ/ÿIÿëÿzÿÿûÿÿ6ÿ]ÿÔþUÜÿ…þ)ÀÿÛþ§ÿ†ÿ€ÿMÿ2ÿ¾ÿsÿÿKÿúÿÿ:ÿ :ÿÖþ,ÿ™þ¨þ­þëËþ’þ‰fÿmþ…•ÿµþÃÿªÿ·þ“ÿÝþÍÿ?ÿ„þ‰ÿ%ÆþdÿWÆþLÿX>þœÿ^šþkÿýÿÿkÿPÿÀÿ3ÿbÿRÿdÿ]ÿEÿˆÿ­ÿ/ÿúþ;<ÿ~þôÿ­ÿUþàÿ4RþÛÿæÿ#þÌÿmÿîþ+Åþ:ÿƒ1þËÿîÿ`þÉÿ_ÿ!ÿµÿbÿÿE—þÆþc?ÿNþ}–ÿþg>ÿUþ;ÿ¢þ®÷þ•þÜlþ–þMþâþ; þÿÒ¡þ¶þyÿÂþÖÿpÿrÿ>ÿ±ÿZÿâþçÿÿ4ÿ€ÿeÿ†ÿkÿêþ%Nÿ—þJÐþ§ÿMÿ¦ÿrÿmÿÑÿ>ÿ-ÿ–ÿ!«þH_ÿÿ¾Cþlÿ¹Ùýa/kþE¼ÿ³þÇÿÐÿÿçÿxÿEÿS/ÿÓþ·ÿíþÊ“þ¯ÿ6Ýþ ˆÿÿ†Öþ\ÿ¼¢þŒÿ1‹ÿ ÿeUÿ ÿéÿ/ÿ/ÿ2ÿùÿµÿÿaZÿ}ÿìÿlÿ}ÿëÿ†ÿŒÿ¿ÿ˜ÿ´ÿ|ÿÿÕÿŒÿ1ÿ-ßÿÿþåÿk-þTz þ­¯ÿ“þ {ÿ~þÕ]ÿCÿûÿ’ÿ½ÿÂÿqÿðÿ®ÿIÿ¤ÿ$ÿÚÿ5ÿcÿUUÿZÿ ¹ÿiÿ×ÿ¡ÿOÿ×ÿøÿ°ÿ"ÿëÿõþ^AÿOÿgÞþ±ÿ—Þþkÿ¨Æþtÿ‹ÿ(ÿ1tÿûþxÿŠÿ÷ÿàþ‚ÿÖþQdÿÛþ-ÿ€ÿ€ÿgÿ;ÿœÿ"ÿÌÿ©ÿÿUÿbÿ§ÿÿ³ÿIÿqÿ ÿ ÿ¶ÿ3ÿÿKÌþCÿ%üþÿ ¦þ¤ÿÿ¨þþþÿ(ÿXÿ†ÿÿ*ÿÿÿðþDÿÉÿùþyÿ]ÿDÿÿ,ðþþþJµþ]ÿ°þ?ÿÔþlÿ «þ·ÿŠÿóþqÿ¸þÿ›þuÿîÿ°þöÿ ÿÿ,¢þ‰ÿ ÜþEÿV¾þIÿéÿîþóþÚÿÐÿwþáÿåÿ&þ§ÿvþ[#ÿ0ÿòÿUÿ,ÿ{ÿ™ÿAÿ¥ÿžÿ=ÿ‰ÿÄþfÿPgþˆÿ.ÿGÿtÿñþ²ÿÞÿ½þåÿÙþÁÿ·ÿJÿ¹ÿ_ÿÿbüþ|ÿx-ÿ&ÿæÿ¸ÿ“þòÿãþ¯ÿñÿOÿ²ÿÿhÿÜþîÿîÿ=ÿÑÿÀÿOÿ‡ÿ\Ìþ³ÿJ.ÿeÿüþ¯ÿQÿjÿ ìþüÿäþÑÿ(ÿKÿƒÜþuÿ7ÌÿÃþlžÿ¾þ=ùþMÿÆÿÏÿÿøÿôÿþs¯ÿÿÖÿÿ7UÿGÿ?eÿ©ÿ½ÿ¯ÿÿqzÿ–þ£Tÿ¯þ¯ÿ ÿÃÿÿ\ÿÿþ´Üþ*ÿŸÏþÆÿDÿºÿ%åþÁÿ—Êþ¥ÿ)?ÿ{ÿóÿÿ}ÿ„ÿ¯ÿÁþ3dÿ2ÿ0¬þ$sÿ(ÿrÿÿMÿ ÿïÿ™ÿÚþíÿvÿåþÿÿËþŠÿ ˜þ£ÿÑÿÿdÿ¢ÿIÿ…ÿdÿ8ÿ½ÿYÿ"ÿxÿ‚ÿTÿ/ÿ†ÿ±ÿäþOÿ1IþÅÿ$?þ÷ÿîÿcþñÿˆÿÃþçÿLÿvÿuÿÿZÿ|þ·ÿ@ÿ ÿñÿµþcÿÀÿËþ$ÿùÿÈþgÿÓÿóþ6ÿ’ÿÿ„ÿÿ¯þEÿ°þZþþÿ¶ÿdÿÄþ·ÿ¦ÿ þBÿ ’þeÿŸÿ…ÿÚþNÿÐÿíþuÿ3ÿ´ÿÿVÿ¤ÿAÿšÿÿ»ÿõþÕÿ²ÿ×þÖÿ‰ÿÿ_ÿ“ÿÿçÿ-ÿuÿêÿ0ÿ¤ÿ¬ÿÕþÃÿ…þâÿËþ%;ÿÿøÿ6ÿ£þrXÿ þipÿ[þ½ÿ—þØÿÚÿâþœÿµÿHÿ™ÿyÿfÿ«ÿeÿCÿØÿ„ÿ ÿðÿ/ÿÿ¯ÿßþßÿôþ»ÿœÿÝÿ^ÿ{ÿcÿêÿ]ÿÿ$ÿ›ÿ|ÿ=—þg‘ÿ¤þŒ(ÿŸÿ~ÿ½ÿ ÿÏÿ´ÿÿ÷ÿ@ÿ9ÿxÿMÿëÿJÿŒÿªÿ^ÿMÿºÿ»ÿ1ÿ_ÿ% ÿÝÿŸÿJÿãÿVÿzÿ°ÿ~ÿÖþÑÿèþãÿÿgÿm©þäÿìþÞÿ ÿðÿÀÿßþ¨ÿœþt÷ÿVþ]’ÿ3ÿÊÿÿüÿgÿ2ÿµÿ¢ÿ@ÿ€ÿ®ÿMÿšÿJÿ¹ÿKÿëþáÿGÿ|ÿ‰ÿ²ÿÿ€ÿÉÿ÷þ ÿW ÿ«þô(þVÿ/ˆýaIÏý’÷ÿ þa JþÜÿU`þ“ÿ*_þÜÿßÿrþK%–ý]½ÿZþ,¥ÿíþŒÿÜÿ«þýÿHÿÛþ@Ðþiÿûÿãþ7ÿÒÿÿŸÿÁþÿ£ÿ5ÿ<ÿMÿàÿ ÿÿ1Îþ_ÿv¡þÂþñÞþ~þiþYÿ8ÿTþôÿ×ý§kþ¨þ ÿ/þMÎþþ%Ãþèþ{-ÿçþPóþÿ¯ÿ|ÿÙþ%úýrõÿþ'ÕÿÑþÔÿôÿ‰þo+ÿ˜ÿ…ÿ›ÿÿ¶ÿ˜ÿpÿTÿåÿôþKÛþÿíÿuÿtÿµÿpÿVÿ=àþSÿPCÿ÷þm‰ÿéþ@`ÿzÿ6Tÿwÿ %ÿÛÿÃÿRÿÂÿ·ÿ=ÿ{ÿ)rÿƒÿ(vÿ'ÿw×þŠÿ  þ÷ÿm¬ý®ÿ:^þ@ÿ.”þÿÝ¿þŽÿ*ÿšÿñÿñþ÷ÿäþüÿÿUÿÓÿÏÿ[ÿ4ÿ©ÿ÷ÿóþªÿ<ÿõÿƒÿCÿÝÿ:ÿpÿ%·þDeÿ²þ”šÿ·þÖÿúÿÿ¯ÿuÿîÿÑþŸÿüþ™ÿäÿ)ÿrÿêÿÿÛÿžÿzþ»·þ ÿÃÔþ%ÿ‚?ÿÿ\ÖþCÿzÿÆÿ¥þ @þ­tÿ—þ ÿrÿŒÿpÿ*ÿêÿ‹ÿlþ}Gÿ{þƒÿëþ½ÿ[ÿ?ÿ2ÿÍþƒÿœþzŸþÿÎÿhþ]$ÿùþØÿÈÿ>þ©þ°ÿ¾ÿ8ÿXÿwÿGÿÄÿLÿíþ½ÿ³ÿÊþ¢ÿPÿ+ÿWÿµÿÚþqÿŸÿóþcÿàÿÿäþ&ÿ—þ;Zÿkþ¦“þÙþ ˜þŠþw3ÿùþ kÿuþ® ÿ-þ­iÿ þ™ÿ;9þöÿíÿ¹þWÿ¾ÿnÿøþ‘ÿ·ÿFÿ™ÿDÿoÿ‘ÿ0ÿ”ÿiÿ_ÿ¬ÿtÿvÿØþ áÿZþGÿ©þïÿ’ÿ0ÿŽÿœÿjÿ¨ÿ?ÿ“ÿzÿ‰ÿ:ÿ—ÿ¢ÿÿˆÿ„ÿ<ÿ´ÿHÿ%ÿk_þùÿWÿ*ÿ'äþiÿ"ÿ¨ÿµÿBÿÿ§ÿƒÿPÿíþ ™ÿöþÎÿ1þWÃþkÿ©Xÿ“þ<,ÿòþ¯\ÿCÿ€Þþªÿc%ÿ„ÿôÿ ÿ ÿ7<ÿ\ÿNÿNÿ_íþtÿ’sþRZþûÿ8nþSÃþÝÿC¨þûÿÑÿ7ÿìÿÿªÿSãþ¨ÿN?þ4âÿŸþW¹ÿ<ÿE|ÿèþ(ÿÿÎÿßÿ4ÿÌÿóÿûþ›ÿâÿJÿÿhÿxÿîÿ0ÿoÿX¿þ)ÿ.×þ¥ÿ±ÿÿÿÿ‰ÿßþìÿÿYÿéþìÿvÿõþrÆþÎþšGÿDþ¿“ÿGþÊÿýþ­ÿbÿØþ`éþ3ÿFËþmÿýÿÿúþÿÿÿ(ÿ„ÿ¦ÿÊþtÿ%>þòÿ{ÿ­þ;2ÿœþÄÿMþÛÿŒþ`ÿW€þ#ÿ@Ôþ9ÿÔÿ`ÿ¤þ ÿhþ.gÿjþæÿÝÿ+þ½ÿ-`þëþ2ÿÖþ#ÿuÿqÿõþÿÿÙþ”ÿÿÿ'ÿùÿ>ÿÐþçÿZÿÿvÿ§ÿtÿ ÿÿÿôþ`ÿ”ÿ×þ¢þZÿ(ÿÿKËþ/ÿòÿ:ÿjÿÀÿ,ÿ“ÿÈÿìþ³ÿ¯ÿpÿÿ#áþ˜ÿûÿ²þ‚ÿÿÿwÿÿiÿxGþçÿøÿŽþðÿäÿÿ™ÿ“ÿöþEÿšþö(ÿ^þÿ~ÿAþTîÿ_þ“ÿ;ÿ„ýþÿVpÿÕþ¹ÿáþÿB—þÅÿõþÁÿ~ÿÕÿúþ»ÿñÿ<ÿÖÿ—ÿzÿ›ÿ½ÿòþ=lÿÈþ¼Gÿåþjˆÿ£þØ<ÿ‚þ‘Åþçÿ'ÿÂÿÿ}ÿ~ÿÒÿhÿÓÿ›ÿùþùÿ‘ÿ÷þpÿ0ÿ8pÿüþnÿSÿ÷þçÿ“ÿÿ1\ÿ0ÿÂÿÿ%‚ÿ:ÿJÿUÿUËþŽÿ”‰þ–ÿHæþhÿ' ÿÅÿbÿØÿuÿŒÿpÿ“ÿ¶ÿ9ÿÿþÞÿ^ÿIÿ»ÿÿQÿ»ÿÿ)ÿ9ÿõÿ9ÿªþùÿïÿ¬þSÿIrþÐÿ‹ÿ­þÉÿüÿÎþZÿöÿCÿßþ»ÿàÿOþ¸ÿ>þþ³þFÕÿ‰þ…ÿO”þ7ÿ¸¿þÿ‘ÿÃþSdÿçþ˜ÿnÿGÿ ëþ3ÿÿÜþ+$ÿ¡þ¦€þŽÿ$þ·ÿ¦þÿMáþÕþÜÿÍÿXþ€ÿ(uþÚÿ€ÿ’þ£ÿ9Iþ„ÿûþAÿ`ÿtÿÿ4ÿEÿÁÿŠÿõþ”ÿÅÿàþ£ÿhÿgÿnÿcÿœÿ7ÿÀÿüþeÿçÿçþœÿªþ¶ÿ÷ÿçþÿ”ÿ`ÿ˜ÿsÿ´ÿ‚ÿéþ—ÿŠÿÿÝÿéÿ+ÿvÿ¾ÿÎÿ2ÿÿ­ÿâÿ/ÿhÿÑÿžÿ°þ“ÿÿ— ÿÿ½ÿùþœÿ¥ÿÖÿóþ´ÿøþËÿÏÿøþßÿWkþMÿ?ÿ²ÿfÿ~ÿ;#ÿyÿÇÿóÿDÿyÿ/bÿíÿÊþ¡ÿóþÿêÿŠÿTÿ¢ÿÖÿ-ÿvÿ÷þ•ÿŽÿÿ_‰ÿÿI­ÿfþ9={þŠÿøþâÿþþIÿZ„ÿ$ÿ¢ÿ†ÿÃÿ%ÿÊÿ¼ÿÿnÿ”ÿØþ—¡ÿ½þHÖÿÇþYÿ'Ëÿ5ÿDÿ9cÿ‡ÿRÿ¦ÿËÿøþzÿEÿ™ÿ•ÿºÿºÿËþÉÿßÿ#ÿ8ÿèÿiÿ!ÿöþâÿ8ÿ;ÿÚÿŸÿSÿÿI%ÿÿe@ÿ×þôÿÓþRÿøÿ—ÿÿ¤ÿÕÿåþðÿ«ÿÍþ£ÿ„þ¦þ"ÿqÿ¤þ)Øÿ/þ^pÿ“þAÿEÿ‡ÿoÿ^ÿ°ÿ_ÿ<ÿ\ÿ²ÿÿÿièþÖþ¨ÿ·þçÿ³ÿYþáÿ¼ÿŒþ‚ÿåþxÿËÿÍþ4ÿ'ÿÿ¯ÿcþ¾ÿaþÿƒ’þIÿ!ÿmÿ¦ÿQÿ?ÿÀÿÿTÿ¯þ†ÿµÿ:ÿKÿÃÿÑþœÿîÿ·þzÿÁÿ|ÿ(ÿÍÿÿHÿ|ÿ‹ÿ:ÿÂÿuÿBÿ¨ÿÍÿjÿ_ÿ¦ÿ_ÿoÿ‹ÿÿ>ÿ1:ÿªÿ ÿ°ÿÚÿOÿyÿdÿŒÿæÿ‚ÿcÿeÿÏÿÿçÿÿPÿÐÿâÿÿ¥ÿÊÿjÿ ÿÙÿÏÿîþõÿÿµÿ¡ÿ8ÿÿÝÿgÿaÿßÿ°ÿnÿ»ÿžÿÂÿ—ÿ˜ÿ„ÿ†ÿ¥ÿWÿîÿ®ÿ‹ÿlÿÝÿwÿuÿ®ÿUÿYÿZÿÌÿâÿHÿuÿýÿDÿTÿ ÿGÿõÿ‹ÿšÿ”ÿ„ÿÆÿ·ÿ¾ÿqÿ¥ÿïÿÏÿ:ÿÄÿqÿMÿ©ÿrÿºÿÁÿVÿ[ÿ$+ÿYÿøÿªÿ/ÿèÿ™ÿBÿéÿiÿ©ÿŽÿkÿ0XÿAÿÎÿ"ÿ›ÿ‹ÿrÿ”ÿÁÿ}ÿlÿ¸ÿJÿŠÿ¶ÿ7ÿ|ÿÿ2ÿÎÿDÿ+ÿáÿ}ÿÿQÿ­ÿÿ&ÿiÿáÿÿjÿ¼ÿ)ÿÿ¦ÿÌÿ¶þ{ÿØÿÿ(ÿ„ÿmÿ,ÿ~ÿoÿ;ÿdÿ†ÿxÿ2ÿÿNÿŒÿÿCÿ¾ÿ<ÿÿ‚ÿ®ÿÿ‘ÿ\ÿoÿ^ÿCÿkÿŽÿGÿLÿ’ÿeÿXÿ‹ÿƒÿ ÿVÿ¨ÿ9ÿÿrÿ¥ÿÿ9ÿ×ÿÿÿpÿgÿ$ÿÿrÿÇÿÿ2ÿÖÿÿÿ>ÿÿAÿ6ÿaÿÿˆÿGÿqÿsÿƒÿ)ÿ]ÿŠÿ€ÿ%ÿåÿ´ÿ+ÿÒÿ©ÿ&ÿ†ÿÜÿÜþ¾ÿÆÿÿÓÿÿhÿŒÿ`ÿhÿ/ÿ}ÿÆÿ3ÿ^ÿïÿdÿ=ÿåÿhÿÿÄÿxÿ=ÿÒÿœÿdÿÖÿ~ÿ`ÿ©ÿSÿFÿÞÿrÿ ÿîÿ%ÿ¯ÿöÿKÿ$ÿûÿjÿÿóÿ™ÿ¨ÿ¤ÿ»ÿ°ÿ–ÿ‡ÿjÿ­ÿ?ÿËÿêÿIÿ¬ÿ–ÿ ÿºÿÌÿ.ÿgÿÇÿ·ÿÿžÿ ÿ«ÿ¢ÿCÿ­ÿÝÿ2ÿ¶ÿýÿFÿ¹ÿìÿ‹ÿxÿ¡ÿ­ÿWÿ•ÿ£ÿUÿÿÿvÿ›ÿ›ÿ€ÿ‹ÿšÿkÿ™ÿhÿ…ÿ¯ÿtÿuÿ…ÿcÿÜÿšÿGÿäÿžÿ7ÿ¾ÿ”ÿiÿ•ÿµÿ}ÿŠÿ´ÿxÿrÿÀÿ7ÿcÿªÿ‚ÿ¢ÿ{ÿhÿ[ÿ9ÿ¢ÿ…ÿmÿbÿ„ÿKÿÜÿnÿWÿ¾ÿzÿ0ÿnÿtÿLÿ³ÿ‹ÿAÿ©ÿÅÿsÿÿ ÿ1àþYÿ =ÿ)ÿ²ÿ¶ÿZÿ²ÿ“ÿxÿPÿwÿJÿwÿ|ÿ>ÿÿmÿvÿyÿ^ÿ€ÿLÿOÿnÿXÿEÿXÿ|ÿlÿZÿ[ÿfÿ9ÿ"ÿuÿhÿ2ÿyÿPÿ<ÿZÿ|ÿ;ÿAÿ^ÿCÿjÿKÿLÿxÿaÿUÿ5ÿXÿŸÿ ÿ2ÿªÿÿ=ÿmÿtÿHÿiÿjÿQÿXÿœÿzÿBÿ6ÿÿpÿúþ{ÿ—ÿsÿ]ÿ‚ÿ¤ÿ3ÿcÿtÿ=ÿ@ÿyÿpÿ:ÿ‚ÿ™ÿKÿJÿdÿOÿ:ÿcÿcÿJÿ^ÿ`ÿZÿGÿ€ÿvÿ[ÿEÿzÿ—ÿUÿtÿ‚ÿSÿ{ÿ£ÿeÿRÿ•ÿ~ÿ_ÿyÿ4ÿ‘ÿŽÿ]ÿˆÿÿ¶ÿ[ÿ†ÿjÿLÿšÿ^ÿ„ÿÿœÿ®ÿ¡ÿ£ÿ£ÿqÿjÿ¦ÿ\ÿuÿËÿ”ÿ„ÿÐÿÁÿ­ÿkÿŠÿyÿlÿ†ÿpÿ¤ÿ´ÿ€ÿ´ÿ©ÿgÿžÿ…ÿ€ÿ¢ÿƒÿ›ÿŸÿ›ÿ­ÿwÿÿªÿoÿ~ÿ£ÿÿ™ÿÔÿ¡ÿkÿ¿ÿÃÿbÿ|ÿÿ†ÿŽÿ€ÿ}ÿ¥ÿ¯ÿ…ÿ}ÿŒÿšÿxÿyÿ‡ÿ”ÿÿoÿ³ÿ¯ÿ«ÿ”ÿvÿŠÿzÿmÿ]ÿyÿvÿ’ÿ”ÿ”ÿ™ÿÿdÿ`ÿoÿcÿnÿgÿ¨ÿ¼ÿ¶ÿ¥ÿ®ÿÄÿÿpÿ‹ÿ‡ÿsÿˆÿ¯ÿ»ÿÃÿ´ÿ»ÿÿƒÿ’ÿ˜ÿyÿŠÿ·ÿ‚ÿ˜ÿ±ÿ³ÿ¥ÿ¢ÿ”ÿ ÿ…ÿ_ÿbÿ„ÿ†ÿiÿ ÿ§ÿŒÿ˜ÿžÿ{ÿbÿzÿpÿ8ÿsÿ“ÿ|ÿƒÿÿzÿlÿmÿXÿeÿwÿjÿwÿ‹ÿ|ÿÿ‹ÿuÿfÿlÿbÿ.ÿ9ÿXÿ[ÿ[ÿqÿ~ÿuÿtÿZÿMÿ6ÿQÿFÿ:ÿtÿ‚ÿsÿ~ÿ¡ÿ‚ÿTÿ7ÿCÿAÿÿ/ÿBÿJÿNÿJÿAÿ1ÿÿÿþ ÿ÷þðþÿÿÿÿ>ÿJÿ'ÿ.ÿ<ÿ7ÿ2ÿ@ÿ\ÿcÿdÿgÿvÿ‚ÿƒÿ~ÿxÿÿzÿsÿ†ÿÿŽÿ™ÿ¨ÿ©ÿ¤ÿŸÿžÿ¦ÿœÿ‘ÿ¥ÿ¯ÿ¢ÿŸÿ¯ÿ¾ÿ®ÿ¥ÿ´ÿ·ÿ¡ÿ›ÿ°ÿ²ÿ¯ÿ¯ÿ³ÿ´ÿ°ÿ¦ÿ¤ÿ¦ÿ¢ÿ¡ÿ¤ÿÿœÿžÿ¤ÿšÿ™ÿ™ÿšÿ—ÿ•ÿ{ÿ–ÿœÿ}ÿ¬ÿ ÿºÿ—ÿˆÿ—ÿ–ÿÿzÿ—ÿ—ÿœÿ¥ÿ©ÿµÿ¢ÿzÿÿ}ÿqÿÿˆÿ„ÿ~ÿÿÿ•ÿÿzÿ”ÿŽÿ{ÿpÿ}ÿÿwÿyÿŒÿšÿ“ÿxÿ‹ÿÿnÿlÿdÿfÿeÿbÿaÿkÿpÿhÿfÿlÿoÿnÿeÿqÿÿyÿuÿzÿ~ÿÿŽÿ‡ÿ‡ÿÿ‘ÿŠÿ€ÿ{ÿ~ÿÿ~ÿ}ÿƒÿÿÿÿ‘ÿŒÿˆÿ‹ÿ‹ÿ…ÿŠÿ‘ÿŒÿ‘ÿ•ÿÿ‰ÿ‰ÿ‡ÿ}ÿ„ÿ‡ÿ‚ÿ†ÿ‰ÿŒÿŽÿÿ’ÿ“ÿ’ÿ•ÿ’ÿ•ÿ–ÿ•ÿ˜ÿ›ÿÿšÿÿÿ™ÿ—ÿŽÿ‰ÿŠÿŒÿ‰ÿ…ÿ…ÿƒÿ„ÿƒÿ€ÿ}ÿÿ}ÿ~ÿƒÿ€ÿvÿxÿÿÿxÿrÿyÿ‚ÿyÿvÿvÿsÿqÿnÿlÿlÿlÿiÿiÿeÿhÿnÿoÿlÿkÿxÿyÿvÿpÿeÿcÿaÿeÿhÿiÿhÿaÿ\ÿ\ÿ_ÿaÿeÿhÿcÿeÿeÿdÿeÿfÿgÿjÿiÿgÿhÿiÿiÿbÿbÿaÿ]ÿ^ÿaÿhÿlÿcÿ]ÿ^ÿ\ÿ[ÿSÿOÿSÿSÿVÿWÿYÿ`ÿgÿkÿqÿuÿwÿvÿqÿoÿrÿsÿvÿ{ÿyÿzÿyÿxÿ~ÿÿ~ÿ|ÿ{ÿzÿ~ÿ~ÿ}ÿyÿuÿuÿuÿ{ÿ€ÿƒÿ†ÿ†ÿ~ÿxÿ{ÿ|ÿxÿxÿ}ÿ{ÿzÿzÿ€ÿ‡ÿ‡ÿ…ÿ†ÿŠÿ…ÿƒÿ„ÿˆÿ‰ÿŠÿÿÿ’ÿ–ÿžÿ›ÿ”ÿÿÿÿÿÿŠÿ†ÿƒÿƒÿ€ÿ~ÿÿ‡ÿ‰ÿ‰ÿ‰ÿ‹ÿ‹ÿ‡ÿŠÿÿ—ÿ™ÿ•ÿ•ÿœÿ¡ÿ¢ÿ ÿŸÿÿœÿžÿœÿ™ÿ‘ÿ‹ÿ‹ÿŒÿŽÿ‘ÿ–ÿ˜ÿ˜ÿ™ÿ˜ÿ—ÿ™ÿ™ÿ’ÿÿ‘ÿ’ÿ‘ÿ“ÿ”ÿ”ÿ–ÿ•ÿ•ÿ—ÿ–ÿ“ÿÿÿÿŽÿ”ÿ–ÿ–ÿœÿ¢ÿ¡ÿšÿ–ÿ–ÿ’ÿŒÿŒÿŽÿÿ‰ÿˆÿŠÿŠÿ†ÿˆÿˆÿ†ÿ‡ÿ‰ÿ…ÿ}ÿ|ÿÿ€ÿ€ÿÿƒÿ‰ÿŠÿˆÿ‹ÿˆÿƒÿ}ÿ{ÿsÿjÿhÿjÿhÿgÿcÿ`ÿbÿbÿcÿbÿlÿoÿhÿbÿaÿhÿkÿhÿfÿiÿqÿqÿrÿwÿuÿwÿxÿvÿuÿsÿrÿqÿoÿkÿiÿhÿoÿtÿrÿpÿtÿvÿuÿvÿuÿtÿrÿoÿjÿeÿ_ÿ`ÿ^ÿXÿUÿSÿSÿQÿLÿJÿJÿIÿJÿMÿNÿLÿMÿLÿLÿMÿPÿSÿSÿUÿQÿOÿNÿMÿMÿNÿPÿOÿRÿSÿQÿVÿ\ÿ[ÿ[ÿXÿVÿ\ÿaÿgÿjÿmÿrÿwÿzÿvÿuÿtÿqÿnÿmÿlÿmÿnÿkÿiÿhÿfÿlÿqÿrÿrÿuÿtÿoÿqÿqÿsÿoÿqÿvÿvÿsÿwÿ~ÿÿ|ÿzÿ|ÿ~ÿ~ÿ~ÿ~ÿ}ÿ€ÿ…ÿˆÿŠÿ‰ÿ†ÿˆÿ…ÿ€ÿ…ÿŠÿ‹ÿ‰ÿƒÿƒÿ‡ÿŠÿ‡ÿ†ÿ†ÿ„ÿ~ÿ€ÿ„ÿ~ÿ{ÿzÿzÿxÿ|ÿ‚ÿ†ÿˆÿ‹ÿŠÿƒÿÿƒÿŠÿÿ‹ÿ†ÿ‡ÿ‰ÿ‰ÿŒÿ‹ÿŠÿ…ÿƒÿ‰ÿŒÿˆÿ…ÿ‚ÿ|ÿ~ÿ„ÿ†ÿ‚ÿ‚ÿ…ÿ‰ÿŠÿÿÿÿ“ÿ‘ÿ‹ÿŠÿŽÿÿ”ÿ–ÿ˜ÿ–ÿ›ÿ ÿŸÿœÿ—ÿ“ÿÿŽÿÿÿÿ‹ÿŒÿ‘ÿ’ÿ‘ÿÿŒÿŠÿÿ}ÿzÿyÿ}ÿ}ÿ~ÿÿ~ÿ}ÿ‹ÿ“ÿ“ÿ”ÿŽÿŒÿŒÿ‘ÿÿ‘ÿ’ÿ‘ÿÿ‰ÿ‹ÿŽÿÿŒÿ‰ÿŠÿŒÿ‹ÿƒÿ|ÿxÿrÿpÿrÿqÿrÿuÿwÿpÿnÿoÿmÿkÿmÿnÿkÿkÿpÿvÿvÿvÿyÿ~ÿ{ÿwÿ{ÿ~ÿyÿlÿcÿfÿlÿsÿoÿlÿmÿnÿmÿiÿgÿdÿ`ÿZÿWÿWÿ\ÿcÿbÿ_ÿdÿeÿdÿhÿiÿhÿiÿkÿnÿqÿxÿ{ÿvÿsÿsÿwÿyÿ{ÿ|ÿyÿyÿ{ÿ}ÿ}ÿ|ÿyÿsÿpÿnÿnÿmÿlÿjÿfÿ`ÿYÿQÿMÿRÿSÿOÿTÿWÿZÿ^ÿ`ÿcÿcÿ_ÿ^ÿaÿ_ÿbÿdÿaÿdÿkÿqÿrÿuÿÿ„ÿ‚ÿ…ÿ„ÿ‡ÿ‡ÿ…ÿƒÿÿ‡ÿŒÿÿŽÿ’ÿÿŽÿÿ’ÿŒÿ…ÿ‚ÿ~ÿÿÿ‚ÿƒÿÿÿ‚ÿƒÿ…ÿƒÿÿ|ÿ{ÿyÿzÿ|ÿ{ÿ}ÿÿƒÿ†ÿ…ÿ‚ÿ‚ÿÿ€ÿ~ÿ}ÿ}ÿzÿyÿzÿ€ÿ†ÿ‡ÿŒÿŽÿÿÿ“ÿ“ÿ‘ÿ”ÿ”ÿ’ÿÿ‹ÿŒÿŒÿ‘ÿ–ÿ›ÿ›ÿšÿ—ÿÿ‘ÿ‘ÿ’ÿ’ÿ“ÿ“ÿ”ÿ–ÿ™ÿÿŸÿŸÿ›ÿ›ÿ–ÿ‘ÿ‰ÿ‚ÿ}ÿ|ÿ‚ÿ‡ÿ˜ÿ˜ÿÿ’ÿ‘ÿ‘ÿÿ‰ÿ…ÿ†ÿÿ}ÿ€ÿ‚ÿƒÿ„ÿˆÿŠÿŽÿ’ÿ’ÿÿ’ÿ‘ÿÿÿÿ’ÿÿÿÿ•ÿ—ÿ™ÿ˜ÿ˜ÿ™ÿ”ÿÿˆÿˆÿˆÿ…ÿ…ÿ„ÿ…ÿ€ÿyÿzÿ~ÿ|ÿuÿsÿsÿrÿsÿrÿrÿnÿpÿrÿpÿjÿfÿhÿhÿdÿ^ÿ]ÿ^ÿ\ÿ[ÿXÿ[ÿ^ÿXÿSÿQÿSÿRÿRÿQÿMÿLÿKÿGÿCÿEÿMÿQÿXÿ[ÿYÿ]ÿ[ÿRÿQÿVÿSÿIÿGÿKÿOÿSÿOÿKÿHÿMÿRÿOÿLÿGÿEÿFÿHÿKÿMÿNÿPÿVÿZÿ\ÿ]ÿXÿWÿ[ÿ]ÿ]ÿZÿXÿ`ÿdÿbÿdÿgÿjÿmÿnÿnÿnÿmÿmÿjÿhÿkÿmÿoÿpÿqÿuÿxÿyÿ{ÿ}ÿ|ÿwÿsÿrÿtÿzÿÿÿ‚ÿƒÿ‡ÿ‹ÿ“ÿ—ÿ—ÿÿŸÿ¤ÿ¥ÿ¤ÿ®ÿµÿ½ÿÊÿÑÿÔÿØÿÚÿßÿãÿâÿãÿåÿçÿéÿíÿñÿôÿ÷ÿúÿ   !!!%*-.).5651013774.56651/*)'$ ÿÿûÿõÿîÿéÿäÿßÿÝÿÛÿ×ÿÔÿÔÿÑÿÉÿÂÿ»ÿºÿ¹ÿ³ÿ®ÿ¨ÿ¨ÿ©ÿ©ÿ¨ÿ¥ÿ¦ÿ«ÿªÿ§ÿ¨ÿ¦ÿ¦ÿ¡ÿœÿšÿ—ÿ™ÿ ÿÿšÿ›ÿ˜ÿ—ÿ–ÿ–ÿ–ÿ•ÿ‘ÿ‰ÿŠÿŽÿ‹ÿÿ“ÿ•ÿ“ÿ“ÿ—ÿ˜ÿ•ÿÿŒÿŽÿÿ‰ÿ†ÿ…ÿ‚ÿ…ÿŠÿˆÿ‡ÿ„ÿÿ{ÿwÿwÿuÿtÿwÿ~ÿÿ~ÿ|ÿzÿwÿpÿiÿfÿgÿmÿoÿiÿfÿiÿkÿmÿoÿmÿjÿiÿiÿbÿ]ÿ\ÿXÿQÿIÿGÿLÿNÿNÿLÿLÿPÿVÿVÿTÿRÿTÿUÿQÿOÿMÿKÿHÿHÿIÿKÿNÿPÿOÿRÿNÿHÿGÿIÿFÿDÿ@ÿ4ÿ0ÿ1ÿ1ÿ/ÿ*ÿ!ÿÿÿÿÿÿ ÿÿÿ ÿÿÿ ÿÿÿÿÿüþøþ÷þûþûþúþúþøþúþ÷þõþñþöþùþøþôþõþúþüþøþúþûþýþùþøþõþõþñþñþðþìþëþêþîþìþðþîþìþåþêþêþîþïþñþòþëþêþôþýþùþúþóþîþèþòþ÷þ÷þòþñþôþüþÿþÿÿÿ ÿÿÿ!ÿ"ÿ#ÿ*ÿ-ÿ*ÿ(ÿ!ÿ ÿ%ÿ#ÿ ÿ!ÿ!ÿ"ÿ$ÿ"ÿ$ÿ%ÿ#ÿ%ÿ"ÿ'ÿ+ÿ)ÿ(ÿ)ÿ/ÿ4ÿ3ÿ2ÿ3ÿ7ÿ8ÿ5ÿ7ÿ7ÿ6ÿ6ÿ8ÿ;ÿ<ÿ>ÿCÿ@ÿBÿEÿEÿGÿJÿJÿDÿ@ÿ?ÿ@ÿ@ÿ?ÿ@ÿ@ÿDÿDÿEÿCÿ?ÿ=ÿ:ÿ9ÿ7ÿ7ÿ6ÿ6ÿ4ÿ5ÿ;ÿ<ÿAÿDÿBÿ@ÿDÿEÿ@ÿAÿ=ÿ:ÿ9ÿ:ÿ<ÿ:ÿ8ÿ;ÿ>ÿ<ÿ;ÿ6ÿ3ÿ/ÿ,ÿ+ÿ)ÿ(ÿ"ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ!ÿ!ÿÿÿÿ!ÿÿÿÿ"ÿ)ÿ.ÿ2ÿ5ÿ7ÿ6ÿ4ÿ6ÿ6ÿ6ÿ9ÿ:ÿ>ÿ=ÿ>ÿCÿFÿLÿOÿQÿUÿ[ÿ]ÿdÿjÿkÿsÿ{ÿ€ÿ†ÿÿ’ÿ“ÿ—ÿœÿ¡ÿ§ÿ«ÿ«ÿ¯ÿ¶ÿÀÿÈÿÎÿÕÿÛÿâÿæÿëÿñÿ÷ÿþÿÿÿ#)&(+.4;DIHFJIG>9<>?;<FA=82,&')(! ýÿúÿõÿïÿíÿìÿéÿæÿáÿÛÿÔÿÍÿÊÿÁÿ·ÿ¬ÿ¦ÿ¡ÿÿ—ÿ”ÿÿˆÿ‡ÿ†ÿÿÿ}ÿ|ÿzÿxÿxÿuÿzÿ~ÿ}ÿ}ÿzÿ{ÿÿ€ÿ|ÿxÿtÿwÿ|ÿÿ„ÿ|ÿzÿ~ÿÿÿƒÿ‡ÿ‰ÿ‰ÿˆÿŠÿ‰ÿ‰ÿ‰ÿÿ“ÿ•ÿšÿ¡ÿ¦ÿ§ÿªÿ­ÿ«ÿªÿ¯ÿ·ÿ´ÿ±ÿ¯ÿ´ÿ¼ÿ¾ÿ»ÿ¾ÿÇÿËÿÏÿÓÿÔÿÒÿÕÿÕÿ×ÿÚÿÜÿÛÿØÿ×ÿÛÿãÿèÿæÿÜÿÛÿÛÿØÿÙÿßÿáÿáÿâÿàÿÞÿßÿåÿèÿäÿßÿàÿáÿãÿåÿâÿãÿåÿàÿÝÿÚÿØÿ×ÿ×ÿ×ÿÏÿÈÿÅÿÄÿÁÿÄÿÁÿ¹ÿ·ÿ¸ÿ»ÿºÿ·ÿµÿµÿ´ÿ²ÿ®ÿªÿ¤ÿ ÿ™ÿ”ÿ–ÿ–ÿ’ÿÿ‡ÿÿ}ÿzÿ|ÿ}ÿzÿwÿxÿ{ÿ{ÿ{ÿxÿrÿhÿdÿfÿbÿ]ÿUÿOÿMÿEÿ?ÿ<ÿ<ÿ:ÿ8ÿ6ÿ6ÿ4ÿ/ÿ*ÿ#ÿ ÿÿÿÿÿ ÿÿÿÿÿÿ ÿÿÿ ÿÿ ÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ!ÿ)ÿ*ÿ/ÿ6ÿ>ÿAÿAÿEÿHÿLÿOÿSÿRÿVÿ\ÿbÿdÿiÿmÿpÿtÿwÿzÿ|ÿÿ…ÿŠÿŒÿÿŽÿ‘ÿ”ÿ›ÿœÿ”ÿ”ÿ—ÿ™ÿœÿ£ÿ«ÿ­ÿ¬ÿ¯ÿ°ÿ°ÿ­ÿ©ÿ¢ÿžÿ¡ÿžÿœÿÿ ÿ§ÿ©ÿ©ÿ«ÿ®ÿ²ÿ¶ÿºÿ½ÿÁÿÄÿÈÿÆÿÈÿÊÿÎÿÐÿÏÿÏÿÓÿÖÿÕÿ×ÿÓÿÒÿÖÿÕÿÒÿÑÿÑÿÑÿÓÿÕÿÖÿÔÿÏÿÑÿÕÿÕÿÔÿÏÿÏÿÏÿÏÿÌÿÐÿÙÿØÿÛÿÜÿÞÿàÿåÿíÿíÿïÿïÿíÿòÿóÿõÿôÿ÷ÿúÿüÿýÿøÿùÿÿÿýÿôÿôÿ÷ÿ÷ÿöÿõÿùÿûÿùÿûÿþÿ   ÿÿþÿûÿøÿ÷ÿöÿ÷ÿýÿùÿöÿðÿîÿíÿêÿèÿèÿéÿêÿêÿêÿêÿãÿÚÿÑÿËÿÈÿÄÿ¾ÿ¸ÿ·ÿ°ÿ©ÿ§ÿ¨ÿ¦ÿ£ÿ ÿ›ÿ˜ÿ•ÿÿ‰ÿƒÿ€ÿ}ÿuÿmÿgÿ`ÿ]ÿ]ÿRÿGÿBÿ@ÿ;ÿ3ÿ*ÿ#ÿÿÿÿÿ ÿÿÿþõþèþàþàþÔþÌþÁþ·þµþ±þ¬þ¦þ£þ¤þ£þ þšþ–þšþ›þ›þ—þ™þ þ¢þ¡þžþ¡þ þ¡þ¢þœþ™þ›þ•þ•þ™þ—þ—þœþ£þ¨þ®þ³þ²þ¹þ¿þÀþÅþÇþÏþÖþØþÞþÞþáþäþéþïþòþöþüþÿÿÿ ÿ ÿ ÿÿÿÿÿÿ"ÿ*ÿ1ÿ9ÿ;ÿ=ÿ?ÿAÿEÿKÿPÿRÿSÿXÿ_ÿaÿdÿeÿgÿiÿmÿqÿqÿrÿuÿ~ÿ|ÿxÿ|ÿ|ÿ}ÿ~ÿ}ÿƒÿˆÿ†ÿˆÿ†ÿ„ÿ…ÿŒÿ’ÿ–ÿœÿ¢ÿ¦ÿ¥ÿ«ÿ¯ÿ±ÿºÿÀÿÃÿÆÿÈÿÍÿÒÿÔÿÜÿåÿéÿéÿëÿëÿìÿñÿòÿóÿõÿøÿýÿ   üÿøÿ÷ÿ÷ÿõÿîÿåÿáÿÜÿÖÿÐÿÍÿÌÿÉÿÉÿÉÿÀÿ½ÿ»ÿ¶ÿ¶ÿ´ÿ¯ÿªÿ­ÿ®ÿ¦ÿ¡ÿžÿ›ÿ•ÿÿÿŒÿ†ÿ}ÿvÿmÿkÿhÿ`ÿ]ÿ]ÿ_ÿ_ÿaÿ_ÿ]ÿ[ÿYÿ]ÿ^ÿ]ÿ]ÿZÿXÿVÿUÿ[ÿYÿSÿRÿPÿOÿPÿMÿNÿMÿMÿRÿSÿ\ÿ`ÿ[ÿWÿWÿ\ÿ_ÿ^ÿ^ÿ]ÿ[ÿYÿ]ÿ_ÿ]ÿaÿfÿlÿnÿkÿrÿxÿzÿ~ÿÿƒÿ‚ÿƒÿ…ÿ„ÿ…ÿ‹ÿÿÿÿ’ÿ•ÿ˜ÿšÿ•ÿ‘ÿÿ‘ÿ“ÿ–ÿšÿšÿ™ÿ”ÿŽÿŒÿÿ“ÿ˜ÿšÿœÿŸÿ¨ÿªÿ¬ÿ­ÿ¬ÿ¯ÿ±ÿ¯ÿ®ÿ®ÿ«ÿ§ÿ ÿ›ÿ—ÿ•ÿ›ÿÿ™ÿ–ÿ–ÿ•ÿ”ÿ‘ÿ‰ÿ†ÿ‡ÿ‹ÿ‹ÿŠÿ‡ÿ„ÿ€ÿÿÿ{ÿxÿwÿvÿwÿyÿwÿuÿuÿsÿoÿjÿmÿoÿnÿkÿlÿuÿuÿvÿyÿ{ÿ{ÿzÿwÿvÿtÿvÿvÿpÿqÿrÿtÿrÿpÿsÿwÿtÿoÿpÿrÿqÿoÿoÿpÿsÿuÿzÿ}ÿ}ÿ‚ÿ‡ÿŠÿŽÿÿŠÿŽÿ‘ÿ’ÿ—ÿ˜ÿšÿšÿœÿšÿ—ÿ—ÿœÿ ÿ¢ÿ ÿÿžÿœÿšÿÿžÿ ÿ›ÿ“ÿ’ÿ“ÿ‘ÿÿŒÿÿŽÿÿÿÿŽÿÿ”ÿ’ÿÿŽÿŽÿŽÿÿÿÿ‰ÿ‡ÿ‹ÿŒÿŠÿ†ÿ€ÿ}ÿ~ÿ~ÿ}ÿyÿwÿxÿzÿzÿqÿlÿjÿjÿhÿeÿeÿcÿdÿfÿdÿdÿdÿ_ÿ\ÿXÿTÿMÿLÿKÿMÿJÿNÿOÿRÿ^ÿZÿOÿGÿEÿAÿ=ÿ=ÿ>ÿAÿ?ÿ>ÿBÿEÿJÿJÿFÿHÿDÿ?ÿ=ÿ<ÿ<ÿ=ÿ<ÿ<ÿ=ÿ=ÿ>ÿ>ÿ=ÿ<ÿ=ÿ:ÿ>ÿAÿEÿIÿHÿMÿLÿMÿNÿMÿQÿWÿXÿZÿ_ÿgÿhÿeÿgÿrÿtÿrÿrÿuÿyÿxÿ{ÿzÿ}ÿÿƒÿ€ÿ}ÿ€ÿ†ÿŒÿ‰ÿ†ÿˆÿ‰ÿˆÿ‰ÿŠÿ‹ÿ‰ÿ‰ÿˆÿ‡ÿ…ÿ‚ÿ‚ÿŠÿÿ“ÿ”ÿ“ÿ“ÿ“ÿ‘ÿŒÿ‡ÿ„ÿ„ÿ„ÿ„ÿ‚ÿÿ{ÿ}ÿ}ÿzÿwÿ|ÿ}ÿzÿuÿpÿrÿsÿtÿtÿsÿrÿsÿtÿsÿqÿnÿlÿiÿaÿ`ÿdÿdÿcÿ^ÿ[ÿ`ÿ`ÿfÿjÿeÿbÿ]ÿ_ÿhÿiÿkÿpÿnÿpÿuÿ}ÿ~ÿ~ÿ‚ÿ…ÿ€ÿ€ÿ‡ÿŠÿ‹ÿÿÿÿÿÿ”ÿ—ÿ•ÿ“ÿ•ÿ–ÿ”ÿ’ÿ“ÿ•ÿ•ÿ—ÿ›ÿ™ÿ›ÿÿ™ÿ˜ÿ›ÿšÿ—ÿ“ÿ—ÿÿ›ÿ–ÿ˜ÿŸÿ£ÿ£ÿ¥ÿªÿ°ÿ±ÿ°ÿ¨ÿ¥ÿ«ÿ©ÿ§ÿ§ÿ§ÿ¥ÿ£ÿ¡ÿšÿ—ÿ˜ÿœÿ›ÿœÿÿ ÿ ÿœÿŸÿ¥ÿ¡ÿÿŸÿÿ™ÿ›ÿœÿÿÿÿ˜ÿ—ÿ”ÿ“ÿ”ÿ”ÿ—ÿÿÿŒÿ‹ÿÿÿŒÿ‹ÿ‹ÿ„ÿ„ÿŠÿ‹ÿ‹ÿ‹ÿ’ÿ–ÿ”ÿ™ÿÿšÿ˜ÿ–ÿ˜ÿ˜ÿ”ÿ‘ÿ“ÿ’ÿ’ÿÿŒÿÿÿÿÿŒÿÿÿÿŽÿˆÿ„ÿ†ÿ‚ÿ~ÿÿÿzÿ{ÿ|ÿzÿ}ÿ~ÿÿ€ÿzÿyÿzÿ{ÿzÿ|ÿ~ÿzÿxÿ{ÿÿ{ÿyÿyÿvÿsÿuÿvÿsÿqÿqÿjÿ^ÿZÿZÿ]ÿ[ÿWÿYÿ]ÿ`ÿ]ÿ[ÿYÿXÿTÿPÿQÿPÿTÿUÿRÿNÿLÿKÿKÿJÿDÿEÿEÿ?ÿ>ÿ:ÿ8ÿ6ÿ4ÿ6ÿ6ÿ5ÿ6ÿ;ÿ>ÿ=ÿ;ÿ7ÿ5ÿ3ÿ2ÿ2ÿ3ÿ/ÿ/ÿ.ÿ/ÿ3ÿ1ÿ/ÿ,ÿ.ÿ3ÿ6ÿ5ÿ1ÿ+ÿ)ÿ-ÿ0ÿ*ÿ,ÿ0ÿ0ÿ3ÿ2ÿ5ÿ4ÿ3ÿ6ÿ8ÿ9ÿ6ÿ7ÿ7ÿ<ÿ>ÿ>ÿAÿDÿFÿHÿGÿEÿIÿLÿMÿQÿWÿZÿ_ÿbÿgÿhÿhÿhÿjÿmÿnÿrÿrÿpÿqÿuÿwÿwÿvÿ{ÿ{ÿ€ÿ†ÿ‡ÿ„ÿ‡ÿŠÿÿÿÿÿÿ˜ÿžÿ ÿ¤ÿ¨ÿ¨ÿ­ÿ­ÿ¬ÿ®ÿ°ÿ²ÿ¹ÿ»ÿ»ÿ¾ÿÄÿÆÿÆÿÊÿÊÿÌÿÉÿÇÿÇÿÇÿÊÿÏÿÐÿÕÿàÿÛÿÛÿáÿßÿÚÿ×ÿ×ÿÙÿÙÿÖÿÙÿÝÿãÿèÿéÿêÿëÿìÿíÿîÿïÿíÿíÿíÿíÿîÿìÿêÿêÿìÿðÿóÿôÿûÿþÿüÿûÿûÿûÿûÿ÷ÿõÿøÿ÷ÿóÿîÿëÿèÿãÿÝÿØÿÔÿÎÿÌÿÅÿÂÿÄÿÂÿÄÿÀÿ·ÿ±ÿ¯ÿ²ÿ²ÿªÿ ÿ˜ÿ“ÿ‹ÿ‚ÿ{ÿvÿoÿhÿ^ÿYÿVÿTÿOÿGÿ@ÿ:ÿ;ÿ=ÿ<ÿ6ÿ5ÿ:ÿ:ÿ7ÿ7ÿ-ÿ(ÿ%ÿ"ÿÿÿÿÿ ÿÿÿþþþøþ÷þøþøþòþêþçþæþëþêþêþåþëþïþôþõþðþéþäþèþäþäþàþÞþÚþÙþÛþ×þÛþÚþãþäþçþçþãþáþâþéþåþëþñþõþøþÿÿÿ ÿ ÿÿÿÿÿÿÿÿÿÿ)ÿ(ÿ*ÿ.ÿ2ÿ4ÿ0ÿ.ÿ1ÿ7ÿ8ÿ9ÿ:ÿ9ÿ?ÿCÿAÿAÿ@ÿDÿKÿJÿHÿBÿFÿNÿVÿ^ÿaÿeÿmÿsÿvÿ{ÿÿƒÿ€ÿ„ÿ‰ÿ‘ÿ”ÿšÿÿ¢ÿ¨ÿªÿ«ÿ­ÿ­ÿ¬ÿ±ÿ°ÿ°ÿ³ÿ¶ÿ¹ÿ¼ÿÂÿÉÿËÿÎÿÔÿÚÿÜÿÛÿ×ÿØÿÖÿÔÿÔÿ×ÿàÿàÿßÿÝÿÜÿÝÿØÿÖÿÕÿÒÿËÿÄÿÆÿÇÿÇÿÆÿÆÿÊÿÍÿÎÿÍÿÍÿÌÿËÿÈÿÄÿÀÿ¹ÿ¶ÿ»ÿ¼ÿ»ÿ½ÿ½ÿ¾ÿ½ÿ¸ÿ²ÿ²ÿµÿ´ÿ·ÿ¹ÿµÿ²ÿµÿ´ÿ²ÿ±ÿ±ÿªÿ¡ÿžÿ˜ÿ—ÿ‘ÿˆÿ…ÿ„ÿ…ÿ†ÿ„ÿ„ÿ‡ÿ…ÿ‚ÿ}ÿyÿwÿvÿvÿuÿwÿxÿvÿvÿyÿzÿyÿzÿzÿ|ÿƒÿ‰ÿŠÿ‰ÿ‰ÿ’ÿ—ÿšÿ ÿ¡ÿ£ÿ§ÿ¬ÿ­ÿ¬ÿ°ÿµÿ³ÿ°ÿ­ÿ®ÿ­ÿ«ÿ¬ÿ©ÿ©ÿªÿªÿªÿ¨ÿ§ÿªÿ«ÿ¬ÿ¬ÿ«ÿ¬ÿ¯ÿ°ÿ±ÿ²ÿ´ÿ¸ÿ´ÿµÿ³ÿ²ÿ±ÿ¯ÿ®ÿªÿ§ÿ¡ÿ¥ÿªÿ¦ÿÿšÿÿšÿ•ÿ‘ÿŒÿ„ÿ„ÿˆÿˆÿ‡ÿ†ÿ‡ÿ‡ÿˆÿ…ÿ†ÿƒÿÿƒÿ„ÿÿ|ÿ{ÿ{ÿ‚ÿ…ÿŠÿ‹ÿŽÿ“ÿ–ÿ–ÿ‘ÿÿŽÿ‘ÿ‘ÿ’ÿ–ÿ›ÿÿÿžÿŸÿŸÿ›ÿ–ÿ–ÿŽÿƒÿÿÿ}ÿ|ÿzÿ|ÿ~ÿ|ÿ}ÿ}ÿ~ÿ‚ÿ‚ÿ‚ÿÿ€ÿ|ÿ|ÿ|ÿzÿyÿyÿ|ÿ{ÿwÿvÿuÿuÿrÿmÿlÿlÿiÿjÿnÿsÿxÿ{ÿ~ÿ|ÿxÿxÿyÿyÿÿuÿpÿnÿkÿjÿhÿkÿfÿ]ÿUÿSÿYÿ[ÿVÿQÿRÿWÿXÿYÿ]ÿ]ÿYÿZÿ^ÿ^ÿYÿTÿPÿOÿOÿLÿLÿLÿJÿKÿPÿXÿ[ÿZÿ]ÿ`ÿbÿaÿcÿjÿoÿtÿxÿÿ†ÿŠÿŒÿŠÿÿÿ–ÿ–ÿ’ÿ”ÿ›ÿ¡ÿ¡ÿ¡ÿ£ÿªÿ­ÿ±ÿ·ÿ»ÿ¾ÿÂÿÃÿÇÿÊÿÊÿÌÿÍÿÏÿÖÿÝÿÝÿÝÿÞÿáÿæÿèÿåÿàÿàÿãÿçÿèÿåÿäÿåÿèÿãÿÝÿÞÿáÿÞÿÛÿÜÿØÿ×ÿÚÿÛÿÜÿÛÿ×ÿÒÿÏÿÎÿÎÿÌÿÊÿÌÿÏÿÏÿÉÿÈÿÅÿÂÿ¿ÿ¼ÿ»ÿ·ÿ³ÿ®ÿ¬ÿ¦ÿ¡ÿ›ÿ—ÿ•ÿ’ÿ“ÿÿŠÿ‡ÿˆÿ‹ÿ‡ÿÿ~ÿ€ÿÿwÿnÿrÿwÿxÿqÿiÿgÿjÿpÿrÿnÿiÿjÿdÿ]ÿZÿ\ÿXÿYÿYÿTÿTÿSÿRÿUÿTÿQÿQÿLÿFÿEÿGÿNÿQÿKÿKÿMÿMÿJÿDÿ>ÿ7ÿ2ÿ/ÿ.ÿ.ÿ/ÿ-ÿ/ÿ0ÿ3ÿ3ÿ.ÿ,ÿ%ÿ"ÿ"ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ'ÿ*ÿ*ÿ*ÿ.ÿ1ÿ2ÿ,ÿ2ÿ=ÿ7ÿ0ÿ(ÿ"ÿ!ÿ#ÿ$ÿ%ÿ%ÿ!ÿÿÿÿ#ÿ$ÿÿ!ÿ(ÿ.ÿ.ÿ.ÿ3ÿ7ÿ?ÿEÿEÿFÿMÿTÿRÿMÿLÿLÿNÿPÿSÿZÿYÿWÿ]ÿeÿhÿhÿiÿiÿjÿlÿnÿvÿwÿyÿ|ÿ{ÿyÿ}ÿ„ÿ‡ÿÿÿ†ÿ‹ÿ’ÿ˜ÿžÿ˜ÿšÿ¡ÿ§ÿ¯ÿ¯ÿ°ÿ¯ÿ­ÿªÿ¨ÿ¥ÿ ÿœÿÿ£ÿ©ÿ«ÿ©ÿ«ÿ¬ÿ¬ÿ¦ÿ£ÿ¤ÿ¡ÿœÿ—ÿ”ÿ—ÿšÿœÿ ÿÿžÿ£ÿ£ÿ¡ÿ ÿžÿ›ÿÿ¢ÿ¢ÿ¨ÿ¯ÿ­ÿ¬ÿ©ÿ¨ÿ§ÿ§ÿ¤ÿ¢ÿ¦ÿ¦ÿ¢ÿ£ÿ¥ÿ¤ÿ¢ÿŸÿ ÿŸÿžÿ ÿŸÿÿ“ÿ‡ÿ…ÿˆÿ…ÿ‚ÿÿ€ÿÿÿyÿtÿwÿxÿxÿuÿoÿnÿoÿoÿoÿlÿmÿqÿsÿvÿtÿtÿpÿqÿqÿjÿfÿdÿeÿ^ÿ^ÿeÿhÿfÿcÿcÿ_ÿ\ÿUÿQÿJÿKÿMÿLÿKÿMÿPÿPÿQÿQÿVÿWÿQÿPÿTÿTÿVÿ[ÿZÿVÿ\ÿaÿ_ÿ`ÿcÿgÿgÿgÿlÿiÿdÿaÿcÿgÿgÿeÿgÿeÿeÿbÿdÿhÿeÿaÿ^ÿ]ÿaÿgÿkÿiÿjÿqÿuÿwÿÿŒÿ†ÿ€ÿ{ÿvÿvÿyÿ|ÿ|ÿ}ÿ|ÿÿ…ÿ„ÿ†ÿ‰ÿˆÿ‰ÿŒÿÿ‹ÿ‰ÿŒÿŒÿÿ‘ÿ‘ÿ—ÿ—ÿ™ÿ›ÿœÿœÿœÿŸÿ¤ÿªÿªÿ«ÿ¬ÿ­ÿ°ÿ³ÿ³ÿ´ÿ¹ÿ»ÿºÿ¹ÿ»ÿ½ÿÁÿÇÿÏÿ×ÿÙÿÛÿàÿâÿåÿæÿåÿçÿæÿæÿéÿëÿëÿéÿëÿìÿíÿìÿíÿîÿéÿäÿâÿáÿÝÿÝÿßÿßÿÞÿÜÿÚÿÛÿ×ÿÔÿÓÿÍÿÈÿÂÿ¿ÿ½ÿ¸ÿ»ÿ¾ÿ¼ÿ·ÿ¹ÿÀÿÂÿÃÿÁÿ¾ÿ¼ÿ¾ÿºÿ¶ÿ¹ÿ¼ÿ¼ÿ¹ÿ¶ÿµÿ¶ÿ¶ÿ¯ÿªÿ©ÿ¤ÿ¤ÿ¦ÿ«ÿ«ÿ¨ÿ¦ÿ§ÿ¨ÿ¦ÿ ÿ•ÿŽÿ‹ÿŠÿ‡ÿ…ÿ€ÿyÿwÿyÿyÿvÿyÿyÿyÿwÿvÿuÿuÿtÿsÿtÿrÿpÿmÿqÿrÿsÿvÿyÿwÿuÿtÿtÿtÿlÿgÿfÿeÿ_ÿZÿYÿYÿWÿUÿSÿSÿRÿRÿSÿUÿWÿ[ÿ\ÿ\ÿaÿdÿdÿbÿ_ÿZÿXÿUÿSÿQÿMÿLÿLÿMÿLÿMÿLÿMÿMÿLÿLÿIÿCÿAÿ@ÿ;ÿ:ÿ9ÿ8ÿ7ÿ5ÿ7ÿ:ÿ9ÿ<ÿAÿDÿEÿAÿ=ÿ?ÿAÿAÿ;ÿ5ÿ0ÿ;ÿIÿFÿEÿEÿCÿCÿ?ÿ=ÿ;ÿ5ÿ1ÿ/ÿ-ÿ*ÿ+ÿ/ÿ0ÿ*ÿ#ÿ$ÿ'ÿ'ÿ'ÿ*ÿ*ÿ.ÿ2ÿ4ÿ8ÿ;ÿ?ÿ=ÿ8ÿ5ÿ0ÿ3ÿ3ÿ.ÿ,ÿ/ÿ6ÿ<ÿ=ÿ>ÿAÿEÿHÿGÿKÿMÿNÿOÿRÿUÿVÿZÿ\ÿ`ÿ_ÿ^ÿbÿkÿkÿkÿpÿpÿqÿlÿjÿkÿpÿqÿoÿnÿjÿlÿkÿmÿoÿnÿqÿrÿqÿoÿsÿrÿqÿpÿsÿsÿuÿwÿtÿsÿsÿuÿuÿwÿxÿyÿ{ÿ€ÿˆÿŒÿÿÿ•ÿœÿ¢ÿ¨ÿ®ÿªÿ¨ÿ®ÿ²ÿµÿ¶ÿ»ÿÀÿÄÿÈÿÇÿÇÿÈÿËÿËÿÌÿËÿÇÿÉÿËÿÎÿÏÿÏÿÑÿÑÿÑÿÐÿÐÿÐÿÑÿÏÿÎÿÍÿÎÿÍÿÌÿËÿÍÿÒÿÔÿÖÿÙÿØÿÓÿÕÿÙÿÚÿ×ÿÕÿÔÿÕÿ×ÿÔÿÏÿÌÿÉÿÈÿÅÿÁÿ¼ÿ·ÿ¶ÿ´ÿ³ÿ³ÿµÿµÿ·ÿ´ÿ¯ÿ¬ÿ©ÿ¦ÿŸÿÿ™ÿ›ÿ¡ÿ¤ÿ£ÿ¢ÿœÿ—ÿ–ÿ–ÿ•ÿ‘ÿŽÿ‹ÿ‡ÿƒÿÿ~ÿ|ÿxÿxÿyÿ{ÿzÿxÿvÿuÿsÿqÿpÿsÿuÿsÿuÿsÿuÿtÿtÿuÿxÿwÿrÿpÿuÿxÿyÿxÿ}ÿ…ÿ‚ÿƒÿÿ|ÿzÿwÿuÿtÿqÿdÿ`ÿaÿZÿUÿSÿVÿVÿMÿMÿVÿSÿOÿOÿLÿEÿEÿGÿGÿAÿ<ÿ=ÿ;ÿ:ÿ7ÿ4ÿ0ÿ.ÿ)ÿ%ÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ ÿ ÿ ÿ ÿ ÿÿÿ ÿ ÿ ÿÿÿÿÿÿÿúþùþýþÿÿ ÿÿ ÿÿ ÿÿÿÿÿÿ!ÿ!ÿ%ÿ*ÿ(ÿ$ÿ%ÿ+ÿ4ÿ7ÿ9ÿ=ÿ=ÿ9ÿ:ÿDÿGÿKÿNÿPÿRÿZÿdÿhÿkÿpÿvÿzÿ~ÿÿ‰ÿ‹ÿŠÿŒÿŽÿÿ›ÿ¤ÿ©ÿ­ÿ¯ÿ¶ÿ¾ÿÄÿÆÿÆÿÈÿÌÿÐÿØÿàÿãÿâÿäÿæÿéÿêÿéÿêÿëÿëÿêÿëÿîÿîÿðÿñÿïÿñÿòÿóÿñÿíÿíÿëÿéÿìÿíÿíÿëÿëÿèÿéÿòÿöÿóÿíÿéÿçÿæÿáÿÛÿÚÿÖÿÓÿÑÿÎÿÎÿÐÿÎÿÌÿÌÿÌÿÉÿÆÿÄÿÂÿ»ÿ²ÿ¯ÿ®ÿ¯ÿ©ÿ£ÿ ÿ™ÿ’ÿŒÿ‰ÿ„ÿƒÿÿ~ÿÿ†ÿ…ÿ†ÿ…ÿÿ€ÿÿƒÿŠÿ‹ÿÿzÿyÿ|ÿ€ÿÿ}ÿ}ÿ€ÿƒÿ„ÿÿ}ÿ{ÿvÿ|ÿ‚ÿ€ÿÿ|ÿ~ÿÿ}ÿ}ÿÿ‚ÿ}ÿzÿuÿpÿqÿtÿsÿoÿjÿjÿhÿhÿgÿfÿfÿiÿjÿiÿhÿhÿjÿmÿlÿjÿlÿjÿlÿjÿkÿjÿ`ÿ[ÿZÿYÿ[ÿYÿSÿRÿUÿ\ÿiaxmodem-1.2.0/lib/spandsp/test-data/local/Makefile.in0000644000175000017500000003564211150047457022134 0ustar julienjulien# Makefile.in generated by automake 1.9.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = ../.. am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd INSTALL = @INSTALL@ install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = test-data/local DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/config/ax_compiler_vendor.m4 \ $(top_srcdir)/config/ax_check_real_file.m4 \ $(top_srcdir)/config/ax_fixed_point_machine.m4 \ $(top_srcdir)/config/ax_misaligned_access_fails.m4 \ $(top_srcdir)/config/ax_c99_features.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/src/config.h CONFIG_CLEAN_FILES = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-exec-recursive install-info-recursive \ install-recursive installcheck-recursive installdirs-recursive \ pdf-recursive ps-recursive uninstall-info-recursive \ uninstall-recursive ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMDEP_FALSE = @AMDEP_FALSE@ AMDEP_TRUE = @AMDEP_TRUE@ AMTAR = @AMTAR@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CC_FOR_BUILD = @CC_FOR_BUILD@ CFLAGS = @CFLAGS@ COMP_VENDOR_CFLAGS = @COMP_VENDOR_CFLAGS@ COMP_VENDOR_LDFLAGS = @COMP_VENDOR_LDFLAGS@ COND_DOC_FALSE = @COND_DOC_FALSE@ COND_DOC_TRUE = @COND_DOC_TRUE@ COND_MMX_FALSE = @COND_MMX_FALSE@ COND_MMX_TRUE = @COND_MMX_TRUE@ COND_SSE_FALSE = @COND_SSE_FALSE@ COND_SSE_TRUE = @COND_SSE_TRUE@ COND_TESTDATA_FALSE = @COND_TESTDATA_FALSE@ COND_TESTDATA_TRUE = @COND_TESTDATA_TRUE@ COND_TESTS_FALSE = @COND_TESTS_FALSE@ COND_TESTS_TRUE = @COND_TESTS_TRUE@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CPPFLAGS_FOR_BUILD = @CPPFLAGS_FOR_BUILD@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DSYMUTIL = @DSYMUTIL@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ GREP = @GREP@ INSERT_INTTYPES_HEADER = @INSERT_INTTYPES_HEADER@ INSERT_MATH_HEADER = @INSERT_MATH_HEADER@ INSERT_STDINT_HEADER = @INSERT_STDINT_HEADER@ INSERT_TGMATH_HEADER = @INSERT_TGMATH_HEADER@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ NMEDIT = @NMEDIT@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SPANDSP_LT_AGE = @SPANDSP_LT_AGE@ SPANDSP_LT_CURRENT = @SPANDSP_LT_CURRENT@ SPANDSP_LT_REVISION = @SPANDSP_LT_REVISION@ SPANDSP_MISALIGNED_ACCESS_FAILS = @SPANDSP_MISALIGNED_ACCESS_FAILS@ SPANDSP_USE_FIXED_POINT = @SPANDSP_USE_FIXED_POINT@ STRIP = @STRIP@ TESTLIBS = @TESTLIBS@ VERSION = @VERSION@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ SUBDIRS = DIST_SUBDIRS = EXTRA_DIST = dam9_lpc55.wav \ dam9.wav \ short_nb_voice.wav \ short_wb_voice.wav all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu test-data/local/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu test-data/local/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs distclean-libtool: -rm -f libtool uninstall-info-am: # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" mostlyclean-recursive clean-recursive distclean-recursive \ maintainer-clean-recursive: @failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ list='$(DISTFILES)'; for file in $$list; do \ case $$file in \ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ esac; \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ dir="/$$dir"; \ $(mkdir_p) "$(distdir)$$dir"; \ else \ dir=''; \ fi; \ if test -d $$d/$$file; then \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -d "$(distdir)/$$subdir" \ || $(mkdir_p) "$(distdir)/$$subdir" \ || exit 1; \ distdir=`$(am__cd) $(distdir) && pwd`; \ top_distdir=`$(am__cd) $(top_distdir) && pwd`; \ (cd $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$top_distdir" \ distdir="$$distdir/$$subdir" \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-libtool \ distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive info: info-recursive info-am: install-data-am: install-exec-am: install-info: install-info-recursive install-man: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-info-am uninstall-info: uninstall-info-recursive .PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am check check-am \ clean clean-generic clean-libtool clean-recursive ctags \ ctags-recursive distclean distclean-generic distclean-libtool \ distclean-recursive distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-exec install-exec-am install-info \ install-info-am install-man install-strip installcheck \ installcheck-am installdirs installdirs-am maintainer-clean \ maintainer-clean-generic maintainer-clean-recursive \ mostlyclean mostlyclean-generic mostlyclean-libtool \ mostlyclean-recursive pdf pdf-am ps ps-am tags tags-recursive \ uninstall uninstall-am uninstall-info-am all: clean: # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: iaxmodem-1.2.0/lib/spandsp/test-data/local/dam9_lpc55.wav0000644000175000017500000123744411150047204022443 0ustar julienjulienRIFF?WAVEfmt @€>dataø>õÿîÿ ûÿûÿ   ùÿúÿõÿèÿíÿÿÿ üÿóÿôÿôÿþÿøÿúÿôÿöÿùÿ üÿÿÿ÷ÿþÿ ÷ÿúÿôÿöÿôÿûÿûÿ öÿüÿñÿúÿÿÿýÿùÿ ýÿíÿôÿòÿóÿîÿèÿðÿïÿðÿðÿþÿ þÿöÿûÿÿÿüÿõÿ õÿõÿ  ùÿîÿæÿïÿòÿøÿïÿüÿüÿýÿûÿÿÿøÿýÿ þÿþÿñÿïÿîÿõÿòÿñÿ ùÿþÿòÿóÿùÿþÿôÿ üÿòÿüÿ÷ÿòÿûÿ÷ÿõÿîÿçÿñÿÿÿ øÿôÿ÷ÿúÿ þÿÿÿüÿ  öÿúÿøÿÿÿôÿúÿóÿéÿñÿ  öÿêÿåÿíÿôÿ ýÿ ÿÿüÿóÿþÿüÿ  ÿÿýÿ üÿûÿ  ùÿëÿñÿíÿýÿóÿøÿöÿøÿýÿ  ùÿìÿæÿðÿõÿòÿïÿüÿýÿ  úÿûÿ öÿæÿáÿèÿðÿíÿëÿÿÿ  ÿÿêÿíÿðÿûÿøÿöÿøÿùÿõÿùÿöÿûÿýÿ  ùÿüÿûÿüÿýÿñÿõÿôÿþÿ ûÿûÿñÿýÿùÿÿÿ ÷ÿøÿòÿïÿúÿ  ûÿÿÿýÿõÿúÿúÿíÿöÿÿÿöÿýÿóÿúÿùÿòÿøÿûÿùÿúÿÿÿúÿ üÿ öÿøÿüÿùÿêÿöÿ ùÿüÿðÿêÿõÿûÿ   öÿùÿöÿýÿùÿÿÿÿÿñÿñÿîÿ÷ÿ úÿýÿüÿÿÿûÿúÿþÿþÿóÿíÿñÿóÿôÿñÿ  ýÿ÷ÿîÿòÿéÿøÿ õÿóÿñÿüÿÿÿøÿúÿùÿùÿüÿôÿôÿôÿøÿûÿ÷ÿýÿ ýÿöÿùÿöÿìÿùÿûÿøÿõÿ öÿóÿôÿùÿúÿõÿòÿ ÿÿ ÿÿ ùÿøÿ üÿýÿüÿ ÿÿ ùÿÿÿüÿúÿçÿãÿïÿøÿ÷ÿöÿòÿüÿùÿûÿùÿùÿÿÿûÿûÿüÿûÿýÿ  þÿöÿôÿñÿûÿ ýÿúÿòÿýÿûÿùÿõÿ üÿ üÿûÿûÿúÿûÿóÿ þÿùÿóÿúÿ÷ÿ ÷ÿöÿøÿýÿùÿøÿ øÿ þÿùÿ ñÿøÿðÿ ùÿôÿöÿûÿÿÿ÷ÿ÷ÿúÿüÿûÿ÷ÿòÿôÿ  úÿÿÿòÿíÿïÿþÿøÿýÿúÿÿÿþÿþÿøÿõÿüÿöÿôÿõÿ  úÿðÿëÿîÿøÿðÿöÿùÿòÿïÿúÿûÿûÿöÿùÿûÿ÷ÿøÿ  ÿÿûÿöÿþÿ òÿïÿñÿñÿöÿýÿõÿêÿëÿýÿýÿüÿóÿðÿøÿ  ùÿôÿüÿûÿúÿ ÿÿüÿùÿÿÿûÿÿÿûÿüÿóÿýÿöÿüÿöÿùÿùÿ   óÿøÿíÿåÿýÿ ÿÿ ôÿùÿöÿÿÿ üÿùÿïÿ÷ÿ÷ÿøÿòÿúÿ÷ÿôÿõÿ"  úÿìÿçÿïÿ÷ÿõÿöÿôÿþÿûÿÿÿþÿôÿüÿóÿëÿïÿÿÿþÿÿÿüÿþÿ÷ÿúÿóÿöÿ÷ÿïÿøÿ  ðÿóÿñÿùÿúÿóÿùÿòÿïÿóÿôÿñÿûÿ   ùÿðÿúÿ   ùÿøÿëÿîÿüÿÿÿúÿ÷ÿûÿüÿüÿ÷ÿûÿ÷ÿûÿöÿôÿóÿ    öÿöÿòÿæÿíÿýÿ þÿ úÿóÿÿÿïÿíÿîÿëÿùÿ ôÿýÿõÿðÿùÿýÿþÿñÿôÿòÿþÿöÿ÷ÿõÿôÿõÿüÿ   üÿóÿúÿóÿ óÿôÿøÿóÿóÿôÿøÿòÿ ùÿýÿûÿöÿîÿùÿõÿ ýÿüÿùÿ  õÿëÿèÿñÿîÿóÿîÿúÿùÿøÿôÿ"òÿïÿòÿ÷ÿöÿ úÿìÿñÿîÿûÿõÿöÿõÿôÿøÿ ÿÿúÿòÿ ýÿôÿ÷ÿûÿ   ýÿúÿñÿýÿøÿýÿ úÿ ÿÿûÿôÿïÿùÿõÿýÿ úÿñÿüÿòÿ÷ÿ ÷ÿñÿïÿíÿèÿ÷ÿýÿüÿúÿýÿüÿ÷ÿýÿ    óÿìÿîÿðÿïÿùÿúÿøÿýÿöÿõÿöÿ üÿ üÿöÿ ÿÿýÿûÿûÿýÿòÿéÿòÿøÿüÿùÿ õÿîÿäÿíÿõÿôÿôÿöÿòÿ õÿøÿñÿüÿýÿ÷ÿúÿ ÿÿÿÿýÿÿÿöÿõÿóÿûÿõÿóÿ ýÿõÿþÿñÿìÿêÿçÿðÿþÿ ÿÿûÿóÿûÿýÿ   ñÿ õÿëÿõÿøÿðÿíÿöÿøÿ ÿÿõÿøÿôÿ ÷ÿýÿýÿùÿÿÿøÿðÿæÿæÿúÿ õÿóÿõÿïÿøÿóÿòÿ    ÷ÿûÿòÿéÿëÿûÿýÿþÿýÿÿÿñÿöÿ öÿùÿòÿÿÿûÿöÿìÿêÿþÿ÷ÿöÿüÿøÿûÿ öÿúÿ  õÿéÿòÿùÿøÿ÷ÿ øÿöÿ  ùÿïÿþÿþÿùÿôÿìÿúÿöÿúÿ÷ÿùÿõÿ þÿ ûÿýÿòÿéÿóÿüÿùÿûÿøÿÿÿöÿøÿöÿüÿÿÿûÿ   ÷ÿõÿéÿñÿÿÿÿÿûÿïÿöÿñÿìÿöÿúÿöÿÿÿúÿúÿ ýÿöÿõÿûÿöÿÿÿóÿ õÿÿÿøÿÿÿóÿðÿôÿ÷ÿúÿ   úÿéÿõÿóÿêÿðÿûÿöÿúÿ÷ÿúÿûÿûÿ øÿûÿõÿûÿþÿøÿ  õÿðÿúÿ ÿÿþÿñÿìÿìÿúÿüÿýÿôÿøÿþÿúÿ ýÿ úÿ ôÿìÿêÿ øÿüÿüÿÿÿÿÿüÿ÷ÿÿÿõÿûÿ÷ÿ $ ôÿñÿôÿ îÿïÿòÿïÿôÿþÿéÿçÿöÿ íÿöÿþÿþÿ ûÿÿÿèÿéÿþÿûÿíÿæÿ úÿöÿýÿ íÿõÿ ûÿâÿ÷ÿóÿ øÿìÿ òÿùÿïÿàÿôÿÿÿ >öÿëÿÝÿ óÿ÷ÿùÿëÿïÿòÿîÿØÿêÿ )ôÿÓÿàÿøÿçÿýÿ ûÿüÿ8#ûÿäÿØÿóÿôÿýÿÒÿöÿ#éÿåÿãÿþÿ=ìÿëÿÞÿþÿûÿ ùÿÖÿæÿúÿ ûÿïÿôÿâÿöÿ õÿöÿ éÿïÿ÷ÿ 8ðÿõÿÚÿ ÷ÿòÿ îÿãÿÿÿ3þÿ Þÿîÿ èÿÿÿõÿ ôÿ òÿúÿ÷ÿ (ðÿ çÿìÿìÿÿÿúÿùÿ,áÿáÿ,ñÿþÿÜÿåÿñÿùÿþÿýÿ öÿþÿ Ðÿäÿãÿ Ýÿ)òÿêÿ" èÿÖÿ øÿéÿåÿÊÿìÿ÷ÿöÿøÿöÿþÿæÿìÿ'íÿûÿöÿæÿäÿæÿýÿíÿûÿ ñÿêÿõÿéÿýÿÝÿÿÿüÿîÿðÿ#Ñÿýÿ5Þÿ¤ÿðÿ\MTgg @9ìÿûÿòÿËÿ§ÿÐÿÕÿ²ÿ«ÿØÿÅÿÉÿÇÿîÿÞÿÝÿëÿ ìÿøÿ öÿ ÿÿ   ÿÿøÿéÿöÿ÷ÿêÿ)ÜÿL­ÿëÿŒßÿÿÁÿ½áx?a$s9Ôÿâÿ¡ÿ6ÿÿ)ÿWÿ%ÿ,ÿ‡ÿ[ÿGÿ—ÿ¸ÿÕÿ¿ÿòÿíÿB3-,.9-?1 '/  óÿüÿüÿòÿÝÿíÿñÿþÿøÿ7èÿ*Ûÿ”ÿÝ8:þÿ°ÃPhþ=¶/tÿ þPþBþýý~ý§ýŸý þþÝþ ÿÿÏÿÿÿ2}oʹ¤ïßÌvvya#5Bþÿçÿ-øÿ ðÿéÿÝÿ ÞÿëÿöÿúÿúÿöÿH“ÿ½ÿ?ÿÃÙ‚ýPýiùiÍÅ Àfªöþ}û×ú¢úÎø.øùÖùéù¡û*ýþÑþN€ÛJÏÚ¯¶-Ï’]Σ*-Ùÿ­ÿ¡ÿÅÿ«ÿ·ÿÙÿÉÿ}ÿïÿöÿ´ÿÑÿôÿ"4MÿÿðÿL¿ÿÏÿd—ÿÅþª^¢üDûAÂ/· ‰ t ˜ÊNû öÂôóïmîñ—ñÕñ_öûcü!ÿ.·×…ö 6 n  Ø–*ZÿþFþnýüžüDýÈüšüøýÕþšþ8ÿU³[ú$ä Ù·K8rÞÿIÿúþÿ„ÿ›þ´ïûAù"´À —ïÐ £3úõô|ñ‡í}ìî…îûï_ôùü(+ æ  œ G œ ¡ ,áM9ÿþ+ýÒû»úØúêúÈúgûýÙýÕýØþ ½üñXDkóå{ºÿ!ÿfÿjÿéþÿþÿ ÿ×ý¨ 6úOöÛÌ ’\˜-ÌõLÿO÷‚ñØîrêüæ½æéªë3ï*õˆûAÿÅv å |&#Á þ % çÀ1ý9ú¹ùõø‘÷÷ùþùDúoü}ÿWÿH‰t¨jÄ`ßWÿ$ÿßÿ™þ¦ü†ýMþœýýÌÿ Tóÿ§ÿÖsútóÉÿ`è¾uÝyÖþœùyð¬æ×âCá!ß/â”êùðÚöÿã &¬0|oÉø G Uÿ<üMùÉø_øÕøÚù¢ûkýsþæÿׇÒq‹µÀ†ÿ×þ þjýƒý¹þÌþeþ¹þy‘OK“ÿ™ÿ^³¡ÿÂÿ3Fý®ø?úäïíúiœ!U#05ášùÄó«é1ÜzÖ=Û¢à´å×ð’ü8' ¥ÜEYHQ Sñ ¨û¼÷ùhûHû9ýÞÿi¦Ñ ·‚—ùÿ®ý¶þ“þ†ý¿üôýàþÔÿ¡)Dh@õÿJ#ÿ ÿìÿþ<>½þ~'§ü8iøçéüÁÏ(J+µ$TüaõAð`ÝoˀʇÖOâóñ€Û à 0 Ó×ÉR‰ûùnùÍöâõmûBÙã|!õŒÙØþ¶üÑü3ûbüøý,ýþÔ­,§£ÿÍþèÔAÿ†ýoþAþ‡ÿûÿ½þWÿŽÿd QtÌþP¸òúÌ8ýîØä!%46$M PþNöbݱÀ¹ÂJ׉ïq 2†%ì+½" à÷ŽòbóðÑì}ô¾÷ åa t"¨ýmô‹ókõ¶÷*þ¿@úõ ÿ=üÞûþ û¿øœýo©ÂŸ«›1¶ûêúýþÿ úQãùøã ! SérßÔ ß2¼=_8gB ºò½f¡É®èÆå±õ‰™8'B)Üò¬÷ËíXçÙßßäøÊ©/ê‚ û*êð~óòónú¢² • §*ú†õ@ô‘õ|úlýþ¼ºË 4áƒûÄõïùï³ùüU·ÿÙù\µ ¯á$Þ@œ5µ>Š6p`îA³Ÿû­¸ÀµÚ5êûÊO=sBN,é# )ô—ã0Ø!áoöè †Ãÿ¹uÿòöRôì¢ëÎ÷rD  :|P E g3öÁó3öµù¤ü¨øþóJM œiÿŠF^ÿö¥÷¿ú oüÊù‰ûD‘ ÛªßDy;4:R,˜8$¢•êĨEž'¹XÁõÇ!ÑðB A7A&ø'A&Oüú@ßøØ–éÜò ð;òS²»!C© Y >*î~êÕîódú'þ¯úJáN ÿ`Ùÿ·*}ùñ"÷¾ýÆÿ3ÿ­ÿ< ý=#ÿÒöÑû×únù5¬ØÚDâ%&@ ;5ý+ +º®ä§Ÿš¯Ì¯¼²ÇÖ÷G#Ó?‚>°5š:k3Péòâá¶ÚÚÞ£å¬åØñ’!ÈA_T­òã"ëóÚîHîük B  ¶&í œùIî6ú˜÷Aó²øSûïýO _N† ö„˜PøQûOøCï*ÆÖäÙ,÷C72“2*±/R‚áÝŸt 9½ª3«àÈdö’ ©:h80ìB÷>“`ônéä ã?ßOÙcèq Ž8™§ ®Ëc-óÁò}òÒëçËéøý#¯~ Î ÍêAû#û‰ú[÷Øò9ïûéTJÿå ° È«þ&ýTýsë‰ ˜ ÒÀèó'6Š,l;5ú. $¿å,¨%«·¹œH ÿÈxïDc1’6|7[WðD@Ê\ÿ`æÕÖþÖÎ,멎þM-'Š.º:eÏV÷Pò*àíàŸ÷rôjðfÿà¿ìõ±)'ôœí*ö©øœóhôÝùcŠ Ø •"† ° µ÷³ô€§÷ÛÐsÞÊ(è3À!Ë) 9'G´à ³7ßÀî–Þ—~ųùF &)QJ;X%5”ßö dô×Ó ÍÊÛžñ ï>ðk+!;( kµìÖãgîÝïkëíˆù ¬ 2 #i‹eøMú.ÿ`ôóðmòšûM=þÆúzgR3ý ù4͈î’1‰QÄ%M96 ŽäÐkåFÏÕ–ä©Ná9îK䂼(?»<»&~#a/¿ìÜúóaîæÕgØŸô9 _• Þ#©# ¬ý[ ’ð†ä?ï4øíðçñVõùüu²O·ÞøþÜúýïhðžúÿšþôñÏ  %û2 $Ûiî÷5*nG"¤@2s Ñâ¹Ë׸Á¦zžjÙþâ*ß5J+ž>JB9ñ2µ3ž&âýÿãðâèÑÌÑêÿû±ùsï I'w#4ßý÷ :÷œðë êïŸë‡íýSñ:~…à l ïö÷ÅõWö÷Bè|Ùýÿó yøà¿òS>Z0T‘/ÈF¼8œ Dê¨Î-ËŒµ ŽÎšÁÁnØÜÜ‘<'@4J”>ã@©A10%~ð4óžã:ÑŽÉ”ÚíëBõ6ö­*$ gø Xþí•ëfì¥æ»èÙîâü?ú¶Ç Ó iî¤þøßù%ñ¸ù_íµïR-ý#ÙEîÓ9)9 ß"ÎAª?ò âêÌÛIÕÆžÒ§AÁ[Úàò¦/£=ú8×;};:+B+ômîÜáaÓ3ÔŒêjèFïnû‰öâ·H¼ó¬ùðôÿõð™éþæóÈø_ù- å‰Þn ŸéùÀ€ð3ù’ø¯ï<ìù%àÞãÐ";Пx6ˆ;Éë÷håÖÍ(¿·>´ô´üÈ ç÷ú/ Ý Ù4•>½?_5‚+F wòù^ì¢æÜAÚKܹç¾óøö-M&”ضœ9pÿåõiíì ñNñïóæõÅýn†¤  & oý˜Òpüþ3ú óØý†þDìÃã=%5#ë)q¿°tûøæ×ÔlÑVÖ:Ö?ÓQÝçîqü^õ’$!#ä%Q µ° õ3÷óïtëƒëQíºï0ó‰÷mþ^\æ j ì  ÒŸü¦ûùšø¹÷ÞönøÃúümý0ÿ5LŸ ¶’Î} ¤›ù‚ñÇü|{+ G~õhêâLá=ãèä9çCëaòrú° GŠ—©ì– zêþâøuö«ôÓóõ²õ²÷˜úÇüÿ—Mxq ½—¥ÿÐýHý“üªü\üÎüýýnþCþ^±ÿÇ® ÿÙû_©Õ˜m ­ÁƒÆýÔøTó4ïDí|ìÃí‚ðßòõøgüÿ“ í … Ë N i Ë*¹úþjýIûú ùcùýùDú{ûÄûÿüzþéÿ{GlÐgY®bî•äÿ®ÿñþÿ{þÓýýþ’þÒü×ûxý›dÃÇõ`ûþ†ÿ»ý×û¿ùÖ÷ïöäö_÷købùfúqû™üpþª\A*¸ôqHè^a†ÈÁÝVÿ þÚýSýýÃüÐü$ýZýÑýþOþÌþBÿ¯ÿyÔ W!­!ûTüÿÔþÖÿ [™É«Ö\ÿþ)ýÀû\úù6øLø¨øuùeúKû…ü†ý°þB˜¹º±$_r–AÒ#p²µÔUÿÐþþ®ýPýýýýü[ý¡ýÇýþ„þ ÿ€ÿíÿP×Çg"¸5>ù[|·ÿX¬O¾2³,s -ÿ3þžýÞüÑû¸úåùˆùÔùHú1û üèüÒýÃþ¦ÿÀ­Ê'Ž´_SÒiÓPéÿTÿ´þMþÓý–ý[ýEýZýŒý£ýþgþ¦þ ÿnÿXâΓ<$ªD’ÿf Ý|,Ú‚…ÿ0þBý=üÖúOùÕ÷äö#÷¬÷#ù±ú]üÀýÿsæœ÷<×HÏŽñÿ>FLJÿbþ‡ý«ü?üüÙûžûüVü¾üý`þ"ÿv§ÄXÛxÃZgò‹`üù¹û”f m@‚êþ_úæ÷„öjõ:ò–îëSëÅî+ôgúÅÚãt ü  0 , qà´þžüúlø¼öŸõ öÙö›øÞúóü¦ÿHEˆ¦¡2˜ëÿôþ‹ü&üGüý¹ûÏÿ¤þýYÓÑü÷ûO ²Ë-½5Ã)#'òcÙïÌäÊ-ÒfÛ°Þ8à‡ââé`ú¼:& 6ü9U2¾!a‡ü:úø÷Xò?éà2Ü}ßUë üñ «ê^ ~ Õ Ù  °hþ¹ó9é±äòæßî'ù{:: 而e ® <† 5óþöMç„âìâ «7@³0»ñïÀÕKÉ¡ÈÓH݉à‹ßäßlçÃø?.Ï@™E:;%ÿ ‰û™ò5ð˜ð‚ìñålÜØDÜôé¶ÿ“$r(c$E 4ùÝþ¢÷‘íªâ$ÜBÞ‹éàøQ ‹‘º*Ž  ý îüfùàïÌßÛîè´¨&äDÙN¶=‰¬í`Êp¸}»üÊ‘ÚdåŸæçGë¦úˆ5ÏLTHGM*Ñéê¨Ù×ÉÛã–æÿä6ãuåFð5¼~1<º6D%=ù§é³ä»æ‚éòéEçÅäˆäJëdý©_ [*W,¸!·Švòïåè¯í¦ö°õéVäñq *©JBZ—Jü$£ñýÀ:£øÆ­gÊèâùVqç ~00ŽGTwN®4è lྪ¯s¶‡ËnåäúÄG Z*.¯9à: ,*AîwÏ\¿ð½hÍ¥âµøöE(#Í-%Í'ü"«kþãäáÕËËLИä%ö–ûü˜Ê0ZFOCm#ÏõìÆ> s‘[˜2³4Ö!øX²!ó+¥0á8–?ûBõ<Í*x §çKů¬£¹wÓÙñÊ F(D)é*\(¡(R%jª KóéÚRż1ÂâÔìÞ˜O%)ñ$=þÖh ý5ézÞ¤Ð|ÎÛòìËöKGn1CDÏS0R:qfæ¹óšU–šB³ÉÕ'÷ù"&ß36$,›BfNM6µìâ6¹”œ°”É¡ò¼¡ß1þXÃ%Ä-53»7Á;$:Ã1|ͧâ]Èö¶ã¶”ÃKÝ'ùË #+*•$sßj .òNãçÓÍÑ>Þbñö¼$W&^!øÓ C'†üŸùÊñëíåöá«èxðTöTÿ<ê#×8÷E$EÚ1‰—çᓪ*¤À¯MÈä?þÑ}!ý%+Õ.Ü1¼+Ý ð%Ø×È1ÄÞÍáòö© f?¤¥ÿ“\ ÙØüð:ãJÜÝÛéâ*ïŽÿÅ ÊÇz?a >‹þÿ ýýñöÐñ>ñ¾ðÞï9ò¬þŒN%y59ì.‚Èø§Ù4Ã~ºÛ¿(Ñxæžú–ˆÞÓm+]²#q#+ò (ø+æßÙ×zÝ€êrúpKr”l q. ´ ~ KŽøcîíç_ç“ìöŽy ‘g— aëàýËü†ý¦£§k‹þËõmïÝðêúÞ AÀ+Ñ-T"ó ïÕ´ÄåÁÌÊßöË£ïÉQ p$ ÆÄ™­Œxô›åøÜÏÜXä;ò®@ /9 dó‡þб· ü=»÷ÒïCëgìþñûÁêã­X 'Hùö!ô÷ªÿ¯Rÿ‘þÕÿ#£›!D¹xýçÒÿÄÂòÊÜCñÕ‡ HÈ â˜” ¹ýKñæÎààÏæHñ÷þ N{à ¢ÿrÿ Љÿ„üž÷póVñâñõÿúº±N Æ ½ ‚ú¶Xý&ù?öíù§šNæ r •–OñÞœÏ%ÊçÍŠÙ·éÓúÄ×”ä½ ô ÈMŠõMWûªïñæ÷â—äëÉôqÿKd } ì „1«¬ú.ß!¥ýÿ÷Eògïêð¾ôÎûX ð‘ 8ü)þ[lãtK íQÚ-Î=ÌGÒ߉ïsþˆ ·ó™A³¦0nü“ð²èŒåÎçìí|÷Áÿ„V Õ pl+[4¨ Õ­FÿnøÇóNñ5òö-ûdÚWŸÂ× Qà°ûRùJý˜¡úJ“½ÀíŠÛÌÐÆÐgÚ¨è©÷éO Ë è¦k Åfœ ÿúó ìé'íróû×'ÕÿKq–× W ö Þáÿ˜ùhõ¢ôšöú1þ(µ£ÿÿ‹ÿÿˆØP΂¹ÿRùÒõø ÿ“iÉ ü8ìäàÞâÊëœõhý8δÿA„ qÝ! ÊÛ÷ëò"òõ®ù³ýäÿ)ÿÀý:ü¾übÿ5êÄ æ ª)ëý]úêøúsü£þ>æÿ¨þGýxüýŽÿF†£¹@Óþ ý@ú¿ù"ý˜ ׯûNüÑòWìQêËì:ò)ø¦ü2ÿùÿ/yC €‰C %¯Kûø=÷•øWûèý5ÿ.ÿ}þÆýpþÎÿv@Ц*ôþëüÆûü6ýwþyÿgý‡ü©ÿ7þ›ÿÁu ;ÿêþaæÿpMþå'ÿW¬ýuŠü…^ÿÜÿaÌÿ÷ÿFÿÂÿJûéMýv3ÿÄþª%ý1ýÿþ#¾=€þ%þ±¦[ÿö\ýPÚýCðþÿ" oÿ¿òý6zéÿƨþHû¨nýÕýõ¶Œþ÷þGçÿÅúyüþöWöþÿíþVÛÿpwÿ¿ŠÿŒûçüðÿø8ý´­Ýÿ=’ýdü·Pÿ‚?ÿ€þw¾þýd”þþµü¶õÿ§½çýý¥cÿ´€ÿrþ\Âôýþ¶@ýê…þŒýâÎd™ÿïüwýE5ÿlÚÿêû‡ý¢[õýfÿõÿ»'ü»þ þÿý‡Gü¾þ®:ÿ·'æücÑzý þÿ}þJ `´ÿüÏÿvü¬ÿFÿW³æý§ÿ6þß8üÿ#þo19ÿžþûþ׿ûTû$ÿÜÌ|ÿ°þRU²¢ûó–äþÒþ‘þ¸´/9ý¼%ýZþ¥þñþFþ½Üïþýý´ýÒÅèù“þÒoLèû¿+¿ýSÿ°?ü‚¿Úý‰þÚühôÿÊþ1Âúý×üS{ÿ^èý"”ûšÿ±Yþì¸ÝûÌðdÿµ+ûãü²{ýÕÿÔùÕÿ]ýÿáÂþ©ýoçãúŒþ²kþüáÿ”CÜüü]VÿØ=aûÜùùêpoý×þÏÿÚÿö@þžÿt@ÿ2ÿ£ü{þsËþ¾ÇÉ ýþÁþÃ`øÖÿà!¥ðû‰Æü°k“ü£þý×ýalü*r²üåý²ÿþF2yøaÐþ&ÿÀûî¸@¼<ûôãú9¹ýçÿðúÙÿ[¤ë^4;üOÿöý~”þÿ]ýM¶üxü¢MVû&«. ÷A¥ÿgúYÿ`iüÂâÿz÷ýûôÿaüøûGpý¯§ÿ&€ûK8úûöÿýXeÿÓý4¤úØ5úÿžTû1üì}ü?ú"ü3EÿgþÔøÔJé™ü¨ýÎÄý^£ûQÃü•ÚIüAoúw&lþНñügývÇþm*þIýÇü|ÖþåýÀ"•Êþûh£ý üdLÍûoüSVÿÌÿcüŒÜþ¶ü÷‹ ùêûÇýÂïýÿ?"xö>5û££¿ZùµÖú±úµöñü8`?źúŸü‘' ÷ôüØÈ/ôø†üí…ÿc‰öûüqûgøHü^1kûŽ ‹þÄ,øøüù)´úäÙõpZý,²ÇôýNýÿÀúœŒ÷ÊXü¢¿ýZÿÝüÿC¬ûiÏøl¾þàÿÎûNÑþkýÍ(Jþhúpý9Jþ‚ÿÏRþ™Æ!ù˜ uüGôØÿ;Ûÿ(ûò©ûënü¢Æþáùïÿþ°üºüŒBÉý:ûòþ„þr÷yÒýÿÒü>êúãLù'¿žþnÿàËþõü°ÿóý’ùª£ùM¨ý‹-$þQ•þ›Wú,þK“þÁÿ(û1 RöÔ uö:>þzlþâÿ}ýe¹ù³ÿþäüE)ú¸ŸûfòýÍû(øèuüðç÷fºú­­ú)"ÿþ.þc,þÊÿÔü}•ÿeþãGÿpÇ÷âàþ Eþ @ÿ vù3 üÏÿ}Íü-•OüNŠýîÌÿbúÍbþ -4>þ´ÏúçÿhüîïûùøõùM û¶pþãàül›ùHŸþ±C­dûCLýAVþoÁ€ÿæÿ0ÿã%ûÿ=/æü ;ÿþÔúØ£ø$úUŸúý'ÿ@ÿÞþëþÿVÿBÁÊþ)ý"ÿœn˜Ôýó`þø?ý#Êÿgþ¹ñûáþm¾4þØ©þ ÿ…ÿñ5ÿ¢üxcüìºþžÿ»({ÿþ´<ÿ†BýÒ<åÿ²ýûeÿqÝú,±üžcý†Ôÿ«êÿÿ¹˜þOÿ®ÿ(¢ÿ¥ÿÇþ¥AþŠ…/ÿjYýø‰ÿuÜý––üÝsÿ þÔvÜÿªþ¥½’4ý "ü í¹ÿæÿ2ùÿ/ƒÿUÿþÉþ ¨ÿQuÿj?2ÿ-Ãþhÿ“õþéRÿÿ{ÇÿÌÿÅøþ4½þþzÿ•Øþó«ÿMºÿlÄÿF«ÿ;¢ÿàÿîÿ"ãÿÍÿe|ÿDÞÿRøÿçÿðÿ4âÿ1àÿ¡ÿ &íÿëÿÂÿvˆÿu¤ÿLÇÿEèÿÍÿ êÿëÿëÿ!áÿ)èÿþÿíÿöÿòÿüÿùÿàÿÿÿ ßÿ çÿÿÿùÿ÷ÿûÿþÿüÿëÿýÿòÿïÿþÿúÿôÿýÿøÿýÿþÿèÿòÿúÿ þÿõÿÿÿüÿÿÿÿÿÿÿúÿùÿ üÿ öÿþÿõÿ óÿ ûÿîÿùÿúÿüÿþÿÿÿöÿÿÿýÿýÿ õÿ äÿøÿúÿøÿìÿúÿ úÿóÿ÷ÿáÿøÿñÿöÿ òÿðÿþÿñÿ÷ÿ ÿÿïÿìÿèÿïÿíÿôÿõÿB÷ÿïÿéÿ)ëÿÌÿ: þÿÛÿÚÿ6ßÿõÿ$äÿ$õÿÈÿ ñÿýÿÆÿ 4éÿ ãÿâÿòÿ Üÿfßÿ ôÿÛÿïÿ&ãÿ<¹ÿ(äÿÚÿ5¹ÿJÃÿ(÷ÿèÿ1 öÿºÿ-åÿB¸ÿJ³ÿóÿ8¬ÿ×JÿH“ÿ!îÿxÐÿíÿìÿ¿ÿíÿ@èÿÄÿ:+ôÿ"¢ÿm±ÿÍÿþÿöÿIÐÿYíÿÃÿ÷ÿƒÿÂÿ‚.]šÿ %Bÿå'ÿ'2n?ÿ¶×ÿq ÿUØÿ•ÿÜÿæsÿ{ˆÿƒÿG?Hÿ¨0ÿG6]ÿ1 (HÿW.ùþ hYÿ¨ÿKKÿUJ„þþÿÊÆÿÎÿ:Ûý —Çþà ˆÿ…ÿ•þÌrTÿXÿ×ÿ9×ý$ÿ—5l~\þ”ÿ®YýÖý®pþÕþÃü^ÿ/ÓürIþÖþÈ€Dþ6fþpÿå´ÿÿŸFOþ¼þýmP•òþÝXyÿkýÿ…m«˜Ïû ý²ú+ªYsýI^ýZ‹ÿ{±ý1ãýpÿÿUý¸Ôü‡}þ¦\ÁNÿVýOþ¥ýXÿ[ü1ÿÍþéýaýü¤ú:ýÌÿêM/þ…AÇý -òhóÃi^ç5—/ öxæwàBÞùåŸí8ðÇð­ü –{›qtŠÅ 3Ú÷³ïÃì[îMï¯íWñ´ùÉs  …Ú À–* }{û'øNõÕô;óŽòQóùé wâ+ ¥ uŸåËÿ3ú…úõ—þ?÷‘ôÙ­WëÊíq9/'5¾/v+õ Nä ¿v°/´uŢتÛKã³þÈ%R<÷A=Í1-2+•BûàÝÔ½Ó¸ÖwÚÛßvõÑ:‹#‚# I ØÐñîë?æHß§áæáçç¾óf¥ …v›¬4ùÊýAú³ïÒérï*èíwó—øj X õúA#­?@33²ŠPþ•ÙÀ±ø¡I­òÁˆÕ÷äŒîZ/­LªM%A 8Û,p#¥$óVÕ Çü̾Ï_ÕšÛ¥å{ýïO'q,|+æ)'45 ú4é×ßÜ5Ù}ÚµÝ5é"üz jÀï!! N^çþÄó_íËêüã–áÃÞGðù£û%Ü»ú”^,JE½DÂ8óÃö(ü0õaÏ(«p™ø¡S»sÚëóö -7ASùV>P¦=b(Z© ÔïÐ]½ÀRÈUÑhà¿íõû[£4ù7H1/·(] ùàjÔÓ–ÕÕxߘê”ö5 !%m(½O¾ðÂå1âÞ¬àüæaæ+õµÿ84& 3ûµýð)IlFÀ3ß kíñjø¦Öp¦N–ÚŸºÞ ôWó„92TWw]Q!:…%ÑÖWø‹×:¼9¸¬É.Õ3ÝÞæoökY-9_5V-'5!rÅÊë­Ø¼ÎúÑx×Ýwä\ï@e]$s(­&“"®­é °þìšß}àã(à¬â8å$ø¥Q ${$þ–Ô*òEE 2ç Çõý{÷ÄÓð«Ò™} :»ÕÕ-â6é©ÿ+¼JÂTRQ:B)4Ê+ BT(jý…ûtù ÷9÷ ø¦ùwû™ý¹ÿɧGÎÌðÄÂì«ÿgý6üùLýÎý`û>ª÷_òSª'æ'wË ‹üëë[Ù»ËÎ$Üçcê²î2øM ã%H%ßÃãsLÕô¦íNë¶ëŸê”êmì òýû6  “ þñbhÇ fI|ûˆ÷¤ö¥óCñ|ò\öÖùíüíÿ§¢ˆ µ ’ Tög3¸þjû^û—øúq÷Qû9üýùœ—øòðäjî11‘¬¦üýVözækÑÔÁ¿ÄaÕ©è¡ò»øLc*$H1’3Ø)êÏ—QÖüÇínß–Ü×áÎè8ì8ñT÷!&ʈ$tÌÎ Ô ÷ïïì€í‡î„ðõðáô¸üXÎ Õ­ ½ F› Î%ýö3õôõaôxóôŒùãüÏþh¦ùRî{ù'*;D5«Çòäéÿí”êÙ´ɽBÜøb ¹£!³3@ì9Ý%ú úòïææeÚWÓ†Ö¤æ³ù ªBì’#ƦãV÷YðŠë¶éçÁäçìïEýŒÔ0BÈ×ö(  ÿs÷ãò ñ¨ïíîòôþˆî P j µ × Qþêqý~â Ø^ô7"FGQ#4ûê\ëªèWÙš¾„­÷»ûÞb6Y&")¥-ä6î7Æ+VµôúÞ~ÙûÙÁÛ¿à'ä†ïžÓ$Ø)*$RJRÚúKï÷äâÛÃÝoæYñ=ÿåÈ€@€5Á/ö”ïYêÕêÅí³ïÄô1üêê Áùèÿ°üRô1ó4ñ™ñ¼­ ÷×í£÷0[ZWH"ÛåÆÁ]¹Á¡Åÿ¿rÂ`ÛÀ›1L)K#8É!iÿÎî³Û‡ÌÜÊ!Ùò àW(K)a#%úqvðIß Ùüݽè!ö º–1}~kôIê÷æÅçëí´÷ å ÍÿO1 ²=øgòÎîÑï·õ6ø<‰ «U Ò öÿ©×#åîØ.ñ,"`Wða 7 ù#Æp²˜ºÆrÊdÍ¢ØøD! ENP´="¯Æï„è^äbÜ@Úqâ¸ô-~"·)ª&‘ì Jñô‹íTå™áSèøóõØOÂ¹Õ Á`þ±öºïð‘ò~öæüiþK Ï  b uþ÷½óôÐø2þ"- ᙫŸ«øOÀÿ=êÙâªõï#XdhÐEùÿ,»¢—‚¾5ÞÊðÅ÷‘‡/ÅBQ>}"^ú1ڲϾÙhï/´ò^ ðô?r-ðòæeæ×íü,æE꧈ D @>úäòæî€òýf,ýµö@ >‰0ÿøúH÷\ù-ÿkVÇ»ÿ×ýNÿocéø‹ýñîDäùr'ŒXdiFÄ.¹,Ž‹‘²µSÝáù¶qå'¼>D7.Ô‘ÚÎÄ@ËgçŒ}Ï× mŽÿ¯ ÇøÑæSßóãôC~K? –m­]F…ú‚ó›ñ ôü…Â> uÏHÿyÿoÿöýäùƒúàù¶ýf þQúÌþ-ûã0Sïjä÷#)°Z§iíFéþ‰²*ˆ¿Ž‚·¾çu ±F â!J9SDù0( ÜÌÁFÆxâš2—öÛ ‹ Ù,Äx è<ÜÜíåໞý‡,6’õùêÝê¨öƒˆH Óÿ”úbûEÿ0½µüö8ö¥ú: å s 1ý#÷ýÿ€ýf ;îHáƒô3$àViü2ù´ø€øüúþûÿs´,kS¾ý5ùsügüÈû—-mú/í7õ¹*<^QˆDþ™×š¡üŒSúÊn/(b;ã7)(x©ü¬õƒí™åÂàHå.ô›ü4(Ü'`vÝòÍåfå=ëô*ýÃu †w  <ùòÏîñøc|Ú — kð ¥ü‚úù1úøû‰ýQÿãÖÎüXé¹ÿ9úüûPùf#)üî×öc9 N¤Co£Þ›¨t‘C:Åø,!4º2ï%kr ]Eý„ö†íãäŠäÇìLÿ×a!ó$‹ 'úvíÖè‡í\ô@ý0¢Ñ‚lÿýo÷ õõ¾øÐýÏíùnVÿžý:ýÝý½ýÄü„ûÝü8žÿç¹q¦ýú¢ÿþ‚÷ÛëÔõê@9 KÞA‰PæF¹¢¤¦«ÇRélÉùȺ߶õ*ñ=è,çïŸüÊDª ¬$KÿðýÐûgú>ùàø²ù þ,ð69ÿ:üLûÚüSþ-ÿrÿ9{ÆE] ôÿqÿÿ”ÿ,ÿ™ÿo,ºýÂSÌû¸úIøXìÓøž0¼= 5 ÜðÿÎA½áÀHÔ‘êøüÙúƒúºÿ Ÿ½$÷#èÌrùUð»ð0ö~ýŽŠ$ÿåûdû,þÍé  Ù Ç ýHùlø%ú¥þÌzŠGÿÄý ýÁþ‡¸ÒÿˆýÛüžýpÿå§÷@þÈüþÁÿÞwSxjÌþ4ûoˆFø[ðSýx‹#H/;+?ûÍä9׿اãí’ðEí æ"ä„ê ø 4Ì!ïûl ¨åõÖ ' ¿ú•òÜíâï§øÇÿf<¤šü<ûyýÁ¬H u üMü³ùlùfûXlÑBÿýpúÉùþ…Q4fÝþæü¶ý"þS©¢òž´û_øü»°øJõ]$ &%ê$3óÙòìå­æ’í«ïðï íÈâ"Ýòà1ë…û Zű ¨K HUŠrvhûµôWò÷IýèÿmÿÝúoôFòMöªûí¯b @%âýËüˆÿòçàõÿóù7øƒúVþr³6lÿ[û•ùnüiÿzÑšÞýaø—û“öë 8Ä#µ#ê­òÞåiå¸édìEïuíVäDßßàTéèøŽ n»€° ƒ © 2õ<Xéþéõœñ¢óéùrþ„ÿOü…÷ðòÍòÝø•â ¾ –&ÿÈüåýu¸Öûqùúb÷5øiû¯P!vüÏùúø²üÛ¢ 5Êÿoý»û[ú2¿ üûõ¾T ®!Ë$1ITó1æûä³çËëRñ£ïæ|àßáîèìö|Ó=\‹: ìÎ ÉÓU ©ÿ×õ%ñYòí÷´üÿoþ¬ùáópó©ø3þÅ’ ý ™þ¦ü8ÿ@éS“žýOøˆöŽù.þ®,wþœû1ûSúÒþåÙˆRx)ûs÷ 1‰ûLø GŸ"œ#uzòÜå±ä¸çŽê[ïªï%çUàüá’é÷÷+!‡A™ó ùñT­ 9àõyðÿò•ø¡ý\iÿúÖó-ó°ø}þ'Ú | ë9§ý5ü<ÿí½'µ þR÷ø÷û[ý(-ÝþüIù‚û¿ÿšÅ>7Oÿ6ü½øE«üùU\ ci$Ù$éóFä‹â‘æ8ëêïmîçjáâfèäönSé_f^ ˆE |wÃä &à÷%ò¶ò¦øÉü6Óû ööžøÝüF(€Déýý9ÿš|0eHûiù$û)ýðÿ¡>Öžþüyüfþ\*^Y3³þGû¥¤Šú·ö/ð Á$Ž$=Nõô\è­ä¶ç“ìÚïÏî5èÂâ¼âhè ôùžðJ ùÎ á;ÖL 'JûôTôŸø¾üAÿ—ÿüøâõ6÷sû•™»°NÿÜýŒþF+XLü:ú¨úxýBßÿþýþóþ¿ý0ØÜÿ ü.ìû õý# 'K&(-8óBäªßãrè\í°íæèåæqíù> '¯˜(ú t—  l D Ÿäþ1övòÒò÷ö0ü|ÿ4ÿSüQúØûvÿnMx­ðþCývýÎÿ¬roÕþŠüÃûùûcýÿÿÛ`üþyþAÿä`F’ÿïÿ÷ûÕ«ùÂðù ÷$­5j216ÿä„Ñ{Ϭ×&áâèë“ëîÏõ]« %D hJ ^þ½þæþƒü½ù=ö ó%ó÷­ü¨_}MBÌ"7ãñèÍý÷úHú³ú¸ûìýâÿ¨ßΧ*l¢NÉÁšÿþŽý%ý–þÿÿgà™ÿ|ßü9Ö»ùsïC÷gy-ˆBu:(òòÿÏB¿áÁbÐgÞéõðÌõÊÿ[7 Ê)#+s!½'öËïÊîsñÿò„õÕ÷ùû=ðLe 0¿ü¿úkùWøïùêùqøúyþl¤Ír[zŠÿ¯þiü›üû#ûFþ+lÏÁªe+ÿãþÿÿvýBù”»RûOï£öË¢2JÞ?çÁ“´¿YÓ â;ëò€ý©¾%ú2‹1‹"Ë æù­ì2èVé"îÄò6ö²üæß (žp ãÿZ÷Xô2ô*õ$÷¬øGú.ýA¿´ ì ?Ã,þ¨ûèúû¹ù{ù®ûëþÔTëåbÚuWÿ`ý<û(û¯ûüý¨ÿ» sÿ_x<ùê´ónî;N}:ÿ Ý_ÁÚ½éÊ ÙÖßèáâèhû/Š,\4f+•¬ ÷pô©ô—òøïáï$ôxþ ‰²§H "0ÿ©ûPùø£ö„ö3ù,üšÿ£ÝÖ»¦·ý…üý-ýìüZüMüæþ.ÖTdQ+‡þ+þµþ`ÿ\ÿ’ýâþ2þàÿý'ˆùpçþï:CsP‚7f ÐÞÂÈÈâÑ6ÙâÖœÔÞ õÅW)W1ú(I‘±Êÿ›øéíEè³í™ú*Š€c ^ß,Còù@ó³ñ6öEýŒ24“f6I~ÿ°ýŒûúûüýŠÿ¥ÿYþéýE?œÖOôqýÉûåü‡ÿ¼nõ·ÿ&ý Zîþxî~ú“èßíOS@²Rž?תìÎnÁaÄLÏ"ÖÌÖÔØêæ¾Nè/ö2Z)å bþú ô¤ížê_í ÷èØ èúé (½šþÌúÂ÷öyöy÷íúüþ ʶaÃh ‹ÊþqüüûvüaýÎýíýsþý+e¸»ÔkþCýôý5ÿ‘ÿýªþÿdÿï{›þ®ïï x3[N1G=#„øFÖ Â,¾GÆŽÓÿÝáä©ï Î^05ß,‡v uýg÷ûõöšó3ð•îÉñƒù† ÚöÃÄßüýzý-ü|ø¤õºõŽø_ý¯ù2'€æv£ÿlþ+ý³ú°ùü?ÿÔW47ƒ[mÿ'ÿÿ'&ÿWgþÇû¢þ(*þ¤ñŒñ[ „1±KEÛ!õÓnÁ”¿)È Ö\ä¼ì{ð¢õâ@'0+¸ÿ#ÇöFòò ôLôoó$ô`øÌÿ0¾ :£¿ c¯ ýéú8úRùKøjøCúÉüÿëëwYଠþëûüýxþvþþ{þ”ÿx>Á°ÀÓÎÏþÁþäýˆþxüÿ‘'ýyó&ô—j*D C$e÷aнF¾}Ë9ÜõëøÉþ•ä¹ +" )f$Võ®íí0ñÙõúýyÿÿ¼ÿƒ Í  >ÿPùN÷DøÚù¥û•ýÿ ÿ¼þ›ÿh7~“\®ŒÚý'ü_ü_ýOÿo-„ÿ8þ%þ³ÿÁ/›KbýÎü°üåÿ'#£ü¸òˆñ˜1&ÂCìF_*5úÇÍеL¶´ÇdÞÍñ,ÿ‹Õ· ÙG#Ì!L­ñ6è®è-ïXø½ÿ[ŠÅX! l Ø ‹êý^øÉõÖõsøBüœ¿uû}æït”æYCþ@ü¼û­üíþçÒ³ÉZì¸|Euþþdþ4õÿêœÿÍýÙÛýØõ¡ôó#AäI¢2Í‘«Ü§·½ÄÞ2ûÏ   5!‚§áÃ\ÕMôÿç¶ä~ëPø¯ø ¢ (8nh‘¥™=ÿ¶úPøøfú=ýk¯M¡!YQ‚ÿûýºýýQþŽÿVÐâ"ZOÊðÿjÿrÿƒÿM3ÿ,ÿý!†iþÂõ ô;G"Ÿ@¡J?4eѼ®ä¨ ½+Ü'÷¯§ô ||!™!óÖ÷·êòæ•ìˆ÷}=Z0]|ÿÂr) 6 €‹Oúzö~õømüߤ_4]þ—þ¨Û[t=Šþ]ýý°ý™þQ+à0U§ÿ2ÿ$ ›‰ÿ;ÄêþÐCüßó?ó™¢!(@JJ¤5fsÕç² ¬g¾ÜÛ-õØœßýüm¹¾f(±&|2–öìóéLï€øó›טýýmŸ‚ Ó † $ùõãõ]ú¾ÿ9QõüÛûxý(¯@wQþ ü4ü¸ýú|,ÿÖþ±ÿš+yŸf!ý“úÕÿ(Aþûïgï¥|2%SwQ1),î½j©D³ÚÍ è0÷"ùvõõSþ¢Ü#Õ/ó,Å×HõlìuíÊõþb¬þOù2ö;úJ6 x½G _†ùTöøû¯þûÿÂÿTþÇü²ü™ÿäµw¡2ÿâûíû^þ ÈuÕþÞýQþºÿÊSó ±þÂü•þÛû"â5þQòOñêÛôïa( `Emä@Lú,Àí¦Ô¯žËxà‹äûÝ?Ûvé3 ‰-‰@N=M'ª ÙúfôT÷xû-üãô¡í¾êÉòQËÛ€ (kúñû/ñNÿ§÷Ëò:óoù´2 ê~"þÕþÐÿÛüG€þöûèü(þcÿ/>;îÿÞý<rv¿þû5ýmü„=Qù‰ ·ç†Õ™ûøèÓ׆â¼òõ§êÖߣãIüb|/s38‹õ2î©òjù’újó/ë*êjöÐ o¥Ÿ¬ö¹ôðøžþL¯üYõcñ¨õT .s ûø÷=þ%úz÷O÷ úPv UäöÆ @×Ð7aSÿºs¹0"Þ?€ŠÀpáeêæìWúouG”gŒmqH¨ „Ú¿‰¾Ä׿î«÷ïöÐ÷@À²4º:_*¥ ØêÕ×ÍÖmáðøèû\üPbó.£hõÁèÓêùî¨÷Ýù»üKÿ¥Ö  -ÙI8û±ñÆíæ÷æûäü—mÿêNö _ó•¼PÐGÈ{ý Sÿ¾{ÛB“ë…š€€Ì­xÓsêìsö¿ààÆãbô1,3 ÜŒ$ ›…Ô.»|óYNÿÿ W…÷`Œ€€ˆ ÉÛïñ¹"…Elÿ^n:õªµI–Ë”ã¸1ữä#N+Õ7£A1A++±Âá7»bª$½ÎÛ‡ñ  ~&“#¡$-'‡! ùðÜ܈͟Íß×ÕíâÒÿ“õš 0uì£Þ`ݨáÏéšü l|“"î âžúØîBûcÂÔ³'þâhÿÿ¹_SûŸ‡€€f‰/Åüèäþ7»*•S2{ÿ^oD,“Ô(š…ô•#Ÿ÷Ø×'¿2hBSGÏ:SìòÀ•­¤±¡Å´çÎ" ,Y-K*L%d“ nñïݧÓnË×Òßææc$x'! x ?ö7ê4âéÜÂäÇîÂy#Ì* 6Ÿþ•ë@ôyï{ݯú³ rÞ^Õÿkwÿÿ—EŽÚ€€€Ì’Í×úÿÑz1"Fðc¿x«o`D7ýz±€ƒ2‚k©ã é5nDGB7ê0&»éñ͇³·°Ø¿§áèE4»AJ9x'©ÙÒö^éýÜÓÖnÔÙ îÉ ¯&‚2K/], Æø¤ëËãœævèèñý?…éÙ6^ü îþè»ï îáõÂùÞð¹sðŠÚ“§aÿÌz=/ŸÆ€€€±ªôŒ&²6h8GChKP LÓ#¾ÞE¤ÇŸWÊØ:9)PLG÷1Q» ~ðHÝTËY½ÇbèÇ×*Ê=ž;ß#3 —ùGåàèá6ܘàýñ Ü –-µ%Î5üAó}çaÝÑã]ôžü7ý}‰PõP a ñùîç}å~î‘÷‡õnn)dü\ä±Í?ûøIá~um3¼Ð€€€.¹’ ,Ç8Z1Í/à1š?=Jxæ‘´³šß®÷ÛQBLT9&ãú?óñ%äÙÕ_ÎîØö\¯2•8,*еúâéßá#âcèªíiõl#£ V¸õòähçAìAïUú/¡ HÄ € Q ` ýêóaïî×íXþ³} ϧÜN5àÅÉ»ó¯B³sêpt8Ý܈€€D½ì6%¹-ž(Ÿ&÷/É:£:’Jë¾G¦i®:Ü,9C5{ ‡ÿ‚úéó¢è@Ú!ÐÏØˆöU{0p4ˆ&xCõôâüåCìpì ñø(ü§Ö°öªjæö;éãÍæ¹ôâå% pJ -‚Qýióì÷ëòž¦_èJpà~Î-õU7#jhoÆ:äÚ…€€ÁV`0ª8."±&¸2q-$n㸞§Ã¸ìÐÎBºJC6—õüôî½ìê–æLájÜFçg1"6ƒ!Ý,ë؃؈äT÷­%ÓG &f ¾ùë²Þdâuît×ø¥ \bHúÔø‰÷!õò;ôùè öûÑE÷]ð æ£æqÖøN@‰ruÚ=jÞ—€€€¾ÀÉ 7˜C¯7”*)j+¤"òÿÁШø¡WÇ—9[ïSo-¨+êÞ¿à&çäÀß•äü‹38 ?1.í9Þ„ÍÑ1áöŸå £V-f•†ñòÚÿÑ•ßG÷¼  Ï!­xAÿéüñøZõƒó<íŠïBúµ’Jl{ùNðGôPõÅø6 3ñiâ©?—lïiÿ-ÒÏ€€g‰ïÕ5‡?>—-H!H¾ÝíxÃþ¦ã¶ ç(lVZ¡: ½æ'Ø´ÝkçØë@ëHíŒý<[2;<È(û§ÜiÆPÉÆâEª‡ ý  õ êþÖíäÝÐÙ¯æh-M(]"Y´ù6îíWôAø?ùz÷Ñù:÷ã•- øùgíé0ïý 6cÂI U éödàßï@”Fj[ ?«ù³«þƒ¨’žÈN£)Ú/#-Zþø.Ôª½ÅìŒ!úCÊHç+QJåPÜXä®ïŠø.ø÷[{()à¼÷@ØXÐìÜ«øå I €Å·€,ö÷éTå…ëCþêœ× òøQí¹ìÇôçù%ÿÆÿXÿŒ& ³ ðýöîÐðpø[ Jëÿ’þ9üQ×ý.ñóæ_øÀ@N*3Aûi¾™¡ç®HÕíZ:6öÅÅL ÞðEÓZÆ(Ö{ýj%;ú2QÍù…é·ê®ðWögóKòùG »' ïæØÞ‚óÁ9¤<  ð°®Qú^íèöíŒÿÊÔ køvðˆóÇú˜êü÷ü v  ì ¿ô¯î°ðýW B Äÿ˜gÿTÿFö>ï,ù»ÉÿÐôÕÏ!„?H–1¿üî¾”r¤­Ê-öC$¨ ©+ ¡ñÊÙb̿՘óô23’.›óyíëïöñ‚ñºðjöÚÎ"T¯m÷/ækà êú¥³ Ê X ÑÏ!÷üêÂèzòu ¤àÖ-ýïùý-ýAû§÷yõeú¬€å‹ .dõáðÃõŽý¼âl;ÿè¸U VþoøZô„ô¢ îãöñ:|F¨1Þ¤ÇA©ê²ýÔÛõL^QrsI$¶Jý'ÝôÌÕ§ñ8%|%š;Ÿþ)/ùŸí•åýê`ûÄmiã ´úbñœïŠögüÃüûàú8y ш‚Pû~ñ]îÂô=þá2:G#Fp,Eûõ•óø’  ÕíŠý_ýÌþXÿvý•û&ú‹ü]l4 5þüúpùŽŽø9êy÷Gu9[Bv.Uúͽ³Ñ½¬Øßîìú™® ½j$d-ù ÄûßpÐ5×îÕÓÓj õ ä® üÁê~ßtäêöç rÃÍ 8üÐû€ý7ûHõJñéòƒý˜ í‚ãüµõÃõxû°ÿþˆú²ûQ²ß ç èUújóáô™û!"Ê”ªÿU‘Ôû‘÷Ú÷¢ü‘Æf„ÿ þÿýïønØøýññÔèùù7¿;ý&"ØcÂÜÇÂØÖæ%ð?úX¸Ü'.Œ2]éSÝ–à+í#ý ë à˨` Xü"ìáåÐé&ö; | B s l x§MûyòhîœñùÆ” Ï ³ Ü1Tþqûàø=øqùþü4QW€;ÛþüŽûàý~þrýéüÕþ4‰¾Rãôý˜ûŒümþ-ÿýþ=þø76Fyeø„ím÷ÔÍ+á.å?äRÐ¬Ñ à&í¾ñFõ¿ÿêÌË"Äà ^ö©çèñšúÄÿ1‘ß’ ™ž £ù“ðnï‡ôXû›èÅŽ"¤©iBþøõéöKüTâºÑ6?·Zþ3ûÚùÕúyý>$šTÒnÿëÿ\ÿ¡ý«ü´ýUÌF>ôÿéýñýnÿÞÿ ÿÌþÇýdµŒÿ,nhûvð†øŽý&(ÒeþèåšØ€Û€æÚî…òéõ þÐ 3Ñëçyùñ…ð õÑúý’ýæÿW¶ o« !yü5öûôªøqýjÿÿoÿæsÁSüýúdùwû,þµÿ)Np¶ÛùHÖüéúû þ­†ÜJÌvž¯nûýü~üÿù˜À5ô`£’Žÿ7þqý3þñþã ¸W‘[ÿ*üþUQ  yFÿùøö¢öu÷WøQù?ûXÿ{9| Cþhýýýaý<þÐÿOÕD$xíÿîþÌþ‘þEþþlþgÿÞÏûpãV£ÿ"ÿëþéþáþFÿµÿ[Ì:Ü…&tÿDÿKÿ­ÿÖÿ#ùÿ@ŒpNÔÿ½ÿ£ÿ‰ÿ˜ÿöÿ7Ž^üÿ+Ìÿ±ÿ”ÿC‘N+ ¯ÿÏÿrÿpÿ’ÿáÿ-èÿ²ÿµÿœÿOyµ~$Ðÿ.hZ"¹ÿ°ÿ¹ÿäÿÍÿQ€þÿóÿäÿ—ÿzÿwÿ˜ÿÃÿ8ƒ–wüÿÞÿ*"Gåÿ:çÿ&)Íÿ´ÿ¸ÿùÿ!,-:´ÿkÿMÿ®ÿ ÿ¶ÿþÿäÿ CdHX8Ìÿoÿ0ÿqÿ¥ÿÐÿBo¥XæÿËÿ Ôÿj* C2*ðÿ·ÿvÿÿ²ÿC”˜ÿ“ÿXÿÚÿ;4|txƒ;µÿáÿ¶ÿ©ÿçÿÿzÿoÿíÿ÷ÿJäÿÑÿèÿÁÿMK“³ÿ¦ÿüÿ?D)+6/÷ÿðÿûÿ5':'©ÿTÿ=ÿtÿÛÿÑÿÕÿBþÿs[QëÿÅÿ»ÿãÿ-ãÿ ÅÿßÿËÿJ@tÉÿ¾ÿ$QO@L) ¸ÿ’ÿ€ÿ¾ÿÙÿÞÿ/FdúÿÙÿýÿÕÿ¼ÿðÿ ALŸÿ€ÿ™ÿÃÿ ZL×ÿóÿ +îÿÎÿÝÿüÿ9áÿøÿÚÿ!ãÿôÿêÿ7<' Éÿ¡ÿ°ÿàÿ êÿÖÿ(SEãÿ4!!ÒÿÿÌÿ¾ÿäÿ àÿñÿãÿüÿíÿ/2æÿìÿäÿüÿüÿ6FéÿÿÿÖÿñÿëÿàÿÍÿûÿôÿ54 áÿÌÿöÿ áÿçÿ òÿòÿâÿ üÿôÿîÿ õÿ ïÿ#  þÿáÿþÿ üÿ×ÿØÿëÿñÿùÿÿÿâÿäÿ"ùÿúÿýÿüÿéÿñÿèÿ ùÿýÿìÿ ïÿùÿ úÿïÿ öÿôÿ ôÿëÿîÿòÿ úÿöÿõÿÿÿ úÿ óÿ úÿ÷ÿõÿøÿùÿòÿøÿ õÿ øÿúÿóÿúÿÿÿûÿþÿþÿòÿúÿúÿüÿÿÿýÿóÿúÿóÿüÿ öÿõÿþÿÿÿøÿÿÿþÿÿÿ õÿùÿÿÿÿÿùÿúÿýÿ÷ÿ øÿþÿÿÿðÿþÿüÿûÿõÿþÿôÿúÿøÿ ôÿïÿöÿ÷ÿþÿ óÿþÿñÿüÿôÿ ðÿìÿùÿûÿõÿ ÿÿìÿ õÿûÿýÿøÿþÿ  áÿïÿ òÿ÷ÿþÿøÿ íÿ åÿ ÿÿ óÿëÿðÿ íÿ þÿêÿíÿÿÿ ÷ÿüÿúÿîÿóÿ íÿëÿðÿùÿûÿ ãÿéÿüÿøÿöÿÿÿçÿîÿôÿ óÿøÿöÿëÿøÿ çÿýÿ ùÿ ñÿ õÿßÿúÿóÿæÿ àÿ#Ùÿûÿ òÿúÿòÿöÿ ýÿøÿßÿúÿûÿñÿ ìÿÓÿ÷ÿóÿ$þÿùÿÝÿãÿöÿñÿøÿ ñÿ" ýÿëÿ'äÿîÿþÿ óÿòÿ(èÿçÿýÿ"èÿýÿìÿöÿëÿ çÿýÿçÿçÿÝÿêÿêÿìÿ  èÿúÿ ÿÿÜÿñÿïÿçÿ úÿÞÿñÿðÿÿÿñÿùÿ÷ÿùÿ%ãÿ ìÿüÿìÿûÿöÿôÿáÿ ýÿöÿ ùÿéÿîÿ ÿàþIß{øÝUþÁvþÿ&rüg£ý þ±'ýuûþPˆüiÿøÿqíþÕ×}ÿuüd×ÿÛÿðþMñþÿ2þþM°"ŒüÇþBÂÿ5üqÿñéÿ_mýŠb7û¦k¬ÿ‹ÿµÿPûIŠÿ‚:ýlÿÓþr7:–þþYÇÿÂëUø–þǤÿŽývX5üxÿ8OÅþÜÿåØÕùûåf’ÿfûôú®ûÚdÅ\ý£%ͪùþÓå‘ÿèýÐ=ûôýùgýþ>‡þü¯ûXü5Æ÷þûeü&2×û³d ˆ†üéú`þ{˜+þâù¤úâþF³ÒzIý ; ûJÉôþ±þÜû†þ[ÏýžúgýNºÿ×ý5üµûrÿ‡vOýòû;”Vðü“û9ý¼äÝ·ý·úPÿÝ݉ýÔþ‰5ÿWÿ xÿöþOý;ÿícõÿêýÉþÇ0\Îþ2ÿÔ¸þýÿ;Ý™9áýý|þfƒƒJ¡ý ýyÿ*ëâÿ<ýŒýÞÿ(u”Wt$þüý¨ÿiÚÿÆýrþ˜H ÿ­ýÿ$÷âÿïþòýèþ¤,Ojÿÿ6ÿ«Ë™ÿ+ÿ¹ÿ)Êÿ£ÿÿŽ„ GÿfÿXr–eÿ™ÿ­ÿArbU›ÿñÿAtŒÿ—ÿvÿÝ¿#pÿÿTÿqi¿­ÿXÿqÿàÿÑ+yÿ±ÿÏÿðÿÖÿ†ÿmHÖÿZÿýÿòÿøÿ®ÿ&{âÿßÿEÿÜÿGfðÿùÿ”ÿQ7õÿ¯ÿ$qRúÿÿÿªÿ¬ÿÜÿŠS+ÿYÿôÿ¿Äÿ.ÿ’\ 7ÿcÿaÎs“ÿ¿ÿ;ÿÕÿvD}öÿiÿ‡ÿÿÿdЧ‡ÿ¡ÿ.ÿ—ÿž,Ìÿ-nÊÂÿ5ÿ{ÿ¡.4ÿAV=Pÿ|ÿþÿsÒÿæÿWÿQJÃY‰'ÿRÿíÿ3öÿŒÿßÿ7\ «ÿ ÿéþXÿÚw¨N‚ÿäÿ8ÿ|ÿ gå·ÁÿRÿHÿ>ÿ©gÑMÿJÿ…ÿ6 é ÿõþÇç‰ÿÿ*ÿZ\Hxÿ´ÿ/ ¯ÿÎÿ]ÿÅy´ÿžþÿ®o cˆûÿÿµþYÿ‘ƒÿâþ7 ¿þ þÅYzÅÿ.Ó"†ÿ~ÿ{ÿˆÿf“ÿUN°fÿ‡ÿõÿ¢Ètÿ¬þ(ÿ‡V(nÿØþÿ¶bJÿõþ|õÐÿnþ¥ÿ»bBÿƒþÚÿ(¿ÿÛÿ‹ÿeÿ:R]·ÿžþ"¬Ùÿ¡þÝþ*¤—ÿdÿ=ÿgÿntƉ‹ÿ£ÿŒ¹ÿ0ÿ&¢?ÿ£þ( º04#ÉÿmÿÏÿ¨ÀçÿSÿšÿOŽ—ÿµÿ9€@ÿ½þtÿãzçÿÏþ¦ÿ±ˆyÿýþÒŠ1(3òÿŠÿßÿzÁÿëÿ5´ÿ}ÿêÿe ¬ÿ 7Ù±ÿ'ÿ¸ÿ²ÿ×ÿŽÈÿdôÿáÿWçÿŠÿgÿ€¶Wnÿ8ÿ<”âÿzÿ<ÿ¥kc~ÿWÿvÿcM  ÿ„ÿdÿ\]££ÿcÿ~ÿuÔa­ÿÿzÒýÿnÿ ÿ!]( »ÿ·ÿÕÿ4s,Îÿÿpÿ¯ÿ5vV©ÿüÿMŽ$eÿ5ÿ §ÃØÿTÿŒÿ¹N|ÿžÿ" 4üÿ;ÑÿáÿÏÿÊÿ,ïÿËÿÃÿÕÿV¶,½ÿëÿøÿíÿ¼ÿV?#¨ÿ´ÿ5<Ãÿ™ÿ®ÿzWtÿ”ÿ.‰^F¼ÿ“ÿ¨ÿïÿr¹ÿÐÿùÿíÿ¼ÿ ³ÿÀÿøÿ.Aóÿçÿúÿ:G¦ÿtÿìÿyÛÿ²ÿûÿÌÿÓÿ²ÿ022ùÿÊÿöÿ÷ÿ3Þÿ6@Åÿžÿ¿ÿN~Êÿ­ÿ¢ÿ´ÿûÿ'QmBõÿÊÿÇÿ¶ÿÉÿ"C^Öÿëÿ6ñÿÀÿãÿ.) èÿ¯ÿ½ÿãÿ$; Öÿ7/üÿÇÿ»ÿöÿ&9íÿÏÿÑÿM ØÿÓÿ;=ñÿ½ÿÂÿñÿDFäÿ±ÿçÿôÿ:ôÿçÿïÿåÿ#Øÿòÿÿÿ2Öÿ,ìÿÚÿÚÿ$;åÿÍÿ¹ÿñÿ7 Ýÿéÿõÿôÿúÿóÿ;öÿ5ÚÿìÿÿÿÚÿÓÿÚÿ+îÿåÿ òÿ ÿÿûÿÍÿÙÿðÿòÿ.æÿäÿûÿ!îÿýÿæÿãÿùÿãÿ)ÛÿÞÿýÿ#òÿ÷ÿúÿýÿïÿöÿ5) îÿÿÿÚÿëÿüÿÞÿÑÿâÿëÿïÿûÿàÿøÿçÿùÿ5,úÿûÿ ïÿõÿ óÿÕÿòÿÝÿäÿúÿ.%îÿ ×ÿýÿþÿùÿôÿ$ðÿûÿêÿãÿ Òÿûÿ !.éÿåÿÙÿÜÿ7ÿÿ$ ìÿèÿäÿ þÿ÷ÿ øÿöÿÆÿ ÖÿÝÿ4 ùÿ ÏÿÖÿ+ýÿçÿßÿéÿ+üÿ óÿ µÿÿÿÇÿÐÿ=ìÿéÿøÿ ÿÿ%¬ÿ¬ÿ¡ÿýÿúÿéÿ+ìÿ4óÿ<AUAÄÿóÿøÿîÿ%ÎÿÝÿäÿÎÿÀÿÓÿ( O"ûÿÏÿ·ÿÖÿe\MÜÿ›ÿèÿäÿ @îÿßÿêÿ& ËÿôÿÜÿëÿÓÿçÿÖÿÝÿL*)âÿ¤ÿÿÿÑÿüÿîÿ# çÿ5òÿúÿûÿóÿ'7/+îÿ´ÿ÷ÿàÿøÿÜÿåÿóÿñÿñÿÜÿðÿ þÿ",Üÿëÿ ûÿèÿâÿÓÿùÿúÿòÿåÿþÿÿÿüÿíÿêÿ ôÿíÿöÿñÿïÿòÿýÿàÿ  îÿæÿñÿóÿ "úÿèÿüÿ  øÿüÿæÿýÿ ÿÿöÿôÿüÿ÷ÿúÿýÿýÿ ÷ÿ üÿúÿðÿöÿüÿ ûÿüÿòÿôÿòÿôÿùÿ÷ÿíÿòÿúÿüÿýÿñÿúÿïÿþÿüÿÿÿÿÿúÿùÿ úÿöÿöÿöÿ ýÿÿÿôÿøÿ÷ÿÿÿìÿíÿçÿïÿþÿúÿûÿ÷ÿ÷ÿðÿ ùÿãÿ ùÿúÿ øÿõÿ þÿæÿëÿþÿ öÿ úÿÿÿæÿ  æÿþÿëÿöÿ÷ÿïÿ íÿïÿïÿüÿòÿþÿêÿðÿ ñÿóÿÿÿ(úÿýÿÛÿíÿûÿõÿøÿêÿðÿïÿ òÿúÿÜÿ" ùÿïÿíÿòÿûÿôÿ&þÿÿÿÜÿêÿ þÿ öÿ äÿîÿõÿûÿÿÿìÿÞÿ ðÿìÿ úÿýÿ çÿøÿíÿ'üÿñÿ÷ÿäÿ éÿûÿ÷ÿõÿëÿýÿíÿöÿûÿýÿõÿçÿïÿ ýÿûÿûÿýÿ ðÿþÿ ïÿîÿýÿûÿèÿûÿýÿùÿÿÿýÿ úÿóÿûÿýÿþÿíÿöÿøÿñÿøÿåÿÿÿ ñÿôÿýÿøÿ ùÿÿÿøÿúÿõÿôÿûÿ ÿÿþÿþÿöÿ÷ÿ øÿüÿýÿøÿ ûÿýÿöÿ ÿÿöÿüÿüÿ öÿõÿûÿþÿúÿ ýÿ÷ÿÿÿùÿ÷ÿöÿõÿôÿ úÿùÿÿÿÿÿüÿýÿûÿïÿýÿõÿûÿûÿ üÿúÿûÿüÿûÿùÿÿÿõÿ÷ÿüÿüÿûÿÿÿýÿÿÿýÿüÿ ÿÿôÿûÿñÿüÿüÿøÿýÿþÿùÿþÿ÷ÿ÷ÿúÿýÿþÿ ûÿòÿûÿ ÷ÿøÿÿÿ ýÿûÿñÿôÿ  ôÿÿÿ ÿÿ÷ÿ÷ÿúÿ þÿùÿöÿÿÿôÿòÿúÿüÿ ôÿûÿ üÿûÿóÿøÿóÿ øÿóÿûÿÿÿ øÿüÿõÿûÿ øÿöÿ üÿûÿþÿüÿ óÿöÿ  öÿûÿõÿúÿýÿ üÿ üÿúÿýÿûÿúÿ öÿüÿøÿ  óÿþÿòÿóÿ ýÿýÿðÿîÿøÿþÿöÿþÿòÿúÿÿÿ ýÿûÿþÿûÿûÿóÿÿÿóÿúÿôÿÿÿþÿÿÿúÿ÷ÿþÿÿÿ÷ÿ öÿòÿôÿ÷ÿïÿýÿÿÿûÿ üÿ ÿÿøÿùÿ öÿûÿôÿþÿþÿüÿüÿÿÿúÿýÿûÿ ùÿøÿñÿëÿòÿõÿõÿùÿöÿýÿúÿúÿýÿÿÿ÷ÿ ûÿúÿíÿóÿ÷ÿúÿðÿôÿ ûÿ ýÿ úÿúÿöÿüÿûÿøÿúÿñÿìÿòÿôÿéÿüÿ þÿüÿ  ÿÿüÿùÿóÿëÿåÿìÿôÿòÿ  ùÿÿÿõÿÿÿþÿ÷ÿ ùÿøÿüÿ÷ÿêÿëÿÿÿ÷ÿúÿúÿûÿ òÿêÿæÿìÿôÿùÿ õÿæÿîÿóÿÿÿúÿíÿôÿ þÿ÷ÿøÿþÿûÿõÿ$$ôÿçÿðÿÿÿýÿüÿþÿüÿøÿøÿûÿÿÿûÿûÿüÿûÿüÿøÿùÿ  úÿñÿèÿäÿèÿîÿöÿüÿõÿìÿæÿåÿêÿ÷ÿ '$ôÿðÿñÿóÿöÿûÿ    øÿðÿèÿãÿÞÿÛÿÛÿÝÿãÿêÿóÿûÿ  !! ÿÿöÿíÿåÿßÿÜÿÛÿÞÿãÿëÿôÿþÿ#%#þÿóÿèÿßÿÙÿÖÿÛÿäÿïÿùÿ þÿõÿëÿæÿæÿîÿüÿ $%÷ÿïÿëÿëÿïÿ÷ÿ õÿìÿëÿòÿûÿ  ùÿðÿêÿëÿõÿ÷ÿäÿäÿéÿõÿ óÿëÿîÿòÿûÿ  øÿöÿþÿ òÿáÿÞÿëÿûÿþÿ÷ÿöÿøÿùÿ  üÿöÿôÿÿÿ øÿñÿûÿþÿøÿ þÿ÷ÿðÿôÿëÿøÿÿÿøÿ ùÿüÿîÿöÿÿÿùÿ  ÷ÿýÿóÿùÿ üÿóÿðÿ÷ÿÿÿ øÿ÷ÿóÿôÿ÷ÿøÿÿÿõÿûÿöÿüÿ÷ÿ òÿúÿïÿçÿëÿúÿûÿÿÿ÷ÿôÿúÿ÷ÿøÿûÿùÿñÿñÿÿÿÿÿõÿþÿøÿùÿôÿõÿ  ûÿñÿüÿøÿ÷ÿ  öÿýÿòÿÿÿþÿøÿðÿêÿëÿñÿþÿ ùÿöÿþÿÿÿýÿ÷ÿúÿõÿòÿ úÿöÿ ûÿöÿòÿüÿþÿøÿ÷ÿöÿûÿöÿöÿñÿ ûÿÿÿùÿùÿ ôÿõÿìÿóÿÿÿðÿûÿñÿõÿóÿþÿ ÷ÿøÿðÿþÿ ýÿ þÿýÿôÿüÿ üÿÿÿóÿðÿôÿïÿùÿöÿ÷ÿõÿóÿúÿûÿòÿýÿ ýÿöÿýÿùÿüÿöÿóÿðÿïÿþÿûÿüÿüÿ÷ÿøÿþÿøÿÿÿòÿþÿ÷ÿöÿùÿ   øÿèÿëÿîÿùÿóÿôÿòÿ÷ÿîÿòÿûÿþÿÿÿüÿúÿùÿôÿòÿòÿ úÿîÿöÿ ýÿòÿöÿ÷ÿôÿúÿïÿþÿúÿÿÿüÿñÿîÿíÿóÿ ÿÿ øÿõÿ÷ÿýÿ   öÿøÿëÿõÿûÿñÿùÿóÿûÿùÿóÿòÿ   ÷ÿêÿåÿíÿôÿðÿðÿ  ûÿùÿöÿôÿùÿðÿýÿ úÿüÿüÿöÿñÿøÿ  þÿ ýÿþÿ üÿñÿðÿóÿçÿìÿýÿýÿóÿ  þÿøÿîÿñÿùÿøÿôÿÿÿõÿÿÿûÿðÿåÿìÿóÿöÿòÿïÿøÿòÿøÿñÿëÿðÿùÿ ûÿüÿøÿëÿæÿîÿöÿõÿòÿ  úÿüÿýÿùÿúÿ÷ÿöÿõÿ þÿöÿýÿüÿõÿôÿôÿüÿ þÿøÿûÿÿÿøÿ÷ÿóÿñÿñÿ  ÿÿøÿÿÿÿÿþÿþÿÿÿ  ÷ÿüÿúÿíÿûÿöÿûÿôÿûÿùÿüÿöÿîÿöÿþÿûÿóÿöÿúÿóÿúÿÿÿûÿüÿ ýÿïÿèÿõÿûÿûÿùÿôÿÿÿ÷ÿýÿ÷ÿüÿ  ÿÿ òÿôÿôÿøÿüÿôÿùÿóÿúÿòÿòÿ  øÿ÷ÿñÿûÿøÿôÿðÿýÿ öÿïÿðÿöÿòÿöÿüÿùÿÿÿïÿôÿìÿåÿæÿöÿ÷ÿüÿ üÿõÿüÿòÿüÿòÿìÿóÿ  øÿüÿòÿûÿöÿøÿòÿþÿûÿ÷ÿôÿ ÷ÿùÿõÿþÿúÿýÿ ûÿóÿøÿþÿóÿðÿùÿñÿ øÿûÿ÷ÿþÿýÿðÿòÿ  öÿÿÿùÿïÿôÿ úÿêÿæÿèÿõÿ ÿÿüÿøÿþÿþÿüÿüÿöÿöÿôÿ ÷ÿùÿ÷ÿîÿêÿüÿûÿúÿ ýÿñÿéÿôÿÿÿ   úÿýÿòÿãÿàÿçÿìÿñÿóÿëÿöÿþÿýÿøÿüÿýÿúÿøÿýÿ÷ÿþÿ ùÿýÿôÿìÿðÿòÿúÿþÿöÿÿÿúÿÿÿøÿøÿïÿ þÿþÿðÿôÿðÿùÿúÿùÿõÿôÿøÿ  ûÿ÷ÿüÿýÿ÷ÿ   üÿôÿñÿñÿûÿÿÿõÿøÿýÿÿÿþÿñÿïÿëÿôÿþÿ õÿôÿòÿüÿ  üÿøÿ óÿòÿþÿòÿ÷ÿîÿôÿùÿôÿöÿ ýÿøÿýÿùÿùÿûÿóÿõÿ  ÷ÿåÿãÿçÿóÿëÿìÿúÿÿÿõÿúÿÿÿ öÿõÿîÿëÿåÿôÿûÿýÿÿÿÿÿþÿ üÿþÿþÿòÿðÿôÿ öÿýÿòÿ üÿ üÿúÿ  úÿíÿîÿíÿûÿ öÿùÿóÿêÿ ýÿ úÿ ýÿ ÿÿôÿþÿýÿ óÿ÷ÿñÿûÿþÿøÿþÿ  ÷ÿúÿôÿóÿ öÿ÷ÿíÿõÿÿÿóÿýÿ  ÷ÿÿÿùÿ ÿÿýÿóÿÿÿûÿøÿúÿûÿùÿ øÿèÿâÿëÿðÿíÿ  øÿõÿ ûÿ÷ÿùÿöÿïÿÿÿ úÿûÿÿÿûÿ  øÿþÿøÿëÿîÿüÿÿÿüÿ÷ÿïÿüÿ øÿæÿòÿþÿþÿþÿþÿýÿýÿÿÿÿÿ ýÿïÿñÿ  ÷ÿíÿëÿñÿþÿøÿÿÿûÿðÿöÿôÿüÿýÿ ÿÿóÿöÿ öÿ úÿöÿüÿõÿøÿóÿñÿûÿüÿýÿôÿöÿ÷ÿ÷ÿ   öÿòÿ þÿðÿöÿôÿîÿõÿòÿ  ÷ÿùÿôÿþÿ÷ÿýÿôÿøÿøÿûÿüÿ úÿüÿ  øÿûÿôÿëÿêÿýÿùÿ üÿÿÿûÿõÿïÿøÿ  úÿôÿüÿûÿúÿ þÿõÿ÷ÿõÿüÿ óÿúÿîÿêÿüÿûÿýÿúÿôÿþÿ ôÿþÿôÿðÿôÿ þÿøÿ÷ÿüÿíÿùÿ ÿÿûÿùÿûÿíÿíÿðÿ÷ÿöÿóÿ ýÿôÿûÿ  ûÿìÿíÿøÿóÿôÿîÿóÿùÿñÿñÿþÿ   "îÿóÿñÿ÷ÿ÷ÿ÷ÿøÿýÿòÿýÿñÿýÿøÿøÿüÿ    øÿæÿìÿêÿâÿûÿøÿüÿ øÿóÿíÿîÿüÿþÿûÿþÿüÿúÿûÿøÿúÿõÿ ýÿúÿôÿÿÿøÿûÿüÿ þÿ  ûÿåÿðÿíÿçÿéÿúÿ  ùÿíÿñÿùÿûÿþÿùÿýÿùÿýÿýÿüÿíÿåÿóÿøÿúÿöÿòÿüÿôÿûÿòÿõÿöÿ   ûÿýÿîÿåÿöÿòÿòÿùÿïÿúÿðÿ üÿøÿøÿûÿöÿùÿ ûÿ    øÿùÿòÿäÿçÿþÿúÿ  øÿøÿþÿ ñÿüÿïÿæÿêÿûÿþÿöÿÿÿüÿüÿùÿúÿùÿõÿ öÿíÿòÿ÷ÿúÿôÿ  õÿðÿòÿöÿöÿñÿ  üÿýÿöÿÿÿþÿðÿñÿìÿ÷ÿòÿôÿñÿ üÿýÿùÿ ôÿÿÿúÿúÿÿÿöÿ úÿôÿ öÿüÿòÿæÿèÿûÿÿÿùÿ÷ÿúÿùÿúÿ ýÿúÿþÿûÿýÿüÿûÿøÿôÿôÿñÿðÿ ÿÿ üÿüÿÿÿþÿ þÿ þÿðÿòÿ òÿèÿâÿçÿóÿ  øÿüÿ÷ÿéÿîÿþÿüÿÿÿüÿøÿýÿ   ôÿðÿòÿöÿòÿðÿ øÿ üÿôÿüÿüÿôÿñÿ÷ÿðÿÿÿ  ùÿóÿòÿíÿêÿôÿýÿþÿýÿúÿùÿùÿ þÿüÿïÿþÿöÿüÿöÿøÿ üÿûÿùÿùÿøÿðÿéÿêÿôÿüÿôÿÿÿøÿýÿþÿ÷ÿýÿ þÿúÿòÿÿÿýÿöÿïÿôÿóÿôÿþÿÿÿÿÿüÿøÿùÿóÿöÿ úÿèÿæÿíÿ÷ÿðÿïÿýÿ ûÿýÿ ýÿûÿýÿóÿïÿïÿùÿòÿøÿ÷ÿøÿóÿ ùÿüÿÿÿúÿþÿïÿòÿðÿúÿ÷ÿøÿõÿõÿúÿ    õÿèÿçÿçÿøÿïÿõÿìÿüÿ üÿðÿûÿùÿýÿùÿ   úÿñÿüÿ÷ÿûÿ  üÿñÿûÿìÿæÿéÿùÿûÿýÿõÿÿÿøÿûÿ ÿÿòÿëÿïÿÿÿûÿ ýÿóÿðÿ÷ÿ  ùÿøÿüÿÿÿüÿöÿúÿôÿöÿ ÷ÿöÿûÿðÿþÿýÿûÿôÿõÿúÿóÿøÿ ÿÿúÿþÿþÿïÿôÿíÿüÿ÷ÿøÿ÷ÿõÿÿÿýÿìÿøÿøÿñÿìÿûÿûÿøÿúÿûÿýÿ ûÿñÿïÿõÿþÿúÿýÿúÿöÿþÿùÿðÿåÿàÿßÿüÿøÿýÿ   ûÿëÿüÿõÿ ÿÿ ñÿõÿòÿùÿüÿ÷ÿùÿôÿ ûÿõÿýÿýÿöÿëÿîÿôÿ!ÿÿ  ôÿûÿ÷ÿäÿúÿãÿÝÿáÿÿÿýÿÿÿïÿøÿþÿúÿ ýÿ òÿãÿòÿìÿÛÿûÿ÷ÿúÿùÿ õÿüÿ ùÿöÿýÿ éÿïÿùÿ  Ûÿëÿåÿ ÿÿÓÿÛÿÝÿöÿ.+íÿßÿðÿ/ âÿæÿòÿðÿóÿôÿõÿíÿ&$#éÿþÿîÿãÿðÿîÿ%Üÿüÿßÿýÿ÷ÿâÿ$çÿÓÿþÿñÿ3 Óÿïÿïÿ ÷ÿüÿøÿûÿ ÙÿõÿÜÿãÿàÿùÿøÿ(òÿàÿéÿçÿ & ßÿóÿõÿñÿ ÷ÿþÿüÿ÷ÿßÿãÿæÿ)íÿ÷ÿ íÿÿÿóÿ ðÿüÿÿÿðÿ æÿ$üÿåÿéÿõÿíÿ ìÿêÿ åÿùÿ õÿÕÿðÿøÿúÿøÿçÿùÿüÿÔÿãÿüÿôÿ %õÿãÿûÿ ìÿíÿáÿõÿæÿ åÿ Ìÿèÿìÿðÿ!Þÿÿÿéÿäÿçÿ#ùÿþÿëÿ ýÿùÿ#ëÿýÿíÿãÿöÿçÿ%ôÿêÿïÿãÿ æÿåÿëÿèÿ üÿÿÿ×ÿâÿøÿøÿ!!òÿÞÿÛÿùÿðÿíÿóÿýÿùÿ+õÿ%áÿîÿ-!ìÿáÿ ïÿúÿéÿäÿþÿæÿ$úÿÛÿ# ìÿ þÿßÿìÿæÿÝÿçÿÝÿðÿôÿøÿèÿ%ùÿøÿ%ýÿäÿøÿîÿÙÿ÷ÿïÿýÿýÿùÿ÷ÿîÿèÿ øÿ÷ÿ 'üÿòÿõÿùÿ×ÿÃÿíÿ üÿòÿôÿàÿ#èÿÑÿ ïÿòÿ òÿûÿýÿýÿõÿýÿòÿþÿ-+æÿ ÒÿÎÿÿÿìÿ%)éÿçÿðÿúÿôÿ, Üÿäÿùÿúÿôÿúÿ*îÿ !Úÿïÿôÿòÿèÿïÿäÿ-öÿóÿØÿüÿÜÿðÿ  ûÿÙÿÿÿñÿãÿùÿ÷ÿîÿìÿõÿõÿøÿöÿÿÿ éÿ ýÿçÿüÿéÿóÿãÿæÿýÿúÿ ýÿêÿ)éÿáÿÿÿ&áÿõÿðÿ !îÿòÿìÿ ÷ÿîÿöÿûÿõÿ'éÿ åÿ$ æÿÞÿêÿíÿñÿ ôÿûÿÌÿéÿ&÷ÿéÿûÿèÿûÿêÿ 'øÿ íÿîÿúÿûÿüÿüÿÑÿíÿêÿ äÿûÿ×ÿìÿ*Ôÿÿÿéÿßÿ,Ýÿÿÿßÿûÿ îÿûÿØÿåÿîÿõÿøÿ%ïÿ øÿÞÿòÿ åÿßÿüÿÞÿïÿôÿ(ëÿöÿñÿùÿ úÿÐÿüÿýÿ(üÿöÿöÿüÿïÿãÿÜÿ ôÿëÿþÿýÿÍÿÝÿ  æÿÿÿïÿÛÿ.Þÿ ÚÿîÿÝÿíÿïÿðÿñÿñÿøÿÙÿßÿ éÿàÿøÿöÿðÿúÿ#îÿûÿàÿêÿëÿïÿ& úÿîÿ  òÿûÿ ôÿßÿíÿ øÿóÿûÿüÿÿÿöÿ ùÿ ãÿæÿõÿ ýÿòÿøÿéÿþÿÿÿíÿðÿýÿ ûÿêÿùÿþÿöÿ ñÿýÿóÿ÷ÿ÷ÿõÿ ûÿ ÿÿñÿýÿ÷ÿûÿöÿúÿ ûÿøÿ ÷ÿòÿøÿ ôÿùÿñÿûÿùÿøÿúÿ ÿÿþÿúÿôÿøÿúÿúÿùÿøÿûÿ üÿùÿþÿúÿúÿ õÿ÷ÿõÿþÿ÷ÿ ùÿóÿýÿúÿøÿóÿøÿùÿ ÿÿÿÿöÿÿÿ øÿþÿòÿ÷ÿ þÿ÷ÿúÿþÿÿÿòÿýÿñÿûÿ üÿ÷ÿöÿøÿ öÿôÿüÿüÿùÿýÿùÿ óÿòÿýÿüÿùÿøÿ÷ÿýÿ ýÿ÷ÿñÿûÿüÿ ûÿÿÿøÿùÿùÿ ÿÿðÿùÿ ûÿñÿøÿøÿûÿ ýÿñÿöÿÿÿöÿýÿúÿõÿ öÿóÿÿÿ ûÿÿÿùÿþÿùÿüÿÿÿüÿ úÿûÿøÿýÿ úÿÿÿóÿüÿùÿ  ùÿÿÿõÿùÿøÿ ÷ÿüÿþÿïÿ÷ÿþÿùÿüÿ÷ÿýÿ ÿÿóÿøÿ÷ÿýÿ úÿ üÿóÿüÿþÿüÿôÿüÿüÿ÷ÿûÿúÿùÿûÿ þÿþÿòÿöÿýÿþÿþÿ÷ÿöÿ þÿúÿ øÿÿÿòÿøÿ ûÿöÿôÿüÿ ûÿðÿøÿ øÿøÿÿÿöÿüÿ úÿñÿöÿ ùÿýÿâÿíÿóÿôÿüÿñÿöÿüÿ íÿúÿéÿìÿ ûÿõÿ ýÿÿÿ áÿÜÿõÿþÿ÷ÿúÿóÿÞÿ"òÿÈÿàÿ , þÿ#ºÿºÿîÿñÿ)õÿáÿ óÿ þÿãÿ ? çÿ êÿâÿëÿüÿßÿ1 äÿ·ÿ#Âÿ0'úÿ'¼ÿ ×ÿ³ÿ×ÿ¼ÿüÿ=àÿúÿY9ðÿ131Õÿ ŽÿC±ÿóÿùÿ’ÿ–ÿ Ùÿ'OÎÿÞÿéÿÞÿ6a$A¤ÿ9ßÿ’ÿÞÿ] úÿ‰ ÿØÿ3 ÿÄÿÃÿ ÇÿÅÿÝÿSñÿØÿõÿþÿÖÿOŒvÿN/9ü焈 «ÿyÿ"ÿ…ÿ,ÿþIÑýmþ• ÀrjöOÿrþþhü©ú¾úòûÍüý9þy|úœèE%xµÿ’þiþþ×ýþtþ1ÿµÿÛ;[…3ò ”÷ÿQÿ"ÿÿ6ÿmþ4ÿlÿEþ˜¶€ûÀüêî¯?Š #IüVû{û·õ¼ñóöø‘øüB?n _ û2$ÿñü;û¨úLû2ûsûÿýŒé ÍL\-ÿ;ýÿâý­ýÜûÞþˆÿü$#ö«ù MÏ õ Ffgú‡ö‚ô8éyÞjáðèë¸íåö ŒßXû Oþ÷~ô»óXòŸñßóŠúþÛþnÐ " 驹q¿Åþ†þ‹ü]øðø™øü ù\ù&ˆt÷þÄ €‘ äžû%úÓòÇâ¡Ý*â1å”ãZé‚÷ÂèÉ ¦½êKLsÿùöúïëFíZðóö¸û3-ä q mÊ ' ¸nqfþ–ø‡ù}õÂöžó!õÚþûùùóþÿÅ ’ 6:~ÕîeNójäFäRáåÚÐÜ[ä\îZõxüv × )"i"ÄJ ?ãú0ñOïéë¼åwåíðVóàû:ÿ  B÷„¾o × „þkùkøDíðëõ¢íõë öË<Ð „Þ±ª Úü)ö¯òçwÞÅànäíâRæûôý© wiÿÚÜ»] Þÿø~ñ0ðÛê²æçë®ïóò ùm¾ Ò6oÉ\ J $ü”ùú‹èƒã¶ìïHìàü >ÜÝ_ÅÖ êü/ñ—êÇì±ê$çCíÙó˜ùêüð%ueRØ D–ý„ù õTñãîÈíòZñöOú†ÿAD ´ ~& mxT†ýñþ—þ[ð€ïQöÓøãóêr à “ ~ÃÁþ}ùwöIëÚè íéÔë%ó­ù8þ›¨ £h%©œ 5uþŠú¦÷óïòEï.óWôdöÊù D*V ¶ Œ ‰  ËHý·þB„ôòêùíüÁõs™ D 3 |  §\ýêù¼öœíïîˆðaïÔñ˜øÅüœcÞ ßƒ8Ÿ&>W«"ý¯ø5÷ùõïóö1÷éøýÿø»S.?t“ÿ="ûû”þöxôþA©ýÐ4² Êå ܯüöùG÷›ðãî¨îÞðZô3øþs¶ 'Ÿ@Œ = ó‹ÿZü÷mô¯ó'ó½õÁ÷­ú›ÿž@ ª‘ _Rà:›ýµü£ùúÆø/ùþ™ü‰ù2ÿ@E ~¦ 0Ýé÷êóEó”ñïmò[ù:üØþQ ( î nÒ 5ûäö~õ%ôô³ö­ùºü¼^ — “ [KÖ;þ¬ûìøð÷Äø†øÏúêü ÿVÇ _ þ¥3ýßùû¯÷Ãó¹õÒøÐùTüë×T|ï  ´Ï:¶þ„û{ùÀ÷ ÷žø¼úüÿi¨õlÌ¿Q¸-­üÅùºù!ú[ùEú“ýqÿ-椾Š3ÔÀýˆÿÈþíù4ú$ýçû¤úßýÆRÿó—#˜“ùÿWþÄþ´ý–ûüDþþàýyc 8ÂÆÓ`«ÿ&ýhýþTüØû~þºÿ4ÿ×îpƒ¢äçbþÿóoþ­ü^ÿkýþ˜Äÿ{þòÿ."yÿ×VÿÿžÿóÁ5ÿÁÿÈ®ÿ1ÿAIˆÿòÿœ2ëÿowíÿìÿ+Úÿ¦ÿãÿK€Üÿòÿ ÿ?þÀþ–ÿGCÉÿéÿ;Êÿyÿ-ÿ ÿüþ‚þ'þFÿV‡àN*;ê) ùt‰™°ÝÔÎþçýEýiüÓûˆüSý~þÌþËþ ÿIÿ¡ÿ;ÿGÿ}&vï{¡çEá[&ðþ‰ÿKÀ¸<)ÒþãýÙýYþWþYþþ—þþ¡þNþÕýËýTÿ7ñU*›/‡C7—ÿ»þ¯þÕþþ­þÿ“ÿ·ÿ@ÿQÿ2ÿÿÖ1MæÔžÿ ÿLý×û÷üDþïÿ…f2j”P+ª_ýÃûöúüºþ^ƒÈH’ÿ}þýûJüìýýþŒvÊ^ôfäÂÿøÿ›ÿÿÍÿäýtþ?¯d¤vïµGé­ÿ4üÁùfù ú²ú?ý4€à2ÑþRýÐütþ×ÿBÿ<þý!ý8ýßüÿÜÏ~ÞA¤€ühø¨öÑ÷Hü½Ü{Úkî8š6 þ%ü7ü‚ýþÿ­þÌþ ÿ×ÿíÿ_ÿpÿ¢ÿ1ÿôþîÿ?,²¾ç}ûo!þÂúKù7úqûŸûÇþ¾: Ñ †­±ëýYü!ù—øÅüJ¸leS¾ØiÐÿ_ù#f8ÖJþÂýæúø‰ö.÷5ú›þ€£{ô—ÿtþ{ÿ[ÿýeüæŸ# V : ûõùôŸù×þBqj€#giý~ú ú”üJ†˜ Ì#<ÿoþþþFþ@ÿ³ê!†Jÿ‚þ„ý]þÄþqóÿ-Âr¡þiûÒþ« m `Ö÷rñµòù8¤”ùi†6k'ý®ùFù§üÙŒåexVÿ´þÃþ ÿ:þzýaþ±¾5uþŸþRÿÚÿ¨þÐÿcÿ©ÿ}ýüAù ÿg n-5òEê(î(ø mÂþ²Bé2û£ö÷Zü,iJeTµþiþ­þ¶ýuü¶ü5ÿCÀe”JþÜû ü[ýA)<á-ý]üûjõvþäƒW˜ëñÝßá‘ñ P AgóG t0ú ð:ð—ø˜Ãçqÿüüý=þPûfùúü²Íîäåý_ù}ûýâ¯ÿÎ"ý:Ôi÷àí¾üTu+'@-ÝÑÇ(Ïyì×ç([k – ¦wôaæÇåRö­ ƒ3 vÿÆùúÒûZúwø ùãþbÊ à w3ý&ù¸÷ û­ý+ýDoE/ ï EðÐÝÃú‚-)J‚?; ¹Å¡N±%ᦠ» ð®4ìÇØ§Øtí–&l&ŸõþNöÏõäú½ø"ôñøÕ È ‘õ1îl÷¨ÿ-üH~Ÿýp ãò ̈ëò7Îe=]BF²€+Š#Öº^1u-íUb!& ½áÄÁ¡Ãé4@4=ýømåÓæ“õ4þÿõ:íõÜ Ø%v%{öרØþòG g = ” ¿÷œ ´)ìPÍÎñè=çeâ[xK«€†Œ¬Þ¯º1(x* $"V /Ûl¿Æ¡ðÉ*G%5 ¯ïÄå½é™øüró‡õ³×š!ež§ä¶×æÇû«®Ç eÿ&òa¼äcÇ@÷zHƒnË_ä-›€ßºál$Œ6&B Š—%'Ôš¾>Ì‚þâ5ô@,y›æLáÈï$;÷¡õ&úb @Ðã$ß:äÌ9 –‡ü=ôS_±çÇÔnSñl\–ü©€Àýò2+ï9&UÿŽ), XØ·'Ævý¥8úL,-6ú/àæâ”ôŽ Ûòí/<¥Qˆý.èˆÞaò"]S Ç3ýUñ©ÃÙ ÊNÆUçn1V9lj€ ’mî@2D;2¿ ÜûˆÐ „ÜËÂOÇ`ù¶2ôKÇ9<ôÝ#Ð äÅÁŽs÷ºr +C¼râ¿Ö…é«Ü1UÑ÷cçXÞ ÌÖ2Ô£Q¹n ]äýù‚€xäèª-J&7¥hýŸØûÁNÎäû48ÿLé4ïŒÞ$Öëâ•úôŠ;Îý¥¢²Šþîä@ÛæäÙþ®y}×üxìñ ÍÞ5ÍE×Y&kU!ýˆ€»!ò_+äDÃ=·mæ{ÓÃÄÞÍWöþ3eN¥:&Œà›ØaÛHýÏ ”å›”eÉèæÝTá¶øŠ =DرíË »{ÐJÑ£á\åpW-ø¾ˆ€K‚àâÅ%FECV*](›ëü3× ÀÐ1ùú-÷PA4¡àÕ5×fïYo¢_ ±Ç Þï`æÜÑë,ÿÕ¿ãYÜþ¡É Îík[‹g¬U¥÷m€¨2çr)J}Cñ{ ²¤èzÑ©Ã@è! IØF"÷†ÕÌê[ù ã­ÿ–Ž EÈæÞßNþf—)h òÓÆÎ°¶[—l Søî›„€ˆ‚ÊÞ?*øZLS¾ÅûÝ6ûêêÑÚcÏÇñ¥89{=ó!‰ÿùÚ£Ógáðøb T˜Ê œü»õ¦éþð—ô[ù "Y&íP×§ N¢eWÁi€€ÉÆ aeIh_5;³îwçê_õÆîhè™ì'À*—2¦-ydé¹Í Ö ëàú,+!Ÿ)‰fýÊýe÷ýójîùÞ+ ðæêY¤[…hOXûªŒ€€‡¾ð¹Udo@ú$·ý*ïíëÕáúáñÙ¥ì­ ­&nC#7¹ênÔÙÌ4׋ûÜyÙ…bÚÿÙûç’ðíVè òhïšâK»Xql|YòñE‰€€R„IYZ3<»¹=üJñãÍvÕvðƪ=;D}-¯âàðÓNÚñZþÒÇ f¼Ñ“÷œâaíäë%ånªðyåh¥`ÿr„]ë瀀€bή;HƒE•4þ/Gp•è=Ñ¿À’ÌEþýŽ>g:’([‚èšßúßÜã|òU%¯Û!ÒÌÿ{úFàAè ï³î¯ ¤oâÛæ¹f†yE]\瀀€ËŸ)8q5È9!A¨*¦ëùǵ™Ðxt":K0 öÖê à9ä›ëún WÏ!™£þéó„à<õäòXïXÊèìá"!6gB«Võ⌃€·ŽëÈ>÷Ò€%ð:ùO•Gé$–êD¶z²!Ð]öaˆ1 2Á(ÇããñÀÜÕÝoìeí+#-"9R=ï,ï«íÝÞ¶ÕãƒèH ÝbJz Yúús™€ƒ‹ê³®åkm7žNRu)ùËa¼ÎÉxçV ¬2"‚'è' xþlíÝÚÙçô›j£»-šüSìÞúôà¨ì2U@u=b& ¬´q‘D‘Ä®:Îiçì)+TÊVÞ>o *ÝeÈ¥ÅgÜëp_'Ø3A(ÔöÜá¤Ü™ÞÊíLõD‰Wƒy¯ qüèâ¾ü>ï Ù_àºFE‚pïfç (Õ찟짺»£ÏIí­-EèPÉFµ)¢þ.ã­Õ ÎÕ'çG7t*q2•'üü•éíÝÝÞ7é¯óøÿí —±¼úµ™ñêÑfÒcø>3äXÑV”#@éTͽ¾\ÁÄ}Æ×ºûn&BA/Bù-%Àú¸êjãyäµã°î¢þ® Hß ;, {Yù ò°íëäñšúNþq1 $ÝuÿÄ l»áÃß9þƒ'¼D<‰‡ãcÑèÓŠ×^×רÞ\õÄ…%2+² ³ ü*üøõµê³ì(ö@ü™ 9ð© m 3zúþUýäöƒö¹ö€øÔcƒ éû˳ qò$ꮺ!A34+´ 5êoÝbäÑäòâËáaÝ^ééÿ–ãqðç YÍþÐúJöOñNôúË«™¼× X^ýc÷mùóú¿ú©üþ\øÀ2 lù/ð»åâ#ªH ÒóÀí9ò„ðiêyænã æëõ 5  g  Ò£” Àÿ³ù–ø$ú.ú\ûtüðþ„i‡4/¼]ÿÅý(þ›æýÈûuÿ®ûXе÷ðéG&% 2}'-óïã·ê#ìƒâÝÝßVæø ß]iå ñ E¯¹ö‘ðô®ù±úØý —CÆ kYý›ûÂü,þÜú®ûRýlÿ6JÏ ÏòˆâÏýd-ï=~-níåÛÇãúå!ÙüΣÔçfZÿ (H[öÛÖòèöíš÷&ømýwÛ Én ) üL”ÿ{û3øôõWöæøØý“üf9ÿ¥ õîØCøD*EÇ@çï]Ó`ÖßòÓýÄ€Ë àµýo$P6á&N&§( ©;îÚ¼Ü ò,Å ½ ø ½ d9w åý¡ö:òŠðôgùÒûàÿ õþå‘ÂüKe 'è(Ì”ò?5XR3,‹õ[ЯÍ&ÑÝÁIJ˜¹ëÔ—ÿÖ,“D€T&Z49ý–ϣˎÏÁٵÎ÷º)NGÖ@?0.$íÉõÞâ?ÍÍPã`ûmûü·²´øâéƒäùäˆê;óYûEšýK° k˜÷£ïøýÜá’Ñbùü6dX‹T2|úÐËÍËÔÇÇ,·C¸åϼø}+–I…@ò(f1Ã Ûø­ã6Ï É ß¼ÿýgrj¥gÈ æ1ۺ߮ëq÷0ÿ¶» [®……üôñBèšô9<ê(ÙÉû·2ScW‚:;ÿ‚ÍOÂKÊȽ¿RÂÒ—ñÙùCŠH6?"‰(NöYêÆØô;×Äî¿:Ù&c!þ`aI¿øêfÛhÝ·êh÷¦ K] Êÿ ™øiñ3èvñ”«ò¦ä'ýp(*HT†?µ¤ÒÁjÅVÈUʕͫÒèGp:aH?”&‚ šø²ô ñ'ä|Ø™×ôä ýp&È'd[ÝýÉú&ðiç|âžæGô |ÕÕ½ ¨ ¬¤û>óåðîôíYýZ »ûŸîä”#G?vLf= ÛÙLÁ`½¼ÁCÌYÖëÚ=èL‹,|?õ?,2Æù°ð îwç)á¡àÍä•ñ* œÂ%3#Ž" ÿ/üøï‹ç3æoêíôu½RTXÈÍý’ôbòaðøìEøF¼|ù9’-|>Š<Ž]îÁÑ_º¾•Ë·Ù$ßlçrú™•%˜58Ÿ(î.ÿšñÈèâçé‰çGêrô$¤˜š ê”™³üQ÷ßó}ð£íÐìŒð#ùBw ÊŒ¹ m@óþÞûæ÷óõõ_øíñxïìü3+‡;º7÷*ûãWÒ#Í%Ò*Ö8×EÞyî:Ô¥.3ü("Ø îÿ½÷wòìwäšã0ë¹÷@§Ö× C ÷üõð•íïYôÅû ß ‹ n ª îÙÿúøôc÷òúPô:îƒ÷à n 3P4 sÙéÒÚ‰Õ•Ù´Ü×Û3ÞéÜù­!œ+¶'ôv´£ÿcû±õ˜îÞèÀèëíƒøY$Χq ¤ æÁ¾ûSõÍð\ð’ósùÿí„1Ôm ‘øý[üÅûèòvìJõɳï(&(݆\ððå»â»ä[äÕ߯à%é‡ö‘ÌŠA/Öû >ÊýeöšðXî§ðVööýGN êN K Ï­?Üûwø¤öb÷½ùiûŠþdC5Æ Ù°¬þ©ÿç­÷‘ñÏù[Èd%#´û×îÏåHäòèªèïä>ç=ïú̺VKÁ ›ð¸cýlö«ô“ô»ö÷ý€Ü>› […¦­ý~ûÍú±ûsþ7ÿ_þ§þÿ(œ³pÁü‰LòùcôHüÌ ÎV"ÐÒ îöÌîëÆê«ì9êÏåé ôtÿp ˜Îñ t  ¤·G›ýÞø_ø\ú6ýršÿ=È@ÿÝüCýUþhÿËÿ-ÿ†þ…þlÿ” ÜÿÈÿ÷ý›’‹ûûõ¯ý! \žÊ¿÷­õîô¯ôfóWí&ê ðóùB5éáiÂîÕ²­Õüý®ÿ(ôþdþÓÅçÜèÿÿ‘ÿÏÿ·Å©þÞý;ÿäÿËÿÖþóÿÖ'¢ÿHý˜qÄû\ùèþC uþMûNøê÷K÷óí¦íoôkü‘íX+ çv|Pþ¥þd²Šíþ¸þàö›/ôÿSÿb“]Nÿ<þ$ÿ(°„­ÿÿ€ÿ÷ÿqÑÿ<,ÿØþ5°éû­ùJÿðU¸‚ ýüiú¼÷Pó¤ï4ñè÷ÕýÄ•Ú#x N™ÿúþìGÔvéÿ¨ÿžo9•ÿ½ÿ‰öºÏÿÿþ›ÿA6¥ÿÍÿŒÿzÿï«4+ÿËÿoþ?þÿoÿ lóûrú!n`Ó 9´ÿÂþ|ûÄöóñªï¹ògømýMþ ÿ¥ÿ#ßüâüÿ¿™ %óÿS2ÑZä0’èÿ<ÿiÿa~ ÂÿÉtýÍüšbýÿÿþÿþàÖ8¹þ[ÿ“‚ÿSþˆ}"ª‚ýKqÍÿiþfžûüýýÿÇPÿuÎýÒÿ‘ýþÈýKVþïýVQýÞðü¾ÿ÷þ¸ü˜û›‰ýâüý?$þIì”þ"ÞüCžý×Ìû„þÿ5kéþ·ÿ½þzþ WlýZôü@û¶‘þ€F®ý¦˜ûjÞü†ÿ6þÃÿÖþH©ný+$þfaüFþlÿpÿ<ÿhÅ\ÿPþ þöþvÿrçÿ> ÿ®fÿÙþÿÞýº@ÿ=þ8Ãþá Äü^±þI2þ¢7þ^Ðý|^þZËû–•ý†{ýMðþ²#ÿeþtYý¹²üÒ2þжý¿õÿ”a»þ±;ÿ°}üÐEû•tþ£byýà"ý,íý'þלüjQý÷²ýâ†ý×ÿFÁþýÿ®ãþÛ+ýhüÀðù2¶ýü…ýb¦æü«Ñú  û)áÿ)FþòÿÅÿ0ŠUÿýüØÿ7ÿUoþaºâýprü,û9ÿ¼Nüý&–ý¡ÿþ3mþøþuùû–øWúRûßpÿçÿJ{€ýýîþØÿWþ—OVöþþAþýuŠÍûÝÏûÙºúôÊøIJÿðÿVžùéø­qüƒ¹ý:äÕ`ýïý½þƒÔªŸü>œþ@DþúýBNÿÑ*ìþ,üwþ ôQü.Ñý×½ú$;ù íývûÖjþ½Iùœ ûK{û!Üù>¿üyfûýWÄù®«þgþÍ÷üAzþˆfú©üŽþ7jüªùÕkù>÷$Çú ·ü«ÿ¡¯údËýÜý&þ³  ªþ$ÿJü]áý§{ýNÇÿBþ—ÿš'ûÿ þ³¢þ3ÿÀýúH» ýº{þáüTsùuûvøÁ øï µ÷NOü™ÿVþóßþS'ûU9þànýÔþ¥þk/ÿ ÿ²Eû#.üOc‚øk‡ü‹þÿ0¨üŽEŽ$úó¢þÿü»¬îúb*þršùeâ¢vÿ°üâRÿ¸õøÄõ2éû¢þŽý?Ÿõrþ6ªýÿ£þªs ýÏ›þœ*ÿý’ú¡,³}'ûtzú<åûî¼ÿ÷ þ‹¦úÅ)ù=úô +ü ÷  Øöµù´ýþªþt`Ä–ýQOþD—øž²øÿ{ý‹þïü½Fü†‰Ø÷õ"ý>¤íüA5þÍý ÿ8*ý¬ÿýáD3þ'õÍ»û„Óÿé‘ÿÕ´&ÿ3‡ý·³þoàÿyþ8ºüÀGü”Xþ´ÿeü,ÿ+¡ûîúãÉù@[úŒ·ùoønÙý®ÝüÊÔýRÎÿªÿ~üÝÀ7üN¾ý…†ûL.û‹:ùvŒ÷|ü›ãú<­ûïÊÿ¶ÿŠhý1ý$“þ®üfþ³›F®ýÆü^ñúDû¤ýÑûýcÅþ—}OþS \ýF°þfÑþz{ú|2þlÍýQþ?‹ÿ_þÿi(þºSÿGý»êÿþ½ÿaþ gþQRþ}þSþÖ±ÿÿhþÀ0þfTÿéÿeÿ°Ž=?ÿñÿõRÿ1ÿ6ëgFÿZìÿ8ÿf ÿ«ÿ× š{ÿ]ÿèÿ±¸ÿ•ÿTÙÿäÿ©ÿ:Ž™ÿw½ÿ ƒÿ+d¸ÿðÿ7æÿSÿöÿ'fDoÿMŠÿžÂÿþÿ‚wÿ ÿÙpÿTüÿþÿßÿ ñÿöÿ°ÿôÿ' ,¶ÿêÿ@³ÿ5äÿêÿáÿ äÿC¢ÿhÔÿ»ÿþÿ$ Îÿ#ãÿ'–ÿnÇÿ5íÿóÿ þÿâÿ óÿ ÷ÿûÿëÿ åÿüÿöÿ èÿ âÿùÿøÿ Ýÿ÷ÿòÿ%Öÿ ôÿñÿüÿëÿ øÿ ôÿ äÿþÿðÿ#øÿúÿæÿ ìÿ êÿûÿñÿöÿ ôÿêÿ$çÿúÿûÿûÿùÿðÿþÿôÿ óÿ ëÿúÿ ðÿýÿöÿ ïÿöÿ üÿûÿþÿþÿöÿöÿ  ïÿìÿõÿüÿÿÿòÿûÿúÿùÿüÿ úÿõÿùÿ üÿ þÿúÿþÿòÿûÿûÿþÿÿÿûÿþÿ þÿùÿúÿ÷ÿÿÿ ùÿÿÿóÿÿÿøÿøÿ üÿÿÿóÿüÿ øÿþÿ úÿ þÿüÿñÿþÿüÿóÿþÿ ûÿþÿöÿúÿôÿ ùÿöÿüÿüÿñÿÿÿ ùÿþÿÿÿþÿþÿôÿýÿ õÿûÿùÿüÿûÿðÿ ôÿûÿ þÿöÿþÿ ÷ÿúÿüÿÿÿùÿþÿÿÿÿÿøÿüÿ ùÿüÿ ùÿöÿýÿøÿÿÿøÿôÿùÿ ùÿúÿòÿÿÿ±þ€ûÈuû ÿxhþÖ ˆêõgLûçüE$þOÿóý°Nþ<(OüWÿnûãÿQÿ(ÐûØÉ\û ÿÀûœ@þGýH\þýÉþcÅ‚þ Çè85 ýÿü«Üûv¥þ$¹þü»ýÑÿÔ~¹£ügÒÿÿþäÿþðú‚þ`þ¸BöÿÈôû ÿ>rþ/ÙûAbüÙ`ÿ>þþ§ÁGóýûüBKþ9výÂIþÞ Yî— ,ù÷ NÿÆý×xÿ•ýž™þT~úgü¾ú«¨ÓùÃÎúØU)  îÝðú0ú,ùþŽ–ûgÿq¡ÿ)ûûZSþ0ÿŸôüæ~ÿñýeûx$}Ðþbÿ!õÀý—Ã&ú;üû;uÿ]÷ýþä­ùsæû›ý>ù+ÇüKøOü´ÚòË Íþùsýpÿ .‰ÿ˜ÿ# £xŽºj;,^Xù³õxôúªÿ@ŒÔ¼Š!‹÷ëìŠõ†*W1 ñ·ØùÓ€ÛIèjðùäg\b\\Õú[ôyð¡ì;î4ózÿ( $½Rª9süé÷(òÜððôýûì( ШÐ_ûqõÙõOý£ô-ð@ûAÿ:HAÄ!¨ïÉt¾àÊ,ÛüésøM £ g.Ï*Rî…÷ÂíÈçcâÏäÓñ[T5Rvi †…û ñêØèÈðÿÆF E ( Ù ™"Zõ±ì”òöþïçÜü .ö[^'OÛŽ¬@¢µtÍîãÆ÷wœ5GG9@$$êéPÜ=ÓìÔ,ß:öp¨$É*ï&p• ûÆì&â¥Ûáàbð~š¬¾(íøö‹í•ælðjü³ðOí££Cdk·]éÇ`™t“{ª•̦îó ,H>Ps<¯óÞÓ–Ä/Ç-ÙWñ­>'1æ/£$–úIäÕFÕàô l(ˆ(0× î6ÝöÖÒâ~éôð,&¿JïC ™BÀiìUÑÿ§€œ‹¿¶žäHµJ5IýJì/ ÝÁ½ ÀÄÓ íÙ $þ0ñ7/¿ŸúÝQÌÝÌ·Ü&ùä,'|0=$ñÿœñ–àWÛ´Ú í½ü:.V/›ù§ÜÀDQq\b w¥€€­ª¿Þ,Çî1®KQ{:ýÙBµü¯É±òo5+A67`%@7ðê×ËNÉÇ×4ün ¥3G5Í!9 ô—áÝßBÜ4åójÖÂ"0‘pÑu¸gí@%zÐx((é¶€€©£ Öú2v$H¾ZO¶Ú ­Ú JÆêø¹’3C61†,I²û|Õ3»Ÿ¿nÛ v(ž<Î1×!ùñýäùÚþÚOÜÊó[?0°2S+QüT¾ï±EïÓFÿCwv,GÀ€€˜¦ÙÐ'ñ  â(O¸b¸PN*Õ„¤¦#ËÄõW$*9Ê6ê3â*¿3îÃÍŽ½+ÆZâÿ Ï.CÄM¤@’30+Šmö~Ë–§í¬Uß…MÄ\Á@–æéÒÕ)×ÇáÉötóX45ÉtûÈà+ÍÅЛë§Í´7¯ûñùÆå:Ý<üaêóÐ,àesw]Qèêb‚€€d˧$×T*R;4phÊ”÷]Ó ´º±xàõ&ß[†a<àýˆÊ%Á¤ÒÆì:„à ýû%«ù]ܽÐ!Ô¹ìäò#X%|rúNíúÝôIâúþBBá3íû-8iÿ‰SD退€3Çû RîS+::#·Í ò<ÒŒ¶‡ºãàH!QY;@ðÑ×ÐɵѠè6õ€ñ Ø .\"ý`àÅÐ©Ò¯ëŸ Ôv Ά Ñòº÷½ì†Ý6úíüêô|-§`bxŽR2ð€€€QÄZS¿NZ5* ‡Ë÷Î>¬Í´ ä&Ž[N^9êýaÕÊxÖ\ìëóf÷$d/68åòhÓàÄ9Ó÷ñe"k ÿ¡ôþôpä©àüö îòõðÝ oYîx¥Z'ó€€€íÂF!ðUÒN³19Râ›ú ÑŸ°ç²hß§#˜WY_¯9eòÖ%Ë Ô£è²ù–þïï{"Ÿ)#®ú,Õ%Ê…×böï  ªj*æü^û]íPßfù«é)îW'Ãcv²a·ú€€ïµ]K¦M÷7Ä*’"leþÑg®¬ÔÙ¬Q]]ÄD' !â Ó\ÒŠÜvð4÷:þ’›/f27!ßþ?Ú›É{ÕÄî@Xóþ7 ¡öUî½â³Ü™¦‚û]ñRMPx×p¾€€ÿ“™ö1D¶^¥Kâ-þ ’Qà˜¾>­ÃÅGw@&_ˆP˜#+ñEÔžÐHÜýéßózþÞ ²h+)xL÷ÚÕ«ÌÉÛÒòM UYç7u îùIúzë:á$÷×òÍç4ßSÿÅ|©+*°€€€¹Ø]1&[ÜWû>Ñ%T®Îè!ÇçµiÂæòO*^ªDãïâÿÊAÌ´Ú@ìû× Ÿä&')­%Üé)×Ò áþû¶I´ìIºÈ÷ïùjñ‡é`úíýò…æ4 :IyI|‚5…€€€(ÕÃ%ODMo:â'+ã@ïBÐE¸ ÀKå?ÙN½=k£ð‰Û%ÖÕÞ¯ê`ö¸a•'Ÿ, óôüÞÓÔá{÷¿ ÁL´@ÿÉþÐõtòîí<é’ÿö~ïÓ Â=Êcé`¨%×Ä€€Œ‘ÜÞ%KØGÚ3) —÷@ê´Ð¼ÀËŒïÒ::ÝB?3.ô­ßTÛvÝè÷ûëZY$ï oôvàÛüãJö­Ô¸ûÀ ññþÞ÷óë°î ÷«ÿùöðçkøø%žNS§•Í[‹œ„¯¯ñ@'89//;+Ñùhõ÷ÛT̰Ï`í]­5z<ý' uñKäŒáè—ñmúü² 5¬µô»ògçæžîÆùâP W ¿ ²Ìÿ¨öÐï¯ïaóWýë¤ sD±ÿIðÃöí Ç– w ±ëÓPÒÎãaüù4²-Ó}ÈÿÅõ—ìñìô÷m×â³Jüø|øšùÈúßúÕû“Q ¼ çüýÎ÷„öù‚ý†©[TŒ Ùÿüúhúxý¥Ç–D"åý°þ: »›ÞúO÷øüÐIK•c°^]ÿÙýýý¢ÿôTu2/‡þþGþ³þaÿùÿŽúnpü@4ÿþEþªþ¦ÿ˜PóÊ3…ÿ|ÿ=ÿÿ5ÿVÿèþÈþ1ÿHÿÿÙþ5ÿoÿB\}¦ÎCÍÿ4ÿ&ÿŸÿõÿš35LTE'A„têÿ[ÿIÿ?ÿuÿëÿúÿY’^äÿoÿ ÿöþæþ¨þœþ…þsþ%ÿþÿ®c…9¸”ÿ’ÿ¢ÿÿÿçÿÙÿõÿóÿÆÿ»ÿmÿfÿ+ÿÌÿ§eÈ)"_aÇšñÿiÿ‚ÿëÿ ‘mCÛÿ:ÿ¨þÿÿÿG=%ÝÿÀÿÄÿíÿÛÿÓÿþÿ-6F"JNM^æÿîÿ ÿFÿUÿÁÿ|kzßÿTÿ*ÿˆÿÃÿÑÿÂÿ$ßÿüÿ=ÕÿÑÿÃÿ_<i4s@ F1ÉÿÃÿàÿçÿÔÿæÿÙÿæÿÜÿËÿÔÿLýÿD]ÿÿûÿñÿ:4 Ûÿßÿ óÿÒÿÐÿàÿþÿíÿèÿ "ìÿ ýÿØÿãÿëÿ ÚÿãÿòÿÝÿ1õÿøÿ ýÿóÿõÿ ýÿæÿøÿçÿåÿüÿ ûÿøÿüÿ Òÿïÿãÿöÿ ûÿâÿ ýÿÿÿýÿ óÿëÿÿÿçÿÿÿ þÿóÿéÿðÿùÿñÿðÿøÿôÿãÿëÿüÿ üÿ÷ÿþÿÿÿìÿòÿùÿðÿ ïÿ ÷ÿ ùÿóÿòÿûÿþÿ ùÿüÿòÿ úÿ ûÿïÿûÿýÿùÿ ÿÿóÿ ýÿüÿöÿ ÿÿÿÿïÿþÿ ûÿïÿ øÿüÿòÿøÿùÿ  üÿúÿöÿúÿøÿýÿøÿþÿÿÿýÿîÿùÿþÿ ûÿþÿ ôÿþÿúÿþÿÿÿûÿþÿùÿ þÿûÿõÿýÿûÿýÿüÿþÿþÿ ûÿøÿúÿùÿ ñÿýÿûÿ ùÿûÿýÿ ôÿúÿÿÿûÿùÿüÿûÿðÿûÿ õÿýÿþÿüÿ ûÿùÿ÷ÿûÿ þÿúÿûÿÿÿôÿüÿ÷ÿøÿ òÿ÷ÿúÿõÿ öÿúÿúÿþÿÿÿûÿýÿ úÿþÿýÿ þÿþÿ÷ÿþÿùÿþÿüÿüÿúÿüÿîÿøÿ÷ÿñÿ þÿõÿøÿùÿþÿöÿûÿôÿýÿõÿýÿ îÿîÿ íÿðÿ,ãÿðÿïÿñÿõÿ %ýÿèÿ)*ýÿéÿÊÿîÿ,ÙÿÝÿéÿ5 ÙÿÚÿøÿ5 ôÿçÿöÿÑÿýÿ/÷ÿíÿb)Ñÿ³ÿ°ÿ_+Øÿ¢ÿ¼ÿÜÿE"Àÿ¿ÿ¢(¯ÿ°ÿÁÿ2O*¢ÿCöÿ,·ÿÆÿ4ïÿK% ×ÿžÿ ]DÂÿcÿ>ÅÿAÿ¦1ÿ§ÿt$ëÿÿ(ÿVC¾ˆÿÄþ8ÿŠÅB‰ÿÿ#ÿ’¨¡{lÿØþÿ\¢pÿ¹þ ] שÿZÿëÿkÿ‡ÿ—ÿBgÿMgYÿÿ´ýPéþÍþ·ÿÅ/fuÿ/ÿÕþ ÿDöàÿíþ@ÿfÍvÿnˆ‡IÿÅÿ »ÿñÿçÿ(R›ÿÿ:×ÿ@µÿ¹ÿ_áÿËÿ>yE¾ÿÿäÿêÿ½ÿíÿ(F{AÅÿ½ÿËÿ®ÿ[ @ÀÿËÿõÿ^A¹ÿòÿòÿ)èÿôÿøÿãÿØÿÿÿ#ïÿôÿ,ñÿÜÿ8Ýÿïÿçÿáÿöÿ%àÿôÿ2ÿÿ ïÿÛÿíÿ !Þÿìÿ úÿøÿÿÿ óÿþÿüÿ ÷ÿýÿ øÿõÿëÿþÿûÿöÿýÿ÷ÿîÿ ùÿ ÿÿûÿõÿ ÿÿïÿøÿ ýÿýÿýÿ úÿÿÿùÿüÿüÿøÿúÿÿÿ þÿÿÿøÿûÿùÿ÷ÿüÿøÿ õÿøÿÿÿøÿ þÿúÿýÿóÿ õÿõÿüÿýÿ ÿÿøÿýÿþÿöÿôÿúÿ÷ÿûÿþÿüÿÿÿ ÷ÿ÷ÿýÿöÿüÿ ÿÿÿÿúÿþÿ ùÿúÿøÿ üÿþÿþÿÿÿùÿþÿ÷ÿ ÷ÿ÷ÿÿÿóÿþÿûÿÿÿÿÿþÿ÷ÿýÿþÿ÷ÿýÿúÿöÿùÿ øÿõÿûžýÒþ¬þ=F&ÿzý o@üXhü^Hiþƒ™áô´ßÞÿ1Òü= äþÒý*þáÿë/ÿ]²Åûy~ýÕí $ý>ÿˆÿ¨«þKNýòþžüýcßüùWý+˜ÿg¼ÿöÿ6ÿÿÙüÒ8þN1þ½ÿèÿMþ“‡4‘ ýaÿ{ü=@cýd wöhý±þȧý/;üƲþL­ýˆ:ø>þvýqÆfþHáw)ýÉâþÍûɰÓüç‰ûÿü¾Lþšý8Yýýe2qãÙþR/üQý¬í¢ÿ]ÿ©þs>Óÿ:«Ú üøùÑùQýÑý?1ü¯ÝûÜYÿ²þµÍꞯ 2üâø¨ûCþ?þmüÕúI¼ù¶e±ýhÿ{üçþËf!Tvédþ-û'üôÿ]ÉþW®ýK÷K÷3÷zø- ü ÿûÿ„ÿÝþ’þJÓÒñœ¤ÿÿO´ôû²!þdü˜ü,€üÖÿÊU€¸”r€¯ £ðyû{%Héà 3- Kÿ°ùcû©ïÒåªæ‡èîpîKõüH Ø —©ÝÂtu #ûÇùÿô=ðõhó[òôµý+•Ä5 & ~ v/x)þ™øûÈ÷Ê÷öøPõMüú9ÿvõµ Ô1 /0È< hù‚òãðßà ×^Ú×ßíäîëžõÒRxå$ 3#\ÿ Íkò_ì2êÎï'ëîýò&Û0 Üà úÉÿáùØö×ó=õ8ôÀõò±Æ÷¦p ”õ] ¾ä¡Z­ÒCñòêí îFÞÏBÒHÙsã¹èüò@¤†ù@"k(É~± ¾Æú õ½ê9çÀéîéédòœY32 tœ#4¥kùÏôàöïöŸôÄ÷šötUûëƒ Qõô ./¤qNG Qòïñ8ïcàaÓ¥×êÖèçÝëþð§ý¯¥þž!•ñ­ Ò<êúšíŽê·îðmñ2ò ÷0 <Ê å¶{ F*ûŸæô{õ©öù´õ…÷;õù*ÿŠÿ% røsÐÐ ß@k¹f÷Lð¸ìáPÓÒmÔVáHéŸìÙüáT Íî!²ßY_fúÈò³î*ì¾îŒòBöäöþ£û ( ø 6 l ÿnEþCýRõÔ÷Ùõ-üùúú¼Ôÿ) 8–÷ÉO  ´¢5ÁùYòñ^âÇ×ÖöØ"æë¥ï ü$ë²k‚H -vú=ô‚ïçóñò³ôÍ÷üû±_“ Æv l3`ýûþ%ú¤ûæ÷JûÝùŸý9þ»éü¸ÔÿíÆ)qòsêB úf# íüâòÐðSçâá3ÜÎàê³óâõ=X goRooüÿ¨ýúõUôÙõ˜öù~þhþrz`R m'Üÿý,ýqúDûÄú·ý ýýÿ˜þA®þ‡ý ¦3Zóþ4 [ Æ ³ è Žýó(óíé åvæ‘ð×ø£üüþ/ X… ¼X ¦ šþ‰úÎüÂ÷÷#÷ªü÷ý§ xô=óSÖ.ýöû ývý´ü1üêü1…5JXÿ|]´Dø"þΔWØà b yüPúíö›òoð—î.ó ÷o÷òúÚe¤^ 9â ¶ £¹̺þ{ýsû¢û÷ü2üCüzÿ‹ÿ`ÙuëH®«ìÚþTÿ¥þ{þ¡þPþÈþäþ÷ÿÁþQÿ¦œ¼þò`]&0væ|ÿãý`ü?úÔùÃù ú®ù*û¿ûßýˆþ÷ÿÚ(ÒfHn”ꦬ±¦Àÿ²ÿ ÿZÿ.ÿÿúþBÿZÿÆÿœÿŠÿ-'=Z51U)òÿëÿíÿ!;Wg¡}F5äÿ²ÿ‰ÿpÿmÿWÿ[ÿXÿkÿÿ˜ÿ¢ÿÇÿÐÿòÿ 426@5C58*6(öÿÿÿúÿøÿ ëÿûÿöÿ÷ÿóÿûÿöÿþÿøÿýÿüÿýÿ øÿ÷ÿüÿ ÿÿ÷ÿûÿúÿûÿüÿþÿÿÿ ùÿýÿ÷ÿÿÿ þÿþÿþÿþÿöÿúÿùÿüÿúÿÿÿÿÿúÿ ùÿ÷ÿýÿ ÿÿþÿ ûÿúÿ ÿÿüÿþÿ÷ÿõÿúÿ ýÿùÿÿÿ ýÿúÿÿÿôÿúÿüÿýÿøÿ üÿúÿþÿ ûÿüÿþÿôÿ ûÿýÿôÿýÿúÿýÿ øÿüÿóÿüÿùÿüÿ üÿùÿ ÿÿõÿÿÿöÿ ïÿøÿ üÿ÷ÿ ôÿíÿøÿûÿõÿôÿýÿ öÿþÿëÿüÿýÿùÿýÿãÿíÿ÷ÿ ñÿöÿùÿúÿúÿùÿýÿðÿ ãÿ×ÿöÿøÿïÿáÿéÿ# ãÿíÿ  éÿÜÿ þÿðÿäÿóÿíÿòÿîÿøÿõÿòÿêÿôÿùÿíÿëÿA ðÿ$ôÿÕÿ'öÿéÿ/çÿØÿ ÷ÿ&:þÿäÿ¿ÿ÷ÿ +÷ÿêÿÒÿúÿ$!íÿ´ÿÛÿ-úÿóÿ. òÿÿÿ¹ÿ:àÿõÿéÿÉÿêÿ#yçÿåÿ! ÎÿÆÿûÿ>ÖÿÎÿW³ÿPîÿêÿ ÛÿÌÿ=2)ýÿ¹ÿ3§ÿÌÿ÷ÿ-2ÜÿëÿZíÿ‘ÿo$ÿ,¢ÿÒÿhÂÿ½ÿ Ðÿ7. šÿäÿH¼ÿ áÿ7 ØÿèÿPÿb/Ãÿ»ÿðÿA‘ÿ-`çÿÿÿÿFìÿÜÿQÀÿM‘ÿÖÿrªÿòÿY#™ÿüÿ Çÿ+ÂÿHÓÿ'ôÿ¤ÿLÉÿ7ÓÿIÓÿ ëÿŽÿÔÿšÁÿÉÿ_€ÿ Eˆ§ÿ_Uÿ›?ÿ6_ !qÿ)ìÿD¿ÿ¸ÿ¬ÿ,Äÿ\dèÿ»ÿ?4ÿa˜ÿZ«ÿy¶ÿéßÿÿs%ÿI+¬ÿ¼Bÿ6»ÿcßÿÃÿ¨Ìÿ0ÎÿÚÿ„ÿ½{ÿÒÿÎÿ]½ÿ6àÿVÿ¢ÿº¿ÿºhÿ+Ìþiÿ¼oÿqôÿáÿw?ÿ¿ÿ¨:ÿM‘§ÿS:ÿ³Íÿ)ÿà ÿ&Gÿ mQÏÿGpÿw­þ]ÿù ¥ÿJÿʆþ$ÿä¥ÿ\ÿA¯þeéþ¨¶ÿ·ÿïœþ"äŒÿXÿ“õÿÉÿ϶þ/éþÕ¿ÿ¡ÿЯþ“jþG)ÿ1ÿ+ÊþŽÓÿ5«ÿ»ÿ§ÿ¤]ÿŽœÿ*“ýë3þh .ü#þÿ=þÑ¥Iþ7½þàÿ©þ ÿÇl2ÿöÿ‘þåÃýB¦þjþÓKý½¦YÒÿ"+þÀÿœ{Œåý[°üßìþtÿ"ÿÑÿ7ˆ©ÿÿÅœ²ýÁþŽÿ²žú#ñý±ÿ˜‡ý Áý¤%þŠÿî7ÿÞuü >ÿ÷¹ÿùþêA­ü̱þÖþ«ÿ,þ‡÷þ-ZUþ¾­þCÿˆÆý¥þ×¶û<°ÿóýPýiq8üœ CÿxKûc#þÿÿØqûmwýÿ¢rýž\Mü%»þîþÕ¦üô¯úRþ•þÿ€þOýÿÿyÌþ]ýüÂÿÝüÍÅþp€ÿvü`Àû•ÿ`ñÿRÿÆÿ~¦ü™üvÈûþ,­ûþ¨û³æsü|ÿ-ÿó,ýy´ý–ÿ=³ý‘úhû¡nÿ€ýíþÊö?ÿzþx_5úÊVü äýÀú_Ký‰üE—!þœþ‘ÿ<;ýå,ýãbäþó²û ôûÚ þ*ÿáügÿ“–þmþ.üzYûSÒýÜÿ×bûê+ÿáý#ý€Q]ÿíýˤzùC`ý ÿEþ©þ`æý%8ýXšÿŒøøEÿFÿ£ûCü‹þ]úìþ9ÿÅ~þ`ÿtZü™7ü¤.ý1Çý›†üþþÅ5ûÅ’ø’NüQíW§ÿ`þÐý)þKAýª›ÿ$ÿªüÛüŸù4¯Æúž?õŸøzaýÍýFsþ£üÆLýæþþk]ÿ%K-ÿgýI3úþ5ã.ÿÎýÌêùPù³­ûO$âù¸þ“#ûÿ”’úi’úÄ8öüæüšŽûúZ‹ÿÅÿ=üeþñþô–ý”é÷ùõüé@úGdýâÙý1üø·m´üp÷ìüD¢Cû®kê3ÿûÈõú±ÿl‘ú«¸ûo¾Ð‹ýfÞùŸŽýŸ–ý§û`ÑIÿÙütþüj¼þ™üïÿoYÿêû1bý>¸ùèú¸§aiÿ#ÿ ýrªþüÔøò”ü鹓þ¨ÿ€ýŽ{ýSÿ¶\ÿu|û«Îø˜Àþ+Ûþ–ÿ-þþ\Tüò@ÿ&»ÿý* ú”xÿ@”âù—Äùj—ûFßÿ`‹ù!ùìÉÿî>üÝž;ûáÿLþ÷VüQüüËûo«ÿaü3ßþy%ü=Äü÷æð þý~ÿTú®öþ/ÿsîþâ·ü5üŠuþUÿØy^ý{þÃóþ:¢ûáüžMùíihÿÌý"gÿaøûÊPü0:GþN¬þΑÿ®ûììýT#û€!þ¡ÿ$7û†PÿäüÌþ÷þͱøýx¬ýo ÿÚO÷ýjþ-üHwü/û¤Kývù&€ú¹6ã”ÿvþ˜þüÏèþzGÿ5ûX¹ÿ ãý²íüSúüýLLûÿõ˜þ¹ýj¹þ,þ\ûX-ý£_þ¡9ýÎÿÓðý(Êûˆþ*†öþù³ûÎÿ˜´þþúþhÿ ûR`íøü#'ÿ®¤þK8ÿøœûðÿ­¨ýYjxTOkÿEýF§þ’âüŸÜýR üÃ|üDPûvëý}¾ü¦“û^ÿæ¨û´­0ÿ-Bþ—ÿ“à{ÿþÿºüSÕý}þø7\ý×ýLÇþßìüëÒþüšz RüY'×MÑûƒòýqþÎýØSþ5þ™ÿ7ý¯ÍZþüþssÿáÿûZÿçå gü]çþDÿ.IýÐ<Qý þY@½üwÿ“xüšþùKþ¥·¥þ<eÿgÿ@“ÿ=;ÿsÿ5ÿÎÿ¤2ÿ©´þÑ…ÿ$‡öþf‹þ”ÿ†ÞýOšÿ{‚ÿBÿ›—WÿõxýõÿA8ý`LÿJ"”þ‡öýïA•þ¬ÿ_ßþ†ÿŒ¼†þ°ÿyMÜþGþ9ýÿ5³þûÿÿ1Ó·þaŠ.ÿRÿ7ÿg{:ÿíþ­Rùþó¡€ÿŽÿ2þº@þ¨øþ£ÿwF2ÿX58³þ”‘ÿVÞþyÿ’ÿ‰ÿùTx³ýž#‚Sÿ;´ÿö™ÿÈÿ3—ÿÄ:ÿ²Ÿ2¦ÿÐÿlÿõþlÿGý ÿÿéþi5ü«üŽQ ̳ëûðþ¨ø<õ«ó¤ôÁö[øÉùEþâx™Š A2¿±ýFûMúDú2úÉùíû„þ¾B¯™Ó†[1þ6þKüúþÖ ø÷ýt ÷YUÆB¡õµìÀé˜ë~ð]ò¯ó³ùu0 T­NÐ 4 zŒüÉ÷,÷=öÖõ@ôzø™üöëóýë r ¬eÚüØÿø|ôÝý–úíëìÑpÀ-`%È‹ ²û[ã\Ô/ˇϙÛwäì<þ~Á"'B(¸#<", FüCðèãÑè¹ëlïÔ÷lµ ‰Ì\Þ ÐíýÈöLõIñÔô{òJó,\ ;øõ„·,F9 (’ Ïú,ûïöÒÎÀ°ÀÍÒé1ù®þF&O3:0l#^é7ò¼ãºÜoá€ê‰ö‹ü¦J!_ò4 ˜ü¦ò#ð|éè£ï´øêÿË| w»ò0ã6¶&¹23&{.ðòõèVÉ^º-¿þÖ$öÝÃÚ v66½* ;û2óÀßBÕÊâgíj÷r ?dÝ5$ ¬ÿ ðDð0ðÈæÜê\úvØÙ ˆ –… ×þé¡2âÑ)ú#.ÚJ›:è¯õmõ%ë°Æã¬Ï±âΣñv¿+´<Á>|-ǯõå%Þ%×T×Éá}øÞ lñ"#Ÿ ¤ôõ ætÞ àÆç€õÞ± 1T¬ Rvüóïõéú£ÿÐähÞÊ ÁA]—HŽõè}ßFÓ‹µ]¢+®Ê×- O004Í5Æ>†7{#ö×(˶ÒN܉峸 A)=2³+i óþËíËـӂۛ씄_ ß1bù³íûá¨åëë]‡/üÜî§1K)]]C—K×uÌÏÁ…¨L¯·sëËV7ƒ<Ù=8?.ëãtÍZÈêѼá=ñT 7(»6ì3&7ãúœëjßÜÕîØâè¬ú* ös#w.à cöæ²å…ÞõçPó¹úI<$IþÂæ!I`óDþ sàÆËI´–p’¹²Qç(8DwIãDc-¹cßÚÊ5ǛҢå ÷ß‚,v6Ó.f ðìúºé:Ú®×äà)îhýê !"»¤/ ãøêàáäêú-l &ƒ)¶öÚÙäž>•\`JaÍê‡×S·ô‘`‡Ý¨›Üñ3uA‘OMOZ5LìÞ ÇcÄKÕûâð÷Z#-ý8É14¢ ù÷"éÚ.ÔÈÛ«î¢!O! çþ[íeäÞàÚãuõ2ü6 ¢ b´bç—ÃÐöÏ;GY6MŽ»íÏÛóä›( ¯ÔÞí ±09EíGQBŸ44 HàfÊ3Ê!ÑÉÝ”øU$)n<8m!,fõ÷âYÕ¼ÔDßÔóI À !K \ ®ûð(é%áWáÙò ý©ïi Í'OæÇ{ü<[XÁHêÍåmÔäÁY‡’°äˆb6¼HuJPC´.W †ÞÆ‹ÆÈËfßÈü1I>Š2­! qò‚ÙäÔ1ÙÃÚoñySã7+•‡û®îÖâ£á+é„íüÿþ~¡ðß8 ©ÒÒÁ\úZ:_`íPšã’׳Èé£Ò™qµâ âC‡H.A%;°'Êÿ‚Ü/ÆŠ¾ÌÔÚòžVr-c4s1 0ý°ä(ØvÛÌÚ•çëø !#=)L"f û¿õŒéçšåÜêAú‘`î Û ¾ûçþÑÀIçc®UGÕ܈Àk¾è«¥ÁÀÃì)!mKUt@‰,Ž7ñûÎпÃKÚíý¦¢*Ó64–!M ¨í÷Ø{Ñ_Ö¨ã öŸ  ¼+]#ð!õðæçÈä±ã,æ•÷0 }Ž7J÷æå•øšú‡Ý{ÕÝÃTÅl>Sš ñÇ «¿²ã´ø¶ÒŽû-Xã[<7ƒö ßÝÌÿƪÎ&æ /.7±2=%µ äõTæÌÓ§ÍÙÛgö‚3 ÷'ª"Áœ¾õVå°Þ"à‰ì³û® Òdð NüêÛçíçûæD_aõ¥ìÕ•Y¼dZAüîÊ¥a”¡°oÇ;Ö—ðÇ6=RYdSò"TðUÏÇY̲Ü>òî5!ü8}@Ò*l ë'ÕÿÎײçnüW;$*Â"§ÔýQìÃÛíÝÜçÑñT¯¸%†ÒGLòqáÛáˆàÇî[ #g&BüÙ'D2XÓ†YXVóÆ”0=Âjèñ Æ¢$H4fAV4º 5Ô•°B±çÙÒ‰1'8''ª± P÷$ÝUÊ:Éêß8·;ÿ Z|é>èˆêì®éfê8þJ‰-¥-äFò†ÜßËèFþw3ÑÓ0qºý“äòÖ‹ô&ÿdòs Á8‰SW4§Á†å‹À…ö²«%)¥ m,K0]¬ã†º+®ûÎ Ó9Š?A,ÑhþKù~ø)ï½ÚÓÑÛåhk*›:Ÿ)ì>ë”äµç¬íÁó¼õEúã2%ì¤ñí|Üpájõm¬·  ) ÊÝïèíäð™Ç“þ¼æ¯øÿ.®R^V†!ÊŽ’–Èrö»áQ ½y'Å4!ómɸJÓ£«'Þ-¬ 9 Ç ýÊæטÞùì+äëGöƒñPölümüÅòð[ù¡ ²î GùïLñÕúÿ‹þýêü‡Ð ܵ kÿòóðsö´ú J ¾õÍçýÃ*KK}KøÚÕ­ƒª—ÈÛé_ýN¢%ñ-‹5Õ úõUÑ¡ÄØÙ„ü‚^MI¬Ú}úâáœÖŠâÿüÎ  "ÿŸÿš<û„òbêËí~úÑ 6ZùüÐõ÷Õû¬û&ø÷¯üÈbv ¾ü¿öÄóuùDýÍûÑê-ùÀò¨[ <…B%Åò Ç·ŠÁ–×ìÉ÷ÿŸ´*d5k(©{ã¿Ð›ÖXìk› )[òp5ø­ïfßKÞJíÇtž uúQ¦ùìì²çÉïËþÖ åc 1DRÎ×ü¿õÔò÷ó´û•Ï ë s‚ÊýþŒþƒÿú^özý ³ükÿž’%È2¹( Tä@ÊþÆÌÓÚåôò+úí—¼"é)! ìýÛwÞRí‰ý„W» tì²3þ&êÂà‡æ9ö®w ¡ 1]ž ]¾ú£ì¸ç–íNüª . zM Òúøñ"ïáô¢ÿ g úÛÿ ýM!ý+üøÆòóÃþÅ(S1 &‡ Zî娂ÒÌÖ%ß„çCï8ûÑ ê€*°&¬¿ý.êÛâ²æ)ðŠø0þ —“zþñîÛç‰êÚòèûC”J$ ’Û 75õqîUîqôúýË?lg¬íŠ¿ú~ô…òöêüõÓwV¹z´5.ø'ñÿòâÿõ"s$wÃýSèÝáÞ£çzñ÷úíþ_wh?d:ÿ"ïßæHéÑóÝþJ‹NâG \æmû1ðîêÍîÉøZ Î <ˆKrù‘ÇúüóÙñÞô§ü;µ ­ ¶ú<ÿÿ&òÿ†üTø!öø#ÿw Ï ½xÚûÍõŸóèø P» +ú?è}Þ·ÞŠæòfûn Œ33¬ÎÓùÈîé6íö¯S tH Ç"Tü{÷ñò®òœö8þå M ¯ áÿûÏùçù°ú2û$üPþÅà\qˆªûRøÏø¶ûÿð—v«$>uþÿ÷üÀùtù"ý§ôÓð& ¢÷£æ¤Ý¦àLìFû÷ú µ £ të$ÿPù0óåð‰ówûXz 9§Ç¥ÿYùÍöh÷åùaüoþ¼ZC#D1Ê_ü²øÔ÷ ú„ýIć4ƒtŸÿõþ·ýZüôûýRÿ ΰµ¹þÏýZü¡üpþàü`þ "½kïI÷RêúäéòòFÿPK Ó K×Cÿ›ýÜú¼ø~ø*û¸ÿúàù å þ–úÒùûsý°ÿ4.ê²½ùY°þhýwüHýqþÀLANöÿ{ÿ9ÿüþÿÚþYÿýÿ_ý J¢j!ÿzÿÝþìþî©Qþyüwþ¶* %R ±jùªðÈíð.÷Òþ»>”^hEÿ0þ1þjþÜþËÔ°ŠÚÓÿ1ÿÌþ$ÿçÿ*!Pzs%Êÿ‰ÿýÿ õÿžÿƒÿüÿ(8kYÊÿ¥ÿôÿÈÿm7¾ÿÊÿøÿõÿ”ÿeÚÿ£ÿM`þ”ýIÿ&†N 02–ü%øØöHøXû¬þ „éþ¹þ„ÿêfW2âCõÿ9…¤J9öÿôÿûÿ+5êÿïÿ§ÿèÿêÿ!éÿÞÿëÿ÷ÿèÿñÿ@%éÿÚÿÈÿúÿ,Õÿ!¿ÿO«ÿ‰ÿô‹-þÕýH‹ÅLÀ–ýfû û¼ûpýoþWÿgÿÿÿ ÿ ÿsÿ7£ãÆ]j|z†¶•D'25H! ÷ÿéÿðÿþÿ 'îÿÞÿÝÿæÿÔÿ èÿ%2þÿïÿêÿ ¹ÿ<­ÿÊÿ™ þFÿ}ÛS…5Éÿtþþ)þ†þàþBÿqÿ?ÿïþ*ÿ#ÿÿ‘ÿ÷ÿèÿ2(2M;8k:Gap/8-K 3 ûÿõÿ(íÿéÿ Ìÿçÿ TÿSsˆÿÍÿëÿéÿiÿN £ÿ6½ÿIÂÿúÿ»ÿKqO/µÿéÿ 4.+õÿUÿ’ÿÿR}9Æÿ­ÿ$T.Cÿ1ÿ¯ÿâÿ¯Êúÿ>hÿÿ~·s³ÿÀÿB<<+7ÿnÿÿ¦üÿ.œÿ,+ °ÿþÿ„ÿ9kŠÿÈÿöÿéÿùÿ»ÿN‚lÐÿŸÿyÿÍÿ +³‡Hèÿÿ n!øÿyÿóÿßÿ|ÿi3ºÿc •ÿ·ÿXÿ \2úÿÄÿéÿØÿ-ÍÿÁ£»ÿìÿúÿoÿñÿéÿ´eîÿ@‚ÿRÿŸÿ€ÁàÿZ/?ÿ.éÿ©ÿðÿ‹ÿ#…ØÿžÿG±ÿûÿŠÿýÿD›ÿãÿUWÿôÿˆÿI¤ÿžÿ+1äÿ»ÿfÿoÿ³ÿ-¶qbðÿeÿñÿhÐÿ±ÿNÿcO „ÿjÿÄÿÚÿDô¸0Õÿ|ÿ3ÿ|ÿñÿ0‡°¦ÿF ×ÿÿæÿU|ñÿ7ÿtÿ­ÿ95%¯ÿ÷ÿøÿúÿ} oi¶ÿÑÿdÿEfuÿ=¹ÿ\Ôÿêÿ%“ÿ¨ÿAôÿsi¶ÿ'@1IÝÿ,ÿñÿÏÿ>S™ÿmÿÿ!éüÿÍÿúÿ´ÿŸÿ{>¡7”ÿÿ‚ÿ+T_¼ÿ¢ÿÐÿÜÿ7•¿·ÿbÿïÿ[A)¨ÿ ÞÿpÿsÒÿB[ÿ•ÿúÿœìðÿ%ÿqÿšFÒÿŠÿÑÿ Öu)‹ÿNÿ…Ùÿ?ÿiÿöÿŽwÒÿ›ÿ¿ÿ=Ûÿßÿûÿ ãÿîÿåÿåÿÀ’Ïÿeÿ»ÆÿÌÿüÿ uÿåÿîÿl^©ÿôÿ¦ÿp÷ÿ6íÿ×ÿW»ÿ}ÿÍÿïÿ¶ÿÿ†ÿòÿGçÿb|2ÿÿ1(Üÿ/u÷ÿæÿGsÿòÿºÿ¡ÿweƒÞÿ|ÿÉÿ$–ñÿ°ÿHcÿíÿ¶ÿmvÿ®ÿïÿÇtoÿeÿ„ÿÿ]}ÿI-ÂÿuÿÓÿO•ßÿÇÿ«ÿc'Ñÿ)ÿLÿ  “Óÿbÿ¬éÿ£1­ÿwÿf­ÿøÿ1 @ÿÄÿ—ÿˆÿãÿg¸ÿ4QK‹ÿŒÿ#›ñÿ»ÿ˜ÿW@ Óÿ¸ÿ8Ùÿ9dzÿXÿÿ\ÿ½ÿˆŽÿÇÿ§ÿ—jéÿðþæÿAÏQvÿÿÿ½ÿ³ÿ?ÛÿµÿþÿÅ=B–ÿ¿ÿóÿP€ìÿmÿBÿbãÿüÿ½:žÿ†ÿBm¿ÿ¨ÿ6ˆtTÿ¿ÿçÿšÿbžÿ-öÿ—ÿžÿ˜ÿgŽ'‰ÿ‚·ÿŽk‘ÿžÿ½ÿQ°ÿyùÿ&•ÿ¢ÿw¹ÿ­téÿ ÿWÿ:ï«yÿ˜ÿÖÿgÿ´ÿÿÿ´¡¿ÿ¥ÿŸÿ[9èÿ¶ÿ'ÿQ¹ÿOYšúÿ\ÿÂÿ—,±ÿîÿcÿ<ÿ0_%‘\ÿ¸þ©ÿ~56RÿeÿÝÿ­*sÿâÿ+ŸÒ¤ÿzÿÛÿŒÿ™ÿ£dÿåÿ9Q)XÿþÿâÿÝÿˆŸ)ðÿOÿoPÿYÿ©ÿ·âëÿ•ÿTÿ}QdÏÿ©ÿ6ãÿ‹³ÿ7áÿ /ÿ &rÿÂ)©ÿA‹ÿpÿÿb‚[ûÿ«ÿ\ÿZÿmD޶ÿ‰ÿíÿùÿ—²ÿ?’ÿ*$Ùÿruÿnÿæÿï¨ÿÁÿFÿUÿžÄ|ÿ$ÿ˜ÿ@+­‡¸ÿCÿcŽ ÿíþA¸BYÿ@žÿ‚ÿ÷ÿtÿ k<ˆÿaÿ®ÿ(ÂSÿŸÿúÿT3Ëÿ3þÿÎþúþ- éÿýÿŠÿh!õÿ9oÿzÿÉÜÿÿ~UÿÈÿB ˜IšÿDÿDÿ<éÿ¨²½ÿóÿxÿiÿL;„ÿüÿµÿNÝÿÑÿÐýÿõÿÁÿÜÿÒ0‹ÿmÿíÿT*„ÿúÿêÿüÿÔÒÿÝÿ—ÿyÿzÛÿ}ÿÑzPÿÎÿ!kžVÿ§ÿüÿjóÿ ÆÿRÿÿÿrÿ.¨`¯ÿÖÿêÿsC¯ÿïÿáÿhÿøÿõÿpö¼ÿäþ/2úÿÃYwÿ³ÿqÿÿÿ"½ÿ9ÿÂÿva ŽÿäÿÏÿ;òÿÊÿÜ›=Cÿlÿ?Èÿ§ÿCØ»ÿ‰ÿ¥ÿMëÿÿÃÿ£ÿeVþÿuÜÿ6ÿMÙÿ¢¥…ÿŽÿNÿWãC¹ÿQÿFÿ†Šûÿ‘ÿ™ÿq_¡ÿ‘ÿÃÿúÿ7ÎÔÿ;¶ÿtÿd›ÿp„¡ÿyÿôÿSÒ¹sÿ©ÿ–ÿCÿFøÿªÿçÿ!æÿÃÿ¬ÿZÑÿÄÿžÿ2¢÷ÿ_µÿ-ÿ¶ÿGdøÿ·ÿ8ž ?€ÿHÿkÿ=ÑoˆÿËÿi!µÿÞÿïÿgäÿ¾ÿ÷ÿ8áÿ0f§ÿËÿ0ÁÿŽÿ#ŸÇ²ÿ?ÿŸÿ"f1›ÿ—ÿìÿc~1ãÿ~ÿjÿ#VÒÿÿÿ*Gêÿ­ÿêÿ"GãÿÍÿ! Öÿóÿ êÿ^@àÿÛÿðÿ çÿßÿÖÿ5C úÿÊÿ´ÿñÿG$àÿåÿ²ÿéÿ,5âÿæÿ4BDèÿmÿÕÿûÿ , àÿ§ÿüÿ7gK®ÿÄÿïÿ×ÿáÿ(1ìÿ¿ÿ¼ÿÛÿ'G>ûÿÌÿ¶ÿñÿ 6ïÿÙÿÙÿ>+ØÿÛÿõÿ ôÿàÿóÿúÿ ïÿÝÿôÿþÿ +âÿÝÿäÿ 3 áÿôÿ ëÿêÿìÿ ïÿÓÿóÿ/2ùÿºÿäÿîÿüÿ úÿýÿ êÿêÿêÿøÿ ÿÿéÿèÿ $øÿÕÿËÿßÿ(ÿÿéÿïÿ üÿþÿûÿúÿüÿ èÿãÿøÿýÿ ìÿäÿåÿ þÿñÿûÿöÿøÿ  úÿûÿîÿ  õÿëÿõÿõÿóÿ  ýÿöÿôÿöÿ ýÿùÿõÿ úÿþÿ ûÿ÷ÿëÿ÷ÿýÿýÿóÿôÿÿÿ ÿÿ ôÿìÿòÿ ÷ÿøÿþÿÿÿÿÿþÿþÿüÿüÿüÿûÿïÿþÿüÿøÿýÿýÿûÿðÿîÿðÿ øÿýÿõÿîÿôÿùÿ öÿýÿþÿüÿúÿûÿ  øÿúÿõÿòÿ ýÿëÿöÿøÿ ÿÿóÿôÿîÿÿÿýÿ øÿôÿüÿòÿüÿöÿòÿüÿúÿùÿ÷ÿýÿÿÿõÿóÿôÿûÿûÿüÿüÿøÿõÿóÿ÷ÿ úÿ  õÿúÿóÿëÿøÿ ûÿþÿðÿþÿöÿíÿüÿÿÿ ÿÿþÿüÿýÿùÿþÿüÿ÷ÿ ùÿûÿ üÿûÿ÷ÿýÿýÿûÿ óÿïÿôÿôÿ ùÿþÿöÿøÿöÿ÷ÿûÿõÿùÿøÿüÿ üÿôÿüÿþÿõÿûÿüÿýÿøÿþÿ ýÿ÷ÿöÿ÷ÿúÿþÿöÿùÿúÿôÿùÿ  ÿÿ ôÿõÿðÿøÿ ðÿìÿëÿôÿùÿ úÿòÿùÿöÿûÿ  ôÿéÿíÿñÿøÿþÿõÿüÿûÿöÿþÿ üÿÿÿþÿ ùÿòÿòÿûÿõÿøÿúÿ   õÿéÿèÿõÿýÿûÿ øÿñÿîÿÿÿúÿöÿþÿ  üÿ÷ÿóÿÿÿ ûÿþÿÿÿ öÿãÿÝÿåÿõÿ   ÿÿûÿøÿûÿùÿæÿãÿñÿÿÿõÿñÿûÿ ÿÿþÿÿÿ ûÿïÿáÿ×ÿÚÿéÿýÿ  ûÿüÿøÿðÿôÿ õÿðÿìÿêÿèÿêÿïÿöÿÿÿ öÿêÿßÿÛÿßÿêÿ÷ÿ#('" öÿìÿåÿâÿâÿæÿðÿúÿ ýÿñÿèÿåÿåÿèÿêÿìÿðÿøÿ  ÷ÿíÿçÿçÿëÿïÿòÿôÿöÿüÿ"#òÿåÿâÿèÿóÿüÿûÿöÿðÿíÿîÿòÿ÷ÿÿÿ ñÿäÿßÿåÿõÿ úÿðÿèÿçÿíÿöÿÿÿ ýÿüÿÿÿ ýÿúÿöÿöÿûÿìÿåÿíÿùÿþÿ ùÿðÿóÿþÿ "îÿäÿéÿ÷ÿòÿìÿúÿùÿôÿûÿøÿûÿýÿýÿüÿóÿêÿôÿ þÿþÿûÿóÿóÿôÿüÿûÿÿÿþÿúÿýÿÿÿûÿ ûÿúÿôÿûÿùÿúÿôÿøÿ þÿûÿúÿýÿ÷ÿõÿýÿþÿôÿúÿ  ýÿõÿûÿüÿõÿöÿöÿûÿ ûÿöÿíÿöÿòÿûÿûÿúÿòÿþÿûÿûÿñÿòÿ ùÿîÿåÿòÿ÷ÿ÷ÿõÿ ÿÿûÿùÿ÷ÿþÿùÿ÷ÿöÿ÷ÿóÿ  ýÿùÿ óÿåÿãÿæÿïÿ  øÿüÿñÿüÿÿÿõÿýÿ  ôÿöÿöÿ  õÿðÿëÿòÿüÿùÿþÿøÿýÿýÿþÿ óÿðÿðÿòÿóÿÿÿúÿûÿúÿ  þÿøÿøÿöÿëÿöÿ÷ÿôÿñÿïÿóÿ þÿöÿòÿ÷ÿ÷ÿ   ôÿñÿïÿõÿöÿðÿìÿðÿ   õÿÿÿöÿþÿþÿõÿñÿðÿûÿøÿÿÿ÷ÿýÿùÿûÿùÿïÿ þÿ øÿÿÿ öÿþÿùÿìÿûÿÿÿ÷ÿ÷ÿïÿÿÿ÷ÿøÿ ýÿòÿüÿñÿÿÿ ûÿýÿúÿøÿ ýÿÿÿóÿûÿîÿêÿêÿþÿúÿöÿôÿûÿ   üÿ úÿðÿïÿýÿöÿûÿõÿýÿþÿúÿ  üÿûÿþÿøÿýÿùÿúÿöÿòÿóÿþÿ  ÷ÿìÿñÿõÿûÿîÿïÿðÿ ýÿüÿ üÿùÿùÿùÿöÿûÿùÿýÿ  øÿíÿêÿìÿüÿ  óÿûÿòÿèÿêÿýÿÿÿúÿøÿôÿôÿÿÿ   ôÿïÿöÿïÿûÿùÿôÿîÿùÿùÿÿÿùÿþÿÿÿýÿûÿûÿÿÿ ÷ÿ÷ÿðÿïÿüÿ ûÿûÿñÿûÿîÿéÿéÿÿÿýÿûÿøÿúÿ öÿöÿýÿüÿóÿîÿ÷ÿÿÿ òÿ÷ÿöÿüÿúÿþÿóÿ÷ÿíÿéÿ ÿÿ  ÿÿðÿýÿ õÿéÿëÿéÿõÿüÿþÿüÿöÿÿÿúÿýÿ ýÿòÿíÿîÿñÿ ÷ÿúÿüÿþÿùÿóÿ ÿÿúÿùÿ ùÿúÿ÷ÿêÿêÿþÿùÿ ûÿóÿòÿõÿøÿ  ýÿòÿîÿðÿûÿÿÿùÿýÿúÿ÷ÿÿÿ÷ÿùÿ÷ÿÿÿÿÿõÿæÿòÿúÿüÿþÿüÿùÿùÿôÿýÿ  ÿÿ ÿÿóÿóÿ  ôÿéÿêÿïÿúÿòÿöÿ ûÿñÿîÿùÿøÿùÿôÿîÿëÿöÿ ôÿöÿïÿûÿýÿóÿûÿ÷ÿ ÷ÿñÿõÿíÿúÿÿÿ ÿÿûÿÿÿõÿ  öÿúÿùÿ øÿñÿüÿúÿñÿñÿýÿýÿÿÿýÿûÿ þÿüÿþÿ úÿôÿùÿðÿ üÿýÿ÷ÿòÿðÿíÿôÿøÿýÿüÿÿÿ ýÿþÿ   øÿùÿôÿ þÿûÿ÷ÿöÿüÿÿÿïÿîÿîÿöÿõÿóÿðÿ  ûÿúÿüÿïÿíÿëÿöÿÿÿ ýÿúÿóÿüÿûÿûÿ  òÿùÿíÿæÿçÿôÿùÿúÿ  ýÿ ýÿ ÿÿóÿúÿõÿ þÿñÿöÿìÿÿÿ÷ÿüÿ÷ÿôÿ    ýÿýÿðÿýÿíÿëÿêÿèÿõÿ  ÷ÿüÿõÿýÿÿÿôÿÿÿüÿøÿþÿùÿöÿüÿõÿ ûÿöÿõÿüÿüÿöÿòÿõÿõÿòÿ   ýÿüÿ  ÷ÿéÿäÿìÿòÿðÿìÿúÿ öÿûÿõÿ ÿÿûÿÿÿüÿöÿýÿ ûÿüÿùÿ þÿüÿîÿüÿ óÿýÿ÷ÿëÿîÿþÿ  ôÿýÿôÿëÿõÿüÿþÿÿÿÿÿ ýÿùÿóÿþÿòÿøÿÿÿûÿùÿôÿ    ýÿòÿïÿöÿýÿÿÿñÿãÿáÿçÿîÿíÿ ÿÿóÿñÿïÿþÿÿÿùÿ ÿÿ÷ÿþÿñÿöÿìÿûÿ÷ÿüÿùÿ  úÿúÿûÿöÿýÿöÿúÿóÿÿÿþÿþÿóÿöÿíÿüÿ øÿîÿóÿøÿøÿôÿþÿîÿ÷ÿòÿóÿôÿõÿûÿöÿúÿÿÿ  ÷ÿ÷ÿïÿ÷ÿñÿúÿñÿøÿôÿèÿéÿùÿ÷ÿ   ûÿíÿëÿéÿôÿúÿ ùÿõÿíÿ÷ÿöÿ øÿöÿñÿøÿ  üÿôÿðÿëÿøÿ÷ÿýÿþÿüÿùÿ öÿøÿôÿþÿ öÿøÿðÿçÿüÿ õÿùÿðÿûÿüÿûÿ øÿúÿÿÿõÿñÿñÿùÿøÿúÿõÿùÿùÿõÿøÿ ýÿúÿýÿùÿúÿùÿöÿóÿ  ùÿýÿ úÿûÿòÿêÿþÿöÿýÿûÿÿÿðÿíÿìÿóÿòÿñÿ üÿþÿþÿûÿþÿúÿüÿÿÿùÿøÿîÿþÿïÿúÿïÿóÿùÿþÿÿÿùÿÿÿöÿûÿõÿ õÿ ýÿùÿ÷ÿñÿýÿíÿüÿñÿøÿüÿ÷ÿëÿÿÿøÿñÿ  ÿÿýÿóÿýÿïÿëÿéÿþÿüÿúÿõÿ÷ÿ  ÷ÿ ÿÿ ÷ÿòÿüÿóÿôÿ øÿëÿåÿìÿðÿ óÿ÷ÿ üÿüÿýÿþÿöÿóÿüÿ ùÿùÿôÿ   óÿöÿòÿøÿùÿöÿõÿýÿ   ûÿéÿñÿîÿäÿæÿóÿúÿ  ûÿðÿõÿøÿÿÿøÿúÿüÿõÿüÿ ÿÿôÿýÿùÿüÿõÿüÿúÿùÿ÷ÿ  ÿÿöÿúÿüÿýÿðÿýÿîÿìÿíÿþÿ  üÿ ìÿæÿëÿïÿöÿïÿðÿðÿòÿïÿ   ÿÿþÿûÿõÿüÿþÿûÿþÿðÿøÿòÿ÷ÿõÿùÿôÿôÿ   øÿéÿüÿúÿ ûÿýÿÿÿøÿýÿÿÿ÷ÿòÿúÿïÿèÿçÿýÿùÿ ÿÿùÿ÷ÿýÿýÿýÿ þÿúÿÿÿùÿÿÿöÿþÿ÷ÿõÿôÿüÿ  óÿõÿüÿþÿôÿðÿõÿûÿþÿþÿûÿ öÿëÿåÿòÿúÿ÷ÿøÿòÿ÷ÿýÿöÿõÿüÿ   ûÿûÿþÿýÿöÿîÿ  õÿíÿøÿ  úÿèÿçÿíÿ÷ÿõÿòÿ÷ÿþÿ   ÷ÿýÿùÿíÿõÿþÿ ðÿýÿöÿìÿóÿþÿ  ùÿøÿñÿùÿ÷ÿúÿýÿùÿ óÿùÿíÿôÿúÿõÿ ÿÿðÿïÿ ÿÿÿÿ øÿäÿêÿëÿýÿòÿöÿñÿöÿúÿ  ýÿýÿÿÿïÿîÿëÿ÷ÿ òÿëÿäÿêÿîÿñÿïÿüÿûÿ ÷ÿ   òÿúÿòÿèÿëÿûÿþÿüÿ øÿëÿîÿñÿýÿôÿøÿ ýÿþÿûÿõÿðÿ÷ÿ ýÿ  úÿþÿóÿîÿêÿéÿðÿýÿýÿ þÿôÿ ûÿþÿþÿ   ðÿðÿïÿôÿóÿýÿ úÿþÿÿÿ÷ÿ  óÿóÿ  òÿûÿöÿîÿòÿþÿ  öÿçÿåÿêÿ÷ÿñÿòÿÿÿ ûÿøÿùÿþÿøÿúÿ  úÿúÿùÿûÿþÿ÷ÿÿÿ ûÿÿÿôÿìÿöÿþÿ  õÿýÿòÿëÿðÿþÿ öÿëÿêÿíÿýÿ  ìÿìÿîÿóÿôÿ óÿÿÿöÿóÿüÿüÿÿÿ ùÿøÿöÿëÿñÿêÿöÿòÿöÿîÿöÿþÿýÿ  þÿúÿùÿ òÿûÿíÿåÿýÿüÿøÿþÿüÿùÿüÿúÿþÿ  óÿöÿëÿòÿþÿÿÿ  õÿëÿéÿóÿúÿ÷ÿ÷ÿóÿýÿöÿøÿôÿ  þÿÿÿ  üÿÿÿöÿþÿóÿðÿïÿúÿôÿñÿúÿúÿûÿûÿ  þÿûÿùÿýÿþÿùÿúÿûÿòÿìÿöÿùÿûÿÿÿþÿîÿüÿõÿûÿ ôÿñÿøÿûÿþÿ úÿûÿûÿôÿýÿþÿþÿõÿ÷ÿöÿöÿþÿøÿ ýÿþÿöÿ÷ÿ  ÿÿüÿ þÿúÿùÿöÿ ýÿ øÿøÿ  úÿüÿ÷ÿþÿÿÿüÿúÿöÿøÿûÿýÿ ûÿ   íÿóÿøÿûÿúÿïÿóÿñÿöÿ  õÿôÿøÿÿÿûÿûÿÿÿýÿüÿÿÿþÿõÿÿÿÿÿüÿóÿúÿõÿ øÿ÷ÿøÿûÿþÿüÿûÿ ûÿõÿ ÷ÿóÿþÿýÿ øÿøÿøÿ÷ÿÿÿñÿöÿúÿýÿýÿþÿ ûÿûÿ÷ÿÿÿúÿûÿûÿýÿþÿøÿõÿ üÿüÿ øÿüÿöÿúÿúÿ ôÿöÿöÿúÿýÿùÿøÿ ôÿøÿýÿ ýÿøÿ þÿûÿüÿûÿþÿÿÿ ùÿüÿ ÿÿ÷ÿúÿöÿöÿüÿ úÿúÿÿÿÿÿöÿûÿùÿúÿøÿúÿôÿüÿÿÿ ûÿ ûÿöÿûÿþÿùÿüÿúÿ ýÿûÿóÿýÿùÿúÿüÿ ÷ÿöÿûÿ ýÿûÿøÿùÿþÿ ýÿúÿòÿþÿúÿ øÿõÿÿÿúÿ ýÿÿÿ üÿôÿ ÿÿõÿõÿýÿüÿþÿðÿûÿúÿÿÿ ýÿûÿ ïÿüÿ þÿýÿùÿ ôÿüÿøÿÿÿþÿÿÿþÿýÿ ÷ÿþÿöÿûÿûÿöÿ ùÿ÷ÿ ûÿúÿüÿýÿ üÿöÿûÿþÿøÿùÿöÿþÿüÿÿÿ þÿùÿþÿóÿüÿÿÿ ôÿúÿýÿ ÷ÿûÿ ùÿýÿúÿùÿ óÿ ûÿøÿöÿÿÿùÿýÿúÿ ûÿþÿõÿüÿÿÿ ûÿóÿþÿûÿþÿõÿüÿþÿýÿþÿøÿùÿ üÿÿÿöÿþÿúÿ ÿÿþÿüÿýÿúÿÿÿþÿýÿõÿÿÿùÿ öÿûÿÿÿûÿÿÿòÿþÿ ÷ÿüÿ þÿóÿûÿþÿ öÿùÿûÿ öÿûÿüÿúÿûÿüÿüÿþÿüÿ ûÿÿÿûÿþÿõÿüÿùÿùÿûÿÿÿ ÿÿôÿÿÿõÿ ùÿþÿöÿûÿÿÿòÿüÿ úÿýÿûÿþÿóÿÿÿóÿûÿûÿ üÿøÿ÷ÿõÿ ùÿýÿÿÿ øÿýÿ÷ÿþÿýÿ÷ÿÿÿüÿõÿóÿ÷ÿûÿöÿ ÿÿòÿûÿþÿþÿþÿÿÿþÿüÿìÿõÿ öÿ÷ÿÿÿñÿûÿýÿ õÿùÿùÿýÿ üÿüÿûÿùÿ úÿûÿýÿöÿúÿ øÿ÷ÿþÿüÿÿÿõÿÿÿõÿþÿ þÿóÿûÿ ÿÿûÿûÿ ÿÿ÷ÿüÿúÿþÿøÿùÿüÿûÿ õÿýÿþÿÿÿ òÿÿÿýÿýÿöÿøÿüÿÿÿÿÿûÿ ÿÿýÿöÿûÿþÿþÿõÿýÿ õÿðÿýÿ÷ÿûÿþÿûÿþÿøÿøÿýÿÿÿ ôÿüÿ ýÿ ÿÿôÿøÿþÿ ûÿ÷ÿôÿüÿ ùÿÿÿþÿÿÿ øÿ÷ÿþÿüÿÿÿüÿýÿ ùÿùÿýÿ÷ÿôÿ ýÿýÿ ýÿùÿÿÿûÿòÿ ùÿýÿ ùÿõÿþÿ ÿÿüÿûÿúÿýÿûÿþÿöÿýÿ þÿÿÿýÿþÿöÿ ÷ÿýÿÿÿüÿ ÷ÿþÿ ùÿúÿ÷ÿ÷ÿüÿóÿôÿ ûÿôÿúÿ þÿüÿþÿþÿÿÿúÿùÿöÿôÿ üÿôÿûÿýÿÿÿÿÿïÿ òÿþÿ÷ÿ÷ÿ åÿýÿèÿëÿþÿ þÿþÿóÿóÿøÿïÿýÿþÿ îÿûÿëÿñÿ öÿóÿ$åÿ Öÿðÿìÿ,Óÿ"ìÿßÿ ìÿôÿÚÿýÿøÿþÿÿÿÌÿýÿÞÿêÿ8ïÿÞÿ1ßÿÕÿúÿþÿ éÿÜÿ(ÚÿûÿGÊÿ íÿöÿ(Ïÿ5!ÓÿÈÿ$ïÿåÿ ðÿõÿKóÿìÿ½ÿñÿ)Úÿ5*Ãÿ4ÉÿÖÿ<ÏÿMÝÿ/áÿ¿ÿOºÿ÷ÿ2ºÿûÿ]¦ÿñÿhéÿ¸ÿ9ðÿ*¹ÿ5äÿóÿÑÿéÿ<ƒÿSÅÿýÿSÆÿ ÕÿX·ÿ>Õÿòÿ¤ÿ$ýÿõÿÅÿk˜ÿ@G£ÿb@Fÿ–Žÿùÿ ¸ÿTÉÿ(JšÿÇÿ4ÙÿvYyÿTÆÿQÿ™e¯ÿKÏÿ/-ÿ¤núþûÿÑcÿ¤ÿZBàÿ^ ÿH-ìÿŠÿÈÿOÿõÿ¢§ÿ,©ÿ¹ÿtbìÿ4rÿcÿ‚«ÿ-¬ÿûÿ°ÿãÿëÿÊYÿVçþ¡ÿÑ×ÿ¿þx=²ÿÓÿûÿ¶ÿNåÿpÿr¿QÿFÿK¸–ÿ„ÿ/CÛÿ‡—ÿÿNÿ(þRåÿ®ÿzÿ'xÿÑÿüÿÛÿJžÿ"rIÿá´ÿ‰#Ì«ÿ ÿ7úÿûþ*¦ÿnÿgþ+þi#ÿ–ÿkˆaÿþhÓÿãcË>Žÿ €ÿ„þ®Ùþ6þºþ›ü!$ãA¢ŒdF”ý¹ûùZ÷KööË÷Cø'úFýÑÿÓõ’ÙÏûÉí9ŒþöüÄü‚ú:úIûLû¯ûEýÆþåÿø!É(Ø ëÈùïLÿ]ÿÂüýéû.øBÿ…NV| = Ô V 7ίü1ù~ö'ñRïñ~ð ñøölúnýÈ‚ Ç ­ ÞŠ  ËÆiþýÞüàùâö÷Ÿö)÷>ùFúgýÿ‰hýîhk›ÅÔ„þ <ú(û O÷1óIý2-‡6¿Gb² ) ùnõÅî«æ#å 呿„êLïžø|þ˜Ð tYäÐs@ жüRöþó;ð ðð¬ñ€õj÷¶ýÂ^$ é ÿD – Ó Ìæ~Uùƒÿ¤ör÷³þ5ïžñ[ÿ{þ ˜ /“3ƒp-ø˜÷(î£àNàämãâdîÖùÈúÎë9“ˆ»×¾0X 3÷•ö’ñê"êîÁîêî¸õÏþ¯ÿy'  n('A † €ˆ÷Vîóîÿnç2êÏý¼þ¦ú& Fý¶6K‚æûÏù•îgÝPßàÚÁÜwÝÄãŒóðõLx“‡t%þ!l$RAûàþÞø$ï•ç)æøâ”çæJíŽõàú3ÿp p 7ïOˆp üú Pç‹ý õjá•åÕ÷ºöÂì ^Ô1"ÿÿ 4ZðÙöæèÙ‘ÑÝ×XäœåÔëñüf ³cO*+'Í&+$%)›2½1×ô^æ¨ç«èÓÕààèìáï˜ü3@údü‡*€ 1jû¿ üêäüÀþäÒ×ìüì¼éþ|-³ I ñ}ìÙàMêƒØõ׋×ëïâõê¦þé ®<)àO$Ý$ $w¦î"}ïó;í¸ÞeèbáŒè‡åA÷yñ~þT ¾öP)Ð)Íkþ«ÄïTûÖ‘×aæKÿï/éÍÏìŒ ì(òûÞ Á«áä7é²Õ”ÕÞ`äÞåöèJsû 4 *”Œ’0¼Ò!Ñ sºüaõøAì²äöߪíRß í éÃùôúúYe ¢Á¨$õò÷¸Àïú ™Ï¬ï }åÉðUO xH!…iü ˜ážæièìÔVÒ÷Ý>å$Ý|ìÉ)‘¨Ä!f õ.R!‘–Zj GõóœèNëÀæUã…æ;âJìï¥ò+ü£Ìw ™U ˆ=Ú›ïMñüDÖˆò.þ1ìŽëà I ëv" ŸP‘êÛä€îOÒQÚÒàDá¨Ü‡ô*øÇÿ I|‡ ì*`%Šc#«Øûü íßðeèßãìãÛåÙîgø‡ò¿˜Ç  œ7Ï© _ ûŠñî¢.æRð!)÷3èþ ¬=ä J} Zñ¼lôˆêðôõä)æEçÝïÇévò.ÿHüJ ™øÏí6èd ½¸ÿL¡üøÌï—õfëYíKîŠïYôæð€þZü1Ÿ k˘ « y tÿ® Õ÷‡þ&ìHó2üôøÛîŸ=™Œ ò Õ ¸›Óÿ¦ýÙö•øçñÖñ@ñ óçñ;õñø¼üÙýnñ€B %Ö > @„ /  *iùý²þøÍø(÷õL÷ÇôF÷‘ùžøhü/ÿÊþ‘2KCâ_­’~"<üþÿ¦KµüÝvÿ5œ|þoûûÐúÅø×øÛ÷Ÿù ø…úÒúþû#þþ³0_œsT¥v¤Æ·+š ^LÕþ®þ¤ýeýEýƒüTý|üSýyýúý2þÿ>ÿlÿV [.Ä‘ ¿…â«_“J û=Îÿyÿgÿàþ#þVþ5þ¬ýþþõý;þ´þoþÿQÿLÿ©ÿ( 7Ä¢{(è Çþd¬Bm*Íÿ?çÿËÿçÿäÿÒÿuÿj7ÿ±ÿª,ÿ×þ‰)wÿ¡k’ÇŸ‚ŸÿÒÿÛÿÉþ£þÿLþ+þÂþ`þ1þíþÿœþÿ„ÿ|ÿÚÿK=âWÍÉݰÕٜř†wh.P.èÿ6ÿY¡ÿQ«ÿtÿ@ýÿ®ÿüÿÿ¬›ÿâÿ†ÿ“?ÿîÿjÊÿáÇÿÿZHÿ?v«ÿÓÿ×[ÿ)ãÊÿýÿÿvSàÿôþçÿ—ÿ‰ÿìÿƒ_Äÿwÿtq‹ÿöÿSdÿ æþpuÿbÿOy‡ÿÇÿ_Êÿ!ÿƒãÿæÿ~ÿèÿ{>±ÿÿdñÿRÿéTÿ? ‰K6ÿ Ä„ÿöÿÔÿLÖÿ¬ÿPÔÿúÿ8T¤ÿèÿ´ÿR4šÿ==§ÿ2 ÈÿVÿØÿ:ïÿ…ÿ nøÿðÿ¾ÿ8%|€ÿÙÿ€Êÿ{ÿ-*–ÿ1Àÿ 7 ëÿÜÿ \äÿÞÿìÿ!Òÿ èÿÚÿïÿ0ÜÿïÿFÿÿ¼ÿõÿ/óÿÄÿ/ýÿ£ÿ"ôÿþÿ#ûÿåÿ íÿ üÿþÿ ìÿàÿ öÿøÿûÿòÿûÿòÿùÿóÿüÿ÷ÿüÿöÿàÿ êÿýÿ úÿúÿýÿûÿüÿ ïÿ óÿúÿýÿüÿøÿûÿðÿÿÿ óÿ óÿ ýÿôÿùÿ÷ÿüÿþÿüÿþÿ ûÿûÿ÷ÿôÿúÿøÿ ùÿ øÿÿÿüÿûÿÿÿÿÿ þÿúÿüÿ öÿþÿùÿÿÿ ýÿÿÿ÷ÿ üÿûÿúÿ ôÿûÿýÿøÿ ÷ÿ ûÿþÿùÿøÿýÿþÿ÷ÿùÿÿÿüÿûÿ úÿ îÿùÿøÿ þÿÿÿñÿùÿ øÿûÿüÿ ÿÿúÿôÿúÿ üÿüÿ ÿÿõÿöÿúÿÿÿ÷ÿôÿ÷ÿ ÷ÿÿÿüÿ ýÿÿÿõÿûÿ((þ—üó£ Ýÿü„?ûÿ ÿ¦ù)‹¼þeqCýæ|û!þQ²©ýØû]þXô[æükÿ”dÇû{üÙŽœ¥ûðû&Û>öýÂý2]û^þïý¹1 åÚþýAý5¦IêýÕý²]Ðü þáþÿ²âÖÅNöÏùäJisüÀûÿ´ºŸþ=ÿÿ ýªü–ýÈXùTÿ’ÿ ýºý&þéÿ^¤·ßû®þš*^þ@üfÑè&ôý}Ñçýÿù"ÿÇû'ýp»ÆÿcøHøÏæó6ûlø|úAtSƒ“þü¬ú•Ò˜Rüø¬ùk€&ÿ²¾ù·ý—¯MCýÜúÿü‰½cü,û]þŽäw þ½ûeý¿ ~j˜ÛþzþÃþæÿiü§'þ[ÿ1ÈÇýýŒü·5¿ûAþýþê#Wÿ“°ÅáèùQ÷\úzp§ ÐLüØöÈû™›¿¡ÿ2ø ö)ýŸ›Ùýý­‹sÿ,ýûïýw5"ÜîþXþjýþ/àiPÿnúïüºÿGù¼ÿ@ýü=ß­Ûÿ~úŽø·þe´OÌýùúÅü’¹Yºû)úLý0B_þ üdü¯š­s:û(û>ýù…õŸþëûþk2bøÜÿ™üáüýi Äÿcüªú"ýÝÿŠ _ÿ¯ü3üRGVj+^XÌýæü>û«Sÿ|ÔÿãÿýÿÉøþ÷ú¥ý þ[þž…¾¹îýúÆûuþ|½äüÕüû ©é þ\úþ¯mYBðûüûû§þ‰H +íþŸüBý\ÆæÆ.üþù[ù_þJÒaÿxý›ü£ýH6 [þ‡ýêÿ›ÿü†ú¨ý<ÿŠžÿèÿ &¨&ÿ’ýû]ý‰€Y]¸×þKÿW5§÷üiý5þÍã‘ü½þ'ýÁ çþóþ¸ü¨ÿ,þãý:Æÿq%K»Ý•ýSû¾üÿÿC”×7ÿq;þßÿüTÿvõ?/þfýýþ ýüdúIþ<ìä¿þ-þ¥¢ýñÚGÿ:ýíü×ý&TYO.þxýSô…üçøíý‚ (s®B´ñíææGí‰øGâ x ”;þ øPöqø/ýcú›'ÿlüõûÇýØŠ¾[Fþ£ý‰þþÿWz¡³ÿ:ÿ,ÿ·ÿPüÿLèþ@LÿŽþˆÖùþólü å Î(atõæðÖ Ö åÅö´xæýŸÿ¯øïô…ö'üî £ þ.J×ýÁûsü"ÿf…£ÖÕñÿ_ÿÜþ<þÕþ4ÿæ²%l6ÿ¢ýÏÿRÿ ÿ¨ÃÿµüØÛ>÷ñäü8x.g;·*ÝžÙd¿¼4Ó-ó28Âv -}ù˜ôõgøzþi«¶ X ìæ«ÿEüÍýÿ$ÿî &,osPþîþÖý­ýÍKòeƒÿ“ý+ýþóùD\ÿÞþ\ 'ñßäöøšÝJFfOK2ª½%ˆ €¼¯íÖA9È1\ÌQü§øiúOúzñ0ñ‘÷3®ìn •ÿ‹òÜð.ô5þOÉ[¿“±ÿ¼ÿ“ý/ÚÿžýüHûƒþ¤[Š~þƒöÀý°óÊéüh“K#j†I›¸€€Ð©íz%¢G BW p@ó¥ìŸòÍ÷OöùóúÞÖ% šDþ¨î¶äºëûéGGRþú’û2ý/ÿæÁþÀý;ý¹ûíìÑ Ô¯ûhþkìYäÐú%!ÁZMqiHÍÿ©€€~¨žî/SºH3-Z 1ð´åéAîºòÙüwÿ ¼Ðp çãóvî_î»ò^±’ · 1 ¡Jüü õÝûý0ý {¯ýï!þ‘ ìçæjß½õž"Ô\´w™H†ü—§€€†¤ ðÑ5ƒ]ÂT‡1އëùÛúÞÂçtñ™ûÄ á –S³˜ jþ{ò¶æGëô¿þ8 Gä Ö,ùbõ¨ú£÷¥ûß¾ Qÿ–öÆ êvê®ç)ý«#(dåsBNô¾–€€í§„ø¦I’ow\:„>àÑÖnâïc‹?³!Ÿ 6õ¥÷ãæ±àß²ì\áUÇþ ýþQôîìïÕó¡ý=ý»nÁ B—5÷ýZã”×UóU$ódA}/B¿ëC€€½µdSOv¢]Ô']úäÜÎ÷Ø{ê¶ò±ÿ01N£'ˆŒöôáÛAÕKáØõø D¡¾ž |ö\òJñ›î÷6ýþ®— |Ø8ê ñ¯Ú#ÖÕò—6HusÏ5SÛ€€€+Éæ)úp#uNr$ç°Ð2×DÝÉê|õnþ€ N„-®(¸‚ûá‚ÏÓŠå ÿ¸´ -!ïíBì*ðÞýÙû@Ë |Ú*÷:ê¨Ó5Þ äA@vfrõdº€€‰ƒkëEIËvúwó@ºà.ÊÓ!åŒéœø‰‹))f;e-ÀõéNÅ:¿±ÓØùÍF6m*ïëÅæõà¼í¤óŸÜ Á°Ž“ì-“î+Üøà ®=ÁwÜrŽ¿º€€ÛŽyôrJH}m0¢þßêÍEÚ=ê'ç>ò+ ¾8.š<)4ýûÞÀÆ&ÆàÄ ;"¨(L)aåúì/çëJîø, ¶<éüó‘ÿýíÛÓÜb ûCï{¶vùßµ€€ê’»øßJýq+j5.¥ÕæåÓÕÞwà2òÅÔ*gAŽ9ý'è–̉ÆÙ•ý&ê#m §cøù„ðlçnìûðïùdX¹—ð®ô­×ï\ÚÞÛ!„@‡}»v×Ƕ€€»™Öõ|;U\eJh+WÉú)òóßùÒÒÏâaó0¤J½7$þê(ÑÍÏzÞ¥ùó T¿%äãú;ñ‹ë\é“ðÀýªøþÓô0ÛtØ¿ø·7 rÌoÝ-yË€€ù•­â¬%=FÓIø4\°cïMáEÑÒÕ1å\_(÷5¹2ä ýSß–×(Þrï%ÿY åö ]ýñ¹è}çeðÀ÷^ E`–¿ý”ùóŠÝÍÖÚø4ìg-hG/\Ùݒꀙ™@Ñmô)Œ<†;[.Ÿüþà»Ñ]ÐàoÿÅ,™0·#Œ =ó á ß¶ænõ>¢ jv5×ülñÝæ“íBô–þ|&Õ ÉcæžØ¦ñ'¼ZßaÁ.µç«U‘’ŸGÇ¢òœù+ 4<4«'j^ñŠ×ÄΧØçîÌ =#É,l'˜ÝñÍè.æ<êRðAÕjŽIºYøî[ìð¦ùrû†í%UdxóKäó_JAóC“ BñÍΖÀýÄ0ÏMÞ8ñÚýì)¼$¢Ìó´ìŠì\ñ,ø&» 3}Ûg¤Røúó ód÷&þÉB8 Ã÷ÿŠý\üü7ú'ý­ü-ý¥maúðï þ• + &!ÃûÞëeã½ßÐß[ãŸìÀø¦š é¢  2ðþYü¢ü9ÿÞé°°ƒ …ÒLcþöþ á#ÿœwtÿìþêÿ¥þÊýƒ’¹úõôÿUå 5·üEöÔñBïïðæôÔú-ÿ\ü ]É¢#c…Žà–Iï20ïÿÅÿ1<=ôÿÙÿOéÿ7‘ÿªÿ¶4–þþ£ò'#Õ'Bÿÿ%þ^ý›ýüý8þGþ»þÿÿþ*ÿ©ÿúÿÍÿåÿ3PN•]>}–cTuG++:+ øÿðÿ6 $äÿ ëÿÚÿïÿíÿäÿòÿéÿëÿûÿúÿæÿÝÿîÿ"ñÿ-îÿüÿêÿøÿ(óÿýÿùÿíÿêÿïÿ0ðÿõÿëÿ#Þÿùÿ õÿ üÿúÿêÿÒÿáÿÑÿåÿïÿüÿèÿîÿ'òÿ%ôÿøÿëÿ Öÿ ×ÿäÿ ìÿ ñÿìÿúÿíÿèÿòÿ%%Úÿëÿàÿÿÿ ðÿòÿþÿñÿ îÿòÿûÿôÿ #ÿÿåÿêÿãÿïÿõÿ ñÿúÿ ðÿ ìÿùÿ àÿ&ìÿöÿïÿÞÿéÿìÿãÿúÿçÿüÿ!íÿêÿüÿ ðÿõÿïÿøÿîÿ(æÿïÿøÿìÿîÿøÿóÿ óÿõÿßÿúÿ"äÿ ×ÿ ùÿ öÿàÿüÿÚÿÕÿðÿãÿùÿõÿîÿûÿöÿöÿ*Úÿàÿðÿ ýÿúÿîÿèÿîÿñÿìÿõÿûÿ÷ÿ%ùÿýÿïÿØÿ÷ÿéÿÿÿêÿ äÿ õÿõÿßÿêÿýÿûÿ)ÿÿþÿôÿòÿ!êÿêÿ õÿûÿõÿßÿëÿçÿüÿæÿõÿêÿñÿõÿÿÿþÿÜÿóÿ æÿðÿïÿíÿûÿöÿ$þÿæÿüÿìÿ ÷ÿæÿûÿ õÿüÿõÿáÿ üÿ íÿîÿûÿþÿúÿ öÿáÿóÿ÷ÿ ûÿñÿûÿúÿöÿþÿþÿõÿøÿ úÿ öÿöÿÿÿïÿ óÿþÿÿÿùÿùÿ÷ÿ öÿûÿ ÿÿùÿïÿúÿúÿ ýÿôÿÿÿ÷ÿ ÿÿöÿüÿÿÿ þÿýÿ÷ÿöÿÿÿöÿ ÷ÿûÿöÿ ùÿóÿûÿ õÿ ùÿüÿÿÿ úÿ÷ÿ ÷ÿýÿþÿùÿýÿûÿÿÿóÿþÿ ýÿûÿùÿÿÿ óÿòÿ óÿýÿýÿþÿüÿðÿýÿ÷ÿÿÿþÿþÿ üÿöÿóÿ÷ÿûÿ÷ÿýÿ ôÿþÿ÷ÿÿÿõÿüÿùÿýÿöÿýÿôÿüÿ÷ÿ úÿþÿ úÿ ôÿÿÿöÿÿÿ ÷ÿøÿÿÿþÿûÿ öÿüÿ öÿùÿöÿ úÿùÿùÿþÿ ÷ÿ ùÿôÿúÿõÿ ôÿõÿùÿ üÿüÿ÷ÿûÿóÿõÿûÿ øÿÿÿñÿúÿ ÷ÿøÿüÿ ýÿüÿþÿ üÿûÿýÿþÿöÿ÷ÿ ýÿýÿÿÿ öÿýÿñÿúÿõÿ÷ÿþÿ üÿùÿøÿýÿøÿÿÿøÿþÿûÿøÿúÿúÿ òÿþÿûÿ ÷ÿÿÿ ùÿþÿøÿ÷ÿþÿ öÿøÿüÿüÿüÿüÿûÿýÿ÷ÿþÿûÿõÿõÿúÿ úÿíÿðÿ øÿûÿõÿúÿ ûÿýÿôÿýÿöÿüÿüÿëÿ ÿÿ ÿÿþÿíÿùÿÿÿñÿîÿíÿÕÿäÿíÿ&0åÿæÿâÿñÿëÿøÿ+ Ûÿîÿ æÿëÿ òÿ  æÿßÿÞÿøÿ¦ÿDq ¤ÿ ¼ÿ)àÿÿÿòÿùÿÕÿ¼ÿèÿáÿ‚i_×ÿðÿHOtÿ³ÿ®ÿyÿÇÿ!eTÌÿ¬ÿ¹ÿäÿîÿÂl¦Úõ$ÿFÿëÿ¥ÄHÿþÐýbþÍÿ4™ÿÚÿÑÿÞÿúÿ‹ÿ-Ìÿ_éÿâÿáÿñR]­8Z–ÝŸÖϸÿlþŽþŒÿþÿ>ÿÁÿËŸw‘þ¨þBþÙÿ%YHÉÿŸþ¿ýdý0þ¿Ó¢Ïÿ}þ`ýûýÏþú­ö"ªWE€ÿKþ½þÜÿÉÿUþÁüýáÿªS<"ÿ=ÿÆfíÎ,ÿjÿ­þOþ„þXþýïüœ ÿŠýÞýÞþmÂnÁµÉpcþZý]þkñþ®þ}ÿ~iþ;þðýcdeÿ+ÿR§ÿÿäÿQŒ’üæü&þ™ôºÿ!þ&þ/ ÿTN…þÏÿ ÿíþ¢ý×Ä~5ÿLþ< ².AúýŸýÖýq}öüþqÿzÿØÿ•§Û|4 ýnü–ýVç·ÿYýhüsþÎjÿ¯5^1mý=þ¯ýŠÿQüœüð âþÖû5ÿÑ(7ÿÿ„þå™ óüÕ Õÿïühü¦T³aÿo`ÿ¼ýeü¯‚ý¤ü MßýSÿ×þ~A­$dnüŒü[%ü:üfþNþi½âý.‡iúƒõƒùž P u ¦°Èk©öæ²éÅë˜íï:õüÓÂŒLvI¤ÿ†ó”ñ8ó{ïëì²ö<þ¨“ §  ‰Æþ¸úXö¥óuòðð²õŸý-Œ< Ð á  I{Pþ²úõ•ô¦õÉùˆû²ÿ)’ ·ÉWý1 mõ¯ùˆùÚ{ì¿)T3$„ô{zßD´Ê¸Çº-ÁâÉ!äú?-…F?~@ã>.‚ ôð´ÖäÇÖÎlËfÑ è¸ œ‡+e1å/-!ÜÈéµÞÑÙ;ÒáÑØßíñu§ôM%˜+õ#ÕNKóõèóÛßÞ÷Ú½ëÚöôæ>RÞð«óåÉè§ýùˆæRóã.,:á>ï#k ¤þ+ÐעŬ¯¾ÙÊ߉ùuH7U3;2,_×ë}Ëì½$ÊZÜ›ãYùö .[9)8!Gê eóeÞiËÑ‹Ú3ìÊó ŽM'b-Õ ù "þ ã¤Þ}Ü+ÝIéèûñµ h"#Žn”=õ(ðzß8Ø´åÖ÷Aõé”´§0A"íæ ÝaH*G‚þœøæþ1 ÙŸÁ¸™Þÿï­íÅþËØELPú'Ï Å =èÐÒ:ÄžØ,ým f$r/=31$¶xöÚîBñÂÞkÔ@àù‘Ó ÇÔÐ"›mIï¶çøï»çÜçMä%ý]IK…6À™vðùëöéeö ÷!õü[ÆT ©ûàýWsþèϾÖv6s8ó]Ö 1†Ú­ ­LÓÞîTó¯B!/I\To.¿›ú`üÒâ ÅÀ«ߞà}½^2ê2üLô>ä}äŸâÛ{Û¨ð£óÁc²zUíÉÚïâìNñ/ò2ýd!$Pá …+ÿ%ïá݇å0÷Žx¡> ž¥Äï)üJñ”çøûË÷ÄÛ"ów0qBÉ@e%ŽÈ÷xí¦¼f™x²”×xøx#á7wPF°,õdì.à†Ï“ÍèÕ8÷ÉÑ'i!ô'l$0½ÿíàÔñßùê“ç4óÅ êM'q#¥WáóUàDÞŽîzý™þïØ n: =þøuøÃôSíÚè¨÷è ‚ ¡ƒ §ù$õðÙòø×þðÀòé÷„êî|%BG5ßæëò^öšÉ¼¦¾#óZ”)³&D1+ýâ]ç;íéåžÞ8æ Ý$ø$#Òw5 }î3ß‹ãò2ø1øÃýCߊP8þÆö(ïäç“ô5ÿ+30 h  zúgõíú÷\óiô¤üdÉ q Á—MŸû«ø+óÄ÷8ú*.û:÷Ãé «ãÆê b5²2À æçáó‡öKͦ¬¡ÃVó;k1P$`?±/ìüfàrãYï`ëîàøé+‘#Æ Ñ5Gê[Õûâ'û$vü ÿŸ °WþUôàõk÷ìOèEùÙ ’ £ ­ M Á MÿSó%ñ\ó›÷Åÿ+ÿûÿV eGƒÿBûûòýEù]óÀýŠ Vùpç àÜZàh46Ô-žþïºø¥ûõÉ_«Î*ø&n$a#B>F'ìïâ(ì íZé)åÌñHl/¯æ¨ÇtøIêøÙ›èfl‘úê )+„ œó×íºú<úõí•ïÍ-¨ @[LfúJî‹ò‚ûo~ùî I þSü%úíûOýú?öÑB  úÿòõê… TÜnÚ·”C 7AÀíò÷{É´¡¸Æ®ü'žZ@&Q5´&!ôbÚ³ãTîYï¯ð³ûNÝ*WC4ù\èãší ô%Í ë"ö«ëûñg(þ|ø¾ü^ ï °þøÖ«ÿ‹õöüÙCÙþK:1ÿÊü÷¡÷þ ÍþaýÓýl ½ô ÛýÞßéI·Hö"Pï£â Þ‰Àž£¢¾Wñ†-ì# !Ù.^# ùÎÜ«×Pé1ýƒüýù/(ø ô .õeô6ý–ôNç¶êd»ÐV' pþù–é‹òZiþŠú ’ TùöMý[êýÌòòûU´LÿêýPãºûýøú›þ’ ”4ùöM7öŸ˜MÛÌßÁLbTŒ$íéaálÝ5ÁF¡µ\ç×Û3&''ï+¹$NGÞ­Õådöìù ÿ•$j"Þ9þ’óôÑñðëð¥û±øÐÙhüÁôð'÷…þt Äʶý‹üoø¯û®ÿ üžPI¯ªûŒýZþ7ûýì”eüüpöô31óÝ’ß!ãL¨UD)òçO×üÞäÍ9±°Ùǃ8Ë04 ; » ¶ì[ÒæÖ ðAv Š¡ î\óÊí9ñ˜ñ³õ‚õ×ûq Žì û+þfúöôô´õ¹¬T+B §þqõ¡ùE>þ8þ]ÿñp\ <ÿ<ú›ÿÆþÄ[þoùpìÔý|õ Ý„ë ß—#?pT4LòÕÔ¿Ö¡ÓÓÂ@·5ÍW&27ï&lgYù ×ѤèÚ «è É#Ôù6ééêõõžú[÷=÷¹À4q Mü ûøhýˆôäï ÷g• n‚þ’ ª¢ù}óÄø$à&þ4þÓ@øÿ¢ûüöõÿ¯ü¸þŸüñ7ú” Œëäß1< W:?aü§Ò Ì·ÏÆ•¿hË@ó<%7:Y1 …RÎKé­ÖöÜLô8Æ39‹ýöì ísô9öŸùšA · ˜ümüûÈùÄôÇõüÕ !Á‹† ýíøÞ÷ þ‰clÿ$æCbýiþÍþ@éù(ýäûsúð L¤ïXçk ñ.?[+–Uí·ìaêÕà ĦÚèýi3¥&ü)?!zõ÷îïûïšìŽìõP"±ÿx B êÚµùãïñt÷Jú¤ûuý™üœ Ìûrþ%úoöÁ÷Vý]¯ãþl´KßÄQÿ?Ÿÿ'û÷MüïùUü¯ýÿù¡ïŒöÂòj!ÃÃy ” 5Â#ëßùàâàÝ’ÞÁå#ðbý [OŸ œ‹ýÿóííìÆë÷íóñºõTû9G£ ñ¸ Ž X J˜.üé÷øöÀõSöGõ"÷ û½ÿ†o¤ §¯ùIÙTdÿLÿ'þŽùuüÂø÷Íû=ûÙïÉ÷¸U¡ü6  ’~ Â[+¯ÿ‹ùvó¼ôõÙïHñwòŒñîóùùWû®èæR # ÿ G áù Ú ç•Ÿ½ù‰Xü.úûø‡ötö®öÊõCø+øføÉúêý¿ýÞþ¶=¦,÷2º·ž–yzþAŠ1óCù´UHš' ´Oþê)ÿÑúìøhô±ï¸ò4óÐð¢ðgó-õšùªûéüØÿ5rÝÕ Á O ­Á Û  b Qy©U†þþúú¥ùÄøùö”ö&øt÷÷ùÊú/ú~ýóþ©þQÉ"{»ã>C›WŸzÿ€ùþ¨ô4üƹðe» Õ¸K̈ÿrû*÷›òiïãðñ÷íãîáñ2ô÷)ú'ûq‡ëàÖ ¼ 'ê 4 \ Ú yó´þcüÁú‚ùoöÞø øŠ÷K÷ùmù‡ûåüšüþ¤‡ÿ·ˆ°™ùÇÅn ¿ÿj„ö½ý<“9©%^ ê \éýÿOûÙ÷ñµð×ò`ñî¾ï>òñô7ø˜ùåú wÎ C S >† : ñ  åñÕv=3þ‚üü&údù‚øå÷$ù~øaùúxúûÿþnýƒþG–¶U캈×+±•ž[ZøÑþ\Áp¼ÎV «iÿ)ÿþ•ûrøFôíðøòÁó¶ðgñFóõùøàú>û$|/f ô ) Ç @ ƒ « ¡ê ¯úVþýcü–øúø¢øàö‚÷Aùòö¯øFûuúÕû,ÿAÿëÿ9÷&Ô“«VâzyIüÌfè>œ ‰ >>þþŠüŒúöù%ô³ñýô&õ.òyônõqõuúùý,üËÿ:Cô ³ b | 7 y Á #&%Þ\¤þ8üãúuùù÷¦÷i÷röÅöø`ùÿø†úÄü°þÿûÝë#§òÕ- §æýsÓ=7îw#<ýåû,ûzù©÷²óQñÉò ô†óªóõ÷Íú•ýîþ.ƒ`_ þ w i  å  I š lR·PþIý{ûäøñöëö*öYö´õiö÷ö)ùVúbûÿü´ÿ;›pÐI¾Í² d2ÿè' öŸôO~eµû;ûÊú²ø¼öò¿ñlómô3ó$ôïõùMû%þ‡W#$ B 8 ¦ ; † ¯ : 0Tfª´Ýý5ûú€ø°öEö£õcõö­öª÷ÙøßúÓü—þãÿ ÆÑPà\›tÒ gÁÿ†è ÌáJª‰}xûÀû?ú3øöõyó¦ñ)óoô|óäóGö½øiû¼þÌÿ/Ìž ] I * , p 5 ÿ émp]öÿÿüóû©ù&÷¡öfö®ôõßõJö ÷Rùêú,üÉþå¤iû†Fñ Àen "»Wì×*Bp£&ÿOûøú›ù”÷ö¼ò÷ð©ó›ôóNô‰ö?ù>ü£þ‚õj µ H ` > ß ú M  EŠ˜(jþýÔûÈød÷÷àôÀô¯öÛõ:õ®øúújý×ÿžÿ§°¸›i5 -ÿT €Ä+ž $vÍ‚«ûëù ùå÷òöÎòkðFò ôCôô?õ´øIü³ÿ3&‹ u [ b 8 ß ª ã (…ÏKÿ´üû9ùÉ÷ÓõjõSõ<õ†õóö»÷Yùfûfý‹ÿ?ÚO㘠`¶7" Dëåù®º¹óPüãùyùoø÷õ{ñ2òzõkõ|õ£öcølûíÿ}̽ì > º û ˜ µ ¤ ˜1„)H±ÿŸüÏúÊúéøK÷Üö˜öœöœ÷‹ø¼ølútüÖýgÿ#‡¥#¾AV›cÄ4&f¥Î¹#íû¶¨þbüŠúùãø/÷[ôÕóšõøõ°öŸ÷ëøûú þ_–?¡TìŽ ¨ † È G fÚO­PáöþnýÕûû'úµù×ø6ùSù›ùéú‹ûPüœý6ÿÂÿ×%¨Ø²²îùþjá£í%P%„¯p(ÿýhûcú^ù¯÷bö]öÎö¢÷=øñøúóûêýÆÿ Õm|a<|öœour~Iñÿ÷þ÷ýLý\üîûµûžû³ûðûøûPû³ý©ÿÉÿˆÿåþÊÿBsXòÒ®iü·÷B÷ùú€þÊþ¯üÿúÜúµþƒhdäÖÆ~¦Îý”ýœþ;þnüùùùýGfëQ %Êý þÇ_É}í£Äˆÿ8´°þÅúùÊúýÍýæÿ;„ÿõþÚK98JþLüîûËþ«ALþÅûÏú/ü“ÿL^‰(+ý•úeú£ýàÚ©ðiþ}ü~û¿ùø²úÄþ/ñã/ù5®¡}Ôû¸1–ûÿ¹þ,ÿƒõüÿ<ŒþKü©únû÷üþÕ+µÜÿÿþ—þ-âYçÂà(ïüùåùtüüý´ýºüýØýþGu!ºŸøý|þ=þô0ÿ£úÇ÷·÷ û²W x5ÿ«e‹þØþÍý6ý6ÿÉÿ'ývü|ýðþüþ ÿ¡ÿB€ºëÍÿöZ@ÿVÉÿÿ—ÿ›+bí§~þRûÂøCù#ü[ÿjÅMÁ0>ýÇûüý þ÷ÿ±ÅíG·*ÿðý{üÔû,ýbÿØxxØŒ–þü9ü'ýèþ‰åg¬ºúþÐýVýOýÎýTÿ¢ÆET1ÿ‘ýCý¤ý,ÿ”Ž‚5ÀRÿfýþýŒýïý©ãúÿÁb[—Εÿîþ™ýûùÁúpþ.V€'}™­þüGü†ýÌþÁÿ6ˆ½Nÿ.þøýý5ýþÞÊ1”‘ÁMÿ»ýÌü1ýÃþ4lý^:˜ÿþmýîýtþnÿV¾HQþÿòþ€þŠþ=þ¿þ!=Ëög´ÿÿX±þòûÙü¦B«€‚ þ(úïõ&öBú‰ÿAÄv ZwûEùúœü/þy @3 ÷ÿ:ýLü3ûÆú|üÏÿË*ܹšÿ©üµúRúäüFHrÿþ÷üûšûcýÿjš“ÿý¡ü}úý'ý2þß%Þþóý¸+ Ö ÞmþÍýlýº÷Fñ2ñL÷)hZ”a±WPùTõ}÷nþWîöÓà Q6þåøÌùâúlû`ý²ÿe? òÄ™þü6üæúÜø,û_ùŸÖåÛû_úæúÍýÓF3ÆÐ¾ÈSüHú{µùoúßöi $›úLùòGêúéÞó'.0 Æ ùÿþèóiíð3ü® ú× ý U°ü óªñ÷Ýú¯ý%? ý ‹ +*ûÿ÷¢ö‚ö9øØûÕ£ A A¾Êþêû÷ø†õ7÷%þ‰\a4EQýø÷°õfýsÿsøûQ FE–þÍôðåç[à0ç´÷½ ÐC[L³ÿöÚëoéeï2üQj Ì+;Ù¡÷ïhïaôUùÓÿùíN’ þúö·ô¿óœöþO! ‚û’ÿ¦ùVõ÷ô£÷Zýcš © Y Ñôútóûþð|ñÞÝ) +ì)üèêûäëÖ<Î@ÝAû€Q#g#‡¹•xìjÜàÊëj÷Ü1rÄÿ~óë_å¢èÄôÕÚb}8b¨ùYîÕê=íŸóúÿ6 Ê l†ûû{ô¤íÒï½öPÿÊ0 \äaÐõÃìèü>þ+ê î)¶9é4©ùóVâڱ̎Â2܃ï$Ç.+å þ©áPÐ’Ø<îñ¥$à7Ûöþå>ߦãyìžü% ò2…# ü¯ïäÙä‰î¡ÿy à"I Aýxñéeí¥ô”ýÅÚ EÌM °ø²÷:êxæD¡1ç§ñe-©Hƒ@:á7Ðξȴ¿ÝkL8™A)4Ìi wùiÒÁ×מöW –!î+*ÿ #‰æü×ÝØÈãŠñS…#Î$”àýCêôäàà]çãöýÑö)’ Àüˆð†é(éºèEöHvôý¦~ÿróƒíXÞu둹 “ä´ïá>a`ÆGƒ›ÎHÇÓÅ2«²¢šÜAÍKåP76òHîµuÑ8ú<*,‚-p-x*q?Ø—Ì=ÕäáÓòYWF0ê)É÷:çµâÚàýá îL ÷##vs *üïÊç­ä©êfý›H®6îë‡ðöïçè¿ìé¨;ßôéâ8n\IL¬~ÕÍãÆ#¤ÿ|ÔéÊKêN 5A$öDô.Ãì´{ÎÖøq¢&›.`4s+ÚÝàÌÍÑzâcöœŸì1p*CfúTíÞºÝNê¨ñô!þ"Ç þýšï×ç»èjîR÷ Áî@/.òòèìë$ Œ'è¼æq+`[ SƒÙ®ËÈÈŽ¨â˜óÉ ŸD–JÜ:(/ú ¿î®ÌÖúˆ 4-:d/lûÚàÓYÛÜÞ×éäýo/É,_tüçðÓäUÜ{â—î5(!Öï ò*åå¬ì¾÷ : ¥ƒœ¤ôWôµï|ç—› ,çWé,+XÞP‰$^êÏÍŸ°p–H¹|?4FE®> 0Š(;K×¶$ÈÂèŒý( Ó×3E<&"øÚ‰Ù8Þpâ¤ên.Ï&3Öêø}è-Û4ÝDðËÈâÛÂùžåíã•í%÷übýˆ Ô Ì³ñùßìkúþùLÕKÚOL®Ö y ¾ þÌÈþ±ûéöœô$óAò|ó€õj÷³ú¢ýQ³÷DÈľ X‡¤–ÿ<þ×þ/þöýÿïþIÿèÿ†¸i »šªÿÔÿl#òÿýÿzÿÇÿ|ÿèÿ~ÿ`ÿ©´ÿ|þ¼þbŽgAZæ1„ÿìýý8üÊûÂû ü¹üUýþŸþEÿØÿøÿ‘Î÷&ï-ôÖÅË{‚vcU;b- Ûÿ&ÜÿàÿèÿËÿëÿïÿþÿíÿóÿ/¿ÿïÿI¥ÿÁÿí«ÿÄþrÿ¿ä8¥S@ÿìþ¢þÞþ¿þªþïþèþ?ÿ-ÿ1ÿ¼ÿ¡ÿ»ÿ Ôÿ5B,iQ@RB+OW>FG#üÿ Ñÿ$ãÿñÿþÿóÿûÿæÿåÿ ÅÿN·ÿñÿ…ªÿSÿÌÏ’9C/êÿÚÿäÿçÿ ÿ®ÿ»ÿÈÿÿ¼ÿªÿäÿÏÿÄÿùÿÉÿÔÿ üÿ&#þÿ4% üÿøÿ!úÿ ïÿ øÿxÿWÿ'_ý†_üéLþ=ÿ B öîÉ›tù¯å÷©øÛø} ùò¡ŠÿÙŸý¥Ýáü}ý»v$ýè üÅÏÿoÿóÙüN.üìaýyQüAþúªù]þ°Cý9ü#ê{ý-(û¨Èÿµþw#ý£R*þ˜û!þʪþ‰€þ³þýÑþÚû,DþÝþýÿÈŠÙþ%ÿjÿ†úZúôü îî$ Ûúçôþû‚'ÿ›ÿÒŽþÀú/ÿDºOý|zãü"tý6ú#²ú¼ýøQüûÛ¹ýþ( ûVú0ý÷þªeÿ¿ý „Ùþ¨þÊN¥úÈûAýRùûDüa%ý¨Ïþþ¯Ëôý÷þ}@«ý`þhÿÁAÉùÌ‹ƒúdüÜéû¸ýTíÿÒþžøßØü hü]Àûâßú¿QýÿµÙ¥ý/þ!?s.÷ÿwèýòÎûÉ%þ4,ý~úPAüBïÿŽþ+ûŽ‹‘ýÌ‚ýƒÅþb"("úÍý ¸üúû€yüÒùL^ú[ýrµkýÇþ‘ýþ«·ÿaÿBþý#naþ|ÿ0þ¼ÿFöþRú6NûÚü9ÿ3ú“$ðþßÇçÿÿêøn"ÿ ý%ÄýuÞþ(ÿ-úþ<øîýF@ÿ² ÿu§üú3íþRýú¤ÿ=ý÷Üü¸4ÿ/•þvÿ„gÿyLÿ“mvüôdÊýxsù,ú ŒÐýÖúÐ2ýØüøRñüZ΄þ^ýÚ©¢ýRþ+PþjýO9ûqþüG`Kûö]’û“.¹üþSùÑüuÖüDÿÑòþèÿ’Gþ¬õþk@2ýyáŽýÁÿ.Eÿ•þOëÿ*ÿ‚Ëÿÿ„&€ÿJ‘Æü‘d*þäLüÕð›üyÿ¬ ýãýüÃAýóVÜÿQÿxþêÆ.)bþU ÿd”ÿ‹xýy‘ÿÇÿ>éý?Âÿ¹!ÿùÿ—dÿ–þ ÿ-Lþ¦Óþãe`þ€ÿ2ikÿR´ÿWYÿÔþQÿS“þíÿ„Ù"þ®íÿ×ÿvpÿ.Nûÿöÿ{ÿ¾hþùk»ÿ½ýr–ÿÍÿ¡°þeÿ¡ÿ:ÄþéÿŒý¿gÕ×þ̶ÿ³ÿ„ÿ?hëÿ Rÿ›úÿÈþ ÌÖÿ¡ý¹øT±þ *Äÿøþ —ÕÿŸÿýÿg{ÿÊþ'øúÿ±ÿl­ÿq¬þ“®ÿZþ@MuþÆÿb&Ëý\ óÿ"ýøÿ3)ÿÍü"ÿD þàú–ÿSÎEýZ¼Œþ°Kÿ°û þeþ#û’ú0ýæüäû·ýíÿ˜ÿcÿ9Põ"(”Î0WßÿdËÿOþwþÿ·þ¦ýŽþÎÿèþ§þÝÿÿÿ-GãÿÃ…¼þrÏÇý–“þ]ùýÏoû-á I cýÒþÄÍÿÖö¡ö–üœ÷Õò­÷ û^ùùŠÿ—Î4Tòv?£—SþÇý>ÿCý”úý þ®ü£ûNÿˆrþOÿ ÿv*!.Ö-rÿñüSÿ:ó;ûæ/ €÷gÁª3üWü± bBð¨ïAù“ö|ë…ï•÷JúXøû<˜Åë 0 > ¼ ªÔ0£þìý6ý<úBù`ùúŽûùû5üxý©T7Ó>…"VT%þ”ìýxú_¸û?ñÊõI.@øÊÖ£]ÿû §ÿ€ñÊçð-ï©é;ì¯íø§úªÂ÷äÅj8d»ñ©õþÍûË÷îôöV÷ÇôöiüÞü‡ý¸ZÂ3)Iœö:ÒÉÿ¸ý:ÿ*ûÅ÷:„ûBì*ô!ñ¶ýï;€ rËúÇrÿüîÑçåäÁãùæŒíâèì©ÿW›ßÆbŸ… úÐÿ+ørö‡ôïbì/ñÁ÷lõÄöìýr„å‘ § ë ç 4Oùó}ü ûš÷Fõà}úIé‚ï-ú Óà¦&;ßüÜô`ïGïÄäÏÕeÑÊÞCò«ñ ï¯ü$£!à|v  !;>h¶úhù6õdêiãåñ}ô%òûöiÕk« Å÷¤· ö>ý'ú”úÂø»ñ(ô.õ°õy‘¾õ‰ññ90K'ÿ ;Ó7þ6ê™ÑMÊuÓÌß°Þ ØìâÓó ­ æ$¶$•)Ρ "÷ïçòýèLàrÞÆå·óËúº¬ · ON©†{Péü®÷ñðFìŽçIê~ö!Hýè)É ]Å«ÿæììÕ'¤*½Ht÷Æó¸ø>ô£Óq»~ÂÛœïM÷žümw®/»9ê-wÉ£ ˜Ó÷»ånØØpè®ôhúü2Ìÿ"__–ȶÿE÷ï­çðä¨éIô·ý’¨ ³Ó ‘*[øÝás÷©Ù)È+vfìñûõ¾âwȺÀ›Õëõ^K“×0´7Ò/×N¯ïÊæìVê0ß*Üç+÷õ´PÍJ Òýhòå,àècï¹õsøEä ‹¶?®ôÆãò‘¡)™8I+‹õè&ã'æCÝüÏ´ÄŽ½µÉz쀇$‰'Œ'ó$F"„%PY ÝóèÞÛÿÞµêôÛùýþˆÇ!J´ qøÖööõ5ô{ðàíVñPöÿ, Ò  ³Ï ñ•÷ èÓó/•+cE¢=;ðuÕMÎFÎÓmÑjÊIÎ:áè‘!°49Ç*4Ï H 9øüÅñ‹äxÞÓáòå%¼êˆ š [úû“òIë”ëôKûþ IAKÖ¼ j qõ¹çìï ™)ÉD˜Ev"÷´Ó~“Â,ÑÄà,à‘ÝNááñ‡ 7%ð:N7U!˜ ±úoómôfý þãóøî¾ì€ô_©´p yÿwú(úÃý{ëùAòíí3ô,ü4 ° ºXùÿV¯õOôîû_,CªJQ+8aÖ–·è®ë¸æÏêÝfãSí#÷"a #6¯>ü1A#îÝæöílö}ú ÷Øõ‡ó>ö§)]ßæïûò¸ñKø û>»;ú_õDóYú´ÿ°h ß ŽkñÇëCõçl/‹IëKÖ-aÑV´y­A»NÓ°ãfì0ïóunü0a>¿9×&óîï©àáAî‚ú ãþ>ù½ö+ü÷,qf Süòí6ë¡ïøUè0ýû1úEë íŒ ,öDè¿ë%¿DòSh:‚ÄÖ;®† ¶®ÎîHÿƒ! i 1|8Ê-FuõûÜÔÓ›Üòï…n-üÿvÿ¬ú g` ¹ø½ë§å:êøyM 3ûûaûGºØ bùbéEìáe(·HU»6õÿaÉ&¥‰œö°h×køf'Šcp#ñ3Ï3QbÄä«ÓÏÕOèjr’'>ÿšV OC‘žùþëçä)ìÄúU  ÊUþûù„ OÄ -éùÚOêÝ=úW5Zº+õç}´rŸ²¦ÂMæQþCËü„zþ"z3Ê4© Ýÿeã8ØÛlë9/í§ ƒH›¾ 1ê ‘ÿõònê¶éIðÿý p O_þsÿ³µ6öŠüÜ÷Œåá ü˜2 U,a†R(ÈÊ—¶•b¯ÇÌïì£d%º')ú3}/œÍrá¿ÏóØÉðt]Ë»Uwì ˆ¼ þõqíÂè.ô!† . ¥âáü|ÿá² ëüèõîÒù½Ÿù½í úx'T-`ÈK–^Ï —J†ö¡ÌÚð[“Hã!¯1_/µTø ß^Óa× í^ ¼ô¼õ=‡e 7 aiòè´æŠðä“–ùªöþ¾ú–üòÿ,ÿýü÷÷ò ãüíên÷å&¯RŒ[§F‚È•d‰å©ZÚû’ I€G#:/‘.¯·ñ©ÕØÏ߃ö– Nƒ' Y . îúöîùèÐìcøm × ×Qüký“õ3ÿùD÷š÷Eø ÀuýÄâëU#PZdaÉ:×þÕ›÷“µç«~:¾ ÁÀ-Ü2H% ¥é²Ï\ÎýåúvòZÄ   è Ö¹ï{åŠêð÷Ùಠù ÐcDþ¾¹RÿOùÉôóüûÏh8 ´zûáréC%Å^Ób 1uê¹T£ž¦$Å$ìÜÿÕùÂ'Â=¡6„>ùàZÓ\Øvñž i% >æ  |éŠõýéEåüì|ýG aéÿùï ‘Å‹ù¿õ$ô‹øLü\I4ÿî ^ùåcíÕ)‘göe+jᬲʦ.­WÅIáZõWýþæW6?Fƒ6 cç…Ú…Ü_é×öÛº $Œ ø! šô êôèÙïØö2üO̲À Å É äýÂõÝñï÷zúœü°þj‚ê¨ uöiØãþ'i…g‰%fÛ®¶äµ/ÁËr×YæóaX²:oDÄ.ëväçÞëçßî\ð~ögN ÏÖ„Oã XðEåzêÐôùÿùîÿ*o  – :!ü¶ñððú¢þýâü—ý8Ì< Ÿ Âô÷Öâ&¦i©fvŸÒ'¸Å'ÒÓÓÝÂìê’=EÕ'„ü%ãâçAößõ&ìÄèƒõ– ¡D"P*¾ÿ4ó‡ñ£õ°÷Aöiò!÷b<ƒÆü&û½üüÕù.ö[ö#û b Ð ¹yûE2 †òØŸç,.´o¡g†]Ѱ¼|ÊÂбÈFÅXÓýì ‚)q??Ñ ÷úxéëñ¡ûäñ5á£á¯÷“¿!W!•J 4ÿO÷©ö¸ù„÷“îEë«õq €øÇÓÿÝÿóûTö?ö8ügÿ¼ýDþ_ ö¤ýJünýõüGø>ó+Þ8í;.éh`TÜÖ¦ÈQ×cÙrȇ½®ÏÅñÉ ð!/ -&~ÎøÓú¸ø™í‰å}í>ÚäëlÂf4ùìô-ùpû”öó™û7ž i0±È‚üø"û3ÿeý ùVúšÜº0ˆcý2ûú$úHì Ñõ«á‘õ/•VNGÁÞêæÜªØSÏ}ÉæÏÌâ5ö úh ¼c Úü¼ûIý-ú…õöóþÄ „ W y¡ÝsžûÐù>ü‚üIü «#|þÏýÿ–þ&üœü°þ,SM/öýþãô)ÿ?ývÿü… ÿ#þóý2Âeööåƒö¶"@82TNøIò¨æÝÕuÒàÿîàøA´‹9 ’þ×ûºûù­÷ü)ó±ñ²ÿKý þ¥ÿOÿVÿ5g´ÿ#]€þný<ÿ'Bÿ¯þøm!kþÎÿÙ¢ý|þ!aÒÿ"þ­þp'„ÿý\:À÷íXÿøY+ŸÆ”üÿõùèlâßé²öÞý³î7føßö ùû=ý£p7B·ÿ,Rùÿݺ2cEváþMÿÙ'Tþ²ÿ}ÿþ»ÿQ¬ÿ…þôÿ;›ÿ±M¯þÿ´qü£þRdÿ õÛïš!¦ x oü°öôƒñ{òï÷Ðýç €ÿ^ùq÷ ùüþ¯ÙóÇÿˆþôÿ&SnëF&9¾ÂÍ/#Úÿ28¹jÍþ4ÿªŠ„þðþœÞËýrÿÈ)þŠÿiý>ÿÿðU´ôb÷¤ âF Zú™øPýÿæüüÐýâ¿Áþ´ø²ù¼sþ7ýþFIkáþÁþh†jôÿò§ÞÿÿÿÆR| ¬ÿœUbSÿÙttÿqÿýþ^ð÷ÿsÿðþ@\åûÛúªKx%øõÁòRú¡ Ï@üµø þ•„žý´ÿ~þ˜ÿÞýUÿqÉÜÿÇ"¦ÿÙýX¸üü¶ þÂûFøþ¹Neáý4ú8ý>ƒ ý¢÷ý ôLJPú™÷!øÿþ)3Kä<ÿ|ýe÷Û÷fÿrÔ¼˜õƒ÷ ýÕþ£IµNÿˆý&úèÿýÿÈü–ÿüPùïK ìÿû­ýîýþ«™íø¬÷Ìÿ*M[4/Åü-úlþå Aþüùo÷¢ÿ—J{ý(ˆýoúZù4çpüËÍ ªÿ Jª=3ÿ$÷ïûðLÿRü—÷güÏýð 4ù«úüõ„ý5{dÿÈûò”ÄÿÒý’Qùúvùÿ×0ú¸ÿtÿ3üë™Kúù#—MHãúÒý‡ÿ&ÿqèÃûyù,ÿ?Šïþuþ-þZÿ22;ýFö<ú ùÚS×BþýüOÿ!·þoÆÿ2ýdŠ)öcøÃ ¸†ÿ…óÃò}úþûý1 ·}úÅôë÷¢þŒÿòÿ*ývû¸ý‹vþ°þÿH3ÿÕýãÿGdõLþØýz -uÿ¼r^ÿÿ7ôPëþ©ÿrÿòÿ†ÿðþH'ýéö;õ+7M¹Óòtìãò1û<üPûC `Iþô"óúe¥bèdÐÿ>ú£û¢ôìßÿ9ü`þ6êÿOš÷ UÿÎü)ýþÿÉ7÷þªþ•×þŠþÿnÿFþÿ=ÿ†ÿNÿÑ)ÿ<öÿ¾üëLøåóç¾Ë\÷!éMìBö«û—û_ÿcx çËùÈïîòþ/]þZáýÙùpû#rŽþWüxýMÿ—ÿÞÿšÏ)žÿýøülþ!õÚÿ"qßÿ®þ¸ýDÿéÿOÔ…ÕÿJÿwþýU jÿ„ú÷¸ðƒÿ1ö#J›ë¶åûêôˆø"üõA 2 ÜÇö`îùñ^ü}k ´4o¼ü†ù#ú‡ý“ºÙ NüüËýÙý{ÿõ$q¹ýsüŸý†ÿ–ÿ 4&üþ5ýÄý…ÝTïþºþ‰ÿÓvU›þ&û^o.øãíöûž²2(Çêä¦Ö_Þ«ê„òkø[5…]xýïŠëQóDþ’„ Æ  •ÐIû­öm÷)üô2eýýºúaû¥üëþ…ifƒ%ýæû²ýÏþ›þÿB¸›Ìÿû>ûNýx¬uGÿóÿQþïù©ðRæÊ5&M¡13ööÅѸlËKè«üFF"j2ûžè?âïñ/ \zØ Rø®òsò-û‘œ ‚OìüÙúæúüþýÇÿCXíÿ`ûÉù‡ýä+~OÔ!ÕÇþÐûŸEü“ýÈ¡ùÿõj&ÿño¸ ÝçóØD Ts•AÔÍ€€'ÁÜK/¶/~#h!wÎ ˜èNÊŸÄjã†ù4*3…ŸÓôí.êÎédðúÿ‚­& ¿úçð,ëoï^ùÝT0Áé »²ø=ïnîÛõpã Ûæ<þ¾þ—ù¸õ ögüDÔ ¢ j¶úéø$öšu÷½‚[ôòÞçý°Bo_P‹ì¾‹€k¨6ùÉ*Ì4}'æ©å_ñ¦ËjÁ¾Ø8é0­?ï+\Üï»èéMçÀëêøð$â#ÀÙ÷´èÞæ\ìäõuþù|/^¥óøêŒì&ô-‰ 5¯ Ö íåûòJî!òŽÿ˜æ À ŒñþEüèû"þèùêü °þúóªØ0í,eeZb/Œ´€¾‘¢Òeà(Z%g!]$ë#– 9àŒº¸Þ!ËA\B.&<šîõè<åâ¾æ\ök)X23(ý/Þ€ÔþáJ÷o @Ö‘‰Î òý¡çVÜ©ãFûCãOæ"û…÷¶÷ÐöXógó'üw ’ýÈ ¥öféºê§öçþ—©íÌã½÷<Ü$ãò XÁj48ÆÚÍŒ€ ªµðc$ä2æ)¼ ,û€üçÔd¸À¨í'ÅH·C$6þyäÞÏâmç¡î þW¾%F-B¹—ä™Ô¨×¥ë*ðu´¥Üø†ì{ãYä:ó¬v JÌôïŸð>ôš÷­ü[ößÿ½ï(ç5ëÆöî± Ñ¹þ¥íK×Öìl*¶gj³"ž½€Z€/¿ÿ10b!ÔÑ Bï ËѼ2Õ8~Hb3= aì!à†àèïPü X Ø'G0èeØQÞ!ò±˜‡p5 F’úKïmçoëûN " ¥ûàñaôÆùùÙû/ªn 8 j îÿõaðØó¡ýD´ ÅÄüT Ö4çÖñ;3%jêaí¦¹€5*ÎHg0¸+^7¤â'÷/Õ¡À*Ñp/ND;2x îìûátç^ðµõþøûÿ“ ¯":ÂôÝCÝáíf<> ˜ =-ú§ð(ìßïbÿ p!+üÝôNó÷üáþÆð Þ Fõý7öêòe÷gýÝp<ÙúIf3ì¨Þ}ó§(+[p\­ ðÌÄóŒ¾yýç(p0"’p–QëÐ Êàì Ò2­>…+"è½ßèáò€üºþpï ¼`ûÍþœëáæ+ùB pû*âüpù¾ù6øøëú†ÿÉk  Z¡ûÛôÇõùù…ïüF//F‘ý¢úcúûÑþ}A¢Ôÿ¶-cñÂèõšÎEÃJ5&Læ(«ÿ–~±ççkO4¾2\ ÷ÿË÷þëùßÞGìÐõ$z1;*‰õð’ß/Þçèú{à ” r ž f Knù»íEè#ë÷ø× Ì2 Sÿàõ{ó0÷Wü]þ³ýMþÁb{  É;ùAõ?öEü²®&UªTVýüü§úý ÿ¨ý˜ Þ Âùqï0õ4™:ÏE˜'×ë'±·™|¯íåQ‡;'9UÌzóŽñKö÷}ò íæîøý}&%&Û_úãå”ÞPçòùÈÔñ–¥ØHÜküîôFñIôÂüÊŠ› øþVóÛð¯õü{ô ´KÈkÿüú*ùsûI¹ºàmáýØü†ü§þˆ×þðÿ«üó˜ùwóøñN0¦<ó(LúÃÄ#¦?®Mר u1¹:). ÒõüëÒïløDû¤ú÷T÷Ú²ËÐOôýíÍã¤èœöãâ‡í ‚Ìû[ùÐû þ{ý»ühûüäÿD¹ Yþ!úìøxøIütFÞmeÿÞþºþ¹ýþéþØŠÈÓ&€ÿÑýÿ³ýðúa=üÍõõø‹é*Í9:-¼Öⱬ¡ÆLòd#2ë/£Òzö¦ñ¨ô¦ùPú=øözúßðb !ýÃðñë»ï[ønÍ ¹ ¯Ä$ÿ*ý[ü üSûûûþüÿzqªšý†ú.ùâúvþÑã|Ùÿéÿxhqþ¾ü(ûhü­ÿ >êÙ}ÿÒþ'þYüßðúTô+÷= $x4æ0{DéÃô±‹½ÑÜÚ( Œ*˜%‰µú´öTø2øçö1öËõ«ûñk«Ïú îþ²óªí‚ïÐ÷_ ˆ ÷£Üûþ¿þ"þúüäû×û)ý‘ÿÚÊuÀKÿüYû†ûjþ㮳¤Òðþúýyþ²ÿ¨,1jÿºþN«J~ÞÿÚúgÔûø¼úŒ d H/§+uQï«ÎK¾Ä]Üùº¢ÂZÿ ñaðþ‚ûp÷ô'õÑù’ 4+ ~²ú[öY÷Aúÿ¨ZS¸¬à1ÿOýèûûðüƒÿ¯ƒ§10þ'ýàýÿ›ç/ÿiÿëÿ<PZb_ÿüþmþvþ”ÿx{Ì[M„ÿÖÑÿ%þóéúÙ÷ðúúöÀ&~!:ÊóWÛYÒ­Ù…éÒûfa |ú4¦_ ‚ s¼ü¿öîõûùÎÐ y†cþRý–þAÉd8ÿvüLü2þñ·)²QÿÆý*þýþœáÃÿÿÌþ&ÿ+ÿ×ÿ1ˆ,áÿtÿ«ÿÈÿ“ÿ,.Ûÿóÿ|>­ÿBÿÞÿÁÿ/vÚèÿfâþ¿ÿÁþý›7üNùBüÃ|´[yõåç)çJíõ#úûrùNú¶ÿ·¥ Æ £Úÿ;üü&ÿù:øj‰þ~ÿÊFùôþçý þ/t(Ž•ÿ±þÿXçἄÿTþÆþpÿR\ïÖÿ$ÿNÿ¸ÿråÿRÿqÿ‰©¥“ÿ=ÿ/ÿÌÿ#ŽgTçÿÍÿûÿ9"kÿ‰þ‚Õþ*¨8ÿýüëþoêh — üXù—øÜø…÷øÛ÷Iøªüþ«ÿ´’ÆÛJR)”ÀLe…N>\že²ìÿ´ÿOÈÿ-«ÿÐÿ—ÿCÎÿ%¢ÿPéÿÿÿ,Eÿ5—ÿZ(ƒrÿ!ÿþ¢ìÿIüÿüÿîÿòÿ·ÿPÞÿ«ÿwnÿg ÿ^»ÿóêþ ÔýP÷þþ1ü×ÿ Dp ë±ûú=úÜú–øõùáùµü’þÿÿzþòþnÿ-ëÃþ|)ûxgO{<vR› i,.eÿ —ÿuÅÿ‚ÿ“Äÿo“ÿxÿÿX ½Lÿ8DÿiT!tÿÙÿÙÿuÿÿWÿ÷pÿ)Åÿ›ÿ¼Xÿi”þ‹ÎÿiÿF¸ýº¥û+ýÊüxüi& ”>ÄžúúGúûtù;ûšüOþ$ýcþÄü\ýíý^ÿ^þ}|ÿe`8ÅBÞ'!¶¸ª´1ÓM3´ÿ)¤ÿÏþFQÿ‘C˜ÿ=»þªÿ?)€ÿ:ÔþõqÿñNÿúÿ<Uÿg~þP±þ½#Cÿeþ Bû³²üèÏüFdH®þ}rþ¨mÿ!þ¥BþfÿÃÿx4þ¹MýmÍýÿ¯þºÛcú.´ù%Õþ0ý7NýZþøkÿ·óÿ¤ý»÷¶ûfy½ÿ‚ÿ²¹û‘ÄûMþyýpþ]4ýj¦iÿàmú§kÿóü"*ûËEùŠüËÞû [ŽþVµýçøjlüûý6NüåÜúÃ…ÿpú¶üEß ûÖÔþ²Öü±ý0tŒÿWþÙFÿ‘ÿS…ÿ¥ÿ*„þ­áýxóþóÿ—ÕýÉüñaý¶uÿƒâþw¼ÿ»üWûOñÿ¸àÿÅü“ûþâûy$ú‚ý$ûþÌÿoÜûä/üïÕü„ÿ¬þZlþÜþ%ÌüÒüÝÿŒ½ùâ”þdþEWúPûDVü؈Kût{ý¢ý¥þûc—ûBÿIþþ;ÑþJRý ¾ú¡/ìüá§wýŠ1ÄùúŒºú žöYúÎâû*äþYöû{ÝÆÿFñùzGüŽúZù¿þXñþXeûÓþýÿ©Ó5ûrþ•üÉýËjÿÚÿZþPYûVö ú7Zñú¯ÿÿðÿ¨ÍüNÿà9âzùlQû+™øƒûZÄø¸ ÿý4ÿhûZÐý“¶ýÝÿö Žö› Æú}ýïÿííõ–ûx Éúëäõn Õùýÿÿ?úsŸ÷{ s÷XúWÇý<…üþ ù×dû¥âžŠÿÛúúEû\û6Æød ô’ žôí ñó ßö¡þf Dúý¾¿"ýÝ÷"åÏü>þN œþˆúþ®úÖ k÷){ÿA/;ý¥ü~³þî÷^Àÿ´‡–ÿüi%úƒÿëú(;û1‘ølûzÈüáùËlü¥ ]ïw #ôÏ ëþùð Øù’ñC³ý8ûS¾ÿøÂ$öú†?e¿òã—ÿÏü<üqDûôÿmùí 8bò'Žù¦bïÈïPüü;rôµCôÆ÷þðùbü¤ÿæñ {õ¬4ôç¹ üþsÿ?ùÌeþ ¤þ4lÿþ ÷ûoþ.ü§üV <õB yò ¸ýþ¯ý£þÔûçÚô-}êÝïñªm¬þ¢ ø)ôý½ˆ!õ ÷ü¾ñhÐþ—µõbN÷… ­ôAÙþ¥ 0óÈ ƒïH³ùvÿúÿÖýR ô;¶ð¿ûýú¨6÷‚úý?ÌûE¢ ð*ñ÷ù xyjña %üÁù’ý‘)žú7ü¤Ò¯þ¤ðö ¼óX Ïùš²Žô ÿ`ß÷9ôþoÜ÷5ô£ ×ýÒÿPBóŒï}‰ôïáò$ö-DòÙ”÷ eþ•ø µð ÇÿH‹øQ ü+ý-ÿ¯ò ­ ÓõHýlý ëîëK Øü·üwü¾£qýýªßñªø…ýPõþŒ$õž÷*žW‚ú¬ö/ —÷Wô P­ù1ü%ÝÿŸ˜þmaéL†% &í* Ñ ù¹õ–*GñD•ÿ"úrö ü "ú‹ýÉú:Dí3fÿõùü8 ö«Ï àýjóå &é„‚úÊüujMï •ÿ·öSüü Âý÷6ÿÛ£ûÝï­‡¦«þíÆäùXñØ~ôfù¥:)ùVþžñ7 4þ’ýÎ VÂö gÀìñ ò¨óýË êýoÿéò@ý TùÆþžÿ „ûƬïÞË÷ù ›û2ý‹õûc ;ñ1 uõî‡ðó3î€ qûn¹B÷® ƒù Êò¸ú9ˆþ¢ø¢GËñ‡þ Dþ4ÿ¾ÅÉôCö fès ñ1 í‰?÷S'ò1 Cë—ðô2¤ûÛýˆ¬õ( îòŸ ÈöU¯$ þö¸ ½öÒþùÿUþœüÊ:ªúý¦úù¦üàÜþþ ð! ó÷“ þ‹þ±óð )õ5gçò=é€÷jó¬‰ñ’2øŸ èôË|ùª©ìLÎè îò qïù èðÚìó ÷•ó¾Üñ! ¶õµz÷u¥ÿ Ñý¼ÿæû³úðýÏ;ÿp;ó=œõª ùiò> ‚ð‡j÷ÊøíA>ñ¯îD,êzkæb‘ëÈ ø2 cùeM÷ž ¼öy óý¯ý¾ü$üãÿ8éøæQìùpÿ3ý‡ Ìö±]b¸ÿ0úçKÿúøtöß÷èþ<ù -÷û]þÙ ØøÕHü?ƒSÿTÿppóêLýé»F÷<¨ñȆðõó¿¶÷GîWòñÞðã ôõ3Àô\ oóO ýAY;Yùm %ú@Cò';ý¾Jòù ŽñW,ïÄ L÷9ûû3àZ| ûÀ¤ù­ øÀ<ùÛcóøÛ Sò¿ yõ¼òÿ9õ¹ ºóÁ Åñò ÞõEÃþ2ýù§ú œñ¥ò æïë Â÷«KûŠW÷Ôœô‰ GöFnûhþEãþeÜö-ývüù°Àýicøð ¯ð<öl †ý…³ûKÇþèö;HØö©õ› @ù£ñþÞù| Qô{ ó5“ëJì°îø œçýô‰0þ‡^ùòÿ²ýË ù‡.õ@ÿîü™eü\ªcâü›ý†þœ©üèø#èý˜^û§õ{–ìUò@2 Ö÷ ‘ò¼ö1 †ù) 3ð& ¢÷±gïÕë3 ÿæ åø˜Ëýâ€òoðìä }ø# ðì÷/ +îð ˜óàçòt÷ù¬s¸ùÙûDßÿ)ûáú¬ úæ¶ø_fõ @ï B÷ÿ×RöÜKñà¹ó`‹ü)ùXû0ÑõÙ—÷ŒšòE "þM Úû­ü©,üò1ù ¥ú§ý–Žø³ âôÊ žöãÁñÿ}óswêIQòòS —ôZñjúXj nöŒ€÷µäçûöy Æîœ ®ôîlñt™é&ôü Ànóªü²I Ñð¦ çóŒ 0ÿžü" <ð<+ðVØåÌ2õ¶©íŒ ëW ìù&þDé÷üZñ ½÷>¬¿ý1ÿºû ûß óðd .õˆøõpÔôA<ÿøåð§?è wò¹±õ/†ûjõTS÷-œõ Ë÷E/ø˜Lú{ àøûü³øh±’öu2õ)uaï­ &öœ# Ûý%T÷•ýñ nòª€Þ0*äåsú1 !ü<“ú †ñœ”£fôÊ jùL Æä¿µîTÚîŽÂýÄùŒý|°ö¥7ùWñAxûÓúªþB çïÿ Fü¡ [ì° ¡ü"1푪ù¡û¦ ü€ÿÏÃôÇöòE IúK CïÕ 9ðÜ÷ô…üýÐõéÎíùŽEYüF íÅõôø ñþwø‡ FíËì9ø ý%Iúð‰þüοÿ@ñ³»ïýØí þïÆ ýÁçþ:ù¢÷f P÷ùºù„þ–õ}ÿ)þÊ ½ù«Ðÿÿ£ò ÏñçáüŽ|­ùr½þŽ5§ýÜMÿ¬ÿ0=þÁÖùó÷÷‰ãíD^ïI•þ2k5ªRö  ¡÷†þdûÏ| Üûk ûŸ9RýXø4 ñA ¾÷‚gúVÿZûv —õðj›¾ÃIñŒ/÷oôù{Lø$¹õS)ù_Kúà&õI  ï ‚þQÿ ¸ý¹ò›ü@ÿÌÿöiû,ú– Îõ…¯ fÃù×ÚýAø%ühÊõ¡þ¬ý„ !ïä LñH çýÿúnúß›þÏÿ’ùšö Žûèÿ4¿ø¿ …÷ÊøÆ9ûþýaøpÿA,ù? ÿýª—ù¾Yô •÷i âþömÿ õ= Èý÷MRýxÄü ø{þÙÿ˜'bTù×öÄ öU {ø ÿUîò‡@î~ÏöÕ ‡úÁúçüõÿ. Ñû:þýCûL`ø›ÑýYbóðÿ_EÿYûOcü|5ü ì9¬ÿáø5F=ñA bú¤‚ø| þÕÃÿ‹ÿ¼üöð wóaû‰þßý<ÿ¬=Ö0ý¦Êû’…NüqÌøÜýôûßùõ2÷Ï‚úNù©üPIû‚”YûÈLö‡ü¶túÀªþ¿þqõ‡êýbÿ›yûn ÿ,úN<RþõýïýŸ_þ4S·ünøüÿIX÷O"ø˜–ìÿÝÊý'ýäBüÇîûyýõ¶÷úáÜüåÛú\Íÿ†ûEšý…Jþb^÷+pþ1þ(1èýhÿsþAÃ3zünØþ •üðºÿ_¥ý‰ñþùø_ýËþ$þ±sÿJgüÇÿA0¸û",ÿÓýrþÿmBRþP:þ*øÂ!cðÿØý³ú±fMùíÙ@þeþÏþ\fÿδú¹Ïû§(þAþ&Éü\óóo"ÿëý_?þ…ƒþEûb û¤cùÿþè„û{)òÿ¤þiÿ CÿtüA úJ0ÿ>>ëý Îþ$þ\ÿBxÿ¶ÿNÊüë#ü Ëÿ ³þÕ€i4œüvzüáœý©aý µÿ‡ÿ3ÿ<Gûý­xþÖæþ¿þzþ©Øþ¤¡ý`Šþ lþ¹ßÿþ@­ý…wýôùýœþBüEYµÿ›ÊÿSý•ÿÞ¡þ®}ýó÷ÿßÿ´îªRÿYÿðý~nÿþQþÀ²þ‘oÿI þ…Áÿáÿyÿ\ÿ9ÿ¶»ÿ>ÿfòýI‰þ ˆþ†ÿÉ<OåþPžýÏûý­©ýUÿ¾äÿÍþ=äþîþrÀþ4Þþ¶ÿdõÿoÃþ¥Úþÿómþ¦5ÿ„ÿcˆÿ »Çÿ±ÿåÿ¶qWÿTÇþlÿÿYÿàÿ¥üþãÿ©ÿðÿw¡þºuÿÒÿ#ÿ £ T0ÿ…œÿW½ÿsÿ@vÿ0èÿ¦5Csÿ^Hÿ"ÿB%q¢ÿu¶þBÞÿä}·ÿÇÿnÿöÿxºÿéÿ%Èÿ&!.‚ÿeÿ.ëÿùÿ70’ÿîÿ"'»ÿ,]Úÿrðÿ™ÿëÿõÿ¬ÿÙÿXÝÿ?ãÿ÷ÿ6Mÿ,®ÿYÒÿÍÿóÿßÿHÖÿ$Ñÿýÿ8üÿîÿòÿÆÿÍÿñÿ 0<5íÿõÿËÿåÿÂÿîÿæÿ !!Íÿöÿÿÿ öÿñÿüÿþÿøÿöÿÙÿ çÿÿÿôÿ&éÿ ôÿôÿçÿýÿõÿîÿ çÿðÿ ðÿúÿ ùÿôÿøÿØÿìÿüÿíÿìÿòÿòÿýÿøÿâÿíÿûÿ #ûÿûÿæÿñÿ'îÿöÿðÿûÿöÿêÿùÿüÿ÷ÿðÿ þÿöÿýÿùÿ þÿíÿ ìÿ ÷ÿìÿøÿýÿ öÿþÿðÿöÿýÿúÿÿÿùÿþÿüÿ ùÿôÿôÿÿÿúÿ ñÿøÿùÿöÿùÿÿÿþÿùÿúÿùÿ ÷ÿüÿüÿ ûÿÿÿúÿúÿ õÿúÿüÿÿÿúÿüÿóÿúÿüÿ úÿÿÿðÿþÿ ùÿ÷ÿ üÿöÿùÿýÿýÿõÿþÿóÿüÿ÷ÿ ÷ÿþÿýÿûÿþÿùÿòÿ õÿ÷ÿ þÿöÿþÿ úÿýÿ ùÿ÷ÿþÿþÿ þÿüÿùÿÿÿøÿÿÿþÿüÿøÿþÿùÿõÿþÿòÿÿÿøÿ ÷ÿôÿÿÿþÿúÿ öÿ÷ÿþÿÿÿýÿýÿýÿúÿüÿüÿ÷ÿ øÿÿÿýÿõÿþÿ øÿøÿÿÿ üÿ÷ÿöÿ÷ÿûÿüÿ ùÿ ýÿñÿýÿ ûÿüÿòÿþÿ ýÿÿÿøÿ þÿþÿÿÿûÿùÿÿÿùÿùÿöÿ üÿþÿüÿ ÿÿùÿþÿùÿûÿûÿöÿÿÿúÿ÷ÿþÿýÿ üÿùÿ÷ÿüÿ úÿöÿþÿ úÿüÿûÿþÿÿÿýÿýÿüÿÿÿüÿûÿúÿöÿ ýÿÿÿýÿîÿ ÷ÿøÿÿÿôÿûÿþÿýÿüÿýÿöÿøÿûÿüÿùÿöÿøÿöÿôÿûÿûÿýÿ øÿùÿýÿÿÿþÿðÿöÿøÿ þÿùÿ ðÿÿÿ ùÿúÿ úÿýÿÿÿøÿøÿûÿýÿùÿ÷ÿýÿüÿ ôÿöÿÿÿýÿ þÿýÿüÿùÿúÿüÿûÿ ýÿùÿùÿþÿûÿüÿòÿÿÿúÿ üÿûÿòÿöÿøÿþÿüÿýÿøÿÿÿûÿøÿ ùÿÿÿüÿûÿûÿôÿüÿúÿúÿúÿÿÿöÿüÿùÿúÿ ýÿ õÿïÿ öÿõÿùÿÿÿþÿÿÿõÿþÿðÿýÿúÿúÿ ûÿÿÿüÿ ûÿüÿÿÿÿÿñÿ üÿùÿ ùÿþÿþÿ ôÿùÿøÿùÿþÿýÿüÿôÿüÿ÷ÿ÷ÿ öÿøÿúÿþÿÿÿùÿûÿþÿýÿúÿÿÿûÿûÿüÿ øÿÿÿûÿ øÿöÿôÿôÿÿÿüÿúÿÿÿ ûÿûÿüÿÿÿøÿõÿþÿõÿüÿÿÿýÿ ùÿþÿùÿÿÿûÿüÿöÿ øÿþÿ ÿÿÿÿúÿýÿ úÿöÿÿÿÿÿÿÿûÿüÿùÿüÿ ùÿ õÿ÷ÿüÿþÿ þÿþÿòÿóÿ ùÿúÿûÿþÿóÿûÿ ÷ÿýÿýÿõÿþÿ þÿýÿûÿùÿýÿ ÷ÿþÿóÿñÿÿÿúÿ ýÿõÿùÿ ÿÿöÿ÷ÿÿÿ üÿýÿûÿûÿüÿ üÿÿÿûÿýÿôÿóÿÿÿûÿýÿûÿûÿùÿöÿýÿûÿ öÿ üÿùÿüÿ ôÿÿÿþÿ õÿ þÿøÿùÿüÿÿÿüÿÿÿ þÿôÿòÿùÿ øÿùÿóÿþÿ úÿ üÿýÿ÷ÿÿÿþÿÿÿþÿÿÿòÿöÿýÿøÿÿÿýÿÿÿþÿøÿùÿÿÿýÿþÿ õÿþÿøÿ öÿùÿûÿýÿúÿÿÿþÿÿÿöÿìÿüÿøÿñÿóÿ úÿõÿ÷ÿüÿÿÿúÿþÿ ðÿÿÿôÿîÿõÿúÿüÿüÿüÿüÿøÿúÿ  ùÿÿÿþÿüÿúÿöÿüÿ÷ÿ÷ÿùÿ ÿÿ þÿÿÿôÿêÿüÿöÿ ÷ÿõÿøÿþÿùÿøÿþÿûÿûÿúÿýÿùÿøÿ÷ÿ  ÷ÿüÿ÷ÿêÿöÿ üÿóÿæÿæÿôÿôÿ÷ÿ  ûÿùÿõÿòÿîÿðÿôÿùÿþÿ ýÿ ÷ÿøÿ÷ÿûÿ  üÿ  òÿíÿðÿíÿþÿöÿ öÿ÷ÿÿÿ ûÿïÿòÿôÿüÿõÿôÿ÷ÿþÿ ýÿýÿöÿôÿûÿõÿûÿùÿõÿùÿüÿ ùÿúÿóÿ ÷ÿÿÿóÿôÿùÿ öÿäÿîÿ÷ÿþÿöÿúÿùÿøÿûÿùÿûÿøÿúÿ üÿøÿûÿÿÿûÿ÷ÿôÿðÿøÿ  ÿÿþÿôÿêÿíÿ ÷ÿñÿúÿ þÿôÿîÿéÿéÿòÿ òÿãÿÞÿäÿòÿ ýÿöÿ÷ÿõÿðÿôÿûÿÿÿûÿøÿöÿõÿóÿôÿùÿ úÿîÿèÿèÿíÿõÿÿÿ  üÿ÷ÿòÿìÿéÿêÿòÿÿÿ"øÿìÿâÿÝÿÝÿâÿëÿ÷ÿ ÷ÿíÿçÿãÿæÿíÿøÿ "ýÿøÿùÿýÿúÿôÿïÿéÿåÿäÿéÿòÿûÿ  ýÿþÿöÿåÿÙÿÛÿëÿúÿüÿ  òÿèÿèÿíÿöÿüÿûÿüÿýÿ þÿèÿÞÿäÿöÿ òÿéÿöÿ  ûÿÿÿýÿùÿúÿþÿ  ûÿòÿöÿúÿúÿüÿþÿõÿòÿ ùÿøÿýÿÿÿÿÿõÿöÿùÿìÿóÿúÿùÿ÷ÿâÿêÿöÿðÿ÷ÿúÿüÿ ýÿøÿóÿüÿùÿ øÿöÿóÿöÿ øÿùÿîÿõÿòÿôÿñÿùÿìÿðÿÿÿùÿöÿ  üÿúÿþÿýÿùÿ   þÿ÷ÿ÷ÿ÷ÿýÿ øÿìÿëÿëÿóÿôÿòÿêÿùÿûÿûÿÿÿûÿúÿþÿþÿüÿ øÿöÿúÿýÿòÿòÿþÿþÿõÿ   úÿúÿïÿÿÿþÿôÿÿÿüÿúÿôÿñÿòÿöÿøÿóÿòÿ  üÿ þÿòÿÿÿ÷ÿõÿíÿûÿýÿúÿöÿüÿõÿýÿûÿ øÿûÿöÿíÿúÿòÿíÿýÿþÿ  ùÿçÿèÿëÿôÿðÿîÿüÿóÿÿÿûÿùÿûÿúÿ óÿçÿéÿæÿöÿþÿùÿòÿüÿ  ýÿíÿïÿüÿùÿûÿøÿýÿÿÿ  ÷ÿüÿîÿýÿÿÿøÿÿÿõÿ ÿÿúÿ  úÿþÿõÿîÿìÿëÿòÿüÿõÿ÷ÿ    ôÿ÷ÿ øÿùÿíÿçÿðÿöÿÿÿýÿúÿöÿ÷ÿùÿ  þÿôÿéÿêÿêÿìÿûÿîÿÿÿ üÿóÿöÿûÿûÿùÿüÿøÿûÿ üÿõÿôÿõÿêÿáÿõÿ üÿ ÷ÿ÷ÿ õÿóÿòÿûÿüÿïÿóÿðÿþÿþÿüÿýÿúÿùÿùÿÿÿþÿùÿ  úÿúÿðÿçÿäÿùÿòÿ þÿùÿðÿòÿ þÿ  øÿíÿæÿóÿöÿùÿöÿôÿþÿöÿþÿôÿ÷ÿ ÿÿýÿüÿ    øÿ þÿîÿþÿ÷ÿõÿñÿýÿ  ùÿùÿôÿüÿðÿëÿêÿêÿðÿüÿûÿÿÿ  øÿþÿúÿìÿøÿóÿèÿøÿòÿñÿ  òÿöÿûÿúÿüÿ ûÿÿÿõÿíÿíÿýÿþÿøÿôÿùÿ  øÿöÿùÿøÿôÿ ÿÿöÿýÿòÿõÿüÿóÿþÿ ýÿýÿþÿúÿïÿüÿúÿöÿ  ùÿüÿ÷ÿîÿóÿ  õÿëÿäÿïÿõÿôÿþÿùÿõÿóÿûÿ÷ÿõÿþÿýÿúÿùÿöÿ   ôÿúÿ÷ÿýÿùÿüÿðÿóÿêÿâÿöÿôÿöÿ üÿôÿûÿùÿ þÿýÿ  öÿýÿûÿðÿüÿùÿõÿðÿÿÿûÿ÷ÿ÷ÿ   øÿüÿðÿþÿüÿ÷ÿïÿôÿñÿüÿ  ûÿëÿïÿðÿùÿøÿóÿöÿ   þÿõÿóÿ  ýÿ÷ÿÿÿóÿòÿ÷ÿêÿþÿþÿ ùÿûÿÿÿùÿýÿýÿüÿúÿüÿóÿôÿ÷ÿôÿþÿ øÿúÿóÿéÿÿÿ üÿ  úÿÿÿóÿîÿëÿýÿúÿõÿýÿ ÿÿ þÿ ïÿðÿëÿõÿðÿïÿ ûÿüÿöÿüÿíÿíÿçÿóÿþÿ  ýÿúÿþÿíÿïÿëÿøÿòÿôÿûÿóÿþÿîÿ ûÿõÿ÷ÿúÿ÷ÿüÿúÿýÿþÿ÷ÿûÿ   ûÿùÿïÿõÿëÿäÿäÿüÿ÷ÿûÿõÿþÿ ýÿôÿñÿúÿôÿöÿ   úÿïÿæÿíÿõÿïÿñÿ üÿüÿõÿþÿúÿøÿÿÿ ùÿùÿïÿñÿ òÿêÿêÿæÿôÿþÿõÿþÿüÿ  ÷ÿéÿøÿùÿ þÿüÿûÿóÿÿÿñÿêÿïÿøÿøÿÿÿÿÿ üÿýÿîÿýÿöÿ÷ÿíÿäÿçÿïÿñÿ  öÿúÿóÿöÿóÿúÿ ÷ÿöÿóÿïÿ ýÿóÿõÿ  ûÿîÿéÿòÿúÿùÿøÿôÿûÿ÷ÿøÿõÿ   úÿúÿýÿûÿ úÿùÿ ùÿòÿÿÿþÿþÿùÿúÿýÿùÿþÿôÿûÿôÿ÷ÿõÿþÿûÿôÿ ýÿúÿ   þÿøÿõÿøÿýÿòÿóÿþÿ ûÿöÿõÿõÿþÿ ÿÿûÿ øÿçÿèÿðÿíÿíÿëÿïÿöÿ ÿÿ ûÿýÿýÿüÿ÷ÿøÿôÿóÿóÿ   óÿ÷ÿñÿûÿ÷ÿôÿõÿñÿ þÿ þÿýÿíÿúÿ ýÿøÿöÿùÿëÿëÿïÿùÿ÷ÿöÿõÿùÿøÿôÿôÿ  þÿùÿüÿúÿðÿÿÿîÿùÿñÿýÿþÿþÿôÿðÿñÿøÿöÿùÿ úÿ õÿûÿüÿÿÿöÿýÿüÿüÿþÿ øÿÿÿôÿüÿüÿïÿêÿëÿíÿ ÷ÿùÿ úÿèÿçÿðÿíÿëÿìÿïÿóÿûÿúÿøÿûÿÿÿøÿþÿöÿýÿùÿùÿúÿ   ùÿõÿüÿøÿ÷ÿÿÿ  ÷ÿäÿèÿëÿøÿôÿóÿôÿöÿûÿôÿúÿ ûÿ ýÿÿÿ ûÿøÿûÿ   õÿõÿ ðÿäÿâÿçÿìÿöÿýÿõÿûÿýÿüÿ  öÿ ýÿòÿþÿüÿöÿõÿøÿöÿ ôÿýÿüÿûÿóÿ üÿòÿîÿðÿòÿóÿ ÷ÿøÿ öÿåÿáÿæÿîÿ  ùÿ÷ÿñÿÿÿõÿüÿñÿõÿ÷ÿþÿøÿýÿ÷ÿ÷ÿÿÿþÿýÿûÿûÿóÿóÿ ÿÿðÿîÿòÿýÿïÿøÿêÿþÿòÿûÿùÿõÿ ùÿûÿóÿüÿûÿúÿõÿ üÿõÿõÿûÿõÿñÿ ùÿúÿ÷ÿ  ùÿøÿùÿôÿêÿíÿçÿòÿûÿ  þÿöÿíÿêÿþÿýÿûÿÿÿýÿ÷ÿþÿ÷ÿûÿ÷ÿ   üÿôÿæÿçÿçÿ÷ÿíÿóÿíÿóÿôÿöÿùÿ÷ÿùÿþÿ  þÿÿÿýÿþÿìÿõÿìÿåÿéÿøÿýÿøÿÿÿþÿþÿüÿûÿüÿûÿúÿ óÿòÿ   ôÿéÿæÿíÿøÿòÿöÿïÿûÿõÿöÿõÿ  ýÿ úÿüÿõÿüÿòÿþÿ÷ÿõÿúÿñÿÿÿ óÿôÿïÿýÿ  ôÿîÿíÿöÿñÿôÿ ñÿðÿþÿ ûÿýÿ÷ÿõÿüÿÿÿõÿÿÿôÿïÿõÿ ÷ÿëÿçÿíÿóÿ  ýÿüÿõÿ ÿÿÿÿ öÿèÿäÿìÿðÿðÿ ûÿöÿîÿòÿþÿúÿôÿøÿõÿòÿ    ùÿìÿìÿñÿýÿúÿþÿýÿðÿûÿóÿêÿ÷ÿýÿ÷ÿûÿ úÿïÿéÿñÿôÿ ýÿ÷ÿïÿêÿ  øÿøÿúÿýÿøÿ üÿ  øÿþÿõÿðÿöÿíÿæÿçÿüÿ÷ÿ þÿ ûÿ  þÿöÿøÿûÿûÿúÿ  ôÿôÿñÿûÿöÿ÷ÿòÿòÿöÿüÿ  óÿúÿòÿíÿìÿ þÿ úÿôÿïÿóÿóÿðÿÿÿýÿúÿþÿúÿ÷ÿýÿ  ûÿÿÿóÿùÿíÿçÿëÿþÿÿÿóÿúÿðÿêÿîÿûÿÿÿÿÿ øÿÿÿ÷ÿöÿþÿüÿøÿùÿúÿøÿõÿ ýÿñÿÿÿ ýÿôÿçÿãÿèÿîÿðÿöÿøÿïÿñÿùÿþÿýÿüÿøÿøÿ õÿûÿòÿûÿ  øÿýÿüÿîÿõÿÿÿ óÿúÿùÿûÿóÿüÿùÿ÷ÿ ðÿøÿûÿöÿüÿîÿÿÿùÿùÿüÿøÿðÿ ôÿúÿúÿùÿüÿþÿ øÿöÿëÿòÿþÿýÿÿÿÿÿ õÿûÿõÿÿÿÿÿñÿðÿíÿõÿóÿóÿ þÿóÿÿÿîÿêÿ øÿÿÿûÿõÿõÿðÿþÿöÿüÿ ÿÿùÿ ûÿøÿ ÷ÿýÿûÿøÿ üÿôÿóÿùÿúÿôÿ ýÿøÿøÿ ôÿéÿçÿðÿúÿõÿõÿ ûÿùÿ÷ÿþÿùÿùÿ  õÿñÿöÿüÿ øÿñÿ þÿúÿüÿÿÿðÿúÿøÿýÿðÿ÷ÿõÿýÿüÿøÿþÿüÿþÿùÿ  úÿíÿùÿþÿþÿ÷ÿþÿúÿöÿûÿøÿ øÿïÿÿÿ ÿÿûÿüÿøÿþÿüÿõÿÿÿÿÿøÿüÿþÿÿÿýÿüÿýÿþÿúÿñÿùÿûÿ õÿøÿ óÿûÿþÿùÿùÿìÿÿÿüÿúÿûÿøÿÿÿ úÿúÿüÿ ïÿýÿüÿýÿýÿüÿöÿþÿ  ÷ÿýÿøÿùÿþÿ÷ÿ ÿÿöÿøÿøÿýÿ ôÿ÷ÿýÿ øÿûÿóÿ úÿòÿÿÿ þÿÿÿþÿþÿþÿñÿûÿúÿöÿ ùÿüÿÿÿÿÿ øÿòÿüÿûÿôÿüÿþÿùÿþÿùÿÿÿ  øÿïÿïÿôÿÿÿûÿüÿ ùÿ  òÿ øÿüÿÿÿúÿþÿúÿóÿúÿ ùÿ ÷ÿýÿóÿÿÿ  øÿþÿôÿùÿ÷ÿ ÷ÿôÿûÿûÿ÷ÿüÿþÿøÿ öÿöÿÿÿùÿúÿþÿþÿ ÿÿùÿ öÿýÿþÿùÿøÿþÿüÿ÷ÿýÿúÿúÿÿÿ üÿøÿüÿ ùÿöÿþÿúÿ úÿúÿýÿùÿóÿøÿþÿ ýÿ÷ÿôÿþÿ þÿôÿùÿ ÿÿþÿ ûÿõÿùÿ þÿÿÿøÿ øÿøÿùÿøÿýÿùÿþÿýÿýÿüÿ÷ÿñÿ øÿÿÿúÿýÿ þÿûÿþÿúÿøÿúÿöÿýÿ ûÿþÿíÿöÿüÿôÿøÿüÿ÷ÿþÿ íÿ ôÿÿÿ ðÿöÿýÿïÿúÿ úÿùÿÿÿ ûÿ ôÿúÿ ôÿæÿ úÿõÿõÿûÿôÿüÿùÿéÿ üÿ úÿìÿêÿóÿúÿðÿûÿúÿòÿöÿûÿëÿðÿòÿ% áÿýÿèÿ ýÿÿÿ úÿæÿýÿíÿ Ýÿëÿ üÿ) ôÿÝÿüÿ çÿ ûÿîÿ âÿäÿ þÿòÿÖÿ -ûÿÙÿþÿâÿ ôÿùÿÞÿ þÿöÿåÿöÿ!úÿâÿåÿ ÿÿõÿûÿïÿùÿúÿýÿûÿêÿëÿùÿùÿéÿüÿûÿ öÿþÿ èÿ óÿùÿ ìÿüÿùÿ úÿòÿ üÿóÿõÿ ðÿÿÿúÿýÿöÿóÿ ïÿ ðÿýÿ õÿúÿôÿ ýÿþÿ÷ÿþÿøÿ õÿòÿ÷ÿøÿ ûÿÿÿôÿûÿ üÿ õÿóÿýÿ ûÿÿÿûÿÿÿþÿÿÿòÿ÷ÿùÿÿÿ õÿýÿõÿþÿ øÿ ñÿÿÿøÿýÿùÿ ÷ÿøÿþÿ þÿ÷ÿ üÿõÿüÿþÿüÿôÿÿÿýÿÿÿþÿúÿûÿÿÿøÿõÿ÷ÿúÿ÷ÿ þÿýÿõÿúÿÿÿùÿûÿùÿ÷ÿùÿýÿüÿ þÿúÿ÷ÿýÿýÿÿÿýÿñÿùÿüÿ úÿüÿþÿíÿúÿûÿ ýÿ ñÿ öÿüÿþÿþÿ  þÿõÿúÿûÿüÿ  öÿýÿ ÷ÿøÿþÿ÷ÿ úÿùÿøÿÿÿýÿûÿóÿ÷ÿýÿýÿÿÿøÿøÿþÿóÿÿÿùÿ÷ÿóÿþÿýÿüÿ öÿýÿ ÷ÿóÿýÿúÿøÿùÿÿÿ ÿÿöÿøÿûÿýÿúÿ úÿ ÷ÿ øÿöÿþÿñÿøÿ øÿûÿýÿ ôÿüÿûÿÿÿ üÿüÿüÿüÿþÿÿÿ üÿ øÿüÿ öÿ ùÿöÿ ýÿùÿúÿûÿúÿüÿüÿùÿ÷ÿ üÿóÿÿÿòÿúÿòÿþÿ ûÿÿÿÿÿþÿ÷ÿ ûÿóÿüÿúÿýÿþÿúÿùÿ þÿñÿ îÿöÿ ûÿÿÿ  ÷ÿ÷ÿíÿ øÿ ÿÿúÿõÿöÿÿÿöÿýÿ üÿôÿýÿëÿþÿ òÿ øÿéÿ óÿïÿ íÿûÿûÿùÿêÿÿÿ îÿìÿôÿýÿôÿÿÿüÿþÿíÿýÿçÿ ïÿþÿÝÿûÿâÿúÿêÿ÷ÿ ýÿÿÿüÿÔÿìÿëÿýÿ úÿäÿõÿüÿýÿöÿ þÿèÿðÿ ôÿüÿûÿúÿùÿ!ïÿ öÿÙÿçÿøÿóÿðÿôÿ îÿÙÿ åÿñÿåÿôÿ ßÿ úÿþÿêÿøÿûÿ îÿÿÿïÿùÿ ÿÿíÿÿÿ þÿúÿæÿñÿùÿðÿ ÷ÿùÿ óÿ îÿûÿ ùÿùÿöÿûÿôÿùÿùÿúÿøÿûÿõÿüÿõÿÿÿýÿøÿ÷ÿþÿýÿùÿúÿþÿêÿûÿûÿ üÿûÿýÿ÷ÿóÿ öÿîÿùÿ úÿôÿ÷ÿ þÿûÿñÿöÿøÿùÿ÷ÿ ýÿÿÿùÿüÿûÿõÿ÷ÿ øÿüÿúÿõÿ ûÿùÿûÿûÿÿÿÿÿöÿùÿüÿ øÿÿÿøÿýÿþÿ ûÿüÿóÿ ûÿúÿúÿøÿÿÿðÿþÿøÿûÿÿÿùÿøÿúÿ ÷ÿüÿÿÿ þÿ÷ÿòÿùÿûÿûÿ úÿñÿþÿùÿùÿ÷ÿóÿüÿ ûÿøÿõÿùÿûÿóÿûÿþÿÿÿ ùÿóÿûÿ üÿÿÿûÿûÿÿÿ ûÿûÿÿÿúÿüÿüÿ úÿøÿ üÿûÿúÿÿÿýÿûÿüÿþÿöÿùÿÿÿöÿøÿ÷ÿÿÿÿÿöÿÿÿöÿüÿúÿþÿ ûÿ øÿûÿùÿ÷ÿüÿþÿöÿýÿýÿøÿõÿõÿÿÿûÿ ÿÿþÿôÿÿÿýÿ öÿüÿüÿþÿûÿþÿñÿöÿ úÿ óÿûÿùÿ ûÿüÿõÿ ÷ÿ÷ÿùÿÿÿûÿøÿþÿùÿûÿ öÿûÿúÿ ÷ÿþÿ ûÿýÿøÿÿÿ òÿúÿ üÿþÿÿÿÿÿòÿüÿúÿ ùÿüÿ÷ÿþÿ ÷ÿõÿýÿóÿöÿþÿùÿ ÿÿüÿûÿýÿöÿ÷ÿ ùÿþÿúÿ÷ÿüÿøÿûÿùÿýÿ úÿùÿýÿýÿ ûÿúÿ ýÿþÿ ÷ÿøÿüÿýÿ ÷ÿúÿùÿýÿýÿ üÿÿÿüÿýÿ ÷ÿøÿþÿýÿ ÿÿÿÿþÿôÿúÿúÿ óÿÿÿûÿüÿ÷ÿøÿöÿ÷ÿûÿÿÿüÿùÿ úÿ ÷ÿ þÿùÿùÿñÿ÷ÿ øÿùÿÿÿ÷ÿ õÿ úÿ þÿþÿþÿñÿ ÷ÿøÿ ûÿüÿûÿúÿþÿîÿ þÿëÿîÿóÿõÿýÿ öÿ üÿ ÷ÿâÿüÿóÿýÿ%Ýÿùÿñÿîÿüÿìÿûÿüÿúÿ÷ÿùÿùÿ"-ìÿðÿèÿüÿøÿ×ÿþÿ ôÿíÿûÿ6õÿþÿúÿÜÿçÿ üÿìÿ+öÿøÿÔÿ äÿÈÿôÿüÿBCÝÿ´ÿÅÿ ÕÿïÿäÿõÿßÿóÿOôÿïÿ/' åÿÿÿµÿöÿ]FÜÿÐÿ)§ÿûÿõÿÏÿãÿM9àÿÓÿ0Tíÿ0”ÿjÿe4«ÿâÿ2ÿÿæÿ+ýÿ}ÿñÿhWôÿ`ÿ½ÿM7úÿ®ÿëÿöÿáÿtœçÿ·ÿÍÿeúÿäÿûÿ*OŸÿÃÿëÿøÿI!Çÿ¨ÿ¹ÿƒŸóÿ«ÿ¾ÿÜÿ*uñÿéÿ½ÿ·ÿ6Ûÿ‹ÿe¹vÿ~ÿt¢\ÿ‚ÿœõÿ’ÿóÿºYlÿäÿ“YúþäÿWÄÿÊÿ½ÿÅÿZt%„ÿ8ÿ=mkÿ–ÿÄc©ÿ<uÿ–ÿŸÜiÿ•ÿÄŸÿšÿ}Öÿ ÿ£ÿ‰GNíÿäÿuÿ®#6’ÿäÿiìÿWwÿoÇÿ`Òÿ„ÿ§˜ÿÚþ±ÿèœÔþÿ#ö™ÿ¨ÿO{þøþH7âÿ±¦cÿDÿåÿ×DoÿÄÿäÿ¢ÿçÿ.6¶ÿ2ðÿ8ÎÿIßÿ?¿ÿÿ;yÿåÛþèþOyþÿ¢%þÔþ»gKÿ ÿ-´®ÿ"ÿµÿ2GÿFÖ ¤þ-0ÿi~wÿDÿà®cþþì"äþªÿo9Îÿ^¤ÿìÿ8ùÿrÿ4Êÿ#E~ÿ†þ%’þiþˆ[ÿPÿ§Ãÿ(÷þ±þB {þhÿ²¾°ÿÝÿ,ñÿ.Êþßþ˜žÔþÝÿ š¶ÿNfÿ§ÿjÙÿ ÿr.$ ÿþþ ?ßþ¯ÿWˆÿVÿy¡ÏÿªÿI9”þ9ÿÙðÚÿO’ÿIdÿ€1ãÿÌR“ÿ™ÿÿÖÿ‹©Èþýÿ>YŠþ~ÿÚç«ÿˆÿVš¶ÿ¿ÿQÕþ_ÿ¤°ÿ+ÏþN‰Èÿq-ðÿûþjUžÿ¸ÿˉÿûÿQ+ÿ´þD*Øÿ¦ÿløÿÿqÿÒŒÉÿÃÿ-±›ÿÒÿcxGþH`þãÿ­œýxüäÿbòîË!9Eùÿ†þ{ù>÷ öx÷×öT÷ôøºýòÿC¬ÆV I  ¿EÈòÜÿbþûù8øAø\ùŒø”ú¬ýhÿ}Và’IBÌ{ýϳù8úKt÷wôaû7GÐý³”ëw£÷µï¸ì:ñiï'ëêî·øžþoÿ¾9 ô è~Qçþ­ûÎòDð¨ðÚñDóÉð’÷úþ÷ôõ8œÐ h . ³ @ú’™ôÐõKþ ëèähöu&Ž J9 y'8 Žë£éÅÝÙÚ˜×ÙaÔ„Û î:ù *L#ý,Á')ë'ÈÃ8¦ûNîfæ¬ÜRß@ÜÝßçuì¼ù¦ô Ù'¡ƒ˜–áÅ÷.ûaçôè¿öÛåâà!ïô) x,5&‘1%³ 3 OOïóܧÓ'Úh×ÿÌØêèpø¤üÀ Yõ(^*[).†(+¶,çýŽí¯â¤Ü¾Ü¤Ü+Ú—å[îÈøà )M’!£èØÈØÚú¤üPï7í®ßAè¦ósäWãõü´V.U2bÄ / ÐÎá<ÔÏÑ7Ó¢ËâÉײíXü2ýªn(Š0ø/Þ-‘3ù*ÎO^¯ø½â)ÙfÕ ÛŽÕÛÍã™õpï¥R %Í#qep7 Íü¥÷ôÛæããtÚié·ä(é+üýöåúò #["Ç'Þ'*+è19¾Höùí˜ÑcÅËâÁžÏ§ÎÜïö‘ /#5;Ñ=Q2€)–$©>üMìgè´×Ñ£ÎYÒQÛ׿]î!üØN ú'ñ'(!rì }÷ó¨ìñã*á®ÝòßäßYñ¥ïÃ÷ €˜'g(¶*G v(W õîÃêDâ ÐYÅw½8ËïÛ¯ÙLäÂ=OÅ(.ƒ8é9!*Ѐv9ö·çƒàÔß ØÔÎØ·æ†òlôÑŤ@Ç . Æ ¬ÿèõðì`å²â×â[é²åõûóýÇd / W($›%>÷$è Lñ5çSåÒ`Él½–Ç<ÛnÜ=âÅùð&ø%Ø4é:#,ëc@Ã2ð6ßPãgá'Û¤Ö©äWðà÷xÿÕþ)íøÊ(=(Xýú=õkîæžè–èLõŠëžùºù¼Dz dc $S *!=Žp&¤=ôçvêÕØÎÀïÆ6ÜáßDÞ¹ñ ž½ !G*½7Õ.ÖAU­ú\êSæuè’â.Ú{ãì ôwú€ü”W#­K"³ ‡|R0÷í‹îë ôïUô#ï~+Òþùˆxÿ"°#1%"÷+íÖþ4ïäìåþÓu¾/ÈÓÒöÙÝÙÊäèûF” %$3U3¿(ïLz ºöíëMïGè‰âwÚbãäëXòLôö`  çËh”bíÀ4‰ý´õøîØö®ï!ø¾å­ô~žøÓî8úg]¡ Ì9+‘#³ ûûû+õ\íÑÊÁÓ Ù÷ßRלÛÅèÝþ rUªX+À"] 1%… Oäý`þ¹ðbêfâáðàé¥éÏë ò}üªÀÿjúx õ È ±ÿþÕ/ýíõÊù@ëø·ÿØï²çøô ò~,ȹ ïü©üâ÷ÒéQÍ2Ù·Ümß)ÛÞéí–e ƒ ³(ñ?Ë4 ŠÏZ‘ýóûáíÎç:ë$ð_í)ìÇðVø¸™ÿ?nŽ> ? Ç ü"àøÜùuïðÿpïàú‚þÄôkñ§ýI¥§¤&3q1ú!öœî6äÌöÔXÚÜÛ/à›ä]ó > ë z¯•%ç"v—#˜ Ó3ÿËôDõ‰ï2æLê×ïî…ô@öø÷Ëo º ù_ K£b„>ÿlûŠöõü öË÷ó&šô,ø®ø±SLMIž3¨R÷‘îîáaÑhÚ1ß.â³éRî"ú IcNé ˆNPëºEõ¾ô7ò ð‰íÅï§óCõû)ýL € Ù’ äV …œ\þÌýýýPüKõü°øéûúùó ¢øGýúÿ®TZ«Žo¹ èzò´öqðväVØâ~äSìUì„ñÚ ±Ï ‰¸‰ý < ÷ ¦%ú¹öôuøÿñåíôØ÷Éü|ûHüç3 !°‚é „ÿß—ùúüd÷€ü\üvûòúØýÿüTýöDlüúû|Í2y 9º›Š•ûtõKøíæ>Ú”àÆé§íŒèöåH ˜r 5êÆù} ” Ûyú©õÉ÷®ô:ó·îà÷†öøüpü¯þdü$d   ]*_Éíý&þzü*ø¸ÿÿ÷4ÿoùCúAsö6R™û”ü+…óÍ îþêóu þ#ø½ú,öêèçÁèÓóHïÁò´öY¼.‚.õü¨ G IÿÅþ,úRüpú[ö›ù0ø-ÿÁú¤þéþ®h½>˜;ßoÿË-ÿrýþü³þWþ?½ûóúZ õ†¶ ùkýÿ M 5¢ K“•þCýKúºö¼ï4ëíÉò!ñ#õœö²8[ r ‰ f ‹a±iˆþg•ýžýùûýûÚ}üþ’þkT‚ÿ—„Ïè{ÿ§ÒÿüÅÿ­ÿEÿÂ$ÿòÿµþüüÙœùS$¦úêüªWô6ÜØ tÛ¹ü¹ûˆûßûÏöù÷—üû¸üýQýºöPÅ'¢l©è Äði•^ÿ¿½jÿŠgþé¹ÿÙÿxJþœhþoíþFÿƒÿˆmÿùÿÚÿÇÿ4ÿ¥ý›`„ý üªÿCX*?g¯k½ýñû¨úüûÈû-ú4üßûÌüþCý.ÿ„ÿ“ÿ4ŠUª;¸`÷â€"ˆµÿA íÁšÿI„µÿrVÿvÊÿ%GÿHÿ¬ÿHÐÿ4*>…ÿ4dÿíÿ<¶ÿ©ý#ÿ^Æ¥tmÈÿLþƒý‚ý÷ü€ýfý¹ýÅýóýyþ½þþIÿÃÿ¡ÿ$}k¹H·µªfÔgÔ_nTXdåÿQ)úÿðÿ*èÿõÿPþÿÿÿÔÿÙÿ ðÿáÿ-éÿAÀÿÛÿP""ÿPÿ ^yʆßèƒÿ¯þCþ?þhþ©þçþ*ÿXÿDÿ=ÿAÿiÿ`ÿ£ÿËÿ #&B*V1BScHG.4<+!"=)úÿ ðÿüÿåÿèÿèÿSÌÿóÿF1ÿXÿ/C{…ŽZÿþþþ^þÓþ"ÿyÿ§ÿ¨ÿ‘ÿ’ÿªÿµÿßÿéÿ3NPHO:*-?C=3&)%3ûÿ ÷ÿ çÿóÿõÿóÿþÿðÿÉÿHàÿíÿO:ÿZÿ8ùì§ù.ÿaþ-þBþ°þ.ÿ†ÿßÿýÿÚÿËÿÃÿÓÿôÿ%EWmJ7" $ ,òÿíÿ ÿÿ ýÿ õÿÂÿ³ÿáÿ¶ÿ  ˆ†Ãà¢>¯ÿqÿ8ÿ2ÿjÿ¿ÿ4/RÍÿ|ÿpÿcÿÖÿ 7BA8ÇÿÕÿÀÿÎÿÖÿ6 wYP(Ïÿ5/ 4úÿF/-=Óÿvÿ7ÿúþ„ÿïÿ>ΆS-›ÿxÿTÿ.ÿ¤ÿ»ÿ" Ýÿëÿt¹²™HØÿïÿÉÿùÿ0ëÿóÿ·ÿ‰ÿ©ÿÑÿ"~%Êÿaÿ@ÿrÿ}ÿÉÿÚÿðÿàÿU¸Õ³‹<Øÿzÿzÿ¦ÿíÿmJúÿqÿOÿ‰ÿ–ÿMg„„AžÿpÿOÿSÿqÿÕÿïÿSÅì͘@½ÿ²ÿNÿ¢ÿ¦ÿÏÿ J|w,½ÿ©ÿLÿ¥ÿ¨ÿÛÿ!ñÿSdŒG"Âÿhÿ±ÿžÿ¿ÿ&È$þ,ú^íýxÛ‹É2hÿ(×Ùøeþ?z Úûîúö`ò‚/ø(4púHoýRüôÉÁ$ûAûAôFÿ•ûA¶ÿ¨ÿ; š þ¼ùÙþû;ýÃ&$áú)ûÈøÎýýäû\û¡ÿVùüÆþpþf,ßÿ¾¤mýîûm[¡þ˜úTÔÊýõûjý¿ÿ .ûecÿuýC¸ü¢ù5SüêýòŸ‡ éï×ù¸$J‹bü+-SþûµûÀÿßl» œý‚ý¨øÑ>þ'Èû!þdþÈñÍþ<Púrqû€Øý½þaÞúéþhñþu0òøDÝýHýMÿÒaþ®þ$­–ò—ý,_ÿÖþˆúË2þ·þmüCÿ¼±]ûþÒýÂö²”³;üþ’þ)ÎUÈüžo³ýD÷$ÿϯ­ûÉÞü]Ïÿå ;ÿ©ú ÷ÿ}pù— ,µ÷bmÿjþG ºùÑùô\0÷+ù  +ûãû'þÝ þøý]Ðö#nýþÉý?þÈÊû4üHÿ ÿHPú‚lüÕ³üü±¶þÂ}ûIùLöüÆùÊ̓×öDJ¯@³üÚôâÈú€föø0¯ûù Ùÿ†ÿ úrÿOüÙû’) «êø,ü¬FH¹ýÎØÛ5óàJýŒö×þúôòDÿdñpø•Uÿ¨í .•I ÷ÿAú Ü÷ûýÚôÍ *ö þùcþbíî ò!ö7 _à iVþŒ­þ~ò"D}þÁù! b  ª Týteê d_{þ|õ×çÍæ ëBî4åsåÚüâý`íûm\ yÄùû›ý6èÿQþIÿ§ ñrô,ûKÎþ~pE±ï|÷¬÷5öoùîøªÿóù@ötêŠð7ð ñÜó ó9 ½V iº ƒöhø- AWpžßuÃõÂÑÓÓÑÛS*$¢4‹*æ+»2ª/• „ïµÜ;äòݳÒ1ÔîÐ :í~s-è.Oýzï[òtæØ{Ñeã°üÇK ß ±Ä •ð eÆ‚µèFì ä“ö‚ ”üä ÿõ-iEº(wƒê+þ Þ΀§‚¶–ËÝÅȹ®Òx$=^=Ç/É5«JE>a_ÝÕèݯÓD Ŕê»% Ê%Ì7{Al 2ù·äèLáˆÑXÁkذ÷G<qd)ö4v/, `úñ™òן܎Êué² ”«æÛ6G¬fsBJ!‡ä!ðÿ¸y„@±¿à½¼ÙX"g`eO!E?G´:”ùäÀj±ö¼ ǰÄçÉ‘ò~0±J—?Y/œ=k;—ÞáëÂtÈbÖǤ¾ÙÜŒ -2&+ )°/`<,ŽýÔz×FÔêå÷¿Ì`þ à ”DmÔb|Cÿ:ûó€€¦XÜ[îYû-Tkÿr`Ï+ ~î ³q‘û«ÚûéÏð³¿? \2U0¢ ´ýË›¬H¶ÆÏùâþôBª"÷>RS¤7ì<ª÷ÍÕ(¿²·8±Ãî…ôøú+Fñ6w 4#^ìa ).ž÷YÞÐ۸ɗΟÅÏåró„sJ{&ý*ôN–m‹:ýðØàôûåR¢€€È´ôšo ?ç}ÿ:Zì tñ êHÛݲ˜•fµüït!à.0+¼@›QÂI7kè­ÄËÿѺ¸ÅÃùà=518¿/>%Ë1ñ*ôˆÑÀ¿ÇמæäÝûRüèW„3µßhÛå1{ZºB]ßÍÖéTÊÏ&€€¨¸L%¨2’OÀ}­] %à‹×/ë,åͲ™¹ŠêÉ) 7Þ.›#%Œ7Þ²ê“Â.ËpÛSãRêµèÅ ÷2;†)- xÿ(øºáWÎ|ÎìòÞ†µ& KA>, ÜÆ&PX*]sÚbÝrøáâ×’€Â•Kéj*Î*Ô$U87huj)4Fæ¶ÙË(áA×W½CÙcHH{S.3"{=€üµÄ*³½ÈìSÕ¡×>f5ÙðjÛHÞç×ßÙÐðó= @7O ]Ñ3t·Ð£½Ñµ[Rk,ÿæÄæ3î#Î¥€€+Œæ~(U6Ô@®Hår(i9$V×ÈºŽ¿ßÃKÕêÓ|îÜ!N3TL9±ÿFêÇå®È_÷ H÷½ /3Ÿ&JµèÝ·áDéQàŒí.ûj!øÈ3ɸºë>d‹iòÚ7Ûå÷ÙÕ€€Ì¤%´6é532LXkˆNÚûÈ‘¶^ÅgÕÃØçÜ*µ2iT©C%t üíð9×`º¼¾Sè®,™à!Ã)7$MOò8äÖÙ¬àåËõ ú\¶‘79%ÅøÁòàa,X¬ ´Í~ìŒЀ€ È#<>+ÿN-gñ;n ¼mÞ2â5Û£ãm“FÈQE.µ `ÿGùê¥ÌÒ¹uÒÿ”ÇRì"ëæQÛÏÜ“çóNèqÿƒÿoBVÓ\Ȳ*elŠOîôªç×öÉŽ÷à?0º=Ä#©'½K˜ZÀŒÐ½°çÏëíÙß“Ù6ÿâ2ïI?Ù‚úûÌùPϽÐÕ¥óE ž!È&1‡ ÷tèçØ™ØÝ¥èë² “u Bö.ÙÖ¼»] êftR´þ„ÄÚ3ùÖa„Û‚Ú×?&U6@ã%ºX÷bPÛÏÍ{ÛÀà]ÌhÍOöñ)î@4Ž$ÃÏÕ¡Ù¾NÆ´ä¥ý…ï €¨2c1 ˜ú³îsí¤Õ×÷Ø\ÿn"z4º/ÞéMÕº4“uwRš”ÁvÖyê~¶€e‡4Ô4 9x$·4Ëj4dU là!ͦÙ;ÕqÄhÀòd0;F»0MÕ()%D ÷Ð们φâêç´ï0 ¬)$3,& €ôrîÌãØ,Õeû`æò+n3þì=ÛÃ6r±GmÖݺévÀ€ˆ„…ß©=!•Ã5HgÞ`ð!ßXØ êÛb¹‘À ÷ÿ'²2d!U$y5g+½þÝgÌ!ÕÁéÓå©Üü¢-#3hùÒQõRÕxÐÚæ ö<øË÷íÓ9˜.‰ãyÕR4”s±7‘ñråôøºìF­‘†O °ç %½F3i$E7õÒøŠïͺÒEÏvM1,«5Æ?ú¡ç èÝ­Úuã‚ð}½Ø!4‚úõ;ñnäŒáéÀMø«"Ó&•ãZÚ8=„lÑ#0ì^þGÐéä 4C¼ëPóIò_4GÑZ’8? p‰ï¥Êׯãéx _N,‹,o ú‡ô5ð©èEßžàôóF‡- È\ý¼ï¿ôðù¨ï*ï³÷& £ K†ÅeöÙï`!úµë Æ÷„ß¾Þãíòø½ñ>ó†°«c œÁ$ôfìÅõü~úÈû » âüÞ¨¼÷ˆôØù²ûùû–üT| qÚÿóþ]ÿ7Íÿüü;¶`þûë$t2ý†’þ¶ýHXÿóýþ€üýÖýªþVRÿÝ’ŸýòûsG`ö&1qÿ‡æ!¬ÿÛüòýšÿÇ-Éþ ýµþYÿMüeÿúrøýŠý¸ZÚKÿ̤õåêAýõý 5ý×üÂ5Õþþá*µÿ“þKs ÛÿË„‘ ýÍú–þáaÜÈe>ÿËü£þø„¢ÿdþÍðiý úf4ýîý‘ýý¾þ«ÿFþ¢þ>îþóŸÑÆþFm‘fxÿRKØüìüDÿ°—¯ÿëþ[¤óüYüËÿÍÌþýRKz³ýrÿ#zÿ½üCÿ úÿ9ûÿäÿ?ÿÿ,=6ÿfÿÐ[‚þ¢üêþ®¾ÿÑ|Ôÿ",ÿÏýºÿÖ’ÿ©ÿt—þÿxNþ»þèDPÿR”’ÿ4;{c"7®ÿÈÿ87µÀÿÿßÿ‡ÿPÿ%øÿ”žúÿÆÿfÿYÿ {ËÿÍÿ›#-ÿµÿ&cE+ÓÿÍÿ@éÿ÷ÿåÿ·ÿùÿóÿãÿíÿñÿ NæÿóÿAçÿ»ÿíÿ éÿãÿõÿïÿl/íÿÕÿáÿïÿûÿ ôÿ÷ÿ øÿðÿøÿúÿüÿóÿ÷ÿ þÿïÿüÿûÿþÿþÿ öÿñÿÿÿ ðÿùÿöÿíÿüÿþÿ ûÿûÿýÿ ôÿúÿ úÿþÿúÿùÿ ùÿÿÿùÿúÿýÿþÿ ûÿúÿûÿÿÿøÿþÿüÿ üÿþÿðÿþÿüÿêÿïÿðÿôÿ ýÿ õÿñÿ óÿýÿ õÿïÿûÿüÿþÿøÿïÿóÿúÿòÿüÿóÿñÿõÿðÿïÿ öÿþÿæÿêÿíÿùÿîÿñÿùÿ øÿóÿ ÿÿéÿåÿêÿéÿíÿ7!ìÿØÿëÿæÿñÿóÿÿÿ÷ÿêÿñÿ+ ùÿ#"ýÿÁÿïÿùÿ" öÿôÿíÿÜÿ +ØÿÑÿåÿ#ùÿüÿÇÿ£ÿ·ÿêÿ P  òÿÕÿàÿ/÷ÿïÿüÿ  Ðÿ´ÿ¿ÿíÿ, ïÿÑÿÑÿñÿçÿäÿðÿõÿ(L4ìÿíÿÔÿ ìÿÜÿïÿ!$éÿàÿïÿûÿ70ëÿõÿñÿöÿÚÿÑÿÞÿðÿ /F,Õÿìÿûÿ! úÿÓÿæÿÖÿÛÿ÷ÿ"-2ùÿèÿúÿèÿâÿÜÿÿÿÖÿÚÿ áÿúÿÚÿìÿÌÿþÿÝÿ6!ôÿïÿ ÕÿëÿÚÿ"ÛÿÎÿÑÿÿÿóÿúÿÖÿãÿ*?h ôÿÞÿÿÿÓÿÿÿâÿ! ÚÿÄÿÎÿÒÿN'1ãÿäÿÙÿ4&$ñÿÊÿÿÄÿåÿ5+ ôÿ ÈÿüÿÈÿåÿkD;áÿÆÿþÿPÿÿ.ŸÿÑÿÎÿ^ÿÿ©ÿ•ÿ­ÿ"âÿêÿØÿËÿëÿD©4¹ÿÆÿ÷ÿ%=öÿ91þÿsÿ×ÿ„ÿT!·ÿUÿtÿ”ÿðÿÿÿ´Ïƒ3[ÿ×ÿ(¬ÿnÿAçÿ¤ÿQLùÿëÿÍÿÿ"G-~ÿ}ÿÈÿm$<§ÿ üÿ7ºÿWÝÿ`kûÿDÿ·ÿ¯ÿÿþÿ¤¹îËÿ›þäÿ›ÿxÿéÿµÅáÿ¸ÿõþ’þvÿ®ÿºvø–ÿñþÿº¬ ¸ÿ_He&FrzÆþàÿ7ÿ³þáÿY r‘ÿF™IÿÈÿ‘ÿòþùÿ{ûß&iÿQþÿ‚ÿ¢ÿ¥ÿÏÿ6‘ÿÇÿ£þÿ“ù8à,À#ÿùÿ„ÿöþ­ÿ4k¯«ÿPa€6ÿÐþÿ'ÿ`½ÿ/¬ÿµÿcçùÿ]ÿgÿ?ÿ_ Ž ªÿQÿ”ÿïÿëÿ¶ÿæÿŽÿ˜ÿ¡þ2ïSNIpK†ˆ~ÿÿ·þÿ–ÿ¨ÿÈÿŒÿÌÿ„ÿÿ|ÿEÿ‰ÿNX²V&àŒéÿòÿ åÿ ôÿýÿäÿåÿ®ÿšÿ ÿeÿ“ÿ<]äZÿÿ@ÿ\ÿ¾êå@1½ÿÔÿ’; £ÇÿÁÿ|ÿSÿ¤ÿâÿºÿTssÎkÒÿæÿœÿÿÿÁÿôÿ‹GHSÒÿ¶ÿeÿÓþ‚ÿ²ÿ”ÿêÿE}€6Öÿáÿšÿåÿ‚uí„uW.GúÿŒÿ¹ÿŠÿtÿ×ÿÞÿ•ÿ ¨ÿq@šÿÅj„þYÿ2¤0›b²UÔþ¢ý4ýüü–ü†üýpþÿüÿ8‰“Gíq§.^spÿÿ¥ÿmÿ¾ÿÆÿ>6Y# Þÿñÿ!ßÿÂÿäÿ¦ÿ‹ÿãÿLúÿîÿ HÏÿ]þ2¡Múòû4÷ / Ú"úìôxô±ð,ïÛòûô¡öý.ÌbóXfweåÿ£þ)ÿAþ¾ýAÿ‡ÿßÿ¡ZÇ…ß·Ž[|ÿÿPÿçþÔÿÏÿ3ÿ¸§ÿlÿ ÿ‡n¿ÿÅ#ÿäÿ|ìýÄ`ˆ÷öü§ –[;øþÓöÅîZëßè éóïz÷Þûr¡“ ê * § “~dþüªýþáý¸ÿ¬Ên`Ì+àx½|ÿ%þ³ÿtÿÄý]ÿqþˆÿBh¯æ‘ÿìþòÿ#¹ÿ5ÿ Éÿ¨Èþª£íü;S£ôØò;ih"-"Q0ø¨ñ—é?â`ÝNácïæüÒ( c” ¤X ëüwûáúÏü»ýýÖÿ½œyúìÿcþ>ý¤ûöüÌÜW¢ÿ²œÿWþÿEÿ­ÿˆ„þìÿ1$Ç^ÿÉþ±vÿ²2ÿùûÏ“öªð¸ü7õ584]hø‹ä³ßÖàÕÜjÔ¡Ø\鎱 BÞ Û]þOò@íÍð?ü´9 “ ø@[–üuöi÷ûŠþ ][”œé´üü‡üÿ»Ýÿ£ýsÿt˜"5VÒþpþýýd,Èü¯jó¬íDý«„?‡:ØSíÖsÓ³ÚsØØÓ!ßx÷Õ)1)žb ½ÿ¤ùßïËèEìh÷Ö±Ü æ ø } Žÿ÷QñLó¯ûþ‰ÿ¤øA#Í aþaûƒù3üSý¨û„þ‘ Pâ« %ïý'ýÃû™ú þ¤üüíƒþç[ñ–êýûô$ýI™< ¬á2ÈùÉ¡ÔÒ3Öýë¤ ®*Ó4—'Üõ ,þsòëäFÞ”é^øã^ÚG—c Õÿ¶õ\ñÊíò–÷äúÓ:   -–ÿÔûbø"÷¬õ÷úé º»ü‚6ÿ³üüûcûûRÿ‡pfýýùÖ„ìãUû,"SRE\ 1؈»Ÿ¾ÍÏIÕùÞïø¹2=:ã)®½¿ïíæƒàLßîê«ýÑQe Ɇ$ÙõNîç„é€õGþùæ0!k »ñúô3ðëòšú6vÎV ÷müZùfösø)þ"ÿqpÆ[§kúéýßöñ¯ë<ê½3j[FDÛÏÌk¯¶ɹ×ðêíõ!8<=ó&R hïÑä§àzàºçèõ^ ï%q‘yÿsó ïÊìií*ïGúÍ'‚N ýŒöùó¢õô+ùÄÿÙŸ ð £?ê*ûÙùuø™ùíüFo î¹åþ¼ýõ“ù2õ¾ ·ƒñbé6ýÊ1”]øI# iÉ–¤Ž­]ͨàðÈðy:¡A<.Ï ”çØvÙ¬ãÿóÀÿ(&#²½üüî çÍçPïyúÌ\ ‚çäzù´ïïyôµù|&³ • ×¥ÿ©ù÷Oùý©ûL]Aƒz—üFüü=ûúÿüíúÞ Ò 3ô…è3ù),HYOtÎÄ©Â­ÚÆ@ÜÔè•ùÔ¥8ñEþ2 ßîÞXßÁã é¯ò€Df)K&Ó{œñ—êùìÝë ð¾û¸FSùåÑú(ñ9órõšô}ùþŒ“– v°úùvú…úóùáúÄÿ0ùˆJÿéý»üRøþhúù, ÕöÓéãö/-.^MË/Ð?©×²yÉüÕ\á3ô€S:ZGt4äçñŸã|ãâ™ädïŠ?J%y"ˆ¿ûòÃì”çæìöùm>Ëë 'µüâöÔï÷òö™úºr –u ·fü÷'ùúú(ü{ÿ œ(’Sÿõ=ú¨þñ÷Åô `²ôÆæ.ù©0ë^ŸOÛÑs®™µ‚ÅkÐ#Üáòóe   q/ÿÌúÆø\øŒøuü¶6HÔ]eÒøºügûƒ÷Ž +Ûò¼ç-øs/˜^Nÿ\Ï$¯¯·÷Ë$ÓÌÚöñ ?¿H/® vò>éDévæŸâêç)ýCz'÷"* Þþø+ðê±è¯ðOÔ ©¢ l)þüõíò ókõ—ú<±Í ª `p³ýxúùÆøßùcüÂŽl/½¨ýñþÑû—ªýö1 ðÒåâ´:Ed{KµÈ®‹¶¥Æ†Ï=Ýýv#8@KBÔ*e÷Ìé àݵàðò4Î%}¨ƒþoõ×ë‡æØèöŤÒ[9÷6ÿZöËòœïR÷þˆ% · t…˜û ù¨úæù$ûÌÿ^Em6hsýŒý’ù51úböM ¬ÓðÊäº(<È`zAà÷÷´ìÀ™ÏèÎ/ÛÀû>)ZDÓ@‚$„ ú»îM仨ÏÝþï, [3$J Κ úôï)èdç=ìN÷9E*Q º4ø‰îªîÈô}þ•ºk « ¨y·üMù€úõù÷øŽþlggè€â#µú½©÷Øò 3zë½ä” œ;5\,:õÌ!À1Å ÊqË€Ñ ø6*+BAŠ,q µò)ßåÔ…Ûãë¶$? K˜¬ªõ‹ã£àæ¼ó¸´ š“N@ ¹Îù.îìðïíù[®~ Àl IùGöpôtùø£úàÙK ª Qeþ~÷8ü¸õ†ôÅ _ìšéåß9dSž3òõ~Ó¸ËwÇzÞÄôÐCú6*‡=8ä)èù ûÜãLÑ.Öpê X°‡Œ¨: Üùè4ßiçïËù€²[¯™?ûýGòÜírðÌó˜õÌÝ  §Ñ,SÿCýmöró`öwùòi£eï Û–@ûÜÿñöXô‰Ðü]èìqÝ5}O2ÿäôÖÉm½7¾¸ÈóŒÝ6û6~19%™’0é ÓkÒXäûôŒÇQž!ñ$Tÿžî åFä€ì_ðöŸcôø ûƒöäï¢í$ð ÷©c ð ™ ¤ K“êûwôêóÊô­÷ýv† E Û–wøùþ”÷òg/"êf콕/QCq.‘ÿ5ìÁåÖÐHÀ°À¶ÌóÉ,#¾'K/=,È~éˆÚ˜ß:æÓìù€ çŠ"Ÿt-þ¾ò/è%äVéžöøM I Hœ ËúDð}ïÚñÕõ»ûoà Q þÛþIúlø’õÞöæø:ç ¿.çþµö¿]ÿ„ê|ç z)û:ç*› núî£ØŸÂP¾<Ðrí à]#-Ì,ý¬ýõ¬èÂã»â6èõ@/uêÓ% öPîãëuì'òHúGu ¨šÊ üoÿP÷ôØô3÷øúØûŽ_ýÄ£ÿ›úÿøÑøºû[üžý$heE<þl|í;ç/ó""0%õ;2õ‘ÝÆŽÂèÓÁë&þ) i"+;+ÿÿ Vý7òäêæŠçµð¿ÿ ÖeΚ ¼ý"óð€óhóØô#údC Æ L ]–ùö&ö0ù!ûƒý¿Tâþcùýêû)ùkùûû¥äÿÂÉÄw ÖîåúÆ)ü,(£ ©÷×Üä«Ã܇ñ”ùć.Û+s_ —û_ï'á#ã!òüÿ7m kÆ SýŽö¸õzó—ïuòúÏAè C ¹ HmHúcö>ùd÷Œ÷ñû³|í@h¾ÿü'÷s÷gý·ýT‘ Íè-ççû-ê*¶S Ñj÷ÜÓ›½È€ÜjçÂò}ˆ!æ.* ¯ ÷ø«ç¾à?å*ï´ø¶ Zæqƒ SŠüºö¾í°éFñ¯úÿ5f ¾ö"µÿõûÇó=óöTüGÿ4‹H  Ly1Ôú÷\ùZûÀÓýˆú% Qî¼ì¸ä.µ)?ìï ýüÔw»…É®ßÔçlêS¤$x1(ø<pôåNÜÂè²ð1ñ¯ô ÚŸç ¿ |ë÷Óë¥ëbòCö-ôúúU ô ðeoöÂô¯÷÷õ^ùþ»ß† r µ[ ÇþøÊú½÷ñüRøA÷6C ˆé•íÓ! 5½  ·p ÷ÝËοêÎûØtÚaã£#.Ç%ã#F&•ÿ é ä.åœåÑè ò¨.ì—Ôfºøåï4ïFîsêÙî8ø½W  õ—= ãwþ øEñîò1ôøLýÇF^ Ž £ ˜uSþ8þ«õ ùIöxó. öç.îê%8×EÂ…SünÒ¡ÁcÌ×3Ñ)Ö úüu#h$+è,ö¥ #øì}èÞáLâ´çÎøŽ"Xmš-qûø ògé ëöñÏøÆÿf Vã1 [˜ßûã÷mò¼òTøß÷Óü^ˆ  L >ùþ#šþjð¨ÿYæhæÅÔ0g¶ ; æÎåÏÛ,ÙþÕžæî˜Ó{"•*Y†Bõ‰ðlïBì ä¤é1þP ) ¶ žmNàQÿúÛó÷òñ³ó7ù@ýb?¶ ¦ ƒº×û!÷×øQûYú€ûýUl¢‹&ü’ ±ñìå¾ "+û:<ïí×öÕFçàæß°âü•‹Å µâØ µû‡ô8ù úÖïê=ôý,-"= ^¹ ý¡‹ý9÷óüöBÿ”ÿ:ýzÿ™Œ ˜Î9Óû ûûÝüÜüþpüNÿ÷ÿ„˜ùõ=óV > C« FI ûöÐèÝæÎè©èxæÙæÀðGÿžP M™²† ÂDbrü_úàùMù9û¸ÿEÿlýdÐxr ¸ÿµþ÷þñý/üþS¾ÿëý÷þ°ÝQÍN5ƒÿ{þ£TyýóÜoùØùDë , *  Š Ñûrøö?ôfó;ô/õÉ÷úÊûÚýÀÿV$ ï¬El°N7éÈÛ¿UHçÿW êÿÂÿ(¾ÿ\ÿ!#…ÿ›ÿÒÿ’ÿäÿËÿÒÿCïÿI×ÿÐÿœþ$ÿ×&3 $ÄG·#ÿÇþõþ€þzþ¶þ„þ›þrþÌþÿÖþ&ÿZÿ™ÿˆÿ©ÿÛÿñÿúÿ A(^2CHj)FW"_;Híÿ0$þÿ úÿùÿ $àÿNÈÿÿÿ”úÿòþJÿ®†”R4‘Ñ­Wÿ5ÿAÿèþÏþéþÿéþöþ)ÿ-ÿ9ÿfÿ«ÿœÿŽÿÑÿÝÿâÿ 3"P/2709-G2&2&" < |ÿeÿfâÿ {8,†ÿ*=?%ÑÿZÿuÜÿøÿ+bDÝÿ¥ÿôÿDóÿÙÿåÿüÿöÿÒ1Ýÿ~ÿ’ÿ~õÿW{ÿóÿvÿóÿP çÿíÿáÿa‰¦ÿ<ƒÿìÿþÿbþÿmÿ7ÿ@ÑÿGèÿ¢ÿ5òÿ—ÿ>¤ÿûÿžüÿŒÿíÿhÜÿKE»ÿƒÿÉÿ"8zb–ÿªÿtÿìÿQP@ÿF=uÿÝÿ‚¹ÿÙÿ^ßÿ-ãÿ]ÿnïÿºÿl'¶ÿxÿÝÿn{ãÿ¨ÿÅ@åÿ‘ÿ¦ÿ»ÿ™ÒÿW˜ÿäÿàÿmAØÿïÿ•ÿ`çÿDÌÿíÿmÿIG ¡ÿLËÿ±ÿU×ÿÕÿâÿ†y­ÿŒÿ£ÿ‰ÊÿÙÿ¸‡ÿêÿƒHÿ;lAGÿ½ÿœûÿËÿ Üÿpÿ„Ûÿ®ÿKh<Óÿžÿ Dñÿöÿõÿ ÿÜÿ-eeoÿ#’ÉÿT-ÖÿÏÿµÿwÿºNÿ‘,vÿ»ÿäÿ“7ßÿÈÿ %ìÿB¹ÿÚÿ™‡ÿxpÿÆÿ‘’ÿÒÿ¥jÿK,dÿóÿúÿ¶ÿ‰Oúÿ½ÿPÿºÿñ÷ÿ[ÿ<¤&*ÿE6¾ÿ.«ÿc¹ÿ-ìÿÀÿcˆÿ}‹ÿIÿÕÿ_pæÿ¡ÿäRÿvSÿ„ÿ ÿ‘%6Uÿÿÿåÿ•Sÿqÿjšÿ•ÙÿÀÿ¥Tÿ²Øþk÷ÿáÿ[e12ÿÂÿ.ÿ¸ÿ-«¦9ÿ³ÿÓýÿùÿ ‹ÿbÿb.Ð{ÿsÿ û‰ÿ˜õþlØÿcùÈÿÿ+ÿØñÿ&ÿSb §ÿƒþÝîÿÚÿ£­þDöÿk4ÿµÿÿÅ ëÿ¾ÿécÿgRÿ›ÿ·ÿšÅÿ‚þbþ`ÿ9–ݪþ÷þ¡‰ÿ[ÿŽÿð3!™ÿÿZÃÿ‡bÿ±ÿOàþ•Þÿ ÿÁÿ¯Åÿbÿÿÿ­ÿ«@S~þ’ÿÆÿ`ÿÿAÿOñ*ÿÿ‘¾%ÿÿCôÿXLÿj@}ÿ—4–ÿ{aý0ÍÿJæÿ>þºþÇÿmP”ÿøþuÐþ <ÿ›þWÿfv ÿÊþåuÿ.¹ÿ4ÿ­þêþЬä8þŒÿ¾²þsÂþ0èÿßÿR½ Òÿ£þ:iuòÿØþI™ŠÑÿ-þäýzó„@¼þÎÿàÿ€8‘ÿ¾ÿ&þÿ=†ÿÀÿèŸ[)²þ^þêÿTlíþmÿ§þùÿ¢ãÃþ{ÿ'ߊ?þþPÿÏŸþþ‡|ÀÔÿôÿ]ÿÿuÿÌÿ-Á²ÿÿkÿþÿª®~þQoÿs¼þXÿŒ ÿÿ{ÐÿâÿÑ$@òþ…Ãþÿ¿ÿ $(ÿͪÿ!ˆþ¾ÿÞÿ×ßÊþ¡TCºþ¯ÿ­ÿ‰úÿqÿÝÿꆧþ+lÚÿ3ÿÿÿãÿ>ÿj+ÿ,ÿàÿGÿ÷þ±ÿrŽÿ5ÛþËÿ…ÿÿغÿ‡ÿ# ·ÿwÿ´ÿþÿsæÿéÿ qìÿ†ÿÿ°ÿ¿¼þ?CIÿ  ÿî&Ðþ*¨þÄÿŸÿ¹ÿæÿz™ÿúÿ3ÿ„ÿ…ÿ‡ÿåÿ‚Þáÿ6ÿŒÿ8óÿZ€±ïÿ˜ÿòþàþ`ÿ‚MôÿÛÿ»ÿÚÿ»Odÿlÿ}ÉÿªØþcÿ(ßn8#ÿÐÿ^Íÿ²Uÿoµÿ;7«ÿ«Qÿ0ÿ\cÿ&rÿ$Öÿªÿ£ÿ¦åÿ·Îþ1ÿw›ÿ*ÿa×ÿžÿ‘1ÿ„ÿQ+ÿg ÿ}"ÿŠÃÿ]ãÿîÿhYÿ¿ÿžÿòÿ2ð¤¶ÿ>8ÿiÿ“Mÿ픆ÿ¶þþ‰ÿ'Ÿÿ£À›ÿH‘ÿéÿÑ×ÿhÿJ­ÿ+ÿvr„.xÿZýþFÿ ¼ÿ»ÿòÿÀÿ"¹ÿ1Æóÿ}ÿq<¿þî–Óþâÿ^Òÿ³ÿ¼ÿÎ"tÿˆMbÿVÿP¼ÿfH•ÿWÿìÿG—ÿ&¨ÿ4ºÿøÿe`Ÿÿãÿ5*)ÿkÿ‘øÿÄÿSmÿoÿíÿÍÿ3ð :ùÿ1%9ÿ]¸ÿ¡ÿn®ÿAoÿ¸ÿ>Šÿ|SÑÿFS“ÿH§ÿòÿMzÿþÿÆÿàÿ4¯ÿ$s˜ÿíÿz‡ÿxsÿ_ÈÿµÿžÿØÿ˜xÿU˜ÿòÿc…ÿ–*ÊÿqrÿÐÿàÿBfæÿÑÿ ÷ÿ†ÿ2ÃÿVÚÿóÿÃÿ^‘ÿh¥ÿ/›ÿ£mÿ…‘ÿˆÿš§ÿÑÿÁÿ^&šÿá˜ÿ‚‚ÿC‹ÿžÿ§Ž%‹ÿb Rÿpe\ÿÉÿmâÿ×ÿäÿŽÿÿ+sÿÿ~ÿƒèÿB+‹ÿ·ŠÿnÿD¥H>Úÿ!2ÿuÿøÿêÿufÿ=ÃŽÿÿÔMÿ®ÿ‡ÿ˜“½ÿ1Ù—ÿ ÿØÿšÿÂdÿUÉyÿ¡ÿñÿ‹ÿ¨ÿù§ÿçÿÀ[ÿé ÿ&zÿ‰ÿ}¿cÿJ„ÿÛÿ)”ÿ×tÿ{§ˆÿ—ÿ¡ÿ¶ÿ9²ÿñe÷ÿyÿŠ}ÿuÿ–ÿŒ@#$xÿ‡“ÿ}Áÿ?»ÿ– þ×ÿ™9ÿ÷ÿüÿïÔÿ™ÿêÿt’ÿ’‹ùÿ¶Vÿ}ÿUmÿ´£Äÿ£eÿzÿK•ÿ[ÿCùþùÿ9FÿAã;cÿ“ÿ2ÓþF+ÿÿ¡ý¿ý£ , o Ézý´÷êó–óšöà÷>ø,ù¼ú£þO ½ g r+‡ý°üýzû+ú³ùþù ýÔí5!Q¦">ãÿ#ÿäüûŒúðúŠý.wBv[ĸ¹.ÿ7ûkúaþtú_Èþäÿ6-ýù6÷Rú-?0s:â2-±òéÖ|ÌÝÈRÑ.ÕÒÖÓÙáçJþXý4i=Q8 (0ýPûó”ìÂäÛÛúåßö‚ Õ¿ VnJ þ&þ¾öºìxåÿârêuô‹H  ²Ì b… ´üûõ¤ígí2óGórúÉ ²Ð¹œ2‘:Q/:¯ç'Ñ]Ç¢É ÎÿÎTÍ<Ó†éÍ%( @UAF5Š%¢ ü÷kç Ö=Î}Ò¨æ!ý…ɹc_âæ ³ï ãoÝákëäô ûÿÆ vÚ°ÖCùíõôßð÷óåêCññüö®î T á »4g@ú1 ¤ç4ÐXÈýÌlÏ¡ÊÊÄÅÌÕâ- /-wAžBT5Ç$æ•Éüpâ†Í’ ÍEä>ùd Ÿ>‚\%È,Ö'1Uìjãlßžä2èÞåéùð$ÿ¸ î"j¥+ JÆrýï§ç Ý ç­ìSõÃ:åýj> 0Ÿ@DÄ*®™ïá!ܬÔÌÀˆ³¹®ÆSîœH)÷--i3:@1Æ(òpÖ^ÏÙÑá× Ý ÛRã¤öID*ì4G2 'P XÔò#Û·Ï´ÍÚÛPígùp² šØ%G'Ìp ìþYóò8ëë‡âöÞeï²ôËú2[é(ö76B 2û²%î€à~ÓÉÂì¶Å´XÉ'ã–þ‘0$,ô7D=s<-”ÚüÐæCÞ‡ÖÕÌÓ'Ö0ä~óû @=%6* %t!ˆë·BòhãªÙšÚÞß´åŸî¤÷Îz×a!. €y ßÿ³øÙìƒê ã¥â¿ò›ó òóø #Û4ð=-ünÒù}ïß:Ì…ººŒÌ[çõüï ŽÒ¥-ª;É:ä-üÚÚó—êçÔÝÑÓ²ÔdàÅõ㢖> ">!G<Aö˜êéRè‘æüæ ç!òpý ÛºÝQžÓÿ­ò’ï£íeë¦ô¢ñÝêñ ¨w&'}6 Œwþìêé×±ÐÍÓÅßFîXõ€ù± Ý(P%Ë÷% /îý*ó§ç¨âŒåÎì½ö½ú7þ㎠\v4Ï ½ÑgÿYúÛôÖîÃí¤ñögüÿ2 < (nh B²ÿ8Uúßôý÷áòïÌñøý° ¼ ›a “ ¬â#÷%ëžçúè!î@ò)ôJø´ýÂû›œ¶ º ËÔ¹ý ø\õKôYöK÷‹÷qúVý ›Žk$i‹ŸsþLûSú:û‚û½ûéúßúçýì=¡Þ›¨X¤Åþ5û*ú.þ>| Ù4{@þÔúùÛù*üÛü8üöü½þÛ“†‚¿ÔuCD ãÿïþþ»ý*þ‚þ”ý>þ‹ÿ ƒ 8Èùjcÿ8‚ÿCÿZÿ/ÿ¿ÿ/ÿdÿûÿBóÿ^uóÿýÿ±þg&ÀzOnÿ‡þæüü‹üký.þzþ½þ’ÿix]q(êÑØH†Iÿÿ ÿÿÿçþÿOÿ§ÿ-kwp{¡˜¢dóÿñÿâÿÀÿ»ÿÿéÿíÿÏÿÓÿ) âÿ8U ,üÿ<!ÍÿÝÿ—ÿ¶ÿjÿzÿJÿÆÿ|ÿÄÿ¢ÿ²ÿÓÿ 22NSWK?J'7 ñÿÛÿÒÿ!âÿ4pZX‡‡–¢@ßÿªÿžÿÈÿ’ÿèÿµÿ ùÿ(ÀÿÔÿéÿïÿÆÿ Öÿªÿ¹ÿçÿñÿ7dÑÿ¶ÿƒÿ|ÿ¨ÿhÿºÿþÿéÿéÿòÿàÿÜÿÎÿ›ÿŠÿæÿ/w¯éŒ³CýÿÐÿ÷ÿþÿýÿ¶)emÉÿ§ÿÿ½ÿaÿŽÿˆÿ³ÿÜÿÍÿ„ÿÿdÿšÿ[ÿ€ÿPÿiÿsÿßÿ™ÿwÿ»ÿÑÿõÿ7<TÐß þ‰ÿ¶þ­þÊþÅÿxÿªÿÿ°ÿ{ÿ`ÿ}ÿѼ^ CÇÿýÚýšþÿþ ÿœþcÿeÿåÿ—ÿzÿÕÿ¦†,ÿ¬þÔÿeÿ¹À*ÉÖýüTþ•ÿ<ÿŸÿ£ÿkgÿHÖÿãÿ/½ÿºÿȱÿîÿæûÈý ÿ‡ëìþþ?þBòÏŠØžÿåüþþ Zëûîûÿùlþ:jTÿàù^û ÿ¸²w û»ûÝü½ƒêGRüp^ÿ˜ÿžýjüÝÁÃÿü©üUÿ Çôýþ€‘äJ» ügútáeŠýbÿßvþzü4þ´õjÿ­÷Zû=1 .öú˜øVþ¶kRŽøYýÜœñ¨ú~øýí „úÿnõîÿK jùøsÿ¤¾cü#þOVþÏú¬=Ïÿ|þÈüÚ©Æý¦ý%ûPþûû"êCyøÿÙÇþµújåþzÿ,=Ã^ýT»týÛúsÿ§‡cþL±ÿ‹ü¤ü^þX@üÕûëܱûq)û3û”Áÿ6þÙV+þ•þüþû« ú3ÿáVüæýf¿ûþËëø•ÿC øg­Tü`—æüøþÅCàýJÿÚâùKôþ^ÿØøÃÇú®ç_ü(Jû5ðü¹xÎù'$ý(}ýVúNÿºßÿT'û;‹ýù?ûý¹ôüÿà©ýx·ÐüÍ@ü­âûúýÇü4ùâ=üÓü½ý` ùÙküÕü~ýYý¤ÿ(-ý†sQþ@ýFÿ†ÿ´¿ø¤ÿÁ&ù‡û ÷Ë¿ùÌú¦fý#–úP )üïÆýÔüc«­ÿïü­;ýýäþ@ÿMþFCßý£&þpÿ‡€ýENý»þZ4ûJ!úu¢þÑýW™ýã•ÿî5ûDõø/°ùwËûïwùqø_YûOôøAFú=øµö?GýeÜû"Tûÿ>ûë¯ïøòøßÿü KþO.úÍ[ù—)ýEyƒû#ºùÅkû›Ÿ÷ð„÷8üh×þ¸û³Vý$a÷/ãsõÿ ùËXÿ“ÔûË/ùù)û¯Žþ‰Ùôö CùÊAMÿ³þ^ûi oõãˆø¥E·ýü@ÿÉø³˜ö%Cü®7üõÿ°&þEþµÏû’.ú1 ö ø] óöj»ýæþ›ücâHÿ³Šú¬LüÔ,þäÿÏù-#ùØý5ýòÿEþµ”ù£&ÿ þûUú ÇùÃöú¦¦ü`þ?Zú%úÎûå PõE vû¦äý¨üB¾úåqþ¢üÊÿ ÿ€ýJ”èýx÷½€øzîûb¨ô)Áîû4püJ %û[ú“ ¿ýÿtú*œýþ_ÿ}û2qû„ ÌýÿΨÀÙô4Ýöà[5Kù+ëÿ-’ ù»÷Lëú˜)‰þðêý¿ü»|þü’øÎ#ù&uÿcþ’8øÏþ÷@‘ü BùW@ø\[þÊQ÷Û4÷!ÿ®éIþ0ÿ™ø;ý#sÿû#ÿ-üî&ðú‘ü»7ôÌúø\ ]ûîÿ°‡óÿhùFÅüÜþ&Žÿs"úÃÿ×ù²;û Ù÷Ñ*ýhòú…–úcpJ ;hû)üÖýqàûX«ýªËÿ˜ëküõÿ úc‹úWóúŒ™ú÷ýúAýl %ø-‹þ×yýýaËþþý!¨þ ÿ›÷¢ Âõ¦ý!ÿlýþ#Îÿ±>þÞçüQþhfüMù £üÕˆ¹‚ýV‰qþˆüëŠý¾ÿøÂúv #÷¹ö†+þœ"üb“úþû+ÿþGUú³ÊLþ¯ÿâåü>KüëÎüS®ù³¯ûúËþJüþ ùÙû†ý£ýêüÝÙú~UûÓ™÷¨‚üå{q'ýXXù/á-ýÝxübÃùžþÿ¤üÒú9‚ÙŠüØ¡jýù¯ úeßÿB•þÈý„Mûý :þ)¼ÿÿ~ùú†ø©šý}žø8Kõ•û—Ñú\–ü#þ«þû÷ÿ›žýY¸KpüñólæüÃÿÒýzüÃñûnú¿ÚøÞ¸ü Ûûóú• þúþ5ÿ‹¯þN`ý_$›ýé ÿñÿjüUÿ¾ÿôëýT™ýùüíÿ£Âýçcú¹uüBúƒDüs"ûÉüÉóÿ×þRàÜúFßúŸœ÷ìüðþÜûöþJáüUOm$ýŠúýRgNÿz‹ûÿãžþ#uøØÿÿï|”ûiûÙ¢ý0lN þÕüÇÿãý û# û¯ü}ü=dýÂyÿô¦ÿ…–þ.ÿLõþZ“ÿ+÷ýÌÛþð ýÅþQõþaÿsÿŸ ÿ¤äþ‹ßýúyÿd?ýa^ÿÌ þ.þfÊþÜ%ÚÙý4wÿ”»ýÚ&ý¢…ÿ°þ2ÿŸþFÿíûÿ¥H}ÿENè9þÿ°ÿÎþE¢ý,¯ýƒÂ þ®ÿ­ÿ6 ¯ÿRÉÿs»ÿÁÿ¤þ9•þ´ÿÿgþìÿ ÿuäÿ¶9ÿÞÿ¸¸þdÿÿÄêÿ3‘_nÿ•ÿ+þº'ÿ÷þøáþjþÅÿGÿ}¼ÿ!ÿL©4¹B[ÛNÿ_ÿÿÿÉÿÆý¿¡ÿ“”ÿ–åÿ“Kÿ–4ÿöVÿ¸œÿ"Ýþµÿÿ|M”ÿÖŽþ'Óÿ ‹Lþ¤þYü¨û[ÿÓ]&[ýÑþHùŸÏþ݈àï ‚Ñøiñ}ñ„óäñëð—ðãóðûx‰êú¯ Wm€Y3û¼ô,òò#ù€þIO£ùÉÄrPðú|÷ã÷Kú•ühýþaþNEî_0¿ ûRý’üdø€òÈîù= ¥ýÉï ðóž R~a*3z ð×å¿‘¾ÞËÒÆ­b´Y¸8è$(wLCXõMw2I"YJ éÒþ²•¿¸Û+õº’ 8‰,(O+Ž  áÜâÖèä€ò`õ«ó¿ó«ý¥ç*<œ œýóŒò¯û—ò ÷Òåö:çaù† »qü.þ#yS“g<ÆÜÔw­Q´šºg¿ˆ·q±—»ÊÛ„bKáaª`±Aï"#Îc rñ ×&¹‘µÃÌ_æK ƒ;!±¾Ž%å(i#ø ô/ÚÑÕÓoã›ìw÷ öÙÿ ¸W&Å# 1 ­ÿŽòáëíèñÑã¯øBå‘öŽ TæÑ +.ãWüomF‘¡â"®|ª[ª&§³¨C¢À´ÔÉiEOflÛV˜@ÿ&öõ 4öÕ Ás­x´ÙÔüïgž‘&ö*¼*Ê2e+qk }è×iÐ=шÛkí<îûöÎÇç†&Œ$Mù ·lô±ô·é¬ó²áSêÒü)ò+ò`ùu²2Ù]ÇwgV¤(?ñfÀL°ª.¤–N¨óÆÐþ\:/[jµ]¢N9ø.·¾þ0ÝdºË¬Õ«Ȥá5üÙé&L2[<.?1ßøóß ÒuÑñØHÖñßué"ô¨T'-%Ÿ‰ èÿåþ>í®ï¢ß0Üeð‰ïì1öš 2ºW`n¤Z¹#ßó<Íδú²x­æ¢[ž£«êÎú85š\J_X$Ea3y%û<Ú0ºÙ­³Íí¤0$L2P:0;ê)¡ ÌîtÖ•ÒLÔ8Ûßß<âÐéeüv_#ì.{* áUUþµùwîì\Ú½Ü8ë ÷Žô¸ücf/P d±VÕ&öhÍÇ´±°6°w«q« ³ÍÏ#üÑ-ªV=b![ÆD_-`§ ýEßVÄë°<±AÇq剥5$Å+)-o4‘4(\öãÛšÌúÈÐÒÞÞMêØò3þÑ s3(ë+•(uªxúÀñ‘èÌìøåyã6ëpñ%ïÇ÷î .(G.Y|N*½ûñغÀQºA¹óº¸¨»ÁÎ×îê?>,TCUD.I gððdÝAÈH½-À'Õ]óÁõ"›)‚&i$v!¸!a†øáuÒòÍ„×ÆåXõ)ÿ¦³ e&í!× ¡ Zø`ðåèÑéòUóé"æaòOG4hNžL‚12Çä÷л̈ϤÑçÊÅ%É2à§)Þ@õE¹6}#·  ³ñÉÝOÎį̂Øôðï ä¶fgN2 ílÞóÛéã›ðCûX oÿ5¦Wi.þùëóñøò®ú‡üðÙè°ñ# µ(:BèB­)tGæ Ô”ÒÐØsÛçÕ9ÏVÒìãjF"d6Z8B+û ‡¤gù"è+Úì×ÓãA÷( ÙxH / >ì,RŸòÐçæfî_ø½ÿ¸nzÿ:‹»ŠÛ Lü†ó×òUûÿaösï™ób8-=7)Ñœë®ØxÔÐØØÜ·ÙMÕ×å¹ýü,ø0“' õ 5"4ü%ï¬ã=àYè øÂV#J “ÖÄ -ø ,Ù÷sîìšñÁùˆ”½Cýåþ£ !* qúlõ„û—þÆ÷?ò)ö;WM2Ñ8Ž(J èð’ÜäÔ˜ÖÃÙ ×xÓtÕfãú˜¯)Ó/«'ò_J × ÿ«ýï`ä7áè0õò· "  zÖ l ›.÷@ðÝïqósøÅü€ýõûdý0¢b à -cÇý)úõþêÿiøNðmóÏ0s/Æ4°$Ç ñÎâšÝ'ßßÅØoÒÿÓiá ùW$(í “B´ Ïsñûä_á±é÷ÿ{¢¨Éê  ½ 'bùò§òç÷¯úÏúúÝø¼øßÿõÐ Äü7Gü¢ðHó0“)œ/ÆÞÖñÔèå‡äJáœØ.ÐÔ°åŠüŽçßÞK2$—Šñéëhó›ù°ûCüäúÖüíä¿XOûqü*ÿJÿ´ú¸ô•óÊõüº§«°ÿó¢‚Ä ¼õÿíWøž é­(µ"óJýrö=õ™ðMèóÝ|ÑÿÏ"ÝVï»ÿE, 3 ÇÇþ 4 ® Óýá÷_ødúÆ÷èó®ðÃñ²÷– J 0tƒÁù€üù»ö%ùàûÀû2úú’ú!ëy D£NÄýDúÀ Nðt© £ý^û)óÙèà‰ÙÁÙ˜ãåîìôàø0ÿG¬ .êÅAo È íLÆû¼öÔôÿõbøSøÖúÈú ýÈÿðUy‘ìöœö˜ÿ…üöü­þƒýþ8ü™ÿý›þ²yµúÝ÷j%<» V ÜD÷fìˆæ·å¼èæínñãð-ô´û½ø  Ç 7 ^  D  (ìÿðþÇý„üYû\ú ü’ý±þ?ÿ»ÿ³ÿgñk* ?f³.^ÿDþ@ÿ6ÿÂþ¶ý|þ.ýè*Œú¯øOd ï ò = Æp#i%÷¸ðGðjñ¥ð ð¹ðSó¬ø þnråt t Õ˵óß!,þþÃÿÂÿ»þpÿ€þ{þœÿÆÎÿÜÿ«¥kTÿÏÿ䜓ÿÈÿeÊþ™äþÜþq¤´ùœø,Ð k þß & •OÿUø'õÆõÿòÃïKðJôöaø&û4ý‡þ![aeÊM B³?¤Ä2/™øÿ–ÿ])ýþ LÓÿöÿÿòÿ}ÿý]þã\ýý@þÜRÚó¬ô´°'Z—_šþÛïTë?ígé6â‡àè{îóvö×ùñþVv” Ò  ÀháNƒÒ5jïê%ÿ„ÿa_aÿÉþ1ÿq<*úlùÈÿ ëòÇ ?K ÒÞZ™øäù| ýn ýþCdüéøíîhö\ò°›ñ7õ è:þ.ówÿö 'Mû{-Šì«ÿP(ý‚êœÔKþ:óíùäÿm ÚúDðÊÿv ppñ} @ ýüöÝþ+ÿöðœ#åìéûoýù$] øÛþ) Kóã)ü‡äúÿóD8 [íOö–Ùâý3ö‹þbçû ûËÿ±ûZ~ùv÷Ú •õšþÆûTJïðVýüþ¥øù.Ó ùï­þ±ûwî¡gèÈø° =ÿ? òøô eúOÿÒPùl󛢸’Bûïà ø‹ô÷„ *ò÷ þO.ú€øÌ Ñòå Üø,×òJ @ùÒó¸ÙùB¾û’ö›$ëóqólÊûŸöÛæ‰N÷´uÏî‡çñ\4îþ®øâù;8åýO#§ë øµÏQþUö.…ïÿ÷†Û] Cê¸ øÝð8‰ë¦ ïŒ{Òêt?Åö6 $÷wýR BEõÎÕAëCô+ø¡ö3òœ !ñ’‚ùéeïüß ÿñ –ÝS¹þ$çø$ùï0óöÜÁêÐØMÖx.RéþÙ l÷È& ó„Hòy EQñ“óc $ïs®€áF&ŠÔe :¹íÌ燮 ¤÷œý/ï˜_ÿpøŽ¿ç‰õ¯þ£<ê³lì˜ôÈ#8Üo – ÿ±Ùó c÷ôÿô ‘èþïvþ¾×Ê'ÈÖ^"–ù$óE‚ý ãÄ 'áø– ó¢ ™æ&€þÎïýã›^æ™ Æü'P æíš(Mº÷¿ l}î(˜ó׷ú­ý… øÿî7‡ˆó²úg·ø*ê>ï×ó…$™×Éù¼â¤‚ÿìz÷ã2Íñ.ð!ôúÒöôÏðèúïÕü¿Óç‰ôçíO'Ðè~ýèíêÌ)(å{øt°ô‚žõ€ çWÛãdþæºqóloõIØøûõýìçÿ%`óñ˜Ìí|ûxã qú7é DÚÎ Ã…ã&½é{Eôó'²îtý¼ Šê›¨ùá÷J’ëâíûôfü” £â;üøÖªÞ²]pÛ AÿÄåob Òú6æ( r ëãnËiî0×!Xðïî~¤æÈ ¤ Qí[ÜõKëYáùúM'‘Õ% _Ñûªø5ÿâ þô=ý¼å5oÄè¨jî¤QçZhó·ö7Uè¢û=LôŸNïþìKá*RëÕâ»4ÈùÈïôÿ–þ¾ §ø—þLÐô=û´|tåTñ ¢ôðuì« ÷›ñ‹ñò å&¬ï™ò…ðGCáÞ„ìÉîÅ÷‚öQýåîÍôPW ¾ãž -¿Ôývßø{Í™ìtã;抽ëmåZ'0úÌØÃúbáø õÁIõ×õ†!=ÜÞrö,õ>©ø ü½ú>þäÊï‚ö8ó(ì¹"Xñ5|ýIú²"éŸú¯óÚ 5óœîíÔþy Ýôûý}ô„ è+Ûñm ¹ùØùgßìÇÛPîuñûßóìYüáß;ê )ñ±Ñö<@ùº ’ îùúÙ šø•ÛøtJþtý:üNòX ±µýèýƒüéÇû`FüÚÄýûýMõö ¥bû3äöƒ ãögõ„ „Xû¼ö&¹üùGË^öú_ çûNü2júN÷LÖåñù1ýÏ©›ÿ¡ýH÷Ó}äõ ² ¤ûHùÙÚ óh>;ƒûÿpù«MžÿžúPú%öMþ~þÝüƒþÆ"oõ¶þd8®þñúT ¢øèÑúÝþ¹ DMù=ý8ZÄþÆýÈþÞ9Ìý!„À½÷¡ûjˆþù} ñþËü‘þ‚9|þæÿhgüÌÿoçýuÿÿ¤Ðýýñû1Ò;®ûÈþ&^ýäúÿ§–ëùùÿ#Ôú,ýßC#\ý#ÿ¥ÿÔý¿ÿuÏýÄû%רÿätKþ¦ªõ¨í%Jq&r8h8ýsíÿܳÕ2Û#ê÷âýF [áú$ê Kþ“ú ò%íí©ò5ú~yF \ ' jü ±üú@ú;øšõ×óü÷ƒýàe™l¦ïfü>ý¦ù\÷ÿ¡ë¶àyi9sD6#áîý‘ÝðŘ¹sÁúÚBóþlz )´7Ó1¨ â4ÿóˆéàÞßêc÷ßÝW «Nf‰NüýLø×õ„òïÏíYñŒüçvJ Ðm Ú «­|ùÍûÛökïê59ã$ѱ‘UIhÿ8 ðþ{|ö•Ò"°á”ÝœÄüóŒ ¹ ~ 7;Q‚O\/Þ &û>ô³ïâ°ÑOÒyàÛ÷ò `Ð|H /"„‹Qø~îÞì¶è™èëê‹ðÅüÕƒä òï÷×÷;ìÒò€ö”ñ¯Å€îïÙ¦Yy'Q-õŸì»ÚñÆÀ­‡‘Q‹‡´Â÷x"¸)d-T:aKSJÖ7ÖñÖÄÍûÔÁàíà€æôŒæ'Ë/@,™1 'ÿÛñwã>ÞÀáÓçó–ÿ &¨sÙuüéóðoéÁðÇõéyxùèÂÚúÖÙ›÷^OCyz]%"¤å%À‹«¼´¤ÃÊ´‰ %¬mí;:ˆY˜Q<ª+ê /h P÷IÔ1¹ì¼•á½ 7’"l%L[&è³ÕâÛéçîó‡ù$øv# 'ØlëÿLô&îbñõóS÷ùÑ {4(ý qæÉ ï'JãyÆb¹'dè/½~¨)³ãÉ/Åó´õ¼ÝðŸ2†Z°^ÌE„IûËï)õÿõ-àÊmÌžêæQ.¨6+†ŒWfÿèïÒv×ë(r·ä 1i÷£æ#ä´ìœú³ö Æ£ ׯ¹t÷Üûôùwâ+Ïûù¸Qÿ,kG#àÞ×±üœH©”ÃrÔ-Ï ÖK"=Ïb‘Zâ3ÛLå;ÙÝÂê¸ï‘ã]ãäýÖ!³86#’UéÅà@ësøn÷ÏêÕéÄø­ 1%ŽcëÏëøTü>ùõò¦ómüÅ X0 Hüóð|ý3ˆþÿŒ¹ë¾ØúáGªx•f’!QÓ3 \’§¼Ôózö;ö· ¶13I¸C#hõöÑWÅ]Öóõ ² ŸÉ U";D tõ»á˜ÛšåÂû •Ë$Ї ý‰÷ ì/ë±ñ¬1 è ´ÜÿWQ -÷ÿ­÷­ó×ôDŒ Ñ  ÂòÛ î\-­`!^f,Œéœ³±œç«ÔWöÿÆüŸ‘ 1%6 "´ýÿÜÈÌß×÷5CÔO NÓ] Ñþ¡ë ߥåOû-Ê¢/ÿ›þPÿøÔÿHûõ‰óóúl¢ … ø Àüûûœühÿçþÿ4þB5p›Û¢öRßAêpO¡X+5ûÈ®«ó®^ÌàíFþFÿ3¼Ü&—+Øj;æ"Õ£Ùöñ 1¶ Ñ  ¹ €KýÒñßêAîú»ïC|Øþæý¿üuüWùõö‹ú14!  (Ûü%û<ý8ÿ¾ÿáü8ûåûF© ²ûþÒøAçYï HS!4¹#Ъ³¬³¾ËËè&øñüy;Ð'(çXþæLØOÝô“ ¿ïW P ª ï 4únïuéôîßþ\– ÖÏþýû¯ü3ÿÿ´ù‡ôüöO“ á ÉŽûlùû™þXRÿ`û±üjZ«8"ÿ1÷%þc¬û”æHëÕ0O–Yq2€ù²Ë¡°²õÌvîýyùxýVé,„.É¢û®äVÙ0Ýfô×ÓØ}Q Ä¢MúèîùçûíMþ\ òÓvþÞý½ÿÿyùìóö̦ ‹ à0ý(û‰üÿ¨ÿXþküKý %LÌëû¨ûØûIù 0 ÌþáâxèÀ ¥WZ&'KíœÈ#¶]·ÐñJýÎòJôV7ü8 n÷6åöÝüáßò× ¹ ’` ¸_…ó‚ëZìzðûô­ 3ÿºÿІ ÿþõ¸ô@ùtü­þ1³ /Ýý?ûÎ\k*ú‰øýhЧ¼NûúÓÿ?ÑùyúŸáì¿& ZÙUû çɽ¼¾ÐÛè~ô'ñyù§Ù>Eý€úsúQúzù]ùUüä#žÕ´¨ÿ4ÿÓÿþÄûWû²ý>è|rh<ýÿ³ýžþ;IýÿOÆý¨ó\÷E°*¾)/nðgãAäè¡éNí^ôéú¿:Ëô Üû­óÖõ÷ø4÷ö=ú5Ôù F Ù .ñþ¹÷v÷&úÚûšû!ü)oQÏ_MX/üYú.üþkýÈýUL¬–uþÿßÿNÿþ¾ü ýôÿÍJ4þ½øúý?ßÏìÿsþ¡W‡õù‹÷ýf‹ÿYKµ"þ;÷ÑöÔý”{ü‚÷ úÚ {>ú€÷´ü¿ ~0rüw¦¶ë5ÿÏþŒÏþÞüeûÅúôú:ú÷úÿÿuY Þïþ½ù.ù¤ûÙþÆmµ þ×þ_ Fü£ùeûÞÿü‚þ½ú‹þ‚œ d »!ùÂøÙýļñýûEû€ÿúv z poÿöJòô÷ß¿<ÿ@üúøø—øÒùiûŸûâÿ² U .÷ÿšR hûçþ—} Í„ú©ó÷wû?úïø üôŽfÿ»ú“úœÿÁ.%š¦  AŸþ\º¨FÊH™óîíöÚ\R'Ïþ­ù‹ôaõÕùãüaÀ¼òÛ ½ LéÙ‹ýùÚöŽø’ùÜûÌïú>ÿ|üßÿ¦ÿ{üVúöiõù÷üZú`øcüIçŸÁú]ùþÓ& « ´þxzQ± iþý5úÕöôöÁþžT  úÍúä^à÷ùïØî ø&é À ?ݸ Q ®ý]÷¿ùßý£ýZü+ÿ\²W ôñêøïâý” ¿ôï?öê‚ ¡þ…þUÊR É C öË¿ÿŒxã’’úÒüeÐ*Bü6óyðÁö ÿ·ÿDú¶úŒýsþMüeö§ò«÷¥ ¹Pú¾õ\û|H¿Ú÷ ) BÜüw£Ù7Žûtüo&–›ýAúyútû5û@ûKüÂüü(úˆù}þˆé¿èlt‚ùšùŠÇ «!ýÍö½û¢QÕ{øøÚÿg |û}÷û‡÷&yÏ ë>ÿ]µýþHýÀý3þ.þÙfÝý£ý ¨ Šÿý+ú…øAüVj=ùÙ÷óü#óà ( ú¤ÿ³÷ õ^ùtÿa$Ýþ’ÿt~¥¢ûý †ÿ;üäüXßbûù÷ú`ÿ‹:]¬ÿǼo2þbþJÿ~ý´þÚ$>ëû|ù8û~ÿ©Lþãþ¡IÕCþRþáþBþåþæQtýÄû¦ýKJ>µý³þÓ·¬y/þMþ‹Oþ+ÿTÀ¦½DýúüûÆÿžÿ°þ¤› ©þCÿô% Âÿ£þÞÿ®ÿ¤þmÿØÿåÿ–Ûÿjý|ýÒÿzþzþE›ò/ÿŠþ‘ÿÛƒOÿSÚ=XœIÿ¸ÿZæþ:þ¢ýþÈÿQÐYÿžþþþÑÿ*,š¦C¨ÿŸÿ¹ÿîÿÍÿÿiÿ‚ŒÝÃÿÉÿUÕ×Cìþ7ÿêþÿ>äÿUÿ,Ïÿ^ÿ,áÿuÿuOÚÿºiáÿzÿìþˆÿ¢ÿŸÿaÁÿXÿ†ÿ$  ë2Öÿ-áÿyÿÌÿäÿ¨ÿÿòÿQ×Ýÿ%®ÿ‹ÿ÷ÿL˜wèÿØÿÛÿŒÿÎÿòÿNUfi7&¹ÿÒÿœÿqÿŒÿvÿÇÿIxZòÿåÿ")DDÑÿÃÿ­ÿIÿ”ÿýÿ\†Vöÿÿ…ÿƒÿšÿìÿk€QÔÿíÿþÿ'ûÿäÿíÿH;9õÿØÿìÿëÿUbP®ÿcÿZÿ«ÿÚÿS?yöÿíÿÈÿ¼ÿ 'Pøÿ¶ÿ«ÿÃÿþÿGL? ÏÿýÿÞÿÛÿ,>7ûÿÖÿÔÿàÿØÿ»ÿçÿ'æÿÐÿìÿÿÿñÿçÿôÿ9Cîÿ%âÿâÿ0âÿ×ÿóÿüÿ2üÿ %ÝÿÉÿóÿðÿÜÿïÿ6 $æÿÜÿ÷ÿñÿ ØÿÌÿûÿäÿîÿâÿþÿ×ÿüÿýÿñÿÓÿìÿðÿ#2ñÿèÿ âÿüÿ%%ßÿäÿìÿèÿéÿßÿïÿíÿïÿ2üÿÌÿÞÿ%üÿßÿáÿçÿ íÿ ïÿ øÿûÿ0ßÿúÿ  åÿ òÿãÿ+þÿÕÿ íÿ õÿüÿùÿÎÿþÿåÿ&"ÝÿÜÿÑÿùÿ$/þÿïÿöÿÌÿÛÿ !6 îÿáÿãÿõÿçÿûÿÿÿÓÿúÿóÿëÿÖÿòÿ÷ÿóÿ)!êÿÜÿ àÿ æÿñÿ "÷ÿâÿöÿøÿ ÷ÿÆÿÛÿîÿüÿ" ñÿØÿùÿ-ïÿóÿúÿùÿ ìÿ ÿÿìÿïÿÍÿýÿêÿ,øÿýÿûÿ ëÿùÿÝÿøÿêÿçÿ ×ÿýÿõÿ( ïÿ æÿñÿ úÿñÿ'ýÿ ìÿïÿñÿ ûÿ ýÿûÿÜÿçÿ ìÿÙÿûÿÙÿñÿ'" âÿïÿóÿ ýÿýÿ÷ÿüÿÖÿäÿ æÿþÿ,áÿÚÿ ÷ÿ% öÿáÿòÿñÿ úÿëÿ øÿõÿ ÿÿÿÿÙÿîÿøÿõÿ ýÿ íÿ Ûÿéÿðÿ èÿÝÿ ýÿ!ìÿ÷ÿëÿýÿåÿûÿýÿýÿÛÿìÿçÿ$áÿöÿéÿ ÖÿòÿíÿØÿüÿ÷ÿýÿ)áÿøÿßÿíÿôÿ÷ÿýÿûÿüÿþÿøÿ3Þÿ÷ÿåÿèÿ  ýÿðÿôÿÑÿñÿ!çÿþÿÚÿìÿýÿýÿ)þÿðÿàÿ õÿãÿñÿãÿóÿ üÿ*çÿæÿúÿáÿ øÿüÿúÿÿÿÙÿÖÿõÿ óÿêÿ&ýÿâÿâÿ- Óÿìÿ õÿ×ÿóÿøÿ!îÿóÿòÿ,öÿÜÿ÷ÿÿÿ êÿÎÿÄÿýÿ((øÿ×ÿùÿðÿB>ÿÿÑÿÇÿ,0Ýÿçÿ¿ÿëÿ ÜÿäÿÚÿôÿ3*!ÉÿÝÿ!'Øÿ(ÎÿÆÿÎÿÝÿõÿOuÙÿ³ÿ—ÿ$ØÿÁÿK'?OôÿÃÿõÿ:ÒÿôÿÑÿÍÿXÎÿøÿAÎÿ¿ÿÍÿ@gòÿðÿ—ÿ ÌÿÍÿÿÁÿ3ªNÇÿ ðÿu_YÿCÿËÿޱ™ÿ§ÿ5W8öÿ}ÿ8ÿ´ÿCÂ#´ÿÿrBrÿÿÍÿ‘Xóÿ1ÿÉÿ`ŽBÿÉÿÙÿÒÿ¯ÿˆô5Þþ|ÿ?Óÿºÿ<ÿÚþpÿÕò`„wÿèþBžìÿÅÿ>õÿ3ÿáþöÿîÿ7ÿH)U6Ó²Z­ÿdþ®ý¬ýGÿ§a‘¬Tÿ/ÿøÿ¿ÿiÿåuü îþÿd»ÿIÿÿÜÿúpþÿóþæÿ)Ó÷ÿkþHþÿa£<Lÿ3ÿŒÛëLaÌþ!þƒþòÿòF±ÿUÿÿ6¿mGÿÔþðþÕÿQ8éÿ¥ÿïÿ>ðÿOR«>ÿ¿þ»þÃ3ÿ{ÿY¸*wÿñþÿçÿ°ÿ ÿ á´†Íÿtÿƒþïý«þ"ÿ8ÿ$©aÌÿ ÿE2ªV•ºªÿñþùþsÿÕÿ3ÿÿ ÿÔÿ÷ÿéÿ½ÿlÿØÿÓ^¯c67”þ»þôþÿÿÿ(!‰ŒIÿ ÿ˜þëþcÿ¨ÿ¹ÿˆÿ·ÿ¯_Ý—Š(†ÿDÿ ÿuÿlÿvÿ4,åÿ#†9Rj`%²ÿÿÿ)ÿæÿÕ1mÚßÿhÿµÿæÿI$¹ÿºÿ{ÿ£ÿ¢ÿ}ÿ“ÿ&Šd]3/ÁÿËÿ¨ÿÂÿ¸ÿ_Rj'¼ÿèÿa˜¥mBTep`¸ÿ ÿíþÿþ“ÿ¨ÿÇÿ¸ÿÒÿøÿÍÿøÿ¯ÿúÿêÿØÿM„]öÿ×ÿÀÿ=ÌÿËÿ-2NðÿØÿ6fHþÿÁÿ³ÿÆÿýÿÈÿÖÿ¼ÿ¿ÿ¿ÿdOVYLâÿªÿêÿúÿûÿäÿ2$' ÷ÿìÿßÿÎÿ¦ÿ¶ÿÆÿòÿãÿ÷ÿìÿàÿòÿòÿ6MD Ùÿ«ÿÖÿÙÿ#îÿÓÿàÿ ÕÿãÿûÿôÿüÿØÿ¼ÿïÿóÿçÿëÿ/óÿÑÿÓÿÇÿÌÿ*ëÿÙÿøÿ Iùÿýÿ!øÿ¹ÿëÿ&þÿòÿ åÿÍÿâÿíÿ<éÿ'#Øÿ"ïÿ(ùÿÈÿòÿïÿ<;ýÿôÿöÿ"¥ÿÁÿ æÿüÿêÿöÿõÿíÿéÿôÿÚÿPåÿ°ÿXäÿÓÿU;¼ÿýÿàÿ:Øÿõÿ\½ÿ¸ÿ*çÿ!Ðÿ"Õÿ Úÿ2%øÿëÿ·ÿ'õÿMÃÿ(?ÿäÿpýÿÿ+íÿìÿùÿäÿHãÿQÄÿ÷ÿÇÿßÿ0Íÿîÿìÿ/¡ÿ61˜ÿåÿdÎÿ>ÓÿÄÿ ïÿ÷ÿ  «ÿïÿ ßÿñÿñÿ(êÿ ÷ÿúÿëÿíÿþÿ÷ÿÌÿöÿèÿÔÿÎÿóÿ'ñÿäÿ/ Õÿ  ñÿþÿöÿñÿýÿýÿúÿñÿôÿ îÿùÿîÿ!ãÿ ïÿñÿüÿñÿøÿ óÿõÿùÿ óÿ÷ÿ õÿùÿÿÿ öÿûÿýÿñÿýÿ øÿ îÿ óÿýÿøÿ ñÿ øÿûÿöÿ þÿ÷ÿÿÿüÿôÿûÿ üÿûÿ ûÿúÿüÿýÿÿÿøÿÿÿùÿúÿþÿúÿþÿùÿöÿüÿüÿ÷ÿùÿ ùÿõÿ÷ÿ úÿ÷ÿöÿúÿÿÿýÿ ûÿÿÿúÿõÿøÿúÿþÿ üÿôÿúÿüÿüÿÿÿûÿ üÿþÿôÿýÿþÿýÿ ýÿ÷ÿóÿýÿýÿúÿúÿ ùÿûÿýÿüÿÿÿøÿÿÿ÷ÿûÿ ùÿüÿÿÿ ýÿøÿüÿúÿ ÷ÿ þÿòÿþÿ ôÿûÿÿÿûÿøÿýÿüÿöÿ þÿúÿüÿÿÿ õÿúÿøÿ ûÿúÿýÿÿÿüÿúÿÿÿÿÿúÿüÿûÿ÷ÿùÿ÷ÿ üÿûÿ ûÿöÿûÿûÿýÿþÿõÿùÿ úÿ ýÿþÿÿÿðÿ÷ÿþÿ ÿÿúÿÿÿýÿüÿÿÿûÿúÿþÿÿÿ úÿóÿÿÿ þÿûÿðÿþÿûÿþÿúÿüÿöÿúÿ úÿûÿúÿñÿ üÿùÿ ÷ÿôÿûÿ ýÿûÿýÿÿÿüÿùÿýÿ÷ÿøÿ ÷ÿöÿÿÿøÿùÿýÿ ýÿÿÿ ÷ÿþÿñÿùÿúÿüÿûÿþÿñÿúÿÿÿ ÿÿüÿþÿþÿüÿÿÿöÿùÿûÿ úÿùÿõÿüÿùÿÿÿÿÿðÿ÷ÿýÿúÿþÿöÿþÿøÿôÿÿÿõÿýÿüÿ øÿùÿýÿùÿõÿüÿùÿøÿûÿûÿÿÿÿÿðÿýÿùÿúÿóÿÿÿúÿ úÿùÿüÿùÿ üÿ ùÿ õÿöÿûÿúÿ÷ÿ ÿÿõÿóÿõÿøÿÿÿþÿúÿþÿýÿøÿôÿ ùÿÿÿýÿ÷ÿýÿ þÿ ôÿýÿ öÿøÿõÿ ûÿôÿÿÿÿÿ ûÿ÷ÿýÿüÿúÿöÿþÿùÿ þÿ þÿùÿýÿúÿýÿòÿûÿûÿ  õÿ÷ÿýÿøÿ ýÿùÿóÿùÿûÿ úÿüÿûÿøÿ úÿ ôÿûÿùÿ þÿÿÿþÿüÿøÿüÿûÿôÿýÿôÿôÿöÿÿÿÿÿþÿ üÿôÿùÿþÿñÿüÿýÿ ûÿûÿýÿøÿ þÿûÿùÿýÿòÿöÿüÿþÿýÿ÷ÿöÿýÿüÿ÷ÿùÿÿÿùÿ ÿÿöÿõÿúÿþÿöÿ öÿýÿ÷ÿüÿ÷ÿýÿþÿÿÿûÿþÿþÿ òÿ÷ÿýÿ ùÿûÿÿÿ ýÿÿÿôÿùÿúÿõÿ ýÿñÿÿÿøÿûÿ öÿÿÿþÿþÿýÿüÿüÿüÿùÿöÿýÿüÿ ÿÿõÿñÿ üÿúÿ÷ÿ õÿþÿüÿúÿùÿöÿùÿøÿôÿùÿýÿ÷ÿýÿúÿ ýÿ ÷ÿþÿüÿþÿ üÿöÿôÿþÿ þÿüÿøÿ þÿýÿþÿüÿùÿýÿûÿøÿüÿþÿ ûÿøÿ÷ÿ øÿüÿúÿúÿ öÿúÿüÿþÿþÿúÿüÿõÿöÿ ûÿúÿýÿþÿÿÿýÿùÿôÿðÿùÿþÿüÿøÿ ûÿùÿ þÿøÿ öÿþÿôÿþÿ ÿÿÿÿôÿ þÿüÿÿÿýÿ þÿõÿþÿÿÿÿÿøÿýÿûÿúÿýÿþÿþÿ÷ÿÿÿøÿûÿ ýÿùÿõÿ õÿùÿýÿúÿ üÿ÷ÿ ýÿýÿùÿûÿûÿÿÿðÿ÷ÿúÿõÿûÿùÿüÿüÿúÿúÿïÿ øÿùÿûÿöÿøÿüÿþÿþÿõÿ÷ÿúÿüÿÿÿñÿûÿýÿýÿÿÿ÷ÿüÿúÿÿÿ úÿÿÿ òÿùÿÿÿüÿüÿ úÿ üÿõÿýÿùÿþÿÿÿýÿûÿöÿûÿýÿ õÿûÿ üÿÿÿøÿýÿõÿ ÿÿûÿýÿöÿÿÿüÿýÿýÿúÿöÿþÿ ýÿýÿûÿùÿúÿ ûÿ÷ÿþÿûÿöÿùÿùÿûÿûÿûÿ úÿûÿ ùÿöÿýÿüÿýÿ÷ÿþÿ úÿÿÿýÿúÿ ûÿþÿ÷ÿýÿøÿñÿ ûÿñÿÿÿúÿøÿüÿûÿýÿýÿ øÿöÿøÿúÿÿÿ ÷ÿûÿÿÿùÿþÿþÿ üÿüÿüÿùÿ ôÿóÿûÿ ÿÿüÿïÿúÿ üÿûÿòÿþÿ ýÿüÿúÿÿÿþÿöÿõÿøÿýÿûÿúÿÿÿúÿôÿþÿôÿøÿ øÿÿÿòÿóÿ øÿ÷ÿüÿöÿýÿ ùÿ øÿ õÿðÿ úÿñÿïÿøÿ üÿ ÿÿíÿåÿíÿôÿíÿêÿêÿõÿ ôÿïÿôÿúÿ ÿÿôÿñÿúÿ þÿøÿôÿñÿñÿõÿûÿ  þÿðÿãÿÞÿÞÿãÿëÿöÿ  "  øÿéÿáÿßÿäÿíÿ÷ÿ  øÿïÿéÿèÿíÿ÷ÿ "øÿëÿâÿßÿáÿèÿñÿÿÿ   öÿíÿèÿèÿîÿøÿ& ÷ÿäÿÚÿÛÿçÿùÿ þÿ÷ÿôÿõÿúÿ  úÿùÿúÿöÿôÿöÿöÿöÿùÿÿÿ øÿêÿèÿ÷ÿ øÿùÿüÿ  úÿïÿôÿúÿøÿüÿþÿøÿôÿôÿöÿ$ ýÿþÿ ûÿíÿõÿòÿöÿùÿøÿñÿìÿõÿ  öÿõÿøÿÿÿýÿþÿ ýÿúÿôÿåÿÜÿèÿóÿñÿÿÿþÿüÿ ýÿ üÿúÿÿÿûÿöÿ ûÿóÿþÿùÿóÿñÿüÿùÿùÿùÿùÿúÿ øÿøÿ   ôÿ÷ÿôÿýÿûÿûÿüÿûÿüÿÿÿ ùÿýÿüÿìÿüÿöÿìÿúÿ÷ÿòÿïÿûÿ üÿýÿüÿ ùÿóÿûÿ ýÿôÿíÿòÿ  þÿÿÿûÿûÿÿÿïÿïÿïÿôÿõÿðÿðÿñÿ  úÿÿÿýÿ÷ÿ ÷ÿýÿõÿðÿöÿëÿäÿüÿùÿþÿ  ûÿõÿñÿíÿþÿóÿÿÿ  ôÿøÿôÿþÿúÿùÿùÿöÿóÿüÿ ûÿ þÿúÿ  ùÿîÿ÷ÿ  öÿëÿãÿéÿðÿúÿøÿñÿñÿ ÿÿ ÿÿ  õÿûÿ÷ÿþÿùÿùÿóÿòÿÿÿ øÿùÿëÿïÿüÿýÿûÿüÿúÿùÿ÷ÿõÿöÿ   ÿÿýÿùÿûÿúÿ õÿéÿéÿïÿëÿïÿîÿõÿ÷ÿ ýÿ ýÿûÿ òÿóÿíÿ÷ÿöÿòÿñÿÿÿûÿ þÿóÿüÿôÿøÿ  öÿøÿùÿðÿùÿïÿäÿíÿùÿùÿÿÿûÿÿÿøÿýÿùÿ÷ÿôÿûÿûÿöÿôÿ ÿÿüÿûÿþÿ  þÿþÿÿÿöÿ ÷ÿýÿùÿíÿðÿöÿõÿ ûÿ÷ÿíÿÿÿÿÿýÿ üÿÿÿñÿøÿûÿúÿ÷ÿýÿöÿþÿ þÿóÿøÿõÿæÿíÿøÿÿÿúÿüÿûÿûÿúÿýÿ÷ÿÿÿþÿ ÿÿÿÿþÿïÿïÿéÿøÿ  ÿÿ÷ÿþÿ÷ÿðÿýÿþÿÿÿöÿûÿúÿúÿüÿ  úÿõÿ÷ÿýÿúÿûÿôÿþÿõÿõÿóÿ þÿüÿÿÿþÿõÿðÿÿÿúÿ ùÿòÿóÿòÿøÿ ýÿôÿõÿùÿéÿìÿýÿÿÿõÿìÿæÿóÿñÿñÿ  üÿîÿêÿïÿùÿôÿõÿñÿùÿöÿôÿôÿ ÿÿþÿ  ûÿæÿìÿîÿáÿéÿõÿþÿøÿÿÿùÿÿÿüÿ ýÿúÿ øÿûÿñÿëÿëÿúÿüÿþÿùÿôÿøÿõÿóÿ  ÷ÿóÿòÿòÿõÿ õÿþÿýÿ üÿòÿìÿîÿõÿòÿðÿøÿûÿüÿöÿõÿ  ûÿ÷ÿúÿñÿèÿþÿ úÿöÿñÿùÿõÿ ýÿûÿöÿÿÿýÿøÿ÷ÿöÿ÷ÿ ýÿúÿôÿÿÿóÿñÿþÿüÿÿÿòÿñÿôÿüÿúÿûÿöÿûÿýÿùÿþÿôÿýÿõÿùÿ ýÿûÿ ÷ÿöÿõÿùÿöÿöÿïÿòÿðÿòÿøÿ üÿÿÿýÿþÿÿÿþÿýÿùÿüÿ öÿúÿõÿèÿðÿÿÿ  õÿúÿíÿ÷ÿñÿ  öÿýÿþÿìÿüÿóÿöÿóÿêÿåÿ÷ÿ÷ÿÿÿ   ðÿâÿàÿåÿðÿøÿ ÿÿöÿôÿýÿõÿöÿøÿöÿ  ûÿûÿúÿüÿûÿûÿùÿ÷ÿôÿ þÿ ýÿòÿîÿüÿ úÿøÿòÿûÿíÿëÿçÿéÿîÿþÿÿÿþÿ   þÿöÿñÿìÿéÿÿÿþÿûÿ÷ÿúÿ ýÿúÿðÿòÿõÿóÿ   òÿòÿïÿóÿ÷ÿýÿýÿùÿûÿóÿôÿìÿãÿýÿ üÿ÷ÿöÿïÿïÿëÿöÿ  þÿ öÿöÿöÿûÿùÿöÿóÿòÿóÿ þÿ ùÿôÿìÿ÷ÿøÿ÷ÿûÿòÿôÿýÿöÿøÿÿÿùÿîÿéÿíÿúÿ   üÿþÿðÿùÿìÿäÿèÿûÿúÿÿÿ÷ÿôÿúÿ  ùÿ  ûÿýÿýÿñÿìÿîÿòÿñÿïÿ   ôÿìÿåÿðÿòÿôÿðÿ ÿÿóÿñÿðÿõÿõÿ ûÿ÷ÿûÿ  öÿëÿèÿëÿ÷ÿñÿúÿûÿùÿòÿðÿ÷ÿ÷ÿ úÿùÿÿÿ  øÿûÿùÿõÿòÿúÿûÿñÿòÿóÿòÿðÿöÿõÿñÿùÿùÿóÿ  úÿ÷ÿóÿýÿúÿúÿôÿòÿõÿþÿ ÷ÿîÿðÿçÿÞÿòÿ úÿÿÿùÿðÿûÿíÿçÿþÿüÿýÿ öÿøÿöÿûÿúÿùÿöÿþÿ öÿøÿøÿêÿôÿþÿõÿñÿëÿøÿúÿóÿõÿ ýÿúÿýÿýÿ  ùÿîÿ÷ÿíÿöÿÿÿùÿüÿ÷ÿïÿíÿúÿýÿ üÿðÿðÿðÿûÿóÿöÿñÿóÿñÿûÿúÿ    ýÿïÿõÿ÷ÿìÿòÿçÿûÿøÿÿÿûÿüÿëÿîÿïÿóÿ÷ÿ ýÿ   òÿöÿíÿäÿåÿëÿôÿ ÿÿúÿ  þÿôÿþÿþÿ÷ÿöÿüÿ ýÿúÿ öÿûÿúÿ÷ÿôÿþÿøÿøÿýÿ   õÿæÿåÿêÿõÿîÿðÿóÿ   ÷ÿûÿ ùÿïÿÿÿ÷ÿóÿ ûÿýÿ ûÿóÿãÿßÿêÿõÿúÿóÿøÿûÿÿÿþÿ    ÷ÿîÿêÿøÿüÿÿÿüÿûÿ ûÿëÿïÿïÿçÿçÿöÿ÷ÿ ÿÿ  úÿûÿ÷ÿÿÿ øÿùÿýÿ÷ÿéÿïÿüÿöÿýÿñÿíÿîÿùÿýÿøÿûÿùÿ   üÿ üÿúÿøÿ÷ÿõÿ õÿôÿïÿ÷ÿñÿðÿ  öÿøÿðÿþÿûÿøÿøÿ  ôÿúÿóÿçÿðÿúÿüÿúÿüÿýÿùÿøÿûÿ  ýÿùÿîÿûÿ ôÿÿÿþÿñÿïÿìÿúÿ  ÿÿóÿ÷ÿîÿþÿ ûÿ÷ÿðÿîÿöÿÿÿ ûÿúÿþÿüÿòÿíÿïÿõÿóÿôÿôÿýÿýÿñÿèÿéÿéÿîÿþÿüÿúÿÿÿþÿýÿýÿþÿûÿüÿ÷ÿøÿõÿòÿ  õÿ þÿþÿóÿúÿîÿéÿçÿýÿüÿûÿöÿøÿ üÿïÿøÿûÿýÿøÿ öÿùÿôÿöÿúÿþÿùÿ  ùÿøÿûÿ óÿôÿòÿõÿóÿ úÿûÿ  ûÿíÿëÿñÿþÿÿÿõÿþÿúÿüÿñÿüÿ ÿÿñÿýÿþÿþÿ÷ÿ÷ÿ  øÿðÿøÿîÿüÿôÿúÿôÿöÿúÿ ûÿþÿýÿÿÿûÿöÿôÿ  ÷ÿ÷ÿðÿãÿéÿüÿýÿùÿýÿþÿüÿþÿ  ùÿøÿùÿùÿöÿ÷ÿîÿöÿþÿõÿûÿ ÿÿõÿéÿäÿëÿóÿôÿïÿýÿ  úÿþÿüÿýÿþÿùÿÿÿýÿóÿüÿøÿöÿ  øÿûÿôÿýÿÿÿøÿùÿýÿ÷ÿôÿ÷ÿÿÿþÿ ðÿôÿóÿÿÿõÿôÿóÿøÿõÿôÿÿÿúÿùÿýÿÿÿþÿÿÿùÿôÿôÿûÿøÿ îÿçÿàÿñÿìÿïÿ ûÿùÿþÿøÿùÿøÿòÿ÷ÿ ýÿ÷ÿðÿ÷ÿ÷ÿ øÿïÿùÿñÿôÿøÿÿÿûÿýÿøÿýÿùÿùÿ÷ÿ   ÿÿúÿñÿýÿ÷ÿýÿ ÷ÿûÿöÿïÿøÿûÿ ÷ÿúÿöÿúÿõÿøÿêÿûÿúÿôÿñÿþÿ þÿ   ÷ÿéÿâÿèÿíÿòÿîÿîÿðÿüÿ þÿþÿ  üÿÿÿóÿùÿôÿóÿðÿøÿùÿòÿòÿýÿ  ýÿðÿíÿîÿúÿõÿôÿþÿüÿúÿüÿ õÿüÿøÿÿÿÿÿõÿïÿóÿòÿýÿúÿøÿùÿ÷ÿûÿ úÿüÿúÿ  ÷ÿüÿúÿðÿéÿÿÿûÿ ûÿöÿ ÿÿÿÿÿÿÿÿÿÿýÿüÿýÿûÿûÿøÿ÷ÿõÿóÿ   ÿÿñÿñÿîÿôÿôÿÿÿôÿúÿóÿ öÿöÿõÿ ÿÿùÿôÿóÿòÿùÿ÷ÿüÿðÿðÿõÿûÿúÿ ÿÿ øÿûÿ ñÿíÿîÿôÿ üÿúÿþÿòÿÿÿðÿñÿõÿ øÿöÿûÿ þÿôÿüÿýÿ÷ÿüÿúÿþÿ öÿýÿùÿóÿøÿ÷ÿùÿôÿúÿÿÿüÿ þÿûÿ üÿüÿ ýÿñÿøÿøÿ þÿôÿõÿýÿþÿøÿýÿýÿñÿþÿ ýÿõÿôÿûÿúÿ öÿ÷ÿõÿ üÿúÿöÿýÿôÿ÷ÿ øÿõÿüÿüÿøÿ õÿýÿóÿøÿüÿûÿýÿüÿÿÿûÿ÷ÿùÿÿÿøÿúÿóÿôÿþÿÿÿüÿ þÿöÿùÿùÿüÿ ÿÿþÿùÿ ÷ÿýÿøÿ ûÿýÿþÿ þÿøÿÿÿôÿûÿûÿ õÿüÿüÿûÿýÿýÿ ôÿøÿþÿöÿüÿöÿ ùÿöÿÿÿüÿ úÿþÿ üÿùÿ÷ÿ÷ÿøÿÿÿùÿõÿûÿûÿüÿÿÿ üÿùÿûÿÿÿùÿ úÿõÿÿÿûÿþÿ õÿ öÿùÿÿÿ øÿùÿøÿøÿùÿýÿþÿþÿ ÷ÿýÿüÿúÿüÿ ûÿ ÷ÿøÿ öÿõÿÿÿþÿ úÿ þÿøÿóÿùÿ ùÿõÿþÿûÿúÿýÿ øÿúÿùÿÿÿ÷ÿúÿ÷ÿÿÿ÷ÿøÿðÿ ùÿøÿ ÿÿúÿÿÿ ýÿùÿÿÿÿÿñÿüÿ ùÿüÿüÿõÿúÿÿÿÿÿþÿÿÿ÷ÿüÿûÿÿÿôÿþÿüÿ ôÿ øÿüÿùÿ øÿýÿüÿÿÿóÿüÿÿÿÿÿöÿÿÿöÿûÿýÿôÿ þÿýÿôÿüÿ ûÿÿÿüÿ÷ÿûÿøÿúÿýÿþÿûÿþÿóÿöÿ üÿ õÿóÿûÿþÿ þÿûÿûÿöÿüÿüÿÿÿúÿüÿ ûÿ ûÿüÿþÿöÿ õÿ ùÿ üÿþÿüÿ þÿþÿòÿüÿ ýÿýÿúÿüÿ ÷ÿÿÿùÿýÿøÿ ðÿÿÿ öÿ÷ÿøÿ óÿÿÿüÿûÿñÿòÿùÿýÿþÿðÿýÿøÿõÿúÿôÿÿÿöÿýÿôÿüÿîÿíÿ üÿêÿñÿ ðÿ ùÿ ùÿæÿòÿúÿ âÿõÿøÿ þÿøÿøÿ éÿóÿ÷ÿûÿíÿçÿãÿ ùÿëÿûÿ úÿÖÿñÿíÿñÿþÿòÿëÿ çÿíÿîÿ ïÿïÿ Úÿ ðÿèÿ#ßÿàÿ×ÿúÿïÿáÿ þÿûÿöÿñÿ ôÿòÿçÿìÿýÿ'úÿäÿúÿýÿÚÿ îÿûÿóÿ úÿöÿÜÿúÿæÿ ëÿïÿåÿ  Þÿòÿëÿæÿçÿ÷ÿìÿûÿ(õÿíÿóÿ"ÝÿôÿôÿãÿøÿîÿôÿÞÿúÿ çÿùÿ ûÿ+ íÿöÿ×ÿûÿùÿÚÿøÿýÿ óÿñÿ Ðÿ ÿÿïÿàÿûÿèÿÿÿæÿöÿïÿ %þÿãÿóÿøÿ åÿîÿÔÿãÿøÿ"ýÿ áÿìÿýÿ  çÿøÿóÿîÿñÿ  øÿîÿ÷ÿþÿØÿ!Éÿüÿ+ôÿõÿðÿóÿ4òÿáÿóÿóÿ ùÿõÿ)!ãÿöÿãÿüÿñÿëÿãÿ)ôÿèÿ Óÿìÿíÿùÿÿÿôÿÿÿçÿ çÿþÿ.øÿùÿóÿûÿîÿêÿ üÿþÿçÿéÿÿÿ êÿãÿìÿ÷ÿëÿþÿíÿ Øÿëÿ õÿóÿ2ëÿïÿëÿóÿ íÿ ùÿÜÿòÿëÿ ÷ÿçÿþÿûÿ/ìÿ÷ÿçÿõÿóÿÿÿ ïÿæÿûÿýÿØÿöÿíÿóÿ$èÿðÿòÿ*õÿîÿðÿ õÿÿÿÖÿíÿ!íÿÿÿìÿ ÿÿþÿèÿãÿýÿòÿúÿæÿðÿÞÿëÿõÿðÿèÿìÿëÿ ÷ÿÿÿàÿòÿ íÿ ÷ÿ Ùÿ÷ÿòÿ îÿóÿ÷ÿåÿ ùÿßÿêÿôÿãÿ øÿÝÿ íÿ!ïÿùÿîÿîÿýÿ ðÿ èÿÿÿíÿ ÿÿíÿîÿúÿõÿ îÿ äÿóÿûÿýÿìÿ ûÿõÿüÿ Ñÿ'Þÿ÷ÿ èÿñÿûÿÿÿéÿñÿ ÷ÿîÿ$òÿìÿ÷ÿüÿýÿÚÿþÿúÿôÿóÿ îÿïÿÿÿÿÿòÿ"àÿöÿ æÿ éÿþÿûÿ÷ÿúÿüÿ ïÿ ðÿþÿåÿüÿñÿðÿöÿûÿ÷ÿ õÿ þÿêÿþÿòÿìÿóÿõÿùÿ óÿþÿóÿøÿ ÷ÿñÿ ýÿõÿ òÿüÿþÿñÿüÿöÿïÿÿÿÿÿõÿ òÿøÿýÿöÿôÿúÿýÿþÿÿÿïÿûÿ úÿþÿúÿûÿ îÿúÿûÿùÿúÿûÿ õÿKGýcþÙqm\ýˆþ1ÿIuœþt~þ¿•àÿrüÌþ8o¢ýTÿ/bþîÿœÿW«ö´þñFžþiþ©|ÿÿ»ý;ýMOþ Ç ÿöü–ÿYÿnþy.õùø2þ¢þâ•âÿîcý†JÅ€ü½ÿÿ ŒŽþ¶SþÜýæÿCþœþcŒLþŠþñÿÙñëý°ÿ#»ÿj’üçþ.ïþ²™üLýÎùëüTþÍsa$þþý×ý×^ÙjÿšÿÊû¡ÿŠüýý&ÿÄ´Vÿ þIûUûæú„˜™ ÀÞþ§üúÅÿëþkŒá¸ŽÂ»ÉùËù“öëü!tÔþ˜ý©ý¡ûoýðÅûšþMþ×þÑ\ÿ‹ÿþJþ×ý§£¯7¹Þÿ€ýˆùVþþ12Yþ¥þVûÿ–VÀÿ±û¥ùîø!þ°ð‡©-¬ë¬þ†rüöþ¬û(¦ÿ‘èü¶ü€ù¥ÿuÁ¨ ©ptrÿ þUýÙý`þÿ"þ×ÿÿÁÿ¶Amþvû™ÿŠÎg ëÅwþTù„ð­èvåˆéhðž÷YýŸ1 2®£O b´ÿbû;ö“òåðoóøôýy$ƒ© • »áâþ’û±ùIøgöùõTøèû­§LZê!­ýÛû#û&ú—ù”ùÕûý“Ú n-2,ü;z æ˜z; Á3‚øúìÁàYÛ-Ý’ãöêòoú@­óVé¤>Œ ©üõó²í'íîuðSôÃøy¦? Ó×¾·  òý%øîôógó“ôàö9ú*ÿŠÜËð ç1ÿ;{þÿüóúdú¥ø»øùúÿûú ú„ÿ`a ˆå žšüwôGíáèççÔèì¾ñ øûÿ®^ ¦¨Šè4c ²äzþú×ö~ô)ó7ó¨ô÷ú©ý(Fùó¢ ù#ºcêþýÏú÷ùÑø…øù>úÜûsýfÿëävÿ.µX§ÿàóàG š ^lƒ?´þ³ùõ ñ-ïöíëížîðHó ÷{û¨ÿÀ Ž Ã R c 9 vÜÙÿýgû ú2ùòø ùjùÐúàû·ýöþ¿ž t†¨À’|ÿÈþhþvþrý]þýÈýÿÜþýÉý(ÿG• 8 G  ú±ãýûÛ÷põ•óÝò0òòäó‡õ®÷kúýü€ÿTJjÍÍ @ çþæÊDÃáÿÅþ»ýçü‰ü9üü[ü¥üáü˜ýFþæþ’ÿCC\Ëœ¸ÌÛ”K6©ý±ýºþ j“æû † ÏžÐ!ýéù›ö®ó òüð“ð%ñ±òšôÒöú(ýýÿ·±†9 r ú ¿   « "ÊL¨ÁÿWþöüBü&ûþúüúû–ûüóüÓýþYÿ…´‰R2:x9†SÜ7„áÿý¡ý~þÎÿSÓu  © i — ™Ñü“ùKõzò¬ðæîÇîŒïÞðFó1ö ù¡üVC% È ù  ¬ > E ß Ïë•‹šÿñý<üûKú²ùÇùØùoúûÂûîüÿý:ÿ#ÐÂêCÌ}qýv!Öýâýjþ7%½Y 1  e ×u`þyúÏö§òüïÖî\íLíïµðøò¸öJú…ý«s9à 2  ®©« G Ÿ i²yÐþËü!û‚ùµøNø$øløùúùû,üøý«þ*ƒ´H*= ÅöpÒvþrýºýçÿK æ p “ !Ÿÿ‹ú–÷€ôgð¾î›íƒìœíÇï§ñMõXù€ü‚sLº ~“K,,y ÷ Œ -²ÿóü ûù½÷“öxö|ö÷Bø3ùÖúYü9þßþ—˜£ÑûóîèÅSû:ûwø:û9QŸy5¡ íÐþú,öÄñÄî)ìMéAé+ê+íïðköïúœ­8 × äÚˆ®è¥ T ±)àýœú•÷ïõ×ô™ó[ô8õ$öÌ÷°úÙüÿÐÅ †˜þÃ!²eûý£þQýÞûéýJþÏù»öíûCö‚óÂFúßñ–ê}åñâYâ7ã;çòíõ&ýšW V=À9•!  _üýyúÉ÷OöZõYöòöiù©ûCþ;@'þBy:~m(ÿOþ|ýWüüìüéüýkþuÿÕÿÐgÀÉýiøÅúŠB?!O$éòüíeârÜîÚ{ÜØà‘èFò~ý ?ÆÏ4'— ðœœþõû6úÛøqùÆú|ý3‚åV®ÛÊÿPþ—ü¾üáü.ý<þâÿ§ð/O‚ƒKÿÝÿîþpÿdþûŠ0ý¤÷Êù«|'*ï-$ì 4ð=ÙͬÌ)Õ·âXð£üSeøã½ –#ý÷ãõ¶÷ìú˜þÏ 8$$N^þãû°ú”ûuü$þЭC*g_ßÿÿZþ<þ˜þÿ”ÿ·ÿ¨û™)›þ–°ûô÷b¶ö2/7¤&®ÄâÁÇ(¿.ÅdÖÐèÁù9áãM ýLñŸìpí±ó6û¨¢ 7 È ° …ݦüUùø˜÷$úütP Òêÿ_ÿpþÿûý:ý,ýÓüªþoB¼{‰ÿiÿUÅÿŠú2ñô&%ÅnPò;Î=Ç蟳œH¸Üü­\!†/l6™3w¯ý…ÝÔÌÏÇàÈøG+#?#ŒZT‘ðÃåká*æñLä l’9š ˆí÷1ðÐìmîOó|ýª,ã—M ñ»ûÌö®ï5ôqõÒú•–.íñd÷ÂþF‹X›<*þJ¿—ž£Ç¿«Üšò' ö0N@¿<GùçØÎÆÖ}ç~ø°€C¶(š%(/ì<ßêßÏèòö.­ Ÿ7ç ¼õ‰ë èÇîøo;J ³ ˜ œóú|õCï¹ò©õ{úÞt4âï—÷ϨO¸_`>Õù€¼A¢«æ¿=ÑAܾíŽÀ8÷M6EŠ"úíßHØ1ÜJäì,÷|C›+q-Èõ¬óûætæ-éLîôˆüKCˆ, ýÀóºðÊîÅï*õü•ã_ õT ]…ü_úšô×óüÊôô5âÛòA(aÐjE@1ùÆh¶Í»Ô»ú³)·ÌÕp @ÈTÈC®"" ÐlúƒébÔöËIÙlúb )û%Ô:߯ ù_åéÚ<Þ÷ípÁ´­ ±bùôxè9èŠóûÅýÆÿŒÉ ¡Ën ùóðÏúwÖíÕé+)8hôo”:ò—Ãh½ŠÁV»n¬¸´ÄÜçVGQÐ9…[“ òúÝÀÆ×ɘä”샆ý©"0L€íÜ×Þbê;ö3úËý$•2èùsôýò1ñÙð ôsûG ño 2 þþÖ÷Yý—þZå—ζì7nt¼kê)AäÄ ÃcÀ¯Å£‚¸Bðy-•NÐI°4õ$8€ díɾ[ÏTï½FÖ„!W/.˜Î÷àÍÝ}älë×ìñáü²#$í…ùb÷aóééèïdþ­ê D¼ € zŒïËôÞü>ãÌ?ö¿I"}bûÒîÁ”Ê=¿û ù èз=OH“>L40¤4øìÏp¾UÈåà)ô}Ri+Œ6‹0P‹{îäØÜ–×¹Þññâjv3m{6æôòæàÕæðóïýLô%ÿœz²ü¦ñcí(úúÅÙSÎZ`wÎA8ú¹ÙGÚÎF¤â”²jü -*8™5s:ŸA§3òQÏ\ÄNÒ!ÝÞãˆô:q.88å+Ï1¹úÄèOÙ–ÓGÞ`ö£ ª£M_ƒ«ñPæ5ãêÎð‚ûã|ᯇ k÷kñKèÁáŸýÍ÷å ß|"+eäd2*´ñ¯Üÿ؈¼Þ‘ ”^Öºˆ3#2l7öI D6_Û|ÃÝÍÙÛrÛ/è. Ý/~=ù-Èé ãþì}ÖæÏxÝÉõ1b¢"Y#]üÛêÓè%è ëÿécú] *M߯ £hý#ê`í¹ç¢éà.˜åNè 5zeïLuCïìFáK¬.ˆÏ¨BïÖ%i&QCfX%5ÇúÖß‘ÞÚžÕÕ„ìW.'++odWãLÒ4Üðô/÷# ï L[ pømîåææ‰ô&ý  —>Û÷¸ø@ÿ8íç·ƒþdÒ×è2ÐS Ik,T,,ê}¥È‚i§ØÔ]èú3!“QkZc9 óólÛmÈÈœßõ‹OÄ*ã4á#ƒ ÃõÁìçÑÞÚ×꘲ŸíÆP rôpæíFòSðËóµÿ i¨ ì ÊÈ $ö›çkÌRÞ‡$ÖHÌ8°$<Ò!Àÿ“ºÍ•#°MÎèÐXÝÚ :!K7@!Á1GðäÏhÐÝèLóððþ§:+È%œl XùáúßVîføúyý 5Ñn‚ÑþÈõÞêÏë)ú¦ýfþÌLüßúþ ^ 7݌؀Ï4·3Ò(¢ Š%/OÌb¥²¹Á.Æ)Ï(ò±;å2ž&\)û%7Àä¾ÝIç¨íëŽñ¿ ¬h» Mç Dôºç³îüÐô‰ë!ýY< <' É *¬ÀóQóªüXúÄô:ý}ú# iÇúÿ ð”ä‡ä¦P-¥7N1JÙ¸å×*°´“½ĩѢã 4+–,©"t&ä%Y$üîë êñ\óÛîúö ë‰ ¹ T ”÷ôÐùùÍó¶øŠÿ\ž „7øIüŠû2üXþNû»ùf ü(Žäìªêý·"i6w5ú"¦"&è²Á ¼¾ªÇ[Ë5×õs3=†è#‹OügøÕÿÊ÷;ïúöþÿ 7äÿÈ äþ5+þ#üŽÃúTô… Õý0þÿgþMtÌûDÿþ ÆûýsåÛïšíL:d/Ý0%!#–ôyØ¢ËHÄaÆûËzÏÇáùøò:¦ˆ#$]1 Œ~ûß÷ôò$óŠö–ù‹úþgÈðì †›+ÆþãýÁú"üŒüLüü·ýòüŠÿ«bËj©óB(õcðÿ€uQ'„!È 0þÃí}çÇßýÖøÔ€Õ¶ÖXà*ëÅõäÈ"Û"6 P±ÿ"÷kó&ðíIîøïœñ¢öñü£þææÓ C ä q âqäýßûõù úwø1ùÉùbø-ýsÿ1÷]÷Vy Ä{-ƒÄþþUüÇø ñˆë‚å5ß Þ*â?ç¬ìœôÎúéþÁW ل綸É>ß *-ýÓõ8ðoð÷í&ë˜înñÓð£ôEúÎüÿLÅ P Ѱ™ $z  F¢üMÿsþéé^ãq÷s ðCðrŒ×v÷)ïˆä»Û=ÚÜÛÏÞÌå:î—õ7þ¹‘F_ SÓF`® žûýT÷òºîÃíì`ìõð õQ÷ßû»Ô·ó ü ¯ € % ‡¯ÁSüöûÃùJõøãûˆõþž+ñµì® %"$§®7ªõ–俨4Ñ-Ï ÒžÔ·ÜIì¬ùî fÖ!+%Ë'P"—Ÿ ߯õvð´íéXêåíúñ½÷Èû¤Y  $d” ¬ r¢ ý¶ø˜÷a÷eö ÷¾÷·ü{ýðÿD* À‰ð¡ì§L)Ïp+&ãö ážá5Þ[Í€½‰ÅÝ ëDðûð#Ú(Ì$» •!sp6*ö¿ô-ô‹ê¤å¸îÅö­û®ÿjÜ ­  Û Ø à5þû¶ú2÷°ôÙöø÷ûùÿüë`{.-ÿ ¶âì¸åÎq'’#Óó*+"Qý{âÄÛÎÚŽÐaÂÑփìäùz£µ"X/¼*1  ¥ü¦ò±î®ê„éœîcòÄ÷wÿü.I`lQš lüAù}öÝõ ôxò&÷dÿàÕþH… n YðC;ÿzêåãÐÉ&)T*t"üÿ7âmÙ–Ô.È1ÀÇ…Øìbúó Ä&(*¤+Ä%’ ¯÷úoì³äeêòî*ïRôý$ª¼ } í ® ý¥ôìó…÷|õ[ñ;ôýl6ËÉ D {!ÁúýÿS ñ âLùÄ$2:KÛ®#ðá±Ð§Ó0ÒÁËòË|ÙZð¼lÓ%÷'’%& =·õøcð™ìféôåùéëöº ,„mF 3üöåòsñ@òØóß÷Þü;BV/ ÷ ¹sq$ý}ô`û;ðàâ¹ùË$Ã1pk¹¥#É ¦ã¥ÏØÓ„ÕÊÌ ÊÙòÔHem&9*ç(Õ!p¸Žûgó9ë‹åÐäé†ñúË ÌB)èôÿ×ù“óÃïzî0ñ‡ôdö·úJ £ ¡  ¦ ©Ï˜ý3õÓûýòê1ßîõê ˜0ø„±€"Ï KêñÕ”Ó²ÑH̺ÍiÚåê*û" rb)ü'4'¸'ÑEqü ñììŒçáûá9ê6öëÅÉï}ªÞî ¼|þ‡ó#íþëÕí·ðãòäùÌ¡¼ ë y,t 'cùâþMüéÞò˜9.ïe¡"ÃïEÕœÐKÕ|Ó¼ÏéÕæ–û/¥ê"D&'*¾* Òýÿ3õ‹îÚçžàªßµæÀóÈþÆ S×Ïz¯&Ûÿ„÷Uð»í2ìÆëFîÚôDþSK —e ,6þÈý©ùç Ü(ï .ˆ!•9Ñ7ó ØÓÍHÏ@ÐÃÎ!Ó>áÐø§ÈÁ$0+.ò*l =öë¦å«ä(äuä‘ìôùáS{®¿uÏÿ£ù,öèðBë[éZî“÷§ûZþ&_ qç ¦C¹!þÞèhݾñ\N.Õ‚# Àð£ÓïÍÆÒìÑPÏ”Ó%å™úh ~#';,`)="1R"ù ñcèÚábáiéBò¨÷&ÿ 9ƒª2¤ Ìö/ôõ®òêìïìö{þ³)Õš (. CÜb‰² ëVßcöñ·+ÈH íËèfðëÔ«ÏNר×àÐ^Ñôß°÷¢ r"Z(ð*Ã%)a 8ÿôùúó™êâ2ätíûô¹úþ‹mG ˜ h #„þ—÷¥ôÁóõð¼ï/òOù'ýÿy™ / r 1 XôÅçÖúÀæ)Ç~ Õc—éðZØxÑÍÔ’ÓuÌ7ÍzÚð{é ?).Ë(Û—ÞDúû¯ïë–ê1êøéýì¼õ>ýïXÍ G£×å ·oÆ¿ýVøbô ó)õ‚öDõg÷àÿ #hÿ` )÷Šô 6$ߤ ]ÞHÞî_æýâ¼ÚÛÓèÑ[Ô¶ÛÅèÃôuþã²!®!­w¹Þ¥ @@úßôòÒñÎïYí<ð\öÎüxþhþèè þ ¢ °š ³¹Tjþãýáúù˜÷Kø*øiýúÆøšôë÷(®^ M¹ùçìrçgâúÙ½Ö“Ù¼âøë=ò›ûRjFß`~«.é öûÕøõñÃîñ;ö÷øwüžßf,j @ ÄÃ3 ÿÿòÿ4ú”û¨øvûIø>ü+û{úœ.õ·þÔl Ø»‚üyS÷’ó‹ïæÏÞ­Þ¦áîå³í:òúχ ÙÊ.´¹~l ÜMèú¿õÏôLòaóíóÝõûøFü þzK•9ø1HÐý1ýWú’ûùÃþövýûLû“ø\û[  ó Ø¡GÂÿþù3ôžî}ê½æ|æ²ë³ì®ñ÷ÿl Ê @:ßëR  |íûaúøŒô<ö‡õ÷ìø~ùÂýüÿ}øýr¦1¤Tüèÿ¯û‚ÿpøƒüó"øÌøøýX Ñ ” Î ù©6ëùÍõò=ì1ç‰êÀë4îFó|÷ý6_î É ˜ tÄ ZÉÕüŸû÷÷õ÷Ê÷mùvù‹ýL»ÿKŽ™Ík—RP˜ÿeþ=Ô]ÿ€ûIÖúwþ¬¢¹þ¸íý¾ÿ’úHlÿBèýA‚ýKþW;ÿáþ>½üc¹üìþœðú…SüBöÿ§4û¸Fþ—ü¼ŸûŸÿcûHý_zÿÿ‘„üEÿ~=ý„þÕÀü~Wü5£ýŸÿvþS­"þ5—û¸ÿ+›ýÕ`¶þ¸êüü3>üE¼ÿöý:›ùûÍÿÊÁ1üZÖûòý­Cù??þ\ûlþþ¦ËýuúýIþÜÄþ£àü„lHý’gÝùÛÞýÀþŠþ² üÅ£ý!ú¼ûÜýqÿ— úwþ®û™­ükÅþ”úÄTúÖÿV÷Å 3üßû6/rýüŸ„ÿ¸ód‹TýDú¸– þCù㟒Ëôˆ ©÷– üðýúIcý±Èøá`‘øL~Ê—ù jø§ >ö&Ñùâÿ±åùÖ Rô: 0ø(ê©ø]#•ÿsØúk$ûºý1¸ÿßú õ¤ $ÿ€ú^ø, øøÀëµòã.¾ ÛìW ¸Iöýuþűôië˜×ø8 õÕSŒúRü¶“Íüþœýä¼õOØùpþX ñ¶ÿŒ˜×ÿ3ý¬û¦¸úXö×oý¨Íÿú ü‰ùJúxò )ö²ñEMðœ$í ¤üLý¬ú¢ ðõÍìÿ¨òË ñ„Múeÿ(ö,&ÿúÞ5þ!èDü#0úŒïíL Bÿì(°ÿ5ùø@ò#ÜìP‰ôIèõ¬ —ù®¥÷Xš„ î ÅõD+ù³ íù?µ†û‘¢÷t ²úQöÚ÷êx ÃþÜúÄõû‚ÿ2ô¬'ÿn÷I =ñµRêö’ÿ‡úÓQú÷K²ýÛü{üÈÇólÍýã’ÿ¡úò¶ú޾û‡7™úàDøà%ø›Æÿ=ýsùâ ßòöVmö:@ú_!¬òÿWþ[÷Aí àðE öÄ}ë{ óA:ùÇ{øwFñË ÓúÇ^ÿý‡¬ùèú QúÃ/øÄíÿ4þdûC ºòTàí¢õœÓ“óP.þX >öúö2pÿÚýáó úõ¤Vý-ƒ÷…™Öü–hø•þ–›öJtüV §÷èï¿ÿtüBÿøf oðX®í &øNÿ{þº ¬î± âÿ?çù½ƒÑùJÿ«ûü6û/¹ü«éý×ÿM+ßõþ Lî äï -ûÑûÎYþ TóôõR Zþ ü‡Õžô€(Ü ÷V›ö“ðûü·þ/ýØKýô›üYý‰±ûÜúðÿ[+~Žû™[qögäõ¬Þÿ÷„úÀÂû<ù«Þù©•ýþèú"öÙ ÿô| ñŒ ûùÎøþ/û³ •ø‡ûÖ¼ýü®ÿèþ`¢ëýøüÒæÿý¿½ú üÈ~ÿßýb“äû;þ]ÿ¸ÿWˆúú^¹³ üÛÿ'ýø°aõ¡^ý*›þ+º¡ÿ`e®”þyj™’þ;)ÿ¦­þ†Vÿ|ÿšˆþHÛŽþGÿº›ý!¬ƒñþ"BþW_þñdÿQÿÛŽÿË4ÿÙ^ÿŸÿ ÿ^ÿ;¦þý”ªÿ É¢þþÿÊþ'1eÿ! ¸ÿ×Fÿ„ûÿ?tµÿÿùÿJÿv?ÿâÿ`ÉDÿ•¬¾þ90}ÿÜÿžÿjÿ»ÿhÿóÿww[›[¦L…¤|äÿUèÿhÿ (ÿ@ÿGÿõþ€ÿÿÿÉÿ$H9v[yÊÿUòÿXÿfÿ/Äÿiÿüÿ±ÿôÿ\+êÿ%èÿ öÿøÿíÿØÿíÿ½ÿÌÿ7`stsЉÿÿEëÿ¬ÿÏÿðÿþÿùÿ õÿ0#"HC¸ÿÜÿÆÿÓÿ£ÿÄÿÊÿéÿÿÕÿ¶ÿôÿæÿäÿêÿÉÿâÿÌÿûÿAùÿ=rL0 =-9(Ôÿãÿªÿèÿ$&Æÿ¿ÿÔÿöÿ¢ÿüÿðÿÑÿÜÿðÿõÿëÿõÿøÿìÿJ0[!íÿ'äÿïÿúÿ2þÿ ìÿøÿãÿ Þÿ êÿøÿûÿ5ùÿùÿìÿìÿáÿçÿöÿìÿàÿóÿ#àÿÿÿãÿøÿ"Þÿ% ùÿëÿïÿýÿ#ìÿóÿþÿ÷ÿéÿ õÿìÿüÿ ãÿßÿñÿíÿ õÿïÿþÿäÿûÿæÿ öÿöÿúÿäÿóÿôÿùÿìÿêÿýÿýÿéÿÿÿüÿ$Üÿóÿéÿùÿ ñÿøÿñÿ ôÿöÿ ñÿçÿúÿ öÿêÿ Úÿàÿîÿ õÿïÿ óÿûÿ'ìÿ íÿíÿñÿëÿáÿóÿÿÿúÿýÿúÿÞÿîÿ îÿûÿ*Óÿ ßÿøÿÿÿäÿçÿ7üÿÝÿ åÿëÿöÿúÿ%ýÿøÿìÿ ñÿ öÿ ýÿ ôÿõÿÏÿèÿúÿüÿ3øÿàÿõÿëÿêÿøÿñÿ+æÿüÿàÿóÿ÷ÿùÿéÿïÿ öÿøÿÞÿæÿ  ôÿóÿþÿþÿúÿ" ûÿôÿïÿüÿêÿýÿïÿæÿïÿ óÿÿÿúÿ öÿøÿçÿìÿúÿûÿóÿ÷ÿþÿùÿìÿüÿ÷ÿûÿ çÿòÿ ûÿýÿ ìÿõÿ òÿ öÿüÿÿÿõÿýÿòÿ ýÿüÿüÿöÿòÿ üÿûÿþÿõÿûÿ üÿþÿöÿ þÿûÿñÿÿÿøÿ ùÿõÿ úÿ üÿýÿ ûÿ÷ÿ üÿñÿ ôÿøÿ÷ÿùÿ÷ÿ óÿÿÿüÿ õÿóÿ öÿôÿúÿ òÿüÿöÿõÿäÿ öÿýÿÔÿòÿ  ñÿ ÑÿÜÿþÿ-ûÿæÿþÿöÿ ôÿþÿýÿ/ïÿ"ïÿßÿ6Üÿúÿ ÙÿëÿòÿÒÿØÿ÷ÿþÿ@?˜ÿÉÿe#éÿøÿ<Ÿÿiÿßÿ;F¯ÿãÿÙÿ.õÿßÿ…>jÿÔÿÝÿæÿHGñÿ·ÿäÿ!ÑÿßÿéÿõÿgË mÿBº¥ÿ#ÿIÿ%¯ÿÿÊ·+<ÿ¤ÿŠp·lÿ>þÿ_ÿ^ØœÁÿ¢ÿz?ÿ"ÿ£ÿ7®ÿCÿëþmCÿ{ÿ3 P¸µÿTÿ¯Úÿ þJÚ]mþÌÿЯ­þþ§JX þ,ÿËŒþVÿ·BDÿŠÿ¡Ñtÿ“þhÿuôÿPþ{ÿɲÒþMÿ5!þåÿiBhÿþ²ä#ÿÊÿºïýPýªÿ–B‘þ þÝÿAOÿ{þ³†fÝ¢þáÿ~oÿÅï_þ°lÿ>ýc˜fþ›KpÿÈüîÅyþÒýŽh*þ¼üÁþûô*þüýÿô´Àüÿ殩þþ5qÿ­üóÿn²þ‹ÿ¿+þ¹S#AÿGþ—‘ÿ­ÿÙÿþ‚'Xÿ¿ýQâûhûÿL³;ý’x<,þ;ÿÉ*wýý~ÙÿXûçû[N+Ÿü¹ý<s‘ÿdþ­ÿkPÿþÉþCä4·üùh8E÷þ«týŒ÷%þ²þuûLAiü±ýU‘»‰þ€5ü|ýS·ý»ý9ã0WüÑýNl/¨ýxÿíÿF¡þ(ýÛb%ý¬ÆŠþõü£ÿ!þ9"þúŒû¼ý"{±ÿ·üÇý€ý>ÿm:»âÿ‚üûþâÿ3‰­þÐ9'›þ¥idB·ý•ÿëüý›÷ƒú¯ÿÔÈüvû‘[ïîý>þ•ÞVÐL>ü}ø®üÞ ýÉý§ûÅúHÿxöþÿ):þÿÊ–O•Býpý ¹ÿ«$Àûü"þSl’ÃÖÿú_³ý(ûåýûlÿôýó¾ÿáüÌi+û’ýâú¯ýñÿ>ÿAýÏüâK*ÿ?ÿþi°Øûn“ Ú¤ü*¾PýýMÿÅúòû€ØíþEÿ«þbÿøÇÿ›þªÿ<ZBm>ØÞx2á+”¸æý’÷~ü/ìøÌû›pÉý|FCú®þwâþÈþø'úüßýü´û,Hn%“ØIÚýÕûBýþ€+þ°‚þLúãøûý*Í”%¾*9¤þ÷§DúüNûLüòý>ûþûzúbûÙûíø(úÞ ÿ~þ'ó1v  å ñóÔ/øÊõjÿÓýlü³Ü×Ù ZŒøýû“ô™þ<óu Þûäù¥ùÔù øÛ›ýhÿgþ½üÿkH¯ªÄ¿ŽIÿuÿyÿ£üšýàùúd_þM±#< ?&ÿs%û¼ü.ùµüÄûTû[û¶÷ðûí²¨ÒÖWB &|÷ßõ9ûâúÚõýøSýöüòÿ1¶Ì—?72É$Pÿà›ýþ†Çû5ÿÇ ú¾ ýÁöNÿ_ýóôTý•øcür ¼ùgìc !·š ¸³ oõIìdòZäúÛìøú,Û ¾)r møø^öLúZþüžþÛm”j îÿ›ýÍýAý þ,ýâú_Jü&ÕÊ_)ý}’†øûX«þ®ôcú{õIQù×ÚË›a£4$þ&$ÒîQØ£ãOÓ\»µÒfðÿø¢¡8"9%h ¬ ^5ïñ™õîùHú‚ÿ}°F ‡ý6ùû,ÿùÖöûÿÄyìþPÅKøb²eúƒü¡ûu õæ õõüT0û€ÈE I/Û˜<‚5š#KëÌÊ"ÒÚ¾T‚º3ìÄý<üÊj>‰2ïV"ûWçÉäÌúLõ”ëàkL k¶Ï ßøøeüÖð9ón¥þáy úŽvý~û³LüÇ÷Wüþ0nòo‡ýüó—YûŽÊE)ÔB!ñ3™8>-ÍóQÌÆÕL» b¸šß~ð ”-<Ø#œs]ÿÆìbêNéEï’ý‘û ôÍ!d Ï&Žöuö@ó!ú1ø<úZÿ£ Ü© îþÿ\úü¡öÂýùÄvøA pý”ѵøÂÐ\P#fÚþ:?Ù*föêØsÓJµž°ï×EëM÷Þ!D7a5h'h&Î}íDäkïjèî˜úd aD[»ÛýPûÍøñ…ôôùÚl ù9ª ÁøŸød‘÷?ü=ø¦QýÝ øøÚü$Fúí×#þ !B5°9#+x‘ÞîÔU¼§£Ï°lÌFãûëP.8[3ú)lÍ õŸãLç\çâäwûêí ‡“ûUÄÜmûPïyì]ôõõ¦”Û÷ ºLNø‰ø„õDý[ü|üŸ‹ü¶÷*ÿN÷nÜúmù Ž,Ü6›/úÿÙç²ØîÂV¨H´òÌ$ÞÔóJ)j4Í/Z$†"ˆ³÷ì[éêè5ç„ñ›ü‚ å¶ù^Ñ0ý3üü§ëîû"ôžø« Ÿ= >3÷øÈûý–ø‡÷jü ùT GýÙý ‹úá£ô÷›™-p1|)†®î à£É~±¸¡Ê¹ÖZï¢ù³,0E,ƒ#~ÝeðÊîëæŠâOíór. |²l9 ªK÷8öéòpì„ðú¾ùþ¿ ª › € <ùvü³ø:úNú.ï‡%ùgaý @û ëTËã ¦1Ã/"§ 3ëéÔîÁç®.¹ÕÆÆ×#ô¢$.>5,_"ÿê‚ï°å=æøã2íŒû\«rxmÒ€Aþÿ÷GîPóŸílñçþýÜ›    H+ý|ùþöIüØùïüwÿþØ úò ÿûä«ýöJ Öì(0Ï!; 0çtÙ¿Íú·¸øÔPåüðBK%?)4*ë'õR­úçîLëáéëDôñûÜ´7‚ÎÙ ×õ<ðÌõfô\ø7üPRÙ “þZà»\ø!ùëú¾úüûÿ… üà ZúæþUGü°ãqûÜõÀú"1.g'ç¦æ2ÜÚϽ¿Òfè!û$ b3*¶)iäv àþÜíLéïìðSøýû¶ò§ Ä |úZòYø-ó÷õRû eûK¬f)ÿËýáû^÷Ôù4Vûª9ÿÒ Ÿûš#øþÚå’÷Þv²¥!¸.r-#ÀäØÙöÍɼu»ÙÈØãöý“‰'Å.èžî«ÿ9ó¾çÕìßóhøì’ ] ­{' $ªûÙ÷ñõ­õµöýMþ›o㼘ìýÂùÖü~û½ýžüW«ù\ Éý½þáÅû¿èæöªR!å#y0J/O rêzÚÙʾ;¾!Å@àìúm ƒ&\)ö "ø³ücô%îèôlûÙþY“i¨âèZþ¿÷Jóy÷#õâüÝ^Úeܹ~ýLÿ¼þ9ùáû²ú®ðüŠè÷KW'ÿ8ì[÷ü …&õT*J0ÄCíŸÕgÉ™Ãá¿Â…×ø@ *„«&8%™µûAù¿ïKì$ðô÷ïÞ6úä t "àý7úãôüôfùÞûšû}~©y ÝÿûQù;ÿ©ûÕüPûv‹ûŠå –.îÔõ,)5# "U+ˆ5ð‰ÙãÊ ÃîăÆÕ:ó5Âf,$¹#Y±ÿeø¯óNðçíoò>ýµ ’ ‚EQ ÕÓþÍûÜûökô8øáþXÙ=ª„ÑDyüî}ü·ýLù=ý û"Nûoþç 8Žñ¬ó»¶¢'Á&+! $æXô«Ú›ÌŸÃ‚ÃðËàÓì$J1£##% C€ùÜõŸðûïòøŽk ‚ ’; ( €Åý‘ø«ù1÷ÊømûBûL8>”\âZ«ýOþýL|ú Ïûôüòªò…ör =' (át¯Üú£çÁÔ¥ÊßÈ@ÎýÕæãáõf¨_ÍÅX.ö t+û)ö$õéðÓó˜ùƒüa'ðx ¼ PB«ïþýæúù&úÆû;úµþæ°ÿ” œ¦(·ÿVAýpýŠyÿ*öÍõ–ýD o–":»fr.÷íøßcØؽÖãÜWèEð÷ùˆ¹Å÷Jx žý“ø¬õ´ótò“ó÷mùûLy» ƒÄ&fuûû¹ü}ûHûhýý¬üÆÿ]ÿ&³ÿ÷³ÙþfþÁKR {…ÐigDûÂõ^ðÝëÏê1éìæèêêìêòUú[n6 ¤P¾:c犟 @¢ýòú›ø‹õ&õçôÆô²õÞ÷]ù†ûçþHÃ…+™rÜ'»,ÿÞþRý‰ûIþ ýBøÜøÁû<n N%¥Ð[Yþ ùµóîOíÝë°è$é.ë®ìò[ùÿ~_ Œ tl¡ácà )kÿÉûVúTø~öÛöD÷]÷$ù+û ü*þD¿%RÃ×^ùZ —ÿ0þ:þöüEülþJþ¼úaú ý “tûù× WÿøHò{í+ëÇêäéºéìAïaó‡ù×ÿã‹ s Pà…’ ¶ ‹ÑAsÿSü%úNùð÷øù¸ùÎúXüÈý<ÿäi5%Ð!‘é!‹ÿdÿ7þºþôý*ýTÿMÿWüXû­ý­cóJ ¹úäó­îÁëÁêIêFëîQñcõºúÂÿÙ8 + <’• È ¦ jœ7èÿ™ýûûÆúPúIúhú*û6üýáý\ÿ@×2ÜÄòøKDxêÿ?·þ¼þþ¡ýkÿsü®û«þ·qlTó| üüQöñ.îOíaìí›ïûñ²õBúOþ‘æì Î D Š Æ Å ò ˆÄD"þ™ü!ûþù0ú.úsúÂû ýÞýÿRçЉ¯ÅâsîŒÑÓÿÐþÿ­þóý?ÿCÿwüàû"þkxÀ ² … G à>þÁøÏó¦ðÔîËí˜î"ð£òÚõºùýE$0H ï l õ ~ ø ,‘è!ÿ[ýÏûñúaúúˆúCûJü[ýDþMÿ7KáqÔãÌGÑ^ôþ‡ÿ„þ—ýþÿ°ÿ;üZüÿ¯y. ¶Qù ‰Mþ–øIóMðjï™ïºñ•ô7÷¦ú þœ¶À5PP j°Å55fÿÐþ&þDþPþ þÎþÿcÿ®ÿ-7¡ØI±²ÿÛÿá¥ÿÊÿ=ÿ÷ÿ4ÿß-þV•ú¶û¨ l ¶` ètúX÷_÷)÷_÷ð÷ø?ùCú#üþ¼þßÿ,ºG|£ï˜ÿjİ?;S3üÿüÿÑÿSÿDËÿ‹ÿaM·ÿ³ÿ:©ÿŒLÿtÿJtþ[ÿ¹”ý2úúý°ø é îàrd‹þ ýóúËùúûÝúvúÒû˜ûÊüýdþÝþÿQÿEë#$Gc~‚okp×1ÓÔÈ+ÿd¼ÿþŠfþÔ(ãþÇþ+)ÿþrËñþÿÀýëoüÿ°ÿÿ:•þPþ¢`ÿ­þFþ²¡@fÿ”ÿ÷üËÜÿŸþÕâ¹ý þ;+µÏý}ÿ¿ý¯¾+þoÿóLÿDþ ÿ%ÿz4þàÿrÿ h®ÕþÿóþåçSürÿYÿfþ %²ý5Dþ•ÜK¡ÿÇþÈþÇl”ÿÿ'ÿR/!Äy½ýùþÇþÿ•®þÚ}ý—9/ÿÝþiÿsý3îóDhWýàxñþeýÓÿ?hÿKþ…„>ýWx’þîýƒÿ\^½ÿÐý›—GþL'ÿ ŽÿÀÿùŠþ»Xþ¹Ðþ@²—þ‹þÚé?ªþê½þ±ýãÿu+8ü$ÒþÿËíàü9`fvýsÿJô¥ÿÿaÿ±Vÿwüûÿç%ÿdýÉÀþÃÿäþˆ"¶þ÷ÖZý—Tþ3ÿE·þÿPšÿ»ýåÿÿþúüØÿ< ÿ‰ÿ~þ¨ÿQÿM–ÐÛý{ÿåûÕÇÁþÓþ‚Šqþ‹ý펎ÿ¿ú™Ïüs_Tÿ°ý®þ—¤'ûùþvˆ„ÿŽþ# ¦ýèþÊÿdþ“?÷Iþ_ÿãþÕûo~ÿá³ÿxþ€ñû¦ÿgþçÿ‰ÿøaýÛûÏV¿ýþ½8rúHî!þjÿú+ýZÂùûåÿ×ûtÿýŸþæ[ZþŽüØÿ5Ýý#Þ‹ûÔ‰DÿØþ<ý|×ýâûø£¨Ëþ‹øHÓ¨ÿ‹ø-èbÿ±þjùý^›ö3aü¡EýS²#þ "ýx3(úþ|wþ¸ù‘Ø?üþ|þñþáýrýÀ¯ÿCÿdþé<ýSý:Gÿõÿކýý4ªõù‘BýlùŸ‡ù»þ¤ ”ù£ýV;ýüÜ8ñ!û@cÐþ•þ,ü ]*úùŠ|düŽþüðÿúÿáÿû;hÿŠúeUNþ3ýþÅÀÿÿ‡IèþBøIÿžÒýØ÷Ê4Vý©ÂýˆEù«úÙ@¤@þ¥üôCÿ ­ÿ!ÿ¡ÿÒþ<Ñýw´ýúã%þ¡‰ü°û(µ!þFúÜÅøwjý <ÿ ûfŽùÀïÛãü{ú]þÿ«þwú8m`ý‚ü~ý*býÌüP=ü)‘•ìùìktýüúRþ¦ü|þ‘ÿ—šÿºÓùõü¿ÿùžþÒÿÚDú\þÿtë wüiþõûä“sþÿmóúqÂ_ûü†ýÝò—ý ü§ÿšiw,þlò÷ÿ¿’ø‹Pÿ>ÿ¼ý»þ¹ÿ°¦ú3þÌ&ÿ¥û[þŠÿ·µýýEþc#cý,ÎÆü¸:2ÿúZÿˆZýEý ÿý œÑý†¨ÿÐúŒûNÿ$üaûtPnþ«üzºýLÿCþS^ÿ3)ÿ¦ÿÚ»Ðýãø¸üœ´ìøþŠþóÿݱþÎúõùËÿÇÿX×ûÜÿ®üòýûøÚküÌúÿ $þzüŸþ´FøÿˆþIÿ_G„$½ø©ûþÁŽéúÇü£ ùüÁú9ÿ™ýîúêþZX¿hý‡ÿÐÿ ýÊ«ÿ”þ9þsF¸ üèû ènýÑý4ý£fÿ)ýµýÁ®¹4ýsûíú(xþþvþ´,I«ü^ü2ØIþ,ÏÇn–ý)Ïÿ82ÿÌþ= ÿþýîŽLþ;ú þ¢oýû6üDdÿêHΞþäû²þ ÿÄþb”R‹ÿÂýåýr®(ÛÿŒfþFýRÿÃZSÿy=—üþo8ãa°þüÅþíòÐýtüþ² ÿyüJý½YüþYþ<þ˜ÿgšŒÊ_þ¾ý.þ„ÿˆö\þÝüÿG‹³ÿ±ýèüþGÿ|ÿv]šû”/Åþ/ÿžþnþñþåÿÜ8¡´þXÿf†Íÿ³þ0_f&…ÿ<ÿìý6ÿ$ÿDÿ+—) ÁþLýèþg©ÿñý»þ ™76ÿ`ÿÏÿ0mFëÿ¾ÿ¼ÿ/xÁÅþfýÂýÍÿ‘±WÛþ,ýýZþþ*þþ þ•ÿùÿ¿­‰Mãw˜l— ]í<ÖÖ£ªêÿ|ÿÿvþwþüýÜýáýêýëýþKþ©þ¡þ!ÿ,ÿ™ÿ¾ÿáÿ>/l…{ª¢˜ºhÁ]’g[M0B1×ÿ îÿÿÿíÿÆÿÁÿ¡ÿGŠÿ!7Âÿ€ÿ¨ÿ™‘Ó$M>œH÷ÿ¢ÿKÿÿþâþÄþþËþžþÎþ÷þ ÿ1ÿhÿ˜ÿÐÿÜÿ 3]Jq~ u|xŠRVRZ$<+ ÷ÿïÿíÿÏÿÕÿ ´ÿ4­ÿL¨ÿ½ÿ¥ÿd{¥Û¬ ¼îh6¦ÿ‚ÿ[ÿÿ!ÿÿÿÿ1ÿ&ÿcÿ|ÿ”ÿ©ÿÙÿüÿûÿ7K>MeaVKdRC8@)9$ óÿàÿíÿøÿäÿ Èÿ3ºÿD¼ÿ™ÿÄÿ<’èÕßÕäÖ<æÿ¸ÿtÿNÿ/ÿÿñþÿÿ)ÿ/ÿUÿ_ÿ“ÿªÿÐÿèÿïÿ",+Z=ZCgR>[M5>E&0!öÿéÿúÿëÿ'»ÿ1Àÿ9àÿ‘ÿœÿL¡*È•°©ÀQúÿ–ÿQÿQÿ=ÿ8ÿÿýþ ÿ ÿGÿ[ÿdÿ™ÿÿÓÿÒÿüÿ 5=U>U@]OTK.J"J+* óÿ þÿðÿ ÁÿP©ÿBÐÿ…ÿŠÿQØ6ñBxÇí©æÿ†ÿÿ2ÿJÿ\ÿ4ÿáþ¹þçþÿlÿšÿyÿŒÿ•ÿ¿ÿùÿ9O:5&j^|zn;VIRKA<õÿÚÿÖÿ/¸ÿB•ÿ .ßÿ’ÿwÿcÊ3ðUO¸¼(_ÿ2ÿöþIÿhÿdÿáþþþìþmÿ„ÿ¿ÿXÿlÿ|ÿíÿ^kR'\wПqD!cƒˆuçÿ:<NôÿØÿ½ÿåÿ ëÿ fÿ2ˆÿ8sÅÿ3ÿ,ÿenù°NBQù—?àþCþþµþ%ÿÿþ«ýpýiþ&ÿ±ÿäÿDÿÿVÿ9löŒ]vB˜¬ãN uÖî¹åÿ•ÿ]ÿðÿ=6þÿ’ÿÿNÿ¹ÿþÿ®ÿîÿ%ÿÊÿSÿ·ÿÞ…,þ§ý’.n¨ £v´Ü±ÿÔûôù*ú†û[üÒü!ü¬ûëû¯ý$WÆò0=O_ÂŽí%Néôÿ½þ@þ3þ]þ°þ™þ¬þ4þSþÅþjÿäÿYµ•jmüe b¼ÿCÿ5%/ýPúzÿn ¾ ¨w …ÿpÿÏþ8û¡õ)òZòö7ù^ûü½üèþÏo Ž ójöf^›¸þðû‚úôúÓû#ûçúšúKûéüHÿÆÆÎı2 e’lÿ:ÿÛþ²þ‚ý,þJýqÿëýêýO"9ýi÷jÿôwÒ þÁù ÷Éõñé©âÒå˜îøÿ)  sÅ,<ÿù:ˆý¹ú1ø’ôåð–ï^ñÑõ²ú+ÿ³´Ç …  ê §àxZýú|øÂ÷q÷öÊ÷ºûSñËÛ@#Góûýî¬÷;z øcO Šþ@ëÙà*ãíæ ädÞ„â©ì¹øc=H%#5Ç*Rãhþ¦øMò…êMç“êJòä÷,ýž) 3 Ç &‹“1™û9ø‘ôÛñAò0õ ÷èûÃ)@ øðOýUûNújüúþ%õBê-ù¶¼/ò:ú>‘4LãJÄJ¸ð°J± ÃàÝ:ò `è0Ÿ<¡9 6ä.EÊþgëíáiÚÇÒ#Ù®èyõŽýÅ º"G e‰ÿÎòßë~æÌááåïPø½ý%pE»Xï\ ó÷’÷4ñ¢ò³íóêþ:ýkõ˜T!…6@ BB-ÿ>ÕõºY®ë©d³>Ë­åKøß \$a9O?Û<É6V&Íñ•â}׈ÑÓ—ßVðeüf Ã0$§&Ê!´ÙÔpó}ëçZá¬ã¿éöÅýÆ0ÛœñŠ¢ ÿ­õïîïí òÑóœùªa QÁúZË õ6wB A°*<üÍ÷¯|¦„¨?¶ѺëàþLo(ä; Bj?Y5"ê’ÙwÒHÎhÕ2å&÷ ¦N ã)³(½!¨Û ¦úßèâpß½ÝÀâñ þ,ⵌ . úÂñ ìê±èIñ¦öaý^ -s ¾ý§cT3ãA›D¤/ûVο®X õŸÏ²ëÏ¿ê}üA¡'³8#A·C»>…(, ôí¡ØáÉÆŸÑã™óÍ/?!S( ,I+w!>$ûLìdߨxØáºìH÷…ò½$FrB¨šúòeéìäXä¸ítózùÀ= § µr2Ø@ßB02ŸÑV°~žpž«¯AÍbêåþ ˜%5ô> C“?/Î2õQÝ"˺ÅgÌõÛtëÕûí ½5&R+µ,'‘è;õævÙ’ÕûÙSä0ðüûw œà·¤bý(—û”ñ_ë1åBéËêeð6ý<ÇTv `1[BF¿5ûDãš¾¤ë›¨vÀºÝLôÀ ƒÕ,.:ÎBŸD:U&Î µìGÔGÅaÃÇÊCÛ°íIšðL(-h,E'ª ÿöÅæJÚØÒåÔAÞ€ë`ùŠœ•jÍéÌñ 2÷FìÔç+ã?åcïLøsü|ÿ( ƒQ,Å=ƒE;;[bömΟ­(žð¢¾·äÓpñÝ þŽ,f5i;â;76‹)¾ûáæÌµÁùÏéäeûG` –(I+')'#Á‡ mËñÅãþÙÕ:Ø/á ðþÎÕÊ"©#ª”& lÿôÅë˜ääåÔé%øõÜÙ ®”-M:t;f+y U㡽A¤”ž ­ÔË^ïšY'¶2Ñ5Y2g,y$)ý £ùæƒÖ ÌÍï×Ûë/0(À-c*>! úøï”è„âáµâ1éuóO!RQ›Ø™Cõ/ëŠåÂåÛé{îJúòÅä/ZÇ!0£à+‚0Þ"S¯Ú˜µþŸ¡¹M߀X'F78½-HV  ®Ó,÷½êÞ\×óÙ:çnûþ%Ñ. ,™ß GúÖíGèÎçqìðð²ô˜ö¡úÖÿ tÿ9x! þ±ò é&çëòvûtÞ   ] ` )|÷ŠöÃÿ¿Y*n39,:÷èõÁ£©¨6»­Ý|_;,4,Ã#ÿþE» é æÿ¦ñâ)Ø0ÙÄåDû‡#{*°$tc@øïî`îWðô•÷À÷÷ÛøDü3 %Ÿ ëû¶ñëûêòÖùäßÈ]óϧòúNûêá%„/L,Ø©ò½Í¾²Ø«©¸éÔ ÷Bm$(û$?{)ì ‚“ò²âXØÖÖíáÎõÍ ÝË'A%/K ™ÿkõ!ó¶òó#ó´ñò]ô´ú ÷UQuP 4ýžôÎîhïyóù½ýzøÿš_' b Ý•þÇû þ÷ ¡P+*òù`×?¼¯²~º¿Òƒîu †‚Ňӓ¾Pĉú%èùÛ;ØsßÁðͬ ε_LþüúÃøoö`ñîîî ôêûÓ~ Ô^ü´öôJõ¾÷úÞûØþpý2–0¨ h ì•ü ùÿjO"å-')+™õ@ÕE½T·ÆÁ~ÙÛó³ <=GqZ‡b°Yõ¾ä‘ÛóÛ™ç¾÷· kñhG/ –2ÿþ€ûùpó%ï§íîð“ùFä(س^ÿjùe÷3÷EøÑùúäúŽü}ý3•°Ô t E@÷Áõ ü¸ è!ð--)+<öBÖPÀ ½?ÈÞ;÷ò ¹“ G.¾%³ótäܽß,ëòüÙ ^fŒM-]ÿ5þVûþ÷îòéï ð„ôxü‘˜œ) w4ü¹÷`÷øûíûáüÆü˜ü,¦¼|ÂÑ ùÜñôþ&P%€0*Ì5ø¥Ø9Ã}¿©É;Ýõ÷·NïÐl)<Âè/ôÃæ€àÌâVíÖûw e8‡Ñ ˜"µÿÄýkû«÷hôœññ·ööýÚ< =í } æoühøµøZùÓúýÁýÒýæý‡!é'ÐÀ9ûßómôˆýx¸$p/&,+ÝùöÙWÃr½-ÆÛúòæ~ÈðÛoa2úì‹ã¤â*êv÷3†MÃ…£Gþ6ýŒü0û|ø¼ôoó—ô)ùHæÙ Åi ¹çþ<úlø¾ø{ûÓýôþfÿbþÚþóý5îÆOÿëø^÷¡ýh r Ö,|-æZâÌÆ9º½FÏGéÍ@ÑÖy!Ç Æ  m ©Äù@ï©çÞçÁíú/ZA&êæµüø.÷àø£û.ýðüÑûºú¶úLþ0z â K¢ñüIø8ö‰÷~úôþh鄊ÿÒêþ/û{ûïÃF “,i-É!; MéçÌã¹x¶0Â]ØTóy +y iƒ-âð d ŽJþRö×íêÎê¦ðûíÜ«@ õ;‘út÷è÷òøÅú®û*üLüuýjÿºïlÕô@Øü{ú ùœúAüWÿçÿ=ñ[°Lëý ú@ú½oe,Ã/©&*6ò¿Ô`¾=µQ»rÍ8æÿy<l!ö®¾/ Q 1üPôŽí|êÔë/ò®ûÕ~Õ½„ ÖüUùä÷søOùµúZû+üý…þC´PÓ¹q|ýYûnùðúú þõý™ÿA×ÛÖýDýĺ æm(&,%Ïø‡Ü‡Æ|º×º¤ÇäÛoó`ŸÈ =#"!bд áý?öKðªììDïmõ¦ýç¯ ¹]#‹ @ðÿ×ûù¿÷¶÷4øçøvúMüÌþ¢ÚFè~¯7]þ¸û;ú)úéùBý»ü†ÿ3¾Zþñþ_aâý#n&E• ÎõÈÞÌ”Âķ϶áöv Y½"¿‰ÅÄòîûfö°ñ‡î\íšïÈô§û³º Ö0­ »¯™ýÌùZøÿö´÷¥ø úRüéýï|óãsc9Åaþ9üCû\ù‚ûøú¸üx+ñÿ#ÿ¨[Ç ÌÑrÓ úÍçœ×lÎóÌ«Ô]â‘ó$é¦àµ Û‰Xüøøyõ£òññÉò—ö|üÜ9u ž’¢ s¾þû3ø`÷5÷øúÀûHþ¥ÿ_?}=Dÿ´üòümúRû¸ýSý¥üˆüþ_í )>a#Αý´êÙ¯Î=ÌÒ:߈ðºc E ³ß£À ®Ndþ8üÞù3øÃõô?ówô„÷Îûí¯œ iXÉ 1‘—ý–ùk÷ðö™÷ÔùûûMþæÿ¦ÚÕÛCK¾Hô@ôý9þóû#üMþ’ý”üÊû¨ý (¤ç=†ÿ×ë+۵΅ËjÐÐÜ@î-1Ø’Þ†=ü *¨ÿÄþìýÐüöùø÷#õùó‘ôZ÷jüËßœ Ë   à~›üù-ø>øçùAüíý©ÿª!dE); Ÿ%Ö 7büüZýükûBú9ý¤ ÷s"kýüðèwØÍ{Ë7ÒßQðÀ¬½Òóá_` mêÑiPþ1ùô1ñŠïKò&öÒü<gÓ p ç Ê´Nþ•ü#üý[ý|ý¦ýzý¾üGýEýQþHkc8¾ÅͧþþRÿõüžûùû3® hx!$™Õ ›÷µãRÔÍáÎ]Øæõz º§&M©Gn€Öî\ÿ•÷6ðÓííWñtöünŒA¶ñ,Z*A¬Eþ6üúçøCù=ú°üÉþu¿œBÑo8Ò¡½þùÿfËþxûÞ÷çøÇ IÄ#i%ò> ?ôxá>Õ¾ÐwÕ|Þ”éÿó ûÂÿÉÐ_ |ôȨoÖ[eüþôXð†ð{ñâôøGú¬û þAÿ™ñ3 Ë î ):fÿ#üÍùú¾ù¥û»ûýRýIþåþT‚¡A]©«ÿ·û·øÊù•"Ì‘#ë" Ñ­ñ~á‘Ø-×ÍÛ‹âbêQïóÕöüÓÎ &¯£‚ûQ¥Öÿ°ûÃ÷C÷]õxõ6ô³óùôpöû×ÿ?} [ { eÔ^°ýžýoûpúTùxùúdü¼þ'Íޢ¨‹£.ýœýVR9+ ØA}òãÀÛÚ‡ßYäÏë™î-ñÿódøÏÿ* KfïþÇCì WÚÿ&ý ûVúX÷AõÕò…òµó ÷büVÒ±JK¬“QˆŽ.ÿpü4ûZúÏú‚üXüLÿÇý>Fý¡VEpàýU³Á´íª.öÓë(äœäõä¬é~êùëpì‘íòùÂS ýW?BeÛ * ¯Þ®¬ü²ùýô*ópóíôœøQû þ¥ÿ8¿HV|Õ èßÿ³ý%þÅý>ÿýêÿû•ý\ýý>üSûþïù ‡á¤£ùòÅëSìéë†ìüëWêtéûêqïööÔÿ ©ˆ$ V ¡ q ©Õ£ûIùþöª÷ð÷AùXú%ûôú5ü.ýèþÜ"1ÒìYNgêÀ.% þéþüný‰þ\þüoûûñÈ @…u,3*ûÓôŠðŽðÁðð-î×ëÄéjëJïÔöšý5ê® ] ; C /z Ò 3Ï)ÿŒüVüÔû•ûdûÏúôùÎùú!ûý{þ­!Qà A˜à¤•ÿ ©ý‰ÿìþ1ÿDü+ûÙû2 ¢ï*ä \üø|÷wöHõ=ò¼ïIíÉí4ð õùõþ Ý£]… . $ í œ l–Ç͹ZÞþKýUürûáûöûýúüÇýýý¤þ0ÿ­ÿÉjsXÀæÌÿ•·þ¬¿ÿÇýÙûBþx ¸ Ça  ˜øü³úìù_øIömôYò(ò™óŸõÖùŒûFÿ±ÿ$N»º>;ß=ÐÙÕ zM©UþÓþ˜ý‹ýý†ýþdþgþÿ-ÿHÿX¶ÿó]‘Œc>Ëÿ‡úþjé'ÿ`þÐü•ÿ%Á‰ ò ‹c-þ¹ü+ûæù ø¿öCö¨õ÷]ø^ú”üÏýÿÿ…|N4øào €g? éëÿ’ÿ#ÿ—þÿ:þ6ÿEþ8ÿPþ¯ÿÓþ´ÿ¶ÿQ+žÅÿÏžÿÛŠÿß^þ³ÈgÿÚý:ý‚ÿ”t> ’ Lÿþµü/ú&ùÜ÷÷Kööx÷Éø÷úÐý‘ÿ˜è«­Øš4ïa¯4Aˆÿ ÿÿÀþÿ›þ(ÿ‘þ¶ÿ"ÿîÿ­ÿ¼cÿ ²ÿšM´ÿÍaÿø7ýi„ý)á7ÿÎûèû0ï Æ šO ŠÚúâ÷üôZó8óÑóûô øûªÿÞk¦½#aêÞPþ*ÿðü|þDþ½þg;vêÿ*‹¾[:oúþbÿÈÿÿYÿ›ÿZgÿõþv²fgþ)FþÂþ¤ÿIõèü¿Å8 Îý‚ö.ôêô—ô ô#÷tüϦ¡Ž…è`–þýÏü”ÿ}ÿuä2¼Þ«ÿ½ÿlÿ˜þÔþ¨ÿ¢ÿ¾¤ÿôÿ8~\ÿDÿŒ«ÿ×ÿ Kêÿ<ÿ’@ÿw~þôþ“ÿÐÌþ™úÈüç† › PÀ‡þ½üù÷÷õföˆú¥ý¸,A©?£ƒùÿ¢ÿÜÿŽÿóþ|ÿ¤ÿó‚ ;k¯ÿÒºÿÿ™ÿéÿ*Áÿæÿ4ìÿèÿ·ÿèÿ#@ÿ±ÿD-}–ÿ:ÃÿDÿçþâÿðzÿÉü¤ý»€-q3Äý7ûùù*úFü ýiþõÿ^È…Sn•>æ´(ýÿöÿx#(1{×ÿ¤ÿ^ôÿùÿçÿþÿ®ÿUÿ71ýÿ2ÿÝÿUÎÿÏÿ4àÿnzÿ†bÿóÿqÿ¼þ©þæÍÜ^5øW ÿýNüõûŸüý$ýcýgþÿm–vé>ÛËQÃ=Åk<~ ‚YìÿOÙÿM°ÿÇÿBÈÿëÿËÿoßÿÞÿäÿ¥ÿ7†ÿª”ÿÄÿ@aÿsþÄþܰ}ü~sÆÿ¼ý¯ü¬û´üýÛü¡ýDþAÿáÿ£/¸éë®´kØa~[(yf<'ëÿ õÿ½ÿ ³ÿùÿIÿNÿÛþàÿaÿÿ—þzÆótÿ¹þñÊT¤ÓÿŽÿ,uáÿ«ÿEÿÎÿ·ÿŠÿ1ÿ²þÿrð½Ž<ƒÿ þÿçÿB:4Nÿ«þXÿlV®ïÿ±ÿöÿŽ9Cèÿj¤°Õ€üþ¢þœý¦ý5ý#ÿf^ÿ¬þ’þ„ÿT*)ö½ó{ÿ.þþuÿ^æÿûÿúÿe/žÿ«ÿŸÿ~Ű¹ÿ¿þìý°ýÉý—ÿîÿpÿ:ÎýüDÿ[ÿþîýƒý[ÿýÓ(fÿIÿoÿBÉÿCÜÿ|õÿ¶ÿOÿ±`'yÿPÿlÿÙÿ½á{OÙÿËþùýÿ´ÿðÿ5ÿ#%©þòÛilÔåÿ ÿÿ›Ó`Õþ­ý¤ýäþÿ§ÿóþJÿ‹ÿlÿhÿaoÖÿÁÿ%”Gµÿ&Øÿ¶ÿ¡ÿ y„°ÿçÿ8ônçþ«þjþ;þ"þÿ/±Š$Òƒyÿ¸þ£ÿOÓÿRÿQQúl£ÿâþ@ÿïÿÓ‹ õþêþÊþÄÿGÙÿ¦)ù‡äÿàþ`ÿ–ÿhœNFËÿÿ¡þðþ²ÿ5 šqÿåÿª[&†·Äÿÿ¶ÿF>…ÿëÿÕ0ú-íþ&ÿžÿCÿcÿKÇûM§ÿ¼ÿ=²›„ÿzÿ¦ÿRÿ¶ÿXÿÕþàþ[ÿ-6êÿL#“Ýæ+ÿßþ ÿÌÿ×g°„½ ÐÿZ—.ÿ‹þòþ„ÿÿÿð}ˆ¾ÿšÿÍÿÎÿeAž¿ÿ·ÿëÿ]ÿÿ^½ÿVÿÕÿ“üÿcÿÀÿ$‹ÿy4}ÿÎþcÿÝÿ³w¹hcÿÐþ«þFÿ&Ðÿ`Z²óÿÚÿæÿ6}ÿ0ÿ'ÿ¦ÿ…Z>³Ááÿ6ÿèþ™ÿªgºW$lÿÿ¶þMÿ þÿl¦¼ÿ=ÿÖþ¹ÿ;NîÿŒÿðÿµÿ¹½ðÿ:˜ÿMžå‘M¢ÿZÿ.ÿÀþÿ ¢É´ÿºÿDl9`5mÿZÿ ÿ©þ°þÀÿ/TÉD¦.w0”Öÿïÿ{ÿÿFÿ!7I0M°ÿÔÿnÿCFcÿÿEÿ˜ÿ­‰«0[ŽSÄÿyÿ³ÿ4ii(Hÿ‹þkþÿ£ÿ¿b=àFÿ|ÿ­ÿqÿ‹·¨ÿxÿÖÿFòÿ ÅÿëÿëÿÿÄø '*ÿÿPÿÿÎZùÑÿèÿ‹ÿvÿIÿøÿ8Îÿ‡ÿÍÿÿ­Òþÿ€ÿYÿ‡ÿYîï»&0ÿPÿNÿëÛûÿ"ÿ(ÿšÿêÿŠÿ‘ÿ‰ÿ·ÿX ÷ÿÍÿH7 ûÿâÿÖÿäÿüÿóÿ÷ÿëÿðÿËÿòÿäÿûÿðÿïÿ$"Hg4z|`ÿlÿcÿïþÿVæÿ.—¼ÿÝþ|ÿÓÿÜÿ•ÿ@‰ÿìÿšŸªdˆÿTÿ¦ÿ.|I1\Z”ÿ÷þïþtÿ"âÿXUéÿ%{”ÇÿUÿƒÿ ÿ'¨¾ž![ÿ[ÿuÿ!øÿµÿ¸ÿ]–Ü-ÿJÿ}ÿ. 9‚–kÿVÿ¢ÿ@BùÿïÿÆÿâÿùÿÏÿÝÿ Ïÿ €”ïÿOÿÿ”ÿïÿÚÿLË\²ÿ%úÿÊÿÍÿúÿcwÃÿõÿÅÿ*$ïÿYÿ&ÿ7ÿ™ÿxöçwÚÿðÿ qY_ÿÖÿÿsÿ¤ÿÜÿ<²ÿSÿ‘ÿºÿ±C:ÃÿƒÿÝÿðÿ$Êÿ}ÿºÿÒÿmT˜·‘ÿÃÿ$úÿxÿÕÿóÿ.ßÿ¿ÿÐÿÀÿ pf ²üÿ–ÿÁÿîÿtÿ£ÿæÿíÿÀÿöÿØÿ)ÊÿÉÿ•ÿ¥ÿ¸ÿH#.WÎá”Íÿ':øÿïÿäÿòÿæÿ¹ÿÆÿ§ÿËÿ°ÿ§ÿ—ÿG VXŠÃ›æÿÜÿ{ÿÀÿüÿ»ÿyÿ¯ÿ¡ÿ ÿyÿÀÿæÿ?zjnŸèÿÀÿ ÍÿÓÿ…ÿßÿóÿäÿßÿ5Ccúÿòÿ4 :ýÿ¡ÿ²ÿ;<H;­ÿ“ÿºÿ/0"»ÿwÿyÿ—ÿðÿE("òÿïÿÞÿ½ÿüÿðÿ GXV^éÿäÿ½ÿ2Ùÿ Ùÿ±ÿ¢ÿ´ÿàÿÒÿNdk>åÿÿÉÿËÿöÿöÿÓÿE *JõÿúÿûÿÚÿ8O5Ùÿºÿõÿïÿßÿ×ÿþÿ%EøÿôÿþÿóÿÀÿ¿ÿÉÿÕÿ´ÿH+ Ïÿçÿ4æÿÁÿ³ÿºÿøÿV€3Àÿùÿ âÿÚÿ Ôÿàÿèÿ>Sñÿåÿ,áÿýÿêÿâÿ Óÿ4&ÉÿÁÿÒÿæÿ@üÿþÿ(óÿÑÿÉÿ)=-ëÿÜÿÄÿïÿ ÷ÿ7ûÿ+Ëÿóÿ ÊÿÛÿDèÿ 8Úÿûÿ îÿÈÿÜÿýÿúÿ9B!õÿàÿ #»ÿ·ÿÕÿ'IÚÿÀÿÿÿ7ôÿÀÿÉÿ *øÿÎÿ& ýÿÆÿ¤ÿþÿèÿþÿ)Øÿ÷ÿ üÿùÿ!ªÿ°ÿùÿøÿS4õÿÀÿÃÿéÿ=!0ÈÿÞÿáÿ&&ØÿÈÿëÿÿÿ Aàÿ÷ÿçÿòÿ.ßÿ¹ÿ êÿôÿûÿ(àÿäÿúÿ%ëÿöÿ÷ÿÓÿóÿîÿ!ùÿéÿ+/Ùÿôÿîÿøÿ-ñÿ õÿ×ÿèÿ õÿåÿ )åÿÚÿÑÿæÿMGùÿÈÿÀÿïÿ0.âÿåÿùÿøÿ0÷ÿøÿ×ÿþÿìÿ!øÿæÿÓÿøÿíÿ#ðÿìÿ-÷ÿéÿÜÿàÿÛÿáÿáÿîÿ*6 ýÿÐÿõÿïÿ?üÿåÿÔÿ÷ÿ+þÿûÿñÿçÿßÿ ûÿÛÿ( ðÿçÿâÿáÿ ôÿâÿôÿ÷ÿ4ïÿ!*ÞÿýÿÓÿÔÿÙÿùÿ$úÿñÿ (×ÿûÿ ÐÿÆÿîÿÿÿ5ûÿëÿîÿ÷ÿêÿ úÿ*ÿÿ öÿñÿûÿòÿýÿÙÿüÿ ëÿàÿôÿöÿæÿØÿ ñÿ þÿìÿíÿúÿøÿéÿ ãÿúÿøÿ$úÿ õÿóÿùÿîÿ÷ÿ éÿ äÿóÿôÿúÿ ðÿäÿçÿúÿãÿ'ßÿéÿ ÷ÿöÿãÿòÿñÿìÿîÿñÿèÿ#!õÿ ÷ÿæÿòÿ## öÿéÿòÿÝÿ& ßÿñÿûÿ 'âÿ íÿ ùÿåÿèÿýÿëÿ#Úÿçÿ!øÿ ñÿýÿÞÿíÿóÿÝÿþÿõÿõÿ$öÿáÿ íÿéÿïÿþÿëÿòÿûÿ !êÿþÿÖÿàÿûÿ"&ìÿ×ÿþÿñÿÝÿþÿóÿûÿþÿ ÎÿÙÿ1Òÿßÿ4øÿéÿøÿ ùÿÌÿáÿïÿôÿðÿýÿ.ñÿÚÿ ùÿýÿêÿ Úÿâÿûÿÿÿìÿýÿêÿôÿîÿûÿôÿþÿßÿ ýÿûÿòÿ èÿäÿôÿúÿ õÿöÿþÿ×ÿàÿÿÿ$êÿýÿ"÷ÿìÿóÿýÿôÿ üÿÛÿñÿüÿïÿ.êÿêÿÚÿþÿìÿ ðÿçÿ) Üÿ Õÿðÿ!ôÿæÿçÿ  êÿìÿùÿÿÿñÿùÿ3äÿóÿçÿíÿòÿöÿâÿïÿýÿ*þÿïÿÛÿôÿ÷ÿðÿåÿëÿöÿ ßÿøÿÞÿìÿñÿ÷ÿ þÿÞÿÜÿ ðÿ Ùÿòÿ!æÿøÿ þÿîÿøÿ.êÿðÿõÿëÿ Þÿìÿïÿùÿüÿ/éÿ "åÿùÿ÷ÿÚÿÝÿùÿ3ýÿõÿâÿÚÿ&èÿóÿæÿùÿÓÿïÿêÿûÿ!ôÿìÿ øÿÑÿ÷ÿ"øÿâÿèÿöÿ÷ÿßÿ áÿ öÿîÿ êÿþÿèÿôÿñÿéÿ'öÿ ìÿ ôÿöÿüÿèÿìÿ!ìÿýÿíÿúÿ!ñÿôÿòÿüÿ Ýÿúÿ ôÿ îÿíÿþÿ øÿ$æÿþÿÚÿýÿûÿ&ùÿìÿôÿíÿíÿ/ìÿüÿáÿïÿìÿ ôÿ×ÿüÿóÿ! ÷ÿÌÿîÿ äÿÿÿ + ôÿäÿïÿéÿþÿ òÿðÿàÿëÿüÿõÿ#ýÿöÿíÿ õÿÿÿîÿæÿùÿ ñÿïÿ÷ÿóÿúÿëÿÿÿïÿþÿýÿÿÿîÿéÿçÿ ýÿùÿíÿöÿõÿûÿ÷ÿ þÿòÿúÿõÿùÿøÿñÿöÿöÿûÿ ðÿñÿúÿûÿúÿüÿøÿÿÿ óÿñÿóÿíÿ úÿïÿíÿÿÿôÿûÿ ýÿñÿñÿúÿúÿüÿúÿøÿøÿ úÿ ùÿþÿüÿ  öÿóÿðÿüÿøÿõÿòÿþÿüÿúÿùÿôÿýÿøÿýÿùÿúÿúÿûÿ þÿþÿýÿøÿöÿ÷ÿòÿöÿõÿ õÿñÿðÿúÿûÿ  ôÿöÿïÿôÿøÿûÿõÿÿÿôÿ ûÿ ùÿ ÿÿùÿýÿòÿùÿüÿüÿ÷ÿþÿ ÿÿ úÿõÿþÿôÿùÿ  ýÿþÿùÿùÿ   öÿòÿòÿúÿ÷ÿõÿ ÿÿøÿüÿúÿûÿ üÿ ùÿÿÿõÿïÿúÿüÿ ýÿ üÿôÿóÿ÷ÿþÿ ñÿþÿøÿêÿóÿ ùÿþÿûÿÿÿüÿýÿýÿôÿùÿ  òÿúÿùÿÿÿýÿûÿðÿäÿêÿýÿþÿ ýÿøÿûÿùÿõÿòÿ÷ÿîÿéÿñÿþÿ  øÿéÿëÿüÿüÿöÿøÿüÿüÿùÿöÿøÿúÿ #! þÿÿÿ ûÿçÿØÿÖÿÞÿèÿ÷ÿóÿðÿòÿôÿûÿÿÿúÿûÿýÿ  ÷ÿíÿâÿ×ÿÒÿÓÿÛÿéÿúÿ ## þÿúÿúÿüÿúÿïÿçÿãÿâÿåÿëÿõÿ üÿõÿîÿéÿèÿéÿìÿòÿûÿ  öÿëÿãÿßÿÝÿÞÿâÿèÿðÿõÿ073" øÿîÿðÿøÿ  ùÿðÿèÿæÿëÿ÷ÿ þÿùÿöÿöÿùÿýÿ÷ÿðÿïÿòÿûÿ  þÿúÿðÿïÿùÿ êÿãÿñÿ ýÿÿÿ  ôÿíÿóÿüÿùÿüÿÿÿÿÿúÿùÿ  ñÿïÿ÷ÿÿÿøÿõÿóÿúÿ  þÿýÿðÿøÿóÿûÿûÿûÿüÿóÿÿÿ ÿÿúÿþÿ ÷ÿöÿþÿýÿõÿüÿ óÿøÿòÿÿÿþÿýÿôÿôÿîÿûÿ  úÿÿÿ÷ÿñÿúÿúÿùÿ ÿÿûÿøÿüÿ÷ÿùÿ þÿøÿùÿøÿýÿ÷ÿûÿôÿûÿôÿñÿñÿþÿüÿýÿýÿþÿíÿôÿíÿâÿêÿ÷ÿûÿùÿúÿõÿóÿóÿöÿ   øÿùÿðÿäÿèÿüÿþÿùÿüÿÿÿûÿÿÿ  öÿ÷ÿõÿþÿ ðÿñÿëÿûÿôÿøÿôÿ  ÿÿ ÿÿüÿòÿþÿôÿëÿóÿýÿðÿúÿûÿòÿÿÿÿÿóÿÿÿúÿðÿëÿçÿïÿ ûÿüÿûÿöÿýÿ ÿÿüÿøÿøÿúÿôÿóÿôÿýÿ   ýÿíÿðÿðÿçÿëÿùÿÿÿ ýÿôÿçÿúÿüÿôÿóÿÿÿ   ýÿÿÿþÿïÿûÿíÿæÿêÿüÿýÿùÿÿÿûÿþÿüÿüÿüÿ ÿÿûÿîÿýÿ  øÿúÿðÿðÿíÿõÿõÿëÿæÿêÿñÿ öÿüÿóÿÿÿüÿ úÿóÿ þÿùÿ üÿøÿùÿþÿøÿõÿ÷ÿ  ÷ÿòÿûÿöÿöÿÿÿ  þÿòÿñÿÿÿ õÿýÿûÿöÿ ÿÿþÿ øÿìÿëÿêÿüÿ óÿøÿñÿ÷ÿûÿùÿÿÿöÿøÿñÿýÿûÿðÿùÿþÿûÿ ýÿîÿìÿðÿüÿôÿ÷ÿøÿùÿøÿøÿþÿúÿ÷ÿùÿðÿþÿýÿÿÿöÿëÿåÿðÿñÿóÿ ÿÿýÿóÿýÿõÿôÿùÿ úÿ ûÿøÿôÿöÿïÿøÿûÿ÷ÿòÿùÿ  öÿïÿöÿ ýÿùÿþÿõÿûÿ ÿÿ øÿ÷ÿùÿýÿÿÿùÿÿÿýÿúÿ  ÷ÿÿÿýÿîÿäÿõÿõÿîÿëÿöÿüÿ ùÿùÿûÿîÿòÿ úÿýÿõÿòÿøÿúÿøÿóÿøÿøÿøÿ ùÿýÿ öÿÿÿûÿïÿóÿòÿèÿêÿíÿõÿÿÿ ÿÿ ÿÿûÿóÿ÷ÿûÿ   úÿýÿîÿáÿôÿóÿíÿéÿõÿýÿøÿôÿùÿöÿøÿ  þÿúÿÿÿ õÿùÿìÿùÿùÿôÿõÿ  ôÿûÿúÿ úÿõÿæÿñÿôÿûÿôÿòÿüÿ  úÿñÿùÿ  ûÿôÿñÿñÿïÿûÿóÿ þÿõÿøÿýÿýÿüÿÿÿþÿúÿûÿöÿ÷ÿõÿ  øÿÿÿóÿæÿãÿ÷ÿøÿüÿ üÿúÿúÿùÿíÿùÿøÿõÿòÿ ûÿöÿýÿüÿùÿ ÿÿ ÿÿ þÿðÿëÿêÿïÿ öÿþÿöÿþÿþÿýÿñÿïÿíÿöÿôÿõÿñÿòÿóÿ ôÿ ôÿüÿõÿéÿëÿûÿÿÿüÿúÿýÿýÿÿÿùÿÿÿøÿÿÿùÿ÷ÿøÿîÿ÷ÿöÿòÿïÿüÿöÿ÷ÿüÿùÿÿÿþÿøÿõÿÿÿ÷ÿöÿøÿ ÿÿþÿÿÿûÿüÿ "úÿöÿþÿ÷ÿýÿüÿüÿôÿùÿöÿüÿ÷ÿöÿöÿ  ýÿþÿ  úÿóÿòÿñÿëÿûÿ  ÷ÿæÿïÿëÿüÿõÿøÿùÿøÿ þÿ øÿíÿòÿøÿüÿÿÿ÷ÿ úÿòÿûÿ  þÿîÿïÿõÿõÿèÿéÿëÿÿÿ úÿýÿñÿ üÿ÷ÿøÿýÿ  õÿûÿøÿùÿúÿ÷ÿëÿòÿëÿúÿõÿûÿõÿ÷ÿüÿ   ùÿôÿñÿîÿüÿðÿôÿìÿ÷ÿ ýÿõÿöÿïÿùÿüÿòÿøÿ ñÿóÿÿÿÿÿúÿ÷ÿíÿúÿ  öÿÿÿÿÿðÿóÿòÿÿÿõÿöÿùÿþÿüÿÿÿøÿ õÿúÿóÿþÿýÿùÿüÿ÷ÿôÿüÿ úÿûÿóÿ ýÿùÿþÿûÿõÿ÷ÿ ýÿõÿöÿïÿïÿÿÿÿÿÿÿÿÿÿÿùÿýÿöÿúÿöÿôÿõÿ   öÿõÿûÿûÿ÷ÿ ýÿÿÿ  öÿðÿæÿðÿõÿôÿùÿòÿÿÿøÿþÿúÿùÿ þÿòÿëÿöÿúÿúÿ÷ÿ ùÿ÷ÿ  úÿíÿæÿíÿòÿñÿýÿùÿñÿÿÿùÿüÿ  úÿ öÿèÿêÿêÿ÷ÿñÿóÿðÿôÿõÿÿÿ  ûÿÿÿùÿûÿþÿûÿøÿíÿéÿúÿöÿýÿ÷ÿûÿ öÿúÿ÷ÿûÿ ÷ÿùÿùÿìÿ÷ÿÿÿôÿùÿîÿÿÿúÿ÷ÿöÿ   üÿíÿíÿòÿÿÿ÷ÿùÿóÿùÿøÿóÿöÿüÿüÿòÿûÿøÿúÿñÿèÿíÿñÿ÷ÿüÿôÿôÿõÿùÿùÿÿÿûÿþÿõÿüÿõÿæÿîÿ üÿüÿÿÿýÿúÿùÿýÿúÿõÿûÿÿÿøÿþÿýÿüÿ øÿþÿüÿðÿûÿíÿêÿëÿçÿóÿ ÿÿÿÿ  ÿÿñÿéÿôÿ÷ÿúÿöÿòÿúÿòÿøÿÿÿ  üÿòÿüÿõÿëÿöÿüÿñÿùÿ öÿüÿùÿøÿúÿ øÿ ùÿòÿüÿúÿÿÿõÿþÿ  ÷ÿÿÿõÿþÿýÿøÿïÿöÿ úÿûÿùÿìÿóÿêÿøÿòÿ÷ÿòÿøÿ  ýÿûÿýÿûÿõÿ ûÿóÿòÿùÿüÿóÿñÿ ÿÿ  ýÿ ÷ÿúÿÿÿ þÿýÿùÿôÿóÿõÿõÿüÿñÿþÿ ôÿíÿðÿõÿöÿ øÿýÿðÿùÿ÷ÿÿÿõÿ÷ÿïÿòÿÿÿ ùÿëÿçÿîÿöÿóÿñÿ  ûÿþÿóÿúÿøÿóÿëÿòÿ÷ÿôÿñÿÿÿøÿþÿýÿþÿýÿúÿýÿùÿøÿøÿ ýÿ üÿéÿæÿêÿöÿïÿîÿûÿ  ýÿþÿùÿõÿÿÿþÿÿÿÿÿùÿùÿüÿþÿðÿìÿíÿðÿ  øÿýÿ üÿðÿüÿóÿñÿüÿÿÿôÿúÿôÿìÿóÿüÿõÿþÿóÿìÿóÿ  ÿÿôÿöÿùÿîÿôÿêÿûÿùÿüÿûÿ÷ÿøÿðÿüÿüÿ÷ÿüÿùÿñÿÿÿ úÿöÿúÿôÿùÿÿÿ    óÿóÿòÿøÿøÿôÿõÿûÿôÿóÿíÿìÿîÿ þÿóÿÿÿúÿùÿ   øÿüÿõÿÿÿûÿòÿñÿîÿûÿôÿüÿõÿûÿýÿöÿ úÿüÿøÿ ýÿøÿ÷ÿþÿþÿ÷ÿõÿöÿ÷ÿóÿ   ôÿóÿðÿöÿøÿòÿôÿðÿõÿþÿ ýÿýÿõÿüÿýÿ ûÿóÿíÿóÿ   ñÿôÿëÿøÿóÿòÿñÿüÿ÷ÿüÿ÷ÿúÿ  ùÿéÿàÿéÿìÿêÿÿÿ   ÿÿðÿîÿìÿôÿðÿîÿ  ÿÿóÿúÿñÿëÿêÿûÿýÿýÿóÿïÿùÿ  ÿÿöÿþÿüÿúÿÿÿÿÿýÿòÿûÿüÿ÷ÿöÿüÿûÿûÿýÿûÿüÿúÿôÿ ùÿ ÿÿüÿôÿ òÿõÿïÿøÿõÿóÿôÿ  üÿýÿûÿ  ôÿóÿíÿúÿñÿ÷ÿúÿûÿòÿ ëÿîÿðÿÿÿûÿùÿùÿûÿúÿûÿ ýÿþÿöÿëÿêÿýÿýÿ úÿôÿüÿÿÿ ÿÿõÿñÿúÿöÿýÿ øÿíÿ÷ÿÿÿ  üÿÿÿüÿôÿûÿîÿêÿëÿçÿñÿÿÿÿÿ þÿôÿùÿîÿþÿþÿûÿõÿïÿêÿêÿñÿòÿöÿ  ýÿüÿùÿùÿóÿûÿøÿ ÿÿ üÿ òÿðÿïÿýÿõÿüÿòÿúÿûÿôÿþÿ  ûÿÿÿ üÿôÿûÿùÿóÿ þÿþÿöÿçÿçÿêÿôÿôÿîÿòÿ þÿüÿÿÿûÿûÿûÿùÿ ÿÿ ýÿûÿÿÿùÿòÿòÿûÿöÿéÿõÿ øÿøÿòÿøÿðÿ ÿÿýÿüÿ÷ÿþÿþÿîÿõÿöÿÿÿûÿ÷ÿ ÷ÿûÿïÿþÿ þÿÿÿ ïÿíÿíÿüÿÿÿùÿùÿ úÿ þÿôÿýÿòÿ÷ÿ ûÿýÿøÿýÿÿÿÿÿÿÿÿÿòÿüÿñÿ ýÿÿÿöÿ õÿüÿüÿüÿþÿýÿ ùÿûÿ þÿûÿÿÿùÿþÿÿÿ üÿóÿùÿôÿþÿþÿþÿýÿþÿüÿóÿûÿûÿóÿ÷ÿýÿóÿÿÿþÿþÿÿÿýÿ ÿÿúÿïÿ÷ÿõÿÿÿ÷ÿýÿþÿ úÿùÿýÿýÿ ÷ÿüÿÿÿôÿýÿúÿõÿôÿúÿþÿ øÿøÿýÿýÿ óÿûÿûÿ ÿÿ ÷ÿ÷ÿ øÿûÿýÿþÿüÿüÿûÿ ôÿûÿùÿûÿúÿýÿøÿúÿûÿüÿ ùÿùÿûÿ ùÿþÿ ÷ÿöÿýÿüÿ þÿþÿÿÿ üÿøÿþÿóÿüÿöÿ ùÿÿÿÿÿÿÿýÿüÿðÿóÿ úÿ ôÿïÿúÿÿÿüÿýÿüÿÿÿ öÿöÿþÿ ýÿýÿýÿýÿòÿ ÿÿùÿ úÿöÿüÿ þÿÿÿùÿ ÷ÿüÿíÿüÿÿÿ ÿÿþÿóÿ÷ÿ ûÿûÿþÿûÿ þÿöÿýÿ ùÿüÿùÿ ïÿúÿ üÿúÿþÿ÷ÿ þÿýÿùÿüÿýÿ úÿôÿþÿþÿ úÿýÿ÷ÿÿÿýÿ÷ÿúÿöÿ þÿþÿýÿùÿÿÿÿÿúÿøÿüÿúÿþÿ öÿöÿþÿÿÿýÿùÿ øÿýÿÿÿöÿ÷ÿ ÿÿüÿûÿûÿ ÿÿÿÿõÿüÿ ýÿýÿ÷ÿûÿüÿöÿýÿýÿ ïÿûÿûÿúÿ øÿøÿûÿýÿþÿÿÿÿÿóÿÿÿôÿ ùÿûÿ ôÿñÿ ÿÿùÿöÿÿÿúÿþÿûÿùÿ ýÿÿÿ÷ÿüÿöÿûÿüÿûÿúÿýÿðÿ ûÿþÿ üÿõÿùÿ ýÿþÿýÿüÿþÿúÿûÿýÿøÿùÿþÿ ùÿÿÿüÿ ÷ÿúÿùÿ ûÿûÿ öÿ úÿ ôÿüÿúÿÿÿûÿÿÿ ûÿ÷ÿüÿÿÿûÿÿÿýÿ ûÿ÷ÿûÿùÿùÿúÿùÿûÿþÿüÿþÿõÿ ýÿþÿöÿõÿþÿ òÿûÿ úÿüÿûÿòÿüÿøÿþÿÿÿ úÿõÿÿÿôÿøÿ úÿûÿøÿÿÿþÿúÿøÿúÿûÿúÿøÿÿÿøÿöÿ÷ÿþÿ ùÿüÿôÿ þÿùÿ÷ÿ üÿûÿúÿúÿþÿ÷ÿ÷ÿþÿþÿ þÿöÿýÿ üÿóÿÿÿúÿýÿýÿ þÿþÿöÿ ýÿûÿúÿöÿÿÿüÿ úÿøÿöÿ øÿÿÿþÿþÿúÿ üÿÿÿúÿüÿþÿóÿ þÿüÿõÿ ÷ÿþÿÿÿòÿþÿöÿûÿòÿüÿ øÿøÿÿÿþÿþÿúÿ þÿóÿñÿýÿùÿ þÿöÿþÿüÿþÿÿÿ ùÿüÿ õÿ ÿÿóÿþÿøÿûÿòÿýÿûÿ øÿ øÿüÿúÿúÿÿÿüÿ øÿøÿýÿìÿùÿöÿÿÿôÿ ôÿþÿòÿòÿ ûÿùÿüÿ úÿõÿ îÿ òÿúÿþÿúÿõÿøÿðÿúÿ òÿýÿ ýÿøÿæÿíÿôÿ ÷ÿþÿõÿúÿ ïÿ þÿûÿôÿíÿçÿùÿ ùÿäÿÛÿëÿ-øÿôÿöÿìÿìÿøÿþÿõÿ ëÿçÿ õÿøÿ  ÿÿúÿ  ÛÿâÿöÿúÿïÿôÿöÿíÿáÿÛÿ ûÿ)ÝÿóÿÛÿöÿ+óÿ$çÿ âÿûÿöÿÿÿ åÿ æÿòÿóÿõÿ$öÿ!ÿÿÿÿ ÍÿÛÿñÿîÿÍÿëÿ Ìÿýÿ#óÿÜÿþÿ÷ÿçÿ*ñÿ2úÿúÿ òÿëÿûÿòÿ'äÿ òÿ¶ÿ'Ðÿáÿ'ñÿûÿ )ñÿýÿÕÿÛÿèÿ #õÿìÿÿÿ óÿñÿúÿöÿóÿÉÿÛÿõÿþÿûÿ¾ÿèÿôÿ) Üÿçÿ!ëÿûÿ0ôÿÕÿ ýÿþÿ!ßÿöÿØÿ8ßÿàÿ Ãÿ2÷ÿ%ÙÿäÿÏÿ"öÿ-áÿ;»ÿ,íÿ Ôÿþÿíÿþÿíÿ+àÿ9òÿ( ÐÿæÿÊÿ ñÿ,Òÿ=²ÿóÿOÅÿ àÿ-@-­ÿ8tÿ+÷ÿN&èÿÿÿÔÿÄÿ½ÿûÿ.RÜÿæÿ¬ÿ[­ÿûÿ>Þÿõÿßÿ ûÿ þÿçÿüÿéÿg¤ÿ\þÿÓÿõÿÍÿæÿÿÿ?jÿ0Ñÿ_‡ÿwüÿþÿßÿÅÿ1 ©ÿN›ÿõÿhöÿ¨ÿòÿÎÿTóÿ.»ÿLªÿàÿ%/2íÿÁÿìÿ'øÿîÿÓÿ/Ëÿ"Ôÿýÿvÿl ÿ)²ÿ»¾ÿ®ÿ·ÿLæÿ7Xxÿœ&ÿ¹œÿqHÿ;„ÿk®ÿ}þÿûÿF>ÿºcÿnèÿÿ–ýÿ3Gÿ¯sÿ{ÖÿÊÿsEÿîzÿÿÿÔÿAÿ#Çÿl]ÿ—!’ÿØÐÿ‚[ÿDDÿ ÿßùÿ{ÍþKâþóÿ©ÿæƒÿü’þúwÿ ݈þÎCÿayÿ³ÿªÊÿ]ÿæ›þ¢Îÿ˜-yÿªÿÿZbÿjÄ6sÿAÚþ—«þ;%ÿàÿЈþÀBü=¦ý:Liþ¹þŽ„ŸÿAHoÿ>oÿB{WþþBÿ%pÿqÔÿ8ÿofýÉÿ›þ£ýñtþ %’Îþe+œÿÿjmÿÅýr·ý‘Šüüä=ÿjÿŠÿ˜`ü·úhöÿÖ2¬þ°ÿ~üuÿÈaïý”÷Cþ¹_ý}]ýDIüúz°¸üBãÈûòòýÂû›ÿ.Jûêêù0‚ü*9ýéíþêJý³þýüŸÌýëÿ ýPõöÏüôþüýÝEýƒ"ýhþMòühÿý¡ÿi°XûÔûa¯ûeòýM2q0þy@üâü¼Óü€þÓÐü.§úf§ý<Ý3ûTäøŸÇûÓÀû,·ý ûüÔåÿçýÉ‚ðû —û•Kúó>ÿ,^ƒþÖ½ýx9ý$ÿ»þ„„<üQþæþþü& þÃ]ù˜ûË$=ûU®öþÓøj£ÿŒûKKýÙù/uÿÕpýi}üªõý·ülÿ{ýÄþHùD'÷åA1þ‘J÷p Aøºý ½ø{kBÿ²ý¥úò#œ™þÌþÿþ£LRÿ½ oú£kúøþ8¢÷ÑGUþÈü¬QýDúsøÿt°àÿÅýFúà ,øÉœù™ÓÝùµÿÑýž±øÂý'¼ üˆ<÷M*{ütüÂÍû ^üÊaûçIù 3ÿ7ûÝÐù4¤õÚçú5ò£ù ný›ÆûþÏ ¢þüÇöH VøÈ!ú«þF ýDDú¿xÿŽÿGü¶úÑ ,‹ÿ¿ûï ý!Výéÿ,ý`ñù}Bù4´òi KüÀüe ˆÿõ ÏøÐüÞüoþa°þký¯®øÿ”þ…ýg–ø&eþ˜—-ýã!û9üºüg¦ ŒþoþÄýßÿW˜ÿÊCû?4×þýûùÍ-û ûÿ8ýªføŠ®öHü[cûNú°óþ VúUáøà]ûîû€_÷2 ·øÁz÷RÿÔKýƒ¹ü§ãú>tý„ûÏ{ù£\ËŒý§bCù (øi.ˇü0„ú‰’þ Å‘úä]ø\¹ù8K ûP òó 8ôéöÐýž ñ0 Ðû˜*ýÙýŽüfþ\ÿëú îö/¾ù‰þ¿ý+3ýGússù—‘üÝýéûoÿüjyþLüýq\úSÿ¿8Ðÿü™øøØ~ÿú;üp¬ÿ°ÿ*°þ@JøÄVùÊ6ÿ‹ÿs·ù" 6ødÙþ*ùªöQ ŒûœÁHûVõCÐüi uño åö; Eöà ÷áÊüËøìü¹…˜øWôÓ&ÿ˜ýªpò~ÈüNý- ¶ü¹~ü»žøóš`DxûgÕü5¨ÿkäþ×úÕÒûPÿzøùÊú·ýTðøÆ ¬ÿˆý=ö‚úž –øb,ø¢ Gÿÿ‚Íöâ.Óýÿ<ù hÿ(þ©áüH–ÿ‹ÿñöý—ƒÿéývþyéÿµþ7fû=:þû<`þJýAÿûJþYÿ®ø«ßwü¼h¥W"ýìû~_ÿÁ®©ú–$ü4¶íùXÜhôºýÿ£ÿ! &öD÷… ®ûŠÄ ûëÇþ9ô³‰sÿf…þ=øâþyÌý"ÿÿŸ\ðû{þÓÿ[ÏèÆþY'ýFý¸xÿQÿƒþ¶ÿ¬ŽÙþUûÃü¹ý£~äþTþ–ýЦíjþJúýÂÿPVû ú9þ„ý¹ ²ûÕÛÿÃøi!nþ£UýDÿ?óøÿHú'üNÿ—ó7ˆü­ý b8yþ+½ûû<ÿK¹k€þ.ÿúÒÿ4@ìÿHýÿ ÿÞûÀ—åý|§ÿoЬþr`øüåÿW:ûlˆ#ýHŠÃÿR‘ÿ(û¡þXÿ×þ§ÿ3þ(ÿ!ÿ¨øuaÁ߯½Báÿþþ|þ§þ ÿqþþnÕk}å=nþqÿ¤þýuþeý‰þ1‚[v;%8ÝÿZÿN'^ÿ ÿþÿpÿKÿ1ÿBÿÈÿŠÿA¨ÿ)+-³+P,ã#½2üÿÏÿÖÿÎýÔþ(þ®ý¡þuþ¤ýpý_ýúþ;<†ç Ç+Óÿìizj}¡ÿF¤ÿ%ÿ4ÞÃae Œu/×þÂþ¬þÞþèþ®þÓþÿ{ÿ+ÿÿ5ÿUÿbÿ’ÿ¯ÿ,|Àå[œéiÊÿÏÿVšO!¥f™ øÿŸþ¡üäûlûGû©ú)ûûûú£ûpü$ý@þ®ÿ"Ò2Ú­±ï¦E:¨?z!”ÿrÿ”ÿÿÿrÿSÿÛþˆÿäþÁþÃÿZìÿþòþ¾ÿÐv N V"÷%þfûðùrù¡øøÎøæ÷SøQùdú&ûsýèþäÿžšàÙ4о Ì}¯×59µÿCÿpÿÒþ\þ€þ³þvþÔÿaþ=ÎþÓþ¦rEüsüå  IЩK ­ýÞø‡õzòqñÉñ)ñðÎòáó ö•ùýtÿÑI¯e·ö„ÓäÀö7kÿUþ€þÙýÁýºýðýþDþÿÿ Kÿ3ÿÜþ³H¬ûƒùØþDV¡» xüRñpêcè éÃé«ë%íðôÖù…ÿmV í Î s Ÿ ‘ÙDI@óƒÿþ)ýdý)þËþKÿ­ÿ§ÿÙÿv8¹¬þÿwÐþ¦ÿâþZFÿ}ÿ™šìú÷jûu³(‰)â Ëñ²Ýˆ×tØßêçHðõø ÿâç ‘µ ½S‚þãþ¹ýÿcÿ’ÿÃÿ)úó ï‹ÿôþNÿêþÙÿh®ÿîÿ·ýœåüB³þ‰ÿÿø…ö±ú0U 5è6Ò%+ ±âƾÙÅ×ÂïºÿJ‚èæõ ¦yÇ Áýßô;ñHôûS  Œœþýý‚™X¡Èÿ›ûVûnûÙüªÆ·ÿ¢ÿ“KÿŽþ¹öÿ2òIð}ùm0ŸD7¿£ïÕÏ“À7ɕ٧åLíÛïyð§úW ]N%§!§ çùfô‹ùºþ@Y\üTúÖù XŒ * |Xÿ´ûü¸üûÿ®øÿwýpþõþòýµIÿ¡ÚþD£þeüU•ÅìXð¸ý‡÷;ìIL0=Oà¯Î¥ÉrÙ{ß ÚN×>Ûôìö‡"d.A&G1 Y…pF<ù$ðîíüñOþtk Ð@Ž×À¤BþÇüñöÙù%ÿ`üöû½ý:tþ´ú¹ 3ûàäOêx0.6JDFçòÎÜôÞÙÍ™ÀL·,ÉnçD ¼&(/#"#o%’ ¶ø‡ìGæë0ôâù¼öÜû"GcÓ¿ J}oþuù ý û8ø#ø<ø*«þ`ãþ†ü Áþþû…ú<Ù‡éå4ŽD,J~ìóŽïaÔ{º<±Á1å8>! “'N370=°þÏôÃñžì×ìíìDì-÷r q œ 7^ý~ý"ù|ògôÆúÉ÷ßÿ'!÷7 6õµ 2ñsýôgø«ÓíÁ/=3”3ì9û¸ÿç:»5´­¾ñÖ]ôü½ -^6ï5—2{M¿øÕì×Þäìnú8 Ù(ä²,$ö,ôÛô=ó¤÷Úô÷þ“ ÐK=•U«ò8Zê^ÿÖ õ:Ôü:Ç+÷ ¤ ñ#=ËT°ŽÄÎ-Û(ÚUÆ6Ü1ž3Ú' AùDì8Ý‹åéCìTõØÏPß k¾ýÕ÷tî¹õñYô¶õkÿjg›3 ÏWò Ãí£ûü”úrÏÀñÍ=ô,ªfÂ)}é÷ÙÐ1¸0Æ®Ïɫ؎ü ù.#/¼)å2­*ÃRö4îÐëßãþçîýÍ( L¼ q Xù²ìBï(øŽðH÷[§a ¨&ÿÛFýL =ê]þ7 oòCÕ¡øí8ª#VMp(N ©ü¯Ê¼´|ÓÛÆ@Ç/ÈLf,Ž%÷-¤60,™FíaõâïûàÞ>ãÜþ¢E ꎹYuÿËÿeîüðßéø÷ øfþòþ&XÜs êýoãì®û' ñóèÑÌõÚ-¦*f%5S,),½tÀC·ÒÏкò¹¡ÂKÿS(Ç&H1ÇB¥+–xïRýJêºÞÁÚéçw ÈyÑ/ÿWRÿ'ó²ì`é‹öNÿ’øz/sôÆ ñk]ø'ÎÖõ8'«#ÄF,3æÒÈ ªãÆ,ÇÊÊ‚ 0F1#¼-“&Øœè×óûêrè-ä~ñUþ Êk²î ýöú?öÑódó?óù[¹·ŒˆÞÿ%Éð÷Ÿö$÷É öqÖžê8a4r#~0Ì<=ȯªÀðÚóØÎàÙøN160¡ahÚ >ð¸ä¢å6ú»ût÷‡ûÒ c w üê OÿSùÁëª÷¥üÑýÑþäáŸÚþÚýœåó¹Õôt~ %QÝ+ë¨._/ -fG ýÿ™ŒâD±ÕÀ\ÜLëkèÝÿ´ r)Ä Þ ¢øùÎñqöóþ!·# 1, ¶ýyýY—ÿLü(øÀüÉ»çÿ¾ÿgýYöûäËõû lö’üW yÕä@ë é/Ó/G!m Ò´þZñ“ÒpÄÒwÞ‹î±ôÿâG~ØÜò·Šÿèþ+üþƒûþ‰ Èú8yoVý‘ÞüfÑý ÿv-ÿïþiþïªújp÷ÿÓzé±ïC%:(½$¡ ‰ýHú¨þ{è²Û3ÙlÝ“éLôûlùÙŸ¿¹ !ýµ*Û^ÇçþxªþÈ úsýÉhÈþZÿ‡þŒüŸ93ÿWþÊýþ þ`þˆ7ú‹yÖþ~ð¥õq .Ü#$?$ûiûÁýrøŒîkê>àNäî}øTùJûmüþüyÝ |£F$ñë;yÉ6/‡Ò4þ`ÿÉÿ¿þþ†ÿ.ÿÿô¯ÿO}ýƨüüÓ=éÿÀõ=÷ä÷üýõþnûèýüüèøEõsëêã÷éUòö øÎúŠúúi¬·¹±%Gr_ žÕ båüÿ(þáÿ‰qþæþ¾¥ý¿ºþx>ÿ*ÿn?üFú?¸‰ÄôÌú‰ ’üýÒÿîþBþù ðTçÛåËëðÜö>øbùnø2ûà0~ „ Î ñA"ö›ÿ _Z³ÿLÍûjþ´ýÊþ(ÿyþ0'þòýþ—ñüà;ÿöHþ+Ç –h‡Ùþã!ÀÁý]õ»êÊåæýìòn÷möSö­õ¤û5 ± i V â¥D ø Ò & kªúÿœÿÅA¡ûüù üæûJþþÐþ8ýbþ€ý_SþzÐý6J˜ÿùÿxÜ {|\|™ÝÊBÃþ‘õýî±è´çê¤ñõóŸ÷Çõ¨÷íøÏÿBÑ h ‹ ë , 1 K ž U ¶hå&þ—ÿþÓÿ`û¥ûk÷Eùç÷¿üTüBþ4ýµþüµMÿ‘‚ÿò7ûNÿž¡[?ë7àìþÉÿðýWû7ôÚì9éRçÏìñzôµörùnùiýÅo 7 ÇÊ<  b Á { ÖÖßý+üÀû ûjú=ù¨øSø¼ø úíûý§ýàÿ›×ŽØ±>¶$dü]ÿŸ-Œã¸ k…ùýÐþ¡þ‚øZò+î1é›éîòÂóñ÷[ø{üEÀÕ Tqø w 1 ¢ ³ ,þ0ü‡úûÍö«ø¢õ"÷³ö:û4ú@þÈýyl x€ŽÌzüáþ?ö é O y¾þCßýRúŒòªðˆìUîñ—óÇôöŒù¹û„U¬ Ù L  „  ÛÐ;Zÿñý,üìùöø®ö÷òöù¾ùhûgü]þïþq?ŽŽÐ©ª7ç¿ü»ü˜ÿ¢Ö – 2 ê ‘ªDÿúñóñHîöî¥ñšò¥óöõÞ÷xûFK{¿ ¸  w  l € ×7Æ:çýû&ú#ù9ø>ø”øcù3ú^û+ýiþ}ÿ• bo7¸zÞ+Éþ&þÓÿ;¹ à ( ÙfÔ£*ÿœúúõ(óÐðñ¤ñòó‡ôZ÷&ú‰þ»Ä* û ¦ è Ú Î þ J\HãÿþÇüXûJú–ùrù¦ùOú§úËûÖüáý-ÿoÝå§2˜­½ŽÿÃÿj/ €/ÒrÄ®ÿŽü’ù£öôíóÀóêóõ³õ÷žùOüvþUøº ¬¨ B ”Û»•nÿâÿ|þmýÍüþû ûAûƒû'ûKüüQýEþãþ[ÿAûÕ\qâû2Dyë+“Z-Q­ÿþ1üeúøC÷Gö‡ö÷œ÷øúöúËülþÈB\[Üd”m2~ñîJPTpÿ“þ/þ~ýhý=ýØüý-ýEý…ý0þHþ1ÿ'ÿÞÿ^`8ùÿåÿÆÉ\¢Û^P½ÿNþSýü›ú*ùø”÷±÷‚øaù­ú¾ûñü!þQÿ»Ý=Ù5J<ÑZé¾¶ëÿ–ÿþVþ1þ©ý5ýsýýiý®ý þ þêþVþ ÙÿïÿÏ”iþ6ÿ¼ ½  p¦p½ÿÔþRüYùÛõìòò§ò¯ôæöeø§úqüCþÑõø¬¤ ‹ óÖ !}çM|ÿ#þÙüÆû„û±ú7úûVûøû.ýäýˆþÄjÊeBe‘IîV‚þñýiø^û{þ… l Ã?­-ºÿX÷æïêîõìŸíôöjõsúŽÿjG 4 êò  ã‘øþüÓø¡øý÷n÷B÷Ê÷œùÈûßþIY£åý”N:QÿRÿËþWþbúžþxú ü¹Íûk÷ÿÓf ¡; | +Äóôâaâ êÙécìßïÒïjúD õI‘”©éÿ$ûÒõáöÑôííWó;öý§9 u K ‚ w˜¶@üþú×õ ò øCùHù>ûãÿOýMäÑôÝû| êòb i?UøEí¼ÛPܘçûçáé£îŒñ³þí°} `‰ŽåÎýKùaö:õúñ1ë`î½ô|ùwþQð ç ¶ ¦®ì`púˆ÷2÷ùöoøÆû¸ø£ú‚ÁþãÖz ¡®ùŒûxO–Á µå –¸ø+ë ØâÕýÝkäjâãç}íüúŠ<Ë^Î?  xÿ×ù÷õSó®ï‹êÏë»ð°øÜûx¯¹Ì æÝ è )—µ}ÿDûb÷.öÑöˆ÷ºúùoýHý¢N Ò• ¤½øiø‘k "«£ U GëûíÕÏûÖ~Þ ã5éPì²öî t­ >ÑÒ ÁŸøßñ òØóçíîë´ñÆöÈý>Sè e Ù z Y$ÿ5yþ^ý6ù{öëôQ÷Tû ýÿZþ“WÄ­ ^KÅÌÿôøèö^ÿÔ㨦! ¦a…ýæîÊ×ÈÒe×­Þ‚èï:ïú½³"!£á“ÉHPý¦ñ«îHï"öŽðéòçò³ú(€ ¯ *Á )@ M:Dýbù)ûûøÐùõö7ø´ù—þݲh ÀJ#˜ÿÎÊùäÿ7þûóõõjþ*  >‹ Výý˜ñÚüÕxÛ„äÔíÆó§ôàûår ³H ñ‡ Fú†ïžì$ñøL÷'úõøNýùœ ê ÅØ9Ñ(åsùrö~÷ ùcý4þ±û‹ú™DI„ÓÿùºŒý³÷Hü³~ýêøõø1ÿênGÆ)ƒ5Fÿœ÷­åááÕèñ÷>÷`û¹zóuD ¤ a Îûúéôñôöø‹úaû{û{ûÿD·üÊós’ï_üü‡úDþþ‘ýNýMý}|Ž;ýbrMÿ¥©ü@þ_)þHûÊúuÿ6O÷ – tœû¡ô5î!ífîyðlôVöü÷püM‚I6 $ ‘F èÌú}_ñÿ2ÿÈýÇýGü_ýõüØþrþÿ ¬ÿ”HöV3ù¬¥ÿœRþúÿÓÿ•ÿ¥ÿÕÿôÿëþ¶(ÿM.ÿÿtÿ.óþ¢þÓý<ù‚† ò9ÐC^þíýiû•økø„öÑö²÷åùoúüKþªþ%'—£{­Á¤K ÝpMFÿvÿåþ1ÿñþ0ÿþþSÿMÿªÿ½ÿÉÿ/-&~¿ÿ0"úÿdôÿP´ÿ Þÿ-jÿ´ùþ9ÿ tÿµýþýA‹ñc zàþÁüÌû‘ø¼öÔõô˜õ;øúõüºÿº.*ÐÏùÝÀ"íþÿ-ÿBþný™ýGýýþXþÿÑÿJn‹C7jŸ·ëÿGµÿžÿÆÿÿrÿÿYÿ‚ÿ©ÿW ÿ¾~ÿ‰lÿAœ£ÿCþíüV:ç O n°ÿcü_úÞú7÷÷JõdõÂ÷nûÈÿ8®×ÚXÄýqÀŸ¸þIýKüXûèûÚûŸüôý ÿD¨_o3ã9ó…×ÿ!ÿáþ¿ýXþæýMþðþÿÿ?´ÿ°{þ*šýÂÿ¼jÿCüüžf æƒ  þ¤øröJ÷­ñ\òçðÝó«øêÈAT ] % â nòéüÊøÀùÇ÷ÁùÐû¦ü*þ u?pò>ôßBÿ´þýÓûü0üqü”þóÿ»yOÓõv0ØþóþýUþøûÏ>û·ûúX’ýBùôR® §û <øüï‚ìVìåÝ9áÉá#ëûé EñüXòMS äþæ÷&ñò~òÑöfúíü ]Á † )œðýÔûÂúZøýöüùþûÿB×h}Ë®ýØýÞý­ý{ûÙÿoúȽ#üj "ø;uùüÈîô¹ýÐqJá9å&ù Þó?ÞíÝSÇì«mºmżå¢Í'¸$â/Î-"&0ô½à)àùÚoîøÁûòÚFË r žÊú_ö¤ìkô­é’ðNø>ZN ­c 2Š_û)ùð÷0õñÆþ-@ü^y®¡ùa íöÃÊ÷ðïAõfá÷JÝ9#3êµÖ ÛøÉ ·ü¾‰ÔbòO"•/ô-*¢"©c[ä Þ–Ù´ãÁú} ¸ ‚ù.Œ Vö ð*íØíyõ5ó€ý|à Œ qA­fbùëü…ñÓùÃðªÿ‡ýƒXÆv^C)ûÊÊð“칌¸óbý•í#lCL8AöFà‹ÌíÛöŧÊ_æ¬/--='”'5 £?ö8Ù-ÚéäÀîºXR!ƒåŠ ¤ «íJèÕéÞîÝóüÂ~ü o!¥÷õÕù?ñnøªû¾úqØ ¢ "Øf3ùf ö˜üÙíà ¢îq (Hû*ùîôu ¹>NZ) ÙëÂ×iСÍ1Î-¼‡ÛÔ÷?"i8e>í,o¡múCõSâüÔÇÖ7ñËþ ² 0ì’ ¬ú¬ò¾Þåæè{öè\ Ô Øë ¾ xûOïìVóíòþ%ÿ¿¶¬ª b (É÷p÷`øöäòÑ\ð³ ž—õÁêîçkj(ÎN˜$RñžåIÜSÕ_» ¸4¯êÒ¤9dEï;}-õ$½íåÏœÆaɼ贮G÷)D*ê+Õ!øæâéّ۷߸í¥õÎ9X+½ ÷0ðFß:çißxü.ÿ}tÐíªBuø³ì8îŠéæòwýu šL!éúÏ ð$ìÂÒÖÝ•>ÞS%ÃßúëŽãhÓ¾»U˜ñ¯DòŠ6cHMO<Ü7~.Ôðࡲ±«àÉGñd š(å5;IÞ.áÝßˉÈ÷ÕúÙ|ꨩ$…5ï;Q#Þ|þÅâÖ'×jÒmâê É(;+o#MÒ ·õÞÇÙmÓ°êHûÎØ)â.3× òØL½(Ô' b;(\šÌùû¡ðùÔ_¡Í’¡¯ù¥(rCBLdIFKÂ>”ªÏ‹¹Ò¨zʉä!Y É3D™C®7ÊܯÉ]ÇlÎt×€ë­0(ðAã6²,×ý÷âRØ Ë”Ó è !Ö'¦,¾ öŽÿòòÙYÖ@Ý^ç6‘5#I\9÷Pü !ÖÄîÎp6Úg½, ùJõÙç}Ïx©ç”‰žµõ>6ÚE Y=A]K‚3¼ÐP¤Á±ÕÁßôŒ‘N'…LG/×ÿµÑnÇ̽ÔSÚ‰í6 å2ê= ;¤%ûkëà\ÏåÍÔØöê“ v'=*`0&"˜ *ü©ê+Û£ÕûÞÿç6 –»$œ"-þƒ¨9ÌöÂÔM ÅEc¯#ø¡úñæ4ÑȯŒŒ¢>÷M2èL§WzAœ?è<óШq¦iÄ ïÂ*6˜F¨EW2öÿÑѼvÉɰä_íÖ ..7D;=-%]öéÅÛ1ÔxÎÑØ/æ[ ÿ(1~(a$ë ýªì1ÙgÐÂÞïí³ÿ•É!!Á2_L€ µÐ¿½7Õ¿ ê4»a44züÖüæ*Ô·â˜Y Lè¤!ßLTÑDÄ8è4Äâs½¦ƒ´÷ë¿=Â)98ÿ?÷9¹ݕȤ¿}Í…àµì›W ¶3 C ,5 :ïáëÚƒÔþÛçÚiÿ0Õ0[äãûÂû6ãÕÜ¿ÖNÝWü9E#þ)µ 1öÃÝiÑ ÎAô!eV`3…ŸùâMãÞÙR·;§ÛÑí0 Vn;+û*53¼ß޾вœØðøqe$Ç!Ü*¨/™$9åãîÑ^Æ\ÚÊë ú® N&ù-ÿ"+ qñpáoÜ|߸éê£a x!G#S#h “xôéâ,èdÛüí8é—b W,Áøï&Ÿñ$àÜ1úœ3CC,§öVó(àòÛJÚLÂ̶VÓg $Có?V&J)*åë&Յ®ÖgðÿñÕm%!$` óûCæðÒžÞMæ óÖþE =ú(¯ŠîõÖé©ãñˆçÉõÐý5 ~ïã\Û6ù‚ôÁï'ë—ìrúeø†Ÿ™; ÄaïAõ•7"EG‹*oöPèôÑ3̇ÖÛÆÿ¿ÍØ¡ùøAÚB×(ƒ'gIÆñ¿â Ï$Òšî÷òÊñéñº3ûðàÐâÑãºíâú°ÿð ã‚«×5ûûõñðîíeôLöþ)- ‘ §4 'X÷*ù\ö3úùô|³ú–æ‡Ûóûô™lA)’þŸë‘ÔÑÖßËÜДáù=0:4›$ûÁþCú&óFàiâïŽó8¥ñž– Ôï±ðFë=òâò7óÄþå \¬ ,ýŒòÝþÙóZõ]GýÝû ’ ç EHù×ý'ü ö’$ø*§û6”£ýÌöÅùõ†™9'‡¹îÇÐOÕ›à‚âáêÇóS'!(e&Åñùüùz÷êî~ô`ëÌ÷ŠIˆª¢—míþúùEøÂñÜôLüçá7¶‡ªe¨üÒú'ú€ö@ˆŠžK™ÿù¸„wþ›û3nû”ßýZü. õùõûS©Á1$ FôÙë×ÂëAåÕé|î€ðL1$ ¼/ÿIölÿ)ù~øYû¼îEöjøÉ#ü=Vú„ú§›ö:õ|ÿðýÞ\ ȪýëÚý×ýæàûÿùÉþü³þ&=†þ–ýš;þ1úªùÝ#ÿXý]öôÞ÷@ýR"¢?0ç Šë»Îψ޷à§Ü4ãî ¬+«5N)WJþ‚óœø¢úšï­î0îmò*Ôýlû7'ýšúÕùñbðÈSó }'øX¿8ý,›÷òÍÿÙûêÈþ2ùþßd2÷öÁ'ñååü¾üibòúíQþÕûË*{T|5¯Bñq¼äŤÕÎÂóÒÆÜŒé ü@›;>4V"ñúpôfù]åsêæSåtüü À„× BþNþEõÿñëò:åyô ýœâàï&ÿÓüÐü%ü‹ïûøø€üp > ­Mgüwüh0nûâÜìð±ú*ÿ¨!%îiëµõÛôƒ8…`*C¥‰Þ´»¶Ë%È|Ç“Ðaï“)^Rß[\:ÅïžìÓæîâpÞöÓ—çŒ\%î§eÑ;F!Ñý¦°!ÈÜÙ³èˆ ï+ÂOaSõa' G$ óºòöðvønããeâ¬úA-—\ŒLÜ´ã1­¯µ±É1ÛlêFù§ 20MÔH»+-öé˾nѤæ‚ÿn .Ì„-U*·ýªÔùÊÅÕ)ç"ía½ùJÌ<ú3ãPÙÝTìH+É¢ = çÿ‹è)ß'á?ç¬üöN, ‚ ¢0IéèÚ=ä$ 1G·DH!`÷ ÃQ¿`ÓÛÛkãÊç½ì2 Ô65CkD ÞõbÜhÙ/â×é±óvïäÿd '†3Î TìÎãƒÞÔê\óMîtÐï$& D þì)áaí®ïþöéÿ… á>O< ødð2î5îrëÿ¡ñéÿT Ï¨9n†C_/%ªÀËwÑöÛçìÁ k1T<6AÜ,¯ ¤÷®ëËá.ä6ãTÞÈìÅÿ4*ú)KÎoD÷*óê¨ä^ã¸èø? Ó2Å‘ï4nüKö%ïZêºéióuûÁ . o†À@ | }úâö`üßï:íÅêÏò´’2T3Ò(Їð*ë¤äß½ÖÐËÜ-÷Ñ “%)ê&ò"»‚ >vë|áïÙhßJíõKþ.¸ ïSš@ =þWöhñfëì6ëãðŒö kë bq5¿ výÄúñó–òîjòBò¸ÿ|ÿ¯ª~£$/ù'_ªAàUÞsÝ…Ùa×|×]Õèd|ƒ)ñ(è"J…[† äûÛémáåÝiæÜð€ù¸:õ ¬ †P—ÿìöôð+ð­ðîÃóLõHý^ “ P™ á \.Yüù—ô®ñ“ø­òöÿû(Ì w€:>eŒ+&¦ê‘ãMã·ÞƒÚ;ØêÓÿäÔúD¦%ê|î¢>YóæèFäþãZíõ³ø›s º¿ X§üûÛògóœñÃïUôÂùóý2ëÆ ‰ „ ”2fØûÁû®ö÷£ó[ü¼ö$æ9úÿ÷˜Û‚%G!¾öNñ›ëëÒã]ß½Ú!Úèüõ ï„1ø€°îö|ì8ì"î;ó:ø ù$üœ å0g wÿ¿û«û}ùèó:ôo÷Ëù½Äµå PfQuüÆúöøÎûyû/}úpÒƒÿ7ý_< zZ[ õ'ïªðàé2äéàBáËìòþâ ËÚ·Áå Ž þžö´ñYóæö¦ú[ýFþŒ“t Ö î Ú$ÿ…üVýyúWù©ùüúßý¤l¦w»4 òbýQþÚûýü´þÆü_-þ)èÿýûþû+þ, ­3 h´úÄõOõïOæsæ`êBö ù <  * D ¾ÿ=ú­öñøûâþäýþb:µVuÇsþÇý¬ýÃþëûªûïûñþÆ£e<ðhÅ…ëýÍü“ý4þãôýÿãýiþbIýÉø;úþÿa U È=ü.ö¸óÄèêÚÊàaæ/ólè £D\ ¬ø[÷ËóeôáôDöØûeË ; T ^*TýDúÅökø€ù0ýœý|ÀÓî`fsbþôýxý9ü*ü©ûKþÄùü ƒLÿRúÐøîhS"Ü  ZûÎöõñèá1ÔSÖ;åñóóùg ‹‚ù!h,Ñ÷Põ ógí»éÔížõŠ9 Ù  {+Ç  ;þ:õ¾ôzò«ôÛö“öœøÀîù G Òï•XêùÊõŠõi÷"þOø¯;ü¬ÿ$Eëúbøš 5&[„ÿÛü+þ2ùnè¤ØʧÐ)ê´öåûÿê Ø.Y+á0ø þªö3ìáÝòßIèÄñmûú} N‚ã‚Iúž÷óœçöèRí[ñïüzÊm 07 À Ä)ýØü`÷}ñNðð(÷øMþ£ ÀÌýÉ c!¡&4¿ü þçôÉâ¾ÐÆÈƒÏ¤ã…ò üH4y$É/\0+$DÅ yõ è|Ýíگ߃ì÷nüÁÎ6 Y• tBú?óìþääŒêRõòùX]ÀŸé ¬oûêô¸òöëÇðwñHóŠCñøÛY‹%È&z (†ã?ùÓçÔ+Ê]ÎÜæëö`ÿv #¯,&0¿*ï– Êþ,ñsä%ÛAÙ!ã@ì˜òþ,P·¡!LØvÓü†õþë ääÍéàírõ¼ýÎ] šýõý@ xÁÿ4ûzó1ðFíqíú®ù›ðËõÖ&Q):€ Ä[Õò/ÚiËÅÎÙÀãåí0ù¶J¨%ƒ. +³!è núøkìßÃÚ+àµæJî¨÷÷Í +Ñ*m 9ãúqð7é¢åSçíë:ñÃ÷Bן¹¬ìc÷Mºüt÷çð¨ðöî¤ï9ú%øþô’ '+€3ü!n욢ø2è}ÙÐ˵Éֽ黸®þ¤ »ë'§-ý(°h'„ýNòFçûàà/åiï¹ø ̵ažÿÑú3ò¶ëvêí/ï¼ó=ü‘ïè ¨Å‰w €Ñûûüüüö5ðBòv÷Òû@þöìþbZ63Åø×òùžöªâËÌ“ÈgÕ—è)ø¸æ h‹Y ¼$Œ!þ4öù6õËó7ñMìWé2ì×õz ¢ ¿ 15 áüz÷Žõ‡óêòÆôøöú@þXf æ á½âáÇþNû’ù6úÎøïùRújûŸC»õAøå9/O5ü‹ìŽðUökí¹Ø$Ì÷Ðzã ÷Y ×Á­~÷q ¸üòOï»ñ•òeðQïŽóäüm `)Ë 1 L*8:û}õðñ$ò ÷PûõýGþoÿÿ—Œ $ ±ÿ;Hÿý2ûüúÓû]úýújûþ^Ä)¡õÖöÜ å*ü5["jûëgéHðÇîÿáÔÔÓ"ßð©Ñ¯ýSk”i†õ/ìïë:ñAö%÷ÒöùƒÍ £ã ¿*þ.üú!øÀôó‘öîüè –×¶+Š5¨üÀùµøúeýñý­þÖý§ýÝ"çÎøóõPV$4å&;ëãØéöî éÞ*Ø Þûìºýð ÀfH†ß_ ný…ñ.ë³ì˜ò¬÷úü•ÿ½ y ø ëÿÿBü\ùCø}÷ˆ÷P÷ù#ýb«µ=ŸE؜Խý^ûû—úÒû¸û&ýóýdýëæÐ'û"ùG $¼2&Ö8éìÞ{ä¸ê'éeâ5Þ£âyíü “l"Øü Œ ä ± 'ò†èåç îMõ]û™ÿLª ½ Ø ¹ {¤ÿÈø“õóõ÷ø‹÷”ø7ü ó ¬klHylåþzüñúµùyúÙú­ýøý^ý8íÐåú=û™ $é/b"RtéÎß°ãLé\éÝåKä²èûð¡úü¢&"y$Õ'—äȼö ì¾è¤ëüñß÷Õý a K. Ó b  ëüDöáóôöŒ÷×ùý6[wþ ¿ŽŒHgþdüÌúÂúùçúúû‘üU êÿ…ú ü { ³,ù$e .ñ áLßúåhë’ë×éÓé¦îà÷A³~x°ãÐ zˆÿwþÈü=ø†òÉîÖîóýúÐÞ O yú¯ÜÕþ†üs÷ƒõ|öù“û,ýÿR÷ ±Í„‘ïþýÂü¾ûsü©üìü@ˆRÿ9ù×ø”a(Ñ&”âø´ä\ßäXì³ï.ï‹îêðòöÿ”óÈ-ï‰ ã9ÿ–ýòýOýGúröíóßôÒøÄý$12fh7eÚJÿ‡ü†ú‚ù’ú]üøýÈÿ·¢`‹“CrMæÿ·þ8ýYüDþTÿþžù€ùÃBA"&%ž°Êë¡ßÁß ç}î(óô$õÿö|û} ¶ÝéÑ/ §üœùaúÒû'üÚúOù‚øßùèü9ûH±”GGÿÿýþ<þÃýÐü~ü€ü+ýßþœaå—¿à®—©™žÿªÿ†þ+ýšþ¡ÿ‘þÆú5ú`+ Ï"ë‹à±à3èìïßôöæöøÛúl$¸?´4 ÔUù÷hù^üßýVüþø‚ö¸öÅú»“á ‰ ŸU½þþ†þ‚ÿnÿ'þÞûúoúEüÿ§¯ìµ¨n ‚ÿÅÿøº‡þÎûDü•ýZý?ûüÛ6 §"ždëäßHàDè©ðõgõžô¿õîù/ RFs \žøÆõ´÷ãúü±ù“õ×ò<ô¹ù“‡Æ € I kkíÿ;þPþ§þXþ´ü­ù#÷%÷«ùçýDZPã{I,n·ÿšüÉúüpý¥ü¥ùiú"D&ãæ\êjÝQÞ—ç=ñ[õdô òqóRø^ Ôº@h_Pø§ôíöSûÄüÿùô>ð0ñ•÷pÕk˜ ò:ïÿüýrþêÿH›ýñøoô‡óÉöïü*Ë.}ùM;c7(‰²ýìûõùÖø*ûìýµý,û¸úöE"%Ä*÷'êNÚÅÙÜã†îó„ñ´îpïrölˆ kµÝ!D3úëôõ¹ø¡ùŠöùð í¥îæõ•Ð ›Ñü] »dÜjþqúÏõ‡òZò¯õÕûîš `¹qw$}qü¦ù÷sö–úuþ‚þÝú\ù ý­*.27$ŒÀåøÓáÔ‰áèíÂñÔíhé–ëö*=ä`$y$Þ —ù¹ò£ò˜õ›öîò„ìéŠì„÷äBá¾^¨ ó·PxòüÅ÷ ó?ð ð³òÕ÷(þ-Œ !Î hF\ümøÓözõÕõúzþDþ›ùÌùge `5n7M!tý€Ý-ÏãÒIßéëöè™è“îÑû¢ M²)¦.u)o ¯ùKòòsôaó6îÑç$æ,ìoø'E'JV/·ÀHþ±ú6õ¥ïìLìäñöù¡è× ‰ ¼ ü lÌ[û¨õËòåð<ô\øùüš/ ¾}ùÁùíß2óDP5z ,á@ÈMÄ‘ÌÃ×úáäé'ðö€ÿ¬ '9=;+оú0í èRç<çèsêVîWôþG 0~"Ž!N “Ûø­ówðGî†í[í!ïùóÍü%Q]2à ôl£üèö~ðÜëÉêêïïùéò=Ö ´ ÀŽøßâ<ä"1$Dö1 å‘ͼà È3×è.ñ®ñ‰õøW…0~7ù/ó6ðÝäïãmç(ëíÖðHúû—"í¡¬™ú`ò¶ì™ê&ìðïõXû-“ Sß7 &;þUøôññëñ5ô¿ùxÿ•DçJ ‡ ‘ýWô9ùŸüRò¹å–óX?H{3 çåÆ&¹ ¿òÏ9á‹ìë÷Άf0ò9·6!$ð àï Þ¾Ø"Ûmäqï-ú<vd"%#Í; ½û¿ìä”âyçðfùÆÓTÆi- Ìõcï‚ìNîªòŒ÷ ý ÕÀí„þÒõÁò½ðeö$öIöÕ¨ }ÿ«ò‡æ,^ANA})}ûdÅ¥©¯ÀÕÚæò& Ò&ï2ï:*2®õœÚcÌ Í¿ÚnòRö%¦#0$<]EžížÞ…ØëÞ¯ëÊú  jÒB>‚P‘óŸê”æWçží¤øÁ G@ @Aü;óÉê¸éBî•úº6e%; ¢þ'&åzÕùð‹gBqY4CNiÄ!¡Ë¡K¸ïÛý&ç”(š6ª9d-`bìçËñ½‡Ê›çezì(÷*$ÆZýèæä׈ҕÜJï\׿"‘#Gn 2ÿñ[èàãÛì¹üx Ôé#°¶2öØëüçöì·ñ(ýE2¥¾Õ dýBüìð«è]ý)û0ðð\{7Xydô-nØ”€‡YÈm¾<ÙKqAÀ-øÎ §øÖÕ…¾g¸ŽÌ¥þá/ÙR­Q65 ߬˦É\ØÃç­ûï ª¦-ú-¬"3 ê÷ÑìʧØ%òÍ ¥%Èfßú‘ìâÎàêãéô É">Öø0ë…ãwânìnûZ íñÒÇúˆØÀÍòî ÒW uFëîà™€€1»h È?RƒGM,N†žô®ÝÅÉQÃËÑYø¹&PM;Q<:@ UÝ¿¶ÓuòÐ  õ$ý#γþ¹êþØ-ÓVÛ{óëò%ý/²&Ùþõ´å¼ÚðßÀí]ü- ¨<i^r.õ;éÁäˆæôpî0±¯¯÷­éïôïŠà¶å´š3Ï[¢h‹/¡ÚRŒ€€¦È#ô]o"W8&ÑòèÙùÌSÎŽÒZáöóÓ•8IcK($õÙÃi§Àµ·ÚCú39D­:å¨忬Ú$ÕÜéÁøÃ"R,)+ç´ø"ÞÑòÑËäK¯c$ 'tR å÷`èMáâÏêØü ¬ t3  ÷&á á÷ßwì#KÔ?.ÉG¦IO Ž»€€< gùRU“|‰lú3nõ&÷±Ë»ãçùˆ-&"È289f$€þÐz´ò± Ö¬6;eP"Aù»é[Ð1ËÀÓ§ìáÊ“Í!O ˺RðcÛ ÎJÚ´ñÛb*i3L#¹ðîgÛOÝÚ䑸¾£{õñÚøôêNáûà(ó¡ÿN|a!²øÈÓÏÌ­ìl›X"h*dÓ†Œ€šmðØ?r]vU!.-ü!á­á+å²ãŒéCë&ý•Q85Ae-$,ÏÆ¶Áyâ‘+1.8S'© ³õnåwâ¿åÝéÒöøí¾ !HFRëÒÛZÚ3é^ÿK}" mŠÿñ£æ‚ìÉñóù¨”ZªÈýWõ}çDéHñ+ÿù Úr³òúoñ*ûî;ä1îUÎ2.V&P²ÅÀ‰J€í«¹GÑdÌVO)^öÓ§ÑÐÓÆáõÁt+Ü6,.³ Rç†Æø¿ºÏaû&#a9ý7„[ýÉâm×݃çØû¬ ^hμÃþ×ñ>à­Ü¼ë¿úŠ%v®üêó‹çéåïó÷F:r–Lgü#ôZíùîŒõãN yó¤ÐÃô¡ú ëžïF lÿù¦øÈ_,ÍE[G[þ’ºEŠrŠ›¸^ úUa_¼Mt -éÊyÎ×ß“êæój!#¦*Ä5ÖèÇÐÎÉÞØôÿ¿ (403[ÊöâÞ=×îÞ—ñˆûÏ)1 ý³ò4íÉèÂîpûQJ³Ë‰ÿÉñ^éYéØóXàz d~ ‚þQÿ÷Ûõóõëé -C ªmö‰ðöÔ÷äüÛÑ …ñ˜ð0 'uC¶D¹ $¾OXŒºö}L“ahHÒßë ÍÌ/Þ©ñÂátÙ#­ÚyëˆÖÏ*Ýÿ&X/Ÿ,).úAäGßå´ðj> *€ XôŒæ[æTñ{üò ôA1 Òý–ò*é[îÉùÿÿ³Ë o ] ’WèöWôŽòÏ÷Yþ›é 7 ‚ }ûDô÷œôºÿ÷! î{æ!üë ÷=kI‹6ÐÈ—ŠŒú°FöK@=`õLx%–óÐJÌÚÝÈñ{þU ’ÀÞ!£"‘¦öÜÌ“Ñaï–_/;4G$Ë>䯨2Ýë(+4:ƒ£ Yýrù¸î.êAëvöm`ŸTr™÷¢ëPè‡ìfú {™+ ôGüù(ó³óƒö€ú% ³ Z æœû²ôö8ôðû|ÿU q î.‚ÿKè¥àFýÞ"Ë={HÙ!;Üj¢’•z³ßêð,ZP H×'*~åWÕ†ÙAæÏñ±Ë’!·(M"ÐüõmÛWÐÙðïZ';+;” nó|áházçSòãÅÞäcÚòêâè¬íðùŒ“✠‚üðoìðZôÿvêú: PôÊïŒò§ô÷ý;q ‘ »Äü'÷õäô¼ú$|ò â ‡ØÿuøæóþUüYô–ô! ø'ø6þ4_HØ–¯°¨ÉÉÍùÒ(­@y4‚˜ûèáyáµêTóo!+!ý%̰ëIÛKÙ;ç3/ d†øðñyðâóûpÜ Ö‰r¾ü½ôð0ógúæ!  % TÚþþûùJúÈùŒü$Æ— ! O6ÿEø¹ô’÷ ûû»»r î:öäêÙú K(+J,é´ÅüÀšÛ“üoK#‹]¶þDù ô]ðjî ñýü( ®³ÈA…ìhåê÷És °súYöÀò¹óú ¸ Ý ù—ò+ñlöÚþ, 1 z%küÊùÇøsúøüÃÿ¨®Ç›ÿ‡ú÷Ðøžþ ŒµÑ‘þ²ý¦üYüýÿÑñ…=î‚ýHûXûsý°—WЋþ0>:úGóüüÊì¤ „ìé޽ߩñ$ b#ýàøhö©öëùÃ. Qô Hûøõ–öjûÍÈdMì½ý2ú;ù”ûêþ˜Ã¥ÿ.ýzüþûüßþ‚ZyÖ¨Ýþ¢üâûýuð0Äçûÿ}þ þSþiþ…ÿLè£>¥ÿRý•ý‘ÿwÆR¤ÿ•ÿwÿeÿÿëÿáÿ_×ÿ©ÞžþÐ oûlöÿ¬¸Kœÿyî äáäÍóiZr ö¶ÂüàùŸøD÷»ù ö Ra ù4öo÷¿üÅ(r®%ÿoû=úÖúàýí¦/ãÿâü üÙüyþñÔ\H¯1ÿÇý¼ý«þ…ÿ| ›.PÿtþÆþAÿsÿL|¥}¯JÜÿxÿÅþ ÿ*G]°VŠýÍù6ü¥ô™sûf÷àú€½I ÞÈúâûNþùýÚûüÖmIÿü¸ù·ùýs¼LªÂýûoýÔÖ Ò€„þ–ü‚øßõ ù}©¦0ümöN÷…üb8³ l ¡¯ý?ùƒüÿTÍy<àhý=ûzú'ùù3ûÝ'y¤yøµözûÁ] ½Ç}™ûû\ÿý½þmÿ3/\ú‡ú:ð¦|–ÿÚÿ¬ÿ–úùúùÿ¤tžqÄþúwúbþq:±ÿüû8ý£¶.³þü3þ÷ZâÝÿ¼ÿ8Wiþîüný«ÿªIæÿ)þGüšûÏþ“ :5vþŸûüÿ컪þWüìþ5Â9ZÇýÁýÏÿ?]ÓÿÞÿµÿ°ÿ+ÿ†ÿÖÿR\ÎÿÂÿdÿNK€\þ–ü—ü]þ Sû÷!  þþƒ’l!ÿêýzýrýþÙÿ’ÿæúþ+þµþÓ×úÿ<™¯Ìƒ.ÿ†þOþTþþèÿ© ÿhþ¤þ²ÿuü[/ÿÿÎÿï;âóÿãþÌþñþ/ÿ *úÃþ­þ~ÿ…¶»ÿnÿçÿà 5ïÿåÿÛÿÈÿgÿ°ÿíÿm ­ÿrÿbÿÜÿˆ÷³CŽÿµÿÏÿîÿíÿƒŽ= ÿEÿºÿµÛLxÿfÿÞÿOLÊÿ¾ÿ±ÿîÿÍÿ¹ÿU|<«ÿhÿËÿ 4m3HK^üÿWÿ`ÿÀÿ_]EÈÿ¯ÿñÿÒÿÅÿO4/#ãÿ¶ÿ¶ÿüÿ#&âÿ3 #Òÿäÿ ºÿÇÿ/DÌÿ¤ÿ1Cúÿªÿäÿ/äÿÞÿ &ÞÿÉÿ áÿôÿ1Ñÿïÿ .èÿ ÈÿËÿâÿ'øÿàÿ- -åÿàÿ$îÿäÿüÿ6úÿõÿúÿêÿðÿÿÿÿÿîÿ üÿòÿïÿ÷ÿòÿèÿëÿïÿÿÿêÿüÿýÿëÿúÿíÿ ëÿïÿÿÿÿÿ ïÿüÿ áÿäÿéÿõÿ ùÿ÷ÿüÿýÿ÷ÿÿÿøÿöÿýÿùÿ øÿ ýÿòÿÿÿòÿóÿûÿ ùÿþÿôÿðÿöÿôÿÿÿéÿïÿøÿ þÿ òÿðÿýÿþÿÿÿþÿïÿ ùÿýÿ üÿýÿýÿ þÿÿÿþÿóÿ ûÿûÿ÷ÿûÿûÿõÿþÿ ûÿûÿüÿùÿýÿôÿþÿýÿüÿþÿñÿöÿÿÿ üÿüÿþÿ þÿÿÿòÿøÿ úÿ þÿøÿúÿýÿ üÿûÿøÿ øÿõÿûÿýÿûÿüÿôÿûÿ þÿþÿùÿüÿÿÿ öÿúÿûÿûÿýÿýÿûÿýÿùÿ÷ÿ ÷ÿôÿþÿúÿùÿúÿùÿýÿÿÿðÿ ÿÿúÿúÿûÿ ðÿüÿóÿ ùÿÿÿýÿýÿüÿøÿüÿùÿ ýÿüÿñÿþÿúÿ ÿÿòÿÿÿýÿûÿþÿóÿøÿøÿ÷ÿ÷ÿüÿ úÿûÿüÿ þÿ ûÿøÿüÿöÿøÿûÿõÿ ÷ÿüÿóÿúÿ öÿ ùÿûÿ ùÿÿÿûÿþÿ ûÿýÿñÿþÿüÿøÿýÿ  øÿøÿýÿüÿÿÿþÿýÿüÿ÷ÿùÿîÿöÿüÿ ûÿûÿüÿ þÿÿÿþÿýÿóÿýÿúÿýÿ øÿ úÿ üÿþÿøÿùÿ ýÿþÿúÿóÿõÿúÿ ýÿÿÿ úÿôÿúÿýÿ÷ÿúÿúÿþÿÿÿýÿüÿþÿýÿíÿ ùÿöÿ ýÿõÿþÿþÿþÿüÿþÿìÿýÿþÿùÿ üÿùÿþÿ üÿ÷ÿóÿ õÿþÿúÿ þÿÿÿøÿýÿÿÿýÿ ùÿýÿùÿþÿóÿùÿ÷ÿôÿþÿþÿ þÿúÿ úÿûÿüÿ÷ÿþÿ þÿÿÿýÿùÿøÿÿÿþÿòÿøÿÿÿýÿùÿÿÿíÿýÿ õÿõÿ þÿ ûÿîÿ ùÿøÿ ûÿüÿôÿ òÿþÿ ûÿýÿùÿýÿøÿþÿÿÿöÿ õÿêÿþÿ ôÿóÿåÿçÿùÿ ÷ÿôÿöÿ=íÿ þÿÛÿ#ûÿéÿëÿ' Òÿùÿ èÿòÿÎÿ*-íÿòÿåÿçÿ ñÿàÿëÿïÿ Rãÿ£ÿçÿWiëÿÇÿÜÿgGqÿþÿùÿäÿ;çÿ“ÿ~ÿSžÿ."\¼ÿàÿæÿ=5JµÿA œÿ%XoÿéþSÿ(Hg¬þ^ÿAZ8tÿyÿCê#ìÿ¸ÿwXÿpÿ.ÿ«Uÿˆÿ^OUÿÍÿ+§ããŒÿÔþÿ:Šÿ®ÿœÿ3^'¶XÁÿ÷ÿÀÿ2Õÿzÿ&ÿlâí\ÿ:ÿ·ÿÞÿXÿ‰þpžªÿÿøÿ›m_ÿ<þÿ+¡CØþþþ©¦kÿ’ÿ ^ •ÿ–ÿýÿòÿÿ=ÿwÿŸ7;Àÿäÿ­ÿ]ÿ´>Éÿ`ÿ ÿÆÙY¢ÿ_ÿ_ÿÙÿØÿ‘â}ÈÿÿòþÑÿV²žæÿ°ÿL®Bÿ·ÿFºÿ! BNavÿ¶ÿ.ðÿÄÿêÿ)×ÿ©ÿ@CÔÿ ;àÿO¸ÿÐÿjÿÝÿ@º_»ÿqÿ·ÿ‚‰$·ÿÄÿ{ÿçÿ ?ÚÿËÿÈÿ&NeÚÿÔÿ»ÿ&J úÿ Ëÿ—ÿ%Öÿ)%½ÿ½ÿ*$.Éÿ #©ÿÏÿõÿ_=ÄÿÕÿÑÿ(ÿÿèÿêÿýÿ9õÿ ØÿýÿÐÿåÿS êÿ¹ÿßÿC ÿÿÕÿÉÿÖÿ+óÿÔÿ $ðÿÙÿ$(ÿÿÂÿÔÿ CÿÿåÿËÿ#üÿûÿÚÿýÿùÿõÿíÿÓÿ÷ÿ3Ãÿûÿ$ Íÿ ÷ÿ&÷ÿóÿèÿ×ÿ77Åÿúÿ ÞÿÌÿûÿ0Ôÿþÿ Ôÿñÿùÿ/èÿùÿôÿ$ôÿïÿÍÿ"ÜÿÔÿ#óÿäÿüÿ0àÿüÿÝÿóÿ ,ñÿëÿ!øÿÚÿùÿ(Ìÿ Ûÿêÿûÿ/÷ÿñÿüÿÞÿ&ôÿóÿ ÷ÿåÿúÿ úÿýÿÈÿîÿ$ýÿ îÿúÿìÿèÿìÿ þÿøÿïÿþÿÖÿîÿ éÿûÿ+ åÿéÿ àÿýÿõÿ ãÿíÿ ëÿ ûÿ öÿÒÿøÿõÿ4÷ÿ÷ÿîÿöÿ(üÿûÿÛÿ ïÿ×ÿîÿÙÿþÿýÿ*ýÿûÿçÿÞÿêÿøÿ!æÿ íÿðÿ Úÿ ÕÿØÿîÿ*þÿãÿèÿ ×ÿçÿéÿõÿÛÿòÿøÿõÿîÿ4ÙÿÙÿ áÿøÿñÿ#ýÿõÿßÿöÿÿÿ(õÿîÿÐÿ Üÿïÿôÿ÷ÿ õÿåÿìÿÚÿ ãÿ#÷ÿûÿ ðÿéÿ Ñÿ áÿøÿ%!ìÿèÿÜÿßÿ )óÿïÿìÿøÿ (÷ÿùÿÝÿëÿýÿóÿÑÿãÿõÿ!&ëÿéÿÐÿÜÿ #0!õÿïÿ×ÿåÿîÿòÿýÿïÿ)Ðÿûÿçÿþÿÿÿâÿ×ÿÑÿýÿôÿ7ïÿåÿ÷ÿ $þÿéÿñÿïÿþÿðÿüÿ3áÿÝÿþÿûÿ$ðÿáÿðÿïÿáÿ Þÿ0åÿïÿóÿ ûÿèÿÝÿøÿÿÿ)üÿóÿüÿÝÿ æÿ ùÿýÿ ìÿùÿýÿÿÿóÿüÿïÿ éÿÿÿåÿüÿýÿçÿãÿäÿøÿõÿëÿïÿõÿùÿýÿæÿòÿïÿ øÿüÿüÿêÿ÷ÿôÿ öÿÿÿñÿ ñÿûÿíÿ åÿóÿöÿìÿúÿüÿüÿ êÿûÿ÷ÿúÿ ýÿ éÿ ùÿ øÿòÿüÿ þÿÿÿåÿõÿþÿ ÷ÿñÿ ýÿþÿ ñÿúÿ óÿ þÿòÿñÿöÿüÿýÿ ùÿöÿøÿþÿÿÿ öÿðÿ ûÿÿÿüÿ ÷ÿ öÿþÿþÿ ôÿ öÿúÿ öÿûÿöÿ þÿûÿ÷ÿÿÿòÿûÿùÿ ýÿýÿ ÷ÿüÿôÿÿÿ ýÿüÿÿÿúÿùÿõÿüÿùÿÿÿÿÿýÿþÿûÿþÿ ÷ÿôÿ øÿüÿþÿ ÿÿóÿÿÿõÿõÿøÿ÷ÿüÿ  ÷ÿüÿôÿøÿ ûÿûÿýÿ þÿïÿöÿøÿÿÿ öÿýÿúÿüÿôÿ ôÿýÿüÿòÿòÿøÿûÿ úÿøÿýÿøÿøÿüÿôÿ   óÿùÿýÿýÿ ÷ÿðÿûÿùÿüÿýÿûÿ ûÿöÿùÿ öÿûÿÿÿüÿ ûÿúÿùÿþÿÿÿþÿüÿûÿ ÿÿúÿþÿüÿýÿûÿöÿýÿ þÿýÿöÿûÿøÿýÿýÿüÿúÿóÿöÿ ôÿúÿúÿúÿ÷ÿ  øÿôÿøÿöÿúÿýÿ ôÿôÿùÿýÿýÿøÿýÿÿÿÿÿüÿúÿÿÿúÿøÿýÿúÿ óÿûÿ þÿýÿøÿûÿùÿøÿúÿùÿúÿùÿýÿ þÿûÿýÿýÿüÿøÿÿÿþÿ ùÿðÿ÷ÿ ùÿùÿ öÿùÿöÿûÿôÿúÿùÿ ûÿ ùÿÿÿõÿúÿ ýÿ÷ÿýÿüÿûÿ÷ÿýÿùÿúÿûÿ ùÿüÿ úÿöÿ úÿóÿýÿüÿøÿ ÷ÿüÿÿÿüÿþÿôÿöÿ ùÿúÿ ýÿ÷ÿÿÿ þÿóÿþÿ þÿøÿÿÿ ýÿÿÿúÿúÿüÿÿÿ úÿùÿúÿúÿ ôÿüÿÿÿúÿùÿýÿüÿøÿùÿöÿüÿûÿüÿ ÷ÿúÿóÿñÿüÿýÿûÿúÿ úÿúÿûÿúÿýÿÿÿ öÿÿÿóÿõÿþÿúÿþÿ úÿúÿôÿýÿþÿÿÿüÿøÿ úÿýÿõÿÿÿùÿ òÿþÿ÷ÿøÿúÿ üÿöÿÿÿñÿûÿþÿ öÿ üÿûÿùÿ üÿ ÿÿ÷ÿúÿþÿþÿóÿúÿ ÷ÿÿÿûÿúÿøÿÿÿ÷ÿûÿüÿûÿþÿðÿþÿ öÿøÿ þÿ ýÿÿÿòÿöÿ ÷ÿþÿýÿýÿýÿôÿÿÿÿÿ üÿÿÿ ôÿþÿöÿûÿûÿ þÿþÿüÿ ùÿùÿþÿøÿøÿ ÷ÿþÿþÿþÿúÿúÿýÿ ñÿûÿöÿðÿ øÿùÿýÿûÿýÿôÿÿÿøÿöÿúÿ úÿ øÿþÿøÿýÿûÿÿÿøÿ þÿóÿüÿöÿþÿ üÿüÿ÷ÿýÿûÿ õÿýÿÿÿÿÿõÿ÷ÿýÿþÿùÿüÿ ÿÿøÿøÿøÿþÿÿÿ ÿÿ÷ÿùÿöÿ øÿ ùÿÿÿ÷ÿøÿ ùÿüÿùÿ þÿõÿñÿûÿúÿýÿüÿúÿúÿøÿöÿÿÿ õÿíÿóÿÿÿòÿöÿüÿûÿÿÿ öÿìÿöÿ úÿñÿ÷ÿüÿøÿúÿþÿõÿôÿôÿäÿÝÿáÿíÿûÿ ûÿ÷ÿúÿúÿòÿêÿèÿïÿöÿþÿ ûÿòÿñÿüÿ ÿÿøÿòÿîÿëÿêÿêÿèÿçÿåÿçÿéÿíÿðÿóÿ÷ÿþÿ þÿúÿùÿùÿùÿùÿúÿüÿüÿ÷ÿòÿìÿåÿáÿáÿäÿìÿöÿ "%&&#ùÿîÿçÿàÿÚÿ×ÿØÿÒÿØÿëÿüÿþÿþÿüÿÿÿýÿóÿíÿñÿùÿ ùÿîÿêÿêÿðÿöÿøÿøÿõÿíÿåÿøÿ úÿïÿëÿðÿöÿúÿ #ûÿúÿùÿöÿîÿìÿôÿüÿûÿêÿçÿðÿòÿöÿ ûÿÿÿ ùÿéÿâÿíÿùÿùÿ÷ÿ   òÿêÿõÿúÿôÿîÿþÿ öÿøÿðÿÿÿÿÿôÿðÿûÿýÿþÿ  úÿÿÿ÷ÿïÿòÿîÿâÿèÿüÿùÿ þÿûÿ ùÿðÿïÿòÿöÿþÿöÿþÿüÿÿÿùÿõÿüÿõÿþÿûÿöÿíÿøÿøÿ ÿÿÿÿûÿûÿ ûÿïÿýÿöÿðÿèÿúÿÿÿøÿ ÿÿ ýÿòÿúÿíÿèÿêÿþÿýÿüÿùÿÿÿüÿùÿöÿñÿûÿûÿ öÿýÿñÿìÿéÿÿÿþÿýÿöÿ÷ÿ öÿþÿ÷ÿ øÿ÷ÿòÿõÿþÿõÿýÿôÿøÿûÿüÿ  üÿíÿïÿîÿýÿóÿ÷ÿ úÿúÿõÿ üÿøÿñÿùÿ ùÿøÿñÿùÿýÿÿÿÿÿþÿ  öÿûÿøÿúÿýÿ ýÿðÿòÿöÿìÿóÿÿÿòÿøÿóÿëÿ ýÿýÿòÿùÿ þÿôÿ÷ÿúÿûÿ÷ÿýÿúÿþÿöÿøÿôÿòÿôÿøÿ÷ÿõÿøÿýÿøÿüÿ  ýÿöÿÿÿûÿýÿûÿöÿþÿúÿüÿþÿ÷ÿôÿÿÿôÿøÿöÿ þÿùÿÿÿ ÿÿ÷ÿÿÿÿÿûÿúÿþÿóÿ÷ÿõÿñÿøÿðÿãÿëÿûÿýÿúÿüÿÿÿúÿ÷ÿõÿ!úÿ õÿùÿ ýÿñÿìÿîÿûÿýÿ÷ÿúÿýÿÿÿÿÿ ùÿìÿëÿòÿýÿ÷ÿûÿýÿþÿôÿúÿýÿûÿ ýÿýÿñÿóÿ øÿüÿûÿ õÿýÿûÿïÿùÿöÿîÿýÿøÿïÿ ÿÿòÿîÿýÿûÿûÿüÿþÿúÿöÿùÿ óÿæÿäÿèÿòÿóÿýÿ üÿüÿüÿ ùÿýÿýÿîÿáÿ÷ÿòÿðÿöÿ  ùÿõÿôÿþÿûÿüÿ÷ÿüÿöÿùÿ øÿ÷ÿòÿþÿ üÿþÿñÿæÿßÿèÿêÿïÿþÿ  ýÿüÿ÷ÿþÿöÿþÿõÿíÿôÿ   ýÿðÿïÿõÿýÿÿÿ õÿûÿóÿÿÿîÿïÿëÿîÿõÿ   óÿùÿûÿðÿôÿëÿüÿøÿÿÿùÿúÿøÿïÿ õÿïÿ÷ÿûÿþÿÿÿøÿùÿ ýÿøÿ÷ÿôÿùÿúÿðÿöÿ þÿöÿþÿýÿüÿûÿ÷ÿüÿüÿøÿýÿóÿûÿ÷ÿúÿ÷ÿüÿõÿÿÿ ûÿûÿùÿýÿ÷ÿûÿþÿöÿðÿùÿíÿèÿüÿüÿ ýÿòÿþÿýÿ  öÿïÿüÿõÿöÿñÿúÿüÿñÿëÿñÿúÿôÿùÿùÿóÿîÿúÿùÿùÿ üÿûÿúÿ þÿøÿïÿîÿþÿøÿûÿþÿ÷ÿúÿøÿ÷ÿ÷ÿ ýÿþÿîÿõÿ õÿäÿáÿêÿíÿÿÿ   þÿõÿïÿùÿÿÿÿÿôÿûÿóÿëÿîÿèÿøÿ  üÿíÿëÿïÿõÿ÷ÿ ýÿ òÿãÿâÿçÿõÿ ÿÿ þÿ öÿòÿóÿúÿôÿöÿ  ýÿúÿýÿöÿúÿóÿôÿñÿýÿõÿûÿóÿöÿøÿöÿñÿúÿ þÿ óÿôÿñÿäÿàÿïÿðÿÿÿ ùÿöÿòÿüÿüÿùÿöÿ÷ÿ÷ÿ øÿûÿûÿÿÿôÿþÿ ÿÿ÷ÿëÿñÿøÿøÿ ùÿüÿóÿøÿúÿ  ÿÿøÿøÿþÿøÿ ÿÿýÿ÷ÿûÿþÿ úÿëÿéÿíÿúÿýÿðÿøÿùÿïÿòÿ þÿþÿ õÿïÿôÿûÿüÿýÿ÷ÿþÿÿÿüÿþÿ  ýÿþÿñÿæÿáÿçÿîÿíÿ  üÿûÿõÿûÿÿÿöÿöÿøÿþÿ òÿþÿùÿúÿðÿëÿûÿúÿ÷ÿþÿúÿýÿ öÿýÿðÿþÿýÿöÿóÿêÿïÿñÿþÿ ýÿ ýÿ ôÿìÿâÿèÿíÿ ùÿòÿúÿ   õÿéÿíÿìÿûÿ ÷ÿûÿõÿìÿëÿðÿÿÿüÿÿÿýÿ  ùÿøÿòÿðÿëÿùÿ òÿùÿôÿèÿêÿúÿüÿ ûÿ ùÿôÿýÿÿÿ ôÿêÿãÿïÿôÿòÿòÿ ýÿúÿîÿõÿ÷ÿïÿïÿüÿþÿ ùÿýÿüÿÿÿøÿúÿöÿýÿûÿûÿúÿüÿõÿöÿõÿ  ÷ÿóÿ ùÿøÿøÿíÿñÿüÿøÿ    ôÿøÿöÿÿÿüÿþÿñÿõÿíÿäÿèÿþÿ þÿþÿÿÿ  ûÿüÿôÿçÿèÿþÿ úÿ÷ÿüÿûÿüÿÿÿüÿúÿüÿúÿõÿöÿýÿ  ÷ÿüÿòÿèÿíÿýÿýÿÿÿ ôÿûÿ÷ÿ÷ÿøÿôÿçÿíÿ ÷ÿûÿûÿòÿóÿïÿûÿ  þÿñÿèÿ÷ÿôÿ øÿñÿðÿòÿôÿþÿþÿøÿ ûÿóÿÿÿûÿüÿõÿ÷ÿùÿñÿöÿþÿ  þÿþÿôÿëÿëÿìÿøÿ ñÿëÿúÿþÿÿÿ øÿöÿýÿúÿ÷ÿ ûÿøÿôÿëÿøÿ ûÿ ÿÿÿÿöÿ÷ÿõÿòÿÿÿÿÿ÷ÿþÿ÷ÿþÿõÿöÿïÿüÿÿÿüÿîÿñÿëÿöÿóÿóÿ úÿþÿöÿþÿ÷ÿ þÿúÿòÿ ùÿûÿýÿ õÿÿÿõÿìÿ÷ÿÿÿöÿüÿ ýÿþÿòÿìÿôÿýÿþÿüÿüÿýÿ÷ÿþÿòÿøÿñÿóÿöÿýÿøÿ ùÿþÿòÿÿÿüÿòÿíÿðÿ÷ÿ÷ÿúÿõÿüÿûÿûÿýÿ÷ÿþÿöÿýÿ÷ÿ÷ÿ þÿõÿûÿýÿõÿóÿ þÿûÿøÿôÿùÿóÿ ýÿ÷ÿ  ÷ÿýÿïÿçÿéÿúÿþÿûÿöÿüÿúÿûÿõÿ÷ÿõÿôÿ   þÿùÿôÿúÿ÷ÿñÿ üÿÿÿ÷ÿùÿîÿýÿôÿñÿóÿüÿûÿÿÿ  ýÿëÿóÿñÿéÿìÿùÿûÿûÿúÿþÿûÿøÿøÿ  úÿøÿ÷ÿ÷ÿ÷ÿóÿþÿ þÿ õÿôÿöÿþÿüÿýÿúÿÿÿÿÿÿÿ úÿþÿòÿÿÿïÿíÿíÿëÿøÿ üÿíÿïÿòÿ÷ÿôÿôÿ  üÿôÿúÿîÿþÿ øÿ÷ÿùÿüÿýÿ õÿöÿùÿÿÿþÿòÿýÿòÿÿÿðÿóÿõÿýÿ þÿÿÿþÿúÿúÿùÿøÿúÿþÿöÿ  ÷ÿüÿûÿüÿûÿûÿòÿûÿøÿüÿûÿûÿüÿñÿòÿ ÷ÿûÿúÿ õÿüÿúÿîÿùÿöÿûÿõÿûÿüÿþÿøÿóÿýÿ úÿìÿéÿîÿùÿ ýÿúÿñÿîÿôÿùÿöÿöÿ øÿñÿ ÿÿ ÷ÿöÿÿÿþÿöÿûÿ þÿüÿ÷ÿúÿüÿúÿýÿîÿüÿíÿèÿêÿüÿýÿóÿüÿôÿüÿûÿýÿ÷ÿ÷ÿûÿõÿ ýÿþÿûÿíÿðÿëÿöÿôÿõÿïÿ üÿúÿûÿùÿüÿ ýÿúÿúÿýÿúÿüÿýÿúÿýÿðÿðÿðÿõÿ÷ÿ þÿþÿõÿûÿñÿýÿíÿòÿîÿòÿûÿ   øÿôÿîÿñÿæÿúÿ òÿ÷ÿõÿùÿÿÿúÿþÿ÷ÿ öÿôÿøÿ òÿçÿâÿìÿøÿõÿúÿóÿùÿýÿüÿ÷ÿ öÿ÷ÿöÿüÿüÿöÿ÷ÿóÿùÿõÿ   øÿêÿåÿìÿðÿïÿ ÷ÿýÿîÿùÿöÿÿÿ ÷ÿûÿñÿêÿêÿûÿûÿþÿ þÿûÿîÿöÿüÿùÿûÿ óÿåÿ÷ÿ÷ÿþÿúÿúÿÿÿþÿÿÿ ôÿçÿæÿëÿùÿüÿ úÿóÿñÿ  ýÿöÿòÿýÿùÿûÿÿÿ ÿÿ þÿ  üÿ÷ÿïÿóÿùÿõÿúÿÿÿ  úÿþÿóÿ íÿþÿûÿðÿÿÿ üÿÿÿÿÿñÿþÿ þÿíÿÿÿùÿôÿûÿ ûÿúÿÿÿüÿþÿüÿ ûÿýÿýÿúÿúÿ  ùÿøÿóÿÿÿüÿ ñÿþÿòÿþÿþÿýÿýÿñÿ ûÿôÿþÿÿÿ úÿþÿøÿôÿûÿ þÿ ÿÿóÿýÿüÿ úÿÿÿõÿüÿýÿ÷ÿ öÿûÿùÿþÿóÿùÿ þÿüÿöÿýÿ ùÿøÿþÿûÿõÿýÿúÿôÿÿÿýÿ ûÿûÿûÿüÿñÿúÿùÿôÿþÿÿÿþÿóÿÿÿöÿýÿüÿ÷ÿùÿ öÿÿÿþÿúÿÿÿôÿ óÿúÿþÿ ÿÿøÿúÿ ýÿþÿöÿøÿùÿüÿÿÿ öÿþÿøÿþÿüÿþÿÿÿþÿñÿ øÿýÿ üÿýÿÿÿùÿúÿþÿ÷ÿòÿÿÿ ûÿùÿûÿ üÿúÿ øÿþÿûÿûÿùÿûÿ ÿÿùÿþÿõÿôÿüÿ üÿþÿùÿÿÿøÿøÿ ýÿþÿüÿ÷ÿ ûÿþÿÿÿûÿ øÿ øÿüÿýÿþÿ úÿüÿüÿÿÿýÿÿÿþÿûÿýÿõÿ ýÿúÿ úÿùÿÿÿ úÿÿÿ ÿÿùÿöÿÿÿõÿþÿ óÿóÿþÿ üÿþÿþÿþÿõÿùÿúÿ ÿÿüÿøÿõÿõÿ þÿþÿöÿ÷ÿúÿùÿþÿÿÿþÿóÿýÿüÿúÿ ÷ÿÿÿýÿøÿ ÿÿóÿÿÿøÿüÿ÷ÿýÿÿÿüÿÿÿ øÿüÿöÿüÿûÿýÿ÷ÿþÿûÿ ÷ÿùÿøÿ÷ÿ ðÿ ùÿùÿùÿ þÿþÿ÷ÿþÿýÿöÿ þÿñÿúÿüÿ úÿúÿÿÿûÿþÿþÿüÿüÿýÿøÿûÿùÿùÿ ñÿ øÿöÿùÿ õÿÿÿ úÿûÿ öÿ øÿûÿöÿøÿþÿÿÿýÿûÿúÿõÿûÿýÿðÿþÿøÿ ÿÿùÿúÿ þÿÿÿ ÷ÿûÿüÿñÿûÿ ÷ÿøÿúÿ øÿÿÿùÿþÿþÿóÿýÿûÿûÿõÿ÷ÿúÿ þÿøÿ òÿ ÷ÿúÿüÿúÿÿÿ øÿÿÿüÿ ûÿøÿÿÿûÿüÿøÿúÿ÷ÿ ÿÿùÿýÿüÿùÿôÿþÿ þÿûÿùÿýÿ ÿÿñÿúÿøÿóÿÿÿûÿüÿ ÿÿýÿûÿ ÷ÿþÿöÿøÿýÿùÿ ùÿ ýÿÿÿ÷ÿýÿùÿþÿôÿûÿ þÿûÿ÷ÿùÿÿÿÿÿþÿýÿüÿÿÿöÿüÿ ùÿýÿ ÿÿþÿõÿûÿûÿúÿýÿÿÿ öÿøÿþÿ üÿþÿøÿùÿúÿöÿÿÿùÿþÿúÿúÿ ôÿ úÿûÿÿÿ ýÿüÿöÿüÿùÿ òÿóÿýÿ þÿüÿöÿÿÿÿÿ÷ÿýÿ öÿ óÿúÿ ûÿöÿþÿôÿ ùÿüÿùÿüÿþÿ õÿþÿøÿþÿþÿòÿûÿ ÷ÿöÿüÿ öÿüÿýÿ þÿüÿúÿñÿûÿÿÿüÿûÿþÿöÿþÿ ôÿüÿÿÿüÿþÿüÿûÿ ýÿ öÿúÿÿÿöÿùÿüÿ øÿüÿõÿ þÿúÿóÿñÿ þÿÿÿöÿþÿüÿþÿÿÿÿÿ÷ÿüÿûÿ üÿùÿþÿ ôÿÿÿòÿùÿûÿõÿùÿöÿÿÿúÿ üÿüÿöÿüÿÿÿÿÿÿÿúÿÿÿþÿ üÿþÿöÿÿÿüÿýÿöÿúÿ úÿûÿ ýÿùÿÿÿùÿùÿþÿ õÿþÿüÿõÿ òÿõÿþÿýÿúÿòÿúÿÿÿüÿÿÿõÿòÿýÿúÿ ýÿøÿ øÿ úÿùÿ òÿüÿ øÿýÿ ÷ÿûÿñÿðÿýÿöÿøÿòÿóÿûÿúÿ ôÿ ñÿþÿáÿïÿêÿùÿ÷ÿøÿñÿ ýÿúÿÿÿÿÿúÿ÷ÿýÿñÿüÿéÿóÿúÿêÿþÿ ðÿ çÿïÿ#þÿþÿ÷ÿêÿ øÿ!ôÿÞÿüÿ èÿ ðÿøÿæÿ îÿ%ëÿñÿÝÿæÿíÿñÿôÿòÿêÿöÿ çÿ Þÿéÿ éÿøÿòÿÚÿìÿ ôÿ%õÿåÿäÿçÿ ëÿïÿãÿþÿúÿöÿ ýÿ ùÿ ÔÿðÿçÿóÿÝÿêÿèÿ üÿçÿßÿ Þÿòÿ÷ÿúÿóÿÿÿòÿìÿþÿîÿêÿýÿ*óÿ!+ùÿåÿêÿþÿñÿçÿ0)ëÿøÿ÷ÿíÿÚÿ Þÿøÿùÿ þÿõÿ êÿ&ýÿøÿêÿþÿèÿìÿ%íÿñÿ'!'ôÿíÿÉÿÔÿ ÿÿíÿÝÿùÿþÿæÿóÿÜÿÿÿæÿïÿÝÿþÿ#ôÿûÿúÿ úÿöÿ 7 üÿäÿ äÿ þÿðÿýÿÛÿêÿëÿûÿâÿ%ûÿ"Öÿåÿñÿçÿðÿðÿòÿùÿ/ýÿSÐÿÈÿßÿ`ìŠ ãôd¿ÿ-ÿ§þ#þ¹ý|ý:ýDýTýŠýðýDþÒþYÿÛÿxî]ÉþCRND É¿Uîÿ¡ÿEÿüþÏþ”þþ€þŒþ°þÑþÿ@ÿqÿ»ÿøÿ-f—¶ÔëðìÝÁª`5 êÿ¿ÿžÿ’ÿpÿkÿnÿkÿ{ÿƒÿ“ÿ°ÿ¿ÿÕÿ d}‰…†©7–þÿS¢ÿeÿsÿcþsþÌþî=‘kdè{X³þ¸ü†úføU÷_öëõ6öçöøÜùsû·ý­ÿ²(ir¼Ç$pP×½àÿ¤þSý×üóûŒû†ûNû©ûüÌüšýpþ ÿ²\cÀ‡0¤|ê*ïÿ*ÿâþåþûýüþþ-þéÿzþ3þ’þRÿ+Pi‚Üužý)ûÄøaöÙõ'õõ¦öÎ÷Þù7üIþ+Ö–ôŸkJ¢ü,Îÿ#ÿ|ý#ýìü&üµüÚü7ýþhþ'ÿ¡õë …áŠwþœÿ ÿ8Å¢Dí%N\ÿ ýéùà÷aö õŽõKö*÷¹ùÓû)þ É1l'à³ov$rlÿ¬þ·þ1ýkþ”ýýÕZþ”ý¦ÿÿÕÁ![  z¶º•þ9ú7öDõSó€óÂôöÂù_üÚþP:HSËP¯ýàŒhÖÿøü‡ýlý®ýŒý¥ý’ãÿ¼ýÞÿRe,ü Î ¦þ¯ùìõæðNð’ñ’òCõØø~ýg*/ µ R8QÿîüüOý¦úÕýþÐýµÿÿìdÚ« Ì’ " i‘øÈó–òÍí ïòíô‡úÕþ™(  ^ ­ „*A©þ˜û¢úüÛù(ÿPý)þMŽ5–H¾ í d ý ? UØø«ñƒïÕî§ë¥îõõdû¡Õì w à ¶†Ú8þwùàø7úEûŒù=Ô¯ Ç[ŠUÞ Ð E Àú õžë"êLí ìó¸üw$ ô } — <ˆýÝûëøöù}úàgÿÚÏ Ã=¸ûTo²n ² yÆ÷ëÁáÍèÁìRívö[ƒÿ[Cbô ±ü‘øû÷²÷¦öôsüòe?~f…ûxôÃþÁͳ èÂúYê;ßQæäìŽí­ôx‹ Än Cü¾ö·ôãôî÷¸õåüÏ AÞ* ,÷Uð]ü{çò b àûÌäÙÈÜëÉïaôo±§n ªúKïîÄòc÷Výãýb ó H A`Ÿõ ñîø5ã¹ä ù îó¦áZÑ;Ð8åuñø® 8þ#óÆNv‡ôŒê°ê5ó?üš­.I ¹Ãþ–ð9ëÝôíú&þ"¶ïñVÝ|ÇtÇ“ÚÈç9þ< £,D)zÐ ªûLîÏéå6ñVÿy»Â É « èû¥ãâwõH#›8ë'²_Œñ±Ò ·žµ:Õ’ð8 Y*º9Á/ŠEùoê¤éé™ã“îL]È IyIò;ÜáØÏõ<"<”/ a lò Ò…·I´·Ð¢òÏ 7 Ÿ,ò6ß,Í÷Äæ÷âBâbéãójy£Ù ¡å4ó¸ÛâÙ ôø%TBV2 Ñ «ïÅу¯±@Ójù,"Õ,8È,í åíŽÝßËæêDûÀ ö!·Ù¢$÷vûUíŽÚÝÞ'ùã+fIl4oS@æÍL­#¯×gþ9/2y49#„ÿ'å…Ù Øçuöñ} %)üïuõÐëÛ˜ßxþa/Oä=!Þ,Ã(¨ ¬ Ò (q6J8Æ3æ0þÛ7Ï…Õºéaý9 Ðq'à Ÿ­úç!ìÜâ ÝQê)¦:Wm=\ f÷Ðg½¨¯PÞÅ{-/A¸7.ó%ñÔÖ—ÉõÒAíèìS&Ú*2óPôÒÞöéÛâÝâÏî} D>âY®Cuð"ËTµŽ¦y®ˆÙF j2³C <„*7õñ~ÓÊpÒ0ëÝ Ú'% *}÷Ý•ç¨å]ãjïtº7r]ÅE^!Üò-Éú¸Fª"¯NÓ¥Â.»Dx9ù&œÑøwà=ÍáÌ‘å7‰”# (ÿˆ-ütä éåá”älêcÿC2ÓW:M)'»öPÍU½j°Î¬›ÊS÷%PGê< +ÏÄüì¬ØsÊÑØ…ó•Ò)ì"«#*mdxë°Ó´ÓèU#æPÅNc3ŸÛµÉ™³h¬Á‰ßàÎ5÷:@6á#= ÛùÙÝ#к×!çšýÙT³'R ]m7õêÙâÓGÞA]NS:ï HÙȪ¹.±™»`Ö¸µ/>6'&Ä.ìð"ÜÕ¾ß3ñ/ zƒ¬y%ç”ÑwÜÓÿMdS›4ÈÖæÉäÀX´F»Î…ô´)+:Ù9ü)OÊÒü…çbØØ%àÿ"Äjr´èö¡Ú;Ö)=Sê;6 ùÛRÄBÀE½Œ¼ÛɶäH4m:…3y{üôlåkÚüÕ)ìñûͺk%Wýáç¨ã ¼@zI¯7œÂԭú®·¿`ÄMä= (-A>¨(œ*ôDí„ݦÝdãYó›1"T#ê@\û !ÅFZKô1‹ø³Åý²­£¶ÅÂ·ÌØã q&?—A‚1â ÷,í“ÞìØaÙTì ûr€"x#Ë©Ú"áDjL61wýPÍ"²^«ë²½ÖË5Þçø!­3øAÁ<Ž-z>¸òïçƒãÑÞŒèîê]û½ pé˜ó C'BûLŸ5—QÓ›µÅ¬tµÎ¾~ÈôÕîÖÔ2þAB)2–1·úªëlçäÝ,áWàîÞLCÅ'ý:F 5Òßz¾7°G¶ªÂìÑ¥ÝÈ픪U1Ÿ;8¬(€×ÿñ…êããoæ³ãêãöÍ" µ¸%w3X9-/2ðÉÓÚÃþÀÈÇÄÑxß3íwÿÿ!4+‡-¹'{( ¾ü~ó¥êÏéŽæ]ê”òäúŸÿ‰Ù #ô+ 4­-8°ü|ãtÒ"ÌsÐp×?àë÷ãc%ç$2V?û òÄînëüì’ñ{õê÷÷ú¹üs!¾+!+WÒ4òá¸Ø8ØÖÜã±êó—üJ›Ÿ)¼@ùpfüÿöóð!ïjð¹ñXòôúd¥´!F&\A}þhî€ã¤àîáôæFìmñúöÃüù êùš9E Žú[õô7ò¶ðýïuòNû5å¢W»Šýåôêð+ïDïöðÖñ“óÍô·÷•ýLq –=¡Ï° ßÁÿ€ûöñÙïŒõŸþÛ ª gg1þúþ÷µö,öuöÓõmö³ö¸ø`üŽ·} Í ® $ g Œ‹þ{úÍømü¥›>ÁýÔùðööCõ†õ;õö§öíø|û?þ|¸¸H ú Ï U Zì¥ tþ<ýÈþÜÀ‹<›ÿ‰üiúÀø!øK÷÷Ûö"÷`ø3úükþ`>öäk˜BÆ¢£¤äÚפœ¶ÿæýüèú¿ù/ùtøŒøwø³ø]úÌû/ý¦þéÿ9:3Ѧµ$lþN¼{‚¬ODþ¾ÿ‘þŠýü­ûû‡úDú<úÃúû8ü ýÐý¹þ~ÿ_ÓHÄklig¸ÃÒ…T½õÿ*ÿoþ¹ýý”ü+ü÷ûÙûôû2ü€üôürý"þ·þ’ÿßþI§+ AYú}Û m†ÉÿÝþ%þfýÎüXüüçûíû üVü¾üZýÇý°þ.ÿèÿÒ<¸/Ô@u)ÓG¢$<iÿ–þÜý4ýžüEüüõûúû:üƒüýˆýXþÞþ™ÿör ¹rð.]-ÆXÄKeÿ½þûýRýÂüZüüíûüAüüý}ýZþäþ”ÿ„Àsñ7 ¿A¤'Q}ÿ§þîýJý¨üKüäûÕûÛûüƒü ý³ý•þ4ÿ!%°&Çp*€eeürÄÜêòÿðþîý9ýpüôûxûû.ûpûüûÞü£ýóþðÿ3ùC&L‹u‘‘nMÿþý5ü}ûûæúûŽûÚúûürþƒ¬)ý{§ã3”ùþ-þVþRþvý{ýaý2ýàüÍüºüýDýjý.þÉþXÿN©ï]Ï7ËW(9²®ÿ6ÿ¼üvü’þyWé#Ucÿäý£û~ú•ùõø“ùKú6üþÑÿÀ*ÁÞŠ&ø—“ÿ7üVüRþ¿+{µƒxÚýªûúÂø¡øÊøHú£ûþ[ú;8Z¬…žñjÿ"ÿgû!ýëÿ£º‹‰ùhÿƒûïù!øÿöº÷$ùlû;ý|ÿ?‚eªzø‹"ÌþîþpH|úü+? éý0"ü ù÷ö’öuøEú(ý<ÿúÐD¯d©ª€Q”ÿœýÃ`ÚûWûÛ ~² UÅÿDþ—üiøàó>óö†ùèû¿þY÷–A±1}þ ÿvþŒýófkü@ûÙž XJ§óû÷‹ø\øøõÃóBó<÷üüÓ,3~æÅ âü†ýÿü¯ýØ8ýÞû$ÿï `DÄ þáò«îÚðaõ5÷Ýö„öhøÿ<y ¸5ÿèù ø]ú~üZÿÈýGý•þšÿäÿ„Ý O 8ÈÙòóæ#ã¥çðæùÇÿ2NÉ $ $ ë )ÿWø·óûó™ö9ü JH±qé 5Yô ²|ójå ݨÞWè€ø 2*_ƒ tüøû¼þݺF§£û†ó§ð¼ï4ô>üä f– ïÊýìÅÝØdÚpä*ó§pûÁëfú ªèÁ‡ýøsô[î¼íƒð'övþoeˆÿÁ –÷ DüMê†Ú´ÒÓ/Ýçíu&á¨ÖÒeñwþìø’õÖñáð$ï÷ï1õ„ù ì¢ên ì!šûßæÖáÍ5ÐBÜÜïB'>" %° ˜. úõ"óñÒð¨îiï`ô€ù*w ”Õ$á$…Õ HöÂàøÏ ÉáÍ4ÝóÁ Ë5&%(¸!z¶ ÿuøkómñÝîîƒëÏìYóFú~ô@$h)¡'G­hñ ÚÐÉýÃûÊ\ÜJôŠ Äª*ü+º$¢c Ñÿ‘öÏï‡í»é±êYé–ì¯ôYý" )º&d,Ž(Çoyî!ֲýéÃ×Ïñ¹&&4˜4Y+¼\ ÿûÔðæéwè ç´êgìóðäøòÿj Ó²[$Z*ö&ùìÆÕ(ÃG¾ÿÅbÚ#öL)Æ45Ž*—' /ù$îÖç?æÙåŸédëìðOúåÜ ¦~ '|)=%·þê´ÔÃ|¿ºÇ0Ûèö6k(d6¨5¨," ÇùOíþägãËâûæÝêëð ûx¼¸ò&º)$=6ì³Õ¿Äˆ¿jÆÙIóíš&Ž5Ë6H. ¢ Aýoï”æÃâiá¤äŽç»îÇ÷¹ ñïà'¸*î&Á$ÇïØÜÆ“¿”ÄÕäîÖ å"Ž2Ð5«0b#å-Gõ³ê¿ä)áâ;ã¦è»ñIûëx×€*+/, ٠­ôDÜüÈ)ÀŸÂ¤ÐçïD+¡2¨1Ô)=¿¬ñójéOáÞÜ6Ú[ÝæÃñ'Wÿ ¶.¿5ü3V)«•üöâKÍ„À·¿ùÈÜlóÝ s,u2ò0ƒ*öãŽåð„á×ЃЖژçàúð !@1]:ì:"1F¹ÀéôÑÇÁȼ<¾ѷçÉÿ Ü'Þ2 6Ù3O*2I ‹ö$ãóÔ3ÊKÉËѤß!ó~ä1_>6AÇ9Ì'Î ,ð%Õ¬ÁT¹ö»JÉtÞÊö×#–2è:{;“4Ñ&‘gü¤ä­ÒÅŒÁÊ~ØÌìrƒª0x@ G‰Aò0E÷TÙ”Áµµ4ÀHÕ5î¤I i2ù=ëA=Á0R¾ÐèEÒÁRº”ÁϨäôüh'0èBŸMlJ.;ÆGþfݵÁ²ˆ®Ò·ÓÊ>ä<°¸1A>I"Gˆ;Û&‰ ‡íèÒT½´´Ÿ¸ÆÁÚ›óõ,šE T½TþF»*·âÂ󮶨a°ÂuÚ%öÖ,AãNÞPÿEâ0àÿïÒ<»°±z·DÅÙÅñù š*½EVTY@K(-‡|Ýn¼B©\¥W¯ijÞKûÂÔ1 FàQËQˆB1(B÷áxÆé³T±ü½ÊÑê®ôR6ÅK¦VõPq:–ì;Ɖ¬7£ÌªsÀ*ÜôúK¾/èCN N%@Ø&á!â‘Ä)³ ±¼„Öïñ8 #Z4oDtMàJ‚8¹îºÅ¾ªãŸ8«Äväþ¾!c6ÎFnMûGƒ7ûúö›Ô¾·Íª¼°*Ä”â ;")4É<×=->?:W,²ïëÏÄ©#¡ ­öËóð°¾- =¿@‡E/>W(a ¼çòÅ,¬i¥Œ±½ÐiøÛ¥?jO'L=|*§©4 6ð_Ñ¥±> ÎªÍÈñ*™3];:˜.%M>IÝgÁC­f«·Æ®é)ó;ÎMJ[Q‹1#¥ø$ûHåáC¶lŸú¬@ÎõÙ .Ç6!†&â# ¨ù¿äsÝPÝxë–õI:š‚ !pþùV¤; U6°’Áº›/žs±ªÐGáô/nÖ9KFò@Š&œ ÆðèâÝgۉݯå*ó=ð"0)°”Q,à?ÎJŒ)RòZ»ï¡Î¦±¾(Ôã/õ’ 0(oû"xãªÓ®¾}©¬›Æ äˆ ð!Î+ñ4—0Y$ÚÉüœè(å"âBíîò ˜ÿG#¶®ývî(B&œIn?ê´ èmÍĵš…¨ÑÆ©èÒÜþ*"9ð;&)ðküï>êwá†ä»ëüSt Ô- ã÷½þ]%G%8Ô® ¦êDÖ4´SžŠ«Eʳ߆l-¨>[9)‹0ÿ7ø†å/Ù8å˜äüþÉ à ±—ýü Å(DD3 Xô/Ï[²Òž÷§—ňדö,«,­=Û9å(½!ÚöýûîÑÜRåcæŠõPõÛgs[œýš¤2çB]01oúËÏñ«µŸE¬pÈÑðX /Ìùlµì ÞïÝ5E7ç!~b0ë^Äı²ö¸zÀ¹Ò¤þ,N6@Î&{ÜüjóD߬ÖdÑdïEæìú͹–Q!¿6i->ϲ ÿâãÂF¹IÀµÁðÃðÝMç6&'2 =v4ä÷ }Îò`Ù#ÙyÛ‘éàæÖûéš¡ 'j(ä3f"ûnbìßpÀ–À«Ç`ÀZÅÑìé ‡Ø‹6h>1Øž ð¸ÔŽÛ·Üíîýáû…  'Ú&&170t‚×ÇʵÉYÌeÉuÐ ó´ @U!A4<]+í²þpä±ÓkÛXÛ´åùâ‹|ÙJÖ»,<+ ¾i÷×QÉõÉ…Æ­ÂÌÙCö± >,*Ã7ó7š)à% Õõ‚ãKØÖÚéµçj—ü„!¿** ÷Ý5òJÖ¤ÊÐÞÊŸÄ®Ülý{ ýƒ'Ÿ:Ä8ÎJÙ õóÙæÔ…Ù…×:è€íd &Ïãg%Z)X(F`6 ®ïäÕµËM̳ÉáÇ]áÃù… ô˜+5+.—!Æ)øáÏÞÂÛªâ£áöÈÖ ù , *XW®*û¹Ý×Õʆ£Á¤Õ5ñ*þô¦)56$1þ'ä!@ûÿéàãl×õÞ0Ûïñ«6Ź€.ß( "ÒOùûåÖõÎmÅÅÙ‘í´ý_H'(1ª.—(ð 8ðýNì å`ÛÜäÛìxÿ“u+ '›"Ð"¬×ì•ßþÔßÈÓÌ‹ÚËçÌ÷¶ Ð…(°(®(ï!ÿ.õ—ìÝÞ)àžÝ›èa÷ºúÉ‚.|%w!!À»#ø¡é ÝtÓ„ÑN׉ãpñq G#$z"H ˆÿªôÿê åØà–æéð­ôíü tLº b¥Á›ö¥êÊÝ^×^ÛÐàµèÇõmwÕ!²<w óõó÷îÌçìçní­í²ôF˜ 6Í+F ä˜öé‹á#ßáßÒåœíXù=ÿ|·n \ÿ<ø¬îÌíÜîbëèïž÷Æ <Lã¹ÿóé²å5ä8åê5ó‚üžÅ rG5† \'Šö|óÿõ{ï3î'õý¦Ô¹öÊg7 ,„øKîNê™épç éfòÀø ÿ©”·Ú}KÀû¸ù)ùQñÆñ8öxüšélW‡›ª ‰—ö÷ïçÄæíä‡è£ðH ³ œøâa‘ û“ûwéüzþü Amýçhø’ôwúÃkó½ôö u©öŠ ÿ ¥ö°ý5Ç|ø‰ùð÷úø ûIzøAõŒþ:A þNÿø¤ÿ~ûÄ )†þ_ö¡ý+¾Ôýú§ýF bÖüûp Ûêù3ø.ýP ¤”þ+ÿDõYðI¹úê±÷®ñâ„üýæuaÿqôúðøÿªã ï~þÒûKö/„rùÅðDúðSô ³4¨þó:ó)Ï…ö¿ü¶ûõJýþ’ûâúÈè )ý¨ ùüôù5ûÀ ^Ÿþ³ú©ó°BÖ÷:ñ€ùgVÈÿ;ù WŽÊøþHðÐ÷Zú n Óûaþ³.¾š÷¿°ýbúüž4úzôû²üå˜ö÷( ÝÿÖùrù²÷ŒŒÿKúxýÏ÷púÕû¸ÍýÓ÷’ýìüý ­Sü3ùþ ùDøxüks“ý÷Ùþÿïþ. îü—ÿ7áù«öðÄ þYñy•BöðUüip ^ÿEùÖût:Zó<)¤ðóôý‹ £ÇüMû¢ù¯ÿr¦ ¨«ùöýúÍõ…¾û~’hüRúÈø<ý®=øW ûBüWøPçeðúÀþWù3 žüpgøúiÿ®ŸþÍøçûÖ}þêSýôÅúïþôùÿÉûB ÁºÂø»ùÆô—¢úÜþÙœóüý5ù˜ û0«T‘=øtýé„ýþÄû¼ö°iúñüì÷ ¼ˆ_÷×üä!¾ÏùE€ý· ý ø™ÿ^Ëüy$÷I³úæ´ÿ¿û{`oþ“úqò-ø…M Ùýþ‚þ=L’þ¬ÿ¢ü÷Õêõsù ¡`üÏøéú9¢}—ûï÷H‡ý>ÿ$YwùÖýÄø)Ûåþˆþœûbù†CÜÌþêüËýP ‚ýÏþÒø]’ rPù†&ügGþ7þèèeøbþx¿Zú#ù¿ÿq}üoýd%ùžúõq©ûTÿÙú1pþ¼ÿ|üæ#ïÚöIøwÇYûýçûµ×ÿ¬ý¡ý6ú ÿȃ™FýÍúZøMô‚üûG÷Mhÿjùœÿ„ÿ€Iýçÿ~ýõþHž²&û;úâ ³úÍþeØÑÿHüÍe`ÿCþÙÞþžùÀü ~„û'ü§þfîÿýœ /0›þ€ñþ´EH£ÿ—øÖüWüìýE-…>ÿ Ãýÿñÿ†ouÿ-þŸ{ÿ1þ6eÿƒÇýþ`ýhÿ`Sióþ^ÿEüVþ{ä$þ¹þ $Ÿüìý²¢ÿîþçÿá,þQXÿµþþÿ9ÿ>'~þDfÿ'áÿ­ÿqòþ?ÿSÿ/¸þ•ÿ½OKÿÃþãÿׄÿÿôÿáÿ2â£ÿEÿ0CXÿóÿ\ÿÓÿÁ^òÿkÿ¶ÿjD1Óÿ ,>Öþ ÿîÿxémÿÓÿÍêÿqÿ‰ŠÿÎKÿÞÿ„–ÿªÿ¯Û¯¹ÿ¶ÿ?ÿ½ÿšÿK•²ÿïÿ…ÿ+ !µÿX´ÿaÙÿ2Ñÿ¦ÿíÿ“ÿ*u"RKÿKÜÿmÛÿÿáÿ*:Ïÿéÿîÿõÿúÿ ûÿýÿ÷ÿðÿìÿüÿïÿëÿõÿcøÿÝÿ­ÿM‡ÿ.K§ÿK¡ÿ«ÿYùÿÏÿÑÿ84 ÿìÿ úÿ>?öÿÐÿ)öÿîÿÒÿ,-éÿÀÿ@Ùÿëÿîÿ2àÿíÿ&èÿ!çÿ»ÿõÿ$îÿèÿÏÿïÿïÿ#öÿ"ßÿ& üÿâÿÛÿôÿ&ôÿëÿ' àÿ Øÿîÿ!úÿóÿ "ÿÿúÿÖÿéÿåÿüÿ,ïÿíÿýÿüÿüÿæÿõÿîÿ ôÿ ýÿ ïÿîÿøÿíÿúÿïÿúÿæÿéÿþÿåÿÿÿíÿïÿÿÿüÿóÿóÿ èÿùÿíÿüÿ ýÿñÿûÿ àÿîÿ÷ÿ õÿûÿüÿþÿÿÿøÿ ùÿüÿïÿùÿõÿþÿüÿ ýÿþÿôÿ ýÿúÿþÿùÿõÿþÿ ôÿ öÿöÿïÿ÷ÿûÿøÿþÿþÿúÿ÷ÿüÿôÿüÿùÿüÿ ýÿÿÿûÿÿÿ÷ÿýÿûÿüÿûÿ ûÿóÿ þÿúÿÿÿþÿ ýÿ÷ÿýÿMÿÌ­ÝüˆýSþ tÿ:ÿÕþ¼ùfþ¸ ìû9§áû|ýô©úì—6úÿa`ýþsý<òýOà cç™ÜÍXÂü3ÿòþü™£þþílÜø¢ÿÝþ‚üQý‡ãþrÿ·þ·TÄÿºÄýúþ¹öÿÿœxýAýc³þÊÿçÈüQ}ûdýÕ¯m ¾ã½úò Éýq¤jþ‹ÿÉÿ½kû 0ÿtóü×_•mÿ@ýOûÑ<ʇþtÿñþC=.ë¥ü_©ü­¦«þ\ü«ý`1hþ ÿ‰_üÿæ…ÿÿ[ûRþåÿ,Uþ2þZeëùäý‡!ü=ú4l<ºµPê9õ˜ ‹1ûÀÁ+þ1ûìü”Aÿü^ù€œyûñ?EøOýÞ «]ÆÉ÷„ñÿBÇþ‡úµû_ýcüÿE ŠÈ¢ýw@½Ö,þßõÙúùýÀþ¥ª <°ÿ÷a }Wùtó• ú7÷&h÷ûW9Ôþæþúxþgÿtlüÿjþî<XZ·1jûñùÖþ@¡þäü™ÿþ³²þ³ǽù´þJÿsú ýÕ;ý/§ÿ¾û½\ý‚|FØ{®+‰ ‡}{Âû-úBÿ ýYýTE®þ<8«ûý|ÿqüâÿŽþÿËþT,þ©,nëG°v'ÿãÿ’ ýýEŠþÿÇþ¿þJÿ-ÍpzuæÑIeþ‰ºüüýP(îýù`AOÐýý€þcþ`üFýÚÿ¦þÿ9ÿ¶âÿ0RxìDÿUÄr)þ0»éÿ‚ÿ¬«ÿêþVèÿÞÿCÿ þY²þ\ýÚÿ¼þˆþKþ~þ·þÚýGÿ«ýoýÉÿ‚5veˆÜ¶ŸNw|ÿoûý¬þ$ì~é"Ù"Îgü;ø"÷öõ¥õkøõûóþ¡Jªñu,0IÙüçúØüoúÇø§û\„› ¦ 6 %̰ú öÍó„ñðdòïõFúdþ¤’b o ½ ù ”|rQþGú ÷ úAöYõâúÏþão) T). ›`¶ùÏóßï>îÅëYí€ó±ø²ý16 ¯”qRú ©ÖþÉ÷ñòö¿ò«ïOöªüw KµäÝb Ú8ûîðéêÆèÍã)ä¦ëòùø¹ò Fé?£=p6üôõåõçðÅîòØöCý ô ü Öa '¯û4õðˆìðé“ëÛïŽóYùþì Î;ÌA å Ãý#ý¿õï)ñQôU÷gû9ý J  € R”ÿ-ûË÷ó-ð€ïÔñQô õLúsÿ«¡Œ ØT± s µýHºý@÷›öü÷4ù*üñÁÝCådóüTùèõÇòWòíðÞò=öùhügoñ# Š N þeÙØùþý*úOúîû§ý`­ l »ˆ¡ü!ø õdóïñ"ò|ó|õýøKü¤ÿíxƒ( ÕW B8»òüü¬ýÿþ“ø×w~¹#Z—üÿøßöÜôuô·ôáô÷öù3üIþ<sâ--Ì‹ê@ˆlFÿ‘ýúþ5ý5r¦ƒŠÿGý¡ùS÷tööö¡öø²úËü@þxzÚ›'gyÚ”ýþ1þóþð-;û5 ²þ‘üÞùŒ÷ŽöWöÄöª÷ðø@ûQýOÿGÇ+=ž-úgp{£þÍý‘þOÃïcú«–yÔþ4üëù¡÷Ôö(÷÷û÷1ú¯ûñý#½k¡òa!¬ê˜[gÎÿöý^ýÃýÅÿ<±¥Á®Åƒšþjüú øz÷d÷–÷âø³úeüÇþU®LÔú™›³Lÿ¾ýQýÆý~ÿÓei4iwÊþgüHúªøØ÷ó÷yørùOûôüÆþ·õVˆ¼J e«1t’‚ûþŽýGýzý%ÿŒß£}`^CØþñüû™ù[ùîø|ùtú»û@ýóþM¾ØåS›†[UwÝ PÿÐýaý ý*ÿá‘Ýi¸]Îÿ‹ýÕûþúeúúoú=ûíûýþÐÿ6Ùï…Åÿó@è2-ßÿ¹þþHþuÿ"Fx”Í/ÊþÊýoüûXûñúQûÄûQüUý—þfÿœ‰%ç9„t*×µ’WAÿ“þÙþñÿãî¶bîþæýýnüÞûíûÕû7üÀüqýEþKÿùÿÛŸ5«ÑÀñóïÈàÿ^ÿ‡ÿB³ÓT®êþ[þhýÚü\ü5üQüŽüýÁýIþ&ÿÖÿ“¹ÿ[dbnúØ¢!ˆ(3pR<íÿÊÿ|ÿ@ÿ÷þÍþˆþþiþ£þ¥þïþ!ÿdÿY‹ˆÆ“®ŠŒ—cq:R&ûÿüÿèÿØÿøÿôÿÌÿüÿ ûÿÑÿîÿíÿ ùÿòÿöÿ õÿûÿÚÿ üÿ ôÿñÿêÿþÿòÿîÿäÿøÿ ñÿþÿ ãÿ õÿëÿþÿôÿûÿõÿÿÿ þÿÐÿéÿäÿûÿúÿòÿðÿ óÿýÿ4(ýÿÖÿãÿøÿîÿ!ÙÿøÿßÿòÿÑÿ÷ÿÕÿ òÿÔÿ êÿ$æÿùÿóÿýÿóÿòÿòÿïÿæÿøÿõÿíÿïÿîÿ" üÿêÿðÿùÿ ïÿîÿïÿçÿ éÿúÿûÿùÿ úÿÜÿÿÿùÿñÿýÿòÿøÿ÷ÿïÿ÷ÿðÿôÿ åÿóÿüÿûÿ ñÿ÷ÿüÿ ÷ÿöÿ ðÿòÿõÿüÿ÷ÿôÿÿÿûÿüÿþÿíÿ÷ÿùÿ ôÿ îÿþÿÿÿøÿ÷ÿ÷ÿ ýÿøÿõÿôÿýÿûÿûÿüÿýÿ ùÿ÷ÿüÿøÿüÿüÿþÿúÿ ûÿóÿÿÿòÿýÿ õÿ úÿöÿ ý/AûTÿÃþ⊎ý-ÿþ‘üÛüN æ! qÿûù]2ÿdü"zù Ð8þÝþ&’ÿëÿvý GùšÿÓÊŠÿü€ü³Îÿr¬ü©›Õ µã^ 8ßÿŒù|Øú´¶ûïü(ÿ0Hþ¶ü½ýÀÓÿ´ü¡—7ùúÞÿ#Ýþòü‡ ý&B3hû<ìáÿú¹äx å‰ü\øòøÓýFïû^Ðü†ÅýœìÿúþBVû—Rúòz©Öþúnþ„ÿÁøÿÇþ ÿpfý‰¯ýCJn´üÿÿÿúvB†ý…¿¸ý¥³[ýëúôÿ+ÿ|Büðþvþ®ÿœü»*ýTúµþŒcUÿøû‚Òã0&áú©üý•‹÷Ùf¥öγ7ø{ÿDNBöùQÌüÃûÀrö*ŒûÃûS¯ðœù†û{þ!˯ûÉ&:ûe8ü ijþ©óÈýüÿB½ùŒý›þ‰Ñ€mþpý4ýq­ ÿcÿ#ÆúZp9ü»ûWüGÎDø:´ýø]ýÇB ¾ú™ø9hTýÀ›úþ9ú9ÁücÿE®ãÿÞûæÿ:ûêúdÿEñýþþþ-ˆÒñÿÿó•ÿlùùúæÝýûüŽÿ×ÿ®Jý÷GHý” Ùø1 Pûfý[ÿèÿ5ðÇýèýuÃû hÿÇwýKáéÃÿþRÿ¯Rÿ'ú1kÿãüO ÿ+×ý‹þ’+¡Hù8ûÎÎÖAý×}sþ‚éþŽÁÿÜwÿ"u&ÿZý±ÿÁæÿ#|iüQÉüþÕZý+εû)þ!føþîþ¡ýMû”ÿ0ÿ ÿDAÿªÜÿà‰ý¹Æpÿ’ýºüÿr=Óÿõþ¾#ÿÍû4)þnÿaÊýÞÿeÀýcþòýŒéþqÿ”þéÚþ¯þ}üJêþþÐRþü´ÿµÀ¿ýþýP†ý#ýi–¿Çýwþoïÿ‹üåþÆÿzB‚¶­ÿýÿ'ý6ýœúÿýŽÿ¦2H›TþÃýÝþ0–»ÿkÿ#Yfÿ!þ"þ”þºÿÿÿÿŒþEtÿÂý‘'ö÷›ûÖE ÷ ¡ Ú‚þxýù³ö„û˜ýÅüˆýsþ.þ¹þíþþÇÿX»‘¨–S‚¼þ+1þƒv­÷Ðú«ô ´Ö +«ÿùø ôLó÷húMü¢þXÿÆýÓýSþöþ€;Ÿ¢mï±È‘œþ‘Šõ•ø¶p}Q ‰þ¦óøë¬ëIò)ö¯ý´qUj¤AÿWþŽ/7Ëîëþœ\óÿNûç\ôËöXMº~N R9ñÍâôá¥éÂóIüª( è [ñÿ?ýÙünÿ{rDm=’øÄú¹!wómõþ”è~èA7ëöÖ¿ÔÔß‘ì¾û? Ë›øøèþ<ûÒ÷ô üþµ¸­ ¶Ð÷&mýôêüðôxÉ#‹ Çiè|ÏEÈÆÕwã;ô˜ ž$à0ÁŒùìšèðÅö¼¦Mb9±ø'móƒÝ¼ä¿#Ù*,o(€¾ë Ã8»tÁ‡ÍÁçÖ±*¾;z5,'ØWü!à½ÖuÛäÐôSÂ#‘v m×ç̇Úù 7+è-”3„î‹ÍÃÛÄZËá1o*”323F-P—ú‘ßtÒ(Õá6õ" Å"(*f,×¹eþŒâÅÅÇÔm÷´./h0ê6‚zðS˹»ÖÀRÇÈÜ|.-Ø<9˜+á_ûÐÕæÎi׳ßÐò» <$1) —F髿¼ÙkÊXã`7];h5³.ÖHÚŸ·¨³„»ŸÍôÒ FA·B=:û'\à,ÉÉÉ7×aå&%ë/É/B"Ôló¾Ô ÝóØ‹Ë3íï&HEB¥5 (£ÈÈ€«ã¬\¿ÁØæ1¨J×IZ6R“ôgÏŽ¿)Ã0Õ öyû3R;û:ÜÀ8ßîÉÀÕ¤ÐpÏ'ç7ÒOŸDA2œ%’ï ¹©«Ô¿Ïß)r?KäKM8Ø ýæîÆY»[Ä^Ø:î v6†>ö5ÈeØÞÈ=Ô Õ¸Øbb7‰I/^9ð5°%¦õiλz¶'Å'Ú­'[:à>Ó1žðûØÛDËÉÉØìïS z'¶61ž òÀÚtÝ;Ô.ÏM÷õð/”0Û7a1ìŽÜ+ÐÚ½¾Í9ó¹Å'36M8>&É Cì Þ0ÑËjãÿG6"J2˜*ê ­ØòZïÍÓ-È~ì  69Q7ɵó â=Í”À»Ãµãÿ»*'B7û+3Úñï ß>Ð Óôèí÷ö ×!«+H.[ª; zá:Ôè%í“òÊ<(Y,cÇÎïæôÖ‰ÐÐåÜït¾ B%$ÕÐï7å Ú¶ÝAß­úç“©Œ*Ä2‹”òÝ súëïíd[õî2í ÛTãOçQÜ%êý… û »;v¯ š åýqïÊë×êkðšì@ÿ V#ò LúÞ•Üþ–ñ…€öü˜ówÕnÌ;ÚGϯÙÎùÿéõ#å'C!*!é’›ø7íéë»ädéSê¦w÷’ æ$Ã~% 6øh iÚþïÅÚùÖCÙúÕlÝÙò~üÀ‡ À~$„"+ ƒÝø£óQååñ ã ÷Ûî¥ÿCƒÓ"'¿ ž !%¼ ê ¹üÁì÷â}Ù;ØÕÞ.ë¾ûÓ"¥ 'Ë!ÊA;ùsëjç›ä·èõá^÷àÆù£‰Câq%$ªLOáõ’Þ%Ù’ÔÊMÓëßgê-ý~ 7&&ò&ñÞmEÑö;ñ6æ(èÁäë?ö‘ôžû+ZX!–e§¼ \ü!ï]ågÞ’ÙùÚã²ê¸õ̧©zœ~ŸýmöÔï+ð‡ë½ðåöWøÞûß% ê FJ\J ðüuõ˜îÝê6éééºîõÙûþë ¿Ðߟ <ß\û®÷EóÝôdó÷ü«ýrÿ@A X  s -/áüÄø˜ôÉð+ò$ó¸ô>úÌþ©ûj ö e . <˜Ñÿèû|ûKø úqùû2ÿðÿlÿ„@`‹ŽIÿÁûøö¡ö8ö©øúŽý|øŠ*Ïôè³ÿþý£ýùü$þÃÿãÿLÿ Î:Žø†þÂû¦ùØøùRù ûýüïþ¨ZñxBÆpf"Xÿ…ÿ.ÿÿäÿ'ðÿz”i»–ˆâ4ÿÉþ@þþçý%þyþÿxÿ÷ÿbIAon€ssDB["2#íÿõÿÿÿòÿåÿÅÿüÿöÿçÿæÿ ÷ÿéÿñÿ Ûÿÿÿ òÿ öÿ ÝÿûÿÔÿ ÿÿ äÿåÿðÿ îÿóÿ÷ÿüÿôÿáÿñÿýÿ øÿïÿ×ÿëÿ#ýÿêÿýÿÐÿäÿ ñÿñÿñÿ÷ÿôÿúÿ ðÿ#èÿÓÿüÿæÿêÿæÿ&ùÿâÿ ÛÿæÿðÿýÿøÿøÿØÿàÿåÿùÿþÿ"æÿ òÿçÿÜÿÿÿãÿØÿÞÿâÿ!ýÿ#Èÿ ëÿôÿìÿùÿäÿ1ñÿïÿöÿóÿ$éÿÝÿ÷ÿóÿ5*ÞÿÓÿõÿéÿ%Ïÿ$øÿåÿáÿ-7¿ÿÿÿÕÿ& ùÿÎÿçÿçÿûÿ +èÿöÿ£ÿâÿúÿJæÿêÿçÿ,æÿV.ºÿýÿ³ÿäÿëÿGëÿûÿàÿÄÿ)åÿX7Èÿ( °ÿØÿãÿ>þÿÏÿWÆÿÿÿ ×ÿXûÿ¨ÿ°ÿ8ÀÿµÿsÆÿÙÿùÿ0UéÿÅÿ$õÿ÷ÿúÿ—ÿ«ÿ9XÀÿýÿìÿ%éÿÛÿW$Ôÿ©ÿ%óÿÂÿKÿâÿŠ §ÿðÿJúÿBÆÿ2ûÿaÿÌÿÊÿ} ïÿÓÿzæÿ)ÿêÿ#_ÒÿM¼ÿ²ÿrÁÿ<¨ÿÊÿ»ÿ3.ìÿgÿL‡ÿæÿ_büÿÙÿ‹ÿ†ÿáÿ?×ÿÚÿ›¤ÿ˜¥ÿ´ÿWt×ÿ–ÿ ÿíÿ¢©ÿeq9»ÿ¡ÿÄÿåÿýÿÛÿÚÿóÿÒÿÞÿÜÿÃÿÚÿÌ·ŽMÌÿUÿIgÿ³ ÿ2øÿ±ÿwfˆtxÿNÿýÿÂÿ]}ÿ®ÿSÿµÿSF‡\ÿÚÿÙÿFÿ…7y¶Üÿ¼ÿrÿ)ÿd{ÿýÿÅÿ‰kñÿ”Áÿ¦ÿåÿ<L•ØÿZ@+wÿj«ÿÉÿ-©ÿÿKÿlÿlÿìÿz©ÿêÿJ8øÿD$b»Éÿ¡Íÿy&ˆÈÿÚÿÐÿ”ÿQÿ«ÿ Öÿ±aÿnÃÿ¹ÿ´ÿÁÿõÿ5Äÿ <×ÿ{(j¢ÿÅÿÑÿ·ÿRsýÿ`ƒÿ0ÏÿÅÿZ‰ÿv‡ÿ6çÿ¾ÿh¾ÿ*ôÿaHÝÿ9Ûÿ³ÿÄÿ­ÿçÿdYýÿXÿŸÿÝÿúÿÞÿhüÿb6¸ÿáÿŽÿ C«ÿÐÿ-äÿåÿjæÿ0*¢ÿ÷ÿ7/‚ÿ¨ÿäÿôÿ "Ñÿåÿ,¶ÿ9Ýÿüÿ`Ûÿ °ÿâÿIWÞÿÿ6"·ÿŒÿ@Óÿ22úÿÉÿèÿ5¤ÿ&¦ÿ&:òÿÇÿ7åÿ^Äÿ5Ÿÿ òÿíÿêÿeÃÿäÿ[«ÿíÿéÿ·ÿj ÿLF×ÿÈÿÂÿ[üÿ+Sÿéÿ„ÿ#ùÿ’UÉÿóÿƒÿšÿuÚÿÒÿ rBkÿòÿD&Kÿ)ÜÿZÿ®ÿÿÿ QÖÿœÿĺÿ–.¯ÿ„ÿlÿU]žÿ­ÿ<ñÿ ÿ¶ÿ·ÿ«ÿòÂÑÿÊþOÿ‘Šn\ÿÀÿÉÿeûÿÌÿ'kÿ}hQÿ§ÿ ÿ‚dQ†ÿfÿ6*àÿ%Iqÿnÿ”ÿÖíÿ¼ÿ„ÿéÿÿúÿJW¥ÿ/ÿ½ƒÿ¨ÿ×þh¡œ¨þŸÿ‰0¼þëÿ¨ÿ$šÿjÿóHÿ×Hÿ3!dÿéF óþ_þìÐÿVÿ3ç‚>?ÿšÿK6ÿ,}ÿj´ÿ™ÿÎÿÑRÿÀÿªZúþÑÿŒÿÿ#´þ0ÿñÿ§° ÿYÿúÿHþW‹ þHÿÿÓuŒÿ%ÿÇþIÿå  ÿ^ÿeÿPÆ;x¼ÿAþ>þ0’ÝoÿSÿÿýÿºàÿ¸ÿÐþ¨þ šÿêþÁÿe^)™þTÿP¸ÿ ]¢‡ÿ`ÿ¿ÿ5ÿóKn$ÿ\ÿ5 l ÿ•SÿJûÿ•ÿžÙâþ­þç(¢ÿ:ÿÞY—ÿ·ÿ^Þÿz3Ÿþ±ÿ¹ÿ ½ÿÎÿÔÿ–†ÿI<`ÿóþaÿëÿCÍÿ]&rÿ<ÿŽDÿèÿ‰ÿ®”ÿ0[ÿlÿ|ÀI6ÿ‹±ÿ·ÿNtÿ ÿrÿÇÿdöæþÂÿñ'&ÿµþ§ÿYÿ•e‚Mòþ‡þeÿ­ÿ²Lsÿ]·ÿ³±ÿÁÿ>£(hÇÿE¸þfþñþâÿÒÚûþDÿÿë? v%–ÜÿVþ=ýŠýiý#)ñšDýUþ•ÿpþÃþhýÖþáûÉþrÿ”;èGÿ?ýŒý’ÿ;ÕÏ€ÿÿÿ_‰DËÿ›réþýåü)ÿ½wtbœÿaúE÷÷Êö`÷ûÿýRàádýqúðû2ýçýmW “ ‹Ò‡Ã$íþ¹ù\õ‘õDûÒÿanö ?úý®4ü ÷øÛøxý페’dû%öòÐò´ôÞ÷ ø¶÷*ù`ƒb ¢ * æŸþûŸøÖö/ü!l\òˆ yaúVõCõ¾øü°ýAÿ3«þÞøñRíaíOîjïaôrøTÿÛ† *‹ ÅÉfý‘÷7õqôXõ]ù©ë Ë „ “Ë ˜ÁÚJÐ2ˆÿ{ÿNÿ{ÿ~ÿfý,û~ù€ù³úûšûäý{ÿsÿVþðüMýMý˜ýåþ½S¼Á«T²ÉÿÿÔÿlÿ1ÿLþ£ýãüµþ‡ÕÛJ´×8Úÿùþ:þ“þÿÖÿÐÿrÿyÿÿ»ÿ‚ÿwÿ§ÿžÿÑÿ$Ctqkÿvÿþþ2þAþÒþbÿÂÿˆÿzÿ…ÿÆÿvÿNÿÿf.ÊX<h2ÂòÖdgrZe6)4Èÿÿvÿsÿ{ÿcÿuÿÕÿÂÿ›ÿžÿ…ÿ¹ÿ×ÿZ[):?7,C@÷ÿ"ñÿ¿ÿßÿ¥ÿ•ÿšÿ¢ÿ¼ÿ·ÿÈÿòÿãÿ:CC*:ùÿùÿïÿçÿ òÿþÿîÿìÿÙÿìÿ  åÿáÿæÿïÿòÿ÷ÿÛÿ îÿ ûÿòÿèÿÿÿ øÿ úÿÿÿ äÿñÿ ûÿ ôÿäÿðÿóÿ÷ÿ üÿþÿÿÿöÿúÿúÿúÿ÷ÿ ÷ÿ þÿðÿóÿþÿøÿ ìÿ üÿóÿùÿòÿýÿùÿÿÿ þÿðÿöÿúÿõÿýÿ òÿøÿýÿ õÿÿÿõÿ ÿÿõÿ øÿ ùÿ üÿûÿôÿøÿþÿÿÿôÿ ÿÿùÿýÿüÿýÿþÿýÿ ùÿøÿ ýÿüÿüÿúÿûÿ øÿ ýÿüÿûÿÿÿøÿÿÿùÿøÿýÿøÿüÿ ùÿùÿþÿÿÿþÿùÿøÿþÿñÿòÿýÿ ýÿûÿ øÿüÿùÿþÿ ûÿýÿùÿÿÿ÷ÿüÿ ÷ÿúÿ öÿüÿõÿÿÿþÿþÿøÿûÿýÿúÿôÿýÿ þÿóÿòÿýÿýÿ øÿøÿüÿýÿôÿ÷ÿ‹û· _ï±ÿ@¬œàý¶ý`þiýÄH"íùåŸSùÅüOÿ,úþÁhú9üäëå(ý@üKÿ)Bü#ÿÅ}ƒ’ÿ1ÞüNü˜‡àþºü ý=AÇþúýšF Vü' ëõîiÿ ¢ºÿÄû²ÿTKû±ý!XKüíiÌâû¦ü ?ûeúœÿ +îûSüV ³.ö’õ  CýOô›üs †‚ô”õtÿê¹ÐýÔ÷EþtBÿ/üþÿþkþ<5¢ýõû3ÿ(ûÈÿÑj¸ü ùWùÁýMY„ýÿÿÿ¡Ù­ÑEþ¬úø’÷ûùmýï N )1ÿØùÚúMä  ÌOÿ¬øϼù1ð]ó7þ ž.ô°ìôðôûiÄ q à|øb÷Ôý»5 ¸ ð8û(ó…ð–òeüîs2ú‰õ.úžq Ž d EJùµó—òâöÁûÂü ùù¦û`nš ¶Ìéý1ýŽÍ#‰þQú„ùÿüj¬irt™úOö öÓü5ô É ÃÍøñ^òBüv Aúúù0üýymÒû#õ¤ö\ýêûUþ4üÈü„ýÂþgÿ`¡Ëøç úüÝýPd‰ý¢øùûs©¯ Ù ˜ ^œóPñ…ùª Z¥yýÅù)ûšË ½)ÿ–Mü£øÙøÿDÙ!þË÷ðò{ôõüÂ4 Ú—ÿKù¬ùNþ¡— —ÿíùØöQû>71b@þŠM;|Šÿüµû/?][øÙ÷´ûhþV_Cþ“ûYüØ‘:7ÑA ý´ü>ƒEÿtùé÷Oü^Üþfþéü¸ücüûhü(ýHN¶ýû‘ýAýƒ/ÿoûWùlúmÿw é¡þ°û1úfýð€Û²Òþý¿ÿ¾ü=Qþ×ýSÿ…Ýþ(üùûtÿ¹²1ûû5ûüµÿfTiþþ%*³Ú‹þ þ2þ¿þÓþ®9€uXÿVÿªÿþRþíý$ýÖý-q%×%þtý§þ¬¹,CŠýwüÚüLü ÿ²)æ›é›Ú2þZù§ùPý‰}mÿXþ>þmÞÿÆÒ)Jÿ†þ›ýkÿ…À‹avþÁüÊýïþÿªÿ{3‡¡þšüü‰þ¶Ø|N±àñ&ëÿ‚þåý¨ýaÿ»båÿ²þ+þRÿ…¸Mÿîý©ý]þ…ÿÏÖþn™ýÿñýÃý;ÿËÀéþvý-ýèü‘þ~šÆâ·)IÄÿß½0† ÿ°þxþ½ýÏþ¾þ9þþ~ý•þÔa´ÿëÿJŸ5Òjÿãýý«ý†þOÿ<¢öá(Öþ\þ›ÿâÕOÞ[þ(ü$ûzüyÿjr{¦ÿÿÄþdþ,ÿ Ѷ£j,sþ#þÿ¨ÿ0ÿ¼ÿ§ÿ¥ÿÿ:ÿïÿ@²8ÃŽÿÿ!þhý¸ý}ÿqIYÝtEþuüünýÜþe¦,xþºý¥ýUþ´ÿøˆ  „}×ÿãÿÍÿD¼gŒéÿÖþªý›ýgþÁþhÿF8?BËþNýjþàþM\pþ÷&þ˜ýÔüýÜü¶ý©þiÿžÿ`²Ü£ àþþSþæþíð5fþ¸ýEþ–þ=ÿüÿÛÿçþ¬þtþ‹ÿGãfE¢}ÿIþþÞý°þÿ Ä«%ˆÿÿÈ©a³& ã™÷ül÷‡óòàòöýùòý b˜üÍØw—%øõý³ù¬÷s÷£÷ùÝúâý‹ø¹ ={,اfù™òÆíLìQíÍðnõ)úÿ†jŠ ‚U“= $šøoôÃñ`ð|ðtò„öbýŠê.™#RNþø¨íkå\â‡ã°ç+îCôUûÌÿun ³Î³9bA L»ôÛìRè©ãVâ5åÓé}ø ø y3ô;!6%} íÜÔžÄW¾VÄ ÎïÝ‘ëú¶Öµz(Š0Ë3Å/@&ï} ð†âíÚ ×‘ØiÝè=÷ J 2 :=8 *>5úqâ¤ÐÉÆ¥Å“ÊxÕ=á‹ï¼ýY ù'81374N,µ÷ ›ó,ãUØÒ?ÐpÕOß7ðÀƒ\1.;?;v.˜b ì„ÙDÎ$ʣ˨Ò*Ûºç¯õê£Å&ü1µ8:810°o÷Íå‰Ù†ÐFÌ^ÏØ<é\Hs0î=>³2鳩ïbÜÐŽÊÌ"ÑÜØåsò†ìû"/Ì7´8º0$‚ýäèEÛԿиÑÙØ›äSöŠê$ç7gA=>Ò/Yþ¦ä©ÐÅ_ÁÉÅ]φݸì£þ.‡´+¦4‚8¿5",„uÿô-áËÔ‹ÏRÏÑÒtÝ!ë2ÿQ„,!=éC >ø,V÷Þ]Êl¿É½ÇÄÿÏfà=ñR©û#ƒ0µ7y:N4P)Ò’ÒïÅÜLÑWÍxÎÅÓ€ßïàj„/û=ŸCS<ø*C|÷4ÝBËÊ¿¾JÄcÐùß¿òb‡t&„1^8Z903ð%ZU5íìÛ1Ð)ÍÏÎ>Õ#àVñLò»/òÅIÂrÇuÑ_ß[ð{‰d%­1Ö879Æ2ð$ó¯þœëÒÚ ÑYÎàÏuÖáð‡Ûþ-Ú;¾@9ç(ôøùálчǺÅÊÓÄßôî»ÿ´Ü!/Ê6N8¹1<%¦í=ßÔDÐJÓ–ÙLâŒîýPE#/3/<<<91ˆ)”ì ×÷Ê%ÅiÇçÎûÚé*ù* e (à16“3õ* ° Y÷¼åùÙœÒ}Ñ×íß]éâõ¢º%#4·:}8&,ƒPÿ¶ç¾Ô6É$ÆÕÉÓ½ßþícý„ ‚Å(f1€4O1^'ðò¸á\×ôÑ!Ó¿ÚÖäãïüûØ aq'`3Ó7&4U&0yøJácÏ£ÆƖͶÙnè®÷š K 4*^0´1?,8 îú–ç«Ø*Ñ}Ѐ×ÊãæñÄþ Ž *Î0þ0â(Ÿãé§ÓâÅI­È&×hé2ük ¤¹"¥(§+m+&¡^ úöæî×ΣÎ/Ö¢ä.÷"?%Ð'*'"0~íŠ×Ç(ÀÅJÔPê€ÎÇ#H*++—'ó"FóZ[ödæ¢×—Î"ÍïÕAå×ú.H"%*~*8&PwL®aóûßÅÍŸÂpÂwÎ/ä“ÿ;[*Ö1 0Ç&*õô•ÿŒötëhßÊÔòÏSÓŸâ¤÷Ð"&¿3¿2¹( S”Jüð’Þ…ÌõÂæÅbÖyð­&¥3t3N)aG 76þ>üPøoðôãuØôÓnÙ>êö5-3„*-è !¸¡½ .Aùêâ(Í Á-Å©ÙÊö…N(Y.‡&W1 M©#ë çyú<é9ÚÌÔÛ¾íÐq|%%%£x$ý0þ>¤L9ÊåÆÍãÁ}È>Þ.úB9Ù`wí‘~¥¯%þIçÖ„ÑLÜ,ðŠêe&: [ÿnùêÿ´’ç# ¬ œð(ÙjÌôÍÜÛãðæh i Q)’k d=Ô%Ñßêë ØÒ{ÚÃìÍÿ<y …îˆÔÇq!¦(P'ß÷ë&ÙÂÏGЯØKå¡ð÷nû/i4óp%ƒ'K!«äÔíàCÜá?êõbûÞõôk 4én~œ9¶ø1àÿÊ¿§½Ⱥڭðû99Fç µ#ç"´ Rÿ…ï~ãìÝáXêiôËÿñ M .è æßñq'h&Œÿ¤áSËÆÁÓÅGÔ†è\údñ*  Ejh"+%ùkÙû|êúÞŠÝÝåôŸþøõ¶ ² { n' å%5" 4ùÁÜæÇŒÀÆ ×†êû%| ÚÔ2§§²‘ÿðsä|à&å4ñÍýÖ= ¦ g ô &þþüS #ÿ"¯#Ä —á<ÈF¿½ÅûØ…ðqÖ NWŠ y»IaÅ òæ^â“çºôUû Ù½ éוlÏù†÷¸ÓÞ#/'ÂßÀæËŽÀ¢Ç­Ú«ñiK¡ 0ÖMC €ÿPðgçþçíïÓûLð§´ :ý0ÿ_o–öòó=F?&)iû“æÌHÃÀ̾ãÂú¾ /N J' c=QÒœ÷¤ì,élî6úê &J ±BÿÁý–; õ(ðDüã' +Nr£çuωǽҹè¢ý» ¹ í 7 Ö Pkuý lýÕðþéÄëÈóÞþ  a°w]Ÿü‰ñ/î+üÒ»(+m>çeÒïÌ»×tëÚüÍᛦ G –”` ø¡ìê0ð·úW ’ P x?<“0ìÿüîôùìðï/á.¾+Àû`ãpÔôÒ‚Ý1íù"ÿ–НLÜ þñkêºìÿô'þôÅÌ w‘lmgþãùGøEôï&óÌN-¸)»ñýæiÖ Ó]Ü¿êƒõèúúÿ EÀnù\ÉúEïŽé¥ìXõ}þú£Ž £ nê €{ù¢õõaófñ«ö]×·,«()@üÊæ_ÚŒ×SÝcçÖñÖùƒÔ xv…w¨Â÷Íîjì¼ïj÷ƒþ7Ù ¹ Rd :~ý\öôÓöpöëóú÷ Ýn+¬%߆ùcåìÙÄØeàIì[öšü¤¯ ´`æ ÀÐôØìÑëBòÒû#Ü× –  æÊÿ]û‡÷ÉóiõbûäþÅûýy ~ Z+¤ €ðÉá˜ÚYÚãDñ™ü":%>õ¤é÷¡ñðî/ðf÷PHãc$ ˆ Õ;úöö@ö ö|ùWÿ•bý»ýû &!+*Нˆê.ßèÜbà”éöÿ¶­Á³þ VþªógðxñõøûgK@ k é U –àýoø™õ¸ö²øû¹ f6û†û C!U%æüŽê’âOáåëí{÷×ýÁ‚'§}`;ûöLõ öùø#ýõ™GE Þ0ƒý…ù ùûŒûúúÖþΤ’úðüµ O&"Í•ÿŸï æâõä¡ì|ô˜ùIþç—QÅíËýýø¢öÒ÷&ûMþFóÙgˆJûÿ‚ÿýŽù±ûçÿ«ýûöû ˆ;[÷TîUç¬å«êñ4õÃùd‘ b!à 0þQû}úÔú–ûæü³ÿ:v'moΦ¯ÿ£üªýSÿûWõÅù )1ß{ù'ñAëlèøê7ðõÝù¬ÿô € í GHÿ°ûØùû†ýÑþ¯Ù®8†ÙÒÿFù ü4õÆøYÑ÷YUÿû#ô‰í&êZìðôÁ÷þ½œ_ * •ybþ6ýýçüÃýcÿ¾ôY:f£µ_Ûýý÷ ûÍ,IX ¿Íþ´ö`ïÿìñïCóÊôqöû.&žú s»ÿÆøÿ†þrþlÿáÿ<ÿšÿaDÈËÿ)„áýìøÏý7 ‹8 Wþ_¼ùÉôMôÖõäõ2õ¥÷ü™ÿ½ž«á'A.2¸òÿ'ÿˆ4¤ÿÇÿvÿU:ýGú¶k  ‡Ý üù•øÍ÷÷÷ëøŠûFýšþIBÔ¥¤¨’M`¡&¯²%EKÿH¯ýáû†ú jÎë«eý¬ûÎû“ú\ùåùäúfû@ü¿ýÿœÿÙÿ«W©í=„û4¨úM%<ÜÎþtÓü*ü°Ð ¯ž…˜Vþ3ýNü=ûkúEúÀúNûÂûÍüaýOþ¾þ‰ÿ2lúì–Iþ/ñÿFY[qCþñ7þÿ$JýNÈûßdýÖ}uü›ÿ'ÿ!ÿ˜ÿ¹ÿ–ûøg<þ¬Ùùú³fûû«ýWÿ$´û}ˆÿaCÿÄÿ0p äÿs5ü°ÿVÿUþÓÿûwÒûÍ·ÿÿ‰ý=ÿÿÝýÈ=Ùþ³ù«Aÿzý5é.þsþ<ÿÔ­üîûôŒÕù8Fü‘þÅßý'~ü “ÿ6þ*zý±þ½nþrlRú»æÿXý†ÿGoÿ2€ÿÚþhý0âý¬þ&›ú{¬`ÿí|æüH~¯új›×üýŽyþnü1:ýF×þÔÿRúi6«ý\êRüò$ÿMEÿÿwÿ%üÔ5%ý4þ Î‹þ0%þOÒýü±cþºþäÿ!2ûvMløféû¹¨—ý£û`þÿµú÷tüÙþ¬ÿÊ_ûÊ^þ.+¿ü|’ù8ü|lNIü«ÿ¼ÿíúäøüLýùÿ¦ñ ü›ý Ëü¡êýù>^ü·ý9p˜ýëÿãÿÄÇýŽ!ýëªýû‘Ôû«þ¤®øÐwÿâùÛ…üm/üÈÿY¼ú 5úüoqø+CwûP1ƒBüÐ^úôÿûÄùy.ýðúHðíÿôþöÔ3û"ýüDxÿyû37þ´úÿ}ãÿýbþ)ýÎ÷ULôûYþô û¬GXû!µû±ÿ%þ(þgž%ùÕþ’þù¾¥úÉØù_ úL\ýÁõ{ýüý×ûûÍ WüpüXüdý~@@þ' žýënüüƒ.ú€û:›‰A‹þ”ö¨ þŸ“@÷¥öÜPüïîÕ÷ªûq#€ü†LÿSÁø+û$ìýiý‘ோÿßü!øûWÓ2ù†²÷ì°ýcqöqþgýò*—ø{úô. —üDå]øüAœúÅ¥®¾ñ· ¬ú¨àÿ«ú\ùaÿƒ‹´û!«þ±‹ÿTçþƒÿ4òþÉýìÿRÿ­ñý||ü‘2ýÇ?ÿý>òºû|@ÿ# EÞøBö ú #þÿ‘ùÆýÖ ¿ù`C<ùšý“ùxùþvþbï_üÛµèm¨ù\êOGü?ò6mùyÿ Ò\ ÍþÚú†ülò’ûÏûì3ù£ú–ô0R7l¯ø<öt„ÿ7ûQò½þ~ÿŒ >ÖÿCöcÿ½üýŽ Øåˆùø¸çÔ‰þÝ _Qúöô°÷§7þÖ I÷Aÿñý0ý ¼öcû.üÁ fV]õ¤úõŽþ† øõ-û3•ÿöþŽû;Ãÿìúû~ýÓ†²ú$ù?ø´¨ø·ÿ† ¤b•­ó@–&û&…÷¨nø¥ù ôçþØýJ_‹ €ö‹XÂûËÿ õ^en"úUü#¼þäúbì ¢üS„È÷Hü«÷gµ1¤·÷êùˆõ ûµ 0ú³üxü½`‡ÿh•ô” øÆ^¾ãýHûFú …ÿÿdÿ1ÿ¾’ùaÿdÿGø·>­œøâö ÐûæËúêmBþïøÑ°ÿªøm‹†÷¯üYÿΘW#xø˜ûwÿ\ëøÔÖÿOümû{p^úšû8ý~ZþcÿµûdpöÔC¢ý‡£õâý.ýûÿ­çú›ÿÁ‘ùþ5üÇÿŸø<ÿKÝýîÓû*ù™þx#ûEþùÿ/^ÿ<ÿžÿsù£þ›úäþ¬ûCÌÿø‡ÿ'û´Ÿ’ý±ÿ'ºû^Ñúd:qüÕK ÿÑû–Š÷àþš\üìþªéÿ,iü=üˆÍüDÄüx:þIÿPûtü)Óû–7®ýËÙúÙúáÓú' ûëÎõPú߸9üËfâû½•ûïQÁöÊÿýY?ßüQ°ûû¯5þCÿvzù¿þçÿþßÔû¸—üÄ^ÿYþIÁµþLCý!ÍöÀâüe¨ þ—8ü¨ ûÎ'þÏþ#3ûukÀþvûõ”ù aÃÿjþðýÿÌfý"'áý%ýñ^þˆqEGùüÔ-Aü_úMþÖŠü®ü?iú°Oý…œñø![½ÿdîûð½Èÿa ÿó©þœû¾×ûÝýl ùK>ú4#ÿ‹ý|8 !ÿì9ý¦»ý`t‰ýaünü>”þýÊçù ÿ•iùÙIÿ¿ý.vùø°ÿLý09üˆý¯4þA@þÉEþ×òü-qþ%û–ÉAø°ÐüÈÿ>ÿ¥VLùuùÆøM|ýø¦üÛþf¾ûG?ÿ ýÂü¥¼ÕfþË#üÄË´ý„UûÕ|þ¬Çý‘}ýî¬ýÒþFü.ûÀýÙšý=y2ÿÜû!Øýoý=‹ü ÿd3¸þÿÿåüPGýLcþPÿñ$þý¥´þüÈëÿGúƒ–þvÿ»þW¢þíwý…º2ü5˜ÿæÓþ‰~Füœö¥ú~ÿPªDüìÕü ülzÿŽÿúüIe~þûNüêýíýsþGÿgübRÿ@¹ÿ-ü@<þeâüe¬ýmüÜþh’þ@íû|ýÔ(€ºýçþ·ÿ¶ËþÆf_ëýTþjÿ¦•ú¢ÿκíü`c|ü6›³üDÚ—dÞüÝ/ÿkÃþ'I€ÀýdoþÕÃÝþ]¤ýþéªþ©ÿ–.Eþ4AµhûÙÚý´€–ýùÿ@êÆþÊÿ™ÿíÿfþ^DþbqÃXÿ[ÿáÿ)&¾þêþ`ÿòÜOþÛ®¦þRiýNOþÛÌÿ ÿKÿ×ùý“ÿ2ÁØÿAÿ…ÿ‰×ý¥ÿËÿ"ÿV±ÿ6ÿLÿ–›þÿ xþPL—ýþTÿŸ öþ`S¥þJÿ§2ÈûþOºÿ }™ÿu5þŒëýßÿ)ž¾þËÿÌõÿRÿÅ^kÿ«ÿ0ÿ—©>ÿ2Ãÿ;ÿrðþÃÿ(Éþm¶ÿ×þ ¡ôÿÿŠÿHÿŸ£ÿÕþáÅþ÷ÿä¹þgkÿbÿ&êÿ.ÿv¼ÿ kÿKÛÿË+ÿ‚Œ—þ|$ÿ1¡.ÿ43Ùÿ@°ÿ%¼ÿ-ÿNF@’ÿ@è‘ÿìÿÙÿVùÿÍÿöÿ$Âÿ˜ÿ—yÿçÿnLÑÿÑÿ5Kÿ\úÿbbÿ{¥ÿYøÿØÿW9Ãÿ¦ÿHöÿ*ÿ5ÔkÿìÿÛÿAmÿd­ÿÄÿ2×ÿ_»ÿ˜âÿ¶ÿÐÿ–ÿQÞÿÓÿN'úÿÉÿ(óÿxÿôÿKP“ÿ(èÿÿÿìÿ"ÞÿÎÿóÿúÿÌÿ8!îÿÇÿÍÿ9ïÿÒÿ(-óÿÂÿ–ÿ YåÿÕÿýÿ<½ÿ çÿ/'ßÿïÿöÿèÿ ëÿÃÿ,Ùÿìÿ!ÿÿùÿ- Ïÿ ×ÿüÿÍÿäÿùÿ/ôÿúÿéÿÔÿ.ëÿßÿ ÿÿêÿ öÿûÿüÿýÿúÿÿÿ÷ÿýÿ2üÿòÿåÿýÿóÿùÿàÿ øÿüÿúÿóÿíÿðÿ øÿçÿÛÿ(êÿ ôÿÿÿùÿçÿôÿ ÿÿóÿ÷ÿûÿùÿùÿèÿõÿîÿóÿõÿ ìÿ ÿÿùÿùÿðÿõÿôÿûÿýÿ úÿ ÿÿ ðÿùÿõÿ÷ÿúÿ øÿðÿùÿ ùÿüÿ÷ÿöÿüÿûÿÿÿøÿôÿüÿþÿùÿøÿüÿúÿúÿÿÿûÿþÿ üÿúÿÿÿþÿÿÿúÿùÿûÿþÿýÿ üÿþÿøÿüÿ þÿðÿ õÿÿÿ ûÿÿÿúÿúÿöÿùÿþÿûÿýÿ þÿúÿÿÿþÿþÿüÿøÿ÷ÿýÿøÿÿÿýÿúÿùÿ ÿÿúÿþÿ÷ÿüÿ ùÿüÿ ÿÿþÿþÿýÿ÷ÿýÿýÿ÷ÿúÿ ýÿúÿùÿøÿ ûÿ÷ÿÿÿúÿóÿ ùÿÿÿøÿöÿûÿ ýÿüÿ÷ÿÿÿ ÷ÿüÿúÿüÿüÿÿÿÿÿüÿÿÿöÿ üÿüÿùÿ÷ÿúÿ ýÿúÿ ûÿöÿüÿüÿ øÿÿÿôÿýÿþÿõÿ ÿÿûÿüÿüÿýÿýÿûÿ øÿüÿûÿûÿÿÿÿÿþÿøÿ÷ÿ ûÿöÿøÿûÿ ýÿüÿüÿôÿõÿüÿýÿ üÿûÿúÿýÿýÿûÿòÿûÿþÿ ûÿÿÿ ýÿ øÿøÿùÿ ÿÿüÿúÿÿÿôÿõÿ üÿ öÿõÿøÿ úÿûÿÿÿÿÿÿÿÿÿþÿðÿøÿ øÿýÿûÿùÿüÿÿÿþÿúÿõÿúÿøÿýÿûÿ ýÿöÿïÿÿÿ þÿýÿûÿüÿóÿúÿüÿñÿüÿùÿ÷ÿ ÿÿûÿÿÿúÿ÷ÿþÿûÿÿÿ ÷ÿ÷ÿôÿýÿ ûÿúÿ ýÿüÿ÷ÿöÿûÿúÿúÿþÿóÿúÿûÿÿÿõÿûÿ ÿÿýÿöÿÿÿ ýÿþÿôÿüÿùÿüÿûÿüÿ úÿùÿøÿÿÿûÿøÿúÿûÿüÿûÿ÷ÿùÿûÿ ôÿÿÿ üÿúÿÿÿüÿýÿ ÷ÿùÿýÿÿÿþÿþÿ ûÿøÿÿÿ÷ÿüÿýÿüÿóÿÿÿôÿøÿüÿöÿûÿþÿüÿøÿ úÿùÿÿÿ÷ÿÿÿÿÿÿÿõÿüÿþÿüÿýÿúÿùÿúÿÿÿ ûÿúÿÿÿùÿýÿûÿÿÿÿÿÿÿÿÿùÿùÿüÿöÿýÿÿÿþÿôÿ úÿ ûÿóÿýÿ ýÿýÿýÿûÿýÿüÿöÿþÿûÿøÿøÿþÿ üÿùÿ øÿÿÿþÿÿÿþÿüÿøÿýÿ úÿ÷ÿûÿ ûÿþÿ÷ÿüÿ ûÿÿÿÿÿ ùÿ÷ÿýÿþÿþÿöÿøÿúÿöÿüÿþÿõÿûÿûÿ ôÿûÿöÿüÿüÿÿÿøÿþÿþÿÿÿ÷ÿ÷ÿ ýÿñÿ÷ÿûÿüÿ öÿùÿýÿøÿýÿ úÿÿÿüÿ÷ÿýÿùÿ õÿûÿýÿûÿïÿüÿþÿùÿþÿÿÿýÿøÿüÿûÿ ÿÿþÿóÿúÿ þÿöÿýÿÿÿ÷ÿ÷ÿøÿÿÿüÿÿÿýÿýÿ ÿÿøÿ üÿúÿ÷ÿ ýÿ÷ÿöÿþÿýÿûÿùÿûÿ ùÿþÿýÿýÿÿÿüÿÿÿþÿöÿ ûÿøÿôÿýÿùÿùÿùÿüÿþÿÿÿþÿÿÿøÿûÿüÿøÿöÿýÿùÿÿÿûÿûÿþÿöÿ ûÿúÿûÿ ÷ÿÿÿýÿûÿùÿýÿÿÿøÿ þÿöÿÿÿþÿÿÿýÿúÿýÿúÿ ÷ÿûÿúÿûÿýÿÿÿñÿûÿúÿóÿûÿ ÷ÿÿÿ øÿòÿøÿûÿ÷ÿþÿþÿûÿúÿ÷ÿûÿþÿûÿ øÿûÿúÿüÿÿÿÿÿ úÿùÿýÿøÿþÿýÿýÿ÷ÿþÿüÿ ÷ÿþÿúÿ üÿþÿöÿöÿ õÿÿÿÿÿûÿýÿÿÿ øÿ þÿòÿÿÿ÷ÿøÿ ÿÿýÿýÿýÿüÿþÿùÿúÿþÿöÿÿÿùÿ÷ÿùÿ üÿþÿûÿÿÿñÿúÿ÷ÿøÿÿÿ÷ÿüÿúÿûÿýÿ÷ÿ öÿïÿóÿ ûÿ÷ÿèÿçÿöÿ ùÿóÿüÿúÿþÿ ôÿöÿûÿóÿîÿöÿÿÿ þÿýÿûÿúÿ!#þÿûÿþÿüÿýÿþÿþÿÿÿüÿøÿúÿûÿóÿïÿñÿöÿúÿýÿÿÿ  øÿõÿñÿîÿëÿëÿïÿòÿõÿ÷ÿúÿüÿÿÿ  üÿúÿøÿùÿøÿõÿôÿóÿöÿýÿþÿûÿûÿûÿøÿòÿìÿèÿìÿ÷ÿÿÿ! þÿöÿòÿìÿçÿëÿìÿéÿëÿëÿèÿëÿôÿÿÿ !(#"üÿøÿóÿëÿéÿîÿîÿñÿ÷ÿÿÿÿÿÿÿÿÿûÿõÿïÿîÿïÿðÿðÿïÿîÿïÿðÿõÿþÿ þÿüÿúÿ÷ÿùÿùÿýÿ   ûÿøÿûÿøÿïÿæÿáÿäÿçÿèÿçÿèÿíÿñÿôÿóÿôÿõÿõÿôÿüÿ   þÿûÿúÿôÿöÿôÿñÿïÿÿÿûÿõÿöÿ÷ÿõÿ  ýÿ úÿðÿðÿõÿëÿòÿíÿãÿóÿýÿðÿþÿöÿïÿþÿùÿ ýÿîÿêÿðÿùÿòÿòÿþÿ úÿ÷ÿ  ÿÿ òÿöÿóÿýÿûÿúÿûÿúÿùÿùÿÿÿüÿùÿéÿêÿîÿóÿòÿ üÿôÿëÿçÿèÿþÿ øÿøÿÿÿøÿüÿþÿõÿÿÿ    øÿõÿñÿÿÿöÿõÿþÿÿÿùÿñÿýÿüÿìÿôÿ  ýÿêÿìÿóÿýÿÿÿûÿþÿ úÿëÿëÿñÿýÿ÷ÿùÿôÿüÿúÿöÿ÷ÿ  ûÿùÿüÿõÿöÿ ûÿøÿýÿûÿùÿýÿõÿþÿóÿüÿõÿôÿ÷ÿ  ýÿþÿþÿüÿüÿ þÿüÿ   ôÿüÿôÿëÿïÿÿÿ ñÿæÿäÿæÿöÿ þÿÿÿ þÿ þÿ þÿúÿöÿíÿûÿ óÿùÿ÷ÿÿÿÿÿþÿ   ÷ÿûÿîÿüÿÿÿùÿöÿ ûÿ÷ÿúÿûÿ ûÿùÿ÷ÿûÿ÷ÿúÿýÿÿÿ ÷ÿôÿûÿóÿêÿîÿñÿïÿòÿýÿ úÿ÷ÿîÿùÿüÿúÿ ÿÿ üÿ÷ÿþÿùÿøÿëÿúÿöÿøÿñÿ  ûÿúÿñÿêÿíÿùÿùÿøÿøÿ÷ÿôÿöÿöÿýÿúÿ ýÿ ùÿúÿ ûÿ úÿíÿóÿñÿÿÿøÿúÿüÿýÿúÿúÿ þÿùÿõÿôÿõÿþÿ üÿ ÿÿûÿôÿýÿýÿýÿûÿÿÿ ÷ÿèÿêÿíÿûÿôÿòÿøÿÿÿöÿüÿ ÷ÿþÿôÿíÿÿÿ üÿúÿóÿÿÿüÿûÿõÿöÿøÿ öÿôÿøÿ÷ÿôÿ  ùÿÿÿ÷ÿüÿ ûÿìÿåÿëÿõÿïÿðÿûÿ öÿôÿòÿûÿ ÿÿõÿýÿÿÿïÿíÿþÿ ýÿóÿ÷ÿôÿùÿýÿøÿúÿ øÿíÿéÿéÿùÿ þÿûÿðÿúÿ  ïÿúÿ  ÷ÿûÿïÿêÿëÿÿÿýÿøÿûÿöÿüÿøÿøÿùÿ ÿÿýÿþÿ ÿÿñÿôÿòÿèÿöÿûÿñÿþÿôÿøÿ þÿöÿÿÿüÿùÿ  þÿþÿ÷ÿéÿæÿíÿðÿõÿýÿ ÿÿüÿÿÿþÿüÿûÿ÷ÿ ýÿüÿ öÿûÿüÿøÿøÿûÿ÷ÿûÿùÿôÿðÿ÷ÿöÿùÿùÿ þÿ  ÷ÿúÿóÿäÿêÿüÿûÿþÿÿÿýÿýÿÿÿþÿúÿùÿþÿüÿøÿôÿíÿðÿüÿ ôÿêÿçÿìÿòÿ ÿÿîÿòÿòÿüÿúÿöÿùÿ   øÿëÿêÿíÿõÿðÿýÿ ùÿøÿúÿüÿøÿùÿÿÿûÿõÿùÿ þÿøÿþÿôÿçÿèÿîÿøÿ÷ÿùÿúÿÿÿ ùÿíÿéÿñÿöÿóÿ ùÿÿÿüÿüÿùÿ úÿúÿùÿíÿûÿùÿøÿóÿ ÿÿüÿôÿ öÿõÿíÿøÿ ûÿûÿþÿýÿùÿîÿéÿçÿñÿüÿÿÿ þÿúÿþÿïÿòÿíÿýÿøÿúÿøÿ÷ÿôÿôÿöÿýÿÿÿúÿ ûÿóÿ ýÿûÿøÿýÿ   ôÿøÿ÷ÿüÿøÿùÿðÿòÿÿÿñÿùÿþÿýÿ þÿøÿ÷ÿùÿùÿøÿíÿûÿúÿýÿôÿ üÿ   ôÿþÿîÿíÿêÿþÿöÿûÿüÿþÿñÿùÿôÿüÿøÿ   þÿòÿêÿëÿòÿ  õÿ÷ÿñÿþÿôÿúÿóÿöÿûÿ   öÿñÿîÿðÿÿÿ  úÿðÿñÿôÿýÿ øÿÿÿþÿóÿÿÿðÿîÿíÿëÿôÿ ùÿóÿðÿúÿüÿüÿ   öÿóÿòÿúÿóÿõÿÿÿôÿ  ÷ÿýÿ ûÿøÿôÿæÿåÿèÿóÿ ýÿÿÿòÿðÿíÿñÿýÿøÿÿÿÿÿùÿ  öÿêÿãÿèÿïÿ  ôÿúÿòÿþÿÿÿùÿ ùÿóÿûÿ ÿÿúÿþÿ÷ÿýÿ úÿþÿÿÿñÿöÿóÿóÿïÿùÿøÿüÿöÿûÿüÿôÿÿÿöÿöÿ÷ÿùÿ ùÿóÿþÿùÿöÿ úÿôÿÿÿöÿ÷ÿ  ýÿõÿÿÿøÿòÿëÿêÿòÿþÿþÿ ýÿúÿÿÿøÿöÿôÿóÿ  üÿïÿòÿúÿ÷ÿùÿòÿüÿîÿúÿðÿçÿîÿýÿ ÷ÿìÿçÿòÿûÿõÿùÿñÿ÷ÿûÿøÿ ÿÿüÿôÿêÿïÿÿÿ üÿôÿþÿûÿüÿýÿþÿõÿþÿïÿðÿéÿóÿýÿ  þÿþÿúÿÿÿôÿüÿÿÿûÿþÿôÿôÿÿÿ÷ÿöÿûÿ ÿÿøÿüÿõÿ÷ÿ   ôÿÿÿóÿèÿðÿîÿôÿ ûÿøÿðÿûÿîÿéÿÿÿ ÿÿ ÿÿõÿýÿýÿüÿüÿ ûÿýÿõÿõÿðÿþÿøÿøÿýÿóÿ  ÷ÿüÿîÿõÿ óÿûÿöÿûÿ üÿøÿíÿòÿ þÿþÿ  óÿùÿíÿçÿþÿúÿúÿ þÿþÿúÿûÿ   ÿÿùÿôÿúÿúÿóÿ ùÿùÿðÿüÿóÿ  õÿìÿæÿíÿöÿ ûÿûÿòÿõÿìÿûÿ øÿúÿøÿëÿëÿúÿ üÿôÿüÿýÿûÿûÿýÿùÿúÿüÿøÿùÿýÿúÿ ûÿéÿäÿïÿöÿöÿòÿîÿõÿðÿñÿ üÿöÿîÿëÿêÿíÿøÿÿÿ øÿ íÿìÿðÿûÿ÷ÿôÿñÿóÿôÿüÿ þÿöÿôÿÿÿ ôÿùÿôÿþÿñÿòÿóÿüÿöÿúÿ ýÿ ÿÿýÿôÿñÿùÿöÿûÿ  þÿùÿñÿíÿüÿýÿ  þÿúÿÿÿöÿ÷ÿùÿïÿþÿòÿðÿîÿòÿõÿ  úÿúÿûÿýÿúÿöÿ÷ÿôÿøÿÿÿ üÿùÿüÿ÷ÿþÿ ûÿûÿûÿ ùÿúÿýÿôÿöÿ üÿ ýÿýÿ øÿòÿïÿñÿûÿóÿúÿóÿüÿøÿõÿøÿ ÿÿþÿÿÿüÿøÿùÿûÿþÿíÿûÿøÿ ýÿþÿþÿîÿîÿ  öÿíÿêÿïÿùÿòÿùÿ ûÿôÿñÿûÿüÿúÿýÿ þÿïÿöÿþÿòÿûÿõÿéÿðÿüÿ  øÿéÿêÿêÿûÿ  ñÿöÿ  öÿçÿûÿôÿùÿ úÿöÿüÿþÿþÿùÿúÿþÿüÿùÿüÿ   óÿõÿôÿùÿóÿûÿ üÿôÿûÿöÿõÿúÿñÿæÿñÿöÿôÿõÿûÿýÿûÿþÿýÿ ûÿýÿýÿ÷ÿïÿéÿþÿøÿ  øÿòÿñÿúÿöÿøÿ õÿ ÿÿðÿÿÿþÿùÿúÿ  óÿùÿñÿþÿüÿÿÿõÿíÿúÿ üÿ ûÿ÷ÿîÿûÿ þÿ þÿóÿòÿ ÿÿ ôÿÿÿóÿìÿòÿþÿûÿ ûÿøÿõÿóÿùÿúÿøÿýÿüÿÿÿÿÿúÿþÿ÷ÿýÿöÿ÷ÿóÿúÿíÿñÿëÿûÿþÿôÿíÿûÿûÿüÿ÷ÿóÿüÿ  üÿöÿþÿÿÿûÿøÿ÷ÿöÿ  ÷ÿýÿúÿ÷ÿúÿïÿôÿïÿ÷ÿ  öÿïÿñÿôÿúÿûÿüÿùÿòÿòÿþÿúÿûÿýÿ  ÷ÿíÿêÿìÿúÿÿÿ úÿùÿúÿ ûÿòÿûÿúÿôÿóÿýÿþÿ ûÿñÿóÿþÿ÷ÿþÿ÷ÿùÿ ýÿúÿþÿþÿúÿùÿûÿÿÿúÿ÷ÿ÷ÿþÿûÿõÿÿÿ  þÿ  úÿøÿýÿèÿÿÿ üÿ÷ÿüÿôÿðÿòÿûÿòÿìÿôÿúÿ üÿþÿ ùÿøÿ÷ÿûÿ  ðÿÿÿôÿòÿþÿ ûÿíÿóÿ÷ÿÿÿ úÿõÿÿÿ÷ÿúÿ÷ÿýÿùÿ÷ÿþÿøÿöÿýÿöÿóÿ÷ÿ ýÿþÿôÿüÿøÿúÿ øÿñÿýÿüÿ÷ÿòÿûÿúÿ øÿöÿþÿÿÿúÿùÿÿÿüÿùÿ úÿôÿýÿõÿÿÿùÿ÷ÿùÿúÿõÿõÿ ùÿûÿúÿýÿ ùÿüÿüÿûÿúÿýÿ ûÿöÿþÿýÿøÿ ýÿôÿûÿ úÿÿÿõÿ÷ÿýÿøÿ þÿýÿþÿøÿ ÿÿòÿúÿ ôÿþÿúÿ÷ÿûÿÿÿðÿÿÿþÿ ñÿ÷ÿýÿöÿÿÿûÿþÿþÿþÿñÿ÷ÿ ýÿúÿùÿ ýÿúÿýÿýÿòÿûÿÿÿüÿ ûÿþÿûÿóÿ ùÿþÿ ÿÿùÿ öÿÿÿöÿÿÿ üÿþÿõÿôÿ ùÿûÿýÿ úÿúÿöÿöÿ úÿþÿ øÿúÿ ÷ÿúÿ÷ÿÿÿúÿýÿ øÿôÿýÿýÿþÿõÿýÿ ýÿûÿ÷ÿ ÷ÿüÿöÿöÿþÿþÿûÿûÿ ÿÿ øÿþÿòÿûÿûÿúÿýÿýÿüÿúÿ þÿúÿþÿ÷ÿþÿõÿöÿ÷ÿóÿüÿÿÿÿÿùÿ÷ÿÿÿþÿþÿýÿóÿýÿùÿÿÿýÿýÿøÿöÿ÷ÿúÿÿÿ øÿùÿûÿøÿùÿ üÿÿÿüÿÿÿüÿúÿ üÿöÿ öÿüÿ÷ÿøÿûÿûÿúÿòÿþÿ öÿýÿ ÿÿþÿüÿìÿ÷ÿ ûÿüÿïÿ÷ÿïÿêÿ þÿüÿúÿ ÷ÿ øÿûÿñÿ ýÿýÿýÿûÿóÿýÿ Þÿêÿ óÿöÿþÿ õÿ ôÿýÿéÿöÿ÷ÿûÿ ÿÿýÿíÿøÿøÿúÿöÿîÿùÿøÿÿÿõÿüÿ àÿÿÿÿÿõÿúÿîÿÙÿØÿ#Ýÿ þÿãÿçÿ  îÿïÿøÿ-õÿßÿéÿ ëÿùÿýÿúÿ,ôÿèÿóÿöÿ þÿüÿéÿ ôÿ ýÿûÿýÿÚÿüÿøÿ%úÿóÿóÿùÿÿÿòÿ÷ÿáÿûÿùÿ&óÿýÿìÿ óÿïÿÿÿýÿöÿûÿ÷ÿùÿÿÿúÿóÿÿÿ óÿýÿþÿíÿ úÿèÿ òÿìÿãÿôÿöÿ ùÿòÿùÿüÿúÿ úÿíÿ üÿþÿÿÿÿÿüÿ÷ÿÿÿøÿ øÿðÿüÿ ýÿ÷ÿøÿðÿ÷ÿñÿ ýÿõÿôÿýÿøÿþÿüÿõÿõÿÿÿ ÿÿþÿúÿûÿòÿÿÿ ðÿþÿ úÿýÿ öÿúÿþÿúÿøÿ ýÿúÿðÿ ÷ÿ õÿòÿúÿøÿÿÿùÿüÿõÿùÿûÿÿÿûÿúÿôÿþÿ÷ÿ úÿóÿüÿûÿöÿþÿÿÿ ôÿîÿóÿïÿÿÿøÿúÿîÿõÿùÿöÿòÿúÿÿÿòÿòÿ ÷ÿþÿýÿôÿÿÿ$þÿåÿ Øÿúÿýÿîÿøÿëÿíÿöÿõÿúÿþÿ÷ÿâÿûÿôÿáÿúÿåÿíÿøÿ(ÿÿåÿ)ôÿ¼ÿûÿ&éÿ òÿÔÿëÿòÿ-BÛÿÓÿ Ðÿßÿ?ùÿÒÿÛÿ åÿ9þÿ!#Ïÿ øÿöÿÐÿ÷ÿùÿæÿàÿÚÿÝÿAÂÿ$×ÿ*D’ÿÛÿÞÿ# âÿæÿüÿùÿêÿöÿ: Çÿ°ÿÐÿüÿ!(NVJÝÿ-¬ÿÿQÿ„áeÝõ-†ÿ¾þÐýJý}ý"þÖþ\ÿÉÿu=—}\#ÆWõÿ“ÿMÿ9ÿ(ÿÿ²ÿÁÿfËúÿñþ¢ÿâ*Âv¨¯þßü5û~ú:û—üÈýÆþäÿOªEgÎRÜÒÿÏþ…þáþ¥þ÷þÿ6ÿßhôýûþg: …¶çÿ…ýBúèö‘õçö|ùÊûÖýçÿeÝHý¥84páÿ”ý¶üdýý#ÿÀÿ‘þ*6ˆúðü¯_Ê#…Tÿ+ù¬ñ­ê†ç¢éVð[÷ üÛÿgt ¹ NîÔáþöú†ømùû)þnþþîüfÿÿ ]Ch¦ü\öïjçùã¤çæï›÷»üT›Ô ž© „ÌÎýRùx÷Iøûú#ü×ÿAŽq—¬úùþì ¹=oDðú@ôTíXå|áBå¸î•÷8ýú! Ð K« 5Cö'ýPúèøùû^ý ï«Jrëâùßý¬ =í~ûôíßã3Þâzìröfü| úLS> ±¨ÿùø(ö_÷ÉûýGÿþþí æ>øü‚ n8!Þ¢Óø òˆë·ã{ݾßê‘õþ—¾KCBÀ¨~‰ý_ú9÷±÷úùý­þë…,5 ¿ëþ»önú- ë#8Þþø~óhí¦ã#ÚkÛ×åróöüj æ ²l… ˜aýÑ÷ûó‡ö:üþBôþ¯þ0þ \@ûzûâ ˜J!°ù÷ò§ïçjßLÞcäöïúÓÿ@» ¨ßÃW ¦ú þJùÅõõcù¨üTÿ²ÿðÿÜ{щüÅþŒ é£ 6®ûõ’ð±èß Ýšãím÷àý­Š*7l~ ×äÍÜüøÈõÀöúñûëýLþ€ÿ‰r£ý-þ+ F+ˆ•üöúòÆì[ämàðá¿êõlü)„ `›p <,ûw‘ûäöÒõÇ÷ÛùáýŸýSþ~zXÿ4ÿÊüɾ žþòøÁõïNç‡áZâê#ó×øýc¡ !D¦= ÷ÆŸýâø>ök÷øøxûNûzûgJyÿ¶ ³Ž0 œõúÚöñ—é-äFä,éSð§ö”ûUÞV ™‚à  PDÿtûÁøEøˆ÷@ùœùÄúëþp ,ÿÌê sãç 6ôüúióuë˜æÌåúêžñhö_ú{ÿ¦? »Cï @ ÍDŒÿ“ûNù¥ø¦÷Vùwù4úúþÊ‚ÿçþ€ z;Ða òÂýOúôîÝéïçbëQñcõú×þÕÅ ZuåÖ U Å^ǯý[ú;øKù$ø—ùÍù™úXÿèÙ¾ÿØ¢¸™ß mþ‚úxõŠï7ëÃé©ìèð•õú5þ|ïò ´s… X ×ý{þÏûsù%ù³÷gùùxú„þoÿyÿ|ÿ´ìL·y¡ -nÿ’û÷aóçî~ìÌí×ðÐôàù ýaÙ 4 œ  z   ›y{òü;úù¨÷ÿøNù²ùývþPþ>ÿí&TŠ Jÿ¬ü—øô‚ðíØíèðõŠù¥ýÐ%’   h ± ÏÙ¨§ý‘ú(ùw÷„øeøÀùÂü³ýÈýcþÐè:è !æü8ùõ#ñ¥î>îñð…ôûø,ýö Ùß ž N ) Õ ß¸ìýVû·ùU÷ øu÷ùRü’ýçýQþÈòaG(¦  ý‘útöÊòïÝîñÐôÆùSýÁÅ 4 ‡ ö » †< Ÿþrû‹ùz÷£÷;÷¡øÉûýáý'þºêëù ÷{ºýû÷ÇóðXïñ¦ô ùCýÚ!Ú B : V ³ X6hRþükú~÷•÷¸öt÷×úÄü0ý>þ?Æó á¶4 `êCþøû.ùEõýðÖîrïCóð÷@ü܆ ¢ c  ë|Öÿ†ýMûøZ÷iõxösùkû½û—üwÿ£Ì ”ÉO z iÿ.ý±ùöïð`îýíÿð-õôùÅý ‹™Q ùÆ 0Ðñþ{üù'ø}õbõ,÷ø§øbú˜ý$M ùÀ" õwþþúòõcñ˜íêìrî7òÓöû¦þËÒ ƒ ê¬#• ] zþ8úTùTõºô4öVöCö‡÷'ú@i g.Ö 9†’zý7ø¾òîŽëOìð!ô¢øüVÿ¸ô 0ˆ[ÿ{ BÎKý ü¹õ¥ôšô¾ôìóBõç÷g” ®KUTk þ«ú«ô îÕé*æôç1ëªñž÷çýŽý° cü¿ü+õ ûEvþ{ù¬ø5ó óÏô-öqõ7÷zúzdMwkO ÏøôºïÁêÓä%âªà¢åfîOù Ÿ SH&e: ô dÿ¶øŠõpñkóêðýôMø‰üdû§þ(=‰¥(!%Zî)õZêÇãèàÞ+Ü2Þ5ä0înü£ Lù#;ÀüýòÃíˆé*îäî=øÇù&× Ù¶½zä%ò.H%Zô'ߌÒ:ÐîÑÙÖqÝžå÷ð}6v&È% ”@Oçúèñ¥ëWæ¬èœìÈøÏÿšœ æfìù3ô %%6ÿ-ݼìÃÒÄ'Æ×Î_Øá4êÚö^ )*â+õ'›§%€úÖîmì×é1î]óCý¢ˆÇ¤ ‹ø$í¶è r3fH†?tä—Åe³vº4Êê×åØöWÂ5&¿-K,c &_ñíéêÖí“ð¦øˆü2 ¢P I ´ ò£éLäj T0 KAq1çÉÅ…¯ºÊ=à‘ëùe„ø˜ÄI¡;¢K¸ˆÞÁüð%‹£–°ùüìèMÞžÛéÁúÖWì oÎû7ÿ4þçò®èŠçÎÿE(ôIjR'7cWÈg¡[š ²ìØ;þ>_ðEÓ É×îêsÜàÖÀãøh«É‡ó‡:ü8oü…ð,ç–äøþ—'þH›Sº9‡É@ŸP˜/±§Ù3ÜÏ#v#È5 ñùÖäCØ ÛËè}~ ø!ˆ' –ü,õ‚÷ øéífèéÝ«-O$S©5·ûµÁšT—õ±9Þe$£+Ù(é:¦ÅâSñÆÜóÔÙ±ì Æ ~-m(R hó=ñLñëMè#ìÞZ-†LôQ·5ÚýnÂÿ™ ’%­ÔÙ€+$<1<.Ã'D vûÕêœÛŸÕjÝCñ‹ ß «+Ü%t'¬ñ‘ï(í®ááuì© ; YÑVt4Âñòé2±ZæF4ê9°1á"– 8DóGâdÖÔÓ§ã×û–³.Ò3—%äIõèá¡ä~çIæaë(öãC†]»Uœ)Ùáñ¢sƒú‹ý¹>öS%v=/=-Œè gü}éú×bÏØÖ¶íF*¢5¹._šë¨ß¸èAîûç~éùpËMgÿTýΩ€j“=Ìý Ò5}Ds9Ì&hÎ ƒkõjáÏîËçÛ8ÿ Ï9;'åGò+ÜWÞÌîNõ¦ížídú %áT„kõOk¯º€qà½?¯E:7a"~FLüÎì–Ø’ÉÍ æ; 0JC~:!šûxäÔñÕIîïù™òJõl{/«\{m™E­üĦ€€7ª‡ñ'0éJHFŠ0à- ûã©ÌÁÔú&ªA£F(i[á\ÛôØ·å û­#îðžµ>¬j×o2¿ÕM…€òƒýÎ@¤FëJ\4Ö+}¸ >ò ÏA¸½Açž &LáSQ8l$ìPՒߘâÄç)ñƒõ‘ì]’,ÄZÒsËYš æ³€€g¡÷âoj8à\u&]qMÉŸ€²•ÂSò…S7€S‡aöT,kë:³[š‹©XÏù÷Ø50¨DDKBçõÈ#´|Â×iåÆÿJ'€[Ø{ìc‰"ùÑ^œû³·¡Öüü÷.ª\ t×_°,¯ë±¼Â¦5±xÂâ" .9PÉXcEñ?ï3Æ®»›Å”Ï8Ùö0]iÿ®U/¿É¨ªO¢§e²àÏ-S@ŒnÖo…L~ràÉÁš´Ž¯)Àˆá@G@_^Pv0ƒ×çÈĸºJιæ©ÍHùm­nC>CüÅë¤Ã™g£ÁºÍìJ$áYËj ^@2ˆ0Ô‚¶ §Ç±9Òe52ãPàWGD$óÄÒõ«®ÆÇ~ìÛº!úKÕnãiZ,Ó߬!žg¡±ÍËü\=qfƒnÙH¤¼êZÊÞ¯ïªiºqè]FnTsN?4í|ã ÄK¦°°çÓ™ü†Ï-ETºn]hŸÏߤc A¤…¶ÜÓ¦'LZoÄ``;• SêšÀ¿¬>¥–Æ—õ+ËH2V‹N­2 ·Õ¦¹ ¥^¸k×ÏG3bXõsÑQP2Ìp¯½¤×›ä§(ÕÅU¡d!WT±¦¾Üä»ZEøR:Sp<ã}ù¨Åb±H½©ËçÉmþA=óinZIˆ ÔÿFÄæ‰€ŸæËþý%"ûX÷q7f‚3 åcÃ6£y§6Ç^ð"W5N³Xâ>!ÌëÒ%Ì¥ºä¥DУ"šN¸VMOÅQb,‚çUžµ‹7šð®µ¿Ãú|> asaùOt6•5è®8¥É¶Í#äY:K[´HÐ?¤ØÛì¿ÆŒüžøWÔ/ÓWÈVÇGÌÜȶ´g§4Œ¡òÚ® Ç.I•V‰[AE2 Lá€Ñ÷´I¢ê¹há/¨4=6žbüTÄ%ˆ‹ôí¢®µÚçü >Þ@ÇCF Ìeº¼µ™—æ¥BÏ (¾=&BØ_ˆDîaõ.ùã¼8­9Íàáµìý #7DŽ:1x"F ô°¦Érýò o5G +_ç‚ÊÀ¯( Z›1±°ß( w25BkdiM¶8ÁdùÔnÐ4ÇìÖBÖgñ:1!5+6;Gã´÷ša9ý;+,!“Ì*ÈÃЊÆhœŠÐÝ0D:•H®>¶p û ð¿%Ó¥ïÊÜ(ì)/ [Æ:@KÁ‹ïq' äÑ#Ô*d%ÐB¼`Ñä³EžÐ,þ£Ù³AˆKúFv”óæÒÓÚÙ:ähÙÂ÷ùû…)Øæ7y~¾RµÞà3f¥ÌÚیϷk­bîxõ.ýÈg@E8ö6;e(Å ëàNÕãô ×ýÕ§üèþ=p>ö¿o.((5[6@³üwËÇÊÆ¡â­÷Þ½ë’ô+8;éDm;{2¯ª ¢æ«ãðÝðÔuÒ üíx%Q,2™Åbæ+™v£ENÌî¼ÔÔ̺•´ßrâÅëe6&Cz5bFÅD0×V÷0Ùrè5ÜçÀªùs^ú+ +µ:¯÷Õ(8Ö÷þN°ñæ§âQÍT¶¥¤yÖ×éZè@#'TÚ6ø9~Hv0¬Šùáê»ãΡÈ,ôJõJùÄü—.¼8#®Óô+96nhŠX·8éÇÞžÂò f¤$¥BÍ‹ë´ìÒ'U’29X2+@¡ÿ§ôÕÙÇ#Úîò:ÝEü÷e†4HˆÙo"ßEq¢£^AŸãìÜÅËy¦_‘ИÏÈòݫ帿P–Iá4ö[Fžìò¤9ÒN¼ºÌºí¬àÅöâ¸*=Á1ël%ºAàe)ëSî4³äÔ2·š˜€G‘‘¯ÉÕËÚW(ÉOVŸN÷g6GÒ(xñ¯ÚºÌÁÕÚÙ1úšöuD<Òòää*F•ÿNÚ'úì0ǸÏ«†‰’ˆÌÖMÏ™æv¡YK=7KÀPxL³’ýÈåŠÃRÓíà9ØåíÚÿˆ `/mí«!yJ= zñNm’ÔÜè4ܘ¨R¡>º‹ÏòÛçä3Iñ*»0[C@öç ôÏ5¾ÞFÓ¹Ñ@ø*K7à*÷H0[Cî |H¨ðì†Ð³Ìu› MyÀ—Ð(ùX ÕC¾C¯FTœJ¯¬øþ[Ý—ÊÍÍwÍÉÊìz÷(¬.Ÿ1‚ø)•Sö,,G‘'>äŠÎÒÉ¢é“=£—¾ÒMìU J?¦H—@Z:OË=9‘ØKÅGÑ Ò§¼ÐìSíÀ(±-Mö›<ÙIb.˜ FL î¸ÚâÊê–ª¦¸£œ·üËnùV7ABR)O0EÆ+µùïÛµÌÄÄÈxÉeð{íxO7o4ÉôÎ+a 7UÙEÎ%ÞçæÈëÇ`£m–ÿ“¿¶PÒ½ïÔ ¾>HPsO5NÏMñ(ù e÷!éÌÌ?ÆÓ¢Ôcèõ¿,¯3ñzWO5áýÚ5142èÞ½á+½)“ЫKÖ5Î9íëš7¯4àI§Fó?‡!Ø9éßûˢΞ¾|äÝå–÷>!\5öìCbWØì@9Bíø6ÁOÂZ¤‰„‘%©#Ãöì,ð5PÔ_ê[:DÁ1?QíoÉ>Ë­ÊζŠÌÿëûÛ ‹2ªù‚e‡j/ß*]@…¿·°¨;ª—‡€—ŸÓô¹ 21¡e¯iöN‹;q4×çêÓÎÉÎøÎgÃáÓ;î£ü#[1£œ÷[)aœ®@‰ ’¬ð®'Êó¥ÅA³ïÙùœ«4.[ÜPÝ:Q:Ú,°2æÖ&ÏéÉòÈÐßóÉÿj$w8^ ò V—`†ŸQ/]¡´T§ÜȶŒ¸›öR¤n2iX!J8¹<’'uóáÏÆ6ÀÓÊÍÁýÏùKä3W;Aé"TdZvŒJ.-ÿT«á ²ÊŸø†¤°:é@…¢>GY_#M®2Ô çŒÍ„ÅŒÆEÊ&çóµý3>ßzÕ_øI¹„ý0¹ö ³`·iʨ¬{žfÃ÷mK7`XÍD™2†.$ù÷ÜUÔУſÏ7í½úÊe/5>b² W­N79Ú)|ÿ²¡·NÒ²®¸¢iÓ;óXøWi1 ¿øDº>|Ø5ùÊɸóÀÁOºÎʬìÔ W)ì8ŽJ:ˆ]ìæÕJÔ!Ô Ìeâ‰ø¢`/L²Ø8D©ú’ÿ¨ÑÛžÆf¿®½`Ð&è/FA*i8„: 3b'| ¬õ°ãîÙ2ÕÚ¨Ý(çU¿Z7?|*H%•#$ØìºÔìÊÿ¸:»ÕÍî 2`.Š8Ã6Ï.£)>Š ¡õ¿êžàÅÙÔ+Úåí†øAöXX',3Õ,M,X-3%\í¹Ý·ÐWÃÀtÉHØÈêÚÿÖ'$å-ô10á(“B lþœîcäJÛk×àôåÚçOùÃL#ž+/h&ïÑ@÷Ñæ¬ÕÍðÎ7ÓGÛEê×ý ÆÎ%b,Â+£$Gk3þËòxæôÜåރ߆ß{ítÿ yŸ!h(&•ŽÔõúæÛÞïØW×ÚÛÓåÓò¿ Ië!…%®#´¿ÒÞûÉîÕå¸â7ßbß=é)öžñ 7` æ ®2M §ÿFó=éâÜÞ‰ßìåï3ùq1²d ŒM9 8üõ€í‚èAãdáåç–ñµú)‹k`š¢úOñíé~å&åµçêí õÑþÇ’¥TÞÜ„Íãütôï¼ç¶äàçîÑö~ÿŽ ¯B¬Kz I÷•ðøëšéäêîò‡ùmb *à?[C’ ïrú[õëçþçóìó üWÍ yk«`ÙsúóÞîRìAì›ï˜Òó³ËÿR)ùCŽ(ö½þŸÿ{ayNú¬ªúŽÕöí…ûöý£¾ô|‹ýÒåþÿúý€ÿøqþü0üË /üÊ•ÿûú¢ƒ—ü%ÿábý€Ñ÷¼èø‘óô •ök ˆúwáö+«þáü¹Yû¶íþ¦ÿüµ`÷ ÕùNù}ýX­ùŸŽú…©ý§ÿÍú$*ùþú›>úùþëü iû?6ú®þäýºa~üûÂÿ@þ×üÌ–þ8âú`©ü»Wø~ aõ‚ îô?þlûÂ9ƒýãü™)þaþUþhØøÃ@ûØvý³aþ+Yõ4 túð”û›úöÈÈûJŒü¢PúRlþ %"ûB|ü£òùÆ›ý§ ýÄYùøWúLeìý°¹ûQ›þý’@ø Þúx«ü‡“{üþ^÷} ¤ùtXþÝý}(ÿ3Šý¦JìÿþÿÀýÙCbû…xþ,ÙÿPþ Öûül\ûš0þ{PˆüSáú`Ÿûhìÿ#ýP²yúyýBþ˜ÿyþÁÆÈûX™Þýe‹yüÈÌ ü7£þþïÄûâÿIbþ@Áý®{ÿÈKÿ sÌý züî¤VýþX÷ÿŸäþýþQ‹þÈýÇêÿ†ñÿþýšÿ^Ð.ü`ÿ|NsùTý>nEýÜýK4*Éþìÿ{øÿ|ý¢ÿL;øÿ7ÿëÿÆÿ€tDÿ0|ü8àN"ÿ¬dCÚÿy®.ÿèÿÙÿ%ÿw=çþøÿ‰wÿçþ’;Åþ&ëÿdþ­D†þiÿb&­þ,|r‡ÿÀÿvãÿþ ˆ«ÿÛÿ×ÿ{éÿKÿ\EÊÿ…ÿ2ÿÿ¸ÿb7¯ÿéÿNŽÿPüÿ®ÿUeæÿÐÿÝÿ3$jÿñÿT#Ñÿr¦ÿ ÿ>’Íÿ½ÿãÿüÿåÿÙÿÿÿ òÿ Ðÿ Ðÿ%ÿÿâÿ ÷ÿüÿþÿôÿìÿ ýÿùÿøÿßÿ$óÿÌÿáÿþÿ÷ÿ ñÿ ÿÿêÿ þÿ üÿ÷ÿ ôÿöÿ ûÿñÿïÿ üÿøÿÿÿþÿûÿþÿóÿ÷ÿûÿýÿûÿûÿýÿõÿóÿýÿûÿ ôÿÿÿûÿ ýÿùÿ÷ÿ ÿÿöÿùÿûÿÿÿ öÿ öÿüÿðÿ óÿûÿýÿþÿôÿûÿ íÿ öÿúÿ ûÿóÿçÿüÿ ñÿñÿúÿüÿïÿüÿ òÿÿÿìÿûÿúÿûÿýÿüÿùÿ÷ÿúÿòÿíÿ ùÿ îÿîÿøÿñÿíÿþÿ%÷ÿùÿîÿ õÿòÿáÿñÿçÿùÿêÿêÿûÿíÿöÿÿÿïÿòÿ ïÿÕÿíÿìÿëÿãÿýÿ(ëÿÝÿûÿìÿùÿõÿëÿÛÿÿÿéÿ<ïÿöÿ3ÔÿõÿÚÿðÿ; ïÿÏÿòÿöÿ/ïÿ“ÿ$éÿîÿI$þÿÃÿÜÿ7 Ûÿöÿýÿþÿ ÞÿdÞÿ êÿ²ÿÛÿ>-Æÿ Öÿ"øÿ¢ÿÿëÿ5|c‡ÿÒÿ¸ÿ½ÿbx~Ùÿ¬ÿîÿJ¶ÿ\ÿéÿ1ÔÿíÿD.?‰ÿæÿøÿ= Áÿs4ÿÿ–ÿöÿ 3Çÿ ‰(I$EEÿÿâÿ‚ÿÿ/SŸ§²ÿõþ=ÿÒÿp"ϽƒÞÿNÿÿÎÿ$KñýW­ÿ€ÿOQÿÈÿ}ÿÿÙÿž¨»ÿeÿ+ÿõÿ} @ÿõþ6r-¦ÿB¾~ÚÿÂÿ-Áÿ]ÿIÿðÿYÉøÿÔÿõÿ58ÿ>ÿêÿæ¯ÿÃÿ2Éÿ¡ÿNž}ãÿ®ÿNÿFÿ”ÿÝÿP“~çÿËÿ¶—%¶ÿÿÎÿòÿÎÿ1r½þý¦þ~‡skËþ-þþýÝüqú.ø‡ø[ûìþ:[Ê…€e”v;þˆý]ýýTýSýý¾ý‰Xüþ~:Ž õ Åjqû1ùù´øïõÖòó ø ÿØ ÉQ ƒ”nXüRùjøûøûPüû©ü5þYë »ñÉ ”ÿ8÷ó±ò#òÖí½èfépòÑþ  5 ó ,€A„ ¸ö^ñ½ñlös÷œùäøïú{ýµ ¢ûxÿ÷2ÿ/¾ú-ëgåñã*ß&ÕþËáЗæ'qŸß?!m# Æ ‹÷oìyéýé™í5îDôºú†ê¦½ÎýøÿJ3D(¶¦ëDÞ˜Þ,ääcØ#Ñ ÝŒù˜ý!s"h”îe ™õGåçá¤èÕï2öøhØ -aL!“ _ïÚõŽ5"$ŽJç Þúà æ:âƒ×qÑÑÞ‘üZK"ÿíCŽF‘Kð›æçîíó«øgùFœEë°iý ã`õ/%é>p&iþfå•âKåbågܲÍÞËWá^ý›rÈ"®“ïàWåwó?ôþóùúý ²'-ø$Øó¹0¶E!"çûëæ;ßöݺÙ(ÎÌ­å· —:I ì"aN‡gþÎíÄáã˜ðú/ gï6ùÍ0ï"Ìuè54 T/Õÿç:àåÜ™Üxά¤ÊËñS—%~"ô!K"9–ÜéÞÇâTìEòôÿ:÷{}ìñåßÀ)ä5$V‰2ióDçêØŸÒZËIÀ¼Ä›ë¨ñ$²#‹(à/¢$B)û êµÜvß@çóï"÷Ç Èj&s´q lå/¾ˆãk4DW’7 sõÌàòÒ€ÑùÇN²ê»Zî 1².R0.Þ"úÎþ7æ;ΑÍèåû$Éë"8'Bÿöäõ¿Ôò¼ÀêÚ:'aJBÄ5ÿ@ñ)Õ]À™¶ °¹·æ‡â< <Í8¨5ý' ôó2Ýþ˱ÈÝìöÁ€Ý!ˆ#|*‚H ÷1ï4Űëg>_wDªÝÞö<ß4Æ1­«ž—±í!©3X<êD{@e'Þ €ñ¦ÔÀ ÃßÛ¿ön †/45‚7=dú»îÉän¾Ã«áê»@Ã^!H®0½}í$ґ¹©‘O¬Õí•%R>-MkPG>|&•ìÁH²†Áƒàj÷ï$:¼4š2ñGô÷çàڸϮÙíÑ?ÇgêTá0i 2òýØ*¼™û–5²HìØ!9GËRXOkAT,K·Ýּ߲¯¾4Û·û¦õ*‡@b=ƒ4â ïà‚Ò³…¯ ò½= gkdVAÁ ÎߘÌb»£6——¯ç‚&UµbzOµ6L"p"áÄ¿ ©½´RÖ@'Á5W<16k0}ï¦Ý‹Êò«P±kô!Dêm›dÒ;à Lè¢ÐXµj›ç“²Àë6-±V—]×P!>š!²ûØhº¤°â¸1Û@•&B<HK7¯*• •ê=Ù>Í1°¼®bîÕBÙtTmDDÍÛɼ¥¾•«?â—(³Y”nbZâ7&¿ýÄØ‹¾k®1³)ÐÑû³+sBpNž9i,« ýìZÜsÉøª­¯èñ:çv‚y½N@ ÿØç¿K²÷¥«Ÿi¯§Üƒ}XÕuÒfC=*¯ðؿµú¶ûÊõ8+7KFO:´'”1èßßx̬˜±•ê›9Öq÷z2P •ÖP½Ðµ›¬f¦ð­gÖÕW‹vìgå=Û _èÔïÈ[¿k»Ì^öY'|I$R‰:Ïhüxê­ãßÕ:µZ°’â4pþ~§U LѺݸ ±<«ê¬¬ÒœçU¦xÿhé9ð ì×ôÊÕÀ~¼BÉõó–$ÂHhT<¦/û«æäÙ_·µ´àF,YnÿˆV\Ñ…¸T¸‚·9°é³Ð/ øO­um›;(Íß>Ò~Í{Ç ÃÏðîF"I²XûB²!Ó÷VÜ™ÛDÖ³¾ƒ½+äÈ'¾hÿä` Õ2±¦©‡®z²Œ·ÙÒ 'L vÝp‹D3 fÝ¢ÉÇÈlËãÒœðCÛVPFË$ê÷/Û)× ×ÙÉvÈå=XúuÊ_€"Hâù¶Ç«î¯ëºuÃ¼ØØÿ”3±]iMJÓÕåÅËáÅÒÌRÔÜ\ëý \17M&JD3Ê–äÛÛYÏOÊñÞÍ :AÈ_$U½'ŠôÙÍ ¾%»Ò¿ Æø×‚ó®ž@OcBÏ$øùêÕÙ!ÔÓÒÕvãOüíN3Ç:G57öîûÖ÷ÍDÙš0õM¯D? ãô×ÚÊéÊ˽Ìq×âíþ :*C:¶7¸%Õù€ì„äéâ)àÞèúóPî' ‘"Á ¶%âé±ÚîãfÂ/ðDý7ëhí‰ÒÌžÌ`ÒNÔbàÚðZ æÝ/Ø,6"Lÿ‰óÔïŸë8îð€ùsÿ… ™ P½  :Áð æ‚íA 3,­=Î.~ªëhÖfÏzУÖeÚãæ™óþ7^$²3 ¿·üUúöõ¾özø<ü˜ÿ} `g Š õüFô øàkÍ*"’ UòáqÚkÞyáÄæ3ëAòûœÆDþJÖ •# ÿDý9ûTø0ùúžÿÀRVPýÌÿÔ ;•ªÙøî·éIëî_ï¶ïíðõÙúÃ ê ‚ ê ›‰ç}ý3û}ø~ú¿úôüªþøÿPýÃü’ÿ+d…~]-©ú„ørøwøÝöÈó ò«òÈö8ü6³ÿï~Y‚ˆ¿…sÿŽýÚý–ý“ý»ýqü"ú´ù üSŒµD‡z£ÿ½ÿw2Vþû<øW÷®øQûúýŠÿ ÿNÿ‰ÿö‘ð3ê=!E{¨ÿ=ýMü|ý}d<Ùÿ;þAþ…ÿ¦ô?ÿý€û‡ûùü¯þÜÿÿ¶þ þûþM’^XÌ.Gäý¤ñ ÿŸÿ –¦I˜ÿÿ%ÿ˜ÿ Æÿ'ÿºþÈþAÿÍÿôÿ•ÿGÿpÿR³ä”L(C1$øÿ ÷ÿäÿÛÿçÿþÿùÿ ÷ÿòÿðÿÿÿêÿòÿ íÿüÿ öÿüÿÿÿ üÿøÿÿÿÿÿ÷ÿûÿ éÿíÿ êÿÿÿ öÿðÿòÿçÿõÿüÿ ÿÿäÿáÿöÿúÿõÿæÿ*áÿôÿ×ÿúÿàÿùÿ.éÿ×ÿýÿ/ ìÿöÿ óÿûÿ÷ÿ óÿøÿúÿóÿàÿýÿòÿüÿéÿãÿãÿ áÿýÿíÿöÿ  Ýÿñÿéÿ ÷ÿñÿýÿáÿÙÿéÿøÿ#óÿéÿ ýÿìÿøÿúÿúÿöÿûÿçÿ îÿîÿÿÿÿÿòÿÿÿ ðÿÿÿúÿýÿýÿæÿ ùÿôÿ ñÿéÿûÿíÿ üÿöÿ þÿõÿéÿôÿ òÿöÿöÿðÿñÿ ÿÿøÿ ìÿÿÿ÷ÿýÿõÿ ûÿ þÿöÿúÿ ýÿýÿóÿúÿ ôÿðÿýÿ öÿùÿÿÿþÿüÿýÿÿÿõÿüÿôÿõÿõÿùÿõÿûÿþÿ ôÿþÿ ûÿüÿôÿüÿûÿýÿùÿýÿ õÿýÿûÿþÿ çÿÿÿ õÿôÿ÷ÿ ÷ÿÿÿÿÿùÿöÿúÿöÿüÿüÿùÿûÿüÿ÷ÿíÿþÿ üÿóÿêÿûÿþÿþÿíÿüÿøÿúÿòÿîÿèÿùÿ ûÿìÿóÿÿÿíÿÿÿôÿñÿïÿ õÿüÿûÿïÿÿÿ%ïÿüÿÝÿïÿõÿÿÿ#õÿéÿïÿ íÿ ôÿúÿçÿ÷ÿçÿöÿ#÷ÿðÿõÿèÿôÿ&óÿôÿýÿßÿßÿôÿþÿ& ýÿþÿéÿÔÿäÿöÿ1þÿëÿÚÿ %îÿäÿåÿþÿ$õÿþÿ îÿÞÿóÿëÿîÿåÿ øÿøÿ ýÿñÿüÿ ÊÿÞÿÿÿ'íÿëÿ ýÿèÿêÿûÿýÿçÿíÿóÿôÿ#ñÿäÿãÿöÿ#üÿûÿ$!ëÿæÿýÿùÿûÿÅÿáÿÿÿ'&èÿçÿÎÿ+#ãÿäÿçÿ-ûÿ ãÿâÿúÿ  ïÿüÿÛÿäÿçÿêÿÿÿ éÿæÿöÿüÿ$íÿêÿëÿþÿ!÷ÿ ûÿ×ÿñÿõÿøÿøÿôÿÆÿÊÿ 6%Þÿ ÛÿÜÿáÿûÿYÒÿ ßÿîÿæÿ  àÿîÿ?õÿºÿ·ÿ%èÿ»ÿ÷ÿôÿúÿ‹{õÿ¯ÿ¥ÿ!%ÎÿÞÿøÿÞÿwâÿøÿDãÿ@Ueÿöÿúÿ·ÿ¡ÿ£Ôÿ%ÃÿÄÿ u¯q™ÿÿ.3bÿ¾ÿÝèA”ÿÚÿÿ7ÿ×ÿea)ÿuÿ¢ÿ§;Q¿ÿZÿŒÿµüÿìÿÿ4Õÿ,~3šÿÉþUîþ(þïKa«ÿVþdÀYþéþxjÁÍþrÿ†ÿ}ÿÿ§ÿnþ…r§þ˜þ? QÌz¾ÿñþ‡‹qXfþvýjÿË ÿ%äÿ7þ_þ¹ÌVüþ-ÿ©óÿrÉÌýüÿ‡Š°ÿéþ³ ÿ\¯ÿþ©ÿ¼8œýoüËýua×ÿÝþ=þ­Øõÿ,Y9<ÿ§ý7þ)þŠÿ°{ *ÿ‹íùŒüº$XXÖÞªø'òmò§ôöÉøÿi ) Ðî Aú÷kú ü¹úTý7—¢Œö\müHùªfý]ô¨ù é ß  õpèuëÐð»ò^õÕþ}_ h " »÷FñHö8ý‚÷CùÐðL OUÿŽü(ó§úÔ÷úì÷ö cQÐw< ~ë‰Ô*×3Ý{ãþïû#þÂ|ïeæ³íÓóËó úå ¾ÞR’¹úðÇé/ÔónÝTöG 2Ž-±Ô#×¶Ò2´@ËËÃ×ùàí [;ß8#j#Ñ!XýcÛq×»çÔê›ñçÿr€!r(Ž iæ¸á6ûÃ÷uÙø÷V&ª<‰/ŽÌ§îºÐïÙéë—B¿@s"ætWø½ÍâÐ_èðó:ö‚''1ÿ/"íèá<ÔÂã! ¹èÅ 9cA¨+´Íùµ™›§¹dμãû-3NS=~}íþ…åÉÒº÷ûÿüx!Ô5¸%Ô¤÷|ÿÖákÖ>ݲýW‚/ã¤):U0É(ê"#Lî=¥­ž½yƨØl X8Mò:´_aþÀÓ ÊÍÚìñ ®(Ó2ãÎñøaígÕí×Ý5ö +‡ÈÝ#3.>5/U;¡ø[¡}–[³³ÂµÝ05W}?V ùFû×Ï'Ã7Þ–ùþ C44Ž{ùÚì®î„رÓ¦üÃÊ3}á'òøHû0áCkܳFŽÂŸÜÁ¤ßýä0—\óHN% Þ÷iÒ—»›×'ýØ Ö¤-8"zûèJälàË×aùà Œ57Ö"dÓ¶ìå/®'¯Ð´d’ɶ ÃZÙl )XÉAý\®ö@ÌýÄÙ úH0š+»58ÌðvåÛ­ãðáeý^Óž6› ·ÌÌÞ7/Q(³Û÷‹ÀŒ–I¶æÈUØä1HUaBÉNü»ïGÇÙ½'ã( T¨/3‰(ð òìÜáçtß-ðÅz ç ëÔ¼MÃz1‘*/) |ÅÜǘö¨1ÕÄጪ,AKNêTíRåeÌÇ6â–ÿ2$Ý68-î# ?æEÕ3Ø#â½ûZ –#V+}ê ºüj¿dÂŽ3§: 1#O}ØFžÆ¢Îxð; 1qM‘HÇ‚ä¸ÌÅÍtÌáS Ä2’B†2¹˜ºç,Ñ[ÎäV¾$l$‚@gñº·ÅP¥-67ð.ì'vîÝ ª'­›Ð]é ¦,õFÜEpêåÚ!ÓÉ9Û–O+5=o,aå eçBÍÓÏ‹ßÐú[Ê p-‘%­šù6Æ¿ÿïc#ù20²$±ï º‹¨QË,èÎá&£=Ú=})ù0ÚI׈Ñ~×1÷Ò5ý7?"â !õNÙ¤ÈÔsô< ‹"¨&à #àcÈÂrñÙ<)y'–#QyïÚ½º´šÍëäÓý^6  Á ÛØü!õ‰ò#ö§þûéŽ eËñWè!úv/ Y*Eö}ðØç²Þ åËõ ¼Ó + Îêøoð1ð×õ„  & | ?Øÿ÷õãõÃü~ýI“ÇÐ øòðŸùß r"móí7ì©ètë¼ñÏýá÷=ó©òñü¹c ù ¦è2¶þ­ûÂøúù4ûsl°Ë[þ,÷)ùÂNòæÐòé ëæïRó†õSÿ6 xiÎý„úÄùOù@÷Áùüþ_Ø ù(fÿ]þ ûšúúäýÚÿ­™xöýÓø°ûZ wê®õ•êcêÇï õºùA ® bs xÒüøGø8øúýF] tµ1Zþü;û{ú¥üÊülÿsTÉ@ÿsÿéJ(¤ï÷âì°ësðÓöü™’d ˆ Î &÷üÀø÷®øhûþþFî¶L5¿±ÿiý!ûžûvûýgz›”ÿˆ±)ŸXúýðÊížðÚõZûäÿN   Q @ÛÿûLøB÷nùóücÊhdu–èWtþýÝú¸ú'ý~ÿ.ÿ&ÿ¢àÁ Å ý$ºöÄðÆðÒóïøÙý/P¯ËòhÉC ûåøøú(ý ¯ñÝaI n¾ûýÈû¶ûãûƒû„üïÿ:† à t TüIöMóëóÒöcúý§ÿA ± _ÿÚüwúÙùÚú«ü þü”|WôSéêqÿŽýøú1úüi® 7 È[oûD÷¯õ÷kù:üþ,ÿQþ ÆVFKGþßûÔúSû´üŒþ(,pX¦(üþ!üWü[ÿC3T Ít¥û¬öËô:õè÷'ûõýÕ[îqª &¤þuü)û2ûuüßý‘ÿžÊ»±ÔFþü§üYÿú¦ "Ì<ýgø\õ½ôö¨øÁûªþtº˜d«Œ’#²ý(üûAûxüþéÿÿ¿ P&6nEþ þqÛáI4lýùáõAôÖônökùÿü¹Î!mÒ+XÕ¦þØüzû:ûÄûçü¬þ·ÿô¯$~ÁJ#ÿÿþúÙ+"þ ÿ¿úB÷äô(ôõ÷úùýe¼Cf«§à(Üþ²ü|ûûû üýPÿæú-ÀKlG+ŸD@Tÿhûp÷ôóCóõøÈû—ÿ^qÊ´ ~ ÆÙ ÉýÔû”úUú:ûöûEþ7ÿ.p÷Ð)^BY#NŸQÕþ úÝõíòyñòtôþ÷üȾb/ ý 4 8Åœ/ÿOüáùÄøøøúzûžþCzd‚ˆÞቮ [qoý©ø"ô€ñð`ñôóü÷ÔüÌýK  ¢ – É˃©þü-úaùúúÕügþsè×´?êÁØj k !,ýš÷ÌòZïgîÉïóµ÷»üdýÌ ° ç ¤  TOEý[úrø4÷5øxù'ý`ÿÉn*Q¡i  ä í@›ûfõmð¸íÙìËîóÝ÷¼ýÇå · – ª ¢£C‘üVùøH÷Àøúý;­ ýßœ¼ ™ × ä „€û¤ó±í‰êêÍìƒñ øóþƒz ÿ û~ð ÖihÿNû<øPöêõ›÷ÖùTþÊÌÕ/e°{6 ú ý ü J¸úŸñ®êKçêçgë/ò’ùÓ{ ÉAÞ k¼BþúH÷,ööSøú´þ^Ý)²%|1 ß ÂÔ Â×û×ðèãäøèÒð–úòí 4Ê·£ ýû0ü•øêõyõñõ6øû®ÿ!i‚Õ7鉥G ¸¤úôýûñ¦çŒàÂßáä2î—ú)«ç™ž7 ÇÛþÏú¢ø7÷!÷—÷0ùÊú þ%ÍcþLÄ,h·/U—> ðÿbñ~äÓÚÙØ›Ý™éù 4ÊÖCÔœ„ýQö’òXò/ôóöØùöü ÿâ¸o ‡ òkòÿ|·ñÌþgú ê‡ÛUÔíÕ³àcñú*iÙë]‚hÿØú0ù øùKùYùù9ûý‚ªo 8 ˆ Œ0ü÷û:³7 Iù ä¤Ô;ÐêÕ˜æ±ùÚ ”€Í ’ìvšÿúü®ù”öõ|öâûÃÕP Æ s ›þvöKõ˜ýÌ ü«#3¬\ï䨰Ì^ÎÙÛÿï&ç©â u †·ô C ÷%ûàòhîçï÷ÝÿGà Ÿ .Ó6¹üÀ÷›øÁ8>%=(C5!åÏÏÈKÏâàhô–Ä , ñ ¯ nü“ðÄ Âý\ñKëÃìªôìüóöU®k ?–þ\ø¬þ<K%I,ëÅŠÞˆÈ ÅNÔäégûöíWÿ`nƒ*#HW9þ}ñ(ìdï¿ôœù•ûñü¶ü ·á Gb$'õ^ñ6ÿ<w+,)XíÓhÌ­ÖËèàô)øŒö÷ÈÿŸ>I#µúy,ôêñòóÏõ_õEõø„FòØ~ ã 0 þ{òþï·µ.Ó'› éèÒWуÝXêKïÍìØíÅ÷Ì Þ$! ÙWÿºûý÷&ô7ðñæô¡ûþCE  r í ˜ücîríõq"Î1ì$¯›â\ÓOØ&âç]è’çïñào,ç JÿõÆëÕë ñ¯öWûÜÿC} ÉR^ IûŽï?ïK%T0 _ÿvâ×°Üjà¾ßáöç®ø¾ ¶‹@HÖü…õèï~îØïïïÓö4: >QÄ Ž¿ ý«ìÁìaB&¹,©øKæÀãÏä(Ü$Ö¦Þöó xþŒ ;Ý Èûlô‘óŸó²î¢ë¬òž X É ì ! I¬ ¾ô¸ä}ïl <(L'¬µÿäõbí#àHÑnÎVÞöñüþª é&‹#7¡Üÿ¢ýÞö–çãYêAøo¤p J>mlóëôðÅ#((±ùõç“ÛgÏ\ʂ֓êQú°¡9&_'šw6Šú ò‰ê+çõêÜòûî ¿ ¾!$ Ë !ÔïJæï}Š$­'òZ Îzñ¼Ý\ÍþÊÜØ<æ{ïáûf'‚"¬T DÌñšé‡éÑíxï5òûÈéû  òAå—ò- &¦¿ÎB ©õLÜÆÏªÒ%Ýãàå€õ¹2!?!Lá„n ÿïììï¸ëxè!ïþÅ <æ¸] 1ð´æôõ» ´êÿ ‹ðùÖHÑÙÒ£ÕiÙ¬æHý(ÈÅß%ø'¯ ·ú¸óæí¹åìâ„êk÷*f Irw}8*Ùí”ãuñ´CÆd¶òJÛÓÆÐ Ð¯ÔHäýî½#^+,á¹ (ùGñÁéTà ßûëUüŸ hfž ÷ Žçé%áì{°Ä;’"›Kð ÝpÔ'ÒΛÒ饋Öf'/¤'ÓÔHûðþåvà‘çSóøœT¬Ñ’Ú òöˆà‹ãàõ¢ ž"÷) 'HFðUßÓDÅ4ÆjÖ&îÐ ­$ë1/L$µçJö\å7ßwâôåÛîûÐ éØF€ïÿþtò_Ý«ßÆñf:Â$‘/,—öiãÕÏÒÃ{ÅÒ½èþ( 4ê19(”ñ âàÛkÜCáÊíýÜ ¾^üfz~1ï?ÙqÜýêŽ5U$Q1-/ØûDéÏÓDÄÞÁÏäsø:Ò$Ë4X3,å¼ bøækÚQÙóÛ¥ã,÷üH!å#ã#)²òÍÖcÔÈèJü& ^/1A þªîÝÆûÁ(ÎLÝ^ôši1,7º,q#Ð49ê³ÚéÔ^ØÞþëÌÒ!Ð#w+# Ú ùÁôÿØ Õnà…õ\ ÆÎ-1³ øðêÜÈœ¿“ÊÛ@ìQE/ñ6Þ1á*ðŸÑíjà«ÔÓ&ذåPþZ ÂT*Á0"bµÔû?ØUϹàáòžNÿ,Y2†¤Äö7áÑÇÁ‹ÌCÚ$é¼üñ_/y2C.0» "Ïó}åÚ ÓYÕ•äïúâ1Î$Ö.±"Yp+úÚmÐäC÷ØÆ.@0åûúYì>ÛDÄ®½×ÊÆÝñWÝ!¤6ð8“1ð(HMÿêéGÚçÖ>Ú€Þ]ïõm¶3!æ"cU …ðÏÖJÕêéGnv(Â360ÕõÓß#Ît¿˜¾"аéu~µ-B>I:+³r×ê9ÖðÐãÙ'å¡óÏ2b #0¤7òàí2æ‘×ÉÞÞùQ2)„0é1)v éãdнǠÀ½Æwßðÿ¥a+ã4€9ƒ-c*ø™æÊÙ»ÐÉÕ>ç£û§È•%á&·£ Ðû&íyß¶átçÐæÒóN¾+6*3ú#£ 7ï€Íó½%ÁæÌÎáÿÛ´29õ1÷! ‡óÝÒÑ:Ò0ÞÚðÑø¢+=,K$Å`û€çtÝ_Ö¯ÙÆðªÁö)y8=0ÖkÊìÑC½ƒÀj×ññb 0!¨3õ5](´LûÁçCØ*Ó¼ÜÚðGú¾+³3“,qêøá6ÔÈÌÛÔåïû¥§'¹Ú!Â%rI ¥øPëWÔÔÀ4Çâlø5 ¥e+D/‘!£Oö`ë”áþÝÃæóøë { "^: i÷aì8âQâdè÷÷… Ï™"]³ð£š 'I´>ÿƒæCÇüºÅÍýå!øU 2 3†0ºtøxìÝ>Þðë&þAˆ11TÇÊùµð‡íÖî»õîùéýoÓþð`'€/çÊŸúoé{Ê»NÉ›ævÿÔ ‹6-v0k§<óoï˜ç=Þ5åUü2¯“iA¾ ðõÉìhïlðáîüúÏ1 Ôÿ¥ùŸëuýj†+5^ „/ð ÔŸ¾ Çûâ(ù%'h,, —õdñÐí•ãòæÜùë ¸Ÿ¥˜ ÁüzîUîqøMú üáýmuXôEæ›ÿi#O0qùSí¹Ò$¿:Ì4ìXa­)"†(0ŽýŠïî$ï!ì“ï5¶&ã d Í5øîð-øîüþ = | ’ –ïxâX÷TW5Ò)j ‘ö™é&ÒÝÁõË÷é C[I#ÉOýSêNäÉë õ ú„ f.9 ]ý9ù(úõòƒóÚþn¹ ì¼ò| :î™à'öI ~9=*½Vó"äkÒÌÄ¡Íì µì Œ¥½çú¼énåžìÂødý1ésÊû ù ùˆö«õx÷Ÿþ  À»ÿqTêûâ”ü%;Ž"å{Ñ ÎWΟÐ{߀1&84Ö(ëÞšüƒñÈâÄÝjêþûç ,KP:'ú]ì çï¤÷ý÷‚ 0+ýøûƒýÌéÍß.ïaH¸HŸÌè!ÍéɆÐ]ÔÚ¤ó©a/66(ýHIñòàNÚqÝôë0œº ¿!Ѝdÿï{ä âãêùõåiybDþŽàêÐæ+HRQo&}ôÔÊàÎÑÎÅÌ=à„'Œ;\6Y#t†þê¢ØÒàÛ°óÏ Õ%")$²ÿ_ìà¹Þæ‹óê=c,ïúuܧÏ%âøGªRT(øJÕœÌZÍ»Í\É}Ú}ú%" ;>©)r(þíÖÞ>×,×Xè!ÿ/%]+#}lëïVåQã­â¾íCüâ Š—Üv ÝEäûÑîß­CþQÎ-¿÷*ÐnÈÐUÖNÕêÞyúžu7 9´%ž :ù"ì3äÞݲÞë7‘#_$ƒ Îý ò×èáä´çíïDÿ÷«ÿï¼RýÑåmÙ-绀CžP ,ø/Í¥½ZËÏ×ãÞ3ëþ$Š3"7Ã%° .óXä|âSâ”æôô;]ç"ú!&U`÷í*èÓê˜ð_ùK†ˆÏí öÿ‘ýµüØéûßÎéyÂ@²Pº/¡ü=̺lÃëÔááÂò>Kk.A2¶#¥ aóVäóß#ãŒízúWžæ°iäIüÎò‡ëSê‡ð6úõ5  Ð ù5þâú_í*åaï“G5C•+EþnÔÎÀÜȉÛ?ì¬ùÞ'N#à'ÆX Có¢ä+ä:é²õ“( gF17Köïìíåòjú¶Ÿá Ÿ 6 mô;ü ð®êÏñj µ)•2p ßÑÔ"àôïŒýdBR5›2ŽòÀë5ë òü¢f fû · xèýqö<óCôCúÕÿ† k_·üÖürüîö“ó€ùŠ B"G'4ûhâ ØJÞmì¤ø:7ŠžÜ @ýôõðàóhúUÓ 0 ² ÃÚÿèú*÷‹÷û„v`¼®?ÈýøýÏýùàöbüÚ úü)éá¡å”ð×ú›: • ñ ¾AüÙô€òïöÒþ•ñ­1§üŒúúæüuÁæ"¸êþ“ý!ÿXáûMùü‘U¼bÿì ãbæñúûæPÉ ç V¿ÿÈø®ôûõBüɧÐH%ÿ-ý^üüEý¶ÿžHeüÎ8þõþ(ÿ¿ûpùªû…‰zÕ+gï%âåáQë.ø'z † Á Ø2 ûóõfó|öRýa4 × $"&2ÿEýŽüéû[ûÑü&]þ¨ Ôÿ¦ùêö@ùOí6ħ&ócãáßtæ6óÐÿá¡ / ¿ ‡ `BÄødôkó ÷þ,µé òLô êü¸ú ùÞø¤û_þ+›*fAýõ÷Þ÷,ð¾#¥¹óÏâµÝäòyÁ ! ˜ ´ ˜ 2©ý8÷¥òOólø×CÜ v ÄðYÿ)ý+üÛûCûQûRüøþ´c^µÌïüËúJþý } ·múŠïÎêúíÚöè]s ·@u4ˆüü%ú•øNúìýx÷#T Ýÿþ]ý ü&ûóû þ‚˜#Šÿ(þ³ý…þ‡ÿ ’•Ôëþ\ýçû1ûÏûkþdv¡"}µÿÊýýýWþòÿÿ J˜ý?ûÑùZú‚ý`­“¨ã]dûz÷5ö`øQüº±Š¼YPÿ±ûâùÈúçüùÿÉa3&àÿùü\ûaüXÿ¢ mº§þ²üqûýßÿFÌü!®ÒüÁùÿø­ú·ühÿA;ÉÄiøþ³ý"ý8ý7þvh½êÊi5m[þòý þ‹ÿÿƒýürû±û7þ$:ZÈbþ¤ûœúSû+ýÿÐ[ ^þRýÊýÿv¿Uÿ„ýòü'þæhò¼þŸü üýKè:ì}:þHû:ú[û ý8ªÿ‚‘þ+ý¹ýKÿXdü™ÿ‚þ…ÿñõ’oÿÏþ^þ^þvþ`ÿ#â¤þÿ†ÿÿ”ÿÁ•w6ÿÿõÿ®0ø}ÿÿ£þJþ-ÿÈÿ›€ÑÿšÿóÿÅÿ!ÿªþ¯ÿë¤éÿpÿŒÿ'*'ñÿñÿÃÿ¦ÿYÖ@«…bvÿóþ^þøþ%PÞ3MÿBþDþ>þ0ÿC ÿ³ÿÀÿÌÿ!"¥ÿuÿ4ÿÿ¡ÿ´ÿu<ÞJ4öÿ²ÿ\:°ÿèÿÊdÍÿÏÿKZÿåþÁþiÿsŸŒ‡§@f \¨‹ ÛÿÌÿgÿÿÎþÿþ‹ÿ°ÿ²ÿ&®éÉ%\qv††ýÿMÿ%ÿFÿ=ÿ™ÿýÿI·7>ñÿÿÏÿ$‡Ûÿ“ÿ¡ÿMÿ4ÿ4ÿÿ§ÿg¹·ˆž€õÿôÿ/¡.þÿcÿáÿïÿòÿåÿbj©:,=¹ÿäÿ¦ÿjÿáÿLÿVÿ(ÿøÿeÁÿ#rucÔÿ$ u?3["¿ÿßÿŽÿtÿ¢ÿPÿõÿgKŠÄÿnÿ}ÿWÿW[`¬q²>Xj­ÿ‡ÿ(ÿ½ÿèÿ ôÿ§ÿ˜ÿôÿ«ÿáÿÊÿr~©¹ÿèÿ½ÿzÿ¯ÿ%’ªÿ¿ÿ ¸ÿ=tÍÿÓÿƒÿëÿ¿ÿÀÿ·ÿÇÿáÿz2s=ûÿQ7wU;Uÿªÿ¶ÿÿ2ÿƒÿ¥ÿáÿIÚÿ|kw×ÿìÿÐÿFi!b›ÿ3ÿ=ÿÿÅÿ¨ÿfy =Øÿ'†þÿîÿa»ÿD®ÿGàÿÿÿ2¨ÿ•ÿNÿ‚ÿÛÿp kïÿ—}lÉÿÊÿÁÿ!Ißÿ ÈÿìÿêÿñÿÄÿ¾ÿÀÿãÿçÿ*aARZ¤ÿÊÿ—ÿI.þÿÌÿcÿÿrÿðÿŽâ&åÿ†ÿ•ÿÿµÿ%c ÔÿI'ÑÿQ‰@PÿrÿÕÿ¾ÿH€ÌÿµÿÊÿ>[ áÿ•ÿÍÿªÿF÷ÿ&Õÿßÿ"ÆÿJ„ŸÊÿœÿ¸ÿ=ÊÿÖÿvÿåÿi~pÿÿ~ÿ?ÿ‘ÿÁÿa¼B£ÿiÿÅÿÅÿÊÿE£Ð(¾ÿÁÿ&½ÿéÿ©ÿ'õÿÛÿRaIõÿÚÿ =œÿÍÿ¡ÿ’ÿØÿ3_#Ôÿ“ÿÝÿ üÿëÿx$`e*¾ÿáÿáÿþÿÏÿØÿëÿ Ñÿæÿ^XG3ÂÿÃÿèÿ6Ùÿáÿ­ÿ)$ Îÿ¡ÿ¼ÿÙÿ%ýÿÅÿÚÿîÿx,,e ãÿ—ÿÏÿ6W(;ãÿÊÿìÿïÿ8ôÿ¢ÿÉÿäÿ3ñÿðÿ®ÿÞÿÖÿéÿäÿ2A\c!÷ÿÆÿ¿ÿÐÿ Bäÿºÿóÿ×ÿãÿÞÿ æÿÍÿ:#àÿùÿòÿêÿôÿîÿ*äÿÂÿÿÿêÿ &íÿåÿýÿõÿ3(òÿÏÿñÿîÿõÿóÿ*èÿçÿ ãÿôÿêÿ øÿîÿòÿíÿ÷ÿåÿ*äÿØÿôÿíÿüÿîÿàÿÝÿøÿÔÿêÿâÿøÿ ÞÿÝÿüÿ3, íÿüÿ,íÿØÿëÿòÿéÿõÿ*üÿåÿåÿýÿ!#ÌÿÛÿòÿ!îÿãÿÛÿ öÿ ãÿùÿæÿ"ùÿØÿüÿâÿüÿúÿóÿòÿàÿìÿüÿêÿïÿöÿïÿûÿàÿÔÿõÿ$ûÿ*îÿÚÿÿÿøÿÒÿÓÿûÿíÿÿÿÒÿõÿùÿ×ÿôÿìÿûÿ$ÿÿæÿ üÿðÿñÿ<öÿ îÿèÿÝÿ òÿàÿ÷ÿ9 Ñÿáÿ äÿìÿüÿêÿØÿïÿ÷ÿùÿ öÿùÿòÿ üÿÚÿÕÿ õÿøÿ0ßÿñÿÛÿùÿôÿüÿñÿíÿòÿ öÿãÿÿÿçÿêÿõÿíÿ*Öÿîÿçÿôÿóÿ àÿ÷ÿóÿòÿ óÿ2 Úÿñÿ Ùÿóÿ! ôÿÛÿïÿ êÿÜÿðÿÝÿåÿòÿóÿðÿóÿÌÿ ÷ÿ÷ÿãÿãÿðÿ÷ÿ#òÿîÿäÿóÿòÿÿÿ -Ðÿ Ýÿùÿ ëÿóÿåÿ%ûÿúÿîÿ(öÿõÿáÿùÿûÿ&ÿÿùÿûÿüÿùÿ×ÿíÿ÷ÿ% åÿúÿ øÿ Øÿøÿ÷ÿ" úÿýÿôÿèÿöÿ ëÿøÿ)÷ÿðÿóÿéÿñÿÿÿÛÿîÿþÿøÿíÿàÿòÿîÿÑÿùÿùÿíÿøÿÿÿÓÿìÿãÿòÿøÿåÿêÿûÿùÿàÿ ýÿïÿ( èÿìÿôÿ ôÿ) þÿúÿâÿïÿñÿôÿãÿ×ÿÿÿòÿ!õÿÿÿ#ëÿ×ÿúÿþÿùÿéÿúÿÝÿêÿøÿ öÿõÿ þÿûÿØÿùÿÿÿ ðÿ"ëÿðÿöÿ( Ûÿ þÿáÿßÿôÿýÿ õÿûÿùÿÛÿíÿúÿïÿØÿïÿýÿ" ïÿñÿÿÿêÿæÿþÿéÿ*àÿõÿüÿêÿñÿýÿíÿßÿùÿþÿ úÿôÿöÿâÿùÿ èÿöÿèÿêÿ øÿëÿ ÿÿìÿÜÿøÿßÿíÿêÿ ÿÿÛÿêÿøÿüÿÞÿøÿïÿýÿùÿçÿ þÿ ýÿüÿ ñÿíÿùÿóÿåÿòÿëÿ$êÿéÿôÿñÿ)ëÿ þÿäÿôÿóÿþÿôÿøÿ+êÿ òÿíÿíÿúÿñÿ! åÿÿÿÞÿ ìÿìÿ ýÿüÿÔÿÚÿõÿóÿöÿ)èÿ)Üÿïÿãÿðÿ ôÿ,íÿ÷ÿãÿñÿ øÿþÿËÿâÿýÿ ýÿðÿ Îÿøÿòÿäÿ+ûÿòÿïÿèÿóÿ ôÿýÿúÿôÿùÿýÿ0ãÿïÿíÿíÿ÷ÿòÿñÿùÿ àÿñÿ,ôÿÿÿüÿùÿëÿøÿ÷ÿüÿþÿ #êÿ õÿÐÿìÿûÿäÿÙÿåÿ÷ÿôÿ/ñÿìÿïÿïÿøÿðÿ!Üÿöÿ.óÿúÿèÿúÿéÿ ÷ÿçÿûÿ òÿèÿéÿ '÷ÿÞÿùÿËÿûÿ!ßÿãÿóÿ&ôÿúÿüÿÞÿñÿñÿñÿíÿöÿ ùÿìÿ úÿ(êÿßÿÎÿÿÿÿÿïÿ(ôÿéÿéÿôÿ.Üÿÿÿâÿûÿâÿùÿþÿèÿ üÿïÿäÿûÿùÿ'ßÿ÷ÿ )ÿÿúÿßÿ åÿÜÿ íÿ êÿåÿüÿùÿ.ôÿúÿñÿ÷ÿðÿöÿ×ÿüÿêÿßÿéÿ#þÿÛÿóÿæÿýÿýÿîÿ!òÿþÿ óÿôÿùÿåÿ÷ÿîÿ÷ÿùÿ íÿîÿþÿíÿ øÿñÿáÿ þÿñÿéÿúÿôÿßÿ ýÿöÿ éÿùÿ ýÿôÿöÿ ûÿôÿöÿöÿþÿïÿþÿ ïÿþÿþÿøÿþÿõÿýÿèÿìÿ ûÿÿÿ  òÿîÿìÿ øÿñÿõÿ ÿÿþÿùÿüÿöÿýÿ úÿïÿöÿùÿûÿþÿþÿøÿþÿúÿ ÷ÿóÿûÿõÿÿÿôÿõÿ þÿøÿÿÿ ýÿþÿþÿòÿþÿùÿ öÿòÿûÿ ÷ÿ öÿûÿ ûÿþÿòÿ÷ÿ ÿÿÿÿûÿ üÿ øÿüÿúÿ ÿÿÿÿùÿúÿ þÿùÿ÷ÿýÿýÿ ûÿñÿõÿþÿóÿøÿ õÿÿÿøÿ ÿÿøÿøÿ øÿ ÿÿúÿøÿøÿùÿÿÿúÿÿÿÿÿþÿýÿöÿ÷ÿ õÿóÿ øÿóÿýÿ þÿ ûÿôÿüÿ ýÿõÿþÿ øÿïÿ÷ÿñÿúÿüÿÿÿ òÿúÿýÿ þÿÿÿûÿòÿþÿÿÿÿÿüÿûÿûÿóÿòÿúÿ ýÿúÿúÿ þÿûÿþÿøÿõÿðÿäÿäÿôÿ ÿÿüÿýÿÿÿþÿúÿþÿüÿ óÿöÿûÿùÿõÿêÿìÿóÿ÷ÿ üÿíÿåÿåÿåÿåÿãÿçÿíÿñÿõÿÿÿ  ýÿ÷ÿïÿãÿÙÿÝÿäÿìÿñÿûÿ ýÿúÿùÿùÿûÿúÿýÿþÿÿÿûÿûÿúÿùÿ÷ÿöÿøÿùÿûÿûÿüÿÿÿ ÿÿýÿùÿöÿõÿöÿöÿõÿóÿóÿñÿðÿíÿéÿåÿêÿøÿ '.33,øÿîÿíÿéÿìÿöÿþÿýÿýÿýÿýÿúÿùÿúÿüÿ÷ÿòÿðÿùÿÿÿ  ñÿîÿòÿýÿ üÿõÿñÿòÿìÿéÿåÿæÿèÿæÿíÿøÿ    ÷ÿñÿðÿòÿïÿîÿíÿðÿñÿñÿîÿëÿéÿ÷ÿ " "&# õÿõÿîÿåÿçÿäÿÞÿßÿÝÿåÿúÿýÿ ýÿýÿûÿûÿ óÿåÿäÿêÿýÿúÿýÿ ÿÿöÿñÿýÿùÿûÿðÿ ùÿùÿýÿüÿúÿÿÿüÿÿÿûÿúÿüÿùÿýÿ÷ÿûÿöÿöÿôÿÿÿÿÿñÿúÿíÿæÿëÿúÿýÿ øÿéÿëÿìÿúÿñÿôÿ ùÿ ûÿøÿöÿìÿíÿÿÿ   úÿîÿêÿôÿþÿúÿþÿùÿöÿüÿùÿ ùÿþÿùÿìÿüÿ øÿêÿòÿóÿúÿõÿ÷ÿõÿ÷ÿ÷ÿúÿÿÿùÿ÷ÿøÿÿÿ úÿúÿ  ýÿöÿ÷ÿõÿýÿóÿýÿøÿýÿöÿûÿ þÿÿÿôÿðÿóÿõÿöÿòÿþÿ  ÷ÿúÿúÿ÷ÿ÷ÿöÿ üÿôÿ õÿöÿöÿôÿþÿûÿýÿ÷ÿûÿûÿîÿûÿöÿîÿúÿ÷ÿôÿ  ýÿöÿúÿ  üÿüÿðÿþÿüÿùÿöÿýÿùÿüÿ  üÿ üÿûÿûÿöÿ÷ÿðÿ ñÿúÿöÿòÿóÿúÿøÿúÿøÿøÿ  ýÿ þÿöÿ  óÿöÿîÿúÿ÷ÿöÿõÿ   øÿöÿïÿûÿúÿùÿöÿþÿ÷ÿ÷ÿýÿùÿøÿùÿúÿùÿóÿñÿ ýÿõÿûÿ öÿïÿðÿþÿ ûÿòÿûÿùÿþÿûÿûÿýÿýÿþÿúÿúÿúÿûÿûÿùÿúÿ÷ÿøÿõÿóÿñÿ  ûÿ þÿòÿóÿíÿúÿýÿîÿïÿüÿüÿþÿÿÿ ôÿüÿùÿ ýÿþÿóÿÿÿûÿûÿùÿ ÿÿ óÿüÿñÿìÿñÿþÿþÿ öÿõÿëÿïÿüÿþÿøÿýÿüÿúÿ÷ÿýÿýÿóÿ þÿûÿ÷ÿüÿÿÿ ÷ÿûÿïÿüÿêÿéÿæÿæÿðÿþÿÿÿüÿøÿûÿúÿ÷ÿùÿ÷ÿ÷ÿ ÷ÿúÿúÿ÷ÿýÿúÿûÿþÿóÿüÿ ÿÿðÿòÿ þÿ øÿöÿðÿïÿ òÿÿÿóÿéÿñÿüÿ þÿ õÿüÿñÿéÿýÿüÿ  ûÿûÿùÿìÿóÿøÿ÷ÿîÿÿÿþÿüÿýÿúÿüÿûÿþÿ  öÿùÿýÿõÿíÿøÿïÿïÿýÿ ûÿÿÿ ÿÿøÿïÿûÿöÿôÿ   öÿÿÿöÿîÿðÿýÿÿÿ øÿïÿîÿóÿæÿêÿûÿ þÿþÿÿÿ üÿèÿèÿíÿõÿõÿðÿòÿñÿóÿ ûÿ÷ÿüÿøÿôÿøÿÿÿöÿþÿ  ûÿ òÿþÿøÿïÿøÿöÿóÿìÿóÿëÿüÿ ùÿüÿüÿ  õÿêÿíÿæÿýÿÿÿ   ýÿñÿìÿìÿñÿ úÿüÿîÿ÷ÿòÿôÿýÿüÿöÿùÿðÿøÿ  úÿüÿòÿýÿøÿòÿéÿðÿçÿ÷ÿÿÿüÿ üÿúÿ  öÿõÿ ÿÿýÿþÿþÿýÿþÿýÿÿÿýÿÿÿ íÿôÿèÿòÿûÿòÿóÿÿÿ ûÿóÿëÿõÿûÿùÿþÿùÿíÿóÿéÿüÿ üÿöÿúÿþÿüÿýÿûÿþÿ÷ÿúÿöÿ  øÿôÿüÿþÿðÿöÿ÷ÿûÿüÿõÿùÿ   õÿòÿóÿùÿõÿõÿ öÿ ÿÿðÿþÿûÿûÿ  ýÿòÿøÿèÿàÿ÷ÿüÿýÿ óÿíÿøÿ  ÷ÿòÿîÿñÿ üÿ öÿýÿ÷ÿöÿõÿíÿöÿðÿòÿ  øÿøÿòÿúÿùÿ ûÿüÿöÿ  úÿþÿûÿîÿôÿúÿùÿïÿþÿþÿþÿöÿòÿíÿðÿ   üÿìÿíÿïÿäÿæÿõÿöÿ   ÷ÿòÿõÿõÿ÷ÿ  ùÿöÿìÿðÿýÿ  ÷ÿìÿêÿìÿùÿ òÿøÿ  úÿòÿëÿðÿúÿ   úÿÿÿêÿßÿçÿåÿíÿÿÿ ÿÿþÿÿÿúÿýÿöÿùÿôÿòÿñÿ   ñÿïÿ ùÿýÿñÿìÿõÿðÿýÿ ûÿøÿðÿýÿûÿÿÿøÿúÿÿÿùÿ÷ÿüÿ  üÿôÿùÿüÿ  ýÿ  òÿçÿâÿèÿîÿìÿëÿúÿ ýÿÿÿïÿöÿÿÿ   üÿêÿðÿïÿíÿùÿýÿüÿýÿúÿ õÿüÿ ùÿùÿòÿþÿûÿ ÿÿüÿüÿ ÷ÿåÿæÿæÿóÿîÿÿÿ   òÿøÿöÿõÿîÿúÿøÿüÿüÿûÿøÿ öÿùÿóÿÿÿýÿøÿõÿöÿýÿüÿ ôÿúÿïÿûÿ÷ÿõÿ÷ÿÿÿüÿýÿþÿùÿñÿúÿôÿüÿ ùÿ  øÿïÿëÿ÷ÿÿÿÿÿÿÿóÿûÿóÿëÿîÿ ùÿùÿñÿúÿ ðÿíÿðÿ÷ÿüÿõÿûÿüÿôÿúÿ   øÿÿÿûÿ üÿïÿîÿñÿùÿöÿøÿòÿúÿúÿ÷ÿúÿ  ÷ÿøÿòÿüÿðÿèÿúÿõÿòÿ óÿèÿñÿ ÿÿüÿüÿýÿüÿýÿ  úÿúÿñÿþÿüÿ÷ÿ÷ÿ ýÿ þÿ ðÿóÿóÿøÿóÿþÿôÿøÿùÿûÿ üÿøÿñÿùÿ  ùÿèÿêÿìÿýÿôÿùÿòÿùÿúÿòÿúÿ   úÿûÿ òÿóÿõÿýÿýÿýÿ ðÿúÿîÿëÿïÿþÿÿÿ  õÿõÿëÿñÿýÿýÿ  óÿüÿóÿçÿïÿùÿÿÿúÿúÿúÿôÿöÿöÿ  úÿêÿçÿêÿïÿðÿõÿ÷ÿíÿïÿÿÿúÿþÿùÿýÿùÿûÿ  üÿ÷ÿÿÿðÿïÿýÿðÿòÿïÿöÿüÿ   öÿøÿöÿþÿùÿýÿüÿ þÿôÿóÿíÿüÿ þÿ ÿÿ þÿöÿíÿíÿòÿýÿ ñÿúÿìÿìÿõÿùÿïÿ  ûÿôÿýÿúÿóÿÿÿùÿúÿòÿëÿøÿöÿûÿÿÿ ÷ÿúÿúÿÿÿòÿêÿúÿõÿûÿþÿøÿ ýÿôÿúÿðÿøÿ÷ÿùÿÿÿ  ùÿîÿéÿíÿõÿþÿ õÿôÿúÿüÿùÿ  õÿëÿõÿúÿùÿóÿ ûÿþÿþÿýÿ  øÿúÿðÿõÿ  ùÿêÿëÿîÿýÿöÿûÿõÿüÿüÿ   úÿÿÿýÿòÿûÿ÷ÿëÿôÿüÿ  ûÿúÿòÿúÿïÿèÿ üÿÿÿ  üÿöÿøÿ üÿòÿçÿïÿõÿýÿóÿõÿúÿôÿüÿ ûÿþÿþÿþÿÿÿýÿ þÿ ñÿòÿøÿýÿüÿüÿ  õÿòÿõÿÿÿÿÿýÿ îÿýÿîÿäÿèÿýÿ úÿýÿÿÿ÷ÿûÿýÿùÿýÿÿÿýÿþÿýÿýÿúÿûÿÿÿüÿüÿýÿúÿþÿ÷ÿüÿõÿöÿôÿ  ÿÿõÿ ÿÿ  öÿýÿøÿùÿïÿýÿùÿòÿóÿþÿ ÷ÿíÿæÿðÿöÿöÿõÿ  ôÿûÿ ÿÿ  ôÿæÿùÿúÿñÿìÿùÿÿÿùÿ÷ÿùÿøÿûÿ ûÿýÿûÿüÿüÿ ýÿôÿñÿíÿüÿñÿûÿüÿùÿöÿíÿøÿ  ûÿóÿûÿúÿõÿ  øÿúÿñÿúÿüÿ÷ÿôÿýÿþÿ  ýÿüÿñÿúÿïÿèÿêÿÿÿþÿýÿýÿ  þÿóÿèÿâÿéÿòÿðÿîÿüÿüÿõÿûÿþÿüÿöÿ ùÿÿÿüÿðÿüÿöÿòÿíÿøÿüÿøÿõÿøÿõÿøÿûÿüÿóÿöÿÿÿþÿ úÿñÿñÿðÿûÿ öÿôÿîÿúÿóÿõÿûÿùÿóÿ  ýÿûÿ÷ÿøÿõÿÿÿðÿéÿõÿüÿùÿøÿøÿÿÿóÿøÿòÿõÿõÿ ÿÿ  òÿñÿòÿõÿôÿîÿ ñÿüÿ ùÿýÿþÿçÿåÿâÿôÿ$ ÿÿñÿàÿéÿòÿùÿûÿôÿÿÿùÿöÿ ýÿ ûÿéÿìÿûÿùÿ òÿùÿ þÿúÿ$õÿßÿ÷ÿòÿ úÿõÿãÿðÿèÿñÿëÿýÿ þÿ âÿÒÿóÿþÿ#òÿêÿ øÿëÿáÿðÿ)"òÿõÿ×ÿæÿôÿýÿ" ôÿãÿÒÿïÿþÿóÿñÿûÿøÿúÿøÿ6%åÿìÿðÿ úÿ ùÿòÿÙÿèÿòÿìÿ.Þÿíÿ÷ÿ# Ùÿèÿýÿ ùÿüÿ ÊÿÑÿîÿñÿ çÿöÿ èÿòÿâÿÿÿöÿ&øÿàÿ ×ÿÿÿÿÿ îÿñÿõÿÿÿøÿîÿëÿúÿýÿèÿ)åÿõÿýÿÚÿÞÿ÷ÿæÿöÿ! ðÿêÿ ûÿùÿúÿ ýÿ Òÿðÿøÿ õÿýÿíÿðÿüÿ)ôÿ îÿúÿëÿ ÜÿúÿèÿÝÿüÿÞÿ ñÿ ãÿþÿ ìÿðÿñÿñÿ ÷ÿèÿêÿüÿúÿêÿ òÿ øÿýÿÕÿíÿøÿðÿ ßÿûÿ ýÿáÿÿÿîÿòÿýÿéÿõÿüÿÞÿ÷ÿùÿ éÿ õÿ×ÿíÿùÿùÿáÿ ëÿ öÿ üÿÿÿõÿ 'ãÿüÿãÿûÿêÿþÿ ýÿöÿóÿÞÿæÿüÿ%üÿüÿñÿ%ýÿìÿ ùÿåÿ üÿëÿÛÿðÿýÿþÿæÿùÿ Þÿõÿ Üÿ ïÿäÿéÿ×ÿþÿ"ýÿóÿ ðÿñÿ îÿ üÿ ÜÿÜÿ ëÿëÿñÿîÿ úÿæÿêÿþÿèÿüÿùÿùÿðÿ Øÿäÿêÿñÿüÿ ßÿÚÿ÷ÿ+èÿñÿ%åÿþÿ  ôÿâÿýÿòÿÝÿÿÿóÿ÷ÿúÿêÿ ÿÿõÿüÿÿÿîÿéÿúÿþÿæÿàÿðÿæÿêÿóÿ ÷ÿ÷ÿÜÿýÿ"üÿëÿýÿõÿ(âÿ þÿÿÿãÿúÿæÿõÿãÿ#æÿ# ùÿìÿóÿ%ôÿúÿþÿæÿõÿøÿ% Øÿöÿ çÿÿÿôÿÿÿøÿÿÿõÿðÿèÿóÿ ÙÿÚÿâÿýÿíÿõÿçÿ îÿñÿìÿûÿêÿèÿ õÿ÷ÿéÿ òÿêÿîÿ÷ÿæÿ ñÿñÿ üÿòÿùÿòÿ ëÿþÿêÿóÿíÿçÿÿÿ èÿæÿøÿïÿöÿþÿùÿîÿùÿ ñÿñÿ øÿúÿ÷ÿõÿüÿÿÿöÿüÿïÿýÿûÿÿÿùÿ ìÿ úÿõÿ ÿÿðÿøÿ þÿûÿúÿøÿùÿ ñÿùÿ ÷ÿñÿÿÿþÿ þÿÿÿ÷ÿùÿ õÿûÿ÷ÿ÷ÿùÿüÿþÿÿÿüÿóÿüÿýÿõÿÿÿöÿüÿöÿõÿýÿ ûÿþÿøÿùÿüÿûÿùÿ ýÿñÿýÿ ùÿøÿúÿ ûÿþÿÿÿ òÿôÿùÿýÿÿÿúÿþÿ üÿýÿþÿôÿöÿüÿþÿûÿ òÿöÿ ÷ÿõÿûÿýÿúÿÿÿõÿÿÿÿÿ ýÿÿÿþÿ÷ÿüÿýÿ÷ÿÿÿ öÿùÿüÿûÿýÿþÿûÿ÷ÿ÷ÿûÿýÿþÿ õÿöÿ÷ÿúÿûÿýÿôÿóÿûÿúÿøÿÿÿüÿ õÿ ðÿüÿöÿÿÿÿÿ÷ÿþÿþÿõÿüÿûÿþÿùÿ õÿ úÿ÷ÿ ðÿõÿúÿüÿøÿÿÿ÷ÿîÿ ÷ÿüÿñÿöÿöÿôÿøÿøÿçÿþÿ óÿ çÿ÷ÿ íÿ úÿèÿÿÿðÿ íÿüÿ öÿïÿ þÿÝÿùÿæÿ íÿ êÿðÿøÿüÿÞÿÿÿéÿ ëÿûÿæÿ÷ÿèÿþÿÒÿþÿýÿ 2²ÿ ñÿ þÿúÿüÿ óÿìÿ øÿüÿêÿæÿóÿýÿ6âÿ»ÿýÿÝÿÃÿîÿ "ÚÿX¾ÿÄÿ&úÿ÷ÿT­ÿ áÿ,Òÿ6³ÿE×ÿ ÃÿÁÿÙÿúÿ < Ýÿ—ÿ3óÿIâÿùÿ×ÿ?²ÿG¼ÿTÿa—ÆâÿqæÿRÿJÿgÿâÿ2ÿÞþ/ÿŠ"4'¹ÿ ÿ†ÿ3›YÏhÿ'Åÿd]—`òþÒÿÿþÿÍÿ‚ ÈDË•ÿóý¡üVýÀþÜþïþØTÀtn1zþþZþâþmFÿûˆ“ÿ,ýøü üÈþ¨þõþÔþódëUg£LPÿHþÿþÿ“Ö†âÜahýœû3ü¶úìüÐÿÎÿn<Úô8þ8ÿ³ÿáþ6ÿw$"¥ÿ2ÿÿÓþKÿ]þÎý¿þšýùü=ýT-†)ý*ÿ­ÿ´þqþ+,eÕÿýÅÿÿõûOüÿûØ.#ÿüùìö¼õ4öb÷ÔûOÛ<=¢ýzûyú½úaüÌþ[´á?Ž`ÿÿÆü úµúnþQ‚% Ÿ ßýCúËõáó/óNõú0°jÈ Î B²ý”ú{ù…ø úòýd&¢@«àþxÿ“üžøÅøÄü „ Å Êùjóò_ñ¼òøpGß k N ´ÖEýúœ÷”÷þø8üÞ¨aËîÿ¼þJüºõ|õžüœ= Ù EL T¹÷|ððì–ì^îöõ…9o ÍÅÖ ì€üKøUõ'õ‰÷¿üÓmÉ Â;»þ§þÒú™ô»õŽü±µ á Žß .#÷Jð€ííëæîÜ÷¸^Ô j‹{ M¾û)øÊô5õ¢ø¨ýBÜ| 3’-þþOûÙôRõÙüšG LÆ  ê öaï­ì¢ëî ø¡÷Æ 9 ‰RaûŸ÷ƒôVôìùÿ±d Ð é“wý ýÔùôö%ÿ® S£ ÿô„îCëçêjï<ù& V£Tà ÿ®ù‘ö–ôÆô®úäoz \ ÆÉÿ†ü!ýÎønô‚÷<n ‡ JÞø výêòœìrééðpûKÉ Õ ýþìùÒõcók÷<üUåƒ; 8¡ëÓü®ü!ùbô¾÷óÿ6 Z,úò óü„òÔêþæèïîTûÎa Säð eÿú˜ô@óögû†ð K ª ÿ–(”ú‰òäõ0ý×P 2P: åþ}öTí’æåå3îkøæÿ$ ¾ñå TîûõMôyöã÷bý¬m¸» ÿ!èü¾óõ¶û&) aaû ÉþVõ¤ìÙæVåë³÷1þ¥1–Ú” qÈ÷ÐôÕõõ´ù¬ôæ á‡t xûÝø$ýÈÙ~{HCþ õì”æ‚ã îøöµú™Ü~ð & vœø™÷#ôSõûø9ýÏKË–š  üUùjþªÍyÞxýÄñRê„á âìó-ýZ³dr ˆëûæ÷ºöRôûö‹ø[F¯ð $œt½T ´ c·†÷›ðDèðÜâ(îÒð¾ùäzüÉdì Qkþ’û'ôÈïö9÷›ýNýnú MiŸµÉ Y§€ÿùòçåÍݪâ4è ï8ø>¨#oY}cüêó#ïEô7ò¤øsû‘­A j" T œ ÅJQwùÿïä¹ÚöÝ“ãÝé÷=R Ã:v JÈý ÷ôòÔïËõòaù}aÓœ ÉEððƒ`iý[òiå¼Ýqݶâ5æ‹ò=« ×dÙ¯G bøÖò~ïúî“îŽóÿ>à Ԍ°¬¯½ Ïõ~ç×ÝÝzÞIá•í$ú?ä€ (*P êþsøéñ,ïIì¥îµ÷uø)û'Žý7Ô*˜¤{ýIîãßoÜÜ=åÚð÷ûJbC™”òÞ™÷ëñ¥ì+ìlð8ñvôõþ*ë ¦òè—/$÷ì.åÌÞ/ÞéáÔéˆôÿÍ nMdøÀ u#ý'÷Ûî¦ì¼ïî¬ñáù‚ ¥vÝ9qü$ñëêþäýáOå´ëóò+üsÈD•b*¤ £„þ4÷±ð>îVðïòxú -0½ÓUû ýó(í’çåÌçÔí™ô~ý¬Jøn¹ L’ü0÷ò\ï\ð×ñåô¬ú‘ø E“›E ¡ü4óUí²éÿç¢êÆï ÷ÿú§+Àyâû Éû×öîñ§ð<ó#ô÷bý¹º ja ª¹úeó»í?ë{êíWójù®³Ë ÒqË ›„BüõøõxôÅö´÷úNþþBn ´ â ‡ ©Sü²ö…óòµñaóÊ÷Lü”踤 Á ã Ò…,ý¸ûùøŸù ú%ûqý'|õ6 nb°uÿüšù3øÂ÷ øÞùéû„þ·6Ds!í7 ¹ÿwýWü ü†ûûÇûþ É%{!gLWEÿÆý"ü\ûûbûëûDýþÿ€! ³*@$DÚ®þkýýÝýÇþq,þETMÿ`þiýÿüáüÚüQý²ýxþýþæÿŽ$Ïå…ö”’œ ‘±ÿŒÿ6ªù ߆:‚ÿÿsþþ¥ýÑý¢ýïý^þºþ,ÿÿrÍ?F‰75qÉYe}¦ÊÄŠŒ}Ùÿyÿ!ÿÇþÁþ˜þþƒþ¹þõþCÿzÿÀÿðÿ.O††»ž½¹ zysyb\<8 ïÿÒÿ¶ÿªÿ›ÿÿÿŠÿ–ÿÓÿæÿèÿÝÿìÿ "  ÿÿþÿ ùÿûÿ÷ÿüÿùÿ üÿòÿøÿùÿþÿÿÿýÿÿÿûÿýÿÿÿþÿ üÿûÿúÿüÿùÿúÿýÿóÿ þÿüÿüÿõÿøÿüÿýÿÿÿúÿöÿþÿûÿÿÿüÿóÿüÿ öÿõÿøÿúÿùÿÿÿ÷ÿüÿøÿþÿÿÿ ùÿÿÿøÿöÿùÿýÿ õÿüÿúÿùÿýÿúÿùÿ üÿþÿôÿýÿ úÿúÿýÿ øÿ÷ÿúÿÿÿúÿÿÿøÿúÿÿÿýÿ üÿýÿùÿüÿ úÿ õÿþÿùÿ þÿüÿþÿÿÿþÿüÿÿÿòÿúÿ þÿùÿ ÷ÿùÿûÿ öÿýÿ÷ÿ ÿÿûÿôÿ÷ÿ ÿÿöÿöÿûÿÿÿÿÿüÿþÿùÿþÿúÿøÿüÿùÿÿÿöÿýÿ÷ÿöÿóÿýÿüÿŽý2þ7”ÅFý?½ýÿ½!ÿÉÁü½ø‡ýõýûø²Óÿ}û:jùÒýåúô‰¯\ûÀýÛþArüEßútÏØà šüŒîù2ßµÙýÈxóúòûÉõÅ gþú‘ xWýƒû»6Œö ´û¾û²µýÚüRÿ×Sõ:ûNÍõ\Ýù=T/þCù¦²ýHhgÿÊÿéúÿoÿõþ³ÿÐ?þoúŸÿàúq ù þ\NÆÚ/e 3€ú8ë¹úeýºÿ8‡û÷îkø#äù£íÿبÿŠúi{ûÿýXÀùüìÿ zù©®ÿ|õTcf.úT¶û|ùñ'ûbý‚ <ù•ñÜ»¼ÿ]þÄþÎHð÷ÕIþVÕá éŠø„öÒõ} ¡û7 ßùÂÕÿ<ü ÿûû®ü' °øß’õ`1üÌþ# †þ“ý‚ý8éîiöݨÜÓõ| ¼ù; <óG8ýXcÔùõñ7û0þûÿ%ùþÛþkþ^þ+ úlýÂüý™¦ÿ(õªU Âò†õ& ÷üök óÓø}ýµ=Hš Îýû9^MÿÈÀû£÷­Šû 6üùŽc ³[û¤ÿ>šÿüw`÷¼Â8øFÿ]ø¤ý+Êÿ$üLúCM‡3ÿÆÖüüãþùø!tûÃÝùÊüŒU@üJþ·lÿ"PüMwý`¢þtÿñ_bÿJµxû9ùSþ‰÷`ü»­0ûü ¼þ¡þÈý†ÿàõÿ ›ý‹NþÁL¹ÿرÿÂþ¦V71þ;þáùÒþEÿ5ƒhúÝùj<4ûZþ þªæ×üýܺüÿ-ÿ^þûü¥hòüû„÷{ý\þxaÿúîùxÿŠþXmþÕúŽûqý * B ° €öüÖîë3ë¡ìôíÂòÍýOÎ LMþ ãÿ‚ú‚ú&õþóFûBYü&ÿ ¤þc ~öû°ëUâ¨á1æ¶êÊñ–þ= ›ÑòJC4;úÌòñpî îr÷ þÿt”¨$ Ö1;ö*äæÚgÛ%áËè³ñZ7ß*/ÍéàôÐë}ësèåè2öX}‹Õ$\'ˆ-7HóWÜQÑxҤؿâò'#Ú&:%“»þjñYåäàfàŽãMôÀ+‚ A©."1ñ#£²ñOÕÜÆvÇ«ÎÚ¨ê|Q©'x*ü)3%ÍîºõâçSãžßXá{îpü¹þã u-².L'a9 ìö ÞJÌÉæÍ$Ø[ç‚û©¶!Ü("*&ìB ìü-í…å÷ßœÞáèôzøËÃ)80)LÂ>ÿ‘æúÓúÍ}ÎÕ.ß„ñAæ­"¦(¸)"÷B;ô9ëµãêÝ¡ã'ë‘ïdü¨ù!»+x+Â#N¦ 3óîÞZÓrÏ=ÑuÙ!çûà l?%–(c&¸cô,èaá`á­ä¶åJðÓYç%ë)!'¶!ãÂXìQÜMÔ¦Ñ'Ô\Ý•ìúÿ6$t(D&Æ9 ó†ç¬ãá¿ÜÝãç÷O Æ{#&'– Nù!é ÞAÖqÓ×®âÞò½Gy!^#ó D~tœöîéžâåä¸îÈüÀçT°ÑÖ’üýñAêmä”áœæ§îá÷¼m1¶+âŒÖÊûböÓðIïò†øîý0J b3  3Iÿ}úâõÜòò‹ôÄ÷ªûÐÿ.³ ƒ Ž  ÊFýfùz÷Ú÷Èù üƒþB-`×àBw€ý(ûæùËù™úàû¯ý\A-pãÂG:áýMüæû3üØü¶ýÿª$ÙéŸ$IÅþ±ý&ýý9ýÕýêþ2k9Ìî´*-ÓÿÉþMþ!þþ9þ½þ†ÿIÍ19ûÿóÿïÿhÕÿÄÿ™ÿ 4íÿ÷ÿºÿ86‘HÿØÿ ÿîþþþˆÿÿ¯ÿ‹ÿÓÿ ÿ÷ÿúÿ_Ðÿd¹ÿyÿíÿ“ÿ¼»î‹&g àÿÿØÿ·§ê%èa²ÿxÿ¸ÿáÿèÿ‰ÿÅÿ†ÿ¼ÿzÿSÿcÿb1Ð ÿgöÿµÿZZIo›ÿÐþ7þ«þIÿ3ÿeÿ"8ó­$*Äÿ¨ÿ; ºÿ*5~úÿçÿ ÿ³ÿ8F”ÌÿØÿ+,ñÿHÔÿ´ÿ³ÿE¶ÿ5AÜÿ©ÿžÿäÿ2áÿÿÿ¶ÿþÿñÿV!,ýÿúÿäÿéÿ=×ÿ§ÿîÿÝÿ0æÿõÿÌÿ'K&²ÿ©ÿüÿîÿZJ Àÿ³ÿÿÿGôÿÜÿðÿ"Õÿáÿ* ÷ÿÙÿóÿ õÿþÿÃÿèÿíÿùÿ.þÿâÿâÿ:Ìÿîÿéÿ%÷ÿùÿÛÿúÿùÿêÿ$úÿêÿëÿùÿ#$×ÿ üÿëÿöÿìÿóÿüÿ÷ÿ ôÿñÿ ýÿâÿäÿ(éÿÿÿìÿôÿ  îÿúÿØÿêÿôÿ îÿðÿùÿûÿ!ìÿ áÿóÿíÿ þÿ÷ÿöÿ Ùÿåÿùÿïÿôÿ%åÿöÿ)ÿÿæÿõÿÖÿõÿ-õÿðÿõÿâÿýÿîÿõÿ çÿâÿóÿ ôÿðÿ öÿ÷ÿÿÿþÿóÿäÿ ûÿøÿòÿùÿðÿ éÿëÿùÿóÿ'ôÿþÿûÿ÷ÿ õÿéÿòÿ åÿ õÿ âÿ ôÿïÿØÿèÿçÿ›ÿhkÜëýVþ3ö£ü…Àïúûÿþ»i1ý3[ ¦ÿÞüàÿ§ÛzAáçül €øP ùW•ü“û¥äNþ%ôõúÍÿ”ûzü¹?ÿEûi•É#üPö‚,WúªíúÙù$Ÿ ìþ*ñ%ùüذü¶\û =úkøÞðËåñþ0 ¼ü¬þZÿ¦Ä‰ôÆúX oòýlÇ’Lþúý¸ þoÿ»Åõ1ô)%¦üìúáÅÈŠEûò÷Øÿ–ûW R"]átæ4þú Yb¼±ýsÓþ©˜åûÌü$ný%ìæzå;øm ´þgø €ÿnÿLøäúÞÂ¥üúŠýiü()¸ Q·gù§ü'áxöcœHúò?ý. u Ý·ÿ©ùð÷3÷¥ /y”î[ð¬÷þh . ˜úhý«ñ,ð§üû@þ¾ý‡òÿîX‹ ×ÿÉÊ÷øõÝ©×óçó¥ñ3÷§þ6“ LIöûñ±ÅþÚü’ Æ¥ÿwþøEøfÑûÒòù±*„*Z\(:ó,ã›ØDÐkÒÛééü Z—!bbüñqìdñÔò‹ñ‚ý› ãF Õªè¡ñ®åJÜ[Ó\Ö;àÃíGþ^ ãó "Ît² “ýô‘ë|çèë„ï‹ò—þ-ëM­!²a¼ò æœÝ®ÖÞØ&ä9ñâÿ³Ÿ b!ÒˆØhúiðèMåáéïúóÒÿ}¹!Àº tò æîÝØ×VÛÛæÏòÛ±R"×È¢aùÈï—è°å~éï|ôÄÿŠQJ å¾Kõžè¢àdÛƒÞËæ•ò% ¿Šø³ûü6óëçRêî¯ò=ýU qÌf!Äú‰ïçæ7áaáÏæï½ú¾`iÊj?e ›fùXðµêë¤ìaîÜö,· MíuÇÏ bÒ÷qîÀç¿ä¥æùëô!þ^ja¶Xj Pø³ðÙí?ì ë/ðùùGŸ 9Û¸_ äX÷ï|ê}è&êbî„õ“þ÷ š²] $ù÷óæîFê\ìÔòªú{æ Ldæ× Q„ÿ£÷âð7í>ìë—ï÷±þ äŽþ‹ rsü,õîtì/ð¡õýJr Âd< ? áü9÷Cò˜ïéñÍôŒø°üË¥³q ò p Žúo^ÿ@üvú%úÃú:üAþ+ uù7 €ÿ£ýbý[ý‹ýíývþÿµÿH¼- ÷§Eîÿ§ÿ{ÿjÿsÿ—ÿËÿ>mŽ›’xO{wJûÿôÿÜÿ±ÿ²ÿ¯ÿ‹ÿˆÿšÿ™ÿ›ÿ¤ÿÊÿÉÿíÿüÿÿÿ$+/#  ùÿöÿøÿõÿ üÿ ùÿüÿõÿ÷ÿ ûÿ$# òÿÿÿéÿèÿþÿÜÿæÿÖÿãÿÑÿÐÿìÿçÿûÿöÿ35:!"æÿÐÿÍÿ¾ÿñÿØÿîÿàÿ )'3* æÿÑÿÌÿÊÿöÿãÿýÿìÿõÿúÿüÿ $ýÿÞÿãÿôÿòÿÏÿ àÿýÿÖÿêÿçÿìÿñÿÞÿðÿåÿñÿßÿ+15>öÿïÿðÿüÿãÿôÿìÿüÿ÷ÿåÿéÿüÿ& ÿÿÿÿ ÕÿØÿÎÿþÿ÷ÿòÿðÿ îÿ ×ÿéÿ÷ÿêÿãÿûÿõÿ!$þÿ÷ÿÒÿÛÿçÿ *éÿûÿìÿáÿôÿÿÿ$íÿ! Øÿðÿ÷ÿèÿéÿøÿüÿÿÿ.úÿüÿýÿÙÿûÿüÿñÿýÿñÿíÿðÿ îÿßÿéÿ ëÿñÿøÿõÿäÿíÿüÿóÿðÿäÿåÿ îÿìÿàÿ,ûÿïÿöÿçÿùÿ øÿûÿóÿ2ëÿèÿÛÿ*üÿáÿøÿòÿòÿýÿ!ïÿ êÿÿÿÝÿÿÿüÿýÿðÿôÿþÿ ìÿýÿ,üÿ äÿãÿ"úÿýÿãÿ!åÿãÿîÿýÿîÿóÿîÿûÿûÿ!ýÿÙÿìÿûÿ þÿ-ÿÿóÿ ÙÿûÿýÿøÿÿÿÏÿýÿÛÿñÿóÿ "õÿãÿ  úÿãÿ ðÿ äÿóÿúÿáÿüÿçÿóÿÔÿíÿêÿ&#ëÿíÿ èÿ àÿ+øÿãÿðÿûÿÿÿLý—="ÿlþÊöKûFPþ úÿ¸þ¸Ò3û¦ú Ýþ£ÿÛ$ùG6ÔýŸÿ)ÿ ÿí1+ý'ýUüz¬¸!ýJæÖôý8 éÖdÊöØ­þ ÿD´ø_ü± Eúöó¸ùZývüañóÍ+ü¥èù#Gêÿ½ðù½üÓþ=›ÿµý;Íü´úõú¨üÓÝü¼ý  ÿòþ­aôþýÜúÅ6´ú¡ãÜûâ&úÿQÀûDÉúfÒ]ç„õ»öþ~ÿSÇÿ<»×ø÷OlýûEPþ§ýŸ‘Ýuüý™ôþvþeMßøpúË’ÞûgþÉþÙŠùÿý\û\Èëëótmúc4ÿ=þ3 ŽùuD]üßö|-0\û´ûZ®xõ8Çû<ÿhü'|üý´· ’ÿ÷²ûzÿwsô ôšùý/” ®þÀû2ô‰ÙïxýlûÑÎþ£šüRóÿÿ' ýôóÂ8ýÿjèÿGú±Ìù½ñŒø2`{ÿ5ëü=:úPIà÷Äkáö}üæ¬ïƒýóý“wºÿûýäüxRÿÚÿG°ý,þüƒ/e¹ÿþùU\ÿæúËŹùºØµþû¥—ÿÚ¾býdNþûCMiú¾“œþÍÀü}³g¯‹þçÆýXûþ÷ÿÂý¶ú·þÿ#ÿL;Ìýo:ÿæúlKþ¹ü8‡èÿ‰ÿéþxþ.ÇþòÿˆîXÿÿ?ÿ™χûÄþÂüƒ>ýDþš[ÿrÔþKT"þ0%°ýÉýr*ÿöIýÙ–ÿ ÿþÎc©ÿ{û¥iÀŒsýMžþ2|ÿR6þP_ý!Íý—ý{õýÔý({ýA<þkp›ü‹ß©ü–þ–ÿƒý„þ™ÿt ÿ üÈ/Éû NýIühLEùÿWÿ”þÆüxpþHãý„þ,Oýê& ìþ°ûV¾ü ÿwûðÿåÿ/ÕÿÒþ_Äý1ý÷ÿ‡ÿ²!ýœÔy¸,ÿTùúM’¥TÿAý)ÿ²ý ¯þ6C«ýu!ý‰ú(þýäß)ýõÿ~’ûïþ9äûò)Ëýçÿ¬þÖÿeþÈþ2»ý×ÿ]Xþû¦ÿYùÑŸžqÂþÉþâGû$ú´?ÈþÇÿ¸ýb3þÄh<ÿ¨úV;"ý›ÎIÿ=fÿRåìžÿýú¿ÿŸøøÿ4ÜÿËþoþ Òÿ‹†tþ®Yþ<ù†ãˆ`ÿÿ¸ÿ¯q§gÿdú|$úÜÿ}Ñøþ}ÿìÿú7$oMú6YHú{Q7úLÿÎÿRø£O’rýqÿ¯Àÿ{þ_þƒøÿ(ÿGÿ¿úãjù³ÿ»†ÿ‡ÿðþ\ý½Iÿšÿîþþwþœ±ÿ)Pþzù¸¦ùîà bÿ/ÿ%ôûpÿÎÿ%Žþsÿiþ ¿ýÓúŽó"ú?þœ ú€êÀû/þÜÿ¥ ZD?¿ýcýwþ.ý´þS(þ ÿ³þ‹ø þ ä – ;jý½ùjöV÷úVþôþÿYþ­ýDþþâPpÿü!ÿàýP|ÿ›øQÿ^˜ y ¥ Ûü ÷ÈõÚ÷Æû™ý2ÿF¿þøþþ þ ÿÚÔ,MvþýÍýXoËöÕþí‚ Š ˜ j&û=÷ÙónöúúþΓÆÿþ°üþîEø$®Zÿ ÿáþ`œ\÷ßûß …’ ³ùSñPñÛòù–Þ92þþÝþåýÓÁgýKëÿBpÿþ)ÛöÛúõ· O‹v»úôî,ìJñ|ølÿðP¡æþ.ûcüßþ‰oÇÉôÿ\Íþ¤ý¢?¿ø ûR  ltŽ ÞüfíÔæSìôµý³0\!çû¼üÁüÝüŸÙßü¸ûëÎú˜üYýÑÉ %îPä`å¶íøùþ @ qý3ù–ùûn#*"€0üRþÞý;ø—úžAý¾ ìäî»ââŠè&óÚö ¨ÐâûýÞ÷GöÐöü·[ m¢ãþðýaûØô÷ö£?¦ŒbAðäXáBç}ó$ÿ… Ò´ vøwôôñúö^a Ý ˆþÿØùkò7ö‹œ(š­@ïjãµà׿¹ó|PÖÿ³ÿGöòÜò–úUt z mþ‹þíù?ñô…ÃY4`Ó“îáwàÔçpñβ»| ÿHø)ñ óµùùA Z ø éþZ9ùÝïãó ¶ÏÄL,äïýà}ÞøãÑîÏþƺj Ml÷±ð ðöœÿÂË ÷è …7ÿôøæï¬ïëý‡¹Ô¯“ fôÏà¨Û¤áìûÒ ÈÖ9ùôî3ì)óUýøö ,]„áÿ·ùÒîî­ùÑ ¼?Iª ~ø]å]ݪâÊí[÷ù…@¿šüÊòëð¦ú9 fêîÇwúïîúZ œw9c ìø£è“à²áŸé¬ø Ç©Evü‚ñäî¢ñ0ù Î ƒ~=û0ñFï»ùb É$}Ð }ùèâáå‡ëöÑ¿S^ 7{þójð´óŸúgB Ù ƒ2^ÿºÿóøNñBóO´¨Y*7 Ëõƒçãáä•ì½÷$ÅÍ© 9ýšõ ñ¶ô¿ûŸÓ ™ ‡ –èýyÿ–ù¯ò öýþÍ Î åë ¿öë ã_æØí]öi$mé DµÿÁø@òGö²úÒkaO ,¬ÿòûqö9ø‰ûw ˜±§ø¯ü ñÑçëéìóñ_û n ûžûüõöÿø¡ø4þ{Š2 ñÖ…•ÿ«øéø˜ü™ç $ùû øþÿòê¨ê˜ë¿ñÚükŠ á ^Ož)ü—úuú–ýÐÿY*»3Ø‚üù‡üä >} V¶ôœìŽìzîªñ¾ø0ç&OÊ8¥ÿý?ýÿžáÿk1狪ühü!ÿ‚ )  €™÷Gî|í¬ïXð_÷Cý²B®ËÐ# ÿÁÿŒþôÿcÿvÄÿ|ý¹þÿBñ  ÇDù”òXò°ðÇññöØû½Rk­VGï³1žôþz&þl@ÿÅýuþwþÅV Ñ Ÿ â»GüÏôjôPóÒòc÷ÄùYþ ©žv ± {ïÿ5èþÈÁþ ý þ‹þï¼Àþ Fþw÷d÷ öŠô÷÷ù¥üuÿÿl¾È+-åîq¯΃þ¢åþ®ýæþþ¸€Šƒ š‡þtø ø±öˆöù‚ùÍý\ÿ„ÿ…HW²háÙ;ÿAÿ•Dþ0þmýµþ yP ¤ˆ†ýIùøoö§ö™ø˜ú“ýßþæÿS‰UÁ:õ÷uBüÿ¼Iÿ†þ3ýðþãjÙ”<j™ýãøø‰öT÷øÆùÓýçþ‚ø‚âèAêÃþ¢Ížâÿw„ú%ÿ)þìûÕýkÝ#ÿ‚þ½þ÷ÿ×ÿ†þwÿ×µ¹ÿ´þâý™ýFe3ÈþþLÿÿ}ÿ’0}ÿÝýâþ?䫼ÿ(WóÿžüÁÿguüÿ‘DBý¿û5ý !òþNýxÿ¹ÿ×åÿûþÎBÿ„üT‹êuÞÿF±þÔü©ÿÚ¾¸ÿQÿþƒüRB’ûýòýd}½>‰ÿ!cüãüIbÒý&þw·ÿrû!»ýÜýfü?ÿîþ”þ½IÙ¢þþäþ™7ÿêúkÿûý4ÿŸüûü(¹úª‚Ûýþ–ÿG›þFü†jþ~ýGòþ†þtÿrûûBÜ&òüÒþÁÿSf}þÙîý<ÿÈïwþÛÌýÙúë°ÿEüZÿÚþŠÿ+´]ü¬þ/ÿ¸þ„ÿàûxú¬Ô–üUØüöŠþBþŒÿœšpHýÈþµÿ×ú[üÛ3£ucËüŸþ™üaÌÿ°ÿýêþÁúÏSúWÕ9ú[ü© ýÌý(þ»Ç‡ü– ýrþ»dÿþ'=ÿìýüúÆþu©{ÿþøÄþ$2ÿPÃÖýáö!µ•ýM_ÁMÿZú5Ð÷ûV:_ú~þù¯ü91â¤üDþ$ýóú„¶ÿZ”û¬ÿ?ÿ}ÿ¤âÿ¾ûóý8˜nþåÿhHö üB@¢gÄùÏýx4¤D÷=Ø û!‰Ÿø/^ñø•üSÄúoþ0ÿ@†?ýÚþßývþÄý¨ÿx4ßþ£ûZÿZÿ;ûïµþ¼ŸýþbßÿûªÿŸü5þÔþ?ÿÛ>ý{üAÓûUùó­þÂùÁÌýfú;BþùøYÿŸ„þÿÜ’þŠÌlÿX÷îÿw ”ÿ,ûææÿ^!þ<µÿèþäøÒÿ€5Cü†kÿþNbOÿ̧ýžýÕÅQúÂý&:—úÍÿYþ¢vþqýˇùPÿÌ3µÿiýf,šûÎü‹l>ÿNþjÿ! ÖàÐþ)þŒ²ÿˆý$Q¹àþ…þ˜ÿ¾ÿ²ÿž9¬þùþ†ÿ>þÍþPrã–þ€ÿC~!ÿUÿ%Èþ0þ¡ÿVCWÿ†ÿñcEÿçÿKfþuàÿLÿršAŸÿÆÿÙÿ‰*åÿÿ7ÿF¸dÿôÿÝÿk‰ÿ} Þÿëþüÿ†~ÿ õ¢ÿ-kÿ ?"Éÿ,‡ÿÆÿâÿ@)ÏÿòÿnÍÿ?LÈÿÆÿÝÿH ëÿhÿÆÿÿÿ PI¼ÿTÌÿÅÿßÿßÿWÚÿ÷ÿ~(ñÿþÿ¾ÿíÿÑÿ/Íÿ &Óÿòÿ$×ÿ÷ÿ;ßÿ Íÿüÿâÿ4þÿùÿÛÿÖÿíÿ*;Ìÿ- Ñÿùÿùÿ$ëÿëÿ.ôÿ ðÿÕÿÕÿÔÿòÿ !õÿéÿóÿýÿZ öÿáÿÇÿ.ðÿ=ÄÿÙÿ)Øÿ6Ìÿ  Ìÿëÿïÿ.÷ÿßÿ2éÿîÿûÿ#ßÿØÿ ùÿàÿ6²ÿ! áÿÄÿ8øÿòÿÿÿýÿÈÿ'éÿ?ïÿ÷ÿ åÿÝÿ-ïÿäÿCßÿçÿçÿ-ÝÿÿÿÝÿìÿ</æÿïÿéÿæÿìÿC µÿ Éÿöÿ,þÿçÿ9ìÿÙÿæÿ0Øÿ Ê.ý£üW¦÷¸þAþ(-þ0éúû»þbþÂS§Äý@ý?{kú^Vûáý’íþéý08Y9ý“üµþÝ#ý˜þ—gþdýIÿüLMÉpÿ¤û‡KÞû­ý¨ü”ÎN!üuý‰ û&Úûªý½– êø%þ.°ünxý†ÿùõtÿÔýibŽÿ'ÿôþ‰‡ÿf±þì mú7™ÿ‡üSV=üa4û—þöýµýPÉʵýÚû8üpÁÿ£ûä‚DúÉþ¿ÿ˜Hû÷ý’t‰‡ˆþšý1GûÄü·òÂãÈXüWÿWýBj!ÿ…¸ýÿûØÚ£û«!OÒ¯û«±úÍZû,ûÁþ÷íößûå›Âü#ñnþ•§ÿ<*ÓýÜûê´ ]Þýü~ÚG·ýWüþÞüdxÿL#êü>"úÒþÊñÿfýÿþþeóÿÑþ*aý–€üÿg÷þŸþ"¼þieÿ©ÿ«ÿ'¥þŽëþÉþÔþÀúîþUþýû,âýÃþoþ,ó^ÛþÿâÖþEþvýŧFý¿+ilþ:ªþò±ÿÿþuäÿ~ÁþyýRÿ…¿ûþ_ÿÑÿ!ÿÿ÷ÀAÿdÿ)þÝ&ÿöâþ·ÿInÿÃÿöþœÿDÿ¹ŸþÆÿ 0sÿVûèþ¯ÿÒ°:ÿˆÿx[þ>Áþ‡ÿ¶)ÿÿÿnÿ›,–ÿ§îþ1ÿ›÷ÿ‹ÿ%ÿ !NöÿG¤ÛÿïÿÿþÿŸ¸ÿ¡”ÿ²ÿ(žÿ¡·—ÿˆéþdÿ VÿÒÿ6*—)ÿ¶ÿ#!]tÿ{DÿŒ¬ÿõÿ>̾ÿ;WÿH% Vÿ ÿžÿôÿ©#ùÿ¯ÿùÿF]®þÙhÿµÿ}0ÿiz `ÿ·ÿàÿÍ×ÿâÿÀÿhÿpÿ3âÿÖÿZ¼³ÿ9Kÿ~éÿ<²ÿ4ÿC‰ ÿñÿøÿúÿ]“ÿK³ÿ@Ùÿúÿ:„ÿšÓÿÿÌÿ"fñÿ¨ÿ zôÿ¶ÿÇÿ[ÿŸìÿhÿr‚1ÿ|ÿ­ÿsX»ÿÓÿã‘ÿU…vÿ]ÿhWÜÿÅÿS(þÿ-éþ©ÿ‚8†ÿ"šÿz¬ÿ&òÿÞÓÿþÿÍÿjÝÿ2ÿJ×ÿÿ"ÀÿÿÞÿ{ÿ4çÿíÿîÿ®€¿ÿVÿ¾ÿAòÿÚxãÿÿßÿTÿ‹Óÿ·ÿïÿ×ÿmÿñÿ'KÆÿóÿÈÿüÿÎÿΛÿþþÄÿ?\Øÿ¢ÿµ­ÿxÿ’ÿ’íÿF¥ÿÈÿRÿþÿFÀÿßÿøÿчÿ´pÿ…ÿªñÿVÿì|+ÿiNÿsÿÆßÿ§=šÿ9ÿöÿC@${ÿâÿwíÿWÿ&k`ÿ-Ç’ÿçþ³ÿs‰ÿèÿ>Tôÿ{þ ÿj©w0ÿëÿ`†ÿ†£óÿ‚þpŒQ6ÿ_ÿ[Eÿ®ÿáÿLïÿ¦ÿºÿ”ÿ¾™ÿ~sÿAôÿ×ÿš;ÿ0ÿÁ¬·þùÿæPìþ,¹ÿyÿ•àßþ^°šþ²ÿ÷”(ÿúÿkÊþ´ÿ‚b¹ÿU%ÿUmÿy|ÿ¬°…þM¬þã¡þ¯ðþðþóÿi¨Áÿ<ÿœ3wÿ°ÿjÿÝþ鞈ÿ¾ÿ+§ÿ¸/ÿÉÎÿùþ5vrþKR°þÿü\.ÿ"èœþ>ÿÿLðþ¡ÿûŸÕÿØéWþ ÿ"ÿrëþêÿcÿEÿ´8¶ÿ‘ÿ¤ÿdëÿÿäÿ0‡rÿ­þqÿÊÿÊý.~þHþú+ÃþNÿ@ÿ£ÿ˜ÿÿ€Vÿ}þÿ—â¨ÿxÿ@Öÿò´ÿòO‹ýmÿ›ùþ÷ÿiþ}ÿUñò´ÿbþßÐÿþÉ3Àþ£þ2(|þÿôþYÿøÞ†Jÿ™þ—ÿ‹ÿÿ@_Îÿ)ôÿðÿêþ˜†ý4üdÿt‹x8ÿüþ›þ§ý ŸÂ¯ÿÊý4ÿé“ÿåÿâü…ü›ÿá`'ÿ#þlþâsÿpÿÈè½ÿP¹ÿã2ñBýEü)¥CeVþFnþÏÿ~üMüþLk)ÿ¦þÞýgîRIýLýÖÿTþŒú„ù!ý®v²çªY2ÿüvþáÇÿ2ÿe±2þ±úû­úRú¤ý÷´fþXüüñüÓz g±ÜÿÊiÃÿ?7çùþ÷þõýntbÇ^ýü¬ù¶ûr«ÿ³þÉþ‰ø*÷ úo÷:ú7tià`Õ ] òÐcJ}`ü+²’÷BþFùé÷Ãùý@þ8ÈFügø–öÙ÷Lúßû3ý†ý¡%:þŒþ‰¹, Þ=j"ýw÷¨÷üßý ÿùÿñú…ù½þõýYü†Þþ|÷´øÎû¶ÿ‡Ô ¦÷þÖý–þn$3þþìÿ¬Ž>ÿ·ýký¦ýïü"übþ  ÕÞÉ> ¶“&ù’îºöþºV+û©ú˜û®3ühþô Ö Kýmõ0ùBEŠýþ(N$ØÓ³çb˜¶%ùi÷öû–N´ø~þêù—õ”'üpù‹ÿPüe¸ †ûÒ­áöÆDþÜ%†ýXýB 6þÿÿüxû«ò ûü3üyþ(ÿVý¬Iþ#kÿâÿlýxºú‡üš3ª ×5øÆ* ýºøN1û¯´ø`þ) ûö¨ø[’–óÀÿ+ýìÔö”üý¼ý/úþ¹~¹ýLö?ÿÛIûgüf ÿþÉû~ù÷ ø`Ûý1ÿ*ü×6ûˆ"ú7lÿHoùÆŸ(ú‰Í®ùÇ ¢÷aºÿpø¼Ìüd0³Døð8öNDü:Ùþ©dù© úûmQùúhýÅùMñû¬ ‚òç óôâÿDû€ ¤ü{«ü”û’ýþÅü±òõÚù(ïû¦&üÂÿŸ÷¹$øÍ µ÷n³ý?ý%¬hû¯`ÿPÿ+úä‹ýXqù#)ýQÿtø±þ÷… ±ñƒü/ ?ú#ù:#Ýüáäõ< G÷D¼ýýülʇôÃüþÑùk° —ý” ïOâûŒ•¤ôà @ïõAõñ§lõ‘Óú©!SõX ÛýüxüöùËSÿY©û“uÿ8ÿQ—ýü`P ýC&ù“¨ýû‡ùEíÐþËû_çüöýãºíNÿ” :ÐþR÷3&ÿ‚Ð ¡ñ£÷Gô‹ý[blMö-4øRÙþÈýݽþ»ù¸øüÝüD ïãýÕÔ 9šoôNøüï^þÚ²ór@n‘øî§øµñ=yó4ýù&Âü–õÈús sùkôÿçøx úò8 ^ú¹ú òýó‘ðüx üoöŒ (ñD—ü^ šÿþTüÔû¢eùuªNv÷.èé‘óU ’ò´õwö1ÿûíó² }Òû™ùœû]ý9 Ký Nñ‘ýü1÷P¢üM]ÿfü+,ù±êùý<éô'oúQ 7üNþWø= <õ} <ø¤sù¹ûeþçýa+ @Bý²ùüFÿCʲüöL ìôbÿósÏþ¦ù‚ ­VÁÂøŽöµ Ú÷•ü2%¾j£÷.Eý¡ ýÑ7ünõç ¹ôàÿÛÜ[ÿ:üôö+ýVþQ4DúG‰ô× ²ûytø5ýäý†þS Fý+ÿÔø(ýšbÿ& lùöL—)üyBôð CôÕüAþÌ&øJú‚ÊÿúË Eõ8Ýý“ýûZøÑþ,ˆøØÂü¢þר†øzqûªûk »òÁˆ'ÿ¡ÿ½ùÇ ü©ùOÿ'Åø&¸ÿq3âü­§÷B­õH7þKúž Aÿýµ’ø”ñùNûºžø™ úzúœÿ'¨õé²ùæ1û'öÿünkåúðmøþ¬û*B)ÿØþ•uüøÁûÕÿGþ¯úú#ú #ý¤?Yû!{÷v ]ú­ÓõYÜýÙAW÷³ lôŠþú×F#üþ’Z7!ö§"ùl÷ õÝ úñ¿ÿÛÆö%DÓ)ûþú”þH1þ•EýEPþaúû#þ90‡ýäÊûîü¾ÃòEû·Cûgÿþþ+ôšþTÿD¡ Õús õùøN†(!þ“úµy8RÄ¥Íñmþ(ÿ¨øjøŽ6ýlÚmøo «µýÛóû¤ø7ÿ¤þÞ÷÷þY‡übÏúö¢÷U-o^þMùbQܺüù"÷ ®ú¾øÂ ^ÿø/ ºý4õ…þH°ÿH .¦ù„ùüü¶1þòþ¹þ(“þ–Rÿžð7þ=;Òý,üˆMýH>ÿq‹ø½þYgÿ7ùø ü|ù PÁ÷™ û¯ú Dù þª²ÿoù`ü¤–ûîü,9û—×÷\ýOo|FúûÿbâœþöûBÊ G^úÆø~þ[ wý-ÿÅýþü€ü@ÁúIþJÿƒKÎü#™øÂÇ×ýŠ+ý^2ø ø éö®üîÝúüÊöúÇ®ù9Xòü4ÆXþû04ÿöÑý@ûþÎþ oü>ûÒûŸ5\ûÿûòþØÖþ¼ûå>ÿ{û¸ýA gÿ|ÿÀý üŠý‹Æýˆþ„.ûy—`&ý²¢ÿÁù0“üÝóûž*øÿx»ŠÜüÒýúû¡yÿÿXýìúC°ýë²ÿb£ýúÿ£Ò•ÿÞÿ„ŠçÈýÀý)eüýT†™ý¶ÿÎÿå>þÊþjñýÿyý›3Têþ¶þ€ü¿þãµúœ,þŠÿVÿIvÿ~ÿºÿöÿÃÿ! —¡ÿÿ_ÿXS$õÿ›ÿ<äÿ7ÿÆ<ÿ /ˆ ÿ´ÿ™ÿÜÿH×A#ÿÔÿAÿÿ)*F!ëÿ/*Ëÿ ÒÿMûÿãÿýÿÐÿìÿÞÿ#ÜÿMöÿéÿÔÿ1äÿÝÿæÿ9Øÿ3Éÿñÿ åÿ÷ÿAäÿ öÿ ôÿùÿðÿùÿöÿýÿþÿùÿüÿöÿöÿýÿôÿ ûÿùÿÿÿ ýÿüÿûÿûÿôÿ ïÿùÿÿÿÿÿ ûÿûÿüÿÿÿþÿòÿôÿ óÿ öÿüÿüÿøÿùÿýÿöÿúÿ ôÿÿÿ÷ÿöÿïÿôÿ ûÿ óÿôÿöÿþÿóÿûÿ ýÿþÿ÷ÿÿÿ÷ÿüÿøÿ÷ÿîÿþÿüÿþÿ üÿúÿ÷ÿ ûÿýÿôÿ ïÿøÿòÿùÿïÿóÿþÿòÿùÿëÿ æÿûÿùÿúÿãÿèÿùÿåÿúÿøÿÞÿëÿ òÿôÿ îÿ ùÿ òÿêÿ íÿýÿ ñÿîÿÝÿ ÿÿïÿÞÿ ãÿûÿÿÿïÿûÿ!ÿÿæÿ üÿãÿ ýÿøÿ óÿïÿÿÿêÿüÿ øÿôÿùÿ ûÿ÷ÿÿÿÿÿþÿüÿäÿöÿ îÿ#êÿÿÿüÿäÿüÿ ôÿöÿ öÿåÿóÿ ûÿíÿýÿòÿýÿõÿþÿóÿûÿóÿùÿ úÿ îÿîÿ úÿûÿùÿøÿ÷ÿ þÿïÿ ÿÿðÿ îÿûÿ ÿÿ ùÿùÿ ðÿ ÷ÿÿÿüÿùÿþÿ ûÿúÿþÿøÿùÿþÿóÿùÿýÿôÿ órû$¦ñîþCŽü;îü—EýþAí¶þzüØÿ¢þ<›þÓêþ1™ù´íÎúc_XüQS,úψ›ù‹ý î¨ûDÿÈ ’ûÈo~ü•ú&±Ýú°ú`¡ú~ú7ÿwN Ûö÷SøÌû7ÿÅÿ»¹Yÿ³þýû3g:¦ˆýÍÿ”Àûú ¸æú=ûþ,CËüËöÃÿ­ gÈûNþg†6üÊü þrøþ€ÿàýO†ÿOýHD@þWúÿä|þ°üfÿ¦nþ‰ÿÑÿ°)û~ðÊý ó|ø~û®ÿOûu÷$ÿ æ rüÐò,ù?‹ eÞõõÿ,B•^áý¨’3[üÍøÌÿ !ý¬6ý·ôl÷@®ƒ)ý•ùrüü¢ñ„ÑûJöâöôP `%ýuö¾ûf` µïü—ú€ÿ‘;›û#òäô#®4} ýùÔ8 µ '÷óoûÁ»Õ!ûUöæõ@ö öû`¼‹ûû}þå0 ´ #Üd±†þÅüVûrüÁûGü>Ù`ÿGý­/ è¸ø VMùêò"ð`í}ì(îµò:ù' õD Á`—ÿ~ûWøö§÷9ùÊû‘YeQ†„ ˜øØ ÀÏøÜò¤ïÜí]î¬ñÿöý²ý ‰ ¯  Ù7[ýúøFöë÷Òùüvewá×U IÃʤÿ²ø{óÌðöïbðˆóUøžýuæÜ z é 3 Æ™ýùùøh÷IùÿúÙüÿÃ#Q Š R­ÿ ù¢ôgòfñ‹ñÎô_ùcþŒÇ[ v &ýC}ýHú¤ø»÷uùçú#ýw¹çž õ ï ùèÿ(ù†ôeòTòòÏó«÷êüU?˜ U " # Äf}þûyùøAùPú®û“ÿmز ]: ·ùù¢ôXòäð›ðlñ¬ôÔùwª7 ¤ G „ CJÕüÇù÷øžøaùHý±»_÷ ‡­` óïûšõòEðî›îíðoö“ý‰‹ \ … ø C †%©û˜÷ÂöùõÊö³ú¿ý–þº: Œ3Jà@ÿe÷ó"ð÷í íûíÌñbøVñê 6 Ï J ^kÿú¯öiô)ô*÷xú"ûý¯B %PGv õuûöõ<òØîŠë<êíèò¼û×û EªÚ97 I ÜyýEøô6òAôuö¦ö ø&ý„6x0oÿˆùrõ3ñÐì›è¨çæëªô—þj‡ „ØÊ· Baû{õHòxònóó"ôÂøÇÖ 'ñB ´ýWùô…îßèVæãéÂñü¦2 = ù©çÆ q´ü|õ òYò§ò®ñ<òŽöÆt ÷š6 ¹ôþÜú_ö÷ïé=æ9èqð¬ú‹Œ ¬ ÍÓ+’þùýÿõòfòuò)ñ—ðsôÿæ ·}ïå * <üi÷àï·èä:ç5ïÓùCÇ% Cî7>Æý ÷âòµñ·ò3óâñÿò¯ù«°&ÿ ¿ tý1ùWóRìpå[ãëçíñ¨ý© Þâ pa ³ïúlô\ðÜïòKó¹ó|õÛû‹Á¼o†µ è<û9÷¿ñµêCä(âçoòlÿˆ  ©&¡¸¤\ ¦øòTîàî÷ñWô õ:÷Mý£T$•:Òüþ8ùkõ+ñžë»åätèó+  †ââ*  Ø6÷ñïJìÊì`ñÞôôöåùÍÿ+ Õä”˳ýrö3òìîùêîææêRôQ` I<ί¶ 'E~öïyêLëAð öúiý‡ «ÅÝ=ÃûlóGïíüêvèè0ìÅõƒ6[Ÿƒ4³Ñ \þºôáí€éSêAð@÷œü!Õ1 5äZ¥Ê,ú0ñì¾êê{éjêï øj?­Úˆ? C¯bû$óíµèê^ðwø¾ÿ"¨ ÆP›¾#‡ øÍí…è¸çéBë5îKóÄûžÆÖû’ü Z5ýP÷^ñXìé‘êÑðRù¨Ò œ½j³cœö•ì™ç™æè«ê²îÞô&þô1ïs?°ý üÑõ4ï®êëçÇéwðùpQ¿ §.‰³Ož÷–íè:æÑæ™è+ì¯òü¿štd¹m. º¢ÿ|øbðlêÖæïçMî¬öùýNb ©HÈGv ûñ ë;èÅæEæèçíÆöÍY^ “ýpônëæåå-êò†ùÿ‡ &{ M$'øNðùë}éçÍä'ååêõõíâS~Ð![ª aÿ×óÓéåYå8êŽñ;÷_ûFKsí"y?Éû]ô ïë¸å*á×àAçdóª’ ˜ Ÿ›§-ZöœëçøæêNïsòBõêúœ¤âI#û=L LóùEôÈí=æŒßgÞ´ä™ðyþu 4…àLóq’ùÁîÜé¥èëïŸñÝóÐøøíš»!‹X ={ù—ôUïHèâJàEåÀðpþv €ƒGàFÀ¥ùÂî/è&è`ë¶ðúõúîü*Š .%; · Üõ+ðfíGëøçoåÂæ°íIúç ßÓÏ ý0òŠéžåÒè¾ïã÷˜ÿÞPv PÍVü;5ø(í‡è4égë3ìtìàíô\ÿl !Ìn ŸcLÿ/úò'ëIçsê‘ò˜ý¤© ÿ í ^ ¼jê=bõèãã,çˆíWò‚óªójöÒþ÷ g0™×fòþüü„úDö¬ïBëìLô ³ ÎÍ ÃbÄ H£' hþ‡îä†ä*ì_õVúZú øÉø ƒ §Kz Sý³ö²÷¢ûáýPû¯ô½ðúñTûÔ[%`ý°üiù eþÆîçéÆñ©ú^ýKúRözölþ 8—\pLûøqú¸ÿ&Ïý,÷ðò=ôxýyl° ”ÿõøúPl1æ7Ùð éÂëôJücý!ùôvôý/ P:HxAú ø›ü#þ„öÉò4õ^ÿŸÛ M 6qü:÷wúÙ ßÂÃÿ ñêzížõ>üÛü÷^ó)õxþÉ 0ö ùrø¼ýÖl,ýö’òyö”/ ÊŠ ޲ùö¶ú•g+V ‰þfð^ë‘ïŠ÷uürûÉõƒò8õu ’áK ‚GùMù®þceý§õÖóløTm ´  ÞéørötûØÎ Wÿ‹ñáìªïâöÈûŸú;õòAõ] tÌ. ÿùŒúóÿLýdöSôáøP J 5 5ùcöüèù‹Á ¾ÿó3î:ñ‡÷\û9úÙô…òÄõbÿ ¨½ ŒúúUûÐÿ™RÊþÚøoöÛøìR ³ú ÷ùúP""þ«µõFïÃð‰öPû×úvö)óåô ýu(m‚ káúíùQÿ[ËÖ+ùQô°öþ Ë Å <Fûmöý÷$ÿX ö7© 6ø ôåóö÷-õ:ò•ò2÷yi A ¦B,þ;þ ÷rýcøØö1ûÔÂC V`üù.ú•ÿ 8ž(_ˆü^ô1ð$ðºðñôñÌò~÷|þZª ܨ ´þbþšÿ~lþ ýûýøÿÄ;T¦Çûeù/üYuª ¦üÆñ^íï6ôí÷Óøõ÷å÷‘ûs ð µ Ñÿ7üBû¾ýrnÌþ³ýýÄ[¤/Þü6ùPú½V  ¦Hü¸ñ©íbð&÷Öüþìü­úDûšZ Ñ ‡‡ÿäù3ø­ú/ÿL$ÿŸüÍý”«58:ÿÐùÌø»ý­f%ø Ëþùó’îhð$÷Wþ0‹Xþ}üXþo»: ÁNúú²ö÷øû©—šàÈþÔý?þYâ3äû/ùíû” « Ûöö›ï®îÐóÖûô>*ÿÚ‚ÛoLþ­÷õf÷Lýè8Ǧkþ0þ÷…NKþûƒýÇøÒ ‹ PùÐðåí·ð÷Íþ±-³}%Æ((ûØö÷Ûùÿ>ª”À†ÿTx–þýÿû•ÿáW 7  8E÷ÌïÿìºïÂö±ýá9jÎÔ˜öoÂþjú˜÷ê÷û]ÿu@\Va¨ÿÈðþ=ýüôþì %  œÊ÷òïí|ðïö{þªUÞëæU~£fÿrú÷òöŠúNÿ¼¼ …Άÿ6?¹þ?ýµüZÿcd ¹ ¾ ›Oø€ðÖíbð¿öÁý “Y鲚óŽÿ‰ûµødø“ú®þ¦ouUfseYÿsý«ü1üDzW > ? ¦‚÷OðCîSñm÷êýlzÜÚI}qÆŸþ ûløxøÙúâþkë r<ïßÇþôü!üÅþ9Š À y Uù ò5ï”ñ ÷Ëý¹<n ² üÂùùûºþK9)³³àÿîÿiÿíýˆý0ýË}§ 4 çCù˜ò’ðEò÷ÖýA´F"FwtF\ÿüáùèù¸ûXÿ»ñ° 0ÇÿÊÿZÿ:þzýŸýHáÍn âÉdú9ôBñèò‘÷-ýiäG6JîadU5Gý9ûqúÔûºþuá)|{ÿ_ÿ‹þóýßý!þß·C£ qÍûÒô[òqóÍ÷nýí7…0~l$Á.þDü3ûüœþ_L‹¢Å¶ÿìþæýeý¶ý¬þM  •†2û´õMónô)ø†ýk*+ÝÖ©‡RI­þýUüÄüãþêTâÚýÿIÿþýüzýoþRB”úV9ÆúÿõÖóCõïøÃýö |È”1¶ÌðÛÿKþ×ü»ü‹ýeÿŠ+S*Üÿ¥ÿ¨þ-þÔý‘þ~ÕH P—ú§õJóæôçø½ý§Ê ±ŠwÏÃÿ„þZý4ýüýÿ-¢“¼åÿÔÿçþ,þšýxþsA– 5Ó údõYóõ2ù@þŠ×+¤ƒ5£éÿÞþôýTýÒý1ÿ¥\šûš7ÏþèýKýþ¡sâ) O¼ùõeóõ¨ùÀþšÍÍ®\<²°ÿoþ¢ýyýýý}ÿï ÕÖŒôÿÝÿ þ¶ýýþÇéçïûÿŸùtõ)ôö-ú¨þshžY$"9ÿÝýªý þ?ÿÕ÷0‡TVÿEþý~þÿ¾žD¹1ÿgù^õ«ôòöõúdÿjøýÝwD£òÿÿáýøý‰þÖÿgdWtÿ˜ÿÿ}þ3þ ÿSÐ.½Fµþsù·õRõµ÷ãûÔÿ¡a#JGg_1÷ÿGÿDþRþíþ×ÿÖÂzÍN¨ÿnÿÕþ)þÿýxÀPÒzþ)ùö8öìøýxªñ8O™æpŠr:ÿ(þþÃþ?= y<êÿ+ÿéÿ0ÿºþ ÿÕ ŠÈþÕù½ö­ö#ù®üS¼ù¼ìRÀF¦‚ÿ¶þ—þçþÓÿáz'^ —ÿŠÿïþ“þ€ÿ%&:.þëù‹÷øƒú¤ý]asë'ˆó™°—£ÿüþÆþVÿKŠLÁ©°ÿtÿôÿ;ÿíþ½ÿ:­„Ä®dþiúgø»øõúãý†QQPÿ<ÿ5?/[¿€\ÿ”þÓþ–ÿ‡!öYÿÍÿ³ÿöþíþ×ÿ8í'¥m§þæú ùaùpûþ-ú’Óÿ=ÿlÿ<%ú‚ ÿ'ÿ,ÿñÿa3µëÄÿ˜ÿËÿËÿBÿÑþÉÿ @ÐC‚ëþpûÉùúÅûKþ>䬠ÿÄþÂþvÿ£Ã ïÚ>ÿ,ÿŒÿbðO|ÿÉÿxÿïþöþùÿj‹Ä5ÀþüjúËúTühþ–T3ÿœþsþAÿ‚±àßOÿRÿÎÿ“  Þuÿ³ÿˆÿ-ÿÿ1á&ÚÔþ`ü^û²û3ý÷þŽÂÿÿ2þ^þ&ÿoTÅkÄõÿˆÿÿýÿ… Ó©ÿ·ÿ­ÿ4ÿ'ÿ,î}]Ƽ>ÿýü9üxýÿîÿ3Êÿÿ{þyþÿó`9®Åÿ›ÿhïÇõ¿ÿÝÿ@ÿ5ÿýÿ˜k–=ÿmý‹üýþ)ÿÝÿÏÿaÿÿ©þÿ„ÿ ¢ÆG'…„6N×ÿ\LºÿkÿÉÿ˜®©ÿñýùü=ýþ9ÿàÿ¢ÿÿâþäþaÿáÿX˜ V+ñÿ+OfYot5ˆÿ`ÿ×ÿîZ:Ú£ÿ@þ˜ýÂýnþNÿÍÿ×ÿ¯ÿ^ÿÿÿþbÿ¿ÿmvN. 9R;_9FÌÿÃÿ‘5šq¢Ýÿ?ÿÙþ÷þ^ÿ§ÿÏÿäÿÑÿ£ÿ‰ÿ¥ÿ©ÿàÿ$5úÿÙÿÕÿÑÿ)`UVM/üÿÛÿ×ÿ :8þÿòÿâÿøÿýÿþÿðÿ+25&ôÿéÿËÿÊÿ¹ÿÜÿÿÿÿÿ!+ðÿþÿùÿÿÿ$÷ÿåÿÈÿÌÿðÿ1 .ÿÿîÿ !,åÿßÿëÿîÿòÿæÿêÿ ýÿ"ôÿçÿæÿàÿÀÿÍÿêÿ/-õÿïÿÚÿëÿ$U+èÿñÿ ØÿêÿÀÿÄÿËÿüÿ ;5×ÿæÿõÿòÿøÿ""òÿ/ûÿÝÿóÿØÿÒÿäÿÏÿ (üÿ%$ûÿßÿÍÿÞÿøÿþÿöÿíÿçÿêÿÞÿ*L_DýÿñÿÚÿíÿñÿâÿõÿÈÿèÿS4ûÿÄÿŸÿ˜ÿÁÿäÿ7>K&çÿ!üÿ÷ÿèÿÌÿÓÿÏÿ "ûÿôÿ>Y@gÊÿÍÿšÿ•ÿ1 øÿ<ñÿ,-´ÿÈÿ~ÿeÿnÿÓÿCØÿçÿÈÿìÿS-‹› C ÙÿÉÿÙÿ¥ÿïÿ×ÿœÿ~ÿiÿ¨ÿ+#aydÑÿÿ¹ÿŸÿ„ÿþÿx§kïÿ3Ëÿ¢ÿ8JlOn|øÿûÿ¨ÿmÿ„ÿmÿ,ª¯"Íÿ{ÿ½ÿçÿÚÿóÿÞÿ- 5þÿ! ^¡ÿ7ÿÿžÿøÿ.>‰1)P2bÒÿÓÿ‹ÿwÿ]ÿJÿ‚ÿ N ^{p–3Ëÿ ÿ‚ÿÈÿ=:Mƒeýÿ¿ÿÖÿÔÿòÿ7Oñÿÿÿ±ÿ»ÿäÿäÿãÿ"Ôÿ¾ÿ) öÿ îÿØÿ,Yíÿ$ ÀÿÉÿÛÿûÿôÿêÿùÿøÿûÿ öÿÜÿûÿîÿïÿðÿ ôÿþÿîÿóÿ%$Üÿóÿ÷ÿëÿ  ôÿÍÿúÿÿÿ÷ÿ÷ÿáÿïÿ!öÿóÿñÿÿÿ úÿþÿùÿóÿ  úÿ÷ÿÿÿóÿòÿüÿ üÿþÿõÿñÿ üÿûÿíÿõÿ ùÿýÿòÿüÿ ýÿþÿ ýÿÿÿ÷ÿõÿùÿÿÿûÿ üÿòÿøÿùÿ÷ÿûÿ ÷ÿþÿúÿüÿûÿüÿÿÿóÿûÿÿÿôÿýÿúÿúÿ ýÿøÿöÿöÿûÿ þÿýÿÿÿùÿ öÿûÿûÿüÿýÿùÿúÿûÿôÿ÷ÿ õÿôÿüÿ ùÿÿÿøÿ þÿýÿþÿûÿýÿñÿõÿúÿüÿýÿ ùÿýÿõÿøÿýÿ ùÿïÿøÿüÿüÿüÿ ÿÿøÿ ýÿõÿøÿúÿþÿûÿóÿóÿ ëÿýÿüÿúÿûÿõÿøÿûÿÿÿúÿþÿøÿøÿ óÿõÿüÿìÿ ôÿ ÿÿ÷ÿ üÿûÿýÿ äÿñÿþÿ ïÿðÿüÿ öÿüÿéÿíÿüÿõÿ÷ÿþÿþÿöÿäÿ øÿùÿöÿñÿ÷ÿ öÿïÿíÿäÿøÿúÿóÿðÿþÿ(íÿñÿíÿ ìÿñÿ ïÿûÿéÿöÿùÿòÿäÿïÿ êÿ" òÿüÿþÿçÿ ïÿäÿ÷ÿàÿ÷ÿôÿöÿ îÿüÿüÿìÿ òÿöÿèÿëÿ ýÿõÿýÿöÿÝÿðÿñÿ ßÿöÿ ðÿ çÿ ÿÿ ÷ÿýÿ÷ÿúÿíÿóÿ þÿúÿ íÿüÿûÿýÿ÷ÿùÿ÷ÿùÿ çÿòÿþÿþÿóÿùÿ ûÿöÿ úÿüÿòÿ ôÿöÿõÿýÿöÿóÿ ÿÿ ûÿúÿúÿ ÷ÿüÿöÿýÿþÿ þÿüÿþÿûÿ öÿÿÿðÿ õÿþÿøÿùÿüÿ þÿÿÿÿÿ÷ÿôÿùÿ ÿÿøÿüÿúÿýÿúÿþÿöÿ üÿýÿõÿÿÿùÿ÷ÿ ÿÿþÿöÿþÿøÿûÿÿÿÿÿúÿùÿûÿýÿÿÿúÿþÿ ÷ÿýÿñÿúÿøÿôÿûÿûÿóÿ öÿúÿüÿõÿýÿÿÿ ôÿ÷ÿýÿûÿýÿ þÿüÿýÿùÿûÿ úÿ ôÿöÿûÿþÿ ûÿ÷ÿ üÿýÿ ÷ÿóÿþÿþÿ ùÿ þÿ÷ÿýÿþÿüÿÿÿ óÿÿÿ÷ÿúÿüÿ þÿÿÿûÿùÿ ÷ÿúÿ ÿÿóÿÿÿûÿïÿ ùÿõÿüÿ úÿøÿñÿýÿ ùÿüÿøÿ ùÿñÿ ùÿÿÿúÿùÿÿÿùÿ÷ÿ ùÿüÿûÿõÿ úÿûÿùÿûÿõÿóÿÿÿûÿ ùÿøÿ üÿÿÿÿÿøÿ úÿüÿ ýÿûÿþÿÿÿóÿúÿúÿ õÿÿÿþÿûÿýÿÿÿþÿûÿÿÿõÿÿÿûÿöÿöÿþÿúÿÿÿ õÿÿÿ óÿ óÿÿÿÿÿ üÿÿÿûÿýÿüÿ÷ÿúÿüÿûÿóÿüÿõÿýÿ ûÿüÿðÿöÿùÿÿÿþÿÿÿùÿõÿüÿþÿûÿúÿöÿ ûÿ÷ÿ þÿøÿìÿúÿ òÿùÿüÿþÿøÿþÿþÿøÿöÿÿÿúÿþÿüÿÿÿüÿ÷ÿûÿøÿûÿûÿòÿûÿ þÿøÿÿÿúÿúÿ üÿ÷ÿþÿøÿöÿ ûÿþÿùÿüÿöÿûÿüÿþÿûÿ üÿòÿþÿ÷ÿüÿÿÿ ÿÿÿÿüÿñÿùÿ ñÿ÷ÿúÿ ûÿïÿúÿ òÿýÿøÿøÿ ýÿüÿýÿÿÿþÿÿÿþÿùÿ÷ÿöÿ úÿýÿýÿøÿüÿïÿ ÿÿ ÷ÿôÿ ÿÿúÿÿÿüÿýÿ öÿþÿöÿþÿýÿ üÿþÿÿÿþÿúÿùÿÿÿöÿúÿýÿ õÿÿÿôÿÿÿùÿûÿøÿúÿ ùÿÿÿýÿóÿÿÿûÿ ýÿ÷ÿýÿÿÿÿÿóÿ ûÿöÿýÿ úÿúÿöÿûÿ öÿ ÿÿýÿúÿÿÿúÿ ûÿ÷ÿþÿ÷ÿúÿÿÿþÿõÿÿÿûÿúÿûÿùÿÿÿûÿ ýÿóÿùÿ öÿúÿúÿðÿþÿ ùÿûÿøÿ ôÿ÷ÿöÿÿÿýÿ ùÿòÿ÷ÿ ÷ÿ÷ÿ÷ÿüÿþÿ  ÷ÿïÿüÿ ÿÿùÿòÿÿÿ þÿÿÿþÿÿÿûÿöÿþÿþÿôÿøÿ üÿúÿøÿ öÿùÿÿÿ÷ÿ ýÿúÿõÿùÿûÿûÿüÿþÿüÿ øÿ  ýÿùÿúÿüÿ ÿÿðÿôÿ÷ÿþÿúÿôÿûÿþÿ ûÿôÿøÿùÿ ÷ÿóÿøÿÿÿöÿ ôÿøÿøÿ þÿõÿøÿõÿüÿòÿôÿ úÿúÿúÿ òÿûÿ óÿýÿúÿüÿùÿ þÿ ùÿýÿûÿýÿúÿÿÿñÿøÿþÿùÿ÷ÿûÿüÿþÿ ïÿ÷ÿ ñÿüÿúÿüÿùÿùÿúÿýÿ ÿÿýÿ ýÿ÷ÿýÿþÿôÿûÿþÿúÿ ÿÿøÿòÿ÷ÿ  üÿúÿ ñÿçÿ÷ÿÿÿ ÿÿüÿùÿþÿûÿ ÷ÿóÿöÿÿÿúÿûÿ þÿóÿïÿôÿþÿ  ñÿàÿâÿñÿ ýÿíÿíÿþÿþÿþÿÿÿ ÿÿþÿùÿîÿéÿîÿúÿ øÿçÿßÿÛÿÜÿæÿõÿ ÿÿüÿüÿúÿùÿ÷ÿòÿìÿçÿæÿðÿýÿ  ùÿíÿâÿÚÿØÿÜÿãÿíÿùÿþÿúÿøÿ÷ÿúÿ ÿÿöÿòÿòÿõÿûÿ  úÿóÿíÿëÿêÿéÿéÿéÿíÿòÿùÿÿÿ  üÿòÿèÿâÿáÿæÿíÿõÿþÿ  úÿ÷ÿùÿûÿúÿøÿõÿóÿøÿ ÷ÿôÿ÷ÿùÿöÿóÿóÿöÿúÿûÿùÿöÿôÿóÿöÿ'# üÿëÿßÿÞÿäÿîÿûÿ ÿÿôÿíÿõÿ ÿÿ  úÿðÿðÿöÿùÿýÿ  üÿîÿèÿîÿýÿ þÿúÿúÿùÿöÿòÿôÿþÿ" ñÿ÷ÿüÿíÿäÿìÿôÿùÿ  óÿêÿíÿ÷ÿ ÿÿüÿøÿÿÿýÿòÿîÿèÿíÿ  ÷ÿýÿþÿûÿüÿ úÿôÿþÿüÿûÿõÿøÿøÿóÿöÿÿÿúÿõÿðÿ  õÿüÿõÿüÿûÿòÿðÿíÿûÿóÿüÿóÿúÿûÿ ÷ÿûÿñÿêÿ÷ÿôÿñÿ   øÿûÿïÿüÿêÿéÿçÿçÿñÿ  öÿþÿñÿèÿëÿøÿþÿ òÿüÿ÷ÿõÿûÿûÿöÿøÿøÿõÿ  ÿÿüÿ øÿþÿøÿîÿïÿéÿõÿðÿõÿîÿðÿûÿ þÿñÿðÿòÿþÿøÿýÿùÿîÿóÿñÿýÿüÿúÿýÿøÿ÷ÿ ýÿ÷ÿîÿöÿ   õÿüÿðÿêÿíÿæÿôÿþÿïÿóÿîÿûÿ ùÿñÿûÿ ñÿöÿúÿöÿôÿøÿöÿøÿýÿúÿ ûÿûÿ øÿòÿþÿþÿýÿöÿøÿ÷ÿöÿöÿ øÿ÷ÿüÿùÿøÿõÿôÿ ýÿÿÿÿÿüÿõÿûÿ öÿ÷ÿ÷ÿ ùÿïÿÿÿüÿþÿöÿøÿûÿôÿûÿ  öÿóÿêÿèÿÿÿÿÿûÿ ûÿúÿ ÿÿíÿëÿñÿûÿûÿùÿùÿþÿÿÿþÿÿÿ ÷ÿöÿ÷ÿóÿùÿ úÿ÷ÿôÿüÿþÿÿÿ  ôÿöÿîÿöÿôÿþÿ ÿÿüÿóÿôÿúÿóÿðÿøÿýÿúÿ þÿýÿüÿ  ùÿñÿìÿìÿÿÿýÿôÿÿÿøÿýÿûÿ ýÿúÿ úÿþÿÿÿ÷ÿôÿúÿùÿûÿóÿöÿóÿòÿòÿ üÿøÿùÿýÿ÷ÿðÿ ýÿ÷ÿþÿöÿþÿ óÿöÿöÿìÿøÿòÿýÿùÿùÿþÿûÿûÿÿÿþÿþÿûÿùÿøÿ÷ÿöÿ  úÿþÿ üÿñÿüÿöÿïÿýÿøÿùÿ ýÿõÿñÿøÿøÿùÿ ÷ÿþÿûÿÿÿ  óÿÿÿ÷ÿðÿóÿ ÷ÿëÿëÿóÿíÿòÿúÿ  þÿõÿïÿëÿ ôÿ ùÿùÿôÿéÿïÿþÿÿÿ ýÿ÷ÿõÿÿÿùÿÿÿ÷ÿþÿõÿíÿ þÿÿÿ÷ÿêÿüÿùÿòÿíÿûÿÿÿúÿöÿûÿøÿýÿ ÿÿ÷ÿûÿöÿóÿ  øÿ ýÿýÿùÿòÿéÿóÿûÿóÿ ýÿýÿüÿ  ýÿýÿ ÿÿòÿòÿóÿöÿüÿóÿøÿóÿùÿóÿþÿþÿúÿ úÿÿÿùÿïÿñÿ  ôÿíÿüÿùÿîÿðÿøÿùÿ ûÿôÿíÿûÿ öÿýÿüÿøÿþÿóÿøÿóÿðÿóÿýÿÿÿ   þÿþÿïÿûÿóÿêÿõÿüÿôÿüÿ ÿÿöÿñÿýÿøÿ ûÿøÿùÿúÿíÿýÿûÿüÿ÷ÿ ýÿ ôÿèÿöÿñÿ ÿÿöÿïÿòÿ÷ÿ þÿþÿ  øÿùÿúÿþÿôÿûÿõÿëÿäÿõÿÿÿ÷ÿþÿýÿýÿÿÿûÿ  úÿôÿûÿýÿþÿüÿ úÿèÿìÿðÿâÿêÿóÿùÿúÿþÿôÿïÿ úÿïÿõÿëÿúÿòÿöÿóÿ þÿ  úÿóÿôÿûÿüÿúÿ÷ÿõÿùÿóÿòÿ   õÿþÿôÿÿÿîÿðÿôÿùÿÿÿùÿÿÿ ûÿùÿôÿõÿöÿòÿøÿùÿøÿ ÷ÿóÿõÿÿÿûÿÿÿöÿþÿüÿùÿüÿ   ÿÿ õÿðÿøÿöÿûÿöÿþÿ ÷ÿíÿéÿóÿùÿ÷ÿöÿ úÿöÿ  øÿýÿôÿþÿùÿïÿëÿÿÿ ÿÿùÿÿÿ  ÷ÿëÿûÿÿÿôÿóÿÿÿøÿòÿþÿÿÿ ÿÿöÿöÿ  öÿèÿæÿòÿêÿìÿüÿüÿ  ùÿøÿõÿÿÿ ýÿüÿñÿîÿýÿøÿÿÿûÿýÿ úÿ ûÿýÿðÿøÿÿÿúÿùÿÿÿ  úÿðÿìÿñÿÿÿöÿÿÿõÿüÿýÿøÿïÿëÿêÿñÿ  øÿöÿûÿüÿþÿôÿ ûÿÿÿÿÿñÿøÿïÿÿÿüÿþÿýÿîÿðÿïÿõÿöÿóÿóÿ  þÿ þÿÿÿøÿòÿóÿóÿñÿþÿ   úÿúÿôÿþÿ  ÿÿñÿóÿíÿøÿýÿôÿüÿúÿòÿìÿõÿùÿýÿ þÿÿÿÿÿ÷ÿûÿöÿõÿ   þÿþÿúÿîÿîÿ  ôÿþÿóÿïÿöÿúÿøÿþÿîÿýÿíÿêÿñÿüÿýÿ øÿüÿôÿ üÿøÿøÿýÿøÿøÿøÿúÿ÷ÿ  úÿõÿûÿ÷ÿóÿüÿüÿûÿûÿûÿ÷ÿ   þÿýÿðÿùÿóÿùÿøÿñÿüÿýÿûÿùÿúÿúÿ  ðÿéÿ÷ÿóÿñÿÿÿýÿ úÿñÿÿÿøÿýÿóÿéÿðÿóÿûÿøÿúÿöÿ þÿ ÿÿÿÿÿÿúÿøÿûÿúÿêÿäÿäÿêÿ  ýÿõÿiaxmodem-1.2.0/lib/spandsp/test-data/local/dam9.wav0000644000175000017500000123745411150047204021434 0ustar julienjulienRIFF$?WAVEfmt @€>data?°  À°À °°    pp° p ° ° €€  p € `Ðp €`P`` p€`@`@ P€ @€p€€€€°pp       °° °ÐàÀ   À ÐÀÀ°° °ÀÐР    Àа     €Ð€ °p€°€À€ €P  €€ppP  €€€€€ €  ÀÀ°     `°°° °ÐÐÀÐÀ°ðÐÀ°ð°ÐÐÀ° °€À°  À €  p ° € € € `pÀPP0@ `PPPPp@`@@P`P0p0@Pp€0€Pp€pp€€€€€p€   p  €°€      €À  °Ð°     ° À À  À°ÐPÀà  à°ÀÀ°ÐÀàðàа°€ €@ @0P0``0ðÿÐÿÐÿ ðÿðÿ ÿ0p àÿ@0pPpP`0p``€€  À€ÀÀÀððð@0p`€@ P@`P0@@`àаÀÐà  €€P ðÿÀÿðÿ ÿPÿÀÿÀÿ€ÿ`ÿðÿÐÿðÿ `Pp€ ÀààP@  PаÀà0ÐЀ  p À€`  àÀ0ðÀÐÐPÐÿðÿ ÿ ÿÿÐþÐþ€þþþ@ýÐüpýýÀüPüüPüàûÀûÐû ûûüüPü`üüàüýÐý`þÿÿ  `ÐÀ à0 à €ð à`0P@ °P ð 0ÀЀ @€°Ð0@ðÐàø@óð é 倿çðâàã€çé`éï@õÀ÷ ù€þ ÿ€  0ÐÐðP    PÀ € p Р PÐàÿPð@ÀPà0 Ð   € À   €  À P ð € `  ÀüPõ@î æ`á°àPÞPÚ`ÚÐÛpÝß°äêàí`ò`÷ûÐüÿ Pð p   À Ð ð `ð€ PÐpàþ ýü üýàþ€°pPÐpP ð à P``ÐàPÐ @à € À P  P€Ð0ýöÐí€ã@à ß`ÛÖ ×àÙàØ Û°ã°èàì€òÀùpüÀý0ÿPÐÀð0 à @ P Ð à  @  @°0ÿ€ýÐûPû°ü@þP pÀP 0 À pà°Ð€À ÐÀð € P `0 ð0û€ôèàÝàÜÀÛðÓ€ÐPÔðÔÐÒpÙ@á°å éàòPù`ûPý@€€P € ð Ð pP`pÀ`  ðpðþ@üûPû û ýP Ѐ`0 ° Pà  0   P€Ð à Ð   À° àÿ`øÀïààÚÛÖ Í@Î Ó`ÐPÐ0Ú`áðâPé õ€üÐýP 0ÿàþp€ à `` Pp°@ð°   à`ü üüúúÐü@þÐÿ` pÀð0Ð àpàP€PpàpÀÐPð!€3%ÀÞàÌàÄ`¹à»Ð¼À¿Ïðè@þÿàþÐý0úpúû ÷@êàà`à0åàì`ö @ ð€  ` Àý0ø@ù°ýpþÐÿPÀp `0 € à Ð Ð À à  ð°`PpÀp° à@°À@ 49°Ø`¼»Ð­ ­¯€·@ÙpþÀ` ðúÀ÷ÀèÀÚ0Ð@ÐP×ðáíôð@%@( !P `° þÐùý°pp ð ÀЀðÿþÐüÐýP@ À À°   Ð  ÀÀÀP€Pà À  ÐD€%ðçÀÇ º@¸€ª`«ðªÊÀûPÐ  Ðý@ú`é@РËѰØ`ßðêóàþ0%ð#à€  àÿ ÷øpþ` Pp @   Pøàõú`ú ýÐÐP`00À€ ð0à PÀðp°`@pP?ð8Pò Ѐ¾à¾©P¥°¢P½ö €0  þíÀͰÉÀÔ ØàØ€âàï€ü0"àÐ`@àPà÷õÀüðP   àà0ý0øûÐüÀÀàÀ €À     À PP@0  Ð@@° #O€%Þ`ÐPÆÐ½¢`£ÐpPp ðú ßPÉàÓàÙàÐðÑåàõ€pp À%P!@ð°þP÷`÷ðù þà  À  ° €ð@ú°ùÀü@ÿ0@Р0€ ° € `Àà@€@°  @ ?ðBÐòÔ Í`Ë€§P™¹@ó ú Pð  íðÕ@×ÞPÏÐÇ@Ù€ñ0ù ð°))`P ÐÐpõõú p Ð ` pÐðPýÐþpp   0 @°@` Àð à Ð`°P`0@€ÀpÀ!EC ñPÛÚÐСÐÀœð»íðPîÐ`%ð0ü°òðå`äÞPÇðÄÀÚ0íêõ€ !*p% Ð`° PôÀòùøø`û   €` `@ü`€@ ÀP 0P €À°` °Ð€ +]à/åîàåÈ`’Б0¢ È€åpÙó`0) 0üàö@ïÐÕðÃàÎ ápÝÖõ Ð"Ð#`(À(À ÐýÀýÐ÷Àïîú`ÿÐðÐð ðÐ P€€ à p  Ð@p00€ Ð@ð@°'€V:Pì€úôÕ•P’ð£`¼ÀÒÊæð@"àPüàð ôàÝðÐPØ Ý0ÓPÊé  €P!Ð0€.@$ðþðìpì0ö÷ó ö@ P 0 P `Àð€`` `À Ð ÀÐ@0"à°P0'ðO>@óÀýð Þp›À•P©¸pÆÀÀàÝàð ü@°pùðæ á äÞѰÈÀäý@ýÐ3@. &ÀÐýï`ôû@ï0è òüÀ@ PЀ À0PP p À €Ðà P"à!à P  & OàEPõ þpàæ0œ˜°®P³p¼@¸0ÕÐà þú!0Püî0ï î Þ@ÒÐÉpßÀóPðÀ÷Pð1à#P$ð!00 ý€üPüÐìÀä óû÷€ùP @à°À`PPà @pP@ð€"'@#Ð$`2@aP=Pô  ðà ”0ž ²`±³0³PÛÀ 0÷€ÿ (PÀõÿ0ø@à@ÓpΠá@ë€èóPÐ(ðpÀ(à'ðÐ `PpüàëpçÀîðñPîóÀ°`PðÐ0 ° @  0àð   "€"`$ .]àN@Àðõ°Ÿ ˜³€®Ð©«Ͱî þ÷Àö0p#à ýP`í€Û0ÔÀÞÀåå€ì0ÿ`  (P"àÀð ø°í`ë0î0ñPñù PÀPÀÀ  Ð àP`àÐ$ 80b8@æ ž¨p´À«P¦€±€Òã òàòýà ð`  PõÀãÀÝ å`ä0åî þ ` à!À€0ÐýÀôîë`íðöÀÿ0 @€pp°  ° àÀ@*SEà   @P¾ðªÀ°À®@¯Àµ È ÏÜPðPù€Pà À°÷ðí î ë€ç`í€÷Pÿ 0 €°  °@ @pÐùðópò€òÐõ@ü€P P pðð`€`ÀÐp°`ÐP8@A!0 Àþ°0é€Î°Á µ µÀ¾PÎӰЀÛðêàúÀ° ° `P P@øöÐõ ÷ ú@ýþÐÿ@ @ Ð @p Ð Ðàþ üÀû@üpþ€  à € € Ð      À  P @ 0  à`ðÐ`àý÷ðpêå ߨÐÖÙÝ@àä éîó°úÿÐ`€P°   ` @ ÐPðàð € 0° ÐР@ àÀ À€ P   à p ° ð   ÐÐþ@ùõ@òðï íàè`åãåèÐêíï`ñàóöø€ù ú€ü ý`ÿ°Àà@@ € @   P@ÐÐP€ÿ@ÿàþÐþpÿÿ€ÿ p€`°°Ð ` À   Ð P À°Ð @ P@`ÿ°û`ø°õ°óÐðîí@í`íîàîpðÀñÐò0ôPõðöàøpúýPÿ@àP    À 0 € À ÀpÐ P°Ààð  °P °€ðÀÀà ðPÐàðÐ@ pÐþûðø÷àõôPò0ñ@ð0ð°ðÐð`òÐòô`õàö@ø°ùû ýðþàÿP°ð@ð 0 Ð0@0ppààÐÀ@pÀð0€0pà@€Pà @ðàÐа°ÿ ü°úPøðöàõ`ôópòòðñò€ó`ôõ öÐ÷ùÀúüý°þ€@P ЀÀ€°€P`àP€Ð ÀÀ€€à`  PÐð`à P  ðð€þÀù@õ@ò€ðïïÐîÐîÐï`ñpóðôÀö øÐùûûü0ü€ýÐþðÿ€Àа€0pPPÀÀàP@@ÐP0` 0€°0à € P  p €` Ðð ðÐäPàPâÀåéàéé@é ìóÀû@0 @ À`ü`û`üýPý û`÷ õ õú 0 PPpÐpàüÀûý°` ` € ÀÀP à @ €  Ð à€°pÐ;@JàBà/€ÝP¶¦ «·ÄÎPÏÔÞ°ôà@+Ð; 80)P@ýï êæä`ÛðÒÐÌàÐÐàø`€' 0Ð0ð&Ð` Ð ÿ@ïßÐÓpÔàà€õ@ Àà Ð0 Ð0 @P à ÿÀàðÀ`4\P^P@0@ý°ÇP ˜ ¡²`ÁÑ€ÐPÜ@éPP& @@KpCP+Ð @ðÀÝÙ×ÛÀÕ`ÔPÒ@Û@íð#ð<ÀDp@ð/@øPððæ°à0ÚÚàðàP'Ð,' €€@  €@þp à°8`càfPXÐ3€úм“ ‹Ð˜Ð¯`ÆÛÀÙ€â€ê !P>0MHà/  é@ÍàŰÆ@ÓpÙßÞâ ë€ÿP6F H :@p`ê@ÞÀ×`×`ÙÜ0ãïÀÿ€°$€-À+@ 0PþP`à ° à@ðp' S@e@`pIð€×@žP‡Pˆ€¡½0ÝçàìÐï ø '`AK°DP(`ÛÐù ÁÐ@áÐëÐð óù 4 C F 90 Ðÿ€à Ì ÆÐÌ Ü îàþ`  ``P  0 °P€P @"G W0WPI !í´€•à‰à™@±°Ô@è÷°ûÀý&Ð40=2°û ÜàÀ¼PÂÀÒ@åàôÐþ`€ð p@%2À70` èÓÈ€ÊØÐêPÿ@p`àP€` Ð Ð   À°ð`à @$@EÀP PA`ì@¼ž°’°ž ´`ÕêûÿðàP €Ð$ð0/P& pôàØpÉÐÄÍpÜÐî°þp `Pp€Ð$@'ð!0@ì0Ú ÒàÔpáô `àð€ 0 À À  p Ðð€° ð°7DÀF;€õ@ʪp›`¡P²ÀÎàåúp€P`°€ %€'€Ð 0ópÝϰËàÒðà`ó`  ÀàPÀà ÀÀú@î åPã`è€òÐÿÐ Ðp€P РP P  ° ð °Ð$`1075°#€ÐâÂЪ€¥`­pÂÚñàà  à @À ` P÷°åØÔ`×`ä€óPÐÀ°0Р P Ð €pú`ôñ`ð ô û Ð ðà p  Ð 0 P à P p ð`' .Ð/À%Ð óðÔ`»¯Ð®ÐºÎ äø0аÀ@ ðàø0è°Ý`ÙÐÜ ç@õ @P€ðÐÐ`@þ üPûPûüà Ð €pÐ ° @ ÀÀ@ p 0 €`ð&+Ð)  î0ÔÀ¾À´µ°Á`ÓPçøàPPÀ` `°`p€püPî°ä`ß°áàé õð Àà@0P pÿÀþPÿ0P@€àР@ p ð pð   À0`P `!p&p'Ð àö€Þ`Ç»@¸ ÀÀÎàPòàýPÐðpð€  PPP` °ÀõÐêàããPè0ñ ý`0°€  €P€ÿ@ÿPÿðþ€ÿ0°@   p Ð @  p p 0À€P `@°#@&@!Ðè@Ò Â½PÀpÍ0ÝÀî€ú°àðP°PÀ À€À€úÐî ç åê òPü°` @à @ ÀÐ °@p ðЀÀ Ð À À Ð Ð ð Ð` À€ PÐ `ÀþêÐÖ ÇÐÂpÅpÐÐÜpë`õÀúÐü ü0ý€ÿðð €àP аùÐð ìàìòàùÐÐðPÀ P   ` 0€` `  Ð  @ 0 ð ð à   p `   à   °``P à0ñ0ã@× ÑÑÀÖ à éàð°ôpö÷ÐùÐü @ð Ð 0 0ðÿ0üàù0ùøÀ÷À÷€ù ý0 P  @ À`°P` `ðPP` p ð  ðà@€àp€@þàþ`ÿ@ÿ`üúÐõðð°î`í ïPòÐô°÷pø÷Àöp÷ø ú`ýÐÿ°ÿ þ€þ°ý°ýþÀÿ@ÐP@ð`0À Ð0ÐÐÐPðpPp@ @€ Ðpý P°°0Ðà °ÿÐýÐýPÿ€þ€Pý0@ý0þø@üþÐ@0ÿÐÿPÐÿаÐþ`þ@ÿàýPÀÿ Àý@þÐ`@€P þàÀPÿ€ °ÿàþ 0Ðð 0þð ÿ ðPàÐÀ`ÿàþPàýýàü€ÿp ùðý€ü`€þüÐPýPÐÿÿ þ   ` ýÀ÷àýàPàú€ÐPððÿÐ`ÿ@ððpÿ0`ÀàÀðÿ@°ÿPþ 0@À0 þðÀÐü Ðþ0`ÐàÿÐý ÿpÿ`ð` ÿðPÿ°ýpPðú ýþpPû`ÿð  þÐü0ð@ÀþÀàúð ðÿ ÐýÐð0Pp° ýà0ðÿPÿP Ðà0PÀà 0ÿ0ÿàÐÿPÿþ0ðÐÿ@pÿàþàÿ°€€ ÿ 00À0 €þ ` þðÿÀÿ@ÿ° 0Ðüÿ àÿà€`ÿàÀÿ0€°þP€üpÐ @üPp Pàÿ P°þ`@þþ@ýÀüÐÀ Ð àþ@ ü€úðÀú€øÀüÐÿþ°  ü0ÿ°ÐûÀ0ðþàÐþ ÿPàü`ÿPþ °û€P ý° ýÀ0 àýàÿ@€`Àð ÿP à€`ÿ0ÿð@@ pÐPý P€ýð@þ°Pþ°ðPý@° ``pþÀÿP@ÿÀ°`€€Ðÿü`Pþ@ÿ@üPPÿpø@0ÿPÿþP@üPÐðúаþÐPüÐððÿ°PþаPÿÐþ€pýPþðý  ÐPü@àPü` °ð ÀüÀü°ÿ €àÿ°ýÀð`þý`@Ðùà@ÐúpЀýüPÐþ ÿÐþÿ@ö€€€ûÀPûPpÿ°þð þàþPþÀú€àùÐøÐ`ùp ùP ü  pP°ýú°`ÿõÐûPàý0°°P@þPü à ÐÐûðþÐÀPü þðP€üÐû°ÿ€pû@ÿÐý@ü`àÿ ø@àüPÐûý€p°€€pÿ  þ ùà ÿÀÐÐð` ü@ Ðû ü0 ðÿ°0à À`° °ûà0ûP ý€ý°ÿÀùP ÿ€0°ÿ`Ðù ýÀ ý0àþ Põ° àûP Ðü@ï@þÿðàþàøpûÿ°ù@ýþýÐü€û0@0Pÿ°p  €ÐP`ÀP``ÿ  ü Àû àÿýp €ÿ  @þðÿ P°þ€üÐPý@púp°ÿ°ÀþP€`€pýp P€öP @ÿ° 0ü ðøðpü°@ûÐpù@ø°`û 0 ýàÀ@pÀÐþ€€ýà0ÿÐ@`P PðÐðppàPàà0ÿ°àðpPpÿ 0ý` @þð€ÐÐ`þ`°ðÀÿ ÿ PýúÀ@ü ÐÐPPÿ``@à À`ÿðþ@Ðÿàþ PÿÐPà€ PP0ÐPý€°ýP0ý`ðþÐý û àú `ý°P  €P РÀ``ðÿ Pàà €0ÀPÐ@àÿð€ÀàPÿPàþpÐÿ@p@ð€Ð°Àÿ`аа`°€   À ÀÀ€°€°€€@` P€€P p€` ``P€ €€ €€  p°  €€ °À °À°ÀаÐÀÀÀ Ðà° àÐÐÀààÐðàð°ÐÀ °  À           À€  °p`   °°°€€ €°°À    À °° °   €€ €°€ € €°PÀ€€Pа€ÀP°PÀ@°€°PÀ€°p°PÐ@à` pÀp°Ð    À°° P €  Ð`0Ðp `°à0 p€ ÷€ú øþPÐ`@ ð ø@ùúðþÐð@ú ` ÿðÿàÐpð@À@°Pü€þÀpаþà€û°ú PùP0þ€ýðÿþ0pþÐþÐþ`ý°ÿ0Pþ°Pÿ@ÿ° þ€@þ Àþ`ÿ ðÿ ðàþ  ÿP  ÿ0P0`0P@€ `à° ÐpP€  pР € `pÀÿ€ÿ`Ðþ`ÿ0°ÿ€ÿ`ÿPÿ@@PP€p pÐPà  pPPp0@°à PPP@pÐ `ÐÐð 0P°ó ìðä ÝÕ€ÑðÌÕÐàÐèîÀù @ àÀÐP0ýðö`ìèPç0ë@ôú€þÐ p€`` Ð @ÀÀP 0€pà$€A0a. ÷Àã€ÜÉÀ³à‰Ðš¸ÊÏ€äîÐà*6à'P&Ð  ÿÀãPÎðÑ ØÒÐÎ Ü ëþ À 0!p'€4À20*P°àý°îPÕ@ÉðΰÚ@èø@à€$ð-€'€0 ` Pýþ@ @ pP &À5 cð\'° àñ@ã°Ìº`•‚P› ¹ÅÖÐë0û`à7P<))€%@ïPÒ°Ä Ê`Ì È`Ñå€õà #(°)5 9€0P%0 ÐòÙ@ËÇàÑ€à êÀúà"ð(P*%ÀЀЀ`pÀPÀ@ àÀ0%À6dPi02PÐöPåpÑP¼˜€”àµàÃpÓ êú@@8`B0€+(PPòpÖðà ÅðÉ@ÈÑæ0õÐ À/°1À5à8°6À%Ð êð×ÍÎpÓäò°ÿ  %ð*P)p'° Ð0pàþ°þ@ð@ `Ð0%ð*ð<€l Z€ €æ ØPÃð¯P‰€À™¼àÆ@ÞÐðÀ€#@€C@.p)àà üêÐÌ`½¿PÈpÊpÙÐëðø@'6P5P66- (°Àþ0â@ÑÍ€Î`Øàâðð *P+À)€%P ààÐÐðþpÿ`Àp°0À$*à- Nl°:ðÀípÙ°Ëи`¢€ …®0ÈàÓÐê ÷À.F°:'0!@@÷ à@Ä@»PÅÀÎÒÀâðî@þÀ0 4 2P6 3 (°° ÷ÐáàÑÎÏÐÛàè`öp À(+P)$€ @`°ðÿ@ÿàÿ`@P #@&À'03P_PX°@÷`ÝÐѰÃP²€€À– ¿ÍPÞ€ìPû`À:Dà+ pð Pó0ÔÀàÁ€ÏðÒ Ù æ ïàP"2P3ð4 1P.'À `óàÛÒàÓ Úâ°êÐöà !à)`(`%`#"` àÐÐà0Àþ@þp@p"P$&à8[ >€àîÀØÓÇP³€0†p¦0ÆÀÑ`ßè@ù  5À8 $PP` Pú0Ü Ë ÍðÖØ Ýãê@ p'@* +`,@-*PP€€óàáPÛàÚàßpç`óÐþ  Р"°#0#`"0!à€` €ýþ°à @pà ° À2PE )ð@í Ú€Ù Ñ¿°¡€›³ÀÇÐÓ@Þá íPp#Ð €€ àõÀæã@çPéðìpëêõPÐ0!` €°°øpôPóPó ñÐò ù€à`P0 ð`€P  p PðPÿ Ð àÀ0  Ð ÐР ûñàêè@æpÝÓðÎÐÒPÙàÞðã åÀèñ°û@@°pPp À@ÀÿpþÐÿ°0  à€À Ð ð`  PÀ À@àÿ€P°ð` Ð ð€ €   p P ``€`°Àð°Àà@PPðÐ`   à÷ñîÀë@å0ÛPÕÕ0Ú@àä0çêpñàûÀ0 P Pà @pÀþ þðþÐþPýüàü@  ° P €   `P €PûÀûþ ÿ ÿðý€P€    0 0 àP P°à0p   0 à PPàPðã0ÝPÛÒ Ä »ÂàÐpÝPè`ï€ô@ÿPPÀà à  ðÿàó€êÀæÀéPðÐõøàüÀàà !à ÐÀöpê`ç°ëPóú€þà` 0àÀРÀ€@p°`Ð0 ЀP0 à1 3 æË¿@Šó ¢ÐªÇã`ûÐP,ð+ ÐòPéPêå`ÙðÑàÐÐÜ@ò €ÐÀ!à) 0@30*ÀÀ €ÿPñ ãÐÕÔàpò   àP%`'€!pP 0àý€øpà @@Ðp@À   @€< 2°ð׳@¬€º@¿ ®ð¢²àÒ°öPÐ#`€ÀP@æàÊ Å@Ï ÛèîPñð@ /€72#` °`ûàïäàß°æ`õpÀÀð   àPÐ 0  pà ` € P `ð€€Pà    PÀ5`A`é ´—`žP®¸`½ Ë â`%`4à#p àîÀÚ Ú Þp×0Í ÌÕ ì à"€)P)`%° p°0 Ð÷pë@êô@ p À `p pþPóàñøÀÀ `ð € Ð à @ð Ðð Àp €P  ðÀÐ  @7P7° ÐÞ0«°”М¯`ÂÀÓâ€òà "Ð&Ð0û€×ÆÐËðØPápæÀç êùPÐ&0`,€@ P@ÐüàÿÐ ÐàP þÐû@ü°ûûÐûpÿ àPÐ P@P0 ð ð @ÐP0РpаÀÐ `   =°4à ðÔ›À‹Ð“°ÐPëpôpû` Ð0 õàÑ¿Á€ÐæøÀû`ùýp@ -°.@`ÐôPí`÷  €   p@ô êPë€÷ @ð   à `   ð`PÐЀà@ àÀP p  à 9p= @ç¦ð‰p‡P@É ð @  P @÷ ÞPÈ ¿°ÆÀÚÀòð à $ "°Ðÿ`íPë`øÐ À#à €Àøàý àúðóÐóü€ `àðÐÐÐ`ð€ °`P°   °°ðÐ & D@4°ÐÆ@€@‚¯àå€ à@pýPûøïðÚpÇ¿ÐÈ ßðúÐp À  °p@ñ`ïÀû°à$  úó ú@ÀpPú`ø`ü àà  Pà pÀ Ð0Ð !p@À à` ðÐ@ ðP074ÐPÝàž€€œ0ÖÐ €û0î ê@êÀâ0ÕÐÊ@ɰÔì€p0 p`þÀö ø0à#Ð$°Ðpò`íñúpP``  `P 0ЀP pP Ð 0Р€` P@ €°à % <€/P Ñp™€€ ¥Ý $p%°Ðûìpã€ã@ÞðÔ ÐÐÏ€ÚîP€ð`@  `à@ €ýÀúpÿ` P@`÷ñ ò°ûÀàà0ð€°`€ P Ð ° ° €P` €Ð Ðð@ €0°Ðà5: @ò€° ‰€`‹Á@ùÐ!°*ð$@ ÐñÀä àß Ø ÓÐ`Ôàâú€€`ÐP 0ðP0üü0Ð& Àpû0ìÐæÐðÀÿ  À` À ðÀ°Ð а@ 0 À€ 0€0 ðP pÐ*>0  Öà `„Ѐ`£× #P)ÀpîáðÞ Ù ÓàÐÒ0ÛÀì@  àÐðàP û úPýàP Ððö î@î õ`þ°°P   PР  à `°` 0ÐP@  PÀ°€6@< %Púà»à“€ ŠP¸ÐíÀð&€&@ùðèÐâÀß`ÙÐÔ Ð`Ó Þ`óPàP° €€ÿ ûàú`ÿ @Ð! ô€ì ïàø€° àÐ`` 0  €Р0 @ ÐPÀ`PàÀà@   À @0Ð*à?07@Àß ª€ˆ@‚@ ÐÏ ÿð`$@€Ðó€éPçÐàÀÚÐÓ0Ñ@Ôã@øð   àÐ ° Ðý€úú   àÐpÀ€ `û°í@ë@ìÀô@û  à ÐððÐ °Àþðp PàPà  °0 Ð@@pð005P<`'ðý0Å› …`‘ ¸ è P€÷Àêàéé`æÀßà×àÒ@Öå0úà p€ @  ÐpPàÿàÿÀ P°à ôððPôPü À 0` Àà  p`p Ð ÐР`ààpp `    +p3#0Òà«à‘ð—°¶Ü0ýÐÐö ì°ëï`ðïÐèßàØÝ@épù P@`P0 €à0  À°pàÀÀpÐ0àÿýþPP0 ð @ ð@€` ð ðÀpÐð P ` `P° @   P`ó`Ü@Åð¾È°ÓðáPîÀòïé@å0èÐï÷`þp`ûñ`ë@è êó þ€ ` € à P pÀ° Ð ý`üPþPþ@üÐù`üpÿP`  Ð €`00p     P  ðPpP`àðPÐp P°ù0çÐÒÌðÑÕPÛàß°ÚÀ×PÙÐápîøÿ pþ°õÀñÐðÀòÐú`  ÀÐP ðð€` ` °°P@ý õ@ôô ø   à à PPðP   @°ÀP    PPÀ@À0°P` 0  ýÀì0ÖÍÐÑàÓð×àܰۀ×0ÕPÖÐÞÐì€÷ÿàÀÿp÷ÀòÀñ0óÐúP0  À`€° @Р`€à`à`€0ýPöàñ°ñô@ûàÀ   àÀ   ðP à À à0 ð` ð àÀ P àóÞ€ÎÏ Ò ÕÀÚðÚ×ðÒÐÑØPæ°óÀý€ ûÀô ò€ò ø° P à` €P`  `Ð ðÐ@À0ÿ ÷óÐðó ùpðÐ ` ` €à € °pÐ0à P Ð € àÐÐà0ð    `û@ê`ÕÎPÒpÓ × Ú°×ÐÓÐÐ`ÓÞ@í`ø°@Ðþ ÷€óàòÀõÀþ` ° `  ÀP €0P`àÐ`ü@ó`ñ°ñ@öÐýpð p €  À€ ÐÐ0P@0 p  0 €pÀ`ð@ à °pð°ôpßÐÎÎÒÀÓÙÚ`ÕÑÐ@Ö@ä òÐü ûô ó0ô ú€  Ð `ð €P`!P `àð0 ð ðÀúPöÐðÀïàô0üÐà ` 0Ð 0€p ° Ð @`ðÐPàÐ Ð ÐPа€û@îðÙ`ÍPÏ Ò Ô`ÙÙàÔ°ÑÓÐÚpèPõþÀPù°ôô@ö€üàÐ ` ðÀ PP@Ð ÀÐ à`€àøÀôpñàòàø   p àÀ` @ðÀÐ@` p    P àÀÀ à  @`ð úëØ@ÍÐΠÑÔØðØÀÕÔpÖÞÐê`ö@þPÿ°ùàõ°õ°÷ýàà` p `Ðp Ppð @Ðý0÷°ó°óÐõÀú  0 à@P €Ð Ð   ð ` 0ÐÀ°P  Р P ðPàÐpù êPØpÊÐË Ñ`Õ Û@Þ Ûð×PØ Þ€éÐô°ýÐÐþø€ò ñ ôàù p ` ° À @   à°à` û öõÐõû €0PP  P Ð `À`Ð °à Ðàà@ °Ð `$0+@€÷`Ìજ £`¼@ÖÐçðù@ý0ðÀÐû ìÐà Û€ÝåÐëñ€õ0ýÐà$Ð(à#PP    ÐÐp p0ðà°ûøpû 0`  Ð   @ € à  °P 0ÐÐ`РЀÀÐ P`% 5Ð!€ÿ°Ï`¦@›°¤`¼ÖèpïÀû` ð ÐpðàÚ ÑÀÔ€ÞÀêñ`ñóPûÐ P+P)à ÿPúÿ ÐÀÐP pÐþ öàõ@üP €þýÐÐ @ Ð@à 0 à @ ` Ð0  `  pp€ Ð À4°/âp²Pžð¤@¸ ÎàPêÐò À À ÿ âPѰÐÛPè ð€ð€îôð`À)°-#ÀýÿPàpð€À pÐÀ`  ü ù°÷°ø€÷ø ü`ÐÐ Ð@P@à Ð à @°°0 ` Ѐà ðð0 %°3à! ùpÈ©£à­PÂØ è€ï@ùPà  °òÝ@Ò€ÓàPí`óÐñ€ð÷P@p)Ð+Ð!àÐû`ýÐ ðà à `ÀàûõP÷àý €ÿ°ü þ € À `  €@0 à 0  Ð   PÐP € Ð P P Ð € ° ð@'3 0ô ÂÀ¦°¥`°ÅÝ€ðP÷pù@Ð ÐûæPØðÓ°Ùàåò@ø÷°÷ @%-@)°ð  ýP÷púàPÀ@à p À Àýü ý0ýþý Ppà p À à p` à 0 ð Ð ` ` P ` ð @ € À   à#+ðPñPÁp§ §ÐµÐÈàÛîÐùPý€þ°Ð P`pôààØÛàâì@ö@ýp ` à`#+ 'p Ðþ€øÐøÐý@  p  àpPû€üþPP€þÿ0Ð 0 € @ €€À @ À ° P @ à à € °    PÐ` Ð0'0%ð `⸥P©À¼Ò`åÐóüÿÿÿp ð`ðàÞ ×Üç€óÐýP P0PÀ"!PP PþPö@öÀûp  Àp€þ ÿÀðàPþ ù øÐþ°  PÀ Ð@0 @Ð0  @€ @ p  °À °à € $à øÀËpª¡®€ÆÀßòýP` ÿ@ýÿ€ð ÐPü êÜÚ`âpñÿ ÐP0à ``` Pöô ø°ÿ€Ð€PP0 Ðû`úüp€ @ °ÀàÀÀ Ð à  @ @ `°Pp   ð€  ð@p$€àûϪð›P¥¿`ܰó€ÿ€Pÿ ü€ü ð °ðøàå Ø×Ðâ ö°°pP€€ÀÀ°00 À÷òÐò ø þÀ``€ @ p `0  Ð0  Ð ð0Ð à  €0  ÀÐ ðÐ'# °Þ@±€—ð˜°pÒÐð°°ÿÀü üÐÿP °ÐòÐÝàÑ€ÔåÀýP # ` `€ðЀ0ÿõ@ñpðôPú0°`Àpàà@ P €à€°0P @àÀÐ  p P Ðp`` ð ÐÐð °#Ð*þÀË`Ÿ€P˜¹ àÀüP°þ0úÀú`ÿð P0 €ýðç ÕÎÐÖ°íÐà%!€Ð@ @pÀ `ÿôíìpñðù P0 €  `@@üÐüàp0` p0 À Ð`а À €€PP  €#à.ð(À Ô°Ÿp…°Œ®Û`ýà úôpøpP `Ð  úåÐÒ ÌÐÕì0€#``° @ #`" °°ô@ê èÀì@ôPþp Ppp0 Ð@à@ý€ù ý Ðð` €À pÐÐÀ à€p` À à &3)0PÄÐŽ€pŽàº@ì°  ýÀïàðÀþPð@@ý€æÀÔ ÌÒpå@þPÐ@ðÀ Àp#à.€,ppPí€å°êPø°Ððpý°øPö0úðà °`€ÀÐýðúÿPÐ   ð ðp` ð ðð ÀPà0 Ðpp ° °0 à3À> ,0øÐ«€€@ÀËþР@épâ€ôÐ *°,Ðú ÞΰÊàÓ`äàø@°€ @ ° 0. ;7ÀpÿåpÞPë ÿð`÷@ïóÐð`P  ÿ@ à  ÀÐ@ `À ` @` € À @°° Pà 0 ° 0 0pA6 @¬€€à‰PÊ`þP °ùæ`ëp`'€3Ð& æÎÅ@È Õ@é ý  °  ð0 @0<Ð!0þÀâÞ°ë@ÿ@p@ú ÷üPP P€ @ P €`þÐÿ°ÀPÐ ` `P ðÐ €  P€04`KG`°³€€€Á`ü Àùì°ø p1P20`úؾ`³ ºÔ ÷à  Ðà€/àEC &ÐäÐÞèô0û@þ Ð€ppPúñ€ó0þ° PP@°À àp`ð ` p ð@ аp  p P 0  €3pOÀJ ी€€@Åpù@PP€$ð 0Ðó Ãœ –@¶ ì€€!P 0)3`/ÐðàÚÔãpþ`"@ 0Ð 0 PÀõ°íîðüà ÀàpP P°€Ð °` Ð p °Ðp à  ðP° °À€à:P[ T@ P–€€€@»ÐôP€, &€Ð € #`ÀÒ –°ƒ`˜@ÊPýP'`:Ð7°$ P@@! ïÀÒÀÎàpýÀ0/À2"à €þ   pð ÝàÞÐñ` @0%@ Pþ@   P@Ðp €à°À P ðà  àðp Ð@OPfàH æ€€€€`Á°`CÀA@!P `ð0 0àp²‘Š@¡ Û`$ðP`Pp5Püpþ0 ýê Ù°ÜPöà 4`BÐ9°! èì ôðpæ0ãPô P@*'ÐPôöà À€P 0 À Àð`Àð ` Ð à Ð ` ÀI@l [Ð@‘€€€ð£Ð€UÀY€8  °Ðò°Þ»Pð€€™ ØP#Xðf@NîÜÐäòà÷@õîìÀù€@6DP:@P€êàá â@æóPøàPp€@Púý `P ð `ÐÐ` € À   ð >mÐf#0²€€€ ‡àù@RàhÐOð-  °ï@æ°ÝÀÁ —0ˆ™ðÊÐÀS@qà\ð'ðpѠΠÞPõÀþ ø@ÿP+@<@< 'Ð0â`Ù@áÐõ   ` €   PýÀ à   à 0    @ 0 À ` Ð0 à à° p@5 e^À&п€€€€†ò IPf T€2Ðë°á`Ú`Àœàà0Ë@ ÐRPpà\0*€ðÐÌðÅØô000°$P5P7@$ÀàãðÔÀÛÐòP Ð0 ûÀúÐúààÐPÿP0€À `0° P°° À P P @ °pÀP7h ^pPº€€€‘ÀüÀJàcðQ 1PÐíÀãÖÀ·à—@’€¥ÀÙÀ €^ÀopR``ã ÅÀÅÐÝûP ` ðà€(`5@2p°ù@Þ Õà0÷Pà @þøðú°ûàú@ý € Ð P0PÐàÀ0ð0p  `   Ð @ `pà °NpaB0ì’€€€°Æð+ðX^€B@P÷àä°Úà ¥€•€ŸÅ`@H@iP_à0÷΀Ä@Õàñà`°@Ð /@3 $ðçØÜ@ï  €@ ýúûP@ ` ý€ð°ó€ú      àPP  °à P p À°@Ð# O`>€ç €€€°Ï0. W@Z = àõ€ä ÖP¾`¤`™@¨ ÓÀ€NÐdSà!ì Ì ÉÝ@ø Ð `€PÀ#€0 0@ýÐà× à ÷  `€ àÐ ð Pûàí@éPíÀýP ðpÐÀ à€`  ÀðЀ   @ Ð ð   @P  @p pR_p;æÐ€€0„@Ü 4 XUP5ð põ ç ÙÀ ¥€™ð¨À×€àQ°dOPæÀË Íàâàüà   0&Ð200à€ø€ÞP× âø@   ° pÐòPê@é°í ýPÐð ` ð°  0€ ÀP Ð P  ÐÀP0   €`'Y V`'ÐÏ€€€¢ÀúÀ= U F&à`ó`æ0Ô º£ º ñÀ. XàZ 8ÐÙàÍðØðð pP0@À*À1Ð& àì`ÛÜ ëP@ P° û íPÝPÞ`ð @@ð °`Ð@ðPpÀÐà P` P àpP ð  à  °)PQ Hp°Ê€Š€€€³€ûÐ0@Dà8P °põàæ Ô ¾€«ð¬@ÈûÀ. O M-ÐÿpÜðÔ°ßPô` ÀðÐ €(`+ð €ìß°á ð°€€ °` Ð0Ðpøðæ`áèÀø ` P ÐP° àð ðÀÀ° @€Pà€ à ` àÀP  €(€7Ð3P ðÏðœÐ…P€º0øP(@<Ð7 "P õ0ä0Ó Ä°¹°½`ÖPþ (ApAÐ(PÀçÝPâ€ð0ÿ Ð Pà#`"Pppïðä@çpó`À € P € ° ð`ôàæPã€ðþÀ@ЀÐÿаP0ÿÿÐÀð@ÐÀ€ð0° ÐÀÀ à    `Ð&€(À 0ݰ®P˜ž¾ÐòðÀ1`.À õðæPÚÐÍÐÆÉÀÝ þ€!P66P!€é`ß°å ó` 0 à °p0°@àð°ê î ù€Ð  À ` öððó€ à àÀ ÿPÿà`  ÐðPðP `€ð`Àà p PÐþÿP  à ` p p ` `àÐ*` ôÁP¢ ž¶ðå Ð+°*@€ `û€ðàå°×°Ê`Ç0ÖÐõ2p5°"p€ëâÀéÀ÷ p Ð Ð@ Ð`Ðàðòàí`ò0ý  °  P ð 0ñ í@ò ýÀp  PÀùPùÀþ° À P€0þàÀ à €ðÿ þ` À Ð ° ` €à à Ð€þpÔP´@¬À¹`Úàÿ p!ðP pðôàèPÜðÑÀÎPÚ òP@$p(@àÐõ`íÐðÐù@ ° @ ` à ÷ ôø€ÿP  À€P Ð Ð ðàóîððÀü0À  ððü€û€ü þð €  àðpÐ pÐРððÀ   Ð ð @à À!`@ÕÀ¯Ð¦·ðØP !$`0 @øÀëÞÐÐ0ÊÀÔñ`À)à+  ñ`ëàñ@ý@°€Ðp`à üàóàôûÐ@p@À€ @ àüÀþÐþ@ú ùÐû À ÀýPúðþ@Ð  p@ÿàþP   pÐÀà`€°ÿ0Ð@ P À`àp   P `ûðÐä Ü@ذ٠âÀñàÐ ° ðPþ òPêÐæç°éïÀ÷0Ðð  @Ðþ üý€ÿ`€   p € @ ÐÀþ þPÿ°ÐÀ 0 @õñ ÷ ÿÐ À P`pÐ 0 €Ð  ÿÀÿ PðpP€@@Ѐ@ À @ `   àÀüàâPΠËÙ€íÿ€ ÐüÐûPüÐõPé`ááðê`ú€  àðÀÿÐp Ðÿ@  àPP °`00 ðýýÀÿ€ ð0ü@ú ü   °ðÀ€€û€÷PûÀ`ÐPPа ðÿÀ0ð`p à°àà €ð @ ú€ôÐóPõÐöÀõòípìñPø üÐúð÷@ö÷ÀùÀüPýûø÷°û@ààPpP €ÐðP à@ÐýÐøÀúÀ°P0àP@PÐP°À@€ 0@ð0` Ð`€ à@Ð ÐÀ @àÐÐê`ÖÀÒPÛ0ç0ï öàü ° à  pü ì ã ä î ùÀÿÀ@Pà`0àÿPðp  pÐ@ p Ѐÿpÿ°€Àÿ@ Ðððà ð€pü`ÿ°PP °À€ÿ ûÐû@þ°Ð@°À€ P@À0P@0@ÀÀðÐà`À @ÿ€þ°þ€þàþÿ€ÿPþ`ýüý ýàüü üPüÐüàü ü0ü0ü€ü`ýàýPþ`þ`þ þàý0þPþÐþÀþÐþ ÿ 0``0@0ÀðPÐÐðàÐàÀàÐPàÐPPàÐð`PðPð0ÀÐÀ`P  P€@Ð ðà àÐ0@0à @Ð`pÐа° à`àp@  ÐÀðàÐаР°À0@0ÐÿÐÿ`ÿÐÿÿ ÿÿ0ÿÿÿÿ°ÿ€ÿ`ÿ0ÿ€ÿÿ°ÿ°ÿÐÿÐÿðÿ ÿÿÿ ÿ ÀÿÀÿÐÿ°ÿPÿÿÐÿÀÿ€ÿàÿ ÿ ÿÿÀÿ ÿÀÿ@@@@0`pP0P@`0P`p€`@àÿðÿÐÿàÿP`PPPP``p€€à€`€°ÐÀ  ÀÐ@ÐàÐР àðð  0€0 0Pð0ÀðÀð°Àа°ÀàÀÐðÐÐààÐа€° à°° °€€°  € €p°°Ðð ÀÀ  °°ÐÀ°°°      ° €      €€  €p€ €p €     €  €@P€PPP PPp€€€€€€p€€€€€€p€€€€pp°    p  €p€€€        €   €À  ÀÀ°ÀÐÀ ÀÐР°° Ð  °ÐР    ° Ð Ð  À° ° °Ð À€€p€€À°€  €     €° €€°  p`p€p€° €À°€pÀ€°€ €€€€€   p€p p€€€  €  €€€€€€€€€€€€0€€Àp€p€€€p€€€ €`p €p€€€€ °    €   À€€€°  à°Àð À  °   Àp€  p°€°°ÀÀа`  @óÐëø@À pÀ à`P°`ý0ÿРúpîpîûð Ð@ pÿ`úý°0üpÿPÐ ð€Ðÿÿ@þý@ýðýpÿÐPp 00ðÿ€þ€ÿ`€ÿÿðÿP ÿ ÿ@€`p``P€P@ ÿP€€ P@Ð`` P àà `ààÀpÀà€ €  @@°ÐÀ€p€0` ÐPP  °ð PP`û0þþpàÿ àÀ  `àÐÐÿ°`°@ð0€ð PÐÐÀÿЀþÿà@ € ÿÀðÿÿPpÿ`ÿÐÿ`€€€€€P@``€€p `P €€€€Ð€`À€`° °€ Ð€°°À°ÀÀ°ð ðp€à `€°àà àÀ€  àÀp`  €À p   €€`P`pÐÿpp°°€€°€Àÿ °` °PÀàp  p à€0 € `PÐÀ@à`°°@а€à° à°ðÿ ÐÿÐPàÿðÿ€ÀÀ  °0€ Ð0ÐðpÐÿ P ÿ ð° 0àÿ`°€`PP°0Àp€ `€ÿàÀp€þ ÿ°`ðþ°ÿ° À€€€p0€€ ÿÐþ°ÿ°pPÐÿÀðpàÿ€ÿP PPÀÿàÀ ÐÀ P °`€ Ð PP°ðPÿÐppýÐþ € €PÀÿPÀýýÀÀ0`À@@ð°00 Àð@° Àð ÿ`Àpàþpÿà`Àÿÿ  pàÿ°€À`Ð`àÀðp€ PàÿÐÿ  PÿÐÿ`@p ÿÀÿ °p ÿ `PÿÐàPðÿ 0À€`0PÐÐð€  pð€À€€à P  Ð PЀ€° P P Ð P   ° €€ € €p Ð€  PP`À€`° °ÿ`ÿ €p@PpÀ@   €°° ÐpP°Ðp00€  €p ðà €  p  P ÐÀ€Ð°€ À°Ð  p  °Ð€  °°`@ °°€ €°@` pPÀP  @Ðÿ°ð€`@ €p€`€° €àPÐàÀ°ààÐÀP €°°Ð  €€   °Ð°p   À°     °ÐðÐààààÀÐàÀÀÐÐР    ° °  ° € °  pp` À€ðÿ``P``€ P@``€`€ €€p€p€€€€€p°€€p€°`°p€€€°p€P€   €€€€€ °€ € €€€€  €p€€ ÐР   ÀÐÐÀÀ@`À€€€`€ €ððÀ    à€0@ÐÐà а °°ÐðÐðàÐ àÐðÀ ÐÀ°  °ÐÀ°Ð °    °À °   °`0 0     ðÿÀÿp   0 `@P `PPp`p€``€ €€€P `p`€pPpp@ €€p€p€p€€ €°àðР€  ÀààÀ0PpÀÀ°°°ððÐà  ° €           °°  €  °À À  °  €  °€€€°€ €  ° ° ÀÀàÀÀ  °°  °ðÀ À€°Àа °ÀÐÀÀ€p  €p°  €Pppp €€Àpp  €€€€€€p€€€€P€€ €€°€€°€€€°€€ °pp   `€   Ð°   Ð  °  ° ÐÐÀ €°À° € €À  €€ °°€pÀ  p€€€  p   À €€À°à°€ € €  €€€°À€ p€ ° €€€€ P€P   Ð   °° Ð° €À   €€€€€P€  €€  °  À€€p p€€€€pp €p€p€€€p€€€€€`€€p€€€p€€`€€€€€€€€p°€€p€€p€  ÀÀ  Ð €   °° ÀàÐÀÀà°À°À° °   °°ppp€` €pp°°p@P°€€€€€pp€€€€pp€€€€€€€€`p€€€€€p€`€€ ° € p € €€  €  €°Ð€  àÀÀÀ   °€€p€p€€€€€ €€€ÀP   €Ð €€@p  €€€€p  €`€€  °` °€€€ €€€€°Ðð°°   `€°€p  €€  °À°°ÐÐÀÐÀÐÀÀ°ÐÀ°€€À  À° pÀ   ° €p€@€€P€Pp€€°€p€€€ ° pp  €€ p€€0@€€€ € €€p@€€  ° ÀÀà Àà   ÀÀÐÀÀàÀ°ðÐÀÀÀà°Ððð`P€ аàÀ 0àÐ ÐðÀàÐàÀ°ÀÀ    °°   À À€À°€ À€  À   @@`Pp€ ÐÿPP@ 0@0 €pp`pP€€€€PP` P`€ €€€ P`€p€€€P`@€PP €€€pPP`€pp €€€€€p €p€€€€p   €`€ °Àppp€pp€€€€€€€p €€€ €€€ °€€   °° ÐÀР°€  °°Ð  €  àÀÐàаÐР Ð  À      ° °Ð  °°  °€  p`PPÐPp€À€€€€€€ €€€ €€ €€€p€€€€  €°  °   °   ÀÀ °à €p°°   p °   ° À°€€p`€@p``@0`0Pp°p  p€P`€€€p€€€€€p €€€  €€`€€€€ €  Ð°°ÐÐÀ °   p°  °€À° € p€      €€€€P`p€P€€€€€@@`@ €pP€@P€PPP€pp pp °Àp € À °À Ààа  °À  °À° Ð    Ð ààÀÀ° €À  €À°°°°À°°À   °      €€€ €€€€€€€`€P`P€€€€€€  €       À °    ° °À° °ÐÀ À°À ÀðÐа °        €€€€€pPP`p€p €€€€ €      ÀÀРÀ    €      €p€€€€€€€€€€€€€€€€€€€€€ € €€€      °°Ð°°°ÐÀÀÀÐÐÐÐР°ÀÀàÀÀÐР° ÀÀ °   € °€`ÿ@ÿÐÿ@` ` ÀÀÀ p °p€@P€€€€@P`p€€p€ °€€°p€0 €€Ð0ð`€€° p°ÐРð °ÀÀ@ ``Ðÿð@ @ppÀ@€€°À  °À°°°àÀ  ° P€ðÿÀÿÀÿ°ÿ€ÿ ÿÿ þÐþ ÿPÿ0ÿÿ`ÿÿÐÿpp`€p ÀPÐÀà°ÐÀ P ðÿ úPöÐîÀçÐäæ èÐê@î öPýÐÿÀ€ Ð °@Ð@ðþÀþþ þP@°À  PÐð °P  @à   `àó@äàÐâpâPÙ Úpí@òñÀüÀ` P P РþàPþ÷pôðóðöø÷ÿð  0PÐ à @ÐÀP °àðà @ à`0° 0 @€ÀçðØÐÚàÙ Ö@ÒÝìPïðòÐ  @ ppà `ÿPýPðpéÐê@èÀäìõÐý` Ð` Ðp0Pÿà ÐP ð@à P'Ð/°Ð ððéÚ°ÞÔàÉÊÐ×pããàíÐ à`ààà €Ððô@ñPð æpàè ìðîø0 PPàðP € 0€ `Ð ð0$À-)  àpï0Þ€ãØðÈÐË Ô@Ý@Ý0èý0àPÐ`0 ÐúPù€ö êãê@êÀè`ñ€ýP€PðpÐÀ` ðð@ÿ@  P Ѐ€$€*À&ààPôêPéPÙpÍàÒÔÙ°Üé÷àýàP 0ððÐÐàÿúPñì@íðê0éPð`÷°û°P ° °P  ð`àPÐ0 € @#€$P `PPóð0æÐÙÕ€Ú×PÝpâÐî0õ€ü€°  ð€ÀÐ €`ÿù`õðò îàìÐïñ€ôúÐÿÐ@Ð ðÐÀ   p  à€ @ÐÐ Àà  `úÐóî`ä°ßàãpÞ°ãpç@ïò@û0 À À  à  @þüÐ÷õÀóó òpõ@øðúðÿ € € Ð à P à    àPpàp Ð @ P@ö`ô`ñ é°ëé í°ë@ô€ô°ûÐþ@0À@0ÐÀpÿ€ü`û€û€ùÐùû°ùpûÀüàý þ ` 0ð@P ààÐð  0 P0 P ð`õûÀùðì°ëóÐð@êPõÀø ùú0PP€°ðÀ€ûPýPüÐù0øüüûÀý €PÀÐpPÐ ppÐÀÐðP ÿPýðýþÐûüPþþpýPÿ@þpÿÐþàþ`ÿ þþÀþ þ€þ ÿàPPþ0þPÿýÐû@ÿ`€àp€  à  ÐPú0þ€û í0ìÐô ð0íPöþÐüÐÿ0À   À 0 à  Àþ`ù ÷°÷Pöõ`÷ ûýÿЀ0   P€P þàûPúù ù ù ûðüÿ  à ÐÀ0@àÀ þPýüPûû€û ýþÐÐЀp°`ÿ0þàû`úú€ú€úàûPþÐà@ÐÀPP0°ý@ûPúÐùù€úàûpýÀð0Ð 0À€€ÿàþ`þ þÐýüÐPðþ ÿР0@°à ÿÐ`@ýþà €@P P À°Ðþüpú°ú ûÐûý ÿpð P0€ðÀÀþ0ýpü ü ýÐýPÿ€0  0ÿþ`ý@ýý€þ ÿP `ÐðððPÿþàý ýþPÿ `   Ðÿþ0þPþàþÐþÿ ÐÐ@°€Pÿ@Àðàð0 `þ`þþý0ýÐýþ PàÀ` ÿ@ÿÿpÿ€pÀP@€°p@P`  àPÀ PЀ€`ÿPÿÀÿ@ ðPÐà °ð €ÐÿPÿðÿ €€`   Ð 0àÿÿpÐ0ÿàü`þP€€@ ð Àÿÿ0`àÿ €P`0 àp ÐÿÀÿp ° °@Ð ð  úÀùðøø`ùûþ€P pÀp0üÀù0÷ ÷ ûp€ ÐЀ°àÐü@ù@ùûÐüÐþ0@°`P þ`ü ûàúÀüàþ0ÀЀ°ðþpü€ûüÿÀ0ðÐðPÐ ÿÐýÐýðþÀ`P`ðpþPù`÷€÷Púà@00P€ü`ù`ùPüÐþpà€ð@pÐþ°üû ü€ýP€ÿÿ€@@Ð p@ÿ`ý`ý @ðððÐðþÐúPùÐùàüÐ`PPþàüpüýþPÐ@ÿ°P ÀPPРP €ÿ°ýÿÐ0Pðþð à ` €÷ðñÐô@ú€þ€ÿ ÿÐ ` ° ðø öpøüÿþ@ýPÿàÀÐàpP à``þ@þ@€°€P@p 0 pù`ôðò öPþ€PÀ€0°ú ññ÷@€ ðÐ@ÐÿPÿðÿ€àpÐPÐÀÿ°ý`° Ð`Ð@°PþàýP@ pÐü ïëñ€û€  PP@P ûà÷pøûp  €  `PÐÀÀ À Ððÿ ÿÐ ð þàðÀû  °°ïPÜÚàáÐÿà0P àýÐøø þ@`÷ÐãàÝPì@ÿpð€ 0ÿ0ú0þÀ @pÀ°@À Ð ° ð € À€p1Ð怹ð®Ã ìÐ/!€Pø ï ÝÐÍÕ ôP€/À1°ö`ÝàÔÐÕ â@ø `à"0 Pò`ïàúP à @   PC0N` »€à„´`PU°P`%ÿô°õÐ÷`æÁ²`ÉÐ5PMÐ> ÜÐÁàÀÑÐéðР'ð&ðôÀàÐä þÐ- " Ðö€ø`)p` P90ÐÐÇž¢ÐÌPp6/°`þ`ñ°ôàþàñÕ°ÈÓpõà 6€,PðàPÍ€ÐãúP @ pôÐîÐ÷@ "p% ùà€!%€>°Zp*`Ö”†@£ ó°DÐH +ÐÀí ç÷@å0ÍpÎpä0 -P5@`ë0Ó€ÎPß@÷ ÐP`ÀPù@ñöÐP &ðøpø `& $0@ÀAmBÐåÀ…€Ð…pàQPcÀC ðà@Õï 0è`Ä ¾ÖðP9àDäÈÈàüð  ÀÀ  ûððÐôÀ€€+°€óöÐ@) 0@!mp^`Я€€0¤PdàX`0 ùÐÓðØÀýÀùÖÐÃpÉ íP ÐC1pàÕ°ÅÐPêÀà°p@pòÐð€úÀ€)€'À°ü ó úÀ'P)ð @dpr 7ÐÑ€€à‡õÀbpc€@`Û@Ïõ€áPÆð¾Ù <ÐJäÄð¿ÐÖúð Ðð0ðàçÐñ °&€0 °í@ó`Ð,Ð&Ð @`}ðUÐó`‡€€ÀÄPM€j`O@çPÐPä°ðò0ɺÌ÷°+ðP2pø Ì°»@Ê€ç@    À ö@å@ëàÿ°€30&Ð ïPí€ûÀ+°)`5ÀwÀ[ðp™€€P²À3h W@*ñ°Ø`ÞÐÐøÐÑ ÀÀÊ@ñP €Jð5àþ°Ò¾€Ëå@0àà°õ ã ì`° À2 $`àîðî þÀP,P)P&@s`lÐ(м€€–0Àf0a€6ÀÐã ÙÐýà@Ùð¿Ð¿ß `@`Dà âPÅpÃ@Õ÷À€!Pðÿ€ä€ä@ø p1P*  pñ@ípý@@&+PKðP_à”€€¶ 0peàVP&øPãPèÀ@ò°Ì ¹ ÉðP"àIà7@pÓðÀÇpÛ`þ€@# °÷áê0P#. €ð`÷PÐ$€ZðÀ^0õ ƒ€€€È0I`g0Nðp÷çàòÐã¾p´Ñ0þp/ MÐ2°€ÓÀ ŠØàùð#@(pðôPà`êÐà%*€ý0î0ú °$ðBðpuP°¦€€`£ h Z0-  ôòàé@¾Ð®Äõ $`G`:À âðȀÀÎèÐ@*ðþãÀæÀ0!(  ÀõPþ€p€^ð fðù`€€€ÏðGÀ]°KP`Àý°Ð÷ È@­à±Û0 €9`C` ú°ÞpÏ@Ì`×ë# '€öPé`ô À# ° ü°ú`   Að t`¢€€ ±`(€ZLð-°À0ÀýÀÅਠ®@ÑÐ`3°@ "Ðï ÜÀЀÓ0à°øpà$ @Ðò€õ `À@þP`P+ð€~Ð5¹€€›P 0K A 7p)° pÇ §P¬ÐÈÀö€ ; *À ÿÐãÑÀÈ ×ðíÀ # ÀÐùÀ÷à pЀ` àððPCPÊ€€@“ü@8,À3À0 ,P!@ É £¨ÀÆ0ð`/ð( ` õpÖ ÇPÐâ°Ðþ`P ° À @`Tð0\ø Ž€0‚ÎàÐ"P, 17 -@ép±P©ºÚ€û`€'€&€ÀèÏ€ÍØó   à@ à PЀ ° Ѐ@' |`r-Í€€°¢@íÐà* 9ÐÐ? (à ÐüÀèÞ áô À$ %`àöàù À3@Xu`[° €€0§p€CNàA3ð%@@Ð˘Љ€¦àÝÀ$°QÐN06P€ ô€ß ¼P§à»PíÀ%`C@9ðÀú ð`è°é@ó`P`° ÀýÐ÷`à/pQ j°iÀ( µ€€‘ è0FÐ^ÐQ 3À@ € àЦŽPœ€Ê`Q[ A õÀáðڀͻÁ0æ97 ûÐí ïàòp÷ ° `À @€ÿ àp.àFð` dà$ ´€€àÀëpOÀiV@- pú0õÞ ²P™à¤0ÑÀ`Rp[Ð> péØ ØpÔÊ@ÏÐï° 4p.°°õïöýàþ   @0  P @% 5J°j°F0îà…€€`¹ 0m`f°=  @ð0í€ìPÏP®0£ ½ú@<à]ÀMP"Àò0Ö0ÔÐÚ×ÔPæ°P(à- üÐî öp€ 0 Ð   à €@-N0p@Iì‚€€ÀÃÀ>€tdP2àýpã@éàðÖ³`¥¾€ûP=€\PKÐ ëÑÔá@á Üè@ "P(àPý€ñÐù``ÿ`P ° ° 0 @  €Ð!€= cP_°§€€žp hðnI` 0äáðÀì`̯€³ÐÛ0 OàSÀ2ð0ØÀÏÐÛàæpä@å0øð%€ðô`õ`@PýÀP ° ð @Ð! B@jÐS0ð•€€ ³P)PqÐg8@ü0Úà õìÉЮ€¸è(T`O°&€òÐàÏßàí`í°ìüð@à0÷€ú 0üù°ÿ @Ѐ0 ° Pp:°^`c $°³€€šàe oÐH€ ðÞݰð°÷`Ùзð²`Ó0FÀR06@àÙÀΠÙPêPðPï`ö@€ @ €üPù`  Pÿ@úPü€À Ðà@p Р#`AÐg€W Pš€€@®%€q`g@6úÙðà`øPôÐÏ௶ãÀ QàP°)PöÒðÎ ÝÀîÀópô`þ P@ ùPû   `€þ€÷û °  à€ PÐ@ ``2PTàl08`Í€€Žì YPqÀN`Ðá`ÛÀï@ÿâ»0®°Ç@ >€U >  ðÞ Ïà×0èñ ò öP`@€ ÐûÐöPþð  €àúðøÿ àP@00 €P9ÐX cp)`½€€P›pý°]àiCàÀßàßàóüðÝ€º´ÔP €@°Mà2`ÐÝðÓÐÜ`ëPóàõðüÀpPÀ0ùpù   À0ù@ù@P P@ Ð à`€à`p$@AàgðP–€€».kðZ( óÝ@èýPñ δð½ ìP$0J@EÀÀóàØ°×Àâíò÷0Ð@ °ü öðü@ à`ÿÀø@û0 ð@  РР(?d`M°š€€€¹@&ÐdàY,ú âàæPøPîÀ΀·ÀìÐ @FàC`"@ùÞpÙ€àê`ñpúàpPøó`û€Pà À ùÐùÐÿ 0  à°àþ`  '@= \HÐÿ0¡€ð€p¸ðYV@/ €çç°ó0ì°ÒоÄèà; > %0åÜàÐè`ïàøÐpP û ó@ù à 0 ýü ÿ0€ `À  @ðÀ Ð)ÐD°Yð0@ÞŽ€À’`Ø 0àTHà! ý ë í€òPã ËpÁÑöP"0<@6 ýÐçà€âÐç@í@ú€ p € ùÀòø°À`@PÀP` ððPý À@`/ðK€FÄ ‹Ðˆ¨ï030H`;ðñòÐìPÚðÈ0ÇÀÚ°ü !5°/0`ð@åãðä é@õà€° ààû°úPýPÿP ÐÀÀð ð€ð  `€ÐÐ 7 GÐ+`ô@ºÀ›Ð PÃø@À)( @PÐð@Ù`Ë@Í Üô`pð!PÐpýô@ìàæçÀï@ú`à P`@€ `üÀùÀúþ€à Ð 0ð` À P@`ð€` @)@%PÀôPÝÐ`Ð@Ü€éòúPP ` à P€üðôñPðñàô øÐûðþp°°ÐÀP ÿý°ûÀûPþ ð`àÐP€À °0À`€pðð  À Pà@À`P  €ðÿ°ÿÀÿpÿÿ þþ0ýýpüàûÐû ûüü ýþÿÐÿ@`ð€ € °ð@@  ÐÀ Pà°PÀ°  °Ð €àÐð pp@ð@ÀÀÀ   PPðÿÐÿ ÿ ÿÿÀÿÀÿàÿÀÿ ÿÀÿ°ÿÐÿ°ÿÿ ÿÿÿ€ÿ0ÿ€ÿPÿPÿ`ÿ@ÿ@ÿpÿÿ ÿàÿÀÿðÿ0```P````pp€`pp€€€€€€ °°°  à° À  àÀàððÐÀà°À  À°°  ÐÐÀàÐÐРÀ°Ð °ðÐÐÐðÐàÐààðàÐ` àððààððÀðÐàÀ°°Ð      À  €€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 @ÿpP`ÐP°ÀP0ÀðP`€ððÐ Ð p àþÀúðÀðàí€ðàîPð òüÀýà  ðÀ0°û û ûàø0øúPÿ`p@ ` ° à `  pàÀðЀ À€"€Ð à@ó°æ°çPá`è€Ýà ìÀú€ô@þÀ`@   P `úüùó îîÐô öÀóú`ð @ 0  àððþ°ûÐÿàp@ ° À @@@àÀ%ÐýÐ `üïÛÐâàÐ`ä ×ÀÝ0æÿ`õP À`0 @ àýôõ°òìàì€ë€ð0öÀø ü°0 0ÐÐ   €ÐpÐüùüPÿ€Ð p@€ °pà*P°ü÷ÐçÐר ÐâØ€Ý@ì` ü°€ÀÐ °ø@ðPïPî êðêê€õüÀþpPP0 €``ýþ ùP÷@üP0 `PÀÀ°`€Àðð'€ úÀþPö`â°×àÕ Ôpâ Ü°à°ñ`€€ P@Ѐ0 @õ í í€ì`ëì î ù€  Р`à à ÐPü ú`ûà÷Ð÷àü@` Pðàà°€P % øPü€ô0ßàÚ0ÓÝ`å`߀ã úÐ` `àP °PÐô`ïñ ðÐð€îñpüP@pP°   °€ ü@ûPý`û@û0ÿð` À 0`Ð € ðPP"  ÷ ý€ø@ë@× Ú@Ðàä`áààðêpP`@À°Pû`ðÐîàîïñPïàõÀ   ÀÐ @ @ ú0úûúþ ðð P@Ð0 а @ P$@ðú@ÐúÐëPÜàÙ@ÔÀäÐàÀßðê ÿ   @`ýó`ðÐîPðÐòPñ õÿ@€ Ð @P 0üû€û ú`ýP` P Àð0 p @ P À à $P`ÿ þ°ü0æÐåàÔ€ß`äàäàÞ`ñ°ûÀÀ  P`àÀ ðý°õ0óÀð0óô0ó@öðþ     P pð  °à ÿ€ý üpý ÿ Ð €P Pp Ðà0Ð @pÀ€ýpýPî°í@ÝæÀæ@éPâïàó þÐþP` Ð p0PÐúùÐ÷@ùÀö ÷€ùPþÿ`0° à P0à€ ð`Ð P ° `0 ð°ÐPPðÀP@Àðàú ÷ ï@ïÐïÀðì@îPñpö`øü@ý ðаðP0ðPÿ àþ`þþ@ÿ ÿ0P°Ðp àÐ   0P p@ÐPðÀàðPÐ@0PPÀPÀ°€þÀüPûàúúpùàøpùPú ûÐû`üýþ`þþÐþ€ÿÀÿ@0PðpPð ÀÀ °À€€`PÀÀÀàà РР`0@ àÀÀ° @ Ðÿ€ÿ`ÿ ÿÿàþ°þ€þ€þþ`þ€þ þþÀþÿ ÿ@ÿ€ÿÀÿ ```€p°À00€P€°°À°À pPPPðР  ° °€€ `PP0@0PP€€€   €€€€€€€       ÀÀ° À    €€€€€€€ €€€€p€€€€€€€€€€p€€€€€p€`€p€€€ €p€€p€€€€€€€ p€p€€p€€€€€€€€€€ p € €   € p€  Pÿ°Pð°€€€€€€p  € ° €€ €p€€  €€p€€€€ `€ €€`p€``€€€€pp€€€°€€p°€€ €€ p €pp €€€€pp  ` p  °p°p   p° ` €P€Àpp` PpPÀp Pp€€°pppp€€P€0À`À`€° @`Ѐ€P  p€Ð p`@€P €ÀÀÿP`Ѐð@ Ðÿ@ Pðÿ°Ð0°P`PP@p Ð0ð°°`ÀP PP@€°àÐÿ@ðÿ0ÐÀ  ðpðPà`°ðÿð°ÿ°°Pÿ€€ ÀÀ€`PP@`Ð0p@ÀÐþpÐ `À Ppÿ À°À0ÿÐÐ0P ÀÐÿPÿ@0°ÿ ÿPÿа°` ÿPÐýÀ@  €üð`þ0ÐPÀPð°þ`PÿPPÿÐ@Ѐ€ÿ`ÿ0  ÿÐ@ÿÿð€àÐ@Ààðÿ ðþPÿPý þP û ûРþ@PðÀ ü `ÿ þ€°00PP°ý`0P@ÿЀÐÿ @ýàþðàÿà€þPpüð°0 `€ ðP`ýàþÐà ÿððÿüp÷pàý€ÿÿ@ÐÀ@àýð`Ð0Pÿà ÿ€0ÀûЀðÿ` €þÿ€ûàPPü`Pÿ à°`ü@ üÀàÿЀPPÿÐÿà000Àüpà` ýðÐü€`Àþ`PÐüÀpÿà°þP0pü `ÿ°ÿà ðÐúüÿ@Pü°°ûÀ 0Püàðÿ ÿÐàûÐÿ°þPP `€ÿÐü ðø@Ð ý PÀpþðЀÀ°À0``P`àÿ0€ÿÿ ÿ` ÐÀàýÐû   P@ðþ ÀþP@àý @Ðýp ÿpþ °ÿpýàÀýàÐÿÀ@þû`€þ`°þ°0ÿ°PÿP°û`ðÿÐùÐÿ`þðüðPP ÀÿpÀÐÿ þ°û °ÿ þ ýpàþà°û°úÀÀú0ÿРPú€ þ€ø@Pþ`ÐÐü 0ø€ üÀPÀPý°ð  `0Pý€ PþPpü€PþpÀ€pPpú0`°Àû À 0`ÿ  Ð`ûà0PûàÿðÿðPàp þÀÿ@û0Ðÿ `þ  ÿ ÿ °À ü þà ùàü  °ûÀÀPPðàþ€ üPüp`ÿ@Ð`þPÿ ÿ`ðÀûÐP@àýPü ÐàýÀÐýÐÐÿàÐýÿPÿ@0ú€ÿPýÿ°Àþ þÐÀû°þÀààþÐ`û€ðü@ð`P@àÿÐ@þ°ýü€àýÀàÿààü°ÿ€€ð@ý`°ü pû0ð@ð û`@û`0ýàÿÐ ðÿà€À`` 0þ Pû@°ÿÀÿpÐPÿÀ`°ÿpþP@Ѐ` ÿ°úÐÿ°€PðÐPýPP÷À üÐþ `Ð ÿP @ÿÀ0ýÿ@à`  ÿð`ÿPûP€P Àÿ@àûð ÿÀðÿ@ÿP°þ РÐÿà`ýàÐü€ü° P€`û @ Ðÿ€ðàÀý `üP0P ýÀp`°0Ðpð`þp þà€ý`P Ð@ýÐþü`ýÐýÀþ0pý0à°p@ðpþPÐþ@ üpð0üPÿ@°þÀPÿà°û Pþþ€ ÿ@pp °ÿÐPý  ýP`ý ÀÿÐ`àþ àÿ pÿ°Ðý@0 ð  ÿþP@Àà ÿ`À P@0@ ÐÀ`ÿ° ðþ€Ð0àÿð`ÿp ÀPðÀÿ€ÿP°€ ðÿ€ÐàpPðÐPÀ@à pàPÿ°`àÿÀ€°  Ð°ÿà`РÿÀ €pþpÿ`p0ÿÐÿÀÿpà€@pÀÀ€  `ð PP€à Ð° °Ð°0 p àÿðøÀôñ`ì èç ì@ðÐóøÐýЀð@À @ð ÿ0ýàý`ÿ0à@ @ ÐàРp P €p .0ù÷ó`ð°ÞÎÐØÀìïïPöü @ ðP 0à@õPé@ê ìçPç€ïù°@@€0 P0àРÀ@À P€)À60>Ð`@õ0íÐÙÑðº`Á€×àëÀï€ûp   (Ð*pÐ 0`þí°à°ÖØpàÐåpçô€àÀ0ðpÐ0øpö÷P÷ ùàÿð@Ðp"/`:ÐJp4P ìàÐÕÂ@¸p®àÈìÐþ`@€$€5P8&ð0õ°ìp݀ˠÅPÉ@Ý õÀþ`ÀÀ!ð!0P ððùÀîë ð÷ ÿP @à @"P&Ð.`Ep;Ðá0×ðÏР¿€±€Í0ûÀà &°13°ó Ý@Û`Ò ÇȰÑ0ì° €@ p"`0 0ùìí îÐí`ñ üà ðPÐ @ÀÀ5°M0îÀÝÙ€Ò Í·0ÂPïp `&P.#0÷àÖðÕÐՠРÏPÖpîÐP$0#ð  à î0á°ãPíðòàùPÐp Ðàð à`€ ,R4ÀüÐÝ Õ`ÕÈ Àp¸@Ü@ @ÐP $Ð+%àÔ@ÈÐðÒPÑàÚpï`€,À-À#`@ ü°è@Ú Û@ê°÷à `ð 0  P € P ° 0  P2TðC àÙPÑ0ÑpÁ°½ µÖ Ð&à! "Ð& ,P"€ÿÎðºÐÆpÐÒàÝpôp8 :p)€à0ï Ú@ÍÀÐ0æ þP PÀ ðà Ð0`€ 0 Ðp0`"`8NÐHPÒÊÐÉð¼0º@»Ù 1°.%*€(Ððô€Å ±¿@Ñ@Ù0èP#? A€,Àûß É@ÅàÎ è€ð&*ð!Ðàþô õú`ÿpð ÐP0 =ÀK 0Pð€Çп0Á·½PÌàñ "p90ð($  ØÀµ °ÄÚðè@þ@3°@à;!@åʽ Å€Ù`ø /p2À+°PPï@èÐì÷ ` ÀP'Ð2`>àDð€ÎÀ»àºP¼À Íã :ð<@+@"ðÀÐãP¾P¬@»pØ ï@ Ð.@;°p$€€€í Öp»Ð°PÅë€0€& /°0p(0pì`РÌ΀Öë`°!`2Ð0°àPøPêPã@è`ö€`€@ € '`3PT0&Ù°³ð¾€ÃÚ â@°9ÀJÐ/0P°îPÝ@Ç ´ ¹€Ý °'p,*0%` ø ÕǰÏðÜ@ì`ÿ  *0 !àõ@í€è@êpòÐÿpP аP 0p(@; U 0Çà¨Ð®¾àÌpâ€ë  CðK°, pöß Õ@Æ`¸@ÂÐé@,1P,À €Ðë Ï Ç0ÔÐêàþÀàP$€%àþÀìç ëô€ÿ@`Р ð€ @Ð pP€'@CZ€½°œ`¦ÐÀpØðì°ñ€D`OÐ0é@ÐÏÀËpÄ€Ëí6;€-ðPûÐçÑ˰ÙÀòP !`  ÀúPê åìÀùà°   ð @`   @ `Àà+ðCP_à" ÈÀ—p»PÔ`ô õ° 9Qàpô@¤@Œ€ ÀÂPЀ€4€=p. 0Ó`¨`¨°Ççàþ°`*P5p0 àç ÈPÂЀí€Ð !°PpþìPâ0åàóP @ 0Ð ðþ0úüÀ@ Àðð  Ð À PÐ*ÀW6 îP¨P‹ Ÿ€ÇpÐ'à#ð*p$p@Úªð£À ëpà(ð' € P€óPÒ`ÀÀÆ@瀠'P*°À€ ûPðåPå ñPàPðÀppÐÀÀ ð  À`Ð0   ° ðà*PT 3ï°¬`‹€°ÊP/ð$ÀP`P@怳À£pµâ@67@"0 `àúàãpÍÀÅàÙ°%Ð5`,À°ü€îàëàë ðÐ÷àÿÐ À`  ý ø ü° P ð°€ @ €PÐ`  p  ÀP5àEÚ€¨”à¨áP 1Ð+P à ÐèPÄൾ°ä`7°;P&ð `û ôÀñPìáØ áùÀ°.ð.þÀçPâàé`øPÐ  ð ð @ €ðüú`þp Ð P°þ€ 0À 0à  P`0pð4@* àÑ@ª`¥½pò + ) ààÿÐé Ñ0ÄÀÉÐçÀ .À6ð' °ø@íêpìàìÐé î`ú€ 00"``óðìPñ þ À `ÀÿР à Ð ÀаÀ @€° àÐ €0ð@àP ð( ! °Þ€º°Á@ê`P(°*€PÐú0ø€ø0ò@æÚØPçÿ@(€$À@óïPò`öPöÀõàöðüÐÀð0þÀøúýÿàþÐý@P °@0 àüÀü  àР@ Ð Ðp p ÀPð û0ß°ÊðÄÒ ì €€ Ðý ö€ò`ïëàæÀçàïþ€° Ðü€õ`óàôp÷ðøûÐý@`Ð Ððàù€ö@÷ üPЀ À    ° °ÿ`ÿÐÿ@`  ààÀðPÐPðàÀà ° 0`è ÏÄËPãpÿ0`"à`Ѐö`òPñ@ð€ìê ëàóàp 0 ÀPùpòPñ0ôPø`ûÀýp` PÐ@ P€ýö@õù@ð` ð ð°p°°p ð@ÐàÀÐ`  ` `0 òÀà Ö€Öàà`óPÐÀ0pÿP÷€ópñÀðàðÀñàõÐüà 0  ü ÷ÐõP÷Àú°ý0Ð P P ÐÐüÀûÀýÐP` 0Ðð€ ` ààÐP`ð` ðàp @P@P 0 @ ô䨰Ö0ß0ïPаÀ 0PùÀóÐññòPóÐõú0°P @ Pü÷Pö@÷ú°ý°p à À € Àÿ`ûÐúþ0 ` 0@àp€ @`ð`@ Ðpðð pP`00úPðæáPáPè ôP€ à  àpú`õÐóÐóÐõø ú þP@ÀÐ  àþ€û€úûðü0ÐÀÐð@ðàð ðð ÐÀÐp0`Àà°` ÐÐàpà° Àÿ÷PðPêè êðîöÐýÀÐàýpú@øP÷ ÷Pù`ûÐý@`PP€p`ÿ°ý`ý@þàÿа``À `p@`ÀÐ``€Ð`Pp0Ð Ðð°ÐpÐð ð°ÐÀP@þÐö0ðPëðéì`ñ øÿp@€ýðú°ù ùÀúPüPþð0 `à P0Àÿ€ÿ`€à €°€@Àp` P pàp Ð ð€ÀÀàÐààÀ°ÀÀÀàÐÀ`Ðþ€üù`öôPó@ôÐöpú ý00 Àþàý ý0þÿ°ÿ @ð€@@ðð€``ppÐðà @° à`€P  ` ` àPpðÐÀ ÿðÿÐÿÐÿÿPÿpÿÀÿ0°ÿ`þý@ûú€ù ùúPû°ü ý€þþÿ ÿÀÿ°ÿÐÿ ðÿðÿàÿ @`@@ðPÀ@0` `€€@ ÀPppÀÐÀ°Àа  À ÀÿPÿàþ þÀþPÿ€0ÿPÿðþþ þ0ÿ€ÿàþ@þýPýÀý€þàþ°þÀþÐþþàýðþÐÿP°Ð`€ð ÐpPpÐ`àÐ@  à0 ð€Ð@`Àð`€Ð`ÀÐÀ°p@ðÿ0Àÿ€ÿÀÿàÿ@ÿ°þ@ÿ0ÿÀÿÀÿ €ÿàþPÿàþÿ ``ÿÿ€p Ðÿ`ÿÿ ÐÐ`€ÿ0€€€Ðàðàà``PP°Ðàð°€ ðð € @°ð €° Ð °pÐPP@ @ €€P °ÀÀÿ  pÀàpà@0ÿÐÐÀPа   °° °@РРpÀ   °p ÀÀ € `àÿ €€€ °Àÿ0Pÿ °À€ÀЀ@°€ Ððàÿ0°  `°@°   €ð0Ѐ°ÿÐÿ @Àà  °ðp€   ° €@ ÿÀ°à°  ÐРP °pp0`Ðp €p ÿ p°€€pÿÀÿÀ pÐpP ` p€° P0ÀPЀ`p°p`àÀÐàÀ°€€€À `Àà` ÿ €p€`PP ` P0À°0p°P€€ °Ð а ð€ Ðà 0°ÀP ÀÐ`ÿ@°p €ÐÿPð €ÐÐа`€Ð0 ÿàþ  àÿ àÿ€@Ðppà ÿ0ÿ°P€àÿ @` p ÿàÿP°Ð`€Ððp°À€€ÀÀPPP@ àÀPÀ€À`€ðЀÀp Àÿ° ÐÀP ð``À0€° @  p€°àÀ   € Р€  °    À°`P` À °€€À`ÀÿP  ÀpÀP °€Ð€°°ÐÐp ÐPp ð€ Àðp    €pÐàðÀ p@pà PP€PP  PàpÐðÿàÿ°ÀðP` €€À°Ð€à° pP  ÿ°€€àÀpp€ €Ð°ÿ`@Ààÿp° p ÿÐÿÀÐ`°°€`pÀÿ€ ÿàð  ÿÿ€P€Àÿ°pPpÿ@°  ÿ€àà€`p° Ðÿ0 ð €àÀð0À°€  ` ÐÿÀ°à pÀà`À€0°° à°ÀÀð @Ððÿ €pÀ°  à° Ðÿ°ÿ°pа@€ ÿÐÿ`Р €` `p`°à РpÿPPàPP°€ °ÀЀÐ0`ÀÐ`@à à °   ÐP°°°0ÐÐ`Àðà ÀÀÀ°Ð°€€ÀÐ0P ÀP°€0ð @Ð  Ð@Ààÿ€ÿPÐÿÀÿàÿ@Ðà°`  P°ÿÐÿ°ÿ `€ÿ@0ÀPpÿ° àpPÿÿ@ pðÿ`Àp ÿÀÿ `ÿ@ Ð€€€à°àЀ   @0Ð @@Pð àÐ`€ÿ@Ðàÿ ÐP€pÀÐ`ÀÿÀÿ €°ÿðÿ€ÀpÐÿ  € € € pP  À ÐЀ` À €P` Ð°p€°Ðа °€@ ° p€€€àðàЀ @€°ÐàР `    €€` €°€  À  ÐÀ p°Ð`  €  ° Ðð p` €€€`@ðÿP €` €°€€€€€p€€àÿÐÿ`€€€€€pPP€€`€p€  ° ÐððÀp  à° ÐÀp€€À € À€€ ÐàРp  ð0Р °ÀÀ   ° Ð° € € °€ € € Ð°   `     €€      €€°   p  À €€      €€°€€€`pp€€€ €pP€€`P €€pp€€€€€p€€€€€€€€€€€  €  €€€€€€€€€p€€€€€€p€€p€€€€  €€€€ €€`€€€€€€ € €€€p€ €€pp€€€€ €€€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° €€  p0p@€ €€ p€p pà° Ðð`Р°€À P `Àp  à€ ð` P€ÿ€ ÿp@P0 `€À0€ðà°`Àð°ðð PpÐаÀ `ЀàÿЀÐ@`° €ÿÿPðÿÐÿÿÀÿÐþ À 0àà`  ðÀ€€ÿ àÿÀÿÀp À`0Ð0ð€@ð À P €Àÿàð`0ÐРÐpÿP€pþ àÿ€°àÿ€ÀÀpPpðÿ þ€þ ÿ`þÀþ0ÿ °ÿ@` ÀÿÐp`pà€ °€àÿ p€p€À°@ @ P pÐÀ°€Ðp€P  à 0ppÿ þðþàýüàþýàùàú0ù@ôPóàò0ñÐðòÀóðôö€ùÀúüÀÿPÐÀ@p ð P à     P @ P    à à € P à ` € ð Ð @ P    Ð Ð`0úÀð0ìàåÝàpÚÚàÝPÞâ0è0ëðùÿà@ ° Ð`À  ÐÿÐþàýP à Ð ` Ð  °0p à ÐÐ0àÀ Ð À`ÐPðøÐíÐßÙ ÔÌÐÉÎpÍPÒÛáèpó€þ°  0€`@ `Ð`ý€ø÷ðö öÀù ýP°` 0ð`P@ °` pP °` À#0ÐÀ'°p ÷çÛ× ÓÄpÆàÐPÊ`Ò@ÞPæ ë€÷ à `   à Ðú0ô`ó ò€ñ0ôÐûÀþP  °°`Àp €àÀ PððÀ€À. 1Pðê0Ø0Ø`ÒPÆP·pÒÆ`ÆPÙ@æàåPò  @À€&@P€ðüàð îÀíÐì êó0ùàüP°``ÐÐP`Ѐ à `5ý€.@0pÐýípÙÀÙ°ÏÌ · ÔPÆpÇ Úãåò Àà  %P°PPÐPÐý@ð ìÀê0éç î ôø€0  °@p `° à `P @ `À:PõÐ1"@þ ý îÝ@ÚðÏ0ϵPÖàÆ Ä`Ú°àpãÐï`àp'°@ð#РPÐõì0ëPépâpé ï ñ ûÐ P€à P°Ð p    À 0À ÀÐ`1pï°@PÀ€ðþàê@ÞPàÒðÎවݰà ɀܠã`à ï 0 Ðð$@À!@P`öóPìéáÀç ê îõPÿàp €pà°`À  à @ P@p Ð'` ûp< Àý0âpáá`ÕðÈ ÂPÜ€ÂðÎPßâ`á€ó€P ÀÐPP PÀ üøàòì@å€íPéÀëPõ€ûPþ €€àРРPЀ Ð  À -Ð €@3 `À ÿ á`é°à ÙðÏàÍ°Ú ÈàÕÞ€áPâàöü€ý@ ÀÀ€`À PÐP°°ó ò ïî épð€óõ€û0°@P°°@0€°ðP PP@°p° €P$ð`ppâpðÐçÝÙ°Û ÛÐÐÝPßãÐã`õ ôùàðÀ @ À° pÐþÀüÀùöÐñÐõôö@÷0þ€þ` P €àÀаP@@p  p Ààà° ð Ð @þP°Àü þ`àîpðÐõPéå`ëðèßðéPê@éPìPõÐóp÷Pÿ@@Ðð àP € À àÀ ÐPþ`@°þÐÿPÐÀP€`Ð`0ð 0`€°€P ÐÐðP€þÐýüþüÀúûûpø@ù°ùøð÷ùùùpú ûúàûýPýPþPÿÀÿ@P`àPàÐ0 àÀP€pàPPpPð €PPð°`P00   °À  àа°@ÀÿÀÿ`ÿàþPÿðþàþàþÐþÿ0ÿðþÿðþ ÿ ÿ ÿàþ ÿðþÿàþÿÿÿÿÿðþ ÿÿ@ÿ€ÿ ÿÀÿP0P``€`€À°Àðà àð°ÀÐààÐðÀ      Ð €€€`pp€p`0@P`ppppp€`€ ° Ðàà°Àà àà0P @PP@0p0°ðP0 Ð0À°Ðа°  p€ €0@€`@P0`P0Pp €€ p€€@€€€€ÿÐPÿÀ€`ÿ° ðpÀ€`°p€€€°  p€p€€€€p€ €€€   À °° Ð  € p  °€€ € p € €€ €p€ €€ p °°€p€€€€€€ €p  € € €€     €€€€€€€€ €€€€€pp€€€€€€p`€€€ €€€€€€€ €p€€ €€  €  À €€ €p€€€ €€€€€ €€  €  ÀÀ°        ° €€€p€ € € p p °€€€€p€€P€€p€€€€°àðP`þ@øÐú` 0àÿÐüýÐ@°þ ÿPà ààþPþP°P €ÿÐÿ  € pÀ@àP€PðÿPàþàþÀ0p€àþ`ýÀÿP p€Pàþ ý`ýþÿ`þý°þàÐððÿàüýp°@ Àú0öú@À 0úðô ù€P PÀðù@ýðÐààÿÐùú þ ð° ÿ ý°ÿ`°À°þ°ü@û°ÿÐà°°ûÀúø à @ýàýÐ0À  ýùpü ÿà°þ`ÿý@€ð€þ`ý þ` à`€ðPÿ`ÿ`ýPÀ€€ÀðPPP°û@ 0ÐþÐú Pà°ðúPû ü0 ð@PÐP   üÿàûpÐ Pýàûàÿ`@PÀàPÀÐ`ýpûPþ ð ÐPPððýpÿ þ@ÿÀü0À`€ýÐPPPþ€úüàРpàüþ€ûü°ÿ`@pàþ P °PÿPP ÀЀýPüýÀ@ðÿ€þðþÐPÐ`ÿPü@ÿÀð Àþ°þ€þ àþPþ€þ`à 0ðpÐþ@ý@þÿÿþP Ð@Àþ@þÐþþþ€þ ÐÐÀPÿ ÿÐþ°ý°pp0 ú`ø úàþ °à ÿÀüÀýàð0ÀPàþàðÿpúüÐú ÿ€ °PþÐý`°p €Àþ`ü@üàüÀý°þ0P`Ð@°@ú°ö°ú ýÐp€`ÿÐ0ÿ ÿýàþÿ`ÿàÐ @ûõ ÷àû P€PÿÐý@þ°þÀÿ0Ðÿ`À`P0 û`û`ý€ °ðý€úþpÀ€Ð Pp@аðÐP @À  ð `ý÷Ðóöpû  ÀÐ`ú@ðêÀíàô øùP÷ÐöÐôÐø0ü0ð þpûPû  À@p€ à °` Ð à ЀP ЀpÀ `À @ÿýàþ0àà ÐÀ@åÐͽð¿ÍÐç@þ   `ò°ä߀ܰ߰çÀïÀú  € Ð ý`  ` ` ð° p°ÐÐ@à@P Ð` P°Ð P°1Ð2P(ÀÐËŸ€• ®ÐÑ àÐPôÀá`Ö ßâðä@çêîàö@€þþ`` ÐÐ0ÿðù0ÿ  `!``p Ð p ð0P@ À PÀü`PBÀJP=ð Ì@–ð…pšÐÂPø€' PPí`Þ`ÜPÚðÚÐÚ àíû`  þàúàþ@À0  û@ü0@0 À à € ð°  ÀÀ` ÿ`°=€JFðPÕ €à¹ÿ/ :P&  á ÎÕ ÛPàåpèÐñðü` à  ýÀõ`û0@ð ðÿÐôõ þ P°!@ à À ` à p  à `P€  - KG6à󀩀€à›ßP(Cð>íÊPÇpÓÜPììÀî ùÐ àPóô`ý  °ðÐö€ò0òàÿà€  "0p° pP0Ð @ pÀ0!€L°Kp:ж€€°pÛ/€T€MÀ €äÀ·0© À ØÐòþÐþPP @°ð çð×ßPó`&P(€`÷pçpçàþð@''€ P°`0Ð@ð000àJ€`Jà0 ÎP‹€`‚p¿`[ÐYpE0ø€¶p¡ ©`Ç ç€Pü€P   0ð Þ€ÖPÔí ))°pù@ä ê`ý` $ ! pÀ à  Ð€Ð°P ÐJg@SÐ5@Í€ˆ€€`ÁPddK°ø0´ ›ŸÐÅðæ`þðð Ð À `àå ×€Òðä` À'ÐÿPê€ê@ú€à€€  Ðp P` ð€PÐ+€hg J ¥€€ ™°æàUàuPZ.°Ðp›@™µÐÕà÷ `ûÐ@#@õÀÔðÎ@ÓÀõ`$€"P 0õ@êò ûð Ðp` @ p   €0 &PNi`V3àÆp€@ƒÔ60nd0?ç°¨œÀªÎ@ïð€ù`ð€$À°õ€ÒÎ`ÒÐñÐ`" ÷àè@ò`þÀP0À  À °  @ Ð!°*@h°mpL ¢€€Ðž`ò`€xàQ°$°Ì à¢PÂà×îÿ0ó°p!à+`#`  ÞP¿Ïðã à"Ð 0 @ü ñï0þpðà € ` P€€€  $°*DÐmpYÐ.€Ï …€pŒ`å 2pm^Ð-ë ¹ «ÀºàÓÐÞÐòóàà.p(@ å€Á€Éæp@ÐÀ °ùøÐðàø€pðP Àp  $ . IÐm0Y &À¾€Ð—P÷@0iQ"0âp¾`¸ Ä0ÑÖÐêô  +@40#ðýÜpÁÐРï ð úþ@ø øPýP 0  @pÿ€@`@$à-°dÀgAà P¢€P… È pV€^4À0ãðÉ0ÁÐÑ0ËÐÍëà  3À1Pípր̠ÞÐøà Ð 000Àÿù@ö@ùÐ P°Ð ÀÐ P0!8àepY`'àÙ@›€¨àõp%`GÀ?à`üPè`ÚÐÉ ÉÐÆ Ôôpp'`)0ÿðèß°Üðè@ø€ @ Àÿö@ôüpP  p  à  &T€ePG P¸P‹à–@ȰÐ*7°- PÀò€Ü°ÅྰÃÐÜ€þ!à  îæ0âè€ó€ÿ` À°ü÷@ø  0° Ð@€  À FUðA `Ë@ª€²Ï€ó€p` PÿìÀÔ É Ëàà0òðàÀ€üóðì ìñÐú € àÿü þpP` `ð0  Ð P Ð Àp°7ÐDÐ8à àÆàËPÔÐä0ô€ü @÷Ðé0ß Ü0å í€ôùüPýÀÿýÀú þ ÀpðP°à а  Ð Ð p p ð@@00 à €ýðúú°ùàö0ö÷ö@ö ö÷ ÷ ö ö÷øù ø€øàù`üþÐÿppÐ``0àа0 €ð0@° `@ðà`ÐPàÀÐÐPÐÿÐÿ ÿPÿ ÿÿàþÀþ þþÿ þ°þàþ@ÿ@ÿPÿpÿPÿ`ÿ ÿpÿ€ÿ@ÿÿðÿðÿàÿàÿ @ 0ðÿ ÿ pp€p`€p€€pp€p0àÿàÿ°ÿ°ÿ@ÿ°ÿÿàÿðÿàÿ@°ÿ P`P`pP€€ ° ððÐÀР°° ÐР °€°    pp€`ppp`pp€p`€€Àа0`    ð0ÐÐÐÐðÐÀ        €p €€  °À° ÐÐÐàÀðÀÀðàÀÐðàðÀÐàààÐààðààà° °À     °°°° °À°        `Pp`@ pP PPP PPPp`€P@P@€0`€`°€€€ppP@€` P€0°PP0`p€€p€  €€€   À °€€€p€pp€€`€ €   ° °   ° `°`  € € pÀ€    p€€   À    °° °  ÐàаР àÐÐР°ÀÀ° Ð ° À°°       €     € ° €€ €€€p€``€p€€@€p€p€€€€`p€€€€€p€€€€€€€€€€€€ €€   €€   €€€€p€`€€€€p€° €°€€€€€€€€€€p°€€€€     °ÀÀ  °  °°À°  °€  ° °         €` € € €    €€€€€€€€€€€€€€€€€€ €€€p€€€€€€°     € p°€€ °€ €  €p €€ €€€€€p€€€€€€  €p €  °   €€€ €   € °    °  °    Ð   °ÀpþÐùÀúPþp €ð ÐÀÀаÀ€ €°À   €€ €€ P0PP0P €PP @€€€°p€€p€€ € €€ €€€p €°Ð `€  €  °àÀÐ Pú`ñ°ùÀ€Pà ààpPÿ°ÿÀ`ÀÐÿ@ÿЀ€ÿÀÿÀ0`ÿüþ`ÿÀpÀð0À` €ÿ ý@þÿ€ÿàýþÿ @0ÿpÿ€ 0P@ÿ`P@€pÐÿ°ð À`€ €À Ðà°°p`ðððà À `à°Àp€ Ð ÿÿPÿðÿàÿp€0Ðÿ@à@@À  `À P0°ÐÀ€ @Ѐ °àÐðPÀ0`Ð@À€ÐÐþÀþð0°00€PPõ€ïîéÐä°Ûààî°ú`üÀÿ àPÀ€ýpøðÀñ@ø@ÿàõÀ÷` €pP  €P`Ð €À€  ð  À À@ p ð !ð@  éÐÒ@Õpº ¸ ²0«PÝpû @à(& +P 0`ß@Û°á°ÄPÆ€Ïàç ý À 8°6°& à`ì`éPàրݰö  Ðà PüÀø@øPð@î°õàР  ð€` € p à pÀ`@ PÐ@àPÐ!€$ BÐ×ðà à½@·À»`½û ðÐÀ @ö`ÏÃPÊÜÕ`äPþÐ10ð# €æpÓ`ÚãòpüPP'05 ,° Àþ°ì@×pÐpÝõ0  ð*`,°püPüÀýpùPþÐ  PÀ`  €ð@ 0pE ÿÊð¼Î°Áи ½ ÓÐP#p€P  ôÏ@·ÐÄ ÚÐç@ãÀà$:01° °°ÞÀÒÚô@ÿ 0°$À7€/@Ðôïàç ÛðÏÀßÿ@€ @#0&0ÀüîÀñ@þ 0ÀÐ"P` Ð À pÿÀÀ  €Ð @ Ð@à"`= €Î`ÐàÑPƵÐÃàÑ àà PÀçÖÀ Ïpà@í í&°+0%  p°û@ãÐÛ@ëÿ€° а%`€àõ ãÐæPåâPîÐpð%`PP pûpï@öp ÐÀPpÀP0°ÀààÀ@à @  °D0@ÍPÌPÕÀÐཀ Î` 0ð÷€Àç`ÔðÀ°ÓÀë@÷ô €(p)PÀ PüPú åÐß°ôP €°` P`þÐëðíðí éÐë€ü p0Ðà€õö€ÿ   Ð ð  p`€@ `° 000 Ð ð  ° IÐ`ÎÊ€×`Ôà¼P¿ÀÐP P0õ@äÀÏÁ@Úó@ûðø0-P)ð`ûðù@÷ðã°ã`ý ° `` î@å ñò@÷þ P° àpÐú öÐ à€PÀ` `Ðà À  0 0 0°PC `ÌPË Ú Ó¿ÃÀÛÀpàþò`ÿ€úÜ ËPÆ€äPûÐþÿÐÐ+ p PùÐõp÷ÐóàæPð0 €€`P À°îÐëù°øPöÀÿÐ ÐÐ þ@üP° Рð  Ð`Ð P    ð `°p P `  5@<ï0ÈËÙ°ÊðÃÐÊ€öà! PøPóPùÀè°Õ@ÅÀÏ`öð @&`&Pðÿ î ñ÷€ðÐëà €`ð€ ð àñàêPöÐþ°ÿ €PP  À ÀÐ €ð àаp Ð  ð 0 p ` p°pP ð Ð ` P€I`@Î`Ä€ÐÓ`È ÈÚð àîÐñ0í ÛPÎÐÂâÐÐ `&Pð ïæ ñàøÐð`ø€ÀP  àðöÐïöþPP `€ ÿðp€ @ `@ ° àÐ À p Ð àð P P°Ð PP0 Dà#`Ú€ÈÍ ÖPËÇÐÒ ! òÐë@ë`ààÕðÄPÚ@p@ ðÐ0ð ôã`îû@øøÐ °Ð€°ýÀô ÷Àü ð€àþ`€ €PP`p @  `  @Ð  à  Ð @ @€  € àA€ÐØÀÃàÆØ0ÒÀÉÀÓ@óä€âðáÛ°È`Ù@€P€€ø@ãê ù ÿÐð  p°Ðûú úÐøpÿP€ àp €ÿÐðP ÐÐ ð° ÐÐ @Àð  à ` ÐÐà` P°  PDÀ&ðßpÄà¶`ϰրÑÒÐý ÿ0ÝÐÖPÜà°Î`Ô0ù#@  P Pþ°æäàí`ÿ àPPðp€€ô€òüРÿ à € PýÐýP@àÀ Р@@`P@à  Ðpð à à 0 ÀpàÀ Ð` €P @5E€Í µPÉàÛ×`Éßð`ípÑ×°çÐÝàÍ ß@þð*@` úÐëpä@î€ Ðp€0ÀPõ òÐø0àýÿ @ Ð @À ``P p P à 00  `ðð p P Ð   €  p)>àÙ ¸ÁÓðØpÒPÛàÿ`ù°×ðÐÝpáØÐàPð@°(Ð'PÀ ü øðìPçó` PÐ` àù ó€öÀ÷ýÀp pPp °Àà`0à ð €Ð @  @À°   @ à p  0 30 Õ0¶ÂÐØðÛPÖ@Ü ôàþ€ÜðÒÀÙðâPå`ëí€ÿÐÐ$0@ ðúðü ù0òÐñ€÷P €ð ÐÀРàòPêÐíÐù` À p@€ àý°ûPÐ pPPÀ@ p`p Ð À ð Ð  àp&€€þ@Þ€Ò`ÚðÜà Þ0ßàáPí€ó îíðìàèPêPïpõ°ùPÿ0Ð   0Ð@P€ ðpÐP`@€€ðpðð PРÐ@  ` €  €`  Ð PàÀÀ0à` À°ÿàúPõÐðèðã€ãÝÐÖÜ`߀ÞÐà å ê0ò ÷Ðù@ûàÿ0 € @ ÀðpðÀ€ @@àþÿ úPö÷Põô ÷ùPù ýР@  À ð @``0 € àP@°@ °û€púÐõàñ€éPåpæß°×`ÛßÀÞÐá@æÐê ó0úÀüPþPð€ à @ € PP@P € Ð@°àúàùðøöP÷ ùPùÐú PРà ð`ð ð  @@Ð ` 0  @ `ûàÐPø€öñç€æÐåÀÜP×`ÝàÜ`Þâ äêpó`øû°þ à Ð € ° À 0ð° °  `€`ü0ù@øà÷øÀ÷Ð÷ ûpÿpP @ ð€àð`  € @Ð@Ð P°ýÀûÐýÐöpô íàå€é€ãÚ`ÙÞPÝ@àPâÀåpì€ôøûÿ°à Ð  ° ` €° à`ÀÐý ù0øpø@ø÷À÷àúàþP°` 0€Ð0À Pðp ð @àP @ P@üÀÿÀÐø÷Àñàéàç è à0ÚÀÜ°Ý ßPá@âÐçÐï ôàøpü0ÿ@ À P @pðP` À ` @ÀPþ0úø0ùPøàø ù@ûðþÐà@` À € €ð €PPPÐ` P p °`€ýP ú ÷ÐñëÐè`é@â ܰހßâãÐãpè0ðÐôPø€û€þÐÀ `   Ð    €p ° ÐP€ÿàüPù€øPù°øùú üàÿ °Ð PP`P0@0Ѐà P P P°ðÿ PþÐù@õ î é€ê°å`ÞÐÝÐßPá ãàãçíPó ÷Ðúþðÿ  P Ð Àp  à À`0Ð@ÿ0ý@ú°ùðù°øPú üÐý@ @ ` °pàðÀÀ `` p àà @ü0ø°ñÐêÐëPèPáPÝàá ãÐãæëñÀõpù`üÀþ0àÐ @ 0 p`   € 0 À@þÀü€ùÐ÷0ø ÷÷ ù û þ`@0à` Ð P pàà0 @À` ``°ÿPûðöàî ëÐêå0ß@àá€âÐä åPéPï€ô`øÀûÀþ €P Ð p p ð à  °Ð0 ýðú øÀö ÷P÷Ð÷ùÀûpþ p@ Ð °À€Ð@Ð`° Ð@ à0ü÷ðPíÀëàå0à0â€âãPå°æàéðÀôøÐú€þ`°€0 `  pÀ °  p Ðýðúà÷àõPö ö0÷à÷ðùÐü ðÀ € àÐ@€0À`ðð€0P€ ðPþàùPò0ïîðè@â€âãPäæàæ0éÐîPôðö`úýàÿà°À @ @ p À p  ppýàùðö ö°ö@÷à÷@ø`úÀþ@PÐ0À Ð @p€€À°Pp À p `ÿ€ù€òñ îàçÀâÐä°äå0ç è€ëpð€õ`÷úÐýP € € ° € € p PÐÐ@ÿPþû÷÷`öÐö÷øùàûÐþ  Ð 0ÀÀ`°àààÐÐ Ð `àù@ôðò€î çPåàæ æÐæ@èàéPí`òÐõøû@ÿÀ @ P P € à Ð  P ` PðàðþPüúÐúÐùÀø0ø øú ûýýÿ°€@` p p  `à  @@°  Pàþ@û ö°óÀðìpé@ê êpê°ëÐíÀð@ô°÷àùPüÿÀ0P P P €  @À°ðÀ°þ ýÐü€ûû°ú0ûpû°ûü€üpýÐþ@P° Ðà@àÐ à P à p € À P à €PÀþ0û°ø0öÐóñðÐïï ñÀò óàóÐöù`ú@ý ÐÀð ° €  p @PP  €ÿþ ý ý@ýàûûÀýPÿpÿàÿ€ÿÀÀаÀ@Ð@€À0°°ÐÀ €Ð@P ðð0P@@0`°€ýüÐúÐú@ü€üÐ`ÀÿðúùöPôòÀõàûPP@Pþ ý°ûp÷ôPôP÷€ü€pPP 0`ÿþ ÿ`à0 À€€@ÿPÿPà`Р ÀP€ ÐРÀ ÿ°þ€ÿðÿÀÐp`Ð@ÿÐþ€þ€þÿÀ€P€ÿÿàþ€ÿPPý úûàüþàþ0€ °ð`° ` PPÀ€`€þ°ÿàp€ ÿðàÿàûûÿàð°0`û@÷°ö`ùú ü@ÿ`p ý@úùPù€øùðüP @  àÿ0ýpüàýPðp°0Ð`þ þÿÀ  PP€à`€€@€Pp`€ÐÿàÿÐÐ@Pððÿ ÐÐ P @°ÿ`ÿ`ÿðÿ Ð 0ÿ€ÿ ÿ€ÿ à ð @ÐÿÀÀÀðíPð€úpP°  ÿÐ÷ ø@ü°@ð `0  ÷PðÐìÐððüàà €PÐü ñê ì`õ ý @à € €ý€öðõøÀúàþ€`    þàú øøù`þ°à` Ðþ@ûûàý P@P   ýpûÀûpýÀ0@@PþýýþÀà0À°PÀ ÿ€ýpý þÀ €ðð0@þýpýàþ `°àP€Ðþþþÿ0``ÐÿÐþ€þ€þPÿ à0€°PÀÿ ÿÿ  àÿÿÿÿàÿ° À`ðÿ`ÿ°ÿ ÿ   P  @àÐöÐô ú @P Рú`ûþPÿ€ Pà€àþ`ÿÿà€À`àþ°ðp@ü 0`€ûÀûP°àý°ÿ €Pþ0ûP pàÿ`Pðÿ€ý@ý üÀý`þ À þ€ù@ø0øðù ûÿPpð0`ÿ€þPÿ°Pàà€ÐðPÐ  ð ð`# -@€á ØPåèï`úP "ð ðïÀé`ãpÞààîððР °PöéÐåàîP@@`  `òìð0úÀ0Ð € úpôÐõ°û`ð à p ûÐ÷ùÐû€ü0ÿPÀ`€Pÿÿ°PÐÀàp `@°ðÀÀ àP@'P=`õpÇP°àápê0õа/Ð$0ý`Þ0àPÚÖPÚ îÐ)P$ àÐÿ0íÞ ÝpïP @0P° ðëàæ ÷ P` àöðï ô0üpЀ  Àà`  p`ðP@ ÐÐ@N€ º ±ÍðâðèûP3P7@Ó@ÍPÑðÌÐØàå`  /p5€ ÀøPêpÙ ÙéP%'@Àÿðã`Ó ÜÐôà а P€îç€ïýpp PàP P€þ00€P PPàP% 7MPèЪ°±@ÛÚ0çÿàAP-òpÉPÎ@Ì ÆPÕÐîp`61 0Põ€áÐÑÐØpð@)&€ 0èPΠÏÀäÀÿ°  Ðï@â€æõ`ð@ PP  à p 0  ÀÐ(00R 0·ð¥PÂ@ÓàÚ€õ ð8>Ð`ØÐÈ ÈÁ0Ê Ý@-`;`"à °ýÀê ÖðÐðÞ ýÐ)$Ð#`úÔÀÉØ`ñ`@` Ð'PþÐæÐäÀî`ûà°€P#à0 P€ÀÐ@P°@  Ð)M@%PËЬ`¿ Î`Òè0ÿ *>Ðê€ÔpÐàÃ@ÃPÏ0ðÀ50)`À Pûàâ€Ó`Öì `!,ð'áÒ`Õ`äù ÀP+ !0 ð@éÀé°ñ`þÐÐ!Ð)0 аý@ @ p`  0°`=0Sp€¶`¯àΠɰÊpßÀ< >0°æâÐ×0ÀÀ·ÇÐñ@À.@"0`@Àã0ÏÐÑ è@0 ð22€Àì@ÜÀÙ°àëü P, % ýôí`íÀõ ("pp@0 õ@ü° Ð0P P -0Jà àÎ¿Ö ÏÍ€Ðô%@/Ѐ÷ ø€ì×Â@ÃÀÜþ° Ð#àPàëðáàèÐîï ù&`ààûø°ñèçøÐ  @ Ð `°û@õû €ÀP€À  P@Ð   €Ð)V#ÀޠŀÓ`ÈÐÁ½Ô  Ð+ÀÐ ô ÔàÀÀÇPá€ì°ïÐð*Ð"°àpù0ç€Þ@ë€Ð àà  Pú ö þPüù ð Pp `À` Ð0 Ð p @` Ð P P5@:ð PïÀé`æPÒ`à ºÐÓõÀýö@@Ppö éàì°íPâß°ëù ÿ€ðP° Ð0`@÷€îÐò`úøàøPý°À € ° P  0 à   Ð`Ѐ`ð@ àP`ÐÐ@PÐÿÐýýPü0û úpù0ùùøöðõpõõ õõPõ0ö`÷ùPúüàýàÿ0°À`Ð@ÐÐÀ`ÀÐÐÐðЀ p0À ÐP@p °  ð€ Ð ðàÿàþ@þýàüü üüüàû0ü üüPü üüÐû€ûÐúÀúðúðúûðú û€û`ûü ü`üðü€ýþÀþPÿ ð Ð0 Ð€p @`@ 0p@`@ð0Ð@ðÐа€€àp@À°pPÿ0ÿ`þ`þPþþþÀýþàýPþpþ€þ þÐþ@ÿ`ÿ ÿðÿ@0p`````p€àÀPÀÀðp€ ðÐÀÐ PЀ€`ðÐÀÀ°°°°    ° ` PPPP0 ÐÿÐÿÐÿÿÀÿ€ÿ€ÿpÿ ÿÿ€ÿ ÿàÿP€€ €   À    °À ÐðàÀàÐðÐÀÀ   €€p``@`PP€€`€ÿ€p p€€p°PÀ€p€€p€€€€€€€p€€€€ €€ p€€€pp€€p€€€€ àÿ0€€€€p€€€ €€0 pï0Àûp Ðù@þùþÐ@àÀ à ûðpP÷À€þ ðÿ`€ Ðü@Ðÿ`ÿ€ÀÀÀýPpðÿ`P ýÐàÐüààÿ`@0 ÐþЀpþÐ`þ üà@`ðÿþp@üùp°ö ÀÿðÿðÐþ€ ü° ÿÐþð ÿ@ÐÿÿÐüðÐÀûÐ@û°°°Àÿ ð Ðÿ€PÐ÷ ðÿü`  ü 0ÀøP0ý`à€þ À@ àþ  þ€ÿÿ `@@  à`ü`ÐPÿà°Pð PàÐP°þ`PPü°`ýP pûà°ðÐð@0P`ýÐ0@üÀ°ÿ Ðý°ÀúPðÿ€€þ`ÿÐÀ€ÿ0þ ý@ÐþàþP`ÿÐý€ àùP  ý°Pàü Pþ@þàÐûÐ àþààÿ û p÷`P û Ð@üÐ0`þÀÐú ÿ€þp@ÿ€ððýàý€€ÿP Pþ°ÿPЀPÀð p p à0À°€ÿà@ÿÀP°Ðþ€`ЀÐp@ P` °P€ÿp€`ÿ€P€Ð@À ÐP `€ð°€@@`@°° pÐPpP°àpPàà`€ Ð`  €Pà@P0À àp  €€Ðàÿ Àÿ0  ðþ  ÿ p€ÿ@ÿ€0ÿÐÿp ðÿ Pÿ`ÀpÀ€P àP°Pàà0`Pà°0ðÀ € ðPÐP`ÿÐÿàþàÿPÿÿþ°ýÐÿþ@ýüý@ûÀù ùàù÷ õÀö÷PõÀôö`ööøÐù@ûü@ÿðÿP à À    p À P à à ° @Ð0€Ð@0ðÐ`pàPÐÐРð õ°õûð êpì îÐå@ä`é°ê@çé€ððò`ó`ø@ÿ0``аÀ Ð `  P€€à€€Ð Ð À ` € P@€ @   °P€ààpþа `þ ëPô°ùçPÛPäëÚ×ãèPâàâ@ò÷ÐøÐüà àÐ ` @ P€À°ðÿÿðÿ0ýPÿàð°à 0`P0€°à0@ P à P 0ÐÀ@ð°þ `  ëÐâàùðð × ÐãáðÒ@Õ°á éðæÀìPøÿ  € P P ðàР`ðøû€þ0öPòðôûü þÐÀ`@€Àp0€°Pàà @ ð@ 0 %@Ð Ð è âpñ`ç@ÒàÆ€Õ°ÕpÕ`ØPÚàçõ°ýý`ð`ð`€€  ðúùPó@ëPç°çñ€õPöPûà€ `ÀP@ À0€ °°PðÐÀ°° ! 4à Ѐp󯯡ÏŽ Â@ÇÚäpã ðPÐ#À%#€@ù0òðãÛÚâpæé ö@à À @"P"P%p!° Ð P ýðüÐýР °À @(@EÀ?P ð€ P `åÉ`¼P± ¹ ¹°¿€¼Î0îPþP+à- ,À" `ú àÔÐÑ€×°Þêðô`PP#@&Ð'p)°%€@àÐýùàøÐöpô@úÐð À  #( 1ÐO°WP3ý@÷ÐÝ€Ãð¯À™ ´ËÓ€Ùö€p#2à1p*à°ÐîÜPÖPÑ€ÓÕ`Õ0â`õ 0Ð%P&'0% ``ûPó°ð€ò€õ`ú° @"ð*P0 2°0`?ðP°6€ñPÝÀɼ€¹€ªÐ¢µÒ€ï@þ0àÀ)0*àP@óPãà߀Þ@ذӀְä€òàÐÀÐÀ€ àÀ`püpø@øÀ÷àõù`ÿàp`%À') *`(à)@>°< !à ßàÈ@ºà¼ðÁº@¾ðÌ åÐüÐð" pÐà 0 ö`å×ÀÖpÜÐäí öÐú@ÿ`   °°@ @À@ PýÀù`ù` €€À °!`%0%!P0€: )€ÀñPÓP¹ð´` ÆPÌpØPâ@ð°ÿP#`Ð0 þÐóñ`ðçPâ Ý@ÞÐç0ö  €P ð  @ÀpþÐý`  @@@ 0$$€ p@Ð7@>0PêÀð£à¥º Ê0ßpêpíóPÿà#Ð)€#@ @óÐáàÜ à å€íðêæ êô ðð  ° ð€€ý€ü PpÐP`P P2 ? 3À PþPÓ ®¡®½ Ô`ï ùàü€ÿÐ €àÐ @è°Ø`ÕØPä°ðö@úÐü0 àÐ`ýÐú0þà € °°° Ð@pÀ@PP 90AP3ð ðÃÀ£Ð  ´€Êàçý€PP` € ð 0õÐÝ0ÏÐÏðÚàîPü` àÐÀ @ 0ðøÀø€þ0@  Ðp ÀPðPà0`9`HÀ<$@÷ÄP›P–P® ÉêP @°ÿð€Ðàðó×ÇðÈðÕî  à °`@ `` À þÐõõýP@PÀðP `ÀP` Р`>pN°AÀ$ ñ@¼À•€“P±ÐаòP P ÐÐÿ€ €`ðÀéPÍpÀÀÉ€Üõà   Ð°@ P ðÿÐöPò ö0 PP `Ð@PÐð ` ÀàDP =p æà³`” —º@Ù÷0 € À  ð0ðúÛPÿÀÒÐëpÿ€@P ° €P°p`öð ópÿ@ ð° @ ` p€ÐàP"pGðP€;`€Þ °•›àÀPá€ø     pPpP êðр ÀÚÀø °P ÐÐ  €þÐó€ï`ð0øÐPpP À À ÐPÐàÐ1OHÐ*Ð÷ÅÀ¢ “Ш ÒàïP € € ðP 0ñÓÀÅ€Å`Òàí°0Ð P P€ ðÐÿ ò`è€ëpùPPð ` À à 0 p€@°2 VÐNð(Ð뀶šÐ’¯ÀÞ ú @PP@P @ áÁ½Î â€ù Ð@ @` ÀÐï æàåPð0à°à À P  @ Ð PÐ PЀppP€!°P°_0Bðÿ@»ðœÐš`©Íñ€üÀùúð(à)0ð°åɾÎ0êPø`û0ÿ PPÐëÐÝPä ôÐþ0€ 0 ð €à ÿPû  `  P À`'J X ?0þ¸ Ÿ0¦´Çàß°óàþ 0), ö`ÜÐÑÏðÓ@ã€ñ@ø€ü&P!€€ý`ë`ãåðð û ÿ€  Pà@À p`ý@þ0` Ð@ °``à` 5YS ̰›0Ÿ€µ`ÈÀØàéúðà!p/`"`ÚàÍ`Ô Þäê0òPûàÐ ( ) À ï êê0ë°íó0ü0ÐÀPð0ûÀý°pð@  ð``PP0à$`GÀU< öЭ`™`²ÍPÕPÙÐæÐÿÀ€$PðÐéÀÒàÓàáÐèÀæ`åòÐP!€"0`  ù ñ`ñ°î°èÀåÐí ÿ€ÀpР€ÿÀÐ0ÐPp 0P P  5P°E` º0™@°pÓ0Ü`ØàÞPüÀ pÐ@@ñàÙ°ÕÐáPí€íê ò°PàÐðP  °úÐõàóPî€çpç`ôPPð @ ° Ðþ€ÐÐ 0€ð ðÐð`PÀ?O0ðß@¡à ÐÎàêàà`ÓÀã ! ð ýóðæÀÜ@á€îPò`ïïþpÀаp Àú òPèpä ì€üP àpP°`0ýpûP` à@À   @ € ° €@ð> ¾¢ðÄ€îî×`Ö@öà õàðàì°åÐä@îõñÐñÐü  ppàÿ€à @þù@ïæ€ì€ÿp€ @ Ð Ðú úà ° ð À  ÐÀ °p€Àà€ `À° .PÀîàÇ`È€ã0é€Û`Öë Àÿpò@ïÐìPê°ç`í òõ ÷pÿ À@€0àÿP€0÷@éò°Ð°ð@Àààû @ P P    ` Ð À@ Ð à ° 0 À ú€ý0P`€ P€áðÖ0ß°ã`ààá@ìÐøÀüú÷@ó0îëïpô`õÐò€ôpü`0°þ ÿàÀÿÀÿ0 °ÿp€P€ Ð À ` à 0 ð @ À P €0 €ð0àP@€ p PàÐ@ `Pû@ûàýýPÿP PÐ0û°ëðåæPåPäPé ï õPö@÷`ò ð0ð òññÀó ùpûù õ õ`ú°ÿ°°ðÐP þ0 Ð à Ð ` Ð ` À p P p € 0  Ð °PPð  ð à P °`ðúÀ÷ùPÿ`P0ÀPüÐö ý€@ü ô`ò ò€ð ìÐîàò@õÀôõP÷àôàð@ï`ïòpò@õ°ù0ù@úÐú€þÿ`Ð@àÐP Ð   à    Ð ð @  P  ðð@ P ° Ð ÐÀð P @þ ýpÐöÀðûÀýöðúÀþàûPõ€ó õú üÀô@î°î`õ€ø0òïó0õ÷Ðôpô õ@ø û€õ0ôÀ÷@ÿÿðЀÐÿ€Ð€ 0 ÐPà 0 ° ° Ð P  À@ @ PPà °Ðp Ppà° @0   ý@ÿаþpû`ú0ý Àý€ø€õôàøPø`øûpúPù@ü°õ óö`ý`üPö°öô€ð`òPþ@ ý ö0óPô`þÀPÿ ÐpÀÿ`€ ÀP 0°Ð À À@ À à `p à  ÐÐàà °`À0à`ðPúpó ú Ðüû ðû@óàîÀòPÀÿÀÿðþPùp÷ú@þÐøðùÐ÷`ôpö`ôü@@ýàùú@þðÿ`ý€ù°ÿÀ ðP`@p`pÐð     p 0`À   Àà  àÀ ÐðP€€ÿàÿ ÿ@Pÿú`ûüPý0ú@ýÀúøøùù`þ° û`üÀù ý@°@üPóí@ï`øþÿ@ðþðü@öÐôàûРÐüpÿ@P@€ÿÐP   €P þ° Ð °  àÀ`ðÀ `P€àð Ðþ0úûÀý@`ÀPõðñPò`ü ÿ`úÐûàÿ ýàø õÐó ü ððõ€ñpõ@ø°ø õ øû00€ö@ò€óÀù þ€0ýÐüþ°p °  pàÐð@ Ð ` À €p  ° @€p À Р Ð `@ÿPý00ýÐÐàþ@øÀ÷ü0ÿ0ûû þ0€ûPï ê@î€ô°öö°ôÐ÷øàóíðë ðàô°ù÷@ôPôôp÷ÐúpûPÿp  Àü`þ°@ p ° P Ð ° p   p€@ð °   À ` PÐ @à  `°À Ðû0ý0ü@ü€ýàÿPü`ÿ@P@õ ìè0êépè°ëpôú@øPóÐì`éÀêÀíïñôÐ÷Ðüpý`þ `ÀÐÀ` ° °  ° ð @€à   €   @ ``ð °€P À àø@øÐýÿ0üðÿPðð@ ð°Ì€Å0Öàëàú ý°ù ÷ôêß°Øßïûý@ú€ó€óú@0Pÿð@  @PÀÿ€`  ÐP°à ð P `@ `@pÐÀ€P p°Ð `à @`üý  ÐÿÀ;P1@¿   °ÐáÐ PàúÀø€òpßàÈàÆ ÚÐô û€ÿÐpÿ0ù÷ÀüÐ`@ ð0úÀñôÐþÐ °€@°00 p`Ðp À à 0€Ð Ð   ` à@°pÀ@ ðÐøü BV@ÐÁð€à“ÔPÀÀ÷@ö ýPï Îð²à»ÐÜ à ° Àù°ü ûÐùððíøP@@ ðþÐù°ýÐP ÀÀó€éé÷€ À@0PpþÐüÐ` ÀÐ0À`  ðP0 À@ p ð ð  RPNPp­€À†ðÎÐ6P+``óñã Ãð©P¯PÑà @607 @ýìðæÐê ééö°p$€(°ð@íéñü`pÀðéPá€î`€ð0 0 `Ððýðà   ð à €` ÐððЀ$€A8ðõ@«€”Úà!P>`,PpçÐÞ × Æ ³¹àÙÐ0;P>ÀöÜÀ×Ðãïà÷°€0"'ÀP€çPÝæPú0 PP°@íàÙÚ@ôP&ð ÐPÿûP@00ð €€p @Ðþ€ ÐЀPp€à` 6P0Põ°P„—Ø€ À?À.àÔPÕ0ÏPÃ`ÆÀÛÐÀ2°>Ð$ ý0ÛàÏðÞôÐ °PPpñpá â@ô0 °```€ñ€ãÐáPñ !@$pðõ€õý€ € ÐP@ P@°ÐàÀ  `ЀP@.;` Æ Ž ‰àÀ   98ppäPÑÕP×`ÑÀÏÐÕ@ò006 0À0ëÓ°×€îà@p`°Àñ@ç°ëÿ`p òàèÀè ôp°€ `ÿ ùÐùàÿ0P @° @ðÐ PP` ` Ðð0 ð  0Ð €À!@;à0ߤÀŒà­@ñ°'Ð6!pó`× Õ ÚÚ Ú׀〠# /p! `ã× ä0úð PÀ À @ P÷0îðñÐÿ°0p °÷ è çÐôÀ€ ÀР ÿ° €À  Pþ  ðà `p€ À @€ P0`- ÞЬ0™€·Pð!ð2Ð õ× ÏÔÞ€ææðêýðÀ# ! àðÞ áðò Ð€PPPPðùÀõ ùЀ €P í0å`ì`ÿ€@P ` € p   PpPÀ  Ð   Pà  Ð@Ðÿà `'@+àÀ× §àŸ ¾ð @/0 úÀÜ`ÑÓÐÛåPæ ìàýЀ Ð#`àøå àPíРPà PpùÀ÷ ÿ€  0 @ùpépè@ôP@ €  0þPÿ°0°Ð à @€ À `  p ðP0€€ ð !(@ ‱ ¤ ¹àäÐà-#pÐâÑÏ€Ú`ê ïðÀøÐà  P õääPôðàÀàP °`ÀðÀü úÀþ  p÷ëì@ø0 à € 0ýûÀþÀ0Àðp @ @ €0 à@ P0 °ü  à À 0À`Pp&0úpÍମ ÏÐüp €,€`öpÛ`ÌPÒÀä`ñ÷ÀúûÐР ÐøÀé èô0À `ÿ€@ ` ýàüÀP pPÀÀôàëï€ú0 p` pû`ù@ûÀÐÐ P ð P Р 0 p Àð`p   Ð ÀÀ 䀶àÃà€° @ôÐÙÑÀ×På€ò ú@ý ÿ ð ð °þpñ í ô ` Ð` Ð0`€þ`ýÀP ` à€øpõø€Ð ` ÐÐýü`àÐ0€@à pÀÐ0`0Pp@@pà   à pàð0Ó€Â@ÃÐÓPó  P€Ðí0Ý ÙPà@êòðøÀûÿÀ ð@ €ÿÀô ñ@õ`ÿ p ðð@à 0Pý ûý @€ ðú0ë ê ô  €Ð €þõàóú ÀÐ ` à À Ð 0 àðÿ`Pð€ P  P €À€úÞ Ê°ÅÀÏçÀý Pú`íéêî ñpò0óPö`þ` à@Ð €PûøÀúÐÐPPà þ üÐý€  а`ð0àÐ` 0ÐþÐÿ°@P°ÀÐ`@Ð@ÐÐ@p°`°`00 P ö á0ÕÀÒÚàéû€ P0ü€õÐôàôö ö€ôÐó@ö ü0p 𰀠Ѐ 0ÀÐ0   @` ÐÐÿ0ÿpýÐüÀý Ð à 0ÀÀÿ0ÿÀ°0À°Ð`ÐÐpÐ`@@Àà ÐÀPàÀ€@  °÷`çßÝ ã°ìP÷`ýþàýú ùÐû°ü ý@ü°ù ÷ùÐüÐÀ°ð`À0à°P  pPÀP@þ0ýýàþ€ ðp`аð€PP@P°`Ð`ð€`pÐ `P 0   pú@ðêç€é@íóÀö°øPú`ùûpü ýþ@þý€ü`ýpÿ€Ðàаà@pà  0 pppЀ@þþ ÿ`à@ @0 ` àÐ`à€ðÀ`àðÐàààPðààÐàÀÿ@Ð àÐЀúóðï îÀð ò0÷@÷Pù ùùûü`ýÀýþýPþàÿ00ðа0 €P€ Ð`à@ Ð` @@°Ðÿ €ÀÀà° 0P PPÐ0P`ÐÐp`0ÐЀp°ÐÀÿ ÿ ÿPþàpþÐÿÐÿ°þPý`û üàýàÿàÿPÿþPýûø0ö÷€ùàü€üý€ûûúü€üpýPþ þÀÿ €PPÐ@€0ààðÀ€ÀP`p0 ÐÐP0ÿ@ @Ð ðÐ``0ÐÀ  `ÐPàÿÀ€ý€þÀü°Ðÿ ÀÐùà0üÐ0ý°ÿü `ù°û`Àü 0ÿ€`ýÐ`ÿÀþP@ýðýþ €@ðÀ€PÿÐ`þаPÿ ÿpÿPpP àÐðPý`ÿÐÿ°Pþà`0Ð@0 ý üàû`0ù€ û@ðüÐ þ`PÐ`ÿpúÐû °Pý û€üàÀþÀpýP`þP€þ ÿ0pþ€àÿ`Àþ€°úPÀ0ÐààþÀý à°ÿ`ðüP  þP€ú àûà À÷àøpùÐ øÐPþ`ÿp€þP€ýðÀøÀ`ø°û€0ÐÿÐPþ  @ú€ýð üP@ü`ý€ûà ý Pÿ ðÿPðþРú  ýàýàPàýÐÀûpPpÿЀÿ`ðüÀ üÀ `þÐ ÿÐ ÿp°ÿ @ ÿ ° ú  ýàûÀ°ûðÐàPüPÐøðù° 0ü`û ààúðÀø ÿ`Ðù@ ø`àþÀÀüPpðÿP`ý€ÿpPàùÿ@ÿ°0û 0ý`àþ ý0ø`@÷ ÿààþ€þP @þp@00ÿ@ÀPþ@@€ð € ù €ùÐ àõ ÐûÀ Àýð@þàþ€òÀ0ñp ø `ú ü ýüàPPpýP 0Àþðàÿ ÷@þ€ üP@÷РúÐ ÿPýýà û ÷ Põ@€ô ðþÐ`0þ pÀÿpýP€@þÐÐýÀ0`0Àý þààýp@ý àpý  ù óÐ Põ` ø€àúüÀùÐ ÀýPþÿÐ0 Ðpøpô Pï` `ò@ëà €þÐ`÷ Ðöà`ý€Pýpý`ü úÀ ù ô€û ûÀðù°þ ÐüÐ``ùÿ0ù Ðù °þ PÐîЀñ €óðþPp úÐ ÐðPpõPÐÐÿ@ ÿ@Ð`Pýð`üÐðùàp°€üÀ0ûP÷@þÐýP0Àúð `ð ÐÿЀ€õ €õPðõ 0ýÐû  þ àí€ €õà@Pð°0ÀýР÷@`Àpð° à ÿPàù°ú`ùpPøÐà@ú@ÐP `òà`øP÷@`Ðúàp PÀ@ø0 õ€`õ ðÿ€ÿ@Ðÿ€0ñ@€ì0Àó €õPýüàû `úP PðÀà@øPP°÷à°õ àý°ÿ û°ð@@€ÐïÐ àþРóà€øøp`@€ûP@þðþõ Pø üP ÷ p  û0û`þ@ õÐ €þÐ@ýpþPPû îÀðñ`  øý` ýÐÿûPýà @ï0Põ €ôpàÿ@ü`0ÿÐÿ0 Ð0üÐ@úpPüÿÐÐÿ  þ@ú`þð`Pý0 PÐüàûPó°üP @P@ü@÷ððôPû@p  þþ øðü€`ý°ðÐ €÷Ð `ù ý@ùøÀ0òàþ`ù 0úÐÐùÐýàÀû PüÐ÷ ÷`üPþ@p€ÿ ° °@ÐþP@÷°ÿð° @öÿÿP€ Ð`ù €õ``û `ÐàþÐÿÐùàüÐù€ÐûPÀPþàýðÿ°÷àò àú ðê PðPð ÐýõÀ ùú°åÐñð ü íÐ 0ûP`ýðú  üðð° ë0ð` 0ø° Àù°í í€òÐù€ðü °  ñà€ÿÀü°ï õЀïÐ`éЀø0õ  Pî`ÿ þ0 Ðö€üPó@ ðÀé€Ðñ°Pï `ìóÀùÐ Póà îP€ÿ Ð÷Ààü üà€þP€àÀ0üÀ €üP  ÷Pü`àøÀ€ý ÷ÐÀü@Àú0€ûþÐù@Pðàú@ÿ€`üà0þ ýý þ€`ý@Pþ€Ð@ÿðpüÀÐ@þ øP ÷°Ð û þàÿ` P`ü0þÀûà`ú  öÐ €ò@PüÐÐÿÿp÷ péÐÐëò àûPðÀðù@úÀP€ú@ý°Ð °üPpð`ü° °öà€PúÀýPPPpü@üÐû@`üp ûð@øà@ûàþP@ý ÀøÐþPñp`ü ÿp° ó0ùPàöÿPPý` õ @ø@ àú€ °õÀ pñP ø€0ü€@ €ý û`0 ÿPø pþÀÐû °P €ü Àû°ü÷PÐû0 Pú@Pÿ àú0`ü°ÿ°þP pøÀÐùÐÿ þõÐPõÀ °ô€°ø@``ü0ñ` €ÿpàý@ ýÐ@pó °óÐ  øÐþþ ÿÀÿðàú`à€ÀûÀ €ù`Ð €ôðÐúÀðú€ø@0û@ Ð÷À@à÷@ ñ@ Àûüpðpýàù€ðøpàÿ ýÀ`ôP pôÐ °û°ÀüÿÀþÐû@þ øðÿPÿû` öùP€í0 €ë÷€°óí ö0pþðýPÿP ö Àó€àõ êÐàëðì@é°Ðô @ÿp àõàÐô`@ýÿÿþ0 Põ 0ð @ô pûÀù0û`þ0°°ð@ÿ0 À÷ÐPõ@ Àó€À÷@ù` °ÿ°ý@0PõPöð ðõð€þPýPPñ@°û €û€ïP ò@öðàî  èpðìÐ ú@ð°ÿ` õÿ@pþPö0ÀîÿPPù ô ú°`ø` pÿ ýPÐÿPýPÿÀÿPõP 0ú úP  ü@ðöðþà ø€`ù°pû0pü0°è @ìÀ`ïÀðúÐÿ` üPû`àõp÷@ Ðì°àç°0ôà @ó Ðñ ÐôÐú Pü@ ÿP àø  øPÐû€þ`Ðpÿà0þÿ€PþÐþàú°@ø00ü@Ð@ø``ûÿPPûp÷P ü`  ÿ@ 0ð@ñ0 @ñÐðþÐþЀ÷0ðõÐÐûàÿ ø0û  ðòÐ@þÀÿ Àÿ0à÷€pð àø0ö@àÐ ÿЀÐ`þPÐÿ0þ€ Pþ°€0õ@ÿ Àÿ€°àÿÿ0 °÷ @Pý€ü` €ø `õPú0€úP @ùðpô`ÿP øpñ °ø €þðÐÿ`ý00ü``°àþ`Àü@ øà púÀ@`ù€ @ü` pý`Àò` `÷P @ÿPÿ@÷@÷ Ð÷`@ øû °úð@õ@°þà@`üàû€€ÿ€pðÿPþ€ü0ÿÀù€þ€ÐÐüàñà`ìàÐù0ùà€üþ€Àï  ô Pø úÐ î`ø@ùþPPPÀÿ Ðà þ@ðpüð@Ðý°€ý`Ðù€ÿÐþ Pýp€ðÐàü°PðÀàøøàðþPÀÿЀþ@ P àÿ0pÀ@úà àÿPý€÷ °ó@ àõP PóP`üpÀ ùÐ üP0ø  `ò  ö€ `û ý€üÀ ù Ðü ÐþðÐü@PÐPÿ þ@`ýаüÐ0Pàÿ€Àù ü`ðü0ÐàÐý`à`ýÿ `üðÿ°àýàÿÐþÐ ü0`ý  ÿPþP ü ÿ0À°pû@pùû0Pý@PÿÀý0°@ÿ` ððàþÐÐû€°þÀÐÿ€þðPÿÀ Pðà°ý€ÀüÀÀÿð€ÿðÿ àý  øÀÀPÿ0ÀP`ýPýÀÀÿ@Ðà€`ÿ `  ÐÿÐP 0þÐ@€° `ýÿüþ`Ðþàýû €ÿPpþ@pþÀ``þ °ûÐPÿ°ð €À@pý Àý00€€àÿÐý@üðРPÿP úÐàüÀÐðÿ 0°ÿðÐ@Рð€P`ÿà°pðÀðÀ@@ð0à0 0P€þàðÿÿð@€Ð@°ððàÿðý`0ÿ @þ``ÿ  ÿp€ÿ°ýà°PpPþ@ýýà0ýÀÐа @€ÿ° ÿ Ðð@þ`P0À P` 0àÿ0ÿ0ÀÿpÀþP@ð`P `°Ðþpàþ€à€° °àРÿÀ@PÀP``€ À€ °``@  ÿPÀpp ÀÀ°€° p    °€€€ÀP °p€0`€€°À°€€°€°p Ð   €€€€Ð° €°€€ÀÀ€  ÀР°€ €p°€   €€°ðàð  À°€  ° €€€€   €€€p`€  €€p €€ €€ €   `p@€0 €€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€ €€€€pp€€€p€€€p€pp€€€€€€p€p€€€€€ p€°€ p€€€`€€€p€€€€€p€€€€€€ `€°p€€€€p`€€€ €`pppp°p€p€p€€p€€€€€€pp€€€€€€€€€€ €      °`€°€ p€€€€p€€€€€€€€€€€p€p€€€€€p€€€€ €€pp€€€€€€€€€€€ °€€€€ °°€   ° °     À €° Ð°Ð             p€  €€€€€ p€€€€ €€€p€p`€€€€€€p€€€`°€p° °° `°    p€p€       € € €€`€€€€p€€p€€p@p€€€pÀ€€€`€ €p€ € €€€€pp°    ÐÀÐаÐÀððаÀà             ° °° € €€€€€€p p€€ €p€€€pp€ €€ €p  €€  €  °  p °À    ° °°  °°  pÀp€p€°p€€€€°À€PPðÿ0P``€  P`P€€p€p€€€€€€€p€€€€  €     °Ð ÐÀà°    Ð°ÀàÀ° ÀР Ð°°ÀÀ À À °ÀÀ   °° Ð°    °    €P  € P€€p p€``€€€P€€  €€€        °À        ° °°     €     ° p€€ € €€€ €°p`pP0@P€€p `p`€`pp€€€€€€€€p€`€ €€€°€°€ °  °Ð °Ð ° ÀÀ àРРÀ  Ðа ÀР °€  °  €p € €€€`€Pp€€€€€€€pp€€€€€€€p€€€€p€€  €À °ÀРÀ À°à   €p°  € €p €€€p€€€ €€@P`@`€@€`pp€€p€€`€€€€€€€€€€€€€€€€€p€€    °Ð   ° À     °         €€€À€pp €€€€€€€€€€€€€€€€€€€ `ppP€€€€€€p`       ÀÀаÀÀ °°ÀàÐÀÀÀ     °àÀ  °       °€° €€€ €€€€€P° ```P`@0@€pp`P°€€€€€p€€€€  €p€€€   Ð  Ð    °àÐÀÐРర  ° °  €p° °    €p p€€`p€€€€ €€€€€  €€ €  °p À°° Ð° ðàÐÀÀÐÀ À °    °à°°Ð      €  €€ p ° °€€ €€ € p€€€`€€€P€ € `Pp`€€@€€€€€€p€€ €€€p€p   À  À  Ðà  °°ÐÀ Ðà° ° À  °    €€€°€ °€ €€€€€p@ €`€p0P€€€€€p€€€p         €    Ð°°        ÐÀ      € €€€p  €€€€€€€€€p€€€€€€€ €€€€€€€€€€€€€    ÐÀ °À À     ÀÐÀ À°° ÀÀà     €  € €€p  p€€ €€€€€€€€°p€`€€€`€€€€€€€€  €° €     €    °Ð°À° ÐÀ°À° ÀÀ À À       €     €€€€€€€€€€€€€€€€p€€€ € €p°€° °À À   °ÀÀ °À°°°Ð°       € €°€€€€   €€€€  €€€€€€€€€€ p °€€  €€   €   °° ÀÀÀÐÀ       ° € €€€€€€€€€€€€p€° €€`€€°°ÐÐР°Ð°   °p °€   °p€€€€  à°   À €Ð°€À  ` €Pð Ð °ðp0°€0°Ð€À°PàÿÀàÿðÿ€pàÿPÀ€ °`€€ € €€@ÿ0 Ðÿÿ€P ðÀ0 Àpp@p @ À p P`€ÿ pÿÐÿ €à  ðPÐ0 0 Ðð p@à€ àÿÀP ÿÐÀ€À°ðÀ@€@PÿàÀ °þÀÿ p0ÿ °ÐPð °0àÿÐ`p€ €``  @°°@°ý ÿpÿPÿÿ°ÿ `PÀÀÐàÐ` pÀÿP € ÿP °Р ° ÿÀ °€þPÿP ÿÀÿ°þ   ÿ°° pð0àþàÿP€ ð°p°ÐÀÀP@ÿP@þÀðPÐþÐ0 €ðP`þ0ÿ°ðÿþP° ÿÐp@€p° PÀÿ°ÿ p°PРP@ Ðà`ð`0ÿ ÿ0€pÀ p€`ÐP°ÿÐPÀÿ Ѐ@ÿÀ€ ÿÀ€`0à°pð`Àð€°ÿÀ€°ÀPà`Ðÿ €@P €   Ð РPP p°`p°ÿ 0@pаðþ°€Pÿ Ðÿp°Ðÿ àPðÿÀ°0ÿР`0  pðÿ ° pÀ  `pPðÿp ÿ0ÿ  €€° ð€ÐРÀ° € ÐÐ ð° À àP€PÀP`  àÐP`ð ðаp€ýPÿþ€ýÐüü`ýÐûPüPüÀýþpþ ÿPà°À` `°p@ÿ€ÿ`ÿP@PÀ @`   @а0  pPð  0àûÀìðÝÚØÐÔpÎÔ@â`äPìàõà°  àÐà0 ÀúPòÀì@é@éPèÀî`õ þ P p à€@PÐPP pPð`ðÐ ° à3 6pð PPðìpÛPÖ0ÕųÐË Ó@Ó€ÛÐì` €`"ÐàP  ðúÀðàïÐððäß@æ ëÐðÐñþ à °ÀP `Ðp ÀðPýÿ€Ð À:PB`à&Ð`Àê0×pÊÀÍÀðªPÃÍÓÛíààÐ@À&0%`Р € ðüÐî èàë€ã°Ü áçàðôýà P@`@P @  ° ° ÿà€ p@ €&@Eà:'ÐðãPÒ`ÈÐ͹«@Å`ÍP× Ü0ñ€ 0p`*€&P€P @ ýÐë0å@ìã0àâpèpóÐø@ÿð €`À0@@ÐÐ ÿ ÿÿð À @  ° $;@@Ð` @è ÍÄPÉп«¼àÌ€ØÐààê`€€ÀÐ! &ð @À°ÿ ðãpçåâpåPèñ€ûPÐ @0PðÀP 0ÐÐ@à0P€ À0ÀP` %Ð@`*€Ð`þÐÝË ÃÀλ´Æ0Рá@åñðàðÀ@pÿï åÐé°æ éèðìöÐþ°@ààpÐÀ p€@  Ð  Ð@€0 °2 8Ð@ÐààéÕ`ÃðÍpË ·à¿ÐÊ`Ü@å é ÷ ÐàÐ00@ÐÀpýíëêìàë`êPñ@úPÿð ð €ðP0À ðà ``€ 0  @ ð Ѐ Ð`.Ð8À€° €ð€ÞÇàÖ`Óp»@¿€ÈÛâ°ã@ëР ` à`00€`@öñPëàï€ïêðé õðþPû P ðÀÐ 0ÐÀ °ð p ° PÀ P0p  >€`P Ð èðÏÒàÞÄÀ¾ÅÐÐáPß@âÀò Ð Ð pPР  0 Pú€ñ°òõ0ðpë ìõpøÀû0ýP0 ÐP  à Pà àÐÐ`°àp Ð Ð P `2€"@  @  ñ€à@Ñæ0ÎPÉ0ÈËÀÝ Þ ßç@ð à Р° @0ð°ù÷ùöÐïñàð ó€ù@÷Ðý° €ð€PP ` ÀÐÐ À` €à P €)  `°Ð àö îÕ@æðÛÑpΠÌÛà0á€à@õþp`0@ €P @ à  û ý€ù€õ°ñpóòPøPõpùPÿÀЀ  PP  @ À °p p€à°Ð  ÀP`(À ðàà@õ@Ý æÐåÐ×€×Î0Ùâ âßïà÷`ÿ PÀ а@ ` Ð @ PpþÀþ0ûø ò°òPóù`ö0úàþ @ €àЀ0  `Ð  ` ð€àð`ÀàP P@  P Pàøàìæ€ì`à€ÞÖÐØã0ã°ã è ôpú€ÐÿÐð ð ð à° ýÐüPøPöö øù úÐÿðð À à Ð 0 @ ÐÀP ` Ѐ 0þ` Ð@ @ÀPÐ à° À`   À€öÀèÐêàë0ã ßà×à€åÀåÀã ì@õÐý°pРÀ @Ð PPþÐüû0þpù0÷ÀùðþàÿÐ0` `À  ð€° @P €ÀpÐp°àÀ 0€À0@ p Ðýà úÀó0èï@èåÐâ`ÞÀç çàêê ø`ûPàðà°  `pÀÿàþ`þÐÿý°ý°ü p€ Pа° ÐpÀ  Ð€ P à `À pP@0P°@°°P0  €üýøò€íðò ê0ìèàéPïÐòó÷ú0ÿPþÀýà ` ÀÿPpÿPÿðÀ`@P@   00p  `P€ à ð  ÐÐ@À€°àü0 ý þàÐPÿàÿàüðûPüùõ0ö@ö`ô`ô òðó€÷€õÐø0ø°ø°ý`ú üPÿÐýàÿÐüP@üÀPý° PP@À``ÀÀ  Ð 0`  @P` ðð €`€`  Ð  ÿPÿ€þ€ýÀý0þ Ðýþü üûðûÐú ú`ûÐùàùùøúPù€úúûÐûþü`þþÐþ þ€þ°Ð° P0° À@`Р@€Ð  ÀÐpÐp€@` P`  ÀÐÿ€ÿPþýý°üPýÀü ý0þÐý ýPýýýÀüpüPü ü ûüüü€üðüý`ýýàý@þþ€þÐþÀþÿ@ÿP ð  0 Ð`àÐÐ À€Ð@`°pp  ðÐÀààààÐÀ`Àÿ0ÿPÿ ÿÐÿÿÿ€þ@þàýàýþþ`þÀþÿàþàþðþàþ€ÿ°ÿPÿÿÿÐþðþÿ ÿ``à0à@pàà p @À  0`€PÀÐ`À`ðÐÐÀÐÐÀÐàÀÐ` ÐÿÀÿÿ`ÿÿÿ þþPþ°þàþ`ÿÿÐÿ ÐÿÀÿ°ÿÐÿðÿ€Àÿ€ÿàÿP`€Ð pP ð@€p°`@°  Ð@ÀP° € ð°ÐаÀ°PÐÿ ÿÀÿàÿ°À°Ð€ €ðÿ pàÿ€ÿÿ@ÿ ÿàÿ` àpð°€€ð€ €ðÿàÿ€€ÐPÐP@ÐPÐÀ °P°0ÀÿPÿÿÀ °`ð  Ðÿ0À €€ÿ ÿÐþðþÿÀÿ @ àPЀpp  Pð `Ðÿ€ÿ@ÿpÿ@À@€`Pð Ð°ðp`ðÿÿ ÿ€ÿ °pÐÐ`0 €@pp@°Ð @Àÿ0ÿ€ÿÿÐ@°`@ €pP €€€°ð €pðÿÐÿÐÿðÿ@ °@@ðà  €€°@àÿ p ÀÐà° p   €€€€  Àð0pР€      °`p€p À°Ààà° PЀû`þ `Ðà`øÀÐÿ°ÐÐÿÀPúð@ °`° ð€ Ð þù°øÀùÐðý`PðÐPðÐpÐpàÿ°0€üàýðÿðÿ@ÿ@ðü°@ °@ ÿàýÐpýP ÀpüPPý``Àþ0þ0Àþ`þpþ ÐúÀ ðÿp€ü  ý° ÐÿÐÿÐpýð@ à þpþ@ðÐü Ðö0  ýpPúð þ@ÿ@`úðÿÀpÀþpþP þ þ``àýð púà ý  ùP þ° ÿ þ€ÿ€þРùÀúPüðpÿÀ þ°þ€`üð þ pùà ÷@@þp`þÐÿЀü°ð@ü`°ÿÐà€üðýpàÿРÀüðÿÀÿ Pþàÿ€0ý À``ð þ þ€ü @`ýP `ÿà ý@ýàýÀýÐþ @úÐû°þÐûàûàþàüpþpûúÐûàüpûý0ûPþÀüÀþ€Ðÿ Рà@  ð `  @ Ð & 2P"€þ`$0þàÿ`ÔÙ€ÑpÛ€¼°Ä Ù èPåÀõàùà@Ððà(àÀðpò ß@ãì€î äÀï ð `€ð°À` ÐàÀ ú÷àÿÐðüþÐ PP*\k)à€-À0ìЭP¡Ð³»à’ Ð@òýÀÐÀHO1Ð*€pÿ@Ó ÃPÔPÌ`·¶ × öÿÐA@C3 %0% Àþ0êßÐÖÒ0ËÐÒ@èû`,°7 5P1À.`&à ÀC°NP'àØp 0åpé°Ÿ€›€­`ã°ÈPÉçð+Ð*Ð2Ð .p1`"`äpØ€ßðààÈP·PÆ ÷Ðû ô@p%C 8ðPp!à PáÐÐÑß°ÝPÕ@èÀ À!Ð*p5À-ðð @ ð üôpú°P^ h`2  `PàßМ@‹¥ÐÌ@¼`½é+p@°:à$`/;! äÅ€É@ÐÃÀµÀÈÀø@ @P6€MB0"ÀÐøPè Òð¾À½ÖPëÐ÷` °" 6°:00 °PÿðñîÐòý0€ &ððPDÀ€ðý ÀÀ€€ƒàÆ Ñ@×JyÀj<ð°¾` ‰Ð¬pÉ€Ôá€TU Q=@20(àûà¦Àµ ¼°É€Ú°ýà*@IPDÀ83 + ïݰà@éî ô Ð$`63PHððP7Ðü»€» ‘€€À‰Pê€, Ggð0fÐðʰ¶@¯ð€ÐˆPÂ0@=ÐIaàYàd`@0 pÔÀ¼`¡p›à¤ÀÂàìà$P@ P°UpK`.ð èÐÎÏ ÒÞ ó0°& 8Ð@àE`836PzÀp Ï0¥€¤Ð´Àš€ƒ…ÐÒpR[Ð7°@pKPPpн€ ·@®€²0Ó  cpp0QÐ>à å¸¥`¡»`Þ€üÐ7@UPMÀ9@÷ã0Ñ0ÏÐÒí° P(À0 9°?6 % À àð0BØP¿€¨P­à£`’ é0O@<#-P%à`µp… ¥°ÃàÒ`ßpö`.PWÐ_Ð3`@pÛðØ€¼@± ³â@#;4p?P1€0íðÞÐÚPÖðçpüP`*03À3À.P/$` û ù`?ð /ÀÖЧp¿@ÉЬP‰€–ÀÀjàD€6 à6'öP’€à®`ÒðäÀâ@PAj ZÀ °ìÀÐÞ ¥Ð ÀÊ€Ð&€0=P3ÀA°#@ípÏ Ø@ç€îPþ0 #€=À7-!àð0 hð€  ÁÀ–`¹Ð¸p¨ð¶À:°k KP- "° `Ï „€Ð¾Ðâø€ü@!Ka€GÀÏÀÚ€×·`¦Pà ù-°B€6,°8à$€ö`ÑÐÒèÐ÷@à€5`;0,€PÐbð &ðƈð³P¹Ð¯P•@´ 0n€Tà+ P Ó0Œ`‚°½`êp°@!ÐBX>p àçÀ½`È´`½àÕ°/@@Bð-Pð  ëÐÜÐÝpïpþ€   -°*`*°ÐðððÐú𬠛°º°©à— ‘ ÕÀ_Àl0Jð `$ àøð®€ ‘pÑÐò€û0 ð8UYÀ,Ò@ÍäÕЪ ¼0í;€+ ( .@áÐܰíàÿ p °&P6+p` LðàR°É –аµÐŸ’ªÐ` ]3 À) `ÒŒ€@·é0û€ú 'àKðU0:`óÓÀÛéPÁ ²Üð &ð" p"°*€ó èðýûÐüà PÐ'@'à"Pp`0ðPz°éÀ Ð©P¼ð¡‘£Pýt°ap7ÐP.Ü šP€¯âÐó`ó`àGT`90ýÀÞå ïÑðºÐPöð@@@,0'0`ððÀûàùÐõþðÐ'' =ð o äªP½ðÀ—Ћ°ªà jRP-€ `9PØp Ð¼ ÞèêGPK€)ï@ð@èØàÉáÀöÀ p0À`ýû`ý`û°ùpP P€°€Ðgð 6@Í`¯PÐ0³À‘ ™@È0Xà7PÀ,À6 0Å¥À® Ó0ß@âÐð`$P@ 0@P`ÿàò`åÐÚ`çàó òý€ Ð€ ÐÐþPûðüPÀ à  àÀàÀcð0,°×PË æ¹P“ПÐð :P!ÐP17€àÑÁÉPÚPÖÚðîÀ°)0Ð@ ûàéÐêà÷Ðò`ì ðà€  @€ðÿðù   @à`ð Ðà  frPÀÜÐîúP¸€• ´àç P @€2ð'0úààÀçë°ÝÐßðö€ PÀp`þP÷@üûPüðú ú`ø @°ü € P  Pð°@ÐàÀ Ð  PPàO@QÐò0Àʲ`Ç ë@ÿpòô@ p%Ð ùùðàþ°æð߀îöp÷0ñ0û€P 0 ° PÀû0þà°ÿ ûppþ`ø0ù€Ð @Pp@ € pÀ Ð  À*p,à Pý°@çØ0ã ôàòìPó°pPÿ ûÐ@ðöù€üû0ôPöPþÐÿ@ýàþP @ð ðÀ  0P`€ùÿ°ðú@ü ðýà@ P @ÀÐ0ðð0Ð`@Ðÿpü ÿ þúõû ýú`ù°û@ÿÐüPüpþPÐÿþPÿP`ÿþ`ÿPÿþÿ` PÐP@€0   0pPPÐpРÀÐР@pp€À°€°ðP°ð ° À ðÀ°À° Ðà°p°p` Àÿ0€€€ÿàÿ @Àÿ €` @`P0`€@ÐÀ€ ð€À °ÐÀÀ  €€`€€€€p€pp€°€€€€€€€€€€€€€€€€€°     €      ° ° °°  À  Ð  °€Ð€ °  p  € °€€€€€    °  °ÀÀp  €€€€€€€€€€€ €€€€ €°p€     €€€ € `€ € p€   €  €€ €p °€€ €€€€ Ðp °ÿÀÿ@€  ÀÐàÐÀp€ €€€€€€€€€p€€€ €€``€€€€€p Ð `pÿÀÿ@€€€°€€€€ €€€€p€°€€`p€€€p€€€€€€p€€€€p€p€€€`pp` °      €€ €€€  €€p€€p€ €€€€€p€`€ €  €€€€€€`€€p€€€€€€p€p€€ €p€€€€€€€€€€€€ € p€ €  €€€ `P ÿÀþ0ÿÿ@pÀ€ÐpP P€pPÀ`ÀpÐ@  @à0€°° €°€€°PP@ÿý ýpýÀÐà €@ÿ€ÿàÿp°0P àp €€`Àÿðÿàÿ ° `Ðÿ ÿ@ÿ€þÐþÿÿ°ÿ`Pp``€p€ð` P °   ÐðÀ° °p€€€€€P`PP€€€€À €p`€° p€Ð  `@ ÐÐp0ð°ðàÐ@àÐà00а° ° À°€``°ÿ ÿàÿ°ÿ°ÿÐÿ@ÿþ€þPþPþþPþÐþ ÿ0ÿàþ@ÿÿpÿÿPP`€ ðP @ PàаP `°ÐÀ  @P` À @û÷0ôàñàñ ñ€ðñ€ñpñðóÀõ ÷ø°ùùÀù0ûûðüÀýý ýpþÿ PPàà°`à pÐ`ÐpàPð 0@@ € € € ÀP€Ð PüÐú°òPïðñîí ðî`ìñòÀñ°ôõàò õàõö@øÀøàöÐ÷÷øàú þÐðPàp € @ ÐPÐ@P@Ð Ð`P€0àÐð€P` ` P`ð@ÿ€ü€õÀð@òàï@ìîðíPëÐï€ñ°ñðóÐô òPôõö€÷Ðø÷€÷ ÷pøàú°þð€0à €   ` € P Àà@ ` 0Ð` p 0ðPP0  Ð à à€`ðÐ00ýpü ôPñÐòï ëîìë ðÐñ`òÐôpôPò`ô õö ÷Pøp÷Ðö ö€øàú0ÿÐÐp   °  À 0 à@€ °ÀPÀÐÀ0Ð 0ð p ° P`pà0û þ@÷ðñÀï èàãÐæ ê€ì€ñÐñ ð°òÀö÷ÐöÐò î`ì ïÀò@õõPö€ø`ÿÐPÐ@ à ÐÿÀ`à 0   Ðà Àp°0þàÿ@  €Ðð €@Ð(?ð2 ç ÈPÊÚ`àÐßÀæ@ðp`0ðôðîÀîÐëàã Û`Ø`àpñÿ@ Ð À p Ppþ ù`öù p`p p Ð À@@€@ À€À 0 ðààp€À 0pà5K)Pòðǰµ€Â`×ðÚÀà0óP€À0€ôÐéÀåÀæÞÐ×ðÚ å öPÀ Ѐ`Ððþóïàò@ùàÿP ÀÀp0` PúÐøpüàÿÐÀ Ð 0  ` PÐpà€€@ p à À Ð ÐÀÐ`(<>` ÛÀ¸pµ Ê Ý äàî€ÿÐàúðé0áPá`áÞÞ`æÐò€à Ð 0Pÿàõð°ð ø `€"ÀP @óPò@úàüàÿP   àðÀ0  ° °  à P `  Ð € ð `! 60O€3ðõÅð§µ ÑÀâÐêû    ðpÞ`×ÜÝ0Ýã ìüà P€p ý öÀî ìòü°`Ð`€€ ð ù0ôpõûàÐ Ð Ð ð ð @à€ðÐ @ °€0 Àð à ð€$€>PSé´ðžð¸pØìô € ÐÐ@ì`×`ÕPÝ`áã°è°ïÿÀÐp €øÀóÀíÐí õÀþ` €PP @PöàëpèPô@ÿ ðPp0 ð`ÿðÐÀ@à  `°Ð° Pàp@*@@L€€ã0²  àºÚðàù@À0ê`ÔÀÓ0Û0ãÀçÐìàòÀ0€ ÿ öòàîðÐö ÿ À` `P Póàäß`é00  `0 p `ýàù`û0°Ð@ ð€ PÐý@°`ÐP/PO€Oà P×à¡`žÀÀÀà€ðûP "ðýÐâ0ΰÒàÜÐâæÐì`õàà Pðú°ôðÀì°ïPø ÀР @ ðåPã@ë@ÿÀÐÐ €àúðú°ÿ P€Àð Pð   @à ð&P; W 1 ò°·p› °€Ôï`÷@` @ àíÕ@ÏÐØ`ã`ç êÀòÿ`PPà Ðÿ€ö`òÐïî0ôþ` ÐàPÀàÿí ãàç0ô@° àÐà@üÀöùð p P  0°à P 0  °$APMPPà°®€¤pÂ0â€ñPù`€àÿpãàÐðÒßçÐéîàõ pÐû€ö°óÐðPð÷€à `àP àÿïÐå@èPó°ÐàðÐ@ЀÐùPø€üÐ`P ÐÐ ÐÀÀP P€P ,àEÀK0 `ÔЦP¥Çàç€õ`üP  p! °õÚÐͰÔà€èÀèPî€ú° p Ðù@õàñ ïPïÀø@ÀpÀÐPóäÐâÀëÐþp À°pp P0ù€õøÿ`€ðÐ ð à 0°ÐÐ À (NPR ×€¨P¨ÀÊÀè@ï`÷0 Ðð%p ô0ÚÑÙÐâæ`äàëðú РЀýp÷€ò0ìðë°÷À `PÐÀ õ è0ç îpû€P °ÐàÀ ÐøP÷@ú°þ@€Ð  P € @ Ð À `P€ àÐ3`^p6Pð@¿p¦ðº@Ý@ì`è@ÿ`°&À$€pâ°ÕÚðàÐã€â å@öÐà@аÀþõ í`ê`òÐÿ  PÀÐPìðã€æÐñ ÿ°Pà `Ðû öPøÀûpÿ°€ð° Ð @ ` ÐÐÐÐ €`@€#0CÐWÐ `ÚÀ²ð´@ÏÀäæ í à#à'Ð ñÝÀÝ`ãßßà@ðÐPp €`ùÐíÐêðPüP ` `Рò ôÐþ°ñÀì°ôð€À°` À þðø ôÀù Ð 0 P à @ € Ð@ ?ÀV  Ö`¶½ÐÑàä°áPèPÀ&`# €ñpáÐäpèÜØÐß@ñ`  P  Ð Àù0íÀìPóPûàÿ°0 €PÐõíÀéìÐôðÿÀ ° Pð`€þ0ü°ù°ù0  Ð ðð  ð  à ` ° à  @%- çàÌÊàÎ`Ùpã€îà@` àûðPéåÝÜàã€ò`ý0p À € ÐûàõõÐ÷Pú€ý ` àP€`àø0ééPï0ú pÀ` €ÿàüÐþ ÿàþ`Р à 0  À àÀ 00p€ü`ã Ô`×à æÀíÀ÷`ð°€þóÐîðêÀæ`äPæ€íÐ÷ÿÀà€ €€0ý`úðú`ýÀ` 0p``PPðp ` À  €°€°ÿÀþ0 @ @ ° à € @€ð&Ð5P°ñ@Ù€ÒPÏPÐ Ôpä ÿPÀ0 à p÷è€ÛÚÐâ é íàôPÿ€ ðÐ ðp€úõPó`öÐûPP °PPü ùÐúû@þp0 0 Ð ° €àpþ@ýàÿð0Ð    p P` @p 02`5Ð ê€ÛÐØÍ`ÆÎç  ðÐ ° `@öÐã°Ü@ßÀãÐáæ€ó°€ p   P ðàùõö€÷ú@°à €` °ð PÿÐþðÿ °Ð ° Ð@ðp0p` ÀÐP p P Ðð6GPí@äðâàϽ0¾Ü`ÿ€ pÿ` °PÿèPâàã@äà× Ùëý` 0ðPþû€ü`øõpý €`@0  ðàðà°ððÐÀ ÐЀp@ ÀÐÐЀ  ÀÐ À à5À@pöï ã Ëà¹P½PÙ€ðPþ€ú@  ôÐïÐé°â€Ö ×ðåàòø þ 0Àð Ð0ÐÐü øðöù úðü€ `àPÀðÐÐ` @ð  ` `` ð Ð@°€ÐÀp p6U Ðð úñ0Ï€³`µÀÑ@èÀø ê°! ù`ýô@æ0Ö€ÑâPì ì`ñ`0Ðà   Ð Ðù`øà÷põ ó€úà° ` @    PPP ÿ€`À °Àð Ð`0°Ð @'PAP3 0òPýPé ÷Ì@â€êðç€ð`  `ýPþÐ ÷€ä°Ü@áPê€é0é0ôp0 À Ðp € üPýü÷àõ@ü ð ÐÐp ð 0 €0ÐPppP Ðp  Ð À°€°0 6NýÀæðÑ ´ÒàåçpçÞÀù €õÐóP ÐîÀâàçàò@íÀæÐé@ùÀpþðPp@€ÿ€òÐõÀ00À `à ` ° Ð@@€ ÀÀ Рð Ð3€/@ ì ö0öÑнÓPä ë€èì`ý`  €þøÀ°PóäàèñÀí@ëpïPü@€P ð ððpÀÿúÀúPÿ   PÀ À p  àP P@ à` ð  °à Ðp& pò ñÐø`éÐ΀ÏpáàìpíèÐñýPÐ0ûú0ÿPàùpì°î õ÷Ðó€óÐûP@P ÿþ€00 à@ @  @ð Ð ð  à€P@pЀ @ Ð ðp àûÀõøàòàèç0ëàîPðÐñ`ô`õ@øüàüúÐùPüüÐùø úàûüÀüàþàÿ°ÿÐÿàÿÐÿðÿPà 0@@€À@  Ð àð Àp`@Ð@ @`pp°Ðð@ Pýû€úàù°÷ðö0÷ ö€öÐöP÷€÷Ð÷ùÀù`ú€ûðûÐüýÐýÿÿ€ÿðÿ@ @РаÀ  ÐàÀ`à@À`€ €€PPà°ÀPpàÿ0ÿPÿÿ ÿÀþ€þþþ€ýýpýþþ`þàþÿ`þ0þpþþ0þþÀÿàÿ€ÿ` P`pÐPðРpp`PÐÀ@ à0À €ÐÀ€  `Ðÿ€ÿÐ ÿÐÿÀÿ ÀÿÐÿÀÿÿ€ÿPÐp`€0à€`€àð€`p€Ð p Pp€p €pPP`°Àà€Pp Ðà à`°À `°À°Ðp ÀÐÐp€àÐÐ0 €`ÿ@ PÐÿ €Ppp€àÿ  `P@p0 P`аP   p€€Ð°àP  €0ÐÀÀp€ ð°€€Ð°`€€€  àÿ€À`ðÀ€ @à€€ `à`ÐÀ°ðP€P0@°àp0  °P°€@Ð À  ÀÐà °`@Pð   €Ðpа€ ° ÿPðÐ0à€ÿЀÐÿÐ`P` °ðPPP`0À`Ðp€ °€ ÐÀ°   °ÿ`ÀаPÀÀÿPÐPÀ ÿP @€€ P°Ð@ ÿ°ÀP€€ðÀ `@ ðp`°à À`p`àðÐp@ °P P€ € p 0Pð°ÿðÿ° PÐЀ`Ðÿàÿ ÐЀ€€Àðp00ÿÐà@ÿÀÿ€ ÿPppÀÿ°ðÿÿ `ÀÀÐPà€ÿ°``Ѐ ðÿÐ`P  ðPðpÿÐ0þÐ`pÿ`ÿ  pÿPР PÐÿ ý Ð0@P þÀÐþ@þÀ°àP°ÀP`ÐÐàР€ ð€Ð °À`€ðÿ°Pà`0Ðÿ à€Ð€°ÀpÀPÀ € Ð° ÀÐÿ° P€€@  Ð°0à ðÿàðÐ` °ÀÿÀ 0À`pРÐàÐà @ÿÀ°àÀ`ÐÐÀ ÐÿÐÐÿ€0ÿpÿÐÐÀþP0 Àÿ`þ Pÿ@pÀþ@`àÿ@`€€ÿ€ P ÿ@Pÿ° Àþ ÐРÿÀPÿ€p`à ý0ÿÀþ €`ÿPàþ ðþ`pÀÿÐÿðÿ P0pàÿðÀÿ ` 00ÿ þ0Ðÿ€ÿð€Ppÿ° РÐÿ À€` p`à@Р þÐÀÿ ÿp€P€€àà ð° @€ @РPР  0€àÀÀ°ÐpÐ`ÿàPþ àÿPÿ°àPp@°ð@@РÐÐPð ÿ ÿ °0ÀÀPPÀ€àР  €€ ðÿ°0`€€P 0PÀ€€pÐ €À `ÿРÐp°0°°   `À àp0 àР€°  €@À`p°° Ð€À`€ P °Ð`Àà°°ÿÀPP0°€ `ÿ ÿ ÿРÐà`pP  `PPЀà€p@À ðÿа€°à`ðÐ`à°ÐÿP€Ð`PPP €à°À` P°`Ð`РÐð p €° °€ð° € 0@P   °ð@ÿðüPýÀÿ° PÐÐPÐð0 0 P€ð°° €àЀÿ@ þàÿÿ ÿðþ@ÿ ÿ`ÿÀÿ°ÿ°`  0@`€ €ÿ€ðÐ``ÀàÀ pàð À 0°€à`@ `ÿ °€°ÿ @Pÿ`°ÿàÿ Àÿ€P@ÿ`P`P ð ðppÐPPð@ÐÐàPp €°@€ðÿ@  ÿ°@ÿ€ÿpÿþPÿ°þ€þ0ÿðþ€þ þ€ý ÿðü`þÀþþ@ÿ`ÿ@þþ ÿàÿ`ppP€ÐààP0àààà`€` °P àÐ`à0Àÿ@`ÿÿðÿÿ þ°üpýÐýðü`û ú@ù`ø@ø@ù`ù€ú@ûPüüðüÀþ`ÿ`а`þÐý€ü€Ð p ÐÐ à PÀù°üàþ` à  `à@00@Pé ×ÀË Ì ×ã°ëîàð ñ þà p @ `þó€îpñò@ó ñàìÐïöÀP`@ P0ÿPü`ú0õ óõú@ Ðpð  p @ 0°þ ù°öàù ýÀ ð   @ð°,@P0ÀÀ÷ðÀ°€¬ÐµPÎpÜ@å ê`û€$€5 1ð&Ð `ñpâàÜ`Þ`àßðÜðáPî ÿp % *à'Рpþõ ìPâpß0åðÐÿ0  à@@Àý õ0òðôûÐ PаÐ" ,P>PJ(P`Ô€¬ð¦ð¬ÀpÓ°Þ€æÀóÐ$ <à?*0 ù0çÐÝ€ÛØàÑ€ÓàÙÀé `à'0*°% Pð  àüPê0×ðЀÔPã ö° ! !ÐÐÀû`óð°ñ0÷ÐùÐÿ0@  àÐ$€.`GP9€ñ¸à§±`¼PÎPÒ€ßàäÐÀ$7ðà3ÀàPpó@äÓÐÃÐÂPÏÀâ@ôü  à+@5P4P)Ð Ðñ€æ`Ú@ÐÐàÞPóÐ0Ðp"à'' "ÀÐ pÐÿ ÿ0þ`P /Ðm€\P ØÀÏê ã€»à­p¤ÀÀ@ã`  Ð"22@@òß0Ø ÛÀÞp×PÕ€×0ñ€P P#€! !€` PîØÐÎPÒÜ`åàó   (ð.+PÀ` þÐ÷àóàöÐÿP Àp'Nðàf 0À`§p¼Ð½p±³à­€Åîà,ðTÀF`*€ ° PáÐë²àÍàîÿPÐ #`5p?€7`"PÐë°æ0ìÀåðØ€Ð@ÚÐì@`' '€ P@À@ïPäðä`ïÿÐ °À€€#`'ð'0pdpt€9ÐÔðˆ ŠP£À®ÍPØàß0ì àSf°FÀ ø°ã ÓPÐ`ÑÐÁ ¶pÅ`îÐÐ5P7 0ð @0À PþPÞpÊàΠá@ö ÿ`ÀP p#P°`øÀôP÷àúÐúúù€Ð!$ Ðð    À€3m^€µÀŠÐ—0¯€ÑPñ€ôÀìÀò PJðJ`100à@ÈðÆpÛè@à€Øðáp"4Ð5" ðô óPû÷PìèëÐôpý°À @ÐÐÀP`ûÀô°ôû`P P p €0`0à0 à à Zh< Ý0’€„PœÐ¿Pï°pÐóàÿ(;3p0ìpʽ€Íàéàô@ð€ëøðP"@.à%Àò æì÷ ûü°ú€Ð0`ÿ@ÐàÐP àÿÐöà÷ ý@À`€PÀ pà€ @ "ðK Z€:ðèpˆ@•€¶pèÐ ÀPÀPP$`ì Ò0Ä Ñí ÿ€ÿðúÿ 0pÐ `õéíPúPЀPü ùÐþðP À À€°€pü@þÀÀ0€ ` €Pp @üÿÐ0@"*`=ÐJ07ü€¶ð‘`•@­@Ù€ÀÐ °Ð î€Ü@Ñ ÕÀèü`0ÐÀ    аúÀñ€òúаpýPý0  € ÀЀ p à°° p` à@ °p!ð8P>°" ç¯Ÿð«°ÉêÀ àp 0ñ€ß`× Ú éàú ` ÿ@ 0` @ù ð ðPø@ ° @€ÿ0üû ü@ 0 @ @ ÐÀþ@à€ðP  Р0@ Ð € ð P àp"@A@>Ð@Ш€© ¼PÜû` À þÀ@À `ú ã0× ØPå úÀ@ Pÿpùðÿ  `ü€õ€ôúð0P þÀÿð 0`ðýpë0ê÷Ð@ ÷öPà ð0 `ð @Ð  @PÀ € @>@BÀÛ ©Ð©Âàßàõ   pÐÀ À Pàä0֠܀í û`ÿ`ÿÐû`ú@Ð € àùð€ò`üÐ`@€Àý`` € `ïpè@ðÐýàP Ð °à`ðÀ °À ÐÀР` PPà  `7 AðÐÏ P¬Ñ íúp ÐPÿß0Ò`ÞÀôÀþPþÀý°ÿÐ ð€Àô€ëðòÐÿðP°P P0  pÿ 0Póðð€÷Pÿ@` €@ÐðPÐPÐ € € 0 Ð @@0 pÐ;PDP PÛ0§ «ÀÌÐéÀò ö0ÿ°  `€ ìÛ€Üí ú üPøàøÿ0 0ðPýÐò@óÐü@°þ€þ0` Ð p °@ ° °0ÀôPïùp€ P   °àð þÐ@ Ð@ð@°ÐÀ°Ð&°>:ð ðÏ`¬Ðº@Û@ï ïPï@ýà °ð ýpì â@åÐò@úöàñ`÷@ЀðÿPû0ûÿpþÀùý ð0€°p``àÿ€àÐý`û ü`ÿP   0Pþ þ@@ ðÀ`   ÀÐüðü€`@ ÀPPPð!0PòÀÆÐ¸Πë õàñ0óP°€ÿ÷ÐîèPépñ@øø@ù ÿP ÀÐ 0@Pÿ þ°þ`ÿ0@@  0ð@€@ Ððpüú ü@ÿà°€ `à`þÐPpðÐp P Рðð`À `Ð`°P` ð P À€@ôàäÐá@ë@õøðõ@÷Àý Àpý üàúpùùû ü0ýþ@°À @ p öPñà÷`°Ð À p0P€p p  pÐÐð  `   `Ðààpò ÏË0Þô@õìðìþ` Ð úðöÀôPô@õðôò óüЀ PÐÐ  þÐùûÐþ` À p0ð`ÿ0PPÿ à Àpà°0p ðàú`ïÐìàõ` ` à ðú°ù°üÀà `À0Ð0°`ý0ÿàÐÿàþpÿÿ`þðý@ÿ°ÿàüùÀ÷`ùàúú€ø`ùPüÐþ€þpý þ0`ðþP0P€P@@Pp`@0PPPpPÀ ÿ°þ@`ú°ôÀóÀõøùùû þ0PàPÀðP0à €Àð@ð0 @` à#@pïÛPãàõøpêßì° 0°` P€þ@ø°óPò ô`ûÀ0`€P Ð0 P@ PàüúýÐ@°à`0° ð@þ0þÐÿpÐþ üý €@  P€0ÿ°þ€þ°þÿ à P àÿ ÿàþPþ þÿpÿ°ÿP`Ppÿðþ ÿPÿ€ÿ@ÿàþ ÿp°€pÐ` püPóñ ú@p @ýðP ` °PЀ° þÐû úÀú üðÿpP°@àp pý`þP€ðþÐüPüPý°þÀ0Р`°@€ýý`ÿpPÿþ ÿPð@p€à°`PPÿÿ PP€@ à€0ÀÀ€ÐÀpàÿÐÿ  Ðààð°€€€ à° ðа ð а  € àÀà°   °°°ðPÐÐÐààÐà°àÀаÐððà°À° €  €€` ðÿ0àÿP@`€0ÀpðþPþðýPýàý ÿP 0ÐpРpp@ P€0 p€P €€p`@ Ðÿàÿ ÿ ÿðÿðÿàÿ ÿ€ÿÿ ÿpÿðÿ``€€À€Ð`€0ðà°ððàðàР°ÀàðàÀàÐÀÐðÐððà `àð P0P``0àÐàÀ    €€€€€Pp0 À€``€€p€€€€À€`€€`ðÿp€ ðÿPpPpp `p€ ppp``€€€ `pp €`    pPp€pà Ð Р €°Ð  °ÀðÀðpÀ° ð  °  °°`p ÐàÀ  €€ À  ° ÐpÀ°   ÀÀ€€   ÀÀ°   °°  À°°°  àÀ Àð°°° à ÐÐР ÐР ° ÀÀà  À °   À€°€`` €`P€Pðÿ€P `€ €p€0€P ÐÿÐÿÀÿP° @` 0 p p0p`@P  @€Ppp€pp```p€pp€€ €€ €€€€ €`€ À°ðÀ° €°°ÀР  €€€      p€€`p€p€€€p€€€€p€€€€p€`°€ pp€€  €p€€€€  ÐР Ð° ° ° °ÀðÀ° ÀÐÐððÀðPðààÀ à°À°   ° € €p€€€€€€€€€`pp€€p P€€€€€€€€€€€€`    €À €°€Àÿ ÐPÿÐÿð€Pÿ€þ þ°ÿ` P ðð@0 ðàðÀ0€ÀÀ°ÐàÐ``0° ° ° Ð°  °°P°€pÿ€ÿ°°P `Ðÿpÿ ÿ ÿ@ÿÿÿàþÿÿ@ÿ þ€þ ÿàÿÿþÀþÿ@€@@Pÿ@ÿ`Ððÿàþþ0þ ÿpp ÿ` @`ÿ€À PÿÿàþP ÿÿ0ÿÿðÐP ýPüþ `Pà0Ðà@0€`ÿÿ€€àÐp@pÿÿ@þ°þÀÿ``ðЀ`ÀPàð    Ðð@ ÀÐpÀ0 Ð@@ ð°ð00ðàPЀÐ@ `ð@À 0à@ÀPp0@0€00 PP€àà`°@P P°ÿ  00P@ 0ð°ÿ°ý üüýþþ@ÿÿàÿ € àþ`þ0þ@ý ý ýàü°üÐý0ÿÿ€ÿÿ0þàý ý@ü`û ûû û@üpüðüýþàý@ýàûû@ûÀúpúPúðú úû@û û°ûàûàûüüàûÀû ûÐûàüPý€ýPý°ýPþPþ@þPþ þÿ ÿ°ÿÀÿÀÿÐÿðÿ ÐP   €ð 0@0P€ €€Ð`PаP`€€`€ÀÀà°P@Ð@ðÐÀ€ ÐÀ00 °° °ÀÐ@€ðàðÐàààà €ðÿðÿàÿÐÿÀÿ ÿàÿÀÿàÿpÿÿÀÿ€ÿPÿðþ ÿàþ@ÿ`ÿ@ÿ`ÿ ÿ°ÿpÿPÿÿàþÿÿÿÿ@ÿ`ÿPÿPÿPÿÐÿÀÿÿÀÿÿàÿ ÿPp€p€€€€€€€€ ÀÀÐðÐ0P0Pp€°€ €€Ð ð ÐP@ Ðà°ÐÐÀ0@P0ÀÐÀP` `PPPðàÐàÐÐÐÀàа ÀÀÀ °`P ðÿ àÿÐÿpÿPÿPÿ`ÿ0ÿÿàþàþÿðþàþÀþ þÐþÿàþàþðþÀþþpþþ€þþÀþÐþàþÐþþþÐþÐþÐþàþ€þ€þ þþ þÐþàþðþÀþðþ°þ þÿÿÿàþÀþàþàþÿ@ÿPÿÿ€ÿ°ÿ°ÿÐÿàÿ°ÿàÿ 00000@0PP @@@`P€ÀÀÐ0`@`€PÐ`0°@pÀPÐpР0Àà°ÀР°`€ €pPàð°  0`@PPP0€€ €p`P@@ 0 ðàðÐÐàÐðÀÐÀ°°ÀÀÀ° ° ° ÀÐÀ       €À°° °°   ° pÐ`°             À  À°°À      € À  €€ €p €p€ p `€p €   €€  À°     °      ° °  °À°Ð°   °°°  À°  °° °€  €   À   Ð   p°    €€ °  °     °°    °° °   °°    € €    €€°  pP  €p`€Ð €€€€€° °€° À   °    ° € °    °°  ° À     ÀÀ   °  €°   €p€   €   €°° €€€° °°    ° À   ° °° À    À   ÀÀÀÀ € €°        €€€    € € p€€€ p €€ €€ €€p€€ p€  €p p€ €€   €€€ €€€€€€€€€€ €€p€€€€€ €€€€€ €p€€ °  € p€  ° À°À€°ÀРp €  € €€€€€p€€€€€€€€€€€€€€ €€€€p€€€€°°€€€€pp      ° À °°Àа  ° À  °À°    Àа  €€€   € € pp€€€€€0@``€€€p€€€€€€€€p€€€€€p€€`€€ppp€€p€€ppp€À €€€€    °    °€€ À°ÀР  €€  À ÀÐÀ     €€ €€€€€€€€€€€€``€€€p€€€€€€€€€p€p€p€€pp€€€€p€€€€p €€€°€€°€€`€€ €€p €   °  °  ° p €€€€  €p€p€€    €€ €€€€€€€p€€€€  € €  °€€p€€€pp€€p€€€p € €€p  p€°€p €°pp ° €€`€°€€ €€p€€€p €€€pp€€ ` €  `€p€€€€ € p€p €€€p° €€ ` €€p€€€p€€€€€€pp€€€€p € `p€ €€€ pp€`€€€p€€€€€€€€ppp€€€€€€€€€p€€€p€`€€€p` pp€€   €€p   °   €€ p€`p€`€€p€p€ €€€€€€€€€€`€€€€€€€p€€€€€€€€€ p€€€° €      °  °À°  Àð°Ð    ° °  À °   p €  ` °p p€ €€€€€p€€ €€€€€`pp€€€€€€p€p€p`€€€€pp€€€€€€€€€P  €  €  €°p€ €°€€  °€€€€`€€€€`€p€` `€€€€€€€€€  p€ €€€€€p `€€p € €€° °ÀÐР      Ð Ð° ÀР€€€€Ð àЀ€€€€€p € € p €   € € €p€€P  Àpp€€€€€p€€€ `€€p€p€€€`€`€€ Ð p   à  €   À°À€€€p ÀÀ    €€€€€€€€€`€ €p€p€€p€€ €€€€€€€€€p€p€p€ €€€€€€€p€€€° ÀаÀ àаÀÐÀÐðÐÀ°À°°°°À°À °° Ð ð   Ð   €€ ° p `€ €  €p    €€€€ p€° °€€   ° À   €€`€€°    ° °   € € €€` €€€ Pp€€€ p ppp0€P`p€€€P`€0`0P€€€€p€€ €€€€  €€€°€ €Ð°À  ÐРÀÐа°ÐÐàаÀàÀ° ° ÀÀÐÀ    À  ° Ð°       ° €€€€€ €€°€p€p€`€€ €€°°  À  °àÀ ÀÐаà°ÐÀ ð°    Ð°Ð°ð°À° ° °      °€   €€€€p €€€@ €€P`pp@p°€€€€€€`p €°€€€€€ €  À €€°°      pÀ °  ° À° ÐàP Ðö ò€û0ýÐàð`@€ 0ÿ`Àp ÿÀÿPPÐÀàÀPð€p°ÐÐþþ@pРÿÿ pÀÿ ÿ0ÿ€ÐÿPаÿpÿ`ÿ ÿ`ðÿ@`ÀÿPÿÀÿÀÐ °ûô õû ÿ€ÿÐàà  àpðÿ ÿpÿÐÿp0Ð@ÐàРÀàÐðÿР Ð°ðÀÀðР À°À°Ð°àÐÐÐÀ@À  °@ð° PÀpаà°p€àÿðÿÐþ€ÿPÿ þÀþ°ý þþ þ@þ`ýPýýÀý°ýýþ þ ÿðÿP` Ð0Ðð Ð à0`p° °À ð@0  à ÷@ê@áÀÜ Ü`ÞPâðèòàû€ à P ÀÐÿùÐó ñ@ñ€òpõù`ÿà Р`à @ü0öô öú`°°  ÐàÐ`°Ð P0À@@P``ï`ÚÐÎÀÎpØÝÐáÐêðö@ 0À Àú@õìãà€â@ë öÀýÀà ðpР 00þ€ùö ó°ñ0ô€ùpРР  P0ÿ`P€Àÿ@À`àP à    `    € ÐÐý0õëàà`ÛÀÝ`â€çìàðö ýàp€àþûùÐöô òPñÐòöÐùÀýÀÿ@ÐP à€  Ð0`°€Ð`  °€PpÐ € Ð  ° P à  Pü€øPô ñ0î°ìÐë`ë°ëì€íï€ñ ôðöúPü@ÿ @ð`p ` € `   ÐP0P€ðð€ðþÐý€ü`ûÐúúû ûPüÀý€ÿ`@à Ð P À  p ð Ð ð p À  pPþ°ùõ°ðì éçàæðåàæ€çàèë îòðõPú ýÿ0€@PÐ ` ° ° p @ °@À À @PPþýû úÐúû€úÀû€ý`ÿ `@ð à ðP@0Ðp ÀÐpÀ À ý0÷ñ`íéÐä€ã@ãðá ãàäPæ@éàí òöÀû`ÿð0  ° Ð € `   ÐPpPP0þPý ûðúÀúàúàúüþ0àðÀ @ @  pÀà à@ pPР P à°þùàóÀïë0ç`ä`âpá@â`äàæÐé°í`ñõÐùÀýPPЀà P 0 ° €ðPàà`àýPýüpûàü0ýPü€þ@PÀpð€ P ÐàÐÀ  À`àPPð pþPø ïé`äßÛàÚ€ÚàÚ ß0ãæ`ì0ò÷üÀPÐÀ` P  pÀp`à0`ÿÀýPüðúú`ù úûÀü°þðÿ@p° P P 0ð`P`ÐР@Ð €` 0úóÀìPå`àÐÜÐÙÀØðÚ°ÝÐáÀç ìPòø ýÐÿ 0 à   p P @ °0àðPÐàþüàúùÐø€ù`úàúPý`ÿÀЀ€0 ð PÐàÐÀ€À P€€@ €ðP÷ó°ì äPß ÛÐÕpÕØ Üá€èÀìPñ€÷üÿ àð  `  ÐÐ@@P€þüÀúpú ù`û@ýþÿÐ`@ Ð ` ð@`@ Àà@ÀP0  øÀópì°æÀßpÚ Õ`ÕÐ× ÝpãÐêàï ô`øÀûÿ 0 ÀÀ P @à°Ð@@ÿ@ý ýÐýÀûÀû€ýðüý€ÿ@ €`Àð P P À à PÀÀ@ °@ð°ðà   ý õðé°äPÝÐ×pÔ€Ó×Þ°åíÐò÷Pùüÿ Ð ð ðà À °`°ÐP€àÀýûàû`ú°úûPýÐüÿ@À  ÐÀ ð Ð @ €°PÀð pÀà €ùPóàíÀéä0Þ°ØP×Ð×0ØÝç°ïÐõ@û0ÿà@@P@` 0àý0ö ópó€öûððà@ 0Ð÷ðñàï€õ û  ð à € Pp ð `@`€ P(Ð+€-@+ $ðÿÐÚ`¾@«@¬À€Ü þ€À 0ÀüÀô0éÐßÖÓÐÙ`é0ÿÀ  ð0 Àüõ@óÐõùÀûðüP0 € 0  0öñï€öðþ@ Ð@`P à ÀpP PPÐ &€+P,Ð*p$P`ýãнP®®@ÀÐæp $ÀP pûîãßàØ@ØpÝÀê0ÿÐà!p!`ÀòàèçÀðPû`€  аôÀç°ã°êø €°P  @ ðààPÐð€Àp#p',P/Ð+ ÷°Ö ­p¦ ±ÀÐàû°&Ð0ÿ°óéÐÞÐ×°ÐÖ0æ°þ %"À€üÐê@åéò ûP P€p € 0øåÚ`áPò@PÀp 0ÐÐð@ÿþ`@ àð°Ð°!P' 201`$ÐÿÛ ¯À§ð±ÐÒûà !€€°ùPì Þ0Ó ÌÕPê À€&`À Ð÷ éðç@íô€û@ P° ðPðã`á°ìüP À€p p 0ðû°ú€þ €pð €   €$à-8@7€"ÐÿpÇ@¡`™­PÜ 0$@'ðP ð`ö€æ@ÕPÆŰÖ÷°,*àþë€å@éPïpô`ù0`"À ò0ÜðÓÞ°öP PÐ à  PýÀõ ùР!"ðÀ€`°"1=P=àÐ瀳ЗP¨PÊàú@ P0 p@÷°Û Å ½ÀÍî`(°'À@õPï ï î`ì€î ùÐ Ð'€€úpæÀàäð ù0À ÐÐÀðÀ@ü°øàû€ÀÐP€PаÐ@"0'€2à= # ñ ³à‘@ŸðÇýp    P°ü ÞÁ€¸PËñ0+0$à þ°ôàóPóÀìðæ€é@úð€%`+P`ÿ€éÐâàèòàõ ÷ ý€  À @Ð  üpôø  `€€  +À=À7ÐPÆ•P—À½ ó0àP pP  éÃÀ´ÆíPP#pP÷`ç0ÞÀä0ûPP#ð!PùôÐðÀìàëðü àà€ Ð`þ ýÐP °PÐÐÀ"€"`'7pF@&ç ¦° ©PÚp À ðàÐø@Ìp³Ð»°ÝÀþ`Ð`P 0÷0âØàõð@ à!`Ð ëàÛ€ÙðæPøà 0@  àø`ô@û@ppð`°Ðp #Ð%<à@ @Ò@P¤ ÁPîýPüà °"P"p €áPÄÀ`Ô î üÐ Ðà°@èPÞ€ä`óÿp `À pþPì€åëÀóP PÀPÿÐû€ °àðÐà@Ð`°4T Wà0Â@Š—àÂéð@ì€þ "€=Ð2 Õ½`Ä@ÕPà åp÷/Ð0pø äÀäÀëîíPòÀ+`1( ùðÙ Ó Üë@ô@øp € €& p `ý0ýàÿþpP@&P#€# À)àD`Y`*ðÙ°š›ÐÁÞ0æPâPü€#À<.ppà€ÒÔàÔÀÑ€ÕðP .Ð* Àþ0õpôîàã0â ð@à0#p Pðú@æàÙ áûP €0Ѐ `Р à P  *p,`(À1PU PPò¯˜¶Í ×ÀÓí@#ð àýPý0Ü`²¶@Ḭ̀ܰì   à `` °ü@ô°óÐíPåÀãèðò0üÀÿp @ Ð@0€P @àýòõôPð õàüàÀ Ð à à Ð P € ð P @0`°`P**`;/0ôPÐæ Çà¬Á0Ë@Úæõ€ P€ °ðöÀïìéÀåÐäÐí üP0à P  à@P€pÀ` ü`÷ñ€ðÀôÐø€þ0Ð   а Ð P ð PpàP` '+,`>÷°òÔ ° µ@È@ÖèÐì `°@``ýÀðçÀçpêèÀèp÷à    ° Ðð€ùp÷ùÐóí°òÿ€À@À  p Р ÀÐP`  &À(À-=@ÿò@ëðÓð² ³@ÃðØPîïPÿÐ@Р 0ü ò°ä0áPéðì ë öð À0 @  PP @üôÐòõPôÀô0þа à € à ÀpP@`à€ €&,€'p<@àî0è°Öà¼à°Ð¼ Îîàòü Pp   úà÷`ôpèàÝ0ã€í ðp÷Àÿ ð P  ÐÐþ€Ðù@ó0ñ ó€ù0PÀÐ 0 Ð °p@À`€€ "+ #`5 5°ò`çàØÀÌà³0µ¾€âðùàùPPPÀ ñó`ñäÀÛ äîøPÿ`@ ÐÀ`°à€ þ  0õïPðPø@þ ÿp P P 0  @ À ``€,€)°,0>€ Pí0Ú0Îð¹Àµ ·àÎ@ñü@ °À Pùððñ`ìáßÐãÐïàþ€ à ð0ÀÐ @ PûÀö ýpþôÐðÀô `ðÀ@ð À€ð° Pð-À)P)`9ÐóÐààп º€ºÇ`æÐö@ÿà° ° €0Àø°ó ððé@æ°â0ç@ôÿ Ðp Ð à   Pp `Àúàöàôñ€ð`õÀûPÐ@ PÀ `PàPÐ °Ð" #) ,P ðü åàß€Ì ËÆÐ ÜPîòÀôp÷ÀüÐÿpPàÀÿ°ýpøàóÐòò õ0ûPÿÀÿ0P@ P p   €PþðùPú û°ûÿP`PÀðð @ÐÐÐp€0à° à€Ð   öæãpß ÙÚ€Ý ØÙPÞâè€ô€üÿÐ@ Рp þPýpÿ@P @àÿ üpú ýPÿ`0 Ðð ` p à@à P€Ð @%  ÐúpêäÝ Ø ÙÛàÕ@ÖðÙ Ü0ãð€ù`ÿ0P À` P  Ð`ààýü@ýÀ PþýPý þ€ÐpÐPà0  PP  €À pàð0 @PððæPáÀÙØÛ Ø@× ÚÝààêôü  P P P À° € PPþðþp@ÿ0Ðÿý þ°þþPðpp`Pp ` `  Р0p`@Ð0Ðà@øÐì€ä`Ý Ù ÚÚ Ø0Ú°Üßæîöÿà À   ð à`àÀÀàPРþ þPü@üýþp€ð€P € 0 ðÐ ð ð ÀPÀP@p PùÐîàæààÝÀÛ°Û Û ÜÐß@ã èîÐôPû°€ à 0 Ð 0 à 0ÐÀ`ÿ ü`ûÀú ûþP@à@` ` ` À  Ð ` à  0 @ @ @ 0        Pü ô@îÐéÐäÐâ€âPáá äæéPí òpöðûÿPP0  ð 0 PÀ€P@ @P€@€  0 @ ° à€PP@@€À0@ °p ÐþüÐùøàôàòò€ð°ïðàî îàïñ°ò`õ ø ú€ýÐÿÀp0@ð €þ@ì€ø`ü°÷°ÿ Pð0àà  À €°`PÀðÀ @À€à0PPð€ý þ°þû`ýûù@ø€÷Ð÷öPòôàò`òàõÀöPõp÷0ú€ú ü€üÐüüþ@þÐþþpÿ`þÐÿà@Pà`Ð ðà@p p À Pà  ðP€0°Ð€ÿ ÿ°þpþ ü°ûùÐ÷Pø`ù€ù øÐ÷ù0÷@÷@÷àõ°ô€÷P÷ùÀùÐúüý ÿ üÐÿà°° ð°€Àp ð ðЀ`€  € àÀþÿ àþÐþàüÀÀýýüûPüÀüÐüÐùÀýpýûðú ûü üÐûÀúüÐýpþ`P@€àÀÿpp À Ð`@€0Pà@ ÀРà p0€Àÿðà€ÿаý°ÿ ÿÀü0@à ÿðþ°ýàÿP üðÿ`þpþ0 üþàüPþ üÐú`0þÀü€Ð€€þàÿ þ€P ÿpþ °ÿ€0@Р ÿàаð Pð@pP À`@ÿp°ÿà@PP`€`À@@þ@`ÿPP€þ`Ðÿ°ÿþý€ÿP ý ÿPÿ  @þ@ÿЀàûà Ð ÿ þp°ÿ°Àþà@`РÿÀà@àÐðÀPÿ @P @ÿ€``°àÿ@° 0üаþ Àþ ð€þ00Àþðÿ°€€ `Ð@àÿð  @0ÀPPþà€àþ0ÿàP ÀþÀüþPàÿðPpÿ°Pþ€ÿ€P@ý À þ€à ýð@àþ`Ð þ€ÿ ÿàPÿÐþàþ`€€ü€Ð` üp @üpýðþð€  ÿ€€üÐ€àø ý Ðþ`Pùpð0ÿ€ùÐÐ@ÿPÿ°þ`ÿÐÿ0Àþ ÐðÿP@þ@ý€ÿðþ@þ° àþÐÿpPú° Àú€ÿÀ°0ûàþ0 pPþ`@Àþþpù @`ýþ€ @û€ýp`ûÐÐý ýp àppðÿPpþ`üРý ýàà°üàý ü`ÿ0°ý°üàPüàþÀ@úû€Ðþ ü0ðüPÀþ€ð`PþàþÐðÿ°þÀ0p`Pý àú `À€Àÿ  þ@þ`À@ðþ0` û°€ÿ ðà ÿ àý ð€ùÐ`€0`ðÿPû@ÿ€ÿ0 ÿÐ@û 0`þð°þ`€àüÐ `þ@üÐþ ÿ00ÀúP Ðü`Pðû  °À °`à ýppp`00ø@à0ÐÐþÀ°ý`ü°p ÿ@€àüpÿ `ýàü@   ð  `þðú€`€ÀP@ÿÀÿ€`°°0þàÐÀ`ÿàú °ÐýÀûPp€ þ0€@àý€`üÀàýð0ÿÀüÐÿ€Ðþþð €0ð€ÿÀüÐ `þ üp0ðÐPý þÐàÿ@€ü€püàPP ýPþ ðÿ@€Àýp@ ÿÐýàþ`àýPý`€` û Рà `üÿ0þ`p ÿ @ ÿ ûpþPÐ@`ðþ€þ`0ÐÿPýÿ@ÐýÿÐ@ÀÿüÀ@`Pðü`þpP@ ý þpà€`þ@ûР  @ÿP ÿЀúÐûаРÐü0þðÿpP €@ü@þpàþ ÿ€ÀàpÀ0P@ @ þþЀ P þÐüÀþp@ `ààûü°À@ðÿàýðý€ÿ@`p€ þ@ýpÿ€pðþ ý€þàÐþþ`ÐpPþ0þÿ°€ þÐý € € `þ0þ ðÀp ÿÐÿ°€P€ÀÿÀð`ÀPÿp°ÀpPÐÿ°ÀÀàp`ÿ ÿ@° €ðÿÿàþpÿ° ðÿÐþðÿ€ ðp€€ ° p  °PðÐ`  0p`À ààð°ÀP €À p0  pPÀÿÐÿ ÿÐÿ ÿ °ÿ ÿ€ÿ°ÿ € ð`p€ÀÐÐ@ Ðàа  @PPðÐàРÀ€°0 ÿÿ€ÿÿ°þPþ þ`þàýþÀýýýPýýþ0þàþÿ@ÿ`ÿ°ÿ Pp€àPPÐð`P`°`àP€P``P0°Ð€ààÐÀ À `ðÿàÿÿPÿÐþpþþý`ý°ýýPýý@ý ý`ýÀýþ€þ@þÿ ÿ 0PPÐPà0Pð ` @àÀp`@°PPаÀÀ°€ÐÿPÿÐþ@þÐý þÀý`ý0ýýý ý ýPý`ý€ýÐý@þþÿÀÿàÿ@@pÐp@PàÐ PP@°@`€ 0à  P  Ð°p@@àÀÀ°Ð0ÀÿÿÐþPþþÐý ý ýý@ýýýPý€ý`ýPý ýþ€þþÿPÿÀÿ```Ð0°0Р`P0Àà°ðàÀÀ `Pðàà`Pð°°  P€ÿðþ þ0þþ€ý€ýýðü ýýý ýýý`ý€ýÐýÐý þPþÐþ0ÿP0`€@€0`€ð0`€à à@€@Ð@àÀ €p°Ð ° PððÀ°°0Àÿÿ þ°þþþ`ý ý`ý ý0ýPýý ý ý`ý ýýýþ°þÿÿ@` ð@Ðà@0ðPÀ ðÀP€ÀP@@pà`P` pà° Ðÿÿþý@ýüüÐû ûûÀû0ûüÐûpü€üÐüPý@ýþþ0ÿÐÿ0ÿ€ÿÿ@pÐ@°°À@@ÀP` PP à€àÀ ð ü üpp @PÐÿÐ`ppûÀûþÀþ@ûPø÷Pù0ûpûàú@ù€ùàúÐý0ÿ þ@ýÐüþ€ÿ`p  ÿP`€@``@€Pà Ð ààÐ ðpP€ @P ýý   ° P P  P`P0Ðÿ°ú õ€ð îPï°ðÐñ€ñpòÐõpú ýþðþÿP`Pÿ°ÿ@P0`00 ÀúûÿPPú öðùpÀ À € ðàÐÀ àÀ   @`P 0õê€æä€ßÐÚpØðÚPáPêó`ú`ÿP° Ð ð Pð `ý@ú÷Pô`óö€úþ@p   p ppP À€öÐðÀï õÐøàþ0à0 Pðà Ð@°0 À@" 0€ïPÝPÙÐÔÐΰʀÏ@×ÀÜðãòÐÿÀp   àР ð ÀüPóàìë0í`ìÀìÀñú° ÐPP 0òÐæ åPêò þ0ð ` Pð à` €àP°$Ð+Ð'Ð  õàÜÔàѠɀÀ@à ÌÖàÝ@ð  ðÐÐø êâpâÀäåç@ð@û@@ `"p àÀÐùîå@ßpÛðåPúÐppP0° @ @0ð p#304`($PPðæPÒðÏ0Á¶p· ÅàÎØPé€P@à"P0p0ôðâ°Ø°ÙÛ°ÛÐâñPþp€P%P&Ð( Ð pñÜÐÌPÌÕÀé°þ€Ð`ààÀ°P0°   ðP `à3€=`7.)€ÀìpÎPÊ» °À±@¿ÀÇ@Õ0ê€ À"'À)  pPðýàëÚÀÐ0ÑàÑ0×Ðæ ø`°Ð&Ð)P* -P$P€ôàÛÇ ÁÐÊáø `"" € @0 0   p À Ð P.`A0CP;09Ð ÐøÒP¼²@¢à§ µ Ã0Ï@æ@€°+ 6ð6@*PÐ0õ`âÐÒPˠʀÉÐPäú€ pÀ+Ð1-€) &Ð#à@÷À×ð½P²»P×ÐùP,p0€*`P€à àÀ0ÿPð ` *À<ÐE€C€:p1PÐæðÄЬ ðšÐ«À ÐÐå€þÀ`)ð4à<3`аí@ØÐÆ`Ã@ÆËPÔ ä°ù 2P9À5+Ðà óÐÛðÃ@·»PÐpò3<4#ðÀàÀ°p€ àP€'ð5 B F=à2$×@¹P¡p—0™Ð±Ìàâ þ` &@/Ð45€%PÐõ@ÚÀÃp¸p½@ÈPÖ€ê`þ@ÐP+404Ð-p!  õPâÏð¿ÀPÊPã@*@?À?2ÐÐPøøpý€`ð €``#P1ðAÐF ?P2p!0  ïPÏ຦ @§`¼×ò`p$,.* @ý0é€ÓàÄ¿ðÃ@Ð äü 0 *P-@+$ð ðôÀìáÐÔPΰÐÜ òÐ@+ð8P8À)`ÿ ó òÐøÐð 0PPЀÀ à-:0?900 ì Î ¼ ¨§p®pÂÐÛ öÀà"°*,€$   ö0äPÒPÈ Ä ÊðÖàê°ÿð"Ð*à*Ð%@À þ°÷îàÜ€ÒÍpÓ`åÐP! 4à:Ð/€Ð@ôPñ@õ ÿà ÐàÐÀ€"+ 5ð63À*0êÀË·@§0¨Pµ ÌéðÐÐ#'p#` `Pó0ãÀÒÉÐÆÐÍÜòðpà&p*À&`@à @ÐøàõÐò°çÐá€ÙÀÙÀâ@ø@€'P5à3$ðøÀî@ìpö00°  @ÐP+Ð13Ð.À"€ôÕ@¾¯Àª€¶ É@ã€ú€À@"à!ð€ú@êÚ0Ï`ʠ͠ذêÀþ!`'Ð&p p ð ý ðæÚ€Ó Õ`æ€þ`/€7 0`À€øðàò`ú ` `0ÐPP!0)P/°.p,°#ÀÀÿðâ0Éе°¬à°PÀØóP À#à"€@0úÐî ãPÚ ÓÑ ÕÐà0òàÐ % *€'`€ Ðû0ò0épÞÐÖÐÕ àöÐ p&Ð33Ð%  °ó°ñöàþÐÐ @`€àÐ#(°+ '°#€ °÷@àÌÀº ¶€·PÆ ÛóP `P`@€÷ÐíPæà`Û Û`ÞPæò`ÿPàP#$°PÐ pþ0ñ€ìPá ÛÀÙ°ãàôàp Ð-0/ &0°Ð÷ðô°õ`ýÐ@  0ÐÐPÐÐÀ!À& %$ÀÀàîÙ€Âp·P³Ð¼P΀æàþðÐ!`0Àþ@ô ì€æ á Þ°Ý àPèPôÐ## Ð @`ø@õÐç`áØPÚÀãàõÀ P#P0à1ð&@`pøÀñ`ö@ýP 0àPP`P0"@& %à"ð  ÐüÀèÕ`üÀ½PÇØPì`ÿ€Ð€@€ýPõÐî`é äÀáÐápäàëÀö 0€P` PÐû úðé€àpÝÐà°î`À) 1+€0 üóðó`ú`à € @Ð ÐP€` Ð!ÀPö0â€Ì¿°»PÀ€ÏPãúÐ À ðà€ý@öÀðíP鿀ää0èàï ûÐà@àð ð€ù€ó€ë@äÞá êÀü°#@-,!0€Ð÷PôøÀÿ`€àp@Ð  P ` °°àýÀë ÖÐÄ@½@½€ÇÐØ@ï@°p€ аøòPîÐêàç æÐäpæàëõ€ÿ 0À À ÿþ ú°ò°ì äàÞÐß`í þàà(0À,0 üò@óøP0 @€°Ð@0!P!ð!ÐàòÀààÎp€¿PÄ Ñä ùÀ À@ààpÀüÀô îëÐçÀæ æPç ê`ñPûàÐpàP àþþÀö0ð`èPápÞ€äðôð°Ð,à.'àö€ñðôÀûàÀPÐ`ÀàР"° @ à@ò`ßðÌ`Á½`Ä@ÑÀä@ù p € Ð0þöÐï€ìPéç€æ@çêÐðÐùÐàà€P€ð@ð ü°ôí@æ0áðàÐè÷ @à), %€û õÐõ@ûPà 0°àP0P``°0ðàÐøæ€Ò Ä0¾ðÀ€Ì ÞôÀ€P@ ðÿ÷ñÐí@ëêé°è êÐíÀôþPà@P  °þÀú0õ°ðÀèÀãPâÐç`õàР(à,Ð&p0 ûô€ôPû€ 0Ð0à  PÀÐPÀ`õä`ÑÀưÂ0ÇÐÓðä0øpÐ@ €PýðöàòPñï€î ìë`ë@îàóü àPÐа @À üÐôí@æá€ãëû `p)*Ð"@ÀüP÷Ðø°þà   p@°PÀð P@õàåÀӀɠÄÐÇÐÒðâ@õ@ @ÀP Pþà÷ó ñÐïï îÐìí@ïpó@ú@À  p@à ÀÐû ðàéðâ°âpæò€ÿ@à ##@`ÐðPý ý@ P `p€€`PÐ` Ð@ùÐì@àÐÔÏÎPÓÞPìû0`ÀPÀ@ûàôòPðÐïÀïPð`ñÀòðô ùPÿP° @ €0  ÐüÀöPìåßpäí`ýÐ ))@   ýø`úp  Pðp Ð€@ð °Pà `÷éÞpÓ Ï°ÐØ0ã€ñ þÀP ` À°þ€øðóÐñ ðàðñ0ñ°ñópõ°ù€ÿ`@ ðÐÐ@ `ýàóíè`çðêô@ÿ @ð 0° ÀÿàÀÐ €`À`P Ð PàÐp РøÐë@ßÀÔ0ÐÐÐÖáÀïÀü°À€Ð 0`Pù@ôððàïàðò€óÐôö0ø ûÀÿPÀ 0p€ 0à @ù0óèPä0ãpëPõ0€%Ð" €0Pÿpûàýð  `ðÐà `P Ð@ ÀüPñåàÙÓ ÐÀÔ°ÜÐèÐöà Ð € à€ ü°ö°ò0ñððàñÐòóõ@ö°ø`üP ` P `  ùïÐé çê ðÀû`ÀðÐ@À€ÐÐ`000 @  àPа€°€Ð ÀP ö0ëPá×pÔÀÓÀÙ€â@ïðú€` P à@ûöàòÐñ0ò`óPôPõ0ö ÷ ú0þ@@ÐpPЀÿ°õÐë0çPæPìö °`   àÀð@ 0 ÀpàÐP@à0`ôðæÐÛpÒ°Ï@Ð Ø âð°ý°p 0` àð ûP÷0ôPóðòó€ò ó@ó€õÀøÀý °À À àþPûÀéÐç áàé@ð€ÿ Ð € ` ÐÐPÐ@ € ° Ð à  @ ``À`Ðøé0ÜÑÐË Ì€ÓÞ0ìúÀ` à ÐP`ü€ù÷õpóàð€ï€î@ïpò@ø€ÿÐÐ0à  ü°ì`èá°ç ï ý°` °`@ € Ð ððÐð ÐÐà Ðà`€ò âÔðÊ€ÇPËPÓ°à í úа 0 @  0€ü÷@ñPìé€é`íó@üPРаÐЀ àPüPö ñ@ðò@öýÐà €pà°°@Ð   À ð @ À@àЀ0ÀôÐá× ËPÌ΀Øâ@î÷þÐà @`0 à P °à úÐòðìpéðé@íÐó€ûPà а@€ °pýPù ùú0ý0@Ðà € @  P€Ð     °à°@Àpüðé€ÜPÐ Ì`ÍPÔpÝ éPò ù@þðÿ€À@ € 0@Ð @ øÐð°ë°êíñøþPà@ ð ÐÐÐÿðÿ@PP@P€Ð ÐP ÀðÀ p Àp`Ðp÷PêðÚ@Ó°ÎÒØ@á`êð@öðùü ÿP0  àPðø@óÐïïÐñ õú@þÀÿ@p PpÐÐ@àP €P@ p À  à@ Ð`0`÷ìÐÝ ÙÔÀÙ°ÛÐå0èÐï€ðPöøðþÐ P ð0ýàùà÷ øpù ûü0ýPüàü°üpýPþPÐP°@°`p@ °àp Ð P P 0  Ð    Ð P @°0 ÀøÐîÐçäÐáÀã`åèpé0ìPíÐð`ôùpþ°`À ðP€€P`°P@€ýPü`ù@ù@ùÀúýÀ0 ð` @ ÀP0àРPðpPPP@°@°ûàöPôPòòñÐðð`ð ð ð òðôø€ûÀýÀÿðÿàð PP€€°0à0Ѐ°00`à Ð0`°@   p à@àð€€Ð €ÀàPPÿÿ`þ`þýðüàû@ûûÀú0ûûûûÐú0û0ûàûàû@üÐüàýÐý þ@ÿ0PÀðPp  Ðp@€Ð €0@°°Ð°€ 0ÀÿàÿàÿÿÐþPÿÀþÿ€ÿ0ÿ`ÿ ÿ€ÿÿ`ÿ@ÿÿÐÿp°0òàòùðЀ°0Ðà@pÀp°ò°òðú@€ ð0 ÐpÿÀüû@þ0°0ðÐààÐаàÿàþ€ÿÐÿ0`@ÀÿÐЀpÿ þþü€ýÀÿPÿPÿÿ`ÿÿ ÿÐþðÿÿÐ`РPÐÿP0Ð@pðp`ÐP P àÐpÀÿÀÿpÿ  ÿàÿ ÿÿpÿPÿ ÿÐý0ýàýÀþÀÿþ ÿÐýÿpÿðÿPPÿÿÿ à`p€ ` ÀÐ` ð€ðÐÀPÀа€ðPP€ðð  ÿÿÿpPÿ þ€ýÐþðýþþÐýþÀýÀý0þ þPþPþ þ0þþ`þ þÿàÿpÀðÀ  À 0  P € ÐÀÐPðp°àÐÀÿÀý@ÿ€þ@ý üPýPü ýÐýÀüpü@ü€ý€ýàýû€úpû0û@ü@üàûü0ýpý þÐýýÐþàÿ@@0 PP@àР°Àðð€`°ÀÀ 0p0€Ð °ÿðþpýýPýþðþ þ ýPþÿ þðÿþÐýÐýðüüÐúÀúPúû0ü0ý€þ`ÿÐÿàÿ ÿÿÐþÐÿ€PPààP `аP€ °P`@à p@pÿ€ÿ €ÿþ þ@þ€ÿðþ€ÿ ð Ðÿ°@°ÿ`ÿÿ`þýPþ€ÿÐÿðÿ@ÿ ÿÐÿP€`€ ðÀpð°€0À00à@PÐðàÐÐ@@PàÀpÐÿ`àpPÿÐÿ`ÿ€ÿþ ÿ  À À`°þpþpþ ÿþÿðþ ÿpÿÿ`ÿ°ÀðpÐp ÿðÿ°0°Pð€    € ÐÐÐ`ÿ`ÿ`ÿа ÀРPþýàýÿÐðààÀàþÐý þÿ°PPÐÀÿÀþPÿàPð0°  `€ à ÿÿ€ÿÀÐÿÀ°ÿ ÿÀ0 °@@þÀþЀ €`Àÿÿ0ÀÀpP0@pÿàÿPà@à0 €0àÿ  ð€ `ÿ ÿÿðÿ€àÿ@€`Pÿÿ p°€  Àÿ PÐÿ Ð°`Pÿÿ€€P€À0 @ÀÿP@ÿÿ€ð @ÐàÀpÐÿp€ ÿ € Ðà  `ÿþ Ð` `@ àpа €0 Ð0à@0Ð@0°ÀÀ 0P` ÐàðàÐÐÀ àà°` °ÐàppÀPÿÀÿÀp°@Àðÿpÿ°àPpP@Р°À`P@ÐÿÐÿ€ÿ0Àаàà°`ÐÿP°°Ð@ð ÿÿ@ÿ@ÿÀÿ°0ÀP0ÿðþPÿpÐ àÀ `ÿ@þàþ0 °ÀÐ`€  pðÿÿ ÿðÿp°À €@PÿÐÿðÿ`ÿ°ÿp ` ðp p€ðÿPÿ`ÿ pÐ0 ppð`PðÿP € àÐp @€ÿðþ€þÿ €`0`p ÿÐÿ 0pp`€`À0°P  ð@€ÐÀ ` ÿ p°`@ÿÐþ þþ°ÿpÐàÐÀ àà p0ð°@Ðà€€°p€0` °0 àаÐÀð0Ѐ°ÀðÐÐÀ€Ðð@à ÀÀ ÐP àÐÀ°` ÿ0  ÐЀ@ÀÿÐÿ`À Ð °ðÐP`ÀÀÀ@€0 Р ÿ°ÿàÿ €àÿpÿ ÿÐþPÿÐà ° Ðÿ ðp0À` 0Ðÿàp`°€ ÀÀ  ð °ÿ € Ðð àþàþÿÿ À`ÐpðÿPÿÐþPÿ  Ààà0ÐÐÿP°°0àÀ°ÿ€ÿ€ÿP À@ °ÿàþ@ÿpÿ@ €€àÿ ÿ€ÿp€€  PpP  €pP`ÿ`ÿÿ À PÐÿ@pp@°à pPpPp ð@P0 P ° °€€`ÿ°ÿ0ð€` °ðÀ °€ pp€`àÿ``€pp°ððð€€  p °àÀ ÐP P p€p€p€€p€p p€€€àà0 p0à ððÀ°Ð ÀÀ°€€ °° €À à°`°À ÐÀ °ÐÐÐ P ðÀ°ð`pP ðÀ °°Ððð   @€P€@PÐÿ`@€   °°° °°     ÀРÀ À  °ðÿàÿ 0°``@` À °  °00ÐðððÀðð°°°À€€   P0€`p  `  °à p€0Ðÿ`p€@P€€pp@ Ð€  €€€€ €€`0`ðÿp€ `@P €  °€€ p€ Ð  `€€Ð°°`€° € à°   €€   p€p€ °  ÀÀ p€  €p€°€°€€p€ €€€€ €€  p € €€€p€€€€€ °p€€p°  àà °° À ð°°   Ðð ð° °Àð àÀÐÀ°Àðàðà ÐÀ àÐÐÐ ÀÐðà À À°€pÀÐÀP ÿ@Pp ``€`p €À €€pP p PPðÿ`p€€€€€   °` p€€€€€p €€€€€ € p°°   °  `€€p€€pp`P@`P€€€€€€pp€°ðа€  €€€€p€€€`p€P0P@p€€€€€€€€ p ðÀð °ÀðÐÐÐððÀ°à À ð° ° °ÐÐðÀÐÀÀ ÐРР°ÐàÀÀÀ°À°` °  °°€À °° p  € €PPpp@€€ €p€€ €Àp€   €p°ÀÐÀРàÐà   °°°    €°€  À°p€€€ ` €p€€°°p  € p €   °°   p€ €pp`€0€€€p€€€€€pp€` À° °Ð° ÐàÀ° ÀÐÀ ààÀ° °À°À  ÐÀÐÀ €            €ÀÀ€€   €€€À  p  €°€€° °€  À   À    €€pp°€ p €  °€p€p€€P ppÀpP€p€p€€€€p€€`€pp€€p€€P€€€€€pp€€€€€ €p€   Ð° Ð À ÀР € À pp   p€€p   pp€° pp € À€ p p€€€€€€€€°°°p€€€°p€€€ `°°€ €    €€€€p€ P€€ pp`€°€€ €€€€€€€€€€€€€€€€p€€€p€€€€€ €€ `€€€p€`€€€p€€ ° €  €  Ð ° °À   p p °   °° àÀ À€€€p  €€€``€p€p€€€p°€p€€€p€€€€€€€€ppp p    €€€   ° °ÐаÀ°° °    °    ° €pp €€€€€` €€€€€€€€ p€€€€À€€p€€€pp€€€À€  €       °p° °°   €  € €   °€  € € €€€€ €p€€€€€p€€P0€€€p€€€€€ppp €€ €` €€À€€ €ppp€ p € °°€ p€ p€€ € °pа €€€€€€€€€`€€p€ € p €   ° €°°€ Ð€ € °€°p `    °  ÀÀ ° °°  °  À °  ° À Ðà° À    °€À À°`   €°p€       €€p€ €€   €€€ À°p  p€€€€€p€Àp°`   °°€€ € €€€€€€€€€€€€p€p€€€p p€ `p€€p€€€ €€ °€ p€ €€ €    €  €    ° p€  € pp €€€p€ €p  €€€p€@À€p€€p€€€€€€€€€`€p€À  €     €€ €€ €€€€€€€p€€€€p``p€p€€€ €€€€€€Ð°àp€`€p0 Ðà°Àà àÀ€°ÀÀ°а      ààà °°À €P€€ €€ €€  €``P€0`€ €€pP€PÀ`€p°€p€  p€°À Ð°Ð  €  ° À À°°ÀÐÀ À ÀðР   ° Ð°Ð    p° € ° p°€pP@P`0p@@0€À`ÐÿPPp€p`0€0 °p °€À €ð  Ð ÀðÀp€ pà€ °Ð à°°°€à°p@ÀÐÀ``À ° ÀÀ  àpРЀà00àÀ°ÀÀ Ðp  `€@À PðàPà`àЀ°`pÐ@ ÿ àÿ`ðÿÐÐÿ `€°àÿ° ÐÐÐÐðÿ0ÐP @ÿ ` À@ÀPÿ`pà€ð€@ @àÀ0P`ÀP 0à°À€ÀÐPðàpð°Pðþ€ à   0Pðp ðÐ`@ÐÿààÐð`ÿ`ÐüÐàþ€ 00ЀPP0ý °ü€`ý°ð ÿàðpÿ ` Pþÿ`ÿ@ÿý ýPþàý`ûü  Pþ@ Ðþ@Àý€`þ°PþÐÿÿà€ÿà ÿ P€ÿ ýPüp`þpý `ÿ0ÐÿPÐðÿðÿ@ÿà`Pð ÿ`ü0ø0ý àPPÿ@þ €þ  ý ÿ`°ü°þÀÐÿÀ€ ÿà@p0 ÿà`ü`ú °ù °û@ÿÐÐùðþÐÐù  àûpPþ`@ü0PÐÿPþàPý þ`°úÐ`ý ÐûP @üpý@° PþÀÀÿÀ0ü ûP@ àðü€àþÐÀù ðú ÿ ÿ€àÐúø`0ý€ ü û0@ûPÐþ@Pÿ€ð€Pàýð@ àðPýРüPÀРpp ý€ÐPðÿÀüà`à ÿ@ðpÀÿ`Ðýpðö ü€PùÀ  ýPþðÿpp0Àÿð°@ÿð`Àÿ@°þ`ÀÿÐú€ üÐà€ýààüp0ý@ àÿû0`þððÿàý €ýÿ°ü€ÿýÐРü Pþ0 Ðÿ`ÿþÐÿÀðÿà û€þ Ð 0PÐÀûðüpüàüÐþ@àÿð€û ý€ÀúàúðÀÿPpP@üÐÀ`@ÐpüP üÐPûÐþ ýàÿ°0° 0 àþø` ð@û@øÀùÀ€àýüÐ  P€ððûpø°€ý 0 а`ÿàÐÿP0ýÀû þàð þPÿÀþ€üpðþ ûÀõÐPüà0üP ú€@ÀP0P`ÿÀÀüPP@ðÐþÐýÿ€ Ðý`Ðü€€öpÀü €`üÀ úp`ôà põ ûÐÿÀþ €`üýPüðpüð@ð`û€ù`àüðÀÐ0Ðû`þ ûàPý  P€`þ ðÀP û°úÀ÷PPÀð ÐüP@÷öÀ`pÐ`üÐ@ö0þ€ÿàÀðö °ñPð€Àô €ùPà`ûPÀò€õÀ €ü°`üPÐpû€0€ø Àý°àðø€ý°àþp ÿÐ0P€û Ðþð þàP€Ðþ ø` Ðû@õÐÀ÷À€PøÐý°þð@ð@ü0ÀýÐÿ 0úP@ýðP ÐöPý0p `þPpþýþP@à÷àÿ p@ý€0ÿ@ùp°0Ðþðù@ þÐàPüàÿ€Pð@õ°ðþû@ ðÿø``ø@ ü 0ÐõPÐÀÿ@@Pö Ðÿ` üЀü00ÐÿÀÿÀøp0àýððÿpýÐ  ppþpÿÀPüÿPþ°ÿPPPpP°0ÐÐÿý@°°@À þ°`ÀP°€€þðÿÀÀ€pPþÐÿ °@ðÐÿÀþPÿ Ð` þ@ýÿàðPPÿ°þPÿÐpÐÐ@ÿ þðÿР° p@€p€`ÿ€ÿ° ``ÿ€ÀàÐ``0þÐýðþÿ€ðP@ÿÐÿÿþPÿ`P@þ ýÀþ`Àð`@@ 0P@0€`PÀ €Ð€°`P P°PÀ°P€ P`ÐðÐÐ`P ðÐÐÐÀppÀа `€ÀаÀÐÀ Pp ÿ0ÿÿ ÿPÿ€ÿ`ÿÐÿ€ÿ`ÿÐþPþÐý þþþ€þ€þ@þPþþàý€ý ý`þàþ€ÿÐÿ`ÿ`ÿ€ÿðÿPÿ ÿ`pP À°À€ à0`  À°p à °À0À   ÐÐð€`€PÿàþPþàþ€ÿpþÿ°þÀþ þÀþ°þþÿðÿÀÿ@Ðÿ`€`p`pÐÐ@Ð@ÀPà Ð à à ° 0 À  ° ° PÐ@  €P þ ýü@û úàøà÷Ð÷øàö÷öÀóóàò@òñóõ°õ ÷°øù ûþ€ÿÿàÿàÿÿÐÿÐÿàÿ@p`À`ððÐP ° @Р`  ÐР0 ð  àý°ùòíìPèàå`æPç ä èÐé°é ë0ï`ð°óÐöøúÐü@ÿà  ``@€p@ `   0 ` Pа €  Ð`Ð@ðÐР Ðûó°ñîÐè@êÐè`çPèêèëpììípï0ðpñõP÷ úPÿÐÐ ð Ð   P 0Ð p  pÐàpÐp` PÐ@Ð`0!Ð `ñè°èæ°èÐë`íë î€ïíÀî îðé@çðçÀäÀçðìóúð€ Ð Ð @à   ÀÐ@p @Pÿû`ú`ý  0@@p"Ð"°# #P @ø@épÛ@ÜÀá€æ@ó ûpþ€üÐü ñè àØÔ°ÖàÚ â°ïû PÀ ýðùüðÿ ÐppÀÀùí€é@î0û @€%à&àPà`"°/P: (ð ëÉp½pÇàâ0øP Àó æ`ÝݰåÐê@ëàæ`âàÞÐæó°€°À @÷àòÀöÐû    àà÷°ëã0èÐó` €! "#ð"   !`&$`+&`ïpØ ÎÙÐî€ÿp€ÿ õ éPáÐèàáá ×ÑΠÛ0ë ÿ° ÀÐ p `@àñ èó@ `!Ð/(àð@ö òø0÷àñÐî`ö€`@0P3Ð+P!@àP&À&P)`&ó°äÚPÙPìàøÀýPñ€îÐï óðîðpÕàËðǰÓPâô@øPûÀûÀà`0ÐðPó`øP`PPðpÀ 0ý íèPìðôýÐ `@)** )°( &ð 0Ð!Ðê@æ€ÝÀÞ€ì°ùÐõ`ï ñÐû@ò éðáÀÊÐÀÖàåç@ðPôPÿ` ð° Ð@Ðø@ûàø`ü àpÐPP PÿP÷òÐï@ï0÷ÐÿÀ &*À,@,`*À'p$Àð'à&Pä@àÐß`ã0åpðîPîPü° P÷ðÞ°ß0Ó@ÙðØÐÜ Ô çÐû0 P à ÀÐûÐÝð`àÐ À%`(`à÷ôóÐðí@ê€ô "à)(*Ð50Ð*Ð@0°Ø Ù0ã°èÐÝ0ìÐè€þ0ÐpèÐÚàç@ÜàÖ0ÉÖ@ÚÐõ`þ ÿ€ÿ`@  õpõ0ú0ú0ù À@P0 àýï`éÀëÀôÐýà `&`+À-0à/à+' ) /@ÙÐ߀æpîðËàÞíPû@àÐó@ß öâ€Í ÈÙPà€è@ò€øp€p p0ú`ðñpù÷À `ð!Pð ôê çîPø °` Ð*€1P/à*)€)@ð9`äðß°éôÀÈPÕ@ðPöàûP÷æú`ä ÊðÌPÜ@áà`í€÷ à €P€ÐúPñpðü õÐÿÐ Ð"  ÐõPê æ€ï0÷ýÐ Ð!À'(à-ð0P) !Ð`%à@°æ0á@íP÷ ÉðÏðìöà°ø`õÀì0àåÐɰΠÜpã€Þ@ê ö° Ð `PàÀú0ïàð ý õ ý€Ð%pP@ P øðëã`ïP÷þ àP)00@2.°!À"À-€;@Úæ@ìòpàÔÐêPû €õ@òð ÿÐÝàÈÀÍÚ€ãÐß@ê ÷à 0Pú í îüpø@þÐ ÐÐ%`À` ÷€éàãàíÀø€þ0 Ð"ð,*`2.à("0€.`5Àá äÀì ñàÌ Ü°æ€ýÀPøîPêÀûÐ߀ÏËPØÐç êàì ö PP ïÐëðùÀþ `#@PÐÐøÀìç î ùP *.°/,P'€ÐÀ'?Ðí ßê ïÛ0Ö ä0í ÿ€ð`â@òè0ÙÐËÀËàâ ñPóó€€PÀÐÀÀðõàðpïPú€ðp@P`úòÀïì îÀñý€ `Ð(ð%Ð,+Ð-Ð#Àp 5P+`àÐä€ß€êðã0æÜPñ PïÜ á߀å@Õ0аÚôp0ðа  àüÐð€ú ûý@Àð` ° û`ôï°íïP÷  Ð%p'*Ð)(ð"°°3€!pê°æpØÐâê@ò@è0ç÷Pû@ìPàðÒPÛpàðè@âÐè`ñ`ÿp 0Ð  P€ðpÀú@õøÀp` Ð PðЀü õ°õ`û°Ð€ а Ð P € 0ðpðð À`þ0Ðù€î@ãéPâ0æ éëåáæ@éì óÐ÷pòàô`ö üPÿ  àÀ `@ P ð àpÐð €° ð  Ð@à$` p€ÿû@ÿÐô`èpàæÐÛæé°ë@â0äÐåé`ì`øPø€ô°÷@÷ÀûÐþ à ð Ð @ð€ Ð àÀàÀÀ°`þÐýpà`  @@°$P@`0 Àþúàîá0è`ÛåÀéPìPå`äåàæÐéÐóÀúô÷ÐõøðùÐ@ 0 à °`p€ ÀP€ÐpþýðP  00PP&€Ð ðPPÿðú€í â å°Þ åpêàì èðäã@épìòàúÐø€öÐõ€øpû°@Ð ° €  ð @À° ð  ðàþÀÿàý ÿ@Ð@À @ ð Ð" Ð Pý €ÿ ù€ôéâ0ß@âpå@ìéðê°æàæÐç°ï€ñ ù ùPúúÐû@ûÀp 0 @ à à ð P à P àp`üþ@ÿ À€ppà à P 0€Ðàð€ P`ÿ ôðéÐåpäéàåÀéÐä ç çí î`öÐóö ô°öÀøÿ ÿPð@P À€@ ð P à @ €° ÐPÐp @ à°pP`` 0 pü ö0ñìpå æàåàäpæÀäpæéÐí ð`õóPõÐôÐ÷ ù`ÿpÿ@ÐÐ`ð  ° P ð ð Ð °Pàðÿ` Ð`°ð À à0°à `@ Ðý°÷óîçpææ°ã°ä€äÐåpèí€ïàôõàöÀö0úàúÿÿ€À ° ° p Ð @ P  ð€ðÀ@pÀpÐÐpð Ð   ` €P0Àà0@Ðù÷PñÐë°ççÐâ€ã`âàã`å€ë ì€òÐóÐö0÷ ûüðÿ 0 `   à À P à ` p `P @pÿ@ÐP0p ` p  À @°ÀÐP °Ð úÀøöò`ëPéPã ãàã æÐåðè`èìàï öÀø°üpüàþPàP € ` @ P ° 0 Ð Ðp €ðPÐà€ÐÀРPЀР°@ À 0 ``0 € ð `ÀüúöPòïðì`éPèçÀæ çðê`ìÀï ò0õ ÷0ûÀýðÿÐPÀ    À `   °   `  ÀÐ pð  ÿpÿ€ € Ðp0ÐÐð`0 ÀÐp ÿ üú÷`õ óò€ñÐðpð@ððàñ ó õðö€ù@ûPýÿàÿP` °   P ° p  `à€à pPР €  Àà ð€ð@ÐPÐÐðÀ ðàÀÿPþðü ûù`øP÷ööàõ@ö`ö ÷°÷pøù úû0üàý`ÿ €0 à Ð à    À À  °  Ðà `À P@``€à °0ÀðÀ ÿ°ýýüàúúû þÀô ï`ó€ó ðÐòÀõ úà @  p ° ° ЀÀúý0ý°÷Ðü`p  °à  À ÐÀ pàp`Ð ý àþ p PÐ ÀÀ€ ÀÀõðóPì âðããPã€í ñÐðö€þàP Ð ð Ð ðÿú û@þÀø@ñ0ñì ñ@ûPû€þPÐ ð0à @ °ðÀ@P€°   `0@ `0ÐÐ +@Ð0ðæPèèàÙPËÍÏ€Ú°êò@ð@ûà P€ð   €ðüïçëPï`î@òóÐ÷0ÿàÐ à ° àðp ðÐpÿÀÐþàû`þ`0 Ð0Ѐ` P `pà-` €ÿíÝpá`âÑ ÅÌpØÐåú€üà÷`@ °ààÿô0ê à0Þ ì°ð0ñ öý`Àð@Ð € ý`÷Àù úýþ€üý  Ð PÐààÐ@À° P €#0@þ`ñ€àÐÛPâ€Ü°ËÐÐÚàæöppü0ðЀý @ýòðì€åÐáë÷ öàûÀ P à 0@`0ù ñôÐù`ý  `àp@`àЀ  À Ð °Pÿðêã Þè×Ð ×Pß0íÐý€`ýP °`Pàý0ù`òìÐäpæ€ð ù@úðÿ ° €ÐÐ0 À üýðùõ0ñ€ñúàPpP€€@ P ð€0  Ð   `Ð  öÀæâ âÐàÐÐPÕØ0ä€ó€þàþPp @€°ð  0ÿ€üöàóÀéæÐê ò÷þ@ðp & À ÿ÷àù€î ôíÐÿ0à ð`@ P ð€ € `0° À   0 p p ` PP ï`ãÞÐäÐÙ@ÔÖ`Ùðå@÷ÿðþ À `ðààÀ€þÐ÷@÷Ðôëpèðë ðP÷PÐÐ €P  À ù€ú ÷ ôPòú0ÿ À 0 Ð @ °ðP p ° ÐP ` P Ðð@ Ð  €  pýíèÐâ0åÜ0ÝÛÐß0é@ó ù°þаð Ð p àðüýpøÀô@òPñ òpöàü€þ° ð pÐ `p°pý@üýð   p ð p  À P @ ð @ ÐP à ôpïêÐìPç`åÐäãèî`ôðöûüpþ  pÐ0ð@Ðÿ0ÿàýPÿ @PPpÀàþ€þý`ÿ PPððÀ0Pà€@p0PàР`€Àðp  àýù õÐôðóÐð ñ0ï ï@ñò ó0õ@ö€öøàûÀý€0ð€À€ðÀÀЀ Ð° Ðÿ þÐü°ý þÀ PÐ0PàpÀÐ0°@@@0 À`À€ÀPP0 ðúùöPõòñpî°ìàíÀîÐðàñ0ô`õ`÷°û€þÀ ðpP°ðPP°àPÀP` p Pþ€þÀÿPÿ° àà0p 0À@ðààаàPÀ` @°ðPøpöÐòÀñ€í°ìàé@è êàë€ï@ó÷`ùÀüÐ`°0  0 À° €`ÐÀ P`pÀ°àý°ûPú ü0pPPpðÐÐP`   p €   p Ð p@ PöÐãàÝðÙ@ݰÔàÛPÖPÞðëúðÀ pP ðð  0@ôPëðê0éàëPñPï÷PýP` `à p ö`î`ßÀÛ0ä0çúàÐР!ð!p0 €@ú`ø`øp@P € p@@`€à€,ð€ðÐÄ ÂÀ½ ÓÀÇ ÛÛ@è°p*€'à" Ðpðð æpÕÐÉPÌá`íÐý à&À.0%€ °ùàùëéÐãPà0âÐþð€À° àðð 0 PûàüPÿPýPàüÀ@àPPP À €€ ñ0í É°ÄÐËPà€Ý çø ô` ðÀ€îÐêÀíÜ€Úp×Úpíp° !ÐðÐüóÀâíðÐõ`ûÀ` Pà` ÿ Pp00 ÀÐ@  À ` @ à ` Ð! pì0å¾`ÊàÎpè ÚøÐþÀ `* #P@ú°ßä`Ü Ð@Ûâàñ@ Ðà  Ð 0ÿðï á@äPäý€ P   úøù@ü € @ À  àÀð 0 °à€€  p`   'ð èpã°º°ÊPÐÐèÀ×õ@@4Ð!pûõàÞðÞðÔ€ÈÞàó@@"0°Àpü å ÛàÝðí ùP 0&ÐàPð çêàîúðÿ Ð   `pùøø0ÿPÀàÀ ðð  °0 p€<ñë0À`¼@Óä°áàà 08p-p õÀïpáØÐÖÅØÀýÀ$€$À0PíÝ Ò ßÀóð° )@À-$@ `ç°ÓÍÀÖöýÐp(010+àý0ë°êÐéôÐ !P,%0@@p°@€À8 /°åÀä­ÌÑPäpÑöPÐ&CpÐíÐëP×PÑÆÇ`ïÐ "p) !@0PëÀÚPÎPÙíðà àÐ1 ,@* ÐóíØÐÏÀÌç€@$ 3+ $Ð@°ôðå`ÞPîа"Ð#!$@àð ðøÐÐÀ3àIæáP³PÄ ÐÝÑÀà",G$àpê@íàÛÆð¿pÃÐé`Ð&0)€ !@Ð  ç0ÎÀÈÀÙ`ñ@0ð, 0À' °ï ã áÖ Öæû0@.Ð)ÐPPÀù ìpä@ìÐþ@  !°@p@€4@ðãàбðÄÀÒðèÖÀíð!*àB0þ0áÐæØ Ê€ÈÏ0ôà,p*0 €á ÏPÍPáðù@  P0P<€ð°ä0¿àÍ@Ö°æà 2À6€3Pàö@ê`ßpìàô@€°Ð"P` Ð @ЀÀ  7€f ðpÛP¯@²Ípß Ñ Ô & 5€O@0 ß å@ÝÐÀмÐÁç0 Ð60`! p€`âÀÃ@ÀÀÚÀø  P!004À$`Pä°Ò0Ý@èàå@çÐ`-,PP þÀþðõ`îððPý°@@ ÀPÀà   pý Y PáPÄ­ðÓäå ÓpÐ$?`3Pðݰá àÐ̀ʀËãð 1Ð, PÐ ðÀíPÏÐÉ€Üà÷` €ð # 5Ð+ @èÐ×P¼àØ`èðñà'€4@1@"Àÿìê`å0ñÀý P° ðPà  Ð  ÐP Ð(Pàì@Û`ÏÎPÝ ý P5p6P$` àðÐêPåðìý@ 'ð,$ 0`@@$ðL °ó ¾@›PÆpà ó`÷Pp) ?1ÿàp½Ðàװáðæ@ð°0#À;P:€`û@æ@ÚÐâPã äè@þPP87- Pî ×p΀ϠÝø€Ð,8/P€ë`ä ç ôàÿ "p&`%   @@ À€ ED þðîàž°Á ßópý P9F`Àö`Í€¯Á0ÓÐäàì3ÐCÐ4  ïàÒ`ÑÀÙPãpéøP`2Ð9P<Pøðá ÌɰÕàè % 9°6€%° ÐîÐåàäÐíàü P'p)`0`P€ þpp,UÀ€à²à“·Ùõû  €+B.Àpܱ¸PÎå`ïP @$@=Ð9àPü × Ì×@äPïÐúÐ @Ð43'P @ë Î`ÉÑæ`P€- 1p)€`ûêPãÀêù Ð!Ð$@€À ð°PÀÿ€ÐM "` Óà‘@«`Ç`íàûÐ@ð:1ÐñP¼`°Â€Ø îpà3 6Ð,À ÐäàʰÎ`Ø€ì`ü   +/à-ðàðÐÑÇ€ÏÐèÐ0)0+ 'À0pëá€é0ùÀ à0#ÀÀ`P p @À0 #`JP ¼P`¶ Ô0òPÿà@`+°7Ð)Pâ¹à¹ È°Ý€ôÀPp"00P4 'à@Ñ`ÐàÛÀð üP` %, )° @æÔðÉÀÙù` `€$À  Pþàìàè°ï€À PðÀ0 ÿ @E+ â—`¬ Á@êùPÿÀ04Ð.0)€pÉÀ·`¿ÐÏ`ë þ°û°`$P1p7 !`ùÜðРÐÐèô€ý  0à)'ÀùPåÐÙ ä@øÐ@ ÀP  úÀòPöà PP €€À À  ` ;`!Pà ¦² ÆPç÷  € P-`*%ðÔ Â`ÅðÏ€ç0ùàøPÀ€.°3@$0 éðÙ0ØÀçîùÀà "0pÐôÀçð ÷ ü@ @ 0p @ðúÐû°0 ðàpР@ Ð ðPÐ7`ÐÆÀ¬P»PÔ@ê°þþPÐ&@*À0ø ÔPÌÐÌØí°ìöÐ P/P3Ð`@ôâÀæ°ë°é€îõ@P€  °þÿ ýÐûû@@  à p @PÐð ÀàÀ0 à pÐ à) 0 ç¹P¾pËÀàíþÐö`ð"à'0 óÀà Úà×°á çã€ò0 (p+°0@`ùàù`ïpå ä æÐïð@à°@àpÐðþ@ûö0úÿPP` °`@€°P  à° Ð Ð"  ý ßÐİÉÕ â êÐöàò !ü°ï êåàæäpÞàèÐõ€°€ðð@Ð  `ñ@ê@áÐâ ì@óþ  @@Ðàð 0üðúÀø@üà`  € °ÀÀ ÐPÿ0ò ÓàËÐÎÜ@ßê íò°ÐÐÀÿÐù@ðàîÐäpÞã ëö ð` 0 pPÐð@ôÐëê`çç0ñÐù0pÀP0° `À@ ÐÐ Ð p Ð`@@p ðéPÝà× ÝÜÐ݀߀ÞÐìpûÐp€    @ÐôPïÐíïò@õóÀöü €P °ü@û@øðõõp÷ ùÀ€Àp à   € À 0   €   €ÀàP  Ppó ï í í êpêÀåPç í óPøÐüüýЀ0°À@0@ÿüPýþÿ`P °Ð `0P@  €P@p0Pà Pà €€P À°à0   pPöóð€ð ìë çÀæì ñõÐù€ûüðð@Àð`P  Pÿ û üÐýþ ðÿPÿÐP`0@@ pЀ``Ðà€€ð ` ð @ 0P`À     pÐà0õÐíê`ê åÐããÀàÐêó€ùÿ0À°`À ` ð °þ ü ù€öpôÀï óPøPü@p@ðÀþÀý€ÿ ÷û@øPý@0Ð` €À ° P P ð ÐÐ   €€ à €  P€pìã ßÀã ÜÛÝ`ÞÐñ ÿà P   °°` @ùàð ñ`ñàë@êàì ï°ýP ðP€@ p`õpï0ðÐï€íðð€÷0€ `ðÐ@P@à ðÀ  À!Ð 0êPÚðÖàÛpÖÀÓ`ÜÝÐõ€ À0° @ÐøðPåèé°æ0äïÀö @@`ð&P À@øìÀ߀è`äÀÝpï ñ  À  ðàÐp ` Àð0p%à ù@ààÑ`× Ù ÐͰØ`æ þàÀÀðÿÐë@èPææ ä@á â ò` ð°€ àðÐü°îç@äÐàã`ìàú ààPà °  ÿPþ ý° À Ðаpp@%pð@ààÒÑàÕ€Ö ÏÖpðÀÿ  ° `pÀ pûïÀæäðæàäPá0æ õÀÐÐÀÀààùíàååpèÐè0ðþ 0À°ð°ÐððÐÐ@ ð à ððÀÀ°p°@í0ÛP×ÀØÕÖ`ØÐÙÐé Р P  ÐÐðPèpè€ë€èâàæÐò°ÿð p @Ð@ ýïàëÀé@ëPíñPù`ð ` pà° €@pÀP€`   À`p`ÐPð€Õ`ÔPàÐÜ ÒðÑÛ`ëPûP0ð° @`ð ð@ëìîàèã°æ`íÐøÐp`À@Ðô@ìÀë@îPîíPòÐý ðàÐP€ PÀþð @ Р  €``€p @P° îÐÑá åÙÏ×àîÐÿ Ð@€ðPP 0ùàçÀãí ò°íæPéàøPàp  @ðPûîPè0íòôPõðú°pP pÐ p ð °ýP °€ PPÀ PÀ ÀP@PãPÑàØäPâàÕÀÎÐÜ@ó  €  ð@0` @ÿí@äàå`îò€ìpêàò@` P @Ð@ `ôpëèÀëò÷Pû à @ p ð € 0PðPà  à € àð @Ààp @0â аÓpáæÐÚ Ò Ú ðPà à à PP àà`Pôç°áàèòö òPñPûp  àð ð€úñ°êðèî€÷ÀÿÀ °Ð@ P°@à@ € P P  ° à °@àPPç€ÒàÑßàé åÀÚðØ å€û @`0 ð ððÐþð äãë`ö°úPø ö@ý@ °À `€úPóàì éPîðø € ° `` àp °0p`0`   à P P  P0 ÀÀùÞ@ÑÐÕã€èàâÜÐÞ0îÿ@   Ð 0Ðüñàå@â€êõ`üü ûÿðÐp€° 0°õ0ëíÐñ0óñ€ñPúÀ@`@Ѐ  Ð ° 0@  P Ð P 0 €Ð°PüPà ÐpÔ@ãàì€èÀÞPÜàè üp @°PP 0`à@ùÀìPãðäPïü€ÿþà` pðàðPàì@æ°épôø€÷@÷ýPÐ À ð`P€ À àP`p` p à 0 p ð  @€`Ð0ê@×`Ó0ÝÐé°îðéãPåÀð@ À°@À0 ÿÀÿ0þp÷@í0æPç°ðüðÐp° €Pà`ýpó°îàð÷PûÀüÀýp€pÀ°ð p ° Ð€ ` ° 0 °ÐP ððÜÖ Û@æí@ì@èpè@ð€üP°p0  0@ý ý€þüõ í@é@í€ö ÿ P€ 0 `0P ÷Pòó ÷üpÿ0@À° à P P ààP ` àÐ Ð  ÀP ÿ°éÚP×àë@ð°í éÐéòÐý Ð ð À0üÀûÀýý`øàðÐë@íõ þð€ @ à ð Ð °à ÿ ù ö°õ@øpü0`ð @ ° €  € `Pð€ð  ðà°À ` ð0 `ôPã€ÙpÛàäÐî ò î€ë0íÀõP p`ð àþðúpûàüüøðñíïöÿ° À ð°À àöPïïòp÷ðüà p  0 €Ð   PÀÀ  À° Ð @àðôá ×0Ú åð óPïÐêÐêòPýð`ðЀ @þPú@ûþÀÿ ü@õÐîàì°ñðúp   à € @ à ÀPû ôñ ò€øÐÿ P    p ` à ð p€À 0 ` 0à Ð@ @À@ Àü°èÀÙ× ß€ë ôÐôÐððíð@÷ðÿ@ ð° 0ÀPúà÷ ùpý0ÿ û@õàïï€õPþ€€ ` ` @ P€À üó ï ï òPøÐþ Ð € 0 @ €  P  ð@@ Ð € €ÐP°À À€À°àëÀÙ Ô€ÛÐèpòàò`íàèÐêÐópÿP Ðà  P@üðøúþÀÿ0ü`ôPí0ìðñPüÐÀ ° p à@  À0Àþø`óñ0òÀ÷`ÿ@ ` À ð Ð ° ppð0 @ P ð p P@Àþ0çÀÕPÒ Û°éóÐò@í é0íPøPÀpà€`0àùà÷àùýðü ÷ðàêí°öÀ° À° p p°@ p ÿ ö ðàîàñPø ÿ° Ð 0Àà  ÐPà€À0 €  @  ° @` àø ÝÌ@ͰÜàíÀôï æPå€ð€0@PÐðÐ@üà÷ÐöPøùÐôíPæÀçó  àÀ@ P pP€ÿ€æÚ Ü êpù    àà`Ѐüÿp À p pP 0 `Ѐ °ïPÏP ̀â`ðPîPãPà@ìð@P@  þ õñ òópîåàÐåP÷@ PÀÐ à p0 `öàäݰݰå€î°ö`þ€p #P ` P°ý0úÐùû P 0 p À @°ÀÐ@&ð°`Ô ·€¶@Ëã€ìPêPéÐóÀ0&*P$Ðàÿ0é ÞÐáPè@çÞ0ÙpáÀ÷À !€"!ððð ÿü ôÐçÐÜàÚPä0õ€ À!€ ðÀ ððö`ð0îàïàö€ @À€pÐP àÀà àÀðä½±ð¿ÐÛ`òþp  P €#°p`åÏÐÌ€Ô ÞêÀõPÿ€00) *@  ÷€êäÐãê ôý€0Ðà ÀøÐø°øPø€ü`À  € ÐÿPþà€Ð P €à PÐ`` "À" pݼж0¾Õ`ö ÐÀ@€ðïÓ0ÀPÅÛàõ€€  P @óâPÙpÙåðú@ p%`%ðp €÷ðä@×ÐÕ âÐúа!)`'  üð°è0éÐô ð@!À'Ð$ð€  þàûÐ  (@( Ðä À ®¬PÎ@ü "Ð$°Ð0ð×°ÅPÁËpæ€ ) 1 .`Ð €øïåÀÛ Û€ãóà" 21Ð'ðàæÈð½ Û@@,>Ð=p3 ù ãÜ Ú éÐ$À)(ЀPÿ@ûðþÐ`p @@=P-° É œ`‰ð£`ïP$ÐD€H€/  óPñã@ÔpÈ¿ÅÀåPÐ>Lð@`îÐÑ€ÌÏ Ýñàþ     1À4À,ðôÀÖPË€Ó@ápû "€ €ÀôPîÐíàø@à  P°ø@ù p À&€Ððû€øúÀ&à>0!0ùÂ@ž“ ºPûP$€CP?$Ðòàç ×ÐÒ€Ë˰ÚÐ)0>pB (àÿ0ÚðÉ€ÊÐÙPôp  Ð' %@ 0õá Üå ð`€Ð°°ùûüÐ P€ €°ù ô`ø°þà€@ Pû@ø ý€à@0/Ð8`ðâ`«Ž ‘àÌ 0A@Z EаêpØÀÈ@ÆÏ@Ó0ßPûÐ"`;D@5`  Û¾à»PÌ ï@`& .P,P! PîÝ× ÞÐópP;08 +pú€Ò ¿`ðò  8ð@°.°°ñÐÜ ÒßPöP@(À0Ð)€þ€íñP`p  À&E°ì «`… ‹Ê€ðJa @ð °Ù€ÍÀÌàÏÐÝðÜ â0ù€p:ÀB 2ð0Ð0·» Õþ0$Ð/à-°!pÀ÷@ë€ß@Þé0ÿ°€0@54ЀîPº ²0ÁPè .@IUP5`à ÅàÎä #3.P@Pïàè`ïÀ (P+À ÷àô üÀÐA$ðñÀ¼‘•Å€`? O8@`Ü@ÐØ ×pä@åÀæpø€1 4@&PÿpÔPÂàÊ åð & + "0ú ô°î`é€íÀø0 `( #Ð ðÓÀÉÕàÀ:`C+æÑpß ùð @ !0àðÿðô`öÐ0Ð 0ðÐà Ð `À ð:à éà¯`•žÀá+€GÐZP-ðöPÉÐÀPÁ@ÒÐí ô`P*Ð+"€Ø ÂPÅÝ@p+ 8À.`°î€è éðìöPàP#À ùàåàÀö  ÿàÿùðÿÐ`Ð €õ öûÀÀ @ °€0@ À€à À°Ð @°þð03@ß `©@ûÐ7SÐO@Pß¿@Ã`ËåöøÐPP'@(@ðø€ÑàÃ@Îàì @3À5`$ Põ éêïÐõ`þP@ 0°0ò åðä÷ðÐÀ€ü@ê÷ 0° @ö€øÿ€ÀP 0 ÀÐÐ0PPÐÐ` à p 0 €ð2 €ã½ ž°¬àÙ +?ðJÀ,óÐË`½ Ê ÔPòÀÿ ° !€# p`á ËÐÏ æÀ€&€4+ðPþ°ìðæíPöPÿP°°@ à ÷àêÐæ°î þ@,``ù åÕ0è°@°$`ðò`ì€ópûà@€ À РPÀÀà €  ð °Ðà @#@.Þ ­`žÀ¯ó@40GPFPå0Â`à рâ@ûPÀ àp! @ù ÛÀ̰װô`-€2Ð!°àõëë`óý€  @0 °ó@êë ôP !Ð)°På ÕÎÐïð.-P`Àè€åò0þ€ ð  ÿpüpþÀ0 à @ Pðð pÐ pðÿpûàúp@.à@ì Á@§€­Àâ !€?°>p! ò@Í`È×çøÀà@ ÐP êÐÖ@×píÐ Ð!@,ð#À `úàï0îpóðü@à   p@ú°ï ìpó ÿ pP@0ç@ÖÜ@ïp.`+Ð0 ë€åàéàü 0 ÀýÀûÀ0ð  P€p  à 0þÐûpúÐ` &À@ï0Ì´º°åpÐ.@1P úÝÀ×ÐÞ@æñûp ÐÐ0€íÝPÜpî`à $ ÐÐþõàòÀô€ú@P @p  ý`óï`ôþÐp ð@ÿúPý€`úì@ì€ðà` "pó@êPíÀú€  ðÿÐú€ýðÿð ` P@Pþ ÿ € @0ý€ú û€0ð°°â€Æ0¾€Í€ôà000*ððöààÚÀÞ@ê€õ@þÀ@àPp û çPà`æ`ù àÐ ÐÐPü ô0ó ÷ ýpÀ p@° PúÀóPó€ø@    €@þðùÐøûÐ ÀÿõÀò0ú ÿP P@ùù úÀÿ@p@@ÿ€ÿPÀPÀàÐÀpÐp ° Рýðø@úàÀà àð ùpâ°ÖÕ0å ûÐÀ$@@àî àÝàåÐõP  à°P `ø€ï0ìôÀP ð`úP÷ùÀü ° Ð ` `` ú`ø@ùý@P À Ð PÀýû€û ý` pPà ÐàïÀèPñ ð  ùîpñû  `@€þÿà  àP0p€ À 0@°0Pþ0úðüÀ°Ð `üPôÀó€ò°íëÐð ú€P€  û0ï°ëï ôüà àPÀþPú°ùüÐÿ@ P Ð  P0ÿ°ýÐý0€PP Àð`0ÿpý@ý`þÐ0`ÀÀÐÿ€þ@ÿ°ð@ ÀÐýÀô@ðÐö°P `` @û€öÐø ýP@ÀàÐþÀþÐ` ° @ý@þ à`° ÿ@úÐú°þ` Ð ° øô@ø€ øpèç°ñÀý  þpòÀòúPÿý ú û€ÿ   p÷Ðö0ý°ÐЀ@`ð@ýÀýÐààðÀPÐÿÀ@ €ÐàP pðòÐòàý0 ð  €€Püþðý`õpø€Ð   þõÐï`ò0ûÐ0 `  Àú`ùüðþàððÀ`° `pðà°àÿ`ÿðÿÀÀ  þüÀúÐüÿ0Àÿ€þÐú€öpö`ü@€Ðù0öðö ù0üþ@ÿ`þþPðÿÀü°ûPý@p```° P0 P@P0 à`à° Àð°PP@ €pЀÐ@à  ÀþPý@þÀà à`À`ÿàà    ° Ðà°Ð€Ðàÿàþàþ ÀÀ°À ÿðþ@þàý°ýþPþÐÿ@€pÿ þ0þÿðÿðÿpàÿ@ÿ°þ þ€ÿÀÿðÿpÿÐÿ0` ÐÿÐÿÐÿ @Ðÿ`€`P``€p pp€ð`€p Pà `ÀÀÐp€`Ѐ ðPаp°ÐðÐÀÀÐàÐа ° °° €@@ÀР€ @ p `PPРp   0€@p@`€` PP@PpP€ pP`p€€€€€€€€   € €  ° p°    °°°À °°° À °°°°° °°°Ð À°°°  °     €  ° €€p`€ €€€€€° €€° €  €€€ €€€€ €€€€p€`€€€€°€€p€ p€p€   € €€€€pp€€€€p €€€€€€€`€€°€  `€  €p€`€°Àpp€°p         ° °   € € °€€ €€ €€€€€€€€ p p p €°€€€€€p€€€p   €€  €p€€p €p€€    p€ €€ €€   €€€€ €p€€€€€€€€€€€€€€€€€€€ €€€€€€€€€€€ €€€  €€            °À  °  °À°À      ° €  €p €€€p €€€€€€€` ° €p€€€€€€€p€ € €     €€€€    €   €€€€p€p€€€€€€p€p €€€€p€ €Ààü@ù ýÐðÀ Ð ÿ`à€Ðÿ`ÿ°À€ÿ@à°PP PÀ pÐÿP Ðàÿ€   À€ €p€€p°а  €°Ð` `€ÿ °à p€°€ `àÿ °° Ðð`€P  €°à€ðÿ Ðp€ €€° €P€P0 €P€Ð  ÀÀ   ÀР ° ÀÀ À    `€€ p€€pp`@€€€ €€0P€   p€  p €€àÿ€€€€p€€€€€€ € ÐÐpP `@` PP€ `p€ €P `pp €€€€€p €ðаР€ 0°  Р€ À`°Ð à€€Ààà ÀÀà  °  ° Ðp €@ `€ °€€p€€€€°€   € €€€€`€€p€€°   `  p €   à  €€ Ð€€ À  À    °  Ð À € € €pPЀ€€€p  p€ €€€ €€€€€À€€ €   Ð°à°      À€À p   € °   À   À€ °Ð €  ° €  €€PP  ` P€°   €  €€ p   €€À €° °€    Àà   Ð``° ð€°ÐÀ`  €°°p€€€€  °°  p€€€ @Pp €`€€€€ € €€€€`àÿP` €€p€p€° ÀР°ÀààÐðР  À  °°    À Ð €€€€  °°Ð Ð  € €p`0P  €° € °€€p p `P  €€€€€ €€€€€ €€ €°€€   €€  €°°À°  €   °   €€€ €Pp  p`€€   p€€€€€@€p`@Ppp€€`pPP  €`€€ €p€ €p€p€p€€€p €€€p€€€€ ÀÀàÐÀ   €   À°Ð       °   € p€  €À ÐðÀ  €€€ €€@P0pP€€€€ €€ p   €`€€p€€€€€ Pp€Àà0`€€°  €€€€€€€ `€€€€€€p€€€€p€€€€pp€€€p€`€€€`€€€€p €€€€€€`€pp€€p€€€€pp  €€€€   € €€€ € p€€€€p €€p€`€ pp€€€€€p€€€€€€ €€p€€p€€€ €  p€€p€ppp € €€€p`€p€pp€€€€€p€€`€€€p€€€p€€€€€pp` €€€€p €p€€p€€€€€€€€€ €€€ € °°Ð°   €p€p€€p€€€pp€€p€p€€€€€°€€p €  €€€€ p  °     °       À €€ €€€€€€€€ €€€€€€€€€€p€€€€`€€ € €€€€€pp`p° pp€ € € p      °   °   €° `p€€€ p€p €€€ p€€€€€€€p€€p€€€p€€€€€pp€€€€€p€€€€€p€€°p€°€ €€   p   €€p  €   €pp€ p€€€p€€ €pp€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€€``€€€€€€€€€€€€€€pp€€€€€€€€€ €€À °°°°à°°Ðà À °ÀÀÀ°À À°   ÀÀ °           °€ €  €€€€€pp€€Pp€€€€€€ € €€€€ € pp°€  p°   `°à°°    ° °°  À°À  Ð °Ð° °Ð °°° €    °€€p € `€@ppp`P`PP €€€`€€P€€pp€€€À€€°€€€€€€ €€€€€€p°°À`€€€€ p€€°€€        À  ° ° ° °  €p p € °    pp p €€     °À ° À p€€ €  ° À°ÐÐÐа° À€p€pàÿðÿÐÿ @@  à0  PàЀ@ðÿÐÿ ÿ@ÿ°þ`þ`þ þ€þPþ°þÿ ÿÐÿ0`pà ð€ÐPà0P  à°à€ðþÐýüPû@ú ù`ù€ùàù`ú@û`ü ýÐþ À    € `   € °àð@þ€ûPù ö@õ ô°óPô`õÀöÐøÀúÐü`þ€ð€€ Ð  €0  € @P@ þÀûàøÐöPõô€ô ô õ÷`ø0úÐü0þP0PаPP0 € ° @ àÀ0ðÿþ°û€ùPøÐöÐö`÷`÷Pøpùú€û ü þÿ@`ðp°p   ð ` P  @p`°ÿPýú0÷Ðõ ô@ôõõ÷0ø°ù°û ý þP°  P ` À ° P 0 ÐàP°pÿPýàùà÷°ö`õö@ö ÷ÀøPù ûÀüÐýP0ЀÐ@ÀP   àà P  ÐÿÀüÀøpöpõôõõ@öð÷°øÐú`üý а°p ÐÀ@ ð    ` €°p`þü€ø@öõPóPôôõ÷à÷ú üý`ÿ@`À  àpàÀ° @ Ð À °   Ð0ýðúðöpõ ó ò°óÀó@õ÷Ð÷€ú0üý  `ÀPPðàP€ Pà @    0ð€ýðú÷Ðõ0ôPó`ôàô@ö øÐøûÐü þ 0РP`À    Ѐ  Ð ðÿ ü`ùöÀô@ó`òôàôö0ø ùû`ýÀþ0Àp`` ààÀà @ P0` € Ðp @þ@ûà÷ÀôÀó ò0ò óðôÐöø ú`ü€þÀÿ0`@€@ °ðà À  À  p ÿ ü€øPö@øõô°ôðú@ýÀôÀöðòò øõÐÿp0`À @PР2 ÐÐÐþÀä°ÞÀâÐåpéPêô P @ @€ €þ0ü úpô€îïõpû°úýàÀp pÐ`/P@ÀÐpû`íÖàÑàâàëð`÷ð€àð€þÐ÷ñ`ôúÐ÷ùpü`àÐà Ðp7 8 pø`ëPâpÑ`Ð é ñÿ    ÐÀû`÷À÷ö ï öû°ý P€°þÀ0P*@G+P@àîàäàÓðÈðá@ôÀà€Pàðöpñ0ó0õÐíàó`ý€° € @Ðþ €€@ÀDp% õâpØpÊÊ€ì`ú` ÐÀ P@àý°ñpìÀð öÐïÐô°þ`À 0  ÿPü€Ð ÐJ`DP%ÐðàÛ°ÖPÁ0ÎP0ÀÀ Ðõ`êæÀîóÀðÐöÀ@ °  ÿ@þ`þ€ý0àP"Q`FP& ý çPÚÔÀ¿PËÀîP°°ÐÐ @öÐãàãìó€ô°÷° P Pàÿ üùPúP€P `N@L°-äàÔÀÒð¾É0ê 0 Ð` °û@é€Û°äó€õüðÿà@ ù`ôøPÿ PÀCb°>pçɠЀ€Á Ýàÿð *À@Ðpë€ØàÙ€ìP÷ þpPð°à€ù óPó@ÿ 0 DðcPCP è@ƀͰ¾p¿Ü0ÿ`%à1ÐP  Ðí Ö ×ðêÐ÷   °€ðø@ïñÿ°  <àf`JÐ$ê ÂðÄP¿½àÓõð8€' Ðñ`ÛPÏPÝ€ï`ÿPðÀ €þ0íÐé ÷` PA€j M (í¾Á ¹À»Ôðó`9Ð,`" ÀðÛ@Ï€ÚÐê üÀpp Pñ°ëÐø €€L°e0Kp$@èоPÀ@µÐ¹PÖ°ó`" 9°/°(ÿðï0Ø ÏÐØçýP pÐààðPê`ú0°"PZ°X`@PpÜ¿½ð´P¿ßpû'@7*À"0ûñ ÖpÐÛàæ€ý p €ÐP ñpô@° HÀdpFÐ#€ìðÁ0ÃP¸P· Ò ê@P6@/0*ð€úâÒÔÜ`ó`p0 °P €ûÐñ°þ P9`j@NP.øÉ Æp½ µÈpàÐ @3`4 ) €ðð Ø Ó ×€éPþ  ` pp@Ð÷ðúÐ@$ bàX>pѰİÃÀ» ÀÔ ó &à8P30! PàûÐä ÖÓ°Üô@°€  à€/PgÀUÐ7pø@¼Á0½ËPÔ°ø€(:8°"ÿ@÷ÀæpÜ0ÒÀÚ@ïþð `@ а° €à.0^°M 6Ðü ÆÐº¾¿@Ñ Ö€òÀ-p6À&Ð`û îçØ×Àâ óÐ P0€ ÐpA@XÀHÐ)ñ0ÄP¹¼ÀPÔðÙù°`,`4 )pð÷0ïÐèPÛ€ÙÐà0ëþàP 0 Ð!`4\PP@> 0Ø€¼€·µ€Å0ÍâÀ 1Ð5 &0  û@òäØÐÕ Û€çúÀ `   -pL [M /ÐûÀÌ๴·`ÇÎçð€°1°6(0 0Põ`æ@ÙÒÓ à ððýÐÐ $°<°_`\ÐN€PëÀÄ€¶ ²`¿Á ÎÀàú39 3 "à Ðû€ï áÓÀÍÕpáÀôp€à+PKP\\Fà@éȸðºÐÃàÅÀÎÙî °%`4P5'@@ÀPý ð à°ÔPÐ Ö çàûÐp# > J`QàEP- ïÐÖÌ@Ê`ÉPÍàÏàØépý€P"Ð&&@`p0ùÐìààPÛPà í/ð6p70)0 ÐüóÀïè ãPÞ Ù@ÜÀâ€îÀüPp @P`ûõ€óõ ûP €@@` þ ûPü û€úö@ð`ë éíÀõ°þ€€ÐÀP€ÀÐ ÿ°þÐÿ @ð € p   ðPp PPÐþ`úPöpóôøüÀý°ý°ýý`ýPýÀýþ þþPþ°þðÿ€à ðÐ à À P € ð`ðPÿý@û@ú ûPûûÐúú`ùàøÀøðøÐù°úPû€üý ÿ0ð pð Ð 0  @ À€ðPÿpýüÐû0ûúPù€øø÷Ð÷0øàøàùpûÀüþ°ÿ`à@P Ð À  Ð @ °pÀðÐÐþ`ýüûÐùPùàøà÷Ð÷÷øøùÐúPü ýÿ ð€°à ° Ð P P @à0àÿ@ý üðú ú€ùùø@øø€øùú€û€üàýÿP`à p°0 à ` @    ÀP ÐàÐþý°ûÐú úÐùùÐø ø0øpø@ù0úPûPüýþ°ÿ0`ðp`€ € ` ðPPàPÀ€þàüÀûðú úPùÐø øPøø°øðø ù°úÐûý€þ`ÿ0ðà€€0 € 0 `àÐ@àPÐÿpýüPûúÐùùùÐø øÐø`ùú û üþ`ÿ€ `  ` 0 ÀÀ€0ððÿ þýü0ûÀúú`ù`ù ùÀù úàúüàü€þÐÿP``ÀàP €àP ÐP àÀ°ÿ@þðüü0ûú0úàùàùÀù0ú ú ûPü`ýþ ÿ00pp` ÐPàà@ðpЀÿþý ü ûPúðùàùÀùú0úûpûü€ýÀþ`pPÐÀ`  `ðPP@ð0ÿPþýüûàúúúúðúPûÐû ü€ý`þ`ÿ   °À`àðPp  PÐÿþÀüàû@û ú@ú`úpúÐúpû ü°ü ý þÀÿ`P €pÐà 0°À ðà0ÿ`ýpü°ûðúÐúú°ùú@úÀú@ûüðü@þPÿPÀ 0@Ð0€  PÀÀÐЀ 0ùÐó ö@÷0ùú0û üü`üý@ý ÿ0°`@pàð@P€ à@  þPþ þ`þø€÷ ùpú0ûPüýÀü ü0ýþPÿ` `°Ð°`P  P  Pà°ðPÿPþÀüPüPû°úú`ù€ùúû üýpþÀÿPPР  ° à`À  ðýÀ÷àó°òàòPô0öP÷€øúú@ûPüýÐÿ`à `@ÿPýüàü0° °Ð€ ð€÷Àï€ëÐê`í ñ`öÀùÐúúàù`ú°ü 0°Pà 0û@ùàù@þðp@!#PPàùÐìäãæìóPù€ûüû@ü €@ ð ûpõPó÷ ÿà @'0-p) €ÿ@ð@å0áPã èpï€ô€÷PøPøÐù þ   P`àüpò€íÐï`øÀP) 2€/P%ÐÀý0ëÐÝÚPÝPäðìàóöPöÐôõÐù À`ðPùìÀæèñ` +€6 3Ð(PPüæ@×àÒP×`ààê°òàôàópñÐïÀô ýР°Ðøè@à0áêÿ@ð)8`8Ð-à@êÀØ Ò0ÕàÝ`è`ðô ò`ï í`ð ù`Ð "àÐþ°ì0áÐÞPæ ÷ `%7`;Ð2À ÐîÛÒ@ÔÝ@èàñÐõ€ô°ñ0ïòûР À"`°Pÿ`í áðÞæ ô @"€4=6@(0øÐäÀ×ÖPÜ@æ0ïPõ õóPñ°òPû€ # `Pó€æPá æpò@00/Ð; 8P,0`ÿêàÚÐÕÀÙ â€ëPó0õõ°ôÀô ûà°Pð"p!Ðððöè ßáì`þ 0,@<= 3 !àÐðàݰÕpÖàÞ€èÐðÐõ õÐõÐó ùP` "`#À ÐúêßÐÞàç0÷ÐP'P9Aà8P)Ѐõ€àpÔPÒÐÙàãî`õPõ€õ ôàö0  @!à#pþì0ß Ú áPïP@ `2AÀ>1ÐÐPê ØðÐ@ÒÀÛ€ä@îÐòÀó ö€÷`ÿÐð #  Ððá ØÛ çÐú ,P=ðB:)0öÐßPÒ@ÎPÓÜÀä íÀðPô°÷°ü€€0@!  @0 ðö0æ@ÛpØ á@ð0° 2@@Ð3 ÐìÐØ ÎÍPÔÀÜðæ î@òà÷0ü   ° "@€ÿÀë°ÝàÖàÙÀç ú@€-À< E =°,P÷@ß0ϰÉÍðÖ@àëðð ÷Pýð€Ðð #à í Ý Ö ×Pä÷Ð  ) :FDÐ4@ðÀç`ÓðÈðÆÏØPäï`öÿ`   # ððð߀װՀݠï à7ÀEÀL`AÀ-ðÐñ€ÖàÅ€¿ ÄÐÐÀÜÀì@öÿ ÐP"@%ð!P pô@á Ô@Ò°×ÐèÀþ P5pEP`Kð7@@üÜÐÅ€½¾°Ê€×€æö ÿà @À0&Ð'Ð"°`àñ@áàÓ@Ñ@×0åûPÐ-°D0PÀRpC@+ð0ä`ƵвÀ»Í@ß0ô `À`$*+ %ЀïÐÜ0Ï@ËÒ`à`ö0À%D0QPZÀRÐ:`àïPȭ𦰬°Á Ø@ð€ à!0(`, , 'à`òpÙÀÌpÆÍðÜ@ò p!€6PMàT XàJp-°ðÖ0°PPŸ€¯PÎPì@€'Ð.ð/ð,&@ ÐîÙÐÇÐÄ É Ø0î€Ð/€FWP]Z>Ðà ­”Ð’ ¥ Æíà   )0-Ð/.*PÀðìàÓàÁð¾°É€ÜPõ P€*à6PRà[aPOÐ!@è`ªÀ‰‡¡ Æ0óÐà!Ð)@)@-€/@,`@ äÐÇð¼Ð¾ Ò éþ P€Ð)@?°[ aÀZP4Pö·Pð‡ž Æìð pÀ *@/9à4Ú€Á»È ÙïPü€ €#5U`b°Z`A0Ë  @’Ÿ`½ Ýø@@*à607.°0üpÞ°Ï€ÈÐÝç õÐÿ  Ð'1@MðPI.õÐÁ  œ¯PÒàïÀÀ°* 3À-PàèÐÕ°Ó Ô0áêððú`0Pð`$ð0N0K Að€Ù±Pž¨ Ä@å0÷  @&05P4°#  ð°ÚpÖ°ÜàÞ ç`ë€óà`à  PpGÐ&@ €ápж@¾àÚPíPù €à*À 0ê°ßàÝ å éPðpû@ 0 P à 00!!N04p0õ@ÛÉ€´Î0âñÀÿ€$ 'pP €÷0êß â@æPèòP `   Pà ;°HÐ)PÀ0éÐÖ¸ÐÁÀÖ°ãðÀp( Pó é ä°æá0èÀô`Ðð p !ÐÀOÐ8€$@ ð@äðÉ ´€Ï0Ø`ãPõPP!!``Ppñ`é@èÝPÞPêøÀû@ pð !:Q +0à 0õ°ÙµÃÒ ÖàãàÿP €$ý õPî°âÐÙÀáìòÀöPÀ!P*ÐX@5' `€ãÂкpÎÉ@Ô ï0P  %Ð(° € øðè ÙðÝ€ãàåÐì û@"p'pPÐF2Ð! 0ôàØP»Ë Â0ÈÜÐ÷ÐP@.0#Ð@ð°õðâ`ß0Þ0ÝðáíÀûp%P>V`82°%Ð @ë€É Ê`ÃÀ½ ËÐãõàPp)(` #`€ÀòÐé@ãÀØðÙ`áPëÐø` à7`TP<°=ð2` ûÀÚÓÀÄÀ¹àÂÒàáÐô€ð!À%'à à ø î`à€ÚÐÛâ@ï`ýÀÐ/ÐH9€;°8P!  `ê€å€Î0Á`ÄÀÎPÕ€á`÷   `& &Àð`úðëá ÞÀãPêø°3°)@150/à€ûÐî Ö0ÍÐ ÐÔðݰóÀþ  !0 ð p ô€é°çéðò€ù€À&Ð&P/Р` î0ÜÀÜ Ö0Ø€ØåðñÐúÐ`    ÐøPññò÷P ÐÀ€&pÀP  ú`éðäPá ÝÛ€âPëòÀ÷°  P ÐPЀ°úÐø õ°üðüà @pð€ à`€õ°ê`éÀâPâÀáéÀïPò°ý 0 `ðÀ ÐþÀúðÿÀþÐ ð PР €ð`úÐð€ïPêPèÐä`êàíPð°ö ÿ€ð` €ð   Ðÿ@àà@ €° ðPÐûàõ`óîíêÐí`ï0ñðø@ýPP°° ð ЀðàÀà p Ð P   @ðP°€üàù@ö ô0ðàñ°ñòôÐ÷àüÐþ@0€€0€ @`   ° ð à`þ`üÐùøÐôõõõà÷€üPþÐý€Ðþ  €à0Ðààþ`@`€à`À`@Ðþ`û þÐû°ýÀü@÷@ùPÿ@ý õàýðúÐ0ÿý  Pþàð°@PpðàÐÐþàþP0üðüÐþ€ Àö þ Ðþ àü°ü`ò  À° p`û @úPû@`Ð 0ðPü`üþpþPþ ÿýÐôÀþûð €Püü€0þôúP`úÐýÐà  Ð°  ûðî@ý`ýõÐ0@ôpÿÐÐö°ôÐýаûøPýPó÷à €Pp`ù ÐÿýP0ýPÐ Àðõàþpüðú€÷p@ ð÷€àýÿ€ûаP÷ÀøýPþ°À P€° Ðð€÷€úpúPÿÐP °Ðÿ þ°ù€ý°üPð @€þpÿ ùð Ðpàû€ú€ð0` PøðÀûó€õpúP ÿ ö@øÐÐüà€ýýÐö@ðPü0ðÀÐÀ0Ðüü€ø€ ÐÐüÿüÐÐÐõàóö@ à ÐÐ Ðp°€` üPÿ0ÿü`ùþ `þ ÀþÐõPþÀÿPñ°ðü°0@þàÐü°ÿ0ÐÐûPûÐúpûüp 0þþ ð ÀðÀpþ úÐú@õÐý Ð `ý`Ð`@°øP@ý`PÐðþ` 0þÐP€þPÀ`þ ý ú€÷ý°ðø`ý°`Pàûàÿ 0ú@ 0àõ@ÐüP`Pàü0ùà`ðPþ0ùûûù@ÿ€÷ û°Ð`þP°@ü0ûÐÐøÀõ°üÀ`üÀû€ý PÐû`°0°à@ÐÀþðöøpüPúðpþ ÿP`þÐÿ€ €ÿàú €þà pûPù Ðþþ0@ú ù°ü0 0àþðà`øpp@ý ý`P`ÿ ÀÐõ ýüðÀà@ÐþÐЀÿÐþýð À ÀP°ÿ0@þ@  ýPöþ àÀþ ýýP Р€@€ÿ°ðýPp€Pÿàþ ° Pþ`Pÿ`ÿ üP àÿÐÿ`þÐþ0 þÀà€ÿPý þðþûûPÿ`@ýûý@0 ÿ@þ°ÿ€ÐàÿP `€`pÀàPp  PÀ 0À`ð` €€° €P` @€ PP €ÐPàð°ÀÐàÐÐÐàР°€` 00 Ðÿ ÿÀÿ°ÿðÿÀÿ ÿÐÿÿÐÿ°Àÿ0ÿàÿÐÿ€ÿÿÐÿ°ÿðÿðÿ àÿàÿðÿÐÿÐÿÀÿàÿàÿÀÿ@ðÿÐÿÐÿðÿ àÿðÿ`  `P0@€`Pppp0`€``pp€`€€€€€`€€`pp€€€€ °ÐàÀÐðÐàðàPð Ðð  Ð0ð@    @ÐàÀ°°°Ð°ÀÀÀÐàÐàÀÀÀÀÀ°°°À °°°°°ÀÀÀ°ÀÀÀ°°ÀÀ   °   À         °°p p€p€`€ €` Pp€€€€€€ `€€`p``p€€€€€p€€€€€€€€€°€€€€€€À °€ €° €  € ÐÀ Àë0ñà þÐý` Ð 0@  @@  úóàöûPû€þð`àP° ð €@`þ`ýpüðüÿ@àpÀ Püðü0þà`ÿÐý0ÐpÐûÿÐ @ û íPûPòàôP þÀøPü0 Pý0ðÿpùðþЀú0ýü@þ PðPP `ü°ü`°ÀúÐùÐÀô`ÐPpà 0  °0óóàöú°òPþÐ û€ÐÀ À`üðü ü ö ùÐû€ü°ý  °p pàÐÿàÿÿ üÀÿà@@ÀP°ÐðÀ€ðÿùà0û`üÀý°€ÿPàP°P€p ` ÿ   ppð@ðP0` ÿ0ÿüýpþ ÿ  0`þÀÀü`þ0þþ@ü@ÿà`€pÀð0ÀýÐýÐ@ÿÀúÀþÐýÐþ àPà€0ÿðàþpÐP ÿ  ÿÀÀ `p0ÿÿ@ÿpþ@ÿÿÐþ ÿà€°@àðð@@ÿ0üÐþÿý€þ€ Pÿ° ÐàÿÐ@ ýPþÀÿ@ÿà`pððp°€ÀþþÀþÐýÀþ ÿÿàþ @PþÐþ0þþþ€ÿÿ `ÐÀ0ðÀÀà° ÿPýý°ü@ü°úPú°ýpú@û@üPý`üýPý`ýýýàþàÀÐ@€ ð € 0°À À ðÿPùPô€ðPð îñööû0þÐÿ 0P@Pþ`ý û`ûÀ Ðà  `À@0Pþö`ìÐé`åê@îðû à     @`þPùPô õpõðôPú à@!`*`°ÐÀúÀìé@åP߀åð°ôÐûÐ P ð€`ú€÷ò`ð ó õÀùþ€` 0ÐÐà(àà0@ú ìðèàåàáåÐîðôpúPà  0 ð Ðü`ùpöPò ò öàù`ü à `@ð(`ÐPP÷`ëèèáðäÀñPöÐù ° ° € 0 `ðüÀúàøô@ó`õ0úPüÿ€ ÀÐ" $ @@PÐõpé`è€èPà°æðÐô ù` p   ` P`ÿÐû@ù öô õ€ùÀüÿÐ ° ` @ ÀP püPîPî°íæÀæípôPõ û`Pp°P à@àý€ü úP÷PùÐüÐþÀÀ@   @€  à `÷öÐôñïÐñöàöàùû @°Ðà0` àÿP pÀ0P€P`Pð Р€ðÀàýpû ùø ÷ ö°öÐ÷ù ûü ý@ÿ PÐÀPà°€€€À  ` € РàüúÐ÷`õpô@ô@ôÐõÀ÷Ðùû`ý þ Ð`Ð@`p@`` Ð @ p Ð 0Ðþ@ûÀøö€ôÀó ôðôÐöøàúpüPþðÿP€P `Pð`°ð€p € À ` 0àð0þÐú øöõ ô`ôõ÷Àù`ûàü°þðÿPÐ P° PÐPÐ p ` p `   ð þ0û ø`öõ€ô€ôàõ€÷€ùPûý@þP Ð0 @аpÐ0 `  €  pP þ ûù`öõPôôõÀöPø@úðû ýÿ   P0àÀP à@` p Ð à ° Ð PÀàÀ0ý0úÀ÷ÐõõÐô0õ öÀ÷Pù@û°üpþÿ@p`ààÐPаPp  À P €0  þ0üù`÷0ö@õPõ ö÷ðø°úü ýàþÐÿ@à °pðÀP ððÐ @ ð ° €`ð€þ@üúPø ÷€öö ÷0ø ù`ú`ûýþpÿ0°pÀЀÐ0ÀP `Àð``°Pþü€ú@ùPø÷ ÷@ø øù€úàûýþÿ0`P`@àP°ÐP€P °`p°ÐÐþÐýðü€üpûpû0ûPû0ûü ü ý`þ`ÿÀÿ`€P`€`€0  pаÐÿ ÿÿÿÐþðþÐþÀþÐþÿÿ€ ÿÿàþþ€þÀþÿ àÐ00àð€À°À° ÀÐÐPðÀ`@ °ÿÐÿÐÿ`ÿÀÿÐþ@ÿ°þ@ÿ`ÿÀÿ€ €€Àpp°ÿÿP€ÿðÿ àÿðÿp`pp`p` Pp`pÀÐÀÀÀÐÐð° ÀP`  €pp`€ €€p€€€€ °ÀðÐÀ°°ÀÀ  €   °ÀÐàÀðÐÀР  °° °  ÐР   ° €`€€€ p  €€p€€€€€€€€€€€p€€€pp€ p€€€€€€€€€€€€€€€ €€ €€€€€€€€pp €€€€€ €€€€€€€p€p€€pp€p€   € €€ €€°€p€€€€€€€€€p€€€p€€p€€€€€pp€€€€p €€€€€`p€p€€p€€€P€€p Ààà`ëðú@ûðÐÐî€ð@p ` `@üø0 pðPóàÀ`€Pï`ÿûöÐà 0Ð ÐÐ0ÿÐþÐôÀù€þ ý@ú0 ùPÿ0` €ÿ`þpûþPÀö°úÀàü ûþ ý@þðÀù`þþ€0ü0þ€üðü@ø °üP øp°ò ýàüàýÀûÐ0ýPÀ  þp  ÷Ѐý`Pö`Ðàþà@þ`ø €û` @úÀÐþ€ÐÐü  ðþ þP0ý ÿpà@`0 °p þ@ÿ€ý@ýÐàþ0@°ðpþp ýàPð€ðÿ°þÀ @ÿð ÐÐþ@þþ þ ÿ@Pðÿ°Ppýàý þ€ÿ ð0€ à0ÿðþÐýÀÿðþp€þþàÿP@þÐP°€Ð€ÿà0à° àÀ ð`°Ð`À0@ðpþ0àÿ`€0ÿÀþpÿ°ý°ÐÐ@€ÐÀþpàð ÿàþ`à ÐðЀþPPÿP`€@ 0P À€þðÿР0 ðP Ðü üÐÿÿ`ÿ þÐýPþÿ°ý€pà ÿàý@þýþ þ°þ `ýÐÿÀ0üýpÿ þàÿàþpü0üÿ`ýàþ ü°ÿ€úÐýÐø@üûÀüÀû°þ@ýÐþPüÐûPþ ÿ ÿPý0 @€аþPÿþ@þÐü€þðÿ üÀÿàý0üàö ù ÿÿ€``üpúþPÿ`€ p ` ð 0 P@PÿÀp0pþàýÐúÀùÐúúú`ÿ0`àýü ÿàÿ€þ€ €PàÀ  0À° аú0øpú@øàô@ó0úPþ üàù`ü þ`ùöpù üà@°  À°ð ðЀÀÐÿPö°õ`êPçÐð0þðÀÀpPúð í ð€öÐûP @€ü0ÿРÐ` Ð,€%ð  ÿðö°ñ ã àpò°p€`0`ú`ï°îàòàòàøÐýÐààþþàÿÿÐüÐÀ'À9€*` €îÐâàݰÕÐß ÷PÀ0Àõéàå ì@÷ðû@°ÐÀþüðüPù`ú ýP ÐP3Kà-ÐÀäpÑ`Ì`ÆPÛÀÿ€€%À€À`í Þ Ûãó ÿðÀ Pÿ@úPõ ð°ó ú "@=`Sp.àûàÚÀÈÁмÀÙ Ð%Ð+°#  çØØàïpþÀ P  Ðù€ñàìÀî0ú`@#€>p^-àõpÕ@Ç@¾P¶Ò 0-ð. & ð €çÐÏÓÐܰé0ú  Ð À ù`ðéÐéô#ð( Z@TpãðÐÐÁµp³Àë` 0ð. + $pÔ°ÌðÒÀÚ€è ÿÐ0!PÐðöèàæPíÐ÷@0 !À8kP3üðÛ Ð ·­Ä °%`-0à2 ñpÓÐÒðÑ Úàî à  òç0éïü(Ð`PWÐðß°Ã0ª®Ðè0À.:4` â€ÚðÒÐÊ@Û0ùP`À@ÿ0ñíÀì0ñ° °@ði€)`°ñðÚ µPªpÇ0þð à`50ÐpàðÚÜ€ÛPà á@û@°@ ЀúñÐì°í°ìîÐöþ@ à ð ð  9Ð! `àÐâàÚ ÚðÜÀéû ý€ €  €Ààûö ðíì@îàôàö`ÿ  P°&P9 @ñå0æÐ×°ÙPÞ í@ñÀûà À 0üÐóÀîpîàî@ï õ úÿ`pÀP ÀÀAÀ6 %p àðpÕ@Å`½¿`ËÀÙ ìû€ðà #à"€` Àù0éÀݰ֠ÙðáàñPð€)à;ÐB`F ;ð)ðòÕ`Ä`¼¾PÊàØêú ð0Pà# $`° °ùÐé ÞÀÖ€Øàïà# 6Ð>0B? /°`ãðÊྀ¹PÁÎàßÀò PЀP!`"   Ðð@ã`Ù`ÖÛæP÷ P->PB°D09ð&ð °ïÒÀ ¸`ºpÇ×€ëý  €P à"$P" €PÐôÐå°ÛÐÔ@×0ßîÀÿÐ@$`5°A°D@D5à°Pæ@Êà»àµ»ÊÝàñðP#P#@#@° 0ÐðãÙ ÔØáòÀàà' 6à@àAð@@3àðàçPÊPºð²à·Ç`Û òà !€'0&P$pÀ `ýíðáÙPÕÙÐâ ò ð@(`5`@ A0@à2°pðç Ê ¹À±p¶ Æ€ÚòPÀ °&%!à @ÿ`ððã ÛàÕpØá`ðÀ`p'€2À=?>@5ð#Ð PñÓ½³p³ÀpÔÐë@`@!`'`'À"À Pó åÀÜ@×Ð×Pß@íþP ".`7Ð=Ð;`8 +°0ÿpãÐÇ·²@¸Ê@á`ù`%°'$ ð p°ø`ìá°Ù×@Ûpå õà (1P8€; 9ð3`% ÀöÐÚÁ`´²¼pРé°@à#p'°& À  ÀõPêÐß0ÙPØÐÝé@ûp €P+@1€68@5`/ !€ ó`Ø`À´°³€¾€Ó°íÐ`@$@'Ð#P Ð °ýóàè0à€Ú€ÛÀáí`þ ÀÐ+ 1°4 63À-` ` @òà×pÀP´ ´àÀàÕ`ð`P0&' #ÐÀp €ýôðéPáPÛÜ€âî@ÿ!°+P0 0@2À-À)0ð@øÀßPÆP·µ ¿ ÔÀîp  &°' "p0 ð0ýÐóê0â@ÜàÛãïÿÐÐ!`+À. -`.À*°' ``ùààÇ ·µà¿Õ°ï `P' & p€ `0Pý öìãàÜ€Üã`ñÐÐ" *ð+(Ð('&°  `å ËP¸Ð³P¾PÔ@ïP @Ð&Ð$À° ðýÐõì`áÐÛÛàã0ò  "p(P)°# !@#%P$€  ðñ Ö°¾´¸ Î0éÐ&$À0 `PàûðòPç`Þ Û á€í@ÿ Ð%°%Ð!PàP! &À$ è`Ëиµ ÁÐÜ€ùÀPà" ð PÀ°àÀù ì0ápÚPÛçø@ !€!Ðа °'P&çɹ°¹@È€âPþ`@ð à € À PÀöÐæ0ÛPØÞ ìÿ@P`@ÐÀP#+À*@°€åPÉÀ¹ ¼ÐÌ€æPÿ0@Ѐ0 P ° à€ À`ó ãàØÀØ0á ñ  Ð@@ PP  `)à* 0îPÒ`ÀpÀ`Íâ`ú @ð   p P@ð0 ô@åàÚÙ€â@ñÀÿ Ð@``Àp# )à$ä@Í`ÂpÉÐÙ`îàÿ ` ` P ÀÐü0íÀâ€ÞPáê ø P  ÐPpp а &%àÀÐåÏ`Ã@ÊÝóÐð ð €°°`àð@üë àðÞ åð üÐp`0€Ð €0&Ð$ðÀþðâPÎ`ÅÍà ö°€ ° ``  àÀð°öÐç ß@àéÀõàÿ ` °@` p € Ð $Ð(PP éÀÒÆ°ËpßÀõ`ÐÐÐ PP°õPè áãpë€ö€ÿpà PàÀ  À à*À*ð`ûÝ`Ë€Ç@ÕÐìP Ðÿ0P °ðÐ ûê âÐãëôPüÀÿpÐ P    @°þ€ `0/ -Àõ ØpÌÐÍÐÝÐò€Àðü ú€À  P`ððò ç€æÀì ó÷ùÐûðÿðð° @ýÐüÐ )à,ÐÿàäÀ× ÖÀÝPëÀ÷þPûÐúÐÐ@°pÀøÐî0ìïÀóõ°õø@ÿð°`Ð0þý`@ À $+€ ÐçÐ×0×Ü`ç òÐûýü€ Pà°0÷ÐîÀì`î òÀôPõ0÷þð`PÐàýpûÐÿ @0 &À'Рú`âÙàÙàPéÀó@û ü€ÿP`ÀðÐpüàó@ðï ñò@óÀôÐù@ p PPà€þ þ°@а(% Àò0ÝÐØPÝPåÐí ö°úPý 0  ÷Ðñ€ñ€ò`óPó ó`ö þÐPp `Pÿ€ýP`0 °$@,ÐðÐæ°ÙàÛ â èîÀõú€ÿà°@ Püõóóñ°ï0ðô ûP€àà €ÐPþþP ÐP&Ð+ °ÿpãðÙ ÞæÀêíPòÐ÷` PP°ûÐõàõ`õPñ0î`î@ôý` ÀÐ0 ° pÀ@þÐúàü  ÐÐ(@,PýPå`ÞPâ€å@æ@èÀïùP À Рÿ@ûøóàí ìïöÐý°ð PР ` àýüpÿ@@à)ð&ôã âæçæ éò û` PP°þàû0ùpó íÀìàðøàÿPÀ P0 PpÀûpùý€Ð `$ð&ÀpþÐê0æ çæàâå`îø0 ððP€PÐûÀô0î°ì ð@öpû`p à À @  þû ÿà ÀP$ðÐ àõê@êëàæpäè0òàú` €` €ÐàÐûõ@ðÀð ôøÐûPЀ Ð À ð  0€Ðü@þ0ÀÐP# õï ïàê€äåàê ó ú0 à À  °Pùô óÀó@ô°öüð  € ðð À Ð@Ð ùÀò ó ðêpçë`ñ€öý 0` ÐÀ0þ°øÐö÷öö°ùPÿÀÐÀ `  Ð @0  p püø öàòì@êàìðð@ô€ùÐÿÐð Ðÿ`ü0ú øÀõö0úàþà @  @P@0p0ÿ°ú€ùÐöàñ°ð°ð°ó öpùðüÐÿ°@€€€Àðþ üúpùù€ûÐý   À p0 À P   €Pú`øP÷ô`ò ô°ö°÷ø`ûÀþP`°À€0þ üPûû@ûàü°þ` ÐpP€@  €PP€ýûú`ú ú°ùùù@úû üàüÀü þ€ÿÐÿÿ°ýPýàü@ü ý@ÿPа°P`°ÐÀ€`€ àÿÿPþ`ý ýàüpýPý€ûÀúüðüý üüþ þýý ý@þPÿðÿ€P€°@ÀàÐPpp@°À0p Pÿàý°ý ýPýüý@ýÐü`ýýPý ü€ýÿ°þ`þ`аpPа€PÐp `ð@ @`àPàÐþ ÿàÿþ0þP0þÿ€ÿpþðüÀÿ°ÐþÐþ`à0 ÀÐþ°€@ð Ðý°þàÐà°À €ÿ @ûÐÐàý@ýàÐà`üpàÐþÐ ÿ°€Àý`àPþ  üà`€€ `ð°`þðÀàþ€àPý PpP ýpÿÀPP þPàÿ ÿ0þÀPÿ€00þpýÐýÀpP€ÿÐÐþ@Ðú0ÀüÀÀþ@°þ@ Pü `€ü° ÿàPý  €ðûÀ ûPÿàù Àðøp0ÿ°pÿ` ÿP°@€þÐ@þ  ð@`ý@Ð`ýÐøP þÐý`þÀý0þ@ ý0ЀýPû@Àú ÷  õÀø°öpÐø€ú €÷  ýððÿðÿ`üÀPþþàý0p°üP ù °€ÿÐ ü€ P÷ÀpÿðÀþ àÐýpÿÐpÿ@@€þûP ðþ@úÐ÷ p°øÀ`÷À°°ûP@ýPýðÐ ðþpÀ€  ð€ðùp@ú`à ÿÀÐÿ`ÿ û Àû`ýý õ`úÐ0``üðÿ@ö €ùþ€þ ÿ@ûpp pÀP÷€ÿ Pýý€Ðûðü0`0ð0 €ÀÐÿР þð0@ÿÿþÀý€Pÿ€0ú @ùð€ü`Pþ ÿ þ°ðР°ý€`þÿPþ 0úþÿPõÀ°ÀÐþ€°ý ûÐ Ðùù@þÿpÿ`ÐþàÐüP@   ü0øàü0Àð`þàpô€þùàÿp àPý0ü À àÿðÿÐ` þþ°°ûÀùÐúú 0Ð@€à€þÀ@öÀ``ÿ0  €ð€ïà@ûPø À þPúPûðþЀpÀþí@ò° p Àü€Ðý0ó à€@ ý@ ÷Ðÿð àü @ý ú@à À `ýýÐ@ýÀù@û°p  ýÀ ø@Pû PàôÐþpù @ °P€ø 0ùàÿðø þûúÀà÷ @` °0ôðÀÀÐ àõ`óüÐÀ°@ø@  Àÿ `øàüÿû`ø  þðþ€P PûÐ@`à`Pü À€p€ýõúÐ0þ``ûÐ û ú÷ð@Ðøàù`ÿÐ`Pû ý ÐÐø0øðúPðú@€P °ÿ0û°ýPü` ÿü õ€ý ÿÐpø€@Ðÿ°ÀÀ`PþÀÐP@ÿà `ýPÐÀ€°þ° û@€Pð`ú``    €Pÿý`€ýÐ ð€þ`Àü ÿp€þ þ°€°ú ðÿ °p€ÿà€ÿÐù0à0þ0ÐýàÿðøÀþÀÀ€€Ðþ ðPàPú ðÿÿ þàþ ü@  úÀü@ÿpÿ€úPpР@Ðÿ@ü Àñàþ€ÀÀ àÿ°ùPð÷üðP p  ý@°û°ðÿ@ÿ  ÿÐúàþ Ð ÐÿÐP@þ ÿ0ýðÀùÐ`ÿÐ`P0`à€þÐàÿà0 @àþ°ú Àþà0àÿ°ÐÀp pÿ€þÐüÀ 0Àþ@`üÀ0ÿpù°üýÀÐpþ€àЀÐø@ÿ`ÿ@P`ÿÀ €ü` °ý  Ðú`€pÿÐ ÐàùÀðú€üPp@ÿðÿpöàÐú€p€€p€û`ý þP°ù€ðàþp €€þ ûÿÀö P`€`ý0ü00ý ÿ üp@ÿ`þÿ0ÿPðPý0@ÿ þpPp  À°ðÿÿÀ PP@àýPûpÀÿpÀ €ÿÐ ýP üÿPÿ`ÿ ÿàPPþýpÐþPP  ÿ`ààÿÐ`ÿ`@þ0@àýÐÐýP@ü0@úPý pþP°ÿà þð`ùÀpPÐ  ÿðú €þ°þàü`€þðÿ0€ ðP@àþpþÿ pü@ûÐÿ ûP Àûp€üðÿ pûðàþ°ùp ü P@þððð ÿ€ °ÿ ÿ000Púðà ûÐ0þ€Ð0ú°@€ À @þÐÿÀ0ÿÐþ€ÿ€ÿ@€Pÿ`0þPÐþ Ðÿ€Ð þ ÿ  ÿ`ÿ`Pþð ÐàPÿÐð °pðÿ0€ÀÿÿP €ÿ@àÿÀðÿ`€ Ð à@ðàÿP@PP ÿÀ pÿP@ðàÿ à€Àÿðÿ àÿÀÐ0pP 0ÐPÿ€ ÀÿpÐÿ`ÀÐÀÐÐýðÿ€ ÐpÐ`ÿ@ðü0Àÿ°À@€ @ÐÐÿàPÀÿ@€ð`ÿ ÿp°þ@Ðÿ `€ p°ÿÀðà ÿÀ@p0@€ðàý@°ÿ Ðÿ`ÿ à Ðp°ÿpÿpÀÿ°` P` Àp`ÿ0ðPþ@`ðÿàÐP`ÿP°0À`ÿ°@à°Ð€°°àPPàPP°Ð  °P€€P° Ð€@ °€  p0àÐÐÐP ` `°Ð€`Àp°À€ €`Àðÿ€` € P @€p €P°Ð€€P€€ÀpÐÀ°€Ѐ €p°€à°à à€ Ð0ÀÐР °À€ àÀÀ° À°  €€€  °  Ð€°°€° €€€à `ÐÀÿ`€°` àÿp` À Àà°°€` ° ÀÀð    € °   À   €° ° °  p€ €   €€° € €€€°€ €€€€€`€p€€€€€€€€p`€€€€€€€€  €°  °°°àà À  ÀàÀ °      €€  €p€€€€€€€€€€€€€€€€ € °ppppp€ `€€€  € €€p €   À    °Ð À Ð             p    €€€€€€€€€€€P€°p€` ``€€€€ €€€p€€€p €pÀ€  €  €     à°°° Ð ° ÐàРÀÀ °À          p €€ €€€€€€p€€€€€P€€pPP`€€€€€€€€€p€€€€€€€€p€€p€p€€p€€€€€p€€p  p€€   ° °  À°°   °     €   € p€ €   € €€€€€€€€€€€ € €€€  €€   €   €À°Ð °  °° ° °   °             €       €°€  €€€ €€€€€°€€€ €€€€€€€€€€p€p€€ € €€     €  p`€€€ €°€€€€€€€€€`€€€€€€p€€€€€€€€p€ €€€€€p €€€€p€€€€€€€    Ð  °ÐÀ °  ÀÀ °°°     °   €  €p€€€€€€€€€€pp €€€€€€°p€€€€€€€€€€€€€€ €€ €`p€€  € p°À°€  °°     p€€€€€€€€€@p€€€€€p€p`P€€€ppP€€`€€€pp€€°€     €   p€€   €p    °À       ° €p€€€ €€€€€€ €€€€€ °        ° À°   °€€€ €€p p €€ p€  €p€€€€€€€p€ p€€€€€€€€€°€€€   p€   °À       €   €€ €€€€  € €€€€€€€€p€€€`€p€€€€€€€€€€€€€€€€€€p€€€€p€p€€`€€p €€ À  °ÀÐÐÀÐàаÀÀ ÀÀà°°°à   °       °€€p€€€€pP€€€€€   p€ °  €€p° p  °   Ð°  °   À ° € p°p  €`€€€€€€€€€€`€ €P€€€€€p€p€pp€€€p€PP €pp€PP@ 0`p€€€`€ € °  Ààð°°°àÐðÀàÐàÐÀÐÀ°Ð0ÐÀ ÀÀÐàÀ°À°°   À°°     €    p       €  p€P €Àp€€€p`€€€€€€€€À ° °p  €   p   p €° `а € €  €€€€ €°€€Àp€€€€€€p  €€ €°€€p €€p€p€€€€ Ððà° p€p  €€°À°Ð À  €°p€ €ðÿ€€pP€€°pÀ°Ð€p`P`ÀPÀÀ €ÿ0ÿ°ÿàþPþþÿÐþ0þ þ`ÿðÿÐÿÐPP@ÀPÐð`ÐPÀÐÀûPøÐ÷`÷÷ ÷àø`úü`ýÀýðþÿ0@P0p°P ðÀ@à€`ýðõPï@ëÐëÐð öû€þð `ÀPÿ@û€øàöÐö`÷Ðùpý@ Р)P&ð°àùÐóàëpã`âépô@ý00àPýÐø õô`óô`öàû€   P  P à  @@ ýÀù õ0îæPèÀî÷PüPüPþ  Ðpýàû°úøÐ÷ ÷°ùpþð@ÀðP   ° Ð #`ùó îèã æPî0ø ÐЀÀðÐýÐø ÷Pöðö0÷`ø ýà° p ` 0 Ð$` @Àõ°ñ°ì€äâæñ`ü°P`p°úö°ó ô õõPø@þÐ`  ° P ` à €P$&0ÀPö0òðîÐæÐà°âëÀøÐ` Ð P  `pú0óñPï ð ñ õPú@0À @ `@  @ )à$ЀÿpòÀñPîPå à@âíPû àà0ÐPøPð@í0íîÀíàðPø ð P @°PP P à "P)`P ú€ó òÀî0å âPâ íÀûp€° à @úÐòPî ì êëðîp÷ @ p 0 0°  Ð PpÐ'0@þ÷õÀòépãPß çàóÐüpð@ pР °°öàðïpíàêÐê@ðpú° p À@  € p!P, "p°àø@õÐñpçPàÜÐãð ûÐ àPùPòPð°ìðéèPìPö@  Ð À Ѐp€ €0* & Ðàûp÷Àõí°å`ÝPßè`óÀúàÿ0€ PPP °Ðúö@óÐï`íPí0òpú  Àà@#€&РÐþÀú0õìäßpâ0ëðòùÐû@Ð à Ð0ý0ûpø öó@ó ÷àü0` °0   P P ð @ pP`þöàð éàå°çìPñðõ ùPýà`а Àýûù÷öàøpûÀþppàð € ðÐÐ`"ÐÐ ` üõàì@æäç@ê ïðñÐõ€üÀÐ`Pðpÿ€þ üú ú€û ý@p`P Ð @Ð` P° 0ý@÷îçæPç êPïÀðÐôÀú€þð@pà@Ðÿ°ý`ü€ü€üþ@P À° P À€ðÐÀ à@þ÷Àí`é°çÀèìPî€ïôÐøý @`ðÿ0Ðþþ ýÀý@`P  ÐàÐ0ð à þðôípé è0ê íPî ðõ€ø@ýÐÿ @àpÐÿPÿ`þ@ÿð`0à`Ð ð ð@ À`Ð €€þpô îÀêê ì€îÐîðPô øðü ÿ °À Ðþ @0ðà @ðpÀ  P @`ÿàõð ì ëíðîPïñô÷üþ0 PðÿÀþ ÿðÿPð`P 0°°àð à@ pþ0õð@ììî0ïPðÀñÐó÷Àüÿ0@@ ÿPþðþÐÿP  `p0  @  €° P0ÿPö@ðPëàêíÐîð ñ ô ÷ðü€ÿ@0``@ ÿ þÿP @ðp ` PpÐÀ ð0ÿ0ö ððêêíàîðð òàôù`ý@@@@€@Ðÿ þ€ýÀý@`Ðp`0à ðP` °ð @þ0õÐîé`è°ëÐî€ñ óPõpøÿÀ  @àþàÿ@ÿ`þ€ü üàûàý°ÿ€°P ðÐ` à 0°ýPôî èPçàé í@ñ0ôàöû`ÿp@Рàÿ°þÀý ý@üûÀü ÿ°€  @@P`À  €P0ýPõ€î@èæèí°ñö ù@ý0° àð@þ@üû ùÐù@ú€ú€þP€P  àP€ð üàù@ñì`åPäçí`òÐøÀü@ Ðð0 üpù ÷€ö€öðöø@þ@à 0°&°#@À À°û øàõïPêã€àÐãpë0ôPþ@P 0 P ð0ý ÷`òñ€ðÐó°÷Àü` @ à PðàP#`(À$0€PûððÀíÐí°çÐå ß€áçðô Àðà ° €€øÐïÐâ0á ã`êPôþ@P`°ÐÀð*à2à1 'ð ðôÀß0ÝÝ`äàå`à@ì ù ð€#àð°þðä€Û × Öá€í@ÿ @P  @4À?@ð)à€ßÀÈÐÆ°Ðã ä ðpîÀÿ@°%*`*Ðpðì@á@ÕÒ ÏÐØ0ã øpÀPà ð ÐÀ`0p7J D0+`ö@ÕÀ¼`ÆÔ êpìÀ÷`õà ,ð*P% Ðúã Ü€ÓPÕÕ0áÐì€ð àP Pý€à€=NÐO 7PÚàÁÀ»ÀÍÐàPëù`û€p$@+ (ÐÿåÀÔàϰÐà× äÐíÐü àà   ÐÀ )°D°RB@pæ0Ç ² Ã0ØóýPðÿ   &(Ð °Pñ@Ö ÎPÌ@ØÐãÀñÐúÐp 0 @Ðp Ð; PS 6pÏP´Ð°ðÉpä°úP€Ðà## ÿÐäÐpÌàÏÀÝàì ø0 @°° @p'°D`UK %àî`Ƭ ¶ Ïï °`   ð€ Pü`àÐΠÉÀÐâ@õ0 @ðp  À À  2I VC0Ð༨¹Ó ò@ p00à0àÐõ`Ú ÌÀÇÒ åÐùP  € € `à@  06ÀKR€8ððÒ`® ¥¾ÀÞ PPР``ï°Ô ÈPÆàÔë ÿ 0@°Àà P À P.€GVL %°ð Ã0¥°ªPÅÀèP ÐÀpððÐ  üäÐÎÀÅÀÉðܰõ @€€ P€° €? R°U`8ÀpÐЩ €¹PÞÀ!€&ÐÐàpð  PêÐÏÄÄpÕpð  0!€p øÐöPû``€8€OP[`Jà0á°´œ ª ÊÀñà'$€ÐÀ€€ ÀñØàÇ€ÄÏàæ à`À аøöÐøPþ$àEÀW°XÀ6þÀÃ0˜Ð´ß €).0% € @ À€úàãÉ¿ÀÂ`ÙPúð`"`$À€ð÷ÐñPô°ü€&°IYX`6€üÁ°–€¶àá@-2`&ð° àðpÛpÃÀ Ëåp `"аÀõóÐóàúÀà@G]€cPIÐ `ÅšP‰¦× P1ð<ð-p àà P`ìØ`Â0¼ Ê€æ@°!À€Àÿ0ôô0õàú°$R`e`c<ðø°`0‹`³ ì °:<`&°P` ÿÐÜPò »`ذÿ°À+`"`àþ0ñÐêPðàõ`ýÀ À4à]Àn@b@0 áðš ‚@Œ¿üð,@?P;# P PëpÅP¶ µÏ`ôPP%À"`þðó€ðð°öù@ÿ €H q {@^Р³€€P›€áÀ#À?> /ðP€ @öPË ©€«Ãðpà+" ÿÀö õàòíî€ñPýÀðcððO ò@€€ ·àý 2 8À3@+à) 1)°PÍЦP—Àµä€+à-@ øõ°ìPêàä`îàþÐSðð Yž€€ªìà&ð4@0 ;@:ð>-àý°¸@˜°•0Ä ûP&& à`ùù0ùPí€æáPí Ðà;ððÀn#к€€À™àÙ`4`1Ð@H€HÐ*ðü`±0”PÄÀõÐp `° `°õ°áÓ ÜÐíPð+ ^ððPCð `‰É@03P8PPS°9 ºŒà™`Ä0ùà`Ðð°€Àí0ÝàÐÀà÷ Àð ÐWðððB Ú€€ “ Ö û  #`:_Àd`:ô©À‹àªØ@öPÿ°   .À*€ÀÛàÉ@Ë êÿ°p0 BððWÐ߀€ ÐÐæ`øÀðHz@u°9 Ü¨ šº°ß0èÀç`@'=p1 üÎÀÐðãðòøPïù ÐUðð0JÙ€‘ @¨ ½`Ä0ç@,`gðgÐ àÜpÆ ¼¿à»`Á€ãà!°BP@ÀPñÀàêã€Û°ÚàìÐ P1 Iðð ` ó¬€À”P¦Ð¾ ÜÀ-@[pzPe4 ópÞкà¬Ð¬ÂÀâ0-*!  0öPìàÛ@ÎÐÛ ï` à!Ð8ððn€üеˆ`Ÿ@¢`¯Å0%]ày€^7P@û@ʦ œÐ·`Þ@#P$`"°íàÖ€ÐPÞòÿà 0ðð@h ñÀÁ`ž®À—™€Á.@^0hpN <`) `Ëð™›°»àÛ ùÀ 'P;Ð,ÐÐëðÚpÛÝàààí@ -ððPpp ìP¿ ³@‡°Ð¯ÀÀ>0N J [ÐA% Ð@©ð« ½`º@Ö€ø$€4€(À  ýæ`ÔÜÀëÀ !ðða  ü ÅÀ°…° ÆÀà# 4 Q] LPÜ`Ä Àð¨0§pÉ ÷"Ð $0"ÿ áàÚÐå@îÐøðððI`€ Ü€«P„àÀÚ@þ`" ]0[`IÀ÷€åËP› ¤0ËpêPÿ@0!@0€€ü ì°òì€ìó0*ð r@P+Pß “–À£ íàà ý`/PbÀB@6Pàðо0 @½àËÖ`í ( *° `úPêñÐý0KÀl°DPð8Ð`ÖП¶ È€ÞPØà=PA4.P#ððìpÄ༿ðÅ@Ó€óÐ ÐÀ  À  €úüPÀr0Rà`(P€Ù °P¸ ºÐåÏÐû$`?€!P:@( ðô Û@Á@È€½PÍ`å€ý€`Ðà pðàÀFÐa°. Ð<ÐøàÎ`¯ðÈàÅ ×ÛÀÐ.Ð)€/8°$` î ÍPÎÀ½@½€Ô@ñ@ùà Ðppý °mÀIÐ@)ð&ÕP¿ÌðØÐÎ@ú@(@Ð?P+ PîàÊËмÊPÛPî`ûàP ðÀ À `cpLÐð/`ÓpÇ€ÌÇÏàÔÀõÀ &@€A.€°ÀøÀÍ€ËÁ@ÇpÓçPø  Ð0àðàà°àcð2 ; ÉÐðÚ`¶`Ö@ÖЀp   @Ap!à"àÐé0ÏÐàº`ÌÐ׿0ýÀ @pð@ð mP:€4P ¼ÀÂØ@¸pÑpÝ@ÿ  #€!àB(à€ô Ì Î`¾ Ê Ó0ê`øà `@à  p 0OL = ÛÎàÕ°Ñ·pÙçP  3À4ÐÐ áÐÖΰÂÆÙ æ û Ð`pÐPà>\` À>pìà¿ Êð×ð§×ðã Ð à'à+= " "À @èPÓ Ì`½ÐÃPÙPå ÷ € 0€ð*€c,@°:` »Èá « ÎÐáÐý°ÿà!0"P<€#+p@÷PÕ@Ú ½°ÅàÏ@âPè€ÿà ÐP0! à.ÐgÐ,Ð 9€ à¶PÆàÝЪ°ÈÐãPý€ÿ°#P'°; %)ÐÐúPÎ`ßPÄ0¶ÌàåàÐþ PP%p .€e0À 3» Æß`² Â€åÐû°ý P) 9€*-ÐØ€ÞÐÆàºÈÀã`à@ûàp$Pð )g@8  +¿ÐÂßнpºÀá`ú0ûÐ+Ð6à-2ÀPðä°Û ÃÀÆ0Æ@×Ðßõà€Àð$0$ #à9€i 1 Ð6à À´@¿pÝШл@ã€üàøp"0-@:ð,°3°ÐÞÐÙÂ@ÂÄpÜàß÷à 0`(°" !HP^p!P Ð7Àö°¶Å`Þ0§ Ãàèþ ùp%-`8 +0P0ÐÚÐ×pÄÀ`Å`ßâ0÷P àP%$'à\àU  04ÀæàµPÈÐÙ¥0ÈÐðàÿÐþ-2 9/°-à PüàØÀÌð¿pÅàÄ Þ êýð @ð °(à&à8ÐkðC +p à¾p¯Ù0ÀªÀÔ@ÿþP €4@?@5 .%°  è0ÒÀÉ`¿Ð¾€ÎÐáñ0P  €%P'P,_°\À$€ 30õ¯·pà «pµàæp ÐüÐ à6 B@/à+ p`ÛPȽàÅ ÃÐÔpê`þ  (À'&>nD€ p%À$À¢Ï`ÎP©@Ȱ° @P/àE€A°+  ïðÉÐÂÐÂàÄÅ0á@ø`'à+Ð& /Ps`[ðÐð0pä§€²Þ௠´éðÀ#`;ÀL€2Ѐ ÐÓ0» ¿€Ë@ÁÐÒ óð@ 0P+'P`l@-À.ÐÀ±Ðž°ÖÁP­ÐÐ @P.PH0@ +° ç¿´@ÇðË€Ë æ€Ð à)°0*ÐLÐmÐ=$Ðp½š€ÇÉ ±`ƠЀ°)`GD0-€ àëPÄP´ÐÄÀ˰ÉÐáP Ð& 1À,àGqPE p!`Å špÀ@ΰ²àÀ ûðð'ÐBJ 0ðpóÀȸ ÁpÎPÊ@Ýû ð%0°/PIàpEÐ #PưœÐÁ°Ì ²0ÂûÐ`À&ÐC€H-``óÉ€¸ÃÎÀÇPÜ úÐ àð$1 3WPnð@° 'P`ÁžÄð±Äüð À'`F°D)ð °Pð0ǺÐÅ Ì Çðàý  ` )0P7 mpbp,Ð* ôp¯¨ ÐP·p²Ó`,`N = ðá`Á¿ ËÅÐÌ@é þ à@+Ð40QoàJ€`)ÐàÏPªÐ½ Åа»Pé p 0"Ð>ÐJÀ,ðPPàϰÅ0ËÀʠÀØñ@À !°0P>°jp_P4"@*0û€¿°³Ðʸд Í°øÀP€*°A6#ðàëpÐÀÎÐÍðÇðÎðâ0÷ÐP(5`WðeCÐ$ -à€ÚлPÅðÂж`À`äpý@.Ð4 %ÐÐýPá°Ö@Ó`ÒÎpÛñ ! 2V]=,À0`ðÞPɰÎÀÅPºàÃ`áõÐþ@À&À&`€€ Ðþ€ì å0ÛÖÕÀáÐòÀÿP ð .€EOà9°* % Pë@×`Ô€ÏÈ€ÎÐà ôàý0 PÐ  óèä ààÜ0å@ö & 8À=Ð3€%@`ùépápÜØÙãðöÿ` àPàü õpð@ìPêPì@õpþ°Pàp! +Ð, &ÐðÐ ÐûÐî°è°æ`âÀáPé ð°õ ü€° ÀðÐü÷ òï@ìòúp`@PÐ!P! p` pÿà÷PöÀìPìîÀí@ñô ÷Pü°þÀÿpp€Ðÿø€ù@÷ö°öþp° p 0P0    ûú ó ô`õPò`õ€øpø ü üàþ0ý°üPüÐùðûÐýý °  @ Ð Ð PpÐ Ð à `ÿ°ýü0øü@÷ðùùàúøPýÐûPüPü`ý0ûüàýàù0ÿ`þР°à `P  À° 0 p0 @û°ðú@ÿøPÀ÷ü ù`üú0ýàö þ`üùðÐü€@þP úà ðü ÿÐÿ @``ððù ú ÐúPþ`ûð0ö`ü@ö ùþøpùààý€ý ÿp0þÐÿ€ð@@à°Pû €00üpþPà`€Ðþpþ P0üPPýàÐÿ°àÿ@ÿPýÀ€þ°€@þ0pû0Pþ `@ÿ°0ÿ€ÿð@û@þPüàø@Àÿ0` úp@õ øþ Àà`ÿ°pðÐP@À€ü ÿ€ü@Pàü ÿ0pÿ@ÿÀÀÿÐ@þÀ þ €Ðû þ@ðÿpPp€à€ú€þ€ ÀpÐü þР ° ÿP@`pp`ÀàPPþ€P@€ÿ °PýÐÐý0ÿÀ°ð à`ÿÿ°ÿ`ÿÐ0ý0°ÿÐð`þPàðÿP00 ÿÿppÀ PÿÀ  €ÿÐpÀüp ðþ@pÿ `P €ÿ@@ÐÐÿ€ð þàÿ€þðÿpÐÐ0þp@ À€p þ °ý€0þpð@0üÀþP€€P°ÿðp ÿP°ý€ÿÐþ°Ð°þÐ@pð`ÐÐÿ  Ð`Ð`  pÀ€ÀppàÐÐÐ  ÐÐЀÐ@ð0ðððPPÀÿðpP   €ÐÀ  À€ pP `À°€ ` PÀ@ p€p`ÀpP€°P€  €À€€° °     °°° À  °Ð ÀÀ €p° p€  €° p€ €À€€€ €     €  €€€€°€€€€€` € p€€€€p  €€ €pp€p €p`pp€ °€ €€ €p€p°`€pp€€€€€p € °`pp°p€€ €€    p   °        ° °ÀÀ  À ° ÀðÐÀ°ÐÐàÐаÀÐÀ°ÀÀÀР° ÐÀÐðÀ°  °°  À° € €€€p€€ p`€P`€P@ P0@P€ p€€€€0PÐÿ` `€€€€àÿÐÿ €p`@pp€€p€p €p` `0pp °0°ÿ €€` ÀP€€P€p €` P€ `€ ÐP ÐP €p°PÀÀ€0аÐ °€ °`Ðÿ`àÿ€ÿPp€@`ÿ°p ÿ°ý ÿÀÿp°PpÀpPpаP€Ð° @p°ààà ðÀ°Ð  ÐþÐýPÿ@ÿ€ÿ€ÿP Àà  à€°    þ û`ùõópóöÀøûPû ý   p@Ðp ``%P €Pàþ ú`õ@ðPêÀå çñàû`€Ð à`  @þ€í ê`îð`ñó õúpà  P P 15P# ù ñ°éâ`Ú0ÙPãÀôÐÿ 0ð Ð0€Àö0åðß@âàáÀàÐä@ìúP À°P 8PJ0=û`îÀëÐâð×ÐÍàÉÓ î@`0 €@# $0PàâÀ×`Ø@Ú`×€ÛÐç@ú0 P 0`À; N0@ðÐñ è°èÀÝÐÑ0ÉðÊÐÙ ùÐ °À Ð'" `ïÔÐÍÐÓðØ Ø`à€ð ÀpÀ!ðA0Tp<0Àç@æÐèp×ÀÉPÆÐÐäà p `'°'0 `ä°ÉÈ ÓÀÚPÛç üP@  0P/ TpXp(`ïðà0èPãàΰŠɠÜpùP&@$ð*"P îÀÔÀÈ ÎÐØÐÝÐâ€÷`ðÀ`P@# IU-pôÀäìÀçÐÀÇpÎÐâÀû%À "°'0Ðì ÙÀÉ ÍPÙ€ãÀèÀüÀð€°€  pD°\Ð?€ÿãÐèpì€ÑÄ0ËÀÞ ø)!À'Ð`úÀã× Ê ÎØÀåPî°@ ` P0°ð/@[€W°€ç`ä@í Ù Ã`Å@Ó î€-`(€°à%PÀû@âÐØPÏðÊ Óãñ€þÐ@`p `€ÿ0üàýðN€eP=Ð÷Pà€ç`áÐÄ`¿ÌäÐ*à2°"À°€þÝ`ÌÀÕ ÛPßàÝë þP0 û0øÐ÷`ù À]`uB ó`Ûã×pºà¹ËðéÐ`<À:$0P P ìÎ ÆÐÍ@Ô`å€òÐýЀÀ€ `÷`ñÐî@õ`ÿÐ$gz@BÀïPØÙ ˰´`»€Ðò€àHA'@Ð ÞÊ`Ä È€Ó óÐ` 0° à€÷Ðìðè@î ÿ` €@y y@,ÀÛ0ËðǶ±àÅ ÝÀ :ZB#0Àæ€ÊÀPÃpÒ í0 ` @@àô éàæàì úP \ð°Ðų ´ ­º Ïä@UÐiàC PðÒÅÀ°ÅÐØàüPÐ Ð ðÿ€ùè`áÀä`û@ à"mðo@ @Ä€­Ð« ªÄ`Ù`ó°-0_@c =0€÷`ÞÅ0Ãà¼PÓpùP ð`ø0ô°òÀä çö ð 0  dð@x``¼€žàŸÀ±PÍ`ßÐò)[ÀhDPêpÏÀÃÌðËÀÒPæ° °%P'0à ö ññ`âÀâ ë` .€sðÀiÐÀº ˜@›¬ Ô°åþ 4P^aBäPÆ€¿pÎÀÉ€Ö ïp $à&`úPê€ïPòàë`ï`÷ @àYððÐ'pÌp —`®àÏà î PQg M`*ïàÉÂPÍpËÞÐð €P$ þ`ï í€ïÐïàóPó ø `&@kðPvpà¿P—P–°0ÕÐâ0õà PMa LÐ'PíÀÆðÀPÑÐÀØðÞPýÐ0ð&Ð ïç`æ ìÀñó@ú@p)€tððjà Àº‘`—À¶ ßðãú°! I€YðQ$ëpÃÀÀÌPÔ€áðäà÷p0* "P Àîpä@ãàó ù@úø  4 ð@VýЯЋРðÈ å æü€ðDXV Àè ÄPÂPÈä ë°ì@îÐ À@@Ðàê°ëîöùðþà 9wðàN€@»P”p¢ÊÝ êÐù€1°PR+þ ØÊÏpØÖ0Û épÀÀ%PÐÿ€îî@ôðÿ` Y pPSP ÐÖ0§Ð¦0Æ€ÚðàôÐà:ðE 9pò@ÏÐÐÛ æ@âá`â°õÀp#PÐ ó€é@ñÿ` 0/ O\pA0Ý€¼à´0ÈÖÐîÀòÿ ,à4à5PÀ°çÐ߀ÚÀÙ@ÙPÚã0÷ 0  ÐÿÀùðü €àÐ9`I ;P$ðø°Ûp˰Ôp×0èèô ü @ Ð*°"` õ`ïÐìPä`Ü€Õ Üì°P°€ðÿÀ@`"4à:0*€ðø°æ0ÞÀß`âpçë@í ú P`à  Pûïæ0ÞÞàäïPû @Р ð Ð`&Ð+Ð 0PüíPè`é0îàïÀð@íó0úð À0 ÐùàöPõò€îàî°ð€óàúP `0à p @ðà ðüàøPùÐúûÐ÷ôPðó0ù` `Рþýý`ÿPÿÐü ùPù°ûPÐPðpÀ€0 à   À pðàPÐ`€ÿûà÷€÷0ùü ý@ýàû úÐú0üþ P@ÿ ý`ý@þðÿð€ÀPP€`€ÀP°°@à`€Ð@ÿý€üüüûûàúÀú@û ü ýPþPþÀþþÀþÀÿ€€° Ð ðp € Àðp0Àà°`ÿÿþ€ýÐüüàüýÀýþ€þÀþÐþÿ€ÿP``pÐp °°0Ðp`ÐÀ€а 0ðÿÐÿÐÿàÿ ÿÿÿP`À ðpPP€ P0 Pа€ °p@PP  `0  `     Ðà°àÐÐР €€€ °ÿ@@0pP°€p p  €€€ pp  €p€p€°  €  €À €p p°€ €À€€€€  €€0P€€€€€€€€ p  Ð`€°Ðp€p€€€ €p €pÀ°  À  ° àР° °€ €€€p  `°     °   €° € pp°p€€  °€p P ` p°€€€  p  € €   €  €€€  €  € €€€€ °À   °°P°      °€   `Pðÿ  p€0  ° € €€€€ppp`°p@€pP 0@P 0@PðÿpP`P @ðÿ p ppp€€€``p€p€p€€€ °€°  °ÀаÐààà° `ðà0  Ð àÀðððÀ ° àÐÐààÐÐÀððÀÀÐÀ°À    À À°°°À°°  ÐÀ°  À  €°   À pÀ€€ € À  p€€€€€€°€€p  À €€p€p``€`€0Ppp```p `p@` pp€€€€€€€`` €€€€`€€€€€p€€`€€p `€€   °À`  p€`p€    ÐÀЀР `þÐàPüàü`þ€Ð@`0p °0p` ðÐ`ÀpÐ0 À° 0@€ÿÐÿP€€€ ÀÐ` ÿ þ`ÿ ðPpPý`üÐýàý@üÐû þP@ þÐÀРàÀpð ð`Р à÷ ñ@éÀäPçðì ñöPûà° @ ðÿàü0ýðþ à!B9ðP €õpпÐpâÐÝÀêP #@*  03Ð@å ×pÙ0Ô€ÍÖõ€`@€À ` *0KÀ-@P° ÐóÁPÂãðò à÷"`+#P€ úÐãÐÞ0ÝØàÙæ0û€p € ð0€@à°Kp@ 0àîÀÀPºpÔÀï0Ý ù0&) '€ì`ÓPäâPÑ Þí Ðpp€ð°úøûþðúð"ÐY >Ð%P å±ÐµÝ ìÐÛÀ Ð4 /Ð% 0 P×PÐÜà××°íÐþÐ@ 0ÀPñPó€ô€ûPÿàn0_àP€Ü¯@¨`ÈÐû`ß €>BÀ,P PÙP¸ÐÔàóðçpñÀÐþPàòç€ð ûÀÿPP€<{R ààøÀ½à—P²0ÝÐàõ/ÐS@? Ððö@á°¿ ç@ópøÐ! 0ó öpíàÝÀëÀû@ àÀ4ðÐ[ ÀöÀ³°›àª ãP  .Xð@ÀPûäpÕÀ¿`»ô°  `$PÀüÀßåì°ãë p €P@'°S\@ì°ÿàÇp³0«ðÞ !° EP>ð ÀðÜÑPÐPËë` $0#à`Pô@ÔpÕ°Þ€ñ ýÐ ðÀ P+lB@úPôàð ¸@°À úÀ#ÀP*pE"ú âP×°Ô€Õ Ù@P *° ðPëàäÐË`Ü ìÐýàÀÐ Ààð PdðR0€êÐö ¿ ¶p¼°õ "à €Ð>ð(Ðú@Þ Ô0Õ`ÝÞPð!% P î0å@ÐÀÓ€éÿ P€`€ðÿÐ0 00ðl =àëý ä ´À®Ò à0`.;ÐâÐÐÐÐÀÜä ï%PàÀß@ÓÍßÐöp ` p@ÿþ`À.àr`G ðóä`²À¬@Ñ@7 P*70@Þ@ÉàÌ ß°êPõ /À!°Pø áðÓ@΀ã@@ 0 pÐøÐÿÀÀ ð.Pn€DôPæpà`¶ ¶Ðàð9p*#€-@ ÜàÅÍ å€öÐÿ@ð*@õÒðÐßPåP€ üÐý@üP°@``d @ØçÍ· ¼ðô .?€`%0Pò ÈPÃÀÙöàð  )(°öðÙðÔáàÛp÷°P ÀPÐøPý  €Ð0@_0=ÐñÙÀذ¿ÅÞ 9 2@0@ÜàÈÒí  0"PPàì@Ó ÓàæïÐàÐ àúú`ûÐÀp,[Hа×P×àÃ€ÃØ° à57ð000àÆ0ÍPêÐ@ÐÀ@PñÚàÎáÐõ@À0@0 úÐöû@°#àMNÐ àÔÀÓÀÌ€ËpÙ€.€<# `éàÏ0ÍÀ倀à0  0ò êÞ€Üð0 ` Ð 0 PÐûpúPÿ@ €7ÐMÀ/ îÐÐ ÒPÍ Ö ï€à53`p`ô`ßàÏpØPôp@€P °PëápßÀë0û@ @ Ð üü°üààð +ÐCà3 û0ÓÐÊ`Öà@ñ °-p2°þ í°â Ù@ÜÐï  `P0°ûðí ô ì@ä ó ðP €À°öþ 0% 4)Pü@ÏÐÎÐÚàë ÷Ð#.P€û°ç äPáäòР`Pù0òô€í ëÀ÷@€Pþ`à Pþþ  `  P° " æPáæPïàõ@ àðàò îì@íÐñýP ` ÐýP@ú é åÐô€ÿÐû P ð@ €6p)`Þ ÙPÛ€èñP+ð@`òÀéPâ€äÐëpû°€ P€ô°î ì€ð€ €  þ0øÀôðò öÀ Ð €  ðpàþ 0 pP  °Ðû`ò°ïàö@ü`°P`Ððþ@÷@ôöà÷ú0û  0 à0ÐþPúPÿ P@°0ó`ææÐðøðþ`   òÀìï°óú€  `àPüÐõ óÀôàø0pÿ€úðp @ÐÀ0 €  0þ ÿ ÿ0û0÷ûð@`ÿ°ÿþ ýûPú ü PðPàüúÀú@úúü@ Ð   ðÀÐÿ€þ °à ðû@ôÐôøû ûÐþ `° Ð ÿùö0øúüý°ýúû€þ`ðÀP` Ð PРþPý@þ ü€û`üÀþ P`PPüpøðõ öÀøÐûÀÿPp P PÀ` Pý€îàåèò@þPð P p€ 0Ð÷°îí ñúÐP °  ð0àþ`øPô ôÐøÿ@@P  `àü ùú ÿÀððùÐòPõþ ` ðP°Ð€ð@þ°û0ý€P ýûúPý €`Ðý`ýþ ÿPþü`ûü€þ`ÀÐ   À p€À@ÿ€û ùàúÀý`àPà   Pý öòÀñ ö ü` ÐÐÐ`pþðü@ý ýàýÀþÿ°p@    `@Ðþ°û ú€ùú`ûÀý€ÿ`P°Pÿàü`ûPúû0ý0pp À ð p°€à€  ýpùÀö€õ@öàùþp°Ð°`à  þüû û@üàü ý@þàýðý`ý þÿ€0°@ @  ÀP€Ààþ@þàý`ý`ýþ`þàÿ°ðàp@þ üàù€ùù û0þ` € ` pÿ ùðô€ò ò@óö úÿ€€p Pp€ðÿÐýü üÐû`ûûÐúÀúPûÀü0ÿÐp  P ° @ pðÿàý`ü`üüàûü ü°üý`ýþàþ`Pðÿÿ0ÿ ÿ àP    @ p P p`ÿ@ù0õpóóPô ÷€úPþÐðàÀà °þ ü€ûûPú€ú€ú ûûýÐþPP0p p Ð Ð0p P0ûPøö€õàõ@÷ùÐûþP@@Ð`ppýàú ù°øø€ùûÀþP àP€ 0þù€öõô@õpöàøàû þ 00àÐÿüúÐøà÷€÷øàù`ý€@ P ÐÐÐ ðpþPùÐõÐópóðóÐõ ÷úðý`°°p@@pýÐú øÐö ö÷ùý€ðð Ð `0p€ € ýø ô òÐñ€ò0ô ö0úý€0°ð° €ÿÐüù°÷°õõPøpüÐÿ àP P РÀ` PÀùõÐñðð ò€ô øðü€@ €€àÀüPù€ö ô°ôøüPÿÀP  P€`p°P PûõàðÐí@í@î`ñö üÀÐ`àР`ÿ0ûP÷Pôóðô`øÐû`àà ð p  € @àøñàëé@èÀëòú€ @ @ €ÐPÿúPõÀñÐñô0ø û0 ð`à° Ð °@`@`°ýpó0ëpå€ãPæ îø € °À    ÿðøô ññ0ôÀ÷0üÐðP@ÐÐ Àpð€@ @ý`ð æßàÞ ã í°úÐ p@P@ ù°òÀïðòöÐú ÿЀÐÀPà€ @ `0@÷ðèpÞPÙpÜ åPôP 0ð ÐÀùpô ñPñ°ó€öÐùûàüý@ÿPÀp ð €à À   íPß ÕðÔ@Ýê@ûPpÐ `0úÐ÷pöPöPõ0ôò€ñÀòÐö ý° Pð ÐÀ @ p ÿPë`Ü0ÒÒPÛê€û À` àþ üú`ö`ñ íðèPé î`÷Ð0 @0ð#`'€ @ÀþÐæPÓ ÊΠÚPïÐÿ p` 0 à ÐààþÀõ@ê`áPÝPáÀìü °ÀàÐà @ `"Ð-Ð1`(ЀôàØÐÆ@Ç Ò çû Ð@ `àõ äÀ×PՀ݀ëPû0 ðÐ@ðàÀ (À/,p`ðàۀЀÒÐÚèàò úðü€ÐàÀРP à÷Pç0ÞÜá èPð÷Pþ  °ÀÀàðÀ*p/°'0ôàØ ÍÀϠ݀ë0õàù€÷àûàÐ!P$pÀÐìÐßpÝãêPíPîÐîö`@p€ À € 4 8`,Ð @ë€Õ ÑÛ éðí ëçPëÀú€ &Ð*PóPéÐéíÐí`å ßÐÞì0ðÀ€@p € €p&/P, € °ôçàðÜ Þ°Þ`áéàö€ `@àý õÀîpçâ Þàààèpõ 0À P@p@,€3+Ð÷På@àpáPâ`ßÚðà ò0Pp0 @ü`ï€âÚPÛÐáíPö`ÿ 0àPÀ  )`6.pÿ í@ëðèß ×PÔßàõPPÀ P €ü ë á0ßåàãðèí0ù` àP` @ 1Ð4'P `ø@ðàíãÀÖÑÐØ@ìPþ` °Ðà@ ý ïè äààpÞðàpê`ù P €Pà p `(9*ÐpðùõPäÑЀÜ`êÐøûààà PpÀöÀó çÝ`ÛàßPîÐõàûPàð 0 à ðÐ/ 3€ Pð€û ïÙ€ÏÀÖ ã`íÀõ€ÿÐP€À° P€ø0ëpÝPÙPàèÐï°ô@°€p Pð €@6`1àp@ ÀÿpéÐÑ€Ð`ÜÐâ`å`ò PPÀ `óPæÛ€Ü à ãÀî°ø€0àðà°   p à @3,€0p ÐúäÀÒÐÔÀÛÞpå ÷ €@ ÿàð°æÐÝpÚÝpæPóû€ðP   Àð àP-Ð1PÀðPýæÀÖ ÔÙ Ýà õÐÐ  "0 ò`ê°Þ0ÚÝPêÀî€ù`Pp`@ Pp PÐÀ°(5à$`PîpÞðÓðÚ°ÚðÛÀñ € P`ÐÀöÀîàß Ù°ÜÐä îàùÐÿ€À@P€ Ð @@ÿ   .à0 "p ùâ`ÓPÖ0ÖÚÀåû° € $Ð `üÐñð䨨pßÐìñ0ÿ  P` Ð PÐü0ÿ  À$90.`" À ð°Ý@ÑpÖpÔÙÀî°€ €!À'Ðù ì`ÜÔÜàá@ðPø`Ð €@û°ÿ°P,À= -`#à0逨àÏÀÓ`ÓÛöà€% "pàÀõðä€×@ÑÀÝPå€ð`ÿ  `PÐð pýø€ü°` .P>`2P$PPç°ÕðÌàÐPÑàÜPõ Ðà$°'àþÀòpáÓ€ÒàÜåàõ°ÿ Àð` À`þàùöÐûPpà0@P4À% ppå ÒpʰÎpÐ`Ýðö €!'À#0üÐîàPÒ0ÑÝêà÷€ÀÐ@À ÿÀø`ôpó@ù@)°BàCP*p ðèàË ÂÈÀÍ@ÛÀò À#'%€Ð`èðÞ€ÒÐË0ÖPê°ù° а0ÐýPöðôÐó€÷P€$ AI/À!Ѐì ÌÀÁ ÄÐÝð %($`ÐâÖpÕPË ×Ðè þ€€€pðpüpî`ðÐò õÐ0#p?€NÐ<"p öÀÑ ¾½°ÌpÙ€í Ð#`*P)°#p`èàÔ Ò Ï€Ö`äÐûÀ € €`øàëàìñÀöÐÿ€p 2KL`+ €þ€ÛÀPºPÅ Û@î @ 0-°)P!pñPÖ€È@ÒàØ å ÷@àÐp Pôàëðæpîø°ý` Р*Ð9MÀC`0°ë°ÎÀ¸0¹Ï ê ýð€+p00'Ð`û`âÍ@ÍàÙ ä°÷Ðp!ààù€íê`ç0õ°ÿp à`$0.Ð<H 7p ÷áÀǺ ÃÝ ÷P 0,,pP à÷ÐéPä@Ó@Ò°ãÐñ ý °PàPüðó€í êPîàúÀ@$À*6D1ðÀòðßÐË ÂÇ`âÿP pÐ'P&@ÀïÀçè@Ù×éúÐP `ÀÀÿ÷ñ@ñÀì ñ üð p@p°#à+< 9 @ø`çÀÔÉ@É Û°ù@Ð °! 0ðñ@çç áÀÞéÐø@` P @ P @0ùòÐòõöÀù€ `+P9Ð-€ `ðäÐÖÌ€ÎPåÀ à ð ÐÿÀéã°ê@é€åpí`ý€ €Àð À€öpòÀôø`úÀúPÐ@ P'8°5P`ñã×@Í€ÎPß ÿ @ 0ë€àäðì0ïð üp  à@pþ@ù õðððùÿàÿ@  ÀÀ ` "P::°0ñ`ßp×ÐÑ ÐÜ€þPÀÐ@P àðìÐÜ ÞÀéÐøÐü ûà p 0þ0ø øÐþÐù@ø÷PÐ  P PàÐà7Ð?ЀôÝÕ@ÕÐÒÐÙ ÷ `"p Ðððß ÜðêÐøPþþ Àà P÷€õàø°ú û€ùàý0 p0 `€03@@P$ øðÚ€ÎPÕØ Ý ó`Ð#`#À@úPð°ãÝPãPô pÿàþûüÐñðð üÀ°0à  p0(ð@@8@àåÐÍÏÐ×Þ é0ÐP)0 `øðàæ@áðâÐïÿ ° à€0ÀûðôPñò@ú`0 @PÐ@P0Ð 0€/FÐ7PÜ@Ã`ÊpÙ°â ïà  Ð+!ðñèàââðä°í`ÿ°Ðàаè ÙPÛ`å0ÿà 0 þ ûPü€ à.pI0C€Þà»ð¾Ö`åò ,P,PÐòáPÜðàêÐî0ûР ððè ïò`õ`ùàÿPp` `ý`ü€`À°°  @ÐH*@õÀÉÀ¸@ËàÐð€!€*ðÐæðÚàÜPêòû  pýPéðâPî ÷ýÀÿÐÐ @ðÀÀú`ü €`€  ð80N 9àͰ`ÂàÀôpÐ@(ð#à ë`Ø@ÖPèP÷þ°ð ЀÐðýã€Ù`á@õ`   `Ð 0pù ø0ûà @ €À€:ÀIÐ2Ðü Å¬°Ä@åàÿ PÀP#   ìÖÒPæ0ú€ à ``ÐPûäÀÚ ã úP   P PÀý`ù úà à  Ðà ?`>Ð@åຠ´`Ó õ ÐP°PPÐçÀÔ ×`î@` € À÷`åÝæ€ü Ð0 €``0@üpû° À€1?p.ÐpÑ ²Áà  ðÐ` ù äpÕ°ÞòP`PÐ Ð PpÀó`æÀáïÐÿÐ @ ÀP` pPþ€P0 PP01à`ñPÉл@ÑÀïp `  @Àõ`äÀÝ è°øð pàÀý@`ñÐæ0ç°ï€ ðÐ püàP@Р 0&07Ð.° `æ@ÿ@Õ°ó0 €@àÀÐà@ôä@ßç ö PPà ð ü€õ`ïPë`ðøÀ Ð à`ÿ@ÿ°àà ÐÀ 0 àP ÀúåÐØÛéðý €à`þ@ú€öóó÷°ýðàÿ€ý0ýÐý þÿþPÿpÀ0€ðÿ @ÀàÐ Pðî ÝÛæ€øðÀð ÀàüÀû úpøPøàøÐüP@Ð` @P0PP€à` 0аð€àÐPÀ P Ðùpïpëðíö0ð Ðý üàûÐû€üÐü€þPÀpp @ÀPÐààÐÐðpPÀÐP°ÐàPýôÐîðö°ý0€ Pàý€ý ýý ýþÀÿà@p`P0ðð@Ð €°pÐ@ü`øÀõÐõøÀûà`ÿ`ü€ú ú ûÀüàþ@ p0€à@àP ÐÀ"pê°Ò ÍPÚ óà Ðpðpý@ûðú@ùõ ð€ïpô@þ àP` úøPùýÐÿ° Ð `àÿÐø õ û  @À `ðP`0ð@àþPüPü@þÿ°ÿpÿþàýþ@þ°ýýàûpû üýÐþ`PP`@àp ð°ð °°P €pï ã`á°èpöð  ð ÿüûpûÐú ø÷ø`û@ð  @þ@ù€÷0ùàý€ð€ ° ÀÐа°€ °ÿPÿ0pÀ0ÿ@þ@þàþàþÐþÿ€ÿ`€À° °``° ÀàÀþ ûàøÀ÷Ð÷0úý@ÿ€`Ðÿ@þÀü0üýàýpÿP` à0@à ààà Ð PàúÀñPíPîÐôPý€à@ à`àþýÀü@ýPý`ýàü@üþ0ÀÐ0À@Pÿ@ý`ý°þ€Ààà0 Ð  Ðð°P Ð0Pð  PÿÐþþÿðÿÐÐа °ð€P ðÐ`pP° `àÿ €ÿÐÿ ÿÐþàþÐþ@ÿÀÿ€ÿ0ÿÀþÀþ þ ÿÿ pÀ ÀpP0€ °ð` ÿ@ÿÀþ þPþàþÀþðþ0ÿPÿÿàÿ @0PÀÀ0PðÐ` Pà`Ð@Pÿ€ÿÀÿ ÿÿPÿpÿÿ ÿ ÿÀÿÿpÿ ÿÿp0`Pp`` °ð@Ðp€P °0à   Pàÿ@ ÿpÿÐÿ  ° p`  À`Ð`ÀÀPàÀ °À°À°àÿÿ`P0PP€p`€€€  °€€  À°  €€€@ p €°€     À°  €€ `€p °€ ÐÀÐàp€@€ Ð0 €  Ð p@P€°PP€€€p`P €pp00À€€àÿ €€€° p€``°  °€ppp€°ààà € Ð €P°   àÀÀ`àPÀ€ 0PðÿPÿ@@ P@``0ðPððPÐðð€` À@ÀÀ Ppÿ0ÿÿ@ÿàÿ°°  ðÿÿ0ÿÐþ€ÿ P`ÿàþÀý°þ@ÿÿ€ÿ€ÿpÿ ÿ€ÿ€ÿ€ÿàÿàÿ@ÐÿÀÿÀÿàÿpàÀppppà ÐÀ  Ð    € ÐÀàРpððPàP` pаPPP0 Pð ð ðÀ° Ð° @ °°°Ð° Ð°àÀ0` p€ àÿ0`° Ðÿ@€Àÿ 0€€Pðÿ`€ðÿÐÿàÿÐÿ ÿPÿ pp àÿðÿ`pàÿPPp`p@`@`€p`p€pp`€Pp€P`€À°Ðð``€ð€ÀðàР  ðаÀÀР€   Ð°°€pÀÐÀðÀ à°°  €€€€pP°€PP€ €p €€€€p€€  Àà À°°°€      `€ À°  °Ð  €°  € ÐÀ   Ð°€ ° À Àp  À °°     ÐàÀ€€   p€    €`€€€pÀ €€€  €€p@p`°°p€€ €p€ €€€À P€ pP€€€p°€p€€€€€`p€€€p€€p€ €€€€€€€€€p€p €€€ p€p€€p°ÀÀÀаðà   ° °  ÀÀ Ðа°   °ÀРàÀ°°°À    °° °€`€°À` €€p€°€€°°  °  p€  €€€ €€€€P€p€€€€€ °°€    Ð° °        °° °Ð°ÀÐÀ °À    àР   Ðа  °ÀÀà°p°   €` €p €@``P`P°``PP`0` p€0€P P0 P€€€p€€€€p€ €€€p€p€€€`€€p€p€€€p€pp€€`€€€P`p€€€pp€ p€€€€€`€p€€p€€  €€p€pp€€p€`  p€p€€€€€€€ÀÀàààÐð°À €    ° ð°Ð°ààÐàÐÐÐðà °ÐÀÀ° ÀÀ° À°  ÀàðàÀàÐÀÀÀ Ð   ° À     °€ °  `     € €Ð``@€pP€@P P0@Pp@`@`0`€` ` €€€€€€p€ p€ €€    °À à   ð  ° ° À     € °À°€°°  €€€ p p °   €  `€ €€€€€€€€€€p€€€€€€ €€€° €€  €°€ ° €€ À  ° °Ð°        € €€p€ € P€€€`€€p€p `pp€€€€€€p€€€€p pÀ€ €€€€ €€    À€°  À °€€` €€€€€pp€p€€€€p€`pP€`€pp€€€€€€€pp€€€€€€ €€` € °°€€ÐÀÀÐà °°ÀÀÀ  ÐððÐÀÐÀ°°ÐÐÐаÀ° °°  ` ÐÀ€ €p€€€P  P°    € €€€€0€`pp €€€€€€€ €p€€ °p€ €€p€À °°°Ð  °°ÐаÐÀÀ° °°À°      Ð€À  €    € €p€€€€ €€€€€°p °€  p € €P€  €€€ À€  °  P°À€° À  €€€  €€€€€€€ €€€€€€€ p  ° €°€ €€ p€€ €€ À° ° ` p`€°€Àp€p €  €€€°€° ° °  €€ °€€€€€`PÐp`€`€`0``@  pppp€€€PpP€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°pp p€`€€€°p€ €€€€p `°``p€€€€€p€€€€p€€€€p€p€€ €p€€p €€` pp  €€€    €°°À°  °°`€ °  p   €€€p€€° €p€€pp€€p pp€€P€€€€p €  p€p€ p€ p  p° €pа à°p  °°° €°°°À   €€ðýüúüÐù ý€ÀðP@`Ðàÿ°pÿ ÿðþ@0   `€pPppÿ@þÿpÿ°°°ÀЀ ° °Ð°°° €Àÿðþþ°þpþPþPþàþàÿ ÿ`ÿàÿ`ÿÐÿ`ÿ`` PÐðÐÐà0Àÿ û€øp÷À÷@ùPúàüP`@ ÿ@þPüÀúÐûÿ°À  0@÷í@éÐíÐôú°à Ð P°ûÐö ôÐõpùðúþ`Ð@`Ð à°þ€ýý þ ðÀÀ0 € @ À °PPàþû€ûû0û`ü€ýÿÐÿàþPþ ýPüÀûûÐû þ0ðP 0P@À 0€÷Pê á@æÐî õ@þP`À p@àö ñ îÐñôPöþpPPð@ÿ ü°ü€üÿPP `€ À ÐÐýÀúõô0õðùàþPpð þÀû€ùø@÷ùüþþ€`ð  P ðP Pú íâ€éPð`ôÿ €0 аðþðôàðÐï óÐóàøPP` `0Ðþ@þP  ` ðð0À 0ý÷€ñòPõú þp  ðÿ°üPùÐõP÷àøpúû`ý°Ðà à#À °  öÀç0ãéÀíPô@ P   ``û ó ïÀï@ñò`ûðÿ@ÀPp0àýPÿÐÀpÐð`  àòÀèÐë íðÀúððð  àûðøÐõóô ö ú þ ð` € `°€õpîðæ ëí€ô`À Ð 0 ÐÐýpø0÷ ò ñ°ô`ùûÐý Pàà`Ðð !À @ üîéÐí0ëò þ@`€0 РþPý°øÀôÐóõÀöpö ûðÿ€àP `p ð@ ðÿò0éðêpéíÐùÐÿ P ð PÿàûóPóðòô0ô`÷þPÿp p° P°#PPúîëpè ç ñàûPþp Ð ð@0ùðôàõàòàð@ôøü ý°P  #` 0P 0 õÐêêÐå ëp÷0ûP@ °° ÿÀ÷p÷ó`ðPò`ô÷ù`p`À`#@# °À÷pí0é`ä0èñÀõ þÐ ÀÐp€Pû`ù óÐï@ðÐñàóÐôýPÀ`ð% $€ @°ùÀíÐç°âÐæ î0ò ú àà ° Ðþûpõ@ð`ïðpðó ú€ ð 'à#"Ð# pÀù0ðç€áÀåpìàîùЀ p àýðö`ðð î°îÀòÐù`@ðà"€'&ð&Ð  àùí äâÐåPè`íPù0°Ð ð  € þ`÷°ñ ï€ìîPñ€úPP`)&€)0*@PÀö éàâPää@æ ðø þP p @ ° €ü°öó í ëîÀô€úÀÐà" (`+à!p` àÿñàçPå0äàâ éPðÐõ þÀp à P 0 Àü°÷ ðÐìPî0òÀõû` À&P+`"° ÐöPîPéä°á0æ€ë@ðÀø`€    0`€ý°õðð ðòðóø@Ð!p)€#Ðp0 0Ðô ðàè ã€æPéê óÐù@ÐРРû õ@ô°ô óÐ÷ ðÐÀà" ÐЀðÐýðöPð`èÐç@é@ç`íÀóúþÀР úàøPúP÷0øàý  0@€ÐÀð Pü@÷ ð@ípí°ë`íÀð°ô€øPýp00€Àÿ`þ ýþðú`þ°° @° € 0 °þ`ü@øõóÐópôõÐ÷ûý@@ðÿ@ÿ ÿ@€ @@`àÀ Ðð@@P`pаðÿàÿ`ÿðþÐýý ÿàýpûú`úàüÐýð`ðÐ ð  `p p à`À0à`°ðÀ`Ðÿ@ÿ°þ€þ€þPþàý ýÀý þ þþðþPÿP€€@0ÀÐ@Pðð€0 Рp0 ÿ`ÿÐþþ€þ€þpþÐþÐþÿPÿÿ `€°@PP00   €P ÿ ÿÿðÿðÿ`Pà ÀÐÀÀ`@P0pP  €€P€€€€@ €À° Ð0 ðÀ°  °p``PPpPPp€ €€€  °€€€`p€€p€€ €€€  Ð °° € °  À°°  À ° °°° °   °€°  ° °     °  °    p€°€` ppp€p€°p€€€€€`€ppp€€p€pÀ€€ p  °°     °° €°   p° €P°p°€  €°€ p€  À€€€€€ € €€€€ € °  À@  ö  ëë ø`û° `À °ðÀ @ø@óò úÐéð а 0óÀ° `0 `` À÷P÷`õð û0ÐøÀú  ú°úàù öùøp@°ûôPñ@ìÐ@ÿúàö`°öàî° ü ú@îà ðÿPø ûÀÿ` ú ôÐöP`pý@÷ `ù0û ýPù@øÿ ûÀûàPýÐÀý à ü`púàÿà àüPÿP à@ý° °ÐùÐüÐþÐ 0ôà  Pûð €` °ñ ÿàPùP  þ0 Pú  Ðü€@pùðúpüP Ðü€P pÐüþ€þüpû°ð`úp0ú@ ðÐP° üàP Ðýà°  ÿ €pý ðÿÐ À00@ÐýðP Pø``°0ûÀPÐÀû`ÐPÿ`ýðþÀù@PÐ@ÐüP ýpþ€þ ýÐþP àú@Àþ`ûPPÿÀÿ°°Àúúpÿû°ýÐüàPý`pý€Ðþðü°ýþû@þàýÀþÀûþÿPþÀþþÀûÀþ0ý ý ÿ°ûpþ€ýàý ýýÀþ üû ÿPàÿþP00€þpPÐüüPàpý þà°Àüýð`üàþP @û ýààúý ð€ýPÿpÐû@üðPýÿ`ðÿ@þ0Pý`üÐþÐýû`þ`@ð@P °0 € @Àý àýPû þü0ûàüPúPú û ú0ü P @ P À ðÀ °pÀ°p÷àð ð ë@ì€ð`ø øù@ûPÿ@0@þ Pÿ`ð€À!Ð.ð.@( '0ò°å@âáÀÞÀêPö úÀ`0 P ýÀøíî€ø`ú@üÀÿÀ €.;4À0à' ÿ`ãÔÕÀÓ`Öàå€ú Ð`€€ °ú ÷@ò€ä Þ ìøø ýðÀ<ÐHð80/" í@ÍPÀ`Ê0ÒØ éàÿ`€°Ðà@÷àêæàßÚpâÀõ€ÿ€-PKÐM0=Ð( Ðû Ú€¿ »Ë`Øå@ø`Ѐ@ ÐÿPð°è áÐÝàÜ ä@õ€ p€6pO@L@8 (  Pó@× ¿`¹Ì@ÜëÐýÐ$ ð Ðàîåðââ@âÀèàóPàà-ÀIN:À%õÐÛ¹€Ê@áíÐûP @Ð" à à0@ö€çÀââ°æèÀð ÿ0#PD KP<À(ppýpä0Ì ÀÆpÜëö°` @ @ü°îæ@ãPåÐé`ïàø`€@7IPA0*À `òÙ`ÇÅ@×0æàðû  Ð@  Pàø íàçÀèÐêÐí@ó€þ p ; >À1Ð$pàìÙ€ÎÀÒ`á êÐòpÿ  `€@@Àø`ðàë€ëÀî@ó ÷p° ,`5°0Ð" Ðþ éÜðذá è ìPô  `Ð à `pø°ò€ñ°ñóõ€ý@€'à'ðp°°`øìåéðìÀìîÀö0Àð ð €`°ø÷p÷@ø`÷ úÐp@ p ûö ò`óô ö@öÀùàýÀ`°p @@ÿüÐûPþp  €@à°ÀÐ`àþ@þ ý0ýPý€þ þ ÿ €P`€p€p°0ÐàP`Ð@Р0ÐР°°°°À°°€PP€ÀÐðàð0`` ° À  °°ðÐÀÐp @Ðÿ@àÿP€ P°€`€€pP@0àÿÀÿàÿP P€P€p€€ ° €€pp€p€  € À À°ÀÐ0ðÐ ÐàÀ°À °  °ÐࠠРÐРаÀÐÀÀà°ÀÀ  °   €€p€€€`€ ` Pp€p0 @`P€p`p@pp€ €€@pPp€€€€p€p€€p€€€€` € €€€p °p p  p€ €€ €€€p €pp`€€ €°p p€€ € pp€€€€€€€€`p€€p€€€`€P° p €€  €°ÐÐÀа°°Ð° ÀÀ°ÀÐÀðÀ ð Ðà°ÀÀÀðÐÀ°  ° À  À°À   °  ° °°°        À €°€€     p € ÐðÐð`ôè@êÐÀ)€°ôð@ÐÐðú éPç@þЀ ý €€`ð0ôà`  ÿ À ÀÐé ß°ò `À ð ù üP`ù ö úPÀÿpýÀP À Ðp°`ÿúû ý°þýPþ`P°üÀ €ÿüàÿÿÐÿÿÿpÀþ `p`€0ÿÀÿþðÿàÿÐüpý €€ÿàÿÀ€°0P@`Ðþp`ð@ PðÿàÿÀÿ€PPP p@°€@`€Ðà€ à00PÀ ÀÐPÐý@þ@ÿÐýüû ü ý ü ûÐüÐЀ `P00ýàòÀíîìêÀî õ ú@ý@€P°``ý ûûàúpýüÀðP' !P  Ðóéææ ä€ä íðø ÿ À 0 ``ùpðàéÐë@öðùР,0)*P#à ô€äÞÜ€Ý`ãPìÐô þ@€ °àà P þ õPìpç€ç`í õ` Ð-À,/`*À  ÷ÀæÐÛPØ ØÀÝðèÐòàþÀÀÐàð ppPöÐíç æPé€ó`ûÐp(°0P.1$PPPìÐ߀ܠØÛpå€ð úPP P°ð°°üÐñðìè0éî°÷ ÿàð,€1`//!€þ`é àÐÛ ÙÞ@è0óÿPP €°ð `ùñ@ë èPëÐòü€` ,p.1)ÀþÐèðâÐÝ€ÜPáPçï`ý`0  Ð ð úpõ@íéÐî€õúÐPP(P(À)Ð%Р ÿ0ï0êÀä€ßÐâéPïöýà ` p°úÐõ0ñàóÀøpþPÐ àpðÐà `@üø öpóÀò õ ÷ùüPüàPÐ`üpûÐù`ú0û€ýpý þàþ ÿ€ à@` 0pàð@ÐÀ PÐÿàÿ0ðÿ € °ÀðP €0€€€ °€àp0Ðà€ ÿÐÿ0ÿàþPþ0þðýýý0ýýpý ýPþÐþ ÿPÿ°  °°€€ ÿPÿÿÿPþ þ þÐýþPþ@þàþ°þÿ ÿÀÿ @@P`Pp°À°ÐÐàÐð``pPP0@@0P€P`p`€`€ ÀðPPÐ`0 ÐаÀð  Ð °ð P Pð0ÀÐÀ °  p€€       p €€€€€€€À€  À  °   p° pp€€ À°  ° €€ °pp€€€`€€p€€€€€€€p P€ €p@PP@`P€€PP €€`€€€p€€€€€€  €  °ÐР À°    Ð Ð°à°   °  °°°°°À °°À° °   ° €   °   €°` €€°p€€€€€€p€€€€€€€€ € °p€  €      °°ÐÀа°   ° ° Ð°Ð    ÐÀà ° ° À° °    € €  €€€€@` `0P@PP€€@P€°PP@ P€` P €€PP```€€€€€€€ ° À°ÀаÀàà  ÐÐÀàààðàÐÐаÀÐàð° píðépú`€pûPÀ°P €ö°ö ð @ø`à@0ð€ ÷þ€àÐü°ü0 à` °Ðà@Ðÿ€ù€ þ`ò@ ð î ø ðüPû àûüÐþ€ü ýÐ ÷ýø ÐÐüýþ@ÐPü€€þPûàþ@ü`ÀÿàþPý  ÿpû`ù@ú ÿðÐúúÐÿÿàþþ€P ° ÿ0ù@€ðþÐpàÐý`àÿþP0àÿÐÐà@Ð0ú ÿ`аú ÿp €° pP°ÐÐ@þ€@°@ÿ þð0 `ÿp üР°ÀàÐþð €ÿðþ þ0ÿàüPüP00`P€ÿÐþ`ÿàü pp@° @ЀÐÿ0ð`°Ð0` ðÐÐÀ€ðÐð ÀÿÐР@€ ÐÐ °ÀÿÀ0€° pà°ðà`@P0Ð  ð°Ð0ÿÐý `°°P€ ÿ pPþàÿÀþðü üÐüðÿ ÿ PÿÐÿ`ÿà û@ýP ü°ú°ü° ÿüàPÀúPûÐ`üàú ÿÐú€ù÷púùýÀýàþp@ûàü`û°úPüø0û@û ú0ûÐûüàûPý°þûýþ`üûúýú ûþÐþÀý°ûÿ@ÿý€û€þýûúàû ýÀþpÀð ùàüÐýø0ÿ ° þþýÀ pàÿýPPÿPú`P€@Ð`ü`°ÿ@þ°@p  À ðPÿÐÐàp` `Ðpð`ÿ° 0€0`ÿpÐ`0Ð ÐР€à Ðp°à€Ð Àÿÿ €ÿ°ðPð0```ð ÿÀûpð @ð€ÿýþ`0€P PþðüàÐý P°`ÀüðûР  ðÀú°ÿ  û ú`P`Ð  ýúPÿ û0ý€`à€p`ÿ0@Àý`àù ÿÐþ€àþü€üÀýpøù0`ÿPÿ ÐÿÐýPþþàÿàÀþýÐü`ûýàÿÐ`P0ûÐøÐúàþýüÿ@ü`ø ø0û€þ`þPüà þÀü0€€þ@°€€ðþþÐÿpP€` 0üÀ÷@÷`úpüÐýPÿ@ÿ`úp÷P÷€öÀø@àpàp@àþþ`PÀÀþ ÿ@ö ø€ýPü`û°ýû@û úðö€û ü þPÀ°ð0°€P ° ð ` @€Р÷Põpøà÷p÷ýÿ ýðúÀùÐúpúp÷@ûðþ ýð°€ 0  à@0 Ðà°ûÀõõÀópõ€úÐý`ú@ü@ûÿPøpû`ýÐøöÀúÐPÐ àÐP @Ð0`þpòí°ïÐó€ý°@àþú÷ò`óðö øPûÀýPð°  °@ `à €ð ÀþÐñ`ë íPö`ûp€P ú ÷€õÐñàõ ýþpþàÿÀ   ÀÐð ``ú@ï€çîðöЀ @ 0`Àù@ò òàòõ0ýà` àЀpÐ@à €úPîçéñPþÀ €à `ü€òîðîÀõ@ù`ÿP°pÿà`Ð`@0@@úë`æ@êñ`ü  0 °ûóÐìÐì@ô€ü`°ÀÐý@àà Pp!€ÐÀ@óPäðã`ë`ôÐÿ0 Àà ÀÐ÷àñëì€öþ@ÀàÀ`û þ °Ðp€# ðP PúÀåPÞç òPþ`   `øñÀîìïÀûðÀ€`àþüðüP@0#Ð Ѐñ ààáPî@üÐÐ ð Pú0ñÐî í€îàö °ýÀû þpÀ  à!ð"`ðô€ãPß è0ô ` °õð€ìPìÐò0ý p Ðàû úý ð `#P    ÿôã àÐî°ùpð `€ `û ð ïðð°õÐÿpàÿ þ ý ýþЀ а!Ðpþ òâÀå ï€ý0€ P €üô@ï@î0ñÀõðþÀÐàÿÿ@pàÀ €@àPà€ù êÐæðîó@þ ÿ÷0ö`ð0ñ öðü 0ð ýPþ0°À€€°à € @àùç`ê€ð÷ð PüÐøpôððpóàôÀü ÿ°þ€ÀÀ€ÐÀp0P ÷éêPð@úp@ Ð0ÿÐù0õöàõÐõûÀ°`ÿ€À PÐ `P p Pðô0ìò@ö@øPÿ€ðüÐùøõ õÀ÷þþ@ÿ0€ð°0 p`Ð `°Ðõï°ñÀöþ € ðPþPúPõ÷p÷pøPþ€€ÿ°P p Pàpà ÐÐöòÐô øÿÀÿÐÿÐp`ý úpø°ù0ùàø`ü ý`þPþÿ€`°à`À€pP 00ö€ôó€õÐüpý Ð`þÿ€ûPøàøøÀú þÐû`þþ ÿà@€ PP@` ÀÐРûúøùàýýÿàýþÐþPûPúÐúpûüýüÀþPþÀþ Àp°Ð P ` @°`þ`üPûðü@ûù0ýÐþÐüàû`úü@þ`ü`ýÿ@þÐþ0ý þð °Ð €p` à @Ðà€üÐù€û@ûÐùPùùü0üÐúÐüàý ÿPÿþÿ þÐþPÿPPP°ðÐp@@0þýúø@ù ùûü ýðý@þþðÿàþ€þPP€€@ pÐàÐ``àÐðаþþ0úú`úü þ`ÿÿP€ÿppÀpýÀÿ ° `@`0PàP Ðÿ€PàÐþ0ýýþ þÐðÿ ÿPÐà€@ÐÀ€pÿPÿ°ÀÐðPà@ÿ`€@Ðý@ü þ`ÿ€ü ÐP p@þ°ÿP ýÿ@þÐ@Pÿÿ@ ÿÿ  @Ðÿÿÿð ü°ý ÿÐРü0ýÀ€Ð PþPP€þPþ0pð ÿ0þÐ`ð0ÿ÷ €øøÐ  þ° `ýЀ€ý0`P€ðÀà Pÿ@üðüàPû€ @°PþÐÿ° ý0@` À00 `@ú`üpàÐpPP°Ð ù°ÿPÐýðú@û0ÿÿ ÿP@û0À@°þÀü@ÿ@þPÐà€úÐþ @ÿ@ýÐ@Ð ° üÐýðþ`pÀ à`þ €°À°þ ÿ€°ÀpÿÐÐðú`аÿ Àý€ `P€€û úÀÐý@Ðþ ÿ°ÐÿÐ@ pàûP°ýðàþ ÿÀ@þ°ú Ðð 0þ ÿ ý0€ý Ѐ0Pû0 °P þðÿРÿÐÿP p@ ðú€Pÿ@ À@ÿ@@ýP° þÐÐ pþp`@ý°ü  pþPþ p°P€ þÿý€@àpPú€°@`@PÐú @`÷`°àû þ pÐö0 €P@þ`@ ` þÐÿ`ÿ ÿÀP@À Àð û€@0Ðаø°ú`pÿ€û@Àÿpÿà €öÐþ ñ`õ0p üüÀ € € àöÐPPøõ àøÐPü@ÿÐÿ`ýúà þàþP@þÐý°@þýPþ°°€PÿÐÿ ÿ0ÿ`þðþp0þ@àpÿPÐÿ€`@@РPpP  €€`°p€p  €p€`€€€€€€€Ѐ€`p`p€p€p€pp€P€`P€Pp Ppp p` p` @P@ÐÿpðÿPðÿ0 00P Ppp@P@@``p``ppP````ppp€`€€ppp`€€Ð€ à ÀÀààðpP `pP€p    ÐÐÐÀÐðаàÐÀРàÐàÐàÐÐÐÀÀP @`P P ` @  PððððàÐÐàÐÐàÐÐÐÐÐÀÐÐÐаÐа ÐÀp0Ð`@P€P`0`pP 00 @@@000ðÿ `Ðÿ`P@`P@`P0P Pp0p   0`p  PP `P`p€  ` Àp0€P €€`pppP€@p`p`€  @p€@p@0 P@@` €@`€p€`€P€€€    ° °ð° û õÐp`0°ÿPP€€°0àðP0ø@ûÐð0ðÀÀ@ À õðú ý@`` à þ`ý@p ýpþÀÐýp€Ð àðÐü° À€Pýà@Ààÿ@P0àûðÿÿ þà€ÿ@PûðÿÿPý@ü° þP0þð@`þÐÀÿ€ÿ°Ðþ@°ð° à`  ÿàÀð€ @ °ð`€   àP Pа°P0 Pp ppÐ À€`Pð€Ð0àÐðЀÐðР` PP`ðþÐ0€ Pÿ0ÿP°ðà€`À `ÿPÿP €Ððÿàÿ °ÿ`€ P°Àÿÿ ÿàþ0Ѐ°ÿ þ0þàÿ   ° ðÿ0 Àÿ`ÿþPþÿ`€p  ÿP ðÿ`Ðð`Ѐ °p`°p€ € P0Àð°À @ppÐ` P  `@p à  ÀpÀ`@àÀðÀP°  àÐ`0Ð`°   ÀЀ @À °° Àð ÐÐÐÐ`Ðÿàÿ Ð ° ÐðÿpÐ0p`€° PðÿÀPàÿ°À `€ÀÐð ðÐÐÿРààðPàà €`ÐPÀ ð` °0 ÀÀàÀ€@РРppàÀЀ°pp € ÀpÐP€À°€Ðÿÿ`€0Ààÿ€ÿ`PpÐÿ°pÐ À    ÿ€€ÐpP€Àà а° ð `°`ÿ@€  à à PÀ`P€àÐÿÀ°€Ð€ `ðP P`Ðp`Pp `@ÐÀ€     `PÐ@þÀ @РP ðÿÐðPÿÿ`ÿ þÀþ°ÿÿàÿP°ÿ0àЀÿÀ 0ÿ@þàPP Ðÿ0pÀ ÿ`@ÿ0þÐÿ@ÀÿpÀÀ€ÿ @ Ð0°PÀþ ÿðÐ`ÿàýÿPÿ` P`ÿPp À0€ ðð@PPÀPpà@` ÀP€°ÐPÀ 0À ` ðàp`€°ÿÀ  Ð° ÿР€€@ `€@ ÿà€ Ð`ðÀP°ðÐpp€ÐþàРÿÐþÐÿ @À àÿ€ ` ÿðÿ0€ÿ`ÿ€° @0`€ÿPÿР p0PüPøý°@0ÿÿ€`Àpàþ€PPpÿàÿPÿÀÀpа €  € p` €p€  °ÀàÐP@ À ° pðÐÀÀpPÿþ`ÿ P€` РÀÀ°p°€ ÿ°0p€pÿPÿÐÿ@ÿÐþ0ýpü ü0þàÿÐÿ€€@ `àPà`Àüüüú ö`÷ ùúûÀüþP€`Àþþ€ @ÐÀ ÐP @P`ý°÷ ôÐò`óöø0û@ý à00 €pý0ú0úü@þÐàÀÀ `P0  PøÐñàî0òõ ö@øPýà °p°þ0ý û`ø°÷ ù ýÐÀ€@àp 0 @ÿðøõô0õõöÀøû@€À 0þ`ü0úPùÐø ùý€0P ` € ð@àpýúÐö õ@øÀú0÷ðøüÿ€ÿ`ÿ€þÀþ°þþPý@û`ü@üÐû þà`@   0 €@P ÿ@ûùÀùû€ù€øü@ýþ þPþþ€þ` ýþ€ü@üàÿàÀð pppÀ ðÐÐûÐüàýPú`ú þ@þÀýpÀþ@Àûþ þЀþp`Ð00ÐPЀ0ÐÐÐ@ý€`ùÀ@ÿPý þ ü` úPÐ`ú0àüàðý€Ðý`À€ý ÐøPü` @ûà€ÿÿÐðþûÐPü` û ý@@ü€ ÀpûЀÿpý`ÿpÿ€ ûàP `öpàÿÿPÿ@  üàþ`pý@ûààýPPÿÐÿÀÿà`ýPû`€àþ° ÐùÀ °ùЀþ°PPÿ `Pù`ûP p@PöpûûPðû 0pÐüÿpûЀü üðû@@P ö`€úà@0÷ °ûðàüÀþ@ýP@ÿþÐ@ûàþ÷  îà ò ÀÐÐû@0ÿ`ÐÀ ùPÐàü°àý@@@°Pô€Àü@ý @þÿ``ú@þP°úp ýðð  P€ú°@ý PûþÐ`ûÀþ àÐ`Àÿ€@°À €€þ@ Pö°ÿPÿ Pàû óPò@ÀüÐÿP€û ù p`ý0ÿpýP €Ð@Ð÷û pöPPÿ öÐ üÐÐÿàû@þÐ`ùöpýÿPøðP÷€ûÀ ú ÷ @0ñ€ à ü û€ø` `òÿ Ð ÀÀ€þ ûÀðòÿà÷ûþ° €`ÐP ó`þ@°õÐýPûPýÿ0ðÿ ð`óPö þ€ 0ð `ðÿøöû÷Àÿ Ðà@ @ðþþàþÐÿ0ûÀ€ø`@üÐÐ ùÐ `€°øü úàõ €ú  0``ÀýPýàôà@ÿàýðù  õÀàðúððPýð ð`þ`PøPú `þP°ü€ÿ`  ÿÀûÐ ° üð ùÀàôü@öà`û ü° °àÐü0ðÐþÿ°ú ó0À`ý° öÀüð°@û` à 0úÐü€õPÀý @ÐþÀù àõPþÀú°üÐ@ ÐÿÀ ÷@Ð   °À÷@ÐýðPú0 ðô@ðüü€Ð þ ü€Àöp°PûðÀýàø`P°ûÐ÷Ðüý@€0ð €À`üû€þpù` þþ0ÐP@ù °ôÀûPýÐ@ð`ü Ðÿ`øpüÿÐü@û@ Ð €û`0ý€ÿ°@÷`€ÿ ýP`Pp0°ÿÀ0ö ý þÐø €°  °ÿà ° `Pùðø@ÿPó`üú@Àÿ°   °øÐÀÿÐûàúÐûð°ûpû0 `ý @ 0ÿà@°0òààú` þúP`pýÿ@àP PðÐÐõ  ýà€ ùÀüpù ÿ`ðPP÷À@þ ûÐüp Ðù0ðþ°pÿ`ù€Pþàý°ýþ€û0 °ÿ `@   `ú ý p@àø@üÐô00`àPüpp0úPÿ°€ðÿ Àõý€ü@õ0ø0 Pðø`Ðð Àð€ppP÷ÿàÐýP  üÐÀù0÷ °÷0ý@ðñ€@øÐ€ð À à 0 °@ý ù@óàø ÀüýPýù üþðúðpÐüÐ`õ0  þÐÿЀüP ú°Pÿ0ù€P`p`ÿ°`ûðÀõ0àp°PðöPû°ÿÀþÀý ýÿÐPà øPÿ°` ÿÐö @ÿ€ `ÿ@@Ð 0@þýÿàþ pýÀÐò ýÐ`€üPþþ@@€ÿ@ÿ þðàÀÿp€üP0ÿðÿÐýÀ0 ÐþðüPPàÿÀþPÀÐ °ÿ€€ € ðP€ ð0þðü ððà`àPа@ ÿ€°ÐÐp°°    €° ° p  °Ð°   €€€€°  €° À ÀÀ °À    ppÀ    À€€ €  €€ €€€€€€€€ €€€pP€€€€€€€ `€€ €°€€ p€`   ° °°  ÐÀðРðÐÀÐðÀÐÐàÀÀððààðÐÐðàÐÐÀÐàðÀÀàÐÀÀ°À° Ð° °À° °°Ð °À°      € pp PPÀ€PP`Ð`P€`Ppp €``°`À p€€€ €p°    °€€p   À €° °p p  €€ €`€`€€€€€ €€€€` `€pP€€`€€p€€p€€€€€€€`ppp€Ð€€ € °° °  ÀР°   Ð ° °°     °  °À À°°    p€       €Ð°`À° `óðæðì0а ðúÐ `ÿ÷€ö €Ð€þ€ûÐÿ`Àÿýÿ Àý`ý  pÀ°Pÿ úû€ÐÀàÿ€P°þàþÐ Ðð`ë`õÀÐ °ÐÿpÐ`Àÿ û`€àÿpü@þ  PÀà À0ù€ïó þP€ÀP@ppÐÿ €p`ý`þÀ@Ð`ÿ ÐpÐþ`ÿ pþPþp@þþ ÿÐÐþÿ @ÐÀÿÀýðþÀÐPÀþ`þàÿ `àÿ ý°þ ÿpppÿPpp Ð PPð À°Pÿp@` ÿÀþÿPÿ€ÿÿÐÿ€`€pPP°p°@€€`à €Pÿàý`üú€ùÀù0ú@ûÀû üþ``ðP``  ° Ð  pp ÿàüÐøP÷öpõÀõ@ö€øû0þ@ PÐP°€ÿ`þýàü ÿЀ ð@ 0P`þÐù÷Àõö°õpô`õÀø0ýP  €€ðPpý`ú°ùpú ûÿPа€  `pðÐû ö òpòÐòó°ó÷úÿ  €PðPPÿû ùø€ù€þ àÐ à 0û°õpòÐñ0òÐò`óàöÐú0 €`ЀPý ù ÷Pøú@ÿ` Ð@Р PððúôpðPð ñPòôøÐûpÐpP ÀPÿ€û€ø ÷`÷ü`@`p  PÐü€õÐïÐíïàðÐò ö ú@ÿÀЀ   À ý ùàõÐôðö0ûP°P  0à€üàö€ðììPî ñÐõ ú@þ@ РРÀ ý°ùÀöõ õ€ú À` ððP ðü°õPïPëì ïóÀ÷û`ÿ`0 0 À ðЀ0ü`ùÐöõpöúà ` ð °0ý÷ÐïÐêpêðìPñ ÷pûÿ Р P @ À 0üùÀöÐôÀô@øþP àÐ` €@Àþ@ù0ñ`ê èàé`îÐôúpý` @ ` p ààP°ûpùàöõpõðö°ü@   @à @ÀþÐù€ò€êçPèì ó@ùý@€ðP € 0 pP°û`ù0÷àôÐô@õ ø€0P`!Ð@p pP°ýøPð@éàæè î õPû@ÿp€ `° Ð`þùöÀôõ`õøPа!ð ÀPþPùàð êàæèÐí õ û€ÿ°@ à ÀP p€ÿPú@÷@ö õõpöÐù #€ @ 0°ýø ïÀç@å°æì õ0û ÿ@p À `Ð  Pþàø0öÐôpô€ôðö€ý 0À!à!Ð@0ÿÀúàóàêåpä@èðpøpýÐ0ð ð0 àúÐö@õÐô@õàõù`ÀP$p#p Àý0ùñPé äÀä@ë°ó û àP ð àPúðõàópôÐôöÀú0@%Ð"à 0€ü`÷€ï°çàãåÀëõðüЀ@ 0 €ÿ€øõôô@õðö0û@@€%#P ÿüàö î çPãÐãðê0õü`p @ À  0 `þðöóò ó õÐö€ûÀ`&€$` ` þàúÀöïàç ãpãàéðòPû P0p €@ àÿà÷°ó0òàòPô õÐø0 p'( Àp€üÐ÷Pò`éPãÐá æïúp€P à °À àû`ô òpò ôöø€üÀ P"( &` pÀü€ù õ íÀå€ápâ êÀô°þ° ðP €ý°õpñ0ðòõ÷úpÀ ÐÀ( *"`°Ðýø õððèàâàåïÀúÀ`  ð pÀø òPïpðàó°öàù€þ P P)À( Р`ûö°òÐíç@âpá@æÐð€ý À À @ Ð 0 `@÷ ñÀîÐïàó@ø ûÐÿ ` *ð)!ðÀ0ù€ôpñÀíÐç°â°áPç°òÿà p @ @ Ð pðÿðöPð`í@ïô ø ý@Р ð)À* "@øPñPï ì°çÀãàâ ç€ò ÿ °€ 0 € P€ÿPöï€ì íóPù`þ€ @€ 'ð*€%P0€÷°îìÐë@éÐåàã°æ ïpü PÐ   @pÐ÷ ðìðìÐñ`ø ÿ @ P!Ð) ) P Pýðîé éêPè`ç€çÀì÷€° °  ° °Pû`óÐí@ì`ï0ö`þÀPÀ 0p #*p&°`PõÀéàæ@é€ëðê@êë ñÐüp 0ðÐ À°àýÐ÷€ñ@í`íÀòðú€À@ Ð ð ` $ $Ðà÷0êÐå`è0í°îÐîïÐòPü°`pð`ðÿ ý0ü@ùÐôð0ï€òúð  0 P °Ð!#0ð`ö`èÐâÀæ°ìñ0òò@ó@úà À àý@û@ûàùðö0óÀð€òø°`  0 P`ð `ÀÀ0ðÐåÀã é`ðPô@õõ€÷ þ €ÐúPùÐøø ÷@õàóPö üÀ0 Ð0 à ð€0ðPðpåPä@ë ô@ùÐúÐø øýpÐ €`Pý`÷`öÐøàúûðø°ö€÷ü Ð  ð@ðPp`°óçÐâÐéPóÐúÀü€ú°ø`üP  àÐýP÷Ðõ ÷ûÀûpú€÷÷ û€° PP ð€À Pà  ÀüPìÀãÐæ€ï`ùÀýàüùðøpý`Ð Àà P0ùðôõùPüýüúû0€ ÐÀ @ °ÐPàpÐô@èã êÐôÐþàÿûPû0P Ð àÿàö óõ°ùþÿàý@ý€þ°ð À p @P à 0àÐ pàðçàçPðpù€€Pþû€üð€ pÀû°õðôøPüðþÐþý ýÐÿð P   €ð0 @` Àùì°å éPòüÐ0àþ°üPþÐÐ °PùPõÀô@ø`ü°þ°ÿÿÐ0 @ P° ð€ ÿPóàëìò0úPð €ý ý@€ P€ü ø€÷`ùàüÀÿðÿ ÿ@ÿÀ  à à Ð`pp°` °ú îpç`ê°ò`ü`p°ðýÀý @à°€úö`õÀø@ý@ À@ @   P @@` @Ðp ýð@è€ê óýаPý@ü ÿÀP°`ûö`õÀ÷Àü@ 0 0€ ` °@@@ð€Ð 0ø€ïìðpö`þ Ð àþ°þ Ð  ÿ@úPøPø û°þ`p€ÐÀÐÐ @€Àð °Ð€P€ø`íÀéPîÀö@€à°€þ`þpPP@ÿúøPø û0þ@ð€P  @`p €   Ð0øó°ò@öàúÿp€Àÿÿðÿ €pPàý û@ú@ûðüðþ0pPÀpð Pà @`ôÀ逿é ñ0ûP@€pÐðððÿàüÐøÐöpöà÷PûÿPÐÀ°ÀÀPÀp@€ Ð@€0°` 0þ€ûðø ÷P÷`ùÀû ÿÐÀÐPPPÐÿÐÿÐÿp  àÐ PP°°ùÐë0åðåíø`0ð@ `°ÐÐÿ€üÐø€ö0÷pùþ€ÐÐа0€ Ðà Pðà``P@`°ðþ°üúÐøÀøú€üàþp 0ÐPÿàþ€þÀþðÿ  0@ð ÐÐÐ P ô ê çÐê@ò ý@@ÿàý`þ ýÀüÀúpùùPúpýPà€PPÀÀPp`Pð`@°ððp PÿýûPúPúûàü€ÿ €à€PPPÿÿ0ÿ€ÿ@ÐÐp P €°p ôPë èÐë°ô ÿð€ÿÐý0þÐþÀþ`ýPûÐù ùPû0ÿà Àpà@€ 00 °Ð  PPÿÐýàü`üüüüpý@ÿppÀP@ÿ þ ÿ€ € à`à P  À÷ï°ì°ï@ö þP0Ð@þ@ýþàýPýü ûÐûÀýÿPÀÐàPà0à0 ÐÐp€ ÿÐýýPüPüPý@þÀÿ `°`°`ÿ@ÿPÿ` `Àð ð°ÀàP   € p °ù ñÐëpíóÐü€PàP`ü`û°üý0þ°ýü`ûü`þpà€ ðàpp`0P0 ÿÐý`ý°ý@þÀþ ÿàÿPP@@pP``ÐÐÀ€°àð@û0ö@ó`ôÀ÷àý Ð@@þýþþÀþàþ þþpÿP`À`ð`P àÐÀ0`   ð à0 ùÀòàð€óÐù`À  þ`ý@þÐþPÿ`þýPþ0ÿÐPÐPàÐ`àÀ°ÐPpàð€ðÿÐÿÿ`ÿÿþþÐý€þ þ ÿÐÿ000Ðÿ°ÿ ÿÿ`°€ 0ÀÀÐP0p0àýÀøpôPôÀöÀûPPPÐýðüýàýàþÿPÿÀÿ ÿP°À`ÐàððÀà   Ð  Pÿà÷pó ó÷ ýPàP °þPý€ýÐýþ°þPþþÀÿ@PÐðPЀP€P0àðPÀЀÿ0ÿPþ€þ`ÿP° Ðÿ`ÿ€ÿ` ÐÐÐP@ð°€À°°À€€0 ÿ€þ€ýüPüüÐý þ ÿPÀÿàÿ€ÿPÿ€ÿÿðÿ àð°`0PððÐ ÐÀ ü õòóøàþPàðP ýàüàüpý`þ þþàþàÿ ð`@PP  @ Ð`P ÀpР0°þPþþ þðÿ€P°ÿ ÿÿ`€ PÐà@ðPÀ@ 0€Àû øÐö ÷àú0ÿÀPPÀþðüü ý þÐý þàþÿ`€0À°€ 0à@0P `ü`ùù ú0ý@ÀÐàÿ þþþ þ þþÐýÿÐÿP €ÀÀPÀ° P`0Ð@ð€ðÿ0ÿ@þ°ý°ýÀþ ÿÐÿPÿàþ þ ÿPÿ@pàРÐpÀPÐ`€à°ÿüùøàùýÐÿð€ÿ°ýý`ýðý ÿ0ÿÿàþ€þ`ÿ`@°ðPà@ °àÀpÀ þPûPú ûàüPÿ€ÀP`ÿàý0ý@ýþÀþ ÿ0ÿ ÿÿÿ`°€0P@P°`p°`°pý€ü`ü°ýÿÐÿ@ðÿÿþ@þðþ@ÿpÿ€ÿÀÿ€ÿ` ÐP00P`Ѐà@°@ P ý°ü ýýÿPÿ€ÿPÿ°þÐþàþ ÿÐÿ P@ÀÿÀÿ ÿ pàPð0ÐàÀÐÀÐPÀÀ°ÿÿ@þ°ý0ýÀý0þpþ þÀþþàþÿÐÿ@Ðÿ ÿàÿ€ ``P°€@àPÀp ÿ@þÐý`þÿÿ`ÿÿPþ0þ@þ ÿàÿ€pp ÀÿP@ð 0@À€°P`ð°ðÿàþÿÀPÿÐþàþ`ÿp°€°°àP`ÀÐP° ° `Pð €0àÿ  ðÿðÿÀÿP`€PpàÿP° P€ °  €P0 ° ÀÀ ° `p`€ÿ ÿ     €€P°€   €€€  €P `P°   p  €€ÀÐÐà €€` Ààð€€€°€ ° ° ÀÀðÐ`    °€P   €€ €€°` À°à  €€€p  P°þÐÿÀÐÀÿÐýÀýÀüPýÐþ  À°À°PÀ @@pPàp@à pÿ`ÿ0ÿpÿÐÿ  À °À ðà   p€`@ ` °€€À°Ð0À   ° °€ €p° €€p` €À °° °Àа€p€€ °Рpp`00p€€° °Ð   € €° ÐàÀ € °  p€€€€pР€€€ €€ €€ €€€€P `` € €€p  € €€À€ €€€`€€€ pp€ €p€ €°ÐÀÀ  °°À°° °€°€°€°  €€ °     °Àp° ° €€€@° pp€  € €€€€€    °  € €  ÐÀ  À °°° ÐР° °  °€     Ð°À°  €   °°À  °°    €°pp€€€€€€€p P€°€€`€° p€€ p°€€° €€pp€   €p€€°p€p`€€€€p€€€p€`€`€€p €€€Pp €``p€p€€`p pp€`p€ €€ Ð° €€€    p  À   °ÐÀÀР€° À°°    € €€ °   À ÐÀÐà    Ð  € € €€€€ €€€€p€ €€€°  p€€p €€€€€ pp €€    € p€`€€€€€€ €p € €€ p p €€p€  `€p€€€€€pp€P`€p€€€€ €€€€€p€p€€€€€p€€€€ €€p €€p€   °À°  °€p°€€€p° p€ €  € €€€  €€ p  €€€p€€€€p  €`pp€p€pp°€€p€€ppp€€€€€p€€p€€€€pp ``€€€€€€p €p€€€p€€`€€€p€€€  À  °  °ÐÀ  €  ° Ð °À €ppÀ€° €€€p€€€€€€p€p€€p€€€€€€€€P €€€€€€p€€€p€€€€p€p€p€p`€€Àppp pp     °°°Ð°  ° °°       °° p€ À€€p`€€€p  p€pp€€€€p€€€ €€€`€€€€€€` €` €` €p€€€ ``€  ` À °°°  °€° €    €p€€°€€€€€€€€€€p€€€€€€€p€€€p€p€p€€€€ppp€€€€p€€€€€pp€€€€`p€€€€  pp €€`€€  Ð À  €€À €€€€€€pp €€p€`€p€€€€€p p€pp€p€€€pp€p €p  p€°€€p€€€€€€p€p€€€ p` €  ÐÀÀ À ÐÀ ðÐÀ  À   °     ° €  €Ð €  €€°€€€€€pp€ €€ €iaxmodem-1.2.0/lib/spandsp/test-data/local/short_nb_voice.wav0000644000175000017500000056705411150047204023606 0ustar julienjulienRIFF$îWAVEfmt @€>dataîíÿîÿëÿëÿñÿðÿõÿòÿ÷ÿþÿûÿ÷ÿùÿòÿùÿôÿôÿ÷ÿøÿüÿûÿùÿõÿ÷ÿ÷ÿôÿ÷ÿôÿòÿîÿçÿèÿèÿçÿçÿæÿçÿäÿèÿêÿèÿðÿëÿêÿäÿæÿçÿçÿêÿèÿêÿêÿçÿëÿíÿðÿøÿõÿûÿþÿüÿøÿüÿ÷ÿüÿùÿõÿôÿðÿêÿèÿèÿçÿèÿæÿæÿèÿçÿæÿëÿèÿèÿèÿëÿíÿñÿ÷ÿùÿôÿôÿ÷ÿùÿøÿüÿûÿ÷ÿùÿõÿôÿøÿ÷ÿùÿ÷ÿõÿõÿñÿñÿðÿôÿõÿðÿðÿðÿñÿ÷ÿôÿñÿòÿîÿëÿêÿêÿðÿîÿíÿæÿãÿèÿçÿëÿëÿëÿèÿæÿæÿæÿæÿàÿàÿãÿßÿàÿçÿêÿíÿèÿîÿðÿòÿôÿôÿõÿôÿùÿüÿ÷ÿõÿøÿûÿüÿùÿõÿøÿ÷ÿûÿüÿüÿùÿøÿùÿ÷ÿñÿõÿùÿøÿøÿùÿøÿ÷ÿõÿðÿòÿòÿòÿòÿôÿõÿñÿíÿðÿíÿçÿëÿçÿäÿæÿáÿèÿçÿßÿãÿäÿäÿãÿáÿäÿäÿãÿêÿëÿôÿõÿôÿ÷ÿñÿõÿñÿñÿõÿñÿîÿòÿôÿðÿëÿîÿòÿñÿ÷ÿûÿøÿ÷ÿ÷ÿûÿøÿþÿòÿèÿêÿçÿèÿêÿòÿñÿðÿ÷ÿôÿõÿõÿñÿñÿðÿðÿíÿçÿèÿëÿíÿêÿîÿòÿøÿ÷ÿøÿüÿüÿþÿÿÿõÿôÿõÿôÿñÿòÿòÿôÿ÷ÿûÿûÿþÿ÷ÿôÿðÿîÿçÿãÿÝÿÚÿÜÿ×ÿÜÿÝÿÜÿßÿãÿãÿãÿçÿèÿæÿáÿãÿæÿãÿäÿãÿãÿëÿêÿðÿøÿûÿûÿþÿûÿøÿ÷ÿðÿõÿðÿòÿûÿüÿÿÿ üÿûÿ÷ÿðÿõÿôÿñÿêÿñÿñÿîÿëÿíÿðÿñÿîÿèÿëÿíÿèÿãÿãÿãÿäÿæÿæÿçÿêÿòÿòÿòÿøÿòÿëÿèÿêÿäÿÝÿÝÿßÿãÿáÿçÿðÿòÿùÿûÿøÿùÿòÿëÿñÿäÿèÿêÿíÿøÿ÷ÿ÷ÿüÿøÿùÿôÿôÿôÿîÿèÿêÿñÿðÿíÿíÿíÿòÿòÿôÿ÷ÿøÿôÿùÿûÿ÷ÿñÿèÿçÿáÿßÿãÿêÿðÿôÿøÿùÿùÿþÿùÿøÿøÿîÿëÿæÿßÿáÿãÿãÿáÿçÿðÿîÿðÿðÿðÿòÿèÿæÿßÿßÿÝÿÝÿÜÿßÿèÿêÿêÿôÿõÿûÿùÿüÿûÿøÿøÿ÷ÿîÿèÿäÿãÿæÿçÿîÿõÿøÿÿÿ  õÿõÿõÿõÿîÿçÿèÿíÿíÿòÿñÿôÿõÿñÿ÷ÿ÷ÿòÿñÿîÿíÿèÿæÿæÿæÿàÿäÿæÿæÿáÿèÿèÿíÿíÿêÿãÿçÿãÿáÿàÿÚÿãÿáÿßÿãÿèÿîÿ÷ÿùÿÿÿûÿøÿøÿîÿîÿðÿíÿîÿíÿñÿõÿõÿûÿþÿþÿùÿ÷ÿøÿ÷ÿõÿðÿëÿçÿêÿêÿêÿðÿîÿñÿôÿõÿøÿõÿôÿôÿòÿôÿðÿèÿæÿãÿÝÿáÿáÿÚÿæÿðÿîÿõÿûÿÿÿüÿþÿùÿôÿðÿîÿíÿêÿêÿèÿæÿçÿíÿðÿñÿøÿõÿðÿîÿíÿðÿêÿæÿèÿçÿáÿãÿäÿèÿëÿæÿîÿêÿñÿõÿ÷ÿùÿðÿðÿíÿëÿèÿäÿàÿãÿæÿíÿðÿõÿôÿþÿüÿùÿûÿòÿñÿñÿ÷ÿ÷ÿùÿüÿøÿùÿ÷ÿôÿñÿíÿîÿðÿèÿãÿçÿáÿàÿÚÿÜÿßÿáÿíÿêÿèÿæÿêÿëÿêÿòÿòÿëÿçÿãÿáÿãÿáÿçÿèÿîÿõÿþÿÿÿþÿùÿõÿòÿòÿçÿèÿëÿíÿðÿñÿôÿõÿõÿõÿôÿõÿ÷ÿõÿðÿîÿêÿîÿíÿíÿðÿõÿ÷ÿõÿ÷ÿôÿòÿøÿøÿôÿñÿëÿîÿçÿëÿãÿàÿàÿáÿäÿáÿæÿíÿõÿùÿþÿûÿûÿüÿüÿûÿñÿñÿôÿðÿíÿèÿçÿäÿäÿêÿèÿðÿðÿëÿèÿëÿíÿäÿäÿàÿßÿÝÿÜÿÝÿãÿæÿîÿõÿ÷ÿ÷ÿøÿùÿûÿüÿûÿüÿ÷ÿõÿôÿòÿòÿøÿõÿòÿòÿ÷ÿøÿùÿùÿÿÿùÿ÷ÿôÿîÿêÿêÿêÿñÿêÿíÿðÿñÿîÿðÿðÿçÿæÿãÿãÿáÿáÿÜÿÚÿßÿáÿäÿãÿäÿçÿîÿðÿòÿùÿõÿùÿùÿõÿôÿõÿôÿñÿêÿëÿîÿðÿòÿðÿòÿõÿûÿøÿùÿùÿøÿùÿùÿüÿüÿ÷ÿòÿîÿðÿêÿæÿêÿíÿòÿ÷ÿòÿõÿðÿíÿîÿíÿîÿèÿæÿäÿèÿçÿäÿêÿëÿëÿîÿõÿõÿ÷ÿûÿûÿùÿùÿøÿûÿôÿëÿíÿíÿêÿíÿëÿêÿíÿîÿðÿõÿíÿçÿíÿæÿçÿèÿæÿãÿáÿãÿÝÿàÿàÿèÿëÿêÿçÿíÿëÿñÿùÿ÷ÿøÿÿÿüÿþÿûÿùÿùÿûÿôÿøÿùÿÿÿþÿûÿÿÿøÿòÿñÿíÿðÿñÿôÿ÷ÿ÷ÿôÿøÿÿÿøÿõÿñÿòÿòÿíÿèÿãÿáÿäÿàÿÝÿÜÿÜÿ×ÿÚÿÜÿ×ÿÕÿÓÿÙÿÙÿÝÿáÿÚÿÙÿÝÿßÿäÿäÿêÿëÿòÿõÿøÿüÿüÿþÿüÿ÷ÿùÿþÿÿÿüÿþÿùÿøÿùÿùÿûÿùÿôÿôÿõÿðÿ÷ÿ÷ÿõÿòÿòÿòÿôÿõÿôÿõÿôÿðÿðÿîÿôÿíÿðÿðÿîÿðÿîÿíÿèÿñÿîÿëÿëÿêÿñÿôÿôÿôÿõÿôÿðÿòÿíÿíÿíÿëÿçÿäÿäÿãÿæÿðÿôÿøÿùÿüÿÿÿôÿñÿîÿñÿðÿçÿæÿçÿèÿèÿãÿæÿèÿíÿðÿðÿôÿôÿ÷ÿ÷ÿõÿñÿêÿçÿáÿäÿæÿãÿàÿàÿßÿßÿÜÿÝÿ×ÿÜÿÝÿ×ÿÙÿßÿçÿèÿêÿêÿñÿùÿþÿûÿþÿþÿÿÿþÿþÿþÿþÿüÿüÿþÿøÿøÿøÿ÷ÿøÿñÿõÿõÿñÿñÿðÿòÿîÿðÿñÿíÿèÿëÿðÿñÿîÿíÿèÿîÿñÿòÿùÿ÷ÿôÿôÿòÿêÿàÿßÿ×ÿÚÿÕÿÓÿÒÿÒÿÒÿ×ÿæÿîÿüÿ øÿøÿùÿÿÿÿÿðÿîÿêÿäÿßÿßÿàÿäÿæÿòÿôÿòÿùÿþÿûÿþÿøÿ÷ÿüÿøÿûÿþÿùÿùÿôÿñÿëÿçÿèÿêÿçÿãÿáÿßÿãÿãÿäÿæÿæÿëÿîÿêÿíÿíÿêÿèÿäÿçÿäÿçÿãÿÝÿÚÿÚÿÝÿàÿãÿæÿæÿñÿ÷ÿÿÿ   ûÿõÿøÿòÿõÿðÿçÿæÿáÿàÿÜÿÜÿßÿàÿßÿãÿëÿôÿëÿèÿèÿëÿòÿðÿîÿñÿëÿæÿíÿëÿêÿëÿçÿêÿðÿòÿÿÿÿÿøÿñÿäÿßÿàÿÙÿÜÿÝÿÙÿÐÿÌÿËÿËÿÆÿÌÿÕÿÕÿßÿçÿîÿíÿðÿùÿüÿ !" øÿôÿðÿðÿëÿèÿçÿíÿíÿíÿãÿãÿßÿÚÿÙÿÒÿ×ÿÕÿÝÿñÿûÿ÷ÿäÿ×ÿÌÿÕÿàÿßÿÚÿßÿçÿîÿðÿëÿèÿçÿäÿàÿäÿëÿêÿðÿñÿùÿûÿùÿ÷ÿ÷ÿùÿ÷ÿùÿûÿûÿøÿõÿùÿùÿüÿüÿùÿùÿþÿþÿûÿûÿøÿôÿëÿíÿêÿîÿëÿêÿèÿæÿêÿíÿñÿòÿõÿ÷ÿüÿùÿüÿùÿøÿ÷ÿõÿùÿøÿòÿôÿôÿñÿêÿäÿáÿßÿÚÿÚÿÜÿÓÿÏÿÈÿÅÿÅÿÐÿÖÿßÿäÿíÿòÿþÿ !*+ûÿ÷ÿôÿçÿãÿàÿÖÿÓÿÕÿÙÿÕÿÒÿÒÿÐÿÎÿÐÿÒÿÕÿ×ÿÜÿàÿèÿõÿüÿ ÷ÿñÿ ûÿðÿëÿîÿõÿõÿøÿÿÿþÿÿÿûÿþÿüÿøÿûÿõÿêÿäÿæÿÝÿÚÿãÿÝÿàÿÜÿÕÿÏÿÌÿÒÿÚÿàÿêÿôÿûÿ  øÿðÿæÿÝÿßÿÙÿÓÿÕÿÖÿ×ÿÙÿÝÿÝÿáÿæÿëÿñÿñÿ÷ÿÿÿ  üÿûÿûÿîÿèÿÜÿÚÿÖÿÙÿ×ÿÕÿÚÿáÿèÿîÿûÿ  ÿÿ÷ÿíÿêÿáÿ×ÿÙÿÚÿ×ÿ×ÿëÿþÿðÿÏÿÉÿÝÿÚÿÓÿàÿäÿßÿßÿÙÿÚÿàÿáÿæÿêÿîÿêÿëÿîÿêÿðÿõÿñÿíÿ÷ÿøÿ÷ÿ  ÿÿüÿ÷ÿîÿêÿæÿÝÿÜÿäÿçÿðÿõÿøÿùÿ  ùÿòÿèÿæÿÜÿÌÿÄÿÄÿÈÿÐÿÙÿÚÿæÿòÿ òÿôÿðÿêÿãÿãÿáÿÝÿ×ÿÕÿÐÿÉÿÄÿÅÿÉÿÆÿÒÿÚÿàÿßÿÜÿãÿßÿÐÿÆÿîÿ üÿüÿ    øÿðÿëÿæÿèÿëÿëÿîÿîÿíÿôÿþÿþÿ øÿîÿãÿãÿ×ÿÎÿÉÿÂÿÂÿÆÿÌÿÖÿÕÿÙÿäÿæÿèÿëÿôÿ üÿñÿàÿÒÿÎÿËÿÐÿ×ÿßÿãÿëÿõÿ÷ÿ    ùÿñÿøÿüÿñÿæÿçÿèÿäÿãÿðÿëÿêÿëÿãÿäÿãÿáÿÚÿÕÿÚÿÙÿÜÿßÿäÿîÿõÿüÿÿÿùÿ÷ÿôÿñÿòÿòÿîÿíÿôÿôÿõÿûÿøÿþÿÿÿÿÿþÿþÿþÿ÷ÿñÿðÿëÿæÿäÿãÿæÿãÿÜÿÕÿÌÿÐÿÓÿÒÿ×ÿæÿøÿ (*íÿÕÿÏÿÂÿ½ÿ½ÿ·ÿ¸ÿ½ÿÁÿÎÿ×ÿèÿôÿûÿÿÿ÷ÿÚÿõÿøÿüÿ (,/9<9232(íÿÎÿ©ÿ‹ÿsÿfÿ[ÿRÿNÿTÿ^ÿhÿzÿ‹ÿ ÿÆÿëÿ (/8'ÿÿÝÿãÿûÿ*3nÓ!]Š¢©Ž&Ÿ!›ÿ$ÿ­þ/þÄý–ý”ý¤ýæý;þ™þÿNÿ–ÿëÿ.fœÂó!SxyjeW&âoþÿÌÿ´ÿhÿÿÓþÑþ ÿ\ÿÿŸZ]$ä•õÿ+ÿ—þ;þýýöýþþmþ¸þòþ5ÿzÿ¸ÿíÿ%Gs³Õþ$BYaB à]çÿ®ÿ^ÿ5ÿÿÿlÿ¸ÿèÿdã;†‚2ãn¿ÿ$ÿ£þGþ#þ þþEþþ»þñþÿ?ÿŠÿ­ÿÈÿ÷ÿ!e­âWuqeV0Øp1ùÿœÿDÿ ÿâþÿ@ÿ…ÿíÿuê8H.î›+¢ÿ3ÿÙþ•þmþbþiþ…þªþÆþáþÿÿJÿwÿ°ÿêÿ.e¦î!9I@72¨n@þÿËÿ’ÿTÿMÿiÿ‚ÿºÿ _¶óôÖ´o.×ÿYÿÿîþ¿þ·þ¸þµþÅþÐþÓþâþýþ&ÿJÿzÿ¾ÿI‘Ñø(FII;Ä„8õÿºÿŠÿcÿ^ÿlÿvÿŸÿ×ÿW€¯¦l.ßÿŽÿDÿÿÙþÐþÊþÙþüþÿ9ÿWÿiÿÿ•ÿµÿäÿ 9f—´Ùýý ûÝ¥n,æÿµÿtÿ^ÿjÿXÿeÿ‹ÿ¿ÿþÿ;s‹ŽW,èÿŸÿiÿ0ÿÿ ÿùþÿ ÿ ÿÿ0ÿCÿ^ÿ}ÿ¢ÿÆÿëÿ"_޶àøãÇ£[!äÿ®ÿ ÿ„ÿwÿŽÿŸÿ¿ÿñÿ'JQ@2øÿÜÿ°ÿ“ÿwÿaÿTÿAÿ@ÿMÿRÿWÿTÿcÿwÿŒÿ£ÿ·ÿáÿh©¨ÊӴϾª‘Gçÿ±ÿ±ÿ£ÿ˜ÿ™ÿ•ÿ©ÿÏÿëÿøÿMUh[%øÿËÿªÿ„ÿXÿCÿ,ÿ7ÿ7ÿ)ÿ2ÿ<ÿbÿ}ÿpÿŽÿÆÿæÿôÿ U¥ÊÊÕÖÁÌ»}JäÿäÿÝÿÙÿÖÿ¾ÿËÿùÿ 3X*@,æÿîÿ•ÿ0ÿÿÿ!ÿÿùþ ÿÿ<ÿQÿmÿmÿêÿ•ùÿõÿÊþÿ¾|¥L lªƒ UÌÿíÿ·ÿiÿÅÿßÿ üÿŽ£zuf•ÿÿvÿ=ÿ9ÿûþ)ÿ ÿ ÿPÿÿwÿ£ÿwÿ ÿËÿFlXiªÝ?S•JiÚÿ$ÄÕÿ¿ÿÒÿðÿ5vŠÁçܪÒÿqÿûþ‹þ)þâþ ÿGþÿ¤ÿîþåþ%ÿTÿ„ÿñÿ˜D8ÜŸŠ5Fÿº'¿ÿ[M‡µÿÉÿkòÿp d7ÕÀ'úª€ÿ´þ‚þ@þ{ý#þ’þþÿÿ þ³ÿpÿeÿk±ÿ´!|H‚ä†]vÿ{ÿ\ÿòþÿÿXÿßÿ•æ«mboùÿ!ÿþ]ý¤üúû­ûüZüÙüKþ±þÿ=ÛÕ\†qžZ”ý1üØüžüoüÝý@ÿH-ŸO›ó&rën7ÿ•û¤ùŠø‡öYõ(öé÷Ìù¹ûùý¬€J}„»Å¡¬þŸú¸ù/ú¦úÈú¶ý{ ƒ `ï §   L¯Eü8øvôàðîÛíMï»ñôôbúæÿânÞ ^ î N !ã¶ýâø6õ¸óvôÀ÷Íùzÿ^ ³ GÕéIº ýý‚ô@ïÞéå{äœæÐê6ða÷›¸ 7b7Þ ÖÙNýÀöXï¯éÍé0î¨òÞøI’ˆ""Ê&!TI™kûìïà8ÝhױׯÞÅåwïžûã<ÑRPö m#ùò$çÝ ß é;îÉô c¶è+3'®¾š÷GäÈÚóÕœÍûÑÂÜ’äšï+ÿ´+˜î#h#ñ3 þíò<êOÙÓaâÆéïézÖÐÊ+Ð:•.t%y§ (þåGÚRÕEÈD˲؇à<êÕû'ç| °)9( ¬‡¦þ~ðÓãÞРкã®åçê´;òÒ8c=F+d&¿" ÷þÞ6ܲÍÊ¿UÐcÙÀÞ³ð¹‘(,,~' çðÝöQêÇÏËëä¶âÞâg `ú:ÇB (-*ÝØø"áŠâˆËD»ÓWØ~Úÿï‹–›O+/‡%Ð ,’{õîæßÉÃÒ:éÜËëX¦!Cÿ7(b(q¥ Xó¶æùàCÂ-Å؆ÓOà‡õWıÆ-P*e#Þ ·Çý¸îÐåÏaì'ÜŠã43 ×mF5W!Q/–qúqé1æžÄìÃ®Ù¿Ï Üwóéý Áí*!*`&Œ"Ó€‰ñ9лÒð·Ø3æÅäa ûIg+¼!(1B´Ÿúéí>ãiÃýÍ×Í—áñfû =­(õ(ÿ'Ù }:ÿ@â¯ÏÆéåä,ÔtQ õÇ6–;#4 "MåßóïiÍÊÜÊȇ×5í}ðâ´#Ó&)7'ñr”ñ¯ÒÌàØîºÑ?õPñâ =CF}.,s|“øåòGÜ)ƵÚÎoÎéè4íŒú­Gº$$)&']« žómÙ=êÄìýÏìûåêú%[9Ñ ¨1à):cýâöºÝEÐÞßÌèÑç¡ê·÷š ÎÐ&o#ú Ôì÷âóøÈáˆÚÓÁüEò‘:Å $9¥€o°úZóÙ Ý©ÛËzßæ\ë"ÿ{ š$u¤€sçôXó3×üæ Üë£ .þ¤+u%˜ ²ûûùqèPܯâñÐÒØå@å¾ö³G[ jîä,ñ»óø…ßóób„ñ»ö/œ o ¤+Ñ \f %ø)ðá3áØÖ×:äãå4ñ`] ô#¦Ìõ€úÎó#äVý{eõ^y ¸ K#ú / ×øbñ&èEß©ÛçÛtàìéJïmþ¢ ü ”Ì CÿWûƒÐëVïú ê÷;#ºm '|Õb³øöíñ³æ`àZßÂÜæûëCòÓf\ M‡ü‘hú¬ìõð‚÷-4"Üÿ<Všøüô‘êSäŸâ†ÞÓäBìÿîËÿÞÌ”RütxüOîH M÷µá;—Ò²ã ö¢÷wïsâ¸æDá\ã÷ídîVþ¶Df ´ÿãBü©ô œâüq…ê ÅO fÕ¾ùèõ‰éuéíãwß=ëêê‡ñE• q^UÿªÿµøzùiìÐ9 # § ? ¹ 4 Yýù"ïôë¤êSÝ=éYíFè ÿ!‚ÿó#þ!48üFøw<_©Õ Ù©cp±ÿ´õžóßë…æ±àäæ&êaè]üÓýQ Òü­üü• :Z‡çc °w9¿ÿc÷ôÄíOç)àƒégè&è þû¦þ, ¥ýúNæü¾ÿø¦Ÿy÷ ÿ§!º º¶Îú¿ô†÷ñëúâ åë”ãIî§ÿõ–Q\ùW –þýüà w ]Ap#ÚíY8÷÷òé$á—è¥èyãø½ú÷ óÅø½Cü<`¼« û× „ ,â ý3PýŸöþõŒîòåšä¢ë˜åkìþü‘õ–ÿë «øyÿ¾ ßýÿnÍ  ÁkrwDÍœ‹ö;ø òœçã/ìªææ]ü~õ¼÷² DûáøÚ ¹ûj ‰¶eU'GI!ŽL ²ö‡÷a÷þçâ‘ívæ+ãŠúƒõ„ôé -üíöø {(ú¹ øVÀ…`ïº_ øèøâ÷³è`ã‘ì´æ ã-ùQõŠót üL÷Ü ¢úç Ì ‘$b]3ý>#î »ø½ú#÷|éžäøì/æõã–ùoòô r÷ûù` –ý¨ýo =ÅÆ‡"I~Âë}÷ÅûÙöÉ墿9ïÌßéMú8ì=û#oõ2Ä çÿ‘ÿ˜p 4„+U7¨÷÷üö³å é_ïÃßëùÇë ûw{õ-D Õÿw†4 ‘…‘Œw©{ ÷pþzôå+í^ìWàðeô¨ì/þsþªõýê¦þ*h G E$ñ ÌÍ g‘uþÜûEþîãê{í(ç€æàïÙð}ðýMû¬÷J¿Íþž OŠ)-È ï|K E çû¡ýú9ì ìVì|æßèBñ(ð>óšýÓùtúˆe] &¦¼r ~û*R îü¯ýVöoíòëÎëèØéåñFðGõOý&ùpýZ(L? UÍ 1 £.ÝÑ ÊüËû€õåíì|ë©è‹ë|ñÙñ9ö‘üLûBþ" ] ºÆ­úå |;v Ò ‹wþsùìò)ðDëˆêøë}ìvðôÄ÷?úŠüŒWçS D~ ‘. mlˆG Äý÷öñªð·êJê©íí„ðõføeúÒüFë>è@L ¹ ŠßI 'x  Y‘æý•öŠò»ï‹êÇëåìÆí+ñÅôÝø•úDþ›IS1Û ‹© Ó½æ ³5 üMö?õ|ðìï‡í2íÃòáôM÷Cû¤þϢⷦ ‘ ñ ø ¸ C¥ ¶ôÌ·ùƒöÖóxíÑìôìçë­ïæòÏõˆû´ f *¼ _9 ³k ž d *Ê"ÿ£øøôôUðHîBî»ïµòoõßú§ÿʧB%M  Ä Ë  N v 3 D‚¬òüø‡õ‡òïGïhñ“ò§ôÒù:ÿd.¥&¾æ õ § $ ÛXØ;°§ÿÃûøÌövòñðó„ôpôÄ÷ûþ§þ(Po‹ =  ÄjÕ»Ùuþýüªú{ø¡öíö›÷îöÚùüuûùþ‚‚NÂ8iç;xìwÆí.þüaýýjù¹ù…úÃùbûRÿ;þ'ý¼—Áþ¿ÿ‹ä+µ]@ÿÉý}ü9þ0ý\úký•þ;ýÿAÿÉýÛýÕ:/ÿM—¿¢ðÌúÁÿÍ9ÿŒÆü†üÚÿ6þÁüûþ²þüwýƦrü¯Çìü&ë?74NÀ0Ïÿÿÿ’ÿäý²þ£ÿ§þ’ý° Vü…ÿÔÄý(ÿÆæiÿiÿ ]-þñÿw)ÿÎýE%þ¢ÿûçÿþÑþ,Gþû·jÜü ý~Sûeÿ67þŽÿ~ÿÓýüÿ©£ÿ)ÿäÿ¾„Æþ ¶bþCÿ¾ÿqÿ ;¯”i+ÝÿsÿåþRÿáÿLëÿ‡ÁÿWZ®ý]A²üþÊýáüo—Ìÿ»ÿ»,Æý`Áÿ¿ý‡>¡ü²þ-Hÿ0ÿWÿB¤7ÿÿÿ4…ÿ{ýF¦þYþïµý%,þDk´¥bÿSÿÕÿÉÿ|º5ýbþÈüþ^ÿ9k·ÿ*hŠ!Óþ¥)ùþœþÓ6jýº–«þDÿY ÿ–ýKnþ“þnÙþüçÿ8×ýÄ×òÿFnÿ«þ Žþ[ÿ,þ?ÿFâÿLŽêþ¶¢DˆýþÀü}ÿI‰þæÆþ·ïþ#y¿þóýQÿDÆü©ÿR,þÆþ[Ïÿþ þe·þ¾þ(ÿ©ûHþŽ Å·bM'¡þ9§ÿþD$ÿ•þ‘ÿYÿoÿ„ÿµÿTÿ|ÝÿPÿmÿ„í>þvÓÿÐÿ½ÿû1„þÝÿ¿þÂÿ°pþŽIªþÊþõÿôÿÿÏÿuJ ý*¼þÿÑ#·þ O"ÿþÊ,4þ/þ-Ø0ýŸ#•þþ¶¬œþRýìZ›ý íÿÏþ¬ÿðŠŽÿÜÿ(Ì`þ‚þãúÿªÿœ\ÿ÷ýoÿÊ{ÿÃþí‰fÿsÿ.‹?ÿ‡öþÿ€ùÿïþ?ÈÿŽÿBÝÿ¬ÿ–ÿôÿmÿŒÿ_@Öÿ©fcÿ½ÿ9¬ÿÿoaÿ‡ÿWÿÎÿSêÿ.Pÿ'G%ÿœŽwÿòÿ8} ÌÿBçÿñÿ½ÿ¾ÿoþÿÒÿõÿõÿMÿ%3‡ÿæÿÄÿîÿüÿÏÿ»ÿ¤ÿÿÿ©ÿSaÿN‚ÿu¾ÿ2(Jÿwîÿ­ÿ˜ÿùÿÄÿãÿÿºÿÖÿèÿôÿëÿçÿ»ÿ('9 !;1+"ñÿîÿîÿæÿãÿºÿ Îÿãÿôÿñÿ÷ÿîÿòÿäÿÏÿÙÿÌÿËÿÎÿÓÿÖÿ¾ÿÚÿêÿçÿøÿûÿ÷ÿÿÿÿÿòÿíÿäÿàÿÓÿÎÿÎÿÕÿÏÿçÿþÿÿÿ  øÿøÿüÿñÿôÿçÿËÿÝÿêÿÙÿÜÿîÿ  øÿíÿäÿÙÿáÿäÿáÿÜÿßÿèÿÝÿÎÿÙÿíÿòÿüÿ ùÿÏÿÓÿçÿõÿèÿæÿþÿûÿùÿ÷ÿùÿøÿûÿ ÿÿûÿîÿáÿãÿÜÿÖÿÌÿËÿßÿãÿÚÿÙÿêÿõÿÿÿþÿøÿðÿëÿëÿæÿæÿàÿÚÿèÿõÿûÿ÷ÿùÿþÿþÿùÿùÿøÿÚÿÁÿ·ÿ¾ÿÉÿÖÿãÿðÿüÿ  øÿêÿðÿùÿçÿîÿæÿÖÿãÿäÿàÿãÿÝÿÜÿÓÿÓÿÚÿÐÿÕÿÖÿÎÿÎÿÕÿÚÿàÿæÿñÿ÷ÿþÿ íÿæÿèÿæÿèÿëÿõÿûÿùÿòÿãÿÙÿÉÿ³ÿ·ÿÉÿÓÿáÿòÿ ''÷ÿîÿèÿÚÿÙÿÝÿ×ÿÝÿáÿÚÿáÿèÿôÿùÿëÿðÿ÷ÿÌÿ³ÿõÿÚÿèÿðÿëÿ÷ÿêÿîÿñÿîÿõÿþÿüÿ÷ÿôÿîÿõÿôÿòÿçÿàÿçÿíÿðÿùÿøÿòÿùÿ÷ÿêÿêÿãÿáÿëÿçÿàÿêÿðÿòÿüÿüÿþÿÿÿõÿùÿûÿþÿÿÿõÿðÿîÿèÿÜÿÈÿÈÿÕÿÝÿßÿêÿðÿñÿüÿ  ûÿèÿñÿûÿüÿþÿ×ÿÌÿáÿÚÿëÿøÿñÿñÿñÿèÿäÿÙÿÌÿµÿªÿ˜ÿWÿ±þ÷ýz¤ô®üÂþÆÿ¢ú"þåýÑü"Õ÷ÿd´ºûýÚÿP÷ Øüsîÿûu•sÿ°ûý±΀ÿ#ÜÁþáýùø‹ÿMrÌþ×þêÿßÿµÿ—þ¸ÿ­ÖÿXÏÿ®ÿ"iÿ–ÿ¹Çÿ´ÿÀ„ÿz5œÿHüËûï÷ºÿ³6½û¤ø•üäÿtþ*ü¦ÄÿüþH´nÿŠ×Äÿ’ýæq‰þnþ±þ´çÿþü’&ÿÿ»ÿØuý0ÿ¿ÿaý1[°ƒýDÿ=±ÿ×þ_þzÿVÿ¢ÿÄÿrÂþ ‰¸ÿ6ð!TÿÓýèþ(SýHþTÿmÿ³~ÿqUÿËAÿZýÿ–ýLývü:þ&ÿ-}n–ö½RKÿŸþäú²÷Ãö°õ=ö·÷ù¦üùþîl§¯Ã¨Rþ)ø·ôö}õÙùb³{TV:(© ,ûï‰èæâUäRé ðýù|m9®{ºÛ «. úú÷eöyõú¢ÿ¥%Ã.nü ölõ øúx¬ V:àbÙIýönìçàæKæ(ê˜ð÷  ×0%´& 0±ÿãú›öPø÷­ùI¬• g ½—bûö,ïçç#ïPÿ5ͽ!¾$¤!ÁhdóãâáÿÛ3ÚÊäqî¼ø=¼ Yír¬ #¤ùÂõòõ˜ñ–óýâþ> „‚— ‹*óóËêéNåSæ[ñB^ %Ž*K(&cÌøÜã¾×8×2Ø¡â4î¸ù8 ©¿7Ït ¯ø™ó;öñãð(ûòÿtæ ä \)Ž É.Uóíì—ç0è(ìPëHù‰ +ô">1% bxþžîRãÖ»ÛoáÏçeûcc ¤ÑÆ Ðþµù¿õvðÂõÊùú3r†“ cÌys´þyøRóÃîèéTñÈõ»ñDjD%^(* å Žú¤í|äiÜäkëðºÿÛõ • awùôõ¡ö ÷’ûñÿYK — t¸Räÿ‹þôü½û.ötóô óÒ÷%ùVøÌ v€ *y&šåÄæ÷ÏëÕæŠâdíãòŠóˆ¾ªA•Ùÿ ÿýöÚùÓÿñúÂÿ¿•Fòõ âýÝwúÔþ\þ–øøþ÷²öt÷·÷öùÁo uá¨N|oÿõô]è‡ê3êÊíBö\úêú ωüòü€ü ûÉý7ÿb¯·^è­  ÄH/—ùŸü†þVü<ûŒ÷sùLû+ñŠöW hE»üd†ö´é–ïéë-ìžöû—Ërm…ù(ú²ý‰ü9þÒ‰)µå]Ï—uƒ‹lû´$ü¿üŠýŒúàô#óö½ûM‚¢ö³…K±âäõïýïmé€íŠøyúAÿ7@~¬ý~úàþòüsüšùâ‘£îÙ\¢BþªÿEþgùØ÷äôô’ô…ø×q Ø@Í›ðµqþ¿÷+ñÖìïýñ£ôHüÜÿíò rý—ýìùÙü·þòʼn„ éæùDµýEü ·þºüÏûùÎõ÷ùcõáù– ¿ q ¸¼™–còóûÿêSì³òFí{òlü“ÿ"FÈÿ†üfûÿf¹þFþIbQèb.£k_xþ û:ý°ÿìü™û ûVø¿÷¢ö–øx… ¥„ª a; ßxd÷iñ9ð`ì÷ðèôböuÌËåŸüþjÿßúlô×ü6vfžô¼š¤GþÕüÿþþéü¯ü6ùýöJûàúõ2ÿd [ :[ˆ Š &ÿù÷ëgò4ôî'÷«üdþ¡!µåúBþq-ý¤ÿ-HŠ! ›ˆ¡Ô„w3úùü½€ÿðüÕýûûöÛù¹ù$öþJ øL ›86ˆ C2üÏôJïíÎð¡ñõcýz¼Íô¢ÿåý¡ûÀý©ÿÿO¾%¥ª¹_ùßYñ?ýXþ!ðü€ÿjü#ýaú„ù«ùMõîÿ)È B Âä¹ÞùDôóXìºíô@õ$û-SÖýÂÿlÿþÄýÿ'FúZF`ðÙåÔ‚ûþïýªþ©ûsÿ+°ûRýYþœùïù«øIøxT´^M )Ä 5Òƒøõô¶òìJï,ócõüwi™‡îUSþõÿ#9-&|á7"Ý­¥iÿÐÿeZüâý„¤þuü/û¿ù0üeûÜöLýaµQS·¾eõÒú8ýMõ$ì"ðšñƒñ\õáúE\TÓ“.~¸ÿ“ÿ¸Yý…ÿ®þb1´j±U¢ûØý\ÿûÁþ"âý6úKú}þ¡ûtôÕzþd ï– Œ Í( œäú ùÀöëÆî@ôð÷~þ•þg„\6¿ÿÀ’ÿùþîþ %uMü­¼þnþDýžü£þ£ÿËüÏûÿÐü$ö¾ù\¸þþS Œ 2’yêQ‘ü5ö6ïyð<ñíxóaûÿûWÿ7„Cãÿšyÿýü}þŸþ]°ÙînDwÿ†þjý¢ýÿˆûàù¹üÁû›úJúüÏA§ D <á o,`ùÒðaö€ð\í•ñŒõÖùuûÒÿ.Ï% RQÿêmGûDþþÇ:½ìa¬ž¸ý(ÓõûQþ®ü×ø¡ûú£ùûüòúøþ"a ½ $ï–|.ïôö×ô¸êwîvðIòüùcúÎÿùÂ¢à ¦À s´û¤þÀû÷ý«\ '˜‡UµPåýŒþý»øúOü@ùøû[þñ{I¦µ kmt 3«FÝñ?öVò ëçïVñÔôyúüðîw÷ à -y— þ$üÁžû\ùfúáÿ ›þûŠ/þÿ ÿùŸ÷ôûOøLöüü¹ý¾­“ ; x ¾å LH _ÿõõûÝïLèÌðHîÐî¼÷®úWÿ©ù æ º Ä3Fõý•úµý û…ýŠ*þó ˜ÿonü$ú§÷×ù)ùzô‹ùðýüAå M *ÞÍ ( ¾ òýÅö¡ø{îžéjíÆíKðvôÅúƒ…ß r   ß ' Hý–ùGþÅùûuÿõ}­öÌw¤ÿvû˜û¿÷³÷øªõcùüfýÂ-h õ }Œ4 Ý ­âüùºû(ìÐé ðë0íÿô®øãüuü ¹  (àŒpÌùÎúAþ÷“ùyýþ6#^™Ë°žìîý€÷æøù ð]ö®ýj÷þÔ ¾ ¤H Ry qþ4úøëëÔí·ëƒè‹ìð–õ¡ûƒ"h Î$ ò§?ÿxý7ú7øù8ûü‹ÿ§>ˆ ˜X&ný¿ø¿úœöñèøüøÏõ”’K d>z+ N3º÷šîî}êæçÖê±ï]óføÕ‚W ïêø … /ñÿ û÷`ù4ùùþsØÇÒîxY8dý ûq÷ÔóR÷ÿøô†ü~C• öà £  Æ A®üøDïÑó×ê6æÁëãìrðº÷þ¾ p »‹•> mKŠûRúú{÷Ôù¶üLýç}„¤äþ3ýVø2ôªùV÷3ô¶·qÿ^³Ö  ·\ü %õöíí±èëµèÉíéóiö%aÈø+bc1 F -‚þãÿfù1÷­ûéøÔùœþÿ¡ïf„­ŠÿþJú&÷¿ùXö–õ„ÿÖÿ<¿ Íž º“( ®6ùzö³ðÙêõêgêíò'õBýd=¤ ‡Û 6>†¯_þ³ü¡û¿ù úûþüâþPL5}{ßÿþ£útùÎûêõýöæÍýÎéE 1 $t áû Æúr÷zð²ìšêêtî›ðôqý+ln æ ³ 5>  Q–ÿþÇûú ùQúKýý@ÿd¢§Èþjþ›û£ùýÑö<÷,ÿFÿ‰f é×s ŽX zùø˜ïåìëÊéÓïpðôïþMÿì• L gî Ò  þn¥ùFû½ûEùjü÷ý%ÿ··Yÿýý7újüÎûüógýèoû@ §â\¼ ìû²ø|öàì/ìMë,ë¦ï«ñnøzþþë ¥ ˜Áó  Š1²¢üãú+û]ù2ûÀüþ$}CáÿÍý(úýžü×óýT˜úhäÉg 1 ¹Ó œ÷öñ[êÔéIì®íµï÷ý±ÿµ Ü ¹¸³ ¤ Œì€0ýûrûùû«üìüäàÇj¬tþûãûÛüMöÝùìªþ/°ÿ . “ T öuû/ö”ð~íê ëØíëïYõ»úyÿ‹6 æ Z 5 õ¾¶¸þÃüwûsúŸúÈû\ý)ÿb»ÿ±þ_ûÛû=þ%ø&øëÿµþOÝ a0ü>„²#üÿöõï¤éËêxíÍìñù[ü!‹# ² ÅÒ =˜Ïþiþ þ†ù3úÈüBü=ýÂ[Hþ¹þŸÿiúLû§þTö@úŸKþ¼d Ìš^ðBgúûÁò¿ò¿ðIèpê±ðsï,ó½üÒÿÛ6 #  3eÛ JÚþý¹üÿú¿úýïý´þ‚þ†ý8ý+ûäû]ûzùKÿuð3:ú ü ÞT BZ›øHô¢ñŒî(ëÞìôðñ˜õxý¯+ · “ ì Î • Q-šSý¶üóû¹üýýfÿIÄü²ûpý¦ü™úûïýŠ}œ¸ Æ 3  ç *`¶ýÝøàõ?ó¡ïSîð?òcóRø¸ýÌÿ þ ß ¨ ë žòEDÿfþ§þdüÒüþýýáý‡üðüKþ;ýû:þÜIîTͳt _É—VÝûïøV÷7ôyòoòtó[õF÷›újþÔL Ô6 µ™""›ýý0ýlþPý<üïýÿHþ‚ý¨þ„ÿ®ýáýÿˆ­ÿ4À÷X:Ú’ ýLý•ûðø¶ø{÷¡÷ùïø.ûÓý¿þk`½æÈptwâ¢&põÿÿçþÿAþGÿ‚ÿþþmþ¡þÿ; ¯|ÔsyŽÞþpÿEüü¼ü5ûýûJûêúìýzþwþnÂÓoxŽq¨Ïþ¿ÿF€4þI."þÿðÿ0ÿ^ÿöþæÿ÷Yÿ*©`S„31Šˆÿÿÿáþ#þþÚý«ýRþ7þÿÎÿ³ÿibßuEéódÁøÿoÿpÿW‘ÿøþFÝÿÒÿ þ•ÿ§ÿêUXehÂÿ<e2‡ÿ[ÿjÿóþÿXþöþçÿÃþWÿeÿ¦ÿÎÿd½^[<Ò‹·ÿ]¤ÿoÿãÿŸ,ÿÿP¦ÿ¿ÿŸo%Ii„ñÿ¹­‡Úÿ„ÿæÿWÿâþ fÿþàÿ…ÿ7ÿèÿ…ÿ ?ÿZßÿõÿ„»ÿ'ÕÿjÿÒÿ‡ÿ×ÿ ~ÿùÿûÿˆÿ‹àÿX$ƒ|ûÿÆÿei±ÿÐÿ˜ÿÁÿœÿ9ÿÏÿèÿ¸ÿ–ÿôÿ0ÿ™ÿ' @D¾ÿ$Èÿ<ÿ¬ÿ¾ÿC›ÿçÿ¢ÿ ÿÓpd±21 èÿÝÿ[”'ùÿ ‡ÿjÿÓÿÌÿoÿ:ÿµÿtÿ9ÿ'*ñÿ_~ÿ„ÿøÿçÿÿI}ÿÁÿˆëÿ®ÿ ÿ v ÿõÿ;tÿ d®ÿðÿϹI! |©ÿ˜ÿ˜ÿßÿÄÿBiÿeÿãÿ^ÿ ZÄÿ ñÿ³ÿ?ÿ£ÿ=iÿiÿÂÿÌÿÚÿœÿƒÿÿÿiÅ„ÿ…ÿ„vÿÿfhÕÿ1ˆ3Xÿçþ’æBQ…þ@ÿtÿsÿ¸ÿûÿkUÿNÿðÿÿ¸ÿ5Áÿ  ÿËÿoçÿÿÿX˜ÿDÿ­ÿJÎ=ãÿdwÿ)ÿ&™ÿÆÿUþàÿ‡ ÿ +sÿôÿ¦ÿÆàÿ*€¢ÿœÿ+ÿ•ÿ'ÎÿÁþ˜Èþ ÿ£ÿ(UÿOþþ+‡ÿûÿ~ÿŽ:ÿêþÁ§ÿÄÿ£(‘$ÿ%ÚÿÌþ©ÿdRÿÎÿÜóÿœi„ÿÞþsܼþ£þ0Q(þùÿ¨GªþÝÿ‹þpÿÖþÖþtÿ¢ÿaÈÿ]3hÿz­ÿÿfÿîÿG…ÿ_EìþYÿÅþÌÿ6I·]õæÿ[ÿqÿ@þUÿ­æÿìþÅÿ]êÿyÿ“ÿØ|–ÿˆWàÿÆÿÕÿdŠÿ~ÿ÷ÿ.ÿeÿ©ÿÖÿáÿÐþ³ÿzÿËü{ýBçþ±þ7t¸"bÐ=ÜbýFýZûû¡û¹ùûý¢ýbÿ  ‚=É;ûù™µþ;ýþžý›ü—ýþ‹þ^ÿmÿÌ×4ÕVĵð|0ÿgþ¡þþþ@þmþÿÕÿÌÿðY8‡JOÿÿÎÿïþÖþÅþ±þõþÔþ@ÿ øÿ9ÄÁà”ÇFËÿ×ÿzÿ.ÿ&ÿÿJÿsÿcÿñÿXu·¹Ñâk?"©ÿ{ÿXÿ3ÿGÿ%ÿ0ÿ™ÿ§ÿÅÿ8izhŠk$ãÿ©ÿ§ÿÿµÿ½ÿ€ÿ¸ÿðÿæÿ 2ûÿêÿÕÿÖÿÆÿÖÿàÿãÿ NSMGçÿ¬ÿÿ‘ÿzÿŠÿ•ÿ­ÿÓÿêÿ9BCG* çÿÕÿ½ÿ¦ÿÿ–ÿ§ÿÂÿÉÿäÿ/NQC;!çÿÏÿ´ÿ©ÿ¬ÿ®ÿ¾ÿÎÿòÿ *,,* ûÿÚÿ©ÿ°ÿ¿ÿ¤ÿ°ÿ½ÿ·ÿÚÿíÿ %33+!ûÿäÿ×ÿÌÿÎÿÏÿÕÿÙÿÕÿæÿ " ! þÿûÿîÿäÿàÿÚÿÜÿßÿÖÿÝÿÙÿÐÿÖÿãÿëÿõÿøÿëÿëÿëÿàÿ×ÿÕÿÕÿÙÿÚÿÓÿ×ÿ×ÿÚÿÜÿãÿñÿôÿüÿ ! ôÿñÿÜÿÓÿæÿàÿçÿõÿñÿøÿñÿçÿáÿÚÿÕÿÖÿÒÿÎÿÓÿÚÿæÿçÿòÿ þÿðÿäÿäÿÜÿÙÿáÿáÿÓÿŠÿVþ+üâý"‡²In‹ý¡ûÙü…õ¶îíÎöQfúŸc U/^‰ÃùUêSóÍé>ÚçêùóÛóÕ/ UOâŬêú*ù?îÇìÐëEí‰ù[üK@¤„Á‘ Ì@ùnö¶ó8í›ð+õV÷ªþ&¤%X ê ¥ Cÿü9öªóRóó†÷5ûLþ­p Ž F R5ÿwûfù ö¬õÜ÷Qù°üº®Û ³«T øÿÈüÔù ù£øvù—û“ý”fÝT«žWÿrýæûCú‡ú€ûWüOþ*ýý3ý¸àYÿÛýÆüÖû¢ûÒüÄý§þ­ ‰G ÛÉÿQþìüžüåüôü²ý"ÿ,LB¨ ¨³$0ÿþ¿ý¢ýèýÞý™þeÿ¢ÿ}'5Ðþ¿üÇÄ u?ü©=†ùùÿÍü{úâýbùgþ›MúIÆ(]£Ê°ÿEþ}ºƒ7ÿÎ4Ãûl{ÿûŸþ`ýßû‚ý´ûþ†zþÆál1ÄÒ_à,þ ûyûüêúeûŒý…þ¿ÿ÷é häý±þ1û÷õøhñºê`üéG #Ü%f>ô”ì[ë‡Û™Ûäå}ïYúxÊ 7 Aö _  úô­ð ò óôþÅ6W ´ / ´‹þ"ù³öŽùE÷ãö2üæýõûùõñ½{¦ Í Ž <¨ù;òðõ'ë†ãEñañLîùåþ×Ç< ººÎò \õÿXþwûú°ú"ù±þäH8¯?hÆAúGöæðšì)óÚúûÌÔÂ^Xd„íÿû–ïç¿è<åwä’ë­ðM÷¢ÿ µ.O¾ijÑTû3úùwø•ú5ü,ÿÔ§C]ÖÏ9îûûÁöÊòxøeúþúS¼" å: U„ {*½úçõ”ñlïNï»îMð2öú)ýÑï{ ‰ ë Ù€š* ÿ3ÿ„ÿ[ž¶‰"oìç{ÿóýîýþ3ý§ý"þÿ’ÿAÿ:Š¢º˜MÿÚÿ"ÿ¬ý«ýäýý4ýßýùýšþŸþ ÿ/Z©ÈÌñ—vlbiÝ7$h9!çÿ¿ÿ¤ÿiÿÿÿ•ÿÒÿ$@ñÿ÷ÿ÷ÿñÿµÿ¤ÿ‚ÿ?ÿQÿWÿÿ2ÿ“ÿ£ÿ³ÿîÿ=ðÿ Áÿ¸ÿÏÿ³ÿ§ÿ±ÿÆÿÌÿüÿ'1aŠ_^?! ãÿÌÿÖÿæÿôÿIZ€½æÄ†|8´ÿQÿÿàþ°þÂþ ÿHÿÿÙÿ,F%@.áÿñÿ×ÿ°ÿÏÿàÿÚÿãÿçÿäÿçÿàÿ¾ÿ£ÿÿÿ±ÿÂÿþÿ+Dey„—Š„k*ÿÿíÿÆÿªÿ±ÿÖÿ(]5µÿ˜ÿŒÿ\ÿUÿ\ÿeÿˆÿ¬ÿÜÿ  èÿËÿ×ÿ¿ÿ³ÿîÿíÿèÿ' '?"2,õÿêÿûÿùÿëÿ% ëÿÖÿÂÿ ÿ˜ÿˆÿ„ÿÿ¿ÿðÿ*@GG2 ×ÿ£ÿ~ÿoÿwÿ‡ÿ§ÿÈÿÚÿøÿ+FUiT"6DðÿäÿÚÿôÿõÿùÿüÿôÿßÿÈÿÐÿæÿîÿûÿàÿÌÿ³ÿ–ÿ“ÿ¤ÿ¿ÿÈÿÒÿÖÿÓÿÒÿÚÿæÿüÿ òÿèÿæÿÚÿÚÿæÿðÿîÿ÷ÿþÿûÿûÿ"?=5çÿÐÿ¾ÿ¦ÿ­ÿÄÿÚÿûÿûÿðÿñÿûÿùÿñÿîÿçÿÓÿÓÿÜÿáÿîÿÏÿÉÿøÿûÿ üÿíÿîÿèÿøÿÿÿÿÿõÿòÿîÿáÿÜÿòÿþÿòÿàÿÒÿÉÿ»ÿµÿÆÿÏÿáÿêÿ÷ÿ÷ÿíÿøÿ÷ÿüÿ÷ÿôÿ ûÿëÿÝÿ½ÿ§ÿ£ÿ£ÿÉÿîÿûÿ2FSJ@;1( ôÿÜÿÌÿËÿÕÿÙÿ×ÿÚÿãÿíÿîÿëÿèÿ×ÿÉÿÎÿËÿÿ±ÿþÿôÿ×ÿëÿæÿôÿ  üÿîÿãÿ×ÿÕÿÐÿÏÿÓÿßÿáÿÚÿêÿëÿñÿüÿ 898;/ òÿÜÿÒÿ×ÿÝÿÖÿÆÿÂÿ¸ÿ·ÿÈÿÙÿðÿ ùÿáÿÏÿºÿµÿÅÿÐÿÙÿÚÿÙÿÕÿäÿõÿÿÿ *6,ùÿüÿðÿ÷ÿ /*ðÿ÷ÿòÿõÿ÷ÿçÿèÿßÿÕÿÐÿÐÿÌÿÁÿÄÿÈÿËÿÓÿÕÿÚÿÖÿàÿîÿçÿîÿîÿ÷ÿõÿèÿðÿðÿíÿäÿãÿèÿîÿñÿ÷ÿ üÿ÷ÿ÷ÿ÷ÿõÿøÿòÿèÿðÿõÿòÿñÿ÷ÿ.3!þÿþÿæÿàÿòÿ¿ÿ¾ÿðÿßÿßÿîÿÆÿ‡ÿÿ!þ6ÿK€üúýUÑþåþpþôüäm·¿ÿUÿMÿñÿS ‘ÿJÿÆÿçÿ愇nøÿøþÇýö\H.ÿLþ–ýßý…ÿ+=ÿŒÿƒC.ÙÿAÿˆþKÿãÿ¤ÿÄÿCiœÿ;±ÿßÿ£ŸþÅyjþÑìþ¬ÿõÿÃþrbÿ!¶¢ýõTÿÿ·þPµÿþ]þPÏÿ€ÿ4FÿÿŒÿ¨ËÿÿËÿ "_ÿþïJþþCþÿ›ÿ±þ>÷ÿ ÿØöþ’ ]þìþµþÅþʉþMÿïÿæÿî¬ÿæýµþ•þ) ütÀüîýLþ þÙuþËÿΈÿµþ'Wÿ'*žý|ùþÍü‚ýÝÿïÌû¦aýqd0þå‡ÿý“ÝþÆü&×þÚÿ»èý—×ýjÿÛþˆÿDλþvÿŒÿ¡<ý¦`¤þòü»ý{þ±ý©ÓýÐý‰ïþLþszÿ3þJÿ·;«ýL9û_ý6ùØøJ¿ü7ÑüSþ,*þÌVêüýõ5ýÍþ„8ýµ~ýºŠûÿ»úmÿÿuý iÿ$UäýL½Bû‹^ÿ~ÿ »ýhü¼Ýû ÿ>Âý',þ`$ÿ’’ýPÿ$’ú·1ývÿMúNÿýçú þêMû7ý+¹½öPúïYýþjü¯pýøþÿý&þÿFû½ÙÿyýCmù‰R9õ¨§ÿrú+ ûÆáxù¼ûèþn ÿÿxúø÷¤ÿØýùàô—Wó: :þhú"Û÷s „üÅöñŽúÐú"-÷p vüñö%/ùÎ÷÷ ²ûyÿQþª ?òô­ ôôµÿˆæû¸ú™ý3ªýoö\  øûoúŽÿ¤ôÀ åö[‡ú~}ùó• 8P÷á.cýEý™¼èøÊ¸ý¤þüªùo—þù( äýíü|ü²øÛ7ü®ùsJoäþŸÔþ˜OÅû@ .û³S‰ý¾ý<óPø0oÂýêpûƒ ûÕIçNDúe6oú›ûÉþÝù:˜ìüÑ ÿRý@û2*ý¨ûþµÿÈÿáýtýûЪbù 2,ý”Ãþx•ÿxürûsÿ`Xù0ÒmýüúVQûÿ¦þ²ý©Uþoÿ6äú5Ýßü÷ÏþßýYúáüîÿ1ÿ  ÿiÿÿSS£þ_ ÿ_ý:+…ùã‹’ù —ý½ý€~ø®Bèõ ‹þ¦úø [ùü—ùÏþ„üº ûdX…ú;ÙûX+ÿÍý¡ïaü±ô'ý²ý'Aÿ R«þ ÿõ˜ÿíÿJÿfÿÿ3ÿëÿþ:ÿƒÿXÂ%ÿS¦TÿbÿùÖÿvÿ·ÿ5ÀÈÉÿ÷ÿáÿŠÿNÿëÿ‚ÿ{þ.ÿ,ÿìþ"ÿûþ±ÿÿ~ÿ`þ˜–ÿ È~þÉþl þíüU°ùý¼žŽZÑf ¿Lÿ†Hý0øƒû‰øêõêù«ùÇûOýäýhx_Äo/öùpûÕýîþSp€ r i±–ù ¨ ÿêõ˜òÛíUéÑèöçEìï`ò´ÿ°î&n S jB  Ë œ#lþªûÅøÀîÒòõïìæ÷× ü„ " PMT Ýþ±ðñ;íéâéæ·ê£êÊîNùôœ ñÐ ·g GÕ ™¹þîýúšôžíÁïOóbð×÷Ò3Ý~ 6éky p°ù§ðñìXë<åOåÔì“íªðËÿ*íÞ … Ú È°ÿ«ý¥ü‚÷ô ð,ï;ö ömôÙ&C(Ë= ‹àÀáÌ ÷ðóhñsê±è"ë=ë*îv÷8ü-þ$ g Ì ’Vú Þ 5 Ó.ÿ¹ù–õñÔñ°õOó¨÷w!$ø§ß =Œ 1ïù½÷îñâí5ì†éîØñ7óÅû.Oj 3 Ì Í ¾ Ð L¨~þ#ùv÷Öõzôœöø'ü!‰uX Q _ ˜ žºlÿ?üú÷†ó¦ð3ïGð¾ðùòøûõþÍhÅe ø  J <fòýÄû,ûcøÑøŠúÄûWýãQ3ˆ q\ã<û6ùA÷Úô°õqô”õ0ùåøúû´eÚ5?F²qãwþ+ýþ™úuüöþQû)ý ÿÔwï³ðõÿ¬ÿµüý5üDû$úÒúþûhûJü¤ÿsŒÿ¨šB½Tn÷½ýº°0ý_ý•þ0ü5νýú¥âþ7>@ÿÜóþ˜ÿcþ@þöýØý²ýîýÿ³ýÁÿþpÿ÷×,÷¼þÙ ÿbÿ• þ:þ›ÿÇý–þhÿKÿÈÿ»îÃæsŸÛÂÿÍþËÿàþ0þ­ÿUÿjþoÿ(œÿ2÷YêË5|ùÿ“ÿ’ÿÿ„þ?ÿþ þ¸ÿìþmÿ‘F ÒHu­ÿÝÿ àÿlÿQÿ‡ÿ6ÿYÿªÿŸÿñÿ(hŽ•Á¥ƒ!ÌÿÂÿ•ÿ/ÿAÿXÿ3ÿRÿ‡ÿŒÿ¦ÿÿÿ?@€ž——|ZÆÿ¤ÿMÿ/ÿ^ÿUÿGÿ{ÿŽÿªÿ'XZŠŠ‡‹bMÙÿ´ÿˆÿiÿMÿDÿQÿaÿÿÈÿBdƒ£©¥žvQ*ßÿ£ÿ}ÿTÿ6ÿQÿjÿwÿ°ÿÝÿ6_us^G"×ÿˆÿUÿQÿGÿ7ÿMÿbÿ€ÿ´ÿñÿP˜œŸ‹eíÿÏÿÿ~ÿvÿsÿ{ÿ˜ÿÆÿôÿ3lX@hiXU*üÿÏÿ›ÿmÿUÿRÿMÿoÿ“ÿ®ÿÙÿ/I^vryk2þÿÎÿŸÿwÿ\ÿfÿpÿÿºÿÜÿ*<XuzrX5êÿ›ÿvÿjÿNÿ[ÿyÿÿ¿ÿñÿõÿnu/N£FÙÿ+øÿ[ÿ‘ÿ¸ÿXÿbÿvÿlÿ›ÿÙÿ3*6h@MÚÿÉÿñÿ¸ÿ–ÿ’ÿºÿÁÿŸÿ2%Ci—òÿ­ÿÉþa5ŒÿçÿNÿ^ÿáÿ ‡ÿûÿŠÿÿ’ÿ9Ìÿîþz´Qÿÿ8.zÿ“ÿ‹ÿC$%ÿ@”aÿM¤ÿFýaù¡ýfÿÑ9ÿ†þ;–ýøÿ Fü‰[òùŠÿ¤¹ýþHÿ.1_ÿªRÿ$ÿdòÿÿ2ÿ+ëÿãÿ©ÿJH%ÿãÿrYÿêÿäÿ“ÿmÿ‡ÿûÿ ?–ÿ€Ó{þLƒÿ ÿ ©~þ¹þ]:ÿ&ÿsšžÜ+MÿKÿÊþþVþàþ¬ýoÿ¼Wÿ„Œ6Ûù£ÿÉÿ wÿ«þ»ÿ<ÿªþ‚ÿ^pçÿ¯ÛMÿþÿvcÿäþ˜ÿdÿ´þì—ýªÿŠxþ(þ‘5üþÁTŠ.ÿb“ÿœþ3Dþw&ÿŽTÿKÿ+àÿyÿ{ÿëÿ+ÿ1µþJr%ÿÿfPÿxþB°ÿíÿ=SGœ&ÿ«þ¢ÿ¶.ÿHÿU×ÿ‡ÿ!ÿ$tÿ$GLµÿÿÿÿ¬ÿÿ=ñÿÄÿûþDþîÿQ@ÿQ;àÿLûÿ¥LCÿ˜/–þ‘Yÿ©ÿhS£È¸ÿ‚ÿ%Óþþ pÿOþÖÿ˜Þþ£ÿ@*ñÿ¾>ŠŠÿ„bYÿyÿÿ‡ÿñþNÿßÿ£ÿu¥Z ÿ5?Žaÿ ÿjÿ þÿ7ÿ7ÿ·ÿ{ÿ¥°_ÿbñcÿÿHþrrœþ\ÿ}ÿÿfÿY‡hû·JòÿË¿ÿ{ÿÐÿüþ<ÿÿ;þ’þuþ{þYÿ.ÿèþÅÿõÿ›ÿÁÿ³ÿ°ÿÉÿ<ÿäþcÿXÿ¦þÖÿ¨e™íH&¹•TŠoÿqüÌùo÷÷&÷‚÷Ùùüæýèÿz‘Õÿü2ùÂùÿûü3> ÈŸ,Åú Ì{üÑòÐê[êKé;é@ðôÙöõý|^O! ” U RæVüù/öJôèô¢õŽù‡… ncfð àÅöSîzéüæ÷æšêxï’ôþû8‹²› » ‡ À5ÿýžûÊùùøUø±ú´ùàútÑ f fxôxè ýÜòíÏê¢çÉè|îZò öäûÁdH   „ uŽ•Yÿ1üáúüûúüù{ùlù9ùÿúã•× Jžè„Ø »Vþvõ©ïí9ëfëúíJñ’ôÆøþfÄÓ \ í 5²+BýøúÎú ú ûÅûÏûðûÛü*þ"¡“ >…ö C ôQLýÌùvö%õCôÍó®ô­õÕöyøºú³ýS¦|MÉeÉùTmÿý›ûìùwùïùû’ýÁ«EÓ 9 Í Ý;chÿ&ü ùköôOòîñ¼òmô÷júÌýôÐB & ´ e ßÞYÿüÍù¯ø0ù™ûÝþúÞ-ªÖs¢Cpý¦ù öPóºñññó_ö„ùýª«Z&( Ì ò ± ¯“á‘Ãüˆù|÷ËöÈ÷ƒúþepñ_øQ  þhñ¨ýTù_ö{ôóIò¶ò7ôƒö„ùåüT}¸…äA , BxäÀYýAúê÷Ãö§÷cú|ý ç|(K · q «4õÏþŽú†÷9õKó÷ñ òHóTõøfû"ÿnüôÝ  ¸ ý‚k¯"ÿ©ûù^÷÷WøÎúþFKòè ^ Ö ‹¾·*ýbùögôtò’ñôñócõwøüþÿYÛ’  § ÌU rÿ¯ûùV÷·ö¶÷ïù*ý›¤‡šŒ  ø ÐÍž&þºú®÷‘õÌóò‘òHóÙô¥÷Ýúxþ0$))„Ö´ <ØÓ†„þiû&ùÊ÷|÷høÏú)þvmèˆD v  é2èÄý<úE÷Nõô:óBóNôðõ]ørû—þö÷ÒØNuqä÷¬Â¡ ÿíû—ùnøøø5ú ý€JÜ$ f > ;Ž‘?Œÿlü@ùÀöýôâó{óÎóõ<÷ãù¥üŒÿ‰ ¼® ‘/~¤}ÿÁüCúÛøhø«øöù¡üèÿ²ùô c0ñØ=ýàù<÷oõgô ôCô5õÝö9ù+üÿÃsx€õü»ûjrhþ¬û×ùÝø“øùpúÛü¬ÿ4½kÊ…—Zq ý6ú©÷¢õ„ô¯óîóSöÇøGú)ýß^äûÇIÏÁ[²c•ýDú_ø¹öSöµ÷#û•ÿg5 ` ˜±Æ #!Äÿeúõñð®í¼ìôìUïNóöö‡ü¬ìà  ÿ ™˜ C fe&þêû7úëù=ûü#þ0ÿÊþ2þKý-üÃûcücþ ‚' D ?” C zËÿ®úRõ´ñ ïýì+íÝî$ò”÷îûÉÿ³b i ¨ ¡ Æ ˜ «Wÿ[ûÞùùølùéûÞýQE\L‘ÿ›ýUû0ù{ù¿ýÃZ¬ ªk»Ú ª æÚþ:ùXôfðììëÌë¸îYóø×ü]\ç D õc W âÁ€ü·ù¦ùdøàùùüQÿò•c®ùýûCú€÷:øûþHž5“àà ) ùËú¡ö»ñ-íÐêBéÝë©ïéòGú!TL Ï ÅŽ.  B_qþäû´øýøù3úXþŸÐ°¬$šý„úÇø/öÝõküù• Y¶âܦ 'Tüeõ}ñhìØèèêþíóJùn7 @5‘í‹ ‚†§þÒú–øø]ø6ù‚ü¬ý˜ê··”ýù[÷4ôYõ‰üîœCùŒk‘ Gªû·õñ·ëcéNé ëîîKóÿùlC× $Ú@ Œ ­æþ ü¥ø‰øëù…úßýúp ~ĪOý9úíö8òròÕöéü\+ Ã$èæ¼ §ú/ô’ï ëìç@éìïvô†û®pÞ d+ ¦<œÿdüfúù¶øú üÉþæhÿ‘Jþ¥úÑ÷0ô;òÙô5ú±ÿ?´ ڑ *þ«÷QñFì)éWèêÒíòöøÜÿ·Î "±¬Ùp ëý­û¹øø£ùûÉý|Vhèž)ÿ•û ù+ö£ôwõQùõÿ¯û ¯ ]D °Ã÷ÄñËìôègè4éúìKòJ÷¦þÞ Hý 7 iÿgýdû–ùûùÓúËü@ÿÕnÖ>é NýžûÞùø0÷â÷üÀ¦T dD¸µ ù3§øó¸îFëXê¬ëbïÊó*ø_þÐl  G U Ó ¬TÕ%ÿâüMûIûkûØüwþqÿDùFGþ\ý˜ûúiù.úVý[†Û¸ ž CÎ B ÊLnü÷åòªðAî–îQñ¿ó°÷LüQžG Z ë ÿ‹C¼›îÿ4ý„üÕûÌûŽüÂý…ÿßÿú’ìþŒÿÿ†ý!üýÿÂþµÿÖy—ÿJ õSµ¥ý£ùÖö%ôòaó&ôõ£ø­û’þ;ʤX6ÄÃâsÓjÿ‰ýŸü ý×ýþ)þÌÿd@b•°ÿÖÿdþþUþ~ýPÿ皤^È2:™¯˜ÿ¶ýÇû_úùý÷_øßø¦ù’ûWýJÿØ,Úvø\Oa;‡Hÿþ.ÿ þ,ÿU Óëÿâfÿþœÿ´þ!ÿzÿFÿ;¦aýLæ´ÐÿNÿdþþý ýý¨ü€ü¶ütýþóýÿÏÿ¶Yï³)‘ßž|‡íÿ ˆW˜ÿëþUÿ…ÿ)ÿHÿGÿçÿŽ5ñÿ]ìªf‹z‡6Îÿ±ÿ–ÿ[ÿÈþcþ!þ:þOþÐýKþÖþáþ\ÿ?ÿÎÿ¹|žÀÈÿÎW*±×ÿ h¬ÿøÿÝæ¹FôÿˆÿçþÁþ"ÿáÿWb¾ÙrÒÿªÿ§ÿ"ÿÌþ¾þÿMÿÿÿÒÿÿ‘ÿXÿoÿÎÿ¬ÿvÿ°ÿÌÿ©ÿèÿ"B„’Ù¬™äÕÿU [<ÿ'BÌÿ!Z,µÿ’ÿ 6M"ÙÿÂÿHÿjÿ°ÿlÿ­ÿÜÿ°ÿoÿ ÿ·ÿoÿjÿºÿÉÿ7ÿ³ÿßÿJ çÿÿÿÙÿôÿ©ÿ‚ÿCDy†ŸŠz·£ûÿzÿÏÿ$†×ÿ(°G„ÿiÿõþYþÍþÿÓÿ‹ÿ(u€†Óÿ3,{ÿÿ¬ÿ­ÿ/ÿ)ÿtÿÿ.ÿ§ÿ÷ÿÿÿvçÿÿÿ³„h‡À.Îÿµÿ *@¥ÐÿÜÿWøÿßÿºÿáÿðÿÿõÿ3Mêÿ tÿ‡ÿtÿ³ÿ$Ðÿ‘ÿ çÿ"ÿ,ÿNÿÚÿÉÿÏþ¦°ÿæÿ÷ÿ˜ˆáÿúlàËÿÏÿe |3ÿ¿ÿB‡ÿ"ÿhÿ¯Ïÿ/ÿËÿÿ#kÿâ‡ÿ$ÿÿ¾ÿ'‘õÿîþÓÿ€ÿ¹þHÿàþÈÿsþòþ5‹wW¶ƒiÿl†DJwÿDf¤ÿÏÿk_ÿ¦þL™ÿ'ÊÙ€&oF‹ÿHÿýþÚýwþ‹þ\þþ*ýþÿjþ?ÿC2¢‰²·d7"™|ƒ}@ÿ"ÿ‚ÿÿ4þOþ¤ÿÐþýóý6ÿÿþÿ~ÿÄ”ØÍAƒ@ÿPýØûÜú¬úÿúŒúûtýÌþiÿž¤ØX{…½íÿCaÿMÿÿÿÒÿ‡'<øþ¡þïü(üü}ümýUþoÿÒ–„d¥Øþv-:ÿü—ùÎö›õ¾õÂõ8÷3ù_ûÞþ4}T•xàb¾ÿþþhýIýzþ ÿµÿÑšÓ©–ÿý üáúµùùáúõý„xŸ  ½ Å ø´*ýFø‚ôjò/ðˆðÜò"õùý™DÑJ s » ÊÆîPÿ'ýdûÁûSü<üñþ9Ÿqc5bìÐýiû­ù[÷Âõÿõý÷fû£ @Ñ-°÷ ïHù›óïXì„ëéìÌð)õÛùüÿCC ½  K  …¢âxü–ù¨øÌù>ü–ýîÿ UàÄÙN`éýƒøaõ°õõÆò‡ôúÅÿ\òꈈ¡µøñ!êè"èÎè<íóó$ú+j“ –öy- ü 9ÿyú“÷_öþöàú²þ´6^Vž‰ ™ÿ+úŽõIó`ó ô’óCö2þ ÔÑ*­¼Ì „óûBñÙì±è‹å$è<ëOïö÷:ÿ»Á ‘ÌO Á œ›²ûŠøE÷˜õ÷ü„ä D•·ÿþ úõ’ñRóŒõ<ö]÷¡ûÉË ¯Î? Ö7 ¿Jþ\õ·ìéÍç çÒê6ïUôÕü 1 Ÿ˜Ó k~qÿòú‘÷Ùö³öCùsÿ>(aH Ø‚’¿ÿwþÆüZøõDô¿ó¥õ/ùú{üU+ 5gâ¿IU ϼü'õýí7êYéhè~ê=ðö¦û Ð[j ¨ " ÿ°þhû‚ù)øØ÷èø|üh¨òÄ{’ßRýVü—û¬ø%öKõŒõø„úû"þ¢Á ¨ŸÎ$õ ƒ(û`ôí\ê{ê¶éòê|ð¬ö-üUì^ pV®Ä c =¦ÿâû¨ù‘÷<÷6ù7ü™ÿ@‚É^•¸Õcÿ¤ý7ü9ú÷£ôiôTöqù(û²ü{r U¦Â­L …ÿþ÷üðüëÔêÅê£ê5íšòóøåþÐT û z‡ þÔþüjùO÷]÷ôùëý UM¬FWO×þ±ý¥üÊùÚõ>ô»õøÚù§ú¨ü[¤` þüÓ xpYùÖñ[ì@ëœëKëéì‡ñ|÷¶ýì¿k gã  „Òÿgü6úÍ÷©öHøçûàÿÝÁȃ÷ê3ecþ¤ü(ú.÷ƒõõÚõ†øvú½ûˆÿñô ¤©Å / w©üöîï9ìzëhë¡ìºïHôÓù‡ÿW‡ j ^Í ]&jÿŒüfú¥øøùxü‚ÿh<^2WËÿœþRü6ùƒ÷¨öçõ­öùßú›ýqj¼ 무 º¤‘û‡õôïeìíë£ìUîLñIõoú2 ? n ‡Æ )Þÿ5üwû/û´ú^úªûuýÕÿ“_3游¿´ÿõûŠø]÷ÎöÒ÷nùîùü¥Ò LIwt ' ¨ücý¬÷oòÞîî1îØîÜð ôDøFýÉÕ  Y E ø ùf ÿ ý´ûõúûpûÿûƒýÿØaˆy€,þßû¾ùæ÷—÷ÚøKúúûÑþOk 5•:Ü ÞU*öüøóáïŒî î ðxò–õ;ùÇýö˜ Ñ À \  f tî;pÿýÄûBûoûÏû!ü ý2þMÿGó¹¢êÿèý;üúú ûsüÌýFÿ½SÇ  â  m {ÖÿVý…ø°ô*ò@ðkðòôgö-ùNý  6 ¸ e ç e ÞI9DÿÔý5ýßüTüþû‡ü*ýÇýáþ¾o@ÿ þ·üéûZüÔüSý†þêÿ WÜ 1  ®ª](>þæúž÷·ô>óïòƒó$õ÷Cù>ü[ÿ–‘¨ {  ®þßLKC_ÿðý5ýŽüüêûûû‘üý…þ€ÿ ÿòþ:þ¬ý‰ý þ™þÿÿ]ï þºwÝ`þBûgøöÆôxôõ‡öøãùüŽÿŒ+êËùè÷”žN‰«ÿÿ¡þ²ýåü'üÈûÕû[üPýjþ_ÿœÿÑþáýžý¸ýþ¨þ6ÿŽÿ|yÅshU€=Û³ð_þ´ûùàö®õˆõXö†÷Ôø­úãü^ÿð7ô-PUñ5²?ÉþµýÕüdüRüyüýÉý°þpÿXÿ\þˆýcý²ý>þ¼þýþNÿhm‹þ·°é¢Hzqþ0üåù÷÷Îö¡ö`÷dø£ùIû3ýPÿuz' Z²íº'.ÃXÿýý_ý.ýý÷üýRý"þÂþdþýPý’ýþ}þ×þFÿxJÜþ‹FlRµàÿÊý¦û“ùí÷÷÷°÷øÛù}ûhýŠÿØÚ@$¯ìÑlÄŸ=ÇTÿþ~ýýxü7üŸüƒýbþwþµý1ý8ýnýúýÅþzÿ Î;ƒ‰ãki§2mÿ_ýôúÉør÷¾öÑö®÷ÍøMúüþ_j@ [à#ã4(Ñc¸ÿ°þÕý1ýÁüeü{ü0ýþþfþÐýKýhýòýxþõþvÿõÿ ßÞQÆe™p>-¾²þ?üåù&ø ÷Ëöƒ÷šøÅù ûéü!ÿWS}¡/˜›[ô”Qÿ{þùýHý‰üsüÀüêüFý³ýýý>ýÃýŽþœÿ€*°¢7„>O¶­Gñ™ÆþŽüQúqø?÷íöq÷yø­ù ûËüïþúÌ|¦‹+‘}DÈ9ÿüý0ýµüüÇüýLý¼ý þÚý¸ýóýLþ°þaÿJËØ.眈9¿ Hþ1üúOø÷ÑöA÷7ø¹ùyûWý\ÿyw9.™V‰Zªðaÿþ#ý°üŒüüÙü¼ýœþÛþ£þþ”ýµýHþ)ÿu½{ÊtàY ª\ß ÿÈü?ú6ø÷þö€÷møçùyû-ýKÿŒ£/ó]Æý“v¾ó†^ÿcþŠýéüŠü|üïüÔý«þÞþþEýmýgþlÿTØéEBÚs-ú3ìÝÿÛýMûÆø8÷ðö«÷UøÂø ùBûåý]­€(¹¬‹Ï1õÿóþØý¥ü+üaü$ýSþbÿ¿ÿâþ™ý“ýnþÿ±ÿ1Žb½ó<ßhª¤E2Iý9úøúöCö©õ~õöéøäûñþg°Û<  Hvóhzÿ:ý¾û˜ûÖûüØüáýÅþöþ#þ†ýÃýnþ9ÿÂÿ$ǃïoȰԭ~ˆŠòüêùÜ÷þõåóžòóõø$ûìý¦˜ä X ˆ `o™—3þšüuûlû4ü‘üýþóøþZüüOýéýNþ“þÿ@Gš,"¾ˆ¥¹ý~ú*÷Žô¥òàð9ñ“óÄö<úýÕs › õ  ‰aù¦þ€üpû!ûþúŠûóüŒþ£·ðÿ ýü"ýåü‘ûü•ÿÊi¬/ ‰ ¡ ÿ „ýCùDôð¡íñì&îCñ6õ3ù þA¯ ± pÝ  à†…þZü»úmùLùòúEý6ÿQñÄ«sþ¹û!ûùøõùZüÏÿ) ¥ ´2~½ ”LƒûvõôïÙëÞéÆé‹ìÏð ö©ü²%ß ÈÄ”  ¾Êüùø_øÖøNúþÃ_î®æyúì÷™öôsõÔøDý1  oE»~3 `ù$ñ{ê·åóäeæpé•ïù½¦meKÖ~ fÿtù_õ>ôñôºö¥úëÿ3ùö ¾ Ιöàñyð©ìüîGöÜû ë¦*I ãÿó,ëå à[á…åoìûõ§ÿªÇžïò E¨û»õ°ò6ñ:ó`÷ðüû€ H8 ßÙûóñsïCëšé8ò´ø†fO½÷É® Ϩóê¥á]ݪà7äqê;÷ìš -P‡$½~ù#ó'òßòôŒøŽþZê Ñ ;Ä §;û_ñÒëéëæãïPûõþû )c÷.þ¥ &gò¢è"ã­Ü¿Þoæíe÷PÎ R™é ¡ÞüööòòHòúö”üF– )½pw úWøì«ê•ìéFñ¸ÿiѰ¤ r2¥É…ú>ìsægâ<ÞAä>ìŽò«ýÔ` Áêó z­þú™öNóÁô”ø*ûÜÿ&9  3  Š ÷[üîê¡î´ë÷ìÇü”K C]ßýy êücí2çäzà¬ãì²óýüA gš…ø œòþ˜ûö¶óØöï÷Šú²¥a‡ ¼ æ K 1øÚîÑíIð–íô4h žŸÐÇGó !&÷=ëEç ãûâƒç ïùê1× ØOýøø³÷BöÌû¾”; 4 = ñ ʲùSî‰ïñyëLôò ·ËYQJÝ^¢õî#ê\áDãÌéÛìV÷„¥­Œí*LÖùœö½÷!õùNÿ¨Ö ’ 4 P R-ùfð:ò ðøì¹ûO°¯‘wE” ìôœïíçTáèÓêqî&úúôt ÿ®ö Ji„ú&úuö÷ûàú±ˆ¢  ×þø¬ó òßðÃ÷aÿÂÛ Äåcz3=ùˆõ(ë6ä®è#é‘ë®ôŒü«R’ 5b ë È ”×ýý¢÷Ð÷^úÍùôÿÿQ ! ´ü7øfùáó|ñRýJy¸6;›• ÛÓõØò²êÎâGéƒëší}÷ÝýÍñ ] $& b9 jýëýjø“÷üú‡ûi,ÓŽ  øþ¯ü¬û(ô]òlúþ%ÿ| Ñ ¯PýùõëçæëˆéTëðò¦úáþ ´ e – ô XOþÄûê÷ƒ÷ÇüæüÊþšG žýýûÅø õ#ýYÿ þ ßH ¶Ö (®ÿ®÷îšìpìÔècîëóFö4ýþï  { ÷ Ü–k ûVøÃûÐú(û© $̬ÿÌûÎü9ùBøi‚ÿ‘ŠKRX þƒû¥õQðHêëXì¤ïªôëøÓÿê<= ¤ ) m Gtª7ùµüÏûÃø º[šy ÿèü¾ùèøKú½ÿØ!Z ¶š eønòXîëIî[ðîñ'øŸûÐÿÓ¹Ë( k ö-¯žøÀøÿ×úýr…Mâþ_ý/û¶ö'ûo)à>íNkXÿúòíõë\ë¾îæñæõNý÷ · &  . ]Ýñú‰ø„ü÷øàú®v“üDÿŒýdø/þíFÿÝ£N è™Ù âÍîøòüîûë¤ê1ídò€õ2ûA AÇ Ü ’ ½;Húóû(üJ÷¹ü³ÿhñøÿÃýCéü†ønýÑL޲ ÇiX L§øõªî§ë)í ígòèõFú|J‘¼ × / õ NýýŒúNù¾ûþÿ­ÿ‹þýýöüšý'1I ‡X²@ [æüFö¿ï‚íñì¦ìÓðÁôšøúýïo×Í  ú:ׯÿæûwýû÷øþÙ`þcÿWüqüñúáüO~d; ¿| Ú ˆÿ¸ùW÷ní;íƒííGó²ôú.Ñš£ + ß ²ØùéüáýoûÇøWý÷ýqÿÈlüµýVþ“ù5üíÆ¾¦ ˽¯Ç« ‡·üköOîíuí·ì­ð•ôµøÛýý* =  Ö­«þZûmÿÊùŽùÇŽÿçþ þTüý°úÅûP‡¸°2 u#ýö÷JðéìÖì¦ë˜ï ó¬ö½üœ_ò à w #¤üîýûÄúpþ$ÿòþ°üÖû—ý úFûÐ?É@¸ >×ç,ÿõø‡ò³ð,ïƒíðñ ôâöÊüÿ&BxÙ  3Ž£ÿÉÿAýŒùýOýÿý½ÿsüü'ýcúÂú´d ôg2© ”UþÖùlòãíî†ìïî§òeöFüoÿX 8 ô h"ÿ=ÿçÿ7ù­û÷ÿBýÿ‹þúÇü"ý}ú˜ÿ{ðS µœ†þ `fiùýòôíOîìîåì[òÇøtùÙþ'²" R›æÿÁþ¢ÿ/úŠû¦ÿ6þÿ7þ…ú°ûxüÉúðÿÜg ¶ ¸ƒÀ«œþå÷¢õ…íoíôï—íóÒ÷ßøUìe ‹ ª¾ ÛO–ÿüaüÑûWýæÿ/þü•ûhüòúÓú¼—‹¯E±žÓ ï¤ýBöàðÒí?íí¾î¶óø üÕKz ã l @Z™ÿ×þjþÈù¬ü·ÿIý0þ>üWú ýòùÝúÐÛ‰tY— ë|‹ýtô ðBîÿìIíÐð[ôVø'ý*d Ý } y 9¿ÿêù?û0ýïüýüüiúÏúŽûùäþœR8 îÉå è¸þîøÔïì«ìNë~í†òWö’û·»ÇÄ Ò ÅÁáRþ„üÿýšùÜû6Îü½ûšüÛû–úûS¨(ök« þÎøó<íËíxìØíµòÄõòùDÿ“­} d ˜ «¿ˆ ÿCüýûJüôüÄüü úàùümúdþN¤ Gî¯y £ðÿ£ú'õqíúíÀì™ëdòøô©÷{ÿ¨Ò [ ú l Æÿ™ÿ&þ*ý¥úÑû"þý úùÇûîùòø³™§úç…œé5 ·~ÿ¨÷„ï^íöì^ê0îùòïôäúÂÔ7â ] ‡ ' öÔlþ>þÚúùpýƒýçúÂùÁûðû÷þ?XÿSã¿ +8 ðOþ1ö+íÝïóìWèxñfóóôü÷^ ­ q Ø c ŠRÅÿ°üýùºûäûÈùùùxø¼ù*û^úQàUsHš¼©ƒ eÉý,úŒò×êíì^êWðwôø×ýmn! ` s ¨  M—³ÿWû„úDûÿú,ûjø’øû"ùRüR÷/à½6ÿ ùÿzú­ñbïîóéðì,ð&òn÷#ük8f u × ñ ª Ñüû;ûÂú¤øÄö)øsúÆùSüÀLc¿QÝ ™\ÿ\úkòRïÛíÿëÑì²î*ó÷ºúâO¾ § „ « û˜‰ýãû¢ûÏù¿ø øñùsürüÿ~pTxh ø æNb þŽû%øøõ ô%ôuó½óŽö{ùÜûFÿÆæºF­ÖoÚÞx’%üÿëÿ°ÿ»ÿ{ÿÿÿ ÿ)ÿMÿ¤ÿ$i´ºˆ<ÄÿUÿùþÓþÉþýþRÿXÿfÿ½ÿðÿüÿ63õÿµÿNÿÿ¹þ™þ±þëþCÿ¢ÿûÿX´>k¦¤uJ•BÐÿ¤ÿ¸ÿÁÿªÿŸÿ®ÿ·ÿ ÿ±ÿÝÿõÿ!ëÿˆÿ)ÿÏþþHþ%þ(þ2þ`þ¹þÿvÿíÿ†xÙô¹^Îa ¦ÿyÿeÿiÿ‚ÿ¦ÿëÿ?TP³æ¦u8çÿ¾ÿeÿÿÔþþBþ"þþþ7þŒþâþ^ÿîÿbºQk}xQ#ä‹%ÆÿyÿHÿCÿpÿ·ÿl±ßìÜǘ^%Öÿ‚ÿ&ÿ»þfþHþNþVþqþ£þèþ.ÿjÿªÿëÿ.aœÎÛàÝѪŽ|r^=/',=6,PoŠ›T ÆÿŒÿKÿÿóþëþöþÿ!ÿ5ÿPÿwÿŽÿ¬ÿËÿæÿôÿáÿÒÿÁÿºÿÁÿÉÿèÿJw•±¹¯¥›ˆwnT;* ×ÿ­ÿ‹ÿ‚ÿŒÿ˜ÿªÿËÿíÿûÿëÿÎÿ¢ÿ{ÿUÿ)ÿÿìþìþÿ?ÿÿÈÿX‘´¾Ä¹ÝñÌ´u/þÿÁÿ•ÿ{ÿ{ÿÿÉÿðÿ6NUQI3øÿÉÿ•ÿYÿ%ÿöþÝþÑþìþÿAÿzÿµÿÜÿôÿ12_„£¹´¨|Z*ÿÿùÿøÿÿÿ%=TW?"òÿ®ÿ€ÿNÿ:ÿ6ÿCÿjÿ„ÿÿ±ÿºÿºÿ¸ÿÉÿßÿõÿ"?øÿþÿíÿíÿøÿîÿÿÿ'.<WTWssu†hUGøÿ¿ÿ}ÿsÿhÿ=ÿHÿpÿ@ÿ[ÿˆÿTÿÿ“ÿ–ÿÙÿÎÿçÿðÿáÿ÷ÿßÿôÿùÿüÿ9Ldup˜¨ª•‡U,Îÿ±ÿ“ÿŽÿ‡ÿ…ÿ•ÿ’ÿ’ÿŒÿ„ÿˆÿ•ÿ·ÿÌÿ×ÿßÿÄÿ¿ÿèÿëÿÒÿáÿèÿëÿ *13<BLNPM2àÿÎÿ»ÿ­ÿ±ÿÅÿÓÿêÿøÿÿÿþÿôÿòÿíÿèÿæÿÓÿÅÿ¾ÿªÿ¤ÿ¢ÿ§ÿ°ÿºÿ¾ÿÆÿÚÿñÿ'6I@/þÿíÿëÿàÿÚÿÙÿàÿçÿðÿ "''" ûÿôÿüÿøÿÙÿÓÿÓÿÄÿÉÿÏÿÌÿÒÿÎÿÌÿÓÿÓÿ×ÿ×ÿÜÿàÿèÿòÿëÿçÿëÿãÿßÿàÿñÿ üÿøÿûÿüÿÿÿ  øÿçÿàÿßÿãÿäÿäÿÚÿÝÿÐÿÄÿ»ÿºÿÌÿÝÿðÿ( þÿþÿþÿûÿ÷ÿòÿðÿñÿòÿùÿûÿõÿòÿîÿæÿÙÿÈÿËÿîÿùÿøÿ÷ÿæÿÜÿÕÿËÿÓÿÜÿßÿäÿðÿñÿôÿõÿðÿäÿßÿÖÿÚÿßÿçÿëÿèÿæÿðÿ "%+%øÿëÿàÿÙÿÕÿÕÿÜÿÝÿàÿãÿäÿîÿîÿòÿÿÿùÿôÿßÿËÿ·ÿ³ÿ¬ÿ°ÿ½ÿÈÿ×ÿäÿðÿüÿþÿ '/*  ÿÿõÿüÿùÿíÿñÿíÿãÿäÿÙÿàÿãÿßÿ×ÿÌÿÄÿÄÿÆÿÌÿÎÿßÿäÿæÿæÿñÿçÿÝÿÒÿ×ÿëÿÈÿáÿàÿÚÿõÿëÿ ÿÿÿÿ üÿñÿíÿôÿëÿðÿçÿõÿ " èÿßÿßÿÝÿßÿÚÿßÿÓÿÌÿÈÿÉÿÌÿÓÿàÿäÿêÿãÿËÿàÿùÿðÿêÿñÿîÿûÿ  þÿðÿæÿàÿÜÿÓÿÎÿÒÿãÿðÿôÿ÷ÿûÿõÿñÿõÿèÿàÿÝÿÚÿÏÿÌÿÒÿÓÿãÿîÿûÿ   îÿÝÿÕÿËÿÐÿÙÿßÿëÿðÿùÿøÿôÿ÷ÿùÿþÿüÿ  øÿôÿñÿäÿøÿ äÿÌÿäÿ×ÿÅÿŽÿŒþþ¬,Gÿ‘Bü]û7oΫü$iùÕýþ%þHxÞ<Cüüÿ/÷ýþþ 9ÿ‚þ]ôˆd}&ðÿ¿ÿ+‹ÿoÿ"¡þ|­'ýXÙÿ²ý‘~þnöýÇâŽÿêu©3ÿz|—þ¨ þ×ÿ/ÿûÿ7ÿ@öþ2ŽîÿCFÉÿ?‡aÿG0þPÿ€ÿþã˜ÿNhÿŠÿ“ÿëÿ&PÿÑÄÿ]ÿ„ÿy¾þ‹þØPÿ$ÿFbÿµÿ›Äÿ+ÿ1â"ÿÚÿ˜6•þç¹~þñÿ]9ÿ ÿ ˆÿ²þ!ûÿîþ<ÿÈäÚÿ¬ÿªCÿàþo’ÿÛþŽsÿ ÿ÷…ÿ×þγÿÿ5©ÿ¤ÿ~ÿ\ÿÛÒÿ ÿìSŠÿI5Áÿÿ ‘Èþÿ›×ÿÉþ6} ÿ+ÿaeÚÿ‹txœÿ ÷÷ÿiÿËþ~þÈÿ!þÁüQþ®þ±ý{þµÿ= 8†óîÿ¶€[ÿÁþœþòý¡ýèþîþ´ÿÀjé2r°F³f°ÿîýÈû0ù˜÷ö¿õçõØöÃøàúŠý±…)gbÔÙˆ_¾¨ý$ûâûxùT÷%ûRüéûÆ9ö` ø Ÿ c ó§cÿ±ýßønôió*ñðÏñ‚óäõ†ùý`q{ R ‘ OO)}¦ÿFoÿÃûáýý¼ø¨ùàú‰ø§ùý¶ü þX½ 1 * rüþÄúWöxôøñUðçñóõØøTüçÿ­1Ï h / Q  w9zéý}üÍü¶ûsûëùjùFû_ø)úhÿêüZkìË ‹ r à ¾„ÿJüí÷èò˜ò–ïßíûñ¢òëôûâþ{a Î · ‘ È ]eßBîÿ‡ûüÒülúúýüLøþüdû¡÷Ñýqþbûâv ÝÍ ƒ S 2OÈÿ'û{õÔñhñ{í½íƒò¯ò¶öý÷ÿY › B í º  ìoPýmú*ýû+ú¬ÿü%ù%þ<üƒøýŠÿÔûäš è³ ¢ œ ´jþyûeõáðóñ3î°íóúó ÷Íý‚ä@  Ô ¡ ~ B WOeEýZüÀû3ú‘û]ýOü:úwû|ýÊùÈúØVý§ÿ¸ l1 s \ WÕÿúŒõIñàïîçë|ð óäôýÛN] Ð m± Ì hâýéû›û¸ø@ùOüÒûÿ)VþÉý+oüœùëýZü6û‹v€Q . G – 7md«ýùùAôGóƒðÆíëðò%ô&úYþdÍ$ ² 0 ½ º {Vì!þÿýCù}ü„üZû‡ÿþRúý4þnùvü)ÿû…Äd¾ | êûÑÙD&ü úô_ñ/ñOìíïeòòqù|ý(¶} ï îp ¥ j ôâÓþ;ý³ûvùqüû´ûä½ÿ€¨^üàÿü©÷ßý™ûTú¹ÑÂm ø “  bêÉÄýŸú<õóèïî ñ.ñKôùùÜüé*à  m * ; ™ØÿïýûìûÇü=ú£þ·þýÒ¢úœþ¯üT÷1û7üIûž  Û ï H  ö´þHüšôÑòðÿìïGð¼óšø}ü4QS   ò š ÓúG“ÿµþ½ú´úyýHùéûÅ=ý©úàû1ü¨þ§øùJþÓúÿð¡ m è+ °þcýLø?òíñÆí{îeð›ñŸ÷wúPÿñM YP D | ÷6“ÿôûÏúðû>øûïþÕúr=/ÿ%q©ú3þüÊ÷{üÇü:ý§íÉ’  * ¦&ûþ³ý²ûó—ò#ò:î ñ[ôÎõ=û_1  4 C @¾øþÿnýùzúBüúüØ_ÿ“¸ýØû±þ<ûùÿ»ý·ÅÉ  ¡" ¦…ÿãûqønô|òƒñ^ð«òÅõé÷{üÚyD  M î ‹ þÃÿý$üGúúäú‹û;ýuþo±þÍüÿÙú×ú¦þÅÿR )^¶ ¨µåjó•üúUø²óëôóØò"øú÷²ûhÃŽçk‹ Ì A«m/Õÿ&ÿrýƒúuûÐúaúšýLý·þ¤]ž¦˜ÿAþ•ÿÕý›û5ü]PýìýhÕHþ Ê€ì ýôû,ú?ö7øöõŸú‰ùœû;¥‚”¡¨ÊȤòâþÆþý&ü¡üCü=ýþÂþß¿?Â;ŽûDI¹ø€OÂùòD¥ü³“ÿèœhÿþ¹ü&ý÷VøŽû€õÆù7þeúÿé.á ž]} ¡,{ÿpþ_Yü;ý·þºû(þêþSýAÿÁÿL'ndA2ªþs”RüsZ·ûµÿ`hüöþÏuý.ÿú7þmþ•ÿ£þ;ý‹þÿ ýpÿý£þã ㎥A¦º'Ðþ&þ)þžýí•ÿDÿž—s>v&o7ÿFýý¨ûëùÎú”úGúü?ýþÖÿyÛ²HÄJ­´)þ|Ùÿ¡5 åaH0!ÿþlû:ú÷ûõ%øõõ€÷ûøú¤ý—µˆçCdâ¬ùV(¿ùÿÀ¹þ×ýþ÷üýêüFý2þwý¹þÿþ3QÀQ‚2­™ÉÿvÿÎÿ0ÿñþRÿjÿåþ_ÿaÿAÿÙœÿŽÿ(oõÿêÎ×ÿ3ÅÏÿàÿsŒÿèÿk_ÿ“ÿ§ÿ\ÿãÿeÿ“ÿÂÿåþ·ÿ±ÿ@ÿZÒÿÅÿÁ3}h,*¨w5ºzËÿùÿDíÿÌÿ­ÿvÿœÿŸÿ½ÿjÿsÿÒÿˆÿ¦ÿµÿ¤ÿ+%€9/@üÿñÿ‹ÿ}ÿoÿNÿ§ÿ‹ÿÐÿ§ÿ ÷ÿœrþÿäÿçÿo(üÿÕÿ£ÿÿ!8 [ž(°ÿÚÿÕÿbÿ~ÿÈÿºÿ8»ÿ˜ÿãÿ°ÿÜÿ5=´ÿŽWÿ ÿ‘ýþ„ÿ©„ÿîÿ%äÿ"ÿ (ÿ vÿ›€Ýÿ±ÿîÿ[ ÿ ÿ˜çÿzÿDàÿsÿ§ÿ±ÿ½ÿ£ÿ3Aÿ9=°ÿr×ÿ‘ÿŠ1ùÿáÿªÿÓÿ7ÿ ÿíÿÿ°ÿÙÿ¢ÿ—i+ÿÓ±ÿ*C¸ÿPãÿPÿÝþÎÿÑþª*Fÿ3¤ÿÈÿõÿ^›ÿ±ÿºMÿ(ÿ,XÿMÿÕÿ;æÿ}ÿË»Qÿ’éJÿPñþDŒÿŠÿÿÿ²þ^qÿÝ‹Òÿ—ãÿ6uìþ+²þº´ÿÃþéRÿ=ÿŸÿ2î­þ_` þÆÿfÔþfxÕý/Rþ~ÿ}ÿ*Ìþ•&µþØîµþ´hÿ"'Âÿ°­ÿáÿdYÿ¿ÿ¿ÿkãÿMÿÀ±ÿ,ÿ–ÿùÿÎÿÏþ¬’ÿµÿ8Çóþiÿã¸ÿ°ÿI¿ÿ~ÿãÿÂÿoÿDÿ;§ÿzw´ÄÿHÿ Áÿ?ùÿ,ÿr¬ÿÿ²%þ?ŸýÖ+Ñþ¾Dþ¢þdýÌIdþx×ÿÆþ[¶þÿ’ÿÎÿÜÙþ I¿ý·E¼þÏÿ,ÿ>„ÿáý†õïýé”ýÅÿÝ`ýÖÿd`ý–ÿvÑþ$%¡þƒ8âþ¸ÿ!±þìþ2Ëÿ=þÆÿñnþÝþª¿ÿÿaD ¸ÿƒŸÿÿ³ÿŒÿÿÿJÿëþK·þ9þû÷ÿþ1-uþsÿBþ ÿjþÿÝþÑýqÂÿ ü•\ÿÉú£¬ÿ‰üÄêÿ^àþ¡þ¼ºÿKý#¨ü·cýýZ&ÿþÿÿLËúý|3òþäþk!ZýFqý Ó†ÿC}ÿaÿn}þú8ŠÿÉÿ~þd¬ký.¾‹þýÁþ7Cÿ¼ý²cÿÿþB™ÿ·ÿ8.ÿ3ÿSC¾’ÿAÿ;/þâý°@¢ÿ±ÿÿêÿúý×ïýoü¨üËû®ýáýI9*ŒüØñ¬û@Îÿ&ý]¹þ;ýC¼þrü«þŸÿþ‹ÿ<Ïù÷Lyøzùý¨þ½òúDzýÂvÿ„þíqÿIbÿ¸ÿƒÝŒþþÝþ¶]ýªÆý[ÿ«äû¢ÁþÍþ «ý{ºü×ÿÒcýŒ_ýï©ÿSþ`êþWHþ5þ#ýàÓþï ýÑþþ÷¶æé÷ï;^üœhý`‚ÿ6þ—xüÖÿ‡×ÿ|ýÆÿýü$ÝÿêþÈýýpÿÿFýáÿoÿ¿þÐý¨LìüË *ýý+Dý©ûãëýáüä‡Býþ÷³ýüD…ÿ*þQ^Xûò±þÔûS‚ÿ9ûãÀ ý™þs =ÿˆùÆ•û¶û¸ûKÿ ÿŽûìóþ\ÿR5ý<oQÿåüÚýÛû]jzÿ)ýÀûŠüÛ»ÿ$ÿ°þ.ñÀýnïûÉã‘û±ýzÿY¿ü ‘ÿýýYI]þoÎý°’õøRÞûIÿ—Þü ýúý þ¿uŽVý~Ëyûä¹ þ/ÿÊþÿèü ÿEÓýV~ÿüPúý!üÌñ|ûyÀ­úGÿ“ý2pþÛpÿÃþ'#þ¬’ÿÎýºÍþÌýÀü7ÿ›ûrpÎûèÂýêþ@ûÿJ$Ôþ®ÊþDým*pûx‰Rü©I5ühÿ§ÿgþ—Ñ{þ£ÿ»aÿøÿÆýè¯û†ÕÆüêÿæÿtÿûþv²ýºÜÿ#þÛD½ýgü¬ ûgþ Àö÷;û×ûÅZ9úœ VùÙÿÍ8÷+›ÿÀýTúçpÿ»ýñVý¥¤ÿ(`!üoÅþ§þ•çþ’Ÿ˜ÿwoýƒBPûhDÿÿû_èþ þ`“ü`^Êöp›0úÙœûv¥ý‚aú0'Jü çû¿;þ1ý|Øü“@ÿœþx…þpLü$àúuþ‘ çõâ2Ñý~Îø9•ÿBþ” ü€öù¾þÈ÷½üÂZý6=¯ýh5ü_ý„ý¶ýžiþÈÿ=¨üWÏ>üù»ÿðÿ2ÿp7ý¼þWSþÄÿ„ÌþÏÿž(üúwÕö9‚š÷´þ;ÕÈûõìýŒü{>þüÕ‚—ûäžÐ÷® 3ú¯ýã–úmh}÷}}ïø>;Ãû0ëÿ†ýí=ûdKùw½üŠüæãüþíüÀëøGÐÿ7þÿû\Ýûù­ aúBýM³új‚Eý‚ÿ{ýküoþ¡üí#þª©ú®Uÿ¥ü™ÿ»ýIFŽþæÃûúZÀü/üÛý;ýÎ*üÎûÐ ‚÷$÷çù‘û±Õõ( ‚ÿîöï ãúnùžéû€xÙ÷: ðø³W¥õ Wûñÿbaø éølü v÷ì]Xùš]ûCüì.ú°«ùù£ùüþøtò)YFú­Šöø×‡ö„Âþcüþì^ÿÉÿì^ü vÿ¡øù3ÿ8ýA×þ÷­ÿûûg Àû¥˜ÿ)ÿ¶‰üh˜ûlþ]üÚcý øØîö¯cþuþã ú‚HúéýÙÇ÷ “ÿüËUøb†÷3 ~ýnûv ~󨦋ð Šÿ`øõ 4ô1ÕòÒ Öûúù¾ú=ÿˆ˜ÿÜÿXÿ/þ~ˆrø ~ÿ›øÛ:ýªÁþLÎûcuþ>HýЯüwwîùˆªÿ4ýïýtªƒúwýÎÿÊQÿ»ÿ³ÿ¦ü™ü¼ýJ ÊømÿÂJþ9þûñZ&ø«ý*üªsþ 1|ü”Ž!ù¡‚ýŽ÷¤ ûÏ6öæ |û¾ùÓ ð÷D™þjú#ù%ÿŒ1ü‘ü@uþòÿ»ÿ ý •ùËüD ¥÷¦!þUý5 ½óÖöÅóèGvûä‰ý«øû;˜úÄ‚)ùHÄõ ÿþ9ôé üþP^û9 ø2ƒò¾3ýrü? óÅ w÷-òž Êî£ ¸ôøÿë§ùÂh÷ 6þ‹ùy µú…þ—9þ…êû_ÿñHýÂÿ±þF@ÿÁü€¹ü—üª|û8Òû“­ÿüf¦øÁÿXšø%ÿÚ1üŠÿPú™Êþ÷ð¤ÿ+ü| öÆeìˆ »ñi MüÑWög§ÂùÆýzäÿØû´¤ÿnþùƒü³ ‰ùŠGùpsþÇȶ÷Ilþþû°äù ŸÿŸðZ ©ÿ°ö,cü•{õœìô˦}÷(ü"®)ôšˆ®ø@$üá ò×›ö£³šýÄaúIJßöTÿé÷ÛøS üÝý+~úÛåÿËŽþiþ©û_«ýUþÞ¹û¤]r÷r dü;ù˜ Tö—Àö¿ÁþNúŠjúÌÿ1àû9Íþ÷ÿr‰þLü’™ÈöD=cô‘êöUþÉù· Zü÷ø$ ýöùç}úHd@õ àów¬j÷õÑþúfÀ]ýWÿ*·ÿŠüOnþÒopûpÀ‚÷aIû1þlÉýþâû"òþ¬ÿSýMÿ]qþ3ú‡Gù}ÿôþ ý½ý_ÿŽîûûþjäþÕûüûþ˜¤þ.ýDÎ}ûüûþú(ŠýàúL™ø@ ïü®BýÇÈú˜åþþˆÿŽÐüÉýß)ýoóaú¸äøÙ^»ú¸}úðý û"Óºü–¶ý{ý ƒý2ÿ´ªû;Ä!ûåîNþñ´ú(@ûo½ü~ÿ ý›;ýþúüû<ú-“ŠúBþ{ƒ©ÿˆ0ĵþјÿ|ý‡ÿ}þ´ÿqýV{Výu5×üòýÿ:-ü½ÿt7þÿ›º±ÿÖþ]þMÿŠÿwB•ün*ü½'FÿKýp¼èüD¶¨ý;uþIÒqýÈ“¥ý}±þëþo‡üÐþá‹þìa&þ+ÁþþúþŠÿý;´ÿdý³™þ;Ëÿÿ¨†ýºÿ–€üº¸ý(ëÿ…ÿµ¤þ.ÿßfÿÀ-œþx ÿ#ý˜ÿþ¸ÿ ÿ•õ»ÿ¹‘YüÿÓþãé®þòþèÿNÿŠÿ¾þhÿý@ÿ^x59òÿ{ÿÏ—þ?ÿé¾þÞþ?mÿõÿ Jÿ¿|!ÿ0´óþñÿçþ¢ÿ˜þ‡ÿvPÿÕÿ¦©ÿãÉÿÿ¤ºÿ)þÕ.øþÅÿWÿ0ÿ[ÿñaÿ=ÿîÿQÿ˜HÿÀ¢ŽÿÒ"CÿŠ®ÿŽÿ¨HÿŸÿ½‚ÿ¸ÿQ’ÿkkÿuwëþ­Ÿ[ÿsÏÿ±ÿ5ÿ…ÿÑŽÿRÿ_ãÿºÿ½ÿ:ÿ9s6ÿ×ÿzðÿäÿ¬ÿüÿ|ºÿvÿ[=jÿlÿÏÿLîÿ.ÿíÿ’Ðÿ¬ÿ(NJ×ÿòÿæZ[ÿSÐÿ„ÿÿÿÿ™ÿo,@P2ôÿ•ÿ‘ÿŒÿjÿÜÿÝÿ›ÿ/¦ÿðÿÄÿ5ðÿ™ÿÿÚÿŠÿ´ÿæÿÆÿP üÿ™áÿ’ÿJ÷ÿ®ÿ(îÿ ·ÿÝÿäÿMÿ­ÿ!»ÿf9(ùÿ ÐÿÈÿÜÿºÿÒÿëÿ¢ÿÎÿÚÿ¢ÿÆÿÓÿ ¤ÿ´ÿÕÿÓÿùÿÄÿ+ÿÖÿÌÿ*ŠXXJÿÿÖÿŽÿµÿÝÿáÿ"/  ÕÿÐÿàÿ+/Ïÿôÿôÿ©ÿÆÿ§ÿ‡ÿüÿÜÿ æÿÄÿÒÿºÿÎÿ L ùÿ½ÿ /¾ÿÂÿ½ÿŒÿ°ÿ§ÿ–ÿðÿ üÿ."Úÿíÿ=2þÿ1("Öÿñÿ%Üÿ„ÿŽÿ~ÿÄÿãÿ¢ÿ!Üÿ* ßÿ øÿW®ÿæÿñÿÅÿÚÿÚÿe,òÿñÿîÿ£ÿ©ÿñÿÕÿ»ÿÜÿÎÿäÿÙÿ¾ÿùÿîÿ@!INàÿãÿÕÿ·ÿ¿ÿ¢ÿ¸ÿíÿ(5' Ýÿ¾ÿ¤ÿºÿÈÿ±ÿÁÿÖÿÕÿÌÿáÿòÿßÿêÿ÷ÿËÿ°ÿ*=õÿ¬ÿüÿêÿ@2èÿûÿFëÿæÿ¾ÿºÿ§ÿ¸ÿÖÿÖÿ÷ÿ6I(èÿøÿäÿÖÿøÿäÿ¸ÿèÿðÿ´ÿ¾ÿËÿÒÿùÿäÿ÷ÿ ÷ÿ ,ûÿ ¬ÿ‡ÿŠÿŒÿ»ÿ³ÿÕÿM5çÿ+"îÿÓÿ/MüÿàÿÉÿÓÿ¸ÿÈÿæÿîÿÉÿëÿ÷ÿÉÿµÿ·ÿÒÿáÿÒÿßÿêÿàÿøÿîÿ*CdôÿèÿÅÿÚÿ³ÿ£ÿÜÿèÿäÿôÿÝÿÚÿ.;ûÿÝÿÎÿûÿ×ÿ™ÿ¾ÿùÿÜÿñÿ+ ÿÿæÿ¾ÿ.Æÿ¬ÿíÿøÿòÿÆÿ’ÿÖÿÉÿÐÿíÿøÿäÿôÿðÿÕÿ"ùÿõÿþÿòÿËÿÚÿõÿ %ñÿ ÙÿÉÿáÿÈÿÕÿßÿÌÿ6äÿ×ÿüÿùÿèÿÉÿÝÿÒÿ³ÿÈÿÆÿãÿÁÿ³ÿÂÿÙÿÿÿðÿ÷ÿëÿ×ÿµÿºÿôÿÿÿ÷ÿñÿõÿôÿñÿõÿ+<B5ÿÿûÿûÿ áÿ½ÿ£ÿzÿ©ÿüÿêÿäÿñÿ"àÿ­ÿ½ÿ®ÿºÿÜÿÙÿòÿ ÷ÿËÿÕÿÖÿ³ÿùÿ *Üÿãÿ'(5ÚÿíÿôÿäÿðÿÏÿÏÿîÿÁÿÎÿÝÿÎÿûÿëÿäÿÁÿ°ÿÐÿ %.'IÕÿÎÿÁÿáÿòÿÎÿËÿøÿíÿÖÿ­ÿµÿÖÿÖÿ69J/èÿÎÿÉÿ·ÿËÿîÿ8ULèÿòÿ×ÿÅÿ©ÿ‹ÿ´ÿÈÿÅÿ¿ÿËÿñÿ  !ôÿÕÿ°ÿ­ÿÉÿ×ÿêÿßÿèÿ"82ôÿçÿëÿþÿ÷ÿäÿçÿçÿêÿÖÿÆÿÝÿôÿüÿêÿÓÿÎÿðÿæÿÎÿÜÿùÿÿÿøÿ ,B6äÿôÿ ùÿÕÿÎÿûÿæÿÁÿ·ÿÌÿüÿßÿÂÿÚÿ $ êÿíÿÓÿÌÿèÿ÷ÿùÿûÿëÿíÿ (<2ùÿÐÿªÿ~ÿ€ÿÿÿœÿºÿ×ÿDZe]6Îÿ£ÿ•ÿ“ÿ·ÿßÿîÿáÿÿÿ6M?Úÿëÿíÿ¸ÿÈÿíÿòÿõÿßÿÏÿ¿ÿÓÿæÿôÿ ÿÿ÷ÿùÿüÿñÿÝÿÙÿ¿ÿÆÿÖÿíÿþÿôÿþÿ   íÿÂÿ³ÿ»ÿäÿþÿôÿ÷ÿ'.íÿÕÿÕÿÏÿßÿÙÿÌÿÅÿÒÿãÿäÿîÿüÿùÿñÿèÿèÿñÿûÿôÿÿÿøÿêÿ¿ÿˆÿ’ÿÉÿøÿþÿîÿþÿ <Zh9ßÿ~ÿyÿ¸ÿôÿ êÿÏÿT[@þÿ´ÿ±ÿÕÿîÿøÿÙÿÜÿÐÿðÿWãÿ’ÿ£ÿŠÿZh %Œÿùÿ,Îÿõÿ_ÿÿþÿÉÿ³ÿ±ÿßÿÌÿ.61÷ÿßÿëÿæÿ  ðÿãÿÖÿµÿ°ÿ¸ÿÕÿ @T=5 ûÿ×ÿËÿÉÿ±ÿ®ÿ–ÿ¢ÿÆÿÝÿþÿÿÿ÷ÿÿÿòÿÙÿÏÿäÿÕÿÒÿëÿèÿûÿ    ÷ÿêÿæÿàÿàÿÕÿÆÿÅÿ×ÿõÿ þÿõÿãÿ×ÿÄÿ»ÿºÿ»ÿÆÿÕÿðÿ ÷ÿêÿëÿõÿðÿèÿÜÿÝÿíÿûÿûÿîÿðÿôÿùÿëÿÕÿÎÿßÿêÿÒÿÅÿßÿêÿæÿôÿøÿûÿîÿÜÿÐÿÏÿÖÿßÿíÿõÿõÿëÿÐÿ¸ÿ±ÿÆÿãÿðÿ ÷ÿãÿÖÿáÿíÿòÿðÿçÿîÿòÿûÿøÿ÷ÿþÿøÿîÿßÿÖÿÒÿËÿËÿÎÿçÿ  "," ôÿßÿßÿÝÿäÿíÿáÿÙÿÎÿËÿÎÿÈÿÌÿßÿàÿáÿòÿþÿ÷ÿíÿêÿêÿëÿûÿ  çÿÜÿàÿæÿíÿíÿäÿàÿãÿíÿèÿäÿçÿçÿôÿÿÿüÿðÿíÿèÿîÿùÿñÿàÿÕÿÐÿÕÿÓÿ×ÿÜÿëÿþÿ þÿõÿáÿÚÿÖÿÙÿÏÿÒÿÉÿÏÿÝÿäÿðÿøÿ// ûÿþÿ÷ÿëÿàÿæÿõÿ üÿÝÿßÿÝÿñÿÿÿëÿæÿÒÿÒÿÓÿÕÿÙÿàÿçÿíÿõÿ÷ÿëÿãÿÝÿàÿêÿòÿõÿíÿèÿðÿëÿàÿ×ÿÖÿèÿñÿüÿøÿîÿðÿõÿ  ùÿôÿñÿñÿèÿÒÿ×ÿàÿðÿôÿüÿ  òÿðÿëÿãÿÚÿÓÿÕÿÝÿ×ÿÐÿÕÿ×ÿÙÿêÿæÿßÿÝÿÐÿáÿüÿøÿþÿíÿãÿÝÿÙÿàÿçÿùÿ$ ôÿáÿÜÿäÿêÿèÿíÿçÿæÿëÿêÿíÿôÿ ÷ÿîÿðÿèÿÝÿ×ÿÚÿáÿæÿêÿäÿàÿèÿ÷ÿ $þÿãÿÒÿÕÿÚÿäÿñÿ÷ÿîÿáÿËÿ·ÿ»ÿßÿ%+"çÿÙÿÙÿëÿ,ùÿÚÿÅÿÖÿòÿôÿ1% îÿÁÿ®ÿ»ÿÚÿ !*øÿÆÿÿŠÿ•ÿÈÿ9L<Òÿ›ÿyÿ{ÿ¤ÿãÿ ?*þÿÈÿ™ÿ‹ÿ©ÿäÿ1kb$çÿ®ÿ™ÿ´ÿèÿLU1øÿ»ÿ§ÿ³ÿßÿ$bƒyCðÿ¤ÿwÿ~ÿ¦ÿäÿ 3!÷ÿÅÿ’ÿvÿ~ÿ®ÿñÿ%$ Öÿ¢ÿ™ÿ§ÿÕÿ?N=äÿ´ÿ§ÿºÿáÿDT@Ýÿ¬ÿ˜ÿ®ÿáÿBI9Úÿµÿ¤ÿ·ÿÝÿ ,1ëÿ¿ÿ¦ÿ ÿ©ÿÖÿ$5+ëÿÐÿÒÿÜÿùÿ ùÿ×ÿ±ÿÿ¤ÿºÿÚÿ+3/üÿçÿÜÿãÿÿÿ*2% Õÿ½ÿºÿ´ÿÕÿîÿ ôÿÖÿ»ÿ»ÿ¾ÿÚÿðÿÿÿ ùÿðÿßÿÕÿÐÿÙÿùÿ(.ûÿ×ÿ¾ÿ®ÿ¾ÿÖÿîÿ üÿøÿùÿ" òÿÏÿªÿ§ÿ¾ÿßÿðÿ þÿíÿêÿàÿãÿñÿ ôÿßÿÈÿ¾ÿ¿ÿÉÿÝÿíÿþÿþÿõÿáÿÌÿÄÿÌÿËÿÉÿ.ÝÿÐÿÒÿÝÿüÿ,+çÿÒÿÁÿÎÿæÿÿÿ òÿßÿÕÿÎÿãÿ+/áÿÈÿ¾ÿÁÿÙÿëÿôÿÿÿþÿðÿãÿÙÿèÿüÿ" õÿÕÿ½ÿÂÿËÿÓÿÓÿÒÿÐÿÎÿ×ÿäÿøÿ øÿ÷ÿõÿõÿ÷ÿøÿíÿÐÿ×ÿàÿèÿùÿ÷ÿëÿãÿÙÿÕÿ×ÿÚÿæÿñÿùÿüÿüÿñÿáÿÜÿ×ÿßÿñÿ ûÿêÿÝÿ×ÿÕÿàÿêÿûÿ   þÿøÿëÿÙÿÈÿÐÿãÿãÿáÿîÿÿÿ ûÿ÷ÿüÿ÷ÿñÿëÿáÿÚÿÓÿÏÿÐÿÏÿÌÿËÿÌÿÕÿ×ÿÜÿäÿçÿêÿßÿÙÿðÿ ÿÿòÿõÿõÿ øÿðÿçÿäÿæÿîÿñÿîÿèÿãÿáÿêÿôÿÿÿÿÿ ÿÿøÿðÿæÿÝÿßÿãÿæÿêÿèÿäÿæÿÝÿÖÿÜÿèÿ ûÿõÿñÿàÿÐÿÁÿÄÿÏÿÙÿáÿæÿèÿñÿÿÿõÿñÿòÿðÿðÿôÿáÿÜÿçÿÝÿçÿêÿãÿêÿãÿÚÿ×ÿËÿÏÿÓÿÜÿãÿèÿîÿ÷ÿþÿûÿùÿ÷ÿëÿàÿÙÿ×ÿÖÿÚÿáÿàÿòÿ ÿÿôÿçÿÝÿ×ÿÚÿÝÿàÿñÿ  ñÿîÿæÿàÿßÿ×ÿßÿÜÿÖÿÒÿÌÿÏÿÌÿÜÿáÿçÿíÿíÿîÿáÿÌÿÚÿûÿîÿçÿôÿðÿõÿûÿòÿÿÿ þÿ÷ÿñÿíÿøÿ÷ÿõÿðÿèÿêÿëÿòÿùÿÿÿ þÿüÿøÿðÿæÿãÿÙÿÖÿÝÿãÿáÿáÿàÿòÿþÿ þÿüÿñÿàÿÎÿÏÿÒÿÒÿÖÿÖÿÚÿèÿíÿôÿôÿ÷ÿÿÿÿÿûÿøÿùÿÿÿîÿíÿðÿîÿùÿñÿÐÿàÿÖÿÎÿÐÿÎÿÓÿÕÿÕÿÚÿàÿãÿàÿãÿãÿäÿôÿ  þÿûÿûÿÿÿþÿûÿòÿ÷ÿøÿùÿ ûÿòÿøÿõÿíÿßÿÕÿÎÿÕÿÚÿÖÿ×ÿÜÿçÿøÿøÿ÷ÿôÿèÿÙÿÎÿÒÿ×ÿ×ÿÙÿÓÿÙÿÚÿßÿãÿáÿëÿùÿòÿôÿùÿæÿÕÿüÿ òÿÿÿ ÿÿôÿèÿëÿêÿäÿÚÿÐÿÕÿáÿêÿðÿõÿÿÿþÿôÿèÿßÿÕÿÌÿÉÿÎÿÎÿÒÿÜÿàÿäÿôÿüÿ ÿÿüÿëÿÙÿÓÿÖÿÜÿáÿàÿãÿæÿèÿ÷ÿÿÿþÿ ÿÿûÿëÿòÿ÷ÿûÿûÿçÿæÿçÿÚÿãÿäÿãÿàÿÙÿÕÿÖÿÚÿáÿæÿàÿàÿæÿîÿðÿòÿôÿþÿÿÿÿÿ ùÿòÿîÿäÿçÿëÿèÿëÿñÿôÿþÿ  üÿûÿùÿðÿäÿ×ÿÎÿÄÿÆÿÓÿÕÿÌÿÕÿßÿñÿþÿÿÿþÿùÿõÿçÿáÿèÿêÿîÿêÿèÿãÿÙÿ×ÿÚÿèÿòÿîÿíÿäÿèÿÿÿÿÿÿÿøÿøÿÿÿ÷ÿüÿ ÿÿøÿòÿñÿôÿ÷ÿûÿùÿøÿõÿíÿãÿÙÿÚÿæÿçÿíÿ÷ÿüÿøÿëÿãÿÚÿÚÿÙÿ×ÿÝÿÜÿÜÿèÿèÿèÿäÿîÿÿÿ  ûÿçÿÖÿÖÿÒÿÒÿÒÿÓÿÓÿÚÿÝÿäÿñÿòÿøÿûÿþÿõÿðÿîÿñÿñÿñÿÖÿÝÿëÿíÿôÿôÿòÿòÿëÿãÿáÿàÿáÿæÿíÿñÿ÷ÿûÿ  ÿÿõÿñÿçÿàÿãÿêÿñÿðÿñÿ÷ÿôÿ÷ÿ÷ÿñÿíÿëÿîÿèÿãÿÝÿÒÿÌÿÈÿÉÿÏÿÖÿÝÿçÿÿÿ ûÿîÿäÿÙÿÕÿÉÿÉÿËÿÆÿÅÿÅÿÉÿÕÿäÿðÿøÿüÿëÿëÿ þÿüÿùÿøÿùÿøÿøÿôÿùÿôÿíÿäÿãÿçÿêÿêÿíÿíÿêÿîÿ÷ÿ÷ÿñÿíÿäÿàÿãÿäÿçÿëÿèÿçÿëÿèÿîÿîÿëÿðÿõÿûÿøÿîÿîÿíÿæÿ×ÿÅÿÄÿÆÿËÿÐÿÕÿÝÿæÿñÿüÿþÿ üÿøÿ!øÿ×ÿàÿ×ÿÏÿÝÿÙÿÖÿáÿßÿäÿèÿðÿòÿîÿñÿñÿñÿõÿòÿõÿûÿòÿîÿõÿòÿíÿäÿÝÿàÿÚÿ×ÿÚÿàÿáÿäÿíÿîÿñÿõÿôÿ÷ÿþÿùÿôÿòÿîÿèÿçÿëÿäÿáÿáÿÜÿÜÿÚÿäÿñÿùÿþÿ (*ûÿòÿíÿíÿäÿßÿÝÿÝÿÜÿÚÿÙÿÜÿÕÿÓÿÜÿçÿäÿîÿðÿôÿäÿÏÿçÿ øÿþÿôÿõÿüÿùÿðÿôÿñÿõÿòÿñÿûÿøÿûÿøÿ÷ÿõÿòÿðÿíÿëÿæÿáÿÝÿÙÿÙÿÜÿãÿêÿîÿíÿñÿõÿøÿüÿõÿôÿôÿîÿëÿæÿçÿáÿäÿàÿáÿæÿçÿíÿðÿõÿ÷ÿñÿôÿðÿñÿñÿ÷ÿþÿ þÿÿÿûÿðÿäÿäÿàÿæÿãÿàÿáÿãÿêÿñÿðÿøÿþÿûÿÿÿùÿþÿûÿüÿôÿëÿêÿêÿíÿèÿôÿôÿáÿÖÿÚÿÝÿÕÿÝÿæÿæÿæÿãÿáÿàÿàÿÚÿÚÿãÿçÿãÿãÿãÿçÿèÿëÿíÿëÿîÿôÿûÿùÿûÿÿÿ þÿôÿ÷ÿðÿçÿêÿäÿçÿòÿ÷ÿ÷ÿ÷ÿùÿ ùÿÿÿùÿùÿ÷ÿîÿðÿæÿæÿáÿÜÿÙÿÎÿÌÿÈÿÄÿÏÿÝÿäÿçÿëÿîÿòÿÿÿ ÿÿ÷ÿôÿîÿêÿèÿßÿÜÿÚÿÝÿÙÿ×ÿÙÿ×ÿ×ÿÓÿÕÿÝÿßÿáÿäÿêÿîÿõÿþÿþÿþÿõÿêÿçÿðÿ ùÿûÿûÿøÿòÿñÿòÿøÿõÿ÷ÿÿÿ ÿÿþÿþÿþÿøÿôÿõÿòÿùÿòÿðÿîÿêÿîÿæÿãÿãÿäÿäÿÝÿÜÿÝÿÝÿÜÿ×ÿÓÿÒÿÏÿÕÿÝÿáÿîÿðÿòÿõÿøÿþÿþÿùÿ÷ÿõÿñÿëÿçÿíÿæÿäÿæÿèÿàÿàÿãÿçÿëÿñÿðÿ÷ÿûÿþÿùÿøÿûÿûÿÿÿ  ûÿòÿíÿèÿäÿßÿÙÿÒÿÓÿÒÿÏÿÎÿÎÿÌÿËÿÐÿÌÿÒÿ×ÿÝÿíÿõÿÿÿÿÿ   þÿùÿûÿùÿùÿùÿþÿüÿòÿøÿ÷ÿñÿøÿðÿñÿîÿëÿêÿæÿãÿÝÿßÿàÿàÿãÿãÿÜÿáÿãÿæÿæÿîÿíÿñÿ÷ÿõÿäÿÝÿÜÿáÿíÿèÿèÿêÿëÿðÿüÿüÿûÿþÿûÿûÿøÿíÿèÿçÿèÿãÿäÿãÿàÿäÿäÿæÿíÿíÿõÿòÿîÿõÿôÿòÿñÿøÿþÿüÿõÿõÿòÿòÿõÿòÿ÷ÿõÿõÿòÿðÿîÿòÿñÿðÿõÿòÿðÿèÿæÿàÿÝÿäÿßÿãÿèÿêÿñÿîÿøÿùÿüÿüÿüÿõÿøÿõÿñÿñÿñÿíÿîÿäÿçÿëÿêÿèÿçÿäÿãÿæÿäÿçÿëÿõÿôÿøÿùÿøÿøÿõÿ÷ÿÿÿøÿøÿøÿûÿûÿøÿ÷ÿ÷ÿôÿòÿøÿøÿôÿòÿèÿëÿíÿçÿæÿêÿçÿäÿäÿæÿëÿêÿíÿîÿòÿîÿñÿðÿôÿùÿùÿùÿøÿ÷ÿõÿõÿôÿîÿêÿêÿëÿëÿêÿçÿæÿãÿäÿæÿèÿêÿèÿëÿîÿíÿëÿôÿøÿùÿüÿõÿûÿûÿøÿøÿõÿòÿôÿ÷ÿ÷ÿñÿñÿîÿëÿêÿæÿãÿèÿëÿíÿèÿêÿñÿøÿ÷ÿðÿôÿõÿõÿôÿðÿðÿîÿîÿðÿòÿòÿîÿðÿîÿèÿæÿíÿôÿõÿ÷ÿñÿñÿøÿòÿñÿðÿîÿñÿðÿíÿîÿëÿíÿèÿçÿîÿðÿîÿíÿîÿðÿõÿ÷ÿøÿôÿøÿøÿôÿòÿðÿîÿðÿëÿîÿðÿñÿîÿòÿðÿôÿøÿ÷ÿôÿñÿîÿðÿñÿîÿíÿíÿíÿòÿñÿðÿòÿíÿñÿîÿíÿíÿêÿèÿäÿèÿçÿèÿèÿîÿðÿîÿëÿîÿîÿëÿîÿðÿñÿôÿòÿòÿòÿñÿðÿôÿôÿñÿñÿðÿòÿðÿíÿîÿäÿîÿðÿðÿîÿðÿòÿðÿñÿòÿòÿûÿþÿùÿøÿ÷ÿùÿôÿ÷ÿüÿþÿþÿûÿôÿ÷ÿòÿôÿõÿñÿîÿèÿçÿæÿäÿãÿäÿèÿçÿçÿäÿÝÿèÿèÿçÿæÿßÿçÿèÿíÿñÿðÿîÿòÿøÿûÿûÿûÿùÿøÿñÿòÿðÿîÿòÿôÿùÿùÿûÿøÿôÿ÷ÿ÷ÿôÿñÿòÿîÿðÿðÿîÿîÿðÿêÿäÿæÿæÿëÿðÿëÿêÿëÿêÿîÿêÿíÿæÿæÿèÿæÿñÿøÿõÿ÷ÿ÷ÿùÿùÿùÿùÿ÷ÿ÷ÿòÿðÿòÿòÿðÿíÿîÿñÿôÿ÷ÿøÿõÿûÿüÿùÿñÿòÿîÿæÿæÿäÿÝÿÚÿÝÿáÿçÿíÿðÿùÿ÷ÿôÿôÿðÿíÿíÿçÿãÿæÿæÿèÿêÿñÿîÿñÿõÿõÿòÿùÿøÿõÿ÷ÿõÿûÿûÿ÷ÿñÿíÿîÿîÿñÿêÿîÿòÿòÿôÿõÿùÿ÷ÿ÷ÿ÷ÿõÿôÿ÷ÿîÿîÿêÿêÿêÿíÿðÿêÿèÿðÿñÿôÿðÿðÿíÿðÿíÿðÿîÿíÿëÿáÿßÿÝÿÙÿßÿÜÿáÿíÿñÿûÿþÿøÿ÷ÿ÷ÿûÿùÿüÿþÿøÿùÿøÿñÿñÿðÿñÿøÿõÿøÿ÷ÿùÿõÿòÿñÿòÿõÿðÿîÿîÿêÿëÿðÿèÿçÿæÿäÿíÿçÿèÿçÿãÿæÿæÿçÿêÿèÿêÿîÿðÿðÿôÿõÿüÿþÿøÿûÿôÿ÷ÿøÿ÷ÿùÿûÿüÿûÿùÿþÿþÿüÿüÿûÿûÿõÿðÿíÿàÿßÿáÿàÿäÿÝÿÝÿÚÿÜÿàÿÝÿáÿáÿäÿãÿàÿßÿÝÿÚÿÜÿßÿèÿëÿîÿõÿ÷ÿ÷ÿþÿüÿÿÿÿÿûÿùÿûÿùÿùÿøÿûÿÿÿþÿûÿùÿÿÿüÿþÿþÿûÿøÿôÿðÿêÿæÿáÿæÿäÿäÿãÿæÿÚÿÚÿÚÿÚÿÚÿÚÿßÿàÿáÿáÿèÿçÿäÿäÿäÿàÿáÿæÿêÿîÿîÿðÿõÿþÿþÿþÿþÿÿÿþÿÿÿÿÿÿÿüÿ÷ÿøÿüÿûÿøÿôÿôÿòÿõÿòÿîÿðÿêÿèÿèÿáÿáÿãÿßÿäÿßÿÙÿÜÿßÿáÿæÿèÿêÿêÿêÿíÿðÿôÿñÿôÿôÿòÿñÿûÿþÿüÿûÿõÿòÿòÿñÿòÿñÿòÿôÿîÿíÿêÿëÿíÿçÿãÿäÿæÿáÿãÿçÿèÿêÿêÿèÿîÿñÿñÿôÿ÷ÿõÿøÿüÿüÿøÿðÿñÿîÿèÿçÿæÿæÿçÿêÿèÿæÿëÿîÿîÿòÿ÷ÿùÿûÿþÿøÿþÿøÿõÿôÿôÿñÿôÿòÿñÿíÿñÿôÿøÿüÿõÿõÿôÿñÿõÿîÿñÿðÿðÿíÿêÿíÿæÿäÿêÿíÿèÿçÿèÿèÿèÿîÿíÿèÿçÿèÿçÿçÿäÿäÿäÿäÿèÿëÿæÿèÿíÿíÿñÿòÿøÿûÿõÿüÿüÿ÷ÿûÿþÿþÿûÿõÿôÿ÷ÿùÿòÿîÿîÿëÿëÿðÿôÿ÷ÿùÿòÿòÿôÿëÿêÿäÿáÿãÿèÿíÿçÿãÿäÿäÿäÿäÿäÿçÿèÿèÿèÿèÿîÿøÿþÿüÿüÿüÿûÿøÿ÷ÿñÿñÿòÿòÿñÿðÿîÿñÿðÿûÿôÿõÿûÿøÿ÷ÿôÿðÿðÿîÿëÿêÿèÿæÿêÿèÿêÿæÿáÿãÿôÿ÷ÿòÿ÷ÿùÿþÿüÿùÿüÿþÿüÿøÿþÿøÿñÿõÿîÿîÿîÿôÿôÿîÿîÿëÿîÿèÿèÿëÿíÿäÿçÿãÿãÿäÿãÿçÿîÿðÿòÿñÿñÿñÿñÿíÿêÿæÿçÿëÿæÿêÿñÿçÿêÿëÿèÿëÿêÿèÿêÿêÿíÿêÿëÿíÿèÿäÿèÿèÿçÿíÿðÿðÿðÿõÿõÿ÷ÿõÿøÿûÿûÿüÿûÿùÿøÿõÿøÿûÿøÿüÿüÿÿÿûÿûÿÿÿøÿøÿûÿùÿôÿøÿùÿîÿîÿíÿíÿíÿîÿñÿíÿëÿîÿêÿçÿäÿãÿæÿçÿèÿèÿãÿäÿãÿÝÿàÿæÿäÿäÿæÿçÿëÿèÿæÿèÿçÿèÿôÿôÿøÿüÿõÿøÿôÿ÷ÿõÿøÿôÿùÿøÿ÷ÿ÷ÿøÿüÿüÿøÿüÿøÿùÿûÿþÿøÿíÿðÿîÿêÿîÿîÿôÿîÿêÿíÿëÿíÿäÿíÿæÿæÿíÿîÿîÿëÿñÿñÿçÿðÿôÿðÿõÿøÿüÿþÿûÿþÿûÿõÿõÿôÿõÿðÿêÿêÿæÿèÿæÿãÿíÿæÿæÿäÿæÿçÿæÿãÿäÿäÿçÿçÿêÿêÿîÿëÿíÿíÿíÿíÿíÿòÿôÿõÿñÿòÿôÿñÿôÿòÿòÿôÿõÿøÿ÷ÿôÿõÿûÿùÿõÿùÿ÷ÿòÿûÿþÿùÿùÿüÿûÿøÿùÿøÿôÿùÿõÿîÿíÿðÿíÿòÿñÿîÿðÿñÿîÿðÿîÿçÿæÿáÿãÿãÿæÿæÿæÿçÿæÿäÿèÿçÿæÿæÿçÿçÿêÿèÿëÿëÿîÿôÿðÿñÿñÿðÿòÿñÿõÿôÿòÿõÿùÿõÿøÿ÷ÿõÿøÿõÿõÿøÿ÷ÿùÿùÿùÿüÿüÿûÿüÿûÿùÿôÿõÿ÷ÿðÿîÿíÿíÿêÿèÿêÿèÿíÿçÿçÿêÿêÿñÿíÿðÿîÿëÿêÿêÿëÿðÿîÿèÿèÿëÿîÿñÿíÿòÿñÿõÿðÿðÿòÿêÿêÿðÿíÿñÿòÿñÿðÿ÷ÿôÿôÿôÿòÿñÿîÿñÿîÿîÿñÿîÿîÿêÿðÿîÿñÿòÿðÿðÿèÿíÿîÿñÿòÿøÿûÿ÷ÿõÿüÿþÿ÷ÿøÿøÿôÿôÿùÿøÿ÷ÿòÿõÿñÿêÿêÿèÿçÿçÿêÿ÷ÿòÿíÿêÿçÿæÿãÿÝÿàÿáÿãÿçÿêÿíÿêÿëÿíÿðÿôÿñÿîÿñÿêÿîÿñÿòÿ÷ÿôÿôÿòÿîÿôÿøÿûÿþÿûÿ÷ÿõÿôÿ÷ÿñÿíÿôÿòÿðÿîÿêÿëÿêÿíÿðÿêÿðÿñÿíÿíÿõÿðÿòÿðÿîÿíÿîÿõÿøÿûÿþÿùÿøÿùÿüÿüÿòÿôÿõÿðÿíÿêÿèÿçÿêÿêÿêÿðÿîÿêÿêÿëÿîÿîÿêÿîÿôÿõÿôÿôÿðÿñÿõÿôÿíÿîÿíÿêÿõÿîÿñÿíÿîÿðÿëÿðÿíÿëÿíÿñÿðÿîÿôÿñÿñÿñÿðÿñÿòÿôÿîÿîÿðÿîÿëÿêÿêÿëÿðÿîÿíÿîÿñÿòÿ÷ÿøÿôÿòÿ÷ÿûÿôÿôÿûÿüÿùÿøÿõÿüÿøÿüÿûÿüÿøÿòÿøÿõÿ÷ÿñÿôÿñÿëÿèÿçÿèÿæÿçÿæÿÝÿÚÿÝÿãÿçÿäÿæÿäÿëÿêÿêÿëÿêÿêÿðÿñÿõÿôÿôÿñÿðÿíÿëÿîÿíÿðÿôÿ÷ÿîÿôÿ÷ÿûÿøÿôÿøÿøÿûÿùÿûÿõÿôÿ÷ÿøÿøÿûÿøÿüÿüÿøÿÿÿûÿüÿùÿ÷ÿòÿòÿðÿñÿñÿëÿëÿçÿæÿàÿãÿáÿÝÿÝÿàÿáÿæÿãÿãÿãÿçÿêÿçÿëÿîÿðÿôÿôÿôÿôÿøÿùÿ÷ÿ÷ÿñÿñÿøÿ÷ÿôÿòÿõÿøÿ÷ÿõÿíÿíÿîÿôÿñÿ÷ÿíÿíÿîÿíÿîÿêÿíÿíÿñÿòÿòÿôÿòÿîÿîÿëÿëÿñÿñÿôÿ÷ÿùÿôÿîÿîÿëÿíÿîÿñÿñÿñÿùÿñÿîÿíÿëÿíÿîÿñÿòÿ÷ÿôÿ÷ÿõÿñÿòÿñÿîÿôÿõÿ÷ÿñÿíÿîÿíÿèÿèÿêÿëÿæÿáÿäÿæÿæÿçÿèÿäÿêÿëÿëÿçÿëÿëÿêÿíÿðÿ÷ÿüÿüÿùÿõÿüÿùÿüÿÿÿûÿõÿôÿñÿîÿîÿëÿæÿèÿíÿèÿëÿðÿîÿèÿîÿñÿëÿðÿðÿèÿñÿõÿòÿðÿõÿôÿõÿõÿñÿðÿëÿèÿêÿäÿèÿíÿêÿêÿêÿëÿñÿñÿñÿôÿòÿñÿõÿ÷ÿòÿñÿòÿîÿðÿôÿòÿòÿ÷ÿñÿòÿñÿõÿîÿòÿñÿðÿðÿëÿçÿãÿæÿæÿèÿçÿæÿëÿêÿñÿ÷ÿõÿùÿòÿëÿçÿèÿðÿíÿíÿêÿêÿêÿíÿòÿñÿñÿôÿ÷ÿùÿþÿÿÿøÿñÿèÿçÿèÿîÿòÿ÷ÿùÿüÿüÿôÿëÿîÿíÿñÿõÿøÿûÿõÿðÿëÿêÿàÿáÿæÿæÿíÿêÿæÿæÿàÿäÿçÿæÿäÿîÿñÿûÿþÿùÿøÿðÿêÿÝÿàÿêÿõÿ ÿÿøÿñÿçÿëÿèÿëÿðÿîÿîÿêÿæÿæÿêÿêÿíÿëÿíÿñÿèÿæÿèÿíÿíÿíÿíÿëÿëÿíÿðÿòÿõÿ÷ÿ÷ÿùÿùÿ÷ÿêÿêÿíÿëÿêÿðÿõÿûÿÿÿùÿðÿðÿíÿ÷ÿüÿùÿøÿ÷ÿðÿòÿîÿêÿíÿëÿîÿíÿíÿíÿæÿãÿäÿæÿäÿëÿäÿëÿëÿðÿôÿîÿíÿßÿÝÿÚÿÚÿàÿèÿîÿôÿøÿõÿñÿîÿëÿîÿëÿëÿôÿ÷ÿøÿûÿÿÿÿÿüÿõÿõÿõÿôÿôÿõÿñÿðÿòÿñÿñÿõÿüÿøÿñÿëÿàÿßÿßÿäÿæÿëÿæÿäÿæÿàÿàÿáÿçÿêÿíÿòÿõÿîÿîÿðÿòÿñÿíÿñÿôÿøÿòÿõÿòÿõÿ÷ÿ÷ÿùÿôÿðÿñÿòÿòÿðÿôÿôÿôÿðÿàÿßÿÜÿãÿãÿçÿëÿ÷ÿüÿûÿûÿøÿûÿøÿùÿøÿõÿûÿñÿõÿðÿæÿçÿëÿêÿäÿàÿäÿãÿäÿäÿèÿêÿêÿíÿñÿôÿùÿÿÿÿÿøÿõÿëÿðÿòÿùÿÿÿÿÿüÿþÿùÿôÿëÿçÿæÿàÿÚÿßÿÙÿ×ÿ×ÿ×ÿÕÿÖÿÚÿÜÿßÿáÿàÿãÿæÿçÿíÿøÿûÿûÿþÿùÿõÿùÿ÷ÿüÿþÿùÿõÿðÿòÿõÿòÿðÿðÿðÿðÿîÿëÿèÿæÿàÿßÿáÿÝÿáÿæÿçÿæÿæÿçÿèÿçÿêÿðÿñÿñÿíÿõÿôÿõÿþÿ÷ÿùÿüÿüÿûÿþÿüÿþÿ üÿüÿôÿñÿðÿðÿêÿèÿçÿæÿêÿäÿãÿäÿäÿäÿäÿàÿßÿäÿçÿäÿèÿíÿçÿêÿçÿíÿðÿôÿøÿõÿôÿòÿðÿíÿôÿøÿñÿðÿðÿ÷ÿûÿùÿ÷ÿõÿôÿôÿ÷ÿòÿôÿôÿøÿùÿþÿûÿõÿòÿíÿæÿçÿæÿçÿäÿáÿÝÿÝÿÝÿÚÿÕÿÌÿÂÿ¸ÿ·ÿ¾ÿÉÿÝÿõÿùÿøÿùÿüÿþÿøÿðÿèÿèÿçÿíÿðÿòÿõÿôÿðÿêÿçÿçÿäÿîÿíÿíÿîÿñÿ÷ÿùÿ÷ÿûÿûÿûÿùÿùÿõÿûÿùÿûÿüÿøÿôÿñÿëÿáÿßÿßÿÙÿÖÿÓÿ×ÿßÿ×ÿÕÿÜÿÙÿÙÿàÿÜÿÝÿßÿáÿíÿðÿîÿõÿøÿüÿûÿÿÿÿÿþÿûÿüÿÿÿÿÿüÿþÿ þÿôÿêÿêÿîÿðÿîÿêÿçÿãÿßÿÚÿÚÿÜÿàÿàÿ×ÿÕÿÜÿÚÿÝÿÚÿÜÿÝÿÜÿÝÿßÿàÿÝÿæÿèÿæÿîÿòÿûÿ üÿøÿùÿ÷ÿñÿ÷ÿ÷ÿøÿ÷ÿõÿ÷ÿôÿíÿáÿèÿäÿàÿäÿßÿàÿáÿÖÿÒÿÈÿ»ÿµÿ¸ÿ´ÿºÿ½ÿÂÿÓÿÜÿæÿîÿÿÿ   ÿÿþÿûÿûÿ÷ÿòÿçÿçÿäÿßÿÒÿÈÿ¾ÿ±ÿ´ÿºÿ¿ÿÅÿÏÿÚÿçÿðÿêÿÝÿÖÿÖÿÖÿÙÿÝÿßÿÜÿáÿîÿøÿÿÿþÿûÿÿÿûÿÿÿûÿüÿüÿþÿûÿûÿþÿüÿôÿñÿôÿôÿôÿûÿ ûÿüÿôÿòÿùÿõÿñÿíÿêÿßÿ×ÿÓÿËÿÌÿÆÿÓÿÖÿ×ÿßÿáÿæÿçÿíÿîÿòÿõÿùÿøÿøÿüÿþÿ÷ÿþÿüÿûÿüÿûÿþÿüÿõÿôÿôÿðÿãÿäÿèÿàÿ×ÿÕÿÉÿÆÿÉÿÏÿÕÿÝÿæÿçÿçÿñÿùÿ!++*" øÿëÿàÿÜÿàÿãÿÜÿÜÿÝÿÙÿÜÿáÿäÿàÿàÿßÿáÿáÿæÿæÿèÿêÿðÿõÿûÿùÿõÿøÿõÿäÿëÿüÿùÿ÷ÿôÿñÿêÿêÿîÿ÷ÿøÿüÿÿÿüÿûÿüÿøÿùÿõÿõÿôÿîÿîÿíÿðÿçÿàÿÙÿÒÿÏÿÐÿÉÿÆÿÉÿÙÿæÿñÿûÿüÿ   ûÿûÿôÿñÿñÿíÿãÿÙÿàÿÜÿäÿèÿèÿèÿæÿîÿîÿñÿîÿñÿùÿÿÿÿÿøÿñÿñÿñÿðÿñÿçÿ×ÿÈÿÆÿÈÿÅÿÎÿÙÿÙÿãÿñÿ÷ÿùÿ üÿôÿðÿèÿÝÿÝÿãÿðÿîÿ×ÿÆÿÌÿÖÿÏÿÐÿÝÿãÿáÿãÿèÿçÿëÿðÿôÿðÿíÿëÿçÿëÿðÿðÿõÿõÿûÿûÿûÿûÿþÿÿÿÿÿøÿôÿðÿîÿîÿçÿàÿàÿàÿæÿèÿîÿòÿüÿÿÿ ôÿçÿáÿÜÿÒÿÒÿÕÿÌÿÎÿÎÿÏÿÎÿÓÿ×ÿÚÿäÿòÿþÿ "  üÿñÿãÿßÿÝÿÙÿÜÿàÿßÿÙÿãÿáÿãÿàÿÜÿßÿçÿîÿòÿòÿíÿàÿÙÿëÿþÿþÿüÿðÿîÿõÿòÿøÿÿÿþÿûÿôÿôÿøÿùÿøÿ÷ÿõÿîÿáÿÝÿÜÿàÿßÿãÿáÿãÿíÿèÿæÿäÿãÿáÿäÿãÿáÿßÿÖÿÒÿÕÿÏÿÖÿÜÿãÿèÿíÿõÿÿÿ ! þÿÂÿýþ@þÖÿ`S¿ÿfÿ°×þöýøþ°þ/ÿÒÿáþ+ÿ'狯ÅÈL<Dîÿ1ÿ–ÿ–ÿ˜ÿ½ÿ“ÿŠÿ§ÿ¿ÿäÿ©ÿ‡ÿÏÿÄÿÈÿëÿÁÿÏÿ  ôÿùÿ òÿ!ùÿîÿñÿÜÿ½ÿÖÿõÿäÿçÿøÿòÿãÿÖÿÂÿÎÿÝÿøÿüÿÕÿëÿíÿíÿùÿçÿòÿþÿüÿðÿáÿ÷ÿÎÿÐÿñÿÕÿ×ÿçÿÕÿÆÿ­ÿîÿþÿ‡ÿ›ÿ"áÿµÿ!?¤ÿ¸ÿ*§ÿ›ÿ" +üÿ(3' ðÿõÿãÿûÿÿÿ°ÿ·ÿßÿÁÿÏÿ·ÿÿ÷ÿÕÿüÿ1" !îÿíÿøÿ×ÿ»ÿàÿÿfÿ¦ÿÌÿ§ÿwÿäÿ|ZÅa™ÿ.ÿ“ÿîþ×þëÿZ•2fÿã Wÿsÿ(ÿyÿÅÿÔýþÐÿ<ÿiÿM˜lDºé•ÿ{ÿÄÿqÿîþsþ»þ‹ÿ©ÿ~ÿÚÿƒ1ZðÇÏ ÎÿÿCÿCÿ ÿ$ÿåþMÿ÷ÿÌÿ <?| Qüÿœÿtÿcÿvÿ½ÿÕÿòÿ_”G?+»ÿ£ÿÿÿþÿ£ÿ§ÿôÿ=ˆÝaÍhR ¿´Óÿûþ¼ýµüÙû6ûXû¬û´û¥ü2þ/ÿ$Ì8ìÕšK¶•ÿUþfýdýßýD>êî : S Ï  PÔ7ýjù öŠòƒðÉïÝï1ò½õù“ý¡Y3 ƒ  s $ €­N„ÿ&ýãû[ûÀûºü@þ94€ýþLûèú±ú´ùŸû¡þ”( ´ ½ ¹ Ÿ – +ýÄ÷ ô?ñ{îKî6ð˜òlö,ûûAœ g ö } ÔÄÝÅþ¼ý¹ýƒüÜûºû†û¬ûØøäõPúîýý‚Àô eLà?S ËÚÍü±õ8ñ¶ë êÃê êjîôùl¥þ ØC_^' ] jÿ“ü›ûÿùhúAú’ø2ú·û¸øëõ¾ùvÿFNò ';'Bj CE¬ýöïëTè¹è‰è!ë˜òú÷cý! p×n1Kí âÃþ!üçúùLø!÷.öSøøÛóöÿØÐ ϲõw"[BÿýÉôÊí=éŽåPæøæLètðk÷íûõK FÔº!©i }!Ûþëúúù÷ÙöMõô÷Fö<òmøèP†¼õ¾?žo»óûçñ’ë]èºå×å:æêòåö¡ü1q +JWu / ­©ÿÎüèú÷^õÚóóaöœô>ó7üË•ÄÆw­ŽcË »”û–óÝïAëèèïèèMì1ò'õðû§ú÷ n¢ÀFI 8 ÿÙÿEüæøEø­öçöÿù8øÑø'í#©Uv …¾ xÚþ¢úÒ÷jóVòâñœðô‘÷{ù2þŽ„<æD§$D+OOhžZ—§ÿÓþlþúýý4ýÕüýxýòýÂþwÿZŒéùÙ•bÕÿJÿ«þxþ\þ>þ=þDþ…þ¿þ¼þÉþÿ0ÿ:ÿ[ÿ¸ÿ[¢IdºéâØ³]ô‘~ÿÿ þ†þ°þ ÿŒÿ3ãj¿Þ¿O£íÿ?ÿ–þþ¯ý”ýuýýÌýþnþ±þÿ[ÿ’ÿ¸ÿUƒ¶÷@vŸÔôñÑ•9¶?ÌÿCÿÝþ²þ®þìþMÿ¸ÿFÂ;8îŒÿ%ÿÐþŒþzþ“þ°þÖþÿÿÿõþñþÑþ’þªþ ÿ7ÿzÿñÿQÊBì&5' Îl£"’ÿÿ²þ_þ*þ@þ’þÿ€ÿ ‘ý.98¶p°ÿTÿÿþÉþ–þ]þ:þ/þ*þ;þgþ£þîþ=ÿœÿˆß+h”¶Ã·¤}B´MÚÿ^ÿåþ‰þ;þ&þXþ°þ/ÿÜÿ‡*¼óÛ¬MÁ=Ÿÿÿ¹þiþHþ>þHþgþŒþ­þÔþòþÿ0ÿaÿ•ÿçÿ=”ì-]{‚u^*í°e$àÿœÿhÿAÿÿ ÿÿ0ÿlÿ¿ÿ.‘Ù ñ€"ÁÿsÿAÿÿêþÙþÚþÞþòþÿÿÿ!ÿ=ÿTÿÿ®ÿáÿ[Ž·çøñܺ±¯w_2òÿÈÿ¢ÿwÿbÿXÿmÿœÿÎÿ[˜ºÁ©fÝÿ¢ÿoÿFÿ(ÿÿÿÿÿÿ ÿ ÿÿ$ÿ<ÿ\ÿ“ÿÕÿ B|¯Òí!éÁ”_ÉÿŒÿUÿ6ÿ)ÿ.ÿPÿ‚ÿ¾ÿD|¨½»¢w<ôÿ®ÿeÿ5ÿÿÿÿ(ÿ ÿÿ)ÿ9ÿUÿpÿ‡ÿ³ÿÓÿþÿ*Mrž¥¬³¬¨œ|hW;þÿÚÿ½ÿ¬ÿ›ÿ˜ÿŸÿ´ÿÐÿèÿ øÿÜÿÅÿªÿ‘ÿÿmÿ^ÿJÿ@ÿDÿHÿPÿYÿ}ÿ ÿ·ÿÕÿùÿ@N_nˆ—ž¬¨¨™|_C( íÿÈÿÿ‹ÿ£ÿ ÿ–ÿ§ÿ°ÿÎÿçÿñÿþÿûÿøÿëÿ×ÿÉÿ¿ÿ·ÿ¬ÿ¦ÿ›ÿ‘ÿ“ÿ‹ÿ‚ÿ„ÿ‡ÿ™ÿªÿ¾ÿßÿøÿ%BPS^_b__UQD;+ ÿÿëÿæÿÙÿÈÿ³ÿ ÿÿŸÿ¢ÿ¦ÿ¦ÿ­ÿ³ÿ»ÿ½ÿºÿÂÿ¿ÿ¾ÿÄÿÁÿ¾ÿËÿÌÿÐÿÖÿëÿ3^F!11'9/ ,$   ùÿêÿßÿÎÿ½ÿ¬ÿŸÿ‘ÿ‡ÿ}ÿzÿ‹ÿ•ÿ¦ÿ½ÿÆÿÕÿÙÿãÿêÿñÿùÿ þÿõÿ÷ÿ*?MZNB<<1%ûÿíÿãÿÎÿÆÿÄÿ³ÿ°ÿ¢ÿ©ÿ³ÿ°ÿ´ÿºÿªÿ˜ÿ¸ÿ×ÿÌÿÚÿàÿáÿîÿñÿùÿÿÿ! òÿ^ÿáþCxtÿÿìòý‹ÿ½Ãý Yþ8WPýñÓþ§9þßÿ ÿýlSý˜üVmB@Î÷ÿ"þóû_þtýhë¹ý§þ¦üœÿÐÏÿ =EDðþ«übÿýèÿYýÍþŠÌý5/ÿ_þ½ÎèýµÿHþÿéûAÿgyû1¤ÿ)ý%×üFßÿ¶ûT5ýÁþÝ|ý6ÿó&Šý*.ÿIŸþÖþgÿ(Ìý’7‰ø\ þØø:òúõ›úú!ú–ýÊ(ùˆJ¡ý€ÖúÅÿ÷mþšþ'~˜ú±Àñú…/ÿ`þTçû‡ÿE ý2c78û‚é×ùd@.ÿÿÚþbžý/ÿ›Yÿkü^þ ;½ú1kû†û,Ûü¦þàuDý+ÿÿûчûUÿè?øm~#ýjÉÿÑyýœþ]ïýÐÿ°}õþ}ÛÎú•PøŠ¨áùØFÚú¸º\ýl úN˜¾õ¾§ÿ÷ßý‹ÿ&!üðÅcüxþZöøºçkø†Ýýòÿ ÿŒýî BýRÞ*ù'þ¤ùÌÇ8û¯ ùæýyûÙ0þÍ^ÿ#ø°¸ýÌþ¡÷û’ÿŠú·Túš(„ú`úµþG§ù™‘*ö2 äï~˜_îÖÊùŽûi 0ï2 Zè . êxÿ‚ôÎåîÀó~ã% åŸü_ïõ¾çÄ"`ÞñPÞçÃ>óÛ튧îßö8ZèøG@åØá¿äÖÐîS ñü‹þ¥ú¨Î%ø@ ùÅöæ ÏØøâ÷͸ 5íªRöîùLÇ %øaë·åþcè¥]ûGî ûüÿ‡ Öì-sçWØ+í3Ðôlsù•\ôMÿž÷ ×ø…ù¤ 0ôHþ yø·út‚ÿ|1ý<üä ¼÷¡ñGþAôB´úX\åò“« fïnユ Äð ¸ 'öö `óÁÿѵù$ÿý߀ú1û: cü«øX –…ý£þµý¹³û†ù$ øwþ~ ÃóM›šô)ž\ó "Îñ¾ d›ò ³öMÿÝúC yú¾úpÕöøFcø6øT ü¾ÿWøwÛþéóƒ lÊò' ®LôàRcú+³üþÄö9ñþõ> ê÷ʈ*ýz 4þéÚòùoDþòCÿOý•ïÞý@þ¹ôUPÿžû)fŠÆýàû—"ÿŸÿH òR·2 åíº þöDÿÒõôö÷òIìÀìpìzë¤íÚòFøíúLû› € ½ŸõEùiú›ö³ð&ýÕ XùÂ% » tþ+O¹iùVôLí‹ïçâßñ~í~èßü´þqüC êt h¾5¡¸ #ýAõüó û*óì}níõ¶ ²—ë ø\úöïëÍïÇâDÜ&òLíàäMÿ¨wùO u% õéè úcï0÷eü#é7ò–ˆù{øÆ[!g = oýÛô¥ë-íî&Úäk÷"æÆíHÿ$ÿTRÚµK˜ S ÿõÉêöˆýÞ ÿ¥Xì¨ýµ(l q É T9ú4ó^æ²ê²îÓ×qãÏú¶éíõ ÕSþzîÝì^‰ ¥„ðeè SûòÖ†Ô‘âc³/%ì%†˜Á 5Ë÷¢ñKäSícíÔ©èýŸæð[y[ÿº–×÷K küXäü³ÞAêP$áø7åÎ(‚ûô>ð#+‰ ¿úôëdç7ïCÜHß”÷œì?í½—3tË>‡p F“å^öI]â¸å0#öýúãŸ% ãõï#Ü'­ øiõZî!å÷ëCáÏß ñDïÿð+  ~H Z»÷ tþÿå¹þ1 WÛ¹ò#òjîÜ*[¸ø¯úã4öPöì¬ç|ëTÝÉå”ó±êñôôÙÍèJôvdað×ïË‚ò‘Û«ÒÆàÃà'Üú´ ”$ã C Xû²ömôyæcëæèß6ìÆójïÛùcÊÓ Y í+œ Xõ5ì0 ¦ÿàØò 'x寰*„ *õ³üøÃùtæOèñÒàŒå÷Hò{ó6Âoe(8| ×ó<ð  ý†Ü —aç:&ÈÝ]iÕiúKùvù æzé/ðOâ1ç"õùò:õùr8 /1—‚ïsÿd ¥æÆï#òù·ï® ×ý¶vúôö³ü®ðþå¨ñBéÉãÚòôvò°þ­3C° +óÑû± óïéÖ$í Plÿ®U0•>øÿú©õdçwïîJåðêõTôˆûým< Ùà ,  sôÐø øÇè‰ ”í‘å2õ 5ªcçŽ÷€û øWç‰îÚðÒænïZöŠõcüÍ[þ 3² –ð:ÿq£ðÙñ±E óc‹—B O’þ_öþ÷ò+æòãïéçnò«÷È÷\þ‰=ù  19 ^úçñ£ B¯é åÒõÛÊÍvwæ•¥öwú}ü¸è?ë,öšé8ëøOøZûÃÇu * C NZñýf©íà.êúáp ý¥ÖBl$÷-ù#þ)êÎèãö ëjè=ø”øsùUÃí àÝäûeõ–ÈþGî¬ ÉÝöñî˜ú:Äõýý<÷ŠãÅðôðâïLùïó»ýT¨`@ š Ù÷êü% tóøÖÄü4m}£ •~¡û…ùùþTìåç’öëéGå¦õõB÷³w  ¥ «~ìý.üšˆúIö˜¥ˆû8Ú1"dÉâÜÿQû’þ°ï»é±ôké,åHóòöôÿïʆ å7Yÿ¿üO dý)õ–! ú²±GâWýâþòî8í¢÷¢åDå²ö îò;“ÿɸ Èþ„ÿ^ wûÛùÕÙiþ6;ì«ø¿æ¾ÿ–úî‚óêñ$ã¥ìòþëa÷@þèþ4æh—þV©÷íõ \þùZT Ó ‘  ¬cþÌôTô8óçµéÆî¾êuñJùGû'/®h߃ü< —;' Ó tž "þVàú˜ô*ó‘íêÁë$ìõïÔôUø–þ9)BžK¶j‹ õ Á ‚ Áÿ *h]üœùuó^ñÞî+ëEî0ðeñ¥÷àû=ÿÓK~jyLMåŠà Í Å È E ™„áþúöwôdñíÍï?ñÿïö ûÓú“ý]ÒeØ7¼Y x†í û ÿrýÿœÙöÌô¸ôóVñÃíôP÷äôCüòÿ¶ýþC rÂRD¯H·+ æ.¯•{´Šý$ýÎýÔ÷ðòàöj÷ ó™õò÷rû;ýúKþ÷Ø9…  …»«ài-,þýÿýüªúùø2ú÷úµ÷Ù÷û¡û9û¸ý”&WŽ,”žòòêf½°%ÿÿf|Õý ®ÿXûÛûþÂúÅúþ°þ4ý¬ý˜ÿ[$ÿiÞÎ ;À†s?hŸÏÿzÿyÿ]G‡…þ›ûîþÕÿ þpþ(ÿZ#þ÷ü@ÖþüÿRÿl’Xþ+&WÿþÂþVEýþ¤áÀ§ÿõÿ*lûð¢üXþ9ÿ¶þËü¸;ý–ÿèZ)þ¹ýÕ#üýjÿ±Âý³ý“þ˜yöüêÿ\þ·ÿëþýùžÉÿjü‹þ[q“üžýÊhýcþ“—^ü‘İþ™ÿVþBä}þF¥»ÿ‹ÿ !sÿYþµÿ›Þþ‡ÿX¬÷ÿÕýªùÿ þ]àÿ·ÿ(þÅ@õÿp®ÿ¬ÿŠ}y‘vlÿÖþ…ÿ‡ÿGÿwÿ ÿþtÿÚÿŸ¾ôÿRÿoíÿ?ÿ8Éÿëÿòÿ˜4§ÿõÿ€,Mÿ@ÿŸ½ÿP €}TÿŸÿ!ÿ2ÿbdþÁþÎÿ3ÿÝÿôÿ/"Œÿ©¹þibayµÿ Dûþÿ€´)ÿÖÿ…ÿíÿÆÿ"ÿ»ÿÎ?ÿ&þék°ÿmÿ[ÿÿ°ÿT˜nóþb9^Zu?ÿ¦ÿXñÿûÿÿ0ÿÏþ9Úþ¬ÿƒrbˆÿkÒÿ•ÿJzÿàÿ[ÿZ·ÿùÿƒeÿ¹¨‘ÿ•¬ÿèÿ!YÿþkUÿ¸ÿjÿàÿ~ÿ"ÿ*¢ÿl2¢ÿ‚ÿèÿ³ÿ–ÿ´™Üÿ÷ÿ~ÿdψÿ‹ÿøÿ1'Ðÿ‘ÿQÿ8Èÿ/Îÿ¾ÿºÿ/ÿWÿÝÿ?‡ˆÕÿˆÿ˜UÂÿBµÿàÿ'aÿ!^ÿçÿãÿ!5Ëÿüÿùÿàÿ~ÿÅÿ;lÿ uTÿyÿÿÿ+ÿhMn©ÿiUÿÄÿÕÿ?ˆŸÿ:ÿsàÿòÿÐÿÄÿ „ÿÌÿ ’ÿ»ÿuM•ÿæÿ;?¾ÿ­þÁŽÿ@³˜%Šÿ™¥NÿÿJLÐþ7ÿ,9aÿ ÿŠ]Óÿªÿ‘ÿQ¦ÿ%ÌzPÔþ^ÿ%ãÿ˜ÿÙÿŸÿ‹Cÿ¿ÿlÿX ÿ;œÿCwÿûÿU•ÿ®ÿ2kTÙÿpÿ};9ÿèÿ_* |(òÿeÙÿ1¿ÿÙþŽÿL‹ÿhÿwÿUÿ5v$âþ´ÿÄJÿæÿh¾ÿœëÿÁÐÿMæÿÖÿsÿöþsÿJZeGÿ¿þ‘ltÿzÿo&ÿ&ÿÁ ‹þ„ÿyPñÿUÿeÖûÿ[ÿÿ5•ÿzÿ±ÿ®ÿ•PfÿÉÿä}ÿ±ÿÒÈþ‹ÿûÿÿ‡ÿ´ÿѰþŸÿÅCÁþkZHÿ’ÿB£âþÿ0/§þGÿüÿ¨?RÿZIòþˆþÕ7Uÿ9=•þ}øþÎÿ[þÝÂÿ_ÿP&ÿaáÿ•ÿâs§ÿ½ÿQÿÒÿSçþ{ÿWaÿð1B®ýJÿþÜÿªÿí´ÿÝ2ÿ0ÿëþáþ Baÿ¢ÿÿ}ÿŽ‹´ëÿäÿ2ïþìþ7ÿMÿ„<I‚ûXÿ0ÿSýAÿ ÿ¨ýŒÿ¾þ!³,JÿÝþHTùþ5ÿ¢ÿl—þ*þCçÿLîÿwØ^hÿ6Ûþ.üÿ[ÿ1tÿylþÆÿ!ÈÿzÿUÿ¬xóþ¢ÿôÿ‘ÿ÷ÿPÿ}Û2þœþGCõÿÿ´Þ+i´Šl"ÿøÿÌþÓþ^ÿäÿ’ ÿêþôß÷ÿeÿþÿ9½ÿDÿŸÌÿ´ÿCÿ…ÿ[ÿÌÿçÿíÿ¥â"ÿ¦ÿðÿîÿ%ÿ5ÿ¯æÿ¿þùþÂÿ´ Cÿ}T"’ÿN7ÿÿôWŸ§ÿ‚Dþñÿ=îêÿlÿVcÿøþQ<ÿàÿjÿ2ÿ|Aÿèÿ½GÿÌÿ3TÏ Žä?ÿÿÿUÿmÿWÿ¿ÿiÿ/±èÿG;U% °ÿÿWÿÈÿäÿ9ÜÿÌÿ3‡¬s[Ùÿ°ÿ@ÿvÿ“ÿPÿ~ÿ·ÿµÿ³ÿºÿu*€o'9y@¨À'aIºÿ¦ÿÿìþXÿÿ"ÿ_ÿMÿ¤ÿlÿ6ÿ›ÿ“ÿ‚ÿ‹ÿ‡ÿêÿ÷ÿ½ÿX܆ Oòª—bUä£ÿ‰þ'ýÝûFû5ûøû¢ü´úùüìýäûúöö[þÏ  ÒÈ4‰šø ð+ï¶æ;ä¸è¡èÍîäôû\u  ¶K ˜Ùùj÷ùÂøeü›Š —lv´&Â/³ú¡óîÂãkÝ/àæãðç±î[öy| kOTÝ;b ý{üó|é}åvçÇéŒï†û­ii~!2$Ô"‹÷nù4î,å¢Þ­ÚªÙ’àë{òµúhL:çA-ÝÊ fßøOïýç ä•åjê$ò‹þm –ðÓ#.$² èþÌfõ˜èôàSÞÜäÚÈáxí[÷³ÿPm9Φ٠ΠЧúôôRï§êgèDé=îÖõ’ÿ¼ Ñ`( °iÀ ÿ¶øí™ä³á]ãŠâ¡â5ëØö5z DÓÍ‹R cJa¤ø—óŽñˆï<í"î—òöù‰ ¹å=¿VëÅ lúðaçKäûåîåÜåðë<õ¤þç×Ý Ï.æ¼ ¯p×'üµ÷üõöôTô¡óÌó¬÷)þ³¿  ÕG£Þè A?xüÃô…í‹êpë½ëøëÅïöpýJå’] ˜ X ½$'M¢ýýóûûkû_ú ùðúÑþ'M²Ý>  Ô ´ ì`Èÿ„ûWöÄòåñ½ð[ð ò\ôÊøìýr¢ûˆVØs3úRÿ¤ÿÿÄüXûÙú°ûýý×ÿ'´ã7«@ “¸/ÿŒúC÷³õ&ôoòòæò¢õßú_ÿý~Ž$É-ùÆg`÷¦ÿÿ{þþü'û9úÜúîûýÂÿ·Œ¦Nš¸DªþÿÆúž÷ËöŠöeöËöƒ÷,ùü"\צµŒQè‚ÌØ+wÅÿlÿ3ÿøþ‹þ«ý#ýKý¨ý™þ<Z=ÍC˽ǭÿqý¹ûèúˆúrúãú2ûçû’ýöþÖÿ´xåûì²µ¼·uà™s'æÿ“ÿÿÏþ²þ•þÿ ê¼Kf?³FªÒÿÙþÐýýü¦ü‡ü“ü ýÀýLþÆþsÿßÿ(ªà¥£´•‹y¹ÇË7ø°bæÿ•ÿ•ÿ¦ÿËÿðÿ*üÿ÷ÿ*DPQ$©ÿAÿÿ¿þ‰þmþþþþ¸þõþÿ<ÿtÿyÿ»ÿQº'k¯×álû‹'´ÿ‹ÿMÿÿ6ÿ?ÿ_ÿëÿB›ØÌàÿÑiItÿÿ´þdþ0þþ(þBþþ­þåþ%ÿaÿ¸ÿÙÿ8¦Å'o`L0ÿÄ6 ÒÿÎÿµÿ ÿ¸ÿÈÿãÿ <]lz_B3ûÿÆÿ¤ÿ…ÿiÿ5ÿ ÿÿÿÿ2ÿiÿ‹ÿÓÿëÿîÿáÿßÿøÿ÷ÿûÿ3XN€¦’­¬wC<8èÿ­ÿ~ÿWÿqÿpÿ“ÿÎÿÐÿDShQ12*Ïÿ’ÿJÿ$ÿ/ÿ!ÿ ÿ!ÿÿÿGÿ™ÿñÿ3dln™¯Á™e5èÿüÿðÿîÿêÿãÿêÿ 2(ñÿÚÿÏÿ³ÿ…ÿˆÿ{ÿfÿ…ÿ’ÿ¬ÿÅÿ³ÿ•ÿ™ÿˆÿ¦ÿàÿæÿñÿíÿêÿòÿùÿFk6@BMŽkS[, (5< çÿÂÿÎÿÙÿ£ÿÏÿ¿ÿ–ÿÎÿÎÿøÿ·ÿ´ÿÿ‘ÿ×ÿºÿ˜ÿµÿfÿ5ÿÿaÿCÿ–ÿ±ÿëÿFL|‡þÏÎlõÿÏÿ·ÿ)ÿóþÿMÿòÿ.ÿÿ·ÿ¥±ÁÿùÿÆÿŸÿJÿÿÃþuþÄÿ Pÿ+àÿíÿ^f ÿãÿêTw|ÁÿÅÿãÿßÿ;‡ÿrvÝÿ‡ÿÿLàÿüþ“ÿüÿ]aF´–ÿ™ýÔüÃüiÿ}w³aÿRþ þýØüŸûýÕÿTô‰µ?àµû8_ŠÃþ®üLý\þqÿËÿÌÝÿ(Šg½aÿùþMÿÌÿJ©lÿ$ÿÓþËÿ±ÿõþ@ÿ.ÿÿÿ!d…ÿˆÿ7ÿtÿSô9M§ÿ»ÿÕuTÅÿŸÿnëÿ×ÿ:ÿþüþ+ú"9Íûí“ÿŒýwýýýLýºüIý-ýþÅþdþõþ×þ·ÿàó- Æì€‘ÛY0;¤ÿsü‚þJþüÐüxü1ýsÿå.{b‚†ÇBÿüŒùLøõˆõBøúžûýÚþãÿÕGJ€TÛ< °€ûÿ¶ýäú&øÒö÷Âùáþî“B èŸå ê Ö¿ýø°òŒîÿëÒêüëÓï"õðú%‚ý ¼Ò ^ (¶«ý[ûÃùžø›úWýlKœÀ²ü|ø¯ö©õIøý¢w +ËGæ îeÿ²ù=ó¼íHêèéIî±ó,úN8 GÀ ò Œâ’ý0úòø’øÁùdü;þªf3Šýøpö$ötøÆü·ôØ ¡§)Ó¬ ܸÿøùŸòÑì¡éžç¡é'îóògùüÿ³ç R2’ o™ûÿúÔøì÷õúŸûUÿÒH½´úaø$÷ñõú#þ‘W # ­‹|ôà £Ôý¹÷ªð[ìëè­çPëˆïõoüvoÅ ·®g ­ € ¥WüÚø øú­úöü±þSV¾þ¥úXöŸöùòúÿÿø9 ·õ7óØ H³Züõ~ï×ê`è¤éŠìÎð·ö7ýÏK X Ns 4 äͧýBûìù½øú?ûYüºR8æüÀø&ùÛøªùÛübT Cvsý Û qüÿõùÊò#îcë`éòêSîòò¿ùäÿ©+ Z ÐÇ- Ë ŸvŠýMûðøâøÆùJüIU±h>ýœúxùaø{úPý? Ë)©¦ É Ð[ÿ=úXóÑî?ìñéÞêBîó‚ù±‘ 2“Ö k = Ñnýhû¨ùqù+ûHüþ÷éþLûÅùHùÄúlü9¬ø þSX¤ DÙ[ûÐõçð8í˜ëôêcíâñ†öïüæ¹ ò 下 ¬uÿLü,úáøsùÒú¼ýÈß^ þüûPú„ûdý­[Ö É D Ý ']Ãû[öò¸îWìcëWíñØöòü®´ Ð7 S &¢üÂùæøÅù©ûYý'+>8tùÞôcõ„õï÷†üH²“¼=/ qéøHïéºæòåTç]íöÿ” ÷е’ñÄÿ“þføCôh÷ƒú=þa/€ • > Mõ‚éºå•çÝëÐ÷’ ±Q$2'è#)S 5üœëõà_Û÷Û‰âÈë&ú„÷¼ˆœ ¢lù)ô›óÏõ×øiþ ÈÖ  Ñ -Èúðsä÷á¹èkð5ýz.&¬-+*>!à©í?Ý¥ØñÛ¢â÷íhû»\ÏB !üTô°ò§ó‚ô—øi  ÍÞ >d!ÿíÿHþørðHèÅé³ñ³öã§Üû*?&íIüþÑìâÿÛ,á»ê]òþÿx ô[¼§þÊô}ðâó¡ø8F±wů5H»sk¿‚”ú)ò“çê|óõvÿ0!ö*Î#ãÚ*ýdéìâ¶ÞãIìýôµÏ a ` ½>ùýÂõÑñ'õ.÷qþSÍ “ìdÀ;FʹÄÿEùšîžçCìtóøE =()R ¶‰ò7äúÞ±Þ…æ ïûi z% ‹x©õòïÜõëõbúT·m p ¨˜Êöþ`§MWüAóêë«éØñÏöSü” òm'¦$ Ífð&åzàÊâéð¡ýú7  ý#c÷¬ñöƒ÷Šÿ˜ 5öÑ;8 ‰¼®ÿˆõíVêïjô ÷fð$…#; e e÷àëä@ß.â|ëâ÷%Kæ ƒèÔýø€öÚóñö>¹† lvÿ¶í_ù9ù-ìÏêRðZîœö( S+m"|6ÿžñDå Ü½ágå¤íËüMÓ Éƒ ücÌûö÷1öµòáùÜ‹}  óÌȶs8ŠûÏð+ë5í{î¬ò­ûß~b'É!îy) ÐùSíáß‘áææô_ý3ó æ í ±yýóü¨ùSøXÿøû™ûP™ÿ³û9< « K3Xÿ¾ïvìeìöèSî¶øç Ü%ñ$F$ì¼ úýAïä£ÜWÜ‚äòëÃö}7 r Sx ÄÚ°ü«øuüKúXúïüêüñ™rc x K  oñõ…î’ëjéÞì!ô‚þüE y$É"® €•%ù]ìâ4Þ¤ÞwåDï4ùê ß H Äü\ù1ýúýZø¸øj^™ÿþA € C KÏÿRõ1îïÞîEî+õÿ× Ô$5a#Å ,!òÃçEä$á]ãêò¯û׿~ ñ   c+!UûÔ÷{÷À÷úïýë¯ û oÓùñõÊôkóîó"ùŽð ™Ç›­š Åÿ.÷ ñ·ëâèæè.ìûñˆöœû©: Ùâ«§BÿÆþ:ÿßæ§“.1×ÿÿ¼þÏþ­þ=þþóýÿ†Ç1ÀQ÷ÿmþ[þ°ÿEìâ=bŽÿNþ4ýdü>üdü]ü9üüÒû#ü=ý¼þ=v4 ÓïG‰S¹ñ´Cÿþ>ýìü†ýtþªþÂþ³ÿR`5íÜ7ŠGþºüÔûíú¦ùø{øù‹ù!úüú“ü"ÿšŒáÒ(¶Wê…2×ýAü4ûÐú[ûüÛü‚þ¹¯=k;[È> ¿ÿ³ýÖûòùªø:ø³÷V÷ øAù%úŠûqýzÿ¡¡îrË!EOBÔã­ÿ¤ýõû’úøù‘úçûOý¸þœ¶ŽôÔã*1Ù¿jÿ=ý,ûùÀøø?÷>÷ø ùzú[ü3þ*{{WãyŸƒÇQ‚JÚýFüQûaú~úÄûæüþêÿûÓGI›19:ÎÿÛýü&úÔø_øê÷‡÷>øOùúQûýÿð§&,ÊJ°¹dϺ"Õ0þ[üMûtú ú•úü¸ýKÿQCCâ @ôbjDÿ.ý@û~ùÙ÷àö(÷Ë÷øâø‹ú-üþÛ\ä+ûFû«C'Ùnˆþ¢ûÎúÈú(úJúõûšýŸþUÇŽ¥µ3b5UÀvRþrü„úžøo÷!÷&÷F÷ù÷`ùþúÒüÿ(Ú{ñÜ ô©L©µp‡ ÿ°üNûÖúHúÿùÝú|üþˆÿ•ÉM<]<ùûŠÿwýƒûYù÷Šö öXö‡÷Çøòù£ûµýðÿV)h„dÎ¡È aCâJçþZüû·ú)ú‹ùòù´ûýÁþ:=Åf”Ö+´rÿÜüÉú!ùè÷Ûö+ö¬öøCùPúâûâý?ÛêÜ›ü«Ÿ€œ[Nþ;üãú™ú–úYúmúyûFý ÿˆZiéÑ8ûF%«ˆÿýãú)ù«÷‘ö$ö‡öŒ÷÷øú8ü*þwÊ­îÑDM}yblSµÿ*þ üYú&ú:úôù”úüpýÅþÊ߆dʼ†?ÿýêúÚøH÷1öÌõPöc÷Ýø–úƒüþ¬hç`¸»¥ÿÞYÕŸÿ;þ+üú;ùzùwùÈù ûºü4þ,|)iNB‚lô¶BþÑû‹ùØ÷ºöØõ_õðõ‰÷wù[ûjý§ÿ Ëöˆe&@‚zÿðýÉú2÷ ôõóµô#öøÌû? W £þü‡ˆŒ òJüæöÎñ&íêºêhíÅñ öwûòº w ¤ › • ø‡ÿÙü{ú®ùˆú-ýmÿÄLˆ˜¤°yPýlùH÷~õÃóÌó{÷Øý%§“ Bvyr ÎÅÿ¶øZð@ëRé¨è,ë ïô¢ú¥Ì ù í  ËÛ+ÿúE÷ú÷˜úŒü`þ;jÙºŽ Æý?øÜõñôÔóýó©ô¿øÝÿñ ÕåÏø hjýÝöýî:ê´éé»ë_ð{õ¬üYÀ ö + X ÚcþŸû­ù¦ùçú¦ûþƒÏ•^` väþ¦úd÷™öŽõÚõö÷~ùÛýІð ÅuÃߢ Ã$bûfôRíRëàêËëðî¿òžøÊýÄe X & „ o FàžýIû ûäúûgü±þ¥—¤Ì8þÿöüïøå÷«÷÷Ù÷ùü^3šÔ ) Gv; R Ùÿ­ù¬òuîùíÈì¤ímðôÈù#þΉ † 0 é I =Õ©ü·úUûyûü§ýðÿWQ¼º=c»#ÿÑû=ù'ø+÷«÷Œøýø?üGX V È]Ö× p Íÿ6øññÚîXì$ìeíNïåóäøéý*Zs Ì ¨ ± ~ ćã>þ^ü<ûðúû!üòý×ÿ¶çA™ÊBäHþàûÄú}ùø]øFú©üÉþ¨|j  × þâ­êüõùÑ÷©õÝó4ó¥óÝôÜö®ùýü÷ÿnÂ{gÀxÏìÅÂÚà]›ÿÿûþñþÉþ´þÏþ×þáþõþÿ¹þèý&ý‚üøûHüýuý,þDÿ}Ê~Ê*½XÇJ%þêûúOøZ÷J÷€÷ø ù‡úHüþ }×Ö©VqD©™yuüÿ§þµýÊüüîûÜûuûûøúƒútúçû‰ýÝþ†$’êŸ"Âì"þ0sÿLýû3ù—÷ögö#÷Lø¿ùwû&ý®þG ÆùÜYƒl*¹áÞ²Hñÿáþ6þ§ýý×üÑüŽüÿûûçú€úZûÄüÔýsÿJÚ6âÛ»O$t³áþÎü’úïø‰÷¶öýöÎ÷ÿøRúâûµýbÿ[/’³Q²”±ôÉyðÿÈþþ ýý×ü¨ü'üüÅû+ûoûSü ý>þ÷ÿÍ’Ù 7)ž<ÅôÐÿ¤ýSû“ù7ø ÷ÁöûöÀ÷)ùªúnüYþFEÏ*³öêœÛh¯Mÿ`þ¯ý0ýÃügü÷ûŸûuû ûñúÜû°üdýäþ0·CÆtíË}¼ÀŒþËû™ùøÏöhöö8÷Dø§ùžûžý³ÿß}ÆÖ  è@.«I ùþ:þýýŸü$üÃûBû§ú±úyûFüBý×þóÒh“ïÓEBÒþÛ[þ·û™ùð÷›ööö•ö½÷YùNû¨ýôÿÑ<f—8xi‰þ­ÿÂþâý'ýhüàû¶ûPû¾újú¥úBûüþ³ù×QE»ÚÆ ™¯O»þüÙù.øÎöÌõ‹õèõâöŒø˜úêüXÿrYû<:Õ×# Ó=À_%ÿ`þÎýÙüôûUûêúiúîùmúðúsûpýøÿ{¬9h§ «×•ü¨ÿ`üùù]øôööÚõÿõÁöUøaú²üóþOVÄ*)¹¹•3·asÿ¨þÀýƒüŠûdûûTú<ú¾ú û÷û0þº|8WrWoVVþ©û±ù8øÙööÙõö÷®øîúHý‡ÿ͆ÿ{Œ@VÜÈc‘M)ÿþìüÀû1ûµúÓùtùÆùCú@ûuýaη}‰¢§ƒÁf“IŒþàûÅùø·öðõØõ1ö÷Åøäú*ýŠÿ¤jÚ'FíÚ#Ž¿•‹ÿwþPý-üsûÄúÐùnùÔùeú†ûÓýe»°+ŠaeÙ»BþÄû²ù"ø°öñõþõköt÷!ù!ûhý›ÿ°šSMÉ÷ªãü®½_ÿLþýüeûhú6ùäøRùúÿûÏþjÂy³‘®k*£€ßÿ0ý’ú¸øL÷öÜõ$ö¾öøîù'ü~þ™¸j™¾€ÛÓIl•EãÂÿóþþýEüiûúù2ùŸù×úmýƒŒÌÆ#<{J¨5Ÿþýû§ùøªöæõ8ö”ö÷,ù ûVý™ÿ¹·H.”Ó×ÎUév)ÿLþfýºü*übûJúáùúfúÖûQþ°ð¸ß•ƒlcÇyþ´ûÊùaøO÷÷#÷v÷ƒøúÌûîý ì•ËË{³ß—Óè»n#øÿÿRþ®ýEýÎüüTûáúíúFûxü„þœy ˜w`YFKþqüÌúù®øZø…øöøêù4û¨ü\þ©üÑØzç!MÿŒþïýqýéü[üÊûrû‹ûüIýÿËöôilb‚y*–ÿóý]üçú±ùîø«øâøŽù›úãûcýïþeÃ×p™TÙ7j…¤Ìëÿÿpþâý‚ýUýIý1ý"ýHý‰ýþåþO`Nî À>Œ·ÎÐÿÊþ¸ýŸüÃûû˜úzúÙúpûRüdý–þÝÿ:&Ì=NÍcÝj¶ûÿXÿµþ;þÿýúý,þHþ_þ†þ¤þªþÑþçÿhý€)ÑjÜÖ îþÚýHý)ýKýýÃüãüý—ýþÁþ¤ÿu†8&ù½}V¾’I»ÿ…ÿwÿDÿÿÿ"ÿ^ÿ{ÿ˜ÿîÿ(nÓ*J-'÷³ZÅÿMÿ™þ þÞýžý¢ýÉýúý=þjþåþYÿŸÿ$‘â+@{‚I8êæÎª_?áÿ…ÿlÿ‚ÿ³ÿŠÿŒÿœÿ¢ÿ·ÿäÿWz›ºŸb®ÿÿ½ÿ‡ÿ‚ÿ@ÿ)ÿÿbþþ—þòþ‘ÿ~ÿèÿ.iJGf1B@[’z¢¦NM@QpòÿF'áÿ'kCZ[øÿ°ÿlÿiÿsÿyÿªÿjÿWÿŸÿŠÿlÿ}ÿªÿ‹ÿ&ÿ ÿêþêþzÿ¬ÿÜÿWnSDéӪ·X8Wæÿÿÿ­J,íÿñÿÙÿ÷ÿ–ÿÝÿ<ÎÿðÿÈÿµÿ[ÿaÿ{ÿsÿÿ¢ÿ‚ÿŽÿÂÿ´ÿÌÿÿ3mÿWÿñÿZ;ÄÿøÿÂÿ•o3!}9_.Fº„ÿÜÿÝÿ„ÿ—Âÿ§ÿ×ÿ½ÿNºÿàÿ™ÿŒÿ•ÿaÿHÿÿÿ³ÿ‚ÿ@!÷ÿÏÿ÷ÿÉÿŽÿ ‘ òÿ.Ýÿðÿ €ÿºÿfÿŽÿíÿŸÿIÆÿy?sdiN8 ±ÿ£ÿªÿPÿ.Fêÿoðÿhÿ‘ÿfÿzÿôÿ‡ãÿTÿÌÿ¾ÿ^ÿbÿXÿ’ÿþÿðÿ2õÿiÿŽ!Ž1 Ù_;,êÿ›ÿµÿ8Jœÿ¾ÿãÿçÿ 1 ÿXÿÿÿÚÿÓÿ%ybºÿU†èÿÈÿ…ÿáÿBŒÿ~ÿÁÿ¢ÿaIÏÿ[Åÿ¢ÿJÿ¾ÿ ‡‡ÂÿëÿMËÿ¤ÿ2íÿ÷ÿ8üÿUÄÿ´ÿG Rÿ³ÿ©ÿÂÿvÿôÿUÿ¸ÿ<Áÿòÿ\ÿ³ÿ\ÿøÿ·ÿêÿF‡ÿ uĻӈ™¾ÿ Žÿ›ÿ„ÿQÿ³ÿ§ÿ’ÿ‘ÿ™ÿµÿ°ÿàÿûÿÿÿñÿþÿèÿíÿ¿ÿÙÿZXQÿÿÅÿ®ÿzÿ„ÿ›ÿÖÿäÿ¿ÿÒÿôÿæÿÈÿ·ÿÄÿàÿøÿ'"(',25'ÕÿÁÿ®ÿ£ÿ¿ÿäÿôÿôÿÒÿ˜ÿ‘ÿ»ÿîÿ9@ûÿ·ÿ»ÿÆÿÖÿ?2 ñÿµÿŸÿªÿºÿ·ÿFÒÿàÿùÿÿÿ 2?(*2æÿœÿ}ÿlÿQÿˆÿL6Ls_(Ùÿ¤ÿ–ÿ½ÿÖÿÖÿíÿòÿÜÿøÿùÿæÿßÿáÿÚÿ¾ÿ³ÿ–ÿÿ½ÿÎÿ}ƒonN ¾ÿ¾ÿàÿÓÿîÿëÿÚÿŸÿ–ÿ–ÿzÿÿG<,òÿßÿ÷ÿùÿÌÿÂÿ³ÿ‹ÿ{ÿ›ÿµÿËÿôÿ6S8+ ôÿÕÿºÿÁÿŸÿ“ÿÄÿèÿÏÿ•ÿ™ÿ¸ÿèÿ,fŸˆLùÿÌÿËÿ¿ÿÎÿñÿøÿãÿàÿäÿàÿáÿÏÿÂÿËÿÈÿ×ÿñÿ øÿÝÿÚÿêÿþÿíÿñÿþÿøÿîÿÙÿàÿòÿäÿÖÿÚÿÙÿÈÿ¿ÿÓÿëÿæÿçÿ÷ÿòÿçÿàÿÙÿàÿðÿùÿ ôÿçÿÙÿÖÿãÿõÿ6;' ÷ÿñÿ÷ÿþÿ ÿÿíÿáÿÕÿÐÿÜÿæÿíÿíÿíÿêÿèÿçÿçÿëÿäÿèÿ÷ÿÓÿ»ÿÆÿÈÿÜÿùÿ ûÿ ûÿÝÿÂÿÁÿÎÿ×ÿõÿ//!èÿçÿîÿçÿáÿæÿæÿÕÿºÿ¦ÿœÿ¢ÿ´ÿÌÿÙÿæÿëÿèÿ×ÿÕÿæÿûÿ òÿáÿÙÿÐÿÖÿüÿ %8GBQp|sŽ£p3Ýÿ¸ÿÿ^ÿCÿ$ÿÿÿ ÿ$ÿMÿoÿ“ÿÂÿÜÿÜÿÉÿ´ÿ¤ÿ©ÿ™ÿ_ÿ.ÿÿ.ÿtÿ$7o–jÈ“õ  ÿóýºü¨û¸úõùùÊùŽúû®üþaÿ‡¤ªq ŒÆ 7a‹ÿþåü ü¡ûñûýÖþ¯o 6ÅÙr„iDØÿ÷üøú@ùè÷÷÷…÷ƒø$úýûÊý“ÿYi—a¢2†iVLZ„ÿ¡þýeüaûÈúúÉúûÐüJþú„@½Õ˜ò­ f®þÔü/ûêùù¡ø»øNù(úCûžü*þËÿdÆå¸<uFÄ Sžå;ŸÏÿ þý¥ûÁúcú…úPûèüîþøúŽWÏ ³á‰¹³ÿ–ýoûù#øT÷<÷½÷¼ø ú‡û#ýèþÎ)fdo$e^K7@[…ÿ´þ§ý<üèúKúXú¢úpûêü´þ¦¿‡€ [Y Tóôÿâýóû?ú¿øº÷y÷×÷ªøàù^ûèüþŠLÅí¯ ½ /SZezÿáþöý©üMûútúÈú›ûÜüDþèÿ !u'ƒ‹H¯f~^=þJü ú"ùÕ÷+÷H÷ý÷&ù…úÜûpýÿêWIPì;)à?"ÿþ|ý¹ýSýú‹ö8õž÷ûú`þµ½£ µU— ‡Ÿü‘õ_ðyðEò ô÷Tú»þÊ£%!~‹æý8ü¨üìüþüºÿáõË55Ú‰;ÿ=þKþ%þDýýêúö¢öúøû³"ì– ó Š BŸü÷Vò&óùó¸õû§ýd¯q›¾ÿbþýütýàþ0ÿcÝFÊ(CFêÿ3ÿbþWÿ»ÿ/ÿ]ù¤ô÷¤ùUùˆþ˜ÐÇ ª?Ò a üËöÉï­ðÿðÝó½û~ý×ÿJ¿þÿýÃýkûèýiÿ¾ÿJ4c^áãÿ¡¼¼üúüjþøþƒPêd)úœõ[÷ÚøNûHf ² X­ Wâgø>òLñ3ð7ò÷ü×ÿr …´ä?ÿÓýíûüxý,ÿÍÝiÆ ÕD}ÉþÀý·ÿþîÿYiÿÑ•þ–õçõ®øûö¬ûðP ×é¦í {…ÿCöñ‹ñ8îœñ0ùûçÿ2m"=*òÿ–ýßû3ýåý^B™Ví"Ôý5þû„ÿ†…jEþiõ ÷ùTõÚù1Ma ‡èV# ™„ÿÒõõîrîî.òn÷-ü ¬!Ë`DÿäúSûýýaýÖÿ»ûñFNýýnþ±þ"þ¤ÿ‘þÀÆýööZöÏùÎ÷ÑøOÉ T 8S G–ýöÞïZí"î¬ñg÷düÀJàÐ2ŽÖÿSýyûÿýÀýïý½aªÕÔ H“þ ü7ÿóþøÿÑx½û™óYøûöhüŠtÄ ‰‘æá (Cÿ€õÇîwî-îñpö®ú4„ Ž;‹[þŠýõýòü[þ5»î*. $«Wýlþ×ÿÛý<ÿtÿÎäø4ö!ù¤ø ÷ÿ›°ô õUzÍ|ý‰ñ ð~ïçìðîõ;üàÿæeë_0Mÿ‚ýåýßýÚý~þÿt6{W@f³ÿÿ@þüýÝýåþÎÿÊüÝöËõÉúÂù¡ø¦5 »ƒ&â‹A/útîìÝî.ëÈñ»øhûH¾³ ‘oÞýþ—ýÞüzÿQÿ­KD+Þá\ýîþÿÃûèýêÿÿ€ÿtú8õxø=ù5õtý d‘:¡> l!üôòqê‹ì?ë6î.öÆøßÿÂµè´ ‚Æ›Æþ[ÿìü^üÿóý%ÿéòŸ!‰Y¤ýæÿƒúlþñÿ¨þlü=õõSøÅôëø[Ò B,Mg ÍüŸïYéAêòè÷ìTôÊùpÿc<v + ùMÛ*þuü¨üòü6þŽÿd7p8!C1vÿùýÐý`ügüCÿcÿÓùíñåñ›úúdûh,twBWÃüïgê¥ç^ê~íœñÈü;Ñâ2  5 ‘½ë¹þ¬û­ûlüÒû:ÿ)B¦³—µŠOþtý'ývú€û¹ýËûjúøûÓÿGþä `  g{ý¦Á¬ð@ô-øÀíùò7ú ù0þ¥á©³q¡žVû¦±þýÀüFüèÿ@ÿáÿ:Bêÿ ü1÷û:þmúPÿ© æû-‹ 㺻ÿòõQùF÷]ñ€öQùn÷;ü•ÿ ÿ ‡Yiyä M3KÿŽþþ#ü'üÿý¡þ}þøÿ)5jïUÿhöìü+Ró ø þóû´s ©û{˜ïûÓý§å¯üªýÌéÞýëéò«jûúÝ㠨ܸ h_ªþÏÿl ûeü¶ýGûáý»ÿ¬ýÓÿ!¹þ»NÿF=¿NÎLâþüþ®ÿöý6þ:ÿsþ®þ½ÿ:ÿÿ ¿ÿªÿroSÅñdd÷ÿ™ÿ©ÿ ÿ?ÿ:ÿ›ÿoÿhÿ6Ÿ»Jœ¬Ýÿíÿ*£ÿßÿFWpþÿ%+œÿ·ÿçÿ…ÿµÿêÿ“ÿ¾ÿÎÿ?ÿeÿ˜ÿ2ÿ€ÿÌÿàÿ‹GøÿL·ÿäÿþÿ!^<!*õÿ¬ÿºÿ¬ÿ…ÿ¿ÿÕÿÒÿ+,_e1L|WIMùÿñÿÉÿ‘ÿ{ÿbÿ7ÿ_ÿqÿMÿˆÿÓÿËÿîÿ</ñÿÈÿÕÿŒÿªÿ+ íÿùÿðÿÕÿÖÿûÿ 9BXS*  õÿ (BÎÿ³ÿ±ÿ‚ÿ~ÿ­ÿ®ÿ´ÿùÿ ÚÿßÿÒÿ¸ÿ¸ÿ¬ÿÁÿçÿ81 $Æÿ‹ÿ’ÿzÿvÿ½ÿÈÿÚÿ,MQdZCDB6G;=3þÿîÿÙÿ ÿ¬ÿŸÿXÿzÿ­ÿªÿÚÿÿÿ÷ÿîÿÖÿÜÿ×ÿÎÿÝÿëÿäÿõÿÿÿíÿíÿÝÿÁÿÈÿÒÿÅÿÜÿðÿ÷ÿ <3GWG/'  ÿÿîÿ÷ÿðÿÎÿÈÿÆÿ ÿÿ®ÿ£ÿ³ÿêÿÙÿÓÿ( ãÿÙÿÖÿ©ÿ¢ÿ©ÿ©ÿ°ÿÐÿÖÿÐÿõÿ ñÿ+ õÿ þÿüÿûÿôÿðÿðÿàÿÓÿòÿèÿÕÿèÿäÿÖÿ×ÿÒÿÈÿáÿüÿÿÿ øÿõÿîÿ×ÿÏÿ×ÿàÿÙÿÚÿîÿþÿûÿøÿÿÿ " ÿÿáÿËÿµÿªÿ½ÿÂÿÅÿÈÿÁÿÜÿûÿþÿþÿüÿÿÿ îÿðÿêÿçÿíÿîÿ+<oÿNÿõÄ»þyÿÄbÿvÿI;„ÿÕÿ1ãÿÚÿ'ðÿæÿ*M»ÿëÿ,Òÿ˜ÿ´ÿãÿÂÿœÿÚÿõÿáÿ(ðÿñÿðÿûÿùÿøÿæÿÓÿäÿäÿÕÿ×ÿæÿíÿûÿ"2%ñÿ×ÿãÿàÿÜÿÐÿÎÿÕÿÕÿ×ÿÓÿÆÿÈÿæÿñÿêÿîÿÜÿÓÿÿÿ÷ÿÏÿáÿæÿÝÿñÿòÿøÿîÿþÿÿÿ  '/!îÿÐÿ¿ÿÆÿÏÿÉÿÙÿêÿøÿ äÿáÿÕÿÉÿÏÿÁÿÐÿèÿôÿ ÿÿÜÿÄÿÄÿºÿ®ÿ˜ÿœÿµÿ¾ÿÌÿÚÿçÿÿÿ   *% þÿþÿôÿ»ÿ…ÿîý¢ü›T á zÿåöhöýh½ý¿üAÿ MT_ìpíÿÁÿ·ÿ·ÿ$ÿÝþ%ÿ»ÿJ ÒÿøÿÜÿ­ÿ“ÿ¬ÿ¬ÿûþîþìShÇÎüÎú«ü[þ:þOþeA3ËùüàúÊüWT¾¯ýþª¿ÁþOü£û¼ý°‡ŠÿËÿª((È9°TÈWÿ—þ˜ÿ.+ÿjþmÿÊ­ßÿfÿÈÿ*©iTÿ=ÿ{ÿ%øs¿þþsÿ[çiÿèÿ ÿ^ÿ¸ÿ™þlÿ $mÿtÿlôD7ÿ€ÿ½9’ÿ§þ ÿ2ÿ[þª‡Tÿ.’+ÿ£ÿŠPëþ,z_Nmÿ·ÿÈÿêÿÅÿÈLïþHÿx˜bÿþÌþZ+™ÿðÿÿ—L&ÿ¸ÿÿÂÿ©Z9ÿâaÿŽÿÄÿ)ÿ©r=ÿ¸ÿÝÿ÷˜\ÿ!)ÿÈÿ]tÿÚþôÿ¾Ø{ÿ•ÿÀÑÏÿ\þÄýGÜcÿ“ÿñàÿÜÿpÿÚÿÝÿàÿRÿ"øÿÚÿáÿ—þFyÿûÿ„ËÿÿŽÿ3ÿDîÿÿçÿ]epÿøÿ÷ÿs‚ÿ„,a;ÕÿãŸÿ’þYÿbÅlÿëÿ<üþÄÿ÷ÿÝÿwÿ†øÿŒÿ5ÿ§ÿpôÿ +yÿ„Æÿ,ÿžLˆÿPÿ¾ÿ<æÿ?þÿ ÿ~ÿMÿf° ÿ°ÿÕÿ×ÿ8ŒÿsÿpX’ƒÉÿuJÿ–ÿoÿ Ò@ÿÿÿbyÿ×ÿfæNÿÿÒÿ’ÿùÿ‹ÿ}ÿ vDüÿ9ni~ÿ^ÿõÿfÿUÿ2ÄM‚ÿvÿŠ}€ÿøÿ+…ÿÄÿzÿ(ÿòÿ1"÷ÿ]®ÿ‡ÿ®ÿŸÿ[ßÿÝÿˆ›ÿáÿáÿÈÿ—·ÿ8ovÿ6zÿsÿÿíÿ=õÿÄÿªÿB´ÿ8s¢ÿTµÿ™ÿ<áÿWáÿ›ÿ§ÿˆÿ;XIÖÿ×ÿ€!zÿWÿûÿ‡ÿMÿ;&¾ÿ=ÿpÿhàþ°WŽÿêÿ£Žÿ§ÿ¬ÿ{ÿ~ÿ=ÿ³íÿ_"àÿ'óþeÿÖÿHÿßÿ“ÿ§ÿ1çÿ®ÿ×ÿ¾Ž3´yñÿCÿ§ÿ{ÿòÿSIÂÿlüÿÓÿ$èþÿëÿ˜œîþܨ.ÿ™ÿYÿ×ÿ/xþ’ÿd–ÿ\ÿÙÌþÅÿ˽IÿDÿž¦ÿDÿ„ëÿ­ÿ%ûÿÿÿ(ý©"ÿHÿàŠÿ§þvÿHÿ2ÊÌÿaÿÌÿ ¥ÁÿoUwÿŠÿDÿ?ÿTÿiÿ˜ÿ/ÿ¼çÿ(þyñ*}þ ÿePJþ)ÿ*¶Ñyÿ¬ÿØ·ÿõþ:ÿEþ,J ÿ›Ñþ¬ÿ”B‘þåýrýê yÎËÿ{dÐþ¦’ÿnþþ³ÿ`’ÿ¦þ‹X1^çÿ·ÿYÿÎÿåýþNüÿÿ§ÿÇFÿ„"©ÿ_ÿˆÿ¬_ÿÛþbFàÿHÿѹÅþèÿw!˜ÊÑþ[ÿHþ½ÿn˜ÿ*a,ÿÖÿd…ÿŽÿŠÿzÿQÿwCwÿÎæÿ4Ëÿ9¹—™ûþ·þNÿùþÛþÿáÿu®ÿ‹ÿË›´ÿ©ÿRÿ×ÿB‚ÿ›e[ê?ÿÿ,ÿ½ÿMÿœÿ¬äÿ= ÷ÿ3úÅþˆþ/×þiþ0ÿˆÿéÊhÿÌÿ.€ÏBf¯þÿUÿêþ’ÿMÿ}ÿËÿ¦ÿ¬ÿMÿýþþ\ÿǸÿ›ÿÒ¹Ùzÿ=ÿê€>&ÿþlÿ˽ÂÿÎÿUQƒ  ‡LÿnþAþýÃûÄû™ýüþYÿ"å)rÆ>8†ôŒÿ³ÿþáþ‚ÿÿUÝ=¬2[ÿMÿèþ±þ ÿoÿpÿ‹ÿ@±äÝí½µÿFÿÿ\þ%þ3þuþ»þjÿ?f›¿ñ®²Ï˜TË&ÿ—þþ–ýÉý÷ýfþûþ\ÿËÿðÿX—SfP %'ZÁ°€(Ýÿœÿÿˆÿ~ÿˆÿÖÿ*a|sM÷ÿÕÿŽÿÉÿ÷ÿÈÿôÿÈÿæÿ³ÿ‘ÿŒÿ}ÿ¤ÿÄÿãÿãÿÖÿªÿ¦ÿßÿ¬ÿºÿëÿÙÿ%<,QnolQNÚÿÉÿ¬ÿ½ÿºÿÂÿëÿñÿùÿáÿÜÿêÿËÿõÿòÿçÿÅÿ¸ÿ©ÿ‚ÿ§ÿÈÿßÿùÿ ..÷ÿõÿÿÿ'"*=!íÿÜÿçÿñÿ ùÿÚÿÝÿÕÿíÿõÿðÿ×ÿÓÿÏÿÒÿÈÿºÿ¿ÿ¾ÿÅÿÉÿÕÿæÿ'!òÿòÿÓÿÖÿÝÿäÿòÿÓÿÝÿ÷ÿÖÿÙÿøÿõÿëÿûÿ÷ÿ÷ÿñÿñÿñÿùÿùÿæÿèÿþÿõÿäÿûÿ+2"6+ ðÿ×ÿÁÿÈÿÐÿÈÿÈÿÁÿÁÿÕÿÝÿáÿæÿçÿáÿíÿíÿäÿõÿçÿçÿðÿÙÿäÿíÿùÿðÿôÿøÿèÿðÿôÿüÿøÿíÿäÿ×ÿÙÿÙÿãÿñÿÿÿ øÿ÷ÿ÷ÿõÿæÿòÿêÿßÿçÿÓÿÎÿÒÿÎÿßÿòÿ÷ÿ øÿþÿáÿëÿîÿÓÿÄÿÚÿàÿÏÿßÿíÿ÷ÿüÿùÿ!øÿ ðÿîÿîÿÕÿáÿëÿßÿäÿþÿÙÿÆÿÂÿÅÿ¿ÿ¿ÿáÿæÿÚÿÜÿãÿôÿîÿÜÿãÿäÿñÿñÿùÿÖÿÚÿøÿàÿßÿèÿíÿÿÿ÷ÿþÿüÿþÿîÿ!îÿÏÿÅÿ¾ÿÚÿõÿ ûÿðÿ6L1ÿÿôÿèÿÅÿ¸ÿÉÿÙÿÁÿ³ÿßÿèÿÕÿËÿãÿòÿÜÿÕÿÈÿÜÿíÿþÿÿÿÜÿÝÿæÿîÿùÿíÿøÿòÿ! õÿðÿ×ÿÆÿùÿçÿÉÿ÷ÿõÿçÿßÿÉÿ!÷ÿ ëÿãÿäÿíÿþÿêÿêÿûÿäÿíÿøÿûÿíÿðÿ$øÿàÿÄÿËÿÓÿËÿÈÿÕÿÖÿÌÿõÿ ãÿîÿøÿûÿêÿëÿòÿãÿæÿôÿñÿäÿ ñÿîÿîÿðÿíÿÆÿÓÿæÿêÿæÿÌÿãÿçÿòÿòÿÙÿÂÿçÿþÿçÿÁÿßÿàÿKÿlþ/ÿå⨳ÿAÿþuþBþ¦þtÿŽÿ¢ÇXÈÿmÿ³ÿ´ÿvÿ ‡Ñi +Ÿ6èÿ©ÿKÿ2ÿDÿHÿlÿ[ÿ“ÿ$=üÿ’ÿaÿÕÿ¾ÿJÿÐÿ¬ÿ*Žroíÿ·ÿ øÿˆÿµÿ2þÿ®ÿZ¢ÿÿ¸ÿ}ÿÄÿ ãŽÜÍþýý;ýÚýKþäþ­ÿ9žª’Ø þ„3BðÿðÿMBˆ?ÿþsþ>þÌýþ‚þGÿCŠ1>»•¿ÿAÿÿ¸þÿ2ÿÿAÿõÿbºHÿ»9.[ÿâþ~ÿ¾írŸÿˆÿõÿGFJîÿKÿ2ÿ!ÿJÿ·ÿRÿêþ2ÿýþ ÿôÿ6s&¶¡ì×¥'ûÿFÿ9þÐý\ýÀüóüòý<ÿI´[pjþÄüôûjüâýrü#÷¦ôhöØûs {"Ò#+À”ó³ë‘çƒèŸì õ±6 áP Iýøöñ;ñKõÄû N * ‹ ÛŸû‚ù%ù û¤÷9 ã z)¸ý,õŽêÔä†çlðì/ÿ+™+Œ  öpåìߥâ>ìø¹€¿ >ÜöOï­ï õöüŒ ¾ O AGÿü ûÄý·JrŸþÚÔàˆÓøôñµégíIûãÿŦ㘠õøíÒètê¸óeÎæ ¾ ”Æúžö½ò÷¡þ&þF„ þ5ýãûþ )Ò8 ?ýÿ ûpþ>ýøóíïêâñ¯lŸ j¢¢ÿ5÷˜ñ"îõïKõ)ý¬Z LÂþMõôñ£öçûêuoŽþéü;þ ÿaTŠÒJ`Äÿ¼þðÒôõ(êÍêøô ªm¹ /ú[öòïNïoöUýg÷ ^†üFöóŽö5üÿ¬o ¥Ùþ ü{ýŽÿî«NWŽfÝÿùšw.øë¶çõîCȼ ˜ ãÿlü¢÷ÍóõÎ÷Wý±#9hûzõ7ô«ù þÇÆ¶‹bÿFÿÚÿ„ÕÜI¥×w—ø ÿÚóùêØëúCF®±úÉþ*þûŸú¥øˆø>þÒ½ÿ˜ü½ö<õÆùþ:6Ñ×ÿþhd•ýÛIE‚¸ä>„TÊ¥õÎî»ð÷I¿º “iþïì7þÂù`ù—üZýçû@úí÷ãù.ÿjtù&ÿ þ¼ýdþ© ÏÛyñéøó[ŒiÌœûÕòið±óUþ” .… ¯hÛÛÄ û³öîøýÙþúü±øl÷û?ÿ¼ªñÿþÞýŠý´W´/ÿNÇJQ³'—{üßõ õ·öúû™ó›‰ï Ó * ÌúSñzð9ôœùÐþåý_ýqýšþš%Kõý8øù1ü_±¹5.JÿÅ›]þÍøõÀöBûÂþƒžÑ ¹ n uIñûºö•õÒõéø—û<û¢û$üãÿE”PßûÖú1üòýæ‹rûÏ€  õ;Œ.gü4øt÷‰ùýýÿÿ‹S » â ®Xûø6öÓøÑö^÷¤øXúõßÛôùü¼ýÌûAý=þüýËwq„aC>fânyýÔù¯÷wøÈüÿI3mX RÆx AýÙ÷öòõ’öŽö'÷úþî1(ÿÙüüŒüžý™þ´ÿlg‡ÒÐŒ]÷ÿû/ùùüÌýcýú¯ª > ” ! A Èþ-÷Žò;ô#öGùúîûcHyÿÈüûÀüüýjÿ˜­…QÂP´Ùh^¦ûþöæõUù þ&XàÂÇ M¯àÉù8õVöSöö¢÷Ê÷ÕüõËWŽþÃûûý1ýa©d$Ž–Û”L&ý3ùøöCúhü³ûÿþ-è |à C ¤ývùGõÀó°òNõ×ø†ý5½  /þÑýûüzþþÚýöþÕÿ> ô$»«§T%ú™ôQõ¾û6?[7 ç" êWý<úïøXôºðNñ¥õ¨ýôm±§ÿÿý›ü'üàûþƒŽ³¬@d¥W«„Žú‡ö ø¬ü•þšü8ýçÅ¥þñ N³ýóû0÷&ò¯îï-÷sþ§ò;C{ÿïþýÄû¦üpýÓÿ.!‹ÿ)@0Í1BüEô ôYùÌýWÿQb kÍ ¤ýÕ÷±ô4ï]ì€ñË÷>Ó) 5Íþ!ûõúÌùYýžt Qø£áˆF/{úèõyõ§ù§þ¶µù| «$ý]øƒöòšíÌðöö±(ÛTQ¤ÿÄú¾ùsúõýðƒÄ¾s¯² _ëý9öDóqù×üîýÿR–cð·gŸÿx÷Gñì{ï÷úû'Ï =!‹ÿûOø—û‰ü+ÿj†dõª‘Äóáþ˜ú‘òÚô+ú`üHÿ—É0ú‰ ÓšúûŽò‘íÉîîó‰ùü –|)šý<üðúWúý¦ûYÿ—¤M´•JOhÿGþ+÷éð+ö*ý«þ…þj‚^éóÈüëóðkíãð1÷„ûéAùÙÿfýûõøôúJüMÿ|›˜‡íäh¨PýböÌð÷öMÿwýÀû^£NK »ºö!ìíïJöùâûSIÈ5ý²üú•ù9ú¡ýè‘“Ñšî;×þ¨øçñÄò{ú.ÿ|ý²ëYöE \ôìðîEñQõþ÷(üÿïÏHþKýÅùæøŽûÙþíHT EþR=…þ&ôñù‡ûE÷ ûs;Q+¼PýÎöýòµîSíšñøþ<þÉ9BŒýŒú±ú¹ü¢üþ$¯¨ÒüöZò*÷Jù…÷©® Å âÕ⤘ü-ø×ïÏð«îSî5ú”ý«þ‰´Òuû+üþ¥úrûÅÿfYqéÁ“®§ý:õ„õþúzõ<ößä C6è Ã,ÿþõ›ò£ï*ígó¹÷2ú.ÿ&iT€ÿ~ÿý9üÇýÿ£h›LoAaØûËõ9÷¯÷+õý{Œ6á…i »’þÿôÎðÀí,îÍôÇöùºÿÃ0>Õèþ3ý-ý,þ‹þÙþÞv’¨ËŒÿZöõìû!öÇóØÎ×ferð€ü„ðzïóñQïŽòÎøðû ` û.€ôÿBþYÿLþbÿƹš‹×ûû­ù²ûýô”õŽ»ÿüƒ\¯ó <æÿöÍòºïâî/ð¡ó¬øIü‹ÿxÈ´†0J}zþöþ];«Ê¬¹0ý$úòüÅùócþñÿ9A*‚Éåù½óòTíÝîóõ…úBþ¤ÿGðfö¼ ^#þ;ur•]ëúÛøúý–øŒõ…­“/‡¯ã 1ÿ/ö{òÿðªîáð6õË÷èú9þ2‘1/޵0â%‡ÿ!Ê´È`²¹ýûú]üªùöÒü”Âé Cí{õ B ˆùÝöWòhíÉð,ñ&ôù û@ÿ¨ý2η¤æCçÿ¯:ÿ‹ÿŒýýñû€üÝûJ÷%ú”ÏmÙA© ]ý’ù—ò?î/ñjï’ñ•öuøüsÿù¯D•z6+ þÙ¤þlÿ‘_òühü þ,ù´øÖþ<5H ôCØ ä š”ü6ø"óœï¾ï„ðoò„õqùòü=ÿS£zÿa^ëÏßÿ~þÖþ'Î~þTû|ûJüø?ø!òï3ëø‘P i ÂäùÁö(ñ7îVïXñƒñbô»úü²þ9Ç7¸”ÓIJòþ!þnþMÿûþZýü‘úFúfúKú—þ¯úþ |&¼! ¤ZDûŸô!ôxñdî÷ðóáô³÷ÚúœÿVÐkm Ù4ƒ{:(ÿ¸þÛþªýŸþÆý ûªû?ûú”üNÿùc™ + ÌÞ F -*0þ…ùõô‰òÇñNó õt÷UùØûŸÿYåæ ä,–IMÿ>þ6þÊý[ü;ü2üªûƒü@þz;ׄ Y  ™mVVýû§øt÷^öUõ˜õlö‰÷¹ù[ü,ÿA~ ãoÊîÚåíSZîþ“ý1üŠûJû¢û;ýcÿ1‡À-&ódqaÿ±ýãûyúRùPø¼÷˜÷Õ÷äø‘ú«üåþÎq2±\ZòÖæÿýFü]ûkû¹üŽþ^B>Çd†sºQŽÿŠýyûˆùß÷©ö;ökö÷‚øœúùümÿ©}Þ»4}{ü·Ôœÿ«ýÕûú}úžûný˜ÿ×ÑfH^7é¹.þ©ûbùµ÷ªöööÖö7ø<ú†üÏþCnøœ÷êW_&øÿþuü#û–ú*ûMüþJ|Èx$kêµ°sþõûõùKøÑö!ööNöe÷ù_ûÿýk o°}ÛÍ÷Ö,æáþ"ýdûeú•úû?ý~ÿÆ(úL±ÓGÿ5ý(ûRù°÷öèõÒõ›öø?úÕüzÿ !ËÔ Ë>m6V@/þü=úiùúâû%þ»Qp‡¨bÙ Ý—qàÿýÿúø¢öƒõ)õ£õ€÷Èùéûˆþ©Kâäé¯'R¯¦âŒ ÿ¿ü5ûúú<ûâüÿ8,§€î -½ÖJJ ÿHü¾ùÈ÷iööMö÷ˆø+úóûòýèÿóëlyK¾ þÌþ ý»ûû@û üwýAÿ”ü ¥¾¢Ts4òþ†ü6úKø4÷Ôö#÷ï÷åøú¬ûYýüþÿX6ƒ1#†[Û8¥zÿ¸þýýKýêü·ü¢ü7ý‰þp• «L2•º;ÿõýæüªû9úÉø‰÷þön÷¨ø¦ú.ýŸÿ¥µ$DfÆ'5¢f½àÿ3þÞüüü¬üµý,ÿàŠè6û_•»ÎºeÿÍýÛûëùkø¨÷‰÷ø)ùÕúŸüDþÕÿ$41×[»¨Ý¤vÿÃýýðüýmýtþ£ÿ´7i‚Xš…oqþòü¢û„úŸù!ùù]ùèùËúüƒýÿ¢$t<‡s!tj,â³ÿ«þÕýdý1ý3ýØýëþ3ÑH(wMÅØÍíïþÂý€ü<ûúùžøøNù¥ú7üþÅÿC]/¿5òÌ ÕTÌÿjþZýòüýcý/þTÿwƒˆX»ÝÈd«¥bÿâý‘üpûjú¼ùfùqùåùºúéû8ý­þ=•«‰!}£ŸJ»ÌÿbþRýØüòü¶ýûþ,³?²"šá&§ÿ9þ ýBüûÁú&úÃùÚùiúWû‚üÃý ÿb³ä×bKx¤¡}hÿjþ¢ýYýtýìý±þ˜ÿ¥ºU1Ñ?‰½Âÿ¼þ¸ý·üÖû ûƒúCúmúûøûý(þmÿ±Ñ¹lâ(N@âHxާÿàþ,þÚýåýþbþÍþsÿeBÙE\I1Ò$Pyÿ¨þÛýýrüâû„ûvû¯û üŸüxý~þŠÿxDägÆñÔ‰a¯Äÿïþ`þ#þ(þ\þÁþ6ÿªÿ5¶ j—¬¢oŠËÿ ÿ_þ³ýý›üMü2üCüŠüôü’ý]þJÿF4÷…ï%þÆ{ ƒ}ºÿ3ÿùþÉþÃþàþÿAÿŒÿðÿD„¬´»¬z8ëÿ“ÿ<ÿïþ²þcþþßýÇýÉýâý2þ§þ3ÿÐÿbØ4y¢¨¥¢h<Âv$Éÿpÿ<ÿ9ÿQÿ}ÿ¬ÿÝÿ<IIFB, ßÿ»ÿ–ÿoÿDÿÿÿÿ ÿÿÿ&ÿHÿXÿ}ÿ™ÿ­ÿ³ÿæÿFn|Ž„¥ª£Ž’ŠrsaJ=/! øÿæÿÈÿ®ÿ¢ÿªÿ°ÿªÿÿ’ÿ„ÿ{ÿ„ÿŽÿ–ÿ™ÿ¢ÿªÿ¸ÿÉÿÕÿÚÿäÿûÿ$8D[pMêÿÕÿÓÿÉÿËÿÕÿèÿ ûÿçÿÓÿ¾ÿ¬ÿ©ÿ§ÿ±ÿ®ÿÂÿäÿûÿüÿõÿôÿ÷ÿûÿþÿíÿÕÿÏÿ·ÿ£ÿ§ÿÂÿáÿôÿ8W]f_@!Ýÿ®ÿ“ÿ¢ÿ·ÿÅÿÖÿèÿäÿàÿäÿêÿêÿæÿðÿ üÿòÿëÿÚÿÕÿÜÿáÿëÿëÿôÿõÿäÿÖÿÕÿÒÿÚÿÙÿßÿÝÿÜÿÕÿÌÿÎÿÈÿËÿ¾ÿºÿÏÿËÿÂÿÏÿÕÿáÿüÿ,@CB/ÿÿøÿ÷ÿùÿ÷ÿîÿôÿüÿÿÿüÿùÿøÿüÿþÿÿÿòÿäÿÌÿÁÿ´ÿ¦ÿ ÿ£ÿ­ÿ¿ÿÓÿôÿ!øÿáÿÅÿ¿ÿÂÿËÿÙÿßÿôÿ üÿøÿùÿòÿøÿ ÷ÿÒÿËÿÎÿÄÿÈÿÒÿÜÿëÿñÿòÿñÿäÿßÿÚÿÒÿÕÿáÿëÿõÿüÿûÿÿÿøÿðÿèÿçÿñÿÿÿ îÿÙÿÏÿÉÿÏÿÖÿáÿáÿÏÿÅÿ·ÿ³ÿµÿ³ÿÈÿçÿ %þÿòÿëÿêÿîÿ÷ÿùÿþÿùÿñÿçÿßÿáÿíÿþÿòÿòÿ×ÿËÿÐÿ×ÿçÿøÿûÿûÿñÿßÿÚÿÖÿßÿôÿþÿêÿßÿÒÿÉÿÓÿêÿõÿÿÿþÿüÿûÿùÿòÿäÿ×ÿÖÿÙÿçÿõÿùÿþÿÿÿñÿäÿèÿàÿëÿÿÿøÿôÿÝÿÈÿ¿ÿ±ÿ®ÿ°ÿÅÿæÿøÿ ñÿãÿæÿðÿ %*ëÿÚÿÜÿ 'ßÿÄÿËÿÐÿîÿÿÿçÿÌÿÅÿÂÿËÿçÿÿÿþÿ×ÿ½ÿ±ÿ·ÿÌÿæÿøÿôÿÝÿÙÿÝÿäÿ ! øÿãÿÐÿÒÿÚÿàÿôÿ øÿëÿäÿÒÿÒÿüÿ/Ìÿ}ÿfÿ¸ÿzJ*»ôTÿ„þzþ<ÿJÿ§þ"ÿ°ÿËÿÕÿëÿßÿ©ÿe­]óÑ¥ðÿJÿiÿÐÿ+,üÿ ÿ@ÿAÿÙÿ•¸ ì‡ÿ_þ¢ýyýcþiÿ±ÿwI§ÿèÿ<Qî$ÿêþÔþÿ¤ÿ"N*©ÿWÿ=ÿÄÿùÿT’zÂÿ¸ÿ°ÿ©ÿÿÈÿLȺ­ÿÿòþMÿ·ÿ×ÿ'·ñ 2Ëÿßÿo]„ÿÉþóþѬ=§ÿ!ÿGÿíÿ[]*Ýÿ}ÿÿÿÓÿ¾ÿoÿ´þ°ÿ%{ÿÉÿw¾!êþÙþ®ÿ6+Ĺãÿîþ7ý«þœ”÷Ø9þ’þ®ýîþ|9¶Óçÿÿ“þbÿ‚ÿ ¯èþ¯ý@þKþþ@þ¬ÿ…lûú?©íÿÀS^ÿþªý ý½ÿsýfý ÿ câ[ÿ $ÿ¨1ùþ ÿÿš¹%£þåþŒþ=ÿ­ÿ þþ(ˆÿÿ7ÿ@ÿðýRýrý·þì>oåþuü Tÿšˆ«þ¶ýÙû|žu”;×ýäÿ L”ÆþÞýíÿ;OüXÿà"ÿÄü†0‡íü˜ÿ”jüÿ·Ùþþÿ(JÿéÈÿ /ÿQýýŒý|ýL­Uý!KÜVùÿÈÿÿÿrìUÖÿeÿ%Èpýý;ûÆúeüú¥òÿ#ûÎý­Yÿ2¿þàâ' lÿðül9*©ÆÿÜü’þ‰3 F/ÿ¿ýûÿUÿ'EÀ´§ÿšý2þ8Ï÷ˆ“þâþdýŽüq¤fÿTühýŒÿ»ÿÁ6Ä›¼ýäûÔý«þ<ñîtsÿuûéý1ÿ~·¶üæý_ÿ€äÿÿ5ÿçkýýþ0ÿ8±¦XÿSýMü‘cxÀüœû€rd¬üÿ^ÿÚþx·SÿýýѤ8}üµýÓ]5Qÿ`ý OðøP þhý’YŒÿóüÐÿjnì‘ÿ7ÿÀZ8ýiþ³íòÿ×ÿÄ•Óÿjþ ýÿu[ï”Zü¹ûb>u®ý—üü¡þ´¶Ò~ý„û0ýL}ôÿüþþÿi—hJŸ¸ý€üRþgÀΘïýþëÿ™ÿÞ{ÿjý¨ý°ÿMÿ«¦€ÿèþÿ•TX&ÿTdýsü,ñÒ*çÿsþýÉþ5±´*eqü÷ý«âþâþEþ—Ç%®ÿ¸ÿ}ÿ ÿ´¾[þ YÆ2”ýþü/ÿÎ"b þ“üþìþý-0ÿy$øÿPÿÿ"ûü”ýülü$Ç=¢üÒúÓúFÿmþ~þzþýYþƒËŽ}Qÿ>þýóý>&½Êþý°þsþ„ÿ«3Íü5ú-üå!Y—¢ý¤ý¤ÿYÃÆÿµÿÚþ’ÿDÿ¯üüý”!èýþÅþÿý ý Ö¦3ÿ¬ý‹þqÿu΢ƒ¡þKý£ÿÝŽÄÿÿÎÿ^ÿ»þ3ÿP;©Ÿÿ¬üjý»›âþuüLþ²È3Éþ&ý¤þS‹ÿþó,•ÿuþ{ÿpÏ‚þyü˜ÿׄºÿ[þ²ýÎöþLýÌþì4`þöý’ÿÅÿÛwñÛ3ÿËütýbÿ‘õzÿ¤ýný ÿ¿zÿ!ÿSCr ÿÞþ~ÿFWÿàþÅÿ?b ¿ÿl€óþþÞþŸÿn®^ÅÿàþîþºÿøÌ)ÿ®þ°þþ_ÿ‘Ñþ‡ÿÙÿ±ÿ"Óÿ‚ÿ5ª·ÿ›ý\ýQÿªÿÆþþYþAÿÁþœÿ?æªÿóþòþ½ÿÝ3Ôþ¾ÿ ìiÿYýóüÔý½Ò1l…>Úÿªþ¿þ?cÿcý9üûûýü1ýRý’þiÿ:ÿÿûþlÿ(kpÀš€sÿÃýNþñþ«ýøÿü u+Ýç<¾…ÿÛý¥üÀý³ýüšýÄýuüÍü¡üýÿþÿÿþŽÿ*þÆýMÿÖÿE ¯Yý8ÇÊUÿŒýüPûýâFd]G_ûAÙJþúüpýÝþ9þrüeüÄý ÿ¾þ,ý1ý»þùÿûÿÔþ÷ý—þJÕîÿáÿ«Óà÷¤Fÿûüƒú°ù´ûÿ%ÄQ‰±=Bð|ýWúÒúçûýPý!üÀý¤ÿÐÿ<ÿäýfý/ÿßáÿ]þØýõý·ÿv‚²Çp_¹]HdÐþeü®ùæøûÛaç-»Ï.÷÷ÿ¬üžûnü-ühûÝûdý¾þ€ÿ3ÿ7þ:þhÿ/£ÿÁþþNþ¬ÿß”é¶Ó=áúFû…ÿ[ünùgø”ú›ºò±šd€)ÿ7ú(úüóüPû…ú¢ü"Ï!HýOüfþiÿyýý…ÿƒ 0&=K'gÄÿ×ýJûùˆøaûÀ” Ãþk.Ôþ·ûDú´ú”úÓúü:þðÿÓÿ(ÿKþ“ýþÉÿ„ÿ€ÿäþþæÿá™ ;›]¬ñÉþeü£úúJûÿÿ2€RyHã×ÿ¯üˆû"ú±ùDúPûNýþÿÏþSþÆþøþHÿMÿÌþçþÞþ.ÿ‘ÊOÚBaúsB®ýUû;ûÁû üêÿˆ2³5øój `œþåùùsûÌú™úUú1ûÿ_S!4þÊþ¿þåüLýÇýfÿ›§NÛ\hYÿÿ.çþý¢úŽú.ý’ÿ_ˆÇ€j  '"¨ýêûuûÒùÌøÜ÷£ùåýðÿªÛþÿýÖÿfÿ{þ®üÇûxþkÊãÿf·¼ÃMs$WÿrüûnüüÈû°þ–†É) Y WVŸü”újúgù{ùø£ùtý(ÿþÿ4þþmÿ:ÿ5ÿ†ýuývÿ è€a¼À-÷Ôqÿ.>þ³üxü[üŽûìû$ÿïâ¼^-ù  ¨ðûÑømùQúòøàõÄö ûŒÿ$ÿ&þøþ»ð¿þ¢ý‰þÇ‚-°â•(ª#rÜÿýÇüyý)ýIûêúÿP(:hY™ ¡(*ý»ùèù¸ùé÷çõƒö×újþ‹ÿ)ÿ·þÚÿ DAÿïý¨þMa`3/\90þGÿ8ýýÉý"ý¢û¨ûÛþ2bu µ T —’þÎúšùø£õ¨óüô£ùDý;þ•þÿ˜rbûÿòþ™ÿŸ8ÿçÿ`ó%ßcC%€Ûý+ücüý^üûÎü>< Ñ— } z «‰ý„ú ùí÷“ô¢ò™ôÎøÄü¾þjÿˆãÇHÁ÷ÿ beL¬;¨Í7’òºjþnýZýPýýÍüýÂÿ@3¢¬2 ˜ gmòÿ—ü?úQö~ôóô*øýùüÇýÝÿ¹š”rYý¨ð'§ÿM©'&ï´kÌþÍþ3þúý¼ýÉýJÿ|ß¼+O‘4÷ñþæüû&ùøå÷Aø!ùòù.ûýÃþ67Í;•šXÞUŠ毇Pÿ…þQþ»þÿzÿ˜ÿNÿ7ÿ´ÿi¬ÓÑ[lŠÔÉ>!ªþæü¾ûû~úïùjù‹ùAú4ûüèýTÿ¡ø{Š…2ÏE§$©´ ÿAþKþþþuþmþAþ þÃþ¿ÿ‘-ÿ$fLÍ~1#§ÿÂýãûiú%ùjø=øHø¶øeùÁú½ü~þCmMP+ ^•³¥ðÿùýZý_ý_ý¥ý7þŒþˆþ¸þXÿËÿ›E7T\N¿mH„ÿ«ýäû¬ú]ù“øˆø×ø_ù×ùûú˜üLþiUõi‹=ÒX Ã¯¾,zÿ{þ®ý]ý3ýý]ýåý)þqþ$ÿòÿ¶ÔSœ*D(†¾þýžûXúùÃøµù²ùfølùFü”ý•þz…Wø'ÕyÒp†S‘ˆÿÔþ}þUýžü˜üãügý þˆþ·þ3ÿȳ-õªÆfAÿý!üÁúªùÉøyøuø¡ø“ùôúÁü´þui“f› 5…ÆéþìüÿŠÿ ÿBþÐýPý ýVýPýÔý¡þ°þÙþPÿ!ú ¾Ë5=ç_&Øušþ÷ürû6úNùÂø×øù ù¬úü¯ýRÿ±ê»;u^øFbKSsŽÿýþþGþåýý¹üºüÎü~ýtþMÿ½ÿëÿ}j Ið••Z!àÿlþãü#û•ùÇøpø²øbùú<û}üÿý¿ÿs#p!iQŸû"'$2ÿ¼þ þþŸþjþïýýjýýÉýbþ(ÿÈÿ9¯€ˆ–¢Ó07¯Xÿ!þšüûòù:ùáøù¦ù¦úÌû=ýÙþZìLDã',ç^ž¼½¹äÿAÿÊþœþ—þxþgþ‰þNþÃý“ýªýèýtþQÿ+Ë“¡F€„çóÄÿRþÔü}ûDútù0ùKùÐùÄú÷ûYýÐþdï-©øÜ_»ò2sÿÑþjþ2þ2þnþÐþÿÿþ|ýqü—ürý™þ‘>NG†«suÕn’þ=ý;ü8û–úîù†ùîùÉú.üÚý_ÿäê¡»’&c€× S¾ÿÿþDþ"þDþVþ‚þÔþÔþlþý.ýÛý$ÿÏ”ˆ“,¡hAµ¶MÿÝý}üœû6ûþúñúàú!ûûû3ýÏþ†÷üt¸-3’ÛííTÿÏþjþþìýÓýýýpþäþKÿ/ÿXþý±ýåþ:“µì ‰‘“2àÿ;þÜüãûŸûÇûüPüdü¿üxý{þàÿB=ß/YŽ ¡iÍ;_ÄÿCÿçþ•þ-þæýÀýÂý!þ£þ.ÿ¢ÿßÿ5L‡Äàì¾?ûÿÝÿ»ÿ‚ÿKÿüþ§þ„þxþŒþ·þÓþùþ/ÿlÿÎÿQÑ4sy;úúû·C»ÿWÿXÿ§ÿ.Ñ;OEÄ¢v6Ëÿ(ÿwþÂý,ýÞüºü¹üéü1ý¤ý9þëþ­ÿs«óéĨÏ:Â=\ ~Î#Ÿ!§ÿÿ_þ’ýÒüCüü!üuüûüý"þÓþyÿ1ä†y®¸™Rû€vÌÿMÿÿªþfþ\þEþQþ}þµþÿUÿ°ÿdªÑìõçÝÄ©}B ÖÿªÿŠÿtÿlÿtÿ€ÿÿoÿ=ÿ,ÿ›ÿJãl˜+ƒ¾ÿÿ»þþ“þÃþÐþìþ ÿÿhÿÓÿWæ>y¢‰lLÀn£ÿ:ÿÛþ°þŒþ„þ¤þ¾þìþÿKÿÿôÿB™ó>HÀ˜^çÿ£ÿpÿFÿ!ÿ ÿÿþÿ"ÿDÿ\ÿ{ÿÿºÿãÿ =ThszzoaXC+õÿßÿ¿ÿµÿ§ÿ£ÿ¦ÿ­ÿ¾ÿÂÿÖÿßÿæÿõÿ (/+øÿèÿÖÿÄÿ´ÿŸÿ›ÿ–ÿ˜ÿ¤ÿºÿÆÿÒÿáÿíÿ÷ÿþÿ +(C  ÿÿñÿîÿëÿèÿêÿêÿñÿ÷ÿûÿ üÿùÿëÿèÿæÿáÿÝÿÓÿßÿÚÿÖÿÖÿÖÿÓÿËÿÉÿËÿÏÿÒÿÕÿÙÿÝÿçÿäÿáÿèÿèÿòÿ"!"'' òÿíÿãÿãÿäÿàÿàÿàÿ×ÿ×ÿÙÿÜÿãÿíÿùÿÿÿÿÿûÿôÿæÿàÿÚÿäÿõÿîÿÜÿæÿíÿðÿ  ÿÿøÿ÷ÿëÿèÿæÿÝÿÝÿÜÿãÿçÿßÿßÿàÿáÿæÿãÿæÿçÿèÿãÿêÿíÿòÿ÷ÿøÿþÿþÿ÷ÿñÿçÿÚÿÖÿÕÿÐÿÉÿÄÿÁÿÌÿÙÿÝÿäÿøÿ%,,$% ÷ÿôÿôÿíÿðÿèÿêÿêÿáÿæÿîÿûÿõÿòÿæÿíÿõÿãÿàÿÝÿÒÿÐÿÒÿÙÿæÿäÿäÿæÿîÿõÿ÷ÿòÿôÿùÿõÿñÿñÿíÿêÿàÿàÿðÿûÿ þÿøÿôÿòÿñÿîÿèÿêÿêÿèÿèÿêÿîÿòÿòÿùÿÿÿûÿòÿîÿàÿÆÿ£ÿœÿ£ÿ¿ÿôÿ.ILD,ðÿ ÿqÿUÿFÿUÿ~ÿ°ÿÝÿ"@P^r”´Ÿ”™_<ÿÿÏÿ§ÿyÿcÿ\ÿ_ÿiÿvÿ„ÿ•ÿ§ÿ±ÿ¿ÿÐÿ×ÿêÿÿÿ ùÿñÿçÿæÿçÿèÿõÿþÿ  üÿÿÿüÿõÿèÿÜÿÜÿãÿçÿðÿþÿûÿôÿëÿäÿàÿÙÿÖÿÕÿÕÿÙÿÖÿÕÿÓÿÕÿÕÿ×ÿÒÿ»ÿ·ÿÙÿíÿàÿîÿíÿñÿüÿüÿ "($ ÿÿùÿòÿñÿæÿçÿçÿàÿæÿêÿÝÿáÿõÿàÿ×ÿÓÿÁÿÒÿÓÿÕÿãÿÒÿ×ÿçÿíÿëÿäÿðÿíÿõÿûÿûÿøÿñÿþÿÿÿòÿêÿßÿáÿÚÿáÿæÿæÿôÿùÿþÿ  ÙÿÝÿñÿÕÿÝÿÕÿ»ÿÂÿÂÿÆÿÈÿÆÿËÿÉÿÕÿÒÿ×ÿÝÿßÿæÿçÿëÿñÿùÿøÿûÿëÿèÿûÿÒÿÚÿùÿãÿ *ßÿÿþ´þ³d¾†Z²þ ÿFÿQÿ þsÿÿ9ÿÅÿó´° œÕI bÿsÿaÿUÿµÿ¿ÿ¢ÿðÿ+ (ôÿèÿæÿ.ñÿ"çÿ]èÿûÿ<‹ÿÖÿwÿÒÿpÿoÿÎÿãÿáÿáÿÿÿ!ùÿôÿ´ÿçÿôÿÂÿáÿÙÿûÿ§ÿüÿøÿ©ÿ,Bñÿ@äÿæÿ­ÿ~ÿ ³ÿÆÿ;èÿêÿÎÿ ÿˆÿÿ¿ÿCÆÿÈÿ»ÿ2 øÿI^ÿ˜ÿG´ÿ¬ÿ8±ÿÈÿ¨ˆÿ·ÿFüþ$5ÿ´ÿ®ÿ|“ÿ[·ÿ¤ÿĘÿœÿ‡üÿªÿÅÿÿÎÿäÿƒòÿ×ÿçÿêÿÿãÿ8ÆÿÜÿ,ÅÿaÿŒÿô}ÿø„ÿ*8æÿ9êÿ{ÿíÿKÿP½ÿòÿîÿ?ÿƒÉÿ¬ÿk§ÿ‡ÿõÿ“ÿÒÿU@ÿ6%ÿXWãÿ}ÁÿoÿS2ºÿ\ÿ.³Nÿ£ÿí$Kÿ Áÿ25òþÕ_FÿDèÿQHÿ½ÿv_ÿ¬_ÿDÿ}Èÿ»þ¢kŽþe‡¾þrõÿRþÄÿ—þ“JÿYÿJŽþä 7þx ÿç[ÿv¦ÿ£ŸÿzþË,Áþu—Qÿ8®þJÿß&ýòÿº!ÿ&0ÿ!fqÿ"¸ÿFŒÿ Ÿÿäþßÿ}ÿ#~ÿÛ/"ÿk·þ ™þŸÿCh u%øÐþW·ÿý<‹ÿlÿj—þçw)ÿ³¤ÿ=D‹ÿ×ÿIÅÿtÿ9!’Òÿèÿëÿÿv:ÿÚÿ[uþ,»áý¾ Oþ·/ÿ§þu’þþÿdÿþ&Ý’þé ûþ¨þ¦þÄ.þK~þ~þ›dþìþ›þZ²Vþ>ã†þÒ*„þYÿ»¿þßÿÃ2þB¯ÿýn‚ÿMÿHSþªÿ8ý7 ¹ý  ¹þ6“ÿyFLýTË&ý˜Ìþ"ÿ×åüÁwÔüT ÉýêÈÿÃþãLþQôŠü|‚ýïþ<†úý4òý ?Õü|×7ü¢ýSý“QÿNþâ~þ™þWýËÿTcý†­ÿŽÿgåý¸ÿoœþfÖ,ÿfÿ­ÿH[ßý@LÃý"ÿ„pÿ£èÿuþ¦ÿÿþB·þ©ÿþ0µÿ%þX”dþ·þ™w_ýìéèþÏÑýbò ûŽ@Ðúc8œû¦ÜÿLþÝÿúê›÷™N¨øtÚÿæüJKý’ÿMÿÕØý*{ü¿zþ«þ¡ýŽU]üŒCèý²Eý6Žú ™°ûÀîý¯ý$¿úgþ¢Žû»ÿÌû#€¦ù¦jÉúšãÿý"¿ÿ%þ½Ρý(ÿ9ÿaÒüõÿ¤/û™‚­ú+=þëúPýšü–šþ.ÿ ›ý+ª’ýz³ÿWðûÊaúú_ÿþ¤*ü”sxüèÐýÑçþfýÜû˜—úùpþúrñÿ¸þbdýÍÙùÞAkû„ÿŸÿCèlúüO¾újÞý~ÿ7üÓ‰ný„þûüÙ|ýÉýÖ„ü(ïxü¾ôüJþ²ø7:0ùÅÕqùÓ§Dû›I)ÿ±Üüæ¶©üŽ’þÂ|€ûTÚqþÉþyÿ$mýÿŽ+ÿÜÿ±þþF]ýΦœ?ÿûûLÿýNýF‹ûû„âü¬ôûEüLû$ýªü*Uù8“ÿø—iÿ/ÿélüŒŸÿeüñšýÌþ ýYãGþªJÿí³ýfÿšüîÿÈûдþ)þÓ{üäÿáüušüÇDþêsþó¹þîÿ[—ûðÿÌiþ¾ÿñþ‡JþÔþ´ÿèÿ(ÿÖÿÕ¬×þéü¡iíúÃ%›üÁŒÿæýzûüÒsú T÷ø-|è÷ƒÄûóüïlûþ0ðýŽšþhüI?ÿ™ú_¨˜LT÷ rFøb‰ýéýpE÷ejõ]Ž¥ü±nûøþ= ”øcý&Löâ`¦öÿ;ý¬ú' q÷2cô¼Àöx ÂùŽö-ïóÄüé`î–Í Âðš Y¨òí )ý?ûü3ú›Þ õ xü ø,õ&R ‹ïúƒ®ò› {þºö® âümþT1øU³/ú–KþþœÁùH"Ýû·<ÿÁÍ8ü™¨íüJ/ýþñõþÜÿMtÿÈ@ÿv@þáÿ+&ÿÏ5ü+ú=$üïÎý†û)üÿûÍUÿñÿwðú¢¶Õúåü^ÿ.¼“ý! 3*/þ¤ÿ´þÁüo†þïþ¤¢ýèÿ8Ýÿjÿ}ÿhÿ,Ôý©ì~þ8ˆÿ3ÿuÚÿìþ¨9îý@[þ°ÿâ4ý,²wýS/ÿ ÿ»{ý;S þHÐÿþêÿ²ý|«þkÈþÐþѼýßèÿ]ý¯ÿSý/+ÿ;ýž"þ¨þ6úýÎÿø¸ý×ÿfþ¶Ãý¥ƒhý¶Óÿ6þ<lÿÿìÄÿ×ÿþîµÿõþd_ÌÿøÿpÿÖ=Mÿÿb'ýZý• âý[¦þÚý×üþóþ …þ9-†þ5lÿèÿ¥yÿùþ3ÿ2ÿ­©‡ÿÈû¾’ÿ™›Œþhÿrÿ?ÿ@ÿ™þ°ÿ\ÿâþŸ7ùÿbÝlÿÉÿ ÿwþz°ÿê4·2ëÿuŽÿñþÿNÿ3×þÌÿG¬ÿàÿÀiÿ“ÿ3$ÕÿÙþÆÿ*®ÿÆÿ&Êþ9Òñþzÿ}ÄÿËÿ o^‚ÿCÿB@ÿÿLBîÿÿ÷ÿºPÿ‹ÿæÿµÿÊ‚ÿ£þÑyäþ’ÿZ›yûÿùÿÂ[×þ»ÿÝ…ÿQÿ]MÕÿ¥CpÆÿ!¬ÿÌþ%ÿÔþûþ;•ÿ´ÿCSÈÿ—Âÿ„ÿãÿÿ ÿÿPÿ;NDÿyókOÄÿÿ°ÆÿÔþaÿÞþ ÿGËÿ%?Èôç XIœÿ<ÿëþóþÛþ¤þÚþpÿF¨€—#n"µÿáÿðÿèþÿ©ÿYÿ¦ÿºÿÒÿIhNU^ ûÿßÿÆÿŽÿ©ÿy òÿ=Záÿ^ÿôÿµÿÄÿÚÿÝÿÌÿ7ÿÿ©ÿçÿ T£‹fvC$ÏÿÐÿíÿ®ÿŠÿ³ÿºÿàÿüÿML“ÿ_ÿyÿ?ÿpÿÿmÿäÿB1rz3iøÿîÿáÿ©ÿüÿ!FGw3½ÿ5ùÿGÿWÿfÿ‚ÿêÿ“ÿYÿ<™%ðÿÜÿ‘ÿ_ÿßÿ6  ûÿÜÿ½ÿªÿÙÿ,F3(F¦ÿ¦ÿçÿ ùÿæÿÂÿ´ÿáÿÝÿÁÿûÿÆÿ›ÿ×ÿ= ¾ÿQ,3»ÿøÿÂÿÕÿäÿ·ÿªÿÝÿ³ÿFÿJÿŽÿŸÿ­ÿ¾ÿèÿbn<[dX6ûÿÆÿÌÿßÿ¾ÿÌÿÏÿÅÿàÿÜÿ@ùÿ   Éÿ•ÿ­ÿÖÿÁÿäÿ9]fIÿÿ×ÿªÿÙÿ'÷ÿàÿøÿòÿôÿªÿµÿäÿäÿÖÿÕÿÎÿaÿÿ2ÿCÿ•ÿ¾ÿàÿ"%.B;.[T$BUD< õÿüÿîÿßÿþÿ+áÿ»ÿÒÿ»ÿÅÿÕÿÄÿÆÿàÿòÿÿÿõÿ¸ÿÉÿ¿ÿ·ÿÒÿ®ÿÄÿ3 "6"(5+ñÿÒÿ ÿˆÿ§ÿ®ÿ®ÿîÿùÿ×ÿûÿôÿþÿ*ñÿèÿÉÿÙÿ´ÿ™ÿÐÿëÿñÿ/D2ùÿòÿëÿÚÿàÿßÿäÿõÿòÿñÿÕÿ´ÿ¾ÿªÿ¦ÿ§ÿ•ÿT òÿ õÿòÿüÿ×ÿùÿùÿÜÿßÿùÿ 33$ßÿ·ÿºÿÕÿêÿÕÿèÿ,(èÿÂÿºÿÁÿÒÿÂÿÆÿÏÿèÿüÿ "(  ðÿÖÿ±ÿ½ÿÅÿ®ÿ¦ÿ±ÿÅÿßÿñÿæÿ .'þÿòÿäÿ×ÿñÿüÿûÿ*Åÿ˜ÿ¾ÿÄÿÙÿ õÿüÿãÿ³ÿ9ÿÁÿÂÎÿûóþtÿMîþž<ÿ÷ßÿ”[ÿ›ÿ÷ÿñÿÏÿÝÿ.ÝÆÿ ôÿWÿG´ÿªÿíÿhÿÕÿíÿÌÿÉÿ×ÿ×ÿ÷ÿN%zlXòÿñÿ¸ÿÜÿÉÿµÿºÿœÿ€ÿÿœÿ˜ÿÉÿÏÿÏÿ êÿëÿPL;<<?  ôÿ×ÿÖÿÌÿñÿôÿ×ÿÏÿ´ÿ±ÿÁÿÁÿÅÿÉÿÖÿõÿþÿíÿëÿÜÿÕÿÙÿæÿ÷ÿûÿõÿùÿûÿ !93"îÿñÿðÿùÿäÿÉÿÁÿ»ÿµÿ¤ÿÿ¬ÿÈÿÐÿÓÿßÿàÿ/3=2FhW/üÿ Úÿ¤ÿ©ÿ¾ÿÕÿèÿ×ÿ×ÿàÿãÿñÿðÿôÿùÿáÿÒÿÎÿÕÿëÿ÷ÿôÿÿÿäÿÏÿÂÿÅÿ»ÿ½ÿÝÿäÿðÿûÿøÿ "!õÿÕÿºÿ³ÿÁÿËÿ»ÿ·ÿÌÿÝÿëÿøÿþÿ øÿõÿòÿûÿ÷ÿíÿôÿîÿîÿûÿîÿÝÿÙÿêÿñÿøÿÿÿèÿÅÿÏÿèÿøÿøÿôÿùÿîÿëÿêÿ÷ÿñÿàÿàÿæÿæÿÝÿÆÿ»ÿ½ÿÉÿÕÿæÿøÿôÿîÿßÿÚÿáÿîÿôÿøÿ÷ÿîÿèÿàÿÝÿäÿñÿ'$ùÿçÿÒÿ×ÿÜÿÜÿÓÿÆÿÂÿ¿ÿÈÿæÿüÿ",<,þÿñÿòÿõÿ÷ÿòÿäÿôÿþÿ×ÿÕÿãÿÚÿæÿõÿùÿôÿáÿ×ÿÐÿÌÿÓÿÕÿäÿñÿòÿæÿêÿûÿ üÿäÿËÿ¿ÿÌÿÜÿøÿ ÷ÿ÷ÿÿÿòÿäÿáÿãÿûÿäÿ»ÿ³ÿ¸ÿ¾ÿÌÿËÿÕÿäÿ!üÿûÿ'%%çÿÖÿÌÿÌÿÖÿàÿãÿçÿíÿîÿêÿçÿÝÿêÿ øÿîÿÝÿáÿæÿçÿ÷ÿþÿ ðÿêÿ×ÿÎÿÆÿÅÿÖÿßÿäÿãÿÜÿÝÿêÿñÿÿÿ  ÿÿôÿîÿðÿøÿøÿñÿáÿÙÿÕÿÓÿÚÿäÿôÿþÿ÷ÿæÿÏÿÂÿÆÿÖÿãÿßÿÜÿàÿäÿôÿÿÿ ÷ÿùÿ ÿÿòÿ÷ÿ ðÿÆÿÚÿêÿðÿùÿêÿãÿÜÿßÿÚÿßÿäÿçÿðÿæÿæÿàÿÜÿãÿîÿ ÿÿîÿÜÿÐÿÎÿÐÿÝÿçÿ÷ÿôÿ÷ÿñÿêÿðÿûÿ ûÿçÿÐÿÂÿ¸ÿ½ÿÉÿÝÿòÿøÿ $! øÿòÿßÿ×ÿÝÿáÿîÿøÿþÿîÿáÿ×ÿÒÿÎÿÜÿ×ÿÝÿ(ñÿÌÿÆÿÏÿáÿþÿ ñÿßÿÌÿÆÿÌÿßÿðÿÿÿ þÿçÿÉÿÄÿÈÿÚÿÿÿ /+ùÿÜÿÎÿÆÿÈÿÜÿôÿþÿÿÿøÿæÿÙÿÏÿÒÿçÿ 2. òÿÖÿÅÿ¾ÿÉÿÕÿæÿîÿêÿæÿàÿãÿäÿñÿ !øÿôÿõÿõÿ÷ÿëÿíÿáÿÝÿäÿèÿñÿûÿôÿñÿëÿäÿÜÿÓÿÕÿÕÿßÿáÿæÿíÿèÿîÿæÿäÿæÿëÿõÿûÿûÿñÿãÿ×ÿÎÿÎÿÓÿáÿÿÿ ôÿíÿêÿôÿùÿüÿðÿÝÿÕÿÜÿãÿíÿ "' ÷ÿäÿÝÿÕÿÜÿäÿíÿíÿêÿêÿÝÿÚÿÚÿäÿøÿ  ñÿÆÿÂÿòÿêÿãÿüÿñÿñÿîÿáÿßÿàÿàÿèÿðÿôÿðÿæÿÜÿÐÿÉÿÂÿÉÿËÿÕÿîÿûÿ $  ùÿäÿÙÿÉÿÅÿËÿÖÿàÿëÿðÿîÿñÿòÿôÿíÿíÿùÿùÿ÷ÿêÿÒÿÆÿºÿ±ÿ»ÿÒÿëÿøÿüÿ %2%ùÿùÿüÿîÿ÷ÿ ôÿÚÿÎÿÂÿ¾ÿÉÿÖÿßÿßÿßÿ×ÿÎÿÅÿËÿÐÿÖÿçÿõÿîÿêÿßÿ×ÿÚÿèÿôÿùÿüÿþÿùÿ÷ÿòÿûÿþÿòÿçÿÖÿÌÿÌÿÖÿÜÿèÿôÿîÿõÿÿÿ $,/"÷ÿæÿÚÿÒÿÕÿ×ÿÖÿ×ÿ×ÿÕÿÒÿÒÿÌÿÅÿÉÿÚÿûÿùÿñÿëÿÎÿÉÿÏÿÏÿáÿñÿ þÿûÿûÿøÿÿÿÿÿûÿòÿäÿçÿëÿ÷ÿ ôÿèÿãÿãÿáÿæÿçÿíÿñÿëÿæÿäÿàÿîÿøÿÿÿõÿçÿÖÿÅÿÁÿËÿÉÿÅÿÎÿÉÿÓÿÒÿÙÿçÿõÿ  " èÿëÿêÿæÿôÿíÿèÿêÿÜÿÖÿÏÿÉÿÆÿÂÿÎÿÖÿäÿðÿîÿëÿæÿçÿèÿñÿñÿëÿñÿôÿðÿäÿÜÿÙÿÒÿÕÿáÿîÿþÿ ûÿøÿ÷ÿûÿÿÿõÿíÿðÿôÿîÿôÿ'*'øÿøÿ÷ÿñÿèÿßÿÏÿÄÿÅÿÁÿ»ÿËÿÕÿçÿôÿëÿãÿÖÿÄÿÕÿðÿçÿðÿòÿçÿçÿáÿçÿèÿëÿûÿ÷ÿíÿçÿãÿçÿðÿøÿõÿòÿîÿêÿîÿèÿèÿôÿõÿ øÿèÿæÿäÿáÿäÿíÿòÿûÿþÿøÿøÿüÿ  ñÿãÿÉÿ»ÿ³ÿ³ÿºÿÆÿÒÿÙÿæÿëÿòÿôÿÿÿ øÿñÿ ßÿÙÿêÿÚÿßÿäÿ×ÿÚÿÚÿÙÿæÿàÿáÿáÿÜÿÜÿÝÿäÿîÿñÿ÷ÿøÿøÿèÿáÿàÿÚÿÚÿÖÿÜÿëÿêÿòÿùÿ  üÿîÿäÿÜÿÚÿäÿíÿäÿèÿõÿ!( õÿíÿÝÿÕÿËÿÎÿÉÿÌÿÎÿÈÿÈÿÌÿÉÿÏÿÝÿæÿñÿëÿÒÿÜÿùÿîÿãÿëÿæÿèÿ÷ÿüÿþÿþÿÿÿþÿûÿøÿøÿòÿèÿçÿñÿùÿûÿ ÿÿüÿ÷ÿëÿçÿçÿßÿÚÿÚÿ×ÿÜÿßÿäÿçÿôÿþÿ ÿÿòÿòÿôÿêÿãÿÖÿÕÿÏÿÌÿÏÿÓÿÜÿãÿñÿüÿÿÿ  þÿ÷ÿûÿãÿ×ÿÝÿ×ÿÙÿäÿáÿäÿãÿÙÿ×ÿÚÿÜÿÙÿÝÿßÿÝÿàÿáÿáÿàÿáÿîÿòÿøÿ ÿÿõÿðÿíÿõÿûÿùÿÿÿûÿÿÿþÿ þÿñÿãÿÜÿÙÿÖÿãÿæÿêÿîÿûÿþÿøÿðÿêÿáÿÕÿÌÿÏÿÈÿÎÿÎÿÉÿËÿÌÿÎÿÒÿÝÿêÿêÿêÿíÿÖÿÎÿùÿ ñÿ þÿþÿøÿ÷ÿüÿÿÿ ûÿñÿôÿîÿñÿùÿùÿûÿûÿÿÿÿÿõÿòÿêÿèÿãÿÝÿÝÿÜÿßÿáÿÚÿäÿèÿãÿèÿñÿÿÿ þÿõÿêÿÚÿÈÿÂÿÄÿÅÿÏÿÏÿÕÿæÿêÿÿÿüÿÿÿ  ÿÿ ñÿÝÿáÿÚÿÚÿæÿäÿçÿàÿàÿàÿÝÿãÿäÿàÿÝÿàÿæÿèÿêÿðÿðÿñÿðÿôÿùÿþÿûÿûÿ÷ÿñÿèÿáÿíÿêÿæÿëÿðÿðÿûÿþÿþÿÿÿþÿùÿ÷ÿþÿùÿòÿñÿèÿßÿÚÿÜÿãÿãÿíÿõÿ  ûÿîÿàÿÜÿÒÿÒÿ×ÿÖÿÖÿÏÿÐÿÐÿËÿÚÿæÿçÿãÿ×ÿÖÿîÿòÿêÿíÿëÿèÿîÿíÿðÿ÷ÿôÿ÷ÿûÿôÿùÿÿÿ ÿÿÿÿûÿôÿõÿõÿûÿþÿþÿÿÿüÿûÿõÿòÿîÿêÿãÿÜÿÙÿÓÿÒÿÖÿÜÿ×ÿÝÿàÿÝÿçÿñÿùÿ ùÿþÿõÿæÿÜÿÎÿÎÿËÿÄÿÆÿËÿÖÿçÿðÿþÿÿÿ  ûÿùÿñÿîÿûÿùÿäÿÝÿêÿèÿèÿñÿ÷ÿñÿêÿæÿæÿäÿáÿäÿêÿèÿíÿôÿñÿ÷ÿ÷ÿðÿõÿôÿòÿûÿùÿÿÿ üÿôÿîÿèÿäÿÜÿÕÿÖÿÕÿ×ÿàÿëÿðÿñÿôÿõÿ÷ÿõÿõÿüÿûÿüÿþÿûÿüÿ÷ÿñÿíÿèÿáÿÙÿÙÿÙÿÚÿäÿèÿôÿüÿùÿ÷ÿíÿëÿçÿáÿàÿßÿÜÿ×ÿÐÿÒÿÏÿÏÿÕÿÙÿÝÿÝÿãÿäÿêÿðÿèÿêÿîÿðÿçÿæÿøÿ þÿÿÿôÿòÿøÿùÿùÿ  þÿøÿñÿëÿêÿèÿêÿçÿàÿÜÿÕÿÓÿÉÿÌÿÐÿÖÿÝÿäÿëÿëÿ÷ÿõÿùÿøÿòÿíÿçÿÝÿÝÿÜÿ×ÿÐÿÕÿÚÿÜÿäÿçÿæÿíÿòÿøÿûÿøÿüÿ " ûÿñÿãÿÖÿÏÿËÿÉÿÌÿÏÿ×ÿÕÿ×ÿàÿèÿñÿ÷ÿüÿ  ÿÿÿÿùÿüÿòÿòÿôÿæÿäÿèÿæÿÙÿÕÿÝÿõÿðÿÚÿÎÿÒÿ×ÿÓÿÕÿÚÿàÿãÿãÿèÿîÿòÿðÿëÿîÿîÿîÿêÿñÿêÿëÿëÿíÿôÿõÿøÿÿÿûÿøÿüÿþÿþÿþÿøÿûÿ÷ÿøÿùÿùÿòÿíÿíÿçÿçÿêÿíÿîÿíÿðÿõÿõÿòÿîÿòÿòÿõÿùÿõÿõÿòÿñÿøÿûÿþÿüÿõÿøÿõÿðÿêÿÜÿßÿÜÿÜÿÝÿßÿßÿßÿÜÿÙÿ×ÿÒÿÓÿÕÿÒÿÕÿ×ÿÚÿàÿçÿèÿíÿôÿôÿùÿÿÿ"$$$ ÷ÿñÿëÿäÿæÿÜÿãÿãÿßÿÚÿ×ÿÒÿÎÿÒÿÖÿÕÿÕÿÎÿÕÿÐÿÓÿÕÿÙÿÙÿáÿäÿçÿêÿèÿðÿ÷ÿüÿüÿ  ùÿîÿÝÿÕÿÝÿêÿÿÿ üÿùÿõÿôÿ÷ÿõÿðÿíÿêÿëÿîÿîÿëÿèÿíÿëÿòÿòÿðÿðÿñÿêÿèÿçÿëÿêÿíÿëÿëÿîÿíÿíÿòÿðÿðÿðÿîÿðÿîÿðÿíÿèÿèÿíÿîÿíÿíÿíÿðÿíÿðÿòÿøÿ÷ÿûÿþÿùÿõÿõÿòÿñÿðÿíÿîÿèÿçÿáÿèÿíÿíÿòÿñÿñÿîÿòÿøÿøÿôÿñÿîÿòÿñÿîÿîÿîÿðÿñÿîÿîÿíÿêÿíÿîÿîÿðÿòÿôÿñÿôÿùÿÿÿüÿüÿûÿøÿøÿ÷ÿõÿôÿôÿðÿêÿêÿêÿãÿæÿëÿèÿêÿèÿçÿíÿëÿæÿãÿèÿñÿîÿèÿëÿñÿõÿõÿøÿ÷ÿôÿôÿñÿîÿëÿñÿðÿîÿôÿûÿøÿùÿÿÿ÷ÿôÿðÿîÿîÿêÿëÿëÿçÿëÿðÿëÿðÿôÿõÿòÿðÿòÿòÿòÿòÿõÿñÿòÿòÿõÿôÿîÿíÿòÿùÿõÿõÿ÷ÿõÿðÿîÿëÿáÿäÿäÿäÿëÿêÿôÿôÿõÿñÿðÿ÷ÿçÿãÿçÿêÿîÿíÿîÿîÿðÿðÿôÿ÷ÿòÿõÿñÿòÿëÿîÿíÿðÿðÿçÿíÿíÿîÿðÿëÿíÿëÿæÿèÿçÿëÿðÿðÿðÿôÿíÿêÿîÿîÿðÿ÷ÿøÿõÿòÿõÿøÿùÿùÿøÿòÿòÿøÿùÿõÿñÿòÿðÿèÿæÿçÿæÿêÿêÿèÿíÿíÿíÿæÿäÿäÿëÿðÿòÿíÿíÿîÿîÿðÿîÿæÿäÿÝÿäÿíÿôÿôÿòÿñÿëÿðÿôÿ÷ÿõÿûÿøÿùÿûÿøÿøÿùÿÿÿþÿûÿÿÿùÿûÿüÿüÿùÿûÿ÷ÿøÿôÿëÿëÿäÿäÿèÿçÿãÿãÿáÿàÿäÿáÿÝÿæÿÝÿáÿäÿàÿæÿëÿêÿðÿñÿòÿîÿôÿíÿôÿôÿðÿñÿðÿðÿðÿôÿñÿôÿîÿîÿñÿíÿîÿðÿòÿñÿðÿðÿðÿòÿðÿõÿüÿøÿøÿ÷ÿøÿñÿôÿõÿôÿ÷ÿõÿøÿõÿòÿõÿîÿðÿòÿòÿ÷ÿûÿøÿñÿðÿòÿðÿîÿñÿáÿàÿíÿñÿôÿðÿñÿîÿòÿôÿôÿðÿèÿçÿíÿîÿêÿëÿíÿðÿðÿòÿðÿèÿèÿíÿèÿèÿíÿëÿèÿçÿäÿçÿçÿæÿîÿôÿêÿçÿæÿçÿèÿèÿêÿëÿíÿðÿñÿôÿôÿòÿøÿôÿõÿûÿÿÿÿÿüÿüÿûÿùÿùÿõÿøÿõÿûÿüÿþÿøÿûÿôÿòÿòÿòÿôÿôÿùÿðÿëÿêÿêÿçÿäÿèÿáÿàÿßÿßÿÝÿáÿãÿàÿÜÿÜÿÝÿÝÿàÿæÿÝÿãÿêÿîÿõÿðÿòÿòÿõÿøÿøÿôÿõÿèÿçÿôÿøÿùÿ÷ÿûÿ÷ÿøÿüÿùÿûÿõÿõÿüÿûÿûÿøÿüÿøÿüÿøÿòÿøÿ÷ÿôÿõÿñÿêÿëÿíÿêÿñÿêÿîÿñÿðÿîÿôÿòÿëÿíÿðÿíÿëÿêÿëÿçÿíÿæÿëÿíÿëÿíÿðÿñÿîÿ÷ÿøÿ÷ÿøÿòÿíÿñÿðÿðÿðÿôÿõÿôÿõÿõÿùÿíÿîÿòÿäÿäÿæÿäÿáÿáÿèÿçÿæÿãÿäÿáÿäÿèÿëÿíÿëÿðÿèÿèÿîÿðÿíÿôÿ÷ÿôÿòÿôÿùÿ÷ÿ÷ÿûÿûÿ÷ÿùÿûÿûÿüÿëÿçÿôÿûÿ ÿÿþÿüÿùÿøÿûÿõÿôÿçÿæÿèÿßÿàÿãÿÝÿÜÿßÿÚÿÖÿÚÿÚÿÜÿÜÿßÿàÿÚÿàÿäÿêÿîÿòÿ÷ÿñÿ÷ÿøÿõÿþÿþÿûÿþÿþÿÿÿüÿùÿôÿôÿôÿðÿñÿõÿõÿøÿùÿûÿ÷ÿôÿôÿîÿíÿæÿæÿêÿêÿèÿëÿñÿôÿòÿîÿðÿñÿæÿæÿäÿæÿæÿçÿäÿçÿòÿôÿòÿîÿèÿòÿ÷ÿûÿùÿ÷ÿùÿøÿòÿõÿøÿñÿøÿùÿûÿþÿûÿûÿøÿñÿñÿðÿßÿÝÿçÿñÿòÿîÿêÿîÿêÿèÿãÿáÿàÿßÿáÿÜÿáÿçÿáÿßÿäÿæÿêÿçÿçÿðÿîÿðÿñÿñÿòÿõÿùÿûÿüÿøÿüÿûÿøÿüÿùÿÿÿÿÿ÷ÿõÿôÿòÿñÿ÷ÿøÿùÿûÿõÿôÿôÿíÿñÿðÿðÿôÿîÿíÿíÿîÿñÿíÿèÿíÿçÿäÿæÿæÿæÿäÿæÿêÿëÿçÿíÿðÿðÿ÷ÿ÷ÿôÿùÿõÿùÿôÿñÿîÿèÿðÿðÿôÿíÿîÿðÿçÿèÿêÿçÿëÿçÿèÿèÿíÿñÿæÿíÿòÿíÿðÿîÿæÿäÿðÿüÿ  ùÿõÿíÿãÿáÿßÿãÿæÿæÿæÿêÿñÿðÿñÿíÿîÿíÿôÿñÿëÿëÿèÿêÿíÿíÿñÿðÿðÿèÿîÿçÿèÿèÿæÿëÿêÿêÿîÿðÿíÿêÿêÿíÿèÿíÿðÿíÿñÿðÿôÿüÿ÷ÿíÿôÿñÿíÿðÿðÿñÿòÿôÿôÿõÿøÿ÷ÿ÷ÿôÿõÿõÿøÿ÷ÿûÿÿÿÿÿüÿøÿøÿøÿ÷ÿøÿùÿõÿíÿíÿîÿæÿëÿèÿèÿæÿÝÿàÿÜÿáÿæÿäÿæÿçÿêÿæÿÝÿÝÿÜÿÓÿÓÿßÿäÿíÿðÿ÷ÿòÿôÿûÿõÿøÿùÿûÿûÿþÿûÿùÿûÿõÿòÿòÿøÿøÿùÿ÷ÿõÿõÿñÿñÿòÿôÿòÿîÿðÿ÷ÿôÿôÿòÿðÿêÿçÿæÿáÿãÿæÿãÿçÿêÿíÿîÿèÿëÿèÿíÿôÿñÿñÿðÿñÿòÿðÿñÿðÿèÿíÿêÿæÿèÿíÿîÿíÿñÿõÿûÿþÿþÿüÿùÿüÿøÿøÿõÿñÿõÿ÷ÿùÿ÷ÿüÿøÿÿÿþÿôÿ÷ÿñÿëÿáÿÚÿàÿàÿÝÿáÿäÿßÿàÿÝÿßÿßÿÜÿÜÿÖÿÓÿÕÿßÿãÿçÿëÿòÿôÿõÿðÿñÿôÿòÿñÿñÿ÷ÿþÿþÿûÿüÿþÿ  ùÿ÷ÿçÿàÿçÿõÿÿÿÿÿ÷ÿñÿôÿñÿëÿãÿÝÿÙÿÙÿáÿßÿßÿæÿäÿãÿáÿßÿæÿèÿêÿèÿëÿîÿñÿîÿæÿçÿêÿîÿëÿèÿæÿÝÿäÿæÿæÿèÿêÿðÿîÿêÿñÿêÿèÿðÿòÿõÿüÿûÿûÿûÿøÿõÿòÿíÿëÿèÿçÿäÿäÿêÿäÿÚÿÚÿæÿæÿêÿàÿáÿæÿîÿôÿõÿ÷ÿðÿëÿíÿðÿðÿîÿôÿôÿøÿùÿñÿðÿðÿíÿëÿêÿêÿêÿçÿàÿãÿÝÿàÿßÿßÿãÿçÿîÿñÿðÿôÿôÿøÿþÿûÿÿÿûÿøÿøÿøÿ÷ÿñÿôÿõÿûÿ÷ÿîÿíÿêÿðÿòÿõÿþÿþÿøÿðÿëÿêÿíÿèÿèÿðÿðÿôÿùÿøÿûÿøÿðÿèÿãÿÝÿÜÿÜÿÚÿ×ÿÚÿÕÿ×ÿÙÿÝÿàÿáÿàÿàÿäÿèÿèÿíÿðÿîÿôÿþÿÿÿ÷ÿçÿëÿñÿòÿñÿòÿîÿðÿôÿõÿûÿþÿùÿõÿùÿîÿõÿûÿþÿþÿûÿõÿòÿôÿòÿòÿðÿîÿîÿãÿÚÿÚÿÖÿÒÿÚÿÝÿàÿáÿðÿûÿ  ùÿñÿòÿêÿçÿæÿæÿàÿÚÿÕÿÓÿÏÿÉÿÈÿÌÿÈÿÐÿÙÿßÿäÿáÿèÿãÿàÿæÿðÿùÿòÿõÿõÿðÿîÿãÿäÿèÿòÿõÿñÿüÿõÿôÿûÿþÿ ÿÿùÿùÿôÿòÿðÿêÿëÿîÿíÿêÿõÿÿÿþÿùÿñÿîÿèÿæÿáÿÚÿ×ÿÙÿÜÿÙÿßÿæÿèÿîÿíÿëÿíÿîÿðÿëÿëÿñÿòÿîÿèÿçÿáÿÚÿÕÿÓÿÒÿÕÿÙÿßÿäÿíÿõÿøÿüÿ  üÿûÿõÿòÿäÿæÿñÿèÿàÿàÿäÿàÿäÿîÿêÿêÿñÿñÿèÿçÿæÿçÿðÿðÿîÿêÿëÿæÿãÿçÿêÿíÿðÿ÷ÿüÿ ùÿùÿòÿðÿñÿêÿæÿãÿçÿçÿêÿãÿÝÿçÿíÿòÿñÿôÿñÿæÿèÿãÿäÿæÿæÿãÿàÿÚÿÖÿÚÿßÿãÿçÿçÿëÿòÿûÿÿÿ÷ÿðÿîÿíÿêÿêÿëÿñÿîÿêÿõÿøÿõÿùÿþÿüÿûÿùÿûÿùÿ÷ÿøÿíÿêÿèÿæÿãÿßÿãÿçÿèÿëÿëÿèÿãÿäÿæÿçÿëÿæÿæÿçÿáÿáÿÚÿÙÿÚÿßÿëÿ÷ÿûÿüÿþÿùÿøÿ÷ÿñÿðÿðÿêÿëÿèÿèÿðÿêÿëÿèÿæÿêÿðÿ÷ÿõÿþÿüÿ÷ÿðÿëÿëÿëÿèÿêÿêÿíÿîÿðÿôÿòÿôÿüÿþÿüÿøÿûÿûÿõÿùÿøÿôÿòÿíÿèÿçÿäÿ÷ÿûÿãÿßÿêÿêÿëÿñÿîÿèÿëÿæÿãÿçÿßÿãÿãÿãÿáÿäÿäÿçÿèÿëÿçÿòÿùÿûÿðÿíÿëÿäÿßÿÚÿÜÿæÿçÿêÿøÿûÿ  üÿÿÿùÿõÿîÿäÿáÿÖÿÕÿÚÿÚÿêÿõÿøÿùÿ ùÿþÿ÷ÿðÿõÿñÿîÿèÿäÿèÿçÿêÿçÿäÿçÿÚÿÙÿÝÿÜÿòÿçÿÖÿðÿ÷ÿãÿäÿæÿáÿãÿÙÿãÿôÿùÿÿÿþÿüÿûÿñÿëÿÝÿàÿêÿíÿîÿíÿûÿòÿæÿõÿíÿèÿèÿçÿçÿáÿÝÿàÿíÿûÿùÿÿÿøÿûÿ  ùÿæÿÜÿÝÿÖÿÈÿÏÿÖÿÖÿÜÿäÿôÿôÿëÿîÿèÿíÿêÿçÿèÿëÿîÿñÿñÿøÿùÿüÿõÿêÿêÿðÿèÿëÿùÿêÿáÿðÿëÿõÿôÿëÿæÿäÿíÿäÿáÿçÿÚÿÚÿãÿßÿÚÿßÿ÷ÿ üÿüÿÿÿôÿëÿîÿðÿðÿíÿøÿûÿùÿþÿ òÿôÿêÿãÿÖÿÜÿçÿðÿîÿíÿôÿ üÿõÿíÿçÿèÿäÿÝÿÕÿÝÿçÿ×ÿÓÿÖÿÙÿÝÿ×ÿßÿãÿîÿþÿíÿàÿôÿøÿõÿæÿÝÿãÿãÿèÿñÿ÷ÿøÿÿÿÿÿþÿÿÿøÿ÷ÿîÿëÿæÿàÿÝÿæÿñÿ÷ÿùÿþÿþÿ þÿõÿñÿîÿäÿãÿèÿäÿàÿáÿäÿñÿ÷ÿëÿüÿ ùÿûÿòÿîÿ÷ÿëÿçÿãÿàÿÜÿáÿðÿèÿîÿîÿêÿçÿàÿáÿôÿøÿøÿþÿ òÿ÷ÿ÷ÿÿÿêÿèÿîÿàÿãÿãÿÙÿßÿèÿ×ÿßÿîÿßÿäÿàÿäÿèÿÝÿàÿèÿëÿòÿëÿçÿîÿ÷ÿøÿõÿûÿòÿíÿñÿ÷ÿþÿ þÿûÿ÷ÿêÿðÿûÿðÿëÿíÿðÿðÿæÿãÿäÿçÿÿÿþÿñÿíÿãÿÝÿÝÿÚÿÜÿÚÿãÿÒÿÈÿÚÿÓÿÂÿÉÿÐÿßÿÖÿ±ÿ£ÿ!ÏËpãÿäÿºÿlÿPÿ ÿ»ÿ©ÿàÿÓÿèÿ.@L.+<' Ýÿæÿäÿ½ÿøÿîÿÉÿÚÿµÿèÿûÿûÿçÿçÿÝÿ]äÿÉÿ­ÿÖÿ­ÿ™ÿÈÿêÿ,ßÿ ûÿ}ÿCÿd (1‡Åÿ 3…ÿ©ÿJÿÖþÿ@ÿ3ÿ:ÿÏÿ'·î·»„S°Œÿ¦ÿŠÿvÿCÿ…ÿwÿmÿ÷ÿäÿ1}B+.ºÿœÿµÿ‡ÿ‹ÿ“ÿÆÿäÿMJ€v? 8žZãÿÿ™ÿßÿwÿtÿîÿÕÿ¾ÿùÿÓÿ·ÿ*Ýÿ‘ÿ˜ÿ¤ÿmÿòýûÙùý¶å·;(Ô ˜+Nþüû ùyöpôôÉõú÷äú ýÑþ½a@ ¨   .õx¶þMûúoúYúìù–úÌû~ýðÿµ#–“Ds5ýþ(þýüóûÒû+üÒüþ5ÿûhwˆF܇îÿÏþ¤þqþ"þ{þ¤þ¡þ"ÿ‡ÿ~þ9ùŽòö=) j ” ° Oq÷ (¡ûSöZòßò­ï“êüéî óøêÿãÇ †hr ‘ŒmÿÂùîôdòñãñöÆùûÂýÞÍ Ñ ¡ ¸ ¨`ý°ù÷¥õnö½÷§÷ùü«þ8{¸*&—*«îÿlþhýúûæúØûpýsþJÿðÿªšÿ¼“rÖÿ[ùdî.ì÷ûÿ ¸ ¸ Å | h@˜ÎÿPö&ôìí–íÍêxâ âóéÙôzúm ú ®- V ‹þ/ûÐòÇëiëÂî»ñ·÷ìüxþÐ „¶J{ ž’ˆý÷ËòÁïïïôùàúýJ; S÷ë°ÉIüýhûsù%ùxùzùÈúý%ΛT„¥q¶„…ùÂuüƒðåãlêWI Ï Þ “' ¿ùéóÚò”ì_ë\ãQÚåßí\øØüeu ¦Ðò# ‹‹ê Ìüÿ§ø[ìHèpë î ò2÷@úÞüé¸Áó ´ ]ÃwúðóŸðUîiðzõøbù¯ýD— q ñ™>Ùv»ÿý.úWú³ú§ù¤ùhû³üœþÓŠZúÆ!tYÀýŒýeú ï†è¥÷˜ [   Ý 9Xu·öRô7î íbìäÙæðööÄúüþ6Ð …gD º( ®Åqü–ø2önôßõ²øYúïùÃûxýªþð¢ùoˆ9© ›ÿ¤þiþVþ¤ýÃýùý×þ ÿ³ýaüHüÍýÊþ ¨Ûqõ(ÿ=þáþ.Ÿ«DJžé<¦6Üÿ¿ÿ$ ÿücùÞù ý‹ÿTÏ~$ &,ÇþýjýïýGßÿ«ýÕûúzù²ø“øõù2üóþŽ8\ÿèÿýû ØP|MMÆ”]Uàzÿaý’û ú?úúäù(ú+ûÔünþ€ÿ@ ¯ ßL@Ô5$—´Áÿøþ9þ‚ýSýÂýšþàÿîHIs«¶À¨¹â[ûßö–øtþW¬á + Ü8Rþlÿã°×ìýRù'÷›öíö"øÃùbûNýjþÉý—ýšþ§ÿW@ô ){ŠoÕ¦œŸÓÿþ>ü^ûŠû¹û´ûTûrúìù·úü¶ýÅÿÅÜÿœ¢á¤÷«¥¬ÿÿÿlÿ¬ÿ"' ÿWÿXÿ¸ÿ?³hå½ÿaúmõÿø{ö`— :»üÿóýl»tHªhú/õ´ô#öå÷ñù’ú­úÿûPüÁû™ý‘RKÞ±°­ h3#kϪÿüþBþWýóüjüaû7úù«øêùüýýäÿÀ ûþ¾þNÿb¼Â%ùì‘ûÿ5Q™ÿÿ»þ%ÿ÷ÿ‹#Ù#*xüÁöæöÒÿ8œîC g\4ñþÆuüBH&üöûô¢ö6øäùäù\ø~øÂùfú‘ü¯×•¾OþP¹A ’x0@ÿ%ÿ¢ÿäþŠý?ü±ú®ù`ù,ùRúöü¼þ€ÿîÿ=ÿYþ‚þÿFã½t¬Ò êÿr㩵ÿvÿŠÿfHŸ‡yÿ8ûäõ¥÷ó;] ¾Ò5?•Ñ–•<üaö°õL÷žøøù°ùNøDø*ùáùüB¥¨¹@Äéë½ks1}ÿÄÿpvÿ(þ7ýLû ùjù°ùû\ýÿýÂýÆþ ÿüýßý£þäÿU¨«?ÀŸ!WþÁãÿqÿlÿ•ÿ˜sÂÿoü÷öÄýà›`H7qo»/ÿÛøWö÷føëùôùcø¡÷HøùNûNÿÊfŽø^sºîÑB*È‘5QÿÌÿÓÿ5ÿ:þ„üÏú,úYúLûÒüqý‰ýjþ ÿ²þ,þòýšþSÒ#ÇWäæ5OsŠ`ç@ÄÿÐÿhÊõÿý,øðõrû&ƒárLj_¢"/5¯[S·üUø7÷–÷îø\ú úâøžøëøú*ý MŠG?•ª•[ œ øh–ÿ~ÿ¬ÿcÿÞþ{ýÔû ûëúFû(ü5ýìýLþŸþŽþ)þ0þ•þ[ÿÎð2À¦u‚?à‡sþùø¬öwûk ¤¢íî_tÄ ¬¤þƒújø¡÷øXù<úKú ú«ùrú4ýEIõdÄÏfJç–ÈÌÿÿJþGþqþ¤ýSüûüúÅþŠŒýÃûìý]ý‚ÿëþÛùöýVí—%3>jÅÿÈÿÿÿ8þ.öÃí–ï8ýäÝ(á p V‹Zyýo÷€÷õø4ó§êœäâþæñh÷ÆúiÿÜ Í?éCÖ0 w_vùäïíëGë íoòpøÈûÌÿ/ü ùÕÎ €2¨”ûö$ò«òôHôxö¯û¨Ó¶‚¿Aÿwý·þêÿH÷]âkØèç+@'çqv*†±ùVÚÐJØöå«çzÚkÜ8éÒú{úDZ?? ˜Õ—òûëqí/ïÔï_ïïöÖTÚ°j ” ÷2ÿ‚ò5èšèsïjõUøû¼þ§´ ã w€¿ÿ ù®õÌõÁ÷¬÷¹÷Aý Aôػ۪ è:h9Ð#ñ Oˆ"5¡üÕ ÀÝÍüãÒõ í¶ãpñІ&aª M­Ðl žüöé.æÒñBý|*ýÇü` õ"ìØÒùùøéýàúEî»é`ï üÆ¿ ¾[^f5ýúüãü ú¥÷Õörû@j"o —â×É1äõ!ýCp,®>ýF`0"/é1Ã\ÄÜôþÿTå~ã{ýCy%>!L ûû 'k ÀôãìPú B#Ü€—Üë´ Æþ›õ£ùÈþ•õíÛíò–ÿÙ  //šHî½ú÷tù»úøµ÷ü¹YSè LçxÈJà}$ÁF,'Rjý™,6³ªäÁ”ÉÄâ ðþ‰ä=á!¼|&AN ÔüxZ0íõ_ñ+è&ò…ÿFUùzÿ g‰¤*Em0ý\úûØóKï¤ó®ôú]hø¯¦ ŸIþ_ùOøwøÖöø¨ýàÁÐÑÞ÷zÒ!Ñ6½E£-ŸÊ#ûP/Î&ÀëèÆ¢É3é“òB÷OãÚ±F$…"tòƯ(ë^ðó¶ø'üóvò9ÿC×µ NVZýÞóøûÀö(÷±ðlò°ãJ³ZhŸ‹þI÷;øèøªùúÓýûþGÒ-èúÉÐå¯/òDc \ >ø9öûÑ~ÆžäNöì àÓ,ñí#à úðÓ ët!’(ì/ì}ýXôfæåJü0žü1Õ]Éóûï"ùwþîê²ê‚ò³i Ûûgö¥3ÚC=þ²ü¦þmþS÷öùaýÆ‘÷©ØoÍMÿÜB/“~º,,-éçdžä^úÁå£Ò1ÏÏß“%Výø:&1+~2ücó ˜ `çïßžßðî„_iö%û˜I!ýÑ ú«þ_ï´ì»ï’ö¹ý=ôÍï' à ·›› ï˜ö·öbþ2ûµøÏñÚÁÍôÝ6_(£ô^$Œ6Þ/Ÿ/”󇨧þ@ÿ Òê¾ÓË»áˆq Iç„ü0&ê,Ã!Ò/eâ§qßèQðþè8èêçòmžŠ ! ²ŸS öFÿmùiîÏë­ñéñ¸îÜò¦ùð0¯w¯ :2åþ´þàÿøù{ï%á˜Î"ߪÅ'ðîQ2DÍ4´3“Öë¬L –ÔLºÝÏhá æîsâýòtµá'Î&¥Yýÿ·þFâÇÙ„åæë<íÖóØüÙü=8Ëò#Y:ý¹ûŽ÷&òvçmèôõtô§øþ| º ^ ì} ª ÿ6õ†äÐÔ¥á&9­é–ö?P.˜)vîÿV­Õ{ÎÐåäú×àAã¬ó)\þ÷¼"ÿ"h!aú˜|óRó4ò¥ãŽâEîôõŒü¤] XÆ Ð á%xHçþìû<öûï©ì$ñÛó#ò9örüškõ‘Œä Äý™æGÚêúûùèå5&û3‡f % u ïËØï9ðDÕÛ“í»êËò¨öpö£ MõfÝ$à²4iÕÿócïºñ¶ëÅé&óPúß÷þu²B ý Á ‡blú-ø ôÏðTñ>òSó÷ßüÆÿ,‡ Y ró9á“þX"ö÷Åä *p, 3Jn YQìmã5ýòéxÎçä%ù+æóè‚÷Áú¾?Vý~#—® æòíÿ½üöSéßìø ó±êùvYÿÓþu×   ÷ ²þþÊHù•ñYóüôQôzóZöÕü­Ì? ûðKæá iëmî5O“ÿt"4VY¼å“ôøZÜRÐtôÒö•ܶë‹ùøú† ö 1e{'ƒ ‘ 1åôï´ù÷çtë“ÿvûCñöýˆ-H¦Ñ ‚ þ»O " xùû ÿ¶öÄñªô=øÀ÷)úhü“S üpïð+% ÞT /6ÑM ï*·8¿b賈øÖÖæáäþ÷æmÙNøW÷dóˆöñõM_ „‘"»C wP˜ FÿÐÿ ûIòOîôúDïàñìýšüÌú“üðq]ýV $ d*÷ßHùÕ÷ùútúÛô6ø~ýBýuýÏþ)4ûZç,ó,9"Ú$"0(÷/9)›a¾ÿòúÍ ôáÛÎìgààÉÛõûòì1ñýùŠ=”Q ߥ|¨" X] 6 Óù·÷ôùîøùó°ìûörúòð õòÿs†ýߌO ÏúΆþÒ ÿ|ø9ùÃþ¢ûOøŠüþfþÔü”ð\êѦäGô<5 äóó'¦G d »Ç‰ýÂó2çöø.ü!Øßçêûmîóä¡ò£sú¸ýŒ B ‘Þ « ·# Hc¾ Yù‰ýaû=ðqôºúô$ñzõÿxü¸ø ·Çû« Êæ'Ólü,þ(ÿ þôûîúvÿÿý¼ý(üoê°íI¤ üÛF]6q ó<#` Mõ' ŽôÒöèíY÷€ö¯ä?æ/ñäÇéàç™ 0üûÑ?M ¢Î¸ Ö¶ ÿ \[þ™ù~nûªóHô$úÿûøðh÷ëþÜüÐúûüÌ¢ ÿt,Ò‚…Ä}yý‚ÿ’˜üCü¶ýßFýóü ȸþJõ·ïEÚzñNëá°û’úão*þùHÚÿ÷ÄðöZøçùIæï&÷fóh÷žRú{b U  R hz  u4ê•+ú™ùÆ÷C÷‹öðøûýö)ýeüuýÁ.× JÆ‹ÿj@ÿ¦ÿŽ×ùü£þ}ëþmþáÿ¢ª˜ÿ#þ¹ªˆ%ÿrAþ‘÷|ö<ó_õÉý¨ Mÿ±òu<®ÿžü§þ=Hý†ótù*ý–ø¿øpøüýþÿ(Óþ*Â©Ž€TK¿ú^ðxAþ@ÿ}þ~þþÁûzþ±ý6þ<ÿAýÿþÿWZ*þÒ‡ÿòþjÿ 5ÿÕÿ.›ÿ/ôÑ?Ža@bÿ±ÿ8‡ÿ'üÿà{þ¥ý¡þäÿ8xÜ"ÿa{Þ¹U%ÿýÆýl"þCÿâIÓjÒ¢ÿ?eþþ:þKþØûü³üÑû—ý¯ý½ý‚þÆÿ×ý‡!žÅv°r…BEËT»ÿÜÿ¨þ ÿáþÌþÿþþbÿ“ÿ:ÿ3Äÿ ÿvÿÈÿbõÿ6·ÿDÿ(ÿ/ÿûÿ%ÿ ÿäÿßÿD¬ÿ¬ÿPIwðÿBêfÉÿðÿ/£ÿ?ÿÿÉÿ2ËÿÍþèÿÕb%áÿùÿžOóvÿŽÿdÒÿôÿ;/ÿ§ÿ}þ›ü®þ]Öÿ9¡O8ž\—?Þ·þnþÅþþý×ýòýæý´þXþ9ÿäÿÖÿ^Ÿ<ˆZåéʽùÿw=îÈÿÿÏÿˆ@±ÿ] £_5ÿÏÿèÿÙþ!ÿ’ÿ!ÿtþ þpþÿßÿbÿÿ6³†aNMSÅ(UF´„ÿÿÀ€ÿ&ÿ9?ÿKÿJÿtÿ\ÿ®þMÿónÖÿëþ˜ÿFjòÿ=þ®ÿ«bÿ3ÿwPƒ²þ+ÿHþ5ÿÐþ¼ü†üWÿ†½ÿAþ¬|gƒ`‚‘9ÿÇýõýwþü°ü,þÑþˆþÿjþáþèÿ k&š›qß…~ä‚MþšþÝýÕýGþ"ÿÿMÿlˆY¢ßÿ¸þhÿˆþªýÓý!þŒÿîÿãÿMÿÆÿ2ΊCQÎÿ‘a!„ÿ¦ÿˆÿRÿGÿ•ÿÒÿÞýµýõÿeþbþ3ÿ!ÿ\íöü€ÿÅÈÿZÖÿ)þq*Ž`dâŸÿßý&üOü´Hlüþ-æÕ¡þï»§Þ»þQþÿÐÿÇýGù ûõý7þ˜úÍùÿŠ×ýŽÿ¾ÿP‘ña:ï$ê•Þ!àÿÿÒD˜ÿÍüþ%ÿfýÓýý{þ þèý"ÿsþ2J¦ÿ;eÿ$¡ºÿE›‰øÌ…ºÛpºÿ“ÿBþêþâýBý¶ý¬ý þ—ý2þ(ÿ"ÿ ÿîÿÈô{§O >äÿÐühöú2‡ÿlùôúž& ì<ÌÊ üDÿÐËÿœùúxü|ø%õàôøaúš÷ÂøUý5v­þv,QÒ*ç × ýø!ÙÃþÄü³úvû²û¦ùùúyüü û¨ýÿ½ÿîþ¢þ;]giŒŠÿ šü;ülþjý9ú4û÷ü‡üü¢ü¨þ*n6”J;®øòkþHüuøJûçÿƒýJùëýŽ„½ÿc Ä“ñäÞü“ücü!ú¸õ.ö'øøÙö÷vüóý„ü²þÎG%áG ëoP™ òŸÿi\+¡ýÚýRüQúÅøTùú“øùßúIühüÐüpÿp]ãï0õ*F,ÂÊÇ™ªÿ‘rÿý²û­þuý½úÓúuü÷ûÕúÄü~ýDþÿßÿ›É;Ô9X3×v[üPûHý±ÿoüÁú‰å’ÿÃÄQÓbÖG«þ¹üðûBûB÷v÷Føðø¤÷·÷Íü³ü‚üCÿé>]ufýˆoîöúr´{ôÿÿÿZü–úaúôú¹ùüø­úCû‘û üZýÍþüþ¦ÿ¥Ò¯™›ö×[&oýŽ­S.ÖÿÐüÎý0þ½ûZûkü1üÿûdüLý>þÝþ?ÿŽSr®Ê:Þ%cK?=ÿ¥üHüòþ“þüHÿ/ÇH»=~y€§ÿÀý0üdüCúæ÷‚ùêù÷øOù¾û7ý ý!ÿô Ú£ZLd UÉ„É Wÿ¥ý‚ü$ü†û,ûÓúûÏûüTü3ý@þ’þÙþäÿ À1 O)*öì¿ïubß„\ÿfWÌý]ýDþ>ý üÐüZýýOýþýþjÿŒÿ°¶Ñ0/p~gSÒÆÿÏ÷üAü¿ý¾ÿ…þZý¼«k5ÙÕ5—V›Ìý4ü¯üÊû×ø¥ørúlú7ù£ú”ý×ýßý.mÕÞ¢@úd+ñ”WàÄ=1Qÿ4ý9üuüÿûÉú¦ú¥ûÙûwû-ü’ý#þ%þ%ÿœðó÷ÞŠ:-;Ä]<·þ¾™Úýþyÿ{þÕü¯ýÆþ«ýcý~þYÿ.ÿöþN+»Î×*aÇF‰ÙwËÿFÿ—þyý$ý¤ýÿªÿ»þ„ìWgù°±…à»þýÿûƒûùHø;ù(ù ùªù'üFýÆýô=Þ8¾ÕÔêKƒêjŽ¿Úÿâþþ!üÒú™úKú±ù±ù˜úTûÈûºüþQÿòÿØ"ÑjùÑ Æ¢Ü‹2%ÞþþþÝý þåýyý>þÑþEþþ‡ÿžQÕí½èus5ئ£ÿ½ÿçÿþ¿ýÿ ý£úÀü²þþRÿâo¾N¼3­¾„}Âÿ?üWûøùÎ÷ëô¦õéöFö ÷,ù†üþMÿæŠù™“ $ õ & ןӦºÿôü‹úŒùýøL÷»ö²÷Ôøxùœú ýMÿ’ðçw©¾Báq—lpÿÞýýü8ûûÕú,û>üýiþˆÿPÏÑëKá„jìÐÿ•ÿ7ÿ6þÔýâýïý/þKþÍþDÿJþjýÏþÙÿ¯ü·ùùþ”ä‰þ  €Ñù ç XM³ÿ ýHùjóýñÂô‘òüï}ò%ù5û[úSÀ K • eí ¬ º jó{þýoûJ÷“óÐôÅõÈôcõføaüGþDšñ5  e h h k)˜ÿ•ûèøŠ÷¡öÏõÉõö_ù ýªý(`7>Yõ ) °†4€ÿËüúù£ùÝø—øúýÖþÿVÕì´q§ý–ÿü˜÷ýnÿik ×6 1 nfûøö©ò:î“ïðòžòãôÎúµ“ &rž « ç ÅRüYú€öÇógó½óõ÷ëùÆü¾Í¡{™ ¾ Î&*Úÿ÷üÛù«÷’öö°õkö*ùlümþ¥ÑªÀ†  7ô•uû%ù€÷~õ*öLøŒøXûjûŸ;‚dÚD^ùþ úù7þ=ùáësð»! pþî·5¯ ¯ ¼ìøýçMçëðHéØâšè[òüaÒ ÷j "þΑ ûW÷Øó2ñ‰ïNëRî öûüÞýàÿ' }s¾ ø y S}oûSö$÷äôMñœð­ô°ùüKÿ_29 Ï þ b ¯ |oÊþ¢úy÷@õöòró•õ£ùÐüêþåt o /üý¯âýûtùªùGù4ùÔû¬üú÷Çõ¡ª÷ ܇º dþ÷cõ|óñç@Ý«ãíîñgôbù‡›{…ƒGßÿЫùªöëò9ð‘ìÎë½òÝú‹½#Ø‚Ñç } Bûƒû`ó6ðñ5ñòHôsùÿ ¾p  ’ 6 "ý þÿ‡÷žò ñÿñ{÷üýnýçè ê SÙÖú—÷dû¿þ ú÷:ú¸ÿkÿVþ®ÿ™ÿ³ÿí åþ /eY Ð áùÇñ¿îuîèæëÚð{÷Šýì‹ã]%´5 YÖþåøzóñ:ó2ôRõÌøQÿ€±€ V I H ˆ ![þ,û¿øsõ£ógó$õ–øWüÖþ2ÿW‹‡Ðà Êq¡þ ÷Èð…ï…ó øÎø~ú Äd7¢ $‰·(Kýâþaýcúûþs”o¸úéð i Ǹ ãa®ÒHøAÿ¡ý.ð5æÏäµêÿñÙõ½òÍó@ñ ¯,åÓÄdÇýëúðûšøZò¾ïIò÷Ûüÿ£ÿá Z — 뺮¬8ýåösùÎú¥öµøåýÌÿÂÿ²4éßD2ÿŒýøÿ|ÞýWýzþÒüéýZûÿ°ÿ}—*÷Ýu½šþûCûðÕju’þ6øEñYý ø¦ÿ! } Ö ŸØû¨ù^gþ’õàô ÷ÊøßûÔüÜúÒûÆëÔëûô>Ï(®š¹àÿ’ýûþLþ¥ý&þ;ýýþÏþÊþÿ[ÿãÿrkÁ»žÂd3äÿáÿºÿíÿßÿqÿ[ÿÿÿ ÿïþåþóþŠÿùÿ"D^Ä ʈf¸ÿMÿçþÖþîþÿ_ÿñÿ¢ãì LO턳ÿ~ÿMÿ$ÿõþòþ&ÿaÿ¿ÿ.o»âÅ8òÿ£ÿMÿýþèþÿÿ:ÿXÿzÿ×ÿ3B*2Lkœ¨|nLûÿÎÿ¸ÿ~ÿ%ÿäþÿKÿŠÿµÿÈÿ÷ÿM¯°Î÷ð»Uñÿ±ÿbÿÿîþåþÿþNÿ ÿÜÿ,ƒÄδ¯†=æÿŒÿMÿ=ÿDÿ)ÿÿ/ÿwÿŸÿÂÿêÿûÿ Tr]dއT!øÿ÷ÿêÿÄÿ±ÿÎÿûÿÿÿ(+*ñÿÉÿ˜ÿzÿmÿ5ÿ ÿ$ÿQÿŠÿÆÿûÿ,_ˆ‡†„s<üÿÒÿ¸ÿ’ÿ„ÿyÿaÿoÿ£ÿÒÿëÿ,k—„ond,ñÿÕÿ½ÿ¤ÿ•ÿ’ÿ ÿ°ÿÆÿñÿ ,CD*ñÿÏÿªÿ›ÿ‡ÿ}ÿsÿaÿ[ÿhÿˆÿ¤ÿÌÿ Ck‹—uL$ ðÿÝÿ·ÿµÿÈÿÒÿÏÿÆÿÒÿñÿ(+5;1" ÷ÿíÿÕÿ±ÿŒÿ~ÿzÿ…ÿœÿ ÿ³ÿÐÿôÿ,;</(òÿèÿãÿÝÿÜÿÕÿÓÿ×ÿßÿîÿ÷ÿþÿüÿ  ôÿèÿáÿÜÿÓÿÌÿÐÿÉÿÅÿÄÿÉÿËÿËÿÁÿ¿ÿÄÿÎÿÕÿÐÿÝÿèÿçÿÝÿ×ÿÙÿßÿðÿþÿ *9DB=3,÷ÿáÿÏÿËÿÌÿÜÿÙÿ×ÿùÿ îÿæÿÜÿÙÿÎÿÂÿÁÿÂÿÉÿÎÿ×ÿßÿçÿòÿÿÿ ùÿîÿæÿßÿÒÿÈÿ·ÿ®ÿ¾ÿ½ÿÎÿÚÿêÿùÿ%$ ùÿçÿ×ÿÖÿÚÿÏÿÏÿÝÿæÿøÿþÿûÿÿÿüÿþÿôÿôÿñÿðÿíÿèÿÝÿÙÿÐÿÒÿÝÿçÿüÿ ÿÿÿÿðÿçÿîÿÜÿÖÿÐÿÂÿÈÿÐÿËÿÒÿÜÿæÿñÿøÿ  ðÿôÿíÿçÿèÿãÿãÿÙÿßÿçÿßÿíÿûÿõÿêÿèÿîÿçÿàÿÙÿÙÿàÿ×ÿÜÿÕÿÙÿîÿõÿùÿôÿøÿüÿùÿüÿþÿûÿíÿçÿãÿßÿÙÿÜÿçÿèÿôÿùÿ "ÿÿÿÿòÿðÿîÿíÿíÿæÿêÿàÿæÿæÿäÿòÿõÿûÿþÿüÿ÷ÿñÿðÿäÿäÿàÿÐÿÈÿÌÿÉÿÈÿÈÿÐÿ×ÿáÿêÿøÿþÿÿÿ ÿÿùÿÿÿÿÿõÿðÿäÿÚÿÓÿ×ÿÖÿèÿñÿ ÷ÿíÿÂÿ@ÿ¸þ}!½ývÿ%úîÿSìþC´þ«üùÓþÿú\ÿ97ú$úŒºú“þ¥[üˆ°Rýlm¦£þ ÿ:ÿÏûÃû»þ&}“üüÿ“ùÿùÿNÿIÂÿÏßõýôÑ>ÇÎüŽäÿþ@…ýÿâPýS¿ÿVþÖÂþ×þ©†7ëÿs<_þ¬ÿÚþ—Û*þ’ÿÝlÿPÿçCÿ´ÂÎý¬GnZ{ýkÆÿ †-þ]t’þ3ÿðÿÿ~þ¾þáÿ6<ÿÛ±FÿàþYý%¡þäþ~ÿ_Èþ[ñÿ3·Hý6ÿÿ,ÿ ÿ¾ßÿ[´ÿ–ÿÀXuİ8œÿ¿ÿ ÿdþÏÿ?ÿ—þyhèþf§ÿˆÿèùÿoÿÂòþÆþŒGÿ£ÿQ†Ãþ bÿÛý½„ËÿþÿÚý´þXÿ}ÿÓÿ$‚€ÿ ÿZ‘®ýþþÙ+ÿ¦Âþëþ)­þƒ·ÿ¿ýb(bÿþ§ÿ<ÿËÿªÿ’ÿÙÿ8*þýfýGxÝ$½†'¨ý°ÿJÿ±ÿ¶,ßÿDýe?_þËeÿ&»þ{ý»þ¢ÿþ4þ?ÿ¶EÆÿzþYþ©©h[ÿ=ÿlþ_ÿ*|û»ýÁ²-×ÿ• *©ÿ4ý.B4þ²ý\ÿäÿîýtÿЇÿ3þ|’àÿ RÿŽÿþýücü”;cþ§ÿ©ÿ4ýxþ«|LþéÙB:ÿ·þ"þæÿL%þjãCÿoÿÊþüýüÿ?3þóþhû%#¿Dþ-ýÈþsÿòþ‚ýÈü`þ§ÿëþ‚ÿÜîò‚@Gÿlÿæü#üü4ü>þ.ÿáÿSZvÿŸÛ^ÿU„ëlˆþ6ÿÝþ(ÿ|ý¹ûlþøjÿ‘s˜ÿ1þõþ›ÿÛý×ý;^-Žÿ!ÿ±ôÿ¿ÿZÿ ýÄÿŽ´ÿcÿKÿÁ³ÿ_ûâû6M„ÿýQþ¼©ù“ü,ûŸ¶ý‚ÿuFUš„—þ¹ÛþHþ“@›FýòþQþZýKýÔýÚþNJÿ»þ"þ]ýÉÿølþuþŸ‹f2ÿòÿ»ƒyÿìþÀ÷Èùþ\þTI€ÿ0ÿŽÿo ]]ýÿùÿÐý½üyý‚ý9ÿU#:ÿš·ÿöþ7þÿzÿ™ÿZýûˆÿÍ›ÿ|Ù¥´ÿ€ÿ·þí&k]¯¯ýOü½ÿþüzû›üLþgõý.û*¨Ùþwÿa¦Mýÿcx¹þ˜ÿ· $ïý–ý5ÉMÿ9üHÿ¨ß©ÿ5û'ü}ùÿ²ûæü¤äÿ´þËú+û´O>Þ¤GöùL™þ=ø/úœ³  2æé “©ú[û,þ‹úËö¼÷úÜûýêüìüµÿ~«»[‚ˆþ–þñþYÿñ(4бçs¹²¢;þØü3þ>ýû$üNþÌÿB…ÿ—§¬þþÊþõû2ú*ýáÿÿúDû& 3ý[ê ö; ;ü©÷EðŽ…’õ»ð Nø­å0ï£ûfõºò;öüäÂh ýÆþ Ä ÿwÝÿæÿÀ<iB$@¡~þþÔýýÿ þvüÿÿîÉø9ûVÒkœ,K–¯ðúÝøyýWÿôüîúÙúÕÿ ® 2žöaèYäÝû‰È"ýÖ½$$þ½ÿmøÊü£ù+çBÞžë÷¥÷áôŠø×ñ Ñ ¢ª{P ^¸þMûÁüµýÿf‘„ˆÍ…ý8üYü/ú_úÑýÍþbÿ±ÿ‰õ¤ÿàÑdÿýóûTûfúûðý5­ÿ€fß+«þCàÍcÿh>Ç;ç?7+?©å2×-ôïSÜ¿´æþ Š;ñGû<ëÊz ù•‚µî½ð§ú û‰þîýü‚êœ Ÿ› ÷ ²þ¼ü$ü›òMõµø¡øþZ,Ìwžÿtþ6ÿ5üíûÆüHý ‘±þÛüâýýš¸ÍXëÅʱޑ)DìþRõ»2W8­Kù$Óï߀ÿÆîô¿Qȵø"pôöB ˆ!ˆ(¹¥ý?öZ”ÚíFãÉít÷]ý±dïˆÛ ®bôÅø·ô•ñeñúä¿ü)ÿÜ … šÞ‚™ÿ¯üáøósôÍùîù.ú¾þÆbúÎä±Üò0ýGðKåcã!çvõ¤2ã%;.Ï)_põdáÙØ×VÕÐߨ¯ó¹ ¾=#D(4Êù9ôuîÒâ3àoëíöšýr´D7ÎHÛdü‰ñÚéëJï2ñIõBûa Ü$6…–ýõÂîÿë—í~ð öPü•Ó[ж ‡ Á 0;ý[ü6ùöïöåÚèéórðó7…(…L"–"æ Òõ8ãwÚïÛêÚÓç×´ñQ [é£ã(j"@‘×ø¯óŒí\á?Ýþç1ö­þZ$`Tà’@ ÊÌù×î“ççç¥ëŽïcõÆþ%ƒ3Ú½ Ö|rýô¹ò)ôwðÙñ¼øü¸þ‡l Ñ  ¼ |#</þå÷kóyñÔï´î íòª"Ôy2)8 Šƒöåò”ìÔÝ'Ó«ÕÀã†òúãS!VJ~øûXñµê·êínîIó’ý÷³ }¡jû Öˆÿúêô$ñ!ðúñ´ôÞ÷¿ü½Vã ø À ž ¡ Â%ùžü”\øHï€ò>ü§ýüŸþÌ  Ž€¼W†þûú%ûì÷óÇíšêð»ù«p3# '!] F‡ûóí•áKÞÅßãéòý{ªDa .tþ§÷åñšïëï7òîõ’úcÿ¼! « _ GÿP2þdû4ùË÷L÷Û÷!ù*ûKý¬ÿ)Y‚,ÂïÿAþ#wÿÑüãü¹þdûòüŒþ·þÓþ ÿo‰I5ÿDÔ#þÞüÒûZøO÷Ýûž»Ê4€ ¨®¤Ÿú ö&ô•ñlïˆï“òùõUúŽþÄæÛ% × & Ó¥âGÌþFü•úú,úºúXû&ý/ÿÕ,X³!……qaÝÿRþ3ý¤üPüÿûMüUýnþfÿG7ßôÊžFC›ýÿ‘ÿÌþÏþSÿ“ýYÿª7ÿþüÿ¾iÿ?ÿ„ôÿ$ÿ5¢rÈ ÿ‹ÿÉþ ÿ2fþ—þþSƒöa£ÿ/™ÿŸþŒþþ\þnþäþÿ!ÿ“ÿàÿÏÿ¦ÿðÿ,GÙHYCET(È[ÌÿzÿÿÃþåþÿ/ÿPÿ›ÿGe¦ËÀ˜Nðÿwÿ.ÿ ÿàþ¼þÐþùþ7ÿ¢ÿ €Î7Eÿ©Säÿ¢ÿsÿUÿCÿ7ÿMÿpÿŸÿÕÿ /bŠk<ñÿ¬ÿiÿTÿTÿ\ÿvÿ¢ÿëÿ'=MM5ùÿèÿÚÿÄÿÌÿ×ÿËÿÒÿäÿûÿøÿëÿæÿàÿÅÿ½ÿÙÿ(8JT[= àÿ§ÿ„ÿjÿFÿ[ÿˆÿ¾ÿôÿ T^ZGçÿÝÿÎÿ¸ÿÎÿÝÿíÿêÿÓÿÐÿÅÿºÿÈÿãÿíÿþÿ.6@1,"øÿÙÿ¬ÿ{ÿYÿMÿYÿsÿ§ÿæÿW’³ÒÊ•[Èÿ™ÿhÿGÿAÿPÿvÿŸÿÏÿ5Fin_F çÿ½ÿ±ÿªÿ¤ÿ¬ÿ±ÿ½ÿÒÿÕÿæÿôÿ '2,3.áÿÒÿ¸ÿ ÿ™ÿ ÿœÿÿ¤ÿÓÿòÿ.@?;;!ûÿÐÿÎÿÒÿßÿíÿíÿòÿ÷ÿþÿÿÿòÿñÿàÿÏÿ½ÿµÿÖÿÎÿÄÿÓÿÕÿÖÿàÿûÿ('+!ÿÿøÿíÿçÿçÿàÿäÿäÿáÿüÿ ñÿäÿÝÿÙÿßÿëÿ÷ÿ ÷ÿÜÿêÿþÿœÿ6ÿÿ }ÿÿ.ÿ'´Z.à“ÿÎÿÖÿÿ ÿGÿ:ÿ.ÿÿñÿ÷ÿMfak†^BS'øÿþÿþÿÈÿ°ÿäÿîÿêÿþÿûÿäÿçÿîÿèÿêÿòÿñÿèÿæÿãÿÕÿÆÿÁÿ³ÿ±ÿ½ÿ¾ÿºÿÅÿÖÿÖÿæÿþÿ 8G!!(üÿîÿõÿèÿèÿÜÿÎÿÕÿáÿèÿàÿêÿûÿîÿßÿæÿøÿ ãÿèÿíÿäÿÚÿ÷ÿÜÿ¿ÿîÿßÿÒÿÝÿÕÿèÿÚÿíÿþÿîÿ ùÿõÿëÿëÿ×ÿíÿæÿçÿøÿûÿ ÷ÿêÿßÿ×ÿÕÿÕÿÂÿ»ÿ¾ÿÙÿÚÿàÿþÿ ûÿîÿòÿøÿüÿîÿÜÿàÿãÿàÿàÿÌÿ¿ÿ¾ÿÐÿçÿäÿñÿûÿ,.$ÿÿîÿèÿÕÿÆÿËÿÒÿàÿùÿÿÿ ôÿëÿíÿëÿôÿøÿãÿÏÿñÿ øÿ÷ÿñÿèÿÝÿÚÿÙÿÓÿÐÿÖÿÝÿÕÿÐÿÕÿÜÿáÿíÿûÿüÿ ÿÿîÿñÿûÿêÿÏÿÖÿÖÿÕÿ×ÿÖÿÝÿ÷ÿÿÿõÿÿÿ ( ßÿËÿáÿüÿøÿãÿ×ÿÐÿ×ÿòÿüÿ ôÿçÿñÿ÷ÿþÿÿÿ÷ÿíÿèÿáÿàÿæÿçÿçÿÚÿÌÿãÿñÿáÿ×ÿÕÿÓÿÙÿçÿøÿ  þÿ÷ÿçÿäÿÖÿÉÿÐÿËÿÏÿÎÿÕÿæÿôÿÿÿøÿðÿçÿãÿçÿäÿáÿÝÿãÿæÿêÿôÿõÿøÿùÿôÿùÿÿÿûÿùÿòÿçÿàÿàÿäÿçÿêÿøÿÿÿ ùÿþÿøÿõÿùÿ÷ÿøÿüÿðÿáÿßÿãÿêÿòÿêÿòÿõÿñÿñÿòÿôÿôÿòÿëÿðÿôÿõÿòÿðÿëÿèÿñÿãÿáÿçÿëÿêÿðÿñÿòÿëÿçÿáÿáÿàÿÜÿ×ÿÚÿäÿëÿðÿçÿêÿêÿçÿñÿñÿõÿüÿøÿüÿüÿõÿíÿçÿ×ÿÎÿÒÿÝÿèÿñÿîÿ ÿÿøÿùÿñÿñÿçÿçÿçÿèÿõÿøÿîÿêÿáÿèÿ÷ÿõÿëÿõÿîÿæÿãÿßÿæÿæÿêÿèÿêÿëÿçÿäÿßÿæÿçÿîÿõÿîÿñÿíÿæÿäÿæÿêÿÿÿäÿôÿþÿáÿãÿêÿàÿàÿèÿèÿÜÿßÿãÿäÿîÿþÿûÿøÿüÿþÿòÿßÿÒÿÙÿßÿÚÿÖÿßÿêÿëÿòÿûÿûÿøÿêÿÌÿzÿýþºÿN‹þ©ú > ùþÏÿ6þÀè}þö!ÿÎ8ú$öPYFö–ÿø¼šÇó;f°úð  ù¹Òú¹xþŸúýöÊm¿ùbJÿnûnSîÿ‰Ùû˜cýÿþ¥ýó°¿ý9þýq¡üý¸ýüAhŠø¢dÎÿþ•ûïþOâþÖûËB[üuý®ÿ÷ý9%þPüˆ¬ýèšëù êý3èüü¢Øý»Åû·M ÿ,üýÁ,ÿãÿžˆûªû¸ÿºùü{»ûÈÿÌ–Gû ƒ¡ü‹|üýS!ûCHµú¤´ÿVýÖ‹þ%TbäýøÿÒYýHAþþ<>ü,þÈüzþ¤ÿ ý#àÿÎÿ Êýv®ÿµÿS¦ÿêñûQ.ý]=ý±ý“XÿZlÂý5‡î(Îÿ8ñÿPÿëþÜÿB½¨þ!¦‰ý]ÕJþhxþXÿ&ŽþTÈþþLÒÿªÿŠÿKpÿ†RÿšaÿÃþ[ÿÝþáþ„=ÿFEþ¥ýY;ðÿ¢þÛxvÿž"ÿ‚ÿ²þsÿþÿšþ'èþŽÿzÿœÿ=ÿ‘ÿÝÿÀaÐþ¾þ¢~ÿ`þÅÿ—;^ÿ–ÿ"Ùÿüþ¦ÿÿÑqÿs­ÿ9˜ÿòÿÎÿa(­ÿwæÿ p¤ÿÿ­ÿ6iÿøÿ€ÿ®ÿ©§ÿôÿÄÿM¸ÿíÿËÿœÿÜÿôÿ+Éÿðÿ+ ( ëÿÁÿÙÿòÿÏÿêÿãÿÿŠÿòÿðÿªÿüÿÈÿûÿ=¿ÿôÿäÿX×ÿ*I¸ÿàÿàÿ©ÿ'Æÿ×ÿôÿ­ÿ÷ÿèÿùÿêÿ(øÿ¾ÿ Ùÿÿÿ ¾ÿñÿòÿæÿüÿÚÿëÿßÿäÿçÿëÿÓÿÕÿèÿßÿÝÿãÿ òÿÙÿÎÿ»ÿÙÿÄÿæÿáÿãÿÿÿÎÿøÿñÿÒÿáÿÐÿçÿõÿñÿîÿôÿñÿîÿ ùÿþÿûÿÕÿÝÿßÿðÿñÿ àÿòÿùÿêÿæÿËÿëÿÉÿºÿ ùÿ%ôÿ ðÿæÿüÿèÿëÿæÿþÿûÿàÿ×ÿàÿÁÿÈÿÚÿíÿ÷ÿõÿõÿñÿùÿñÿêÿêÿòÿûÿõÿ òÿðÿ òÿõÿÿÿÖÿêÿ÷ÿçÿõÿäÿÐÿÖÿÝÿÚÿÎÿÏÿÎÿáÿàÿÐÿæÿËÿËÿòÿßÿäÿôÿ îÿÜÿêÿÜÿÒÿñÿñÿ÷ÿþÿñÿíÿßÿßÿæÿãÿîÿôÿÿÿùÿæÿãÿàÿäÿÙÿÕÿßÿÒÿÓÿÎÿÄÿÕÿÓÿËÿÚÿËÿÙÿÿÿäÿùÿüÿÒÿ×ÿèÿûÿÿÿñÿðÿõÿÿÿþÿûÿ øÿ þÿûÿùÿñÿßÿçÿÖÿÈÿæÿæÿôÿõÿ÷ÿ÷ÿôÿãÿèÿñÿðÿ÷ÿçÿßÿèÿíÿæÿëÿüÿôÿõÿòÿ  üÿôÿùÿçÿÕÿÎÿÌÿÏÿËÿÖÿãÿæÿçÿøÿþÿõÿÿÿ ÷ÿôÿòÿêÿàÿßÿäÿèÿÜÿÚÿèÿàÿèÿðÿáÿàÿÜÿáÿêÿêÿíÿßÿäÿáÿáÿáÿßÿèÿãÿëÿôÿüÿûÿãÿðÿùÿùÿ ùÿþÿÿÿûÿ ÿÿÿÿþÿðÿêÿíÿÜÿÓÿÐÿ×ÿæÿáÿêÿîÿðÿùÿøÿøÿùÿîÿæÿäÿãÿÙÿÙÿæÿÙÿÐÿÏÿÅÿÌÿÙÿÓÿÜÿèÿòÿøÿõÿêÿçÿ üÿñÿãÿêÿíÿîÿôÿùÿþÿþÿùÿÿÿ þÿûÿôÿðÿëÿôÿðÿðÿñÿîÿôÿëÿîÿ÷ÿ÷ÿøÿôÿûÿ÷ÿ÷ÿþÿ÷ÿòÿôÿðÿäÿêÿêÿäÿëÿèÿëÿøÿüÿôÿæÿðÿøÿðÿæÿáÿàÿÚÿÙÿÜÿêÿõÿþÿÿÿüÿûÿòÿõÿôÿèÿêÿÜÿÝÿÙÿÚÿëÿÜÿ×ÿãÿÜÿßÿäÿæÿîÿêÿæÿèÿæÿçÿçÿáÿæÿäÿñÿñÿçÿòÿûÿþÿÿÿ ûÿôÿüÿõÿñÿëÿäÿòÿçÿæÿíÿñÿ "ðÿçÿæÿ÷ÿùÿÕÿÕÿãÿÙÿäÿøÿüÿ ðÿàÿÕÿÙÿÚÿÌÿ¾ÿ´ÿ°ÿ´ÿÅÿÆÿËÿÆÿÎÿÈÿÕÿ÷ÿþÿ ûÿ$ õÿíÿÝÿæÿÕÿ›ÿyÿÎÿP[_k8G¨íÙ¢pùÿ®ÿÄÿ§ÿWÿÿûþ×þÖþÿ@ÿ:ÿKÿ}ÿ‘ÿ¸ÿ;=Qk‡ ¾½ •ƒiIP9äÿÌÿ¿ÿµÿÅÿÁÿ¢ÿ­ÿ¤ÿ©ÿµÿ°ÿµÿ‘ÿ‹ÿ±ÿÿ®ÿ´ÿ§ÿºÿäÿùÿ/5 òÿÚÿëÿÒÿËÿÂÿÄÿÏÿÖÿûÿûÿ+ p@ûÿU@6T.*Äÿÿ~ÿ³ÿÖÿÄÿ‘ÿÿ»ÿêÿsžŽzISM9‘ÿMÿÿÿ ÿ&ÿ0ÿòþ ÿfÿ}ÿÏÿ'[MƒÑ»¦ƒ$Æÿœˆ¡þ'•ÿÿ*þüLüqþÂþ ÿ—„I;Û õÿÕÿ°ÿ$ÿ3ÿ’ÿtÿ±þ ý–ù÷;û¤¨4¯¶5d ¶ Ùõ¿þGû-ùÝøpöÅñŒïeñÆôžøý~ÿPxF V Ü y IdÅhÿ¥ûóø¶÷üøGú§ùùDúÁü˜ÿŒ45g­.½Çb’ÿ.ýÎúÛùüù/ûžüyüüÂý8Á»:/öÏŠTv÷ÿ…ÿÿ ÿXÿwÿ:ÿ5ü×òMìâöÖ › Þ ÿ‘ !·˜ vÿ>ùjòðRò°íÛäƒâ4éÒðÿøðxx= xß©i £4Õü“òíæëóìwóúø*ù¦ùYÿÕ TÃÛ ƒÔØ“.üØö%õ§õ‘öƒöxöL÷YùþÊ‘WTï÷µ âèÿ$ÿðý¢üCü!üWûZý,˜ùõ'æ€æ‘±XŒ10Šm'ðê¹ä)éœìâsØ~Ú|éÇöNKœ ~½&’(›Â¬”ýNþ&þõ˜çãþå’ë<ö¨üáüÝûKÙð±p§ ˜¦|0üöôïåïólöCö öSøòú½T U œ¡š ¹s.ýû@ûªû&ü4ý\ý«þÆÅ€ü:îËç¿ýôî7"ý¬ºr øcõ²ïÖëªóŒòîMåzæ€òûöwê ГРJ ¼yÜJ@¸ú[÷õãò2÷vù)ýâûúÅþFŽ…(L¹n£Áæýrûhûþþ’ý…ý®ýŸþÿ$8Ø|‡vûÿ_ÿÿöþQÿ»ÿMaýžæûåŒWýžû;ýL<Ï;¢ÿ_¼é¸ýÇsöþ{þAþüýuý‚ü üü³ü”ý`þÿ(ÿAÿÐÿ¬sæ::Ë^`†^ŽäÿÎÿGÿø|CäÿùÿŸêª“ÿFÿêþûþÿÍþiþþJþ§þpÿ9PíÿÿœÿËÿ¿ÿÉÿŸÿ.ÿ!ÿ„ÿðÿ%B$5”ìôì÷äSx4ä³8Wÿ®þ‰þ‚þ`þdþxþ´þlÿT*šk±}™‹B–ÿÊþbþmþ°þÑþ¼þþ/þGþÐþsÿ®ÿŽÿ³ÿbõr©ÑÊÄÔĆ’ÐÿÉÿ¾ÿÿqÿ^ÿNÿfÿ}ÿzÿeÿDÿDÿDÿ?ÿ:ÿÿ(ÿQÿoÿŸÿ·ÿÄÿçÿ =WL<9WaG!íÿµÿŽÿ~ÿ}ÿiÿcÿ~ÿÆÿ8˜ÌÕãÙvÿÿ}ÿ ÿ×þëþêþÊþàþ5ÿÙÿŸM³«bì™"•ÿäþSþ!þ*þ]þ…þ…þ—þ»þÿ‘ÿôÿ*/LÒ<7ìÌ¢d+æÿ¸ÿÿ¤ÿÐÿûÿ$961% íÿ¸ÿ€ÿYÿDÿ.ÿÿÿÿ"ÿDÿ…ÿÉÿ÷ÿ+Il”©¥za@ æÿ´ÿqÿNÿDÿFÿXÿ…ÿ±ÿÓÿBp­îðÑ´ ’h»ÿPÿ ÿÿ2ÿ<ÿ9ÿHÿŽÿ •ìì´nMþÿŒÿ!ÿáþÐþäþñþêþÔþáþÿtÿ·ÿàÿõÿ3p¢·´ Ž‹”‘wdMDFDB*òÿõÿòÿÚÿ¾ÿÿ‡ÿ~ÿ{ÿyÿjÿ^ÿiÿ€ÿ›ÿ¬ÿ»ÿÕÿòÿ íÿæÿÕÿÉÿÎÿÕÿÕÿÏÿÌÿÕÿèÿüÿ*BPhvvl]@$ ÷ÿàÿÕÿÌÿ­ÿ‹ÿoÿ„ÿªÿŸÿŽÿ‹ÿ­ÿûÿ;k|U5*Òÿ£ÿsÿUÿwÿ˜ÿ ÿ˜ÿ‹ÿ›ÿ·ÿ×ÿñÿãÿÒÿËÿæÿ.9<Ihƒ—Š}yl_T8æÿ×ÿ¸ÿ¤ÿŠÿwÿˆÿˆÿÿÿŸÿ™ÿÿ’ÿŸÿŸÿ™ÿŸÿÿ©ÿ¾ÿÄÿÒÿÝÿçÿõÿ *;=D?<B9,!ÿÿòÿðÿôÿ  òÿÜÿÅÿ¸ÿ³ÿ±ÿ³ÿ­ÿ§ÿ£ÿ¢ÿ¬ÿ¾ÿÉÿãÿ2?LSPMD2ùÿæÿ»ÿ¤ÿ¦ÿ ÿ§ÿ­ÿ§ÿ°ÿ½ÿÄÿÐÿÌÿÖÿãÿèÿÿÿ  $'*(" õÿîÿçÿäÿáÿáÿ×ÿÒÿÐÿÉÿ´ÿ°ÿ¦ÿ§ÿ°ÿ®ÿ³ÿ·ÿ·ÿÉÿÚÿîÿ(<NUZXTG3$ ÿÿîÿõÿ÷ÿäÿÖÿÅÿµÿÿ˜ÿ¤ÿ ÿŸÿ±ÿÉÿÙÿôÿ'123/!ûÿÙÿ½ÿ¢ÿ˜ÿ‘ÿ’ÿˆÿ…ÿŠÿ“ÿ¬ÿ½ÿÉÿÙÿûÿ<Zbnz|wiUG,þÿðÿÚÿÓÿÌÿ·ÿ»ÿ»ÿÂÿÎÿÎÿÒÿ×ÿ×ÿÚÿÙÿÓÿÈÿ¸ÿ³ÿ±ÿ­ÿ­ÿ·ÿ¾ÿÆÿÕÿêÿ÷ÿÿÿ$.3;@;/85$$ êÿîÿàÿ×ÿäÿçÿêÿãÿÜÿÚÿÕÿÎÿÆÿÁÿ®ÿ¢ÿ§ÿ­ÿ±ÿ¬ÿ¸ÿ¿ÿËÿ!øÿäÿyÿÆÿŠ`œGÕÿŠÿàþ¤þÚþ§ÿFÿlÿYÿ?ÿ"ñÿ†Ö †‘›°B£ªsÓžkpñÿ˜ÿÿ¼þ)ÿÿ(ÿDÿàþMÿ“ÿqÿ[ÿDÿÕÿÓÿªÿ$îÿ6G¶Ž¢À—óó°s@QÁÿC=,ÿêþÿÿáÿOþ ÿ ÚÿEþÇýÜûüÇèþý ºîÇŒGcoü¡ý}ÿ&ü4ù±ùþNþDûüý¼þ¯ûÿÿ–ÿ‹^Ã[QñÛøÿþñúaúÇû’ú¡ùú^ü‚þÐý·þGQÆoÉŽàЖ¿.ÿü%õÉðúUÈ÷õ¿š Ï TÐE ë ƒ qÚúÓuô‡íRðJõ9ðì‡ò\õÄúëÿ¿ÿK¿ FK™ ¥Q „÷wÿùú¡öß÷{õðËñÿõöÚõèù þ©´iâ Ú ¤ÑYÈžîý7ýðû_ùÜ÷ùjù×úüãû:ÿS _@±ÎHý¬ñ¼òJ ‚ ¡éÍøò#ñ¿ý/% ”íþx÷Rùã ÐëeÜ>ôè÷íœà¡ózõ,_‡Ê ] ö?¾ ¯"ùÿÄ÷±ýù9õóÌê öòøtïWðAýÂÂú•üø l Ì q  © ¢¡û¬ÿ¸TöBòÊøNúƒóòó¦û¢ûÒüÉÿn 6éð",õûï׈0üÞêVÿÈ IÑ €ü‚üÕýý"ô£ßPðØ÷Ðå@å)ðNþàõÔôÆku Ï Å Þ5žˆ ­  ÑþðÂú_ñõ~ô¨ò®òÌî.ö™úË÷§øSJ íN h” –F `Öèÿåù>ý'ûbôHôI÷ïùäôB÷ÆþÂý\ÿ3wjFM ä×ù¦üƒúý0 ¶¬õGšýÞ àn ÉÌþ wú¿ô]ôé#òHîãå¬íùóLùñ ü˜ ›Ø‰ Zth ‹´ƒ€ ®¼f¸ýùúøJûßðºñ¶õÉóîôôvúþü›ü<ìPr}A à kŒq_ûœúÍüí÷Øö†ùCù'ø[ú½üíûÑþÛ*ŸÎý«ý(ÂøfûþöVÁ´&6x EQÿòlúNô·õEïúñ“ïJë¤ïŠõ0øÈñÄûÇüÿ}3 ™ ö 8V ” s Ú È’ÿ`þ!ü»ô„öÀ÷ôôòõúh÷øRý]þaÿzV‘¬~ + u![\dþ¤ülþ+ûï÷øqùd÷êö~ú'ûCü™þSoYÅþ–ÿŒë;g  Àº Ž @©}ïjù÷õHùeö"óTïÍô‹õ˜ò´ö’ø4ýEýjþˆà õ · · œ ¤ —fâ›ÿ×ýóü†ûo÷Û÷ÑøO÷ÖöÃ÷ú•ù£ùšüÂþÿMÿ‰¼ù½¿#Dä™”ÐÿpŸü üaü÷úø‹ú‚üîûÜü=ÿ»{ÿ ÁGÿM(õFÿ¥ ÊûH& r7ÿæªXù6ûeÿ³úô#øü-÷ŠõJûÔýiú³úÒ4†þ?o=‹ž€Ñ+qš\Afÿ þxþÆý‘ûpû|üóûùú‡ûãüxüæûcý•þ†þ·þ1Hd»ê{8*¾¹'eÿ\ÿÿNÿîþÿsÿÿþîþ®ÿ[ÿAÿCÿlÿ@Nÿ¡3wñEåj/$Ò*9"þâýœþAý^ü#ýõý_ýôüYþÆþ:þ’þ©ÿºÿN5B1—5ñ×ÑEÇÄ£ÝÿÖÿ¾ÿŠÿiÿmÿYÿ:ÿ!ÿ.ÿiÿ@ÿ%ÿ}ÿµÿ®ÿÐÿ*=[<,1 ½ÿˆÿlÿ?ÿÿ ÿÿÿ"ÿRÿ„ÿ§ÿÙÿi¨Ü!CC?L'Ê}C÷ÿ³ÿ­ÿÓÿÖÿèÿ"[U88¢ÿ(ÿÿóþ™þiþ«þÏþ»þçþPÿŒÿÿ¢ÿëÿðÿÝÿ!'bsZˆ´—v›À›vysQGniIUfMøÿªÿoÿRÿ6ÿ ÿûþ ÿÿÿ:ÿ^ÿzÿ˜ÿ±ÿ½ÿºÿÝÿÜÿÏÿèÿ 'Frƒƒ†€vpZQF1àÿ±ÿ‹ÿvÿTÿfÿ³ÿ×ÿÿÿQ” ›½¬SêÿÄÿ[ÿ/ÿ@ÿ!ÿîþîþÿ ÿïþÿDÿDÿ3ÿeÿ£ÿ±ÿûÿZw—Î<;þÙ¦k*øÿßÿ´ÿ}ÿXÿCÿ"ÿÿûþõþñþÿ5ÿPÿmÿ ÿÆÿÕÿêÿþÿíÿõÿûÿëÿíÿðÿÏÿ½ÿÆÿ×ÿÜÿêÿPsƒ´ÜĪ‹e<ñÿ°ÿŽÿvÿmÿ­ÿòÿM޳©˜8Äÿ…ÿMÿ%ÿÑþÚþîþÅþçþÿ9ÿ6ÿMÿ„ÿÿ©ÿÒÿþÿ "kˆ¢ÑìíÙîñÄ­Ÿ€F2+ãÿàÿÒÿ­ÿ’ÿ›ÿŠÿeÿeÿ^ÿUÿYÿzÿ ÿ§ÿÄÿÝÿÓÿ¾ÿ³ÿªÿ„ÿhÿcÿhÿqÿ‘ÿ¬ÿÉÿßÿ$1Nkƒ˜´½¯¬•]%ðÿÈÿ¬ÿsÿWÿ§ÿíÿþÿU¬ÏϾ¯_ðÿÁÿ’ÿ:ÿ ÿ ÿ ÿóþÿ(ÿ=ÿGÿ_ÿ{ÿvÿsÿ„ÿ˜ÿ£ÿÄÿòÿ"M‹»ÅÒêêϾ´—sZJ1ëÿ»ÿ¦ÿ›ÿ…ÿsÿvÿ„ÿ„ÿŒÿ©ÿ½ÿÂÿÎÿÏÿÆÿ­ÿ˜ÿÿ~ÿvÿtÿyÿ…ÿ‘ÿªÿ¸ÿÆÿèÿüÿ $<^‘ ¦œ”r; ×ÿ¬ÿÿŸÿ¾ÿ÷ÿ6r¬ËÙÑŽCÿÿ¸ÿvÿ<ÿÿÿóþüþ ÿÿ/ÿ=ÿKÿPÿhÿ€ÿÿªÿ½ÿßÿ2Tzœ´ÊÖÊ´œˆhD. ÿÿòÿçÿÙÿÙÿÉÿ±ÿ£ÿ–ÿ–ÿ¢ÿ·ÿÎÿ×ÿÝÿßÿÓÿËÿ¿ÿ£ÿ–ÿŸÿœÿ{ÿvÿ‹ÿŠÿ˜ÿ®ÿÅÿÕÿôÿ*Fd¨©¨¥Ÿ•u3çÿŸÿiÿDÿCÿeÿŒÿÈÿS‘·­€[(æÿ©ÿ{ÿWÿ5ÿ)ÿ7ÿMÿRÿ[ÿmÿyÿqÿ}ÿ‹ÿŒÿ ÿÌÿøÿ8h‡˜ª·±ž—†k[PD3õÿçÿÜÿÄÿ®ÿ°ÿ¢ÿˆÿ~ÿwÿmÿqÿ„ÿœÿ³ÿÁÿ×ÿÝÿÕÿÎÿÖÿÙÿÏÿËÿÌÿÚÿÙÿÜÿèÿèÿíÿ '@P^rupfUD/÷ÿÕÿ¦ÿ„ÿbÿXÿaÿ~ÿ¦ÿ×ÿT|—Ÿˆ_%ôÿ¾ÿŒÿlÿUÿRÿMÿUÿiÿlÿzÿ‡ÿ–ÿ©ÿÌÿáÿáÿÙÿÜÿþÿ.^€‹‹|lfdN<êÿ,GS9êÿÒÿ¿ÿºÿ°ÿ£ÿ¤ÿ ÿŸÿµÿÄÿÚÿáÿ×ÿÈÿÌÿçÿõÿèÿ×ÿÅÿ©ÿ§ÿ¤ÿ®ÿÜÿëÿËÿ³ÿ°ÿ×ÿ'ûÿòÿ 1FC5+2C@8(ùÿèÿÓÿ´ÿŸÿŸÿ¤ÿ¬ÿÁÿäÿ+<CI;*òÿÜÿ·ÿÿ‘ÿœÿÿ}ÿ„ÿŠÿ“ÿŸÿ®ÿºÿÈÿäÿûÿ $/258BB=@?/31222' õÿÓÿ½ÿºÿ­ÿ™ÿŒÿ…ÿŠÿ‹ÿŽÿœÿ¬ÿºÿÌÿÕÿÙÿßÿçÿçÿáÿÝÿãÿçÿîÿ÷ÿ ""  þÿÿÿüÿøÿüÿòÿçÿîÿîÿôÿÿÿùÿõÿðÿßÿ×ÿÌÿÆÿÈÿ½ÿ½ÿºÿ¸ÿÂÿÉÿßÿçÿäÿêÿèÿçÿêÿèÿíÿòÿ÷ÿÿÿ þÿÿÿûÿøÿðÿæÿãÿèÿëÿæÿ÷ÿ÷ÿûÿûÿõÿèÿçÿëÿñÿêÿäÿÝÿÜÿàÿÖÿÒÿÉÿËÿÉÿÌÿÙÿäÿèÿíÿëÿëÿþÿ    ÷ÿêÿèÿçÿÝÿÓÿÐÿÖÿÙÿÙÿÚÿÕÿÏÿÕÿÕÿÎÿÓÿÓÿÒÿÕÿÒÿÝÿáÿàÿÝÿèÿæÿêÿøÿûÿüÿþÿ  üÿõÿôÿñÿÿÿ  ûÿôÿîÿèÿßÿÖÿÕÿÙÿÜÿÒÿÏÿ×ÿ×ÿÝÿëÿðÿîÿñÿñÿèÿàÿáÿäÿèÿçÿêÿëÿêÿêÿêÿçÿòÿðÿ÷ÿþÿüÿÿÿþÿ÷ÿ÷ÿôÿíÿîÿêÿèÿáÿæÿæÿæÿæÿäÿãÿàÿÙÿÒÿËÿµÿ}ÿ,ÿÿ±ÿý̧©ü³ý”µü:ýöþìþôÿQFyû×ý—ýþÁñõûúYÿuÚ#ü¹ª}iJ ýâéý÷øh9úâýÉþü8û•N›ûR–þ.ýýºû¹´öÚ½û½ü¾Óùpòú+6búYMüŸÿÙ²ün‡ÿ¢qþûŸý/ÿIÕü)ÿXÿÊûôóþ»ÿ¤ÿ7ÿfãÿbþÄÿæ<Kþeýt¤—üzû¸ØZø&ÿsGå÷hü”ý"øjÿ…ÿåöSý)¤ÿbÑûÀêú-öýü™úµÿúühÔþ(KÿøÿHsûÊèlÿ÷üYþôÿåîþÐÿ×?·ÿêú¡ûÿëþ,4ûRWý°ýÁUÿ#¨ûÈìû­û¡þ«ÿûþûÿÖÐÛÿëúý®Öû/þLý´ÿòÓÿÛþJûqNý²yÿ_ÓÖªöü3ÞÿˆýÔüzÿ?«·þü:oµþuýÒ¨«ˆþ®ýk; qþ™ý^‚Ù¸ýáüwÿÓÃLþFÿéý¨üGýñþ¼ü9þìþ—\ýÄýÿ¥RÿèþWÿr-ümý¤'1LüïüDRÏ ý9þª¨ÿþý#ü’ûªýßÿwý¬ü-þQZÝNõ‘IToÿ÷ÿ›Ìþeü‚þÝÿ“ÿ‚þMÿÜž³Mÿ´ÿX°Îÿ6þdý©ÿ´ùþÛþþèÿNrûþ¨þo©9™*ý„üšþÁîv4ÓYþ&þéý¬ÿ ÿüÄýq½_Þ¥ Úªýüÿ2ÿÈüwú$úçú¼ýâý´þU>.Ebã0»ý¸þŒÿSóŒÿøû¹ü=®•ïþUn« ÿNûvüwý«ýŠÿÞýOý•ÿFWuó=XÙ&ÿ×üXÿ’óýŽÿþƒû€ÿ¦þåF0ábÇýÒü ’ ÿEýÁü0ÿˆþdýBý¶ü’þ•¦ÐþBkµÿpíêþ®ýOFžQ7nòþËÿ9¯í}*þäýÅþZýBþÆÿÿy+ÿáýÿ±þ‰þÃþ‘ÿÎxó&®ýÍüÂý2¦Ý—¦þŸüVù›úÿ!±ûÁL*2cýbþÎü]ü5ûúpùyúèúaú|ü¥ýáÿ ¼ˆh8áG¢@ÐþáþÕ~…Çp¶|ƒSþýr(ÉÿÊýþûíûHÿ7ÿjý¬üþì4üÿÓþ¸ÿ»ý’þ´Eêÿ3ÿžý+ÿRkýÚðð ý@ ›îK s , Ë…ÿ=ùÛö_õõóTõrúûùAü(þþV\9¾Ë.ïÏìèÿP¦¿SÒ”q}ÿèþSwJÿØüûÛü‰ŒüàûþõÿTæÿCüæüä$.*ñþLþóþj"ÿ’þÈÿÿºªÛ™ýšò¡éïïŒÚe  é  âýžò4ê¢ëNð]öÚú+û,þÿµ÷õ²|­¦â¸ÿ_ýÊýÊÌ8ÿ ÿ‘| ÿ³úYùáüîÿÚÿ¦þÿþ½ÿw¹Í¢ÿEþ³ýõý)ÿÝþÛþáÿNÿÈÿðÿiâþìþ 3*¹¥Õÿ^÷¾æºÞ¤òo–&!)P fr¶ûcïä\à3ã î¿ùd˜yʈþÈëäÿOüÓÿ¸ÿ|«]à sù c¨þûùµù9÷:øû5 æ\±ÿ°ÿT“ÿQÿŒüÒû¥üãû0ý8üaüþÑÙî7ñþiþùý#þGÿMÿÊXº+ìèzÐÞ ¡A%=0-x¢÷’ïmï@ïÍßXÛSÜäÔø­ ªLÒ29ö’ÿ—Ì^û5¨ù, s9 ñÚݲþýüiþµøôóø’öÐêUf B4ü©ò ÷j÷ÃûÛWýÌÿ„ûDþÙ(þúÇA9ì«þaÿ]þ©ÙðE ýÙÄÄHåª&VPk@˜-œ —çdÙæõîÇáÄã„×ùÞ;÷tD2Ï*Æþ£éSþaüT’÷öÕö?èì®ì …û )ý"ùÃâøDÿ òë[ùq÷â  á p >÷Q^û û³Ýø ÿ†Jxù‘ÿ÷0øHüxøtåýµbþ»&Ü©ÿZ0ù‚þ›5¨ nýkä4ÊxÕŽDJS1:E%ûßÝÜÝæ÷í˜åsÛ(ÕãU"M:50FãüSîã÷®ù%äûlìHé¼éAýÑ 31Ü͸ýãù°^ûèúKòßë%õ$ú²  ž (ÿ&þû.û§:ÿÁú>ò¤òcÿ> Y‹ÿ†ûè÷üÎý^ÞȺïäþþ2þàÿ3j…¨üqéÄÒé×Bý‰4Od>¼*g zéßÙ`ÝÀéìçöÝ0ٞߘöY6¯;.(ˆlò“èìþòÛøŸðpëRëÎó¤ƒw&B Êm»ô9õâ÷ø’õíôíô'B©Èz Áiû÷Vözó©õù<õø¬ÿÛw|ããÉú•öûõ¸ùfúûÿV9eZïýÿÿlñÒÿ¸ýÉù—í&ÝÚ™õŸ(!L.BÝ-Àí(Ø¬Øøç2ìOä|ÝIÞÄñ5u@_,$ñì.Þ"äîyûÎ÷¡ï2ì]òÅ î-(Ÿ0ÿ¦ëaë£óÖöø¼ïîqó‚ÿgµIó —ý8õoð‰òô8öûú°÷\ú™ ‚íP3ôåñéó†øiúû‡ÿ›„qþŸþ,ÿÈ"È…ÿNùIö2öëëúØ‚â ÌAàL¾8-%·‘ÜÎÜ}ë¼çñß^Þüè…‡(ÖC›9ÛŠúæÞÒÜÁå­õZügôÒìzî)^ó+”.¿%•ï,æ¢ìéñ@õQñ”íaðÚù‚g r$¤÷ îŸíåñ}òÑówô ú‡u8£ô´‡öêðŽñ¢õ§ùúÕýé³+ Ï^óþ<üÇýàÿÍ3ìý„öõ—ûôÄáÝ.ú½.¡JØ?´-QéÇÎÕÝæ=ë^è_á¿äÓô¥:[>È)* êèÝ¿ßï1ûö÷ÿðÚëÔù  #ã.B$Àƒ÷Ãç!ëµïpöLôðÚð%õ#:³i9 þGñKî‰ñ-òÏô‰óáõ\ÿl °!š öøzññyõû÷zùÙü÷ÿHwÕcDëÿ›ÀrÛuû_ù!û™ú¬íÛÜàŦ6ÝK=(ùeá`Ð¤Ú éÂëçÒáÙç%ù"X6‚7P$xíå…èêôÞùyõ§í™ëùx \0&F”‡ûšòóGö½÷òHïpï#öw³×‹•ÿ`÷kö^öÓõ&ôJñTô¿ú_wجv Ûü{õÐòTõoõÈ÷üÃþöݰôQlUÙ°UýÿQþÏxlòÖâÕ‰ô¯$(GÈ=¥)3 CìYÝÿàiìñìoæÜâáäóß ¾#›*ëf§÷âòö‘ûøþ•ùóêñøMüu <Tú¾ú‘ûYú{øŽõØöGûJ# ¶ Å f,þÂúùtúñúœú]øö¿øFFÿñ‚â÷½ñ`òÝõÂø°úUý6Ûí0ž” ÿÛü¿ý‡±…ÿƒ ÅÿŸþÞ|¹¢ç×Îâ= . @O4îàëé-âÅæ9ì-ê^è åöêôùÕ ð k©úŠüíüJ/ûÖö=óZûH£ : Xÿ…ý«ý ýóü÷.÷øsüûqº ›¬“þ ýöþý±ýûV÷!ùöþ`LˆÄh­zþËúáùiùÌùTù÷ûU¾FùÿŠãÍn˜ÿ£ÿóE[ÿäý•ÿd$ oÿÿëàß´êbfd&tYùsööõÌððìÎìð‰ù­G C ¬”*U™þF HþBü¼ýZRN®qùÊýžöýhûxüÿÌÿ3ÿ¾þ«þëþ$Ou®ÿ9þcýDÿ¬rÿ¼þ5ÿŠ}Jÿìüý’ý:ÿfô)—³­ÿáþÁþ;þWÿ ÿþÌó(ñÓý£ÏÙÿ›òÿÊÆÿÿÎýŠõUïGö»ò hô “&[þùèø-øÛôõõLüòÿµþ0þêÿñÿ}ÿ»¨¥½ÚýÐþêvwW-ånŠwÿ;ýÑýOþ~ý‹ÿzÿ7ÿ^FoÿŽþñÿ|0ÿ1ûeßÿ^ÿðýÿÁÿÝþ‰þÏF±­ÿ­£þ˜ÿnŠÿ]LþÿñuèþþÿïüÄnõpþꣳ]ü ÿªÈÿdú_ }ÿVþ·þ?ÿ-p þÝþþÿøþs7ÿWÿËÿõÿ“›ÁNÿtý²þÐýÁ—ÆýWÁïþ4dþüý¦þ½PþÝ?ÿ¥€Òü߃†³ý_ˆÿ«½ýYÿ>þ;þޤþ|hBŸ›ý‹ñþkcéû+ãÿSü`;þîý›,þôœþ€õþâ¡þÃýöþüëÿØý†ÑýÄy[ \ýoÿlÿ¾Áÿâý賂ý—þNÍü±)þ{°WýåÝúrdüíxü“o!û¿\ù@Ÿø[ ÷ALŽö«CüûÿûûJû@ÁÿRúáýùÙûÿûD°ûí¿ýŸúd*=þÜaüÐý¤ÌûkÌeü?•þ:ÿÒ/ÿ÷ü* ÿObfú¿×ÿ´;$ý¾úÜÚƒúùÿ¤ÿªþMÿÓ9úQáþzþN¿ú`Yþûëûòcÿ@³ú\pû,6¿ú»ý”™0ý^Êø ý@úŸ Æ÷LÎB÷ ÖûË­ù\8ûp{ôú{;ü²çÿDþÅû9Hü:þ>(ùXðÿ5ªýJþ(üýç3úÙÜüäþfÊ÷]ÏùÝþŸ Æô½—ýlû‘ÒöxDIü¢óøÏ“èùþžýƒøþ¾þAÿûíîÕüuøù‰ÆùÎúL¼ù¢Ûö#Ó£ùY nø&Ï-ù°úš¦ùÈdý‘ÿMÿ@ÆúÕ7üAþ*™ôn]IûÕèùó@6þ8ûÐ[¸úý“üÈÿ­éøwÛ¡ý“|°ü*]úýS£þ¿üí½ý°ÿñ÷úÀŽþ³ýÀú &ü7ü¼ø¤·ûr¥ó Uù ÿ¾ ×îÇ!ùÈ÷¡ì< ½¯òÕ ó'9Œú§  õœ Þøùü© %îzxü ùí6 vÒíÔûþûLËúfÿñíö3 mþºõ!]ó: ÌïùPïô§âuû*÷—÷<2ÿ-hú†ûYÿc#ó™ ½ÿköX û¯öý9üû¥õí ±ÿlöd õ »lòº ïùû …÷]©ÿâø8ØüŸþ§ýþÿþUN•úUÂþž=û0B†þ› þâLõýÕØü¡NÿòýæûÛ™®ýUü™ªÔü>tÿxý:×ýNÿ‰ÿ›ç¤ÿ¾þûÿÒ|9mÿæÿhÿ]›îþ*ÿÿÓþenþ2­ÿˆòþ¿þsÿwÿõI€D­þ ÿÿ,|·ÿ´iÿ[þÁ^ÿÿ3Üÿbþn'B +ÿçÿÿþêÿâºÿÿ/ÿîÿ“ÿ;¥!pÿpÿ§ÿ!8 }ÿŸÿ·ÿðÿ”(ˆÿûÿùÿäÿÝÿÿÙÿÉÿ÷ÿ*®ÿ÷ÿ½ÿœÿ/øÿþÿºÿÚÿõÿ"ùÿæÿ°ÿøÿÏÿãÿ'Èÿßÿáÿõÿùÿüÿ»ÿëÿÕÿçÿõÿ°ÿäÿôÿùÿ! ôÿ ûÿþÿèÿêÿßÿÕÿæÿêÿßÿÕÿÜÿõÿøÿêÿëÿôÿÿÿÚÿÙÿáÿèÿõÿæÿôÿüÿòÿüÿüÿëÿøÿæÿêÿþÿàÿëÿôÿÏÿÕÿêÿßÿÖÿþÿÂÿÖÿèÿÏÿ÷ÿÚÿÓÿüÿñÿòÿôÿûÿõÿæÿîÿ÷ÿüÿùÿôÿôÿõÿ çÿÙÿäÿÝÿëÿêÿíÿèÿçÿ ùÿ÷ÿûÿüÿòÿûÿíÿßÿñÿõÿàÿ¿ÿ‚ÿ¬ÿ‹ÒºÿÿiÿËÿÊ?eÿÿÿ|U¢ÿóþûþ'Äþÿ@ÿ0ÿrbpÿ‹ÿÕÿJ ºÿ±ÿÌÿüÿãÿÜÿÙÿßÿõÿùÿÝÿêÿûÿüÿþÿäÿ×ÿàÿùÿþÿøÿ  áÿøÿÿÿûÿÒÿÒÿçÿçÿíÿäÿòÿøÿôÿ  þÿñÿÿÿõÿÓÿËÿËÿÌÿÐÿÕÿ×ÿÏÿÝÿðÿøÿ÷ÿíÿêÿæÿêÿõÿðÿîÿëÿáÿæÿðÿôÿêÿæÿÿÿÿÿÕÿëÿÿÿäÿòÿþÿôÿðÿêÿûÿøÿûÿëÿòÿüÿòÿùÿ÷ÿ÷ÿÿÿùÿüÿòÿøÿôÿçÿÿÿñÿàÿÕÿÏÿêÿùÿíÿèÿñÿøÿûÿñÿäÿëÿðÿðÿðÿçÿÒÿÐÿÏÿÚÿäÿáÿñÿùÿ  õÿñÿêÿëÿèÿñÿèÿäÿñÿëÿáÿàÿáÿçÿòÿëÿêÿüÿùÿêÿÐÿÝÿøÿãÿàÿëÿäÿðÿñÿèÿðÿþÿùÿûÿÿÿõÿôÿÿÿùÿ÷ÿþÿùÿñÿîÿëÿæÿñÿüÿôÿîÿõÿüÿîÿíÿþÿûÿîÿÜÿÙÿßÿèÿßÿÆÿ·ÿWÿÃþ0ÿhaªèýrü¨üˆþŠ!’ÿKÿÿ?¾ÿFÿ^ÿüÿ‘z¢/Îÿ0ý×üÔýBþTÿÝÿHÿÈÿFh+Š÷#´â¾‡ÿüþÞþÉþ.ôü§úpý²9 ]Óþ\þlþ—û„ÿÂÿoÿ¯ýQþÙÿ‡ÿ6úbÿÿI5âŸ5d}ÿÓÿôÿµÿ(w‡2€ÿ¢ÿ·ÿ’ÿßÿ¾ÿˆÿ¬ÿÆÿþÿçÿÿÿÄÿèÿòÿþÿ*±ÿ’ÿÁÿÈÿªÿqÿ˜ÿäÿrXÎÿ[º±ªÿçÿ›ÿ[[<ÿzG‡ÿGÿ+hÿJ÷ÿ»ÿ! üÿ‹ÿ FÙÿÿüþÇóGmÿbÿÕÿ­ÿDL¿ÿ"ºÿqÿûÿÎÿèÿ3áÿ±ÿÆÿÏÿ+a¾ÿ"ÿñÿ@Ùÿ÷ÿÿðÿF‘ÿÓÿ@ÝÿíÿÎÿ6ñÿþÿ¤ÿ@[»ÿ÷ÿ¸ÿÄÿÕÿæÿŸÿ˜ÿ+íÿ÷ÿªÿÕÿüÿÒÿ±ÿ°ÿ¿ÿÌÿëÿLÈÿ%çÿ$þÿÓÿ*Üÿ÷ÿëÿÜÿîÿ°ÿûÿÓÿÚÿèÿæÿ'Ðÿëÿÿÿøÿ¿ÿ®ÿðÿõÿðÿÜÿÚÿòÿôÿ§ÿ·ÿ¿ÿ¿ÿÕÿÐÿÂÿèÿ'æÿËÿ ,IGÿÿ%($8,ÿÿæÿÿÿÌÿùÿÂÿÌÿàÿ©ÿàÿðÿ®ÿÿ‡ÿ³ÿ›ÿÆÿíÿÂÿèÿäÿßÿêÿûÿ ÷ÿ " ãÿîÿÜÿ èÿõÿõÿ÷ÿäÿðÿòÿÚÿèÿðÿãÿæÿîÿþÿòÿþÿôÿíÿùÿîÿõÿÕÿáÿ×ÿßÿëÿëÿÿÿÜÿèÿõÿòÿäÿÝÿêÿæÿüÿßÿîÿÚÿÓÿòÿôÿ ôÿßÿøÿàÿêÿæÿÜÿÿÿíÿîÿðÿãÿèÿ ëÿêÿòÿÙÿÖÿàÿßÿßÿäÿþÿòÿôÿ( ûÿãÿÿÿ÷ÿÒÿøÿÜÿÅÿÚÿÈÿÕÿùÿðÿÖÿèÿèÿÐÿùÿçÿàÿÁÿãÿùÿôÿòÿðÿôÿ  õÿôÿõÿôÿùÿêÿæÿ×ÿáÿëÿùÿäÿûÿüÿðÿáÿÌÿêÿðÿËÿçÿÜÿÖÿëÿËÿãÿÚÿÜÿõÿäÿ ûÿøÿäÿËÿÎÿÖÿÚÿæÿÕÿãÿñÿíÿçÿèÿ÷ÿüÿÿÿûÿîÿôÿÈÿèÿÜÿæÿãÿäÿòÿèÿñÿÿÿ ûÿøÿþÿðÿñÿíÿôÿêÿçÿîÿàÿÈÿûÿòÿÒÿÿÿÌÿíÿÜÿêÿçÿÅÿàÿçÿÿÿñÿáÿþÿèÿ êÿðÿÕÿûÿñÿÕÿÜÿÄÿÓÿÏÿÈÿøÿæÿ3 ÌÿðÿãÿäÿûÿÜÿÅÿáÿáÿÉÿãÿëÿêÿçÿËÿ÷ÿ Ïÿàÿõÿáÿþÿþÿ2Åÿ!Ïÿ( Õÿíÿûÿáÿûÿæÿæÿ±ÿÂÿ'îÿëÿôÿèÿ þÿùÿÏÿðÿòÿÅÿÒÿßÿÌÿÁÿ òÿ±ÿ÷ÿãÿÐÿ ÙÿÎÿ*¾ÿvÿëÿ/§ÿËÿÉÿ¿ÿøÿ,Âÿ íÿ5¿ÿyÅÿ}©ÿ‹ÿ=Õÿ ÕÿÈÿZsªÿ“ÿüÿ1 Ìÿ™ÿÎÿDÒÿ™ÿáÿíÿ»ÿÅÿ(³ÿæÿ[¢ÿ §ÿàÿ©ÿ? ÿ pÿ¬ÿ'¦ÿõÿ'sŠÿ ;¾ÿ çÿðÿÌÿœÿ^<5ÿßÿº“ÿYÿ!òÿJÓÿWÿs(³ÿêÿG¸ÿˆÿwÿ}I^ÿ©ÿ$]òÿøÿßÿBÏÿ¦ÿ<µÿ­ÿ£ÿpFWÿvÿÈÿëÿœˆ˜ÿ%ÿvÿ»ÿwÿ„ÿ‹ÿôÿ›lÿ‡ÿã®ÿ€ÿ„;p“ÿîÿÿÿ,?BŸÿ@ÿ­ÿvŽ,wÿ}ÿ ëÿ…ÿ/ÿjÿPÿ®ÿr™ÿ‹ÿRÿŠÿ©4 ™ÿ¦þ†þ‚ÿÿ(ö´ÐÿÿLþ:ÿÿ¾ÿÏÿŽÿàþAÿ¸ÿ°ÿJn„ÿ\ÿðÿfþ7ÿ—†Š£þiÿwŸUTó‡]Iý ý ÿ×ÿNþEþºÿ±ãßóþwþJŽ\ÿœþõýGÿ€ÿÚÿMþÿ¤ÿ·ÓŠÿtþ_þ_ÿžQ‘ÿþÿDG»"ùÿLí€Ý©ÿ þ!þzÿ±ÓyÿþZýþÆþÿÿÓˆ r±ÿfþþœþ¼þQàÆÅòýÛ‡ÿfþRþLþ·þÏþOþ0þuý÷üƒüEünýâþ³®*Àn'ʯã‡ÓÿYÿ ÿîþÅþåþþþ%þbþ<ÿ‚ÿÿÁÿßÿf›< u´Õ¯uI¢ÿiÿ¿ÿNyiAÿxý„ûèùJúûkýgÀ" 1 / Q ‰ûü6ø^öVö°öøføLùAù÷øpúWûÊýLÿ @ ¹ h î 8sîý<üü½ûûûMüÝû³ûDûzûü-ýbÿ|–2¦ZñL’¸þžý&ýZýÇýQþõþXÿÉÿøÿÐÿ¦ÿ„ÿÄÿ(Nau,³ÿXÿÍþˆþ£þÿÚÿñÔ]I¥ô8ÖÿÏÿ§ÿiÿóýÄúþ÷›÷?ø½ú>ýÓ Å~P° ÞüÆô=ð)ïbï{ò)õøÊùšùÌúêú‘üU¬é uÿWŒ± Z‡÷ú|öGõÿôzö ù:úœû¯û„ûÁûõûgþ7ÅÖ& o I ©Œÿ´û”øÙö÷â÷Æù_û‘üdýKýÎýÃþ˜nTH Ï ­ ó,ŠÜû'ø+öÜõJ÷~ùúûuþ$(ÒP[˜ECì,ßüÃøŒô×ò{ôÃ÷ÄýW ãId "ðÿù`ó ñÅðñöó©õ§÷=øƒøCú4û;þ–dè h ¡[r sðÿZûø5÷”öº÷ùpùAúú_úèúü ÿéŸ3  Ü k Õ‡ÿ+üù†÷c÷û÷xù­ú üýŒý’þ\ÿ¦™³¦N ö5³YÑýÚúPø$÷÷Ô÷­ù™ûÄýËÿ^èÀOœ_7§òF8pþý+üÐúù…÷8øPúfýÏ ÅñB0 ̉ýKõNï¹ìpëníðGôø_ú‚ýtÿS£“ ‡ñ"6 šÀü4÷¨óæñíñCôzölùCüëý’ÿ™öfÌ$¯„ Ÿ iššýïùªöKõTõzöóø¯û~þ¨,VµûO[‚%94v—þéüDû:úàù„ú¡û*ý7ÿÁUNÌRÁªþÿMÿÌþ3þþþQþÉþÙþRÿ~ÿÿ þ¥üqü'ýÃþÇþ” è vÜ G }{ýÎö¦ñ2ïüí²ï¼ò@öYúBý6XuØ×ê 1  * W F¹œþhú2÷¾õ^õ¬öwøÄúHýáþlsïšç væ­÷~ÿûü úöøLøjø²ù†û†ý·ÿn®` Å™~}LuMÐÿcþ1ý+üôûqüêüéýïþ~ÿMizª]¿1ž>¥ªqÿiþý?ýBýˆýVþëþ’ÿQÅ95Û¥Ðÿþuýý±ý(ÿû‹3· ¶ û E»kýuøîóÖññò.õ øŠû±þÝÝâ!ßpU š l é nÿßûÝøY÷÷“÷/ù2ûýèþ9‡ºD¨@qmÛ‘À„þŒüãúÓùçù¬úü þæÿ‡Œ&UðŠ.Á”b¨ðÿÿ þýüFü|üNýSþfÿL' å~l²[ ÿþ”üyûûGûü-ý’þûÿõén‚]û€ ”Úÿ:ÿêþmþ#þDþ4þ&þþý¢ý¤þ¸ÿ36Ah " ¹„‰îý{ù6õó&ò¿òiõ8ø¦û)ÿŸÉ9/w)žD³/»î«ý¬údø÷øöá÷´ùFüþ¾ˆqñøÉ¡iUIqüÿDþ¥üû"úÝùYú—û=ý3ÿgfО6™íVËhôÿ[ÿÁþþ\ýýßü4ýöýòþ#—¸š)ŽyûÿˆÿöþDþÝýÔýþ¿þ±ÿŠZÎÇj­àÿ+ÿ¤þ«þÍþÿŽÿ¤ÿ·ÿ¢ÿ\ÿAÿFÿ‚ÿðÿfé+7ˆÿ9ÿ2ÿÿÊþ­þÿæÿî󴦳5^AÿþÊû ùÝö;öWö¡÷áùÑû4þ}·X(¬ÜùÿÍý½û+ú¸ùçùÆú.ü³ýHÿ^J]¼&-4SJíÿiþûüÑûNûQûÙûýlþªÿð×W¥¸¶–j “ØÝÿ±þ ýÒü]üaüâüÇýâþ ÆA5÷Æ”;ÖX¸ÿûþ:þ¥ý>ý&ýý4þÿõÿ»?‘®v<ø³[Òÿÿnþsþ_þœþÄÿG‹Tê?Jÿÿbÿæÿ¹a6ÿSþ±ýý þ¾þWÿ=¯ªÊÕÛãÎǽ_–ÿ‡ÿ(oì ¢-Û©ÿêü–úù;ø ùîù'ûýþ&ÿIxò2Ý׫<;þÿ×ýnüÁûéû¢ü*ýÞý†þ¸þÿçÿËÛöÉâ:B¾ÿìýýÈüïüZýÆýþ[þ¾þÿçÿðè²-&ˆ¢¬±ÿüþ±þŽþtþ‰þŒþxþ‰þÐþXÿÑ”ììž^ÎÿzÿFÿ7ÿJÿ=ÿÿåþâþÿYÿáÿpí<F³Sûÿ¸ÿ•ÿzÿJÿ ÿòþëþáþÿtÿêÿiÌ÷õΘ^3îÿÉÿÿmÿCÿ0ÿFÿvÿ¿ÿZ‡ž¢ŽƒoBñÿlÿ9ÿœÿªÿ–ÿN^ˆ9­ÿRÿ»þzÿˆ@—"Ïþgý¯üýþÿÁÿøÿ€ÿ§ÿ——ž#ïþªýáýÿ¦M<tT,ÿ¢ý_ýòü”üÛû[ú_ùù5ú©übÿk{.?ªÏŽïþ'üû@û;üÎýJÿMÛTï¢XxчÉÿQþdý ýkýÌýþ)þþSþêþðÿ4,¥€å v!äÿ•ÿ ÿ]þÔý¬ýþÆþªÿlÙúìÛíçnÈÿ,ÿÂþ±þÚþÿfÿŽÿ‹ÿ ÿÖÿ+œó Ï9ûÿÌÿÿ9ÿÿ3ÿaÿ´ÿèÿ.5Qdz†k2ðÿÂÿ•ÿ~ÿ}ÿiÿtÿ~ÿjÿ‡ÿ·ÿÝÿ%FSePNP5@6 ÷ÿ»ÿ ÿÿzÿŒÿ‹ÿ›ÿ¦ÿ§ÿ»ÿÅÿÒÿòÿ.=JF2½ÿ%ÿýþŽÿËÿ˜‰ï=ëþòþþþþßýþýéýüþQÿnh9jÑàÍ12|X–ÿ´ÿÆÿJÿfÿ ÿÿ ÿþÅþbÿlÿZM»ÿ}ÿÿÕqhIþ*þ¼ýý`þÔþÓþùþøþsÿ%éšcºM q+Æÿ%ÿBþwþÔþàþMÿŠÿ7ÿ,ÿRÿŽÿ12|èÿÙÿvÎÿ•…ÿ³ÿßÿ"ÿÐÿùÿ®ÿêÿûÿÆÿÿ¢ºÿgÒÿðÿV^ÿ"Mÿ´ÿœÿêÿÝÿ·ÿKÿŽ›ÿTÿþÿ+ú¸þ øþ½}ÿXÿ Ðþpÿ<µþÓÿkÖþ,¶§þÌÖ»þHC7ÿ RÿyYþeÝÿpþ0ÒÿåþÈyÿ€ÿÜ·þÜ7ªý-ÿÃýwƒýÿ@Ñûðþûw?Ðý{þKÿþcþ»ª¼þ¢™ÿ&ÿLpÿ‹ÿaŒÿvÿ,ÿlÿ¬I}ÿìàþÕÝÿlÿÖ_ÿ•ÿX\ÿæÿ ¾ÿ©ÿ+sÿ›ÿ¼ÿ,žJþˆþ×ýÀý()ÿÿÜ£þäÿþþº)þ,Xˆý;´ÿnýÑÝþgý¡dþ:þåÕý,ÿ4‚ýoÿI±ýœÿðÿýÐþ#õýJýèÿÿ…þOwþ—:ý˜þÌýqÿ]þž:þ‚ÿèüÕÿ*FýGÑ ýý.~ÿª%¹Ÿþ fjþ “þ ­ÿfþõýÑÔÀûâˆÿ'üêüvÿÁ ú€Òú½ÿLüM"þþιü½ÿßãü›{4ý— ýü=ûÿþ5¸þ»ÿšuþºÿz-þ»ÿIRþ3®ý,}Ðü%ýL…ÿÆýèáÿ¸ýn!ÿ®ýqmý:ÿÎü²ýÏ,‚þ^àïþÉÿVþúÇý$XÿþdW[ÿU¦Ÿþ^ÿ©cþ qýÅLµü¶{8ü÷ªÕý•­ÿ„þŸÿXÿgCÿ@2-ýEJü Ìÿ†ýöüÿñgü$“üGO±ý!ÿ™û…þ½¢ú+úàL'üf;ýêþˆû`œ¹û6ÏÿÜûå9ÿ&ýy=þôüÖ[þbþ2&ýbÿ×èüþè|ü0¼¡û (üà°ÿøûàÍý þ+<úŸÿÆú-Óüú~þŠýlîûùÿªûVú€Âûûæÿ{ü·Žÿ)ýzŸþ&ü‘4ý þRú‘÷šù½¸ÿûÀûþ%ÙûÚ½Füç›ý^üà;þ$ÿãúÿ…ÛýŸ¨ýXËõÿvÿJbþ¤ÿÂ{ýAÿ®âþõþ™þ“}þÑÏxüí†ûüº2þÀý±úûþ…ÃüWùþòýÃÛþÝÿmáþÎýC’ÿBþ9§ý’ý8yý„ÿÉûþ‹û×fâý22þtý~üÜÿ±ñú_îFú˜pýý ÊýíÿIìüBÝKþ$þ /þíÿ²¢ýÓÿ·ü*[ÊûÅ6Ãüî-ýÚýÑaüûÿÀMünæ{út¨½ýÍý[ÿ–9þóþƒÿ2–þ‡À¶ý*kýy®ú61üŠ.ü ›Fü#˜ÿb”òý~ýð2ÿÉýK ûyúbûáÿ)ÿú>ü¦þãÜúL²ÁùÓáýdþpÛù$šþÔü,Îø£ÿ•áùhŠÿmùÙ,ÿãû“ƒüvûjpþ¨þ‹UúoÇ"þéÇýÿÏUþÑXþŽ‚ÿ ˜—ãÿ°þ}þÿA¤ü¿ÿ>ÉúÒ“ÁúÎäús×ú0Êûú Âÿ¡ûã¤ýßûïù¦üÕÃùõ—Þ÷[”û»ÞJüyõÇû®<ü/—ùAÿÕü5ôüÇüF ûà·ö­«WøÞ\ý÷øÊ_þÀü¤“ý þmÿHþNÿý.ÿw*7þÓýUAüÿ¶*ùŽþ¢DùéÉû¯¾¥ý¦÷üþñ­ú:Å%úDŠÐú¼$úš$ÅøJ ôõ[ëF÷ßêúÕ¥ýôÿÄü. ºü שû.ÈÖûŽÿÙúø·ÿu÷'¦"ø-ø”÷ZzíöËcøÐ÷—‰ùm-ÃøJ‹—ù0Fnû ¨¢ýojÿiúÓ¢ÿIü€)þÉþú×ü<[Öþm,ÿÿ¢ÿÿ¹^ÿÑÉÿ,ý¶þµþÎúûsþ*Úú¨GÈû#ââü¢ÿCÌÿ*€ÿÊü>bþTû6 ¸ý2ù:jüLûd˜üEþEsûCÈü=ßûëÿ+s|:ÿ`Æþ{þNZýIýõéû„ÿµYúNþ¤[üjìóüe¤òþLýÿôÿRþ|ØýgØIýp%$ýgý“üýrüþvÿ0ý½ý Dþí ÿqýlÿ@Wýþÿý ýèþœâþÙüÀ’×üÈã"þŠÿÁ;ý k("˜ÿÓþÿ”bþÚþ5ÿÛ«þöþÄ þõþݸý{ÿˆý3ÿ–Öþ‚þ ÉÿXþ<^±ýÊÊ¥ý'þwÿØúýUþÞÞýQÿÇÛüßÿ®uüé„ñûéW ûMÿ›¶ü¬ÿ4°üÉÿÛ¬ýsÝDþÊ7 ÿ]Z*þ±øŠý¦˜ýáÿFDþ¾ÿ²>þRþÖÿ½BþbÿoÔþaÿ[ÿþ®ÿš·þÌÿ¢õþ æ’þ20ìþþÿÙþˆÿÙáþ[Púý .%þÊÅVþ/åþÀ6GC2ÿîÿC6ÿáÿ±/ÿTÿ}ñÿ¬ÿõÿ'çÿëÿ§ÿÉÿ¦ ÿ•ÿ‡áþ ÿ€ÿ¸þΤþ¸ÿïþÙWÿõþ9òþ)ÿ>±ÿ×þÛišþÙ¤þ›ŒþÖÿÌýþ´ÿÖ"ÿ“ÿçWÿ•ÿÝÒÿUÿ[, ÿ1þ5ÿîÿ ÿ ÿ _ÿfÿþqÿÿíÆÿ¼þËzÐþMÌüþÎÿúfÿÿÊëÿ²þ’¶ìþ+!ÿÿÿ0ÿ¥àÿûþ€ÿ çÿ°ÿûÿdÂÿÙÿIÖÿ­ÿ<BÆÿ/}Âÿ©ÿ<©ÿüÿB³ÿŒÿ'‹ÿÝÿa›ÿÝÿ—ÉÿæÿoÁÿÂÿ¢ÿ€ÿ íÿvÿB[ˆÿ f ÿÂÿMÝÿ®ÿ2 ÿÐÿ»ÿ°ÿ*òÿ£ÿŸÿÒÿJàÿˆÿ ºÿ"ZÅÿ ÿòÿ±ÿ?áÿÉÿÂÿÂÿäÿÓÿ×ÿòÿíÿµÿßÿÜÿêÿ6!èÿáÿ'æÿãÿÿÿàÿÎÿÖÿÜÿæÿûÿùÿëÿ !ôÿçÿùÿÄÿ×ÿãÿ¾ÿÈÿãÿÓÿÅÿäÿèÿàÿôÿòÿÜÿíÿøÿøÿ ×ÿÚÿÚÿÏÿàÿçÿÜÿêÿôÿ ûÿõÿÙÿêÿõÿëÿÒÿßÿîÿÚÿëÿñÿõÿûÿûÿ÷ÿíÿ÷ÿùÿòÿèÿüÿøÿòÿ êÿãÿäÿëÿëÿàÿàÿèÿÜÿËÿÙÿÙÿÅÿÐÿÝÿæÿùÿ õÿñÿíÿíÿíÿæÿ×ÿæÿüÿîÿèÿðÿ×ÿÐÿÝÿÜÿÝÿáÿíÿèÿÌÿÓÿüÿÝÿèÿèÿçÿíÿõÿüÿëÿùÿ üÿÿÿ üÿñÿõÿþÿùÿëÿðÿôÿíÿøÿùÿ÷ÿûÿþÿõÿðÿòÿæÿèÿîÿàÿßÿðÿùÿðÿíÿêÿãÿäÿôÿëÿäÿëÿçÿÝÿÌÿÆÿÆÿÉÿÚÿëÿøÿøÿøÿþÿüÿ÷ÿîÿðÿôÿûÿüÿÿÿøÿûÿûÿûÿûÿëÿêÿãÿÒÿÏÿÝÿèÿþÿûÿñÿæÿêÿíÿãÿãÿðÿëÿëÿñÿñÿûÿ  ëÿÜÿÜÿÜÿÙÿßÿßÿßÿäÿðÿüÿòÿñÿ÷ÿðÿñÿüÿùÿôÿûÿûÿðÿòÿëÿèÿîÿîÿêÿçÿèÿôÿÿÿÿÿüÿ÷ÿñÿîÿãÿáÿëÿèÿßÿæÿçÿîÿèÿíÿñÿëÿíÿíÿêÿíÿáÿ×ÿäÿ÷ÿîÿêÿêÿàÿàÿÙÿßÿíÿ÷ÿùÿùÿ þÿþÿùÿòÿôÿòÿôÿîÿæÿôÿûÿÿÿþÿ ÷ÿ÷ÿòÿôÿîÿæÿçÿáÿßÿÜÿãÿæÿãÿáÿäÿêÿ÷ÿùÿøÿðÿîÿçÿäÿÙÿÒÿÚÿ×ÿÖÿÚÿÝÿßÿäÿäÿðÿðÿòÿûÿûÿûÿôÿ÷ÿüÿòÿòÿøÿùÿîÿèÿîÿîÿñÿ üÿøÿíÿðÿêÿçÿîÿíÿñÿôÿ÷ÿùÿôÿõÿøÿôÿõÿëÿçÿàÿÖÿÌÿÒÿÜÿÜÿçÿèÿðÿèÿêÿ÷ÿüÿþÿõÿûÿòÿòÿôÿñÿëÿçÿäÿîÿøÿòÿûÿþÿÿÿøÿùÿüÿùÿðÿãÿãÿãÿáÿßÿáÿáÿÝÿæÿæÿáÿèÿðÿèÿäÿÝÿÜÿíÿçÿëÿ÷ÿèÿæÿêÿèÿñÿñÿòÿñÿùÿùÿõÿÿÿÿÿþÿÿÿþÿüÿþÿôÿðÿùÿþÿþÿ ÷ÿôÿñÿîÿðÿæÿçÿÝÿÚÿÜÿ×ÿßÿãÿçÿçÿèÿðÿøÿòÿëÿíÿäÿæÿáÿÎÿÈÿÈÿÒÿÜÿäÿæÿîÿòÿñÿôÿòÿîÿøÿûÿ  þÿþÿüÿôÿíÿûÿùÿäÿÚÿêÿíÿíÿÿÿùÿ÷ÿøÿõÿõÿñÿòÿøÿ÷ÿøÿùÿ÷ÿíÿñÿðÿëÿôÿøÿøÿêÿãÿãÿãÿãÿáÿæÿèÿíÿñÿ÷ÿðÿ÷ÿòÿôÿûÿùÿøÿòÿ÷ÿûÿøÿðÿëÿÚÿÒÿÒÿßÿèÿîÿòÿøÿÿÿøÿñÿêÿÜÿÖÿÕÿÙÿ×ÿÓÿÓÿÖÿÒÿÖÿßÿãÿãÿäÿîÿðÿëÿòÿ þÿþÿþÿ øÿûÿñÿôÿðÿðÿøÿôÿëÿõÿõÿðÿëÿæÿãÿáÿÜÿÙÿÖÿÖÿÎÿÓÿÕÿÖÿÙÿÚÿÜÿÝÿàÿðÿõÿòÿðÿ÷ÿ÷ÿ÷ÿðÿæÿäÿàÿÚÿÝÿáÿæÿçÿòÿøÿõÿüÿÿÿ   ôÿîÿòÿæÿêÿñÿîÿðÿñÿèÿèÿæÿàÿàÿæÿæÿèÿîÿíÿèÿíÿðÿñÿ÷ÿþÿôÿíÿíÿîÿêÿãÿçÿíÿòÿôÿùÿÿÿþÿþÿøÿõÿ÷ÿòÿíÿêÿäÿàÿÖÿÐÿÒÿËÿÒÿßÿãÿèÿðÿøÿ þÿòÿ÷ÿòÿêÿßÿßÿÚÿÕÿÜÿÜÿÝÿàÿáÿàÿæÿðÿîÿîÿòÿèÿôÿÿÿûÿùÿÿÿÿÿ ÿÿøÿêÿæÿãÿàÿæÿçÿàÿíÿíÿëÿîÿëÿæÿêÿêÿáÿÚÿÙÿÒÿÎÿÖÿÕÿÖÿÚÿàÿæÿçÿðÿøÿùÿùÿõÿ÷ÿòÿëÿãÿáÿãÿáÿáÿäÿîÿèÿíÿøÿùÿøÿûÿüÿ õÿûÿûÿûÿùÿûÿõÿùÿñÿòÿðÿíÿðÿèÿëÿæÿáÿáÿäÿèÿçÿêÿèÿàÿäÿæÿîÿôÿôÿðÿêÿèÿÝÿÜÿáÿáÿáÿæÿîÿçÿëÿõÿôÿûÿüÿûÿüÿõÿùÿ÷ÿôÿñÿîÿæÿÚÿàÿáÿæÿðÿîÿ÷ÿÿÿÿÿþÿûÿõÿèÿèÿíÿèÿãÿáÿæÿãÿáÿçÿçÿçÿèÿíÿêÿáÿäÿáÿôÿùÿõÿñÿñÿðÿõÿôÿ÷ÿþÿüÿþÿ üÿÿÿ÷ÿðÿôÿëÿçÿæÿßÿÝÿßÿíÿøÿüÿüÿÿÿûÿôÿðÿîÿäÿãÿáÿßÿàÿßÿÜÿàÿãÿßÿäÿæÿíÿíÿ÷ÿòÿòÿñÿðÿíÿàÿÝÿÚÿÜÿÝÿßÿèÿëÿôÿøÿûÿÿÿþÿûÿ ûÿþÿÿÿùÿðÿÿÿçÿçÿîÿêÿôÿ÷ÿòÿíÿêÿäÿáÿãÿäÿÚÿÙÿÜÿÜÿàÿæÿãÿäÿíÿùÿûÿÿÿûÿ÷ÿõÿ÷ÿòÿðÿòÿñÿñÿ÷ÿõÿñÿíÿæÿæÿèÿíÿëÿãÿãÿäÿßÿßÿÜÿáÿëÿçÿèÿøÿÿÿ  øÿôÿëÿêÿëÿëÿîÿçÿãÿßÿãÿäÿçÿêÿíÿõÿñÿíÿûÿþÿûÿþÿ÷ÿêÿèÿàÿàÿäÿçÿäÿäÿòÿùÿùÿ÷ÿôÿøÿðÿ÷ÿîÿôÿòÿèÿîÿçÿðÿòÿòÿùÿøÿ÷ÿõÿôÿêÿäÿáÿßÿÙÿÝÿÜÿÜÿçÿêÿèÿçÿêÿíÿõÿüÿ ÿÿùÿîÿäÿßÿÜÿÜÿàÿáÿêÿñÿõÿûÿûÿûÿüÿþÿÿÿÿÿûÿðÿëÿèÿäÿ÷ÿñÿßÿãÿêÿãÿêÿðÿíÿðÿñÿòÿòÿêÿîÿõÿ÷ÿõÿõÿõÿ÷ÿûÿ÷ÿñÿøÿûÿüÿ÷ÿëÿêÿáÿãÿèÿçÿèÿáÿáÿæÿëÿîÿðÿòÿíÿèÿáÿèÿãÿãÿäÿàÿàÿÝÿÕÿÖÿßÿäÿçÿèÿôÿ øÿüÿøÿòÿùÿòÿõÿùÿ÷ÿðÿòÿøÿøÿüÿùÿûÿõÿòÿñÿäÿæÿõÿùÿõÿþÿðÿîÿ÷ÿøÿøÿõÿôÿ÷ÿ÷ÿòÿîÿëÿîÿëÿáÿàÿàÿÜÿÝÿãÿÜÿäÿäÿãÿêÿíÿñÿ÷ÿðÿêÿÖÿÉÿÒÿ×ÿßÿáÿäÿêÿèÿíÿòÿùÿüÿ  üÿôÿëÿñÿðÿñÿîÿçÿëÿèÿêÿðÿñÿøÿüÿûÿüÿûÿþÿøÿðÿôÿòÿõÿøÿèÿíÿíÿêÿõÿòÿðÿçÿäÿîÿðÿëÿêÿëÿáÿäÿçÿäÿäÿáÿáÿãÿàÿèÿòÿíÿîÿêÿãÿàÿÚÿÜÿ×ÿÙÿÝÿäÿíÿîÿùÿþÿÿÿþÿÿÿõÿñÿæÿáÿäÿèÿäÿçÿíÿ÷ÿ  òÿêÿðÿòÿùÿñÿëÿçÿãÿßÿÝÿßÿáÿáÿàÿÙÿÕÿÝÿêÿêÿíÿîÿèÿäÿèÿêÿíÿðÿôÿôÿëÿòÿùÿùÿþÿÿÿõÿøÿõÿîÿèÿãÿíÿñÿîÿ÷ÿùÿüÿþÿ÷ÿñÿëÿëÿëÿêÿæÿçÿäÿáÿãÿèÿäÿÙÿÚÿãÿèÿîÿùÿûÿùÿüÿþÿøÿôÿêÿñÿîÿãÿíÿðÿëÿðÿùÿøÿõÿòÿôÿ÷ÿùÿøÿùÿûÿõÿøÿÿÿíÿæÿíÿíÿþÿôÿßÿûÿþÿèÿûÿòÿàÿõÿèÿßÿñÿÜÿÚÿñÿæÿíÿëÿáÿèÿçÿêÿõÿùÿ÷ÿîÿêÿèÿÝÿÝÿÖÿÒÿßÿßÿæÿîÿëÿõÿôÿùÿùÿøÿøÿùÿÿÿùÿðÿëÿëÿèÿèÿíÿñÿîÿõÿþÿ õÿðÿðÿçÿãÿáÿäÿêÿáÿàÿäÿíÿôÿòÿíÿçÿòÿôÿæÿäÿãÿÜÿ×ÿÙÿàÿæÿãÿëÿôÿûÿ÷ÿõÿûÿòÿôÿîÿðÿíÿçÿàÿÝÿÜÿßÿäÿçÿèÿðÿøÿùÿüÿôÿðÿæÿáÿèÿæÿáÿæÿÕÿÜÿèÿøÿ  ÷ÿôÿõÿõÿîÿãÿäÿãÿèÿèÿëÿëÿîÿ÷ÿõÿõÿþÿùÿþÿûÿ÷ÿøÿôÿòÿíÿüÿüÿíÿíÿ÷ÿíÿîÿòÿæÿëÿæÿáÿäÿÝÿÖÿÕÿÜÿ×ÿÖÿÖÿÖÿÜÿßÿáÿêÿíÿîÿòÿðÿðÿáÿæÿëÿëÿêÿêÿðÿøÿøÿ ñÿõÿøÿøÿçÿíÿêÿðÿ÷ÿäÿëÿþÿ þÿøÿðÿðÿäÿæÿçÿßÿäÿÝÿßÿæÿáÿßÿÜÿäÿõÿîÿèÿàÿ×ÿÜÿæÿÚÿÕÿÝÿÖÿ×ÿäÿèÿêÿèÿñÿòÿðÿõÿõÿõÿõÿûÿûÿõÿõÿëÿèÿèÿêÿîÿíÿ÷ÿþÿøÿùÿùÿòÿñÿõÿøÿ÷ÿðÿîÿ÷ÿõÿùÿÿÿùÿÿÿ÷ÿôÿîÿçÿäÿàÿÒÿÕÿÜÿßÿÚÿàÿäÿæÿêÿçÿîÿòÿòÿ÷ÿüÿüÿ÷ÿíÿëÿñÿíÿòÿæÿàÿîÿêÿîÿõÿôÿðÿðÿîÿñÿðÿêÿëÿèÿçÿèÿëÿíÿëÿîÿíÿçÿæÿæÿ÷ÿûÿûÿûÿòÿñÿñÿñÿîÿõÿ÷ÿðÿíÿîÿñÿíÿîÿòÿùÿþÿþÿüÿõÿòÿòÿãÿêÿôÿæÿñÿøÿòÿþÿûÿòÿòÿíÿáÿèÿáÿÖÿÕÿÏÿÕÿÖÿÒÿÓÿÒÿÙÿÒÿÐÿàÿèÿáÿäÿáÿêÿêÿðÿûÿ  þÿÿÿÿÿþÿüÿùÿùÿðÿæÿäÿãÿçÿñÿ÷ÿ  þÿõÿñÿôÿîÿèÿêÿèÿîÿôÿðÿðÿñÿ÷ÿñÿôÿûÿûÿôÿæÿàÿáÿÜÿÙÿÖÿÓÿÕÿÚÿ×ÿßÿáÿáÿíÿðÿòÿðÿôÿùÿûÿÿÿÿÿþÿòÿæÿæÿîÿêÿñÿõÿòÿòÿñÿðÿñÿîÿèÿèÿêÿäÿäÿãÿßÿ×ÿÝÿàÿàÿçÿíÿñÿùÿ÷ÿñÿôÿ÷ÿôÿøÿ÷ÿ÷ÿ÷ÿøÿüÿ÷ÿüÿÿÿûÿÿÿüÿÿÿþÿùÿûÿõÿñÿîÿêÿëÿêÿàÿäÿñÿøÿþÿþÿøÿ÷ÿîÿíÿàÿÕÿÖÿÒÿÖÿÓÿÒÿÎÿÎÿÎÿÓÿáÿäÿÝÿãÿäÿíÿ÷ÿëÿêÿñÿõÿùÿüÿüÿÿÿþÿ øÿüÿôÿèÿæÿæÿçÿçÿçÿãÿèÿðÿðÿòÿûÿûÿùÿôÿðÿêÿçÿãÿãÿæÿèÿîÿòÿîÿêÿíÿðÿñÿñÿõÿ÷ÿñÿñÿëÿêÿáÿÖÿ×ÿ×ÿàÿßÿäÿêÿëÿôÿñÿ÷ÿþÿÿÿÿÿüÿþÿþÿèÿîÿþÿðÿßÿÝÿáÿãÿæÿàÿÙÿáÿæÿèÿíÿêÿèÿèÿíÿèÿðÿñÿòÿñÿñÿôÿûÿ÷ÿîÿðÿëÿêÿ÷ÿíÿãÿàÿàÿíÿÿÿ ùÿôÿñÿôÿîÿèÿäÿæÿêÿãÿèÿíÿôÿõÿõÿõÿîÿãÿÚÿÝÿæÿÜÿ×ÿ×ÿ×ÿÕÿÕÿáÿäÿäÿçÿêÿñÿôÿñÿðÿøÿëÿáÿüÿõÿ÷ÿñÿíÿëÿôÿøÿøÿÿÿþÿÿÿûÿüÿøÿòÿðÿíÿñÿôÿøÿîÿæÿèÿîÿôÿøÿøÿ÷ÿùÿòÿðÿêÿçÿçÿáÿæÿæÿçÿðÿñÿëÿñÿûÿøÿõÿ÷ÿùÿñÿäÿ×ÿÒÿÏÿÖÿÕÿÈÿÎÿÝÿíÿîÿëÿðÿñÿõÿøÿõÿüÿüÿùÿõÿðÿõÿòÿñÿ÷ÿîÿëÿðÿòÿõÿûÿòÿðÿòÿõÿîÿíÿíÿôÿçÿçÿëÿøÿõÿôÿþÿ ûÿêÿÙÿÚÿèÿîÿëÿçÿëÿòÿøÿùÿðÿðÿ÷ÿ÷ÿ÷ÿíÿäÿÝÿ×ÿÜÿáÿÚÿÖÿßÿæÿòÿûÿÿÿþÿüÿòÿçÿêÿçÿÚÿÝÿÙÿÝÿßÿãÿäÿèÿíÿðÿñÿîÿòÿ÷ÿõÿêÿßÿòÿðÿêÿëÿáÿçÿçÿíÿíÿòÿñÿðÿÿÿ ÿÿùÿôÿêÿëÿõÿôÿ÷ÿòÿùÿòÿôÿõÿñÿòÿêÿèÿæÿàÿáÿèÿèÿçÿßÿÙÿßÿæÿîÿ üÿþÿõÿçÿÖÿÉÿÂÿ¿ÿÉÿÒÿÕÿÚÿäÿëÿñÿôÿ÷ÿ øÿèÿçÿæÿèÿæÿÚÿßÿæÿßÿãÿèÿðÿ÷ÿùÿüÿõÿûÿþÿþÿùÿðÿèÿðÿ÷ÿõÿùÿøÿøÿ ûÿûÿõÿîÿêÿèÿîÿõÿ÷ÿ÷ÿøÿøÿôÿíÿñÿîÿêÿãÿÜÿÖÿ×ÿÓÿÌÿÓÿÙÿßÿáÿçÿõÿ õÿòÿðÿëÿêÿãÿàÿáÿáÿÙÿ×ÿàÿÙÿ×ÿÙÿÕÿáÿîÿëÿíÿæÿæÿ÷ÿÿÿÿÿþÿ ÿÿüÿûÿ÷ÿëÿëÿáÿÜÿÙÿãÿãÿäÿ÷ÿÿÿôÿáÿÙÿÕÿÖÿÒÿÓÿßÿæÿíÿíÿòÿôÿùÿøÿôÿôÿ÷ÿñÿðÿòÿ÷ÿðÿÝÿ×ÿÜÿàÿßÿ×ÿÖÿÙÿÙÿÚÿáÿäÿçÿíÿôÿ ÿÿøÿñÿîÿ÷ÿîÿàÿëÿíÿëÿûÿüÿøÿùÿûÿùÿøÿñÿõÿøÿîÿîÿíÿñÿøÿôÿðÿôÿôÿñÿíÿçÿëÿôÿôÿôÿñÿîÿñÿñÿðÿðÿõÿñÿêÿèÿäÿêÿèÿèÿòÿòÿîÿèÿèÿßÿÜÿÖÿÒÿÓÿÒÿßÿðÿòÿûÿ÷ÿîÿíÿíÿæÿíÿêÿæÿãÿçÿëÿòÿôÿñÿëÿíÿèÿÚÿøÿùÿÿÿþÿøÿùÿôÿêÿôÿôÿîÿôÿôÿ÷ÿþÿûÿùÿõÿçÿîÿõÿôÿñÿðÿøÿôÿøÿõÿûÿüÿøÿôÿîÿáÿßÿÝÿàÿ×ÿ×ÿÒÿÐÿÜÿãÿñÿûÿþÿùÿñÿîÿçÿàÿÒÿÌÿÅÿÁÿÈÿÎÿ×ÿáÿçÿîÿñÿôÿüÿþÿ üÿ÷ÿõÿñÿðÿøÿþÿòÿõÿ ÿÿøÿôÿòÿîÿíÿæÿáÿæÿíÿêÿëÿòÿðÿ÷ÿñÿêÿçÿáÿÜÿÖÿÓÿÚÿàÿàÿãÿæÿëÿòÿôÿðÿðÿõÿñÿíÿîÿîÿîÿòÿæÿÜÿÎÿÌÿÖÿäÿôÿùÿ þÿòÿãÿ×ÿßÿêÿêÿèÿçÿèÿêÿçÿðÿôÿðÿèÿëÿíÿàÿÜÿîÿ÷ÿõÿôÿôÿíÿíÿõÿ÷ÿôÿòÿøÿüÿùÿøÿüÿþÿùÿøÿüÿûÿòÿêÿæÿãÿÝÿáÿðÿôÿðÿðÿðÿ÷ÿòÿðÿíÿæÿêÿëÿèÿîÿíÿñÿæÿÝÿàÿàÿäÿèÿîÿêÿíÿíÿêÿðÿëÿêÿäÿßÿÙÿ×ÿÜÿãÿçÿôÿùÿõÿþÿûÿÿÿþÿ ûÿùÿùÿøÿôÿøÿøÿüÿ ùÿôÿðÿðÿðÿðÿêÿäÿáÿáÿÜÿ×ÿáÿáÿàÿáÿäÿëÿçÿçÿæÿáÿßÿ×ÿÏÿÕÿ×ÿÙÿáÿãÿîÿôÿùÿ÷ÿÿÿûÿòÿèÿäÿßÿèÿëÿêÿðÿûÿ þÿùÿ÷ÿõÿõÿñÿðÿãÿãÿçÿëÿæÿëÿòÿðÿðÿíÿèÿðÿçÿîÿòÿíÿðÿðÿíÿñÿîÿðÿõÿñÿõÿñÿòÿîÿñÿíÿîÿêÿáÿëÿðÿîÿçÿñÿñÿõÿûÿùÿôÿîÿøÿûÿøÿôÿõÿèÿßÿäÿßÿßÿàÿäÿèÿíÿñÿíÿíÿôÿñÿûÿûÿòÿòÿòÿòÿèÿãÿÝÿàÿæÿæÿäÿãÿèÿäÿæÿîÿôÿ÷ÿôÿ÷ÿüÿÿÿ þÿþÿøÿ ÷ÿçÿõÿñÿèÿòÿõÿõÿ÷ÿùÿôÿëÿðÿîÿæÿçÿ×ÿÖÿÝÿàÿÙÿãÿæÿèÿñÿëÿäÿíÿíÿæÿíÿêÿãÿäÿãÿæÿíÿõÿôÿñÿùÿûÿüÿüÿøÿ÷ÿñÿõÿùÿ÷ÿðÿäÿæÿçÿãÿäÿèÿñÿüÿÿÿ øÿðÿñÿèÿêÿêÿæÿçÿæÿãÿàÿçÿíÿñÿñÿîÿñÿõÿëÿßÿðÿõÿæÿãÿèÿßÿÚÿáÿæÿêÿæÿðÿ÷ÿ÷ÿùÿ÷ÿôÿôÿ÷ÿòÿðÿòÿñÿðÿëÿèÿðÿíÿñÿðÿùÿ÷ÿôÿùÿõÿñÿôÿòÿîÿíÿêÿçÿäÿáÿÜÿãÿçÿæÿçÿêÿðÿòÿüÿüÿ÷ÿòÿòÿðÿîÿäÿßÿáÿçÿæÿíÿðÿûÿþÿÿÿþÿþÿþÿüÿûÿûÿñÿîÿ÷ÿãÿÜÿãÿãÿáÿäÿàÿ×ÿÝÿÝÿÚÿÙÿÙÿ×ÿÙÿÝÿãÿçÿäÿçÿæÿèÿêÿòÿùÿùÿûÿÿÿøÿ÷ÿõÿðÿèÿíÿãÿãÿäÿêÿðÿðÿûÿþÿþÿûÿòÿçÿäÿßÿÙÿàÿèÿàÿßÿçÿôÿ ÿÿüÿþÿõÿêÿèÿæÿãÿèÿáÿàÿÝÿÚÿÚÿÓÿÕÿÐÿÓÿßÿæÿíÿèÿðÿðÿ÷ÿþÿûÿôÿðÿùÿõÿñÿîÿîÿíÿëÿíÿðÿèÿëÿíÿíÿèÿêÿñÿûÿþÿùÿÿÿûÿþÿþÿòÿ÷ÿôÿòÿðÿäÿàÿàÿáÿæÿæÿëÿíÿîÿûÿÿÿþÿûÿüÿûÿøÿüÿüÿøÿøÿùÿ÷ÿðÿèÿëÿäÿáÿÚÿÜÿÝÿ×ÿ×ÿÖÿßÿßÿßÿêÿôÿùÿþÿ ùÿõÿôÿôÿíÿáÿßÿÕÿÓÿÚÿÙÿæÿíÿèÿëÿëÿôÿûÿ üÿûÿûÿÿÿüÿòÿòÿîÿðÿíÿáÿäÿãÿæÿëÿîÿñÿíÿãÿÚÿÝÿáÿÝÿàÿêÿñÿëÿêÿòÿèÿãÿáÿêÿòÿðÿôÿôÿõÿõÿðÿðÿñÿðÿîÿõÿ÷ÿõÿøÿüÿõÿùÿøÿñÿñÿíÿëÿçÿèÿèÿòÿõÿõÿôÿòÿîÿëÿëÿæÿæÿèÿèÿæÿßÿßÿàÿàÿàÿêÿíÿðÿòÿñÿñÿñÿîÿôÿùÿüÿÿÿÿÿÿÿþÿ÷ÿðÿîÿôÿòÿ÷ÿüÿøÿõÿùÿõÿ÷ÿõÿíÿîÿëÿçÿãÿáÿßÿàÿáÿáÿëÿîÿêÿæÿãÿæÿíÿíÿðÿëÿðÿðÿôÿ÷ÿùÿ÷ÿøÿõÿôÿñÿòÿîÿèÿáÿÚÿßÿäÿçÿíÿçÿáÿèÿêÿíÿíÿêÿòÿøÿûÿûÿþÿüÿûÿøÿõÿôÿñÿòÿðÿøÿüÿüÿ øÿòÿôÿñÿîÿãÿßÿáÿàÿæÿêÿîÿîÿëÿíÿäÿÜÿãÿêÿäÿçÿáÿæÿëÿîÿíÿòÿûÿ÷ÿõÿùÿôÿòÿñÿîÿðÿíÿðÿôÿòÿòÿòÿùÿ÷ÿîÿõÿøÿôÿðÿðÿîÿêÿæÿæÿèÿàÿãÿçÿçÿäÿëÿîÿíÿðÿíÿëÿèÿêÿôÿûÿøÿðÿîÿîÿñÿòÿ÷ÿõÿûÿûÿôÿçÿäÿñÿîÿøÿòÿõÿüÿûÿ ûÿùÿõÿîÿðÿíÿëÿîÿèÿëÿäÿáÿãÿÝÿàÿßÿÜÿ×ÿÕÿÕÿÙÿÜÿÝÿàÿãÿèÿðÿíÿíÿòÿõÿêÿîÿîÿñÿòÿíÿðÿôÿõÿøÿòÿòÿ÷ÿüÿùÿ÷ÿõÿñÿõÿøÿüÿøÿûÿûÿ÷ÿüÿõÿûÿûÿøÿùÿûÿõÿñÿñÿòÿ÷ÿøÿôÿòÿõÿñÿêÿáÿæÿæÿãÿêÿëÿíÿðÿòÿõÿõÿíÿîÿêÿêÿêÿîÿíÿçÿêÿîÿñÿñÿôÿ÷ÿùÿùÿûÿôÿ÷ÿùÿùÿûÿùÿôÿðÿíÿíÿëÿêÿæÿáÿäÿãÿáÿáÿãÿîÿêÿèÿæÿáÿæÿãÿàÿëÿæÿßÿÝÿÚÿæÿèÿêÿèÿçÿîÿùÿÿÿûÿøÿõÿòÿñÿîÿðÿñÿîÿòÿñÿøÿþÿþÿþÿùÿüÿûÿõÿùÿíÿõÿûÿùÿûÿôÿ÷ÿõÿôÿøÿ÷ÿñÿðÿôÿõÿôÿòÿòÿðÿæÿæÿäÿæÿäÿæÿäÿßÿáÿáÿæÿäÿëÿëÿêÿíÿíÿðÿðÿîÿîÿîÿòÿõÿòÿôÿõÿøÿðÿñÿõÿ÷ÿ÷ÿõÿíÿèÿæÿêÿîÿíÿêÿæÿèÿíÿêÿíÿîÿòÿòÿîÿðÿðÿõÿôÿõÿ÷ÿôÿíÿîÿèÿêÿíÿëÿðÿñÿòÿôÿñÿôÿõÿûÿÿÿøÿþÿùÿùÿõÿíÿëÿèÿíÿíÿêÿîÿíÿíÿñÿêÿèÿîÿëÿêÿçÿæÿæÿçÿíÿëÿðÿñÿîÿðÿîÿèÿñÿèÿëÿíÿêÿñÿôÿôÿðÿîÿðÿñÿñÿñÿñÿòÿôÿçÿëÿíÿîÿíÿîÿîÿíÿñÿðÿðÿòÿðÿôÿôÿõÿòÿõÿõÿôÿôÿñÿòÿôÿôÿòÿôÿðÿòÿòÿõÿõÿõÿøÿûÿøÿùÿùÿòÿ÷ÿøÿùÿøÿõÿõÿðÿîÿíÿñÿîÿîÿõÿëÿçÿæÿæÿëÿçÿîÿèÿèÿèÿíÿðÿôÿõÿñÿõÿðÿëÿëÿíÿíÿæÿçÿæÿèÿèÿèÿèÿäÿÝÿáÿáÿãÿæÿèÿêÿêÿíÿíÿðÿõÿøÿøÿøÿôÿòÿòÿôÿôÿôÿøÿùÿüÿõÿùÿüÿõÿûÿþÿûÿøÿøÿõÿñÿòÿîÿêÿêÿçÿäÿæÿíÿêÿèÿèÿäÿêÿíÿêÿçÿæÿèÿçÿäÿçÿêÿêÿçÿêÿãÿãÿàÿáÿêÿîÿíÿëÿøÿñÿ÷ÿõÿ÷ÿôÿñÿôÿòÿøÿþÿüÿùÿûÿ÷ÿôÿõÿðÿðÿñÿñÿðÿñÿùÿùÿÿÿûÿøÿôÿôÿôÿòÿíÿðÿðÿðÿòÿðÿñÿëÿæÿèÿëÿîÿêÿëÿäÿäÿäÿãÿàÿäÿäÿæÿäÿæÿèÿðÿôÿòÿõÿøÿ÷ÿøÿøÿøÿõÿõÿòÿôÿõÿñÿíÿñÿíÿäÿèÿçÿæÿçÿèÿîÿñÿñÿñÿõÿõÿñÿòÿëÿèÿçÿçÿèÿæÿëÿëÿíÿðÿíÿèÿíÿêÿèÿæÿãÿêÿîÿòÿðÿîÿõÿùÿõÿþÿþÿþÿüÿþÿøÿûÿùÿüÿùÿøÿõÿñÿõÿôÿîÿõÿíÿãÿãÿèÿîÿòÿñÿòÿ÷ÿñÿõÿøÿûÿþÿøÿùÿÿÿþÿùÿøÿøÿ÷ÿñÿèÿáÿÚÿÚÿÚÿ×ÿÜÿßÿßÿÚÿÖÿÜÿÜÿÙÿàÿäÿæÿêÿðÿñÿñÿñÿñÿêÿáÿáÿäÿàÿäÿêÿäÿçÿðÿòÿõÿûÿþÿ ÿÿüÿøÿõÿøÿ÷ÿòÿõÿñÿôÿîÿëÿõÿ÷ÿòÿ÷ÿøÿþÿùÿüÿüÿûÿùÿùÿ÷ÿõÿøÿ÷ÿ÷ÿøÿøÿðÿôÿòÿçÿáÿßÿßÿàÿßÿãÿ×ÿÝÿÖÿ×ÿÚÿÒÿÒÿÕÿÝÿÙÿÝÿÚÿÝÿæÿêÿèÿíÿòÿôÿøÿþÿüÿÿÿþÿüÿùÿøÿùÿûÿùÿøÿòÿñÿêÿîÿëÿçÿîÿîÿõÿôÿ÷ÿøÿøÿøÿøÿÿÿüÿøÿüÿüÿ ÿÿüÿùÿòÿñÿðÿðÿèÿèÿæÿáÿàÿàÿáÿÜÿàÿàÿãÿáÿàÿáÿäÿëÿæÿãÿçÿêÿôÿõÿùÿõÿõÿùÿùÿüÿ÷ÿ÷ÿõÿòÿñÿðÿíÿêÿçÿíÿëÿíÿòÿôÿ÷ÿõÿõÿøÿñÿñÿðÿîÿîÿëÿíÿëÿíÿîÿêÿæÿàÿæÿñÿñÿøÿ÷ÿôÿõÿòÿøÿùÿûÿÿÿÿÿÿÿþÿÿÿüÿûÿùÿõÿñÿîÿèÿèÿçÿäÿäÿàÿßÿãÿßÿÜÿ×ÿÖÿÖÿÏÿÏÿÌÿÐÿÙÿßÿçÿëÿðÿòÿüÿõÿíÿíÿêÿæÿèÿêÿðÿëÿøÿûÿ þÿþÿðÿõÿçÿáÿÝÿÜÿÝÿßÿÚÿÙÿÙÿÝÿèÿêÿèÿäÿîÿñÿðÿõÿüÿøÿîÿëÿíÿçÿáÿÝÿ×ÿÎÿÐÿÒÿÓÿÕÿÚÿÚÿÙÿçÿòÿÿÿ  þÿùÿøÿõÿôÿòÿñÿ÷ÿûÿþÿûÿòÿîÿèÿáÿÙÿÙÿÓÿÒÿÕÿÏÿÈÿËÿÉÿÈÿÌÿÌÿÓÿÖÿ×ÿÚÿÖÿÕÿÚÿÜÿàÿðÿøÿÿÿ ! % ÿÿÿÿþÿøÿ÷ÿõÿðÿôÿòÿñÿêÿáÿÚÿÕÿÈÿÆÿÉÿÉÿÏÿÕÿ×ÿàÿäÿæÿëÿîÿðÿêÿæÿæÿãÿáÿæÿêÿõÿûÿþÿòÿëÿãÿêÿñÿþÿ  ÿÿÿÿùÿùÿõÿñÿòÿðÿ÷ÿ÷ÿ÷ÿòÿêÿßÿßÿãÿãÿäÿàÿÝÿÝÿÙÿÜÿàÿèÿîÿñÿòÿõÿñÿîÿôÿõÿðÿêÿçÿèÿèÿîÿîÿèÿëÿæÿèÿèÿèÿèÿèÿêÿíÿòÿõÿøÿøÿõÿôÿùÿÿÿÿÿÿÿüÿûÿùÿûÿûÿôÿõÿðÿñÿõÿôÿðÿîÿçÿÙÿÖÿ×ÿÏÿÕÿÕÿÐÿÒÿ×ÿÓÿ×ÿàÿßÿàÿîÿøÿ  þÿ÷ÿùÿùÿøÿûÿøÿøÿ÷ÿôÿñÿñÿíÿãÿÖÿÓÿÏÿÒÿÓÿÐÿÐÿÓÿÕÿÓÿÓÿÖÿÖÿÙÿÜÿÝÿçÿðÿüÿ  !"ÿÿþÿüÿùÿøÿõÿðÿèÿçÿæÿàÿäÿãÿãÿ×ÿÏÿÏÿÎÿÌÿÉÿÌÿÓÿÚÿáÿßÿÖÿÒÿÒÿÖÿßÿæÿîÿûÿøÿ÷ÿüÿÿÿþÿþÿûÿôÿðÿðÿçÿðÿõÿôÿüÿÿÿûÿõÿõÿñÿ÷ÿ÷ÿñÿôÿõÿ÷ÿøÿûÿ þÿÿÿ÷ÿðÿëÿÜÿÜÿ×ÿÙÿÝÿÚÿÕÿÚÿáÿãÿêÿîÿêÿíÿíÿîÿèÿäÿèÿèÿèÿèÿæÿíÿôÿõÿ÷ÿûÿøÿôÿðÿîÿòÿñÿòÿôÿðÿíÿèÿæÿãÿèÿáÿäÿèÿîÿôÿøÿûÿ þÿûÿþÿ÷ÿñÿñÿñÿëÿèÿæÿæÿßÿáÿçÿäÿçÿèÿçÿèÿèÿêÿîÿôÿîÿõÿüÿþÿþÿûÿñÿôÿõÿþÿûÿôÿõÿñÿëÿêÿëÿñÿðÿòÿñÿíÿèÿëÿêÿêÿèÿäÿçÿãÿàÿÚÿÚÿàÿÝÿÜÿáÿßÿäÿçÿèÿæÿäÿçÿêÿñÿòÿòÿøÿûÿûÿ ñÿíÿíÿíÿðÿîÿõÿõÿùÿûÿôÿõÿõÿÿÿÿÿñÿòÿþÿøÿîÿñÿüÿñÿÜÿçÿñÿæÿíÿðÿëÿáÿãÿÜÿ×ÿÙÿÙÿÜÿäÿäÿäÿðÿôÿõÿôÿõÿøÿùÿûÿþÿþÿÿÿøÿûÿøÿùÿùÿôÿòÿøÿùÿëÿãÿãÿçÿãÿèÿëÿñÿ÷ÿ÷ÿôÿñÿòÿôÿðÿòÿëÿíÿëÿñÿñÿçÿáÿßÿßÿàÿàÿÜÿÜÿÜÿèÿèÿçÿñÿëÿõÿñÿòÿùÿ÷ÿüÿÿÿþÿøÿõÿôÿðÿíÿôÿûÿ ÿÿùÿîÿèÿÝÿÕÿÕÿÒÿÓÿÎÿÕÿÖÿÚÿàÿêÿ÷ÿòÿøÿôÿ÷ÿðÿèÿèÿëÿçÿèÿíÿôÿëÿòÿõÿèÿîÿðÿðÿðÿðÿðÿñÿîÿîÿêÿ÷ÿüÿþÿüÿùÿôÿõÿ÷ÿõÿôÿñÿðÿøÿøÿûÿûÿûÿòÿíÿèÿæÿêÿëÿíÿîÿêÿèÿäÿàÿçÿîÿõÿòÿüÿüÿþÿüÿ÷ÿñÿêÿæÿîÿëÿèÿëÿäÿæÿëÿîÿòÿñÿòÿîÿêÿçÿãÿæÿíÿðÿíÿêÿêÿòÿôÿðÿäÿÝÿÜÿÒÿÕÿÓÿÓÿÖÿÐÿãÿîÿùÿ þÿòÿøÿûÿÿÿÿÿüÿûÿ÷ÿßÿÝÿëÿõÿ þÿûÿôÿçÿàÿêÿòÿòÿôÿðÿçÿæÿëÿíÿëÿëÿôÿõÿëÿèÿçÿÜÿÜÿÙÿÌÿÈÿËÿÚÿãÿäÿñÿëÿíÿòÿõÿðÿäÿ×ÿ×ÿßÿãÿíÿ õÿæÿÓÿÒÿàÿðÿ÷ÿüÿ þÿøÿõÿêÿ×ÿÕÿÖÿ×ÿäÿëÿèÿõÿüÿþÿûÿõÿøÿÿÿüÿ"ÿÿèÿÓÿÆÿÂÿËÿëÿüÿþÿþÿøÿüÿòÿÜÿãÿòÿþÿðÿòÿòÿçÿãÿÙÿÙÿèÿêÿêÿôÿüÿùÿñÿãÿËÿÓÿêÿíÿßÿÝÿçÿðÿñÿäÿÝÿëÿõÿçÿäÿêÿõÿ ùÿæÿßÿçÿáÿÖÿÓÿÜÿçÿñÿûÿõÿûÿ  þÿùÿøÿþÿíÿáÿðÿòÿùÿõÿêÿøÿÿÿòÿêÿäÿÝÿÙÿÏÿÁÿÂÿÖÿÖÿËÿÎÿÕÿáÿòÿëÿëÿîÿêÿäÿßÿßÿáÿêÿáÿãÿîÿþÿ üÿþÿøÿðÿðÿ÷ÿþÿøÿõÿèÿëÿøÿëÿëÿôÿùÿûÿøÿñÿ÷ÿ÷ÿðÿáÿÚÿãÿáÿáÿæÿêÿòÿôÿõÿðÿëÿíÿñÿñÿßÿÙÿÖÿ×ÿãÿæÿêÿëÿëÿîÿòÿðÿñÿíÿíÿùÿôÿíÿôÿîÿêÿßÿÏÿÌÿÖÿÝÿãÿêÿòÿêÿëÿðÿêÿíÿíÿõÿôÿîÿõÿþÿþÿùÿäÿäÿÝÿãÿëÿíÿòÿûÿÿÿüÿõÿîÿûÿ üÿñÿèÿôÿôÿðÿõÿôÿøÿõÿñÿõÿøÿ ùÿ! üÿøÿêÿëÿÙÿ°ÿtÿNÿ[lMÓÿ/\ÿ ÿ©ÿÏþYÿÿlÿÜÿîÿ. ûÿQ æÿîÿëÿÿÿîÿ®ÿCÿ0ÿr¹j.Ü$Aÿ-þ¾þ…ÿeÿeÿ‘ÿcÿ±ÿþÿ½ÿçÿI‹†€‘v6æÿÏÿÁÿÅÿÕÿÿfÿmÿ}ÿ™ÿªÿÎÿîÿæÿ÷ÿ,5$<o?èÿÌÿáÿùÿÅÿ}ÿCÿ$ÿ¿þ“ýŒúø©üÝ»ï$ÞÇ @ fþBüÃùø¨ö>òzðóýöÖùý!KP Ñ ¨ -  eÙ ËüùÊ÷8÷u÷¹ø“ù_úný@O!P@h*ÙbþPûAù>ø‚÷ê÷Ìùfû¨üòþ>ÝoBÖ®¡ãÿ§þüýþDþ þ#þ0ÿ5¨ì´¾_rüGö·ñ ôÿ± 01¬š‚bx÷ëïîÏë é¢ææ%ìÞ÷Ó“ “ ÖQújòþOùâóýï¦ì¦ëäï¤÷’þÈÙð ÷4$à 9¢ÿèú¥ö–ó²ñÈðßòLøHý!ùÓ± r  ¯þûúøí÷ô÷\ùTü?ÿÅ>!y„¨p’,ÿ.ükû¬ü7ýÐý]„Ùú8èøç× ›)I¢ [  ,dö©Ó ØóîÆïÁëîæÌå÷sG÷ I¬¦­cü‘ðø‚þ+öÖñaõQúõþU jÙ äúüRõ`óŸùý:øÄöGþY]]Æþ ê1ý¿úñú>üýÃüãúÎü¢bK¹­ÛÅhú,ùhý;þïü×þ›žòè ÿžà‚ÿXæ³ýGÿIþååŒÙ\ý;'õ+ w ¸ø˜Þø’×·Ûk÷ÐøêëšéAîÒÿÔÛ6ÿçÿïÞZ ÿ ÷,ú‚w<ñàô[à˜ > Ø} 6 gý®ù”ú—öhøíû_ø¼ù1-_þP\Ði,9ÿ²ÿ”øù¨ûiûÍü5³×/ ; ÿ(þµý¹þ¨ýòþÀ cþÌÿý©Aýý DQwûüZýùýsàW 8ü¼ètèÌù¾ È U›ðW Õû óaö%øEôÝðUð1øl³û£þFÄ›^ÿÐþÏX½ø†÷Fÿ?IE% ùyÿÍüãûjþÕûFø«ý"Òÿjé”jLº±ýGþ²þ(þWý–úwúÿÝÿ(ÌŠÿÿ÷c wþNý°ÿïýIüý ýÿ3y>ÏÑPÿöýúüßú€ú4þRÈ)Xÿ û8óVù:âý›ûqþ—Qçö`ó¬ûK 7%Æ÷ yûVô°ö„üýù&ùB!D²ý2ÿ‚Åü}þŽû~þ§Ãþjù†ûy¤Tõé3Õ§þ@6úýýÀý¬ý°ü6þ=þå-×þ‘üsüãû ýXÿwþéý¢a-0þþS$¿ÿxüôûÑaZýþëd.ýŒ+£úœûÿ,oú,þ@P>ýŒþ¨ßýùüñ½Âúëø6÷\Ëû¸ôÔýüÊ¥óþÊýxþé}˜üíÿÕ„þã×¾ú–øÈùûÁÐcý'ýêüâüWIülüH^ üü߃/ÿûÙþF ñuüwùßÿjzÿÞüþþ»þ2*þìþØSÒûûúWÊÝþŽÿ¤ÿ@þŠåýqþ bÿÛfÈÿïýñÿÈþHú´þr‰Þþ¦ùÏûìü×þ*óÈr¼÷.ÿøöÝÿ°üÝûúZâûFSÈ÷ûC 5 ünþéÅ_øÑûšüjüÿ¶'üÿûÐÿ!?ûRú÷Ä2tþ^Ø‘Aþ€úÃû©«—þqÿ˜±ˆÌ˜fúµý,áùF÷ÙúǪœwXÕüÈû§ùÁü‘ÿVþ¹øÀ÷FåÉþ& S•þ0÷$û(zöVùæB Þ“ùõ• LŸò+o Bü1÷Oøºú˜ôøþŽüþÂäKÿÈþOýeü¢‡ëýóNý“ hý>ôP–B\ýó’ÿ"øöþ¥M£ú‡ôhÿ©üùrÕ Öàû{f¤Wú_û`üåù=þ¤ÿ-ýÎV£xý<:ÿ÷üÿýœù¨þq"ÿ¶Doúr} ¯tø”ø“ˆìô!òZi¤ýÒôýñ > þcõRü(8JñÑóA´ûiq¤¿ÿ(ûÐü)Æ·ÿký}üß„™þÅõ¤ôEµ¶ü¸ú~û à©õêû›ñû(ö‡ÿàÕ‚þtýH òvŽÿý¢-:úvõâýpMAüˆþD€Óõýý2‰"ú8øHýýªú»ÿo:}ÿáü¼ý7QÅûRü*ýŠú÷wÎý›·3 úLômyÝú ú›üš#³ü;pÎ:þÓùÀýÓ ÿŽõáùÜÿ£ÿÑû0ÿBÄÿÉþ(þW£ðRý ý´,[Ôý©·¾ÀÛ+„üýIüÿÂúDø3Mlþ4ûûÑ`þ0ýÃûìû#û6ú ý@8nûÛþ}# C îø&ô MCòqêÿ #ýNû‘”” E¡øá .ÿÒï!öÞ»þPöîùýJêôfý·ÿ:ÿ'÷¢úsôÿ=pH* ó{à­Õ'[þåþzþPú û6ˆýEýjõzþ0üRþêKümþôüÿîý&ýýœû»ý¤¬ Y³ûéºiþIüE÷(ûÄüöñ» oé €öü­swðÛí$ñzùjýy÷þªÿ´Ð™þ‘¸ŸüGû•Çþ¸qþ¾ ‰Øüuü<H£þÑþAýWÄ ücúWým{žýà ÍýÇýEþÌÿÊþˆû,ý“üjü™á<üùólDzÛÞzÚv?# §÷<' Åö²èøô&Që¿ÛªëI´ þÞý¾1  9×ü÷£âÀüÓøœÿ݆U& Icɬd÷Áõ&ÿD({ýCûÊâsüšüœÿ6m¢=Íœþßø8÷^úhû©ü$ÿ†‘ük< “;þæüËøë3]6ú˜üÄ)0¥?ðKÙjØžñ‰ø Ý ÛÕú¤ºü­fìùØõµÿë ÍýÆï×ú!3 G Ÿ ‘ß æú­úæúö°òŒý* ÿœûVŠ®'fÿ ÿSýzùBû½ÿÁúöûÄY g¢ý/·Ò ¯Ù½Ûíº?·9ô×ÚóÆEÆ7±ÞÇ‘ÝäÀ9ÐVˆ1K %çvÔžï °ïuì¶ýðŠúŠá÷t U_œ ¡½ ‘ëó÷[ ¼Vêì`ùHþÄ Iù×ÿ™ Ú À÷Aù‹Výx÷/úÄüãüñÿâýPõòþü © R£ôêêÂ…Û±.°Ma÷×å ;e<šýó«ËmÐÂð‰ ÂÔ-¾àû$(ˬð Î  ›ãÕðÊ =8ÝKåùM ž y ± ØF#þü_þ[ÿÏû×ôLûQú„úäOzÿÿöÌÿxJüœù#üÿþÿ ûHúšýlW h9&ÿßñÉÕóÙS 3$q £<*5%1ÝæÓ«â$ñÌßÕÒ¹âa‚˜ – M“‚ °ûöRý4ý†ñTëeï8ûbQ¤R ÝB ]NþÕýpøô¾û˜üqù–ÿ°àÿy0ÿ­ÿž&ý¼ù;þKpåù_øHþp|ùü«ùMì~á\ø ÁÞ‰WÒ ¿ï©ãGë_ê(ßYÞ“çdøŽØkR¸í+ÈÍýbö–ïâíVö¶ýNÏ£ d ô D § Ç]ýhõÎúOþ2õ˜õvü{ü,ýs8—ìÚ¥{þ¢û„þ”æ܃ø8í§îýÓ æ æ RsP‡¨ ýüa÷öúñ†ììéhëï–õûþ÷u è dãNu€ÿÛýÖ¢RÿŽ ÿM¹aÿÜÿ þéüæÿëý ýšþ®ý·þNÿJþ/ÿÇJzuyhÿ‚ÿtÿ ÿ*•ÿÜÿ˜½—ÙÿŒÿµÿÕÿ§ÿŸþtýäýëþîþ:ÿàÿÈ÷Æî?ýÜ!ÿÂþÅÿ?Ï·°Õ-aèÿÿòÿ¢ÿ!ÿ§ÿ¿þþHþåýâýáýÏþI,‡—d òÿiÿ×ÿž%™ÿª<÷œ'߇ »ÿ¤ÿbÿûþêþÿÊþSþ[þêþ2ÿTÿÝÿJŸƒÁ©õëÿ–ÿ0ÿ þUþ“ÿþâý n¢ÿkí¨!h5â‹ÿ…ÿ9ÿ–þþÿÆÿGvûC*ñhÝÿMÿÿ0ÿ0ÿøþ$ÿÐÿvœ[J™ •ÿtÿ¤ÿÅÿ¬ÿÿ±ÿ2„;Óÿ’ÿaÿ&ÿ ÿPÿ¸ÿSËßâÒ•9èÿÄÿ¿ÿ¸ÿ ÿ±ÿÆÿ¿ÿ¿ÿÎÿÏÿÝÿßÿÜÿõÿ ‘Ài ‹ÿ ÿÿÿGÿ–ÿçÿ3vœ’vZáÿÓÿÏÿäÿøÿ *?!÷ÿÅÿŠÿÿ­ÿµÿÁÿÁÿßÿ÷ÿíÿÖÿ¢ÿqÿ^ÿsÿ ÿÝÿQ™´ÙéÕ†ºÿ{ÿ\ÿKÿ:ÿ5ÿDÿaÿÿ¢ÿÁÿôÿ]Ÿº¯_.ôÿ‘ÿ[ÿ<ÿCÿ{ÿ»ÿU™Ä°ˆ](ùÿÂÿœÿtÿoÿ‹ÿ»ÿÕÿ×ÿþÿòÿíÿçÿ×ÿäÿøÿòÿþÿ Ùÿºÿ¿ÿ½ÿ×ÿòÿ6P^8Üÿºÿ¸ÿ©ÿ´ÿÁÿ´ÿÁÿ¿ÿµÿ§ÿ®ÿÉÿÜÿÿÿ15F_Qîÿáÿ×ÿ×ÿËÿËÿæÿ ÿÿëÿäÿÒÿºÿ·ÿ½ÿ¿ÿ½ÿÏÿæÿüÿ  üÿëÿñÿòÿðÿÕÿÓÿäÿîÿôÿ÷ÿ (5þÿùÿæÿÙÿßÿàÿÜÿÓÿÒÿèÿßÿÐÿÒÿÌÿÉÿÓÿëÿîÿ !ûÿÐÿ½ÿÄÿÈÿÁÿ·ÿÆÿàÿíÿõÿ÷ÿ ùÿèÿÚÿÁÿÂÿÌÿÒÿáÿçÿãÿøÿ "$$ òÿ÷ÿûÿòÿûÿþÿ üÿíÿÖÿÈÿÏÿÒÿÆÿÂÿÚÿäÿáÿÖÿÆÿæÿíÿáÿèÿàÿçÿÿÿ÷ÿêÿÝÿàÿ×ÿËÿÏÿ×ÿäÿñÿñÿõÿòÿðÿèÿêÿçÿòÿíÿõÿñÿðÿêÿßÿáÿèÿÜÿßÿãÿÚÿÕÿÖÿäÿûÿ ðÿßÿßÿäÿÐÿÌÿÐÿÙÿêÿèÿãÿñÿôÿþÿ þÿñÿäÿëÿîÿÈÿºÿàÿáÿÜÿôÿòÿøÿûÿ÷ÿþÿùÿîÿÖÿÉÿÅÿËÿÖÿÜÿíÿõÿõÿòÿôÿðÿãÿäÿêÿÖÿÐÿÖÿãÿîÿëÿîÿþÿûÿôÿûÿ  ÿÿñÿÕÿÜÿ!"îÿÕÿÝÿÜÿÜÿÚÿÕÿÖÿÜÿèÿ!!÷ÿÌÿ­ÿ¢ÿ§ÿ­ÿ›ÿœÿ½ÿºÿÆÿøÿ,,@'ãÿÂÿ´ÿÎÿîÿþÿèÿÙÿºÿ™ÿ™ÿ°ÿÈÿáÿ8UT; òÿãÿÖÿËÿÎÿÙÿãÿÚÿÚÿÎÿÒÿñÿ   üÿøÿ øÿßÿÁÿ´ÿ·ÿÉÿÝÿðÿôÿæÿíÿíÿáÿ×ÿÕÿßÿäÿÓÿÌÿÙÿáÿêÿøÿèÿîÿ÷ÿîÿñÿáÿÝÿÏÿ¾ÿÅÿÏÿßÿíÿùÿÿÿñÿõÿøÿîÿñÿñÿñÿîÿêÿãÿæÿòÿõÿñÿøÿ ÷ÿùÿþÿêÿáÿ÷ÿõÿèÿñÿñÿôÿòÿôÿíÿæÿæÿèÿÝÿÐÿÎÿÎÿÐÿÚÿæÿæÿãÿàÿãÿçÿêÿêÿîÿçÿðÿæÿËÿàÿõÿãÿêÿëÿáÿíÿðÿøÿÿÿòÿãÿæÿãÿ÷ÿ   ÿÿøÿôÿðÿêÿèÿòÿÿÿûÿçÿÝÿëÿîÿòÿñÿãÿÙÿ×ÿÝÿàÿÜÿäÿíÿëÿ÷ÿþÿùÿîÿøÿñÿîÿèÿÝÿÚÿãÿîÿîÿëÿîÿíÿõÿùÿøÿ÷ÿòÿòÿôÿøÿòÿñÿêÿçÿäÿáÿçÿîÿèÿÝÿãÿàÿÐÿáÿ÷ÿùÿíÿæÿÕÿÝÿàÿãÿßÿäÿîÿüÿ ÿÿþÿðÿíÿæÿèÿôÿôÿòÿîÿáÿëÿòÿüÿøÿüÿ÷ÿëÿæÿèÿÝÿËÿÐÿÕÿËÿÉÿÜÿèÿèÿòÿøÿ÷ÿøÿ÷ÿðÿíÿæÿçÿñÿñÿäÿàÿçÿßÿÝÿãÿçÿãÿÝÿãÿãÿîÿ ûÿíÿêÿäÿ×ÿˆÿ5ÿ j¾¾ÿ[XÐÿ™ÿ³ÿ¾aMÿ#þ{ÿ¤þ<ÿòÿêþáÿÉÿ¸ÿ^¥­³ºrœD}W­ÿÌÿ\ÿ‚ÿòÿ¤ÿ‚ÿÿ™ÿÿªÿ¾ÿŸÿÝÿÅÿËÿ5ùÿ£ÿêÿ/"B2èÿªÿ¸ÿ@„6ÂÿÌÿæÿ„ÿŒÿÄÿÚÿ@€ÿzÿ÷ÿ×ÿÿÿ e£FRÿ%ÿ¦ÿÉÿÁÿÁÿÌÿN™ÿÿ¾ÿ­ÿŠÿ5Zæÿüÿ.|PD§ÿ:ÿ‹ÿWßbkêþÿFÿŒÿæÿ‘ÿçÿ.íÿ6—ŽÂÿÕÿbèÿÿCÿ›ÿÐÿLaÐÿsÿsÿÅÿ èÿKÿ+ÿ”ÂsÃ5pÄÿ^ÿÆÿ¾þÕý¼þ¢ÿÈÿ%ÿÿÕÿPÿ‡ÿ@¢ÿ”æ  4.W­$þÿüþÁþ”Œ^‹ÎÿÆÿÿîýÁü2û«øIõcõü… pŸ C¥ïç×8Õý£ùõøñ°ñˆômøÐùøööÚù”³ô ‹ õ¥®'‡Ê…þ4ü¢ûDý‡ÿ_ÿdü*ùDøèúCÿ&ºÌÿ’',÷}ËÿþÐýÔþÖ1óþþ­ÿŒnˆûšîøäé7ýeµ s¿üÉ ®¶³úýLóöì€èÀéïÈô$öIî–æ+ìtýgÔ¸¶B °vÇÎð>üh÷Ìõ®÷õúÝùóñwëÃíjø”s :ú g“ û(ÿTùL÷®ø•úú?ö²òîóêù.ÁSke8™ ë‹øþ:ôÍänÚ6æ%¨%o% ðnüo Â+%MÜè2íTöÔòzîDéBæ˜å­àãSøË^àÛý›<L*ò"7ýåý@Pý@ô…îBî×í\ë¶ðÕúÚÿ™þú|üI tC€j $ ÷ûð5ðTò¤ò¤óJ÷Hù»ùÄüî€ ÝS ¨ˆ y&ÿŽë<×™Û;È*¹+& .èó(%×5Xû$àHîúÿÙê àQÝÉàíåKê¾ûvØ Âýÿ+š,Î/èüìþÜ‘ ÚðGæÑíqôbö8òˆî*òÇóÝõdZ Ÿ0 Ÿ !æ )ôú=ù2ù!ôœïcïáï}ñáôÍøiþO°S½ ‹€5 £»õŸà Örñ #“17 VçRí#$…?!?ó±Þâø¡³*߈Ð/Ý2çEîyð©ô´ÿüÁ&')`ö Ç£D ôJì÷ñÿîôèSéOîNó©÷˜ú‡—VAλ l·X ÛkðúèYîÃö%õímï£øÿ̤4< ‰@Ý ´ !Íóká ØKë‰ë+¼…ðïˆ0ä;»éèW& ò³ÎbÍuç•ñ˜òõRôÄö~åÝ"Ö ÌùÔMÿùîãõòþ·ôèŸæÚíUùùü²û Â{ ã“ îл ƒ¯`ôñÙùDýôBé;ì´ùÌøþBýE  k E›Fã »ÿ^ñ.Þ$Øaí«#*þlñ‚¾>ª7ñì¹øãŽþÐß®ÉuÓÇë‹ô=ñFíGìòôq ~w¼ {P!A+ü*ö¯ü!¶õæãníëõsúúªöGúU2¤  "'”öfõ¥ü˜ûÝñàé—ìÝö¯üºû.úÂýæØ $ ØoÖ ã `„ÿA÷Ñæ’×›â  "C½ðH>ý9‰ºï=øßwþÊãõÑ(Ø÷ë¢ñ¶ìþå‡åtóH¿\ WL'R'üîúVá÷Ôêèãïðö÷âñÝï%úq ócu\îи 7_úEýÄÇûCï4éAîá÷ û#÷`÷Âÿv Û H Lý ã ³ú¸îÂßÞ ù<Kö÷ Ó2K:ÜË÷ÌðÚbðHßÙç#î¸ë”çäzìsÌz<+îó!ÄõþfÿûôYêRéÈðq÷íö…óv÷““ ‚h³ ‰k\<ÿ}ûýÅûáò~ëuìðóÎûBüúhýÞ~– T  = {ÔºúælØUé1n‹YýðC2/-© Áï¢öObÿ õ;âªÜÓàÝäSížî•ì£öó/2^µ ½'Ö0þ•û1øÚôwðëíðõôù¡ýdW¡Tä°åt ókúýÔù ó´ï5ðDôJù‡úúâûóþ*w · C ÉI4÷¬çâCöE?É+a`© °ÿ¨ù†óôóèòûïÂàÚfä ò¸þ[¨"É 2ÃÒˆw9éý÷Oò)òÞôÕ÷ûûÝø®úþ3¢B 5, œ¯n"1ü÷\õ-ô²ô9÷)ùÖúHü¹ýžHå‚ aJ;þáõŒílï-ýNÖ±Ç ä µš.A§ô’î ðÇððÅñ˜õÇ÷Cöbö5ü(O a ò y Ù×J Ö Nr†AýÊùùŠúÏûCüLü•ûûóûèý—™).›´[ }ÿlþÍýÓý9þ´þKÿ[<ÿðû\õ–ïTô)¶ãÚ n @£û’ýôm E’ÿŽûŠø®ðÍîÏô úãûtútùìùÝø}ùKþ)FO¯w[Éh›;ÛcWbÿQÿÿ{ÿàõÿý9ûÂúçúfûüPý0þÇýkýnýîý!ÿQšŒ€$‡  HMÝþ÷åîÑóc`j 2 À ¯éûøö–À x Ï lXôõzîûï$òøþûTûdû’ùkømøFúðŠU}šÔŸ æ Yÿ-Èÿ9þýCÿWx—fýjúùÄ÷ƒø´úáüfþBþdþNþèý¹þÈÿW÷¤“Êê“L¢EüAòÐîÅû' \ < Ì Ü Zø?ûíÅ â±hÿ÷òcïõ¾ùÙ÷@ú¢ûôúîùjúXÓ¸ZÔ,ÕÓî ~ wÝmjþ.ýþ¸þ>þ,þâý&üaûûQú,ûWü üÈû7üýªý"ÿÄîpÛ[W›SÌqþlõí öÊž l ˜UÀ[üÚøèúyp’OþNö©òoõT÷6öRùýøÞ÷ùÞø¹ü•JÍÔO¼ÕæÿÒÆÔ22ÿ½ˆÿþØüÇû\úÔøúÏú ý ÿtþåþŽþÚý“ý2þGæë’³Û*|˜¶ûIòîï²ûnuí à! ´Rýüø=ý²Ž#awûVøöþö¤øúùnùÁúO÷¿÷uü•ÿAÅx¹0Ô™G<þ›mƒ‹ÿìýKþtþ¶ Ûþ¿þŠüòúLùÃùJû]üþ þóþ›ÿÔþŠÿ=‘#±a«¶Òÿ‘jþø£ðOô——£ E˜z 8Œúo÷µýÿ(þ´þ1üøaõmùÖû²ûÇýJÿôú£øGúôù ý|x1ÂXú&½S+ÐøÿŸüçú1û·û¬ýÿýý"þtý*ünü®ü±ýüþ¬ÿXÿ¿þ•þØý)þÿâÎ 4\æýÎOÜXŒþûù1òEñøûàa'ÒF j ÅÿBøêü¸þþüIÂ#þPüÂøÌóZ÷!ûMûÂÿfmþµýÅú™ûÙþÿȨ£INÐPdl¶€ÿ×üÿùnùÛù5û-þ[þý÷ý§ý"ýþiþzÿ+íãÿîÿ[ÿjþÝþHÿDåE]éäZ3¹úCGÿGþ_ùžñ¬ñ!û—B .; à ŽûþšýØü[„äþ6þùø(õÇø£ùcúèÿû£¦¦þ˜ûíü®ýýË™¤ñ²œôr­»l‹ŒÞý·ûÒúfù¡ùûäú¡ûÛý þzþÌÿ¢ÿøÿø@Äÿ¬–ÿ€[n?æñûÞZÇÄz[ÿLþ’þmþYþÿµþ“üù÷]óÿõ&þçê 2ÄÈ` ûûPüûƒüIÝL¹þ°ùR÷AøÔ÷Èùþòÿ]UþÖûóûûµüê (_`ϱsõ ÉÐÒ«ýºú*ùòúhýÆüTüÐü}ûcúù¹ùÎûèýþè確>¿þ;ý`üJü¼ýJÿo³>þÿÿ3þ"þâþœÿ â›Ôg;Ì—ý4÷ñ ðlö­þ ¿[XÎZKú‚ô©òóñvð\ðCïïñùó$÷ÈûìŽnF s - ÈÌ+I Š„Qû~õ>ò/ñkò6öÆùòü.ÿ¾ÿwÿÂþÿZõo%  ó RQÿAúêöÌõØö&ù ü,þzÿùÿ2|ÛáÈý‚MNþ³üªûLûŠûlü¶ý@ÿrZOÝ]±–¿.Áû¢õ¿ðSòÙùÓïÄü«×úUó£ñæñªóSö6õvòùí¼ê[ì–ðù¼ñ Ô¿ j åùÆSÉ·*ûõüï€í9ïOó£ùÌÿ¡ÈØôugK _ - £<ûæö"õõh÷£ù5ûwû4û”ûý"O’   ¹ 6 MêÿYü&úVùÀø»ø£øgøùsúÍü•ÿ„¨Ý¶MÝ›d[ëÿÙúèõ§ðlìí®õгÁ^=ˆ ö =þ’ú!ô°ë åþáµäë€ò#üûˆ2 è«}yÄU žûðö}öA÷P÷´ö/ôŠñCòXöïüf À ° è èú~9ÿ>ùOôÿñóíöúéûü¨ûcüfÿñÐ ‚ $ ©è6‘êxþúø¸ôióÛój÷DûÔý‡ÿÉÿÈ;IhB*ûöÞO—fýîøÈõŒóóŠõPü]B1@F ± høìîPæTà<âÓæçìØóÇ÷üÕ¹írMiÖ…Ï ¹í9üö£ïÈìcí„ðÁõlúþÒïëƒ !^ c¬ÑRÿÊü£ùÐõóò.ò£ó´ösúâý|õžL: œ  k{ÎÿŸÿ€ÿ»Öÿ=ûù!ùÚøÕûAýðüý þ,F>õ™H^N%ÿÿ“þ}þ®ÿ›ÿ+ÿ3þFýºüOügü»ú³ú± i=Ü> T L¥üìóþìçˆæ(ëî)ôË÷íú¥Os ‘+Ö É Ž àÏþëù€õøóáô ôö‚÷Úùþ]& Æ · 9…ÈÕ`ýõúöø4ø,ø·÷á÷~øFú÷üæÿáªæ¹ÑQÆ #ÿ°þCÿüþÎý[üvû;û&üýýëýMÿk0¨§æð$’™k[ÿ§þ±þÿ‚ÿÄ«nðÿ€´êVþü©û²ý—©×m¾u¾¾‹þíúg÷úöZøšø²ù7ø%øòú¥ýñ^àÂDàå)ȅʇÿ#ý—ûƒûôû†ü²üÄüÊü”ýjÿ÷ÔÛYî/ÿ¡þÊþ ÿÚþŒþ7þóýOþµþFÿ÷ÿ4ääþ†[ÿÖþŸþAýZü5ý3ýþ§ÿQþÿZ@;¤ß_uô,ÿsºÿþßËüµÿWÿBüó«üJÿÈ?ý„ûÓý¾Š‘Œ|<(±Û|#ý—þ€ûmýýüú§úøúûû ýC ïï-¾—ÉýoÞÒ&—Ìý/þþtýÿ½ýðýÌýþüÿþ,ÿßÿ×ýÙÿÿtÿNCÁ^øÿ*·Û›ÿ}ÿvÿGÿvèÿ6ÿweÿÌ$¬ÿWÿ?ÿ¢‚þ2þ…þÏÿÇý1ÿþŒõþ•Ë«þ óþ(ÿówþ¾8„ÿðlÿÿ1ÙÜÿšý/òýíÿhçþw«þ¹þ*þùüþ–þwud2X(=‰´£ÿÓþôüZýüüüû ýöýÿ›üÿÿnŸÿ¿±U·;!f{ÿ$Ýþ´ëþçÿuÂÿ þRþÐþÕýÊþnþBtýX±+ÿ™ÉþOSýÄæü"zþ“ýóÝý*ÍüžÐþÿÌþtÿÎ…ÿ3ÿk¿ý†Žnýkòÿýþ@BãÿèÿrÊý_“Óú×6 üqcþ°þ™ýFÊþžýªVýÛíÿRüýäbOüö–ýCÿÌ©ú®ÿèü,û4Íþ'Û\ú÷íÇýù …ý‡Rú´ñûÞþ ú`ýŽþ¡þ‚µüyì¬ü¨H0ÿðý²k/ÿ= ýTÿ²—û,Ò›újeüšýlú)!øõ)ù1üýÒQùùY=ú;±ú¢ÿ9Œ÷¯Õø^ âü®ùÐ ºü ûJ—ûwÄ øNÛ÷«5©ôä rëóö Èþ{òTüöôŒýó]÷îó0ÿ~{ïpôxóÿýg ó5ýí×ïôüf?ìžpõém«¯ëÛ@Æî¸ …ôQ WgóÉã(ñï·µó šüÇõÃþï÷>·ü»ùoŸüúÊŸü‚þ!úoÑ=ûîåþóùÖÿxüåýd­þêüuìþöýì<¾ûþ@µý°þý ›ûÿëDûóþ]$ýóýårºÿíÿýÌÿyÒ‘ÿÂýU(þaÿŠÑ†ëùÈþïþýJ?üþîýoÿ,„þ¿ÿ4Húòþ!5ÿNþvpý‡ü)ñ›Imýoúÿ"þ©û"ÿ›ÿAÿvÃß6=‘»þ¾ñòÿÿ#ý5ýaü°ü{þ=þþüþUÿÌÿPÔCÉÿìštb3ÿoÿ_ÿaÿiÿ°þÎÿ{ÿÊþhÿ8Ÿÿêî*þ¨þ^ÿÐÿËMÿÁÿõWÿëþfþ–ý”DY¼þ–ÿjy•ôÿþµÿ3Hÿ£ÿ:ÿTÿÊÝÿÿÅ•ÿe½ˆý/þ/'g¤ÿÿñÿâJÿ‹½Zy_ÿÿîÿÄÿMÿˆþºûýÝÿ¤Š¬àŒ$¿ÿP›ÿþYýÈüêüUýXþµþGþ3ÿ’ÿßÿ±ßßg†y†F*?ÿ£þÙþiþÎÿJÿœÆÿþ€ÿWÿ¢ÿÙÿaÿÅÿ~ÿaÿ–ÿ+ÿœÿßÿyÿ]†§ÿëÿ Ëÿÿ,Óÿ£ÿT ^ÿûÿ.€LÖÿÙÿŽÿÕÿjÿ:ÿCÈÿ5ÿ+ˆ'­ÿ±ÿy@ ¯çæÿ‘ÿ¬ÿýþŸþ³ýÛý–þÿ$:«bUqM5ÿ³ÿ[ÿ:ÿ·ÿ&ÿ§þ\þ:þ{þéýVýGþÿUÿiÕßh<50Óé½Ò‹ˆU©ÿµÿ‘ÿGÿcÿNÿ´ÿáÿŠÿTÿÿ!ÿ™ÿ±ÿ{ÿUÿhÿ{ÿ‡ÿÅÿµÿ³ÿ÷ÿ2FT‘·¥,  ëÿ 3Ðÿòÿèÿ™ÿ…ÿŠÿ½ÿÎÿÁÿÁÿ¸ÿ"ZFôÿ3<?B ÿsþŠý½ýäýþQ¨==×R´lÿóý¡ý”ý®ýþÞý"þþÛý:þ*þuþ$ÿøÿyN *Ü‘5³£kX1îÿÙÿÿŠÿXÿ"ÿfÿjÿmÿˆÿhÿŠÿÂÿ·ÿlÿPÿ‡ÿ­ÿ°ÿ ÿbÿ…ÿ–ÿcÿ˜ÿ›ÿ˜ÿßÿ8vuªÈUõÿZÝÿñÿîÿøÿ;+üÿÅÿ ÿÂÿ˜ÿ®ÿ6SMTBe[Wÿ»ýÜü¬üžüÍýÌÿ©&7¿­3djþßú·÷Üöì÷ÉùŽüÝýgþÁþ«þ7ÿ§ÿo<Î Êׇ%ƒþ ÿ´þnþþÑþÖþ0ÿ@ÿ7ÿ$ÿïþ ÿèþÿwÿ­ÿ/f|Ž"êÿ–ÿÿþÈþåþUÿÿpÿCÿ‡ÿ$ƒÇß•dviSSD+Ðÿvÿœÿèÿ 2Qp¥ãôimþ&ü/ûcúú9üqÿ&×í Õ ë 5 Y›Rý•ùÙõ6ô*ókó¦õÛönù5ü9þƒ`G¡—è  ^ ÃÁ#9ÿ¦ü,úYø8øïøûú·ü¬ýµþPÿÎÿˆÿÿŸÿíµï3àÄâNÿtý5üìû*üSýþøþãÿþÿ[}iÎâ&8—‹Ê$êy=€PTéüö÷´ôÍôóöüʇ pmžzw ŒäûòÁíë„êí9ð‹õøù¬ü¤ÿ©ßù‰ß%Ä ÷ ˆ é a  %ŠŠüÀøøõõ3õö¡øÎú"ý×þîgdÛÈ‹ü,ç=ßÁ­þüÎú£ùßøöøêù û¬ü~þ6S}™ßý ¿ÿÙÿÿÿ[P;¬ÿ1ýhø—òÔï5ò˜÷ã² ÐÀ —"!WÚùaì)á2Ý÷ÞðâÜêëòúùÿ“Ù¶# ¦“ƶ!! ®Í÷Cïwê4èÉéDîüóÆú_¾Û• 6  j²Õÿ¦úFõSòÂð¥ñ(õ£ùòþ>2¹7Q–}n¤þAüèúãùmùÉú9üLþ˯î>| äŒüxò¼éÂêò,þá#õ+î->%‘®ÈìïÚ)ÏàÌ{ÖÅá ï¤ü´ i m ñ Û ²Sü' •þkí:á£ÛºÛ\ä™ð¨ý yähð L<iþƒ,×üâó‰éããôæ!ñ}ÿÝ › 2cr ôgøÏñðJðWòäôn÷iú(ü²þæÐ4R° ¸  C y9|¾ö÷æÝÛCÜçùD2ª=:s/äeå9ÎDÆÝÈÖxç;óûüéFt³ El$¿,²/X(iXËèMÓïÊWÏÞðÙÇ%Ê! HA¦ „ žûßë7Þo×0ÚUä†óÒ8m!$¢rÜ ¯ û›òhí×êBé%ì‘ð÷pÿy »øž û v Ù(ÿxüöù û2ûV÷ìsßÒàšî×<#8? Dl9â)š¡ïÎ4¿…ÂäÌ‰ÞØñýýâ–× -ùs*R0*+W† ïhÓµÅÿÇ Ôèx4&¿'Ò&öûÿþlü‘÷óìÈá`ÛiÜÂägô_ ã€% &pÚõ¦üuööòFñðrí²ìáï»õÙþ= {£ 0~ ›VüH÷Îó1óýôÍøýù™ëðÒâæ*øëô2ÕDy=…-éôlÌ¡¹â¿êÎ.áv÷Ô &  Àý% *q!U ÷zÚïÅ.ÅÐÑÿäÿ¡#//%yÀ áþAùÊö¬òêä|Þ±ÛfãÆò¹Ù)_,A"ZZñké=ê·ðx÷)úƒügüeú¬ý Ôp—™¸ ̧þÌøóñûð;ó3ù“o ~zcú†ÞØ×Èæºÿ^#AB­CÏ2ƒü.ÒZºµÁìÓñæîùò H°Ë['l*. ÔdìIÓRÆ%ˆÜYô¸ Ì"û,A'}Ö3 uüï÷ÞíàŽØ«Ù‡àDðA”Ÿ)h)J üï±éùêëð\ø¨üBüÿýLƒ½ è º ý>‡ÿxüŠû¯øMõëójôøMv zì¤Ùì?ÑÓíæÒ0(K C¯0®ÝïèÆ·¹ýÉ|Þ©ðÿ}þýF À.²1¯)öÅñWÓÅÉäÙYóö 8 #!–BÒˆ Œ†ýÚîžÚLÏ4Óßxóú $\+¡$©*[÷IðTïñgôj÷ð÷c÷[û¨§ ƒÄ ^–ÐÿòýýbþHüøŠöÛöHù ‰×Û &ºðYÕªÑäÅ÷+VKbF—3¿õÛÊ]ºOÉÞ×ï¾ûÿ‹ûÿûÞ ¡$83†4­(G¿ê£ÌƒÄ¢Ì³àiûIñÅ*32‰¯ dû[æFÒ?ÌmÖaçäÿê«'Š%«Ø ÐÿöÐôÖôîó7óÅñÁñÂõÅþÖ ´Ç§„ÊþüßûÃýßÿàÿ]ýú,ùNúÊý®ïv S õî˜Ø{Ô•åAJ.€I‘Dõ26”ó6Ì©½ÒËÃß½ñúû[ú«ý·2(E5Y2z"$LâæÉ+È.ÔDêb õZûÈ¡œ¾×ôß%ÏüÏ:Þgò½ í=$]*Oðü)ùbúöùö¿ðÐíìî¡ôF¦ ² ýüFûhý•ÿä6ýÊù“ùâûŠÿT3Å ™^wý±èfÔðÙöñO:ªJM ?®þòXêKèÚîúû„²  ŽäîýMÚÿs8ünùúæüC³2†pÿ øèäÕÖsåì´GBÔF(1‘|ølÒÅÒ·å×î&ôöšñxýìS/N6:-Ÿô9×6ÏÕÃèþ“ ÿJÎ<«"ê˜úKã~ÑþÖmèúæ ÞbZQœ Æ bÚóélçfëfùE% f oÿdý°¹öhlûùü@ÿYBNþÅTäQþ0éšÔÞKù¤TD|J55[ê÷äÐWđӯé»óPõPñ—ìøv®2–:‰0yxóˆÔ¢ÍØ©ì~â y!þœÿü‰è'Ÿ$;øßÅÐÚ€í¥"í`çþ»þ(ˆèÑ›Dî>ç%éÚîÉý8•:«þýŽÿ³ § bÞýjøù®ÿ¢ùsçûÂú85§þGä°Ñˆá+ÿ°#LI[Hï/¢ÁíHËÉTÝÀñäóxïhìwêYþÇ!,;i9u)Ú úâ¡ÎEÕ6åQùÑO*øßöÅA'Ì+}O;ç|×ÅÖéþ™ 8 ‚ký*û’µ6øeóäåméµò1û–æþ¥ú¨û,1Í K êÙþ_ûçú€ÿgÊýúÃøüœÿ eËðˆÙbÖ-ï¾¶=cK¬:” ½ügØË4Øšì±õ í£åÕç$õÈè5Ò=O-‹‡ð Õ×^è7ù¿ÿ/öIðøû2²& -¡ öëzÛ|ßìRý/>°úø…þJ ¡½ØûñÂéï4ùqÕüÃø²öÝû> Î ï,†ýëýöˆpÿWúW÷Dù2t¢ î*íõÕÖÕ¿ó»üA—J7˜IõÑרÓHßðòâEÞÕç*þD"‡=D; "Ý3æ‚ÙÍå¤÷i`ùiï‰ì*òi ó$¨.F%ÏNöIâõã$ñúJþ’ùšóôòzþë9‘ëÿ?ózîèôþ¹ýƒ÷‰óÎ÷ŸÿÛ3 EJ½ýHÿ09¸ýÍø0ù+üÙÿ»Ü«øŸåfÔ¹Ü ¬0eFC-. €ê"ÜLß(åêÓãsÕ«ÞÇ÷r"7);**xí9æÅêøöÿûiõ’æ)æøõM §"Y,Ú" NùÐòwðýöíúÐó¼ìˆêXö ; ý@úãü6þ+ÿˆø÷ðñ#÷çÿ²è ý ýÐÿpníµ%¬ÿŸÿöýæý›üþZâ,ýËì:Ö{Öãúß+@F˜C0) OìäÓéüè äeÛfÐ)Ú ú!&744\!Ríÿñ}ûòùêñ7èß6él×#ª fý1¥Úùní™æç´ïºôžŸ%ÿÈ&§ýöëðVòdø½¶oAþYýþ—5<ñÿ%ÿEÔÇÖXþú_ùåý‚ïiþ0ò¡ßìÔäêN@–B­2M ûŸñCõ®îÚ•ÍÍ ×=ó±.F(Ït xË-÷9åÜãðƒœR‰XtÜ ¼œô½èZçëïZøšþ ³  ‹é ›nýþ8ø©õ ÷.ö;÷üPÿÖÿÖGq.N’*3—ý÷úÎúZýü$þøðBá„×TëÌF=ï:É+šWÿmýqïðÑÕ×ÍQÝ|÷ïÏø fó wþjíHàbàÅìê÷_ýà š©‰þ8ûhõ½òWðTð!ñ3ôïüÝÌŽ‡ ¸¨¤u%úôâñó¯÷îùûÙüT¢^¹î¡—y™L©ÿýûú9ûÿ‚1œúMí®Þ8Þý!/h8ã)”  ;ÆùÂÞKÅJË Ü{í.ü7j×!ü#~K"õÁïí÷ìÍíyíÛó4‡cXTª ¿ ÍüñÎçþè¸ðúÀ,ÑO Ù o‚ ¸ýÇ÷WöHônònñ)ó{ø(ÿ`F>9ÈÞoÿBüÎúiûHýœÿSýæõ€íïä_év ^0Ú- å­þBWð Öxʽ×äwéÖïü!Þ Ï(l ~ûžcüÁðMåXávç_õ€ 2Þ)c oCúñÍîïÒí™îPóóüº¤ êC«5 ÂÿÓõ§ðïðàðûñ”÷‚ÿZ= ¬  Ãä1²µÿCü~ùÓù}úx÷ò‹ë ã3ê5 28$’ðj¡} dîÔÐXá âSÙà2õIÿ!¡%tŸj߬&í!áçâ0èóíkñ^õ ê# vhe »çùëƒâsæ‚ï ô<õý… &2œ¬$ ÷i†óËëùê¢ìVïûôÃù×ý â  ¬ Ë g^ýý¸ø…÷ôúì4äàí¤ V%ø&¼'7!„3õcãBáÂãÖÌM×™ëÕÌ X°ì Ó+¬$zÿ¤ø¡ôùêÄàÝðãtõ3p ì b/PSÐ Èþúö íöãvåsïÉõ·ûU1 ­<§-Ì8ûçó(ðÔíŠìKïaõJú}ÿ† ·»˜ ª Ÿþñ•äDßxäVø^ áâ ô7*y&ï €ñú·ñÎÞ—Ï¡Ó`ßaçDî?öwã"–#1„‰·«ýó‰ênèêÞê_ê£ðý—Yº,ÁÉÝîÓýàúê÷ÿïKëqïxôCöGùÓÿê‡ \ L Öâÿ!ùØöIööŽöø´ûxÂ÷EÅÍ]ù[ì€êmýä¾$Õ`}) §ýÚÿÿ«ïÏÝ·ÛäVê\í¿í0òpefÁpZý´ú‡ûö`ìqêðVö\úülþÍn Ë’ ” h O ¥qÿ¶ûýøˆöó?òDôt÷~ú¼ü‹ÿ§Zã·>ýœþÐý‰þ7ÿÿìþŽÿŠýûöï¯î­úâÚ‘w -òûˆv^õÂútîèÇçTêìØéµéñ-ý²× •ŒƒŽ Z ï¨Uûûöõ õƒóÿð‰ñ/öûKþ!Ñýë  p áþpôšý³úùïøõøzùŸúLû·üêþ­ÙÕ"Ǭ]‡àŽŽ5ÿùýìý¨üMüjýþüæüÞþäu¶Ì˜œpf|Ôþóü[û»ú?úãù}úûûŒý°þÂÿÈŸd¼ŠkßÿWÿÈþ§þñþlÿÒÿJìl†ný“Nÿ‹þþÿýâý›ýˆýúýsþ·þÿwÿçÿ‹&v”{<ósÿ—þÞý†ýýÀý#þ¡þÿ§ÿ¯j, Sdu ê/ãÿ´ÿiÿêþ§þ‹þ¾þ3ÿAÿÿ@ÿyÿ˜ÿ·ÿ™ÿ.ÿÿÿìþ­þþÊþÿ’ÿ;—ø„í êšT¶%¢ÿWÿ ÿÚþÁþŽþ…þµþýþ?ÿsÿ´ÿ‹ÖýÜʶ'ÒÿÿÌþÏþbþqþŒþ²þXÿºÿ,´ãMxV+à™=ßÿtÿ)ÿÿÿÿ5ÿXÿŽÿËÿ!p—ÀÕÊ­h%Üÿ•ÿQÿÿÿÿÿ<ÿmÿ®ÿðÿ6e‡ºìõ罇Qøÿ“ÿ:ÿñþâþäþëþ ÿGÿ¢ÿûÿ6rªÛîÏže'ßÿÿWÿ&ÿÿ,ÿDÿpÿ¤ÿäÿ%Nv†”’‹wT2ôÿ½ÿ‡ÿXÿ9ÿ/ÿGÿNÿoÿ°ÿÙÿ%^uÒÿBLþYþ?ÿðüï¢Gûþ½ÿSý™gýÁÿ)•þ4åþçÿ{jÿ—²ý.ÿ³îHÿFžÎýóþ¨ôû6þêÿ‹þÎ>þðjlÿåRþ2þnìûìþˆÿ¯ýëÿçþý½ÿeDoØb´·ÿ·ýmÿÌÿWývÿ@þüþ(ÿCYÿÌÿ—+nðZ1 ñÿâ2øÿñÿÿ¬ÿÿwÿ ÿ[ÿsÍþÖÿÐÿYÿ°I9æ±ÿ Æÿõÿ0ÿ«þœÿàÿçÿžý·üñþ`4òþ¯¨ÝF)æJÿ‰þÆýpýŒþUýãúÄûKþëþúýlþjÿ …'à '*œUOý¨þ=þÿwÿCÿ)ÿâþ{þåþ ÿ»ÿQIB}ÿGvŸÿÓÿÓÿBu5ÿÎÿÜÿhÿ~ÿ™ÿèÿËÿ×ÿ"¬œÁu5ˆëÿ~ÿÁÿÙÿ•ÿÿÿJÿÿÛþÿ+ÿªÿ5€’À]©o!ÿŒú øŽübÊñ€ÀÕ ËÆ•ÍØýCúé÷âøöùøiõœõRúÇýÚþ÷ÿb›íì$ ûŠÉ¤ÿþµý_ýDû]ùäù(û¶üÎý þÏþ·þ@nl‰6Çôÿøþêþ&þýEüÛûeü.ýÂýþµþ/;xtÀ&¬jzaÿÆþQþ`þXþ]þ‘ÿ$ÿ§þa’¨b»T©.=äþ[ÿfÿ!ÿmÿQÿÿŠÿµÿAüöödöýFËO6£  wˆ ¶²^ú ôkñ^ò[õõÀòùóêùòÿts•F Œ Þµ ˆq8bþNùLöýö’øÖø‰øàùþüÈöôîÑ\u—E ¤ÿÔþý£úùLù6úôúôûóü†þäù`Œ›[•ñ!èþ!þtýÍü9ü(üÊüÂýÅþŒÿÌÿ„õ3ùØ$²IÄÿ@þŒü€ûÕû¼üü8üýý"ÿ?0ºæ–3 ü«ùUù¤üÕà˜ƒ s )  ¤\ÿRý„úcõWñeðuòºõøˆúŠü¢h®œ¯É;Òãùþ4ý©ûùù†ø=øjù?üÿÿ÷·-¨<õPäÿâýðû úú úàú©ûZüÐý½ÿõáM&øl™^ÿ2þSýïü·ü®ü1ýþÿþÜÿ³uà°Ûÿ¥éTw¨SMÎÿ¨ýZühýUþuýýüý/ÿíZ£ðÿšNlØüšù‚÷]÷×üÓß‘ ©C øˆJûÞøÆô:ðZî™îò;÷”ú&ü´þÂjz  4 Ä Á r¥íüù©ö6ö÷Á÷0ù;üPn*|'¶ ùD'ÌþyüMú¶øg÷j÷ù¥ûëýÙÿé–  ĵˆypÿØý9ü;û;û†ûéûýÃþZÀ - ªq÷´îþ ü0újùlúÇû)ýµþ’ÿ.²\¾‰á÷ÿ¢ûwøõõVýÃ_ ûÆ…°¥ûÝö[ö'óÆï¤î{îVò“÷œúCüùÿ¯ý „>ä M Çϸþúé÷¦ö‘÷ù"ùÏùSüsÏb`…„9(yÍþ˜üêú(úöùùÝø"úüéý¦ÿ ³W¡–qL¶Úþàþlþ›üÒûÉú¸ú¹ûþb´ú:âPÙ]5Êÿþýùgòcî$öó 8 ©¼$\ xý‹õE÷úö òmí¶èmê†ñÎöCùOüý qé t ÃNÿþäùëõXõžö~õAõù÷týÞƒt¢šè‹ûÿnüêú¨ùæö"õ¿õÊøÛü]lÑÀÚ ä Y>^ýLû{úEùcøiù ûqüÞý¿þøÿSŠ^ïýõÓî½õ!r | q @„bz cüJö@ùMúö]ï1éƒéŒïiõ—øÈûŒp&? Ç ž ± &dýƒ÷Šõlö‡öröê÷ûšþÑù[zú¦  „åÿ8üäùtø!ùîúýüüýþ:ÿQÀMI¡ÃLüÿ"ÿ¸þ¿þÿ¦þþÉý%þ ÿ3ÈÊ&2üÝñœðÜü¦ ‘å óûæq÷ÖöoûÒûÝö&î#èê%ðxöãú”ý*+ä ‰ * ­ ' à µ ”Hü¢ú úþúyû û,úòù,ûúüÆþŒrçõÿ2Òþ|œþ®üÜü’ýý]ý]þÿîÿÿ¿ýDþ°þÿ6‡Îÿ8éÊ©_ýpù.ö-ùZ^Ø÷Q ²w`sðjýµù÷õ‹õRøÁúíúáùöøÇø úxüfÿY½I™¼šÔÏäwÿ ÿ²þþ°ü{ú¯øøwøyú4ýÃþ‘ÿ}vZIïØµÿÓþuþÍþ3ÿ$ÿÿ@ÿÿœþ_þ®þÿ¢õ(ó*þ ù9ökû‰êú×J ¼¯­ˆÖ’7Xþ¦ù”õwõ¯÷½ø øÿø—ùýùíú|üÅþå³H²˜º™ì;ùàXÿþý‚üûûðúsúûÎûÎû1ü¢ýFÿy꟒^æÄŠ5¬2ÖÿYÿçþìþlÿûÿJ,ÕÿÖÿ%3d¯íí¨ŽFåýÉø}ösûIbÏC ë)p ¯IÂvüø´öÇöböÝö4ù‹ûÃüDý|ý3þ"õ߀ž¯ ¢½ÂOÄj@™þfýÕüyühü¶ü¥ü4ü+ü˜üâü.ýåýÓþ¿ÿ™Î³Õ‚Ò-é9Ž„ÿÿÖþêþÿMÿ}ÿ^ÿ_ÿ ÿäÿ[ÿ’ýlü¯ý£ÿŽùˆ>é-N —zÿÌÿLŽÿýý³ü¬û<úùqù·ú ü?ý7þ0ÿ'àeû-Ö_´_žØìé hÿñþJþNýoü2üPüOüYüìüÐýjþçþbÿêÿ”$u©¹‚¾ªŽQ=5Üÿ&ÿ„þ_þÆþeÿ´ÿõÿoˆ=.Òÿ ´ê”^ZÕÿÿàþyÿ þÿrÕ·<.ksWÙÿ¦ÿDÿÿ%ÿÿ™þ%þ!þfþ­þÿyÿ1Ê#(ôÛÝΛW+Üÿ›ÿœÿ£ÿ’ÿŠÿÿ’ÿœÿ€ÿiÿ~ÿÅÿäÿëÿõÿÚÿßÿðÿüÿëÿ×ÿàÿíÿëÿæÿ×ÿÙÿîÿëÿáÿßÿÏÿÙÿæÿáÿÚÿ=Pad[eN, îÿÙÿ§ÿœÿ°ÿÆÿðÿÿÿ9*ôÿ…ÿ%ÿÿÿ6ÿUÿ¸ÿ1´½Ìݺ|Äÿ¤ÿ{ÿpÿ„ÿ¢ÿÙÿ%Úÿ‡ÿKÿ,ÿ(ÿ2ÿRÿ¤ÿUƒ›©£y1 ûÿßÿÐÿÌÿ×ÿûÿÿÿÿÿûÿøÿçÿÌÿÆÿ¿ÿ¾ÿ½ÿÅÿáÿðÿõÿ ''  õÿíÿîÿñÿüÿûÿùÿîÿßÿÕÿÈÿÁÿ¿ÿÒÿÚÿÕÿÐÿÂÿ½ÿ·ÿÁÿÎÿ×ÿêÿêÿðÿþÿ $,28* øÿíÿãÿÜÿÓÿÓÿÉÿ¿ÿ¸ÿµÿ½ÿÁÿÓÿèÿþÿ!'' üÿñÿçÿÝÿÚÿ×ÿÜÿÝÿÚÿÜÿÙÿàÿçÿèÿôÿÿÿ  ùÿîÿêÿæÿáÿãÿßÿçÿ÷ÿüÿüÿÿÿôÿëÿãÿßÿÝÿçÿíÿäÿ×ÿàÿÖÿµÿºÿÌÿÓÿëÿôÿêÿàÿÝÿçÿîÿæÿçÿíÿôÿøÿüÿþÿ  õÿòÿîÿëÿèÿðÿõÿôÿüÿ þÿôÿíÿèÿæÿèÿæÿäÿÝÿÐÿÄÿÉÿÉÿÏÿÙÿæÿõÿ   þÿíÿäÿáÿàÿáÿàÿßÿßÿÝÿæÿáÿãÿçÿÙÿÆÿÒÿçÿàÿäÿðÿäÿíÿîÿîÿôÿüÿüÿ÷ÿõÿêÿæÿßÿ×ÿæÿòÿþÿüÿôÿðÿäÿñÿþÿ!*$þÿùÿÿÿÿÿûÿ÷ÿðÿèÿæÿàÿßÿçÿêÿôÿðÿëÿàÿ×ÿãÿáÿßÿÙÿËÿÅÿºÿ¿ÿÆÿÉÿÙÿáÿðÿüÿîÿæÿçÿíÿõÿ ÿÿ ùÿõÿùÿðÿòÿðÿíÿîÿíÿèÿæÿÖÿ»ÿŒÿ$ÿPÿ©3”ü]ý4öüt< Möbù4üô_›gñ>ûö÷9ñDX }õøçþ^ ÿ÷ýù>ý ýø¡peùfó?úõP÷! ð8øñüiþLñú0ÿûÑü˜¢üéqþh¦ÿfûüÅû˜kÉø³°ûÁü(üÅØýº ¸ý«þ±Úþ¬üEþV§˜úŒëþ²ü»¨ü¶Xÿæý*›úÿ˜õù…Úýcüá(÷Û‹õk }õçÿ‡ äð– ÉúhøŒRðÒ0 yñ² 0ùÎø² ö^ÿù¦ûMë'Hý7“ý¡ý|ø,Åú =ý¶ýßìüOIÿ »úO(ýZIßÿOýS"ú—Ìúîÿ¢üV£ùןWû Éÿ×üÿüsÃû B«ý±Zý¿üûÇüÏ(ÿ€úgbáAýjüèþ?>þ+üKÐýJÿåÝþœÕû¬Êÿt‹þ§ý9ÿnþJ+ÿnýâþoå÷O2døz¯ý_ýFKôZ`ýY÷~=ýeñ¢öKÜ5!†÷´êk ôû{Õý#·mú„µü"!Ÿµùèÿ8ö{ °ûùøâ2úÿC úñ ¾ö~ÿÓ ²ñ%"{õŽÉù[ö B8ö¦oõù•Ýü›ÓþYþ 9û"‰IøI WýÂõ$Aù|ž¥øSÏû}û_ =ûÊþ" -ü“®÷´á“ü0>ù|üÌBülýõú‚)ª½ýáþ_ 5ýþìüõ4ý}ùÐüD`l÷Ì–î†þö`xöGûL£ûj¡ùw Ëx÷€Rúû‰ñú0þ…ÿüÉ¢ÿCûWý‘ÐüSŠÅÅú¿óiþÐùè*ü͇ ;÷ý ü]ÿÿ¡ü‰›ú<)ÂþÝùdý¦ÿ÷`üàúmÿvæó»ÿžñÿŸ-Ñøþ EýÒÔý»þ’Aýl5zÿäóiÿ ýþÙüÏú§ÿQþŽÝÿÍ7›ünKþõþÀæýCüþ[þC¤Ä(ÿÿLþorû“ÿ“Aý´‹=þŸÂÿ÷ûu÷Nô^ÿ ýnü9·;±=?Úÿ¸þÄÿÂþ¥ýçvÿž/þ¦üÕüFúÑûHý¹‚þ×Kº-ÓþþêR¡õáÿ .Á8ÿÎÿ;].Ob´ûqüÿÊý×þ?ÿ˜ÿ3”üú¸ÿèªiÿßúÏþöþµBj£èð3ÿH°ÿaüÿpùËõÃ÷ƒ÷7ø÷8ø_þ ±çd : ùFÿÿ&Nÿ[ÿÓý9þƒ«ýšü«þƒü²þˆÿôü³N@¶ ž)ÿþËûýü¬ üwðïáüF 0ý* ¬p@q# 6 J@öŒõ*óôgù?ðáé)ògùÃüxü ü@ ü Kg×<b L¦ÿoÿ+›ýwúröJ÷û[úYúÆúªú½ÿT™±)(¸ÿSý,ý9ÿ2ãü—ñÕåšñ; l –õ!þe $˜¢ømhŽ  yðîï¢õîâñ›ñ^çªéöñæûMÿø»ÿ Ä o€©Þ(¼ xËü$•úAõõfðPóY÷ ôAø«ùNû¦"OU«P ß Žÿ0÷á»Úû[}ÿê uu% Roê ˆkƒã©ðUó†òðõ'âußéï¦ßñ7\†¾ ýQw¿ù²üJ¥øuó‡ë"é`ôïò1óé÷dòü, ù@¼Lk¾a!ö;Ø7ß–Íé×òÞ 6-"Ãdä¤ÿÊ+VíJçöõ;öàæ&Ýñéyëmø¢Óøhøt D±} yp^¿ú©¨üôï²è¥õøTòoõxòõÆ4oM–ÿû T÷줟-:ýñõÞ$ào ñêC †µ#_÷ÿè µm x ôwáCñÊöWûéÂ×pêMñ=öÏ3þ¤øª¤ò÷´–´ $vû§þÖûüù¹íñ®÷føYúÏöA÷ÿˆ­\ig åO‚å÷ý+üsúhöGçùÞúºÊ횲ث† Ï oàüšèñé£ñ+úCòAÛãÛò õ…þ~þeúñ E¶ôR¯øÿNev®ÿ°ð€íXö²û+û”ð ðýûÿ̬–ýo Í n ¼ ÿd^~3ÿàúîý†üùö‚ç»á<úge DïIýBÐ"ö^9 A ‘›õ¥ìžéFðpýôÜkãHò÷û`ø·úîªEœ«Lqzï]ý6ó ñÄò4ùAùÕíïöù¹þP«ýAþ¢ÂBü œrwÙÆS:þ?èü0÷àïlçåìq†ºü<òšv±@8 “ W ÷ ÔùÕð°ðäô þ íÖßìõâû’ø!ô»ýïü ³  ÇBí“ú= ?/•úúPø<õÙùøööñaó(ö±ýÿ¼ùý|>nDÀyŽš¥€¤²‡.&úŒ÷Žòê…í) ©ú~ðm•® †%ò0  ¥ý’õô-÷‡ŽïeáŠì„õûfõØðÕûÐþ¿. q1¯Û rWm@  > ZýÀý­úé÷Çûêöòò»õâýûIöÇü©µ™éU¼œ™7àî{¨þ¹[ÿü;ø­îê$ñÇ @ö‚ôHgGš`  y 1û×ølô–ú ÿ•ê æòï›öûéð<òÒü^ügÕˆ÷©X› Y3 ï k ÿþ¯ûçúû¦õ)óvñ ÷.ü÷õÝô‘úk†Ýÿ’jmíÃåõ¦¬ÿ¨ýîÿèÿûoö¿ï êõ< á àôGö Pd3jH¶ % ¨û÷Iöxü°ü%é±åƒò—ùaøðó#ýcþdv_Z%ù  ¶ ÛÉÿ¦¸þ ûzûì÷öó2ôá÷ðúF÷‹ôú_!þñþŠ/of‚'dÖ Gþ>Ejþ]ü3úäôÝïüô~f Uù¢öˆ ñ•Ù‡É  ç̸þ®÷}ú&ü¾úóëòKþJù^ò@öüL Ÿþ`ÙbÀ  ÌÉ* > öÿ¿×šþÙú¿ùàùAúùùúÿùúVýiÿþAý"ÿju ߃}ÀLÙVîþ›ÿ&ð—ý‹ù¤ùžX 9~ô^÷{þ tøWûAæ #|öOø$© ýêõ½÷ìþÕõÿçú˜úÑþ"Þàÿÿ€RÑPLìá!Žþ“ÿbbpÿ¢ýÛýÄÿ%bþþ³ÿ9˜Ûþ=þ<ÿph\ÿþÿþÎÿ!©ÿÿÿfÿñÿùÿŒÿ@ÿ–ÿ[ÊÁ”—ì+ßMÈÿMÿýþÿjÿ[ÿµþÉþNè?˜¢Æ$,ÿ²þ³ÿ*òþ…ýýÿpëÿ>þÀý)ÿ3oÿùýyý~þÅÿÎÿàþ­þÝÿS©ÖSêÞý(b£{¹+€sø'y…ÿ9ÿzÿpÿåþiþHþþÅþäþÏþ×þ:ÿ©ÿçÿáÿËÿçÿ1 ùÿ,ùÿ ",×ÿ{ÿ{ÿðÿ8ÕÿˆÿVqU€P†žÙÿ×þ$ÿ½ÿ,ÿ½ýý¹ýÏþÿSþ»ýþÂþ$ÿÐþ2þŒþ™ÿNFž˜Üv}ÕêoÀ•¾¯F¾ÿŸÿËÿÕÿ–ÿ+ÿÿbÿ‹ÿiÿ2ÿPÿ™ÿ±ÿŸÿ„ÿŸÿÒÿòÿÌÿœÿÿ¦ÿªÿ„ÿbÿwÿ§ÿºÿ§ÿ“ÿ±ÿòÿ$+N„Ÿ”va/ÜÿÜÿ*BÝÿI2µqãªõZÿzþ¨þ ÿÛþ0þâýGþÿhÿÿ¾þýþ§ÿøÿ·ÿYÿsÿøÿSJ(NÄ àÊõþ´‡­Ò´e/2 ÙÿÿYÿhÿqÿPÿ"ÿÿÿ6ÿAÿ:ÿ9ÿQÿ€ÿªÿ¾ÿÁÿÙÿøÿ,  ÿÿñÿøÿøÿõÿ 8IWdkvb*Úÿ¸ÿÚÿðÿ½ÿ’ÿ¿ÿZôõˆD„Àrªÿÿ ÿ:ÿ+ÿÈþfþsþìþYÿ^ÿKÿlÿ¿ÿ þÿõÿ/vsUeˆ¢˜ylyyZ/+DhnN5+3%ñÿÅÿ½ÿ½ÿ¦ÿvÿJÿDÿMÿCÿ3ÿ0ÿ7ÿTÿpÿ“ÿ°ÿÎÿ!.FPFF/ ùÿ÷ÿüÿ  îÿàÿÜÿÖÿÖÿßÿõÿ ñÿËÿ»ÿÐÿíÿäÿËÿÝÿ%±wDIiaÄÿ˜ÿ¢ÿ®ÿ¢ÿcÿ=ÿMÿlÿvÿhÿTÿ2ÿ ÿwÿô‰Ëÿ/þ4þ2ÿØ‘û4 ÿÉýÍ/úýâýPÿjÿ°/ÈhýcüGþa¯Õÿ,þˆý}þ à´ÿ¿þåþ  ?Aÿ,ÿ—bN˜ÿÁþÿîÿºŠ' „ÿyÿÙr³ÉÿÏþ›ÿ<ºËÿqÿPÿÎÿþÿèÿîÿ©ÿÿþÿ1ëÿyÿcÿ¤ÿ_£Èÿ{ÿêÿQ ÿ5ÿ5d8äÿ ÿpÿn ÿìþ‡”/¦ÿNÿÄÿ¸ÿwæäÿyÿ€ÿh}©ÿ˜ÿ¹×ÿ=† ÿD'®þ÷ÿáÿÓy6âþfÿàÿ]õRý¤ü°û•ÿˆmþRþjêb Ýý¡þkÌ2{ý†ýØSåþ¨ý #‡ùü3‚ÿîþ^ÿ0:2ü9þßÿãl™úþXcýÅþ²¶Qàÿ²þ·ÿ^ÿ‘¢hÿqýDþì¶.HþGÿŠÿKÿýèüþðˆž>þ.ÿ¬©Ëàþ¨þS7ÿ ñþ®þl„“¤ÿùüFÙþ¿þéGÿNÿÀ»þ¦¶¦üFÿ3%’0Æý¹ýt†£þÿîÿwÿd¦:þRþÉÿæ÷+‰þ|ý|´~ÿ$×ÿ-þ.ÿ  !þüeF[1áÿûþÌÿ£þ‹PÿöüÞýn œÿ÷üÞþ¸þáþo¾Éú8ý‹ ëÿøú;çÿ$ˆÿÛùB@Ýþþ²‚1b»þýýX1¾þÌþ‘…ÿ­þê1•ÿIHÿyÿœJ<ãJý$ýý`’þvüÖþ@ûþ§Á­þ1û\gý(?£ÿ‘ÿþO€fý©úÚÿo)H§ýáù½úv@zðÿ0úsü–…yþÿ¾ùJûnüôqÓþýUþž·’]þˆû½û³¤ÿ|ýLý5ÿ¨aÿ†þ[ÿJüJüQÿñŽFüñþf¡g]ËÿÒÿ?`±RÿÇ*òþëýAÿ¸þ’û]ýSýäþcýÆýÞþSþM,â0uýJþ Q°¾[rýýý_,vü—öž÷ƒýÒŠL¨þ¨ü›ùpþPÿIêÿ¡ýƒü¾ú´ùÒú$üý³ýTü6ûÚþ ²e‘ÿO­²†çOØãÿ ‘2ˆÿ+ÿ‰ý*ýqþºÿÿóühûUýߦÿ¦úýZÀþMüÎTäÿÿ>)ÿÐþ¯¬Qo=9ÿ0ùðtõ3 M³ýAú Ë< ÒG~|™ýÛþÅþ@õ£îÙñöhúîúÄö¹øüÿ3¸ÝRòbR! ÞĹþ¡ýaÿ¼±þ-ü¾þõýˆúªú¥ûýlþ²ü÷ûâý¨þt†îÿOþbþ+j!LþÜß6œàéûûŠ"–ú6ìöèÑûûê¶ûÍýÓ   Ä•û€÷?û‰Œù_êÐå‡êXôøûøôöýüeˆ5 S-sQ &³§Ó Êæû üM†þû¨ùÒõó{õÿösú¢ý¥úCùuþG™ ¢`Â÷æˆ5-ºÿº^ôûQúüòý‡™þ›ñØãzëÞÖ@ ø¾O‚›ö ìMüø[ôþAþ‰êˆÞPâ½ì ûoûñ'öÿ Íêx ßDå¦)þñùn ÿé÷ ö‡ñGîñó¹ö¼üJúŽ÷°üûÖã Š¥ìº—ÑŽºvüþîÿMütú&ú0úÄýÆüŠðNà>ãS¿!—[›ö 1)›#g3 ÿýâü·ôÂú.û®à¨ÓÌàäïJüúö¹çòòáO l3½©ûµ ?¢eŽùšýßüäðGðíîZòúò8øèù\ô*øMÚ FÙ· € –åBãü]þvTünööÚønþ¯ûÒïßXߤ+À²þ­ñL[2í-}¶ý üa*öÓøLö&Ô$ιä/ôšü“íâÞøõ ryÍùö”('¿÷Ûû*ü, ¹î<åŽëî¸óºñHïÒö;ô£ô#U  ?Vþ Ñ ¤ ¤>þ@û}þ7ù3óöîø‚ü]üøµü Ÿö&ä0àbˆ0q êùpõ-5},vð5.ÿÑaõLòáíFÎ]ÒºïöïààAã7y  i ô3ƒº™$^x1° Ñ Ñ÷"ã1ì´ôªð@ï%ë®íôøñ¹û $£Æ rŠ´{" ™ÝxüÅûJúˆó+÷üÙ÷­ôNôœûŽdüîøIëZã¤ü×(/)YýíH2A5–lô³d q 2û:ê%é¨×^Þªø ôãÑÙè? äâýûÚµ® áŸç¯ f þÚ×ÞïnîPýõë“ãƒè¦õ|øròõñúWýÒ 3   ÿ gå£QþÙ­ÝÿPø]÷µ÷>øìøÿùðûÎújú¬ÿ§ ýoìõàzþ®+Ó³ñ—ñ+§2ß),ù)ø  å Úøké¢íïßTïçÿMæóØ,ßÕö¡ÿûëü l‘~ Ê D‡ C™ú¢¿ Ðó®è*í™õäúºð/ëûñ¶õVüÄÿæýëþºw ³ ·¾þDýÑý“þJ<üYø÷&ùFÌûˆønñ»æôظ_öðŸ h)+¤ü«ô΋Fý;ì;öÜëpó…ÿsæ'Ýã÷ü ˆõ™éÅû' …É 9ñ™„\ $»±ö[õÝó¥øýaûÉî_ïÊô,ôCù$úã÷GùpûÝ?|@ ˜ É!‘¸.HÿÀý–úƒü|xýŽú(ûpþÿÞò)ê/þW ùwúKÕ@jÿjwRÇsö,ëùaûOòCìHé¥ößû4÷Cü•þÁÿäßù Ðh½   –ŠfW8q­ÿ1ý›ö<ö±ú»ùOùµ÷=ö«ø7úèý5;ý ýñÿ‰„cÉÿÇ`7ˆ¥ÆÿWe¸þ"þïþáÿþSÿÁùZ÷‚þ¦Âé]þ~þæ3u±ÿMÿ?ÿÆý‰ýaû ûáúéûþwý-þ]¾ +ßn]J¤±C †×ÿr’oÿqÿ|†³ÿsÿ“ÿ"SÕÿWÿÑþÅþÉþ„þâýƒýþ¹þÖþ‰þÁþ´ÿ•ûCàyyâ·ªJ›ÿÂþþÍþñþ¤þGþgþÿÆÿûÿ›ÿ+ÿpÿ]û.bȬae#îû‹òÿ@ÿþwþ\þþ®ýYý{ýªýþlþ þøþsÿ´.`¨*Ñj@> ûÿ°ÿŠÿsÿJÿÿÏþÃþÿTÿpÿjÿ“ÿ!”­¬­·±/Áÿ\ÿ6ÿ,ÿÿïþ¿þ¹þñþ9ÿQÿlÿ©ÿ_¾ñ+.Õ³˜^Ðÿ£ÿ˜ÿ›ÿlÿ2ÿ/ÿ<ÿKÿmÿQÿ/ÿ[ÿœÿäÿ÷ÿ1XŠŠvaesU,÷ÿ¾ÿ¢ÿ–ÿ€ÿeÿ\ÿpÿ‡ÿ˜ÿŽÿ¦ÿÒÿñÿ<n€|ƒ‡oZ5ßÿ¬ÿzÿbÿeÿeÿcÿbÿpÿ˜ÿÆÿ Jiuz‘ž‡^="äÿÈÿ­ÿ¤ÿŽÿsÿsÿvÿsÿÿ³ÿÜÿÝÿçÿøÿLM@=1* ÿÿíÿðÿãÿÒÿËÿÏÿÕÿÁÿ¬ÿ£ÿ¦ÿ½ÿÆÿÈÿÎÿÚÿ÷ÿ2B28?GJ1 üÿÖÿÂÿ¿ÿ¢ÿŸÿ’ÿ…ÿ™ÿ­ÿÌÿßÿîÿ ,BD,"üÿðÿãÿãÿÒÿÚÿ×ÿÆÿÌÿÄÿÉÿÒÿÏÿáÿäÿßÿñÿ (%.1,38 ðÿðÿëÿÝÿßÿÅÿºÿÄÿÏÿæÿÖÿÚÿãÿçÿèÿÓÿÐÿÒÿÄÿ»ÿÆÿÚÿëÿíÿçÿôÿøÿèÿÝÿãÿõÿB819ëÿèÿñÿÖÿÈÿÓÿÏÿÐÿ ‹­Îÿ7ÿ¾ÿûÿÖÿÉÿMÿQÿ¿ÿÈÿðÿ2eLÌÿw¸ÿôÿËÿÄÿùÿëÿ°ÿGÿ˜ÿôÿÕÿYÿ¿ÿ5îÿ÷ÿ¸ÿàÿÝn´³ý2ÿ)k™ÿIýàþçÿùÿ“ÿÀýÿ  ÿIÄÿTîË7´sçÿ6žÿÈÿ^ÿTÿ*GÿCÿ}ÿKÿ›ÿÁÿ5üÿ¢ÿGûÿœÿ<N•fv;bèÿµÿ‘ÿÙÿ±eÄÿýþNÿ’ÂÿÅþ®ÿÎu ÿ†þÿãèþ.ÿ ÿàÿ6‘ÿ¶$„ÿ¾”îU’ÿÿÿ$¥<ÿ™þÎÿUd’VþPÿK¾Aÿ.ÿûþê]G7þ~ÿ S¢ÿ3ÿÉþìþ‚ÿ<àÿÉýIðŠ Êý¬ÿµê!ýþÉÿœþÿlŸÿÌÿ*dAýÿ¢­ÿœþ™ÿXÿ˜ÕÿŽþèÿ‡ÿKÿÛþzÿÈ¥sÿ®ÿf£ÿ/þ½T»Mÿ©ÿdÿ¢ÿáÿS?0ÿtþyÿ s þxþ+‡¡Õÿ þ°ÿ¢ þEþÉÿå¬Büiþœ‘,ý.ý— êþ¬ýëÿÛæKþ3ÿ½˜8ÅþöþªÉÿÿrñÿ9ÿŒÿŠÿŒÿ ÿÁþhÿ8•ÿ è·Âÿ. lüþÿl­ÿ þþXþ±þ[þÂý~ýKþ¾ÿ¨þùý }_5L*Ykææ¥Ö’ e‚ÿ´ÿ mÿþÿÿùþ=þ²þ»ÿ@ÿ†þïþMÿÿÿ“ÿ¤ÿÿ^üÿÄÿÕ”³™i|¦ÿÐÿ­§ÿSîÿüýëý ýòù]ýÍÞþ¿ù£Ãž•ÿåxîNýN¸Îý‚ý^üýuüùúú+ü8üÝù9þ©Òÿ'”ZŒÉ‘ÿ %–yÑê±9ãÿèýü»ýKýêû„ûôû*ýÑü—üöýáþÿ~ÿøÿ‡8ÃïKÞsÆ9Õ—›¿ÿõþÿþëþ}þþ&þ‰þfþ_þ¡þ$ÿTÿòþÈÿÖ5uÈ Uº¨%Á=ó3bÿ‹þþlþýÞüýIýþþÚþ[6ÝWÄt¯I¦ï ƒ¨þÝý‚ýÐÿ5WüXÿÔ£×ÿɉñôÿ-æsþüýüÕü8ý°úûðüqý†üÐüw‡yÿqc ¿É5ª7ÚêðWNÿ&þ9þüýËüÐüèüý0ýÒü¸ý„þxþ±þUÿ_],&¡xa¯¬MH ÈÒÿñÿvÿÿÿ?ÿ$ÿÖþüþ:ÿ.ÿ2ÿPÿ¢ÿÆÿÉÿ[X^ÄdžÿÅ';ã­ÿ¦?0ÿ¸ÿºÿCÿÉþNÿ0ÿzþHÿ¾þ¨þhÿ«þÿˆÿ›ÿãÿÙÿÁ}ˆM¥2;´M´_?.ÿÿ$sîþ°ÿ¯¬´°`ÙüÿnÚÿ`þýÿýˆýñûküßü¢üýOý‚þbÿ™ÿ;*3þH‰~Xlxq—¹#F+ÿ ÿ†þ™ý\ýZýcýý$ý±ýéý þ)þÁþWÿ?ÿœÿ?˜°ÑW‡u„¤¿^ÊNäÿßÿÈÿDÿÿÿëþÁþ¨þîþýþÿþ,ÿlÿµÿÙÿk£°¶çíº­¬•a; Áÿ‡ÿþÿ¾ÿþ¿ÿÀþMÿéÿˆÿ"Cÿ ™ÿÿæÿÚÿÿKÿ[µÿ[ÿlC‡LãÌzŸúŽÅÿT;^ÿ@ÿ‚ÿ0ÿiþ+ÿøþÍýüþ™ÿMÿ%¬æsy7 G‘ÿœþ‰þ ý'ý¿üý.ýü¶ý#þQþÿYÿr›í¹…?Þ"—µI#ŠÏ»‹ÿâþ’þtþ¬ý±ý¶ý§ýµýý%þDþUþÂþ.ÿ³ÿ¾ÿ.¯Î8†]jLά˜8àÿ½ÿ„ÿ?ÿKÿJÿÿ$ÿ:ÿGÿ=ÿQÿ~ÿ¢ÿ©ÿ»ÿ 1L]Q^}pfel]<;+ äÿÒÿ¸ÿ‘ÿyÿ}ÿ}ÿwÿÿŽÿ™ÿ–ÿŸÿ¬ÿ¸ÿ§ÿ‹ÿäÿ’ñÿ9ÿ$*FÿÏ>i"yB7ÿ°ÿYÿ²þœÿªÿ®þjÿ›ÿ³ÿ¿ÿ’ÿ„^|س/´ª'÷ÿ pÿ€ÿ½ÿÿ^ÿ.ÿÿ×ÿÿ=ÿ¾?íÿ<óv ^8(lXUÿäþÿþþ%þþVþUþ@þ ÿDÿ6ÿ»ÿ@esã7Yq”é¬jƒQç‘€.¦ÿUÿ$ÿñþ¤þ‹þ²þ¨þŒþ¹þòþòþýþHÿ…ÿ˜ÿ±ÿùÿ6=]¦ÌÇÅÛÑ›Š‘i9äÿ§ÿ½ÿÂÿÿˆÿ„ÿŒÿ€ÿ{ÿ“ÿ¦ÿªÿÂÿçÿøÿôÿüÿ! ÿÿùÿþÿòÿÖÿÉÿÓÿÄÿ¿ÿËÿÕÿÙÿÓÿÝÿçÿæÿëÿ÷ÿÿÿøÿ÷ÿþÿùÿøÿñÿÝÿÉÿÉÿÈÿ¾ÿÁÿÎÿÎÿÙÿèÿñÿùÿ!*+///'$ íÿàÿíÿçÿãÿÚÿÅÿÅÿûÿßÿzÿùÿ sÿ U˜ÿ3,Öÿ+ÏÿÌÿ§ÿ‘ÿæÿªÿmÿÝÿ»ÿŸÿÝÿÎÿäÿëÿäÿ,1L 5õÿÚÿÐÿ°ÿ¸ÿÐÿ¢ÿËÿßÿÌÿñÿæÿ;+ifD‡bXf ñÿ¬ÿÿlÿKÿÿ$ÿÿ ÿ"ÿ)ÿfÿ“ÿ¤ÿàÿ JnЍ¶ÏÖÏ˰oS ûÿÖÿÿŽÿzÿiÿeÿXÿXÿiÿWÿPÿiÿNÿ^ÿyÿzÿªÿÂÿÖÿþÿ $<BMZeU_Z<<*ÿÿêÿÚÿÄÿÆÿ±ÿ·ÿÅÿ´ÿËÿÓÿÕÿñÿòÿòÿ "ÿÿûÿôÿüÿðÿøÿçÿÒÿáÿÓÿÄÿÖÿÄÿ¾ÿÏÿÉÿÄÿÖÿÝÿÓÿæÿîÿÝÿÿÿÿÿáÿüÿñÿãÿûÿòÿàÿòÿÓÿ ôÿáÿüÿ÷ÿüÿûÿ ûÿõÿðÿÜÿÐÿÙÿËÿÖÿæÿ×ÿëÿðÿùÿþÿñÿüÿõÿñÿÿÿôÿðÿôÿôÿôÿßÿæÿèÿæÿîÿíÿßÿðÿûÿëÿùÿèÿæÿøÿÕÿíÿèÿÖÿßÿôÿÙÿßÿðÿòÿòÿèÿîÿÖÿßÿÙÿÌÿÂÿªÿ]üÿçÿ.Öÿðÿèÿ{ÿÝÿ¿ÿÿàÿ³ÿÙÿêÿ $íÿ çÿÐÿðÿ ÁÿëÿÚÿ»ÿëÿäÿ øÿ÷ÿ, =þÿ Ýÿÿÿüÿõÿ÷ÿáÿçÿÒÿáÿêÿÐÿÝÿÏÿÈÿÌÿáÿÝÿËÿòÿÕÿÌÿñÿÚÿðÿëÿñÿüÿòÿ ÷ÿÖÿûÿÉÿÎÿÚÿÅÿòÿòÿûÿÿÿüÿÚÿëÿõÿõÿ þÿþÿÉÿñÿàÿÖÿÕÿÓÿ ðÿ6*üÿÚÿþÿêÿÝÿ÷ÿðÿäÿÏÿçÿÙÿÁÿèÿæÿôÿîÿ÷ÿòÿÄÿÄÿßÿáÿèÿäÿûÿøÿçÿîÿáÿãÿòÿ üÿüÿêÿÖÿáÿºÿËÿîÿÈÿÖÿñÿÕÿÙÿæÿçÿêÿõÿíÿáÿ íÿôÿäÿ ôÿÜÿüÿ ÷ÿõÿ ûÿæÿîÿãÿÈÿÝÿëÿîÿôÿûÿíÿîÿøÿæÿíÿùÿ (íÿÿÿÎÿàÿÌÿÂÿõÿîÿÏÿ×ÿîÿËÿ¤ÿ»ÿËÿ·ÿÂÿ%Sûÿd»ÿUÿÒÿ±ÿTÿ»ÿ!õÿÆÿòÿùÿ™ÿ°ÿZv[C]M!ðÿÜÿæÿºÿzÿ‹ÿ§ÿ›ÿ ÿÙÿùÿßÿèÿ' F(?*üÿñÿëÿÜÿ»ÿÈÿËÿ³ÿ½ÿ°ÿ¬ÿÅÿÄÿ×ÿðÿêÿûÿ÷ÿøÿôÿõÿêÿÖÿÈÿäÿãÿÙÿøÿäÿÙÿëÿãÿÖÿñÿûÿßÿîÿ íÿßÿüÿîÿõÿ!ÜÿÿÿÉÿßÿùÿ×ÿÉÿèÿûÿíÿüÿ. þÿüÿôÿðÿîÿîÿÖÿëÿõÿçÿîÿøÿÿÿñÿëÿòÿãÿáÿôÿòÿðÿüÿáÿëÿùÿëÿäÿàÿäÿäÿÏÿßÿòÿèÿæÿôÿõÿãÿÚÿíÿãÿãÿîÿîÿèÿÚÿÕÿäÿÐÿßÿôÿñÿüÿùÿøÿîÿßÿèÿõÿÿÿ÷ÿðÿêÿðÿÿÿôÿòÿõÿôÿþÿ þÿõÿßÿÕÿÜÿÎÿºÿÒÿ íÿ5C"+þÿäÿùÿÐÿÐÿáÿèÿÓÿŒÿ•ÿ™ÿ‹ÿ ÿÁÿèÿäÿñÿ3+$FUJ.ùÿæÿÉÿÈÿ¿ÿŸÿ¤ÿ½ÿÂÿ½ÿ·ÿÌÿÙÿÅÿÁÿÚÿÿÿ'! ûÿôÿêÿôÿ äÿÖÿÚÿûÿ þÿüÿ òÿ%àÿÈÿºÿÂÿÒÿÜÿðÿõÿêÿãÿäÿîÿûÿñÿëÿøÿûÿ÷ÿíÿßÿÏÿËÿÎÿßÿøÿüÿ ôÿëÿèÿòÿîÿæÿðÿáÿ×ÿèÿêÿíÿàÿÅÿÅÿÕÿèÿ þÿÿÿùÿáÿÖÿÄÿÅÿ×ÿçÿõÿòÿðÿðÿõÿ üÿêÿÝÿçÿèÿñÿçÿßÿôÿÿÿíÿÜÿëÿÿÿ ñÿÜÿ×ÿÜÿãÿþÿÿÿßÿÅÿËÿ×ÿçÿíÿëÿêÿÜÿÌÿÓÿõÿ÷ÿîÿèÿðÿ ÿÿòÿêÿëÿüÿÿÿþÿõÿãÿÝÿäÿäÿëÿêÿáÿÝÿÜÿ×ÿàÿñÿÿÿûÿêÿáÿáÿëÿþÿ  ûÿ÷ÿôÿùÿôÿòÿòÿõÿõÿðÿ÷ÿ ÷ÿßÿ×ÿÓÿÜÿèÿêÿäÿàÿÜÿÝÿçÿòÿçÿÝÿîÿñÿðÿáÿáÿêÿðÿøÿèÿçÿäÿáÿðÿÿÿõÿëÿäÿáÿíÿîÿñÿûÿÿÿøÿòÿëÿàÿáÿßÿáÿüÿøÿ÷ÿûÿñÿêÿíÿõÿ   ÿÿøÿëÿãÿÚÿáÿîÿîÿÝÿÉÿÂÿÎÿÒÿàÿíÿôÿ÷ÿüÿÿÿòÿîÿûÿþÿðÿÝÿÕÿ×ÿçÿøÿøÿôÿòÿòÿñÿêÿæÿãÿßÿ×ÿÕÿÒÿÏÿæÿÝÿßÿõÿñÿèÿäÿèÿ÷ÿ÷ÿñÿ÷ÿüÿ ùÿðÿðÿñÿíÿðÿãÿÜÿÝÿëÿñÿíÿîÿëÿêÿèÿëÿîÿîÿäÿÚÿãÿçÿèÿõÿüÿþÿùÿüÿ ùÿíÿçÿÚÿÎÿÂÿ¿ÿÁÿÂÿÕÿáÿãÿàÿáÿîÿôÿòÿ÷ÿûÿþÿþÿñÿáÿàÿçÿêÿôÿòÿüÿþÿüÿëÿçÿõÿõÿñÿñÿîÿêÿèÿäÿäÿèÿçÿáÿÜÿÜÿÝÿÏÿÒÿçÿòÿûÿøÿøÿùÿ üÿûÿòÿõÿøÿäÿáÿÝÿÕÿÒÿÚÿÚÿÙÿãÿíÿüÿ  üÿõÿ÷ÿøÿòÿçÿáÿäÿÝÿÖÿÏÿÉÿËÿÏÿÆÿÆÿÅÿÉÿäÿçÿîÿõÿõÿùÿþÿûÿþÿÿÿþÿøÿíÿäÿãÿäÿòÿëÿãÿäÿêÿëÿðÿþÿùÿòÿøÿ÷ÿùÿôÿñÿñÿòÿêÿæÿæÿáÿáÿÝÿ×ÿ×ÿÙÿÝÿáÿáÿàÿäÿäÿÜÿÓÿÖÿæÿðÿîÿùÿüÿøÿþÿùÿîÿçÿßÿáÿíÿæÿÕÿÚÿßÿÙÿÜÿßÿÚÿÝÿßÿÝÿèÿëÿðÿûÿ  üÿõÿêÿæÿßÿÓÿÜÿßÿæÿèÿäÿêÿëÿëÿñÿõÿùÿÿÿûÿ÷ÿîÿáÿÜÿàÿçÿæÿäÿäÿñÿ üÿþÿõÿßÿÐÿÉÿÉÿÈÿÈÿÄÿÅÿÄÿÂÿÆÿÌÿÏÿÚÿáÿæÿðÿêÿÜÿîÿþÿ '"%"" üÿ÷ÿëÿàÿÝÿàÿáÿáÿÝÿãÿàÿàÿäÿäÿæÿßÿàÿÝÿàÿáÿäÿãÿàÿáÿÜÿÜÿÚÿÝÿäÿñÿøÿòÿêÿôÿôÿêÿàÿÙÿÕÿÎÿÒÿÕÿÖÿßÿçÿòÿûÿ  üÿôÿîÿñÿòÿæÿêÿèÿáÿðÿíÿêÿðÿêÿîÿëÿíÿèÿëÿðÿñÿôÿõÿûÿøÿðÿôÿñÿôÿüÿþÿùÿòÿëÿèÿãÿàÿÙÿÚÿáÿèÿðÿíÿðÿñÿíÿðÿ÷ÿùÿôÿõÿñÿôÿñÿãÿÚÿ×ÿÜÿÜÿäÿëÿñÿùÿûÿÿÿþÿõÿîÿíÿîÿçÿçÿëÿäÿãÿäÿäÿàÿãÿëÿëÿðÿðÿäÿëÿÿÿõÿòÿõÿëÿíÿíÿôÿüÿùÿ÷ÿÿÿûÿ÷ÿüÿþÿûÿøÿùÿôÿõÿòÿëÿíÿêÿêÿíÿêÿøÿ÷ÿûÿþÿñÿôÿíÿáÿÜÿÕÿÜÿÜÿÜÿ×ÿÓÿÕÿÓÿÝÿäÿòÿûÿÿÿñÿãÿÝÿàÿàÿÖÿÜÿãÿçÿõÿ øÿõÿíÿõÿ÷ÿùÿùÿëÿñÿîÿíÿñÿòÿòÿîÿëÿíÿíÿðÿíÿêÿáÿçÿèÿæÿèÿèÿèÿæÿêÿêÿñÿòÿñÿíÿæÿäÿæÿíÿêÿíÿðÿøÿþÿùÿ÷ÿùÿþÿûÿþÿüÿüÿûÿðÿðÿëÿäÿäÿàÿÜÿÝÿÙÿàÿàÿêÿñÿðÿõÿøÿþÿùÿôÿôÿêÿêÿêÿëÿçÿçÿçÿäÿèÿíÿíÿêÿõÿôÿôÿòÿñÿøÿüÿûÿþÿøÿøÿÿÿûÿûÿûÿùÿøÿøÿñÿôÿêÿæÿèÿãÿÝÿÝÿßÿßÿàÿèÿèÿèÿèÿãÿàÿáÿßÿÝÿßÿßÿÖÿÙÿÙÿÝÿæÿæÿëÿðÿûÿ  ûÿðÿêÿßÿáÿßÿßÿàÿãÿîÿðÿøÿôÿøÿþÿþÿÿÿ ûÿûÿûÿîÿ÷ÿðÿðÿíÿãÿäÿáÿÝÿßÿÝÿÙÿ×ÿÒÿÙÿßÿÚÿÜÿæÿèÿèÿñÿÿÿüÿ÷ÿòÿíÿëÿíÿèÿçÿêÿîÿîÿíÿòÿñÿ÷ÿòÿõÿòÿðÿòÿîÿêÿíÿêÿÙÿÌÿÉÿÕÿÙÿÜÿíÿ÷ÿûÿ  ÿÿøÿòÿñÿñÿðÿëÿêÿçÿáÿàÿãÿæÿíÿêÿëÿíÿôÿêÿÝÿðÿøÿûÿùÿôÿøÿ÷ÿôÿùÿùÿøÿùÿøÿ÷ÿôÿùÿòÿøÿøÿòÿñÿæÿßÿæÿêÿêÿêÿñÿðÿíÿòÿñÿíÿäÿäÿßÿãÿçÿèÿäÿßÿÙÿÙÿáÿãÿèÿëÿîÿùÿþÿûÿòÿæÿÜÿÝÿàÿãÿêÿíÿîÿòÿøÿüÿþÿ üÿþÿûÿõÿñÿðÿòÿøÿíÿäÿîÿîÿèÿîÿêÿèÿèÿæÿäÿäÿçÿáÿáÿæÿæÿêÿíÿðÿ÷ÿòÿôÿøÿüÿüÿùÿðÿëÿêÿêÿëÿëÿçÿèÿíÿçÿòÿðÿêÿñÿðÿñÿðÿðÿîÿîÿíÿëÿèÿáÿÚÿ×ÿßÿçÿçÿêÿûÿ øÿîÿêÿäÿäÿèÿôÿíÿðÿðÿòÿñÿíÿðÿôÿ÷ÿùÿùÿîÿ÷ÿÿÿñÿôÿòÿëÿðÿîÿòÿôÿñÿõÿõÿùÿøÿøÿòÿèÿçÿæÿáÿßÿÙÿ×ÿ×ÿÓÿÜÿàÿæÿäÿêÿðÿðÿòÿñÿòÿîÿæÿèÿèÿèÿñÿðÿðÿòÿ÷ÿøÿùÿ  ûÿõÿèÿáÿÝÿÝÿ×ÿÜÿàÿäÿëÿíÿíÿôÿüÿøÿüÿùÿüÿùÿòÿøÿøÿõÿùÿôÿõÿíÿëÿíÿêÿíÿèÿëÿíÿîÿñÿîÿíÿèÿäÿîÿèÿôÿ÷ÿôÿ÷ÿ÷ÿõÿòÿñÿäÿßÿãÿÜÿ×ÿÕÿÕÿÝÿÜÿÝÿæÿçÿòÿ÷ÿõÿøÿùÿõÿñÿêÿîÿêÿèÿçÿÙÿÙÿãÿëÿëÿôÿÿÿ ûÿþÿûÿùÿõÿòÿøÿòÿðÿëÿçÿçÿäÿëÿîÿèÿèÿãÿíÿõÿëÿëÿëÿãÿßÿÜÿãÿáÿçÿçÿêÿðÿíÿòÿòÿðÿôÿêÿëÿðÿëÿëÿæÿáÿçÿêÿôÿõÿ÷ÿòÿíÿêÿðÿêÿíÿîÿðÿèÿêÿëÿèÿíÿñÿðÿçÿáÿ÷ÿûÿ þÿùÿîÿêÿèÿáÿãÿßÿàÿãÿæÿðÿðÿðÿôÿøÿûÿüÿùÿðÿôÿôÿôÿëÿðÿôÿñÿ îÿáÿèÿçÿçÿîÿèÿêÿèÿíÿíÿíÿíÿçÿèÿðÿçÿèÿèÿíÿêÿëÿôÿòÿðÿèÿßÿßÿàÿ×ÿÕÿ×ÿÜÿáÿãÿæÿèÿëÿòÿùÿùÿûÿÿÿøÿùÿøÿ÷ÿõÿòÿíÿêÿçÿðÿøÿøÿ  üÿøÿôÿõÿôÿôÿñÿñÿêÿèÿàÿßÿãÿêÿçÿãÿáÿçÿèÿäÿîÿëÿàÿäÿßÿãÿçÿãÿèÿîÿêÿèÿíÿðÿõÿñÿíÿðÿîÿçÿãÿæÿàÿàÿàÿäÿêÿðÿîÿòÿ÷ÿòÿôÿòÿñÿîÿñÿðÿòÿòÿðÿíÿæÿèÿëÿðÿñÿùÿ   üÿíÿàÿàÿäÿäÿëÿîÿðÿõÿòÿèÿñÿôÿùÿùÿûÿùÿùÿüÿþÿüÿùÿüÿõÿûÿðÿæÿðÿêÿæÿëÿÝÿàÿàÿÚÿÜÿÜÿÚÿ×ÿÚÿÚÿ×ÿÜÿÝÿàÿæÿæÿêÿæÿîÿêÿëÿñÿîÿîÿæÿáÿãÿàÿðÿõÿüÿÿÿÿÿ üÿþÿøÿðÿëÿæÿêÿíÿëÿèÿëÿûÿ  øÿôÿñÿçÿÝÿÚÿ×ÿÖÿÓÿÐÿÎÿÐÿÓÿÖÿÙÿÜÿÏÿÎÿáÿáÿßÿîÿíÿèÿîÿëÿíÿõÿðÿõÿÿÿüÿüÿ ÿÿ÷ÿüÿûÿõÿøÿ÷ÿõÿðÿêÿîÿðÿõÿùÿõÿõÿñÿðÿëÿçÿèÿæÿæÿáÿßÿãÿçÿèÿçÿíÿîÿ÷ÿÿÿüÿ÷ÿùÿôÿíÿíÿçÿäÿÝÿßÿãÿäÿíÿ÷ÿõÿøÿÿÿûÿùÿùÿþÿûÿûÿüÿûÿ÷ÿèÿèÿçÿçÿëÿëÿëÿíÿîÿðÿèÿãÿÜÿÜÿÚÿÜÿÚÿàÿàÿßÿèÿàÿáÿäÿèÿçÿæÿäÿßÿÝÿÜÿßÿáÿàÿáÿðÿõÿüÿ ÿÿûÿõÿðÿðÿîÿëÿíÿðÿôÿ  ðÿîÿèÿíÿæÿàÿÚÿÓÿÒÿÒÿÓÿÖÿÝÿÙÿàÿÕÿÉÿÜÿÚÿÜÿáÿæÿîÿñÿñÿõÿ÷ÿ÷ÿþÿüÿÿÿüÿþÿüÿøÿüÿøÿøÿøÿíÿîÿðÿñÿíÿíÿîÿðÿõÿøÿòÿðÿêÿíÿèÿëÿíÿíÿêÿîÿ÷ÿòÿõÿùÿûÿûÿÿÿþÿüÿûÿñÿáÿÚÿÙÿßÿßÿàÿæÿæÿèÿîÿðÿîÿíÿêÿñÿõÿøÿûÿùÿûÿôÿòÿñÿîÿáÿèÿþÿøÿæÿîÿñÿæÿëÿæÿçÿêÿêÿêÿèÿäÿæÿÝÿàÿæÿàÿàÿæÿíÿðÿõÿÿÿõÿñÿðÿíÿèÿíÿêÿîÿðÿüÿ  ÿÿÿÿûÿþÿûÿ÷ÿðÿîÿäÿáÿäÿáÿãÿçÿòÿ ûÿõÿòÿêÿæÿÝÿ×ÿÙÿÙÿÖÿ×ÿÖÿÕÿÒÿÕÿÖÿÙÿ×ÿÜÿãÿæÿêÿøÿþÿþÿüÿñÿôÿòÿõÿøÿùÿüÿøÿþÿÿÿüÿùÿòÿõÿòÿòÿ÷ÿíÿîÿîÿðÿõÿõÿðÿîÿõÿñÿîÿíÿçÿêÿçÿãÿãÿàÿàÿëÿêÿæÿáÿëÿíÿñÿûÿ  ÿÿîÿèÿ×ÿ×ÿÜÿÚÿÝÿèÿíÿøÿþÿÿÿüÿþÿþÿøÿòÿëÿæÿèÿãÿËÿÌÿÕÿÒÿßÿßÿÝÿÙÿÒÿÜÿàÿÝÿÝÿÝÿäÿíÿñÿòÿòÿòÿäÿçÿíÿôÿûÿùÿøÿþÿñÿêÿêÿèÿîÿôÿùÿÿÿþÿ÷ÿôÿôÿòÿèÿèÿçÿçÿàÿæÿèÿîÿôÿòÿøÿùÿñÿðÿëÿçÿÙÿÕÿÙÿ×ÿÖÿ×ÿÖÿÙÿÕÿÙÿãÿêÿèÿçÿðÿôÿäÿèÿùÿíÿñÿðÿñÿõÿõÿòÿðÿôÿòÿ÷ÿõÿùÿ÷ÿîÿîÿñÿõÿîÿèÿèÿèÿëÿðÿôÿøÿ÷ÿôÿíÿäÿáÿßÿèÿäÿäÿèÿçÿíÿõÿûÿÿÿþÿûÿôÿáÿÙÿÓÿÕÿÖÿàÿæÿíÿîÿõÿüÿþÿûÿ÷ÿèÿçÿæÿàÿêÿæÿÚÿÙÿÝÿÕÿÜÿäÿÚÿàÿàÿÜÿÚÿßÿãÿáÿãÿÝÿàÿçÿëÿíÿñÿîÿðÿõÿ þÿùÿùÿûÿõÿôÿ÷ÿûÿûÿ  ùÿíÿçÿàÿÕÿÒÿÌÿÐÿÝÿçÿòÿôÿ÷ÿ÷ÿ÷ÿíÿêÿßÿÖÿÖÿÖÿàÿßÿÝÿßÿÝÿÙÿáÿçÿêÿíÿêÿêÿèÿêÿüÿûÿûÿ÷ÿþÿÿÿüÿùÿþÿþÿÿÿûÿüÿøÿ÷ÿõÿùÿôÿíÿèÿäÿæÿãÿçÿîÿðÿòÿñÿõÿ÷ÿõÿîÿêÿêÿêÿçÿäÿáÿãÿçÿêÿëÿèÿèÿñÿôÿþÿþÿùÿðÿèÿÝÿÜÿãÿáÿÜÿÚÿãÿëÿ÷ÿ÷ÿ÷ÿùÿøÿøÿòÿòÿ÷ÿþÿÿÿôÿëÿðÿòÿðÿèÿèÿæÿáÿçÿ÷ÿùÿôÿíÿîÿðÿîÿëÿãÿæÿðÿíÿñÿñÿðÿòÿõÿøÿüÿ üÿòÿëÿèÿçÿäÿëÿîÿíÿôÿõÿòÿòÿ÷ÿþÿõÿæÿòÿòÿëÿæÿßÿÕÿÎÿÖÿßÿäÿßÿæÿ÷ÿ øÿôÿíÿèÿàÿÝÿãÿçÿêÿÜÿÚÿàÿãÿãÿèÿðÿðÿôÿëÿòÿùÿüÿÿÿùÿ÷ÿõÿùÿþÿþÿõÿñÿîÿõÿëÿäÿäÿáÿãÿáÿäÿëÿãÿëÿøÿõÿîÿðÿðÿíÿçÿêÿëÿäÿçÿèÿðÿðÿíÿîÿõÿõÿõÿüÿùÿøÿõÿ÷ÿ÷ÿùÿøÿðÿàÿÙÿ×ÿÚÿÕÿÎÿÕÿÙÿÜÿÝÿÜÿáÿëÿñÿñÿüÿþÿÿÿþÿþÿ ûÿðÿùÿôÿôÿôÿîÿçÿèÿîÿêÿðÿîÿôÿüÿùÿÿÿþÿõÿõÿñÿîÿñÿñÿõÿðÿðÿëÿêÿèÿáÿäÿàÿÝÿæÿñÿôÿõÿøÿñÿñÿõÿøÿòÿðÿæÿçÿæÿáÿ×ÿËÿÎÿÏÿÙÿàÿáÿäÿîÿûÿþÿ üÿøÿôÿîÿêÿëÿçÿçÿàÿßÿæÿãÿßÿÝÿæÿíÿòÿøÿûÿÿÿòÿêÿþÿ øÿÿÿþÿÿÿüÿþÿûÿôÿüÿûÿ÷ÿøÿðÿîÿíÿòÿñÿçÿêÿèÿãÿ×ÿÓÿÒÿÖÿçÿêÿðÿòÿôÿþÿùÿùÿíÿèÿëÿãÿßÿÙÿÖÿÚÿÝÿÚÿáÿàÿäÿãÿáÿäÿíÿíÿñÿ÷ÿ÷ÿùÿôÿûÿÿÿøÿ÷ÿñÿçÿäÿçÿçÿêÿðÿðÿðÿîÿêÿêÿ÷ÿÿÿ  øÿûÿûÿøÿñÿíÿíÿíÿäÿäÿæÿäÿêÿíÿèÿæÿàÿáÿäÿäÿæÿàÿ×ÿÖÿÙÿÚÿÖÿÕÿÚÿêÿêÿíÿíÿëÿîÿòÿõÿõÿõÿûÿûÿüÿüÿ÷ÿ÷ÿòÿêÿëÿæÿçÿíÿæÿãÿáÿêÿðÿòÿûÿùÿùÿþÿ ûÿûÿûÿÿÿ÷ÿòÿèÿßÿÖÿÖÿÜÿßÿçÿëÿðÿîÿ÷ÿ÷ÿûÿüÿ ÿÿþÿøÿôÿòÿõÿîÿçÿßÿáÿÚÿáÿæÿèÿàÿÚÿßÿÝÿàÿßÿàÿáÿãÿæÿçÿêÿðÿòÿòÿñÿîÿðÿøÿñÿçÿçÿëÿùÿÿÿõÿõÿûÿ÷ÿùÿøÿôÿôÿòÿôÿòÿòÿõÿõÿòÿõÿõÿøÿòÿõÿòÿëÿñÿêÿêÿíÿêÿêÿîÿêÿîÿîÿðÿñÿèÿíÿíÿèÿèÿîÿêÿæÿèÿçÿîÿòÿîÿôÿðÿêÿíÿëÿàÿÚÿßÿÚÿÜÿÙÿÚÿßÿßÿàÿáÿçÿêÿêÿçÿæÿæÿëÿòÿôÿþÿÿÿ  ôÿíÿêÿëÿëÿñÿîÿçÿÝÿÙÿÒÿÉÿÎÿÉÿÒÿÓÿÓÿÕÿÙÿÜÿÝÿàÿáÿêÿîÿ÷ÿûÿûÿüÿûÿÿÿ  ÿÿÿÿøÿùÿùÿøÿøÿõÿôÿîÿíÿæÿãÿêÿèÿæÿäÿèÿæÿäÿáÿ×ÿÕÿÙÿÙÿêÿíÿîÿæÿßÿÜÿÜÿÝÿàÿçÿëÿíÿîÿðÿõÿñÿñÿòÿôÿõÿþÿ þÿ÷ÿùÿüÿ÷ÿõÿñÿ÷ÿ÷ÿ÷ÿ÷ÿôÿôÿõÿíÿäÿæÿäÿáÿçÿçÿàÿáÿÝÿáÿæÿàÿæÿêÿêÿîÿíÿîÿñÿðÿõÿ÷ÿíÿîÿëÿðÿíÿèÿîÿñÿòÿøÿûÿøÿûÿÿÿøÿôÿñÿêÿèÿáÿçÿæÿãÿêÿðÿôÿñÿòÿôÿñÿòÿîÿæÿêÿäÿêÿñÿîÿòÿûÿ ùÿõÿñÿêÿãÿãÿãÿæÿèÿçÿòÿðÿíÿíÿêÿëÿçÿæÿçÿëÿíÿñÿòÿñÿòÿõÿòÿõÿîÿëÿêÿçÿèÿãÿäÿáÿèÿðÿðÿõÿôÿñÿëÿäÿçÿêÿðÿðÿðÿëÿêÿíÿæÿíÿêÿèÿðÿôÿùÿøÿøÿ÷ÿòÿõÿ÷ÿùÿðÿçÿäÿäÿãÿçÿíÿîÿ÷ÿüÿùÿÿÿ ùÿôÿíÿòÿñÿëÿòÿøÿôÿõÿñÿëÿêÿçÿæÿæÿèÿäÿÜÿßÿáÿæÿçÿçÿáÿÝÿÝÿÝÿßÿãÿáÿãÿãÿàÿÜÿáÿàÿáÿèÿæÿèÿèÿèÿñÿõÿðÿñÿùÿüÿÿÿÿÿûÿùÿûÿüÿÿÿùÿþÿþÿûÿùÿ÷ÿÿÿÿÿþÿùÿûÿøÿõÿðÿõÿøÿùÿôÿñÿõÿøÿõÿòÿîÿñÿðÿðÿêÿäÿäÿèÿäÿäÿäÿêÿçÿêÿíÿíÿçÿêÿçÿæÿäÿäÿæÿäÿçÿæÿêÿèÿàÿãÿæÿçÿäÿãÿèÿëÿðÿíÿíÿëÿëÿîÿíÿôÿ÷ÿ÷ÿõÿõÿñÿôÿøÿõÿ÷ÿüÿþÿþÿüÿùÿûÿòÿðÿ÷ÿ÷ÿüÿüÿùÿûÿùÿûÿ÷ÿõÿøÿõÿùÿûÿõÿøÿùÿùÿõÿíÿëÿîÿêÿæÿãÿàÿÝÿÝÿÖÿÒÿ×ÿÖÿßÿãÿãÿáÿäÿäÿãÿæÿíÿòÿðÿèÿíÿîÿíÿôÿðÿíÿðÿñÿõÿôÿòÿùÿùÿõÿûÿûÿøÿøÿûÿþÿÿÿõÿôÿñÿíÿðÿêÿîÿîÿíÿðÿòÿñÿòÿ÷ÿ÷ÿøÿ÷ÿõÿðÿíÿñÿñÿñÿîÿîÿîÿòÿõÿíÿêÿñÿîÿîÿíÿõÿôÿíÿíÿôÿñÿíÿèÿêÿíÿðÿêÿèÿëÿëÿèÿæÿñÿëÿëÿíÿðÿõÿôÿõÿøÿøÿøÿ÷ÿõÿôÿôÿùÿòÿòÿõÿôÿëÿèÿëÿèÿÝÿßÿãÿäÿæÿçÿëÿòÿðÿñÿîÿðÿõÿ÷ÿøÿ÷ÿõÿñÿøÿüÿÿÿûÿûÿ÷ÿôÿøÿôÿ÷ÿîÿèÿçÿçÿäÿäÿæÿÚÿãÿæÿçÿíÿêÿèÿêÿäÿãÿæÿäÿáÿãÿêÿçÿæÿèÿèÿêÿñÿõÿòÿ÷ÿ÷ÿüÿøÿñÿ÷ÿøÿûÿ÷ÿ÷ÿûÿøÿõÿõÿõÿðÿðÿõÿòÿðÿûÿ÷ÿñÿôÿôÿôÿòÿñÿòÿðÿôÿñÿîÿèÿíÿêÿíÿíÿõÿîÿëÿñÿêÿçÿãÿãÿçÿîÿðÿôÿ÷ÿòÿôÿ÷ÿôÿòÿôÿõÿûÿøÿùÿøÿôÿôÿîÿëÿîÿíÿíÿëÿëÿèÿðÿõÿòÿøÿõÿòÿðÿðÿøÿùÿùÿòÿøÿòÿñÿòÿêÿíÿêÿáÿßÿÜÿÚÿÒÿÌÿÒÿÙÿÖÿÚÿÚÿãÿæÿæÿêÿèÿèÿêÿîÿòÿôÿôÿõÿøÿûÿÿÿ÷ÿñÿøÿüÿÿÿþÿÿÿÿÿþÿûÿÿÿõÿôÿôÿôÿôÿñÿëÿèÿçÿäÿäÿàÿßÿÝÿÜÿáÿàÿäÿãÿæÿëÿíÿêÿèÿçÿíÿíÿíÿëÿëÿëÿæÿèÿèÿêÿëÿçÿäÿáÿæÿèÿëÿíÿñÿðÿñÿîÿîÿøÿùÿõÿøÿ÷ÿòÿôÿûÿ÷ÿõÿõÿùÿ÷ÿôÿõÿõÿ÷ÿøÿ÷ÿòÿôÿøÿùÿðÿðÿôÿôÿùÿõÿñÿðÿðÿðÿëÿçÿäÿæÿçÿîÿðÿòÿõÿõÿ÷ÿøÿ÷ÿüÿûÿ÷ÿõÿôÿñÿôÿñÿíÿëÿëÿîÿêÿèÿçÿáÿÜÿÙÿÚÿÖÿÕÿÒÿ×ÿÜÿÖÿàÿãÿãÿêÿëÿêÿêÿîÿðÿðÿòÿ÷ÿûÿûÿÿÿÿÿÿÿ ûÿ  ôÿòÿûÿ÷ÿîÿíÿðÿîÿêÿçÿíÿòÿõÿòÿëÿêÿçÿßÿÖÿÕÿÓÿÓÿÎÿÒÿÒÿÓÿÙÿßÿãÿáÿãÿëÿãÿèÿðÿíÿõÿøÿõÿùÿüÿõÿ÷ÿøÿüÿþÿþÿõÿøÿôÿëÿçÿæÿêÿíÿíÿèÿêÿîÿíÿîÿæÿëÿíÿîÿõÿòÿíÿðÿñÿîÿêÿíÿôÿûÿÿÿùÿùÿùÿ÷ÿðÿñÿñÿõÿôÿîÿèÿêÿèÿêÿòÿòÿøÿøÿõÿôÿôÿñÿíÿêÿðÿêÿðÿðÿëÿèÿèÿíÿêÿèÿèÿäÿäÿäÿãÿèÿæÿæÿãÿàÿçÿêÿðÿëÿèÿçÿèÿêÿëÿæÿêÿîÿôÿ÷ÿ÷ÿôÿôÿùÿûÿøÿñÿ÷ÿ  üÿøÿ÷ÿõÿôÿûÿõÿ÷ÿ÷ÿôÿîÿðÿêÿáÿàÿÜÿÕÿÐÿÏÿÏÿÚÿÝÿÜÿàÿáÿæÿáÿäÿäÿßÿáÿãÿäÿãÿäÿêÿêÿêÿñÿòÿôÿøÿûÿøÿùÿõÿøÿüÿüÿüÿ ÷ÿôÿùÿøÿ÷ÿøÿõÿðÿ÷ÿõÿòÿ÷ÿòÿùÿøÿôÿ÷ÿòÿîÿèÿêÿèÿèÿêÿíÿîÿêÿêÿëÿêÿíÿèÿëÿðÿêÿîÿðÿíÿëÿôÿòÿñÿëÿíÿñÿèÿëÿêÿêÿçÿáÿäÿäÿáÿçÿáÿãÿëÿëÿòÿôÿòÿøÿøÿøÿùÿ÷ÿüÿüÿòÿñÿíÿæÿáÿæÿÝÿáÿêÿèÿêÿçÿðÿôÿøÿ÷ÿõÿõÿëÿëÿëÿíÿíÿðÿëÿëÿëÿèÿõÿòÿòÿ÷ÿñÿ÷ÿùÿùÿûÿøÿÿÿüÿþÿþÿüÿÿÿ÷ÿòÿòÿíÿíÿõÿòÿñÿðÿòÿêÿëÿèÿæÿîÿçÿëÿèÿçÿñÿîÿñÿíÿëÿòÿîÿæÿÚÿ×ÿ×ÿÜÿÝÿßÿàÿáÿçÿãÿêÿëÿëÿôÿíÿíÿòÿðÿôÿðÿðÿíÿíÿñÿîÿõÿôÿøÿøÿ÷ÿõÿòÿñÿôÿñÿôÿøÿøÿüÿüÿþÿþÿûÿùÿûÿüÿøÿøÿòÿîÿñÿõÿñÿõÿñÿðÿíÿäÿíÿëÿôÿðÿîÿîÿæÿîÿèÿëÿæÿçÿäÿëÿæÿãÿæÿßÿãÿçÿçÿíÿêÿíÿêÿèÿëÿîÿèÿêÿíÿñÿûÿùÿüÿùÿøÿøÿòÿùÿøÿùÿ÷ÿøÿ÷ÿôÿõÿòÿçÿçÿèÿçÿèÿäÿßÿáÿÚÿäÿîÿíÿîÿðÿòÿñÿòÿøÿ÷ÿôÿûÿ÷ÿ÷ÿÿÿ÷ÿôÿòÿðÿôÿûÿùÿûÿõÿðÿõÿùÿ÷ÿõÿøÿíÿêÿíÿëÿæÿãÿàÿÚÿßÿáÿàÿÜÿßÿßÿÚÿÝÿãÿäÿãÿêÿíÿîÿõÿõÿøÿøÿ÷ÿùÿõÿûÿõÿùÿøÿ÷ÿùÿüÿùÿ÷ÿ÷ÿòÿôÿñÿ÷ÿ÷ÿ÷ÿòÿòÿîÿñÿõÿ÷ÿüÿñÿíÿñÿñÿõÿôÿõÿøÿùÿòÿôÿôÿõÿùÿùÿûÿõÿðÿíÿëÿæÿäÿèÿáÿàÿãÿäÿæÿãÿàÿàÿçÿèÿðÿôÿðÿôÿòÿôÿôÿòÿîÿêÿêÿäÿæÿäÿçÿçÿàÿäÿêÿêÿëÿîÿñÿõÿõÿòÿ÷ÿõÿ÷ÿôÿøÿùÿôÿõÿòÿîÿðÿêÿëÿêÿèÿêÿôÿ÷ÿðÿíÿíÿòÿòÿ÷ÿüÿôÿøÿõÿôÿ÷ÿûÿ÷ÿûÿûÿþÿÿÿøÿ÷ÿøÿøÿ÷ÿôÿðÿðÿòÿôÿñÿòÿîÿèÿíÿëÿäÿáÿàÿäÿãÿáÿäÿàÿàÿáÿáÿæÿëÿñÿèÿæÿêÿîÿíÿæÿèÿðÿîÿðÿôÿñÿíÿðÿòÿôÿòÿ÷ÿ÷ÿøÿøÿþÿüÿþÿøÿ÷ÿùÿ÷ÿðÿíÿñÿðÿñÿðÿëÿîÿîÿòÿñÿëÿëÿîÿèÿðÿêÿíÿêÿêÿèÿëÿîÿîÿëÿëÿêÿíÿêÿçÿêÿîÿñÿ÷ÿñÿêÿîÿñÿôÿòÿôÿõÿøÿøÿòÿ÷ÿôÿõÿôÿòÿîÿêÿèÿçÿèÿèÿäÿçÿæÿãÿãÿáÿàÿáÿãÿêÿêÿçÿîÿñÿëÿîÿôÿñÿõÿôÿ÷ÿùÿûÿþÿûÿÿÿûÿøÿõÿõÿõÿõÿõÿùÿùÿûÿøÿôÿôÿîÿîÿîÿðÿíÿçÿíÿðÿñÿòÿîÿòÿòÿíÿðÿëÿèÿèÿäÿèÿäÿæÿêÿîÿîÿèÿëÿîÿðÿîÿëÿèÿçÿîÿîÿîÿôÿôÿðÿòÿõÿñÿñÿñÿíÿòÿîÿíÿòÿîÿîÿñÿëÿîÿòÿíÿêÿèÿêÿêÿæÿçÿíÿñÿëÿðÿëÿîÿíÿôÿøÿõÿ÷ÿõÿõÿ÷ÿñÿòÿñÿëÿðÿîÿñÿîÿîÿñÿòÿðÿðÿñÿîÿôÿñÿôÿëÿîÿñÿôÿ÷ÿùÿûÿ÷ÿôÿòÿùÿõÿñÿñÿîÿíÿäÿíÿõÿðÿíÿèÿçÿáÿßÿÚÿÙÿàÿæÿêÿëÿçÿèÿçÿêÿíÿîÿðÿõÿüÿþÿüÿüÿüÿûÿûÿüÿùÿùÿõÿòÿîÿðÿðÿëÿðÿòÿ÷ÿ÷ÿñÿíÿðÿòÿîÿõÿñÿñÿõÿøÿ÷ÿõÿðÿõÿôÿðÿîÿäÿäÿèÿîÿêÿëÿèÿáÿãÿÝÿÝÿÚÿÜÿÝÿàÿäÿãÿäÿàÿáÿçÿêÿèÿñÿîÿîÿðÿ÷ÿôÿ÷ÿÿÿüÿùÿûÿüÿøÿÿÿ÷ÿ÷ÿñÿòÿñÿîÿèÿèÿðÿðÿîÿòÿòÿõÿùÿûÿ÷ÿõÿùÿüÿþÿÿÿõÿùÿüÿôÿòÿõÿùÿûÿôÿñÿôÿòÿðÿñÿòÿñÿðÿîÿòÿíÿëÿäÿãÿäÿäÿäÿæÿêÿæÿæÿãÿãÿãÿçÿèÿäÿëÿëÿëÿíÿíÿèÿíÿîÿíÿíÿëÿñÿðÿíÿîÿëÿîÿðÿñÿîÿçÿíÿôÿðÿðÿðÿôÿðÿñÿñÿæÿèÿñÿ÷ÿ÷ÿùÿþÿùÿøÿüÿþÿþÿûÿÿÿûÿ÷ÿôÿòÿíÿîÿôÿðÿîÿêÿèÿçÿîÿîÿèÿíÿíÿêÿðÿíÿñÿòÿòÿðÿëÿèÿçÿðÿôÿõÿñÿêÿðÿëÿðÿêÿàÿÜÿêÿîÿîÿîÿîÿíÿîÿíÿîÿêÿíÿñÿðÿðÿîÿðÿíÿôÿøÿõÿôÿðÿñÿôÿêÿêÿôÿêÿñÿèÿèÿëÿðÿôÿøÿþÿ÷ÿùÿ÷ÿõÿ÷ÿõÿùÿøÿõÿõÿ÷ÿùÿôÿðÿðÿëÿëÿëÿêÿèÿðÿðÿòÿîÿêÿêÿêÿñÿîÿîÿñÿôÿòÿòÿôÿøÿôÿõÿôÿûÿõÿíÿîÿñÿêÿíÿòÿñÿîÿäÿçÿæÿàÿßÿàÿàÿÝÿÜÿßÿãÿßÿãÿàÿàÿãÿäÿêÿèÿîÿðÿíÿðÿíÿñÿõÿõÿôÿõÿõÿ÷ÿÿÿþÿÿÿÿÿþÿûÿþÿùÿùÿ÷ÿ÷ÿ÷ÿòÿôÿîÿðÿôÿîÿíÿôÿñÿòÿçÿæÿçÿçÿãÿäÿáÿÝÿÝÿÙÿÚÿÖÿÜÿàÿÚÿÚÿäÿæÿæÿäÿíÿëÿäÿêÿêÿêÿíÿðÿùÿøÿôÿøÿøÿøÿûÿùÿ÷ÿôÿ÷ÿñÿîÿðÿôÿòÿõÿôÿôÿøÿñÿñÿôÿðÿ÷ÿþÿþÿÿÿûÿÿÿûÿùÿøÿôÿôÿîÿëÿíÿêÿîÿíÿíÿíÿçÿñÿíÿèÿðÿîÿêÿëÿèÿßÿãÿèÿèÿêÿêÿêÿëÿðÿíÿíÿîÿðÿõÿôÿðÿôÿëÿðÿíÿëÿêÿæÿãÿãÿàÿàÿäÿÜÿÝÿÜÿÝÿãÿãÿáÿäÿãÿçÿëÿñÿôÿõÿ÷ÿ÷ÿùÿüÿ ÿÿùÿùÿõÿòÿñÿíÿíÿèÿèÿçÿãÿçÿëÿçÿèÿêÿèÿãÿçÿæÿàÿàÿÝÿàÿáÿÜÿÙÿÝÿãÿäÿæÿçÿçÿêÿëÿôÿ÷ÿþÿÿÿÿÿüÿþÿüÿþÿûÿùÿ÷ÿñÿðÿçÿãÿáÿáÿÖÿÕÿÕÿÓÿÓÿÕÿÓÿÏÿÐÿÒÿÝÿãÿëÿîÿðÿñÿ÷ÿùÿõÿûÿþÿûÿøÿÿÿþÿþÿþÿÿÿøÿÿÿûÿÿÿÿÿûÿûÿøÿ÷ÿüÿôÿôÿíÿðÿëÿèÿêÿëÿçÿãÿãÿáÿãÿàÿàÿäÿãÿäÿãÿáÿàÿßÿÝÿÝÿÙÿÜÿÚÿßÿæÿçÿæÿèÿêÿèÿëÿãÿíÿðÿñÿùÿùÿþÿþÿûÿþÿôÿñÿ÷ÿ÷ÿôÿôÿ÷ÿùÿüÿÿÿþÿüÿÿÿùÿõÿøÿôÿòÿíÿêÿçÿçÿñÿòÿðÿîÿîÿðÿôÿôÿðÿèÿíÿíÿæÿäÿäÿäÿßÿãÿÜÿ×ÿÙÿÚÿÚÿÝÿäÿëÿñÿðÿëÿèÿòÿòÿîÿëÿðÿðÿôÿ÷ÿ÷ÿüÿ÷ÿøÿüÿüÿÿÿÿÿûÿ÷ÿøÿôÿðÿêÿêÿçÿîÿøÿõÿòÿøÿõÿðÿðÿêÿæÿèÿèÿçÿíÿîÿõÿøÿ÷ÿôÿñÿîÿîÿîÿçÿçÿæÿêÿëÿñÿ÷ÿøÿõÿ÷ÿòÿíÿîÿêÿèÿîÿðÿòÿ÷ÿõÿòÿëÿîÿíÿíÿíÿòÿòÿíÿðÿôÿõÿîÿðÿðÿíÿêÿçÿêÿèÿãÿãÿèÿëÿîÿôÿôÿðÿíÿêÿçÿèÿêÿêÿíÿôÿõÿîÿòÿñÿñÿðÿîÿíÿðÿðÿõÿòÿôÿøÿüÿþÿÿÿþÿÿÿûÿôÿôÿðÿèÿæÿäÿßÿàÿáÿáÿäÿèÿçÿèÿçÿßÿßÿÜÿÜÿäÿäÿêÿçÿêÿëÿçÿîÿôÿëÿðÿòÿñÿîÿíÿñÿîÿîÿòÿ÷ÿùÿûÿüÿûÿøÿ÷ÿôÿõÿõÿñÿîÿíÿëÿêÿêÿêÿèÿëÿëÿðÿîÿiaxmodem-1.2.0/lib/spandsp/AUTHORS0000644000175000017500000000004511150047205016133 0ustar julienjulienSteve Underwood iaxmodem-1.2.0/lib/spandsp/README.testdata0000644000175000017500000000465211150047205017563 0ustar julienjulienSetting up test data for the supplied suite of test programs. ------------------------------------------------------------- Some of the tests in the test suite for this package require test data files. These test data files fall into four categories: - Some data files, such as those for some of the FAX tests, are generated by programs in the package. - Some are freely distributable data files, from various sources. These are supplied with the package. - Some are test data files from a standards body. These are the copyright material of the standards body, and so cannot be distributed with this package. However, most of these files can currently be downloaded at no charge from the standards body's web site. This file describes which files are needed, and how they may be processed to produce the right files in the right places for the tests. - The two industry standard sources of test data for DTMF decoders are Bellcore/Telcordia and Mitel. Neither of these is either free, or supplied in a form directly usable with the test suite. These data sources are expected by several tests, and not just the DTMF decoder tests. Sad to say, you are on your own when trying to source data for these tests. For the G.722 tests, obtain the file T-REC-G.722-198703-I!AppII!ZPF-E.zip from the ITU web site, and place it in this directory. Then run ./unpack_g722_data.sh For the G.726 tests, obtain the file T-REC-G.726-199103-I!AppII!SOFT-ZST-E.zip from the ITU web site, and place it in this directory. Then run ./unpack_g726_data.sh For the GSM 06.10 tests, obtain the file en_300961v080101p0.zip from the ETSI web site, and place it in this directory. If you are able to run .exe (i.e. MS DOS or Windows) files you can simply run ./unpack_gsm0610_data.sh If you are unable to run .exe files on the machine you are using (e.e. you are not using Cygwin, Mingw, Wine, FreeDOS or something of that sort) you will need to find a machine which will. First, run ./unpack_gsm0610_data.sh --no-exe This will leave 6 .EXE files in the etsitetss/gsm0610 directory. Take these to a machine which can run .EXE files, and execute all of them. This should result in a number of files which end with .COD, INP and .OUT. Copy these to the etsitests/gsm0610 directory, and run ./unpack_gsm0610_data.sh --no-exe-continue The remainder of the extraction and repacking of files should then take place. iaxmodem-1.2.0/lib/spandsp/configure0000755000175000017500000402727111150047520017010 0ustar julienjulien#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.59. # # Copyright (C) 2003 Free Software Foundation, Inc. # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## --------------------- ## ## M4sh Initialization. ## ## --------------------- ## # Be Bourne compatible if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then set -o posix fi DUALCASE=1; export DUALCASE # for MKS sh # Support unset when possible. if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then as_unset=unset else as_unset=false fi # Work around bugs in pre-3.0 UWIN ksh. $as_unset ENV MAIL MAILPATH PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. for as_var in \ LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ LC_TELEPHONE LC_TIME do if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then eval $as_var=C; export $as_var else $as_unset $as_var fi done # Required to use basename. if expr a : '\(a\)' >/dev/null 2>&1; then as_expr=expr else as_expr=false fi if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi # Name of the executable. as_me=`$as_basename "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)$' \| \ . : '\(.\)' 2>/dev/null || echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; } /^X\/\(\/\/\)$/{ s//\1/; q; } /^X\/\(\/\).*/{ s//\1/; q; } s/.*/./; q'` # PATH needs CR, and LINENO needs CR and PATH. # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then echo "#! /bin/sh" >conf$$.sh echo "exit 0" >>conf$$.sh chmod +x conf$$.sh if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then PATH_SEPARATOR=';' else PATH_SEPARATOR=: fi rm -f conf$$.sh fi as_lineno_1=$LINENO as_lineno_2=$LINENO as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` test "x$as_lineno_1" != "x$as_lineno_2" && test "x$as_lineno_3" = "x$as_lineno_2" || { # Find who we are. Look in the path if we contain no path at all # relative or not. case $0 in *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then { echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2 { (exit 1); exit 1; }; } fi case $CONFIG_SHELL in '') as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for as_base in sh bash ksh sh5; do case $as_dir in /*) if ("$as_dir/$as_base" -c ' as_lineno_1=$LINENO as_lineno_2=$LINENO as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` test "x$as_lineno_1" != "x$as_lineno_2" && test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; } $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; } CONFIG_SHELL=$as_dir/$as_base export CONFIG_SHELL exec "$CONFIG_SHELL" "$0" ${1+"$@"} fi;; esac done done ;; esac # Create $as_me.lineno as a copy of $as_myself, but with $LINENO # uniformly replaced by the line number. The first 'sed' inserts a # line-number line before each line; the second 'sed' does the real # work. The second script uses 'N' to pair each line-number line # with the numbered line, and appends trailing '-' during # substitution so that $LINENO is not a special case at line end. # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-) sed '=' <$as_myself | sed ' N s,$,-, : loop s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3, t loop s,-$,, s,^['$as_cr_digits']*\n,, ' >$as_me.lineno && chmod +x $as_me.lineno || { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 { (exit 1); exit 1; }; } # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensible to this). . ./$as_me.lineno # Exit status is that of the last command. exit } case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in *c*,-n*) ECHO_N= ECHO_C=' ' ECHO_T=' ' ;; *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;; *) ECHO_N= ECHO_C='\c' ECHO_T= ;; esac if expr a : '\(a\)' >/dev/null 2>&1; then as_expr=expr else as_expr=false fi rm -f conf$$ conf$$.exe conf$$.file echo >conf$$.file if ln -s conf$$.file conf$$ 2>/dev/null; then # We could just check for DJGPP; but this test a) works b) is more generic # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04). if test -f conf$$.exe; then # Don't use ln at all; we don't have any links as_ln_s='cp -p' else as_ln_s='ln -s' fi elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.file if mkdir -p . 2>/dev/null; then as_mkdir_p=: else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_executable_p="test -f" # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" # IFS # We need space, tab and new line, in precisely that order. as_nl=' ' IFS=" $as_nl" # CDPATH. $as_unset CDPATH # Check that we are running under the correct shell. SHELL=${CONFIG_SHELL-/bin/sh} case X$ECHO in X*--fallback-echo) # Remove one level of quotation (which was required for Make). ECHO=`echo "$ECHO" | sed 's,\\\\\$\\$0,'$0','` ;; esac echo=${ECHO-echo} if test "X$1" = X--no-reexec; then # Discard the --no-reexec flag, and continue. shift elif test "X$1" = X--fallback-echo; then # Avoid inline document here, it may be left over : elif test "X`($echo '\t') 2>/dev/null`" = 'X\t' ; then # Yippee, $echo works! : else # Restart under the correct shell. exec $SHELL "$0" --no-reexec ${1+"$@"} fi if test "X$1" = X--fallback-echo; then # used as fallback echo shift cat </dev/null 2>&1 && unset CDPATH if test -z "$ECHO"; then if test "X${echo_test_string+set}" != Xset; then # find a string as large as possible, as long as the shell can cope with it for cmd in 'sed 50q "$0"' 'sed 20q "$0"' 'sed 10q "$0"' 'sed 2q "$0"' 'echo test'; do # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ... if (echo_test_string=`eval $cmd`) 2>/dev/null && echo_test_string=`eval $cmd` && (test "X$echo_test_string" = "X$echo_test_string") 2>/dev/null then break fi done fi if test "X`($echo '\t') 2>/dev/null`" = 'X\t' && echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then : else # The Solaris, AIX, and Digital Unix default echo programs unquote # backslashes. This makes it impossible to quote backslashes using # echo "$something" | sed 's/\\/\\\\/g' # # So, first we look for a working echo in the user's PATH. lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for dir in $PATH /usr/ucb; do IFS="$lt_save_ifs" if (test -f $dir/echo || test -f $dir/echo$ac_exeext) && test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' && echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then echo="$dir/echo" break fi done IFS="$lt_save_ifs" if test "X$echo" = Xecho; then # We didn't find a better echo, so look for alternatives. if test "X`(print -r '\t') 2>/dev/null`" = 'X\t' && echo_testing_string=`(print -r "$echo_test_string") 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then # This shell has a builtin print -r that does the trick. echo='print -r' elif (test -f /bin/ksh || test -f /bin/ksh$ac_exeext) && test "X$CONFIG_SHELL" != X/bin/ksh; then # If we have ksh, try running configure again with it. ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh} export ORIGINAL_CONFIG_SHELL CONFIG_SHELL=/bin/ksh export CONFIG_SHELL exec $CONFIG_SHELL "$0" --no-reexec ${1+"$@"} else # Try using printf. echo='printf %s\n' if test "X`($echo '\t') 2>/dev/null`" = 'X\t' && echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then # Cool, printf works : elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "$0" --fallback-echo '\t') 2>/dev/null` && test "X$echo_testing_string" = 'X\t' && echo_testing_string=`($ORIGINAL_CONFIG_SHELL "$0" --fallback-echo "$echo_test_string") 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL export CONFIG_SHELL SHELL="$CONFIG_SHELL" export SHELL echo="$CONFIG_SHELL $0 --fallback-echo" elif echo_testing_string=`($CONFIG_SHELL "$0" --fallback-echo '\t') 2>/dev/null` && test "X$echo_testing_string" = 'X\t' && echo_testing_string=`($CONFIG_SHELL "$0" --fallback-echo "$echo_test_string") 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then echo="$CONFIG_SHELL $0 --fallback-echo" else # maybe with a smaller string... prev=: for cmd in 'echo test' 'sed 2q "$0"' 'sed 10q "$0"' 'sed 20q "$0"' 'sed 50q "$0"'; do if (test "X$echo_test_string" = "X`eval $cmd`") 2>/dev/null then break fi prev="$cmd" done if test "$prev" != 'sed 50q "$0"'; then echo_test_string=`eval $prev` export echo_test_string exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "$0" ${1+"$@"} else # Oops. We lost completely, so just stick with echo. echo=echo fi fi fi fi fi fi # Copy echo and quote the copy suitably for passing to libtool from # the Makefile, instead of quoting the original, which is used later. ECHO=$echo if test "X$ECHO" = "X$CONFIG_SHELL $0 --fallback-echo"; then ECHO="$CONFIG_SHELL \\\$\$0 --fallback-echo" fi tagnames=${tagnames+${tagnames},}CXX tagnames=${tagnames+${tagnames},}F77 # Name of the host. # hostname on some systems (SVR3.2, Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` exec 6>&1 # # Initializations. # ac_default_prefix=/usr/local ac_config_libobj_dir=. cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= SHELL=${CONFIG_SHELL-/bin/sh} # Maximum number of lines to put in a shell here document. # This variable seems obsolete. It should probably be removed, and # only ac_max_sed_lines should be used. : ${ac_max_here_lines=38} # Identity of this package. PACKAGE_NAME= PACKAGE_TARNAME= PACKAGE_VERSION= PACKAGE_STRING= PACKAGE_BUGREPORT= ac_unique_file="src/tone_generate.c" # Factoring default headers for most tests. ac_includes_default="\ #include #if HAVE_SYS_TYPES_H # include #endif #if HAVE_SYS_STAT_H # include #endif #if STDC_HEADERS # include # include #else # if HAVE_STDLIB_H # include # endif #endif #if HAVE_STRING_H # if !STDC_HEADERS && HAVE_MEMORY_H # include # endif # include #endif #if HAVE_STRINGS_H # include #endif #if HAVE_INTTYPES_H # include #else # if HAVE_STDINT_H # include # endif #endif #if HAVE_UNISTD_H # include #endif" ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS SPANDSP_LT_CURRENT SPANDSP_LT_REVISION SPANDSP_LT_AGE INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA CYGPATH_W PACKAGE VERSION ACLOCAL AUTOCONF AUTOMAKE AUTOHEADER MAKEINFO install_sh STRIP ac_ct_STRIP INSTALL_STRIP_PROGRAM mkdir_p AWK SET_MAKE am__leading_dot AMTAR am__tar am__untar build build_cpu build_vendor build_os host host_cpu host_vendor host_os CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT DEPDIR am__include am__quote AMDEP_TRUE AMDEP_FALSE AMDEPBACKSLASH CCDEPMODE am__fastdepCC_TRUE am__fastdepCC_FALSE CXX CXXFLAGS ac_ct_CXX CXXDEPMODE am__fastdepCXX_TRUE am__fastdepCXX_FALSE CPP EGREP SED LN_S ECHO AR ac_ct_AR RANLIB ac_ct_RANLIB DSYMUTIL ac_ct_DSYMUTIL NMEDIT ac_ct_NMEDIT CXXCPP F77 FFLAGS ac_ct_F77 LIBTOOL LIBOBJS COND_DOC_TRUE COND_DOC_FALSE COND_TESTS_TRUE COND_TESTS_FALSE COND_TESTDATA_TRUE COND_TESTDATA_FALSE COND_MMX_TRUE COND_MMX_FALSE COND_SSE_TRUE COND_SSE_FALSE CC_FOR_BUILD CPPFLAGS_FOR_BUILD COMP_VENDOR_CFLAGS COMP_VENDOR_LDFLAGS TESTLIBS SPANDSP_USE_FIXED_POINT SPANDSP_MISALIGNED_ACCESS_FAILS INSERT_INTTYPES_HEADER INSERT_STDINT_HEADER INSERT_TGMATH_HEADER INSERT_MATH_HEADER LTLIBOBJS' ac_subst_files='' # Initialize some variables set by options. ac_init_help= ac_init_version=false # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datadir='${prefix}/share' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' libdir='${exec_prefix}/lib' includedir='${prefix}/include' oldincludedir='/usr/include' infodir='${prefix}/info' mandir='${prefix}/man' ac_prev= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval "$ac_prev=\$ac_option" ac_prev= continue fi ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'` # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_option in -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad | --data | --dat | --da) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \ | --da=*) datadir=$ac_optarg ;; -disable-* | --disable-*) ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid feature name: $ac_feature" >&2 { (exit 1); exit 1; }; } ac_feature=`echo $ac_feature | sed 's/-/_/g'` eval "enable_$ac_feature=no" ;; -enable-* | --enable-*) ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid feature name: $ac_feature" >&2 { (exit 1); exit 1; }; } ac_feature=`echo $ac_feature | sed 's/-/_/g'` case $ac_option in *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;; *) ac_optarg=yes ;; esac eval "enable_$ac_feature='$ac_optarg'" ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst \ | --locals | --local | --loca | --loc | --lo) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* \ | --locals=* | --local=* | --loca=* | --loc=* | --lo=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid package name: $ac_package" >&2 { (exit 1); exit 1; }; } ac_package=`echo $ac_package| sed 's/-/_/g'` case $ac_option in *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;; *) ac_optarg=yes ;; esac eval "with_$ac_package='$ac_optarg'" ;; -without-* | --without-*) ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid package name: $ac_package" >&2 { (exit 1); exit 1; }; } ac_package=`echo $ac_package | sed 's/-/_/g'` eval "with_$ac_package=no" ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) { echo "$as_me: error: unrecognized option: $ac_option Try \`$0 --help' for more information." >&2 { (exit 1); exit 1; }; } ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid variable name: $ac_envvar" >&2 { (exit 1); exit 1; }; } ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` eval "$ac_envvar='$ac_optarg'" export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option} ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` { echo "$as_me: error: missing argument to $ac_option" >&2 { (exit 1); exit 1; }; } fi # Be sure to have absolute paths. for ac_var in exec_prefix prefix do eval ac_val=$`echo $ac_var` case $ac_val in [\\/$]* | ?:[\\/]* | NONE | '' ) ;; *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 { (exit 1); exit 1; }; };; esac done # Be sure to have absolute paths. for ac_var in bindir sbindir libexecdir datadir sysconfdir sharedstatedir \ localstatedir libdir includedir oldincludedir infodir mandir do eval ac_val=$`echo $ac_var` case $ac_val in [\\/$]* | ?:[\\/]* ) ;; *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 { (exit 1); exit 1; }; };; esac done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host. If a cross compiler is detected then cross compile mode will be used." >&2 elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then its parent. ac_confdir=`(dirname "$0") 2>/dev/null || $as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$0" : 'X\(//\)[^/]' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| \ . : '\(.\)' 2>/dev/null || echo X"$0" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } /^X\(\/\/\)$/{ s//\1/; q; } /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'` srcdir=$ac_confdir if test ! -r $srcdir/$ac_unique_file; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r $srcdir/$ac_unique_file; then if test "$ac_srcdir_defaulted" = yes; then { echo "$as_me: error: cannot find sources ($ac_unique_file) in $ac_confdir or .." >&2 { (exit 1); exit 1; }; } else { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2 { (exit 1); exit 1; }; } fi fi (cd $srcdir && test -r ./$ac_unique_file) 2>/dev/null || { echo "$as_me: error: sources are in $srcdir, but \`cd $srcdir' does not work" >&2 { (exit 1); exit 1; }; } srcdir=`echo "$srcdir" | sed 's%\([^\\/]\)[\\/]*$%\1%'` ac_env_build_alias_set=${build_alias+set} ac_env_build_alias_value=$build_alias ac_cv_env_build_alias_set=${build_alias+set} ac_cv_env_build_alias_value=$build_alias ac_env_host_alias_set=${host_alias+set} ac_env_host_alias_value=$host_alias ac_cv_env_host_alias_set=${host_alias+set} ac_cv_env_host_alias_value=$host_alias ac_env_target_alias_set=${target_alias+set} ac_env_target_alias_value=$target_alias ac_cv_env_target_alias_set=${target_alias+set} ac_cv_env_target_alias_value=$target_alias ac_env_CC_set=${CC+set} ac_env_CC_value=$CC ac_cv_env_CC_set=${CC+set} ac_cv_env_CC_value=$CC ac_env_CFLAGS_set=${CFLAGS+set} ac_env_CFLAGS_value=$CFLAGS ac_cv_env_CFLAGS_set=${CFLAGS+set} ac_cv_env_CFLAGS_value=$CFLAGS ac_env_LDFLAGS_set=${LDFLAGS+set} ac_env_LDFLAGS_value=$LDFLAGS ac_cv_env_LDFLAGS_set=${LDFLAGS+set} ac_cv_env_LDFLAGS_value=$LDFLAGS ac_env_CPPFLAGS_set=${CPPFLAGS+set} ac_env_CPPFLAGS_value=$CPPFLAGS ac_cv_env_CPPFLAGS_set=${CPPFLAGS+set} ac_cv_env_CPPFLAGS_value=$CPPFLAGS ac_env_CXX_set=${CXX+set} ac_env_CXX_value=$CXX ac_cv_env_CXX_set=${CXX+set} ac_cv_env_CXX_value=$CXX ac_env_CXXFLAGS_set=${CXXFLAGS+set} ac_env_CXXFLAGS_value=$CXXFLAGS ac_cv_env_CXXFLAGS_set=${CXXFLAGS+set} ac_cv_env_CXXFLAGS_value=$CXXFLAGS ac_env_CPP_set=${CPP+set} ac_env_CPP_value=$CPP ac_cv_env_CPP_set=${CPP+set} ac_cv_env_CPP_value=$CPP ac_env_CXXCPP_set=${CXXCPP+set} ac_env_CXXCPP_value=$CXXCPP ac_cv_env_CXXCPP_set=${CXXCPP+set} ac_cv_env_CXXCPP_value=$CXXCPP ac_env_F77_set=${F77+set} ac_env_F77_value=$F77 ac_cv_env_F77_set=${F77+set} ac_cv_env_F77_value=$F77 ac_env_FFLAGS_set=${FFLAGS+set} ac_env_FFLAGS_value=$FFLAGS ac_cv_env_FFLAGS_set=${FFLAGS+set} ac_cv_env_FFLAGS_value=$FFLAGS # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures this package to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] _ACEOF cat <<_ACEOF Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --datadir=DIR read-only architecture-independent data [PREFIX/share] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --infodir=DIR info documentation [PREFIX/info] --mandir=DIR man documentation [PREFIX/man] _ACEOF cat <<\_ACEOF Program names: --program-prefix=PREFIX prepend PREFIX to installed program names --program-suffix=SUFFIX append SUFFIX to installed program names --program-transform-name=PROGRAM run sed PROGRAM on installed program names System types: --build=BUILD configure for building on BUILD [guessed] --host=HOST cross-compile to build programs to run on HOST [BUILD] _ACEOF fi if test -n "$ac_init_help"; then cat <<\_ACEOF Optional Features: --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --disable-dependency-tracking speeds up one-time build --enable-dependency-tracking do not reject slow dependency extractors --enable-shared[=PKGS] build shared libraries [default=yes] --enable-static[=PKGS] build static libraries [default=yes] --enable-fast-install[=PKGS] optimize for fast installation [default=yes] --disable-libtool-lock avoid locking (might break parallel builds) --enable-doc Build the documentation --enable-tests Build the test programs --enable-test-data Build TIFF test files for some ITU test images --enable-mmx Enable MMX support --enable-sse Enable SSE support --enable-fixed-point Enable fixed point support Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-gnu-ld assume the C compiler uses GNU ld [default=no] --with-pic try to use only PIC/non-PIC objects [default=use both] --with-tags[=TAGS] include additional configurations [automatic] Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory CPPFLAGS C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CXX C++ compiler command CXXFLAGS C++ compiler flags CPP C preprocessor CXXCPP C++ preprocessor F77 Fortran 77 compiler command FFLAGS Fortran 77 compiler flags Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. _ACEOF fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. ac_popdir=`pwd` for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d $ac_dir || continue ac_builddir=. if test "$ac_dir" != .; then ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` # A "../" for each directory in $ac_dir_suffix. ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` else ac_dir_suffix= ac_top_builddir= fi case $srcdir in .) # No --srcdir option. We are building in place. ac_srcdir=. if test -z "$ac_top_builddir"; then ac_top_srcdir=. else ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` fi ;; [\\/]* | ?:[\\/]* ) # Absolute path. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ;; *) # Relative path. ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_builddir$srcdir ;; esac # Do not use `cd foo && pwd` to compute absolute paths, because # the directories may not exist. case `pwd` in .) ac_abs_builddir="$ac_dir";; *) case "$ac_dir" in .) ac_abs_builddir=`pwd`;; [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";; *) ac_abs_builddir=`pwd`/"$ac_dir";; esac;; esac case $ac_abs_builddir in .) ac_abs_top_builddir=${ac_top_builddir}.;; *) case ${ac_top_builddir}. in .) ac_abs_top_builddir=$ac_abs_builddir;; [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;; *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;; esac;; esac case $ac_abs_builddir in .) ac_abs_srcdir=$ac_srcdir;; *) case $ac_srcdir in .) ac_abs_srcdir=$ac_abs_builddir;; [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;; *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;; esac;; esac case $ac_abs_builddir in .) ac_abs_top_srcdir=$ac_top_srcdir;; *) case $ac_top_srcdir in .) ac_abs_top_srcdir=$ac_abs_builddir;; [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;; *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;; esac;; esac cd $ac_dir # Check for guested configure; otherwise get Cygnus style configure. if test -f $ac_srcdir/configure.gnu; then echo $SHELL $ac_srcdir/configure.gnu --help=recursive elif test -f $ac_srcdir/configure; then echo $SHELL $ac_srcdir/configure --help=recursive elif test -f $ac_srcdir/configure.ac || test -f $ac_srcdir/configure.in; then echo $ac_configure --help else echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi cd $ac_popdir done fi test -n "$ac_init_help" && exit 0 if $ac_init_version; then cat <<\_ACEOF Copyright (C) 2003 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit 0 fi exec 5>config.log cat >&5 <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by $as_me, which was generated by GNU Autoconf 2.59. Invocation command line was $ $0 $@ _ACEOF { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` hostinfo = `(hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. echo "PATH: $as_dir" done } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_sep= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*) ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;; 2) ac_configure_args1="$ac_configure_args1 '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi ac_configure_args="$ac_configure_args$ac_sep'$ac_arg'" # Get rid of the leading space. ac_sep=" " ;; esac done done $as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; } $as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export ac_configure_args1; } # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Be sure not to use single quotes in there, as some shells, # such as our DU 5.0 friend, will then `close' the trap. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo cat <<\_ASBOX ## ---------------- ## ## Cache variables. ## ## ---------------- ## _ASBOX echo # The following way of writing the cache mishandles newlines in values, { (set) 2>&1 | case `(ac_space='"'"' '"'"'; set | grep ac_space) 2>&1` in *ac_space=\ *) sed -n \ "s/'"'"'/'"'"'\\\\'"'"''"'"'/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='"'"'\\2'"'"'/p" ;; *) sed -n \ "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" ;; esac; } echo cat <<\_ASBOX ## ----------------- ## ## Output variables. ## ## ----------------- ## _ASBOX echo for ac_var in $ac_subst_vars do eval ac_val=$`echo $ac_var` echo "$ac_var='"'"'$ac_val'"'"'" done | sort echo if test -n "$ac_subst_files"; then cat <<\_ASBOX ## ------------- ## ## Output files. ## ## ------------- ## _ASBOX echo for ac_var in $ac_subst_files do eval ac_val=$`echo $ac_var` echo "$ac_var='"'"'$ac_val'"'"'" done | sort echo fi if test -s confdefs.h; then cat <<\_ASBOX ## ----------- ## ## confdefs.h. ## ## ----------- ## _ASBOX echo sed "/^$/d" confdefs.h | sort echo fi test "$ac_signal" != 0 && echo "$as_me: caught signal $ac_signal" echo "$as_me: exit $exit_status" } >&5 rm -f core *.core && rm -rf conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -rf conftest* confdefs.h # AIX cpp loses on an empty file, so make sure it contains at least a newline. echo >confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer explicitly selected file to automatically selected ones. if test -z "$CONFIG_SITE"; then if test "x$prefix" != xNONE; then CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site" else CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" fi fi for ac_site_file in $CONFIG_SITE; do if test -r "$ac_site_file"; then { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5 echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special # files actually), so we avoid doing that. if test -f "$cache_file"; then { echo "$as_me:$LINENO: loading cache $cache_file" >&5 echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . $cache_file;; *) . ./$cache_file;; esac fi else { echo "$as_me:$LINENO: creating cache $cache_file" >&5 echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in `(set) 2>&1 | sed -n 's/^ac_env_\([a-zA-Z_0-9]*\)_set=.*/\1/p'`; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val="\$ac_cv_env_${ac_var}_value" eval ac_new_val="\$ac_env_${ac_var}_value" case $ac_old_set,$ac_new_set in set,) { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5 echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then { echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5 echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} { echo "$as_me:$LINENO: former value: $ac_old_val" >&5 echo "$as_me: former value: $ac_old_val" >&2;} { echo "$as_me:$LINENO: current value: $ac_new_val" >&5 echo "$as_me: current value: $ac_new_val" >&2;} ac_cache_corrupted=: fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*) ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) ac_configure_args="$ac_configure_args '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5 echo "$as_me: error: changes in the environment can compromise the build" >&2;} { { echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5 echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;} { (exit 1); exit 1; }; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu # =========================================================================== # http://autoconf-archive.cryp.to/ax_compiler_vendor.html # =========================================================================== # # SYNOPSIS # # AX_COMPILER_VENDOR # # DESCRIPTION # # Determine the vendor of the C/C++ compiler, e.g., gnu, intel, ibm, sun, # hp, borland, comeau, dec, cray, kai, lcc, metrowerks, sgi, microsoft, # watcom, etc. The vendor is returned in the cache variable # $ax_cv_c_compiler_vendor for C and $ax_cv_cxx_compiler_vendor for C++. # # LAST MODIFICATION # # 2008-04-12 # # COPYLEFT # # Copyright (c) 2008 Steven G. Johnson # Copyright (c) 2008 Matteo Frigo # # 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 3 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, see . # # As a special exception, the respective Autoconf Macro's copyright owner # gives unlimited permission to copy, distribute and modify the configure # scripts that are the output of Autoconf when processing the Macro. You # need not follow the terms of the GNU General Public License when using # or distributing such scripts, even though portions of the text of the # Macro appear in them. The GNU General Public License (GPL) does govern # all other use of the material that constitutes the Autoconf Macro. # # This special exception to the GPL applies to versions of the Autoconf # Macro released by the Autoconf Macro Archive. When you make and # distribute a modified version of the Autoconf Macro, you may extend this # special exception to the GPL to apply to your modified version as well. # AX_CHECK_REAL_FILE(FILE, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) # ------------------------------------------------------------------ # # Check for the existence of FILE, and make sure it is a real file or # directory, and not a symbolic link. # # AX_CHECK_REAL_FILE # AX_FIXED_POINT_MACHINE(MACHINE, [ACTION-IF-FIXED-POINT], [ACTION-IF-NOT-FIXED-POINT]) # ------------------------------------------------------------------------------------- # # Check if a specified machine type is a fixed point only machine. That is, if it lacks # fast floating point support. # # This is a simple lookup amongst machines known to the current autotools. So far we deal # with the embedded ARM, Blackfin, MIPS, TI DSP and XScale processors as things which lack # fast hardware floating point. # # Other candidates would be the small embedded Power PCs. # # AX_FIXED_POINT_MACHINE # AX_MISALIGNED_ACCESS_FAILS(MACHINE, [ACTION-IF-MISALIGNED-FAILS], [ACTION-IF-MISALIGNED-OK]) # ------------------------------------------------------------------------------------- # # Check if a specified machine type cannot handle misaligned data. That is, multi-byte data # types which are not properly aligned in memory fail. Many machines are happy to work with # misaligned data, but slowing down a bit. Other machines just won't tolerate such data. # # This is a simple lookup amongst machines known to the current autotools. So far we only deal # with the ARM and sparc. # A lookup is used, as many of the devices which cannot handled misaligned access are embedded # processors, for which the code normally be cross-compiled. # # MISALIGNED_ACCESS_FAILS # @synopsis AX_C99_FLEXIBLE_ARRAY # # Does the compiler support the 1999 ISO C Standard "struct hack". # @version 1.1 Mar 15 2004 # @author Erik de Castro Lopo # # Permission to use, copy, modify, distribute, and sell this file for any # purpose is hereby granted without fee, provided that the above copyright # and this permission notice appear in all copies. No representations are # made about the suitability of this software for any purpose. It is # provided "as is" without express or implied warranty. # AX_C99_FLEXIBLE_ARRAY # @synopsis AX_C99_FUNC_LRINT # # Check whether C99's lrint function is available. # @version 1.3 Feb 12 2002 # @author Erik de Castro Lopo # # Permission to use, copy, modify, distribute, and sell this file for any # purpose is hereby granted without fee, provided that the above copyright # and this permission notice appear in all copies. No representations are # made about the suitability of this software for any purpose. It is # provided "as is" without express or implied warranty. # # AX_C99_FUNC_LRINT # @synopsis AX_C99_FUNC_LRINTF # # Check whether C99's lrintf function is available. # @version 1.3 Feb 12 2002 # @author Erik de Castro Lopo # # Permission to use, copy, modify, distribute, and sell this file for any # purpose is hereby granted without fee, provided that the above copyright # and this permission notice appear in all copies. No representations are # made about the suitability of this software for any purpose. It is # provided "as is" without express or implied warranty. # # AX_C99_FUNC_LRINTF # @synopsis AX_C99_FUNC_LLRINT # # Check whether C99's llrint function is available. # @version 1.1 Sep 30 2002 # @author Erik de Castro Lopo # # Permission to use, copy, modify, distribute, and sell this file for any # purpose is hereby granted without fee, provided that the above copyright # and this permission notice appear in all copies. No representations are # made about the suitability of this software for any purpose. It is # provided "as is" without express or implied warranty. # # AX_C99_FUNC_LLRINT # @synopsis AX_C99_FUNC_LLRINTF # # Check whether C99's llrintf function is available. # @version 1.1 Sep 30 2002 # @author Erik de Castro Lopo # # Permission to use, copy, modify, distribute, and sell this file for any # purpose is hereby granted without fee, provided that the above copyright # and this permission notice appear in all copies. No representations are # made about the suitability of this software for any purpose. It is # provided "as is" without express or implied warranty. # # AX_C99_FUNC_LLRINTF SPANDSP_MAJOR_VERSION=0 SPANDSP_MINOR_VERSION=0 SPANDSP_MICRO_VERSION=5 SPANDSP_LT_CURRENT=1 SPANDSP_LT_REVISION=0 SPANDSP_LT_AGE=0 VERSION=$SPANDSP_MAJOR_VERSION.$SPANDSP_MINOR_VERSION.$SPANDSP_MICRO_VERSION PACKAGE=spandsp ac_aux_dir= for ac_dir in config $srcdir/config; do if test -f $ac_dir/install-sh; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f $ac_dir/install.sh; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f $ac_dir/shtool; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then { { echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in config $srcdir/config" >&5 echo "$as_me: error: cannot find install-sh or install.sh in config $srcdir/config" >&2;} { (exit 1); exit 1; }; } fi ac_config_guess="$SHELL $ac_aux_dir/config.guess" ac_config_sub="$SHELL $ac_aux_dir/config.sub" ac_configure="$SHELL $ac_aux_dir/configure" # This should be Cygnus configure. ac_config_headers="$ac_config_headers src/config.h:config-h.in" am__api_version="1.9" # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5 echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6 if test -z "$INSTALL"; then if test "${ac_cv_path_install+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in ./ | .// | /cC/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi done done ;; esac done fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. We don't cache a # path for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the path is relative. INSTALL=$ac_install_sh fi fi echo "$as_me:$LINENO: result: $INSTALL" >&5 echo "${ECHO_T}$INSTALL" >&6 # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' echo "$as_me:$LINENO: checking whether build environment is sane" >&5 echo $ECHO_N "checking whether build environment is sane... $ECHO_C" >&6 # Just in case sleep 1 echo timestamp > conftest.file # Do `set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null` if test "$*" = "X"; then # -L didn't work. set X `ls -t $srcdir/configure conftest.file` fi rm -f conftest.file if test "$*" != "X $srcdir/configure conftest.file" \ && test "$*" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". { { echo "$as_me:$LINENO: error: ls -t appears to fail. Make sure there is not a broken alias in your environment" >&5 echo "$as_me: error: ls -t appears to fail. Make sure there is not a broken alias in your environment" >&2;} { (exit 1); exit 1; }; } fi test "$2" = conftest.file ) then # Ok. : else { { echo "$as_me:$LINENO: error: newly created file is older than distributed files! Check your system clock" >&5 echo "$as_me: error: newly created file is older than distributed files! Check your system clock" >&2;} { (exit 1); exit 1; }; } fi echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6 test "$program_prefix" != NONE && program_transform_name="s,^,$program_prefix,;$program_transform_name" # Use a double $ so make ignores it. test "$program_suffix" != NONE && program_transform_name="s,\$,$program_suffix,;$program_transform_name" # Double any \ or $. echo might interpret backslashes. # By default was `s,x,x', remove it if useless. cat <<\_ACEOF >conftest.sed s/[\\$]/&&/g;s/;s,x,x,$// _ACEOF program_transform_name=`echo $program_transform_name | sed -f conftest.sed` rm conftest.sed # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing" # Use eval to expand $SHELL if eval "$MISSING --run true"; then am_missing_run="$MISSING --run " else am_missing_run= { echo "$as_me:$LINENO: WARNING: \`missing' script is too old or missing" >&5 echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;} fi if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then # We used to keeping the `.' as first argument, in order to # allow $(mkdir_p) to be used without argument. As in # $(mkdir_p) $(somedir) # where $(somedir) is conditionally defined. However this is wrong # for two reasons: # 1. if the package is installed by a user who cannot write `.' # make install will fail, # 2. the above comment should most certainly read # $(mkdir_p) $(DESTDIR)$(somedir) # so it does not work when $(somedir) is undefined and # $(DESTDIR) is not. # To support the latter case, we have to write # test -z "$(somedir)" || $(mkdir_p) $(DESTDIR)$(somedir), # so the `.' trick is pointless. mkdir_p='mkdir -p --' else # On NextStep and OpenStep, the `mkdir' command does not # recognize any option. It will interpret all options as # directories to create, and then abort because `.' already # exists. for d in ./-p ./--version; do test -d $d && rmdir $d done # $(mkinstalldirs) is defined by Automake if mkinstalldirs exists. if test -f "$ac_aux_dir/mkinstalldirs"; then mkdir_p='$(mkinstalldirs)' else mkdir_p='$(install_sh) -d' fi fi for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_AWK+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AWK="$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then echo "$as_me:$LINENO: result: $AWK" >&5 echo "${ECHO_T}$AWK" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi test -n "$AWK" && break done echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5 echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6 set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y,:./+-,___p_,'` if eval "test \"\${ac_cv_prog_make_${ac_make}_set+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.make <<\_ACEOF all: @echo 'ac_maketemp="$(MAKE)"' _ACEOF # GNU make sometimes prints "make[1]: Entering...", which would confuse us. eval `${MAKE-make} -f conftest.make 2>/dev/null | grep temp=` if test -n "$ac_maketemp"; then eval ac_cv_prog_make_${ac_make}_set=yes else eval ac_cv_prog_make_${ac_make}_set=no fi rm -f conftest.make fi if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6 SET_MAKE= else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 SET_MAKE="MAKE=${MAKE-make}" fi rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null # test to see if srcdir already configured if test "`cd $srcdir && pwd`" != "`pwd`" && test -f $srcdir/config.status; then { { echo "$as_me:$LINENO: error: source directory already configured; run \"make distclean\" there first" >&5 echo "$as_me: error: source directory already configured; run \"make distclean\" there first" >&2;} { (exit 1); exit 1; }; } fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi # Define the identity of the package. PACKAGE=$PACKAGE VERSION=$VERSION cat >>confdefs.h <<_ACEOF #define PACKAGE "$PACKAGE" _ACEOF cat >>confdefs.h <<_ACEOF #define VERSION "$VERSION" _ACEOF # Some tools Automake needs. ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} install_sh=${install_sh-"$am_aux_dir/install-sh"} # Installed binaries are usually stripped using `strip' when the user # run `make install-strip'. However `strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the `STRIP' environment variable to overrule this program. if test "$cross_compiling" != no; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_STRIP+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then echo "$as_me:$LINENO: result: $STRIP" >&5 echo "${ECHO_T}$STRIP" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done test -z "$ac_cv_prog_ac_ct_STRIP" && ac_cv_prog_ac_ct_STRIP=":" fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5 echo "${ECHO_T}$ac_ct_STRIP" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi STRIP=$ac_ct_STRIP else STRIP="$ac_cv_prog_STRIP" fi fi INSTALL_STRIP_PROGRAM="\${SHELL} \$(install_sh) -c -s" # We need awk for the "check" target. The system "awk" is bad on # some platforms. # Always define AMTAR for backward compatibility. AMTAR=${AMTAR-"${am_missing_run}tar"} am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -' # Make sure we can run config.sub. $ac_config_sub sun4 >/dev/null 2>&1 || { { echo "$as_me:$LINENO: error: cannot run $ac_config_sub" >&5 echo "$as_me: error: cannot run $ac_config_sub" >&2;} { (exit 1); exit 1; }; } echo "$as_me:$LINENO: checking build system type" >&5 echo $ECHO_N "checking build system type... $ECHO_C" >&6 if test "${ac_cv_build+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_cv_build_alias=$build_alias test -z "$ac_cv_build_alias" && ac_cv_build_alias=`$ac_config_guess` test -z "$ac_cv_build_alias" && { { echo "$as_me:$LINENO: error: cannot guess build type; you must specify one" >&5 echo "$as_me: error: cannot guess build type; you must specify one" >&2;} { (exit 1); exit 1; }; } ac_cv_build=`$ac_config_sub $ac_cv_build_alias` || { { echo "$as_me:$LINENO: error: $ac_config_sub $ac_cv_build_alias failed" >&5 echo "$as_me: error: $ac_config_sub $ac_cv_build_alias failed" >&2;} { (exit 1); exit 1; }; } fi echo "$as_me:$LINENO: result: $ac_cv_build" >&5 echo "${ECHO_T}$ac_cv_build" >&6 build=$ac_cv_build build_cpu=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` build_vendor=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` build_os=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` echo "$as_me:$LINENO: checking host system type" >&5 echo $ECHO_N "checking host system type... $ECHO_C" >&6 if test "${ac_cv_host+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_cv_host_alias=$host_alias test -z "$ac_cv_host_alias" && ac_cv_host_alias=$ac_cv_build_alias ac_cv_host=`$ac_config_sub $ac_cv_host_alias` || { { echo "$as_me:$LINENO: error: $ac_config_sub $ac_cv_host_alias failed" >&5 echo "$as_me: error: $ac_config_sub $ac_cv_host_alias failed" >&2;} { (exit 1); exit 1; }; } fi echo "$as_me:$LINENO: result: $ac_cv_host" >&5 echo "${ECHO_T}$ac_cv_host" >&6 host=$ac_cv_host host_cpu=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` host_vendor=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` host_os=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then echo "$as_me:$LINENO: result: $CC" >&5 echo "${ECHO_T}$CC" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_ac_ct_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 echo "${ECHO_T}$ac_ct_CC" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi CC=$ac_ct_CC else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then echo "$as_me:$LINENO: result: $CC" >&5 echo "${ECHO_T}$CC" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_ac_ct_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="cc" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 echo "${ECHO_T}$ac_ct_CC" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi CC=$ac_ct_CC else CC="$ac_cv_prog_CC" fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then echo "$as_me:$LINENO: result: $CC" >&5 echo "${ECHO_T}$CC" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then echo "$as_me:$LINENO: result: $CC" >&5 echo "${ECHO_T}$CC" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_ac_ct_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 echo "${ECHO_T}$ac_ct_CC" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi test -n "$ac_ct_CC" && break done CC=$ac_ct_CC fi fi test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH See \`config.log' for more details." >&5 echo "$as_me: error: no acceptable C compiler found in \$PATH See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } # Provide some information about the compiler. echo "$as_me:$LINENO:" \ "checking for C compiler version" >&5 ac_compiler=`set X $ac_compile; echo $2` { (eval echo "$as_me:$LINENO: \"$ac_compiler --version &5\"") >&5 (eval $ac_compiler --version &5) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { (eval echo "$as_me:$LINENO: \"$ac_compiler -v &5\"") >&5 (eval $ac_compiler -v &5) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { (eval echo "$as_me:$LINENO: \"$ac_compiler -V &5\"") >&5 (eval $ac_compiler -V &5) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. echo "$as_me:$LINENO: checking for C compiler default output file name" >&5 echo $ECHO_N "checking for C compiler default output file name... $ECHO_C" >&6 ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` if { (eval echo "$as_me:$LINENO: \"$ac_link_default\"") >&5 (eval $ac_link_default) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then # Find the output, starting from the most likely. This scheme is # not robust to junk in `.', hence go to wildcards (a.*) only as a last # resort. # Be careful to initialize this variable, since it used to be cached. # Otherwise an old cache value of `no' led to `EXEEXT = no' in a Makefile. ac_cv_exeext= # b.out is created by i960 compilers. for ac_file in a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj ) ;; conftest.$ac_ext ) # This is the source file. ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` # FIXME: I believe we export ac_cv_exeext for Libtool, # but it would be cool to find out if it's true. Does anybody # maintain Libtool? --akim. export ac_cv_exeext break;; * ) break;; esac done else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { echo "$as_me:$LINENO: error: C compiler cannot create executables See \`config.log' for more details." >&5 echo "$as_me: error: C compiler cannot create executables See \`config.log' for more details." >&2;} { (exit 77); exit 77; }; } fi ac_exeext=$ac_cv_exeext echo "$as_me:$LINENO: result: $ac_file" >&5 echo "${ECHO_T}$ac_file" >&6 # Check the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. echo "$as_me:$LINENO: checking whether the C compiler works" >&5 echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6 # FIXME: These cross compiler hacks should be removed for Autoconf 3.0 # If not cross compiling, check that we can run a simple program. if test "$cross_compiling" != yes; then if { ac_try='./$ac_file' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { echo "$as_me:$LINENO: error: cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details." >&5 echo "$as_me: error: cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } fi fi fi echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6 rm -f a.out a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save # Check the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. echo "$as_me:$LINENO: checking whether we are cross compiling" >&5 echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6 echo "$as_me:$LINENO: result: $cross_compiling" >&5 echo "${ECHO_T}$cross_compiling" >&6 echo "$as_me:$LINENO: checking for suffix of executables" >&5 echo $ECHO_N "checking for suffix of executables... $ECHO_C" >&6 if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` export ac_cv_exeext break;; * ) break;; esac done else { { echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link See \`config.log' for more details." >&5 echo "$as_me: error: cannot compute suffix of executables: cannot compile and link See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } fi rm -f conftest$ac_cv_exeext echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5 echo "${ECHO_T}$ac_cv_exeext" >&6 rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT echo "$as_me:$LINENO: checking for suffix of object files" >&5 echo $ECHO_N "checking for suffix of object files... $ECHO_C" >&6 if test "${ac_cv_objext+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then for ac_file in `(ls conftest.o conftest.obj; ls conftest.*) 2>/dev/null`; do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile See \`config.log' for more details." >&5 echo "$as_me: error: cannot compute suffix of object files: cannot compile See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_objext" >&5 echo "${ECHO_T}$ac_cv_objext" >&6 OBJEXT=$ac_cv_objext ac_objext=$OBJEXT echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5 echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6 if test "${ac_cv_c_compiler_gnu+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_compiler_gnu=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_compiler_gnu=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5 echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6 GCC=`test $ac_compiler_gnu = yes && echo yes` ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS CFLAGS="-g" echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5 echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6 if test "${ac_cv_prog_cc_g+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_prog_cc_g=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_prog_cc_g=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5 echo "${ECHO_T}$ac_cv_prog_cc_g" >&6 if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi echo "$as_me:$LINENO: checking for $CC option to accept ANSI C" >&5 echo $ECHO_N "checking for $CC option to accept ANSI C... $ECHO_C" >&6 if test "${ac_cv_prog_cc_stdc+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_cv_prog_cc_stdc=no ac_save_CC=$CC cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include #include #include /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std1 is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std1. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF # Don't try gcc -ansi; that turns off useful extensions and # breaks some systems' header files. # AIX -qlanglvl=ansi # Ultrix and OSF/1 -std1 # HP-UX 10.20 and later -Ae # HP-UX older versions -Aa -D_HPUX_SOURCE # SVR4 -Xc -D__EXTENSIONS__ for ac_arg in "" -qlanglvl=ansi -std1 -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_prog_cc_stdc=$ac_arg break else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext done rm -f conftest.$ac_ext conftest.$ac_objext CC=$ac_save_CC fi case "x$ac_cv_prog_cc_stdc" in x|xno) echo "$as_me:$LINENO: result: none needed" >&5 echo "${ECHO_T}none needed" >&6 ;; *) echo "$as_me:$LINENO: result: $ac_cv_prog_cc_stdc" >&5 echo "${ECHO_T}$ac_cv_prog_cc_stdc" >&6 CC="$CC $ac_cv_prog_cc_stdc" ;; esac # Some people use a C++ compiler to compile C. Since we use `exit', # in C++ we need to declare it. In case someone uses the same compiler # for both compiling C and C++ we need to have the C++ compiler decide # the declaration of exit, since it's the most demanding environment. cat >conftest.$ac_ext <<_ACEOF #ifndef __cplusplus choke me #endif _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then for ac_declaration in \ '' \ 'extern "C" void std::exit (int) throw (); using std::exit;' \ 'extern "C" void std::exit (int); using std::exit;' \ 'extern "C" void exit (int) throw ();' \ 'extern "C" void exit (int);' \ 'void exit (int);' do cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_declaration #include int main () { exit (42); ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then : else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 continue fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_declaration int main () { exit (42); ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then break else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext done rm -f conftest* if test -n "$ac_declaration"; then echo '#ifdef __cplusplus' >>confdefs.h echo $ac_declaration >>confdefs.h echo '#endif' >>confdefs.h fi else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu DEPDIR="${am__leading_dot}deps" ac_config_commands="$ac_config_commands depfiles" am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo done .PHONY: am__doit END # If we don't find an include directive, just comment out the code. echo "$as_me:$LINENO: checking for style of include used by $am_make" >&5 echo $ECHO_N "checking for style of include used by $am_make... $ECHO_C" >&6 am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # We grep out `Entering directory' and `Leaving directory' # messages which can occur if `w' ends up in MAKEFLAGS. # In particular we don't look at `^make:' because GNU make might # be invoked under some other name (usually "gmake"), in which # case it prints its new name instead of `make'. if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then am__include=include am__quote= _am_result=GNU fi # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then am__include=.include am__quote="\"" _am_result=BSD fi fi echo "$as_me:$LINENO: result: $_am_result" >&5 echo "${ECHO_T}$_am_result" >&6 rm -f confinc confmf # Check whether --enable-dependency-tracking or --disable-dependency-tracking was given. if test "${enable_dependency_tracking+set}" = set; then enableval="$enable_dependency_tracking" fi; if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' fi if test "x$enable_dependency_tracking" != xno; then AMDEP_TRUE= AMDEP_FALSE='#' else AMDEP_TRUE='#' AMDEP_FALSE= fi depcc="$CC" am_compiler_list= echo "$as_me:$LINENO: checking dependency style of $depcc" >&5 echo $ECHO_N "checking dependency style of $depcc... $ECHO_C" >&6 if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named `D' -- because `-MD' means `put the output # in D'. mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CC_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with # Solaris 8's {/usr,}/bin/sh. touch sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf case $depmode in nosideeffect) # after this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; none) break ;; esac # We check with `-c' and `-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle `-M -o', and we need to detect this. if depmode=$depmode \ source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CC_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CC_dependencies_compiler_type=none fi fi echo "$as_me:$LINENO: result: $am_cv_CC_dependencies_compiler_type" >&5 echo "${ECHO_T}$am_cv_CC_dependencies_compiler_type" >&6 CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then am__fastdepCC_TRUE= am__fastdepCC_FALSE='#' else am__fastdepCC_TRUE='#' am__fastdepCC_FALSE= fi ac_ext=cc ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test -n "$ac_tool_prefix"; then for ac_prog in $CCC g++ c++ gpp aCC CC cxx cc++ cl FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_CXX+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$CXX"; then ac_cv_prog_CXX="$CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi CXX=$ac_cv_prog_CXX if test -n "$CXX"; then echo "$as_me:$LINENO: result: $CXX" >&5 echo "${ECHO_T}$CXX" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi test -n "$CXX" && break done fi if test -z "$CXX"; then ac_ct_CXX=$CXX for ac_prog in $CCC g++ c++ gpp aCC CC cxx cc++ cl FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_ac_ct_CXX+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$ac_ct_CXX"; then ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CXX="$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi ac_ct_CXX=$ac_cv_prog_ac_ct_CXX if test -n "$ac_ct_CXX"; then echo "$as_me:$LINENO: result: $ac_ct_CXX" >&5 echo "${ECHO_T}$ac_ct_CXX" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi test -n "$ac_ct_CXX" && break done test -n "$ac_ct_CXX" || ac_ct_CXX="g++" CXX=$ac_ct_CXX fi # Provide some information about the compiler. echo "$as_me:$LINENO:" \ "checking for C++ compiler version" >&5 ac_compiler=`set X $ac_compile; echo $2` { (eval echo "$as_me:$LINENO: \"$ac_compiler --version &5\"") >&5 (eval $ac_compiler --version &5) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { (eval echo "$as_me:$LINENO: \"$ac_compiler -v &5\"") >&5 (eval $ac_compiler -v &5) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { (eval echo "$as_me:$LINENO: \"$ac_compiler -V &5\"") >&5 (eval $ac_compiler -V &5) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } echo "$as_me:$LINENO: checking whether we are using the GNU C++ compiler" >&5 echo $ECHO_N "checking whether we are using the GNU C++ compiler... $ECHO_C" >&6 if test "${ac_cv_cxx_compiler_gnu+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_compiler_gnu=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_compiler_gnu=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_cxx_compiler_gnu=$ac_compiler_gnu fi echo "$as_me:$LINENO: result: $ac_cv_cxx_compiler_gnu" >&5 echo "${ECHO_T}$ac_cv_cxx_compiler_gnu" >&6 GXX=`test $ac_compiler_gnu = yes && echo yes` ac_test_CXXFLAGS=${CXXFLAGS+set} ac_save_CXXFLAGS=$CXXFLAGS CXXFLAGS="-g" echo "$as_me:$LINENO: checking whether $CXX accepts -g" >&5 echo $ECHO_N "checking whether $CXX accepts -g... $ECHO_C" >&6 if test "${ac_cv_prog_cxx_g+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_prog_cxx_g=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_prog_cxx_g=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_prog_cxx_g" >&5 echo "${ECHO_T}$ac_cv_prog_cxx_g" >&6 if test "$ac_test_CXXFLAGS" = set; then CXXFLAGS=$ac_save_CXXFLAGS elif test $ac_cv_prog_cxx_g = yes; then if test "$GXX" = yes; then CXXFLAGS="-g -O2" else CXXFLAGS="-g" fi else if test "$GXX" = yes; then CXXFLAGS="-O2" else CXXFLAGS= fi fi for ac_declaration in \ '' \ 'extern "C" void std::exit (int) throw (); using std::exit;' \ 'extern "C" void std::exit (int); using std::exit;' \ 'extern "C" void exit (int) throw ();' \ 'extern "C" void exit (int);' \ 'void exit (int);' do cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_declaration #include int main () { exit (42); ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then : else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 continue fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_declaration int main () { exit (42); ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then break else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext done rm -f conftest* if test -n "$ac_declaration"; then echo '#ifdef __cplusplus' >>confdefs.h echo $ac_declaration >>confdefs.h echo '#endif' >>confdefs.h fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu depcc="$CXX" am_compiler_list= echo "$as_me:$LINENO: checking dependency style of $depcc" >&5 echo $ECHO_N "checking dependency style of $depcc... $ECHO_C" >&6 if test "${am_cv_CXX_dependencies_compiler_type+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named `D' -- because `-MD' means `put the output # in D'. mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CXX_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with # Solaris 8's {/usr,}/bin/sh. touch sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf case $depmode in nosideeffect) # after this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; none) break ;; esac # We check with `-c' and `-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle `-M -o', and we need to detect this. if depmode=$depmode \ source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CXX_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CXX_dependencies_compiler_type=none fi fi echo "$as_me:$LINENO: result: $am_cv_CXX_dependencies_compiler_type" >&5 echo "${ECHO_T}$am_cv_CXX_dependencies_compiler_type" >&6 CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then am__fastdepCXX_TRUE= am__fastdepCXX_FALSE='#' else am__fastdepCXX_TRUE='#' am__fastdepCXX_FALSE= fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5 echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&6 # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if test "${ac_cv_prog_CPP+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then : else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Broken: fails on valid input. continue fi rm -f conftest.err conftest.$ac_ext # OK, works on sane cases. Now check whether non-existent headers # can be detected and how. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then # Broken: success on invalid input. continue else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.err conftest.$ac_ext if $ac_preproc_ok; then break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi echo "$as_me:$LINENO: result: $CPP" >&5 echo "${ECHO_T}$CPP" >&6 ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then : else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Broken: fails on valid input. continue fi rm -f conftest.err conftest.$ac_ext # OK, works on sane cases. Now check whether non-existent headers # can be detected and how. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then # Broken: success on invalid input. continue else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details." >&5 echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu echo "$as_me:$LINENO: checking for egrep" >&5 echo $ECHO_N "checking for egrep... $ECHO_C" >&6 if test "${ac_cv_prog_egrep+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if echo a | (grep -E '(a|b)') >/dev/null 2>&1 then ac_cv_prog_egrep='grep -E' else ac_cv_prog_egrep='egrep' fi fi echo "$as_me:$LINENO: result: $ac_cv_prog_egrep" >&5 echo "${ECHO_T}$ac_cv_prog_egrep" >&6 EGREP=$ac_cv_prog_egrep if test $ac_cv_c_compiler_gnu = yes; then echo "$as_me:$LINENO: checking whether $CC needs -traditional" >&5 echo $ECHO_N "checking whether $CC needs -traditional... $ECHO_C" >&6 if test "${ac_cv_prog_gcc_traditional+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_pattern="Autoconf.*'x'" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include Autoconf TIOCGETP _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "$ac_pattern" >/dev/null 2>&1; then ac_cv_prog_gcc_traditional=yes else ac_cv_prog_gcc_traditional=no fi rm -f conftest* if test $ac_cv_prog_gcc_traditional = no; then cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include Autoconf TCGETA _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "$ac_pattern" >/dev/null 2>&1; then ac_cv_prog_gcc_traditional=yes fi rm -f conftest* fi fi echo "$as_me:$LINENO: result: $ac_cv_prog_gcc_traditional" >&5 echo "${ECHO_T}$ac_cv_prog_gcc_traditional" >&6 if test $ac_cv_prog_gcc_traditional = yes; then CC="$CC -traditional" fi fi # Check whether --enable-shared or --disable-shared was given. if test "${enable_shared+set}" = set; then enableval="$enable_shared" p=${PACKAGE-default} case $enableval in yes) enable_shared=yes ;; no) enable_shared=no ;; *) enable_shared=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_shared=yes fi done IFS="$lt_save_ifs" ;; esac else enable_shared=yes fi; # Check whether --enable-static or --disable-static was given. if test "${enable_static+set}" = set; then enableval="$enable_static" p=${PACKAGE-default} case $enableval in yes) enable_static=yes ;; no) enable_static=no ;; *) enable_static=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_static=yes fi done IFS="$lt_save_ifs" ;; esac else enable_static=yes fi; # Check whether --enable-fast-install or --disable-fast-install was given. if test "${enable_fast_install+set}" = set; then enableval="$enable_fast_install" p=${PACKAGE-default} case $enableval in yes) enable_fast_install=yes ;; no) enable_fast_install=no ;; *) enable_fast_install=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_fast_install=yes fi done IFS="$lt_save_ifs" ;; esac else enable_fast_install=yes fi; echo "$as_me:$LINENO: checking for a sed that does not truncate output" >&5 echo $ECHO_N "checking for a sed that does not truncate output... $ECHO_C" >&6 if test "${lt_cv_path_SED+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else # Loop through the user's path and test for sed and gsed. # Then use that list of sed's as ones to test for truncation. as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for lt_ac_prog in sed gsed; do for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" fi done done done IFS=$as_save_IFS lt_ac_max=0 lt_ac_count=0 # Add /usr/xpg4/bin/sed as it is typically found on Solaris # along with /bin/sed that truncates output. for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do test ! -f $lt_ac_sed && continue cat /dev/null > conftest.in lt_ac_count=0 echo $ECHO_N "0123456789$ECHO_C" >conftest.in # Check for GNU sed and select it if it is found. if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then lt_cv_path_SED=$lt_ac_sed break fi while true; do cat conftest.in conftest.in >conftest.tmp mv conftest.tmp conftest.in cp conftest.in conftest.nl echo >>conftest.nl $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break cmp -s conftest.out conftest.nl || break # 10000 chars as input seems more than enough test $lt_ac_count -gt 10 && break lt_ac_count=`expr $lt_ac_count + 1` if test $lt_ac_count -gt $lt_ac_max; then lt_ac_max=$lt_ac_count lt_cv_path_SED=$lt_ac_sed fi done done fi SED=$lt_cv_path_SED echo "$as_me:$LINENO: result: $SED" >&5 echo "${ECHO_T}$SED" >&6 # Check whether --with-gnu-ld or --without-gnu-ld was given. if test "${with_gnu_ld+set}" = set; then withval="$with_gnu_ld" test "$withval" = no || with_gnu_ld=yes else with_gnu_ld=no fi; ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. echo "$as_me:$LINENO: checking for ld used by $CC" >&5 echo $ECHO_N "checking for ld used by $CC... $ECHO_C" >&6 case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [\\/]* | ?:[\\/]*) re_direlt='/[^/][^/]*/\.\./' # Canonicalize the pathname of ld ac_prog=`echo $ac_prog| $SED 's%\\\\%/%g'` while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do ac_prog=`echo $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then echo "$as_me:$LINENO: checking for GNU ld" >&5 echo $ECHO_N "checking for GNU ld... $ECHO_C" >&6 else echo "$as_me:$LINENO: checking for non-GNU ld" >&5 echo $ECHO_N "checking for non-GNU ld... $ECHO_C" >&6 fi if test "${lt_cv_path_LD+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -z "$LD"; then lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &5 echo "${ECHO_T}$LD" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi test -z "$LD" && { { echo "$as_me:$LINENO: error: no acceptable ld found in \$PATH" >&5 echo "$as_me: error: no acceptable ld found in \$PATH" >&2;} { (exit 1); exit 1; }; } echo "$as_me:$LINENO: checking if the linker ($LD) is GNU ld" >&5 echo $ECHO_N "checking if the linker ($LD) is GNU ld... $ECHO_C" >&6 if test "${lt_cv_prog_gnu_ld+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else # I'd rather use --version here, but apparently some GNU lds only accept -v. case `$LD -v 2>&1 &5 echo "${ECHO_T}$lt_cv_prog_gnu_ld" >&6 with_gnu_ld=$lt_cv_prog_gnu_ld echo "$as_me:$LINENO: checking for $LD option to reload object files" >&5 echo $ECHO_N "checking for $LD option to reload object files... $ECHO_C" >&6 if test "${lt_cv_ld_reload_flag+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lt_cv_ld_reload_flag='-r' fi echo "$as_me:$LINENO: result: $lt_cv_ld_reload_flag" >&5 echo "${ECHO_T}$lt_cv_ld_reload_flag" >&6 reload_flag=$lt_cv_ld_reload_flag case $reload_flag in "" | " "*) ;; *) reload_flag=" $reload_flag" ;; esac reload_cmds='$LD$reload_flag -o $output$reload_objs' case $host_os in darwin*) if test "$GCC" = yes; then reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs' else reload_cmds='$LD$reload_flag -o $output$reload_objs' fi ;; esac echo "$as_me:$LINENO: checking for BSD-compatible nm" >&5 echo $ECHO_N "checking for BSD-compatible nm... $ECHO_C" >&6 if test "${lt_cv_path_NM+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$NM"; then # Let the user override the test. lt_cv_path_NM="$NM" else lt_nm_to_check="${ac_tool_prefix}nm" if test -n "$ac_tool_prefix" && test "$build" = "$host"; then lt_nm_to_check="$lt_nm_to_check nm" fi for lt_tmp_nm in $lt_nm_to_check; do lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. tmp_nm="$ac_dir/$lt_tmp_nm" if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then # Check to see if the nm accepts a BSD-compat flag. # Adding the `sed 1q' prevents false positives on HP-UX, which says: # nm: unknown option "B" ignored # Tru64's nm complains that /dev/null is an invalid object file case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in */dev/null* | *'Invalid file or object type'*) lt_cv_path_NM="$tmp_nm -B" break ;; *) case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in */dev/null*) lt_cv_path_NM="$tmp_nm -p" break ;; *) lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but continue # so that we can try to find one that supports BSD flags ;; esac ;; esac fi done IFS="$lt_save_ifs" done test -z "$lt_cv_path_NM" && lt_cv_path_NM=nm fi fi echo "$as_me:$LINENO: result: $lt_cv_path_NM" >&5 echo "${ECHO_T}$lt_cv_path_NM" >&6 NM="$lt_cv_path_NM" echo "$as_me:$LINENO: checking whether ln -s works" >&5 echo $ECHO_N "checking whether ln -s works... $ECHO_C" >&6 LN_S=$as_ln_s if test "$LN_S" = "ln -s"; then echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6 else echo "$as_me:$LINENO: result: no, using $LN_S" >&5 echo "${ECHO_T}no, using $LN_S" >&6 fi echo "$as_me:$LINENO: checking how to recognize dependent libraries" >&5 echo $ECHO_N "checking how to recognize dependent libraries... $ECHO_C" >&6 if test "${lt_cv_deplibs_check_method+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lt_cv_file_magic_cmd='$MAGIC_CMD' lt_cv_file_magic_test_file= lt_cv_deplibs_check_method='unknown' # Need to set the preceding variable on all platforms that support # interlibrary dependencies. # 'none' -- dependencies not supported. # `unknown' -- same as none, but documents that we really don't know. # 'pass_all' -- all dependencies passed with no checks. # 'test_compile' -- check by making test program. # 'file_magic [[regex]]' -- check by looking for files in library path # which responds to the $file_magic_cmd with a given extended regex. # If you have `file' or equivalent on your system and you're not sure # whether `pass_all' will *always* work, you probably want this one. case $host_os in aix[4-9]*) lt_cv_deplibs_check_method=pass_all ;; beos*) lt_cv_deplibs_check_method=pass_all ;; bsdi[45]*) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)' lt_cv_file_magic_cmd='/usr/bin/file -L' lt_cv_file_magic_test_file=/shlib/libc.so ;; cygwin*) # func_win32_libid is a shell function defined in ltmain.sh lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' ;; mingw* | pw32*) # Base MSYS/MinGW do not provide the 'file' command needed by # func_win32_libid shell function, so use a weaker test based on 'objdump', # unless we find 'file', for example because we are cross-compiling. if ( file / ) >/dev/null 2>&1; then lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' else lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?' lt_cv_file_magic_cmd='$OBJDUMP -f' fi ;; darwin* | rhapsody*) lt_cv_deplibs_check_method=pass_all ;; freebsd* | dragonfly*) if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then case $host_cpu in i*86 ) # Not sure whether the presence of OpenBSD here was a mistake. # Let's accept both of them until this is cleared up. lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` ;; esac else lt_cv_deplibs_check_method=pass_all fi ;; gnu*) lt_cv_deplibs_check_method=pass_all ;; hpux10.20* | hpux11*) lt_cv_file_magic_cmd=/usr/bin/file case $host_cpu in ia64*) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64' lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so ;; hppa*64*) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - PA-RISC [0-9].[0-9]' lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl ;; *) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9].[0-9]) shared library' lt_cv_file_magic_test_file=/usr/lib/libc.sl ;; esac ;; interix[3-9]*) # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$' ;; irix5* | irix6* | nonstopux*) case $LD in *-32|*"-32 ") libmagic=32-bit;; *-n32|*"-n32 ") libmagic=N32;; *-64|*"-64 ") libmagic=64-bit;; *) libmagic=never-match;; esac lt_cv_deplibs_check_method=pass_all ;; # This must be Linux ELF. linux* | k*bsd*-gnu) lt_cv_deplibs_check_method=pass_all ;; netbsd*) if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$' fi ;; newos6*) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=/usr/lib/libnls.so ;; nto-qnx*) lt_cv_deplibs_check_method=unknown ;; openbsd*) if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' fi ;; osf3* | osf4* | osf5*) lt_cv_deplibs_check_method=pass_all ;; rdos*) lt_cv_deplibs_check_method=pass_all ;; solaris*) lt_cv_deplibs_check_method=pass_all ;; sysv4 | sysv4.3*) case $host_vendor in motorola) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]' lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` ;; ncr) lt_cv_deplibs_check_method=pass_all ;; sequent) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' ;; sni) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib" lt_cv_file_magic_test_file=/lib/libc.so ;; siemens) lt_cv_deplibs_check_method=pass_all ;; pc) lt_cv_deplibs_check_method=pass_all ;; esac ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) lt_cv_deplibs_check_method=pass_all ;; esac fi echo "$as_me:$LINENO: result: $lt_cv_deplibs_check_method" >&5 echo "${ECHO_T}$lt_cv_deplibs_check_method" >&6 file_magic_cmd=$lt_cv_file_magic_cmd deplibs_check_method=$lt_cv_deplibs_check_method test -z "$deplibs_check_method" && deplibs_check_method=unknown # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # Check whether --enable-libtool-lock or --disable-libtool-lock was given. if test "${enable_libtool_lock+set}" = set; then enableval="$enable_libtool_lock" fi; test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes # Some flags need to be propagated to the compiler or linker for good # libtool support. case $host in ia64-*-hpux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then case `/usr/bin/file conftest.$ac_objext` in *ELF-32*) HPUX_IA64_MODE="32" ;; *ELF-64*) HPUX_IA64_MODE="64" ;; esac fi rm -rf conftest* ;; *-*-irix6*) # Find out which ABI we are using. echo '#line 4606 "configure"' > conftest.$ac_ext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then if test "$lt_cv_prog_gnu_ld" = yes; then case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -melf32bsmip" ;; *N32*) LD="${LD-ld} -melf32bmipn32" ;; *64-bit*) LD="${LD-ld} -melf64bmip" ;; esac else case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -32" ;; *N32*) LD="${LD-ld} -n32" ;; *64-bit*) LD="${LD-ld} -64" ;; esac fi fi rm -rf conftest* ;; x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \ s390*-*linux*|sparc*-*linux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then case `/usr/bin/file conftest.o` in *32-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_i386_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_i386" ;; ppc64-*linux*|powerpc64-*linux*) LD="${LD-ld} -m elf32ppclinux" ;; s390x-*linux*) LD="${LD-ld} -m elf_s390" ;; sparc64-*linux*) LD="${LD-ld} -m elf32_sparc" ;; esac ;; *64-bit*) libsuff=64 case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_x86_64_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_x86_64" ;; ppc*-*linux*|powerpc*-*linux*) LD="${LD-ld} -m elf64ppc" ;; s390*-*linux*) LD="${LD-ld} -m elf64_s390" ;; sparc*-*linux*) LD="${LD-ld} -m elf64_sparc" ;; esac ;; esac fi rm -rf conftest* ;; *-*-sco3.2v5*) # On SCO OpenServer 5, we need -belf to get full-featured binaries. SAVE_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -belf" echo "$as_me:$LINENO: checking whether the C compiler needs -belf" >&5 echo $ECHO_N "checking whether the C compiler needs -belf... $ECHO_C" >&6 if test "${lt_cv_cc_needs_belf+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then lt_cv_cc_needs_belf=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 lt_cv_cc_needs_belf=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu fi echo "$as_me:$LINENO: result: $lt_cv_cc_needs_belf" >&5 echo "${ECHO_T}$lt_cv_cc_needs_belf" >&6 if test x"$lt_cv_cc_needs_belf" != x"yes"; then # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf CFLAGS="$SAVE_CFLAGS" fi ;; sparc*-*solaris*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then case `/usr/bin/file conftest.o` in *64-bit*) case $lt_cv_prog_gnu_ld in yes*) LD="${LD-ld} -m elf64_sparc" ;; *) if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then LD="${LD-ld} -64" fi ;; esac ;; esac fi rm -rf conftest* ;; esac need_locks="$enable_libtool_lock" echo "$as_me:$LINENO: checking for ANSI C header files" >&5 echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6 if test "${ac_cv_header_stdc+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_header_stdc=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_header_stdc=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) exit(2); exit (0); } _ACEOF rm -f conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='./conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then : else echo "$as_me: program exited with status $ac_status" >&5 echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ( exit $ac_status ) ac_cv_header_stdc=no fi rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi fi fi echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5 echo "${ECHO_T}$ac_cv_header_stdc" >&6 if test $ac_cv_header_stdc = yes; then cat >>confdefs.h <<\_ACEOF #define STDC_HEADERS 1 _ACEOF fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then eval "$as_ac_Header=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 eval "$as_ac_Header=no" fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 if test `eval echo '${'$as_ac_Header'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in dlfcn.h do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` if eval "test \"\${$as_ac_Header+set}\" = set"; then echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 else # Is the header compilable? echo "$as_me:$LINENO: checking $ac_header usability" >&5 echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_header_compiler=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_compiler=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 echo "${ECHO_T}$ac_header_compiler" >&6 # Is the header present? echo "$as_me:$LINENO: checking $ac_header presence" >&5 echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include <$ac_header> _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then ac_header_preproc=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_preproc=no fi rm -f conftest.err conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 echo "${ECHO_T}$ac_header_preproc" >&6 # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in yes:no: ) { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} ac_header_preproc=yes ;; no:yes:* ) { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} ( cat <<\_ASBOX ## ------------------------------------------ ## ## Report this to the AC_PACKAGE_NAME lists. ## ## ------------------------------------------ ## _ASBOX ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else eval "$as_ac_Header=\$ac_header_preproc" fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 fi if test `eval echo '${'$as_ac_Header'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done if test -n "$CXX" && ( test "X$CXX" != "Xno" && ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || (test "X$CXX" != "Xg++"))) ; then ac_ext=cc ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu echo "$as_me:$LINENO: checking how to run the C++ preprocessor" >&5 echo $ECHO_N "checking how to run the C++ preprocessor... $ECHO_C" >&6 if test -z "$CXXCPP"; then if test "${ac_cv_prog_CXXCPP+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else # Double quotes because CXXCPP needs to be expanded for CXXCPP in "$CXX -E" "/lib/cpp" do ac_preproc_ok=false for ac_cxx_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_cxx_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then : else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Broken: fails on valid input. continue fi rm -f conftest.err conftest.$ac_ext # OK, works on sane cases. Now check whether non-existent headers # can be detected and how. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_cxx_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then # Broken: success on invalid input. continue else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.err conftest.$ac_ext if $ac_preproc_ok; then break fi done ac_cv_prog_CXXCPP=$CXXCPP fi CXXCPP=$ac_cv_prog_CXXCPP else ac_cv_prog_CXXCPP=$CXXCPP fi echo "$as_me:$LINENO: result: $CXXCPP" >&5 echo "${ECHO_T}$CXXCPP" >&6 ac_preproc_ok=false for ac_cxx_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_cxx_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then : else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Broken: fails on valid input. continue fi rm -f conftest.err conftest.$ac_ext # OK, works on sane cases. Now check whether non-existent headers # can be detected and how. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_cxx_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then # Broken: success on invalid input. continue else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { echo "$as_me:$LINENO: error: C++ preprocessor \"$CXXCPP\" fails sanity check See \`config.log' for more details." >&5 echo "$as_me: error: C++ preprocessor \"$CXXCPP\" fails sanity check See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } fi ac_ext=cc ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu fi ac_ext=f ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5' ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_f77_compiler_gnu if test -n "$ac_tool_prefix"; then for ac_prog in g77 f77 xlf frt pgf77 fort77 fl32 af77 f90 xlf90 pgf90 epcf90 f95 fort xlf95 ifc efc pgf95 lf95 gfortran do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_F77+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$F77"; then ac_cv_prog_F77="$F77" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_F77="$ac_tool_prefix$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi F77=$ac_cv_prog_F77 if test -n "$F77"; then echo "$as_me:$LINENO: result: $F77" >&5 echo "${ECHO_T}$F77" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi test -n "$F77" && break done fi if test -z "$F77"; then ac_ct_F77=$F77 for ac_prog in g77 f77 xlf frt pgf77 fort77 fl32 af77 f90 xlf90 pgf90 epcf90 f95 fort xlf95 ifc efc pgf95 lf95 gfortran do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_ac_ct_F77+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$ac_ct_F77"; then ac_cv_prog_ac_ct_F77="$ac_ct_F77" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_F77="$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi ac_ct_F77=$ac_cv_prog_ac_ct_F77 if test -n "$ac_ct_F77"; then echo "$as_me:$LINENO: result: $ac_ct_F77" >&5 echo "${ECHO_T}$ac_ct_F77" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi test -n "$ac_ct_F77" && break done F77=$ac_ct_F77 fi # Provide some information about the compiler. echo "$as_me:5518:" \ "checking for Fortran 77 compiler version" >&5 ac_compiler=`set X $ac_compile; echo $2` { (eval echo "$as_me:$LINENO: \"$ac_compiler --version &5\"") >&5 (eval $ac_compiler --version &5) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { (eval echo "$as_me:$LINENO: \"$ac_compiler -v &5\"") >&5 (eval $ac_compiler -v &5) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { (eval echo "$as_me:$LINENO: \"$ac_compiler -V &5\"") >&5 (eval $ac_compiler -V &5) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } rm -f a.out # If we don't use `.F' as extension, the preprocessor is not run on the # input file. (Note that this only needs to work for GNU compilers.) ac_save_ext=$ac_ext ac_ext=F echo "$as_me:$LINENO: checking whether we are using the GNU Fortran 77 compiler" >&5 echo $ECHO_N "checking whether we are using the GNU Fortran 77 compiler... $ECHO_C" >&6 if test "${ac_cv_f77_compiler_gnu+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF program main #ifndef __GNUC__ choke me #endif end _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_f77_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_compiler_gnu=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_compiler_gnu=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_f77_compiler_gnu=$ac_compiler_gnu fi echo "$as_me:$LINENO: result: $ac_cv_f77_compiler_gnu" >&5 echo "${ECHO_T}$ac_cv_f77_compiler_gnu" >&6 ac_ext=$ac_save_ext ac_test_FFLAGS=${FFLAGS+set} ac_save_FFLAGS=$FFLAGS FFLAGS= echo "$as_me:$LINENO: checking whether $F77 accepts -g" >&5 echo $ECHO_N "checking whether $F77 accepts -g... $ECHO_C" >&6 if test "${ac_cv_prog_f77_g+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else FFLAGS=-g cat >conftest.$ac_ext <<_ACEOF program main end _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_f77_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_prog_f77_g=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_prog_f77_g=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_prog_f77_g" >&5 echo "${ECHO_T}$ac_cv_prog_f77_g" >&6 if test "$ac_test_FFLAGS" = set; then FFLAGS=$ac_save_FFLAGS elif test $ac_cv_prog_f77_g = yes; then if test "x$ac_cv_f77_compiler_gnu" = xyes; then FFLAGS="-g -O2" else FFLAGS="-g" fi else if test "x$ac_cv_f77_compiler_gnu" = xyes; then FFLAGS="-O2" else FFLAGS= fi fi G77=`test $ac_compiler_gnu = yes && echo yes` ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu # Autoconf 2.13's AC_OBJEXT and AC_EXEEXT macros only works for C compilers! # find the maximum length of command line arguments echo "$as_me:$LINENO: checking the maximum length of command line arguments" >&5 echo $ECHO_N "checking the maximum length of command line arguments... $ECHO_C" >&6 if test "${lt_cv_sys_max_cmd_len+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else i=0 teststring="ABCD" case $build_os in msdosdjgpp*) # On DJGPP, this test can blow up pretty badly due to problems in libc # (any single argument exceeding 2000 bytes causes a buffer overrun # during glob expansion). Even if it were fixed, the result of this # check would be larger than it should be. lt_cv_sys_max_cmd_len=12288; # 12K is about right ;; gnu*) # Under GNU Hurd, this test is not required because there is # no limit to the length of command line arguments. # Libtool will interpret -1 as no limit whatsoever lt_cv_sys_max_cmd_len=-1; ;; cygwin* | mingw*) # On Win9x/ME, this test blows up -- it succeeds, but takes # about 5 minutes as the teststring grows exponentially. # Worse, since 9x/ME are not pre-emptively multitasking, # you end up with a "frozen" computer, even though with patience # the test eventually succeeds (with a max line length of 256k). # Instead, let's just punt: use the minimum linelength reported by # all of the supported platforms: 8192 (on NT/2K/XP). lt_cv_sys_max_cmd_len=8192; ;; amigaos*) # On AmigaOS with pdksh, this test takes hours, literally. # So we just punt and use a minimum line length of 8192. lt_cv_sys_max_cmd_len=8192; ;; netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) # This has been around since 386BSD, at least. Likely further. if test -x /sbin/sysctl; then lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` elif test -x /usr/sbin/sysctl; then lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` else lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs fi # And add a safety zone lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` ;; interix*) # We know the value 262144 and hardcode it with a safety zone (like BSD) lt_cv_sys_max_cmd_len=196608 ;; osf*) # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not # nice to cause kernel panics so lets avoid the loop below. # First set a reasonable default. lt_cv_sys_max_cmd_len=16384 # if test -x /sbin/sysconfig; then case `/sbin/sysconfig -q proc exec_disable_arg_limit` in *1*) lt_cv_sys_max_cmd_len=-1 ;; esac fi ;; sco3.2v5*) lt_cv_sys_max_cmd_len=102400 ;; sysv5* | sco5v6* | sysv4.2uw2*) kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` if test -n "$kargmax"; then lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[ ]//'` else lt_cv_sys_max_cmd_len=32768 fi ;; *) lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` if test -n "$lt_cv_sys_max_cmd_len"; then lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` else SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} while (test "X"`$SHELL $0 --fallback-echo "X$teststring" 2>/dev/null` \ = "XX$teststring") >/dev/null 2>&1 && new_result=`expr "X$teststring" : ".*" 2>&1` && lt_cv_sys_max_cmd_len=$new_result && test $i != 17 # 1/2 MB should be enough do i=`expr $i + 1` teststring=$teststring$teststring done teststring= # Add a significant safety factor because C++ compilers can tack on massive # amounts of additional arguments before passing them to the linker. # It appears as though 1/2 is a usable value. lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` fi ;; esac fi if test -n $lt_cv_sys_max_cmd_len ; then echo "$as_me:$LINENO: result: $lt_cv_sys_max_cmd_len" >&5 echo "${ECHO_T}$lt_cv_sys_max_cmd_len" >&6 else echo "$as_me:$LINENO: result: none" >&5 echo "${ECHO_T}none" >&6 fi # Check for command to grab the raw symbol name followed by C symbol from nm. echo "$as_me:$LINENO: checking command to parse $NM output from $compiler object" >&5 echo $ECHO_N "checking command to parse $NM output from $compiler object... $ECHO_C" >&6 if test "${lt_cv_sys_global_symbol_pipe+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else # These are sane defaults that work on at least a few old systems. # [They come from Ultrix. What could be older than Ultrix?!! ;)] # Character class describing NM global symbol codes. symcode='[BCDEGRST]' # Regexp to match symbols that can be accessed directly from C. sympat='\([_A-Za-z][_A-Za-z0-9]*\)' # Transform an extracted symbol line into a proper C declaration lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^. .* \(.*\)$/extern int \1;/p'" # Transform an extracted symbol line into symbol name and symbol address lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode \([^ ]*\) \([^ ]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" # Define system-specific variables. case $host_os in aix*) symcode='[BCDT]' ;; cygwin* | mingw* | pw32*) symcode='[ABCDGISTW]' ;; hpux*) # Its linker distinguishes data from code symbols if test "$host_cpu" = ia64; then symcode='[ABCDEGRST]' fi lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" ;; linux* | k*bsd*-gnu) if test "$host_cpu" = ia64; then symcode='[ABCDGIRSTW]' lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" fi ;; irix* | nonstopux*) symcode='[BCDEGRST]' ;; osf*) symcode='[BCDEGQRST]' ;; solaris*) symcode='[BDRT]' ;; sco3.2v5*) symcode='[DT]' ;; sysv4.2uw2*) symcode='[DT]' ;; sysv5* | sco5v6* | unixware* | OpenUNIX*) symcode='[ABDT]' ;; sysv4) symcode='[DFNSTU]' ;; esac # Handle CRLF in mingw tool chain opt_cr= case $build_os in mingw*) opt_cr=`echo 'x\{0,1\}' | tr x '\015'` # option cr in regexp ;; esac # If we're using GNU nm, then use its standard symbol codes. case `$NM -V 2>&1` in *GNU* | *'with BFD'*) symcode='[ABCDGIRSTW]' ;; esac # Try without a prefix undercore, then with it. for ac_symprfx in "" "_"; do # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. symxfrm="\\1 $ac_symprfx\\2 \\2" # Write the raw and C identifiers. lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" # Check to see that the pipe works correctly. pipe_works=no rm -f conftest* cat > conftest.$ac_ext <&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then # Now try to grab the symbols. nlist=conftest.nm if { (eval echo "$as_me:$LINENO: \"$NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist\"") >&5 (eval $NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && test -s "$nlist"; then # Try sorting and uniquifying the output. if sort "$nlist" | uniq > "$nlist"T; then mv -f "$nlist"T "$nlist" else rm -f "$nlist"T fi # Make sure that we snagged all the symbols we need. if grep ' nm_test_var$' "$nlist" >/dev/null; then if grep ' nm_test_func$' "$nlist" >/dev/null; then cat < conftest.$ac_ext #ifdef __cplusplus extern "C" { #endif EOF # Now generate the symbol file. eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | grep -v main >> conftest.$ac_ext' cat <> conftest.$ac_ext #if defined (__STDC__) && __STDC__ # define lt_ptr_t void * #else # define lt_ptr_t char * # define const #endif /* The mapping between symbol names and symbols. */ const struct { const char *name; lt_ptr_t address; } lt_preloaded_symbols[] = { EOF $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (lt_ptr_t) \&\2},/" < "$nlist" | grep -v main >> conftest.$ac_ext cat <<\EOF >> conftest.$ac_ext {0, (lt_ptr_t) 0} }; #ifdef __cplusplus } #endif EOF # Now try linking the two files. mv conftest.$ac_objext conftstm.$ac_objext lt_save_LIBS="$LIBS" lt_save_CFLAGS="$CFLAGS" LIBS="conftstm.$ac_objext" CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag" if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && test -s conftest${ac_exeext}; then pipe_works=yes fi LIBS="$lt_save_LIBS" CFLAGS="$lt_save_CFLAGS" else echo "cannot find nm_test_func in $nlist" >&5 fi else echo "cannot find nm_test_var in $nlist" >&5 fi else echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5 fi else echo "$progname: failed program was:" >&5 cat conftest.$ac_ext >&5 fi rm -rf conftest* conftst* # Do not use the global_symbol_pipe unless it works. if test "$pipe_works" = yes; then break else lt_cv_sys_global_symbol_pipe= fi done fi if test -z "$lt_cv_sys_global_symbol_pipe"; then lt_cv_sys_global_symbol_to_cdecl= fi if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then echo "$as_me:$LINENO: result: failed" >&5 echo "${ECHO_T}failed" >&6 else echo "$as_me:$LINENO: result: ok" >&5 echo "${ECHO_T}ok" >&6 fi echo "$as_me:$LINENO: checking for objdir" >&5 echo $ECHO_N "checking for objdir... $ECHO_C" >&6 if test "${lt_cv_objdir+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else rm -f .libs 2>/dev/null mkdir .libs 2>/dev/null if test -d .libs; then lt_cv_objdir=.libs else # MS-DOS does not allow filenames that begin with a dot. lt_cv_objdir=_libs fi rmdir .libs 2>/dev/null fi echo "$as_me:$LINENO: result: $lt_cv_objdir" >&5 echo "${ECHO_T}$lt_cv_objdir" >&6 objdir=$lt_cv_objdir case $host_os in aix3*) # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi ;; esac # Sed substitution that helps us do robust quoting. It backslashifies # metacharacters that are still active within double-quoted strings. Xsed='sed -e 1s/^X//' sed_quote_subst='s/\([\\"\\`$\\\\]\)/\\\1/g' # Same as above, but do not quote variable references. double_quote_subst='s/\([\\"\\`\\\\]\)/\\\1/g' # Sed substitution to delay expansion of an escaped shell variable in a # double_quote_subst'ed string. delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' # Sed substitution to avoid accidental globbing in evaled expressions no_glob_subst='s/\*/\\\*/g' # Constants: rm="rm -f" # Global variables: default_ofile=libtool can_build_shared=yes # All known linkers require a `.a' archive for static linking (except MSVC, # which needs '.lib'). libext=a ltmain="$ac_aux_dir/ltmain.sh" ofile="$default_ofile" with_gnu_ld="$lt_cv_prog_gnu_ld" if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args. set dummy ${ac_tool_prefix}ar; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_AR+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$AR"; then ac_cv_prog_AR="$AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AR="${ac_tool_prefix}ar" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi AR=$ac_cv_prog_AR if test -n "$AR"; then echo "$as_me:$LINENO: result: $AR" >&5 echo "${ECHO_T}$AR" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi fi if test -z "$ac_cv_prog_AR"; then ac_ct_AR=$AR # Extract the first word of "ar", so it can be a program name with args. set dummy ar; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_ac_ct_AR+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$ac_ct_AR"; then ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_AR="ar" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done test -z "$ac_cv_prog_ac_ct_AR" && ac_cv_prog_ac_ct_AR="false" fi fi ac_ct_AR=$ac_cv_prog_ac_ct_AR if test -n "$ac_ct_AR"; then echo "$as_me:$LINENO: result: $ac_ct_AR" >&5 echo "${ECHO_T}$ac_ct_AR" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi AR=$ac_ct_AR else AR="$ac_cv_prog_AR" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_RANLIB+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then echo "$as_me:$LINENO: result: $RANLIB" >&5 echo "${ECHO_T}$RANLIB" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi fi if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_RANLIB="ranlib" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done test -z "$ac_cv_prog_ac_ct_RANLIB" && ac_cv_prog_ac_ct_RANLIB=":" fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then echo "$as_me:$LINENO: result: $ac_ct_RANLIB" >&5 echo "${ECHO_T}$ac_ct_RANLIB" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi RANLIB=$ac_ct_RANLIB else RANLIB="$ac_cv_prog_RANLIB" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_STRIP+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then echo "$as_me:$LINENO: result: $STRIP" >&5 echo "${ECHO_T}$STRIP" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done test -z "$ac_cv_prog_ac_ct_STRIP" && ac_cv_prog_ac_ct_STRIP=":" fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5 echo "${ECHO_T}$ac_ct_STRIP" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi STRIP=$ac_ct_STRIP else STRIP="$ac_cv_prog_STRIP" fi old_CC="$CC" old_CFLAGS="$CFLAGS" # Set sane defaults for various variables test -z "$AR" && AR=ar test -z "$AR_FLAGS" && AR_FLAGS=cru test -z "$AS" && AS=as test -z "$CC" && CC=cc test -z "$LTCC" && LTCC=$CC test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS test -z "$DLLTOOL" && DLLTOOL=dlltool test -z "$LD" && LD=ld test -z "$LN_S" && LN_S="ln -s" test -z "$MAGIC_CMD" && MAGIC_CMD=file test -z "$NM" && NM=nm test -z "$SED" && SED=sed test -z "$OBJDUMP" && OBJDUMP=objdump test -z "$RANLIB" && RANLIB=: test -z "$STRIP" && STRIP=: test -z "$ac_objext" && ac_objext=o # Determine commands to create old-style static archives. old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' old_postinstall_cmds='chmod 644 $oldlib' old_postuninstall_cmds= if test -n "$RANLIB"; then case $host_os in openbsd*) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$oldlib" ;; *) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib" ;; esac old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib" fi for cc_temp in $compiler""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` # Only perform the check for file, if the check method requires it case $deplibs_check_method in file_magic*) if test "$file_magic_cmd" = '$MAGIC_CMD'; then echo "$as_me:$LINENO: checking for ${ac_tool_prefix}file" >&5 echo $ECHO_N "checking for ${ac_tool_prefix}file... $ECHO_C" >&6 if test "${lt_cv_path_MAGIC_CMD+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else case $MAGIC_CMD in [\\/*] | ?:[\\/]*) lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD="$MAGIC_CMD" lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" for ac_dir in $ac_dummy; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/${ac_tool_prefix}file; then lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org EOF fi ;; esac fi break fi done IFS="$lt_save_ifs" MAGIC_CMD="$lt_save_MAGIC_CMD" ;; esac fi MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if test -n "$MAGIC_CMD"; then echo "$as_me:$LINENO: result: $MAGIC_CMD" >&5 echo "${ECHO_T}$MAGIC_CMD" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi if test -z "$lt_cv_path_MAGIC_CMD"; then if test -n "$ac_tool_prefix"; then echo "$as_me:$LINENO: checking for file" >&5 echo $ECHO_N "checking for file... $ECHO_C" >&6 if test "${lt_cv_path_MAGIC_CMD+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else case $MAGIC_CMD in [\\/*] | ?:[\\/]*) lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD="$MAGIC_CMD" lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" for ac_dir in $ac_dummy; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/file; then lt_cv_path_MAGIC_CMD="$ac_dir/file" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org EOF fi ;; esac fi break fi done IFS="$lt_save_ifs" MAGIC_CMD="$lt_save_MAGIC_CMD" ;; esac fi MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if test -n "$MAGIC_CMD"; then echo "$as_me:$LINENO: result: $MAGIC_CMD" >&5 echo "${ECHO_T}$MAGIC_CMD" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi else MAGIC_CMD=: fi fi fi ;; esac case $host_os in rhapsody* | darwin*) if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args. set dummy ${ac_tool_prefix}dsymutil; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_DSYMUTIL+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$DSYMUTIL"; then ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi DSYMUTIL=$ac_cv_prog_DSYMUTIL if test -n "$DSYMUTIL"; then echo "$as_me:$LINENO: result: $DSYMUTIL" >&5 echo "${ECHO_T}$DSYMUTIL" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi fi if test -z "$ac_cv_prog_DSYMUTIL"; then ac_ct_DSYMUTIL=$DSYMUTIL # Extract the first word of "dsymutil", so it can be a program name with args. set dummy dsymutil; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_ac_ct_DSYMUTIL+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$ac_ct_DSYMUTIL"; then ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DSYMUTIL="dsymutil" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done test -z "$ac_cv_prog_ac_ct_DSYMUTIL" && ac_cv_prog_ac_ct_DSYMUTIL=":" fi fi ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL if test -n "$ac_ct_DSYMUTIL"; then echo "$as_me:$LINENO: result: $ac_ct_DSYMUTIL" >&5 echo "${ECHO_T}$ac_ct_DSYMUTIL" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi DSYMUTIL=$ac_ct_DSYMUTIL else DSYMUTIL="$ac_cv_prog_DSYMUTIL" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args. set dummy ${ac_tool_prefix}nmedit; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_NMEDIT+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$NMEDIT"; then ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi NMEDIT=$ac_cv_prog_NMEDIT if test -n "$NMEDIT"; then echo "$as_me:$LINENO: result: $NMEDIT" >&5 echo "${ECHO_T}$NMEDIT" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi fi if test -z "$ac_cv_prog_NMEDIT"; then ac_ct_NMEDIT=$NMEDIT # Extract the first word of "nmedit", so it can be a program name with args. set dummy nmedit; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_ac_ct_NMEDIT+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$ac_ct_NMEDIT"; then ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_NMEDIT="nmedit" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done test -z "$ac_cv_prog_ac_ct_NMEDIT" && ac_cv_prog_ac_ct_NMEDIT=":" fi fi ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT if test -n "$ac_ct_NMEDIT"; then echo "$as_me:$LINENO: result: $ac_ct_NMEDIT" >&5 echo "${ECHO_T}$ac_ct_NMEDIT" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi NMEDIT=$ac_ct_NMEDIT else NMEDIT="$ac_cv_prog_NMEDIT" fi echo "$as_me:$LINENO: checking for -single_module linker flag" >&5 echo $ECHO_N "checking for -single_module linker flag... $ECHO_C" >&6 if test "${lt_cv_apple_cc_single_mod+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lt_cv_apple_cc_single_mod=no if test -z "${LT_MULTI_MODULE}"; then # By default we will add the -single_module flag. You can override # by either setting the environment variable LT_MULTI_MODULE # non-empty at configure time, or by adding -multi_module to the # link flags. echo "int foo(void){return 1;}" > conftest.c $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib ${wl}-single_module conftest.c if test -f libconftest.dylib; then lt_cv_apple_cc_single_mod=yes rm -rf libconftest.dylib* fi rm conftest.c fi fi echo "$as_me:$LINENO: result: $lt_cv_apple_cc_single_mod" >&5 echo "${ECHO_T}$lt_cv_apple_cc_single_mod" >&6 echo "$as_me:$LINENO: checking for -exported_symbols_list linker flag" >&5 echo $ECHO_N "checking for -exported_symbols_list linker flag... $ECHO_C" >&6 if test "${lt_cv_ld_exported_symbols_list+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lt_cv_ld_exported_symbols_list=no save_LDFLAGS=$LDFLAGS echo "_main" > conftest.sym LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then lt_cv_ld_exported_symbols_list=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 lt_cv_ld_exported_symbols_list=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS="$save_LDFLAGS" fi echo "$as_me:$LINENO: result: $lt_cv_ld_exported_symbols_list" >&5 echo "${ECHO_T}$lt_cv_ld_exported_symbols_list" >&6 case $host_os in rhapsody* | darwin1.[0123]) _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; darwin1.*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; darwin*) # if running on 10.5 or later, the deployment target defaults # to the OS version, if on x86, and 10.4, the deployment # target defaults to 10.4. Don't you love it? case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in 10.0,*86*-darwin8*|10.0,*-darwin[91]*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; 10.[012]*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; 10.*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; esac ;; esac if test "$lt_cv_apple_cc_single_mod" = "yes"; then _lt_dar_single_mod='$single_module' fi if test "$lt_cv_ld_exported_symbols_list" = "yes"; then _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' else _lt_dar_export_syms="~$NMEDIT -s \$output_objdir/\${libname}-symbols.expsym \${lib}" fi if test "$DSYMUTIL" != ":"; then _lt_dsymutil="~$DSYMUTIL \$lib || :" else _lt_dsymutil= fi ;; esac enable_dlopen=no enable_win32_dll=no # Check whether --enable-libtool-lock or --disable-libtool-lock was given. if test "${enable_libtool_lock+set}" = set; then enableval="$enable_libtool_lock" fi; test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes # Check whether --with-pic or --without-pic was given. if test "${with_pic+set}" = set; then withval="$with_pic" pic_mode="$withval" else pic_mode=default fi; test -z "$pic_mode" && pic_mode=default # Use C for the default configuration in the libtool script tagname= lt_save_CC="$CC" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu # Source file extension for C test sources. ac_ext=c # Object file extension for compiled C test sources. objext=o objext=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(){return(0);}' # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # save warnings/boilerplate of simple test code ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $rm conftest* ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $rm -r conftest* lt_prog_compiler_no_builtin_flag= if test "$GCC" = yes; then lt_prog_compiler_no_builtin_flag=' -fno-builtin' echo "$as_me:$LINENO: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 echo $ECHO_N "checking if $compiler supports -fno-rtti -fno-exceptions... $ECHO_C" >&6 if test "${lt_cv_prog_compiler_rtti_exceptions+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lt_cv_prog_compiler_rtti_exceptions=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-fno-rtti -fno-exceptions" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:6867: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:6871: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_rtti_exceptions=yes fi fi $rm conftest* fi echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 echo "${ECHO_T}$lt_cv_prog_compiler_rtti_exceptions" >&6 if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions" else : fi fi lt_prog_compiler_wl= lt_prog_compiler_pic= lt_prog_compiler_static= echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5 echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6 if test "$GCC" = yes; then lt_prog_compiler_wl='-Wl,' lt_prog_compiler_static='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static='-Bstatic' fi ;; amigaos*) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4' ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | pw32* | os2*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries lt_prog_compiler_pic='-DDLL_EXPORT' ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic='-fno-common' ;; interix[3-9]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. lt_prog_compiler_can_build_shared=no enable_shared=no ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic=-Kconform_pic fi ;; hpux*) # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic='-fPIC' ;; esac ;; *) lt_prog_compiler_pic='-fPIC' ;; esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in aix*) lt_prog_compiler_wl='-Wl,' if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static='-Bstatic' else lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp' fi ;; darwin*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files case $cc_basename in xlc*) lt_prog_compiler_pic='-qnocommon' lt_prog_compiler_wl='-Wl,' ;; esac ;; mingw* | cygwin* | pw32* | os2*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). lt_prog_compiler_pic='-DDLL_EXPORT' ;; hpux9* | hpux10* | hpux11*) lt_prog_compiler_wl='-Wl,' # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic='+Z' ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? lt_prog_compiler_static='${wl}-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) lt_prog_compiler_wl='-Wl,' # PIC (with -KPIC) is the default. lt_prog_compiler_static='-non_shared' ;; newsos6) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; linux* | k*bsd*-gnu) case $cc_basename in icc* | ecc*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-static' ;; pgcc* | pgf77* | pgf90* | pgf95*) # Portland Group compilers (*not* the Pentium gcc compiler, # which looks to be a dead project) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fpic' lt_prog_compiler_static='-Bstatic' ;; ccc*) lt_prog_compiler_wl='-Wl,' # All Alpha code is PIC. lt_prog_compiler_static='-non_shared' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C 5.9 lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='-Wl,' ;; *Sun\ F*) # Sun Fortran 8.3 passes all unrecognized flags to the linker lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='' ;; esac ;; esac ;; osf3* | osf4* | osf5*) lt_prog_compiler_wl='-Wl,' # All OSF/1 code is PIC. lt_prog_compiler_static='-non_shared' ;; rdos*) lt_prog_compiler_static='-non_shared' ;; solaris*) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' case $cc_basename in f77* | f90* | f95*) lt_prog_compiler_wl='-Qoption ld ';; *) lt_prog_compiler_wl='-Wl,';; esac ;; sunos4*) lt_prog_compiler_wl='-Qoption ld ' lt_prog_compiler_pic='-PIC' lt_prog_compiler_static='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec ;then lt_prog_compiler_pic='-Kconform_pic' lt_prog_compiler_static='-Bstatic' fi ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; unicos*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_can_build_shared=no ;; uts4*) lt_prog_compiler_pic='-pic' lt_prog_compiler_static='-Bstatic' ;; *) lt_prog_compiler_can_build_shared=no ;; esac fi echo "$as_me:$LINENO: result: $lt_prog_compiler_pic" >&5 echo "${ECHO_T}$lt_prog_compiler_pic" >&6 # # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic"; then echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic works... $ECHO_C" >&6 if test "${lt_cv_prog_compiler_pic_works+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lt_cv_prog_compiler_pic_works=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$lt_prog_compiler_pic -DPIC" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:7157: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:7161: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_pic_works=yes fi fi $rm conftest* fi echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_pic_works" >&5 echo "${ECHO_T}$lt_cv_prog_compiler_pic_works" >&6 if test x"$lt_cv_prog_compiler_pic_works" = xyes; then case $lt_prog_compiler_pic in "" | " "*) ;; *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;; esac else lt_prog_compiler_pic= lt_prog_compiler_can_build_shared=no fi fi case $host_os in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) lt_prog_compiler_pic= ;; *) lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC" ;; esac # # Check to make sure the static flag actually works. # wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\" echo "$as_me:$LINENO: checking if $compiler static flag $lt_tmp_static_flag works" >&5 echo $ECHO_N "checking if $compiler static flag $lt_tmp_static_flag works... $ECHO_C" >&6 if test "${lt_cv_prog_compiler_static_works+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lt_cv_prog_compiler_static_works=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $lt_tmp_static_flag" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $echo "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_static_works=yes fi else lt_cv_prog_compiler_static_works=yes fi fi $rm -r conftest* LDFLAGS="$save_LDFLAGS" fi echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_static_works" >&5 echo "${ECHO_T}$lt_cv_prog_compiler_static_works" >&6 if test x"$lt_cv_prog_compiler_static_works" = xyes; then : else lt_prog_compiler_static= fi echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5 echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6 if test "${lt_cv_prog_compiler_c_o+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lt_cv_prog_compiler_c_o=no $rm -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:7261: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:7265: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o=yes fi fi chmod u+w . 2>&5 $rm conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files $rm out/* && rmdir out cd .. rmdir conftest $rm conftest* fi echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o" >&5 echo "${ECHO_T}$lt_cv_prog_compiler_c_o" >&6 hard_links="nottested" if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user echo "$as_me:$LINENO: checking if we can lock with hard links" >&5 echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&6 hard_links=yes $rm conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no echo "$as_me:$LINENO: result: $hard_links" >&5 echo "${ECHO_T}$hard_links" >&6 if test "$hard_links" = no; then { echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} need_locks=warn fi else need_locks=no fi echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6 runpath_var= allow_undefined_flag= enable_shared_with_static_runtimes=no archive_cmds= archive_expsym_cmds= old_archive_From_new_cmds= old_archive_from_expsyms_cmds= export_dynamic_flag_spec= whole_archive_flag_spec= thread_safe_flag_spec= hardcode_libdir_flag_spec= hardcode_libdir_flag_spec_ld= hardcode_libdir_separator= hardcode_direct=no hardcode_minus_L=no hardcode_shlibpath_var=unsupported link_all_deplibs=unknown hardcode_automatic=no module_cmds= module_expsym_cmds= always_export_symbols=no export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' # include_expsyms should be a list of space-separated symbols to be *always* # included in the symbol list include_expsyms= # exclude_expsyms can be an extended regexp of symbols to exclude # it will be wrapped by ` (' and `)$', so one must not match beginning or # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', # as well as any symbol that contains `d'. exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out # platforms (ab)use it in PIC code, but their linkers get confused if # the symbol is explicitly referenced. Since portable code cannot # rely on this symbol name, it's probably fine to never include it in # preloaded symbol tables. # Exclude shared library initialization/finalization symbols. extract_expsyms_cmds= # Just being paranoid about ensuring that cc_basename is set. for cc_temp in $compiler""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` case $host_os in cygwin* | mingw* | pw32*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test "$GCC" != yes; then with_gnu_ld=no fi ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++) with_gnu_ld=yes ;; openbsd*) with_gnu_ld=no ;; esac ld_shlibs=yes if test "$with_gnu_ld" = yes; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='${wl}' # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. runpath_var=LD_RUN_PATH hardcode_libdir_flag_spec='${wl}--rpath ${wl}$libdir' export_dynamic_flag_spec='${wl}--export-dynamic' # ancient GNU ld didn't support --whole-archive et. al. if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else whole_archive_flag_spec= fi supports_anon_versioning=no case `$LD -v 2>/dev/null` in *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... *\ 2.11.*) ;; # other 2.11 versions *) supports_anon_versioning=yes ;; esac # See if GNU ld supports shared libraries. case $host_os in aix[3-9]*) # On AIX/PPC, the GNU linker is very broken if test "$host_cpu" != ia64; then ld_shlibs=no cat <&2 *** Warning: the GNU linker, at least up to release 2.9.1, is reported *** to be unable to reliably create shared libraries on AIX. *** Therefore, libtool is disabling shared libraries support. If you *** really care for shared libraries, you may want to modify your PATH *** so that a non-GNU linker is found, and then restart. EOF fi ;; amigaos*) archive_cmds='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes # Samuel A. Falvo II reports # that the semantics of dynamic libraries on AmigaOS, at least up # to version 4, is to share data among multiple programs linked # with the same dynamic library. Since this doesn't match the # behavior of shared libraries on other platforms, we can't use # them. ld_shlibs=no ;; beos*) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then allow_undefined_flag=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else ld_shlibs=no fi ;; cygwin* | mingw* | pw32*) # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless, # as there is no search path for DLLs. hardcode_libdir_flag_spec='-L$libdir' allow_undefined_flag=unsupported always_export_symbols=no enable_shared_with_static_runtimes=yes export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/'\'' -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else ld_shlibs=no fi ;; interix[3-9]*) hardcode_direct=no hardcode_shlibpath_var=no hardcode_libdir_flag_spec='${wl}-rpath,$libdir' export_dynamic_flag_spec='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' archive_expsym_cmds='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; gnu* | linux* | k*bsd*-gnu) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then tmp_addflag= case $cc_basename,$host_cpu in pgcc*) # Portland Group C compiler whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag' ;; pgf77* | pgf90* | pgf95*) # Portland Group f77 and f90 compilers whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag -Mnomain' ;; ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 tmp_addflag=' -i_dynamic' ;; efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 tmp_addflag=' -i_dynamic -nofor_main' ;; ifc* | ifort*) # Intel Fortran compiler tmp_addflag=' -nofor_main' ;; esac case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C 5.9 whole_archive_flag_spec='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' tmp_sharedflag='-G' ;; *Sun\ F*) # Sun Fortran 8.3 tmp_sharedflag='-G' ;; *) tmp_sharedflag='-shared' ;; esac archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test $supports_anon_versioning = yes; then archive_expsym_cmds='$echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ $echo "local: *; };" >> $output_objdir/$libname.ver~ $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi else ld_shlibs=no fi ;; netbsd*) if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' fi ;; solaris*) if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then ld_shlibs=no cat <&2 *** Warning: The releases 2.8.* of the GNU linker cannot reliably *** create shared libraries on Solaris systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.9.1 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. EOF elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) case `$LD -v 2>&1` in *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not *** reliably create shared libraries on SCO systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.16.91.0.3 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF ;; *) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`' archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib' archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname,-retain-symbols-file,$export_symbols -o $lib' else ld_shlibs=no fi ;; esac ;; sunos4*) archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= hardcode_direct=yes hardcode_shlibpath_var=no ;; *) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; esac if test "$ld_shlibs" = no; then runpath_var= hardcode_libdir_flag_spec= export_dynamic_flag_spec= whole_archive_flag_spec= fi else # PORTME fill in a description of your system's linker (not GNU ld) case $host_os in aix3*) allow_undefined_flag=unsupported always_export_symbols=yes archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. hardcode_minus_L=yes if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. hardcode_direct=unsupported fi ;; aix[4-9]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm if $NM -V 2>&1 | grep 'GNU' > /dev/null; then export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' else export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' fi aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) for ld_flag in $LDFLAGS; do if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then aix_use_runtimelinking=yes break fi done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. archive_cmds='' hardcode_direct=yes hardcode_libdir_separator=':' link_all_deplibs=yes if test "$GCC" = yes; then case $host_os in aix4.[012]|aix4.[012].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && \ strings "$collect2name" | grep resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 hardcode_direct=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking hardcode_minus_L=yes hardcode_libdir_flag_spec='-L$libdir' hardcode_libdir_separator= fi ;; esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. always_export_symbols=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. allow_undefined_flag='-berok' # Determine the default libpath from the value encoded in an empty executable. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/ p } }' aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" archive_expsym_cmds="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' allow_undefined_flag="-z nodefs" archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an empty executable. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/ p } }' aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. no_undefined_flag=' ${wl}-bernotok' allow_undefined_flag=' ${wl}-berok' # Exported symbols can be pulled into shared objects from archives whole_archive_flag_spec='$convenience' archive_cmds_need_lc=yes # This is similar to how AIX traditionally builds its shared libraries. archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; amigaos*) archive_cmds='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes # see comment about different semantics on the GNU ld section ld_shlibs=no ;; bsdi[45]*) export_dynamic_flag_spec=-rdynamic ;; cygwin* | mingw* | pw32*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. hardcode_libdir_flag_spec=' ' allow_undefined_flag=unsupported # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. archive_cmds='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames=' # The linker will automatically build a .lib file if we build a DLL. old_archive_From_new_cmds='true' # FIXME: Should let the user specify the lib program. old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs' fix_srcfile_path='`cygpath -w "$srcfile"`' enable_shared_with_static_runtimes=yes ;; darwin* | rhapsody*) case $host_os in rhapsody* | darwin1.[012]) allow_undefined_flag='${wl}-undefined ${wl}suppress' ;; *) # Darwin 1.3 on if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then allow_undefined_flag='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' else case ${MACOSX_DEPLOYMENT_TARGET} in 10.[012]) allow_undefined_flag='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; 10.*) allow_undefined_flag='${wl}-undefined ${wl}dynamic_lookup' ;; esac fi ;; esac archive_cmds_need_lc=no hardcode_direct=no hardcode_automatic=yes hardcode_shlibpath_var=unsupported whole_archive_flag_spec='' link_all_deplibs=yes if test "$GCC" = yes ; then output_verbose_link_cmd='echo' archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" archive_expsym_cmds="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" module_expsym_cmds="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" else case $cc_basename in xlc*) output_verbose_link_cmd='echo' archive_cmds='$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $xlcverstring' module_cmds='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds archive_expsym_cmds='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $xlcverstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' module_expsym_cmds='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' ;; *) ld_shlibs=no ;; esac fi ;; dgux*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-L$libdir' hardcode_shlibpath_var=no ;; freebsd1*) ld_shlibs=no ;; # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor # support. Future versions do this automatically, but an explicit c++rt0.o # does not break anything, and helps significantly (at the cost of a little # extra space). freebsd2.2*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; # Unfortunately, older versions of FreeBSD 2 do not have this feature. freebsd2*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes hardcode_minus_L=yes hardcode_shlibpath_var=no ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. freebsd* | dragonfly*) archive_cmds='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; hpux9*) if test "$GCC" = yes; then archive_cmds='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else archive_cmds='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' fi hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: hardcode_direct=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes export_dynamic_flag_spec='${wl}-E' ;; hpux10*) if test "$GCC" = yes -a "$with_gnu_ld" = no; then archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: hardcode_direct=yes export_dynamic_flag_spec='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes fi ;; hpux11*) if test "$GCC" = yes -a "$with_gnu_ld" = no; then case $host_cpu in hppa*64*) archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) archive_cmds='$CC -shared ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else case $host_cpu in hppa*64*) archive_cmds='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac fi if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: case $host_cpu in hppa*64*|ia64*) hardcode_libdir_flag_spec_ld='+b $libdir' hardcode_direct=no hardcode_shlibpath_var=no ;; *) hardcode_direct=yes export_dynamic_flag_spec='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) if test "$GCC" = yes; then archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' hardcode_libdir_flag_spec_ld='-rpath $libdir' fi hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: link_all_deplibs=yes ;; netbsd*) if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF fi hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; newsos6) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: hardcode_shlibpath_var=no ;; openbsd*) if test -f /usr/libexec/ld.so; then hardcode_direct=yes hardcode_shlibpath_var=no if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' hardcode_libdir_flag_spec='${wl}-rpath,$libdir' export_dynamic_flag_spec='${wl}-E' else case $host_os in openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-R$libdir' ;; *) archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec='${wl}-rpath,$libdir' ;; esac fi else ld_shlibs=no fi ;; os2*) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes allow_undefined_flag=unsupported archive_cmds='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' old_archive_From_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' ;; osf3*) if test "$GCC" = yes; then allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else allow_undefined_flag=' -expect_unresolved \*' archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' fi hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: ;; osf4* | osf5*) # as osf3* with the addition of -msym flag if test "$GCC" = yes; then allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' else allow_undefined_flag=' -expect_unresolved \*' archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~ $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib~$rm $lib.exp' # Both c and cxx compiler support -rpath directly hardcode_libdir_flag_spec='-rpath $libdir' fi hardcode_libdir_separator=: ;; solaris*) no_undefined_flag=' -z text' if test "$GCC" = yes; then wlarc='${wl}' archive_cmds='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp' else wlarc='' archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' fi hardcode_libdir_flag_spec='-R$libdir' hardcode_shlibpath_var=no case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. GCC discards it without `$wl', # but is careful enough not to reorder. # Supported since Solaris 2.6 (maybe 2.5.1?) if test "$GCC" = yes; then whole_archive_flag_spec='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' else whole_archive_flag_spec='-z allextract$convenience -z defaultextract' fi ;; esac link_all_deplibs=yes ;; sunos4*) if test "x$host_vendor" = xsequent; then # Use $CC to link under sequent, because it throws in some extra .o # files that make .init and .fini sections work. archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' fi hardcode_libdir_flag_spec='-L$libdir' hardcode_direct=yes hardcode_minus_L=yes hardcode_shlibpath_var=no ;; sysv4) case $host_vendor in sni) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes # is this really true??? ;; siemens) ## LD is ld it makes a PLAMLIB ## CC just makes a GrossModule. archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' reload_cmds='$CC -r -o $output$reload_objs' hardcode_direct=no ;; motorola) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=no #Motorola manual says yes, but my tests say they lie ;; esac runpath_var='LD_RUN_PATH' hardcode_shlibpath_var=no ;; sysv4.3*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var=no export_dynamic_flag_spec='-Bexport' ;; sysv4*MP*) if test -d /usr/nec; then archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var=no runpath_var=LD_RUN_PATH hardcode_runpath_var=yes ld_shlibs=yes fi ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) no_undefined_flag='${wl}-z,text' archive_cmds_need_lc=no hardcode_shlibpath_var=no runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. no_undefined_flag='${wl}-z,text' allow_undefined_flag='${wl}-z,nodefs' archive_cmds_need_lc=no hardcode_shlibpath_var=no hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`' hardcode_libdir_separator=':' link_all_deplibs=yes export_dynamic_flag_spec='${wl}-Bexport' runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then archive_cmds='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; uts4*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-L$libdir' hardcode_shlibpath_var=no ;; *) ld_shlibs=no ;; esac fi echo "$as_me:$LINENO: result: $ld_shlibs" >&5 echo "${ECHO_T}$ld_shlibs" >&6 test "$ld_shlibs" = no && can_build_shared=no # # Do we need to explicitly link libc? # case "x$archive_cmds_need_lc" in x|xyes) # Assume -lc should be added archive_cmds_need_lc=yes if test "$enable_shared" = yes && test "$GCC" = yes; then case $archive_cmds in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5 echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6 $rm conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$lt_prog_compiler_wl pic_flag=$lt_prog_compiler_pic compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$allow_undefined_flag allow_undefined_flag= if { (eval echo "$as_me:$LINENO: \"$archive_cmds 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\"") >&5 (eval $archive_cmds 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } then archive_cmds_need_lc=no else archive_cmds_need_lc=yes fi allow_undefined_flag=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $rm conftest* echo "$as_me:$LINENO: result: $archive_cmds_need_lc" >&5 echo "${ECHO_T}$archive_cmds_need_lc" >&6 ;; esac fi ;; esac echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5 echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&6 library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=".so" postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" if test "$GCC" = yes; then case $host_os in darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; *) lt_awk_arg="/^libraries:/" ;; esac lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e "s,=/,/,g"` if echo "$lt_search_path_spec" | grep ';' >/dev/null ; then # if the path contains ";" then we assume it to be the separator # otherwise default to the standard path separator (i.e. ":") - it is # assumed that no part of a normal pathname contains ";" but that should # okay in the real world where ";" in dirpaths is itself problematic. lt_search_path_spec=`echo "$lt_search_path_spec" | $SED -e 's/;/ /g'` else lt_search_path_spec=`echo "$lt_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi # Ok, now we have the path, separated by spaces, we can step through it # and add multilib dir if necessary. lt_tmp_lt_search_path_spec= lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` for lt_sys_path in $lt_search_path_spec; do if test -d "$lt_sys_path/$lt_multi_os_dir"; then lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" else test -d "$lt_sys_path" && \ lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" fi done lt_search_path_spec=`echo $lt_tmp_lt_search_path_spec | awk ' BEGIN {RS=" "; FS="/|\n";} { lt_foo=""; lt_count=0; for (lt_i = NF; lt_i > 0; lt_i--) { if ($lt_i != "" && $lt_i != ".") { if ($lt_i == "..") { lt_count++; } else { if (lt_count == 0) { lt_foo="/" $lt_i lt_foo; } else { lt_count--; } } } } if (lt_foo != "") { lt_freq[lt_foo]++; } if (lt_freq[lt_foo] == 1) { print lt_foo; } }'` sys_lib_search_path_spec=`echo $lt_search_path_spec` else sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" fi need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='${libname}${release}${shared_ext}$major' ;; aix[4-9]*) version_type=linux need_lib_prefix=no need_version=no hardcode_into_libs=yes if test "$host_cpu" = ia64; then # AIX 5 supports IA64 library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line `#! .'. This would cause the generated library to # depend on `.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[01] | aix4.[01].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then : else can_build_shared=no fi ;; esac # AIX (on Power*) has no versioning support, so currently we can not hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' else # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='${libname}${release}.a $libname.a' soname_spec='${libname}${release}${shared_ext}$major' fi shlibpath_var=LIBPATH fi ;; amigaos*) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; beos*) library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[45]*) version_type=linux need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no case $GCC,$host_os in yes,cygwin* | yes,mingw* | yes,pw32*) library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $rm \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" ;; mingw*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then # It is most probably a Windows format PATH printed by # mingw gcc, but we are running on Cygwin. Gcc prints its search # path with ; separators, and with drive letters. We can handle the # drive letters (cygwin fileutils understands them), so leave them, # especially as we might pass files found there to a mingw objdump, # which wouldn't understand a cygwinified path. Ahh. sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; esac ;; *) library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' ;; esac dynamic_linker='Win32 ld.exe' # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext' soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib" sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd1*) dynamic_linker=no ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[123]*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2*) shlibpath_overrides_runpath=yes ;; freebsd3.[01]* | freebsdelf3.[01]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; gnu*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' if test "X$HPUX_IA64_MODE" = X32; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555. postinstall_cmds='chmod 555 $lib' ;; interix[3-9]*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then version_type=linux else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; # This must be Linux ELF. linux* | k*bsd*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; nto-qnx*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; openbsd*) version_type=sunos sys_lib_dlsearch_path_spec="/usr/lib" need_lib_prefix=no # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. case $host_os in openbsd3.3 | openbsd3.3.*) need_version=yes ;; *) need_version=no ;; esac library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[89] | openbsd2.[89].*) shlibpath_overrides_runpath=no ;; *) shlibpath_overrides_runpath=yes ;; esac else shlibpath_overrides_runpath=yes fi ;; os2*) libname_spec='$name' shrext_cmds=".dll" need_lib_prefix=no library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test "$with_gnu_ld" = yes; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no export_dynamic_flag_spec='${wl}-Blargedynsym' runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec ;then version_type=linux library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=freebsd-elf need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH hardcode_into_libs=yes if test "$with_gnu_ld" = yes; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' shlibpath_overrides_runpath=no else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' shlibpath_overrides_runpath=yes case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; uts4*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac echo "$as_me:$LINENO: result: $dynamic_linker" >&5 echo "${ECHO_T}$dynamic_linker" >&6 test "$dynamic_linker" = no && can_build_shared=no if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lt_cv_sys_lib_search_path_spec="$sys_lib_search_path_spec" fi sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lt_cv_sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec" fi sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5 echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6 hardcode_action= if test -n "$hardcode_libdir_flag_spec" || \ test -n "$runpath_var" || \ test "X$hardcode_automatic" = "Xyes" ; then # We can hardcode non-existant directories. if test "$hardcode_direct" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, )" != no && test "$hardcode_minus_L" != no; then # Linking always hardcodes the temporary library directory. hardcode_action=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. hardcode_action=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. hardcode_action=unsupported fi echo "$as_me:$LINENO: result: $hardcode_action" >&5 echo "${ECHO_T}$hardcode_action" >&6 if test "$hardcode_action" = relink; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || test "$enable_shared" = no; then # Fast installation is not necessary enable_fast_install=needless fi striplib= old_striplib= echo "$as_me:$LINENO: checking whether stripping libraries is possible" >&5 echo $ECHO_N "checking whether stripping libraries is possible... $ECHO_C" >&6 if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" test -z "$striplib" && striplib="$STRIP --strip-unneeded" echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6 else # FIXME - insert some real tests, host_os isn't really good enough case $host_os in darwin*) if test -n "$STRIP" ; then striplib="$STRIP -x" old_striplib="$STRIP -S" echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi ;; *) echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 ;; esac fi if test "x$enable_dlopen" != xyes; then enable_dlopen=unknown enable_dlopen_self=unknown enable_dlopen_self_static=unknown else lt_cv_dlopen=no lt_cv_dlopen_libs= case $host_os in beos*) lt_cv_dlopen="load_add_on" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ;; mingw* | pw32*) lt_cv_dlopen="LoadLibrary" lt_cv_dlopen_libs= ;; cygwin*) lt_cv_dlopen="dlopen" lt_cv_dlopen_libs= ;; darwin*) # if libdl is installed we need to link against it echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5 echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6 if test "${ac_cv_lib_dl_dlopen+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char dlopen (); int main () { dlopen (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_lib_dl_dlopen=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_dl_dlopen=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5 echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6 if test $ac_cv_lib_dl_dlopen = yes; then lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" else lt_cv_dlopen="dyld" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes fi ;; *) echo "$as_me:$LINENO: checking for shl_load" >&5 echo $ECHO_N "checking for shl_load... $ECHO_C" >&6 if test "${ac_cv_func_shl_load+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Define shl_load to an innocuous variant, in case declares shl_load. For example, HP-UX 11i declares gettimeofday. */ #define shl_load innocuous_shl_load /* System header to define __stub macros and hopefully few prototypes, which can conflict with char shl_load (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef shl_load /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" { #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char shl_load (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined (__stub_shl_load) || defined (__stub___shl_load) choke me #else char (*f) () = shl_load; #endif #ifdef __cplusplus } #endif int main () { return f != shl_load; ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_func_shl_load=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_func_shl_load=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_func_shl_load" >&5 echo "${ECHO_T}$ac_cv_func_shl_load" >&6 if test $ac_cv_func_shl_load = yes; then lt_cv_dlopen="shl_load" else echo "$as_me:$LINENO: checking for shl_load in -ldld" >&5 echo $ECHO_N "checking for shl_load in -ldld... $ECHO_C" >&6 if test "${ac_cv_lib_dld_shl_load+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char shl_load (); int main () { shl_load (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_lib_dld_shl_load=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_dld_shl_load=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_dld_shl_load" >&5 echo "${ECHO_T}$ac_cv_lib_dld_shl_load" >&6 if test $ac_cv_lib_dld_shl_load = yes; then lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld" else echo "$as_me:$LINENO: checking for dlopen" >&5 echo $ECHO_N "checking for dlopen... $ECHO_C" >&6 if test "${ac_cv_func_dlopen+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Define dlopen to an innocuous variant, in case declares dlopen. For example, HP-UX 11i declares gettimeofday. */ #define dlopen innocuous_dlopen /* System header to define __stub macros and hopefully few prototypes, which can conflict with char dlopen (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef dlopen /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" { #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char dlopen (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined (__stub_dlopen) || defined (__stub___dlopen) choke me #else char (*f) () = dlopen; #endif #ifdef __cplusplus } #endif int main () { return f != dlopen; ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_func_dlopen=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_func_dlopen=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_func_dlopen" >&5 echo "${ECHO_T}$ac_cv_func_dlopen" >&6 if test $ac_cv_func_dlopen = yes; then lt_cv_dlopen="dlopen" else echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5 echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6 if test "${ac_cv_lib_dl_dlopen+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char dlopen (); int main () { dlopen (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_lib_dl_dlopen=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_dl_dlopen=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5 echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6 if test $ac_cv_lib_dl_dlopen = yes; then lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" else echo "$as_me:$LINENO: checking for dlopen in -lsvld" >&5 echo $ECHO_N "checking for dlopen in -lsvld... $ECHO_C" >&6 if test "${ac_cv_lib_svld_dlopen+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lsvld $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char dlopen (); int main () { dlopen (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_lib_svld_dlopen=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_svld_dlopen=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_svld_dlopen" >&5 echo "${ECHO_T}$ac_cv_lib_svld_dlopen" >&6 if test $ac_cv_lib_svld_dlopen = yes; then lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld" else echo "$as_me:$LINENO: checking for dld_link in -ldld" >&5 echo $ECHO_N "checking for dld_link in -ldld... $ECHO_C" >&6 if test "${ac_cv_lib_dld_dld_link+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char dld_link (); int main () { dld_link (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_lib_dld_dld_link=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_dld_dld_link=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_dld_dld_link" >&5 echo "${ECHO_T}$ac_cv_lib_dld_dld_link" >&6 if test $ac_cv_lib_dld_dld_link = yes; then lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld" fi fi fi fi fi fi ;; esac if test "x$lt_cv_dlopen" != xno; then enable_dlopen=yes else enable_dlopen=no fi case $lt_cv_dlopen in dlopen) save_CPPFLAGS="$CPPFLAGS" test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" save_LDFLAGS="$LDFLAGS" wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" save_LIBS="$LIBS" LIBS="$lt_cv_dlopen_libs $LIBS" echo "$as_me:$LINENO: checking whether a program can dlopen itself" >&5 echo $ECHO_N "checking whether a program can dlopen itself... $ECHO_C" >&6 if test "${lt_cv_dlopen_self+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test "$cross_compiling" = yes; then : lt_cv_dlopen_self=cross else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext < #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif #ifdef __cplusplus extern "C" void exit (int); #endif void fnord() { int i=42;} int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; /* dlclose (self); */ } else puts (dlerror ()); exit (status); } EOF if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) >&5 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;; esac else : # compilation failed lt_cv_dlopen_self=no fi fi rm -fr conftest* fi echo "$as_me:$LINENO: result: $lt_cv_dlopen_self" >&5 echo "${ECHO_T}$lt_cv_dlopen_self" >&6 if test "x$lt_cv_dlopen_self" = xyes; then wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" echo "$as_me:$LINENO: checking whether a statically linked program can dlopen itself" >&5 echo $ECHO_N "checking whether a statically linked program can dlopen itself... $ECHO_C" >&6 if test "${lt_cv_dlopen_self_static+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test "$cross_compiling" = yes; then : lt_cv_dlopen_self_static=cross else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext < #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif #ifdef __cplusplus extern "C" void exit (int); #endif void fnord() { int i=42;} int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; /* dlclose (self); */ } else puts (dlerror ()); exit (status); } EOF if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) >&5 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;; esac else : # compilation failed lt_cv_dlopen_self_static=no fi fi rm -fr conftest* fi echo "$as_me:$LINENO: result: $lt_cv_dlopen_self_static" >&5 echo "${ECHO_T}$lt_cv_dlopen_self_static" >&6 fi CPPFLAGS="$save_CPPFLAGS" LDFLAGS="$save_LDFLAGS" LIBS="$save_LIBS" ;; esac case $lt_cv_dlopen_self in yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; *) enable_dlopen_self=unknown ;; esac case $lt_cv_dlopen_self_static in yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; *) enable_dlopen_self_static=unknown ;; esac fi # Report which library types will actually be built echo "$as_me:$LINENO: checking if libtool supports shared libraries" >&5 echo $ECHO_N "checking if libtool supports shared libraries... $ECHO_C" >&6 echo "$as_me:$LINENO: result: $can_build_shared" >&5 echo "${ECHO_T}$can_build_shared" >&6 echo "$as_me:$LINENO: checking whether to build shared libraries" >&5 echo $ECHO_N "checking whether to build shared libraries... $ECHO_C" >&6 test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[4-9]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac echo "$as_me:$LINENO: result: $enable_shared" >&5 echo "${ECHO_T}$enable_shared" >&6 echo "$as_me:$LINENO: checking whether to build static libraries" >&5 echo $ECHO_N "checking whether to build static libraries... $ECHO_C" >&6 # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes echo "$as_me:$LINENO: result: $enable_static" >&5 echo "${ECHO_T}$enable_static" >&6 # The else clause should only fire when bootstrapping the # libtool distribution, otherwise you forgot to ship ltmain.sh # with your package, and you will get complaints that there are # no rules to generate ltmain.sh. if test -f "$ltmain"; then # See if we are running on zsh, and set the options which allow our commands through # without removal of \ escapes. if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi # Now quote all the things that may contain metacharacters while being # careful not to overquote the AC_SUBSTed values. We take copies of the # variables and quote the copies for generation of the libtool script. for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \ SED SHELL STRIP \ libname_spec library_names_spec soname_spec extract_expsyms_cmds \ old_striplib striplib file_magic_cmd finish_cmds finish_eval \ deplibs_check_method reload_flag reload_cmds need_locks \ lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \ lt_cv_sys_global_symbol_to_c_name_address \ sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ old_postinstall_cmds old_postuninstall_cmds \ compiler \ CC \ LD \ lt_prog_compiler_wl \ lt_prog_compiler_pic \ lt_prog_compiler_static \ lt_prog_compiler_no_builtin_flag \ export_dynamic_flag_spec \ thread_safe_flag_spec \ whole_archive_flag_spec \ enable_shared_with_static_runtimes \ old_archive_cmds \ old_archive_from_new_cmds \ predep_objects \ postdep_objects \ predeps \ postdeps \ compiler_lib_search_path \ compiler_lib_search_dirs \ archive_cmds \ archive_expsym_cmds \ postinstall_cmds \ postuninstall_cmds \ old_archive_from_expsyms_cmds \ allow_undefined_flag \ no_undefined_flag \ export_symbols_cmds \ hardcode_libdir_flag_spec \ hardcode_libdir_flag_spec_ld \ hardcode_libdir_separator \ hardcode_automatic \ module_cmds \ module_expsym_cmds \ lt_cv_prog_compiler_c_o \ fix_srcfile_path \ exclude_expsyms \ include_expsyms; do case $var in old_archive_cmds | \ old_archive_from_new_cmds | \ archive_cmds | \ archive_expsym_cmds | \ module_cmds | \ module_expsym_cmds | \ old_archive_from_expsyms_cmds | \ export_symbols_cmds | \ extract_expsyms_cmds | reload_cmds | finish_cmds | \ postinstall_cmds | postuninstall_cmds | \ old_postinstall_cmds | old_postuninstall_cmds | \ sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) # Double-quote double-evaled strings. eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" ;; *) eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" ;; esac done case $lt_echo in *'\$0 --fallback-echo"') lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'` ;; esac cfgfile="${ofile}T" trap "$rm \"$cfgfile\"; exit 1" 1 2 15 $rm -f "$cfgfile" { echo "$as_me:$LINENO: creating $ofile" >&5 echo "$as_me: creating $ofile" >&6;} cat <<__EOF__ >> "$cfgfile" #! $SHELL # `$echo "$cfgfile" | sed 's%^.*/%%'` - Provide generalized library-building support services. # Generated automatically by $PROGRAM (GNU $PACKAGE $VERSION$TIMESTAMP) # NOTE: Changes made to this file will be lost: look at ltmain.sh. # # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 # Free Software Foundation, Inc. # # This file is part of GNU Libtool: # Originally by Gordon Matzigkeit , 1996 # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # A sed program that does not truncate output. SED=$lt_SED # Sed that helps us avoid accidentally triggering echo(1) options like -n. Xsed="$SED -e 1s/^X//" # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # The names of the tagged configurations supported by this script. available_tags= # ### BEGIN LIBTOOL CONFIG # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # Shell to use when invoking shell scripts. SHELL=$lt_SHELL # Whether or not to build shared libraries. build_libtool_libs=$enable_shared # Whether or not to build static libraries. build_old_libs=$enable_static # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$archive_cmds_need_lc # Whether or not to disallow shared libs when runtime libs are static allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes # Whether or not to optimize for fast installation. fast_install=$enable_fast_install # The host system. host_alias=$host_alias host=$host host_os=$host_os # The build system. build_alias=$build_alias build=$build build_os=$build_os # An echo program that does not interpret backslashes. echo=$lt_echo # The archiver. AR=$lt_AR AR_FLAGS=$lt_AR_FLAGS # A C compiler. LTCC=$lt_LTCC # LTCC compiler flags. LTCFLAGS=$lt_LTCFLAGS # A language-specific compiler. CC=$lt_compiler # Is the compiler the GNU C compiler? with_gcc=$GCC # An ERE matcher. EGREP=$lt_EGREP # The linker used to build libraries. LD=$lt_LD # Whether we need hard or soft links. LN_S=$lt_LN_S # A BSD-compatible nm program. NM=$lt_NM # A symbol stripping program STRIP=$lt_STRIP # Used to examine libraries when file_magic_cmd begins "file" MAGIC_CMD=$MAGIC_CMD # Used on cygwin: DLL creation program. DLLTOOL="$DLLTOOL" # Used on cygwin: object dumper. OBJDUMP="$OBJDUMP" # Used on cygwin: assembler. AS="$AS" # The name of the directory that contains temporary libtool files. objdir=$objdir # How to create reloadable object files. reload_flag=$lt_reload_flag reload_cmds=$lt_reload_cmds # How to pass a linker flag through the compiler. wl=$lt_lt_prog_compiler_wl # Object file suffix (normally "o"). objext="$ac_objext" # Old archive suffix (normally "a"). libext="$libext" # Shared library suffix (normally ".so"). shrext_cmds='$shrext_cmds' # Executable file suffix (normally ""). exeext="$exeext" # Additional compiler flags for building library objects. pic_flag=$lt_lt_prog_compiler_pic pic_mode=$pic_mode # What is the maximum length of a command? max_cmd_len=$lt_cv_sys_max_cmd_len # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_lt_cv_prog_compiler_c_o # Must we lock files when doing compilation? need_locks=$lt_need_locks # Do we need the lib prefix for modules? need_lib_prefix=$need_lib_prefix # Do we need a version for libraries? need_version=$need_version # Whether dlopen is supported. dlopen_support=$enable_dlopen # Whether dlopen of programs is supported. dlopen_self=$enable_dlopen_self # Whether dlopen of statically linked programs is supported. dlopen_self_static=$enable_dlopen_self_static # Compiler flag to prevent dynamic linking. link_static_flag=$lt_lt_prog_compiler_static # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_export_dynamic_flag_spec # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec=$lt_whole_archive_flag_spec # Compiler flag to generate thread-safe objects. thread_safe_flag_spec=$lt_thread_safe_flag_spec # Library versioning type. version_type=$version_type # Format of library name prefix. libname_spec=$lt_libname_spec # List of archive names. First name is the real one, the rest are links. # The last name is the one that the linker finds with -lNAME. library_names_spec=$lt_library_names_spec # The coded name of the library, if different from the real name. soname_spec=$lt_soname_spec # Commands used to build and install an old-style archive. RANLIB=$lt_RANLIB old_archive_cmds=$lt_old_archive_cmds old_postinstall_cmds=$lt_old_postinstall_cmds old_postuninstall_cmds=$lt_old_postuninstall_cmds # Create an old-style archive from a shared archive. old_archive_from_new_cmds=$lt_old_archive_from_new_cmds # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds # Commands used to build and install a shared archive. archive_cmds=$lt_archive_cmds archive_expsym_cmds=$lt_archive_expsym_cmds postinstall_cmds=$lt_postinstall_cmds postuninstall_cmds=$lt_postuninstall_cmds # Commands used to build a loadable module (assumed same as above if empty) module_cmds=$lt_module_cmds module_expsym_cmds=$lt_module_expsym_cmds # Commands to strip libraries. old_striplib=$lt_old_striplib striplib=$lt_striplib # Dependencies to place before the objects being linked to create a # shared library. predep_objects=$lt_predep_objects # Dependencies to place after the objects being linked to create a # shared library. postdep_objects=$lt_postdep_objects # Dependencies to place before the objects being linked to create a # shared library. predeps=$lt_predeps # Dependencies to place after the objects being linked to create a # shared library. postdeps=$lt_postdeps # The directories searched by this compiler when creating a shared # library compiler_lib_search_dirs=$lt_compiler_lib_search_dirs # The library search path used internally by the compiler when linking # a shared library. compiler_lib_search_path=$lt_compiler_lib_search_path # Method to check whether dependent libraries are shared objects. deplibs_check_method=$lt_deplibs_check_method # Command to use when deplibs_check_method == file_magic. file_magic_cmd=$lt_file_magic_cmd # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_allow_undefined_flag # Flag that forces no undefined symbols. no_undefined_flag=$lt_no_undefined_flag # Commands used to finish a libtool library installation in a directory. finish_cmds=$lt_finish_cmds # Same as above, but a single script fragment to be evaled but not shown. finish_eval=$lt_finish_eval # Take the output of nm and produce a listing of raw symbols and C names. global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe # Transform the output of nm in a proper C declaration global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl # Transform the output of nm in a C name address pair global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address # This is the shared library runtime path variable. runpath_var=$runpath_var # This is the shared library path variable. shlibpath_var=$shlibpath_var # Is shlibpath searched before the hard-coded library search path? shlibpath_overrides_runpath=$shlibpath_overrides_runpath # How to hardcode a shared library path into an executable. hardcode_action=$hardcode_action # Whether we should hardcode library paths into libraries. hardcode_into_libs=$hardcode_into_libs # Flag to hardcode \$libdir into a binary during linking. # This must work even if \$libdir does not exist. hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec # If ld is used when linking, flag to hardcode \$libdir into # a binary during linking. This must work even if \$libdir does # not exist. hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld # Whether we need a single -rpath flag with a separated argument. hardcode_libdir_separator=$lt_hardcode_libdir_separator # Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the # resulting binary. hardcode_direct=$hardcode_direct # Set to yes if using the -LDIR flag during linking hardcodes DIR into the # resulting binary. hardcode_minus_L=$hardcode_minus_L # Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into # the resulting binary. hardcode_shlibpath_var=$hardcode_shlibpath_var # Set to yes if building a shared library automatically hardcodes DIR into the library # and all subsequent libraries and executables linked against it. hardcode_automatic=$hardcode_automatic # Variables whose values should be saved in libtool wrapper scripts and # restored at relink time. variables_saved_for_relink="$variables_saved_for_relink" # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$link_all_deplibs # Compile-time system search path for libraries sys_lib_search_path_spec=$lt_sys_lib_search_path_spec # Run-time system search path for libraries sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec # Fix the shell variable \$srcfile for the compiler. fix_srcfile_path=$lt_fix_srcfile_path # Set to yes if exported symbols are required. always_export_symbols=$always_export_symbols # The commands to list exported symbols. export_symbols_cmds=$lt_export_symbols_cmds # The commands to extract the exported symbol list from a shared archive. extract_expsyms_cmds=$lt_extract_expsyms_cmds # Symbols that should not be listed in the preloaded symbols. exclude_expsyms=$lt_exclude_expsyms # Symbols that must always be exported. include_expsyms=$lt_include_expsyms # ### END LIBTOOL CONFIG __EOF__ case $host_os in aix3*) cat <<\EOF >> "$cfgfile" # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi EOF ;; esac # We use sed instead of cat because bash on DJGPP gets confused if # if finds mixed CR/LF and LF-only lines. Since sed operates in # text mode, it properly converts lines to CR/LF. This bash problem # is reportedly fixed, but why not run on old versions too? sed '$q' "$ltmain" >> "$cfgfile" || (rm -f "$cfgfile"; exit 1) mv -f "$cfgfile" "$ofile" || \ (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") chmod +x "$ofile" else # If there is no Makefile yet, we rely on a make rule to execute # `config.status --recheck' to rerun these tests and create the # libtool script then. ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` if test -f "$ltmain_in"; then test -f Makefile && make "$ltmain" fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu CC="$lt_save_CC" # Check whether --with-tags or --without-tags was given. if test "${with_tags+set}" = set; then withval="$with_tags" tagnames="$withval" fi; if test -f "$ltmain" && test -n "$tagnames"; then if test ! -f "${ofile}"; then { echo "$as_me:$LINENO: WARNING: output file \`$ofile' does not exist" >&5 echo "$as_me: WARNING: output file \`$ofile' does not exist" >&2;} fi if test -z "$LTCC"; then eval "`$SHELL ${ofile} --config | grep '^LTCC='`" if test -z "$LTCC"; then { echo "$as_me:$LINENO: WARNING: output file \`$ofile' does not look like a libtool script" >&5 echo "$as_me: WARNING: output file \`$ofile' does not look like a libtool script" >&2;} else { echo "$as_me:$LINENO: WARNING: using \`LTCC=$LTCC', extracted from \`$ofile'" >&5 echo "$as_me: WARNING: using \`LTCC=$LTCC', extracted from \`$ofile'" >&2;} fi fi if test -z "$LTCFLAGS"; then eval "`$SHELL ${ofile} --config | grep '^LTCFLAGS='`" fi # Extract list of available tagged configurations in $ofile. # Note that this assumes the entire list is on one line. available_tags=`grep "^available_tags=" "${ofile}" | $SED -e 's/available_tags=\(.*$\)/\1/' -e 's/\"//g'` lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for tagname in $tagnames; do IFS="$lt_save_ifs" # Check whether tagname contains only valid characters case `$echo "X$tagname" | $Xsed -e 's:[-_ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890,/]::g'` in "") ;; *) { { echo "$as_me:$LINENO: error: invalid tag name: $tagname" >&5 echo "$as_me: error: invalid tag name: $tagname" >&2;} { (exit 1); exit 1; }; } ;; esac if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$" < "${ofile}" > /dev/null then { { echo "$as_me:$LINENO: error: tag name \"$tagname\" already exists" >&5 echo "$as_me: error: tag name \"$tagname\" already exists" >&2;} { (exit 1); exit 1; }; } fi # Update the list of available tags. if test -n "$tagname"; then echo appending configuration tag \"$tagname\" to $ofile case $tagname in CXX) if test -n "$CXX" && ( test "X$CXX" != "Xno" && ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || (test "X$CXX" != "Xg++"))) ; then ac_ext=cc ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu archive_cmds_need_lc_CXX=no allow_undefined_flag_CXX= always_export_symbols_CXX=no archive_expsym_cmds_CXX= export_dynamic_flag_spec_CXX= hardcode_direct_CXX=no hardcode_libdir_flag_spec_CXX= hardcode_libdir_flag_spec_ld_CXX= hardcode_libdir_separator_CXX= hardcode_minus_L_CXX=no hardcode_shlibpath_var_CXX=unsupported hardcode_automatic_CXX=no module_cmds_CXX= module_expsym_cmds_CXX= link_all_deplibs_CXX=unknown old_archive_cmds_CXX=$old_archive_cmds no_undefined_flag_CXX= whole_archive_flag_spec_CXX= enable_shared_with_static_runtimes_CXX=no # Dependencies to place before and after the object being linked: predep_objects_CXX= postdep_objects_CXX= predeps_CXX= postdeps_CXX= compiler_lib_search_path_CXX= compiler_lib_search_dirs_CXX= # Source file extension for C++ test sources. ac_ext=cpp # Object file extension for compiled C++ test sources. objext=o objext_CXX=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(int, char *[]) { return(0); }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # save warnings/boilerplate of simple test code ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $rm conftest* ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $rm -r conftest* # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_LD=$LD lt_save_GCC=$GCC GCC=$GXX lt_save_with_gnu_ld=$with_gnu_ld lt_save_path_LD=$lt_cv_path_LD if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx else $as_unset lt_cv_prog_gnu_ld fi if test -n "${lt_cv_path_LDCXX+set}"; then lt_cv_path_LD=$lt_cv_path_LDCXX else $as_unset lt_cv_path_LD fi test -z "${LDCXX+set}" || LD=$LDCXX CC=${CXX-"c++"} compiler=$CC compiler_CXX=$CC for cc_temp in $compiler""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` # We don't want -fno-exception wen compiling C++ code, so set the # no_builtin_flag separately if test "$GXX" = yes; then lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin' else lt_prog_compiler_no_builtin_flag_CXX= fi if test "$GXX" = yes; then # Set up default GNU C++ configuration # Check whether --with-gnu-ld or --without-gnu-ld was given. if test "${with_gnu_ld+set}" = set; then withval="$with_gnu_ld" test "$withval" = no || with_gnu_ld=yes else with_gnu_ld=no fi; ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. echo "$as_me:$LINENO: checking for ld used by $CC" >&5 echo $ECHO_N "checking for ld used by $CC... $ECHO_C" >&6 case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [\\/]* | ?:[\\/]*) re_direlt='/[^/][^/]*/\.\./' # Canonicalize the pathname of ld ac_prog=`echo $ac_prog| $SED 's%\\\\%/%g'` while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do ac_prog=`echo $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then echo "$as_me:$LINENO: checking for GNU ld" >&5 echo $ECHO_N "checking for GNU ld... $ECHO_C" >&6 else echo "$as_me:$LINENO: checking for non-GNU ld" >&5 echo $ECHO_N "checking for non-GNU ld... $ECHO_C" >&6 fi if test "${lt_cv_path_LD+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -z "$LD"; then lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &5 echo "${ECHO_T}$LD" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi test -z "$LD" && { { echo "$as_me:$LINENO: error: no acceptable ld found in \$PATH" >&5 echo "$as_me: error: no acceptable ld found in \$PATH" >&2;} { (exit 1); exit 1; }; } echo "$as_me:$LINENO: checking if the linker ($LD) is GNU ld" >&5 echo $ECHO_N "checking if the linker ($LD) is GNU ld... $ECHO_C" >&6 if test "${lt_cv_prog_gnu_ld+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else # I'd rather use --version here, but apparently some GNU lds only accept -v. case `$LD -v 2>&1 &5 echo "${ECHO_T}$lt_cv_prog_gnu_ld" >&6 with_gnu_ld=$lt_cv_prog_gnu_ld # Check if GNU C++ uses GNU ld as the underlying linker, since the # archiving commands below assume that GNU ld is being used. if test "$with_gnu_ld" = yes; then archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' hardcode_libdir_flag_spec_CXX='${wl}--rpath ${wl}$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' # If archive_cmds runs LD, not CC, wlarc should be empty # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to # investigate it a little bit more. (MM) wlarc='${wl}' # ancient GNU ld didn't support --whole-archive et. al. if eval "`$CC -print-prog-name=ld` --help 2>&1" | \ grep 'no-whole-archive' > /dev/null; then whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else whole_archive_flag_spec_CXX= fi else with_gnu_ld=no wlarc= # A generic and very simple default shared library creation # command for GNU C++ for the case where it uses the native # linker, instead of GNU ld. If possible, this setting should # overridden to take advantage of the native linker features on # the platform it is being used on. archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' fi # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' else GXX=no with_gnu_ld=no wlarc= fi # PORTME: fill in a description of your system's C++ link characteristics echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6 ld_shlibs_CXX=yes case $host_os in aix3*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; aix[4-9]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) for ld_flag in $LDFLAGS; do case $ld_flag in *-brtl*) aix_use_runtimelinking=yes break ;; esac done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. archive_cmds_CXX='' hardcode_direct_CXX=yes hardcode_libdir_separator_CXX=':' link_all_deplibs_CXX=yes if test "$GXX" = yes; then case $host_os in aix4.[012]|aix4.[012].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && \ strings "$collect2name" | grep resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 hardcode_direct_CXX=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking hardcode_minus_L_CXX=yes hardcode_libdir_flag_spec_CXX='-L$libdir' hardcode_libdir_separator_CXX= fi ;; esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. always_export_symbols_CXX=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. allow_undefined_flag_CXX='-berok' # Determine the default libpath from the value encoded in an empty executable. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/ p } }' aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" archive_expsym_cmds_CXX="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then hardcode_libdir_flag_spec_CXX='${wl}-R $libdir:/usr/lib:/lib' allow_undefined_flag_CXX="-z nodefs" archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an empty executable. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/ p } }' aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. no_undefined_flag_CXX=' ${wl}-bernotok' allow_undefined_flag_CXX=' ${wl}-berok' # Exported symbols can be pulled into shared objects from archives whole_archive_flag_spec_CXX='$convenience' archive_cmds_need_lc_CXX=yes # This is similar to how AIX traditionally builds its shared libraries. archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; beos*) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then allow_undefined_flag_CXX=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME archive_cmds_CXX='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else ld_shlibs_CXX=no fi ;; chorus*) case $cc_basename in *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; cygwin* | mingw* | pw32*) # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless, # as there is no search path for DLLs. hardcode_libdir_flag_spec_CXX='-L$libdir' allow_undefined_flag_CXX=unsupported always_export_symbols_CXX=no enable_shared_with_static_runtimes_CXX=yes if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else ld_shlibs_CXX=no fi ;; darwin* | rhapsody*) archive_cmds_need_lc_CXX=no hardcode_direct_CXX=no hardcode_automatic_CXX=yes hardcode_shlibpath_var_CXX=unsupported whole_archive_flag_spec_CXX='' link_all_deplibs_CXX=yes allow_undefined_flag_CXX="$_lt_dar_allow_undefined" if test "$GXX" = yes ; then output_verbose_link_cmd='echo' archive_cmds_CXX="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" module_cmds_CXX="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" module_expsym_cmds_CXX="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" if test "$lt_cv_apple_cc_single_mod" != "yes"; then archive_cmds_CXX="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}" archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}" fi else case $cc_basename in xlc*) output_verbose_link_cmd='echo' archive_cmds_CXX='$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $xlcverstring' module_cmds_CXX='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds archive_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $xlcverstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' module_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' ;; *) ld_shlibs_CXX=no ;; esac fi ;; dgux*) case $cc_basename in ec++*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; ghcx*) # Green Hills C++ Compiler # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; freebsd[12]*) # C++ shared libraries reported to be fairly broken before switch to ELF ld_shlibs_CXX=no ;; freebsd-elf*) archive_cmds_need_lc_CXX=no ;; freebsd* | dragonfly*) # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF # conventions ld_shlibs_CXX=yes ;; gnu*) ;; hpux9*) hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' hardcode_libdir_separator_CXX=: export_dynamic_flag_spec_CXX='${wl}-E' hardcode_direct_CXX=yes hardcode_minus_L_CXX=yes # Not in the search PATH, # but as the default # location of the library. case $cc_basename in CC*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; aCC*) archive_cmds_CXX='$rm $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "[-]L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' ;; *) if test "$GXX" = yes; then archive_cmds_CXX='$rm $output_objdir/$soname~$CC -shared -nostdlib -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else # FIXME: insert proper C++ library support ld_shlibs_CXX=no fi ;; esac ;; hpux10*|hpux11*) if test $with_gnu_ld = no; then hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' hardcode_libdir_separator_CXX=: case $host_cpu in hppa*64*|ia64*) ;; *) export_dynamic_flag_spec_CXX='${wl}-E' ;; esac fi case $host_cpu in hppa*64*|ia64*) hardcode_direct_CXX=no hardcode_shlibpath_var_CXX=no ;; *) hardcode_direct_CXX=yes hardcode_minus_L_CXX=yes # Not in the search PATH, # but as the default # location of the library. ;; esac case $cc_basename in CC*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; aCC*) case $host_cpu in hppa*64*) archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' ;; *) if test "$GXX" = yes; then if test $with_gnu_ld = no; then case $host_cpu in hppa*64*) archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac fi else # FIXME: insert proper C++ library support ld_shlibs_CXX=no fi ;; esac ;; interix[3-9]*) hardcode_direct_CXX=no hardcode_shlibpath_var_CXX=no hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' export_dynamic_flag_spec_CXX='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. archive_cmds_CXX='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' archive_expsym_cmds_CXX='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; irix5* | irix6*) case $cc_basename in CC*) # SGI C++ archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' # Archives containing C++ object files must be created using # "CC -ar", where "CC" is the IRIX C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. old_archive_cmds_CXX='$CC -ar -WR,-u -o $oldlib $oldobjs' ;; *) if test "$GXX" = yes; then if test "$with_gnu_ld" = no; then archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` -o $lib' fi fi link_all_deplibs_CXX=yes ;; esac hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_CXX=: ;; linux* | k*bsd*-gnu) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' archive_expsym_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | grep "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' hardcode_libdir_flag_spec_CXX='${wl}--rpath,$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' # Archives containing C++ object files must be created using # "CC -Bstatic", where "CC" is the KAI C++ compiler. old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;; icpc*) # Intel C++ with_gnu_ld=yes # version 8.0 and above of icpc choke on multiply defined symbols # if we add $predep_objects and $postdep_objects, however 7.1 and # earlier do not add the objects themselves. case `$CC -V 2>&1` in *"Version 7."*) archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ;; *) # Version 8.0 or newer tmp_idyn= case $host_cpu in ia64*) tmp_idyn=' -i_dynamic';; esac archive_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ;; esac archive_cmds_need_lc_CXX=no hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive' ;; pgCC* | pgcpp*) # Portland Group C++ compiler archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' hardcode_libdir_flag_spec_CXX='${wl}--rpath ${wl}$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' whole_archive_flag_spec_CXX='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' ;; cxx*) # Compaq C++ archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' runpath_var=LD_RUN_PATH hardcode_libdir_flag_spec_CXX='-rpath $libdir' hardcode_libdir_separator_CXX=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 no_undefined_flag_CXX=' -zdefs' archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' archive_expsym_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols' hardcode_libdir_flag_spec_CXX='-R$libdir' whole_archive_flag_spec_CXX='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' # Not sure whether something based on # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 # would be better. output_verbose_link_cmd='echo' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' ;; esac ;; esac ;; lynxos*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; m88k*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; mvs*) case $cc_basename in cxx*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; netbsd*) if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then archive_cmds_CXX='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' wlarc= hardcode_libdir_flag_spec_CXX='-R$libdir' hardcode_direct_CXX=yes hardcode_shlibpath_var_CXX=no fi # Workaround some broken pre-1.5 toolchains output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' ;; openbsd2*) # C++ shared libraries are fairly broken ld_shlibs_CXX=no ;; openbsd*) if test -f /usr/libexec/ld.so; then hardcode_direct_CXX=yes hardcode_shlibpath_var_CXX=no archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' export_dynamic_flag_spec_CXX='${wl}-E' whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' fi output_verbose_link_cmd='echo' else ld_shlibs_CXX=no fi ;; osf3*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' hardcode_libdir_separator_CXX=: # Archives containing C++ object files must be created using # "CC -Bstatic", where "CC" is the KAI C++ compiler. old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;; RCC*) # Rational C++ 2.4.1 # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; cxx*) allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && echo ${wl}-set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_CXX=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' ;; *) if test "$GXX" = yes && test "$with_gnu_ld" = no; then allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_CXX=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' else # FIXME: insert proper C++ library support ld_shlibs_CXX=no fi ;; esac ;; osf4* | osf5*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' hardcode_libdir_separator_CXX=: # Archives containing C++ object files must be created using # the KAI C++ compiler. old_archive_cmds_CXX='$CC -o $oldlib $oldobjs' ;; RCC*) # Rational C++ 2.4.1 # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; cxx*) allow_undefined_flag_CXX=' -expect_unresolved \*' archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' archive_expsym_cmds_CXX='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ echo "-hidden">> $lib.exp~ $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname -Wl,-input -Wl,$lib.exp `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib~ $rm $lib.exp' hardcode_libdir_flag_spec_CXX='-rpath $libdir' hardcode_libdir_separator_CXX=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' ;; *) if test "$GXX" = yes && test "$with_gnu_ld" = no; then allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_CXX=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' else # FIXME: insert proper C++ library support ld_shlibs_CXX=no fi ;; esac ;; psos*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; lcc*) # Lucid # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; solaris*) case $cc_basename in CC*) # Sun C++ 4.2, 5.x and Centerline C++ archive_cmds_need_lc_CXX=yes no_undefined_flag_CXX=' -zdefs' archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' archive_expsym_cmds_CXX='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' hardcode_libdir_flag_spec_CXX='-R$libdir' hardcode_shlibpath_var_CXX=no case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. # Supported since Solaris 2.6 (maybe 2.5.1?) whole_archive_flag_spec_CXX='-z allextract$convenience -z defaultextract' ;; esac link_all_deplibs_CXX=yes output_verbose_link_cmd='echo' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' ;; gcx*) # Green Hills C++ Compiler archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' # The C++ compiler must be used to create the archive. old_archive_cmds_CXX='$CC $LDFLAGS -archive -o $oldlib $oldobjs' ;; *) # GNU C++ compiler with Solaris linker if test "$GXX" = yes && test "$with_gnu_ld" = no; then no_undefined_flag_CXX=' ${wl}-z ${wl}defs' if $CC --version | grep -v '^2\.7' > /dev/null; then archive_cmds_CXX='$CC -shared -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' archive_expsym_cmds_CXX='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $CC -shared -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd="$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\"" else # g++ 2.7 appears to require `-G' NOT `-shared' on this # platform. archive_cmds_CXX='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' archive_expsym_cmds_CXX='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd="$CC -G $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\"" fi hardcode_libdir_flag_spec_CXX='${wl}-R $wl$libdir' case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) whole_archive_flag_spec_CXX='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' ;; esac fi ;; esac ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) no_undefined_flag_CXX='${wl}-z,text' archive_cmds_need_lc_CXX=no hardcode_shlibpath_var_CXX=no runpath_var='LD_RUN_PATH' case $cc_basename in CC*) archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. # For security reasons, it is highly recommended that you always # use absolute paths for naming shared libraries, and exclude the # DT_RUNPATH tag from executables and libraries. But doing so # requires that you compile everything twice, which is a pain. # So that behaviour is only enabled if SCOABSPATH is set to a # non-empty value in the environment. Most likely only useful for # creating official distributions of packages. # This is a hack until libtool officially supports absolute path # names for shared libraries. no_undefined_flag_CXX='${wl}-z,text' allow_undefined_flag_CXX='${wl}-z,nodefs' archive_cmds_need_lc_CXX=no hardcode_shlibpath_var_CXX=no hardcode_libdir_flag_spec_CXX='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`' hardcode_libdir_separator_CXX=':' link_all_deplibs_CXX=yes export_dynamic_flag_spec_CXX='${wl}-Bexport' runpath_var='LD_RUN_PATH' case $cc_basename in CC*) archive_cmds_CXX='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds_CXX='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; vxworks*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac echo "$as_me:$LINENO: result: $ld_shlibs_CXX" >&5 echo "${ECHO_T}$ld_shlibs_CXX" >&6 test "$ld_shlibs_CXX" = no && can_build_shared=no GCC_CXX="$GXX" LD_CXX="$LD" cat > conftest.$ac_ext <&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then # Parse the compiler output and extract the necessary # objects, libraries and library flags. # Sentinel used to keep track of whether or not we are before # the conftest object file. pre_test_object_deps_done=no # The `*' in the case matches for architectures that use `case' in # $output_verbose_cmd can trigger glob expansion during the loop # eval without this substitution. output_verbose_link_cmd=`$echo "X$output_verbose_link_cmd" | $Xsed -e "$no_glob_subst"` for p in `eval $output_verbose_link_cmd`; do case $p in -L* | -R* | -l*) # Some compilers place space between "-{L,R}" and the path. # Remove the space. if test $p = "-L" \ || test $p = "-R"; then prev=$p continue else prev= fi if test "$pre_test_object_deps_done" = no; then case $p in -L* | -R*) # Internal compiler library paths should come after those # provided the user. The postdeps already come after the # user supplied libs so there is no need to process them. if test -z "$compiler_lib_search_path_CXX"; then compiler_lib_search_path_CXX="${prev}${p}" else compiler_lib_search_path_CXX="${compiler_lib_search_path_CXX} ${prev}${p}" fi ;; # The "-l" case would never come before the object being # linked, so don't bother handling this case. esac else if test -z "$postdeps_CXX"; then postdeps_CXX="${prev}${p}" else postdeps_CXX="${postdeps_CXX} ${prev}${p}" fi fi ;; *.$objext) # This assumes that the test object file only shows up # once in the compiler output. if test "$p" = "conftest.$objext"; then pre_test_object_deps_done=yes continue fi if test "$pre_test_object_deps_done" = no; then if test -z "$predep_objects_CXX"; then predep_objects_CXX="$p" else predep_objects_CXX="$predep_objects_CXX $p" fi else if test -z "$postdep_objects_CXX"; then postdep_objects_CXX="$p" else postdep_objects_CXX="$postdep_objects_CXX $p" fi fi ;; *) ;; # Ignore the rest. esac done # Clean up. rm -f a.out a.exe else echo "libtool.m4: error: problem compiling CXX test program" fi $rm -f confest.$objext compiler_lib_search_dirs_CXX= if test -n "$compiler_lib_search_path_CXX"; then compiler_lib_search_dirs_CXX=`echo " ${compiler_lib_search_path_CXX}" | ${SED} -e 's! -L! !g' -e 's!^ !!'` fi # PORTME: override above test on systems where it is broken case $host_os in interix[3-9]*) # Interix 3.5 installs completely hosed .la files for C++, so rather than # hack all around it, let's just trust "g++" to DTRT. predep_objects_CXX= postdep_objects_CXX= postdeps_CXX= ;; linux*) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 # # The more standards-conforming stlport4 library is # incompatible with the Cstd library. Avoid specifying # it if it's in CXXFLAGS. Ignore libCrun as # -library=stlport4 depends on it. case " $CXX $CXXFLAGS " in *" -library=stlport4 "*) solaris_use_stlport4=yes ;; esac if test "$solaris_use_stlport4" != yes; then postdeps_CXX='-library=Cstd -library=Crun' fi ;; esac ;; solaris*) case $cc_basename in CC*) # The more standards-conforming stlport4 library is # incompatible with the Cstd library. Avoid specifying # it if it's in CXXFLAGS. Ignore libCrun as # -library=stlport4 depends on it. case " $CXX $CXXFLAGS " in *" -library=stlport4 "*) solaris_use_stlport4=yes ;; esac # Adding this requires a known-good setup of shared libraries for # Sun compiler versions before 5.6, else PIC objects from an old # archive will be linked into the output, leading to subtle bugs. if test "$solaris_use_stlport4" != yes; then postdeps_CXX='-library=Cstd -library=Crun' fi ;; esac ;; esac case " $postdeps_CXX " in *" -lc "*) archive_cmds_need_lc_CXX=no ;; esac lt_prog_compiler_wl_CXX= lt_prog_compiler_pic_CXX= lt_prog_compiler_static_CXX= echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5 echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6 # C++ specific cases for pic, static, wl, etc. if test "$GXX" = yes; then lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static_CXX='-Bstatic' fi ;; amigaos*) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. lt_prog_compiler_pic_CXX='-m68020 -resident32 -malways-restore-a4' ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | os2* | pw32*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries lt_prog_compiler_pic_CXX='-DDLL_EXPORT' ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic_CXX='-fno-common' ;; *djgpp*) # DJGPP does not support shared libraries at all lt_prog_compiler_pic_CXX= ;; interix[3-9]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic_CXX=-Kconform_pic fi ;; hpux*) # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) ;; *) lt_prog_compiler_pic_CXX='-fPIC' ;; esac ;; *) lt_prog_compiler_pic_CXX='-fPIC' ;; esac else case $host_os in aix[4-9]*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static_CXX='-Bstatic' else lt_prog_compiler_static_CXX='-bnso -bI:/lib/syscalls.exp' fi ;; chorus*) case $cc_basename in cxch68*) # Green Hills C++ Compiler # _LT_AC_TAGVAR(lt_prog_compiler_static, CXX)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" ;; esac ;; darwin*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files case $cc_basename in xlc*) lt_prog_compiler_pic_CXX='-qnocommon' lt_prog_compiler_wl_CXX='-Wl,' ;; esac ;; dgux*) case $cc_basename in ec++*) lt_prog_compiler_pic_CXX='-KPIC' ;; ghcx*) # Green Hills C++ Compiler lt_prog_compiler_pic_CXX='-pic' ;; *) ;; esac ;; freebsd* | dragonfly*) # FreeBSD uses GNU C++ ;; hpux9* | hpux10* | hpux11*) case $cc_basename in CC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='${wl}-a ${wl}archive' if test "$host_cpu" != ia64; then lt_prog_compiler_pic_CXX='+Z' fi ;; aCC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='${wl}-a ${wl}archive' case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic_CXX='+Z' ;; esac ;; *) ;; esac ;; interix*) # This is c89, which is MS Visual C++ (no shared libs) # Anyone wants to do a port? ;; irix5* | irix6* | nonstopux*) case $cc_basename in CC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='-non_shared' # CC pic flag -KPIC is the default. ;; *) ;; esac ;; linux* | k*bsd*-gnu) case $cc_basename in KCC*) # KAI C++ Compiler lt_prog_compiler_wl_CXX='--backend -Wl,' lt_prog_compiler_pic_CXX='-fPIC' ;; icpc* | ecpc*) # Intel C++ lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-static' ;; pgCC* | pgcpp*) # Portland Group C++ compiler. lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-fpic' lt_prog_compiler_static_CXX='-Bstatic' ;; cxx*) # Compaq C++ # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. lt_prog_compiler_pic_CXX= lt_prog_compiler_static_CXX='-non_shared' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-Bstatic' lt_prog_compiler_wl_CXX='-Qoption ld ' ;; esac ;; esac ;; lynxos*) ;; m88k*) ;; mvs*) case $cc_basename in cxx*) lt_prog_compiler_pic_CXX='-W c,exportall' ;; *) ;; esac ;; netbsd*) ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) lt_prog_compiler_wl_CXX='--backend -Wl,' ;; RCC*) # Rational C++ 2.4.1 lt_prog_compiler_pic_CXX='-pic' ;; cxx*) # Digital/Compaq C++ lt_prog_compiler_wl_CXX='-Wl,' # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. lt_prog_compiler_pic_CXX= lt_prog_compiler_static_CXX='-non_shared' ;; *) ;; esac ;; psos*) ;; solaris*) case $cc_basename in CC*) # Sun C++ 4.2, 5.x and Centerline C++ lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-Bstatic' lt_prog_compiler_wl_CXX='-Qoption ld ' ;; gcx*) # Green Hills C++ Compiler lt_prog_compiler_pic_CXX='-PIC' ;; *) ;; esac ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x lt_prog_compiler_pic_CXX='-pic' lt_prog_compiler_static_CXX='-Bstatic' ;; lcc*) # Lucid lt_prog_compiler_pic_CXX='-pic' ;; *) ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 lt_prog_compiler_pic_CXX='-KPIC' ;; *) ;; esac ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) case $cc_basename in CC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-Bstatic' ;; esac ;; vxworks*) ;; *) lt_prog_compiler_can_build_shared_CXX=no ;; esac fi echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_CXX" >&5 echo "${ECHO_T}$lt_prog_compiler_pic_CXX" >&6 # # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic_CXX"; then echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5 echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... $ECHO_C" >&6 if test "${lt_cv_prog_compiler_pic_works_CXX+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lt_cv_prog_compiler_pic_works_CXX=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$lt_prog_compiler_pic_CXX -DPIC" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:12169: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:12173: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_pic_works_CXX=yes fi fi $rm conftest* fi echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_pic_works_CXX" >&5 echo "${ECHO_T}$lt_cv_prog_compiler_pic_works_CXX" >&6 if test x"$lt_cv_prog_compiler_pic_works_CXX" = xyes; then case $lt_prog_compiler_pic_CXX in "" | " "*) ;; *) lt_prog_compiler_pic_CXX=" $lt_prog_compiler_pic_CXX" ;; esac else lt_prog_compiler_pic_CXX= lt_prog_compiler_can_build_shared_CXX=no fi fi case $host_os in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) lt_prog_compiler_pic_CXX= ;; *) lt_prog_compiler_pic_CXX="$lt_prog_compiler_pic_CXX -DPIC" ;; esac # # Check to make sure the static flag actually works. # wl=$lt_prog_compiler_wl_CXX eval lt_tmp_static_flag=\"$lt_prog_compiler_static_CXX\" echo "$as_me:$LINENO: checking if $compiler static flag $lt_tmp_static_flag works" >&5 echo $ECHO_N "checking if $compiler static flag $lt_tmp_static_flag works... $ECHO_C" >&6 if test "${lt_cv_prog_compiler_static_works_CXX+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lt_cv_prog_compiler_static_works_CXX=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $lt_tmp_static_flag" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $echo "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_static_works_CXX=yes fi else lt_cv_prog_compiler_static_works_CXX=yes fi fi $rm -r conftest* LDFLAGS="$save_LDFLAGS" fi echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_static_works_CXX" >&5 echo "${ECHO_T}$lt_cv_prog_compiler_static_works_CXX" >&6 if test x"$lt_cv_prog_compiler_static_works_CXX" = xyes; then : else lt_prog_compiler_static_CXX= fi echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5 echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6 if test "${lt_cv_prog_compiler_c_o_CXX+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lt_cv_prog_compiler_c_o_CXX=no $rm -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:12273: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:12277: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o_CXX=yes fi fi chmod u+w . 2>&5 $rm conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files $rm out/* && rmdir out cd .. rmdir conftest $rm conftest* fi echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o_CXX" >&5 echo "${ECHO_T}$lt_cv_prog_compiler_c_o_CXX" >&6 hard_links="nottested" if test "$lt_cv_prog_compiler_c_o_CXX" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user echo "$as_me:$LINENO: checking if we can lock with hard links" >&5 echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&6 hard_links=yes $rm conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no echo "$as_me:$LINENO: result: $hard_links" >&5 echo "${ECHO_T}$hard_links" >&6 if test "$hard_links" = no; then { echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} need_locks=warn fi else need_locks=no fi echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6 export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' case $host_os in aix[4-9]*) # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm if $NM -V 2>&1 | grep 'GNU' > /dev/null; then export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' else export_symbols_cmds_CXX='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' fi ;; pw32*) export_symbols_cmds_CXX="$ltdll_cmds" ;; cygwin* | mingw*) export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;/^.*[ ]__nm__/s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' ;; *) export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' ;; esac exclude_expsyms_CXX='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' echo "$as_me:$LINENO: result: $ld_shlibs_CXX" >&5 echo "${ECHO_T}$ld_shlibs_CXX" >&6 test "$ld_shlibs_CXX" = no && can_build_shared=no # # Do we need to explicitly link libc? # case "x$archive_cmds_need_lc_CXX" in x|xyes) # Assume -lc should be added archive_cmds_need_lc_CXX=yes if test "$enable_shared" = yes && test "$GCC" = yes; then case $archive_cmds_CXX in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5 echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6 $rm conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$lt_prog_compiler_wl_CXX pic_flag=$lt_prog_compiler_pic_CXX compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$allow_undefined_flag_CXX allow_undefined_flag_CXX= if { (eval echo "$as_me:$LINENO: \"$archive_cmds_CXX 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\"") >&5 (eval $archive_cmds_CXX 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } then archive_cmds_need_lc_CXX=no else archive_cmds_need_lc_CXX=yes fi allow_undefined_flag_CXX=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $rm conftest* echo "$as_me:$LINENO: result: $archive_cmds_need_lc_CXX" >&5 echo "${ECHO_T}$archive_cmds_need_lc_CXX" >&6 ;; esac fi ;; esac echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5 echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&6 library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=".so" postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='${libname}${release}${shared_ext}$major' ;; aix[4-9]*) version_type=linux need_lib_prefix=no need_version=no hardcode_into_libs=yes if test "$host_cpu" = ia64; then # AIX 5 supports IA64 library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line `#! .'. This would cause the generated library to # depend on `.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[01] | aix4.[01].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then : else can_build_shared=no fi ;; esac # AIX (on Power*) has no versioning support, so currently we can not hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' else # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='${libname}${release}.a $libname.a' soname_spec='${libname}${release}${shared_ext}$major' fi shlibpath_var=LIBPATH fi ;; amigaos*) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; beos*) library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[45]*) version_type=linux need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no case $GCC,$host_os in yes,cygwin* | yes,mingw* | yes,pw32*) library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $rm \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" ;; mingw*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then # It is most probably a Windows format PATH printed by # mingw gcc, but we are running on Cygwin. Gcc prints its search # path with ; separators, and with drive letters. We can handle the # drive letters (cygwin fileutils understands them), so leave them, # especially as we might pass files found there to a mingw objdump, # which wouldn't understand a cygwinified path. Ahh. sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; esac ;; *) library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' ;; esac dynamic_linker='Win32 ld.exe' # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext' soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd1*) dynamic_linker=no ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[123]*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2*) shlibpath_overrides_runpath=yes ;; freebsd3.[01]* | freebsdelf3.[01]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; gnu*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' if test "X$HPUX_IA64_MODE" = X32; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555. postinstall_cmds='chmod 555 $lib' ;; interix[3-9]*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then version_type=linux else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; # This must be Linux ELF. linux* | k*bsd*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; nto-qnx*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; openbsd*) version_type=sunos sys_lib_dlsearch_path_spec="/usr/lib" need_lib_prefix=no # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. case $host_os in openbsd3.3 | openbsd3.3.*) need_version=yes ;; *) need_version=no ;; esac library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[89] | openbsd2.[89].*) shlibpath_overrides_runpath=no ;; *) shlibpath_overrides_runpath=yes ;; esac else shlibpath_overrides_runpath=yes fi ;; os2*) libname_spec='$name' shrext_cmds=".dll" need_lib_prefix=no library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test "$with_gnu_ld" = yes; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no export_dynamic_flag_spec='${wl}-Blargedynsym' runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec ;then version_type=linux library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=freebsd-elf need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH hardcode_into_libs=yes if test "$with_gnu_ld" = yes; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' shlibpath_overrides_runpath=no else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' shlibpath_overrides_runpath=yes case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; uts4*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac echo "$as_me:$LINENO: result: $dynamic_linker" >&5 echo "${ECHO_T}$dynamic_linker" >&6 test "$dynamic_linker" = no && can_build_shared=no if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lt_cv_sys_lib_search_path_spec="$sys_lib_search_path_spec" fi sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lt_cv_sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec" fi sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5 echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6 hardcode_action_CXX= if test -n "$hardcode_libdir_flag_spec_CXX" || \ test -n "$runpath_var_CXX" || \ test "X$hardcode_automatic_CXX" = "Xyes" ; then # We can hardcode non-existant directories. if test "$hardcode_direct_CXX" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, CXX)" != no && test "$hardcode_minus_L_CXX" != no; then # Linking always hardcodes the temporary library directory. hardcode_action_CXX=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. hardcode_action_CXX=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. hardcode_action_CXX=unsupported fi echo "$as_me:$LINENO: result: $hardcode_action_CXX" >&5 echo "${ECHO_T}$hardcode_action_CXX" >&6 if test "$hardcode_action_CXX" = relink; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || test "$enable_shared" = no; then # Fast installation is not necessary enable_fast_install=needless fi # The else clause should only fire when bootstrapping the # libtool distribution, otherwise you forgot to ship ltmain.sh # with your package, and you will get complaints that there are # no rules to generate ltmain.sh. if test -f "$ltmain"; then # See if we are running on zsh, and set the options which allow our commands through # without removal of \ escapes. if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi # Now quote all the things that may contain metacharacters while being # careful not to overquote the AC_SUBSTed values. We take copies of the # variables and quote the copies for generation of the libtool script. for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \ SED SHELL STRIP \ libname_spec library_names_spec soname_spec extract_expsyms_cmds \ old_striplib striplib file_magic_cmd finish_cmds finish_eval \ deplibs_check_method reload_flag reload_cmds need_locks \ lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \ lt_cv_sys_global_symbol_to_c_name_address \ sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ old_postinstall_cmds old_postuninstall_cmds \ compiler_CXX \ CC_CXX \ LD_CXX \ lt_prog_compiler_wl_CXX \ lt_prog_compiler_pic_CXX \ lt_prog_compiler_static_CXX \ lt_prog_compiler_no_builtin_flag_CXX \ export_dynamic_flag_spec_CXX \ thread_safe_flag_spec_CXX \ whole_archive_flag_spec_CXX \ enable_shared_with_static_runtimes_CXX \ old_archive_cmds_CXX \ old_archive_from_new_cmds_CXX \ predep_objects_CXX \ postdep_objects_CXX \ predeps_CXX \ postdeps_CXX \ compiler_lib_search_path_CXX \ compiler_lib_search_dirs_CXX \ archive_cmds_CXX \ archive_expsym_cmds_CXX \ postinstall_cmds_CXX \ postuninstall_cmds_CXX \ old_archive_from_expsyms_cmds_CXX \ allow_undefined_flag_CXX \ no_undefined_flag_CXX \ export_symbols_cmds_CXX \ hardcode_libdir_flag_spec_CXX \ hardcode_libdir_flag_spec_ld_CXX \ hardcode_libdir_separator_CXX \ hardcode_automatic_CXX \ module_cmds_CXX \ module_expsym_cmds_CXX \ lt_cv_prog_compiler_c_o_CXX \ fix_srcfile_path_CXX \ exclude_expsyms_CXX \ include_expsyms_CXX; do case $var in old_archive_cmds_CXX | \ old_archive_from_new_cmds_CXX | \ archive_cmds_CXX | \ archive_expsym_cmds_CXX | \ module_cmds_CXX | \ module_expsym_cmds_CXX | \ old_archive_from_expsyms_cmds_CXX | \ export_symbols_cmds_CXX | \ extract_expsyms_cmds | reload_cmds | finish_cmds | \ postinstall_cmds | postuninstall_cmds | \ old_postinstall_cmds | old_postuninstall_cmds | \ sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) # Double-quote double-evaled strings. eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" ;; *) eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" ;; esac done case $lt_echo in *'\$0 --fallback-echo"') lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'` ;; esac cfgfile="$ofile" cat <<__EOF__ >> "$cfgfile" # ### BEGIN LIBTOOL TAG CONFIG: $tagname # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # Shell to use when invoking shell scripts. SHELL=$lt_SHELL # Whether or not to build shared libraries. build_libtool_libs=$enable_shared # Whether or not to build static libraries. build_old_libs=$enable_static # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$archive_cmds_need_lc_CXX # Whether or not to disallow shared libs when runtime libs are static allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_CXX # Whether or not to optimize for fast installation. fast_install=$enable_fast_install # The host system. host_alias=$host_alias host=$host host_os=$host_os # The build system. build_alias=$build_alias build=$build build_os=$build_os # An echo program that does not interpret backslashes. echo=$lt_echo # The archiver. AR=$lt_AR AR_FLAGS=$lt_AR_FLAGS # A C compiler. LTCC=$lt_LTCC # LTCC compiler flags. LTCFLAGS=$lt_LTCFLAGS # A language-specific compiler. CC=$lt_compiler_CXX # Is the compiler the GNU C compiler? with_gcc=$GCC_CXX # An ERE matcher. EGREP=$lt_EGREP # The linker used to build libraries. LD=$lt_LD_CXX # Whether we need hard or soft links. LN_S=$lt_LN_S # A BSD-compatible nm program. NM=$lt_NM # A symbol stripping program STRIP=$lt_STRIP # Used to examine libraries when file_magic_cmd begins "file" MAGIC_CMD=$MAGIC_CMD # Used on cygwin: DLL creation program. DLLTOOL="$DLLTOOL" # Used on cygwin: object dumper. OBJDUMP="$OBJDUMP" # Used on cygwin: assembler. AS="$AS" # The name of the directory that contains temporary libtool files. objdir=$objdir # How to create reloadable object files. reload_flag=$lt_reload_flag reload_cmds=$lt_reload_cmds # How to pass a linker flag through the compiler. wl=$lt_lt_prog_compiler_wl_CXX # Object file suffix (normally "o"). objext="$ac_objext" # Old archive suffix (normally "a"). libext="$libext" # Shared library suffix (normally ".so"). shrext_cmds='$shrext_cmds' # Executable file suffix (normally ""). exeext="$exeext" # Additional compiler flags for building library objects. pic_flag=$lt_lt_prog_compiler_pic_CXX pic_mode=$pic_mode # What is the maximum length of a command? max_cmd_len=$lt_cv_sys_max_cmd_len # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX # Must we lock files when doing compilation? need_locks=$lt_need_locks # Do we need the lib prefix for modules? need_lib_prefix=$need_lib_prefix # Do we need a version for libraries? need_version=$need_version # Whether dlopen is supported. dlopen_support=$enable_dlopen # Whether dlopen of programs is supported. dlopen_self=$enable_dlopen_self # Whether dlopen of statically linked programs is supported. dlopen_self_static=$enable_dlopen_self_static # Compiler flag to prevent dynamic linking. link_static_flag=$lt_lt_prog_compiler_static_CXX # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_CXX # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_CXX # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec=$lt_whole_archive_flag_spec_CXX # Compiler flag to generate thread-safe objects. thread_safe_flag_spec=$lt_thread_safe_flag_spec_CXX # Library versioning type. version_type=$version_type # Format of library name prefix. libname_spec=$lt_libname_spec # List of archive names. First name is the real one, the rest are links. # The last name is the one that the linker finds with -lNAME. library_names_spec=$lt_library_names_spec # The coded name of the library, if different from the real name. soname_spec=$lt_soname_spec # Commands used to build and install an old-style archive. RANLIB=$lt_RANLIB old_archive_cmds=$lt_old_archive_cmds_CXX old_postinstall_cmds=$lt_old_postinstall_cmds old_postuninstall_cmds=$lt_old_postuninstall_cmds # Create an old-style archive from a shared archive. old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_CXX # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_CXX # Commands used to build and install a shared archive. archive_cmds=$lt_archive_cmds_CXX archive_expsym_cmds=$lt_archive_expsym_cmds_CXX postinstall_cmds=$lt_postinstall_cmds postuninstall_cmds=$lt_postuninstall_cmds # Commands used to build a loadable module (assumed same as above if empty) module_cmds=$lt_module_cmds_CXX module_expsym_cmds=$lt_module_expsym_cmds_CXX # Commands to strip libraries. old_striplib=$lt_old_striplib striplib=$lt_striplib # Dependencies to place before the objects being linked to create a # shared library. predep_objects=$lt_predep_objects_CXX # Dependencies to place after the objects being linked to create a # shared library. postdep_objects=$lt_postdep_objects_CXX # Dependencies to place before the objects being linked to create a # shared library. predeps=$lt_predeps_CXX # Dependencies to place after the objects being linked to create a # shared library. postdeps=$lt_postdeps_CXX # The directories searched by this compiler when creating a shared # library compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_CXX # The library search path used internally by the compiler when linking # a shared library. compiler_lib_search_path=$lt_compiler_lib_search_path_CXX # Method to check whether dependent libraries are shared objects. deplibs_check_method=$lt_deplibs_check_method # Command to use when deplibs_check_method == file_magic. file_magic_cmd=$lt_file_magic_cmd # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_allow_undefined_flag_CXX # Flag that forces no undefined symbols. no_undefined_flag=$lt_no_undefined_flag_CXX # Commands used to finish a libtool library installation in a directory. finish_cmds=$lt_finish_cmds # Same as above, but a single script fragment to be evaled but not shown. finish_eval=$lt_finish_eval # Take the output of nm and produce a listing of raw symbols and C names. global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe # Transform the output of nm in a proper C declaration global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl # Transform the output of nm in a C name address pair global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address # This is the shared library runtime path variable. runpath_var=$runpath_var # This is the shared library path variable. shlibpath_var=$shlibpath_var # Is shlibpath searched before the hard-coded library search path? shlibpath_overrides_runpath=$shlibpath_overrides_runpath # How to hardcode a shared library path into an executable. hardcode_action=$hardcode_action_CXX # Whether we should hardcode library paths into libraries. hardcode_into_libs=$hardcode_into_libs # Flag to hardcode \$libdir into a binary during linking. # This must work even if \$libdir does not exist. hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_CXX # If ld is used when linking, flag to hardcode \$libdir into # a binary during linking. This must work even if \$libdir does # not exist. hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_CXX # Whether we need a single -rpath flag with a separated argument. hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX # Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the # resulting binary. hardcode_direct=$hardcode_direct_CXX # Set to yes if using the -LDIR flag during linking hardcodes DIR into the # resulting binary. hardcode_minus_L=$hardcode_minus_L_CXX # Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into # the resulting binary. hardcode_shlibpath_var=$hardcode_shlibpath_var_CXX # Set to yes if building a shared library automatically hardcodes DIR into the library # and all subsequent libraries and executables linked against it. hardcode_automatic=$hardcode_automatic_CXX # Variables whose values should be saved in libtool wrapper scripts and # restored at relink time. variables_saved_for_relink="$variables_saved_for_relink" # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$link_all_deplibs_CXX # Compile-time system search path for libraries sys_lib_search_path_spec=$lt_sys_lib_search_path_spec # Run-time system search path for libraries sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec # Fix the shell variable \$srcfile for the compiler. fix_srcfile_path=$lt_fix_srcfile_path # Set to yes if exported symbols are required. always_export_symbols=$always_export_symbols_CXX # The commands to list exported symbols. export_symbols_cmds=$lt_export_symbols_cmds_CXX # The commands to extract the exported symbol list from a shared archive. extract_expsyms_cmds=$lt_extract_expsyms_cmds # Symbols that should not be listed in the preloaded symbols. exclude_expsyms=$lt_exclude_expsyms_CXX # Symbols that must always be exported. include_expsyms=$lt_include_expsyms_CXX # ### END LIBTOOL TAG CONFIG: $tagname __EOF__ else # If there is no Makefile yet, we rely on a make rule to execute # `config.status --recheck' to rerun these tests and create the # libtool script then. ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` if test -f "$ltmain_in"; then test -f Makefile && make "$ltmain" fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu CC=$lt_save_CC LDCXX=$LD LD=$lt_save_LD GCC=$lt_save_GCC with_gnu_ldcxx=$with_gnu_ld with_gnu_ld=$lt_save_with_gnu_ld lt_cv_path_LDCXX=$lt_cv_path_LD lt_cv_path_LD=$lt_save_path_LD lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld else tagname="" fi ;; F77) if test -n "$F77" && test "X$F77" != "Xno"; then ac_ext=f ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5' ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_f77_compiler_gnu archive_cmds_need_lc_F77=no allow_undefined_flag_F77= always_export_symbols_F77=no archive_expsym_cmds_F77= export_dynamic_flag_spec_F77= hardcode_direct_F77=no hardcode_libdir_flag_spec_F77= hardcode_libdir_flag_spec_ld_F77= hardcode_libdir_separator_F77= hardcode_minus_L_F77=no hardcode_automatic_F77=no module_cmds_F77= module_expsym_cmds_F77= link_all_deplibs_F77=unknown old_archive_cmds_F77=$old_archive_cmds no_undefined_flag_F77= whole_archive_flag_spec_F77= enable_shared_with_static_runtimes_F77=no # Source file extension for f77 test sources. ac_ext=f # Object file extension for compiled f77 test sources. objext=o objext_F77=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="\ subroutine t return end " # Code to be used in simple link tests lt_simple_link_test_code="\ program t end " # ltmain only uses $CC for tagged configurations so make sure $CC is set. # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # save warnings/boilerplate of simple test code ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $rm conftest* ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $rm -r conftest* # Allow CC to be a program name with arguments. lt_save_CC="$CC" CC=${F77-"f77"} compiler=$CC compiler_F77=$CC for cc_temp in $compiler""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` echo "$as_me:$LINENO: checking if libtool supports shared libraries" >&5 echo $ECHO_N "checking if libtool supports shared libraries... $ECHO_C" >&6 echo "$as_me:$LINENO: result: $can_build_shared" >&5 echo "${ECHO_T}$can_build_shared" >&6 echo "$as_me:$LINENO: checking whether to build shared libraries" >&5 echo $ECHO_N "checking whether to build shared libraries... $ECHO_C" >&6 test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[4-9]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac echo "$as_me:$LINENO: result: $enable_shared" >&5 echo "${ECHO_T}$enable_shared" >&6 echo "$as_me:$LINENO: checking whether to build static libraries" >&5 echo $ECHO_N "checking whether to build static libraries... $ECHO_C" >&6 # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes echo "$as_me:$LINENO: result: $enable_static" >&5 echo "${ECHO_T}$enable_static" >&6 GCC_F77="$G77" LD_F77="$LD" lt_prog_compiler_wl_F77= lt_prog_compiler_pic_F77= lt_prog_compiler_static_F77= echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5 echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6 if test "$GCC" = yes; then lt_prog_compiler_wl_F77='-Wl,' lt_prog_compiler_static_F77='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static_F77='-Bstatic' fi ;; amigaos*) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. lt_prog_compiler_pic_F77='-m68020 -resident32 -malways-restore-a4' ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | pw32* | os2*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries lt_prog_compiler_pic_F77='-DDLL_EXPORT' ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic_F77='-fno-common' ;; interix[3-9]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. lt_prog_compiler_can_build_shared_F77=no enable_shared=no ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic_F77=-Kconform_pic fi ;; hpux*) # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic_F77='-fPIC' ;; esac ;; *) lt_prog_compiler_pic_F77='-fPIC' ;; esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in aix*) lt_prog_compiler_wl_F77='-Wl,' if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static_F77='-Bstatic' else lt_prog_compiler_static_F77='-bnso -bI:/lib/syscalls.exp' fi ;; darwin*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files case $cc_basename in xlc*) lt_prog_compiler_pic_F77='-qnocommon' lt_prog_compiler_wl_F77='-Wl,' ;; esac ;; mingw* | cygwin* | pw32* | os2*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). lt_prog_compiler_pic_F77='-DDLL_EXPORT' ;; hpux9* | hpux10* | hpux11*) lt_prog_compiler_wl_F77='-Wl,' # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic_F77='+Z' ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? lt_prog_compiler_static_F77='${wl}-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) lt_prog_compiler_wl_F77='-Wl,' # PIC (with -KPIC) is the default. lt_prog_compiler_static_F77='-non_shared' ;; newsos6) lt_prog_compiler_pic_F77='-KPIC' lt_prog_compiler_static_F77='-Bstatic' ;; linux* | k*bsd*-gnu) case $cc_basename in icc* | ecc*) lt_prog_compiler_wl_F77='-Wl,' lt_prog_compiler_pic_F77='-KPIC' lt_prog_compiler_static_F77='-static' ;; pgcc* | pgf77* | pgf90* | pgf95*) # Portland Group compilers (*not* the Pentium gcc compiler, # which looks to be a dead project) lt_prog_compiler_wl_F77='-Wl,' lt_prog_compiler_pic_F77='-fpic' lt_prog_compiler_static_F77='-Bstatic' ;; ccc*) lt_prog_compiler_wl_F77='-Wl,' # All Alpha code is PIC. lt_prog_compiler_static_F77='-non_shared' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C 5.9 lt_prog_compiler_pic_F77='-KPIC' lt_prog_compiler_static_F77='-Bstatic' lt_prog_compiler_wl_F77='-Wl,' ;; *Sun\ F*) # Sun Fortran 8.3 passes all unrecognized flags to the linker lt_prog_compiler_pic_F77='-KPIC' lt_prog_compiler_static_F77='-Bstatic' lt_prog_compiler_wl_F77='' ;; esac ;; esac ;; osf3* | osf4* | osf5*) lt_prog_compiler_wl_F77='-Wl,' # All OSF/1 code is PIC. lt_prog_compiler_static_F77='-non_shared' ;; rdos*) lt_prog_compiler_static_F77='-non_shared' ;; solaris*) lt_prog_compiler_pic_F77='-KPIC' lt_prog_compiler_static_F77='-Bstatic' case $cc_basename in f77* | f90* | f95*) lt_prog_compiler_wl_F77='-Qoption ld ';; *) lt_prog_compiler_wl_F77='-Wl,';; esac ;; sunos4*) lt_prog_compiler_wl_F77='-Qoption ld ' lt_prog_compiler_pic_F77='-PIC' lt_prog_compiler_static_F77='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3*) lt_prog_compiler_wl_F77='-Wl,' lt_prog_compiler_pic_F77='-KPIC' lt_prog_compiler_static_F77='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec ;then lt_prog_compiler_pic_F77='-Kconform_pic' lt_prog_compiler_static_F77='-Bstatic' fi ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) lt_prog_compiler_wl_F77='-Wl,' lt_prog_compiler_pic_F77='-KPIC' lt_prog_compiler_static_F77='-Bstatic' ;; unicos*) lt_prog_compiler_wl_F77='-Wl,' lt_prog_compiler_can_build_shared_F77=no ;; uts4*) lt_prog_compiler_pic_F77='-pic' lt_prog_compiler_static_F77='-Bstatic' ;; *) lt_prog_compiler_can_build_shared_F77=no ;; esac fi echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_F77" >&5 echo "${ECHO_T}$lt_prog_compiler_pic_F77" >&6 # # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic_F77"; then echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic_F77 works" >&5 echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic_F77 works... $ECHO_C" >&6 if test "${lt_cv_prog_compiler_pic_works_F77+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lt_cv_prog_compiler_pic_works_F77=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$lt_prog_compiler_pic_F77" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:13858: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:13862: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_pic_works_F77=yes fi fi $rm conftest* fi echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_pic_works_F77" >&5 echo "${ECHO_T}$lt_cv_prog_compiler_pic_works_F77" >&6 if test x"$lt_cv_prog_compiler_pic_works_F77" = xyes; then case $lt_prog_compiler_pic_F77 in "" | " "*) ;; *) lt_prog_compiler_pic_F77=" $lt_prog_compiler_pic_F77" ;; esac else lt_prog_compiler_pic_F77= lt_prog_compiler_can_build_shared_F77=no fi fi case $host_os in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) lt_prog_compiler_pic_F77= ;; *) lt_prog_compiler_pic_F77="$lt_prog_compiler_pic_F77" ;; esac # # Check to make sure the static flag actually works. # wl=$lt_prog_compiler_wl_F77 eval lt_tmp_static_flag=\"$lt_prog_compiler_static_F77\" echo "$as_me:$LINENO: checking if $compiler static flag $lt_tmp_static_flag works" >&5 echo $ECHO_N "checking if $compiler static flag $lt_tmp_static_flag works... $ECHO_C" >&6 if test "${lt_cv_prog_compiler_static_works_F77+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lt_cv_prog_compiler_static_works_F77=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $lt_tmp_static_flag" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $echo "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_static_works_F77=yes fi else lt_cv_prog_compiler_static_works_F77=yes fi fi $rm -r conftest* LDFLAGS="$save_LDFLAGS" fi echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_static_works_F77" >&5 echo "${ECHO_T}$lt_cv_prog_compiler_static_works_F77" >&6 if test x"$lt_cv_prog_compiler_static_works_F77" = xyes; then : else lt_prog_compiler_static_F77= fi echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5 echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6 if test "${lt_cv_prog_compiler_c_o_F77+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lt_cv_prog_compiler_c_o_F77=no $rm -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:13962: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:13966: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o_F77=yes fi fi chmod u+w . 2>&5 $rm conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files $rm out/* && rmdir out cd .. rmdir conftest $rm conftest* fi echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o_F77" >&5 echo "${ECHO_T}$lt_cv_prog_compiler_c_o_F77" >&6 hard_links="nottested" if test "$lt_cv_prog_compiler_c_o_F77" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user echo "$as_me:$LINENO: checking if we can lock with hard links" >&5 echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&6 hard_links=yes $rm conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no echo "$as_me:$LINENO: result: $hard_links" >&5 echo "${ECHO_T}$hard_links" >&6 if test "$hard_links" = no; then { echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} need_locks=warn fi else need_locks=no fi echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6 runpath_var= allow_undefined_flag_F77= enable_shared_with_static_runtimes_F77=no archive_cmds_F77= archive_expsym_cmds_F77= old_archive_From_new_cmds_F77= old_archive_from_expsyms_cmds_F77= export_dynamic_flag_spec_F77= whole_archive_flag_spec_F77= thread_safe_flag_spec_F77= hardcode_libdir_flag_spec_F77= hardcode_libdir_flag_spec_ld_F77= hardcode_libdir_separator_F77= hardcode_direct_F77=no hardcode_minus_L_F77=no hardcode_shlibpath_var_F77=unsupported link_all_deplibs_F77=unknown hardcode_automatic_F77=no module_cmds_F77= module_expsym_cmds_F77= always_export_symbols_F77=no export_symbols_cmds_F77='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' # include_expsyms should be a list of space-separated symbols to be *always* # included in the symbol list include_expsyms_F77= # exclude_expsyms can be an extended regexp of symbols to exclude # it will be wrapped by ` (' and `)$', so one must not match beginning or # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', # as well as any symbol that contains `d'. exclude_expsyms_F77='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out # platforms (ab)use it in PIC code, but their linkers get confused if # the symbol is explicitly referenced. Since portable code cannot # rely on this symbol name, it's probably fine to never include it in # preloaded symbol tables. # Exclude shared library initialization/finalization symbols. extract_expsyms_cmds= # Just being paranoid about ensuring that cc_basename is set. for cc_temp in $compiler""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` case $host_os in cygwin* | mingw* | pw32*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test "$GCC" != yes; then with_gnu_ld=no fi ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++) with_gnu_ld=yes ;; openbsd*) with_gnu_ld=no ;; esac ld_shlibs_F77=yes if test "$with_gnu_ld" = yes; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='${wl}' # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. runpath_var=LD_RUN_PATH hardcode_libdir_flag_spec_F77='${wl}--rpath ${wl}$libdir' export_dynamic_flag_spec_F77='${wl}--export-dynamic' # ancient GNU ld didn't support --whole-archive et. al. if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then whole_archive_flag_spec_F77="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else whole_archive_flag_spec_F77= fi supports_anon_versioning=no case `$LD -v 2>/dev/null` in *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... *\ 2.11.*) ;; # other 2.11 versions *) supports_anon_versioning=yes ;; esac # See if GNU ld supports shared libraries. case $host_os in aix[3-9]*) # On AIX/PPC, the GNU linker is very broken if test "$host_cpu" != ia64; then ld_shlibs_F77=no cat <&2 *** Warning: the GNU linker, at least up to release 2.9.1, is reported *** to be unable to reliably create shared libraries on AIX. *** Therefore, libtool is disabling shared libraries support. If you *** really care for shared libraries, you may want to modify your PATH *** so that a non-GNU linker is found, and then restart. EOF fi ;; amigaos*) archive_cmds_F77='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec_F77='-L$libdir' hardcode_minus_L_F77=yes # Samuel A. Falvo II reports # that the semantics of dynamic libraries on AmigaOS, at least up # to version 4, is to share data among multiple programs linked # with the same dynamic library. Since this doesn't match the # behavior of shared libraries on other platforms, we can't use # them. ld_shlibs_F77=no ;; beos*) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then allow_undefined_flag_F77=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME archive_cmds_F77='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else ld_shlibs_F77=no fi ;; cygwin* | mingw* | pw32*) # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, F77) is actually meaningless, # as there is no search path for DLLs. hardcode_libdir_flag_spec_F77='-L$libdir' allow_undefined_flag_F77=unsupported always_export_symbols_F77=no enable_shared_with_static_runtimes_F77=yes export_symbols_cmds_F77='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/'\'' -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... archive_expsym_cmds_F77='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else ld_shlibs_F77=no fi ;; interix[3-9]*) hardcode_direct_F77=no hardcode_shlibpath_var_F77=no hardcode_libdir_flag_spec_F77='${wl}-rpath,$libdir' export_dynamic_flag_spec_F77='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. archive_cmds_F77='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' archive_expsym_cmds_F77='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; gnu* | linux* | k*bsd*-gnu) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then tmp_addflag= case $cc_basename,$host_cpu in pgcc*) # Portland Group C compiler whole_archive_flag_spec_F77='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag' ;; pgf77* | pgf90* | pgf95*) # Portland Group f77 and f90 compilers whole_archive_flag_spec_F77='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag -Mnomain' ;; ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 tmp_addflag=' -i_dynamic' ;; efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 tmp_addflag=' -i_dynamic -nofor_main' ;; ifc* | ifort*) # Intel Fortran compiler tmp_addflag=' -nofor_main' ;; esac case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C 5.9 whole_archive_flag_spec_F77='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' tmp_sharedflag='-G' ;; *Sun\ F*) # Sun Fortran 8.3 tmp_sharedflag='-G' ;; *) tmp_sharedflag='-shared' ;; esac archive_cmds_F77='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test $supports_anon_versioning = yes; then archive_expsym_cmds_F77='$echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ $echo "local: *; };" >> $output_objdir/$libname.ver~ $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi else ld_shlibs_F77=no fi ;; netbsd*) if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then archive_cmds_F77='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' fi ;; solaris*) if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then ld_shlibs_F77=no cat <&2 *** Warning: The releases 2.8.* of the GNU linker cannot reliably *** create shared libraries on Solaris systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.9.1 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. EOF elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs_F77=no fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) case `$LD -v 2>&1` in *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) ld_shlibs_F77=no cat <<_LT_EOF 1>&2 *** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not *** reliably create shared libraries on SCO systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.16.91.0.3 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF ;; *) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then hardcode_libdir_flag_spec_F77='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`' archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib' archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname,-retain-symbols-file,$export_symbols -o $lib' else ld_shlibs_F77=no fi ;; esac ;; sunos4*) archive_cmds_F77='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= hardcode_direct_F77=yes hardcode_shlibpath_var_F77=no ;; *) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs_F77=no fi ;; esac if test "$ld_shlibs_F77" = no; then runpath_var= hardcode_libdir_flag_spec_F77= export_dynamic_flag_spec_F77= whole_archive_flag_spec_F77= fi else # PORTME fill in a description of your system's linker (not GNU ld) case $host_os in aix3*) allow_undefined_flag_F77=unsupported always_export_symbols_F77=yes archive_expsym_cmds_F77='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. hardcode_minus_L_F77=yes if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. hardcode_direct_F77=unsupported fi ;; aix[4-9]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm if $NM -V 2>&1 | grep 'GNU' > /dev/null; then export_symbols_cmds_F77='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' else export_symbols_cmds_F77='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' fi aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) for ld_flag in $LDFLAGS; do if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then aix_use_runtimelinking=yes break fi done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. archive_cmds_F77='' hardcode_direct_F77=yes hardcode_libdir_separator_F77=':' link_all_deplibs_F77=yes if test "$GCC" = yes; then case $host_os in aix4.[012]|aix4.[012].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && \ strings "$collect2name" | grep resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 hardcode_direct_F77=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking hardcode_minus_L_F77=yes hardcode_libdir_flag_spec_F77='-L$libdir' hardcode_libdir_separator_F77= fi ;; esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. always_export_symbols_F77=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. allow_undefined_flag_F77='-berok' # Determine the default libpath from the value encoded in an empty executable. cat >conftest.$ac_ext <<_ACEOF program main end _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_f77_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/ p } }' aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi hardcode_libdir_flag_spec_F77='${wl}-blibpath:$libdir:'"$aix_libpath" archive_expsym_cmds_F77="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then hardcode_libdir_flag_spec_F77='${wl}-R $libdir:/usr/lib:/lib' allow_undefined_flag_F77="-z nodefs" archive_expsym_cmds_F77="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an empty executable. cat >conftest.$ac_ext <<_ACEOF program main end _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_f77_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/ p } }' aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi hardcode_libdir_flag_spec_F77='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. no_undefined_flag_F77=' ${wl}-bernotok' allow_undefined_flag_F77=' ${wl}-berok' # Exported symbols can be pulled into shared objects from archives whole_archive_flag_spec_F77='$convenience' archive_cmds_need_lc_F77=yes # This is similar to how AIX traditionally builds its shared libraries. archive_expsym_cmds_F77="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; amigaos*) archive_cmds_F77='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec_F77='-L$libdir' hardcode_minus_L_F77=yes # see comment about different semantics on the GNU ld section ld_shlibs_F77=no ;; bsdi[45]*) export_dynamic_flag_spec_F77=-rdynamic ;; cygwin* | mingw* | pw32*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. hardcode_libdir_flag_spec_F77=' ' allow_undefined_flag_F77=unsupported # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. archive_cmds_F77='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames=' # The linker will automatically build a .lib file if we build a DLL. old_archive_From_new_cmds_F77='true' # FIXME: Should let the user specify the lib program. old_archive_cmds_F77='lib -OUT:$oldlib$oldobjs$old_deplibs' fix_srcfile_path_F77='`cygpath -w "$srcfile"`' enable_shared_with_static_runtimes_F77=yes ;; darwin* | rhapsody*) case $host_os in rhapsody* | darwin1.[012]) allow_undefined_flag_F77='${wl}-undefined ${wl}suppress' ;; *) # Darwin 1.3 on if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then allow_undefined_flag_F77='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' else case ${MACOSX_DEPLOYMENT_TARGET} in 10.[012]) allow_undefined_flag_F77='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; 10.*) allow_undefined_flag_F77='${wl}-undefined ${wl}dynamic_lookup' ;; esac fi ;; esac archive_cmds_need_lc_F77=no hardcode_direct_F77=no hardcode_automatic_F77=yes hardcode_shlibpath_var_F77=unsupported whole_archive_flag_spec_F77='' link_all_deplibs_F77=yes if test "$GCC" = yes ; then output_verbose_link_cmd='echo' archive_cmds_F77="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" module_cmds_F77="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" archive_expsym_cmds_F77="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" module_expsym_cmds_F77="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" else case $cc_basename in xlc*) output_verbose_link_cmd='echo' archive_cmds_F77='$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $xlcverstring' module_cmds_F77='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds archive_expsym_cmds_F77='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $xlcverstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' module_expsym_cmds_F77='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' ;; *) ld_shlibs_F77=no ;; esac fi ;; dgux*) archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec_F77='-L$libdir' hardcode_shlibpath_var_F77=no ;; freebsd1*) ld_shlibs_F77=no ;; # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor # support. Future versions do this automatically, but an explicit c++rt0.o # does not break anything, and helps significantly (at the cost of a little # extra space). freebsd2.2*) archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' hardcode_libdir_flag_spec_F77='-R$libdir' hardcode_direct_F77=yes hardcode_shlibpath_var_F77=no ;; # Unfortunately, older versions of FreeBSD 2 do not have this feature. freebsd2*) archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_direct_F77=yes hardcode_minus_L_F77=yes hardcode_shlibpath_var_F77=no ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. freebsd* | dragonfly*) archive_cmds_F77='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec_F77='-R$libdir' hardcode_direct_F77=yes hardcode_shlibpath_var_F77=no ;; hpux9*) if test "$GCC" = yes; then archive_cmds_F77='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else archive_cmds_F77='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' fi hardcode_libdir_flag_spec_F77='${wl}+b ${wl}$libdir' hardcode_libdir_separator_F77=: hardcode_direct_F77=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L_F77=yes export_dynamic_flag_spec_F77='${wl}-E' ;; hpux10*) if test "$GCC" = yes -a "$with_gnu_ld" = no; then archive_cmds_F77='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds_F77='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec_F77='${wl}+b ${wl}$libdir' hardcode_libdir_separator_F77=: hardcode_direct_F77=yes export_dynamic_flag_spec_F77='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L_F77=yes fi ;; hpux11*) if test "$GCC" = yes -a "$with_gnu_ld" = no; then case $host_cpu in hppa*64*) archive_cmds_F77='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) archive_cmds_F77='$CC -shared ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds_F77='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else case $host_cpu in hppa*64*) archive_cmds_F77='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) archive_cmds_F77='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds_F77='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac fi if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec_F77='${wl}+b ${wl}$libdir' hardcode_libdir_separator_F77=: case $host_cpu in hppa*64*|ia64*) hardcode_libdir_flag_spec_ld_F77='+b $libdir' hardcode_direct_F77=no hardcode_shlibpath_var_F77=no ;; *) hardcode_direct_F77=yes export_dynamic_flag_spec_F77='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L_F77=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) if test "$GCC" = yes; then archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else archive_cmds_F77='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' hardcode_libdir_flag_spec_ld_F77='-rpath $libdir' fi hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_F77=: link_all_deplibs_F77=yes ;; netbsd*) if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else archive_cmds_F77='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF fi hardcode_libdir_flag_spec_F77='-R$libdir' hardcode_direct_F77=yes hardcode_shlibpath_var_F77=no ;; newsos6) archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct_F77=yes hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_F77=: hardcode_shlibpath_var_F77=no ;; openbsd*) if test -f /usr/libexec/ld.so; then hardcode_direct_F77=yes hardcode_shlibpath_var_F77=no if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then archive_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' hardcode_libdir_flag_spec_F77='${wl}-rpath,$libdir' export_dynamic_flag_spec_F77='${wl}-E' else case $host_os in openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec_F77='-R$libdir' ;; *) archive_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec_F77='${wl}-rpath,$libdir' ;; esac fi else ld_shlibs_F77=no fi ;; os2*) hardcode_libdir_flag_spec_F77='-L$libdir' hardcode_minus_L_F77=yes allow_undefined_flag_F77=unsupported archive_cmds_F77='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' old_archive_From_new_cmds_F77='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' ;; osf3*) if test "$GCC" = yes; then allow_undefined_flag_F77=' ${wl}-expect_unresolved ${wl}\*' archive_cmds_F77='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else allow_undefined_flag_F77=' -expect_unresolved \*' archive_cmds_F77='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' fi hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_F77=: ;; osf4* | osf5*) # as osf3* with the addition of -msym flag if test "$GCC" = yes; then allow_undefined_flag_F77=' ${wl}-expect_unresolved ${wl}\*' archive_cmds_F77='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir' else allow_undefined_flag_F77=' -expect_unresolved \*' archive_cmds_F77='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' archive_expsym_cmds_F77='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~ $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib~$rm $lib.exp' # Both c and cxx compiler support -rpath directly hardcode_libdir_flag_spec_F77='-rpath $libdir' fi hardcode_libdir_separator_F77=: ;; solaris*) no_undefined_flag_F77=' -z text' if test "$GCC" = yes; then wlarc='${wl}' archive_cmds_F77='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_F77='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp' else wlarc='' archive_cmds_F77='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' archive_expsym_cmds_F77='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' fi hardcode_libdir_flag_spec_F77='-R$libdir' hardcode_shlibpath_var_F77=no case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. GCC discards it without `$wl', # but is careful enough not to reorder. # Supported since Solaris 2.6 (maybe 2.5.1?) if test "$GCC" = yes; then whole_archive_flag_spec_F77='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' else whole_archive_flag_spec_F77='-z allextract$convenience -z defaultextract' fi ;; esac link_all_deplibs_F77=yes ;; sunos4*) if test "x$host_vendor" = xsequent; then # Use $CC to link under sequent, because it throws in some extra .o # files that make .init and .fini sections work. archive_cmds_F77='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds_F77='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' fi hardcode_libdir_flag_spec_F77='-L$libdir' hardcode_direct_F77=yes hardcode_minus_L_F77=yes hardcode_shlibpath_var_F77=no ;; sysv4) case $host_vendor in sni) archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct_F77=yes # is this really true??? ;; siemens) ## LD is ld it makes a PLAMLIB ## CC just makes a GrossModule. archive_cmds_F77='$LD -G -o $lib $libobjs $deplibs $linker_flags' reload_cmds_F77='$CC -r -o $output$reload_objs' hardcode_direct_F77=no ;; motorola) archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct_F77=no #Motorola manual says yes, but my tests say they lie ;; esac runpath_var='LD_RUN_PATH' hardcode_shlibpath_var_F77=no ;; sysv4.3*) archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var_F77=no export_dynamic_flag_spec_F77='-Bexport' ;; sysv4*MP*) if test -d /usr/nec; then archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var_F77=no runpath_var=LD_RUN_PATH hardcode_runpath_var=yes ld_shlibs_F77=yes fi ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) no_undefined_flag_F77='${wl}-z,text' archive_cmds_need_lc_F77=no hardcode_shlibpath_var_F77=no runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then archive_cmds_F77='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_F77='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds_F77='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_F77='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. no_undefined_flag_F77='${wl}-z,text' allow_undefined_flag_F77='${wl}-z,nodefs' archive_cmds_need_lc_F77=no hardcode_shlibpath_var_F77=no hardcode_libdir_flag_spec_F77='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`' hardcode_libdir_separator_F77=':' link_all_deplibs_F77=yes export_dynamic_flag_spec_F77='${wl}-Bexport' runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then archive_cmds_F77='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_F77='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds_F77='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_F77='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; uts4*) archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec_F77='-L$libdir' hardcode_shlibpath_var_F77=no ;; *) ld_shlibs_F77=no ;; esac fi echo "$as_me:$LINENO: result: $ld_shlibs_F77" >&5 echo "${ECHO_T}$ld_shlibs_F77" >&6 test "$ld_shlibs_F77" = no && can_build_shared=no # # Do we need to explicitly link libc? # case "x$archive_cmds_need_lc_F77" in x|xyes) # Assume -lc should be added archive_cmds_need_lc_F77=yes if test "$enable_shared" = yes && test "$GCC" = yes; then case $archive_cmds_F77 in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5 echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6 $rm conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$lt_prog_compiler_wl_F77 pic_flag=$lt_prog_compiler_pic_F77 compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$allow_undefined_flag_F77 allow_undefined_flag_F77= if { (eval echo "$as_me:$LINENO: \"$archive_cmds_F77 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\"") >&5 (eval $archive_cmds_F77 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } then archive_cmds_need_lc_F77=no else archive_cmds_need_lc_F77=yes fi allow_undefined_flag_F77=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $rm conftest* echo "$as_me:$LINENO: result: $archive_cmds_need_lc_F77" >&5 echo "${ECHO_T}$archive_cmds_need_lc_F77" >&6 ;; esac fi ;; esac echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5 echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&6 library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=".so" postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='${libname}${release}${shared_ext}$major' ;; aix[4-9]*) version_type=linux need_lib_prefix=no need_version=no hardcode_into_libs=yes if test "$host_cpu" = ia64; then # AIX 5 supports IA64 library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line `#! .'. This would cause the generated library to # depend on `.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[01] | aix4.[01].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then : else can_build_shared=no fi ;; esac # AIX (on Power*) has no versioning support, so currently we can not hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' else # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='${libname}${release}.a $libname.a' soname_spec='${libname}${release}${shared_ext}$major' fi shlibpath_var=LIBPATH fi ;; amigaos*) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; beos*) library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[45]*) version_type=linux need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no case $GCC,$host_os in yes,cygwin* | yes,mingw* | yes,pw32*) library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $rm \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" ;; mingw*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then # It is most probably a Windows format PATH printed by # mingw gcc, but we are running on Cygwin. Gcc prints its search # path with ; separators, and with drive letters. We can handle the # drive letters (cygwin fileutils understands them), so leave them, # especially as we might pass files found there to a mingw objdump, # which wouldn't understand a cygwinified path. Ahh. sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; esac ;; *) library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' ;; esac dynamic_linker='Win32 ld.exe' # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext' soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd1*) dynamic_linker=no ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[123]*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2*) shlibpath_overrides_runpath=yes ;; freebsd3.[01]* | freebsdelf3.[01]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; gnu*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' if test "X$HPUX_IA64_MODE" = X32; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555. postinstall_cmds='chmod 555 $lib' ;; interix[3-9]*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then version_type=linux else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; # This must be Linux ELF. linux* | k*bsd*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; nto-qnx*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; openbsd*) version_type=sunos sys_lib_dlsearch_path_spec="/usr/lib" need_lib_prefix=no # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. case $host_os in openbsd3.3 | openbsd3.3.*) need_version=yes ;; *) need_version=no ;; esac library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[89] | openbsd2.[89].*) shlibpath_overrides_runpath=no ;; *) shlibpath_overrides_runpath=yes ;; esac else shlibpath_overrides_runpath=yes fi ;; os2*) libname_spec='$name' shrext_cmds=".dll" need_lib_prefix=no library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test "$with_gnu_ld" = yes; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no export_dynamic_flag_spec='${wl}-Blargedynsym' runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec ;then version_type=linux library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=freebsd-elf need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH hardcode_into_libs=yes if test "$with_gnu_ld" = yes; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' shlibpath_overrides_runpath=no else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' shlibpath_overrides_runpath=yes case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; uts4*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac echo "$as_me:$LINENO: result: $dynamic_linker" >&5 echo "${ECHO_T}$dynamic_linker" >&6 test "$dynamic_linker" = no && can_build_shared=no if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lt_cv_sys_lib_search_path_spec="$sys_lib_search_path_spec" fi sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lt_cv_sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec" fi sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5 echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6 hardcode_action_F77= if test -n "$hardcode_libdir_flag_spec_F77" || \ test -n "$runpath_var_F77" || \ test "X$hardcode_automatic_F77" = "Xyes" ; then # We can hardcode non-existant directories. if test "$hardcode_direct_F77" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, F77)" != no && test "$hardcode_minus_L_F77" != no; then # Linking always hardcodes the temporary library directory. hardcode_action_F77=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. hardcode_action_F77=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. hardcode_action_F77=unsupported fi echo "$as_me:$LINENO: result: $hardcode_action_F77" >&5 echo "${ECHO_T}$hardcode_action_F77" >&6 if test "$hardcode_action_F77" = relink; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || test "$enable_shared" = no; then # Fast installation is not necessary enable_fast_install=needless fi # The else clause should only fire when bootstrapping the # libtool distribution, otherwise you forgot to ship ltmain.sh # with your package, and you will get complaints that there are # no rules to generate ltmain.sh. if test -f "$ltmain"; then # See if we are running on zsh, and set the options which allow our commands through # without removal of \ escapes. if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi # Now quote all the things that may contain metacharacters while being # careful not to overquote the AC_SUBSTed values. We take copies of the # variables and quote the copies for generation of the libtool script. for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \ SED SHELL STRIP \ libname_spec library_names_spec soname_spec extract_expsyms_cmds \ old_striplib striplib file_magic_cmd finish_cmds finish_eval \ deplibs_check_method reload_flag reload_cmds need_locks \ lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \ lt_cv_sys_global_symbol_to_c_name_address \ sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ old_postinstall_cmds old_postuninstall_cmds \ compiler_F77 \ CC_F77 \ LD_F77 \ lt_prog_compiler_wl_F77 \ lt_prog_compiler_pic_F77 \ lt_prog_compiler_static_F77 \ lt_prog_compiler_no_builtin_flag_F77 \ export_dynamic_flag_spec_F77 \ thread_safe_flag_spec_F77 \ whole_archive_flag_spec_F77 \ enable_shared_with_static_runtimes_F77 \ old_archive_cmds_F77 \ old_archive_from_new_cmds_F77 \ predep_objects_F77 \ postdep_objects_F77 \ predeps_F77 \ postdeps_F77 \ compiler_lib_search_path_F77 \ compiler_lib_search_dirs_F77 \ archive_cmds_F77 \ archive_expsym_cmds_F77 \ postinstall_cmds_F77 \ postuninstall_cmds_F77 \ old_archive_from_expsyms_cmds_F77 \ allow_undefined_flag_F77 \ no_undefined_flag_F77 \ export_symbols_cmds_F77 \ hardcode_libdir_flag_spec_F77 \ hardcode_libdir_flag_spec_ld_F77 \ hardcode_libdir_separator_F77 \ hardcode_automatic_F77 \ module_cmds_F77 \ module_expsym_cmds_F77 \ lt_cv_prog_compiler_c_o_F77 \ fix_srcfile_path_F77 \ exclude_expsyms_F77 \ include_expsyms_F77; do case $var in old_archive_cmds_F77 | \ old_archive_from_new_cmds_F77 | \ archive_cmds_F77 | \ archive_expsym_cmds_F77 | \ module_cmds_F77 | \ module_expsym_cmds_F77 | \ old_archive_from_expsyms_cmds_F77 | \ export_symbols_cmds_F77 | \ extract_expsyms_cmds | reload_cmds | finish_cmds | \ postinstall_cmds | postuninstall_cmds | \ old_postinstall_cmds | old_postuninstall_cmds | \ sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) # Double-quote double-evaled strings. eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" ;; *) eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" ;; esac done case $lt_echo in *'\$0 --fallback-echo"') lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'` ;; esac cfgfile="$ofile" cat <<__EOF__ >> "$cfgfile" # ### BEGIN LIBTOOL TAG CONFIG: $tagname # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # Shell to use when invoking shell scripts. SHELL=$lt_SHELL # Whether or not to build shared libraries. build_libtool_libs=$enable_shared # Whether or not to build static libraries. build_old_libs=$enable_static # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$archive_cmds_need_lc_F77 # Whether or not to disallow shared libs when runtime libs are static allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_F77 # Whether or not to optimize for fast installation. fast_install=$enable_fast_install # The host system. host_alias=$host_alias host=$host host_os=$host_os # The build system. build_alias=$build_alias build=$build build_os=$build_os # An echo program that does not interpret backslashes. echo=$lt_echo # The archiver. AR=$lt_AR AR_FLAGS=$lt_AR_FLAGS # A C compiler. LTCC=$lt_LTCC # LTCC compiler flags. LTCFLAGS=$lt_LTCFLAGS # A language-specific compiler. CC=$lt_compiler_F77 # Is the compiler the GNU C compiler? with_gcc=$GCC_F77 # An ERE matcher. EGREP=$lt_EGREP # The linker used to build libraries. LD=$lt_LD_F77 # Whether we need hard or soft links. LN_S=$lt_LN_S # A BSD-compatible nm program. NM=$lt_NM # A symbol stripping program STRIP=$lt_STRIP # Used to examine libraries when file_magic_cmd begins "file" MAGIC_CMD=$MAGIC_CMD # Used on cygwin: DLL creation program. DLLTOOL="$DLLTOOL" # Used on cygwin: object dumper. OBJDUMP="$OBJDUMP" # Used on cygwin: assembler. AS="$AS" # The name of the directory that contains temporary libtool files. objdir=$objdir # How to create reloadable object files. reload_flag=$lt_reload_flag reload_cmds=$lt_reload_cmds # How to pass a linker flag through the compiler. wl=$lt_lt_prog_compiler_wl_F77 # Object file suffix (normally "o"). objext="$ac_objext" # Old archive suffix (normally "a"). libext="$libext" # Shared library suffix (normally ".so"). shrext_cmds='$shrext_cmds' # Executable file suffix (normally ""). exeext="$exeext" # Additional compiler flags for building library objects. pic_flag=$lt_lt_prog_compiler_pic_F77 pic_mode=$pic_mode # What is the maximum length of a command? max_cmd_len=$lt_cv_sys_max_cmd_len # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_lt_cv_prog_compiler_c_o_F77 # Must we lock files when doing compilation? need_locks=$lt_need_locks # Do we need the lib prefix for modules? need_lib_prefix=$need_lib_prefix # Do we need a version for libraries? need_version=$need_version # Whether dlopen is supported. dlopen_support=$enable_dlopen # Whether dlopen of programs is supported. dlopen_self=$enable_dlopen_self # Whether dlopen of statically linked programs is supported. dlopen_self_static=$enable_dlopen_self_static # Compiler flag to prevent dynamic linking. link_static_flag=$lt_lt_prog_compiler_static_F77 # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_F77 # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_F77 # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec=$lt_whole_archive_flag_spec_F77 # Compiler flag to generate thread-safe objects. thread_safe_flag_spec=$lt_thread_safe_flag_spec_F77 # Library versioning type. version_type=$version_type # Format of library name prefix. libname_spec=$lt_libname_spec # List of archive names. First name is the real one, the rest are links. # The last name is the one that the linker finds with -lNAME. library_names_spec=$lt_library_names_spec # The coded name of the library, if different from the real name. soname_spec=$lt_soname_spec # Commands used to build and install an old-style archive. RANLIB=$lt_RANLIB old_archive_cmds=$lt_old_archive_cmds_F77 old_postinstall_cmds=$lt_old_postinstall_cmds old_postuninstall_cmds=$lt_old_postuninstall_cmds # Create an old-style archive from a shared archive. old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_F77 # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_F77 # Commands used to build and install a shared archive. archive_cmds=$lt_archive_cmds_F77 archive_expsym_cmds=$lt_archive_expsym_cmds_F77 postinstall_cmds=$lt_postinstall_cmds postuninstall_cmds=$lt_postuninstall_cmds # Commands used to build a loadable module (assumed same as above if empty) module_cmds=$lt_module_cmds_F77 module_expsym_cmds=$lt_module_expsym_cmds_F77 # Commands to strip libraries. old_striplib=$lt_old_striplib striplib=$lt_striplib # Dependencies to place before the objects being linked to create a # shared library. predep_objects=$lt_predep_objects_F77 # Dependencies to place after the objects being linked to create a # shared library. postdep_objects=$lt_postdep_objects_F77 # Dependencies to place before the objects being linked to create a # shared library. predeps=$lt_predeps_F77 # Dependencies to place after the objects being linked to create a # shared library. postdeps=$lt_postdeps_F77 # The directories searched by this compiler when creating a shared # library compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_F77 # The library search path used internally by the compiler when linking # a shared library. compiler_lib_search_path=$lt_compiler_lib_search_path_F77 # Method to check whether dependent libraries are shared objects. deplibs_check_method=$lt_deplibs_check_method # Command to use when deplibs_check_method == file_magic. file_magic_cmd=$lt_file_magic_cmd # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_allow_undefined_flag_F77 # Flag that forces no undefined symbols. no_undefined_flag=$lt_no_undefined_flag_F77 # Commands used to finish a libtool library installation in a directory. finish_cmds=$lt_finish_cmds # Same as above, but a single script fragment to be evaled but not shown. finish_eval=$lt_finish_eval # Take the output of nm and produce a listing of raw symbols and C names. global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe # Transform the output of nm in a proper C declaration global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl # Transform the output of nm in a C name address pair global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address # This is the shared library runtime path variable. runpath_var=$runpath_var # This is the shared library path variable. shlibpath_var=$shlibpath_var # Is shlibpath searched before the hard-coded library search path? shlibpath_overrides_runpath=$shlibpath_overrides_runpath # How to hardcode a shared library path into an executable. hardcode_action=$hardcode_action_F77 # Whether we should hardcode library paths into libraries. hardcode_into_libs=$hardcode_into_libs # Flag to hardcode \$libdir into a binary during linking. # This must work even if \$libdir does not exist. hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_F77 # If ld is used when linking, flag to hardcode \$libdir into # a binary during linking. This must work even if \$libdir does # not exist. hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_F77 # Whether we need a single -rpath flag with a separated argument. hardcode_libdir_separator=$lt_hardcode_libdir_separator_F77 # Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the # resulting binary. hardcode_direct=$hardcode_direct_F77 # Set to yes if using the -LDIR flag during linking hardcodes DIR into the # resulting binary. hardcode_minus_L=$hardcode_minus_L_F77 # Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into # the resulting binary. hardcode_shlibpath_var=$hardcode_shlibpath_var_F77 # Set to yes if building a shared library automatically hardcodes DIR into the library # and all subsequent libraries and executables linked against it. hardcode_automatic=$hardcode_automatic_F77 # Variables whose values should be saved in libtool wrapper scripts and # restored at relink time. variables_saved_for_relink="$variables_saved_for_relink" # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$link_all_deplibs_F77 # Compile-time system search path for libraries sys_lib_search_path_spec=$lt_sys_lib_search_path_spec # Run-time system search path for libraries sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec # Fix the shell variable \$srcfile for the compiler. fix_srcfile_path=$lt_fix_srcfile_path # Set to yes if exported symbols are required. always_export_symbols=$always_export_symbols_F77 # The commands to list exported symbols. export_symbols_cmds=$lt_export_symbols_cmds_F77 # The commands to extract the exported symbol list from a shared archive. extract_expsyms_cmds=$lt_extract_expsyms_cmds # Symbols that should not be listed in the preloaded symbols. exclude_expsyms=$lt_exclude_expsyms_F77 # Symbols that must always be exported. include_expsyms=$lt_include_expsyms_F77 # ### END LIBTOOL TAG CONFIG: $tagname __EOF__ else # If there is no Makefile yet, we rely on a make rule to execute # `config.status --recheck' to rerun these tests and create the # libtool script then. ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` if test -f "$ltmain_in"; then test -f Makefile && make "$ltmain" fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu CC="$lt_save_CC" else tagname="" fi ;; GCJ) if test -n "$GCJ" && test "X$GCJ" != "Xno"; then # Source file extension for Java test sources. ac_ext=java # Object file extension for compiled Java test sources. objext=o objext_GCJ=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="class foo {}" # Code to be used in simple link tests lt_simple_link_test_code='public class conftest { public static void main(String[] argv) {}; }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # save warnings/boilerplate of simple test code ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $rm conftest* ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $rm -r conftest* # Allow CC to be a program name with arguments. lt_save_CC="$CC" CC=${GCJ-"gcj"} compiler=$CC compiler_GCJ=$CC for cc_temp in $compiler""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` # GCJ did not exist at the time GCC didn't implicitly link libc in. archive_cmds_need_lc_GCJ=no old_archive_cmds_GCJ=$old_archive_cmds lt_prog_compiler_no_builtin_flag_GCJ= if test "$GCC" = yes; then lt_prog_compiler_no_builtin_flag_GCJ=' -fno-builtin' echo "$as_me:$LINENO: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 echo $ECHO_N "checking if $compiler supports -fno-rtti -fno-exceptions... $ECHO_C" >&6 if test "${lt_cv_prog_compiler_rtti_exceptions+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lt_cv_prog_compiler_rtti_exceptions=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-fno-rtti -fno-exceptions" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:16176: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:16180: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_rtti_exceptions=yes fi fi $rm conftest* fi echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 echo "${ECHO_T}$lt_cv_prog_compiler_rtti_exceptions" >&6 if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then lt_prog_compiler_no_builtin_flag_GCJ="$lt_prog_compiler_no_builtin_flag_GCJ -fno-rtti -fno-exceptions" else : fi fi lt_prog_compiler_wl_GCJ= lt_prog_compiler_pic_GCJ= lt_prog_compiler_static_GCJ= echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5 echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6 if test "$GCC" = yes; then lt_prog_compiler_wl_GCJ='-Wl,' lt_prog_compiler_static_GCJ='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static_GCJ='-Bstatic' fi ;; amigaos*) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. lt_prog_compiler_pic_GCJ='-m68020 -resident32 -malways-restore-a4' ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | pw32* | os2*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic_GCJ='-fno-common' ;; interix[3-9]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. lt_prog_compiler_can_build_shared_GCJ=no enable_shared=no ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic_GCJ=-Kconform_pic fi ;; hpux*) # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic_GCJ='-fPIC' ;; esac ;; *) lt_prog_compiler_pic_GCJ='-fPIC' ;; esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in aix*) lt_prog_compiler_wl_GCJ='-Wl,' if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static_GCJ='-Bstatic' else lt_prog_compiler_static_GCJ='-bnso -bI:/lib/syscalls.exp' fi ;; darwin*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files case $cc_basename in xlc*) lt_prog_compiler_pic_GCJ='-qnocommon' lt_prog_compiler_wl_GCJ='-Wl,' ;; esac ;; mingw* | cygwin* | pw32* | os2*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). ;; hpux9* | hpux10* | hpux11*) lt_prog_compiler_wl_GCJ='-Wl,' # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic_GCJ='+Z' ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? lt_prog_compiler_static_GCJ='${wl}-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) lt_prog_compiler_wl_GCJ='-Wl,' # PIC (with -KPIC) is the default. lt_prog_compiler_static_GCJ='-non_shared' ;; newsos6) lt_prog_compiler_pic_GCJ='-KPIC' lt_prog_compiler_static_GCJ='-Bstatic' ;; linux* | k*bsd*-gnu) case $cc_basename in icc* | ecc*) lt_prog_compiler_wl_GCJ='-Wl,' lt_prog_compiler_pic_GCJ='-KPIC' lt_prog_compiler_static_GCJ='-static' ;; pgcc* | pgf77* | pgf90* | pgf95*) # Portland Group compilers (*not* the Pentium gcc compiler, # which looks to be a dead project) lt_prog_compiler_wl_GCJ='-Wl,' lt_prog_compiler_pic_GCJ='-fpic' lt_prog_compiler_static_GCJ='-Bstatic' ;; ccc*) lt_prog_compiler_wl_GCJ='-Wl,' # All Alpha code is PIC. lt_prog_compiler_static_GCJ='-non_shared' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C 5.9 lt_prog_compiler_pic_GCJ='-KPIC' lt_prog_compiler_static_GCJ='-Bstatic' lt_prog_compiler_wl_GCJ='-Wl,' ;; *Sun\ F*) # Sun Fortran 8.3 passes all unrecognized flags to the linker lt_prog_compiler_pic_GCJ='-KPIC' lt_prog_compiler_static_GCJ='-Bstatic' lt_prog_compiler_wl_GCJ='' ;; esac ;; esac ;; osf3* | osf4* | osf5*) lt_prog_compiler_wl_GCJ='-Wl,' # All OSF/1 code is PIC. lt_prog_compiler_static_GCJ='-non_shared' ;; rdos*) lt_prog_compiler_static_GCJ='-non_shared' ;; solaris*) lt_prog_compiler_pic_GCJ='-KPIC' lt_prog_compiler_static_GCJ='-Bstatic' case $cc_basename in f77* | f90* | f95*) lt_prog_compiler_wl_GCJ='-Qoption ld ';; *) lt_prog_compiler_wl_GCJ='-Wl,';; esac ;; sunos4*) lt_prog_compiler_wl_GCJ='-Qoption ld ' lt_prog_compiler_pic_GCJ='-PIC' lt_prog_compiler_static_GCJ='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3*) lt_prog_compiler_wl_GCJ='-Wl,' lt_prog_compiler_pic_GCJ='-KPIC' lt_prog_compiler_static_GCJ='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec ;then lt_prog_compiler_pic_GCJ='-Kconform_pic' lt_prog_compiler_static_GCJ='-Bstatic' fi ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) lt_prog_compiler_wl_GCJ='-Wl,' lt_prog_compiler_pic_GCJ='-KPIC' lt_prog_compiler_static_GCJ='-Bstatic' ;; unicos*) lt_prog_compiler_wl_GCJ='-Wl,' lt_prog_compiler_can_build_shared_GCJ=no ;; uts4*) lt_prog_compiler_pic_GCJ='-pic' lt_prog_compiler_static_GCJ='-Bstatic' ;; *) lt_prog_compiler_can_build_shared_GCJ=no ;; esac fi echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_GCJ" >&5 echo "${ECHO_T}$lt_prog_compiler_pic_GCJ" >&6 # # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic_GCJ"; then echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic_GCJ works" >&5 echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic_GCJ works... $ECHO_C" >&6 if test "${lt_cv_prog_compiler_pic_works_GCJ+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lt_cv_prog_compiler_pic_works_GCJ=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$lt_prog_compiler_pic_GCJ" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:16466: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:16470: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_pic_works_GCJ=yes fi fi $rm conftest* fi echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_pic_works_GCJ" >&5 echo "${ECHO_T}$lt_cv_prog_compiler_pic_works_GCJ" >&6 if test x"$lt_cv_prog_compiler_pic_works_GCJ" = xyes; then case $lt_prog_compiler_pic_GCJ in "" | " "*) ;; *) lt_prog_compiler_pic_GCJ=" $lt_prog_compiler_pic_GCJ" ;; esac else lt_prog_compiler_pic_GCJ= lt_prog_compiler_can_build_shared_GCJ=no fi fi case $host_os in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) lt_prog_compiler_pic_GCJ= ;; *) lt_prog_compiler_pic_GCJ="$lt_prog_compiler_pic_GCJ" ;; esac # # Check to make sure the static flag actually works. # wl=$lt_prog_compiler_wl_GCJ eval lt_tmp_static_flag=\"$lt_prog_compiler_static_GCJ\" echo "$as_me:$LINENO: checking if $compiler static flag $lt_tmp_static_flag works" >&5 echo $ECHO_N "checking if $compiler static flag $lt_tmp_static_flag works... $ECHO_C" >&6 if test "${lt_cv_prog_compiler_static_works_GCJ+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lt_cv_prog_compiler_static_works_GCJ=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $lt_tmp_static_flag" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $echo "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_static_works_GCJ=yes fi else lt_cv_prog_compiler_static_works_GCJ=yes fi fi $rm -r conftest* LDFLAGS="$save_LDFLAGS" fi echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_static_works_GCJ" >&5 echo "${ECHO_T}$lt_cv_prog_compiler_static_works_GCJ" >&6 if test x"$lt_cv_prog_compiler_static_works_GCJ" = xyes; then : else lt_prog_compiler_static_GCJ= fi echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5 echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6 if test "${lt_cv_prog_compiler_c_o_GCJ+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lt_cv_prog_compiler_c_o_GCJ=no $rm -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:16570: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:16574: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o_GCJ=yes fi fi chmod u+w . 2>&5 $rm conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files $rm out/* && rmdir out cd .. rmdir conftest $rm conftest* fi echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o_GCJ" >&5 echo "${ECHO_T}$lt_cv_prog_compiler_c_o_GCJ" >&6 hard_links="nottested" if test "$lt_cv_prog_compiler_c_o_GCJ" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user echo "$as_me:$LINENO: checking if we can lock with hard links" >&5 echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&6 hard_links=yes $rm conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no echo "$as_me:$LINENO: result: $hard_links" >&5 echo "${ECHO_T}$hard_links" >&6 if test "$hard_links" = no; then { echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} need_locks=warn fi else need_locks=no fi echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6 runpath_var= allow_undefined_flag_GCJ= enable_shared_with_static_runtimes_GCJ=no archive_cmds_GCJ= archive_expsym_cmds_GCJ= old_archive_From_new_cmds_GCJ= old_archive_from_expsyms_cmds_GCJ= export_dynamic_flag_spec_GCJ= whole_archive_flag_spec_GCJ= thread_safe_flag_spec_GCJ= hardcode_libdir_flag_spec_GCJ= hardcode_libdir_flag_spec_ld_GCJ= hardcode_libdir_separator_GCJ= hardcode_direct_GCJ=no hardcode_minus_L_GCJ=no hardcode_shlibpath_var_GCJ=unsupported link_all_deplibs_GCJ=unknown hardcode_automatic_GCJ=no module_cmds_GCJ= module_expsym_cmds_GCJ= always_export_symbols_GCJ=no export_symbols_cmds_GCJ='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' # include_expsyms should be a list of space-separated symbols to be *always* # included in the symbol list include_expsyms_GCJ= # exclude_expsyms can be an extended regexp of symbols to exclude # it will be wrapped by ` (' and `)$', so one must not match beginning or # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', # as well as any symbol that contains `d'. exclude_expsyms_GCJ='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out # platforms (ab)use it in PIC code, but their linkers get confused if # the symbol is explicitly referenced. Since portable code cannot # rely on this symbol name, it's probably fine to never include it in # preloaded symbol tables. # Exclude shared library initialization/finalization symbols. extract_expsyms_cmds= # Just being paranoid about ensuring that cc_basename is set. for cc_temp in $compiler""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` case $host_os in cygwin* | mingw* | pw32*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test "$GCC" != yes; then with_gnu_ld=no fi ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++) with_gnu_ld=yes ;; openbsd*) with_gnu_ld=no ;; esac ld_shlibs_GCJ=yes if test "$with_gnu_ld" = yes; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='${wl}' # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. runpath_var=LD_RUN_PATH hardcode_libdir_flag_spec_GCJ='${wl}--rpath ${wl}$libdir' export_dynamic_flag_spec_GCJ='${wl}--export-dynamic' # ancient GNU ld didn't support --whole-archive et. al. if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then whole_archive_flag_spec_GCJ="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else whole_archive_flag_spec_GCJ= fi supports_anon_versioning=no case `$LD -v 2>/dev/null` in *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... *\ 2.11.*) ;; # other 2.11 versions *) supports_anon_versioning=yes ;; esac # See if GNU ld supports shared libraries. case $host_os in aix[3-9]*) # On AIX/PPC, the GNU linker is very broken if test "$host_cpu" != ia64; then ld_shlibs_GCJ=no cat <&2 *** Warning: the GNU linker, at least up to release 2.9.1, is reported *** to be unable to reliably create shared libraries on AIX. *** Therefore, libtool is disabling shared libraries support. If you *** really care for shared libraries, you may want to modify your PATH *** so that a non-GNU linker is found, and then restart. EOF fi ;; amigaos*) archive_cmds_GCJ='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec_GCJ='-L$libdir' hardcode_minus_L_GCJ=yes # Samuel A. Falvo II reports # that the semantics of dynamic libraries on AmigaOS, at least up # to version 4, is to share data among multiple programs linked # with the same dynamic library. Since this doesn't match the # behavior of shared libraries on other platforms, we can't use # them. ld_shlibs_GCJ=no ;; beos*) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then allow_undefined_flag_GCJ=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME archive_cmds_GCJ='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else ld_shlibs_GCJ=no fi ;; cygwin* | mingw* | pw32*) # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, GCJ) is actually meaningless, # as there is no search path for DLLs. hardcode_libdir_flag_spec_GCJ='-L$libdir' allow_undefined_flag_GCJ=unsupported always_export_symbols_GCJ=no enable_shared_with_static_runtimes_GCJ=yes export_symbols_cmds_GCJ='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/'\'' -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... archive_expsym_cmds_GCJ='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else ld_shlibs_GCJ=no fi ;; interix[3-9]*) hardcode_direct_GCJ=no hardcode_shlibpath_var_GCJ=no hardcode_libdir_flag_spec_GCJ='${wl}-rpath,$libdir' export_dynamic_flag_spec_GCJ='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. archive_cmds_GCJ='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' archive_expsym_cmds_GCJ='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; gnu* | linux* | k*bsd*-gnu) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then tmp_addflag= case $cc_basename,$host_cpu in pgcc*) # Portland Group C compiler whole_archive_flag_spec_GCJ='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag' ;; pgf77* | pgf90* | pgf95*) # Portland Group f77 and f90 compilers whole_archive_flag_spec_GCJ='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag -Mnomain' ;; ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 tmp_addflag=' -i_dynamic' ;; efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 tmp_addflag=' -i_dynamic -nofor_main' ;; ifc* | ifort*) # Intel Fortran compiler tmp_addflag=' -nofor_main' ;; esac case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C 5.9 whole_archive_flag_spec_GCJ='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' tmp_sharedflag='-G' ;; *Sun\ F*) # Sun Fortran 8.3 tmp_sharedflag='-G' ;; *) tmp_sharedflag='-shared' ;; esac archive_cmds_GCJ='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test $supports_anon_versioning = yes; then archive_expsym_cmds_GCJ='$echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ $echo "local: *; };" >> $output_objdir/$libname.ver~ $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi else ld_shlibs_GCJ=no fi ;; netbsd*) if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then archive_cmds_GCJ='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' fi ;; solaris*) if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then ld_shlibs_GCJ=no cat <&2 *** Warning: The releases 2.8.* of the GNU linker cannot reliably *** create shared libraries on Solaris systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.9.1 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. EOF elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs_GCJ=no fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) case `$LD -v 2>&1` in *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) ld_shlibs_GCJ=no cat <<_LT_EOF 1>&2 *** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not *** reliably create shared libraries on SCO systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.16.91.0.3 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF ;; *) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then hardcode_libdir_flag_spec_GCJ='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`' archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib' archive_expsym_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname,-retain-symbols-file,$export_symbols -o $lib' else ld_shlibs_GCJ=no fi ;; esac ;; sunos4*) archive_cmds_GCJ='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= hardcode_direct_GCJ=yes hardcode_shlibpath_var_GCJ=no ;; *) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs_GCJ=no fi ;; esac if test "$ld_shlibs_GCJ" = no; then runpath_var= hardcode_libdir_flag_spec_GCJ= export_dynamic_flag_spec_GCJ= whole_archive_flag_spec_GCJ= fi else # PORTME fill in a description of your system's linker (not GNU ld) case $host_os in aix3*) allow_undefined_flag_GCJ=unsupported always_export_symbols_GCJ=yes archive_expsym_cmds_GCJ='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. hardcode_minus_L_GCJ=yes if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. hardcode_direct_GCJ=unsupported fi ;; aix[4-9]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm if $NM -V 2>&1 | grep 'GNU' > /dev/null; then export_symbols_cmds_GCJ='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' else export_symbols_cmds_GCJ='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' fi aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) for ld_flag in $LDFLAGS; do if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then aix_use_runtimelinking=yes break fi done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. archive_cmds_GCJ='' hardcode_direct_GCJ=yes hardcode_libdir_separator_GCJ=':' link_all_deplibs_GCJ=yes if test "$GCC" = yes; then case $host_os in aix4.[012]|aix4.[012].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && \ strings "$collect2name" | grep resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 hardcode_direct_GCJ=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking hardcode_minus_L_GCJ=yes hardcode_libdir_flag_spec_GCJ='-L$libdir' hardcode_libdir_separator_GCJ= fi ;; esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. always_export_symbols_GCJ=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. allow_undefined_flag_GCJ='-berok' # Determine the default libpath from the value encoded in an empty executable. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/ p } }' aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi hardcode_libdir_flag_spec_GCJ='${wl}-blibpath:$libdir:'"$aix_libpath" archive_expsym_cmds_GCJ="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then hardcode_libdir_flag_spec_GCJ='${wl}-R $libdir:/usr/lib:/lib' allow_undefined_flag_GCJ="-z nodefs" archive_expsym_cmds_GCJ="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an empty executable. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/ p } }' aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi hardcode_libdir_flag_spec_GCJ='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. no_undefined_flag_GCJ=' ${wl}-bernotok' allow_undefined_flag_GCJ=' ${wl}-berok' # Exported symbols can be pulled into shared objects from archives whole_archive_flag_spec_GCJ='$convenience' archive_cmds_need_lc_GCJ=yes # This is similar to how AIX traditionally builds its shared libraries. archive_expsym_cmds_GCJ="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; amigaos*) archive_cmds_GCJ='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec_GCJ='-L$libdir' hardcode_minus_L_GCJ=yes # see comment about different semantics on the GNU ld section ld_shlibs_GCJ=no ;; bsdi[45]*) export_dynamic_flag_spec_GCJ=-rdynamic ;; cygwin* | mingw* | pw32*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. hardcode_libdir_flag_spec_GCJ=' ' allow_undefined_flag_GCJ=unsupported # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. archive_cmds_GCJ='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames=' # The linker will automatically build a .lib file if we build a DLL. old_archive_From_new_cmds_GCJ='true' # FIXME: Should let the user specify the lib program. old_archive_cmds_GCJ='lib -OUT:$oldlib$oldobjs$old_deplibs' fix_srcfile_path_GCJ='`cygpath -w "$srcfile"`' enable_shared_with_static_runtimes_GCJ=yes ;; darwin* | rhapsody*) case $host_os in rhapsody* | darwin1.[012]) allow_undefined_flag_GCJ='${wl}-undefined ${wl}suppress' ;; *) # Darwin 1.3 on if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then allow_undefined_flag_GCJ='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' else case ${MACOSX_DEPLOYMENT_TARGET} in 10.[012]) allow_undefined_flag_GCJ='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; 10.*) allow_undefined_flag_GCJ='${wl}-undefined ${wl}dynamic_lookup' ;; esac fi ;; esac archive_cmds_need_lc_GCJ=no hardcode_direct_GCJ=no hardcode_automatic_GCJ=yes hardcode_shlibpath_var_GCJ=unsupported whole_archive_flag_spec_GCJ='' link_all_deplibs_GCJ=yes if test "$GCC" = yes ; then output_verbose_link_cmd='echo' archive_cmds_GCJ="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" module_cmds_GCJ="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" archive_expsym_cmds_GCJ="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" module_expsym_cmds_GCJ="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" else case $cc_basename in xlc*) output_verbose_link_cmd='echo' archive_cmds_GCJ='$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $xlcverstring' module_cmds_GCJ='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds archive_expsym_cmds_GCJ='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $xlcverstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' module_expsym_cmds_GCJ='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' ;; *) ld_shlibs_GCJ=no ;; esac fi ;; dgux*) archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec_GCJ='-L$libdir' hardcode_shlibpath_var_GCJ=no ;; freebsd1*) ld_shlibs_GCJ=no ;; # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor # support. Future versions do this automatically, but an explicit c++rt0.o # does not break anything, and helps significantly (at the cost of a little # extra space). freebsd2.2*) archive_cmds_GCJ='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' hardcode_libdir_flag_spec_GCJ='-R$libdir' hardcode_direct_GCJ=yes hardcode_shlibpath_var_GCJ=no ;; # Unfortunately, older versions of FreeBSD 2 do not have this feature. freebsd2*) archive_cmds_GCJ='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_direct_GCJ=yes hardcode_minus_L_GCJ=yes hardcode_shlibpath_var_GCJ=no ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. freebsd* | dragonfly*) archive_cmds_GCJ='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec_GCJ='-R$libdir' hardcode_direct_GCJ=yes hardcode_shlibpath_var_GCJ=no ;; hpux9*) if test "$GCC" = yes; then archive_cmds_GCJ='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else archive_cmds_GCJ='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' fi hardcode_libdir_flag_spec_GCJ='${wl}+b ${wl}$libdir' hardcode_libdir_separator_GCJ=: hardcode_direct_GCJ=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L_GCJ=yes export_dynamic_flag_spec_GCJ='${wl}-E' ;; hpux10*) if test "$GCC" = yes -a "$with_gnu_ld" = no; then archive_cmds_GCJ='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds_GCJ='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec_GCJ='${wl}+b ${wl}$libdir' hardcode_libdir_separator_GCJ=: hardcode_direct_GCJ=yes export_dynamic_flag_spec_GCJ='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L_GCJ=yes fi ;; hpux11*) if test "$GCC" = yes -a "$with_gnu_ld" = no; then case $host_cpu in hppa*64*) archive_cmds_GCJ='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) archive_cmds_GCJ='$CC -shared ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds_GCJ='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else case $host_cpu in hppa*64*) archive_cmds_GCJ='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) archive_cmds_GCJ='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds_GCJ='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac fi if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec_GCJ='${wl}+b ${wl}$libdir' hardcode_libdir_separator_GCJ=: case $host_cpu in hppa*64*|ia64*) hardcode_libdir_flag_spec_ld_GCJ='+b $libdir' hardcode_direct_GCJ=no hardcode_shlibpath_var_GCJ=no ;; *) hardcode_direct_GCJ=yes export_dynamic_flag_spec_GCJ='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L_GCJ=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) if test "$GCC" = yes; then archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else archive_cmds_GCJ='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' hardcode_libdir_flag_spec_ld_GCJ='-rpath $libdir' fi hardcode_libdir_flag_spec_GCJ='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_GCJ=: link_all_deplibs_GCJ=yes ;; netbsd*) if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then archive_cmds_GCJ='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else archive_cmds_GCJ='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF fi hardcode_libdir_flag_spec_GCJ='-R$libdir' hardcode_direct_GCJ=yes hardcode_shlibpath_var_GCJ=no ;; newsos6) archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct_GCJ=yes hardcode_libdir_flag_spec_GCJ='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_GCJ=: hardcode_shlibpath_var_GCJ=no ;; openbsd*) if test -f /usr/libexec/ld.so; then hardcode_direct_GCJ=yes hardcode_shlibpath_var_GCJ=no if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then archive_cmds_GCJ='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_GCJ='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' hardcode_libdir_flag_spec_GCJ='${wl}-rpath,$libdir' export_dynamic_flag_spec_GCJ='${wl}-E' else case $host_os in openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) archive_cmds_GCJ='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec_GCJ='-R$libdir' ;; *) archive_cmds_GCJ='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec_GCJ='${wl}-rpath,$libdir' ;; esac fi else ld_shlibs_GCJ=no fi ;; os2*) hardcode_libdir_flag_spec_GCJ='-L$libdir' hardcode_minus_L_GCJ=yes allow_undefined_flag_GCJ=unsupported archive_cmds_GCJ='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' old_archive_From_new_cmds_GCJ='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' ;; osf3*) if test "$GCC" = yes; then allow_undefined_flag_GCJ=' ${wl}-expect_unresolved ${wl}\*' archive_cmds_GCJ='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else allow_undefined_flag_GCJ=' -expect_unresolved \*' archive_cmds_GCJ='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' fi hardcode_libdir_flag_spec_GCJ='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_GCJ=: ;; osf4* | osf5*) # as osf3* with the addition of -msym flag if test "$GCC" = yes; then allow_undefined_flag_GCJ=' ${wl}-expect_unresolved ${wl}\*' archive_cmds_GCJ='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' hardcode_libdir_flag_spec_GCJ='${wl}-rpath ${wl}$libdir' else allow_undefined_flag_GCJ=' -expect_unresolved \*' archive_cmds_GCJ='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' archive_expsym_cmds_GCJ='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~ $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib~$rm $lib.exp' # Both c and cxx compiler support -rpath directly hardcode_libdir_flag_spec_GCJ='-rpath $libdir' fi hardcode_libdir_separator_GCJ=: ;; solaris*) no_undefined_flag_GCJ=' -z text' if test "$GCC" = yes; then wlarc='${wl}' archive_cmds_GCJ='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_GCJ='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp' else wlarc='' archive_cmds_GCJ='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' archive_expsym_cmds_GCJ='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' fi hardcode_libdir_flag_spec_GCJ='-R$libdir' hardcode_shlibpath_var_GCJ=no case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. GCC discards it without `$wl', # but is careful enough not to reorder. # Supported since Solaris 2.6 (maybe 2.5.1?) if test "$GCC" = yes; then whole_archive_flag_spec_GCJ='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' else whole_archive_flag_spec_GCJ='-z allextract$convenience -z defaultextract' fi ;; esac link_all_deplibs_GCJ=yes ;; sunos4*) if test "x$host_vendor" = xsequent; then # Use $CC to link under sequent, because it throws in some extra .o # files that make .init and .fini sections work. archive_cmds_GCJ='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds_GCJ='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' fi hardcode_libdir_flag_spec_GCJ='-L$libdir' hardcode_direct_GCJ=yes hardcode_minus_L_GCJ=yes hardcode_shlibpath_var_GCJ=no ;; sysv4) case $host_vendor in sni) archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct_GCJ=yes # is this really true??? ;; siemens) ## LD is ld it makes a PLAMLIB ## CC just makes a GrossModule. archive_cmds_GCJ='$LD -G -o $lib $libobjs $deplibs $linker_flags' reload_cmds_GCJ='$CC -r -o $output$reload_objs' hardcode_direct_GCJ=no ;; motorola) archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct_GCJ=no #Motorola manual says yes, but my tests say they lie ;; esac runpath_var='LD_RUN_PATH' hardcode_shlibpath_var_GCJ=no ;; sysv4.3*) archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var_GCJ=no export_dynamic_flag_spec_GCJ='-Bexport' ;; sysv4*MP*) if test -d /usr/nec; then archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var_GCJ=no runpath_var=LD_RUN_PATH hardcode_runpath_var=yes ld_shlibs_GCJ=yes fi ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) no_undefined_flag_GCJ='${wl}-z,text' archive_cmds_need_lc_GCJ=no hardcode_shlibpath_var_GCJ=no runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then archive_cmds_GCJ='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_GCJ='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds_GCJ='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_GCJ='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. no_undefined_flag_GCJ='${wl}-z,text' allow_undefined_flag_GCJ='${wl}-z,nodefs' archive_cmds_need_lc_GCJ=no hardcode_shlibpath_var_GCJ=no hardcode_libdir_flag_spec_GCJ='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`' hardcode_libdir_separator_GCJ=':' link_all_deplibs_GCJ=yes export_dynamic_flag_spec_GCJ='${wl}-Bexport' runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then archive_cmds_GCJ='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_GCJ='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds_GCJ='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_GCJ='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; uts4*) archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec_GCJ='-L$libdir' hardcode_shlibpath_var_GCJ=no ;; *) ld_shlibs_GCJ=no ;; esac fi echo "$as_me:$LINENO: result: $ld_shlibs_GCJ" >&5 echo "${ECHO_T}$ld_shlibs_GCJ" >&6 test "$ld_shlibs_GCJ" = no && can_build_shared=no # # Do we need to explicitly link libc? # case "x$archive_cmds_need_lc_GCJ" in x|xyes) # Assume -lc should be added archive_cmds_need_lc_GCJ=yes if test "$enable_shared" = yes && test "$GCC" = yes; then case $archive_cmds_GCJ in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5 echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6 $rm conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$lt_prog_compiler_wl_GCJ pic_flag=$lt_prog_compiler_pic_GCJ compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$allow_undefined_flag_GCJ allow_undefined_flag_GCJ= if { (eval echo "$as_me:$LINENO: \"$archive_cmds_GCJ 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\"") >&5 (eval $archive_cmds_GCJ 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } then archive_cmds_need_lc_GCJ=no else archive_cmds_need_lc_GCJ=yes fi allow_undefined_flag_GCJ=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $rm conftest* echo "$as_me:$LINENO: result: $archive_cmds_need_lc_GCJ" >&5 echo "${ECHO_T}$archive_cmds_need_lc_GCJ" >&6 ;; esac fi ;; esac echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5 echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&6 library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=".so" postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='${libname}${release}${shared_ext}$major' ;; aix[4-9]*) version_type=linux need_lib_prefix=no need_version=no hardcode_into_libs=yes if test "$host_cpu" = ia64; then # AIX 5 supports IA64 library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line `#! .'. This would cause the generated library to # depend on `.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[01] | aix4.[01].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then : else can_build_shared=no fi ;; esac # AIX (on Power*) has no versioning support, so currently we can not hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' else # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='${libname}${release}.a $libname.a' soname_spec='${libname}${release}${shared_ext}$major' fi shlibpath_var=LIBPATH fi ;; amigaos*) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; beos*) library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[45]*) version_type=linux need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no case $GCC,$host_os in yes,cygwin* | yes,mingw* | yes,pw32*) library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $rm \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" ;; mingw*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then # It is most probably a Windows format PATH printed by # mingw gcc, but we are running on Cygwin. Gcc prints its search # path with ; separators, and with drive letters. We can handle the # drive letters (cygwin fileutils understands them), so leave them, # especially as we might pass files found there to a mingw objdump, # which wouldn't understand a cygwinified path. Ahh. sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; esac ;; *) library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' ;; esac dynamic_linker='Win32 ld.exe' # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext' soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd1*) dynamic_linker=no ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[123]*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2*) shlibpath_overrides_runpath=yes ;; freebsd3.[01]* | freebsdelf3.[01]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; gnu*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' if test "X$HPUX_IA64_MODE" = X32; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555. postinstall_cmds='chmod 555 $lib' ;; interix[3-9]*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then version_type=linux else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; # This must be Linux ELF. linux* | k*bsd*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; nto-qnx*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; openbsd*) version_type=sunos sys_lib_dlsearch_path_spec="/usr/lib" need_lib_prefix=no # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. case $host_os in openbsd3.3 | openbsd3.3.*) need_version=yes ;; *) need_version=no ;; esac library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[89] | openbsd2.[89].*) shlibpath_overrides_runpath=no ;; *) shlibpath_overrides_runpath=yes ;; esac else shlibpath_overrides_runpath=yes fi ;; os2*) libname_spec='$name' shrext_cmds=".dll" need_lib_prefix=no library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test "$with_gnu_ld" = yes; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no export_dynamic_flag_spec='${wl}-Blargedynsym' runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec ;then version_type=linux library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=freebsd-elf need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH hardcode_into_libs=yes if test "$with_gnu_ld" = yes; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' shlibpath_overrides_runpath=no else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' shlibpath_overrides_runpath=yes case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; uts4*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac echo "$as_me:$LINENO: result: $dynamic_linker" >&5 echo "${ECHO_T}$dynamic_linker" >&6 test "$dynamic_linker" = no && can_build_shared=no if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lt_cv_sys_lib_search_path_spec="$sys_lib_search_path_spec" fi sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lt_cv_sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec" fi sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5 echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6 hardcode_action_GCJ= if test -n "$hardcode_libdir_flag_spec_GCJ" || \ test -n "$runpath_var_GCJ" || \ test "X$hardcode_automatic_GCJ" = "Xyes" ; then # We can hardcode non-existant directories. if test "$hardcode_direct_GCJ" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, GCJ)" != no && test "$hardcode_minus_L_GCJ" != no; then # Linking always hardcodes the temporary library directory. hardcode_action_GCJ=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. hardcode_action_GCJ=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. hardcode_action_GCJ=unsupported fi echo "$as_me:$LINENO: result: $hardcode_action_GCJ" >&5 echo "${ECHO_T}$hardcode_action_GCJ" >&6 if test "$hardcode_action_GCJ" = relink; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || test "$enable_shared" = no; then # Fast installation is not necessary enable_fast_install=needless fi # The else clause should only fire when bootstrapping the # libtool distribution, otherwise you forgot to ship ltmain.sh # with your package, and you will get complaints that there are # no rules to generate ltmain.sh. if test -f "$ltmain"; then # See if we are running on zsh, and set the options which allow our commands through # without removal of \ escapes. if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi # Now quote all the things that may contain metacharacters while being # careful not to overquote the AC_SUBSTed values. We take copies of the # variables and quote the copies for generation of the libtool script. for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \ SED SHELL STRIP \ libname_spec library_names_spec soname_spec extract_expsyms_cmds \ old_striplib striplib file_magic_cmd finish_cmds finish_eval \ deplibs_check_method reload_flag reload_cmds need_locks \ lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \ lt_cv_sys_global_symbol_to_c_name_address \ sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ old_postinstall_cmds old_postuninstall_cmds \ compiler_GCJ \ CC_GCJ \ LD_GCJ \ lt_prog_compiler_wl_GCJ \ lt_prog_compiler_pic_GCJ \ lt_prog_compiler_static_GCJ \ lt_prog_compiler_no_builtin_flag_GCJ \ export_dynamic_flag_spec_GCJ \ thread_safe_flag_spec_GCJ \ whole_archive_flag_spec_GCJ \ enable_shared_with_static_runtimes_GCJ \ old_archive_cmds_GCJ \ old_archive_from_new_cmds_GCJ \ predep_objects_GCJ \ postdep_objects_GCJ \ predeps_GCJ \ postdeps_GCJ \ compiler_lib_search_path_GCJ \ compiler_lib_search_dirs_GCJ \ archive_cmds_GCJ \ archive_expsym_cmds_GCJ \ postinstall_cmds_GCJ \ postuninstall_cmds_GCJ \ old_archive_from_expsyms_cmds_GCJ \ allow_undefined_flag_GCJ \ no_undefined_flag_GCJ \ export_symbols_cmds_GCJ \ hardcode_libdir_flag_spec_GCJ \ hardcode_libdir_flag_spec_ld_GCJ \ hardcode_libdir_separator_GCJ \ hardcode_automatic_GCJ \ module_cmds_GCJ \ module_expsym_cmds_GCJ \ lt_cv_prog_compiler_c_o_GCJ \ fix_srcfile_path_GCJ \ exclude_expsyms_GCJ \ include_expsyms_GCJ; do case $var in old_archive_cmds_GCJ | \ old_archive_from_new_cmds_GCJ | \ archive_cmds_GCJ | \ archive_expsym_cmds_GCJ | \ module_cmds_GCJ | \ module_expsym_cmds_GCJ | \ old_archive_from_expsyms_cmds_GCJ | \ export_symbols_cmds_GCJ | \ extract_expsyms_cmds | reload_cmds | finish_cmds | \ postinstall_cmds | postuninstall_cmds | \ old_postinstall_cmds | old_postuninstall_cmds | \ sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) # Double-quote double-evaled strings. eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" ;; *) eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" ;; esac done case $lt_echo in *'\$0 --fallback-echo"') lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'` ;; esac cfgfile="$ofile" cat <<__EOF__ >> "$cfgfile" # ### BEGIN LIBTOOL TAG CONFIG: $tagname # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # Shell to use when invoking shell scripts. SHELL=$lt_SHELL # Whether or not to build shared libraries. build_libtool_libs=$enable_shared # Whether or not to build static libraries. build_old_libs=$enable_static # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$archive_cmds_need_lc_GCJ # Whether or not to disallow shared libs when runtime libs are static allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_GCJ # Whether or not to optimize for fast installation. fast_install=$enable_fast_install # The host system. host_alias=$host_alias host=$host host_os=$host_os # The build system. build_alias=$build_alias build=$build build_os=$build_os # An echo program that does not interpret backslashes. echo=$lt_echo # The archiver. AR=$lt_AR AR_FLAGS=$lt_AR_FLAGS # A C compiler. LTCC=$lt_LTCC # LTCC compiler flags. LTCFLAGS=$lt_LTCFLAGS # A language-specific compiler. CC=$lt_compiler_GCJ # Is the compiler the GNU C compiler? with_gcc=$GCC_GCJ # An ERE matcher. EGREP=$lt_EGREP # The linker used to build libraries. LD=$lt_LD_GCJ # Whether we need hard or soft links. LN_S=$lt_LN_S # A BSD-compatible nm program. NM=$lt_NM # A symbol stripping program STRIP=$lt_STRIP # Used to examine libraries when file_magic_cmd begins "file" MAGIC_CMD=$MAGIC_CMD # Used on cygwin: DLL creation program. DLLTOOL="$DLLTOOL" # Used on cygwin: object dumper. OBJDUMP="$OBJDUMP" # Used on cygwin: assembler. AS="$AS" # The name of the directory that contains temporary libtool files. objdir=$objdir # How to create reloadable object files. reload_flag=$lt_reload_flag reload_cmds=$lt_reload_cmds # How to pass a linker flag through the compiler. wl=$lt_lt_prog_compiler_wl_GCJ # Object file suffix (normally "o"). objext="$ac_objext" # Old archive suffix (normally "a"). libext="$libext" # Shared library suffix (normally ".so"). shrext_cmds='$shrext_cmds' # Executable file suffix (normally ""). exeext="$exeext" # Additional compiler flags for building library objects. pic_flag=$lt_lt_prog_compiler_pic_GCJ pic_mode=$pic_mode # What is the maximum length of a command? max_cmd_len=$lt_cv_sys_max_cmd_len # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_lt_cv_prog_compiler_c_o_GCJ # Must we lock files when doing compilation? need_locks=$lt_need_locks # Do we need the lib prefix for modules? need_lib_prefix=$need_lib_prefix # Do we need a version for libraries? need_version=$need_version # Whether dlopen is supported. dlopen_support=$enable_dlopen # Whether dlopen of programs is supported. dlopen_self=$enable_dlopen_self # Whether dlopen of statically linked programs is supported. dlopen_self_static=$enable_dlopen_self_static # Compiler flag to prevent dynamic linking. link_static_flag=$lt_lt_prog_compiler_static_GCJ # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_GCJ # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_GCJ # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec=$lt_whole_archive_flag_spec_GCJ # Compiler flag to generate thread-safe objects. thread_safe_flag_spec=$lt_thread_safe_flag_spec_GCJ # Library versioning type. version_type=$version_type # Format of library name prefix. libname_spec=$lt_libname_spec # List of archive names. First name is the real one, the rest are links. # The last name is the one that the linker finds with -lNAME. library_names_spec=$lt_library_names_spec # The coded name of the library, if different from the real name. soname_spec=$lt_soname_spec # Commands used to build and install an old-style archive. RANLIB=$lt_RANLIB old_archive_cmds=$lt_old_archive_cmds_GCJ old_postinstall_cmds=$lt_old_postinstall_cmds old_postuninstall_cmds=$lt_old_postuninstall_cmds # Create an old-style archive from a shared archive. old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_GCJ # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_GCJ # Commands used to build and install a shared archive. archive_cmds=$lt_archive_cmds_GCJ archive_expsym_cmds=$lt_archive_expsym_cmds_GCJ postinstall_cmds=$lt_postinstall_cmds postuninstall_cmds=$lt_postuninstall_cmds # Commands used to build a loadable module (assumed same as above if empty) module_cmds=$lt_module_cmds_GCJ module_expsym_cmds=$lt_module_expsym_cmds_GCJ # Commands to strip libraries. old_striplib=$lt_old_striplib striplib=$lt_striplib # Dependencies to place before the objects being linked to create a # shared library. predep_objects=$lt_predep_objects_GCJ # Dependencies to place after the objects being linked to create a # shared library. postdep_objects=$lt_postdep_objects_GCJ # Dependencies to place before the objects being linked to create a # shared library. predeps=$lt_predeps_GCJ # Dependencies to place after the objects being linked to create a # shared library. postdeps=$lt_postdeps_GCJ # The directories searched by this compiler when creating a shared # library compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_GCJ # The library search path used internally by the compiler when linking # a shared library. compiler_lib_search_path=$lt_compiler_lib_search_path_GCJ # Method to check whether dependent libraries are shared objects. deplibs_check_method=$lt_deplibs_check_method # Command to use when deplibs_check_method == file_magic. file_magic_cmd=$lt_file_magic_cmd # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_allow_undefined_flag_GCJ # Flag that forces no undefined symbols. no_undefined_flag=$lt_no_undefined_flag_GCJ # Commands used to finish a libtool library installation in a directory. finish_cmds=$lt_finish_cmds # Same as above, but a single script fragment to be evaled but not shown. finish_eval=$lt_finish_eval # Take the output of nm and produce a listing of raw symbols and C names. global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe # Transform the output of nm in a proper C declaration global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl # Transform the output of nm in a C name address pair global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address # This is the shared library runtime path variable. runpath_var=$runpath_var # This is the shared library path variable. shlibpath_var=$shlibpath_var # Is shlibpath searched before the hard-coded library search path? shlibpath_overrides_runpath=$shlibpath_overrides_runpath # How to hardcode a shared library path into an executable. hardcode_action=$hardcode_action_GCJ # Whether we should hardcode library paths into libraries. hardcode_into_libs=$hardcode_into_libs # Flag to hardcode \$libdir into a binary during linking. # This must work even if \$libdir does not exist. hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_GCJ # If ld is used when linking, flag to hardcode \$libdir into # a binary during linking. This must work even if \$libdir does # not exist. hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_GCJ # Whether we need a single -rpath flag with a separated argument. hardcode_libdir_separator=$lt_hardcode_libdir_separator_GCJ # Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the # resulting binary. hardcode_direct=$hardcode_direct_GCJ # Set to yes if using the -LDIR flag during linking hardcodes DIR into the # resulting binary. hardcode_minus_L=$hardcode_minus_L_GCJ # Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into # the resulting binary. hardcode_shlibpath_var=$hardcode_shlibpath_var_GCJ # Set to yes if building a shared library automatically hardcodes DIR into the library # and all subsequent libraries and executables linked against it. hardcode_automatic=$hardcode_automatic_GCJ # Variables whose values should be saved in libtool wrapper scripts and # restored at relink time. variables_saved_for_relink="$variables_saved_for_relink" # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$link_all_deplibs_GCJ # Compile-time system search path for libraries sys_lib_search_path_spec=$lt_sys_lib_search_path_spec # Run-time system search path for libraries sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec # Fix the shell variable \$srcfile for the compiler. fix_srcfile_path=$lt_fix_srcfile_path # Set to yes if exported symbols are required. always_export_symbols=$always_export_symbols_GCJ # The commands to list exported symbols. export_symbols_cmds=$lt_export_symbols_cmds_GCJ # The commands to extract the exported symbol list from a shared archive. extract_expsyms_cmds=$lt_extract_expsyms_cmds # Symbols that should not be listed in the preloaded symbols. exclude_expsyms=$lt_exclude_expsyms_GCJ # Symbols that must always be exported. include_expsyms=$lt_include_expsyms_GCJ # ### END LIBTOOL TAG CONFIG: $tagname __EOF__ else # If there is no Makefile yet, we rely on a make rule to execute # `config.status --recheck' to rerun these tests and create the # libtool script then. ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` if test -f "$ltmain_in"; then test -f Makefile && make "$ltmain" fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu CC="$lt_save_CC" else tagname="" fi ;; RC) # Source file extension for RC test sources. ac_ext=rc # Object file extension for compiled RC test sources. objext=o objext_RC=$objext # Code to be used in simple compile tests lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }' # Code to be used in simple link tests lt_simple_link_test_code="$lt_simple_compile_test_code" # ltmain only uses $CC for tagged configurations so make sure $CC is set. # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # save warnings/boilerplate of simple test code ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $rm conftest* ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $rm -r conftest* # Allow CC to be a program name with arguments. lt_save_CC="$CC" CC=${RC-"windres"} compiler=$CC compiler_RC=$CC for cc_temp in $compiler""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` lt_cv_prog_compiler_c_o_RC=yes # The else clause should only fire when bootstrapping the # libtool distribution, otherwise you forgot to ship ltmain.sh # with your package, and you will get complaints that there are # no rules to generate ltmain.sh. if test -f "$ltmain"; then # See if we are running on zsh, and set the options which allow our commands through # without removal of \ escapes. if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi # Now quote all the things that may contain metacharacters while being # careful not to overquote the AC_SUBSTed values. We take copies of the # variables and quote the copies for generation of the libtool script. for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \ SED SHELL STRIP \ libname_spec library_names_spec soname_spec extract_expsyms_cmds \ old_striplib striplib file_magic_cmd finish_cmds finish_eval \ deplibs_check_method reload_flag reload_cmds need_locks \ lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \ lt_cv_sys_global_symbol_to_c_name_address \ sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ old_postinstall_cmds old_postuninstall_cmds \ compiler_RC \ CC_RC \ LD_RC \ lt_prog_compiler_wl_RC \ lt_prog_compiler_pic_RC \ lt_prog_compiler_static_RC \ lt_prog_compiler_no_builtin_flag_RC \ export_dynamic_flag_spec_RC \ thread_safe_flag_spec_RC \ whole_archive_flag_spec_RC \ enable_shared_with_static_runtimes_RC \ old_archive_cmds_RC \ old_archive_from_new_cmds_RC \ predep_objects_RC \ postdep_objects_RC \ predeps_RC \ postdeps_RC \ compiler_lib_search_path_RC \ compiler_lib_search_dirs_RC \ archive_cmds_RC \ archive_expsym_cmds_RC \ postinstall_cmds_RC \ postuninstall_cmds_RC \ old_archive_from_expsyms_cmds_RC \ allow_undefined_flag_RC \ no_undefined_flag_RC \ export_symbols_cmds_RC \ hardcode_libdir_flag_spec_RC \ hardcode_libdir_flag_spec_ld_RC \ hardcode_libdir_separator_RC \ hardcode_automatic_RC \ module_cmds_RC \ module_expsym_cmds_RC \ lt_cv_prog_compiler_c_o_RC \ fix_srcfile_path_RC \ exclude_expsyms_RC \ include_expsyms_RC; do case $var in old_archive_cmds_RC | \ old_archive_from_new_cmds_RC | \ archive_cmds_RC | \ archive_expsym_cmds_RC | \ module_cmds_RC | \ module_expsym_cmds_RC | \ old_archive_from_expsyms_cmds_RC | \ export_symbols_cmds_RC | \ extract_expsyms_cmds | reload_cmds | finish_cmds | \ postinstall_cmds | postuninstall_cmds | \ old_postinstall_cmds | old_postuninstall_cmds | \ sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) # Double-quote double-evaled strings. eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" ;; *) eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" ;; esac done case $lt_echo in *'\$0 --fallback-echo"') lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'` ;; esac cfgfile="$ofile" cat <<__EOF__ >> "$cfgfile" # ### BEGIN LIBTOOL TAG CONFIG: $tagname # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # Shell to use when invoking shell scripts. SHELL=$lt_SHELL # Whether or not to build shared libraries. build_libtool_libs=$enable_shared # Whether or not to build static libraries. build_old_libs=$enable_static # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$archive_cmds_need_lc_RC # Whether or not to disallow shared libs when runtime libs are static allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_RC # Whether or not to optimize for fast installation. fast_install=$enable_fast_install # The host system. host_alias=$host_alias host=$host host_os=$host_os # The build system. build_alias=$build_alias build=$build build_os=$build_os # An echo program that does not interpret backslashes. echo=$lt_echo # The archiver. AR=$lt_AR AR_FLAGS=$lt_AR_FLAGS # A C compiler. LTCC=$lt_LTCC # LTCC compiler flags. LTCFLAGS=$lt_LTCFLAGS # A language-specific compiler. CC=$lt_compiler_RC # Is the compiler the GNU C compiler? with_gcc=$GCC_RC # An ERE matcher. EGREP=$lt_EGREP # The linker used to build libraries. LD=$lt_LD_RC # Whether we need hard or soft links. LN_S=$lt_LN_S # A BSD-compatible nm program. NM=$lt_NM # A symbol stripping program STRIP=$lt_STRIP # Used to examine libraries when file_magic_cmd begins "file" MAGIC_CMD=$MAGIC_CMD # Used on cygwin: DLL creation program. DLLTOOL="$DLLTOOL" # Used on cygwin: object dumper. OBJDUMP="$OBJDUMP" # Used on cygwin: assembler. AS="$AS" # The name of the directory that contains temporary libtool files. objdir=$objdir # How to create reloadable object files. reload_flag=$lt_reload_flag reload_cmds=$lt_reload_cmds # How to pass a linker flag through the compiler. wl=$lt_lt_prog_compiler_wl_RC # Object file suffix (normally "o"). objext="$ac_objext" # Old archive suffix (normally "a"). libext="$libext" # Shared library suffix (normally ".so"). shrext_cmds='$shrext_cmds' # Executable file suffix (normally ""). exeext="$exeext" # Additional compiler flags for building library objects. pic_flag=$lt_lt_prog_compiler_pic_RC pic_mode=$pic_mode # What is the maximum length of a command? max_cmd_len=$lt_cv_sys_max_cmd_len # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_lt_cv_prog_compiler_c_o_RC # Must we lock files when doing compilation? need_locks=$lt_need_locks # Do we need the lib prefix for modules? need_lib_prefix=$need_lib_prefix # Do we need a version for libraries? need_version=$need_version # Whether dlopen is supported. dlopen_support=$enable_dlopen # Whether dlopen of programs is supported. dlopen_self=$enable_dlopen_self # Whether dlopen of statically linked programs is supported. dlopen_self_static=$enable_dlopen_self_static # Compiler flag to prevent dynamic linking. link_static_flag=$lt_lt_prog_compiler_static_RC # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_RC # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_RC # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec=$lt_whole_archive_flag_spec_RC # Compiler flag to generate thread-safe objects. thread_safe_flag_spec=$lt_thread_safe_flag_spec_RC # Library versioning type. version_type=$version_type # Format of library name prefix. libname_spec=$lt_libname_spec # List of archive names. First name is the real one, the rest are links. # The last name is the one that the linker finds with -lNAME. library_names_spec=$lt_library_names_spec # The coded name of the library, if different from the real name. soname_spec=$lt_soname_spec # Commands used to build and install an old-style archive. RANLIB=$lt_RANLIB old_archive_cmds=$lt_old_archive_cmds_RC old_postinstall_cmds=$lt_old_postinstall_cmds old_postuninstall_cmds=$lt_old_postuninstall_cmds # Create an old-style archive from a shared archive. old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_RC # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_RC # Commands used to build and install a shared archive. archive_cmds=$lt_archive_cmds_RC archive_expsym_cmds=$lt_archive_expsym_cmds_RC postinstall_cmds=$lt_postinstall_cmds postuninstall_cmds=$lt_postuninstall_cmds # Commands used to build a loadable module (assumed same as above if empty) module_cmds=$lt_module_cmds_RC module_expsym_cmds=$lt_module_expsym_cmds_RC # Commands to strip libraries. old_striplib=$lt_old_striplib striplib=$lt_striplib # Dependencies to place before the objects being linked to create a # shared library. predep_objects=$lt_predep_objects_RC # Dependencies to place after the objects being linked to create a # shared library. postdep_objects=$lt_postdep_objects_RC # Dependencies to place before the objects being linked to create a # shared library. predeps=$lt_predeps_RC # Dependencies to place after the objects being linked to create a # shared library. postdeps=$lt_postdeps_RC # The directories searched by this compiler when creating a shared # library compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_RC # The library search path used internally by the compiler when linking # a shared library. compiler_lib_search_path=$lt_compiler_lib_search_path_RC # Method to check whether dependent libraries are shared objects. deplibs_check_method=$lt_deplibs_check_method # Command to use when deplibs_check_method == file_magic. file_magic_cmd=$lt_file_magic_cmd # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_allow_undefined_flag_RC # Flag that forces no undefined symbols. no_undefined_flag=$lt_no_undefined_flag_RC # Commands used to finish a libtool library installation in a directory. finish_cmds=$lt_finish_cmds # Same as above, but a single script fragment to be evaled but not shown. finish_eval=$lt_finish_eval # Take the output of nm and produce a listing of raw symbols and C names. global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe # Transform the output of nm in a proper C declaration global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl # Transform the output of nm in a C name address pair global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address # This is the shared library runtime path variable. runpath_var=$runpath_var # This is the shared library path variable. shlibpath_var=$shlibpath_var # Is shlibpath searched before the hard-coded library search path? shlibpath_overrides_runpath=$shlibpath_overrides_runpath # How to hardcode a shared library path into an executable. hardcode_action=$hardcode_action_RC # Whether we should hardcode library paths into libraries. hardcode_into_libs=$hardcode_into_libs # Flag to hardcode \$libdir into a binary during linking. # This must work even if \$libdir does not exist. hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_RC # If ld is used when linking, flag to hardcode \$libdir into # a binary during linking. This must work even if \$libdir does # not exist. hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_RC # Whether we need a single -rpath flag with a separated argument. hardcode_libdir_separator=$lt_hardcode_libdir_separator_RC # Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the # resulting binary. hardcode_direct=$hardcode_direct_RC # Set to yes if using the -LDIR flag during linking hardcodes DIR into the # resulting binary. hardcode_minus_L=$hardcode_minus_L_RC # Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into # the resulting binary. hardcode_shlibpath_var=$hardcode_shlibpath_var_RC # Set to yes if building a shared library automatically hardcodes DIR into the library # and all subsequent libraries and executables linked against it. hardcode_automatic=$hardcode_automatic_RC # Variables whose values should be saved in libtool wrapper scripts and # restored at relink time. variables_saved_for_relink="$variables_saved_for_relink" # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$link_all_deplibs_RC # Compile-time system search path for libraries sys_lib_search_path_spec=$lt_sys_lib_search_path_spec # Run-time system search path for libraries sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec # Fix the shell variable \$srcfile for the compiler. fix_srcfile_path=$lt_fix_srcfile_path # Set to yes if exported symbols are required. always_export_symbols=$always_export_symbols_RC # The commands to list exported symbols. export_symbols_cmds=$lt_export_symbols_cmds_RC # The commands to extract the exported symbol list from a shared archive. extract_expsyms_cmds=$lt_extract_expsyms_cmds # Symbols that should not be listed in the preloaded symbols. exclude_expsyms=$lt_exclude_expsyms_RC # Symbols that must always be exported. include_expsyms=$lt_include_expsyms_RC # ### END LIBTOOL TAG CONFIG: $tagname __EOF__ else # If there is no Makefile yet, we rely on a make rule to execute # `config.status --recheck' to rerun these tests and create the # libtool script then. ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` if test -f "$ltmain_in"; then test -f Makefile && make "$ltmain" fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu CC="$lt_save_CC" ;; *) { { echo "$as_me:$LINENO: error: Unsupported tag name: $tagname" >&5 echo "$as_me: error: Unsupported tag name: $tagname" >&2;} { (exit 1); exit 1; }; } ;; esac # Append the new tag name to the list of available tags. if test -n "$tagname" ; then available_tags="$available_tags $tagname" fi fi done IFS="$lt_save_ifs" # Now substitute the updated list of available tags. if eval "sed -e 's/^available_tags=.*\$/available_tags=\"$available_tags\"/' \"$ofile\" > \"${ofile}T\""; then mv "${ofile}T" "$ofile" chmod +x "$ofile" else rm -f "${ofile}T" { { echo "$as_me:$LINENO: error: unable to update list of available tagged configurations." >&5 echo "$as_me: error: unable to update list of available tagged configurations." >&2;} { (exit 1); exit 1; }; } fi fi # This can be used to rebuild libtool when needed LIBTOOL_DEPS="$ac_aux_dir/ltmain.sh" # Always use our own libtool. LIBTOOL='$(SHELL) $(top_builddir)/libtool' # Prevent multiple expansion ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu echo "$as_me:$LINENO: checking for C compiler vendor" >&5 echo $ECHO_N "checking for C compiler vendor... $ECHO_C" >&6 if test "${ax_cv_c_compiler_vendor+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ax_cv_c_compiler_vendor=unknown # note: don't check for gcc first since some other compilers define __GNUC__ for ventest in intel:__ICC,__ECC,__INTEL_COMPILER ibm:__xlc__,__xlC__,__IBMC__,__IBMCPP__ pathscale:__PATHCC__,__PATHSCALE__ gnu:__GNUC__ sun:__SUNPRO_C,__SUNPRO_CC hp:__HP_cc,__HP_aCC dec:__DECC,__DECCXX,__DECC_VER,__DECCXX_VER borland:__BORLANDC__,__TURBOC__ comeau:__COMO__ cray:_CRAYC kai:__KCC lcc:__LCC__ metrowerks:__MWERKS__ sgi:__sgi,sgi microsoft:_MSC_VER watcom:__WATCOMC__ portland:__PGI; do vencpp="defined("`echo $ventest | cut -d: -f2 | sed 's/,/) || defined(/g'`")" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { #if !($vencpp) thisisanerror; #endif ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ax_cv_c_compiler_vendor=`echo $ventest | cut -d: -f1`; break else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext done fi echo "$as_me:$LINENO: result: $ax_cv_c_compiler_vendor" >&5 echo "${ECHO_T}$ax_cv_c_compiler_vendor" >&6 if test "${build}" != "${host}" then # If we are doing a Canadian Cross, in which the host and build systems # are not the same, we set reasonable default values for the tools. CC_FOR_BUILD=${CC_FOR_BUILD-gcc} CPPFLAGS_FOR_BUILD="\$(CPPFLAGS)" CC=${CC-${host_alias}-gcc} CFLAGS=${CFLAGS-"-g -O2"} CXX=${CXX-${host_alias}-c++} CXXFLAGS=${CXXFLAGS-"-g -O2"} else # Set reasonable default values for some tools even if not Canadian. # Of course, these are different reasonable default values, originally # specified directly in the Makefile. # We don't export, so that autoconf can do its job. # Note that all these settings are above the fragment inclusion point # in Makefile.in, so can still be overridden by fragments. # This is all going to change when we autoconfiscate... CC_FOR_BUILD="\$(CC)" CPPFLAGS_FOR_BUILD="\$(CPPFLAGS)" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then echo "$as_me:$LINENO: result: $CC" >&5 echo "${ECHO_T}$CC" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_ac_ct_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 echo "${ECHO_T}$ac_ct_CC" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi CC=$ac_ct_CC else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then echo "$as_me:$LINENO: result: $CC" >&5 echo "${ECHO_T}$CC" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_ac_ct_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="cc" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 echo "${ECHO_T}$ac_ct_CC" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi CC=$ac_ct_CC else CC="$ac_cv_prog_CC" fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then echo "$as_me:$LINENO: result: $CC" >&5 echo "${ECHO_T}$CC" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then echo "$as_me:$LINENO: result: $CC" >&5 echo "${ECHO_T}$CC" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_ac_ct_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 echo "${ECHO_T}$ac_ct_CC" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi test -n "$ac_ct_CC" && break done CC=$ac_ct_CC fi fi test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH See \`config.log' for more details." >&5 echo "$as_me: error: no acceptable C compiler found in \$PATH See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } # Provide some information about the compiler. echo "$as_me:$LINENO:" \ "checking for C compiler version" >&5 ac_compiler=`set X $ac_compile; echo $2` { (eval echo "$as_me:$LINENO: \"$ac_compiler --version &5\"") >&5 (eval $ac_compiler --version &5) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { (eval echo "$as_me:$LINENO: \"$ac_compiler -v &5\"") >&5 (eval $ac_compiler -v &5) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { (eval echo "$as_me:$LINENO: \"$ac_compiler -V &5\"") >&5 (eval $ac_compiler -V &5) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5 echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6 if test "${ac_cv_c_compiler_gnu+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_compiler_gnu=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_compiler_gnu=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5 echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6 GCC=`test $ac_compiler_gnu = yes && echo yes` ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS CFLAGS="-g" echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5 echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6 if test "${ac_cv_prog_cc_g+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_prog_cc_g=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_prog_cc_g=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5 echo "${ECHO_T}$ac_cv_prog_cc_g" >&6 if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi echo "$as_me:$LINENO: checking for $CC option to accept ANSI C" >&5 echo $ECHO_N "checking for $CC option to accept ANSI C... $ECHO_C" >&6 if test "${ac_cv_prog_cc_stdc+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_cv_prog_cc_stdc=no ac_save_CC=$CC cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include #include #include /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std1 is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std1. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF # Don't try gcc -ansi; that turns off useful extensions and # breaks some systems' header files. # AIX -qlanglvl=ansi # Ultrix and OSF/1 -std1 # HP-UX 10.20 and later -Ae # HP-UX older versions -Aa -D_HPUX_SOURCE # SVR4 -Xc -D__EXTENSIONS__ for ac_arg in "" -qlanglvl=ansi -std1 -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_prog_cc_stdc=$ac_arg break else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext done rm -f conftest.$ac_ext conftest.$ac_objext CC=$ac_save_CC fi case "x$ac_cv_prog_cc_stdc" in x|xno) echo "$as_me:$LINENO: result: none needed" >&5 echo "${ECHO_T}none needed" >&6 ;; *) echo "$as_me:$LINENO: result: $ac_cv_prog_cc_stdc" >&5 echo "${ECHO_T}$ac_cv_prog_cc_stdc" >&6 CC="$CC $ac_cv_prog_cc_stdc" ;; esac # Some people use a C++ compiler to compile C. Since we use `exit', # in C++ we need to declare it. In case someone uses the same compiler # for both compiling C and C++ we need to have the C++ compiler decide # the declaration of exit, since it's the most demanding environment. cat >conftest.$ac_ext <<_ACEOF #ifndef __cplusplus choke me #endif _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then for ac_declaration in \ '' \ 'extern "C" void std::exit (int) throw (); using std::exit;' \ 'extern "C" void std::exit (int); using std::exit;' \ 'extern "C" void exit (int) throw ();' \ 'extern "C" void exit (int);' \ 'void exit (int);' do cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_declaration #include int main () { exit (42); ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then : else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 continue fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_declaration int main () { exit (42); ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then break else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext done rm -f conftest* if test -n "$ac_declaration"; then echo '#ifdef __cplusplus' >>confdefs.h echo $ac_declaration >>confdefs.h echo '#endif' >>confdefs.h fi else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu depcc="$CC" am_compiler_list= echo "$as_me:$LINENO: checking dependency style of $depcc" >&5 echo $ECHO_N "checking dependency style of $depcc... $ECHO_C" >&6 if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named `D' -- because `-MD' means `put the output # in D'. mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CC_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with # Solaris 8's {/usr,}/bin/sh. touch sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf case $depmode in nosideeffect) # after this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; none) break ;; esac # We check with `-c' and `-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle `-M -o', and we need to detect this. if depmode=$depmode \ source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CC_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CC_dependencies_compiler_type=none fi fi echo "$as_me:$LINENO: result: $am_cv_CC_dependencies_compiler_type" >&5 echo "${ECHO_T}$am_cv_CC_dependencies_compiler_type" >&6 CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then am__fastdepCC_TRUE= am__fastdepCC_FALSE='#' else am__fastdepCC_TRUE='#' am__fastdepCC_FALSE= fi # We must set the default linker to the linker used by gcc for the correct # operation of libtool. If LD is not defined and we are using gcc, try to # set the LD default to the ld used by gcc. if test -z "$LD" then if test "$GCC" = yes then case $build in *-*-mingw*) gcc_prog_ld=`$CC -print-prog-name=ld 2>&1 | tr -d '\015'` ;; *) gcc_prog_ld=`$CC -print-prog-name=ld 2>&1` ;; esac case $gcc_prog_ld in # Accept absolute paths. [\\/]* | [A-Za-z]:[\\/]*) LD="$gcc_prog_ld" ;; esac fi fi CXX=${CXX-"c++"} CFLAGS=${CFLAGS-"-g -O2"} CXXFLAGS=${CXXFLAGS-"-g -O2"} fi echo "$as_me:$LINENO: checking for an ANSI C-conforming const" >&5 echo $ECHO_N "checking for an ANSI C-conforming const... $ECHO_C" >&6 if test "${ac_cv_c_const+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { /* FIXME: Include the comments suggested by Paul. */ #ifndef __cplusplus /* Ultrix mips cc rejects this. */ typedef int charset[2]; const charset x; /* SunOS 4.1.1 cc rejects this. */ char const *const *ccp; char **p; /* NEC SVR4.0.2 mips cc rejects this. */ struct point {int x, y;}; static struct point const zero = {0,0}; /* AIX XL C 1.02.0.0 rejects this. It does not let you subtract one const X* pointer from another in an arm of an if-expression whose if-part is not a constant expression */ const char *g = "string"; ccp = &g + (g ? g-g : 0); /* HPUX 7.0 cc rejects these. */ ++ccp; p = (char**) ccp; ccp = (char const *const *) p; { /* SCO 3.2v4 cc rejects this. */ char *t; char const *s = 0 ? (char *) 0 : (char const *) 0; *t++ = 0; } { /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */ int x[] = {25, 17}; const int *foo = &x[0]; ++foo; } { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */ typedef const int *iptr; iptr p = 0; ++p; } { /* AIX XL C 1.02.0.0 rejects this saying "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ struct s { int j; const int *ap[3]; }; struct s *b; b->j = 5; } { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ const int foo = 10; } #endif ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_c_const=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_c_const=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_c_const" >&5 echo "${ECHO_T}$ac_cv_c_const" >&6 if test $ac_cv_c_const = no; then cat >>confdefs.h <<\_ACEOF #define const _ACEOF fi echo "$as_me:$LINENO: checking for inline" >&5 echo $ECHO_N "checking for inline... $ECHO_C" >&6 if test "${ac_cv_c_inline+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_cv_c_inline=no for ac_kw in inline __inline__ __inline; do cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #ifndef __cplusplus typedef int foo_t; static $ac_kw foo_t static_foo () {return 0; } $ac_kw foo_t foo () {return 0; } #endif _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_c_inline=$ac_kw; break else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext done fi echo "$as_me:$LINENO: result: $ac_cv_c_inline" >&5 echo "${ECHO_T}$ac_cv_c_inline" >&6 case $ac_cv_c_inline in inline | yes) ;; *) case $ac_cv_c_inline in no) ac_val=;; *) ac_val=$ac_cv_c_inline;; esac cat >>confdefs.h <<_ACEOF #ifndef __cplusplus #define inline $ac_val #endif _ACEOF ;; esac echo "$as_me:$LINENO: checking for working volatile" >&5 echo $ECHO_N "checking for working volatile... $ECHO_C" >&6 if test "${ac_cv_c_volatile+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { volatile int x; int * volatile y; ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_c_volatile=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_c_volatile=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_c_volatile" >&5 echo "${ECHO_T}$ac_cv_c_volatile" >&6 if test $ac_cv_c_volatile = no; then cat >>confdefs.h <<\_ACEOF #define volatile _ACEOF fi echo "$as_me:$LINENO: checking for long long" >&5 echo $ECHO_N "checking for long long... $ECHO_C" >&6 if test "${ac_cv_type_long_long+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { if ((long long *) 0) return 0; if (sizeof (long long)) return 0; ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_type_long_long=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_type_long_long=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_type_long_long" >&5 echo "${ECHO_T}$ac_cv_type_long_long" >&6 if test $ac_cv_type_long_long = yes; then cat >>confdefs.h <<_ACEOF #define HAVE_LONG_LONG 1 _ACEOF fi echo "$as_me:$LINENO: checking for long double" >&5 echo $ECHO_N "checking for long double... $ECHO_C" >&6 if test "${ac_cv_type_long_double+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { if ((long double *) 0) return 0; if (sizeof (long double)) return 0; ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_type_long_double=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_type_long_double=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_type_long_double" >&5 echo "${ECHO_T}$ac_cv_type_long_double" >&6 if test $ac_cv_type_long_double = yes; then cat >>confdefs.h <<_ACEOF #define HAVE_LONG_DOUBLE 1 _ACEOF fi echo "$as_me:$LINENO: checking return type of signal handlers" >&5 echo $ECHO_N "checking return type of signal handlers... $ECHO_C" >&6 if test "${ac_cv_type_signal+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include #ifdef signal # undef signal #endif #ifdef __cplusplus extern "C" void (*signal (int, void (*)(int)))(int); #else void (*signal ()) (); #endif int main () { int i; ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_type_signal=void else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_type_signal=int fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_type_signal" >&5 echo "${ECHO_T}$ac_cv_type_signal" >&6 cat >>confdefs.h <<_ACEOF #define RETSIGTYPE $ac_cv_type_signal _ACEOF # Check whether --enable-doc or --disable-doc was given. if test "${enable_doc+set}" = set; then enableval="$enable_doc" fi; # Check whether --enable-tests or --disable-tests was given. if test "${enable_tests+set}" = set; then enableval="$enable_tests" fi; # Check whether --enable-test_data or --disable-test_data was given. if test "${enable_test_data+set}" = set; then enableval="$enable_test_data" fi; # Check whether --enable-mmx or --disable-mmx was given. if test "${enable_mmx+set}" = set; then enableval="$enable_mmx" fi; # Check whether --enable-sse or --disable-sse was given. if test "${enable_sse+set}" = set; then enableval="$enable_sse" fi; # Check whether --enable-fixed_point or --disable-fixed_point was given. if test "${enable_fixed_point+set}" = set; then enableval="$enable_fixed_point" fi; echo "$as_me:$LINENO: checking for error_at_line" >&5 echo $ECHO_N "checking for error_at_line... $ECHO_C" >&6 if test "${ac_cv_lib_error_at_line+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { error_at_line (0, 0, "", 0, ""); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_lib_error_at_line=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_error_at_line=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_lib_error_at_line" >&5 echo "${ECHO_T}$ac_cv_lib_error_at_line" >&6 if test $ac_cv_lib_error_at_line = no; then case $LIBOBJS in "error.$ac_objext" | \ *" error.$ac_objext" | \ "error.$ac_objext "* | \ *" error.$ac_objext "* ) ;; *) LIBOBJS="$LIBOBJS error.$ac_objext" ;; esac fi for ac_func in vprintf do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` echo "$as_me:$LINENO: checking for $ac_func" >&5 echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 if eval "test \"\${$as_ac_var+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Define $ac_func to an innocuous variant, in case declares $ac_func. For example, HP-UX 11i declares gettimeofday. */ #define $ac_func innocuous_$ac_func /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $ac_func (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $ac_func /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" { #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined (__stub_$ac_func) || defined (__stub___$ac_func) choke me #else char (*f) () = $ac_func; #endif #ifdef __cplusplus } #endif int main () { return f != $ac_func; ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 eval "$as_ac_var=no" fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF echo "$as_me:$LINENO: checking for _doprnt" >&5 echo $ECHO_N "checking for _doprnt... $ECHO_C" >&6 if test "${ac_cv_func__doprnt+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Define _doprnt to an innocuous variant, in case declares _doprnt. For example, HP-UX 11i declares gettimeofday. */ #define _doprnt innocuous__doprnt /* System header to define __stub macros and hopefully few prototypes, which can conflict with char _doprnt (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef _doprnt /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" { #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char _doprnt (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined (__stub__doprnt) || defined (__stub____doprnt) choke me #else char (*f) () = _doprnt; #endif #ifdef __cplusplus } #endif int main () { return f != _doprnt; ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_func__doprnt=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_func__doprnt=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_func__doprnt" >&5 echo "${ECHO_T}$ac_cv_func__doprnt" >&6 if test $ac_cv_func__doprnt = yes; then cat >>confdefs.h <<\_ACEOF #define HAVE_DOPRNT 1 _ACEOF fi fi done for ac_header in stdlib.h do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` if eval "test \"\${$as_ac_Header+set}\" = set"; then echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 else # Is the header compilable? echo "$as_me:$LINENO: checking $ac_header usability" >&5 echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_header_compiler=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_compiler=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 echo "${ECHO_T}$ac_header_compiler" >&6 # Is the header present? echo "$as_me:$LINENO: checking $ac_header presence" >&5 echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include <$ac_header> _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then ac_header_preproc=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_preproc=no fi rm -f conftest.err conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 echo "${ECHO_T}$ac_header_preproc" >&6 # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in yes:no: ) { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} ac_header_preproc=yes ;; no:yes:* ) { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} ( cat <<\_ASBOX ## ------------------------------------------ ## ## Report this to the AC_PACKAGE_NAME lists. ## ## ------------------------------------------ ## _ASBOX ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else eval "$as_ac_Header=\$ac_header_preproc" fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 fi if test `eval echo '${'$as_ac_Header'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done echo "$as_me:$LINENO: checking for GNU libc compatible malloc" >&5 echo $ECHO_N "checking for GNU libc compatible malloc... $ECHO_C" >&6 if test "${ac_cv_func_malloc_0_nonnull+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test "$cross_compiling" = yes; then ac_cv_func_malloc_0_nonnull=no else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #if STDC_HEADERS || HAVE_STDLIB_H # include #else char *malloc (); #endif int main () { exit (malloc (0) ? 0 : 1); ; return 0; } _ACEOF rm -f conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='./conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_func_malloc_0_nonnull=yes else echo "$as_me: program exited with status $ac_status" >&5 echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ( exit $ac_status ) ac_cv_func_malloc_0_nonnull=no fi rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi fi echo "$as_me:$LINENO: result: $ac_cv_func_malloc_0_nonnull" >&5 echo "${ECHO_T}$ac_cv_func_malloc_0_nonnull" >&6 if test $ac_cv_func_malloc_0_nonnull = yes; then cat >>confdefs.h <<\_ACEOF #define HAVE_MALLOC 1 _ACEOF else cat >>confdefs.h <<\_ACEOF #define HAVE_MALLOC 0 _ACEOF case $LIBOBJS in "malloc.$ac_objext" | \ *" malloc.$ac_objext" | \ "malloc.$ac_objext "* | \ *" malloc.$ac_objext "* ) ;; *) LIBOBJS="$LIBOBJS malloc.$ac_objext" ;; esac cat >>confdefs.h <<\_ACEOF #define malloc rpl_malloc _ACEOF fi echo "$as_me:$LINENO: checking for working memcmp" >&5 echo $ECHO_N "checking for working memcmp... $ECHO_C" >&6 if test "${ac_cv_func_memcmp_working+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test "$cross_compiling" = yes; then ac_cv_func_memcmp_working=no else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { /* Some versions of memcmp are not 8-bit clean. */ char c0 = 0x40, c1 = 0x80, c2 = 0x81; if (memcmp(&c0, &c2, 1) >= 0 || memcmp(&c1, &c2, 1) >= 0) exit (1); /* The Next x86 OpenStep bug shows up only when comparing 16 bytes or more and with at least one buffer not starting on a 4-byte boundary. William Lewis provided this test program. */ { char foo[21]; char bar[21]; int i; for (i = 0; i < 4; i++) { char *a = foo + i; char *b = bar + i; strcpy (a, "--------01111111"); strcpy (b, "--------10000000"); if (memcmp (a, b, 16) >= 0) exit (1); } exit (0); } ; return 0; } _ACEOF rm -f conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='./conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_func_memcmp_working=yes else echo "$as_me: program exited with status $ac_status" >&5 echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ( exit $ac_status ) ac_cv_func_memcmp_working=no fi rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi fi echo "$as_me:$LINENO: result: $ac_cv_func_memcmp_working" >&5 echo "${ECHO_T}$ac_cv_func_memcmp_working" >&6 test $ac_cv_func_memcmp_working = no && case $LIBOBJS in "memcmp.$ac_objext" | \ *" memcmp.$ac_objext" | \ "memcmp.$ac_objext "* | \ *" memcmp.$ac_objext "* ) ;; *) LIBOBJS="$LIBOBJS memcmp.$ac_objext" ;; esac for ac_header in stdlib.h do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` if eval "test \"\${$as_ac_Header+set}\" = set"; then echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 else # Is the header compilable? echo "$as_me:$LINENO: checking $ac_header usability" >&5 echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_header_compiler=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_compiler=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 echo "${ECHO_T}$ac_header_compiler" >&6 # Is the header present? echo "$as_me:$LINENO: checking $ac_header presence" >&5 echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include <$ac_header> _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then ac_header_preproc=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_preproc=no fi rm -f conftest.err conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 echo "${ECHO_T}$ac_header_preproc" >&6 # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in yes:no: ) { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} ac_header_preproc=yes ;; no:yes:* ) { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} ( cat <<\_ASBOX ## ------------------------------------------ ## ## Report this to the AC_PACKAGE_NAME lists. ## ## ------------------------------------------ ## _ASBOX ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else eval "$as_ac_Header=\$ac_header_preproc" fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 fi if test `eval echo '${'$as_ac_Header'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done echo "$as_me:$LINENO: checking for GNU libc compatible realloc" >&5 echo $ECHO_N "checking for GNU libc compatible realloc... $ECHO_C" >&6 if test "${ac_cv_func_realloc_0_nonnull+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test "$cross_compiling" = yes; then ac_cv_func_realloc_0_nonnull=no else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #if STDC_HEADERS || HAVE_STDLIB_H # include #else char *realloc (); #endif int main () { exit (realloc (0, 0) ? 0 : 1); ; return 0; } _ACEOF rm -f conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='./conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_func_realloc_0_nonnull=yes else echo "$as_me: program exited with status $ac_status" >&5 echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ( exit $ac_status ) ac_cv_func_realloc_0_nonnull=no fi rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi fi echo "$as_me:$LINENO: result: $ac_cv_func_realloc_0_nonnull" >&5 echo "${ECHO_T}$ac_cv_func_realloc_0_nonnull" >&6 if test $ac_cv_func_realloc_0_nonnull = yes; then cat >>confdefs.h <<\_ACEOF #define HAVE_REALLOC 1 _ACEOF else cat >>confdefs.h <<\_ACEOF #define HAVE_REALLOC 0 _ACEOF case $LIBOBJS in "realloc.$ac_objext" | \ *" realloc.$ac_objext" | \ "realloc.$ac_objext "* | \ *" realloc.$ac_objext "* ) ;; *) LIBOBJS="$LIBOBJS realloc.$ac_objext" ;; esac cat >>confdefs.h <<\_ACEOF #define realloc rpl_realloc _ACEOF fi for ac_header in sys/select.h sys/socket.h do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` if eval "test \"\${$as_ac_Header+set}\" = set"; then echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 else # Is the header compilable? echo "$as_me:$LINENO: checking $ac_header usability" >&5 echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_header_compiler=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_compiler=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 echo "${ECHO_T}$ac_header_compiler" >&6 # Is the header present? echo "$as_me:$LINENO: checking $ac_header presence" >&5 echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include <$ac_header> _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then ac_header_preproc=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_preproc=no fi rm -f conftest.err conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 echo "${ECHO_T}$ac_header_preproc" >&6 # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in yes:no: ) { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} ac_header_preproc=yes ;; no:yes:* ) { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} ( cat <<\_ASBOX ## ------------------------------------------ ## ## Report this to the AC_PACKAGE_NAME lists. ## ## ------------------------------------------ ## _ASBOX ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else eval "$as_ac_Header=\$ac_header_preproc" fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 fi if test `eval echo '${'$as_ac_Header'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done echo "$as_me:$LINENO: checking types of arguments for select" >&5 echo $ECHO_N "checking types of arguments for select... $ECHO_C" >&6 if test "${ac_cv_func_select_args+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else for ac_arg234 in 'fd_set *' 'int *' 'void *'; do for ac_arg1 in 'int' 'size_t' 'unsigned long' 'unsigned'; do for ac_arg5 in 'struct timeval *' 'const struct timeval *'; do cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default #if HAVE_SYS_SELECT_H # include #endif #if HAVE_SYS_SOCKET_H # include #endif int main () { extern int select ($ac_arg1, $ac_arg234, $ac_arg234, $ac_arg234, $ac_arg5); ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_func_select_args="$ac_arg1,$ac_arg234,$ac_arg5"; break 3 else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext done done done # Provide a safe default value. : ${ac_cv_func_select_args='int,int *,struct timeval *'} fi echo "$as_me:$LINENO: result: $ac_cv_func_select_args" >&5 echo "${ECHO_T}$ac_cv_func_select_args" >&6 ac_save_IFS=$IFS; IFS=',' set dummy `echo "$ac_cv_func_select_args" | sed 's/\*/\*/g'` IFS=$ac_save_IFS shift cat >>confdefs.h <<_ACEOF #define SELECT_TYPE_ARG1 $1 _ACEOF cat >>confdefs.h <<_ACEOF #define SELECT_TYPE_ARG234 ($2) _ACEOF cat >>confdefs.h <<_ACEOF #define SELECT_TYPE_ARG5 ($3) _ACEOF rm -f conftest* echo "$as_me:$LINENO: checking for lrint" >&5 echo $ECHO_N "checking for lrint... $ECHO_C" >&6 if test "${ac_cv_c99_lrint+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lrint_save_CFLAGS=$CFLAGS CFLAGS="-lm" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #define _ISOC9X_SOURCE 1 #define _ISOC99_SOURCE 1 #define __USE_ISOC99 1 #define __USE_ISOC9X 1 #include int main () { if (!lrint(3.14159)) lrint(2.7183); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_c99_lrint=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_c99_lrint=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext CFLAGS=$lrint_save_CFLAGS fi echo "$as_me:$LINENO: result: $ac_cv_c99_lrint" >&5 echo "${ECHO_T}$ac_cv_c99_lrint" >&6 if test "$ac_cv_c99_lrint" = yes; then cat >>confdefs.h <<\_ACEOF #define HAVE_LRINT 1 _ACEOF fi echo "$as_me:$LINENO: checking for lrintf" >&5 echo $ECHO_N "checking for lrintf... $ECHO_C" >&6 if test "${ac_cv_c99_lrintf+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lrintf_save_CFLAGS=$CFLAGS CFLAGS="-lm" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #define _ISOC9X_SOURCE 1 #define _ISOC99_SOURCE 1 #define __USE_ISOC99 1 #define __USE_ISOC9X 1 #include int main () { if (!lrintf(3.14159)) lrintf(2.7183); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_c99_lrintf=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_c99_lrintf=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext CFLAGS=$lrintf_save_CFLAGS fi echo "$as_me:$LINENO: result: $ac_cv_c99_lrintf" >&5 echo "${ECHO_T}$ac_cv_c99_lrintf" >&6 if test "$ac_cv_c99_lrintf" = yes; then cat >>confdefs.h <<\_ACEOF #define HAVE_LRINTF 1 _ACEOF fi echo "$as_me:$LINENO: checking for llrint" >&5 echo $ECHO_N "checking for llrint... $ECHO_C" >&6 if test "${ac_cv_c99_llrint+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else llrint_save_CFLAGS=$CFLAGS CFLAGS="-lm" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #define ISOC9X_SOURCE 1 #define _ISOC99_SOURCE 1 #define __USE_ISOC99 1 #define __USE_ISOC9X 1 #include int main () { long long int x ; x = llrint(3.14159) ; ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_c99_llrint=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_c99_llrint=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext CFLAGS=$llrint_save_CFLAGS fi echo "$as_me:$LINENO: result: $ac_cv_c99_llrint" >&5 echo "${ECHO_T}$ac_cv_c99_llrint" >&6 if test "$ac_cv_c99_llrint" = yes; then cat >>confdefs.h <<\_ACEOF #define HAVE_LLRINT 1 _ACEOF fi echo "$as_me:$LINENO: checking for llrintf" >&5 echo $ECHO_N "checking for llrintf... $ECHO_C" >&6 if test "${ac_cv_c99_llrintf+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else llrintf_save_CFLAGS=$CFLAGS CFLAGS="-lm" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #define _ISOC9X_SOURCE 1 #define _ISOC99_SOURCE 1 #define __USE_ISOC99 1 #define __USE_ISOC9X 1 #include int main () { long long int x ; x = llrintf(3.14159) ; ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_c99_llrintf=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_c99_llrintf=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext CFLAGS=$llrintf_save_CFLAGS fi echo "$as_me:$LINENO: result: $ac_cv_c99_llrintf" >&5 echo "${ECHO_T}$ac_cv_c99_llrintf" >&6 if test "$ac_cv_c99_llrintf" = yes; then cat >>confdefs.h <<\_ACEOF #define HAVE_LLRINTF 1 _ACEOF fi if test "x$ac_cv_c99_lrint" = "xno" ; then if test "x$ac_cv_c99_lrintf" = "xno" ; then { echo "$as_me:$LINENO: WARNING: *** Missing C99 standard functions lrint() and lrintf()." >&5 echo "$as_me: WARNING: *** Missing C99 standard functions lrint() and lrintf()." >&2;} { echo "$as_me:$LINENO: WARNING: *** This may cause benign compiler warnings on some systems (ie Solaris)." >&5 echo "$as_me: WARNING: *** This may cause benign compiler warnings on some systems (ie Solaris)." >&2;} fi fi echo "$as_me:$LINENO: checking C99 struct flexible array support" >&5 echo $ECHO_N "checking C99 struct flexible array support... $ECHO_C" >&6 if test "${ac_cv_c99_flexible_array+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else # Initialize to unknown ac_cv_c99_flexible_array=no cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include typedef struct { int k; char buffer [] ; } MY_STRUCT ; int main () { MY_STRUCT *p = calloc (1, sizeof (MY_STRUCT) + 42); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_c99_flexible_array=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_c99_flexible_array=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_c99_flexible_array" >&5 echo "${ECHO_T}$ac_cv_c99_flexible_array" >&6 for ac_func in memmove do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` echo "$as_me:$LINENO: checking for $ac_func" >&5 echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 if eval "test \"\${$as_ac_var+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Define $ac_func to an innocuous variant, in case declares $ac_func. For example, HP-UX 11i declares gettimeofday. */ #define $ac_func innocuous_$ac_func /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $ac_func (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $ac_func /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" { #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined (__stub_$ac_func) || defined (__stub___$ac_func) choke me #else char (*f) () = $ac_func; #endif #ifdef __cplusplus } #endif int main () { return f != $ac_func; ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 eval "$as_ac_var=no" fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done for ac_func in memset do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` echo "$as_me:$LINENO: checking for $ac_func" >&5 echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 if eval "test \"\${$as_ac_var+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Define $ac_func to an innocuous variant, in case declares $ac_func. For example, HP-UX 11i declares gettimeofday. */ #define $ac_func innocuous_$ac_func /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $ac_func (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $ac_func /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" { #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined (__stub_$ac_func) || defined (__stub___$ac_func) choke me #else char (*f) () = $ac_func; #endif #ifdef __cplusplus } #endif int main () { return f != $ac_func; ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 eval "$as_ac_var=no" fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done for ac_func in select do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` echo "$as_me:$LINENO: checking for $ac_func" >&5 echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 if eval "test \"\${$as_ac_var+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Define $ac_func to an innocuous variant, in case declares $ac_func. For example, HP-UX 11i declares gettimeofday. */ #define $ac_func innocuous_$ac_func /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $ac_func (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $ac_func /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" { #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined (__stub_$ac_func) || defined (__stub___$ac_func) choke me #else char (*f) () = $ac_func; #endif #ifdef __cplusplus } #endif int main () { return f != $ac_func; ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 eval "$as_ac_var=no" fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done for ac_func in strcasecmp do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` echo "$as_me:$LINENO: checking for $ac_func" >&5 echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 if eval "test \"\${$as_ac_var+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Define $ac_func to an innocuous variant, in case declares $ac_func. For example, HP-UX 11i declares gettimeofday. */ #define $ac_func innocuous_$ac_func /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $ac_func (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $ac_func /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" { #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined (__stub_$ac_func) || defined (__stub___$ac_func) choke me #else char (*f) () = $ac_func; #endif #ifdef __cplusplus } #endif int main () { return f != $ac_func; ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 eval "$as_ac_var=no" fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done for ac_func in strchr do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` echo "$as_me:$LINENO: checking for $ac_func" >&5 echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 if eval "test \"\${$as_ac_var+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Define $ac_func to an innocuous variant, in case declares $ac_func. For example, HP-UX 11i declares gettimeofday. */ #define $ac_func innocuous_$ac_func /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $ac_func (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $ac_func /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" { #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined (__stub_$ac_func) || defined (__stub___$ac_func) choke me #else char (*f) () = $ac_func; #endif #ifdef __cplusplus } #endif int main () { return f != $ac_func; ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 eval "$as_ac_var=no" fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done for ac_func in strdup do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` echo "$as_me:$LINENO: checking for $ac_func" >&5 echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 if eval "test \"\${$as_ac_var+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Define $ac_func to an innocuous variant, in case declares $ac_func. For example, HP-UX 11i declares gettimeofday. */ #define $ac_func innocuous_$ac_func /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $ac_func (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $ac_func /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" { #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined (__stub_$ac_func) || defined (__stub___$ac_func) choke me #else char (*f) () = $ac_func; #endif #ifdef __cplusplus } #endif int main () { return f != $ac_func; ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 eval "$as_ac_var=no" fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done for ac_func in strerror do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` echo "$as_me:$LINENO: checking for $ac_func" >&5 echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 if eval "test \"\${$as_ac_var+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Define $ac_func to an innocuous variant, in case declares $ac_func. For example, HP-UX 11i declares gettimeofday. */ #define $ac_func innocuous_$ac_func /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $ac_func (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $ac_func /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" { #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined (__stub_$ac_func) || defined (__stub___$ac_func) choke me #else char (*f) () = $ac_func; #endif #ifdef __cplusplus } #endif int main () { return f != $ac_func; ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 eval "$as_ac_var=no" fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done for ac_func in strstr do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` echo "$as_me:$LINENO: checking for $ac_func" >&5 echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 if eval "test \"\${$as_ac_var+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Define $ac_func to an innocuous variant, in case declares $ac_func. For example, HP-UX 11i declares gettimeofday. */ #define $ac_func innocuous_$ac_func /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $ac_func (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $ac_func /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" { #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined (__stub_$ac_func) || defined (__stub___$ac_func) choke me #else char (*f) () = $ac_func; #endif #ifdef __cplusplus } #endif int main () { return f != $ac_func; ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 eval "$as_ac_var=no" fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done for ac_func in strtol do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` echo "$as_me:$LINENO: checking for $ac_func" >&5 echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 if eval "test \"\${$as_ac_var+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Define $ac_func to an innocuous variant, in case declares $ac_func. For example, HP-UX 11i declares gettimeofday. */ #define $ac_func innocuous_$ac_func /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $ac_func (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $ac_func /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" { #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined (__stub_$ac_func) || defined (__stub___$ac_func) choke me #else char (*f) () = $ac_func; #endif #ifdef __cplusplus } #endif int main () { return f != $ac_func; ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 eval "$as_ac_var=no" fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done for ac_func in gettimeofday do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` echo "$as_me:$LINENO: checking for $ac_func" >&5 echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 if eval "test \"\${$as_ac_var+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Define $ac_func to an innocuous variant, in case declares $ac_func. For example, HP-UX 11i declares gettimeofday. */ #define $ac_func innocuous_$ac_func /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $ac_func (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $ac_func /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" { #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined (__stub_$ac_func) || defined (__stub___$ac_func) choke me #else char (*f) () = $ac_func; #endif #ifdef __cplusplus } #endif int main () { return f != $ac_func; ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 eval "$as_ac_var=no" fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done echo "$as_me:$LINENO: checking for ANSI C header files" >&5 echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6 if test "${ac_cv_header_stdc+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_header_stdc=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_header_stdc=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) exit(2); exit (0); } _ACEOF rm -f conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='./conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then : else echo "$as_me: program exited with status $ac_status" >&5 echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ( exit $ac_status ) ac_cv_header_stdc=no fi rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi fi fi echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5 echo "${ECHO_T}$ac_cv_header_stdc" >&6 if test $ac_cv_header_stdc = yes; then cat >>confdefs.h <<\_ACEOF #define STDC_HEADERS 1 _ACEOF fi echo "$as_me:$LINENO: checking for sys/wait.h that is POSIX.1 compatible" >&5 echo $ECHO_N "checking for sys/wait.h that is POSIX.1 compatible... $ECHO_C" >&6 if test "${ac_cv_header_sys_wait_h+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include #ifndef WEXITSTATUS # define WEXITSTATUS(stat_val) ((unsigned)(stat_val) >> 8) #endif #ifndef WIFEXITED # define WIFEXITED(stat_val) (((stat_val) & 255) == 0) #endif int main () { int s; wait (&s); s = WIFEXITED (s) ? WEXITSTATUS (s) : 1; ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_header_sys_wait_h=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_header_sys_wait_h=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_header_sys_wait_h" >&5 echo "${ECHO_T}$ac_cv_header_sys_wait_h" >&6 if test $ac_cv_header_sys_wait_h = yes; then cat >>confdefs.h <<\_ACEOF #define HAVE_SYS_WAIT_H 1 _ACEOF fi echo "$as_me:$LINENO: checking whether time.h and sys/time.h may both be included" >&5 echo $ECHO_N "checking whether time.h and sys/time.h may both be included... $ECHO_C" >&6 if test "${ac_cv_header_time+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include #include int main () { if ((struct tm *) 0) return 0; ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_header_time=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_header_time=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_header_time" >&5 echo "${ECHO_T}$ac_cv_header_time" >&6 if test $ac_cv_header_time = yes; then cat >>confdefs.h <<\_ACEOF #define TIME_WITH_SYS_TIME 1 _ACEOF fi # Check for header files. for ac_header in socket.h do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` if eval "test \"\${$as_ac_Header+set}\" = set"; then echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 else # Is the header compilable? echo "$as_me:$LINENO: checking $ac_header usability" >&5 echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_header_compiler=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_compiler=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 echo "${ECHO_T}$ac_header_compiler" >&6 # Is the header present? echo "$as_me:$LINENO: checking $ac_header presence" >&5 echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include <$ac_header> _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then ac_header_preproc=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_preproc=no fi rm -f conftest.err conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 echo "${ECHO_T}$ac_header_preproc" >&6 # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in yes:no: ) { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} ac_header_preproc=yes ;; no:yes:* ) { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} ( cat <<\_ASBOX ## ------------------------------------------ ## ## Report this to the AC_PACKAGE_NAME lists. ## ## ------------------------------------------ ## _ASBOX ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else eval "$as_ac_Header=\$ac_header_preproc" fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 fi if test `eval echo '${'$as_ac_Header'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in inttypes.h do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` if eval "test \"\${$as_ac_Header+set}\" = set"; then echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 else # Is the header compilable? echo "$as_me:$LINENO: checking $ac_header usability" >&5 echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_header_compiler=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_compiler=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 echo "${ECHO_T}$ac_header_compiler" >&6 # Is the header present? echo "$as_me:$LINENO: checking $ac_header presence" >&5 echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include <$ac_header> _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then ac_header_preproc=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_preproc=no fi rm -f conftest.err conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 echo "${ECHO_T}$ac_header_preproc" >&6 # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in yes:no: ) { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} ac_header_preproc=yes ;; no:yes:* ) { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} ( cat <<\_ASBOX ## ------------------------------------------ ## ## Report this to the AC_PACKAGE_NAME lists. ## ## ------------------------------------------ ## _ASBOX ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else eval "$as_ac_Header=\$ac_header_preproc" fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 fi if test `eval echo '${'$as_ac_Header'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF INSERT_INTTYPES_HEADER="#include " fi done for ac_header in stdint.h do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` if eval "test \"\${$as_ac_Header+set}\" = set"; then echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 else # Is the header compilable? echo "$as_me:$LINENO: checking $ac_header usability" >&5 echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_header_compiler=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_compiler=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 echo "${ECHO_T}$ac_header_compiler" >&6 # Is the header present? echo "$as_me:$LINENO: checking $ac_header presence" >&5 echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include <$ac_header> _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then ac_header_preproc=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_preproc=no fi rm -f conftest.err conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 echo "${ECHO_T}$ac_header_preproc" >&6 # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in yes:no: ) { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} ac_header_preproc=yes ;; no:yes:* ) { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} ( cat <<\_ASBOX ## ------------------------------------------ ## ## Report this to the AC_PACKAGE_NAME lists. ## ## ------------------------------------------ ## _ASBOX ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else eval "$as_ac_Header=\$ac_header_preproc" fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 fi if test `eval echo '${'$as_ac_Header'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF INSERT_STDINT_HEADER="#include " fi done for ac_header in unistd.h do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` if eval "test \"\${$as_ac_Header+set}\" = set"; then echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 else # Is the header compilable? echo "$as_me:$LINENO: checking $ac_header usability" >&5 echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_header_compiler=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_compiler=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 echo "${ECHO_T}$ac_header_compiler" >&6 # Is the header present? echo "$as_me:$LINENO: checking $ac_header presence" >&5 echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include <$ac_header> _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then ac_header_preproc=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_preproc=no fi rm -f conftest.err conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 echo "${ECHO_T}$ac_header_preproc" >&6 # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in yes:no: ) { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} ac_header_preproc=yes ;; no:yes:* ) { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} ( cat <<\_ASBOX ## ------------------------------------------ ## ## Report this to the AC_PACKAGE_NAME lists. ## ## ------------------------------------------ ## _ASBOX ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else eval "$as_ac_Header=\$ac_header_preproc" fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 fi if test `eval echo '${'$as_ac_Header'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in stdlib.h do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` if eval "test \"\${$as_ac_Header+set}\" = set"; then echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 else # Is the header compilable? echo "$as_me:$LINENO: checking $ac_header usability" >&5 echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_header_compiler=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_compiler=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 echo "${ECHO_T}$ac_header_compiler" >&6 # Is the header present? echo "$as_me:$LINENO: checking $ac_header presence" >&5 echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include <$ac_header> _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then ac_header_preproc=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_preproc=no fi rm -f conftest.err conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 echo "${ECHO_T}$ac_header_preproc" >&6 # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in yes:no: ) { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} ac_header_preproc=yes ;; no:yes:* ) { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} ( cat <<\_ASBOX ## ------------------------------------------ ## ## Report this to the AC_PACKAGE_NAME lists. ## ## ------------------------------------------ ## _ASBOX ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else eval "$as_ac_Header=\$ac_header_preproc" fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 fi if test `eval echo '${'$as_ac_Header'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in string.h do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` if eval "test \"\${$as_ac_Header+set}\" = set"; then echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 else # Is the header compilable? echo "$as_me:$LINENO: checking $ac_header usability" >&5 echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_header_compiler=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_compiler=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 echo "${ECHO_T}$ac_header_compiler" >&6 # Is the header present? echo "$as_me:$LINENO: checking $ac_header presence" >&5 echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include <$ac_header> _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then ac_header_preproc=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_preproc=no fi rm -f conftest.err conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 echo "${ECHO_T}$ac_header_preproc" >&6 # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in yes:no: ) { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} ac_header_preproc=yes ;; no:yes:* ) { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} ( cat <<\_ASBOX ## ------------------------------------------ ## ## Report this to the AC_PACKAGE_NAME lists. ## ## ------------------------------------------ ## _ASBOX ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else eval "$as_ac_Header=\$ac_header_preproc" fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 fi if test `eval echo '${'$as_ac_Header'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in strings.h do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` if eval "test \"\${$as_ac_Header+set}\" = set"; then echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 else # Is the header compilable? echo "$as_me:$LINENO: checking $ac_header usability" >&5 echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_header_compiler=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_compiler=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 echo "${ECHO_T}$ac_header_compiler" >&6 # Is the header present? echo "$as_me:$LINENO: checking $ac_header presence" >&5 echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include <$ac_header> _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then ac_header_preproc=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_preproc=no fi rm -f conftest.err conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 echo "${ECHO_T}$ac_header_preproc" >&6 # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in yes:no: ) { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} ac_header_preproc=yes ;; no:yes:* ) { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} ( cat <<\_ASBOX ## ------------------------------------------ ## ## Report this to the AC_PACKAGE_NAME lists. ## ## ------------------------------------------ ## _ASBOX ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else eval "$as_ac_Header=\$ac_header_preproc" fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 fi if test `eval echo '${'$as_ac_Header'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in malloc.h do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` if eval "test \"\${$as_ac_Header+set}\" = set"; then echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 else # Is the header compilable? echo "$as_me:$LINENO: checking $ac_header usability" >&5 echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_header_compiler=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_compiler=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 echo "${ECHO_T}$ac_header_compiler" >&6 # Is the header present? echo "$as_me:$LINENO: checking $ac_header presence" >&5 echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include <$ac_header> _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then ac_header_preproc=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_preproc=no fi rm -f conftest.err conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 echo "${ECHO_T}$ac_header_preproc" >&6 # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in yes:no: ) { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} ac_header_preproc=yes ;; no:yes:* ) { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} ( cat <<\_ASBOX ## ------------------------------------------ ## ## Report this to the AC_PACKAGE_NAME lists. ## ## ------------------------------------------ ## _ASBOX ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else eval "$as_ac_Header=\$ac_header_preproc" fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 fi if test `eval echo '${'$as_ac_Header'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in tgmath.h do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` if eval "test \"\${$as_ac_Header+set}\" = set"; then echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 else # Is the header compilable? echo "$as_me:$LINENO: checking $ac_header usability" >&5 echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_header_compiler=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_compiler=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 echo "${ECHO_T}$ac_header_compiler" >&6 # Is the header present? echo "$as_me:$LINENO: checking $ac_header presence" >&5 echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include <$ac_header> _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then ac_header_preproc=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_preproc=no fi rm -f conftest.err conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 echo "${ECHO_T}$ac_header_preproc" >&6 # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in yes:no: ) { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} ac_header_preproc=yes ;; no:yes:* ) { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} ( cat <<\_ASBOX ## ------------------------------------------ ## ## Report this to the AC_PACKAGE_NAME lists. ## ## ------------------------------------------ ## _ASBOX ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else eval "$as_ac_Header=\$ac_header_preproc" fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 fi if test `eval echo '${'$as_ac_Header'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF INSERT_TGMATH_HEADER="#include " fi done for ac_header in math.h do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` if eval "test \"\${$as_ac_Header+set}\" = set"; then echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 else # Is the header compilable? echo "$as_me:$LINENO: checking $ac_header usability" >&5 echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_header_compiler=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_compiler=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 echo "${ECHO_T}$ac_header_compiler" >&6 # Is the header present? echo "$as_me:$LINENO: checking $ac_header presence" >&5 echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include <$ac_header> _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then ac_header_preproc=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_preproc=no fi rm -f conftest.err conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 echo "${ECHO_T}$ac_header_preproc" >&6 # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in yes:no: ) { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} ac_header_preproc=yes ;; no:yes:* ) { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} ( cat <<\_ASBOX ## ------------------------------------------ ## ## Report this to the AC_PACKAGE_NAME lists. ## ## ------------------------------------------ ## _ASBOX ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else eval "$as_ac_Header=\$ac_header_preproc" fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 fi if test `eval echo '${'$as_ac_Header'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF INSERT_MATH_HEADER="#include " fi done for ac_header in float.h do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` if eval "test \"\${$as_ac_Header+set}\" = set"; then echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 else # Is the header compilable? echo "$as_me:$LINENO: checking $ac_header usability" >&5 echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_header_compiler=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_compiler=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 echo "${ECHO_T}$ac_header_compiler" >&6 # Is the header present? echo "$as_me:$LINENO: checking $ac_header presence" >&5 echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include <$ac_header> _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then ac_header_preproc=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_preproc=no fi rm -f conftest.err conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 echo "${ECHO_T}$ac_header_preproc" >&6 # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in yes:no: ) { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} ac_header_preproc=yes ;; no:yes:* ) { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} ( cat <<\_ASBOX ## ------------------------------------------ ## ## Report this to the AC_PACKAGE_NAME lists. ## ## ------------------------------------------ ## _ASBOX ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else eval "$as_ac_Header=\$ac_header_preproc" fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 fi if test `eval echo '${'$as_ac_Header'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in fcntl.h do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` if eval "test \"\${$as_ac_Header+set}\" = set"; then echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 else # Is the header compilable? echo "$as_me:$LINENO: checking $ac_header usability" >&5 echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_header_compiler=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_compiler=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 echo "${ECHO_T}$ac_header_compiler" >&6 # Is the header present? echo "$as_me:$LINENO: checking $ac_header presence" >&5 echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include <$ac_header> _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then ac_header_preproc=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_preproc=no fi rm -f conftest.err conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 echo "${ECHO_T}$ac_header_preproc" >&6 # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in yes:no: ) { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} ac_header_preproc=yes ;; no:yes:* ) { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} ( cat <<\_ASBOX ## ------------------------------------------ ## ## Report this to the AC_PACKAGE_NAME lists. ## ## ------------------------------------------ ## _ASBOX ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else eval "$as_ac_Header=\$ac_header_preproc" fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 fi if test `eval echo '${'$as_ac_Header'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in sys/time.h do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` if eval "test \"\${$as_ac_Header+set}\" = set"; then echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 else # Is the header compilable? echo "$as_me:$LINENO: checking $ac_header usability" >&5 echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_header_compiler=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_compiler=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 echo "${ECHO_T}$ac_header_compiler" >&6 # Is the header present? echo "$as_me:$LINENO: checking $ac_header presence" >&5 echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include <$ac_header> _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then ac_header_preproc=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_preproc=no fi rm -f conftest.err conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 echo "${ECHO_T}$ac_header_preproc" >&6 # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in yes:no: ) { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} ac_header_preproc=yes ;; no:yes:* ) { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} ( cat <<\_ASBOX ## ------------------------------------------ ## ## Report this to the AC_PACKAGE_NAME lists. ## ## ------------------------------------------ ## _ASBOX ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else eval "$as_ac_Header=\$ac_header_preproc" fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 fi if test `eval echo '${'$as_ac_Header'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in sys/select.h do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` if eval "test \"\${$as_ac_Header+set}\" = set"; then echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 else # Is the header compilable? echo "$as_me:$LINENO: checking $ac_header usability" >&5 echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_header_compiler=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_compiler=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 echo "${ECHO_T}$ac_header_compiler" >&6 # Is the header present? echo "$as_me:$LINENO: checking $ac_header presence" >&5 echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include <$ac_header> _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then ac_header_preproc=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_preproc=no fi rm -f conftest.err conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 echo "${ECHO_T}$ac_header_preproc" >&6 # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in yes:no: ) { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} ac_header_preproc=yes ;; no:yes:* ) { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} ( cat <<\_ASBOX ## ------------------------------------------ ## ## Report this to the AC_PACKAGE_NAME lists. ## ## ------------------------------------------ ## _ASBOX ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else eval "$as_ac_Header=\$ac_header_preproc" fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 fi if test `eval echo '${'$as_ac_Header'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in sys/ioctl.h do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` if eval "test \"\${$as_ac_Header+set}\" = set"; then echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 else # Is the header compilable? echo "$as_me:$LINENO: checking $ac_header usability" >&5 echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_header_compiler=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_compiler=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 echo "${ECHO_T}$ac_header_compiler" >&6 # Is the header present? echo "$as_me:$LINENO: checking $ac_header presence" >&5 echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include <$ac_header> _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then ac_header_preproc=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_preproc=no fi rm -f conftest.err conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 echo "${ECHO_T}$ac_header_preproc" >&6 # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in yes:no: ) { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} ac_header_preproc=yes ;; no:yes:* ) { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} ( cat <<\_ASBOX ## ------------------------------------------ ## ## Report this to the AC_PACKAGE_NAME lists. ## ## ------------------------------------------ ## _ASBOX ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else eval "$as_ac_Header=\$ac_header_preproc" fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 fi if test `eval echo '${'$as_ac_Header'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in sys/fcntl.h do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` if eval "test \"\${$as_ac_Header+set}\" = set"; then echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 else # Is the header compilable? echo "$as_me:$LINENO: checking $ac_header usability" >&5 echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_header_compiler=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_compiler=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 echo "${ECHO_T}$ac_header_compiler" >&6 # Is the header present? echo "$as_me:$LINENO: checking $ac_header presence" >&5 echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include <$ac_header> _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then ac_header_preproc=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_preproc=no fi rm -f conftest.err conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 echo "${ECHO_T}$ac_header_preproc" >&6 # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in yes:no: ) { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} ac_header_preproc=yes ;; no:yes:* ) { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} ( cat <<\_ASBOX ## ------------------------------------------ ## ## Report this to the AC_PACKAGE_NAME lists. ## ## ------------------------------------------ ## _ASBOX ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else eval "$as_ac_Header=\$ac_header_preproc" fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 fi if test `eval echo '${'$as_ac_Header'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in audiofile.h do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` if eval "test \"\${$as_ac_Header+set}\" = set"; then echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 else # Is the header compilable? echo "$as_me:$LINENO: checking $ac_header usability" >&5 echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_header_compiler=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_compiler=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 echo "${ECHO_T}$ac_header_compiler" >&6 # Is the header present? echo "$as_me:$LINENO: checking $ac_header presence" >&5 echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include <$ac_header> _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then ac_header_preproc=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_preproc=no fi rm -f conftest.err conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 echo "${ECHO_T}$ac_header_preproc" >&6 # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in yes:no: ) { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} ac_header_preproc=yes ;; no:yes:* ) { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} ( cat <<\_ASBOX ## ------------------------------------------ ## ## Report this to the AC_PACKAGE_NAME lists. ## ## ------------------------------------------ ## _ASBOX ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else eval "$as_ac_Header=\$ac_header_preproc" fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 fi if test `eval echo '${'$as_ac_Header'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in fftw3.h do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` if eval "test \"\${$as_ac_Header+set}\" = set"; then echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 else # Is the header compilable? echo "$as_me:$LINENO: checking $ac_header usability" >&5 echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_header_compiler=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_compiler=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 echo "${ECHO_T}$ac_header_compiler" >&6 # Is the header present? echo "$as_me:$LINENO: checking $ac_header presence" >&5 echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include <$ac_header> _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then ac_header_preproc=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_preproc=no fi rm -f conftest.err conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 echo "${ECHO_T}$ac_header_preproc" >&6 # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in yes:no: ) { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} ac_header_preproc=yes ;; no:yes:* ) { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} ( cat <<\_ASBOX ## ------------------------------------------ ## ## Report this to the AC_PACKAGE_NAME lists. ## ## ------------------------------------------ ## _ASBOX ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else eval "$as_ac_Header=\$ac_header_preproc" fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 fi if test `eval echo '${'$as_ac_Header'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF else for ac_header in fftw.h do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` if eval "test \"\${$as_ac_Header+set}\" = set"; then echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 else # Is the header compilable? echo "$as_me:$LINENO: checking $ac_header usability" >&5 echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_header_compiler=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_compiler=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 echo "${ECHO_T}$ac_header_compiler" >&6 # Is the header present? echo "$as_me:$LINENO: checking $ac_header presence" >&5 echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include <$ac_header> _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then ac_header_preproc=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_preproc=no fi rm -f conftest.err conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 echo "${ECHO_T}$ac_header_preproc" >&6 # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in yes:no: ) { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} ac_header_preproc=yes ;; no:yes:* ) { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} ( cat <<\_ASBOX ## ------------------------------------------ ## ## Report this to the AC_PACKAGE_NAME lists. ## ## ------------------------------------------ ## _ASBOX ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else eval "$as_ac_Header=\$ac_header_preproc" fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 fi if test `eval echo '${'$as_ac_Header'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done fi done for ac_header in tiffio.h do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` if eval "test \"\${$as_ac_Header+set}\" = set"; then echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 else # Is the header compilable? echo "$as_me:$LINENO: checking $ac_header usability" >&5 echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_header_compiler=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_compiler=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 echo "${ECHO_T}$ac_header_compiler" >&6 # Is the header present? echo "$as_me:$LINENO: checking $ac_header presence" >&5 echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include <$ac_header> _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then ac_header_preproc=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_preproc=no fi rm -f conftest.err conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 echo "${ECHO_T}$ac_header_preproc" >&6 # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in yes:no: ) { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} ac_header_preproc=yes ;; no:yes:* ) { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} ( cat <<\_ASBOX ## ------------------------------------------ ## ## Report this to the AC_PACKAGE_NAME lists. ## ## ------------------------------------------ ## _ASBOX ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else eval "$as_ac_Header=\$ac_header_preproc" fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 fi if test `eval echo '${'$as_ac_Header'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in pthread.h do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` if eval "test \"\${$as_ac_Header+set}\" = set"; then echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 else # Is the header compilable? echo "$as_me:$LINENO: checking $ac_header usability" >&5 echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_header_compiler=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_compiler=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 echo "${ECHO_T}$ac_header_compiler" >&6 # Is the header present? echo "$as_me:$LINENO: checking $ac_header presence" >&5 echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include <$ac_header> _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then ac_header_preproc=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_preproc=no fi rm -f conftest.err conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 echo "${ECHO_T}$ac_header_preproc" >&6 # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in yes:no: ) { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} ac_header_preproc=yes ;; no:yes:* ) { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} ( cat <<\_ASBOX ## ------------------------------------------ ## ## Report this to the AC_PACKAGE_NAME lists. ## ## ------------------------------------------ ## _ASBOX ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else eval "$as_ac_Header=\$ac_header_preproc" fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 fi if test `eval echo '${'$as_ac_Header'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in unicall.h do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` if eval "test \"\${$as_ac_Header+set}\" = set"; then echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 else # Is the header compilable? echo "$as_me:$LINENO: checking $ac_header usability" >&5 echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_header_compiler=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_compiler=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 echo "${ECHO_T}$ac_header_compiler" >&6 # Is the header present? echo "$as_me:$LINENO: checking $ac_header presence" >&5 echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include <$ac_header> _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then ac_header_preproc=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_preproc=no fi rm -f conftest.err conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 echo "${ECHO_T}$ac_header_preproc" >&6 # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in yes:no: ) { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} ac_header_preproc=yes ;; no:yes:* ) { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} ( cat <<\_ASBOX ## ------------------------------------------ ## ## Report this to the AC_PACKAGE_NAME lists. ## ## ------------------------------------------ ## _ASBOX ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else eval "$as_ac_Header=\$ac_header_preproc" fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 fi if test `eval echo '${'$as_ac_Header'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done if test "${build}" == "${host}" then for ac_header in X11/X.h do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` if eval "test \"\${$as_ac_Header+set}\" = set"; then echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 else # Is the header compilable? echo "$as_me:$LINENO: checking $ac_header usability" >&5 echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_header_compiler=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_compiler=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 echo "${ECHO_T}$ac_header_compiler" >&6 # Is the header present? echo "$as_me:$LINENO: checking $ac_header presence" >&5 echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include <$ac_header> _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then ac_header_preproc=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_preproc=no fi rm -f conftest.err conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 echo "${ECHO_T}$ac_header_preproc" >&6 # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in yes:no: ) { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} ac_header_preproc=yes ;; no:yes:* ) { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} ( cat <<\_ASBOX ## ------------------------------------------ ## ## Report this to the AC_PACKAGE_NAME lists. ## ## ------------------------------------------ ## _ASBOX ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else eval "$as_ac_Header=\$ac_header_preproc" fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 fi if test `eval echo '${'$as_ac_Header'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done fi # Determine XML2 include path echo "$as_me:$LINENO: checking for libxml/xmlmemory.h" >&5 echo $ECHO_N "checking for libxml/xmlmemory.h... $ECHO_C" >&6 # Can we include headers using system include dirs? cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include int main () { int a = 1; ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then XML2_INCLUDE=" " else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 XML2_INCLUDE= fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext # Hunt through several possible directories to find the includes for libxml2 if test "x$XML2_INCLUDE" = "x"; then old_CPPFLAGS="$CPPFLAGS" for i in $xml2_include_dir /usr/include /usr/local/include /usr/include/libxml2 /usr/local/include/libxml2 ; do CPPFLAGS="$old_CPPFLAGS -I$i" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include int main () { int a = 1; ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then XML2_INCLUDE="-I$i" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 XML2_INCLUDE= fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext if test "x$XML2_INCLUDE" != "x"; then break; fi done CPPFLAGS="$old_CPPFLAGS $XML2_INCLUDE" fi for ac_header in libxml/xmlmemory.h do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` if eval "test \"\${$as_ac_Header+set}\" = set"; then echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 else # Is the header compilable? echo "$as_me:$LINENO: checking $ac_header usability" >&5 echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_header_compiler=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_compiler=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 echo "${ECHO_T}$ac_header_compiler" >&6 # Is the header present? echo "$as_me:$LINENO: checking $ac_header presence" >&5 echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include <$ac_header> _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then ac_header_preproc=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_preproc=no fi rm -f conftest.err conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 echo "${ECHO_T}$ac_header_preproc" >&6 # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in yes:no: ) { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} ac_header_preproc=yes ;; no:yes:* ) { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} ( cat <<\_ASBOX ## ------------------------------------------ ## ## Report this to the AC_PACKAGE_NAME lists. ## ## ------------------------------------------ ## _ASBOX ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else eval "$as_ac_Header=\$ac_header_preproc" fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 fi if test `eval echo '${'$as_ac_Header'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in libxml/parser.h do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` if eval "test \"\${$as_ac_Header+set}\" = set"; then echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 else # Is the header compilable? echo "$as_me:$LINENO: checking $ac_header usability" >&5 echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_header_compiler=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_compiler=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 echo "${ECHO_T}$ac_header_compiler" >&6 # Is the header present? echo "$as_me:$LINENO: checking $ac_header presence" >&5 echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include <$ac_header> _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then ac_header_preproc=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_preproc=no fi rm -f conftest.err conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 echo "${ECHO_T}$ac_header_preproc" >&6 # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in yes:no: ) { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} ac_header_preproc=yes ;; no:yes:* ) { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} ( cat <<\_ASBOX ## ------------------------------------------ ## ## Report this to the AC_PACKAGE_NAME lists. ## ## ------------------------------------------ ## _ASBOX ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else eval "$as_ac_Header=\$ac_header_preproc" fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 fi if test `eval echo '${'$as_ac_Header'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in libxml/xinclude.h do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` if eval "test \"\${$as_ac_Header+set}\" = set"; then echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 else # Is the header compilable? echo "$as_me:$LINENO: checking $ac_header usability" >&5 echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_header_compiler=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_compiler=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 echo "${ECHO_T}$ac_header_compiler" >&6 # Is the header present? echo "$as_me:$LINENO: checking $ac_header presence" >&5 echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include <$ac_header> _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then ac_header_preproc=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_preproc=no fi rm -f conftest.err conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 echo "${ECHO_T}$ac_header_preproc" >&6 # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in yes:no: ) { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} ac_header_preproc=yes ;; no:yes:* ) { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} ( cat <<\_ASBOX ## ------------------------------------------ ## ## Report this to the AC_PACKAGE_NAME lists. ## ## ------------------------------------------ ## _ASBOX ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else eval "$as_ac_Header=\$ac_header_preproc" fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 fi if test `eval echo '${'$as_ac_Header'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done ac_ext=cc ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu for ac_header in FL/Fl.H do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` if eval "test \"\${$as_ac_Header+set}\" = set"; then echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 else # Is the header compilable? echo "$as_me:$LINENO: checking $ac_header usability" >&5 echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_header_compiler=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_compiler=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 echo "${ECHO_T}$ac_header_compiler" >&6 # Is the header present? echo "$as_me:$LINENO: checking $ac_header presence" >&5 echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include <$ac_header> _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_cxx_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then ac_header_preproc=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_preproc=no fi rm -f conftest.err conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 echo "${ECHO_T}$ac_header_preproc" >&6 # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_cxx_preproc_warn_flag in yes:no: ) { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} ac_header_preproc=yes ;; no:yes:* ) { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} ( cat <<\_ASBOX ## ------------------------------------------ ## ## Report this to the AC_PACKAGE_NAME lists. ## ## ------------------------------------------ ## _ASBOX ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else eval "$as_ac_Header=\$ac_header_preproc" fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 fi if test `eval echo '${'$as_ac_Header'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in FL/Fl_Overlay_Window.H do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` if eval "test \"\${$as_ac_Header+set}\" = set"; then echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 else # Is the header compilable? echo "$as_me:$LINENO: checking $ac_header usability" >&5 echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_header_compiler=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_compiler=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 echo "${ECHO_T}$ac_header_compiler" >&6 # Is the header present? echo "$as_me:$LINENO: checking $ac_header presence" >&5 echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include <$ac_header> _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_cxx_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then ac_header_preproc=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_preproc=no fi rm -f conftest.err conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 echo "${ECHO_T}$ac_header_preproc" >&6 # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_cxx_preproc_warn_flag in yes:no: ) { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} ac_header_preproc=yes ;; no:yes:* ) { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} ( cat <<\_ASBOX ## ------------------------------------------ ## ## Report this to the AC_PACKAGE_NAME lists. ## ## ------------------------------------------ ## _ASBOX ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else eval "$as_ac_Header=\$ac_header_preproc" fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 fi if test `eval echo '${'$as_ac_Header'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in FL/Fl_Light_Button.H do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` if eval "test \"\${$as_ac_Header+set}\" = set"; then echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 else # Is the header compilable? echo "$as_me:$LINENO: checking $ac_header usability" >&5 echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_header_compiler=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_compiler=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 echo "${ECHO_T}$ac_header_compiler" >&6 # Is the header present? echo "$as_me:$LINENO: checking $ac_header presence" >&5 echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include <$ac_header> _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_cxx_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then ac_header_preproc=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_preproc=no fi rm -f conftest.err conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 echo "${ECHO_T}$ac_header_preproc" >&6 # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_cxx_preproc_warn_flag in yes:no: ) { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} ac_header_preproc=yes ;; no:yes:* ) { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} ( cat <<\_ASBOX ## ------------------------------------------ ## ## Report this to the AC_PACKAGE_NAME lists. ## ## ------------------------------------------ ## _ASBOX ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else eval "$as_ac_Header=\$ac_header_preproc" fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 fi if test `eval echo '${'$as_ac_Header'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in FL/fl_draw.H do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` if eval "test \"\${$as_ac_Header+set}\" = set"; then echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 else # Is the header compilable? echo "$as_me:$LINENO: checking $ac_header usability" >&5 echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_header_compiler=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_compiler=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 echo "${ECHO_T}$ac_header_compiler" >&6 # Is the header present? echo "$as_me:$LINENO: checking $ac_header presence" >&5 echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include <$ac_header> _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_cxx_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then ac_header_preproc=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_preproc=no fi rm -f conftest.err conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 echo "${ECHO_T}$ac_header_preproc" >&6 # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_cxx_preproc_warn_flag in yes:no: ) { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} ac_header_preproc=yes ;; no:yes:* ) { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} ( cat <<\_ASBOX ## ------------------------------------------ ## ## Report this to the AC_PACKAGE_NAME lists. ## ## ------------------------------------------ ## _ASBOX ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else eval "$as_ac_Header=\$ac_header_preproc" fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 fi if test `eval echo '${'$as_ac_Header'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in FL/Fl_Cartesian.H do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` if eval "test \"\${$as_ac_Header+set}\" = set"; then echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 else # Is the header compilable? echo "$as_me:$LINENO: checking $ac_header usability" >&5 echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_header_compiler=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_compiler=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 echo "${ECHO_T}$ac_header_compiler" >&6 # Is the header present? echo "$as_me:$LINENO: checking $ac_header presence" >&5 echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include <$ac_header> _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_cxx_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then ac_header_preproc=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_preproc=no fi rm -f conftest.err conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 echo "${ECHO_T}$ac_header_preproc" >&6 # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_cxx_preproc_warn_flag in yes:no: ) { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} ac_header_preproc=yes ;; no:yes:* ) { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} ( cat <<\_ASBOX ## ------------------------------------------ ## ## Report this to the AC_PACKAGE_NAME lists. ## ## ------------------------------------------ ## _ASBOX ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else eval "$as_ac_Header=\$ac_header_preproc" fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 fi if test `eval echo '${'$as_ac_Header'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in FL/Fl_Audio_Meter.H do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` if eval "test \"\${$as_ac_Header+set}\" = set"; then echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 else # Is the header compilable? echo "$as_me:$LINENO: checking $ac_header usability" >&5 echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_header_compiler=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_compiler=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 echo "${ECHO_T}$ac_header_compiler" >&6 # Is the header present? echo "$as_me:$LINENO: checking $ac_header presence" >&5 echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include <$ac_header> _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_cxx_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then ac_header_preproc=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_preproc=no fi rm -f conftest.err conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 echo "${ECHO_T}$ac_header_preproc" >&6 # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_cxx_preproc_warn_flag in yes:no: ) { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} ac_header_preproc=yes ;; no:yes:* ) { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} ( cat <<\_ASBOX ## ------------------------------------------ ## ## Report this to the AC_PACKAGE_NAME lists. ## ## ------------------------------------------ ## _ASBOX ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else eval "$as_ac_Header=\$ac_header_preproc" fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 fi if test `eval echo '${'$as_ac_Header'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test "${build}" == "${host}" then case "${host}" in x86_64-*) as_ac_RealFile=`echo "ac_cv_real_file_${prefix}/lib64" | $as_tr_sh` echo "$as_me:$LINENO: checking for ${prefix}/lib64" >&5 echo $ECHO_N "checking for ${prefix}/lib64... $ECHO_C" >&6 if eval "test \"\${$as_ac_RealFile+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else test "$cross_compiling" = yes && { { echo "$as_me:$LINENO: error: cannot check for file existence when cross compiling" >&5 echo "$as_me: error: cannot check for file existence when cross compiling" >&2;} { (exit 1); exit 1; }; } if test -r "${prefix}/lib64" then if test -h "${prefix}/lib64" then eval "$as_ac_RealFile=no" else eval "$as_ac_RealFile=yes" fi else eval "$as_ac_RealFile=no" fi fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_RealFile'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_RealFile'}'`" >&6 if test `eval echo '${'$as_ac_RealFile'}'` = yes; then libdir='$(exec_prefix)/lib64' fi ;; esac fi echo "$as_me:$LINENO: checking for cos in -lm" >&5 echo $ECHO_N "checking for cos in -lm... $ECHO_C" >&6 if test "${ac_cv_lib_m_cos+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lm $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char cos (); int main () { cos (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_lib_m_cos=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_m_cos=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_m_cos" >&5 echo "${ECHO_T}$ac_cv_lib_m_cos" >&6 if test $ac_cv_lib_m_cos = yes; then cat >>confdefs.h <<_ACEOF #define HAVE_LIBM 1 _ACEOF LIBS="-lm $LIBS" fi # Some platforms still seem to lack the basic single precision trig and power related function. echo "$as_me:$LINENO: checking for library containing sinf" >&5 echo $ECHO_N "checking for library containing sinf... $ECHO_C" >&6 if test "${ac_cv_search_sinf+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_func_search_save_LIBS=$LIBS ac_cv_search_sinf=no cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char sinf (); int main () { sinf (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_search_sinf="none required" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test "$ac_cv_search_sinf" = no; then for ac_lib in m; do LIBS="-l$ac_lib $ac_func_search_save_LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char sinf (); int main () { sinf (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_search_sinf="-l$ac_lib" break else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext done fi LIBS=$ac_func_search_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_search_sinf" >&5 echo "${ECHO_T}$ac_cv_search_sinf" >&6 if test "$ac_cv_search_sinf" != no; then test "$ac_cv_search_sinf" = "none required" || LIBS="$ac_cv_search_sinf $LIBS" cat >>confdefs.h <<\_ACEOF #define HAVE_SINF 1 _ACEOF fi echo "$as_me:$LINENO: checking for library containing cosf" >&5 echo $ECHO_N "checking for library containing cosf... $ECHO_C" >&6 if test "${ac_cv_search_cosf+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_func_search_save_LIBS=$LIBS ac_cv_search_cosf=no cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char cosf (); int main () { cosf (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_search_cosf="none required" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test "$ac_cv_search_cosf" = no; then for ac_lib in m; do LIBS="-l$ac_lib $ac_func_search_save_LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char cosf (); int main () { cosf (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_search_cosf="-l$ac_lib" break else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext done fi LIBS=$ac_func_search_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_search_cosf" >&5 echo "${ECHO_T}$ac_cv_search_cosf" >&6 if test "$ac_cv_search_cosf" != no; then test "$ac_cv_search_cosf" = "none required" || LIBS="$ac_cv_search_cosf $LIBS" cat >>confdefs.h <<\_ACEOF #define HAVE_COSF 1 _ACEOF fi echo "$as_me:$LINENO: checking for library containing tanf" >&5 echo $ECHO_N "checking for library containing tanf... $ECHO_C" >&6 if test "${ac_cv_search_tanf+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_func_search_save_LIBS=$LIBS ac_cv_search_tanf=no cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char tanf (); int main () { tanf (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_search_tanf="none required" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test "$ac_cv_search_tanf" = no; then for ac_lib in m; do LIBS="-l$ac_lib $ac_func_search_save_LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char tanf (); int main () { tanf (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_search_tanf="-l$ac_lib" break else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext done fi LIBS=$ac_func_search_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_search_tanf" >&5 echo "${ECHO_T}$ac_cv_search_tanf" >&6 if test "$ac_cv_search_tanf" != no; then test "$ac_cv_search_tanf" = "none required" || LIBS="$ac_cv_search_tanf $LIBS" cat >>confdefs.h <<\_ACEOF #define HAVE_TANF 1 _ACEOF fi echo "$as_me:$LINENO: checking for library containing asinf" >&5 echo $ECHO_N "checking for library containing asinf... $ECHO_C" >&6 if test "${ac_cv_search_asinf+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_func_search_save_LIBS=$LIBS ac_cv_search_asinf=no cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char asinf (); int main () { asinf (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_search_asinf="none required" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test "$ac_cv_search_asinf" = no; then for ac_lib in m; do LIBS="-l$ac_lib $ac_func_search_save_LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char asinf (); int main () { asinf (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_search_asinf="-l$ac_lib" break else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext done fi LIBS=$ac_func_search_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_search_asinf" >&5 echo "${ECHO_T}$ac_cv_search_asinf" >&6 if test "$ac_cv_search_asinf" != no; then test "$ac_cv_search_asinf" = "none required" || LIBS="$ac_cv_search_asinf $LIBS" cat >>confdefs.h <<\_ACEOF #define HAVE_ASINF 1 _ACEOF fi echo "$as_me:$LINENO: checking for library containing acosf" >&5 echo $ECHO_N "checking for library containing acosf... $ECHO_C" >&6 if test "${ac_cv_search_acosf+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_func_search_save_LIBS=$LIBS ac_cv_search_acosf=no cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char acosf (); int main () { acosf (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_search_acosf="none required" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test "$ac_cv_search_acosf" = no; then for ac_lib in m; do LIBS="-l$ac_lib $ac_func_search_save_LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char acosf (); int main () { acosf (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_search_acosf="-l$ac_lib" break else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext done fi LIBS=$ac_func_search_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_search_acosf" >&5 echo "${ECHO_T}$ac_cv_search_acosf" >&6 if test "$ac_cv_search_acosf" != no; then test "$ac_cv_search_acosf" = "none required" || LIBS="$ac_cv_search_acosf $LIBS" cat >>confdefs.h <<\_ACEOF #define HAVE_ACOSF 1 _ACEOF fi echo "$as_me:$LINENO: checking for library containing atanf" >&5 echo $ECHO_N "checking for library containing atanf... $ECHO_C" >&6 if test "${ac_cv_search_atanf+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_func_search_save_LIBS=$LIBS ac_cv_search_atanf=no cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char atanf (); int main () { atanf (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_search_atanf="none required" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test "$ac_cv_search_atanf" = no; then for ac_lib in m; do LIBS="-l$ac_lib $ac_func_search_save_LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char atanf (); int main () { atanf (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_search_atanf="-l$ac_lib" break else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext done fi LIBS=$ac_func_search_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_search_atanf" >&5 echo "${ECHO_T}$ac_cv_search_atanf" >&6 if test "$ac_cv_search_atanf" != no; then test "$ac_cv_search_atanf" = "none required" || LIBS="$ac_cv_search_atanf $LIBS" cat >>confdefs.h <<\_ACEOF #define HAVE_ATANF 1 _ACEOF fi echo "$as_me:$LINENO: checking for library containing atan2f" >&5 echo $ECHO_N "checking for library containing atan2f... $ECHO_C" >&6 if test "${ac_cv_search_atan2f+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_func_search_save_LIBS=$LIBS ac_cv_search_atan2f=no cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char atan2f (); int main () { atan2f (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_search_atan2f="none required" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test "$ac_cv_search_atan2f" = no; then for ac_lib in m; do LIBS="-l$ac_lib $ac_func_search_save_LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char atan2f (); int main () { atan2f (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_search_atan2f="-l$ac_lib" break else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext done fi LIBS=$ac_func_search_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_search_atan2f" >&5 echo "${ECHO_T}$ac_cv_search_atan2f" >&6 if test "$ac_cv_search_atan2f" != no; then test "$ac_cv_search_atan2f" = "none required" || LIBS="$ac_cv_search_atan2f $LIBS" cat >>confdefs.h <<\_ACEOF #define HAVE_ATAN2F 1 _ACEOF fi echo "$as_me:$LINENO: checking for library containing ceilf" >&5 echo $ECHO_N "checking for library containing ceilf... $ECHO_C" >&6 if test "${ac_cv_search_ceilf+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_func_search_save_LIBS=$LIBS ac_cv_search_ceilf=no cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char ceilf (); int main () { ceilf (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_search_ceilf="none required" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test "$ac_cv_search_ceilf" = no; then for ac_lib in m; do LIBS="-l$ac_lib $ac_func_search_save_LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char ceilf (); int main () { ceilf (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_search_ceilf="-l$ac_lib" break else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext done fi LIBS=$ac_func_search_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_search_ceilf" >&5 echo "${ECHO_T}$ac_cv_search_ceilf" >&6 if test "$ac_cv_search_ceilf" != no; then test "$ac_cv_search_ceilf" = "none required" || LIBS="$ac_cv_search_ceilf $LIBS" cat >>confdefs.h <<\_ACEOF #define HAVE_CEILF 1 _ACEOF fi echo "$as_me:$LINENO: checking for library containing floorf" >&5 echo $ECHO_N "checking for library containing floorf... $ECHO_C" >&6 if test "${ac_cv_search_floorf+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_func_search_save_LIBS=$LIBS ac_cv_search_floorf=no cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char floorf (); int main () { floorf (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_search_floorf="none required" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test "$ac_cv_search_floorf" = no; then for ac_lib in m; do LIBS="-l$ac_lib $ac_func_search_save_LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char floorf (); int main () { floorf (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_search_floorf="-l$ac_lib" break else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext done fi LIBS=$ac_func_search_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_search_floorf" >&5 echo "${ECHO_T}$ac_cv_search_floorf" >&6 if test "$ac_cv_search_floorf" != no; then test "$ac_cv_search_floorf" = "none required" || LIBS="$ac_cv_search_floorf $LIBS" cat >>confdefs.h <<\_ACEOF #define HAVE_FLOORF 1 _ACEOF fi echo "$as_me:$LINENO: checking for library containing powf" >&5 echo $ECHO_N "checking for library containing powf... $ECHO_C" >&6 if test "${ac_cv_search_powf+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_func_search_save_LIBS=$LIBS ac_cv_search_powf=no cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char powf (); int main () { powf (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_search_powf="none required" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test "$ac_cv_search_powf" = no; then for ac_lib in m; do LIBS="-l$ac_lib $ac_func_search_save_LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char powf (); int main () { powf (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_search_powf="-l$ac_lib" break else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext done fi LIBS=$ac_func_search_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_search_powf" >&5 echo "${ECHO_T}$ac_cv_search_powf" >&6 if test "$ac_cv_search_powf" != no; then test "$ac_cv_search_powf" = "none required" || LIBS="$ac_cv_search_powf $LIBS" cat >>confdefs.h <<\_ACEOF #define HAVE_POWF 1 _ACEOF fi echo "$as_me:$LINENO: checking for library containing expf" >&5 echo $ECHO_N "checking for library containing expf... $ECHO_C" >&6 if test "${ac_cv_search_expf+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_func_search_save_LIBS=$LIBS ac_cv_search_expf=no cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char expf (); int main () { expf (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_search_expf="none required" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test "$ac_cv_search_expf" = no; then for ac_lib in m; do LIBS="-l$ac_lib $ac_func_search_save_LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char expf (); int main () { expf (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_search_expf="-l$ac_lib" break else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext done fi LIBS=$ac_func_search_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_search_expf" >&5 echo "${ECHO_T}$ac_cv_search_expf" >&6 if test "$ac_cv_search_expf" != no; then test "$ac_cv_search_expf" = "none required" || LIBS="$ac_cv_search_expf $LIBS" cat >>confdefs.h <<\_ACEOF #define HAVE_EXPF 1 _ACEOF fi echo "$as_me:$LINENO: checking for library containing logf" >&5 echo $ECHO_N "checking for library containing logf... $ECHO_C" >&6 if test "${ac_cv_search_logf+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_func_search_save_LIBS=$LIBS ac_cv_search_logf=no cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char logf (); int main () { logf (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_search_logf="none required" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test "$ac_cv_search_logf" = no; then for ac_lib in m; do LIBS="-l$ac_lib $ac_func_search_save_LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char logf (); int main () { logf (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_search_logf="-l$ac_lib" break else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext done fi LIBS=$ac_func_search_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_search_logf" >&5 echo "${ECHO_T}$ac_cv_search_logf" >&6 if test "$ac_cv_search_logf" != no; then test "$ac_cv_search_logf" = "none required" || LIBS="$ac_cv_search_logf $LIBS" cat >>confdefs.h <<\_ACEOF #define HAVE_LOGF 1 _ACEOF fi echo "$as_me:$LINENO: checking for library containing log10f" >&5 echo $ECHO_N "checking for library containing log10f... $ECHO_C" >&6 if test "${ac_cv_search_log10f+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_func_search_save_LIBS=$LIBS ac_cv_search_log10f=no cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char log10f (); int main () { log10f (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_search_log10f="none required" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test "$ac_cv_search_log10f" = no; then for ac_lib in m; do LIBS="-l$ac_lib $ac_func_search_save_LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char log10f (); int main () { log10f (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_search_log10f="-l$ac_lib" break else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext done fi LIBS=$ac_func_search_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_search_log10f" >&5 echo "${ECHO_T}$ac_cv_search_log10f" >&6 if test "$ac_cv_search_log10f" != no; then test "$ac_cv_search_log10f" = "none required" || LIBS="$ac_cv_search_log10f $LIBS" cat >>confdefs.h <<\_ACEOF #define HAVE_LOG10F 1 _ACEOF fi if test "${build}" == "${host}" then case "${host}" in x86_64-*) # X86_64 Linux machines may have both 64 bit and 32 bit libraries. We need to choose the right set echo "$as_me:$LINENO: checking for /usr/X11R6/lib64" >&5 echo $ECHO_N "checking for /usr/X11R6/lib64... $ECHO_C" >&6 if test "${ac_cv_real_file__usr_X11R6_lib64+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else test "$cross_compiling" = yes && { { echo "$as_me:$LINENO: error: cannot check for file existence when cross compiling" >&5 echo "$as_me: error: cannot check for file existence when cross compiling" >&2;} { (exit 1); exit 1; }; } if test -r "/usr/X11R6/lib64" then if test -h "/usr/X11R6/lib64" then ac_cv_real_file__usr_X11R6_lib64=no else ac_cv_real_file__usr_X11R6_lib64=yes fi else ac_cv_real_file__usr_X11R6_lib64=no fi fi echo "$as_me:$LINENO: result: $ac_cv_real_file__usr_X11R6_lib64" >&5 echo "${ECHO_T}$ac_cv_real_file__usr_X11R6_lib64" >&6 if test $ac_cv_real_file__usr_X11R6_lib64 = yes; then TESTLIBS="$TESTLIBS -L/usr/X11R6/lib64" else echo "$as_me:$LINENO: checking for /usr/X11R6/lib" >&5 echo $ECHO_N "checking for /usr/X11R6/lib... $ECHO_C" >&6 if test "${ac_cv_file__usr_X11R6_lib+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else test "$cross_compiling" = yes && { { echo "$as_me:$LINENO: error: cannot check for file existence when cross compiling" >&5 echo "$as_me: error: cannot check for file existence when cross compiling" >&2;} { (exit 1); exit 1; }; } if test -r "/usr/X11R6/lib"; then ac_cv_file__usr_X11R6_lib=yes else ac_cv_file__usr_X11R6_lib=no fi fi echo "$as_me:$LINENO: result: $ac_cv_file__usr_X11R6_lib" >&5 echo "${ECHO_T}$ac_cv_file__usr_X11R6_lib" >&6 if test $ac_cv_file__usr_X11R6_lib = yes; then TESTLIBS="$TESTLIBS -L/usr/X11R6/lib" fi fi ;; esac fi # Checks for libraries. echo "$as_me:$LINENO: checking for TIFFOpen in -ltiff" >&5 echo $ECHO_N "checking for TIFFOpen in -ltiff... $ECHO_C" >&6 if test "${ac_cv_lib_tiff_TIFFOpen+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ltiff -lm $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char TIFFOpen (); int main () { TIFFOpen (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_lib_tiff_TIFFOpen=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_tiff_TIFFOpen=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_tiff_TIFFOpen" >&5 echo "${ECHO_T}$ac_cv_lib_tiff_TIFFOpen" >&6 if test $ac_cv_lib_tiff_TIFFOpen = yes; then cat >>confdefs.h <<_ACEOF #define HAVE_LIBTIFF 1 _ACEOF LIBS="-ltiff $LIBS" else { { echo "$as_me:$LINENO: error: \"Can't build without libtiff (does your system require a libtiff-devel package?)\"" >&5 echo "$as_me: error: \"Can't build without libtiff (does your system require a libtiff-devel package?)\"" >&2;} { (exit 1); exit 1; }; } fi echo "$as_me:$LINENO: checking for xmlParseFile in -lxml2" >&5 echo $ECHO_N "checking for xmlParseFile in -lxml2... $ECHO_C" >&6 if test "${ac_cv_lib_xml2_xmlParseFile+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lxml2 $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char xmlParseFile (); int main () { xmlParseFile (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_lib_xml2_xmlParseFile=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_xml2_xmlParseFile=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_xml2_xmlParseFile" >&5 echo "${ECHO_T}$ac_cv_lib_xml2_xmlParseFile" >&6 if test $ac_cv_lib_xml2_xmlParseFile = yes; then cat >>confdefs.h <<\_ACEOF #define HAVE_LIBXML2 1 _ACEOF TESTLIBS="$TESTLIBS -lxml2" fi if test -n "$enable_tests" ; then ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu echo "$as_me:$LINENO: checking for afOpenFile in -laudiofile" >&5 echo $ECHO_N "checking for afOpenFile in -laudiofile... $ECHO_C" >&6 if test "${ac_cv_lib_audiofile_afOpenFile+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-laudiofile $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char afOpenFile (); int main () { afOpenFile (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_lib_audiofile_afOpenFile=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_audiofile_afOpenFile=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_audiofile_afOpenFile" >&5 echo "${ECHO_T}$ac_cv_lib_audiofile_afOpenFile" >&6 if test $ac_cv_lib_audiofile_afOpenFile = yes; then TESTLIBS="$TESTLIBS -laudiofile" else { { echo "$as_me:$LINENO: error: \"Can't make tests without libaudiofile (does your system require a libaudiofile-devel package?)\"" >&5 echo "$as_me: error: \"Can't make tests without libaudiofile (does your system require a libaudiofile-devel package?)\"" >&2;} { (exit 1); exit 1; }; } fi echo "$as_me:$LINENO: checking for fftw_plan_dft_1d in -lfftw3" >&5 echo $ECHO_N "checking for fftw_plan_dft_1d in -lfftw3... $ECHO_C" >&6 if test "${ac_cv_lib_fftw3_fftw_plan_dft_1d+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lfftw3 $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char fftw_plan_dft_1d (); int main () { fftw_plan_dft_1d (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_lib_fftw3_fftw_plan_dft_1d=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_fftw3_fftw_plan_dft_1d=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_fftw3_fftw_plan_dft_1d" >&5 echo "${ECHO_T}$ac_cv_lib_fftw3_fftw_plan_dft_1d" >&6 if test $ac_cv_lib_fftw3_fftw_plan_dft_1d = yes; then TESTLIBS="$TESTLIBS -lfftw3" else echo "$as_me:$LINENO: checking for fftw_create_plan in -lfftw" >&5 echo $ECHO_N "checking for fftw_create_plan in -lfftw... $ECHO_C" >&6 if test "${ac_cv_lib_fftw_fftw_create_plan+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lfftw $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char fftw_create_plan (); int main () { fftw_create_plan (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_lib_fftw_fftw_create_plan=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_fftw_fftw_create_plan=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_fftw_fftw_create_plan" >&5 echo "${ECHO_T}$ac_cv_lib_fftw_fftw_create_plan" >&6 if test $ac_cv_lib_fftw_fftw_create_plan = yes; then TESTLIBS="$TESTLIBS -lfftw" fi fi echo "$as_me:$LINENO: checking for pthread_attr_init in -lpthread" >&5 echo $ECHO_N "checking for pthread_attr_init in -lpthread... $ECHO_C" >&6 if test "${ac_cv_lib_pthread_pthread_attr_init+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lpthread $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char pthread_attr_init (); int main () { pthread_attr_init (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_lib_pthread_pthread_attr_init=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_pthread_pthread_attr_init=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_pthread_pthread_attr_init" >&5 echo "${ECHO_T}$ac_cv_lib_pthread_pthread_attr_init" >&6 if test $ac_cv_lib_pthread_pthread_attr_init = yes; then TESTLIBS="$TESTLIBS -lpthread" fi echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5 echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6 if test "${ac_cv_lib_dl_dlopen+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char dlopen (); int main () { dlopen (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_lib_dl_dlopen=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_dl_dlopen=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5 echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6 if test $ac_cv_lib_dl_dlopen = yes; then TESTLIBS="$TESTLIBS -ldl" fi echo "$as_me:$LINENO: checking for uc_start in -lunicall" >&5 echo $ECHO_N "checking for uc_start in -lunicall... $ECHO_C" >&6 if test "${ac_cv_lib_unicall_uc_start+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lunicall -ltiff -ldl $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char uc_start (); int main () { uc_start (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_lib_unicall_uc_start=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_unicall_uc_start=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_unicall_uc_start" >&5 echo "${ECHO_T}$ac_cv_lib_unicall_uc_start" >&6 if test $ac_cv_lib_unicall_uc_start = yes; then TESTLIBS="$TESTLIBS -lunicall" fi echo "$as_me:$LINENO: checking for XftFontOpen in -lXft" >&5 echo $ECHO_N "checking for XftFontOpen in -lXft... $ECHO_C" >&6 if test "${ac_cv_lib_Xft_XftFontOpen+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lXft $TESTLIBS $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char XftFontOpen (); int main () { XftFontOpen (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_lib_Xft_XftFontOpen=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_Xft_XftFontOpen=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_Xft_XftFontOpen" >&5 echo "${ECHO_T}$ac_cv_lib_Xft_XftFontOpen" >&6 if test $ac_cv_lib_Xft_XftFontOpen = yes; then TESTLIBS="$TESTLIBS -lXft" fi echo "$as_me:$LINENO: checking for XextCreateExtension in -lXext" >&5 echo $ECHO_N "checking for XextCreateExtension in -lXext... $ECHO_C" >&6 if test "${ac_cv_lib_Xext_XextCreateExtension+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lXext $TESTLIBS $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char XextCreateExtension (); int main () { XextCreateExtension (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_lib_Xext_XextCreateExtension=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_Xext_XextCreateExtension=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_Xext_XextCreateExtension" >&5 echo "${ECHO_T}$ac_cv_lib_Xext_XextCreateExtension" >&6 if test $ac_cv_lib_Xext_XextCreateExtension = yes; then TESTLIBS="$TESTLIBS -lXext" fi echo "$as_me:$LINENO: checking for XOpenDisplay in -lX11" >&5 echo $ECHO_N "checking for XOpenDisplay in -lX11... $ECHO_C" >&6 if test "${ac_cv_lib_X11_XOpenDisplay+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lX11 $TESTLIBS $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char XOpenDisplay (); int main () { XOpenDisplay (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_lib_X11_XOpenDisplay=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_X11_XOpenDisplay=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_X11_XOpenDisplay" >&5 echo "${ECHO_T}$ac_cv_lib_X11_XOpenDisplay" >&6 if test $ac_cv_lib_X11_XOpenDisplay = yes; then TESTLIBS="$TESTLIBS -lX11" fi ac_ext=cc ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu echo "$as_me:$LINENO: checking for main in -lfltk" >&5 echo $ECHO_N "checking for main in -lfltk... $ECHO_C" >&6 if test "${ac_cv_lib_fltk_main+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lfltk $TESTLIBS $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { main (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_lib_fltk_main=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_fltk_main=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_fltk_main" >&5 echo "${ECHO_T}$ac_cv_lib_fltk_main" >&6 if test $ac_cv_lib_fltk_main = yes; then TESTLIBS="$TESTLIBS -lfltk -lsupc++" fi echo "$as_me:$LINENO: checking for main in -lfltk_cartesian" >&5 echo $ECHO_N "checking for main in -lfltk_cartesian... $ECHO_C" >&6 if test "${ac_cv_lib_fltk_cartesian_main+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lfltk_cartesian $TESTLIBS $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { main (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_lib_fltk_cartesian_main=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_fltk_cartesian_main=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_fltk_cartesian_main" >&5 echo "${ECHO_T}$ac_cv_lib_fltk_cartesian_main" >&6 if test $ac_cv_lib_fltk_cartesian_main = yes; then TESTLIBS="-lfltk_cartesian $TESTLIBS" fi echo "$as_me:$LINENO: checking for main in -lfltk_audio_meter" >&5 echo $ECHO_N "checking for main in -lfltk_audio_meter... $ECHO_C" >&6 if test "${ac_cv_lib_fltk_audio_meter_main+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lfltk_audio_meter $TESTLIBS $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { main (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_lib_fltk_audio_meter_main=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_fltk_audio_meter_main=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_fltk_audio_meter_main" >&5 echo "${ECHO_T}$ac_cv_lib_fltk_audio_meter_main" >&6 if test $ac_cv_lib_fltk_audio_meter_main = yes; then TESTLIBS="-lfltk_audio_meter $TESTLIBS" fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu fi case "${ax_cv_c_compiler_vendor}" in gnu) COMP_VENDOR_CFLAGS="-std=gnu99 -ffast-math -Wall -Wunused-variable -Wwrite-strings -Wstrict-prototypes -Wmissing-prototypes" if test "$enable_sse" = "yes" ; then COMP_VENDOR_CFLAGS="-msse $COMP_VENDOR_CFLAGS" fi if test "$enable_mmx" = "yes" ; then COMP_VENDOR_CFLAGS="-mmmx $COMP_VENDOR_CFLAGS" fi case $host_os in mingw* | cygwin*) COMP_VENDOR_LDFLAGS="-no-undefined" ;; *) COMP_VENDOR_LDFLAGS= ;; esac ;; sun) COMP_VENDOR_CFLAGS="-xc99=all -mt -xCC -errwarn=%all -xvpara" if test "$enable_sse" = "yes" ; then COMP_VENDOR_CFLAGS="-native -fast $COMP_VENDOR_CFLAGS" fi if test "$enable_mmx" = "yes" ; then COMP_VENDOR_CFLAGS="-native -fast $COMP_VENDOR_CFLAGS" fi COMP_VENDOR_LDFLAGS= ;; *) COMP_VENDOR_CFLAGS="-std=c99 -Wall -Wunused-variable -Wwrite-strings -Wstrict-prototypes -Wmissing-prototypes" COMP_VENDOR_LDFLAGS= ;; esac COMP_VENDOR_CFLAGS="-DNDEBUG -DIAXMODEM_STUFF $COMP_VENDOR_CFLAGS" if test "$enable_doc" = yes; then COND_DOC_TRUE= COND_DOC_FALSE='#' else COND_DOC_TRUE='#' COND_DOC_FALSE= fi if test "$enable_tests" = yes; then COND_TESTS_TRUE= COND_TESTS_FALSE='#' else COND_TESTS_TRUE='#' COND_TESTS_FALSE= fi if test "$enable_test_data" = yes; then COND_TESTDATA_TRUE= COND_TESTDATA_FALSE='#' else COND_TESTDATA_TRUE='#' COND_TESTDATA_FALSE= fi if test "$enable_mmx" = yes; then COND_MMX_TRUE= COND_MMX_FALSE='#' else COND_MMX_TRUE='#' COND_MMX_FALSE= fi if test "$enable_sse" = yes; then COND_SSE_TRUE= COND_SSE_FALSE='#' else COND_SSE_TRUE='#' COND_SSE_FALSE= fi if test "$enable_fixed_point" = "yes" ; then cat >>confdefs.h <<\_ACEOF #define SPANDSP_USE_FIXED_POINT 1 _ACEOF SPANDSP_USE_FIXED_POINT="#define SPANDSP_USE_FIXED_POINT 1" else as_ac_FixedPoint=`echo "ac_cv_fixed_point_machine_$host" | $as_tr_sh` echo "$as_me:$LINENO: checking if $host is fixed point only" >&5 echo $ECHO_N "checking if $host is fixed point only... $ECHO_C" >&6 if eval "test \"\${$as_ac_FixedPoint+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else case $host in arc | arm | armble | armelb | armv2345 | armv345lb \ | bfin \ | mips | mipsbe | mipseb | mipsel | mipsle \ | tic54x | c54x* | tic55x | c55x* | tic6x | c6x* \ | xscale | xscaleebl \ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ | bfin-* \ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ | xscale-* | xscaleebl-* ) eval "$as_ac_FixedPoint=yes" ;; *) eval "$as_ac_FixedPoint=no" ;; esac fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_FixedPoint'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_FixedPoint'}'`" >&6 if test `eval echo '${'$as_ac_FixedPoint'}'` = yes; then cat >>confdefs.h <<\_ACEOF #define SPANDSP_USE_FIXED_POINT 1 _ACEOF SPANDSP_USE_FIXED_POINT="#define SPANDSP_USE_FIXED_POINT 1" else SPANDSP_USE_FIXED_POINT="#undef SPANDSP_USE_FIXED_POINT" fi fi as_ac_MisalignedAccessFails=`echo "ac_cv_misaligned_access_fails_$host" | $as_tr_sh` echo "$as_me:$LINENO: checking if $host fails on misaligned memory access" >&5 echo $ECHO_N "checking if $host fails on misaligned memory access... $ECHO_C" >&6 if eval "test \"\${$as_ac_MisalignedAccessFails+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else case $host in arc | arm | armble | armelb | armv2345 | armv345lb \ | bfin \ | sparc \ | xscale | xscaleebl \ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ | bfin-* \ | sparc-* \ | xscale-* | xscaleebl-* ) eval "$as_ac_MisalignedAccessFails=yes" ;; *) eval "$as_ac_MisalignedAccessFails=no" ;; esac fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_MisalignedAccessFails'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_MisalignedAccessFails'}'`" >&6 if test `eval echo '${'$as_ac_MisalignedAccessFails'}'` = yes; then cat >>confdefs.h <<\_ACEOF #define SPANDSP_MISALIGNED_ACCESS_FAILS 1 _ACEOF SPANDSP_MISALIGNED_ACCESS_FAILS="#define SPANDSP_MISALIGNED_ACCESS_FAILS 1" else SPANDSP_MISALIGNED_ACCESS_FAILS="#undef SPANDSP_MISALIGNED_ACCESS_FAILS" fi ac_config_files="$ac_config_files Makefile doc/Makefile doc/doxygen src/Makefile src/spandsp.h spandsp-sim/Makefile test-data/Makefile test-data/etsi/Makefile test-data/etsi/fax/Makefile test-data/itu/Makefile test-data/itu/fax/Makefile test-data/local/Makefile tests/Makefile spandsp.spec" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, don't put newlines in cache variables' values. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. { (set) 2>&1 | case `(ac_space=' '; set | grep ac_space) 2>&1` in *ac_space=\ *) # `set' does not quote correctly, so add quotes (double-quote # substitution turns \\\\ into \\, and sed turns \\ into \). sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n \ "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" ;; esac; } | sed ' t clear : clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end /^ac_cv_env/!s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ : end' >>confcache if diff $cache_file confcache >/dev/null 2>&1; then :; else if test -w $cache_file; then test "x$cache_file" != "x/dev/null" && echo "updating cache $cache_file" cat confcache >$cache_file else echo "not updating unwritable cache $cache_file" fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' # VPATH may cause trouble with some makes, so we remove $(srcdir), # ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=/{ s/:*\$(srcdir):*/:/; s/:*\${srcdir}:*/:/; s/:*@srcdir@:*/:/; s/^\([^=]*=[ ]*\):*/\1/; s/:*$//; s/^[^=]*=[ ]*$//; }' fi DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_i=`echo "$ac_i" | sed 's/\$U\././;s/\.o$//;s/\.obj$//'` # 2. Add them. ac_libobjs="$ac_libobjs $ac_i\$U.$ac_objext" ac_ltlibobjs="$ac_ltlibobjs $ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then { { echo "$as_me:$LINENO: error: conditional \"AMDEP\" was never defined. Usually this means the macro was only invoked conditionally." >&5 echo "$as_me: error: conditional \"AMDEP\" was never defined. Usually this means the macro was only invoked conditionally." >&2;} { (exit 1); exit 1; }; } fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then { { echo "$as_me:$LINENO: error: conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." >&5 echo "$as_me: error: conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." >&2;} { (exit 1); exit 1; }; } fi if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then { { echo "$as_me:$LINENO: error: conditional \"am__fastdepCXX\" was never defined. Usually this means the macro was only invoked conditionally." >&5 echo "$as_me: error: conditional \"am__fastdepCXX\" was never defined. Usually this means the macro was only invoked conditionally." >&2;} { (exit 1); exit 1; }; } fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then { { echo "$as_me:$LINENO: error: conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." >&5 echo "$as_me: error: conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." >&2;} { (exit 1); exit 1; }; } fi if test -z "${COND_DOC_TRUE}" && test -z "${COND_DOC_FALSE}"; then { { echo "$as_me:$LINENO: error: conditional \"COND_DOC\" was never defined. Usually this means the macro was only invoked conditionally." >&5 echo "$as_me: error: conditional \"COND_DOC\" was never defined. Usually this means the macro was only invoked conditionally." >&2;} { (exit 1); exit 1; }; } fi if test -z "${COND_TESTS_TRUE}" && test -z "${COND_TESTS_FALSE}"; then { { echo "$as_me:$LINENO: error: conditional \"COND_TESTS\" was never defined. Usually this means the macro was only invoked conditionally." >&5 echo "$as_me: error: conditional \"COND_TESTS\" was never defined. Usually this means the macro was only invoked conditionally." >&2;} { (exit 1); exit 1; }; } fi if test -z "${COND_TESTDATA_TRUE}" && test -z "${COND_TESTDATA_FALSE}"; then { { echo "$as_me:$LINENO: error: conditional \"COND_TESTDATA\" was never defined. Usually this means the macro was only invoked conditionally." >&5 echo "$as_me: error: conditional \"COND_TESTDATA\" was never defined. Usually this means the macro was only invoked conditionally." >&2;} { (exit 1); exit 1; }; } fi if test -z "${COND_MMX_TRUE}" && test -z "${COND_MMX_FALSE}"; then { { echo "$as_me:$LINENO: error: conditional \"COND_MMX\" was never defined. Usually this means the macro was only invoked conditionally." >&5 echo "$as_me: error: conditional \"COND_MMX\" was never defined. Usually this means the macro was only invoked conditionally." >&2;} { (exit 1); exit 1; }; } fi if test -z "${COND_SSE_TRUE}" && test -z "${COND_SSE_FALSE}"; then { { echo "$as_me:$LINENO: error: conditional \"COND_SSE\" was never defined. Usually this means the macro was only invoked conditionally." >&5 echo "$as_me: error: conditional \"COND_SSE\" was never defined. Usually this means the macro was only invoked conditionally." >&2;} { (exit 1); exit 1; }; } fi : ${CONFIG_STATUS=./config.status} ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5 echo "$as_me: creating $CONFIG_STATUS" >&6;} cat >$CONFIG_STATUS <<_ACEOF #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF ## --------------------- ## ## M4sh Initialization. ## ## --------------------- ## # Be Bourne compatible if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then set -o posix fi DUALCASE=1; export DUALCASE # for MKS sh # Support unset when possible. if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then as_unset=unset else as_unset=false fi # Work around bugs in pre-3.0 UWIN ksh. $as_unset ENV MAIL MAILPATH PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. for as_var in \ LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ LC_TELEPHONE LC_TIME do if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then eval $as_var=C; export $as_var else $as_unset $as_var fi done # Required to use basename. if expr a : '\(a\)' >/dev/null 2>&1; then as_expr=expr else as_expr=false fi if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi # Name of the executable. as_me=`$as_basename "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)$' \| \ . : '\(.\)' 2>/dev/null || echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; } /^X\/\(\/\/\)$/{ s//\1/; q; } /^X\/\(\/\).*/{ s//\1/; q; } s/.*/./; q'` # PATH needs CR, and LINENO needs CR and PATH. # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then echo "#! /bin/sh" >conf$$.sh echo "exit 0" >>conf$$.sh chmod +x conf$$.sh if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then PATH_SEPARATOR=';' else PATH_SEPARATOR=: fi rm -f conf$$.sh fi as_lineno_1=$LINENO as_lineno_2=$LINENO as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` test "x$as_lineno_1" != "x$as_lineno_2" && test "x$as_lineno_3" = "x$as_lineno_2" || { # Find who we are. Look in the path if we contain no path at all # relative or not. case $0 in *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then { { echo "$as_me:$LINENO: error: cannot find myself; rerun with an absolute path" >&5 echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2;} { (exit 1); exit 1; }; } fi case $CONFIG_SHELL in '') as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for as_base in sh bash ksh sh5; do case $as_dir in /*) if ("$as_dir/$as_base" -c ' as_lineno_1=$LINENO as_lineno_2=$LINENO as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` test "x$as_lineno_1" != "x$as_lineno_2" && test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; } $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; } CONFIG_SHELL=$as_dir/$as_base export CONFIG_SHELL exec "$CONFIG_SHELL" "$0" ${1+"$@"} fi;; esac done done ;; esac # Create $as_me.lineno as a copy of $as_myself, but with $LINENO # uniformly replaced by the line number. The first 'sed' inserts a # line-number line before each line; the second 'sed' does the real # work. The second script uses 'N' to pair each line-number line # with the numbered line, and appends trailing '-' during # substitution so that $LINENO is not a special case at line end. # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-) sed '=' <$as_myself | sed ' N s,$,-, : loop s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3, t loop s,-$,, s,^['$as_cr_digits']*\n,, ' >$as_me.lineno && chmod +x $as_me.lineno || { { echo "$as_me:$LINENO: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&5 echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2;} { (exit 1); exit 1; }; } # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensible to this). . ./$as_me.lineno # Exit status is that of the last command. exit } case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in *c*,-n*) ECHO_N= ECHO_C=' ' ECHO_T=' ' ;; *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;; *) ECHO_N= ECHO_C='\c' ECHO_T= ;; esac if expr a : '\(a\)' >/dev/null 2>&1; then as_expr=expr else as_expr=false fi rm -f conf$$ conf$$.exe conf$$.file echo >conf$$.file if ln -s conf$$.file conf$$ 2>/dev/null; then # We could just check for DJGPP; but this test a) works b) is more generic # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04). if test -f conf$$.exe; then # Don't use ln at all; we don't have any links as_ln_s='cp -p' else as_ln_s='ln -s' fi elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.file if mkdir -p . 2>/dev/null; then as_mkdir_p=: else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_executable_p="test -f" # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" # IFS # We need space, tab and new line, in precisely that order. as_nl=' ' IFS=" $as_nl" # CDPATH. $as_unset CDPATH exec 6>&1 # Open the log real soon, to keep \$[0] and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. Logging --version etc. is OK. exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX } >&5 cat >&5 <<_CSEOF This file was extended by $as_me, which was generated by GNU Autoconf 2.59. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ _CSEOF echo "on `(hostname || uname -n) 2>/dev/null | sed 1q`" >&5 echo >&5 _ACEOF # Files that config.status was made for. if test -n "$ac_config_files"; then echo "config_files=\"$ac_config_files\"" >>$CONFIG_STATUS fi if test -n "$ac_config_headers"; then echo "config_headers=\"$ac_config_headers\"" >>$CONFIG_STATUS fi if test -n "$ac_config_links"; then echo "config_links=\"$ac_config_links\"" >>$CONFIG_STATUS fi if test -n "$ac_config_commands"; then echo "config_commands=\"$ac_config_commands\"" >>$CONFIG_STATUS fi cat >>$CONFIG_STATUS <<\_ACEOF ac_cs_usage="\ \`$as_me' instantiates files from templates according to the current configuration. Usage: $0 [OPTIONS] [FILE]... -h, --help print this help, then exit -V, --version print version number, then exit -q, --quiet do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE --header=FILE[:TEMPLATE] instantiate the configuration header FILE Configuration files: $config_files Configuration headers: $config_headers Configuration commands: $config_commands Report bugs to ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF ac_cs_version="\\ config.status configured by $0, generated by GNU Autoconf 2.59, with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\" Copyright (C) 2003 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." srcdir=$srcdir INSTALL="$INSTALL" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF # If no file are specified by the user, then we need to provide default # value. By we need to know if files were specified by the user. ac_need_defaults=: while test $# != 0 do case $1 in --*=*) ac_option=`expr "x$1" : 'x\([^=]*\)='` ac_optarg=`expr "x$1" : 'x[^=]*=\(.*\)'` ac_shift=: ;; -*) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; *) # This is not an option, so the user has probably given explicit # arguments. ac_option=$1 ac_need_defaults=false;; esac case $ac_option in # Handling of the options. _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --vers* | -V ) echo "$ac_cs_version"; exit 0 ;; --he | --h) # Conflict between --help and --header { { echo "$as_me:$LINENO: error: ambiguous option: $1 Try \`$0 --help' for more information." >&5 echo "$as_me: error: ambiguous option: $1 Try \`$0 --help' for more information." >&2;} { (exit 1); exit 1; }; };; --help | --hel | -h ) echo "$ac_cs_usage"; exit 0 ;; --debug | --d* | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift CONFIG_FILES="$CONFIG_FILES $ac_optarg" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift CONFIG_HEADERS="$CONFIG_HEADERS $ac_optarg" ac_need_defaults=false;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) { { echo "$as_me:$LINENO: error: unrecognized option: $1 Try \`$0 --help' for more information." >&5 echo "$as_me: error: unrecognized option: $1 Try \`$0 --help' for more information." >&2;} { (exit 1); exit 1; }; } ;; *) ac_config_targets="$ac_config_targets $1" ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF if \$ac_cs_recheck; then echo "running $SHELL $0 " $ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6 exec $SHELL $0 $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF # # INIT-COMMANDS section. # AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF for ac_config_target in $ac_config_targets do case "$ac_config_target" in # Handling of arguments. "Makefile" ) CONFIG_FILES="$CONFIG_FILES Makefile" ;; "doc/Makefile" ) CONFIG_FILES="$CONFIG_FILES doc/Makefile" ;; "doc/doxygen" ) CONFIG_FILES="$CONFIG_FILES doc/doxygen" ;; "src/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/Makefile" ;; "src/spandsp.h" ) CONFIG_FILES="$CONFIG_FILES src/spandsp.h" ;; "spandsp-sim/Makefile" ) CONFIG_FILES="$CONFIG_FILES spandsp-sim/Makefile" ;; "test-data/Makefile" ) CONFIG_FILES="$CONFIG_FILES test-data/Makefile" ;; "test-data/etsi/Makefile" ) CONFIG_FILES="$CONFIG_FILES test-data/etsi/Makefile" ;; "test-data/etsi/fax/Makefile" ) CONFIG_FILES="$CONFIG_FILES test-data/etsi/fax/Makefile" ;; "test-data/itu/Makefile" ) CONFIG_FILES="$CONFIG_FILES test-data/itu/Makefile" ;; "test-data/itu/fax/Makefile" ) CONFIG_FILES="$CONFIG_FILES test-data/itu/fax/Makefile" ;; "test-data/local/Makefile" ) CONFIG_FILES="$CONFIG_FILES test-data/local/Makefile" ;; "tests/Makefile" ) CONFIG_FILES="$CONFIG_FILES tests/Makefile" ;; "spandsp.spec" ) CONFIG_FILES="$CONFIG_FILES spandsp.spec" ;; "depfiles" ) CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; "src/config.h" ) CONFIG_HEADERS="$CONFIG_HEADERS src/config.h:config-h.in" ;; *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5 echo "$as_me: error: invalid argument: $ac_config_target" >&2;} { (exit 1); exit 1; }; };; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason to put it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Create a temporary directory, and hook for its removal unless debugging. $debug || { trap 'exit_status=$?; rm -rf $tmp && exit $exit_status' 0 trap '{ (exit 1); exit 1; }' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d -q "./confstatXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" } || { tmp=./confstat$$-$RANDOM (umask 077 && mkdir $tmp) } || { echo "$me: cannot create a temporary directory in ." >&2 { (exit 1); exit 1; } } _ACEOF cat >>$CONFIG_STATUS <<_ACEOF # # CONFIG_FILES section. # # No need to generate the scripts if there are no CONFIG_FILES. # This happens for instance when ./config.status config.h if test -n "\$CONFIG_FILES"; then # Protect against being on the right side of a sed subst in config.status. sed 's/,@/@@/; s/@,/@@/; s/,;t t\$/@;t t/; /@;t t\$/s/[\\\\&,]/\\\\&/g; s/@@/,@/; s/@@/@,/; s/@;t t\$/,;t t/' >\$tmp/subs.sed <<\\CEOF s,@SHELL@,$SHELL,;t t s,@PATH_SEPARATOR@,$PATH_SEPARATOR,;t t s,@PACKAGE_NAME@,$PACKAGE_NAME,;t t s,@PACKAGE_TARNAME@,$PACKAGE_TARNAME,;t t s,@PACKAGE_VERSION@,$PACKAGE_VERSION,;t t s,@PACKAGE_STRING@,$PACKAGE_STRING,;t t s,@PACKAGE_BUGREPORT@,$PACKAGE_BUGREPORT,;t t s,@exec_prefix@,$exec_prefix,;t t s,@prefix@,$prefix,;t t s,@program_transform_name@,$program_transform_name,;t t s,@bindir@,$bindir,;t t s,@sbindir@,$sbindir,;t t s,@libexecdir@,$libexecdir,;t t s,@datadir@,$datadir,;t t s,@sysconfdir@,$sysconfdir,;t t s,@sharedstatedir@,$sharedstatedir,;t t s,@localstatedir@,$localstatedir,;t t s,@libdir@,$libdir,;t t s,@includedir@,$includedir,;t t s,@oldincludedir@,$oldincludedir,;t t s,@infodir@,$infodir,;t t s,@mandir@,$mandir,;t t s,@build_alias@,$build_alias,;t t s,@host_alias@,$host_alias,;t t s,@target_alias@,$target_alias,;t t s,@DEFS@,$DEFS,;t t s,@ECHO_C@,$ECHO_C,;t t s,@ECHO_N@,$ECHO_N,;t t s,@ECHO_T@,$ECHO_T,;t t s,@LIBS@,$LIBS,;t t s,@SPANDSP_LT_CURRENT@,$SPANDSP_LT_CURRENT,;t t s,@SPANDSP_LT_REVISION@,$SPANDSP_LT_REVISION,;t t s,@SPANDSP_LT_AGE@,$SPANDSP_LT_AGE,;t t s,@INSTALL_PROGRAM@,$INSTALL_PROGRAM,;t t s,@INSTALL_SCRIPT@,$INSTALL_SCRIPT,;t t s,@INSTALL_DATA@,$INSTALL_DATA,;t t s,@CYGPATH_W@,$CYGPATH_W,;t t s,@PACKAGE@,$PACKAGE,;t t s,@VERSION@,$VERSION,;t t s,@ACLOCAL@,$ACLOCAL,;t t s,@AUTOCONF@,$AUTOCONF,;t t s,@AUTOMAKE@,$AUTOMAKE,;t t s,@AUTOHEADER@,$AUTOHEADER,;t t s,@MAKEINFO@,$MAKEINFO,;t t s,@install_sh@,$install_sh,;t t s,@STRIP@,$STRIP,;t t s,@ac_ct_STRIP@,$ac_ct_STRIP,;t t s,@INSTALL_STRIP_PROGRAM@,$INSTALL_STRIP_PROGRAM,;t t s,@mkdir_p@,$mkdir_p,;t t s,@AWK@,$AWK,;t t s,@SET_MAKE@,$SET_MAKE,;t t s,@am__leading_dot@,$am__leading_dot,;t t s,@AMTAR@,$AMTAR,;t t s,@am__tar@,$am__tar,;t t s,@am__untar@,$am__untar,;t t s,@build@,$build,;t t s,@build_cpu@,$build_cpu,;t t s,@build_vendor@,$build_vendor,;t t s,@build_os@,$build_os,;t t s,@host@,$host,;t t s,@host_cpu@,$host_cpu,;t t s,@host_vendor@,$host_vendor,;t t s,@host_os@,$host_os,;t t s,@CC@,$CC,;t t s,@CFLAGS@,$CFLAGS,;t t s,@LDFLAGS@,$LDFLAGS,;t t s,@CPPFLAGS@,$CPPFLAGS,;t t s,@ac_ct_CC@,$ac_ct_CC,;t t s,@EXEEXT@,$EXEEXT,;t t s,@OBJEXT@,$OBJEXT,;t t s,@DEPDIR@,$DEPDIR,;t t s,@am__include@,$am__include,;t t s,@am__quote@,$am__quote,;t t s,@AMDEP_TRUE@,$AMDEP_TRUE,;t t s,@AMDEP_FALSE@,$AMDEP_FALSE,;t t s,@AMDEPBACKSLASH@,$AMDEPBACKSLASH,;t t s,@CCDEPMODE@,$CCDEPMODE,;t t s,@am__fastdepCC_TRUE@,$am__fastdepCC_TRUE,;t t s,@am__fastdepCC_FALSE@,$am__fastdepCC_FALSE,;t t s,@CXX@,$CXX,;t t s,@CXXFLAGS@,$CXXFLAGS,;t t s,@ac_ct_CXX@,$ac_ct_CXX,;t t s,@CXXDEPMODE@,$CXXDEPMODE,;t t s,@am__fastdepCXX_TRUE@,$am__fastdepCXX_TRUE,;t t s,@am__fastdepCXX_FALSE@,$am__fastdepCXX_FALSE,;t t s,@CPP@,$CPP,;t t s,@EGREP@,$EGREP,;t t s,@SED@,$SED,;t t s,@LN_S@,$LN_S,;t t s,@ECHO@,$ECHO,;t t s,@AR@,$AR,;t t s,@ac_ct_AR@,$ac_ct_AR,;t t s,@RANLIB@,$RANLIB,;t t s,@ac_ct_RANLIB@,$ac_ct_RANLIB,;t t s,@DSYMUTIL@,$DSYMUTIL,;t t s,@ac_ct_DSYMUTIL@,$ac_ct_DSYMUTIL,;t t s,@NMEDIT@,$NMEDIT,;t t s,@ac_ct_NMEDIT@,$ac_ct_NMEDIT,;t t s,@CXXCPP@,$CXXCPP,;t t s,@F77@,$F77,;t t s,@FFLAGS@,$FFLAGS,;t t s,@ac_ct_F77@,$ac_ct_F77,;t t s,@LIBTOOL@,$LIBTOOL,;t t s,@LIBOBJS@,$LIBOBJS,;t t s,@COND_DOC_TRUE@,$COND_DOC_TRUE,;t t s,@COND_DOC_FALSE@,$COND_DOC_FALSE,;t t s,@COND_TESTS_TRUE@,$COND_TESTS_TRUE,;t t s,@COND_TESTS_FALSE@,$COND_TESTS_FALSE,;t t s,@COND_TESTDATA_TRUE@,$COND_TESTDATA_TRUE,;t t s,@COND_TESTDATA_FALSE@,$COND_TESTDATA_FALSE,;t t s,@COND_MMX_TRUE@,$COND_MMX_TRUE,;t t s,@COND_MMX_FALSE@,$COND_MMX_FALSE,;t t s,@COND_SSE_TRUE@,$COND_SSE_TRUE,;t t s,@COND_SSE_FALSE@,$COND_SSE_FALSE,;t t s,@CC_FOR_BUILD@,$CC_FOR_BUILD,;t t s,@CPPFLAGS_FOR_BUILD@,$CPPFLAGS_FOR_BUILD,;t t s,@COMP_VENDOR_CFLAGS@,$COMP_VENDOR_CFLAGS,;t t s,@COMP_VENDOR_LDFLAGS@,$COMP_VENDOR_LDFLAGS,;t t s,@TESTLIBS@,$TESTLIBS,;t t s,@SPANDSP_USE_FIXED_POINT@,$SPANDSP_USE_FIXED_POINT,;t t s,@SPANDSP_MISALIGNED_ACCESS_FAILS@,$SPANDSP_MISALIGNED_ACCESS_FAILS,;t t s,@INSERT_INTTYPES_HEADER@,$INSERT_INTTYPES_HEADER,;t t s,@INSERT_STDINT_HEADER@,$INSERT_STDINT_HEADER,;t t s,@INSERT_TGMATH_HEADER@,$INSERT_TGMATH_HEADER,;t t s,@INSERT_MATH_HEADER@,$INSERT_MATH_HEADER,;t t s,@LTLIBOBJS@,$LTLIBOBJS,;t t CEOF _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF # Split the substitutions into bite-sized pieces for seds with # small command number limits, like on Digital OSF/1 and HP-UX. ac_max_sed_lines=48 ac_sed_frag=1 # Number of current file. ac_beg=1 # First line for current file. ac_end=$ac_max_sed_lines # Line after last line for current file. ac_more_lines=: ac_sed_cmds= while $ac_more_lines; do if test $ac_beg -gt 1; then sed "1,${ac_beg}d; ${ac_end}q" $tmp/subs.sed >$tmp/subs.frag else sed "${ac_end}q" $tmp/subs.sed >$tmp/subs.frag fi if test ! -s $tmp/subs.frag; then ac_more_lines=false else # The purpose of the label and of the branching condition is to # speed up the sed processing (if there are no `@' at all, there # is no need to browse any of the substitutions). # These are the two extra sed commands mentioned above. (echo ':t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b' && cat $tmp/subs.frag) >$tmp/subs-$ac_sed_frag.sed if test -z "$ac_sed_cmds"; then ac_sed_cmds="sed -f $tmp/subs-$ac_sed_frag.sed" else ac_sed_cmds="$ac_sed_cmds | sed -f $tmp/subs-$ac_sed_frag.sed" fi ac_sed_frag=`expr $ac_sed_frag + 1` ac_beg=$ac_end ac_end=`expr $ac_end + $ac_max_sed_lines` fi done if test -z "$ac_sed_cmds"; then ac_sed_cmds=cat fi fi # test -n "$CONFIG_FILES" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF for ac_file in : $CONFIG_FILES; do test "x$ac_file" = x: && continue # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". case $ac_file in - | *:- | *:-:* ) # input from stdin cat >$tmp/stdin ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; * ) ac_file_in=$ac_file.in ;; esac # Compute @srcdir@, @top_srcdir@, and @INSTALL@ for subdirectories. ac_dir=`(dirname "$ac_file") 2>/dev/null || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| \ . : '\(.\)' 2>/dev/null || echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } /^X\(\/\/\)$/{ s//\1/; q; } /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'` { if $as_mkdir_p; then mkdir -p "$ac_dir" else as_dir="$ac_dir" as_dirs= while test ! -d "$as_dir"; do as_dirs="$as_dir $as_dirs" as_dir=`(dirname "$as_dir") 2>/dev/null || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| \ . : '\(.\)' 2>/dev/null || echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } /^X\(\/\/\)$/{ s//\1/; q; } /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'` done test ! -n "$as_dirs" || mkdir $as_dirs fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5 echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;} { (exit 1); exit 1; }; }; } ac_builddir=. if test "$ac_dir" != .; then ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` # A "../" for each directory in $ac_dir_suffix. ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` else ac_dir_suffix= ac_top_builddir= fi case $srcdir in .) # No --srcdir option. We are building in place. ac_srcdir=. if test -z "$ac_top_builddir"; then ac_top_srcdir=. else ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` fi ;; [\\/]* | ?:[\\/]* ) # Absolute path. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ;; *) # Relative path. ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_builddir$srcdir ;; esac # Do not use `cd foo && pwd` to compute absolute paths, because # the directories may not exist. case `pwd` in .) ac_abs_builddir="$ac_dir";; *) case "$ac_dir" in .) ac_abs_builddir=`pwd`;; [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";; *) ac_abs_builddir=`pwd`/"$ac_dir";; esac;; esac case $ac_abs_builddir in .) ac_abs_top_builddir=${ac_top_builddir}.;; *) case ${ac_top_builddir}. in .) ac_abs_top_builddir=$ac_abs_builddir;; [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;; *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;; esac;; esac case $ac_abs_builddir in .) ac_abs_srcdir=$ac_srcdir;; *) case $ac_srcdir in .) ac_abs_srcdir=$ac_abs_builddir;; [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;; *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;; esac;; esac case $ac_abs_builddir in .) ac_abs_top_srcdir=$ac_top_srcdir;; *) case $ac_top_srcdir in .) ac_abs_top_srcdir=$ac_abs_builddir;; [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;; *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;; esac;; esac case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_builddir$INSTALL ;; esac if test x"$ac_file" != x-; then { echo "$as_me:$LINENO: creating $ac_file" >&5 echo "$as_me: creating $ac_file" >&6;} rm -f "$ac_file" fi # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ if test x"$ac_file" = x-; then configure_input= else configure_input="$ac_file. " fi configure_input=$configure_input"Generated from `echo $ac_file_in | sed 's,.*/,,'` by configure." # First look for the input files in the build tree, otherwise in the # src tree. ac_file_inputs=`IFS=: for f in $ac_file_in; do case $f in -) echo $tmp/stdin ;; [\\/$]*) # Absolute (can't be DOS-style, as IFS=:) test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 echo "$as_me: error: cannot find input file: $f" >&2;} { (exit 1); exit 1; }; } echo "$f";; *) # Relative if test -f "$f"; then # Build tree echo "$f" elif test -f "$srcdir/$f"; then # Source tree echo "$srcdir/$f" else # /dev/null tree { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 echo "$as_me: error: cannot find input file: $f" >&2;} { (exit 1); exit 1; }; } fi;; esac done` || { (exit 1); exit 1; } _ACEOF cat >>$CONFIG_STATUS <<_ACEOF sed "$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s,@configure_input@,$configure_input,;t t s,@srcdir@,$ac_srcdir,;t t s,@abs_srcdir@,$ac_abs_srcdir,;t t s,@top_srcdir@,$ac_top_srcdir,;t t s,@abs_top_srcdir@,$ac_abs_top_srcdir,;t t s,@builddir@,$ac_builddir,;t t s,@abs_builddir@,$ac_abs_builddir,;t t s,@top_builddir@,$ac_top_builddir,;t t s,@abs_top_builddir@,$ac_abs_top_builddir,;t t s,@INSTALL@,$ac_INSTALL,;t t " $ac_file_inputs | (eval "$ac_sed_cmds") >$tmp/out rm -f $tmp/stdin if test x"$ac_file" != x-; then mv $tmp/out $ac_file else cat $tmp/out rm -f $tmp/out fi done _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF # # CONFIG_HEADER section. # # These sed commands are passed to sed as "A NAME B NAME C VALUE D", where # NAME is the cpp macro being defined and VALUE is the value it is being given. # # ac_d sets the value in "#define NAME VALUE" lines. ac_dA='s,^\([ ]*\)#\([ ]*define[ ][ ]*\)' ac_dB='[ ].*$,\1#\2' ac_dC=' ' ac_dD=',;t' # ac_u turns "#undef NAME" without trailing blanks into "#define NAME VALUE". ac_uA='s,^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)' ac_uB='$,\1#\2define\3' ac_uC=' ' ac_uD=',;t' for ac_file in : $CONFIG_HEADERS; do test "x$ac_file" = x: && continue # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". case $ac_file in - | *:- | *:-:* ) # input from stdin cat >$tmp/stdin ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; * ) ac_file_in=$ac_file.in ;; esac test x"$ac_file" != x- && { echo "$as_me:$LINENO: creating $ac_file" >&5 echo "$as_me: creating $ac_file" >&6;} # First look for the input files in the build tree, otherwise in the # src tree. ac_file_inputs=`IFS=: for f in $ac_file_in; do case $f in -) echo $tmp/stdin ;; [\\/$]*) # Absolute (can't be DOS-style, as IFS=:) test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 echo "$as_me: error: cannot find input file: $f" >&2;} { (exit 1); exit 1; }; } # Do quote $f, to prevent DOS paths from being IFS'd. echo "$f";; *) # Relative if test -f "$f"; then # Build tree echo "$f" elif test -f "$srcdir/$f"; then # Source tree echo "$srcdir/$f" else # /dev/null tree { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 echo "$as_me: error: cannot find input file: $f" >&2;} { (exit 1); exit 1; }; } fi;; esac done` || { (exit 1); exit 1; } # Remove the trailing spaces. sed 's/[ ]*$//' $ac_file_inputs >$tmp/in _ACEOF # Transform confdefs.h into two sed scripts, `conftest.defines' and # `conftest.undefs', that substitutes the proper values into # config.h.in to produce config.h. The first handles `#define' # templates, and the second `#undef' templates. # And first: Protect against being on the right side of a sed subst in # config.status. Protect against being in an unquoted here document # in config.status. rm -f conftest.defines conftest.undefs # Using a here document instead of a string reduces the quoting nightmare. # Putting comments in sed scripts is not portable. # # `end' is used to avoid that the second main sed command (meant for # 0-ary CPP macros) applies to n-ary macro definitions. # See the Autoconf documentation for `clear'. cat >confdef2sed.sed <<\_ACEOF s/[\\&,]/\\&/g s,[\\$`],\\&,g t clear : clear s,^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*\)\(([^)]*)\)[ ]*\(.*\)$,${ac_dA}\1${ac_dB}\1\2${ac_dC}\3${ac_dD},gp t end s,^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)$,${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD},gp : end _ACEOF # If some macros were called several times there might be several times # the same #defines, which is useless. Nevertheless, we may not want to # sort them, since we want the *last* AC-DEFINE to be honored. uniq confdefs.h | sed -n -f confdef2sed.sed >conftest.defines sed 's/ac_d/ac_u/g' conftest.defines >conftest.undefs rm -f confdef2sed.sed # This sed command replaces #undef with comments. This is necessary, for # example, in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. cat >>conftest.undefs <<\_ACEOF s,^[ ]*#[ ]*undef[ ][ ]*[a-zA-Z_][a-zA-Z_0-9]*,/* & */, _ACEOF # Break up conftest.defines because some shells have a limit on the size # of here documents, and old seds have small limits too (100 cmds). echo ' # Handle all the #define templates only if necessary.' >>$CONFIG_STATUS echo ' if grep "^[ ]*#[ ]*define" $tmp/in >/dev/null; then' >>$CONFIG_STATUS echo ' # If there are no defines, we may have an empty if/fi' >>$CONFIG_STATUS echo ' :' >>$CONFIG_STATUS rm -f conftest.tail while grep . conftest.defines >/dev/null do # Write a limited-size here document to $tmp/defines.sed. echo ' cat >$tmp/defines.sed <>$CONFIG_STATUS # Speed up: don't consider the non `#define' lines. echo '/^[ ]*#[ ]*define/!b' >>$CONFIG_STATUS # Work around the forget-to-reset-the-flag bug. echo 't clr' >>$CONFIG_STATUS echo ': clr' >>$CONFIG_STATUS sed ${ac_max_here_lines}q conftest.defines >>$CONFIG_STATUS echo 'CEOF sed -f $tmp/defines.sed $tmp/in >$tmp/out rm -f $tmp/in mv $tmp/out $tmp/in ' >>$CONFIG_STATUS sed 1,${ac_max_here_lines}d conftest.defines >conftest.tail rm -f conftest.defines mv conftest.tail conftest.defines done rm -f conftest.defines echo ' fi # grep' >>$CONFIG_STATUS echo >>$CONFIG_STATUS # Break up conftest.undefs because some shells have a limit on the size # of here documents, and old seds have small limits too (100 cmds). echo ' # Handle all the #undef templates' >>$CONFIG_STATUS rm -f conftest.tail while grep . conftest.undefs >/dev/null do # Write a limited-size here document to $tmp/undefs.sed. echo ' cat >$tmp/undefs.sed <>$CONFIG_STATUS # Speed up: don't consider the non `#undef' echo '/^[ ]*#[ ]*undef/!b' >>$CONFIG_STATUS # Work around the forget-to-reset-the-flag bug. echo 't clr' >>$CONFIG_STATUS echo ': clr' >>$CONFIG_STATUS sed ${ac_max_here_lines}q conftest.undefs >>$CONFIG_STATUS echo 'CEOF sed -f $tmp/undefs.sed $tmp/in >$tmp/out rm -f $tmp/in mv $tmp/out $tmp/in ' >>$CONFIG_STATUS sed 1,${ac_max_here_lines}d conftest.undefs >conftest.tail rm -f conftest.undefs mv conftest.tail conftest.undefs done rm -f conftest.undefs cat >>$CONFIG_STATUS <<\_ACEOF # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ if test x"$ac_file" = x-; then echo "/* Generated by configure. */" >$tmp/config.h else echo "/* $ac_file. Generated by configure. */" >$tmp/config.h fi cat $tmp/in >>$tmp/config.h rm -f $tmp/in if test x"$ac_file" != x-; then if diff $ac_file $tmp/config.h >/dev/null 2>&1; then { echo "$as_me:$LINENO: $ac_file is unchanged" >&5 echo "$as_me: $ac_file is unchanged" >&6;} else ac_dir=`(dirname "$ac_file") 2>/dev/null || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| \ . : '\(.\)' 2>/dev/null || echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } /^X\(\/\/\)$/{ s//\1/; q; } /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'` { if $as_mkdir_p; then mkdir -p "$ac_dir" else as_dir="$ac_dir" as_dirs= while test ! -d "$as_dir"; do as_dirs="$as_dir $as_dirs" as_dir=`(dirname "$as_dir") 2>/dev/null || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| \ . : '\(.\)' 2>/dev/null || echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } /^X\(\/\/\)$/{ s//\1/; q; } /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'` done test ! -n "$as_dirs" || mkdir $as_dirs fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5 echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;} { (exit 1); exit 1; }; }; } rm -f $ac_file mv $tmp/config.h $ac_file fi else cat $tmp/config.h rm -f $tmp/config.h fi # Compute $ac_file's index in $config_headers. _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $ac_file | $ac_file:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $ac_file" >`(dirname $ac_file) 2>/dev/null || $as_expr X$ac_file : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X$ac_file : 'X\(//\)[^/]' \| \ X$ac_file : 'X\(//\)$' \| \ X$ac_file : 'X\(/\)' \| \ . : '\(.\)' 2>/dev/null || echo X$ac_file | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } /^X\(\/\/\)$/{ s//\1/; q; } /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'`/stamp-h$_am_stamp_count done _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF # # CONFIG_COMMANDS section. # for ac_file in : $CONFIG_COMMANDS; do test "x$ac_file" = x: && continue ac_dest=`echo "$ac_file" | sed 's,:.*,,'` ac_source=`echo "$ac_file" | sed 's,[^:]*:,,'` ac_dir=`(dirname "$ac_dest") 2>/dev/null || $as_expr X"$ac_dest" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_dest" : 'X\(//\)[^/]' \| \ X"$ac_dest" : 'X\(//\)$' \| \ X"$ac_dest" : 'X\(/\)' \| \ . : '\(.\)' 2>/dev/null || echo X"$ac_dest" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } /^X\(\/\/\)$/{ s//\1/; q; } /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'` { if $as_mkdir_p; then mkdir -p "$ac_dir" else as_dir="$ac_dir" as_dirs= while test ! -d "$as_dir"; do as_dirs="$as_dir $as_dirs" as_dir=`(dirname "$as_dir") 2>/dev/null || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| \ . : '\(.\)' 2>/dev/null || echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } /^X\(\/\/\)$/{ s//\1/; q; } /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'` done test ! -n "$as_dirs" || mkdir $as_dirs fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5 echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;} { (exit 1); exit 1; }; }; } ac_builddir=. if test "$ac_dir" != .; then ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` # A "../" for each directory in $ac_dir_suffix. ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` else ac_dir_suffix= ac_top_builddir= fi case $srcdir in .) # No --srcdir option. We are building in place. ac_srcdir=. if test -z "$ac_top_builddir"; then ac_top_srcdir=. else ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` fi ;; [\\/]* | ?:[\\/]* ) # Absolute path. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ;; *) # Relative path. ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_builddir$srcdir ;; esac # Do not use `cd foo && pwd` to compute absolute paths, because # the directories may not exist. case `pwd` in .) ac_abs_builddir="$ac_dir";; *) case "$ac_dir" in .) ac_abs_builddir=`pwd`;; [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";; *) ac_abs_builddir=`pwd`/"$ac_dir";; esac;; esac case $ac_abs_builddir in .) ac_abs_top_builddir=${ac_top_builddir}.;; *) case ${ac_top_builddir}. in .) ac_abs_top_builddir=$ac_abs_builddir;; [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;; *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;; esac;; esac case $ac_abs_builddir in .) ac_abs_srcdir=$ac_srcdir;; *) case $ac_srcdir in .) ac_abs_srcdir=$ac_abs_builddir;; [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;; *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;; esac;; esac case $ac_abs_builddir in .) ac_abs_top_srcdir=$ac_top_srcdir;; *) case $ac_top_srcdir in .) ac_abs_top_srcdir=$ac_abs_builddir;; [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;; *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;; esac;; esac { echo "$as_me:$LINENO: executing $ac_dest commands" >&5 echo "$as_me: executing $ac_dest commands" >&6;} case $ac_dest in depfiles ) test x"$AMDEP_TRUE" != x"" || for mf in $CONFIG_FILES; do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named `Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # So let's grep whole file. if grep '^#.*generated by automake' $mf > /dev/null 2>&1; then dirpart=`(dirname "$mf") 2>/dev/null || $as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$mf" : 'X\(//\)[^/]' \| \ X"$mf" : 'X\(//\)$' \| \ X"$mf" : 'X\(/\)' \| \ . : '\(.\)' 2>/dev/null || echo X"$mf" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } /^X\(\/\/\)$/{ s//\1/; q; } /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running `make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # When using ansi2knr, U may be empty or an underscore; expand it U=`sed -n 's/^U = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`(dirname "$file") 2>/dev/null || $as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$file" : 'X\(//\)[^/]' \| \ X"$file" : 'X\(//\)$' \| \ X"$file" : 'X\(/\)' \| \ . : '\(.\)' 2>/dev/null || echo X"$file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } /^X\(\/\/\)$/{ s//\1/; q; } /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'` { if $as_mkdir_p; then mkdir -p $dirpart/$fdir else as_dir=$dirpart/$fdir as_dirs= while test ! -d "$as_dir"; do as_dirs="$as_dir $as_dirs" as_dir=`(dirname "$as_dir") 2>/dev/null || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| \ . : '\(.\)' 2>/dev/null || echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } /^X\(\/\/\)$/{ s//\1/; q; } /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'` done test ! -n "$as_dirs" || mkdir $as_dirs fi || { { echo "$as_me:$LINENO: error: cannot create directory $dirpart/$fdir" >&5 echo "$as_me: error: cannot create directory $dirpart/$fdir" >&2;} { (exit 1); exit 1; }; }; } # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done ;; esac done _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF { (exit 0); exit 0; } _ACEOF chmod +x $CONFIG_STATUS ac_clean_files=$ac_clean_files_save # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || { (exit 1); exit 1; } fi # @end 1 iaxmodem-1.2.0/lib/spandsp/doc/0000755000175000017500000000000011150047621015633 5ustar julienjulieniaxmodem-1.2.0/lib/spandsp/doc/Makefile.am0000644000175000017500000000241211150047205017664 0ustar julienjulien## ## SpanDSP - a series of DSP components for telephony ## ## Makefile.am - Process this file with automake to produce Makefile.in ## ## This program is free software; you can redistribute it and/or modify ## it under the terms of the GNU Lesser General Public License version 2.1, ## as published by the Free Software Foundation. ## ## This program is distributed in the hope that it will be useful, ## but WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ## GNU Lesser General Public License for more details. ## ## You should have received a copy of the GNU Lesser General Public ## License along with this program; if not, write to the Free Software ## Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ## ## $Id: Makefile.am,v 1.11 2008/06/21 10:28:34 steveu Exp $ MAINTAINERCLEANFILES = Makefile.in EXTRA_DIST = css.css \ t38-gateway.dia \ t38-terminal.dia \ t38_manual.xml \ wrapper.xsl \ t38_manual/css.css all: doxydocs t38_manual/index.html doxydocs: doxygen doxygen t38_manual/index.html: t38_manual.xml cd t38_manual ; xsltproc ../wrapper.xsl ../t38_manual.xml clean: cd t38_manual ; rm *.html ; cd ../api ; rm -rf html iaxmodem-1.2.0/lib/spandsp/doc/t38_manual/0000755000175000017500000000000011150047205017604 5ustar julienjulieniaxmodem-1.2.0/lib/spandsp/doc/t38_manual/css.css0000644000175000017500000002330011150047205021104 0ustar julienjulienbody { background-image: url("../images/weave.jpg"); font-family: Verdana, Arial, Helvetica, Sans-serif; color: black; margin-right: 20px; margin-left: 20px; } h1 { text-align: center; } h2 { font-family: Verdana, Arial, Helvetica, Sans-serif; border-color: #c00000; color : black; margin-top: 0.8em; border-style: solid; border-width: 0px 0px 3px 0.5em; line-height : 130%; } h3 { font-family: Verdana, Arial, Helvetica, Sans-serif; border-color: #f02020; color : black; border-width: 0px 0px 2px 0.5em; border-style: solid; margin-right: 20%; line-height : 130%; } caption { font-weight: bold } a.qindex {} a.qindexRef {} a.el { text-decoration: none; font-weight: bold } a.elRef { font-weight: bold } a.code { text-decoration: none; font-weight: normal; color: #4444ee } a.codeRef { font-weight: normal; color: #4444ee } a:hover { text-decoration: none; background-color: #f2f2ff } dl.el { margin-left: -1cm } div.fragment { width: 100%; border: none; background-color: #eeeeee } div.ah { background-color: black; font-weight: bold; color: #ffffff; margin-bottom: 3px; margin-top: 3px } td { font-family: Verdana, Arial, Helvetica, Sans-serif; font-weight: bold; } .navheader { font-family: Verdana, Arial, Helvetica, Sans-serif; background-color: #B2B2ff; font-weight: bold; } .navfooter { font-family: Verdana, Arial, Helvetica, Sans-serif; background-color: #B2B2ff; font-weight: bold; } table.menu { background-color: #000066; font-weight: bold; text-align: center; width: 100%; } tr.menu { background-color: #ccffff; font-weight: bold; text-align: center; } td.menu { background-color: #f2e0d0; font-weight: bold; text-align: center; } td.md { background-color: #f2f2ff; font-weight: bold; } td.mdname1 { background-color: #f2f2ff; font-weight: bold; color: #602020; } td.mdname { background-color: #f2f2ff; font-weight: bold; color: #602020; width: 600px; } div.groupHeader { margin-left: 16px; margin-top: 12px; margin-bottom: 6px; font-weight: bold } div.groupText { margin-left: 16px; font-style: italic; font-size: smaller } td.indexkey { font-family: Verdana, Arial, Helvetica, Sans-serif; background-color: #eeeeff; font-weight: bold; padding-right : 10px; padding-top : 2px; padding-left : 10px; padding-bottom : 2px; margin-left : 0px; margin-right : 0px; margin-top : 2px; margin-bottom : 2px } td.indexvalue { font-family: Verdana, Arial, Helvetica, Sans-serif; background-color: #eeeeff; font-style: italic; padding-right : 10px; padding-top : 2px; padding-left : 10px; padding-bottom : 2px; margin-left : 0px; margin-right : 0px; margin-top : 2px; margin-bottom : 2px } span.keyword { color: #008000 } span.keywordtype { color: #604020 } span.keywordflow { color: #e08000 } span.comment { color: #800000 } span.preprocessor { color: #806020 } span.stringliteral { color: #002080 } span.charliteral { color: #008080 } em { color: #990000; background-color: transparent; } h1,h2,h3,h4,h5,h6,p,center,td,th,ul,dl,div { font-family: Geneva, Arial, Helvetica, sans-serif; } body,td { font-size: 90%; } h1 { text-align: center; font-size: 160%; } h2 { font-size: 120%; } h3 { font-size: 100%; } caption { font-weight: bold } div.qindex { width: 100%; background-color: #eeeeff; border: 1px solid #b0b0b0; text-align: center; margin: 2px; padding: 2px; line-height: 140%; } div.nav { width: 100%; background-color: #eeeeff; border: 1px solid #b0b0b0; text-align: center; margin: 2px; padding: 2px; line-height: 140%; } div.navtab { background-color: #eeeeff; border: 1px solid #b0b0b0; text-align: center; margin: 2px; margin-right: 15px; padding: 2px; } td.navtab { font-size: 70%; } a.qindex { text-decoration: none; font-weight: bold; color: #1a419d; } a.qindex:visited { text-decoration: none; font-weight: bold; color: #1a419d } a.qindex:hover { text-decoration: none; background-color: #ddddff; } a.qindexHL { text-decoration: none; font-weight: bold; background-color: #6666cc; color: #ffffff; border: 1px double #9295C2; } a.qindexHL:hover { text-decoration: none; background-color: #6666cc; color: #ffffff; } a.qindexHL:visited { text-decoration: none; background-color: #6666cc; color: #ffffff } a.el { text-decoration: none; font-weight: bold } a.elRef { font-weight: bold } a.code:link { text-decoration: none; font-weight: normal; color: #0000FF } a.code:visited { text-decoration: none; font-weight: normal; color: #0000FF } a.codeRef:link { font-weight: normal; color: #0000FF } a.codeRef:visited { font-weight: normal; color: #0000FF } a:hover { text-decoration: none; background-color: #f2f2ff } dl.el { margin-left: -1cm } .fragment { font-family: Fixed, monospace; font-size: 95%; } pre.fragment { border: 1px solid #CCCCCC; background-color: #f5f5f5; margin-top: 4px; margin-bottom: 4px; margin-left: 2px; margin-right: 8px; padding-left: 6px; padding-right: 6px; padding-top: 4px; padding-bottom: 4px; } div.ah { background-color: black; font-weight: bold; color: #ffffff; margin-bottom: 3px; margin-top: 3px } td.md { background-color: #F4F4FB; font-weight: bold; } td.mdPrefix { background-color: #F4F4FB; color: #606060; font-size: 80%; } td.mdname1 { background-color: #F4F4FB; font-weight: bold; color: #602020; } td.mdname { background-color: #F4F4FB; font-weight: bold; color: #602020; width: 600px; } div.groupHeader { margin-left: 16px; margin-top: 12px; margin-bottom: 6px; font-weight: bold; } div.groupText { margin-left: 16px; font-style: italic; font-size: 90% } td.indexkey { background-color: #eeeeff; font-weight: bold; padding-right : 10px; padding-top : 2px; padding-left : 10px; padding-bottom : 2px; margin-left : 0px; margin-right : 0px; margin-top : 2px; margin-bottom : 2px; border: 1px solid #CCCCCC; } td.indexvalue { background-color: #eeeeff; font-style: italic; padding-right : 10px; padding-top : 2px; padding-left : 10px; padding-bottom : 2px; margin-left : 0px; margin-right : 0px; margin-top : 2px; margin-bottom : 2px; border: 1px solid #CCCCCC; } tr.memlist { background-color: #f0f0f0; } p.formulaDsp { text-align: center; } img.formulaDsp { } img.formulaInl { vertical-align: middle; } span.keyword { color: #008000 } span.keywordtype { color: #604020 } span.keywordflow { color: #e08000 } span.comment { color: #800000 } span.preprocessor { color: #806020 } span.stringliteral { color: #002080 } span.charliteral { color: #008080 } .mdTable { border: 1px solid #868686; background-color: #F4F4FB; } .mdRow { padding: 8px 10px; } .mdescLeft { padding: 0px 8px 4px 8px; font-size: 80%; font-style: italic; background-color: #FAFAFA; border-top: 1px none #E0E0E0; border-right: 1px none #E0E0E0; border-bottom: 1px none #E0E0E0; border-left: 1px none #E0E0E0; margin: 0px; } .mdescRight { padding: 0px 8px 4px 8px; font-size: 80%; font-style: italic; background-color: #FAFAFA; border-top: 1px none #E0E0E0; border-right: 1px none #E0E0E0; border-bottom: 1px none #E0E0E0; border-left: 1px none #E0E0E0; margin: 0px; } .memItemLeft { padding: 1px 0px 0px 8px; margin: 4px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-color: #E0E0E0; border-right-color: #E0E0E0; border-bottom-color: #E0E0E0; border-left-color: #E0E0E0; border-top-style: solid; border-right-style: none; border-bottom-style: none; border-left-style: none; background-color: #FAFAFA; font-size: 80%; } .memItemRight { padding: 1px 8px 0px 8px; margin: 4px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-color: #E0E0E0; border-right-color: #E0E0E0; border-bottom-color: #E0E0E0; border-left-color: #E0E0E0; border-top-style: solid; border-right-style: none; border-bottom-style: none; border-left-style: none; background-color: #FAFAFA; font-size: 80%; } .memTemplItemLeft { padding: 1px 0px 0px 8px; margin: 4px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-color: #E0E0E0; border-right-color: #E0E0E0; border-bottom-color: #E0E0E0; border-left-color: #E0E0E0; border-top-style: none; border-right-style: none; border-bottom-style: none; border-left-style: none; background-color: #FAFAFA; font-size: 80%; } .memTemplItemRight { padding: 1px 8px 0px 8px; margin: 4px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-color: #E0E0E0; border-right-color: #E0E0E0; border-bottom-color: #E0E0E0; border-left-color: #E0E0E0; border-top-style: none; border-right-style: none; border-bottom-style: none; border-left-style: none; background-color: #FAFAFA; font-size: 80%; } .memTemplParams { padding: 1px 0px 0px 8px; margin: 4px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-color: #E0E0E0; border-right-color: #E0E0E0; border-bottom-color: #E0E0E0; border-left-color: #E0E0E0; border-top-style: solid; border-right-style: none; border-bottom-style: none; border-left-style: none; color: #606060; background-color: #FAFAFA; font-size: 80%; } .search { color: #003399; font-weight: bold; } form.search { margin-bottom: 0px; margin-top: 0px; } input.search { font-size: 75%; color: #000080; font-weight: normal; background-color: #eeeeff; } td.tiny { font-size: 75%; } a { color: #252e78; } a:visited { color: #3d2185; } .dirtab { padding: 4px; border-collapse: collapse; border: 1px solid #b0b0b0; } th.dirtab { background: #eeeeff; font-weight: bold; } hr { height: 1px; border: none; border-top: 1px solid black; } iaxmodem-1.2.0/lib/spandsp/doc/Makefile.in0000644000175000017500000002417411150047457017717 0ustar julienjulien# Makefile.in generated by automake 1.9.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = .. am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd INSTALL = @INSTALL@ install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = doc DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(srcdir)/doxygen.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/config/ax_compiler_vendor.m4 \ $(top_srcdir)/config/ax_check_real_file.m4 \ $(top_srcdir)/config/ax_fixed_point_machine.m4 \ $(top_srcdir)/config/ax_misaligned_access_fails.m4 \ $(top_srcdir)/config/ax_c99_features.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/src/config.h CONFIG_CLEAN_FILES = doxygen SOURCES = DIST_SOURCES = DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMDEP_FALSE = @AMDEP_FALSE@ AMDEP_TRUE = @AMDEP_TRUE@ AMTAR = @AMTAR@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CC_FOR_BUILD = @CC_FOR_BUILD@ CFLAGS = @CFLAGS@ COMP_VENDOR_CFLAGS = @COMP_VENDOR_CFLAGS@ COMP_VENDOR_LDFLAGS = @COMP_VENDOR_LDFLAGS@ COND_DOC_FALSE = @COND_DOC_FALSE@ COND_DOC_TRUE = @COND_DOC_TRUE@ COND_MMX_FALSE = @COND_MMX_FALSE@ COND_MMX_TRUE = @COND_MMX_TRUE@ COND_SSE_FALSE = @COND_SSE_FALSE@ COND_SSE_TRUE = @COND_SSE_TRUE@ COND_TESTDATA_FALSE = @COND_TESTDATA_FALSE@ COND_TESTDATA_TRUE = @COND_TESTDATA_TRUE@ COND_TESTS_FALSE = @COND_TESTS_FALSE@ COND_TESTS_TRUE = @COND_TESTS_TRUE@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CPPFLAGS_FOR_BUILD = @CPPFLAGS_FOR_BUILD@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DSYMUTIL = @DSYMUTIL@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ GREP = @GREP@ INSERT_INTTYPES_HEADER = @INSERT_INTTYPES_HEADER@ INSERT_MATH_HEADER = @INSERT_MATH_HEADER@ INSERT_STDINT_HEADER = @INSERT_STDINT_HEADER@ INSERT_TGMATH_HEADER = @INSERT_TGMATH_HEADER@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ NMEDIT = @NMEDIT@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SPANDSP_LT_AGE = @SPANDSP_LT_AGE@ SPANDSP_LT_CURRENT = @SPANDSP_LT_CURRENT@ SPANDSP_LT_REVISION = @SPANDSP_LT_REVISION@ SPANDSP_MISALIGNED_ACCESS_FAILS = @SPANDSP_MISALIGNED_ACCESS_FAILS@ SPANDSP_USE_FIXED_POINT = @SPANDSP_USE_FIXED_POINT@ STRIP = @STRIP@ TESTLIBS = @TESTLIBS@ VERSION = @VERSION@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ MAINTAINERCLEANFILES = Makefile.in EXTRA_DIST = css.css \ t38-gateway.dia \ t38-terminal.dia \ t38_manual.xml \ wrapper.xsl \ t38_manual/css.css all: all-am .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu doc/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu doc/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh doxygen: $(top_builddir)/config.status $(srcdir)/doxygen.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs distclean-libtool: -rm -f libtool uninstall-info-am: tags: TAGS TAGS: ctags: CTAGS CTAGS: distdir: $(DISTFILES) $(mkdir_p) $(distdir)/t38_manual @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ list='$(DISTFILES)'; for file in $$list; do \ case $$file in \ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ esac; \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ dir="/$$dir"; \ $(mkdir_p) "$(distdir)$$dir"; \ else \ dir=''; \ fi; \ if test -d $$d/$$file; then \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic distclean-libtool dvi: dvi-am dvi-am: html: html-am info: info-am info-am: install-data-am: install-exec-am: install-info: install-info-am install-man: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-info-am .PHONY: all all-am check check-am clean clean-generic clean-libtool \ distclean distclean-generic distclean-libtool distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-exec install-exec-am \ install-info install-info-am install-man install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am \ uninstall-info-am all: doxydocs t38_manual/index.html doxydocs: doxygen doxygen t38_manual/index.html: t38_manual.xml cd t38_manual ; xsltproc ../wrapper.xsl ../t38_manual.xml clean: cd t38_manual ; rm *.html ; cd ../api ; rm -rf html # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: iaxmodem-1.2.0/lib/spandsp/doc/css.css0000644000175000017500000002330011150047205017131 0ustar julienjulienbody { background-image: url("../images/weave.jpg"); font-family: Verdana, Arial, Helvetica, Sans-serif; color: black; margin-right: 20px; margin-left: 20px; } h1 { text-align: center; } h2 { font-family: Verdana, Arial, Helvetica, Sans-serif; border-color: #c00000; color : black; margin-top: 0.8em; border-style: solid; border-width: 0px 0px 3px 0.5em; line-height : 130%; } h3 { font-family: Verdana, Arial, Helvetica, Sans-serif; border-color: #f02020; color : black; border-width: 0px 0px 2px 0.5em; border-style: solid; margin-right: 20%; line-height : 130%; } caption { font-weight: bold } a.qindex {} a.qindexRef {} a.el { text-decoration: none; font-weight: bold } a.elRef { font-weight: bold } a.code { text-decoration: none; font-weight: normal; color: #4444ee } a.codeRef { font-weight: normal; color: #4444ee } a:hover { text-decoration: none; background-color: #f2f2ff } dl.el { margin-left: -1cm } div.fragment { width: 100%; border: none; background-color: #eeeeee } div.ah { background-color: black; font-weight: bold; color: #ffffff; margin-bottom: 3px; margin-top: 3px } td { font-family: Verdana, Arial, Helvetica, Sans-serif; font-weight: bold; } .navheader { font-family: Verdana, Arial, Helvetica, Sans-serif; background-color: #B2B2ff; font-weight: bold; } .navfooter { font-family: Verdana, Arial, Helvetica, Sans-serif; background-color: #B2B2ff; font-weight: bold; } table.menu { background-color: #000066; font-weight: bold; text-align: center; width: 100%; } tr.menu { background-color: #ccffff; font-weight: bold; text-align: center; } td.menu { background-color: #f2e0d0; font-weight: bold; text-align: center; } td.md { background-color: #f2f2ff; font-weight: bold; } td.mdname1 { background-color: #f2f2ff; font-weight: bold; color: #602020; } td.mdname { background-color: #f2f2ff; font-weight: bold; color: #602020; width: 600px; } div.groupHeader { margin-left: 16px; margin-top: 12px; margin-bottom: 6px; font-weight: bold } div.groupText { margin-left: 16px; font-style: italic; font-size: smaller } td.indexkey { font-family: Verdana, Arial, Helvetica, Sans-serif; background-color: #eeeeff; font-weight: bold; padding-right : 10px; padding-top : 2px; padding-left : 10px; padding-bottom : 2px; margin-left : 0px; margin-right : 0px; margin-top : 2px; margin-bottom : 2px } td.indexvalue { font-family: Verdana, Arial, Helvetica, Sans-serif; background-color: #eeeeff; font-style: italic; padding-right : 10px; padding-top : 2px; padding-left : 10px; padding-bottom : 2px; margin-left : 0px; margin-right : 0px; margin-top : 2px; margin-bottom : 2px } span.keyword { color: #008000 } span.keywordtype { color: #604020 } span.keywordflow { color: #e08000 } span.comment { color: #800000 } span.preprocessor { color: #806020 } span.stringliteral { color: #002080 } span.charliteral { color: #008080 } em { color: #990000; background-color: transparent; } h1,h2,h3,h4,h5,h6,p,center,td,th,ul,dl,div { font-family: Geneva, Arial, Helvetica, sans-serif; } body,td { font-size: 90%; } h1 { text-align: center; font-size: 160%; } h2 { font-size: 120%; } h3 { font-size: 100%; } caption { font-weight: bold } div.qindex { width: 100%; background-color: #eeeeff; border: 1px solid #b0b0b0; text-align: center; margin: 2px; padding: 2px; line-height: 140%; } div.nav { width: 100%; background-color: #eeeeff; border: 1px solid #b0b0b0; text-align: center; margin: 2px; padding: 2px; line-height: 140%; } div.navtab { background-color: #eeeeff; border: 1px solid #b0b0b0; text-align: center; margin: 2px; margin-right: 15px; padding: 2px; } td.navtab { font-size: 70%; } a.qindex { text-decoration: none; font-weight: bold; color: #1a419d; } a.qindex:visited { text-decoration: none; font-weight: bold; color: #1a419d } a.qindex:hover { text-decoration: none; background-color: #ddddff; } a.qindexHL { text-decoration: none; font-weight: bold; background-color: #6666cc; color: #ffffff; border: 1px double #9295C2; } a.qindexHL:hover { text-decoration: none; background-color: #6666cc; color: #ffffff; } a.qindexHL:visited { text-decoration: none; background-color: #6666cc; color: #ffffff } a.el { text-decoration: none; font-weight: bold } a.elRef { font-weight: bold } a.code:link { text-decoration: none; font-weight: normal; color: #0000FF } a.code:visited { text-decoration: none; font-weight: normal; color: #0000FF } a.codeRef:link { font-weight: normal; color: #0000FF } a.codeRef:visited { font-weight: normal; color: #0000FF } a:hover { text-decoration: none; background-color: #f2f2ff } dl.el { margin-left: -1cm } .fragment { font-family: Fixed, monospace; font-size: 95%; } pre.fragment { border: 1px solid #CCCCCC; background-color: #f5f5f5; margin-top: 4px; margin-bottom: 4px; margin-left: 2px; margin-right: 8px; padding-left: 6px; padding-right: 6px; padding-top: 4px; padding-bottom: 4px; } div.ah { background-color: black; font-weight: bold; color: #ffffff; margin-bottom: 3px; margin-top: 3px } td.md { background-color: #F4F4FB; font-weight: bold; } td.mdPrefix { background-color: #F4F4FB; color: #606060; font-size: 80%; } td.mdname1 { background-color: #F4F4FB; font-weight: bold; color: #602020; } td.mdname { background-color: #F4F4FB; font-weight: bold; color: #602020; width: 600px; } div.groupHeader { margin-left: 16px; margin-top: 12px; margin-bottom: 6px; font-weight: bold; } div.groupText { margin-left: 16px; font-style: italic; font-size: 90% } td.indexkey { background-color: #eeeeff; font-weight: bold; padding-right : 10px; padding-top : 2px; padding-left : 10px; padding-bottom : 2px; margin-left : 0px; margin-right : 0px; margin-top : 2px; margin-bottom : 2px; border: 1px solid #CCCCCC; } td.indexvalue { background-color: #eeeeff; font-style: italic; padding-right : 10px; padding-top : 2px; padding-left : 10px; padding-bottom : 2px; margin-left : 0px; margin-right : 0px; margin-top : 2px; margin-bottom : 2px; border: 1px solid #CCCCCC; } tr.memlist { background-color: #f0f0f0; } p.formulaDsp { text-align: center; } img.formulaDsp { } img.formulaInl { vertical-align: middle; } span.keyword { color: #008000 } span.keywordtype { color: #604020 } span.keywordflow { color: #e08000 } span.comment { color: #800000 } span.preprocessor { color: #806020 } span.stringliteral { color: #002080 } span.charliteral { color: #008080 } .mdTable { border: 1px solid #868686; background-color: #F4F4FB; } .mdRow { padding: 8px 10px; } .mdescLeft { padding: 0px 8px 4px 8px; font-size: 80%; font-style: italic; background-color: #FAFAFA; border-top: 1px none #E0E0E0; border-right: 1px none #E0E0E0; border-bottom: 1px none #E0E0E0; border-left: 1px none #E0E0E0; margin: 0px; } .mdescRight { padding: 0px 8px 4px 8px; font-size: 80%; font-style: italic; background-color: #FAFAFA; border-top: 1px none #E0E0E0; border-right: 1px none #E0E0E0; border-bottom: 1px none #E0E0E0; border-left: 1px none #E0E0E0; margin: 0px; } .memItemLeft { padding: 1px 0px 0px 8px; margin: 4px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-color: #E0E0E0; border-right-color: #E0E0E0; border-bottom-color: #E0E0E0; border-left-color: #E0E0E0; border-top-style: solid; border-right-style: none; border-bottom-style: none; border-left-style: none; background-color: #FAFAFA; font-size: 80%; } .memItemRight { padding: 1px 8px 0px 8px; margin: 4px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-color: #E0E0E0; border-right-color: #E0E0E0; border-bottom-color: #E0E0E0; border-left-color: #E0E0E0; border-top-style: solid; border-right-style: none; border-bottom-style: none; border-left-style: none; background-color: #FAFAFA; font-size: 80%; } .memTemplItemLeft { padding: 1px 0px 0px 8px; margin: 4px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-color: #E0E0E0; border-right-color: #E0E0E0; border-bottom-color: #E0E0E0; border-left-color: #E0E0E0; border-top-style: none; border-right-style: none; border-bottom-style: none; border-left-style: none; background-color: #FAFAFA; font-size: 80%; } .memTemplItemRight { padding: 1px 8px 0px 8px; margin: 4px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-color: #E0E0E0; border-right-color: #E0E0E0; border-bottom-color: #E0E0E0; border-left-color: #E0E0E0; border-top-style: none; border-right-style: none; border-bottom-style: none; border-left-style: none; background-color: #FAFAFA; font-size: 80%; } .memTemplParams { padding: 1px 0px 0px 8px; margin: 4px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-color: #E0E0E0; border-right-color: #E0E0E0; border-bottom-color: #E0E0E0; border-left-color: #E0E0E0; border-top-style: solid; border-right-style: none; border-bottom-style: none; border-left-style: none; color: #606060; background-color: #FAFAFA; font-size: 80%; } .search { color: #003399; font-weight: bold; } form.search { margin-bottom: 0px; margin-top: 0px; } input.search { font-size: 75%; color: #000080; font-weight: normal; background-color: #eeeeff; } td.tiny { font-size: 75%; } a { color: #252e78; } a:visited { color: #3d2185; } .dirtab { padding: 4px; border-collapse: collapse; border: 1px solid #b0b0b0; } th.dirtab { background: #eeeeff; font-weight: bold; } hr { height: 1px; border: none; border-top: 1px solid black; } iaxmodem-1.2.0/lib/spandsp/doc/doxygen.in0000644000175000017500000014272211150047205017646 0ustar julienjulien# Doxyfile 1.4.4 # This file describes the settings to be used by the documentation system # doxygen (www.doxygen.org) for a project # # All text after a hash (#) is considered a comment and will be ignored # The format is: # TAG = value [value, ...] # For lists items can also be appended using: # TAG += value [value, ...] # Values that contain spaces should be placed between quotes (" ") #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- # The PROJECT_NAME tag is a single word (or a sequence of words surrounded # by quotes) that should identify the project. PROJECT_NAME = @PACKAGE@ # The PROJECT_NUMBER tag can be used to enter a project or revision number. # This could be handy for archiving the generated documentation or # if some version control system is used. PROJECT_NUMBER = @VERSION@ # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) # base path where the generated documentation will be put. # If a relative path is entered, it will be relative to the location # where doxygen was started. If left blank the current directory will be used. OUTPUT_DIRECTORY = api # If the CREATE_SUBDIRS tag is set to YES, then doxygen will create # 4096 sub-directories (in 2 levels) under the output directory of each output # format and will distribute the generated files over these directories. # Enabling this option can be useful when feeding doxygen a huge amount of # source files, where putting all generated files in the same directory would # otherwise cause performance problems for the file system. CREATE_SUBDIRS = NO # The OUTPUT_LANGUAGE tag is used to specify the language in which all # documentation generated by doxygen is written. Doxygen will use this # information to generate all constant output in the proper language. # The default language is English, other supported languages are: # Brazilian, Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, # Dutch, Finnish, French, German, Greek, Hungarian, Italian, Japanese, # Japanese-en (Japanese with English messages), Korean, Korean-en, Norwegian, # Polish, Portuguese, Romanian, Russian, Serbian, Slovak, Slovene, Spanish, # Swedish, and Ukrainian. OUTPUT_LANGUAGE = English # This tag can be used to specify the encoding used in the generated output. # The encoding is not always determined by the language that is chosen, # but also whether or not the output is meant for Windows or non-Windows users. # In case there is a difference, setting the USE_WINDOWS_ENCODING tag to YES # forces the Windows encoding (this is the default for the Windows binary), # whereas setting the tag to NO uses a Unix-style encoding (the default for # all platforms other than Windows). USE_WINDOWS_ENCODING = YES # If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will # include brief member descriptions after the members that are listed in # the file and class documentation (similar to JavaDoc). # Set to NO to disable this. BRIEF_MEMBER_DESC = YES # If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend # the brief description of a member or function before the detailed description. # Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the # brief descriptions will be completely suppressed. REPEAT_BRIEF = YES # This tag implements a quasi-intelligent brief description abbreviator # that is used to form the text in various listings. Each string # in this list, if found as the leading text of the brief description, will be # stripped from the text and the result after processing the whole list, is # used as the annotated text. Otherwise, the brief description is used as-is. # If left blank, the following values are used ("$name" is automatically # replaced with the name of the entity): "The $name class" "The $name widget" # "The $name file" "is" "provides" "specifies" "contains" # "represents" "a" "an" "the" ABBREVIATE_BRIEF = # If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then # Doxygen will generate a detailed section even if there is only a brief # description. ALWAYS_DETAILED_SEC = NO # If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all # inherited members of a class in the documentation of that class as if those # members were ordinary class members. Constructors, destructors and assignment # operators of the base classes will not be shown. INLINE_INHERITED_MEMB = NO # If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full # path before files name in the file list and in the header files. If set # to NO the shortest path that makes the file name unique will be used. FULL_PATH_NAMES = NO # If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag # can be used to strip a user-defined part of the path. Stripping is # only done if one of the specified strings matches the left-hand part of # the path. The tag can be used to show relative paths in the file list. # If left blank the directory from which doxygen is run is used as the # path to strip. STRIP_FROM_PATH = # The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of # the path mentioned in the documentation of a class, which tells # the reader which header file to include in order to use a class. # If left blank only the name of the header file containing the class # definition is used. Otherwise one should specify the include paths that # are normally passed to the compiler using the -I flag. STRIP_FROM_INC_PATH = # If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter # (but less readable) file names. This can be useful is your file systems # doesn't support long names like on DOS, Mac, or CD-ROM. SHORT_NAMES = NO # If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen # will interpret the first line (until the first dot) of a JavaDoc-style # comment as the brief description. If set to NO, the JavaDoc # comments will behave just like the Qt-style comments (thus requiring an # explicit @brief command for a brief description. JAVADOC_AUTOBRIEF = NO # The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen # treat a multi-line C++ special comment block (i.e. a block of //! or /// # comments) as a brief description. This used to be the default behaviour. # The new default is to treat a multi-line C++ comment block as a detailed # description. Set this tag to YES if you prefer the old behaviour instead. MULTILINE_CPP_IS_BRIEF = NO # If the DETAILS_AT_TOP tag is set to YES then Doxygen # will output the detailed description near the top, like JavaDoc. # If set to NO, the detailed description appears after the member # documentation. DETAILS_AT_TOP = NO # If the INHERIT_DOCS tag is set to YES (the default) then an undocumented # member inherits the documentation from any documented member that it # re-implements. INHERIT_DOCS = YES # If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC # tag is set to YES, then doxygen will reuse the documentation of the first # member in the group (if any) for the other members of the group. By default # all members of a group must be documented explicitly. DISTRIBUTE_GROUP_DOC = NO # If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce # a new page for each member. If set to NO, the documentation of a member will # be part of the file/class/namespace that contains it. SEPARATE_MEMBER_PAGES = NO # The TAB_SIZE tag can be used to set the number of spaces in a tab. # Doxygen uses this value to replace tabs by spaces in code fragments. TAB_SIZE = 8 # This tag can be used to specify a number of aliases that acts # as commands in the documentation. An alias has the form "name=value". # For example adding "sideeffect=\par Side Effects:\n" will allow you to # put the command \sideeffect (or @sideeffect) in the documentation, which # will result in a user-defined paragraph with heading "Side Effects:". # You can put \n's in the value part of an alias to insert newlines. ALIASES = # Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C # sources only. Doxygen will then generate output that is more tailored for C. # For instance, some of the names that are used will be different. The list # of all members will be omitted, etc. OPTIMIZE_OUTPUT_FOR_C = NO # Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java sources # only. Doxygen will then generate output that is more tailored for Java. # For instance, namespaces will be presented as packages, qualified scopes # will look different, etc. OPTIMIZE_OUTPUT_JAVA = NO # Set the SUBGROUPING tag to YES (the default) to allow class member groups of # the same type (for instance a group of public functions) to be put as a # subgroup of that type (e.g. under the Public Functions section). Set it to # NO to prevent subgrouping. Alternatively, this can be done per class using # the \nosubgrouping command. SUBGROUPING = YES #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- # If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in # documentation are documented, even if no documentation was available. # Private class members and static file members will be hidden unless # the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES EXTRACT_ALL = NO # If the EXTRACT_PRIVATE tag is set to YES all private members of a class # will be included in the documentation. EXTRACT_PRIVATE = NO # If the EXTRACT_STATIC tag is set to YES all static members of a file # will be included in the documentation. EXTRACT_STATIC = NO # If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) # defined locally in source files will be included in the documentation. # If set to NO only classes defined in header files are included. EXTRACT_LOCAL_CLASSES = YES # This flag is only useful for Objective-C code. When set to YES local # methods, which are defined in the implementation section but not in # the interface are included in the documentation. # If set to NO (the default) only methods in the interface are included. EXTRACT_LOCAL_METHODS = NO # If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all # undocumented members of documented classes, files or namespaces. # If set to NO (the default) these members will be included in the # various overviews, but no documentation section is generated. # This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_MEMBERS = NO # If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all # undocumented classes that are normally visible in the class hierarchy. # If set to NO (the default) these classes will be included in the various # overviews. This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_CLASSES = NO # If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all # friend (class|struct|union) declarations. # If set to NO (the default) these declarations will be included in the # documentation. HIDE_FRIEND_COMPOUNDS = NO # If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any # documentation blocks found inside the body of a function. # If set to NO (the default) these blocks will be appended to the # function's detailed documentation block. HIDE_IN_BODY_DOCS = NO # The INTERNAL_DOCS tag determines if documentation # that is typed after a \internal command is included. If the tag is set # to NO (the default) then the documentation will be excluded. # Set it to YES to include the internal documentation. INTERNAL_DOCS = NO # If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate # file names in lower-case letters. If set to YES upper-case letters are also # allowed. This is useful if you have classes or files whose names only differ # in case and if your file system supports case sensitive file names. Windows # and Mac users are advised to set this option to NO. CASE_SENSE_NAMES = YES # If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen # will show members with their full class and namespace scopes in the # documentation. If set to YES the scope will be hidden. HIDE_SCOPE_NAMES = NO # If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen # will put a list of the files that are included by a file in the documentation # of that file. SHOW_INCLUDE_FILES = YES # If the INLINE_INFO tag is set to YES (the default) then a tag [inline] # is inserted in the documentation for inline members. INLINE_INFO = YES # If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen # will sort the (detailed) documentation of file and class members # alphabetically by member name. If set to NO the members will appear in # declaration order. SORT_MEMBER_DOCS = YES # If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the # brief documentation of file, namespace and class members alphabetically # by member name. If set to NO (the default) the members will appear in # declaration order. SORT_BRIEF_DOCS = NO # If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be # sorted by fully-qualified names, including namespaces. If set to # NO (the default), the class list will be sorted only by class name, # not including the namespace part. # Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. # Note: This option applies only to the class list, not to the # alphabetical list. SORT_BY_SCOPE_NAME = NO # The GENERATE_TODOLIST tag can be used to enable (YES) or # disable (NO) the todo list. This list is created by putting \todo # commands in the documentation. GENERATE_TODOLIST = YES # The GENERATE_TESTLIST tag can be used to enable (YES) or # disable (NO) the test list. This list is created by putting \test # commands in the documentation. GENERATE_TESTLIST = YES # The GENERATE_BUGLIST tag can be used to enable (YES) or # disable (NO) the bug list. This list is created by putting \bug # commands in the documentation. GENERATE_BUGLIST = YES # The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or # disable (NO) the deprecated list. This list is created by putting # \deprecated commands in the documentation. GENERATE_DEPRECATEDLIST= YES # The ENABLED_SECTIONS tag can be used to enable conditional # documentation sections, marked by \if sectionname ... \endif. ENABLED_SECTIONS = # The MAX_INITIALIZER_LINES tag determines the maximum number of lines # the initial value of a variable or define consists of for it to appear in # the documentation. If the initializer consists of more lines than specified # here it will be hidden. Use a value of 0 to hide initializers completely. # The appearance of the initializer of individual variables and defines in the # documentation can be controlled using \showinitializer or \hideinitializer # command in the documentation regardless of this setting. MAX_INITIALIZER_LINES = 30 # Set the SHOW_USED_FILES tag to NO to disable the list of files generated # at the bottom of the documentation of classes and structs. If set to YES the # list will mention the files that were used to generate the documentation. SHOW_USED_FILES = YES # If the sources in your project are distributed over multiple directories # then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy # in the documentation. The default is YES. SHOW_DIRECTORIES = YES # The FILE_VERSION_FILTER tag can be used to specify a program or script that # doxygen should invoke to get the current version for each file (typically from the # version control system). Doxygen will invoke the program by executing (via # popen()) the command , where is the value of # the FILE_VERSION_FILTER tag, and is the name of an input file # provided by doxygen. Whatever the progam writes to standard output # is used as the file version. See the manual for examples. FILE_VERSION_FILTER = #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- # The QUIET tag can be used to turn on/off the messages that are generated # by doxygen. Possible values are YES and NO. If left blank NO is used. QUIET = NO # The WARNINGS tag can be used to turn on/off the warning messages that are # generated by doxygen. Possible values are YES and NO. If left blank # NO is used. WARNINGS = YES # If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings # for undocumented members. If EXTRACT_ALL is set to YES then this flag will # automatically be disabled. WARN_IF_UNDOCUMENTED = YES # If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for # potential errors in the documentation, such as not documenting some # parameters in a documented function, or documenting parameters that # don't exist or using markup commands wrongly. WARN_IF_DOC_ERROR = YES # This WARN_NO_PARAMDOC option can be abled to get warnings for # functions that are documented, but have no documentation for their parameters # or return value. If set to NO (the default) doxygen will only warn about # wrong or incomplete parameter documentation, but not about the absence of # documentation. WARN_NO_PARAMDOC = NO # The WARN_FORMAT tag determines the format of the warning messages that # doxygen can produce. The string should contain the $file, $line, and $text # tags, which will be replaced by the file and line number from which the # warning originated and the warning text. Optionally the format may contain # $version, which will be replaced by the version of the file (if it could # be obtained via FILE_VERSION_FILTER) WARN_FORMAT = # The WARN_LOGFILE tag can be used to specify a file to which warning # and error messages should be written. If left blank the output is written # to stderr. WARN_LOGFILE = #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- # The INPUT tag can be used to specify the files and/or directories that contain # documented source files. You may enter file names like "myfile.cpp" or # directories like "/usr/src/myproject". Separate the files or directories # with spaces. INPUT = .. # If the value of the INPUT tag contains directories, you can use the # FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank the following patterns are tested: # *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx # *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm FILE_PATTERNS = *.c \ *.h # The RECURSIVE tag can be used to turn specify whether or not subdirectories # should be searched for input files as well. Possible values are YES and NO. # If left blank NO is used. RECURSIVE = YES # The EXCLUDE tag can be used to specify files and/or directories that should # excluded from the INPUT source files. This way you can easily exclude a # subdirectory from a directory tree whose root is specified with the INPUT tag. EXCLUDE = # The EXCLUDE_SYMLINKS tag can be used select whether or not files or # directories that are symbolic links (a Unix filesystem feature) are excluded # from the input. EXCLUDE_SYMLINKS = NO # If the value of the INPUT tag contains directories, you can use the # EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude # certain files from those directories. Note that the wildcards are matched # against the file with absolute path, so to exclude all test directories # for example use the pattern */test/* EXCLUDE_PATTERNS = # The EXAMPLE_PATH tag can be used to specify one or more files or # directories that contain example code fragments that are included (see # the \include command). EXAMPLE_PATH = # If the value of the EXAMPLE_PATH tag contains directories, you can use the # EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank all files are included. EXAMPLE_PATTERNS = # If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be # searched for input files to be used with the \include or \dontinclude # commands irrespective of the value of the RECURSIVE tag. # Possible values are YES and NO. If left blank NO is used. EXAMPLE_RECURSIVE = NO # The IMAGE_PATH tag can be used to specify one or more files or # directories that contain image that are included in the documentation (see # the \image command). IMAGE_PATH = # The INPUT_FILTER tag can be used to specify a program that doxygen should # invoke to filter for each input file. Doxygen will invoke the filter program # by executing (via popen()) the command , where # is the value of the INPUT_FILTER tag, and is the name of an # input file. Doxygen will then use the output that the filter program writes # to standard output. If FILTER_PATTERNS is specified, this tag will be # ignored. INPUT_FILTER = # The FILTER_PATTERNS tag can be used to specify filters on a per file pattern # basis. Doxygen will compare the file name with each pattern and apply the # filter if there is a match. The filters are a list of the form: # pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further # info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER # is applied to all files. FILTER_PATTERNS = # If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using # INPUT_FILTER) will be used to filter the input files when producing source # files to browse (i.e. when SOURCE_BROWSER is set to YES). FILTER_SOURCE_FILES = NO #--------------------------------------------------------------------------- # configuration options related to source browsing #--------------------------------------------------------------------------- # If the SOURCE_BROWSER tag is set to YES then a list of source files will # be generated. Documented entities will be cross-referenced with these sources. # Note: To get rid of all source code in the generated output, make sure also # VERBATIM_HEADERS is set to NO. SOURCE_BROWSER = NO # Setting the INLINE_SOURCES tag to YES will include the body # of functions and classes directly in the documentation. INLINE_SOURCES = NO # Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct # doxygen to hide any special comment blocks from generated source code # fragments. Normal C and C++ comments will always remain visible. STRIP_CODE_COMMENTS = NO # If the REFERENCED_BY_RELATION tag is set to YES (the default) # then for each documented function all documented # functions referencing it will be listed. REFERENCED_BY_RELATION = YES # If the REFERENCES_RELATION tag is set to YES (the default) # then for each documented function all documented entities # called/used by that function will be listed. REFERENCES_RELATION = YES # If the USE_HTAGS tag is set to YES then the references to source code # will point to the HTML generated by the htags(1) tool instead of doxygen # built-in source browser. The htags tool is part of GNU's global source # tagging system (see http://www.gnu.org/software/global/global.html). You # will need version 4.8.6 or higher. USE_HTAGS = NO # If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen # will generate a verbatim copy of the header file for each class for # which an include is specified. Set to NO to disable this. VERBATIM_HEADERS = YES #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- # If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index # of all compounds will be generated. Enable this if the project # contains a lot of classes, structs, unions or interfaces. ALPHABETICAL_INDEX = YES # If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then # the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns # in which this list will be split (can be a number in the range [1..20]) COLS_IN_ALPHA_INDEX = 2 # In case all classes in a project start with a common prefix, all # classes will be put under the same header in the alphabetical index. # The IGNORE_PREFIX tag can be used to specify one or more prefixes that # should be ignored while generating the index headers. IGNORE_PREFIX = #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- # If the GENERATE_HTML tag is set to YES (the default) Doxygen will # generate HTML output. GENERATE_HTML = YES # The HTML_OUTPUT tag is used to specify where the HTML docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `html' will be used as the default path. HTML_OUTPUT = # The HTML_FILE_EXTENSION tag can be used to specify the file extension for # each generated HTML page (for example: .htm,.php,.asp). If it is left blank # doxygen will generate files with .html extension. HTML_FILE_EXTENSION = .html # The HTML_HEADER tag can be used to specify a personal HTML header for # each generated HTML page. If it is left blank doxygen will generate a # standard header. HTML_HEADER = # The HTML_FOOTER tag can be used to specify a personal HTML footer for # each generated HTML page. If it is left blank doxygen will generate a # standard footer. HTML_FOOTER = # The HTML_STYLESHEET tag can be used to specify a user-defined cascading # style sheet that is used by each HTML page. It can be used to # fine-tune the look of the HTML output. If the tag is left blank doxygen # will generate a default style sheet. Note that doxygen will try to copy # the style sheet file to the HTML output directory, so don't put your own # stylesheet in the HTML output directory as well, or it will be erased! HTML_STYLESHEET = css.css # If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, # files or namespaces will be aligned in HTML using tables. If set to # NO a bullet list will be used. HTML_ALIGN_MEMBERS = YES # If the GENERATE_HTMLHELP tag is set to YES, additional index files # will be generated that can be used as input for tools like the # Microsoft HTML help workshop to generate a compressed HTML help file (.chm) # of the generated HTML documentation. GENERATE_HTMLHELP = NO # If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can # be used to specify the file name of the resulting .chm file. You # can add a path in front of the file if the result should not be # written to the html output directory. CHM_FILE = # If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can # be used to specify the location (absolute path including file name) of # the HTML help compiler (hhc.exe). If non-empty doxygen will try to run # the HTML help compiler on the generated index.hhp. HHC_LOCATION = # If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag # controls if a separate .chi index file is generated (YES) or that # it should be included in the master .chm file (NO). GENERATE_CHI = NO # If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag # controls whether a binary table of contents is generated (YES) or a # normal table of contents (NO) in the .chm file. BINARY_TOC = NO # The TOC_EXPAND flag can be set to YES to add extra items for group members # to the contents of the HTML help documentation and to the tree view. TOC_EXPAND = NO # The DISABLE_INDEX tag can be used to turn on/off the condensed index at # top of each HTML page. The value NO (the default) enables the index and # the value YES disables it. DISABLE_INDEX = NO # This tag can be used to set the number of enum values (range [1..20]) # that doxygen will group on one line in the generated HTML documentation. ENUM_VALUES_PER_LINE = 4 # If the GENERATE_TREEVIEW tag is set to YES, a side panel will be # generated containing a tree-like index structure (just like the one that # is generated for HTML Help). For this to work a browser that supports # JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, # Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are # probably better off using the HTML help feature. GENERATE_TREEVIEW = YES # If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be # used to set the initial width (in pixels) of the frame in which the tree # is shown. TREEVIEW_WIDTH = 250 #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- # If the GENERATE_LATEX tag is set to YES (the default) Doxygen will # generate Latex output. GENERATE_LATEX = NO # The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `latex' will be used as the default path. LATEX_OUTPUT = # The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be # invoked. If left blank `latex' will be used as the default command name. LATEX_CMD_NAME = latex # The MAKEINDEX_CMD_NAME tag can be used to specify the command name to # generate index for LaTeX. If left blank `makeindex' will be used as the # default command name. MAKEINDEX_CMD_NAME = makeindex # If the COMPACT_LATEX tag is set to YES Doxygen generates more compact # LaTeX documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_LATEX = NO # The PAPER_TYPE tag can be used to set the paper type that is used # by the printer. Possible values are: a4, a4wide, letter, legal and # executive. If left blank a4wide will be used. PAPER_TYPE = a4wide # The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX # packages that should be included in the LaTeX output. EXTRA_PACKAGES = # The LATEX_HEADER tag can be used to specify a personal LaTeX header for # the generated latex document. The header should contain everything until # the first chapter. If it is left blank doxygen will generate a # standard header. Notice: only use this tag if you know what you are doing! LATEX_HEADER = # If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated # is prepared for conversion to pdf (using ps2pdf). The pdf file will # contain links (just like the HTML output) instead of page references # This makes the output suitable for online browsing using a pdf viewer. PDF_HYPERLINKS = NO # If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of # plain latex in the generated Makefile. Set this option to YES to get a # higher quality PDF documentation. USE_PDFLATEX = NO # If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. # command to the generated LaTeX files. This will instruct LaTeX to keep # running if errors occur, instead of asking the user for help. # This option is also used when generating formulas in HTML. LATEX_BATCHMODE = NO # If LATEX_HIDE_INDICES is set to YES then doxygen will not # include the index chapters (such as File Index, Compound Index, etc.) # in the output. LATEX_HIDE_INDICES = NO #--------------------------------------------------------------------------- # configuration options related to the RTF output #--------------------------------------------------------------------------- # If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output # The RTF output is optimized for Word 97 and may not look very pretty with # other RTF readers or editors. GENERATE_RTF = NO # The RTF_OUTPUT tag is used to specify where the RTF docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `rtf' will be used as the default path. RTF_OUTPUT = # If the COMPACT_RTF tag is set to YES Doxygen generates more compact # RTF documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_RTF = NO # If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated # will contain hyperlink fields. The RTF file will # contain links (just like the HTML output) instead of page references. # This makes the output suitable for online browsing using WORD or other # programs which support those fields. # Note: wordpad (write) and others do not support links. RTF_HYPERLINKS = NO # Load stylesheet definitions from file. Syntax is similar to doxygen's # config file, i.e. a series of assignments. You only have to provide # replacements, missing definitions are set to their default value. RTF_STYLESHEET_FILE = # Set optional variables used in the generation of an rtf document. # Syntax is similar to doxygen's config file. RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- # If the GENERATE_MAN tag is set to YES (the default) Doxygen will # generate man pages GENERATE_MAN = NO # The MAN_OUTPUT tag is used to specify where the man pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `man' will be used as the default path. MAN_OUTPUT = # The MAN_EXTENSION tag determines the extension that is added to # the generated man pages (default is the subroutine's section .3) MAN_EXTENSION = # If the MAN_LINKS tag is set to YES and Doxygen generates man output, # then it will generate one additional man file for each entity # documented in the real man page(s). These additional files # only source the real man page, but without them the man command # would be unable to find the correct page. The default is NO. MAN_LINKS = NO #--------------------------------------------------------------------------- # configuration options related to the XML output #--------------------------------------------------------------------------- # If the GENERATE_XML tag is set to YES Doxygen will # generate an XML file that captures the structure of # the code including all documentation. GENERATE_XML = NO # The XML_OUTPUT tag is used to specify where the XML pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `xml' will be used as the default path. XML_OUTPUT = xml # The XML_SCHEMA tag can be used to specify an XML schema, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_SCHEMA = # The XML_DTD tag can be used to specify an XML DTD, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_DTD = # If the XML_PROGRAMLISTING tag is set to YES Doxygen will # dump the program listings (including syntax highlighting # and cross-referencing information) to the XML output. Note that # enabling this will significantly increase the size of the XML output. XML_PROGRAMLISTING = YES #--------------------------------------------------------------------------- # configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- # If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will # generate an AutoGen Definitions (see autogen.sf.net) file # that captures the structure of the code including all # documentation. Note that this feature is still experimental # and incomplete at the moment. GENERATE_AUTOGEN_DEF = NO #--------------------------------------------------------------------------- # configuration options related to the Perl module output #--------------------------------------------------------------------------- # If the GENERATE_PERLMOD tag is set to YES Doxygen will # generate a Perl module file that captures the structure of # the code including all documentation. Note that this # feature is still experimental and incomplete at the # moment. GENERATE_PERLMOD = NO # If the PERLMOD_LATEX tag is set to YES Doxygen will generate # the necessary Makefile rules, Perl scripts and LaTeX code to be able # to generate PDF and DVI output from the Perl module output. PERLMOD_LATEX = NO # If the PERLMOD_PRETTY tag is set to YES the Perl module output will be # nicely formatted so it can be parsed by a human reader. This is useful # if you want to understand what is going on. On the other hand, if this # tag is set to NO the size of the Perl module output will be much smaller # and Perl will parse it just the same. PERLMOD_PRETTY = YES # The names of the make variables in the generated doxyrules.make file # are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. # This is useful so different doxyrules.make files included by the same # Makefile don't overwrite each other's variables. PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- # If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will # evaluate all C-preprocessor directives found in the sources and include # files. ENABLE_PREPROCESSING = YES # If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro # names in the source code. If set to NO (the default) only conditional # compilation will be performed. Macro expansion can be done in a controlled # way by setting EXPAND_ONLY_PREDEF to YES. MACRO_EXPANSION = NO # If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES # then the macro expansion is limited to the macros specified with the # PREDEFINED and EXPAND_AS_PREDEFINED tags. EXPAND_ONLY_PREDEF = NO # If the SEARCH_INCLUDES tag is set to YES (the default) the includes files # in the INCLUDE_PATH (see below) will be search if a #include is found. SEARCH_INCLUDES = YES # The INCLUDE_PATH tag can be used to specify one or more directories that # contain include files that are not input files but should be processed by # the preprocessor. INCLUDE_PATH = # You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard # patterns (like *.h and *.hpp) to filter out the header-files in the # directories. If left blank, the patterns specified with FILE_PATTERNS will # be used. INCLUDE_FILE_PATTERNS = # The PREDEFINED tag can be used to specify one or more macro names that # are defined before the preprocessor is started (similar to the -D option of # gcc). The argument of the tag is a list of macros of the form: name # or name=definition (no spaces). If the definition and the = are # omitted =1 is assumed. To prevent a macro definition from being # undefined via #undef or recursively expanded use the := operator # instead of the = operator. PREDEFINED = # If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then # this tag can be used to specify a list of macro names that should be expanded. # The macro definition that is found in the sources will be used. # Use the PREDEFINED tag if you want to use a different macro definition. EXPAND_AS_DEFINED = # If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then # doxygen's preprocessor will remove all function-like macros that are alone # on a line, have an all uppercase name, and do not end with a semicolon. Such # function macros are typically used for boiler-plate code, and will confuse # the parser if not removed. SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- # Configuration::additions related to external references #--------------------------------------------------------------------------- # The TAGFILES option can be used to specify one or more tagfiles. # Optionally an initial location of the external documentation # can be added for each tagfile. The format of a tag file without # this location is as follows: # TAGFILES = file1 file2 ... # Adding location for the tag files is done as follows: # TAGFILES = file1=loc1 "file2 = loc2" ... # where "loc1" and "loc2" can be relative or absolute paths or # URLs. If a location is present for each tag, the installdox tool # does not have to be run to correct the links. # Note that each tag file must have a unique name # (where the name does NOT include the path) # If a tag file is not located in the directory in which doxygen # is run, you must also specify the path to the tagfile here. TAGFILES = # When a file name is specified after GENERATE_TAGFILE, doxygen will create # a tag file that is based on the input files it reads. GENERATE_TAGFILE = # If the ALLEXTERNALS tag is set to YES all external classes will be listed # in the class index. If set to NO only the inherited external classes # will be listed. ALLEXTERNALS = NO # If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed # in the modules index. If set to NO, only the current project's groups will # be listed. EXTERNAL_GROUPS = YES # The PERL_PATH should be the absolute path and name of the perl script # interpreter (i.e. the result of `which perl'). PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- # If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will # generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base # or super classes. Setting the tag to NO turns the diagrams off. Note that # this option is superseded by the HAVE_DOT option below. This is only a # fallback. It is recommended to install and use dot, since it yields more # powerful graphs. CLASS_DIAGRAMS = YES # If set to YES, the inheritance and collaboration graphs will hide # inheritance and usage relations if the target is undocumented # or is not a class. HIDE_UNDOC_RELATIONS = YES # If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is # available from the path. This tool is part of Graphviz, a graph visualization # toolkit from AT&T and Lucent Bell Labs. The other options in this section # have no effect if this option is set to NO (the default) HAVE_DOT = NO # If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect inheritance relations. Setting this tag to YES will force the # the CLASS_DIAGRAMS tag to NO. CLASS_GRAPH = YES # If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect implementation dependencies (inheritance, containment, and # class references variables) of the class with other documented classes. COLLABORATION_GRAPH = YES # If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen # will generate a graph for groups, showing the direct groups dependencies GROUP_GRAPHS = YES # If the UML_LOOK tag is set to YES doxygen will generate inheritance and # collaboration diagrams in a style similar to the OMG's Unified Modeling # Language. UML_LOOK = NO # If set to YES, the inheritance and collaboration graphs will show the # relations between templates and their instances. TEMPLATE_RELATIONS = YES # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT # tags are set to YES then doxygen will generate a graph for each documented # file showing the direct and indirect include dependencies of the file with # other documented files. INCLUDE_GRAPH = YES # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and # HAVE_DOT tags are set to YES then doxygen will generate a graph for each # documented header file showing the documented files that directly or # indirectly include this file. INCLUDED_BY_GRAPH = YES # If the CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will # generate a call dependency graph for every global function or class method. # Note that enabling this option will significantly increase the time of a run. # So in most cases it will be better to enable call graphs for selected # functions only using the \callgraph command. CALL_GRAPH = NO # If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen # will graphical hierarchy of all classes instead of a textual one. GRAPHICAL_HIERARCHY = YES # If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES # then doxygen will show the dependencies a directory has on other directories # in a graphical way. The dependency relations are determined by the #include # relations between the files in the directories. DIRECTORY_GRAPH = YES # The DOT_IMAGE_FORMAT tag can be used to set the image format of the images # generated by dot. Possible values are png, jpg, or gif # If left blank png will be used. DOT_IMAGE_FORMAT = png # The tag DOT_PATH can be used to specify the path where the dot tool can be # found. If left blank, it is assumed the dot tool can be found in the path. DOT_PATH = # The DOTFILE_DIRS tag can be used to specify one or more directories that # contain dot files that are included in the documentation (see the # \dotfile command). DOTFILE_DIRS = # The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width # (in pixels) of the graphs generated by dot. If a graph becomes larger than # this value, doxygen will try to truncate the graph, so that it fits within # the specified constraint. Beware that most browsers cannot cope with very # large images. MAX_DOT_GRAPH_WIDTH = 1024 # The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height # (in pixels) of the graphs generated by dot. If a graph becomes larger than # this value, doxygen will try to truncate the graph, so that it fits within # the specified constraint. Beware that most browsers cannot cope with very # large images. MAX_DOT_GRAPH_HEIGHT = 1024 # The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the # graphs generated by dot. A depth value of 3 means that only nodes reachable # from the root by following a path via at most 3 edges will be shown. Nodes # that lay further from the root node will be omitted. Note that setting this # option to 1 or 2 may greatly reduce the computation time needed for large # code bases. Also note that a graph may be further truncated if the graph's # image dimensions are not sufficient to fit the graph (see MAX_DOT_GRAPH_WIDTH # and MAX_DOT_GRAPH_HEIGHT). If 0 is used for the depth value (the default), # the graph is not depth-constrained. MAX_DOT_GRAPH_DEPTH = 0 # Set the DOT_TRANSPARENT tag to YES to generate images with a transparent # background. This is disabled by default, which results in a white background. # Warning: Depending on the platform used, enabling this option may lead to # badly anti-aliased labels on the edges of a graph (i.e. they become hard to # read). DOT_TRANSPARENT = NO # Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output # files in one run (i.e. multiple -o and -T options on the command line). This # makes dot run faster, but since only newer versions of dot (>1.8.10) # support this, this feature is disabled by default. DOT_MULTI_TARGETS = NO # If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will # generate a legend page explaining the meaning of the various boxes and # arrows in the dot generated graphs. GENERATE_LEGEND = YES # If the DOT_CLEANUP tag is set to YES (the default) Doxygen will # remove the intermediate dot files that are used to generate # the various graphs. DOT_CLEANUP = YES #--------------------------------------------------------------------------- # Configuration::additions related to the search engine #--------------------------------------------------------------------------- # The SEARCHENGINE tag specifies whether or not a search engine should be # used. If set to NO the values of all tags below this one will be ignored. SEARCHENGINE = NO iaxmodem-1.2.0/lib/spandsp/doc/t38_manual.xml0000644000175000017500000010651711150047205020340 0ustar julienjulien 2007-11-14 T.38 protocol (FoIP) support User manual documentation in progress Steve Underwood
steveu@coppice.org
2007 Steve Underwood This document can be freely redistributed according to the terms of the GNU General Public License.
The T.38 real-time FAX over IP (FoIP) protocol There are two ITU recommendations which address sending FAXes over IP networks. T.37 specifies a method of encapsulating FAX images in e-mails, and transporting them to the recipient (an e-mail box, or another FAX machine) in a store-and-forward manner. T.38 specifies a protocol for transmitting a FAX across an IP network in real time. This document discusses the implementation of the T.38, real time, FAX over IP (FoIP) protocol. FAXing between two PSTN FAX machines provides the illusion of real-time communication, with confirmed delivery. This is, of course, no more than an illusion. The sender has no idea what is receiving the FAX. It might be a FAX mailbox, where the FAX might only be retrieved much later, or might never be retrieved at all. It might be a FAX machine which is out of paper, and is storing the FAX in memory. If nobody adds paper before the FAX machine is switched off, the FAX might never be printed. With increasing amounts of FAX spam, many people don't ever bother to collect FAXes from the FAX machine in their office. Still, with all these reasons why the real-time confirmed delivery nature of FAXing is an illusion, large numbers of people still insist on using direct FAXing. The FAX protocols - in particular T.30 - were designed for the PSTN. The PSTN is very different from a packet network like the Internet. It offers very strict timing; latency is rock steady throughout a call; and latency is seldom very high. The lack of these features in packet networks tends to spoil the quality of voice over IP, compared to voice over the PSTN. However, it can totally destroy modem data, like that used for FAX. Jitter and packet loss can cause modem reception to fail, and excessive delays can cause timers designed for a low latency environment to expire. T.38 tries to mitigate these factors, and can greatly improve the reliability of FAXing across the internet. It can also send FAXes using less bandwidth than using VoIP protocols. There are limits to what can be achieved on a congested network, though, and T.38 can never offer the reliability of a store and forward protocol, like T.37. Sadly, the average office worker's love affair with real-time FAX ensures a bright future for the T.38 protocol, even though the T.37 protocol makes far more sense. The T.38 protocol primarily operates between: Internet-aware FAX terminals, which connect directly to an IP network. FAX gateways, which allow traditional PSTN FAX terminals to communicate via the Internet. A combination of these. T.38 is the only standardised protocol which exists for real-time FoIP. Reliably transporting a FAX between PSTN FAX terminals, through an IP network, requires use of the T.38 protocol at FAX gateways. VoIP connections are not robust for modem use, including FAX modem use. Most use low bit rate codecs, which cannot convey the modem signals accurately. Even when high bit rate codecs, such as G.711, are used, VoIP connections suffer dropouts and timing adjustments, which modems cannot tolerate. In a LAN environment the dropout rate may be very low, but the timing adjustments which occur in VoIP connections still make modem operation unreliable. T.38 FAX gateways deal with the delays, timing jitter, and packet loss experienced in packet networks, and isolate the PSTN FAX terminals from these as far as possible. In addition, by sending FAXes as image data, rather than digitised audio, the required bandwidth of the IP network might be reduced. However, the redundant transmission needed to make T.38 work acceptably over an unreliable network tends to offset much of the potential bandwidth gain. The original T.38 specification provides for operation up to 14,400bps, using a V.17 modem. The latest version of the T.38 specification adds features for FAXing at up to 33,600bps, using a V.34 modem. However, it appears most current T.38 implementations only support operation up to 14,400bps. The basics of a T.38 entity The T.38 protocol may be used to build an Internet-aware FAX terminal, for direct connection to the Internet. It may also be used to build gateways. A T.38 FAX gateway might be a gateway between the PSTN and the Internet. It might just be an a ATA box acting as a gateway between a directly connected traditional FAX machine and the Internet. The T.38 protocol merely defines what passes between two T.38 entities. Creating a robust entity, able to tolerate the widest possible variation in network delays, jitter and packet loss, requires considerably more than just implementing what is contained in the T.38 spec. Also, the protocol definition is somewhat loose, resulting is considerable variability in the way the protocol is implemented. Considerable flexibility is required in a T.38 entity's design, to tolerate these variations. T.38 currently works over one of the following transports: TCP, with TPKT message framing - the use of TPKT was originally specified in a vague way, and implementations without TPKT framing apparently exist. UDPTL - A UDP based protocol used nowhere else. This is the most common transport for T.38. RTP - Added quite late to the T.38 specification, and still not widely supported. TCP is the ideal way to communicate between two entities on an IP network, which do not have real-time constraints. The entities can talk as fast as they and the medium between them permit, with full error control. Internet-aware FAX devices would, therefore, usually use TCP as the transport for T.38. Gateways have only limited control of the timing of the FAX data passing through them. They have to operate in real-time, at a rate outside their control. Gateways, therefore, usually use UDPTL. The RTP option was only added to the T.38 specification in 2004, and is not yet widely supported. Over time it may become the preferred replacement for UDPTL, since most entities handle more than just FAX, and need to implement RTP anyway. A TCP stream is fully corrected by the TCP protocol itself. However, in the UDPTL or RTP modes of operation, T.38 is subject to possible packet loss. A high level of missing data would defeat the protocol, so some measure of FEC (forward error correction) must be used. The UDPTL specification defines two optional forms of FEC. Both consist of adding information from previous packets to new packets. In one form this repeated data is send as a direct copy of the original. In the other it is sent as parity information, which requires encoding and decoding. The specifications for RTP include definitions of suitable FEC and redundancy protocols (RFC2198 and RFC2733). The T.38 specification says these should be used for T.38 over RTP. Interestingly, even the latest revision of the T.38 specification does not provide properly for security in FAX transmission. SRTP is a standard way to achieve secure multi-media communication, and can be applied to T.38 over RTP without any specific wording on the subject in the T.38 specification. UDPTL might be seen as obsolete in the long term, and not worthy of enhancements to encrypt the data. However, no secure option for T.38 over TCP is defined. TPKT could be sent over TLS/TCP. TLS also has message framing features which would allow IFP packets to be sent directly over a TLS protected connection. However, there is no specified way to do this. Although redundant information in future packets is an important part of a solid T.38 implementation, it is not a complete solution to problem of lost packets. Sometimes the next packet occurs after a considerable delay (e.g. when allowing time for a fast modem to train). If a "start training" message is only received through the redundant information in a following packet, it usually arrives too late to be useful (at least for a gateway). Most T.38 implementations now follow a practice of sending several exact copies of key packets - generally the ones which start or end the stages of the T.30 protocol. Typically up to 4 identical copies of these packets are sent down the wire. The may be sent in a burst, as fast as possible, or they may be spaced in time by 10ms or 20ms. IP network congestion, and the resulting packet loss, can be very bursty. If all copies are sent together, they might all be lost. Even a small amount of spreading in time may significantly increase the likelihood of at least one copy reaching its destination. The price is some delay in delivery of the message, which might be problematic. Multiple copies of these packets add little to the overall volume of data transmitted, as only a small percentage of packets fall in this "key packet" category. Some T.38 implementations follow a less effective practice of sending multiple key packets, which have separate sequence numbers and are separately bundled with redundant information for transmission. They may also be spaced in time. Although this seems a less effective strategy, a T.38 entity must expect to receive packets streams of this kind, and tolerate them. Between the high priority key packets, and the low priority packets for the image data (the loss of which might just cause a streak on an image, or be corrected by ECM FAXing), lies the V.21 HDLC control messages. Some T.38 implementations dynamically adjust the amount of redundant information in packets, so these control messages are repeated through several packets, but the large image data packets are repeated less, or not at all. Used with care, this dynamic redundancy strategy can nicely balance data volume and reliability. A T.38 terminal has a lot more flexibility in how it can deal with problem data than a T.38 gateway. The terminal has no tight timing constraints governing how it behaves with regard to received data. It can wait a considerable period for delayed packets to arrive. The gateway is a man-in-the-middle, and must live with the timing constraints that imposes. This means a T.38 gateway has a rather more difficult design than a terminal. The core elements of a T.38 implementation There are many differences between the behaviour of a T.38 terminal and a T.38 gateway. However, some functions are common to both types of T.38 entity, particular in the IP network interface. The T.38 Internet Fascimile Protocol (IFP) packetiser The T.38 specification defines an ASN.1 schema for the messages which pass between T.38 entities. These messages are called IFP (Internet Fascimile Protocol) messages. Their format is independent of the transport used to carry them. However, there are currently two slightly different versions of the ASN.1 schema. This is due to a typo in the original version of the T.38 specification. The protocol negotiation which occurs just before T.38 communication resolves which version will be used. Although the typo was corrected several years ago, it is still very more common to find implementations which only support the original buggy version. The UDPTL, RTP, TPKT packetiser A second level packetiser bundles the IFP packets for transmission. This functions in different ways, depending on the type of transport in use. For the unreliable transports (UDPTL and RTP) the packetiser adds forward error correction (FEC) information to the packets. This can greatly inprove the reliability of the T.38 protocol, at the expense of higher bandwidth. The amount of error correction information added to the packets is implementation dependant. For UDPTL, two forms of FEC are defined. One simply repeats older T.38 packets as FEC information in the current UDPTL packet. The other generates parity packets over a series of T.38 packets, and includes that parity information in the current UDPTL packet. The type of FEC to be used is negotiated just before T.38 communication begins. The RTP specifications (RFC3550, RFC3551, RFC2198, RFC2733) define common redundancy and FEC formats, to be used for any payload. Where T.38 packets are carried by RTP, the standard RTP FEC mechanisms are used. TPKT (RFC1006, RFC2126) encapsulation works over a TCP transport. TCP provides full error correction, though retries may slow it considerably. TPKT encapsulation merely provides the ability to delineate the start and end of the IFP packets in the structureless TCP stream. The elements of a T.38 terminal The elements of a T.38 gateway The HDLC decoder If the HDLC decoder in a T.38 gateway worked in whole frames, it would introduce unacceptable latency. Instead, the HDLC decoder must work progressively through the HDLC frames, outputing its results octet by octet. The T.38 message stream does not contain HDLC preamble, though it usually contains an indication that preamble is in progress. It does not contain the CRC octets, but simply an indication of whether the CRC is good or bad. The HDLC decoder provides an indication when preamble is being received, and checks the CRC octets at the end of frames to provide the good or bad indication. The decoder makes the frames available, octet by octet, to the T.38 engine for status tracking and possible modification. Tracking and modification imposes a few octets delay, but the goal is to keep this to the minimum possible. Whether the frames are modified or unmodified, good or bad they are always passed on, to maintain the appropriate timing flow for the T.30 protocol. An interesting aspect of the timing flow of V.21 HDLC messages on the T.38 path relates to the size of the CRC. The usual practice for sending these frames is to send one octet in each message, with the messages spaced by the duration of one octet. They will normally be sent with the minimum possible delay. The CRC at the end of each frame is two octets long, and only an indication of good or bad is sent in the T.38 messages. It takes two octet times to know if the CRC is OK or not, typically causing the flow of T.38 messages to stutter by the duration of an octet. Since flow control within a frame is not possible when frames are replayed by a remote T.38 gateway, that gateway must allow for this inevitable stutter as it prepares to begin playout of the frame. T.30 message analysis and manipulation The T.30 message analyser in a T.38 gateway performs the following functions: It passes NSS, NSF and NSC frames, but modifies their contents. A receiving FAX machine must be prevented from acting upon these messages in a manufacturer specific manner. The T.38 protocol is incapable of handling such manufacturer specific things. However, simply dropping these packets would upset the timing of the T.30 protocol. Instead, most T.38 implementations modify the country and manufacturer codes nesr the start of these messages, so the messages will be ignored by any receiver. They are typically set to 0x00, 0x55, 0xAA or 0xFF. Some implementations set them to the country and manufacturer code of the T.38 implementor. As long as they are set to something the receiver will not recognise, problems are avoided. To avoid removing useful information, the original country and manufacturer code bytes might be reinserted in a different part of the modified NSF message, provided space permits. It tracks the contents of the DCS messages. During flow control of non-ECM data, the minimum row length must be preserved, so the current minimum must be found from the DCS messages. Similarly, the current encoding must be known to apply non-ECM flow control correctly. ECM data must be flow controlled in a completely different way than non-ECM data, so ECM mode information must be found from the DCS messages. It may optionally modify the minimum row length in the DIS messages. Because flow control will be applied to non-ECM data, it can make sense to tell the sending FAX machine it has no need to impose a minimum row length, and let the emitting T.38 entity impose the minimum as part of its flow control operation. It passes on the stripped and modified HDLC frames, with the minimum possible delay. This implies that is must analyse and modify the messages octet by octet. The HDLC rate adapting encoder The HDLC data rate adapting encoder accepts a T.30 message stream as input. The V.21 HDLC messages generally arriving byte by byte, in separate T.38 messages. ECM HDLC messages usually arrive in larger chunks, but they are still generally fragmented. The rate adapter dynamically buffers the T.30 data, generates preamble, and adjusts its length if the incoming message data is falling behind. It may insert additional flag octets between frames, as a flow control mechanism. However, the HDLC protocol is synchronous, so the adapter cannot perform any flow control within a frame. It must, therefore, buffer enough octets of a frame to provide reasonable jitter tolerance, before it emits the first octet of that frame. If the arriving messages fall too far behind mid-frame, there will be corruption of the outgoing stream. In the case of ECM image data frames, the frames are fast enough, that buffering whole frames is quite proactical within the T.30 timing constraints. This ensures mid-frame underflow can never occur. TCF (training confirmation) and non-ECM image data rate adaption Non-ECM image data rate adaption deals with exchanging TCF data, and non-ECM image data using T.4 1-D or 2-D compression. Non-ECM image data is typically padded with zero bits at the end of each pixel row. This is used to avoid rows arriving at the receiving FAX machine faster than the mechanical paper handling can process them. It is also used by sending FAX machines for flow control, when their paper handling falls behind. The minimum duration of a row is negotiated between the FAX machines, before image transfer commences. TCF data is a continuous stream of zero bits. It may, optionally, be preceeded by a continuous block of one bits. So, when transferring TCF data between the T.38 entities, flow control is simply a matter of repeating the last received bit when the late arrival of TCF data packets causes underflow at an emitting gateway. T.38 entities may negotiate to generate and check TCF data locally, and not exchange it. Generally, this is only used when TCP/TPKT is used as the transport for the T.38 messages. A TCF checker and a TCF generator are needed by a T.38 gateway supporting this option. Some T.38 entities are capable of negotiating the removal of end of row padding bits in the data passing between the T.38 entities. This may reduce the amount of data significantly, for some types of image. If negotiated, most or all surplus zero bits are stripped from the image bit stream, at the sending T.38 entity. If a T.38 gateway is receiving such stripped data, it may need to reimpose a minimum row time, by inserting zeros, as part of its non-ECM rate adaption process. By checking the contents of the DCS messages, it can determine what this minimum should be. Only two types of image compression are used for non-ECM transmission - T.4 1-D and 2-D. The end of line (EOL) marker for both these is 11 zero bits, followed by a one bit. In 2-D mode, an additional one or zero bit follows, which defines the mode of the next row. It turns out that the maximum number of valid consecutive zeros which could preceed the 11 zeros of an EOL is 3. In a valid image there are no longer runs of zeros than at an EOL, and the maximum there is 14. Therefore, if the padding stripper reduces all runs of zeros longer than 14 to just 14, it will strip most of the padding with very simple logic. Simple logic is a good thing in this case. It not only avoids the need to fully analyse the image data, it also minimises problems when there are bit errors in the image data stream. For image data sent without error correction (T.4 1-D or 2-D) there may be underflow at the outgoing gateway, if image data packets arrive too late. To deal with slow mechanical paper handling in FAX machines, the T.30 specification includes an end of pixel row padding scheme for non-error corrected image data. The receiving machine may request a minimum row duration. The sending machine is required to impose that minimum, but can arbitrarily make it much longer to meet its own paper handling needs, sending padding bits as appropriate. This mechanism provides a robust basis for flow control in a T.38 gateway. If the outgoing gateway only starts sending a pixel row when it has the entire row in its buffer, it can safely idle, sending padding bits, at any row end it needs to. Only the 6 EOL markers, which terminate an image, must be protected from this kind of flow control. Those markers are defined as being consecutive, with no zero bit padding separating them. When ECM is used (usually with T.6 image data) the image is packetised in HDLC frames. In this case rate adaption is handled in a similar manner to the V.21 HDLC packets. Testing an implementation of T.38 The T.38 specification does not define any specific compliance tests which an implementation must pass. It is not supplied with any test vectors. Commetrex is a supplier of T.38 implementations, who have taken it upon themselves to define a set of tests, and create a lab for T.38 interoperability testing. This seems the closest thing to an industry standard for T.38 testing which exists at this time, and is much to their credit. Commetrex have defined 16 tests which an implementation T.38 undergoes in their lab. These are described on the Commetrex web site as: Commetrex T.38 tests Test # Direction Transport Image file Error correction Data rate mgt Image encoding Polling 1originateUDPccitt2p.tifredundancy 0method 2MRno 2originateUDP100page.tifredundancy 0method 2MRno 3originateTCPccitt2p.tifredundancy 0method 1MRno 4originateUDPccitt2p.tifredundancy 3method 2MRno 5originateTCPccitt2p.tifFEC 2 from 3 spanmethod 2MRno 6originateUDPdither1d.tifredundancy 3method 2MRno 7originateUDPccitt2p.tifredundancy 3method 2ECMno 8originate & poll to rxUDPccitt2p.tifredundancy 3method 2MRpolled rx 9answerUDPccitt2p.tifredundancy 0method 2MRno 10answerUDP100page.tifredundancy 0method 2MRno 11answerTCPccitt2p.tifredundancy 0method 1MRno 12answerUDPccitt2p.tifredundancy 3method 2MRno 13answerTCPccitt2p.tifFEC 2 from 3 spanmethod 2MRno 14answerUDPdither1d.tifredundancy 3method 2MRno 15answerUDPccitt2p.tifredundancy 3method 2ECMno 16answer & polled to txUDPccitt2p.tifredundancy 3method 2MRpolled tx
The file dither1d.tif is a whole page of dense checkerboard pattern, which does not compress, and produces a kind of torture test page. It is about 2M bytes. 100page.tif is exactly what it says - a file with 100 pages of FAX images. The content of the pages does not seem to be specified by Commetrex. The ITU T.30 test images, repeated sufficiently, seems a good basis for this test. ccitt2p.tif appears to be page 2 of the ITU test images. The tests are heavily biased towards non-ECM operation with MR coding. No other coding appears to be used, and only 2 tests use error corrected (ECM) FAXing.
Some of the Commetrex tests seem strange. Why is TCP transmission tested with FEC or redundancy? These things are only needed to overcome to lack of reliability in a UDP path.
Living with real world T.38 entities. The T.38 specification leaves a number of grey areas, and many things can be implemented in several ways. It might, therefore, be expected that interoperability will not always run smoothly. Whilst some design decisions are reasonable subjects for discussion, it is quite common to find T.38 implementations doing things which are simply wrong. Non-ECM data ending immediately after the six EOLs denoting the end of a page causes corruption From the T.38 specification, a T.38 entity sending non-ECM image data should be able to end the image data, with t4-non-ecm-sig-end, at the last bit of the six consecutive EOLs which denote the end of a page. However, this offers poor compatibility with some implementations of T.38. They will drop their carrier signal prematurely, and the last few rows of the image will be corrupted at the receiver. This can happen regardless of whether the t4-non-ecm-sig-end is followed by a no-signal message, and regardless of the timing of that no-signal message. Padding with zero bytes for 40ms or more after the six EOLs seems to prevent this, and results in an image which exactly matches the one at the source. Expect mixups between non-ECM and ECM image modes. The TCF data should always be sent as non-ECM image data, whether the images which follow it are sent as non-ECM or ECM data. However, some broken implementations of T.38 (e.g. Mediatrix) may send an hdlc-sig-end message to terminate the TCF data. To be as tolerant as possible, it is probably wise to accept hdlc-sig-end or t4-non-ecm-sig-end, regardless of which kind of data it is really terminating. Expect some very poor timing decisions in various designs. The preamble for V.21 HDLC data is specified as being 1s ±15%. This should mean 850ms of preamble is within spec, and many modern FAX machines only send that much. A number of T.38 implementations choke on this. They require at least 1s between the v21-preamble message and the first HDLC data, for reliable operation. This is very poor design. Even if there is 1s between these events at the source, jitter on the network can make them arrive less than 1s apart. It appears the best a tolerant implementation can really do is impose a 1s minimum between sending these T.38 messages, and accept that things might still go wrong when there is some jitter. There is similar intolerance with the timing of the start of training messages for the fast image data modems. Most implementations do not impose a minimum which is above that permitted by the T.30 specification. Some do, however, make no allowance for network jitter reducing the interval at the receiver. You should expect the far end to be using TEP, when sizing the required delay between the start of training, and the first data. Also, for ECM data, make sure the delay allows for the specified minimum 200ms of preamble. Which kinds of error correction to use. T.38 defines two kinds of error correction for UDPTL streams. One inserts redundant copies of older IFP packets in each UDPTL packet. The other uses a more complex parity FEC scheme, based on XOR'ed data inserted in each UDPTL packet. Although each UDPTL packet identifies the type of error correction it contains, the original T.38 spec. did not offer any form of negotiation about the type to be used. The SIP and MGCP SDP for T.38 now includes preferred error correction type information, so some measure of negotiation is possible before the flow of UDPTL packets begins. It appears all T.38 implementations are happy to receive packets with redundant secondary content. However, it seems not all implementations will actually recover anything when there are missing UDPTL packets. It appears not all T.38 implementations are happy to receive packets with parity FEC data. Unless the SDP data from the far end explicitly says they support the parity FEC scheme, it is better to send only redundant information. A good implementation should be prepared to accept either kind of data, even intermixed, regardless of anything in the SDP negotiation. In the real world, whatever you ask for in your SDP data, you will probably receive secondary IFP packet redundancy from the far end. It is the only thing most implementations support, and with real world packet loss it may perform just as well as the more complex parity FEC scheme. When the first few UDPTL packets are sent, there will be no historical information to send as redundant secondary IFP packets, or parity FEC data. When using the redundant secondary packet scheme this is handled transparently. Each UDPTL packet says the number of redundant secondary IFP packets it contains. This can simply be set to zero for the first UDPTL packet, one for the second, up to the amount of redundancy which has been configured. All implementations seem to work in this way. When parity FEC is being used, the startup arrangement is less clear. While some implementations simply insert zeros for the non-existant packets before the start, others send a few packets with redundant secondary IFP packets, until they are able to insert the required amount of FEC data. Dealing with intermixed types of error correction makes a receiving implementation of UDPTL messier and slower, but is necessary for compatibility. What really ends the data? It should be correct to send some image data, and end with the image data signal end message. However, some T.38 implementations misbehave when this is all that is sent. Immediately following the signal end message with a no-signal indicator message seems to greatly improve compatibility with some T.38 implementations. T.38 defines hdlc-fcs-OK, hdlc-fcs-OK-sig-end, hdlc-sig-end, and no-signal messages. Always end periods of HDLC transmission with either a hdlc-fcs-OK, hdlc-sig-end, no-signal sequence or a hdlc-fcs-OK-sig-end, no-signal sequence. Do not send hdlc-sig-end after hdlc-fcs-OK-sig-end. A number of T.38 implementations choke on this sequence, even though it looks fairly harmless. Normal use versus testing The design of some T.38 implementations precludes some reasonable tests from succeeding, due to design features which may have been implemented for sane reasons. This means each test failure needs to be investigated in detail, to see if it represents something genuinely bad in an implementation of T.38. For example, the 2M byte torture test page in the Commetrex test suite will not successfully pass through some T.38 implementations, because of a timeout they impose. For example, some ATAs based on Audiocodes silicon have been seen to stop any continuous period of modem transmission after about 90s. This appears to be a backstop timeout, to prevent troublesome implementations jamming the gateway. Legitimate pages just don't take that long, and the timeout is reasonable. However, the 2M byte test page takes up to 20 minutes to transmit, and will always fail on these boxes.
iaxmodem-1.2.0/lib/spandsp/doc/wrapper.xsl0000644000175000017500000000040311150047205020036 0ustar julienjulien css.css iaxmodem-1.2.0/lib/spandsp/doc/t38-gateway.dia0000644000175000017500000000570711150047205020376 0ustar julienjulien‹í][sÛ6~÷¯à(¯ ŒoUN›N¶fw=­ÛÙ7,Á27©!é8~Ùß¾©TEÚ4ÉÙ 4cÙ’!€‡:ß¹ãû¾¬bç³Ìò(MÎ&á‰#“yºˆ’åÙäÏ‹oƒÉïN¾_Dâ;õ³ÌÄÊQŸHrýêlrSëïNOïîîP|Ÿ‹"ÍPÝ¢\žþOı8UƒN'ïNçá QýÞæ]QYtu[H'+y6¹óOË,½M“jÔfÜ<ÓÌù,â³É›ëò19ÝLsº3Ï#s¯ÅR^eR|jŸ«Gö™z-³ú´«ušGjHq¿ÞÒ2~~0f3*Wƒ’å»7?ò7Õ%mÞØÎÕt¡­‹+‘-£duoâêFPPJÕÍpà Ä>÷É×{òüå®Ì.›].3»\”_®Ó¬ÈDTì/y•¦±Iµj‘ÝÊþëäs+{Œ¬T\GE‘>qý×"λP½ý·´=Wr—Y´x\pwF´Ìr-Š›Ë/@·«šýhöÏQ]Ųé꣤múûq¦¯;åî½ýø@n¨fk…‡E ]é>–·ÑBæO°Ù™n6ÃNŸºëõq]oLõV ¬Ë%bq/³Íô?maÚÙ|Á›çÁ]H¯þ+çņ¼? ‘,D¶pÞ:?¥_&[­CéÑâlòo¼{{ê©ÉÔηwÖé–‰ð”¸u‚÷·‹¶É¯®êsgêêE²Œe5ˆBwJ¸zž¹awJ=õÜoAËÕå<Í’}•`ŠÊÊ}cŸª¯{ç澑Ñò¦hŸœ~“G‰º'—»rØ ‰Ò“Þµè·D~“Þ]6(šO£h³ÄŸn™½7÷“¸C3ÿ[¬~Ãü„À3?¶¼¼ÿ!Nïæ7"+Z™Ÿe~êM óSWs?Ö;?cšù0ï÷§§ ïû€¬O_[¶Zé‹Å®QS»zŒz~­…üRLžÐTkcÚîDiÚy.Þpæ7rþIf-î€Gtè6ƒ,MЦ5õûεXEñ½º4‘ä'/îµ²§d·úè/2þ,‹h.ê¤Ï¿‚=Æjüz¼ûàÃÝÝU%1DJÑCtØ:õ-½Õ÷„ñ°…”ѾLV²ùË”ÉíªÁÞzÌâj2@¡€ ÖƒÂi$ÐPàk( •„¡õ ÞuÁ×bÁkÆ‚_~þøÞYÈyº°`` ˆƒÐ‚)0à#Ø>¸]àmíp0èOС fÁÜ0@ ;+™çb)‘ˆø>ò‘,œ•H¢õm, %^&ŒØ b&ÌÀ„;&8B8Ñ0Q(rµù‹ýé邤÷fh­†—þ|~ñqêü~q>u~ýñ?tê\œÿvá¬ÕÝS»rnM xŒà>¢Zu´¶„!ð;–Ô.ëZ"(ظ–ˆoƵ4€¤NÎ%Dv¤Šp‹¯7þB”8ŠkeôÙbF‰lÀ0FøÓ!´«IY– B aßMcž&É¥Lå¥w'¨18Ñ“`Åóu}妄ÀgE²¸Y–ÞÕ'Þr¥§¾Œe²| õú›G/ñ®v^AÏŠ…“ç{ñõ?΋ͮZ¤¥¦älÿ{6 ö¾ÿ†Ï’ÍgÙîgýýüÃÚ#¸Á`G1\ÊPÈB®Dc̨‡ˆJ~±‡=,û´5ú”ƒ¾,k¥ø¥J1 Åü0R•bÆúsr'9f…4dÊn'„àpÆ\Ä‚ Ô«úØ'À‚\'¯a„v)XQ>2QæC¹†æá(²ü´»… Oç§Sëm u"§NäÑ©ÌSðdþÞôtqµ„Ö³òº=+ÊÒrþBÔ/dVþZG‹9G‹Í©ký,¦|ñ„ŒØÃÁ{Ø6±ÇƒÏëá6áß‚C#8œWT(@X¥êª-Ià±x`€ySBñ „ƒÒb˜‘*Ñ“B‚^) t¬} ±”!¶˜Ž9\üËQÜ(³k1—r !G#ŽÚZ,ä õ’Á…f”€&R\%º³²Í„RG c½»5Ú(Öµ|d®e‚ø–•8á#È.GÐÒËh8%Èe˜3-ÃÔ ˜^Õóq/É=%ËÔÊòq˲÷Y¦ew„˜/tÄWgnpý‹ù:â[¦n(‹0ô)|À÷©p¯kýG'ÇdÄx¯kJç×—maÅ™§‘ѸÏg„"ø¾Za…À¢\§®1>lEùØD¹«ôYê5>&û¯A”©‚ßi€<xDË2£¤’e³Ã˲.¬±‰ÑVš·ÒìAs‡ÐJ0BÅà‰X$ÜfbQ ŸŠE±ÍŲ¡Î¹XE&’|…MÇ2”Ž¥¶ 1G âÁƒ„»)Ž&êï$ú’Ô­6‡;Ϣƫ¯¶0a¶<ÚUû€oqÂTМŽQÔA ¨cʈN¥Ð^¾Ùƹ§µ N¾u-žnýGæZmû^¾šS0Cn>JFQúì‘+e¥gOý5«ü{~¹¬ú /λôYþF:l ¢L ;œ¢AGèkÅ[+nÓ==@>t÷tP+ÒhCþ®Fm­8p+îw¡‹…XêåIÙ]½<ÕÚs†º«—ÎkϲçÆ8mC}cÌnzåáRãaH«ÖWÕëº<•rŸÀ¦&YHYœ¾ÕK ¤tˆY¶&qÁ*cœ™ï­j««xoU\ ï@’-¯þfÊ«£$—™=!ÁÜ©j6Âk,ÂKÝ1`‚‚-,¸`YX°°Ð ú˜Í¥T$ŠÔZÿ† [H0fü{c@/VÏ_k µ‡ºtÒ{"„KIo¢­©ÿbM}>ÄÔ Lýì!ÀV€}Fü2û‚a^J±ç½ÍëßD™?)ʶ~òè„ÙQ˜ 6å¸ F8ÅŽ„àÇØ•1Ü™ËtnY®| O²#ˆX#í5i-'Ù-¤=ËÎèYvn©§[ÛÍ”í6ü¨„ʰ‚íœ0¬+íg!×3ôi'4¸Öuú»kXKîèŽ=ñ[Ï;èЇ&hËçÕ»¸*Þv@u#Pd[ ZÝr¸nù빓Èâ.Í>ÙF¨æ”I—ÛN¨FuI6¸Dj?…ÌW pæ•Mטç+â( uJ E»Ð!:ym ¡Õá>Þ{zëãõl!’¬Ö÷qWß'Ôd}Ÿåü¶r~Š,N15=ÍÞßÞ¢&ÞïZž‡‰Í>ŽÆh /ÂSk3ß/½ÒÕ#«å}Èälôz—ÆÔÍDžîÆ•2£k‹"c)ÓR&^Wa‚t(L°ŸS—pOÐÜ€‘öî~ØÝ ½.ÑÁ¦¡¿aèoú~nÆCƒCo|Ð;€`­[U|ѶU•`”ãsø‘{ s43Á#Û*†` !'‡Z·, ”ð¥RB·–Ö5Ø«rŠ's’V¤ðé˜æ· ÁŸ‰ÞÍg»n4sµùŒÈï0ÉêÞ|.ZW¿;Ý~]úÅn>ãíÖ&ˆZ“<Œº´¥·QEð®‰[Äå®ö>Ä.65Ió 6Ÿ={Ø~þO—ø?_ ͇=¦sȱ½¡ù°ÇfŒOAýtö)Q²ïS¤@ )´;Õ )P)´¤è)†®¤ž±aÀŠ¡+©ÇÒ>ÅÃMzëžÅs€€DüÜÆù“á¤í Ò¸>P²ªÂ[¹ZðÝÖ¶Õ—Z°»”û°Žê@ƒ0îþÄ dìÊŸu¶t€¬B™=D²£=+쪌öá “×VäC:9ˆŽNŽalŸ I˜ëmÊbˆ{¦—7e©ž,äðœ²ÙÔÖýÀXѶʞ-Ϧ"¿ºPfÙÖ È×*ß iaxmodem-1.2.0/lib/spandsp/NEWS0000644000175000017500000000002511150047205015560 0ustar julienjulienNo news is good news!iaxmodem-1.2.0/lib/spandsp/src/0000755000175000017500000000000011150072173015655 5ustar julienjulieniaxmodem-1.2.0/lib/spandsp/src/silence_gen.c0000644000175000017500000000753311150047205020302 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * silence_gen.c - A silence generator, for inserting timed silences. * * Written by Steve Underwood * * Copyright (C) 2006 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: silence_gen.c,v 1.13 2008/07/16 18:09:59 steveu Exp $ */ /*! \file */ #if defined(HAVE_CONFIG_H) #include "config.h" #endif #include #include #include #include #include #include "floating_fudge.h" #if defined(HAVE_TGMATH_H) #include #endif #if defined(HAVE_MATH_H) #include #endif #include #include #include "spandsp/telephony.h" #include "spandsp/logging.h" #include "spandsp/async.h" #include "spandsp/silence_gen.h" int silence_gen(silence_gen_state_t *s, int16_t *amp, int max_len) { if (s->remaining_samples != INT_MAX) { if (max_len >= s->remaining_samples) { max_len = s->remaining_samples; if (max_len && s->status_handler) s->status_handler(s->status_user_data, MODEM_TX_STATUS_SHUTDOWN_COMPLETE); } s->remaining_samples -= max_len; } if (INT_MAX - s->total_samples >= max_len) s->total_samples += max_len; memset(amp, 0, max_len*sizeof(int16_t)); return max_len; } /*- End of function --------------------------------------------------------*/ void silence_gen_always(silence_gen_state_t *s) { s->remaining_samples = INT_MAX; } /*- End of function --------------------------------------------------------*/ void silence_gen_set(silence_gen_state_t *s, int silent_samples) { s->remaining_samples = silent_samples; s->total_samples = 0; } /*- End of function --------------------------------------------------------*/ void silence_gen_alter(silence_gen_state_t *s, int silent_samples) { /* Block negative silences */ if (silent_samples < 0) { if (-silent_samples > s->remaining_samples) silent_samples = -s->remaining_samples; } s->remaining_samples += silent_samples; s->total_samples += silent_samples; } /*- End of function --------------------------------------------------------*/ int silence_gen_remainder(silence_gen_state_t *s) { return s->remaining_samples; } /*- End of function --------------------------------------------------------*/ int silence_gen_generated(silence_gen_state_t *s) { return s->total_samples; } /*- End of function --------------------------------------------------------*/ void silence_gen_status_handler(silence_gen_state_t *s, modem_tx_status_func_t handler, void *user_data) { s->status_handler = handler; s->status_user_data = user_data; } /*- End of function --------------------------------------------------------*/ silence_gen_state_t *silence_gen_init(silence_gen_state_t *s, int silent_samples) { if (s == NULL) { if ((s = (silence_gen_state_t *) malloc(sizeof(*s))) == NULL) return NULL; } memset(s, 0, sizeof(*s)); s->remaining_samples = silent_samples; return s; } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/crc.c0000644000175000017500000002151211150047205016567 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * crc.c * * Written by Steve Underwood * * Copyright (C) 2003 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: crc.c,v 1.4 2008/05/13 13:17:22 steveu Exp $ */ /*! \file */ #if defined(HAVE_CONFIG_H) #include #endif #include #include #include #include "spandsp/telephony.h" #include "spandsp/crc.h" #include "spandsp/bit_operations.h" static const uint32_t crc_itu32_table[] = { 0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA, 0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3, 0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988, 0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91, 0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE, 0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7, 0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC, 0x14015C4F, 0x63066CD9, 0xFA0F3D63, 0x8D080DF5, 0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172, 0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B, 0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6, 0xACBCF940, 0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59, 0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116, 0x21B4F4B5, 0x56B3C423, 0xCFBA9599, 0xB8BDA50F, 0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924, 0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D, 0x76DC4190, 0x01DB7106, 0x98D220BC, 0xEFD5102A, 0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433, 0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818, 0x7F6A0DBB, 0x086D3D2D, 0x91646C97, 0xE6635C01, 0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E, 0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457, 0x65B0D9C6, 0x12B7E950, 0x8BBEB8EA, 0xFCB9887C, 0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65, 0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2, 0x4ADFA541, 0x3DD895D7, 0xA4D1C46D, 0xD3D6F4FB, 0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0, 0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9, 0x5005713C, 0x270241AA, 0xBE0B1010, 0xC90C2086, 0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F, 0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4, 0x59B33D17, 0x2EB40D81, 0xB7BD5C3B, 0xC0BA6CAD, 0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A, 0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683, 0xE3630B12, 0x94643B84, 0x0D6D6A3E, 0x7A6A5AA8, 0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1, 0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE, 0xF762575D, 0x806567CB, 0x196C3671, 0x6E6B06E7, 0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC, 0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5, 0xD6D6A3E8, 0xA1D1937E, 0x38D8C2C4, 0x4FDFF252, 0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B, 0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60, 0xDF60EFC3, 0xA867DF55, 0x316E8EEF, 0x4669BE79, 0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236, 0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F, 0xC5BA3BBE, 0xB2BD0B28, 0x2BB45A92, 0x5CB36A04, 0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D, 0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A, 0x9C0906A9, 0xEB0E363F, 0x72076785, 0x05005713, 0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38, 0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21, 0x86D3D2D4, 0xF1D4E242, 0x68DDB3F8, 0x1FDA836E, 0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777, 0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C, 0x8F659EFF, 0xF862AE69, 0x616BFFD3, 0x166CCF45, 0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2, 0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB, 0xAED16A4A, 0xD9D65ADC, 0x40DF0B66, 0x37D83BF0, 0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9, 0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6, 0xBAD03605, 0xCDD70693, 0x54DE5729, 0x23D967BF, 0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94, 0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D }; uint32_t crc_itu32_calc(const uint8_t *buf, int len, uint32_t crc) { int i; for (i = 0; i < len; i++) crc = ((crc >> 8) & 0x00FFFFFF) ^ crc_itu32_table[(crc ^ buf[i]) & 0xFF]; return crc; } /*- End of function --------------------------------------------------------*/ int crc_itu32_append(uint8_t *buf, int len) { uint32_t crc; int new_len; int i; crc = 0xFFFFFFFF; new_len = len + 4; for (i = 0; i < len; i++) crc = ((crc >> 8) & 0x00FFFFFF) ^ crc_itu32_table[(crc ^ buf[i]) & 0xFF]; crc ^= 0xFFFFFFFF; buf[i++] = (uint8_t) crc; buf[i++] = (uint8_t) (crc >> 8); buf[i++] = (uint8_t) (crc >> 16); buf[i++] = (uint8_t) (crc >> 24); return new_len; } /*- End of function --------------------------------------------------------*/ int crc_itu32_check(const uint8_t *buf, int len) { uint32_t crc; int i; crc = 0xFFFFFFFF; for (i = 0; i < len; i++) crc = ((crc >> 8) & 0x00FFFFFF) ^ crc_itu32_table[(crc ^ buf[i]) & 0xFF]; return (crc == 0xDEBB20E3); } /*- End of function --------------------------------------------------------*/ static const uint16_t crc_itu16_table[] = { 0x0000, 0x1189, 0x2312, 0x329B, 0x4624, 0x57AD, 0x6536, 0x74BF, 0x8C48, 0x9DC1, 0xAF5A, 0xBED3, 0xCA6C, 0xDBE5, 0xE97E, 0xF8F7, 0x1081, 0x0108, 0x3393, 0x221A, 0x56A5, 0x472C, 0x75B7, 0x643E, 0x9CC9, 0x8D40, 0xBFDB, 0xAE52, 0xDAED, 0xCB64, 0xF9FF, 0xE876, 0x2102, 0x308B, 0x0210, 0x1399, 0x6726, 0x76AF, 0x4434, 0x55BD, 0xAD4A, 0xBCC3, 0x8E58, 0x9FD1, 0xEB6E, 0xFAE7, 0xC87C, 0xD9F5, 0x3183, 0x200A, 0x1291, 0x0318, 0x77A7, 0x662E, 0x54B5, 0x453C, 0xBDCB, 0xAC42, 0x9ED9, 0x8F50, 0xFBEF, 0xEA66, 0xD8FD, 0xC974, 0x4204, 0x538D, 0x6116, 0x709F, 0x0420, 0x15A9, 0x2732, 0x36BB, 0xCE4C, 0xDFC5, 0xED5E, 0xFCD7, 0x8868, 0x99E1, 0xAB7A, 0xBAF3, 0x5285, 0x430C, 0x7197, 0x601E, 0x14A1, 0x0528, 0x37B3, 0x263A, 0xDECD, 0xCF44, 0xFDDF, 0xEC56, 0x98E9, 0x8960, 0xBBFB, 0xAA72, 0x6306, 0x728F, 0x4014, 0x519D, 0x2522, 0x34AB, 0x0630, 0x17B9, 0xEF4E, 0xFEC7, 0xCC5C, 0xDDD5, 0xA96A, 0xB8E3, 0x8A78, 0x9BF1, 0x7387, 0x620E, 0x5095, 0x411C, 0x35A3, 0x242A, 0x16B1, 0x0738, 0xFFCF, 0xEE46, 0xDCDD, 0xCD54, 0xB9EB, 0xA862, 0x9AF9, 0x8B70, 0x8408, 0x9581, 0xA71A, 0xB693, 0xC22C, 0xD3A5, 0xE13E, 0xF0B7, 0x0840, 0x19C9, 0x2B52, 0x3ADB, 0x4E64, 0x5FED, 0x6D76, 0x7CFF, 0x9489, 0x8500, 0xB79B, 0xA612, 0xD2AD, 0xC324, 0xF1BF, 0xE036, 0x18C1, 0x0948, 0x3BD3, 0x2A5A, 0x5EE5, 0x4F6C, 0x7DF7, 0x6C7E, 0xA50A, 0xB483, 0x8618, 0x9791, 0xE32E, 0xF2A7, 0xC03C, 0xD1B5, 0x2942, 0x38CB, 0x0A50, 0x1BD9, 0x6F66, 0x7EEF, 0x4C74, 0x5DFD, 0xB58B, 0xA402, 0x9699, 0x8710, 0xF3AF, 0xE226, 0xD0BD, 0xC134, 0x39C3, 0x284A, 0x1AD1, 0x0B58, 0x7FE7, 0x6E6E, 0x5CF5, 0x4D7C, 0xC60C, 0xD785, 0xE51E, 0xF497, 0x8028, 0x91A1, 0xA33A, 0xB2B3, 0x4A44, 0x5BCD, 0x6956, 0x78DF, 0x0C60, 0x1DE9, 0x2F72, 0x3EFB, 0xD68D, 0xC704, 0xF59F, 0xE416, 0x90A9, 0x8120, 0xB3BB, 0xA232, 0x5AC5, 0x4B4C, 0x79D7, 0x685E, 0x1CE1, 0x0D68, 0x3FF3, 0x2E7A, 0xE70E, 0xF687, 0xC41C, 0xD595, 0xA12A, 0xB0A3, 0x8238, 0x93B1, 0x6B46, 0x7ACF, 0x4854, 0x59DD, 0x2D62, 0x3CEB, 0x0E70, 0x1FF9, 0xF78F, 0xE606, 0xD49D, 0xC514, 0xB1AB, 0xA022, 0x92B9, 0x8330, 0x7BC7, 0x6A4E, 0x58D5, 0x495C, 0x3DE3, 0x2C6A, 0x1EF1, 0x0F78 }; uint16_t crc_itu16_calc(const uint8_t *buf, int len, uint16_t crc) { int i; for (i = 0; i < len; i++) crc = (crc >> 8) ^ crc_itu16_table[(crc ^ buf[i]) & 0xFF]; return crc; } /*- End of function --------------------------------------------------------*/ int crc_itu16_append(uint8_t *buf, int len) { uint16_t crc; int new_len; int i; crc = 0xFFFF; new_len = len + 2; for (i = 0; i < len; i++) crc = (crc >> 8) ^ crc_itu16_table[(crc ^ buf[i]) & 0xFF]; crc ^= 0xFFFF; buf[i++] = (uint8_t) crc; buf[i++] = (uint8_t) (crc >> 8); return new_len; } /*- End of function --------------------------------------------------------*/ int crc_itu16_check(const uint8_t *buf, int len) { uint16_t crc; int i; crc = 0xFFFF; for (i = 0; i < len; i++) crc = (crc >> 8) ^ crc_itu16_table[(crc ^ buf[i]) & 0xFF]; return (crc & 0xFFFF) == 0xF0B8; } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/v17tx_constellation_maps.h0000644000175000017500000002234311150047205022777 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * v17tx_constellation_maps.h - ITU V.17 modem transmit part. * Constellation mapping. * * Written by Steve Underwood * * Copyright (C) 2004 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: v17tx_constellation_maps.h,v 1.1 2008/05/02 14:44:08 steveu Exp $ */ #if defined(SPANDSP_USE_FIXED_POINTx) static const complexi16_t v17_abcd_constellation[4] = #else static const complexf_t v17_abcd_constellation[4] = #endif { {-6, -2}, { 2, -6}, { 6, 2}, {-2, 6} }; #if defined(SPANDSP_USE_FIXED_POINTx) static const complexi16_t v17_14400_constellation[128] = #else static const complexf_t v17_14400_constellation[128] = #endif { {-8, -3}, /* 0x00 */ { 9, 2}, /* 0x01 */ { 2, -9}, /* 0x02 */ {-3, 8}, /* 0x03 */ { 8, 3}, /* 0x04 */ {-9, -2}, /* 0x05 */ {-2, 9}, /* 0x06 */ { 3, -8}, /* 0x07 */ {-8, 1}, /* 0x08 */ { 9, -2}, /* 0x09 */ {-2, -9}, /* 0x0A */ { 1, 8}, /* 0x0B */ { 8, -1}, /* 0x0C */ {-9, 2}, /* 0x0D */ { 2, 9}, /* 0x0E */ {-1, -8}, /* 0x0F */ {-4, -3}, /* 0x10 */ { 5, 2}, /* 0x11 */ { 2, -5}, /* 0x12 */ {-3, 4}, /* 0x13 */ { 4, 3}, /* 0x14 */ {-5, -2}, /* 0x15 */ {-2, 5}, /* 0x16 */ { 3, -4}, /* 0x17 */ {-4, 1}, /* 0x18 */ { 5, -2}, /* 0x19 */ {-2, -5}, /* 0x1A */ { 1, 4}, /* 0x1B */ { 4, -1}, /* 0x1C */ {-5, 2}, /* 0x1D */ { 2, 5}, /* 0x1E */ {-1, -4}, /* 0x1F */ { 4, -3}, /* 0x20 */ {-3, 2}, /* 0x21 */ { 2, 3}, /* 0x22 */ {-3, -4}, /* 0x23 */ {-4, 3}, /* 0x24 */ { 3, -2}, /* 0x25 */ {-2, -3}, /* 0x26 */ { 3, 4}, /* 0x27 */ { 4, 1}, /* 0x28 */ {-3, -2}, /* 0x29 */ {-2, 3}, /* 0x2A */ { 1, -4}, /* 0x2B */ {-4, -1}, /* 0x2C */ { 3, 2}, /* 0x2D */ { 2, -3}, /* 0x2E */ {-1, 4}, /* 0x2F */ { 0, -3}, /* 0x30 */ { 1, 2}, /* 0x31 */ { 2, -1}, /* 0x32 */ {-3, 0}, /* 0x33 */ { 0, 3}, /* 0x34 */ {-1, -2}, /* 0x35 */ {-2, 1}, /* 0x36 */ { 3, 0}, /* 0x37 */ { 0, 1}, /* 0x38 */ { 1, -2}, /* 0x39 */ {-2, -1}, /* 0x3A */ { 1, 0}, /* 0x3B */ { 0, -1}, /* 0x3C */ {-1, 2}, /* 0x3D */ { 2, 1}, /* 0x3E */ {-1, 0}, /* 0x3F */ { 8, -3}, /* 0x40 */ {-7, 2}, /* 0x41 */ { 2, 7}, /* 0x42 */ {-3, -8}, /* 0x43 */ {-8, 3}, /* 0x44 */ { 7, -2}, /* 0x45 */ {-2, -7}, /* 0x46 */ { 3, 8}, /* 0x47 */ { 8, 1}, /* 0x48 */ {-7, -2}, /* 0x49 */ {-2, 7}, /* 0x4A */ { 1, -8}, /* 0x4B */ {-8, -1}, /* 0x4C */ { 7, 2}, /* 0x4D */ { 2, -7}, /* 0x4E */ {-1, 8}, /* 0x4F */ {-4, -7}, /* 0x50 */ { 5, 6}, /* 0x51 */ { 6, -5}, /* 0x52 */ {-7, 4}, /* 0x53 */ { 4, 7}, /* 0x54 */ {-5, -6}, /* 0x55 */ {-6, 5}, /* 0x56 */ { 7, -4}, /* 0x57 */ {-4, 5}, /* 0x58 */ { 5, -6}, /* 0x59 */ {-6, -5}, /* 0x5A */ { 5, 4}, /* 0x5B */ { 4, -5}, /* 0x5C */ {-5, 6}, /* 0x5D */ { 6, 5}, /* 0x5E */ {-5, -4}, /* 0x5F */ { 4, -7}, /* 0x60 */ {-3, 6}, /* 0x61 */ { 6, 3}, /* 0x62 */ {-7, -4}, /* 0x63 */ {-4, 7}, /* 0x64 */ { 3, -6}, /* 0x65 */ {-6, -3}, /* 0x66 */ { 7, 4}, /* 0x67 */ { 4, 5}, /* 0x68 */ {-3, -6}, /* 0x69 */ {-6, 3}, /* 0x6A */ { 5, -4}, /* 0x6B */ {-4, -5}, /* 0x6C */ { 3, 6}, /* 0x6D */ { 6, -3}, /* 0x6E */ {-5, 4}, /* 0x6F */ { 0, -7}, /* 0x70 */ { 1, 6}, /* 0x71 */ { 6, -1}, /* 0x72 */ {-7, 0}, /* 0x73 */ { 0, 7}, /* 0x74 */ {-1, -6}, /* 0x75 */ {-6, 1}, /* 0x76 */ { 7, 0}, /* 0x77 */ { 0, 5}, /* 0x78 */ { 1, -6}, /* 0x79 */ {-6, -1}, /* 0x7A */ { 5, 0}, /* 0x7B */ { 0, -5}, /* 0x7C */ {-1, 6}, /* 0x7D */ { 6, 1}, /* 0x7E */ {-5, 0} /* 0x7F */ }; #if defined(SPANDSP_USE_FIXED_POINTx) static const complexi16_t v17_12000_constellation[64] = #else static const complexf_t v17_12000_constellation[64] = #endif { { 7, 1}, /* 0x00 */ {-5, -1}, /* 0x01 */ {-1, 5}, /* 0x02 */ { 1, -7}, /* 0x03 */ {-7, -1}, /* 0x04 */ { 5, 1}, /* 0x05 */ { 1, -5}, /* 0x06 */ {-1, 7}, /* 0x07 */ { 3, -3}, /* 0x08 */ {-1, 3}, /* 0x09 */ { 3, 1}, /* 0x0A */ {-3, -3}, /* 0x0B */ {-3, 3}, /* 0x0C */ { 1, -3}, /* 0x0D */ {-3, -1}, /* 0x0E */ { 3, 3}, /* 0x0F */ { 7, -7}, /* 0x10 */ {-5, 7}, /* 0x11 */ { 7, 5}, /* 0x12 */ {-7, -7}, /* 0x13 */ {-7, 7}, /* 0x14 */ { 5, -7}, /* 0x15 */ {-7, -5}, /* 0x16 */ { 7, 7}, /* 0x17 */ {-1, -7}, /* 0x18 */ { 3, 7}, /* 0x19 */ { 7, -3}, /* 0x1A */ {-7, 1}, /* 0x1B */ { 1, 7}, /* 0x1C */ {-3, -7}, /* 0x1D */ {-7, 3}, /* 0x1E */ { 7, -1}, /* 0x1F */ { 3, 5}, /* 0x20 */ {-1, -5}, /* 0x21 */ {-5, 1}, /* 0x22 */ { 5, -3}, /* 0x23 */ {-3, -5}, /* 0x24 */ { 1, 5}, /* 0x25 */ { 5, -1}, /* 0x26 */ {-5, 3}, /* 0x27 */ {-1, 1}, /* 0x28 */ { 3, -1}, /* 0x29 */ {-1, -3}, /* 0x2A */ { 1, 1}, /* 0x2B */ { 1, -1}, /* 0x2C */ {-3, 1}, /* 0x2D */ { 1, 3}, /* 0x2E */ {-1, -1}, /* 0x2F */ {-5, 5}, /* 0x30 */ { 7, -5}, /* 0x31 */ {-5, -7}, /* 0x32 */ { 5, 5}, /* 0x33 */ { 5, -5}, /* 0x34 */ {-7, 5}, /* 0x35 */ { 5, 7}, /* 0x36 */ {-5, -5}, /* 0x37 */ {-5, -3}, /* 0x38 */ { 7, 3}, /* 0x39 */ { 3, -7}, /* 0x3A */ {-3, 5}, /* 0x3B */ { 5, 3}, /* 0x3C */ {-7, -3}, /* 0x3D */ {-3, 7}, /* 0x3E */ { 3, -5} /* 0x3F */ }; #if defined(SPANDSP_USE_FIXED_POINTx) static const complexi16_t v17_9600_constellation[32] = #else static const complexf_t v17_9600_constellation[32] = #endif { {-8, 2}, /* 0x00 */ {-6, -4}, /* 0x01 */ {-4, 6}, /* 0x02 */ { 2, 8}, /* 0x03 */ { 8, -2}, /* 0x04 */ { 6, 4}, /* 0x05 */ { 4, -6}, /* 0x06 */ {-2, -8}, /* 0x07 */ { 0, 2}, /* 0x08 */ {-6, 4}, /* 0x09 */ { 4, 6}, /* 0x0A */ { 2, 0}, /* 0x0B */ { 0, -2}, /* 0x0C */ { 6, -4}, /* 0x0D */ {-4, -6}, /* 0x0E */ {-2, 0}, /* 0x0F */ { 0, -6}, /* 0x10 */ { 2, -4}, /* 0x11 */ {-4, -2}, /* 0x12 */ {-6, 0}, /* 0x13 */ { 0, 6}, /* 0x14 */ {-2, 4}, /* 0x15 */ { 4, 2}, /* 0x16 */ { 6, 0}, /* 0x17 */ { 8, 2}, /* 0x18 */ { 2, 4}, /* 0x19 */ { 4, -2}, /* 0x1A */ { 2, -8}, /* 0x1B */ {-8, -2}, /* 0x1C */ {-2, -4}, /* 0x1D */ {-4, 2}, /* 0x1E */ {-2, 8} /* 0x1F */ }; #if defined(SPANDSP_USE_FIXED_POINTx) static const complexi16_t v17_7200_constellation[16] = #else static const complexf_t v17_7200_constellation[16] = #endif { { 6, -6}, /* 0x00 */ {-2, 6}, /* 0x01 */ { 6, 2}, /* 0x02 */ {-6, -6}, /* 0x03 */ {-6, 6}, /* 0x04 */ { 2, -6}, /* 0x05 */ {-6, -2}, /* 0x06 */ { 6, 6}, /* 0x07 */ {-2, 2}, /* 0x08 */ { 6, -2}, /* 0x09 */ {-2, -6}, /* 0x0A */ { 2, 2}, /* 0x0B */ { 2, -2}, /* 0x0C */ {-6, 2}, /* 0x0D */ { 2, 6}, /* 0x0E */ {-2, -2} /* 0x0F */ }; /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/adsi.c0000644000175000017500000007413711150047205016753 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * adsi.c - Analogue display service interfaces of various types, including * ADSI, TDD and most caller ID formats. * * Written by Steve Underwood * * Copyright (C) 2003 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: adsi.c,v 1.59 2008/07/02 14:48:25 steveu Exp $ */ /*! \file */ #if defined(HAVE_CONFIG_H) #include #endif #include #include #include #include #include "floating_fudge.h" #if defined(HAVE_TGMATH_H) #include #endif #if defined(HAVE_MATH_H) #include #endif #include #include "spandsp/telephony.h" #include "spandsp/logging.h" #include "spandsp/queue.h" #include "spandsp/complex.h" #include "spandsp/dds.h" #include "spandsp/power_meter.h" #include "spandsp/async.h" #include "spandsp/crc.h" #include "spandsp/fsk.h" #include "spandsp/tone_detect.h" #include "spandsp/tone_generate.h" #include "spandsp/super_tone_rx.h" #include "spandsp/dtmf.h" #include "spandsp/adsi.h" #define BAUDOT_FIGURE_SHIFT 0x1B #define BAUDOT_LETTER_SHIFT 0x1F #define SOH 0x01 #define STX 0x02 #define ETX 0x03 #define DLE 0x10 #define SUB 0x1A static uint16_t adsi_encode_baudot(adsi_tx_state_t *s, uint8_t ch); static uint8_t adsi_decode_baudot(adsi_rx_state_t *s, uint8_t ch); static int adsi_tx_get_bit(void *user_data) { int bit; adsi_tx_state_t *s; s = (adsi_tx_state_t *) user_data; /* This is similar to the async. handling code in fsk.c, but a few special things are needed in the preamble, and postamble of an ADSI message. */ if (s->bit_no < s->preamble_len) { /* Alternating bit preamble */ bit = s->bit_no & 1; s->bit_no++; } else if (s->bit_no < s->preamble_len + s->preamble_ones_len) { /* All 1s for receiver conditioning */ /* NB: The receiver is an async one. It needs a rest after the alternating 1/0 sequence so it can reliably pick up on the next start bit, and sync to the byte stream. */ /* The length of this period varies with the circumstance */ bit = 1; s->bit_no++; } else if (s->bit_no <= s->preamble_len + s->preamble_ones_len) { /* Push out the 8 bit async. chars, with an appropriate number of stop bits */ if (s->bit_pos == 0) { /* Start bit */ bit = 0; s->bit_pos++; } else if (s->bit_pos < 1 + 8) { bit = (s->msg[s->byte_no] >> (s->bit_pos - 1)) & 1; s->bit_pos++; } else if (s->bit_pos < 1 + 8 + s->stop_bits - 1) { /* Stop bit */ bit = 1; s->bit_pos++; } else { /* Stop bit */ bit = 1; s->bit_pos = 0; if (++s->byte_no >= s->msg_len) s->bit_no++; } } else if (s->bit_no <= s->preamble_len + s->preamble_ones_len + s->postamble_ones_len) { /* Extra stop bits beyond the last character, to meet the specs., and ensure all bits are out of the DSP before we shut off the FSK modem. */ bit = 1; s->bit_no++; } else { bit = PUTBIT_END_OF_DATA; if (s->tx_signal_on) { /* The FSK should now be switched off. */ s->tx_signal_on = FALSE; s->msg_len = 0; } } //printf("Tx bit %d\n", bit); return bit; } /*- End of function --------------------------------------------------------*/ static int adsi_tdd_get_async_byte(void *user_data) { adsi_tx_state_t *s; s = (adsi_tx_state_t *) user_data; if (s->byte_no < s->msg_len) return s->msg[s->byte_no++]; if (s->tx_signal_on) { /* The FSK should now be switched off. */ s->tx_signal_on = FALSE; s->msg_len = 0; } return 0x1F; } /*- End of function --------------------------------------------------------*/ static void adsi_rx_put_bit(void *user_data, int bit) { adsi_rx_state_t *s; int i; int sum; s = (adsi_rx_state_t *) user_data; if (bit < 0) { /* Special conditions */ switch (bit) { case PUTBIT_CARRIER_UP: span_log(&s->logging, SPAN_LOG_FLOW, "Carrier up.\n"); s->consecutive_ones = 0; s->bit_pos = 0; s->in_progress = 0; s->msg_len = 0; s->baudot_shift = 0; break; case PUTBIT_CARRIER_DOWN: span_log(&s->logging, SPAN_LOG_FLOW, "Carrier down.\n"); break; default: span_log(&s->logging, SPAN_LOG_WARNING, "Unexpected special put bit value - %d!\n", bit); break; } return; } bit &= 1; if (s->bit_pos == 0) { if (bit == 0) { /* Start bit */ s->bit_pos++; if (s->consecutive_ones > 10) { /* This is a line idle condition, which means we should restart message acquisition */ s->msg_len = 0; } s->consecutive_ones = 0; } else { s->consecutive_ones++; } } else if (s->bit_pos <= 8) { s->in_progress >>= 1; if (bit) s->in_progress |= 0x80; s->bit_pos++; } else { /* Stop bit */ if (bit) { if (s->msg_len < 256) { if (s->standard == ADSI_STANDARD_JCLIP) { if (s->msg_len == 0) { /* A message should start DLE SOH, but let's just check we are starting with a DLE for now */ if (s->in_progress == (0x80 | DLE)) s->msg[s->msg_len++] = (uint8_t) s->in_progress; } else { s->msg[s->msg_len++] = (uint8_t) s->in_progress; } if (s->msg_len >= 11 && s->msg_len == ((s->msg[6] & 0x7F) + 11)) { /* Test the CRC-16 */ if (crc_itu16_calc(s->msg + 2, s->msg_len - 2, 0) == 0) { /* Strip off the parity bits. It doesn't seem worthwhile actually checking the parity if a CRC check has succeeded. */ for (i = 0; i < s->msg_len - 2; i++) s->msg[i] &= 0x7F; /* Put everything, except the CRC octets */ s->put_msg(s->user_data, s->msg, s->msg_len - 2); } else { span_log(&s->logging, SPAN_LOG_WARNING, "CRC failed\n"); } s->msg_len = 0; } } else { s->msg[s->msg_len++] = (uint8_t) s->in_progress; if (s->msg_len >= 3 && s->msg_len == (s->msg[1] + 3)) { /* Test the checksum */ sum = 0; for (i = 0; i < s->msg_len - 1; i++) sum += s->msg[i]; if ((-sum & 0xFF) == s->msg[i]) s->put_msg(s->user_data, s->msg, s->msg_len - 1); else span_log(&s->logging, SPAN_LOG_WARNING, "Sumcheck failed\n"); s->msg_len = 0; } } } } else { s->framing_errors++; } s->bit_pos = 0; s->in_progress = 0; } } /*- End of function --------------------------------------------------------*/ static void adsi_tdd_put_async_byte(void *user_data, int byte) { adsi_rx_state_t *s; uint8_t octet; s = (adsi_rx_state_t *) user_data; if (byte < 0) { /* Special conditions */ switch (byte) { case PUTBIT_CARRIER_UP: span_log(&s->logging, SPAN_LOG_FLOW, "Carrier up.\n"); s->consecutive_ones = 0; s->bit_pos = 0; s->in_progress = 0; s->msg_len = 0; s->baudot_shift = 0; break; case PUTBIT_CARRIER_DOWN: span_log(&s->logging, SPAN_LOG_FLOW, "Carrier down.\n"); if (s->msg_len > 0) { /* Whatever we have to date constitutes the message */ s->put_msg(s->user_data, s->msg, s->msg_len); s->msg_len = 0; } break; default: span_log(&s->logging, SPAN_LOG_WARNING, "Unexpected special put byte value - %d!\n", byte); break; } return; } if ((octet = adsi_decode_baudot(s, (uint8_t) byte))) s->msg[s->msg_len++] = octet; if (s->msg_len >= 256) { s->put_msg(s->user_data, s->msg, s->msg_len); s->msg_len = 0; } } /*- End of function --------------------------------------------------------*/ static void adsi_rx_dtmf(void *user_data, const char *digits, int len) { adsi_rx_state_t *s; s = (adsi_rx_state_t *) user_data; if (s->msg_len == 0) { /* Message starting. Start a 10s timeout, to make things more noise tolerant for a detector running continuously when on hook. */ s->in_progress = 80000; } /* It seems all the DTMF variants are a string of digits and letters, terminated by a "#", or a "C". It appears these are unambiguous, and non-conflicting. */ for ( ; len && s->msg_len < 256; len--) { s->msg[s->msg_len++] = *digits; if (*digits == '#' || *digits == 'C') { s->put_msg(s->user_data, s->msg, s->msg_len); s->msg_len = 0; } digits++; } } /*- End of function --------------------------------------------------------*/ static void start_tx(adsi_tx_state_t *s) { switch (s->standard) { case ADSI_STANDARD_CLASS: fsk_tx_init(&(s->fsktx), &preset_fsk_specs[FSK_BELL202], adsi_tx_get_bit, s); break; case ADSI_STANDARD_CLIP: case ADSI_STANDARD_ACLIP: case ADSI_STANDARD_JCLIP: fsk_tx_init(&(s->fsktx), &preset_fsk_specs[FSK_V23CH1], adsi_tx_get_bit, s); break; case ADSI_STANDARD_CLIP_DTMF: dtmf_tx_init(&(s->dtmftx)); break; case ADSI_STANDARD_TDD: fsk_tx_init(&(s->fsktx), &preset_fsk_specs[FSK_WEITBRECHT], async_tx_get_bit, &(s->asynctx)); async_tx_init(&(s->asynctx), 5, ASYNC_PARITY_NONE, 2, FALSE, adsi_tdd_get_async_byte, s); /* Schedule an explicit shift at the start of baudot transmission */ s->baudot_shift = 2; break; } s->tx_signal_on = TRUE; } /*- End of function --------------------------------------------------------*/ int adsi_rx(adsi_rx_state_t *s, const int16_t *amp, int len) { switch (s->standard) { case ADSI_STANDARD_CLIP_DTMF: /* Apply a message timeout. */ s->in_progress -= len; if (s->in_progress <= 0) s->msg_len = 0; dtmf_rx(&(s->dtmfrx), amp, len); break; default: fsk_rx(&(s->fskrx), amp, len); break; } return 0; } /*- End of function --------------------------------------------------------*/ adsi_rx_state_t *adsi_rx_init(adsi_rx_state_t *s, int standard, put_msg_func_t put_msg, void *user_data) { if (s == NULL) { if ((s = (adsi_rx_state_t *) malloc(sizeof(*s))) == NULL) return NULL; } memset(s, 0, sizeof(*s)); s->put_msg = put_msg; s->user_data = user_data; switch (standard) { case ADSI_STANDARD_CLASS: fsk_rx_init(&(s->fskrx), &preset_fsk_specs[FSK_BELL202], FALSE, adsi_rx_put_bit, s); break; case ADSI_STANDARD_CLIP: case ADSI_STANDARD_ACLIP: case ADSI_STANDARD_JCLIP: fsk_rx_init(&(s->fskrx), &preset_fsk_specs[FSK_V23CH1], FALSE, adsi_rx_put_bit, s); break; case ADSI_STANDARD_CLIP_DTMF: dtmf_rx_init(&(s->dtmfrx), adsi_rx_dtmf, s); break; case ADSI_STANDARD_TDD: fsk_rx_init(&(s->fskrx), &preset_fsk_specs[FSK_WEITBRECHT], FALSE, async_rx_put_bit, &(s->asyncrx)); async_rx_init(&(s->asyncrx), 5, ASYNC_PARITY_NONE, 2, TRUE, adsi_tdd_put_async_byte, s); break; } s->standard = standard; span_log_init(&s->logging, SPAN_LOG_NONE, NULL); return s; } /*- End of function --------------------------------------------------------*/ int adsi_tx(adsi_tx_state_t *s, int16_t *amp, int max_len) { int len; int lenx; len = tone_gen(&(s->alert_tone_gen), amp, max_len); if (s->tx_signal_on) { switch (s->standard) { case ADSI_STANDARD_CLIP_DTMF: if (len < max_len) len += dtmf_tx(&(s->dtmftx), amp, max_len - len); break; default: if (len < max_len) { if ((lenx = fsk_tx(&(s->fsktx), amp + len, max_len - len)) <= 0) s->tx_signal_on = FALSE; len += lenx; } break; } } return len; } /*- End of function --------------------------------------------------------*/ void adsi_tx_send_alert_tone(adsi_tx_state_t *s) { tone_gen_init(&(s->alert_tone_gen), &(s->alert_tone_desc)); } /*- End of function --------------------------------------------------------*/ void adsi_tx_set_preamble(adsi_tx_state_t *s, int preamble_len, int preamble_ones_len, int postamble_ones_len, int stop_bits) { if (preamble_len < 0) { if (s->standard == ADSI_STANDARD_JCLIP) s->preamble_len = 0; else s->preamble_len = 300; } else { s->preamble_len = preamble_len; } if (preamble_ones_len < 0) { if (s->standard == ADSI_STANDARD_JCLIP) s->preamble_ones_len = 75; else s->preamble_ones_len = 80; } else { s->preamble_ones_len = preamble_ones_len; } if (postamble_ones_len < 0) { if (s->standard == ADSI_STANDARD_JCLIP) s->postamble_ones_len = 5; else s->postamble_ones_len = 5; } else { s->postamble_ones_len = postamble_ones_len; } if (stop_bits < 0) { if (s->standard == ADSI_STANDARD_JCLIP) s->stop_bits = 4; else s->stop_bits = 1; } else { s->stop_bits = stop_bits; } } /*- End of function --------------------------------------------------------*/ int adsi_tx_put_message(adsi_tx_state_t *s, const uint8_t *msg, int len) { int i; int j; int k; int byte; int parity; int sum; size_t ii; uint16_t crc_value; /* Don't inject a new message when a previous one is still in progress */ if (s->msg_len > 0) return 0; if (!s->tx_signal_on) { /* We need to restart the modem */ start_tx(s); } switch (s->standard) { case ADSI_STANDARD_CLIP_DTMF: if (len >= 128) return -1; len -= (int) dtmf_tx_put(&(s->dtmftx), (char *) msg, len); break; case ADSI_STANDARD_JCLIP: if (len > 128 - 9) return -1; i = 0; s->msg[i++] = DLE; s->msg[i++] = SOH; s->msg[i++] = 0x07; //header s->msg[i++] = DLE; s->msg[i++] = STX; s->msg[i++] = msg[0]; s->msg[i++] = (uint8_t) (len - 2); /* We might need to byte stuff the overall length, but the rest of the message should already be stuffed. */ if (len - 2 == DLE) s->msg[i++] = DLE; memcpy(&s->msg[i], &msg[2], len - 2); i += len - 2; s->msg[i++] = DLE; s->msg[i++] = ETX; /* Set the parity bits */ for (j = 0; j < i; j++) { byte = s->msg[j]; parity = 0; for (k = 1; k <= 7; k++) parity ^= (byte << k); s->msg[j] = (s->msg[j] & 0x7F) | ((uint8_t) parity & 0x80); } crc_value = crc_itu16_calc(s->msg + 2, i - 2, 0); s->msg[i++] = (uint8_t) (crc_value & 0xFF); s->msg[i++] = (uint8_t) ((crc_value >> 8) & 0xFF); s->msg_len = i; break; case ADSI_STANDARD_TDD: if (len > 255) return -1; memcpy(s->msg, msg, len); s->msg_len = len; break; default: if (len > 255) return -1; memcpy(s->msg, msg, len); /* Force the length in case it is wrong */ s->msg[1] = (uint8_t) (len - 2); /* Add the sumcheck */ sum = 0; for (ii = 0; ii < (size_t) len; ii++) sum += s->msg[ii]; s->msg[len] = (uint8_t) ((-sum) & 0xFF); s->msg_len = len + 1; break; } /* Prepare the bit sequencing */ s->byte_no = 0; s->bit_pos = 0; s->bit_no = 0; return len; } /*- End of function --------------------------------------------------------*/ adsi_tx_state_t *adsi_tx_init(adsi_tx_state_t *s, int standard) { if (s == NULL) { if ((s = (adsi_tx_state_t *) malloc(sizeof(*s))) == NULL) return NULL; } memset(s, 0, sizeof(*s)); make_tone_gen_descriptor(&(s->alert_tone_desc), 2130, -13, 2750, -13, 110, 60, 0, 0, FALSE); s->standard = standard; adsi_tx_set_preamble(s, -1, -1, -1, -1); span_log_init(&s->logging, SPAN_LOG_NONE, NULL); start_tx(s); return s; } /*- End of function --------------------------------------------------------*/ static uint16_t adsi_encode_baudot(adsi_tx_state_t *s, uint8_t ch) { static const uint8_t conv[128] = { 0x00, /* NUL */ 0xFF, /* */ 0xFF, /* */ 0xFF, /* */ 0xFF, /* */ 0xFF, /* */ 0xFF, /* */ 0xFF, /* */ 0xFF, /* */ 0xFF, /* */ 0x42, /* LF */ 0xFF, /* */ 0xFF, /* */ 0x48, /* CR */ 0xFF, /* */ 0xFF, /* */ 0xFF, /* */ 0xFF, /* */ 0xFF, /* */ 0xFF, /* */ 0xFF, /* */ 0xFF, /* */ 0xFF, /* */ 0xFF, /* */ 0xFF, /* */ 0xFF, /* */ 0xFF, /* */ 0xFF, /* */ 0xFF, /* */ 0xFF, /* */ 0xFF, /* */ 0xFF, /* */ 0x44, /* */ 0xFF, /* ! */ 0xFF, /* " */ 0x94, /* # */ 0x89, /* $ */ 0xFF, /* % */ 0xFF, /* & */ 0x85, /* ' */ 0x8F, /* ( */ 0x92, /* ) */ 0x8B, /* * */ 0x91, /* + */ 0x8C, /* , */ 0x83, /* - */ 0x9C, /* . */ 0x9D, /* / */ 0x96, /* 0 */ 0x97, /* 1 */ 0x93, /* 2 */ 0x81, /* 3 */ 0x8A, /* 4 */ 0x90, /* 5 */ 0x95, /* 6 */ 0x87, /* 7 */ 0x86, /* 8 */ 0x98, /* 9 */ 0x8E, /* : */ 0xFF, /* ; */ 0xFF, /* < */ 0x9E, /* = */ 0xFF, /* > */ 0x99, /* ? */ 0xFF, /* @ */ 0x03, /* A */ 0x19, /* B */ 0x0E, /* C */ 0x09, /* D */ 0x01, /* E */ 0x0D, /* F */ 0x1A, /* G */ 0x14, /* H */ 0x06, /* I */ 0x0B, /* J */ 0x0F, /* K */ 0x12, /* L */ 0x1C, /* M */ 0x0C, /* N */ 0x18, /* O */ 0x16, /* P */ 0x17, /* Q */ 0x0A, /* R */ 0x05, /* S */ 0x10, /* T */ 0x07, /* U */ 0x1E, /* V */ 0x13, /* W */ 0x1D, /* X */ 0x15, /* Y */ 0x11, /* Z */ 0xFF, /* [ */ 0xFF, /* \ */ 0xFF, /* ] */ 0x9B, /* ^ */ 0xFF, /* _ */ 0xFF, /* ` */ 0x03, /* a */ 0x19, /* b */ 0x0E, /* c */ 0x09, /* d */ 0x01, /* e */ 0x0D, /* f */ 0x1A, /* g */ 0x14, /* h */ 0x06, /* i */ 0x0B, /* j */ 0x0F, /* k */ 0x12, /* l */ 0x1C, /* m */ 0x0C, /* n */ 0x18, /* o */ 0x16, /* p */ 0x17, /* q */ 0x0A, /* r */ 0x05, /* s */ 0x10, /* t */ 0x07, /* u */ 0x1E, /* v */ 0x13, /* w */ 0x1D, /* x */ 0x15, /* y */ 0x11, /* z */ 0xFF, /* { */ 0xFF, /* | */ 0xFF, /* } */ 0xFF, /* ~ */ 0xFF, /* DEL */ }; uint16_t shift; ch = conv[ch]; if (ch == 0xFF) return 0; if ((ch & 0x40)) return ch & 0x1F; if ((ch & 0x80)) { if (s->baudot_shift == 1) return ch & 0x1F; s->baudot_shift = 1; shift = BAUDOT_FIGURE_SHIFT; } else { if (s->baudot_shift == 0) return ch & 0x1F; s->baudot_shift = 0; shift = BAUDOT_LETTER_SHIFT; } return (shift << 5) | (ch & 0x1F); } /*- End of function --------------------------------------------------------*/ static uint8_t adsi_decode_baudot(adsi_rx_state_t *s, uint8_t ch) { static const uint8_t conv[2][32] = { {"\000E\nA SIU\rDRJNFCKTZLWHYPQOBG^MXV^"}, {"\0003\n- '87\r$4*,*:(5+)2#6019?*^./=^"} }; switch (ch) { case BAUDOT_FIGURE_SHIFT: s->baudot_shift = 1; break; case BAUDOT_LETTER_SHIFT: s->baudot_shift = 0; break; default: return conv[s->baudot_shift][ch]; } /* return 0 if we did not produce a character */ return 0; } /*- End of function --------------------------------------------------------*/ int adsi_next_field(adsi_rx_state_t *s, const uint8_t *msg, int msg_len, int pos, uint8_t *field_type, uint8_t const **field_body, int *field_len) { int i; /* Return -1 for no more fields. Return -2 for message structure corrupt. */ switch (s->standard) { case ADSI_STANDARD_CLASS: case ADSI_STANDARD_CLIP: case ADSI_STANDARD_ACLIP: if (pos >= msg_len) return -1; /* For MDMF type messages, these standards all use "IE" type fields - type, length, contents - and similar headers */ if (pos <= 0) { /* Return the message type */ *field_type = msg[0]; *field_len = 0; *field_body = NULL; pos = 2; } else { if ((msg[0] & 0x80)) { /* MDMF messages seem to always have a message type with the MSB set. Is that guaranteed? */ *field_type = msg[pos++]; *field_len = msg[pos++]; *field_body = msg + pos; } else { /* SDMF */ *field_type = 0; *field_len = msg_len - pos; *field_body = msg + pos; } pos += *field_len; } if (pos > msg_len) return -2; break; case ADSI_STANDARD_JCLIP: if (pos >= msg_len - 2) return -1; if (pos <= 0) { /* Return the message type */ pos = 5; *field_type = msg[pos++]; if (*field_type == DLE) pos++; if (msg[pos++] == DLE) pos++; *field_len = 0; *field_body = NULL; } else { *field_type = msg[pos++]; if (*field_type == DLE) pos++; *field_len = msg[pos++]; if (*field_len == DLE) pos++; /* TODO: we assume here that the body contains no DLE's that would have been stuffed */ *field_body = msg + pos; pos += *field_len; } if (pos > msg_len - 2) return -2; break; case ADSI_STANDARD_CLIP_DTMF: if (pos > msg_len) return -1; if (pos <= 0) { pos = 1; *field_type = msg[msg_len - 1]; *field_len = 0; *field_body = NULL; } else { /* Remove bias on the pos value */ pos--; if (msg[pos] >= '0' && msg[pos] <= '9') *field_type = CLIP_DTMF_HASH_UNSPECIFIED; else *field_type = msg[pos++]; *field_body = msg + pos; i = pos; while (i < msg_len && msg[i] >= '0' && msg[i] <= '9') i++; *field_len = i - pos; pos = i; /* Check if we have reached the end of message marker. */ if (msg[pos] == '#' || msg[pos] == 'C') pos++; if (pos > msg_len) return -2; /* Bias the pos value, so we don't return 0 inappropriately */ pos++; } break; case ADSI_STANDARD_TDD: if (pos >= msg_len) return -1; *field_type = 0; *field_body = msg; *field_len = msg_len; pos = msg_len; break; } return pos; } /*- End of function --------------------------------------------------------*/ int adsi_add_field(adsi_tx_state_t *s, uint8_t *msg, int len, uint8_t field_type, uint8_t const *field_body, int field_len) { int i; int x; switch (s->standard) { case ADSI_STANDARD_CLASS: case ADSI_STANDARD_CLIP: case ADSI_STANDARD_ACLIP: /* These standards all use "IE" type fields - type, length, value - and similar headers */ if (len <= 0) { /* Initialise a new message. The field type is actually the message type. */ msg[0] = field_type; msg[1] = 0; len = 2; } else { /* Add to a message in progress. */ if (field_type) { msg[len++] = field_type; msg[len++] = (uint8_t) field_len; if (field_len == DLE) msg[len++] = (uint8_t) field_len; memcpy(msg + len, field_body, field_len); len += field_len; } else { /* No field type or length, for restricted single message formats */ memcpy(msg + len, field_body, field_len); len += field_len; } } break; case ADSI_STANDARD_JCLIP: /* This standard uses "IE" type fields - type, length, value - but escapes DLE characters, to prevent immitation of a control octet. */ if (len <= 0) { /* Initialise a new message. The field type is actually the message type. */ msg[0] = field_type; msg[1] = 0; len = 2; } else { /* Add to a message in progress. */ msg[len++] = field_type; if (field_type == DLE) msg[len++] = field_type; msg[len++] = (uint8_t) field_len; if (field_len == DLE) msg[len++] = (uint8_t) field_len; for (i = 0; i < field_len; i++) { msg[len++] = field_body[i]; if (field_body[i] == DLE) msg[len++] = field_body[i]; } } break; case ADSI_STANDARD_CLIP_DTMF: if (len <= 0) { /* Initialise a new message. The field type is actually the message type. */ msg[0] = field_type; len = 1; } else { /* Save and reuse the terminator/message type */ x = msg[--len]; if (field_type != CLIP_DTMF_HASH_UNSPECIFIED) msg[len++] = field_type; memcpy(msg + len, field_body, field_len); msg[len + field_len] = x; len += (field_len + 1); } break; case ADSI_STANDARD_TDD: if (len < 0) len = 0; for (i = 0; i < field_len; i++) { if ((x = adsi_encode_baudot(s, field_body[i]))) { if ((x & 0x3E0)) msg[len++] = (uint8_t) ((x >> 5) & 0x1F); msg[len++] = (uint8_t) (x & 0x1F); } } break; } return len; } /*- End of function --------------------------------------------------------*/ const char *adsi_standard_to_str(int standard) { switch (standard) { case ADSI_STANDARD_CLASS: return "CLASS"; case ADSI_STANDARD_CLIP: return "CLIP"; case ADSI_STANDARD_ACLIP: return "A-CLIP"; case ADSI_STANDARD_JCLIP: return "J-CLIP"; case ADSI_STANDARD_CLIP_DTMF: return "CLIP-DTMF"; case ADSI_STANDARD_TDD: return "TDD"; } return "???"; } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/Makefile.am0000644000175000017500000003426111150047205017715 0ustar julienjulien## ## SpanDSP - a series of DSP components for telephony ## ## Makefile.am - Process this file with automake to produce Makefile.in ## ## This program is free software; you can redistribute it and/or modify ## it under the terms of the GNU Lesser General Public License version 2.1, ## as published by the Free Software Foundation. ## ## This program is distributed in the hope that it will be useful, ## but WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ## GNU Lesser General Public License for more details. ## ## You should have received a copy of the GNU Lesser General Public ## License along with this program; if not, write to the Free Software ## Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ## ## $Id: Makefile.am,v 1.97 2008/07/25 13:56:54 steveu Exp $ AM_CFLAGS = $(COMP_VENDOR_CFLAGS) AM_LDFLAGS = $(COMP_VENDOR_LDFLAGS) MAINTAINERCLEANFILES = Makefile.in INCLUDES = -I$(top_builddir) lib_LTLIBRARIES = libspandsp.la libspandsp_la_SOURCES = adsi.c \ async.c \ at_interpreter.c \ awgn.c \ bell_r2_mf.c \ bert.c \ bit_operations.c \ bitstream.c \ complex_filters.c \ complex_vector_float.c \ crc.c \ dds_float.c \ dds_int.c \ dtmf.c \ echo.c \ fax.c \ fsk.c \ g711.c \ g722_encode.c \ g722_decode.c \ g726.c \ gsm0610_decode.c \ gsm0610_encode.c \ gsm0610_long_term.c \ gsm0610_lpc.c \ gsm0610_preprocess.c \ gsm0610_rpe.c \ gsm0610_short_term.c \ hdlc.c \ ima_adpcm.c \ logging.c \ lpc10_analyse.c \ lpc10_decode.c \ lpc10_encode.c \ lpc10_placev.c \ lpc10_voicing.c \ modem_echo.c \ modem_connect_tones.c \ noise.c \ oki_adpcm.c \ playout.c \ plc.c \ power_meter.c \ queue.c \ schedule.c \ sig_tone.c \ silence_gen.c \ super_tone_rx.c \ super_tone_tx.c \ t4.c \ t30.c \ t30_api.c \ t30_logging.c \ t31.c \ t35.c \ t38_core.c \ t38_gateway.c \ t38_terminal.c \ testcpuid.c \ time_scale.c \ tone_detect.c \ tone_generate.c \ v17rx.c \ v17tx.c \ v22bis_rx.c \ v22bis_tx.c \ v27ter_rx.c \ v27ter_tx.c \ v29rx.c \ v29tx.c \ v42.c \ v42bis.c \ v8.c \ vector_float.c \ vector_int.c libspandsp_la_LDFLAGS = -version-info @SPANDSP_LT_CURRENT@:@SPANDSP_LT_REVISION@:@SPANDSP_LT_AGE@ nobase_include_HEADERS = spandsp/adsi.h \ spandsp/async.h \ spandsp/arctan2.h \ spandsp/at_interpreter.h \ spandsp/awgn.h \ spandsp/bell_r2_mf.h \ spandsp/bert.h \ spandsp/biquad.h \ spandsp/bit_operations.h \ spandsp/bitstream.h \ spandsp/crc.h \ spandsp/complex.h \ spandsp/complex_filters.h \ spandsp/complex_vector_float.h \ spandsp/dc_restore.h \ spandsp/dds.h \ spandsp/dtmf.h \ spandsp/echo.h \ spandsp/fax.h \ spandsp/fax_modems.h \ spandsp/fir.h \ spandsp/fsk.h \ spandsp/g168models.h \ spandsp/g711.h \ spandsp/g722.h \ spandsp/g726.h \ spandsp/gsm0610.h \ spandsp/hdlc.h \ spandsp/ima_adpcm.h \ spandsp/logging.h \ spandsp/lpc10.h \ spandsp/modem_echo.h \ spandsp/modem_connect_tones.h \ spandsp/noise.h \ spandsp/oki_adpcm.h \ spandsp/playout.h \ spandsp/plc.h \ spandsp/power_meter.h \ spandsp/queue.h \ spandsp/schedule.h \ spandsp/sig_tone.h \ spandsp/silence_gen.h \ spandsp/super_tone_rx.h \ spandsp/super_tone_tx.h \ spandsp/t4.h \ spandsp/t30.h \ spandsp/t30_api.h \ spandsp/t30_fcf.h \ spandsp/t30_logging.h \ spandsp/t31.h \ spandsp/t35.h \ spandsp/t38_core.h \ spandsp/t38_gateway.h \ spandsp/t38_terminal.h \ spandsp/telephony.h \ spandsp/time_scale.h \ spandsp/timing.h \ spandsp/tone_detect.h \ spandsp/tone_generate.h \ spandsp/v17rx.h \ spandsp/v17tx.h \ spandsp/v22bis.h \ spandsp/v27ter_rx.h \ spandsp/v27ter_tx.h \ spandsp/v29rx.h \ spandsp/v29tx.h \ spandsp/v42.h \ spandsp/v42bis.h \ spandsp/v8.h \ spandsp/vector_float.h \ spandsp/vector_int.h \ spandsp/version.h nodist_include_HEADERS = spandsp.h noinst_HEADERS = faxfont.h \ filter_tools.h \ gsm0610_local.h \ lpc10_encdecs.h \ t30_local.h \ t4_states.h \ v17rx_constellation_maps.h \ v17tx_constellation_maps.h \ v29tx_constellation_maps.h noinst_PROGRAMS = make_at_dictionary \ make_modem_filter make_modem_filter_SOURCES = make_modem_filter.c \ filter_tools.c # We need to run make_at_dictionary, so it generates the # at_interpreter_dictionary.h file at_interpreter.$(OBJEXT): at_interpreter_dictionary.h at_interpreter.lo: at_interpreter_dictionary.h at_interpreter_dictionary.h: make_at_dictionary$(EXEEXT) ./make_at_dictionary$(EXEEXT) >at_interpreter_dictionary.h v17rx.$(OBJEXT): v17rx_fixed_rrc.h v17rx_floating_rrc.h v17rx.lo: v17rx_fixed_rrc.h v17rx_floating_rrc.h v17rx_fixed_rrc.h: make_modem_filter$(EXEEXT) ./make_modem_filter$(EXEEXT) -m V.17 -i -r >v17rx_fixed_rrc.h v17rx_floating_rrc.h: make_modem_filter$(EXEEXT) ./make_modem_filter$(EXEEXT) -m V.17 -r >v17rx_floating_rrc.h v17tx.$(OBJEXT): v17tx_fixed_rrc.h v17tx_floating_rrc.h v17tx.lo: v17tx_fixed_rrc.h v17tx_floating_rrc.h v17tx_fixed_rrc.h: make_modem_filter$(EXEEXT) ./make_modem_filter$(EXEEXT) -m V.17 -i -t >v17tx_fixed_rrc.h v17tx_floating_rrc.h: make_modem_filter$(EXEEXT) ./make_modem_filter$(EXEEXT) -m V.17 -t >v17tx_floating_rrc.h v22bis_rx.$(OBJEXT): v22bis_rx_1200_fixed_rrc.h \ v22bis_rx_2400_fixed_rrc.h \ v22bis_rx_1200_floating_rrc.h \ v22bis_rx_2400_floating_rrc.h v22bis_rx.lo: v22bis_rx_1200_fixed_rrc.h \ v22bis_rx_2400_fixed_rrc.h \ v22bis_rx_1200_floating_rrc.h \ v22bis_rx_2400_floating_rrc.h v22bis_rx_1200_fixed_rrc.h: make_modem_filter$(EXEEXT) ./make_modem_filter$(EXEEXT) -m V.22bis1200 -i -r >v22bis_rx_1200_fixed_rrc.h v22bis_rx_2400_fixed_rrc.h: make_modem_filter$(EXEEXT) ./make_modem_filter$(EXEEXT) -m V.22bis2400 -i -r >v22bis_rx_2400_fixed_rrc.h v22bis_rx_1200_floating_rrc.h: make_modem_filter$(EXEEXT) ./make_modem_filter$(EXEEXT) -m V.22bis1200 -r >v22bis_rx_1200_floating_rrc.h v22bis_rx_2400_floating_rrc.h: make_modem_filter$(EXEEXT) ./make_modem_filter$(EXEEXT) -m V.22bis2400 -r >v22bis_rx_2400_floating_rrc.h v22bis_tx.$(OBJEXT): v22bis_tx_fixed_rrc.h v22bis_tx_floating_rrc.h v22bis_tx.lo: v22bis_tx_fixed_rrc.h v22bis_tx_floating_rrc.h v22bis_tx_fixed_rrc.h: make_modem_filter$(EXEEXT) ./make_modem_filter$(EXEEXT) -m V.22bis -i -t >v22bis_tx_fixed_rrc.h v22bis_tx_floating_rrc.h: make_modem_filter$(EXEEXT) ./make_modem_filter$(EXEEXT) -m V.22bis -t >v22bis_tx_floating_rrc.h v27ter_rx_.$(OBJEXT): v27ter_rx_2400_fixed_rrc.h \ v27ter_rx_4800_fixed_rrc.h \ v27ter_rx_2400_floating_rrc.h \ v27ter_rx_4800_floating_rrc.h v27ter_rx.lo: v27ter_rx_2400_fixed_rrc.h \ v27ter_rx_4800_fixed_rrc.h \ v27ter_rx_2400_floating_rrc.h \ v27ter_rx_4800_floating_rrc.h v27ter_rx_2400_fixed_rrc.h: make_modem_filter$(EXEEXT) ./make_modem_filter$(EXEEXT) -m V.27ter2400 -i -r >v27ter_rx_2400_fixed_rrc.h v27ter_rx_4800_fixed_rrc.h: make_modem_filter$(EXEEXT) ./make_modem_filter$(EXEEXT) -m V.27ter4800 -i -r >v27ter_rx_4800_fixed_rrc.h v27ter_rx_2400_floating_rrc.h: make_modem_filter$(EXEEXT) ./make_modem_filter$(EXEEXT) -m V.27ter2400 -r >v27ter_rx_2400_floating_rrc.h v27ter_rx_4800_floating_rrc.h: make_modem_filter$(EXEEXT) ./make_modem_filter$(EXEEXT) -m V.27ter4800 -r >v27ter_rx_4800_floating_rrc.h v27ter_tx_.$(OBJEXT): v27ter_tx_2400_fixed_rrc.h \ v27ter_tx_4800_fixed_rrc.h \ v27ter_tx_2400_floating_rrc.h \ v27ter_tx_4800_floating_rrc.h v27ter_tx.lo: v27ter_tx_2400_fixed_rrc.h \ v27ter_tx_4800_fixed_rrc.h \ v27ter_tx_2400_floating_rrc.h \ v27ter_tx_4800_floating_rrc.h v27ter_tx_2400_fixed_rrc.h: make_modem_filter$(EXEEXT) ./make_modem_filter$(EXEEXT) -m V.27ter2400 -i -t >v27ter_tx_2400_fixed_rrc.h v27ter_tx_4800_fixed_rrc.h: make_modem_filter$(EXEEXT) ./make_modem_filter$(EXEEXT) -m V.27ter4800 -i -t >v27ter_tx_4800_fixed_rrc.h v27ter_tx_2400_floating_rrc.h: make_modem_filter$(EXEEXT) ./make_modem_filter$(EXEEXT) -m V.27ter2400 -t >v27ter_tx_2400_floating_rrc.h v27ter_tx_4800_floating_rrc.h: make_modem_filter$(EXEEXT) ./make_modem_filter$(EXEEXT) -m V.27ter4800 -t >v27ter_tx_4800_floating_rrc.h v29rx.$(OBJEXT): v29rx_fixed_rrc.h v29rx_floating_rrc.h v29rx.lo: v29rx_fixed_rrc.h v29rx_floating_rrc.h v29rx_fixed_rrc.h: make_modem_filter$(EXEEXT) ./make_modem_filter$(EXEEXT) -m V.29 -i -r >v29rx_fixed_rrc.h v29rx_floating_rrc.h: make_modem_filter$(EXEEXT) ./make_modem_filter$(EXEEXT) -m V.29 -r >v29rx_floating_rrc.h v29tx.$(OBJEXT): v29tx_fixed_rrc.h v29tx_floating_rrc.h v29tx.lo: v29tx_fixed_rrc.h v29tx_floating_rrc.h v29tx_fixed_rrc.h: make_modem_filter$(EXEEXT) ./make_modem_filter$(EXEEXT) -m V.29 -i -t >v29tx_fixed_rrc.h v29tx_floating_rrc.h: make_modem_filter$(EXEEXT) ./make_modem_filter$(EXEEXT) -m V.29 -t >v29tx_floating_rrc.h DSP = libspandsp.dsp VCPROJ = libspandsp.vcproj WIN32SOURCES = $(libspandsp_la_SOURCES) msvc/gettimeofday.c WIN32HEADERS = $(nobase_include_HEADERS) spandsp.h DSPOUT = | awk '{printf("%s\r\n", $$0)}' >> $(DSP) VCPROJOUT = | awk '{printf("%s\r\n", $$0)}' >> $(VCPROJ) $(DSP): msvc/msvcproj.head msvc/msvcproj.foot Makefile.am echo "creating $(DSP)" @(cp $(srcdir)/msvc/msvcproj.head $(DSP); \ echo "# Begin Group \"Source Files\"" $(DSPOUT); \ for file in $(WIN32SOURCES); do \ echo "# Begin Source File" $(DSPOUT); \ echo "" $(DSPOUT); \ echo "SOURCE=.\\"$$file $(DSPOUT); \ echo "# End Source File" $(DSPOUT); \ done; \ echo "# End Group" $(DSPOUT); \ echo "# Begin Group \"Header Files\"" $(DSPOUT); \ for file in $(WIN32HEADERS); do \ echo "# Begin Source File" $(DSPOUT); \ echo "" $(DSPOUT); \ echo "SOURCE=.\\"$$file $(DSPOUT); \ echo "# End Source File" $(DSPOUT); \ done; \ echo "# End Group" $(DSPOUT); \ cat $(srcdir)/msvc/msvcproj.foot $(DSPOUT) ) $(VCPROJ): msvc/vc8proj.head msvc/vc8proj.foot Makefile.am echo "creating $(VCPROJ)" @(cp $(srcdir)/msvc/vc8proj.head $(VCPROJ); \ for file in $(WIN32SOURCES); do \ echo "" $(VCPROJOUT); \ done; \ echo "
" $(VCPROJOUT); \ for file in $(WIN32HEADERS); do \ echo "" $(VCPROJOUT); \ done; \ cat $(srcdir)/msvc/vc8proj.foot $(VCPROJOUT) ) spandsp/version.h: NOWDATE=`date --utc +"%Y%m%d"` ; \ NOWTIME=`date --utc +"%H%M%S"` ; \ sed 's/$$SPANDSP_RELEASE_DATE/'$$NOWDATE'/;s/$$SPANDSP_RELEASE_TIME/'$$NOWTIME'/' \ spandsp/version.h dist-hook: NOWDATE=`date --utc +"%Y%m%d"` ; \ NOWTIME=`date --utc +"%H%M%S"` ; \ sed 's/$$SPANDSP_RELEASE_DATE/'$$NOWDATE'/;s/$$SPANDSP_RELEASE_TIME/'$$NOWTIME'/' \ spandsp/version.h iaxmodem-1.2.0/lib/spandsp/src/make_modem_filter.c0000644000175000017500000003031211150047205021461 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * make_modem_filter.c - Create coefficient sets for pulse shaping * various modem rx and tx signals. * * Written by Steve Underwood * * Copyright (C) 2008 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2, as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: make_modem_filter.c,v 1.11 2008/07/02 14:48:25 steveu Exp $ */ #if defined(HAVE_CONFIG_H) #include "config.h" #endif #include #include #include #include "floating_fudge.h" #if defined(HAVE_TGMATH_H) #include #endif #if defined(HAVE_MATH_H) #include #endif #include #include #include #include #include "spandsp/telephony.h" #include "spandsp/complex.h" #include "filter_tools.h" #define FALSE 0 #define TRUE (!FALSE) //#define SAMPLE_RATE 8000.0 #define MAX_COEFFS_PER_FILTER 128 #define MAX_COEFF_SETS 384 static void make_tx_filter(int coeff_sets, int coeffs_per_filter, double carrier, double baud_rate, double excess_bandwidth, int fixed_point, const char *tag) { int i; int j; int x; int total_coeffs; double alpha; double beta; double gain; double scaling; double peak; double coeffs[MAX_COEFF_SETS*MAX_COEFFS_PER_FILTER + 1]; total_coeffs = coeff_sets*coeffs_per_filter + 1; alpha = baud_rate/(2.0*(double) (coeff_sets*baud_rate)); beta = excess_bandwidth; compute_raised_cosine_filter(coeffs, total_coeffs, TRUE, FALSE, alpha, beta); /* Find the DC gain of the filter, and adjust the filter to unity gain. */ gain = 0.0; for (i = coeff_sets/2; i < total_coeffs; i += coeff_sets) gain += coeffs[i]; /* Normalise the gain to 1.0 */ for (i = 0; i < total_coeffs; i++) coeffs[i] /= gain; gain = 1.0; if (fixed_point) { peak = -1.0; for (i = 0; i < total_coeffs; i++) { if (fabs(coeffs[i]) > peak) peak = fabs(coeffs[i]); } scaling = 32767.0; if (peak >= 1.0) { scaling /= peak; gain = 1.0/peak; } for (i = 0; i < total_coeffs; i++) coeffs[i] *= scaling; } /* Churn out the data as a C source code header file, which can be directly included by the modem code. */ printf("#define TX_PULSESHAPER%s_GAIN %ff\n", tag, gain); printf("#define TX_PULSESHAPER%s_COEFF_SETS %d\n", tag, coeff_sets); printf("static const %s tx_pulseshaper%s[TX_PULSESHAPER%s_COEFF_SETS][%d] =\n", (fixed_point) ? "int16_t" : "float", tag, tag, coeffs_per_filter); printf("{\n"); for (j = 0; j < coeff_sets; j++) { x = j; printf(" {\n"); if (fixed_point) printf(" %8d, /* Filter %d */\n", (int) coeffs[x], j); else printf(" %15.10ff, /* Filter %d */\n", coeffs[x], j); for (i = 1; i < coeffs_per_filter - 1; i++) { x = i*coeff_sets + j; if (fixed_point) printf(" %8d,\n", (int) coeffs[x]); else printf(" %15.10ff,\n", coeffs[x]); } x = i*coeff_sets + j; if (fixed_point) printf(" %8d\n", (int) coeffs[x]); else printf(" %15.10ff\n", coeffs[x]); if (j < coeff_sets - 1) printf(" },\n"); else printf(" }\n"); } printf("};\n"); } /*- End of function --------------------------------------------------------*/ static void make_rx_filter(int coeff_sets, int coeffs_per_filter, double carrier, double baud_rate, double excess_bandwidth, int fixed_point, const char *tag) { int i; int j; int m; int x; int total_coeffs; double alpha; double beta; double gain; double peak; double coeffs[MAX_COEFF_SETS*MAX_COEFFS_PER_FILTER + 1]; complex_t co[MAX_COEFFS_PER_FILTER]; total_coeffs = coeff_sets*coeffs_per_filter + 1; alpha = baud_rate/(2.0*(double) (coeff_sets*SAMPLE_RATE)); beta = excess_bandwidth; carrier *= 2.0*3.1415926535/SAMPLE_RATE; compute_raised_cosine_filter(coeffs, total_coeffs, TRUE, FALSE, alpha, beta); /* Find the DC gain of the filter, and adjust the filter to unity gain. */ gain = 0.0; for (i = coeff_sets/2; i < total_coeffs; i += coeff_sets) gain += coeffs[i]; /* Normalise the gain to 1.0 */ for (i = 0; i < total_coeffs; i++) coeffs[i] /= gain; gain = 1.0; if (fixed_point) { peak = -1.0; for (i = 0; i < total_coeffs; i++) { if (fabs(coeffs[i]) > peak) peak = fabs(coeffs[i]); } gain = 32767.0; if (peak >= 1.0) gain /= peak; for (i = 0; i < total_coeffs; i++) coeffs[i] *= gain; } /* Churn out the data as a C source code header file, which can be directly included by the modem code. */ printf("#define RX_PULSESHAPER%s_GAIN %ff\n", tag, gain); printf("#define RX_PULSESHAPER%s_COEFF_SETS %d\n", tag, coeff_sets); printf("static const %s rx_pulseshaper%s[RX_PULSESHAPER%s_COEFF_SETS][%d] =\n", (fixed_point) ? "complexi16_t" : "complexf_t", tag, tag, coeffs_per_filter); printf("{\n"); for (j = 0; j < coeff_sets; j++) { /* Complex modulate the filter, to make it a complex pulse shaping bandpass filter centred at the nominal carrier frequency. Use the same phase for all the coefficient sets. This means the modem can step the carrier in whole samples, and not worry about the fractional sample shift caused by selecting amongst the various coefficient sets. */ for (i = 0; i < coeffs_per_filter; i++) { m = i - (coeffs_per_filter >> 1); x = i*coeff_sets + j; co[i].re = coeffs[x]*cos(carrier*m); co[i].im = coeffs[x]*sin(carrier*m); } printf(" {\n"); if (fixed_point) printf(" {%8d, %8d}, /* Filter %d */\n", (int) co[i].re, (int) co[i].im, j); else printf(" {%15.10ff, %15.10ff}, /* Filter %d */\n", co[0].re, co[0].im, j); for (i = 1; i < coeffs_per_filter - 1; i++) { if (fixed_point) printf(" {%8d, %8d},\n", (int) co[i].re, (int) co[i].im); else printf(" {%15.10ff, %15.10ff},\n", co[i].re, co[i].im); } if (fixed_point) printf(" {%8d, %8d}\n", (int) co[i].re, (int) co[i].im); else printf(" {%15.10ff, %15.10ff}\n", co[i].re, co[i].im); if (j < coeff_sets - 1) printf(" },\n"); else printf(" }\n"); } printf("};\n"); } /*- End of function --------------------------------------------------------*/ static void usage(void) { fprintf(stderr, "Usage: make_modem_rx_filter -m [-i] [-r] [-t]\n"); } /*- End of function --------------------------------------------------------*/ int main(int argc, char **argv) { int rx_coeff_sets; int rx_coeffs_per_filter; int tx_coeff_sets; int tx_coeffs_per_filter; int opt; int transmit_modem; int fixed_point; double carrier; double baud_rate; double rx_excess_bandwidth; double tx_excess_bandwidth; const char *tag; const char *modem; fixed_point = FALSE; transmit_modem = FALSE; modem = ""; while ((opt = getopt(argc, argv, "im:rt")) != -1) { switch (opt) { case 'i': fixed_point = TRUE; break; case 'm': modem = optarg; break; case 'r': transmit_modem = FALSE; break; case 't': transmit_modem = TRUE; break; default: usage(); exit(2); break; } } if (strcmp(modem, "V.17") == 0) { rx_coeff_sets = 192; rx_coeffs_per_filter = 27; rx_excess_bandwidth = 0.5; tx_coeff_sets = 10; tx_coeffs_per_filter = 9; tx_excess_bandwidth = 0.25; carrier = 1800.0; baud_rate = 2400.0; tag = ""; } else if (strcmp(modem, "V.22bis") == 0) { /* This is only intended to apply to transmit. */ rx_coeff_sets = 12; rx_coeffs_per_filter = 37; rx_excess_bandwidth = 0.75; tx_coeff_sets = 40; tx_coeffs_per_filter = 9; tx_excess_bandwidth = 0.75; carrier = 1200.0; baud_rate = 600.0; tag = ""; } else if (strcmp(modem, "V.22bis1200") == 0) { /* This is only intended to apply to receive. */ rx_coeff_sets = 12; rx_coeffs_per_filter = 37; rx_excess_bandwidth = 0.75; tx_coeff_sets = 40; tx_coeffs_per_filter = 9; tx_excess_bandwidth = 0.75; carrier = 1200.0; baud_rate = 600.0; tag = "_1200"; } else if (strcmp(modem, "V.22bis2400") == 0) { /* This is only intended to apply to receive. */ rx_coeff_sets = 12; rx_coeffs_per_filter = 37; rx_excess_bandwidth = 0.75; tx_coeff_sets = 40; tx_coeffs_per_filter = 9; tx_excess_bandwidth = 0.75; carrier = 2400.0; baud_rate = 600.0; tag = "_2400"; } else if (strcmp(modem, "V.27ter4800") == 0) { rx_coeff_sets = 8; rx_coeffs_per_filter = 27; rx_excess_bandwidth = 0.5; tx_coeff_sets = 5; tx_coeffs_per_filter = 9; tx_excess_bandwidth = 0.5; carrier = 1800.0; baud_rate = 1600.0; tag = "_4800"; } else if (strcmp(modem, "V.27ter2400") == 0) { rx_coeff_sets = 12; rx_coeffs_per_filter = 27; rx_excess_bandwidth = 0.5; tx_coeff_sets = 20; tx_coeffs_per_filter = 9; tx_excess_bandwidth = 0.5; carrier = 1800.0; baud_rate = 1200.0; tag = "_2400"; } else if (strcmp(modem, "V.29") == 0) { rx_coeff_sets = 48; rx_coeffs_per_filter = 27; rx_excess_bandwidth = 0.5; tx_coeff_sets = 10; tx_coeffs_per_filter = 9; tx_excess_bandwidth = 0.25; carrier = 1700.0; baud_rate = 2400.0; tag = ""; } else { usage(); exit(2); } if (transmit_modem) { make_tx_filter(tx_coeff_sets, tx_coeffs_per_filter, carrier, baud_rate, tx_excess_bandwidth, fixed_point, tag); } else { make_rx_filter(rx_coeff_sets, rx_coeffs_per_filter, carrier, baud_rate, rx_excess_bandwidth, fixed_point, tag); } return 0; } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/dtmf.c0000644000175000017500000004435511150047205016764 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * dtmf.c - DTMF generation and detection. * * Written by Steve Underwood * * Copyright (C) 2001-2003, 2005, 2006 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: dtmf.c,v 1.43 2008/07/02 14:48:25 steveu Exp $ */ /*! \file dtmf.h */ #if defined(HAVE_CONFIG_H) #include "config.h" #endif #include #include #include "floating_fudge.h" #if defined(HAVE_TGMATH_H) #include #endif #if defined(HAVE_MATH_H) #include #endif #include #include #include #include #include "spandsp/telephony.h" #include "spandsp/queue.h" #include "spandsp/complex.h" #include "spandsp/dds.h" #include "spandsp/tone_detect.h" #include "spandsp/tone_generate.h" #include "spandsp/super_tone_rx.h" #include "spandsp/dtmf.h" #define DEFAULT_DTMF_TX_LEVEL -10 #define DEFAULT_DTMF_TX_ON_TIME 50 #define DEFAULT_DTMF_TX_OFF_TIME 55 #if defined(SPANDSP_USE_FIXED_POINT) #define DTMF_THRESHOLD 10438 /* -42dBm0 */ #define DTMF_NORMAL_TWIST 6.309f /* 8dB */ #define DTMF_REVERSE_TWIST 2.512f /* 4dB */ #define DTMF_RELATIVE_PEAK_ROW 6.309f /* 8dB */ #define DTMF_RELATIVE_PEAK_COL 6.309f /* 8dB */ #define DTMF_TO_TOTAL_ENERGY 83.868f /* -0.85dB */ #define DTMF_POWER_OFFSET 68.251f /* 10*log(256.0*256.0*DTMF_SAMPLES_PER_BLOCK) */ #define DTMF_SAMPLES_PER_BLOCK 102 #else #define DTMF_THRESHOLD 171032462.0f /* -42dBm0 [((DTMF_SAMPLES_PER_BLOCK*32768.0/1.4142)*10^((-42 - DBM0_MAX_SINE_POWER)/20.0))^2 => 171032462.0] */ #define DTMF_NORMAL_TWIST 6.309f /* 8dB [10^(8/10) => 6.309] */ #define DTMF_REVERSE_TWIST 2.512f /* 4dB */ #define DTMF_RELATIVE_PEAK_ROW 6.309f /* 8dB */ #define DTMF_RELATIVE_PEAK_COL 6.309f /* 8dB */ #define DTMF_TO_TOTAL_ENERGY 83.868f /* -0.85dB [DTMF_SAMPLES_PER_BLOCK*10^(-0.85/10.0)] */ #define DTMF_POWER_OFFSET 110.395f /* 10*log(32768.0*32768.0*DTMF_SAMPLES_PER_BLOCK) */ #define DTMF_SAMPLES_PER_BLOCK 102 #endif static const float dtmf_row[] = { 697.0f, 770.0f, 852.0f, 941.0f }; static const float dtmf_col[] = { 1209.0f, 1336.0f, 1477.0f, 1633.0f }; static const char dtmf_positions[] = "123A" "456B" "789C" "*0#D"; static goertzel_descriptor_t dtmf_detect_row[4]; static goertzel_descriptor_t dtmf_detect_col[4]; static int dtmf_tx_inited = FALSE; static tone_gen_descriptor_t dtmf_digit_tones[16]; int dtmf_rx(dtmf_rx_state_t *s, const int16_t amp[], int samples) { #if defined(SPANDSP_USE_FIXED_POINT) int32_t row_energy[4]; int32_t col_energy[4]; int16_t xamp; float famp; #else float row_energy[4]; float col_energy[4]; float xamp; float famp; #endif float v1; int i; int j; int sample; int best_row; int best_col; int limit; uint8_t hit; hit = 0; for (sample = 0; sample < samples; sample = limit) { /* The block length is optimised to meet the DTMF specs. */ if ((samples - sample) >= (DTMF_SAMPLES_PER_BLOCK - s->current_sample)) limit = sample + (DTMF_SAMPLES_PER_BLOCK - s->current_sample); else limit = samples; /* The following unrolled loop takes only 35% (rough estimate) of the time of a rolled loop on the machine on which it was developed */ for (j = sample; j < limit; j++) { xamp = amp[j]; if (s->filter_dialtone) { famp = xamp; /* Sharp notches applied at 350Hz and 440Hz - the two common dialtone frequencies. These are rather high Q, to achieve the required narrowness, without using lots of sections. */ v1 = 0.98356f*famp + 1.8954426f*s->z350[0] - 0.9691396f*s->z350[1]; famp = v1 - 1.9251480f*s->z350[0] + s->z350[1]; s->z350[1] = s->z350[0]; s->z350[0] = v1; v1 = 0.98456f*famp + 1.8529543f*s->z440[0] - 0.9691396f*s->z440[1]; famp = v1 - 1.8819938f*s->z440[0] + s->z440[1]; s->z440[1] = s->z440[0]; s->z440[0] = v1; xamp = famp; } xamp = goertzel_preadjust_amp(xamp); #if defined(SPANDSP_USE_FIXED_POINT) s->energy += ((int32_t) xamp*xamp); #else s->energy += xamp*xamp; #endif goertzel_samplex(&s->row_out[0], xamp); goertzel_samplex(&s->col_out[0], xamp); goertzel_samplex(&s->row_out[1], xamp); goertzel_samplex(&s->col_out[1], xamp); goertzel_samplex(&s->row_out[2], xamp); goertzel_samplex(&s->col_out[2], xamp); goertzel_samplex(&s->row_out[3], xamp); goertzel_samplex(&s->col_out[3], xamp); } s->current_sample += (limit - sample); if (s->current_sample < DTMF_SAMPLES_PER_BLOCK) continue; /* We are at the end of a DTMF detection block */ /* Find the peak row and the peak column */ row_energy[0] = goertzel_result(&s->row_out[0]); best_row = 0; col_energy[0] = goertzel_result(&s->col_out[0]); best_col = 0; for (i = 1; i < 4; i++) { row_energy[i] = goertzel_result(&s->row_out[i]); if (row_energy[i] > row_energy[best_row]) best_row = i; col_energy[i] = goertzel_result(&s->col_out[i]); if (col_energy[i] > col_energy[best_col]) best_col = i; } hit = 0; /* Basic signal level test and the twist test */ if (row_energy[best_row] >= s->threshold && col_energy[best_col] >= s->threshold && col_energy[best_col] < row_energy[best_row]*s->reverse_twist && col_energy[best_col]*s->normal_twist > row_energy[best_row]) { /* Relative peak test ... */ for (i = 0; i < 4; i++) { if ((i != best_col && col_energy[i]*DTMF_RELATIVE_PEAK_COL > col_energy[best_col]) || (i != best_row && row_energy[i]*DTMF_RELATIVE_PEAK_ROW > row_energy[best_row])) { break; } } /* ... and fraction of total energy test */ if (i >= 4 && (row_energy[best_row] + col_energy[best_col]) > DTMF_TO_TOTAL_ENERGY*s->energy) { /* Got a hit */ hit = dtmf_positions[(best_row << 2) + best_col]; } } /* The logic in the next test should ensure the following for different successive hit patterns: -----ABB = start of digit B. ----B-BB = start of digit B ----A-BB = start of digit B BBBBBABB = still in digit B. BBBBBB-- = end of digit B BBBBBBC- = end of digit B BBBBACBB = B ends, then B starts again. BBBBBBCC = B ends, then C starts. BBBBBCDD = B ends, then D starts. This can work with: - Back to back differing digits. Back-to-back digits should not happen. The spec. says there should be a gap between digits. However, many real phones do not impose a gap, and rolling across the keypad can produce little or no gap. - It tolerates nasty phones that give a very wobbly start to a digit. - VoIP can give sample slips. The phase jumps that produces will cause the block it is in to give no detection. This logic will ride over a single missed block, and not falsely declare a second digit. If the hiccup happens in the wrong place on a minimum length digit, however we would still fail to detect that digit. Could anything be done to deal with that? Packet loss is clearly a no-go zone. Note this is only relevant to VoIP using A-law, u-law or similar. Low bit rate codecs scramble DTMF too much for it to be recognised, and often slip in units larger than a sample. */ if (hit != s->in_digit) { if (s->last_hit != s->in_digit) { /* We have two successive indications that something has changed. */ /* To declare digit on, the hits must agree. Otherwise we declare tone off. */ hit = (hit && hit == s->last_hit) ? hit : 0; if (s->realtime_callback) { /* Avoid reporting multiple no digit conditions on flaky hits */ if (s->in_digit || hit) { i = (s->in_digit && !hit) ? -99 : lrintf(log10f(s->energy)*10.0f - DTMF_POWER_OFFSET + DBM0_MAX_POWER); s->realtime_callback(s->realtime_callback_data, hit, i, 0); } } else { if (hit) { if (s->current_digits < MAX_DTMF_DIGITS) { s->digits[s->current_digits++] = (char) hit; s->digits[s->current_digits] = '\0'; if (s->digits_callback) { s->digits_callback(s->digits_callback_data, s->digits, s->current_digits); s->current_digits = 0; } } else { s->lost_digits++; } } } s->in_digit = hit; } } s->last_hit = hit; #if defined(SPANDSP_USE_FIXED_POINT) s->energy = 0; #else s->energy = 0.0f; #endif s->current_sample = 0; } if (s->current_digits && s->digits_callback) { s->digits_callback(s->digits_callback_data, s->digits, s->current_digits); s->digits[0] = '\0'; s->current_digits = 0; } return 0; } /*- End of function --------------------------------------------------------*/ int dtmf_rx_status(dtmf_rx_state_t *s) { if (s->in_digit) return s->in_digit; if (s->last_hit) return 'x'; return 0; } /*- End of function --------------------------------------------------------*/ size_t dtmf_rx_get(dtmf_rx_state_t *s, char *buf, int max) { if (max > s->current_digits) max = s->current_digits; if (max > 0) { memcpy(buf, s->digits, max); memmove(s->digits, s->digits + max, s->current_digits - max); s->current_digits -= max; } buf[max] = '\0'; return max; } /*- End of function --------------------------------------------------------*/ void dtmf_rx_set_realtime_callback(dtmf_rx_state_t *s, tone_report_func_t callback, void *user_data) { s->realtime_callback = callback; s->realtime_callback_data = user_data; } /*- End of function --------------------------------------------------------*/ void dtmf_rx_parms(dtmf_rx_state_t *s, int filter_dialtone, int twist, int reverse_twist, int threshold) { float x; if (filter_dialtone >= 0) { s->z350[0] = 0.0f; s->z350[1] = 0.0f; s->z440[0] = 0.0f; s->z440[1] = 0.0f; s->filter_dialtone = filter_dialtone; } if (twist >= 0) s->normal_twist = powf(10.0f, twist/10.0f); if (reverse_twist >= 0) s->reverse_twist = powf(10.0f, reverse_twist/10.0f); if (threshold > -99) { x = (DTMF_SAMPLES_PER_BLOCK*32768.0f/1.4142f)*powf(10.0f, (threshold - DBM0_MAX_SINE_POWER)/20.0f); s->threshold = x*x; } } /*- End of function --------------------------------------------------------*/ dtmf_rx_state_t *dtmf_rx_init(dtmf_rx_state_t *s, digits_rx_callback_t callback, void *user_data) { int i; static int initialised = FALSE; if (s == NULL) { if ((s = (dtmf_rx_state_t *) malloc(sizeof (*s))) == NULL) return NULL; } s->digits_callback = callback; s->digits_callback_data = user_data; s->realtime_callback = NULL; s->realtime_callback_data = NULL; s->filter_dialtone = FALSE; s->normal_twist = DTMF_NORMAL_TWIST; s->reverse_twist = DTMF_REVERSE_TWIST; s->threshold = DTMF_THRESHOLD; s->in_digit = 0; s->last_hit = 0; if (!initialised) { for (i = 0; i < 4; i++) { make_goertzel_descriptor(&dtmf_detect_row[i], dtmf_row[i], DTMF_SAMPLES_PER_BLOCK); make_goertzel_descriptor(&dtmf_detect_col[i], dtmf_col[i], DTMF_SAMPLES_PER_BLOCK); } initialised = TRUE; } for (i = 0; i < 4; i++) { goertzel_init(&s->row_out[i], &dtmf_detect_row[i]); goertzel_init(&s->col_out[i], &dtmf_detect_col[i]); } #if defined(SPANDSP_USE_FIXED_POINT) s->energy = 0; #else s->energy = 0.0f; #endif s->current_sample = 0; s->lost_digits = 0; s->current_digits = 0; s->digits[0] = '\0'; return s; } /*- End of function --------------------------------------------------------*/ int dtmf_rx_free(dtmf_rx_state_t *s) { free(s); return 0; } /*- End of function --------------------------------------------------------*/ static void dtmf_tx_initialise(void) { int row; int col; if (dtmf_tx_inited) return; for (row = 0; row < 4; row++) { for (col = 0; col < 4; col++) { make_tone_gen_descriptor(&dtmf_digit_tones[row*4 + col], (int) dtmf_row[row], DEFAULT_DTMF_TX_LEVEL, (int) dtmf_col[col], DEFAULT_DTMF_TX_LEVEL, DEFAULT_DTMF_TX_ON_TIME, DEFAULT_DTMF_TX_OFF_TIME, 0, 0, FALSE); } } dtmf_tx_inited = TRUE; } /*- End of function --------------------------------------------------------*/ int dtmf_tx(dtmf_tx_state_t *s, int16_t amp[], int max_samples) { int len; const char *cp; int digit; len = 0; if (s->tones.current_section >= 0) { /* Deal with the fragment left over from last time */ len = tone_gen(&(s->tones), amp, max_samples); } while (len < max_samples && (digit = queue_read_byte(&s->queue.queue)) >= 0) { /* Step to the next digit */ if (digit == 0) continue; if ((cp = strchr(dtmf_positions, digit)) == NULL) continue; tone_gen_init(&(s->tones), &dtmf_digit_tones[cp - dtmf_positions]); s->tones.tone[0].gain = s->low_level; s->tones.tone[1].gain = s->high_level; s->tones.duration[0] = s->on_time; s->tones.duration[1] = s->off_time; len += tone_gen(&(s->tones), amp + len, max_samples - len); } return len; } /*- End of function --------------------------------------------------------*/ size_t dtmf_tx_put(dtmf_tx_state_t *s, const char *digits, int len) { size_t space; /* This returns the number of characters that would not fit in the buffer. The buffer will only be loaded if the whole string of digits will fit, in which case zero is returned. */ if (len < 0) { if ((len = strlen(digits)) == 0) return 0; } if ((space = queue_free_space(&s->queue.queue)) < len) return len - space; if (queue_write(&s->queue.queue, (const uint8_t *) digits, len) >= 0) return 0; return -1; } /*- End of function --------------------------------------------------------*/ void dtmf_tx_set_level(dtmf_tx_state_t *s, int level, int twist) { s->low_level = dds_scaling_dbm0f((float) level); s->high_level = dds_scaling_dbm0f((float) (level + twist)); } /*- End of function --------------------------------------------------------*/ void dtmf_tx_set_timing(dtmf_tx_state_t *s, int on_time, int off_time) { s->on_time = ((on_time >= 0) ? on_time : DEFAULT_DTMF_TX_ON_TIME)*SAMPLE_RATE/1000; s->off_time = ((off_time >= 0) ? off_time : DEFAULT_DTMF_TX_OFF_TIME)*SAMPLE_RATE/1000; } /*- End of function --------------------------------------------------------*/ dtmf_tx_state_t *dtmf_tx_init(dtmf_tx_state_t *s) { if (s == NULL) { if ((s = (dtmf_tx_state_t *) malloc(sizeof (*s))) == NULL) return NULL; } if (!dtmf_tx_inited) dtmf_tx_initialise(); tone_gen_init(&(s->tones), &dtmf_digit_tones[0]); dtmf_tx_set_level(s, DEFAULT_DTMF_TX_LEVEL, 0); dtmf_tx_set_timing(s, -1, -1); queue_init(&s->queue.queue, MAX_DTMF_DIGITS, QUEUE_READ_ATOMIC | QUEUE_WRITE_ATOMIC); s->tones.current_section = -1; return s; } /*- End of function --------------------------------------------------------*/ int dtmf_tx_free(dtmf_tx_state_t *s) { free(s); return 0; } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/v29tx.c0000644000175000017500000003005511150047205017016 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * v29tx.c - ITU V.29 modem transmit part * * Written by Steve Underwood * * Copyright (C) 2003 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: v29tx.c,v 1.76 2008/07/16 14:23:47 steveu Exp $ */ /*! \file */ #if defined(HAVE_CONFIG_H) #include #endif #include #include #include #include #include "floating_fudge.h" #if defined(HAVE_TGMATH_H) #include #endif #if defined(HAVE_MATH_H) #include #endif #include "spandsp/telephony.h" #include "spandsp/logging.h" #include "spandsp/complex.h" #include "spandsp/vector_float.h" #include "spandsp/complex_vector_float.h" #include "spandsp/async.h" #include "spandsp/dds.h" #include "spandsp/power_meter.h" #include "spandsp/v29tx.h" #if defined(SPANDSP_USE_FIXED_POINT) #define SPANDSP_USE_FIXED_POINTx #endif #include "v29tx_constellation_maps.h" #if defined(SPANDSP_USE_FIXED_POINT) #include "v29tx_fixed_rrc.h" #else #include "v29tx_floating_rrc.h" #endif #define CARRIER_NOMINAL_FREQ 1700.0f /* Segments of the training sequence */ #define V29_TRAINING_SEG_TEP 0 #define V29_TRAINING_SEG_1 (V29_TRAINING_SEG_TEP + 480) #define V29_TRAINING_SEG_2 (V29_TRAINING_SEG_1 + 48) #define V29_TRAINING_SEG_3 (V29_TRAINING_SEG_2 + 128) #define V29_TRAINING_SEG_4 (V29_TRAINING_SEG_3 + 384) #define V29_TRAINING_END (V29_TRAINING_SEG_4 + 48) #define V29_TRAINING_SHUTDOWN_END (V29_TRAINING_END + 32) static int fake_get_bit(void *user_data) { return 1; } /*- End of function --------------------------------------------------------*/ static __inline__ int get_scrambled_bit(v29_tx_state_t *s) { int bit; int out_bit; if ((bit = s->current_get_bit(s->get_bit_user_data)) == PUTBIT_END_OF_DATA) { /* End of real data. Switch to the fake get_bit routine, until we have shut down completely. */ if (s->status_handler) s->status_handler(s->status_user_data, MODEM_TX_STATUS_DATA_EXHAUSTED); s->current_get_bit = fake_get_bit; s->in_training = TRUE; bit = 1; } out_bit = (bit ^ (s->scramble_reg >> 17) ^ (s->scramble_reg >> 22)) & 1; s->scramble_reg = (s->scramble_reg << 1) | out_bit; return out_bit; } /*- End of function --------------------------------------------------------*/ #if defined(SPANDSP_USE_FIXED_POINT) static __inline__ complexi16_t getbaud(v29_tx_state_t *s) #else static __inline__ complexf_t getbaud(v29_tx_state_t *s) #endif { static const int phase_steps_9600[8] = { 1, 0, 2, 3, 6, 7, 5, 4 }; static const int phase_steps_4800[4] = { 0, 2, 6, 4 }; int bits; int amp; int bit; if (s->in_training) { /* Send the training sequence */ if (++s->training_step <= V29_TRAINING_SEG_4) { if (s->training_step <= V29_TRAINING_SEG_3) { if (s->training_step <= V29_TRAINING_SEG_1) { /* Optional segment: Unmodulated carrier (talker echo protection) */ return v29_9600_constellation[0]; } if (s->training_step <= V29_TRAINING_SEG_2) { /* Segment 1: silence */ #if defined(SPANDSP_USE_FIXED_POINT) return complex_seti16(0, 0); #else return complex_setf(0.0f, 0.0f); #endif } /* Segment 2: ABAB... */ return v29_abab_constellation[(s->training_step & 1) + s->training_offset]; } /* Segment 3: CDCD... */ /* Apply the 1 + x^-6 + x^-7 training scrambler */ bit = s->training_scramble_reg & 1; s->training_scramble_reg >>= 1; s->training_scramble_reg |= (((bit ^ s->training_scramble_reg) & 1) << 6); return v29_cdcd_constellation[bit + s->training_offset]; } /* We should be in the block of test ones, or shutdown ones, if we get here. */ /* There is no graceful shutdown procedure defined for V.29. Just send some ones, to ensure we get the real data bits through, even with bad ISI. */ if (s->training_step == V29_TRAINING_END + 1) { /* Switch from the fake get_bit routine, to the user supplied real one, and we are up and running. */ s->current_get_bit = s->get_bit; s->in_training = FALSE; } if (s->training_step == V29_TRAINING_SHUTDOWN_END) { if (s->status_handler) s->status_handler(s->status_user_data, MODEM_TX_STATUS_SHUTDOWN_COMPLETE); } } /* 9600bps uses the full constellation. 7200bps uses only the first half of the full constellation. 4800bps uses the smaller constellation. */ amp = 0; /* We only use an amplitude bit at 9600bps */ if (s->bit_rate == 9600 && get_scrambled_bit(s)) amp = 8; /*endif*/ bits = get_scrambled_bit(s); bits = (bits << 1) | get_scrambled_bit(s); if (s->bit_rate == 4800) { bits = phase_steps_4800[bits]; } else { bits = (bits << 1) | get_scrambled_bit(s); bits = phase_steps_9600[bits]; } s->constellation_state = (s->constellation_state + bits) & 7; return v29_9600_constellation[amp | s->constellation_state]; } /*- End of function --------------------------------------------------------*/ int v29_tx(v29_tx_state_t *s, int16_t amp[], int len) { #if defined(SPANDSP_USE_FIXED_POINT) complexi_t x; complexi_t z; #else complexf_t x; complexf_t z; #endif int i; int sample; if (s->training_step >= V29_TRAINING_SHUTDOWN_END) { /* Once we have sent the shutdown symbols, we stop sending completely. */ return 0; } for (sample = 0; sample < len; sample++) { if ((s->baud_phase += 3) >= 10) { s->baud_phase -= 10; s->rrc_filter[s->rrc_filter_step] = s->rrc_filter[s->rrc_filter_step + V29_TX_FILTER_STEPS] = getbaud(s); if (++s->rrc_filter_step >= V29_TX_FILTER_STEPS) s->rrc_filter_step = 0; } /* Root raised cosine pulse shaping at baseband */ #if defined(SPANDSP_USE_FIXED_POINT) x = complex_seti(0, 0); for (i = 0; i < V29_TX_FILTER_STEPS; i++) { x.re += (int32_t) tx_pulseshaper[TX_PULSESHAPER_COEFF_SETS - 1 - s->baud_phase][i]*(int32_t) s->rrc_filter[i + s->rrc_filter_step].re; x.im += (int32_t) tx_pulseshaper[TX_PULSESHAPER_COEFF_SETS - 1 - s->baud_phase][i]*(int32_t) s->rrc_filter[i + s->rrc_filter_step].im; } /* Now create and modulate the carrier */ x.re >>= 4; x.im >>= 4; z = dds_complexi(&(s->carrier_phase), s->carrier_phase_rate); /* Don't bother saturating. We should never clip. */ i = (x.re*z.re - x.im*z.im) >> 15; amp[sample] = (int16_t) ((i*s->gain) >> 15); #else x = complex_setf(0.0f, 0.0f); for (i = 0; i < V29_TX_FILTER_STEPS; i++) { x.re += tx_pulseshaper[TX_PULSESHAPER_COEFF_SETS - 1 - s->baud_phase][i]*s->rrc_filter[i + s->rrc_filter_step].re; x.im += tx_pulseshaper[TX_PULSESHAPER_COEFF_SETS - 1 - s->baud_phase][i]*s->rrc_filter[i + s->rrc_filter_step].im; } /* Now create and modulate the carrier */ z = dds_complexf(&(s->carrier_phase), s->carrier_phase_rate); /* Don't bother saturating. We should never clip. */ amp[sample] = (int16_t) lrintf((x.re*z.re - x.im*z.im)*s->gain); #endif } return sample; } /*- End of function --------------------------------------------------------*/ static void set_working_gain(v29_tx_state_t *s) { #if defined(SPANDSP_USE_FIXED_POINT) switch (s->bit_rate) { case 9600: s->gain = 0.387f*s->base_gain*16.0f*32767.0f/30672.52f; break; case 7200: s->gain = 0.605f*s->base_gain*16.0f*32767.0f/30672.52f; break; case 4800: s->gain = 0.470f*s->base_gain*16.0f*32767.0f/30672.52f; break; default: break; } #else switch (s->bit_rate) { case 9600: s->gain = 0.387f*s->base_gain; break; case 7200: s->gain = 0.605f*s->base_gain; break; case 4800: s->gain = 0.470f*s->base_gain; break; default: break; } #endif } /*- End of function --------------------------------------------------------*/ void v29_tx_power(v29_tx_state_t *s, float power) { /* The constellation does not maintain constant average power as we change bit rates. We need to scale the gain we get here by a bit rate specific scaling factor each time we restart the modem. */ s->base_gain = powf(10.0f, (power - DBM0_MAX_POWER)/20.0f)*32768.0f/TX_PULSESHAPER_GAIN; set_working_gain(s); } /*- End of function --------------------------------------------------------*/ void v29_tx_set_get_bit(v29_tx_state_t *s, get_bit_func_t get_bit, void *user_data) { if (s->get_bit == s->current_get_bit) s->current_get_bit = get_bit; s->get_bit = get_bit; s->get_bit_user_data = user_data; } /*- End of function --------------------------------------------------------*/ void v29_tx_set_modem_status_handler(v29_tx_state_t *s, modem_tx_status_func_t handler, void *user_data) { s->status_handler = handler; s->status_user_data = user_data; } /*- End of function --------------------------------------------------------*/ int v29_tx_restart(v29_tx_state_t *s, int bit_rate, int tep) { span_log(&s->logging, SPAN_LOG_FLOW, "Restarting V.29\n"); s->bit_rate = bit_rate; set_working_gain(s); switch (s->bit_rate) { case 9600: s->training_offset = 0; break; case 7200: s->training_offset = 2; break; case 4800: s->training_offset = 4; break; default: return -1; } #if defined(SPANDSP_USE_FIXED_POINT) memset(s->rrc_filter, 0, sizeof(s->rrc_filter)); #else cvec_zerof(s->rrc_filter, sizeof(s->rrc_filter)/sizeof(s->rrc_filter[0])); #endif s->rrc_filter_step = 0; s->scramble_reg = 0; s->training_scramble_reg = 0x2A; s->in_training = TRUE; s->training_step = (tep) ? V29_TRAINING_SEG_TEP : V29_TRAINING_SEG_1; s->carrier_phase = 0; s->baud_phase = 0; s->constellation_state = 0; s->current_get_bit = fake_get_bit; return 0; } /*- End of function --------------------------------------------------------*/ v29_tx_state_t *v29_tx_init(v29_tx_state_t *s, int bit_rate, int tep, get_bit_func_t get_bit, void *user_data) { if (s == NULL) { if ((s = (v29_tx_state_t *) malloc(sizeof(*s))) == NULL) return NULL; } memset(s, 0, sizeof(*s)); span_log_init(&s->logging, SPAN_LOG_NONE, NULL); span_log_set_protocol(&s->logging, "V.29 TX"); s->get_bit = get_bit; s->get_bit_user_data = user_data; s->carrier_phase_rate = dds_phase_ratef(CARRIER_NOMINAL_FREQ); v29_tx_power(s, -14.0f); v29_tx_restart(s, bit_rate, tep); return s; } /*- End of function --------------------------------------------------------*/ int v29_tx_free(v29_tx_state_t *s) { free(s); return 0; } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/g722_encode.c0000644000175000017500000002606411150047205020025 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * g722_encode.c - The ITU G.722 codec, encode part. * * Written by Steve Underwood * * Copyright (C) 2005 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * Based on a single channel 64kbps only G.722 codec which is: * ***** Copyright (c) CMU 1993 ***** * Computer Science, Speech Group * Chengxiang Lu and Alex Hauptmann * * $Id: g722_encode.c,v 1.22 2008/07/02 14:48:25 steveu Exp $ */ /*! \file */ #if defined(HAVE_CONFIG_H) #include #endif #include #include #include #include "floating_fudge.h" #if defined(HAVE_TGMATH_H) #include #endif #if defined(HAVE_MATH_H) #include #endif #include "spandsp/telephony.h" #include "spandsp/dc_restore.h" #include "spandsp/g722.h" static void block4(g722_encode_state_t *s, int band, int d) { int wd1; int wd2; int wd3; int i; /* Block 4, RECONS */ s->band[band].d[0] = d; s->band[band].r[0] = saturate(s->band[band].s + d); /* Block 4, PARREC */ s->band[band].p[0] = saturate(s->band[band].sz + d); /* Block 4, UPPOL2 */ for (i = 0; i < 3; i++) s->band[band].sg[i] = s->band[band].p[i] >> 15; wd1 = saturate(s->band[band].a[1] << 2); wd2 = (s->band[band].sg[0] == s->band[band].sg[1]) ? -wd1 : wd1; if (wd2 > 32767) wd2 = 32767; wd3 = (wd2 >> 7) + ((s->band[band].sg[0] == s->band[band].sg[2]) ? 128 : -128); wd3 += (s->band[band].a[2]*32512) >> 15; if (wd3 > 12288) wd3 = 12288; else if (wd3 < -12288) wd3 = -12288; s->band[band].ap[2] = wd3; /* Block 4, UPPOL1 */ s->band[band].sg[0] = s->band[band].p[0] >> 15; s->band[band].sg[1] = s->band[band].p[1] >> 15; wd1 = (s->band[band].sg[0] == s->band[band].sg[1]) ? 192 : -192; wd2 = (s->band[band].a[1]*32640) >> 15; s->band[band].ap[1] = saturate(wd1 + wd2); wd3 = saturate(15360 - s->band[band].ap[2]); if (s->band[band].ap[1] > wd3) s->band[band].ap[1] = wd3; else if (s->band[band].ap[1] < -wd3) s->band[band].ap[1] = -wd3; /* Block 4, UPZERO */ wd1 = (d == 0) ? 0 : 128; s->band[band].sg[0] = d >> 15; for (i = 1; i < 7; i++) { s->band[band].sg[i] = s->band[band].d[i] >> 15; wd2 = (s->band[band].sg[i] == s->band[band].sg[0]) ? wd1 : -wd1; wd3 = (s->band[band].b[i]*32640) >> 15; s->band[band].bp[i] = saturate(wd2 + wd3); } /* Block 4, DELAYA */ for (i = 6; i > 0; i--) { s->band[band].d[i] = s->band[band].d[i - 1]; s->band[band].b[i] = s->band[band].bp[i]; } for (i = 2; i > 0; i--) { s->band[band].r[i] = s->band[band].r[i - 1]; s->band[band].p[i] = s->band[band].p[i - 1]; s->band[band].a[i] = s->band[band].ap[i]; } /* Block 4, FILTEP */ wd1 = saturate(s->band[band].r[1] + s->band[band].r[1]); wd1 = (s->band[band].a[1]*wd1) >> 15; wd2 = saturate(s->band[band].r[2] + s->band[band].r[2]); wd2 = (s->band[band].a[2]*wd2) >> 15; s->band[band].sp = saturate(wd1 + wd2); /* Block 4, FILTEZ */ s->band[band].sz = 0; for (i = 6; i > 0; i--) { wd1 = saturate(s->band[band].d[i] + s->band[band].d[i]); s->band[band].sz += (s->band[band].b[i]*wd1) >> 15; } s->band[band].sz = saturate(s->band[band].sz); /* Block 4, PREDIC */ s->band[band].s = saturate(s->band[band].sp + s->band[band].sz); } /*- End of function --------------------------------------------------------*/ g722_encode_state_t *g722_encode_init(g722_encode_state_t *s, int rate, int options) { if (s == NULL) { if ((s = (g722_encode_state_t *) malloc(sizeof(*s))) == NULL) return NULL; } memset(s, 0, sizeof(*s)); if (rate == 48000) s->bits_per_sample = 6; else if (rate == 56000) s->bits_per_sample = 7; else s->bits_per_sample = 8; if ((options & G722_SAMPLE_RATE_8000)) s->eight_k = TRUE; if ((options & G722_PACKED) && s->bits_per_sample != 8) s->packed = TRUE; else s->packed = FALSE; s->band[0].det = 32; s->band[1].det = 8; return s; } /*- End of function --------------------------------------------------------*/ int g722_encode_release(g722_encode_state_t *s) { free(s); return 0; } /*- End of function --------------------------------------------------------*/ int g722_encode(g722_encode_state_t *s, uint8_t g722_data[], const int16_t amp[], int len) { static const int q6[32] = { 0, 35, 72, 110, 150, 190, 233, 276, 323, 370, 422, 473, 530, 587, 650, 714, 786, 858, 940, 1023, 1121, 1219, 1339, 1458, 1612, 1765, 1980, 2195, 2557, 2919, 0, 0 }; static const int iln[32] = { 0, 63, 62, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 0 }; static const int ilp[32] = { 0, 61, 60, 59, 58, 57, 56, 55, 54, 53, 52, 51, 50, 49, 48, 47, 46, 45, 44, 43, 42, 41, 40, 39, 38, 37, 36, 35, 34, 33, 32, 0 }; static const int wl[8] = { -60, -30, 58, 172, 334, 538, 1198, 3042 }; static const int rl42[16] = { 0, 7, 6, 5, 4, 3, 2, 1, 7, 6, 5, 4, 3, 2, 1, 0 }; static const int ilb[32] = { 2048, 2093, 2139, 2186, 2233, 2282, 2332, 2383, 2435, 2489, 2543, 2599, 2656, 2714, 2774, 2834, 2896, 2960, 3025, 3091, 3158, 3228, 3298, 3371, 3444, 3520, 3597, 3676, 3756, 3838, 3922, 4008 }; static const int qm4[16] = { 0, -20456, -12896, -8968, -6288, -4240, -2584, -1200, 20456, 12896, 8968, 6288, 4240, 2584, 1200, 0 }; static const int qm2[4] = { -7408, -1616, 7408, 1616 }; static const int qmf_coeffs[12] = { 3, -11, 12, 32, -210, 951, 3876, -805, 362, -156, 53, -11, }; static const int ihn[3] = {0, 1, 0}; static const int ihp[3] = {0, 3, 2}; static const int wh[3] = {0, -214, 798}; static const int rh2[4] = {2, 1, 2, 1}; int dlow; int dhigh; int el; int wd; int wd1; int ril; int wd2; int il4; int ih2; int wd3; int eh; int mih; int i; int j; /* Low and high band PCM from the QMF */ int xlow; int xhigh; int g722_bytes; /* Even and odd tap accumulators */ int sumeven; int sumodd; int ihigh; int ilow; int code; g722_bytes = 0; xhigh = 0; for (j = 0; j < len; ) { if (s->itu_test_mode) { xlow = xhigh = amp[j++] >> 1; } else { if (s->eight_k) { xlow = amp[j++]; } else { /* Apply the transmit QMF */ /* Shuffle the buffer down */ memcpy(s->x, &s->x[2], 22*sizeof(s->x[0])); s->x[22] = amp[j++]; s->x[23] = amp[j++]; /* Discard every other QMF output */ sumeven = 0; sumodd = 0; for (i = 0; i < 12; i++) { sumodd += s->x[2*i]*qmf_coeffs[i]; sumeven += s->x[2*i + 1]*qmf_coeffs[11 - i]; } xlow = (sumeven + sumodd) >> 13; xhigh = (sumeven - sumodd) >> 13; } } /* Block 1L, SUBTRA */ el = saturate(xlow - s->band[0].s); /* Block 1L, QUANTL */ wd = (el >= 0) ? el : -(el + 1); for (i = 1; i < 30; i++) { wd1 = (q6[i]*s->band[0].det) >> 12; if (wd < wd1) break; } ilow = (el < 0) ? iln[i] : ilp[i]; /* Block 2L, INVQAL */ ril = ilow >> 2; wd2 = qm4[ril]; dlow = (s->band[0].det*wd2) >> 15; /* Block 3L, LOGSCL */ il4 = rl42[ril]; wd = (s->band[0].nb*127) >> 7; s->band[0].nb = wd + wl[il4]; if (s->band[0].nb < 0) s->band[0].nb = 0; else if (s->band[0].nb > 18432) s->band[0].nb = 18432; /* Block 3L, SCALEL */ wd1 = (s->band[0].nb >> 6) & 31; wd2 = 8 - (s->band[0].nb >> 11); wd3 = (wd2 < 0) ? (ilb[wd1] << -wd2) : (ilb[wd1] >> wd2); s->band[0].det = wd3 << 2; block4(s, 0, dlow); if (s->eight_k) { /* Just leave the high bits as zero */ code = (0xC0 | ilow) >> (8 - s->bits_per_sample); } else { /* Block 1H, SUBTRA */ eh = saturate(xhigh - s->band[1].s); /* Block 1H, QUANTH */ wd = (eh >= 0) ? eh : -(eh + 1); wd1 = (564*s->band[1].det) >> 12; mih = (wd >= wd1) ? 2 : 1; ihigh = (eh < 0) ? ihn[mih] : ihp[mih]; /* Block 2H, INVQAH */ wd2 = qm2[ihigh]; dhigh = (s->band[1].det*wd2) >> 15; /* Block 3H, LOGSCH */ ih2 = rh2[ihigh]; wd = (s->band[1].nb*127) >> 7; s->band[1].nb = wd + wh[ih2]; if (s->band[1].nb < 0) s->band[1].nb = 0; else if (s->band[1].nb > 22528) s->band[1].nb = 22528; /* Block 3H, SCALEH */ wd1 = (s->band[1].nb >> 6) & 31; wd2 = 10 - (s->band[1].nb >> 11); wd3 = (wd2 < 0) ? (ilb[wd1] << -wd2) : (ilb[wd1] >> wd2); s->band[1].det = wd3 << 2; block4(s, 1, dhigh); code = ((ihigh << 6) | ilow) >> (8 - s->bits_per_sample); } if (s->packed) { /* Pack the code bits */ s->out_buffer |= (code << s->out_bits); s->out_bits += s->bits_per_sample; if (s->out_bits >= 8) { g722_data[g722_bytes++] = (uint8_t) (s->out_buffer & 0xFF); s->out_bits -= 8; s->out_buffer >>= 8; } } else { g722_data[g722_bytes++] = (uint8_t) code; } } return g722_bytes; } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/async.c0000644000175000017500000001456011150047205017142 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * async.c - Asynchronous serial bit stream encoding and decoding * * Written by Steve Underwood * * Copyright (C) 2003 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: async.c,v 1.11 2008/05/13 13:17:21 steveu Exp $ */ /*! \file */ #if defined(HAVE_CONFIG_H) #include #endif #include #include #include #include #include "spandsp/telephony.h" #include "spandsp/async.h" async_rx_state_t *async_rx_init(async_rx_state_t *s, int data_bits, int parity, int stop_bits, int use_v14, put_byte_func_t put_byte, void *user_data) { if (s == NULL) { if ((s = (async_rx_state_t *) malloc(sizeof(*s))) == NULL) return NULL; } s->data_bits = data_bits; s->parity = parity; s->stop_bits = stop_bits; s->use_v14 = use_v14; s->put_byte = put_byte; s->user_data = user_data; s->byte_in_progress = 0; s->bitpos = 0; s->parity_bit = 0; s->parity_errors = 0; s->framing_errors = 0; return s; } /*- End of function --------------------------------------------------------*/ void async_rx_put_bit(void *user_data, int bit) { async_rx_state_t *s; s = (async_rx_state_t *) user_data; if (bit < 0) { /* Special conditions */ switch (bit) { case PUTBIT_CARRIER_UP: case PUTBIT_CARRIER_DOWN: case PUTBIT_TRAINING_IN_PROGRESS: case PUTBIT_TRAINING_SUCCEEDED: case PUTBIT_TRAINING_FAILED: case PUTBIT_END_OF_DATA: s->put_byte(s->user_data, bit); s->bitpos = 0; s->byte_in_progress = 0; break; default: //printf("Eh!\n"); break; } return; } if (s->bitpos == 0) { /* Search for the start bit */ s->bitpos += (bit ^ 1); s->parity_bit = 0; s->byte_in_progress = 0; } else if (s->bitpos <= s->data_bits) { s->byte_in_progress = (s->byte_in_progress >> 1) | (bit << 7); s->parity_bit ^= bit; s->bitpos++; } else if (s->parity && s->bitpos == s->data_bits + 1) { if (s->parity == ASYNC_PARITY_ODD) s->parity_bit ^= 1; if (s->parity_bit != bit) s->parity_errors++; s->bitpos++; } else { /* Stop bit */ if (bit == 1) { /* Align the received value */ if (s->data_bits < 8) s->byte_in_progress >>= (8 - s->data_bits); s->put_byte(s->user_data, s->byte_in_progress); s->bitpos = 0; } else if (s->use_v14) { /* This is actually the start bit for the next character, and the stop bit has been dropped from the stream. This is the rate adaption specified in V.14 */ /* Align the received value */ if (s->data_bits < 8) s->byte_in_progress >>= (8 - s->data_bits); s->put_byte(s->user_data, s->byte_in_progress); s->bitpos = 1; s->parity_bit = 0; s->byte_in_progress = 0; } else { s->framing_errors++; s->bitpos = 0; } } } /*- End of function --------------------------------------------------------*/ async_tx_state_t *async_tx_init(async_tx_state_t *s, int data_bits, int parity, int stop_bits, int use_v14, get_byte_func_t get_byte, void *user_data) { if (s == NULL) { if ((s = (async_tx_state_t *) malloc(sizeof(*s))) == NULL) return NULL; } /* We have a use_v14 parameter for completeness, but right now V.14 only applies to the receive side. We are unlikely to have an application where flow control does not exist, so V.14 stuffing is not needed. */ s->data_bits = data_bits; s->parity = parity; s->stop_bits = stop_bits; if (parity != ASYNC_PARITY_NONE) s->stop_bits++; s->get_byte = get_byte; s->user_data = user_data; s->byte_in_progress = 0; s->bitpos = 0; s->parity_bit = 0; return s; } /*- End of function --------------------------------------------------------*/ int async_tx_get_bit(void *user_data) { async_tx_state_t *s; int bit; s = (async_tx_state_t *) user_data; if (s->bitpos == 0) { if ((s->byte_in_progress = s->get_byte(s->user_data)) < 0) { /* No more data */ bit = PUTBIT_END_OF_DATA; } else { /* Start bit */ bit = 0; s->parity_bit = 0; s->bitpos++; } } else if (s->bitpos <= s->data_bits) { bit = s->byte_in_progress & 1; s->byte_in_progress >>= 1; s->parity_bit ^= bit; s->bitpos++; } else if (s->parity && s->bitpos == s->data_bits + 1) { if (s->parity == ASYNC_PARITY_ODD) s->parity_bit ^= 1; bit = s->parity_bit; s->bitpos++; } else { /* Stop bit(s) */ bit = 1; if (++s->bitpos > s->data_bits + s->stop_bits) s->bitpos = 0; } return bit; } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/v27ter_tx.c0000644000175000017500000003635111150047205017673 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * v27ter_tx.c - ITU V.27ter modem transmit part * * Written by Steve Underwood * * Copyright (C) 2003 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: v27ter_tx.c,v 1.64 2008/07/16 14:23:47 steveu Exp $ */ /*! \file */ #if defined(HAVE_CONFIG_H) #include #endif #include #include #include #include #include "floating_fudge.h" #if defined(HAVE_TGMATH_H) #include #endif #if defined(HAVE_MATH_H) #include #endif #include "spandsp/telephony.h" #include "spandsp/logging.h" #include "spandsp/complex.h" #include "spandsp/vector_float.h" #include "spandsp/complex_vector_float.h" #include "spandsp/async.h" #include "spandsp/dds.h" #include "spandsp/power_meter.h" #include "spandsp/v27ter_tx.h" #if defined(SPANDSP_USE_FIXED_POINT) #include "v27ter_tx_4800_fixed_rrc.h" #include "v27ter_tx_2400_fixed_rrc.h" #else #include "v27ter_tx_4800_floating_rrc.h" #include "v27ter_tx_2400_floating_rrc.h" #endif #define CARRIER_NOMINAL_FREQ 1800.0f /* Segments of the training sequence */ /* V.27ter defines a long and a short sequence. FAX doesn't use the short sequence, so it is not implemented here. */ #define V27TER_TRAINING_SEG_1 0 #define V27TER_TRAINING_SEG_2 (V27TER_TRAINING_SEG_1 + 320) #define V27TER_TRAINING_SEG_3 (V27TER_TRAINING_SEG_2 + 32) #define V27TER_TRAINING_SEG_4 (V27TER_TRAINING_SEG_3 + 50) #define V27TER_TRAINING_SEG_5 (V27TER_TRAINING_SEG_4 + 1074) #define V27TER_TRAINING_END (V27TER_TRAINING_SEG_5 + 8) #define V27TER_TRAINING_SHUTDOWN_END (V27TER_TRAINING_END + 32) static int fake_get_bit(void *user_data) { return 1; } /*- End of function --------------------------------------------------------*/ static __inline__ int scramble(v27ter_tx_state_t *s, int in_bit) { int out_bit; /* This scrambler is really quite messy to implement. There seems to be no efficient shortcut */ out_bit = (in_bit ^ (s->scramble_reg >> 5) ^ (s->scramble_reg >> 6)) & 1; if (s->scrambler_pattern_count >= 33) { out_bit ^= 1; s->scrambler_pattern_count = 0; } else { if ((((s->scramble_reg >> 7) ^ out_bit) & ((s->scramble_reg >> 8) ^ out_bit) & ((s->scramble_reg >> 11) ^ out_bit) & 1)) s->scrambler_pattern_count = 0; else s->scrambler_pattern_count++; } s->scramble_reg = (s->scramble_reg << 1) | out_bit; return out_bit; } /*- End of function --------------------------------------------------------*/ static __inline__ int get_scrambled_bit(v27ter_tx_state_t *s) { int bit; if ((bit = s->current_get_bit(s->get_bit_user_data)) == PUTBIT_END_OF_DATA) { /* End of real data. Switch to the fake get_bit routine, until we have shut down completely. */ if (s->status_handler) s->status_handler(s->status_user_data, MODEM_TX_STATUS_DATA_EXHAUSTED); s->current_get_bit = fake_get_bit; s->in_training = TRUE; bit = 1; } return scramble(s, bit); } /*- End of function --------------------------------------------------------*/ #if defined(SPANDSP_USE_FIXED_POINT) static complexi16_t getbaud(v27ter_tx_state_t *s) #else static complexf_t getbaud(v27ter_tx_state_t *s) #endif { static const int phase_steps_4800[8] = { 1, 0, 2, 3, 6, 7, 5, 4 }; static const int phase_steps_2400[4] = { 0, 2, 6, 4 }; #if defined(SPANDSP_USE_FIXED_POINT) static const complexi16_t constellation[8] = { { 1414, 0000}, /* 0deg */ { 1000, 1000}, /* 45deg */ { 0000, 1414}, /* 90deg */ {-1000, 1000}, /* 135deg */ {-1414, 0000}, /* 180deg */ {-1000, -1000}, /* 225deg */ { 0000, -1414}, /* 270deg */ { 1000, -1000} /* 315deg */ }; #else static const complexf_t constellation[8] = { { 1.414f, 0.0f}, /* 0deg */ { 1.0f, 1.0f}, /* 45deg */ { 0.0f, 1.414f}, /* 90deg */ {-1.0f, 1.0f}, /* 135deg */ {-1.414f, 0.0f}, /* 180deg */ {-1.0f, -1.0f}, /* 225deg */ { 0.0f, -1.414f}, /* 270deg */ { 1.0f, -1.0f} /* 315deg */ }; #endif int bits; if (s->in_training) { /* Send the training sequence */ if (++s->training_step <= V27TER_TRAINING_SEG_5) { if (s->training_step <= V27TER_TRAINING_SEG_4) { if (s->training_step <= V27TER_TRAINING_SEG_2) { /* Segment 1: Unmodulated carrier (talker echo protection) */ return constellation[0]; } if (s->training_step <= V27TER_TRAINING_SEG_3) { /* Segment 2: Silence */ #if defined(SPANDSP_USE_FIXED_POINT) return complex_seti16(0, 0); #else return complex_setf(0.0f, 0.0f); #endif } /* Segment 3: Regular reversals... */ s->constellation_state = (s->constellation_state + 4) & 7; return constellation[s->constellation_state]; } /* Segment 4: Scrambled reversals... */ /* Apply the 1 + x^-6 + x^-7 scrambler. We want every third bit from the scrambler. */ bits = get_scrambled_bit(s) << 2; get_scrambled_bit(s); get_scrambled_bit(s); s->constellation_state = (s->constellation_state + bits) & 7; return constellation[s->constellation_state]; } /* We should be in the block of test ones, or shutdown ones, if we get here. */ /* There is no graceful shutdown procedure defined for V.27ter. Just send some ones, to ensure we get the real data bits through, even with bad ISI. */ if (s->training_step == V27TER_TRAINING_END + 1) { /* End of the last segment - segment 5: All ones */ /* Switch from the fake get_bit routine, to the user supplied real one, and we are up and running. */ s->current_get_bit = s->get_bit; s->in_training = FALSE; } if (s->training_step == V27TER_TRAINING_SHUTDOWN_END) { if (s->status_handler) s->status_handler(s->status_user_data, MODEM_TX_STATUS_SHUTDOWN_COMPLETE); } } /* 4800bps uses 8 phases. 2400bps uses 4 phases. */ if (s->bit_rate == 4800) { bits = get_scrambled_bit(s); bits = (bits << 1) | get_scrambled_bit(s); bits = (bits << 1) | get_scrambled_bit(s); bits = phase_steps_4800[bits]; } else { bits = get_scrambled_bit(s); bits = (bits << 1) | get_scrambled_bit(s); bits = phase_steps_2400[bits]; } s->constellation_state = (s->constellation_state + bits) & 7; return constellation[s->constellation_state]; } /*- End of function --------------------------------------------------------*/ int v27ter_tx(v27ter_tx_state_t *s, int16_t amp[], int len) { #if defined(SPANDSP_USE_FIXED_POINT) complexi_t x; complexi_t z; #else complexf_t x; complexf_t z; #endif int i; int sample; if (s->training_step >= V27TER_TRAINING_SHUTDOWN_END) { /* Once we have sent the shutdown symbols, we stop sending completely. */ return 0; } /* The symbol rates for the two bit rates are different. This makes it difficult to merge both generation procedures into a single efficient loop. We do not bother trying. We use two independent loops, filter coefficients, etc. */ if (s->bit_rate == 4800) { for (sample = 0; sample < len; sample++) { if (++s->baud_phase >= 5) { s->baud_phase -= 5; s->rrc_filter[s->rrc_filter_step] = s->rrc_filter[s->rrc_filter_step + V27TER_TX_FILTER_STEPS] = getbaud(s); if (++s->rrc_filter_step >= V27TER_TX_FILTER_STEPS) s->rrc_filter_step = 0; } /* Root raised cosine pulse shaping at baseband */ #if defined(SPANDSP_USE_FIXED_POINT) x = complex_seti(0, 0); for (i = 0; i < V27TER_TX_FILTER_STEPS; i++) { x.re += (int32_t) tx_pulseshaper_4800[TX_PULSESHAPER_4800_COEFF_SETS - 1 - s->baud_phase][i]*(int32_t) s->rrc_filter[i + s->rrc_filter_step].re; x.im += (int32_t) tx_pulseshaper_4800[TX_PULSESHAPER_4800_COEFF_SETS - 1 - s->baud_phase][i]*(int32_t) s->rrc_filter[i + s->rrc_filter_step].im; } /* Now create and modulate the carrier */ x.re >>= 14; x.im >>= 14; z = dds_complexi(&(s->carrier_phase), s->carrier_phase_rate); /* Don't bother saturating. We should never clip. */ i = (x.re*z.re - x.im*z.im) >> 15; amp[sample] = (int16_t) ((i*s->gain_4800) >> 15); #else x = complex_setf(0.0f, 0.0f); for (i = 0; i < V27TER_TX_FILTER_STEPS; i++) { x.re += tx_pulseshaper_4800[TX_PULSESHAPER_4800_COEFF_SETS - 1 - s->baud_phase][i]*s->rrc_filter[i + s->rrc_filter_step].re; x.im += tx_pulseshaper_4800[TX_PULSESHAPER_4800_COEFF_SETS - 1 - s->baud_phase][i]*s->rrc_filter[i + s->rrc_filter_step].im; } /* Now create and modulate the carrier */ z = dds_complexf(&(s->carrier_phase), s->carrier_phase_rate); /* Don't bother saturating. We should never clip. */ amp[sample] = (int16_t) lrintf((x.re*z.re - x.im*z.im)*s->gain_4800); #endif } } else { for (sample = 0; sample < len; sample++) { if ((s->baud_phase += 3) >= 20) { s->baud_phase -= 20; s->rrc_filter[s->rrc_filter_step] = s->rrc_filter[s->rrc_filter_step + V27TER_TX_FILTER_STEPS] = getbaud(s); if (++s->rrc_filter_step >= V27TER_TX_FILTER_STEPS) s->rrc_filter_step = 0; } /* Root raised cosine pulse shaping at baseband */ #if defined(SPANDSP_USE_FIXED_POINT) x = complex_seti(0, 0); for (i = 0; i < V27TER_TX_FILTER_STEPS; i++) { x.re += (int32_t) tx_pulseshaper_2400[TX_PULSESHAPER_2400_COEFF_SETS - 1 - s->baud_phase][i]*(int32_t) s->rrc_filter[i + s->rrc_filter_step].re; x.im += (int32_t) tx_pulseshaper_2400[TX_PULSESHAPER_2400_COEFF_SETS - 1 - s->baud_phase][i]*(int32_t) s->rrc_filter[i + s->rrc_filter_step].im; } /* Now create and modulate the carrier */ x.re >>= 14; x.im >>= 14; z = dds_complexi(&(s->carrier_phase), s->carrier_phase_rate); /* Don't bother saturating. We should never clip. */ i = (x.re*z.re - x.im*z.im) >> 15; amp[sample] = (int16_t) ((i*s->gain_2400) >> 15); #else x = complex_setf(0.0f, 0.0f); for (i = 0; i < V27TER_TX_FILTER_STEPS; i++) { x.re += tx_pulseshaper_2400[TX_PULSESHAPER_2400_COEFF_SETS - 1 - s->baud_phase][i]*s->rrc_filter[i + s->rrc_filter_step].re; x.im += tx_pulseshaper_2400[TX_PULSESHAPER_2400_COEFF_SETS - 1 - s->baud_phase][i]*s->rrc_filter[i + s->rrc_filter_step].im; } /* Now create and modulate the carrier */ z = dds_complexf(&(s->carrier_phase), s->carrier_phase_rate); /* Don't bother saturating. We should never clip. */ amp[sample] = (int16_t) lrintf((x.re*z.re - x.im*z.im)*s->gain_2400); #endif } } return sample; } /*- End of function --------------------------------------------------------*/ void v27ter_tx_power(v27ter_tx_state_t *s, float power) { float l; l = powf(10.0f, (power - DBM0_MAX_POWER)/20.0f)*32768.0f; #if defined(SPANDSP_USE_FIXED_POINT) s->gain_2400 = 16.0f*1.024f*(32767.0f/28828.51f)*l/TX_PULSESHAPER_2400_GAIN; s->gain_4800 = 16.0f*1.024f*(32767.0f/28828.46f)*l/TX_PULSESHAPER_4800_GAIN; #else s->gain_2400 = l/TX_PULSESHAPER_2400_GAIN; s->gain_4800 = l/TX_PULSESHAPER_4800_GAIN; #endif } /*- End of function --------------------------------------------------------*/ void v27ter_tx_set_get_bit(v27ter_tx_state_t *s, get_bit_func_t get_bit, void *user_data) { if (s->get_bit == s->current_get_bit) s->current_get_bit = get_bit; s->get_bit = get_bit; s->get_bit_user_data = user_data; } /*- End of function --------------------------------------------------------*/ void v27ter_tx_set_modem_status_handler(v27ter_tx_state_t *s, modem_tx_status_func_t handler, void *user_data) { s->status_handler = handler; s->status_user_data = user_data; } /*- End of function --------------------------------------------------------*/ int v27ter_tx_restart(v27ter_tx_state_t *s, int bit_rate, int tep) { if (bit_rate != 4800 && bit_rate != 2400) return -1; s->bit_rate = bit_rate; #if defined(SPANDSP_USE_FIXED_POINT) memset(s->rrc_filter, 0, sizeof(s->rrc_filter)); #else cvec_zerof(s->rrc_filter, sizeof(s->rrc_filter)/sizeof(s->rrc_filter[0])); #endif s->rrc_filter_step = 0; s->scramble_reg = 0x3C; s->scrambler_pattern_count = 0; s->in_training = TRUE; s->training_step = (tep) ? V27TER_TRAINING_SEG_1 : V27TER_TRAINING_SEG_2; s->carrier_phase = 0; s->baud_phase = 0; s->constellation_state = 0; s->current_get_bit = fake_get_bit; return 0; } /*- End of function --------------------------------------------------------*/ v27ter_tx_state_t *v27ter_tx_init(v27ter_tx_state_t *s, int bit_rate, int tep, get_bit_func_t get_bit, void *user_data) { if (s == NULL) { if ((s = (v27ter_tx_state_t *) malloc(sizeof(*s))) == NULL) return NULL; } memset(s, 0, sizeof(*s)); span_log_init(&s->logging, SPAN_LOG_NONE, NULL); span_log_set_protocol(&s->logging, "V.27ter TX"); s->get_bit = get_bit; s->get_bit_user_data = user_data; s->carrier_phase_rate = dds_phase_ratef(CARRIER_NOMINAL_FREQ); v27ter_tx_power(s, -14.0f); v27ter_tx_restart(s, bit_rate, tep); return s; } /*- End of function --------------------------------------------------------*/ int v27ter_tx_free(v27ter_tx_state_t *s) { free(s); return 0; } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/plc.c0000644000175000017500000002016611150047205016602 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * plc.c * * Written by Steve Underwood * * Copyright (C) 2004 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: plc.c,v 1.22 2008/07/02 14:48:25 steveu Exp $ */ /*! \file */ #if defined(HAVE_CONFIG_H) #include #endif #include #include #include #include #include "floating_fudge.h" #if defined(HAVE_TGMATH_H) #include #endif #if defined(HAVE_MATH_H) #include #endif #include #include "spandsp/telephony.h" #include "spandsp/dc_restore.h" #include "spandsp/plc.h" /* We do a straight line fade to zero volume in 50ms when we are filling in for missing data. */ #define ATTENUATION_INCREMENT 0.0025f /* Attenuation per sample */ #define ms_to_samples(t) (((t)*SAMPLE_RATE)/1000) static void save_history(plc_state_t *s, int16_t *buf, int len) { if (len >= PLC_HISTORY_LEN) { /* Just keep the last part of the new data, starting at the beginning of the buffer */ memcpy(s->history, buf + len - PLC_HISTORY_LEN, sizeof(int16_t)*PLC_HISTORY_LEN); s->buf_ptr = 0; return; } if (s->buf_ptr + len > PLC_HISTORY_LEN) { /* Wraps around - must break into two sections */ memcpy(s->history + s->buf_ptr, buf, sizeof(int16_t)*(PLC_HISTORY_LEN - s->buf_ptr)); len -= (PLC_HISTORY_LEN - s->buf_ptr); memcpy(s->history, buf + (PLC_HISTORY_LEN - s->buf_ptr), sizeof(int16_t)*len); s->buf_ptr = len; return; } /* Can use just one section */ memcpy(s->history + s->buf_ptr, buf, sizeof(int16_t)*len); s->buf_ptr += len; } /*- End of function --------------------------------------------------------*/ static __inline__ void normalise_history(plc_state_t *s) { int16_t tmp[PLC_HISTORY_LEN]; if (s->buf_ptr == 0) return; memcpy(tmp, s->history, sizeof(int16_t)*s->buf_ptr); memcpy(s->history, s->history + s->buf_ptr, sizeof(int16_t)*(PLC_HISTORY_LEN - s->buf_ptr)); memcpy(s->history + PLC_HISTORY_LEN - s->buf_ptr, tmp, sizeof(int16_t)*s->buf_ptr); s->buf_ptr = 0; } /*- End of function --------------------------------------------------------*/ static __inline__ int amdf_pitch(int min_pitch, int max_pitch, int16_t amp[], int len) { int i; int j; int acc; int min_acc; int pitch; pitch = min_pitch; min_acc = INT_MAX; for (i = max_pitch; i <= min_pitch; i++) { acc = 0; for (j = 0; j < len; j++) acc += abs(amp[i + j] - amp[j]); if (acc < min_acc) { min_acc = acc; pitch = i; } } return pitch; } /*- End of function --------------------------------------------------------*/ int plc_rx(plc_state_t *s, int16_t amp[], int len) { int i; int pitch_overlap; float old_step; float new_step; float old_weight; float new_weight; float gain; if (s->missing_samples) { /* Although we have a real signal, we need to smooth it to fit well with the synthetic signal we used for the previous block */ /* The start of the real data is overlapped with the next 1/4 cycle of the synthetic data. */ pitch_overlap = s->pitch >> 2; if (pitch_overlap > len) pitch_overlap = len; gain = 1.0f - s->missing_samples*ATTENUATION_INCREMENT; if (gain < 0.0f) gain = 0.0f; new_step = 1.0f/pitch_overlap; old_step = new_step*gain; new_weight = new_step; old_weight = (1.0f - new_step)*gain; for (i = 0; i < pitch_overlap; i++) { amp[i] = fsaturate(old_weight*s->pitchbuf[s->pitch_offset] + new_weight*amp[i]); if (++s->pitch_offset >= s->pitch) s->pitch_offset = 0; new_weight += new_step; old_weight -= old_step; if (old_weight < 0.0f) old_weight = 0.0f; } s->missing_samples = 0; } save_history(s, amp, len); return len; } /*- End of function --------------------------------------------------------*/ int plc_fillin(plc_state_t *s, int16_t amp[], int len) { int i; int pitch_overlap; float old_step; float new_step; float old_weight; float new_weight; float gain; int16_t *orig_amp; int orig_len; orig_amp = amp; orig_len = len; if (s->missing_samples == 0) { /* As the gap in real speech starts we need to assess the last known pitch, and prepare the synthetic data we will use for fill-in */ normalise_history(s); s->pitch = amdf_pitch(PLC_PITCH_MIN, PLC_PITCH_MAX, s->history + PLC_HISTORY_LEN - CORRELATION_SPAN - PLC_PITCH_MIN, CORRELATION_SPAN); /* We overlap a 1/4 wavelength */ pitch_overlap = s->pitch >> 2; /* Cook up a single cycle of pitch, using a single of the real signal with 1/4 cycle OLA'ed to make the ends join up nicely */ /* The first 3/4 of the cycle is a simple copy */ for (i = 0; i < s->pitch - pitch_overlap; i++) s->pitchbuf[i] = s->history[PLC_HISTORY_LEN - s->pitch + i]; /* The last 1/4 of the cycle is overlapped with the end of the previous cycle */ new_step = 1.0f/pitch_overlap; new_weight = new_step; for ( ; i < s->pitch; i++) { s->pitchbuf[i] = s->history[PLC_HISTORY_LEN - s->pitch + i]*(1.0f - new_weight) + s->history[PLC_HISTORY_LEN - 2*s->pitch + i]*new_weight; new_weight += new_step; } /* We should now be ready to fill in the gap with repeated, decaying cycles of what is in pitchbuf */ gain = 1.0f; /* We need to OLA the first 1/4 wavelength of the synthetic data, to smooth it into the previous real data. To avoid the need to introduce a delay in the stream, reverse the last 1/4 wavelength, and OLA with that. */ new_step = 1.0f/pitch_overlap; old_step = new_step; new_weight = new_step; old_weight = 1.0f - new_step; for (i = 0; i < pitch_overlap; i++) { amp[i] = fsaturate(old_weight*s->history[PLC_HISTORY_LEN - 1 - i] + new_weight*s->pitchbuf[i]); new_weight += new_step; old_weight -= old_step; if (old_weight < 0.0f) old_weight = 0.0f; } s->pitch_offset = i; } else { gain = 1.0f - s->missing_samples*ATTENUATION_INCREMENT; i = 0; } for ( ; gain > 0.0f && i < len; i++) { amp[i] = (int16_t) (s->pitchbuf[s->pitch_offset]*gain); gain -= ATTENUATION_INCREMENT; if (++s->pitch_offset >= s->pitch) s->pitch_offset = 0; } for ( ; i < len; i++) amp[i] = 0; s->missing_samples += orig_len; save_history(s, amp, len); return len; } /*- End of function --------------------------------------------------------*/ plc_state_t *plc_init(plc_state_t *s) { if (s == NULL) { if ((s = (plc_state_t *) malloc(sizeof(*s))) == NULL) return NULL; } memset(s, 0, sizeof(*s)); return s; } /*- End of function --------------------------------------------------------*/ int plc_free(plc_state_t *s) { if (s) free(s); return 0; } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/super_tone_tx.c0000644000175000017500000002057111150047205020722 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * super_tone_tx.c - Flexible telephony supervisory tone generation. * * Written by Steve Underwood * * Copyright (C) 2003 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: super_tone_tx.c,v 1.25 2008/07/02 14:48:26 steveu Exp $ */ /*! \file */ #if defined(HAVE_CONFIG_H) #include "config.h" #endif #include #include #include #include #include #include #include #include "floating_fudge.h" #if defined(HAVE_TGMATH_H) #include #endif #if defined(HAVE_MATH_H) #include #endif #include "spandsp/telephony.h" #include "spandsp/complex.h" #include "spandsp/dds.h" #include "spandsp/tone_generate.h" #include "spandsp/super_tone_tx.h" /* The tone played to wake folk up when they have left the phone off hook is an oddity amongst supervisory tones. It is designed to sound loud and nasty. Most tones are one or two pure sine pitches, or one AM moduluated pitch. This alert tone varies between countries, but AT&T are a typical example. AT&T Receiver Off-Hook Tone is 1400 Hz, 2060 Hz, 2450 Hz and 2600 Hz at 0dBm0/frequency on and off every .1 second. On some older space division switching systems Receiver Off-Hook was 1400 Hz, 2060 Hz, 2450 Hz and 2600 Hz at +5 VU on and off every .1 second. On a No. 5 ESS this continues for 30 seconds. On a No. 2/2B ESS this continues for 40 seconds. On some other AT&T switches there are two iterations of 50 seconds each. */ super_tone_tx_step_t *super_tone_tx_make_step(super_tone_tx_step_t *s, float f1, float l1, float f2, float l2, int length, int cycles) { if (s == NULL) { if ((s = (super_tone_tx_step_t *) malloc(sizeof(*s))) == NULL) return NULL; } if (f1 >= 1.0f) { s->tone[0].phase_rate = dds_phase_ratef(f1); s->tone[0].gain = dds_scaling_dbm0f(l1); } else { s->tone[0].phase_rate = 0; s->tone[0].gain = 0.0f; } if (f2 >= 1.0f) { s->tone[1].phase_rate = dds_phase_ratef(f2); s->tone[1].gain = dds_scaling_dbm0f(l2); } else { s->tone[1].phase_rate = 0; s->tone[1].gain = 0.0f; } s->tone_on = (f1 > 0.0f); s->length = length*SAMPLE_RATE/1000; s->cycles = cycles; s->next = NULL; s->nest = NULL; return s; } /*- End of function --------------------------------------------------------*/ void super_tone_tx_free(super_tone_tx_step_t *s) { super_tone_tx_step_t *t; while (s) { /* Follow nesting... */ if (s->nest) super_tone_tx_free(s->nest); t = s; s = s->next; free(t); } } /*- End of function --------------------------------------------------------*/ super_tone_tx_state_t *super_tone_tx_init(super_tone_tx_state_t *s, super_tone_tx_step_t *tree) { if (tree == NULL) return NULL; if (s == NULL) { if ((s = (super_tone_tx_state_t *) malloc(sizeof(*s))) == NULL) return NULL; } memset(s, 0, sizeof(*s)); s->level = 0; s->levels[0] = tree; s->cycles[0] = tree->cycles; s->current_position = 0; return s; } /*- End of function --------------------------------------------------------*/ int super_tone_tx(super_tone_tx_state_t *s, int16_t amp[], int max_samples) { int samples; int limit; int len; int i; float xamp; super_tone_tx_step_t *tree; if (s->level < 0 || s->level > 3) return 0; samples = 0; tree = s->levels[s->level]; while (tree && samples < max_samples) { if (tree->tone_on) { /* A period of tone. A length of zero means infinite length. */ if (s->current_position == 0) { /* New step - prepare the tone generator */ for (i = 0; i < 4; i++) s->tone[i] = tree->tone[i]; } len = tree->length - s->current_position; if (tree->length == 0) { len = max_samples - samples; /* We just need to make current position non-zero */ s->current_position = 1; } else if (len > max_samples - samples) { len = max_samples - samples; s->current_position += len; } else { s->current_position = 0; } if (s->tone[0].phase_rate < 0) { for (limit = len + samples; samples < limit; samples++) { /* There must be two, and only two tones */ xamp = dds_modf(&s->phase[0], -s->tone[0].phase_rate, s->tone[0].gain, 0) *(1.0f + dds_modf(&s->phase[1], s->tone[1].phase_rate, s->tone[1].gain, 0)); amp[samples] = (int16_t) lrintf(xamp); } } else { for (limit = len + samples; samples < limit; samples++) { xamp = 0.0f; for (i = 0; i < 4; i++) { if (s->tone[i].phase_rate == 0) break; xamp += dds_modf(&s->phase[i], s->tone[i].phase_rate, s->tone[i].gain, 0); } amp[samples] = (int16_t) lrintf(xamp); } } if (s->current_position) return samples; } else if (tree->length) { /* A period of silence. The length must always be explicitly stated. A length of zero does not give infinite silence. */ len = tree->length - s->current_position; if (len > max_samples - samples) { len = max_samples - samples; s->current_position += len; } else { s->current_position = 0; } memset(amp + samples, 0, sizeof(uint16_t)*len); samples += len; if (s->current_position) return samples; } /* Nesting has priority... */ if (tree->nest) { tree = tree->nest; s->levels[++s->level] = tree; s->cycles[s->level] = tree->cycles; } else { /* ...Next comes repeating, and finally moving forward a step. */ /* When repeating, note that zero cycles really means endless cycles. */ while (tree->cycles && --s->cycles[s->level] <= 0) { tree = tree->next; if (tree) { /* A fresh new step. */ s->levels[s->level] = tree; s->cycles[s->level] = tree->cycles; break; } /* If we are nested we need to pop, otherwise this is the end. */ if (s->level <= 0) { /* Mark the tone as completed */ s->levels[0] = NULL; break; } tree = s->levels[--s->level]; } } } return samples; } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/faxfont.h0000644000175000017500000020067511150047205017503 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * faxfont.h - a simple fixed pitch font for FAX headers * * Written by Steve Underwood * * Copyright (C) 2004 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: faxfont.h,v 1.6 2008/04/17 14:26:56 steveu Exp $ */ #if !defined(_FAXFONT_H_) #define _FAXFONT_H_ static const uint32_t header_font[256][16] = { { /* 0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, }, { /* 1 */ 0x0, 0x0, 0x3FFC, 0xC003, 0xCC33, 0xC003, 0xC003, 0xCFF3, 0xC3C3, 0xC003, 0xC003, 0x3FFC, 0x0, 0x0, 0x0, 0x0, }, { /* 2 */ 0x0, 0x0, 0x3FFC, 0xFFFF, 0xF3CF, 0xFFFF, 0xFFFF, 0xF00F, 0xFC3F, 0xFFFF, 0xFFFF, 0x3FFC, 0x0, 0x0, 0x0, 0x0, }, { /* 3 */ 0x0, 0x0, 0x0, 0x0, 0x1E78, 0x7FFE, 0x7FFE, 0x7FFE, 0x7FFE, 0x1FF8, 0x7E0, 0x180, 0x0, 0x0, 0x0, 0x0, }, { /* 4 */ 0x0, 0x0, 0x0, 0x0, 0x180, 0x7E0, 0x1FF8, 0x7FFE, 0x1FF8, 0x7E0, 0x180, 0x0, 0x0, 0x0, 0x0, 0x0, }, { /* 5 */ 0x0, 0x0, 0x0, 0x3C0, 0xFF0, 0xFF0, 0x7C3E, 0x7C3E, 0x7C3E, 0x63C6, 0x3C0, 0xFF0, 0x0, 0x0, 0x0, 0x0, }, { /* 6 */ 0x0, 0x0, 0x0, 0x180, 0x7E0, 0x1FF8, 0x7FFE, 0x7FFE, 0x1FF8, 0x180, 0x180, 0x7E0, 0x0, 0x0, 0x0, 0x0, }, { /* 7 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3C0, 0xFF0, 0xFF0, 0x3C0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, }, { /* 8 */ 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFC3F, 0xF00F, 0xF00F, 0xFC3F, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, }, { /* 9 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0xFF0, 0x3C3C, 0x300C, 0x300C, 0x3C3C, 0xFF0, 0x0, 0x0, 0x0, 0x0, 0x0, }, { /* 10 */ 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF00F, 0xC3C3, 0xCFF3, 0xCFF3, 0xC3C3, 0xF00F, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, }, { /* 11 */ 0x0, 0x0, 0x1FE, 0x7E, 0x1F6, 0x786, 0x1FE0, 0x3870, 0x3870, 0x3870, 0x3870, 0x1FE0, 0x0, 0x0, 0x0, 0x0, }, { /* 12 */ 0x0, 0x0, 0xFF0, 0x3C3C, 0x3C3C, 0x3C3C, 0x3C3C, 0xFF0, 0x3C0, 0x3FFC, 0x3C0, 0x3C0, 0x0, 0x0, 0x0, 0x0, }, { /* 13 */ 0x0, 0x0, 0xFFE, 0xF0E, 0xFFE, 0xE00, 0xE00, 0xE00, 0xE00, 0x3E00, 0x7E00, 0x3C00, 0x0, 0x0, 0x0, 0x0, }, { /* 14 */ 0x0, 0x0, 0x1FFE, 0x1C0E, 0x1FFE, 0x1C0E, 0x1C0E, 0x1C0E, 0x1C0E, 0x1C1E, 0x3C3E, 0x7C1C, 0x3800, 0x0, 0x0, 0x0, }, { /* 15 */ 0x0, 0x0, 0x0, 0x4002, 0x23C4, 0x13C8, 0xE70, 0x781E, 0xE70, 0x13C8, 0x23C4, 0x4002, 0x0, 0x0, 0x0, 0x0, }, { /* 16 */ 0x0, 0x3000, 0x3C00, 0x3F00, 0x3FC0, 0x3FF0, 0x3FF8, 0x3FF0, 0x3FC0, 0x3F00, 0x3C00, 0x3000, 0x0, 0x0, 0x0, 0x0, }, { /* 17 */ 0x0, 0xC, 0x3C, 0xFC, 0x3FC, 0xFFC, 0x1FFC, 0xFFC, 0x3FC, 0xFC, 0x3C, 0xC, 0x0, 0x0, 0x0, 0x0, }, { /* 18 */ 0x0, 0x180, 0x3C0, 0xFF0, 0x3FFC, 0x3C0, 0x3C0, 0x3C0, 0x3C0, 0x3FFC, 0xFF0, 0x3C0, 0x180, 0x0, 0x0, 0x0, }, { /* 19 */ 0x0, 0x0, 0x3C3C, 0x3C3C, 0x3C3C, 0x3C3C, 0x3C3C, 0x3C3C, 0x3C3C, 0x0, 0x3C3C, 0x3C3C, 0x0, 0x0, 0x0, 0x0, }, { /* 20 */ 0x0, 0x0, 0x3FFE, 0x71CE, 0x71CE, 0x71CE, 0x3FCE, 0x1CE, 0x1CE, 0x1CE, 0x1CE, 0x1CE, 0x0, 0x0, 0x0, 0x0, }, { /* 21 */ 0x0, 0x3FF0, 0x7038, 0x3C18, 0xFC0, 0x3CF0, 0x7038, 0x7038, 0x7038, 0x3CF0, 0xFC0, 0x60F0, 0x7038, 0x3FF0, 0x0, 0x0, }, { /* 22 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3FFC, 0x3FFC, 0x3FFC, 0x3FFC, 0x0, 0x0, 0x0, 0x0, }, { /* 23 */ 0x0, 0x180, 0x3C0, 0xFF0, 0x3FFC, 0x3C0, 0x3C0, 0x3C0, 0x3C0, 0x3FFC, 0xFF0, 0x3C0, 0x180, 0x3FFC, 0x0, 0x0, }, { /* 24 */ 0x0, 0x0, 0x180, 0x3C0, 0xFF0, 0x3FFC, 0x3C0, 0x3C0, 0x3C0, 0x3C0, 0x3C0, 0x3C0, 0x3C0, 0x0, 0x0, 0x0, }, { /* 25 */ 0x0, 0x0, 0x3C0, 0x3C0, 0x3C0, 0x3C0, 0x3C0, 0x3C0, 0x3C0, 0x3FFC, 0xFF0, 0x3C0, 0x180, 0x0, 0x0, 0x0, }, { /* 26 */ 0x0, 0x0, 0x0, 0x40, 0x60, 0x70, 0x78, 0x3FFC, 0x78, 0x70, 0x60, 0x40, 0x0, 0x0, 0x0, 0x0, }, { /* 27 */ 0x0, 0x0, 0x0, 0x200, 0x600, 0xE00, 0x1E00, 0x3FFC, 0x1E00, 0xE00, 0x600, 0x200, 0x0, 0x0, 0x0, 0x0, }, { /* 28 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x3800, 0x3800, 0x3800, 0x3800, 0x3FFE, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, }, { /* 29 */ 0x0, 0x0, 0x0, 0x0, 0x420, 0xC30, 0x1C38, 0x3FFC, 0x1C38, 0xC30, 0x420, 0x0, 0x0, 0x0, 0x0, 0x0, }, { /* 30 */ 0x0, 0x0, 0x0, 0x0, 0x180, 0x7E0, 0x7E0, 0x1FF8, 0x1FF8, 0x7FFE, 0x7FFE, 0x0, 0x0, 0x0, 0x0, 0x0, }, { /* 31 */ 0x0, 0x0, 0x0, 0x0, 0xFFFC, 0xFFFC, 0x3FF0, 0x3FF0, 0xFC0, 0xFC0, 0x300, 0x0, 0x0, 0x0, 0x0, 0x0, }, { /* 32 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, }, { /* 33 */ 0x0, 0x0, 0x3C0, 0x7E0, 0x7E0, 0x7E0, 0x3C0, 0x3C0, 0x3C0, 0x0, 0x3C0, 0x3C0, 0x0, 0x0, 0x0, 0x0, }, { /* 34 */ 0x0, 0x3C3C, 0x3C3C, 0x3C3C, 0xC30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, }, { /* 35 */ 0x0, 0x0, 0x0, 0x1C38, 0x1C38, 0x7FFE, 0x1C38, 0x1C38, 0x1C38, 0x7FFE, 0x1C38, 0x1C38, 0x0, 0x0, 0x0, 0x0, }, { /* 36 */ 0x0, 0x1E0, 0x1E0, 0x1FF8, 0x781E, 0x7806, 0x7800, 0x1FF8, 0x1E, 0x601E, 0x781E, 0x1FF8, 0x1E0, 0x1E0, 0x0, 0x0, }, { /* 37 */ 0x0, 0x0, 0x0, 0x0, 0x7806, 0x781E, 0x78, 0x1E0, 0x780, 0x1E00, 0x781E, 0x601E, 0x0, 0x0, 0x0, 0x0, }, { /* 38 */ 0x0, 0x0, 0x7E0, 0x1E78, 0x1E78, 0x7E0, 0x1F9E, 0x79F8, 0x7878, 0x7878, 0x7878, 0x1F9E, 0x0, 0x0, 0x0, 0x0, }, { /* 39 */ 0x0, 0xF00, 0xF00, 0xF00, 0x3C00, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, }, { /* 40 */ 0x0, 0x0, 0xF0, 0x3C0, 0xF00, 0xF00, 0xF00, 0xF00, 0xF00, 0xF00, 0x3C0, 0xF0, 0x0, 0x0, 0x0, 0x0, }, { /* 41 */ 0x0, 0x0, 0xF00, 0x3C0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0x3C0, 0xF00, 0x0, 0x0, 0x0, 0x0, }, { /* 42 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x3C3C, 0xFF0, 0x7FFE, 0xFF0, 0x3C3C, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, }, { /* 43 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x3C0, 0x3C0, 0x3FFC, 0x3C0, 0x3C0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, }, { /* 44 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3C0, 0x3C0, 0x3C0, 0xF00, 0x0, 0x0, 0x0, }, { /* 45 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3FFC, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, }, { /* 46 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3C0, 0x3C0, 0x0, 0x0, 0x0, 0x0, }, { /* 47 */ 0x0, 0x0, 0x0, 0x0, 0x6, 0x1E, 0x78, 0x1E0, 0x780, 0x1E00, 0x7800, 0x6000, 0x0, 0x0, 0x0, 0x0, }, { /* 48 */ 0x0, 0x0, 0x1FF8, 0x781E, 0x781E, 0x787E, 0x799E, 0x799E, 0x7E1E, 0x781E, 0x781E, 0x1FF8, 0x0, 0x0, 0x0, 0x0, }, { /* 49 */ 0x0, 0x0, 0x3C0, 0xFC0, 0x3FC0, 0x3C0, 0x3C0, 0x3C0, 0x3C0, 0x3C0, 0x3C0, 0x3FFC, 0x0, 0x0, 0x0, 0x0, }, { /* 50 */ 0x0, 0x0, 0x1FF8, 0x781E, 0x1E, 0x78, 0x1E0, 0x780, 0x1E00, 0x7800, 0x781E, 0x7FFE, 0x0, 0x0, 0x0, 0x0, }, { /* 51 */ 0x0, 0x0, 0x1FF8, 0x781E, 0x1E, 0x1E, 0x7F8, 0x1E, 0x1E, 0x1E, 0x781E, 0x1FF8, 0x0, 0x0, 0x0, 0x0, }, { /* 52 */ 0x0, 0x0, 0x78, 0x1F8, 0x7F8, 0x1E78, 0x7878, 0x7FFE, 0x78, 0x78, 0x78, 0x1FE, 0x0, 0x0, 0x0, 0x0, }, { /* 53 */ 0x0, 0x0, 0x7FFE, 0x7800, 0x7800, 0x7800, 0x7FF8, 0x7E, 0x1E, 0x1E, 0x781E, 0x1FF8, 0x0, 0x0, 0x0, 0x0, }, { /* 54 */ 0x0, 0x0, 0x7E0, 0x1E00, 0x7800, 0x7800, 0x7FF8, 0x781E, 0x781E, 0x781E, 0x781E, 0x1FF8, 0x0, 0x0, 0x0, 0x0, }, { /* 55 */ 0x0, 0x0, 0x7FFE, 0x781E, 0x1E, 0x1E, 0x78, 0x1E0, 0x780, 0x780, 0x780, 0x780, 0x0, 0x0, 0x0, 0x0, }, { /* 56 */ 0x0, 0x0, 0x1FF8, 0x781E, 0x781E, 0x781E, 0x1FF8, 0x781E, 0x781E, 0x781E, 0x781E, 0x1FF8, 0x0, 0x0, 0x0, 0x0, }, { /* 57 */ 0x0, 0x0, 0x1FF8, 0x781E, 0x781E, 0x781E, 0x1FFE, 0x1E, 0x1E, 0x1E, 0x78, 0x1FE0, 0x0, 0x0, 0x0, 0x0, }, { /* 58 */ 0x0, 0x0, 0x0, 0x0, 0x3C0, 0x3C0, 0x0, 0x0, 0x0, 0x3C0, 0x3C0, 0x0, 0x0, 0x0, 0x0, 0x0, }, { /* 59 */ 0x0, 0x0, 0x0, 0x0, 0x3C0, 0x3C0, 0x0, 0x0, 0x0, 0x3C0, 0x3C0, 0xF00, 0x0, 0x0, 0x0, 0x0, }, { /* 60 */ 0x0, 0x0, 0x0, 0x3C, 0xF0, 0x3C0, 0xF00, 0x3C00, 0xF00, 0x3C0, 0xF0, 0x3C, 0x0, 0x0, 0x0, 0x0, }, { /* 61 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3FFC, 0x0, 0x0, 0x3FFC, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, }, { /* 62 */ 0x0, 0x0, 0x0, 0x3C00, 0xF00, 0x3C0, 0xF0, 0x3C, 0xF0, 0x3C0, 0xF00, 0x3C00, 0x0, 0x0, 0x0, 0x0, }, { /* 63 */ 0x0, 0x0, 0x1FF8, 0x781E, 0x781E, 0x78, 0x1E0, 0x1E0, 0x1E0, 0x0, 0x1E0, 0x1E0, 0x0, 0x0, 0x0, 0x0, }, { /* 64 */ 0x0, 0x0, 0x0, 0x1FF8, 0x781E, 0x781E, 0x79FE, 0x79FE, 0x79FE, 0x79F8, 0x7800, 0x1FF8, 0x0, 0x0, 0x0, 0x0, }, { /* 65 */ 0x0, 0x0, 0x180, 0x7E0, 0x1E78, 0x781E, 0x781E, 0x7FFE, 0x781E, 0x781E, 0x781E, 0x781E, 0x0, 0x0, 0x0, 0x0, }, { /* 66 */ 0x0, 0x0, 0x7FF8, 0x1E1E, 0x1E1E, 0x1E1E, 0x1FF8, 0x1E1E, 0x1E1E, 0x1E1E, 0x1E1E, 0x7FF8, 0x0, 0x0, 0x0, 0x0, }, { /* 67 */ 0x0, 0x0, 0x7F8, 0x1E1E, 0x7806, 0x7800, 0x7800, 0x7800, 0x7800, 0x7806, 0x1E1E, 0x7F8, 0x0, 0x0, 0x0, 0x0, }, { /* 68 */ 0x0, 0x0, 0x7FE0, 0x1E78, 0x1E1E, 0x1E1E, 0x1E1E, 0x1E1E, 0x1E1E, 0x1E1E, 0x1E78, 0x7FE0, 0x0, 0x0, 0x0, 0x0, }, { /* 69 */ 0x0, 0x0, 0x7FFE, 0x1E1E, 0x1E06, 0x1E60, 0x1FE0, 0x1E60, 0x1E00, 0x1E06, 0x1E1E, 0x7FFE, 0x0, 0x0, 0x0, 0x0, }, { /* 70 */ 0x0, 0x0, 0x7FFE, 0x1E1E, 0x1E06, 0x1E60, 0x1FE0, 0x1E60, 0x1E00, 0x1E00, 0x1E00, 0x7F80, 0x0, 0x0, 0x0, 0x0, }, { /* 71 */ 0x0, 0x0, 0x7F8, 0x1E1E, 0x7806, 0x7800, 0x7800, 0x79FE, 0x781E, 0x781E, 0x1E1E, 0x7E6, 0x0, 0x0, 0x0, 0x0, }, { /* 72 */ 0x0, 0x0, 0x781E, 0x781E, 0x781E, 0x781E, 0x7FFE, 0x781E, 0x781E, 0x781E, 0x781E, 0x781E, 0x0, 0x0, 0x0, 0x0, }, { /* 73 */ 0x0, 0x0, 0x7F8, 0x1E0, 0x1E0, 0x1E0, 0x1E0, 0x1E0, 0x1E0, 0x1E0, 0x1E0, 0x7F8, 0x0, 0x0, 0x0, 0x0, }, { /* 74 */ 0x0, 0x0, 0x1FE, 0x78, 0x78, 0x78, 0x78, 0x78, 0x7878, 0x7878, 0x7878, 0x1FE0, 0x0, 0x0, 0x0, 0x0, }, { /* 75 */ 0x0, 0x0, 0x7E1E, 0x1E1E, 0x1E78, 0x1E78, 0x1FE0, 0x1FE0, 0x1E78, 0x1E1E, 0x1E1E, 0x7E1E, 0x0, 0x0, 0x0, 0x0, }, { /* 76 */ 0x0, 0x0, 0x7F80, 0x1E00, 0x1E00, 0x1E00, 0x1E00, 0x1E00, 0x1E00, 0x1E06, 0x1E1E, 0x7FFE, 0x0, 0x0, 0x0, 0x0, }, { /* 77 */ 0x0, 0x0, 0x781E, 0x7E7E, 0x7FFE, 0x7FFE, 0x799E, 0x781E, 0x781E, 0x781E, 0x781E, 0x781E, 0x0, 0x0, 0x0, 0x0, }, { /* 78 */ 0x0, 0x0, 0x781E, 0x7E1E, 0x7F9E, 0x7FFE, 0x79FE, 0x787E, 0x781E, 0x781E, 0x781E, 0x781E, 0x0, 0x0, 0x0, 0x0, }, { /* 79 */ 0x0, 0x0, 0x7E0, 0x1E78, 0x781E, 0x781E, 0x781E, 0x781E, 0x781E, 0x781E, 0x1E78, 0x7E0, 0x0, 0x0, 0x0, 0x0, }, { /* 80 */ 0x0, 0x0, 0x7FF8, 0x1E1E, 0x1E1E, 0x1E1E, 0x1FF8, 0x1E00, 0x1E00, 0x1E00, 0x1E00, 0x7F80, 0x0, 0x0, 0x0, 0x0, }, { /* 81 */ 0x0, 0x0, 0x1FF8, 0x781E, 0x781E, 0x781E, 0x781E, 0x781E, 0x781E, 0x799E, 0x79FE, 0x1FF8, 0x78, 0x7E, 0x0, 0x0, }, { /* 82 */ 0x0, 0x0, 0x7FF8, 0x1E1E, 0x1E1E, 0x1E1E, 0x1FF8, 0x1E78, 0x1E1E, 0x1E1E, 0x1E1E, 0x7E1E, 0x0, 0x0, 0x0, 0x0, }, { /* 83 */ 0x0, 0x0, 0x1FF8, 0x781E, 0x781E, 0x1E00, 0x7E0, 0x78, 0x1E, 0x781E, 0x781E, 0x1FF8, 0x0, 0x0, 0x0, 0x0, }, { /* 84 */ 0x0, 0x0, 0x1FFE, 0x1FFE, 0x19E6, 0x1E0, 0x1E0, 0x1E0, 0x1E0, 0x1E0, 0x1E0, 0x7F8, 0x0, 0x0, 0x0, 0x0, }, { /* 85 */ 0x0, 0x0, 0x781E, 0x781E, 0x781E, 0x781E, 0x781E, 0x781E, 0x781E, 0x781E, 0x781E, 0x1FF8, 0x0, 0x0, 0x0, 0x0, }, { /* 86 */ 0x0, 0x0, 0x781E, 0x781E, 0x781E, 0x781E, 0x781E, 0x781E, 0x781E, 0x1E78, 0x7E0, 0x180, 0x0, 0x0, 0x0, 0x0, }, { /* 87 */ 0x0, 0x0, 0x781E, 0x781E, 0x781E, 0x781E, 0x781E, 0x799E, 0x799E, 0x7FFE, 0x1E78, 0x1E78, 0x0, 0x0, 0x0, 0x0, }, { /* 88 */ 0x0, 0x0, 0x781E, 0x781E, 0x1E78, 0x1E78, 0x7E0, 0x7E0, 0x1E78, 0x1E78, 0x781E, 0x781E, 0x0, 0x0, 0x0, 0x0, }, { /* 89 */ 0x0, 0x0, 0x3C3C, 0x3C3C, 0x3C3C, 0x3C3C, 0xFF0, 0x3C0, 0x3C0, 0x3C0, 0x3C0, 0xFF0, 0x0, 0x0, 0x0, 0x0, }, { /* 90 */ 0x0, 0x0, 0x7FFE, 0x781E, 0x601E, 0x78, 0x1E0, 0x780, 0x1E00, 0x7806, 0x781E, 0x7FFE, 0x0, 0x0, 0x0, 0x0, }, { /* 91 */ 0x0, 0x0, 0xFF0, 0xF00, 0xF00, 0xF00, 0xF00, 0xF00, 0xF00, 0xF00, 0xF00, 0xFF0, 0x0, 0x0, 0x0, 0x0, }, { /* 92 */ 0x0, 0x0, 0x0, 0x6000, 0x7800, 0x7E00, 0x1F80, 0x7E0, 0x1F8, 0x7E, 0x1E, 0x6, 0x0, 0x0, 0x0, 0x0, }, { /* 93 */ 0x0, 0x0, 0xFF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xFF0, 0x0, 0x0, 0x0, 0x0, }, { /* 94 */ 0x180, 0x7E0, 0x1E78, 0x781E, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, }, { /* 95 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xFFFF, 0x0, 0x0, }, { /* 96 */ 0xF00, 0xF00, 0x3C0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, }, { /* 97 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x1FE0, 0x78, 0x1FF8, 0x7878, 0x7878, 0x7878, 0x1F9E, 0x0, 0x0, 0x0, 0x0, }, { /* 98 */ 0x0, 0x0, 0x7E00, 0x1E00, 0x1E00, 0x1FE0, 0x1E78, 0x1E1E, 0x1E1E, 0x1E1E, 0x1E1E, 0x79F8, 0x0, 0x0, 0x0, 0x0, }, { /* 99 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x1FF8, 0x781E, 0x7800, 0x7800, 0x7800, 0x781E, 0x1FF8, 0x0, 0x0, 0x0, 0x0, }, { /* 100 */ 0x0, 0x0, 0x1F8, 0x78, 0x78, 0x7F8, 0x1E78, 0x7878, 0x7878, 0x7878, 0x7878, 0x1F9E, 0x0, 0x0, 0x0, 0x0, }, { /* 101 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x1FF8, 0x781E, 0x7FFE, 0x7800, 0x7800, 0x781E, 0x1FF8, 0x0, 0x0, 0x0, 0x0, }, { /* 102 */ 0x0, 0x0, 0x7E0, 0x1E78, 0x1E18, 0x1E00, 0x7F80, 0x1E00, 0x1E00, 0x1E00, 0x1E00, 0x7F80, 0x0, 0x0, 0x0, 0x0, }, { /* 103 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x1F9E, 0x7878, 0x7878, 0x7878, 0x7878, 0x7878, 0x1FF8, 0x78, 0x7878, 0x1FE0, 0x0, }, { /* 104 */ 0x0, 0x0, 0x7E00, 0x1E00, 0x1E00, 0x1E78, 0x1F9E, 0x1E1E, 0x1E1E, 0x1E1E, 0x1E1E, 0x7E1E, 0x0, 0x0, 0x0, 0x0, }, { /* 105 */ 0x0, 0x0, 0x1E0, 0x1E0, 0x0, 0x7E0, 0x1E0, 0x1E0, 0x1E0, 0x1E0, 0x1E0, 0x7F8, 0x0, 0x0, 0x0, 0x0, }, { /* 106 */ 0x0, 0x0, 0x1E, 0x1E, 0x0, 0x7E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E1E, 0x1E1E, 0x7F8, 0x0, }, { /* 107 */ 0x0, 0x0, 0x7E00, 0x1E00, 0x1E00, 0x1E1E, 0x1E78, 0x1FE0, 0x1FE0, 0x1E78, 0x1E1E, 0x7E1E, 0x0, 0x0, 0x0, 0x0, }, { /* 108 */ 0x0, 0x0, 0x7E0, 0x1E0, 0x1E0, 0x1E0, 0x1E0, 0x1E0, 0x1E0, 0x1E0, 0x1E0, 0x7F8, 0x0, 0x0, 0x0, 0x0, }, { /* 109 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x7E78, 0x7FFE, 0x799E, 0x799E, 0x799E, 0x799E, 0x799E, 0x0, 0x0, 0x0, 0x0, }, { /* 110 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x79F8, 0x1E1E, 0x1E1E, 0x1E1E, 0x1E1E, 0x1E1E, 0x1E1E, 0x0, 0x0, 0x0, 0x0, }, { /* 111 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x1FF8, 0x781E, 0x781E, 0x781E, 0x781E, 0x781E, 0x1FF8, 0x0, 0x0, 0x0, 0x0, }, { /* 112 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x79F8, 0x1E1E, 0x1E1E, 0x1E1E, 0x1E1E, 0x1E1E, 0x1FF8, 0x1E00, 0x1E00, 0x7F80, 0x0, }, { /* 113 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x1F9E, 0x7878, 0x7878, 0x7878, 0x7878, 0x7878, 0x1FF8, 0x78, 0x78, 0x1FE, 0x0, }, { /* 114 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x79F8, 0x1F9E, 0x1E06, 0x1E00, 0x1E00, 0x1E00, 0x7F80, 0x0, 0x0, 0x0, 0x0, }, { /* 115 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x1FF8, 0x781E, 0x1E00, 0x7E0, 0x78, 0x781E, 0x1FF8, 0x0, 0x0, 0x0, 0x0, }, { /* 116 */ 0x0, 0x0, 0x180, 0x780, 0x780, 0x7FF8, 0x780, 0x780, 0x780, 0x780, 0x79E, 0x1F8, 0x0, 0x0, 0x0, 0x0, }, { /* 117 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x7878, 0x7878, 0x7878, 0x7878, 0x7878, 0x7878, 0x1F9E, 0x0, 0x0, 0x0, 0x0, }, { /* 118 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x1E1E, 0x1E1E, 0x1E1E, 0x1E1E, 0x1E1E, 0x7F8, 0x1E0, 0x0, 0x0, 0x0, 0x0, }, { /* 119 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x781E, 0x781E, 0x781E, 0x799E, 0x799E, 0x7FFE, 0x1E78, 0x0, 0x0, 0x0, 0x0, }, { /* 120 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x781E, 0x1E78, 0x7E0, 0x7E0, 0x7E0, 0x1E78, 0x781E, 0x0, 0x0, 0x0, 0x0, }, { /* 121 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x781E, 0x781E, 0x781E, 0x781E, 0x781E, 0x781E, 0x1FFE, 0x1E, 0x78, 0x7FE0, 0x0, }, { /* 122 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x7FFE, 0x7878, 0x1E0, 0x780, 0x1E00, 0x781E, 0x7FFE, 0x0, 0x0, 0x0, 0x0, }, { /* 123 */ 0x0, 0x0, 0xFC, 0x3C0, 0x3C0, 0x3C0, 0xF00, 0x3C0, 0x3C0, 0x3C0, 0x3C0, 0xFC, 0x0, 0x0, 0x0, 0x0, }, { /* 124 */ 0x0, 0x3C0, 0x3C0, 0x3C0, 0x3C0, 0x3C0, 0x3C0, 0x0, 0x0, 0x3C0, 0x3C0, 0x3C0, 0x3C0, 0x3C0, 0x3C0, 0x0, }, { /* 125 */ 0x0, 0x0, 0x3F00, 0x3C0, 0x3C0, 0x3C0, 0xF0, 0x3C0, 0x3C0, 0x3C0, 0x3C0, 0x3F00, 0x0, 0x0, 0x0, 0x0, }, { /* 126 */ 0x0, 0x0, 0x1F9E, 0x79F8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, }, { /* 127 */ 0x0, 0x0, 0x0, 0x0, 0x180, 0x7E0, 0x1E78, 0x781E, 0x781E, 0x781E, 0x7FFE, 0x0, 0x0, 0x0, 0x0, 0x0, }, { /* 128 */ 0x0, 0x0, 0x7F8, 0x1E1E, 0x7806, 0x7800, 0x7800, 0x7800, 0x7806, 0x1E1E, 0x7F8, 0x78, 0x1E, 0x1FF8, 0x0, 0x0, }, { /* 129 */ 0x0, 0x0, 0x7878, 0x7878, 0x0, 0x7878, 0x7878, 0x7878, 0x7878, 0x7878, 0x7878, 0x1F9E, 0x0, 0x0, 0x0, 0x0, }, { /* 130 */ 0x0, 0x78, 0x1E0, 0x780, 0x0, 0x1FF8, 0x781E, 0x7FFE, 0x7800, 0x7800, 0x781E, 0x1FF8, 0x0, 0x0, 0x0, 0x0, }, { /* 131 */ 0x0, 0x180, 0x7E0, 0x1E78, 0x0, 0x1FE0, 0x78, 0x1FF8, 0x7878, 0x7878, 0x7878, 0x1F9E, 0x0, 0x0, 0x0, 0x0, }, { /* 132 */ 0x0, 0x0, 0x7878, 0x7878, 0x0, 0x1FE0, 0x78, 0x1FF8, 0x7878, 0x7878, 0x7878, 0x1F9E, 0x0, 0x0, 0x0, 0x0, }, { /* 133 */ 0x0, 0x1E00, 0x780, 0x1E0, 0x0, 0x1FE0, 0x78, 0x1FF8, 0x7878, 0x7878, 0x7878, 0x1F9E, 0x0, 0x0, 0x0, 0x0, }, { /* 134 */ 0x0, 0x7E0, 0x1E78, 0x7E0, 0x0, 0x1FE0, 0x78, 0x1FF8, 0x7878, 0x7878, 0x7878, 0x1F9E, 0x0, 0x0, 0x0, 0x0, }, { /* 135 */ 0x0, 0x0, 0x0, 0x0, 0xFF0, 0x3C3C, 0x3C00, 0x3C00, 0x3C3C, 0xFF0, 0xF0, 0x3C, 0xFF0, 0x0, 0x0, 0x0, }, { /* 136 */ 0x0, 0x180, 0x7E0, 0x1E78, 0x0, 0x1FF8, 0x781E, 0x7FFE, 0x7800, 0x7800, 0x781E, 0x1FF8, 0x0, 0x0, 0x0, 0x0, }, { /* 137 */ 0x0, 0x0, 0x781E, 0x781E, 0x0, 0x1FF8, 0x781E, 0x7FFE, 0x7800, 0x7800, 0x781E, 0x1FF8, 0x0, 0x0, 0x0, 0x0, }, { /* 138 */ 0x0, 0x1E00, 0x780, 0x1E0, 0x0, 0x1FF8, 0x781E, 0x7FFE, 0x7800, 0x7800, 0x781E, 0x1FF8, 0x0, 0x0, 0x0, 0x0, }, { /* 139 */ 0x0, 0x0, 0x3C3C, 0x3C3C, 0x0, 0xFC0, 0x3C0, 0x3C0, 0x3C0, 0x3C0, 0x3C0, 0xFF0, 0x0, 0x0, 0x0, 0x0, }, { /* 140 */ 0x0, 0x3C0, 0xFF0, 0x3C3C, 0x0, 0xFC0, 0x3C0, 0x3C0, 0x3C0, 0x3C0, 0x3C0, 0xFF0, 0x0, 0x0, 0x0, 0x0, }, { /* 141 */ 0x0, 0x3C00, 0xF00, 0x3C0, 0x0, 0xFC0, 0x3C0, 0x3C0, 0x3C0, 0x3C0, 0x3C0, 0xFF0, 0x0, 0x0, 0x0, 0x0, }, { /* 142 */ 0x0, 0x781E, 0x781E, 0x180, 0x7E0, 0x1E78, 0x781E, 0x781E, 0x7FFE, 0x781E, 0x781E, 0x781E, 0x0, 0x0, 0x0, 0x0, }, { /* 143 */ 0x7E0, 0x1E78, 0x7E0, 0x0, 0x7E0, 0x1E78, 0x781E, 0x781E, 0x7FFE, 0x781E, 0x781E, 0x781E, 0x0, 0x0, 0x0, 0x0, }, { /* 144 */ 0x1E0, 0x780, 0x1E00, 0x0, 0x7FFE, 0x1E1E, 0x1E00, 0x1FF8, 0x1E00, 0x1E00, 0x1E1E, 0x7FFE, 0x0, 0x0, 0x0, 0x0, }, { /* 145 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x7878, 0x1F9E, 0x79E, 0x1FFE, 0x79E0, 0x79E0, 0x1E7E, 0x0, 0x0, 0x0, 0x0, }, { /* 146 */ 0x0, 0x0, 0x7FE, 0x1E78, 0x7878, 0x7878, 0x7FFE, 0x7878, 0x7878, 0x7878, 0x7878, 0x787E, 0x0, 0x0, 0x0, 0x0, }, { /* 147 */ 0x0, 0x180, 0x7E0, 0x1E78, 0x0, 0x1FF8, 0x781E, 0x781E, 0x781E, 0x781E, 0x781E, 0x1FF8, 0x0, 0x0, 0x0, 0x0, }, { /* 148 */ 0x0, 0x0, 0x781E, 0x781E, 0x0, 0x1FF8, 0x781E, 0x781E, 0x781E, 0x781E, 0x781E, 0x1FF8, 0x0, 0x0, 0x0, 0x0, }, { /* 149 */ 0x0, 0x1E00, 0x780, 0x1E0, 0x0, 0x1FF8, 0x781E, 0x781E, 0x781E, 0x781E, 0x781E, 0x1FF8, 0x0, 0x0, 0x0, 0x0, }, { /* 150 */ 0x0, 0x780, 0x1FE0, 0x7878, 0x0, 0x7878, 0x7878, 0x7878, 0x7878, 0x7878, 0x7878, 0x1F9E, 0x0, 0x0, 0x0, 0x0, }, { /* 151 */ 0x0, 0x1E00, 0x780, 0x1E0, 0x0, 0x7878, 0x7878, 0x7878, 0x7878, 0x7878, 0x7878, 0x1F9E, 0x0, 0x0, 0x0, 0x0, }, { /* 152 */ 0x0, 0x0, 0x781E, 0x781E, 0x0, 0x781E, 0x781E, 0x781E, 0x781E, 0x781E, 0x781E, 0x1FFE, 0x1E, 0x78, 0x1FE0, 0x0, }, { /* 153 */ 0x0, 0x781E, 0x781E, 0x0, 0x7E0, 0x1E78, 0x781E, 0x781E, 0x781E, 0x781E, 0x1E78, 0x7E0, 0x0, 0x0, 0x0, 0x0, }, { /* 154 */ 0x0, 0x781E, 0x781E, 0x0, 0x781E, 0x781E, 0x781E, 0x781E, 0x781E, 0x781E, 0x781E, 0x1FF8, 0x0, 0x0, 0x0, 0x0, }, { /* 155 */ 0x0, 0x3C0, 0x3C0, 0xFF0, 0x3C3C, 0x3C00, 0x3C00, 0x3C00, 0x3C3C, 0xFF0, 0x3C0, 0x3C0, 0x0, 0x0, 0x0, 0x0, }, { /* 156 */ 0x0, 0x7E0, 0x1E78, 0x1E18, 0x1E00, 0x7F80, 0x1E00, 0x1E00, 0x1E00, 0x1E00, 0x7E1E, 0x7FF8, 0x0, 0x0, 0x0, 0x0, }, { /* 157 */ 0x0, 0x0, 0x3C3C, 0x3C3C, 0xFF0, 0x3C0, 0x3FFC, 0x3C0, 0x3FFC, 0x3C0, 0x3C0, 0x3C0, 0x0, 0x0, 0x0, 0x0, }, { /* 158 */ 0x0, 0x7FE0, 0x7878, 0x7878, 0x7FE0, 0x7818, 0x7878, 0x79FE, 0x7878, 0x7878, 0x7878, 0x781E, 0x0, 0x0, 0x0, 0x0, }, { /* 159 */ 0x0, 0xFC, 0x3CF, 0x3C0, 0x3C0, 0x3C0, 0x3FFC, 0x3C0, 0x3C0, 0x3C0, 0x3C0, 0x3C0, 0xF3C0, 0x3F00, 0x0, 0x0, }, { /* 160 */ 0x0, 0x1E0, 0x780, 0x1E00, 0x0, 0x1FE0, 0x78, 0x1FF8, 0x7878, 0x7878, 0x7878, 0x1F9E, 0x0, 0x0, 0x0, 0x0, }, { /* 161 */ 0x0, 0xF0, 0x3C0, 0xF00, 0x0, 0xFC0, 0x3C0, 0x3C0, 0x3C0, 0x3C0, 0x3C0, 0xFF0, 0x0, 0x0, 0x0, 0x0, }, { /* 162 */ 0x0, 0x1E0, 0x780, 0x1E00, 0x0, 0x1FF8, 0x781E, 0x781E, 0x781E, 0x781E, 0x781E, 0x1FF8, 0x0, 0x0, 0x0, 0x0, }, { /* 163 */ 0x0, 0x1E0, 0x780, 0x1E00, 0x0, 0x7878, 0x7878, 0x7878, 0x7878, 0x7878, 0x7878, 0x1F9E, 0x0, 0x0, 0x0, 0x0, }, { /* 164 */ 0x0, 0x0, 0x1F9E, 0x79F8, 0x0, 0x79F8, 0x1E1E, 0x1E1E, 0x1E1E, 0x1E1E, 0x1E1E, 0x1E1E, 0x0, 0x0, 0x0, 0x0, }, { /* 165 */ 0x1F9E, 0x79F8, 0x0, 0x781E, 0x7E1E, 0x7F9E, 0x7FFE, 0x79FE, 0x787E, 0x781E, 0x781E, 0x781E, 0x0, 0x0, 0x0, 0x0, }, { /* 166 */ 0x0, 0xFF0, 0x3CF0, 0x3CF0, 0xFFC, 0x0, 0x3FFC, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, }, { /* 167 */ 0x0, 0x7E0, 0x1E78, 0x1E78, 0x7E0, 0x0, 0x1FF8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, }, { /* 168 */ 0x0, 0x0, 0x780, 0x780, 0x0, 0x780, 0x780, 0x1E00, 0x7800, 0x781E, 0x781E, 0x1FF8, 0x0, 0x0, 0x0, 0x0, }, { /* 169 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xFFFC, 0xF000, 0xF000, 0xF000, 0xF000, 0x0, 0x0, 0x0, 0x0, 0x0, }, { /* 170 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xFFFC, 0x3C, 0x3C, 0x3C, 0x3C, 0x0, 0x0, 0x0, 0x0, 0x0, }, { /* 171 */ 0x0, 0x7000, 0x7000, 0x700C, 0x703C, 0x70F0, 0x3C0, 0xF00, 0x3C00, 0xF0FC, 0xC30E, 0x3C, 0xF0, 0x3FE, 0x0, 0x0, }, { /* 172 */ 0x0, 0x7000, 0x7000, 0x700C, 0x703C, 0x70F0, 0x3C0, 0xF00, 0x3C3C, 0xF0FC, 0xC38C, 0x7FE, 0x3C, 0xFE, 0x0, 0x0, }, { /* 173 */ 0x0, 0x0, 0x3C0, 0x3C0, 0x0, 0x3C0, 0x3C0, 0x3C0, 0x7E0, 0x7E0, 0x7E0, 0x3C0, 0x0, 0x0, 0x0, 0x0, }, { /* 174 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0xE0E, 0x3C3C, 0x7070, 0x3C3C, 0xE0E, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, }, { /* 175 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x7070, 0x3C3C, 0xE0E, 0x3C3C, 0x7070, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, }, { /* 176 */ 0x303, 0x3030, 0x303, 0x3030, 0x303, 0x3030, 0x303, 0x3030, 0x303, 0x3030, 0x303, 0x3030, 0x303, 0x3030, 0x303, 0x3030, }, { /* 177 */ 0xAAAA, 0x5555, 0xAAAA, 0x5555, 0xAAAA, 0x5555, 0xAAAA, 0x5555, 0xAAAA, 0x5555, 0xAAAA, 0x5555, 0xAAAA, 0x5555, 0xAAAA, 0x5555, }, { /* 178 */ 0xF3F3, 0x3F3F, 0xF3F3, 0x3F3F, 0xF3F3, 0x3F3F, 0xF3F3, 0x3F3F, 0xF3F3, 0x3F3F, 0xF3F3, 0x3F3F, 0xF3F3, 0x3F3F, 0xF3F3, 0x3F3F, }, { /* 179 */ 0x3C0, 0x3C0, 0x3C0, 0x3C0, 0x3C0, 0x3C0, 0x3C0, 0x3C0, 0x3C0, 0x3C0, 0x3C0, 0x3C0, 0x3C0, 0x3C0, 0x3C0, 0x3C0, }, { /* 180 */ 0x3C0, 0x3C0, 0x3C0, 0x3C0, 0x3C0, 0x3C0, 0x3C0, 0xFFC0, 0x3C0, 0x3C0, 0x3C0, 0x3C0, 0x3C0, 0x3C0, 0x3C0, 0x3C0, }, { /* 181 */ 0x3C0, 0x3C0, 0x3C0, 0x3C0, 0x3C0, 0xFFC0, 0x3C0, 0xFFC0, 0x3C0, 0x3C0, 0x3C0, 0x3C0, 0x3C0, 0x3C0, 0x3C0, 0x3C0, }, { /* 182 */ 0xF3C, 0xF3C, 0xF3C, 0xF3C, 0xF3C, 0xF3C, 0xF3C, 0xFF3C, 0xF3C, 0xF3C, 0xF3C, 0xF3C, 0xF3C, 0xF3C, 0xF3C, 0xF3C, }, { /* 183 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xFFFC, 0xF3C, 0xF3C, 0xF3C, 0xF3C, 0xF3C, 0xF3C, 0xF3C, 0xF3C, }, { /* 184 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0xFFC0, 0x3C0, 0xFFC0, 0x3C0, 0x3C0, 0x3C0, 0x3C0, 0x3C0, 0x3C0, 0x3C0, 0x3C0, }, { /* 185 */ 0xF3C, 0xF3C, 0xF3C, 0xF3C, 0xF3C, 0xFF3C, 0x3C, 0xFF3C, 0xF3C, 0xF3C, 0xF3C, 0xF3C, 0xF3C, 0xF3C, 0xF3C, 0xF3C, }, { /* 186 */ 0xF3C, 0xF3C, 0xF3C, 0xF3C, 0xF3C, 0xF3C, 0xF3C, 0xF3C, 0xF3C, 0xF3C, 0xF3C, 0xF3C, 0xF3C, 0xF3C, 0xF3C, 0xF3C, }, { /* 187 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0xFFFC, 0x3C, 0xFF3C, 0xF3C, 0xF3C, 0xF3C, 0xF3C, 0xF3C, 0xF3C, 0xF3C, 0xF3C, }, { /* 188 */ 0xF3C, 0xF3C, 0xF3C, 0xF3C, 0xF3C, 0xFF3C, 0x3C, 0xFFFC, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, }, { /* 189 */ 0xF3C, 0xF3C, 0xF3C, 0xF3C, 0xF3C, 0xF3C, 0xF3C, 0xFFFC, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, }, { /* 190 */ 0x3C0, 0x3C0, 0x3C0, 0x3C0, 0x3C0, 0xFFC0, 0x3C0, 0xFFC0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, }, { /* 191 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xFFC0, 0x3C0, 0x3C0, 0x3C0, 0x3C0, 0x3C0, 0x3C0, 0x3C0, 0x3C0, }, { /* 192 */ 0x3C0, 0x3C0, 0x3C0, 0x3C0, 0x3C0, 0x3C0, 0x3C0, 0x3FF, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, }, { /* 193 */ 0x3C0, 0x3C0, 0x3C0, 0x3C0, 0x3C0, 0x3C0, 0x3C0, 0xFFFF, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, }, { /* 194 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xFFFF, 0x3C0, 0x3C0, 0x3C0, 0x3C0, 0x3C0, 0x3C0, 0x3C0, 0x3C0, }, { /* 195 */ 0x3C0, 0x3C0, 0x3C0, 0x3C0, 0x3C0, 0x3C0, 0x3C0, 0x3FF, 0x3C0, 0x3C0, 0x3C0, 0x3C0, 0x3C0, 0x3C0, 0x3C0, 0x3C0, }, { /* 196 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xFFFF, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, }, { /* 197 */ 0x3C0, 0x3C0, 0x3C0, 0x3C0, 0x3C0, 0x3C0, 0x3C0, 0xFFFF, 0x3C0, 0x3C0, 0x3C0, 0x3C0, 0x3C0, 0x3C0, 0x3C0, 0x3C0, }, { /* 198 */ 0x3C0, 0x3C0, 0x3C0, 0x3C0, 0x3C0, 0x3FF, 0x3C0, 0x3FF, 0x3C0, 0x3C0, 0x3C0, 0x3C0, 0x3C0, 0x3C0, 0x3C0, 0x3C0, }, { /* 199 */ 0xF3C, 0xF3C, 0xF3C, 0xF3C, 0xF3C, 0xF3C, 0xF3C, 0xF3F, 0xF3C, 0xF3C, 0xF3C, 0xF3C, 0xF3C, 0xF3C, 0xF3C, 0xF3C, }, { /* 200 */ 0xF3C, 0xF3C, 0xF3C, 0xF3C, 0xF3C, 0xF3F, 0xF00, 0xFFF, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, }, { /* 201 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0xFFF, 0xF00, 0xF3F, 0xF3C, 0xF3C, 0xF3C, 0xF3C, 0xF3C, 0xF3C, 0xF3C, 0xF3C, }, { /* 202 */ 0xF3C, 0xF3C, 0xF3C, 0xF3C, 0xF3C, 0xFF3F, 0x0, 0xFFFF, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, }, { /* 203 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0xFFFF, 0x0, 0xFF3F, 0xF3C, 0xF3C, 0xF3C, 0xF3C, 0xF3C, 0xF3C, 0xF3C, 0xF3C, }, { /* 204 */ 0xF3C, 0xF3C, 0xF3C, 0xF3C, 0xF3C, 0xF3F, 0xF00, 0xF3F, 0xF3C, 0xF3C, 0xF3C, 0xF3C, 0xF3C, 0xF3C, 0xF3C, 0xF3C, }, { /* 205 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0xFFFF, 0x0, 0xFFFF, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, }, { /* 206 */ 0xF3C, 0xF3C, 0xF3C, 0xF3C, 0xF3C, 0xFF3F, 0x0, 0xFF3F, 0xF3C, 0xF3C, 0xF3C, 0xF3C, 0xF3C, 0xF3C, 0xF3C, 0xF3C, }, { /* 207 */ 0x3C0, 0x3C0, 0x3C0, 0x3C0, 0x3C0, 0xFFFF, 0x0, 0xFFFF, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, }, { /* 208 */ 0xF3C, 0xF3C, 0xF3C, 0xF3C, 0xF3C, 0xF3C, 0xF3C, 0xFFFF, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, }, { /* 209 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0xFFFF, 0x0, 0xFFFF, 0x3C0, 0x3C0, 0x3C0, 0x3C0, 0x3C0, 0x3C0, 0x3C0, 0x3C0, }, { /* 210 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xFFFF, 0xF3C, 0xF3C, 0xF3C, 0xF3C, 0xF3C, 0xF3C, 0xF3C, 0xF3C, }, { /* 211 */ 0xF3C, 0xF3C, 0xF3C, 0xF3C, 0xF3C, 0xF3C, 0xF3C, 0xFFF, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, }, { /* 212 */ 0x3C0, 0x3C0, 0x3C0, 0x3C0, 0x3C0, 0x3FF, 0x3C0, 0x3FF, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, }, { /* 213 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x3FF, 0x3C0, 0x3FF, 0x3C0, 0x3C0, 0x3C0, 0x3C0, 0x3C0, 0x3C0, 0x3C0, 0x3C0, }, { /* 214 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xFFF, 0xF3C, 0xF3C, 0xF3C, 0xF3C, 0xF3C, 0xF3C, 0xF3C, 0xF3C, }, { /* 215 */ 0xF3C, 0xF3C, 0xF3C, 0xF3C, 0xF3C, 0xF3C, 0xF3C, 0xFFFF, 0xF3C, 0xF3C, 0xF3C, 0xF3C, 0xF3C, 0xF3C, 0xF3C, 0xF3C, }, { /* 216 */ 0x3C0, 0x3C0, 0x3C0, 0x3C0, 0x3C0, 0xFFFF, 0x3C0, 0xFFFF, 0x3C0, 0x3C0, 0x3C0, 0x3C0, 0x3C0, 0x3C0, 0x3C0, 0x3C0, }, { /* 217 */ 0x3C0, 0x3C0, 0x3C0, 0x3C0, 0x3C0, 0x3C0, 0x3C0, 0xFFC0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, }, { /* 218 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3FF, 0x3C0, 0x3C0, 0x3C0, 0x3C0, 0x3C0, 0x3C0, 0x3C0, 0x3C0, }, { /* 219 */ 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, }, { /* 220 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, }, { /* 221 */ 0xFF00, 0xFF00, 0xFF00, 0xFF00, 0xFF00, 0xFF00, 0xFF00, 0xFF00, 0xFF00, 0xFF00, 0xFF00, 0xFF00, 0xFF00, 0xFF00, 0xFF00, 0xFF00, }, { /* 222 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, }, { /* 223 */ 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, }, { /* 224 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x1F9E, 0x79F8, 0x79E0, 0x79E0, 0x79E0, 0x79F8, 0x1F9E, 0x0, 0x0, 0x0, 0x0, }, { /* 225 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x7FF8, 0x781E, 0x7FF8, 0x781E, 0x781E, 0x7FF8, 0x7800, 0x7800, 0x7800, 0x0, 0x0, }, { /* 226 */ 0x0, 0x0, 0x7FFE, 0x781E, 0x781E, 0x7800, 0x7800, 0x7800, 0x7800, 0x7800, 0x7800, 0x7800, 0x0, 0x0, 0x0, 0x0, }, { /* 227 */ 0x0, 0x0, 0x0, 0x0, 0x7FFE, 0x7FFE, 0x1E78, 0x1E78, 0x1E78, 0x1E78, 0x1E78, 0x1E78, 0x0, 0x0, 0x0, 0x0, }, { /* 228 */ 0x0, 0x0, 0x0, 0x7FFE, 0x781E, 0x1E00, 0x780, 0x1E0, 0x780, 0x1E00, 0x781E, 0x7FFE, 0x0, 0x0, 0x0, 0x0, }, { /* 229 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x1FFE, 0x79E0, 0x79E0, 0x79E0, 0x79E0, 0x79E0, 0x1F80, 0x0, 0x0, 0x0, 0x0, }, { /* 230 */ 0x0, 0x0, 0x0, 0x0, 0x1E1E, 0x1E1E, 0x1E1E, 0x1E1E, 0x1E1E, 0x1FF8, 0x1E00, 0x1E00, 0x7800, 0x0, 0x0, 0x0, }, { /* 231 */ 0x0, 0x0, 0x0, 0x0, 0x1F9E, 0x79F8, 0x1E0, 0x1E0, 0x1E0, 0x1E0, 0x1E0, 0x1E0, 0x0, 0x0, 0x0, 0x0, }, { /* 232 */ 0x0, 0x0, 0x0, 0x3FFC, 0x3C0, 0xFF0, 0x3C3C, 0x3C3C, 0x3C3C, 0xFF0, 0x3C0, 0x3FFC, 0x0, 0x0, 0x0, 0x0, }, { /* 233 */ 0x0, 0x0, 0x0, 0x7E0, 0x1E78, 0x781E, 0x781E, 0x7FFE, 0x781E, 0x781E, 0x1E78, 0x7E0, 0x0, 0x0, 0x0, 0x0, }, { /* 234 */ 0x0, 0x0, 0x7E0, 0x1E78, 0x781E, 0x781E, 0x781E, 0x1E78, 0x1E78, 0x1E78, 0x1E78, 0x7E7E, 0x0, 0x0, 0x0, 0x0, }, { /* 235 */ 0x0, 0x0, 0x3FC, 0xF00, 0x3C0, 0xF0, 0xFFC, 0x3C3C, 0x3C3C, 0x3C3C, 0x3C3C, 0xFF0, 0x0, 0x0, 0x0, 0x0, }, { /* 236 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x3E7C, 0x73CE, 0x73CE, 0x73CE, 0x3E7C, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, }, { /* 237 */ 0x0, 0x0, 0x0, 0xF, 0x3C, 0x3FFC, 0xF0FF, 0xF3CF, 0xFF0F, 0x3FFC, 0x3C00, 0xF000, 0x0, 0x0, 0x0, 0x0, }, { /* 238 */ 0x0, 0x0, 0x3F0, 0xF00, 0x1C00, 0x1C00, 0x1FF0, 0x1C00, 0x1C00, 0x1C00, 0xF00, 0x3F0, 0x0, 0x0, 0x0, 0x0, }, { /* 239 */ 0x0, 0x0, 0x0, 0x1FF8, 0x781E, 0x781E, 0x781E, 0x781E, 0x781E, 0x781E, 0x781E, 0x781E, 0x0, 0x0, 0x0, 0x0, }, { /* 240 */ 0x0, 0x0, 0x0, 0x0, 0x7FFE, 0x0, 0x0, 0x7FFE, 0x0, 0x0, 0x7FFE, 0x0, 0x0, 0x0, 0x0, 0x0, }, { /* 241 */ 0x0, 0x0, 0x0, 0x0, 0x3C0, 0x3C0, 0x3FFC, 0x3C0, 0x3C0, 0x0, 0x0, 0x3FFC, 0x0, 0x0, 0x0, 0x0, }, { /* 242 */ 0x0, 0x0, 0x0, 0xF00, 0x3C0, 0xF0, 0x38, 0xF0, 0x3C0, 0xF00, 0x0, 0xFF8, 0x0, 0x0, 0x0, 0x0, }, { /* 243 */ 0x0, 0x0, 0x0, 0xF0, 0x3C0, 0xF00, 0x1C00, 0xF00, 0x3C0, 0xF0, 0x0, 0x1FF0, 0x0, 0x0, 0x0, 0x0, }, { /* 244 */ 0x0, 0x0, 0xFC, 0x3CF, 0x3CF, 0x3C0, 0x3C0, 0x3C0, 0x3C0, 0x3C0, 0x3C0, 0x3C0, 0x3C0, 0x3C0, 0x3C0, 0x3C0, }, { /* 245 */ 0x3C0, 0x3C0, 0x3C0, 0x3C0, 0x3C0, 0x3C0, 0x3C0, 0x3C0, 0xF3C0, 0xF3C0, 0xF3C0, 0x3F00, 0x0, 0x0, 0x0, 0x0, }, { /* 246 */ 0x0, 0x0, 0x0, 0x0, 0x3C0, 0x3C0, 0x0, 0x3FFC, 0x0, 0x3C0, 0x3C0, 0x0, 0x0, 0x0, 0x0, 0x0, }, { /* 247 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x1F9E, 0x79F8, 0x0, 0x1F9E, 0x79F8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, }, { /* 248 */ 0x0, 0x7E0, 0x1E78, 0x1E78, 0x7E0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, }, { /* 249 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3C0, 0x3C0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, }, { /* 250 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3C0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, }, { /* 251 */ 0x0, 0xFF, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0x70F0, 0x38F0, 0x1CF0, 0xFF0, 0x3F0, 0x0, 0x0, 0x0, 0x0, }, { /* 252 */ 0x0, 0x79E0, 0x1E78, 0x1E78, 0x1E78, 0x1E78, 0x1E78, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, }, { /* 253 */ 0x0, 0x1F80, 0x61E0, 0x780, 0x1E00, 0x7860, 0x7FE0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, }, { /* 254 */ 0x0, 0x0, 0x0, 0x0, 0x1FF8, 0x1FF8, 0x1FF8, 0x1FF8, 0x1FF8, 0x1FF8, 0x1FF8, 0x0, 0x0, 0x0, 0x0, 0x0, }, { /* 255 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, }, }; #endif /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/t38_gateway.c0000644000175000017500000025351311150047205020167 0ustar julienjulien//#define LOG_FAX_AUDIO /* * SpanDSP - a series of DSP components for telephony * * t38_gateway.c - A T.38 gateway, less the packet exchange part * * Written by Steve Underwood * * Copyright (C) 2005, 2006, 2007 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: t38_gateway.c,v 1.129 2008/07/25 13:56:54 steveu Exp $ */ /*! \file */ #if defined(HAVE_CONFIG_H) #include "config.h" #endif #include #include #include #include #include #include #include "floating_fudge.h" #if defined(HAVE_TGMATH_H) #include #endif #if defined(HAVE_MATH_H) #include #endif #include #if defined(LOG_FAX_AUDIO) #include #endif #include #include "spandsp/telephony.h" #include "spandsp/logging.h" #include "spandsp/queue.h" #include "spandsp/dc_restore.h" #include "spandsp/bit_operations.h" #include "spandsp/power_meter.h" #include "spandsp/complex.h" #include "spandsp/tone_generate.h" #include "spandsp/async.h" #include "spandsp/crc.h" #include "spandsp/hdlc.h" #include "spandsp/silence_gen.h" #include "spandsp/fsk.h" #include "spandsp/v29rx.h" #include "spandsp/v29tx.h" #include "spandsp/v27ter_rx.h" #include "spandsp/v27ter_tx.h" #include "spandsp/v17rx.h" #include "spandsp/v17tx.h" #include "spandsp/t4.h" #include "spandsp/t30_fcf.h" #include "spandsp/t35.h" #include "spandsp/t30.h" #include "spandsp/t30_logging.h" #include "spandsp/fax_modems.h" #include "spandsp/t38_core.h" #include "spandsp/t38_gateway.h" /* This is the target time per transmission chunk. The actual packet timing will sync to the data octets. */ #define MS_PER_TX_CHUNK 30 #define HDLC_START_BUFFER_LEVEL 8 #define INDICATOR_TX_COUNT 3 #define DATA_TX_COUNT 1 #define DATA_END_TX_COUNT 3 enum { DISBIT1 = 0x01, DISBIT2 = 0x02, DISBIT3 = 0x04, DISBIT4 = 0x08, DISBIT5 = 0x10, DISBIT6 = 0x20, DISBIT7 = 0x40, DISBIT8 = 0x80 }; enum { T38_NONE, T38_V27TER_RX, T38_V29_RX, T38_V17_RX }; enum { HDLC_FLAG_FINISHED = 0x01, HDLC_FLAG_CORRUPT_CRC = 0x02, HDLC_FLAG_PROCEED_WITH_OUTPUT = 0x04, HDLC_FLAG_MISSING_DATA = 0x08 }; enum { FLAG_INDICATOR = 0x100, FLAG_DATA = 0x200 }; #define MAX_NSX_SUPPRESSION 10 static uint8_t nsx_overwrite[2][MAX_NSX_SUPPRESSION] = { {0xFF, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {0xFF, 0, 0, 0, 0, 0, 0, 0, 0, 0}, }; static int restart_rx_modem(t38_gateway_state_t *s); static void add_to_non_ecm_modem_buffer(t38_gateway_state_t *s, const uint8_t *buf, int len); static int non_ecm_get_bit(void *user_data); static int process_rx_indicator(t38_core_state_t *t, void *user_data, int indicator); static int dummy_rx(void *user_data, const int16_t amp[], int len) { return 0; } /*- End of function --------------------------------------------------------*/ static void set_rx_handler(t38_gateway_state_t *s, span_rx_handler_t *handler, void *user_data) { if (s->audio.immediate_rx_handler != dummy_rx) s->audio.immediate_rx_handler = handler; s->audio.rx_handler = handler; s->audio.rx_user_data = user_data; } /*- End of function --------------------------------------------------------*/ static void set_rx_active(t38_gateway_state_t *s, int active) { s->audio.immediate_rx_handler = (active) ? s->audio.rx_handler : dummy_rx; } /*- End of function --------------------------------------------------------*/ static int early_v17_rx(void *user_data, const int16_t amp[], int len) { t38_gateway_state_t *s; s = (t38_gateway_state_t *) user_data; v17_rx(&(s->audio.modems.v17_rx), amp, len); fsk_rx(&(s->audio.modems.v21_rx), amp, len); if (s->audio.rx_signal_present) { if (s->audio.rx_trained) { /* The fast modem has trained, so we no longer need to run the slow one in parallel. */ span_log(&s->logging, SPAN_LOG_FLOW, "Switching from V.17 + V.21 to V.17 (%.2fdBm0)\n", v17_rx_signal_power(&(s->audio.modems.v17_rx))); set_rx_handler(s, (span_rx_handler_t *) &v17_rx, &(s->audio.modems.v17_rx)); } else { span_log(&s->logging, SPAN_LOG_FLOW, "Switching from V.17 + V.21 to V.21 (%.2fdBm0)\n", fsk_rx_signal_power(&(s->audio.modems.v21_rx))); set_rx_handler(s, (span_rx_handler_t *) &fsk_rx, &(s->audio.modems.v21_rx)); } } return 0; } /*- End of function --------------------------------------------------------*/ static int early_v27ter_rx(void *user_data, const int16_t amp[], int len) { t38_gateway_state_t *s; s = (t38_gateway_state_t *) user_data; v27ter_rx(&(s->audio.modems.v27ter_rx), amp, len); fsk_rx(&(s->audio.modems.v21_rx), amp, len); if (s->audio.rx_signal_present) { if (s->audio.rx_trained) { /* The fast modem has trained, so we no longer need to run the slow one in parallel. */ span_log(&s->logging, SPAN_LOG_FLOW, "Switching from V.27ter + V.21 to V.27ter (%.2fdBm0)\n", v27ter_rx_signal_power(&(s->audio.modems.v27ter_rx))); set_rx_handler(s, (span_rx_handler_t *) &v27ter_rx, &(s->audio.modems.v27ter_rx)); } else { span_log(&s->logging, SPAN_LOG_FLOW, "Switching from V.27ter + V.21 to V.21 (%.2fdBm0)\n", fsk_rx_signal_power(&(s->audio.modems.v21_rx))); set_rx_handler(s, (span_rx_handler_t *) &fsk_rx, &(s->audio.modems.v21_rx)); } } return 0; } /*- End of function --------------------------------------------------------*/ static int early_v29_rx(void *user_data, const int16_t amp[], int len) { t38_gateway_state_t *s; s = (t38_gateway_state_t *) user_data; v29_rx(&(s->audio.modems.v29_rx), amp, len); fsk_rx(&(s->audio.modems.v21_rx), amp, len); if (s->audio.rx_signal_present) { if (s->audio.rx_trained) { /* The fast modem has trained, so we no longer need to run the slow one in parallel. */ span_log(&s->logging, SPAN_LOG_FLOW, "Switching from V.29 + V.21 to V.29 (%.2fdBm0)\n", v29_rx_signal_power(&(s->audio.modems.v29_rx))); set_rx_handler(s, (span_rx_handler_t *) &v29_rx, &(s->audio.modems.v29_rx)); } else { span_log(&s->logging, SPAN_LOG_FLOW, "Switching from V.29 + V.21 to V.21 (%.2fdBm0)\n", fsk_rx_signal_power(&(s->audio.modems.v21_rx))); set_rx_handler(s, (span_rx_handler_t *) &fsk_rx, &(s->audio.modems.v21_rx)); } } return 0; } /*- End of function --------------------------------------------------------*/ static void hdlc_underflow_handler(void *user_data) { t38_gateway_state_t *s; int old_data_type; s = (t38_gateway_state_t *) user_data; span_log(&s->logging, SPAN_LOG_FLOW, "HDLC underflow at %d\n", s->hdlc_to_modem.out); /* If the current HDLC buffer is not at the HDLC_FLAG_PROCEED_WITH_OUTPUT stage, this underflow must be an end of preamble condition. */ if ((s->hdlc_to_modem.flags[s->hdlc_to_modem.out] & HDLC_FLAG_PROCEED_WITH_OUTPUT)) { old_data_type = s->hdlc_to_modem.contents[s->hdlc_to_modem.out]; s->hdlc_to_modem.len[s->hdlc_to_modem.out] = 0; s->hdlc_to_modem.flags[s->hdlc_to_modem.out] = 0; s->hdlc_to_modem.contents[s->hdlc_to_modem.out] = 0; if (++s->hdlc_to_modem.out >= T38_TX_HDLC_BUFS) s->hdlc_to_modem.out = 0; span_log(&s->logging, SPAN_LOG_FLOW, "HDLC next is 0x%X\n", s->hdlc_to_modem.contents[s->hdlc_to_modem.out]); if ((s->hdlc_to_modem.contents[s->hdlc_to_modem.out] & FLAG_INDICATOR)) { /* The next thing in the queue is an indicator, so we need to stop this modem. */ span_log(&s->logging, SPAN_LOG_FLOW, "HDLC shutdown\n"); hdlc_tx_frame(&s->audio.modems.hdlc_tx, NULL, 0); } else if ((s->hdlc_to_modem.contents[s->hdlc_to_modem.out] & FLAG_DATA)) { /* Check if we should start sending the next frame */ if ((s->hdlc_to_modem.flags[s->hdlc_to_modem.out] & HDLC_FLAG_PROCEED_WITH_OUTPUT)) { /* This frame is ready to go, and uses the same modem we are running now. So, send whatever we have. This might or might not be an entire frame. */ span_log(&s->logging, SPAN_LOG_FLOW, "HDLC start next frame\n"); hdlc_tx_frame(&s->audio.modems.hdlc_tx, s->hdlc_to_modem.buf[s->hdlc_to_modem.out], s->hdlc_to_modem.len[s->hdlc_to_modem.out]); if ((s->hdlc_to_modem.flags[s->hdlc_to_modem.out] & HDLC_FLAG_CORRUPT_CRC)) hdlc_tx_corrupt_frame(&s->audio.modems.hdlc_tx); } } } } /*- End of function --------------------------------------------------------*/ static int set_next_tx_type(t38_gateway_state_t *s) { tone_gen_descriptor_t tone_desc; get_bit_func_t get_bit_func; void *get_bit_user_data; int indicator; if (s->audio.next_tx_handler) { /* There is a handler queued, so that is the next one */ s->audio.tx_handler = s->audio.next_tx_handler; s->audio.tx_user_data = s->audio.next_tx_user_data; s->audio.next_tx_handler = NULL; if (s->audio.tx_handler == (span_tx_handler_t *) &(silence_gen) || s->audio.tx_handler == (span_tx_handler_t *) &(tone_gen)) { set_rx_active(s, TRUE); } else { set_rx_active(s, FALSE); } return TRUE; } if (s->hdlc_to_modem.in == s->hdlc_to_modem.out) return FALSE; if ((s->hdlc_to_modem.contents[s->hdlc_to_modem.out] & FLAG_INDICATOR) == 0) return FALSE; indicator = (s->hdlc_to_modem.contents[s->hdlc_to_modem.out] & 0xFF); s->hdlc_to_modem.len[s->hdlc_to_modem.out] = 0; s->hdlc_to_modem.flags[s->hdlc_to_modem.out] = 0; s->hdlc_to_modem.contents[s->hdlc_to_modem.out] = 0; if (++s->hdlc_to_modem.out >= T38_TX_HDLC_BUFS) s->hdlc_to_modem.out = 0; span_log(&s->logging, SPAN_LOG_FLOW, "Changing to %s\n", t38_indicator_to_str(indicator)); if (s->image_data_mode && s->ecm_mode) { span_log(&s->logging, SPAN_LOG_FLOW, "HDLC mode\n"); hdlc_tx_init(&s->audio.modems.hdlc_tx, FALSE, 2, TRUE, hdlc_underflow_handler, s); get_bit_func = (get_bit_func_t) hdlc_tx_get_bit; get_bit_user_data = (void *) &s->audio.modems.hdlc_tx; } else { span_log(&s->logging, SPAN_LOG_FLOW, "non-ECM mode\n"); get_bit_func = non_ecm_get_bit; get_bit_user_data = (void *) s; } switch (indicator) { case T38_IND_NO_SIGNAL: /* Impose 75ms minimum on transmitted silence */ //silence_gen_set(&s->audio.modems.silence_gen, ms_to_samples(75)); s->audio.tx_handler = (span_tx_handler_t *) &(silence_gen); s->audio.tx_user_data = &(s->audio.modems.silence_gen); s->audio.next_tx_handler = NULL; set_rx_active(s, TRUE); break; case T38_IND_CNG: /* 0.5s of 1100Hz + 3.0s of silence repeating */ make_tone_gen_descriptor(&tone_desc, 1100, -11, 0, 0, 500, 3000, 0, 0, TRUE); tone_gen_init(&(s->audio.modems.tone_gen), &tone_desc); s->audio.tx_handler = (span_tx_handler_t *) &(tone_gen); s->audio.tx_user_data = &(s->audio.modems.tone_gen); silence_gen_set(&s->audio.modems.silence_gen, 0); s->audio.next_tx_handler = (span_tx_handler_t *) &(silence_gen); s->audio.next_tx_user_data = &(s->audio.modems.silence_gen); set_rx_active(s, TRUE); break; case T38_IND_CED: /* 0.2s of silence, then 2.6s to 4s of 2100Hz tone, then 75ms of silence. */ silence_gen_alter(&s->audio.modems.silence_gen, ms_to_samples(200)); make_tone_gen_descriptor(&tone_desc, 2100, -11, 0, 0, 2600, 75, 0, 0, FALSE); tone_gen_init(&(s->audio.modems.tone_gen), &tone_desc); s->audio.tx_handler = (span_tx_handler_t *) &(silence_gen); s->audio.tx_user_data = &(s->audio.modems.silence_gen); s->audio.next_tx_handler = (span_tx_handler_t *) &(tone_gen); s->audio.next_tx_user_data = &(s->audio.modems.tone_gen); set_rx_active(s, TRUE); break; case T38_IND_V21_PREAMBLE: hdlc_tx_init(&s->audio.modems.hdlc_tx, FALSE, 2, TRUE, hdlc_underflow_handler, s); hdlc_tx_flags(&s->audio.modems.hdlc_tx, 32); s->hdlc_to_modem.len[s->hdlc_to_modem.in] = 0; fsk_tx_init(&(s->audio.modems.v21_tx), &preset_fsk_specs[FSK_V21CH2], (get_bit_func_t) hdlc_tx_get_bit, &s->audio.modems.hdlc_tx); /* Impose a minimum silence */ silence_gen_alter(&s->audio.modems.silence_gen, ms_to_samples(75)); s->audio.tx_handler = (span_tx_handler_t *) &(silence_gen); s->audio.tx_user_data = &(s->audio.modems.silence_gen); s->audio.next_tx_handler = (span_tx_handler_t *) &(fsk_tx); s->audio.next_tx_user_data = &(s->audio.modems.v21_tx); set_rx_active(s, TRUE); break; case T38_IND_V27TER_2400_TRAINING: silence_gen_alter(&s->audio.modems.silence_gen, ms_to_samples(75)); hdlc_tx_flags(&s->audio.modems.hdlc_tx, 60); v27ter_tx_restart(&(s->audio.modems.v27ter_tx), 2400, s->audio.use_tep); v27ter_tx_set_get_bit(&(s->audio.modems.v27ter_tx), get_bit_func, get_bit_user_data); s->audio.tx_handler = (span_tx_handler_t *) &(silence_gen); s->audio.tx_user_data = &(s->audio.modems.silence_gen); s->audio.next_tx_handler = (span_tx_handler_t *) &(v27ter_tx); s->audio.next_tx_user_data = &(s->audio.modems.v27ter_tx); set_rx_active(s, TRUE); break; case T38_IND_V27TER_4800_TRAINING: hdlc_tx_flags(&s->audio.modems.hdlc_tx, 120); silence_gen_alter(&s->audio.modems.silence_gen, ms_to_samples(75)); v27ter_tx_restart(&(s->audio.modems.v27ter_tx), 4800, s->audio.use_tep); v27ter_tx_set_get_bit(&(s->audio.modems.v27ter_tx), get_bit_func, get_bit_user_data); s->audio.tx_handler = (span_tx_handler_t *) &(silence_gen); s->audio.tx_user_data = &(s->audio.modems.silence_gen); s->audio.next_tx_handler = (span_tx_handler_t *) &(v27ter_tx); s->audio.next_tx_user_data = &(s->audio.modems.v27ter_tx); set_rx_active(s, TRUE); break; case T38_IND_V29_7200_TRAINING: hdlc_tx_flags(&s->audio.modems.hdlc_tx, 180); silence_gen_alter(&s->audio.modems.silence_gen, ms_to_samples(75)); v29_tx_restart(&(s->audio.modems.v29_tx), 7200, s->audio.use_tep); v29_tx_set_get_bit(&(s->audio.modems.v29_tx), get_bit_func, get_bit_user_data); s->audio.tx_handler = (span_tx_handler_t *) &(silence_gen); s->audio.tx_user_data = &(s->audio.modems.silence_gen); s->audio.next_tx_handler = (span_tx_handler_t *) &(v29_tx); s->audio.next_tx_user_data = &(s->audio.modems.v29_tx); set_rx_active(s, TRUE); break; case T38_IND_V29_9600_TRAINING: hdlc_tx_flags(&s->audio.modems.hdlc_tx, 240); silence_gen_alter(&s->audio.modems.silence_gen, ms_to_samples(75)); v29_tx_restart(&(s->audio.modems.v29_tx), 9600, s->audio.use_tep); v29_tx_set_get_bit(&(s->audio.modems.v29_tx), get_bit_func, get_bit_user_data); s->audio.tx_handler = (span_tx_handler_t *) &(silence_gen); s->audio.tx_user_data = &(s->audio.modems.silence_gen); s->audio.next_tx_handler = (span_tx_handler_t *) &(v29_tx); s->audio.next_tx_user_data = &(s->audio.modems.v29_tx); set_rx_active(s, TRUE); break; case T38_IND_V17_7200_SHORT_TRAINING: hdlc_tx_flags(&s->audio.modems.hdlc_tx, 180); silence_gen_alter(&s->audio.modems.silence_gen, ms_to_samples(75)); v17_tx_restart(&(s->audio.modems.v17_tx), 7200, s->audio.use_tep, s->audio.short_train); v17_tx_set_get_bit(&(s->audio.modems.v17_tx), get_bit_func, get_bit_user_data); s->audio.tx_handler = (span_tx_handler_t *) &(silence_gen); s->audio.tx_user_data = &(s->audio.modems.silence_gen); s->audio.next_tx_handler = (span_tx_handler_t *) &(v17_tx); s->audio.next_tx_user_data = &(s->audio.modems.v17_tx); set_rx_active(s, TRUE); break; case T38_IND_V17_7200_LONG_TRAINING: hdlc_tx_flags(&s->audio.modems.hdlc_tx, 180); silence_gen_alter(&s->audio.modems.silence_gen, ms_to_samples(75)); v17_tx_restart(&(s->audio.modems.v17_tx), 7200, s->audio.use_tep, s->audio.short_train); v17_tx_set_get_bit(&(s->audio.modems.v17_tx), get_bit_func, get_bit_user_data); s->audio.tx_handler = (span_tx_handler_t *) &(silence_gen); s->audio.tx_user_data = &(s->audio.modems.silence_gen); s->audio.next_tx_handler = (span_tx_handler_t *) &(v17_tx); s->audio.next_tx_user_data = &(s->audio.modems.v17_tx); set_rx_active(s, TRUE); break; case T38_IND_V17_9600_SHORT_TRAINING: hdlc_tx_flags(&s->audio.modems.hdlc_tx, 240); silence_gen_alter(&s->audio.modems.silence_gen, ms_to_samples(75)); v17_tx_restart(&(s->audio.modems.v17_tx), 9600, s->audio.use_tep, s->audio.short_train); v17_tx_set_get_bit(&(s->audio.modems.v17_tx), get_bit_func, get_bit_user_data); s->audio.tx_handler = (span_tx_handler_t *) &(silence_gen); s->audio.tx_user_data = &(s->audio.modems.silence_gen); s->audio.next_tx_handler = (span_tx_handler_t *) &(v17_tx); s->audio.next_tx_user_data = &(s->audio.modems.v17_tx); set_rx_active(s, TRUE); break; case T38_IND_V17_9600_LONG_TRAINING: hdlc_tx_flags(&s->audio.modems.hdlc_tx, 240); silence_gen_alter(&s->audio.modems.silence_gen, ms_to_samples(75)); v17_tx_restart(&(s->audio.modems.v17_tx), 9600, s->audio.use_tep, s->audio.short_train); v17_tx_set_get_bit(&(s->audio.modems.v17_tx), get_bit_func, get_bit_user_data); s->audio.tx_handler = (span_tx_handler_t *) &(silence_gen); s->audio.tx_user_data = &(s->audio.modems.silence_gen); s->audio.next_tx_handler = (span_tx_handler_t *) &(v17_tx); s->audio.next_tx_user_data = &(s->audio.modems.v17_tx); set_rx_active(s, TRUE); break; case T38_IND_V17_12000_SHORT_TRAINING: hdlc_tx_flags(&s->audio.modems.hdlc_tx, 300); silence_gen_alter(&s->audio.modems.silence_gen, ms_to_samples(75)); v17_tx_restart(&(s->audio.modems.v17_tx), 12000, s->audio.use_tep, s->audio.short_train); v17_tx_set_get_bit(&(s->audio.modems.v17_tx), get_bit_func, get_bit_user_data); s->audio.tx_handler = (span_tx_handler_t *) &(silence_gen); s->audio.tx_user_data = &(s->audio.modems.silence_gen); s->audio.next_tx_handler = (span_tx_handler_t *) &(v17_tx); s->audio.next_tx_user_data = &(s->audio.modems.v17_tx); set_rx_active(s, TRUE); break; case T38_IND_V17_12000_LONG_TRAINING: hdlc_tx_flags(&s->audio.modems.hdlc_tx, 300); silence_gen_alter(&s->audio.modems.silence_gen, ms_to_samples(75)); v17_tx_restart(&(s->audio.modems.v17_tx), 12000, s->audio.use_tep, s->audio.short_train); v17_tx_set_get_bit(&(s->audio.modems.v17_tx), get_bit_func, get_bit_user_data); s->audio.tx_handler = (span_tx_handler_t *) &(silence_gen); s->audio.tx_user_data = &(s->audio.modems.silence_gen); s->audio.next_tx_handler = (span_tx_handler_t *) &(v17_tx); s->audio.next_tx_user_data = &(s->audio.modems.v17_tx); set_rx_active(s, TRUE); break; case T38_IND_V17_14400_SHORT_TRAINING: hdlc_tx_flags(&s->audio.modems.hdlc_tx, 360); silence_gen_alter(&s->audio.modems.silence_gen, ms_to_samples(75)); v17_tx_restart(&(s->audio.modems.v17_tx), 14400, s->audio.use_tep, s->audio.short_train); v17_tx_set_get_bit(&(s->audio.modems.v17_tx), get_bit_func, get_bit_user_data); s->audio.tx_handler = (span_tx_handler_t *) &(silence_gen); s->audio.tx_user_data = &(s->audio.modems.silence_gen); s->audio.next_tx_handler = (span_tx_handler_t *) &(v17_tx); s->audio.next_tx_user_data = &(s->audio.modems.v17_tx); set_rx_active(s, TRUE); break; case T38_IND_V17_14400_LONG_TRAINING: hdlc_tx_flags(&s->audio.modems.hdlc_tx, 360); silence_gen_alter(&s->audio.modems.silence_gen, ms_to_samples(75)); v17_tx_restart(&(s->audio.modems.v17_tx), 14400, s->audio.use_tep, s->audio.short_train); v17_tx_set_get_bit(&(s->audio.modems.v17_tx), get_bit_func, get_bit_user_data); s->audio.tx_handler = (span_tx_handler_t *) &(silence_gen); s->audio.tx_user_data = &(s->audio.modems.silence_gen); s->audio.next_tx_handler = (span_tx_handler_t *) &(v17_tx); s->audio.next_tx_user_data = &(s->audio.modems.v17_tx); set_rx_active(s, TRUE); break; case T38_IND_V8_ANSAM: break; case T38_IND_V8_SIGNAL: break; case T38_IND_V34_CNTL_CHANNEL_1200: break; case T38_IND_V34_PRI_CHANNEL: break; case T38_IND_V34_CC_RETRAIN: break; case T38_IND_V33_12000_TRAINING: break; case T38_IND_V33_14400_TRAINING: break; default: break; } if (s->non_ecm_to_modem.in_octets || s->non_ecm_to_modem.out_octets) { span_log(&s->logging, SPAN_LOG_FLOW, "%d incoming non-ECM octets, %d rows. %d outgoing non-ECM octets, %d rows\n", s->non_ecm_to_modem.in_octets, s->non_ecm_to_modem.in_rows, s->non_ecm_to_modem.out_octets, s->non_ecm_to_modem.out_rows); s->non_ecm_to_modem.in_octets = 0; s->non_ecm_to_modem.out_octets = 0; } s->non_ecm_to_modem.in_rows = 0; s->non_ecm_to_modem.out_rows = 0; if (s->non_ecm_to_modem.flow_control_fill_octets) { span_log(&s->logging, SPAN_LOG_FLOW, "Non-ECM flow control generated %d octets\n", s->non_ecm_to_modem.flow_control_fill_octets); s->non_ecm_to_modem.flow_control_fill_octets = 0; } s->non_ecm_to_modem.bit_no = 0; s->non_ecm_to_modem.rx_bit_stream = 0xFFFF; s->non_ecm_to_modem.tx_octet = 0xFF; s->non_ecm_to_modem.flow_control_fill_octet = 0xFF; s->non_ecm_to_modem.at_initial_all_ones = TRUE; s->non_ecm_to_modem.bit_stream = 0xFFFF; s->t38x.in_progress_rx_indicator = indicator; return TRUE; } /*- End of function --------------------------------------------------------*/ static void pump_out_final_hdlc(t38_gateway_state_t *s, int good_fcs) { if (!good_fcs) s->hdlc_to_modem.flags[s->hdlc_to_modem.in] |= HDLC_FLAG_CORRUPT_CRC; if (s->hdlc_to_modem.in == s->hdlc_to_modem.out) { /* This is the frame in progress at the output. */ if ((s->hdlc_to_modem.flags[s->hdlc_to_modem.out] & HDLC_FLAG_PROCEED_WITH_OUTPUT) == 0) { /* Output of this frame has not yet begun. Throw it all out now. */ hdlc_tx_frame(&s->audio.modems.hdlc_tx, s->hdlc_to_modem.buf[s->hdlc_to_modem.out], s->hdlc_to_modem.len[s->hdlc_to_modem.out]); } if ((s->hdlc_to_modem.flags[s->hdlc_to_modem.out] & HDLC_FLAG_CORRUPT_CRC)) hdlc_tx_corrupt_frame(&s->audio.modems.hdlc_tx); } s->hdlc_to_modem.flags[s->hdlc_to_modem.in] |= (HDLC_FLAG_PROCEED_WITH_OUTPUT | HDLC_FLAG_FINISHED); if (++s->hdlc_to_modem.in >= T38_TX_HDLC_BUFS) s->hdlc_to_modem.in = 0; } /*- End of function --------------------------------------------------------*/ static void edit_control_messages(t38_gateway_state_t *s, int from_modem, uint8_t *buf, int len) { /* Frames need to be fed to this routine byte by byte as they arrive. It basically just edits the last byte received, based on the frame up to that point. */ if (s->t38x.corrupt_current_frame[from_modem]) { /* We simply need to overwrite a section of the message, so it is not recognisable at the receiver. This is used for the NSF, NSC, and NSS messages. Several strategies are possible for the replacement data. If you have a manufacturer code of your own, the sane thing is to overwrite the original data with that. */ if (len <= s->t38x.suppress_nsx_len[from_modem]) buf[len - 1] = nsx_overwrite[from_modem][len - 4]; return; } /* Edit the message, if we need to control the communication between the end points. */ switch (len) { case 3: switch (buf[2]) { case T30_NSF: case T30_NSC: case T30_NSS: if (s->t38x.suppress_nsx_len[from_modem]) { /* Corrupt the message, so it will be ignored by the far end. If it were processed, 2 machines which recognise each other might do special things we cannot handle as a middle man. */ span_log(&s->logging, SPAN_LOG_FLOW, "Corrupting %s message to prevent recognition\n", t30_frametype(buf[2])); s->t38x.corrupt_current_frame[from_modem] = TRUE; } break; } break; case 5: switch (buf[2]) { case T30_DIS: /* We may need to adjust the capabilities, so they do not exceed our own */ span_log(&s->logging, SPAN_LOG_FLOW, "Applying fast modem type constraints.\n"); switch (buf[4] & (DISBIT6 | DISBIT5 | DISBIT4 | DISBIT3)) { case 0: case DISBIT4: /* V.27ter only */ break; case DISBIT3: case (DISBIT4 | DISBIT3): /* V.27ter and V.29 */ if (!(s->supported_modems & T30_SUPPORT_V29)) buf[4] &= ~DISBIT3; break; case (DISBIT6 | DISBIT4 | DISBIT3): /* V.27ter, V.29 and V.17 */ if (!(s->supported_modems & T30_SUPPORT_V17)) buf[4] &= ~DISBIT6; if (!(s->supported_modems & T30_SUPPORT_V29)) buf[4] &= ~DISBIT3; break; case (DISBIT5 | DISBIT4): case (DISBIT6 | DISBIT4): case (DISBIT6 | DISBIT5 | DISBIT4): case (DISBIT6 | DISBIT5 | DISBIT4 | DISBIT3): /* Reserved */ buf[4] &= ~(DISBIT6 | DISBIT5); buf[4] |= (DISBIT4 | DISBIT3); break; default: /* Not used */ buf[4] &= ~(DISBIT6 | DISBIT5); buf[4] |= (DISBIT4 | DISBIT3); break; } break; } break; case 7: switch (buf[2]) { case T30_DIS: if (!s->ecm_allowed) { /* Do not allow ECM or T.6 coding */ span_log(&s->logging, SPAN_LOG_FLOW, "Inhibiting ECM\n"); buf[6] &= ~(DISBIT3 | DISBIT7); } break; } break; } } /*- End of function --------------------------------------------------------*/ static void monitor_control_messages(t38_gateway_state_t *s, int from_modem, uint8_t *buf, int len) { /* Monitor the control messages, at the point where we have the whole message, so we can see what is happening to things like training success/failure. */ span_log(&s->logging, SPAN_LOG_FLOW, "Monitoring %s\n", t30_frametype(buf[2])); if (len < 3) return; s->tcf_mode_predictable_modem_start = 0; switch (buf[2]) { case T30_CFR: /* We are changing from TCF exchange to image exchange */ /* Successful training means we should change to short training */ s->image_data_mode = TRUE; s->audio.short_train = TRUE; span_log(&s->logging, SPAN_LOG_FLOW, "CFR - short train = %d, ECM = %d\n", s->audio.short_train, s->ecm_mode); if (!from_modem) restart_rx_modem(s); break; case T30_RTN: case T30_RTP: /* We are going back to the exchange of fresh TCF */ s->image_data_mode = FALSE; s->audio.short_train = FALSE; break; case T30_CTR: /* T.30 says the first image data after this does full training. */ s->audio.short_train = FALSE; break; case T30_DTC: case T30_DCS: case T30_DCS | 1: /* We need to check which modem type is about to be used. */ if (len >= 5) { switch (buf[4] & (DISBIT6 | DISBIT5 | DISBIT4 | DISBIT3)) { case 0: s->fast_bit_rate = 2400; s->fast_modem = T38_V27TER_RX; break; case DISBIT4: s->fast_bit_rate = 4800; s->fast_modem = T38_V27TER_RX; break; case DISBIT3: s->fast_bit_rate = 9600; s->fast_modem = T38_V29_RX; break; case (DISBIT4 | DISBIT3): s->fast_bit_rate = 7200; s->fast_modem = T38_V29_RX; break; case DISBIT6: s->fast_bit_rate = 14400; s->fast_modem = T38_V17_RX; break; case (DISBIT6 | DISBIT4): s->fast_bit_rate = 12000; s->fast_modem = T38_V17_RX; break; case (DISBIT6 | DISBIT3): s->fast_bit_rate = 9600; s->fast_modem = T38_V17_RX; break; case (DISBIT6 | DISBIT4 | DISBIT3): s->fast_bit_rate = 7200; s->fast_modem = T38_V17_RX; break; case (DISBIT5 | DISBIT3): case (DISBIT5 | DISBIT4 | DISBIT3): case (DISBIT6 | DISBIT5): case (DISBIT6 | DISBIT5 | DISBIT3): case (DISBIT6 | DISBIT5 | DISBIT4): case (DISBIT6 | DISBIT5 | DISBIT4 | DISBIT3): /* Reserved */ s->fast_bit_rate = 0; s->fast_modem = T38_NONE; break; default: /* Not used */ s->fast_bit_rate = 0; s->fast_modem = T38_NONE; break; } } if (len >= 7) s->ecm_mode = (buf[6] & DISBIT3); else s->ecm_mode = FALSE; s->audio.short_train = FALSE; s->image_data_mode = FALSE; if (from_modem) s->tcf_mode_predictable_modem_start = 2; break; case T30_PPS: case T30_PPS | 1: switch (buf[3] & 0xFE) { case T30_EOP: case T30_EOM: case T30_MPS: case T30_PRI_EOP: case T30_PRI_EOM: case T30_PRI_MPS: s->count_page_on_mcf = TRUE; break; } break; case T30_EOP: case T30_EOM: case T30_MPS: case T30_PRI_EOP: case T30_PRI_EOM: case T30_PRI_MPS: case T30_EOP | 1: case T30_EOM | 1: case T30_MPS | 1: case T30_PRI_EOP | 1: case T30_PRI_EOM | 1: case T30_PRI_MPS | 1: s->count_page_on_mcf = TRUE; break; case T30_MCF: case T30_MCF | 1: if (s->count_page_on_mcf) { s->pages_confirmed++; span_log(&s->logging, SPAN_LOG_FLOW, "Pages confirmed = %d\n", s->pages_confirmed); s->count_page_on_mcf = FALSE; } break; default: break; } } /*- End of function --------------------------------------------------------*/ static void queue_missing_indicator(t38_gateway_state_t *s, int data_type) { t38_core_state_t *t; t = &s->t38x.t38; /* Missing packets might have lost us the indicator that should have put us in the required mode of operation. It might be a bit late to fill in such a gap now, but we should try. We may also want to force indicators into the queue, such as when the data says 'end of signal'. */ switch (data_type) { case T38_DATA_NONE: if (t->current_rx_indicator != T38_IND_NO_SIGNAL) process_rx_indicator(t, (void *) s, T38_IND_NO_SIGNAL); break; case T38_DATA_V21: if (t->current_rx_indicator != T38_IND_V21_PREAMBLE) process_rx_indicator(t, (void *) s, T38_IND_V21_PREAMBLE); break; case T38_DATA_V27TER_2400: if (t->current_rx_indicator != T38_IND_V27TER_2400_TRAINING) process_rx_indicator(t, (void *) s, T38_IND_V27TER_2400_TRAINING); break; case T38_DATA_V27TER_4800: if (t->current_rx_indicator != T38_IND_V27TER_4800_TRAINING) process_rx_indicator(t, (void *) s, T38_IND_V27TER_4800_TRAINING); break; case T38_DATA_V29_7200: if (t->current_rx_indicator != T38_IND_V29_7200_TRAINING) process_rx_indicator(t, (void *) s, T38_IND_V29_7200_TRAINING); break; case T38_DATA_V29_9600: if (t->current_rx_indicator != T38_IND_V29_9600_TRAINING) process_rx_indicator(t, (void *) s, T38_IND_V29_9600_TRAINING); break; case T38_DATA_V17_7200: if (t->current_rx_indicator != T38_IND_V17_7200_SHORT_TRAINING && t->current_rx_indicator != T38_IND_V17_7200_LONG_TRAINING) process_rx_indicator(t, (void *) s, T38_IND_V17_7200_LONG_TRAINING); break; case T38_DATA_V17_9600: if (t->current_rx_indicator != T38_IND_V17_9600_SHORT_TRAINING && t->current_rx_indicator != T38_IND_V17_9600_LONG_TRAINING) process_rx_indicator(t, (void *) s, T38_IND_V17_9600_LONG_TRAINING); break; case T38_DATA_V17_12000: if (t->current_rx_indicator != T38_IND_V17_12000_SHORT_TRAINING && t->current_rx_indicator != T38_IND_V17_12000_LONG_TRAINING) process_rx_indicator(t, (void *) s, T38_IND_V17_12000_LONG_TRAINING); break; case T38_DATA_V17_14400: if (t->current_rx_indicator != T38_IND_V17_14400_SHORT_TRAINING && t->current_rx_indicator != T38_IND_V17_14400_LONG_TRAINING) process_rx_indicator(t, (void *) s, T38_IND_V17_14400_LONG_TRAINING); break; case T38_DATA_V8: break; case T38_DATA_V34_PRI_RATE: break; case T38_DATA_V34_CC_1200: break; case T38_DATA_V34_PRI_CH: break; case T38_DATA_V33_12000: break; case T38_DATA_V33_14400: break; } } /*- End of function --------------------------------------------------------*/ static int process_rx_missing(t38_core_state_t *t, void *user_data, int rx_seq_no, int expected_seq_no) { t38_gateway_state_t *s; s = (t38_gateway_state_t *) user_data; s->hdlc_to_modem.flags[s->hdlc_to_modem.in] |= HDLC_FLAG_MISSING_DATA; return 0; } /*- End of function --------------------------------------------------------*/ static int process_rx_indicator(t38_core_state_t *t, void *user_data, int indicator) { t38_gateway_state_t *s; s = (t38_gateway_state_t *) user_data; if (t->current_rx_indicator == indicator) { /* This is probably due to the far end repeating itself. Ignore it. Its harmless */ return 0; } if (s->hdlc_to_modem.contents[s->hdlc_to_modem.in]) { if (++s->hdlc_to_modem.in >= T38_TX_HDLC_BUFS) s->hdlc_to_modem.in = 0; } s->hdlc_to_modem.contents[s->hdlc_to_modem.in] = (indicator | FLAG_INDICATOR); if (++s->hdlc_to_modem.in >= T38_TX_HDLC_BUFS) s->hdlc_to_modem.in = 0; span_log(&s->logging, SPAN_LOG_FLOW, "Queued change - (%d) %s -> %s\n", silence_gen_remainder(&(s->audio.modems.silence_gen)), t38_indicator_to_str(t->current_rx_indicator), t38_indicator_to_str(indicator)); s->t38x.current_rx_field_class = T38_FIELD_CLASS_NONE; /* We need to set this here, since we might have been called as a fake indication when the real one was missing */ t->current_rx_indicator = indicator; return 0; } /*- End of function --------------------------------------------------------*/ static int process_rx_data(t38_core_state_t *t, void *user_data, int data_type, int field_type, const uint8_t *buf, int len) { int i; int previous; t38_gateway_state_t *s; t38_gateway_t38_state_t *xx; s = (t38_gateway_state_t *) user_data; xx = &s->t38x; switch (field_type) { case T38_FIELD_HDLC_DATA: xx->current_rx_field_class = T38_FIELD_CLASS_HDLC; if (s->hdlc_to_modem.contents[s->hdlc_to_modem.in] != (data_type | FLAG_DATA)) queue_missing_indicator(s, data_type); previous = s->hdlc_to_modem.len[s->hdlc_to_modem.in]; /* Check if this data would overflow the buffer. */ if (s->hdlc_to_modem.len[s->hdlc_to_modem.in] + len > T38_MAX_HDLC_LEN) break; s->hdlc_to_modem.contents[s->hdlc_to_modem.in] = (data_type | FLAG_DATA); bit_reverse(&s->hdlc_to_modem.buf[s->hdlc_to_modem.in][s->hdlc_to_modem.len[s->hdlc_to_modem.in]], buf, len); /* We need to send out the control messages as they are arriving. They are too slow to capture a whole frame, and then pass it on. For the faster frames, take in the whole frame before sending it out. Also, there is no need to monitor, or modify, the contents of the faster frames. */ if (data_type == T38_DATA_V21) { for (i = 1; i <= len; i++) edit_control_messages(s, 0, s->hdlc_to_modem.buf[s->hdlc_to_modem.in], s->hdlc_to_modem.len[s->hdlc_to_modem.in] + i); /* Don't start pumping data into the actual output stream until there is enough backlog to create some elasticity for jitter tolerance. */ if (s->hdlc_to_modem.len[s->hdlc_to_modem.in] + len >= HDLC_START_BUFFER_LEVEL) { if (s->hdlc_to_modem.in == s->hdlc_to_modem.out) { if ((s->hdlc_to_modem.flags[s->hdlc_to_modem.in] & HDLC_FLAG_PROCEED_WITH_OUTPUT) == 0) previous = 0; hdlc_tx_frame(&s->audio.modems.hdlc_tx, s->hdlc_to_modem.buf[s->hdlc_to_modem.out] + previous, s->hdlc_to_modem.len[s->hdlc_to_modem.out] - previous + len); } s->hdlc_to_modem.flags[s->hdlc_to_modem.in] |= HDLC_FLAG_PROCEED_WITH_OUTPUT; } } s->hdlc_to_modem.len[s->hdlc_to_modem.in] += len; break; case T38_FIELD_HDLC_FCS_OK: xx->current_rx_field_class = T38_FIELD_CLASS_HDLC; if (len > 0) { span_log(&s->logging, SPAN_LOG_WARNING, "There is data in a T38_FIELD_HDLC_FCS_OK!\n"); /* The sender has incorrectly included data in this message. It is unclear what we should do with it, to maximise tolerance of buggy implementations. */ } /* Some T.38 implementations send multiple T38_FIELD_HDLC_FCS_OK messages, in IFP packets with incrementing sequence numbers, which are actually repeats. They get through to this point because of the incrementing sequence numbers. We need to filter them here in a context sensitive manner. */ if (t->current_rx_data_type != data_type || t->current_rx_field_type != field_type) { span_log(&s->logging, SPAN_LOG_FLOW, "HDLC frame type %s - CRC good\n", t30_frametype(s->hdlc_to_modem.buf[s->hdlc_to_modem.in][2])); if (s->hdlc_to_modem.contents[s->hdlc_to_modem.in] != (data_type | FLAG_DATA)) queue_missing_indicator(s, data_type); s->hdlc_to_modem.contents[s->hdlc_to_modem.in] = (data_type | FLAG_DATA); if (data_type == T38_DATA_V21) { if ((s->hdlc_to_modem.flags[s->hdlc_to_modem.in] & HDLC_FLAG_MISSING_DATA) == 0) { monitor_control_messages(s, FALSE, s->hdlc_to_modem.buf[s->hdlc_to_modem.in], s->hdlc_to_modem.len[s->hdlc_to_modem.in]); if (s->real_time_frame_handler) s->real_time_frame_handler(s, s->real_time_frame_user_data, FALSE, s->hdlc_to_modem.buf[s->hdlc_to_modem.in], s->hdlc_to_modem.len[s->hdlc_to_modem.in]); } } else { /* Make sure we go back to short training if CTC/CTR has kicked us into long training. Theer has to be more than one value HDLC frame in a chunk of image data, so just setting short training mode heer should be enough. */ s->audio.short_train = TRUE; } pump_out_final_hdlc(s, (s->hdlc_to_modem.flags[s->hdlc_to_modem.in] & HDLC_FLAG_MISSING_DATA) == 0); } s->hdlc_to_modem.len[s->hdlc_to_modem.in] = 0; s->hdlc_to_modem.flags[s->hdlc_to_modem.in] = 0; xx->corrupt_current_frame[0] = FALSE; break; case T38_FIELD_HDLC_FCS_BAD: xx->current_rx_field_class = T38_FIELD_CLASS_HDLC; if (len > 0) { span_log(&s->logging, SPAN_LOG_WARNING, "There is data in a T38_FIELD_HDLC_FCS_BAD!\n"); /* The sender has incorrectly included data in this message. We can safely ignore it, as the bad FCS means we will throw away the whole message, anyway. */ } /* Some T.38 implementations send multiple T38_FIELD_HDLC_FCS_BAD messages, in IFP packets with incrementing sequence numbers, which are actually repeats. They get through to this point because of the incrementing sequence numbers. We need to filter them here in a context sensitive manner. */ if (t->current_rx_data_type != data_type || t->current_rx_field_type != field_type) { span_log(&s->logging, SPAN_LOG_FLOW, "HDLC frame type %s - CRC bad\n", t30_frametype(s->hdlc_to_modem.buf[s->hdlc_to_modem.in][2])); if (s->hdlc_to_modem.contents[s->hdlc_to_modem.in] != (data_type | FLAG_DATA)) queue_missing_indicator(s, data_type); if (s->hdlc_to_modem.len[s->hdlc_to_modem.in] > 0) { s->hdlc_to_modem.contents[s->hdlc_to_modem.in] = (data_type | FLAG_DATA); pump_out_final_hdlc(s, FALSE); } } s->hdlc_to_modem.len[s->hdlc_to_modem.in] = 0; s->hdlc_to_modem.flags[s->hdlc_to_modem.in] = 0; xx->corrupt_current_frame[0] = FALSE; break; case T38_FIELD_HDLC_FCS_OK_SIG_END: xx->current_rx_field_class = T38_FIELD_CLASS_HDLC; if (len > 0) { span_log(&s->logging, SPAN_LOG_WARNING, "There is data in a T38_FIELD_HDLC_FCS_OK_SIG_END!\n"); /* The sender has incorrectly included data in this message. It is unclear what we should do with it, to maximise tolerance of buggy implementations. */ } /* Some T.38 implementations send multiple T38_FIELD_HDLC_FCS_OK_SIG_END messages, in IFP packets with incrementing sequence numbers, which are actually repeats. They get through to this point because of the incrementing sequence numbers. We need to filter them here in a context sensitive manner. */ if (t->current_rx_data_type != data_type || t->current_rx_field_type != field_type) { span_log(&s->logging, SPAN_LOG_FLOW, "HDLC frame type %s - CRC OK, sig end\n", t30_frametype(s->hdlc_to_modem.buf[s->hdlc_to_modem.in][2])); if (s->hdlc_to_modem.contents[s->hdlc_to_modem.in] != (data_type | FLAG_DATA)) queue_missing_indicator(s, data_type); s->hdlc_to_modem.contents[s->hdlc_to_modem.in] = (data_type | FLAG_DATA); if (data_type == T38_DATA_V21 && (s->hdlc_to_modem.flags[s->hdlc_to_modem.in] & HDLC_FLAG_MISSING_DATA) == 0) { monitor_control_messages(s, FALSE, s->hdlc_to_modem.buf[s->hdlc_to_modem.in], s->hdlc_to_modem.len[s->hdlc_to_modem.in]); if (s->real_time_frame_handler) s->real_time_frame_handler(s, s->real_time_frame_user_data, FALSE, s->hdlc_to_modem.buf[s->hdlc_to_modem.in], s->hdlc_to_modem.len[s->hdlc_to_modem.in]); } pump_out_final_hdlc(s, (s->hdlc_to_modem.flags[s->hdlc_to_modem.in] & HDLC_FLAG_MISSING_DATA) == 0); s->hdlc_to_modem.len[s->hdlc_to_modem.in] = 0; s->hdlc_to_modem.flags[s->hdlc_to_modem.in] = 0; s->hdlc_to_modem.contents[s->hdlc_to_modem.in] = 0; queue_missing_indicator(s, T38_DATA_NONE); xx->current_rx_field_class = T38_FIELD_CLASS_NONE; } xx->corrupt_current_frame[0] = FALSE; break; case T38_FIELD_HDLC_FCS_BAD_SIG_END: xx->current_rx_field_class = T38_FIELD_CLASS_HDLC; if (len > 0) { span_log(&s->logging, SPAN_LOG_WARNING, "There is data in a T38_FIELD_HDLC_FCS_BAD_SIG_END!\n"); /* The sender has incorrectly included data in this message. We can safely ignore it, as the bad FCS means we will throw away the whole message, anyway. */ } /* Some T.38 implementations send multiple T38_FIELD_HDLC_FCS_BAD_SIG_END messages, in IFP packets with incrementing sequence numbers, which are actually repeats. They get through to this point because of the incrementing sequence numbers. We need to filter them here in a context sensitive manner. */ if (t->current_rx_data_type != data_type || t->current_rx_field_type != field_type) { span_log(&s->logging, SPAN_LOG_FLOW, "HDLC frame type %s - CRC bad, sig end\n", t30_frametype(s->hdlc_to_modem.buf[s->hdlc_to_modem.in][2])); if (s->hdlc_to_modem.contents[s->hdlc_to_modem.in] != (data_type | FLAG_DATA)) queue_missing_indicator(s, data_type); if (s->hdlc_to_modem.len[s->hdlc_to_modem.in] > 0) { s->hdlc_to_modem.contents[s->hdlc_to_modem.in] = (data_type | FLAG_DATA); pump_out_final_hdlc(s, FALSE); } s->hdlc_to_modem.len[s->hdlc_to_modem.in] = 0; s->hdlc_to_modem.flags[s->hdlc_to_modem.in] = 0; s->hdlc_to_modem.contents[s->hdlc_to_modem.in] = 0; queue_missing_indicator(s, T38_DATA_NONE); xx->current_rx_field_class = T38_FIELD_CLASS_NONE; } xx->corrupt_current_frame[0] = FALSE; break; case T38_FIELD_HDLC_SIG_END: if (len > 0) { span_log(&s->logging, SPAN_LOG_WARNING, "There is data in a T38_FIELD_HDLC_SIG_END!\n"); /* The sender has incorrectly included data in this message, but there seems nothing meaningful it could be. There could not be an FCS good/bad report beyond this. */ } /* Some T.38 implementations send multiple T38_FIELD_HDLC_SIG_END messages, in IFP packets with incrementing sequence numbers, which are actually repeats. They get through to this point because of the incrementing sequence numbers. We need to filter them here in a context sensitive manner. */ if (t->current_rx_data_type != data_type || t->current_rx_field_type != field_type) { if (s->hdlc_to_modem.contents[s->hdlc_to_modem.in] != (data_type | FLAG_DATA)) queue_missing_indicator(s, data_type); /* WORKAROUND: At least some Mediatrix boxes have a bug, where they can send this message at the end of non-ECM data. We need to tolerate this. */ if (xx->current_rx_field_class == T38_FIELD_CLASS_NON_ECM) { span_log(&s->logging, SPAN_LOG_WARNING, "T38_FIELD_HDLC_SIG_END received at the end of non-ECM data!\n"); /* Don't flow control the data any more. Just pump out the remainder as fast as we can. */ s->non_ecm_to_modem.tx_latest_eol_ptr = s->non_ecm_to_modem.tx_in_ptr; s->non_ecm_to_modem.data_finished = TRUE; } else { /* This message is expected under 2 circumstances. One is as an alternative to T38_FIELD_HDLC_FCS_OK_SIG_END - i.e. they send T38_FIELD_HDLC_FCS_OK, and then T38_FIELD_HDLC_SIG_END when the carrier actually drops. The other is because the HDLC signal drops unexpectedly - i.e. not just after a final frame. */ s->hdlc_to_modem.len[s->hdlc_to_modem.in] = 0; s->hdlc_to_modem.flags[s->hdlc_to_modem.in] = 0; s->hdlc_to_modem.contents[s->hdlc_to_modem.in] = 0; } queue_missing_indicator(s, T38_DATA_NONE); xx->current_rx_field_class = T38_FIELD_CLASS_NONE; } xx->corrupt_current_frame[0] = FALSE; break; case T38_FIELD_T4_NON_ECM_DATA: xx->current_rx_field_class = T38_FIELD_CLASS_NON_ECM; if (s->hdlc_to_modem.contents[s->hdlc_to_modem.in] != (data_type | FLAG_DATA)) queue_missing_indicator(s, data_type); add_to_non_ecm_modem_buffer(s, buf, len); xx->corrupt_current_frame[0] = FALSE; break; case T38_FIELD_T4_NON_ECM_SIG_END: /* Some T.38 implementations send multiple T38_FIELD_T4_NON_ECM_SIG_END messages, in IFP packets with incrementing sequence numbers, which are actually repeats. They get through to this point because of the incrementing sequence numbers. We need to filter them here in a context sensitive manner. */ if (t->current_rx_data_type != data_type || t->current_rx_field_type != field_type) { /* WORKAROUND: At least some Mediatrix boxes have a bug, where they can send HDLC signal end where they should send non-ECM signal end. It is possible they also do the opposite. We need to tolerate this. */ if (xx->current_rx_field_class == T38_FIELD_CLASS_NON_ECM) { if (len > 0) { if (s->hdlc_to_modem.contents[s->hdlc_to_modem.in] != (data_type | FLAG_DATA)) queue_missing_indicator(s, data_type); add_to_non_ecm_modem_buffer(s, buf, len); } if (s->hdlc_to_modem.contents[s->hdlc_to_modem.in] != (data_type | FLAG_DATA)) queue_missing_indicator(s, data_type); /* Don't flow control the data any more. Just pump out the remainder as fast as we can. */ s->non_ecm_to_modem.tx_latest_eol_ptr = s->non_ecm_to_modem.tx_in_ptr; s->non_ecm_to_modem.data_finished = TRUE; } else { span_log(&s->logging, SPAN_LOG_WARNING, "T38_FIELD_NON_ECM_SIG_END received at the end of HDLC data!\n"); if (s->hdlc_to_modem.contents[s->hdlc_to_modem.in] != (data_type | FLAG_DATA)) queue_missing_indicator(s, data_type); s->hdlc_to_modem.len[s->hdlc_to_modem.in] = 0; s->hdlc_to_modem.flags[s->hdlc_to_modem.in] = 0; s->hdlc_to_modem.contents[s->hdlc_to_modem.in] = 0; } queue_missing_indicator(s, T38_DATA_NONE); xx->current_rx_field_class = T38_FIELD_CLASS_NONE; } xx->corrupt_current_frame[0] = FALSE; break; case T38_FIELD_CM_MESSAGE: if (len >= 1) span_log(&s->logging, SPAN_LOG_FLOW, "CM profile %d - %s\n", buf[0] - '0', t38_cm_profile_to_str(buf[0])); else span_log(&s->logging, SPAN_LOG_FLOW, "Bad length for CM message - %d\n", len); break; case T38_FIELD_JM_MESSAGE: if (len >= 2) span_log(&s->logging, SPAN_LOG_FLOW, "JM - %s\n", t38_jm_to_str(buf, len)); else span_log(&s->logging, SPAN_LOG_FLOW, "Bad length for JM message - %d\n", len); break; case T38_FIELD_CI_MESSAGE: if (len >= 1) span_log(&s->logging, SPAN_LOG_FLOW, "CI 0x%X\n", buf[0]); else span_log(&s->logging, SPAN_LOG_FLOW, "Bad length for CI message - %d\n", len); break; case T38_FIELD_V34RATE: if (len >= 3) { xx->t38.v34_rate = t38_v34rate_to_bps(buf, len); span_log(&s->logging, SPAN_LOG_FLOW, "V.34 rate %d bps\n", xx->t38.v34_rate); } else { span_log(&s->logging, SPAN_LOG_FLOW, "Bad length for V34rate message - %d\n", len); } break; default: break; } #if 0 if (span_log_test(&s->logging, SPAN_LOG_FLOW)) { int i; if (len > 0) { span_log(&s->logging, SPAN_LOG_FLOW, "Data: "); for (i = 0; i < len; i++) span_log(&s->logging, SPAN_LOG_FLOW | SPAN_LOG_SUPPRESS_LABELLING, " %02X", buf[i]); } } span_log(&s->logging, SPAN_LOG_FLOW | SPAN_LOG_SUPPRESS_LABELLING, "\n"); #endif return 0; } /*- End of function --------------------------------------------------------*/ static void set_octets_per_data_packet(t38_gateway_state_t *s, int bit_rate) { int octets; octets = MS_PER_TX_CHUNK*bit_rate/(8*1000); if (octets < 1) octets = 1; s->t38x.octets_per_data_packet = octets; } /*- End of function --------------------------------------------------------*/ static int set_slow_packetisation(t38_gateway_state_t *s) { set_octets_per_data_packet(s, 300); s->t38x.current_tx_data_type = T38_DATA_V21; return T38_IND_V21_PREAMBLE; } /*- End of function --------------------------------------------------------*/ static int set_fast_packetisation(t38_gateway_state_t *s) { int ind; ind = T38_IND_NO_SIGNAL; switch (s->fast_rx_active) { case T38_V17_RX: switch (s->fast_bit_rate) { case 7200: set_octets_per_data_packet(s, 7200); ind = (s->audio.short_train) ? T38_IND_V17_7200_SHORT_TRAINING : T38_IND_V17_7200_LONG_TRAINING; s->t38x.current_tx_data_type = T38_DATA_V17_7200; break; case 9600: set_octets_per_data_packet(s, 9600); ind = (s->audio.short_train) ? T38_IND_V17_9600_SHORT_TRAINING : T38_IND_V17_9600_LONG_TRAINING; s->t38x.current_tx_data_type = T38_DATA_V17_9600; break; case 12000: set_octets_per_data_packet(s, 12000); ind = (s->audio.short_train) ? T38_IND_V17_12000_SHORT_TRAINING : T38_IND_V17_12000_LONG_TRAINING; s->t38x.current_tx_data_type = T38_DATA_V17_12000; break; default: case 14400: set_octets_per_data_packet(s, 14400); ind = (s->audio.short_train) ? T38_IND_V17_14400_SHORT_TRAINING : T38_IND_V17_14400_LONG_TRAINING; s->t38x.current_tx_data_type = T38_DATA_V17_14400; break; } break; case T38_V27TER_RX: switch (s->fast_bit_rate) { case 2400: set_octets_per_data_packet(s, 2400); ind = T38_IND_V27TER_2400_TRAINING; s->t38x.current_tx_data_type = T38_DATA_V27TER_2400; break; default: case 4800: set_octets_per_data_packet(s, 4800); ind = T38_IND_V27TER_4800_TRAINING; s->t38x.current_tx_data_type = T38_DATA_V27TER_4800; break; } break; case T38_V29_RX: switch (s->fast_bit_rate) { case 7200: set_octets_per_data_packet(s, 7200); ind = T38_IND_V29_7200_TRAINING; s->t38x.current_tx_data_type = T38_DATA_V29_7200; break; default: case 9600: set_octets_per_data_packet(s, 9600); ind = T38_IND_V29_9600_TRAINING; s->t38x.current_tx_data_type = T38_DATA_V29_9600; break; } break; } return ind; } /*- End of function --------------------------------------------------------*/ static void announce_training(t38_gateway_state_t *s) { t38_core_send_indicator(&s->t38x.t38, set_fast_packetisation(s), s->t38x.t38.indicator_tx_count); } /*- End of function --------------------------------------------------------*/ static void non_ecm_put_bit(void *user_data, int bit) { t38_gateway_state_t *s; s = (t38_gateway_state_t *) user_data; if (bit < 0) { /* Special conditions */ switch (bit) { case PUTBIT_TRAINING_IN_PROGRESS: span_log(&s->logging, SPAN_LOG_FLOW, "Non-ECM carrier training in progress\n"); if (s->tcf_mode_predictable_modem_start) s->tcf_mode_predictable_modem_start = 0; else announce_training(s); break; case PUTBIT_TRAINING_FAILED: span_log(&s->logging, SPAN_LOG_FLOW, "Non-ECM carrier training failed\n"); break; case PUTBIT_TRAINING_SUCCEEDED: /* The modem is now trained */ span_log(&s->logging, SPAN_LOG_FLOW, "Non-ECM carrier trained\n"); s->audio.rx_signal_present = TRUE; s->audio.rx_trained = TRUE; s->to_t38.data_ptr = 0; break; case PUTBIT_CARRIER_UP: span_log(&s->logging, SPAN_LOG_FLOW, "Non-ECM carrier up\n"); break; case PUTBIT_CARRIER_DOWN: span_log(&s->logging, SPAN_LOG_FLOW, "Non-ECM carrier down\n"); s->tcf_mode_predictable_modem_start = 0; switch (s->t38x.current_tx_data_type) { case T38_DATA_V17_7200: case T38_DATA_V17_9600: case T38_DATA_V17_12000: case T38_DATA_V17_14400: case T38_DATA_V27TER_2400: case T38_DATA_V27TER_4800: case T38_DATA_V29_7200: case T38_DATA_V29_9600: t38_core_send_data(&s->t38x.t38, s->t38x.current_tx_data_type, T38_FIELD_T4_NON_ECM_SIG_END, NULL, 0, s->t38x.t38.data_end_tx_count); t38_core_send_indicator(&s->t38x.t38, T38_IND_NO_SIGNAL, s->t38x.t38.indicator_tx_count); restart_rx_modem(s); break; } break; default: span_log(&s->logging, SPAN_LOG_WARNING, "Unexpected non-ECM special bit - %d!\n", bit); break; } return; } bit &= 1; if (s->t38x.t38.fill_bit_removal) { /* Drop any extra zero bits when we already have enough for an EOL symbol. */ /* The snag here is that if we just look for 11 bits, a line ending with a code that has trailing zero bits will cause problems. The longest run of trailing zeros for any code is 3, so we need to look for at least 14 zeros if we don't want to actually analyse the compressed data in depth. This means we do not strip every fill bit, but we strip most of them. */ if ((s->non_ecm_to_modem.rx_bit_stream & 0x3FFF) == 0 && bit == 0) return; } s->non_ecm_to_modem.rx_bit_stream = (s->non_ecm_to_modem.rx_bit_stream << 1) | bit; if (++s->non_ecm_to_modem.bit_no >= 8) { s->to_t38.data[s->to_t38.data_ptr++] = (uint8_t) s->non_ecm_to_modem.rx_bit_stream & 0xFF; if (s->to_t38.data_ptr >= s->t38x.octets_per_data_packet) { t38_core_send_data(&s->t38x.t38, s->t38x.current_tx_data_type, T38_FIELD_T4_NON_ECM_DATA, s->to_t38.data, s->to_t38.data_ptr, s->t38x.t38.data_tx_count); /* Since we delay transmission by 2 octets, we should now have sent the last of the data octets when we have just received the last of the CRC octets. */ s->to_t38.data_ptr = 0; } s->non_ecm_to_modem.bit_no = 0; } } /*- End of function --------------------------------------------------------*/ static int non_ecm_get_bit(void *user_data) { t38_gateway_state_t *s; int bit; /* A rate adapting data stuffer for non-ECM image data */ s = (t38_gateway_state_t *) user_data; if (s->non_ecm_to_modem.bit_no <= 0) { /* We need another byte */ if (s->non_ecm_to_modem.tx_out_ptr != s->non_ecm_to_modem.tx_latest_eol_ptr) { s->non_ecm_to_modem.tx_octet = s->non_ecm_to_modem.tx_data[s->non_ecm_to_modem.tx_out_ptr]; s->non_ecm_to_modem.tx_out_ptr = (s->non_ecm_to_modem.tx_out_ptr + 1) & (T38_NON_ECM_TX_BUF_LEN - 1); } else { if (s->non_ecm_to_modem.data_finished) { /* The queue is empty, and we have received the end of data signal. This must really be the end to transmission. */ s->non_ecm_to_modem.data_finished = FALSE; /* Reset the data pointers for next time. */ s->non_ecm_to_modem.tx_out_ptr = 0; s->non_ecm_to_modem.tx_in_ptr = 0; s->non_ecm_to_modem.tx_latest_eol_ptr = 0; return PUTBIT_END_OF_DATA; } /* The queue is blocked, but this does not appear to be the end of the data. Idle with fill octets, which should be safe at this point. */ s->non_ecm_to_modem.tx_octet = s->non_ecm_to_modem.flow_control_fill_octet; s->non_ecm_to_modem.flow_control_fill_octets++; } s->non_ecm_to_modem.out_octets++; s->non_ecm_to_modem.bit_no = 8; } s->non_ecm_to_modem.bit_no--; bit = (s->non_ecm_to_modem.tx_octet >> 7) & 1; s->non_ecm_to_modem.tx_octet <<= 1; return bit; } /*- End of function --------------------------------------------------------*/ static void add_to_non_ecm_modem_buffer(t38_gateway_state_t *s, const uint8_t *buf, int len) { int i; int upper; /* A rate adapting data stuffer for non-ECM image data */ i = 0; if (s->non_ecm_to_modem.at_initial_all_ones) { /* Dump initial 0xFF bytes. We will add enough of our own to makes things flow smoothly. If we don't strip these off we might end up delaying the start of forwarding by a large amount, as we could end up with a large block of 0xFF bytes before the real data begins. This is especially true with PC FAX systems. */ for ( ; i < len; i++) { if (buf[i] != 0xFF) { s->non_ecm_to_modem.at_initial_all_ones = FALSE; break; } } } if (s->image_data_mode) { /* This is image data */ for ( ; i < len; i++) { /* Check for EOLs, because at an EOL we can pause and pump out zeros while waiting for more incoming data. */ if (buf[i]) { /* There might be an EOL here. Look for at least 11 zeros, followed by a one, split between two octets. Between those two octets we can insert numerous zero octets as a means of flow control. */ /* Or'ing with 0x800 here is simply to avoid zero words looking like they have -1 trailing zeros */ upper = bottom_bit(s->non_ecm_to_modem.bit_stream | 0x800); if (upper - top_bit(buf[i]) > 3) { s->non_ecm_to_modem.in_rows++; s->non_ecm_to_modem.tx_latest_eol_ptr = s->non_ecm_to_modem.tx_in_ptr; s->non_ecm_to_modem.flow_control_fill_octet = 0x00; } } s->non_ecm_to_modem.bit_stream = (s->non_ecm_to_modem.bit_stream << 8) | buf[i]; s->non_ecm_to_modem.tx_data[s->non_ecm_to_modem.tx_in_ptr] = buf[i]; /* TODO: We can't buffer overflow, since we wrap around. However, the tail could overwrite itself if things fall badly behind. */ s->non_ecm_to_modem.tx_in_ptr = (s->non_ecm_to_modem.tx_in_ptr + 1) & (T38_NON_ECM_TX_BUF_LEN - 1); s->non_ecm_to_modem.in_octets++; } } else { /* This is TCF data */ for ( ; i < len; i++) { /* Check for zero bytes, as we can pause and pump out zeros while waiting for more incoming data. */ if (buf[i] == 0x00) { s->non_ecm_to_modem.tx_latest_eol_ptr = s->non_ecm_to_modem.tx_in_ptr; s->non_ecm_to_modem.flow_control_fill_octet = 0x00; } s->non_ecm_to_modem.tx_data[s->non_ecm_to_modem.tx_in_ptr] = buf[i]; /* TODO: We can't buffer overflow, since we wrap around. However, the tail could overwrite itself if things fall badly behind. */ s->non_ecm_to_modem.tx_in_ptr = (s->non_ecm_to_modem.tx_in_ptr + 1) & (T38_NON_ECM_TX_BUF_LEN - 1); s->non_ecm_to_modem.in_octets++; } } } /*- End of function --------------------------------------------------------*/ static void hdlc_rx_special_condition(hdlc_rx_state_t *t, int condition) { t38_gateway_state_t *s; s = (t38_gateway_state_t *) t->user_data; switch (condition) { case PUTBIT_TRAINING_IN_PROGRESS: span_log(&s->logging, SPAN_LOG_FLOW, "HDLC carrier training in progress\n"); announce_training(s); break; case PUTBIT_TRAINING_FAILED: span_log(&s->logging, SPAN_LOG_FLOW, "HDLC carrier training failed\n"); break; case PUTBIT_TRAINING_SUCCEEDED: /* The modem is now trained. */ span_log(&s->logging, SPAN_LOG_FLOW, "HDLC carrier trained\n"); s->audio.rx_signal_present = TRUE; s->audio.rx_trained = TRUE; /* Behave like HDLC preamble has been announced. */ t->framing_ok_announced = TRUE; s->to_t38.data_ptr = 0; break; case PUTBIT_CARRIER_UP: span_log(&s->logging, SPAN_LOG_FLOW, "HDLC carrier up\n"); /* Reset the HDLC receiver. */ t->raw_bit_stream = 0; t->len = 0; t->num_bits = 0; t->flags_seen = 0; t->framing_ok_announced = FALSE; s->to_t38.data_ptr = 0; break; case PUTBIT_CARRIER_DOWN: span_log(&s->logging, SPAN_LOG_FLOW, "HDLC carrier down\n"); if (t->framing_ok_announced) { t38_core_send_data(&s->t38x.t38, s->t38x.current_tx_data_type, T38_FIELD_HDLC_SIG_END, NULL, 0, s->t38x.t38.data_end_tx_count); t38_core_send_indicator(&s->t38x.t38, T38_IND_NO_SIGNAL, s->t38x.t38.indicator_tx_count); t->framing_ok_announced = FALSE; } restart_rx_modem(s); if (s->tcf_mode_predictable_modem_start == 2) { /* If we are doing TCF, we need to announce the fast carrier training very quickly, to ensure it starts 75+-20ms after the HDLC carrier ends. Waiting until it trains will be too late. We need to announce the fast modem a fixed time after the end of the V.21 carrier, in anticipation of its arrival. */ s->samples_to_timeout = ms_to_samples(75); s->tcf_mode_predictable_modem_start = 1; } break; default: span_log(&s->logging, SPAN_LOG_WARNING, "Unexpected HDLC special bit - %d!\n", condition); break; } } /*- End of function --------------------------------------------------------*/ static void rx_flag_or_abort(hdlc_rx_state_t *t) { t38_gateway_state_t *s; s = (t38_gateway_state_t *) t->user_data; if ((t->raw_bit_stream & 0x80)) { /* Hit HDLC abort */ t->rx_aborts++; if (t->flags_seen < t->framing_ok_threshold) t->flags_seen = 0; else t->flags_seen = t->framing_ok_threshold - 1; } else { /* Hit HDLC flag */ if (t->flags_seen >= t->framing_ok_threshold) { if (t->len) { /* This is not back-to-back flags */ if (t->len >= 2) { if (s->to_t38.data_ptr) { bit_reverse(s->to_t38.data, t->buffer + t->len - 2 - s->to_t38.data_ptr, s->to_t38.data_ptr); t38_core_send_data(&s->t38x.t38, s->t38x.current_tx_data_type, T38_FIELD_HDLC_DATA, s->to_t38.data, s->to_t38.data_ptr, s->t38x.t38.data_tx_count); } if (t->num_bits != 7) { t->rx_crc_errors++; span_log(&s->logging, SPAN_LOG_FLOW, "HDLC frame type %s, misaligned terminating flag at %d\n", t30_frametype(t->buffer[2]), t->len); /* It seems some boxes may not like us sending a _SIG_END here, and then another when the carrier actually drops. Lets just send T38_FIELD_HDLC_FCS_OK here. */ if (t->len > 2) t38_core_send_data(&s->t38x.t38, s->t38x.current_tx_data_type, T38_FIELD_HDLC_FCS_BAD, NULL, 0, s->t38x.t38.data_tx_count); } else if ((s->audio.crc & 0xFFFF) != 0xF0B8) { t->rx_crc_errors++; span_log(&s->logging, SPAN_LOG_FLOW, "HDLC frame type %s, bad CRC at %d\n", t30_frametype(t->buffer[2]), t->len); /* It seems some boxes may not like us sending a _SIG_END here, and then another when the carrier actually drops. Lets just send T38_FIELD_HDLC_FCS_OK here. */ if (t->len > 2) t38_core_send_data(&s->t38x.t38, s->t38x.current_tx_data_type, T38_FIELD_HDLC_FCS_BAD, NULL, 0, s->t38x.t38.data_tx_count); } else { t->rx_frames++; t->rx_bytes += t->len - 2; span_log(&s->logging, SPAN_LOG_FLOW, "HDLC frame type %s, CRC OK\n", t30_frametype(t->buffer[2])); if (s->t38x.current_tx_data_type == T38_DATA_V21) { monitor_control_messages(s, TRUE, t->buffer, t->len - 2); if (s->real_time_frame_handler) s->real_time_frame_handler(s, s->real_time_frame_user_data, TRUE, t->buffer, t->len - 2); } else { /* Make sure we go back to short training if CTC/CTR has kicked us into long training. Any successful HDLC frame received at a rate other than V.21 is an adequate indication we should change. */ s->audio.short_train = TRUE; } /* It seems some boxes may not like us sending a _SIG_END here, and then another when the carrier actually drops. Lets just send T38_FIELD_HDLC_FCS_OK here. */ t38_core_send_data(&s->t38x.t38, s->t38x.current_tx_data_type, T38_FIELD_HDLC_FCS_OK, NULL, 0, s->t38x.t38.data_tx_count); } } else { /* Frame too short */ t->rx_length_errors++; } } } else { /* Check the flags are back-to-back when testing for valid preamble. This greatly reduces the chances of false preamble detection, and anything which doesn't send them back-to-back is badly broken. */ if (t->num_bits != 7) t->flags_seen = 0; if (++t->flags_seen >= t->framing_ok_threshold && !t->framing_ok_announced) { if (s->t38x.current_tx_data_type == T38_DATA_V21) { t38_core_send_indicator(&s->t38x.t38, set_slow_packetisation(s), s->t38x.t38.indicator_tx_count); s->audio.rx_signal_present = TRUE; } if (s->t38x.in_progress_rx_indicator == T38_IND_CNG) set_next_tx_type(s); t->framing_ok_announced = TRUE; } } } s->audio.crc = 0xFFFF; t->len = 0; t->num_bits = 0; s->to_t38.data_ptr = 0; s->t38x.corrupt_current_frame[1] = FALSE; } /*- End of function --------------------------------------------------------*/ static void t38_hdlc_rx_put_bit(hdlc_rx_state_t *t, int new_bit) { t38_gateway_state_t *s; if (new_bit < 0) { hdlc_rx_special_condition(t, new_bit); return; } t->raw_bit_stream = (t->raw_bit_stream << 1) | (new_bit & 1); if ((t->raw_bit_stream & 0x3F) == 0x3E) { /* Its time to either skip a bit, for stuffing, or process a flag or abort */ if ((t->raw_bit_stream & 0x40)) rx_flag_or_abort(t); return; } t->num_bits++; if (!t->framing_ok_announced) return; t->byte_in_progress = (t->byte_in_progress >> 1) | ((t->raw_bit_stream & 0x01) << 7); if (t->num_bits != 8) return; t->num_bits = 0; if (t->len >= (int) sizeof(t->buffer)) { /* This is too long. Abandon the frame, and wait for the next flag octet. */ t->rx_length_errors++; t->flags_seen = t->framing_ok_threshold - 1; t->len = 0; return; } s = (t38_gateway_state_t *) t->user_data; t->buffer[t->len] = (uint8_t) t->byte_in_progress; /* Calculate the CRC progressively, before we start altering the frame */ s->audio.crc = crc_itu16_calc(&t->buffer[t->len], 1, s->audio.crc); /* Make the transmission lag by two octets, so we do not send the CRC, and do not report the CRC result too late. */ if (++t->len <= 2) return; if (s->t38x.current_tx_data_type == T38_DATA_V21) { /* The V.21 control messages need to be monitored, and possibly corrupted, to manage the man-in-the-middle role of T.38 */ edit_control_messages(s, 1, t->buffer, t->len); } if (++s->to_t38.data_ptr >= s->t38x.octets_per_data_packet) { bit_reverse(s->to_t38.data, t->buffer + t->len - 2 - s->to_t38.data_ptr, s->to_t38.data_ptr); t38_core_send_data(&s->t38x.t38, s->t38x.current_tx_data_type, T38_FIELD_HDLC_DATA, s->to_t38.data, s->to_t38.data_ptr, s->t38x.t38.data_tx_count); /* Since we delay transmission by 2 octets, we should now have sent the last of the data octets when we have just received the last of the CRC octets. */ s->to_t38.data_ptr = 0; } } /*- End of function --------------------------------------------------------*/ static int restart_rx_modem(t38_gateway_state_t *s) { put_bit_func_t put_bit_func; void *put_bit_user_data; span_log(&s->logging, SPAN_LOG_FLOW, "Restart rx modem - modem = %d, short train = %d, ECM = %d\n", s->fast_modem, s->audio.short_train, s->ecm_mode); hdlc_rx_init(&(s->audio.modems.hdlc_rx), FALSE, TRUE, 5, NULL, s); s->audio.crc = 0xFFFF; s->audio.rx_signal_present = FALSE; s->audio.rx_trained = FALSE; /* Default to the transmit data being V.21, unless a faster modem pops up trained. */ s->t38x.current_tx_data_type = T38_DATA_V21; fsk_rx_init(&(s->audio.modems.v21_rx), &preset_fsk_specs[FSK_V21CH2], TRUE, (put_bit_func_t) t38_hdlc_rx_put_bit, &(s->audio.modems.hdlc_rx)); #if 0 fsk_rx_signal_cutoff(&(s->audio.modems.v21_rx), -45.5); #endif if (s->image_data_mode && s->ecm_mode) { put_bit_func = (put_bit_func_t) t38_hdlc_rx_put_bit; put_bit_user_data = (void *) &(s->audio.modems.hdlc_rx); } else { put_bit_func = non_ecm_put_bit; put_bit_user_data = (void *) s; } s->to_t38.data_ptr = 0; s->t38x.octets_per_data_packet = 1; switch (s->fast_modem) { case T38_V17_RX: v17_rx_restart(&(s->audio.modems.v17_rx), s->fast_bit_rate, s->audio.short_train); v17_rx_set_put_bit(&(s->audio.modems.v17_rx), put_bit_func, put_bit_user_data); set_rx_handler(s, (span_rx_handler_t *) &early_v17_rx, s); s->fast_rx_active = T38_V17_RX; break; case T38_V27TER_RX: v27ter_rx_restart(&(s->audio.modems.v27ter_rx), s->fast_bit_rate, FALSE); v27ter_rx_set_put_bit(&(s->audio.modems.v27ter_rx), put_bit_func, put_bit_user_data); set_rx_handler(s, (span_rx_handler_t *) &early_v27ter_rx, s); s->fast_rx_active = T38_V27TER_RX; break; case T38_V29_RX: v29_rx_restart(&(s->audio.modems.v29_rx), s->fast_bit_rate, FALSE); v29_rx_set_put_bit(&(s->audio.modems.v29_rx), put_bit_func, put_bit_user_data); set_rx_handler(s, (span_rx_handler_t *) &early_v29_rx, s); s->fast_rx_active = T38_V29_RX; break; default: set_rx_handler(s, (span_rx_handler_t *) &fsk_rx, &(s->audio.modems.v21_rx)); s->fast_rx_active = T38_NONE; break; } return 0; } /*- End of function --------------------------------------------------------*/ int t38_gateway_rx(t38_gateway_state_t *s, int16_t amp[], int len) { int i; #if defined(LOG_FAX_AUDIO) if (s->audio.fax_audio_rx_log >= 0) write(s->audio.fax_audio_rx_log, amp, len*sizeof(int16_t)); #endif if (s->samples_to_timeout > 0) { if ((s->samples_to_timeout -= len) <= 0) { if (s->tcf_mode_predictable_modem_start == 1) announce_training(s); } } for (i = 0; i < len; i++) amp[i] = dc_restore(&(s->audio.modems.dc_restore), amp[i]); s->audio.immediate_rx_handler(s->audio.rx_user_data, amp, len); return 0; } /*- End of function --------------------------------------------------------*/ int t38_gateway_tx(t38_gateway_state_t *s, int16_t amp[], int max_len) { int len; #if defined(LOG_FAX_AUDIO) int required_len; required_len = max_len; #endif if ((len = s->audio.tx_handler(s->audio.tx_user_data, amp, max_len)) < max_len) { if (set_next_tx_type(s)) { /* Give the new handler a chance to file the remaining buffer space */ len += s->audio.tx_handler(s->audio.tx_user_data, amp + len, max_len - len); if (len < max_len) { silence_gen_set(&(s->audio.modems.silence_gen), 0); set_next_tx_type(s); } } } if (s->audio.transmit_on_idle) { if (len < max_len) { /* Pad to the requested length with silence */ memset(amp + len, 0, (max_len - len)*sizeof(int16_t)); len = max_len; } } #if defined(LOG_FAX_AUDIO) if (s->audio.fax_audio_tx_log >= 0) { if (len < required_len) memset(amp + len, 0, (required_len - len)*sizeof(int16_t)); write(s->audio.fax_audio_tx_log, amp, required_len*sizeof(int16_t)); } #endif return len; } /*- End of function --------------------------------------------------------*/ void t38_gateway_get_transfer_statistics(t38_gateway_state_t *s, t38_stats_t *t) { memset(t, 0, sizeof(*t)); t->bit_rate = s->fast_bit_rate; t->error_correcting_mode = s->ecm_mode; t->pages_transferred = s->pages_confirmed; } /*- End of function --------------------------------------------------------*/ void t38_gateway_set_ecm_capability(t38_gateway_state_t *s, int ecm_allowed) { s->ecm_allowed = ecm_allowed; } /*- End of function --------------------------------------------------------*/ void t38_gateway_set_transmit_on_idle(t38_gateway_state_t *s, int transmit_on_idle) { s->audio.transmit_on_idle = transmit_on_idle; } /*- End of function --------------------------------------------------------*/ void t38_gateway_set_supported_modems(t38_gateway_state_t *s, int supported_modems) { s->supported_modems = supported_modems; if ((s->supported_modems & T30_SUPPORT_V17)) s->t38x.t38.fastest_image_data_rate = 14400; else if ((s->supported_modems & T30_SUPPORT_V29)) s->t38x.t38.fastest_image_data_rate = 9600; else s->t38x.t38.fastest_image_data_rate = 4800; } /*- End of function --------------------------------------------------------*/ void t38_gateway_set_nsx_suppression(t38_gateway_state_t *s, const uint8_t *from_t38, int from_t38_len, const uint8_t *from_modem, int from_modem_len) { s->t38x.suppress_nsx_len[0] = (from_t38_len < 0 || from_t38_len < MAX_NSX_SUPPRESSION) ? (from_t38_len + 3) : 0; s->t38x.suppress_nsx_len[1] = (from_modem_len < 0 || from_modem_len < MAX_NSX_SUPPRESSION) ? (from_modem_len + 3) : 0; } /*- End of function --------------------------------------------------------*/ void t38_gateway_set_tep_mode(t38_gateway_state_t *s, int use_tep) { s->audio.use_tep = use_tep; } /*- End of function --------------------------------------------------------*/ void t38_gateway_set_real_time_frame_handler(t38_gateway_state_t *s, t38_gateway_real_time_frame_handler_t *handler, void *user_data) { s->real_time_frame_handler = handler; s->real_time_frame_user_data = user_data; } /*- End of function --------------------------------------------------------*/ static int t38_gateway_audio_init(t38_gateway_state_t *t) { t38_gateway_audio_state_t *s; s = &t->audio; fsk_rx_init(&s->modems.v21_rx, &preset_fsk_specs[FSK_V21CH2], TRUE, (put_bit_func_t) t38_hdlc_rx_put_bit, &s->modems.hdlc_rx); #if 0 fsk_rx_signal_cutoff(&s->modems.v21_rx, -45.5); #endif fsk_tx_init(&s->modems.v21_tx, &preset_fsk_specs[FSK_V21CH2], (get_bit_func_t) hdlc_tx_get_bit, &s->modems.hdlc_tx); v17_rx_init(&s->modems.v17_rx, 14400, non_ecm_put_bit, t); v17_tx_init(&s->modems.v17_tx, 14400, s->use_tep, non_ecm_get_bit, t); v29_rx_init(&s->modems.v29_rx, 9600, non_ecm_put_bit, t); #if 0 v29_rx_signal_cutoff(&s->modems.v29_rx, -45.5); #endif v29_tx_init(&s->modems.v29_tx, 9600, s->use_tep, non_ecm_get_bit, t); v27ter_rx_init(&s->modems.v27ter_rx, 4800, non_ecm_put_bit, t); v27ter_tx_init(&s->modems.v27ter_tx, 4800, s->use_tep, non_ecm_get_bit, t); silence_gen_init(&s->modems.silence_gen, 0); hdlc_rx_init(&s->modems.hdlc_rx, FALSE, TRUE, 5, NULL, t); hdlc_tx_init(&s->modems.hdlc_tx, FALSE, 2, TRUE, hdlc_underflow_handler, t); s->rx_signal_present = FALSE; s->tx_handler = (span_tx_handler_t *) &silence_gen; s->tx_user_data = &s->modems.silence_gen; return 0; } /*- End of function --------------------------------------------------------*/ static int t38_gateway_t38_init(t38_gateway_state_t *t, t38_tx_packet_handler_t *tx_packet_handler, void *tx_packet_user_data) { t38_gateway_t38_state_t *s; s = &t->t38x; s->octets_per_data_packet = 1; t38_core_init(&s->t38, process_rx_indicator, process_rx_data, process_rx_missing, (void *) t, tx_packet_handler, tx_packet_user_data); s->t38.indicator_tx_count = INDICATOR_TX_COUNT; s->t38.data_tx_count = DATA_TX_COUNT; s->t38.data_end_tx_count = DATA_END_TX_COUNT; return 0; } /*- End of function --------------------------------------------------------*/ t38_gateway_state_t *t38_gateway_init(t38_gateway_state_t *s, t38_tx_packet_handler_t *tx_packet_handler, void *tx_packet_user_data) { if (tx_packet_handler == NULL) return NULL; if (s == NULL) { if ((s = (t38_gateway_state_t *) malloc(sizeof(*s))) == NULL) return NULL; } memset(s, 0, sizeof(*s)); span_log_init(&s->logging, SPAN_LOG_NONE, NULL); span_log_set_protocol(&s->logging, "T.38G"); t38_gateway_audio_init(s); t38_gateway_t38_init(s, tx_packet_handler, tx_packet_user_data); set_rx_active(s, TRUE); t38_gateway_set_supported_modems(s, T30_SUPPORT_V27TER | T30_SUPPORT_V29); t38_gateway_set_nsx_suppression(s, (const uint8_t *) "\x00\x00\x00", 3, (const uint8_t *) "\x00\x00\x00", 3); s->ecm_allowed = FALSE; restart_rx_modem(s); #if defined(LOG_FAX_AUDIO) { char buf[100 + 1]; struct tm *tm; time_t now; time(&now); tm = localtime(&now); sprintf(buf, "/tmp/t38-rx-audio-%p-%02d%02d%02d%02d%02d%02d", s, tm->tm_year%100, tm->tm_mon + 1, tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec); s->audio.fax_audio_rx_log = open(buf, O_CREAT | O_TRUNC | O_WRONLY, 0666); sprintf(buf, "/tmp/t38-tx-audio-%p-%02d%02d%02d%02d%02d%02d", s, tm->tm_year%100, tm->tm_mon + 1, tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec); s->audio.fax_audio_tx_log = open(buf, O_CREAT | O_TRUNC | O_WRONLY, 0666); } #endif return s; } /*- End of function --------------------------------------------------------*/ int t38_gateway_free(t38_gateway_state_t *s) { free(s); return 0; } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/at_interpreter.c0000644000175000017500000045644011150047205021063 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * at_interpreter.c - AT command interpreter to V.251, V.252, V.253, T.31 and the 3GPP specs. * * Written by Steve Underwood * * Special thanks to Lee Howard * for his great work debugging and polishing this code. * * Copyright (C) 2004, 2005, 2006 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: at_interpreter.c,v 1.30 2008/07/24 13:55:23 steveu Exp $ */ /*! \file */ #if defined(HAVE_CONFIG_H) #include #endif #include #include #include #include #include #include #include #include #include "spandsp/telephony.h" #include "spandsp/logging.h" #include "spandsp/queue.h" #include "spandsp/power_meter.h" #include "spandsp/complex.h" #include "spandsp/tone_generate.h" #include "spandsp/async.h" #include "spandsp/hdlc.h" #include "spandsp/fsk.h" #include "spandsp/at_interpreter.h" #define ms_to_samples(t) (((t)*SAMPLE_RATE)/1000) #define MANUFACTURER "www.soft-switch.org" #define SERIAL_NUMBER "42" #define GLOBAL_OBJECT_IDENTITY "42" enum { ASCII_RESULT_CODES = 1, NUMERIC_RESULT_CODES, NO_RESULT_CODES }; static at_profile_t profiles[3] = { { #if defined(_MSC_VER) /*.echo =*/ TRUE, /*.verbose =*/ TRUE, /*.result_code_format =*/ ASCII_RESULT_CODES, /*.pulse_dial =*/ FALSE, /*.double_escape =*/ FALSE, /*.adaptive_receive =*/ FALSE, /*.s_regs[100] =*/ {0, 0, 0, '\r', '\n', '\b', 1, 60, 5, 0, 0} #else .echo = TRUE, .verbose = TRUE, .result_code_format = ASCII_RESULT_CODES, .pulse_dial = FALSE, .double_escape = FALSE, .adaptive_receive = FALSE, .s_regs[0] = 0, .s_regs[3] = '\r', .s_regs[4] = '\n', .s_regs[5] = '\b', .s_regs[6] = 1, .s_regs[7] = 60, .s_regs[8] = 5, .s_regs[10] = 0 #endif } }; typedef const char *(*at_cmd_service_t)(at_state_t *s, const char *cmd); static const char *manufacturer = MANUFACTURER; static const char *model = PACKAGE; static const char *revision = VERSION; #define ETX 0x03 #define DLE 0x10 #define SUB 0x1A /* BEWARE: right now this must match up with a list in the T.31 code. */ enum { T31_NONE = -1, T31_FLUSH = 0, T31_SILENCE_TX, T31_SILENCE_RX, T31_CED_TONE, T31_CNG_TONE, T31_NOCNG_TONE, }; static const char *at_response_codes[] = { "OK", "CONNECT", "RING", "NO CARRIER", "ERROR", "???", "NO DIALTONE", "BUSY", "NO ANSWER", "+FCERROR", "+FRH:3" }; void at_set_at_rx_mode(at_state_t *s, int new_mode) { /* The use of a DTE timeout is mode dependent. Set the timeout appropriately in the modem. */ switch (new_mode) { case AT_MODE_HDLC: case AT_MODE_STUFFED: at_modem_control(s, s->dte_inactivity_timeout*1000, (void *) (intptr_t) s->dte_inactivity_timeout); break; default: at_modem_control(s, AT_MODEM_CONTROL_DTE_TIMEOUT, NULL); break; } s->at_rx_mode = new_mode; } /*- End of function --------------------------------------------------------*/ void at_put_response(at_state_t *s, const char *t) { uint8_t buf[3]; buf[0] = s->p.s_regs[3]; buf[1] = s->p.s_regs[4]; buf[2] = '\0'; if (s->p.result_code_format == ASCII_RESULT_CODES) s->at_tx_handler(s, s->at_tx_user_data, buf, 2); s->at_tx_handler(s, s->at_tx_user_data, (uint8_t *) t, strlen(t)); s->at_tx_handler(s, s->at_tx_user_data, buf, 2); } /*- End of function --------------------------------------------------------*/ void at_put_numeric_response(at_state_t *s, int val) { char buf[20]; snprintf(buf, sizeof(buf), "%d", val); at_put_response(s, buf); } /*- End of function --------------------------------------------------------*/ void at_put_response_code(at_state_t *s, int code) { uint8_t buf[20]; switch (s->p.result_code_format) { case ASCII_RESULT_CODES: at_put_response(s, at_response_codes[code]); break; case NUMERIC_RESULT_CODES: snprintf((char *) buf, sizeof(buf), "%d%c", code, s->p.s_regs[3]); s->at_tx_handler(s, s->at_tx_user_data, buf, strlen((char *) buf)); break; default: /* No result codes */ break; } } /*- End of function --------------------------------------------------------*/ static int answer_call(at_state_t *s) { if (at_modem_control(s, AT_MODEM_CONTROL_ANSWER, NULL) < 0) return FALSE; /* Answering should now be in progress. No AT response should be issued at this point. */ s->do_hangup = FALSE; return TRUE; } /*- End of function --------------------------------------------------------*/ void at_call_event(at_state_t *s, int event) { span_log(&s->logging, SPAN_LOG_FLOW, "Call event %d received\n", event); switch (event) { case AT_CALL_EVENT_ALERTING: at_modem_control(s, AT_MODEM_CONTROL_RNG, (void *) 1); if (s->display_call_info && !s->call_info_displayed) at_display_call_info(s); at_put_response_code(s, AT_RESPONSE_CODE_RING); if ((++s->rings_indicated) >= s->p.s_regs[0] && s->p.s_regs[0]) { /* The modem is set to auto-answer now */ answer_call(s); } break; case AT_CALL_EVENT_ANSWERED: at_modem_control(s, AT_MODEM_CONTROL_RNG, (void *) 0); if (s->fclass_mode == 0) { /* Normal data modem connection */ at_set_at_rx_mode(s, AT_MODE_CONNECTED); /* TODO: */ } else { /* FAX modem connection */ at_set_at_rx_mode(s, AT_MODE_DELIVERY); at_modem_control(s, AT_MODEM_CONTROL_RESTART, (void *) T31_CED_TONE); } break; case AT_CALL_EVENT_CONNECTED: span_log(&s->logging, SPAN_LOG_FLOW, "Dial call - connected. fclass=%d\n", s->fclass_mode); at_modem_control(s, AT_MODEM_CONTROL_RNG, (void *) 0); if (s->fclass_mode == 0) { /* Normal data modem connection */ at_set_at_rx_mode(s, AT_MODE_CONNECTED); /* TODO: */ } else { if (s->command_dial) { at_put_response_code(s, AT_RESPONSE_CODE_OK); at_set_at_rx_mode(s, AT_MODE_OFFHOOK_COMMAND); } else { /* FAX modem connection */ at_set_at_rx_mode(s, AT_MODE_DELIVERY); if (s->silent_dial) at_modem_control(s, AT_MODEM_CONTROL_RESTART, (void *) T31_NOCNG_TONE); else at_modem_control(s, AT_MODEM_CONTROL_RESTART, (void *) T31_CNG_TONE); s->dte_is_waiting = TRUE; } } break; case AT_CALL_EVENT_BUSY: at_set_at_rx_mode(s, AT_MODE_ONHOOK_COMMAND); at_put_response_code(s, AT_RESPONSE_CODE_BUSY); break; case AT_CALL_EVENT_NO_DIALTONE: at_set_at_rx_mode(s, AT_MODE_ONHOOK_COMMAND); at_put_response_code(s, AT_RESPONSE_CODE_NO_DIALTONE); break; case AT_CALL_EVENT_NO_ANSWER: at_set_at_rx_mode(s, AT_MODE_ONHOOK_COMMAND); at_put_response_code(s, AT_RESPONSE_CODE_NO_ANSWER); break; case AT_CALL_EVENT_HANGUP: span_log(&s->logging, SPAN_LOG_FLOW, "Hangup... at_rx_mode %d\n", s->at_rx_mode); at_modem_control(s, AT_MODEM_CONTROL_ONHOOK, NULL); if (s->dte_is_waiting) { if (s->ok_is_pending) { at_put_response_code(s, AT_RESPONSE_CODE_OK); s->ok_is_pending = FALSE; } else { at_put_response_code(s, AT_RESPONSE_CODE_NO_CARRIER); } s->dte_is_waiting = FALSE; at_set_at_rx_mode(s, AT_MODE_ONHOOK_COMMAND); } else if (s->fclass_mode && s->rx_signal_present) { s->rx_data[s->rx_data_bytes++] = DLE; s->rx_data[s->rx_data_bytes++] = ETX; s->at_tx_handler(s, s->at_tx_user_data, s->rx_data, s->rx_data_bytes); s->rx_data_bytes = 0; } if (s->at_rx_mode != AT_MODE_OFFHOOK_COMMAND && s->at_rx_mode != AT_MODE_ONHOOK_COMMAND) at_put_response_code(s, AT_RESPONSE_CODE_NO_CARRIER); s->rx_signal_present = FALSE; at_modem_control(s, AT_MODEM_CONTROL_RNG, (void *) 0); at_set_at_rx_mode(s, AT_MODE_ONHOOK_COMMAND); break; default: span_log(&s->logging, SPAN_LOG_WARNING, "Invalid call event %d received.\n", event); break; } } /*- End of function --------------------------------------------------------*/ void at_reset_call_info(at_state_t *s) { struct at_call_id *call_id; struct at_call_id *next; for (call_id = s->call_id; call_id; call_id = next) { next = call_id->next; free(call_id); } s->call_id = NULL; s->rings_indicated = 0; s->call_info_displayed = FALSE; } /*- End of function --------------------------------------------------------*/ void at_set_call_info(at_state_t *s, char const *id, char const *value) { struct at_call_id *new_call_id; struct at_call_id *call_id; /* TODO: We should really not merely ignore a failure to malloc */ if ((new_call_id = (struct at_call_id *) malloc(sizeof(*new_call_id))) == NULL) return; call_id = s->call_id; /* If these strdups fail its pretty harmless. We just appear to not have the relevant field. */ new_call_id->id = (id) ? strdup(id) : NULL; new_call_id->value = (value) ? strdup(value) : NULL; new_call_id->next = NULL; if (call_id) { while (call_id->next) call_id = call_id->next; call_id->next = new_call_id; } else { s->call_id = new_call_id; } } /*- End of function --------------------------------------------------------*/ void at_display_call_info(at_state_t *s) { char buf[132 + 1]; struct at_call_id *call_id = s->call_id; while (call_id) { snprintf(buf, sizeof(buf), "%s=%s", call_id->id ? call_id->id : "NULL", call_id->value ? call_id->value : ""); at_put_response(s, buf); call_id = call_id->next; } s->call_info_displayed = TRUE; } /*- End of function --------------------------------------------------------*/ static int parse_num(const char **s, int max_value) { int i; /* The spec. says no digits is valid, and should be treated as zero. */ i = 0; while (isdigit(**s)) { i = i*10 + ((**s) - '0'); (*s)++; } if (i > max_value) i = -1; return i; } /*- End of function --------------------------------------------------------*/ static int parse_hex_num(const char **s, int max_value) { int i; /* The spec. says a hex value is always 2 digits, and the alpha digits are upper case. */ i = 0; if (isdigit(**s)) i = **s - '0'; else if (**s >= 'A' && **s <= 'F') i = **s - 'A'; else return -1; (*s)++; if (isdigit(**s)) i = (i << 4) | (**s - '0'); else if (**s >= 'A' && **s <= 'F') i = (i << 4) | (**s - 'A'); else return -1; (*s)++; if (i > max_value) i = -1; return i; } /*- End of function --------------------------------------------------------*/ static int match_element(const char **variant, const char *variants) { int i; size_t len; char const *s; char const *t; s = variants; for (i = 0; *s; i++) { if ((t = strchr(s, ','))) len = t - s; else len = strlen(s); if (len == (int) strlen(*variant) && memcmp(*variant, s, len) == 0) { *variant += len; return i; } s += len; if (*s == ',') s++; } return -1; } /*- End of function --------------------------------------------------------*/ static int parse_out(at_state_t *s, const char **t, int *target, int max_value, const char *prefix, const char *def) { char buf[100]; int val; switch (*(*t)++) { case '=': switch (**t) { case '?': /* Show possible values */ (*t)++; snprintf(buf, sizeof(buf), "%s%s", (prefix) ? prefix : "", def); at_put_response(s, buf); break; default: /* Set value */ if ((val = parse_num(t, max_value)) < 0) return FALSE; if (target) *target = val; break; } break; case '?': /* Show current value */ val = (target) ? *target : 0; snprintf(buf, sizeof(buf), "%s%d", (prefix) ? prefix : "", val); at_put_response(s, buf); break; default: return FALSE; } return TRUE; } /*- End of function --------------------------------------------------------*/ static int parse_2_out(at_state_t *s, const char **t, int *target1, int max_value1, int *target2, int max_value2, const char *prefix, const char *def) { char buf[100]; int val1; int val2; switch (*(*t)++) { case '=': switch (**t) { case '?': /* Show possible values */ (*t)++; snprintf(buf, sizeof(buf), "%s%s", (prefix) ? prefix : "", def); at_put_response(s, buf); break; default: /* Set value */ if ((val1 = parse_num(t, max_value1)) < 0) return FALSE; if (target1) *target1 = val1; if (**t == ',') { (*t)++; if ((val2 = parse_num(t, max_value2)) < 0) return FALSE; if (target2) *target2 = val2; } break; } break; case '?': /* Show current value */ val1 = (target1) ? *target1 : 0; val2 = (target2) ? *target2 : 0; snprintf(buf, sizeof(buf), "%s%d,%d", (prefix) ? prefix : "", val1, val2); at_put_response(s, buf); break; default: return FALSE; } return TRUE; } /*- End of function --------------------------------------------------------*/ static int parse_hex_out(at_state_t *s, const char **t, int *target, int max_value, const char *prefix, const char *def) { char buf[100]; int val; switch (*(*t)++) { case '=': switch (**t) { case '?': /* Show possible values */ (*t)++; snprintf(buf, sizeof(buf), "%s%s", (prefix) ? prefix : "", def); at_put_response(s, buf); break; default: /* Set value */ if ((val = parse_hex_num(t, max_value)) < 0) return FALSE; if (target) *target = val; break; } break; case '?': /* Show current value */ val = (target) ? *target : 0; snprintf(buf, sizeof(buf), "%s%02X", (prefix) ? prefix : "", val); at_put_response(s, buf); break; default: return FALSE; } return TRUE; } /*- End of function --------------------------------------------------------*/ static int parse_string_list_out(at_state_t *s, const char **t, int *target, int max_value, const char *prefix, const char *def) { char buf[100]; int val; size_t len; char *tmp; switch (*(*t)++) { case '=': switch (**t) { case '?': /* Show possible values */ (*t)++; snprintf(buf, sizeof(buf), "%s%s", (prefix) ? prefix : "", def); at_put_response(s, buf); break; default: /* Set value */ if ((val = match_element(t, def)) < 0) return FALSE; if (target) *target = val; break; } break; case '?': /* Show current index value from def */ val = (target) ? *target : 0; while (val-- && (def = strchr(def, ','))) def++; if ((tmp = strchr(def, ','))) len = tmp - def; else len = strlen(def); snprintf(buf, sizeof(buf), "%s%.*s", (prefix) ? prefix : "", (int) len, def); at_put_response(s, buf); break; default: return FALSE; } return TRUE; } /*- End of function --------------------------------------------------------*/ static int parse_string_out(at_state_t *s, const char **t, char **target, const char *prefix) { char buf[100]; switch (*(*t)++) { case '=': switch (**t) { case '?': /* Show possible values */ (*t)++; snprintf(buf, sizeof(buf), "%s", (prefix) ? prefix : ""); at_put_response(s, buf); break; default: /* Set value */ if (*target) free(*target); /* If this strdup fails, it should be harmless */ *target = strdup(*t); break; } break; case '?': /* Show current index value */ at_put_response(s, (*target) ? *target : ""); break; default: return FALSE; } while (*t) t++; return TRUE; } /*- End of function --------------------------------------------------------*/ static const char *s_reg_handler(at_state_t *s, const char *t, int reg) { int val; int b; char buf[4]; /* Set or get an S register */ switch (*t++) { case '=': switch (*t) { case '?': t++; snprintf(buf, sizeof(buf), "%3.3d", 0); at_put_response(s, buf); break; default: if ((val = parse_num(&t, 255)) < 0) return NULL; s->p.s_regs[reg] = (uint8_t) val; break; } break; case '?': snprintf(buf, sizeof(buf), "%3.3d", s->p.s_regs[reg]); at_put_response(s, buf); break; case '.': if ((b = parse_num(&t, 7)) < 0) return NULL; switch (*t++) { case '=': switch (*t) { case '?': t++; at_put_numeric_response(s, 0); break; default: if ((val = parse_num(&t, 1)) < 0) return NULL; if (val) s->p.s_regs[reg] |= (1 << b); else s->p.s_regs[reg] &= ~(1 << b); break; } break; case '?': at_put_numeric_response(s, (int) ((s->p.s_regs[reg] >> b) & 1)); break; default: return NULL; } break; default: return NULL; } return t; } /*- End of function --------------------------------------------------------*/ static int process_class1_cmd(at_state_t *s, const char **t) { int val; int operation; int direction; int result; const char *allowed; direction = (*(*t + 2) == 'T'); operation = *(*t + 3); /* Step past the "+Fxx" */ *t += 4; switch (operation) { case 'S': allowed = "0-255"; break; case 'H': allowed = "3"; break; default: allowed = "24,48,72,73,74,96,97,98,121,122,145,146"; break; } val = -1; if (!parse_out(s, t, &val, 255, NULL, allowed)) return TRUE; if (val < 0) { /* It was just a query */ return TRUE; } /* All class 1 FAX commands are supposed to give an ERROR response, if the phone is on-hook. */ if (s->at_rx_mode == AT_MODE_ONHOOK_COMMAND) return FALSE; result = TRUE; if (s->class1_handler) result = s->class1_handler(s, s->class1_user_data, direction, operation, val); switch (result) { case 0: /* Inhibit an immediate response. (These commands should not be part of a multi-command entry.) */ *t = (const char *) -1; return TRUE; case -1: return FALSE; } return TRUE; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_dummy(at_state_t *s, const char *t) { /* Dummy routine to absorb delimiting characters from a command string */ return t + 1; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_A(at_state_t *s, const char *t) { /* V.250 6.3.5 - Answer (abortable) */ t += 1; if (!answer_call(s)) return NULL; return (const char *) -1; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_D(at_state_t *s, const char *t) { int ok; char *u; const char *w; char num[100 + 1]; char ch; /* V.250 6.3.1 - Dial (abortable) */ at_reset_call_info(s); s->do_hangup = FALSE; s->silent_dial = FALSE; s->command_dial = FALSE; t += 1; ok = FALSE; /* There are a numbers of options in a dial command string. Many are completely irrelevant in this application. */ w = t; u = num; for ( ; (ch = *t); t++) { if (isdigit(ch)) { /* V.250 6.3.1.1 Basic digit set */ *u++ = ch; } else { switch (ch) { case 'A': case 'B': case 'C': case 'D': case '*': case '#': /* V.250 6.3.1.1 Full DTMF repertoire */ if (!s->p.pulse_dial) *u++ = ch; break; case ' ': case '-': /* Ignore spaces and dashes */ /* This is not a standards based thing. It just improves compatibility with some other modems. */ break; case '+': /* V.250 6.3.1.1 International access code */ /* TODO: */ break; case ',': /* V.250 6.3.1.2 Pause */ /* Pass these through to the application to handle. */ *u++ = ch; break; case 'T': /* V.250 6.3.1.3 Tone dial */ s->p.pulse_dial = FALSE; break; case 'P': /* V.250 6.3.1.4 Pulse dial */ s->p.pulse_dial = TRUE; break; case '!': /* V.250 6.3.1.5 Hook flash, register recall */ /* TODO: */ break; case 'W': /* V.250 6.3.1.6 Wait for dial tone */ /* TODO: */ break; case '@': /* V.250 6.3.1.7 Wait for quiet answer */ s->silent_dial = TRUE; break; case 'S': /* V.250 6.3.1.8 Invoke stored string */ /* S= */ /* TODO: */ break; case 'G': case 'g': /* GSM07.07 6.2 - Control the CUG supplementary service for this call */ /* TODO: */ break; case 'I': case 'i': /* GSM07.07 6.2 - Override Calling Line Identification Restriction (CLIR) */ /* TODO: */ break; case ';': /* V.250 6.3.1 - Dial string terminator - make voice call and remain in command mode */ s->command_dial = TRUE; break; case '>': /* GSM07.07 6.2 - Direct dialling from phone book supplementary service subscription default value for this call */ /* TODO: */ break; default: return NULL; } } } *u = '\0'; if ((ok = at_modem_control(s, AT_MODEM_CONTROL_CALL, num)) < 0) return NULL; /* Dialing should now be in progress. No AT response should be issued at this point. */ return (const char *) -1; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_E(at_state_t *s, const char *t) { int val; /* V.250 6.2.4 - Command echo */ t += 1; if ((val = parse_num(&t, 1)) < 0) return NULL; s->p.echo = val; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_H(at_state_t *s, const char *t) { int val; /* V.250 6.3.6 - Hook control */ t += 1; if ((val = parse_num(&t, 1)) < 0) return NULL; if (val) { /* Take the receiver off-hook, effectively busying-out the modem. */ if (s->at_rx_mode != AT_MODE_ONHOOK_COMMAND && s->at_rx_mode != AT_MODE_OFFHOOK_COMMAND) return NULL; at_modem_control(s, AT_MODEM_CONTROL_OFFHOOK, NULL); at_set_at_rx_mode(s, AT_MODE_OFFHOOK_COMMAND); return t; } at_reset_call_info(s); if (s->at_rx_mode != AT_MODE_ONHOOK_COMMAND && s->at_rx_mode != AT_MODE_OFFHOOK_COMMAND) { /* Push out the last of the audio (probably by sending a short silence). */ at_modem_control(s, AT_MODEM_CONTROL_RESTART, (void *) T31_FLUSH); s->do_hangup = TRUE; at_set_at_rx_mode(s, AT_MODE_CONNECTED); return (const char *) -1; } at_modem_control(s, AT_MODEM_CONTROL_HANGUP, NULL); at_set_at_rx_mode(s, AT_MODE_ONHOOK_COMMAND); return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_I(at_state_t *s, const char *t) { int val; /* V.250 6.1.3 - Request identification information */ /* N.B. The information supplied in response to an ATIx command is very variable. It was widely used in different ways before the AT command set was standardised by the ITU. */ t += 1; switch (val = parse_num(&t, 255)) { case 0: at_put_response(s, model); break; case 3: at_put_response(s, manufacturer); break; default: return NULL; } return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_L(at_state_t *s, const char *t) { int val; /* V.250 6.3.13 - Monitor speaker loudness */ /* Just absorb this command, as we have no speaker */ t += 1; if ((val = parse_num(&t, 255)) < 0) return NULL; s->speaker_volume = val; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_M(at_state_t *s, const char *t) { int val; /* V.250 6.3.14 - Monitor speaker mode */ /* Just absorb this command, as we have no speaker */ t += 1; if ((val = parse_num(&t, 255)) < 0) return NULL; s->speaker_mode = val; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_O(at_state_t *s, const char *t) { int val; /* V.250 6.3.7 - Return to online data state */ t += 1; if ((val = parse_num(&t, 1)) < 0) return NULL; if (val == 0) { at_set_at_rx_mode(s, AT_MODE_CONNECTED); at_put_response_code(s, AT_RESPONSE_CODE_CONNECT); } return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_P(at_state_t *s, const char *t) { /* V.250 6.3.3 - Select pulse dialling (command) */ t += 1; s->p.pulse_dial = TRUE; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_Q(at_state_t *s, const char *t) { int val; /* V.250 6.2.5 - Result code suppression */ t += 1; if ((val = parse_num(&t, 1)) < 0) return NULL; switch (val) { case 0: s->p.result_code_format = (s->p.verbose) ? ASCII_RESULT_CODES : NUMERIC_RESULT_CODES; break; case 1: s->p.result_code_format = NO_RESULT_CODES; break; } return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_S0(at_state_t *s, const char *t) { /* V.250 6.3.8 - Automatic answer */ t += 2; return s_reg_handler(s, t, 0); } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_S10(at_state_t *s, const char *t) { /* V.250 6.3.12 - Automatic disconnect delay */ t += 3; return s_reg_handler(s, t, 10); } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_S3(at_state_t *s, const char *t) { /* V.250 6.2.1 - Command line termination character */ t += 2; return s_reg_handler(s, t, 3); } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_S4(at_state_t *s, const char *t) { /* V.250 6.2.2 - Response formatting character */ t += 2; return s_reg_handler(s, t, 4); } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_S5(at_state_t *s, const char *t) { /* V.250 6.2.3 - Command line editing character */ t += 2; return s_reg_handler(s, t, 5); } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_S6(at_state_t *s, const char *t) { /* V.250 6.3.9 - Pause before blind dialling */ t += 2; return s_reg_handler(s, t, 6); } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_S7(at_state_t *s, const char *t) { /* V.250 6.3.10 - Connection completion timeout */ t += 2; return s_reg_handler(s, t, 7); } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_S8(at_state_t *s, const char *t) { /* V.250 6.3.11 - Comma dial modifier time */ t += 2; return s_reg_handler(s, t, 8); } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_T(at_state_t *s, const char *t) { /* V.250 6.3.2 - Select tone dialling (command) */ t += 1; s->p.pulse_dial = FALSE; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_V(at_state_t *s, const char *t) { int val; /* V.250 6.2.6 - DCE response format */ t += 1; if ((val = parse_num(&t, 1)) < 0) return NULL; s->p.verbose = val; if (s->p.result_code_format != NO_RESULT_CODES) s->p.result_code_format = (s->p.verbose) ? ASCII_RESULT_CODES : NUMERIC_RESULT_CODES; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_X(at_state_t *s, const char *t) { int val; /* V.250 6.2.7 - Result code selection and call progress monitoring control */ /* 0 CONNECT result code is given upon entering online data state. Dial tone and busy detection are disabled. 1 CONNECT result code is given upon entering online data state. Dial tone and busy detection are disabled. 2 CONNECT result code is given upon entering online data state. Dial tone detection is enabled, and busy detection is disabled. 3 CONNECT result code is given upon entering online data state. Dial tone detection is disabled, and busy detection is enabled. 4 CONNECT result code is given upon entering online data state. Dial tone and busy detection are both enabled. */ t += 1; if ((val = parse_num(&t, 4)) < 0) return NULL; s->result_code_mode = val; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_Z(at_state_t *s, const char *t) { int val; /* V.250 6.1.1 - Reset to default configuration */ t += 1; if ((val = parse_num(&t, sizeof(profiles)/sizeof(profiles[0]) - 1)) < 0) return NULL; /* Just make sure we are on hook */ at_modem_control(s, AT_MODEM_CONTROL_HANGUP, NULL); at_set_at_rx_mode(s, AT_MODE_ONHOOK_COMMAND); s->p = profiles[val]; at_reset_call_info(s); return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_amp_C(at_state_t *s, const char *t) { int val; /* V.250 6.2.8 - Circuit 109 (received line signal detector) behaviour */ /* We have no RLSD pin, so just absorb this. */ t += 2; if ((val = parse_num(&t, 1)) < 0) return NULL; s->rlsd_behaviour = val; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_amp_D(at_state_t *s, const char *t) { int val; /* V.250 6.2.9 - Circuit 108 (data terminal ready) behaviour */ t += 2; if ((val = parse_num(&t, 2)) < 0) return NULL; /* TODO: We have no DTR pin, but we need this to get into online command state. */ s->dtr_behaviour = val; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_amp_F(at_state_t *s, const char *t) { t += 2; /* V.250 6.1.2 - Set to factory-defined configuration */ /* Just make sure we are on hook */ at_modem_control(s, AT_MODEM_CONTROL_HANGUP, NULL); at_set_at_rx_mode(s, AT_MODE_ONHOOK_COMMAND); s->p = profiles[0]; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_A8A(at_state_t *s, const char *t) { /* V.251 6.3 - V.8 calling tone indication */ return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_A8C(at_state_t *s, const char *t) { /* V.251 6.2 - V.8 answer signal indication */ return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_A8E(at_state_t *s, const char *t) { int val; /* V.251 5.1 - V.8 and V.8bis operation controls */ /* Syntax: +A8E=,,[,][,][,] */ /* =0 Disable V.8 origination negotiation =1 Enable DCE-controlled V.8 origination negotiation =2 Enable DTE-controlled V.8 origination negotiation, send V.8 CI only =3 Enable DTE-controlled V.8 origination negotiation, send 1100Hz CNG only =4 Enable DTE-controlled V.8 origination negotiation, send 1300Hz CT only =5 Enable DTE-controlled V.8 origination negotiation, send no tones =6 Enable DCE-controlled V.8 origination negotiation, issue +A8x indications =0 Disable V.8 answer negotiation =1 Enable DCE-controlled V.8 answer negotiation =2 Enable DTE-controlled V.8 answer negotiation, send ANSam =3 Enable DTE-controlled V.8 answer negotiation, send no signal =4 Disable DTE-controlled V.8 answer negotiation, send ANS =5 Enable DCE-controlled V.8 answer negotiation, issue +A8x indications =X..Y Set the V.8 CI signal call function to the hexadecimal octet value X..Y =0 Disable V.8bis negotiation =1 Enable DCE-controlled V.8bis negotiation =2 Enable DTE-controlled V.8bis negotiation ="" Set to alternative list of call function "option bit" values that the answering DCE shall accept from the caller ="" Set to alternative list of protocol "option bit" values that the answering DCE shall accept from the caller */ /* TODO: */ t += 4; if (!parse_out(s, &t, &val, 6, "+A8E:", "(0-6),(0-5),(00-FF)")) return NULL; if (*t != ',') return t; if ((val = parse_num(&t, 5)) < 0) return NULL; if (*t != ',') return t; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_A8I(at_state_t *s, const char *t) { /* V.251 6.1 - V.8 CI signal indication */ return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_A8J(at_state_t *s, const char *t) { /* V.251 6.4 - V.8 negotiation complete */ return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_A8M(at_state_t *s, const char *t) { /* V.251 5.2 - Send V.8 menu signals */ /* Syntax: +A8M= */ /* TODO: */ t += 4; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_A8R(at_state_t *s, const char *t) { /* V.251 6.6 - V.8bis signal and message reporting */ return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_A8T(at_state_t *s, const char *t) { int val; /* V.251 5.3 - Send V.8bis signal and/or message(s) */ /* Syntax: +A8T=[,<1st message>][,<2nd message>][,][,][,] */ /* =0 None =1 Initiating Mre =2 Initiating MRd =3 Initiating CRe, low power =4 Initiating CRe, high power =5 Initiating CRd =6 Initiating Esi =7 Responding MRd, low power =8 Responding MRd, high power =9 Responding CRd =10 Responding Esr */ /* TODO: */ t += 4; if (!parse_out(s, &t, &val, 10, "+A8T:", "(0-10)")) return NULL; s->v8bis_signal = val; if (*t != ',') return t; if ((val = parse_num(&t, 255)) < 0) return NULL; s->v8bis_1st_message = val; if (*t != ',') return t; if ((val = parse_num(&t, 255)) < 0) return NULL; s->v8bis_2nd_message = val; if (*t != ',') return t; if ((val = parse_num(&t, 255)) < 0) return NULL; s->v8bis_sig_en = val; if (*t != ',') return t; if ((val = parse_num(&t, 255)) < 0) return NULL; s->v8bis_msg_en = val; if (*t != ',') return t; if ((val = parse_num(&t, 255)) < 0) return NULL; s->v8bis_supp_delay = val; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_ASTO(at_state_t *s, const char *t) { /* V.250 6.3.15 - Store telephone number */ /* TODO: */ t += 5; if (!parse_out(s, &t, NULL, 1, "+ASTO:", "")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CAAP(at_state_t *s, const char *t) { /* 3GPP TS 27.007 7.25 - Automatic answer for eMLPP Service */ /* TODO: */ t += 5; if (!parse_2_out(s, &t, NULL, 65535, NULL, 65535, "+CAAP:", "")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CACM(at_state_t *s, const char *t) { /* 3GPP TS 27.007 8.25 - Accumulated call meter */ /* TODO: */ t += 5; if (!parse_out(s, &t, NULL, 1, "+CACM:", "")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CACSP(at_state_t *s, const char *t) { /* 3GPP TS 27.007 11.1.7 - Voice Group or Voice Broadcast Call State Attribute Presentation */ /* TODO: */ t += 6; if (!parse_out(s, &t, NULL, 1, "+CACSP:", "")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CAD(at_state_t *s, const char *t) { /* IS-99 5.6.3 - Query analogue or digital service */ /* TODO: */ t += 4; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CAEMLPP(at_state_t *s, const char *t) { /* 3GPP TS 27.007 7.22 - eMLPP Priority Registration and Interrogation */ /* TODO: */ t += 8; if (!parse_out(s, &t, NULL, 1, "+CAEMLPP:", "")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CAHLD(at_state_t *s, const char *t) { /* 3GPP TS 27.007 11.1.3 - Leave an ongoing Voice Group or Voice Broadcast Call */ /* TODO: */ t += 6; if (!parse_out(s, &t, NULL, 1, "+CAHLD:", "")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CAJOIN(at_state_t *s, const char *t) { /* 3GPP TS 27.007 11.1.1 - Accept an incoming Voice Group or Voice Broadcast Call */ /* TODO: */ t += 7; if (!parse_out(s, &t, NULL, 1, "+CAJOIN:", "")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CALA(at_state_t *s, const char *t) { /* 3GPP TS 27.007 8.16 - Alarm */ /* TODO: */ t += 5; if (!parse_out(s, &t, NULL, 1, "+CALA:", "")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CALCC(at_state_t *s, const char *t) { /* 3GPP TS 27.007 11.1.6 - List current Voice Group and Voice Broadcast Calls */ /* TODO: */ t += 6; if (!parse_out(s, &t, NULL, 1, "+CALCC:", "")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CALD(at_state_t *s, const char *t) { /* 3GPP TS 27.007 8.38 - Delete alarm */ /* TODO: */ t += 5; if (!parse_out(s, &t, NULL, 1, "+CALD:", "")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CALM(at_state_t *s, const char *t) { /* 3GPP TS 27.007 8.20 - Alert sound mode */ /* TODO: */ t += 5; if (!parse_out(s, &t, NULL, 1, "+CALM:", "")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CAMM(at_state_t *s, const char *t) { /* 3GPP TS 27.007 8.26 - Accumulated call meter maximum */ /* TODO: */ t += 5; if (!parse_out(s, &t, NULL, 1, "+CAMM:", "")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CANCHEV(at_state_t *s, const char *t) { /* 3GPP TS 27.007 11.1.8 - NCH Support Indication */ /* TODO: */ t += 8; if (!parse_out(s, &t, NULL, 1, "+CANCHEV:", "")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CAOC(at_state_t *s, const char *t) { /* 3GPP TS 27.007 7.16 - Advice of Charge */ /* TODO: */ t += 5; if (!parse_out(s, &t, NULL, 1, "+CAOC:", "")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CAPD(at_state_t *s, const char *t) { /* 3GPP TS 27.007 8.39 - Postpone or dismiss an alarm */ /* TODO: */ t += 5; if (!parse_out(s, &t, NULL, 1, "+CAPD:", "")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CAPTT(at_state_t *s, const char *t) { /* 3GPP TS 27.007 11.1.4 - Talker Access for Voice Group Call */ /* TODO: */ t += 6; if (!parse_out(s, &t, NULL, 1, "+CAPTT:", "")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CAREJ(at_state_t *s, const char *t) { /* 3GPP TS 27.007 11.1.2 - Reject an incoming Voice Group or Voice Broadcast Call */ /* TODO: */ t += 6; if (!parse_out(s, &t, NULL, 1, "+CAREJ:", "")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CAULEV(at_state_t *s, const char *t) { /* 3GPP TS 27.007 11.1.5 - Voice Group Call Uplink Status Presentation */ /* TODO: */ t += 7; if (!parse_out(s, &t, NULL, 1, "+CAULEV:", "")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CBC(at_state_t *s, const char *t) { /* 3GPP TS 27.007 8.4 - Battery charge */ /* TODO: */ t += 4; if (!parse_out(s, &t, NULL, 1, "+CBC:", "")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CBCS(at_state_t *s, const char *t) { /* 3GPP TS 27.007 11.3.2 - VBS subscriptions and GId status */ /* TODO: */ t += 5; if (!parse_out(s, &t, NULL, 1, "+CBCS:", "")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CBIP(at_state_t *s, const char *t) { /* IS-99 5.6 - Base station IP address */ /* TODO: */ t += 5; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CBST(at_state_t *s, const char *t) { /* 3GPP TS 27.007 6.7 - Select bearer service type */ /* TODO: */ t += 5; if (!parse_out(s, &t, NULL, 1, "+CBST:", "")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CCFC(at_state_t *s, const char *t) { /* 3GPP TS 27.007 7.11 - Call forwarding number and conditions */ /* TODO: */ t += 5; if (!parse_out(s, &t, NULL, 1, "+CCFC:", "")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CCLK(at_state_t *s, const char *t) { /* 3GPP TS 27.007 8.15 - Clock */ /* TODO: */ t += 5; if (!parse_out(s, &t, NULL, 1, "+CCLK:", "")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CCS(at_state_t *s, const char *t) { /* IS-135 4.1.22 - Compression status */ /* TODO: */ t += 4; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CCUG(at_state_t *s, const char *t) { /* 3GPP TS 27.007 7.10 - Closed user group */ /* TODO: */ t += 5; if (!parse_out(s, &t, NULL, 1, "+CCUG:", "")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CCWA(at_state_t *s, const char *t) { /* 3GPP TS 27.007 7.12 - Call waiting */ /* TODO: */ t += 5; if (!parse_out(s, &t, NULL, 1, "+CCWA:", "")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CCWE(at_state_t *s, const char *t) { /* 3GPP TS 27.007 8.28 - Call Meter maximum event */ /* TODO: */ t += 5; if (!parse_out(s, &t, NULL, 1, "+CCWE:", "")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CDIP(at_state_t *s, const char *t) { /* 3GPP TS 27.007 7.9 - Called line identification presentation */ /* TODO: */ t += 5; if (!parse_out(s, &t, NULL, 1, "+CDIP:", "")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CDIS(at_state_t *s, const char *t) { /* 3GPP TS 27.007 8.8 - Display control */ /* TODO: */ t += 5; if (!parse_out(s, &t, NULL, 1, "+CDIS:", "")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CDV(at_state_t *s, const char *t) { /* IS-99 5.6 - Dial command for voice call */ /* TODO: */ t += 4; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CEER(at_state_t *s, const char *t) { /* 3GPP TS 27.007 6.10 - Extended error report */ /* TODO: */ t += 5; if (!parse_out(s, &t, NULL, 1, "+CEER:", "")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CESP(at_state_t *s, const char *t) { /* GSM07.05 3.2.4 - Enter SMS block mode protocol */ /* TODO: */ t += 5; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CFCS(at_state_t *s, const char *t) { /* 3GPP TS 27.007 7.24 - Fast call setup conditions */ /* TODO: */ t += 5; if (!parse_out(s, &t, NULL, 1, "+CFCS:", "")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CFG(at_state_t *s, const char *t) { /* IS-99 5.6 - Configuration string */ /* TODO: */ t += 4; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CFUN(at_state_t *s, const char *t) { /* 3GPP TS 27.007 8.2 - Set phone functionality */ /* TODO: */ t += 5; if (!parse_out(s, &t, NULL, 1, "+CFUN:", "")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CGACT(at_state_t *s, const char *t) { /* 3GPP TS 27.007 10.1.10 - PDP context activate or deactivate */ /* TODO: */ t += 6; if (!parse_out(s, &t, NULL, 1, "+CGACT:", "")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CGANS(at_state_t *s, const char *t) { /* 3GPP TS 27.007 10.1.16 - Manual response to a network request for PDP context activation */ /* TODO: */ t += 6; if (!parse_out(s, &t, NULL, 1, "+CGANS:", "")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CGATT(at_state_t *s, const char *t) { /* 3GPP TS 27.007 10.1.9 - PS attach or detach */ /* TODO: */ t += 6; if (!parse_out(s, &t, NULL, 1, "+CGATT:", "")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CGAUTO(at_state_t *s, const char *t) { /* 3GPP TS 27.007 10.1.15 - Automatic response to a network request for PDP context activation */ /* TODO: */ t += 7; if (!parse_out(s, &t, NULL, 1, "+CGAUTO:", "")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CGCAP(at_state_t *s, const char *t) { /* IS-99 5.6 - Request complete capabilities list */ /* TODO: */ t += 6; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CGCLASS(at_state_t *s, const char *t) { /* 3GPP TS 27.007 10.1.17 - GPRS mobile station class (GPRS only) */ /* TODO: */ t += 8; if (!parse_out(s, &t, NULL, 1, "+CGCLASS:", "")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CGCLOSP(at_state_t *s, const char *t) { /* 3GPP TS 27.007 10.1.13 - Configure local Octet Stream PAD parameters (Obsolete) */ /* TODO: */ t += 8; if (!parse_out(s, &t, NULL, 1, "+CGCLOSP:", "")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CGCLPAD(at_state_t *s, const char *t) { /* 3GPP TS 27.007 10.1.12 - Configure local triple-X PAD parameters (GPRS only) (Obsolete) */ /* TODO: */ t += 8; if (!parse_out(s, &t, NULL, 1, "+CGCLPAD:", "")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CGCMOD(at_state_t *s, const char *t) { /* 3GPP TS 27.007 10.1.11 - PDP Context Modify */ /* TODO: */ t += 7; if (!parse_out(s, &t, NULL, 1, "+CGCMOD:", "")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CGCS(at_state_t *s, const char *t) { /* 3GPP TS 27.007 11.3.1 - VGCS subscriptions and GId status */ /* TODO: */ t += 5; if (!parse_out(s, &t, NULL, 1, "+CGCS:", "")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CGDATA(at_state_t *s, const char *t) { /* 3GPP TS 27.007 10.1.12 - Enter data state */ /* TODO: */ t += 7; if (!parse_out(s, &t, NULL, 1, "+CGDATA:", "")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CGDCONT(at_state_t *s, const char *t) { /* 3GPP TS 27.007 10.1.1 - Define PDP Context */ /* TODO: */ t += 8; if (!parse_out(s, &t, NULL, 1, "+CGDCONT:", "")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CGDSCONT(at_state_t *s, const char *t) { /* 3GPP TS 27.007 10.1.2 - Define Secondary PDP Context */ /* TODO: */ t += 9; if (!parse_out(s, &t, NULL, 1, "+CGDSCONT:", "")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CGEQMIN(at_state_t *s, const char *t) { /* 3GPP TS 27.007 10.1.7 - 3G Quality of Service Profile (Minimum acceptable) */ /* TODO: */ t += 8; if (!parse_out(s, &t, NULL, 1, "+CGEQMIN:", "")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CGEQNEG(at_state_t *s, const char *t) { /* 3GPP TS 27.007 10.1.8 - 3G Quality of Service Profile (Negotiated) */ /* TODO: */ t += 8; if (!parse_out(s, &t, NULL, 1, "+CGEQNEG:", "")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CGEQREQ(at_state_t *s, const char *t) { /* 3GPP TS 27.007 10.1.6 - 3G Quality of Service Profile (Requested) */ /* TODO: */ t += 8; if (!parse_out(s, &t, NULL, 1, "+CGEQREQ:", "")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CGEREP(at_state_t *s, const char *t) { /* 3GPP TS 27.007 10.1.18 - Packet Domain event reporting */ /* TODO: */ t += 7; if (!parse_out(s, &t, NULL, 1, "+CGEREP:", "")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CGMI(at_state_t *s, const char *t) { /* 3GPP TS 27.007 5.1 - Request manufacturer identification */ /* TODO: */ t += 5; if (!parse_out(s, &t, NULL, 1, "+CGMI:", "")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CGMM(at_state_t *s, const char *t) { /* 3GPP TS 27.007 5.2 - Request model identification */ /* TODO: */ t += 5; if (!parse_out(s, &t, NULL, 1, "+CGMM:", "")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CGMR(at_state_t *s, const char *t) { /* 3GPP TS 27.007 5.3 - Request revision identification */ /* TODO: */ t += 5; if (!parse_out(s, &t, NULL, 1, "+CGMR:", "")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CGOI(at_state_t *s, const char *t) { /* IS-99 5.6 - Request global object identification */ /* TODO: */ t += 5; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CGPADDR(at_state_t *s, const char *t) { /* 3GPP TS 27.007 10.1.14 - Show PDP address */ /* TODO: */ t += 8; if (!parse_out(s, &t, NULL, 1, "+CGPADDR:", "")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CGQMIN(at_state_t *s, const char *t) { /* 3GPP TS 27.007 10.1.5 - Quality of Service Profile (Minimum acceptable) */ /* TODO: */ t += 7; if (!parse_out(s, &t, NULL, 1, "+CGQMIN:", "")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CGQREQ(at_state_t *s, const char *t) { /* 3GPP TS 27.007 10.1.4 - Quality of Service Profile (Requested) */ /* TODO: */ t += 7; if (!parse_out(s, &t, NULL, 1, "+CGQREQ:", "")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CGREG(at_state_t *s, const char *t) { /* 3GPP TS 27.007 10.1.19 - GPRS network registration status */ /* TODO: */ t += 6; if (!parse_out(s, &t, NULL, 1, "+CGREG:", "")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CGSMS(at_state_t *s, const char *t) { /* 3GPP TS 27.007 10.1.20 - Select service for MO SMS messages */ /* TODO: */ t += 6; if (!parse_out(s, &t, NULL, 1, "+CGSMS:", "")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CGSN(at_state_t *s, const char *t) { /* 3GPP TS 27.007 5.4 - Request product serial number identification */ /* TODO: */ t += 5; if (!parse_out(s, &t, NULL, 1, "+CGSN:", "")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CGTFT(at_state_t *s, const char *t) { /* 3GPP TS 27.007 10.1.3 - Traffic Flow Template */ /* TODO: */ t += 6; if (!parse_out(s, &t, NULL, 1, "+CGTFT:", "")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CHLD(at_state_t *s, const char *t) { /* 3GPP TS 27.007 7.13 - Call related supplementary services */ /* TODO: */ t += 5; if (!parse_out(s, &t, NULL, 1, "+CHLD:", "")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CHSA(at_state_t *s, const char *t) { /* 3GPP TS 27.007 6.18 - HSCSD non-transparent asymmetry configuration */ /* TODO: */ t += 5; if (!parse_out(s, &t, NULL, 1, "+CHSA:", "")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CHSC(at_state_t *s, const char *t) { /* 3GPP TS 27.007 6.15 - HSCSD current call parameters */ /* TODO: */ t += 5; if (!parse_out(s, &t, NULL, 1, "+CHSC:", "")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CHSD(at_state_t *s, const char *t) { /* 3GPP TS 27.007 6.12 - HSCSD device parameters */ /* TODO: */ t += 5; if (!parse_out(s, &t, NULL, 1, "+CHSD:", "")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CHSN(at_state_t *s, const char *t) { /* 3GPP TS 27.007 6.14 - HSCSD non-transparent call configuration */ /* TODO: */ t += 5; if (!parse_out(s, &t, NULL, 1, "+CHSN:", "")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CHSR(at_state_t *s, const char *t) { /* 3GPP TS 27.007 6.16 - HSCSD parameters report */ /* TODO: */ t += 5; if (!parse_out(s, &t, NULL, 1, "+CHSR:", "")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CHST(at_state_t *s, const char *t) { /* 3GPP TS 27.007 6.13 - HSCSD transparent call configuration */ /* TODO: */ t += 5; if (!parse_out(s, &t, NULL, 1, "+CHST:", "")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CHSU(at_state_t *s, const char *t) { /* 3GPP TS 27.007 6.17 - HSCSD automatic user initiated upgrading */ /* TODO: */ t += 5; if (!parse_out(s, &t, NULL, 1, "+CHSU:", "")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CHUP(at_state_t *s, const char *t) { /* 3GPP TS 27.007 6.5 - Hangup call */ /* TODO: */ t += 5; if (!parse_out(s, &t, NULL, 1, "+CHUP:", "")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CHV(at_state_t *s, const char *t) { /* IS-99 5.6 - Hang-up voice */ /* TODO: */ t += 4; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CIMI(at_state_t *s, const char *t) { /* 3GPP TS 27.007 5.6 - Request international mobile subscriber identity */ /* TODO: */ t += 5; if (!parse_out(s, &t, NULL, 1, "+CIMI:", "")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CIND(at_state_t *s, const char *t) { /* 3GPP TS 27.007 8.9 - Indicator control */ /* TODO: */ t += 5; if (!parse_out(s, &t, NULL, 1, "+CIND:", "")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CIT(at_state_t *s, const char *t) { /* IS-99 5.6 - Command state inactivity timer */ /* TODO: */ t += 4; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CKPD(at_state_t *s, const char *t) { /* 3GPP TS 27.007 8.7 - Keypad control */ /* TODO: */ t += 5; if (!parse_out(s, &t, NULL, 1, "+CKPD:", "")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CLAC(at_state_t *s, const char *t) { /* 3GPP TS 27.007 8.37 - List all available AT commands */ /* TODO: */ t += 5; if (!parse_out(s, &t, NULL, 1, "+CLAC:", "")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CLAE(at_state_t *s, const char *t) { /* 3GPP TS 27.007 8.31 - Language Event */ /* TODO: */ t += 5; if (!parse_out(s, &t, NULL, 1, "+CLAE:", "")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CLAN(at_state_t *s, const char *t) { /* 3GPP TS 27.007 8.30 - Set Language */ /* TODO: */ t += 5; if (!parse_out(s, &t, NULL, 1, "+CLAN:", "")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CLCC(at_state_t *s, const char *t) { /* 3GPP TS 27.007 7.18 - List current calls */ /* TODO: */ t += 5; if (!parse_out(s, &t, NULL, 1, "+CLCC:", "")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CLCK(at_state_t *s, const char *t) { /* 3GPP TS 27.007 7.4 - Facility lock */ /* TODO: */ t += 5; if (!parse_out(s, &t, NULL, 1, "+CLCK:", "")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CLIP(at_state_t *s, const char *t) { /* 3GPP TS 27.007 7.6 - Calling line identification presentation */ /* TODO: */ t += 5; if (!parse_out(s, &t, NULL, 1, "+CLIP:", "")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CLIR(at_state_t *s, const char *t) { /* 3GPP TS 27.007 7.7 - Calling line identification restriction */ /* TODO: */ t += 5; if (!parse_out(s, &t, NULL, 1, "+CLIR:", "")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CLVL(at_state_t *s, const char *t) { /* 3GPP TS 27.007 8.23 - Loudspeaker volume level */ /* TODO: */ t += 5; if (!parse_out(s, &t, NULL, 1, "+CLVL:", "")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CMAR(at_state_t *s, const char *t) { /* 3GPP TS 27.007 8.36 - Master Reset */ /* TODO: */ t += 5; if (!parse_out(s, &t, NULL, 1, "+CMAR:", "")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CMEC(at_state_t *s, const char *t) { /* 3GPP TS 27.007 8.6 - Mobile Termination control mode */ /* TODO: */ t += 5; if (!parse_out(s, &t, NULL, 1, "+CMEC:", "")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CMEE(at_state_t *s, const char *t) { /* GSM07.07 9.1 - Report mobile equipment error */ /* TODO: */ t += 5; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CMER(at_state_t *s, const char *t) { /* 3GPP TS 27.007 8.10 - Mobile Termination event reporting */ /* TODO: */ t += 5; if (!parse_out(s, &t, NULL, 1, "+CMER:", "")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CMGC(at_state_t *s, const char *t) { /* GSM07.05 3.5.5/4.5 - Send command */ /* TODO: */ t += 5; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CMGD(at_state_t *s, const char *t) { /* GSM07.05 3.5.4 - Delete message */ /* TODO: */ t += 5; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CMGF(at_state_t *s, const char *t) { /* GSM07.05 3.2.3 - Message Format */ /* TODO: */ t += 5; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CMGL(at_state_t *s, const char *t) { /* GSM07.05 3.4.2/4.1 - List messages */ /* TODO: */ t += 5; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CMGR(at_state_t *s, const char *t) { /* GSM07.05 3.4.3/4.2 - Read message */ /* TODO: */ t += 5; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CMGS(at_state_t *s, const char *t) { /* GSM07.05 3.5.1/4.3 - Send message */ /* TODO: */ t += 5; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CMGW(at_state_t *s, const char *t) { /* GSM07.05 3.5.3/4.4 - Write message to memory */ /* TODO: */ t += 5; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CMIP(at_state_t *s, const char *t) { /* IS-99 5.6 - Mobile station IP address */ /* TODO: */ t += 5; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CMM(at_state_t *s, const char *t) { /* IS-135 4.1.23 - Menu map */ /* TODO: */ t += 4; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CMMS(at_state_t *s, const char *t) { /* GSM07.05 3.5.6 - More messages to send */ /* TODO: */ t += 5; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CMOD(at_state_t *s, const char *t) { /* 3GPP TS 27.007 6.4 - Call mode */ /* TODO: */ t += 5; if (!parse_out(s, &t, NULL, 1, "+CMOD:", "")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CMSS(at_state_t *s, const char *t) { /* GSM07.05 3.5.2/4.7 - Send message from storage */ /* TODO: */ t += 5; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CMUT(at_state_t *s, const char *t) { /* 3GPP TS 27.007 8.24 - Mute control */ /* TODO: */ t += 5; if (!parse_out(s, &t, NULL, 1, "+CMUT:", "")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CNMA(at_state_t *s, const char *t) { /* GSM07.05 3.4.4/4.6 - New message acknowledgement to terminal adapter */ /* TODO: */ t += 5; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CNMI(at_state_t *s, const char *t) { /* GSM07.05 3.4.1 - New message indications to terminal equipment */ /* TODO: */ t += 5; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CMUX(at_state_t *s, const char *t) { /* 3GPP TS 27.007 5.7 - Multiplexing mode */ /* TODO: */ t += 5; if (!parse_out(s, &t, NULL, 1, "+CMUX:", "")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CNUM(at_state_t *s, const char *t) { /* 3GPP TS 27.007 7.1 - Subscriber number */ /* TODO: */ t += 5; if (!parse_out(s, &t, NULL, 1, "+CNUM:", "")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_COLP(at_state_t *s, const char *t) { /* 3GPP TS 27.007 7.8 - Connected line identification presentation */ /* TODO: */ t += 5; if (!parse_out(s, &t, NULL, 1, "+COLP:", "")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_COPN(at_state_t *s, const char *t) { /* 3GPP TS 27.007 7.21 - Read operator names */ /* TODO: */ t += 5; if (!parse_out(s, &t, NULL, 1, "+COPN:", "")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_COPS(at_state_t *s, const char *t) { /* 3GPP TS 27.007 7.3 - PLMN selection */ /* TODO: */ t += 5; if (!parse_out(s, &t, NULL, 1, "+COPS:", "")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_COS(at_state_t *s, const char *t) { /* IS-135 4.1.24 - Originating service */ /* TODO: */ t += 4; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_COTDI(at_state_t *s, const char *t) { /* 3GPP TS 27.007 11.1.9 - Originator to Dispatcher Information */ /* TODO: */ t += 6; if (!parse_out(s, &t, NULL, 1, "+COTDI:", "")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CPAS(at_state_t *s, const char *t) { /* 3GPP TS 27.007 8.1 - Phone activity status */ /* TODO: */ t += 5; if (!parse_out(s, &t, NULL, 1, "+CPAS:", "")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CPBF(at_state_t *s, const char *t) { /* 3GPP TS 27.007 8.13 - Find phonebook entries */ /* TODO: */ t += 5; if (!parse_out(s, &t, NULL, 1, "+CPBF:", "")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CPBR(at_state_t *s, const char *t) { /* 3GPP TS 27.007 8.12 - Read phonebook entries */ /* TODO: */ t += 5; if (!parse_out(s, &t, NULL, 1, "+CPBR:", "")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CPBS(at_state_t *s, const char *t) { /* 3GPP TS 27.007 8.11 - Select phonebook memory storage */ /* TODO: */ t += 5; if (!parse_out(s, &t, NULL, 1, "+CPBS:", "")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CPBW(at_state_t *s, const char *t) { /* 3GPP TS 27.007 8.14 - Write phonebook entry */ /* TODO: */ t += 5; if (!parse_out(s, &t, NULL, 1, "+CPBW:", "")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CPIN(at_state_t *s, const char *t) { /* 3GPP TS 27.007 8.3 - Enter PIN */ /* TODO: */ t += 5; if (!parse_out(s, &t, NULL, 1, "+CPIN:", "")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CPLS(at_state_t *s, const char *t) { /* 3GPP TS 27.007 7.20 - Selection of preferred PLMN list */ /* TODO: */ t += 5; if (!parse_out(s, &t, NULL, 1, "+CPLS:", "")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CPMS(at_state_t *s, const char *t) { /* GSM07.05 3.2.2 - Preferred message storage */ /* TODO: */ t += 5; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CPOL(at_state_t *s, const char *t) { /* 3GPP TS 27.007 7.19 - Preferred PLMN list */ /* TODO: */ t += 5; if (!parse_out(s, &t, NULL, 1, "+CPOL:", "")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CPPS(at_state_t *s, const char *t) { /* 3GPP TS 27.007 7.23 - eMLPP subscriptions */ /* TODO: */ t += 5; if (!parse_out(s, &t, NULL, 1, "+CPPS:", "")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CPROT(at_state_t *s, const char *t) { /* 3GPP TS 27.007 8.42 - Enter protocol mode */ /* TODO: */ t += 6; if (!parse_out(s, &t, NULL, 1, "+CPROT:", "")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CPUC(at_state_t *s, const char *t) { /* 3GPP TS 27.007 8.27 - Price per unit and currency table */ /* TODO: */ t += 5; if (!parse_out(s, &t, NULL, 1, "+CPUC:", "")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CPWC(at_state_t *s, const char *t) { /* 3GPP TS 27.007 8.29 - Power class */ /* TODO: */ t += 5; if (!parse_out(s, &t, NULL, 1, "+CPWC:", "")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CPWD(at_state_t *s, const char *t) { /* 3GPP TS 27.007 7.5 - Change password */ /* TODO: */ t += 5; if (!parse_out(s, &t, NULL, 1, "+CPWD:", "")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CQD(at_state_t *s, const char *t) { /* IS-135 4.1.25 - Query disconnect timer */ /* TODO: */ t += 4; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CR(at_state_t *s, const char *t) { /* 3GPP TS 27.007 6.9 - Service reporting control */ /* TODO: */ t += 3; if (!parse_out(s, &t, NULL, 1, "+CR:", "")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CRC(at_state_t *s, const char *t) { /* 3GPP TS 27.007 6.11 - Cellular result codes */ /* TODO: */ t += 4; if (!parse_out(s, &t, NULL, 1, "+CRC:", "")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CREG(at_state_t *s, const char *t) { /* 3GPP TS 27.007 7.2 - Network registration */ /* TODO: */ t += 5; if (!parse_out(s, &t, NULL, 1, "+CREG:", "")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CRES(at_state_t *s, const char *t) { /* GSM07.05 3.3.6 - Restore Settings */ /* TODO: */ t += 5; if (!parse_out(s, &t, NULL, 1, "+CRLP:", "")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CRLP(at_state_t *s, const char *t) { /* 3GPP TS 27.007 6.8 - Radio link protocol */ /* TODO: */ t += 5; if (!parse_out(s, &t, NULL, 1, "+CRLP:", "")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CRM(at_state_t *s, const char *t) { /* IS-99 5.6 - Set rm interface protocol */ /* TODO: */ t += 4; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CRMC(at_state_t *s, const char *t) { /* 3GPP TS 27.007 8.34 - Ring Melody Control */ /* TODO: */ t += 5; if (!parse_out(s, &t, NULL, 1, "+CRMC:", "")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CRMP(at_state_t *s, const char *t) { /* 3GPP TS 27.007 8.35 - Ring Melody Playback */ /* TODO: */ t += 5; if (!parse_out(s, &t, NULL, 1, "+CRMP:", "")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CRSL(at_state_t *s, const char *t) { /* 3GPP TS 27.007 8.21 - Ringer sound level */ /* TODO: */ t += 5; if (!parse_out(s, &t, NULL, 1, "+CRSL:", "")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CRSM(at_state_t *s, const char *t) { /* 3GPP TS 27.007 8.18 - Restricted SIM access */ /* TODO: */ t += 5; if (!parse_out(s, &t, NULL, 1, "+CRSM:", "")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CSAS(at_state_t *s, const char *t) { /* GSM07.05 3.3.5 - Save settings */ /* TODO: */ t += 5; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CSCA(at_state_t *s, const char *t) { /* GSM07.05 3.3.1 - Service centre address */ /* TODO: */ t += 5; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CSCB(at_state_t *s, const char *t) { /* GSM07.05 3.3.4 - Select cell broadcast message types */ /* TODO: */ t += 5; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CSCC(at_state_t *s, const char *t) { /* 3GPP TS 27.007 8.19 - Secure control command */ /* TODO: */ t += 5; if (!parse_out(s, &t, NULL, 1, "+CSCC:", "")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CSCS(at_state_t *s, const char *t) { /* 3GPP TS 27.007 5.5 - Select TE character set */ /* TODO: */ t += 5; if (!parse_out(s, &t, NULL, 1, "+CSCS:", "")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CSDF(at_state_t *s, const char *t) { /* 3GPP TS 27.007 6.22 - Settings date format */ /* TODO: */ t += 5; if (!parse_out(s, &t, NULL, 1, "+CSDF:", "")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CSDH(at_state_t *s, const char *t) { /* GSM07.05 3.3.3 - Show text mode parameters */ /* TODO: */ t += 5; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CSGT(at_state_t *s, const char *t) { /* 3GPP TS 27.007 8.32 - Set Greeting Text */ /* TODO: */ t += 5; if (!parse_out(s, &t, NULL, 1, "+CSGT:", "")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CSIL(at_state_t *s, const char *t) { /* 3GPP TS 27.007 6.23 - Silence Command */ /* TODO: */ t += 5; if (!parse_out(s, &t, NULL, 1, "+CSIL:", "")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CSIM(at_state_t *s, const char *t) { /* 3GPP TS 27.007 8.17 - Generic SIM access */ /* TODO: */ t += 5; if (!parse_out(s, &t, NULL, 1, "+CSIM:", "")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CSMP(at_state_t *s, const char *t) { /* GSM07.05 3.3.2 - Set text mode parameters */ /* TODO: */ t += 5; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CSMS(at_state_t *s, const char *t) { /* GSM07.05 3.2.1 - Select Message Service */ /* TODO: */ t += 5; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CSNS(at_state_t *s, const char *t) { /* 3GPP TS 27.007 6.19 - Single numbering scheme */ /* TODO: */ t += 5; if (!parse_out(s, &t, NULL, 1, "+CSNS:", "")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CSQ(at_state_t *s, const char *t) { /* 3GPP TS 27.007 8.5 - Signal quality */ /* TODO: */ t += 4; if (!parse_out(s, &t, NULL, 1, "+CSQ:", "")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CSS(at_state_t *s, const char *t) { /* IS-135 4.1.28 - Serving system identification */ /* TODO: */ t += 4; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CSSN(at_state_t *s, const char *t) { /* 3GPP TS 27.007 7.17 - Supplementary service notifications */ /* TODO: */ t += 5; if (!parse_out(s, &t, NULL, 1, "+CSSN:", "")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CSTA(at_state_t *s, const char *t) { /* 3GPP TS 27.007 6.1 - Select type of address */ /* TODO: */ t += 5; if (!parse_out(s, &t, NULL, 1, "+CSTA:", "")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CSTF(at_state_t *s, const char *t) { /* 3GPP TS 27.007 6.24 - Settings time format */ /* TODO: */ t += 5; if (!parse_out(s, &t, NULL, 1, "+CSTF:", "")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CSVM(at_state_t *s, const char *t) { /* 3GPP TS 27.007 8.33 - Set Voice Mail Number */ /* TODO: */ t += 5; if (!parse_out(s, &t, NULL, 1, "+CSVM:", "")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CTA(at_state_t *s, const char *t) { /* IS-135 4.1.29 - MT-Terminated async. Data calls */ /* TODO: */ t += 4; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CTF(at_state_t *s, const char *t) { /* IS-135 4.1.30 - MT-Terminated FAX calls */ /* TODO: */ t += 4; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CTFR(at_state_t *s, const char *t) { /* 3GPP TS 27.007 7.14 - Call deflection */ /* TODO: */ t += 5; if (!parse_out(s, &t, NULL, 1, "+CTFR:", "")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CTZR(at_state_t *s, const char *t) { /* 3GPP TS 27.007 8.41 - Time Zone Reporting */ /* TODO: */ t += 5; if (!parse_out(s, &t, NULL, 1, "+CTZR:", "")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CTZU(at_state_t *s, const char *t) { /* 3GPP TS 27.007 8.40 - Automatic Time Zone Update */ /* TODO: */ t += 5; if (!parse_out(s, &t, NULL, 1, "+CTZU:", "")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CUSD(at_state_t *s, const char *t) { /* 3GPP TS 27.007 7.15 - Unstructured supplementary service data */ /* TODO: */ t += 5; if (!parse_out(s, &t, NULL, 1, "+CUSD:", "")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CUUS1(at_state_t *s, const char *t) { /* 3GPP TS 27.007 7.26 - User to User Signalling Service 1 */ /* TODO: */ t += 6; if (!parse_out(s, &t, NULL, 1, "+CUUS1:", "")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CV120(at_state_t *s, const char *t) { /* 3GPP TS 27.007 6.21 - V.120 rate adaption protocol */ /* TODO: */ t += 6; if (!parse_out(s, &t, NULL, 1, "+CV120:", "")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CVHU(at_state_t *s, const char *t) { /* 3GPP TS 27.007 6.20 - Voice Hangup Control */ /* TODO: */ t += 5; if (!parse_out(s, &t, NULL, 1, "+CVHU:", "")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CVIB(at_state_t *s, const char *t) { /* 3GPP TS 27.007 8.22 - Vibrator mode */ /* TODO: */ t += 5; if (!parse_out(s, &t, NULL, 1, "+CVIB:", "")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_CXT(at_state_t *s, const char *t) { /* IS-99 5.6 - Cellular extension */ /* TODO: */ t += 4; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_DR(at_state_t *s, const char *t) { /* V.250 6.6.2 - Data compression reporting */ /* TODO: */ t += 3; if (!parse_out(s, &t, NULL, 1, "+DR:", "")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_DS(at_state_t *s, const char *t) { /* V.250 6.6.1 - Data compression */ /* TODO: */ t += 3; if (!parse_out(s, &t, NULL, 1, "+DS:", "")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_DS44(at_state_t *s, const char *t) { /* V.250 6.6.2 - V.44 data compression */ /* TODO: */ t += 5; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_EB(at_state_t *s, const char *t) { /* V.250 6.5.2 - Break handling in error control operation */ /* TODO: */ t += 3; if (!parse_out(s, &t, NULL, 1, "+EB:", "")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_EFCS(at_state_t *s, const char *t) { /* V.250 6.5.4 - 32-bit frame check sequence */ /* TODO: */ t += 5; if (!parse_out(s, &t, NULL, 2, "+EFCS:", "(0-2)")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_EFRAM(at_state_t *s, const char *t) { /* V.250 6.5.8 - Frame length */ /* TODO: */ t += 6; if (!parse_2_out(s, &t, NULL, 65535, NULL, 65535, "+EFRAM:", "(1-65535),(1-65535)")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_ER(at_state_t *s, const char *t) { /* V.250 6.5.5 - Error control reporting */ /* 0 Error control reporting disabled (no +ER intermediate result code transmitted) 1 Error control reporting enabled (+ER intermediate result code transmitted) */ /* TODO: */ t += 3; if (!parse_out(s, &t, NULL, 1, "+ER:", "(0,1)")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_ES(at_state_t *s, const char *t) { /* V.250 6.5.1 - Error control selection */ /* TODO: */ t += 3; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_ESR(at_state_t *s, const char *t) { /* V.250 6.5.3 - Selective repeat */ /* TODO: */ t += 4; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_ETBM(at_state_t *s, const char *t) { /* V.250 6.5.6 - Call termination buffer management */ /* TODO: */ t += 5; if (!parse_2_out(s, &t, NULL, 2, NULL, 2, "+ETBM:", "(0-2),(0-2),(0-30)")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_EWIND(at_state_t *s, const char *t) { /* V.250 6.5.7 - Window size */ /* TODO: */ t += 6; if (!parse_2_out(s, &t, &s->rx_window, 127, &s->tx_window, 127, "+EWIND:", "(1-127),(1-127)")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_FAA(at_state_t *s, const char *t) { /* T.32 8.5.2.5 - Adaptive Answer parameter */ /* TODO */ t += 4; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_FAP(at_state_t *s, const char *t) { /* T.32 8.5.1.12 - Addressing and polling capabilities parameter */ /* TODO */ t += 4; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_FAR(at_state_t *s, const char *t) { /* T.31 8.5.1 - Adaptive reception control */ t += 4; if (!parse_out(s, &t, &s->p.adaptive_receive, 1, NULL, "0,1")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_FBO(at_state_t *s, const char *t) { /* T.32 8.5.3.4 - Phase C data bit order */ /* TODO */ t += 4; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_FBS(at_state_t *s, const char *t) { /* T.32 8.5.3.2 - Buffer Size, read only parameter */ /* TODO */ t += 4; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_FBU(at_state_t *s, const char *t) { /* T.32 8.5.1.10 - HDLC Frame Reporting parameter */ /* TODO */ t += 4; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_FCC(at_state_t *s, const char *t) { /* T.32 8.5.1.1 - DCE capabilities parameters */ /* TODO */ t += 4; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_FCL(at_state_t *s, const char *t) { /* T.31 8.5.2 - Carrier loss timeout */ t += 4; if (!parse_out(s, &t, &s->carrier_loss_timeout, 255, NULL, "(0-255)")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_FCLASS(at_state_t *s, const char *t) { /* T.31 8.2 - Capabilities identification and control */ t += 7; /* T.31 says the reply string should be "0,1.0", however making it "0,1,1.0" makes things compatible with a lot more software that may be expecting a pre-T.31 modem. */ if (!parse_string_list_out(s, &t, &s->fclass_mode, 1, NULL, "0,1,1.0")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_FCQ(at_state_t *s, const char *t) { /* T.32 8.5.2.3 - Copy quality checking parameter */ /* TODO */ t += 4; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_FCR(at_state_t *s, const char *t) { /* T.32 8.5.1.9 - Capability to receive parameter */ /* TODO */ t += 4; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_FCS(at_state_t *s, const char *t) { /* T.32 8.5.1.3 - Current Session Results parameters */ /* TODO */ t += 4; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_FCT(at_state_t *s, const char *t) { /* T.32 8.5.2.6 - DTE phase C timeout parameter */ /* TODO */ t += 4; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_FDD(at_state_t *s, const char *t) { /* T.31 8.5.3 - Double escape character replacement */ t += 4; if (!parse_out(s, &t, &s->p.double_escape, 1, NULL, "(0,1)")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_FDR(at_state_t *s, const char *t) { /* T.32 8.3.4 - Data reception command */ /* TODO */ t += 4; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_FDT(at_state_t *s, const char *t) { /* T.32 8.3.3 - Data transmission command */ /* TODO */ t += 4; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_FEA(at_state_t *s, const char *t) { /* T.32 8.5.3.5 - Phase C received EOL alignment parameter */ /* TODO */ t += 4; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_FFC(at_state_t *s, const char *t) { /* T.32 8.5.3.6 - Format conversion parameter */ /* TODO */ t += 4; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_FFD(at_state_t *s, const char *t) { /* T.32 8.5.1.14 - File diagnostic message parameter */ /* TODO */ t += 4; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_FHS(at_state_t *s, const char *t) { /* T.32 8.5.2.7 - Call termination status parameter */ /* TODO */ t += 4; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_FIE(at_state_t *s, const char *t) { /* T.32 8.5.2.1 - Procedure interrupt enable parameter */ /* TODO */ t += 4; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_FIP(at_state_t *s, const char *t) { /* T.32 8.3.6 - Initialize Facsimile Parameters */ t += 4; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_FIS(at_state_t *s, const char *t) { /* T.32 8.5.1.2 - Current session parameters */ /* TODO */ t += 4; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_FIT(at_state_t *s, const char *t) { /* T.31 8.5.4 - DTE inactivity timeout */ t += 4; if (!parse_2_out(s, &t, &s->dte_inactivity_timeout, 255, &s->dte_inactivity_action, 1, "+FIT:", "(0-255),(0-1)")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_FKS(at_state_t *s, const char *t) { /* T.32 8.3.5 - Session termination command */ /* TODO: */ t += 4; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_FLI(at_state_t *s, const char *t) { /* T.32 8.5.1.5 - Local ID string parameter, TSI or CSI */ /* TODO: */ t += 4; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_FLO(at_state_t *s, const char *t) { /* T.31 Annex A */ /* Implement something similar to the V.250 +IFC command */ /* TODO: */ t += 4; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_FLP(at_state_t *s, const char *t) { /* T.32 8.5.1.7 - Indicate document to poll parameter */ /* TODO: */ t += 4; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_FMI(at_state_t *s, const char *t) { /* T.31 says to duplicate +GMI */ t += 4; if (t[0] == '?') { at_put_response(s, manufacturer); t += 1; } return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_FMM(at_state_t *s, const char *t) { /* T.31 says to duplicate +GMM */ t += 4; if (t[0] == '?') { at_put_response(s, model); t += 1; } return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_FMR(at_state_t *s, const char *t) { /* T.31 says to duplicate +GMR */ t += 4; if (t[0] == '?') { at_put_response(s, revision); t += 1; } return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_FMS(at_state_t *s, const char *t) { /* T.32 8.5.2.9 - Minimum phase C speed parameter */ t += 4; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_FND(at_state_t *s, const char *t) { /* T.32 8.5.2.10 - Non-Standard Message Data Indication parameter */ t += 4; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_FNR(at_state_t *s, const char *t) { /* T.32 8.5.1.11 - Negotiation message reporting control parameters */ t += 4; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_FNS(at_state_t *s, const char *t) { /* T.32 8.5.1.6 - Non-Standard Frame FIF parameter */ t += 4; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_FPA(at_state_t *s, const char *t) { /* T.32 8.5.1.13 - Selective polling address parameter */ t += 4; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_FPI(at_state_t *s, const char *t) { /* T.32 8.5.1.5 - Local Polling ID String parameter */ t += 4; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_FPP(at_state_t *s, const char *t) { /* T.32 8.5.3 - Facsimile packet protocol */ t += 4; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_FPR(at_state_t *s, const char *t) { /* T.31 Annex A */ /* Implement something similar to the V.250 +IPR command */ t += 4; if (!parse_out(s, &t, &s->dte_rate, 115200, NULL, "115200")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_FPS(at_state_t *s, const char *t) { /* T.32 8.5.2.2 - Page Status parameter */ t += 4; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_FPW(at_state_t *s, const char *t) { /* T.32 8.5.1.13 - PassWord parameter (Sending or Polling) */ t += 4; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_FRH(at_state_t *s, const char *t) { /* T.31 8.3.6 - HDLC receive */ if (!process_class1_cmd(s, &t)) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_FRM(at_state_t *s, const char *t) { /* T.31 8.3.4 - Facsimile receive */ if (!process_class1_cmd(s, &t)) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_FRQ(at_state_t *s, const char *t) { /* T.32 8.5.2.4 - Receive Quality Thresholds parameters */ /* TODO */ t += 4; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_FRS(at_state_t *s, const char *t) { /* T.31 8.3.2 - Receive silence */ if (!process_class1_cmd(s, &t)) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_FRY(at_state_t *s, const char *t) { /* T.32 8.5.2.8 - ECM Retry Value parameter */ /* TODO */ t += 4; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_FSA(at_state_t *s, const char *t) { /* T.32 8.5.1.13 - Subaddress parameter */ /* TODO */ t += 4; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_FSP(at_state_t *s, const char *t) { /* T.32 8.5.1.8 - Request to poll parameter */ /* TODO */ t += 4; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_FTH(at_state_t *s, const char *t) { /* T.31 8.3.5 - HDLC transmit */ if (!process_class1_cmd(s, &t)) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_FTM(at_state_t *s, const char *t) { /* T.31 8.3.3 - Facsimile transmit */ if (!process_class1_cmd(s, &t)) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_FTS(at_state_t *s, const char *t) { /* T.31 8.3.1 - Transmit silence */ if (!process_class1_cmd(s, &t)) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_GCAP(at_state_t *s, const char *t) { /* V.250 6.1.9 - Request complete capabilities list */ t += 5; /* Response elements +FCLASS +F (FAX) commands +MS +M (modulation control) commands +MS and +MR +MV18S +M (modulation control) commands +MV18S and +MV18R +ES +E (error control) commands +ES, +EB, +ER, +EFCS, and +ETBM +DS +D (data compression) commands +DS and +DR */ /* TODO: make this adapt to the configuration we really have. */ if (t[0] == '?') { at_put_response(s, "+GCAP:+FCLASS"); t += 1; } return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_GCI(at_state_t *s, const char *t) { /* V.250 6.1.10 - Country of installation, */ t += 4; if (!parse_hex_out(s, &t, &s->country_of_installation, 255, "+GCI:", "(00-FF)")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_GMI(at_state_t *s, const char *t) { /* V.250 6.1.4 - Request manufacturer identification */ t += 4; if (t[0] == '?') { at_put_response(s, manufacturer); t += 1; } return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_GMM(at_state_t *s, const char *t) { /* V.250 6.1.5 - Request model identification */ t += 4; if (t[0] == '?') { at_put_response(s, model); t += 1; } return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_GMR(at_state_t *s, const char *t) { /* V.250 6.1.6 - Request revision identification */ t += 4; if (t[0] == '?') { at_put_response(s, revision); t += 1; } return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_GOI(at_state_t *s, const char *t) { /* V.250 6.1.8 - Request global object identification */ /* TODO: */ t += 4; if (t[0] == '?') { at_put_response(s, GLOBAL_OBJECT_IDENTITY); t += 1; } return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_GSN(at_state_t *s, const char *t) { /* V.250 6.1.7 - Request product serial number identification */ /* TODO: */ t += 4; if (t[0] == '?') { at_put_response(s, SERIAL_NUMBER); t += 1; } return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_IBC(at_state_t *s, const char *t) { /* TIA-617 8.3 - Control of in-band control */ /* TODO: */ t += 4; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_IBM(at_state_t *s, const char *t) { /* TIA-617 8.4 - In-Band MARK idle reporting control */ /* TODO: */ t += 4; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_ICF(at_state_t *s, const char *t) { /* V.250 6.2.11 - DTE-DCE character framing */ t += 4; /* Character format 0 auto detect 1 8 data 2 stop 2 8 data 1 parity 1 stop 3 8 data 1 stop 4 7 data 2 stop 5 7 data 1 parity 1 stop 6 7 data 1 stop parity 0 Odd 1 Even 2 Mark 3 Space */ if (!parse_2_out(s, &t, &s->dte_char_format, 6, &s->dte_parity, 3, "+ICF:", "(0-6),(0-3)")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_ICLOK(at_state_t *s, const char *t) { /* V.250 6.2.14 - Select sync transmit clock source */ t += 6; if (!parse_out(s, &t, &s->sync_tx_clock_source, 2, "+ICLOK:", "(0-2)")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_IDSR(at_state_t *s, const char *t) { /* V.250 6.2.16 - Select data set ready option */ t += 5; if (!parse_out(s, &t, &s->dsr_option, 2, "+IDSR:", "(0-2)")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_IFC(at_state_t *s, const char *t) { /* V.250 6.2.12 - DTE-DCE local flow control */ /* TODO: */ t += 4; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_ILRR(at_state_t *s, const char *t) { /* V.250 6.2.13 - DTE-DCE local rate reporting */ /* TODO: */ t += 5; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_ILSD(at_state_t *s, const char *t) { /* V.250 6.2.15 - Select long space disconnect option */ t += 5; if (!parse_out(s, &t, &s->long_space_disconnect_option, 2, "+ILSD:", "(0,1)")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_IPR(at_state_t *s, const char *t) { /* V.250 6.2.10 - Fixed DTE rate */ /* TODO: */ t += 4; if (!parse_out(s, &t, &s->dte_rate, 115200, "+IPR:", "(115200),(115200)")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_IRTS(at_state_t *s, const char *t) { /* V.250 6.2.17 - Select synchronous mode RTS option */ t += 5; if (!parse_out(s, &t, NULL, 1, "+IRTS:", "(0,1)")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_MA(at_state_t *s, const char *t) { /* V.250 6.4.2 - Modulation automode control */ /* TODO: */ t += 3; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_MR(at_state_t *s, const char *t) { /* V.250 6.4.3 - Modulation reporting control */ /* 0 Disables reporting of modulation connection (+MCR: and +MRR: are not transmitted) 1 Enables reporting of modulation connection (+MCR: and +MRR: are transmitted) */ /* TODO: */ t += 3; if (!parse_out(s, &t, NULL, 1, "+MR:", "(0,1)")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_MS(at_state_t *s, const char *t) { /* V.250 6.4.1 - Modulation selection */ /* TODO: */ t += 3; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_MSC(at_state_t *s, const char *t) { /* V.250 6.4.8 - Seamless rate change enable */ /* 0 Disables V.34 seamless rate change 1 Enables V.34 seamless rate change */ /* TODO: */ t += 4; if (!parse_out(s, &t, NULL, 1, "+MSC:", "(0,1)")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_MV18AM(at_state_t *s, const char *t) { /* V.250 6.4.6 - V.18 answering message editing */ /* TODO: */ t += 7; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_MV18P(at_state_t *s, const char *t) { /* V.250 6.4.7 - Order of probes */ /* 2 Send probe message in 5-bit (Baudot) mode 3 Send probe message in DTMF mode 4 Send probe message in EDT mode 5 Send Rec. V.21 carrier as a probe 6 Send Rec. V.23 carrier as a probe 7 Send Bell 103 carrier as a probe */ /* TODO: */ t += 6; if (!parse_out(s, &t, NULL, 7, "+MV18P:", "(2-7)")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_MV18R(at_state_t *s, const char *t) { /* V.250 6.4.5 - V.18 reporting control */ /* TODO: */ t += 6; if (!parse_out(s, &t, NULL, 1, "+MV18R:", "(0,1)")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_MV18S(at_state_t *s, const char *t) { /* V.250 6.4.4 - V.18 selection */ /* mode: 0 Disables V.18 operation 1 V.18 operation, auto detect mode 2 V.18 operation, connect in 5-bit (Baudot) mode 3 V.18 operation, connect in DTMF mode 4 V.18 operation, connect in EDT mode 5 V.18 operation, connect in V.21 mode 6 V.18 operation, connect in V.23 mode 7 V.18 operation, connect in Bell 103-type mode dflt_ans_mode: 0 Disables V.18 answer operation 1 No default specified (auto detect) 2 V.18 operation connect in 5-bit (Baudot) mode 3 V.18 operation connect in DTMF mode 4 V.18 operation connect in EDT mode fbk_time_enable: 0 Disable 1 Enable ans_msg_enable 0 Disable 1 Enable probing_en 0 Disable probing 1 Enable probing 2 Initiate probing */ /* TODO: */ t += 6; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_PCW(at_state_t *s, const char *t) { /* V.250 6.8.1 - Call waiting enable (V.92 DCE) */ /* TODO: */ t += 4; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_PIG(at_state_t *s, const char *t) { /* V.250 6.8.5 - PCM upstream ignore */ /* TODO: */ t += 4; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_PMH(at_state_t *s, const char *t) { /* V.250 6.8.2 - Modem on hold enable */ /* TODO: */ t += 4; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_PMHF(at_state_t *s, const char *t) { /* V.250 6.8.6 - V.92 Modem on hold hook flash */ /* TODO: */ t += 5; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_PMHR(at_state_t *s, const char *t) { /* V.250 6.8.4 - Initiate modem on hold */ /* TODO: */ t += 5; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_PMHT(at_state_t *s, const char *t) { /* V.250 6.8.3 - Modem on hold timer */ /* TODO: */ t += 5; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_PQC(at_state_t *s, const char *t) { /* V.250 6.8.7 - V.92 Phase 1 and Phase 2 Control */ /* TODO: */ t += 4; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_PSS(at_state_t *s, const char *t) { /* V.250 6.8.8 - V.92 Use Short Sequence */ /* TODO: */ t += 4; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_SAC(at_state_t *s, const char *t) { /* V.252 3.4 - Audio transmit configuration */ /* TODO: */ t += 4; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_SAM(at_state_t *s, const char *t) { /* V.252 3.5 - Audio receive mode */ /* TODO: */ t += 4; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_SAR(at_state_t *s, const char *t) { /* V.252 5.3 - Audio receive channel indication */ /* TODO: */ t += 4; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_SARR(at_state_t *s, const char *t) { /* V.252 3.9 - Audio indication reporting */ /* TODO: */ t += 5; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_SAT(at_state_t *s, const char *t) { /* V.252 5.4 - Audio transmit channel indication */ /* TODO: */ t += 4; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_SCRR(at_state_t *s, const char *t) { /* V.252 3.11 - Capabilities indication reporting */ /* TODO: */ t += 5; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_SDC(at_state_t *s, const char *t) { /* V.252 3.3 - Data configuration */ /* TODO: */ t += 4; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_SDI(at_state_t *s, const char *t) { /* V.252 5.2 - Data channel identification */ /* TODO: */ t += 4; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_SDR(at_state_t *s, const char *t) { /* V.252 3.8 - Data indication reporting */ /* TODO: */ t += 4; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_SRSC(at_state_t *s, const char *t) { /* V.252 5.1.2 - Remote terminal simultaneous capability indication */ /* TODO: */ t += 5; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_STC(at_state_t *s, const char *t) { /* V.252 3.1 - Terminal configuration */ /* TODO: */ t += 4; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_STH(at_state_t *s, const char *t) { /* V.252 3.2 - Close logical channel */ /* TODO: */ t += 4; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_SVC(at_state_t *s, const char *t) { /* V.252 3.6 - Video transmit configuration */ /* TODO: */ t += 4; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_SVM(at_state_t *s, const char *t) { /* V.252 3.7 - Video receive mode */ /* TODO: */ t += 4; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_SVR(at_state_t *s, const char *t) { /* V.252 5.5 - Video receive channel indication */ /* TODO: */ t += 4; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_SVRR(at_state_t *s, const char *t) { /* V.252 3.10 - Video indication reporting */ /* TODO: */ t += 5; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_SVT(at_state_t *s, const char *t) { /* V.252 5.6 - Video transmit channel indication */ /* TODO: */ t += 4; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_TADR(at_state_t *s, const char *t) { /* V.250 6.7.2.9 - Local V.54 address */ /* TODO: */ t += 5; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_TAL(at_state_t *s, const char *t) { /* V.250 6.7.2.15 - Local analogue loop */ /* Action 0 Disable analogue loop 1 Enable analogue loop Band 0 Low frequency band 1 High frequency band */ /* TODO: */ t += 4; if (!parse_2_out(s, &t, NULL, 1, NULL, 1, "+TAL:", "(0,1),(0,1)")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_TALS(at_state_t *s, const char *t) { /* V.250 6.7.2.6 - Analogue loop status */ /* 0 Inactive 1 V.24 circuit 141 invoked 2 Front panel invoked 3 Network management system invoked */ /* TODO: */ t += 5; if (!parse_out(s, &t, NULL, 3, "+TALS:", "(0-3)")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_TDLS(at_state_t *s, const char *t) { /* V.250 6.7.2.7 - Local digital loop status */ /* 0 Disabled 1 Enabled, inactive 2 Front panel invoked 3 Network management system invoked 4 Remote invoked */ /* TODO: */ t += 5; if (!parse_out(s, &t, NULL, 3, "+TDLS:", "(0-4)")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_TE140(at_state_t *s, const char *t) { /* V.250 6.7.2.1 - Enable ckt 140 */ /* 0 Disabled 1 Enabled */ /* TODO: */ t += 6; if (!parse_out(s, &t, NULL, 1, "+TE140:", "(0,1)")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_TE141(at_state_t *s, const char *t) { /* V.250 6.7.2.2 - Enable ckt 141 */ /* 0 Response is disabled 1 Response is enabled */ /* TODO: */ t += 6; if (!parse_out(s, &t, NULL, 1, "+TE141:", "(0,1)")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_TEPAL(at_state_t *s, const char *t) { /* V.250 6.7.2.5 - Enable front panel analogue loop */ /* 0 Disabled 1 Enabled */ /* TODO: */ t += 6; if (!parse_out(s, &t, NULL, 1, "+TEPAL:", "(0,1)")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_TEPDL(at_state_t *s, const char *t) { /* V.250 6.7.2.4 - Enable front panel RDL */ /* 0 Disabled 1 Enabled */ /* TODO: */ t += 6; if (!parse_out(s, &t, NULL, 1, "+TEPDL:", "(0,1)")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_TERDL(at_state_t *s, const char *t) { /* V.250 6.7.2.3 - Enable RDL from remote */ /* 0 Local DCE will ignore command from remote 1 Local DCE will obey command from remote */ /* TODO: */ t += 6; if (!parse_out(s, &t, NULL, 1, "+TERDL:", "(0,1)")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_TLDL(at_state_t *s, const char *t) { /* V.250 6.7.2.13 - Local digital loop */ /* 0 Stop test 1 Start test */ /* TODO: */ t += 5; if (!parse_out(s, &t, NULL, 1, "+TLDL:", "(0,1)")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_TMO(at_state_t *s, const char *t) { /* V.250 6.9 - V.59 command */ /* TODO: */ t += 4; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_TMODE(at_state_t *s, const char *t) { /* V.250 6.7.2.10 - Set V.54 mode */ /* TODO: */ t += 6; if (!parse_out(s, &t, NULL, 1, "+TMODE:", "(0,1)")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_TNUM(at_state_t *s, const char *t) { /* V.250 6.7.2.12 - Errored bit and block counts */ /* TODO: */ t += 5; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_TRDL(at_state_t *s, const char *t) { /* V.250 6.7.2.14 - Request remote digital loop */ /* 0 Stop RDL 1 Start RDL */ /* TODO: */ t += 5; if (!parse_out(s, &t, NULL, 1, "+TRDL:", "(0,1)")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_TRDLS(at_state_t *s, const char *t) { /* V.250 6.7.2.8 - Remote digital loop status */ /* TODO: */ t += 6; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_TRES(at_state_t *s, const char *t) { /* V.250 6.7.2.17 - Self test result */ /* 0 No test 1 Pass 2 Fail */ /* TODO: */ t += 5; if (!parse_out(s, &t, NULL, 1, "+TRES:", "(0-2)")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_TSELF(at_state_t *s, const char *t) { /* V.250 6.7.2.16 - Self test */ /* 0 Intrusive full test 1 Safe partial test */ /* TODO: */ t += 6; if (!parse_out(s, &t, NULL, 1, "+TSELF:", "(0,1)")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_TTER(at_state_t *s, const char *t) { /* V.250 6.7.2.11 - Test error rate */ /* TODO: */ t += 5; if (!parse_2_out(s, &t, NULL, 65535, NULL, 65535, "+TTER:", "(0-65535),(0-65535)")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_VAC(at_state_t *s, const char *t) { /* V.252 4.1 - Set audio code */ return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_VACR(at_state_t *s, const char *t) { /* V.252 6.1 - Audio code report */ /* TODO: */ t += 5; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_VBT(at_state_t *s, const char *t) { /* 3GPP TS 27.007 C.2.2 - Buffer threshold setting */ /* TODO: */ t += 4; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_VCID(at_state_t *s, const char *t) { /* 3GPP TS 27.007 C.2.3 - Calling number ID presentation */ /* TODO: */ t += 5; if (!parse_out(s, &t, &s->display_call_info, 1, NULL, "0,1")) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_VCIDR(at_state_t *s, const char *t) { /* V.252 6.2 - Caller ID report */ /* TODO: */ t += 6; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_VDID(at_state_t *s, const char *t) { /* V.253 9.2.4 - DID service */ /* TODO: */ t += 5; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_VDIDR(at_state_t *s, const char *t) { /* V.252 6.2 - DID report */ /* TODO: */ t += 6; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_VDR(at_state_t *s, const char *t) { /* V.253 10.3.1 - Distinctive ring (ring cadence reporting) */ /* TODO: */ t += 4; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_VDT(at_state_t *s, const char *t) { /* V.253 10.3.2 - Control tone cadence reporting */ /* TODO: */ t += 4; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_VDX(at_state_t *s, const char *t) { /* V.253 10.5.6 - Speakerphone duplex mode */ /* TODO: */ t += 4; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_VEM(at_state_t *s, const char *t) { /* V.253 10.5.7 - Deliver event reports */ /* TODO: */ t += 4; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_VGM(at_state_t *s, const char *t) { /* V.253 10.5.2 - Microphone gain */ /* TODO: */ t += 4; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_VGR(at_state_t *s, const char *t) { /* V.253 10.2.1 - Receive gain selection */ /* TODO: */ t += 4; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_VGS(at_state_t *s, const char *t) { /* V.253 10.5.3 - Speaker gain */ /* TODO: */ t += 4; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_VGT(at_state_t *s, const char *t) { /* V.253 10.2.2 - Volume selection */ /* TODO: */ t += 4; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_VHC(at_state_t *s, const char *t) { /* V.252 4.12 - Telephony port hook control */ /* TODO: */ t += 4; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_VIP(at_state_t *s, const char *t) { /* V.253 10.1.1 - Initialize voice parameters */ /* TODO: */ t += 4; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_VIT(at_state_t *s, const char *t) { /* V.253 10.2.3 - DTE/DCE inactivity timer */ /* TODO: */ t += 4; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_VLS(at_state_t *s, const char *t) { /* V.253 10.2.4 - Analogue source/destination selection */ /* TODO: */ t += 4; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_VNH(at_state_t *s, const char *t) { /* V.253 9.2.5 - Automatic hangup control */ /* TODO: */ t += 4; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_VPH(at_state_t *s, const char *t) { /* V.252 4.11 - Phone hookswitch status */ /* TODO: */ t += 4; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_VPP(at_state_t *s, const char *t) { /* V.253 10.4.2 - Voice packet protocol */ /* TODO: */ t += 4; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_VPR(at_state_t *s, const char *t) { /* IS-101 10.4.3 - Select DTE/DCE interface rate */ /* TODO: */ t += 4; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_VRA(at_state_t *s, const char *t) { /* V.253 10.2.5 - Ringing tone goes away timer */ /* TODO: */ t += 4; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_VRID(at_state_t *s, const char *t) { int val; /* Extension of V.253 +VCID, Calling number ID report/repeat */ t += 5; val = 0; if (!parse_out(s, &t, &val, 1, NULL, "0,1")) return NULL; if (val == 1) at_display_call_info(s); return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_VRL(at_state_t *s, const char *t) { /* V.253 10.1.2 - Ring local phone */ /* TODO: */ t += 4; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_VRN(at_state_t *s, const char *t) { /* V.253 10.2.6 - Ringing tone never appeared timer */ /* TODO: */ t += 4; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_VRX(at_state_t *s, const char *t) { /* V.253 10.1.3 - Voice receive state */ /* TODO: */ t += 4; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_VSD(at_state_t *s, const char *t) { /* V.253 10.2.7 - Silence detection (QUIET and SILENCE) */ /* TODO: */ t += 4; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_VSID(at_state_t *s, const char *t) { /* Extension of V.253 +VCID, Set calling number ID */ t += 5; if (!parse_string_out(s, &t, &s->local_id, NULL)) return NULL; if (at_modem_control(s, AT_MODEM_CONTROL_SETID, s->local_id) < 0) return NULL; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_VSM(at_state_t *s, const char *t) { /* V.253 10.2.8 - Compression method selection */ /* TODO: */ t += 4; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_VSP(at_state_t *s, const char *t) { /* V.253 10.5.1 - Voice speakerphone state */ /* TODO: */ t += 4; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_VTA(at_state_t *s, const char *t) { /* V.253 10.5.4 - Train acoustic echo-canceller */ /* TODO: */ t += 4; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_VTD(at_state_t *s, const char *t) { /* V.253 10.2.9 - Beep tone duration timer */ /* TODO: */ t += 4; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_VTER(at_state_t *s, const char *t) { /* V.252 6.4 - Simple telephony event report */ /* TODO: */ t += 4; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_VTH(at_state_t *s, const char *t) { /* V.253 10.5.5 - Train line echo-canceller */ /* TODO: */ t += 4; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_VTR(at_state_t *s, const char *t) { /* V.253 10.1.4 - Voice duplex state */ /* TODO: */ t += 4; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_VTS(at_state_t *s, const char *t) { /* V.253 10.1.5 - DTMF and tone generation in voice */ /* TODO: */ t += 4; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_VTX(at_state_t *s, const char *t) { /* V.253 10.1.6 - Transmit data state */ /* TODO: */ t += 4; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_VXT(at_state_t *s, const char *t) { /* IS-101 10.1.5 - Translate voice data */ /* TODO: */ t += 4; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_W(at_state_t *s, const char *t) { /* TIA-678 5.2.4.1 - Compliance indication */ /* TODO: */ t += 2; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_WBAG(at_state_t *s, const char *t) { /* TIA-678 C.5.6 Bias Modem Audio Gain */ /* TODO: */ t += 5; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_WCDA(at_state_t *s, const char *t) { /* TIA-678 B.3.2.5 Display Data Link Address */ /* TODO: */ t += 5; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_WCHG(at_state_t *s, const char *t) { /* TIA-678 B.3.2.4 Display Battery Charging Status */ /* TODO: */ t += 5; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_WCID(at_state_t *s, const char *t) { /* TIA-678 B.3.2.1 Display System ID (operator) */ /* TODO: */ t += 5; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_WCLK(at_state_t *s, const char *t) { /* TIA-678 B.3.2.3 Lock/Unlock DCE */ /* TODO: */ t += 5; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_WCPN(at_state_t *s, const char *t) { /* TIA-678 B.3.2.2 Set Personal Identification Number */ /* TODO: */ t += 5; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_WCXF(at_state_t *s, const char *t) { /* TIA-678 B.3.2.6 Display Supported Annex B commands */ /* TODO: */ t += 5; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_WDAC(at_state_t *s, const char *t) { /* TIA-678 C.5.1 Data over Analogue Cellular Command Query */ /* TODO: */ t += 5; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_WDIR(at_state_t *s, const char *t) { /* TIA-678 C.5.8 Phone Number Directory Selection */ /* TODO: */ t += 5; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_WECR(at_state_t *s, const char *t) { /* TIA-678 C.5.3 Enable Cellular Result Codes */ /* TODO: */ t += 5; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_WFON(at_state_t *s, const char *t) { /* TIA-678 C.5.5 Phone Specification */ /* TODO: */ t += 5; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_WKPD(at_state_t *s, const char *t) { /* TIA-678 C.5.7 Keypad Emulation */ /* TODO: */ t += 5; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_WPBA(at_state_t *s, const char *t) { /* TIA-678 C.5.9 Phone Battery Query */ /* TODO: */ t += 5; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_WPTH(at_state_t *s, const char *t) { /* TIA-678 C.5.10 Call Path */ /* TODO: */ t += 5; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_WRLK(at_state_t *s, const char *t) { /* TIA-678 C.5.4 Roam Lockout */ /* TODO: */ t += 5; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_WS45(at_state_t *s, const char *t) { /* TIA-678 5.2.4.2 DTE-side stack selection */ /* TODO: */ t += 5; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_WS46(at_state_t *s, const char *t) { /* 3GPP TS 27.007 5.9 - PCCA STD-101 [17] select wireless network */ /* TODO: */ t += 5; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_WS50(at_state_t *s, const char *t) { /* TIA-678 B.3.1.1 Normalized Signal Strength */ /* TODO: */ t += 5; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_WS51(at_state_t *s, const char *t) { /* TIA-678 B.3.1.2 Carrier Detect Signal Threshold */ /* TODO: */ t += 5; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_WS52(at_state_t *s, const char *t) { /* TIA-678 B.3.1.3 Normalized Battery Level */ /* TODO: */ t += 5; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_WS53(at_state_t *s, const char *t) { /* TIA-678 B.3.1.4 Normalized Channel Quality */ /* TODO: */ t += 5; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_WS54(at_state_t *s, const char *t) { /* TIA-678 B.3.1.5 Carrier Detect Channel Quality Threshold */ /* TODO: */ t += 5; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_WS57(at_state_t *s, const char *t) { /* TIA-678 B.3.1.7 Antenna Preference */ /* TODO: */ t += 5; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_WS58(at_state_t *s, const char *t) { /* TIA-678 B.3.1.8 Idle Time-out Value */ /* TODO: */ t += 5; return t; } /*- End of function --------------------------------------------------------*/ static const char *at_cmd_plus_WSTL(at_state_t *s, const char *t) { /* TIA-678 C.5.2 Call Session Time Limit */ /* TODO: */ t += 5; return t; } /*- End of function --------------------------------------------------------*/ /* AT command group prefixes: +A Call control (network addressing) issues, common, PSTN, ISDN, Rec. X.25, switched digital +C Digital cellular extensions +D Data compression, Rec. V.42bis +E Error control, Rec. V.42 +F Facsimile, Rec. T.30, etc. +G Generic issues such as identity and capabilities +I DTE-DCE interface issues, Rec. V.24, etc. +M Modulation, Rec. V.32bis, etc. +S Switched or simultaneous data types +T Test issues +V Voice extensions +W Wireless extensions */ #include "at_interpreter_dictionary.h" static int command_search(const char *u, int len, int *matched) { int i; int index; int first; int last; int entry; int ptr; entry = 0; /* Loop over the length of the string to search the trie... */ for (i = 0, ptr = 0; ptr < COMMAND_TRIE_LEN; i++) { /* The character in u we are processing... */ /* V.250 5.4.1 says upper and lower case are equivalent in commands */ index = (unsigned char) toupper(u[i]); /* Is there a child node for this character? */ /* Note: First and last could have been packed into one uint16_t, but space is not that critical, so the other packing is good enough to make the table reasonable. */ first = command_trie[ptr++]; last = command_trie[ptr++]; entry = command_trie[ptr++]; if (index < first || index > last) break; if ((ptr = command_trie[ptr + index - first]) == 0) break; ptr--; } *matched = i; return entry; } /*- End of function --------------------------------------------------------*/ int at_modem_control(at_state_t *s, int op, const char *num) { switch (op) { case AT_MODEM_CONTROL_ANSWER: break; case AT_MODEM_CONTROL_CALL: break; case AT_MODEM_CONTROL_HANGUP: break; case AT_MODEM_CONTROL_OFFHOOK: break; case AT_MODEM_CONTROL_DTR: break; case AT_MODEM_CONTROL_RTS: break; case AT_MODEM_CONTROL_CTS: break; case AT_MODEM_CONTROL_CAR: break; case AT_MODEM_CONTROL_RNG: break; case AT_MODEM_CONTROL_DSR: break; case AT_MODEM_CONTROL_RESTART: break; default: break; } /*endswitch*/ return s->modem_control_handler(s, s->modem_control_user_data, op, num); } /*- End of function --------------------------------------------------------*/ void at_interpreter(at_state_t *s, const char *cmd, int len) { int i; int c; int entry; int matched; const char *t; if (s->p.echo) s->at_tx_handler(s, s->at_tx_user_data, (uint8_t *) cmd, len); for (i = 0; i < len; i++) { /* The spec says the top bit should be ignored */ c = *cmd++ & 0x7F; /* Handle incoming character */ if (s->line_ptr < 2) { /* Look for the initial "at", "AT", "a/" or "A/", and ignore anything before it */ /* V.250 5.2.1 only shows "at" and "AT" as command prefixes. "At" and "aT" are not specified, despite 5.4.1 saying upper and lower case are equivalent in commands. Let's be tolerant and accept them. */ if (tolower(c) == 'a') { s->line_ptr = 0; s->line[s->line_ptr++] = (char) toupper(c); } else if (s->line_ptr == 1) { if (tolower(c) == 't') { /* We have an "AT" command */ s->line[s->line_ptr++] = (char) toupper(c); } else if (c == '/') { /* We have an "A/" command */ /* TODO: implement "A/" command repeat */ s->line[s->line_ptr++] = (char) c; } else { s->line_ptr = 0; } } } else { /* We are beyond the initial AT */ if (c >= 0x20 && c <= 0x7E) { /* Add a new char */ if (s->line_ptr < (int) (sizeof(s->line) - 1)) s->line[s->line_ptr++] = (char) toupper(c); } else if (c == s->p.s_regs[3]) { /* End of command line. Do line validation */ s->line[s->line_ptr] = '\0'; if (s->line_ptr > 2) { /* The spec says the commands within a command line are executed in order, until an error is found, or the end of the command line is reached. */ t = s->line + 2; while (t && *t) { if ((entry = command_search(t, 15, &matched)) <= 0) break; if ((t = at_commands[entry - 1](s, t)) == NULL) break; if (t == (const char *) -1) break; } if (t != (const char *) -1) { if (t == NULL) at_put_response_code(s, AT_RESPONSE_CODE_ERROR); else at_put_response_code(s, AT_RESPONSE_CODE_OK); } } else if (s->line_ptr == 2) { /* It's just an empty "AT" command, return OK. */ at_put_response_code(s, AT_RESPONSE_CODE_OK); } s->line_ptr = 0; } else if (c == s->p.s_regs[5]) { /* Command line editing character (backspace) */ if (s->line_ptr > 0) s->line_ptr--; } else { /* The spec says control characters, other than those explicitly handled, should be ignored, and so this invalid character causes everything buffered before it to also be ignored. */ s->line_ptr = 0; } } } } /*- End of function --------------------------------------------------------*/ void at_set_class1_handler(at_state_t *s, at_class1_handler_t handler, void *user_data) { s->class1_handler = handler; s->class1_user_data = user_data; } /*- End of function --------------------------------------------------------*/ at_state_t *at_init(at_state_t *s, at_tx_handler_t *at_tx_handler, void *at_tx_user_data, at_modem_control_handler_t *modem_control_handler, void *modem_control_user_data) { if (s == NULL) { if ((s = (at_state_t *) malloc(sizeof(*s))) == NULL) return NULL; } memset(s, '\0', sizeof(*s)); s->modem_control_handler = modem_control_handler; s->modem_control_user_data = modem_control_user_data; s->at_tx_handler = at_tx_handler; s->at_tx_user_data = at_tx_user_data; s->call_id = NULL; s->local_id = NULL; s->display_call_info = 0; at_set_at_rx_mode(s, AT_MODE_ONHOOK_COMMAND); s->p = profiles[0]; return s; } /*- End of function --------------------------------------------------------*/ int at_free(at_state_t *s) { at_reset_call_info(s); if (s->local_id) free(s->local_id); free(s); return 0; } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/Makefile.in0000644000175000017500000011555711150047457017747 0ustar julienjulien# Makefile.in generated by automake 1.9.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = .. am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd INSTALL = @INSTALL@ install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ noinst_PROGRAMS = make_at_dictionary$(EXEEXT) \ make_modem_filter$(EXEEXT) subdir = src DIST_COMMON = $(nobase_include_HEADERS) $(noinst_HEADERS) \ $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(srcdir)/spandsp.h.in $(top_srcdir)/config-h.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/config/ax_compiler_vendor.m4 \ $(top_srcdir)/config/ax_check_real_file.m4 \ $(top_srcdir)/config/ax_fixed_point_machine.m4 \ $(top_srcdir)/config/ax_misaligned_access_fails.m4 \ $(top_srcdir)/config/ax_c99_features.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = config.h CONFIG_CLEAN_FILES = spandsp.h am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = `echo $$p | sed -e 's|^.*/||'`; am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(includedir)" \ "$(DESTDIR)$(includedir)" libLTLIBRARIES_INSTALL = $(INSTALL) LTLIBRARIES = $(lib_LTLIBRARIES) libspandsp_la_LIBADD = am_libspandsp_la_OBJECTS = adsi.lo async.lo at_interpreter.lo awgn.lo \ bell_r2_mf.lo bert.lo bit_operations.lo bitstream.lo \ complex_filters.lo complex_vector_float.lo crc.lo dds_float.lo \ dds_int.lo dtmf.lo echo.lo fax.lo fsk.lo g711.lo \ g722_encode.lo g722_decode.lo g726.lo gsm0610_decode.lo \ gsm0610_encode.lo gsm0610_long_term.lo gsm0610_lpc.lo \ gsm0610_preprocess.lo gsm0610_rpe.lo gsm0610_short_term.lo \ hdlc.lo ima_adpcm.lo logging.lo lpc10_analyse.lo \ lpc10_decode.lo lpc10_encode.lo lpc10_placev.lo \ lpc10_voicing.lo modem_echo.lo modem_connect_tones.lo noise.lo \ oki_adpcm.lo playout.lo plc.lo power_meter.lo queue.lo \ schedule.lo sig_tone.lo silence_gen.lo super_tone_rx.lo \ super_tone_tx.lo t4.lo t30.lo t30_api.lo t30_logging.lo t31.lo \ t35.lo t38_core.lo t38_gateway.lo t38_terminal.lo testcpuid.lo \ time_scale.lo tone_detect.lo tone_generate.lo v17rx.lo \ v17tx.lo v22bis_rx.lo v22bis_tx.lo v27ter_rx.lo v27ter_tx.lo \ v29rx.lo v29tx.lo v42.lo v42bis.lo v8.lo vector_float.lo \ vector_int.lo libspandsp_la_OBJECTS = $(am_libspandsp_la_OBJECTS) PROGRAMS = $(noinst_PROGRAMS) make_at_dictionary_SOURCES = make_at_dictionary.c make_at_dictionary_OBJECTS = make_at_dictionary.$(OBJEXT) make_at_dictionary_LDADD = $(LDADD) am_make_modem_filter_OBJECTS = make_modem_filter.$(OBJEXT) \ filter_tools.$(OBJEXT) make_modem_filter_OBJECTS = $(am_make_modem_filter_OBJECTS) make_modem_filter_LDADD = $(LDADD) DEFAULT_INCLUDES = -I. -I$(srcdir) -I. depcomp = $(SHELL) $(top_srcdir)/config/depcomp am__depfiles_maybe = depfiles COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ SOURCES = $(libspandsp_la_SOURCES) make_at_dictionary.c \ $(make_modem_filter_SOURCES) DIST_SOURCES = $(libspandsp_la_SOURCES) make_at_dictionary.c \ $(make_modem_filter_SOURCES) nobase_includeHEADERS_INSTALL = $(install_sh_DATA) nodist_includeHEADERS_INSTALL = $(INSTALL_HEADER) HEADERS = $(nobase_include_HEADERS) $(nodist_include_HEADERS) \ $(noinst_HEADERS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMDEP_FALSE = @AMDEP_FALSE@ AMDEP_TRUE = @AMDEP_TRUE@ AMTAR = @AMTAR@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CC_FOR_BUILD = @CC_FOR_BUILD@ CFLAGS = @CFLAGS@ COMP_VENDOR_CFLAGS = @COMP_VENDOR_CFLAGS@ COMP_VENDOR_LDFLAGS = @COMP_VENDOR_LDFLAGS@ COND_DOC_FALSE = @COND_DOC_FALSE@ COND_DOC_TRUE = @COND_DOC_TRUE@ COND_MMX_FALSE = @COND_MMX_FALSE@ COND_MMX_TRUE = @COND_MMX_TRUE@ COND_SSE_FALSE = @COND_SSE_FALSE@ COND_SSE_TRUE = @COND_SSE_TRUE@ COND_TESTDATA_FALSE = @COND_TESTDATA_FALSE@ COND_TESTDATA_TRUE = @COND_TESTDATA_TRUE@ COND_TESTS_FALSE = @COND_TESTS_FALSE@ COND_TESTS_TRUE = @COND_TESTS_TRUE@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CPPFLAGS_FOR_BUILD = @CPPFLAGS_FOR_BUILD@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DSYMUTIL = @DSYMUTIL@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ GREP = @GREP@ INSERT_INTTYPES_HEADER = @INSERT_INTTYPES_HEADER@ INSERT_MATH_HEADER = @INSERT_MATH_HEADER@ INSERT_STDINT_HEADER = @INSERT_STDINT_HEADER@ INSERT_TGMATH_HEADER = @INSERT_TGMATH_HEADER@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ NMEDIT = @NMEDIT@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SPANDSP_LT_AGE = @SPANDSP_LT_AGE@ SPANDSP_LT_CURRENT = @SPANDSP_LT_CURRENT@ SPANDSP_LT_REVISION = @SPANDSP_LT_REVISION@ SPANDSP_MISALIGNED_ACCESS_FAILS = @SPANDSP_MISALIGNED_ACCESS_FAILS@ SPANDSP_USE_FIXED_POINT = @SPANDSP_USE_FIXED_POINT@ STRIP = @STRIP@ TESTLIBS = @TESTLIBS@ VERSION = @VERSION@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ AM_CFLAGS = $(COMP_VENDOR_CFLAGS) AM_LDFLAGS = $(COMP_VENDOR_LDFLAGS) MAINTAINERCLEANFILES = Makefile.in INCLUDES = -I$(top_builddir) lib_LTLIBRARIES = libspandsp.la libspandsp_la_SOURCES = adsi.c \ async.c \ at_interpreter.c \ awgn.c \ bell_r2_mf.c \ bert.c \ bit_operations.c \ bitstream.c \ complex_filters.c \ complex_vector_float.c \ crc.c \ dds_float.c \ dds_int.c \ dtmf.c \ echo.c \ fax.c \ fsk.c \ g711.c \ g722_encode.c \ g722_decode.c \ g726.c \ gsm0610_decode.c \ gsm0610_encode.c \ gsm0610_long_term.c \ gsm0610_lpc.c \ gsm0610_preprocess.c \ gsm0610_rpe.c \ gsm0610_short_term.c \ hdlc.c \ ima_adpcm.c \ logging.c \ lpc10_analyse.c \ lpc10_decode.c \ lpc10_encode.c \ lpc10_placev.c \ lpc10_voicing.c \ modem_echo.c \ modem_connect_tones.c \ noise.c \ oki_adpcm.c \ playout.c \ plc.c \ power_meter.c \ queue.c \ schedule.c \ sig_tone.c \ silence_gen.c \ super_tone_rx.c \ super_tone_tx.c \ t4.c \ t30.c \ t30_api.c \ t30_logging.c \ t31.c \ t35.c \ t38_core.c \ t38_gateway.c \ t38_terminal.c \ testcpuid.c \ time_scale.c \ tone_detect.c \ tone_generate.c \ v17rx.c \ v17tx.c \ v22bis_rx.c \ v22bis_tx.c \ v27ter_rx.c \ v27ter_tx.c \ v29rx.c \ v29tx.c \ v42.c \ v42bis.c \ v8.c \ vector_float.c \ vector_int.c libspandsp_la_LDFLAGS = -version-info @SPANDSP_LT_CURRENT@:@SPANDSP_LT_REVISION@:@SPANDSP_LT_AGE@ nobase_include_HEADERS = spandsp/adsi.h \ spandsp/async.h \ spandsp/arctan2.h \ spandsp/at_interpreter.h \ spandsp/awgn.h \ spandsp/bell_r2_mf.h \ spandsp/bert.h \ spandsp/biquad.h \ spandsp/bit_operations.h \ spandsp/bitstream.h \ spandsp/crc.h \ spandsp/complex.h \ spandsp/complex_filters.h \ spandsp/complex_vector_float.h \ spandsp/dc_restore.h \ spandsp/dds.h \ spandsp/dtmf.h \ spandsp/echo.h \ spandsp/fax.h \ spandsp/fax_modems.h \ spandsp/fir.h \ spandsp/fsk.h \ spandsp/g168models.h \ spandsp/g711.h \ spandsp/g722.h \ spandsp/g726.h \ spandsp/gsm0610.h \ spandsp/hdlc.h \ spandsp/ima_adpcm.h \ spandsp/logging.h \ spandsp/lpc10.h \ spandsp/modem_echo.h \ spandsp/modem_connect_tones.h \ spandsp/noise.h \ spandsp/oki_adpcm.h \ spandsp/playout.h \ spandsp/plc.h \ spandsp/power_meter.h \ spandsp/queue.h \ spandsp/schedule.h \ spandsp/sig_tone.h \ spandsp/silence_gen.h \ spandsp/super_tone_rx.h \ spandsp/super_tone_tx.h \ spandsp/t4.h \ spandsp/t30.h \ spandsp/t30_api.h \ spandsp/t30_fcf.h \ spandsp/t30_logging.h \ spandsp/t31.h \ spandsp/t35.h \ spandsp/t38_core.h \ spandsp/t38_gateway.h \ spandsp/t38_terminal.h \ spandsp/telephony.h \ spandsp/time_scale.h \ spandsp/timing.h \ spandsp/tone_detect.h \ spandsp/tone_generate.h \ spandsp/v17rx.h \ spandsp/v17tx.h \ spandsp/v22bis.h \ spandsp/v27ter_rx.h \ spandsp/v27ter_tx.h \ spandsp/v29rx.h \ spandsp/v29tx.h \ spandsp/v42.h \ spandsp/v42bis.h \ spandsp/v8.h \ spandsp/vector_float.h \ spandsp/vector_int.h \ spandsp/version.h nodist_include_HEADERS = spandsp.h noinst_HEADERS = faxfont.h \ filter_tools.h \ gsm0610_local.h \ lpc10_encdecs.h \ t30_local.h \ t4_states.h \ v17rx_constellation_maps.h \ v17tx_constellation_maps.h \ v29tx_constellation_maps.h make_modem_filter_SOURCES = make_modem_filter.c \ filter_tools.c DSP = libspandsp.dsp VCPROJ = libspandsp.vcproj WIN32SOURCES = $(libspandsp_la_SOURCES) msvc/gettimeofday.c WIN32HEADERS = $(nobase_include_HEADERS) spandsp.h DSPOUT = | awk '{printf("%s\r\n", $$0)}' >> $(DSP) VCPROJOUT = | awk '{printf("%s\r\n", $$0)}' >> $(VCPROJ) all: config.h $(MAKE) $(AM_MAKEFLAGS) all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu src/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh config.h: stamp-h1 @if test ! -f $@; then \ rm -f stamp-h1; \ $(MAKE) stamp-h1; \ else :; fi stamp-h1: $(top_srcdir)/config-h.in $(top_builddir)/config.status @rm -f stamp-h1 cd $(top_builddir) && $(SHELL) ./config.status src/config.h $(top_srcdir)/config-h.in: $(am__configure_deps) cd $(top_srcdir) && $(AUTOHEADER) rm -f stamp-h1 touch $@ distclean-hdr: -rm -f config.h stamp-h1 spandsp.h: $(top_builddir)/config.status $(srcdir)/spandsp.h.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ install-libLTLIBRARIES: $(lib_LTLIBRARIES) @$(NORMAL_INSTALL) test -z "$(libdir)" || $(mkdir_p) "$(DESTDIR)$(libdir)" @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ if test -f $$p; then \ f=$(am__strip_dir) \ echo " $(LIBTOOL) --mode=install $(libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) '$$p' '$(DESTDIR)$(libdir)/$$f'"; \ $(LIBTOOL) --mode=install $(libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) "$$p" "$(DESTDIR)$(libdir)/$$f"; \ else :; fi; \ done uninstall-libLTLIBRARIES: @$(NORMAL_UNINSTALL) @set -x; list='$(lib_LTLIBRARIES)'; for p in $$list; do \ p=$(am__strip_dir) \ echo " $(LIBTOOL) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$p'"; \ $(LIBTOOL) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$p"; \ done clean-libLTLIBRARIES: -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libspandsp.la: $(libspandsp_la_OBJECTS) $(libspandsp_la_DEPENDENCIES) $(LINK) -rpath $(libdir) $(libspandsp_la_LDFLAGS) $(libspandsp_la_OBJECTS) $(libspandsp_la_LIBADD) $(LIBS) clean-noinstPROGRAMS: @list='$(noinst_PROGRAMS)'; for p in $$list; do \ f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ echo " rm -f $$p $$f"; \ rm -f $$p $$f ; \ done make_at_dictionary$(EXEEXT): $(make_at_dictionary_OBJECTS) $(make_at_dictionary_DEPENDENCIES) @rm -f make_at_dictionary$(EXEEXT) $(LINK) $(make_at_dictionary_LDFLAGS) $(make_at_dictionary_OBJECTS) $(make_at_dictionary_LDADD) $(LIBS) make_modem_filter$(EXEEXT): $(make_modem_filter_OBJECTS) $(make_modem_filter_DEPENDENCIES) @rm -f make_modem_filter$(EXEEXT) $(LINK) $(make_modem_filter_LDFLAGS) $(make_modem_filter_OBJECTS) $(make_modem_filter_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/adsi.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/async.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/at_interpreter.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/awgn.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bell_r2_mf.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bert.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bit_operations.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bitstream.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/complex_filters.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/complex_vector_float.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/crc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dds_float.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dds_int.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dtmf.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/echo.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fax.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/filter_tools.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fsk.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/g711.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/g722_decode.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/g722_encode.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/g726.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gsm0610_decode.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gsm0610_encode.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gsm0610_long_term.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gsm0610_lpc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gsm0610_preprocess.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gsm0610_rpe.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gsm0610_short_term.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hdlc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ima_adpcm.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/logging.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lpc10_analyse.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lpc10_decode.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lpc10_encode.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lpc10_placev.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lpc10_voicing.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/make_at_dictionary.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/make_modem_filter.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/modem_connect_tones.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/modem_echo.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/noise.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/oki_adpcm.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/playout.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/power_meter.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/queue.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/schedule.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sig_tone.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/silence_gen.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/super_tone_rx.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/super_tone_tx.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t30.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t30_api.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t30_logging.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t31.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t35.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t38_core.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t38_gateway.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t38_terminal.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t4.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/testcpuid.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/time_scale.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tone_detect.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tone_generate.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/v17rx.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/v17tx.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/v22bis_rx.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/v22bis_tx.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/v27ter_rx.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/v27ter_tx.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/v29rx.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/v29tx.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/v42.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/v42bis.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/v8.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vector_float.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vector_int.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ if $(LTCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs distclean-libtool: -rm -f libtool uninstall-info-am: install-nobase_includeHEADERS: $(nobase_include_HEADERS) @$(NORMAL_INSTALL) test -z "$(includedir)" || $(mkdir_p) "$(DESTDIR)$(includedir)" @$(am__vpath_adj_setup) \ list='$(nobase_include_HEADERS)'; for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ $(am__vpath_adj) \ echo " $(nobase_includeHEADERS_INSTALL) '$$d$$p' '$(DESTDIR)$(includedir)/$$f'"; \ $(nobase_includeHEADERS_INSTALL) "$$d$$p" "$(DESTDIR)$(includedir)/$$f"; \ done uninstall-nobase_includeHEADERS: @$(NORMAL_UNINSTALL) @$(am__vpath_adj_setup) \ list='$(nobase_include_HEADERS)'; for p in $$list; do \ $(am__vpath_adj) \ echo " rm -f '$(DESTDIR)$(includedir)/$$f'"; \ rm -f "$(DESTDIR)$(includedir)/$$f"; \ done install-nodist_includeHEADERS: $(nodist_include_HEADERS) @$(NORMAL_INSTALL) test -z "$(includedir)" || $(mkdir_p) "$(DESTDIR)$(includedir)" @list='$(nodist_include_HEADERS)'; for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ f=$(am__strip_dir) \ echo " $(nodist_includeHEADERS_INSTALL) '$$d$$p' '$(DESTDIR)$(includedir)/$$f'"; \ $(nodist_includeHEADERS_INSTALL) "$$d$$p" "$(DESTDIR)$(includedir)/$$f"; \ done uninstall-nodist_includeHEADERS: @$(NORMAL_UNINSTALL) @list='$(nodist_include_HEADERS)'; for p in $$list; do \ f=$(am__strip_dir) \ echo " rm -f '$(DESTDIR)$(includedir)/$$f'"; \ rm -f "$(DESTDIR)$(includedir)/$$f"; \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) $(mkdir_p) $(distdir)/.. $(distdir)/spandsp @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ list='$(DISTFILES)'; for file in $$list; do \ case $$file in \ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ esac; \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ dir="/$$dir"; \ $(mkdir_p) "$(distdir)$$dir"; \ else \ dir=''; \ fi; \ if test -d $$d/$$file; then \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$(top_distdir)" distdir="$(distdir)" \ dist-hook check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) $(HEADERS) config.h installdirs: for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(includedir)" "$(DESTDIR)$(includedir)"; do \ test -z "$$dir" || $(mkdir_p) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-am clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \ clean-noinstPROGRAMS mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-hdr distclean-libtool distclean-tags dvi: dvi-am dvi-am: html: html-am info: info-am info-am: install-data-am: install-nobase_includeHEADERS \ install-nodist_includeHEADERS install-exec-am: install-libLTLIBRARIES install-info: install-info-am install-man: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-info-am uninstall-libLTLIBRARIES \ uninstall-nobase_includeHEADERS \ uninstall-nodist_includeHEADERS .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libLTLIBRARIES clean-libtool clean-noinstPROGRAMS ctags \ dist-hook distclean distclean-compile distclean-generic \ distclean-hdr distclean-libtool distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-exec install-exec-am \ install-info install-info-am install-libLTLIBRARIES \ install-man install-nobase_includeHEADERS \ install-nodist_includeHEADERS install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-info-am \ uninstall-libLTLIBRARIES uninstall-nobase_includeHEADERS \ uninstall-nodist_includeHEADERS # We need to run make_at_dictionary, so it generates the # at_interpreter_dictionary.h file at_interpreter.$(OBJEXT): at_interpreter_dictionary.h at_interpreter.lo: at_interpreter_dictionary.h at_interpreter_dictionary.h: make_at_dictionary$(EXEEXT) ./make_at_dictionary$(EXEEXT) >at_interpreter_dictionary.h v17rx.$(OBJEXT): v17rx_fixed_rrc.h v17rx_floating_rrc.h v17rx.lo: v17rx_fixed_rrc.h v17rx_floating_rrc.h v17rx_fixed_rrc.h: make_modem_filter$(EXEEXT) ./make_modem_filter$(EXEEXT) -m V.17 -i -r >v17rx_fixed_rrc.h v17rx_floating_rrc.h: make_modem_filter$(EXEEXT) ./make_modem_filter$(EXEEXT) -m V.17 -r >v17rx_floating_rrc.h v17tx.$(OBJEXT): v17tx_fixed_rrc.h v17tx_floating_rrc.h v17tx.lo: v17tx_fixed_rrc.h v17tx_floating_rrc.h v17tx_fixed_rrc.h: make_modem_filter$(EXEEXT) ./make_modem_filter$(EXEEXT) -m V.17 -i -t >v17tx_fixed_rrc.h v17tx_floating_rrc.h: make_modem_filter$(EXEEXT) ./make_modem_filter$(EXEEXT) -m V.17 -t >v17tx_floating_rrc.h v22bis_rx.$(OBJEXT): v22bis_rx_1200_fixed_rrc.h \ v22bis_rx_2400_fixed_rrc.h \ v22bis_rx_1200_floating_rrc.h \ v22bis_rx_2400_floating_rrc.h v22bis_rx.lo: v22bis_rx_1200_fixed_rrc.h \ v22bis_rx_2400_fixed_rrc.h \ v22bis_rx_1200_floating_rrc.h \ v22bis_rx_2400_floating_rrc.h v22bis_rx_1200_fixed_rrc.h: make_modem_filter$(EXEEXT) ./make_modem_filter$(EXEEXT) -m V.22bis1200 -i -r >v22bis_rx_1200_fixed_rrc.h v22bis_rx_2400_fixed_rrc.h: make_modem_filter$(EXEEXT) ./make_modem_filter$(EXEEXT) -m V.22bis2400 -i -r >v22bis_rx_2400_fixed_rrc.h v22bis_rx_1200_floating_rrc.h: make_modem_filter$(EXEEXT) ./make_modem_filter$(EXEEXT) -m V.22bis1200 -r >v22bis_rx_1200_floating_rrc.h v22bis_rx_2400_floating_rrc.h: make_modem_filter$(EXEEXT) ./make_modem_filter$(EXEEXT) -m V.22bis2400 -r >v22bis_rx_2400_floating_rrc.h v22bis_tx.$(OBJEXT): v22bis_tx_fixed_rrc.h v22bis_tx_floating_rrc.h v22bis_tx.lo: v22bis_tx_fixed_rrc.h v22bis_tx_floating_rrc.h v22bis_tx_fixed_rrc.h: make_modem_filter$(EXEEXT) ./make_modem_filter$(EXEEXT) -m V.22bis -i -t >v22bis_tx_fixed_rrc.h v22bis_tx_floating_rrc.h: make_modem_filter$(EXEEXT) ./make_modem_filter$(EXEEXT) -m V.22bis -t >v22bis_tx_floating_rrc.h v27ter_rx_.$(OBJEXT): v27ter_rx_2400_fixed_rrc.h \ v27ter_rx_4800_fixed_rrc.h \ v27ter_rx_2400_floating_rrc.h \ v27ter_rx_4800_floating_rrc.h v27ter_rx.lo: v27ter_rx_2400_fixed_rrc.h \ v27ter_rx_4800_fixed_rrc.h \ v27ter_rx_2400_floating_rrc.h \ v27ter_rx_4800_floating_rrc.h v27ter_rx_2400_fixed_rrc.h: make_modem_filter$(EXEEXT) ./make_modem_filter$(EXEEXT) -m V.27ter2400 -i -r >v27ter_rx_2400_fixed_rrc.h v27ter_rx_4800_fixed_rrc.h: make_modem_filter$(EXEEXT) ./make_modem_filter$(EXEEXT) -m V.27ter4800 -i -r >v27ter_rx_4800_fixed_rrc.h v27ter_rx_2400_floating_rrc.h: make_modem_filter$(EXEEXT) ./make_modem_filter$(EXEEXT) -m V.27ter2400 -r >v27ter_rx_2400_floating_rrc.h v27ter_rx_4800_floating_rrc.h: make_modem_filter$(EXEEXT) ./make_modem_filter$(EXEEXT) -m V.27ter4800 -r >v27ter_rx_4800_floating_rrc.h v27ter_tx_.$(OBJEXT): v27ter_tx_2400_fixed_rrc.h \ v27ter_tx_4800_fixed_rrc.h \ v27ter_tx_2400_floating_rrc.h \ v27ter_tx_4800_floating_rrc.h v27ter_tx.lo: v27ter_tx_2400_fixed_rrc.h \ v27ter_tx_4800_fixed_rrc.h \ v27ter_tx_2400_floating_rrc.h \ v27ter_tx_4800_floating_rrc.h v27ter_tx_2400_fixed_rrc.h: make_modem_filter$(EXEEXT) ./make_modem_filter$(EXEEXT) -m V.27ter2400 -i -t >v27ter_tx_2400_fixed_rrc.h v27ter_tx_4800_fixed_rrc.h: make_modem_filter$(EXEEXT) ./make_modem_filter$(EXEEXT) -m V.27ter4800 -i -t >v27ter_tx_4800_fixed_rrc.h v27ter_tx_2400_floating_rrc.h: make_modem_filter$(EXEEXT) ./make_modem_filter$(EXEEXT) -m V.27ter2400 -t >v27ter_tx_2400_floating_rrc.h v27ter_tx_4800_floating_rrc.h: make_modem_filter$(EXEEXT) ./make_modem_filter$(EXEEXT) -m V.27ter4800 -t >v27ter_tx_4800_floating_rrc.h v29rx.$(OBJEXT): v29rx_fixed_rrc.h v29rx_floating_rrc.h v29rx.lo: v29rx_fixed_rrc.h v29rx_floating_rrc.h v29rx_fixed_rrc.h: make_modem_filter$(EXEEXT) ./make_modem_filter$(EXEEXT) -m V.29 -i -r >v29rx_fixed_rrc.h v29rx_floating_rrc.h: make_modem_filter$(EXEEXT) ./make_modem_filter$(EXEEXT) -m V.29 -r >v29rx_floating_rrc.h v29tx.$(OBJEXT): v29tx_fixed_rrc.h v29tx_floating_rrc.h v29tx.lo: v29tx_fixed_rrc.h v29tx_floating_rrc.h v29tx_fixed_rrc.h: make_modem_filter$(EXEEXT) ./make_modem_filter$(EXEEXT) -m V.29 -i -t >v29tx_fixed_rrc.h v29tx_floating_rrc.h: make_modem_filter$(EXEEXT) ./make_modem_filter$(EXEEXT) -m V.29 -t >v29tx_floating_rrc.h $(DSP): msvc/msvcproj.head msvc/msvcproj.foot Makefile.am echo "creating $(DSP)" @(cp $(srcdir)/msvc/msvcproj.head $(DSP); \ echo "# Begin Group \"Source Files\"" $(DSPOUT); \ for file in $(WIN32SOURCES); do \ echo "# Begin Source File" $(DSPOUT); \ echo "" $(DSPOUT); \ echo "SOURCE=.\\"$$file $(DSPOUT); \ echo "# End Source File" $(DSPOUT); \ done; \ echo "# End Group" $(DSPOUT); \ echo "# Begin Group \"Header Files\"" $(DSPOUT); \ for file in $(WIN32HEADERS); do \ echo "# Begin Source File" $(DSPOUT); \ echo "" $(DSPOUT); \ echo "SOURCE=.\\"$$file $(DSPOUT); \ echo "# End Source File" $(DSPOUT); \ done; \ echo "# End Group" $(DSPOUT); \ cat $(srcdir)/msvc/msvcproj.foot $(DSPOUT) ) $(VCPROJ): msvc/vc8proj.head msvc/vc8proj.foot Makefile.am echo "creating $(VCPROJ)" @(cp $(srcdir)/msvc/vc8proj.head $(VCPROJ); \ for file in $(WIN32SOURCES); do \ echo "" $(VCPROJOUT); \ done; \ echo "" $(VCPROJOUT); \ for file in $(WIN32HEADERS); do \ echo "" $(VCPROJOUT); \ done; \ cat $(srcdir)/msvc/vc8proj.foot $(VCPROJOUT) ) spandsp/version.h: NOWDATE=`date --utc +"%Y%m%d"` ; \ NOWTIME=`date --utc +"%H%M%S"` ; \ sed 's/$$SPANDSP_RELEASE_DATE/'$$NOWDATE'/;s/$$SPANDSP_RELEASE_TIME/'$$NOWTIME'/' \ spandsp/version.h dist-hook: NOWDATE=`date --utc +"%Y%m%d"` ; \ NOWTIME=`date --utc +"%H%M%S"` ; \ sed 's/$$SPANDSP_RELEASE_DATE/'$$NOWDATE'/;s/$$SPANDSP_RELEASE_TIME/'$$NOWTIME'/' \ spandsp/version.h # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: iaxmodem-1.2.0/lib/spandsp/src/spandsp/0000755000175000017500000000000011150047206017324 5ustar julienjulieniaxmodem-1.2.0/lib/spandsp/src/spandsp/hdlc.h0000644000175000017500000002706611150047205020421 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * hdlc.h * * Written by Steve Underwood * * Copyright (C) 2003 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: hdlc.h,v 1.39 2008/04/17 14:27:00 steveu Exp $ */ /*! \file */ /*! \page hdlc_page HDLC \section hdlc_page_sec_1 What does it do? The HDLC module provides bit stuffing, destuffing, framing and deframing, according to the HDLC protocol. It also provides 16 and 32 bit CRC generation and checking services for HDLC frames. HDLC may not be a DSP function, but is needed to accompany several DSP components. \section hdlc_page_sec_2 How does it work? */ #if !defined(_SPANDSP_HDLC_H_) #define _SPANDSP_HDLC_H_ /*! HDLC_MAXFRAME_LEN is the maximum length of a stuffed HDLC frame, excluding the CRC. */ #define HDLC_MAXFRAME_LEN 400 typedef void (*hdlc_frame_handler_t)(void *user_data, const uint8_t *pkt, int len, int ok); typedef void (*hdlc_underflow_handler_t)(void *user_data); /*! HDLC receive descriptor. This contains all the state information for an HDLC receiver. */ typedef struct { /*! 2 for CRC-16, 4 for CRC-32 */ int crc_bytes; /*! \brief Maximum permitted frame length. */ size_t max_frame_len; /*! \brief The callback routine called to process each good received frame. */ hdlc_frame_handler_t frame_handler; /*! \brief An opaque parameter passed to the callback routine. */ void *user_data; /*! \brief TRUE if bad frames are to be reported. */ int report_bad_frames; /*! \brief The number of consecutive flags which must be seen before framing is declared OK. */ int framing_ok_threshold; /*! \brief TRUE if framing OK has been announced. */ int framing_ok_announced; /*! \brief Number of consecutive flags seen so far. */ int flags_seen; /*! \brief The raw (stuffed) bit stream buffer. */ unsigned int raw_bit_stream; /*! \brief The destuffed bit stream buffer. */ unsigned int byte_in_progress; /*! \brief The current number of bits in byte_in_progress. */ int num_bits; /*! \brief TRUE if in octet counting mode (e.g. for MTP). */ int octet_counting_mode; /*! \brief Octet count, to achieve the functionality needed for things like MTP. */ int octet_count; /*! \brief The number of octets to be allowed between octet count reports. */ int octet_count_report_interval; /*! \brief Buffer for a frame in progress. */ uint8_t buffer[HDLC_MAXFRAME_LEN + 4]; /*! \brief Length of a frame in progress. */ size_t len; /*! \brief The number of bytes of good frames received (CRC not included). */ unsigned long int rx_bytes; /*! \brief The number of good frames received. */ unsigned long int rx_frames; /*! \brief The number of frames with CRC errors received. */ unsigned long int rx_crc_errors; /*! \brief The number of too short and too long frames received. */ unsigned long int rx_length_errors; /*! \brief The number of HDLC aborts received. */ unsigned long int rx_aborts; } hdlc_rx_state_t; /*! HDLC received data statistics. */ typedef struct { /*! \brief The number of bytes of good frames received (CRC not included). */ unsigned long int bytes; /*! \brief The number of good frames received. */ unsigned long int good_frames; /*! \brief The number of frames with CRC errors received. */ unsigned long int crc_errors; /*! \brief The number of too short and too long frames received. */ unsigned long int length_errors; /*! \brief The number of HDLC aborts received. */ unsigned long int aborts; } hdlc_rx_stats_t; /*! HDLC transmit descriptor. This contains all the state information for an HDLC transmitter. */ typedef struct { /*! 2 for CRC-16, 4 for CRC-32 */ int crc_bytes; /*! \brief The callback routine called to indicate transmit underflow. */ hdlc_underflow_handler_t underflow_handler; /*! \brief An opaque parameter passed to the callback routine. */ void *user_data; /*! \brief The minimum flag octets to insert between frames. */ int inter_frame_flags; /*! \brief TRUE if frame creation works in progressive mode. */ int progressive; /*! \brief Maximum permitted frame length. */ size_t max_frame_len; /*! \brief The stuffed bit stream being created. */ uint32_t octets_in_progress; /*! \brief The number of bits currently in octets_in_progress. */ int num_bits; /*! \brief The currently rotated state of the flag octet. */ int idle_octet; /*! \brief The number of flag octets to send for a timed burst of flags. */ int flag_octets; /*! \brief The number of abort octets to send for a timed burst of aborts. */ int abort_octets; /*! \brief TRUE if the next underflow of timed flag octets should be reported */ int report_flag_underflow; /*! \brief The current message being transmitted, with its CRC attached. */ uint8_t buffer[HDLC_MAXFRAME_LEN + 4]; /*! \brief The length of the message in the buffer. */ size_t len; /*! \brief The current send position within the buffer. */ int pos; /*! \brief The running CRC, as data fills the frame buffer. */ uint32_t crc; /*! \brief The current byte being broken into bits for transmission. */ int byte; /*! \brief The number of bits remaining in byte. */ int bits; /*! \brief TRUE if transmission should end on buffer underflow .*/ int tx_end; } hdlc_tx_state_t; #if defined(__cplusplus) extern "C" { #endif /*! \brief Initialise an HDLC receiver context. \param s A pointer to an HDLC receiver context. \param crc32 TRUE to use ITU CRC32. FALSE to use ITU CRC16. \param report_bad_frames TRUE to request the reporting of bad frames. \param framing_ok_threshold The number of back-to-back flags needed to start the framing OK condition. This may be used where a series of flag octets is used as a preamble, such as in the T.30 protocol. \param handler The function to be called when a good HDLC frame is received. \param user_data An opaque parameter for the callback routine. \return A pointer to the HDLC receiver context. */ hdlc_rx_state_t *hdlc_rx_init(hdlc_rx_state_t *s, int crc32, int report_bad_frames, int framing_ok_threshold, hdlc_frame_handler_t handler, void *user_data); /*! \brief Set the maximum frame length for an HDLC receiver context. \param s A pointer to an HDLC receiver context. \param max_len The maximum permitted length of a frame. */ void hdlc_rx_set_max_frame_len(hdlc_rx_state_t *s, size_t max_len); /*! \brief Set the octet counting report interval. \param s A pointer to an HDLC receiver context. \param interval The interval, in octets. */ void hdlc_rx_set_octet_counting_report_interval(hdlc_rx_state_t *s, int interval); /*! \brief Get the current receive statistics. \param s A pointer to an HDLC receiver context. \param t A pointer to the buffer for the statistics. \return 0 for OK, else -1. */ int hdlc_rx_get_stats(hdlc_rx_state_t *s, hdlc_rx_stats_t *t); /*! \brief Put a single bit of data to an HDLC receiver. \param s A pointer to an HDLC receiver context. \param new_bit The bit. */ void hdlc_rx_put_bit(hdlc_rx_state_t *s, int new_bit); /*! \brief Put a byte of data to an HDLC receiver. \param s A pointer to an HDLC receiver context. \param new_byte The byte of data. */ void hdlc_rx_put_byte(hdlc_rx_state_t *s, int new_byte); /*! \brief Put a series of bytes of data to an HDLC receiver. \param s A pointer to an HDLC receiver context. \param buf The buffer of data. \param len The length of the data in the buffer. */ void hdlc_rx_put(hdlc_rx_state_t *s, const uint8_t buf[], int len); /*! \brief Initialise an HDLC transmitter context. \param s A pointer to an HDLC transmitter context. \param crc32 TRUE to use ITU CRC32. FALSE to use ITU CRC16. \param inter_frame_flags The minimum flag octets to insert between frames (usually one). \param progressive TRUE if frame creation works in progressive mode. \param handler The callback function called when the HDLC transmitter underflows. \param user_data An opaque parameter for the callback routine. \return A pointer to the HDLC transmitter context. */ hdlc_tx_state_t *hdlc_tx_init(hdlc_tx_state_t *s, int crc32, int inter_frame_flags, int progressive, hdlc_underflow_handler_t handler, void *user_data); /*! \brief Set the maximum frame length for an HDLC transmitter context. \param s A pointer to an HDLC transmitter context. \param max_len The maximum length. */ void hdlc_tx_set_max_frame_len(hdlc_tx_state_t *s, size_t max_len); /*! \brief Transmit a frame. \param s A pointer to an HDLC transmitter context. \param frame A pointer to the frame to be transmitted. \param len The length of the frame to be transmitted. \return 0 if the frame was accepted for transmission, else -1. */ int hdlc_tx_frame(hdlc_tx_state_t *s, const uint8_t *frame, size_t len); /*! \brief Corrupt the frame currently being transmitted, by giving it the wrong CRC. \param s A pointer to an HDLC transmitter context. \return 0 if the frame was corrupted, else -1. */ int hdlc_tx_corrupt_frame(hdlc_tx_state_t *s); /*! \brief Transmit a specified quantity of flag octets, typically as a preamble. \param s A pointer to an HDLC transmitter context. \param len The length of the required period of flags, in flag octets. If len is zero this requests that HDLC transmission be terminated when the buffers have fully drained. \return 0 if the flags were accepted for transmission, else -1. */ int hdlc_tx_flags(hdlc_tx_state_t *s, int len); /*! \brief Send an abort. \param s A pointer to an HDLC transmitter context. \return 0 if the frame was aborted, else -1. */ int hdlc_tx_abort(hdlc_tx_state_t *s); /*! \brief Get the next bit for transmission. \param s A pointer to an HDLC transmitter context. \return The next bit for transmission. */ int hdlc_tx_get_bit(hdlc_tx_state_t *s); /*! \brief Get the next byte for transmission. \param s A pointer to an HDLC transmitter context. \return The next byte for transmission. */ int hdlc_tx_get_byte(hdlc_tx_state_t *s); /*! \brief Get the next sequence of bytes for transmission. \param s A pointer to an HDLC transmitter context. \param buf The buffer for the data. \param max_len The number of bytes to get. \return The number of bytes actually got. */ int hdlc_tx_get(hdlc_tx_state_t *s, uint8_t buf[], size_t max_len); #if defined(__cplusplus) } #endif #endif /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/spandsp/super_tone_tx.h0000644000175000017500000000643711150047205022404 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * super_tone_tx.h - Flexible telephony supervisory tone generation. * * Written by Steve Underwood * * Copyright (C) 2001 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: super_tone_tx.h,v 1.13 2008/04/17 14:27:00 steveu Exp $ */ #if !defined(_SPANDSP_SUPER_TONE_TX_H_) #define _SPANDSP_SUPER_TONE_TX_H_ /*! \page super_tone_tx_page Supervisory tone generation \section super_tone_tx_page_sec_1 What does it do? The supervisory tone generator may be configured to generate most of the world's telephone supervisory tones - things like ringback, busy, number unobtainable, and so on. It uses tree structure tone descriptions, which can deal with quite complex cadence patterns. \section super_tone_tx_page_sec_2 How does it work? */ typedef struct super_tone_tx_step_s super_tone_tx_step_t; struct super_tone_tx_step_s { tone_gen_tone_descriptor_t tone[4]; int tone_on; int length; int cycles; super_tone_tx_step_t *next; super_tone_tx_step_t *nest; }; typedef struct { tone_gen_tone_descriptor_t tone[4]; uint32_t phase[4]; int current_position; int level; super_tone_tx_step_t *levels[4]; int cycles[4]; } super_tone_tx_state_t; #if defined(__cplusplus) extern "C" { #endif super_tone_tx_step_t *super_tone_tx_make_step(super_tone_tx_step_t *s, float f1, float l1, float f2, float l2, int length, int cycles); void super_tone_tx_free(super_tone_tx_step_t *s); /*! Initialise a supervisory tone generator. \brief Initialise a supervisory tone generator. \param s The supervisory tone generator context. \param tree The supervisory tone tree to be generated. \return The supervisory tone generator context. */ super_tone_tx_state_t *super_tone_tx_init(super_tone_tx_state_t *s, super_tone_tx_step_t *tree); /*! Generate a block of audio samples for a supervisory tone pattern. \brief Generate a block of audio samples for a supervisory tone pattern. \param s The supervisory tone context. \param amp The audio sample buffer. \param max_samples The maximum number of samples to be generated. \return The number of samples generated. */ int super_tone_tx(super_tone_tx_state_t *s, int16_t amp[], int max_samples); #if defined(__cplusplus) } #endif #endif /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/spandsp/gsm0610.h0000644000175000017500000001366311150047205020602 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * gsm0610.h - GSM 06.10 full rate speech codec. * * Written by Steve Underwood * * Copyright (C) 2006 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: gsm0610.h,v 1.17 2008/04/17 14:27:00 steveu Exp $ */ #if !defined(_SPANDSP_GSM0610_H_) #define _SPANDSP_GSM0610_H_ /*! \page gsm0610_page GSM 06.10 encoding and decoding \section gsm0610_page_sec_1 What does it do? The GSM 06.10 module is an version of the widely used GSM FR codec software available from http://kbs.cs.tu-berlin.de/~jutta/toast.html. This version was produced since some versions of this codec are not bit exact, or not very efficient on modern processors. This implementation can use MMX instructions on Pentium class processors, or alternative methods on other processors. It passes all the ETSI test vectors. That is, it is a tested bit exact implementation. This implementation supports encoded data in one of three packing formats: - Unpacked, with the 76 parameters of a GSM 06.10 code frame each occupying a separate byte. (note that none of the parameters exceed 8 bits). - Packed the the 33 byte per frame, used for VoIP, where 4 bits per frame are wasted. - Packed in WAV49 format, where 2 frames are packed into 65 bytes. \section gsm0610_page_sec_2 How does it work? ???. */ enum { GSM0610_PACKING_NONE, GSM0610_PACKING_WAV49, GSM0610_PACKING_VOIP }; /*! GSM 06.10 FR codec unpacked frame. */ typedef struct { int16_t LARc[8]; int16_t Nc[4]; int16_t bc[4]; int16_t Mc[4]; int16_t xmaxc[4]; int16_t xMc[4][13]; } gsm0610_frame_t; /*! GSM 06.10 FR codec state descriptor. This defines the state of a single working instance of the GSM 06.10 FR encoder or decoder. */ typedef struct { /*! \brief One of the packing modes */ int packing; int16_t dp0[280]; /*! Preprocessing */ int16_t z1; int32_t L_z2; /*! Pre-emphasis */ int16_t mp; /*! Short term delay filter */ int16_t u[8]; int16_t LARpp[2][8]; int16_t j; /*! Long term synthesis */ int16_t nrp; /*! Short term synthesis */ int16_t v[9]; /*! Decoder postprocessing */ int16_t msr; /*! Encoder data */ int16_t e[50]; } gsm0610_state_t; #if defined(__cplusplus) extern "C" { #endif /*! Initialise a GSM 06.10 encode or decode context. \param s The GSM 06.10 context \param packing One of the GSM0610_PACKING_xxx options. \return A pointer to the GSM 06.10 context, or NULL for error. */ gsm0610_state_t *gsm0610_init(gsm0610_state_t *s, int packing); /*! Release a GSM 06.10 encode or decode context. \param s The GSM 06.10 context \return 0 for success, else -1. */ int gsm0610_release(gsm0610_state_t *s); /*! Set the packing format for a GSM 06.10 encode or decode context. \param s The GSM 06.10 context \param packing One of the GSM0610_PACKING_xxx options. \return 0 for success, else -1. */ int gsm0610_set_packing(gsm0610_state_t *s, int packing); /*! Encode a buffer of linear PCM data to GSM 06.10. \param s The GSM 06.10 context. \param code The GSM 06.10 data produced. \param amp The audio sample buffer. \param len The number of samples in the buffer. \return The number of bytes of GSM 06.10 data produced. */ int gsm0610_encode(gsm0610_state_t *s, uint8_t code[], const int16_t amp[], int len); /*! Decode a buffer of GSM 06.10 data to linear PCM. \param s The GSM 06.10 context. \param amp The audio sample buffer. \param code The GSM 06.10 data. \param len The number of bytes of GSM 06.10 data to be decoded. \return The number of samples returned. */ int gsm0610_decode(gsm0610_state_t *s, int16_t amp[], const uint8_t code[], int len); int gsm0610_pack_none(uint8_t c[], const gsm0610_frame_t *s); /*! Pack a pair of GSM 06.10 frames in the format used for wave files (wave type 49). \param c The buffer for the packed data. This must be at least 65 bytes long. \param s A pointer to the frames to be packed. \return The number of bytes generated. */ int gsm0610_pack_wav49(uint8_t c[], const gsm0610_frame_t *s); /*! Pack a GSM 06.10 frames in the format used for VoIP. \param c The buffer for the packed data. This must be at least 33 bytes long. \param s A pointer to the frame to be packed. \return The number of bytes generated. */ int gsm0610_pack_voip(uint8_t c[], const gsm0610_frame_t *s); int gsm0610_unpack_none(gsm0610_frame_t *s, const uint8_t c[]); /*! Unpack a pair of GSM 06.10 frames from the format used for wave files (wave type 49). \param s A pointer to a buffer into which the frames will be packed. \param c The buffer containing the data to be unpacked. This must be at least 65 bytes long. \return The number of bytes absorbed. */ int gsm0610_unpack_wav49(gsm0610_frame_t *s, const uint8_t c[]); /*! Unpack a GSM 06.10 frame from the format used for VoIP. \param s A pointer to a buffer into which the frame will be packed. \param c The buffer containing the data to be unpacked. This must be at least 33 bytes long. \return The number of bytes absorbed. */ int gsm0610_unpack_voip(gsm0610_frame_t *s, const uint8_t c[]); #if defined(__cplusplus) } #endif #endif /*- End of include ---------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/spandsp/version.h0000644000175000017500000000234411150047205021164 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * version.h - A tag file, so the exact installed revision can be assertained. * * Written by Steve Underwood * * Copyright (C) 2007 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2, as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: version.h.in,v 1.2 2007/04/06 13:20:36 steveu Exp $ */ #if !defined(_SPANDSP_VERSION_H_) #define _SPANDSP_VERSION_H_ /* The date and time of the version are in UTC form. */ #define SPANDSP_RELEASE_DATE 20080725 #define SPANDSP_RELEASE_TIME 150128 #endif /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/spandsp/bert.h0000644000175000017500000001331311150047205020431 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * bert.h - Bit error rate tests. * * Written by Steve Underwood * * Copyright (C) 2004 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: bert.h,v 1.19 2008/04/17 14:26:59 steveu Exp $ */ #if !defined(_SPANDSP_BERT_H_) #define _SPANDSP_BERT_H_ /*! \page bert_page The Bit Error Rate tester \section bert_page_sec_1 What does it do? The Bit Error Rate tester generates a pseudo random bit stream. It also accepts such a pattern, synchronises to it, and checks the bit error rate in this stream. \section bert_page_sec_2 How does it work? The Bit Error Rate tester generates a bit stream, with a repeating 2047 bit pseudo random pattern, using an 11 stage polynomial generator. It also accepts such a pattern, synchronises to it, and checks the bit error rate in this stream. If the error rate is excessive the tester assumes synchronisation has been lost, and it attempts to resynchronise with the stream. The bit error rate is continuously assessed against decadic ranges - > 1 in 10^2 > 1 in 10^3 > 1 in 10^4 > 1 in 10^5 > 1 in 10^6 > 1 in 10^7 < 1 in 10^7 To ensure fairly smooth results from this assessment, each decadic level is assessed over 10/error rate bits. That is, to assess if the signal's BER is above or below 1 in 10^5 the software looks over 10*10^5 => 10^6 bits. */ enum { BERT_REPORT_SYNCED = 0, BERT_REPORT_UNSYNCED, BERT_REPORT_REGULAR, BERT_REPORT_GT_10_2, BERT_REPORT_LT_10_2, BERT_REPORT_LT_10_3, BERT_REPORT_LT_10_4, BERT_REPORT_LT_10_5, BERT_REPORT_LT_10_6, BERT_REPORT_LT_10_7 }; /* The QBF strings should be: "VoyeZ Le BricK GeanT QuE J'ExaminE PreS Du WharF 123 456 7890 + - * : = $ % ( )" "ThE QuicK BrowN FoX JumpS OveR ThE LazY DoG 123 456 7890 + - * : = $ % ( )" */ enum { BERT_PATTERN_ZEROS = 0, BERT_PATTERN_ONES, BERT_PATTERN_7_TO_1, BERT_PATTERN_3_TO_1, BERT_PATTERN_1_TO_1, BERT_PATTERN_1_TO_3, BERT_PATTERN_1_TO_7, BERT_PATTERN_QBF, BERT_PATTERN_ITU_O151_23, BERT_PATTERN_ITU_O151_20, BERT_PATTERN_ITU_O151_15, BERT_PATTERN_ITU_O152_11, BERT_PATTERN_ITU_O153_9 }; /*! Bit error rate tester (BERT) results descriptor. This is used to report the results of a BER test. */ typedef struct { int total_bits; int bad_bits; int resyncs; } bert_results_t; typedef void (*bert_report_func_t)(void *user_data, int reason, bert_results_t *bert_results); /*! Bit error rate tester (BERT) descriptor. This defines the working state for a single instance of the BERT. */ typedef struct { int pattern; int pattern_class; bert_report_func_t reporter; void *user_data; int report_frequency; int limit; uint32_t tx_reg; int tx_step; int tx_step_bit; int tx_bits; int tx_zeros; uint32_t rx_reg; uint32_t ref_reg; uint32_t master_reg; int rx_step; int rx_step_bit; int resync; int rx_bits; int rx_zeros; int resync_len; int resync_percent; int resync_bad_bits; int resync_cnt; uint32_t mask; int shift; int shift2; int max_zeros; int invert; int resync_time; int decade_ptr[9]; int decade_bad[9][10]; int step; int error_rate; int bit_error_status; int report_countdown; bert_results_t results; /*! \brief Error and flow logging control */ logging_state_t logging; } bert_state_t; #if defined(__cplusplus) extern "C" { #endif /*! Return a short description of a BERT event. \param event The event type. \return A pointer to a short text string describing the event. */ const char *bert_event_to_str(int event); /*! Initialise a BERT context. \param s The BERT context. \param limit The maximum test duration. \param pattern One of the supported BERT signal patterns. \param resync_len ??? \param resync_percent The percentage of bad bits which will cause a resync. \return The BERT context. */ bert_state_t *bert_init(bert_state_t *s, int limit, int pattern, int resync_len, int resync_percent); /*! Get the next bit of the BERT sequence from the generator. \param s The BERT context. \return The bit. */ int bert_get_bit(bert_state_t *s); /*! Put the next bit of the BERT sequence to the analyser. \param s The BERT context. \param bit The bit. */ void bert_put_bit(bert_state_t *s, int bit); /*! Set the callback function for reporting the test status. \param s The BERT context. \param freq The required frequency of regular reports. \param reporter The callback function. \param user_data An opaque pointer passed to the reporter routine. */ void bert_set_report(bert_state_t *s, int freq, bert_report_func_t reporter, void *user_data); /*! Get the results of the BERT. \param s The BERT context. \param results The results. \return The size of the result structure. */ int bert_result(bert_state_t *s, bert_results_t *results); #if defined(__cplusplus) } #endif #endif /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/spandsp/modem_echo.h0000644000175000017500000001241411150047205021575 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * modem_echo.h - An echo cancellor, suitable for electrical echos in GSTN modems * * Written by Steve Underwood * * Copyright (C) 2001, 2004 Steve Underwood * * Based on a bit from here, a bit from there, eye of toad, * ear of bat, etc - plus, of course, my own 2 cents. * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: modem_echo.h,v 1.11 2008/04/17 14:27:00 steveu Exp $ */ /*! \file */ #if !defined(_SPANDSP_MODEM_ECHO_H_) #define _SPANDSP_MODEM_ECHO_H_ /*! \page modem_echo_can_page Line echo cancellation for modems \section modem_echo_can_page_sec_1 What does it do? This module aims to cancel electrical echoes (e.g. from 2-4 wire hybrids) in modem applications. It is not very suitable for speech applications, which require additional refinements for satisfactory performance. It is, however, more efficient and better suited to modem applications. \section modem_echo_can_page_sec_2 How does it work? The heart of the echo cancellor is an adaptive FIR filter. This is adapted to match the impulse response of the environment being cancelled. It must be long enough to adequately cover the duration of that impulse response. The signal being transmitted into the environment being cancelled is passed through the FIR filter. The resulting output is an estimate of the echo signal. This is then subtracted from the received signal, and the result should be an estimate of the signal which originates within the environment being cancelled (people talking in the room, or the signal from the far end of a telephone line) free from the echos of our own transmitted signal. The FIR filter is adapted using the least mean squares (LMS) algorithm. This algorithm is attributed to Widrow and Hoff, and was introduced in 1960. It is the commonest form of filter adaption used in things like modem line equalisers and line echo cancellers. It works very well if the signal level is constant, which is true for a modem signal. To ensure good performa certain conditions must be met: - The transmitted signal has weak self-correlation. - There is no signal being generated within the environment being cancelled. The difficulty is that neither of these can be guaranteed. If the adaption is performed while transmitting noise (or something fairly noise like, such as voice) the adaption works very well. If the adaption is performed while transmitting something highly correlative (e.g. tones, like DTMF), the adaption can go seriously wrong. The reason is there is only one solution for the adaption on a near random signal. For a repetitive signal, there are a number of solutions which converge the adaption, and nothing guides the adaption to choose the correct one. \section modem_echo_can_page_sec_3 How do I use it? The echo cancellor processes both the transmit and receive streams sample by sample. The processing function is not declared inline. Unfortunately, cancellation requires many operations per sample, so the call overhead is only a minor burden. */ #include "fir.h" /*! Modem line echo canceller descriptor. This defines the working state for a line echo canceller. */ typedef struct { int adapt; int taps; fir16_state_t fir_state; /*! Echo FIR taps (16 bit version) */ int16_t *fir_taps16; /*! Echo FIR taps (32 bit version) */ int32_t *fir_taps32; int tx_power; int rx_power; int curr_pos; } modem_echo_can_state_t; #if defined(__cplusplus) extern "C" { #endif /*! Create a modem echo canceller context. \param len The length of the canceller, in samples. eturn The new canceller context, or NULL if the canceller could not be created. */ modem_echo_can_state_t *modem_echo_can_create(int len); /*! Free a modem echo canceller context. \param ec The echo canceller context. */ void modem_echo_can_free(modem_echo_can_state_t *ec); /*! Flush (reinitialise) a modem echo canceller context. \param ec The echo canceller context. */ void modem_echo_can_flush(modem_echo_can_state_t *ec); /*! Set the adaption mode of a modem echo canceller context. \param ec The echo canceller context. \param adapt The mode. */ void modem_echo_can_adaption_mode(modem_echo_can_state_t *ec, int adapt); /*! Process a sample through a modem echo canceller. \param ec The echo canceller context. \param tx The transmitted audio sample. \param rx The received audio sample. eturn The clean (echo cancelled) received sample. */ int16_t modem_echo_can_update(modem_echo_can_state_t *ec, int16_t tx, int16_t rx); #if defined(__cplusplus) } #endif #endif /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/spandsp/t38_terminal.h0000644000175000017500000001452211150047205022011 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * t38_terminal.h - T.38 termination, less the packet exchange part * * Written by Steve Underwood * * Copyright (C) 2005 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: t38_terminal.h,v 1.34 2008/07/25 13:56:54 steveu Exp $ */ /*! \file */ #if !defined(_SPANDSP_T38_TERMINAL_H_) #define _SPANDSP_T38_TERMINAL_H_ /*! \page t38_terminal_page T.38 real time FAX over IP termination \section t38_terminal_page_sec_1 What does it do? \section t38_terminal_page_sec_2 How does it work? */ /* Make sure the HDLC frame buffers are big enough for ECM frames. */ #define T38_MAX_HDLC_LEN 260 typedef struct { /*! \brief Core T.38 IFP support */ t38_core_state_t t38; /*! \brief Internet Aware FAX mode bit mask. */ int iaf; /*! \brief Required time between T.38 transmissions, in ms. */ int ms_per_tx_chunk; /*! \brief Bit fields controlling the way data is packed into chunked for transmission. */ int chunking_modes; /*! \brief The current transmit step being timed */ int timed_step; /*! \brief TRUE is there has been some T.38 data missed (i.e. lost packets) in the current reception period. */ int missing_data; /*! \brief The number of octets to send in each image packet (non-ECM or ECM) at the current rate and the current specified packet interval. */ int octets_per_data_packet; struct { /*! \brief HDLC receive buffer */ uint8_t buf[T38_MAX_HDLC_LEN]; /*! \brief The length of the contents of the HDLC receive buffer */ int len; } hdlc_rx; struct { /*! \brief HDLC transmit buffer */ uint8_t buf[T38_MAX_HDLC_LEN]; /*! \brief The length of the contents of the HDLC transmit buffer */ int len; /*! \brief Current pointer within the contents of the HDLC transmit buffer */ int ptr; /*! \brief The number of extra bits in a fully stuffed version of the contents of the HDLC transmit buffer. This is needed to accurately estimate the playout time for this frame, through an analogue modem. */ int extra_bits; } tx; /*! \brief Counter for trailing bytes, used to flush the far end's modem */ int trailer_bytes; /*! \brief The next queued tramsit indicator */ int next_tx_indicator; /*! \brief The current T.38 data type being transmitted */ int current_tx_data_type; /*! \brief TRUE if a carrier is present. Otherwise FALSE. */ int rx_signal_present; /*! \brief The current operating mode of the receiver. */ int current_rx_type; /*! \brief The current operating mode of the transmitter. */ int current_tx_type; /*! \brief Current bit rate. */ int bit_rate; /*! \brief A "sample" count, used to time events. */ int32_t samples; /*! \brief The value for samples at the next transmission point. */ int32_t next_tx_samples; /*! \brief The current receive timeout. */ int32_t timeout_rx_samples; } t38_terminal_front_end_state_t; /*! T.38 terminal state. */ typedef struct { /*! \brief The T.30 back-end */ t30_state_t t30; /*! \brief The T.38 front-end */ t38_terminal_front_end_state_t t38_fe; logging_state_t logging; } t38_terminal_state_t; #if defined(__cplusplus) extern "C" { #endif int t38_terminal_send_timeout(t38_terminal_state_t *s, int samples); void t38_terminal_set_config(t38_terminal_state_t *s, int without_pacing); /*! Select whether the time for talker echo protection tone will be allowed for when sending. \brief Select whether TEP time will be allowed for. \param s The T.38 context. \param use_tep TRUE if TEP should be allowed for. */ void t38_terminal_set_tep_mode(t38_terminal_state_t *s, int use_tep); /*! Select whether non-ECM fill bits are to be removed during transmission. \brief Select whether non-ECM fill bits are to be removed during transmission. \param s The T.38 context. \param remove TRUE if fill bits are to be removed. */ void t38_terminal_set_fill_bit_removal(t38_terminal_state_t *s, int remove); /*! Get a pointer to the T.30 engine associated with a termination mode T.38 context. \brief Get a pointer to the T.30 engine associated with a T.38 context. \param s The T.38 context. \return A pointer to the T.30 context, or NULL. */ t30_state_t *t38_terminal_get_t30_state(t38_terminal_state_t *s); /*! \brief Initialise a termination mode T.38 context. \param s The T.38 context. \param calling_party TRUE if the context is for a calling party. FALSE if the context is for an answering party. \param tx_packet_handler A callback routine to encapsulate and transmit T.38 packets. \param tx_packet_user_data An opaque pointer passed to the tx_packet_handler routine. \return A pointer to the termination mode T.38 context, or NULL if there was a problem. */ t38_terminal_state_t *t38_terminal_init(t38_terminal_state_t *s, int calling_party, t38_tx_packet_handler_t *tx_packet_handler, void *tx_packet_user_data); /*! Release a termination mode T.38 context. \brief Release a T.38 context. \param s The T.38 context. \return 0 for OK, else -1. */ int t38_terminal_release(t38_terminal_state_t *s); /*! Free a a termination mode T.38 context. \brief Free a T.38 context. \param s The T.38 context. \return 0 for OK, else -1. */ int t38_terminal_free(t38_terminal_state_t *s); #if defined(__cplusplus) } #endif #endif /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/spandsp/t4.h0000644000175000017500000006010711150047205020027 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * t4.h - definitions for T.4 fax processing * * Written by Steve Underwood * * Copyright (C) 2003 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: t4.h,v 1.52 2008/07/22 13:48:15 steveu Exp $ */ /*! \file */ #if !defined(_SPANDSP_T4_H_) #define _SPANDSP_T4_H_ /*! \page t4_page T.4 image compression and decompression \section t4_page_sec_1 What does it do? The T.4 image compression and decompression routines implement the 1D and 2D encoding methods defined in ITU specification T.4. They also implement the pure 2D encoding method defined in T.6. These are image compression algorithms used for FAX transmission. \section t4_page_sec_1 How does it work? */ typedef int (*t4_row_read_handler_t)(void *user_data, uint8_t buf[], size_t len); typedef int (*t4_row_write_handler_t)(void *user_data, const uint8_t buf[], size_t len); /*! Supported compression modes. */ typedef enum { T4_COMPRESSION_ITU_T4_1D = 1, T4_COMPRESSION_ITU_T4_2D = 2, T4_COMPRESSION_ITU_T6 = 3 } t4_image_compression_t; /*! Supported X resolutions, in pixels per metre. */ typedef enum { T4_X_RESOLUTION_R4 = 4016, T4_X_RESOLUTION_R8 = 8031, T4_X_RESOLUTION_300 = 11811, T4_X_RESOLUTION_R16 = 16063, T4_X_RESOLUTION_600 = 23622, T4_X_RESOLUTION_800 = 31496, T4_X_RESOLUTION_1200 = 47244 } t4_image_x_resolution_t; /*! Supported Y resolutions, in pixels per metre. */ typedef enum { T4_Y_RESOLUTION_STANDARD = 3850, T4_Y_RESOLUTION_FINE = 7700, T4_Y_RESOLUTION_300 = 11811, T4_Y_RESOLUTION_SUPERFINE = 15400, /* 400 is 15748 */ T4_Y_RESOLUTION_600 = 23622, T4_Y_RESOLUTION_800 = 31496, T4_Y_RESOLUTION_1200 = 47244 } t4_image_y_resolution_t; /*! Exact widths in PELs for the difference resolutions, and page widths. Note: The A4 widths also apply to North American letter and legal. The R4 resolution widths are not supported in recent versions of T.30 Only images of exactly these widths are acceptable for FAX transmisson. R4 864 pels/215mm for ISO A4, North American Letter and Legal R4 1024 pels/255mm for ISO B4 R4 1216 pels/303mm for ISO A3 R8 1728 pels/215mm for ISO A4, North American Letter and Legal R8 2048 pels/255mm for ISO B4 R8 2432 pels/303mm for ISO A3 R16 3456 pels/215mm for ISO A4, North American Letter and Legal R16 4096 pels/255mm for ISO B4 R16 4864 pels/303mm for ISO A3 */ typedef enum { T4_WIDTH_R4_A4 = 864, T4_WIDTH_R4_B4 = 1024, T4_WIDTH_R4_A3 = 1216, T4_WIDTH_R8_A4 = 1728, T4_WIDTH_R8_B4 = 2048, T4_WIDTH_R8_A3 = 2432, T4_WIDTH_300_A4 = 2592, T4_WIDTH_300_B4 = 3072, T4_WIDTH_300_A3 = 3648, T4_WIDTH_R16_A4 = 3456, T4_WIDTH_R16_B4 = 4096, T4_WIDTH_R16_A3 = 4864, T4_WIDTH_600_A4 = 5184, T4_WIDTH_600_B4 = 6144, T4_WIDTH_600_A3 = 7296, T4_WIDTH_1200_A4 = 10368, T4_WIDTH_1200_B4 = 12288, T4_WIDTH_1200_A3 = 14592 } t4_image_width_t; /*! Length of the various supported paper sizes, in pixels at the various Y resolutions. Paper sizes are A4 (215mm x 297mm) B4 (255mm x 364mm) A3 (303mm x 418.56mm) North American Letter (215.9mm x 279.4mm) North American Legal (215.9mm x 355.6mm) Unlimited T.4 does not accurately define the maximum number of scan lines in a page. A wide variety of maximum row counts are used in the real world. It is important not to set our sending limit too high, or a receiving machine might split pages. It is important not to set it too low, or we might clip pages. Values seen for standard resolution A4 pages include 1037, 1045, 1109, 1126 and 1143. 1109 seems the most-popular. At fine res 2150, 2196, 2200, 2237, 2252-2262, 2264, 2286, and 2394 are used. 2255 seems the most popular. We try to use balanced choices here. */ typedef enum { /* A4 is 297mm long */ T4_LENGTH_STANDARD_A4 = 1143, T4_LENGTH_FINE_A4 = 2286, T4_LENGTH_300_A4 = 4665, T4_LENGTH_SUPERFINE_A4 = 4573, T4_LENGTH_600_A4 = 6998, T4_LENGTH_800_A4 = 9330, T4_LENGTH_1200_A4 = 13996, /* B4 is 364mm long */ T4_LENGTH_STANDARD_B4 = 1401, T4_LENGTH_FINE_B4 = 2802, T4_LENGTH_300_B4 = 0, T4_LENGTH_SUPERFINE_B4 = 5605, T4_LENGTH_600_B4 = 0, T4_LENGTH_800_B4 = 0, T4_LENGTH_1200_B4 = 0, /* North American letter is 279.4mm long */ T4_LENGTH_STANDARD_US_LETTER = 1075, T4_LENGTH_FINE_US_LETTER = 2151, T4_LENGTH_300_US_LETTER = 0, T4_LENGTH_SUPERFINE_US_LETTER = 4302, T4_LENGTH_600_US_LETTER = 0, T4_LENGTH_800_US_LETTER = 0, T4_LENGTH_1200_US_LETTER = 0, /* North American legal is 355.6mm long */ T4_LENGTH_STANDARD_US_LEGAL = 1369, T4_LENGTH_FINE_US_LEGAL = 2738, T4_LENGTH_300_US_LEGAL = 0, T4_LENGTH_SUPERFINE_US_LEGAL = 5476, T4_LENGTH_600_US_LEGAL = 0, T4_LENGTH_800_US_LEGAL = 0, T4_LENGTH_1200_US_LEGAL = 0 } t4_image_length_t; /*! T.4 FAX compression/decompression descriptor. This defines the working state for a single instance of a T.4 FAX compression or decompression channel. */ typedef struct { /*! \brief The same structure is used for T.4 transmit and receive. This variable records which mode is in progress. */ int rx; /* "Background" information about the FAX, which can be stored in a TIFF file. */ /*! \brief The vendor of the machine which produced the TIFF file. */ const char *vendor; /*! \brief The model of machine which produced the TIFF file. */ const char *model; /*! \brief The local ident string. */ const char *local_ident; /*! \brief The remote end's ident string. */ const char *far_ident; /*! \brief The FAX sub-address. */ const char *sub_address; /*! \brief The FAX DCS information, as an ASCII string. */ const char *dcs; /*! \brief The text which will be used in FAX page header. No text results in no header line. */ const char *header_info; /*! \brief The type of compression used between the FAX machines. */ int line_encoding; /*! \brief The minimum number of encoded bits per row. This is a timing thing for hardware FAX machines. */ int min_bits_per_row; /*! \brief The compression type for output to the TIFF file. */ int output_compression; /*! \brief The TIFF G3 FAX options. */ int output_t4_options; /*! \brief Callback function to read a row of pixels from the image source. */ t4_row_read_handler_t row_read_handler; /*! \brief Opaque pointer passed to row_read_handler. */ void *row_read_user_data; /*! \brief Callback function to write a row of pixels to the image destination. */ t4_row_write_handler_t row_write_handler; /*! \brief Opaque pointer passed to row_write_handler. */ void *row_write_user_data; /*! \brief The time at which handling of the current page began. */ time_t page_start_time; /*! \brief The current number of bytes per row of uncompressed image data. */ int bytes_per_row; /*! \brief The size of the image in the image buffer, in bytes. */ int image_size; /*! \brief The size of the compressed image on the line side, in bits. */ int line_image_size; /*! \brief The current size of the image buffer. */ int image_buffer_size; /*! \brief A point to the image buffer. */ uint8_t *image_buffer; /*! \brief The libtiff context for the current TIFF file */ TIFF *tiff_file; /*! \brief The current file name. */ const char *file; /*! \brief The first page to transfer. -1 to start at the beginning of the file. */ int start_page; /*! \brief The last page to transfer. -1 to continue to the end of the file. */ int stop_page; /*! \brief The number of pages transferred to date. */ int pages_transferred; /*! \brief The number of pages in the current TIFF file. */ int pages_in_file; /*! \brief Column-to-column (X) resolution in pixels per metre. */ int x_resolution; /*! \brief Row-to-row (Y) resolution in pixels per metre. */ int y_resolution; /*! \brief Width of the current page, in pixels. */ int image_width; /*! \brief Length of the current page, in pixels. */ int image_length; /*! \brief Current pixel row number. */ int row; /*! \brief The current number of consecutive bad rows. */ int curr_bad_row_run; /*! \brief The longest run of consecutive bad rows seen in the current page. */ int longest_bad_row_run; /*! \brief The total number of bad rows in the current page. */ int bad_rows; /*! \brief Incoming bit buffer for decompression. */ uint32_t rx_bitstream; /*! \brief The number of bits currently in rx_bitstream. */ int rx_bits; /*! \brief The number of bits to be skipped before trying to match the next code word. */ int rx_skip_bits; /*! \brief This variable is set if we are treating the current row as a 2D encoded one. */ int row_is_2d; /*! \brief TRUE if the current run is black */ int its_black; /*! \brief The current length of the current row. */ int row_len; /*! \brief This variable is used to count the consecutive EOLS we have seen. If it reaches six, this is the end of the image. It is initially set to -1 for 1D and 2D decoding, as an indicator that we must wait for the first EOL, before decodin any image data. */ int consecutive_eols; /*! \brief Black and white run-lengths for the current row. */ uint32_t *cur_runs; /*! \brief Black and white run-lengths for the reference row. */ uint32_t *ref_runs; /*! \brief The number of runs currently in the reference row. */ int ref_steps; /*! \brief The current step into the reference row run-lengths buffer. */ int b_cursor; /*! \brief The current step into the current row run-lengths buffer. */ int a_cursor; /*! \brief The reference or starting changing element on the coding line. At the start of the coding line, a0 is set on an imaginary white changing element situated just before the first element on the line. During the coding of the coding line, the position of a0 is defined by the previous coding mode. (See 4.2.1.3.2.). */ int a0; /*! \brief The first changing element on the reference line to the right of a0 and of opposite colour to a0. */ int b1; /*! \brief The length of the in-progress run of black or white. */ int run_length; /*! \brief 2D horizontal mode control. */ int black_white; /*! \brief Encoded data bits buffer. */ uint32_t tx_bitstream; /*! \brief The number of bits currently in tx_bitstream. */ int tx_bits; /*! \brief A pointer into the image buffer indicating where the last row begins */ int last_row_starts_at; /*! \brief A pointer into the image buffer indicating where the current row begins */ int row_starts_at; /*! \brief Pointer to the buffer for the current pixel row. */ uint8_t *row_buf; /*! \brief Pointer to the byte containing the next image bit to transmit. */ int bit_pos; /*! \brief Pointer to the bit within the byte containing the next image bit to transmit. */ int bit_ptr; /*! \brief The current maximum contiguous rows that may be 2D encoded. */ int max_rows_to_next_1d_row; /*! \brief Number of rows left that can be 2D encoded, before a 1D encoded row must be used. */ int rows_to_next_1d_row; /*! \brief The current number of bits in the current encoded row. */ int row_bits; /*! \brief The minimum bits in any row of the current page. For monitoring only. */ int min_row_bits; /*! \brief The maximum bits in any row of the current page. For monitoring only. */ int max_row_bits; /*! \brief Error and flow logging control */ logging_state_t logging; } t4_state_t; /*! T.4 FAX compression/decompression statistics. */ typedef struct { /*! \brief The number of pages transferred so far. */ int pages_transferred; /*! \brief The number of pages in the file (<0 if unknown). */ int pages_in_file; /*! \brief The number of horizontal pixels in the most recent page. */ int width; /*! \brief The number of vertical pixels in the most recent page. */ int length; /*! \brief The number of bad pixel rows in the most recent page. */ int bad_rows; /*! \brief The largest number of bad pixel rows in a block in the most recent page. */ int longest_bad_row_run; /*! \brief The horizontal resolution of the page in pixels per metre */ int x_resolution; /*! \brief The vertical resolution of the page in pixels per metre */ int y_resolution; /*! \brief The type of compression used between the FAX machines */ int encoding; /*! \brief The size of the image on the line, in bytes */ int line_image_size; } t4_stats_t; #if defined(__cplusplus) extern "C" { #endif /*! \brief Prepare for reception of a document. \param s The T.4 context. \param file The name of the file to be received. \param output_encoding The output encoding. \return A pointer to the context, or NULL if there was a problem. */ t4_state_t *t4_rx_init(t4_state_t *s, const char *file, int output_encoding); /*! \brief Prepare to receive the next page of the current document. \param s The T.4 context. \return zero for success, -1 for failure. */ int t4_rx_start_page(t4_state_t *s); /*! \brief Put a bit of the current document page. \param s The T.4 context. \param bit The data bit. \return TRUE when the bit ends the document page, otherwise FALSE. */ int t4_rx_put_bit(t4_state_t *s, int bit); /*! \brief Put a byte of the current document page. \param s The T.4 context. \param byte The data byte. \return TRUE when the byte ends the document page, otherwise FALSE. */ int t4_rx_put_byte(t4_state_t *s, uint8_t byte); /*! \brief Put a byte of the current document page. \param s The T.4 context. \param buf The buffer containing the chunk. \param len The length of the chunk. \return TRUE when the byte ends the document page, otherwise FALSE. */ int t4_rx_put_chunk(t4_state_t *s, const uint8_t buf[], int len); /*! \brief Complete the reception of a page. \param s The T.4 receive context. \return 0 for success, otherwise -1. */ int t4_rx_end_page(t4_state_t *s); /*! \brief End reception of a document. Tidy up, close the file and free the context. This should be used to end T.4 reception started with t4_rx_init. \param s The T.4 receive context. \return 0 for success, otherwise -1. */ int t4_rx_delete(t4_state_t *s); /*! \brief End reception of a document. Tidy up and close the file. This should be used to end T.4 reception started with t4_rx_init. \param s The T.4 context. \return 0 for success, otherwise -1. */ int t4_rx_end(t4_state_t *s); int t4_rx_set_row_write_handler(t4_state_t *s, t4_row_write_handler_t handler, void *user_data); /*! \brief Set the encoding for the received data. \param s The T.4 context. \param encoding The encoding. */ void t4_rx_set_rx_encoding(t4_state_t *s, int encoding); /*! \brief Set the expected width of the received image, in pixel columns. \param s The T.4 context. \param width The number of pixels across the image. */ void t4_rx_set_image_width(t4_state_t *s, int width); /*! \brief Set the row-to-row (y) resolution to expect for a received image. \param s The T.4 context. \param resolution The resolution, in pixels per metre. */ void t4_rx_set_y_resolution(t4_state_t *s, int resolution); /*! \brief Set the column-to-column (x) resolution to expect for a received image. \param s The T.4 context. \param resolution The resolution, in pixels per metre. */ void t4_rx_set_x_resolution(t4_state_t *s, int resolution); /*! \brief Set the DCS information of the fax, for inclusion in the file. \param s The T.4 context. \param dcs The DCS information, formatted as an ASCII string. */ void t4_rx_set_dcs(t4_state_t *s, const char *dcs); /*! \brief Set the sub-address of the fax, for inclusion in the file. \param s The T.4 context. \param sub_address The sub-address string. */ void t4_rx_set_sub_address(t4_state_t *s, const char *sub_address); /*! \brief Set the identity of the remote machine, for inclusion in the file. \param s The T.4 context. \param ident The identity string. */ void t4_rx_set_far_ident(t4_state_t *s, const char *ident); /*! \brief Set the vendor of the remote machine, for inclusion in the file. \param s The T.4 context. \param vendor The vendor string, or NULL. */ void t4_rx_set_vendor(t4_state_t *s, const char *vendor); /*! \brief Set the model of the remote machine, for inclusion in the file. \param s The T.4 context. \param model The model string, or NULL. */ void t4_rx_set_model(t4_state_t *s, const char *model); /*! \brief Prepare for transmission of a document. \param s The T.4 context. \param file The name of the file to be sent. \param start_page The first page to send. -1 for no restriction. \param stop_page The last page to send. -1 for no restriction. \return A pointer to the context, or NULL if there was a problem. */ t4_state_t *t4_tx_init(t4_state_t *s, const char *file, int start_page, int stop_page); /*! \brief Prepare to send the next page of the current document. \param s The T.4 context. \return zero for success, -1 for failure. */ int t4_tx_start_page(t4_state_t *s); /*! \brief Prepare the current page for a resend. \param s The T.4 context. \return zero for success, -1 for failure. */ int t4_tx_restart_page(t4_state_t *s); /*! \brief Check for the existance of the next page. This information can be needed before it is determined that the current page is finished with. \param s The T.4 context. \return zero for next page found, -1 for failure. */ int t4_tx_more_pages(t4_state_t *s); /*! \brief Complete the sending of a page. \param s The T.4 context. \return zero for success, -1 for failure. */ int t4_tx_end_page(t4_state_t *s); /*! \brief Get the next bit of the current document page. The document will be padded for the current minimum scan line time. If the file does not contain an RTC (return to control) code at the end of the page, one will be added where appropriate. \param s The T.4 context. \return The next bit (i.e. 0 or 1). For the last bit of data, bit 1 is set (i.e. the returned value is 2 or 3). */ int t4_tx_get_bit(t4_state_t *s); /*! \brief Get the next byte of the current document page. The document will be padded for the current minimum scan line time. If the file does not contain an RTC (return to control) code at the end of the page, one will be added where appropriate. \param s The T.4 context. \return The next byte. For the last byte of data, bit 8 is set. In this case, one or more bits of the byte may be padded with zeros, to complete the byte. */ int t4_tx_get_byte(t4_state_t *s); /*! \brief Get the next chunk of the current document page. The document will be padded for the current minimum scan line time. If the file does not contain an RTC (return to control) code at the end of the page, one will be added where appropriate. \param s The T.4 context. \param buf The buffer into which the chunk is to written. \param max_len The maximum length of the chunk. \return The actual length of the chunk. If this is less than max_len it indicates that the end of the document has been reached. */ int t4_tx_get_chunk(t4_state_t *s, uint8_t buf[], int max_len); /*! \brief Return the next bit of the current document page, without actually moving forward in the buffer. The document will be padded for the current minimum scan line time. If the file does not contain an RTC (return to control) code at the end of the page, one will be added. \param s The T.4 context. \return The next bit (i.e. 0 or 1). For the last bit of data, bit 1 is set (i.e. the returned value is 2 or 3). */ int t4_tx_check_bit(t4_state_t *s); /*! \brief End the transmission of a document. Tidy up, close the file and free the context. This should be used to end T.4 transmission started with t4_tx_init. \param s The T.4 context. \return 0 for success, otherwise -1. */ int t4_tx_delete(t4_state_t *s); /*! \brief End the transmission of a document. Tidy up and close the file. This should be used to end T.4 transmission started with t4_tx_init. \param s The T.4 context. \return 0 for success, otherwise -1. */ int t4_tx_end(t4_state_t *s); /*! \brief Set the encoding for the encoded data. \param s The T.4 context. \param encoding The encoding. */ void t4_tx_set_tx_encoding(t4_state_t *s, int encoding); /*! \brief Set the minimum number of encoded bits per row. This allows the makes the encoding process to be set to comply with the minimum row time specified by a remote receiving machine. \param s The T.4 context. \param bits The minimum number of bits per row. */ void t4_tx_set_min_row_bits(t4_state_t *s, int bits); /*! \brief Set the identity of the local machine, for inclusion in page headers. \param s The T.4 context. \param ident The identity string. */ void t4_tx_set_local_ident(t4_state_t *s, const char *ident); /*! Set the info field, included in the header line included in each page of an encoded FAX. This is a string of up to 50 characters. Other information (date, local ident, etc.) are automatically included in the header. If the header info is set to NULL or a zero length string, no header lines will be added to the encoded FAX. \brief Set the header info. \param s The T.4 context. \param info A string, of up to 50 bytes, which will form the info field. */ void t4_tx_set_header_info(t4_state_t *s, const char *info); int t4_tx_set_row_read_handler(t4_state_t *s, t4_row_read_handler_t handler, void *user_data); /*! \brief Get the row-to-row (y) resolution of the current page. \param s The T.4 context. \return The resolution, in pixels per metre. */ int t4_tx_get_y_resolution(t4_state_t *s); /*! \brief Get the column-to-column (x) resolution of the current page. \param s The T.4 context. \return The resolution, in pixels per metre. */ int t4_tx_get_x_resolution(t4_state_t *s); /*! \brief Get the width of the current page, in pixel columns. \param s The T.4 context. \return The number of columns. */ int t4_tx_get_image_width(t4_state_t *s); /*! \brief Get the number of pages in the file. \param s The T.4 context. \return The number of pages, or -1 if there is an error. */ int t4_tx_get_pages_in_file(t4_state_t *s); /*! Get the current image transfer statistics. \brief Get the current transfer statistics. \param s The T.4 context. \param t A pointer to a statistics structure. */ void t4_get_transfer_statistics(t4_state_t *s, t4_stats_t *t); /*! Get the short text name of an encoding format. \brief Get the short text name of an encoding format. \param encoding The encoding type. \return A pointer to the string. */ const char *t4_encoding_to_str(int encoding); #if defined(__cplusplus) } #endif #endif /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/spandsp/fsk.h0000644000175000017500000002426711150047205020272 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * fsk.h - FSK modem transmit and receive parts * * Written by Steve Underwood * * Copyright (C) 2003 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: fsk.h,v 1.30 2008/07/16 14:23:48 steveu Exp $ */ /*! \file */ /*! \page fsk_page FSK modems \section fsk_page_sec_1 What does it do? Most of the oldest telephony modems use incoherent FSK modulation. This module can be used to implement both the transmit and receive sides of a number of these modems. There are integrated definitions for: - V.21 - V.23 - Bell 103 - Bell 202 - Weitbrecht (Used for TDD - Telecoms Device for the Deaf) The audio output or input is a stream of 16 bit samples, at 8000 samples/second. The transmit and receive sides can be used independantly. \section fsk_page_sec_2 The transmitter The FSK transmitter uses a DDS generator to synthesise the waveform. This naturally produces phase coherent transitions, as the phase update rate is switched, producing a clean spectrum. The symbols are not generally an integer number of samples long. However, the symbol time for the fastest data rate generally used (1200bps) is more than 7 samples long. The jitter resulting from switching at the nearest sample is, therefore, acceptable. No interpolation is used. \section fsk_page_sec_3 The receiver The FSK receiver uses a quadrature correlation technique to demodulate the signal. Two DDS quadrature oscillators are used. The incoming signal is correlated with the oscillator signals over a period of one symbol. The oscillator giving the highest net correlation from its I and Q outputs is the one that matches the frequency being transmitted during the correlation interval. Because the transmission is totally asynchronous, the demodulation process must run sample by sample to find the symbol transitions. The correlation is performed on a sliding window basis, so the computational load of demodulating sample by sample is not great. Two modes of symbol synchronisation are provided: - In synchronous mode, symbol transitions are smoothed, to track their true position in the prescence of high timing jitter. This provides the most reliable symbol recovery in poor signal to noise conditions. However, it takes a little time to settle, so it not really suitable for data streams which must start up instantaneously (e.g. the TDD systems used by hearing impaired people). - In asynchronous mode each transition is taken at face value, with no temporal smoothing. There is no settling time for this mode, but when the signal to noise ratio is very poor it does not perform as well as the synchronous mode. */ #if !defined(_SPANDSP_FSK_H_) #define _SPANDSP_FSK_H_ /*! FSK modem specification. This defines the frequencies, signal levels and baud rate (== bit rate for simple FSK) for a single channel of an FSK modem. */ typedef struct { /*! Short text name for the modem. */ const char *name; /*! The frequency of the zero bit state, in Hz */ int freq_zero; /*! The frequency of the one bit state, in Hz */ int freq_one; /*! The transmit power level, in dBm0 */ int tx_level; /*! The minimum acceptable receive power level, in dBm0 */ int min_level; /*! The bit rate of the modem, in units of 1/100th bps */ int baud_rate; } fsk_spec_t; /* Predefined FSK modem channels */ enum { FSK_V21CH1 = 0, FSK_V21CH2, FSK_V23CH1, FSK_V23CH2, FSK_BELL103CH1, FSK_BELL103CH2, FSK_BELL202, FSK_WEITBRECHT, /* Used for TDD (Telecom Device for the Deaf) */ }; extern const fsk_spec_t preset_fsk_specs[]; /*! FSK modem transmit descriptor. This defines the state of a single working instance of an FSK modem transmitter. */ typedef struct { int baud_rate; /*! \brief The callback function used to get the next bit to be transmitted. */ get_bit_func_t get_bit; /*! \brief A user specified opaque pointer passed to the get_bit function. */ void *get_bit_user_data; /*! \brief The callback function used to report modem status changes. */ modem_tx_status_func_t status_handler; /*! \brief A user specified opaque pointer passed to the status function. */ void *status_user_data; int32_t phase_rates[2]; int scaling; int32_t current_phase_rate; uint32_t phase_acc; int baud_frac; int baud_inc; int shutdown; } fsk_tx_state_t; /* The longest window will probably be 106 for 75 baud */ #define FSK_MAX_WINDOW_LEN 128 /*! FSK modem receive descriptor. This defines the state of a single working instance of an FSK modem receiver. */ typedef struct { int baud_rate; int sync_mode; /*! \brief The callback function used to put each bit received. */ put_bit_func_t put_bit; /*! \brief A user specified opaque pointer passed to the put_bit routine. */ void *put_bit_user_data; /*! \brief The callback function used to report modem status changes. */ modem_tx_status_func_t status_handler; /*! \brief A user specified opaque pointer passed to the status function. */ void *status_user_data; int32_t carrier_on_power; int32_t carrier_off_power; power_meter_t power; /*! \brief The value of the last signal sample, using the a simple HPF for signal power estimation. */ int16_t last_sample; /*! \brief >0 if a signal above the minimum is present. It may or may not be a V.29 signal. */ int signal_present; int32_t phase_rate[2]; uint32_t phase_acc[2]; int correlation_span; complexi32_t window[2][FSK_MAX_WINDOW_LEN]; complexi32_t dot[2]; int buf_ptr; int baud_inc; int baud_pll; int lastbit; int scaling_shift; } fsk_rx_state_t; #if defined(__cplusplus) extern "C" { #endif /*! Initialise an FSK modem transmit context. \brief Initialise an FSK modem transmit context. \param s The modem context. \param spec The specification of the modem tones and rate. \param get_bit The callback routine used to get the data to be transmitted. \param user_data An opaque pointer. \return A pointer to the modem context, or NULL if there was a problem. */ fsk_tx_state_t *fsk_tx_init(fsk_tx_state_t *s, const fsk_spec_t *spec, get_bit_func_t get_bit, void *user_data); /*! Adjust an FSK modem transmit context's power output. \brief Adjust an FSK modem transmit context's power output. \param s The modem context. \param power The power level, in dBm0 */ void fsk_tx_power(fsk_tx_state_t *s, float power); void fsk_tx_set_get_bit(fsk_tx_state_t *s, get_bit_func_t get_bit, void *user_data); /*! Change the modem status report function associated with an FSK modem transmit context. \brief Change the modem status report function associated with an FSK modem transmit context. \param s The modem context. \param handler The callback routine used to report modem status changes. \param user_data An opaque pointer. */ void fsk_tx_set_modem_status_handler(fsk_tx_state_t *s, modem_tx_status_func_t handler, void *user_data); /*! Generate a block of FSK modem audio samples. \brief Generate a block of FSK modem audio samples. \param s The modem context. \param amp The audio sample buffer. \param len The number of samples to be generated. \return The number of samples actually generated. */ int fsk_tx(fsk_tx_state_t *s, int16_t *amp, int len); /*! Get the current received signal power. \param s The modem context. \return The signal power, in dBm0. */ float fsk_rx_signal_power(fsk_rx_state_t *s); /*! Adjust an FSK modem receive context's carrier detect power threshold. \brief Adjust an FSK modem receive context's carrier detect power threshold. \param s The modem context. \param cutoff The power level, in dBm0 */ void fsk_rx_signal_cutoff(fsk_rx_state_t *s, float cutoff); /*! Initialise an FSK modem receive context. \brief Initialise an FSK modem receive context. \param s The modem context. \param spec The specification of the modem tones and rate. \param sync_mode TRUE for synchronous modem. FALSE for asynchronous mode. \param put_bit The callback routine used to put the received data. \param user_data An opaque pointer. \return A pointer to the modem context, or NULL if there was a problem. */ fsk_rx_state_t *fsk_rx_init(fsk_rx_state_t *s, const fsk_spec_t *spec, int sync_mode, put_bit_func_t put_bit, void *user_data); /*! Process a block of received FSK modem audio samples. \brief Process a block of received FSK modem audio samples. \param s The modem context. \param amp The audio sample buffer. \param len The number of samples in the buffer. \return The number of samples unprocessed. */ int fsk_rx(fsk_rx_state_t *s, const int16_t *amp, int len); void fsk_rx_set_put_bit(fsk_rx_state_t *s, put_bit_func_t put_bit, void *user_data); /*! Change the modem status report function associated with an FSK modem receive context. \brief Change the modem status report function associated with an FSK modem receive context. \param s The modem context. \param handler The callback routine used to report modem status changes. \param user_data An opaque pointer. */ void fsk_rx_set_modem_status_handler(fsk_rx_state_t *s, modem_rx_status_func_t handler, void *user_data); #if defined(__cplusplus) } #endif #endif /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/spandsp/tone_generate.h0000644000175000017500000000723411150047205022321 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * tone_generate.h - General telephony tone generation. * * Written by Steve Underwood * * Copyright (C) 2001 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: tone_generate.h,v 1.33 2008/04/17 14:27:01 steveu Exp $ */ /*! \file */ #if !defined(_SPANDSP_TONE_GENERATE_H_) #define _SPANDSP_TONE_GENERATE_H_ /*! \page tone_generation_page Tone generation \section tone_generation_page_sec_1 What does it do? The tone generation module provides for the generation of cadenced tones, suitable for a wide range of telephony applications. \section tone_generation_page_sec_2 How does it work? Oscillators are a problem. They oscillate due to instability, and yet we need them to behave in a stable manner. A look around the web will reveal many papers on this subject. Many describe rather complex solutions to the problem. However, we are only concerned with telephony applications. It is possible to generate the tones we need with a very simple efficient scheme. It is also practical to use an exhaustive test to prove the oscillator is stable under all the conditions in which we will use it. */ typedef struct { int32_t phase_rate; float gain; } tone_gen_tone_descriptor_t; /*! Cadenced dual tone generator descriptor. */ typedef struct { tone_gen_tone_descriptor_t tone[4]; int duration[4]; int repeat; } tone_gen_descriptor_t; /*! Cadenced dual tone generator state descriptor. This defines the state of a single working instance of a generator. */ typedef struct { tone_gen_tone_descriptor_t tone[4]; uint32_t phase[4]; int duration[4]; int repeat; int current_section; int current_position; } tone_gen_state_t; #if defined(__cplusplus) extern "C" { #endif /*! Create a tone generator descriptor \brief Create a tone generator descriptor \param s The descriptor \param f1 The first frequency, in Hz \param l1 The level of the first frequency, in dBm0 \param f2 0 for no second frequency, a positive number for the second frequency, in Hz, or a negative number for an AM modulation frequency, in Hz \param l2 The level of the second frequency, in dBm0, or the percentage modulation depth for an AM modulated tone. \param d1 x \param d2 x \param d3 x \param d4 x \param repeat x */ void make_tone_gen_descriptor(tone_gen_descriptor_t *s, int f1, int l1, int f2, int l2, int d1, int d2, int d3, int d4, int repeat); tone_gen_state_t *tone_gen_init(tone_gen_state_t *s, tone_gen_descriptor_t *t); int tone_gen(tone_gen_state_t *s, int16_t amp[], int max_samples); #if defined(__cplusplus) } #endif #endif /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/spandsp/plc.h0000644000175000017500000001673411150047205020265 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * plc.h * * Written by Steve Underwood * * Copyright (C) 2004 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: plc.h,v 1.18 2008/04/17 14:27:00 steveu Exp $ */ /*! \file */ #if !defined(_SPANDSP_PLC_H_) #define _SPANDSP_PLC_H_ /*! \page plc_page Packet loss concealment \section plc_page_sec_1 What does it do? The packet loss concealment module provides a synthetic fill-in signal, to minimise the audible effect of lost packets in VoIP applications. It is not tied to any particular codec, and could be used with almost any codec which does not specify its own procedure for packet loss concealment. Where a codec specific concealment procedure exists, that algorithm is usually built around knowledge of the characteristics of the particular codec. It will, therefore, generally give better results for that particular codec than this generic concealer will. The PLC code implements an algorithm similar to the one described in Appendix 1 of G.711. However, the G.711 algorithm is optimised for 10ms packets. Few people use such small packets. 20ms is a much more common value, and longer packets are also quite common. The algorithm has been adjusted with this in mind. Also, the G.711 approach causes an algorithmic delay, and requires significant buffer manipulation when there is no packet loss. The algorithm used here avoids this. It causes no delay, and achieves comparable quality with normal speech. Note that both this algorithm, and the one in G.711 are optimised for speech. For most kinds of music a much slower decay on bursts of lost packets give better results. \section plc_page_sec_2 How does it work? While good packets are being received, the plc_rx() routine keeps a record of the trailing section of the known speech signal. If a packet is missed, plc_fillin() is called to produce a synthetic replacement for the real speech signal. The average mean difference function (AMDF) is applied to the last known good signal, to determine its effective pitch. Based on this, the last pitch period of signal is saved. Essentially, this cycle of speech will be repeated over and over until the real speech resumes. However, several refinements are needed to obtain smooth pleasant sounding results. - The two ends of the stored cycle of speech will not always fit together smoothly. This can cause roughness, or even clicks, at the joins between cycles. To soften this, the 1/4 pitch period of real speech preceeding the cycle to be repeated is blended with the last 1/4 pitch period of the cycle to be repeated, using an overlap-add (OLA) technique (i.e. in total, the last 5/4 pitch periods of real speech are used). - The start of the synthetic speech will not always fit together smoothly with the tail of real speech passed on before the erasure was identified. Ideally, we would like to modify the last 1/4 pitch period of the real speech, to blend it into the synthetic speech. However, it is too late for that. We could have delayed the real speech a little, but that would require more buffer manipulation, and hurt the efficiency of the no-lost-packets case (which we hope is the dominant case). Instead we use a degenerate form of OLA to modify the start of the synthetic data. The last 1/4 pitch period of real speech is time reversed, and OLA is used to blend it with the first 1/4 pitch period of synthetic speech. The result seems quite acceptable. - As we progress into the erasure, the chances of the synthetic signal being anything like correct steadily fall. Therefore, the volume of the synthesized signal is made to decay linearly, such that after 50ms of missing audio it is reduced to silence. - When real speech resumes, an extra 1/4 pitch period of synthetic speech is blended with the start of the real speech. If the erasure is small, this smoothes the transition. If the erasure is long, and the synthetic signal has faded to zero, the blending softens the start up of the real signal, avoiding a kind of "click" or "pop" effect that might occur with a sudden onset. \section plc_page_sec_3 How do I use it? Before audio is processed, call plc_init() to create an instance of the packet loss concealer. For each received audio packet that is acceptable (i.e. not including those being dropped for being too late) call plc_rx() to record the content of the packet. Note this may modify the packet a little after a period of packet loss, to blend real synthetic data smoothly. When a real packet is not available in time, call plc_fillin() to create a sythetic substitute. That's it! */ /*! Minimum allowed pitch (66 Hz) */ #define PLC_PITCH_MIN 120 /*! Maximum allowed pitch (200 Hz) */ #define PLC_PITCH_MAX 40 /*! Maximum pitch OLA window */ #define PLC_PITCH_OVERLAP_MAX (PLC_PITCH_MIN >> 2) /*! The length over which the AMDF function looks for similarity (20 ms) */ #define CORRELATION_SPAN 160 /*! History buffer length. The buffer much also be at leat 1.25 times PLC_PITCH_MIN, but that is much smaller than the buffer needs to be for the pitch assessment. */ #define PLC_HISTORY_LEN (CORRELATION_SPAN + PLC_PITCH_MIN) /*! The generic packet loss concealer context. */ typedef struct { /*! Consecutive erased samples */ int missing_samples; /*! Current offset into pitch period */ int pitch_offset; /*! Pitch estimate */ int pitch; /*! Buffer for a cycle of speech */ float pitchbuf[PLC_PITCH_MIN]; /*! History buffer */ int16_t history[PLC_HISTORY_LEN]; /*! Current pointer into the history buffer */ int buf_ptr; } plc_state_t; #if defined(__cplusplus) extern "C" { #endif /*! Process a block of received audio samples for PLC. \brief Process a block of received audio samples for PLC. \param s The packet loss concealer context. \param amp The audio sample buffer. \param len The number of samples in the buffer. \return The number of samples in the buffer. */ int plc_rx(plc_state_t *s, int16_t amp[], int len); /*! Fill-in a block of missing audio samples. \brief Fill-in a block of missing audio samples. \param s The packet loss concealer context. \param amp The audio sample buffer. \param len The number of samples to be synthesised. \return The number of samples synthesized. */ int plc_fillin(plc_state_t *s, int16_t amp[], int len); /*! Initialise a packet loss concealer context. \brief Initialise a PLC context. \param s The packet loss concealer context. \return A pointer to the the packet loss concealer context. */ plc_state_t *plc_init(plc_state_t *s); /*! Free a packet loss concealer context. \param s The packet loss concealer context. \return 0 for OK. */ int plc_free(plc_state_t *s); #if defined(__cplusplus) } #endif #endif /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/spandsp/bit_operations.h0000644000175000017500000001676111150047205022530 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * bit_operations.h - Various bit level operations, such as bit reversal * * Written by Steve Underwood * * Copyright (C) 2006 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: bit_operations.h,v 1.22 2008/07/10 13:43:40 steveu Exp $ */ /*! \file */ #if !defined(_SPANDSP_BIT_OPERATIONS_H_) #define _SPANDSP_BIT_OPERATIONS_H_ #if defined(__cplusplus) extern "C" { #endif /*! \brief Find the bit position of the highest set bit in a word \param bits The word to be searched \return The bit number of the highest set bit, or -1 if the word is zero. */ static __inline__ int top_bit(unsigned int bits) { int res; #if defined(__i386__) || defined(__x86_64__) __asm__ (" xorl %[res],%[res];\n" " decl %[res];\n" " bsrl %[bits],%[res]\n" : [res] "=&r" (res) : [bits] "rm" (bits)); return res; #elif defined(__ppc__) || defined(__powerpc__) __asm__ ("cntlzw %[res],%[bits];\n" : [res] "=&r" (res) : [bits] "r" (bits)); return 31 - res; #else if (bits == 0) return -1; res = 0; if (bits & 0xFFFF0000) { bits &= 0xFFFF0000; res += 16; } if (bits & 0xFF00FF00) { bits &= 0xFF00FF00; res += 8; } if (bits & 0xF0F0F0F0) { bits &= 0xF0F0F0F0; res += 4; } if (bits & 0xCCCCCCCC) { bits &= 0xCCCCCCCC; res += 2; } if (bits & 0xAAAAAAAA) { bits &= 0xAAAAAAAA; res += 1; } return res; #endif } /*- End of function --------------------------------------------------------*/ /*! \brief Find the bit position of the lowest set bit in a word \param bits The word to be searched \return The bit number of the lowest set bit, or -1 if the word is zero. */ static __inline__ int bottom_bit(unsigned int bits) { int res; #if defined(__i386__) || defined(__x86_64__) __asm__ (" xorl %[res],%[res];\n" " decl %[res];\n" " bsfl %[bits],%[res]\n" : [res] "=&r" (res) : [bits] "rm" (bits)); return res; #else if (bits == 0) return -1; res = 31; if (bits & 0x0000FFFF) { bits &= 0x0000FFFF; res -= 16; } if (bits & 0x00FF00FF) { bits &= 0x00FF00FF; res -= 8; } if (bits & 0x0F0F0F0F) { bits &= 0x0F0F0F0F; res -= 4; } if (bits & 0x33333333) { bits &= 0x33333333; res -= 2; } if (bits & 0x55555555) { bits &= 0x55555555; res -= 1; } return res; #endif } /*- End of function --------------------------------------------------------*/ /*! \brief Bit reverse a byte. \param data The byte to be reversed. \return The bit reversed version of data. */ static __inline__ uint8_t bit_reverse8(uint8_t x) { #if defined(__i386__) || defined(__x86_64__) || defined(__ppc__) || defined(__powerpc__) /* If multiply is fast */ return ((x*0x0802U & 0x22110U) | (x*0x8020U & 0x88440U))*0x10101U >> 16; #else /* If multiply is slow, but we have a barrel shifter */ x = (x >> 4) | (x << 4); x = ((x & 0xCC) >> 2) | ((x & 0x33) << 2); return ((x & 0xAA) >> 1) | ((x & 0x55) << 1); #endif } /*- End of function --------------------------------------------------------*/ /*! \brief Bit reverse a 16 bit word. \param data The word to be reversed. \return The bit reversed version of data. */ uint16_t bit_reverse16(uint16_t data); /*! \brief Bit reverse a 32 bit word. \param data The word to be reversed. \return The bit reversed version of data. */ uint32_t bit_reverse32(uint32_t data); /*! \brief Bit reverse each of the four bytes in a 32 bit word. \param data The word to be reversed. \return The bit reversed version of data. */ uint32_t bit_reverse_4bytes(uint32_t data); #if defined(__x86_64__) /*! \brief Bit reverse each of the eight bytes in a 64 bit word. \param data The word to be reversed. \return The bit reversed version of data. */ uint64_t bit_reverse_8bytes(uint64_t data); #endif /*! \brief Bit reverse each bytes in a buffer. \param to The buffer to place the reversed data in. \param from The buffer containing the data to be reversed. \param len The length of the data in the buffer. */ void bit_reverse(uint8_t to[], const uint8_t from[], int len); /*! \brief Find the number of set bits in a 32 bit word. \param x The word to be searched. \return The number of set bits. */ int one_bits32(uint32_t x); /*! \brief Create a mask as wide as the number in a 32 bit word. \param x The word to be searched. \return The mask. */ uint32_t make_mask32(uint32_t x); /*! \brief Create a mask as wide as the number in a 16 bit word. \param x The word to be searched. \return The mask. */ uint16_t make_mask16(uint16_t x); /*! \brief Find the least significant one in a word, and return a word with just that bit set. \param x The word to be searched. \return The word with the single set bit. */ static __inline__ uint32_t least_significant_one32(uint32_t x) { return (x & (-(int32_t) x)); } /*- End of function --------------------------------------------------------*/ /*! \brief Find the most significant one in a word, and return a word with just that bit set. \param x The word to be searched. \return The word with the single set bit. */ static __inline__ uint32_t most_significant_one32(uint32_t x) { #if defined(__i386__) || defined(__x86_64__) || defined(__ppc__) || defined(__powerpc__) return 1 << top_bit(x); #else x = make_mask32(x); return (x ^ (x >> 1)); #endif } /*- End of function --------------------------------------------------------*/ /*! \brief Find the parity of a byte. \param x The byte to be checked. \return 1 for odd, or 0 for even. */ static __inline__ int parity8(uint8_t x) { x = (x ^ (x >> 4)) & 0x0F; return (0x6996 >> x) & 1; } /*- End of function --------------------------------------------------------*/ /*! \brief Find the parity of a 16 bit word. \param x The word to be checked. \return 1 for odd, or 0 for even. */ static __inline__ int parity16(uint16_t x) { x ^= (x >> 8); x = (x ^ (x >> 4)) & 0x0F; return (0x6996 >> x) & 1; } /*- End of function --------------------------------------------------------*/ /*! \brief Find the parity of a 32 bit word. \param x The word to be checked. \return 1 for odd, or 0 for even. */ static __inline__ int parity32(uint32_t x) { x ^= (x >> 16); x ^= (x >> 8); x = (x ^ (x >> 4)) & 0x0F; return (0x6996 >> x) & 1; } /*- End of function --------------------------------------------------------*/ #if defined(__cplusplus) } #endif #endif /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/spandsp/v27ter_rx.h0000644000175000017500000002752311150047205021347 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * v27ter_rx.h - ITU V.27ter modem receive part * * Written by Steve Underwood * * Copyright (C) 2003 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: v27ter_rx.h,v 1.47 2008/07/16 14:23:48 steveu Exp $ */ /*! \file */ #if !defined(_V27TER_RX_H_) #define _V27TER_RX_H_ /*! \page v27ter_rx_page The V.27ter receiver \section v27ter_rx_page_sec_1 What does it do? The V.27ter receiver implements the receive side of a V.27ter modem. This can operate at data rates of 4800 and 2400 bits/s. The audio input is a stream of 16 bit samples, at 8000 samples/second. The transmit and receive side of V.27ter modems operate independantly. V.27ter is mostly used for FAX transmission, where it provides the standard 4800 bits/s rate (the 2400 bits/s mode is not used for FAX). \section v27ter_rx_page_sec_2 How does it work? V.27ter defines two modes of operation. One uses 8-PSK at 1600 baud, giving 4800bps. The other uses 4-PSK at 1200 baud, giving 2400bps. A training sequence is specified at the start of transmission, which makes the design of a V.27ter receiver relatively straightforward. */ /* Target length for the equalizer is about 43 taps for 4800bps and 32 taps for 2400bps to deal with the worst stuff in V.56bis. */ #define V27TER_EQUALIZER_PRE_LEN 15 /* this much before the real event */ #define V27TER_EQUALIZER_POST_LEN 15 /* this much after the real event */ #define V27TER_EQUALIZER_MASK 63 /* one less than a power of 2 >= (V27TER_EQUALIZER_PRE_LEN + 1 + V27TER_EQUALIZER_POST_LEN) */ #define V27TER_RX_4800_FILTER_STEPS 27 #define V27TER_RX_2400_FILTER_STEPS 27 #if V27TER_RX_4800_FILTER_STEPS > V27TER_RX_2400_FILTER_STEPS #define V27TER_RX_FILTER_STEPS V27TER_RX_4800_FILTER_STEPS #else #define V27TER_RX_FILTER_STEPS V27TER_RX_2400_FILTER_STEPS #endif /*! V.27ter modem receive side descriptor. This defines the working state for a single instance of a V.27ter modem receiver. */ typedef struct { /*! \brief The bit rate of the modem. Valid values are 2400 and 4800. */ int bit_rate; /*! \brief The callback function used to put each bit received. */ put_bit_func_t put_bit; /*! \brief A user specified opaque pointer passed to the put_bit routine. */ void *put_bit_user_data; /*! \brief The callback function used to report modem status changes. */ modem_rx_status_func_t status_handler; /*! \brief A user specified opaque pointer passed to the status function. */ void *status_user_data; /*! \brief A callback function which may be enabled to report every symbol's constellation position. */ qam_report_handler_t qam_report; /*! \brief A user specified opaque pointer passed to the qam_report callback routine. */ void *qam_user_data; /*! \brief The route raised cosine (RRC) pulse shaping filter buffer. */ #if defined(SPANDSP_USE_FIXED_POINT) int16_t rrc_filter[2*V27TER_RX_FILTER_STEPS]; #else float rrc_filter[2*V27TER_RX_FILTER_STEPS]; #endif /*! \brief Current offset into the RRC pulse shaping filter buffer. */ int rrc_filter_step; /*! \brief The register for the training and data scrambler. */ unsigned int scramble_reg; /*! \brief A counter for the number of consecutive bits of repeating pattern through the scrambler. */ int scrambler_pattern_count; /*! \brief The section of the training data we are currently in. */ int training_stage; /*! \brief The current step in the table of BC constellation positions. */ int training_bc; /*! \brief A count of how far through the current training step we are. */ int training_count; /*! \brief A measure of how much mismatch there is between the real constellation, and the decoded symbol positions. */ float training_error; /*! \brief The value of the last signal sample, using the a simple HPF for signal power estimation. */ int16_t last_sample; /*! \brief >0 if a signal above the minimum is present. It may or may not be a V.27ter signal. */ int signal_present; /*! \brief Whether or not a carrier drop was detected and the signal delivery is pending. */ int carrier_drop_pending; /*! \brief A count of the current consecutive samples below the carrier off threshold. */ int low_samples; /*! \brief A highest magnitude sample seen. */ int16_t high_sample; /*! \brief TRUE if the previous trained values are to be reused. */ int old_train; /*! \brief The current phase of the carrier (i.e. the DDS parameter). */ uint32_t carrier_phase; /*! \brief The update rate for the phase of the carrier (i.e. the DDS increment). */ int32_t carrier_phase_rate; /*! \brief The carrier update rate saved for reuse when using short training. */ int32_t carrier_phase_rate_save; /*! \brief The proportional part of the carrier tracking filter. */ float carrier_track_p; /*! \brief The integral part of the carrier tracking filter. */ float carrier_track_i; /*! \brief A power meter, to measure the HPF'ed signal power in the channel. */ power_meter_t power; /*! \brief The power meter level at which carrier on is declared. */ int32_t carrier_on_power; /*! \brief The power meter level at which carrier off is declared. */ int32_t carrier_off_power; /*! \brief The scaling factor accessed by the AGC algorithm. */ float agc_scaling; /*! \brief The previous value of agc_scaling, needed to reuse old training. */ float agc_scaling_save; int constellation_state; /*! \brief The current delta factor for updating the equalizer coefficients. */ float eq_delta; #if defined(SPANDSP_USE_FIXED_POINTx) /*! \brief The adaptive equalizer coefficients. */ complexi_t eq_coeff[V27TER_EQUALIZER_PRE_LEN + 1 + V27TER_EQUALIZER_POST_LEN]; /*! \brief A saved set of adaptive equalizer coefficients for use after restarts. */ complexi_t eq_coeff_save[V27TER_EQUALIZER_PRE_LEN + 1 + V27TER_EQUALIZER_POST_LEN]; /*! \brief The equalizer signal buffer. */ complexi_t eq_buf[V27TER_EQUALIZER_MASK + 1]; #else complexf_t eq_coeff[V27TER_EQUALIZER_PRE_LEN + 1 + V27TER_EQUALIZER_POST_LEN]; complexf_t eq_coeff_save[V27TER_EQUALIZER_PRE_LEN + 1 + V27TER_EQUALIZER_POST_LEN]; complexf_t eq_buf[V27TER_EQUALIZER_MASK + 1]; #endif /*! \brief Current offset into the equalizer buffer. */ int eq_step; /*! \brief Current write offset into the equalizer buffer. */ int eq_put_step; /*! \brief Symbol counter to the next equalizer update. */ int eq_skip; /*! \brief Integration variable for damping the Gardner algorithm tests. */ int gardner_integrate; /*! \brief Current step size of Gardner algorithm integration. */ int gardner_step; /*! \brief The total symbol timing correction since the carrier came up. This is only for performance analysis purposes. */ int total_baud_timing_correction; /*! \brief The current fractional phase of the baud timing. */ int baud_phase; /*! \brief Starting phase angles for the coarse carrier aquisition step. */ int32_t start_angles[2]; /*! \brief History list of phase angles for the coarse carrier aquisition step. */ int32_t angles[16]; /*! \brief Error and flow logging control */ logging_state_t logging; } v27ter_rx_state_t; #if defined(__cplusplus) extern "C" { #endif /*! Initialise a V.27ter modem receive context. \brief Initialise a V.27ter modem receive context. \param s The modem context. \param bit_rate The bit rate of the modem. Valid values are 2400 and 4800. \param put_bit The callback routine used to put the received data. \param user_data An opaque pointer passed to the put_bit routine. \return A pointer to the modem context, or NULL if there was a problem. */ v27ter_rx_state_t *v27ter_rx_init(v27ter_rx_state_t *s, int bit_rate, put_bit_func_t put_bit, void *user_data); /*! Reinitialise an existing V.27ter modem receive context. \brief Reinitialise an existing V.27ter modem receive context. \param s The modem context. \param bit_rate The bit rate of the modem. Valid values are 2400 and 4800. \param old_train TRUE if a previous trained values are to be reused. \return 0 for OK, -1 for bad parameter */ int v27ter_rx_restart(v27ter_rx_state_t *s, int bit_rate, int old_train); /*! Free a V.27ter modem receive context. \brief Free a V.27ter modem receive context. \param s The modem context. \return 0 for OK */ int v27ter_rx_free(v27ter_rx_state_t *s); /*! Change the put_bit function associated with a V.27ter modem receive context. \brief Change the put_bit function associated with a V.27ter modem receive context. \param s The modem context. \param put_bit The callback routine used to handle received bits. \param user_data An opaque pointer. */ void v27ter_rx_set_put_bit(v27ter_rx_state_t *s, put_bit_func_t put_bit, void *user_data); /*! Change the modem status report function associated with a V.27ter modem receive context. \brief Change the modem status report function associated with a V.27ter modem receive context. \param s The modem context. \param handler The callback routine used to report modem status changes. \param user_data An opaque pointer. */ void v27ter_rx_set_modem_status_handler(v27ter_rx_state_t *s, modem_rx_status_func_t handler, void *user_data); /*! Process a block of received V.27ter modem audio samples. \brief Process a block of received V.27ter modem audio samples. \param s The modem context. \param amp The audio sample buffer. \param len The number of samples in the buffer. \return The number of samples unprocessed. */ int v27ter_rx(v27ter_rx_state_t *s, const int16_t amp[], int len); /*! Get a snapshot of the current equalizer coefficients. \brief Get a snapshot of the current equalizer coefficients. \param coeffs The vector of complex coefficients. \return The number of coefficients in the vector. */ int v27ter_rx_equalizer_state(v27ter_rx_state_t *s, complexf_t **coeffs); /*! Get the current received carrier frequency. \param s The modem context. \return The frequency, in Hertz. */ float v27ter_rx_carrier_frequency(v27ter_rx_state_t *s); /*! Get the current symbol timing correction since startup. \param s The modem context. \return The correction. */ float v27ter_rx_symbol_timing_correction(v27ter_rx_state_t *s); /*! Get a current received signal power. \param s The modem context. \return The signal power, in dBm0. */ float v27ter_rx_signal_power(v27ter_rx_state_t *s); /*! Set the power level at which the carrier detection will cut in \param s The modem context. \param cutoff The signal cutoff power, in dBm0. */ void v27ter_rx_signal_cutoff(v27ter_rx_state_t *s, float cutoff); /*! Set a handler routine to process QAM status reports \param s The modem context. \param handler The handler routine. \param user_data An opaque pointer passed to the handler routine. */ void v27ter_rx_set_qam_report_handler(v27ter_rx_state_t *s, qam_report_handler_t handler, void *user_data); #if defined(__cplusplus) } #endif #endif /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/spandsp/v22bis.h0000644000175000017500000003263311150047205020612 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * v22bis.h - ITU V.22bis modem * * Written by Steve Underwood * * Copyright (C) 2004 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: v22bis.h,v 1.30 2008/07/25 13:56:54 steveu Exp $ */ /*! \file */ /*! \page v22bis_page The V.22bis modem \section v22bis_page_sec_1 What does it do? The V.22bis modem is a duplex modem for general data use on the PSTN, at rates of 1200 and 2400 bits/second. It is a compatible extension of the V.22 modem, which is a 1200 bits/second only design. It is a band-split design, using carriers of 1200Hz and 2400Hz. It is the fastest PSTN modem in general use which does not use echo-cancellation. \section v22bis__page_sec_2 How does it work? V.22bis uses 4PSK modulation at 1200 bits/second or 16QAM modulation at 2400 bits/second. At 1200bps the symbols are so long that a fixed compromise equaliser is sufficient to recover the 4PSK signal reliably. At 2400bps an adaptive equaliser is necessary. The V.22bis training sequence includes sections which allow the modems to determine if the far modem can support (or is willing to support) 2400bps operation. The modems will automatically use 2400bps if both ends are willing to use that speed, or 1200bps if one or both ends to not acknowledge that 2400bps is OK. */ #if !defined(_V22BIS_H_) #define _V22BIS_H_ #define V22BIS_EQUALIZER_LEN 7 /* this much to the left and this much to the right */ #define V22BIS_EQUALIZER_MASK 15 /* one less than a power of 2 >= (2*V22BIS_EQUALIZER_LEN + 1) */ #define V22BIS_TX_FILTER_STEPS 9 #define V22BIS_RX_FILTER_STEPS 37 /*! V.22bis modem descriptor. This defines the working state for a single instance of a V.22bis modem. */ typedef struct { /*! \brief The bit rate of the modem. Valid values are 1200 and 2400. */ int bit_rate; /*! \brief TRUE is this is the calling side modem. */ int caller; /*! \brief The callback function used to put each bit received. */ put_bit_func_t put_bit; /*! \brief The callback function used to get the next bit to be transmitted. */ get_bit_func_t get_bit; /*! \brief A user specified opaque pointer passed to the callback routines. */ void *user_data; /* RECEIVE SECTION */ struct { /*! \brief The route raised cosine (RRC) pulse shaping filter buffer. */ float rrc_filter[2*V22BIS_RX_FILTER_STEPS]; /*! \brief Current offset into the RRC pulse shaping filter buffer. */ int rrc_filter_step; /*! \brief The register for the data scrambler. */ unsigned int scramble_reg; /*! \brief A counter for the number of consecutive bits of repeating pattern through the scrambler. */ int scrambler_pattern_count; /*! \brief 0 if receiving user data. A training stage value during training */ int training; /*! \brief A count of how far through the current training step we are. */ int training_count; /*! \brief >0 if a signal above the minimum is present. It may or may not be a V.22bis signal. */ int signal_present; /*! \brief A measure of how much mismatch there is between the real constellation, and the decoded symbol positions. */ float training_error; /*! \brief The current phase of the carrier (i.e. the DDS parameter). */ uint32_t carrier_phase; /*! \brief The update rate for the phase of the carrier (i.e. the DDS increment). */ int32_t carrier_phase_rate; /*! \brief The proportional part of the carrier tracking filter. */ float carrier_track_p; /*! \brief The integral part of the carrier tracking filter. */ float carrier_track_i; /*! \brief A callback function which may be enabled to report every symbol's constellation position. */ qam_report_handler_t qam_report; /*! \brief A user specified opaque pointer passed to the qam_report callback routine. */ void *qam_user_data; /*! \brief A power meter, to measure the HPF'ed signal power in the channel. */ power_meter_t rx_power; /*! \brief The power meter level at which carrier on is declared. */ int32_t carrier_on_power; /*! \brief The power meter level at which carrier off is declared. */ int32_t carrier_off_power; /*! \brief The scaling factor accessed by the AGC algorithm. */ float agc_scaling; int constellation_state; /*! \brief The current delta factor for updating the equalizer coefficients. */ float eq_delta; #if defined(SPANDSP_USE_FIXED_POINTx) /*! \brief The adaptive equalizer coefficients. */ complexi_t eq_coeff[2*V22BIS_EQUALIZER_LEN + 1]; /*! \brief The equalizer signal buffer. */ complexi_t eq_buf[V22BIS_EQUALIZER_MASK + 1]; #else complexf_t eq_coeff[2*V22BIS_EQUALIZER_LEN + 1]; complexf_t eq_buf[V22BIS_EQUALIZER_MASK + 1]; #endif /*! \brief Current offset into the equalizer buffer. */ int eq_step; /*! \brief Current write offset into the equalizer buffer. */ int eq_put_step; /*! \brief Integration variable for damping the Gardner algorithm tests. */ int gardner_integrate; /*! \brief Current step size of Gardner algorithm integration. */ int gardner_step; /*! \brief The total symbol timing correction since the carrier came up. This is only for performance analysis purposes. */ int total_baud_timing_correction; /*! \brief The current fractional phase of the baud timing. */ int baud_phase; int sixteen_way_decisions; } rx; /* TRANSMIT SECTION */ struct { /*! \brief The gain factor needed to achieve the specified output power. */ float gain; /*! \brief The route raised cosine (RRC) pulse shaping filter buffer. */ complexf_t rrc_filter[2*V22BIS_TX_FILTER_STEPS]; /*! \brief Current offset into the RRC pulse shaping filter buffer. */ int rrc_filter_step; /*! \brief The register for the data scrambler. */ unsigned int scramble_reg; /*! \brief A counter for the number of consecutive bits of repeating pattern through the scrambler. */ int scrambler_pattern_count; /*! \brief 0 if transmitting user data. A training stage value during training */ int training; /*! \brief A counter used to track progress through sending the training sequence. */ int training_count; /*! \brief The current phase of the carrier (i.e. the DDS parameter). */ uint32_t carrier_phase; /*! \brief The update rate for the phase of the carrier (i.e. the DDS increment). */ int32_t carrier_phase_rate; /*! \brief The current phase of the guard tone (i.e. the DDS parameter). */ uint32_t guard_phase; /*! \brief The update rate for the phase of the guard tone (i.e. the DDS increment). */ int32_t guard_phase_rate; float guard_level; /*! \brief The current fractional phase of the baud timing. */ int baud_phase; /*! \brief The code number for the current position in the constellation. */ int constellation_state; /*! \brief An indicator to mark that we are tidying up to stop transmission. */ int shutdown; /*! \brief The get_bit function in use at any instant. */ get_bit_func_t current_get_bit; } tx; int detected_unscrambled_ones; int detected_unscrambled_zeros; int detected_unscrambled_ones_or_zeros; int detected_unscrambled_0011_ending; int detected_scrambled_ones_or_zeros_at_1200bps; int detected_scrambled_ones_at_2400bps; /*! \brief Error and flow logging control */ logging_state_t logging; } v22bis_state_t; extern const complexf_t v22bis_constellation[16]; #if defined(__cplusplus) extern "C" { #endif /*! Reinitialise an existing V.22bis modem receive context. \brief Reinitialise an existing V.22bis modem receive context. \param s The modem context. \param bit_rate The bit rate of the modem. Valid values are 1200 and 2400. \return 0 for OK, -1 for bad parameter */ int v22bis_rx_restart(v22bis_state_t *s, int bit_rate); /*! Process a block of received V.22bis modem audio samples. \brief Process a block of received V.22bis modem audio samples. \param s The modem context. \param amp The audio sample buffer. \param len The number of samples in the buffer. \return The number of samples unprocessed. */ int v22bis_rx(v22bis_state_t *s, const int16_t amp[], int len); /*! Get a snapshot of the current equalizer coefficients. \brief Get a snapshot of the current equalizer coefficients. \param coeffs The vector of complex coefficients. \return The number of coefficients in the vector. */ int v22bis_equalizer_state(v22bis_state_t *s, complexf_t **coeffs); /*! Get the current received carrier frequency. \param s The modem context. \return The frequency, in Hertz. */ float v22bis_rx_carrier_frequency(v22bis_state_t *s); /*! Get the current symbol timing correction since startup. \param s The modem context. \return The correction. */ float v22bis_symbol_timing_correction(v22bis_state_t *s); /*! Get a current received signal power. \param s The modem context. \return The signal power, in dBm0. */ float v22bis_rx_signal_power(v22bis_state_t *s); /*! Set a handler routine to process QAM status reports \param s The modem context. \param handler The handler routine. \param user_data An opaque pointer passed to the handler routine. */ void v22bis_set_qam_report_handler(v22bis_state_t *s, qam_report_handler_t handler, void *user_data); /*! Generate a block of V.22bis modem audio samples. \brief Generate a block of V.22bis modem audio samples. \param s The modem context. \param amp The audio sample buffer. \param len The number of samples to be generated. \return The number of samples actually generated. */ int v22bis_tx(v22bis_state_t *s, int16_t amp[], int len); /*! Adjust a V.22bis modem transmit context's power output. \brief Adjust a V.22bis modem transmit context's output power. \param s The modem context. \param power The power level, in dBm0 */ void v22bis_tx_power(v22bis_state_t *s, float power); /*! Reinitialise an existing V.22bis modem context, so it may be reused. \brief Reinitialise an existing V.22bis modem context. \param s The modem context. \param bit_rate The bit rate of the modem. Valid values are 1200 and 2400. \return 0 for OK, -1 for bad parameter. */ int v22bis_restart(v22bis_state_t *s, int bit_rate); /*! Initialise a V.22bis modem context. This must be called before the first use of the context, to initialise its contents. \brief Initialise a V.22bis modem context. \param s The modem context. \param bit_rate The bit rate of the modem. Valid values are 1200 and 2400. \param guard The guard tone option. 0 = none, 1 = 550Hz, 2 = 1800Hz. \param caller TRUE if this is the calling modem. \param get_bit The callback routine used to get the data to be transmitted. \param put_bit The callback routine used to get the data to be transmitted. \param user_data An opaque pointer, passed in calls to the get and put routines. \return A pointer to the modem context, or NULL if there was a problem. */ v22bis_state_t *v22bis_init(v22bis_state_t *s, int bit_rate, int guard, int caller, get_bit_func_t get_bit, put_bit_func_t put_bit, void *user_data); /*! Free a V.22bis modem receive context. \brief Free a V.22bis modem receive context. \param s The modem context. \return 0 for OK */ int v22bis_free(v22bis_state_t *s); /*! Change the get_bit function associated with a V.22bis modem context. \brief Change the get_bit function associated with a V.22bis modem context. \param s The modem context. \param get_bit The callback routine used to get the data to be transmitted. \param user_data An opaque pointer. */ void v22bis_set_get_bit(v22bis_state_t *s, get_bit_func_t get_bit, void *user_data); /*! Change the get_bit function associated with a V.22bis modem context. \brief Change the put_bit function associated with a V.22bis modem context. \param s The modem context. \param put_bit The callback routine used to process the data received. \param user_data An opaque pointer. */ void v22bis_set_put_bit(v22bis_state_t *s, put_bit_func_t put_bit, void *user_data); #if defined(__cplusplus) } #endif #endif /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/spandsp/vector_float.h0000644000175000017500000000726211150047205022172 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * vector_float.h * * Written by Steve Underwood * * Copyright (C) 2003 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: vector_float.h,v 1.10 2008/04/17 14:27:01 steveu Exp $ */ #if !defined(_SPANDSP_VECTOR_FLOAT_H_) #define _SPANDSP_VECTOR_FLOAT_H_ #if defined(__cplusplus) extern "C" { #endif void vec_copyf(float z[], const float x[], int n); void vec_copy(double z[], const double x[], int n); #if defined(HAVE_LONG_DOUBLE) void vec_copyl(long double z[], const long double x[], int n); #endif void vec_zerof(float z[], int n); void vec_zero(double z[], int n); #if defined(HAVE_LONG_DOUBLE) void vec_zerol(long double z[], int n); #endif void vec_setf(float z[], float x, int n); void vec_set(double z[], double x, int n); #if defined(HAVE_LONG_DOUBLE) void vec_setl(long double z[], long double x, int n); #endif void vec_addf(float z[], const float x[], const float y[], int n); void vec_add(double z[], const double x[], const double y[], int n); #if defined(HAVE_LONG_DOUBLE) void vec_addl(long double z[], const long double x[], const long double y[], int n); #endif void vec_scaled_addf(float z[], const float x[], float x_scale, const float y[], float y_scale, int n); void vec_scaled_add(double z[], const double x[], double x_scale, const double y[], double y_scale, int n); #if defined(HAVE_LONG_DOUBLE) void vec_scaled_addl(long double z[], const long double x[], long double x_scale, const long double y[], long double y_scale, int n); #endif void vec_subf(float z[], const float x[], const float y[], int n); void vec_sub(double z[], const double x[], const double y[], int n); #if defined(HAVE_LONG_DOUBLE) void vec_subl(long double z[], const long double x[], const long double y[], int n); #endif void vec_scaled_subf(float z[], const float x[], float x_scale, const float y[], float y_scale, int n); void vec_scaled_sub(double z[], const double x[], double x_scale, const double y[], double y_scale, int n); #if defined(HAVE_LONG_DOUBLE) void vec_scaled_subl(long double z[], const long double x[], long double x_scale, const long double y[], long double y_scale, int n); #endif void vec_scalar_mulf(float z[], const float x[], float y, int n); void vec_scalar_mul(double z[], const double x[], double y, int n); #if defined(HAVE_LONG_DOUBLE) void vec_scalar_mull(long double z[], const long double x[], long double y, int n); #endif void vec_mulf(float z[], const float x[], const float y[], int n); void vec_mul(double z[], const double x[], const double y[], int n); #if defined(HAVE_LONG_DOUBLE) void vec_mull(long double z[], const long double x[], const long double y[], int n); #endif float vec_dot_prodf(const float x[], const float y[], int n); double vec_dot_prod(const double x[], const double y[], int n); #if defined(HAVE_LONG_DOUBLE) long double vec_dot_prodl(const long double x[], const long double y[], int n); #endif #if defined(__cplusplus) } #endif #endif /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/spandsp/power_meter.h0000644000175000017500000001024111150047205022022 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * power_meter.h * * Written by Steve Underwood * * Copyright (C) 2003 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: power_meter.h,v 1.15 2008/04/17 14:27:00 steveu Exp $ */ #if !defined(_POWER_METER_H_) #define _POWER_METER_H_ /*! \page power_meter_page Power metering \section power_meter_page_sec_1 What does it do? The power metering module implements a simple IIR type running power meter. The damping factor of the IIR is selectable when the meter instance is created. Note that the definition of dBOv is quite vague in most places - is it peak since wave, peak square wave, etc.? This code is based on the well defined wording in RFC3389: "For example, in the case of a u-law system, the reference would be a square wave with values +/-8031, and this square wave represents 0dBov. This translates into 6.18dBm0". \section power_meter_page_sec_2 How does it work? */ /*! Power meter descriptor. This defines the working state for a single instance of a power measurement device. */ typedef struct { /*! The shift factor, which controls the damping of the power meter. */ int shift; /*! The current power reading. */ int32_t reading; } power_meter_t; #if defined(__cplusplus) extern "C" { #endif /*! Initialise a power meter context. \brief Initialise a power meter context. \param s The power meter context. \param shift The shift to be used by the IIR filter. \return The power meter context. */ power_meter_t *power_meter_init(power_meter_t *s, int shift); /*! Change the damping factor of a power meter context. \brief Change the damping factor of a power meter context. \param s The power meter context. \param shift The new shift to be used by the IIR filter. \return The power meter context. */ power_meter_t *power_meter_damping(power_meter_t *s, int shift); /*! Update a power meter. \brief Update a power meter. \param s The power meter context. \param amp The amplitude of the new audio sample. \return The current power meter reading. */ int32_t power_meter_update(power_meter_t *s, int16_t amp); /*! Get the current power meter reading. \brief Get the current power meter reading. \param s The power meter context. \return The current power meter reading. */ int32_t power_meter_current(power_meter_t *s); /*! Get the current power meter reading, in dBm0. \brief Get the current power meter reading, in dBm0. \param s The power meter context. \return The current power meter reading, in dBm0. */ float power_meter_current_dbm0(power_meter_t *s); /*! Get the current power meter reading, in dBOv. \brief Get the current power meter reading, in dBOv. \param s The power meter context. \return The current power meter reading, in dBOv. */ float power_meter_current_dbov(power_meter_t *s); /*! Get the power meter reading which represents a specified power level in dBm0. \brief Get the current power meter reading, in dBm0. \param level A power level, in dB0m. \return The equivalent power meter reading. */ int32_t power_meter_level_dbm0(float level); /*! Get the power meter reading which represents a specified power level in dBOv. \brief Get the current power meter reading, in dBOv. \param level A power level, in dBOv. \return The equivalent power meter reading. */ int32_t power_meter_level_dbov(float level); #if defined(__cplusplus) } #endif #endif /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/spandsp/g726.h0000644000175000017500000001246411150047205020170 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * g726.h - ITU G.726 codec. * * Written by Steve Underwood * * Copyright (C) 2006 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: g726.h,v 1.21 2008/04/17 14:27:00 steveu Exp $ */ /*! \file */ #if !defined(_SPANDSP_G726_H_) #define _SPANDSP_G726_H_ /*! \page g726_page G.726 encoding and decoding \section g726_page_sec_1 What does it do? The G.726 module is a bit exact implementation of the full ITU G.726 specification. It supports: - 16 kbps, 24kbps, 32kbps, and 40kbps operation. - Tandem adjustment, for interworking with A-law and u-law. - Annex A support, for use in environments not using A-law or u-law. It passes the ITU tests. \section g726_page_sec_2 How does it work? ???. */ enum { G726_ENCODING_LINEAR = 0, /* Interworking with 16 bit signed linear */ G726_ENCODING_ULAW, /* Interworking with u-law */ G726_ENCODING_ALAW /* Interworking with A-law */ }; enum { G726_PACKING_NONE = 0, G726_PACKING_LEFT = 1, G726_PACKING_RIGHT = 2 }; struct g726_state_s; typedef int16_t (*g726_decoder_func_t)(struct g726_state_s *s, uint8_t code); typedef uint8_t (*g726_encoder_func_t)(struct g726_state_s *s, int16_t amp); /*! * The following is the definition of the state structure * used by the G.726 encoder and decoder to preserve their internal * state between successive calls. The meanings of the majority * of the state structure fields are explained in detail in the * CCITT Recommendation G.721. The field names are essentially indentical * to variable names in the bit level description of the coding algorithm * included in this Recommendation. */ typedef struct g726_state_s { /*! The bit rate */ int rate; /*! The external coding, for tandem operation */ int ext_coding; /*! The number of bits per sample */ unsigned int bits_per_sample; /*! One of the G.726_PACKING_xxx options */ int packing; /*! Locked or steady state step size multiplier. */ int32_t yl; /*! Unlocked or non-steady state step size multiplier. */ int16_t yu; /*! int16_t term energy estimate. */ int16_t dms; /*! Long term energy estimate. */ int16_t dml; /*! Linear weighting coefficient of 'yl' and 'yu'. */ int16_t ap; /*! Coefficients of pole portion of prediction filter. */ int16_t a[2]; /*! Coefficients of zero portion of prediction filter. */ int16_t b[6]; /*! Signs of previous two samples of a partially reconstructed signal. */ int16_t pk[2]; /*! Previous 6 samples of the quantized difference signal represented in an internal floating point format. */ int16_t dq[6]; /*! Previous 2 samples of the quantized difference signal represented in an internal floating point format. */ int16_t sr[2]; /*! Delayed tone detect */ int td; /*! \brief The bit stream processing context. */ bitstream_state_t bs; /*! \brief The current encoder function. */ g726_encoder_func_t enc_func; /*! \brief The current decoder function. */ g726_decoder_func_t dec_func; } g726_state_t; #if defined(__cplusplus) extern "C" { #endif /*! Initialise a G.726 encode or decode context. \param s The G.726 context. \param bit_rate The required bit rate for the ADPCM data. The valid rates are 16000, 24000, 32000 and 40000. \param ext_coding The coding used outside G.726. \param packing One of the G.726_PACKING_xxx options. \return A pointer to the G.726 context, or NULL for error. */ g726_state_t *g726_init(g726_state_t *s, int bit_rate, int ext_coding, int packing); /*! Free a G.726 encode or decode context. \param s The G.726 context. \return 0 for OK. */ int g726_release(g726_state_t *s); /*! Decode a buffer of G.726 ADPCM data to linear PCM, a-law or u-law. \param s The G.726 context. \param amp The audio sample buffer. \param g726_data \param g726_bytes \return The number of samples returned. */ int g726_decode(g726_state_t *s, int16_t amp[], const uint8_t g726_data[], int g726_bytes); /*! Encode a buffer of linear PCM data to G.726 ADPCM. \param s The G.726 context. \param g726_data The G.726 data produced. \param amp The audio sample buffer. \param len The number of samples in the buffer. \return The number of bytes of G.726 data produced. */ int g726_encode(g726_state_t *s, uint8_t g726_data[], const int16_t amp[], int len); #if defined(__cplusplus) } #endif #endif /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/spandsp/at_interpreter.h0000644000175000017500000001764411150047205022537 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * at_interpreter.h - AT command interpreter to V.251, V.252, V.253, T.31 and the 3GPP specs. * * Written by Steve Underwood * * Copyright (C) 2004, 2005, 2006 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: at_interpreter.h,v 1.18 2008/06/11 17:52:30 steveu Exp $ */ /*! \file */ #if !defined(_SPANDSP_AT_INTERPRETER_H_) #define _SPANDSP_AT_INTERPRETER_H_ /*! \page at_page AT command interpreter \section at_page_sec_1 What does it do? The AT interpreter module implements V.251, V.252, V.253, T.31 and various 3GPP modem control commands. \section at_page_sec_2 How does it work? */ typedef struct at_state_s at_state_t; typedef int (at_modem_control_handler_t)(at_state_t *s, void *user_data, int op, const char *num); typedef int (at_tx_handler_t)(at_state_t *s, void *user_data, const uint8_t *buf, size_t len); typedef int (at_class1_handler_t)(at_state_t *s, void *user_data, int direction, int operation, int val); enum at_rx_mode_e { AT_MODE_ONHOOK_COMMAND, AT_MODE_OFFHOOK_COMMAND, AT_MODE_CONNECTED, AT_MODE_DELIVERY, AT_MODE_HDLC, AT_MODE_STUFFED }; enum at_call_event_e { AT_CALL_EVENT_ALERTING = 1, AT_CALL_EVENT_CONNECTED, AT_CALL_EVENT_ANSWERED, AT_CALL_EVENT_BUSY, AT_CALL_EVENT_NO_DIALTONE, AT_CALL_EVENT_NO_ANSWER, AT_CALL_EVENT_HANGUP }; enum at_modem_control_operation_e { /*! Start an outgoing call. */ AT_MODEM_CONTROL_CALL, /*! Answer an incoming call. */ AT_MODEM_CONTROL_ANSWER, /*! Hangup a call. */ AT_MODEM_CONTROL_HANGUP, /*! Take the line off hook. */ AT_MODEM_CONTROL_OFFHOOK, /*! Put the line on hook. */ AT_MODEM_CONTROL_ONHOOK, /*! Control V.24 Circuit 108, "data terminal ready". */ AT_MODEM_CONTROL_DTR, /*! Control V.24 Circuit 105, "request to send". */ AT_MODEM_CONTROL_RTS, /*! Control V.24 Circuit 106, "clear to send". */ AT_MODEM_CONTROL_CTS, /*! Control V.24 Circuit 109, "receive line signal detector" (i.e. carrier detect). */ AT_MODEM_CONTROL_CAR, /*! Control V.24 Circuit 125, "ring indicator". */ AT_MODEM_CONTROL_RNG, /*! Control V.24 Circuit 107, "data set ready". */ AT_MODEM_CONTROL_DSR, /*! Set the caller ID for outgoing calls. */ AT_MODEM_CONTROL_SETID, /* The remainder of the control functions should not get past the modem, to the application. */ AT_MODEM_CONTROL_RESTART, AT_MODEM_CONTROL_DTE_TIMEOUT }; enum { AT_RESPONSE_CODE_OK = 0, AT_RESPONSE_CODE_CONNECT, AT_RESPONSE_CODE_RING, AT_RESPONSE_CODE_NO_CARRIER, AT_RESPONSE_CODE_ERROR, AT_RESPONSE_CODE_XXX, AT_RESPONSE_CODE_NO_DIALTONE, AT_RESPONSE_CODE_BUSY, AT_RESPONSE_CODE_NO_ANSWER, AT_RESPONSE_CODE_FCERROR, AT_RESPONSE_CODE_FRH3 }; struct at_call_id { char *id; char *value; struct at_call_id *next; }; /*! AT profile. */ typedef struct { /*! TRUE if character echo is enabled */ int echo; /*! TRUE if verbose reporting is enabled */ int verbose; /*! TRUE if result codes are verbose */ int result_code_format; /*! TRUE if pulse dialling is the default */ int pulse_dial; /*! ??? */ int double_escape; /*! ??? */ int adaptive_receive; /*! The state of all possible S registers */ uint8_t s_regs[100]; } at_profile_t; /*! AT descriptor. This defines the working state for a single instance of the AT interpreter. */ struct at_state_s { at_profile_t p; /*! Value set by +GCI */ int country_of_installation; /*! Value set by +FIT */ int dte_inactivity_timeout; /*! Value set by +FIT */ int dte_inactivity_action; /*! Value set by L */ int speaker_volume; /*! Value set by M */ int speaker_mode; /*! This is no real DTE rate. This variable is for compatibility this serially connected modems. */ /*! Value set by +IPR/+FPR */ int dte_rate; /*! Value set by +ICF */ int dte_char_format; /*! Value set by +ICF */ int dte_parity; /*! Value set by &C */ int rlsd_behaviour; /*! Value set by &D */ int dtr_behaviour; /*! Value set by +FCL */ int carrier_loss_timeout; /*! Value set by X */ int result_code_mode; /*! Value set by +IDSR */ int dsr_option; /*! Value set by +ILSD */ int long_space_disconnect_option; /*! Value set by +ICLOK */ int sync_tx_clock_source; /*! Value set by +EWIND */ int rx_window; /*! Value set by +EWIND */ int tx_window; int v8bis_signal; int v8bis_1st_message; int v8bis_2nd_message; int v8bis_sig_en; int v8bis_msg_en; int v8bis_supp_delay; uint8_t rx_data[256]; int rx_data_bytes; int display_call_info; int call_info_displayed; struct at_call_id *call_id; char *local_id; /*! The currently select FAX modem class. 0 = data modem mode. */ int fclass_mode; int at_rx_mode; int rings_indicated; int do_hangup; int silent_dial; int command_dial; int ok_is_pending; int dte_is_waiting; /*! \brief TRUE if a carrier is presnt. Otherwise FALSE. */ int rx_signal_present; /*! \brief TRUE if a modem has trained, Otherwise FALSE. */ int rx_trained; int transmit; char line[256]; int line_ptr; at_modem_control_handler_t *modem_control_handler; void *modem_control_user_data; at_tx_handler_t *at_tx_handler; void *at_tx_user_data; at_class1_handler_t *class1_handler; void *class1_user_data; /*! \brief Error and flow logging control */ logging_state_t logging; }; #if defined(__cplusplus) extern "C" { #endif void at_set_at_rx_mode(at_state_t *s, int new_mode); void at_put_response(at_state_t *s, const char *t); void at_put_numeric_response(at_state_t *s, int val); void at_put_response_code(at_state_t *s, int code); void at_reset_call_info(at_state_t *s); /*! Set the call information for an AT interpreter. \brief Set the call information for an AT interpreter. \param s The AT interpreter context. \param id . \param value . */ void at_set_call_info(at_state_t *s, char const *id, char const *value); void at_display_call_info(at_state_t *s); int at_modem_control(at_state_t *s, int op, const char *num); void at_call_event(at_state_t *s, int event); void at_interpreter(at_state_t *s, const char *cmd, int len); void at_set_class1_handler(at_state_t *s, at_class1_handler_t handler, void *user_data); /*! Initialise an AT interpreter context. \brief Initialise an AT interpreter context. \param s The AT context. \param at_tx_handler x. \param at_tx_user_data x. \param modem_control_handler x. \param modem_control_user_data x. \return A pointer to the AT context, or NULL if there was a problem. */ at_state_t *at_init(at_state_t *s, at_tx_handler_t *at_tx_handler, void *at_tx_user_data, at_modem_control_handler_t *modem_control_handler, void *modem_control_user_data); /*! Free an AT interpreter context. \brief Free an AT interpreter context. \param s The AT context. \return 0 for OK */ int at_free(at_state_t *s); #if defined(__cplusplus) } #endif #endif /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/spandsp/queue.h0000644000175000017500000001506111150047205020623 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * queue.h - simple in process message queuing * * Written by Steve Underwood * * Copyright (C) 2004 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: queue.h,v 1.16 2008/05/30 13:51:28 steveu Exp $ */ /*! \file */ /*! \page queue_page Queuing \section queue_page_sec_1 What does it do? This module provides lock free queuing for either octet streams or messages. Specifically, lock free means one thread can write and another can read without locking the queue. It does NOT means a free-for-all is possible, with many threads writing or many threads reading. Those things would require locking, to avoid conflicts between the multiple threads acting on one end of the queue. \section queue_page_sec_2 How does it work? ???. */ #if !defined(_SPANDSP_QUEUE_H_) #define _SPANDSP_QUEUE_H_ /*! Flag bit to indicate queue reads are atomic operations. This must be set if the queue is to be used with the message oriented functions. */ #define QUEUE_READ_ATOMIC 0x0001 /*! Flag bit to indicate queue writes are atomic operations. This must be set if the queue is to be used with the message oriented functions. */ #define QUEUE_WRITE_ATOMIC 0x0002 /*! Queue descriptor. This defines the working state for a single instance of a byte stream or message oriented queue. */ typedef struct { /*! \brief Flags indicating the mode of the queue. */ int flags; /*! \brief The length of the data buffer. */ int len; /*! \brief The buffer input pointer. */ volatile int iptr; /*! \brief The buffer output pointer. */ volatile int optr; /*! \brief The data buffer, sized at the time the structure is created. */ uint8_t data[]; } queue_state_t; #define QUEUE_STATE_T_SIZE(len) (sizeof(queue_state_t) + len + 1) #if defined(__cplusplus) extern "C" { #endif /*! Check if a queue is empty. \brief Check if a queue is empty. \param s The queue context. \return TRUE if empty, else FALSE. */ int queue_empty(queue_state_t *s); /*! Check the available free space in a queue's buffer. \brief Check available free space. \param s The queue context. \return The number of bytes of free space. */ int queue_free_space(queue_state_t *s); /*! Check the contents of a queue. \brief Check the contents of a queue. \param s The queue context. \return The number of bytes in the queue. */ int queue_contents(queue_state_t *s); /*! Flush the contents of a queue. \brief Flush the contents of a queue. \param s The queue context. */ void queue_flush(queue_state_t *s); /*! Copy bytes from a queue. This is similar to queue_read, but the data remains in the queue. \brief Copy bytes from a queue. \param s The queue context. \param buf The buffer into which the bytes will be read. \param len The length of the buffer. \return the number of bytes returned. */ int queue_view(queue_state_t *s, uint8_t *buf, int len); /*! Read bytes from a queue. \brief Read bytes from a queue. \param s The queue context. \param buf The buffer into which the bytes will be read. \param len The length of the buffer. \return the number of bytes returned. */ int queue_read(queue_state_t *s, uint8_t *buf, int len); /*! Read a byte from a queue. \brief Read a byte from a queue. \param s The queue context. \return the byte, or -1 if the queue is empty. */ int queue_read_byte(queue_state_t *s); /*! Write bytes to a queue. \brief Write bytes to a queue. \param s The queue context. \param buf The buffer containing the bytes to be written. \param len The length of the buffer. \return the number of bytes actually written. */ int queue_write(queue_state_t *s, const uint8_t *buf, int len); /*! Write a byte to a queue. \brief Write a byte to a queue. \param s The queue context. \param byte The byte to be written. \return the number of bytes actually written. */ int queue_write_byte(queue_state_t *s, uint8_t byte); /*! Test the length of the message at the head of a queue. \brief Test message length. \param s The queue context. \return The length of the next message, in byte. If there are no messages in the queue, -1 is returned. */ int queue_state_test_msg(queue_state_t *s); /*! Read a message from a queue. If the message is longer than the buffer provided, only the first len bytes of the message will be returned. The remainder of the message will be discarded. \brief Read a message from a queue. \param s The queue context. \param buf The buffer into which the message will be read. \param len The length of the buffer. \return The number of bytes returned. If there are no messages in the queue, -1 is returned. */ int queue_read_msg(queue_state_t *s, uint8_t *buf, int len); /*! Write a message to a queue. \brief Write a message to a queue. \param s The queue context. \param buf The buffer from which the message will be written. \param len The length of the message. \return The number of bytes actually written. */ int queue_write_msg(queue_state_t *s, const uint8_t *buf, int len); /*! Initialise a queue. \brief Initialise a queue. \param s The queue context. If is imperative that the context this points to is immediately followed by a buffer of the required size + 1 octet. \param len The length of the queue's buffer. \param flags Flags controlling the operation of the queue. Valid flags are QUEUE_READ_ATOMIC and QUEUE_WRITE_ATOMIC. \return A pointer to the context if OK, else NULL. */ queue_state_t *queue_init(queue_state_t *s, int len, int flags); /*! Delete a queue. \brief Delete a queue. \param s The queue context. \return 0 if deleted OK, else -1. */ int queue_free(queue_state_t *s); #if defined(__cplusplus) } #endif #endif /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/spandsp/t35.h0000644000175000017500000000503111150047205020106 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * t35.h - ITU T.35 FAX non-standard facility processing. * * Written by Steve Underwood * * Copyright (C) 2003 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: t35.h,v 1.14 2008/04/17 14:27:00 steveu Exp $ */ /*! \file */ #if !defined(_SPANDSP_T35_H_) #define _SPANDSP_T35_H_ /*! \page t35_page T.35 manufacturer specific processing for FAX machines \section t35_page_sec_1 What does it do? ???. \section t35_page_sec_2 How does it work? ???. */ /*! A table of the country names associated with each possible value of the T.35 country code selector octet. */ extern const char *t35_country_codes[256]; #if defined(__cplusplus) extern "C" { #endif /*! Decode an NSF field to try to determine the make and model of the remote machine. \brief Decode an NSF field. \param msg The NSF message. \param len The length of the NSF message. \param country A pointer which will be pointed to the identified country of origin. If a NULL pointer is given, the country of origin will not be returned. If the country of origin is not identified, NULL will be returned. \param vendor A pointer which will be pointed to the identified vendor. If a NULL pointer is given, the vendor ID will not be returned. If the vendor is not identified, NULL will be returned. \param model A pointer which will be pointed to the identified model. If a NULL pointer is given, the model will not be returned. If the model is not identified, NULL will be returned. \return TRUE if the machine was identified, otherwise FALSE. */ int t35_decode(const uint8_t *msg, int len, const char **country, const char **vendor, const char **model); #if defined(__cplusplus) } #endif #endif /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/spandsp/vector_int.h0000644000175000017500000000523211150047205021652 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * vector_int.h * * Written by Steve Underwood * * Copyright (C) 2003 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: vector_int.h,v 1.10 2008/04/17 14:27:01 steveu Exp $ */ #if !defined(_SPANDSP_VECTOR_INT_H_) #define _SPANDSP_VECTOR_INT_H_ #if defined(__cplusplus) extern "C" { #endif int32_t vec_dot_prodi16(const int16_t x[], const int16_t y[], int n); /*! \brief Find the minimum and maximum values in a vector. \param x The vector to be searched. \param n The number of elements in the vetor. \param out A two element vector. The first will receive the maximum. The second will receive the minimum. This parameter may be set to NULL. \return The absolute maximum value. Since the range of negative numbers exceeds the range of positive one, the returned integer is longer than the ones being searched. */ int32_t vec_min_maxi16(const int16_t x[], int n, int16_t out[]); static __inline__ int vec_norm2i16(const int16_t *vec, int len) { int i; int sum; sum = 0; for (i = 0; i < len; i++) sum += vec[i]*vec[i]; return sum; } /*- End of function --------------------------------------------------------*/ static __inline__ void vec_sari16(int16_t *vec, int len, int shift) { int i; for (i = 0; i < len; i++) vec[i] >>= shift; } /*- End of function --------------------------------------------------------*/ static __inline__ int vec_max_bitsi16(const int16_t *vec, int len) { int i; int max; int v; int b; max = 0; for (i = 0; i < len; i++) { v = abs(vec[i]); if (v > max) max = v; } b = 0; while (max != 0) { b++; max >>= 1; } return b; } /*- End of function --------------------------------------------------------*/ #if defined(__cplusplus) } #endif #endif /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/spandsp/crc.h0000644000175000017500000000637511150047205020256 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * crc.h * * Written by Steve Underwood * * Copyright (C) 2003 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: crc.h,v 1.4 2008/04/17 14:27:00 steveu Exp $ */ /*! \file */ /*! \page crc_page CRC \section crc_page_sec_1 What does it do? \section crc_page_sec_2 How does it work? */ #if !defined(_SPANDSP_CRC_H_) #define _SPANDSP_CRC_H_ #if defined(__cplusplus) extern "C" { #endif /*! \brief Calculate the ITU/CCITT CRC-32 value in buffer. \param buf The buffer containing the data. \param len The length of the frame. \param crc The initial CRC value. This is usually 0xFFFFFFFF, or 0 for a new block (it depends on the application). It is previous returned CRC value for the continuation of a block. \return The CRC value. */ uint32_t crc_itu32_calc(const uint8_t *buf, int len, uint32_t crc); /*! \brief Append an ITU/CCITT CRC-32 value to a frame. \param buf The buffer containing the frame. This must be at least 2 bytes longer than the frame it contains, to allow room for the CRC value. \param len The length of the frame. \return The new length of the frame. */ int crc_itu32_append(uint8_t *buf, int len); /*! \brief Check the ITU/CCITT CRC-32 value in a frame. \param buf The buffer containing the frame. \param len The length of the frame. \return TRUE if the CRC is OK, else FALSE. */ int crc_itu32_check(const uint8_t *buf, int len); /*! \brief Calculate the ITU/CCITT CRC-16 value in buffer. \param buf The buffer containing the data. \param len The length of the frame. \param crc The initial CRC value. This is usually 0xFFFF, or 0 for a new block (it depends on the application). It is previous returned CRC value for the continuation of a block. \return The CRC value. */ uint16_t crc_itu16_calc(const uint8_t *buf, int len, uint16_t crc); /*! \brief Append an ITU/CCITT CRC-16 value to a frame. \param buf The buffer containing the frame. This must be at least 2 bytes longer than the frame it contains, to allow room for the CRC value. \param len The length of the frame. \return The new length of the frame. */ int crc_itu16_append(uint8_t *buf, int len); /*! \brief Check the ITU/CCITT CRC-16 value in a frame. \param buf The buffer containing the frame. \param len The length of the frame. \return TRUE if the CRC is OK, else FALSE. */ int crc_itu16_check(const uint8_t *buf, int len); #if defined(__cplusplus) } #endif #endif /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/spandsp/v17tx.h0000644000175000017500000002315311150047205020471 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * v17tx.h - ITU V.17 modem transmit part * * Written by Steve Underwood * * Copyright (C) 2004 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: v17tx.h,v 1.36 2008/07/16 14:23:48 steveu Exp $ */ /*! \file */ #if !defined(_SPANDSP_V17TX_H_) #define _SPANDSP_V17TX_H_ /*! \page v17tx_page The V.17 transmitter \section v17tx_page_sec_1 What does it do? The V.17 transmitter implements the transmit side of a V.17 modem. This can operate at data rates of 14400, 12000, 9600 and 7200 bits/second. The audio output is a stream of 16 bit samples, at 8000 samples/second. The transmit and receive side of V.17 modems operate independantly. V.17 is mostly used for FAX transmission, where it provides the standard 14400 bits/second rate. \section v17tx_page_sec_2 How does it work? V.17 uses QAM modulation and trellis coding. The data to be transmitted is scrambled, to whiten it. The least significant 2 bits of each symbol are then differentially encoded, using a simple lookup approach. The resulting 2 bits are convolutionally encoded, producing 3 bits. The extra bit is the redundant bit of the trellis code. The other bits of the symbol pass by the differential and convolutional coding unchanged. The resulting bits define the constellation point to be transmitted for the symbol. The redundant bit doubles the size of the constellation, and so increases the error rate for detecting individual symbols at the receiver. However, when a number of successive symbols are processed at the receiver, the redundancy actually provides several dB of improved error performance. The standard method of producing a QAM modulated signal is to use a sampling rate which is a multiple of the baud rate. The raw signal is then a series of complex pulses, each an integer number of samples long. These can be shaped, using a suitable complex filter, and multiplied by a complex carrier signal to produce the final QAM signal for transmission. The pulse shaping filter is only vaguely defined by the V.17 spec. Some of the other ITU modem specs. fully define the filter, typically specifying a root raised cosine filter, with 50% excess bandwidth. This is a pity, since it increases the variability of the received signal. However, the receiver's adaptive equalizer will compensate for these differences. The current design uses a root raised cosine filter with 25% excess bandwidth. Greater excess bandwidth will not allow the tranmitted signal to meet the spectral requirements. The sampling rate for our transmitter is defined by the channel - 8000 per second. This is not a multiple of the baud rate (i.e. 2400 baud). The baud interval is actually 10/3 sample periods. Instead of using a symmetric FIR to pulse shape the signal, a polyphase filter is used. This consists of 10 sets of coefficients, offering zero to 9/10ths of a baud phase shift as well as root raised cosine filtering. The appropriate coefficient set is chosen for each signal sample generated. The carrier is generated using the DDS method. Using two second order resonators, started in quadrature, might be more efficient, as it would have less impact on the processor cache than a table lookup approach. However, the DDS approach suits the receiver better, so the same signal generator is also used for the transmitter. */ #define V17_TX_FILTER_STEPS 9 /*! V.17 modem transmit side descriptor. This defines the working state for a single instance of a V.17 modem transmitter. */ typedef struct { /*! \brief The bit rate of the modem. Valid values are 4800, 7200 and 9600. */ int bit_rate; /*! \brief The callback function used to get the next bit to be transmitted. */ get_bit_func_t get_bit; /*! \brief A user specified opaque pointer passed to the get_bit function. */ void *get_bit_user_data; /*! \brief The callback function used to report modem status changes. */ modem_tx_status_func_t status_handler; /*! \brief A user specified opaque pointer passed to the status function. */ void *status_user_data; /*! \brief The gain factor needed to achieve the specified output power. */ #if defined(SPANDSP_USE_FIXED_POINT) int32_t gain; #else float gain; #endif /*! \brief The route raised cosine (RRC) pulse shaping filter buffer. */ #if defined(SPANDSP_USE_FIXED_POINT) complexi16_t rrc_filter[2*V17_TX_FILTER_STEPS]; #else complexf_t rrc_filter[2*V17_TX_FILTER_STEPS]; #endif /*! \brief Current offset into the RRC pulse shaping filter buffer. */ int rrc_filter_step; /*! \brief The current state of the differential encoder. */ int diff; /*! \brief The current state of the convolutional encoder. */ int convolution; /*! \brief The register for the data scrambler. */ unsigned int scramble_reg; /*! \brief TRUE if transmitting the training sequence. FALSE if transmitting user data. */ int in_training; /*! \brief TRUE if the short training sequence is to be used. */ int short_train; /*! \brief A counter used to track progress through sending the training sequence. */ int training_step; /*! \brief The current phase of the carrier (i.e. the DDS parameter). */ uint32_t carrier_phase; /*! \brief The update rate for the phase of the carrier (i.e. the DDS increment). */ int32_t carrier_phase_rate; /*! \brief The current fractional phase of the baud timing. */ int baud_phase; /*! \brief The code number for the current position in the constellation. */ int constellation_state; /*! \brief A pointer to the constellation currently in use. */ #if defined(SPANDSP_USE_FIXED_POINT) const complexi16_t *constellation; #else const complexf_t *constellation; #endif /*! \brief The current number of data bits per symbol. This does not include the redundant bit. */ int bits_per_symbol; /*! \brief The get_bit function in use at any instant. */ get_bit_func_t current_get_bit; /*! \brief Error and flow logging control */ logging_state_t logging; } v17_tx_state_t; #if defined(__cplusplus) extern "C" { #endif /*! Adjust a V.17 modem transmit context's power output. \brief Adjust a V.17 modem transmit context's output power. \param s The modem context. \param power The power level, in dBm0 */ void v17_tx_power(v17_tx_state_t *s, float power); /*! Initialise a V.17 modem transmit context. This must be called before the first use of the context, to initialise its contents. \brief Initialise a V.17 modem transmit context. \param s The modem context. \param rate The bit rate of the modem. Valid values are 7200, 9600, 12000 and 14400. \param tep TRUE is the optional TEP tone is to be transmitted. \param get_bit The callback routine used to get the data to be transmitted. \param user_data An opaque pointer. \return A pointer to the modem context, or NULL if there was a problem. */ v17_tx_state_t *v17_tx_init(v17_tx_state_t *s, int rate, int tep, get_bit_func_t get_bit, void *user_data); /*! Reinitialise an existing V.17 modem transmit context, so it may be reused. \brief Reinitialise an existing V.17 modem transmit context. \param s The modem context. \param bit_rate The bit rate of the modem. Valid values are 7200, 9600, 12000 and 14400. \param tep TRUE is the optional TEP tone is to be transmitted. \param short_train TRUE if the short training sequence should be used. \return 0 for OK, -1 for parameter error. */ int v17_tx_restart(v17_tx_state_t *s, int bit_rate, int tep, int short_train); /*! Free a V.17 modem transmit context. \brief Free a V.17 modem transmit context. \param s The modem context. \return 0 for OK */ int v17_tx_free(v17_tx_state_t *s); /*! Change the get_bit function associated with a V.17 modem transmit context. \brief Change the get_bit function associated with a V.17 modem transmit context. \param s The modem context. \param get_bit The callback routine used to get the data to be transmitted. \param user_data An opaque pointer. */ void v17_tx_set_get_bit(v17_tx_state_t *s, get_bit_func_t get_bit, void *user_data); /*! Change the modem status report function associated with a V.17 modem transmit context. \brief Change the modem status report function associated with a V.17 modem transmit context. \param s The modem context. \param handler The callback routine used to report modem status changes. \param user_data An opaque pointer. */ void v17_tx_set_modem_status_handler(v17_tx_state_t *s, modem_tx_status_func_t handler, void *user_data); /*! Generate a block of V.17 modem audio samples. \brief Generate a block of V.17 modem audio samples. \param s The modem context. \param amp The audio sample buffer. \param len The number of samples to be generated. \return The number of samples actually generated. */ int v17_tx(v17_tx_state_t *s, int16_t amp[], int len); #if defined(__cplusplus) } #endif #endif /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/spandsp/schedule.h0000644000175000017500000000425411150047205021275 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * schedule.h * * Written by Steve Underwood * * Copyright (C) 2004 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: schedule.h,v 1.16 2008/04/17 14:27:00 steveu Exp $ */ /*! \file */ /*! \page schedule_page Scheduling \section schedule_page_sec_1 What does it do? ???. \section schedule_page_sec_2 How does it work? ???. */ #if !defined(_SPANDSP_SCHEDULE_H_) #define _SPANDSP_SCHEDULE_H_ typedef struct span_sched_state_s span_sched_state_t; typedef void (*span_sched_callback_func_t)(span_sched_state_t *s, void *user_data); /*! A scheduled event entry. */ typedef struct { uint64_t when; span_sched_callback_func_t callback; void *user_data; } span_sched_t; /*! A scheduled event queue. */ struct span_sched_state_s { uint64_t ticker; int allocated; int max_to_date; span_sched_t *sched; logging_state_t logging; }; #if defined(__cplusplus) extern "C" { #endif uint64_t span_schedule_next(span_sched_state_t *s); uint64_t span_schedule_time(span_sched_state_t *s); int span_schedule_event(span_sched_state_t *s, int us, span_sched_callback_func_t function, void *user_data); void span_schedule_update(span_sched_state_t *s, int us); void span_schedule_del(span_sched_state_t *s, int id); span_sched_state_t *span_schedule_init(span_sched_state_t *s); int span_schedule_release(span_sched_state_t *s); #if defined(__cplusplus) } #endif #endif /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/spandsp/tone_detect.h0000644000175000017500000002076111150047205021777 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * tone_detect.h - General telephony tone detection. * * Written by Steve Underwood * * Copyright (C) 2001, 2005 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: tone_detect.h,v 1.41 2008/06/13 14:46:52 steveu Exp $ */ #if !defined(_SPANDSP_TONE_DETECT_H_) #define _SPANDSP_TONE_DETECT_H_ /*! Goertzel filter descriptor. */ typedef struct { #if defined(SPANDSP_USE_FIXED_POINT) int16_t fac; #else float fac; #endif int samples; } goertzel_descriptor_t; /*! Goertzel filter state descriptor. */ typedef struct { #if defined(SPANDSP_USE_FIXED_POINT) int16_t v2; int16_t v3; int16_t fac; #else float v2; float v3; float fac; #endif int samples; int current_sample; } goertzel_state_t; #if defined(__cplusplus) extern "C" { #endif /*! \brief Create a descriptor for use with either a Goertzel transform */ void make_goertzel_descriptor(goertzel_descriptor_t *t, float freq, int samples); /*! \brief Initialise the state of a Goertzel transform. \param s The Goertzel context. If NULL, a context is allocated with malloc. \param t The Goertzel descriptor. \return A pointer to the Goertzel state. */ goertzel_state_t *goertzel_init(goertzel_state_t *s, goertzel_descriptor_t *t); /*! \brief Reset the state of a Goertzel transform. \param s The Goertzel context. */ void goertzel_reset(goertzel_state_t *s); /*! \brief Update the state of a Goertzel transform. \param s The Goertzel context. \param amp The samples to be transformed. \param samples The number of samples. \return The number of samples unprocessed */ int goertzel_update(goertzel_state_t *s, const int16_t amp[], int samples); /*! \brief Evaluate the final result of a Goertzel transform. \param s The Goertzel context. \return The result of the transform. The expected result for a pure sine wave signal of level x dBm0, at the very centre of the bin is: [Floating point] ((samples_per_goertzel_block*32768.0/1.4142)*10^((x - DBM0_MAX_SINE_POWER)/20.0))^2 [Fixed point] ((samples_per_goertzel_block*256.0/1.4142)*10^((x - DBM0_MAX_SINE_POWER)/20.0))^2 */ #if defined(SPANDSP_USE_FIXED_POINT) int32_t goertzel_result(goertzel_state_t *s); #else float goertzel_result(goertzel_state_t *s); #endif /*! \brief Update the state of a Goertzel transform. \param s The Goertzel context. \param amp The sample to be transformed. */ static __inline__ void goertzel_sample(goertzel_state_t *s, int16_t amp) { #if defined(SPANDSP_USE_FIXED_POINT) int16_t x; int16_t v1; #else float v1; #endif v1 = s->v2; s->v2 = s->v3; #if defined(SPANDSP_USE_FIXED_POINT) x = (((int32_t) s->fac*s->v2) >> 14); /* Scale down the input signal to avoid overflows. 9 bits is enough to monitor the signals of interest with adequate dynamic range and resolution. In telephony we generally only start with 13 or 14 bits, anyway. */ s->v3 = x - v1 + (amp >> 7); #else s->v3 = s->fac*s->v2 - v1 + amp; #endif s->current_sample++; } /*- End of function --------------------------------------------------------*/ /* Scale down the input signal to avoid overflows. 9 bits is enough to monitor the signals of interest with adequate dynamic range and resolution. In telephony we generally only start with 13 or 14 bits, anyway. This is sufficient for the longest Goertzel we currently use. */ #if defined(SPANDSP_USE_FIXED_POINT) #define goertzel_preadjust_amp(amp) (((int16_t) amp) >> 7) #else #define goertzel_preadjust_amp(amp) ((float) amp) #endif /* Minimal update the state of a Goertzel transform. This is similar to goertzel_sample, but more suited to blocks of Goertzels. It assumes the amplitude is pre-shifted, and does not update the per-state sample count. \brief Update the state of a Goertzel transform. \param s The Goertzel context. \param amp The adjusted sample to be transformed. */ #if defined(SPANDSP_USE_FIXED_POINT) static __inline__ void goertzel_samplex(goertzel_state_t *s, int16_t amp) #else static __inline__ void goertzel_samplex(goertzel_state_t *s, float amp) #endif { #if defined(SPANDSP_USE_FIXED_POINT) int16_t x; int16_t v1; #else float v1; #endif v1 = s->v2; s->v2 = s->v3; #if defined(SPANDSP_USE_FIXED_POINT) x = (((int32_t) s->fac*s->v2) >> 14); s->v3 = x - v1 + amp; #else s->v3 = s->fac*s->v2 - v1 + amp; #endif } /*- End of function --------------------------------------------------------*/ /*! Generate a Hamming weighted coefficient set, to be used for a periodogram analysis. \param coeffs The generated coefficients. \param freq The frequency to be matched by the periodogram, in Hz. \param sample_rate The sample rate of the signal, in samples per second. \param window_len The length of the periodogram window. This must be an even number. \return The number of generated coefficients. */ int periodogram_generate_coeffs(complexf_t coeffs[], float freq, int sample_rate, int window_len); /*! Generate the phase offset to be expected between successive periodograms evaluated at the specified interval. \param offset A point to the generated phase offset. \param freq The frequency being matched by the periodogram, in Hz. \param sample_rate The sample rate of the signal, in samples per second. \param interval The interval between periodograms, in samples. \return The scaling factor. */ float periodogram_generate_phase_offset(complexf_t *offset, float freq, int sample_rate, int interval); /*! Evaluate a periodogram. \param coeffs A set of coefficients generated by periodogram_generate_coeffs(). \param amp The complex amplitude of the signal. \param len The length of the periodogram, in samples. This must be an even number. \return The periodogram result. */ complexf_t periodogram(const complexf_t coeffs[], const complexf_t amp[], int len); /*! Prepare data for evaluating a set of periodograms. \param sum A vector of sums of pairs of signal samples. This will be half the length of len. \param diff A vector of differences between pairs of signal samples. This will be half the length of len. \param amp The complex amplitude of the signal. \param len The length of the periodogram, in samples. This must be an even number. \return The length of the vectors sum and diff. */ int periodogram_prepare(complexf_t sum[], complexf_t diff[], const complexf_t amp[], int len); /*! Evaluate a periodogram, based on data prepared by periodogram_prepare(). This is more efficient than using periodogram() when several periodograms are to be applied to the same signal. \param coeffs A set of coefficients generated by periodogram_generate_coeffs(). \param sum A vector of sums produced by periodogram_prepare(). \param diff A vector of differences produced by periodogram_prepare(). \param len The length of the periodogram, in samples. This must be an even number. \return The periodogram result. */ complexf_t periodogram_apply(const complexf_t coeffs[], const complexf_t sum[], const complexf_t diff[], int len); /*! Apply a phase offset, to find the frequency error between periodogram evaluations. specified interval. \param phase_offset A point to the expected phase offset. \param scale The scaling factor to be used. \param last_result A pointer to the previous periodogram result. \param result A pointer to the current periodogram result. \return The frequency error, in Hz. */ float periodogram_freq_error(const complexf_t *phase_offset, float scale, const complexf_t *last_result, const complexf_t *result); #if defined(__cplusplus) } #endif #endif /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/spandsp/silence_gen.h0000644000175000017500000001047611150047205021757 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * silence_gen.c - A silence generator, for inserting timed silences. * * Written by Steve Underwood * * Copyright (C) 2006 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: silence_gen.h,v 1.11 2008/07/16 17:54:23 steveu Exp $ */ #if !defined(_SPANDSP_SILENCE_GEN_H_) #define _SPANDSP_SILENCE_GEN_H_ typedef struct { /*! \brief The callback function used to report status changes. */ modem_tx_status_func_t status_handler; /*! \brief A user specified opaque pointer passed to the status function. */ void *status_user_data; int remaining_samples; int total_samples; } silence_gen_state_t; #if defined(__cplusplus) extern "C" { #endif /*! Generate a block of silent audio samples. \brief Generate a block of silent audio samples. \param s The silence generator context. \param amp The audio sample buffer. \param max_len The number of samples to be generated. \return The number of samples actually generated. This will be zero when there is nothing to send. */ int silence_gen(silence_gen_state_t *s, int16_t *amp, int max_len); /*! Set a silence generator context to output continuous silence. \brief Set a silence generator context to output continuous silence. \param s The silence generator context. */ void silence_gen_always(silence_gen_state_t *s); /*! Set a silence generator context to output a specified period of silence. \brief Set a silence generator context to output a specified period of silence. \param s The silence generator context. \param silent_samples The number of samples to be generated. */ void silence_gen_set(silence_gen_state_t *s, int silent_samples); /*! Alter the period of a silence generator context by a specified amount. \brief Alter the period of a silence generator context by a specified amount. \param s The silence generator context. \param silent_samples The number of samples to change the setting by. A positive number increases the duration. A negative number reduces it. The duration is prevented from going negative. */ void silence_gen_alter(silence_gen_state_t *s, int silent_samples); /*! Find how long a silence generator context has to run. \brief Find how long a silence generator context has to run. \param s The silence generator context. \return The number of samples remaining. */ int silence_gen_remainder(silence_gen_state_t *s); /*! Find the total silence generated to date by a silence generator context. \brief Find the total silence generated to date. \param s The silence generator context. \return The number of samples generated. */ int silence_gen_generated(silence_gen_state_t *s); /*! Change the status reporting function associated with a silence generator context. \brief Change the status reporting function associated with a silence generator context. \param s The silence generator context. \param handler The callback routine used to report status changes. \param user_data An opaque pointer. */ void silence_gen_status_handler(silence_gen_state_t *s, modem_tx_status_func_t handler, void *user_data); /*! Initialise a timed silence generator context. \brief Initialise a timed silence generator context. \param s The silence generator context. \param silent_samples The initial number of samples to set the silence to. \return A pointer to the silence generator context. */ silence_gen_state_t *silence_gen_init(silence_gen_state_t *s, int silent_samples); #if defined(__cplusplus) } #endif #endif /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/spandsp/super_tone_rx.h0000644000175000017500000001464611150047205022403 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * super_tone_rx.h - Flexible telephony supervisory tone detection. * * Written by Steve Underwood * * Copyright (C) 2003 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: super_tone_rx.h,v 1.17 2008/06/13 14:46:52 steveu Exp $ */ #if !defined(_SPANDSP_SUPER_TONE_RX_H_) #define _SPANDSP_SUPER_TONE_RX_H_ /*! \page super_tone_rx_page Supervisory tone detection \section super_tone_rx_page_sec_1 What does it do? The supervisory tone detector may be configured to detect most of the world's telephone supervisory tones - things like ringback, busy, number unobtainable, and so on. \section super_tone_rx_page_sec_2 How does it work? The supervisory tone detector is passed a series of data structures describing the tone patterns - the frequencies and cadencing - of the tones to be searched for. It constructs one or more Goertzel filters to monitor the required tones. If tones are close in frequency a single Goertzel set to the centre of the frequency range will be used. This optimises the efficiency of the detector. The Goertzel filters are applied without applying any special window functional (i.e. they use a rectangular window), so they have a sinc like response. However, for most tone patterns their rejection qualities are adequate. The detector aims to meet the need of the standard call progress tones, to ITU-T E.180/Q.35 (busy, dial, ringback, reorder). Also, the extended tones, to ITU-T E.180, Supplement 2 and EIA/TIA-464-A (recall dial tone, special ringback tone, intercept tone, call waiting tone, busy verification tone, executive override tone, confirmation tone). */ /*! Tone detection indication callback routine */ typedef void (*tone_report_func_t)(void *user_data, int code, int level, int delay); #define BINS 128 typedef struct { int f1; int f2; int recognition_duration; int min_duration; int max_duration; } super_tone_rx_segment_t; typedef struct { int used_frequencies; int monitored_frequencies; int pitches[BINS/2][2]; int tones; super_tone_rx_segment_t **tone_list; int *tone_segs; goertzel_descriptor_t *desc; } super_tone_rx_descriptor_t; typedef struct { super_tone_rx_descriptor_t *desc; float energy; int detected_tone; int rotation; tone_report_func_t tone_callback; void (*segment_callback)(void *data, int f1, int f2, int duration); void *callback_data; super_tone_rx_segment_t segments[11]; goertzel_state_t state[]; } super_tone_rx_state_t; #if defined(__cplusplus) extern "C" { #endif /*! Create a new supervisory tone detector descriptor. \param desc The supervisory tone set desciptor. If NULL, the routine will allocate space for a descriptor. \return The supervisory tone set descriptor. */ super_tone_rx_descriptor_t *super_tone_rx_make_descriptor(super_tone_rx_descriptor_t *desc); /*! Free a supervisory tone detector descriptor. \param desc The supervisory tone set desciptor. \return 0 for OK, -1 for fail. */ int super_tone_rx_free_descriptor(super_tone_rx_descriptor_t *desc); /*! Add a new tone pattern to a supervisory tone detector set. \param desc The supervisory tone set descriptor. \return The new tone ID. */ int super_tone_rx_add_tone(super_tone_rx_descriptor_t *desc); /*! Add a new tone pattern element to a tone pattern in a supervisory tone detector. \param desc The supervisory tone set desciptor. \param tone The tone ID within the descriptor. \param f1 Frequency 1 (-1 for a silent period). \param f2 Frequency 2 (-1 for a silent period, or only one frequency). \param min The minimum duration, in ms. \param max The maximum duration, in ms. \return The new number of elements in the tone description. */ int super_tone_rx_add_element(super_tone_rx_descriptor_t *desc, int tone, int f1, int f2, int min, int max); /*! Initialise a supervisory tone detector. \param s The supervisory tone detector context. \param desc The tone descriptor. \param callback The callback routine called to report the valid detection or termination of one of the monitored tones. \param user_data An opaque pointer passed when calling the callback routine. \return The supervisory tone detector context. */ super_tone_rx_state_t *super_tone_rx_init(super_tone_rx_state_t *s, super_tone_rx_descriptor_t *desc, tone_report_func_t callback, void *user_data); /*! Release a supervisory tone detector. \param s The supervisory tone context. \return 0 for OK, -1 for fail. */ int super_tone_rx_free(super_tone_rx_state_t *s); /*! Define a callback routine to be called each time a tone pattern element is complete. This is mostly used when analysing a tone. \param s The supervisory tone context. \param callback The callback routine. */ void super_tone_rx_segment_callback(super_tone_rx_state_t *s, void (*callback)(void *data, int f1, int f2, int duration)); /*! Apply supervisory tone detection processing to a block of audio samples. \brief Apply supervisory tone detection processing to a block of audio samples. \param super The supervisory tone context. \param amp The audio sample buffer. \param samples The number of samples in the buffer. \return The number of samples processed. */ int super_tone_rx(super_tone_rx_state_t *super, const int16_t amp[], int samples); #if defined(__cplusplus) } #endif #endif /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/spandsp/t31.h0000644000175000017500000002343011150047205020105 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * t31.h - A T.31 compatible class 1 FAX modem interface. * * Written by Steve Underwood * * Copyright (C) 2004 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: t31.h,v 1.50 2008/07/25 13:56:54 steveu Exp $ */ /*! \file */ #if !defined(_SPANDSP_T31_H_) #define _SPANDSP_T31_H_ /*! \page t31_page T.31 Class 1 FAX modem protocol handling \section t31_page_sec_1 What does it do? The T.31 class 1 FAX modem modules implements a class 1 interface to the FAX modems in spandsp. \section t31_page_sec_2 How does it work? */ typedef struct t31_state_s t31_state_t; typedef int (t31_modem_control_handler_t)(t31_state_t *s, void *user_data, int op, const char *num); #define T31_TX_BUF_LEN (4096) #define T31_TX_BUF_HIGH_TIDE (4096 - 1024) #define T31_TX_BUF_LOW_TIDE (1024) #define T31_MAX_HDLC_LEN 284 #define T31_T38_MAX_HDLC_LEN 260 /*! Analogue FAX front end channel descriptor. This defines the state of a single working instance of an analogue line FAX front end. */ typedef struct { /*! TRUE is talker echo protection should be sent for the image modems */ int use_tep; /*! If TRUE, transmit silence when there is nothing else to transmit. If FALSE return only the actual generated audio. Note that this only affects untimed silences. Timed silences (e.g. the 75ms silence between V.21 and a high speed modem) will alway be transmitted as silent audio. */ int transmit_on_idle; fax_modems_t modems; /*! The current receive signal handler */ span_rx_handler_t *rx_handler; void *rx_user_data; /*! The current transmit signal handler */ span_tx_handler_t *tx_handler; void *tx_user_data; /*! The transmit signal handler to be used when the current one has finished sending. */ span_tx_handler_t *next_tx_handler; void *next_tx_user_data; /*! \brief No of data bits in current_byte. */ int bit_no; /*! \brief The current data byte in progress. */ int current_byte; /*! \brief Rx power meter, used to detect silence. */ power_meter_t rx_power; /*! \brief Last sample, used for an elementary HPF for the power meter. */ int16_t last_sample; /*! \brief The current silence threshold. */ int32_t silence_threshold_power; /*! \brief Samples of silence heard */ int silence_heard; } t31_audio_front_end_state_t; /*! Analogue FAX front end channel descriptor. This defines the state of a single working instance of an analogue line FAX front end. */ typedef struct { t38_core_state_t t38; /*! \brief The number of octets to send in each image packet (non-ECM or ECM) at the current rate and the current specified packet interval. */ int octets_per_data_packet; int timed_step; int ms_per_tx_chunk; int merge_tx_fields; /*! \brief TRUE is there has been some T.38 data missed */ int missing_data; /*! \brief The number of times an indicator packet will be sent. Numbers greater than one will increase reliability for UDP transmission. Zero is valid, to suppress all indicator packets for TCP transmission. */ int indicator_tx_count; /*! \brief The number of times a data packet which ends transmission will be sent. Numbers greater than one will increase reliability for UDP transmission. Zero is not valid. */ int data_end_tx_count; /*! \brief The current T.38 data type being transmitted */ int current_tx_data_type; /*! \brief The next queued tramsit indicator */ int next_tx_indicator; int trailer_bytes; struct { uint8_t buf[T31_T38_MAX_HDLC_LEN]; int len; } hdlc_rx; int current_rx_type; int current_tx_type; int32_t next_tx_samples; int32_t timeout_rx_samples; /*! \brief A "sample" count, used to time events */ int32_t samples; } t31_t38_front_end_state_t; /*! T.31 descriptor. This defines the working state for a single instance of a T.31 FAX modem. */ struct t31_state_s { at_state_t at_state; t31_modem_control_handler_t *modem_control_handler; void *modem_control_user_data; t31_audio_front_end_state_t audio; t31_t38_front_end_state_t t38_fe; /*! TRUE if working in T.38 mode. */ int t38_mode; /*! HDLC buffer, for composing an HDLC frame from the computer to the channel. */ struct { uint8_t buf[T31_MAX_HDLC_LEN]; int len; int ptr; /*! \brief TRUE when the end of HDLC data from the computer has been detected. */ int final; } hdlc_tx; /*! Buffer for data from the computer to the channel. */ struct { uint8_t data[T31_TX_BUF_LEN]; /*! \brief The number of bytes stored in transmit buffer. */ int in_bytes; /*! \brief The number of bytes sent from the transmit buffer. */ int out_bytes; /*! \brief TRUE if the flow of real data has started. */ int data_started; /*! \brief TRUE if holding up further data into the buffer, for flow control. */ int holding; /*! \brief TRUE when the end of non-ECM data from the computer has been detected. */ int final; } tx; /*! TRUE if DLE prefix just used */ int dled; /*! \brief Samples of silence awaited, as specified in a "wait for silence" command */ int silence_awaited; /*! \brief The current bit rate for the FAX fast message transfer modem. */ int bit_rate; int rx_message_received; /*! \brief Samples elapsed in the current call */ int64_t call_samples; int64_t dte_data_timeout; /*! \brief The currently queued modem type. */ int modem; /*! \brief TRUE when short training mode has been selected by the computer. */ int short_train; queue_state_t *rx_queue; /*! \brief Error and flow logging control */ logging_state_t logging; }; #if defined(__cplusplus) extern "C" { #endif void t31_call_event(t31_state_t *s, int event); int t31_at_rx(t31_state_t *s, const char *t, int len); /*! Process a block of received T.31 modem audio samples. \brief Process a block of received T.31 modem audio samples. \param s The T.31 modem context. \param amp The audio sample buffer. \param len The number of samples in the buffer. \return The number of samples unprocessed. */ int t31_rx(t31_state_t *s, int16_t amp[], int len); /*! Generate a block of T.31 modem audio samples. \brief Generate a block of T.31 modem audio samples. \param s The T.31 modem context. \param amp The audio sample buffer. \param max_len The number of samples to be generated. \return The number of samples actually generated. */ int t31_tx(t31_state_t *s, int16_t amp[], int max_len); int t31_t38_send_timeout(t31_state_t *s, int samples); /*! Select whether silent audio will be sent when transmit is idle. \brief Select whether silent audio will be sent when transmit is idle. \param s The T.31 modem context. \param transmit_on_idle TRUE if silent audio should be output when the transmitter is idle. FALSE to transmit zero length audio when the transmitter is idle. The default behaviour is FALSE. */ void t31_set_transmit_on_idle(t31_state_t *s, int transmit_on_idle); /*! Select whether TEP mode will be used (or time allowed for it (when transmitting). \brief Select whether TEP mode will be used. \param s The T.31 modem context. \param use_tep TRUE if TEP is to be ised. */ void t31_set_tep_mode(t31_state_t *s, int use_tep); /*! Select whether T.38 data will be paced as it is transmitted. \brief Select whether T.38 data will be paced. \param s The T.31 modem context. \param without_pacing TRUE if data is to be sent as fast as possible. FALSE if it is to be paced. */ void t31_set_t38_config(t31_state_t *s, int without_pacing); /*! Initialise a T.31 context. This must be called before the first use of the context, to initialise its contents. \brief Initialise a T.31 context. \param s The T.31 context. \param at_tx_handler A callback routine to handle AT interpreter channel output. \param at_tx_user_data An opaque pointer passed in called to at_tx_handler. \param modem_control_handler A callback routine to handle control of the modem (off-hook, etc). \param modem_control_user_data An opaque pointer passed in called to modem_control_handler. \param tx_t38_packet_handler ??? \param tx_t38_packet_user_data ??? \return A pointer to the T.31 context. */ t31_state_t *t31_init(t31_state_t *s, at_tx_handler_t *at_tx_handler, void *at_tx_user_data, t31_modem_control_handler_t *modem_control_handler, void *modem_control_user_data, t38_tx_packet_handler_t *tx_t38_packet_handler, void *tx_t38_packet_user_data); /*! Release a T.31 context. \brief Release a T.31 context. \param s The T.31 context. \return 0 for OK */ int t31_release(t31_state_t *s); #if defined(__cplusplus) } #endif #endif /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/spandsp/fax.h0000644000175000017500000001424311150047205020256 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * fax.h - definitions for analogue line ITU T.30 fax processing * * Written by Steve Underwood * * Copyright (C) 2005 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: fax.h,v 1.32 2008/07/25 13:56:54 steveu Exp $ */ /*! \file */ #if !defined(_SPANDSP_FAX_H_) #define _SPANDSP_FAX_H_ /*! \page fax_page FAX over analogue modem handling \section fax_page_sec_1 What does it do? \section fax_page_sec_2 How does it work? */ typedef struct fax_state_s fax_state_t; typedef void (fax_flush_handler_t)(fax_state_t *s, void *user_data, int which); /*! Analogue FAX front end channel descriptor. This defines the state of a single working instance of an analogue line FAX front end. */ typedef struct { /*! TRUE is talker echo protection should be sent for the image modems */ int use_tep; /*! If TRUE, transmit silence when there is nothing else to transmit. If FALSE return only the actual generated audio. Note that this only affects untimed silences. Timed silences (e.g. the 75ms silence between V.21 and a high speed modem) will alway be transmitted as silent audio. */ int transmit_on_idle; fax_modems_t modems; fax_flush_handler_t *flush_handler; void *flush_user_data; /*! The current receive signal handler */ span_rx_handler_t *rx_handler; void *rx_user_data; /*! The current transmit signal handler */ span_tx_handler_t *tx_handler; void *tx_user_data; /*! The transmit signal handler to be used when the current one has finished sending. */ span_tx_handler_t *next_tx_handler; void *next_tx_user_data; /*! If TRUE, transmission is in progress */ int transmit; /*! \brief TRUE is the short training sequence should be used. */ int short_train; /*! \brief The currently select receiver type */ int current_rx_type; /*! \brief The currently select transmitter type */ int current_tx_type; /*! \brief Audio logging file handle for received audio. */ int fax_audio_rx_log; /*! \brief Audio logging file handle for transmitted audio. */ int fax_audio_tx_log; } fax_modem_front_end_state_t; /*! Analogue line T.30 FAX channel descriptor. This defines the state of a single working instance of an analogue line soft-FAX machine. */ struct fax_state_s { /* This must be kept the first thing in the structure, so it can be pointed to reliably as the structures change over time. */ /*! \brief The T.30 back-end */ t30_state_t t30; /*! \brief The analogue modem front-end */ fax_modem_front_end_state_t fe; /*! \brief Error and flow logging control */ logging_state_t logging; }; #if defined(__cplusplus) extern "C" { #endif /*! Apply T.30 receive processing to a block of audio samples. \brief Apply T.30 receive processing to a block of audio samples. \param s The FAX context. \param amp The audio sample buffer. \param len The number of samples in the buffer. \return The number of samples unprocessed. This should only be non-zero if the software has reached the end of the FAX call. */ int fax_rx(fax_state_t *s, int16_t *amp, int len); /*! Apply T.30 transmit processing to generate a block of audio samples. \brief Apply T.30 transmit processing to generate a block of audio samples. \param s The FAX context. \param amp The audio sample buffer. \param max_len The number of samples to be generated. \return The number of samples actually generated. This will be zero when there is nothing to send. */ int fax_tx(fax_state_t *s, int16_t *amp, int max_len); void fax_set_flush_handler(fax_state_t *s, fax_flush_handler_t *handler, void *user_data); /*! Select whether silent audio will be sent when FAX transmit is idle. \brief Select whether silent audio will be sent when FAX transmit is idle. \param s The FAX context. \param transmit_on_idle TRUE if silent audio should be output when the FAX transmitter is idle. FALSE to transmit zero length audio when the FAX transmitter is idle. The default behaviour is FALSE. */ void fax_set_transmit_on_idle(fax_state_t *s, int transmit_on_idle); /*! Select whether talker echo protection tone will be sent for the image modems. \brief Select whether TEP will be sent for the image modems. \param s The FAX context. \param use_tep TRUE if TEP should be sent. */ void fax_set_tep_mode(fax_state_t *s, int use_tep); /*! Get a pointer to the T.30 engine associated with a FAX context. \brief Get a pointer to the T.30 engine associated with a FAX context. \param s The FAX context. \return A pointer to the T.30 context, or NULL. */ t30_state_t *fax_get_t30_state(fax_state_t *s); /*! Initialise a FAX context. \brief Initialise a FAX context. \param s The FAX context. \param calling_party TRUE if the context is for a calling party. FALSE if the context is for an answering party. \return A pointer to the FAX context, or NULL if there was a problem. */ fax_state_t *fax_init(fax_state_t *s, int calling_party); /*! Release a FAX context. \brief Release a FAX context. \param s The FAX context. \return 0 for OK, else -1. */ int fax_release(fax_state_t *s); /*! Free a FAX context. \brief Free a FAX context. \param s The FAX context. \return 0 for OK, else -1. */ int fax_free(fax_state_t *s); #if defined(__cplusplus) } #endif #endif /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/spandsp/dc_restore.h0000644000175000017500000000756211150047205021637 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * dc_restore.h - General telephony routines to restore the zero D.C. * level to audio which has a D.C. bias. * * Written by Steve Underwood * * Copyright (C) 2001 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: dc_restore.h,v 1.22 2008/06/30 16:48:30 steveu Exp $ */ /*! \file */ #if !defined(_SPANDSP_DC_RESTORE_H_) #define _SPANDSP_DC_RESTORE_H_ /*! \page dc_restore_page Removing DC bias from a signal \section dc_restore_page_sec_1 What does it do? Telecoms signals often contain considerable DC, but DC upsets a lot of signal processing functions. Placing a zero DC restorer at the front of the processing chain can often simplify the downstream processing. \section dc_restore_page_sec_2 How does it work? The DC restorer uses a leaky integrator to provide a long-ish term estimate of the DC bias in the signal. A 32 bit estimate is used for the 16 bit audio, so the noise introduced by the estimation can be keep in the lower bits, and the 16 bit DC value, which is subtracted from the signal, is fairly clean. The following code fragment shows the algorithm used. dc_bias is a 32 bit integer, while the sample and the resulting clean_sample are 16 bit integers. dc_bias += ((((int32_t) sample << 15) - dc_bias) >> 14); clean_sample = sample - (dc_bias >> 15); */ /*! Zero DC restoration descriptor. This defines the working state for a single instance of DC content filter. */ typedef struct { int32_t state; } dc_restore_state_t; #if defined(__cplusplus) extern "C" { #endif static __inline__ void dc_restore_init(dc_restore_state_t *dc) { dc->state = 0; } /*- End of function --------------------------------------------------------*/ static __inline__ int16_t dc_restore(dc_restore_state_t *dc, int16_t sample) { dc->state += ((((int32_t) sample << 15) - dc->state) >> 14); return (int16_t) (sample - (dc->state >> 15)); } /*- End of function --------------------------------------------------------*/ static __inline__ int16_t dc_restore_estimate(dc_restore_state_t *dc) { return (int16_t) (dc->state >> 15); } /*- End of function --------------------------------------------------------*/ static __inline__ int16_t saturate(int32_t amp) { int16_t amp16; /* Hopefully this is optimised for the common case - not clipping */ amp16 = (int16_t) amp; if (amp == amp16) return amp16; if (amp > INT16_MAX) return INT16_MAX; return INT16_MIN; } /*- End of function --------------------------------------------------------*/ static __inline__ int16_t fsaturatef(float famp) { if (famp > 32767.0) return INT16_MAX; if (famp < -32768.0) return INT16_MIN; return (int16_t) rintf(famp); } /*- End of function --------------------------------------------------------*/ static __inline__ int16_t fsaturate(double damp) { if (damp > 32767.0) return INT16_MAX; if (damp < -32768.0) return INT16_MIN; return (int16_t) rint(damp); } /*- End of function --------------------------------------------------------*/ #if defined(__cplusplus) } #endif #endif /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/spandsp/version.h.in0000644000175000017500000000240011150047205021562 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * version.h - A tag file, so the exact installed revision can be assertained. * * Written by Steve Underwood * * Copyright (C) 2007 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2, as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: version.h.in,v 1.2 2007/04/06 13:20:36 steveu Exp $ */ #if !defined(_SPANDSP_VERSION_H_) #define _SPANDSP_VERSION_H_ /* The date and time of the version are in UTC form. */ #define SPANDSP_RELEASE_DATE $SPANDSP_RELEASE_DATE #define SPANDSP_RELEASE_TIME $SPANDSP_RELEASE_TIME #endif /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/spandsp/dtmf.h0000644000175000017500000002537311150047205020440 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * dtmf.h - * * Written by Steve Underwood * * Copyright (C) 2001, 2005 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: dtmf.h,v 1.28 2008/06/13 14:46:52 steveu Exp $ */ #if !defined(_SPANDSP_DTMF_H_) #define _SPANDSP_DTMF_H_ /*! \page dtmf_rx_page DTMF receiver \section dtmf_rx_page_sec_1 What does it do? The DTMF receiver detects the standard DTMF digits. It is compliant with ITU-T Q.23, ITU-T Q.24, and the local DTMF specifications of most administrations. Its passes the test suites. It also scores *very* well on the standard talk-off tests. The current design uses floating point extensively. It is not tolerant of DC. It is expected that a DC restore stage will be placed before the DTMF detector. Unless the dial tone filter is switched on, the detector has poor tolerance of dial tone. Whether this matter depends on your application. If you are using the detector in an IVR application you will need proper echo cancellation to get good performance in the presence of speech prompts, so dial tone will not exist. If you do need good dial tone tolerance, a dial tone filter can be enabled in the detector. The DTMF receiver's design assumes the channel is free of any DC component. \section dtmf_rx_page_sec_2 How does it work? Like most other DSP based DTMF detector's, this one uses the Goertzel algorithm to look for the DTMF tones. What makes each detector design different is just how that algorithm is used. Basic DTMF specs: - Minimum tone on = 40ms - Minimum tone off = 50ms - Maximum digit rate = 10 per second - Normal twist <= 8dB accepted - Reverse twist <= 4dB accepted - S/N >= 15dB will detect OK - Attenuation <= 26dB will detect OK - Frequency tolerance +- 1.5% will detect, +-3.5% will reject TODO: */ /*! \page dtmf_tx_page DTMF tone generation \section dtmf_tx_page_sec_1 What does it do? The DTMF tone generation module provides for the generation of the repertoire of 16 DTMF dual tones. \section dtmf_tx_page_sec_2 How does it work? */ #define MAX_DTMF_DIGITS 128 typedef void (*digits_rx_callback_t)(void *user_data, const char *digits, int len); /*! DTMF generator state descriptor. This defines the state of a single working instance of a DTMF generator. */ typedef struct { tone_gen_state_t tones; float low_level; float high_level; int on_time; int off_time; union { queue_state_t queue; uint8_t buf[QUEUE_STATE_T_SIZE(MAX_DTMF_DIGITS)]; } queue; } dtmf_tx_state_t; /*! DTMF digit detector descriptor. */ typedef struct { /*! Optional callback funcion to deliver received digits. */ digits_rx_callback_t digits_callback; /*! An opaque pointer passed to the callback function. */ void *digits_callback_data; /*! Optional callback funcion to deliver real time digit state changes. */ tone_report_func_t realtime_callback; /*! An opaque pointer passed to the real time callback function. */ void *realtime_callback_data; /*! TRUE if dialtone should be filtered before processing */ int filter_dialtone; #if defined(SPANDSP_USE_FIXED_POINT) /*! 350Hz filter state for the optional dialtone filter. */ float z350[2]; /*! 440Hz filter state for the optional dialtone filter. */ float z440[2]; /*! Maximum acceptable "normal" (lower bigger than higher) twist ratio. */ float normal_twist; /*! Maximum acceptable "reverse" (higher bigger than lower) twist ratio. */ float reverse_twist; /*! Minimum acceptable tone level for detection. */ int32_t threshold; /*! The accumlating total energy on the same period over which the Goertzels work. */ int32_t energy; #else /*! 350Hz filter state for the optional dialtone filter. */ float z350[2]; /*! 440Hz filter state for the optional dialtone filter. */ float z440[2]; /*! Maximum acceptable "normal" (lower bigger than higher) twist ratio. */ float normal_twist; /*! Maximum acceptable "reverse" (higher bigger than lower) twist ratio. */ float reverse_twist; /*! Minimum acceptable tone level for detection. */ float threshold; /*! The accumlating total energy on the same period over which the Goertzels work. */ float energy; #endif /*! Tone detector working states for the row tones. */ goertzel_state_t row_out[4]; /*! Tone detector working states for the column tones. */ goertzel_state_t col_out[4]; /*! The result of the last tone analysis. */ uint8_t last_hit; /*! The confirmed digit we are currently receiving */ uint8_t in_digit; /*! The current sample number within a processing block. */ int current_sample; /*! The number of digits which have been lost due to buffer overflows. */ int lost_digits; /*! The number of digits currently in the digit buffer. */ int current_digits; /*! The received digits buffer. This is a NULL terminated string. */ char digits[MAX_DTMF_DIGITS + 1]; } dtmf_rx_state_t; #if defined(__cplusplus) extern "C" { #endif /*! \brief Generate a buffer of DTMF tones. \param s The DTMF generator context. \param amp The buffer for the generated signal. \param max_samples The required number of generated samples. \return The number of samples actually generated. This may be less than max_samples if the input buffer empties. */ int dtmf_tx(dtmf_tx_state_t *s, int16_t amp[], int max_samples); /*! \brief Put a string of digits in a DTMF generator's input buffer. \param s The DTMF generator context. \param digits The string of digits to be added. \param len The length of the string of digits. If negative, the string is assumed to be a NULL terminated string. \return The number of digits actually added. This may be less than the length of the digit string, if the buffer fills up. */ size_t dtmf_tx_put(dtmf_tx_state_t *s, const char *digits, int len); /*! \brief Change the transmit level for a DTMF tone generator context. \param s The DTMF generator context. \param level The level of the low tone, in dBm0. \param twist The twist, in dB. */ void dtmf_tx_set_level(dtmf_tx_state_t *s, int level, int twist); /*! \brief Change the transmit on and off time for a DTMF tone generator context. \param s The DTMF generator context. \param on-time The on time, in ms. \param off_time The off time, in ms. */ void dtmf_tx_set_timing(dtmf_tx_state_t *s, int on_time, int off_time); /*! \brief Initialise a DTMF tone generator context. \param s The DTMF generator context. \return A pointer to the DTMF generator context. */ dtmf_tx_state_t *dtmf_tx_init(dtmf_tx_state_t *s); /*! \brief Free a DTMF tone generator context. \param s The DTMF tone generator context. \return 0 for OK, else -1. */ int dtmf_tx_free(dtmf_tx_state_t *s); /*! Set a optional realtime callback for a DTMF receiver context. This function is called immediately a confirmed state change occurs in the received DTMF. It is called with the ASCII value for a DTMF tone pair, or zero to indicate no tone is being received. \brief Set a realtime callback for a DTMF receiver context. \param s The DTMF receiver context. \param callback Callback routine used to report the start and end of digits. \param user_data An opaque pointer which is associated with the context, and supplied in callbacks. */ void dtmf_rx_set_realtime_callback(dtmf_rx_state_t *s, tone_report_func_t callback, void *user_data); /*! \brief Adjust a DTMF receiver context. \param s The DTMF receiver context. \param filter_dialtone TRUE to enable filtering of dialtone, FALSE to disable, < 0 to leave unchanged. \param twist Acceptable twist, in dB. < 0 to leave unchanged. \param reverse_twist Acceptable reverse twist, in dB. < 0 to leave unchanged. \param threshold The minimum acceptable tone level for detection, in dBm0. <= -99 to leave unchanged. */ void dtmf_rx_parms(dtmf_rx_state_t *s, int filter_dialtone, int twist, int reverse_twist, int threshold); /*! Process a block of received DTMF audio samples. \brief Process a block of received DTMF audio samples. \param s The DTMF receiver context. \param amp The audio sample buffer. \param samples The number of samples in the buffer. \return The number of samples unprocessed. */ int dtmf_rx(dtmf_rx_state_t *s, const int16_t amp[], int samples); /*! Get the status of DTMF detection during processing of the last audio chunk. \brief Get the status of DTMF detection during processing of the last audio chunk. \param s The DTMF receiver context. \return The current digit status. Either 'x' for a "maybe" condition, or the digit being detected. */ int dtmf_rx_status(dtmf_rx_state_t *s); /*! \brief Get a string of digits from a DTMF receiver's output buffer. \param s The DTMF receiver context. \param digits The buffer for the received digits. \param max The maximum number of digits to be returned, \return The number of digits actually returned. */ size_t dtmf_rx_get(dtmf_rx_state_t *s, char *digits, int max); /*! \brief Initialise a DTMF receiver context. \param s The DTMF receiver context. \param callback An optional callback routine, used to report received digits. If no callback routine is set, digits may be collected, using the dtmf_rx_get() function. \param user_data An opaque pointer which is associated with the context, and supplied in callbacks. \return A pointer to the DTMF receiver context. */ dtmf_rx_state_t *dtmf_rx_init(dtmf_rx_state_t *s, digits_rx_callback_t callback, void *user_data); /*! \brief Free a DTMF receiver context. \param s The DTMF receiver context. \return 0 for OK, else -1. */ int dtmf_rx_free(dtmf_rx_state_t *s); #if defined(__cplusplus) } #endif #endif /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/spandsp/v29tx.h0000644000175000017500000002227511150047205020500 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * v29tx.h - ITU V.29 modem transmit part * * Written by Steve Underwood * * Copyright (C) 2003 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: v29tx.h,v 1.34 2008/07/16 14:23:48 steveu Exp $ */ /*! \file */ #if !defined(_SPANDSP_V29TX_H_) #define _SPANDSP_V29TX_H_ /*! \page v29tx_page The V.29 transmitter \section v29tx_page_sec_1 What does it do? The V.29 transmitter implements the transmit side of a V.29 modem. This can operate at data rates of 9600, 7200 and 4800 bits/s. The audio output is a stream of 16 bit samples, at 8000 samples/second. The transmit and receive side of V.29 modems operate independantly. V.29 is mostly used for FAX transmission, where it provides the standard 9600 and 7200 bits/s rates (the 4800 bits/s mode is not used for FAX). \section v29tx_page_sec_2 How does it work? V.29 uses QAM modulation. The standard method of producing a QAM modulated signal is to use a sampling rate which is a multiple of the baud rate. The raw signal is then a series of complex pulses, each an integer number of samples long. These can be shaped, using a suitable complex filter, and multiplied by a complex carrier signal to produce the final QAM signal for transmission. The pulse shaping filter is only vaguely defined by the V.29 spec. Some of the other ITU modem specs. fully define the filter, typically specifying a root raised cosine filter, with 50% excess bandwidth. This is a pity, since it increases the variability of the received signal. However, the receiver's adaptive equalizer will compensate for these differences. The current design uses a root raised cosine filter with 25% excess bandwidth. Greater excess bandwidth will not allow the tranmitted signal to meet the spectral requirements. The sampling rate for our transmitter is defined by the channel - 8000 per second. This is not a multiple of the baud rate (i.e. 2400 baud). The baud interval is actually 10/3 sample periods. Instead of using a symmetric FIR to pulse shape the signal, a polyphase filter is used. This consists of 10 sets of coefficients, offering zero to 9/10ths of a baud phase shift as well as root raised cosine filtering. The appropriate coefficient set is chosen for each signal sample generated. The carrier is generated using the DDS method. Using two second order resonators, started in quadrature, might be more efficient, as it would have less impact on the processor cache than a table lookup approach. However, the DDS approach suits the receiver better, so the same signal generator is also used for the transmitter. The equation defining QAM modulation is: s(n) = A*cos(2*pi*f*n + phi(n)) where phi(n) is the phase of the information, and A is the amplitude of the information using the identity cos(x + y) = cos(x)*cos(y) - sin(x)*sin(y) we get s(n) = A {cos(2*pi*f*n)*cos(phi(n)) - sin(2*pi*f*n)*sin(phi(n))} substituting with the constellation positions I(n) = A*cos(phi(n)) Q(n) = A*sin(phi(n)) gives s(n) = I(n)*cos(2*pi*f*n) - Q(n)*sin(2*pi*f*n) */ #define V29_TX_FILTER_STEPS 9 /*! V.29 modem transmit side descriptor. This defines the working state for a single instance of a V.29 modem transmitter. */ typedef struct { /*! \brief The bit rate of the modem. Valid values are 4800, 7200 and 9600. */ int bit_rate; /*! \brief The callback function used to get the next bit to be transmitted. */ get_bit_func_t get_bit; /*! \brief A user specified opaque pointer passed to the get_bit function. */ void *get_bit_user_data; /*! \brief The callback function used to report modem status changes. */ modem_tx_status_func_t status_handler; /*! \brief A user specified opaque pointer passed to the status function. */ void *status_user_data; /*! \brief Gain required to achieve the specified output power, not allowing for the size of the current constellation. */ float base_gain; /*! \brief Gain required to achieve the specified output power, allowing for the size of the current constellation. */ #if defined(SPANDSP_USE_FIXED_POINT) int32_t gain; #else float gain; #endif /*! \brief The route raised cosine (RRC) pulse shaping filter buffer. */ #if defined(SPANDSP_USE_FIXED_POINT) complexi16_t rrc_filter[2*V29_TX_FILTER_STEPS]; #else complexf_t rrc_filter[2*V29_TX_FILTER_STEPS]; #endif /*! \brief Current offset into the RRC pulse shaping filter buffer. */ int rrc_filter_step; /*! \brief The register for the data scrambler. */ unsigned int scramble_reg; /*! \brief The register for the training scrambler. */ uint8_t training_scramble_reg; /*! \brief TRUE if transmitting the training sequence, or shutting down transmission. FALSE if transmitting user data. */ int in_training; /*! \brief A counter used to track progress through sending the training sequence. */ int training_step; /*! \brief An offset value into the table of training parameters, used to match the training pattern to the bit rate. */ int training_offset; /*! \brief The current phase of the carrier (i.e. the DDS parameter). */ uint32_t carrier_phase; /*! \brief The update rate for the phase of the carrier (i.e. the DDS increment). */ int32_t carrier_phase_rate; /*! \brief The current fractional phase of the baud timing. */ int baud_phase; /*! \brief The code number for the current position in the constellation. */ int constellation_state; /*! \brief The get_bit function in use at any instant. */ get_bit_func_t current_get_bit; /*! \brief Error and flow logging control */ logging_state_t logging; } v29_tx_state_t; #if defined(__cplusplus) extern "C" { #endif /*! Adjust a V.29 modem transmit context's power output. \brief Adjust a V.29 modem transmit context's output power. \param s The modem context. \param power The power level, in dBm0 */ void v29_tx_power(v29_tx_state_t *s, float power); /*! Initialise a V.29 modem transmit context. This must be called before the first use of the context, to initialise its contents. \brief Initialise a V.29 modem transmit context. \param s The modem context. \param bit_rate The bit rate of the modem. Valid values are 4800, 7200 and 9600. \param tep TRUE is the optional TEP tone is to be transmitted. \param get_bit The callback routine used to get the data to be transmitted. \param user_data An opaque pointer. \return A pointer to the modem context, or NULL if there was a problem. */ v29_tx_state_t *v29_tx_init(v29_tx_state_t *s, int bit_rate, int tep, get_bit_func_t get_bit, void *user_data); /*! Reinitialise an existing V.29 modem transmit context, so it may be reused. \brief Reinitialise an existing V.29 modem transmit context. \param s The modem context. \param bit_rate The bit rate of the modem. Valid values are 4800, 7200 and 9600. \param tep TRUE is the optional TEP tone is to be transmitted. \return 0 for OK, -1 for bad parameter */ int v29_tx_restart(v29_tx_state_t *s, int bit_rate, int tep); /*! Free a V.29 modem transmit context. \brief Free a V.29 modem transmit context. \param s The modem context. \return 0 for OK */ int v29_tx_free(v29_tx_state_t *s); /*! Change the get_bit function associated with a V.29 modem transmit context. \brief Change the get_bit function associated with a V.29 modem transmit context. \param s The modem context. \param get_bit The callback routine used to get the data to be transmitted. \param user_data An opaque pointer. */ void v29_tx_set_get_bit(v29_tx_state_t *s, get_bit_func_t get_bit, void *user_data); /*! Change the modem status report function associated with a V.29 modem transmit context. \brief Change the modem status report function associated with a V.29 modem transmit context. \param s The modem context. \param handler The callback routine used to report modem status changes. \param user_data An opaque pointer. */ void v29_tx_set_modem_status_handler(v29_tx_state_t *s, modem_tx_status_func_t handler, void *user_data); /*! Generate a block of V.29 modem audio samples. \brief Generate a block of V.29 modem audio samples. \param s The modem context. \param amp The audio sample buffer. \param len The number of samples to be generated. \return The number of samples actually generated. */ int v29_tx(v29_tx_state_t *s, int16_t *amp, int len); #if defined(__cplusplus) } #endif #endif /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/spandsp/g168models.h0000644000175000017500000003465711150047205021404 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * g168models.h - line models for echo cancellation tests against the G.168 * spec. * * Written by Steve Underwood * * Copyright (C) 2001 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: g168models.h,v 1.8 2008/04/17 14:27:00 steveu Exp $ */ /*! \file */ #if !defined(_SPANDSP_G168MODELS_H_) #define _SPANDSP_G168MODELS_H_ /*! \page g168_test_data_page The test data from the G.168 specification */ /*! The line model from section D.2 of G.168. These are the coefficients for the line simulation model defined in section D.2 of G.168. It may be used with the fir32_xxx routines to build a line simulator. */ const int32_t line_model_d2_coeffs[] = { -436, -829, -2797, -4208, -17968, -11215, 46150, 34480, -10427, 9049, -1309, -6320, 390, -8191, -1751, -6051, -3796, -4055, -3948, -2557, -3372, -1808, -2259, -1300, -1098, -618, -340, -61, 323, 419, 745, 716, 946, 880, 1014, 976, 1033, 1091, 1053, 1042, 794, 831, 899, 716, 390, 313, 304, 304, 73, -119, -109, -176, -359, -407, -512, -580, -704, -618, -685, -791, -772, -820, -839, -724 }; /*! The line model from section D.3 of G.168. These are the coefficients for the line simulation model defined in section D.3 of G.168. It may be used with the fir32_xxx routines to build a line simulator. */ const int32_t line_model_d3_coeffs[] = { -381, 658, 1730, -51, -3511, -1418, 7660, 8861, -8106, -21370, -5307, 23064, 24020, 1020, -12374, -16296, -19524, -7480, 13509, 17115, 13952, 13952, 97, -9326, -9046, -15208, -9853, -3858, -1979, 6029, 5616, 7214, 6820, 3935, 3919, 921, 1316, -693, -759, -1517, -2176, -2028, -2654, -1814, -2077, -1468, -1221, -842, -463, -298, -68, 64, 493, 723, 789, 954, 756, 839, 872, 1020, 789, 822, 558, 658, 476, 377, 377, 262, 97, -68, -183, -232, -331, -347, -430, -314, -430, -463, -463, -414, -381, -479, -479, -512, -479, -397, -430, -397, -298, -265, -249, -216, -249, -265, -166, -232 }; /*! The line model from section D.4 of G.168. These are the coefficients for the line simulation model defined in section D.4 of G.168. It may be used with the fir32_xxx routines to build a line simulator. */ const int32_t line_model_d4_coeffs[] = { -448, -436, 2230, 2448, -4178, -7050, 5846, 18581, 2322, -26261, -16249, 21637, 25649, -2267, -10311, -4693, -12690, -7428, 14164, 13467, 4438, 8627, 456, -11879, -6352, -5104, -7496, 3271, 6566, 4277, 11131, 7562, 1475, 3728, -3525, -7301, -3101, -9269, -6146, -2553, -6272, 811, 124, 788, 5147, 2172, 5387, 4598, 3535, 4004, 2311, 2150, 1017, 330, -139, -573, -1100, -1157, -1180, -1455, -1123, -1386, -1123, -1066, -1020, -1100, -1008, -1077, -1088, -917, -917, -963, -814, -871, -734, -642, -562, -356, -379, -345, -230, -233, -333, -356, -390, -310, -265, -368, -310, -310, -390, -482, -459, -482, -551, -573 }; /*! The line model from section D.5 of G.168. These are the coefficients for the line simulation model defined in section D.5 of G.168. It may be used with the fir32_xxx routines to build a line simulator. */ const int32_t line_model_d5_coeffs[] = { 160, 312, -241, -415, 897, 908, -1326, -1499, 2405, 3347, -3624, -7733, 4041, 14484, -1477, -21739, -4470, 25356, 11458, -19696, -11800, 5766, 789, 6633, 14624, -6975, -17156, -187, 149, 1515, 14907, 4345, -7128, -2757, -10185, -7083, 6850, 3944, 6969, 8694, -4068, -3852, -5793, -9371, 453, 1060, 3965, 9463, 2393, 2784, -892, -7366, -3376, -5847, -2399, 3011, 1537, 6623, 4205, 1602, 1592, -4752, -3646, -5207, -5577, -501, -1174, 4041, 5647, 4628, 7252, 2123, 2654, -881, -4113, -3244, -7289, -3830, -4600, -2508, 431, -144, 4184, 2372, 4617, 3576, 2382, 2839, -404, 539, -1803, -1401, -1705, -2269, -783, -1608, -220, -306, 257, 615, 225, 561, 8, 344, 127, -57, 182, 41, 203, -111, 95, -79, 30, 84, -13, -68, -241, -68, -24, 19, -57, -24, 30, -68, 84, -155, -68, 19 }; /*! The line model from section D.6 of G.168. These are the coefficients for the line simulation model defined in section D.6 of G.168. It may be used with the fir32_xxx routines to build a line simulator. */ const int32_t line_model_d6_coeffs[] = { 293, 268, 475, 460, 517, 704, 581, 879, 573, 896, 604, 787, 561, 538, 440, 97, 265, -385, 20, -938, -523, -1438, -1134, -1887, -1727, -1698, -4266, -22548, -43424, 2743, 25897, 7380, 21499, 11983, 10400, 11667, 3889, 7241, 925, 2018, -821, -2068, -2236, -4283, -3406, -5022, -4039, -4842, -4104, -4089, -3582, -2978, -2734, -1805, -1608, -645, -495, 279, 471, 947, 1186, 1438, 1669, 1640, 1901, 1687, 1803, 1543, 1566, 1342, 1163, 963, 733, 665, 323, 221, -14, -107, -279, -379, -468, -513, -473, -588, -612, -652, -616, -566, -515, -485, -404, -344, -290, -202, -180, -123 }; /*! The line model from section D.7 of G.168. These are the coefficients for the line simulation model defined in section D.8 of G.168. It may be used with the fir32_xxx routines to build a line simulator. */ const int32_t line_model_d7_coeffs[] = { 29, 109, -83, 198, -294, -135, -415, -202, -444, -337, -313, -450, -105, -503, 145, -490, 267, -231, 340, 77, 343, 783, 158, 1341, 195, 1798, 344, 1845, 629, 1604, 1182, 940, 5163, 19522, 8421, -50953, -9043, 18046, -13553, 13336, -3471, -107, 1788, -7409, 2469, -7994, 490, -3860, -837, 490, -636, 3682, 1141, 5019, 2635, 5025, 3946, 4414, 4026, 3005, 3380, 1616, 2007, 158, 388, -1198, -1117, -2134, -2547, -2589, -3310, -2778, -3427, -2779, -3116, -2502, -2399, -1956, -1539, -1239, -570, -377, 251, 331, 964, 1177, 1449, 1564, 1724, 1871, 1767, 1802, 1630, 1632, 1379, 1271, 1063, 856, 711, 482, 289, 54, -137, -321, -490, -638, -764, -836, -800, -859, -838, -837, -834, -740, -673, -581, -493, -436, -327, -201 }; /*! The line model from section D.8 of G.168. These are the coefficients for the line simulation model defined in section D.8 of G.168. It may be used with the fir32_xxx routines to build a line simulator. */ const int32_t line_model_d8_coeffs[] = { 258, -111, 337, -319, 347, -434, 192, -450, -108, -343, -596, -177, -1187, -52, -1781, -147, -1959, -326, -1601, -1389, -13620, -720, 33818, -10683, -6742, 12489, -9862, 8950, -1574, 758, 3526, -3118, 2421, -8966, -4901, 11385, 18072, -14410, -7473, 19836, -16854, -3115, 9483, -17799, 7399, -4342, -7415, 7929, -10726, 6239, -2526, -1317, 5345, -4565, 6868, -2195, 3425, 1969, -109, 3963, -1275, 3087, -892, 1239, 2, -427, 596, -1184, 551, -1244, 141, -743, -415, -372, -769, -183, -785, -270, -659, -377, -523, -325, -245, -255, -60, 35, 218, 149, 340, 233, 365, 303, 251, 230, 209, 179 }; /*! The line model from section D.9 of G.168. These are the coefficients for the line simulation model defined in section D.9 of G.168. It may be used with the fir32_xxx routines to build a line simulator. */ const int32_t line_model_d9_coeffs[] = { 80, 31, 4, 42, 42, -61, -81, -64, 121, -102, -26, 1002, -9250, -22562, 39321, 35681, -35289, 25312, -1457, -229, 15659, -6786, 16791, 3860, 2239, -28730, -11885, 33871, -176, -16421, 18173, -9669, -10163, 9941, -19365, 3592, -5907, -10257, 5336, -12933, 4348, -4802, -1791, 3035, -4433, 5553, -2596, 3992, 1255, 1450, 4079, 324, 4340, 1059, 3083, 1917, 1756, 2478, 1027, 1871, 845, 1284, 813, 806, 869, 471, 646, 438, 449, 432, 473, 394, 452, 538, 717, 723, 850, 756, 753, 899, 555, 669, 619, 500, 650, 615, 516, 492, 427, 291, 356, 147, 107, -50, -88, -59, -238, -165, -183 }; /*! The filter coefficients for the bandpass filter specified for level measurements in G.168. */ const float level_measurement_bp_coeffs[] = { 0.0000, 0.0006, 0.0005, 0.0004, 0.0011, 0.0000, 0.0015, -0.0003, 0.0012, -0.0002, 0.0000, 0.0002, -0.0020, 0.0005, -0.0040, 0.0000, -0.0047, -0.0019, -0.0033, -0.0047, 0.0000, -0.0068, 0.0036, -0.0057, 0.0054, 0.0000, 0.0044, 0.0095, 0.0017, 0.0188, 0.0000, 0.0225, 0.0024, 0.0163, 0.0092, 0.0000, 0.0164, -0.0210, 0.0161, -0.0375, 0.0000, -0.0406, -0.0357, -0.0267, -0.0871, 0.0000, -0.1420, 0.0289, -0.1843, 0.0475, 0.8006, 0.0475, -0.1843, 0.0289, -0.1420, 0.0000, -0.0871, -0.0267, -0.0357, -0.0406, 0.0000, -0.0375, 0.0161, -0.0210, 0.0164, 0.0000, 0.0092, 0.0163, 0.0024, 0.0225, 0.0000, 0.0188, 0.0017, 0.0095, 0.0044, 0.0000, 0.0054, -0.0057, 0.0036, -0.0068, 0.0000, -0.0047, -0.0033, -0.0019, -0.0047, 0.0000, -0.0040, 0.0005, -0.0020, 0.0002, 0.0000, -0.0002, 0.0012, -0.0003, 0.0015, 0.0000, 0.0011, 0.0004, 0.0005, 0.0006, 0.0000 }; /*! The composite source signal "voiced" section from section C.1 of G.168. */ const int css_c1[] = { -155, 276, 517, 578, 491, 302, 86, -103, -207, -198, 60, 190, 543, 948, 1362, 1741, 2043, 2276, 2422, 2500, 2552, 2595, 2655, 2758, 2896, 3060, 3224, 3370, 3500, 3569, 3603, 3603, 3595, 3586, 3595, 3638, 3724, 3819, 3922, 4000, 4043, 4034, 3974, 3862, 3724, 3577, 3439, 3336, 3267, 3224, 3198, 3172, 3129, 3043, 2914, 2750, 2560, 2353, 2155, 1991, 1853, 1750, 1672, 1603, 1534, 1440, 1310, 1146, 965, 776, 603, 448, 345, 276, 250, 250, 267, 267, 241, 190, 103, -9, -138, -267, -388, -491, -569, -638, -698, -759, -813, -888, -957, -1034, -1103, -1146, -1181, -1190, -1198, -1215, -1259, -1327, -1457, -1629, -1853, -2121, -2414, -2707, -3017, -3319, -3612, -3913, -4224, -4560, -4922, -5301, -5715, -6137, -6560, -6948, -7301, -7568, -7732, -7758, -7620, -7310, -6810, -6155, -5344, -4439, -3474, -2508, -1595, -802 }; /*! The composite source signal "voiced" section from section C.3 of G.168. */ const int css_c3[] = { -198, -112, -9, 103, 233, 388, 543, 724, 896, 1060, 1233, 1388, 1517, 1638, 1747, 1810, 1845, 1845, 1802, 1707, 1569, 1379, 1146, 871, 560, 233, -121, -491, -871, -1250, -1638, -2043, -2465, -2896, -3345, -3819, -4310, -4810, -5319, -5836, -6353, -6853, -7353, -7836, -8292, -8715, -9077, -9370, -9542, -9542, -9361, -8956, -8327, -7465, -6396, -5163, -3827, -2448, -1103, 155, 1293, 2241, 3034, 3655, 4138, 4517, 4827, 5094, 5344, 5594, 5827, 6043, 6215, 6344, 6413, 6422, 6379, 6310, 6215, 6120, 6051, 6000, 5991, 5991, 6000, 6008, 5991, 5939, 5853, 5715, 5560, 5387, 5215, 5043, 4879, 4732, 4586, 4439, 4276, 4086, 3870, 3629, 3370, 3086, 2801, 2534, 2267, 2034, 1819, 1612, 1422, 1224, 1026, 819, 603, 388, 181, 9, -181, -328, -448, -543, -629, -707, -784, -871, -948, -1026, -1112, -1181, -1241, -1276, -1293, -1302, -1293, -1267, -1250, -1233, -1224, -1224, -1224, -1224, -1215, -1198, -1172, -1129, -1077, -1026, -974, -922, -888, -871, -845, -828, -810, -793, -767, -741, -698, -672, -638, -603, -595, -586, -595, -603, -621, -629, -938, -638, -638, -638, -638, -638, -647, -664, -690, -724, -767, -793, -819, -845, -853, -871, -879, -888, -896, -922, -948, -974, -1009, -1026, -1052, -1069, -1077, -1069, -1060, -1060, -1052, -1043, -1043, -1052, -1060, -1060, -1060, -1052, -1034, -1017, -991, -957, -931, -905, -888, -862, -845, -819, -793, -767, -724, -672, -621, -560, -509, -457, -397, -345, -276, -207, -112 }; /*! From section 6.4.2.7 of G.168 - Test No. 6 Non-divergence on narrow-band signals. These tones and tone pairs are each applied for 5 seconds. */ const int tones_6_4_2_7[][2] = { { 697, 0}, { 941, 0}, {1336, 0}, {1633, 0}, { 697, 1209}, { 770, 1336}, { 852, 1477}, { 941, 1633}, { 0, 0} }; #endif /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/spandsp/biquad.h0000644000175000017500000000561011150047205020743 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * biquad.h - General telephony bi-quad section routines (currently this just * handles canonic/type 2 form) * * Written by Steve Underwood * * Copyright (C) 2001 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: biquad.h,v 1.14 2008/04/17 14:26:59 steveu Exp $ */ /*! \page biquad_page Bi-quadratic filter sections \section biquad_page_sec_1 What does it do? ???. \section biquad_page_sec_2 How does it work? ???. */ #if !defined(_SPANDSP_BIQUAD_H_) #define _SPANDSP_BIQUAD_H_ typedef struct { int32_t gain; int32_t a1; int32_t a2; int32_t b1; int32_t b2; int32_t z1; int32_t z2; #if FIRST_ORDER_NOISE_SHAPING int32_t residue; #elif SECOND_ORDER_NOISE_SHAPING int32_t residue1; int32_t residue2; #endif } biquad2_state_t; #if defined(__cplusplus) extern "C" { #endif static __inline__ void biquad2_init(biquad2_state_t *bq, int32_t gain, int32_t a1, int32_t a2, int32_t b1, int32_t b2) { bq->gain = gain; bq->a1 = a1; bq->a2 = a2; bq->b1 = b1; bq->b2 = b2; bq->z1 = 0; bq->z2 = 0; #if FIRST_ORDER_NOISE_SHAPING bq->residue = 0; #elif SECOND_ORDER_NOISE_SHAPING bq->residue1 = 0; bq->residue2 = 0; #endif } /*- End of function --------------------------------------------------------*/ static __inline__ int16_t biquad2(biquad2_state_t *bq, int16_t sample) { int32_t y; int32_t z0; z0 = sample*bq->gain + bq->z1*bq->a1 + bq->z2*bq->a2; y = z0 + bq->z1*bq->b1 + bq->z2*bq->b2; bq->z2 = bq->z1; bq->z1 = z0 >> 15; #if FIRST_ORDER_NOISE_SHAPING y += bq->residue; bq->residue = y & 0x7FFF; #elif SECOND_ORDER_NOISE_SHAPING y += (2*bq->residue1 - bq->residue2); bq->residue2 = bq->residue1; bq->residue1 = y & 0x7FFF; #endif y >>= 15; return (int16_t) y; } /*- End of function --------------------------------------------------------*/ #if defined(__cplusplus) } #endif #endif /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/spandsp/complex_vector_float.h0000644000175000017500000000640511150047205023717 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * complex_vector_float.h * * Written by Steve Underwood * * Copyright (C) 2003 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: complex_vector_float.h,v 1.8 2008/04/17 14:27:00 steveu Exp $ */ #if !defined(_SPANDSP_COMPLEX_VECTOR_FLOAT_H_) #define _SPANDSP_COMPLEX_VECTOR_FLOAT_H_ #if defined(__cplusplus) extern "C" { #endif static __inline__ void cvec_copyf(complexf_t z[], const complexf_t x[], int n) { int i; for (i = 0; i < n; i++) z[i] = x[i]; } /*- End of function --------------------------------------------------------*/ static __inline__ void cvec_copy(complex_t z[], const complex_t x[], int n) { int i; for (i = 0; i < n; i++) z[i] = x[i]; } /*- End of function --------------------------------------------------------*/ #if defined(HAVE_LONG_DOUBLE) static __inline__ void cvec_copyl(complexl_t z[], const complexl_t x[], int n) { int i; for (i = 0; i < n; i++) z[i] = x[i]; } /*- End of function --------------------------------------------------------*/ #endif static __inline__ void cvec_zerof(complexf_t z[], int n) { int i; for (i = 0; i < n; i++) z[i] = complex_setf(0.0f, 0.0f); } /*- End of function --------------------------------------------------------*/ static __inline__ void cvec_zero(complex_t z[], int n) { int i; for (i = 0; i < n; i++) z[i] = complex_set(0.0, 0.0); } /*- End of function --------------------------------------------------------*/ #if defined(HAVE_LONG_DOUBLE) static __inline__ void cvec_zerol(complexl_t z[], int n) { int i; for (i = 0; i < n; i++) z[i] = complex_setl(0.0, 0.0); } /*- End of function --------------------------------------------------------*/ #endif static __inline__ void cvec_setf(complexf_t z[], complexf_t *x, int n) { int i; for (i = 0; i < n; i++) z[i] = *x; } /*- End of function --------------------------------------------------------*/ static __inline__ void cvec_set(complex_t z[], complex_t *x, int n) { int i; for (i = 0; i < n; i++) z[i] = *x; } /*- End of function --------------------------------------------------------*/ #if defined(HAVE_LONG_DOUBLE) static __inline__ void cvec_setl(complexl_t z[], complexl_t *x, int n) { int i; for (i = 0; i < n; i++) z[i] = *x; } /*- End of function --------------------------------------------------------*/ #endif #if defined(__cplusplus) } #endif #endif /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/spandsp/telephony.h0000644000175000017500000000424511150047205021510 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * telephony.h - some very basic telephony definitions * * Written by Steve Underwood * * Copyright (C) 2003 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: telephony.h,v 1.12 2008/04/17 14:27:01 steveu Exp $ */ #if !defined(_SPANDSP_TELEPHONY_H_) #define _SPANDSP_TELEPHONY_H_ #define SAMPLE_RATE 8000 /* This is based on A-law, but u-law is only 0.03dB different */ #define DBM0_MAX_POWER (3.14f + 3.02f) #define DBM0_MAX_SINE_POWER (3.14f) /* This is based on the ITU definition of dbOv in G.100.1 */ #define DBOV_MAX_POWER (0.0f) #define DBOV_MAX_SINE_POWER (-3.02f) /*! \brief A handler for pure receive. The buffer cannot be altered. */ typedef int (span_rx_handler_t)(void *s, const int16_t amp[], int len); /*! \brief A handler for receive, where the buffer can be altered. */ typedef int (span_mod_handler_t)(void *s, int16_t amp[], int len); /*! \brief A handler for transmit, where the buffer will be filled. */ typedef int (span_tx_handler_t)(void *s, int16_t amp[], int max_len); #define ms_to_samples(t) (((t)*SAMPLE_RATE)/1000) #if !defined(FALSE) #define FALSE 0 #endif #if !defined(TRUE) #define TRUE (!FALSE) #endif #if defined(__cplusplus) /* C++ doesn't seem to have sane rounding functions/macros yet */ #ifndef _MSC_VER #define lrint(x) ((long int) (x)) #define lrintf(x) ((long int) (x)) #endif #endif #endif /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/spandsp/v42bis.h0000644000175000017500000001751711150047205020620 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * v42bis.h * * Written by Steve Underwood * * Copyright (C) 2005 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: v42bis.h,v 1.22 2008/04/17 14:27:01 steveu Exp $ */ /*! \page v42bis_page V.42bis modem data compression \section v42bis_page_sec_1 What does it do? The v.42bis specification defines a data compression scheme, to work in conjunction with the error correction scheme defined in V.42. \section v42bis_page_sec_2 How does it work? */ #if !defined(_SPANDSP_V42BIS_H_) #define _SPANDSP_V42BIS_H_ #define V42BIS_MAX_BITS 12 #define V42BIS_MAX_CODEWORDS 4096 /* 2^V42BIS_MAX_BITS */ #define V42BIS_TABLE_SIZE 5021 /* This should be a prime >(2^V42BIS_MAX_BITS) */ #define V42BIS_MAX_STRING_SIZE 250 enum { V42BIS_P0_NEITHER_DIRECTION = 0, V42BIS_P0_INITIATOR_RESPONDER, V42BIS_P0_RESPONDER_INITIATOR, V42BIS_P0_BOTH_DIRECTIONS }; enum { V42BIS_COMPRESSION_MODE_DYNAMIC = 0, V42BIS_COMPRESSION_MODE_ALWAYS, V42BIS_COMPRESSION_MODE_NEVER }; typedef void (*v42bis_frame_handler_t)(void *user_data, const uint8_t *pkt, int len); typedef void (*v42bis_data_handler_t)(void *user_data, const uint8_t *buf, int len); /*! V.42bis dictionary node. */ typedef struct { /*! \brief The prior code for each defined code. */ uint16_t parent_code; /*! \brief The number of leaf nodes this node has */ int16_t leaves; /*! \brief This leaf octet for each defined code. */ uint8_t node_octet; /*! \brief Bit map of the children which exist */ uint32_t children[8]; } v42bis_dict_node_t; /*! V.42bis compression. This defines the working state for a single instance of V.42bis compression. */ typedef struct { /*! \brief Compression mode. */ int compression_mode; /*! \brief Callback function to handle received frames. */ v42bis_frame_handler_t handler; /*! \brief An opaque pointer passed in calls to frame_handler. */ void *user_data; /*! \brief The maximum frame length allowed */ int max_len; uint32_t string_code; uint32_t latest_code; int string_length; uint32_t output_bit_buffer; int output_bit_count; int output_octet_count; uint8_t output_buf[1024]; v42bis_dict_node_t dict[V42BIS_MAX_CODEWORDS]; /*! \brief TRUE if we are in transparent (i.e. uncompressable) mode */ int transparent; int change_transparency; /*! \brief IIR filter state, used in assessing compressibility. */ int compressibility_filter; int compressibility_persistence; /*! \brief Next empty dictionary entry */ uint32_t v42bis_parm_c1; /*! \brief Current codeword size */ int v42bis_parm_c2; /*! \brief Threshold for codeword size change */ uint32_t v42bis_parm_c3; /*! \brief Mark that this is the first octet/code to be processed */ int first; uint8_t escape_code; } v42bis_compress_state_t; /*! V.42bis decompression. This defines the working state for a single instance of V.42bis decompression. */ typedef struct { /*! \brief Callback function to handle decompressed data. */ v42bis_data_handler_t handler; /*! \brief An opaque pointer passed in calls to data_handler. */ void *user_data; /*! \brief The maximum decompressed data block length allowed */ int max_len; uint32_t old_code; uint32_t last_old_code; uint32_t input_bit_buffer; int input_bit_count; int octet; int last_length; int output_octet_count; uint8_t output_buf[1024]; v42bis_dict_node_t dict[V42BIS_MAX_CODEWORDS]; /*! \brief TRUE if we are in transparent (i.e. uncompressable) mode */ int transparent; int last_extra_octet; /*! \brief Next empty dictionary entry */ uint32_t v42bis_parm_c1; /*! \brief Current codeword size */ int v42bis_parm_c2; /*! \brief Threshold for codeword size change */ uint32_t v42bis_parm_c3; /*! \brief Mark that this is the first octet/code to be processed */ int first; uint8_t escape_code; int escaped; } v42bis_decompress_state_t; /*! V.42bis compression/decompression descriptor. This defines the working state for a single instance of V.42bis compress/decompression. */ typedef struct { /*! \brief V.42bis data compression directions. */ int v42bis_parm_p0; /*! \brief Compression state. */ v42bis_compress_state_t compress; /*! \brief Decompression state. */ v42bis_decompress_state_t decompress; /*! \brief Maximum codeword size (bits) */ int v42bis_parm_n1; /*! \brief Total number of codewords */ uint32_t v42bis_parm_n2; /*! \brief Maximum string length */ int v42bis_parm_n7; } v42bis_state_t; #if defined(__cplusplus) extern "C" { #endif /*! Compress a block of octets. \param s The V.42bis context. \param buf The data to be compressed. \param len The length of the data buffer. \return 0 */ int v42bis_compress(v42bis_state_t *s, const uint8_t *buf, int len); /*! Flush out any data remaining in a compression buffer. \param s The V.42bis context. \return 0 */ int v42bis_compress_flush(v42bis_state_t *s); /*! Decompress a block of octets. \param s The V.42bis context. \param buf The data to be decompressed. \param len The length of the data buffer. \return 0 */ int v42bis_decompress(v42bis_state_t *s, const uint8_t *buf, int len); /*! Flush out any data remaining in the decompression buffer. \param s The V.42bis context. \return 0 */ int v42bis_decompress_flush(v42bis_state_t *s); /*! Initialise a V.42bis context. \param s The V.42bis context. \param negotiated_p0 The negotiated P0 parameter, from the V.42bis spec. \param negotiated_p1 The negotiated P1 parameter, from the V.42bis spec. \param negotiated_p2 The negotiated P2 parameter, from the V.42bis spec. \param frame_handler . \param frame_user_data . \param max_frame_len The maximum length that should be passed to the frame handler. \param data_handler . \param data_user_data . \param max_data_len The maximum length that should be passed to the data handler. \return The V.42bis context. */ v42bis_state_t *v42bis_init(v42bis_state_t *s, int negotiated_p0, int negotiated_p1, int negotiated_p2, v42bis_frame_handler_t frame_handler, void *frame_user_data, int max_frame_len, v42bis_data_handler_t data_handler, void *data_user_data, int max_data_len); /*! Set the compression mode. \param s The V.42bis context. \param mode One of the V.42bis compression modes - V42BIS_COMPRESSION_MODE_DYNAMIC, V42BIS_COMPRESSION_MODE_ALWAYS, V42BIS_COMPRESSION_MODE_NEVER */ void v42bis_compression_control(v42bis_state_t *s, int mode); /*! Release a V.42bis context. \param s The V.42bis context. \return 0 if OK */ int v42bis_release(v42bis_state_t *s); #if defined(__cplusplus) } #endif #endif /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/spandsp/fir.h0000644000175000017500000002066011150047205020260 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * fir.h - General telephony FIR routines * * Written by Steve Underwood * * Copyright (C) 2002 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: fir.h,v 1.13 2008/04/17 14:27:00 steveu Exp $ */ /*! \page fir_page FIR filtering \section fir_page_sec_1 What does it do? ???. \section fir_page_sec_2 How does it work? ???. */ #if !defined(_SPANDSP_FIR_H_) #define _SPANDSP_FIR_H_ #if defined(USE_MMX) || defined(USE_SSE2) #include "mmx.h" #endif /*! 16 bit integer FIR descriptor. This defines the working state for a single instance of an FIR filter using 16 bit integer coefficients. */ typedef struct { int taps; int curr_pos; const int16_t *coeffs; int16_t *history; } fir16_state_t; /*! 32 bit integer FIR descriptor. This defines the working state for a single instance of an FIR filter using 32 bit integer coefficients, and filtering 16 bit integer data. */ typedef struct { int taps; int curr_pos; const int32_t *coeffs; int16_t *history; } fir32_state_t; /*! Floating point FIR descriptor. This defines the working state for a single instance of an FIR filter using floating point coefficients and data. */ typedef struct { int taps; int curr_pos; const float *coeffs; float *history; } fir_float_state_t; #if defined(__cplusplus) extern "C" { #endif static __inline__ const int16_t *fir16_create(fir16_state_t *fir, const int16_t *coeffs, int taps) { fir->taps = taps; fir->curr_pos = taps - 1; fir->coeffs = coeffs; #if defined(USE_MMX) || defined(USE_SSE2) if ((fir->history = malloc(2*taps*sizeof(int16_t)))) memset(fir->history, 0, 2*taps*sizeof(int16_t)); #else if ((fir->history = (int16_t *) malloc(taps*sizeof(int16_t)))) memset(fir->history, 0, taps*sizeof(int16_t)); #endif return fir->history; } /*- End of function --------------------------------------------------------*/ static __inline__ void fir16_flush(fir16_state_t *fir) { #if defined(USE_MMX) || defined(USE_SSE2) memset(fir->history, 0, 2*fir->taps*sizeof(int16_t)); #else memset(fir->history, 0, fir->taps*sizeof(int16_t)); #endif } /*- End of function --------------------------------------------------------*/ static __inline__ void fir16_free(fir16_state_t *fir) { free(fir->history); } /*- End of function --------------------------------------------------------*/ static __inline__ int16_t fir16(fir16_state_t *fir, int16_t sample) { int i; int32_t y; #if defined(USE_MMX) mmx_t *mmx_coeffs; mmx_t *mmx_hist; fir->history[fir->curr_pos] = sample; fir->history[fir->curr_pos + fir->taps] = sample; mmx_coeffs = (mmx_t *) fir->coeffs; mmx_hist = (mmx_t *) &fir->history[fir->curr_pos]; i = fir->taps; pxor_r2r(mm4, mm4); /* 8 samples per iteration, so the filter must be a multiple of 8 long. */ while (i > 0) { movq_m2r(mmx_coeffs[0], mm0); movq_m2r(mmx_coeffs[1], mm2); movq_m2r(mmx_hist[0], mm1); movq_m2r(mmx_hist[1], mm3); mmx_coeffs += 2; mmx_hist += 2; pmaddwd_r2r(mm1, mm0); pmaddwd_r2r(mm3, mm2); paddd_r2r(mm0, mm4); paddd_r2r(mm2, mm4); i -= 8; } movq_r2r(mm4, mm0); psrlq_i2r(32, mm0); paddd_r2r(mm0, mm4); movd_r2m(mm4, y); emms(); #elif defined(USE_SSE2) xmm_t *xmm_coeffs; xmm_t *xmm_hist; fir->history[fir->curr_pos] = sample; fir->history[fir->curr_pos + fir->taps] = sample; xmm_coeffs = (xmm_t *) fir->coeffs; xmm_hist = (xmm_t *) &fir->history[fir->curr_pos]; i = fir->taps; pxor_r2r(xmm4, xmm4); /* 16 samples per iteration, so the filter must be a multiple of 16 long. */ while (i > 0) { movdqu_m2r(xmm_coeffs[0], xmm0); movdqu_m2r(xmm_coeffs[1], xmm2); movdqu_m2r(xmm_hist[0], xmm1); movdqu_m2r(xmm_hist[1], xmm3); xmm_coeffs += 2; xmm_hist += 2; pmaddwd_r2r(xmm1, xmm0); pmaddwd_r2r(xmm3, xmm2); paddd_r2r(xmm0, xmm4); paddd_r2r(xmm2, xmm4); i -= 16; } movdqa_r2r(xmm4, xmm0); psrldq_i2r(8, xmm0); paddd_r2r(xmm0, xmm4); movdqa_r2r(xmm4, xmm0); psrldq_i2r(4, xmm0); paddd_r2r(xmm0, xmm4); movd_r2m(xmm4, y); #else int offset1; int offset2; fir->history[fir->curr_pos] = sample; offset2 = fir->curr_pos; offset1 = fir->taps - offset2; y = 0; for (i = fir->taps - 1; i >= offset1; i--) y += fir->coeffs[i]*fir->history[i - offset1]; for ( ; i >= 0; i--) y += fir->coeffs[i]*fir->history[i + offset2]; #endif if (fir->curr_pos <= 0) fir->curr_pos = fir->taps; fir->curr_pos--; return (int16_t) (y >> 15); } /*- End of function --------------------------------------------------------*/ static __inline__ const int16_t *fir32_create(fir32_state_t *fir, const int32_t *coeffs, int taps) { fir->taps = taps; fir->curr_pos = taps - 1; fir->coeffs = coeffs; fir->history = (int16_t *) malloc(taps*sizeof(int16_t)); if (fir->history) memset(fir->history, '\0', taps*sizeof(int16_t)); return fir->history; } /*- End of function --------------------------------------------------------*/ static __inline__ void fir32_flush(fir32_state_t *fir) { memset(fir->history, 0, fir->taps*sizeof(int16_t)); } /*- End of function --------------------------------------------------------*/ static __inline__ void fir32_free(fir32_state_t *fir) { free(fir->history); } /*- End of function --------------------------------------------------------*/ static __inline__ int16_t fir32(fir32_state_t *fir, int16_t sample) { int i; int32_t y; int offset1; int offset2; fir->history[fir->curr_pos] = sample; offset2 = fir->curr_pos; offset1 = fir->taps - offset2; y = 0; for (i = fir->taps - 1; i >= offset1; i--) y += fir->coeffs[i]*fir->history[i - offset1]; for ( ; i >= 0; i--) y += fir->coeffs[i]*fir->history[i + offset2]; if (fir->curr_pos <= 0) fir->curr_pos = fir->taps; fir->curr_pos--; return (int16_t) (y >> 15); } /*- End of function --------------------------------------------------------*/ static __inline__ const float *fir_float_create(fir_float_state_t *fir, const float *coeffs, int taps) { fir->taps = taps; fir->curr_pos = taps - 1; fir->coeffs = coeffs; fir->history = (float *) malloc(taps*sizeof(float)); if (fir->history) memset(fir->history, '\0', taps*sizeof(float)); return fir->history; } /*- End of function --------------------------------------------------------*/ static __inline__ void fir_float_free(fir_float_state_t *fir) { free(fir->history); } /*- End of function --------------------------------------------------------*/ static __inline__ int16_t fir_float(fir_float_state_t *fir, int16_t sample) { int i; float y; int offset1; int offset2; fir->history[fir->curr_pos] = sample; offset2 = fir->curr_pos; offset1 = fir->taps - offset2; y = 0; for (i = fir->taps - 1; i >= offset1; i--) y += fir->coeffs[i]*fir->history[i - offset1]; for ( ; i >= 0; i--) y += fir->coeffs[i]*fir->history[i + offset2]; if (fir->curr_pos <= 0) fir->curr_pos = fir->taps; fir->curr_pos--; return (int16_t) y; } /*- End of function --------------------------------------------------------*/ #if defined(__cplusplus) } #endif #endif /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/spandsp/awgn.h0000644000175000017500000000642411150047205020436 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * awgn.h - An additive Gaussian white noise generator * * Written by Steve Underwood * * Copyright (C) 2001 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: awgn.h,v 1.14 2008/04/17 14:26:59 steveu Exp $ */ /*! \file */ /* This code is based on some demonstration code in a research paper somewhere. I can't track down where I got the original from, so that due recognition can be given. The original had no explicit copyright notice, and I hope nobody objects to its use here. Having a reasonable Gaussian noise generator is pretty important for telephony testing (in fact, pretty much any DSP testing), and this one seems to have served me OK. Since the generation of Gaussian noise is only for test purposes, and not a core system component, I don't intend to worry excessively about copyright issues, unless someone worries me. The non-core nature of this code also explains why it is unlikely to ever be optimised. */ #if !defined(_SPANDSP_AWGN_H_) #define _SPANDSP_AWGN_H_ /*! \page awgn_page Additive white gaussian noise (AWGN) generation \section awgn_page_sec_1 What does it do? Adding noise is not the most useful thing in most DSP applications, but it is awfully useful for test suites. \section awgn_page_sec_2 How does it work? This code is based on some demonstration code in a research paper somewhere. I can't track down where I got the original from, so that due recognition can be given. The original had no explicit copyright notice, and I hope nobody objects to its use here. Having a reasonable Gaussian noise generator is pretty important for telephony testing (in fact, pretty much any DSP testing), and this one seems to have served me OK. Since the generation of Gaussian noise is only for test purposes, and not a core system component, I don't intend to worry excessively about copyright issues, unless someone worries me. The non-core nature of this code also explains why it is unlikely to ever be optimised. */ /*! AWGN generator descriptor. This contains all the state information for an AWGN generator. */ typedef struct { double rms; long int ix1; long int ix2; long int ix3; double r[98]; double gset; int iset; } awgn_state_t; #if defined(__cplusplus) extern "C" { #endif awgn_state_t *awgn_init_dbm0(awgn_state_t *s, int idum, float level); awgn_state_t *awgn_init_dbov(awgn_state_t *s, int idum, float level); int16_t awgn(awgn_state_t *s); #if defined(__cplusplus) } #endif #endif /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/spandsp/t30.h0000644000175000017500000011140011150047205020077 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * t30.h - definitions for T.30 fax processing * * Written by Steve Underwood * * Copyright (C) 2003 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: t30.h,v 1.110 2008/06/28 02:14:26 steveu Exp $ */ /*! \file */ #if !defined(_SPANDSP_T30_H_) #define _SPANDSP_T30_H_ /*! \page t30_page T.30 FAX protocol handling \section t30_page_sec_1 What does it do? The T.30 protocol is the core protocol used for FAX transmission. This module implements most of its key featrues. It does not interface to the outside work. Seperate modules do that for T.38, analogue line, and other forms of FAX communication. Current features of this module include: - FAXing to and from multi-page TIFF/F files, whose images are one of the standard FAX sizes. - V.27ter, V.29 and V.17 modes (2400bps, to 14,400bps). - T.4 1D (MH), T.4 2D,(MR) and T.6 (MMR) compression. - Error correction mode (ECM). - All standard horizonal resolutions (R8, R16, 300dpi, 600dpi, 800dpi, 1200dpi). - All standard vertical resolutions (standard, fine, superfine, 300dpi, 600dpi, 800dpi, 1200dpi). - All standard page widths (A4, B4, A3). - All standard page lengths (A4, B4, North American letter, North American legal, continuous). - Monitoring and sending identifier strings (CSI, TSI, and CIG). - Monitoring and sending sub-address strings (SUB). - Monitoring and sending polling sub-addresses (SEP). - Monitoring and sending polled sub-addresses (PSA). - Monitoring and sending sender identifications (SID). - Monitoring and sending passwords (PWD). - Monitoring of non-standard facility frames (NSF, NSC, and NSS). - Sending custom non-standard facility frames (NSF, NSC, and NSS). - Analogue modem and T.38 operation. \section t30_page_sec_2 How does it work? Some of the following is paraphrased from some notes found a while ago on the Internet. I cannot remember exactly where they came from, but they are useful. \subsection t30_page_sec_2a The answer (CED) tone The T.30 standard says an answering fax device must send CED (a 2100Hz tone) for approximately 3 seconds before sending the first handshake message. Some machines send an 1100Hz or 1850Hz tone, and some send no tone at all. In fact, this answer tone is so unpredictable, it cannot really be used. It should, however, always be generated according to the specification. \subsection t30_page_sec_2b Common Timing Deviations The T.30 spec. specifies a number of time-outs. For example, after dialing a number, a calling fax system should listen for a response for 35 seconds before giving up. These time-out periods are as follows: - T1 - 35+-5s: the maximum time for which two fax system will attempt to identify each other - T2 - 6+-1s: a time-out used to start the sequence for changing transmit parameters - T3 - 10+-5s: a time-out used in handling operator interrupts - T5 - 60+-5s: a time-out used in error correction mode These time-outs are sometimes misinterpreted. In addition, they are routinely ignored, sometimes with good reason. For example, after placing a call, the calling fax system is supposed to wait for 35 seconds before giving up. If the answering unit does not answer on the first ring or if a voice answering machine is connected to the line, or if there are many delays through the network, the delay before answer can be much longer than 35 seconds. Fax units that support error correction mode (ECM) can respond to a post-image handshake message with a receiver not ready (RNR) message. The calling unit then queries the receiving fax unit with a receiver ready (RR) message. If the answering unit is still busy (printing for example), it will repeat the RNR message. According to the T.30 standard, this sequence (RR/RNR RR/RNR) can be repeated for up to the end of T5 (60+-5s). However, many fax systems ignore the time-out and will continue the sequence indefinitely, unless the user manually overrides. All the time-outs are subject to alteration, and sometimes misuse. Good T.30 implementations must do the right thing, and tolerate others doing the wrong thing. \subsection t30_page_sec_2c Variations in the inter-carrier gap T.30 specifies 75+-20ms of silence between signals using different modulation schemes. Examples are between the end of a DCS signal and the start of a TCF signal, and between the end of an image and the start of a post-image signal. Many fax systems violate this requirement, especially for the silent period between DCS and TCF. This may be stretched to well over 100ms. If this period is too long, it can interfere with handshake signal error recovery, should a packet be corrupted on the line. Systems should ensure they stay within the prescribed T.30 limits, and be tolerant of others being out of spec.. \subsection t30_page_sec_2d Other timing variations Testing is required to determine the ability of a fax system to handle variations in the duration of pauses between unacknowledged handshake message repetitions, and also in the pauses between the receipt of a handshake command and the start of a response to that command. In order to reduce the total transmission time, many fax systems start sending a response message before the end of the command has been received. \subsection t30_page_sec_2e Other deviations from the T.30 standard There are many other commonly encountered variations between machines, including: - frame sequence deviations - preamble and flag sequence variations - improper EOM usage - unusual data rate fallback sequences - common training pattern detection algorithms - image transmission deviations - use of the talker echo protect tone - image padding and short lines - RTP/RTN handshake message usage - long duration lines - nonstandard disconnect sequences - DCN usage */ #define T30_MAX_DIS_DTC_DCS_LEN 22 #define T30_MAX_IDENT_LEN 20 #define T30_MAX_PAGE_HEADER_INFO 50 typedef struct t30_state_s t30_state_t; /*! T.30 phase B callback handler. This handler can be used to process addition information available in some FAX calls, such as passwords. The callback handler can access whatever additional information might have been received, using t30_get_received_info(). \brief T.30 phase B callback handler. \param s The T.30 context. \param user_data An opaque pointer. \param result The phase B event code. \return The new status. Normally, T30_ERR_OK is returned. */ typedef int (t30_phase_b_handler_t)(t30_state_t *s, void *user_data, int result); /*! T.30 phase D callback handler. \brief T.30 phase D callback handler. \param s The T.30 context. \param user_data An opaque pointer. \param result The phase D event code. \return The new status. Normally, T30_ERR_OK is returned. */ typedef int (t30_phase_d_handler_t)(t30_state_t *s, void *user_data, int result); /*! T.30 phase E callback handler. \brief T.30 phase E callback handler. \param s The T.30 context. \param user_data An opaque pointer. \param completion_code The phase E completion code. */ typedef void (t30_phase_e_handler_t)(t30_state_t *s, void *user_data, int completion_code); /*! T.30 real time frame handler. \brief T.30 real time frame handler. \param s The T.30 context. \param user_data An opaque pointer. \param direction TRUE for incoming, FALSE for outgoing. \param msg The HDLC message. \param len The length of the message. */ typedef void (t30_real_time_frame_handler_t)(t30_state_t *s, void *user_data, int direction, const uint8_t *msg, int len); /*! T.30 document handler. \brief T.30 document handler. \param s The T.30 context. \param user_data An opaque pointer. \param result The document event code. */ typedef int (t30_document_handler_t)(t30_state_t *s, void *user_data, int status); /*! T.30 set a receive or transmit type handler. \brief T.30 set a receive or transmit type handler. \param user_data An opaque pointer. \param type The modem, tone or silence to be sent or received. \param short_train TRUE if the short training sequence should be used (where one exists). \param use_hdlc FALSE for bit stream, TRUE for HDLC framing. */ typedef void (t30_set_handler_t)(void *user_data, int type, int short_train, int use_hdlc); /*! T.30 send HDLC handler. \brief T.30 send HDLC handler. \param user_data An opaque pointer. \param msg The HDLC message. \param len The length of the message. */ typedef void (t30_send_hdlc_handler_t)(void *user_data, const uint8_t *msg, int len); /*! T.30 protocol completion codes, at phase E. */ enum { T30_ERR_OK = 0, /*! OK */ /* Link problems */ T30_ERR_CEDTONE, /*! The CED tone exceeded 5s */ T30_ERR_T0_EXPIRED, /*! Timed out waiting for initial communication */ T30_ERR_T1_EXPIRED, /*! Timed out waiting for the first message */ T30_ERR_T3_EXPIRED, /*! Timed out waiting for procedural interrupt */ T30_ERR_HDLC_CARRIER, /*! The HDLC carrier did not stop in a timely manner */ T30_ERR_CANNOT_TRAIN, /*! Failed to train with any of the compatible modems */ T30_ERR_OPER_INT_FAIL, /*! Operator intervention failed */ T30_ERR_INCOMPATIBLE, /*! Far end is not compatible */ T30_ERR_RX_INCAPABLE, /*! Far end is not able to receive */ T30_ERR_TX_INCAPABLE, /*! Far end is not able to transmit */ T30_ERR_NORESSUPPORT, /*! Far end cannot receive at the resolution of the image */ T30_ERR_NOSIZESUPPORT, /*! Far end cannot receive at the size of image */ T30_ERR_UNEXPECTED, /*! Unexpected message received */ /* Phase E status values returned to a transmitter */ T30_ERR_TX_BADDCS, /*! Received bad response to DCS or training */ T30_ERR_TX_BADPG, /*! Received a DCN from remote after sending a page */ T30_ERR_TX_ECMPHD, /*! Invalid ECM response received from receiver */ T30_ERR_TX_GOTDCN, /*! Received a DCN while waiting for a DIS */ T30_ERR_TX_INVALRSP, /*! Invalid response after sending a page */ T30_ERR_TX_NODIS, /*! Received other than DIS while waiting for DIS */ T30_ERR_TX_PHBDEAD, /*! Received no response to DCS, training or TCF */ T30_ERR_TX_PHDDEAD, /*! No response after sending a page */ T30_ERR_TX_T5EXP, /*! Timed out waiting for receiver ready (ECM mode) */ /* Phase E status values returned to a receiver */ T30_ERR_RX_ECMPHD, /*! Invalid ECM response received from transmitter */ T30_ERR_RX_GOTDCS, /*! DCS received while waiting for DTC */ T30_ERR_RX_INVALCMD, /*! Unexpected command after page received */ T30_ERR_RX_NOCARRIER, /*! Carrier lost during fax receive */ T30_ERR_RX_NOEOL, /*! Timed out while waiting for EOL (end Of line) */ T30_ERR_RX_NOFAX, /*! Timed out while waiting for first line */ T30_ERR_RX_T2EXPDCN, /*! Timer T2 expired while waiting for DCN */ T30_ERR_RX_T2EXPD, /*! Timer T2 expired while waiting for phase D */ T30_ERR_RX_T2EXPFAX, /*! Timer T2 expired while waiting for fax page */ T30_ERR_RX_T2EXPMPS, /*! Timer T2 expired while waiting for next fax page */ T30_ERR_RX_T2EXPRR, /*! Timer T2 expired while waiting for RR command */ T30_ERR_RX_T2EXP, /*! Timer T2 expired while waiting for NSS, DCS or MCF */ T30_ERR_RX_DCNWHY, /*! Unexpected DCN while waiting for DCS or DIS */ T30_ERR_RX_DCNDATA, /*! Unexpected DCN while waiting for image data */ T30_ERR_RX_DCNFAX, /*! Unexpected DCN while waiting for EOM, EOP or MPS */ T30_ERR_RX_DCNPHD, /*! Unexpected DCN after EOM or MPS sequence */ T30_ERR_RX_DCNRRD, /*! Unexpected DCN after RR/RNR sequence */ T30_ERR_RX_DCNNORTN, /*! Unexpected DCN after requested retransmission */ /* TIFF file problems */ T30_ERR_FILEERROR, /*! TIFF/F file cannot be opened */ T30_ERR_NOPAGE, /*! TIFF/F page not found */ T30_ERR_BADTIFF, /*! TIFF/F format is not compatible */ T30_ERR_BADPAGE, /*! TIFF/F page number tag missing */ T30_ERR_BADTAG, /*! Incorrect values for TIFF/F tags */ T30_ERR_BADTIFFHDR, /*! Bad TIFF/F header - incorrect values in fields */ T30_ERR_NOMEM, /*! Cannot allocate memory for more pages */ /* General problems */ T30_ERR_RETRYDCN, /*! Disconnected after permitted retries */ T30_ERR_CALLDROPPED, /*! The call dropped prematurely */ /* Feature negotiation issues */ T30_ERR_NOPOLL, /*! Poll not accepted */ T30_ERR_IDENT_UNACCEPTABLE, /*! Far end's ident is not acceptable */ T30_ERR_SUB_UNACCEPTABLE, /*! Far end's sub-address is not acceptable */ T30_ERR_SEP_UNACCEPTABLE, /*! Far end's selective polling address is not acceptable */ T30_ERR_PSA_UNACCEPTABLE, /*! Far end's polled sub-address is not acceptable */ T30_ERR_SID_UNACCEPTABLE, /*! Far end's sender identification is not acceptable */ T30_ERR_PWD_UNACCEPTABLE, /*! Far end's password is not acceptable */ T30_ERR_TSA_UNACCEPTABLE, /*! Far end's transmitting subscriber internet address is not acceptable */ T30_ERR_IRA_UNACCEPTABLE, /*! Far end's internet routing address is not acceptable */ T30_ERR_CIA_UNACCEPTABLE, /*! Far end's calling subscriber internet address is not acceptable */ T30_ERR_ISP_UNACCEPTABLE, /*! Far end's internet selective polling address is not acceptable */ T30_ERR_CSA_UNACCEPTABLE /*! Far end's called subscriber internet address is not acceptable */ }; /*! I/O modes for the T.30 protocol. */ enum { T30_MODEM_NONE = 0, T30_MODEM_PAUSE, T30_MODEM_CED, T30_MODEM_CNG, T30_MODEM_V21, T30_MODEM_V27TER_2400, T30_MODEM_V27TER_4800, T30_MODEM_V29_7200, T30_MODEM_V29_9600, T30_MODEM_V17_7200, T30_MODEM_V17_9600, T30_MODEM_V17_12000, T30_MODEM_V17_14400, T30_MODEM_DONE }; enum { T30_FRONT_END_SEND_STEP_COMPLETE = 0, /*! The current receive has completed. This is only needed to report an unexpected end of the receive operation, as might happen with T.38 dying. */ T30_FRONT_END_RECEIVE_COMPLETE, T30_FRONT_END_SIGNAL_PRESENT, T30_FRONT_END_SIGNAL_ABSENT }; enum { T30_SUPPORT_V27TER = 0x01, T30_SUPPORT_V29 = 0x02, T30_SUPPORT_V17 = 0x04, T30_SUPPORT_V34 = 0x08, T30_SUPPORT_IAF = 0x10, }; enum { T30_SUPPORT_NO_COMPRESSION = 0x01, T30_SUPPORT_T4_1D_COMPRESSION = 0x02, T30_SUPPORT_T4_2D_COMPRESSION = 0x04, T30_SUPPORT_T6_COMPRESSION = 0x08, T30_SUPPORT_T85_COMPRESSION = 0x10, /* Monochrome JBIG */ T30_SUPPORT_T43_COMPRESSION = 0x20, /* Colour JBIG */ T30_SUPPORT_T45_COMPRESSION = 0x40 /* Run length colour compression */ }; enum { T30_SUPPORT_STANDARD_RESOLUTION = 0x01, T30_SUPPORT_FINE_RESOLUTION = 0x02, T30_SUPPORT_SUPERFINE_RESOLUTION = 0x04, T30_SUPPORT_R4_RESOLUTION = 0x10000, T30_SUPPORT_R8_RESOLUTION = 0x20000, T30_SUPPORT_R16_RESOLUTION = 0x40000, T30_SUPPORT_300_300_RESOLUTION = 0x100000, T30_SUPPORT_400_400_RESOLUTION = 0x200000, T30_SUPPORT_600_600_RESOLUTION = 0x400000, T30_SUPPORT_1200_1200_RESOLUTION = 0x800000, T30_SUPPORT_300_600_RESOLUTION = 0x1000000, T30_SUPPORT_400_800_RESOLUTION = 0x2000000, T30_SUPPORT_600_1200_RESOLUTION = 0x4000000 }; enum { T30_SUPPORT_215MM_WIDTH = 0x01, T30_SUPPORT_255MM_WIDTH = 0x02, T30_SUPPORT_303MM_WIDTH = 0x04, T30_SUPPORT_UNLIMITED_LENGTH = 0x10000, T30_SUPPORT_A4_LENGTH = 0x20000, T30_SUPPORT_B4_LENGTH = 0x40000, T30_SUPPORT_US_LETTER_LENGTH = 0x80000, T30_SUPPORT_US_LEGAL_LENGTH = 0x100000 }; enum { /*! Enable support of identification, through the SID and/or PWD frames */ T30_SUPPORT_IDENTIFICATION = 0x01, /*! Enable support of selective polling, through the SEP frame */ T30_SUPPORT_SELECTIVE_POLLING = 0x02, /*! Enable support of polling sub-addressing, through the PSA frame */ T30_SUPPORT_POLLED_SUB_ADDRESSING = 0x04, /*! Enable support of multiple selective polling, through repeated used of the SEP and PSA frames */ T30_SUPPORT_MULTIPLE_SELECTIVE_POLLING = 0x08, /*! Enable support of sub-addressing, through the SUB frame */ T30_SUPPORT_SUB_ADDRESSING = 0x10, /*! Enable support of transmitting subscriber internet address, through the TSA frame */ T30_SUPPORT_TRANSMITTING_SUBSCRIBER_INTERNET_ADDRESS = 0x20, /*! Enable support of internet routing address, through the IRA frame */ T30_SUPPORT_INTERNET_ROUTING_ADDRESS = 0x40, /*! Enable support of calling subscriber internet address, through the CIA frame */ T30_SUPPORT_CALLING_SUBSCRIBER_INTERNET_ADDRESS = 0x80, /*! Enable support of internet selective polling address, through the ISP frame */ T30_SUPPORT_INTERNET_SELECTIVE_POLLING_ADDRESS = 0x100, /*! Enable support of called subscriber internet address, through the CSA frame */ T30_SUPPORT_CALLED_SUBSCRIBER_INTERNET_ADDRESS = 0x200, /*! Enable support of the field not valid (FNV) frame */ T30_SUPPORT_FIELD_NOT_VALID = 0x400, /*! Enable support of the command repeat (CRP) frame */ T30_SUPPORT_COMMAND_REPEAT = 0x800 }; enum { T30_IAF_MODE_T37 = 0x01, T30_IAF_MODE_T38 = 0x02, T30_IAF_MODE_FLOW_CONTROL = 0x04, /*! Continuous flow mode means data is sent as fast as possible, usually across the Internet, where speed is not constrained by a PSTN modem. */ T30_IAF_MODE_CONTINUOUS_FLOW = 0x08, /*! No TCF means TCF is not exchanged. The end points must sort out usable speed issues locally. */ T30_IAF_MODE_NO_TCF = 0x10, /*! No fill bits means do not insert fill bits, even if the T.30 messages request them. */ T30_IAF_MODE_NO_FILL_BITS = 0x20, /*! No indicators means do not send indicator messages when using T.38. */ T30_IAF_MODE_NO_INDICATORS = 0x40 }; typedef struct { /*! \brief The identifier string (CSI, TSI, CIG). */ char ident[T30_MAX_IDENT_LEN + 1]; /*! \brief The sub-address string (SUB). */ char sub_address[T30_MAX_IDENT_LEN + 1]; /*! \brief The selective polling sub-address (SEP). */ char selective_polling_address[T30_MAX_IDENT_LEN + 1]; /*! \brief The polled sub-address (PSA). */ char polled_sub_address[T30_MAX_IDENT_LEN + 1]; /*! \brief The sender identification (SID). */ char sender_ident[T30_MAX_IDENT_LEN + 1]; /*! \brief The password (PWD). */ char password[T30_MAX_IDENT_LEN + 1]; /*! \brief Non-standard facilities (NSF). */ uint8_t *nsf; size_t nsf_len; /*! \brief Non-standard facilities command (NSC). */ uint8_t *nsc; size_t nsc_len; /*! \brief Non-standard facilities set-up (NSS). */ uint8_t *nss; size_t nss_len; /*! \brief Transmitting subscriber internet address (TSA). */ int tsa_type; char *tsa; size_t tsa_len; /*! \brief Internet routing address (IRA). */ int ira_type; char *ira; size_t ira_len; /*! \brief Calling subscriber internet address (CIA). */ int cia_type; char *cia; size_t cia_len; /*! \brief Internet selective polling address (ISP). */ int isp_type; char *isp; size_t isp_len; /*! \brief Called subscriber internet address (CSA). */ int csa_type; char *csa; size_t csa_len; } t30_exchanged_info_t; /*! T.30 FAX channel descriptor. This defines the state of a single working instance of a T.30 FAX channel. */ struct t30_state_s { /* This must be kept the first thing in the structure, so it can be pointed to reliably as the structures change over time. */ /*! \brief T.4 context for reading or writing image data. */ t4_state_t t4; int operation_in_progress; /*! \brief TRUE if behaving as the calling party */ int calling_party; /*! \brief The received DCS, formatted as an ASCII string, for inclusion in the TIFF file. */ char rx_dcs_string[T30_MAX_DIS_DTC_DCS_LEN*3 + 1]; /*! \brief The text which will be used in FAX page header. No text results in no header line. */ char header_info[T30_MAX_PAGE_HEADER_INFO + 1]; /*! \brief The information fields received. */ t30_exchanged_info_t rx_info; /*! \brief The information fields to be transmitted. */ t30_exchanged_info_t tx_info; /*! \brief The country of origin of the remote machine, if known, else NULL. */ const char *country; /*! \brief The vendor of the remote machine, if known, else NULL. */ const char *vendor; /*! \brief The model of the remote machine, if known, else NULL. */ const char *model; /*! \brief A pointer to a callback routine to be called when phase B events occur. */ t30_phase_b_handler_t *phase_b_handler; /*! \brief An opaque pointer supplied in event B callbacks. */ void *phase_b_user_data; /*! \brief A pointer to a callback routine to be called when phase D events occur. */ t30_phase_d_handler_t *phase_d_handler; /*! \brief An opaque pointer supplied in event D callbacks. */ void *phase_d_user_data; /*! \brief A pointer to a callback routine to be called when phase E events occur. */ t30_phase_e_handler_t *phase_e_handler; /*! \brief An opaque pointer supplied in event E callbacks. */ void *phase_e_user_data; /*! \brief A pointer to a callback routine to be called when frames are exchanged. */ t30_real_time_frame_handler_t *real_time_frame_handler; /*! \brief An opaque pointer supplied in real time frame callbacks. */ void *real_time_frame_user_data; /*! \brief A pointer to a callback routine to be called when document events (e.g. end of transmitted document) occur. */ t30_document_handler_t *document_handler; /*! \brief An opaque pointer supplied in document callbacks. */ void *document_user_data; /*! \brief The handler for changes to the receive mode */ t30_set_handler_t *set_rx_type_handler; /*! \brief An opaque pointer passed to the handler for changes to the receive mode */ void *set_rx_type_user_data; /*! \brief The handler for changes to the transmit mode */ t30_set_handler_t *set_tx_type_handler; /*! \brief An opaque pointer passed to the handler for changes to the transmit mode */ void *set_tx_type_user_data; /*! \brief The transmitted HDLC frame handler. */ t30_send_hdlc_handler_t *send_hdlc_handler; /*! \brief An opaque pointer passed to the transmitted HDLC frame handler. */ void *send_hdlc_user_data; /*! \brief The DIS code for the minimum scan row time we require. This is usually 0ms, but if we are trying to simulate another type of FAX machine, we may need a non-zero value here. */ uint8_t local_min_scan_time_code; /*! \brief The current T.30 phase. */ int phase; /*! \brief The T.30 phase to change to when the current phase ends. */ int next_phase; /*! \brief The current state of the T.30 state machine. */ int state; /*! \brief The step in sending a sequence of HDLC frames. */ int step; /*! \brief The preparation buffer for the DCS message to be transmitted. */ uint8_t dcs_frame[T30_MAX_DIS_DTC_DCS_LEN]; /*! \brief The length of the DCS message to be transmitted. */ int dcs_len; /*! \brief The preparation buffer for DIS or DTC message to be transmitted. */ uint8_t local_dis_dtc_frame[T30_MAX_DIS_DTC_DCS_LEN]; /*! \brief The length of the DIS or DTC message to be transmitted. */ int local_dis_dtc_len; /*! \brief The last DIS or DTC message received form the far end. */ uint8_t far_dis_dtc_frame[T30_MAX_DIS_DTC_DCS_LEN]; /*! \brief The length of the last DIS or DTC message received form the far end. */ int far_dis_dtc_len; /*! \brief TRUE if a valid DIS has been received from the far end. */ int dis_received; /*! \brief A flag to indicate a message is in progress. */ int in_message; /*! \brief TRUE if the short training sequence should be used. */ int short_train; /*! \brief A count of the number of bits in the trainability test. */ int training_test_bits; /*! \brief The current count of consecutive zero bits, during the trainability test. */ int training_current_zeros; /*! \brief The maximum consecutive zero bits seen to date, during the trainability test. */ int training_most_zeros; /*! \brief The current fallback step for the fast message transfer modem. */ int current_fallback; /*! \brief The subset of supported modems allowed at the current time, allowing for negotiation. */ int current_permitted_modems; /*! \brief TRUE if a carrier is present. Otherwise FALSE. */ int rx_signal_present; /*! \brief TRUE if a modem has trained correctly. */ int rx_trained; int current_rx_type; int current_tx_type; /*! \brief T0 is the answer timeout when calling another FAX machine. Placing calls is handled outside the FAX processing, but this timeout keeps running until V.21 modulation is sent or received. T1 is the remote terminal identification timeout (in audio samples). */ int timer_t0_t1; /*! \brief T2 is the HDLC command timeout. T4 is the HDLC response timeout (in audio samples). */ int timer_t2_t4; /*! \brief TRUE if the T2/T4 timer is actually timing T4 */ int timer_is_t4; /*! \brief Procedural interrupt timeout (in audio samples). */ int timer_t3; /*! \brief This is only used in error correcting mode. */ int timer_t5; /*! \brief This is only used in full duplex (e.g. ISDN) modes. */ int timer_t6; /*! \brief This is only used in full duplex (e.g. ISDN) modes. */ int timer_t7; /*! \brief This is only used in full duplex (e.g. ISDN) modes. */ int timer_t8; /*! \brief TRUE once the far end FAX entity has been detected. */ int far_end_detected; /*! \brief TRUE if a local T.30 interrupt is pending. */ int local_interrupt_pending; /*! \brief The image coding being used on the line. */ int line_encoding; /*! \brief The image coding being used for output files. */ int output_encoding; /*! \brief The current DCS message minimum scan time code. */ uint8_t min_scan_time_code; /*! \brief The X direction resolution of the current image, in pixels per metre. */ int x_resolution; /*! \brief The Y direction resolution of the current image, in pixels per metre. */ int y_resolution; /*! \brief The width of the current image, in pixels. */ t4_image_width_t image_width; /*! \brief Current number of retries of the action in progress. */ int retries; /*! \brief TRUE if error correcting mode is used. */ int error_correcting_mode; /*! \brief The current count of consecutive T30_PPR messages. */ int ppr_count; /*! \brief The current count of consecutive T30_RNR messages. */ int receiver_not_ready_count; /*! \brief The number of octets to be used per ECM frame. */ int octets_per_ecm_frame; /*! \brief The ECM partial page buffer. */ uint8_t ecm_data[256][260]; /*! \brief The lengths of the frames in the ECM partial page buffer. */ int16_t ecm_len[256]; /*! \brief A bit map of the OK ECM frames, constructed as a PPR frame. */ uint8_t ecm_frame_map[3 + 32]; /*! \brief The current page number, in ECM mode */ int ecm_page; /*! \brief The current block number, in ECM mode */ int ecm_block; /*! \brief The number of frames in the current block number, in ECM mode */ int ecm_frames; /*! \brief The number of frames sent in the current burst of image transmission, in ECM mode */ int ecm_frames_this_tx_burst; /*! \brief The current ECM frame, during ECM transmission. */ int ecm_current_tx_frame; /*! \brief TRUE if we are at the end of an ECM page to se sent - i.e. there are no more partial pages still to come. */ int ecm_at_page_end; int next_tx_step; int next_rx_step; /*! \brief Image file name for image reception. */ char rx_file[256]; /*! \brief The last page we are prepared accept for a received image file. -1 means no restriction. */ int rx_stop_page; /*! \brief Image file name to be sent. */ char tx_file[256]; /*! \brief The first page to be sent from the image file. -1 means no restriction. */ int tx_start_page; /*! \brief The last page to be sent from the image file. -1 means no restriction. */ int tx_stop_page; int current_status; /*! \brief Internet Aware FAX mode bit mask. */ int iaf; /*! \brief A bit mask of the currently supported modem types. */ int supported_modems; /*! \brief A bit mask of the currently supported image compression modes. */ int supported_compressions; /*! \brief A bit mask of the currently supported image resolutions. */ int supported_resolutions; /*! \brief A bit mask of the currently supported image sizes. */ int supported_image_sizes; /*! \brief A bit mask of the currently supported T.30 special features. */ int supported_t30_features; /*! \brief TRUE is ECM mode handling is enabled. */ int ecm_allowed; /*! \brief the FCF2 field of the last PPS message we received. */ int last_pps_fcf2; /*! \brief The number of the first ECM frame which we do not currently received correctly. For a partial page received correctly, this will be one greater than the number of frames it contains. */ int ecm_first_bad_frame; /*! \brief A count of successfully received ECM frames, to assess progress as a basis for deciding whether to continue error correction when PPRs keep repeating. */ int ecm_progress; /*! \brief Error and flow logging control */ logging_state_t logging; }; typedef struct { /*! \brief The current bit rate for image transfer. */ int bit_rate; /*! \brief TRUE if error correcting mode is used. */ int error_correcting_mode; /*! \brief The number of pages transferred so far. */ int pages_transferred; /*! \brief The number of pages in the file (<0 if not known). */ int pages_in_file; /*! \brief The number of horizontal pixels in the most recent page. */ int width; /*! \brief The number of vertical pixels in the most recent page. */ int length; /*! \brief The number of bad pixel rows in the most recent page. */ int bad_rows; /*! \brief The largest number of bad pixel rows in a block in the most recent page. */ int longest_bad_row_run; /*! \brief The horizontal column-to-column resolution of the page in pixels per metre */ int x_resolution; /*! \brief The vertical row-to-row resolution of the page in pixels per metre */ int y_resolution; /*! \brief The type of compression used between the FAX machines */ int encoding; /*! \brief The size of the image, in bytes */ int image_size; /*! \brief Current status */ int current_status; } t30_stats_t; #if defined(__cplusplus) extern "C" { #endif /*! Initialise a T.30 context. \brief Initialise a T.30 context. \param s The T.30 context. \param calling_party TRUE if the context is for a calling party. FALSE if the context is for an answering party. \param set_rx_type_handler \param set_rx_type_user_data \param set_tx_type_handler \param set_tx_type_user_data \param send_hdlc_handler \param send_hdlc_user_data \return A pointer to the context, or NULL if there was a problem. */ t30_state_t *t30_init(t30_state_t *s, int calling_party, t30_set_handler_t *set_rx_type_handler, void *set_rx_type_user_data, t30_set_handler_t *set_tx_type_handler, void *set_tx_type_user_data, t30_send_hdlc_handler_t *send_hdlc_handler, void *send_hdlc_user_data); /*! Release a T.30 context. \brief Release a T.30 context. \param s The T.30 context. \return 0 for OK, else -1. */ int t30_release(t30_state_t *s); /*! Free a T.30 context. \brief Free a T.30 context. \param s The T.30 context. \return 0 for OK, else -1. */ int t30_free(t30_state_t *s); /*! Restart a T.30 context. \brief Restart a T.30 context. \param s The T.30 context. \return 0 for OK, else -1. */ int t30_restart(t30_state_t *s); /*! Cleanup a T.30 context if the call terminates. \brief Cleanup a T.30 context if the call terminates. \param s The T.30 context. */ void t30_terminate(t30_state_t *s); /*! Inform the T.30 engine of a status change in the front end (end of tx, rx signal change, etc.). \brief Inform the T.30 engine of a status change in the front end (end of tx, rx signal change, etc.). \param user_data The T.30 context. \param status The type of status change which occured. */ void t30_front_end_status(void *user_data, int status); /*! Get a bit of received non-ECM image data. \brief Get a bit of received non-ECM image data. \param user_data An opaque pointer, which must point to the T.30 context. \return The next bit to transmit. */ int t30_non_ecm_get_bit(void *user_data); /*! Get a byte of received non-ECM image data. \brief Get a byte of received non-ECM image data. \param user_data An opaque pointer, which must point to the T.30 context. \return The next byte to transmit. */ int t30_non_ecm_get_byte(void *user_data); /*! Get a chunk of received non-ECM image data. \brief Get a bit of received non-ECM image data. \param user_data An opaque pointer, which must point to the T.30 context. \param buf The buffer to contain the data. \param max_len The maximum length of the chunk. \return The actual length of the chunk. */ int t30_non_ecm_get_chunk(void *user_data, uint8_t buf[], int max_len); /*! Process a bit of received non-ECM image data. \brief Process a bit of received non-ECM image data \param user_data An opaque pointer, which must point to the T.30 context. \param bit The received bit. */ void t30_non_ecm_put_bit(void *user_data, int bit); /*! Process a byte of received non-ECM image data. \brief Process a byte of received non-ECM image data \param user_data An opaque pointer, which must point to the T.30 context. \param byte The received byte. */ void t30_non_ecm_put_byte(void *user_data, int byte); /*! Process a chunk of received non-ECM image data. \brief Process a chunk of received non-ECM image data \param user_data An opaque pointer, which must point to the T.30 context. \param buf The buffer containing the received data. \param len The length of the data in buf. */ void t30_non_ecm_put_chunk(void *user_data, const uint8_t buf[], int len); /*! Process a received HDLC frame. \brief Process a received HDLC frame. \param user_data The T.30 context. \param msg The HDLC message. \param len The length of the message, in octets. \param ok TRUE if the frame was received without error. */ void t30_hdlc_accept(void *user_data, const uint8_t *msg, int len, int ok); /*! Report the passage of time to the T.30 engine. \brief Report the passage of time to the T.30 engine. \param s The T.30 context. \param samples The time change in 1/8000th second steps. */ void t30_timer_update(t30_state_t *s, int samples); /*! Get the current transfer statistics for the file being sent or received. \brief Get the current transfer statistics. \param s The T.30 context. \param t A pointer to a buffer for the statistics. */ void t30_get_transfer_statistics(t30_state_t *s, t30_stats_t *t); /*! Request a local interrupt of FAX exchange. \brief Request a local interrupt of FAX exchange. \param s The T.30 context. \param state TRUE to enable interrupt request, else FALSE. */ void t30_local_interrupt_request(t30_state_t *s, int state); #if defined(__cplusplus) } #endif #endif /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/spandsp/async.h0000644000175000017500000002162511150047205020617 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * async.h - Asynchronous serial bit stream encoding and decoding * * Written by Steve Underwood * * Copyright (C) 2003 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: async.h,v 1.16 2008/07/17 14:27:11 steveu Exp $ */ /*! \file */ /*! \page async_page Asynchronous bit stream processing \section async_page_sec_1 What does it do? The asynchronous serial bit stream processing module provides generation and decoding facilities for most asynchronous data formats. It supports: - 1 or 2 stop bits. - Odd, even or no parity. - 5, 6, 7, or 8 bit characters. - V.14 rate adaption. The input to this module is a bit stream. This means any symbol synchronisation and decoding must occur before data is fed to this module. \section async_page_sec_2 The transmitter ???. \section async_page_sec_3 The receiver ???. */ #if !defined(_SPANDSP_ASYNC_H_) #define _SPANDSP_ASYNC_H_ /*! Special "bit" values for the put and get bit functions */ enum { /*! \brief The carrier signal has dropped. */ PUTBIT_CARRIER_DOWN = -1, /*! \brief The carrier signal is up. This merely indicates that carrier energy has been seen. It is not an indication that the carrier is either valid, or of the expected type. */ PUTBIT_CARRIER_UP = -2, /*! \brief The modem is training. This is an early indication that the signal seems to be of the right type. This may be needed in time critical applications, like T.38, to forward an early indication of what is happening on the wire. */ PUTBIT_TRAINING_IN_PROGRESS = -3, /*! \brief The modem has trained, and is ready for data exchange. */ PUTBIT_TRAINING_SUCCEEDED = -4, /*! \brief The modem has failed to train. */ PUTBIT_TRAINING_FAILED = -5, /*! \brief Packet framing (e.g. HDLC framing) is OK. */ PUTBIT_FRAMING_OK = -6, /*! \brief The data stream has ended. */ PUTBIT_END_OF_DATA = -7, /*! \brief An abort signal (e.g. an HDLC abort) has been received. */ PUTBIT_ABORT = -8, /*! \brief A break signal (e.g. an async break) has been received. */ PUTBIT_BREAK = -9, /*! \brief Regular octet report for things like HDLC to the MTP standards. */ PUTBIT_OCTET_REPORT = -10 }; enum { /*! \brief The data source for a transmitter is exhausted. */ MODEM_TX_STATUS_DATA_EXHAUSTED = -1, /*! \brief The transmitter has completed its task, and shut down. */ MODEM_TX_STATUS_SHUTDOWN_COMPLETE = -2 }; /*! Message put function for data pumps */ typedef void (*put_msg_func_t)(void *user_data, const uint8_t *msg, int len); /*! Message get function for data pumps */ typedef int (*get_msg_func_t)(void *user_data, uint8_t *msg, int max_len); /*! Byte put function for data pumps */ typedef void (*put_byte_func_t)(void *user_data, int byte); /*! Byte get function for data pumps */ typedef int (*get_byte_func_t)(void *user_data); /*! Bit put function for data pumps */ typedef void (*put_bit_func_t)(void *user_data, int bit); /*! Bit get function for data pumps */ typedef int (*get_bit_func_t)(void *user_data); /*! Completion callback function for tx data pumps */ typedef int (*modem_tx_status_func_t)(void *user_data, int status); /*! Completion callback function for rx data pumps */ typedef int (*modem_rx_status_func_t)(void *user_data, int status); enum { /*! No parity bit should be used */ ASYNC_PARITY_NONE = 0, /*! An even parity bit will exist, after the data bits */ ASYNC_PARITY_EVEN, /*! An odd parity bit will exist, after the data bits */ ASYNC_PARITY_ODD }; /*! Asynchronous data transmit descriptor. This defines the state of a single working instance of a byte to asynchronous serial converter, for use in FSK modems. */ typedef struct { /*! \brief The number of data bits per character. */ int data_bits; /*! \brief The type of parity. */ int parity; /*! \brief The number of stop bits per character. */ int stop_bits; /*! \brief A pointer to the callback routine used to get characters to be transmitted. */ get_byte_func_t get_byte; /*! \brief An opaque pointer passed when calling get_byte. */ void *user_data; /*! \brief A current, partially transmitted, character. */ int byte_in_progress; /*! \brief The current bit position within a partially transmitted character. */ int bitpos; /*! \brief Parity bit. */ int parity_bit; } async_tx_state_t; /*! Asynchronous data receive descriptor. This defines the state of a single working instance of an asynchronous serial to byte converter, for use in FSK modems. */ typedef struct { /*! \brief The number of data bits per character. */ int data_bits; /*! \brief The type of parity. */ int parity; /*! \brief The number of stop bits per character. */ int stop_bits; /*! \brief TRUE if V.14 rate adaption processing should be performed. */ int use_v14; /*! \brief A pointer to the callback routine used to handle received characters. */ put_byte_func_t put_byte; /*! \brief An opaque pointer passed when calling put_byte. */ void *user_data; /*! \brief A current, partially complete, character. */ int byte_in_progress; /*! \brief The current bit position within a partially complete character. */ int bitpos; /*! \brief Parity bit. */ int parity_bit; /*! A count of the number of parity errors seen. */ int parity_errors; /*! A count of the number of character framing errors seen. */ int framing_errors; } async_rx_state_t; #if defined(__cplusplus) extern "C" { #endif /*! Initialise an asynchronous data transmit context. \brief Initialise an asynchronous data transmit context. \param s The transmitter context. \param data_bits The number of data bit. \param parity_bits The type of parity. \param stop_bits The number of stop bits. \param use_v14 TRUE if V.14 rate adaption processing should be used. \param get_byte The callback routine used to get the data to be transmitted. \param user_data An opaque pointer. \return A pointer to the initialised context, or NULL if there was a problem. */ async_tx_state_t *async_tx_init(async_tx_state_t *s, int data_bits, int parity_bits, int stop_bits, int use_v14, get_byte_func_t get_byte, void *user_data); /*! Get the next bit of a transmitted serial bit stream. \brief Get the next bit of a transmitted serial bit stream. \param user_data An opaque point which must point to a transmitter context. \return the next bit, or PUTBIT_END_OF_DATA to indicate the data stream has ended. */ int async_tx_get_bit(void *user_data); /*! Initialise an asynchronous data receiver context. \brief Initialise an asynchronous data receiver context. \param s The receiver context. \param data_bits The number of data bits. \param parity_bits The type of parity. \param stop_bits The number of stop bits. \param use_v14 TRUE if V.14 rate adaption processing should be used. \param put_byte The callback routine used to put the received data. \param user_data An opaque pointer. \return A pointer to the initialised context, or NULL if there was a problem. */ async_rx_state_t *async_rx_init(async_rx_state_t *s, int data_bits, int parity_bits, int stop_bits, int use_v14, put_byte_func_t put_byte, void *user_data); /*! Accept a bit from a received serial bit stream \brief Accept a bit from a received serial bit stream \param user_data An opaque point which must point to a receiver context. \param bit The new bit. Some special values are supported for this field. - PUTBIT_CARRIER_UP - PUTBIT_CARRIER_DOWN - PUTBIT_TRAINING_SUCCEEDED - PUTBIT_TRAINING_FAILED - PUTBIT_END_OF_DATA */ void async_rx_put_bit(void *user_data, int bit); #if defined(__cplusplus) } #endif #endif /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/spandsp/g711.h0000644000175000017500000002221211150047205020152 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * g711.h - In line A-law and u-law conversion routines * * Written by Steve Underwood * * Copyright (C) 2001 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: g711.h,v 1.14 2008/05/02 17:57:32 steveu Exp $ */ /*! \file */ /*! \page g711_page A-law and mu-law handling Lookup tables for A-law and u-law look attractive, until you consider the impact on the CPU cache. If it causes a substantial area of your processor cache to get hit too often, cache sloshing will severely slow things down. The main reason these routines are slow in C, is the lack of direct access to the CPU's "find the first 1" instruction. A little in-line assembler fixes that, and the conversion routines can be faster than lookup tables, in most real world usage. A "find the first 1" instruction is available on most modern CPUs, and is a much underused feature. If an assembly language method of bit searching is not available, these routines revert to a method that can be a little slow, so the cache thrashing might not seem so bad :( Feel free to submit patches to add fast "find the first 1" support for your own favourite processor. Look up tables are used for transcoding between A-law and u-law, since it is difficult to achieve the precise transcoding procedure laid down in the G.711 specification by other means. */ #if !defined(_SPANDSP_G711_H_) #define _SPANDSP_G711_H_ /* The usual values to use on idle channels, to emulate silence */ #define G711_ALAW_IDLE_OCTET 0x5D #define G711_ULAW_IDLE_OCTET 0xFF enum { G711_ALAW = 0, G711_ULAW }; typedef struct { /*! One of the G.711_xxx options */ int mode; } g711_state_t; #if defined(__cplusplus) extern "C" { #endif /* N.B. It is tempting to use look-up tables for A-law and u-law conversion. * However, you should consider the cache footprint. * * A 64K byte table for linear to x-law and a 512 byte table for x-law to * linear sound like peanuts these days, and shouldn't an array lookup be * real fast? No! When the cache sloshes as badly as this one will, a tight * calculation may be better. The messiest part is normally finding the * segment, but a little inline assembly can fix that on an i386, x86_64 and * many other modern processors. */ /* * Mu-law is basically as follows: * * Biased Linear Input Code Compressed Code * ------------------------ --------------- * 00000001wxyza 000wxyz * 0000001wxyzab 001wxyz * 000001wxyzabc 010wxyz * 00001wxyzabcd 011wxyz * 0001wxyzabcde 100wxyz * 001wxyzabcdef 101wxyz * 01wxyzabcdefg 110wxyz * 1wxyzabcdefgh 111wxyz * * Each biased linear code has a leading 1 which identifies the segment * number. The value of the segment number is equal to 7 minus the number * of leading 0's. The quantization interval is directly available as the * four bits wxyz. * The trailing bits (a - h) are ignored. * * Ordinarily the complement of the resulting code word is used for * transmission, and so the code word is complemented before it is returned. * * For further information see John C. Bellamy's Digital Telephony, 1982, * John Wiley & Sons, pps 98-111 and 472-476. */ //#define ULAW_ZEROTRAP /* turn on the trap as per the MIL-STD */ #define ULAW_BIAS 0x84 /* Bias for linear code. */ /*! \brief Encode a linear sample to u-law \param linear The sample to encode. \return The u-law value. */ static __inline__ uint8_t linear_to_ulaw(int linear) { uint8_t u_val; int mask; int seg; /* Get the sign and the magnitude of the value. */ if (linear >= 0) { linear = ULAW_BIAS + linear; mask = 0xFF; } else { linear = ULAW_BIAS - linear; mask = 0x7F; } seg = top_bit(linear | 0xFF) - 7; /* * Combine the sign, segment, quantization bits, * and complement the code word. */ if (seg >= 8) u_val = (uint8_t) (0x7F ^ mask); else u_val = (uint8_t) (((seg << 4) | ((linear >> (seg + 3)) & 0xF)) ^ mask); #ifdef ULAW_ZEROTRAP /* Optional ITU trap */ if (u_val == 0) u_val = 0x02; #endif return u_val; } /*- End of function --------------------------------------------------------*/ /*! \brief Decode an u-law sample to a linear value. \param ulaw The u-law sample to decode. \return The linear value. */ static __inline__ int16_t ulaw_to_linear(uint8_t ulaw) { int t; /* Complement to obtain normal u-law value. */ ulaw = ~ulaw; /* * Extract and bias the quantization bits. Then * shift up by the segment number and subtract out the bias. */ t = (((ulaw & 0x0F) << 3) + ULAW_BIAS) << (((int) ulaw & 0x70) >> 4); return (int16_t) ((ulaw & 0x80) ? (ULAW_BIAS - t) : (t - ULAW_BIAS)); } /*- End of function --------------------------------------------------------*/ /* * A-law is basically as follows: * * Linear Input Code Compressed Code * ----------------- --------------- * 0000000wxyza 000wxyz * 0000001wxyza 001wxyz * 000001wxyzab 010wxyz * 00001wxyzabc 011wxyz * 0001wxyzabcd 100wxyz * 001wxyzabcde 101wxyz * 01wxyzabcdef 110wxyz * 1wxyzabcdefg 111wxyz * * For further information see John C. Bellamy's Digital Telephony, 1982, * John Wiley & Sons, pps 98-111 and 472-476. */ #define ALAW_AMI_MASK 0x55 /*! \brief Encode a linear sample to A-law \param linear The sample to encode. \return The A-law value. */ static __inline__ uint8_t linear_to_alaw(int linear) { int mask; int seg; if (linear >= 0) { /* Sign (bit 7) bit = 1 */ mask = ALAW_AMI_MASK | 0x80; } else { /* Sign (bit 7) bit = 0 */ mask = ALAW_AMI_MASK; linear = -linear - 1; } /* Convert the scaled magnitude to segment number. */ seg = top_bit(linear | 0xFF) - 7; if (seg >= 8) { if (linear >= 0) { /* Out of range. Return maximum value. */ return (uint8_t) (0x7F ^ mask); } /* We must be just a tiny step below zero */ return (uint8_t) (0x00 ^ mask); } /* Combine the sign, segment, and quantization bits. */ return (uint8_t) (((seg << 4) | ((linear >> ((seg) ? (seg + 3) : 4)) & 0x0F)) ^ mask); } /*- End of function --------------------------------------------------------*/ /*! \brief Decode an A-law sample to a linear value. \param alaw The A-law sample to decode. \return The linear value. */ static __inline__ int16_t alaw_to_linear(uint8_t alaw) { int i; int seg; alaw ^= ALAW_AMI_MASK; i = ((alaw & 0x0F) << 4); seg = (((int) alaw & 0x70) >> 4); if (seg) i = (i + 0x108) << (seg - 1); else i += 8; return (int16_t) ((alaw & 0x80) ? i : -i); } /*- End of function --------------------------------------------------------*/ /*! \brief Transcode from A-law to u-law, using the procedure defined in G.711. \param alaw The A-law sample to transcode. \return The best matching u-law value. */ uint8_t alaw_to_ulaw(uint8_t alaw); /*! \brief Transcode from u-law to A-law, using the procedure defined in G.711. \param ulaw The u-law sample to transcode. \return The best matching A-law value. */ uint8_t ulaw_to_alaw(uint8_t ulaw); int g711_decode(g711_state_t *s, int16_t amp[], const uint8_t g711_data[], int g711_bytes); int g711_encode(g711_state_t *s, uint8_t g711_data[], const int16_t amp[], int len); int g711_transcode(g711_state_t *s, uint8_t g711_out[], const uint8_t g711_in[], int g711_bytes); /*! Initialise a G.711 encode or decode context. \param s The G.711 context. \param mode The G.711 mode. \return A pointer to the G.711 context, or NULL for error. */ g711_state_t *g711_init(g711_state_t *s, int mode); /*! Free a G.711 encode or decode context. \param s The G.711 context. \return 0 for OK. */ int g711_release(g711_state_t *s); #if defined(__cplusplus) } #endif #endif /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/spandsp/v27ter_tx.h0000644000175000017500000002077311150047205021351 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * v27ter_tx.h - ITU V.27ter modem transmit part * * Written by Steve Underwood * * Copyright (C) 2003 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: v27ter_tx.h,v 1.36 2008/07/16 14:23:48 steveu Exp $ */ /*! \file */ #if !defined(_SPANDSP_V27TER_TX_H_) #define _SPANDSP_V27TER_TX_H_ /*! \page v27ter_tx_page The V.27ter transmitter \section v27ter_tx_page_sec_1 What does it do? The V.27ter transmitter implements the transmit side of a V.27ter modem. This can operate at data rates of 4800 and 2400 bits/s. The audio output is a stream of 16 bit samples, at 8000 samples/second. The transmit and receive side of V.27ter modems operate independantly. V.27ter is used for FAX transmission, where it provides the standard 4800 and 2400 bits/s rates. \section v27ter_tx_page_sec_2 How does it work? V.27ter uses DPSK modulation. A common method of producing a DPSK modulated signal is to use a sampling rate which is a multiple of the baud rate. The raw signal is then a series of complex pulses, each an integer number of samples long. These can be shaped, using a suitable complex filter, and multiplied by a complex carrier signal to produce the final DPSK signal for transmission. The pulse shaping filter for V.27ter is defined in the spec. It is a root raised cosine filter with 50% excess bandwidth. The sampling rate for our transmitter is defined by the channel - 8000 samples/s. This is a multiple of the baud rate at 4800 bits/s (8-PSK at 1600 baud, 5 samples per symbol), but not at 2400 bits/s (4-PSK at 1200 baud, 20/3 samples per symbol). The baud interval is actually 20/3 sample periods at 2400bis/s. A symmetric FIR is used to apply root raised cosine filtering in the 4800bits/s mode. In the 2400bits/s mode a polyphase FIR filter is used. This consists of 20 sets of coefficients, offering zero to 19/20ths of a baud phase shift as well as root raised cosine filtering. The appropriate coefficient set is chosen for each signal sample generated. The carrier is generated using the DDS method. Using 2 second order resonators, started in quadrature, might be more efficient, as it would have less impact on the processor cache than a table lookup approach. However, the DDS approach suits the receiver better, so then same signal generator is also used for the transmitter. */ #define V27TER_TX_FILTER_STEPS 9 /*! V.27ter modem transmit side descriptor. This defines the working state for a single instance of a V.27ter modem transmitter. */ typedef struct { /*! \brief The bit rate of the modem. Valid values are 2400 and 4800. */ int bit_rate; /*! \brief The callback function used to get the next bit to be transmitted. */ get_bit_func_t get_bit; /*! \brief A user specified opaque pointer passed to the get_bit function. */ void *get_bit_user_data; /*! \brief The callback function used to report modem status changes. */ modem_tx_status_func_t status_handler; /*! \brief A user specified opaque pointer passed to the status function. */ void *status_user_data; #if defined(SPANDSP_USE_FIXED_POINT) /*! \brief The gain factor needed to achieve the specified output power at 2400bps. */ int32_t gain_2400; /*! \brief The gain factor needed to achieve the specified output power at 4800bps. */ int32_t gain_4800; #else /*! \brief The gain factor needed to achieve the specified output power at 2400bps. */ float gain_2400; /*! \brief The gain factor needed to achieve the specified output power at 4800bps. */ float gain_4800; #endif /*! \brief The route raised cosine (RRC) pulse shaping filter buffer. */ #if defined(SPANDSP_USE_FIXED_POINT) complexi16_t rrc_filter[2*V27TER_TX_FILTER_STEPS]; #else complexf_t rrc_filter[2*V27TER_TX_FILTER_STEPS]; #endif /*! \brief Current offset into the RRC pulse shaping filter buffer. */ int rrc_filter_step; /*! \brief The register for the training and data scrambler. */ unsigned int scramble_reg; /*! \brief A counter for the number of consecutive bits of repeating pattern through the scrambler. */ int scrambler_pattern_count; /*! \brief TRUE if transmitting the training sequence, or shutting down transmission. FALSE if transmitting user data. */ int in_training; /*! \brief A counter used to track progress through sending the training sequence. */ int training_step; /*! \brief The current phase of the carrier (i.e. the DDS parameter). */ uint32_t carrier_phase; /*! \brief The update rate for the phase of the carrier (i.e. the DDS increment). */ int32_t carrier_phase_rate; /*! \brief The current fractional phase of the baud timing. */ int baud_phase; /*! \brief The code number for the current position in the constellation. */ int constellation_state; /*! \brief The get_bit function in use at any instant. */ get_bit_func_t current_get_bit; /*! \brief Error and flow logging control */ logging_state_t logging; } v27ter_tx_state_t; #if defined(__cplusplus) extern "C" { #endif /*! Adjust a V.27ter modem transmit context's power output. \brief Adjust a V.27ter modem transmit context's output power. \param s The modem context. \param power The power level, in dBm0 */ void v27ter_tx_power(v27ter_tx_state_t *s, float power); /*! Initialise a V.27ter modem transmit context. \brief Initialise a V.27ter modem transmit context. \param s The modem context. \param bit_rate The bit rate of the modem. Valid values are 2400 and 4800. \param tep TRUE is the optional TEP tone is to be transmitted. \param get_bit The callback routine used to get the data to be transmitted. \param user_data An opaque pointer. \return A pointer to the modem context, or NULL if there was a problem. */ v27ter_tx_state_t *v27ter_tx_init(v27ter_tx_state_t *s, int bit_rate, int tep, get_bit_func_t get_bit, void *user_data); /*! Reinitialise an existing V.27ter modem transmit context, so it may be reused. \brief Reinitialise an existing V.27ter modem transmit context. \param s The modem context. \param bit_rate The bit rate of the modem. Valid values are 2400 and 4800. \param tep TRUE is the optional TEP tone is to be transmitted. \return 0 for OK, -1 for bad parameter */ int v27ter_tx_restart(v27ter_tx_state_t *s, int bit_rate, int tep); /*! Free a V.27ter modem transmit context. \brief Free a V.27ter modem transmit context. \param s The modem context. \return 0 for OK */ int v27ter_tx_free(v27ter_tx_state_t *s); /*! Change the get_bit function associated with a V.27ter modem transmit context. \brief Change the get_bit function associated with a V.27ter modem transmit context. \param s The modem context. \param get_bit The callback routine used to get the data to be transmitted. \param user_data An opaque pointer. */ void v27ter_tx_set_get_bit(v27ter_tx_state_t *s, get_bit_func_t get_bit, void *user_data); /*! Change the modem status report function associated with a V.27ter modem transmit context. \brief Change the modem status report function associated with a V.27ter modem transmit context. \param s The modem context. \param handler The callback routine used to report modem status changes. \param user_data An opaque pointer. */ void v27ter_tx_set_modem_status_handler(v27ter_tx_state_t *s, modem_tx_status_func_t handler, void *user_data); /*! Generate a block of V.27ter modem audio samples. \brief Generate a block of V.27ter modem audio samples. \param s The modem context. \param amp The audio sample buffer. \param len The number of samples to be generated. \return The number of samples actually generated. */ int v27ter_tx(v27ter_tx_state_t *s, int16_t amp[], int len); #if defined(__cplusplus) } #endif #endif /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/spandsp/bitstream.h0000644000175000017500000000567111150047205021477 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * bitstream.h - Bitstream composition and decomposition routines. * * Written by Steve Underwood * * Copyright (C) 2006 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: bitstream.h,v 1.10 2008/04/17 14:27:00 steveu Exp $ */ /*! \file */ #if !defined(_SPANDSP_BITSTREAM_H_) #define _SPANDSP_BITSTREAM_H_ /*! \page bitstream_page Bitstream composition and decomposition \section bitstream_page_sec_1 What does it do? \section bitstream_page_sec_2 How does it work? */ /*! Bitstream handler state */ typedef struct { /*! The bit stream. */ unsigned int bitstream; /*! The residual bits in bitstream. */ unsigned int residue; } bitstream_state_t; #if defined(__cplusplus) extern "C" { #endif /*! \brief Put a chunk of bits into the output buffer. \param s A pointer to the bitstream context. \param c A pointer to the bitstream output buffer. \param value The value to be pushed into the output buffer. \param bits The number of bits of value to be pushed. 1 to 25 bit is valid. */ void bitstream_put(bitstream_state_t *s, uint8_t **c, unsigned int value, int bits); void bitstream_put2(bitstream_state_t *s, uint8_t **c, unsigned int value, int bits); /*! \brief Get a chunk of bits from the input buffer. \param s A pointer to the bitstream context. \param c A pointer to the bitstream input buffer. \param bits The number of bits of value to be grabbed. 1 to 25 bit is valid. \return The value retrieved from the input buffer. */ unsigned int bitstream_get(bitstream_state_t *s, const uint8_t **c, int bits); unsigned int bitstream_get2(bitstream_state_t *s, const uint8_t **c, int bits); /*! \brief Flush any residual bit to the output buffer. \param s A pointer to the bitstream context. \param c A pointer to the bitstream output buffer. */ void bitstream_flush(bitstream_state_t *s, uint8_t **c); void bitstream_flush2(bitstream_state_t *s, uint8_t **c); /*! \brief Initialise a bitstream context. \param s A pointer to the bitstream context. \return A pointer to the bitstream context. */ bitstream_state_t *bitstream_init(bitstream_state_t *s); #if defined(__cplusplus) } #endif #endif /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/spandsp/complex.h0000644000175000017500000002416711150047205021155 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * complex.h * * Written by Steve Underwood * * Copyright (C) 2003 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: complex.h,v 1.16 2008/04/17 14:27:00 steveu Exp $ */ /*! \file */ /*! \page complex_page Complex number support \section complex_page_sec_1 What does it do? Complex number support is part of the C99 standard. However, support for this in C compilers is still patchy. A set of complex number feaures is provided as a "temporary" measure, until native C language complex number support is widespread. */ #if !defined(_SPANDSP_COMPLEX_H_) #define _SPANDSP_COMPLEX_H_ /*! Floating complex type. */ typedef struct { /*! \brief Real part. */ float re; /*! \brief Imaginary part. */ float im; } complexf_t; /*! Floating complex type. */ typedef struct { /*! \brief Real part. */ double re; /*! \brief Imaginary part. */ double im; } complex_t; #if defined(HAVE_LONG_DOUBLE) /*! Long double complex type. */ typedef struct { /*! \brief Real part. */ long double re; /*! \brief Imaginary part. */ long double im; } complexl_t; #endif /*! Complex integer type. */ typedef struct { /*! \brief Real part. */ int re; /*! \brief Imaginary part. */ int im; } complexi_t; /*! Complex 16 bit integer type. */ typedef struct { /*! \brief Real part. */ int16_t re; /*! \brief Imaginary part. */ int16_t im; } complexi16_t; /*! Complex 32 bit integer type. */ typedef struct { /*! \brief Real part. */ int32_t re; /*! \brief Imaginary part. */ int32_t im; } complexi32_t; #if defined(__cplusplus) extern "C" { #endif static __inline__ complexf_t complex_setf(float re, float im) { complexf_t z; z.re = re; z.im = im; return z; } /*- End of function --------------------------------------------------------*/ static __inline__ complex_t complex_set(float re, float im) { complex_t z; z.re = re; z.im = im; return z; } /*- End of function --------------------------------------------------------*/ #if defined(HAVE_LONG_DOUBLE) static __inline__ complexl_t complex_setl(long double re, long double im) { complexl_t z; z.re = re; z.im = im; return z; } /*- End of function --------------------------------------------------------*/ #endif static __inline__ complexi_t complex_seti(int re, int im) { complexi_t z; z.re = re; z.im = im; return z; } /*- End of function --------------------------------------------------------*/ static __inline__ complexi16_t complex_seti16(int16_t re, int16_t im) { complexi16_t z; z.re = re; z.im = im; return z; } /*- End of function --------------------------------------------------------*/ static __inline__ complexi32_t complex_seti32(int32_t re, int32_t im) { complexi32_t z; z.re = re; z.im = im; return z; } /*- End of function --------------------------------------------------------*/ static __inline__ complexf_t complex_addf(const complexf_t *x, const complexf_t *y) { complexf_t z; z.re = x->re + y->re; z.im = x->im + y->im; return z; } /*- End of function --------------------------------------------------------*/ static __inline__ complex_t complex_add(const complex_t *x, const complex_t *y) { complex_t z; z.re = x->re + y->re; z.im = x->im + y->im; return z; } /*- End of function --------------------------------------------------------*/ #if defined(HAVE_LONG_DOUBLE) static __inline__ complexl_t complex_addl(const complexl_t *x, const complexl_t *y) { complexl_t z; z.re = x->re + y->re; z.im = x->im + y->im; return z; } /*- End of function --------------------------------------------------------*/ #endif static __inline__ complexi_t complex_addi(const complexi_t *x, const complexi_t *y) { complexi_t z; z.re = x->re + y->re; z.im = x->im + y->im; return z; } /*- End of function --------------------------------------------------------*/ static __inline__ complexi16_t complex_addi16(const complexi16_t *x, const complexi16_t *y) { complexi16_t z; z.re = x->re + y->re; z.im = x->im + y->im; return z; } /*- End of function --------------------------------------------------------*/ static __inline__ complexi32_t complex_addi32(const complexi32_t *x, const complexi32_t *y) { complexi32_t z; z.re = x->re + y->re; z.im = x->im + y->im; return z; } /*- End of function --------------------------------------------------------*/ static __inline__ complexf_t complex_subf(const complexf_t *x, const complexf_t *y) { complexf_t z; z.re = x->re - y->re; z.im = x->im - y->im; return z; } /*- End of function --------------------------------------------------------*/ static __inline__ complex_t complex_sub(const complex_t *x, const complex_t *y) { complex_t z; z.re = x->re - y->re; z.im = x->im - y->im; return z; } /*- End of function --------------------------------------------------------*/ #if defined(HAVE_LONG_DOUBLE) static __inline__ complexl_t complex_subl(const complexl_t *x, const complexl_t *y) { complexl_t z; z.re = x->re - y->re; z.im = x->im - y->im; return z; } /*- End of function --------------------------------------------------------*/ #endif static __inline__ complexi_t complex_subi(const complexi_t *x, const complexi_t *y) { complexi_t z; z.re = x->re - y->re; z.im = x->im - y->im; return z; } /*- End of function --------------------------------------------------------*/ static __inline__ complexi16_t complex_subi16(const complexi16_t *x, const complexi16_t *y) { complexi16_t z; z.re = x->re - y->re; z.im = x->im - y->im; return z; } /*- End of function --------------------------------------------------------*/ static __inline__ complexi32_t complex_subi32(const complexi32_t *x, const complexi32_t *y) { complexi32_t z; z.re = x->re - y->re; z.im = x->im - y->im; return z; } /*- End of function --------------------------------------------------------*/ static __inline__ complexf_t complex_mulf(const complexf_t *x, const complexf_t *y) { complexf_t z; z.re = x->re*y->re - x->im*y->im; z.im = x->re*y->im + x->im*y->re; return z; } /*- End of function --------------------------------------------------------*/ static __inline__ complex_t complex_mul(const complex_t *x, const complex_t *y) { complex_t z; z.re = x->re*y->re - x->im*y->im; z.im = x->re*y->im + x->im*y->re; return z; } /*- End of function --------------------------------------------------------*/ #if defined(HAVE_LONG_DOUBLE) static __inline__ complexl_t complex_mull(const complexl_t *x, const complexl_t *y) { complexl_t z; z.re = x->re*y->re - x->im*y->im; z.im = x->re*y->im + x->im*y->re; return z; } /*- End of function --------------------------------------------------------*/ #endif static __inline__ complexf_t complex_divf(const complexf_t *x, const complexf_t *y) { complexf_t z; float f; f = y->re*y->re + y->im*y->im; z.re = ( x->re*y->re + x->im*y->im)/f; z.im = (-x->re*y->im + x->im*y->re)/f; return z; } /*- End of function --------------------------------------------------------*/ static __inline__ complex_t complex_div(const complex_t *x, const complex_t *y) { complex_t z; double f; f = y->re*y->re + y->im*y->im; z.re = ( x->re*y->re + x->im*y->im)/f; z.im = (-x->re*y->im + x->im*y->re)/f; return z; } /*- End of function --------------------------------------------------------*/ #if defined(HAVE_LONG_DOUBLE) static __inline__ complexl_t complex_divl(const complexl_t *x, const complexl_t *y) { complexl_t z; long double f; f = y->re*y->re + y->im*y->im; z.re = ( x->re*y->re + x->im*y->im)/f; z.im = (-x->re*y->im + x->im*y->re)/f; return z; } /*- End of function --------------------------------------------------------*/ #endif static __inline__ complexf_t complex_conjf(const complexf_t *x) { complexf_t z; z.re = x->re; z.im = -x->im; return z; } /*- End of function --------------------------------------------------------*/ static __inline__ complex_t complex_conj(const complex_t *x) { complex_t z; z.re = x->re; z.im = -x->im; return z; } /*- End of function --------------------------------------------------------*/ #if defined(HAVE_LONG_DOUBLE) static __inline__ complexl_t complex_conjl(const complexl_t *x) { complexl_t z; z.re = x->re; z.im = -x->im; return z; } /*- End of function --------------------------------------------------------*/ #endif static __inline__ complexi_t complexi_conj(const complexi_t *x) { complexi_t z; z.re = x->re; z.im = -x->im; return z; } /*- End of function --------------------------------------------------------*/ static __inline__ float powerf(const complexf_t *x) { return x->re*x->re + x->im*x->im; } /*- End of function --------------------------------------------------------*/ static __inline__ double power(const complex_t *x) { return x->re*x->re + x->im*x->im; } /*- End of function --------------------------------------------------------*/ #if defined(HAVE_LONG_DOUBLE) static __inline__ long double powerl(const complexl_t *x) { return x->re*x->re + x->im*x->im; } /*- End of function --------------------------------------------------------*/ #endif #if defined(__cplusplus) } #endif #endif /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/spandsp/sig_tone.h0000644000175000017500000001466211150047205021314 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * sig_tone.h - Signalling tone processing for the 2280Hz, 2600Hz and similar * signalling tone used in older protocols. * * Written by Steve Underwood * * Copyright (C) 2004 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: sig_tone.h,v 1.12 2008/04/17 14:27:00 steveu Exp $ */ /*! \file */ /*! \page sig_tone_page The signaling tone processor \section sig_tone_sec_1 What does it do? The signaling tone processor handles the 2280Hz, 2400Hz and 2600Hz tones, used in many analogue signaling procotols, and digital ones derived from them. \section sig_tone_sec_2 How does it work? TBD */ #if !defined(_SPANDSP_SIG_TONE_H_) #define _SPANDSP_SIG_TONE_H_ typedef int (*sig_tone_func_t)(void *user_data, int what); /* The optional tone sets */ enum { SIG_TONE_2280HZ = 1, SIG_TONE_2600HZ, SIG_TONE_2400HZ_2600HZ }; #define SIG_TONE_1_PRESENT 0x001 #define SIG_TONE_1_CHANGE 0x002 #define SIG_TONE_2_PRESENT 0x004 #define SIG_TONE_2_CHANGE 0x008 #define SIG_TONE_TX_PASSTHROUGH 0x010 #define SIG_TONE_RX_PASSTHROUGH 0x020 #define SIG_TONE_UPDATE_REQUEST 0x100 /*! Signaling tone descriptor. This defines the working state for a single instance of the transmit and receive sides of a signaling tone processor. */ typedef struct { /*! \brief The tones used. */ int tone_freq[2]; /*! \brief The high and low tone amplitudes. */ int tone_amp[2]; /*! \brief The delay, in audio samples, before the high level tone drops to a low level tone. */ int high_low_timeout; /*! \brief Some signaling tone detectors use a sharp initial filter, changing to a broader band filter after some delay. This parameter defines the delay. 0 means it never changes. */ int sharp_flat_timeout; /*! \brief Parameters to control the behaviour of the notch filter, used to remove the tone from the voice path in some protocols. */ int notch_lag_time; int notch_allowed; /*! \brief The tone on persistence check, in audio samples. */ int tone_on_check_time; /*! \brief The tone off persistence check, in audio samples. */ int tone_off_check_time; /*! \brief The coefficients for the cascaded bi-quads notch filter. */ int32_t notch_a1[3]; int32_t notch_b1[3]; int32_t notch_a2[3]; int32_t notch_b2[3]; int notch_postscale; /*! \brief Flat mode bandpass bi-quad parameters */ int32_t broad_a[3]; int32_t broad_b[3]; int broad_postscale; /*! \brief The coefficients for the post notch leaky integrator. */ int32_t notch_slugi; int32_t notch_slugp; /*! \brief The coefficients for the post modulus leaky integrator in the unfiltered data path. The prescale value incorporates the detection ratio. This is called the guard ratio in some protocols. */ int32_t unfiltered_slugi; int32_t unfiltered_slugp; /*! \brief The coefficients for the post modulus leaky integrator in the bandpass filter data path. */ int32_t broad_slugi; int32_t broad_slugp; /*! \brief Masks which effectively threshold the notched, weighted and bandpassed data. */ int32_t notch_threshold; int32_t unfiltered_threshold; int32_t broad_threshold; } sig_tone_descriptor_t; typedef struct { /*! \brief The callback function used to handle signaling changes. */ sig_tone_func_t sig_update; /*! \brief A user specified opaque pointer passed to the callback function. */ void *user_data; /*! \brief Transmit side parameters */ sig_tone_descriptor_t *desc; int32_t phase_rate[2]; int32_t tone_scaling[2]; uint32_t phase_acc[2]; int high_low_timer; /*! \brief The z's for the notch filter */ int32_t notch_z1[3]; int32_t notch_z2[3]; /*! \brief The z's for the weighting/bandpass filter. */ int32_t broad_z[3]; /*! \brief The z's for the integrators. */ int32_t notch_zl; int32_t broad_zl; /*! \brief The thresholded data. */ int32_t mown_notch; int32_t mown_bandpass; int flat_mode; int tone_present; int notch_enabled; int flat_mode_timeout; int notch_insertion_timeout; int tone_persistence_timeout; int current_tx_tone; int current_tx_timeout; int signaling_state_duration; } sig_tone_state_t; #if defined(__cplusplus) extern "C" { #endif /*! Initialise a signaling tone context. \brief Initialise a signaling tone context. \param s The signaling tone context. \param tone_type The type of signaling tone. \param sig_update Callback function to handle signaling updates. \param user_data An opaque pointer. \return A pointer to the signalling tone context, or NULL if there was a problem. */ sig_tone_state_t *sig_tone_init(sig_tone_state_t *s, int tone_type, sig_tone_func_t sig_update, void *user_data); /*! Process a block of received audio samples. \brief Process a block of received audio samples. \param s The signaling tone context. \param amp The audio sample buffer. \param len The number of samples in the buffer. \return The number of samples unprocessed. */ int sig_tone_rx(sig_tone_state_t *s, int16_t amp[], int len); /*! Generate a block of signaling tone audio samples. \brief Generate a block of signaling tone audio samples. \param s The signaling tone context. \param amp The audio sample buffer. \param len The number of samples to be generated. \return The number of samples actually generated. */ int sig_tone_tx(sig_tone_state_t *s, int16_t amp[], int len); #if defined(__cplusplus) } #endif #endif /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/spandsp/timing.h0000644000175000017500000000442511150047205020770 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * timing.h - Provide access to the Pentium/Athlon TSC timer register * * Written by Steve Underwood * * Copyright (C) 2001 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: timing.h,v 1.13 2008/04/17 14:27:01 steveu Exp $ */ #if !defined(_SPANDSP_TIMING_H_) #define _SPANDSP_TIMING_H_ #if defined(__cplusplus) extern "C" { #endif #if defined(__MSVC__) __declspec(naked) unsigned __int64 __cdecl rdtscll(void) { __asm { rdtsc ret ; return value at EDX:EAX } } /*- End of function --------------------------------------------------------*/ #elif defined(__GNUC__) #if defined(__i386__) static __inline__ uint64_t rdtscll(void) { uint64_t now; __asm__ __volatile__(" rdtsc\n" : "=A" (now)); return now; } /*- End of function --------------------------------------------------------*/ #elif defined(__x86_64__) static __inline__ uint64_t rdtscll(void) { unsigned int a; unsigned int d; /* For x86_64 we need to merge the result in 2 32 bit registers into one clean 64 bit result. */ __asm__ __volatile__(" rdtsc\n" : "=a" (a), "=d" (d)); return ((uint64_t) a) | (((uint64_t) d) << 32); } /*- End of function --------------------------------------------------------*/ #else static __inline__ uint64_t rdtscll(void) { /* This architecture doesn't have a suitable timer */ return 0llu; } /*- End of function --------------------------------------------------------*/ #endif #endif #if defined(__cplusplus) } #endif #endif /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/spandsp/echo.h0000644000175000017500000002155511150047205020422 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * echo.h - An echo cancellor, suitable for electrical and acoustic * cancellation. This code does not currently comply with * any relevant standards (e.g. G.164/5/7/8). * * Written by Steve Underwood * * Copyright (C) 2001 Steve Underwood * * Based on a bit from here, a bit from there, eye of toad, * ear of bat, etc - plus, of course, my own 2 cents. * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: echo.h,v 1.13 2008/04/17 14:27:00 steveu Exp $ */ /*! \file */ #if !defined(_SPANDSP_ECHO_H_) #define _SPANDSP_ECHO_H_ /*! \page echo_can_page Line echo cancellation for voice \section echo_can_page_sec_1 What does it do? This module aims to provide G.168-2002 compliant echo cancellation, to remove electrical echoes (e.g. from 2-4 wire hybrids) from voice calls. \section echo_can_page_sec_2 How does it work? The heart of the echo cancellor is FIR filter. This is adapted to match the echo impulse response of the telephone line. It must be long enough to adequately cover the duration of that impulse response. The signal transmitted to the telephone line is passed through the FIR filter. Once the FIR is properly adapted, the resulting output is an estimate of the echo signal received from the line. This is subtracted from the received signal. The result is an estimate of the signal which originated at the far end of the line, free from echos of our own transmitted signal. The least mean squares (LMS) algorithm is attributed to Widrow and Hoff, and was introduced in 1960. It is the commonest form of filter adaption used in things like modem line equalisers and line echo cancellers. There it works very well. However, it only works well for signals of constant amplitude. It works very poorly for things like speech echo cancellation, where the signal level varies widely. This is quite easy to fix. If the signal level is normalised - similar to applying AGC - LMS can work as well for a signal of varying amplitude as it does for a modem signal. This normalised least mean squares (NLMS) algorithm is the commonest one used for speech echo cancellation. Many other algorithms exist - e.g. RLS (essentially the same as Kalman filtering), FAP, etc. Some perform significantly better than NLMS. However, factors such as computational complexity and patents favour the use of NLMS. A simple refinement to NLMS can improve its performance with speech. NLMS tends to adapt best to the strongest parts of a signal. If the signal is white noise, the NLMS algorithm works very well. However, speech has more low frequency than high frequency content. Pre-whitening (i.e. filtering the signal to flatten its spectrum) the echo signal improves the adapt rate for speech, and ensures the final residual signal is not heavily biased towards high frequencies. A very low complexity filter is adequate for this, so pre-whitening adds little to the compute requirements of the echo canceller. An FIR filter adapted using pre-whitened NLMS performs well, provided certain conditions are met: - The transmitted signal has poor self-correlation. - There is no signal being generated within the environment being cancelled. The difficulty is that neither of these can be guaranteed. If the adaption is performed while transmitting noise (or something fairly noise like, such as voice) the adaption works very well. If the adaption is performed while transmitting something highly correlative (typically narrow band energy such as signalling tones or DTMF), the adaption can go seriously wrong. The reason is there is only one solution for the adaption on a near random signal - the impulse response of the line. For a repetitive signal, there are any number of solutions which converge the adaption, and nothing guides the adaption to choose the generalised one. Allowing an untrained canceller to converge on this kind of narrowband energy probably a good thing, since at least it cancels the tones. Allowing a well converged canceller to continue converging on such energy is just a way to ruin its generalised adaption. A narrowband detector is needed, so adapation can be suspended at appropriate times. The adaption process is based on trying to eliminate the received signal. When there is any signal from within the environment being cancelled it may upset the adaption process. Similarly, if the signal we are transmitting is small, noise may dominate and disturb the adaption process. If we can ensure that the adaption is only performed when we are transmitting a significant signal level, and the environment is not, things will be OK. Clearly, it is easy to tell when we are sending a significant signal. Telling, if the environment is generating a significant signal, and doing it with sufficient speed that the adaption will not have diverged too much more we stop it, is a little harder. The key problem in detecting when the environment is sourcing significant energy is that we must do this very quickly. Given a reasonably long sample of the received signal, there are a number of strategies which may be used to assess whether that signal contains a strong far end component. However, by the time that assessment is complete the far end signal will have already caused major mis-convergence in the adaption process. An assessment algorithm is needed which produces a fairly accurate result from a very short burst of far end energy. \section echo_can_page_sec_3 How do I use it? The echo cancellor processes both the transmit and receive streams sample by sample. The processing function is not declared inline. Unfortunately, cancellation requires many operations per sample, so the call overhead is only a minor burden. */ #include "fir.h" #define NONUPDATE_DWELL_TIME 600 /* 600 samples, or 75ms */ /* Mask bits for the adaption mode */ #define ECHO_CAN_USE_NLP 0x01 #define ECHO_CAN_USE_SUPPRESSOR 0x02 #define ECHO_CAN_USE_CNG 0x04 #define ECHO_CAN_USE_ADAPTION 0x08 /*! G.168 echo canceller descriptor. This defines the working state for a line echo canceller. */ typedef struct { int tx_power[4]; int rx_power[3]; int clean_rx_power; int rx_power_threshold; int nonupdate_dwell; fir16_state_t fir_state; /*! Echo FIR taps (16 bit version) */ int16_t *fir_taps16[4]; /*! Echo FIR taps (32 bit version) */ int32_t *fir_taps32; int curr_pos; int taps; int tap_mask; int adaption_mode; int32_t supp_test1; int32_t supp_test2; int32_t supp1; int32_t supp2; int vad; int cng; /* Parameters for the Hoth noise generator */ int cng_level; int cng_rndnum; int cng_filter; int16_t geigel_max; int geigel_lag; int dtd_onset; int tap_set; int tap_rotate_counter; int32_t latest_correction; /* Indication of the magnitude of the latest adaption, or a code to indicate why adaption was skipped, for test purposes */ int32_t last_acf[28]; int narrowband_count; int narrowband_score; } echo_can_state_t; #if defined(__cplusplus) extern "C" { #endif /*! Create a voice echo canceller context. \param len The length of the canceller, in samples. \return The new canceller context, or NULL if the canceller could not be created. */ echo_can_state_t *echo_can_create(int len, int adaption_mode); /*! Free a voice echo canceller context. \param ec The echo canceller context. */ void echo_can_free(echo_can_state_t *ec); /*! Flush (reinitialise) a voice echo canceller context. \param ec The echo canceller context. */ void echo_can_flush(echo_can_state_t *ec); /*! Set the adaption mode of a voice echo canceller context. \param ec The echo canceller context. \param adaption_mode The mode. */ void echo_can_adaption_mode(echo_can_state_t *ec, int adaption_mode); /*! Process a sample through a voice echo canceller. \param ec The echo canceller context. \param tx The transmitted audio sample. \param rx The received audio sample. \return The clean (echo cancelled) received sample. */ int16_t echo_can_update(echo_can_state_t *ec, int16_t tx, int16_t rx); #if defined(__cplusplus) } #endif #endif /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/spandsp/t38_core.h0000644000175000017500000004053411150047205021130 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * t38_core.h - An implementation of T.38, less the packet exchange part * * Written by Steve Underwood * * Copyright (C) 2005 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: t38_core.h,v 1.28 2008/06/19 13:27:45 steveu Exp $ */ /*! \file */ #if !defined(_SPANDSP_T38_CORE_H_) #define _SPANDSP_T38_CORE_H_ /*! \page t38_core_page T.38 real time FAX over IP message handling There are two ITU recommendations which address sending FAXes over IP networks. T.37 specifies a method of encapsulating FAX images in e-mails, and transporting them to the recipient (an e-mail box, or another FAX machine) in a store-and-forward manner. T.38 defines a protocol for transmitting a FAX across an IP network in real time. The core T.38 modules implements the basic message handling for the T.38, real time, FAX over IP (FoIP) protocol. The T.38 protocol can operate between: - Internet-aware FAX terminals, which connect directly to an IP network. The T.38 terminal module extends this module to provide a complete T.38 terminal. - FAX gateways, which allow traditional PSTN FAX terminals to communicate through the Internet. The T.38 gateway module extends this module to provide a T.38 gateway. - A combination of terminals and gateways. T.38 is the only standardised protocol which exists for real-time FoIP. Reliably transporting a FAX between PSTN FAX terminals, through an IP network, requires use of the T.38 protocol at FAX gateways. VoIP connections are not robust for modem use, including FAX modem use. Most use low bit rate codecs, which cannot convey the modem signals accurately. Even when high bit rate codecs are used, VoIP connections suffer dropouts and timing adjustments, which modems cannot tolerate. In a LAN environment the dropout rate may be very low, but the timing adjustments which occur in VoIP connections still make modem operation unreliable. T.38 FAX gateways deal with the delays, timing jitter, and packet loss experienced in packet networks, and isolate the PSTN FAX terminals from these as far as possible. In addition, by sending FAXes as image data, rather than digitised audio, they reduce the required bandwidth of the IP network. \section t38_core_page_sec_1 What does it do? \section t38_core_page_sec_2 How does it work? Timing differences and jitter between two T.38 entities can be a serious problem, if one of those entities is a PSTN gateway. Flow control for non-ECM image data takes advantage of several features of the T.30 specification. First, an unspecified number of 0xFF octets may be sent at the start of transmission. This means we can add endless extra 0xFF bytes at this point, without breaking the T.30 spec. In practice, we cannot add too many, or we will affect the timing tolerance of the T.30 protocol by delaying the response at the end of each image. Secondly, just before an end of line (EOL) marker we can pad with zero bits. Again, the number is limited only by need to avoid upsetting the timing of the step following the non-ECM data. */ /*! T.38 indicator types */ enum t30_indicator_types_e { T38_IND_NO_SIGNAL = 0, T38_IND_CNG, T38_IND_CED, T38_IND_V21_PREAMBLE, T38_IND_V27TER_2400_TRAINING, T38_IND_V27TER_4800_TRAINING, T38_IND_V29_7200_TRAINING, T38_IND_V29_9600_TRAINING, T38_IND_V17_7200_SHORT_TRAINING, T38_IND_V17_7200_LONG_TRAINING, T38_IND_V17_9600_SHORT_TRAINING, T38_IND_V17_9600_LONG_TRAINING, T38_IND_V17_12000_SHORT_TRAINING, T38_IND_V17_12000_LONG_TRAINING, T38_IND_V17_14400_SHORT_TRAINING, T38_IND_V17_14400_LONG_TRAINING, T38_IND_V8_ANSAM, T38_IND_V8_SIGNAL, T38_IND_V34_CNTL_CHANNEL_1200, T38_IND_V34_PRI_CHANNEL, T38_IND_V34_CC_RETRAIN, T38_IND_V33_12000_TRAINING, T38_IND_V33_14400_TRAINING }; /*! T.38 data types */ enum t38_data_types_e { T38_DATA_NONE = -1, T38_DATA_V21 = 0, T38_DATA_V27TER_2400, T38_DATA_V27TER_4800, T38_DATA_V29_7200, T38_DATA_V29_9600, T38_DATA_V17_7200, T38_DATA_V17_9600, T38_DATA_V17_12000, T38_DATA_V17_14400, T38_DATA_V8, T38_DATA_V34_PRI_RATE, T38_DATA_V34_CC_1200, T38_DATA_V34_PRI_CH, T38_DATA_V33_12000, T38_DATA_V33_14400 }; /*! T.38 data field types */ enum t38_field_types_e { T38_FIELD_HDLC_DATA = 0, T38_FIELD_HDLC_SIG_END, T38_FIELD_HDLC_FCS_OK, T38_FIELD_HDLC_FCS_BAD, T38_FIELD_HDLC_FCS_OK_SIG_END, T38_FIELD_HDLC_FCS_BAD_SIG_END, T38_FIELD_T4_NON_ECM_DATA, T38_FIELD_T4_NON_ECM_SIG_END, T38_FIELD_CM_MESSAGE, T38_FIELD_JM_MESSAGE, T38_FIELD_CI_MESSAGE, T38_FIELD_V34RATE }; /*! T.38 field classes */ enum t38_field_classes_e { T38_FIELD_CLASS_NONE = 0, T38_FIELD_CLASS_HDLC, T38_FIELD_CLASS_NON_ECM, }; /*! T.38 message types */ enum t38_message_types_e { T38_TYPE_OF_MSG_T30_INDICATOR = 0, T38_TYPE_OF_MSG_T30_DATA }; /*! T.38 transport types */ enum t38_transport_types_e { T38_TRANSPORT_UDPTL = 0, T38_TRANSPORT_RTP, T38_TRANSPORT_TCP }; #define T38_RX_BUF_LEN 2048 #define T38_TX_BUF_LEN 16384 /*! T.38 data field */ typedef struct { int field_type; const uint8_t *field; int field_len; } t38_data_field_t; typedef struct t38_core_state_s t38_core_state_t; typedef int (t38_tx_packet_handler_t)(t38_core_state_t *s, void *user_data, const uint8_t *buf, int len, int count); typedef int (t38_rx_indicator_handler_t)(t38_core_state_t *s, void *user_data, int indicator); typedef int (t38_rx_data_handler_t)(t38_core_state_t *s, void *user_data, int data_type, int field_type, const uint8_t *buf, int len); typedef int (t38_rx_missing_handler_t)(t38_core_state_t *s, void *user_data, int rx_seq_no, int expected_seq_no); /*! Core T.38 state, common to all modes of T.38. */ struct t38_core_state_s { /*! Handler routine to transmit IFP packets generated by the T.38 protocol engine */ t38_tx_packet_handler_t *tx_packet_handler; /*! An opaque pointer passed to tx_packet_handler */ void *tx_packet_user_data; /*! Handler routine to process received indicator packets */ t38_rx_indicator_handler_t *rx_indicator_handler; /*! Handler routine to process received data packets */ t38_rx_data_handler_t *rx_data_handler; /*! Handler routine to process the missing packet condition */ t38_rx_missing_handler_t *rx_missing_handler; /*! An opaque pointer passed to any of the above receive handling routines */ void *rx_user_data; /*! NOTE - Bandwidth reduction shall only be done on suitable Phase C data, i.e., MH, MR and - in the case of transcoding to JBIG - MMR. MMR and JBIG require reliable data transport such as that provided by TCP. When transcoding is selected, it shall be applied to every suitable page in a call. */ /*! Method 1: Local generation of TCF (required for use with TCP). Method 2: Transfer of TCF is required for use with UDP (UDPTL or RTP). Method 2 is not recommended for use with TCP. */ int data_rate_management_method; /*! The emitting gateway may indicate a preference for either UDP/UDPTL, or UDP/RTP, or TCP for transport of T.38 IFP Packets. The receiving device selects the transport protocol. */ int data_transport_protocol; /*! Indicates the capability to remove and insert fill bits in Phase C, non-ECM data to reduce bandwidth in the packet network. */ int fill_bit_removal; /*! Indicates the ability to convert to/from MMR from/to the line format to improve the compression of the data, and reduce the bandwidth, in the packet network. */ int mmr_transcoding; /*! Indicates the ability to convert to/from JBIG to reduce bandwidth. */ int jbig_transcoding; /*! For UDP (UDPTL or RTP) modes, this option indicates the maximum number of octets that can be stored on the remote device before an overflow condition occurs. It is the responsibility of the transmitting application to limit the transfer rate to prevent an overflow. The negotiated data rate should be used to determine the rate at which data is being removed from the buffer. */ int max_buffer_size; /*! This option indicates the maximum size of a UDPTL packet or the maximum size of the payload within an RTP packet that can be accepted by the remote device. */ int max_datagram_size; /*! This is the version number of ITU-T Rec. T.38. New versions shall be compatible with previous versions. */ int t38_version; /*! The fastest data rate supported by the T.38 channel. */ int fastest_image_data_rate; /*! \brief The number of times an indicator packet will be sent. Numbers greater than one will increase reliability for UDP transmission. Zero is valid, to suppress all indicator packets for TCP transmission. */ int indicator_tx_count; /*! \brief The number of times a data packet which does not end transmission will be sent. Numbers greater than one will increase reliability for UDP transmission. Zero is not valid. */ int data_tx_count; /*! \brief The number of times a data packet which ends transmission will be sent. Numbers greater than one will increase reliability for UDP transmission. Zero is not valid. */ int data_end_tx_count; /*! TRUE if IFP packet sequence numbers are relevant. For some transports, like TPKT over TCP they are not relevent. */ int check_sequence_numbers; /*! The sequence number for the next packet to be transmitted */ int tx_seq_no; /*! The sequence number expected in the next received packet */ int rx_expected_seq_no; /*! The current receive indicator - i.e. the last indicator received */ int current_rx_indicator; /*! The current receive data type - i.e. the last data type received */ int current_rx_data_type; /*! The current receive field type - i.e. the last field_type received */ int current_rx_field_type; /*! The current transmit indicator - i.e. the last indicator transmitted */ int current_tx_indicator; /*! The bit rate for V.34 operation */ int v34_rate; /*! A count of missing receive packets. This count might not be accurate if the received packet numbers jump wildly. */ int missing_packets; logging_state_t logging; }; #if defined(__cplusplus) extern "C" { #endif /*! \brief Convert the code for an indicator to a short text name. \param indicator The type of indicator. \return A pointer to a short text name for the indicator. */ const char *t38_indicator_to_str(int indicator); /*! \brief Convert the code for a type of data to a short text name. \param data_type The data type. \return A pointer to a short text name for the data type. */ const char *t38_data_type_to_str(int data_type); /*! \brief Convert the code for a type of data field to a short text name. \param field_type The field type. \return A pointer to a short text name for the field type. */ const char *t38_field_type_to_str(int field_type); /*! \brief Convert the code for a CM profile code to text description. \param profile The profile code from a CM message. \return A pointer to a short text description of the profile. */ const char *t38_cm_profile_to_str(int profile); /*! \brief Convert a JM message code to text description. \param data The data field of the message. \param len The length of the data field. \return A pointer to a short text description of the profile. */ const char *t38_jm_to_str(const uint8_t *data, int len); /*! \brief Convert a V34rate message to an actual bit rate. \param data The data field of the message. \param len The length of the data field. \return The bit rate, or -1 for a bad message. */ int t38_v34rate_to_bps(const uint8_t *data, int len); /*! \brief Send an indicator packet \param s The T.38 context. \param indicator The indicator to send. \param count The number of copies of the packet to send. \return ??? */ int t38_core_send_indicator(t38_core_state_t *s, int indicator, int count); /*! \brief Send a data packet \param s The T.38 context. \param data_type The packet's data type. \param field_type The packet's field type. \param field The message data content for the packet. \param field_len The length of the message data, in bytes. \param count The number of copies of the packet to send. \return ??? */ int t38_core_send_data(t38_core_state_t *s, int data_type, int field_type, const uint8_t field[], int field_len, int count); /*! \brief Send a data packet \param s The T.38 context. \param data_type The packet's data type. \param field The list of fields. \param fields The number of fields in the list. \param count The number of copies of the packet to send. \return ??? */ int t38_core_send_data_multi_field(t38_core_state_t *s, int data_type, const t38_data_field_t field[], int fields, int count); /*! \brief Process a received T.38 IFP packet. \param s The T.38 context. \param buf The packet contents. \param len The length of the packet contents. \param seq_no The packet sequence number. \return 0 for OK, else -1. */ int t38_core_rx_ifp_packet(t38_core_state_t *s, const uint8_t *buf, int len, uint16_t seq_no); /*! Set the method to be used for data rate management, as per the T.38 spec. \param s The T.38 context. \param method 1 for pass TCF across the T.38 link, 2 for handle TCF locally. */ void t38_set_data_rate_management_method(t38_core_state_t *s, int method); /*! Set the data transport protocol. \param s The T.38 context. \param data_transport_protocol UDPTL, RTP or TPKT. */ void t38_set_data_transport_protocol(t38_core_state_t *s, int data_transport_protocol); /*! Set the non-ECM fill bit removal mode. \param s The T.38 context. \param fill_bit_removal TRUE to remove fill bits across the T.38 link, else FALSE. */ void t38_set_fill_bit_removal(t38_core_state_t *s, int fill_bit_removal); /*! Set the MMR transcoding mode. \param s The T.38 context. \param mmr_transcoding TRUE to transcode to MMR across the T.38 link, else FALSE. */ void t38_set_mmr_transcoding(t38_core_state_t *s, int mmr_transcoding); /*! Set the JBIG transcoding mode. \param s The T.38 context. \param jbig_transcoding TRUE to transcode to JBIG across the T.38 link, else FALSE. */ void t38_set_jbig_transcoding(t38_core_state_t *s, int jbig_transcoding); void t38_set_max_buffer_size(t38_core_state_t *s, int max_buffer_size); void t38_set_max_datagram_size(t38_core_state_t *s, int max_datagram_size); int t38_get_fastest_image_data_rate(t38_core_state_t *s); /*! Set the T.38 version to be emulated. \param s The T.38 context. \param t38_version Version number, as in the T.38 spec. */ void t38_set_t38_version(t38_core_state_t *s, int t38_version); /* Set the sequence number handling option. \param s The T.38 context. \param check TRUE to check sequence numbers, and handle gaps reasonably. FALSE for no sequence number processing (e.g. for TPKT over TCP transport). */ void t38_set_sequence_number_handling(t38_core_state_t *s, int check); t38_core_state_t *t38_core_init(t38_core_state_t *s, t38_rx_indicator_handler_t *rx_indicator_handler, t38_rx_data_handler_t *rx_data_handler, t38_rx_missing_handler_t *rx_missing_handler, void *rx_user_data, t38_tx_packet_handler_t tx_packet_handler, void *tx_packet_user_data); #if defined(__cplusplus) } #endif #endif /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/spandsp/fax_modems.h0000644000175000017500000000556511150047205021631 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * fax_modems.h - definitions for the analogue modem set for fax processing * * Written by Steve Underwood * * Copyright (C) 2008 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: fax_modems.h,v 1.1 2008/07/25 13:56:54 steveu Exp $ */ /*! \file */ #if !defined(_SPANDSP_FAX_MODEMS_H_) #define _SPANDSP_FAX_MODEMS_H_ /*! The set of modems needed for FAX, plus the auxilliary stuff, like tone generation. */ typedef struct { /*! \brief An HDLC context used when transmitting HDLC messages. */ hdlc_tx_state_t hdlc_tx; /*! \brief An HDLC context used when receiving HDLC messages. */ hdlc_rx_state_t hdlc_rx; /*! \brief A V.21 FSK modem context used when transmitting HDLC over V.21 messages. */ fsk_tx_state_t v21_tx; /*! \brief A V.21 FSK modem context used when receiving HDLC over V.21 messages. */ fsk_rx_state_t v21_rx; /*! \brief A V.17 modem context used when sending FAXes at 7200bps, 9600bps 12000bps or 14400bps */ v17_tx_state_t v17_tx; /*! \brief A V.29 modem context used when receiving FAXes at 7200bps, 9600bps 12000bps or 14400bps */ v17_rx_state_t v17_rx; /*! \brief A V.29 modem context used when sending FAXes at 7200bps or 9600bps */ v29_tx_state_t v29_tx; /*! \brief A V.29 modem context used when receiving FAXes at 7200bps or 9600bps */ v29_rx_state_t v29_rx; /*! \brief A V.27ter modem context used when sending FAXes at 2400bps or 4800bps */ v27ter_tx_state_t v27ter_tx; /*! \brief A V.27ter modem context used when receiving FAXes at 2400bps or 4800bps */ v27ter_rx_state_t v27ter_rx; /*! \brief A tone generator context used to generate supervisory tones during FAX handling. */ tone_gen_state_t tone_gen; /*! \brief Used to insert timed silences. */ silence_gen_state_t silence_gen; /*! \brief */ dc_restore_state_t dc_restore; } fax_modems_t; #if defined(__cplusplus) extern "C" { #endif #if defined(__cplusplus) } #endif #endif /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/spandsp/complex_filters.h0000644000175000017500000000361711150047205022702 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * complex_filters.h * * Written by Steve Underwood * * Copyright (C) 2003 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: complex_filters.h,v 1.12 2008/04/17 14:27:00 steveu Exp $ */ #if !defined(_SPANDSP_COMPLEX_FILTERS_H_) #define _SPANDSP_COMPLEX_FILTERS_H_ typedef struct filter_s filter_t; typedef float (*filter_step_func_t)(filter_t *fi, float x); /*! Filter state */ typedef struct { int nz; int np; filter_step_func_t fsf; } fspec_t; struct filter_s { fspec_t *fs; float sum; int ptr; /* for moving average filters only */ float v[]; }; typedef struct { filter_t *ref; filter_t *imf; } cfilter_t; #if defined(__cplusplus) extern "C" { #endif filter_t *filter_create(fspec_t *fs); void filter_delete(filter_t *fi); float filter_step(filter_t *fi, float x); cfilter_t *cfilter_create(fspec_t *fs); void cfilter_delete(cfilter_t *cfi); complexf_t cfilter_step(cfilter_t *cfi, const complexf_t *z); #if defined(__cplusplus) } #endif #endif /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/spandsp/t30_api.h0000644000175000017500000006024711150047205020744 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * t30_api.h - definitions for T.30 fax processing * * Written by Steve Underwood * * Copyright (C) 2003 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: t30_api.h,v 1.5 2008/06/18 13:28:42 steveu Exp $ */ /*! \file */ #if !defined(_SPANDSP_T30_API_H_) #define _SPANDSP_T30_API_H_ #if defined(__cplusplus) extern "C" { #endif /*! Set the transmitted NSF frame to be associated with a T.30 context. \brief Set the transmitted NSF frame to be associated with a T.30 context. \param s The T.30 context. \param nsf A pointer to the frame. \param len The length of the frame. \return 0 for OK, else -1. */ int t30_set_tx_nsf(t30_state_t *s, const uint8_t *nsf, int len); /*! Get an NSF frame to be associated with a T.30 context. \brief Set an NSF frame to be associated with a T.30 context. \param s The T.30 context. \param nsf A pointer to the frame. \return the length of the NSF message. */ size_t t30_get_tx_nsf(t30_state_t *s, const uint8_t *nsf[]); /*! Get an NSF frame to be associated with a T.30 context. \brief Set an NSF frame to be associated with a T.30 context. \param s The T.30 context. \param nsf A pointer to the frame. \return the length of the NSF message. */ size_t t30_get_rx_nsf(t30_state_t *s, const uint8_t *nsf[]); /*! Set the transmitted NSC frame to be associated with a T.30 context. \brief Set the transmitted NSC frame to be associated with a T.30 context. \param s The T.30 context. \param nsf A pointer to the frame. \param len The length of the frame. \return 0 for OK, else -1. */ int t30_set_tx_nsc(t30_state_t *s, const uint8_t *nsc, int len); /*! Get an NSC frame to be associated with a T.30 context. \brief Set an NSC frame to be associated with a T.30 context. \param s The T.30 context. \param nsc A pointer to the frame. \return the length of the NSC message. */ size_t t30_get_tx_nsc(t30_state_t *s, const uint8_t *nsc[]); /*! Get an NSC frame to be associated with a T.30 context. \brief Set an NSC frame to be associated with a T.30 context. \param s The T.30 context. \param nsc A pointer to the frame. \return the length of the NSC message. */ size_t t30_get_rx_nsc(t30_state_t *s, const uint8_t *nsc[]); /*! Set the transmitted NSS frame to be associated with a T.30 context. \brief Set the transmitted NSS frame to be associated with a T.30 context. \param s The T.30 context. \param nsf A pointer to the frame. \param len The length of the frame. \return 0 for OK, else -1. */ int t30_set_tx_nss(t30_state_t *s, const uint8_t *nss, int len); /*! Get an NSS frame to be associated with a T.30 context. \brief Set an NSS frame to be associated with a T.30 context. \param s The T.30 context. \param nss A pointer to the frame. \return the length of the NSS message. */ size_t t30_get_tx_nss(t30_state_t *s, const uint8_t *nss[]); /*! Get an NSS frame to be associated with a T.30 context. \brief Set an NSS frame to be associated with a T.30 context. \param s The T.30 context. \param nss A pointer to the frame. \return the length of the NSS message. */ size_t t30_get_rx_nss(t30_state_t *s, const uint8_t *nss[]); /*! Set the transmitted identifier associated with a T.30 context. \brief Set the transmitted identifier associated with a T.30 context. \param s The T.30 context. \param id A pointer to the identifier. \return 0 for OK, else -1. */ int t30_set_tx_ident(t30_state_t *s, const char *id); /*! Get the transmitted identifier associated with a T.30 context. \brief Set the transmitted identifier associated with a T.30 context. \param s The T.30 context. \param id A pointer to the identifier. \return 0 for OK, else -1. */ const char *t30_get_tx_ident(t30_state_t *s); /*! Get the transmitted identifier associated with a T.30 context. \brief Set the transmitted identifier associated with a T.30 context. \param s The T.30 context. \param id A pointer to the identifier. \return 0 for OK, else -1. */ const char *t30_get_rx_ident(t30_state_t *s); /*! Set the transmitted sub-address associated with a T.30 context. \brief Set the transmitted sub-address associated with a T.30 context. \param s The T.30 context. \param sub_address A pointer to the sub-address. \return 0 for OK, else -1. */ int t30_set_tx_sub_address(t30_state_t *s, const char *sub_address); /*! Get the received sub-address associated with a T.30 context. \brief Get the received sub-address associated with a T.30 context. \param s The T.30 context. \param sub_address A pointer to the sub-address. \return 0 for OK, else -1. */ const char *t30_get_tx_sub_address(t30_state_t *s); /*! Get the received sub-address associated with a T.30 context. \brief Get the received sub-address associated with a T.30 context. \param s The T.30 context. \param sub_address A pointer to the sub-address. \return 0 for OK, else -1. */ const char *t30_get_rx_sub_address(t30_state_t *s); /*! Set the transmitted selective polling address (i.e. the one we will send to the far end) associated with a T.30 context. \brief Set the transmitted selective polling address associated with a T.30 context. \param s The T.30 context. \param selective_polling_address A pointer to the selective polling address. \return 0 for OK, else -1. */ int t30_set_tx_selective_polling_address(t30_state_t *s, const char *selective_polling_address); /*! Get the received selective polling address (i.e. the one we will send to the far end) associated with a T.30 context. \brief Get the received selective polling address associated with a T.30 context. \param s The T.30 context. \param selective_polling_address A pointer to the selective polling address. \return 0 for OK, else -1. */ const char *t30_get_tx_selective_polling_address(t30_state_t *s); /*! Get the received selective polling address (i.e. the one we will send to the far end) associated with a T.30 context. \brief Get the received selective polling address associated with a T.30 context. \param s The T.30 context. \param selective_polling_address A pointer to the selective polling address. \return 0 for OK, else -1. */ const char *t30_get_rx_selective_polling_address(t30_state_t *s); /*! Set the transmitted polled sub-address (i.e. the one we will send to the far end) associated with a T.30 context. \brief Set the transmitted polled sub-address associated with a T.30 context. \param s The T.30 context. \param polled_sub_address A pointer to the polled sub-address. \return 0 for OK, else -1. */ int t30_set_tx_polled_sub_address(t30_state_t *s, const char *polled_sub_address); /*! Get the received polled sub-address (i.e. the one we will send to the far end) associated with a T.30 context. \brief Get the received polled sub-address associated with a T.30 context. \param s The T.30 context. \param polled_sub_address A pointer to the polled sub-address. \return 0 for OK, else -1. */ const char *t30_get_tx_polled_sub_address(t30_state_t *s); /*! Get the received polled sub-address (i.e. the one we will send to the far end) associated with a T.30 context. \brief Get the received polled sub-address associated with a T.30 context. \param s The T.30 context. \param polled_sub_address A pointer to the polled sub-address. \return 0 for OK, else -1. */ const char *t30_get_rx_polled_sub_address(t30_state_t *s); /*! Set the transmitted sender ident (i.e. the one we will send to the far end) associated with a T.30 context. \brief Set the transmitted sender ident associated with a T.30 context. \param s The T.30 context. \param sender_ident A pointer to the sender ident. \return 0 for OK, else -1. */ int t30_set_tx_sender_ident(t30_state_t *s, const char *sender_ident); /*! Get the received sender ident (i.e. the one we will send to the far end) associated with a T.30 context. \brief Get the received sender ident associated with a T.30 context. \param s The T.30 context. \param sender_ident A pointer to the sender ident. \return 0 for OK, else -1. */ const char *t30_get_tx_sender_ident(t30_state_t *s); /*! Get the received sender ident (i.e. the one we will send to the far end) associated with a T.30 context. \brief Get the received sender ident associated with a T.30 context. \param s The T.30 context. \param sender_ident A pointer to the sender ident. \return 0 for OK, else -1. */ const char *t30_get_rx_sender_ident(t30_state_t *s); /*! Set the transmitted password (i.e. the one we will send to the far end) associated with a T.30 context. \brief Set the transmitted password associated with a T.30 context. \param s The T.30 context. \param password A pointer to the password. \return 0 for OK, else -1. */ int t30_set_tx_password(t30_state_t *s, const char *password); /*! Get the received password (i.e. the one we will send to the far end) associated with a T.30 context. \brief Get the received password associated with a T.30 context. \param s The T.30 context. \param password A pointer to the password. \return 0 for OK, else -1. */ const char *t30_get_tx_password(t30_state_t *s); /*! Get the received password (i.e. the one we will send to the far end) associated with a T.30 context. \brief Get the received password associated with a T.30 context. \param s The T.30 context. \param password A pointer to the password. \return 0 for OK, else -1. */ const char *t30_get_rx_password(t30_state_t *s); /*! Set the transmitted ??? (i.e. the one we will send to the far end) associated with a T.30 context. \brief Set the transmitted ??? associated with a T.30 context. \param s The T.30 context. \param type The type of address. \param type A pointer to the address. \param len The length of the address. \return 0 for OK, else -1. */ int t30_set_tx_tsa(t30_state_t *s, int type, const char *address, int len); /*! Get the received ??? (i.e. the one we will send to the far end) associated with a T.30 context. \brief Get the received ??? associated with a T.30 context. \param s The T.30 context. \param type The type of address. \param type A pointer to the address. \param len The length of the address. \return 0 for OK, else -1. */ size_t t30_get_tx_tsa(t30_state_t *s, int *type, const char *address[]); /*! Get the received ??? (i.e. the one we will send to the far end) associated with a T.30 context. \brief Get the received ??? associated with a T.30 context. \param s The T.30 context. \param type The type of address. \param type A pointer to the address. \param len The length of the address. \return 0 for OK, else -1. */ size_t t30_get_rx_tsa(t30_state_t *s, int *type, const char *address[]); /*! Set the transmitted ??? (i.e. the one we will send to the far end) associated with a T.30 context. \brief Set the transmitted ??? associated with a T.30 context. \param s The T.30 context. \param type The type of address. \param type A pointer to the address. \param len The length of the address. \return 0 for OK, else -1. */ int t30_set_tx_ira(t30_state_t *s, int type, const char *address, int len); /*! Get the received ??? (i.e. the one we will send to the far end) associated with a T.30 context. \brief Get the received ??? associated with a T.30 context. \param s The T.30 context. \param type The type of address. \param type A pointer to the address. \param len The length of the address. \return 0 for OK, else -1. */ size_t t30_get_tx_ira(t30_state_t *s, int *type, const char *address[]); /*! Get the received ??? (i.e. the one we will send to the far end) associated with a T.30 context. \brief Get the received ??? associated with a T.30 context. \param s The T.30 context. \param type The type of address. \param type A pointer to the address. \param len The length of the address. \return 0 for OK, else -1. */ size_t t30_get_rx_ira(t30_state_t *s, int *type, const char *address[]); /*! Set the transmitted ??? (i.e. the one we will send to the far end) associated with a T.30 context. \brief Set the transmitted ??? associated with a T.30 context. \param s The T.30 context. \param type The type of address. \param type A pointer to the address. \param len The length of the address. \return 0 for OK, else -1. */ int t30_set_tx_cia(t30_state_t *s, int type, const char *address, int len); /*! Get the received ??? (i.e. the one we will send to the far end) associated with a T.30 context. \brief Get the received ??? associated with a T.30 context. \param s The T.30 context. \param type The type of address. \param type A pointer to the address. \param len The length of the address. \return 0 for OK, else -1. */ size_t t30_get_tx_cia(t30_state_t *s, int *type, const char *address[]); /*! Get the received ??? (i.e. the one we will send to the far end) associated with a T.30 context. \brief Get the received ??? associated with a T.30 context. \param s The T.30 context. \param type The type of address. \param type A pointer to the address. \param len The length of the address. \return 0 for OK, else -1. */ size_t t30_get_rx_cia(t30_state_t *s, int *type, const char *address[]); /*! Set the transmitted ??? (i.e. the one we will send to the far end) associated with a T.30 context. \brief Set the transmitted ??? associated with a T.30 context. \param s The T.30 context. \param type The type of address. \param type A pointer to the address. \param len The length of the address. \return 0 for OK, else -1. */ int t30_set_tx_isp(t30_state_t *s, int type, const char *address, int len); /*! Get the received ??? (i.e. the one we will send to the far end) associated with a T.30 context. \brief Get the received ??? associated with a T.30 context. \param s The T.30 context. \param type The type of address. \param type A pointer to the address. \return 0 for OK, else -1. */ size_t t30_get_tx_isp(t30_state_t *s, int *type, const char *address[]); /*! Get the received ??? (i.e. the one we will send to the far end) associated with a T.30 context. \brief Get the received ??? associated with a T.30 context. \param s The T.30 context. \param type The type of address. \param type A pointer to the address. \return 0 for OK, else -1. */ size_t t30_get_rx_isp(t30_state_t *s, int *type, const char *address[]); /*! Set the transmitted ??? (i.e. the one we will send to the far end) associated with a T.30 context. \brief Set the transmitted ??? associated with a T.30 context. \param s The T.30 context. \param type The type of address. \param type A pointer to the address. \param len The length of the address. \return 0 for OK, else -1. */ int t30_set_tx_csa(t30_state_t *s, int type, const char *address, int len); /*! Get the received ??? (i.e. the one we will send to the far end) associated with a T.30 context. \brief Get the received ??? associated with a T.30 context. \param s The T.30 context. \param type The type of address. \param type A pointer to the address. \param len The length of the address. \return 0 for OK, else -1. */ size_t t30_get_tx_csa(t30_state_t *s, int *type, const char *address[]); /*! Get the received ??? (i.e. the one we will send to the far end) associated with a T.30 context. \brief Get the received ??? associated with a T.30 context. \param s The T.30 context. \param type The type of address. \param type A pointer to the address. \param len The length of the address. \return 0 for OK, else -1. */ size_t t30_get_rx_csa(t30_state_t *s, int *type, const char *address[]); /*! Set the transmitted header information associated with a T.30 context. \brief Set the transmitted header information associated with a T.30 context. \param s The T.30 context. \param info A pointer to the information string. \return 0 for OK, else -1. */ int t30_set_tx_page_header_info(t30_state_t *s, const char *info); /*! Get the header information associated with a T.30 context. \brief Get the header information associated with a T.30 context. \param s The T.30 context. \param info A pointer to a buffer for the header information. The buffer should be at least 51 bytes long. \return the length of the string. */ size_t t30_get_tx_page_header_info(t30_state_t *s, char *info); /*! Get the country of origin of the remote FAX machine associated with a T.30 context. \brief Get the country of origin of the remote FAX machine associated with a T.30 context. \param s The T.30 context. \return a pointer to the country name, or NULL if the country is not known. */ const char *t30_get_rx_country(t30_state_t *s); /*! Get the name of the vendor of the remote FAX machine associated with a T.30 context. \brief Get the name of the vendor of the remote FAX machine associated with a T.30 context. \param s The T.30 context. \return a pointer to the vendor name, or NULL if the vendor is not known. */ const char *t30_get_rx_vendor(t30_state_t *s); /*! Get the name of the model of the remote FAX machine associated with a T.30 context. \brief Get the name of the model of the remote FAX machine associated with a T.30 context. \param s The T.30 context. \return a pointer to the model name, or NULL if the model is not known. */ const char *t30_get_rx_model(t30_state_t *s); /*! Specify the file name of the next TIFF file to be received by a T.30 context. \brief Set next receive file name. \param s The T.30 context. \param file The file name \param stop_page The maximum page to receive. -1 for no restriction. */ void t30_set_rx_file(t30_state_t *s, const char *file, int stop_page); /*! Specify the file name of the next TIFF file to be transmitted by a T.30 context. \brief Set next transmit file name. \param s The T.30 context. \param file The file name \param start_page The first page to send. -1 for no restriction. \param stop_page The last page to send. -1 for no restriction. */ void t30_set_tx_file(t30_state_t *s, const char *file, int start_page, int stop_page); /*! Set Internet aware FAX (IAF) mode. \brief Set Internet aware FAX (IAF) mode. \param s The T.30 context. \param iaf TRUE for IAF, or FALSE for non-IAF. */ void t30_set_iaf_mode(t30_state_t *s, int iaf); /*! Specify if error correction mode (ECM) is allowed by a T.30 context. \brief Select ECM capability. \param s The T.30 context. \param enabled TRUE for ECM capable, FALSE for not ECM capable. \return 0 if OK, else -1. */ int t30_set_ecm_capability(t30_state_t *s, int enabled); /*! Specify the output encoding for TIFF files created during FAX reception. \brief Specify the output encoding for TIFF files created during FAX reception. \param s The T.30 context. \param encoding The coding required. The options are T4_COMPRESSION_ITU_T4_1D, T4_COMPRESSION_ITU_T4_2D, T4_COMPRESSION_ITU_T6. T6 is usually the densest option, but support for it is broken in a number of software packages. \return 0 if OK, else -1. */ int t30_set_rx_encoding(t30_state_t *s, int encoding); /*! Specify which modem types are supported by a T.30 context. \brief Specify supported modems. \param s The T.30 context. \param supported_modems Bit field list of the supported modems. \return 0 if OK, else -1. */ int t30_set_supported_modems(t30_state_t *s, int supported_modems); /*! Specify which compression types are supported by a T.30 context. \brief Specify supported compression types. \param s The T.30 context. \param supported_compressions Bit field list of the supported compression types. \return 0 if OK, else -1. */ int t30_set_supported_compressions(t30_state_t *s, int supported_compressions); /*! Specify which resolutions are supported by a T.30 context. \brief Specify supported resolutions. \param s The T.30 context. \param supported_resolutions Bit field list of the supported resolutions. \return 0 if OK, else -1. */ int t30_set_supported_resolutions(t30_state_t *s, int supported_resolutions); /*! Specify which images sizes are supported by a T.30 context. \brief Specify supported image sizes. \param s The T.30 context. \param supported_image_sizes Bit field list of the supported widths and lengths. \return 0 if OK, else -1. */ int t30_set_supported_image_sizes(t30_state_t *s, int supported_image_sizes); /*! Specify which special T.30 features are supported by a T.30 context. \brief Specify supported T.30 features. \param s The T.30 context. \param supported_t30_features Bit field list of the supported features. \return 0 if OK, else -1. */ int t30_set_supported_t30_features(t30_state_t *s, int supported_t30_features); /*! Set T.30 status. This may be used to adjust the status from within the phase B and phase D callbacks. \brief Set T.30 status. \param s The T.30 context. \param status The new status. */ void t30_set_status(t30_state_t *s, int status); /*! Specify a period of responding with receiver not ready. \brief Specify a period of responding with receiver not ready. \param s The T.30 context. \param count The number of times to report receiver not ready. \return 0 if OK, else -1. */ int t30_set_receiver_not_ready(t30_state_t *s, int count); /*! Set a callback function for T.30 phase B handling. \brief Set a callback function for T.30 phase B handling. \param s The T.30 context. \param handler The callback function. \param user_data An opaque pointer passed to the callback function. */ void t30_set_phase_b_handler(t30_state_t *s, t30_phase_b_handler_t *handler, void *user_data); /*! Set a callback function for T.30 phase D handling. \brief Set a callback function for T.30 phase D handling. \param s The T.30 context. \param handler The callback function. \param user_data An opaque pointer passed to the callback function. */ void t30_set_phase_d_handler(t30_state_t *s, t30_phase_d_handler_t *handler, void *user_data); /*! Set a callback function for T.30 phase E handling. \brief Set a callback function for T.30 phase E handling. \param s The T.30 context. \param handler The callback function. \param user_data An opaque pointer passed to the callback function. */ void t30_set_phase_e_handler(t30_state_t *s, t30_phase_e_handler_t *handler, void *user_data); /*! Set a callback function for T.30 end of document handling. \brief Set a callback function for T.30 end of document handling. \param s The T.30 context. \param handler The callback function. \param user_data An opaque pointer passed to the callback function. */ void t30_set_document_handler(t30_state_t *s, t30_document_handler_t *handler, void *user_data); /*! Set a callback function for T.30 frame exchange monitoring. This is called from the heart of the signal processing, so don't take too long in the handler routine. \brief Set a callback function for T.30 frame exchange monitoring. \param s The T.30 context. \param handler The callback function. \param user_data An opaque pointer passed to the callback function. */ void t30_set_real_time_frame_handler(t30_state_t *s, t30_real_time_frame_handler_t *handler, void *user_data); #if defined(__cplusplus) } #endif #endif /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/spandsp/v17rx.h0000644000175000017500000006110111150047205020462 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * v17rx.h - ITU V.17 modem receive part * * Written by Steve Underwood * * Copyright (C) 2003 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: v17rx.h,v 1.52 2008/07/16 14:23:48 steveu Exp $ */ /*! \file */ #if !defined(_V17RX_H_) #define _V17RX_H_ /*! \page v17rx_page The V.17 receiver \section v17rx_page_sec_1 What does it do? The V.17 receiver implements the receive side of a V.17 modem. This can operate at data rates of 14400, 12000, 9600 and 7200 bits/second. The audio input is a stream of 16 bit samples, at 8000 samples/second. The transmit and receive side of V.17 modems operate independantly. V.17 is mostly used for FAX transmission over PSTN lines, where it provides the standard 14400 bits/second rate. \section v17rx_page_sec_2 How does it work? V.17 uses QAM modulation, at 2400 baud, and trellis coding. Constellations with 16, 32, 64, and 128 points are defined. After one bit per baud is absorbed by the trellis coding, this gives usable bit rates of 7200, 9600, 12000, and 14400 per second. V.17 specifies a training sequence at the start of transmission, which makes the design of a V.17 receiver relatively straightforward. The first stage of the training sequence consists of 256 symbols, alternating between two constellation positions. The receiver monitors the signal power, to sense the possible presence of a valid carrier. When the alternating signal begins, the power rising above a minimum threshold (-43dBm0) causes the main receiver computation to begin. The initial measured power is used to quickly set the gain of the receiver. After this initial settling, the front end gain is locked, and the adaptive equalizer tracks any subsequent signal level variation. The signal is oversampled to 24000 samples/second (i.e. signal, zero, zero, signal, zero, zero, ...) and fed to a complex root raised cosine pulse shaping filter. This filter has been modified from the conventional root raised cosine filter, by shifting it up the band, to be centred at the nominal carrier frequency. This filter interpolates the samples, pulse shapes, and performs a fractional sample delay at the same time. 192 sets of filter coefficients are used to achieve a set of finely spaces fractional sample delays, between zero and one sample. By choosing every fifth sample, and the appropriate set of filter coefficients, the properly tuned symbol tracker can select data samples at 4800 samples/second from points within 0.28 degrees of the centre and mid-points of each symbol. The output of the filter is multiplied by a complex carrier, generated by a DDS. The result is a baseband signal, requiring no further filtering, apart from an adaptive equalizer. The baseband signal is fed to a T/2 adaptive equalizer. A band edge component maximisation algorithm is used to tune the sampling, so the samples fed to the equalizer are close to the mid point and edges of each symbol. Initially the algorithm is very lightly damped, to ensure the symbol alignment pulls in quickly. Because the sampling rate will not be precisely the same as the transmitter's (the spec. says the symbol timing should be within 0.01%), the receiver constantly evaluates and corrects this sampling throughout its operation. During the symbol timing maintainence phase, the algorithm uses a heavier damping. The carrier is specified as 1800Hz +- 1Hz at the transmitter, and 1800 +-7Hz at the receiver. The receive carrier would only be this inaccurate if the link includes FDM sections. These are being phased out, but the design must still allow for the worst case. Using an initial 1800Hz signal for demodulation gives a worst case rotation rate for the constellation of about one degree per symbol. Once the symbol timing synchronisation algorithm has been given time to lock to the symbol timing of the initial alternating pattern, the phase of the demodulated signal is recorded on two successive symbols - once for each of the constellation positions. The receiver then tracks the symbol alternations, until a large phase jump occurs. This signifies the start of the next phase of the training sequence. At this point the total phase shift between the original recorded symbol phase, and the symbol phase just before the phase jump occurred is used to provide a coarse estimation of the rotation rate of the constellation, and it current absolute angle of rotation. These are used to update the current carrier phase and phase update rate in the carrier DDS. The working data already in the pulse shaping filter and equalizer buffers is given a similar step rotation to pull it all into line. From this point on, a heavily damped integrate and dump approach, based on the angular difference between each received constellation position and its expected position, is sufficient to track the carrier, and maintain phase alignment. A fast rough approximator for the arc-tangent function is adequate for the estimation of the angular error. The next phase of the training sequence is a scrambled sequence of two particular symbols. We train the T/2 adaptive equalizer using this sequence. The scrambling makes the signal sufficiently diverse to ensure the equalizer converges to the proper generalised solution. At the end of this sequence, the equalizer should be sufficiently well adapted that is can correctly resolve the full QAM constellation. However, the equalizer continues to adapt throughout operation of the modem, fine tuning on the more complex data patterns of the full QAM constellation. In the last phase of the training sequence, the modem enters normal data operation, with a short defined period of all ones as data. As in most high speed modems, data in a V.17 modem passes through a scrambler, to whiten the spectrum of the signal. The transmitter should initialise its data scrambler, and pass the ones through it. At the end of the ones, real data begins to pass through the scrambler, and the transmit modem is in normal operation. The receiver tests that ones are really received, in order to verify the modem trained correctly. If all is well, the data following the ones is fed to the application, and the receive modem is up and running. Unfortunately, some transmit side of some real V.17 modems fail to initialise their scrambler before sending the ones. This means the first 23 received bits (the length of the scrambler register) cannot be trusted for the test. The receive modem, therefore, only tests that bits starting at bit 24 are really ones. The V.17 signal is trellis coded. Two bits of each symbol are convolutionally coded to form a 3 bit trellis code - the two original bits, plus an extra redundant bit. It is possible to ignore the trellis coding, and just decode the non-redundant bits. However, the noise performance of the receiver would suffer. Using a proper trellis decoder adds several dB to the noise tolerance to the receiving modem. Trellis coding seems quite complex at first sight, but is fairly straightforward once you get to grips with it. Trellis decoding tracks the data in terms of the possible states of the convolutional coder at the transmitter. There are 8 possible states of the V.17 coder. The first step in trellis decoding is to find the best candidate constellation point for each of these 8 states. One of thse will be our final answer. The constellation has been designed so groups of 8 are spread fairly evenly across it. Locating them is achieved is a reasonably fast manner, by looking up the answers in a set of space map tables. The disadvantage is the tables are potentially large enough to affect cache performance. The trellis decoder works over 16 successive symbols. The result of decoding is not known until 16 symbols after the data enters the decoder. The minimum total accumulated mismatch between each received point and the actual constellation (termed the distance) is assessed for each of the 8 states. A little analysis of the coder shows that each of the 8 current states could be arrived at from 4 different previous states, through 4 different constellation bit patterns. For each new state, the running total distance is arrived at by inspecting a previous total plus a new distance for the appropriate 4 previous states. The minimum of the 4 values becomes the new distance for the state. Clearly, a mechanism is needed to stop this distance from growing indefinitely. A sliding window, and several other schemes are possible. However, a simple single pole IIR is very simple, and provides adequate results. For each new state we store the constellation bit pattern, or path, to that state, and the number of the previous state. We find the minimum distance amongst the 8 new states for each new symbol. We then trace back through the states, until we reach the one 16 states ago which leads to the current minimum distance. The bit pattern stored there is the error corrected bit pattern for that symbol. So, what does Trellis coding actually achieve? TCM is easier to understand by looking at the V.23bis modem spec. The V.32bis spec. is very similar to V.17, except that it is a full duplex modem and has non-TCM options, as well as the TCM ones in V.17. V32bis defines two options for pumping 9600 bits per second down a phone line - one with and one without TCM. Both run at 2400 baud. The non-TCM one uses simple 16 point QAM on the raw data. The other takes two out of every four raw bits, and convolutionally encodes them to 3. Now we have 5 bits per symbol, and we need 32 point QAM to send the data. The raw error rate from simple decoding of the 32 point QAM is horrible compared to decoding the 16 point QAM. If a point decoded from the 32 point QAM is wrong, the likely correct choice should be one of the adjacent ones. It is unlikely to have been one that is far away across the constellation, unless there was a huge noise spike, interference, or something equally nasty. Now, the 32 point symbols do not exist in isolation. There was a kind of temporal smearing in the convolutional coding. It created a well defined dependency between successive symbols. If we knew for sure what the last few symbols were, they would lead us to a limited group of possible values for the current symbol, constrained by the behaviour of the convolutional coder. If you look at how the symbols were mapped to constellation points, you will see the mapping tries to spread those possible symbols as far apart as possible. This will leave only one that is pretty close to the received point, which must be the correct choice. However, this assumes we know the last few symbols for sure. Since we don't, we have a bit more work to do to achieve reliable decoding. Instead of decoding to the nearest point on the constellation, we decode to a group of likely constellation points in the neighbourhood of the received point. We record the mismatch for each - that is the distance across the constellation between the received point and the group of nearby points. To avoid square roots, recording x2 + y2 can be good enough. Symbol by symbol, we record this information. After a few symbols we can stand back and look at the recorded information. For each symbol we have a set of possible symbol values and error metric pairs. The dependency between symbols, created by the convolutional coder, means some paths from symbol to symbol are possible and some are not. It we trace back through the possible symbol to symbol paths, and total up the error metric through those paths, we end up with a set of figures of merit (or more accurately figures of demerit, since larger == worse) for the likelihood of each path being the correct one. The path with the lowest total metric is the most likely, and gives us our final choice for what we think the current symbol really is. That was hard work. It takes considerable computation to do this selection and traceback, symbol by symbol. We need to get quite a lot from this. It needs to drive the error rate down so far that is compensates for the much higher error rate due to the larger constellation, and then buys us some actual benefit. Well in the example we are looking at - V.32bis at 9600bps - it works out the error rate from the TCM option is like using the non-TCM option with several dB more signal to noise ratio. That's nice. The non-TCM option is pretty reasonable on most phone lines, but a better error rate is always a good thing. However, V32bis includes a 14,400bps option. That uses 2400 baud, and 6 bit symbols. Convolutional encoding increases that to 7 bits per symbol, by taking 2 bits and encoding them to 3. This give a 128 point QAM constellation. Again, the difference between using this, and using just an uncoded 64 point constellation is equivalent to maybe 5dB of extra signal to noise ratio. However, in this case it is the difference between the modem working only on the most optimal lines, and being widely usable across most phone lines. TCM absolutely transformed the phone line modem business. */ /* Target length for the equalizer is about 63 taps, to deal with the worst stuff in V.56bis. */ #define V17_EQUALIZER_PRE_LEN 7 /* this much before the real event */ #define V17_EQUALIZER_POST_LEN 7 /* this much after the real event */ #define V17_EQUALIZER_MASK 63 /* one less than a power of 2 >= (V17_EQUALIZER_PRE_LEN + 1 + V17_EQUALIZER_POST_LEN) */ #define V17_RX_FILTER_STEPS 27 /* We can store more trellis depth that we look back over, so that we can push out a group of symbols in one go, giving greater processing efficiency, at the expense of a bit more latency through the modem. */ /* Right now we don't take advantage of this optimisation. */ #define V17_TRELLIS_STORAGE_DEPTH 16 #define V17_TRELLIS_LOOKBACK_DEPTH 16 /*! V.17 modem receive side descriptor. This defines the working state for a single instance of a V.17 modem receiver. */ typedef struct { /*! \brief The bit rate of the modem. Valid values are 7200 9600, 12000 and 14400. */ int bit_rate; /*! \brief The callback function used to put each bit received. */ put_bit_func_t put_bit; /*! \brief A user specified opaque pointer passed to the put_but routine. */ void *put_bit_user_data; /*! \brief The callback function used to report modem status changes. */ modem_rx_status_func_t status_handler; /*! \brief A user specified opaque pointer passed to the status function. */ void *status_user_data; /*! \brief A callback function which may be enabled to report every symbol's constellation position. */ qam_report_handler_t qam_report; /*! \brief A user specified opaque pointer passed to the qam_report callback routine. */ void *qam_user_data; /*! \brief The route raised cosine (RRC) pulse shaping filter buffer. */ #if defined(SPANDSP_USE_FIXED_POINT) int16_t rrc_filter[2*V17_RX_FILTER_STEPS]; #else float rrc_filter[2*V17_RX_FILTER_STEPS]; #endif /*! \brief Current offset into the RRC pulse shaping filter buffer. */ int rrc_filter_step; /*! \brief The state of the differential decoder */ int diff; /*! \brief The register for the data scrambler. */ unsigned int scramble_reg; /*! \brief TRUE if the short training sequence is to be used. */ int short_train; /*! \brief The section of the training data we are currently in. */ int training_stage; /*! \brief A count of how far through the current training step we are. */ int training_count; /*! \brief A measure of how much mismatch there is between the real constellation, and the decoded symbol positions. */ float training_error; /*! \brief The value of the last signal sample, using the a simple HPF for signal power estimation. */ int16_t last_sample; /*! \brief >0 if a signal above the minimum is present. It may or may not be a V.17 signal. */ int signal_present; /*! \brief Whether or not a carrier drop was detected and the signal delivery is pending. */ int carrier_drop_pending; /*! \brief A count of the current consecutive samples below the carrier off threshold. */ int low_samples; /*! \brief A highest magnitude sample seen. */ int16_t high_sample; /*! \brief The current phase of the carrier (i.e. the DDS parameter). */ uint32_t carrier_phase; /*! \brief The update rate for the phase of the carrier (i.e. the DDS increment). */ int32_t carrier_phase_rate; /*! \brief The carrier update rate saved for reuse when using short training. */ int32_t carrier_phase_rate_save; /*! \brief The proportional part of the carrier tracking filter. */ float carrier_track_p; /*! \brief The integral part of the carrier tracking filter. */ float carrier_track_i; /*! \brief A power meter, to measure the HPF'ed signal power in the channel. */ power_meter_t power; /*! \brief The power meter level at which carrier on is declared. */ int32_t carrier_on_power; /*! \brief The power meter level at which carrier off is declared. */ int32_t carrier_off_power; /*! \brief The scaling factor accessed by the AGC algorithm. */ float agc_scaling; /*! \brief The previous value of agc_scaling, needed to reuse old training. */ float agc_scaling_save; /*! \brief The current delta factor for updating the equalizer coefficients. */ float eq_delta; #if defined(SPANDSP_USE_FIXED_POINTx) /*! \brief The adaptive equalizer coefficients. */ complexi_t eq_coeff[V17_EQUALIZER_PRE_LEN + 1 + V17_EQUALIZER_POST_LEN]; /*! \brief A saved set of adaptive equalizer coefficients for use after restarts. */ complexi_t eq_coeff_save[V17_EQUALIZER_PRE_LEN + 1 + V17_EQUALIZER_POST_LEN]; /*! \brief The equalizer signal buffer. */ complexi_t eq_buf[V17_EQUALIZER_MASK + 1]; #else complexf_t eq_coeff[V17_EQUALIZER_PRE_LEN + 1 + V17_EQUALIZER_POST_LEN]; complexf_t eq_coeff_save[V17_EQUALIZER_PRE_LEN + 1 + V17_EQUALIZER_POST_LEN]; complexf_t eq_buf[V17_EQUALIZER_MASK + 1]; #endif /*! \brief Current read offset into the equalizer buffer. */ int eq_step; /*! \brief Current write offset into the equalizer buffer. */ int eq_put_step; /*! \brief The current half of the baud. */ int baud_half; #if defined(SPANDSP_USE_FIXED_POINTx) /*! Low band edge filter for symbol sync. */ int32_t symbol_sync_low[2]; /*! High band edge filter for symbol sync. */ int32_t symbol_sync_high[2]; /*! DC filter for symbol sync. */ int32_t symbol_sync_dc_filter[2]; /*! Baud phase for symbol sync. */ int32_t baud_phase; #else /*! Low band edge filter for symbol sync. */ float symbol_sync_low[2]; /*! High band edge filter for symbol sync. */ float symbol_sync_high[2]; /*! DC filter for symbol sync. */ float symbol_sync_dc_filter[2]; /*! Baud phase for symbol sync. */ float baud_phase; #endif /*! \brief The total symbol timing correction since the carrier came up. This is only for performance analysis purposes. */ int total_baud_timing_correction; /*! \brief Starting phase angles for the coarse carrier aquisition step. */ int32_t start_angles[2]; /*! \brief History list of phase angles for the coarse carrier aquisition step. */ int32_t angles[16]; /*! \brief A pointer to the current constellation. */ #if defined(SPANDSP_USE_FIXED_POINTx) const complexi16_t *constellation; #else const complexf_t *constellation; #endif /*! \brief A pointer to the current space map. There is a space map for each trellis state. */ int space_map; /*! \brief The number of bits in each symbol at the current bit rate. */ int bits_per_symbol; /*! \brief Current pointer to the trellis buffers */ int trellis_ptr; /*! \brief The trellis. */ int full_path_to_past_state_locations[V17_TRELLIS_STORAGE_DEPTH][8]; /*! \brief The trellis. */ int past_state_locations[V17_TRELLIS_STORAGE_DEPTH][8]; /*! \brief Euclidean distances (actually the squares of the distances) from the last states of the trellis. */ #if defined(SPANDSP_USE_FIXED_POINTx) uint32_t distances[8]; #else float distances[8]; #endif /*! \brief Error and flow logging control */ logging_state_t logging; } v17_rx_state_t; #if defined(__cplusplus) extern "C" { #endif /*! Initialise a V.17 modem receive context. \brief Initialise a V.17 modem receive context. \param s The modem context. \param bit_rate The bit rate of the modem. Valid values are 7200, 9600, 12000 and 14400. \param put_bit The callback routine used to put the received data. \param user_data An opaque pointer passed to the put_bit routine. \return A pointer to the modem context, or NULL if there was a problem. */ v17_rx_state_t *v17_rx_init(v17_rx_state_t *s, int bit_rate, put_bit_func_t put_bit, void *user_data); /*! Reinitialise an existing V.17 modem receive context. \brief Reinitialise an existing V.17 modem receive context. \param s The modem context. \param bit_rate The bit rate of the modem. Valid values are 7200, 9600, 12000 and 14400. \param short_train TRUE if a short training sequence is expected. \return 0 for OK, -1 for bad parameter */ int v17_rx_restart(v17_rx_state_t *s, int bit_rate, int short_train); /*! Free a V.17 modem receive context. \brief Free a V.17 modem receive context. \param s The modem context. \return 0 for OK */ int v17_rx_free(v17_rx_state_t *s); /*! Change the put_bit function associated with a V.17 modem receive context. \brief Change the put_bit function associated with a V.17 modem receive context. \param s The modem context. \param put_bit The callback routine used to handle received bits. \param user_data An opaque pointer. */ void v17_rx_set_put_bit(v17_rx_state_t *s, put_bit_func_t put_bit, void *user_data); /*! Change the modem status report function associated with a V.17 modem receive context. \brief Change the modem status report function associated with a V.17 modem receive context. \param s The modem context. \param handler The callback routine used to report modem status changes. \param user_data An opaque pointer. */ void v17_rx_set_modem_status_handler(v17_rx_state_t *s, modem_rx_status_func_t handler, void *user_data); /*! Process a block of received V.17 modem audio samples. \brief Process a block of received V.17 modem audio samples. \param s The modem context. \param amp The audio sample buffer. \param len The number of samples in the buffer. \return The number of samples unprocessed. */ int v17_rx(v17_rx_state_t *s, const int16_t amp[], int len); /*! Get a snapshot of the current equalizer coefficients. \brief Get a snapshot of the current equalizer coefficients. \param s The modem context. \param coeffs The vector of complex coefficients. \return The number of coefficients in the vector. */ #if defined(SPANDSP_USE_FIXED_POINTx) int v17_rx_equalizer_state(v17_rx_state_t *s, complexi_t **coeffs); #else int v17_rx_equalizer_state(v17_rx_state_t *s, complexf_t **coeffs); #endif /*! Get the current received carrier frequency. \param s The modem context. \return The frequency, in Hertz. */ float v17_rx_carrier_frequency(v17_rx_state_t *s); /*! Get the current symbol timing correction since startup. \param s The modem context. \return The correction. */ float v17_rx_symbol_timing_correction(v17_rx_state_t *s); /*! Get a current received signal power. \param s The modem context. \return The signal power, in dBm0. */ float v17_rx_signal_power(v17_rx_state_t *s); /*! Set the power level at which the carrier detection will cut in \param s The modem context. \param cutoff The signal cutoff power, in dBm0. */ void v17_rx_signal_cutoff(v17_rx_state_t *s, float cutoff); /*! Set a handler routine to process QAM status reports \param s The modem context. \param handler The handler routine. \param user_data An opaque pointer passed to the handler routine. */ void v17_rx_set_qam_report_handler(v17_rx_state_t *s, qam_report_handler_t handler, void *user_data); #if defined(__cplusplus) } #endif #endif /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/spandsp/arctan2.h0000644000175000017500000000573011150047205021033 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * arctan2.h - A quick rough approximate arc tan * * Written by Steve Underwood * * Copyright (C) 2003 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: arctan2.h,v 1.13 2008/05/29 13:04:19 steveu Exp $ */ /*! \file */ #if !defined(_SPANDSP_ARCTAN2_H_) #define _SPANDSP_ARCTAN2_H_ /*! \page arctan2_page Fast approximate four quadrant arc-tangent \section arctan2_page_sec_1 What does it do? This module provides a fast approximate 4-quadrant arc tangent function, based on something at dspguru.com. The worst case error is about 4.07 degrees. This is fine for many "where am I" type evaluations in comms. work. \section arctan2_page_sec_2 How does it work? ???. */ #if defined(__cplusplus) extern "C" { #endif /* This returns its answer as a signed 32 bit integer phase value. */ static __inline__ int32_t arctan2(float y, float x) { float abs_y; float angle; if (x == 0.0f || y == 0.0f) return 0; abs_y = fabsf(y); /* If we are in quadrant II or III, flip things around */ if (x < 0.0f) angle = 3.0f - (x + abs_y)/(abs_y - x); else angle = 1.0f - (x - abs_y)/(abs_y + x); angle *= 536870912.0f; /* If we are in quadrant III or IV, negate to return an answer in the range +-pi */ if (y < 0.0f) angle = -angle; return (int32_t) angle; } /*- End of function --------------------------------------------------------*/ #if 0 /* This returns its answer in radians, in the range +-pi. */ static __inline__ float arctan2f(float y, float x) { float angle; float fx; float fy; if (x == 0.0f || y == 0.0f) return 0; fx = fabsf(x); fy = fabsf(y); /* Deal with the octants */ /* N.B. 0.28125 == (1/4 + 1/32) */ if (fy > fx) angle = 3.1415926f/2.0f - fx*fy/(y*y + 0.28125f*x*x); else angle = fy*fx/(x*x + 0.28125f*y*y); /* Deal with the quadrants, to bring the final answer to the range +-pi */ if (x < 0.0f) angle = 3.1415926f - angle; if (y < 0.0f) angle = -angle; return angle; } /*- End of function --------------------------------------------------------*/ #endif #if defined(__cplusplus) } #endif #endif /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/spandsp/ima_adpcm.h0000644000175000017500000000757511150047205021424 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * imaadpcm.c - Conversion routines between linear 16 bit PCM data and * IMA/DVI/Intel ADPCM format. * * Written by Steve Underwood * * Copyright (C) 2004 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * Based on a bit from here, a bit from there, eye of toad, * ear of bat, etc - plus, of course, my own 2 cents. * * $Id: ima_adpcm.h,v 1.20 2008/04/17 14:27:00 steveu Exp $ */ /*! \file */ #if !defined(_SPANDSP_IMA_ADPCM_H_) #define _SPANDSP_IMA_ADPCM_H_ /*! \page ima_adpcm_page IMA/DVI/Intel ADPCM encoding and decoding \section ima_adpcm_page_sec_1 What does it do? IMA ADPCM offers a good balance of simplicity and quality at a rate of 32kbps. \section ima_adpcm_page_sec_2 How does it work? \section ima_adpcm_page_sec_3 How do I use it? */ enum { /*! IMA4 is the original IMA ADPCM variant */ IMA_ADPCM_IMA4 = 0, /*! DVI4 is the IMA ADPCM variant defined in RFC3551 */ IMA_ADPCM_DVI4 = 1, /*! VDVI is the variable bit rate IMA ADPCM variant defined in RFC3551 */ IMA_ADPCM_VDVI = 2 }; /*! IMA (DVI/Intel) ADPCM conversion state descriptor. This defines the state of a single working instance of the IMA ADPCM converter. This is used for either linear to ADPCM or ADPCM to linear conversion. */ typedef struct { int variant; /*! \brief The size of a chunk, in samples. */ int chunk_size; /*! \brief The last state of the ADPCM algorithm. */ int last; /*! \brief Current index into the step size table. */ int step_index; /*! \brief The current IMA code byte in progress. */ uint16_t ima_byte; int bits; } ima_adpcm_state_t; #if defined(__cplusplus) extern "C" { #endif /*! Initialise an IMA ADPCM encode or decode context. \param s The IMA ADPCM context \param variant ??? \param chunk_size The size of a chunk, in samples. A chunk size of zero sample samples means treat each encode or decode operation as a chunk. \return A pointer to the IMA ADPCM context, or NULL for error. */ ima_adpcm_state_t *ima_adpcm_init(ima_adpcm_state_t *s, int variant, int chunk_size); /*! Free an IMA ADPCM encode or decode context. \param s The IMA ADPCM context. \return 0 for OK. */ int ima_adpcm_release(ima_adpcm_state_t *s); /*! Encode a buffer of linear PCM data to IMA ADPCM. \param s The IMA ADPCM context. \param ima_data The IMA ADPCM data produced. \param amp The audio sample buffer. \param len The number of samples in the buffer. \return The number of bytes of IMA ADPCM data produced. */ int ima_adpcm_encode(ima_adpcm_state_t *s, uint8_t ima_data[], const int16_t amp[], int len); /*! Decode a buffer of IMA ADPCM data to linear PCM. \param s The IMA ADPCM context. \param amp The audio sample buffer. \param ima_data \param ima_bytes \return The number of samples returned. */ int ima_adpcm_decode(ima_adpcm_state_t *s, int16_t amp[], const uint8_t ima_data[], int ima_bytes); #if defined(__cplusplus) } #endif #endif /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/spandsp/oki_adpcm.h0000644000175000017500000001016211150047205021422 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * oki_adpcm.h - Conversion routines between linear 16 bit PCM data and * OKI (Dialogic) ADPCM format. * * Written by Steve Underwood * * Copyright (C) 2001 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: oki_adpcm.h,v 1.20 2008/04/17 14:27:00 steveu Exp $ */ /*! \file */ #if !defined(_SPANDSP_OKI_ADPCM_H_) #define _SPANDSP_OKI_ADPCM_H_ /*! \page okiadpcm_page OKI (Dialogic) ADPCM encoding and decoding \section okiadpcm_page_sec_1 What does it do? OKI ADPCM is widely used in the CTI industry because it is the principal format supported by Dialogic. As the market leader, they tend to define "common practice". It offers a good balance of simplicity and quality at rates of 24kbps or 32kbps. 32kbps is obtained by ADPCM compressing 8k samples/second linear PCM. 24kbps is obtained by resampling to 6k samples/second and using the same ADPCM compression algorithm on the slower samples. The algorithms for this ADPCM codec can be found in "PC Telephony - The complete guide to designing, building and programming systems using Dialogic and Related Hardware" by Bob Edgar. pg 272-276. */ /*! Oki (Dialogic) ADPCM conversion state descriptor. This defines the state of a single working instance of the Oki ADPCM converter. This is used for either linear to ADPCM or ADPCM to linear conversion. */ typedef struct { /*! \brief The bit rate - 24000 or 32000. */ int bit_rate; /*! \brief The last state of the ADPCM algorithm. */ int16_t last; /*! \brief Current index into the step size table. */ int16_t step_index; /*! \brief The compressed data byte in progress. */ uint8_t oki_byte; /*! \brief The signal history for the sample rate converter. */ int16_t history[32]; /*! \brief Pointer into the history buffer. */ int ptr; /*! \brief Odd/even sample counter. */ int mark; /*! \brief Phase accumulator for the sample rate converter. */ int phase; } oki_adpcm_state_t; #if defined(__cplusplus) extern "C" { #endif /*! Initialise an Oki ADPCM encode or decode context. \param s The Oki ADPCM context. \param bit_rate The required bit rate for the ADPCM data. The valid rates are 24000 and 32000. \return A pointer to the Oki ADPCM context, or NULL for error. */ oki_adpcm_state_t *oki_adpcm_init(oki_adpcm_state_t *s, int bit_rate); /*! Free an Oki ADPCM encode or decode context. \param s The Oki ADPCM context. \return 0 for OK. */ int oki_adpcm_release(oki_adpcm_state_t *s); /*! Decode a buffer of Oki ADPCM data to linear PCM. \param s The Oki ADPCM context. \param amp The audio sample buffer. \param oki_data \param oki_bytes \return The number of samples returned. */ int oki_adpcm_decode(oki_adpcm_state_t *s, int16_t amp[], const uint8_t oki_data[], int oki_bytes); /*! Encode a buffer of linear PCM data to Oki ADPCM. \param s The Oki ADPCM context. \param oki_data The Oki ADPCM data produced \param amp The audio sample buffer. \param len The number of samples in the buffer. \return The number of bytes of Oki ADPCM data produced. */ int oki_adpcm_encode(oki_adpcm_state_t *s, uint8_t oki_data[], const int16_t amp[], int len); #if defined(__cplusplus) } #endif #endif /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/spandsp/v8.h0000644000175000017500000001565111150047206020042 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * v8.h - V.8 modem negotiation processing. * * Written by Steve Underwood * * Copyright (C) 2004 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: v8.h,v 1.22 2008/05/14 15:41:25 steveu Exp $ */ /*! \file */ /*! \page v8_page The V.8 modem negotiation protocol \section v8_page_sec_1 What does it do? The V.8 specification defines a procedure to be used as PSTN modem answer phone calls, which allows the modems to negotiate the optimum modem standard, which both ends can support. \section v8_page_sec_2 How does it work? At startup the modems communicate using the V.21 standard at 300 bits/second. They exchange simple messages about their capabilities, and choose the modem standard they will use for data communication. The V.8 protocol then terminates, and the modems being negotiating and training with their chosen modem standard. */ #if !defined(_SPANDSP_V8_H_) #define _SPANDSP_V8_H_ typedef struct v8_result_s v8_result_t; typedef void (v8_result_handler_t)(void *user_data, v8_result_t *result); enum v8_call_function_e { V8_CALL_TBS = 0, V8_CALL_H324, V8_CALL_V18, V8_CALL_T101, V8_CALL_T30_TX, V8_CALL_T30_RX, V8_CALL_V_SERIES, V8_CALL_FUNCTION_EXTENSION }; enum v8_modulation_e { V8_MOD_V17 = (1 << 0), /* V.17 half-duplex */ V8_MOD_V21 = (1 << 1), /* V.21 duplex */ V8_MOD_V22 = (1 << 2), /* V.22/V22.bis duplex */ V8_MOD_V23HALF = (1 << 3), /* V.23 half-duplex */ V8_MOD_V23 = (1 << 4), /* V.23 duplex */ V8_MOD_V26BIS = (1 << 5), /* V.23 duplex */ V8_MOD_V26TER = (1 << 6), /* V.23 duplex */ V8_MOD_V27TER = (1 << 7), /* V.23 duplex */ V8_MOD_V29 = (1 << 8), /* V.29 half-duplex */ V8_MOD_V32 = (1 << 9), /* V.32/V32.bis duplex */ V8_MOD_V34HALF = (1 << 10), /* V.34 half-duplex */ V8_MOD_V34 = (1 << 11), /* V.34 duplex */ V8_MOD_V90 = (1 << 12), /* V.90 duplex */ V8_MOD_V92 = (1 << 13), /* V.92 duplex */ V8_MOD_FAILED = (1 << 15), /* Indicates failure to negotiate */ }; enum v8_protocol_e { V8_PROTOCOL_NONE = 0, V8_PROTOCOL_LAPM_V42 = 1, V8_PROTOCOL_EXTENSION = 7 }; enum v8_pstn_access_e { V8_PSTN_ACCESS_CALL_DCE_CELLULAR = 0x20, V8_PSTN_ACCESS_ANSWER_DCE_CELLULAR = 0x40, V8_PSTN_ACCESS_DCE_ON_DIGTIAL = 0x80 }; enum v8_pcm_modem_availability_e { V8_PSTN_PCM_MODEM_V90_V92_ANALOGUE = 0x20, V8_PSTN_PCM_MODEM_V90_V92_DIGITAL = 0x40, V8_PSTN_PCM_MODEM_V91 = 0x80 }; typedef struct { /*! \brief TRUE if we are the calling modem */ int caller; /*! \brief The current state of the V8 protocol */ int state; int negotiation_timer; int ci_timer; int ci_count; fsk_tx_state_t v21tx; fsk_rx_state_t v21rx; queue_state_t *tx_queue; modem_connect_tones_tx_state_t ansam_tx; modem_connect_tones_rx_state_t ansam_rx; v8_result_handler_t *result_handler; void *result_handler_user_data; /*! \brief Modulation schemes available at this end. */ int available_modulations; int common_modulations; int negotiated_modulation; int far_end_modulations; int call_function; int protocol; int pstn_access; int nsf_seen; int pcm_modem_availability; int t66_seen; /* V8 data parsing */ unsigned int bit_stream; int bit_cnt; /* Indicates the type of message coming up */ int preamble_type; uint8_t rx_data[64]; int rx_data_ptr; /*! \brief a reference copy of the last CM or JM message, used when testing for matches. */ uint8_t cm_jm_data[64]; int cm_jm_count; int got_cm_jm; int got_cj; int zero_byte_count; /*! \brief Error and flow logging control */ logging_state_t logging; } v8_state_t; struct v8_result_s { int call_function; int available_modulations; int negotiated_modulation; int protocol; int pstn_access; int nsf_seen; int pcm_modem_availability; int t66_seen; }; #if defined(__cplusplus) extern "C" { #endif /*! Initialise a V.8 context. \brief Initialise a V.8 context. \param s The V.8 context. \param caller TRUE if caller mode, else answerer mode. \param available_modulations A bitwise list of the modulation schemes to be advertised as available here. \param result_handler The callback routine used to handle the results of negotiation. \param user_data An opaque pointer passed to the result_handler routine. \return A pointer to the V.8 context, or NULL if there was a problem. */ v8_state_t *v8_init(v8_state_t *s, int caller, int available_modulations, v8_result_handler_t *result_handler, void *user_data); /*! Release a V.8 context. \brief Release a V.8 context. \param s The V.8 context. \return 0 for OK. */ int v8_release(v8_state_t *s); /*! Generate a block of V.8 audio samples. \brief Generate a block of V.8 audio samples. \param s The V.8 context. \param amp The audio sample buffer. \param max_len The number of samples to be generated. \return The number of samples actually generated. */ int v8_tx(v8_state_t *s, int16_t *amp, int max_len); /*! Process a block of received V.8 audio samples. \brief Process a block of received V.8 audio samples. \param s The V.8 context. \param amp The audio sample buffer. \param len The number of samples in the buffer. */ int v8_rx(v8_state_t *s, const int16_t *amp, int len); /*! Log the list of supported modulations. \brief Log the list of supported modulations. \param s The V.8 context. \param modulation_schemes The list of supported modulations. */ void v8_log_supported_modulations(v8_state_t *s, int modulation_schemes); const char *v8_call_function_to_str(int call_function); const char *v8_modulation_to_str(int modulation_scheme); const char *v8_protocol_to_str(int protocol); const char *v8_pstn_access_to_str(int pstn_access); const char *v8_pcm_modem_availability_to_str(int pcm_modem_availability); #if defined(__cplusplus) } #endif #endif /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/spandsp/t30_fcf.h0000644000175000017500000001432511150047206020726 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * fcf.h - ITU T.30 fax control field definitions * * Written by Steve Underwood * * Copyright (C) 2003 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: t30_fcf.h,v 1.16 2008/04/17 14:27:00 steveu Exp $ */ /*! \file */ #if !defined(_SPANDSP_T30_FCF_H_) #define _SPANDSP_T30_FCF_H_ enum { /*! Initial identification messages */ /*! From the called to the calling terminal. */ T30_DIS = 0x80, /*! [0000 0001] Digital identification signal */ T30_CSI = 0x40, /*! [0000 0010] Called subscriber identification */ T30_NSF = 0x20, /*! [0000 0100] Non-standard facilities */ /*! Commands to send */ /*! From a calling terminal wishing to be a receiver, to a called terminal which is capable of transmitting. */ T30_DTC = 0x81, /*! [1000 0001] Digital transmit command */ T30_CIG = 0x41, /*! [1000 0010] Calling subscriber identification */ T30_NSC = 0x21, /*! [1000 0100] Non-standard facilities command */ T30_PWD = 0xC1, /*! [1000 0011] Password */ T30_SEP = 0xA1, /*! [1000 0101] Selective polling */ T30_PSA = 0x61, /*! [1000 0110] Polled subaddress */ T30_CIA = 0xE1, /*! [1000 0111] Calling subscriber internet address */ T30_ISP = 0x11, /*! [1000 1000] Internet selective polling address */ /*! Commands to receive */ /*! From a calling terminal wishing to be a transmitter, to a called terminal which is capable of receiving. */ T30_DCS = 0x82, /*! [X100 0001] Digital command signal */ T30_TSI = 0x42, /*! [X100 0010] Transmitting subscriber information */ T30_NSS = 0x22, /*! [X100 0100] Non-standard facilities set-up */ T30_SUB = 0xC2, /*! [X100 0011] Sub-address */ T30_SID = 0xA2, /*! [X100 0101] Sender identification */ /*! T30_TCF - Training check is a burst of 1.5s of zeros sent using the image modem */ T30_CTC = 0x12, /*! [X100 1000] Continue to correct */ T30_TSA = 0x62, /*! [X100 0110] Transmitting subscriber internet address */ T30_IRA = 0xE2, /*! [X100 0111] Internet routing address */ /*! Pre-message response signals */ /*! From the receiver to the transmitter. */ T30_CFR = 0x84, /*! [X010 0001] Confirmation to receive */ T30_FTT = 0x44, /*! [X010 0010] Failure to train */ T30_CTR = 0xC4, /*! [X010 0011] Response for continue to correct */ T30_CSA = 0x24, /*! [X010 0100] Called subscriber internet address */ /*! Post-message commands */ T30_EOM = 0x8E, /*! [X111 0001] End of message */ T30_MPS = 0x4E, /*! [X111 0010] Multipage signal */ T30_EOP = 0x2E, /*! [X111 0100] End of procedure */ T30_PRI_EOM = 0x9E, /*! [X111 1001] Procedure interrupt - end of procedure */ T30_PRI_MPS = 0x5E, /*! [X111 1010] Procedure interrupt - multipage signal */ T30_PRI_EOP = 0x3E, /*! [X111 1100] Procedure interrupt - end of procedure */ T30_EOS = 0x1E, /*! [X111 1000] End of selection */ T30_PPS = 0xBE, /*! [X111 1101] Partial page signal */ T30_EOR = 0xCE, /*! [X111 0011] End of retransmission */ T30_RR = 0x6E, /*! [X111 0110] Receiver ready */ /*! Post-message responses */ T30_MCF = 0x8C, /*! [X011 0001] Message confirmation */ T30_RTP = 0xCC, /*! [X011 0011] Retrain positive */ T30_RTN = 0x4C, /*! [X011 0010] Retrain negative */ T30_PIP = 0xAC, /*! [X111 0101] Procedure interrupt positive */ T30_PIN = 0x2C, /*! [X111 0100] Procedure interrupt negative */ T30_PPR = 0xBC, /*! [X011 1101] Partial page request */ T30_RNR = 0xEC, /*! [X011 0111] Receive not ready */ T30_ERR = 0x1C, /*! [X011 1000] Response for end of retransmission */ T30_FDM = 0xFC, /*! [X011 1111] File diagnostics message */ /*! Other line control signals */ T30_DCN = 0xFA, /*! [X101 1111] Disconnect */ T30_CRP = 0x1A, /*! [X101 1000] Command repeat */ T30_FNV = 0xCA, /*! [X101 0011] Field not valid */ T30_TNR = 0xEA, /*! [X101 0111] Transmitter not ready */ T30_TR = 0x6A, /*! [X101 0110] Transmitter ready */ T30_TK = 0x4B, /*! [1101 0010] Transmitter keys */ T30_RK = 0x4A, /*! [0101 0010] Receiver keys */ T30_PSS = 0x1F, /*! [1111 1000] Present signature signal (used only as FCF2) */ T30_DES = 0xA0, /*! [0000 0101] Digital extended signal */ T30_DEC = 0x93, /*! [1100 1001] Digital extended command */ T30_DER = 0x53, /*! [1100 1010] Digital extended request */ T30_DTR = 0x11, /*! [1000 1000] Digital turnaround request (conflicts with ISP) */ T30_DNK = 0x9A, /*! [X101 1001] Digital not acknowledge */ T30_PID = 0x6C, /*! [X011 0110] Procedure interrupt disconnect */ T30_SPI = 0x10, /*! [0000 1000] Security page indicator */ T30_SPT = 0x80, /*! [0000 0001] Security page type */ /*! Something only use as a secondary value in error correcting mode */ T30_NULL = 0x00, /*! [0000 0000] Nothing to say */ /*! Information frame types used for error correction mode, in T.4 */ T4_FCD = 0x06, /*! [0110 0000] Facsimile coded data */ T4_RCP = 0x86 /*! [0110 0001] Return to control for partial page */ }; #endif /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/spandsp/lpc10.h0000644000175000017500000001504511150047206020421 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * lpc10.h - LPC10 low bit rate speech codec. * * Written by Steve Underwood * * Copyright (C) 2006 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: lpc10.h,v 1.17 2008/04/17 14:27:00 steveu Exp $ */ #if !defined(_SPANDSP_LPC10_H_) #define _SPANDSP_LPC10_H_ /*! \page lpc10_page LPC10 encoding and decoding \section lpc10_page_sec_1 What does it do? The LPC10 module implements the US Department of Defense LPC10 codec. This codec produces compressed data at 2400bps. At such a low rate high fidelity cannot be expected. However, the speech clarity is quite good, and this codec is unencumbered by patent or other restrictions. \section lpc10_page_sec_2 How does it work? ???. */ #define LPC10_SAMPLES_PER_FRAME 180 #define LPC10_BITS_IN_COMPRESSED_FRAME 54 /*! LPC10 codec unpacked frame. */ typedef struct { int32_t ipitch; int32_t irms; int32_t irc[10]; } lpc10_frame_t; /*! LPC10 codec encoder state descriptor. This defines the state of a single working instance of the LPC10 encoder. */ typedef struct { int error_correction; /* State used only by function high_pass_100hz */ float z11; float z21; float z12; float z22; /* State used by function lpc10_analyse */ float inbuf[LPC10_SAMPLES_PER_FRAME*3]; float pebuf[LPC10_SAMPLES_PER_FRAME*3]; float lpbuf[696]; float ivbuf[312]; float bias; int32_t osbuf[10]; /* No initial value necessary */ int32_t osptr; /* Initial value 1 */ int32_t obound[3]; int32_t vwin[3][2]; /* Initial value vwin[2][0] = 307; vwin[2][1] = 462; */ int32_t awin[3][2]; /* Initial value awin[2][0] = 307; awin[2][1] = 462; */ int32_t voibuf[4][2]; float rmsbuf[3]; float rcbuf[3][10]; float zpre; /* State used by function onset */ float n; float d__; /* Initial value 1.0f */ float fpc; /* No initial value necessary */ float l2buf[16]; float l2sum1; int32_t l2ptr1; /* Initial value 1 */ int32_t l2ptr2; /* Initial value 9 */ int32_t lasti; /* No initial value necessary */ int hyst; /* Initial value FALSE */ /* State used by function lpc10_voicing */ float dither; /* Initial value 20.0f */ float snr; float maxmin; float voice[3][2]; /* Initial value is probably unnecessary */ int32_t lbve; int32_t lbue; int32_t fbve; int32_t fbue; int32_t ofbue; int32_t sfbue; int32_t olbue; int32_t slbue; /* State used by function dynamic_pitch_tracking */ float s[60]; int32_t p[2][60]; int32_t ipoint; float alphax; /* State used by function lpc10_pack */ int32_t isync; } lpc10_encode_state_t; /*! LPC10 codec decoder state descriptor. This defines the state of a single working instance of the LPC10 decoder. */ typedef struct { int error_correction; /* State used by function decode */ int32_t iptold; /* Initial value 60 */ int first; /* Initial value TRUE */ int32_t ivp2h; int32_t iovoic; int32_t iavgp; /* Initial value 60 */ int32_t erate; int32_t drc[10][3]; int32_t dpit[3]; int32_t drms[3]; /* State used by function synths */ float buf[LPC10_SAMPLES_PER_FRAME*2]; int32_t buflen; /* Initial value LPC10_SAMPLES_PER_FRAME */ /* State used by function pitsyn */ int32_t ivoico; /* No initial value necessary as long as first_pitsyn is initially TRUE_ */ int32_t ipito; /* No initial value necessary as long as first_pitsyn is initially TRUE_ */ float rmso; /* Initial value 1.0f */ float rco[10]; /* No initial value necessary as long as first_pitsyn is initially TRUE_ */ int32_t jsamp; /* Nno initial value necessary as long as first_pitsyn is initially TRUE_ */ int first_pitsyn; /* Initial value TRUE */ /* State used by function bsynz */ int32_t ipo; float exc[166]; float exc2[166]; float lpi[3]; float hpi[3]; float rmso_bsynz; /* State used by function random */ int32_t j; int32_t k; int16_t y[5]; /* State used by function deemp */ float dei[2]; float deo[3]; } lpc10_decode_state_t; #if defined(__cplusplus) extern "C" { #endif /*! Initialise an LPC10e encode context. \param s The LPC10e context \param error_correction ??? \return A pointer to the LPC10e context, or NULL for error. */ lpc10_encode_state_t *lpc10_encode_init(lpc10_encode_state_t *s, int error_correction); int lpc10_encode_release(lpc10_encode_state_t *s); /*! Encode a buffer of linear PCM data to LPC10e. \param s The LPC10e context. \param ima_data The LPC10e data produced. \param amp The audio sample buffer. \param len The number of samples in the buffer. This must be a multiple of 180, as this is the number of samples on a frame. \return The number of bytes of LPC10e data produced. */ int lpc10_encode(lpc10_encode_state_t *s, uint8_t code[], const int16_t amp[], int len); /*! Initialise an LPC10e decode context. \param s The LPC10e context \param error_correction ??? \return A pointer to the LPC10e context, or NULL for error. */ lpc10_decode_state_t *lpc10_decode_init(lpc10_decode_state_t *st, int error_correction); int lpc10_decode_release(lpc10_decode_state_t *s); /*! Decode a buffer of LPC10e data to linear PCM. \param s The LPC10e context. \param amp The audio sample buffer. \param code The LPC10e data. \param len The number of bytes of LPC10e data to be decoded. This must be a multiple of 7, as each frame is packed into 7 bytes. \return The number of samples returned. */ int lpc10_decode(lpc10_decode_state_t *s, int16_t amp[], const uint8_t code[], int len); #if defined(__cplusplus) } #endif #endif /*- End of include ---------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/spandsp/v29rx.h0000644000175000017500000004204211150047206020471 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * v29rx.h - ITU V.29 modem receive part * * Written by Steve Underwood * * Copyright (C) 2003 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: v29rx.h,v 1.55 2008/07/16 14:23:48 steveu Exp $ */ /*! \file */ #if !defined(_V29RX_H_) #define _V29RX_H_ /*! \page v29rx_page The V.29 receiver \section v29rx_page_sec_1 What does it do? The V.29 receiver implements the receive side of a V.29 modem. This can operate at data rates of 9600, 7200 and 4800 bits/s. The audio input is a stream of 16 bit samples, at 8000 samples/second. The transmit and receive side of V.29 modems operate independantly. V.29 is mostly used for FAX transmission, where it provides the standard 9600 and 7200 bits/s rates (the 4800 bits/s mode is not used for FAX). \section v29rx_page_sec_2 How does it work? V.29 operates at 2400 baud for all three bit rates. It uses 16-QAM modulation for 9600bps, 8-QAM for 7200bps, and 4-PSK for 4800bps. A training sequence is specified at the start of transmission, which makes the design of a V.29 receiver relatively straightforward. The first stage of the training sequence consists of 128 symbols, alternating between two constellation positions. The receiver monitors the signal power, to sense the possible presence of a valid carrier. When the alternating signal begins, the power rising above a minimum threshold (-26dBm0) causes the main receiver computation to begin. The initial measured power is used to quickly set the gain of the receiver. After this initial settling, the front end gain is locked, and the adaptive equalizer tracks any subsequent signal level variation. The signal is oversampled to 24000 samples/second (i.e. signal, zero, zero, signal, zero, zero, ...) and fed to a complex root raised cosine pulse shaping filter. This filter has been modified from the conventional root raised cosine filter, by shifting it up the band, to be centred at the nominal carrier frequency. This filter interpolates the samples, pulse shapes, and performs a fractional sample delay at the same time. 48 sets of filter coefficients are used to achieve a set of finely spaces fractional sample delays, between zero and one sample. By choosing every fifth sample, and the appropriate set of filter coefficients, the properly tuned symbol tracker can select data samples at 4800 samples/second from points within 1.125 degrees of the centre and mid-points of each symbol. The output of the filter is multiplied by a complex carrier, generated by a DDS. The result is a baseband signal, requiring no further filtering, apart from an adaptive equalizer. The baseband signal is fed to a T/2 adaptive equalizer. A band edge component maximisation algorithm is used to tune the sampling, so the samples fed to the equalizer are close to the mid point and edges of each symbol. Initially the algorithm is very lightly damped, to ensure the symbol alignment pulls in quickly. Because the sampling rate will not be precisely the same as the transmitter's (the spec. says the symbol timing should be within 0.01%), the receiver constantly evaluates and corrects this sampling throughout its operation. During the symbol timing maintainence phase, the algorithm uses a heavier damping. The carrier is specified as 1700Hz +-1Hz at the transmitter, and 1700 +-7Hz at the receiver. The receive carrier would only be this inaccurate if the link includes FDM sections. These are being phased out, but the design must still allow for the worst case. Using an initial 1700Hz signal for demodulation gives a worst case rotation rate for the constellation of about one degree per symbol. Once the symbol timing synchronisation algorithm has been given time to lock to the symbol timing of the initial alternating pattern, the phase of the demodulated signal is recorded on two successive symbols - once for each of the constellation positions. The receiver then tracks the symbol alternations, until a large phase jump occurs. This signifies the start of the next phase of the training sequence. At this point the total phase shift between the original recorded symbol phase, and the symbol phase just before the phase jump occurred is used to provide a coarse estimation of the rotation rate of the constellation, and it current absolute angle of rotation. These are used to update the current carrier phase and phase update rate in the carrier DDS. The working data already in the pulse shaping filter and equalizer buffers is given a similar step rotation to pull it all into line. From this point on, a heavily damped integrate and dump approach, based on the angular difference between each received constellation position and its expected position, is sufficient to track the carrier, and maintain phase alignment. A fast rough approximator for the arc-tangent function is adequate for the estimation of the angular error. The next phase of the training sequence is a scrambled sequence of two particular symbols. We train the T/2 adaptive equalizer using this sequence. The scrambling makes the signal sufficiently diverse to ensure the equalizer converges to the proper generalised solution. At the end of this sequence, the equalizer should be sufficiently well adapted that is can correctly resolve the full QAM constellation. However, the equalizer continues to adapt throughout operation of the modem, fine tuning on the more complex data patterns of the full QAM constellation. In the last phase of the training sequence, the modem enters normal data operation, with a short defined period of all ones as data. As in most high speed modems, data in a V.29 modem passes through a scrambler, to whiten the spectrum of the signal. The transmitter should initialise its data scrambler, and pass the ones through it. At the end of the ones, real data begins to pass through the scrambler, and the transmit modem is in normal operation. The receiver tests that ones are really received, in order to verify the modem trained correctly. If all is well, the data following the ones is fed to the application, and the receive modem is up and running. Unfortunately, some transmit side of some real V.29 modems fail to initialise their scrambler before sending the ones. This means the first 23 received bits (the length of the scrambler register) cannot be trusted for the test. The receive modem, therefore, only tests that bits starting at bit 24 are really ones. */ /* Target length for the equalizer is about 63 taps, to deal with the worst stuff in V.56bis. */ #define V29_EQUALIZER_PRE_LEN 15 /* this much before the real event */ #define V29_EQUALIZER_POST_LEN 15 /* this much after the real event */ #define V29_EQUALIZER_MASK 63 /* one less than a power of 2 >= (2*V29_EQUALIZER_LEN + 1) */ #define V29_RX_FILTER_STEPS 27 typedef void (*qam_report_handler_t)(void *user_data, const complexf_t *constel, const complexf_t *target, int symbol); /*! V.29 modem receive side descriptor. This defines the working state for a single instance of a V.29 modem receiver. */ typedef struct { /*! \brief The bit rate of the modem. Valid values are 4800, 7200 and 9600. */ int bit_rate; /*! \brief The callback function used to put each bit received. */ put_bit_func_t put_bit; /*! \brief A user specified opaque pointer passed to the put_bit routine. */ void *put_bit_user_data; /*! \brief The callback function used to report modem status changes. */ modem_rx_status_func_t status_handler; /*! \brief A user specified opaque pointer passed to the status function. */ void *status_user_data; /*! \brief A callback function which may be enabled to report every symbol's constellation position. */ qam_report_handler_t qam_report; /*! \brief A user specified opaque pointer passed to the qam_report callback routine. */ void *qam_user_data; /*! \brief The route raised cosine (RRC) pulse shaping filter buffer. */ #if defined(SPANDSP_USE_FIXED_POINT) int16_t rrc_filter[2*V29_RX_FILTER_STEPS]; #else float rrc_filter[2*V29_RX_FILTER_STEPS]; #endif /*! \brief Current offset into the RRC pulse shaping filter buffer. */ int rrc_filter_step; /*! \brief The register for the data scrambler. */ unsigned int scramble_reg; /*! \brief The register for the training scrambler. */ uint8_t training_scramble_reg; /*! \brief The section of the training data we are currently in. */ int training_stage; /*! \brief The current step in the table of CD constellation positions. */ int training_cd; /*! \brief A count of how far through the current training step we are. */ int training_count; /*! \brief A measure of how much mismatch there is between the real constellation, and the decoded symbol positions. */ float training_error; /*! \brief The value of the last signal sample, using the a simple HPF for signal power estimation. */ int16_t last_sample; /*! \brief >0 if a signal above the minimum is present. It may or may not be a V.29 signal. */ int signal_present; /*! \brief Whether or not a carrier drop was detected and the signal delivery is pending. */ int carrier_drop_pending; /*! \brief A count of the current consecutive samples below the carrier off threshold. */ int low_samples; /*! \brief A highest magnitude sample seen. */ int16_t high_sample; /*! \brief TRUE if the previous trained values are to be reused. */ int old_train; /*! \brief The current phase of the carrier (i.e. the DDS parameter). */ uint32_t carrier_phase; /*! \brief The update rate for the phase of the carrier (i.e. the DDS increment). */ int32_t carrier_phase_rate; /*! \brief The carrier update rate saved for reuse when using short training. */ int32_t carrier_phase_rate_save; /*! \brief The proportional part of the carrier tracking filter. */ float carrier_track_p; /*! \brief The integral part of the carrier tracking filter. */ float carrier_track_i; /*! \brief A power meter, to measure the HPF'ed signal power in the channel. */ power_meter_t power; /*! \brief The power meter level at which carrier on is declared. */ int32_t carrier_on_power; /*! \brief The power meter level at which carrier off is declared. */ int32_t carrier_off_power; /*! \brief The scaling factor accessed by the AGC algorithm. */ float agc_scaling; /*! \brief The previous value of agc_scaling, needed to reuse old training. */ float agc_scaling_save; int constellation_state; /*! \brief The current delta factor for updating the equalizer coefficients. */ float eq_delta; #if defined(SPANDSP_USE_FIXED_POINTx) /*! \brief The adaptive equalizer coefficients. */ complexi_t eq_coeff[V29_EQUALIZER_PRE_LEN + 1 + V29_EQUALIZER_POST_LEN]; /*! \brief A saved set of adaptive equalizer coefficients for use after restarts. */ complexi_t eq_coeff_save[V29_EQUALIZER_PRE_LEN + 1 + V29_EQUALIZER_POST_LEN]; /*! \brief The equalizer signal buffer. */ complexi_t eq_buf[V29_EQUALIZER_MASK + 1]; #else complexf_t eq_coeff[V29_EQUALIZER_PRE_LEN + 1 + V29_EQUALIZER_POST_LEN]; complexf_t eq_coeff_save[V29_EQUALIZER_PRE_LEN + 1 + V29_EQUALIZER_POST_LEN]; complexf_t eq_buf[V29_EQUALIZER_MASK + 1]; #endif /*! \brief Current offset into the equalizer buffer. */ int eq_step; /*! \brief Current write offset into the equalizer buffer. */ int eq_put_step; /*! \brief Symbol counter to the next equalizer update. */ int eq_skip; /*! \brief The current half of the baud. */ int baud_half; #if defined(SPANDSP_USE_FIXED_POINTx) /*! Low band edge filter for symbol sync. */ int32_t symbol_sync_low[2]; /*! High band edge filter for symbol sync. */ int32_t symbol_sync_high[2]; /*! DC filter for symbol sync. */ int32_t symbol_sync_dc_filter[2]; /*! Baud phase for symbol sync. */ int32_t baud_phase; #else /*! Low band edge filter for symbol sync. */ float symbol_sync_low[2]; /*! High band edge filter for symbol sync. */ float symbol_sync_high[2]; /*! DC filter for symbol sync. */ float symbol_sync_dc_filter[2]; /*! Baud phase for symbol sync. */ float baud_phase; #endif /*! \brief The total symbol timing correction since the carrier came up. This is only for performance analysis purposes. */ int total_baud_timing_correction; /*! \brief Starting phase angles for the coarse carrier aquisition step. */ int32_t start_angles[2]; /*! \brief History list of phase angles for the coarse carrier aquisition step. */ int32_t angles[16]; /*! \brief Error and flow logging control */ logging_state_t logging; } v29_rx_state_t; #if defined(__cplusplus) extern "C" { #endif /*! Initialise a V.29 modem receive context. \brief Initialise a V.29 modem receive context. \param s The modem context. \param bit_rate The bit rate of the modem. Valid values are 4800, 7200 and 9600. \param put_bit The callback routine used to put the received data. \param user_data An opaque pointer passed to the put_bit routine. \return A pointer to the modem context, or NULL if there was a problem. */ v29_rx_state_t *v29_rx_init(v29_rx_state_t *s, int bit_rate, put_bit_func_t put_bit, void *user_data); /*! Reinitialise an existing V.29 modem receive context. \brief Reinitialise an existing V.29 modem receive context. \param s The modem context. \param bit_rate The bit rate of the modem. Valid values are 4800, 7200 and 9600. \param old_train TRUE if a previous trained values are to be reused. \return 0 for OK, -1 for bad parameter */ int v29_rx_restart(v29_rx_state_t *s, int bit_rate, int old_train); /*! Free a V.29 modem receive context. \brief Free a V.29 modem receive context. \param s The modem context. \return 0 for OK */ int v29_rx_free(v29_rx_state_t *s); /*! Change the put_bit function associated with a V.29 modem receive context. \brief Change the put_bit function associated with a V.29 modem receive context. \param s The modem context. \param put_bit The callback routine used to handle received bits. \param user_data An opaque pointer. */ void v29_rx_set_put_bit(v29_rx_state_t *s, put_bit_func_t put_bit, void *user_data); /*! Change the modem status report function associated with a V.29 modem receive context. \brief Change the modem status report function associated with a V.29 modem receive context. \param s The modem context. \param handler The callback routine used to report modem status changes. \param user_data An opaque pointer. */ void v29_rx_set_modem_status_handler(v29_rx_state_t *s, modem_rx_status_func_t handler, void *user_data); /*! Process a block of received V.29 modem audio samples. \brief Process a block of received V.29 modem audio samples. \param s The modem context. \param amp The audio sample buffer. \param len The number of samples in the buffer. \return The number of samples unprocessed. */ int v29_rx(v29_rx_state_t *s, const int16_t amp[], int len); /*! Get a snapshot of the current equalizer coefficients. \brief Get a snapshot of the current equalizer coefficients. \param s The modem context. \param coeffs The vector of complex coefficients. \return The number of coefficients in the vector. */ int v29_rx_equalizer_state(v29_rx_state_t *s, complexf_t **coeffs); /*! Get the current received carrier frequency. \param s The modem context. \return The frequency, in Hertz. */ float v29_rx_carrier_frequency(v29_rx_state_t *s); /*! Get the current symbol timing correction since startup. \param s The modem context. \return The correction. */ float v29_rx_symbol_timing_correction(v29_rx_state_t *s); /*! Get the current received signal power. \param s The modem context. \return The signal power, in dBm0. */ float v29_rx_signal_power(v29_rx_state_t *s); /*! Set the power level at which the carrier detection will cut in \param s The modem context. \param cutoff The signal cutoff power, in dBm0. */ void v29_rx_signal_cutoff(v29_rx_state_t *s, float cutoff); /*! Set a handler routine to process QAM status reports \param s The modem context. \param handler The handler routine. \param user_data An opaque pointer passed to the handler routine. */ void v29_rx_set_qam_report_handler(v29_rx_state_t *s, qam_report_handler_t handler, void *user_data); #if defined(__cplusplus) } #endif #endif /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/spandsp/noise.h0000644000175000017500000001121011150047206020605 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * noise.h - A low complexity audio noise generator, suitable for * real time generation (current just approx AWGN) * * Written by Steve Underwood * * Copyright (C) 2005 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: noise.h,v 1.13 2008/04/17 14:27:00 steveu Exp $ */ /*! \file */ #if !defined(_SPANDSP_NOISE_H_) #define _SPANDSP_NOISE_H_ /*! \page noise_page Noise generation \section noise_page_sec_1 What does it do? It generates audio noise. Currently it only generates reasonable quality AWGN. It is designed to be of sufficiently low complexity to generate large volumes of reasonable quality noise, in real time. Hoth noise is used to model indoor ambient noise when evaluating communications systems such as telephones. It is named after D.F. Hoth, who made the first systematic study of this. The official definition of Hoth noise is IEEE standard 269-2001 (revised from 269-1992), "Draft Standard Methods for Measuring Transmission Performance of Analog and Digital Telephone Sets, Handsets and Headsets." The table below gives the spectral density of Hoth noise, adjusted in level to produce a reading of 50 dBA. Freq (Hz) Spectral Bandwidth Total power in density 10 log_f each 1/3 octave band (dB SPL/Hz) (dB) (dB SPL) 100 32.4 13.5 45.9 125 30.9 14.7 45.5 160 29.1 15.7 44.9 200 27.6 16.5 44.1 250 26.0 17.6 43.6 315 24.4 18.7 43.1 400 22.7 19.7 42.3 500 21.1 20.6 41.7 630 19.5 21.7 41.2 800 17.8 22.7 40.4 1000 16.2 23.5 39.7 1250 14.6 24.7 39.3 1600 12.9 25.7 38.7 2000 11.3 26.5 37.8 2500 9.6 27.6 37.2 3150 7.8 28.7 36.5 4000 5.4 29.7 34.8 5000 2.6 30.6 33.2 6300 -1.3 31.7 30.4 8000 -6.6 32.7 26.0 The tolerance for each 1/3rd octave band is ¡Ó3dB. \section awgn_page_sec_2 How does it work? The central limit theorem says if you add a few random numbers together, the result starts to look Gaussian. In this case we sum 8 random numbers. The result is fast, and perfectly good as a noise source for many purposes. It should not be trusted as a high quality AWGN generator, for elaborate modelling purposes. */ enum { NOISE_CLASS_AWGN = 1, NOISE_CLASS_HOTH }; /*! Noise generator descriptor. This contains all the state information for an instance of the noise generator. */ typedef struct { int class_of_noise; int quality; int32_t rms; uint32_t rndnum; int32_t state; } noise_state_t; #if defined(__cplusplus) extern "C" { #endif /*! Initialise an audio noise generator. \brief Initialise an audio noise generator. \param s The noise generator context. \param seed A seed for the underlying random number generator. \param level The noise power level in dBmO. \param class_of_noise The class of noise (e.g. AWGN). \param quality A parameter which permits speed and accuracy of the noise generation to be adjusted. \return A pointer to the noise generator context. */ noise_state_t *noise_init_dbm0(noise_state_t *s, int seed, float level, int class_of_noise, int quality); noise_state_t *noise_init_dbov(noise_state_t *s, int seed, float level, int class_of_noise, int quality); /*! Generate a sample of audio noise. \brief Generate a sample of audio noise. \param s The noise generator context. \return The generated sample. */ int16_t noise(noise_state_t *s); #if defined(__cplusplus) } #endif #endif /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/spandsp/playout.h0000644000175000017500000001711011150047206021172 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * playout.h * * Written by Steve Underwood * * Copyright (C) 2005 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: playout.h,v 1.11 2008/04/17 14:27:00 steveu Exp $ */ #if !defined(_SPANDSP_PLAYOUT_H_) #define _SPANDSP_PLAYOUT_H_ /*! \page playout_page Play-out (jitter buffering) \section playout_page_sec_1 What does it do? The play-out module provides a static or dynamic length buffer for received frames of audio or video data. It's goal is to maximise the receiver's tolerance of jitter in the timing of the received frames. Dynamic buffers are generally good for speech, since they adapt to provide the smallest delay consistent with a low rate of packets arriving too late to be used. For things like FoIP and MoIP, a static length of buffer is normally necessary. Any attempt to elastically change the buffer length would wreck a modem's data flow. */ /* Return codes */ enum { PLAYOUT_OK = 0, PLAYOUT_ERROR, PLAYOUT_EMPTY, PLAYOUT_NOFRAME, PLAYOUT_FILLIN, PLAYOUT_DROP }; /* Frame types */ #define PLAYOUT_TYPE_CONTROL 0 #define PLAYOUT_TYPE_SILENCE 1 #define PLAYOUT_TYPE_SPEECH 2 typedef int timestamp_t; typedef struct playout_frame_s { /*! The actual frame data */ void *data; /*! The type of frame */ int type; /*! The timestamp assigned by the sending end */ timestamp_t sender_stamp; /*! The timespan covered by the data in this frame */ timestamp_t sender_len; /*! The timestamp assigned by the receiving end */ timestamp_t receiver_stamp; /*! Pointer to the next earlier frame */ struct playout_frame_s *earlier; /*! Pointer to the next later frame */ struct playout_frame_s *later; } playout_frame_t; /*! Playout (jitter buffer) descriptor. This defines the working state for a single instance of playout buffering. */ typedef struct { /*! TRUE if the buffer is dynamically sized */ int dynamic; /*! The minimum length (dynamic) or fixed length (static) of the buffer */ int min_length; /*! The maximum length (dynamic) or fixed length (static) of the buffer */ int max_length; /*! The target filter threshold for adjusting dynamic buffering. */ int dropable_threshold; int start; /*! The queued frame list */ playout_frame_t *first_frame; playout_frame_t *last_frame; /*! The free frame pool */ playout_frame_t *free_frames; /*! The total frames input to the buffer, to date. */ int frames_in; /*! The total frames output from the buffer, to date. */ int frames_out; /*! The number of frames received out of sequence. */ int frames_oos; /*! The number of frames which were discarded, due to late arrival. */ int frames_late; /*! The number of frames which were never received. */ int frames_missing; /*! The number of frames trimmed from the stream, due to buffer shrinkage. */ int frames_trimmed; timestamp_t latest_expected; /*! The present jitter adjustment */ timestamp_t current; /*! The sender_stamp of the last speech frame */ timestamp_t last_speech_sender_stamp; /*! The duration of the last speech frame */ timestamp_t last_speech_sender_len; int not_first; /*! The time since the target buffer length was last changed. */ timestamp_t since_last_step; /*! Filter state for tracking the packets arriving just in time */ int32_t state_just_in_time; /*! Filter state for tracking the packets arriving late */ int32_t state_late; /*! The current target length of the buffer */ int target_buffer_length; /*! The current actual length of the buffer, which may lag behind the target value */ int actual_buffer_length; } playout_state_t; #if defined(__cplusplus) extern "C" { #endif /*! Queue a frame \param s The play-out context. \param data The frame data. \param sender_len Length of frame (for voice) in timestamp units. \param sender_stamp Sending end's time stamp. \param receiver_stamp Local time at which packet was received, in timestamp units. \return One of PLAYOUT_OK: Frame queued OK. PLAYOUT_ERROR: Some problem occured - e.g. out of memory. */ int playout_put(playout_state_t *s, void *data, int type, timestamp_t sender_len, timestamp_t sender_stamp, timestamp_t receiver_stamp); /*! Get the next frame. \param s The play-out context. \param frame The frame. \param sender_stamp The sender's timestamp. \return One of PLAYOUT_OK: Suitable frame found. PLAYOUT_DROP: A frame which should be dropped was found (e.g. it arrived too late). The caller should request the same time again when this occurs. PLAYOUT_NOFRAME: There's no frame scheduled for this time. PLAYOUT_FILLIN: Synthetic signal must be generated, as no real data is available for this time (either we need to grow, or there was a lost frame). PLAYOUT_EMPTY: The buffer is empty. */ int playout_get(playout_state_t *s, playout_frame_t *frame, timestamp_t sender_stamp); /*! Unconditionally get the first buffered frame. This may be used to clear out the queue, and free all its contents, before the context is freed. \param s The play-out context. \return The frame, or NULL is the queue is empty. */ playout_frame_t *playout_get_unconditional(playout_state_t *s); /*! Find the current length of the buffer. \param s The play-out context. \return The length of the buffer. */ timestamp_t playout_current_length(playout_state_t *s); /*! Find the time at which the next queued frame is due to play. Note: This value may change backwards as freshly received out of order frames are added to the buffer. \param s The play-out context. \return The next timestamp. */ timestamp_t playout_next_due(playout_state_t *s); /*! Create a new instance of play-out buffering. \param min_length Minimum length of the buffer, in samples. \param max_length Maximum length of the buffer, in samples. If this equals min_length, static length buffering is used. \return The new context */ playout_state_t *playout_new(int min_length, int max_length); /*! Destroy an instance of play-out buffering. \param s The play-out context to be destroyed */ void playout_free(playout_state_t *s); /*! Reset an instance of play-out buffering. NOTE: The buffer should be empty before you call this function, otherwise you will leak queued frames, and some internal structures \param s The play-out context. \param min_length Minimum length of the buffer, in samples. \param max_length Maximum length of the buffer, in samples. If this equals min_length, static length buffering is used. */ void playout_restart(playout_state_t *s, int min_length, int max_length); #if defined(__cplusplus) } #endif #endif /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/spandsp/t30_logging.h0000644000175000017500000000411411150047206021611 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * t30_logging.h - definitions for T.30 fax processing * * Written by Steve Underwood * * Copyright (C) 2003 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: t30_logging.h,v 1.2 2008/04/17 14:27:00 steveu Exp $ */ /*! \file */ #if !defined(_SPANDSP_T30_LOGGING_H_) #define _SPANDSP_T30_LOGGING_H_ #if defined(__cplusplus) extern "C" { #endif /*! Return a text name for a T.30 frame type. \brief Return a text name for a T.30 frame type. \param x The frametype octet. \return A pointer to the text name for the frame type. If the frame type is not value, the string "???" is returned. */ const char *t30_frametype(uint8_t x); /*! Decode a DIS, DTC or DCS frame, and log the contents. \brief Decode a DIS, DTC or DCS frame, and log the contents. \param s The T.30 context. \param dis A pointer to the frame to be decoded. \param len The length of the frame. */ void t30_decode_dis_dtc_dcs(t30_state_t *s, const uint8_t *dis, int len); /*! Convert a phase E completion code to a short text description. \brief Convert a phase E completion code to a short text description. \param result The result code. \return A pointer to the description. */ const char *t30_completion_code_to_str(int result); #if defined(__cplusplus) } #endif #endif /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/spandsp/modem_connect_tones.h0000644000175000017500000002043011150047206023516 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * modem_connect_tones.c - Generation and detection of tones * associated with modems calling and answering calls. * * Written by Steve Underwood * * Copyright (C) 2006 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: modem_connect_tones.h,v 1.17 2008/05/14 15:41:25 steveu Exp $ */ /*! \file */ #if !defined(_SPANDSP_MODEM_CONNECT_TONES_H_) #define _SPANDSP_MODEM_CONNECT_TONES_H_ /*! \page modem_connect_tones_page Modem connect tone detection \section modem_connect_tones_page_sec_1 What does it do? Some telephony terminal equipment, such as modems, require a channel which is as clear as possible. They use their own echo cancellation. If the network is also performing echo cancellation the two cancellors can end up squabbling about the nature of the channel, with bad results. A special tone is defined which should cause the network to disable any echo cancellation processes. This is the echo canceller disable tone. The tone detector's design assumes the channel is free of any DC component. \section modem_connect_tones_page_sec_2 How does it work? A sharp notch filter is implemented as a single bi-quad section. The presence of the 2100Hz disable tone is detected by comparing the notched filtered energy with the unfiltered energy. If the notch filtered energy is much lower than the unfiltered energy, then a large proportion of the energy must be at the notch frequency. This type of detector may seem less intuitive than using a narrow bandpass filter to isolate the energy at the notch freqency. However, a sharp bandpass implemented as an IIR filter rings badly. The reciprocal notch filter is very well behaved for our purpose. */ enum { MODEM_CONNECT_TONES_NONE = 0, /*! \brief CNG tone is a pure 1100Hz tone, in 0.5s bursts, with 3s silences in between. The bursts repeat for as long as is required. */ MODEM_CONNECT_TONES_FAX_CNG = 1, /*! \brief CED tone is a pure continuous 2100Hz+-15Hz tone for 3.3s+-0.7s. We might see FAX preamble instead of CED, of the FAX machine does not answer with CED. */ MODEM_CONNECT_TONES_FAX_CED = 2, /*! \brief ANS tone is a pure continuous 2100Hz+-15Hz tone for 3.3s+-0.7s. Nothing else is searched for. */ MODEM_CONNECT_TONES_ANS = 3, /*! \brief ANS with phase reversals tone is a 2100Hz+-15Hz tone for 3.3s+-0.7s, with a 180 degree phase jump every 450ms+-25ms. */ MODEM_CONNECT_TONES_ANS_PR = 4, /*! \brief The ANSam tone is a version of ANS with 20% of 15Hz+-0.1Hz AM modulation, as per V.8 */ MODEM_CONNECT_TONES_ANSAM = 5, /*! \brief The ANSam with phase reversals tone is a version of ANS_PR with 20% of 15Hz+-0.1Hz AM modulation, as per V.8 */ MODEM_CONNECT_TONES_ANSAM_PR = 6, /*! \brief FAX preamble in a string of V.21 HDLC flag octets. This is only valid as a result of tone detection. It should not be specified as a tone type to transmit or receive. */ MODEM_CONNECT_TONES_FAX_PREAMBLE = 7 }; /*! Modem connect tones generator descriptor. This defines the state of a single working instance of the tone generator. */ typedef struct { int tone_type; int32_t tone_phase_rate; uint32_t tone_phase; int level; /*! \brief Countdown to the next phase hop */ int hop_timer; /*! \brief Maximum duration timer */ int duration_timer; uint32_t mod_phase; int32_t mod_phase_rate; int mod_level; } modem_connect_tones_tx_state_t; /*! Modem connect tones receiver descriptor. This defines the state of a single working instance of the tone detector. */ typedef struct { /*! \brief The tone type being detected. */ int tone_type; /*! \brief Callback routine, using to report detection of the tone. */ tone_report_func_t tone_callback; /*! \brief An opaque pointer passed to tone_callback. */ void *callback_data; /*! \brief The notch filter state. */ float z1; float z2; /*! \brief The in notch power estimate */ int notch_level; /*! \brief The total channel power estimate */ int channel_level; /*! \brief Sample counter for the small chunks of samples, after which a test is conducted. */ int chunk_remainder; /*! \brief TRUE is the tone is currently confirmed present in the audio. */ int tone_present; /*! \brief */ int tone_on; /*! \brief A millisecond counter, to time the duration of tone sections. */ int tone_cycle_duration; /*! \brief A count of the number of good cycles of tone reversal seen. */ int good_cycles; /*! \brief TRUE if the tone has been seen since the last time the user tested for it */ int hit; /*! \brief A V.21 FSK modem context used when searching for FAX preamble. */ fsk_rx_state_t v21rx; /*! \brief The raw (stuffed) bit stream buffer. */ unsigned int raw_bit_stream; /*! \brief The current number of bits in the octet in progress. */ int num_bits; /*! \brief Number of consecutive flags seen so far. */ int flags_seen; /*! \brief TRUE if framing OK has been announced. */ int framing_ok_announced; } modem_connect_tones_rx_state_t; #if defined(__cplusplus) extern "C" { #endif /*! \brief Initialise an instance of the modem connect tones generator. \param s The context. */ modem_connect_tones_tx_state_t *modem_connect_tones_tx_init(modem_connect_tones_tx_state_t *s, int tone_type); /*! \brief Free an instance of the modem connect tones generator. \param s The context. \return 0 for OK, else -1. */ int modem_connect_tones_tx_free(modem_connect_tones_tx_state_t *s); /*! \brief Generate a block of modem connect tones samples. \param s The context. \param amp An array of signal samples. \param len The number of samples to generate. \return The number of samples generated. */ int modem_connect_tones_tx(modem_connect_tones_tx_state_t *s, int16_t amp[], int len); /*! \brief Process a block of samples through an instance of the modem connect tones detector. \param s The context. \param amp An array of signal samples. \param len The number of samples in the array. \return The number of unprocessed samples. */ int modem_connect_tones_rx(modem_connect_tones_rx_state_t *s, const int16_t amp[], int len); /*! \brief Test if a modem_connect tone has been detected. \param s The context. \return TRUE if tone is detected, else FALSE. */ int modem_connect_tones_rx_get(modem_connect_tones_rx_state_t *s); /*! \brief Initialise an instance of the modem connect tones detector. \param s The context. \param tone_type The type of connect tone being tested for. \param tone_callback An optional callback routine, used to report tones \param user_data An opaque pointer passed to the callback routine, \return A pointer to the context. */ modem_connect_tones_rx_state_t *modem_connect_tones_rx_init(modem_connect_tones_rx_state_t *s, int tone_type, tone_report_func_t tone_callback, void *user_data); /*! \brief Free an instance of the modem connect tones detector. \param s The context. \return 0 for OK, else -1. */ int modem_connect_tones_rx_free(modem_connect_tones_rx_state_t *s); #if defined(__cplusplus) } #endif #endif /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/spandsp/v42.h0000644000175000017500000001472111150047206020115 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * v42.h * * Written by Steve Underwood * * Copyright (C) 2003 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: v42.h,v 1.25 2008/04/17 14:27:01 steveu Exp $ */ /*! \page v42_page V.42 modem error correction \section v42_page_sec_1 What does it do? The V.42 specification defines an error correcting protocol for PSTN modems, based on HDLC and LAP. This makes it similar to an X.25 link. A special variant of LAP, known as LAP-M, is defined in the V.42 specification. A means for modems to determine if the far modem supports V.42 is also defined. \section v42_page_sec_2 How does it work? */ #if !defined(_SPANDSP_V42_H_) #define _SPANDSP_V42_H_ enum { LAPM_DETECT = 0, LAPM_ESTABLISH = 1, LAPM_DATA = 2, LAPM_RELEASE = 3, LAPM_SIGNAL = 4, LAPM_SETPARM = 5, LAPM_TEST = 6, LAPM_UNSUPPORTED = 7 }; typedef void (*v42_status_func_t)(void *user_data, int status); typedef void (*v42_frame_handler_t)(void *user_data, const uint8_t *pkt, int len); typedef struct lapm_frame_queue_s { struct lapm_frame_queue_s *next; int len; uint8_t frame[]; } lapm_frame_queue_t; /*! LAP-M descriptor. This defines the working state for a single instance of LAP-M. */ typedef struct { int handle; hdlc_rx_state_t hdlc_rx; hdlc_tx_state_t hdlc_tx; v42_frame_handler_t iframe_receive; void *iframe_receive_user_data; v42_status_func_t status_callback; void *status_callback_user_data; int state; int tx_waiting; int debug; /*! TRUE if originator. FALSE if answerer */ int we_are_originator; /*! Remote network type (unknown, answerer. originator) */ int peer_is_originator; /*! Next N(S) for transmission */ int next_tx_frame; /*! The last of our frames which the peer acknowledged */ int last_frame_peer_acknowledged; /*! Next N(R) for reception */ int next_expected_frame; /*! The last of the peer's frames which we acknowledged */ int last_frame_we_acknowledged; /*! TRUE if we sent an I or S frame with the F-bit set */ int solicit_f_bit; /*! Retransmission count */ int retransmissions; /*! TRUE if peer is busy */ int busy; /*! Acknowledgement timer */ int t401_timer; /*! Reply delay timer - optional */ int t402_timer; /*! Inactivity timer - optional */ int t403_timer; /*! Maximum number of octets in an information field */ int n401; /*! Window size */ int window_size_k; lapm_frame_queue_t *txqueue; lapm_frame_queue_t *tx_next; lapm_frame_queue_t *tx_last; queue_state_t *tx_queue; span_sched_state_t sched; /*! \brief Error and flow logging control */ logging_state_t logging; } lapm_state_t; /*! V.42 descriptor. This defines the working state for a single instance of V.42. */ typedef struct { /*! TRUE if we are the calling party, otherwise FALSE */ int caller; /*! TRUE if we should detect whether the far end is V.42 capable. FALSE if we go directly to protocol establishment */ int detect; /*! Stage in negotiating V.42 support */ int rx_negotiation_step; int rxbits; int rxstream; int rxoks; int odp_seen; int txbits; int txstream; int txadps; /*! The LAP.M context */ lapm_state_t lapm; /*! V.42 support detection timer */ int t400_timer; /*! \brief Error and flow logging control */ logging_state_t logging; } v42_state_t; /*! Log the raw HDLC frames */ #define LAPM_DEBUG_LAPM_RAW (1 << 0) /*! Log the interpreted frames */ #define LAPM_DEBUG_LAPM_DUMP (1 << 1) /*! Log state machine changes */ #define LAPM_DEBUG_LAPM_STATE (1 << 2) #if defined(__cplusplus) extern "C" { #endif const char *lapm_status_to_str(int status); /*! Dump LAP.M frames in a raw and/or decoded forms \param frame The frame itself \param len The length of the frame, in octets \param showraw TRUE if the raw octets should be dumped \param txrx TRUE if tx, FALSE if rx. Used to highlight the packet's direction. */ void lapm_dump(lapm_state_t *s, const uint8_t *frame, int len, int showraw, int txrx); /*! Accept an HDLC packet */ void lapm_receive(void *user_data, const uint8_t *buf, int len, int ok); /*! Transmit a LAP.M frame */ int lapm_tx(lapm_state_t *s, const void *buf, int len); /*! Transmit a LAP.M information frame */ int lapm_tx_iframe(lapm_state_t *s, const void *buf, int len, int cr); /*! Send a break over a LAP.M connection */ int lapm_break(lapm_state_t *s, int enable); /*! Initiate an orderly release of a LAP.M connection */ int lapm_release(lapm_state_t *s); /*! Enable or disable loopback of a LAP.M connection */ int lapm_loopback(lapm_state_t *s, int enable); /*! Assign or remove a callback routine used to deal with V.42 status changes. */ void v42_set_status_callback(v42_state_t *s, v42_status_func_t callback, void *user_data); /*! Process a newly received bit for a V.42 context. */ void v42_rx_bit(void *user_data, int bit); /*! Get the next transmit bit for a V.42 context. */ int v42_tx_bit(void *user_data); /*! Initialise a V.42 context. \param s The V.42 context. \param caller TRUE if caller mode, else answerer mode. \param frame_handler A callback function to handle received frames of data. \param user_data An opaque pointer passed to the frame handler routine. \return ??? */ v42_state_t *v42_init(v42_state_t *s, int caller, int detect, v42_frame_handler_t frame_handler, void *user_data); /*! Restart a V.42 context. \param s The V.42 context. */ void v42_restart(v42_state_t *s); /*! Release a V.42 context. \param s The V.42 context. \return 0 if OK */ int v42_release(v42_state_t *s); #if defined(__cplusplus) } #endif #endif /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/spandsp/adsi.h0000644000175000017500000004544511150047206020431 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * adsi.h - Analogue display services interface and other call ID related handling. * * Written by Steve Underwood * * Copyright (C) 2003 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: adsi.h,v 1.31 2008/05/05 11:25:01 steveu Exp $ */ /*! \file */ #if !defined(_SPANDSP_ADSI_H_) #define _SPANDSP_ADSI_H_ /*! \page adsi_page ADSI transmission and reception \section adsi_page_sec_1 What does it do? Although ADSI has a specific meaning in some places, the term is used here to indicate any form of Analogue Display Service Interface, which includes caller ID, SMS, and others. The ADSI module provides for the transmission and reception of ADSI messages in various formats. Currently, the supported formats are: - Bellcore/Telcordia GR-30 CORE CLASS (Custom Local Area Signaling Services) standard (North America, Australia, China, Taiwan, and Hong Kong). - ETSI ETS 300 648, ETS 300 659-1 CLIP (Calling Line Identity Presentation) FSK standard (France, Germany, Norway, Italy, Spain, South Africa, Turkey, and the UK). - ETSI Caller-ID support for the UK, British Telecom SIN227 and SIN242. - ETSI ETS 300 648, ETS 300 659-1 CLIP (Calling Line Identity Presentation) DTMF standard variant 1 (Belgium, Brazil, Denmark, Finland, Iceland, India, Netherlands, Saudi Arabia, Sweden and Uruguay). - ETSI ETS 300 648, ETS 300 659-1 CLIP (Calling Line Identity Presentation) DTMF standard variant 2 (Denmark and Holland). - ETSI ETS 300 648, ETS 300 659-1 CLIP (Calling Line Identity Presentation) DTMF standard variant 3. - ETSI ETS 300 648, ETS 300 659-1 CLIP (Calling Line Identity Presentation) DTMF standard variant 4. (Taiwan and Kuwait). - ETSI Caller-ID support in UK (British Telecom), British Telecomm SIN227, SIN242. - Nippon Telegraph & Telephone Corporation JCLIP (Japanese Calling Line Identity Presentation) standard. - Telecommunications Authority of Singapore ACLIP (Analog Calling Line Identity Presentation) standard. - TDD (Telecommunications Device for the Deaf). \section adsi_page_sec_2 How does it work? \section adsi_page_sec_2a The Bellcore CLASS specification Most FSK based CLI formats are similar to the US CLASS one, which is as follows: The alert tone for CLI during a call is at least 100ms of silence, then 2130Hz + 2750Hz for 88ms to 110ms. When CLI is presented at ringing time, this tone is not sent. In the US, CLI is usually sent between the first two rings. This silence period is long in the US, so the message fits easily. In other places, where the standard ring tone has much smaller silences, a line voltage reversal is used to wake up a power saving receiver, then the message is sent, then the phone begins to ring. The message is sent using a Bell 202 FSK modem. The data rate is 1200 bits per second. The message protocol uses 8-bit data words (bytes), each bounded by a start bit and a stop bit. Channel Carrier Message Message Data Checksum Seizure Signal Type Length Word(s) Word Signal Word Word \section adsi_page_sec_2a1 CHANNEL SEIZURE SIGNAL The channel seizure is 30 continuous bytes of 55h (01010101), including the start and stop bits (i.e. 300 bits of alternations in total). This provides a detectable alternating function to the CPE (i.e. the modem data pump). \section adsi_page_sec_2a2 CARRIER SIGNAL The carrier signal consists of 180 bits of 1s. This may be reduced to 80 bits of 1s for caller ID on call waiting. \section adsi_page_sec_2a3 MESSAGE TYPE WORD Various message types are defined. The commonest ones for the US CLASS standard are: - Type 0x04 (SDMF) - single data message. Simple caller ID (CND) - Type 0x80 (MDMF) - multiple data message. A more flexible caller ID, with extra information. Other messages support message waiting, for voice mail, and other display features. \section adsi_page_sec_2a4 MESSAGE LENGTH WORD The message length word specifies the total number of data words to follow. \section adsi_page_sec_2a5 DATA WORDS The data words contain the actual message. \section adsi_page_sec_2a6 CHECKSUM WORD The Checksum Word contains the twos complement of the modulo 256 sum of the other words in the data message (i.e., message type, message length, and data words). The receiving equipment may calculate the modulo 256 sum of the received words and add this sum to the received checksum word. A result of zero generally indicates that the message was correctly received. Message retransmission is not supported. The sumcheck word should be followed by a minimum of two stop bits. \section adsi_page_sec_2b The ETSI CLIP specification The ETSI CLIP specification uses similar messages to the Bellcore specification. They are not, however, identical. First, ETSI use the V.23 modem standard, rather than Bell 202. Second, different fields, and different message types are available. The wake up indication generally differs from the Bellcore specification, to accomodate differences in European ring cadences. \section adsi_page_sec_2c The ETSI caller ID by DTMF specification CLI by DTMF is usually sent in a very simple way. The exchange does not give any prior warning (no reversal, or ring) to wake up the receiver. It just sends a string of DTMF digits. Around the world several variants of this basic scheme are used. One variant of the digit string is used in Belgium, Brazil, Denmark, Finland, Iceland, India, Netherlands, Saudi Arabia, Sweden and Uruguay: - ADBC Each of these fields may be omitted. The following special information codes are defined - "00" indicates the calling party number is not available. - "10" indicates that the presentation of the calling party number is restricted. A second variant of the digit string is one of the following: - A# - D1# Number not available because the caller has restricted it. - D2# Number not available because the call is international. - D3# Number not available due to technical reasons. A third variant of the digit string is used in Taiwan and Kuwait: - DC A forth variant of the digit string is used in Denmark and Holland: - # There is no distinctive start marker in this format. \section adsi_page_sec_2d The Japanese specification from NTT The Japanese caller ID specification is considerably different from any of the others. It uses V.23 modem signals, but the message structure is uniqeue. Also, the message is delivered while off hook. This results in a sequence - The phone line rings - CPE answers and waits for the caller ID message - CPE hangs up on receipt of the caller ID message - The phone line rings a second time - The CPE answers a second time, connecting the called party with the caller. Timeouts are, obviously, required to ensure this system behaves well when the caller ID message or the second ring are missing. */ enum { ADSI_STANDARD_NONE = 0, ADSI_STANDARD_CLASS = 1, ADSI_STANDARD_CLIP = 2, ADSI_STANDARD_ACLIP = 3, ADSI_STANDARD_JCLIP = 4, ADSI_STANDARD_CLIP_DTMF = 5, ADSI_STANDARD_TDD = 6 }; /* In some of the messages code characters are used, as follows: 'C' for public callbox 'L' for long distance 'O' for overseas 'P' for private 'S' for service conflict Taiwan and Kuwait change this pattern to: 'C' for coin/public callbox 'I' for international call 'O' for out of area call 'P' for private */ /*! Definitions for CLASS (Custom Local Area Signaling Services) */ enum { /*! Single data message caller ID */ CLASS_SDMF_CALLERID = 0x04, /*! Multiple data message caller ID */ CLASS_MDMF_CALLERID = 0x80, /*! Single data message message waiting */ CLASS_SDMF_MSG_WAITING = 0x06, /*! Multiple data message message waiting */ CLASS_MDMF_MSG_WAITING = 0x82 }; /*! CLASS MDMF message IDs */ enum { /*! Date and time (MMDDHHMM) */ MCLASS_DATETIME = 0x01, /*! Caller number */ MCLASS_CALLER_NUMBER = 0x02, /*! Dialed number */ MCLASS_DIALED_NUMBER = 0x03, /*! Caller number absent: 'O' or 'P' */ MCLASS_ABSENCE1 = 0x04, /*! Call forward: universal ('0'), on busy ('1'), or on unanswered ('2') */ MCLASS_REDIRECT = 0x05, /*! Long distance: 'L' */ MCLASS_QUALIFIER = 0x06, /*! Caller's name */ MCLASS_CALLER_NAME = 0x07, /*! Caller's name absent: 'O' or 'P' */ MCLASS_ABSENCE2 = 0x08, /*! Alternate route */ MCLASS_ALT_ROUTE = 0x09 }; /*! CLASS MDMF message waiting message IDs */ /*! Message waiting/not waiting */ #define MCLASS_VISUAL_INDICATOR 0x0B /*! Definitions for CLIP (Calling Line Identity Presentation) */ enum { /*! Multiple data message caller ID */ CLIP_MDMF_CALLERID = 0x80, /*! Multiple data message message waiting */ CLIP_MDMF_MSG_WAITING = 0x82, /*! Multiple data message charge information */ CLIP_MDMF_CHARGE_INFO = 0x86, /*! Multiple data message SMS */ CLIP_MDMF_SMS = 0x89 }; /*! CLIP message IDs */ enum { /*! Date and time (MMDDHHMM) */ CLIP_DATETIME = 0x01, /*! Caller number */ CLIP_CALLER_NUMBER = 0x02, /*! Dialed number */ CLIP_DIALED_NUMBER = 0x03, /*! Caller number absent: 'O' or 'P' */ CLIP_ABSENCE1 = 0x04, /*! Caller's name */ CLIP_CALLER_NAME = 0x07, /*! Caller's name absent: 'O' or 'P' */ CLIP_ABSENCE2 = 0x08, /*! Visual indicator */ CLIP_VISUAL_INDICATOR = 0x0B, /*! Message ID */ CLIP_MESSAGE_ID = 0x0D, /*! Voice call, ring-back-when-free call, or msg waiting call */ CLIP_CALLTYPE = 0x11, /*! Number of messages */ CLIP_NUM_MSG = 0x13, /*! Redirecting number */ CLIP_REDIR_NUMBER = 0x03, /*! Charge */ CLIP_CHARGE = 0x20, /*! Duration of the call */ CLIP_DURATION = 0x23, /*! Additional charge */ CLIP_ADD_CHARGE = 0x21, /*! Display information */ CLIP_DISPLAY_INFO = 0x50, /*! Service information */ CLIP_SERVICE_INFO = 0x55 }; /*! Definitions for A-CLIP (Analog Calling Line Identity Presentation) */ enum { /*! Single data message caller ID frame */ ACLIP_SDMF_CALLERID = 0x04, /*! Multiple data message caller ID frame */ ACLIP_MDMF_CALLERID = 0x80 }; /*! A-CLIP MDM message IDs */ enum { /*! Date and time (MMDDHHMM) */ ACLIP_DATETIME = 0x01, /*! Caller number */ ACLIP_CALLER_NUMBER = 0x02, /*! Dialed number */ ACLIP_DIALED_NUMBER = 0x03, /*! Caller number absent: 'O' or 'P' */ ACLIP_NUMBER_ABSENCE = 0x04, /*! Call forward: universal, on busy, or on unanswered */ ACLIP_REDIRECT = 0x05, /*! Long distance call: 'L' */ ACLIP_QUALIFIER = 0x06, /*! Caller's name */ ACLIP_CALLER_NAME = 0x07, /*! Caller's name absent: 'O' or 'P' */ ACLIP_NAME_ABSENCE = 0x08 }; /*! Definitions for J-CLIP (Japan Calling Line Identity Presentation) */ /*! Multiple data message caller ID frame */ #define JCLIP_MDMF_CALLERID 0x40 /*! J-CLIP MDM message IDs */ enum { /*! Caller number */ JCLIP_CALLER_NUMBER = 0x02, /*! Caller number data extension signal */ JCLIP_CALLER_NUM_DES = 0x21, /*! Dialed number */ JCLIP_DIALED_NUMBER = 0x09, /*! Dialed number data extension signal */ JCLIP_DIALED_NUM_DES = 0x22, /*! Caller number absent: 'C', 'O', 'P' or 'S' */ JCLIP_ABSENCE = 0x04 }; /*! Definitions for CLIP-DTMF and its variants */ #define CLIP_DTMF_HASH_TERMINATED '#' #define CLIP_DTMF_C_TERMINATED 'C' /*! Caller number */ #define CLIP_DTMF_HASH_CALLER_NUMBER 'A' /*! Caller number absent: private (1), overseas (2) or not available (3) */ #define CLIP_DTMF_HASH_ABSENCE 'D' /*! Caller ID field with no explicit field type */ #define CLIP_DTMF_HASH_UNSPECIFIED 0 /*! Caller number */ #define CLIP_DTMF_C_CALLER_NUMBER 'A' /*! Diverting number */ #define CLIP_DTMF_C_REDIRECT_NUMBER 'D' /*! Caller number absent: private/restricted (00) or not available (10) */ #define CLIP_DTMF_C_ABSENCE 'B' /*! ADSI transmitter descriptor. This contains all the state information for an ADSI (caller ID, CLASS, CLIP, ACLIP) transmit channel. */ typedef struct { int standard; tone_gen_descriptor_t alert_tone_desc; tone_gen_state_t alert_tone_gen; fsk_tx_state_t fsktx; dtmf_tx_state_t dtmftx; async_tx_state_t asynctx; int tx_signal_on; int byte_no; int bit_pos; int bit_no; uint8_t msg[256]; int msg_len; int preamble_len; int preamble_ones_len; int postamble_ones_len; int stop_bits; int baudot_shift; logging_state_t logging; } adsi_tx_state_t; /*! ADSI receiver descriptor. This contains all the state information for an ADSI (caller ID, CLASS, CLIP, ACLIP, JCLIP) receive channel. */ typedef struct { int standard; put_msg_func_t put_msg; void *user_data; fsk_rx_state_t fskrx; dtmf_rx_state_t dtmfrx; async_rx_state_t asyncrx; int consecutive_ones; int bit_pos; int in_progress; uint8_t msg[256]; int msg_len; int baudot_shift; /*! A count of the framing errors. */ int framing_errors; logging_state_t logging; } adsi_rx_state_t; #if defined(__cplusplus) extern "C" { #endif /*! \brief Initialise an ADSI receive context. \param s The ADSI receive context. \param standard The code for the ADSI standard to be used. \param put_msg A callback routine called to deliver the received messages to the application. \param user_data An opaque pointer for the callback routine. \return A pointer to the initialised context, or NULL if there was a problem. */ adsi_rx_state_t *adsi_rx_init(adsi_rx_state_t *s, int standard, put_msg_func_t put_msg, void *user_data); /*! \brief Receive a chunk of ADSI audio. \param s The ADSI receive context. \param amp The audio sample buffer. \param len The number of samples in the buffer. \return The number of samples unprocessed. */ int adsi_rx(adsi_rx_state_t *s, const int16_t *amp, int len); /*! \brief Initialise an ADSI transmit context. \param s The ADSI transmit context. \param standard The code for the ADSI standard to be used. \return A pointer to the initialised context, or NULL if there was a problem. */ adsi_tx_state_t *adsi_tx_init(adsi_tx_state_t *s, int standard); /*! \brief Adjust the preamble associated with an ADSI transmit context. \param s The ADSI transmit context. \param preamble_len The number of bits of preamble. \param preamble_ones_len The number of bits of continuous one before a message. \param postamble_ones_len The number of bits of continuous one after a message. \param stop_bits The number of stop bits per character. */ void adsi_tx_set_preamble(adsi_tx_state_t *s, int preamble_len, int preamble_ones_len, int postamble_ones_len, int stop_bits); /*! \brief Generate a block of ADSI audio samples. \param s The ADSI transmit context. \param amp The audio sample buffer. \param max_len The number of samples to be generated. \return The number of samples actually generated. */ int adsi_tx(adsi_tx_state_t *s, int16_t *amp, int max_len); /*! \brief Request generation of an ADSI alert tone. \param s The ADSI transmit context. */ void adsi_tx_send_alert_tone(adsi_tx_state_t *s); /*! \brief Put a message into the input buffer of an ADSI transmit context. \param s The ADSI transmit context. \param msg The message. \param len The length of the message. \return The length actually added. If a message is already in progress in the transmitter, this function will return zero, as it will not successfully add the message to the buffer. */ int adsi_tx_put_message(adsi_tx_state_t *s, const uint8_t *msg, int len); /*! \brief Get a field from an ADSI message. \param s The ADSI receive context. \param msg The message buffer. \param msg_len The length of the message. \param pos Current position within the message. Set to -1 when starting a message. \param field_type The type code for the field. \param field_body Pointer to the body of the field. \param field_len The length of the field, or -1 for no more fields, or -2 for message structure corrupt. */ int adsi_next_field(adsi_rx_state_t *s, const uint8_t *msg, int msg_len, int pos, uint8_t *field_type, uint8_t const **field_body, int *field_len); /*! \brief Insert the header or a field into an ADSI message. \param s The ADSI transmit context. \param msg The message buffer. \param len The current length of the message. \param field_type The type code for the new field. \param field_body Pointer to the body of the new field. \param field_len The length of the new field. */ int adsi_add_field(adsi_tx_state_t *s, uint8_t *msg, int len, uint8_t field_type, uint8_t const *field_body, int field_len); /*! \brief Return a short name for an ADSI standard \param standard The code for the standard. \return A pointer to the name. */ const char *adsi_standard_to_str(int standard); #if defined(__cplusplus) } #endif #endif /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/spandsp/time_scale.h0000644000175000017500000000723411150047206021610 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * time_scale.h - Time scaling for linear speech data * * Written by Steve Underwood * * Copyright (C) 2004 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: time_scale.h,v 1.15 2008/04/17 14:27:01 steveu Exp $ */ #if !defined(_SPANDSP_TIME_SCALE_H_) #define _SPANDSP_TIME_SCALE_H_ /*! \page time_scale_page Time scaling speech \section time_scale_page_sec_1 What does it do? The time scaling module allows speech files to be played back at a different speed, from the speed at which they were recorded. If this were done by simply speeding up or slowing down replay, the pitch of the voice would change, and sound very odd. This modules keeps the pitch of the voice normal. \section time_scale_page_sec_2 How does it work? The time scaling module is based on the Pointer Interval Controlled OverLap and Add (PICOLA) method, developed by Morita Naotaka. Mikio Ikeda has an excellent web page on this subject at http://keizai.yokkaichi-u.ac.jp/~ikeda/research/picola.html There is also working code there. This implementation uses exactly the same algorithms, but the code is a complete rewrite. Mikio's code batch processes files. This version works incrementally on streams, and allows multiple streams to be processed concurrently. */ #define TIME_SCALE_MIN_PITCH 60 #define TIME_SCALE_MAX_PITCH 250 #define TIME_SCALE_BUF_LEN (2*SAMPLE_RATE/TIME_SCALE_MIN_PITCH) /*! Audio time scaling descriptor. */ typedef struct { double rate; double rcomp; double rate_nudge; int fill; int lcp; int16_t buf[TIME_SCALE_BUF_LEN]; } time_scale_state_t; #if defined(__cplusplus) extern "C" { #endif /*! Initialise a time scale context. This must be called before the first use of the context, to initialise its contents. \brief Initialise a time scale context. \param s The time scale context. \param rate The ratio between the output speed and the input speed. \return A pointer to the context, or NULL if there was a problem. */ time_scale_state_t *time_scale_init(time_scale_state_t *s, float rate); /*! \brief Free a time scale context. \param s The time scale context. \return 0 for OK, else -1. */ int time_scale_free(time_scale_state_t *s); /*! Change the time scale rate. \brief Change the time scale rate. \param s The time scale context. \param rate The ratio between the output speed and the input speed. \return 0 if changed OK, else -1. */ int time_scale_rate(time_scale_state_t *s, float rate); /*! Time scale a chunk of audio samples. \brief Time scale a chunk of audio samples. \param s The time sclae context. \param out The output audio sample buffer. \param in The input audio sample buffer. \param len The number of input samples. \return The number of output samples. */ int time_scale(time_scale_state_t *s, int16_t out[], int16_t in[], int len); #if defined(__cplusplus) } #endif #endif /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/spandsp/dds.h0000644000175000017500000001663711150047206020264 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * dds.h * * Written by Steve Underwood * * Copyright (C) 2003 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: dds.h,v 1.18 2008/04/17 14:27:00 steveu Exp $ */ /*! \file */ #if !defined(_SPANDSP_DDS_H_) #define _SPANDSP_DDS_H_ #if defined(__cplusplus) extern "C" { #endif /*! \brief Find the phase rate value to achieve a particular frequency. \param frequency The desired frequency, in Hz. \return The phase rate which while achieve the desired frequency. */ int32_t dds_phase_rate(float frequency); /*! \brief Find the frequency, in Hz, equivalent to a phase rate. \param phase_rate The phase rate. \return The equivalent frequency, in Hz. */ float dds_frequency(int32_t phase_rate); /*! \brief Find the scaling factor needed to achieve a specified level in dBm0. \param level The desired signal level, in dBm0. \return The scaling factor. */ int dds_scaling_dbm0(float level); /*! \brief Find the scaling factor needed to achieve a specified level in dBmov. \param level The desired signal level, in dBmov. \return The scaling factor. */ int dds_scaling_dbov(float level); /*! \brief Find the amplitude for a particular phase. \param phase The desired phase 32 bit phase. \return The signal amplitude. */ int16_t dds_lookup(uint32_t phase); /*! \brief Find the amplitude for a particular phase offset from an accumulated phase. \param phase_acc The accumulated phase. \param phase_offset The phase offset. \return The signal amplitude. */ int16_t dds_offset(uint32_t phase_acc, int32_t phase_offset); /*! \brief Advance the phase, without returning any new signal sample. \param phase_acc A pointer to a phase accumulator value. \param phase_rate The phase increment to be applied. */ void dds_advance(uint32_t *phase_acc, int32_t phase_rate); /*! \brief Generate an integer tone sample. \param phase_acc A pointer to a phase accumulator value. \param phase_rate The phase increment to be applied. \return The signal amplitude, between -32767 and 32767. */ int16_t dds(uint32_t *phase_acc, int32_t phase_rate); /*! \brief Lookup the integer value of a specified phase. \param phase The phase accumulator value to be looked up. \return The signal amplitude, between -32767 and 32767. */ int16_t dds_lookup(uint32_t phase); /*! \brief Generate an integer tone sample, with modulation. \param phase_acc A pointer to a phase accumulator value. \param phase_rate The phase increment to be applied. \param scale The scaling factor. \param phase The phase offset. \return The signal amplitude, between -32767 and 32767. */ int16_t dds_mod(uint32_t *phase_acc, int32_t phase_rate, int scale, int32_t phase); /*! \brief Generate a complex integer tone sample. \param phase_acc A pointer to a phase accumulator value. \param phase_rate The phase increment to be applied. \return The complex signal amplitude, between (-32767, -32767) and (32767, 32767). */ complexi_t dds_complexi(uint32_t *phase_acc, int32_t phase_rate); /*! \brief Lookup the complex integer value of a specified phase. \param phase The phase accumulator value to be looked up. \return The complex signal amplitude, between (-32767, -32767) and (32767, 32767). */ complexi_t dds_lookup_complexi(uint32_t phase); /*! \brief Generate a complex integer tone sample, with modulation. \param phase_acc A pointer to a phase accumulator value. \param phase_rate The phase increment to be applied. \param scale The scaling factor. \param phase The phase offset. \return The complex signal amplitude, between (-32767, -32767) and (32767, 32767). */ complexi_t dds_complexi_mod(uint32_t *phase_acc, int32_t phase_rate, int scale, int32_t phase); /*! \brief Find the phase rate equivalent to a frequency, in Hz. \param frequency The frequency, in Hz. \return The equivalent phase rate. */ int32_t dds_phase_ratef(float frequency); /*! \brief Find the frequency, in Hz, equivalent to a phase rate. \param phase_rate The phase rate. \return The equivalent frequency, in Hz. */ float dds_frequencyf(int32_t phase_rate); /*! \brief Find the scaling factor equivalent to a dBm0 value. \param level The signal level in dBm0. \return The equivalent scaling factor. */ float dds_scaling_dbm0f(float level); /*! \brief Find the scaling factor equivalent to a dBmov value. \param level The signal level in dBmov. \return The equivalent scaling factor. */ float dds_scaling_dbovf(float level); /*! \brief Advance the phase, without returning any new signal sample. \param phase_acc A pointer to a phase accumulator value. \param phase_rate The phase increment to be applied. */ void dds_advancef(uint32_t *phase_acc, int32_t phase_rate); /*! \brief Generate a floating point tone sample. \param phase_acc A pointer to a phase accumulator value. \param phase_rate The phase increment to be applied. \return The signal amplitude, between -1.0 and 1.0. */ float ddsf(uint32_t *phase_acc, int32_t phase_rate); /*! \brief Lookup the floating point value of a specified phase. \param phase The phase accumulator value to be looked up. \return The signal amplitude, between -1.0 and 1.0. */ float dds_lookupf(uint32_t phase); /*! \brief Generate a floating point tone sample, with modulation. \param phase_acc A pointer to a phase accumulator value. \param phase_rate The phase increment to be applied. \param scale The scaling factor. \param phase The phase offset. \return The signal amplitude, between -1.0 and 1.0. */ float dds_modf(uint32_t *phase_acc, int32_t phase_rate, float scale, int32_t phase); /*! \brief Generate a complex floating point tone sample. \param phase_acc A pointer to a phase accumulator value. \param phase_rate The phase increment to be applied. \return The complex signal amplitude, between (-1.0, -1.0) and (1.0, 1.0). */ complexf_t dds_complexf(uint32_t *phase_acc, int32_t phase_rate); /*! \brief Lookup the complex value of a specified phase. \param phase The phase accumulator value to be looked up. \return The complex signal amplitude, between (-1.0, -1.0) and (1.0, 1.0). */ complexf_t dds_lookup_complexf(uint32_t phase_acc); /*! \brief Generate a complex floating point tone sample, with modulation. \param phase_acc A pointer to a phase accumulator value. \param phase_rate The phase increment to be applied. \param scale The scaling factor. \param phase The phase offset. \return The complex signal amplitude, between (-1.0, -1.0) and (1.0, 1.0). */ complexf_t dds_complex_modf(uint32_t *phase_acc, int32_t phase_rate, float scale, int32_t phase); #if defined(__cplusplus) } #endif #endif /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/spandsp/logging.h0000644000175000017500000001101111150047206021115 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * logging.h - definitions for error and debug logging. * * Written by Steve Underwood * * Copyright (C) 2005 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: logging.h,v 1.16 2008/05/05 11:25:01 steveu Exp $ */ /*! \file */ /*! \page logging_page Logging \section logging_page_sec_1 What does it do? ???. */ #if !defined(_SPANDSP_LOGGING_H_) #define _SPANDSP_LOGGING_H_ /*! General logging function for spandsp logging. */ typedef void (*message_handler_func_t)(int level, const char *text); /*! Error logging function for spandsp logging. */ typedef void (*error_handler_func_t)(const char *text); /* Logging elements */ enum { SPAN_LOG_SEVERITY_MASK = 0x00FF, SPAN_LOG_SHOW_DATE = 0x0100, SPAN_LOG_SHOW_SAMPLE_TIME = 0x0200, SPAN_LOG_SHOW_SEVERITY = 0x0400, SPAN_LOG_SHOW_PROTOCOL = 0x0800, SPAN_LOG_SHOW_VARIANT = 0x1000, SPAN_LOG_SHOW_TAG = 0x2000, SPAN_LOG_SUPPRESS_LABELLING = 0x8000 }; /* Logging severity levels */ enum { SPAN_LOG_NONE = 0, SPAN_LOG_ERROR = 1, SPAN_LOG_WARNING = 2, SPAN_LOG_PROTOCOL_ERROR = 3, SPAN_LOG_PROTOCOL_WARNING = 4, SPAN_LOG_FLOW = 5, SPAN_LOG_FLOW_2 = 6, SPAN_LOG_FLOW_3 = 7, SPAN_LOG_DEBUG = 8, SPAN_LOG_DEBUG_2 = 9, SPAN_LOG_DEBUG_3 = 10 }; /*! Logging descriptor. This defines the working state for a single instance of the logging facility for spandsp. */ typedef struct { int level; int samples_per_second; int64_t elapsed_samples; const char *tag; const char *protocol; message_handler_func_t span_message; error_handler_func_t span_error; } logging_state_t; #if defined(__cplusplus) extern "C" { #endif /*! Test if logging of a specified severity level is enabled. \brief Test if logging of a specified severity level is enabled. \param s The logging context. \param level The severity level to be tested. \return TRUE if logging is enable, else FALSE. */ int span_log_test(logging_state_t *s, int level); /*! Generate a log entry. \brief Generate a log entry. \param s The logging context. \param level The severity level of the entry. \param format ??? \return 0 if no output generated, else 1. */ int span_log(logging_state_t *s, int level, const char *format, ...); /*! Generate a log entry displaying the contents of a buffer. \brief Generate a log entry displaying the contents of a buffer \param s The logging context. \param level The severity level of the entry. \param tag A label for the log entry. \param buf The buffer to be dumped to the log. \param len The length of buf. \return 0 if no output generated, else 1. */ int span_log_buf(logging_state_t *s, int level, const char *tag, const uint8_t *buf, int len); int span_log_init(logging_state_t *s, int level, const char *tag); int span_log_set_level(logging_state_t *s, int level); int span_log_set_tag(logging_state_t *s, const char *tag); int span_log_set_protocol(logging_state_t *s, const char *protocol); int span_log_set_sample_rate(logging_state_t *s, int samples_per_second); int span_log_bump_samples(logging_state_t *s, int samples); void span_log_set_message_handler(logging_state_t *s, message_handler_func_t func); void span_log_set_error_handler(logging_state_t *s, error_handler_func_t func); void span_set_message_handler(message_handler_func_t func); void span_set_error_handler(error_handler_func_t func); #if defined(__cplusplus) } #endif #endif /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/spandsp/g722.h0000644000175000017500000001165711150047206020170 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * g722.h - The ITU G.722 codec. * * Written by Steve Underwood * * Copyright (C) 2005 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * Based on a single channel G.722 codec which is: * ***** Copyright (c) CMU 1993 ***** * Computer Science, Speech Group * Chengxiang Lu and Alex Hauptmann * * $Id: g722.h,v 1.19 2008/04/17 14:27:00 steveu Exp $ */ /*! \file */ #if !defined(_SPANDSP_G722_H_) #define _SPANDSP_G722_H_ /*! \page g722_page G.722 encoding and decoding \section g722_page_sec_1 What does it do? The G.722 module is a bit exact implementation of the ITU G.722 specification for all three specified bit rates - 64000bps, 56000bps and 48000bps. It passes the ITU tests. To allow fast and flexible interworking with narrow band telephony, the encoder and decoder support an option for the linear audio to be an 8k samples/second stream. In this mode the codec is considerably faster, and still fully compatible with wideband terminals using G.722. \section g722_page_sec_2 How does it work? ???. */ enum { G722_SAMPLE_RATE_8000 = 0x0001, G722_PACKED = 0x0002 }; typedef struct { /*! TRUE if the operating in the special ITU test mode, with the band split filters disabled. */ int itu_test_mode; /*! TRUE if the G.722 data is packed */ int packed; /*! TRUE if encode from 8k samples/second */ int eight_k; /*! 6 for 48000kbps, 7 for 56000kbps, or 8 for 64000kbps. */ int bits_per_sample; /*! Signal history for the QMF */ int x[24]; struct { int s; int sp; int sz; int r[3]; int a[3]; int ap[3]; int p[3]; int d[7]; int b[7]; int bp[7]; int sg[7]; int nb; int det; } band[2]; unsigned int in_buffer; int in_bits; unsigned int out_buffer; int out_bits; } g722_encode_state_t; typedef struct { /*! TRUE if the operating in the special ITU test mode, with the band split filters disabled. */ int itu_test_mode; /*! TRUE if the G.722 data is packed */ int packed; /*! TRUE if decode to 8k samples/second */ int eight_k; /*! 6 for 48000kbps, 7 for 56000kbps, or 8 for 64000kbps. */ int bits_per_sample; /*! Signal history for the QMF */ int x[24]; struct { int s; int sp; int sz; int r[3]; int a[3]; int ap[3]; int p[3]; int d[7]; int b[7]; int bp[7]; int sg[7]; int nb; int det; } band[2]; unsigned int in_buffer; int in_bits; unsigned int out_buffer; int out_bits; } g722_decode_state_t; #if defined(__cplusplus) extern "C" { #endif /*! Initialise an G.722 encode context. \param s The G.722 encode context. \param rate The required bit rate for the G.722 data. The valid rates are 64000, 56000 and 48000. \param options \return A pointer to the G.722 encode context, or NULL for error. */ g722_encode_state_t *g722_encode_init(g722_encode_state_t *s, int rate, int options); int g722_encode_release(g722_encode_state_t *s); /*! Encode a buffer of linear PCM data to G.722 \param s The G.722 context. \param g722_data The G.722 data produced. \param amp The audio sample buffer. \param len The number of samples in the buffer. \return The number of bytes of G.722 data produced. */ int g722_encode(g722_encode_state_t *s, uint8_t g722_data[], const int16_t amp[], int len); /*! Initialise an G.722 decode context. \param s The G.722 decode context. \param rate The bit rate of the G.722 data. The valid rates are 64000, 56000 and 48000. \param options \return A pointer to the G.722 decode context, or NULL for error. */ g722_decode_state_t *g722_decode_init(g722_decode_state_t *s, int rate, int options); int g722_decode_release(g722_decode_state_t *s); /*! Decode a buffer of G.722 data to linear PCM. \param s The G.722 context. \param amp The audio sample buffer. \param g722_data \param len \return The number of samples returned. */ int g722_decode(g722_decode_state_t *s, int16_t amp[], const uint8_t g722_data[], int len); #if defined(__cplusplus) } #endif #endif iaxmodem-1.2.0/lib/spandsp/src/spandsp/t38_gateway.h0000644000175000017500000003402111150047206021634 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * t38_gateway.h - A T.38, less the packet exchange part * * Written by Steve Underwood * * Copyright (C) 2005, 2006, 2007 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: t38_gateway.h,v 1.51 2008/07/25 13:56:54 steveu Exp $ */ /*! \file */ #if !defined(_SPANDSP_T38_GATEWAY_H_) #define _SPANDSP_T38_GATEWAY_H_ /*! \page t38_gateway_page T.38 real time FAX over IP PSTN gateway \section t38_gateway_page_sec_1 What does it do? The T.38 gateway facility provides a robust interface between T.38 IP packet streams and and 8k samples/second audio streams. It provides the buffering and flow control features needed to maximum the tolerance of jitter and packet loss on the IP network. \section t38_gateway_page_sec_2 How does it work? */ #define T38_RX_BUF_LEN 2048 #define T38_NON_ECM_TX_BUF_LEN 16384 #define T38_TX_HDLC_BUFS 256 /* Make sure the HDLC frame buffers are big enough for ECM frames. */ #define T38_MAX_HDLC_LEN 260 typedef struct t38_gateway_state_s t38_gateway_state_t; /*! T.30 real time frame handler. \brief T.30 real time frame handler. \param s The T.30 context. \param user_data An opaque pointer. \param direction TRUE for incoming, FALSE for outgoing. \param msg The HDLC message. \param len The length of the message. */ typedef void (t38_gateway_real_time_frame_handler_t)(t38_gateway_state_t *s, void *user_data, int direction, const uint8_t *msg, int len); /*! T.38 gateway T.38 audio side channel descriptor. */ typedef struct { /*! Core T.38 IFP support */ t38_core_state_t t38; /*! \brief TRUE if the NSF, NSC, and NSS are to be suppressed by altering their contents to something the far end will not recognise. */ int suppress_nsx_len[2]; /*! \brief TRUE if we need to corrupt the HDLC frame in progress, so the receiver cannot interpret it. The two values are for the two directions. */ int corrupt_current_frame[2]; /*! \brief the current class of field being received - i.e. none, non-ECM or HDLC */ int current_rx_field_class; /*! \brief The T.38 indicator currently in use */ int in_progress_rx_indicator; /*! \brief The current T.38 data type being sent. */ int current_tx_data_type; /*! \brief The number of octets to send in each image packet (non-ECM or ECM) at the current rate and the current specified packet interval. */ int octets_per_data_packet; } t38_gateway_t38_state_t; /*! T.38 gateway audio side channel descriptor. */ typedef struct { /*! \brief Use talker echo protection when transmitting. */ int use_tep; /*! \brief If TRUE, transmit silence when there is nothing else to transmit. If FALSE return only the actual generated audio. Note that this only affects untimed silences. Timed silences (e.g. the 75ms silence between V.21 and a high speed modem) will alway be transmitted as silent audio. */ int transmit_on_idle; fax_modems_t modems; /*! \brief TRUE if in image data modem is to use short training. */ int short_train; /*! \brief Progressively calculated CRC for HDLC messaging received from a modem. */ uint16_t crc; /*! \brief TRUE if a carrier is present. Otherwise FALSE. */ int rx_signal_present; /*! \brief TRUE if a modem has trained correctly. */ int rx_trained; /*! \brief The current transmit signal handler */ span_tx_handler_t *tx_handler; /*! \brief An opaque pointer, passed to tx_handler. */ void *tx_user_data; /*! \brief The transmit signal handler to be used when the current one has finished sending. */ span_tx_handler_t *next_tx_handler; /*! \brief An opaque pointer, passed to next_tx_handler. */ void *next_tx_user_data; /*! \brief The immediately active receive signal handler, which may hop between rx_handler and dummy_rx(). */ span_rx_handler_t *immediate_rx_handler; /*! \brief The current receive signal handler */ span_rx_handler_t *rx_handler; /*! \brief An opaque pointer, passed to rx_handler. */ void *rx_user_data; /*! \brief Audio logging file handles */ int fax_audio_rx_log; int fax_audio_tx_log; } t38_gateway_audio_state_t; /*! T.38 gateway state. */ struct t38_gateway_state_s { t38_gateway_t38_state_t t38x; t38_gateway_audio_state_t audio; /*! \brief A bit mask of the currently supported modem types. */ int supported_modems; /*! \brief TRUE if ECM FAX mode is allowed through the gateway. */ int ecm_allowed; /*! \brief TRUE if we should count the next MCF as a page end, else FALSE */ int count_page_on_mcf; /*! \brief The number of pages for which a confirm (MCF) message was returned. */ int pages_confirmed; /*! Buffer for HDLC and non-ECM data going to the T.38 channel */ struct { /*! \brief non-ECM and HDLC modem receive data buffer */ uint8_t data[T38_RX_BUF_LEN]; int data_ptr; } to_t38; /*! Buffer for data going to an HDLC modem. */ struct { /*! \brief HDLC message buffers. */ uint8_t buf[T38_TX_HDLC_BUFS][T38_MAX_HDLC_LEN]; /*! \brief HDLC message lengths. */ int len[T38_TX_HDLC_BUFS]; /*! \brief HDLC message status flags. */ int flags[T38_TX_HDLC_BUFS]; /*! \brief HDLC buffer contents. */ int contents[T38_TX_HDLC_BUFS]; /*! \brief HDLC buffer number for input. */ int in; /*! \brief HDLC buffer number for output. */ int out; } hdlc_to_modem; /*! Buffer for data going to a non-ECM mode modem. */ struct { /*! \brief non-ECM modem transmit data buffer */ uint8_t tx_data[T38_NON_ECM_TX_BUF_LEN]; int tx_in_ptr; int tx_out_ptr; /*! \brief The location of the most recent EOL marker in the non-ECM data buffer */ int tx_latest_eol_ptr; unsigned int bit_stream; /*! \brief The non-ECM flow control fill octet (0xFF before the first data, and 0x00 once data has started). */ uint8_t flow_control_fill_octet; /*! \brief TRUE if we are in the initial all ones part of non-ECM transmission. */ int at_initial_all_ones; /*! \brief TRUE is the end of non-ECM data indication has been received. */ int data_finished; /*! \brief The current octet being sent as non-ECM data. */ unsigned int rx_bit_stream; unsigned int tx_octet; /*! \brief The current bit number in the current non-ECM octet. */ int bit_no; int in_octets; int out_octets; int in_rows; int out_rows; /*! \brief A count of the number of non-ECM fill octets generated for flow control control purposes. */ int flow_control_fill_octets; } non_ecm_to_modem; /*! \brief TRUE if we are in error correcting (ECM) mode */ int ecm_mode; /*! \brief The current bit rate for the fast modem. */ int fast_bit_rate; /*! \brief The current fast modem type. */ int fast_modem; /*! \brief The type of fast receive modem currently active, which may be T38_NONE */ int fast_rx_active; /*! \brief TRUE if between DCS and TCF, and we want the fast image modem to start in the T.38 data at a predictable time from the end of the V.21 signal. */ int tcf_mode_predictable_modem_start; /*! \brief TRUE if in image data mode (as opposed to TCF mode) in either direction. */ int image_data_mode; /*! \brief The number of samples until the next timeout event */ int samples_to_timeout; /*! \brief A pointer to a callback routine to be called when frames are exchanged. */ t38_gateway_real_time_frame_handler_t *real_time_frame_handler; /*! \brief An opaque pointer supplied in real time frame callbacks. */ void *real_time_frame_user_data; /*! \brief Error and flow logging control */ logging_state_t logging; }; typedef struct { /*! \brief The current bit rate for image transfer. */ int bit_rate; /*! \brief TRUE if error correcting mode is used. */ int error_correcting_mode; /*! \brief The number of pages transferred so far. */ int pages_transferred; } t38_stats_t; #if defined(__cplusplus) extern "C" { #endif /*! \brief Initialise a gateway mode T.38 context. \param s The T.38 context. \param tx_packet_handler A callback routine to encapsulate and transmit T.38 packets. \param tx_packet_user_data An opaque pointer passed to the tx_packet_handler routine. \return A pointer to the termination mode T.38 context, or NULL if there was a problem. */ t38_gateway_state_t *t38_gateway_init(t38_gateway_state_t *s, t38_tx_packet_handler_t *tx_packet_handler, void *tx_packet_user_data); /*! Free a gateway mode T.38 context. \brief Free a T.38 context. \param s The T.38 context. \return 0 for OK, else -1. */ int t38_gateway_free(t38_gateway_state_t *s); /*! Process a block of received FAX audio samples. \brief Process a block of received FAX audio samples. \param s The T.38 context. \param amp The audio sample buffer. \param len The number of samples in the buffer. \return The number of samples unprocessed. */ int t38_gateway_rx(t38_gateway_state_t *s, int16_t amp[], int len); /*! Generate a block of FAX audio samples. \brief Generate a block of FAX audio samples. \param s The T.38 context. \param amp The audio sample buffer. \param max_len The number of samples to be generated. \return The number of samples actually generated. */ int t38_gateway_tx(t38_gateway_state_t *s, int16_t amp[], int max_len); /*! Control whether error correcting mode (ECM) is allowed. \brief Control whether error correcting mode (ECM) is allowed. \param s The T.38 context. \param ecm_allowed TRUE is ECM is to be allowed. */ void t38_gateway_set_ecm_capability(t38_gateway_state_t *s, int ecm_allowed); /*! Select whether silent audio will be sent when transmit is idle. \brief Select whether silent audio will be sent when transmit is idle. \param s The T.38 context. \param transmit_on_idle TRUE if silent audio should be output when the FAX transmitter is idle. FALSE to transmit zero length audio when the FAX transmitter is idle. The default behaviour is FALSE. */ void t38_gateway_set_transmit_on_idle(t38_gateway_state_t *s, int transmit_on_idle); /*! Specify which modem types are supported by a T.30 context. \brief Specify supported modems. \param s The T.38 context. \param supported_modems Bit field list of the supported modems. */ void t38_gateway_set_supported_modems(t38_gateway_state_t *s, int supported_modems); /*! Select whether NSC, NSF, and NSS should be suppressed. It selected, the contents of these messages are forced to zero for all octets beyond the message type. This makes them look like manufacturer specific messages, from a manufacturer which does not exist. \brief Select whether NSC, NSF, and NSS should be suppressed. \param s The T.38 context. \param from_t38 A string of bytes to overwrite the header of any NSC, NSF, and NSS frames passing through the gateway from T.38 the the modem. \param from_t38_len The length of the overwrite string. \param from_modem A string of bytes to overwrite the header of any NSC, NSF, and NSS frames passing through the gateway from the modem to T.38. \param from_modem_len The length of the overwrite string. */ void t38_gateway_set_nsx_suppression(t38_gateway_state_t *s, const uint8_t *from_t38, int from_t38_len, const uint8_t *from_modem, int from_modem_len); /*! Select whether talker echo protection tone will be sent for the image modems. \brief Select whether TEP will be sent for the image modems. \param s The T.38 context. \param use_tep TRUE if TEP should be sent. */ void t38_gateway_set_tep_mode(t38_gateway_state_t *s, int use_tep); /*! Get the current transfer statistics for the current T.38 session. \brief Get the current transfer statistics. \param s The T.38 context. \param t A pointer to a buffer for the statistics. */ void t38_gateway_get_transfer_statistics(t38_gateway_state_t *s, t38_stats_t *t); /*! Set a callback function for T.30 frame exchange monitoring. This is called from the heart of the signal processing, so don't take too long in the handler routine. \brief Set a callback function for T.30 frame exchange monitoring. \param s The T.30 context. \param handler The callback function. \param user_data An opaque pointer passed to the callback function. */ void t38_gateway_set_real_time_frame_handler(t38_gateway_state_t *s, t38_gateway_real_time_frame_handler_t *handler, void *user_data); #if defined(__cplusplus) } #endif #endif /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/spandsp/bell_r2_mf.h0000644000175000017500000002735011150047206021507 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * bell_r2_mf.h - Bell MF and MFC/R2 tone generation and detection. * * Written by Steve Underwood * * Copyright (C) 2001 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: bell_r2_mf.h,v 1.19 2008/05/30 13:51:28 steveu Exp $ */ /*! \file */ #if !defined(_SPANDSP_BELL_R2_MF_H_) #define _SPANDSP_BELL_R2_MF_H_ /*! \page mfc_r2_tone_generation_page MFC/R2 tone generation \section mfc_r2_tone_generation_page_sec_1 What does it do? The MFC/R2 tone generation module provides for the generation of the repertoire of 15 dual tones needs for the digital MFC/R2 signalling protocol. \section mfc_r2_tone_generation_page_sec_2 How does it work? */ /*! \page bell_mf_tone_generation_page Bell MF tone generation \section bell_mf_tone_generation_page_sec_1 What does it do? The Bell MF tone generation module provides for the generation of the repertoire of 15 dual tones needs for various Bell MF signalling protocols. \section bell_mf_tone_generation_page_sec_2 How does it work? Basic Bell MF tone generation specs: - Tone on time = KP: 100+-7ms. All other signals: 68+-7ms - Tone off time (between digits) = 68+-7ms - Frequency tolerance +- 1.5% - Signal level -7+-1dBm per frequency */ /*! \page mfc_r2_tone_rx_page MFC/R2 tone receiver \section mfc_r2_tone_rx_page_sec_1 What does it do? The MFC/R2 tone receiver module provides for the detection of the repertoire of 15 dual tones needs for the digital MFC/R2 signalling protocol. It is compliant with ITU-T Q.441D. \section mfc_r2_tone_rx_page_sec_2 How does it work? Basic MFC/R2 tone detection specs: - Receiver response range: -5dBm to -35dBm - Difference in level for a pair of frequencies - Adjacent tones: <5dB - Non-adjacent tones: <7dB - Receiver not to detect a signal of 2 frequencies of level -5dB and duration <7ms. - Receiver not to recognise a signal of 2 frequencies having a difference in level >=20dB. - Max received signal frequency error: +-10Hz - The sum of the operate and release times of a 2 frequency signal not to exceed 80ms (there are no individual specs for the operate and release times). - Receiver not to release for signal interruptions <=7ms. - System malfunction due to signal interruptions >7ms (typically 20ms) is prevented by further logic elements. */ /*! \page bell_mf_tone_rx_page Bell MF tone receiver \section bell_mf_tone_rx_page_sec_1 What does it do? The Bell MF tone receiver module provides for the detection of the repertoire of 15 dual tones needs for various Bell MF signalling protocols. It is compliant with ITU-T Q.320, ITU-T Q.322, ITU-T Q.323B. \section bell_mf_tone_rx_page_sec_2 How does it work? Basic Bell MF tone detection specs: - Frequency tolerance +- 1.5% +-10Hz - Signal level -14dBm to 0dBm - Perform a "two and only two tones present" test. - Twist <= 6dB accepted - Receiver sensitive to signals above -22dBm per frequency - Test for a minimum of 55ms if KP, or 30ms of other signals. - Signals to be recognised if the two tones arrive within 8ms of each other. - Invalid signals result in the return of the re-order tone. Note: Above -3dBm the signal starts to clip. We can detect with a little clipping, but not up to 0dBm, which the above spec seems to require. There isn't a lot we can do about that. Is the spec. incorrectly worded about the dBm0 reference point, or have I misunderstood it? */ /*! The maximum number of Bell MF digits we can buffer. */ #define MAX_BELL_MF_DIGITS 128 /*! Bell MF generator state descriptor. This defines the state of a single working instance of a Bell MF generator. */ typedef struct { /*! The tone generator. */ tone_gen_state_t tones; int current_sample; union { queue_state_t queue; uint8_t buf[QUEUE_STATE_T_SIZE(MAX_BELL_MF_DIGITS)]; } queue; } bell_mf_tx_state_t; /*! Bell MF digit detector descriptor. */ typedef struct { /*! Optional callback funcion to deliver received digits. */ digits_rx_callback_t digits_callback; /*! An opaque pointer passed to the callback function. */ void *digits_callback_data; /*! Tone detector working states */ goertzel_state_t out[6]; /*! Short term history of results from the tone detection, using in persistence checking */ uint8_t hits[5]; /*! The current sample number within a processing block. */ int current_sample; /*! The number of digits which have been lost due to buffer overflows. */ int lost_digits; /*! The number of digits currently in the digit buffer. */ int current_digits; /*! The received digits buffer. This is a NULL terminated string. */ char digits[MAX_BELL_MF_DIGITS + 1]; } bell_mf_rx_state_t; /*! MFC/R2 tone detector descriptor. */ typedef struct { /*! The tone generator. */ tone_gen_state_t tone; /*! TRUE if generating forward tones, otherwise generating reverse tones. */ int fwd; /*! The current digit being generated. */ int digit; } r2_mf_tx_state_t; /*! MFC/R2 tone detector descriptor. */ typedef struct { /*! Optional callback funcion to deliver received digits. */ tone_report_func_t callback; /*! An opaque pointer passed to the callback function. */ void *callback_data; /*! TRUE is we are detecting forward tones. FALSE if we are detecting backward tones */ int fwd; /*! Tone detector working states */ goertzel_state_t out[6]; /*! The current sample number within a processing block. */ int current_sample; /*! The currently detected digit. */ int current_digit; } r2_mf_rx_state_t; #if defined(__cplusplus) extern "C" { #endif /*! \brief Generate a buffer of Bell MF tones. \param s The Bell MF generator context. \param amp The buffer for the generated signal. \param max_samples The required number of generated samples. \return The number of samples actually generated. This may be less than max_samples if the input buffer empties. */ int bell_mf_tx(bell_mf_tx_state_t *s, int16_t amp[], int max_samples); /*! \brief Put a string of digits in a Bell MF generator's input buffer. \param s The Bell MF generator context. \param digits The string of digits to be added. \param len The length of the string of digits. If negative, the string is assumed to be a NULL terminated string. \return The number of digits actually added. This may be less than the length of the digit string, if the buffer fills up. */ size_t bell_mf_tx_put(bell_mf_tx_state_t *s, const char *digits, int len); /*! \brief Initialise a Bell MF generator context. \param s The Bell MF generator context. \return A pointer to the Bell MF generator context.*/ bell_mf_tx_state_t *bell_mf_tx_init(bell_mf_tx_state_t *s); /*! \brief Free a Bell MF generator context. \param s The Bell MF generator context. \return 0 for OK, else -1. */ int bell_mf_tx_free(bell_mf_tx_state_t *s); /*! \brief Generate a block of R2 MF tones. \param s The R2 MF generator context. \param amp The buffer for the generated signal. \param samples The required number of generated samples. \return The number of samples actually generated. */ int r2_mf_tx(r2_mf_tx_state_t *s, int16_t amp[], int samples); /*! \brief Generate a block of R2 MF tones. \param s The R2 MF generator context. \param digit The digit to be generated. \return 0 for OK, or -1 for a bad request. */ int r2_mf_tx_put(r2_mf_tx_state_t *s, char digit); /*! \brief Initialise an R2 MF tone generator context. \param s The R2 MF generator context. \param fwd TRUE if the context is for forward signals. FALSE if the context is for backward signals. \return A pointer to the MFC/R2 generator context.*/ r2_mf_tx_state_t *r2_mf_tx_init(r2_mf_tx_state_t *s, int fwd); /*! \brief Free an R2 MF tone generator context. \param s The R2 MF tone generator context. \return 0 for OK, else -1. */ int r2_mf_tx_free(r2_mf_tx_state_t *s); /*! Process a block of received Bell MF audio samples. \brief Process a block of received Bell MF audio samples. \param s The Bell MF receiver context. \param amp The audio sample buffer. \param samples The number of samples in the buffer. \return The number of samples unprocessed. */ int bell_mf_rx(bell_mf_rx_state_t *s, const int16_t amp[], int samples); /*! \brief Get a string of digits from a Bell MF receiver's output buffer. \param s The Bell MF receiver context. \param buf The buffer for the received digits. \param max The maximum number of digits to be returned, \return The number of digits actually returned. */ size_t bell_mf_rx_get(bell_mf_rx_state_t *s, char *buf, int max); /*! \brief Initialise a Bell MF receiver context. \param s The Bell MF receiver context. \param callback An optional callback routine, used to report received digits. If no callback routine is set, digits may be collected, using the bell_mf_rx_get() function. \param user_data An opaque pointer which is associated with the context, and supplied in callbacks. \return A pointer to the Bell MF receiver context.*/ bell_mf_rx_state_t *bell_mf_rx_init(bell_mf_rx_state_t *s, digits_rx_callback_t callback, void *user_data); /*! \brief Free a Bell MF receiver context. \param s The Bell MF receiver context. \return 0 for OK, else -1. */ int bell_mf_rx_free(bell_mf_rx_state_t *s); /*! Process a block of received R2 MF audio samples. \brief Process a block of received R2 MF audio samples. \param s The R2 MF receiver context. \param amp The audio sample buffer. \param samples The number of samples in the buffer. \return The number of samples unprocessed. */ int r2_mf_rx(r2_mf_rx_state_t *s, const int16_t amp[], int samples); /*! \brief Get the current digit from an R2 MF receiver. \param s The R2 MF receiver context. \return The number digits being received. */ int r2_mf_rx_get(r2_mf_rx_state_t *s); /*! \brief Initialise an R2 MF receiver context. \param s The R2 MF receiver context. \param fwd TRUE if the context is for forward signals. FALSE if the context is for backward signals. \param callback An optional callback routine, used to report received digits. If no callback routine is set, digits may be collected, using the r2_mf_rx_get() function. \param user_data An opaque pointer which is associated with the context, and supplied in callbacks. \return A pointer to the R2 MF receiver context. */ r2_mf_rx_state_t *r2_mf_rx_init(r2_mf_rx_state_t *s, int fwd, tone_report_func_t callback, void *user_data); /*! \brief Free an R2 MF receiver context. \param s The R2 MF receiver context. \return 0 for OK, else -1. */ int r2_mf_rx_free(r2_mf_rx_state_t *s); #if defined(__cplusplus) } #endif #endif /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/v29tx_floating_rrc.h0000644000175000017500000000536311150047206021561 0ustar julienjulien#define TX_PULSESHAPER_GAIN 1.000000f #define TX_PULSESHAPER_COEFF_SETS 10 static const float tx_pulseshaper[TX_PULSESHAPER_COEFF_SETS][9] = { { -0.0028949651f, /* Filter 0 */ -0.0180558826f, 0.0644370007f, -0.1680546408f, 0.6136031185f, 0.6136031185f, -0.1680546408f, 0.0644370007f, -0.0180558826f }, { 0.0031457252f, /* Filter 1 */ -0.0296755127f, 0.0821537989f, -0.1948071639f, 0.7563219340f, 0.4608861696f, -0.1273859874f, 0.0418434527f, -0.0059021756f }, { 0.0095859914f, /* Filter 2 */ -0.0389394461f, 0.0918555164f, -0.2016880165f, 0.8793516522f, 0.3081344924f, -0.0792085168f, 0.0176601547f, 0.0051283313f }, { 0.0153896886f, /* Filter 3 */ -0.0441001627f, 0.0909724632f, -0.1838386257f, 0.9741012232f, 0.1647552896f, -0.0297442695f, -0.0050682351f, 0.0137350965f }, { 0.0194884074f, /* Filter 4 */ -0.0437412555f, 0.0779044290f, -0.1380831525f, 1.0338273601f, 0.0388498601f, 0.0155354866f, -0.0238603903f, 0.0191007897f }, { 0.0209425254f, /* Filter 5 */ -0.0370198705f, 0.0523524598f, -0.0633894611f, 1.0542286928f, -0.0633894611f, 0.0523524598f, -0.0370198705f, 0.0209425254f }, { 0.0191007897f, /* Filter 6 */ -0.0238603903f, 0.0155354866f, 0.0388498602f, 1.0338273601f, -0.1380831525f, 0.0779044290f, -0.0437412555f, 0.0194884074f }, { 0.0137350965f, /* Filter 7 */ -0.0050682351f, -0.0297442695f, 0.1647552896f, 0.9741012231f, -0.1838386257f, 0.0909724632f, -0.0441001627f, 0.0153896885f }, { 0.0051283313f, /* Filter 8 */ 0.0176601547f, -0.0792085168f, 0.3081344925f, 0.8793516522f, -0.2016880165f, 0.0918555164f, -0.0389394461f, 0.0095859914f }, { -0.0059021756f, /* Filter 9 */ 0.0418434528f, -0.1273859874f, 0.4608861697f, 0.7563219340f, -0.1948071639f, 0.0821537989f, -0.0296755127f, 0.0031457252f } }; iaxmodem-1.2.0/lib/spandsp/src/playout.c0000644000175000017500000002721211150047206017521 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * playout.c * * Written by Steve Underwood * * Copyright (C) 2005 Steve Underwood * * All rights reserved. * * This was kicked off from jitter buffering code * Copyright (C) 2004, Horizon Wimba, Inc. * Author Steve Kann * However, there isn't a lot of the original left, now. The original * was licenced under the LGPL, so any remaining fragments are * compatible with the GPL licence used here. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: playout.c,v 1.14 2008/05/13 13:17:23 steveu Exp $ */ #if defined(HAVE_CONFIG_H) #include #endif #include #include #include #include #include #include "spandsp/telephony.h" #include "spandsp/playout.h" static playout_frame_t *queue_get(playout_state_t *s, timestamp_t sender_stamp) { playout_frame_t *frame; if ((frame = s->first_frame) == NULL) return NULL; if (sender_stamp >= frame->sender_stamp) { /* Remove this frame from the queue */ if (frame->later) { frame->later->earlier = NULL; s->first_frame = frame->later; } else { /* The queue is now empty */ s->first_frame = NULL; s->last_frame = NULL; } return frame; } return NULL; } /*- End of function --------------------------------------------------------*/ timestamp_t playout_next_due(playout_state_t *s) { return s->last_speech_sender_stamp + s->last_speech_sender_len; } /*- End of function --------------------------------------------------------*/ timestamp_t playout_current_length(playout_state_t *s) { return s->target_buffer_length; } /*- End of function --------------------------------------------------------*/ playout_frame_t *playout_get_unconditional(playout_state_t *s) { playout_frame_t *frame; if ((frame = queue_get(s, 0x7FFFFFFF))) { /* Put it on the free list */ frame->later = s->free_frames; s->free_frames = frame; /* We return the frame pointer, even though it's on the free list. The caller *must* copy the data before this frame has any chance of being reused. */ } return frame; } /*- End of function --------------------------------------------------------*/ int playout_get(playout_state_t *s, playout_frame_t *frameout, timestamp_t now) { playout_frame_t *frame; /* Make the last_speech_sender_stamp the current expected one. */ s->last_speech_sender_stamp += s->last_speech_sender_len; if ((frame = queue_get(s, s->last_speech_sender_stamp)) == NULL) { /* The required frame was not received (or at least not in time) */ s->frames_missing++; return PLAYOUT_FILLIN; } if (s->dynamic && frame->type == PLAYOUT_TYPE_SPEECH) { /* Assess whether the buffer length is appropriate */ if (!s->not_first) { /* Prime things the first time through */ s->not_first = TRUE; s->latest_expected = frame->receiver_stamp + s->min_length; } /* Leaky integrate the rate of occurance of frames received just in time and late */ s->state_late += ((((frame->receiver_stamp > s->latest_expected) ? 0x10000000 : 0) - s->state_late) >> 8); s->state_just_in_time += ((((frame->receiver_stamp > s->latest_expected - frame->sender_len) ? 0x10000000 : 0) - s->state_just_in_time) >> 8); s->latest_expected += frame->sender_len; if (s->state_late > s->dropable_threshold) { if (s->since_last_step < 10) { if (s->target_buffer_length < s->max_length - 2) { /* The late bin is too big - increase buffering */ s->target_buffer_length += 3*frame->sender_len; s->latest_expected += 3*frame->sender_len; s->state_just_in_time = s->dropable_threshold; s->state_late = 0; s->since_last_step = 0; s->last_speech_sender_stamp -= 3*s->last_speech_sender_len; } } else { if (s->target_buffer_length < s->max_length) { /* The late bin is too big - increase buffering */ s->target_buffer_length += frame->sender_len; s->latest_expected += frame->sender_len; s->state_just_in_time = s->dropable_threshold; s->state_late = 0; s->since_last_step = 0; s->last_speech_sender_stamp -= s->last_speech_sender_len; } } } else if (s->since_last_step > 500 && s->state_just_in_time < s->dropable_threshold) { if (s->target_buffer_length > s->min_length) { /* The just-in-time bin is pretty small - decrease buffering */ s->target_buffer_length -= frame->sender_len; s->latest_expected -= frame->sender_len; s->state_just_in_time = s->dropable_threshold; s->state_late = 0; s->since_last_step = 0; s->last_speech_sender_stamp += s->last_speech_sender_len; } } s->since_last_step++; } /* If its not a speech frame, just return it. */ if (frame->type != PLAYOUT_TYPE_SPEECH) { /* Rewind last_speech_sender_stamp, since this isn't speech */ s->last_speech_sender_stamp -= s->last_speech_sender_len; *frameout = *frame; /* Put it on the free list */ frame->later = s->free_frames; s->free_frames = frame; s->frames_out++; return PLAYOUT_OK; } if (frame->sender_stamp < s->last_speech_sender_stamp) { /* This speech frame is late */ *frameout = *frame; /* Put it on the free list */ frame->later = s->free_frames; s->free_frames = frame; /* Rewind last_speech_sender_stamp, since we're just dumping */ s->last_speech_sender_stamp -= s->last_speech_sender_len; s->frames_out++; s->frames_late++; s->frames_missing--; return PLAYOUT_DROP; } /* Keep track of frame sizes, to allow for variable sized frames */ if (frame->sender_len > 0) s->last_speech_sender_len = frame->sender_len; /* Normal case. Return the frame, and increment stuff */ *frameout = *frame; /* Put it on the free list */ frame->later = s->free_frames; s->free_frames = frame; s->frames_out++; return PLAYOUT_OK; } /*- End of function --------------------------------------------------------*/ int playout_put(playout_state_t *s, void *data, int type, timestamp_t sender_len, timestamp_t sender_stamp, timestamp_t receiver_stamp) { playout_frame_t *frame; playout_frame_t *p; /* When a frame arrives we just queue it in order. We leave all the tricky stuff until frames are read from the queue. */ s->frames_in++; /* Acquire a frame */ if ((frame = s->free_frames)) { s->free_frames = frame->later; } else { if ((frame = (playout_frame_t *) malloc(sizeof(*frame))) == NULL) return PLAYOUT_ERROR; } /* Fill out the frame */ frame->data = data; frame->type = type; frame->sender_stamp = sender_stamp; frame->sender_len = sender_len; frame->receiver_stamp = receiver_stamp; /* Frames are kept in a list, sorted by the timestamp assigned by the sender. */ if (s->last_frame == NULL) { /* The queue is empty. */ frame->later = NULL; frame->earlier = NULL; s->first_frame = frame; s->last_frame = frame; } else if (sender_stamp >= s->last_frame->sender_stamp) { /* Frame goes at the end of the queue. */ frame->later = NULL; frame->earlier = s->last_frame; s->last_frame->later = frame; s->last_frame = frame; } else { /* Frame is out of sequence. */ s->frames_oos++; /* Find where it should go in the queue */ p = s->last_frame; while (sender_stamp < p->sender_stamp && p->earlier) p = p->earlier; if (p->earlier) { /* It needs to go somewhere in the queue */ frame->later = p->later; frame->earlier = p; p->later->earlier = frame; p->later = frame; } else { /* It needs to go at the very beginning of the queue */ frame->later = p; frame->earlier = NULL; p->earlier = frame; s->first_frame = frame; } } if (s->start && type == PLAYOUT_TYPE_SPEECH) { s->last_speech_sender_stamp = sender_stamp - sender_len - s->min_length; s->last_speech_sender_len = sender_len; s->start = FALSE; } return PLAYOUT_OK; } /*- End of function --------------------------------------------------------*/ void playout_restart(playout_state_t *s, int min_length, int max_length) { playout_frame_t *frame; playout_frame_t *next; /* Free all the frames on the free list */ for (frame = s->free_frames; frame; frame = next) { next = frame->later; free(frame); } memset(s, 0, sizeof(*s)); s->dynamic = (min_length < max_length); s->min_length = min_length; s->max_length = (max_length > min_length) ? max_length : min_length; s->dropable_threshold = 1*0x10000000/100; s->start = TRUE; s->since_last_step = 0x7FFFFFFF; /* Start with the minimum buffer length allowed, and work from there */ s->actual_buffer_length = s->target_buffer_length = (s->max_length - s->min_length)/2; } /*- End of function --------------------------------------------------------*/ playout_state_t *playout_new(int min_length, int max_length) { playout_state_t *s; if ((s = (playout_state_t *) malloc(sizeof(playout_state_t))) == NULL) return NULL; memset(s, 0, sizeof(*s)); playout_restart(s, min_length, max_length); return s; } /*- End of function --------------------------------------------------------*/ void playout_free(playout_state_t *s) { playout_frame_t *frame; playout_frame_t *next; /* Free all the frames in the queue. In most cases these should have been removed already, so their associated data could be freed. */ for (frame = s->first_frame; frame; frame = next) { next = frame->later; free(frame); } /* Free all the frames on the free list */ for (frame = s->free_frames; frame; frame = next) { next = frame->later; free(frame); } /* Finally, free ourselves! */ free(s); } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/bell_r2_mf.c0000644000175000017500000006176111150047206020036 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * bell_r2_mf.c - Bell MF and MFC/R2 tone generation and detection. * * Written by Steve Underwood * * Copyright (C) 2001 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: bell_r2_mf.c,v 1.29 2008/07/02 14:48:25 steveu Exp $ */ /*! \file */ #if defined(HAVE_CONFIG_H) #include "config.h" #endif #include #include #include #include #include #include "floating_fudge.h" #if defined(HAVE_TGMATH_H) #include #endif #if defined(HAVE_MATH_H) #include #endif #include "spandsp/telephony.h" #include "spandsp/queue.h" #include "spandsp/dc_restore.h" #include "spandsp/complex.h" #include "spandsp/dds.h" #include "spandsp/tone_detect.h" #include "spandsp/tone_generate.h" #include "spandsp/super_tone_rx.h" #include "spandsp/dtmf.h" #include "spandsp/bell_r2_mf.h" #if !defined(M_PI) /* C99 systems may not define M_PI */ #define M_PI 3.14159265358979323846264338327 #endif #define ms_to_samples(t) (((t)*SAMPLE_RATE)/1000) typedef struct { int f1; /* First freq */ int f2; /* Second freq */ int8_t level1; /* Level of the first freq (dB) */ int8_t level2; /* Level of the second freq (dB) */ uint8_t on_time; /* Tone on time (ms) */ uint8_t off_time; /* Minimum post tone silence (ms) */ } mf_digit_tones_t; int bell_mf_gen_inited = FALSE; tone_gen_descriptor_t bell_mf_digit_tones[15]; int r2_mf_gen_inited = FALSE; tone_gen_descriptor_t r2_mf_fwd_digit_tones[15]; tone_gen_descriptor_t r2_mf_back_digit_tones[15]; #if 0 tone_gen_descriptor_t socotel_mf_digit_tones[18]; #endif /* Bell R1 tone generation specs. * Power: -7dBm +- 1dB * Frequency: within +-1.5% * Mismatch between the start time of a pair of tones: <=6ms. * Mismatch between the end time of a pair of tones: <=6ms. * Tone duration: 68+-7ms, except KP which is 100+-7ms. * Inter-tone gap: 68+-7ms. */ static const mf_digit_tones_t bell_mf_tones[] = { { 700, 900, -7, -7, 68, 68}, { 700, 1100, -7, -7, 68, 68}, { 900, 1100, -7, -7, 68, 68}, { 700, 1300, -7, -7, 68, 68}, { 900, 1300, -7, -7, 68, 68}, {1100, 1300, -7, -7, 68, 68}, { 700, 1500, -7, -7, 68, 68}, { 900, 1500, -7, -7, 68, 68}, {1100, 1500, -7, -7, 68, 68}, {1300, 1500, -7, -7, 68, 68}, { 700, 1700, -7, -7, 68, 68}, /* ST''' - use 'C' */ { 900, 1700, -7, -7, 68, 68}, /* ST' - use 'A' */ {1100, 1700, -7, -7, 100, 68}, /* KP - use '*' */ {1300, 1700, -7, -7, 68, 68}, /* ST'' - use 'B' */ {1500, 1700, -7, -7, 68, 68}, /* ST - use '#' */ {0, 0, 0, 0, 0, 0} }; /* The order of the digits here must match the list above */ static const char bell_mf_tone_codes[] = "1234567890CA*B#"; /* R2 tone generation specs. * Power: -11.5dBm +- 1dB * Frequency: within +-4Hz * Mismatch between the start time of a pair of tones: <=1ms. * Mismatch between the end time of a pair of tones: <=1ms. */ static const mf_digit_tones_t r2_mf_fwd_tones[] = { {1380, 1500, -11, -11, 1, 0}, {1380, 1620, -11, -11, 1, 0}, {1500, 1620, -11, -11, 1, 0}, {1380, 1740, -11, -11, 1, 0}, {1500, 1740, -11, -11, 1, 0}, {1620, 1740, -11, -11, 1, 0}, {1380, 1860, -11, -11, 1, 0}, {1500, 1860, -11, -11, 1, 0}, {1620, 1860, -11, -11, 1, 0}, {1740, 1860, -11, -11, 1, 0}, {1380, 1980, -11, -11, 1, 0}, {1500, 1980, -11, -11, 1, 0}, {1620, 1980, -11, -11, 1, 0}, {1740, 1980, -11, -11, 1, 0}, {1860, 1980, -11, -11, 1, 0}, {0, 0, 0, 0, 0, 0} }; static const mf_digit_tones_t r2_mf_back_tones[] = { {1140, 1020, -11, -11, 1, 0}, {1140, 900, -11, -11, 1, 0}, {1020, 900, -11, -11, 1, 0}, {1140, 780, -11, -11, 1, 0}, {1020, 780, -11, -11, 1, 0}, { 900, 780, -11, -11, 1, 0}, {1140, 660, -11, -11, 1, 0}, {1020, 660, -11, -11, 1, 0}, { 900, 660, -11, -11, 1, 0}, { 780, 660, -11, -11, 1, 0}, {1140, 540, -11, -11, 1, 0}, {1020, 540, -11, -11, 1, 0}, { 900, 540, -11, -11, 1, 0}, { 780, 540, -11, -11, 1, 0}, { 660, 540, -11, -11, 1, 0}, {0, 0, 0, 0, 0, 0} }; /* The order of the digits here must match the lists above */ static const char r2_mf_tone_codes[] = "1234567890BCDEF"; #if 0 static const mf_digit_tones_t socotel_tones[] = { { 700, 900, -11, -11, 1, 0}, { 700, 1100, -11, -11, 1, 0}, { 900, 1100, -11, -11, 1, 0}, { 700, 1300, -11, -11, 1, 0}, { 900, 1300, -11, -11, 1, 0}, {1100, 1300, -11, -11, 1, 0}, { 700, 1500, -11, -11, 1, 0}, { 900, 1500, -11, -11, 1, 0}, {1100, 1500, -11, -11, 1, 0}, {1300, 1500, -11, -11, 1, 0}, {1500, 1700, -11, -11, 1, 0}, { 700, 1700, -11, -11, 1, 0}, { 900, 1700, -11, -11, 1, 0}, {1300, 1700, -11, -11, 1, 0}, {1100, 1700, -11, -11, 1, 0}, {1700, 0, -11, -11, 1, 0}, /* Use 'F' */ {1900, 0, -11, -11, 1, 0}, /* Use 'G' */ {0, 0, 0, 0, 0, 0} }; /* The order of the digits here must match the list above */ static char socotel_mf_tone_codes[] = "1234567890ABCDEFG"; #endif #if defined(SPANDSP_USE_FIXED_POINT) #define BELL_MF_THRESHOLD 204089 /* -30.5dBm0 */ #define BELL_MF_TWIST 3.981f /* 6dB */ #define BELL_MF_RELATIVE_PEAK 12.589f /* 11dB */ #define BELL_MF_SAMPLES_PER_BLOCK 120 #define R2_MF_THRESHOLD 62974 /* -36.5dBm0 */ #define R2_MF_TWIST 5.012f /* 7dB */ #define R2_MF_RELATIVE_PEAK 12.589f /* 11dB */ #define R2_MF_SAMPLES_PER_BLOCK 133 #else #define BELL_MF_THRESHOLD 3343803100.0f /* -30.5dBm0 [((120.0*32768.0/1.4142)*10^((-30.5 - DBM0_MAX_SINE_POWER)/20.0))^2 => 3343803100.0] */ #define BELL_MF_TWIST 3.981f /* 6dB [10^(6/10) => 3.981] */ #define BELL_MF_RELATIVE_PEAK 12.589f /* 11dB */ #define BELL_MF_SAMPLES_PER_BLOCK 120 #define R2_MF_THRESHOLD 1031766650.0f /* -36.5dBm0 [((133.0*32768.0/1.4142)*10^((-36.5 - DBM0_MAX_SINE_POWER)/20.0))^2 => 1031766650.0] */ #define R2_MF_TWIST 5.012f /* 7dB */ #define R2_MF_RELATIVE_PEAK 12.589f /* 11dB */ #define R2_MF_SAMPLES_PER_BLOCK 133 #endif static goertzel_descriptor_t bell_mf_detect_desc[6]; static goertzel_descriptor_t mf_fwd_detect_desc[6]; static goertzel_descriptor_t mf_back_detect_desc[6]; static const int bell_mf_frequencies[] = { 700, 900, 1100, 1300, 1500, 1700 }; /* Use the follow characters for the Bell MF special signals: KP - use '*' ST - use '#' ST' - use 'A' ST'' - use 'B' ST''' - use 'C' */ static const char bell_mf_positions[] = "1247C-358A--69*---0B----#"; static const int r2_mf_fwd_frequencies[] = { 1380, 1500, 1620, 1740, 1860, 1980 }; static const int r2_mf_back_frequencies[] = { 1140, 1020, 900, 780, 660, 540 }; /* Use codes '1' to 'F' for the R2 signals 1 to 15, except for signal 'A'. Use '0' for this, so the codes match the digits 0-9. */ static const char r2_mf_positions[] = "1247B-358C--69D---0E----F"; static void bell_mf_gen_init(void) { int i; const mf_digit_tones_t *tones; if (bell_mf_gen_inited) return; i = 0; tones = bell_mf_tones; while (tones->on_time) { /* Note: The duration of KP is longer than the other signals. */ make_tone_gen_descriptor(&bell_mf_digit_tones[i++], tones->f1, tones->level1, tones->f2, tones->level2, tones->on_time, tones->off_time, 0, 0, FALSE); tones++; } bell_mf_gen_inited = TRUE; } /*- End of function --------------------------------------------------------*/ int bell_mf_tx(bell_mf_tx_state_t *s, int16_t amp[], int max_samples) { int len; const char *cp; int digit; len = 0; if (s->tones.current_section >= 0) { /* Deal with the fragment left over from last time */ len = tone_gen(&(s->tones), amp, max_samples); } while (len < max_samples && (digit = queue_read_byte(&s->queue.queue)) >= 0) { /* Step to the next digit */ if ((cp = strchr(bell_mf_tone_codes, digit)) == NULL) continue; tone_gen_init(&(s->tones), &bell_mf_digit_tones[cp - bell_mf_tone_codes]); len += tone_gen(&(s->tones), amp + len, max_samples - len); } return len; } /*- End of function --------------------------------------------------------*/ size_t bell_mf_tx_put(bell_mf_tx_state_t *s, const char *digits, int len) { size_t space; /* This returns the number of characters that would not fit in the buffer. The buffer will only be loaded if the whole string of digits will fit, in which case zero is returned. */ if (len < 0) { if ((len = strlen(digits)) == 0) return 0; } if ((space = queue_free_space(&s->queue.queue)) < len) return len - space; if (queue_write(&s->queue.queue, (const uint8_t *) digits, len) >= 0) return 0; return -1; } /*- End of function --------------------------------------------------------*/ bell_mf_tx_state_t *bell_mf_tx_init(bell_mf_tx_state_t *s) { if (s == NULL) { if ((s = (bell_mf_tx_state_t *) malloc(sizeof(*s))) == NULL) return NULL; } memset(s, 0, sizeof(*s)); if (!bell_mf_gen_inited) bell_mf_gen_init(); tone_gen_init(&(s->tones), &bell_mf_digit_tones[0]); s->current_sample = 0; queue_init(&s->queue.queue, MAX_BELL_MF_DIGITS, QUEUE_READ_ATOMIC | QUEUE_WRITE_ATOMIC); s->tones.current_section = -1; return s; } /*- End of function --------------------------------------------------------*/ int bell_mf_tx_free(bell_mf_tx_state_t *s) { free(s); return 0; } /*- End of function --------------------------------------------------------*/ int r2_mf_tx(r2_mf_tx_state_t *s, int16_t amp[], int samples) { int len; if (s->digit == 0) { len = samples; memset(amp, 0, len*sizeof(int16_t)); } else { len = tone_gen(&s->tone, amp, samples); } return len; } /*- End of function --------------------------------------------------------*/ int r2_mf_tx_put(r2_mf_tx_state_t *s, char digit) { char *cp; if (digit && (cp = strchr(r2_mf_tone_codes, digit))) { if (s->fwd) tone_gen_init(&s->tone, &r2_mf_fwd_digit_tones[cp - r2_mf_tone_codes]); else tone_gen_init(&s->tone, &r2_mf_back_digit_tones[cp - r2_mf_tone_codes]); s->digit = digit; } else { s->digit = 0; } return 0; } /*- End of function --------------------------------------------------------*/ r2_mf_tx_state_t *r2_mf_tx_init(r2_mf_tx_state_t *s, int fwd) { int i; const mf_digit_tones_t *tones; if (s == NULL) { if ((s = (r2_mf_tx_state_t *) malloc(sizeof(*s))) == NULL) return NULL; } memset(s, 0, sizeof(*s)); if (!r2_mf_gen_inited) { i = 0; tones = r2_mf_fwd_tones; while (tones->on_time) { make_tone_gen_descriptor(&r2_mf_fwd_digit_tones[i++], tones->f1, tones->level1, tones->f2, tones->level2, tones->on_time, tones->off_time, 0, 0, (tones->off_time == 0)); tones++; } i = 0; tones = r2_mf_back_tones; while (tones->on_time) { make_tone_gen_descriptor(&r2_mf_back_digit_tones[i++], tones->f1, tones->level1, tones->f2, tones->level2, tones->on_time, tones->off_time, 0, 0, (tones->off_time == 0)); tones++; } r2_mf_gen_inited = TRUE; } s->fwd = fwd; return s; } /*- End of function --------------------------------------------------------*/ int r2_mf_tx_free(r2_mf_tx_state_t *s) { free(s); return 0; } /*- End of function --------------------------------------------------------*/ int bell_mf_rx(bell_mf_rx_state_t *s, const int16_t amp[], int samples) { #if defined(SPANDSP_USE_FIXED_POINT) int32_t energy[6]; int16_t xamp; #else float energy[6]; float xamp; #endif int i; int j; int sample; int best; int second_best; int limit; uint8_t hit; hit = 0; for (sample = 0; sample < samples; sample = limit) { if ((samples - sample) >= (BELL_MF_SAMPLES_PER_BLOCK - s->current_sample)) limit = sample + (BELL_MF_SAMPLES_PER_BLOCK - s->current_sample); else limit = samples; for (j = sample; j < limit; j++) { xamp = goertzel_preadjust_amp(amp[j]); goertzel_samplex(&s->out[0], xamp); goertzel_samplex(&s->out[1], xamp); goertzel_samplex(&s->out[2], xamp); goertzel_samplex(&s->out[3], xamp); goertzel_samplex(&s->out[4], xamp); goertzel_samplex(&s->out[5], xamp); } s->current_sample += (limit - sample); if (s->current_sample < BELL_MF_SAMPLES_PER_BLOCK) continue; /* We are at the end of an MF detection block */ /* Find the two highest energies. The spec says to look for two tones and two tones only. Taking this literally -ie only two tones pass the minimum threshold - doesn't work well. The sinc function mess, due to rectangular windowing ensure that! Find the two highest energies and ensure they are considerably stronger than any of the others. */ energy[0] = goertzel_result(&s->out[0]); energy[1] = goertzel_result(&s->out[1]); if (energy[0] > energy[1]) { best = 0; second_best = 1; } else { best = 1; second_best = 0; } for (i = 2; i < 6; i++) { energy[i] = goertzel_result(&s->out[i]); if (energy[i] >= energy[best]) { second_best = best; best = i; } else if (energy[i] >= energy[second_best]) { second_best = i; } } /* Basic signal level and twist tests */ hit = 0; if (energy[best] >= BELL_MF_THRESHOLD && energy[second_best] >= BELL_MF_THRESHOLD && energy[best] < energy[second_best]*BELL_MF_TWIST && energy[best]*BELL_MF_TWIST > energy[second_best]) { /* Relative peak test */ hit = 'X'; for (i = 0; i < 6; i++) { if (i != best && i != second_best) { if (energy[i]*BELL_MF_RELATIVE_PEAK >= energy[second_best]) { /* The best two are not clearly the best */ hit = 0; break; } } } } if (hit) { /* Get the values into ascending order */ if (second_best < best) { i = best; best = second_best; second_best = i; } best = best*5 + second_best - 1; hit = bell_mf_positions[best]; /* Look for two successive similar results */ /* The logic in the next test is: For KP we need 4 successive identical clean detects, with two blocks of something different preceeding it. For anything else we need two successive identical clean detects, with two blocks of something different preceeding it. */ if (hit == s->hits[4] && hit == s->hits[3] && ((hit != '*' && hit != s->hits[2] && hit != s->hits[1]) || (hit == '*' && hit == s->hits[2] && hit != s->hits[1] && hit != s->hits[0]))) { if (s->current_digits < MAX_BELL_MF_DIGITS) { s->digits[s->current_digits++] = (char) hit; s->digits[s->current_digits] = '\0'; if (s->digits_callback) { s->digits_callback(s->digits_callback_data, s->digits, s->current_digits); s->current_digits = 0; } } else { s->lost_digits++; } } } s->hits[0] = s->hits[1]; s->hits[1] = s->hits[2]; s->hits[2] = s->hits[3]; s->hits[3] = s->hits[4]; s->hits[4] = hit; s->current_sample = 0; } if (s->current_digits && s->digits_callback) { s->digits_callback(s->digits_callback_data, s->digits, s->current_digits); s->digits[0] = '\0'; s->current_digits = 0; } return 0; } /*- End of function --------------------------------------------------------*/ size_t bell_mf_rx_get(bell_mf_rx_state_t *s, char *buf, int max) { if (max > s->current_digits) max = s->current_digits; if (max > 0) { memcpy(buf, s->digits, max); memmove(s->digits, s->digits + max, s->current_digits - max); s->current_digits -= max; } buf[max] = '\0'; return max; } /*- End of function --------------------------------------------------------*/ bell_mf_rx_state_t *bell_mf_rx_init(bell_mf_rx_state_t *s, digits_rx_callback_t callback, void *user_data) { int i; static int initialised = FALSE; if (s == NULL) { if ((s = (bell_mf_rx_state_t *) malloc(sizeof(*s))) == NULL) return NULL; } memset(s, 0, sizeof(*s)); if (!initialised) { for (i = 0; i < 6; i++) make_goertzel_descriptor(&bell_mf_detect_desc[i], bell_mf_frequencies[i], BELL_MF_SAMPLES_PER_BLOCK); initialised = TRUE; } s->digits_callback = callback; s->digits_callback_data = user_data; s->hits[0] = s->hits[1] = s->hits[2] = s->hits[3] = s->hits[4] = 0; for (i = 0; i < 6; i++) goertzel_init(&s->out[i], &bell_mf_detect_desc[i]); s->current_sample = 0; s->lost_digits = 0; s->current_digits = 0; s->digits[0] = '\0'; return s; } /*- End of function --------------------------------------------------------*/ int bell_mf_rx_free(bell_mf_rx_state_t *s) { free(s); return 0; } /*- End of function --------------------------------------------------------*/ int r2_mf_rx(r2_mf_rx_state_t *s, const int16_t amp[], int samples) { #if defined(SPANDSP_USE_FIXED_POINT) int32_t energy[6]; int16_t xamp; #else float energy[6]; float xamp; #endif int i; int j; int sample; int best; int second_best; int hit; int hit_digit; int limit; hit = 0; hit_digit = 0; for (sample = 0; sample < samples; sample = limit) { if ((samples - sample) >= (R2_MF_SAMPLES_PER_BLOCK - s->current_sample)) limit = sample + (R2_MF_SAMPLES_PER_BLOCK - s->current_sample); else limit = samples; for (j = sample; j < limit; j++) { xamp = goertzel_preadjust_amp(amp[j]); goertzel_samplex(&s->out[0], xamp); goertzel_samplex(&s->out[1], xamp); goertzel_samplex(&s->out[2], xamp); goertzel_samplex(&s->out[3], xamp); goertzel_samplex(&s->out[4], xamp); goertzel_samplex(&s->out[5], xamp); } s->current_sample += (limit - sample); if (s->current_sample < R2_MF_SAMPLES_PER_BLOCK) continue; /* We are at the end of an MF detection block */ /* Find the two highest energies */ energy[0] = goertzel_result(&s->out[0]); energy[1] = goertzel_result(&s->out[1]); if (energy[0] > energy[1]) { best = 0; second_best = 1; } else { best = 1; second_best = 0; } for (i = 2; i < 6; i++) { energy[i] = goertzel_result(&s->out[i]); if (energy[i] >= energy[best]) { second_best = best; best = i; } else if (energy[i] >= energy[second_best]) { second_best = i; } } /* Basic signal level and twist tests */ hit = FALSE; if (energy[best] >= R2_MF_THRESHOLD && energy[second_best] >= R2_MF_THRESHOLD && energy[best] < energy[second_best]*R2_MF_TWIST && energy[best]*R2_MF_TWIST > energy[second_best]) { /* Relative peak test */ hit = TRUE; for (i = 0; i < 6; i++) { if (i != best && i != second_best) { if (energy[i]*R2_MF_RELATIVE_PEAK >= energy[second_best]) { /* The best two are not clearly the best */ hit = FALSE; break; } } } } if (hit) { /* Get the values into ascending order */ if (second_best < best) { i = best; best = second_best; second_best = i; } best = best*5 + second_best - 1; hit_digit = r2_mf_positions[best]; } else { hit_digit = 0; } if (s->current_digit != hit_digit && s->callback) { i = (hit_digit) ? -99 : -10; s->callback(s->callback_data, hit_digit, i, 0); } s->current_digit = hit_digit; s->current_sample = 0; } return 0; } /*- End of function --------------------------------------------------------*/ int r2_mf_rx_get(r2_mf_rx_state_t *s) { return s->current_digit; } /*- End of function --------------------------------------------------------*/ r2_mf_rx_state_t *r2_mf_rx_init(r2_mf_rx_state_t *s, int fwd, tone_report_func_t callback, void *user_data) { int i; static int initialised = FALSE; if (s == NULL) { if ((s = (r2_mf_rx_state_t *) malloc(sizeof(*s))) == NULL) return NULL; } memset(s, 0, sizeof(*s)); s->fwd = fwd; if (!initialised) { for (i = 0; i < 6; i++) { make_goertzel_descriptor(&mf_fwd_detect_desc[i], r2_mf_fwd_frequencies[i], R2_MF_SAMPLES_PER_BLOCK); make_goertzel_descriptor(&mf_back_detect_desc[i], r2_mf_back_frequencies[i], R2_MF_SAMPLES_PER_BLOCK); } initialised = TRUE; } if (fwd) { for (i = 0; i < 6; i++) goertzel_init(&s->out[i], &mf_fwd_detect_desc[i]); } else { for (i = 0; i < 6; i++) goertzel_init(&s->out[i], &mf_back_detect_desc[i]); } s->callback = callback; s->callback_data = user_data; s->current_digit = 0; s->current_sample = 0; return s; } /*- End of function --------------------------------------------------------*/ int r2_mf_rx_free(r2_mf_rx_state_t *s) { free(s); return 0; } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/tone_detect.c0000644000175000017500000002063711150047206020325 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * tone_detect.c - General telephony tone detection. * * Written by Steve Underwood * * Copyright (C) 2001-2003, 2005 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: tone_detect.c,v 1.47 2008/07/02 14:48:26 steveu Exp $ */ /*! \file tone_detect.h */ #if defined(HAVE_CONFIG_H) #include "config.h" #endif #include #include #include "floating_fudge.h" #if defined(HAVE_TGMATH_H) #include #endif #if defined(HAVE_MATH_H) #include #endif #include #include #include #include #include "spandsp/telephony.h" #include "spandsp/complex.h" #include "spandsp/complex_vector_float.h" #include "spandsp/tone_detect.h" #include "spandsp/tone_generate.h" #if !defined(M_PI) /* C99 systems may not define M_PI */ #define M_PI 3.14159265358979323846264338327 #endif void make_goertzel_descriptor(goertzel_descriptor_t *t, float freq, int samples) { #if defined(SPANDSP_USE_FIXED_POINT) t->fac = 16383.0f*2.0f*cosf(2.0f*M_PI*(freq/(float) SAMPLE_RATE)); #else t->fac = 2.0f*cosf(2.0f*M_PI*(freq/(float) SAMPLE_RATE)); #endif t->samples = samples; } /*- End of function --------------------------------------------------------*/ goertzel_state_t *goertzel_init(goertzel_state_t *s, goertzel_descriptor_t *t) { if (s == NULL) { if ((s = (goertzel_state_t *) malloc(sizeof(*s))) == NULL) return NULL; } #if defined(SPANDSP_USE_FIXED_POINT) s->v2 = s->v3 = 0; #else s->v2 = s->v3 = 0.0f; #endif s->fac = t->fac; s->samples = t->samples; s->current_sample = 0; return s; } /*- End of function --------------------------------------------------------*/ void goertzel_reset(goertzel_state_t *s) { #if defined(SPANDSP_USE_FIXED_POINT) s->v2 = s->v3 = 0; #else s->v2 = s->v3 = 0.0f; #endif s->current_sample = 0; } /*- End of function --------------------------------------------------------*/ int goertzel_update(goertzel_state_t *s, const int16_t amp[], int samples) { int i; #if defined(SPANDSP_USE_FIXED_POINT) int16_t x; int16_t v1; #else float v1; #endif if (samples > s->samples - s->current_sample) samples = s->samples - s->current_sample; for (i = 0; i < samples; i++) { v1 = s->v2; s->v2 = s->v3; #if defined(SPANDSP_USE_FIXED_POINT) x = (((int32_t) s->fac*s->v2) >> 14); /* Scale down the input signal to avoid overflows. 9 bits is enough to monitor the signals of interest with adequate dynamic range and resolution. In telephony we generally only start with 13 or 14 bits, anyway. */ s->v3 = x - v1 + (amp[i] >> 7); #else s->v3 = s->fac*s->v2 - v1 + amp[i]; #endif } s->current_sample += samples; return samples; } /*- End of function --------------------------------------------------------*/ #if defined(SPANDSP_USE_FIXED_POINT) int32_t goertzel_result(goertzel_state_t *s) #else float goertzel_result(goertzel_state_t *s) #endif { #if defined(SPANDSP_USE_FIXED_POINT) int16_t v1; int32_t x; int32_t y; #else float v1; #endif /* Push a zero through the process to finish things off. */ v1 = s->v2; s->v2 = s->v3; #if defined(SPANDSP_USE_FIXED_POINT) x = (((int32_t) s->fac*s->v2) >> 14); s->v3 = x - v1; #else s->v3 = s->fac*s->v2 - v1; #endif /* Now calculate the non-recursive side of the filter. */ /* The result here is not scaled down to allow for the magnification effect of the filter (the usual DFT magnification effect). */ #if defined(SPANDSP_USE_FIXED_POINT) x = (int32_t) s->v3*s->v3; y = (int32_t) s->v2*s->v2; x += y; y = ((int32_t) s->v3*s->fac) >> 14; y *= s->v2; x -= y; x <<= 1; goertzel_reset(s); /* The number returned in a floating point build will be 16384^2 times as big as for a fixed point build, due to the 14 bit shifts (or the square of the 7 bit shifts, depending how you look at it). */ return x; #else v1 = s->v3*s->v3 + s->v2*s->v2 - s->v2*s->v3*s->fac; v1 *= 2.0; goertzel_reset(s); return v1; #endif } /*- End of function --------------------------------------------------------*/ complexf_t periodogram(const complexf_t coeffs[], const complexf_t amp[], int len) { complexf_t sum; complexf_t diff; complexf_t x; int i; x = complex_setf(0.0f, 0.0f); for (i = 0; i < len/2; i++) { sum = complex_addf(&[i], &[len - 1 - i]); diff = complex_subf(&[i], &[len - 1 - i]); x.re += (coeffs[i].re*sum.re - coeffs[i].im*diff.im); x.im += (coeffs[i].re*sum.im + coeffs[i].im*diff.re); } return x; } /*- End of function --------------------------------------------------------*/ int periodogram_prepare(complexf_t sum[], complexf_t diff[], const complexf_t amp[], int len) { int i; for (i = 0; i < len/2; i++) { sum[i] = complex_addf(&[i], &[len - 1 - i]); diff[i] = complex_subf(&[i], &[len - 1 - i]); } return len/2; } /*- End of function --------------------------------------------------------*/ complexf_t periodogram_apply(const complexf_t coeffs[], const complexf_t sum[], const complexf_t diff[], int len) { complexf_t x; int i; x = complex_setf(0.0f, 0.0f); for (i = 0; i < len/2; i++) { x.re += (coeffs[i].re*sum[i].re - coeffs[i].im*diff[i].im); x.im += (coeffs[i].re*sum[i].im + coeffs[i].im*diff[i].re); } return x; } /*- End of function --------------------------------------------------------*/ int periodogram_generate_coeffs(complexf_t coeffs[], float freq, int sample_rate, int window_len) { float window; float sum; float x; int i; sum = 0.0f; for (i = 0; i < window_len/2; i++) { /* Apply a Hamming window as we go */ window = 0.53836f - 0.46164f*cosf(2.0f*3.1415926535f*i/(window_len - 1.0f)); x = (i - window_len/2.0f + 0.5f)*freq*2.0f*3.1415926535f/sample_rate; coeffs[i].re = cosf(x)*window; coeffs[i].im = -sinf(x)*window; sum += window; } /* Rescale for unity gain in the periodogram. The 2.0 factor is to allow for the full window, rather than just the half over which we have summed the coefficients. */ sum = 1.0f/(2.0f*sum); for (i = 0; i < window_len/2; i++) { coeffs[i].re *= sum; coeffs[i].im *= sum; } return window_len/2; } /*- End of function --------------------------------------------------------*/ float periodogram_generate_phase_offset(complexf_t *offset, float freq, int sample_rate, int interval) { float x; /* The phase offset is how far the phase rotates in one frame */ x = 2.0f*3.1415926535f*(float) interval/(float) sample_rate; offset->re = cosf(freq*x); offset->im = sinf(freq*x); return 1.0f/x; } /*- End of function --------------------------------------------------------*/ float periodogram_freq_error(const complexf_t *phase_offset, float scale, const complexf_t *last_result, const complexf_t *result) { complexf_t prediction; /* Rotate the last result by the expected phasor offset to the current result. Then find the difference between that predicted position, and the actual one. When scaled by the current signal level, this gives us the frequency error. */ prediction = complex_mulf(last_result, phase_offset); return scale*(result->im*prediction.re - result->re*prediction.im)/(result->re*result->re + result->im*result->im); } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/gsm0610_short_term.c0000644000175000017500000002473411150047206021375 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * gsm0610_short_term.c - GSM 06.10 full rate speech codec. * * Written by Steve Underwood * * Copyright (C) 2006 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * This code is based on the widely used GSM 06.10 code available from * http://kbs.cs.tu-berlin.de/~jutta/toast.html * * $Id: gsm0610_short_term.c,v 1.15 2008/07/02 14:48:25 steveu Exp $ */ /*! \file */ #if defined(HAVE_CONFIG_H) #include #endif #include #include #include "floating_fudge.h" #if defined(HAVE_TGMATH_H) #include #endif #if defined(HAVE_MATH_H) #include #endif #include #include "spandsp/telephony.h" #include "spandsp/bitstream.h" #include "spandsp/dc_restore.h" #include "spandsp/gsm0610.h" #include "gsm0610_local.h" /* SHORT TERM ANALYSIS FILTERING SECTION */ /* 4.2.8 */ static void decode_log_area_ratios(int16_t LARc[8], int16_t *LARpp) { int16_t temp1; /* This procedure requires for efficient implementation two tables. INVA[1..8] = integer((32768*8)/real_A[1..8]) MIC[1..8] = minimum value of the LARc[1..8] */ /* Compute the LARpp[1..8] */ #undef STEP #define STEP(B,MIC,INVA) \ temp1 = gsm_add(*LARc++, MIC) << 10; \ temp1 = gsm_sub(temp1, B << 1); \ temp1 = gsm_mult_r (INVA, temp1); \ *LARpp++ = gsm_add(temp1, temp1); STEP( 0, -32, 13107); STEP( 0, -32, 13107); STEP( 2048, -16, 13107); STEP(-2560, -16, 13107); STEP( 94, -8, 19223); STEP(-1792, -8, 17476); STEP( -341, -4, 31454); STEP(-1144, -4, 29708); /* NOTE: the addition of *MIC is used to restore the sign of *LARc. */ } /*- End of function --------------------------------------------------------*/ /* 4.2.9 */ /* Computation of the quantized reflection coefficients */ /* 4.2.9.1 Interpolation of the LARpp[1..8] to get the LARp[1..8] */ /* Within each frame of 160 analyzed speech samples the short term analysis and synthesis filters operate with four different sets of coefficients, derived from the previous set of decoded LARs(LARpp(j - 1)) and the actual set of decoded LARs (LARpp(j)) (Initial value: LARpp(j - 1)[1..8] = 0.) */ static void coefficients_0_12(int16_t *LARpp_j_1, int16_t *LARpp_j, int16_t *LARp) { int i; for (i = 1; i <= 8; i++, LARp++, LARpp_j_1++, LARpp_j++) { *LARp = gsm_add(*LARpp_j_1 >> 2, *LARpp_j >> 2); *LARp = gsm_add(*LARp, *LARpp_j_1 >> 1); } /*endfor*/ } /*- End of function --------------------------------------------------------*/ static void coefficients_13_26(int16_t *LARpp_j_1, int16_t *LARpp_j, int16_t *LARp) { int i; for (i = 1; i <= 8; i++, LARpp_j_1++, LARpp_j++, LARp++) *LARp = gsm_add(*LARpp_j_1 >> 1, *LARpp_j >> 1); /*endfor*/ } /*- End of function --------------------------------------------------------*/ static void coefficients_27_39(int16_t *LARpp_j_1, int16_t *LARpp_j, int16_t *LARp) { int i; for (i = 1; i <= 8; i++, LARpp_j_1++, LARpp_j++, LARp++) { *LARp = gsm_add(*LARpp_j_1 >> 2, *LARpp_j >> 2); *LARp = gsm_add(*LARp, *LARpp_j >> 1); } /*endfor*/ } /*- End of function --------------------------------------------------------*/ static void coefficients_40_159(int16_t *LARpp_j, int16_t *LARp) { int i; for (i = 1; i <= 8; i++) *LARp++ = *LARpp_j++; /*endfor*/ } /*- End of function --------------------------------------------------------*/ /* 4.2.9.2 */ static void larp_to_rp(int16_t LARp[8]) { int i; int16_t *LARpx; int16_t temp; /* The input to this procedure is the interpolated LARp[0..7] array. The reflection coefficients, rp[i], are used in the analysis filter and in the synthesis filter. */ LARpx = LARp; for (i = 1; i <= 8; i++, LARpx++) { temp = *LARpx; if (temp < 0) { if (temp == INT16_MIN) temp = INT16_MAX; else temp = -temp; /*endif*/ if (temp < 11059) temp <<= 1; else if (temp < 20070) temp += 11059; else temp = gsm_add(temp >> 2, 26112); /*endif*/ *LARpx = -temp; } else { if (temp < 11059) temp <<= 1; else if (temp < 20070) temp += 11059; else temp = gsm_add(temp >> 2, 26112); /*endif*/ *LARpx = temp; } /*endif*/ } /*endfor*/ } /*- End of function --------------------------------------------------------*/ /* 4.2.10 */ static void short_term_analysis_filtering(gsm0610_state_t *s, int16_t rp[8], int k_n, // k_end - k_start int16_t amp[]) // [0..n-1] IN/OUT { /* This procedure computes the short term residual signal d[..] to be fed to the RPE-LTP loop from the s[..] signal and from the local rp[..] array (quantized reflection coefficients). As the call of this procedure can be done in many ways (see the interpolation of the LAR coefficient), it is assumed that the computation begins with index k_start (for arrays d[..] and s[..]) and stops with index k_end (k_start and k_end are defined in 4.2.9.1). This procedure also needs to keep the array u[0..7] in memory for each call. */ int16_t *u0; int16_t *u_top; int i; int16_t *u; int16_t *rpx; int32_t di; int32_t u_out; u0 = s->u; u_top = u0 + 8; for (i = 0; i < k_n; i++) { di = u_out = amp[i]; for (rpx = rp, u = u0; u < u_top; ) { int32_t ui; int32_t rpi; ui = *u; *u++ = (int16_t) u_out; rpi = *rpx++; u_out = ui + (((rpi*di) + 0x4000) >> 15); di = di + (((rpi*ui) + 0x4000) >> 15); u_out = saturate(u_out); di = saturate(di); } /*endfor*/ amp[i] = (int16_t) di; } /*endfor*/ } /*- End of function --------------------------------------------------------*/ static void short_term_synthesis_filtering(gsm0610_state_t *s, int16_t rrp[8], int k, // k_end - k_start int16_t *wt, // [0..k - 1] int16_t *sr) // [0..k - 1] { int16_t *v; int i; int16_t sri; int16_t tmp1; int16_t tmp2; v = s->v; while (k--) { sri = *wt++; for (i = 8; i--; ) { tmp1 = rrp[i]; tmp2 = v[i]; tmp2 = ((tmp1 == INT16_MIN && tmp2 == INT16_MIN) ? INT16_MAX : (int16_t) (((int32_t) tmp1*(int32_t) tmp2 + 16384) >> 15) & 0xFFFF); sri = gsm_sub(sri, tmp2); tmp1 = ((tmp1 == INT16_MIN && sri == INT16_MIN) ? INT16_MAX : (int16_t) (((int32_t) tmp1*(int32_t) sri + 16384) >> 15) & 0xFFFF); v[i + 1] = gsm_add(v[i], tmp1); } /*endfor*/ *sr++ = v[0] = sri; } /*endwhile*/ } /*- End of function --------------------------------------------------------*/ void gsm0610_short_term_analysis_filter(gsm0610_state_t *s, int16_t LARc[8], int16_t amp[GSM0610_FRAME_LEN]) { int16_t *LARpp_j; int16_t *LARpp_j_1; int16_t LARp[8]; LARpp_j = s->LARpp[s->j]; LARpp_j_1 = s->LARpp[s->j ^= 1]; decode_log_area_ratios(LARc, LARpp_j); coefficients_0_12(LARpp_j_1, LARpp_j, LARp); larp_to_rp(LARp); short_term_analysis_filtering(s, LARp, 13, amp); coefficients_13_26(LARpp_j_1, LARpp_j, LARp); larp_to_rp(LARp); short_term_analysis_filtering(s, LARp, 14, amp + 13); coefficients_27_39(LARpp_j_1, LARpp_j, LARp); larp_to_rp(LARp); short_term_analysis_filtering(s, LARp, 13, amp + 27); coefficients_40_159(LARpp_j, LARp); larp_to_rp(LARp); short_term_analysis_filtering(s, LARp, 120, amp + 40); } /*- End of function --------------------------------------------------------*/ void gsm0610_short_term_synthesis_filter(gsm0610_state_t *s, int16_t LARcr[8], int16_t wt[GSM0610_FRAME_LEN], int16_t amp[GSM0610_FRAME_LEN]) { int16_t *LARpp_j; int16_t *LARpp_j_1; int16_t LARp[8]; LARpp_j = s->LARpp[s->j]; LARpp_j_1 = s->LARpp[s->j ^= 1]; decode_log_area_ratios(LARcr, LARpp_j); coefficients_0_12(LARpp_j_1, LARpp_j, LARp); larp_to_rp(LARp); short_term_synthesis_filtering(s, LARp, 13, wt, amp); coefficients_13_26(LARpp_j_1, LARpp_j, LARp); larp_to_rp(LARp); short_term_synthesis_filtering(s, LARp, 14, wt + 13, amp + 13); coefficients_27_39(LARpp_j_1, LARpp_j, LARp); larp_to_rp(LARp); short_term_synthesis_filtering(s, LARp, 13, wt + 27, amp + 27); coefficients_40_159(LARpp_j, LARp); larp_to_rp(LARp); short_term_synthesis_filtering(s, LARp, 120, wt + 40, amp + 40); } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/v27ter_tx_4800_floating_rrc.h0000644000175000017500000000273111150047206023100 0ustar julienjulien#define TX_PULSESHAPER_4800_GAIN 1.000000f #define TX_PULSESHAPER_4800_COEFF_SETS 5 static const float tx_pulseshaper_4800[TX_PULSESHAPER_4800_COEFF_SETS][9] = { { 0.0020271599f, /* Filter 0 */ 0.0151309301f, -0.0054150603f, -0.1159724004f, 0.7564986175f, 0.4025541225f, -0.0341116438f, -0.0195424323f, 0.0049156270f }, { -0.0057440210f, /* Filter 1 */ 0.0153306246f, 0.0229274754f, -0.1619857959f, 1.0359919667f, 0.0880056950f, 0.0268484406f, -0.0134684459f, -0.0061664697f }, { -0.0101543455f, /* Filter 2 */ 0.0030462995f, 0.0426482259f, -0.1066205465f, 1.1421607333f, -0.1066205466f, 0.0426482259f, 0.0030462995f, -0.0101543455f }, { -0.0061664697f, /* Filter 3 */ -0.0134684458f, 0.0268484406f, 0.0880056950f, 1.0359919667f, -0.1619857959f, 0.0229274754f, 0.0153306246f, -0.0057440210f }, { 0.0049156270f, /* Filter 4 */ -0.0195424323f, -0.0341116438f, 0.4025541225f, 0.7564986174f, -0.1159724004f, -0.0054150603f, 0.0151309301f, 0.0020271599f } }; iaxmodem-1.2.0/lib/spandsp/src/v27ter_rx_2400_fixed_rrc.h0000644000175000017500000002404711150047206022370 0ustar julienjulien#define RX_PULSESHAPER_2400_GAIN 32767.000000f #define RX_PULSESHAPER_2400_COEFF_SETS 12 static const complexi16_t rx_pulseshaper_2400[RX_PULSESHAPER_2400_COEFF_SETS][27] = { { { 0, 0}, /* Filter 0 */ { -58, 179}, { -42, -6}, { 0, 217}, { -518, 82}, { -233, -719}, { 686, -349}, { 261, 359}, { 195, -195}, { 1096, 796}, { -1202, 2359}, { -3745, -1216}, { 778, -4918}, { 5561, 0}, { 869, 5492}, { -4735, 1538}, { -1787, -3508}, { 2142, -1556}, { 958, 958}, { -162, 223}, { 396, 201}, { -238, 732}, { -747, -118}, { 0, -524}, { 215, -34}, { -13, -41}, { 167, -85} }, { { 0, 0}, /* Filter 1 */ { -56, 172}, { -25, -4}, { 0, 242}, { -542, 85}, { -237, -730}, { 675, -344}, { 235, 323}, { 250, -250}, { 1178, 856}, { -1252, 2458}, { -3839, -1247}, { 789, -4985}, { 5584, 0}, { 865, 5466}, { -4667, 1516}, { -1741, -3418}, { 2052, -1491}, { 886, 886}, { -118, 163}, { 433, 221}, { -241, 742}, { -734, -116}, { 0, -500}, { 190, -30}, { -18, -57}, { 173, -88} }, { { 0, 0}, /* Filter 2 */ { -53, 165}, { -6, -1}, { 0, 268}, { -565, 89}, { -240, -739}, { 661, -337}, { 207, 285}, { 307, -307}, { 1262, 917}, { -1302, 2556}, { -3932, -1277}, { 799, -5050}, { 5603, 0}, { 860, 5435}, { -4596, 1493}, { -1695, -3326}, { 1962, -1426}, { 816, 816}, { -76, 104}, { 468, 238}, { -243, 750}, { -720, -114}, { 0, -475}, { 166, -26}, { -23, -72}, { 177, -90} }, { { 0, 0}, /* Filter 3 */ { -50, 156}, { 12, 1}, { 0, 294}, { -587, 93}, { -242, -747}, { 645, -328}, { 177, 244}, { 365, -365}, { 1347, 978}, { -1353, 2655}, { -4023, -1307}, { 809, -5111}, { 5618, 0}, { 855, 5400}, { -4522, 1469}, { -1647, -3233}, { 1873, -1361}, { 748, 748}, { -35, 48}, { 501, 255}, { -245, 756}, { -704, -111}, { 0, -449}, { 142, -22}, { -28, -87}, { 181, -92} }, { { 0, 0}, /* Filter 4 */ { -47, 147}, { 32, 5}, { 0, 320}, { -609, 96}, { -244, -753}, { 627, -319}, { 146, 201}, { 425, -425}, { 1433, 1041}, { -1403, 2753}, { -4112, -1336}, { 818, -5168}, { 5628, 0}, { 849, 5361}, { -4445, 1444}, { -1599, -3139}, { 1784, -1296}, { 680, 680}, { 4, -6}, { 531, 270}, { -246, 759}, { -687, -108}, { 0, -423}, { 119, -18}, { -32, -101}, { 184, -94} }, { { 0, 0}, /* Filter 5 */ { -44, 137}, { 53, 8}, { 0, 346}, { -630, 99}, { -246, -757}, { 607, -309}, { 113, 155}, { 486, -486}, { 1519, 1104}, { -1452, 2851}, { -4199, -1364}, { 827, -5222}, { 5634, 0}, { 842, 5318}, { -4366, 1418}, { -1551, -3044}, { 1695, -1231}, { 614, 614}, { 42, -58}, { 559, 284}, { -247, 760}, { -669, -106}, { 0, -398}, { 96, -15}, { -37, -114}, { 187, -95} }, { { 0, 0}, /* Filter 6 */ { -40, 126}, { 74, 11}, { 0, 372}, { -650, 103}, { -247, -760}, { 584, -297}, { 78, 108}, { 550, -550}, { 1607, 1167}, { -1502, 2948}, { -4284, -1391}, { 835, -5272}, { 5637, 0}, { 835, 5272}, { -4284, 1391}, { -1502, -2948}, { 1607, -1167}, { 550, 550}, { 78, -108}, { 584, 297}, { -247, 760}, { -650, -103}, { 0, -372}, { 74, -11}, { -40, -126}, { 188, -96} }, { { 0, 0}, /* Filter 7 */ { -37, 114}, { 96, 15}, { 0, 398}, { -669, 106}, { -247, -760}, { 559, -284}, { 42, 58}, { 614, -614}, { 1695, 1231}, { -1551, 3044}, { -4366, -1418}, { 842, -5318}, { 5634, 0}, { 827, 5222}, { -4199, 1364}, { -1452, -2851}, { 1519, -1104}, { 486, 486}, { 113, -155}, { 607, 309}, { -246, 757}, { -630, -99}, { 0, -346}, { 53, -8}, { -44, -137}, { 189, -96} }, { { 0, 0}, /* Filter 8 */ { -32, 101}, { 119, 18}, { 0, 423}, { -687, 108}, { -246, -759}, { 531, -270}, { 4, 6}, { 680, -680}, { 1784, 1296}, { -1599, 3139}, { -4445, -1444}, { 849, -5361}, { 5628, 0}, { 818, 5168}, { -4112, 1336}, { -1403, -2753}, { 1433, -1041}, { 425, 425}, { 146, -201}, { 627, 319}, { -244, 753}, { -609, -96}, { 0, -320}, { 32, -5}, { -47, -147}, { 189, -96} }, { { 0, 0}, /* Filter 9 */ { -28, 87}, { 142, 22}, { 0, 449}, { -704, 111}, { -245, -756}, { 501, -255}, { -35, -48}, { 748, -748}, { 1873, 1361}, { -1647, 3233}, { -4522, -1469}, { 855, -5400}, { 5618, 0}, { 809, 5111}, { -4023, 1307}, { -1353, -2655}, { 1347, -978}, { 365, 365}, { 177, -244}, { 645, 328}, { -242, 747}, { -587, -93}, { 0, -294}, { 12, -1}, { -50, -156}, { 188, -96} }, { { 0, 0}, /* Filter 10 */ { -23, 72}, { 166, 26}, { 0, 475}, { -720, 114}, { -243, -750}, { 468, -238}, { -76, -104}, { 816, -816}, { 1962, 1426}, { -1695, 3326}, { -4596, -1493}, { 860, -5435}, { 5603, 0}, { 799, 5050}, { -3932, 1277}, { -1302, -2556}, { 1262, -917}, { 307, 307}, { 207, -285}, { 661, 337}, { -240, 739}, { -565, -89}, { 0, -268}, { -6, 1}, { -53, -165}, { 187, -95} }, { { 0, 0}, /* Filter 11 */ { -18, 57}, { 190, 30}, { 0, 500}, { -734, 116}, { -241, -742}, { 433, -221}, { -118, -163}, { 886, -886}, { 2052, 1491}, { -1741, 3418}, { -4667, -1516}, { 865, -5466}, { 5584, 0}, { 789, 4985}, { -3839, 1247}, { -1252, -2458}, { 1178, -856}, { 250, 250}, { 235, -323}, { 675, 344}, { -237, 730}, { -542, -85}, { 0, -242}, { -25, 4}, { -56, -172}, { 185, -94} } }; iaxmodem-1.2.0/lib/spandsp/src/v42bis.c0000644000175000017500000006264611150047206017147 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * v42bis.c * * Written by Steve Underwood * * Copyright (C) 2005 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: v42bis.c,v 1.32 2008/05/13 13:17:25 steveu Exp $ */ /* THIS IS A WORK IN PROGRESS. IT IS NOT FINISHED. Currently it performs the core compression and decompression functions OK. However, a number of the bells and whistles in V.42bis are incomplete. */ /*! \file */ #if defined(HAVE_CONFIG_H) #include #endif #include #include #include #include #include #include #include #include #include "spandsp/telephony.h" #include "spandsp/logging.h" #include "spandsp/bit_operations.h" #include "spandsp/v42bis.h" /* Fixed parameters from the spec. */ #define V42BIS_N3 8 /* Character size (bits) */ #define V42BIS_N4 256 /* Number of characters in the alphabet */ #define V42BIS_N5 (V42BIS_N4 + V42BIS_N6) /* Index number of first dictionary entry used to store a string */ #define V42BIS_N6 3 /* Number of control codewords */ /* Control code words in compressed mode */ enum { V42BIS_ETM = 0, /* Enter transparent mode */ V42BIS_FLUSH = 1, /* Flush data */ V42BIS_STEPUP = 2 /* Step up codeword size */ }; /* Command codes in transparent mode */ enum { V42BIS_ECM = 0, /* Enter compression mode */ V42BIS_EID = 1, /* Escape character in data */ V42BIS_RESET = 2 /* Force reinitialisation */ }; static __inline__ void push_compressed_raw_octet(v42bis_compress_state_t *ss, int octet) { ss->output_buf[ss->output_octet_count++] = (uint8_t) octet; if (ss->output_octet_count >= ss->max_len) { ss->handler(ss->user_data, ss->output_buf, ss->output_octet_count); ss->output_octet_count = 0; } } /*- End of function --------------------------------------------------------*/ static __inline__ void push_compressed_code(v42bis_compress_state_t *ss, int code) { ss->output_bit_buffer |= code << (32 - ss->v42bis_parm_c2 - ss->output_bit_count); ss->output_bit_count += ss->v42bis_parm_c2; while (ss->output_bit_count >= 8) { push_compressed_raw_octet(ss, ss->output_bit_buffer >> 24); ss->output_bit_buffer <<= 8; ss->output_bit_count -= 8; } } /*- End of function --------------------------------------------------------*/ static __inline__ void push_compressed_octet(v42bis_compress_state_t *ss, int code) { ss->output_bit_buffer |= code << (32 - 8 - ss->output_bit_count); ss->output_bit_count += 8; while (ss->output_bit_count >= 8) { push_compressed_raw_octet(ss, ss->output_bit_buffer >> 24); ss->output_bit_buffer <<= 8; ss->output_bit_count -= 8; } } /*- End of function --------------------------------------------------------*/ int v42bis_compress(v42bis_state_t *s, const uint8_t *buf, int len) { int ptr; int i; uint32_t octet; uint32_t code; v42bis_compress_state_t *ss; ss = &s->compress; if ((s->v42bis_parm_p0 & 2) == 0) { /* Compression is off - just push the incoming data out */ for (i = 0; i < len - ss->max_len; i += ss->max_len) ss->handler(ss->user_data, buf + i, ss->max_len); if (i < len) ss->handler(ss->user_data, buf + i, len - i); return 0; } ptr = 0; if (ss->first && len > 0) { octet = buf[ptr++]; ss->string_code = octet + V42BIS_N6; if (ss->transparent) push_compressed_octet(ss, octet); ss->first = FALSE; } while (ptr < len) { octet = buf[ptr++]; if ((ss->dict[ss->string_code].children[octet >> 5] & (1 << (octet & 0x1F)))) { /* The leaf exists. Now find it in the table. */ /* TODO: This is a brute force scan for a match. We need something better. */ for (code = 0; code < ss->v42bis_parm_c3; code++) { if (ss->dict[code].parent_code == ss->string_code && ss->dict[code].node_octet == octet) break; } } else { /* The leaf does not exist. */ code = s->v42bis_parm_n2; } /* 6.3(b) If the string matches a dictionary entry, and the entry is not that entry created by the last invocation of the string matching procedure, then the next character shall be read and appended to the string and this step repeated. */ if (code < ss->v42bis_parm_c3 && code != ss->latest_code) { /* The string was found */ ss->string_code = code; ss->string_length++; } else { /* The string is not in the table. */ if (!ss->transparent) { /* 7.4 Encoding - we now have the longest matchable string, and will need to output the code for it. */ while (ss->v42bis_parm_c1 >= ss->v42bis_parm_c3 && ss->v42bis_parm_c3 <= s->v42bis_parm_n2) { /* We need to increase the codeword size */ /* 7.4(a) */ push_compressed_code(ss, V42BIS_STEPUP); /* 7.4(b) */ ss->v42bis_parm_c2++; /* 7.4(c) */ ss->v42bis_parm_c3 <<= 1; /* 7.4(d) this might need to be repeated, so we loop */ } /* 7.5 Transfer - output the last state of the string */ push_compressed_code(ss, ss->string_code); } /* 7.6 Dictionary updating */ /* 6.4 Add the string to the dictionary */ /* 6.4(b) The string is not in the table. */ if (code != ss->latest_code && ss->string_length < s->v42bis_parm_n7) { ss->latest_code = ss->v42bis_parm_c1; /* 6.4(a) The length of the string is in range for adding to the dictionary */ /* If the last code was a leaf, it no longer is */ ss->dict[ss->string_code].leaves++; ss->dict[ss->string_code].children[octet >> 5] |= (1 << (octet & 0x1F)); /* The new one is definitely a leaf */ ss->dict[ss->v42bis_parm_c1].parent_code = (uint16_t) ss->string_code; ss->dict[ss->v42bis_parm_c1].leaves = 0; ss->dict[ss->v42bis_parm_c1].node_octet = (uint8_t) octet; /* 7.7 Node recovery */ /* 6.5 Recovering a dictionary entry to use next */ for (;;) { /* 6.5(a) and (b) */ if ((int) (++ss->v42bis_parm_c1) >= s->v42bis_parm_n2) ss->v42bis_parm_c1 = V42BIS_N5; /* 6.5(c) We need to reuse a leaf node */ if (ss->dict[ss->v42bis_parm_c1].leaves) continue; if (ss->dict[ss->v42bis_parm_c1].parent_code == 0xFFFF) break; /* 6.5(d) Detach the leaf node from its parent, and re-use it */ /* Possibly make the parent a leaf node again */ ss->dict[ss->dict[ss->v42bis_parm_c1].parent_code].leaves--; ss->dict[ss->dict[ss->v42bis_parm_c1].parent_code].children[ss->dict[ss->v42bis_parm_c1].node_octet >> 5] &= ~(1 << (ss->dict[ss->v42bis_parm_c1].node_octet & 0x1F)); ss->dict[ss->v42bis_parm_c1].parent_code = 0xFFFF; break; } } else { ss->latest_code = 0xFFFFFFFF; } /* 7.8 Data compressibility test */ /* Filter on the balance of what went into the compressor, and what came out */ ss->compressibility_filter += ((((8*ss->string_length - ss->v42bis_parm_c2) << 20) - ss->compressibility_filter) >> 10); if (ss->compression_mode == V42BIS_COMPRESSION_MODE_DYNAMIC) { /* Work out if it is appropriate to change between transparent and compressed mode. */ if (ss->transparent) { if (ss->compressibility_filter > 0) { if (++ss->compressibility_persistence > 1000) { /* Schedule a switch to compressed mode */ ss->change_transparency = -1; ss->compressibility_persistence = 0; } } else { ss->compressibility_persistence = 0; } } else { if (ss->compressibility_filter < 0) { if (++ss->compressibility_persistence > 1000) { /* Schedule a switch to transparent mode */ ss->change_transparency = 1; ss->compressibility_persistence = 0; } } else { ss->compressibility_persistence = 0; } } } if (ss->change_transparency) { if (ss->change_transparency < 0) { if (ss->transparent) { printf("Going compressed\n"); /* 7.8.1 Transition to compressed mode */ /* Switch out of transparent now, between codes. We need to send the octet which did not match, just before switching. */ if (octet == ss->escape_code) { push_compressed_octet(ss, ss->escape_code++); push_compressed_octet(ss, V42BIS_EID); } else { push_compressed_octet(ss, octet); } push_compressed_octet(ss, ss->escape_code++); push_compressed_octet(ss, V42BIS_ECM); ss->transparent = FALSE; } } else { if (!ss->transparent) { printf("Going transparent\n"); /* 7.8.2 Transition to transparent mode */ /* Switch into transparent now, between codes, and the unmatched octet should go out in transparent mode, just below */ push_compressed_code(ss, V42BIS_ETM); ss->transparent = TRUE; } } ss->change_transparency = 0; } /* 7.8.3 Reset function - TODO */ ss->string_code = octet + V42BIS_N6; ss->string_length = 1; } if (ss->transparent) { if (octet == ss->escape_code) { push_compressed_octet(ss, ss->escape_code++); push_compressed_octet(ss, V42BIS_EID); } else { push_compressed_octet(ss, octet); } } } return 0; } /*- End of function --------------------------------------------------------*/ int v42bis_compress_flush(v42bis_state_t *s) { v42bis_compress_state_t *ss; ss = &s->compress; if (!ss->transparent) { /* Output the last state of the string */ push_compressed_code(ss, ss->string_code); /* TODO: We use a positive FLUSH at all times. It is really needed, if the previous step resulted in no leftover bits. */ push_compressed_code(ss, V42BIS_FLUSH); } while (ss->output_bit_count > 0) { push_compressed_raw_octet(ss, ss->output_bit_buffer >> 24); ss->output_bit_buffer <<= 8; ss->output_bit_count -= 8; } /* Now push out anything remaining. */ if (ss->output_octet_count > 0) { ss->handler(ss->user_data, ss->output_buf, ss->output_octet_count); ss->output_octet_count = 0; } return 0; } /*- End of function --------------------------------------------------------*/ #if 0 int v42bis_compress_dump(v42bis_state_t *s) { int i; for (i = 0; i < V42BIS_MAX_CODEWORDS; i++) { if (s->compress.dict[i].parent_code != 0xFFFF) { printf("Entry %4x, prior %4x, leaves %d, octet %2x\n", i, s->compress.dict[i].parent_code, s->compress.dict[i].leaves, s->compress.dict[i].node_octet); } } return 0; } /*- End of function --------------------------------------------------------*/ #endif int v42bis_decompress(v42bis_state_t *s, const uint8_t *buf, int len) { int ptr; int i; int this_length; uint8_t *string; uint32_t code; uint32_t new_code; int code_len; v42bis_decompress_state_t *ss; uint8_t decode_buf[V42BIS_MAX_STRING_SIZE]; ss = &s->decompress; if ((s->v42bis_parm_p0 & 1) == 0) { /* Compression is off - just push the incoming data out */ for (i = 0; i < len - ss->max_len; i += ss->max_len) ss->handler(ss->user_data, buf + i, ss->max_len); if (i < len) ss->handler(ss->user_data, buf + i, len - i); return 0; } ptr = 0; code_len = (ss->transparent) ? 8 : ss->v42bis_parm_c2; for (;;) { /* Fill up the bit buffer. */ while (ss->input_bit_count < 32 - 8 && ptr < len) { ss->input_bit_count += 8; ss->input_bit_buffer |= (uint32_t) buf[ptr++] << (32 - ss->input_bit_count); } if (ss->input_bit_count < code_len) break; new_code = ss->input_bit_buffer >> (32 - code_len); ss->input_bit_count -= code_len; ss->input_bit_buffer <<= code_len; if (ss->transparent) { code = new_code; if (ss->escaped) { ss->escaped = FALSE; if (code == V42BIS_ECM) { printf("Hit V42BIS_ECM\n"); ss->transparent = FALSE; code_len = ss->v42bis_parm_c2; } else if (code == V42BIS_EID) { printf("Hit V42BIS_EID\n"); ss->output_buf[ss->output_octet_count++] = ss->escape_code - 1; if (ss->output_octet_count >= ss->max_len - s->v42bis_parm_n7) { ss->handler(ss->user_data, ss->output_buf, ss->output_octet_count); ss->output_octet_count = 0; } } else if (code == V42BIS_RESET) { printf("Hit V42BIS_RESET\n"); } else { printf("Hit V42BIS_???? - %" PRIu32 "\n", code); } } else if (code == ss->escape_code) { ss->escape_code++; ss->escaped = TRUE; } else { ss->output_buf[ss->output_octet_count++] = (uint8_t) code; if (ss->output_octet_count >= ss->max_len - s->v42bis_parm_n7) { ss->handler(ss->user_data, ss->output_buf, ss->output_octet_count); ss->output_octet_count = 0; } } } else { if (new_code < V42BIS_N6) { /* We have a control code. */ switch (new_code) { case V42BIS_ETM: printf("Hit V42BIS_ETM\n"); ss->transparent = TRUE; code_len = 8; break; case V42BIS_FLUSH: printf("Hit V42BIS_FLUSH\n"); v42bis_decompress_flush(s); break; case V42BIS_STEPUP: /* We need to increase the codeword size */ printf("Hit V42BIS_STEPUP\n"); if (ss->v42bis_parm_c3 >= s->v42bis_parm_n2) { /* Invalid condition */ return -1; } code_len = ++ss->v42bis_parm_c2; ss->v42bis_parm_c3 <<= 1; break; } continue; } if (ss->first) { ss->first = FALSE; ss->octet = new_code - V42BIS_N6; ss->output_buf[0] = (uint8_t) ss->octet; ss->output_octet_count = 1; if (ss->output_octet_count >= ss->max_len - s->v42bis_parm_n7) { ss->handler(ss->user_data, ss->output_buf, ss->output_octet_count); ss->output_octet_count = 0; } ss->old_code = new_code; continue; } /* Start at the end of the buffer, and decode backwards */ string = &decode_buf[V42BIS_MAX_STRING_SIZE - 1]; /* Check the received code is valid. It can't be too big, as we pulled only the expected number of bits from the input stream. It could, however, be unknown. */ if (ss->dict[new_code].parent_code == 0xFFFF) return -1; /* Otherwise we do a straight decode of the new code. */ code = new_code; /* Trace back through the octets which form the string, and output them. */ while (code >= V42BIS_N5) { if (code > 4095) {printf("Code is 0x%" PRIu32 "\n", code); exit(2);} *string-- = ss->dict[code].node_octet; code = ss->dict[code].parent_code; } *string = (uint8_t) (code - V42BIS_N6); ss->octet = code - V42BIS_N6; /* Output the decoded string. */ this_length = V42BIS_MAX_STRING_SIZE - (int) (string - decode_buf); memcpy(ss->output_buf + ss->output_octet_count, string, this_length); ss->output_octet_count += this_length; if (ss->output_octet_count >= ss->max_len - s->v42bis_parm_n7) { ss->handler(ss->user_data, ss->output_buf, ss->output_octet_count); ss->output_octet_count = 0; } /* 6.4 Add the string to the dictionary */ if (ss->last_length < s->v42bis_parm_n7) { /* 6.4(a) The string does not exceed N7 in length */ if (ss->last_old_code != ss->old_code || ss->last_extra_octet != *string) { /* 6.4(b) The string is not in the table. */ ss->dict[ss->old_code].leaves++; /* The new one is definitely a leaf */ ss->dict[ss->v42bis_parm_c1].parent_code = (uint16_t) ss->old_code; ss->dict[ss->v42bis_parm_c1].leaves = 0; ss->dict[ss->v42bis_parm_c1].node_octet = (uint8_t) ss->octet; /* 6.5 Recovering a dictionary entry to use next */ for (;;) { /* 6.5(a) and (b) */ if (++ss->v42bis_parm_c1 >= s->v42bis_parm_n2) ss->v42bis_parm_c1 = V42BIS_N5; /* 6.5(c) We need to reuse a leaf node */ if (ss->dict[ss->v42bis_parm_c1].leaves) continue; /* 6.5(d) This is a leaf node, so re-use it */ /* Possibly make the parent a leaf node again */ if (ss->dict[ss->v42bis_parm_c1].parent_code != 0xFFFF) ss->dict[ss->dict[ss->v42bis_parm_c1].parent_code].leaves--; ss->dict[ss->v42bis_parm_c1].parent_code = 0xFFFF; break; } } } /* Record the addition to the dictionary, so we can check for repeat attempts at the next code - see II.4.3 */ ss->last_old_code = ss->old_code; ss->last_extra_octet = *string; ss->old_code = new_code; ss->last_length = this_length; } } return 0; } /*- End of function --------------------------------------------------------*/ int v42bis_decompress_flush(v42bis_state_t *s) { v42bis_decompress_state_t *ss; ss = &s->decompress; /* Push out anything remaining. */ if (ss->output_octet_count > 0) { ss->handler(ss->user_data, ss->output_buf, ss->output_octet_count); ss->output_octet_count = 0; } return 0; } /*- End of function --------------------------------------------------------*/ #if 0 int v42bis_decompress_dump(v42bis_state_t *s) { int i; for (i = 0; i < V42BIS_MAX_CODEWORDS; i++) { if (s->decompress.dict[i].parent_code != 0xFFFF) { printf("Entry %4x, prior %4x, leaves %d, octet %2x\n", i, s->decompress.dict[i].parent_code, s->decompress.dict[i].leaves, s->decompress.dict[i].node_octet); } } return 0; } /*- End of function --------------------------------------------------------*/ #endif void v42bis_compression_control(v42bis_state_t *s, int mode) { s->compress.compression_mode = mode; switch (mode) { case V42BIS_COMPRESSION_MODE_ALWAYS: s->compress.change_transparency = -1; break; case V42BIS_COMPRESSION_MODE_NEVER: s->compress.change_transparency = 1; break; } } /*- End of function --------------------------------------------------------*/ v42bis_state_t *v42bis_init(v42bis_state_t *s, int negotiated_p0, int negotiated_p1, int negotiated_p2, v42bis_frame_handler_t frame_handler, void *frame_user_data, int max_frame_len, v42bis_data_handler_t data_handler, void *data_user_data, int max_data_len) { int i; if (negotiated_p1 < 512 || negotiated_p1 > 65535) return NULL; if (negotiated_p2 < 6 || negotiated_p2 > V42BIS_MAX_STRING_SIZE) return NULL; if (s == NULL) { if ((s = (v42bis_state_t *) malloc(sizeof(*s))) == NULL) return NULL; } memset(s, 0, sizeof(*s)); s->compress.handler = frame_handler; s->compress.user_data = frame_user_data; s->compress.max_len = (max_frame_len < 1024) ? max_frame_len : 1024; s->decompress.handler = data_handler; s->decompress.user_data = data_user_data; s->decompress.max_len = (max_data_len < 1024) ? max_data_len : 1024; s->v42bis_parm_p0 = negotiated_p0; /* default is both ways off */ s->v42bis_parm_n1 = top_bit(negotiated_p1 - 1) + 1; s->v42bis_parm_n2 = negotiated_p1; s->v42bis_parm_n7 = negotiated_p2; /* 6.5 */ s->compress.v42bis_parm_c1 = s->decompress.v42bis_parm_c1 = V42BIS_N5; s->compress.v42bis_parm_c2 = s->decompress.v42bis_parm_c2 = V42BIS_N3 + 1; s->compress.v42bis_parm_c3 = s->decompress.v42bis_parm_c3 = 2*V42BIS_N4; s->compress.first = s->decompress.first = TRUE; for (i = 0; i < V42BIS_MAX_CODEWORDS; i++) { s->compress.dict[i].parent_code = s->decompress.dict[i].parent_code = 0xFFFF; s->compress.dict[i].leaves = s->decompress.dict[i].leaves = 0; } /* Point the root nodes for decompression to themselves. It doesn't matter much what they are set to, as long as they are considered "known" codes. */ for (i = 0; i < V42BIS_N5; i++) s->decompress.dict[i].parent_code = (uint16_t) i; s->compress.string_code = 0xFFFFFFFF; s->compress.latest_code = 0xFFFFFFFF; s->decompress.last_old_code = 0xFFFFFFFF; s->decompress.last_extra_octet = -1; s->compress.compression_mode = V42BIS_COMPRESSION_MODE_DYNAMIC; return s; } /*- End of function --------------------------------------------------------*/ int v42bis_release(v42bis_state_t *s) { free(s); return 0; } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/bit_operations.c0000644000175000017500000001317611150047206021051 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * bit_operations.c - Various bit level operations, such as bit reversal * * Written by Steve Underwood * * Copyright (C) 2006 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: bit_operations.c,v 1.15 2008/06/28 01:13:08 steveu Exp $ */ /*! \file */ #if defined(HAVE_CONFIG_H) #include "config.h" #endif #include #include #include #include #include #include #include "spandsp/telephony.h" #include "spandsp/bit_operations.h" uint16_t bit_reverse16(uint16_t x) { x = (x >> 8) | (x << 8); x = ((x & 0xF0F0) >> 4) | ((x & 0x0F0F) << 4); x = ((x & 0xCCCC) >> 2) | ((x & 0x3333) << 2); return ((x & 0xAAAA) >> 1) | ((x & 0x5555) << 1); } /*- End of function --------------------------------------------------------*/ uint32_t bit_reverse32(uint32_t x) { x = (x >> 16) | (x << 16); x = ((x & 0xFF00FF00) >> 8) | ((x & 0x00FF00FF) << 8); x = ((x & 0xF0F0F0F0) >> 4) | ((x & 0x0F0F0F0F) << 4); x = ((x & 0xCCCCCCCC) >> 2) | ((x & 0x33333333) << 2); return ((x & 0xAAAAAAAA) >> 1) | ((x & 0x55555555) << 1); } /*- End of function --------------------------------------------------------*/ uint32_t bit_reverse_4bytes(uint32_t x) { x = ((x & 0xF0F0F0F0) >> 4) | ((x & 0x0F0F0F0F) << 4); x = ((x & 0xCCCCCCCC) >> 2) | ((x & 0x33333333) << 2); return ((x & 0xAAAAAAAA) >> 1) | ((x & 0x55555555) << 1); } /*- End of function --------------------------------------------------------*/ #if defined(__x86_64__) uint64_t bit_reverse_8bytes(uint64_t x) { x = ((x & 0xF0F0F0F0F0F0F0F0LLU) >> 4) | ((x & 0x0F0F0F0F0F0F0F0FLLU) << 4); x = ((x & 0xCCCCCCCCCCCCCCCCLLU) >> 2) | ((x & 0x3333333333333333LLU) << 2); return ((x & 0xAAAAAAAAAAAAAAAALLU) >> 1) | ((x & 0x5555555555555555LLU) << 1); } /*- End of function --------------------------------------------------------*/ #endif void bit_reverse(uint8_t to[], const uint8_t from[], int len) { #if defined(SPANDSP_MISALIGNED_ACCESS_FAILS) int i; #else const uint8_t *y1; uint8_t *z1; const uint32_t *y4; uint32_t *z4; uint32_t x4; #if defined(__x86_64__) const uint64_t *y8; uint64_t *z8; uint64_t x8; #endif #endif #if defined(SPANDSP_MISALIGNED_ACCESS_FAILS) /* This code works byte by byte, so it works on machines where misalignment is either desperately slow (its a bit slow on practically any machine, but some machines make it desparately slow) or fails. */ for (i = 0; i < len; i++) to[i] = bit_reverse8(from[i]); #else /* This code is this is based on the woolly assumption that the start of the buffers is memory aligned. If it isn't, the routine will be less efficient on some machines, but might not work at all on others. */ #if defined(__x86_64__) y8 = (const uint64_t *) from; z8 = (uint64_t *) to; while (len >= sizeof(uint64_t)) { x8 = *y8++; x8 = ((x8 & 0xF0F0F0F0F0F0F0F0LLU) >> 4) | ((x8 & 0x0F0F0F0F0F0F0F0FLLU) << 4); x8 = ((x8 & 0xCCCCCCCCCCCCCCCCLLU) >> 2) | ((x8 & 0x3333333333333333LLU) << 2); *z8++ = ((x8 & 0xAAAAAAAAAAAAAAAALLU) >> 1) | ((x8 & 0x5555555555555555LLU) << 1); len -= sizeof(uint64_t); } y4 = (const uint32_t *) y8; z4 = (uint32_t *) z8; #else y4 = (const uint32_t *) from; z4 = (uint32_t *) to; #endif while (len >= sizeof(uint32_t)) { x4 = *y4++; x4 = ((x4 & 0xF0F0F0F0) >> 4) | ((x4 & 0x0F0F0F0F) << 4); x4 = ((x4 & 0xCCCCCCCC) >> 2) | ((x4 & 0x33333333) << 2); *z4++ = ((x4 & 0xAAAAAAAA) >> 1) | ((x4 & 0x55555555) << 1); len -= sizeof(uint32_t); } y1 = (const uint8_t *) y4; z1 = (uint8_t *) z4; while (len-- > 0) *z1++ = bit_reverse8(*y1++); #endif } /*- End of function --------------------------------------------------------*/ int one_bits32(uint32_t x) { x = x - ((x >> 1) & 0x55555555); /* We now have 16 2-bit counts */ x = (x & 0x33333333) + ((x >> 2) & 0x33333333); /* We now have 8 4-bit counts */ x = (x + (x >> 4)) & 0x0F0F0F0F; /* We now have 4 8-bit counts */ #if defined(__i386__) || defined(__x86_64__) || defined(__ppc__) || defined(__powerpc__) /* If multiply is fast */ return (x*0x01010101) >> 24; #else /* If multiply is slow */ x += (x >> 8); x += (x >> 16); return (x & 0x0000003F); #endif } /*- End of function --------------------------------------------------------*/ uint32_t make_mask32(uint32_t x) { x |= (x >> 1); x |= (x >> 2); x |= (x >> 4); x |= (x >> 8); x |= (x >> 16); return x; } /*- End of function --------------------------------------------------------*/ uint16_t make_mask16(uint16_t x) { x |= (x >> 1); x |= (x >> 2); x |= (x >> 4); x |= (x >> 8); return x; } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/oki_adpcm.c0000644000175000017500000002252611150047212017752 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * oki_adpcm.c - Conversion routines between linear 16 bit PCM data and * OKI (Dialogic) ADPCM format. Supports with the 32kbps * and 24kbps variants used by Dialogic. * * Written by Steve Underwood * * Copyright (C) 2001, 2004 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * The actual OKI ADPCM encode and decode method is derived from freely * available code, whose exact origins seem uncertain. * * $Id: oki_adpcm.c,v 1.27 2008/05/13 13:17:23 steveu Exp $ */ /*! \file */ #if defined(HAVE_CONFIG_H) #include #endif #include #include #include #include "spandsp/telephony.h" #include "spandsp/oki_adpcm.h" /* Routines to convert 12 bit linear samples to the Oki ADPCM coding format, widely used in CTI, because Dialogic use it. */ static const int16_t step_size[49] = { 16, 17, 19, 21, 23, 25, 28, 31, 34, 37, 41, 45, 50, 55, 60, 66, 73, 80, 88, 97, 107, 118, 130, 143, 157, 173, 190, 209, 230, 253, 279, 307, 337, 371, 408, 449, 494, 544, 598, 658, 724, 796, 876, 963, 1060, 1166, 1282, 1408, 1552 }; static const int16_t step_adjustment[8] = { -1, -1, -1, -1, 2, 4, 6, 8 }; /* Band limiting filter, to allow sample rate conversion to and from 6k samples/second. */ static const float cutoff_coeffs[] = { -3.648392e-4f, 5.062391e-4f, 1.206247e-3f, 1.804452e-3f, 1.691750e-3f, 4.083405e-4f, -1.931085e-3f, -4.452107e-3f, -5.794821e-3f, -4.778489e-3f, -1.161266e-3f, 3.928504e-3f, 8.259786e-3f, 9.500425e-3f, 6.512800e-3f, 2.227856e-4f, -6.531275e-3f, -1.026843e-2f, -8.718062e-3f, -2.280487e-3f, 5.817733e-3f, 1.096777e-2f, 9.634404e-3f, 1.569301e-3f, -9.522632e-3f, -1.748273e-2f, -1.684408e-2f, -6.100054e-3f, 1.071206e-2f, 2.525209e-2f, 2.871779e-2f, 1.664411e-2f, -7.706268e-3f, -3.331083e-2f, -4.521249e-2f, -3.085962e-2f, 1.373653e-2f, 8.089593e-2f, 1.529060e-1f, 2.080487e-1f, 2.286834e-1f, 2.080487e-1f, 1.529060e-1f, 8.089593e-2f, 1.373653e-2f, -3.085962e-2f, -4.521249e-2f, -3.331083e-2f, -7.706268e-3f, 1.664411e-2f, 2.871779e-2f, 2.525209e-2f, 1.071206e-2f, -6.100054e-3f, -1.684408e-2f, -1.748273e-2f, -9.522632e-3f, 1.569301e-3f, 9.634404e-3f, 1.096777e-2f, 5.817733e-3f, -2.280487e-3f, -8.718062e-3f, -1.026843e-2f, -6.531275e-3f, 2.227856e-4f, 6.512800e-3f, 9.500425e-3f, 8.259786e-3f, 3.928504e-3f, -1.161266e-3f, -4.778489e-3f, -5.794821e-3f, -4.452107e-3f, -1.931085e-3f, 4.083405e-4f, 1.691750e-3f, 1.804452e-3f, 1.206247e-3f, 5.062391e-4f, -3.648392e-4f }; static int16_t decode(oki_adpcm_state_t *s, uint8_t adpcm) { int16_t e; int16_t ss; int16_t linear; /* Doing the next part as follows: * * x = adpcm & 0x07; * e = (step_size[s->step_index]*(x + x + 1)) >> 3; * * Seems an obvious improvement on a modern machine, but remember * the truncation errors do not come out the same. It would * not, therefore, be an exact match for what this code is doing. * * Just what a Dialogic card does, I do not know! */ ss = step_size[s->step_index]; e = ss >> 3; if (adpcm & 0x01) e += (ss >> 2); /*endif*/ if (adpcm & 0x02) e += (ss >> 1); /*endif*/ if (adpcm & 0x04) e += ss; /*endif*/ if (adpcm & 0x08) e = -e; /*endif*/ linear = s->last + e; /* Saturate the values to +/- 2^11 (supposed to be 12 bits) */ if (linear > 2047) linear = 2047; else if (linear < -2048) linear = -2048; /*endif*/ s->last = linear; s->step_index += step_adjustment[adpcm & 0x07]; if (s->step_index < 0) s->step_index = 0; else if (s->step_index > 48) s->step_index = 48; /*endif*/ /* Note: the result here is a 12 bit value */ return linear; } /*- End of function --------------------------------------------------------*/ static uint8_t encode(oki_adpcm_state_t *s, int16_t linear) { int16_t e; int16_t ss; uint8_t adpcm; ss = step_size[s->step_index]; e = (linear >> 4) - s->last; adpcm = (uint8_t) 0x00; if (e < 0) { adpcm = (uint8_t) 0x08; e = -e; } /*endif*/ if (e >= ss) { adpcm |= (uint8_t) 0x04; e -= ss; } /*endif*/ if (e >= (ss >> 1)) { adpcm |= (uint8_t) 0x02; e -= ss; } /*endif*/ if (e >= (ss >> 2)) adpcm |= (uint8_t) 0x01; /*endif*/ /* Use the decoder to set the estimate of the last sample. */ /* It also will adjust the step_index for us. */ s->last = decode(s, adpcm); return adpcm; } /*- End of function --------------------------------------------------------*/ oki_adpcm_state_t *oki_adpcm_init(oki_adpcm_state_t *s, int bit_rate) { if (bit_rate != 32000 && bit_rate != 24000) return NULL; if (s == NULL) { if ((s = (oki_adpcm_state_t *) malloc(sizeof(*s))) == NULL) return NULL; } memset(s, 0, sizeof(*s)); s->bit_rate = bit_rate; return s; } /*- End of function --------------------------------------------------------*/ int oki_adpcm_release(oki_adpcm_state_t *s) { free(s); return 0; } /*- End of function --------------------------------------------------------*/ int oki_adpcm_decode(oki_adpcm_state_t *s, int16_t amp[], const uint8_t oki_data[], int oki_bytes) { int i; int x; int l; int n; int samples; float z; #if (_MSC_VER >= 1400) __analysis_assume(s->phase >= 0 && s->phase <= 4); #endif samples = 0; if (s->bit_rate == 32000) { for (i = 0; i < oki_bytes; i++) { amp[samples++] = decode(s, (oki_data[i] >> 4) & 0xF) << 4; amp[samples++] = decode(s, oki_data[i] & 0xF) << 4; } /*endwhile*/ } else { n = 0; for (i = 0; i < oki_bytes; ) { /* 6k to 8k sample/second conversion */ if (s->phase) { s->history[s->ptr++] = decode(s, (n++ & 1) ? (oki_data[i++] & 0xF) : ((oki_data[i] >> 4) & 0xF)) << 4; s->ptr &= (32 - 1); } /*endif*/ z = 0.0f; for (l = 80 - 3 + s->phase, x = s->ptr - 1; l >= 0; l -= 4, x--) z += cutoff_coeffs[l]*s->history[x & (32 - 1)]; amp[samples++] = (int16_t) (z*4.0f); if (++s->phase > 3) s->phase = 0; /*endif*/ } /*endfor*/ } /*endif*/ return samples; } /*- End of function --------------------------------------------------------*/ int oki_adpcm_encode(oki_adpcm_state_t *s, uint8_t oki_data[], const int16_t amp[], int len) { int x; int l; int n; int bytes; float z; bytes = 0; if (s->bit_rate == 32000) { for (n = 0; n < len; n++) { s->oki_byte = (s->oki_byte << 4) | encode(s, amp[n]); if ((s->mark++ & 1)) oki_data[bytes++] = s->oki_byte; /*endif*/ } /*endfor*/ } else { n = 0; for (;;) { /* 8k to 6k sample/second conversion */ if (s->phase > 2) { s->history[s->ptr++] = amp[n]; s->ptr &= (32 - 1); s->phase = 0; if (++n >= len) break; /*endif*/ } /*endif*/ s->history[s->ptr++] = amp[n]; s->ptr &= (32 - 1); z = 0.0f; for (l = 80 - s->phase, x = s->ptr - 1; l >= 0; l -= 3, x--) z += cutoff_coeffs[l]*s->history[x & (32 - 1)]; /*endfor*/ s->oki_byte = (s->oki_byte << 4) | encode(s, (int16_t) (z*3.0f)); if ((s->mark++ & 1)) oki_data[bytes++] = s->oki_byte; /*endif*/ s->phase++; if (++n >= len) break; /*endif*/ } /*endfor*/ } /*endif*/ return bytes; } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/v22bis_tx_floating_rrc.h0000644000175000017500000002503711150047212022404 0ustar julienjulien#define TX_PULSESHAPER_GAIN 1.000000f #define TX_PULSESHAPER_COEFF_SETS 40 static const float tx_pulseshaper[TX_PULSESHAPER_COEFF_SETS][9] = { { -0.0047225799f, /* Filter 0 */ -0.0084017854f, -0.0087512705f, 0.0088069151f, 0.5113443423f, 0.5113443422f, 0.0088069150f, -0.0087512705f, -0.0084017854f }, { -0.0044560627f, /* Filter 1 */ -0.0089299784f, -0.0111430081f, 0.0023375926f, 0.5628832742f, 0.4603563001f, 0.0144879379f, -0.0063308268f, -0.0077375780f }, { -0.0040955757f, /* Filter 2 */ -0.0093085520f, -0.0134608686f, -0.0048652084f, 0.6146393768f, 0.4102392997f, 0.0193418829f, -0.0039255892f, -0.0069531299f }, { -0.0036459251f, /* Filter 3 */ -0.0095262914f, -0.0156592355f, -0.0127304083f, 0.6662684960f, 0.3612970480f, 0.0233456667f, -0.0015775329f, -0.0060659391f }, { -0.0031137078f, /* Filter 4 */ -0.0095747033f, -0.0176928206f, -0.0211706543f, 0.7174186958f, 0.3138144449f, 0.0264912738f, 0.0006739922f, -0.0050949150f }, { -0.0025072439f, /* Filter 5 */ -0.0094482428f, -0.0195175151f, -0.0300826256f, 0.7677341786f, 0.2680550805f, 0.0287849965f, 0.0027928495f, -0.0040599976f }, { -0.0018364509f, /* Filter 6 */ -0.0091444853f, -0.0210912336f, -0.0393474967f, 0.8168580673f, 0.2242592987f, 0.0302465054f, 0.0047466024f, -0.0029817423f }, { -0.0011126906f, /* Filter 7 */ -0.0086642941f, -0.0223747662f, -0.0488316115f, 0.8644361861f, 0.1826424770f, 0.0309077815f, 0.0065069834f, -0.0018809527f }, { -0.0003486070f, /* Filter 8 */ -0.0080118899f, -0.0233326132f, -0.0583874108f, 0.9101203338f, 0.1433934276f, 0.0308119316f, 0.0080502010f, -0.0007782996f }, { 0.0004421038f, /* Filter 9 */ -0.0071948793f, -0.0239337731f, -0.0678546589f, 0.9535717032f, 0.1066734699f, 0.0300118637f, 0.0093572179f, 0.0003060784f }, { 0.0012449004f, /* Filter 10 */ -0.0062242175f, -0.0241525264f, -0.0770617470f, 0.9944641631f, 0.0726154565f, 0.0285689605f, 0.0104139109f, 0.0013528956f }, { 0.0020446769f, /* Filter 11 */ -0.0051140981f, -0.0239691024f, -0.0858273278f, 1.0324875613f, 0.0413233951f, 0.0265516451f, 0.0112111290f, 0.0023440604f }, { 0.0028260046f, /* Filter 12 */ -0.0038818095f, -0.0233703410f, -0.0939620315f, 1.0673511303f, 0.0128722494f, 0.0240338606f, 0.0117446951f, 0.0032629820f }, { 0.0035734256f, /* Filter 13 */ -0.0025475002f, -0.0223501989f, -0.1012704788f, 1.0987857647f, -0.0126918879f, 0.0210936824f, 0.0120153027f, 0.0040948071f }, { 0.0042717487f, /* Filter 14 */ -0.0011339020f, -0.0209102209f, -0.1075533482f, 1.1265473042f, -0.0353513115f, 0.0178118270f, 0.0120283162f, 0.0048266759f }, { 0.0049063204f, /* Filter 15 */ 0.0003340068f, -0.0190598540f, -0.1126096101f, 1.1504189013f, -0.0551159112f, 0.0142701967f, 0.0117935356f, 0.0054478772f }, { 0.0054633378f, /* Filter 16 */ 0.0018293983f, -0.0168166384f, -0.1162389085f, 1.1702128005f, -0.0720220989f, 0.0105505105f, 0.0113248682f, 0.0059499999f }, { 0.0059300986f, /* Filter 17 */ 0.0033240172f, -0.0142063354f, -0.1182439353f, 1.1857731261f, -0.0861315420f, 0.0067330166f, 0.0106398969f, 0.0063270335f }, { 0.0062952926f, /* Filter 18 */ 0.0047886664f, -0.0112628308f, -0.1184330100f, 1.1969766889f, -0.0975294679f, 0.0028952510f, 0.0097595312f, 0.0065754012f }, { 0.0065492251f, /* Filter 19 */ 0.0061937075f, -0.0080279745f, -0.1166224166f, 1.2037346307f, -0.1063230130f, -0.0008890961f, 0.0087074429f, 0.0066939821f }, { 0.0066840559f, /* Filter 20 */ 0.0075095974f, -0.0045512022f, -0.1126391143f, 1.2059933265f, -0.1126391143f, -0.0045512022f, 0.0075095974f, 0.0066840559f }, { 0.0066939821f, /* Filter 21 */ 0.0087074429f, -0.0008890961f, -0.1063230130f, 1.2037346307f, -0.1166224167f, -0.0080279745f, 0.0061937074f, 0.0065492251f }, { 0.0065754012f, /* Filter 22 */ 0.0097595313f, 0.0028952510f, -0.0975294679f, 1.1969766889f, -0.1184330100f, -0.0112628308f, 0.0047886664f, 0.0062952926f }, { 0.0063270335f, /* Filter 23 */ 0.0106398969f, 0.0067330166f, -0.0861315419f, 1.1857731261f, -0.1182439353f, -0.0142063354f, 0.0033240172f, 0.0059300986f }, { 0.0059499999f, /* Filter 24 */ 0.0113248682f, 0.0105505105f, -0.0720220988f, 1.1702128005f, -0.1162389085f, -0.0168166384f, 0.0018293982f, 0.0054633378f }, { 0.0054478772f, /* Filter 25 */ 0.0117935356f, 0.0142701967f, -0.0551159112f, 1.1504189013f, -0.1126096102f, -0.0190598540f, 0.0003340068f, 0.0049063204f }, { 0.0048266759f, /* Filter 26 */ 0.0120283162f, 0.0178118270f, -0.0353513115f, 1.1265473042f, -0.1075533483f, -0.0209102209f, -0.0011339020f, 0.0042717487f }, { 0.0040948071f, /* Filter 27 */ 0.0120153027f, 0.0210936824f, -0.0126918879f, 1.0987857646f, -0.1012704788f, -0.0223501990f, -0.0025475002f, 0.0035734256f }, { 0.0032629820f, /* Filter 28 */ 0.0117446951f, 0.0240338606f, 0.0128722494f, 1.0673511303f, -0.0939620315f, -0.0233703410f, -0.0038818095f, 0.0028260045f }, { 0.0023440604f, /* Filter 29 */ 0.0112111290f, 0.0265516451f, 0.0413233951f, 1.0324875612f, -0.0858273278f, -0.0239691024f, -0.0051140981f, 0.0020446769f }, { 0.0013528956f, /* Filter 30 */ 0.0104139109f, 0.0285689605f, 0.0726154565f, 0.9944641630f, -0.0770617471f, -0.0241525264f, -0.0062242175f, 0.0012449004f }, { 0.0003060784f, /* Filter 31 */ 0.0093572179f, 0.0300118637f, 0.1066734700f, 0.9535717031f, -0.0678546589f, -0.0239337731f, -0.0071948793f, 0.0004421038f }, { -0.0007782996f, /* Filter 32 */ 0.0080502011f, 0.0308119316f, 0.1433934276f, 0.9101203338f, -0.0583874108f, -0.0233326132f, -0.0080118899f, -0.0003486070f }, { -0.0018809527f, /* Filter 33 */ 0.0065069834f, 0.0309077816f, 0.1826424771f, 0.8644361860f, -0.0488316115f, -0.0223747662f, -0.0086642941f, -0.0011126906f }, { -0.0029817423f, /* Filter 34 */ 0.0047466024f, 0.0302465054f, 0.2242592987f, 0.8168580673f, -0.0393474967f, -0.0210912336f, -0.0091444853f, -0.0018364509f }, { -0.0040599976f, /* Filter 35 */ 0.0027928495f, 0.0287849965f, 0.2680550805f, 0.7677341786f, -0.0300826256f, -0.0195175151f, -0.0094482428f, -0.0025072439f }, { -0.0050949150f, /* Filter 36 */ 0.0006739922f, 0.0264912738f, 0.3138144449f, 0.7174186958f, -0.0211706543f, -0.0176928206f, -0.0095747033f, -0.0031137079f }, { -0.0060659391f, /* Filter 37 */ -0.0015775329f, 0.0233456667f, 0.3612970481f, 0.6662684959f, -0.0127304083f, -0.0156592355f, -0.0095262914f, -0.0036459251f }, { -0.0069531299f, /* Filter 38 */ -0.0039255892f, 0.0193418829f, 0.4102392997f, 0.6146393768f, -0.0048652084f, -0.0134608686f, -0.0093085520f, -0.0040955757f }, { -0.0077375780f, /* Filter 39 */ -0.0063308268f, 0.0144879379f, 0.4603563001f, 0.5628832742f, 0.0023375926f, -0.0111430081f, -0.0089299784f, -0.0044560627f } }; iaxmodem-1.2.0/lib/spandsp/src/modem_connect_tones.c0000644000175000017500000004540511150047212022047 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * modem_connect_tones.c - Generation and detection of tones * associated with modems calling and answering calls. * * Written by Steve Underwood * * Copyright (C) 2006 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: modem_connect_tones.c,v 1.24 2008/07/02 14:48:25 steveu Exp $ */ /*! \file */ #if defined(HAVE_CONFIG_H) #include #endif #include #include #include #include "floating_fudge.h" #if defined(HAVE_TGMATH_H) #include #endif #if defined(HAVE_MATH_H) #include #endif #include "spandsp/telephony.h" #include "spandsp/logging.h" #include "spandsp/complex.h" #include "spandsp/dds.h" #include "spandsp/tone_detect.h" #include "spandsp/tone_generate.h" #include "spandsp/super_tone_rx.h" #include "spandsp/power_meter.h" #include "spandsp/async.h" #include "spandsp/fsk.h" #include "spandsp/modem_connect_tones.h" #define HDLC_FRAMING_OK_THRESHOLD 5 int modem_connect_tones_tx(modem_connect_tones_tx_state_t *s, int16_t amp[], int len) { int mod; int i; int xlen; i = 0; switch (s->tone_type) { case MODEM_CONNECT_TONES_FAX_CNG: for ( ; i < len; i++) { if (s->duration_timer > ms_to_samples(3000)) { if ((xlen = i + s->duration_timer - ms_to_samples(3000)) > len) xlen = len; s->duration_timer -= (xlen - i); for ( ; i < xlen; i++) amp[i] = dds_mod(&s->tone_phase, s->tone_phase_rate, s->level, 0); } if (s->duration_timer > 0) { if ((xlen = i + s->duration_timer) > len) xlen = len; s->duration_timer -= (xlen - i); memset(amp + i, 0, sizeof(int16_t)*(xlen - i)); i = xlen; } if (s->duration_timer == 0) s->duration_timer = ms_to_samples(500 + 3000); } break; case MODEM_CONNECT_TONES_FAX_CED: case MODEM_CONNECT_TONES_ANS: if (s->duration_timer < len) len = s->duration_timer; if (s->duration_timer > ms_to_samples(2600)) { if ((i = s->duration_timer - ms_to_samples(2600)) > len) i = len; memset(amp, 0, sizeof(int16_t)*i); } for ( ; i < len; i++) amp[i] = dds_mod(&s->tone_phase, s->tone_phase_rate, s->level, 0); s->duration_timer -= len; break; case MODEM_CONNECT_TONES_ANS_PR: if (s->duration_timer < len) len = s->duration_timer; if (s->duration_timer > ms_to_samples(3300)) { if ((i = s->duration_timer - ms_to_samples(3300)) > len) i = len; memset(amp, 0, sizeof(int16_t)*i); } for ( ; i < len; i++) { if (--s->hop_timer <= 0) { s->hop_timer = ms_to_samples(450); s->tone_phase += 0x80000000; } amp[i] = dds_mod(&s->tone_phase, s->tone_phase_rate, s->level, 0); } s->duration_timer -= len; break; case MODEM_CONNECT_TONES_ANSAM: if (s->duration_timer < len) len = s->duration_timer; if (s->duration_timer > ms_to_samples(3300)) { if ((i = s->duration_timer - ms_to_samples(3300)) > len) i = len; memset(amp, 0, sizeof(int16_t)*i); } for ( ; i < len; i++) { mod = s->level + dds_mod(&s->mod_phase, s->mod_phase_rate, s->mod_level, 0); amp[i] = dds_mod(&s->tone_phase, s->tone_phase_rate, mod, 0); } s->duration_timer -= len; break; case MODEM_CONNECT_TONES_ANSAM_PR: if (s->duration_timer < len) len = s->duration_timer; if (s->duration_timer > ms_to_samples(3300)) { if ((i = s->duration_timer - ms_to_samples(3300)) > len) i = len; memset(amp, 0, sizeof(int16_t)*i); } for ( ; i < len; i++) { if (--s->hop_timer <= 0) { s->hop_timer = ms_to_samples(450); s->tone_phase += 0x80000000; } mod = s->level + dds_mod(&s->mod_phase, s->mod_phase_rate, s->mod_level, 0); amp[i] = dds_mod(&s->tone_phase, s->tone_phase_rate, mod, 0); } s->duration_timer -= len; break; } return len; } /*- End of function --------------------------------------------------------*/ modem_connect_tones_tx_state_t *modem_connect_tones_tx_init(modem_connect_tones_tx_state_t *s, int tone_type) { if (s == NULL) { if ((s = (modem_connect_tones_tx_state_t *) malloc(sizeof(*s))) == NULL) return NULL; } s->tone_type = tone_type; switch (s->tone_type) { case MODEM_CONNECT_TONES_FAX_CNG: /* 0.5s of 1100Hz+-38Hz + 3.0s of silence repeating. Timing +-15% */ s->tone_phase_rate = dds_phase_rate(1100.0); s->level = dds_scaling_dbm0(-11); s->duration_timer = ms_to_samples(500 + 3000); s->tone_phase = 0; break; case MODEM_CONNECT_TONES_FAX_CED: case MODEM_CONNECT_TONES_ANS: case MODEM_CONNECT_TONES_ANSAM: /* 0.2s of silence, then 2.6s to 4s of 2100Hz+-15Hz tone, then 75ms of silence. */ s->tone_phase_rate = dds_phase_rate(2100.0); s->level = dds_scaling_dbm0(-11); s->duration_timer = ms_to_samples(200 + 2600); s->mod_phase_rate = dds_phase_rate(15.0); s->tone_phase = 0; s->mod_phase = 0; if (s->tone_type == MODEM_CONNECT_TONES_ANSAM) s->mod_level = s->level/5; else s->mod_level = 0; break; case MODEM_CONNECT_TONES_ANS_PR: case MODEM_CONNECT_TONES_ANSAM_PR: s->tone_phase_rate = dds_phase_rate(2100.0); s->level = dds_scaling_dbm0(-12); s->duration_timer = ms_to_samples(200 + 3300); s->mod_phase_rate = dds_phase_rate(15.0); s->tone_phase = 0; s->mod_phase = 0; s->hop_timer = ms_to_samples(450); if (s->tone_type == MODEM_CONNECT_TONES_ANSAM_PR) s->mod_level = s->level/5; else s->mod_level = 0; break; } return s; } /*- End of function --------------------------------------------------------*/ int modem_connect_tones_tx_free(modem_connect_tones_tx_state_t *s) { free(s); return 0; } /*- End of function --------------------------------------------------------*/ static void report_tone_state(modem_connect_tones_rx_state_t *s, int tone, int level) { if (tone != s->tone_present) { if (s->tone_callback) { s->tone_callback(s->callback_data, tone, level, 0); } else { if (tone != MODEM_CONNECT_TONES_NONE) s->hit = tone; } s->tone_present = tone; } } /*- End of function --------------------------------------------------------*/ static void v21_put_bit(void *user_data, int bit) { modem_connect_tones_rx_state_t *s; s = (modem_connect_tones_rx_state_t *) user_data; if (bit < 0) { /* Special conditions. */ switch (bit) { case PUTBIT_CARRIER_DOWN: /* Only declare tone off, if we were the one to declare tone on. */ if (s->tone_present == MODEM_CONNECT_TONES_FAX_PREAMBLE) report_tone_state(s, MODEM_CONNECT_TONES_NONE, -99); /* Fall through */ case PUTBIT_CARRIER_UP: s->raw_bit_stream = 0; s->num_bits = 0; s->flags_seen = 0; s->framing_ok_announced = FALSE; break; } return; } /* Look for enough FAX V.21 message preamble (back to back HDLC flag octets) to be sure we are really seeing preamble, and declare the signal to be present. Any change from preamble declares the signal to not be present, though it will probably be the body of the messages following the preamble. */ s->raw_bit_stream = (s->raw_bit_stream << 1) | ((bit << 8) & 0x100); s->num_bits++; if ((s->raw_bit_stream & 0x7F00) == 0x7E00) { if ((s->raw_bit_stream & 0x8000)) { /* Hit HDLC abort */ s->flags_seen = 0; } else { /* Hit HDLC flag */ if (s->flags_seen < HDLC_FRAMING_OK_THRESHOLD) { /* Check the flags are back-to-back when testing for valid preamble. This greatly reduces the chances of false preamble detection, and anything which doesn't send them back-to-back is badly broken. */ if (s->num_bits != 8) s->flags_seen = 0; if (++s->flags_seen >= HDLC_FRAMING_OK_THRESHOLD && !s->framing_ok_announced) { report_tone_state(s, MODEM_CONNECT_TONES_FAX_PREAMBLE, lrintf(fsk_rx_signal_power(&(s->v21rx)))); s->framing_ok_announced = TRUE; } } } s->num_bits = 0; } else { if (s->flags_seen >= HDLC_FRAMING_OK_THRESHOLD) { if (s->num_bits == 8) { s->framing_ok_announced = FALSE; s->flags_seen = 0; } } } } /*- End of function --------------------------------------------------------*/ int modem_connect_tones_rx(modem_connect_tones_rx_state_t *s, const int16_t amp[], int len) { int i; int16_t notched; float v1; float famp; switch (s->tone_type) { case MODEM_CONNECT_TONES_FAX_CNG: for (i = 0; i < len; i++) { /* A Cauer notch at 1100Hz, spread just wide enough to meet our detection bandwidth criteria. */ famp = amp[i]; v1 = 0.792928f*famp + 1.0018744927985f*s->z1 - 0.54196833412465f*s->z2; famp = v1 - 1.2994747954630f*s->z1 + s->z2; s->z2 = s->z1; s->z1 = v1; notched = (int16_t) lrintf(famp); /* Estimate the overall energy in the channel, and the energy in the notch (i.e. overall channel energy - tone energy => noise). Use abs instead of multiply for speed (is it really faster?). */ s->channel_level += ((abs(amp[i]) - s->channel_level) >> 5); s->notch_level += ((abs(notched) - s->notch_level) >> 5); if (s->channel_level > 70 && s->notch_level*6 < s->channel_level) { /* There is adequate energy in the channel, and it is mostly at 1100Hz. */ if (s->tone_present != MODEM_CONNECT_TONES_FAX_CNG) { if (++s->tone_cycle_duration >= ms_to_samples(415)) report_tone_state(s, MODEM_CONNECT_TONES_FAX_CNG, lrintf(log10f(s->channel_level/32768.0f)*20.0f + DBM0_MAX_POWER + 0.8f)); } } else { /* If the signal looks wrong, even for a moment, we consider this the end of the tone. */ if (s->tone_present == MODEM_CONNECT_TONES_FAX_CNG) report_tone_state(s, MODEM_CONNECT_TONES_NONE, -99); s->tone_cycle_duration = 0; } } break; case MODEM_CONNECT_TONES_FAX_CED: /* Also look for V.21 preamble. A lot of machines don't send the 2100Hz burst. It might also not be seen all the way through the channel, due to switching delays. */ fsk_rx(&(s->v21rx), amp, len); /* Now fall through and look for a 2100Hz tone */ case MODEM_CONNECT_TONES_ANS: case MODEM_CONNECT_TONES_ANS_PR: case MODEM_CONNECT_TONES_ANSAM: case MODEM_CONNECT_TONES_ANSAM_PR: for (i = 0; i < len; i++) { /* A Cauer notch at 2100Hz, spread just wide enough to meet our detection bandwidth criteria. */ /* This is actually centred at 2095Hz, but gets the balance we want, due to the asymmetric walls of the notch */ famp = amp[i]; v1 = 0.76000f*famp - 0.1183852f*s->z1 - 0.5104039f*s->z2; famp = v1 + 0.1567596f*s->z1 + s->z2; s->z2 = s->z1; s->z1 = v1; notched = (int16_t) lrintf(famp); /* Estimate the overall energy in the channel, and the energy in the notch (i.e. overall channel energy - tone energy => noise). Use abs instead of multiply for speed (is it really faster?). Damp the overall energy a little more for a stable result. Damp the notch energy a little less, so we don't damp out the blip every time the phase reverses */ s->channel_level += ((abs(amp[i]) - s->channel_level) >> 5); s->notch_level += ((abs(notched) - s->notch_level) >> 4); /* This should cut off at about -43dBm0 */ if (s->channel_level <= 70) { /* If the energy level is low, even for a moment, we consider this the end of the tone. */ if (s->tone_present != MODEM_CONNECT_TONES_NONE) report_tone_state(s, MODEM_CONNECT_TONES_NONE, -99); s->tone_cycle_duration = 0; s->good_cycles = 0; s->tone_on = FALSE; continue; } /* There is adequate energy in the channel. Is it mostly at 2100Hz? */ if (s->notch_level*6 < s->channel_level) { /* The notch test says yes, so we have the tone. */ /* We should get a kick from the notch filter every 450+-25ms, as the phase reverses, for an EC disable tone. For a simple CNG tone, the tone should persist unbroken for longer. */ if (s->tone_type == MODEM_CONNECT_TONES_FAX_CED) { if (s->tone_present != MODEM_CONNECT_TONES_FAX_CNG) { if (++s->tone_cycle_duration >= ms_to_samples(500)) report_tone_state(s, MODEM_CONNECT_TONES_FAX_CED, lrintf(log10f(s->channel_level/32768.0f)*20.0f + DBM0_MAX_POWER + 0.8f)); s->tone_on = TRUE; } } else { /* We should get a kick from the notch filter every 450+-25ms, as the phase reverses. */ if (!s->tone_on) { if (s->tone_cycle_duration >= ms_to_samples(450 - 25)) { if (++s->good_cycles == 3) report_tone_state(s, MODEM_CONNECT_TONES_ANS_PR, lrintf(log10f(s->channel_level/32768.0f)*20.0f + DBM0_MAX_POWER + 0.8f)); } else { s->good_cycles = 0; } s->tone_cycle_duration = 0; s->tone_on = TRUE; } s->tone_cycle_duration++; } } else { if (s->tone_type == MODEM_CONNECT_TONES_FAX_CED) { /* Only declare tone off, if we were the one to declare tone on. */ if (s->tone_present == MODEM_CONNECT_TONES_FAX_CED && s->tone_on) report_tone_state(s, MODEM_CONNECT_TONES_NONE, -99); s->tone_on = FALSE; s->tone_cycle_duration = 0; } else { if (s->tone_cycle_duration >= ms_to_samples(450 + 25)) { /* The change came too soon for a cycle of ANS_PR tone */ if (s->tone_present == MODEM_CONNECT_TONES_ANS_PR) report_tone_state(s, MODEM_CONNECT_TONES_NONE, -99); s->tone_cycle_duration = 0; s->good_cycles = 0; } s->tone_on = FALSE; } s->tone_cycle_duration++; } } break; } return 0; } /*- End of function --------------------------------------------------------*/ int modem_connect_tones_rx_get(modem_connect_tones_rx_state_t *s) { int x; x = s->hit; s->hit = MODEM_CONNECT_TONES_NONE; return x; } /*- End of function --------------------------------------------------------*/ modem_connect_tones_rx_state_t *modem_connect_tones_rx_init(modem_connect_tones_rx_state_t *s, int tone_type, tone_report_func_t tone_callback, void *user_data) { if (s == NULL) { if ((s = (modem_connect_tones_rx_state_t *) malloc(sizeof(*s))) == NULL) return NULL; } s->tone_type = tone_type; s->channel_level = 0; s->notch_level = 0; s->tone_present = MODEM_CONNECT_TONES_NONE; s->tone_cycle_duration = 0; s->good_cycles = 0; s->hit = MODEM_CONNECT_TONES_NONE; s->tone_on = FALSE; s->tone_callback = tone_callback; s->callback_data = user_data; s->z1 = 0.0f; s->z2 = 0.0f; fsk_rx_init(&(s->v21rx), &preset_fsk_specs[FSK_V21CH2], TRUE, v21_put_bit, s); fsk_rx_signal_cutoff(&(s->v21rx), -45.5); s->num_bits = 0; s->flags_seen = 0; s->framing_ok_announced = FALSE; s->raw_bit_stream = 0; return s; } /*- End of function --------------------------------------------------------*/ int modem_connect_tones_rx_free(modem_connect_tones_rx_state_t *s) { free(s); return 0; } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/v29rx.c0000644000175000017500000010577211150047212017023 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * v29rx.c - ITU V.29 modem receive part * * Written by Steve Underwood * * Copyright (C) 2003, 2004, 2005, 2006, 2007 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: v29rx.c,v 1.124 2008/07/17 19:12:27 steveu Exp $ */ /*! \file */ #if defined(HAVE_CONFIG_H) #include #endif #include #include #include #include #include "floating_fudge.h" #if defined(HAVE_TGMATH_H) #include #endif #if defined(HAVE_MATH_H) #include #endif #include "spandsp/telephony.h" #include "spandsp/logging.h" #include "spandsp/complex.h" #include "spandsp/vector_float.h" #include "spandsp/complex_vector_float.h" #include "spandsp/async.h" #include "spandsp/power_meter.h" #include "spandsp/arctan2.h" #include "spandsp/dds.h" #include "spandsp/complex_filters.h" #include "spandsp/v29rx.h" #include "v29tx_constellation_maps.h" #if defined(SPANDSP_USE_FIXED_POINT) #include "v29rx_fixed_rrc.h" #else #include "v29rx_floating_rrc.h" #endif #define CARRIER_NOMINAL_FREQ 1700.0f #define BAUD_RATE 2400 #define EQUALIZER_DELTA 0.21f /* Segments of the training sequence */ #define V29_TRAINING_SEG_2_LEN 128 #define V29_TRAINING_SEG_3_LEN 384 #define V29_TRAINING_SEG_4_LEN 48 enum { TRAINING_STAGE_NORMAL_OPERATION = 0, TRAINING_STAGE_SYMBOL_ACQUISITION, TRAINING_STAGE_LOG_PHASE, TRAINING_STAGE_WAIT_FOR_CDCD, TRAINING_STAGE_TRAIN_ON_CDCD, TRAINING_STAGE_TRAIN_ON_CDCD_AND_TEST, TRAINING_STAGE_TEST_ONES, TRAINING_STAGE_PARKED }; static const uint8_t space_map_9600[20][20] = { {13, 13, 13, 13, 13, 13, 12, 12, 12, 12, 12, 12, 12, 12, 11, 11, 11, 11, 11, 11}, {13, 13, 13, 13, 13, 13, 13, 12, 12, 12, 12, 12, 12, 11, 11, 11, 11, 11, 11, 11}, {13, 13, 13, 13, 13, 13, 13, 4, 4, 4, 4, 4, 4, 11, 11, 11, 11, 11, 11, 11}, {13, 13, 13, 13, 13, 13, 13, 4, 4, 4, 4, 4, 4, 11, 11, 11, 11, 11, 11, 11}, {13, 13, 13, 13, 13, 13, 13, 4, 4, 4, 4, 4, 4, 11, 11, 11, 11, 11, 11, 11}, {13, 13, 13, 13, 13, 13, 13, 5, 4, 4, 4, 4, 3, 11, 11, 11, 11, 11, 11, 11}, {14, 13, 13, 13, 13, 13, 5, 5, 5, 5, 3, 3, 3, 3, 11, 11, 11, 11, 11, 10}, {14, 14, 6, 6, 6, 5, 5, 5, 5, 5, 3, 3, 3, 3, 3, 2, 2, 2, 10, 10}, {14, 14, 6, 6, 6, 6, 5, 5, 5, 5, 3, 3, 3, 3, 2, 2, 2, 2, 10, 10}, {14, 14, 6, 6, 6, 6, 5, 5, 5, 5, 3, 3, 3, 3, 2, 2, 2, 2, 10, 10}, {14, 14, 6, 6, 6, 6, 7, 7, 7, 7, 1, 1, 1, 1, 2, 2, 2, 2, 10, 10}, {14, 14, 6, 6, 6, 6, 7, 7, 7, 7, 1, 1, 1, 1, 2, 2, 2, 2, 10, 10}, {14, 14, 6, 6, 6, 7, 7, 7, 7, 7, 1, 1, 1, 1, 1, 2, 2, 2, 10, 10}, {14, 15, 15, 15, 15, 15, 7, 7, 7, 7, 1, 1, 1, 1, 9, 9, 9, 9, 9, 10}, {15, 15, 15, 15, 15, 15, 15, 7, 0, 0, 0, 0, 1, 9, 9, 9, 9, 9, 9, 9}, {15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9}, {15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9}, {15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9}, {15, 15, 15, 15, 15, 15, 15, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9}, {15, 15, 15, 15, 15, 15, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9} }; /* Coefficients for the band edge symbol timing synchroniser (alpha = 0.99) */ #define SYNC_LOW_BAND_EDGE_COEFF_0 1.829281f /* 2*alpha*cos(low_edge) */ #define SYNC_LOW_BAND_EDGE_COEFF_1 -0.980100f /* -alpha^2 */ #define SYNC_HIGH_BAND_EDGE_COEFF_0 -1.285907f /* 2*alpha*cos(high_edge) */ #define SYNC_HIGH_BAND_EDGE_COEFF_1 -0.980100f /* -alpha^2 */ #define SYNC_CROSS_CORR_COEFF_A -0.932131f /* -alpha^2*sin(freq_diff) */ #define SYNC_CROSS_CORR_COEFF_B 0.752802f /* alpha*sin(high_edge) */ #define SYNC_CROSS_CORR_COEFF_C -0.378857f /* -alpha*sin(low_edge) */ float v29_rx_carrier_frequency(v29_rx_state_t *s) { return dds_frequencyf(s->carrier_phase_rate); } /*- End of function --------------------------------------------------------*/ float v29_rx_symbol_timing_correction(v29_rx_state_t *s) { return (float) s->total_baud_timing_correction/((float) RX_PULSESHAPER_COEFF_SETS*10.0f/3.0f); } /*- End of function --------------------------------------------------------*/ void v29_rx_signal_cutoff(v29_rx_state_t *s, float cutoff) { /* The 0.4 factor allows for the gain of the DC blocker */ s->carrier_on_power = (int32_t) (power_meter_level_dbm0(cutoff + 2.5f)*0.4f); s->carrier_off_power = (int32_t) (power_meter_level_dbm0(cutoff - 2.5f)*0.4f); } /*- End of function --------------------------------------------------------*/ float v29_rx_signal_power(v29_rx_state_t *s) { return power_meter_current_dbm0(&s->power); } /*- End of function --------------------------------------------------------*/ int v29_rx_equalizer_state(v29_rx_state_t *s, complexf_t **coeffs) { *coeffs = s->eq_coeff; return V29_EQUALIZER_PRE_LEN + 1 + V29_EQUALIZER_POST_LEN; } /*- End of function --------------------------------------------------------*/ static void equalizer_save(v29_rx_state_t *s) { cvec_copyf(s->eq_coeff_save, s->eq_coeff, V29_EQUALIZER_PRE_LEN + 1 + V29_EQUALIZER_POST_LEN); } /*- End of function --------------------------------------------------------*/ static void report_status_change(v29_rx_state_t *s, int status) { if (s->status_handler) s->status_handler(s->status_user_data, status); else if (s->put_bit) s->put_bit(s->put_bit_user_data, status); } /*- End of function --------------------------------------------------------*/ static void equalizer_restore(v29_rx_state_t *s) { cvec_copyf(s->eq_coeff, s->eq_coeff_save, V29_EQUALIZER_PRE_LEN + 1 + V29_EQUALIZER_POST_LEN); cvec_zerof(s->eq_buf, V29_EQUALIZER_MASK); s->eq_put_step = RX_PULSESHAPER_COEFF_SETS*10/(3*2) - 1; s->eq_step = 0; s->eq_delta = EQUALIZER_DELTA/(V29_EQUALIZER_PRE_LEN + 1 + V29_EQUALIZER_POST_LEN); } /*- End of function --------------------------------------------------------*/ static void equalizer_reset(v29_rx_state_t *s) { /* Start with an equalizer based on everything being perfect */ cvec_zerof(s->eq_coeff, V29_EQUALIZER_PRE_LEN + 1 + V29_EQUALIZER_POST_LEN); s->eq_coeff[V29_EQUALIZER_PRE_LEN] = complex_setf(3.0f, 0.0f); cvec_zerof(s->eq_buf, V29_EQUALIZER_MASK); s->eq_put_step = RX_PULSESHAPER_COEFF_SETS*10/(3*2) - 1; s->eq_step = 0; s->eq_delta = EQUALIZER_DELTA/(V29_EQUALIZER_PRE_LEN + 1 + V29_EQUALIZER_POST_LEN); } /*- End of function --------------------------------------------------------*/ static __inline__ complexf_t equalizer_get(v29_rx_state_t *s) { int i; int p; complexf_t z; complexf_t z1; /* Get the next equalized value. */ z = complex_setf(0.0f, 0.0f); p = s->eq_step - 1; for (i = 0; i < V29_EQUALIZER_PRE_LEN + 1 + V29_EQUALIZER_POST_LEN; i++) { p = (p - 1) & V29_EQUALIZER_MASK; z1 = complex_mulf(&s->eq_coeff[i], &s->eq_buf[p]); z = complex_addf(&z, &z1); } return z; } /*- End of function --------------------------------------------------------*/ #if defined(SPANDSP_USE_FIXED_POINTy) static void tune_equalizer(v29_rx_state_t *s, const complexi16_t *z, const complexi16_t *target) #else static void tune_equalizer(v29_rx_state_t *s, const complexf_t *z, const complexf_t *target) #endif { int i; int p; complexf_t ez; complexf_t z1; /* Find the x and y mismatch from the exact constellation position. */ ez = complex_subf(target, z); ez.re *= s->eq_delta; ez.im *= s->eq_delta; p = s->eq_step - 1; for (i = 0; i < V29_EQUALIZER_PRE_LEN + 1 + V29_EQUALIZER_POST_LEN; i++) { p = (p - 1) & V29_EQUALIZER_MASK; z1 = complex_conjf(&s->eq_buf[p]); z1 = complex_mulf(&ez, &z1); s->eq_coeff[i] = complex_addf(&s->eq_coeff[i], &z1); /* Leak a little to tame uncontrolled wandering */ s->eq_coeff[i].re *= 0.9999f; s->eq_coeff[i].im *= 0.9999f; } } /*- End of function --------------------------------------------------------*/ static int scrambled_training_bit(v29_rx_state_t *s) { int bit; /* Segment 3 of the training sequence - the scrambled CDCD part. */ /* Apply the 1 + x^-6 + x^-7 scrambler */ bit = s->training_scramble_reg & 1; s->training_scramble_reg >>= 1; if (bit ^ (s->training_scramble_reg & 1)) s->training_scramble_reg |= 0x40; return bit; } /*- End of function --------------------------------------------------------*/ #if defined(SPANDSP_USE_FIXED_POINTy) static __inline__ int find_quadrant(const complexi16_t *z) #else static __inline__ int find_quadrant(const complexf_t *z) #endif { int b1; int b2; /* Split the space along the two diagonals. */ b1 = (z->im > z->re); b2 = (z->im < -z->re); return (b2 << 1) | (b1 ^ b2); } /*- End of function --------------------------------------------------------*/ #if defined(SPANDSP_USE_FIXED_POINTy) static __inline__ void track_carrier(v29_rx_state_t *s, const complexi16_t *z, const complexi16_t *target) #else static __inline__ void track_carrier(v29_rx_state_t *s, const complexf_t *z, const complexf_t *target) #endif { float error; /* The initial coarse carrier frequency and phase estimation should have got us in the right ballpark. Now we need to fine tune fairly quickly, to get the receovered carrier more precisely on target. Then we need to fine tune in a more damped way to keep us on target. The goal is to have things running really well by the time the training is complete. We assume the frequency of the oscillators at the two ends drift only very slowly. The PSTN has rather limited doppler problems. :-) Any remaining FDM in the network should also drift slowly. */ /* For small errors the imaginary part of the difference between the actual and the target positions is proportional to the phase error, for any particular target. However, the different amplitudes of the various target positions scale things. This isn't all bad, as the angular error for the larger amplitude constellation points is probably a more reliable indicator, and we are weighting it as such. */ error = z->im*target->re - z->re*target->im; /* Use a proportional-integral approach to tracking the carrier. The PI parameters are coarser at first, until we get precisely on target. Then, the filter will be damped more to keep us on target. */ s->carrier_phase_rate += (int32_t) (s->carrier_track_i*error); s->carrier_phase += (int32_t) (s->carrier_track_p*error); //span_log(&s->logging, SPAN_LOG_FLOW, "Im = %15.5f f = %15.5f\n", error, dds_frequencyf(s->carrier_phase_rate)); } /*- End of function --------------------------------------------------------*/ static __inline__ void put_bit(v29_rx_state_t *s, int bit) { int out_bit; bit &= 1; /* Descramble the bit */ out_bit = (bit ^ (s->scramble_reg >> 17) ^ (s->scramble_reg >> 22)) & 1; s->scramble_reg = (s->scramble_reg << 1) | bit; /* We need to strip the last part of the training - the test period of all 1s - before we let data go to the application. */ if (s->training_stage == TRAINING_STAGE_NORMAL_OPERATION) { s->put_bit(s->put_bit_user_data, out_bit); } else { /* The bits during the final stage of training should be all ones. However, buggy modems mean you cannot rely on this. Therefore we don't bother testing for ones, but just rely on a constellation mismatch measurement. */ } } /*- End of function --------------------------------------------------------*/ static void decode_baud(v29_rx_state_t *s, complexf_t *z) { static const uint8_t phase_steps_9600[8] = { 4, 0, 2, 6, 7, 3, 1, 5 }; static const uint8_t phase_steps_4800[4] = { 0, 2, 3, 1 }; int nearest; int raw_bits; int i; int re; int im; switch (s->bit_rate) { case 9600: default: re = (int) ((z->re + 5.0f)*2.0f); if (re > 19) re = 19; else if (re < 0) re = 0; im = (int) ((z->im + 5.0f)*2.0f); if (im > 19) im = 19; else if (im < 0) im = 0; nearest = space_map_9600[re][im]; /* Deal with the amplitude bit */ put_bit(s, nearest >> 3); raw_bits = phase_steps_9600[(nearest - s->constellation_state) & 7]; for (i = 0; i < 3; i++) { put_bit(s, raw_bits); raw_bits >>= 1; } break; case 7200: /* We can reuse the space map for 9600, but drop the top bit */ re = (int) ((z->re + 5.0f)*2.0f); if (re > 19) re = 19; else if (re < 0) re = 0; im = (int) ((z->im + 5.0f)*2.0f); if (im > 19) im = 19; else if (im < 0) im = 0; nearest = space_map_9600[re][im] & 7; raw_bits = phase_steps_9600[(nearest - s->constellation_state) & 7]; for (i = 0; i < 3; i++) { put_bit(s, raw_bits); raw_bits >>= 1; } break; case 4800: nearest = find_quadrant(z) << 1; raw_bits = phase_steps_4800[((nearest - s->constellation_state) >> 1) & 3]; put_bit(s, raw_bits); put_bit(s, raw_bits >> 1); break; } track_carrier(s, z, &v29_9600_constellation[nearest]); if (--s->eq_skip <= 0) { /* Once we are in the data the equalization should not need updating. However, the line characteristics may slowly drift. We, therefore, tune up on the occassional sample, keeping the compute down. */ s->eq_skip = 10; tune_equalizer(s, z, &v29_9600_constellation[nearest]); } s->constellation_state = nearest; } /*- End of function --------------------------------------------------------*/ static void process_half_baud(v29_rx_state_t *s, complexf_t *sample) { static const int cdcd_pos[6] = { 0, 11, 0, 3, 0, 2 }; complexf_t z; complexf_t zz; #if defined(SPANDSP_USE_FIXED_POINTy) const complexi16_t *target; #else const complexf_t *target; #endif float v; float p; int bit; int i; int j; int32_t angle; int32_t ang; /* This routine processes every half a baud, as we put things into the equalizer at the T/2 rate. This routine adapts the position of the half baud samples, which the caller takes. */ /* Add a sample to the equalizer's circular buffer, but don't calculate anything at this time. */ s->eq_buf[s->eq_step] = *sample; s->eq_step = (s->eq_step + 1) & V29_EQUALIZER_MASK; /* On alternate insertions we have a whole baud, and must process it. */ if ((s->baud_half ^= 1)) return; /* Symbol timing synchronisation */ /* Cross correlate */ v = s->symbol_sync_low[1]*s->symbol_sync_high[1]*SYNC_CROSS_CORR_COEFF_A + s->symbol_sync_low[0]*s->symbol_sync_high[1]*SYNC_CROSS_CORR_COEFF_B + s->symbol_sync_low[1]*s->symbol_sync_high[0]*SYNC_CROSS_CORR_COEFF_C; /* Filter away any DC component */ p = v - s->symbol_sync_dc_filter[1]; s->symbol_sync_dc_filter[1] = s->symbol_sync_dc_filter[0]; s->symbol_sync_dc_filter[0] = v; /* A little integration will now filter away much of the noise */ s->baud_phase -= p; if (fabsf(s->baud_phase) > 30.0f) { if (s->baud_phase > 0.0f) i = (s->baud_phase > 1000.0f) ? 5 : 1; else i = (s->baud_phase < -1000.0f) ? -5 : -1; //printf("v = %10.5f %5d - %f %f %d %d\n", v, i, p, s->baud_phase, s->total_baud_timing_correction); s->eq_put_step += i; s->total_baud_timing_correction += i; } z = equalizer_get(s); switch (s->training_stage) { case TRAINING_STAGE_NORMAL_OPERATION: /* Normal operation. */ decode_baud(s, &z); target = &v29_9600_constellation[s->constellation_state]; break; case TRAINING_STAGE_SYMBOL_ACQUISITION: /* Allow time for symbol synchronisation to settle the symbol timing. */ target = &z; if (++s->training_count >= 60) { /* Record the current phase angle */ s->training_stage = TRAINING_STAGE_LOG_PHASE; s->angles[0] = s->start_angles[0] = arctan2(z.im, z.re); } break; case TRAINING_STAGE_LOG_PHASE: /* Record the current alternate phase angle */ target = &z; s->angles[1] = s->start_angles[1] = arctan2(z.im, z.re); s->training_count = 1; s->training_stage = TRAINING_STAGE_WAIT_FOR_CDCD; break; case TRAINING_STAGE_WAIT_FOR_CDCD: target = &z; angle = arctan2(z.im, z.re); /* Look for the initial ABAB sequence to display a phase reversal, which will signal the start of the scrambled CDCD segment */ ang = angle - s->angles[(s->training_count - 1) & 0xF]; s->angles[(s->training_count + 1) & 0xF] = angle; if ((ang > 0x20000000 || ang < -0x20000000) && s->training_count >= 13) { /* We seem to have a phase reversal */ /* Slam the carrier frequency into line, based on the total phase drift over the last section. Use the shift from the odd bits and the shift from the even bits to get better jitter suppression. We need to scale here, or at the maximum specified frequency deviation we could overflow, and get a silly answer. */ /* Step back a few symbols so we don't get ISI distorting things. */ i = (s->training_count - 8) & ~1; /* Avoid the possibility of a divide by zero */ if (i) { j = i & 0xF; ang = (s->angles[j] - s->start_angles[0])/i + (s->angles[j | 0x1] - s->start_angles[1])/i; s->carrier_phase_rate += 3*(ang/20); } span_log(&s->logging, SPAN_LOG_FLOW, "Coarse carrier frequency %7.2f\n", dds_frequencyf(s->carrier_phase_rate)); /* Check if the carrier frequency is plausible */ if (s->carrier_phase_rate < dds_phase_ratef(CARRIER_NOMINAL_FREQ - 20.0f) || s->carrier_phase_rate > dds_phase_ratef(CARRIER_NOMINAL_FREQ + 20.0f)) { span_log(&s->logging, SPAN_LOG_FLOW, "Training failed (sequence failed)\n"); /* Park this modem */ s->training_stage = TRAINING_STAGE_PARKED; report_status_change(s, PUTBIT_TRAINING_FAILED); break; } /* Make a step shift in the phase, to pull it into line. We need to rotate the equalizer buffer, as well as the carrier phase, for this to play out nicely. */ p = angle*2.0f*3.14159f/(65536.0f*65536.0f); zz = complex_setf(cosf(p), -sinf(p)); for (i = 0; i <= V29_EQUALIZER_MASK; i++) s->eq_buf[i] = complex_mulf(&s->eq_buf[i], &zz); s->carrier_phase += angle; /* We have just seen the first bit of the scrambled sequence, so skip it. */ bit = scrambled_training_bit(s); s->training_count = 1; s->training_stage = TRAINING_STAGE_TRAIN_ON_CDCD; report_status_change(s, PUTBIT_TRAINING_IN_PROGRESS); break; } if (++s->training_count > V29_TRAINING_SEG_2_LEN) { /* This is bogus. There are not this many bauds in this section of a real training sequence. */ span_log(&s->logging, SPAN_LOG_FLOW, "Training failed (sequence failed)\n"); /* Park this modem */ s->training_stage = TRAINING_STAGE_PARKED; report_status_change(s, PUTBIT_TRAINING_FAILED); } break; case TRAINING_STAGE_TRAIN_ON_CDCD: /* Train on the scrambled CDCD section. */ bit = scrambled_training_bit(s); //span_log(&s->logging, SPAN_LOG_FLOW, "%5d %15.5f, %15.5f %15.5f, %15.5f\n", s->training_count, z.re, z.im, v29_9600_constellation[cdcd_pos[s->training_cd + bit]].re, v29_9600_constellation[cdcd_pos[s->training_cd + bit]].im); s->constellation_state = cdcd_pos[s->training_cd + bit]; target = &v29_9600_constellation[s->constellation_state]; track_carrier(s, &z, target); tune_equalizer(s, &z, target); if (++s->training_count >= V29_TRAINING_SEG_3_LEN - 48) { s->training_stage = TRAINING_STAGE_TRAIN_ON_CDCD_AND_TEST; s->training_error = 0.0f; s->carrier_track_i = 200.0f; s->carrier_track_p = 1000000.0f; } break; case TRAINING_STAGE_TRAIN_ON_CDCD_AND_TEST: /* Continue training on the scrambled CDCD section, but measure the quality of training too. */ bit = scrambled_training_bit(s); //span_log(&s->logging, SPAN_LOG_FLOW, "%5d %15.5f, %15.5f %15.5f, %15.5f\n", s->training_count, z.re, z.im, v29_9600_constellation[cdcd_pos[s->training_cd + bit]].re, v29_9600_constellation[cdcd_pos[s->training_cd + bit]].im); s->constellation_state = cdcd_pos[s->training_cd + bit]; target = &v29_9600_constellation[s->constellation_state]; track_carrier(s, &z, target); tune_equalizer(s, &z, target); /* Measure the training error */ zz = complex_subf(&z, target); s->training_error += powerf(&zz); if (++s->training_count >= V29_TRAINING_SEG_3_LEN) { span_log(&s->logging, SPAN_LOG_FLOW, "Constellation mismatch %f\n", s->training_error); if (s->training_error < 100.0f) { s->training_count = 0; s->training_error = 0.0f; s->constellation_state = 0; s->training_stage = TRAINING_STAGE_TEST_ONES; } else { span_log(&s->logging, SPAN_LOG_FLOW, "Training failed (convergence failed)\n"); /* Park this modem */ s->training_stage = TRAINING_STAGE_PARKED; report_status_change(s, PUTBIT_TRAINING_FAILED); } } break; case TRAINING_STAGE_TEST_ONES: /* We are in the test phase, where we check that we can receive reliably. We should get a run of 1's, 48 symbols (192 bits at 9600bps) long. */ //span_log(&s->logging, SPAN_LOG_FLOW, "%5d %15.5f, %15.5f\n", s->training_count, z.re, z.im); decode_baud(s, &z); target = &v29_9600_constellation[s->constellation_state]; /* Measure the training error */ zz = complex_subf(&z, target); s->training_error += powerf(&zz); if (++s->training_count >= V29_TRAINING_SEG_4_LEN) { if (s->training_error < 50.0f) { /* We are up and running */ span_log(&s->logging, SPAN_LOG_FLOW, "Training succeeded (constellation mismatch %f)\n", s->training_error); report_status_change(s, PUTBIT_TRAINING_SUCCEEDED); /* Apply some lag to the carrier off condition, to ensure the last few bits get pushed through the processing. */ s->signal_present = 60; s->training_stage = TRAINING_STAGE_NORMAL_OPERATION; equalizer_save(s); s->carrier_phase_rate_save = s->carrier_phase_rate; s->agc_scaling_save = s->agc_scaling; } else { /* Training has failed */ span_log(&s->logging, SPAN_LOG_FLOW, "Training failed (constellation mismatch %f)\n", s->training_error); /* Park this modem */ report_status_change(s, PUTBIT_TRAINING_FAILED); s->training_stage = TRAINING_STAGE_PARKED; } } break; case TRAINING_STAGE_PARKED: default: /* We failed to train! */ /* Park here until the carrier drops. */ target = &z; break; } if (s->qam_report) s->qam_report(s->qam_user_data, &z, target, s->constellation_state); } /*- End of function --------------------------------------------------------*/ int v29_rx(v29_rx_state_t *s, const int16_t amp[], int len) { int i; int j; int step; int16_t x; int32_t diff; complexf_t z; complexf_t zz; complexf_t sample; #if defined(SPANDSP_USE_FIXED_POINT) complexi_t zi; #endif int32_t power; float v; for (i = 0; i < len; i++) { s->rrc_filter[s->rrc_filter_step] = s->rrc_filter[s->rrc_filter_step + V29_RX_FILTER_STEPS] = amp[i]; if (++s->rrc_filter_step >= V29_RX_FILTER_STEPS) s->rrc_filter_step = 0; /* There should be no DC in the signal, but sometimes there is. We need to measure the power with the DC blocked, but not using a slow to respond DC blocker. Use the most elementary HPF. */ x = amp[i] >> 1; diff = x - s->last_sample; power = power_meter_update(&(s->power), diff); #if defined(IAXMODEM_STUFF) /* Quick power drop fudge */ diff = abs(diff); if (10*diff < s->high_sample) { if (++s->low_samples > 120) { power_meter_init(&(s->power), 4); s->high_sample = 0; s->low_samples = 0; } } else { s->low_samples = 0; if (diff > s->high_sample) s->high_sample = diff; } #endif s->last_sample = x; if (s->signal_present) { /* Look for power below turn-off threshold to turn the carrier off */ #if defined(IAXMODEM_STUFF) if (s->carrier_drop_pending || power < s->carrier_off_power) #else if (power < s->carrier_off_power) #endif { if (--s->signal_present <= 0) { /* Count down a short delay, to ensure we push the last few bits through the filters before stopping. */ v29_rx_restart(s, s->bit_rate, FALSE); report_status_change(s, PUTBIT_CARRIER_DOWN); continue; } #if defined(IAXMODEM_STUFF) /* Carrier has dropped, but the put_bit is pending the signal_present delay. */ s->carrier_drop_pending = TRUE; #endif } } else { /* Look for power exceeding turn-on threshold to turn the carrier on */ if (power < s->carrier_on_power) continue; s->signal_present = 1; #if defined(IAXMODEM_STUFF) s->carrier_drop_pending = FALSE; #endif report_status_change(s, PUTBIT_CARRIER_UP); } if (s->training_stage == TRAINING_STAGE_PARKED) continue; /* Only spend effort processing this data if the modem is not parked, after training failure. */ s->eq_put_step -= RX_PULSESHAPER_COEFF_SETS; step = -s->eq_put_step; if (step > RX_PULSESHAPER_COEFF_SETS - 1) step = RX_PULSESHAPER_COEFF_SETS - 1; if (step < 0) step += RX_PULSESHAPER_COEFF_SETS; #if defined(SPANDSP_USE_FIXED_POINT) zi.re = (int32_t) rx_pulseshaper[step][0].re*(int32_t) s->rrc_filter[s->rrc_filter_step]; for (j = 1; j < V29_RX_FILTER_STEPS; j++) zi.re += (int32_t) rx_pulseshaper[step][j].re*(int32_t) s->rrc_filter[j + s->rrc_filter_step]; sample.re = zi.re*s->agc_scaling; #else zz.re = rx_pulseshaper[step][0].re*s->rrc_filter[s->rrc_filter_step]; for (j = 1; j < V29_RX_FILTER_STEPS; j++) zz.re += rx_pulseshaper[step][j].re*s->rrc_filter[j + s->rrc_filter_step]; sample.re = zz.re*s->agc_scaling; #endif /* Symbol timing synchronisation band edge filters */ /* Low Nyquist band edge filter */ v = s->symbol_sync_low[0]*SYNC_LOW_BAND_EDGE_COEFF_0 + s->symbol_sync_low[1]*SYNC_LOW_BAND_EDGE_COEFF_1 + sample.re; s->symbol_sync_low[1] = s->symbol_sync_low[0]; s->symbol_sync_low[0] = v; /* High Nyquist band edge filter */ v = s->symbol_sync_high[0]*SYNC_HIGH_BAND_EDGE_COEFF_0 + s->symbol_sync_high[1]*SYNC_HIGH_BAND_EDGE_COEFF_1 + sample.re; s->symbol_sync_high[1] = s->symbol_sync_high[0]; s->symbol_sync_high[0] = v; /* Put things into the equalization buffer at T/2 rate. The symbol synchronisation will fiddle the step to align this with the symbols. */ if (s->eq_put_step <= 0) { if (s->training_stage == TRAINING_STAGE_SYMBOL_ACQUISITION) { /* Only AGC during the initial training */ s->agc_scaling = (1.0f/RX_PULSESHAPER_GAIN)*5.0f*0.25f/sqrtf(power); } /* Pulse shape while still at the carrier frequency, using a quadrature pair of filters. This results in a properly bandpass filtered complex signal, which can be brought directly to baseband by complex mixing. No further filtering, to remove mixer harmonics, is needed. */ step = -s->eq_put_step; if (step > RX_PULSESHAPER_COEFF_SETS - 1) step = RX_PULSESHAPER_COEFF_SETS - 1; #if defined(SPANDSP_USE_FIXED_POINT) zi.im = (int32_t) rx_pulseshaper[step][0].im*(int32_t) s->rrc_filter[s->rrc_filter_step]; for (j = 1; j < V29_RX_FILTER_STEPS; j++) zi.im += (int32_t) rx_pulseshaper[step][j].im*(int32_t) s->rrc_filter[j + s->rrc_filter_step]; sample.im = zi.im*s->agc_scaling; #else zz.im = rx_pulseshaper[step][0].im*s->rrc_filter[s->rrc_filter_step]; for (j = 1; j < V29_RX_FILTER_STEPS; j++) zz.im += rx_pulseshaper[step][j].im*s->rrc_filter[j + s->rrc_filter_step]; sample.im = zz.im*s->agc_scaling; #endif s->eq_put_step += RX_PULSESHAPER_COEFF_SETS*10/(3*2); /* Shift to baseband - since this is done in a full complex form, the result is clean, and requires no further filtering, apart from the equalizer. */ z = dds_lookup_complexf(s->carrier_phase); zz.re = sample.re*z.re - sample.im*z.im; zz.im = -sample.re*z.im - sample.im*z.re; process_half_baud(s, &zz); } dds_advancef(&(s->carrier_phase), s->carrier_phase_rate); } return 0; } /*- End of function --------------------------------------------------------*/ void v29_rx_set_put_bit(v29_rx_state_t *s, put_bit_func_t put_bit, void *user_data) { s->put_bit = put_bit; s->put_bit_user_data = user_data; } /*- End of function --------------------------------------------------------*/ void v29_rx_set_modem_status_handler(v29_rx_state_t *s, modem_tx_status_func_t handler, void *user_data) { s->status_handler = handler; s->status_user_data = user_data; } /*- End of function --------------------------------------------------------*/ int v29_rx_restart(v29_rx_state_t *s, int bit_rate, int old_train) { switch (bit_rate) { case 9600: s->training_cd = 0; break; case 7200: s->training_cd = 2; break; case 4800: s->training_cd = 4; break; default: return -1; } s->bit_rate = bit_rate; #if defined(SPANDSP_USE_FIXED_POINT) memset(s->rrc_filter, 0, sizeof(s->rrc_filter)); #else vec_zerof(s->rrc_filter, sizeof(s->rrc_filter)/sizeof(s->rrc_filter[0])); #endif s->rrc_filter_step = 0; s->scramble_reg = 0; s->training_scramble_reg = 0x2A; s->training_stage = TRAINING_STAGE_SYMBOL_ACQUISITION; s->training_count = 0; s->signal_present = 0; #if defined(IAXMODEM_STUFF) s->high_sample = 0; s->low_samples = 0; s->carrier_drop_pending = FALSE; #endif s->old_train = old_train; s->carrier_phase = 0; s->carrier_track_i = 8000.0f; s->carrier_track_p = 8000000.0f; power_meter_init(&(s->power), 4); s->constellation_state = 0; if (s->old_train) { s->carrier_phase_rate = s->carrier_phase_rate_save; s->agc_scaling = s->agc_scaling_save; equalizer_restore(s); } else { s->carrier_phase_rate = dds_phase_ratef(CARRIER_NOMINAL_FREQ); s->agc_scaling = 0.0017f/RX_PULSESHAPER_GAIN; equalizer_reset(s); } s->eq_skip = 0; s->last_sample = 0; /* Initialise the working data for symbol timing synchronisation */ s->symbol_sync_low[0] = 0.0f; s->symbol_sync_low[1] = 0.0f; s->symbol_sync_high[0] = 0.0f; s->symbol_sync_high[1] = 0.0f; s->symbol_sync_dc_filter[0] = 0.0f; s->symbol_sync_dc_filter[1] = 0.0f; s->baud_phase = 0.0f; s->baud_half = 0; s->total_baud_timing_correction = 0; return 0; } /*- End of function --------------------------------------------------------*/ v29_rx_state_t *v29_rx_init(v29_rx_state_t *s, int rate, put_bit_func_t put_bit, void *user_data) { if (s == NULL) { if ((s = (v29_rx_state_t *) malloc(sizeof(*s))) == NULL) return NULL; } memset(s, 0, sizeof(*s)); span_log_init(&s->logging, SPAN_LOG_NONE, NULL); span_log_set_protocol(&s->logging, "V.29 RX"); s->put_bit = put_bit; s->put_bit_user_data = user_data; /* The V.29 spec says the thresholds should be -31dBm and -26dBm, but that makes little sense. V.17 uses -48dBm and -43dBm, and there seems no good reason to cut off at a higher level (though at 9600bps and 7200bps, TCM should put V.17 sensitivity several dB ahead of V.29). */ /* The thresholds should be on at -26dBm0 and off at -31dBm0 */ v29_rx_signal_cutoff(s, -28.5f); v29_rx_restart(s, rate, FALSE); return s; } /*- End of function --------------------------------------------------------*/ int v29_rx_free(v29_rx_state_t *s) { free(s); return 0; } /*- End of function --------------------------------------------------------*/ void v29_rx_set_qam_report_handler(v29_rx_state_t *s, qam_report_handler_t handler, void *user_data) { s->qam_report = handler; s->qam_user_data = user_data; } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/super_tone_rx.c0000644000175000017500000003425011150047216020721 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * super_tone_rx.c - Flexible telephony supervisory tone detection. * * Written by Steve Underwood * * Copyright (C) 2003 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: super_tone_rx.c,v 1.29 2008/07/25 13:56:54 steveu Exp $ */ /*! \file */ #if defined(HAVE_CONFIG_H) #include "config.h" #endif #include #include #include #include #include #include #include #include "floating_fudge.h" #if defined(HAVE_TGMATH_H) #include #endif #if defined(HAVE_MATH_H) #include #endif #include "spandsp/telephony.h" #include "spandsp/complex.h" #include "spandsp/vector_float.h" #include "spandsp/complex_vector_float.h" #include "spandsp/tone_detect.h" #include "spandsp/tone_generate.h" #include "spandsp/super_tone_rx.h" #if defined(SPANDSP_USE_FIXED_POINT) #define DETECTION_THRESHOLD 16439 /* -42dBm0 */ #define TONE_TWIST 4 /* 6dB */ #define TONE_TO_TOTAL_ENERGY 64 /* -3dB */ #else #define DETECTION_THRESHOLD 269338317.0f /* -42dBm0 [((128.0*32768.0/1.4142)*10^((-42 - DBM0_MAX_SINE_POWER)/20.0))^2 => 269338317.0] */ #define TONE_TWIST 3.981f /* 6dB */ #define TONE_TO_TOTAL_ENERGY 1.995f /* 3dB */ #define DTMF_TO_TOTAL_ENERGY 64.152f /* -3dB [BINS*10^(-3/10.0)] */ #endif static int add_super_tone_freq(super_tone_rx_descriptor_t *desc, int freq) { int i; if (freq == 0) return -1; /* Look for an existing frequency */ for (i = 0; i < desc->used_frequencies; i++) { if (desc->pitches[i][0] == freq) return desc->pitches[i][1]; } /* Look for an existing tone which is very close. We may need to merge the detectors. */ for (i = 0; i < desc->used_frequencies; i++) { if ((desc->pitches[i][0] - 10) <= freq && freq <= (desc->pitches[i][0] + 10)) { /* Merge these two */ desc->pitches[desc->used_frequencies][0] = freq; desc->pitches[desc->used_frequencies][1] = i; make_goertzel_descriptor(&desc->desc[desc->pitches[i][1]], (float) (freq + desc->pitches[i][0])/2, BINS); desc->used_frequencies++; return desc->pitches[i][1]; } } desc->pitches[i][0] = freq; desc->pitches[i][1] = desc->monitored_frequencies; if (desc->monitored_frequencies%5 == 0) { desc->desc = (goertzel_descriptor_t *) realloc(desc->desc, (desc->monitored_frequencies + 5)*sizeof(goertzel_descriptor_t)); } make_goertzel_descriptor(&desc->desc[desc->monitored_frequencies++], (float) freq, BINS); desc->used_frequencies++; return desc->pitches[i][1]; } /*- End of function --------------------------------------------------------*/ int super_tone_rx_add_tone(super_tone_rx_descriptor_t *desc) { if (desc->tones%5 == 0) { desc->tone_list = (super_tone_rx_segment_t **) realloc(desc->tone_list, (desc->tones + 5)*sizeof(super_tone_rx_segment_t *)); desc->tone_segs = (int *) realloc(desc->tone_segs, (desc->tones + 5)*sizeof(int)); } desc->tone_list[desc->tones] = NULL; desc->tone_segs[desc->tones] = 0; desc->tones++; return desc->tones - 1; } /*- End of function --------------------------------------------------------*/ int super_tone_rx_add_element(super_tone_rx_descriptor_t *desc, int tone, int f1, int f2, int min, int max) { int step; step = desc->tone_segs[tone]; if (step%5 == 0) { desc->tone_list[tone] = (super_tone_rx_segment_t *) realloc(desc->tone_list[tone], (step + 5)*sizeof(super_tone_rx_segment_t)); } desc->tone_list[tone][step].f1 = add_super_tone_freq(desc, f1); desc->tone_list[tone][step].f2 = add_super_tone_freq(desc, f2); desc->tone_list[tone][step].min_duration = min*8; desc->tone_list[tone][step].max_duration = (max == 0) ? 0x7FFFFFFF : max*8; desc->tone_segs[tone]++; return step; } /*- End of function --------------------------------------------------------*/ static int test_cadence(super_tone_rx_segment_t *pattern, int steps, super_tone_rx_segment_t *test, int rotation) { int i; int j; if (rotation >= 0) { /* Check only for the sustaining of a tone in progress. This means we only need to check each block if the latest step is compatible with the tone template. */ if (steps < 0) { /* A -ve value for steps indicates we just changed step, and need to check the last one ended within spec. If we don't do this extra test a low duration segment might be accepted as OK. */ steps = -steps; j = (rotation + steps - 2)%steps; if (pattern[j].f1 != test[8].f1 || pattern[j].f2 != test[8].f2) return 0; if (pattern[j].min_duration > test[8].min_duration*BINS || pattern[j].max_duration < test[8].min_duration*BINS) { return 0; } } j = (rotation + steps - 1)%steps; if (pattern[j].f1 != test[9].f1 || pattern[j].f2 != test[9].f2) return 0; if (pattern[j].max_duration < test[9].min_duration*BINS) return 0; } else { /* Look for a complete template match. */ for (i = 0; i < steps; i++) { j = i + 10 - steps; if (pattern[i].f1 != test[j].f1 || pattern[i].f2 != test[j].f2) return 0; if (pattern[i].min_duration > test[j].min_duration*BINS || pattern[i].max_duration < test[j].min_duration*BINS) { return 0; } } } return 1; } /*- End of function --------------------------------------------------------*/ super_tone_rx_descriptor_t *super_tone_rx_make_descriptor(super_tone_rx_descriptor_t *desc) { if (desc == NULL) { if ((desc = (super_tone_rx_descriptor_t *) malloc(sizeof(*desc))) == NULL) return NULL; } desc->tone_list = NULL; desc->tone_segs = NULL; desc->used_frequencies = 0; desc->monitored_frequencies = 0; desc->desc = NULL; desc->tones = 0; return desc; } /*- End of function --------------------------------------------------------*/ int super_tone_rx_free_descriptor(super_tone_rx_descriptor_t *desc) { if (desc) free(desc); return 0; } /*- End of function --------------------------------------------------------*/ void super_tone_rx_segment_callback(super_tone_rx_state_t *s, void (*callback)(void *data, int f1, int f2, int duration)) { s->segment_callback = callback; } /*- End of function --------------------------------------------------------*/ super_tone_rx_state_t *super_tone_rx_init(super_tone_rx_state_t *s, super_tone_rx_descriptor_t *desc, tone_report_func_t callback, void *user_data) { int i; if (desc == NULL) return NULL; if (callback == NULL) return NULL; if (s == NULL) { if ((s = (super_tone_rx_state_t *) malloc(sizeof(*s) + desc->monitored_frequencies*sizeof(goertzel_state_t))) == NULL) return NULL; } for (i = 0; i < 11; i++) { s->segments[i].f1 = -1; s->segments[i].f2 = -1; s->segments[i].min_duration = 0; } s->segment_callback = NULL; s->tone_callback = callback; s->callback_data = user_data; if (desc) s->desc = desc; s->detected_tone = -1; s->energy = 0.0f; for (i = 0; i < desc->monitored_frequencies; i++) goertzel_init(&s->state[i], &s->desc->desc[i]); return s; } /*- End of function --------------------------------------------------------*/ int super_tone_rx_free(super_tone_rx_state_t *s) { if (s) free(s); return 0; } /*- End of function --------------------------------------------------------*/ static void super_tone_chunk(super_tone_rx_state_t *s) { int i; int j; int k1; int k2; #if defined(SPANDSP_USE_FIXED_POINT) int32_t res[BINS/2]; #else float res[BINS/2]; #endif for (i = 0; i < s->desc->monitored_frequencies; i++) res[i] = goertzel_result(&s->state[i]); /* Find our two best monitored frequencies, which also have adequate energy. */ if (s->energy < DETECTION_THRESHOLD) { k1 = -1; k2 = -1; } else { if (res[0] > res[1]) { k1 = 0; k2 = 1; } else { k1 = 1; k2 = 0; } for (j = 2; j < s->desc->monitored_frequencies; j++) { if (res[j] >= res[k1]) { k2 = k1; k1 = j; } else if (res[j] >= res[k2]) { k2 = j; } } if ((res[k1] + res[k2]) < TONE_TO_TOTAL_ENERGY*s->energy) { k1 = -1; k2 = -1; } else if (res[k1] > TONE_TWIST*res[k2]) { k2 = -1; } else if (k2 < k1) { j = k1; k1 = k2; k2 = j; } } /* See if this differs from last time. */ if (k1 != s->segments[10].f1 || k2 != s->segments[10].f2) { /* It is different, but this might just be a transitional quirk, or a one shot hiccup (eg due to noise). Only if this same thing is seen a second time should we change state. */ s->segments[10].f1 = k1; s->segments[10].f2 = k2; /* While things are hopping around, consider this a continuance of the previous state. */ s->segments[9].min_duration++; } else { if (k1 != s->segments[9].f1 || k2 != s->segments[9].f2) { if (s->detected_tone >= 0) { /* Test for the continuance of the existing tone pattern, based on our new knowledge of an entire segment length. */ if (!test_cadence(s->desc->tone_list[s->detected_tone], -s->desc->tone_segs[s->detected_tone], s->segments, s->rotation++)) { s->detected_tone = -1; s->tone_callback(s->callback_data, s->detected_tone, -10, 0); } } if (s->segment_callback) { s->segment_callback(s->callback_data, s->segments[9].f1, s->segments[9].f2, s->segments[9].min_duration*BINS/8); } memcpy (&s->segments[0], &s->segments[1], 9*sizeof(s->segments[0])); s->segments[9].f1 = k1; s->segments[9].f2 = k2; s->segments[9].min_duration = 1; } else { /* This is a continuance of the previous state */ if (s->detected_tone >= 0) { /* Test for the continuance of the existing tone pattern. We must do this here, so we can sense the discontinuance of the tone on an excessively long segment. */ if (!test_cadence(s->desc->tone_list[s->detected_tone], s->desc->tone_segs[s->detected_tone], s->segments, s->rotation)) { s->detected_tone = -1; s->tone_callback(s->callback_data, s->detected_tone, -10, 0); } } s->segments[9].min_duration++; } } if (s->detected_tone < 0) { /* Test for the start of any of the monitored tone patterns */ for (j = 0; j < s->desc->tones; j++) { if (test_cadence(s->desc->tone_list[j], s->desc->tone_segs[j], s->segments, -1)) { s->detected_tone = j; s->rotation = 0; s->tone_callback(s->callback_data, s->detected_tone, -10, 0); break; } } } #if defined(SPANDSP_USE_FIXED_POINT) s->energy = 0; #else s->energy = 0.0f; #endif } /*- End of function --------------------------------------------------------*/ int super_tone_rx(super_tone_rx_state_t *s, const int16_t amp[], int samples) { int i; int x; int sample; #if defined(SPANDSP_USE_FIXED_POINT) int16_t xamp; #else float xamp; #endif x = 0; for (sample = 0; sample < samples; sample += x) { for (i = 0; i < s->desc->monitored_frequencies; i++) x = goertzel_update(&s->state[i], amp + sample, samples - sample); for (i = 0; i < x; i++) { xamp = goertzel_preadjust_amp(amp[sample + i]); #if defined(SPANDSP_USE_FIXED_POINT) s->energy += ((int32_t) xamp*xamp); #else s->energy += xamp*xamp; #endif } if (s->state[0].current_sample >= BINS) { /* We have finished a Goertzel block. */ super_tone_chunk(s); s->energy = 0; } } return samples; } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/v17tx_fixed_rrc.h0000644000175000017500000000404511150047216021047 0ustar julienjulien#define TX_PULSESHAPER_GAIN 0.948561f #define TX_PULSESHAPER_COEFF_SETS 10 static const int16_t tx_pulseshaper[TX_PULSESHAPER_COEFF_SETS][9] = { { -89, /* Filter 0 */ -561, 2002, -5223, 19071, 19071, -5223, 2002, -561 }, { 97, /* Filter 1 */ -922, 2553, -6054, 23507, 14325, -3959, 1300, -183 }, { 297, /* Filter 2 */ -1210, 2855, -6268, 27331, 9577, -2461, 548, 159 }, { 478, /* Filter 3 */ -1370, 2827, -5713, 30276, 5120, -924, -157, 426 }, { 605, /* Filter 4 */ -1359, 2421, -4291, 32132, 1207, 482, -741, 593 }, { 650, /* Filter 5 */ -1150, 1627, -1970, 32767, -1970, 1627, -1150, 650 }, { 593, /* Filter 6 */ -741, 482, 1207, 32132, -4291, 2421, -1359, 605 }, { 426, /* Filter 7 */ -157, -924, 5120, 30276, -5713, 2827, -1370, 478 }, { 159, /* Filter 8 */ 548, -2461, 9577, 27331, -6268, 2855, -1210, 297 }, { -183, /* Filter 9 */ 1300, -3959, 14325, 23507, -6054, 2553, -922, 97 } }; iaxmodem-1.2.0/lib/spandsp/src/floating_fudge.h0000644000175000017500000002631611150047216021013 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * floating_fudge.h - A bunch of shims, to use double maths * functions on platforms which lack the * float versions with an 'f' at the end, * and to deal with the vaguaries of lrint(). * * Written by Steve Underwood * * Copyright (C) 2008 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: floating_fudge.h,v 1.4 2008/07/10 15:46:10 steveu Exp $ */ #if !defined(_FLOATING_FUDGE_H_) #define _FLOATING_FUDGE_H_ #if defined(__cplusplus) extern "C" { #endif #if !defined(HAVE_SINF) static __inline__ float sinf(float x) { return (float) sin((double) x); } #endif #if !defined(HAVE_COSF) static __inline__ float cosf(float x) { return (float) cos((double) x); } #endif #if !defined(HAVE_TANF) static __inline__ float tanf(float x) { return (float) tan((double) x); } #endif #if !defined(HAVE_ASINF) static __inline__ float asinf(float x) { return (float) asin((double) x); } #endif #if !defined(HAVE_ACOSF) static __inline__ float acosf(float x) { return (float) acos((double) x); } #endif #if !defined(HAVE_ATANF) static __inline__ float atanf(float x) { return (float) atan((double) x); } #endif #if !defined(HAVE_ATAN2F) static __inline__ float atan2f(float y, float x) { return (float) atan2((double) y, (double) x); } #endif #if !defined(HAVE_CEILF) static __inline__ float ceilf(float x) { return (float) ceil((double) x); } #endif #if !defined(HAVE_FLOORF) static __inline__ float floorf(float x) { return (float) floor((double) x); } #endif #if !defined(HAVE_POWF) static __inline__ float powf(float x, float y) { return (float) pow((double) x, (double) y); } #endif #if !defined(HAVE_EXPF) static __inline__ float expf(float x) { return (float) expf((double) x); } #endif #if !defined(HAVE_LOGF) static __inline__ float logf(float x) { return (float) logf((double) x); } #endif #if !defined(HAVE_LOG10F) static __inline__ float log10f(float x) { return (float) log10((double) x); } #endif /* The following code, to handle issues with lrint() and lrintf() on various * platforms, is adapted from similar code in libsndfile, which is: * * Copyright (C) 2001-2004 Erik de Castro Lopo * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * This 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 Lesser General Public License for more details. */ /* * On Intel Pentium processors (especially PIII and probably P4), converting * from float to int is very slow. To meet the C specs, the code produced by * most C compilers targeting Pentium needs to change the FPU rounding mode * before the float to int conversion is performed. * * Changing the FPU rounding mode causes the FPU pipeline to be flushed. It * is this flushing of the pipeline which is so slow. * * Fortunately the ISO C99 specification defines the functions lrint, lrintf, * llrint and llrintf which fix this problem as a side effect. * * On Unix-like systems, the configure process should have detected the * presence of these functions. If they weren't found we have to replace them * here with a standard C cast. */ /* * The C99 prototypes for these functions are as follows: * * int rintf(float x); * int rint(double x); * long int lrintf(float x); * long int lrint(double x); * long long int llrintf(float x); * long long int llrint(double x); * * The presence of the required functions are detected during the configure * process and the values HAVE_LRINT and HAVE_LRINTF are set accordingly in * the config file. */ #if defined(__CYGWIN__) /* * CYGWIN has lrint and lrintf functions, but they are slow and buggy: * http://sourceware.org/ml/cygwin/2005-06/msg00153.html * http://sourceware.org/ml/cygwin/2005-09/msg00047.html * The latest version of cygwin seems to have made no effort to fix this. * These replacement functions (pulled from the Public Domain MinGW * math.h header) replace the native versions. */ static __inline__ long int lrint(double x) { long int retval; __asm__ __volatile__ ( "fistpl %0" : "=m" (retval) : "t" (x) : "st" ); return retval; } static __inline__ long int lrintf(float x) { long int retval; __asm__ __volatile__ ( "fistpl %0" : "=m" (retval) : "t" (x) : "st" ); return retval; } static __inline__ long int lfastrint(double x) { long int retval; __asm__ __volatile__ ( "fistpl %0" : "=m" (retval) : "t" (x) : "st" ); return retval; } static __inline__ long int lfastrintf(float x) { long int retval; __asm__ __volatile__ ( "fistpl %0" : "=m" (retval) : "t" (x) : "st" ); return retval; } #elif defined(HAVE_LRINT) && defined(HAVE_LRINTF) #if defined(__i386__) /* These routines are guaranteed fast on an i386 machine. Using the built in lrint() and lrintf() should be similar, but they may not always be enabled. Sometimes, especially with "-O0", you might get slow calls to routines. */ static __inline__ long int lfastrint(double x) { long int retval; __asm__ __volatile__ ( "fistpl %0" : "=m" (retval) : "t" (x) : "st" ); return retval; } static __inline__ long int lfastrintf(float x) { long int retval; __asm__ __volatile__ ( "fistpl %0" : "=m" (retval) : "t" (x) : "st" ); return retval; } #elif defined(__x86_64__) /* On an x86_64 machine, the fastest thing seems to be a pure assignment from a double or float to an int. It looks like the design on the x86_64 took account of the default behaviour specified for C. */ static __inline__ long int lfastrint(double x) { return (long int) (x); } static __inline__ long int lfastrintf(float x) { return (long int) (x); } #elif defined(__ppc__) || defined(__powerpc__) static __inline__ long int lfastrint(register double x) { int res[2]; __asm__ __volatile__ ( "fctiw %1, %1\n\t" "stfd %1, %0" : "=m" (res) /* Output */ : "f" (x) /* Input */ : "memory" ); return res[1]; } static __inline__ long int lfastrintf(register float x) { int res[2]; __asm__ __volatile__ ( "fctiw %1, %1\n\t" "stfd %1, %0" : "=m" (res) /* Output */ : "f" (x) /* Input */ : "memory" ); return res[1]; } #endif #elif defined(WIN32) || defined(_WIN32) /* * Win32 doesn't seem to have the lrint() and lrintf() functions. * Therefore implement inline versions of these functions here. */ __inline long int lrint(double x) { long int i; _asm { fld x fistp i }; return i; } __inline long int lrintf(float x) { long int i; _asm { fld x fistp i }; return ir; } __inline long int lfastrint(double x) { long int i; _asm { fld x fistp i }; return i; } __inline long int lfastrintf(float x) { long int i; _asm { fld x fistp i }; return i; } #elif defined(WIN64) || defined(_WIN64) /* * Win64 machines will do best with a simple assignment. */ __inline long int lfastrint(double x) { return (long int) (x); } __inline long int lfastrintf(float x) { return (long int) (x); } #elif defined(__MWERKS__) && defined(macintosh) /* This MacOS 9 solution was provided by Stephane Letz */ long int __inline__ lfastrint(register double x) { long int res[2]; asm { fctiw x, x stfd x, res } return res[1]; } long int __inline__ lfastrintf(register float x) { long int res[2]; asm { fctiw x, x stfd x, res } return res[1]; } #elif defined(__MACH__) && defined(__APPLE__) && (defined(__ppc__) || defined(__powerpc__)) /* For Apple Mac OS/X - do recent versions still need this? */ static __inline__ long int lfastrint(register double x) { int res[2]; __asm__ __volatile__ ( "fctiw %1, %1\n\t" "stfd %1, %0" : "=m" (res) /* Output */ : "f" (x) /* Input */ : "memory" ); return res[1]; } static __inline__ long int lfastrintf(register float x) { int res[2]; __asm__ __volatile__ ( "fctiw %1, %1\n\t" "stfd %1, %0" : "=m" (res) /* Output */ : "f" (x) /* Input */ : "memory" ); return res[1]; } #else /* There is nothing else to do, but use a simple casting operation, instead of a real rint() type function. Since we are only trying to use rint() to speed up conversions, the accuracy issues related to changing the rounding scheme are of little concern to us. */ #if !defined(__sgi) #warning "No usable lrint() and lrintf() functions available." #warning "Replacing these functions with a simple C cast." #endif static __inline__ long int lfastrint(double x) { return (long int) (x); } static __inline__ long int lfastrintf(float x) { return (long int) (x); } #endif #if defined(__cplusplus) } #endif #endif /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/v17tx_floating_rrc.h0000644000175000017500000000536311150047216021557 0ustar julienjulien#define TX_PULSESHAPER_GAIN 1.000000f #define TX_PULSESHAPER_COEFF_SETS 10 static const float tx_pulseshaper[TX_PULSESHAPER_COEFF_SETS][9] = { { -0.0028949651f, /* Filter 0 */ -0.0180558826f, 0.0644370007f, -0.1680546408f, 0.6136031185f, 0.6136031185f, -0.1680546408f, 0.0644370007f, -0.0180558826f }, { 0.0031457252f, /* Filter 1 */ -0.0296755127f, 0.0821537989f, -0.1948071639f, 0.7563219340f, 0.4608861696f, -0.1273859874f, 0.0418434527f, -0.0059021756f }, { 0.0095859914f, /* Filter 2 */ -0.0389394461f, 0.0918555164f, -0.2016880165f, 0.8793516522f, 0.3081344924f, -0.0792085168f, 0.0176601547f, 0.0051283313f }, { 0.0153896886f, /* Filter 3 */ -0.0441001627f, 0.0909724632f, -0.1838386257f, 0.9741012232f, 0.1647552896f, -0.0297442695f, -0.0050682351f, 0.0137350965f }, { 0.0194884074f, /* Filter 4 */ -0.0437412555f, 0.0779044290f, -0.1380831525f, 1.0338273601f, 0.0388498601f, 0.0155354866f, -0.0238603903f, 0.0191007897f }, { 0.0209425254f, /* Filter 5 */ -0.0370198705f, 0.0523524598f, -0.0633894611f, 1.0542286928f, -0.0633894611f, 0.0523524598f, -0.0370198705f, 0.0209425254f }, { 0.0191007897f, /* Filter 6 */ -0.0238603903f, 0.0155354866f, 0.0388498602f, 1.0338273601f, -0.1380831525f, 0.0779044290f, -0.0437412555f, 0.0194884074f }, { 0.0137350965f, /* Filter 7 */ -0.0050682351f, -0.0297442695f, 0.1647552896f, 0.9741012231f, -0.1838386257f, 0.0909724632f, -0.0441001627f, 0.0153896885f }, { 0.0051283313f, /* Filter 8 */ 0.0176601547f, -0.0792085168f, 0.3081344925f, 0.8793516522f, -0.2016880165f, 0.0918555164f, -0.0389394461f, 0.0095859914f }, { -0.0059021756f, /* Filter 9 */ 0.0418434528f, -0.1273859874f, 0.4608861697f, 0.7563219340f, -0.1948071639f, 0.0821537989f, -0.0296755127f, 0.0031457252f } }; iaxmodem-1.2.0/lib/spandsp/src/gsm0610_local.h0000644000175000017500000001600111150047216020273 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * gsm0610_local.h - GSM 06.10 full rate speech codec. * * Written by Steve Underwood * * Copyright (C) 2006 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * This code is based on the widely used GSM 06.10 code available from * http://kbs.cs.tu-berlin.de/~jutta/toast.html * * $Id: gsm0610_local.h,v 1.10 2008/04/17 14:26:56 steveu Exp $ */ #if !defined(_GSM0610_LOCAL_H_) #define _GSM0610_LOCAL_H_ #define GSM0610_FRAME_LEN 160 #define GSM0610_MAGIC 0xD static __inline__ int16_t gsm_add(int16_t a, int16_t b) { #if defined(__GNUC__) && defined(__i386__) __asm__ __volatile__( " addw %2,%0;\n" " jno 0f;\n" " movw $0x7fff,%0;\n" " adcw $0,%0;\n" "0:" : "=r" (a) : "0" (a), "ir" (b) : "cc" ); return a; #else int32_t sum; sum = (int32_t) a + (int32_t) b; return saturate(sum); #endif } /*- End of function --------------------------------------------------------*/ static __inline__ int32_t gsm_l_add(int32_t a, int32_t b) { #if defined(__i386__) __asm__ __volatile__( " addl %2,%0;\n" " jno 0f;\n" " movl $0x7fffffff,%0;\n" " adcl $0,%0;\n" "0:" : "=r" (a) : "0" (a), "ir" (b) : "cc" ); return a; #else uint32_t A; if (a < 0) { if (b >= 0) return a + b; /*endif*/ A = (uint32_t) -(a + 1) + (uint32_t) -(b + 1); return (A >= INT32_MAX) ? INT32_MIN : -(int32_t) A - 2; } /*endif*/ if (b <= 0) return a + b; /*endif*/ A = (uint32_t) a + (uint32_t) b; return (A > INT32_MAX) ? INT32_MAX : A; #endif } /*- End of function --------------------------------------------------------*/ static __inline__ int16_t gsm_sub(int16_t a, int16_t b) { int32_t diff; diff = (int32_t) a - (int32_t) b; return saturate(diff); } /*- End of function --------------------------------------------------------*/ static __inline__ int16_t gsm_mult(int16_t a, int16_t b) { if (a == INT16_MIN && b == INT16_MIN) return INT16_MAX; /*endif*/ return (int16_t) (((int32_t) a * (int32_t) b) >> 15); } /*- End of function --------------------------------------------------------*/ static __inline__ int32_t gsm_l_mult(int16_t a, int16_t b) { assert (a != INT16_MIN || b != INT16_MIN); return ((int32_t) a * (int32_t) b) << 1; } /*- End of function --------------------------------------------------------*/ static __inline__ int16_t gsm_mult_r(int16_t a, int16_t b) { int32_t prod; if (b == INT16_MIN && a == INT16_MIN) return INT16_MAX; /*endif*/ prod = (int32_t) a * (int32_t) b + 16384; prod >>= 15; return (int16_t) (prod & 0xFFFF); } /*- End of function --------------------------------------------------------*/ static __inline__ int16_t gsm_abs(int16_t a) { return (a == INT16_MIN) ? INT16_MAX : (int16_t) abs(a); } /*- End of function --------------------------------------------------------*/ static __inline__ int16_t gsm_asr(int16_t a, int n) { if (n >= 16) return (int16_t) (-(a < 0)); /*endif*/ if (n <= -16) return 0; /*endif*/ if (n < 0) return (int16_t) (a << -n); /*endif*/ return (int16_t) (a >> n); } /*- End of function --------------------------------------------------------*/ static __inline__ int16_t gsm_asl(int16_t a, int n) { if (n >= 16) return 0; /*endif*/ if (n <= -16) return (int16_t) (-(a < 0)); /*endif*/ if (n < 0) return gsm_asr(a, -n); /*endif*/ return (int16_t) (a << n); } /*- End of function --------------------------------------------------------*/ extern void gsm0610_long_term_predictor(gsm0610_state_t *s, int16_t d[40], int16_t *dp, /* [-120..-1] d' IN */ int16_t e[40], int16_t dpp[40], int16_t *Nc, int16_t *bc); extern void gsm0610_lpc_analysis(gsm0610_state_t *s, int16_t amp[160], int16_t LARc[8]); extern void gsm0610_preprocess(gsm0610_state_t *s, const int16_t amp[], int16_t so[]); extern void gsm0610_short_term_analysis_filter(gsm0610_state_t *s, int16_t LARc[8], int16_t amp[160]); extern void gsm0610_long_term_synthesis_filtering(gsm0610_state_t *s, int16_t Ncr, int16_t bcr, int16_t erp[40], int16_t *drp); /* [-120..-1] IN, [0..40] OUT */ extern void gsm0610_rpe_decoding(gsm0610_state_t *s, int16_t xmaxcr, int16_t Mcr, int16_t *xMcr, /* [0..12], 3 bits IN */ int16_t erp[40]); extern void gsm0610_rpe_encoding(gsm0610_state_t *s, int16_t *e, /* [-5..-1][0..39][40..44] IN/OUT */ int16_t *xmaxc, int16_t *Mc, int16_t xMc[13]); extern void gsm0610_short_term_synthesis_filter(gsm0610_state_t *s, int16_t LARcr[8], int16_t drp[40], int16_t amp[160]); extern int16_t gsm0610_norm(int32_t a); #if defined(__GNUC__) && defined(__i386__) void gsm0610_vec_vsraw(const int16_t *p, int n, int bits); int32_t gsm0610_vec_iprod(const int16_t *p, const int16_t *q, int n); int32_t gsm0610_vec_maxmin(const int16_t *p, int n, int16_t *out); int32_t gsm0610_max_cross_corr(const int16_t *wt, const int16_t *dp, int16_t *Nc_out); #endif #endif /*- End of include ---------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/time_scale.c0000644000175000017500000001735211150047216020136 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * time_scale.c - Time scaling for linear speech data * * Written by Steve Underwood * * Copyright (C) 2004 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: time_scale.c,v 1.22 2008/07/02 14:48:26 steveu Exp $ */ /*! \file */ #if defined(HAVE_CONFIG_H) #include #endif #include #include #include #include #include #include #include #include "floating_fudge.h" #if defined(HAVE_TGMATH_H) #include #endif #if defined(HAVE_MATH_H) #include #endif #include "spandsp/telephony.h" #include "spandsp/time_scale.h" /* Time scaling for speech, based on the Pointer Interval Controlled OverLap and Add (PICOLA) method, developed by Morita Naotaka. */ static __inline__ int amdf_pitch(int min_pitch, int max_pitch, int16_t amp[], int len) { int i; int j; int acc; int min_acc; int pitch; pitch = min_pitch; min_acc = INT_MAX; for (i = max_pitch; i <= min_pitch; i++) { acc = 0; for (j = 0; j < len; j++) acc += abs(amp[i + j] - amp[j]); if (acc < min_acc) { min_acc = acc; pitch = i; } } return pitch; } /*- End of function --------------------------------------------------------*/ static __inline__ void overlap_add(int16_t amp1[], int16_t amp2[], int len) { int i; float weight; float step; step = 1.0f/len; weight = 0.0f; for (i = 0; i < len; i++) { /* TODO: saturate */ amp2[i] = (int16_t) ((float) amp1[i]*(1.0f - weight) + (float) amp2[i]*weight); weight += step; } } /*- End of function --------------------------------------------------------*/ int time_scale_rate(time_scale_state_t *s, float rate) { if (rate <= 0.0f) return -1; /*endif*/ if (rate >= 0.99f && rate <= 1.01f) { /* Treat rate close to normal speed as exactly normal speed, and avoid divide by zero, and other numerical problems. */ rate = 1.0f; } else if (rate < 1.0f) { s->rcomp = rate/(1.0f - rate); } else { s->rcomp = 1.0f/(rate - 1.0f); } /*endif*/ s->rate = rate; return 0; } /*- End of function --------------------------------------------------------*/ time_scale_state_t *time_scale_init(time_scale_state_t *s, float rate) { int alloced; alloced = FALSE; if (s == NULL) { if ((s = (time_scale_state_t *) malloc(sizeof (*s))) == NULL) return NULL; /*endif*/ alloced = TRUE; } /*endif*/ if (time_scale_rate(s, rate)) { if (alloced) free(s); return NULL; } /*endif*/ s->rate_nudge = 0.0f; s->fill = 0; s->lcp = 0; return s; } /*- End of function --------------------------------------------------------*/ int time_scale_free(time_scale_state_t *s) { free(s); return 0; } /*- End of function --------------------------------------------------------*/ int time_scale(time_scale_state_t *s, int16_t out[], int16_t in[], int len) { double lcpf; int pitch; int out_len; int in_len; int k; out_len = 0; in_len = 0; /* Top up the buffer */ if (s->fill + len < TIME_SCALE_BUF_LEN) { /* Cannot continue without more samples */ memcpy(s->buf + s->fill, in, sizeof(int16_t)*len); s->fill += len; return out_len; } k = (TIME_SCALE_BUF_LEN - s->fill); memcpy(s->buf + s->fill, in, sizeof(int16_t)*k); in_len += k; s->fill = TIME_SCALE_BUF_LEN; while (s->fill == TIME_SCALE_BUF_LEN) { while (s->lcp >= TIME_SCALE_BUF_LEN) { memcpy(out + out_len, s->buf, sizeof(int16_t)*TIME_SCALE_BUF_LEN); out_len += TIME_SCALE_BUF_LEN; if (len - in_len < TIME_SCALE_BUF_LEN) { /* Cannot continue without more samples */ memcpy(s->buf, in + in_len, sizeof(int16_t)*(len - in_len)); s->fill = len - in_len; s->lcp -= TIME_SCALE_BUF_LEN; return out_len; } memcpy(s->buf, in + in_len, sizeof(int16_t)*TIME_SCALE_BUF_LEN); in_len += TIME_SCALE_BUF_LEN; s->lcp -= TIME_SCALE_BUF_LEN; } if (s->lcp > 0) { memcpy(out + out_len, s->buf, sizeof(int16_t)*s->lcp); out_len += s->lcp; memcpy(s->buf, s->buf + s->lcp, sizeof(int16_t)*(TIME_SCALE_BUF_LEN - s->lcp)); if (len - in_len < s->lcp) { /* Cannot continue without more samples */ memcpy(s->buf + (TIME_SCALE_BUF_LEN - s->lcp), in + in_len, sizeof(int16_t)*(len - in_len)); s->fill = TIME_SCALE_BUF_LEN - s->lcp + len - in_len; s->lcp = 0; return out_len; } memcpy(s->buf + (TIME_SCALE_BUF_LEN - s->lcp), in + in_len, sizeof(int16_t)*s->lcp); in_len += s->lcp; s->lcp = 0; } if (s->rate == 1.0f) { s->lcp = 0x7FFFFFFF; } else { pitch = amdf_pitch(SAMPLE_RATE/TIME_SCALE_MIN_PITCH, SAMPLE_RATE/TIME_SCALE_MAX_PITCH, s->buf, SAMPLE_RATE/TIME_SCALE_MIN_PITCH); lcpf = (double) pitch*s->rcomp; /* Nudge around to compensate for fractional samples */ s->lcp = (int) lcpf; /* Note that s->lcp and lcpf are not the same, as lcpf has a fractional part, and s->lcp doesn't */ s->rate_nudge += s->lcp - lcpf; if (s->rate_nudge >= 0.5f) { s->lcp--; s->rate_nudge -= 1.0f; } else if (s->rate_nudge <= -0.5f) { s->lcp++; s->rate_nudge += 1.0f; } if (s->rate < 1.0f) { /* Speed up - drop a chunk of data */ overlap_add(s->buf, s->buf + pitch, pitch); memcpy(&s->buf[pitch], &s->buf[2*pitch], sizeof(int16_t)*(TIME_SCALE_BUF_LEN - 2*pitch)); if (len - in_len < pitch) { /* Cannot continue without more samples */ memcpy(s->buf + TIME_SCALE_BUF_LEN - pitch, in + in_len, sizeof(int16_t)*(len - in_len)); s->fill += (len - in_len - pitch); return out_len; } memcpy(s->buf + TIME_SCALE_BUF_LEN - pitch, in + in_len, sizeof(int16_t)*pitch); in_len += pitch; } else { /* Slow down - insert a chunk of data */ memcpy(out + out_len, s->buf, sizeof(int16_t)*pitch); out_len += pitch; overlap_add(s->buf + pitch, s->buf, pitch); } } } return out_len; } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/tone_generate.c0000644000175000017500000001324611150047216020646 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * tone_generate.c - General telephony tone generation. * * Written by Steve Underwood * * Copyright (C) 2001 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: tone_generate.c,v 1.43 2008/07/02 14:48:26 steveu Exp $ */ /*! \file */ #if defined(HAVE_CONFIG_H) #include "config.h" #endif #include #include #include #include #include #include #include "floating_fudge.h" #if defined(HAVE_TGMATH_H) #include #endif #if defined(HAVE_MATH_H) #include #endif #include "spandsp/telephony.h" #include "spandsp/dc_restore.h" #include "spandsp/complex.h" #include "spandsp/dds.h" #include "spandsp/tone_generate.h" #if !defined(M_PI) /* C99 systems may not define M_PI */ #define M_PI 3.14159265358979323846264338327 #endif #define ms_to_samples(t) (((t)*SAMPLE_RATE)/1000) void make_tone_gen_descriptor(tone_gen_descriptor_t *s, int f1, int l1, int f2, int l2, int d1, int d2, int d3, int d4, int repeat) { memset(s, 0, sizeof(*s)); if (f1) { s->tone[0].phase_rate = dds_phase_ratef((float) f1); if (f2 < 0) s->tone[0].phase_rate = -s->tone[0].phase_rate; s->tone[0].gain = dds_scaling_dbm0f((float) l1); } if (f2) { s->tone[1].phase_rate = dds_phase_ratef((float) abs(f2)); s->tone[1].gain = (f2 < 0) ? (float) l2/100.0f : dds_scaling_dbm0f((float) l2); } s->duration[0] = d1*SAMPLE_RATE/1000; s->duration[1] = d2*SAMPLE_RATE/1000; s->duration[2] = d3*SAMPLE_RATE/1000; s->duration[3] = d4*SAMPLE_RATE/1000; s->repeat = repeat; } /*- End of function --------------------------------------------------------*/ tone_gen_state_t *tone_gen_init(tone_gen_state_t *s, tone_gen_descriptor_t *t) { int i; if (s == NULL) return NULL; for (i = 0; i < 4; i++) { s->tone[i] = t->tone[i]; s->phase[i] = 0; } for (i = 0; i < 4; i++) s->duration[i] = t->duration[i]; s->repeat = t->repeat; s->current_section = 0; s->current_position = 0; return s; } /*- End of function --------------------------------------------------------*/ int tone_gen(tone_gen_state_t *s, int16_t amp[], int max_samples) { int samples; int limit; float xamp; int i; if (s->current_section < 0) return 0; for (samples = 0; samples < max_samples; ) { limit = samples + s->duration[s->current_section] - s->current_position; if (limit > max_samples) limit = max_samples; s->current_position += (limit - samples); if (s->current_section & 1) { /* A silent section */ for ( ; samples < limit; samples++) amp[samples] = 0; } else { if (s->tone[0].phase_rate < 0) { for ( ; samples < limit; samples++) { /* There must be two, and only two tones */ xamp = dds_modf(&s->phase[0], -s->tone[0].phase_rate, s->tone[0].gain, 0) *(1.0f + dds_modf(&s->phase[1], s->tone[1].phase_rate, s->tone[1].gain, 0)); amp[samples] = (int16_t) lrintf(xamp); } } else { for ( ; samples < limit; samples++) { xamp = 0.0f; for (i = 0; i < 4; i++) { if (s->tone[i].phase_rate == 0) break; xamp += dds_modf(&s->phase[i], s->tone[i].phase_rate, s->tone[i].gain, 0); } /* Saturation of the answer is the right thing at this point. However, we are normally generating well controlled tones, that cannot clip. So, the overhead of doing saturation is a waste of valuable time. */ amp[samples] = (int16_t) lrintf(xamp); } } } if (s->current_position >= s->duration[s->current_section]) { s->current_position = 0; if (++s->current_section > 3 || s->duration[s->current_section] == 0) { if (!s->repeat) { /* Force a quick exit */ s->current_section = -1; break; } s->current_section = 0; } } } return samples; } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/sig_tone.c0000644000175000017500000003702111150047216017633 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * sig_tone.c - Signalling tone processing for the 2280Hz, 2600Hz and similar * signalling tone used in older protocols. * * Written by Steve Underwood * * Copyright (C) 2004 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: sig_tone.c,v 1.21 2008/07/02 14:48:26 steveu Exp $ */ /*! \file */ #if defined(HAVE_CONFIG_H) #include #endif #include #include #include #include "floating_fudge.h" #if defined(HAVE_TGMATH_H) #include #endif #if defined(HAVE_MATH_H) #include #endif #include #include #include "spandsp/telephony.h" #include "spandsp/dc_restore.h" #include "spandsp/complex.h" #include "spandsp/dds.h" #include "spandsp/sig_tone.h" #define PI 3.14159265358979323 /* The coefficients for the data notch filter. This filter is also the guard filter for tone detection. */ sig_tone_descriptor_t sig_tones[4] = { { /* 2280Hz (e.g. AC15, and many other European protocols) */ {2280, 0}, {-10, -20}, 400*8, 225*8, 225*8, TRUE, 24, 64, { 3600, 14397, 32767}, { 0, -9425, -28954}, { 0, 14196, 32767}, { 0, -17393, -28954}, 12, /* 0.1098633, 0.4393615, 1.0, 0, -0.2876274, -0.8836059, 0, 0.4332275, 1.0, 0, -0.5307922, -0.8836059, */ { 12900, -16384, -16384}, { 0, -8578, -11796}, 15, 31744, 1024, 31744, 187, 31744, 187, -1, -32, 57 }, { /* 2600Hz (e.g. many US protocols) */ {2600, 0}, {-8, -8}, 400*8, 225*8, 225*8, FALSE, 24, 64, { 3539, 29569, 32767}, { 0, -24010, -28341}, { 0, 29844, 32767}, { 0, -31208, -28341}, 12, /* 0.1080017, 0.9023743, 1.0, 0, -0.7327271, -0.86489868, 0, 0.9107666, 1.0, 0, -0.9523925, -0.86489868, */ { 32768, 0, 0}, { 0, 0, 0}, 15, 31744, 1024, 31744, 170, 31744, 170, -1, -32, 52 }, { /* 2400Hz / 2600Hz (e.g. SS5 and SS5bis) */ {2400, 2600}, {-8, -8}, 400*8, 225*8, 225*8, FALSE, 24, 64, { 3539, 20349, 32767}, { 0, -22075, -31856}, { 0, 20174, 32767}, { 0, -17832, -31836}, 12, /* 0.1080017, 0.6210065, 1.0, 0, -0.6736673, -0.9721678, 0, 0.6156693, 1.0, 0, -0.5441804, -0.9715460, */ { 32768, 0, 0}, { 0, 0, 0}, 15, 31744, 1024, 31744, 170, 31744, 170, -1, -32, 52 } }; int sig_tone_rx(sig_tone_state_t *s, int16_t amp[], int len) { int32_t x; int32_t notched_signal; int32_t bandpass_signal; int i; for (i = 0; i < len; i++) { if (s->signaling_state_duration < 0xFFFF) s->signaling_state_duration++; /*endif*/ /* The notch filter is two cascaded biquads. */ notched_signal = amp[i]; notched_signal *= s->desc->notch_a1[0]; notched_signal += s->notch_z1[1]*s->desc->notch_b1[1]; notched_signal += s->notch_z1[2]*s->desc->notch_b1[2]; x = notched_signal; notched_signal += s->notch_z1[1]*s->desc->notch_a1[1]; notched_signal += s->notch_z1[2]*s->desc->notch_a1[2]; s->notch_z1[2] = s->notch_z1[1]; s->notch_z1[1] = x >> 15; notched_signal += s->notch_z2[1]*s->desc->notch_b2[1]; notched_signal += s->notch_z2[2]*s->desc->notch_b2[2]; x = notched_signal; notched_signal += s->notch_z2[1]*s->desc->notch_a2[1]; notched_signal += s->notch_z2[2]*s->desc->notch_a2[2]; s->notch_z2[2] = s->notch_z2[1]; s->notch_z2[1] = x >> 15; notched_signal >>= s->desc->notch_postscale; /* Modulus and leaky integrate the notched data. The result of this isn't used in low tone detect mode, but we must keep notch_zl rolling along. */ s->notch_zl = ((s->notch_zl*s->desc->notch_slugi) >> 15) + ((abs(notched_signal)*s->desc->notch_slugp) >> 15); /* Mow the grass to weed out the noise! */ s->mown_notch = s->notch_zl & s->desc->notch_threshold; if (s->tone_present) { if (s->flat_mode_timeout <= 0) s->flat_mode = TRUE; else s->flat_mode_timeout--; /*endif*/ } else { s->flat_mode_timeout = s->desc->sharp_flat_timeout; s->flat_mode = FALSE; } /*endif*/ if (s->flat_mode) { /* Flat mode */ /* The bandpass filter is a single bi-quad stage */ bandpass_signal = amp[i]; bandpass_signal *= s->desc->broad_a[0]; bandpass_signal += s->broad_z[1]*s->desc->broad_b[1]; bandpass_signal += s->broad_z[2]*s->desc->broad_b[2]; x = bandpass_signal; bandpass_signal += s->broad_z[1]*s->desc->broad_a[1]; bandpass_signal += s->broad_z[2]*s->desc->broad_a[2]; s->broad_z[2] = s->broad_z[1]; s->broad_z[1] = x >> 15; bandpass_signal >>= s->desc->broad_postscale; /* Leaky integrate the bandpassed data */ s->broad_zl = ((s->broad_zl*s->desc->broad_slugi) >> 15) + ((abs(bandpass_signal)*s->desc->broad_slugp) >> 15); /* For the broad band receiver we use a simple linear threshold! */ if (s->tone_present) { s->tone_present = (s->broad_zl > s->desc->broad_threshold); if (!s->tone_present) { if (s->sig_update) s->sig_update(s->user_data, SIG_TONE_1_CHANGE | (s->signaling_state_duration << 16)); /*endif*/ s->signaling_state_duration = 0; } /*endif*/ } else { s->tone_present = (s->broad_zl > s->desc->broad_threshold); if (s->tone_present) { if (s->sig_update) s->sig_update(s->user_data, SIG_TONE_1_CHANGE | SIG_TONE_1_PRESENT | (s->signaling_state_duration << 16)); /*endif*/ s->signaling_state_duration = 0; } /*endif*/ } /*endif*/ /* Notch insertion logic */ /* tone_present and tone_on are equivalent in flat mode */ if (s->tone_present) { s->notch_enabled = s->desc->notch_allowed; s->notch_insertion_timeout = s->desc->notch_lag_time; } else { if (s->notch_insertion_timeout > 0) s->notch_insertion_timeout--; else s->notch_enabled = FALSE; /*endif*/ } /*endif*/ } else { /* Sharp mode */ /* Modulus and leaky integrate the data */ s->broad_zl = ((s->broad_zl*s->desc->unfiltered_slugi) >> 15) + ((abs(amp[i])*s->desc->unfiltered_slugp) >> 15); /* Mow the grass to weed out the noise! */ s->mown_bandpass = s->broad_zl & s->desc->unfiltered_threshold; /* Persistence checking and notch insertion logic */ if (!s->tone_present) { if (s->mown_notch < s->mown_bandpass) { /* Tone is detected this sample */ if (s->tone_persistence_timeout <= 0) { s->tone_present = TRUE; s->notch_enabled = s->desc->notch_allowed; s->tone_persistence_timeout = s->desc->tone_off_check_time; s->notch_insertion_timeout = s->desc->notch_lag_time; if (s->sig_update) s->sig_update(s->user_data, SIG_TONE_1_CHANGE | SIG_TONE_1_PRESENT | (s->signaling_state_duration << 16)); /*endif*/ s->signaling_state_duration = 0; } else { s->tone_persistence_timeout--; if (s->notch_insertion_timeout > 0) s->notch_insertion_timeout--; else s->notch_enabled = FALSE; /*endif*/ } /*endif*/ } else { s->tone_persistence_timeout = s->desc->tone_on_check_time; if (s->notch_insertion_timeout > 0) s->notch_insertion_timeout--; else s->notch_enabled = FALSE; /*endif*/ } /*endif*/ } else { if (s->mown_notch > s->mown_bandpass) { /* Tone is not detected this sample */ if (s->tone_persistence_timeout <= 0) { s->tone_present = FALSE; s->tone_persistence_timeout = s->desc->tone_on_check_time; if (s->sig_update) s->sig_update(s->user_data, SIG_TONE_1_CHANGE | (s->signaling_state_duration << 16)); /*endif*/ s->signaling_state_duration = 0; } else { s->tone_persistence_timeout--; } /*endif*/ } else { s->tone_persistence_timeout = s->desc->tone_off_check_time; } /*endif*/ } /*endif*/ } /*endif*/ if ((s->current_tx_tone & SIG_TONE_RX_PASSTHROUGH)) { //if (s->notch_enabled) amp[i] = (int16_t) notched_signal; /*endif*/ } else { amp[i] = 0; } /*endif*/ } /*endfor*/ return len; } /*- End of function --------------------------------------------------------*/ int sig_tone_tx(sig_tone_state_t *s, int16_t amp[], int len) { int i; int16_t tone; int update; int high_low; if (s->current_tx_tone & SIG_TONE_1_PRESENT) { for (i = 0; i < len; i++) { if (s->high_low_timer > 0 && --s->high_low_timer > 0) high_low = 1; else high_low = 0; /*endif*/ tone = dds_mod(&(s->phase_acc[0]), s->phase_rate[0], s->tone_scaling[high_low], 0); if (s->current_tx_tone & SIG_TONE_TX_PASSTHROUGH) amp[i] = saturate(amp[i] + tone); else amp[i] = tone; /*endif*/ if (--s->current_tx_timeout <= 0) { if (s->sig_update) { update = s->sig_update(s->user_data, SIG_TONE_UPDATE_REQUEST); if ((update & 0x03) == 0x03 && !(s->current_tx_tone & SIG_TONE_1_PRESENT)) s->high_low_timer = s->desc->high_low_timeout; /*endif*/ s->current_tx_tone = update & 0xFFFF; s->current_tx_timeout = (update >> 16) & 0xFFFF; } /*endif*/ } /*endif*/ } /*endfor*/ } else { for (i = 0; i < len; ) { if (s->current_tx_timeout < len - i) { if (!(s->current_tx_tone & SIG_TONE_TX_PASSTHROUGH)) { /* Zap any audio in the buffer */ memset(amp + i, 0, sizeof(int16_t)*s->current_tx_timeout); } /*endif*/ i += s->current_tx_timeout; if (s->sig_update) { update = s->sig_update(s->user_data, SIG_TONE_UPDATE_REQUEST); if ((update & 0x03) == 0x03) s->high_low_timer = s->desc->high_low_timeout; /*endif*/ s->current_tx_tone = update & 0xFFFF; s->current_tx_timeout = (update >> 16) & 0xFFFF; } /*endif*/ } else { s->current_tx_timeout -= (len - i); if (!(s->current_tx_tone & SIG_TONE_TX_PASSTHROUGH)) { /* Zap any audio in the buffer */ memset(amp + i, 0, sizeof(int16_t)*(len - i)); i = len; } /*endif*/ } /*endif*/ } /*endfor*/ } /*endif*/ return len; } /*- End of function --------------------------------------------------------*/ sig_tone_state_t *sig_tone_init(sig_tone_state_t *s, int tone_type, sig_tone_func_t sig_update, void *user_data) { if (tone_type <= 0 || tone_type > 3) return NULL; /*endif*/ if (s == NULL) { if ((s = (sig_tone_state_t *) malloc(sizeof(*s))) == NULL) return NULL; } memset(s, 0, sizeof(*s)); s->sig_update = sig_update; s->user_data = user_data; s->desc = &sig_tones[tone_type - 1]; /* Set up the transmit side */ s->phase_rate[0] = dds_phase_rate((float) s->desc->tone_freq[0]); if (s->desc->tone_freq[1]) s->phase_rate[1] = dds_phase_rate((float) s->desc->tone_freq[1]); else s->phase_rate[1] = 0; /*endif*/ s->tone_scaling[0] = dds_scaling_dbm0((float) s->desc->tone_amp[0]); s->tone_scaling[1] = dds_scaling_dbm0((float) s->desc->tone_amp[1]); /* Set up the receive side */ s->flat_mode_timeout = 0; s->notch_insertion_timeout = 0; s->tone_persistence_timeout = 0; s->signaling_state_duration = 0; return s; } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/v17rx_fixed_rrc.h0000644000175000017500000047417011150047216021057 0ustar julienjulien#define RX_PULSESHAPER_GAIN 32767.000000f #define RX_PULSESHAPER_COEFF_SETS 192 static const complexi16_t rx_pulseshaper[RX_PULSESHAPER_COEFF_SETS][27] = { { { 0, 0}, /* Filter 0 */ { 11, -36}, { -108, -17}, { 0, -122}, { -79, 12}, { -50, -156}, { -127, 65}, { -238, -328}, { -102, 102}, { -1044, -758}, { 588, -1155}, { -1452, -472}, { 1024, -6467}, { 10585, 0}, { 1655, 10455}, { -6227, 2023}, { -693, -1360}, { -1049, 762}, { -912, -912}, { 85, -117}, { -361, -184}, { 44, -136}, { -162, -25}, { 0, -80}, { -121, 19}, { -34, -104}, { -33, 17} }, { { 0, 0}, /* Filter 1 */ { 11, -35}, { -109, -17}, { 0, -122}, { -80, 12}, { -50, -155}, { -129, 66}, { -238, -328}, { -106, 106}, { -1048, -761}, { 585, -1149}, { -1473, -478}, { 1028, -6493}, { 10597, 0}, { 1654, 10443}, { -6201, 2015}, { -683, -1341}, { -1054, 766}, { -909, -909}, { 82, -113}, { -362, -184}, { 43, -134}, { -162, -25}, { 0, -79}, { -121, 19}, { -33, -104}, { -34, 17} }, { { 0, 0}, /* Filter 2 */ { 11, -34}, { -110, -17}, { 0, -121}, { -82, 13}, { -50, -154}, { -131, 67}, { -238, -328}, { -110, 110}, { -1051, -764}, { 582, -1143}, { -1495, -485}, { 1032, -6520}, { 10609, 0}, { 1652, 10431}, { -6176, 2006}, { -673, -1321}, { -1059, 770}, { -905, -905}, { 79, -108}, { -362, -184}, { 43, -132}, { -163, -25}, { 0, -78}, { -122, 19}, { -33, -103}, { -34, 17} }, { { 0, 0}, /* Filter 3 */ { 11, -34}, { -110, -17}, { 0, -120}, { -83, 13}, { -50, -154}, { -133, 68}, { -238, -327}, { -114, 114}, { -1055, -767}, { 579, -1137}, { -1516, -492}, { 1036, -6546}, { 10621, 0}, { 1650, 10418}, { -6150, 1998}, { -663, -1301}, { -1065, 773}, { -901, -901}, { 76, -104}, { -362, -184}, { 42, -130}, { -163, -25}, { 0, -77}, { -122, 19}, { -33, -102}, { -35, 18} }, { { 0, 0}, /* Filter 4 */ { 10, -33}, { -111, -17}, { 0, -120}, { -84, 13}, { -49, -153}, { -135, 69}, { -238, -327}, { -118, 118}, { -1059, -769}, { 576, -1131}, { -1538, -499}, { 1041, -6573}, { 10633, 0}, { 1648, 10406}, { -6124, 1990}, { -653, -1281}, { -1070, 777}, { -898, -898}, { 72, -100}, { -362, -184}, { 41, -128}, { -164, -26}, { 0, -76}, { -123, 19}, { -33, -102}, { -36, 18} }, { { 0, 0}, /* Filter 5 */ { 10, -33}, { -111, -17}, { 0, -119}, { -85, 13}, { -49, -153}, { -137, 70}, { -237, -327}, { -121, 121}, { -1063, -772}, { 573, -1125}, { -1559, -506}, { 1045, -6599}, { 10645, 0}, { 1646, 10393}, { -6099, 1981}, { -643, -1262}, { -1075, 781}, { -894, -894}, { 69, -96}, { -362, -184}, { 40, -126}, { -164, -26}, { 0, -75}, { -124, 19}, { -33, -101}, { -36, 18} }, { { 0, 0}, /* Filter 6 */ { 10, -32}, { -112, -17}, { 0, -118}, { -86, 13}, { -49, -152}, { -139, 71}, { -237, -326}, { -125, 125}, { -1067, -775}, { 570, -1119}, { -1581, -513}, { 1049, -6626}, { 10656, 0}, { 1644, 10381}, { -6073, 1973}, { -633, -1242}, { -1080, 784}, { -891, -891}, { 66, -91}, { -363, -184}, { 40, -124}, { -165, -26}, { 0, -73}, { -124, 19}, { -32, -100}, { -37, 18} }, { { 0, 0}, /* Filter 7 */ { 10, -31}, { -113, -17}, { 0, -118}, { -87, 13}, { -49, -151}, { -141, 72}, { -237, -326}, { -129, 129}, { -1071, -778}, { 567, -1113}, { -1602, -520}, { 1053, -6652}, { 10668, 0}, { 1642, 10368}, { -6047, 1964}, { -623, -1223}, { -1084, 788}, { -887, -887}, { 63, -87}, { -363, -185}, { 39, -121}, { -165, -26}, { 0, -72}, { -125, 19}, { -32, -100}, { -37, 19} }, { { 0, 0}, /* Filter 8 */ { 10, -31}, { -113, -18}, { 0, -117}, { -88, 14}, { -49, -151}, { -143, 73}, { -237, -326}, { -133, 133}, { -1075, -781}, { 563, -1106}, { -1624, -527}, { 1057, -6679}, { 10679, 0}, { 1640, 10355}, { -6021, 1956}, { -613, -1203}, { -1089, 791}, { -884, -884}, { 60, -83}, { -363, -185}, { 38, -119}, { -166, -26}, { 0, -71}, { -125, 19}, { -32, -99}, { -38, 19} }, { { 0, 0}, /* Filter 9 */ { 9, -30}, { -114, -18}, { 0, -116}, { -89, 14}, { -48, -150}, { -145, 74}, { -236, -325}, { -137, 137}, { -1078, -783}, { 560, -1100}, { -1646, -534}, { 1062, -6705}, { 10690, 0}, { 1638, 10342}, { -5995, 1948}, { -603, -1184}, { -1094, 795}, { -880, -880}, { 57, -79}, { -363, -185}, { 38, -117}, { -166, -26}, { 0, -70}, { -126, 20}, { -32, -99}, { -38, 19} }, { { 0, 0}, /* Filter 10 */ { 9, -29}, { -115, -18}, { 0, -116}, { -91, 14}, { -48, -149}, { -147, 75}, { -236, -325}, { -141, 141}, { -1082, -786}, { 557, -1093}, { -1668, -542}, { 1066, -6731}, { 10701, 0}, { 1636, 10329}, { -5970, 1939}, { -593, -1164}, { -1099, 798}, { -876, -876}, { 54, -75}, { -363, -185}, { 37, -115}, { -167, -26}, { 0, -69}, { -126, 20}, { -31, -98}, { -39, 20} }, { { 0, 0}, /* Filter 11 */ { 9, -29}, { -115, -18}, { 0, -115}, { -92, 14}, { -48, -149}, { -149, 76}, { -236, -324}, { -145, 145}, { -1086, -789}, { 553, -1086}, { -1690, -549}, { 1070, -6758}, { 10712, 0}, { 1633, 10316}, { -5944, 1931}, { -583, -1145}, { -1103, 801}, { -872, -872}, { 51, -71}, { -363, -185}, { 36, -113}, { -167, -26}, { 0, -67}, { -127, 20}, { -31, -97}, { -39, 20} }, { { 0, 0}, /* Filter 12 */ { 9, -28}, { -116, -18}, { 0, -114}, { -93, 14}, { -48, -148}, { -151, 77}, { -235, -324}, { -149, 149}, { -1089, -791}, { 550, -1080}, { -1712, -556}, { 1074, -6784}, { 10723, 0}, { 1631, 10302}, { -5918, 1923}, { -573, -1126}, { -1108, 805}, { -869, -869}, { 48, -66}, { -363, -185}, { 36, -111}, { -168, -26}, { 0, -66}, { -128, 20}, { -31, -97}, { -40, 20} }, { { 0, 0}, /* Filter 13 */ { 9, -28}, { -116, -18}, { 0, -113}, { -94, 14}, { -48, -147}, { -153, 78}, { -235, -324}, { -153, 153}, { -1093, -794}, { 546, -1073}, { -1734, -563}, { 1078, -6810}, { 10733, 0}, { 1629, 10289}, { -5892, 1914}, { -564, -1107}, { -1112, 808}, { -865, -865}, { 45, -62}, { -363, -185}, { 35, -109}, { -168, -26}, { 0, -65}, { -128, 20}, { -31, -96}, { -40, 20} }, { { 0, 0}, /* Filter 14 */ { 8, -27}, { -117, -18}, { 0, -113}, { -95, 15}, { -47, -147}, { -155, 79}, { -235, -323}, { -157, 157}, { -1097, -797}, { 543, -1066}, { -1756, -570}, { 1082, -6836}, { 10744, 0}, { 1627, 10275}, { -5866, 1906}, { -554, -1088}, { -1117, 811}, { -861, -861}, { 42, -58}, { -363, -185}, { 34, -107}, { -169, -26}, { 0, -64}, { -129, 20}, { -31, -95}, { -41, 21} }, { { 0, 0}, /* Filter 15 */ { 8, -26}, { -117, -18}, { 0, -112}, { -96, 15}, { -47, -146}, { -157, 80}, { -234, -323}, { -161, 161}, { -1100, -799}, { 539, -1059}, { -1778, -577}, { 1086, -6862}, { 10755, 0}, { 1625, 10262}, { -5840, 1897}, { -544, -1069}, { -1121, 814}, { -858, -858}, { 39, -54}, { -363, -185}, { 34, -105}, { -169, -26}, { 0, -63}, { -129, 20}, { -30, -95}, { -41, 21} }, { { 0, 0}, /* Filter 16 */ { 8, -26}, { -118, -18}, { 0, -111}, { -97, 15}, { -47, -145}, { -159, 81}, { -234, -322}, { -165, 165}, { -1104, -802}, { 536, -1052}, { -1800, -585}, { 1091, -6889}, { 10765, 0}, { 1623, 10248}, { -5814, 1889}, { -535, -1050}, { -1125, 818}, { -854, -854}, { 36, -50}, { -363, -184}, { 33, -103}, { -170, -26}, { 0, -62}, { -130, 20}, { -30, -94}, { -42, 21} }, { { 0, 0}, /* Filter 17 */ { 8, -25}, { -119, -18}, { 0, -111}, { -98, 15}, { -47, -144}, { -161, 82}, { -233, -321}, { -169, 169}, { -1107, -804}, { 532, -1045}, { -1822, -592}, { 1095, -6915}, { 10775, 0}, { 1620, 10234}, { -5788, 1880}, { -525, -1031}, { -1130, 821}, { -850, -850}, { 33, -46}, { -362, -184}, { 32, -101}, { -170, -26}, { 0, -60}, { -130, 20}, { -30, -93}, { -42, 21} }, { { 0, 0}, /* Filter 18 */ { 8, -24}, { -119, -18}, { 0, -110}, { -99, 15}, { -46, -143}, { -163, 83}, { -233, -321}, { -173, 173}, { -1111, -807}, { 529, -1038}, { -1845, -599}, { 1099, -6941}, { 10785, 0}, { 1618, 10220}, { -5762, 1872}, { -515, -1012}, { -1134, 824}, { -846, -846}, { 30, -42}, { -362, -184}, { 32, -99}, { -170, -27}, { 0, -59}, { -131, 20}, { -30, -93}, { -43, 22} }, { { 0, 0}, /* Filter 19 */ { 7, -24}, { -120, -19}, { 0, -109}, { -100, 15}, { -46, -143}, { -165, 84}, { -233, -320}, { -177, 177}, { -1114, -810}, { 525, -1031}, { -1867, -606}, { 1103, -6967}, { 10795, 0}, { 1616, 10206}, { -5736, 1864}, { -506, -993}, { -1138, 827}, { -842, -842}, { 27, -38}, { -362, -184}, { 31, -96}, { -171, -27}, { 0, -58}, { -131, 20}, { -30, -92}, { -43, 22} }, { { 0, 0}, /* Filter 20 */ { 7, -23}, { -120, -19}, { 0, -108}, { -101, 16}, { -46, -142}, { -166, 85}, { -232, -320}, { -181, 181}, { -1118, -812}, { 521, -1023}, { -1889, -614}, { 1107, -6993}, { 10805, 0}, { 1614, 10192}, { -5710, 1855}, { -496, -975}, { -1142, 830}, { -838, -838}, { 25, -34}, { -362, -184}, { 30, -94}, { -171, -27}, { 0, -57}, { -132, 20}, { -29, -91}, { -44, 22} }, { { 0, 0}, /* Filter 21 */ { 7, -22}, { -121, -19}, { 0, -108}, { -102, 16}, { -46, -141}, { -168, 86}, { -232, -319}, { -185, 185}, { -1121, -815}, { 517, -1016}, { -1912, -621}, { 1111, -7019}, { 10815, 0}, { 1611, 10177}, { -5684, 1847}, { -487, -956}, { -1146, 832}, { -835, -835}, { 22, -30}, { -362, -184}, { 30, -92}, { -171, -27}, { 0, -55}, { -132, 20}, { -29, -90}, { -44, 22} }, { { 0, 0}, /* Filter 22 */ { 7, -22}, { -121, -19}, { 0, -107}, { -104, 16}, { -45, -140}, { -170, 87}, { -231, -318}, { -189, 189}, { -1125, -817}, { 514, -1009}, { -1934, -628}, { 1115, -7044}, { 10824, 0}, { 1609, 10163}, { -5658, 1838}, { -477, -937}, { -1150, 835}, { -831, -831}, { 19, -26}, { -362, -184}, { 29, -90}, { -172, -27}, { 0, -54}, { -132, 21}, { -29, -90}, { -45, 23} }, { { 0, 0}, /* Filter 23 */ { 6, -21}, { -122, -19}, { 0, -106}, { -105, 16}, { -45, -139}, { -172, 88}, { -231, -318}, { -193, 193}, { -1128, -819}, { 510, -1001}, { -1957, -635}, { 1119, -7070}, { 10834, 0}, { 1607, 10148}, { -5632, 1830}, { -468, -919}, { -1154, 838}, { -827, -827}, { 16, -22}, { -361, -184}, { 28, -88}, { -172, -27}, { 0, -53}, { -133, 21}, { -29, -89}, { -45, 23} }, { { 0, 0}, /* Filter 24 */ { 6, -20}, { -122, -19}, { 0, -105}, { -106, 16}, { -45, -139}, { -174, 88}, { -230, -317}, { -197, 197}, { -1131, -822}, { 506, -993}, { -1980, -643}, { 1123, -7096}, { 10843, 0}, { 1605, 10133}, { -5606, 1821}, { -459, -900}, { -1157, 841}, { -823, -823}, { 13, -18}, { -361, -184}, { 28, -86}, { -172, -27}, { 0, -52}, { -133, 21}, { -28, -88}, { -46, 23} }, { { 0, 0}, /* Filter 25 */ { 6, -20}, { -123, -19}, { 0, -104}, { -107, 16}, { -44, -138}, { -176, 89}, { -230, -316}, { -201, 201}, { -1135, -824}, { 502, -986}, { -2002, -650}, { 1128, -7122}, { 10852, 0}, { 1602, 10119}, { -5580, 1813}, { -449, -882}, { -1161, 843}, { -819, -819}, { 10, -14}, { -361, -184}, { 27, -84}, { -173, -27}, { 0, -51}, { -134, 21}, { -28, -88}, { -46, 23} }, { { 0, 0}, /* Filter 26 */ { 6, -19}, { -124, -19}, { 0, -104}, { -108, 17}, { -44, -137}, { -178, 90}, { -229, -315}, { -205, 205}, { -1138, -827}, { 498, -978}, { -2025, -658}, { 1132, -7148}, { 10861, 0}, { 1600, 10104}, { -5554, 1804}, { -440, -864}, { -1165, 846}, { -815, -815}, { 7, -10}, { -361, -183}, { 26, -82}, { -173, -27}, { 0, -49}, { -134, 21}, { -28, -87}, { -47, 24} }, { { 0, 0}, /* Filter 27 */ { 6, -18}, { -124, -19}, { 0, -103}, { -109, 17}, { -44, -136}, { -180, 91}, { -229, -315}, { -209, 209}, { -1141, -829}, { 494, -970}, { -2048, -665}, { 1136, -7173}, { 10870, 0}, { 1597, 10089}, { -5528, 1796}, { -431, -846}, { -1168, 849}, { -811, -811}, { 5, -7}, { -360, -183}, { 26, -80}, { -173, -27}, { 0, -48}, { -135, 21}, { -28, -86}, { -47, 24} }, { { 0, 0}, /* Filter 28 */ { 5, -17}, { -125, -19}, { 0, -102}, { -110, 17}, { -44, -135}, { -182, 92}, { -228, -314}, { -213, 213}, { -1144, -831}, { 490, -962}, { -2071, -672}, { 1140, -7199}, { 10879, 0}, { 1595, 10074}, { -5502, 1787}, { -421, -827}, { -1172, 851}, { -807, -807}, { 2, -3}, { -360, -183}, { 25, -78}, { -173, -27}, { 0, -47}, { -135, 21}, { -27, -86}, { -48, 24} }, { { 0, 0}, /* Filter 29 */ { 5, -17}, { -125, -19}, { 0, -101}, { -111, 17}, { -43, -134}, { -184, 93}, { -227, -313}, { -218, 218}, { -1148, -834}, { 486, -954}, { -2094, -680}, { 1144, -7225}, { 10888, 0}, { 1593, 10059}, { -5476, 1779}, { -412, -809}, { -1175, 854}, { -803, -803}, { 0, 0}, { -360, -183}, { 24, -76}, { -174, -27}, { 0, -46}, { -135, 21}, { -27, -85}, { -48, 24} }, { { 0, 0}, /* Filter 30 */ { 5, -16}, { -126, -19}, { 0, -100}, { -112, 17}, { -43, -133}, { -186, 94}, { -227, -312}, { -222, 222}, { -1151, -836}, { 482, -946}, { -2117, -687}, { 1148, -7250}, { 10896, 0}, { 1590, 10043}, { -5450, 1770}, { -403, -791}, { -1179, 856}, { -799, -799}, { -3, 4}, { -359, -183}, { 24, -74}, { -174, -27}, { 0, -45}, { -136, 21}, { -27, -84}, { -49, 25} }, { { 0, 0}, /* Filter 31 */ { 5, -15}, { -126, -20}, { 0, -100}, { -113, 17}, { -43, -132}, { -188, 95}, { -226, -311}, { -226, 226}, { -1154, -838}, { 478, -938}, { -2140, -695}, { 1152, -7276}, { 10905, 0}, { 1588, 10028}, { -5423, 1762}, { -394, -773}, { -1182, 859}, { -795, -795}, { -5, 8}, { -359, -183}, { 23, -72}, { -174, -27}, { 0, -43}, { -136, 21}, { -27, -83}, { -49, 25} }, { { 0, 0}, /* Filter 32 */ { 4, -15}, { -127, -20}, { 0, -99}, { -114, 18}, { -42, -131}, { -189, 96}, { -225, -311}, { -230, 230}, { -1157, -840}, { 473, -930}, { -2163, -702}, { 1156, -7301}, { 10913, 0}, { 1585, 10012}, { -5397, 1753}, { -385, -755}, { -1185, 861}, { -791, -791}, { -8, 11}, { -358, -182}, { 22, -70}, { -174, -27}, { 0, -42}, { -137, 21}, { -27, -83}, { -50, 25} }, { { 0, 0}, /* Filter 33 */ { 4, -14}, { -127, -20}, { 0, -98}, { -115, 18}, { -42, -130}, { -191, 97}, { -225, -310}, { -234, 234}, { -1160, -843}, { 469, -921}, { -2186, -710}, { 1160, -7327}, { 10922, 0}, { 1583, 9997}, { -5371, 1745}, { -376, -737}, { -1188, 863}, { -787, -787}, { -11, 15}, { -358, -182}, { 22, -68}, { -174, -27}, { 0, -41}, { -137, 21}, { -26, -82}, { -50, 25} }, { { 0, 0}, /* Filter 34 */ { 4, -13}, { -128, -20}, { 0, -97}, { -116, 18}, { -42, -129}, { -193, 98}, { -224, -309}, { -238, 238}, { -1163, -845}, { 465, -913}, { -2209, -717}, { 1164, -7352}, { 10930, 0}, { 1580, 9981}, { -5345, 1736}, { -366, -720}, { -1192, 866}, { -783, -783}, { -14, 19}, { -358, -182}, { 21, -66}, { -175, -27}, { 0, -40}, { -137, 21}, { -26, -81}, { -51, 25} }, { { 0, 0}, /* Filter 35 */ { 4, -13}, { -128, -20}, { 0, -96}, { -117, 18}, { -41, -128}, { -195, 99}, { -223, -308}, { -243, 243}, { -1166, -847}, { 461, -905}, { -2232, -725}, { 1168, -7377}, { 10938, 0}, { 1578, 9965}, { -5319, 1728}, { -357, -702}, { -1195, 868}, { -779, -779}, { -16, 22}, { -357, -182}, { 20, -64}, { -175, -27}, { 0, -38}, { -138, 21}, { -26, -80}, { -51, 26} }, { { 0, 0}, /* Filter 36 */ { 4, -12}, { -129, -20}, { 0, -95}, { -118, 18}, { -41, -127}, { -197, 100}, { -223, -307}, { -247, 247}, { -1169, -849}, { 456, -896}, { -2255, -732}, { 1172, -7403}, { 10945, 0}, { 1575, 9949}, { -5293, 1719}, { -348, -684}, { -1198, 870}, { -774, -774}, { -19, 26}, { -357, -181}, { 20, -62}, { -175, -27}, { 0, -37}, { -138, 21}, { -26, -80}, { -51, 26} }, { { 0, 0}, /* Filter 37 */ { 3, -11}, { -129, -20}, { 0, -94}, { -119, 18}, { -41, -126}, { -199, 101}, { -222, -306}, { -251, 251}, { -1172, -851}, { 452, -887}, { -2279, -740}, { 1176, -7428}, { 10953, 0}, { 1573, 9933}, { -5266, 1711}, { -339, -667}, { -1201, 872}, { -770, -770}, { -22, 30}, { -356, -181}, { 19, -60}, { -175, -27}, { 0, -36}, { -138, 22}, { -25, -79}, { -52, 26} }, { { 0, 0}, /* Filter 38 */ { 3, -10}, { -129, -20}, { 0, -94}, { -120, 19}, { -40, -125}, { -201, 102}, { -221, -305}, { -255, 255}, { -1175, -853}, { 447, -879}, { -2302, -748}, { 1180, -7453}, { 10961, 0}, { 1570, 9917}, { -5240, 1702}, { -331, -649}, { -1204, 874}, { -766, -766}, { -24, 33}, { -356, -181}, { 18, -58}, { -175, -27}, { 0, -35}, { -139, 22}, { -25, -78}, { -52, 26} }, { { 0, 0}, /* Filter 39 */ { 3, -10}, { -130, -20}, { 0, -93}, { -121, 19}, { -40, -124}, { -203, 103}, { -221, -304}, { -260, 260}, { -1177, -855}, { 443, -870}, { -2326, -755}, { 1184, -7478}, { 10968, 0}, { 1568, 9901}, { -5214, 1694}, { -322, -632}, { -1206, 876}, { -762, -762}, { -27, 37}, { -355, -181}, { 18, -56}, { -175, -27}, { 0, -34}, { -139, 22}, { -25, -78}, { -53, 27} }, { { 0, 0}, /* Filter 40 */ { 3, -9}, { -130, -20}, { 0, -92}, { -122, 19}, { -40, -123}, { -205, 104}, { -220, -303}, { -264, 264}, { -1180, -857}, { 439, -861}, { -2349, -763}, { 1188, -7503}, { 10976, 0}, { 1565, 9884}, { -5188, 1685}, { -313, -614}, { -1209, 878}, { -758, -758}, { -29, 41}, { -355, -180}, { 17, -54}, { -175, -27}, { 0, -32}, { -139, 22}, { -25, -77}, { -53, 27} }, { { 0, 0}, /* Filter 41 */ { 2, -8}, { -131, -20}, { 0, -91}, { -123, 19}, { -39, -122}, { -206, 105}, { -219, -302}, { -268, 268}, { -1183, -859}, { 434, -852}, { -2373, -771}, { 1192, -7528}, { 10983, 0}, { 1562, 9868}, { -5162, 1677}, { -304, -597}, { -1212, 880}, { -754, -754}, { -32, 44}, { -354, -180}, { 16, -52}, { -175, -27}, { 0, -31}, { -140, 22}, { -24, -76}, { -54, 27} }, { { 0, 0}, /* Filter 42 */ { 2, -8}, { -131, -20}, { 0, -90}, { -123, 19}, { -39, -121}, { -208, 106}, { -218, -301}, { -272, 272}, { -1186, -861}, { 429, -843}, { -2396, -778}, { 1196, -7553}, { 10990, 0}, { 1560, 9851}, { -5136, 1668}, { -295, -580}, { -1215, 882}, { -750, -750}, { -35, 48}, { -353, -180}, { 16, -50}, { -176, -27}, { 0, -30}, { -140, 22}, { -24, -75}, { -54, 27} }, { { 0, 0}, /* Filter 43 */ { 2, -7}, { -132, -20}, { 0, -89}, { -124, 19}, { -39, -120}, { -210, 107}, { -217, -299}, { -277, 277}, { -1188, -863}, { 425, -834}, { -2420, -786}, { 1200, -7578}, { 10997, 0}, { 1557, 9835}, { -5109, 1660}, { -287, -563}, { -1217, 884}, { -745, -745}, { -37, 51}, { -353, -180}, { 15, -48}, { -176, -27}, { 0, -29}, { -140, 22}, { -24, -75}, { -54, 27} }, { { 0, 0}, /* Filter 44 */ { 2, -6}, { -132, -21}, { 0, -88}, { -125, 19}, { -38, -119}, { -212, 108}, { -217, -298}, { -281, 281}, { -1191, -865}, { 420, -825}, { -2443, -794}, { 1204, -7603}, { 11004, 0}, { 1555, 9818}, { -5083, 1651}, { -278, -546}, { -1220, 886}, { -741, -741}, { -40, 55}, { -352, -179}, { 14, -46}, { -176, -27}, { 0, -27}, { -141, 22}, { -24, -74}, { -55, 28} }, { { 0, 0}, /* Filter 45 */ { 1, -5}, { -133, -21}, { 0, -87}, { -126, 20}, { -38, -118}, { -214, 109}, { -216, -297}, { -285, 285}, { -1194, -867}, { 415, -816}, { -2467, -801}, { 1208, -7628}, { 11010, 0}, { 1552, 9801}, { -5057, 1643}, { -269, -529}, { -1222, 888}, { -737, -737}, { -42, 58}, { -352, -179}, { 14, -44}, { -176, -27}, { 0, -26}, { -141, 22}, { -23, -73}, { -55, 28} }, { { 0, 0}, /* Filter 46 */ { 1, -5}, { -133, -21}, { 0, -86}, { -127, 20}, { -38, -117}, { -216, 110}, { -215, -296}, { -289, 289}, { -1196, -869}, { 411, -806}, { -2491, -809}, { 1212, -7653}, { 11017, 0}, { 1549, 9784}, { -5031, 1634}, { -261, -512}, { -1225, 890}, { -733, -733}, { -45, 62}, { -351, -179}, { 13, -42}, { -176, -27}, { 0, -25}, { -141, 22}, { -23, -72}, { -56, 28} }, { { 0, 0}, /* Filter 47 */ { 1, -4}, { -133, -21}, { 0, -85}, { -128, 20}, { -37, -116}, { -217, 111}, { -214, -295}, { -294, 294}, { -1199, -871}, { 406, -797}, { -2515, -817}, { 1216, -7678}, { 11023, 0}, { 1546, 9767}, { -5004, 1626}, { -252, -495}, { -1227, 891}, { -729, -729}, { -47, 65}, { -350, -178}, { 13, -40}, { -176, -27}, { 0, -24}, { -142, 22}, { -23, -72}, { -56, 28} }, { { 0, 0}, /* Filter 48 */ { 1, -3}, { -134, -21}, { 0, -85}, { -129, 20}, { -37, -115}, { -219, 111}, { -213, -293}, { -298, 298}, { -1201, -873}, { 401, -788}, { -2539, -825}, { 1220, -7702}, { 11030, 0}, { 1544, 9750}, { -4978, 1617}, { -243, -478}, { -1229, 893}, { -724, -724}, { -50, 69}, { -349, -178}, { 12, -38}, { -176, -27}, { 0, -22}, { -142, 22}, { -23, -71}, { -56, 28} }, { { 0, 0}, /* Filter 49 */ { 0, -2}, { -134, -21}, { 0, -84}, { -130, 20}, { -37, -114}, { -221, 112}, { -212, -292}, { -302, 302}, { -1204, -874}, { 396, -778}, { -2563, -832}, { 1223, -7727}, { 11036, 0}, { 1541, 9732}, { -4952, 1609}, { -235, -461}, { -1231, 895}, { -720, -720}, { -52, 72}, { -349, -177}, { 11, -36}, { -176, -27}, { 0, -21}, { -142, 22}, { -22, -70}, { -57, 29} }, { { 0, 0}, /* Filter 50 */ { 0, -2}, { -135, -21}, { 0, -83}, { -131, 20}, { -36, -112}, { -223, 113}, { -211, -291}, { -307, 307}, { -1206, -876}, { 391, -768}, { -2586, -840}, { 1227, -7752}, { 11042, 0}, { 1538, 9715}, { -4926, 1600}, { -226, -445}, { -1234, 896}, { -716, -716}, { -55, 75}, { -348, -177}, { 11, -34}, { -176, -27}, { 0, -20}, { -142, 22}, { -22, -69}, { -57, 29} }, { { 0, 0}, /* Filter 51 */ { 0, -1}, { -135, -21}, { 0, -82}, { -132, 20}, { -36, -111}, { -225, 114}, { -210, -290}, { -311, 311}, { -1208, -878}, { 386, -759}, { -2610, -848}, { 1231, -7776}, { 11048, 0}, { 1536, 9698}, { -4900, 1592}, { -218, -428}, { -1236, 898}, { -711, -711}, { -57, 79}, { -347, -177}, { 10, -32}, { -176, -27}, { 0, -19}, { -143, 22}, { -22, -69}, { -57, 29} }, { { 0, 0}, /* Filter 52 */ { 0, 0}, { -135, -21}, { 0, -81}, { -133, 21}, { -35, -110}, { -226, 115}, { -209, -288}, { -315, 315}, { -1211, -880}, { 381, -749}, { -2635, -856}, { 1235, -7801}, { 11054, 0}, { 1533, 9680}, { -4873, 1583}, { -209, -412}, { -1238, 899}, { -707, -707}, { -60, 82}, { -347, -176}, { 9, -30}, { -176, -27}, { 0, -18}, { -143, 22}, { -22, -68}, { -58, 29} }, { { 0, 0}, /* Filter 53 */ { 0, 0}, { -136, -21}, { 0, -80}, { -133, 21}, { -35, -109}, { -228, 116}, { -208, -287}, { -320, 320}, { -1213, -881}, { 376, -739}, { -2659, -863}, { 1239, -7825}, { 11059, 0}, { 1530, 9662}, { -4847, 1575}, { -201, -395}, { -1240, 901}, { -703, -703}, { -62, 85}, { -346, -176}, { 9, -28}, { -176, -27}, { 0, -16}, { -143, 22}, { -21, -67}, { -58, 29} }, { { 0, 0}, /* Filter 54 */ { 0, 0}, { -136, -21}, { 0, -79}, { -134, 21}, { -35, -108}, { -230, 117}, { -207, -286}, { -324, 324}, { -1215, -883}, { 371, -729}, { -2683, -871}, { 1243, -7850}, { 11065, 0}, { 1527, 9644}, { -4821, 1566}, { -193, -379}, { -1242, 902}, { -699, -699}, { -64, 89}, { -345, -176}, { 8, -26}, { -176, -27}, { 0, -15}, { -143, 22}, { -21, -66}, { -59, 30} }, { { 0, 0}, /* Filter 55 */ { 0, 1}, { -136, -21}, { 0, -78}, { -135, 21}, { -34, -107}, { -232, 118}, { -206, -284}, { -329, 329}, { -1218, -885}, { 366, -719}, { -2707, -879}, { 1247, -7874}, { 11070, 0}, { 1524, 9627}, { -4795, 1558}, { -184, -362}, { -1243, 903}, { -694, -694}, { -67, 92}, { -344, -175}, { 7, -24}, { -176, -27}, { 0, -14}, { -143, 22}, { -21, -65}, { -59, 30} }, { { 0, 0}, /* Filter 56 */ { 0, 2}, { -137, -21}, { 0, -77}, { -136, 21}, { -34, -105}, { -234, 119}, { -205, -283}, { -333, 333}, { -1220, -886}, { 361, -709}, { -2731, -887}, { 1251, -7898}, { 11076, 0}, { 1521, 9609}, { -4769, 1549}, { -176, -346}, { -1245, 905}, { -690, -690}, { -69, 95}, { -343, -175}, { 7, -22}, { -175, -27}, { 0, -13}, { -144, 22}, { -21, -65}, { -59, 30} }, { { 0, 0}, /* Filter 57 */ { -1, 3}, { -137, -21}, { 0, -76}, { -137, 21}, { -33, -104}, { -235, 120}, { -204, -281}, { -337, 337}, { -1222, -888}, { 356, -699}, { -2755, -895}, { 1254, -7922}, { 11081, 0}, { 1519, 9591}, { -4742, 1541}, { -168, -330}, { -1247, 906}, { -686, -686}, { -71, 99}, { -342, -174}, { 6, -20}, { -175, -27}, { 0, -11}, { -144, 22}, { -20, -64}, { -60, 30} }, { { 0, 0}, /* Filter 58 */ { -1, 3}, { -138, -21}, { 0, -75}, { -138, 21}, { -33, -103}, { -237, 121}, { -203, -280}, { -342, 342}, { -1224, -889}, { 351, -689}, { -2780, -903}, { 1258, -7946}, { 11086, 0}, { 1516, 9572}, { -4716, 1532}, { -160, -314}, { -1249, 907}, { -681, -681}, { -74, 102}, { -342, -174}, { 6, -18}, { -175, -27}, { 0, -10}, { -144, 22}, { -20, -63}, { -60, 30} }, { { 0, 0}, /* Filter 59 */ { -1, 4}, { -138, -21}, { 0, -74}, { -138, 22}, { -33, -102}, { -239, 121}, { -202, -278}, { -346, 346}, { -1226, -891}, { 345, -678}, { -2804, -911}, { 1262, -7971}, { 11091, 0}, { 1513, 9554}, { -4690, 1524}, { -152, -298}, { -1250, 908}, { -677, -677}, { -76, 105}, { -341, -173}, { 5, -16}, { -175, -27}, { 0, -9}, { -144, 22}, { -20, -62}, { -60, 30} }, { { 0, 0}, /* Filter 60 */ { -1, 5}, { -138, -21}, { 0, -73}, { -139, 22}, { -32, -100}, { -241, 122}, { -201, -277}, { -351, 351}, { -1228, -892}, { 340, -668}, { -2828, -919}, { 1266, -7995}, { 11096, 0}, { 1510, 9536}, { -4664, 1515}, { -143, -282}, { -1252, 909}, { -673, -673}, { -78, 108}, { -340, -173}, { 4, -15}, { -175, -27}, { 0, -8}, { -144, 22}, { -20, -62}, { -61, 31} }, { { 0, 0}, /* Filter 61 */ { -1, 6}, { -139, -22}, { 0, -72}, { -140, 22}, { -32, -99}, { -242, 123}, { -200, -275}, { -355, 355}, { -1230, -894}, { 335, -658}, { -2853, -927}, { 1270, -8019}, { 11100, 0}, { 1507, 9517}, { -4638, 1507}, { -135, -266}, { -1253, 911}, { -668, -668}, { -81, 111}, { -339, -172}, { 4, -13}, { -175, -27}, { 0, -7}, { -145, 22}, { -19, -61}, { -61, 31} }, { { 0, 0}, /* Filter 62 */ { -2, 6}, { -139, -22}, { 0, -71}, { -141, 22}, { -31, -98}, { -244, 124}, { -199, -274}, { -359, 359}, { -1232, -895}, { 329, -647}, { -2877, -935}, { 1273, -8042}, { 11105, 0}, { 1504, 9499}, { -4612, 1498}, { -127, -250}, { -1255, 912}, { -664, -664}, { -83, 114}, { -338, -172}, { 3, -11}, { -175, -27}, { 0, -5}, { -145, 23}, { -19, -60}, { -61, 31} }, { { 0, 0}, /* Filter 63 */ { -2, 7}, { -139, -22}, { 0, -70}, { -142, 22}, { -31, -96}, { -246, 125}, { -198, -272}, { -364, 364}, { -1234, -896}, { 324, -636}, { -2902, -943}, { 1277, -8066}, { 11109, 0}, { 1501, 9480}, { -4585, 1490}, { -119, -234}, { -1256, 913}, { -659, -659}, { -85, 117}, { -337, -171}, { 3, -9}, { -175, -27}, { 0, -4}, { -145, 23}, { -19, -59}, { -62, 31} }, { { 0, 0}, /* Filter 64 */ { -2, 8}, { -139, -22}, { 0, -69}, { -143, 22}, { -31, -95}, { -248, 126}, { -196, -271}, { -368, 368}, { -1236, -898}, { 319, -626}, { -2926, -950}, { 1281, -8090}, { 11113, 0}, { 1498, 9462}, { -4559, 1481}, { -111, -219}, { -1258, 914}, { -655, -655}, { -87, 121}, { -336, -171}, { 2, -7}, { -174, -27}, { 0, -3}, { -145, 23}, { -19, -58}, { -62, 31} }, { { 0, 0}, /* Filter 65 */ { -2, 9}, { -140, -22}, { 0, -68}, { -143, 22}, { -30, -94}, { -249, 127}, { -195, -269}, { -373, 373}, { -1238, -899}, { 313, -615}, { -2951, -958}, { 1285, -8114}, { 11117, 0}, { 1495, 9443}, { -4533, 1473}, { -103, -203}, { -1259, 915}, { -651, -651}, { -90, 124}, { -335, -170}, { 1, -5}, { -174, -27}, { 0, -2}, { -145, 23}, { -18, -58}, { -62, 31} }, { { 0, 0}, /* Filter 66 */ { -3, 9}, { -140, -22}, { 0, -67}, { -144, 22}, { -30, -93}, { -251, 128}, { -194, -267}, { -377, 377}, { -1239, -900}, { 307, -604}, { -2976, -966}, { 1288, -8138}, { 11121, 0}, { 1492, 9424}, { -4507, 1464}, { -95, -188}, { -1260, 915}, { -646, -646}, { -92, 127}, { -334, -170}, { 1, -3}, { -174, -27}, { 0, 0}, { -145, 23}, { -18, -57}, { -63, 32} }, { { 0, 0}, /* Filter 67 */ { -3, 10}, { -140, -22}, { 0, -66}, { -145, 23}, { -29, -91}, { -253, 129}, { -193, -266}, { -382, 382}, { -1241, -902}, { 302, -593}, { -3000, -975}, { 1292, -8161}, { 11125, 0}, { 1489, 9405}, { -4481, 1456}, { -88, -172}, { -1261, 916}, { -642, -642}, { -94, 130}, { -333, -169}, { 0, -1}, { -174, -27}, { 0, 0}, { -145, 23}, { -18, -56}, { -63, 32} }, { { 0, 0}, /* Filter 68 */ { -3, 11}, { -141, -22}, { 0, -65}, { -146, 23}, { -29, -90}, { -254, 129}, { -192, -264}, { -386, 386}, { -1243, -903}, { 296, -582}, { -3025, -983}, { 1296, -8185}, { 11129, 0}, { 1486, 9386}, { -4455, 1447}, { -80, -157}, { -1263, 917}, { -637, -637}, { -96, 133}, { -332, -169}, { 0, 0}, { -174, -27}, { 0, 1}, { -146, 23}, { -18, -55}, { -63, 32} }, { { 0, 0}, /* Filter 69 */ { -3, 12}, { -141, -22}, { 0, -64}, { -146, 23}, { -28, -89}, { -256, 130}, { -190, -262}, { -391, 391}, { -1245, -904}, { 291, -571}, { -3050, -991}, { 1300, -8208}, { 11133, 0}, { 1483, 9367}, { -4429, 1439}, { -72, -142}, { -1264, 918}, { -633, -633}, { -98, 136}, { -331, -168}, { 0, 1}, { -173, -27}, { 0, 2}, { -146, 23}, { -17, -55}, { -63, 32} }, { { 0, 0}, /* Filter 70 */ { -4, 13}, { -141, -22}, { 0, -63}, { -147, 23}, { -28, -87}, { -258, 131}, { -189, -261}, { -395, 395}, { -1246, -905}, { 285, -560}, { -3074, -999}, { 1303, -8232}, { 11136, 0}, { 1480, 9347}, { -4403, 1430}, { -64, -126}, { -1265, 919}, { -629, -629}, { -101, 139}, { -330, -168}, { -1, 3}, { -173, -27}, { 0, 3}, { -146, 23}, { -17, -54}, { -64, 32} }, { { 0, 0}, /* Filter 71 */ { -4, 13}, { -141, -22}, { 0, -62}, { -148, 23}, { -28, -86}, { -259, 132}, { -188, -259}, { -399, 399}, { -1248, -906}, { 279, -548}, { -3099, -1007}, { 1307, -8255}, { 11140, 0}, { 1477, 9328}, { -4377, 1422}, { -56, -111}, { -1266, 919}, { -624, -624}, { -103, 142}, { -329, -167}, { -1, 5}, { -173, -27}, { 0, 5}, { -146, 23}, { -17, -53}, { -64, 32} }, { { 0, 0}, /* Filter 72 */ { -4, 14}, { -142, -22}, { 0, -61}, { -149, 23}, { -27, -84}, { -261, 133}, { -187, -257}, { -404, 404}, { -1249, -908}, { 273, -537}, { -3124, -1015}, { 1311, -8278}, { 11143, 0}, { 1474, 9308}, { -4351, 1413}, { -49, -96}, { -1267, 920}, { -620, -620}, { -105, 144}, { -328, -167}, { -2, 7}, { -173, -27}, { 0, 6}, { -146, 23}, { -17, -52}, { -64, 32} }, { { 0, 0}, /* Filter 73 */ { -5, 15}, { -142, -22}, { 0, -60}, { -149, 23}, { -27, -83}, { -263, 134}, { -185, -255}, { -408, 408}, { -1251, -909}, { 268, -526}, { -3149, -1023}, { 1314, -8301}, { 11146, 0}, { 1471, 9289}, { -4325, 1405}, { -41, -81}, { -1267, 921}, { -615, -615}, { -107, 147}, { -327, -166}, { -2, 9}, { -172, -27}, { 0, 7}, { -146, 23}, { -16, -51}, { -65, 33} }, { { 0, 0}, /* Filter 74 */ { -5, 16}, { -142, -22}, { 0, -59}, { -150, 23}, { -26, -82}, { -264, 134}, { -184, -253}, { -413, 413}, { -1252, -910}, { 262, -514}, { -3174, -1031}, { 1318, -8324}, { 11149, 0}, { 1468, 9269}, { -4299, 1396}, { -34, -66}, { -1268, 921}, { -611, -611}, { -109, 150}, { -326, -166}, { -3, 10}, { -172, -27}, { 0, 8}, { -146, 23}, { -16, -51}, { -65, 33} }, { { 0, 0}, /* Filter 75 */ { -5, 16}, { -142, -22}, { 0, -57}, { -151, 23}, { -26, -80}, { -266, 135}, { -183, -252}, { -417, 417}, { -1254, -911}, { 256, -503}, { -3199, -1039}, { 1322, -8348}, { 11152, 0}, { 1465, 9250}, { -4273, 1388}, { -26, -51}, { -1269, 922}, { -606, -606}, { -111, 153}, { -325, -165}, { -4, 12}, { -172, -27}, { 0, 9}, { -146, 23}, { -16, -50}, { -65, 33} }, { { 0, 0}, /* Filter 76 */ { -5, 17}, { -143, -22}, { 0, -56}, { -151, 24}, { -25, -79}, { -268, 136}, { -181, -250}, { -422, 422}, { -1255, -912}, { 250, -491}, { -3224, -1047}, { 1325, -8371}, { 11154, 0}, { 1461, 9230}, { -4246, 1379}, { -18, -37}, { -1270, 922}, { -602, -602}, { -113, 156}, { -323, -165}, { -4, 14}, { -172, -27}, { 0, 11}, { -146, 23}, { -16, -49}, { -65, 33} }, { { 0, 0}, /* Filter 77 */ { -6, 18}, { -143, -22}, { 0, -55}, { -152, 24}, { -25, -77}, { -269, 137}, { -180, -248}, { -426, 426}, { -1256, -913}, { 244, -479}, { -3249, -1055}, { 1329, -8394}, { 11157, 0}, { 1458, 9210}, { -4221, 1371}, { -11, -22}, { -1270, 923}, { -597, -597}, { -115, 159}, { -322, -164}, { -5, 16}, { -171, -27}, { 0, 12}, { -146, 23}, { -15, -48}, { -66, 33} }, { { 0, 0}, /* Filter 78 */ { -6, 19}, { -143, -22}, { 0, -54}, { -153, 24}, { -24, -76}, { -271, 138}, { -178, -246}, { -431, 431}, { -1258, -914}, { 238, -468}, { -3274, -1063}, { 1333, -8416}, { 11159, 0}, { 1455, 9190}, { -4195, 1363}, { -3, -7}, { -1271, 923}, { -593, -593}, { -117, 161}, { -321, -163}, { -5, 18}, { -171, -27}, { 0, 13}, { -146, 23}, { -15, -47}, { -66, 33} }, { { 0, 0}, /* Filter 79 */ { -6, 20}, { -143, -22}, { 0, -53}, { -153, 24}, { -24, -74}, { -272, 139}, { -177, -244}, { -435, 435}, { -1259, -914}, { 232, -456}, { -3299, -1072}, { 1336, -8439}, { 11162, 0}, { 1452, 9170}, { -4169, 1354}, { 3, 6}, { -1271, 924}, { -588, -588}, { -119, 164}, { -320, -163}, { -6, 19}, { -171, -27}, { 0, 14}, { -146, 23}, { -15, -47}, { -66, 33} }, { { 0, 0}, /* Filter 80 */ { -6, 20}, { -144, -22}, { 0, -52}, { -154, 24}, { -23, -73}, { -274, 139}, { -176, -242}, { -440, 440}, { -1260, -915}, { 226, -444}, { -3324, -1080}, { 1340, -8462}, { 11164, 0}, { 1449, 9150}, { -4143, 1346}, { 10, 21}, { -1272, 924}, { -584, -584}, { -121, 167}, { -319, -162}, { -7, 21}, { -170, -27}, { 0, 15}, { -146, 23}, { -15, -46}, { -66, 34} }, { { 0, 0}, /* Filter 81 */ { -7, 21}, { -144, -22}, { 0, -51}, { -155, 24}, { -23, -71}, { -276, 140}, { -174, -240}, { -444, 444}, { -1261, -916}, { 220, -432}, { -3349, -1088}, { 1343, -8485}, { 11166, 0}, { 1446, 9129}, { -4117, 1337}, { 18, 35}, { -1272, 924}, { -579, -579}, { -123, 170}, { -317, -162}, { -7, 23}, { -170, -26}, { 0, 17}, { -146, 23}, { -14, -45}, { -67, 34} }, { { 0, 0}, /* Filter 82 */ { -7, 22}, { -144, -22}, { 0, -50}, { -155, 24}, { -22, -70}, { -277, 141}, { -173, -238}, { -449, 449}, { -1262, -917}, { 214, -420}, { -3375, -1096}, { 1347, -8507}, { 11168, 0}, { 1442, 9109}, { -4091, 1329}, { 25, 49}, { -1273, 924}, { -575, -575}, { -125, 172}, { -316, -161}, { -8, 25}, { -170, -26}, { 0, 18}, { -146, 23}, { -14, -44}, { -67, 34} }, { { 0, 0}, /* Filter 83 */ { -7, 23}, { -144, -22}, { 0, -49}, { -156, 24}, { -22, -68}, { -279, 142}, { -171, -236}, { -453, 453}, { -1263, -918}, { 207, -407}, { -3400, -1104}, { 1351, -8530}, { 11169, 0}, { 1439, 9089}, { -4065, 1320}, { 32, 64}, { -1273, 925}, { -571, -571}, { -127, 175}, { -315, -160}, { -8, 26}, { -169, -26}, { 0, 19}, { -146, 23}, { -14, -43}, { -67, 34} }, { { 0, 0}, /* Filter 84 */ { -7, 24}, { -144, -22}, { 0, -48}, { -157, 24}, { -21, -67}, { -280, 143}, { -170, -234}, { -458, 458}, { -1264, -918}, { 201, -395}, { -3425, -1113}, { 1354, -8552}, { 11171, 0}, { 1436, 9068}, { -4039, 1312}, { 39, 78}, { -1273, 925}, { -566, -566}, { -129, 178}, { -314, -160}, { -9, 28}, { -169, -26}, { 0, 20}, { -146, 23}, { -14, -43}, { -67, 34} }, { { 0, 0}, /* Filter 85 */ { -8, 24}, { -144, -22}, { 0, -47}, { -157, 24}, { -21, -65}, { -282, 143}, { -168, -232}, { -462, 462}, { -1265, -919}, { 195, -383}, { -3450, -1121}, { 1358, -8575}, { 11173, 0}, { 1433, 9048}, { -4013, 1304}, { 47, 92}, { -1273, 925}, { -562, -562}, { -131, 180}, { -313, -159}, { -9, 30}, { -168, -26}, { 0, 21}, { -146, 23}, { -13, -42}, { -68, 34} }, { { 0, 0}, /* Filter 86 */ { -8, 25}, { -145, -22}, { 0, -45}, { -158, 25}, { -20, -64}, { -283, 144}, { -167, -230}, { -467, 467}, { -1266, -920}, { 188, -370}, { -3476, -1129}, { 1361, -8597}, { 11174, 0}, { 1429, 9027}, { -3987, 1295}, { 54, 106}, { -1273, 925}, { -557, -557}, { -133, 183}, { -311, -158}, { -10, 31}, { -168, -26}, { 0, 23}, { -146, 23}, { -13, -41}, { -68, 34} }, { { 0, 0}, /* Filter 87 */ { -8, 26}, { -145, -23}, { 0, -44}, { -158, 25}, { -20, -62}, { -285, 145}, { -165, -228}, { -471, 471}, { -1267, -920}, { 182, -358}, { -3501, -1137}, { 1365, -8619}, { 11175, 0}, { 1426, 9006}, { -3962, 1287}, { 61, 120}, { -1274, 925}, { -553, -553}, { -134, 185}, { -310, -158}, { -10, 33}, { -168, -26}, { 0, 24}, { -146, 23}, { -13, -40}, { -68, 34} }, { { 0, 0}, /* Filter 88 */ { -8, 27}, { -145, -23}, { 0, -43}, { -159, 25}, { -19, -61}, { -286, 146}, { -164, -225}, { -476, 476}, { -1268, -921}, { 176, -345}, { -3526, -1145}, { 1368, -8641}, { 11176, 0}, { 1423, 8985}, { -3936, 1278}, { 68, 134}, { -1274, 925}, { -548, -548}, { -136, 188}, { -309, -157}, { -11, 35}, { -167, -26}, { 0, 25}, { -146, 23}, { -12, -39}, { -68, 35} }, { { 0, 0}, /* Filter 89 */ { -9, 28}, { -145, -23}, { 0, -42}, { -160, 25}, { -19, -59}, { -288, 146}, { -162, -223}, { -480, 480}, { -1268, -921}, { 169, -333}, { -3552, -1154}, { 1372, -8663}, { 11177, 0}, { 1419, 8964}, { -3910, 1270}, { 75, 148}, { -1274, 925}, { -544, -544}, { -138, 190}, { -307, -156}, { -12, 37}, { -167, -26}, { 0, 26}, { -146, 23}, { -12, -39}, { -68, 35} }, { { 0, 0}, /* Filter 90 */ { -9, 28}, { -145, -23}, { 0, -41}, { -160, 25}, { -18, -58}, { -289, 147}, { -160, -221}, { -485, 485}, { -1269, -922}, { 163, -320}, { -3577, -1162}, { 1375, -8685}, { 11178, 0}, { 1416, 8943}, { -3884, 1262}, { 82, 161}, { -1274, 925}, { -539, -539}, { -140, 193}, { -306, -156}, { -12, 38}, { -166, -26}, { 0, 27}, { -146, 23}, { -12, -38}, { -69, 35} }, { { 0, 0}, /* Filter 91 */ { -9, 29}, { -145, -23}, { 0, -40}, { -161, 25}, { -18, -56}, { -291, 148}, { -159, -219}, { -489, 489}, { -1270, -922}, { 156, -307}, { -3603, -1170}, { 1379, -8707}, { 11179, 0}, { 1413, 8922}, { -3859, 1253}, { 89, 175}, { -1273, 925}, { -535, -535}, { -142, 195}, { -305, -155}, { -13, 40}, { -166, -26}, { 0, 28}, { -146, 23}, { -12, -37}, { -69, 35} }, { { 0, 0}, /* Filter 92 */ { -9, 30}, { -145, -23}, { 0, -39}, { -161, 25}, { -17, -55}, { -292, 149}, { -157, -217}, { -494, 494}, { -1270, -923}, { 150, -294}, { -3628, -1178}, { 1382, -8729}, { 11180, 0}, { 1409, 8901}, { -3833, 1245}, { 96, 189}, { -1273, 925}, { -530, -530}, { -144, 198}, { -303, -154}, { -13, 42}, { -165, -26}, { 0, 30}, { -146, 23}, { -11, -36}, { -69, 35} }, { { 0, 0}, /* Filter 93 */ { -10, 31}, { -146, -23}, { 0, -38}, { -162, 25}, { -17, -53}, { -294, 149}, { -156, -214}, { -498, 498}, { -1271, -923}, { 143, -281}, { -3654, -1187}, { 1386, -8751}, { 11180, 0}, { 1406, 8880}, { -3807, 1237}, { 103, 202}, { -1273, 925}, { -525, -525}, { -145, 200}, { -302, -154}, { -14, 43}, { -165, -26}, { 0, 31}, { -146, 23}, { -11, -35}, { -69, 35} }, { { 0, 0}, /* Filter 94 */ { -10, 31}, { -146, -23}, { 0, -36}, { -162, 25}, { -16, -51}, { -295, 150}, { -154, -212}, { -503, 503}, { -1271, -924}, { 136, -268}, { -3679, -1195}, { 1389, -8773}, { 11180, 0}, { 1403, 8859}, { -3782, 1228}, { 110, 215}, { -1273, 925}, { -521, -521}, { -147, 203}, { -301, -153}, { -14, 45}, { -164, -26}, { 0, 32}, { -146, 23}, { -11, -35}, { -69, 35} }, { { 0, 0}, /* Filter 95 */ { -10, 32}, { -146, -23}, { 0, -35}, { -163, 25}, { -16, -50}, { -296, 151}, { -152, -210}, { -507, 507}, { -1272, -924}, { 130, -255}, { -3705, -1203}, { 1392, -8794}, { 11181, 0}, { 1399, 8837}, { -3756, 1220}, { 116, 229}, { -1273, 924}, { -516, -516}, { -149, 205}, { -299, -152}, { -15, 47}, { -164, -26}, { 0, 33}, { -146, 23}, { -11, -34}, { -70, 35} }, { { 0, 0}, /* Filter 96 */ { -10, 33}, { -146, -23}, { 0, -34}, { -163, 25}, { -15, -48}, { -298, 151}, { -151, -207}, { -512, 512}, { -1272, -924}, { 123, -242}, { -3730, -1212}, { 1396, -8816}, { 11181, 0}, { 1396, 8816}, { -3730, 1212}, { 123, 242}, { -1272, 924}, { -512, -512}, { -151, 207}, { -298, -151}, { -15, 48}, { -163, -25}, { 0, 34}, { -146, 23}, { -10, -33}, { -70, 35} }, { { 0, 0}, /* Filter 97 */ { -11, 34}, { -146, -23}, { 0, -33}, { -164, 26}, { -15, -47}, { -299, 152}, { -149, -205}, { -516, 516}, { -1273, -924}, { 116, -229}, { -3756, -1220}, { 1399, -8837}, { 11181, 0}, { 1392, 8794}, { -3705, 1203}, { 130, 255}, { -1272, 924}, { -507, -507}, { -152, 210}, { -296, -151}, { -16, 50}, { -163, -25}, { 0, 35}, { -146, 23}, { -10, -32}, { -70, 35} }, { { 0, 0}, /* Filter 98 */ { -11, 35}, { -146, -23}, { 0, -32}, { -164, 26}, { -14, -45}, { -301, 153}, { -147, -203}, { -521, 521}, { -1273, -925}, { 110, -215}, { -3782, -1228}, { 1403, -8859}, { 11180, 0}, { 1389, 8773}, { -3679, 1195}, { 136, 268}, { -1271, 924}, { -503, -503}, { -154, 212}, { -295, -150}, { -16, 51}, { -162, -25}, { 0, 36}, { -146, 23}, { -10, -31}, { -70, 35} }, { { 0, 0}, /* Filter 99 */ { -11, 35}, { -146, -23}, { 0, -31}, { -165, 26}, { -14, -43}, { -302, 154}, { -145, -200}, { -525, 525}, { -1273, -925}, { 103, -202}, { -3807, -1237}, { 1406, -8880}, { 11180, 0}, { 1386, 8751}, { -3654, 1187}, { 143, 281}, { -1271, 923}, { -498, -498}, { -156, 214}, { -294, -149}, { -17, 53}, { -162, -25}, { 0, 38}, { -146, 23}, { -10, -31}, { -70, 36} }, { { 0, 0}, /* Filter 100 */ { -11, 36}, { -146, -23}, { 0, -30}, { -165, 26}, { -13, -42}, { -303, 154}, { -144, -198}, { -530, 530}, { -1273, -925}, { 96, -189}, { -3833, -1245}, { 1409, -8901}, { 11180, 0}, { 1382, 8729}, { -3628, 1178}, { 150, 294}, { -1270, 923}, { -494, -494}, { -157, 217}, { -292, -149}, { -17, 55}, { -161, -25}, { 0, 39}, { -145, 23}, { -9, -30}, { -70, 36} }, { { 0, 0}, /* Filter 101 */ { -12, 37}, { -146, -23}, { 0, -28}, { -166, 26}, { -13, -40}, { -305, 155}, { -142, -195}, { -535, 535}, { -1273, -925}, { 89, -175}, { -3859, -1253}, { 1413, -8922}, { 11179, 0}, { 1379, 8707}, { -3603, 1170}, { 156, 307}, { -1270, 922}, { -489, -489}, { -159, 219}, { -291, -148}, { -18, 56}, { -161, -25}, { 0, 40}, { -145, 23}, { -9, -29}, { -71, 36} }, { { 0, 0}, /* Filter 102 */ { -12, 38}, { -146, -23}, { 0, -27}, { -166, 26}, { -12, -38}, { -306, 156}, { -140, -193}, { -539, 539}, { -1274, -925}, { 82, -161}, { -3884, -1262}, { 1416, -8943}, { 11178, 0}, { 1375, 8685}, { -3577, 1162}, { 163, 320}, { -1269, 922}, { -485, -485}, { -160, 221}, { -289, -147}, { -18, 58}, { -160, -25}, { 0, 41}, { -145, 23}, { -9, -28}, { -71, 36} }, { { 0, 0}, /* Filter 103 */ { -12, 39}, { -146, -23}, { 0, -26}, { -167, 26}, { -12, -37}, { -307, 156}, { -138, -190}, { -544, 544}, { -1274, -925}, { 75, -148}, { -3910, -1270}, { 1419, -8964}, { 11177, 0}, { 1372, 8663}, { -3552, 1154}, { 169, 333}, { -1268, 921}, { -480, -480}, { -162, 223}, { -288, -146}, { -19, 59}, { -160, -25}, { 0, 42}, { -145, 23}, { -9, -28}, { -71, 36} }, { { 0, 0}, /* Filter 104 */ { -12, 39}, { -146, -23}, { 0, -25}, { -167, 26}, { -11, -35}, { -309, 157}, { -136, -188}, { -548, 548}, { -1274, -925}, { 68, -134}, { -3936, -1278}, { 1423, -8985}, { 11176, 0}, { 1368, 8641}, { -3526, 1145}, { 176, 345}, { -1268, 921}, { -476, -476}, { -164, 225}, { -286, -146}, { -19, 61}, { -159, -25}, { 0, 43}, { -145, 23}, { -8, -27}, { -71, 36} }, { { 0, 0}, /* Filter 105 */ { -13, 40}, { -146, -23}, { 0, -24}, { -168, 26}, { -10, -33}, { -310, 158}, { -134, -185}, { -553, 553}, { -1274, -925}, { 61, -120}, { -3962, -1287}, { 1426, -9006}, { 11175, 0}, { 1365, 8619}, { -3501, 1137}, { 182, 358}, { -1267, 920}, { -471, -471}, { -165, 228}, { -285, -145}, { -20, 62}, { -158, -25}, { 0, 44}, { -145, 23}, { -8, -26}, { -71, 36} }, { { 0, 0}, /* Filter 106 */ { -13, 41}, { -146, -23}, { 0, -23}, { -168, 26}, { -10, -31}, { -311, 158}, { -133, -183}, { -557, 557}, { -1273, -925}, { 54, -106}, { -3987, -1295}, { 1429, -9027}, { 11174, 0}, { 1361, 8597}, { -3476, 1129}, { 188, 370}, { -1266, 920}, { -467, -467}, { -167, 230}, { -283, -144}, { -20, 64}, { -158, -25}, { 0, 45}, { -145, 22}, { -8, -25}, { -71, 36} }, { { 0, 0}, /* Filter 107 */ { -13, 42}, { -146, -23}, { 0, -21}, { -168, 26}, { -9, -30}, { -313, 159}, { -131, -180}, { -562, 562}, { -1273, -925}, { 47, -92}, { -4013, -1304}, { 1433, -9048}, { 11173, 0}, { 1358, 8575}, { -3450, 1121}, { 195, 383}, { -1265, 919}, { -462, -462}, { -168, 232}, { -282, -143}, { -21, 65}, { -157, -24}, { 0, 47}, { -144, 22}, { -8, -24}, { -71, 36} }, { { 0, 0}, /* Filter 108 */ { -14, 43}, { -146, -23}, { 0, -20}, { -169, 26}, { -9, -28}, { -314, 160}, { -129, -178}, { -566, 566}, { -1273, -925}, { 39, -78}, { -4039, -1312}, { 1436, -9068}, { 11171, 0}, { 1354, 8552}, { -3425, 1113}, { 201, 395}, { -1264, 918}, { -458, -458}, { -170, 234}, { -280, -143}, { -21, 67}, { -157, -24}, { 0, 48}, { -144, 22}, { -7, -24}, { -72, 36} }, { { 0, 0}, /* Filter 109 */ { -14, 43}, { -146, -23}, { 0, -19}, { -169, 26}, { -8, -26}, { -315, 160}, { -127, -175}, { -571, 571}, { -1273, -925}, { 32, -64}, { -4065, -1320}, { 1439, -9089}, { 11169, 0}, { 1351, 8530}, { -3400, 1104}, { 207, 407}, { -1263, 918}, { -453, -453}, { -171, 236}, { -279, -142}, { -22, 68}, { -156, -24}, { 0, 49}, { -144, 22}, { -7, -23}, { -72, 36} }, { { 0, 0}, /* Filter 110 */ { -14, 44}, { -146, -23}, { 0, -18}, { -170, 26}, { -8, -25}, { -316, 161}, { -125, -172}, { -575, 575}, { -1273, -924}, { 25, -49}, { -4091, -1329}, { 1442, -9109}, { 11168, 0}, { 1347, 8507}, { -3375, 1096}, { 214, 420}, { -1262, 917}, { -449, -449}, { -173, 238}, { -277, -141}, { -22, 70}, { -155, -24}, { 0, 50}, { -144, 22}, { -7, -22}, { -72, 36} }, { { 0, 0}, /* Filter 111 */ { -14, 45}, { -146, -23}, { 0, -17}, { -170, 26}, { -7, -23}, { -317, 162}, { -123, -170}, { -579, 579}, { -1272, -924}, { 18, -35}, { -4117, -1337}, { 1446, -9129}, { 11166, 0}, { 1343, 8485}, { -3349, 1088}, { 220, 432}, { -1261, 916}, { -444, -444}, { -174, 240}, { -276, -140}, { -23, 71}, { -155, -24}, { 0, 51}, { -144, 22}, { -7, -21}, { -72, 36} }, { { 0, 0}, /* Filter 112 */ { -15, 46}, { -146, -23}, { 0, -15}, { -170, 27}, { -7, -21}, { -319, 162}, { -121, -167}, { -584, 584}, { -1272, -924}, { 10, -21}, { -4143, -1346}, { 1449, -9150}, { 11164, 0}, { 1340, 8462}, { -3324, 1080}, { 226, 444}, { -1260, 915}, { -440, -440}, { -176, 242}, { -274, -139}, { -23, 73}, { -154, -24}, { 0, 52}, { -144, 22}, { -6, -20}, { -72, 36} }, { { 0, 0}, /* Filter 113 */ { -15, 47}, { -146, -23}, { 0, -14}, { -171, 27}, { -6, -19}, { -320, 163}, { -119, -164}, { -588, 588}, { -1271, -924}, { 3, -6}, { -4169, -1354}, { 1452, -9170}, { 11162, 0}, { 1336, 8439}, { -3299, 1072}, { 232, 456}, { -1259, 914}, { -435, -435}, { -177, 244}, { -272, -139}, { -24, 74}, { -153, -24}, { 0, 53}, { -143, 22}, { -6, -20}, { -72, 36} }, { { 0, 0}, /* Filter 114 */ { -15, 47}, { -146, -23}, { 0, -13}, { -171, 27}, { -5, -18}, { -321, 163}, { -117, -161}, { -593, 593}, { -1271, -923}, { -3, 7}, { -4195, -1363}, { 1455, -9190}, { 11159, 0}, { 1333, 8416}, { -3274, 1063}, { 238, 468}, { -1258, 914}, { -431, -431}, { -178, 246}, { -271, -138}, { -24, 76}, { -153, -24}, { 0, 54}, { -143, 22}, { -6, -19}, { -72, 37} }, { { 0, 0}, /* Filter 115 */ { -15, 48}, { -146, -23}, { 0, -12}, { -171, 27}, { -5, -16}, { -322, 164}, { -115, -159}, { -597, 597}, { -1270, -923}, { -11, 22}, { -4221, -1371}, { 1458, -9210}, { 11157, 0}, { 1329, 8394}, { -3249, 1055}, { 244, 479}, { -1256, 913}, { -426, -426}, { -180, 248}, { -269, -137}, { -25, 77}, { -152, -24}, { 0, 55}, { -143, 22}, { -6, -18}, { -72, 37} }, { { 0, 0}, /* Filter 116 */ { -16, 49}, { -146, -23}, { 0, -11}, { -172, 27}, { -4, -14}, { -323, 165}, { -113, -156}, { -602, 602}, { -1270, -922}, { -18, 37}, { -4246, -1379}, { 1461, -9230}, { 11154, 0}, { 1325, 8371}, { -3224, 1047}, { 250, 491}, { -1255, 912}, { -422, -422}, { -181, 250}, { -268, -136}, { -25, 79}, { -151, -24}, { 0, 56}, { -143, 22}, { -5, -17}, { -72, 37} }, { { 0, 0}, /* Filter 117 */ { -16, 50}, { -146, -23}, { 0, -9}, { -172, 27}, { -4, -12}, { -325, 165}, { -111, -153}, { -606, 606}, { -1269, -922}, { -26, 51}, { -4273, -1388}, { 1465, -9250}, { 11152, 0}, { 1322, 8348}, { -3199, 1039}, { 256, 503}, { -1254, 911}, { -417, -417}, { -183, 252}, { -266, -135}, { -26, 80}, { -151, -23}, { 0, 57}, { -142, 22}, { -5, -16}, { -72, 37} }, { { 0, 0}, /* Filter 118 */ { -16, 51}, { -146, -23}, { 0, -8}, { -172, 27}, { -3, -10}, { -326, 166}, { -109, -150}, { -611, 611}, { -1268, -921}, { -34, 66}, { -4299, -1396}, { 1468, -9269}, { 11149, 0}, { 1318, 8324}, { -3174, 1031}, { 262, 514}, { -1252, 910}, { -413, -413}, { -184, 253}, { -264, -134}, { -26, 82}, { -150, -23}, { 0, 59}, { -142, 22}, { -5, -16}, { -73, 37} }, { { 0, 0}, /* Filter 119 */ { -16, 51}, { -146, -23}, { 0, -7}, { -172, 27}, { -2, -9}, { -327, 166}, { -107, -147}, { -615, 615}, { -1267, -921}, { -41, 81}, { -4325, -1405}, { 1471, -9289}, { 11146, 0}, { 1314, 8301}, { -3149, 1023}, { 268, 526}, { -1251, 909}, { -408, -408}, { -185, 255}, { -263, -134}, { -27, 83}, { -149, -23}, { 0, 60}, { -142, 22}, { -5, -15}, { -73, 37} }, { { 0, 0}, /* Filter 120 */ { -17, 52}, { -146, -23}, { 0, -6}, { -173, 27}, { -2, -7}, { -328, 167}, { -105, -144}, { -620, 620}, { -1267, -920}, { -49, 96}, { -4351, -1413}, { 1474, -9308}, { 11143, 0}, { 1311, 8278}, { -3124, 1015}, { 273, 537}, { -1249, 908}, { -404, -404}, { -187, 257}, { -261, -133}, { -27, 84}, { -149, -23}, { 0, 61}, { -142, 22}, { -4, -14}, { -73, 37} }, { { 0, 0}, /* Filter 121 */ { -17, 53}, { -146, -23}, { 0, -5}, { -173, 27}, { -1, -5}, { -329, 167}, { -103, -142}, { -624, 624}, { -1266, -919}, { -56, 111}, { -4377, -1422}, { 1477, -9328}, { 11140, 0}, { 1307, 8255}, { -3099, 1007}, { 279, 548}, { -1248, 906}, { -399, -399}, { -188, 259}, { -259, -132}, { -28, 86}, { -148, -23}, { 0, 62}, { -141, 22}, { -4, -13}, { -73, 37} }, { { 0, 0}, /* Filter 122 */ { -17, 54}, { -146, -23}, { 0, -3}, { -173, 27}, { -1, -3}, { -330, 168}, { -101, -139}, { -629, 629}, { -1265, -919}, { -64, 126}, { -4403, -1430}, { 1480, -9347}, { 11136, 0}, { 1303, 8232}, { -3074, 999}, { 285, 560}, { -1246, 905}, { -395, -395}, { -189, 261}, { -258, -131}, { -28, 87}, { -147, -23}, { 0, 63}, { -141, 22}, { -4, -13}, { -73, 37} }, { { 0, 0}, /* Filter 123 */ { -17, 55}, { -146, -23}, { 0, -2}, { -173, 27}, { 0, -1}, { -331, 168}, { -98, -136}, { -633, 633}, { -1264, -918}, { -72, 142}, { -4429, -1439}, { 1483, -9367}, { 11133, 0}, { 1300, 8208}, { -3050, 991}, { 291, 571}, { -1245, 904}, { -391, -391}, { -190, 262}, { -256, -130}, { -28, 89}, { -146, -23}, { 0, 64}, { -141, 22}, { -3, -12}, { -73, 37} }, { { 0, 0}, /* Filter 124 */ { -18, 55}, { -146, -23}, { 0, -1}, { -174, 27}, { 0, 0}, { -332, 169}, { -96, -133}, { -637, 637}, { -1263, -917}, { -80, 157}, { -4455, -1447}, { 1486, -9386}, { 11129, 0}, { 1296, 8185}, { -3025, 983}, { 296, 582}, { -1243, 903}, { -386, -386}, { -192, 264}, { -254, -129}, { -29, 90}, { -146, -23}, { 0, 65}, { -141, 22}, { -3, -11}, { -73, 37} }, { { 0, 0}, /* Filter 125 */ { -18, 56}, { -145, -23}, { 0, 0}, { -174, 27}, { 0, 1}, { -333, 169}, { -94, -130}, { -642, 642}, { -1261, -916}, { -88, 172}, { -4481, -1456}, { 1489, -9405}, { 11125, 0}, { 1292, 8161}, { -3000, 975}, { 302, 593}, { -1241, 902}, { -382, -382}, { -193, 266}, { -253, -129}, { -29, 91}, { -145, -23}, { 0, 66}, { -140, 22}, { -3, -10}, { -73, 37} }, { { 0, 0}, /* Filter 126 */ { -18, 57}, { -145, -23}, { 0, 0}, { -174, 27}, { 1, 3}, { -334, 170}, { -92, -127}, { -646, 646}, { -1260, -915}, { -95, 188}, { -4507, -1464}, { 1492, -9424}, { 11121, 0}, { 1288, 8138}, { -2976, 966}, { 307, 604}, { -1239, 900}, { -377, -377}, { -194, 267}, { -251, -128}, { -30, 93}, { -144, -22}, { 0, 67}, { -140, 22}, { -3, -9}, { -73, 37} }, { { 0, 0}, /* Filter 127 */ { -18, 58}, { -145, -23}, { 0, 2}, { -174, 27}, { 1, 5}, { -335, 170}, { -90, -124}, { -651, 651}, { -1259, -915}, { -103, 203}, { -4533, -1473}, { 1495, -9443}, { 11117, 0}, { 1285, 8114}, { -2951, 958}, { 313, 615}, { -1238, 899}, { -373, -373}, { -195, 269}, { -249, -127}, { -30, 94}, { -143, -22}, { 0, 68}, { -140, 22}, { -2, -9}, { -73, 37} }, { { 0, 0}, /* Filter 128 */ { -19, 58}, { -145, -23}, { 0, 3}, { -174, 27}, { 2, 7}, { -336, 171}, { -87, -121}, { -655, 655}, { -1258, -914}, { -111, 219}, { -4559, -1481}, { 1498, -9462}, { 11113, 0}, { 1281, 8090}, { -2926, 950}, { 319, 626}, { -1236, 898}, { -368, -368}, { -196, 271}, { -248, -126}, { -31, 95}, { -143, -22}, { 0, 69}, { -139, 22}, { -2, -8}, { -73, 37} }, { { 0, 0}, /* Filter 129 */ { -19, 59}, { -145, -23}, { 0, 4}, { -175, 27}, { 3, 9}, { -337, 171}, { -85, -117}, { -659, 659}, { -1256, -913}, { -119, 234}, { -4585, -1490}, { 1501, -9480}, { 11109, 0}, { 1277, 8066}, { -2902, 943}, { 324, 636}, { -1234, 896}, { -364, -364}, { -198, 272}, { -246, -125}, { -31, 96}, { -142, -22}, { 0, 70}, { -139, 22}, { -2, -7}, { -73, 37} }, { { 0, 0}, /* Filter 130 */ { -19, 60}, { -145, -23}, { 0, 5}, { -175, 27}, { 3, 11}, { -338, 172}, { -83, -114}, { -664, 664}, { -1255, -912}, { -127, 250}, { -4612, -1498}, { 1504, -9499}, { 11105, 0}, { 1273, 8042}, { -2877, 935}, { 329, 647}, { -1232, 895}, { -359, -359}, { -199, 274}, { -244, -124}, { -31, 98}, { -141, -22}, { 0, 71}, { -139, 22}, { -2, -6}, { -73, 37} }, { { 0, 0}, /* Filter 131 */ { -19, 61}, { -145, -22}, { 0, 7}, { -175, 27}, { 4, 13}, { -339, 172}, { -81, -111}, { -668, 668}, { -1253, -911}, { -135, 266}, { -4638, -1507}, { 1507, -9517}, { 11100, 0}, { 1270, 8019}, { -2853, 927}, { 335, 658}, { -1230, 894}, { -355, -355}, { -200, 275}, { -242, -123}, { -32, 99}, { -140, -22}, { 0, 72}, { -139, 22}, { -1, -6}, { -73, 37} }, { { 0, 0}, /* Filter 132 */ { -20, 62}, { -144, -22}, { 0, 8}, { -175, 27}, { 4, 15}, { -340, 173}, { -78, -108}, { -673, 673}, { -1252, -909}, { -143, 282}, { -4664, -1515}, { 1510, -9536}, { 11096, 0}, { 1266, 7995}, { -2828, 919}, { 340, 668}, { -1228, 892}, { -351, -351}, { -201, 277}, { -241, -122}, { -32, 100}, { -139, -22}, { 0, 73}, { -138, 21}, { -1, -5}, { -73, 37} }, { { 0, 0}, /* Filter 133 */ { -20, 62}, { -144, -22}, { 0, 9}, { -175, 27}, { 5, 16}, { -341, 173}, { -76, -105}, { -677, 677}, { -1250, -908}, { -152, 298}, { -4690, -1524}, { 1513, -9554}, { 11091, 0}, { 1262, 7971}, { -2804, 911}, { 345, 678}, { -1226, 891}, { -346, -346}, { -202, 278}, { -239, -121}, { -33, 102}, { -138, -22}, { 0, 74}, { -138, 21}, { -1, -4}, { -73, 37} }, { { 0, 0}, /* Filter 134 */ { -20, 63}, { -144, -22}, { 0, 10}, { -175, 27}, { 6, 18}, { -342, 174}, { -74, -102}, { -681, 681}, { -1249, -907}, { -160, 314}, { -4716, -1532}, { 1516, -9572}, { 11086, 0}, { 1258, 7946}, { -2780, 903}, { 351, 689}, { -1224, 889}, { -342, -342}, { -203, 280}, { -237, -121}, { -33, 103}, { -138, -21}, { 0, 75}, { -138, 21}, { -1, -3}, { -73, 37} }, { { 0, 0}, /* Filter 135 */ { -20, 64}, { -144, -22}, { 0, 11}, { -175, 27}, { 6, 20}, { -342, 174}, { -71, -99}, { -686, 686}, { -1247, -906}, { -168, 330}, { -4742, -1541}, { 1519, -9591}, { 11081, 0}, { 1254, 7922}, { -2755, 895}, { 356, 699}, { -1222, 888}, { -337, -337}, { -204, 281}, { -235, -120}, { -33, 104}, { -137, -21}, { 0, 76}, { -137, 21}, { -1, -3}, { -73, 37} }, { { 0, 0}, /* Filter 136 */ { -21, 65}, { -144, -22}, { 0, 13}, { -175, 27}, { 7, 22}, { -343, 175}, { -69, -95}, { -690, 690}, { -1245, -905}, { -176, 346}, { -4769, -1549}, { 1521, -9609}, { 11076, 0}, { 1251, 7898}, { -2731, 887}, { 361, 709}, { -1220, 886}, { -333, -333}, { -205, 283}, { -234, -119}, { -34, 105}, { -136, -21}, { 0, 77}, { -137, 21}, { 0, -2}, { -73, 37} }, { { 0, 0}, /* Filter 137 */ { -21, 65}, { -143, -22}, { 0, 14}, { -176, 27}, { 7, 24}, { -344, 175}, { -67, -92}, { -694, 694}, { -1243, -903}, { -184, 362}, { -4795, -1558}, { 1524, -9627}, { 11070, 0}, { 1247, 7874}, { -2707, 879}, { 366, 719}, { -1218, 885}, { -329, -329}, { -206, 284}, { -232, -118}, { -34, 107}, { -135, -21}, { 0, 78}, { -136, 21}, { 0, -1}, { -73, 37} }, { { 0, 0}, /* Filter 138 */ { -21, 66}, { -143, -22}, { 0, 15}, { -176, 27}, { 8, 26}, { -345, 176}, { -64, -89}, { -699, 699}, { -1242, -902}, { -193, 379}, { -4821, -1566}, { 1527, -9644}, { 11065, 0}, { 1243, 7850}, { -2683, 871}, { 371, 729}, { -1215, 883}, { -324, -324}, { -207, 286}, { -230, -117}, { -35, 108}, { -134, -21}, { 0, 79}, { -136, 21}, { 0, 0}, { -73, 37} }, { { 0, 0}, /* Filter 139 */ { -21, 67}, { -143, -22}, { 0, 16}, { -176, 27}, { 9, 28}, { -346, 176}, { -62, -85}, { -703, 703}, { -1240, -901}, { -201, 395}, { -4847, -1575}, { 1530, -9662}, { 11059, 0}, { 1239, 7825}, { -2659, 863}, { 376, 739}, { -1213, 881}, { -320, -320}, { -208, 287}, { -228, -116}, { -35, 109}, { -133, -21}, { 0, 80}, { -136, 21}, { 0, 0}, { -73, 37} }, { { 0, 0}, /* Filter 140 */ { -22, 68}, { -143, -22}, { 0, 18}, { -176, 27}, { 9, 30}, { -347, 176}, { -60, -82}, { -707, 707}, { -1238, -899}, { -209, 412}, { -4873, -1583}, { 1533, -9680}, { 11054, 0}, { 1235, 7801}, { -2635, 856}, { 381, 749}, { -1211, 880}, { -315, -315}, { -209, 288}, { -226, -115}, { -35, 110}, { -133, -21}, { 0, 81}, { -135, 21}, { 0, 0}, { -73, 37} }, { { 0, 0}, /* Filter 141 */ { -22, 69}, { -143, -22}, { 0, 19}, { -176, 27}, { 10, 32}, { -347, 177}, { -57, -79}, { -711, 711}, { -1236, -898}, { -218, 428}, { -4900, -1592}, { 1536, -9698}, { 11048, 0}, { 1231, 7776}, { -2610, 848}, { 386, 759}, { -1208, 878}, { -311, -311}, { -210, 290}, { -225, -114}, { -36, 111}, { -132, -20}, { 0, 82}, { -135, 21}, { 0, 1}, { -73, 37} }, { { 0, 0}, /* Filter 142 */ { -22, 69}, { -142, -22}, { 0, 20}, { -176, 27}, { 11, 34}, { -348, 177}, { -55, -75}, { -716, 716}, { -1234, -896}, { -226, 445}, { -4926, -1600}, { 1538, -9715}, { 11042, 0}, { 1227, 7752}, { -2586, 840}, { 391, 768}, { -1206, 876}, { -307, -307}, { -211, 291}, { -223, -113}, { -36, 112}, { -131, -20}, { 0, 83}, { -135, 21}, { 0, 2}, { -73, 37} }, { { 0, 0}, /* Filter 143 */ { -22, 70}, { -142, -22}, { 0, 21}, { -176, 27}, { 11, 36}, { -349, 177}, { -52, -72}, { -720, 720}, { -1231, -895}, { -235, 461}, { -4952, -1609}, { 1541, -9732}, { 11036, 0}, { 1223, 7727}, { -2563, 832}, { 396, 778}, { -1204, 874}, { -302, -302}, { -212, 292}, { -221, -112}, { -37, 114}, { -130, -20}, { 0, 84}, { -134, 21}, { 0, 2}, { -73, 37} }, { { 0, 0}, /* Filter 144 */ { -23, 71}, { -142, -22}, { 0, 22}, { -176, 27}, { 12, 38}, { -349, 178}, { -50, -69}, { -724, 724}, { -1229, -893}, { -243, 478}, { -4978, -1617}, { 1544, -9750}, { 11030, 0}, { 1220, 7702}, { -2539, 825}, { 401, 788}, { -1201, 873}, { -298, -298}, { -213, 293}, { -219, -111}, { -37, 115}, { -129, -20}, { 0, 85}, { -134, 21}, { 1, 3}, { -73, 37} }, { { 0, 0}, /* Filter 145 */ { -23, 72}, { -142, -22}, { 0, 24}, { -176, 27}, { 13, 40}, { -350, 178}, { -47, -65}, { -729, 729}, { -1227, -891}, { -252, 495}, { -5004, -1626}, { 1546, -9767}, { 11023, 0}, { 1216, 7678}, { -2515, 817}, { 406, 797}, { -1199, 871}, { -294, -294}, { -214, 295}, { -217, -111}, { -37, 116}, { -128, -20}, { 0, 85}, { -133, 21}, { 1, 4}, { -73, 37} }, { { 0, 0}, /* Filter 146 */ { -23, 72}, { -141, -22}, { 0, 25}, { -176, 27}, { 13, 42}, { -351, 179}, { -45, -62}, { -733, 733}, { -1225, -890}, { -261, 512}, { -5031, -1634}, { 1549, -9784}, { 11017, 0}, { 1212, 7653}, { -2491, 809}, { 411, 806}, { -1196, 869}, { -289, -289}, { -215, 296}, { -216, -110}, { -38, 117}, { -127, -20}, { 0, 86}, { -133, 21}, { 1, 5}, { -73, 37} }, { { 0, 0}, /* Filter 147 */ { -23, 73}, { -141, -22}, { 0, 26}, { -176, 27}, { 14, 44}, { -352, 179}, { -42, -58}, { -737, 737}, { -1222, -888}, { -269, 529}, { -5057, -1643}, { 1552, -9801}, { 11010, 0}, { 1208, 7628}, { -2467, 801}, { 415, 816}, { -1194, 867}, { -285, -285}, { -216, 297}, { -214, -109}, { -38, 118}, { -126, -20}, { 0, 87}, { -133, 21}, { 1, 5}, { -73, 37} }, { { 0, 0}, /* Filter 148 */ { -24, 74}, { -141, -22}, { 0, 27}, { -176, 27}, { 14, 46}, { -352, 179}, { -40, -55}, { -741, 741}, { -1220, -886}, { -278, 546}, { -5083, -1651}, { 1555, -9818}, { 11004, 0}, { 1204, 7603}, { -2443, 794}, { 420, 825}, { -1191, 865}, { -281, -281}, { -217, 298}, { -212, -108}, { -38, 119}, { -125, -19}, { 0, 88}, { -132, 21}, { 2, 6}, { -73, 37} }, { { 0, 0}, /* Filter 149 */ { -24, 75}, { -140, -22}, { 0, 29}, { -176, 27}, { 15, 48}, { -353, 180}, { -37, -51}, { -745, 745}, { -1217, -884}, { -287, 563}, { -5109, -1660}, { 1557, -9835}, { 10997, 0}, { 1200, 7578}, { -2420, 786}, { 425, 834}, { -1188, 863}, { -277, -277}, { -217, 299}, { -210, -107}, { -39, 120}, { -124, -19}, { 0, 89}, { -132, 20}, { 2, 7}, { -73, 37} }, { { 0, 0}, /* Filter 150 */ { -24, 75}, { -140, -22}, { 0, 30}, { -176, 27}, { 16, 50}, { -353, 180}, { -35, -48}, { -750, 750}, { -1215, -882}, { -295, 580}, { -5136, -1668}, { 1560, -9851}, { 10990, 0}, { 1196, 7553}, { -2396, 778}, { 429, 843}, { -1186, 861}, { -272, -272}, { -218, 301}, { -208, -106}, { -39, 121}, { -123, -19}, { 0, 90}, { -131, 20}, { 2, 8}, { -73, 37} }, { { 0, 0}, /* Filter 151 */ { -24, 76}, { -140, -22}, { 0, 31}, { -175, 27}, { 16, 52}, { -354, 180}, { -32, -44}, { -754, 754}, { -1212, -880}, { -304, 597}, { -5162, -1677}, { 1562, -9868}, { 10983, 0}, { 1192, 7528}, { -2373, 771}, { 434, 852}, { -1183, 859}, { -268, -268}, { -219, 302}, { -206, -105}, { -39, 122}, { -123, -19}, { 0, 91}, { -131, 20}, { 2, 8}, { -73, 37} }, { { 0, 0}, /* Filter 152 */ { -25, 77}, { -139, -22}, { 0, 32}, { -175, 27}, { 17, 54}, { -355, 180}, { -29, -41}, { -758, 758}, { -1209, -878}, { -313, 614}, { -5188, -1685}, { 1565, -9884}, { 10976, 0}, { 1188, 7503}, { -2349, 763}, { 439, 861}, { -1180, 857}, { -264, -264}, { -220, 303}, { -205, -104}, { -40, 123}, { -122, -19}, { 0, 92}, { -130, 20}, { 3, 9}, { -73, 37} }, { { 0, 0}, /* Filter 153 */ { -25, 78}, { -139, -22}, { 0, 34}, { -175, 27}, { 18, 56}, { -355, 181}, { -27, -37}, { -762, 762}, { -1206, -876}, { -322, 632}, { -5214, -1694}, { 1568, -9901}, { 10968, 0}, { 1184, 7478}, { -2326, 755}, { 443, 870}, { -1177, 855}, { -260, -260}, { -221, 304}, { -203, -103}, { -40, 124}, { -121, -19}, { 0, 93}, { -130, 20}, { 3, 10}, { -73, 37} }, { { 0, 0}, /* Filter 154 */ { -25, 78}, { -139, -22}, { 0, 35}, { -175, 27}, { 18, 58}, { -356, 181}, { -24, -33}, { -766, 766}, { -1204, -874}, { -331, 649}, { -5240, -1702}, { 1570, -9917}, { 10961, 0}, { 1180, 7453}, { -2302, 748}, { 447, 879}, { -1175, 853}, { -255, -255}, { -221, 305}, { -201, -102}, { -40, 125}, { -120, -19}, { 0, 94}, { -129, 20}, { 3, 10}, { -73, 37} }, { { 0, 0}, /* Filter 155 */ { -25, 79}, { -138, -22}, { 0, 36}, { -175, 27}, { 19, 60}, { -356, 181}, { -22, -30}, { -770, 770}, { -1201, -872}, { -339, 667}, { -5266, -1711}, { 1573, -9933}, { 10953, 0}, { 1176, 7428}, { -2279, 740}, { 452, 887}, { -1172, 851}, { -251, -251}, { -222, 306}, { -199, -101}, { -41, 126}, { -119, -18}, { 0, 94}, { -129, 20}, { 3, 11}, { -73, 37} }, { { 0, 0}, /* Filter 156 */ { -26, 80}, { -138, -21}, { 0, 37}, { -175, 27}, { 20, 62}, { -357, 181}, { -19, -26}, { -774, 774}, { -1198, -870}, { -348, 684}, { -5293, -1719}, { 1575, -9949}, { 10945, 0}, { 1172, 7403}, { -2255, 732}, { 456, 896}, { -1169, 849}, { -247, -247}, { -223, 307}, { -197, -100}, { -41, 127}, { -118, -18}, { 0, 95}, { -129, 20}, { 4, 12}, { -72, 37} }, { { 0, 0}, /* Filter 157 */ { -26, 80}, { -138, -21}, { 0, 38}, { -175, 27}, { 20, 64}, { -357, 182}, { -16, -22}, { -779, 779}, { -1195, -868}, { -357, 702}, { -5319, -1728}, { 1578, -9965}, { 10938, 0}, { 1168, 7377}, { -2232, 725}, { 461, 905}, { -1166, 847}, { -243, -243}, { -223, 308}, { -195, -99}, { -41, 128}, { -117, -18}, { 0, 96}, { -128, 20}, { 4, 13}, { -72, 37} }, { { 0, 0}, /* Filter 158 */ { -26, 81}, { -137, -21}, { 0, 40}, { -175, 27}, { 21, 66}, { -358, 182}, { -14, -19}, { -783, 783}, { -1192, -866}, { -366, 720}, { -5345, -1736}, { 1580, -9981}, { 10930, 0}, { 1164, 7352}, { -2209, 717}, { 465, 913}, { -1163, 845}, { -238, -238}, { -224, 309}, { -193, -98}, { -42, 129}, { -116, -18}, { 0, 97}, { -128, 20}, { 4, 13}, { -72, 37} }, { { 0, 0}, /* Filter 159 */ { -26, 82}, { -137, -21}, { 0, 41}, { -174, 27}, { 22, 68}, { -358, 182}, { -11, -15}, { -787, 787}, { -1188, -863}, { -376, 737}, { -5371, -1745}, { 1583, -9997}, { 10922, 0}, { 1160, 7327}, { -2186, 710}, { 469, 921}, { -1160, 843}, { -234, -234}, { -225, 310}, { -191, -97}, { -42, 130}, { -115, -18}, { 0, 98}, { -127, 20}, { 4, 14}, { -72, 37} }, { { 0, 0}, /* Filter 160 */ { -27, 83}, { -137, -21}, { 0, 42}, { -174, 27}, { 22, 70}, { -358, 182}, { -8, -11}, { -791, 791}, { -1185, -861}, { -385, 755}, { -5397, -1753}, { 1585, -10012}, { 10913, 0}, { 1156, 7301}, { -2163, 702}, { 473, 930}, { -1157, 840}, { -230, -230}, { -225, 311}, { -189, -96}, { -42, 131}, { -114, -18}, { 0, 99}, { -127, 20}, { 4, 15}, { -72, 36} }, { { 0, 0}, /* Filter 161 */ { -27, 83}, { -136, -21}, { 0, 43}, { -174, 27}, { 23, 72}, { -359, 183}, { -5, -8}, { -795, 795}, { -1182, -859}, { -394, 773}, { -5423, -1762}, { 1588, -10028}, { 10905, 0}, { 1152, 7276}, { -2140, 695}, { 478, 938}, { -1154, 838}, { -226, -226}, { -226, 311}, { -188, -95}, { -43, 132}, { -113, -17}, { 0, 100}, { -126, 20}, { 5, 15}, { -72, 36} }, { { 0, 0}, /* Filter 162 */ { -27, 84}, { -136, -21}, { 0, 45}, { -174, 27}, { 24, 74}, { -359, 183}, { -3, -4}, { -799, 799}, { -1179, -856}, { -403, 791}, { -5450, -1770}, { 1590, -10043}, { 10896, 0}, { 1148, 7250}, { -2117, 687}, { 482, 946}, { -1151, 836}, { -222, -222}, { -227, 312}, { -186, -94}, { -43, 133}, { -112, -17}, { 0, 100}, { -126, 19}, { 5, 16}, { -72, 36} }, { { 0, 0}, /* Filter 163 */ { -27, 85}, { -135, -21}, { 0, 46}, { -174, 27}, { 24, 76}, { -360, 183}, { 0, 0}, { -803, 803}, { -1175, -854}, { -412, 809}, { -5476, -1779}, { 1593, -10059}, { 10888, 0}, { 1144, 7225}, { -2094, 680}, { 486, 954}, { -1148, 834}, { -218, -218}, { -227, 313}, { -184, -93}, { -43, 134}, { -111, -17}, { 0, 101}, { -125, 19}, { 5, 17}, { -72, 36} }, { { 0, 0}, /* Filter 164 */ { -27, 86}, { -135, -21}, { 0, 47}, { -173, 27}, { 25, 78}, { -360, 183}, { 2, 3}, { -807, 807}, { -1172, -851}, { -421, 827}, { -5502, -1787}, { 1595, -10074}, { 10879, 0}, { 1140, 7199}, { -2071, 672}, { 490, 962}, { -1144, 831}, { -213, -213}, { -228, 314}, { -182, -92}, { -44, 135}, { -110, -17}, { 0, 102}, { -125, 19}, { 5, 17}, { -72, 36} }, { { 0, 0}, /* Filter 165 */ { -28, 86}, { -135, -21}, { 0, 48}, { -173, 27}, { 26, 80}, { -360, 183}, { 5, 7}, { -811, 811}, { -1168, -849}, { -431, 846}, { -5528, -1796}, { 1597, -10089}, { 10870, 0}, { 1136, 7173}, { -2048, 665}, { 494, 970}, { -1141, 829}, { -209, -209}, { -229, 315}, { -180, -91}, { -44, 136}, { -109, -17}, { 0, 103}, { -124, 19}, { 6, 18}, { -72, 36} }, { { 0, 0}, /* Filter 166 */ { -28, 87}, { -134, -21}, { 0, 49}, { -173, 27}, { 26, 82}, { -361, 183}, { 7, 10}, { -815, 815}, { -1165, -846}, { -440, 864}, { -5554, -1804}, { 1600, -10104}, { 10861, 0}, { 1132, 7148}, { -2025, 658}, { 498, 978}, { -1138, 827}, { -205, -205}, { -229, 315}, { -178, -90}, { -44, 137}, { -108, -17}, { 0, 104}, { -124, 19}, { 6, 19}, { -71, 36} }, { { 0, 0}, /* Filter 167 */ { -28, 88}, { -134, -21}, { 0, 51}, { -173, 27}, { 27, 84}, { -361, 184}, { 10, 14}, { -819, 819}, { -1161, -843}, { -449, 882}, { -5580, -1813}, { 1602, -10119}, { 10852, 0}, { 1128, 7122}, { -2002, 650}, { 502, 986}, { -1135, 824}, { -201, -201}, { -230, 316}, { -176, -89}, { -44, 138}, { -107, -16}, { 0, 104}, { -123, 19}, { 6, 20}, { -71, 36} }, { { 0, 0}, /* Filter 168 */ { -28, 88}, { -133, -21}, { 0, 52}, { -172, 27}, { 28, 86}, { -361, 184}, { 13, 18}, { -823, 823}, { -1157, -841}, { -459, 900}, { -5606, -1821}, { 1605, -10133}, { 10843, 0}, { 1123, 7096}, { -1980, 643}, { 506, 993}, { -1131, 822}, { -197, -197}, { -230, 317}, { -174, -88}, { -45, 139}, { -106, -16}, { 0, 105}, { -122, 19}, { 6, 20}, { -71, 36} }, { { 0, 0}, /* Filter 169 */ { -29, 89}, { -133, -21}, { 0, 53}, { -172, 27}, { 28, 88}, { -361, 184}, { 16, 22}, { -827, 827}, { -1154, -838}, { -468, 919}, { -5632, -1830}, { 1607, -10148}, { 10834, 0}, { 1119, 7070}, { -1957, 635}, { 510, 1001}, { -1128, 819}, { -193, -193}, { -231, 318}, { -172, -88}, { -45, 139}, { -105, -16}, { 0, 106}, { -122, 19}, { 6, 21}, { -71, 36} }, { { 0, 0}, /* Filter 170 */ { -29, 90}, { -132, -21}, { 0, 54}, { -172, 27}, { 29, 90}, { -362, 184}, { 19, 26}, { -831, 831}, { -1150, -835}, { -477, 937}, { -5658, -1838}, { 1609, -10163}, { 10824, 0}, { 1115, 7044}, { -1934, 628}, { 514, 1009}, { -1125, 817}, { -189, -189}, { -231, 318}, { -170, -87}, { -45, 140}, { -104, -16}, { 0, 107}, { -121, 19}, { 7, 22}, { -71, 36} }, { { 0, 0}, /* Filter 171 */ { -29, 90}, { -132, -20}, { 0, 55}, { -171, 27}, { 30, 92}, { -362, 184}, { 22, 30}, { -835, 835}, { -1146, -832}, { -487, 956}, { -5684, -1847}, { 1611, -10177}, { 10815, 0}, { 1111, 7019}, { -1912, 621}, { 517, 1016}, { -1121, 815}, { -185, -185}, { -232, 319}, { -168, -86}, { -46, 141}, { -102, -16}, { 0, 108}, { -121, 19}, { 7, 22}, { -71, 36} }, { { 0, 0}, /* Filter 172 */ { -29, 91}, { -132, -20}, { 0, 57}, { -171, 27}, { 30, 94}, { -362, 184}, { 25, 34}, { -838, 838}, { -1142, -830}, { -496, 975}, { -5710, -1855}, { 1614, -10192}, { 10805, 0}, { 1107, 6993}, { -1889, 614}, { 521, 1023}, { -1118, 812}, { -181, -181}, { -232, 320}, { -166, -85}, { -46, 142}, { -101, -16}, { 0, 108}, { -120, 19}, { 7, 23}, { -71, 36} }, { { 0, 0}, /* Filter 173 */ { -30, 92}, { -131, -20}, { 0, 58}, { -171, 27}, { 31, 96}, { -362, 184}, { 27, 38}, { -842, 842}, { -1138, -827}, { -506, 993}, { -5736, -1864}, { 1616, -10206}, { 10795, 0}, { 1103, 6967}, { -1867, 606}, { 525, 1031}, { -1114, 810}, { -177, -177}, { -233, 320}, { -165, -84}, { -46, 143}, { -100, -15}, { 0, 109}, { -120, 19}, { 7, 24}, { -70, 36} }, { { 0, 0}, /* Filter 174 */ { -30, 93}, { -131, -20}, { 0, 59}, { -170, 27}, { 32, 99}, { -362, 184}, { 30, 42}, { -846, 846}, { -1134, -824}, { -515, 1012}, { -5762, -1872}, { 1618, -10220}, { 10785, 0}, { 1099, 6941}, { -1845, 599}, { 529, 1038}, { -1111, 807}, { -173, -173}, { -233, 321}, { -163, -83}, { -46, 143}, { -99, -15}, { 0, 110}, { -119, 18}, { 8, 24}, { -70, 36} }, { { 0, 0}, /* Filter 175 */ { -30, 93}, { -130, -20}, { 0, 60}, { -170, 26}, { 32, 101}, { -362, 184}, { 33, 46}, { -850, 850}, { -1130, -821}, { -525, 1031}, { -5788, -1880}, { 1620, -10234}, { 10775, 0}, { 1095, 6915}, { -1822, 592}, { 532, 1045}, { -1107, 804}, { -169, -169}, { -233, 321}, { -161, -82}, { -47, 144}, { -98, -15}, { 0, 111}, { -119, 18}, { 8, 25}, { -70, 36} }, { { 0, 0}, /* Filter 176 */ { -30, 94}, { -130, -20}, { 0, 62}, { -170, 26}, { 33, 103}, { -363, 184}, { 36, 50}, { -854, 854}, { -1125, -818}, { -535, 1050}, { -5814, -1889}, { 1623, -10248}, { 10765, 0}, { 1091, 6889}, { -1800, 585}, { 536, 1052}, { -1104, 802}, { -165, -165}, { -234, 322}, { -159, -81}, { -47, 145}, { -97, -15}, { 0, 111}, { -118, 18}, { 8, 26}, { -70, 35} }, { { 0, 0}, /* Filter 177 */ { -30, 95}, { -129, -20}, { 0, 63}, { -169, 26}, { 34, 105}, { -363, 185}, { 39, 54}, { -858, 858}, { -1121, -814}, { -544, 1069}, { -5840, -1897}, { 1625, -10262}, { 10755, 0}, { 1086, 6862}, { -1778, 577}, { 539, 1059}, { -1100, 799}, { -161, -161}, { -234, 323}, { -157, -80}, { -47, 146}, { -96, -15}, { 0, 112}, { -117, 18}, { 8, 26}, { -70, 35} }, { { 0, 0}, /* Filter 178 */ { -31, 95}, { -129, -20}, { 0, 64}, { -169, 26}, { 34, 107}, { -363, 185}, { 42, 58}, { -861, 861}, { -1117, -811}, { -554, 1088}, { -5866, -1906}, { 1627, -10275}, { 10744, 0}, { 1082, 6836}, { -1756, 570}, { 543, 1066}, { -1097, 797}, { -157, -157}, { -235, 323}, { -155, -79}, { -47, 147}, { -95, -15}, { 0, 113}, { -117, 18}, { 8, 27}, { -70, 35} }, { { 0, 0}, /* Filter 179 */ { -31, 96}, { -128, -20}, { 0, 65}, { -168, 26}, { 35, 109}, { -363, 185}, { 45, 62}, { -865, 865}, { -1112, -808}, { -564, 1107}, { -5892, -1914}, { 1629, -10289}, { 10733, 0}, { 1078, 6810}, { -1734, 563}, { 546, 1073}, { -1093, 794}, { -153, -153}, { -235, 324}, { -153, -78}, { -48, 147}, { -94, -14}, { 0, 113}, { -116, 18}, { 9, 28}, { -70, 35} }, { { 0, 0}, /* Filter 180 */ { -31, 97}, { -128, -20}, { 0, 66}, { -168, 26}, { 36, 111}, { -363, 185}, { 48, 66}, { -869, 869}, { -1108, -805}, { -573, 1126}, { -5918, -1923}, { 1631, -10302}, { 10723, 0}, { 1074, 6784}, { -1712, 556}, { 550, 1080}, { -1089, 791}, { -149, -149}, { -235, 324}, { -151, -77}, { -48, 148}, { -93, -14}, { 0, 114}, { -116, 18}, { 9, 28}, { -69, 35} }, { { 0, 0}, /* Filter 181 */ { -31, 97}, { -127, -20}, { 0, 67}, { -167, 26}, { 36, 113}, { -363, 185}, { 51, 71}, { -872, 872}, { -1103, -801}, { -583, 1145}, { -5944, -1931}, { 1633, -10316}, { 10712, 0}, { 1070, 6758}, { -1690, 549}, { 553, 1086}, { -1086, 789}, { -145, -145}, { -236, 324}, { -149, -76}, { -48, 149}, { -92, -14}, { 0, 115}, { -115, 18}, { 9, 29}, { -69, 35} }, { { 0, 0}, /* Filter 182 */ { -31, 98}, { -126, -20}, { 0, 69}, { -167, 26}, { 37, 115}, { -363, 185}, { 54, 75}, { -876, 876}, { -1099, -798}, { -593, 1164}, { -5970, -1939}, { 1636, -10329}, { 10701, 0}, { 1066, 6731}, { -1668, 542}, { 557, 1093}, { -1082, 786}, { -141, -141}, { -236, 325}, { -147, -75}, { -48, 149}, { -91, -14}, { 0, 116}, { -115, 18}, { 9, 29}, { -69, 35} }, { { 0, 0}, /* Filter 183 */ { -32, 99}, { -126, -20}, { 0, 70}, { -166, 26}, { 38, 117}, { -363, 185}, { 57, 79}, { -880, 880}, { -1094, -795}, { -603, 1184}, { -5995, -1948}, { 1638, -10342}, { 10690, 0}, { 1062, 6705}, { -1646, 534}, { 560, 1100}, { -1078, 783}, { -137, -137}, { -236, 325}, { -145, -74}, { -48, 150}, { -89, -14}, { 0, 116}, { -114, 18}, { 9, 30}, { -69, 35} }, { { 0, 0}, /* Filter 184 */ { -32, 99}, { -125, -19}, { 0, 71}, { -166, 26}, { 38, 119}, { -363, 185}, { 60, 83}, { -884, 884}, { -1089, -791}, { -613, 1203}, { -6021, -1956}, { 1640, -10355}, { 10679, 0}, { 1057, 6679}, { -1624, 527}, { 563, 1106}, { -1075, 781}, { -133, -133}, { -237, 326}, { -143, -73}, { -49, 151}, { -88, -14}, { 0, 117}, { -113, 18}, { 10, 31}, { -69, 35} }, { { 0, 0}, /* Filter 185 */ { -32, 100}, { -125, -19}, { 0, 72}, { -165, 26}, { 39, 121}, { -363, 185}, { 63, 87}, { -887, 887}, { -1084, -788}, { -623, 1223}, { -6047, -1964}, { 1642, -10368}, { 10668, 0}, { 1053, 6652}, { -1602, 520}, { 567, 1113}, { -1071, 778}, { -129, -129}, { -237, 326}, { -141, -72}, { -49, 151}, { -87, -13}, { 0, 118}, { -113, 17}, { 10, 31}, { -68, 35} }, { { 0, 0}, /* Filter 186 */ { -32, 100}, { -124, -19}, { 0, 73}, { -165, 26}, { 40, 124}, { -363, 184}, { 66, 91}, { -891, 891}, { -1080, -784}, { -633, 1242}, { -6073, -1973}, { 1644, -10381}, { 10656, 0}, { 1049, 6626}, { -1581, 513}, { 570, 1119}, { -1067, 775}, { -125, -125}, { -237, 326}, { -139, -71}, { -49, 152}, { -86, -13}, { 0, 118}, { -112, 17}, { 10, 32}, { -68, 35} }, { { 0, 0}, /* Filter 187 */ { -33, 101}, { -124, -19}, { 0, 75}, { -164, 26}, { 40, 126}, { -362, 184}, { 69, 96}, { -894, 894}, { -1075, -781}, { -643, 1262}, { -6099, -1981}, { 1646, -10393}, { 10645, 0}, { 1045, 6599}, { -1559, 506}, { 573, 1125}, { -1063, 772}, { -121, -121}, { -237, 327}, { -137, -70}, { -49, 153}, { -85, -13}, { 0, 119}, { -111, 17}, { 10, 33}, { -68, 34} }, { { 0, 0}, /* Filter 188 */ { -33, 102}, { -123, -19}, { 0, 76}, { -164, 26}, { 41, 128}, { -362, 184}, { 72, 100}, { -898, 898}, { -1070, -777}, { -653, 1281}, { -6124, -1990}, { 1648, -10406}, { 10633, 0}, { 1041, 6573}, { -1538, 499}, { 576, 1131}, { -1059, 769}, { -118, -118}, { -238, 327}, { -135, -69}, { -49, 153}, { -84, -13}, { 0, 120}, { -111, 17}, { 10, 33}, { -68, 34} }, { { 0, 0}, /* Filter 189 */ { -33, 102}, { -122, -19}, { 0, 77}, { -163, 25}, { 42, 130}, { -362, 184}, { 76, 104}, { -901, 901}, { -1065, -773}, { -663, 1301}, { -6150, -1998}, { 1650, -10418}, { 10621, 0}, { 1036, 6546}, { -1516, 492}, { 579, 1137}, { -1055, 767}, { -114, -114}, { -238, 327}, { -133, -68}, { -50, 154}, { -83, -13}, { 0, 120}, { -110, 17}, { 11, 34}, { -68, 34} }, { { 0, 0}, /* Filter 190 */ { -33, 103}, { -122, -19}, { 0, 78}, { -163, 25}, { 43, 132}, { -362, 184}, { 79, 108}, { -905, 905}, { -1059, -770}, { -673, 1321}, { -6176, -2006}, { 1652, -10431}, { 10609, 0}, { 1032, 6520}, { -1495, 485}, { 582, 1143}, { -1051, 764}, { -110, -110}, { -238, 328}, { -131, -67}, { -50, 154}, { -82, -13}, { 0, 121}, { -110, 17}, { 11, 34}, { -67, 34} }, { { 0, 0}, /* Filter 191 */ { -33, 104}, { -121, -19}, { 0, 79}, { -162, 25}, { 43, 134}, { -362, 184}, { 82, 113}, { -909, 909}, { -1054, -766}, { -683, 1341}, { -6201, -2015}, { 1654, -10443}, { 10597, 0}, { 1028, 6493}, { -1473, 478}, { 585, 1149}, { -1048, 761}, { -106, -106}, { -238, 328}, { -129, -66}, { -50, 155}, { -80, -12}, { 0, 122}, { -109, 17}, { 11, 35}, { -67, 34} } }; iaxmodem-1.2.0/lib/spandsp/src/t38_core.c0000644000175000017500000007477011150047216017466 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * t38_core.c - Encode and decode the ASN.1 of a T.38 IFP message * * Written by Steve Underwood * * Copyright (C) 2005, 2006 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: t38_core.c,v 1.44 2008/07/02 14:48:26 steveu Exp $ */ /*! \file */ #if defined(HAVE_CONFIG_H) #include "config.h" #endif #include #include #include #include #include #include #include "floating_fudge.h" #if defined(HAVE_TGMATH_H) #include #endif #if defined(HAVE_MATH_H) #include #endif #include #include #include #include "spandsp/telephony.h" #include "spandsp/logging.h" #include "spandsp/bit_operations.h" #include "spandsp/t38_core.h" #define ACCEPTABLE_SEQ_NO_OFFSET 2000 const char *t38_indicator_to_str(int indicator) { switch (indicator) { case T38_IND_NO_SIGNAL: return "no-signal"; case T38_IND_CNG: return "cng"; case T38_IND_CED: return "ced"; case T38_IND_V21_PREAMBLE: return "v21-preamble"; case T38_IND_V27TER_2400_TRAINING: return "v27-2400-training"; case T38_IND_V27TER_4800_TRAINING: return "v27-4800-training"; case T38_IND_V29_7200_TRAINING: return "v29-7200-training"; case T38_IND_V29_9600_TRAINING: return "v29-9600-training"; case T38_IND_V17_7200_SHORT_TRAINING: return "v17-7200-short-training"; case T38_IND_V17_7200_LONG_TRAINING: return "v17-7200-long-training"; case T38_IND_V17_9600_SHORT_TRAINING: return "v17-9600-short-training"; case T38_IND_V17_9600_LONG_TRAINING: return "v17-9600-long-training"; case T38_IND_V17_12000_SHORT_TRAINING: return "v17-12000-short-training"; case T38_IND_V17_12000_LONG_TRAINING: return "v17-12000-long-training"; case T38_IND_V17_14400_SHORT_TRAINING: return "v17-14400-short-training"; case T38_IND_V17_14400_LONG_TRAINING: return "v17-14400-long-training"; case T38_IND_V8_ANSAM: return "v8-ansam"; case T38_IND_V8_SIGNAL: return "v8-signal"; case T38_IND_V34_CNTL_CHANNEL_1200: return "v34-cntl-channel-1200"; case T38_IND_V34_PRI_CHANNEL: return "v34-pri-channel"; case T38_IND_V34_CC_RETRAIN: return "v34-CC-retrain"; case T38_IND_V33_12000_TRAINING: return "v33-12000-training"; case T38_IND_V33_14400_TRAINING: return "v33-14400-training"; } return "???"; } /*- End of function --------------------------------------------------------*/ const char *t38_data_type_to_str(int data_type) { switch (data_type) { case T38_DATA_V21: return "v21"; case T38_DATA_V27TER_2400: return "v27-2400"; case T38_DATA_V27TER_4800: return "v27-4800"; case T38_DATA_V29_7200: return "v29-7200"; case T38_DATA_V29_9600: return "v29-9600"; case T38_DATA_V17_7200: return "v17-7200"; case T38_DATA_V17_9600: return "v17-9600"; case T38_DATA_V17_12000: return "v17-12000"; case T38_DATA_V17_14400: return "v17-14400"; case T38_DATA_V8: return "v8"; case T38_DATA_V34_PRI_RATE: return "v34-pri-rate"; case T38_DATA_V34_CC_1200: return "v34-CC-1200"; case T38_DATA_V34_PRI_CH: return "v34-pri-vh"; case T38_DATA_V33_12000: return "v33-12000"; case T38_DATA_V33_14400: return "v33-14400"; } return "???"; } /*- End of function --------------------------------------------------------*/ const char *t38_field_type_to_str(int field_type) { switch (field_type) { case T38_FIELD_HDLC_DATA: return "hdlc-data"; case T38_FIELD_HDLC_SIG_END: return "hdlc-sig-end"; case T38_FIELD_HDLC_FCS_OK: return "hdlc-fcs-OK"; case T38_FIELD_HDLC_FCS_BAD: return "hdlc-fcs-BAD"; case T38_FIELD_HDLC_FCS_OK_SIG_END: return "hdlc-fcs-OK-sig-end"; case T38_FIELD_HDLC_FCS_BAD_SIG_END: return "hdlc-fcs-BAD-sig-end"; case T38_FIELD_T4_NON_ECM_DATA: return "t4-non-ecm-data"; case T38_FIELD_T4_NON_ECM_SIG_END: return "t4-non-ecm-sig-end"; case T38_FIELD_CM_MESSAGE: return "cm-message"; case T38_FIELD_JM_MESSAGE: return "jm-message"; case T38_FIELD_CI_MESSAGE: return "ci-message"; case T38_FIELD_V34RATE: return "v34rate"; } return "???"; } /*- End of function --------------------------------------------------------*/ const char *t38_cm_profile_to_str(int profile) { switch (profile) { case '1': return "G3 Facsimile Terminal: (Sending Facsimile)"; case '2': return "G3 Facsimile Terminal: (Receiving Facsimile)"; case '3': return "V.34 HDX and G3 Facsimile Terminal: (Sending Facsimile)"; case '4': return "V.34 HDX and G3 Facsimile Terminal: (Receiving Facsimile)"; case '5': return "V.34 HDX-only Facsimile Terminal: (Sending Facsimile)"; case '6': return "V.34 HDX-only Facsimile Terminal: (Receiving Facsimile)"; } return "???"; } /*- End of function --------------------------------------------------------*/ const char *t38_jm_to_str(const uint8_t *data, int len) { if (len < 2) return "???"; switch (data[0]) { case 'A': switch (data[1]) { case '0': return "ACK"; } break; case 'N': switch (data[1]) { case '0': return "NACK: No compatible mode available"; case '1': /* Response for profiles 1 and 2 */ return "NACK: No V.34 fax, use G3 fax"; case '2': /* Response for profiles 5 and 6 */ return "NACK: V.34 fax only."; } break; } return "???"; } /*- End of function --------------------------------------------------------*/ int t38_v34rate_to_bps(const uint8_t *data, int len) { int i; int rate; if (len < 3) return -1; for (i = 0, rate = 0; i < 3; i++) { if (data[i] < '0' || data[i] > '9') return -1; rate = rate*10 + data[i] - '0'; } return rate*100; } /*- End of function --------------------------------------------------------*/ static __inline__ int classify_seq_no_offset(int expected, int actual) { /* Classify the mismatch between expected and actual sequence numbers according to whether the actual is a little in the past (late), a little in the future (some packets have been lost), or a large jump that represents the sequence being lost (possibly when some RTP gets dumped to a UDPTL port). */ /* This assumes they are not equal */ if (expected > actual) { if (expected > actual + 0x10000 - ACCEPTABLE_SEQ_NO_OFFSET) { /* In the near future */ return 1; } if (expected < actual + ACCEPTABLE_SEQ_NO_OFFSET) { /* In the recent past */ return -1; } } else { if (expected + ACCEPTABLE_SEQ_NO_OFFSET > actual) { /* In the near future */ return 1; } if (expected + 0x10000 - ACCEPTABLE_SEQ_NO_OFFSET < actual) { /* In the recent past */ return -1; } } /* There has been a huge step in the sequence */ return 0; } /*- End of function --------------------------------------------------------*/ int t38_core_rx_ifp_packet(t38_core_state_t *s, const uint8_t *buf, int len, uint16_t seq_no) { int i; int t30_indicator; int t30_data; int ptr; int other_half; int numocts; int log_seq_no; const uint8_t *msg; unsigned int count; unsigned int t30_field_type; uint8_t type; uint8_t data_field_present; uint8_t field_data_present; char tag[20]; log_seq_no = (s->check_sequence_numbers) ? seq_no : s->rx_expected_seq_no; if (span_log_test(&s->logging, SPAN_LOG_FLOW)) { sprintf(tag, "Rx %5d: IFP", log_seq_no); span_log_buf(&s->logging, SPAN_LOG_FLOW, tag, buf, len); } if (len < 1) { span_log(&s->logging, SPAN_LOG_PROTOCOL_WARNING, "Rx %5d: Bad packet length - %d\n", log_seq_no, len); return -1; } if (s->check_sequence_numbers) { seq_no &= 0xFFFF; if (seq_no != s->rx_expected_seq_no) { /* An expected value of -1 indicates this is the first received packet, and will accept anything for that. We can't assume they will start from zero, even though they should. */ if (s->rx_expected_seq_no != -1) { /* We have a packet with a serial number that is not in sequence. The cause could be: - 1. a repeat copy of a recent packet. Many T.38 implementations can preduce quite a lot of these. - 2. a late packet, whose point in the sequence we have already passed. - 3. the result of a hop in the sequence numbers cause by something weird from the other end. Stream switching might cause this - 4. missing packets. In cases 1 and 2 we need to drop this packet. In case 2 it might make sense to try to do something with it in the terminal case. Currently we don't. For gateway operation it will be too late to do anything useful. */ if (((seq_no + 1) & 0xFFFF) == s->rx_expected_seq_no) { /* Assume this is truly a repeat packet, and don't bother checking its contents. */ span_log(&s->logging, SPAN_LOG_FLOW, "Rx %5d: Repeat packet number\n", log_seq_no); return 0; } /* Distinguish between a little bit out of sequence, and a huge hop. */ switch (classify_seq_no_offset(s->rx_expected_seq_no, seq_no)) { case -1: /* This packet is in the near past, so its late. */ span_log(&s->logging, SPAN_LOG_FLOW, "Rx %5d: Late packet - expected %d\n", log_seq_no, s->rx_expected_seq_no); return 0; case 1: /* This packet is in the near future, so some packets have been lost */ span_log(&s->logging, SPAN_LOG_FLOW, "Rx %5d: Missing from %d\n", log_seq_no, s->rx_expected_seq_no); s->rx_missing_handler(s, s->rx_user_data, s->rx_expected_seq_no, seq_no); s->missing_packets += (seq_no - s->rx_expected_seq_no); break; default: /* The sequence has jumped wildly */ span_log(&s->logging, SPAN_LOG_FLOW, "Rx %5d: Sequence restart\n", log_seq_no); s->rx_missing_handler(s, s->rx_user_data, -1, -1); s->missing_packets++; break; } } s->rx_expected_seq_no = seq_no; } s->rx_expected_seq_no = (s->rx_expected_seq_no + 1) & 0xFFFF; } else { s->rx_expected_seq_no++; } data_field_present = (buf[0] >> 7) & 1; type = (buf[0] >> 6) & 1; ptr = 0; switch (type) { case T38_TYPE_OF_MSG_T30_INDICATOR: /* Indicators should never have a data field */ if (data_field_present) { span_log(&s->logging, SPAN_LOG_PROTOCOL_WARNING, "Rx %5d: Data field with indicator\n", log_seq_no); return -1; } /* Any received indicator should mean we no longer have a valid concept of "last received data/field type". */ s->current_rx_data_type = -1; s->current_rx_field_type = -1; if ((buf[0] & 0x20)) { /* Extension */ if (len != 2) { span_log(&s->logging, SPAN_LOG_PROTOCOL_WARNING, "Rx %5d: Invalid length for indicator (A)\n", log_seq_no); return -1; } t30_indicator = T38_IND_V8_ANSAM + (((buf[0] << 2) & 0x3C) | ((buf[1] >> 6) & 0x3)); if (t30_indicator > T38_IND_V33_14400_TRAINING) { span_log(&s->logging, SPAN_LOG_PROTOCOL_WARNING, "Rx %5d: Unknown indicator - %d\n", log_seq_no, t30_indicator); return -1; } } else { if (len != 1) { span_log(&s->logging, SPAN_LOG_PROTOCOL_WARNING, "Rx %5d: Invalid length for indicator (B)\n", log_seq_no); return -1; } t30_indicator = (buf[0] >> 1) & 0xF; } span_log(&s->logging, SPAN_LOG_FLOW, "Rx %5d: indicator %s\n", log_seq_no, t38_indicator_to_str(t30_indicator)); s->rx_indicator_handler(s, s->rx_user_data, t30_indicator); /* This must come after the indicator handler, so the handler routine sees the existing state of the indicator. */ s->current_rx_indicator = t30_indicator; break; case T38_TYPE_OF_MSG_T30_DATA: if ((buf[0] & 0x20)) { /* Extension */ if (len < 2) { span_log(&s->logging, SPAN_LOG_PROTOCOL_WARNING, "Rx %5d: Invalid length for data (A)\n", log_seq_no); return -1; } t30_data = T38_DATA_V8 + (((buf[0] << 2) & 0x3C) | ((buf[1] >> 6) & 0x3)); if (t30_data > T38_DATA_V33_14400) { span_log(&s->logging, SPAN_LOG_PROTOCOL_WARNING, "Rx %5d: Unknown data type - %d\n", log_seq_no, t30_data); return -1; } ptr = 2; } else { t30_data = (buf[0] >> 1) & 0xF; if (t30_data > T38_DATA_V17_14400) { span_log(&s->logging, SPAN_LOG_PROTOCOL_WARNING, "Rx %5d: Unknown data type - %d\n", log_seq_no, t30_data); return -1; } ptr = 1; } if (!data_field_present) { /* This is kinda weird, but I guess if the length checks out we accept it. */ span_log(&s->logging, SPAN_LOG_PROTOCOL_WARNING, "Rx %5d: Data type with no data field\n", log_seq_no); if (ptr != len) { span_log(&s->logging, SPAN_LOG_PROTOCOL_WARNING, "Rx %5d: Invalid length for data (B)\n", log_seq_no); return -1; } break; } if (ptr >= len) { span_log(&s->logging, SPAN_LOG_PROTOCOL_WARNING, "Rx %5d: Invalid length for data (C)\n", log_seq_no); return -1; } count = buf[ptr++]; //printf("Count is %d\n", count); other_half = FALSE; t30_field_type = 0; for (i = 0; i < (int) count; i++) { if (ptr >= len) { span_log(&s->logging, SPAN_LOG_PROTOCOL_WARNING, "Rx %5d: Invalid length for data (D)\n", log_seq_no); return -1; } if (s->t38_version == 0) { /* The original version of T.38 with a typo in the ASN.1 spec. */ if (other_half) { /* The lack of a data field in the previous message means we are currently in the middle of an octet. */ field_data_present = (buf[ptr] >> 3) & 1; /* Decode field_type */ t30_field_type = buf[ptr] & 0x7; ptr++; other_half = FALSE; } else { field_data_present = (buf[ptr] >> 7) & 1; /* Decode field_type */ t30_field_type = (buf[ptr] >> 4) & 0x7; if (field_data_present) ptr++; else other_half = TRUE; } if (t30_field_type > T38_FIELD_T4_NON_ECM_SIG_END) { span_log(&s->logging, SPAN_LOG_PROTOCOL_WARNING, "Rx %5d: Unknown field type - %d\n", log_seq_no, t30_field_type); return -1; } } else { field_data_present = (buf[ptr] >> 7) & 1; /* Decode field_type */ if ((buf[ptr] & 0x40)) { if (ptr > len - 2) { span_log(&s->logging, SPAN_LOG_PROTOCOL_WARNING, "Rx %5d: Invalid length for data (E)\n", log_seq_no); return -1; } t30_field_type = T38_FIELD_CM_MESSAGE + (((buf[ptr] << 2) & 0x3C) | ((buf[ptr + 1] >> 6) & 0x3)); if (t30_field_type > T38_FIELD_V34RATE) { span_log(&s->logging, SPAN_LOG_PROTOCOL_WARNING, "Rx %5d: Unknown field type - %d\n", log_seq_no, t30_field_type); return -1; } ptr += 2; } else { t30_field_type = (buf[ptr++] >> 3) & 0x7; } } /* Decode field_data */ if (field_data_present) { if (ptr > len - 2) { span_log(&s->logging, SPAN_LOG_PROTOCOL_WARNING, "Rx %5d: Invalid length for data (F)\n", log_seq_no); return -1; } numocts = ((buf[ptr] << 8) | buf[ptr + 1]) + 1; msg = buf + ptr + 2; ptr += numocts + 2; } else { numocts = 0; msg = NULL; } if (ptr > len) { span_log(&s->logging, SPAN_LOG_PROTOCOL_WARNING, "Rx %5d: Invalid length for data (G)\n", log_seq_no); return -1; } span_log(&s->logging, SPAN_LOG_FLOW, "Rx %5d: (%d) data %s/%s + %d byte(s)\n", log_seq_no, i, t38_data_type_to_str(t30_data), t38_field_type_to_str(t30_field_type), numocts); s->rx_data_handler(s, s->rx_user_data, t30_data, t30_field_type, msg, numocts); s->current_rx_data_type = t30_data; s->current_rx_field_type = t30_field_type; } if (ptr != len) { if (s->t38_version != 0 || ptr != (len - 1) || !other_half) { span_log(&s->logging, SPAN_LOG_PROTOCOL_WARNING, "Rx %5d: Invalid length for data (H) - %d %d\n", log_seq_no, ptr, len); return -1; } } break; } return 0; } /*- End of function --------------------------------------------------------*/ static int t38_encode_indicator(t38_core_state_t *s, uint8_t buf[], int indicator) { int len; /* Build the IFP packet */ /* Data field not present */ /* Indicator packet */ /* Type of indicator */ if (indicator <= T38_IND_V17_14400_LONG_TRAINING) { buf[0] = (uint8_t) (indicator << 1); len = 1; } else if (s->t38_version != 0 && indicator <= T38_IND_V33_14400_TRAINING) { buf[0] = (uint8_t) (0x20 | (((indicator - T38_IND_V8_ANSAM) & 0xF) >> 2)); buf[1] = (uint8_t) (((indicator - T38_IND_V8_ANSAM) << 6) & 0xFF); len = 2; } else { len = -1; } return len; } /*- End of function --------------------------------------------------------*/ static int t38_encode_data(t38_core_state_t *s, uint8_t buf[], int data_type, const t38_data_field_t field[], int fields) { int len; int i; int enclen; int multiplier; int data_field_no; const t38_data_field_t *q; unsigned int encoded_len; unsigned int fragment_len; unsigned int value; uint8_t data_field_present; uint8_t field_data_present; char tag[20]; /* Build the IFP packet */ /* There seems no valid reason why a packet would ever be generated without a data field present */ data_field_present = TRUE; for (data_field_no = 0; data_field_no < fields; data_field_no++) { span_log(&s->logging, SPAN_LOG_FLOW, "Tx %5d: (%d) data %s/%s + %d byte(s)\n", s->tx_seq_no, data_field_no, t38_data_type_to_str(data_type), t38_field_type_to_str(field[data_field_no].field_type), field[data_field_no].field_len); } data_field_no = 0; len = 0; /* Data field present */ /* Data packet */ /* Type of data */ if (data_type <= T38_DATA_V17_14400) { buf[len++] = (uint8_t) ((data_field_present << 7) | 0x40 | (data_type << 1)); } else if (s->t38_version != 0 && data_type <= T38_DATA_V33_14400) { buf[len++] = (uint8_t) ((data_field_present << 7) | 0x60 | (((data_type - T38_DATA_V8) & 0xF) >> 2)); buf[len++] = (uint8_t) (((data_type - T38_DATA_V8) << 6) & 0xFF); } else { return -1; } if (data_field_present) { encoded_len = 0; data_field_no = 0; do { value = fields - encoded_len; if (value < 0x80) { /* 1 octet case */ buf[len++] = (uint8_t) value; enclen = value; } else if (value < 0x4000) { /* 2 octet case */ buf[len++] = (uint8_t) (0x80 | ((value >> 8) & 0xFF)); buf[len++] = (uint8_t) (value & 0xFF); enclen = value; } else { /* Fragmentation case */ multiplier = (value/0x4000 < 4) ? value/0x4000 : 4; buf[len++] = (uint8_t) (0xC0 | multiplier); enclen = 0x4000*multiplier; } fragment_len = enclen; encoded_len += fragment_len; /* Encode the elements */ for (i = 0; i < (int) encoded_len; i++) { q = &field[data_field_no]; field_data_present = (uint8_t) (q->field_len > 0); /* Encode field_type */ if (s->t38_version == 0) { /* Original version of T.38 with a typo */ if (q->field_type > T38_FIELD_T4_NON_ECM_SIG_END) return -1; buf[len++] = (uint8_t) ((field_data_present << 7) | (q->field_type << 4)); } else { if (q->field_type <= T38_FIELD_T4_NON_ECM_SIG_END) { buf[len++] = (uint8_t) ((field_data_present << 7) | (q->field_type << 3)); } else if (q->field_type <= T38_FIELD_V34RATE) { buf[len++] = (uint8_t) ((field_data_present << 7) | 0x40 | ((q->field_type - T38_FIELD_CM_MESSAGE) >> 2)); buf[len++] = (uint8_t) (((q->field_type - T38_FIELD_CM_MESSAGE) << 6) & 0xC0); } else { return -1; } } /* Encode field_data */ if (field_data_present) { if (q->field_len < 1 || q->field_len > 65535) return -1; buf[len++] = (uint8_t) (((q->field_len - 1) >> 8) & 0xFF); buf[len++] = (uint8_t) ((q->field_len - 1) & 0xFF); memcpy(buf + len, q->field, q->field_len); len += q->field_len; } data_field_no++; } } while (fields != (int) encoded_len || fragment_len >= 16384); } if (span_log_test(&s->logging, SPAN_LOG_FLOW)) { sprintf(tag, "Tx %5d: IFP", s->tx_seq_no); span_log_buf(&s->logging, SPAN_LOG_FLOW, tag, buf, len); } return len; } /*- End of function --------------------------------------------------------*/ int t38_core_send_indicator(t38_core_state_t *s, int indicator, int count) { uint8_t buf[100]; int len; /* Zero is a valid count, to suppress the transmission of indicators when the transport is TCP. */ if (count) { if ((len = t38_encode_indicator(s, buf, indicator)) < 0) { span_log(&s->logging, SPAN_LOG_FLOW, "T.38 indicator len is %d\n", len); return len; } span_log(&s->logging, SPAN_LOG_FLOW, "Tx %5d: indicator %s\n", s->tx_seq_no, t38_indicator_to_str(indicator)); s->tx_packet_handler(s, s->tx_packet_user_data, buf, len, count); s->tx_seq_no = (s->tx_seq_no + 1) & 0xFFFF; } s->current_tx_indicator = indicator; return 0; } /*- End of function --------------------------------------------------------*/ int t38_core_send_data(t38_core_state_t *s, int data_type, int field_type, const uint8_t field[], int field_len, int count) { t38_data_field_t field0; uint8_t buf[1000]; int len; field0.field_type = field_type; field0.field = field; field0.field_len = field_len; if ((len = t38_encode_data(s, buf, data_type, &field0, 1)) < 0) { span_log(&s->logging, SPAN_LOG_FLOW, "T.38 data len is %d\n", len); return len; } s->tx_packet_handler(s, s->tx_packet_user_data, buf, len, count); s->tx_seq_no = (s->tx_seq_no + 1) & 0xFFFF; return 0; } /*- End of function --------------------------------------------------------*/ int t38_core_send_data_multi_field(t38_core_state_t *s, int data_type, const t38_data_field_t field[], int fields, int count) { uint8_t buf[1000]; int len; if ((len = t38_encode_data(s, buf, data_type, field, fields)) < 0) { span_log(&s->logging, SPAN_LOG_FLOW, "T.38 data len is %d\n", len); return len; } s->tx_packet_handler(s, s->tx_packet_user_data, buf, len, count); s->tx_seq_no = (s->tx_seq_no + 1) & 0xFFFF; return 0; } /*- End of function --------------------------------------------------------*/ void t38_set_data_rate_management_method(t38_core_state_t *s, int method) { s->data_rate_management_method = method; } /*- End of function --------------------------------------------------------*/ void t38_set_data_transport_protocol(t38_core_state_t *s, int data_transport_protocol) { s->data_transport_protocol = data_transport_protocol; } /*- End of function --------------------------------------------------------*/ void t38_set_fill_bit_removal(t38_core_state_t *s, int fill_bit_removal) { s->fill_bit_removal = fill_bit_removal; } /*- End of function --------------------------------------------------------*/ void t38_set_mmr_transcoding(t38_core_state_t *s, int mmr_transcoding) { s->mmr_transcoding = mmr_transcoding; } /*- End of function --------------------------------------------------------*/ void t38_set_jbig_transcoding(t38_core_state_t *s, int jbig_transcoding) { s->jbig_transcoding = jbig_transcoding; } /*- End of function --------------------------------------------------------*/ void t38_set_max_buffer_size(t38_core_state_t *s, int max_buffer_size) { s->max_buffer_size = max_buffer_size; } /*- End of function --------------------------------------------------------*/ void t38_set_max_datagram_size(t38_core_state_t *s, int max_datagram_size) { s->max_datagram_size = max_datagram_size; } /*- End of function --------------------------------------------------------*/ void t38_set_t38_version(t38_core_state_t *s, int t38_version) { s->t38_version = t38_version; } /*- End of function --------------------------------------------------------*/ void t38_set_sequence_number_handling(t38_core_state_t *s, int check) { s->check_sequence_numbers = check; } /*- End of function --------------------------------------------------------*/ int t38_get_fastest_image_data_rate(t38_core_state_t *s) { return s->fastest_image_data_rate; } /*- End of function --------------------------------------------------------*/ t38_core_state_t *t38_core_init(t38_core_state_t *s, t38_rx_indicator_handler_t *rx_indicator_handler, t38_rx_data_handler_t *rx_data_handler, t38_rx_missing_handler_t *rx_missing_handler, void *rx_user_data, t38_tx_packet_handler_t *tx_packet_handler, void *tx_packet_user_data) { if (s == NULL) { if ((s = (t38_core_state_t *) malloc(sizeof(*s))) == NULL) return NULL; } memset(s, 0, sizeof(*s)); span_log_init(&s->logging, SPAN_LOG_NONE, NULL); span_log_set_protocol(&s->logging, "T.38"); span_log(&s->logging, SPAN_LOG_FLOW, "Start tx document\n"); s->data_rate_management_method = 2; s->data_transport_protocol = T38_TRANSPORT_UDPTL; s->fill_bit_removal = FALSE; s->mmr_transcoding = FALSE; s->jbig_transcoding = FALSE; s->max_buffer_size = 400; s->max_datagram_size = 100; s->t38_version = 0; s->check_sequence_numbers = TRUE; s->current_rx_indicator = -1; s->current_rx_data_type = -1; s->current_rx_field_type = -1; s->rx_indicator_handler = rx_indicator_handler; s->rx_data_handler = rx_data_handler; s->rx_missing_handler = rx_missing_handler; s->rx_user_data = rx_user_data; s->tx_packet_handler = tx_packet_handler; s->tx_packet_user_data = tx_packet_user_data; s->rx_expected_seq_no = -1; return s; } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/v22bis_tx_fixed_rrc.h0000644000175000017500000001734111150047216021703 0ustar julienjulien#define TX_PULSESHAPER_GAIN 0.829192f #define TX_PULSESHAPER_COEFF_SETS 40 static const int16_t tx_pulseshaper[TX_PULSESHAPER_COEFF_SETS][9] = { { -128, /* Filter 0 */ -228, -237, 239, 13893, 13893, 239, -237, -228 }, { -121, /* Filter 1 */ -242, -302, 63, 15293, 12507, 393, -172, -210 }, { -111, /* Filter 2 */ -252, -365, -132, 16699, 11146, 525, -106, -188 }, { -99, /* Filter 3 */ -258, -425, -345, 18102, 9816, 634, -42, -164 }, { -84, /* Filter 4 */ -260, -480, -575, 19492, 8526, 719, 18, -138 }, { -68, /* Filter 5 */ -256, -530, -817, 20859, 7283, 782, 75, -110 }, { -49, /* Filter 6 */ -248, -573, -1069, 22194, 6093, 821, 128, -81 }, { -30, /* Filter 7 */ -235, -607, -1326, 23486, 4962, 839, 176, -51 }, { -9, /* Filter 8 */ -217, -633, -1586, 24728, 3896, 837, 218, -21 }, { 12, /* Filter 9 */ -195, -650, -1843, 25908, 2898, 815, 254, 8 }, { 33, /* Filter 10 */ -169, -656, -2093, 27019, 1972, 776, 282, 36 }, { 55, /* Filter 11 */ -138, -651, -2331, 28052, 1122, 721, 304, 63 }, { 76, /* Filter 12 */ -105, -634, -2552, 29000, 349, 653, 319, 88 }, { 97, /* Filter 13 */ -69, -607, -2751, 29854, -344, 573, 326, 111 }, { 116, /* Filter 14 */ -30, -568, -2922, 30608, -960, 483, 326, 131 }, { 133, /* Filter 15 */ 9, -517, -3059, 31257, -1497, 387, 320, 148 }, { 148, /* Filter 16 */ 49, -456, -3158, 31794, -1956, 286, 307, 161 }, { 161, /* Filter 17 */ 90, -385, -3212, 32217, -2340, 182, 289, 171 }, { 171, /* Filter 18 */ 130, -306, -3217, 32522, -2649, 78, 265, 178 }, { 177, /* Filter 19 */ 168, -218, -3168, 32705, -2888, -24, 236, 181 }, { 181, /* Filter 20 */ 204, -123, -3060, 32767, -3060, -123, 204, 181 }, { 181, /* Filter 21 */ 236, -24, -2888, 32705, -3168, -218, 168, 177 }, { 178, /* Filter 22 */ 265, 78, -2649, 32522, -3217, -306, 130, 171 }, { 171, /* Filter 23 */ 289, 182, -2340, 32217, -3212, -385, 90, 161 }, { 161, /* Filter 24 */ 307, 286, -1956, 31794, -3158, -456, 49, 148 }, { 148, /* Filter 25 */ 320, 387, -1497, 31257, -3059, -517, 9, 133 }, { 131, /* Filter 26 */ 326, 483, -960, 30608, -2922, -568, -30, 116 }, { 111, /* Filter 27 */ 326, 573, -344, 29854, -2751, -607, -69, 97 }, { 88, /* Filter 28 */ 319, 653, 349, 29000, -2552, -634, -105, 76 }, { 63, /* Filter 29 */ 304, 721, 1122, 28052, -2331, -651, -138, 55 }, { 36, /* Filter 30 */ 282, 776, 1972, 27019, -2093, -656, -169, 33 }, { 8, /* Filter 31 */ 254, 815, 2898, 25908, -1843, -650, -195, 12 }, { -21, /* Filter 32 */ 218, 837, 3896, 24728, -1586, -633, -217, -9 }, { -51, /* Filter 33 */ 176, 839, 4962, 23486, -1326, -607, -235, -30 }, { -81, /* Filter 34 */ 128, 821, 6093, 22194, -1069, -573, -248, -49 }, { -110, /* Filter 35 */ 75, 782, 7283, 20859, -817, -530, -256, -68 }, { -138, /* Filter 36 */ 18, 719, 8526, 19492, -575, -480, -260, -84 }, { -164, /* Filter 37 */ -42, 634, 9816, 18102, -345, -425, -258, -99 }, { -188, /* Filter 38 */ -106, 525, 11146, 16699, -132, -365, -252, -111 }, { -210, /* Filter 39 */ -172, 393, 12507, 15293, 63, -302, -242, -121 } }; iaxmodem-1.2.0/lib/spandsp/src/dds_int.c0000644000175000017500000001436111150047216017452 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * dds.c * * Written by Steve Underwood * * Copyright (C) 2003 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: dds_int.c,v 1.9 2008/07/02 14:48:25 steveu Exp $ */ /*! \file */ #if defined(HAVE_CONFIG_H) #include #endif #include #include "floating_fudge.h" #if defined(HAVE_TGMATH_H) #include #endif #if defined(HAVE_MATH_H) #include #endif #include "spandsp/telephony.h" #include "spandsp/complex.h" #include "spandsp/dds.h" #if !defined(M_PI) # define M_PI 3.14159265358979323846 /* pi */ #endif /* In a A-law or u-law channel, a 128 step sine table is adequate to keep the spectral mess due to the DDS at a similar level to the spectral mess due to the A-law or u-law compression. */ #define SLENK 7 #define DDS_STEPS (1 << SLENK) #define DDS_SHIFT (32 - 2 - SLENK) /* This is a simple set of direct digital synthesis (DDS) functions to generate sine waves. This version uses a 128 entry sin/cos table to cover one quadrant. */ static const int16_t sine_table[DDS_STEPS] = { 201, 603, 1005, 1407, 1809, 2210, 2611, 3012, 3412, 3812, 4211, 4609, 5007, 5404, 5800, 6195, 6590, 6983, 7376, 7767, 8157, 8546, 8933, 9319, 9704, 10088, 10469, 10850, 11228, 11605, 11980, 12354, 12725, 13095, 13463, 13828, 14192, 14553, 14912, 15269, 15624, 15976, 16326, 16673, 17018, 17361, 17700, 18037, 18372, 18703, 19032, 19358, 19681, 20001, 20318, 20632, 20943, 21251, 21555, 21856, 22154, 22449, 22740, 23028, 23312, 23593, 23870, 24144, 24414, 24680, 24943, 25202, 25457, 25708, 25956, 26199, 26439, 26674, 26906, 27133, 27357, 27576, 27791, 28002, 28209, 28411, 28610, 28803, 28993, 29178, 29359, 29535, 29707, 29875, 30038, 30196, 30350, 30499, 30644, 30784, 30920, 31050, 31177, 31298, 31415, 31527, 31634, 31737, 31834, 31927, 32015, 32099, 32177, 32251, 32319, 32383, 32442, 32496, 32546, 32590, 32629, 32664, 32693, 32718, 32738, 32753, 32762, 32767, }; int32_t dds_phase_rate(float frequency) { return (int32_t) (frequency*65536.0f*65536.0f/SAMPLE_RATE); } /*- End of function --------------------------------------------------------*/ float dds_frequency(int32_t phase_rate) { return (float) phase_rate*(float) SAMPLE_RATE/(65536.0f*65536.0f); } /*- End of function --------------------------------------------------------*/ int dds_scaling_dbm0(float level) { return (int) (powf(10.0f, (level - DBM0_MAX_SINE_POWER)/20.0f)*32767.0f); } /*- End of function --------------------------------------------------------*/ int dds_scaling_dbov(float level) { return (int) (powf(10.0f, (level - DBOV_MAX_SINE_POWER)/20.0f)*32767.0f); } /*- End of function --------------------------------------------------------*/ int16_t dds_lookup(uint32_t phase) { uint32_t step; int16_t amp; phase >>= DDS_SHIFT; step = phase & (DDS_STEPS - 1); if ((phase & DDS_STEPS)) step = (DDS_STEPS - 1) - step; amp = sine_table[step]; if ((phase & (2*DDS_STEPS))) amp = -amp; return amp; } /*- End of function --------------------------------------------------------*/ int16_t dds_offset(uint32_t phase_acc, int32_t phase_offset) { return dds_lookup(phase_acc + phase_offset); } /*- End of function --------------------------------------------------------*/ void dds_advance(uint32_t *phase_acc, int32_t phase_rate) { *phase_acc += phase_rate; } /*- End of function --------------------------------------------------------*/ int16_t dds(uint32_t *phase_acc, int32_t phase_rate) { int16_t amp; amp = dds_lookup(*phase_acc); *phase_acc += phase_rate; return amp; } /*- End of function --------------------------------------------------------*/ int16_t dds_mod(uint32_t *phase_acc, int32_t phase_rate, int scale, int32_t phase) { int16_t amp; amp = (int16_t) ((dds_lookup(*phase_acc + phase)*scale) >> 15); *phase_acc += phase_rate; return amp; } /*- End of function --------------------------------------------------------*/ complexi_t dds_lookup_complexi(uint32_t phase) { return complex_seti(dds_lookup(phase + (1 << 30)), dds_lookup(phase)); } /*- End of function --------------------------------------------------------*/ complexi_t dds_complexi(uint32_t *phase_acc, int32_t phase_rate) { complexi_t amp; amp = complex_seti(dds_lookup(*phase_acc + (1 << 30)), dds_lookup(*phase_acc)); *phase_acc += phase_rate; return amp; } /*- End of function --------------------------------------------------------*/ complexi_t dds_complexi_mod(uint32_t *phase_acc, int32_t phase_rate, int scale, int32_t phase) { complexi_t amp; amp = complex_seti((dds_lookup(*phase_acc + phase + (1 << 30))*scale) >> 15, (dds_lookup(*phase_acc + phase)*scale) >> 15); *phase_acc += phase_rate; return amp; } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/gsm0610_decode.c0000644000175000017500000002252111150047216020423 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * gsm0610_decode.c - GSM 06.10 full rate speech codec. * * Written by Steve Underwood * * Copyright (C) 2006 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * This code is based on the widely used GSM 06.10 code available from * http://kbs.cs.tu-berlin.de/~jutta/toast.html * * $Id: gsm0610_decode.c,v 1.21 2008/07/02 14:48:25 steveu Exp $ */ /*! \file */ #if defined(HAVE_CONFIG_H) #include #endif #include #include #include "floating_fudge.h" #if defined(HAVE_TGMATH_H) #include #endif #if defined(HAVE_MATH_H) #include #endif #include #include #include "spandsp/telephony.h" #include "spandsp/bitstream.h" #include "spandsp/dc_restore.h" #include "spandsp/gsm0610.h" #include "gsm0610_local.h" /* 4.3 FIXED POINT IMPLEMENTATION OF THE RPE-LTP DECODER */ static void postprocessing(gsm0610_state_t *s, int16_t amp[]) { int k; int16_t msr; int16_t tmp; msr = s->msr; for (k = 0; k < GSM0610_FRAME_LEN; k++) { tmp = gsm_mult_r(msr, 28180); /* De-emphasis */ msr = gsm_add(amp[k], tmp); /* Truncation & upscaling */ amp[k] = (int16_t) (gsm_add(msr, msr) & 0xFFF8); } /*endfor*/ s->msr = msr; } /*- End of function --------------------------------------------------------*/ static void decode_a_frame(gsm0610_state_t *s, int16_t amp[GSM0610_FRAME_LEN], gsm0610_frame_t *f) { int j; int k; int16_t erp[40]; int16_t wt[GSM0610_FRAME_LEN]; int16_t *drp; drp = s->dp0 + 120; for (j = 0; j < 4; j++) { gsm0610_rpe_decoding(s, f->xmaxc[j], f->Mc[j], f->xMc[j], erp); gsm0610_long_term_synthesis_filtering(s, f->Nc[j], f->bc[j], erp, drp); for (k = 0; k < 40; k++) wt[j*40 + k] = drp[k]; /*endfor*/ } /*endfor*/ gsm0610_short_term_synthesis_filter(s, f->LARc, wt, amp); postprocessing(s, amp); } /*- End of function --------------------------------------------------------*/ int gsm0610_unpack_none(gsm0610_frame_t *s, const uint8_t c[]) { int i; int j; int k; i = 0; for (j = 0; j < 8; j++) s->LARc[j] = c[i++]; for (j = 0; j < 4; j++) { s->Nc[j] = c[i++]; s->bc[j] = c[i++]; s->Mc[j] = c[i++]; s->xmaxc[j] = c[i++]; for (k = 0; k < 13; k++) s->xMc[j][k] = c[i++]; } return 76; } /*- End of function --------------------------------------------------------*/ int gsm0610_unpack_wav49(gsm0610_frame_t *s, const uint8_t c[]) { uint16_t sr; int i; sr = *c++; s->LARc[0] = sr & 0x3F; sr >>= 6; sr |= (uint16_t) *c++ << 2; s->LARc[1] = sr & 0x3F; sr >>= 6; sr |= (uint16_t) *c++ << 4; s->LARc[2] = sr & 0x1F; sr >>= 5; s->LARc[3] = sr & 0x1F; sr >>= 5; sr |= (uint16_t) *c++ << 2; s->LARc[4] = sr & 0xF; sr >>= 4; s->LARc[5] = sr & 0xF; sr >>= 4; sr |= (uint16_t) *c++ << 2; s->LARc[6] = sr & 0x7; sr >>= 3; s->LARc[7] = sr & 0x7; sr >>= 3; for (i = 0; i < 4; i++) { sr |= (uint16_t) *c++ << 4; s->Nc[i] = sr & 0x7F; sr >>= 7; s->bc[i] = sr & 0x3; sr >>= 2; s->Mc[i] = sr & 0x3; sr >>= 2; sr |= (uint16_t) *c++ << 1; s->xmaxc[i] = sr & 0x3F; sr >>= 6; s->xMc[i][0] = sr & 0x7; sr >>= 3; sr = *c++; s->xMc[i][1] = sr & 0x7; sr >>= 3; s->xMc[i][2] = sr & 0x7; sr >>= 3; sr |= (uint16_t) *c++ << 2; s->xMc[i][3] = sr & 0x7; sr >>= 3; s->xMc[i][4] = sr & 0x7; sr >>= 3; s->xMc[i][5] = sr & 0x7; sr >>= 3; sr |= (uint16_t) *c++ << 1; s->xMc[i][6] = sr & 0x7; sr >>= 3; s->xMc[i][7] = sr & 0x7; sr >>= 3; s->xMc[i][8] = sr & 0x7; sr >>= 3; sr = *c++; s->xMc[i][9] = sr & 0x7; sr >>= 3; s->xMc[i][10] = sr & 0x7; sr >>= 3; sr |= (uint16_t) *c++ << 2; s->xMc[i][11] = sr & 0x7; sr >>= 3; s->xMc[i][12] = sr & 0x7; sr >>= 3; } s++; sr |= (uint16_t) *c++ << 4; s->LARc[0] = sr & 0x3F; sr >>= 6; s->LARc[1] = sr & 0x3F; sr >>= 6; sr = *c++; s->LARc[2] = sr & 0x1F; sr >>= 5; sr |= (uint16_t) *c++ << 3; s->LARc[3] = sr & 0x1F; sr >>= 5; s->LARc[4] = sr & 0xF; sr >>= 4; sr |= (uint16_t) *c++ << 2; s->LARc[5] = sr & 0xF; sr >>= 4; s->LARc[6] = sr & 0x7; sr >>= 3; s->LARc[7] = sr & 0x7; sr >>= 3; for (i = 0; i < 4; i++) { sr = *c++; s->Nc[i] = sr & 0x7F; sr >>= 7; sr |= (uint16_t) *c++ << 1; s->bc[i] = sr & 0x3; sr >>= 2; s->Mc[i] = sr & 0x3; sr >>= 2; sr |= (uint16_t) *c++ << 5; s->xmaxc[i] = sr & 0x3F; sr >>= 6; s->xMc[i][0] = sr & 0x7; sr >>= 3; s->xMc[i][1] = sr & 0x7; sr >>= 3; sr |= (uint16_t) *c++ << 1; s->xMc[i][2] = sr & 0x7; sr >>= 3; s->xMc[i][3] = sr & 0x7; sr >>= 3; s->xMc[i][4] = sr & 0x7; sr >>= 3; sr = *c++; s->xMc[i][5] = sr & 0x7; sr >>= 3; s->xMc[i][6] = sr & 0x7; sr >>= 3; sr |= (uint16_t) *c++ << 2; s->xMc[i][7] = sr & 0x7; sr >>= 3; s->xMc[i][8] = sr & 0x7; sr >>= 3; s->xMc[i][9] = sr & 0x7; sr >>= 3; sr |= (uint16_t) *c++ << 1; s->xMc[i][10] = sr & 0x7; sr >>= 3; s->xMc[i][11] = sr & 0x7; sr >>= 3; s->xMc[i][12] = sr & 0x7; sr >>= 3; } return 65; } /*- End of function --------------------------------------------------------*/ int gsm0610_unpack_voip(gsm0610_frame_t *s, const uint8_t c[33]) { int i; s->LARc[0] = (*c++ & 0xF) << 2; s->LARc[0] |= (*c >> 6) & 0x3; s->LARc[1] = *c++ & 0x3F; s->LARc[2] = (*c >> 3) & 0x1F; s->LARc[3] = (*c++ & 0x7) << 2; s->LARc[3] |= (*c >> 6) & 0x3; s->LARc[4] = (*c >> 2) & 0xF; s->LARc[5] = (*c++ & 0x3) << 2; s->LARc[5] |= (*c >> 6) & 0x3; s->LARc[6] = (*c >> 3) & 0x7; s->LARc[7] = *c++ & 0x7; for (i = 0; i < 4; i++) { s->Nc[i] = (*c >> 1) & 0x7F; s->bc[i] = (*c++ & 0x1) << 1; s->bc[i] |= (*c >> 7) & 0x1; s->Mc[i] = (*c >> 5) & 0x3; s->xmaxc[i] = (*c++ & 0x1F) << 1; s->xmaxc[i] |= (*c >> 7) & 0x1; s->xMc[i][0] = (*c >> 4) & 0x7; s->xMc[i][1] = (*c >> 1) & 0x7; s->xMc[i][2] = (*c++ & 0x1) << 2; s->xMc[i][2] |= (*c >> 6) & 0x3; s->xMc[i][3] = (*c >> 3) & 0x7; s->xMc[i][4] = *c++ & 0x7; s->xMc[i][5] = (*c >> 5) & 0x7; s->xMc[i][6] = (*c >> 2) & 0x7; s->xMc[i][7] = (*c++ & 0x3) << 1; s->xMc[i][7] |= (*c >> 7) & 0x1; s->xMc[i][8] = (*c >> 4) & 0x7; s->xMc[i][9] = (*c >> 1) & 0x7; s->xMc[i][10] = (*c++ & 0x1) << 2; s->xMc[i][10] |= (*c >> 6) & 0x3; s->xMc[i][11] = (*c >> 3) & 0x7; s->xMc[i][12] = *c++ & 0x7; } return 33; } /*- End of function --------------------------------------------------------*/ int gsm0610_decode(gsm0610_state_t *s, int16_t amp[], const uint8_t code[], int len) { gsm0610_frame_t frame[2]; int bytes; int samples; int i; samples = 0; for (i = 0; i < len; i += bytes) { switch (s->packing) { default: case GSM0610_PACKING_NONE: if ((bytes = gsm0610_unpack_none(frame, &code[i])) < 0) return 0; decode_a_frame(s, &[samples], frame); samples += GSM0610_FRAME_LEN; break; case GSM0610_PACKING_WAV49: if ((bytes = gsm0610_unpack_wav49(frame, &code[i])) < 0) return 0; decode_a_frame(s, &[samples], frame); samples += GSM0610_FRAME_LEN; decode_a_frame(s, &[samples], frame + 1); samples += GSM0610_FRAME_LEN; break; case GSM0610_PACKING_VOIP: if ((bytes = gsm0610_unpack_voip(frame, &code[i])) < 0) return 0; decode_a_frame(s, &[samples], frame); samples += GSM0610_FRAME_LEN; break; } /*endswitch*/ } /*endfor*/ return samples; } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/v27ter_tx_2400_floating_rrc.h0000644000175000017500000001255311150047216023076 0ustar julienjulien#define TX_PULSESHAPER_2400_GAIN 1.000000f #define TX_PULSESHAPER_2400_COEFF_SETS 20 static const float tx_pulseshaper_2400[TX_PULSESHAPER_2400_COEFF_SETS][9] = { { 0.0050261981f, /* Filter 0 */ 0.0107704081f, -0.0150784949f, -0.0753922201f, 0.5814534590f, 0.5814534590f, -0.0753922201f, -0.0150784949f, 0.0107704081f }, { 0.0036769624f, /* Filter 1 */ 0.0132151788f, -0.0108416500f, -0.0962477460f, 0.6703977011f, 0.4915574836f, -0.0543875542f, -0.0179957571f, 0.0079493167f }, { 0.0020271568f, /* Filter 2 */ 0.0151310537f, -0.0054150755f, -0.1159725328f, 0.7564987705f, 0.4025542918f, -0.0341116983f, -0.0195425394f, 0.0049156957f }, { 0.0001575806f, /* Filter 3 */ 0.0163856870f, 0.0009922293f, -0.1335090587f, 0.8378712700f, 0.3161905873f, -0.0153166425f, -0.0197430380f, 0.0018355795f }, { -0.0018345641f, /* Filter 4 */ 0.0168753681f, 0.0080958424f, -0.1477565732f, 0.9126905398f, 0.2340689659f, 0.0013877622f, -0.0186894796f, -0.0011314557f }, { -0.0038402662f, /* Filter 5 */ 0.0165323372f, 0.0155436576f, -0.1576073891f, 0.9792460964f, 0.1576073967f, 0.0155436170f, -0.0165323542f, -0.0038401947f }, { -0.0057441235f, /* Filter 6 */ 0.0153307042f, 0.0229275652f, -0.1619859120f, 1.0359920618f, 0.0880058079f, 0.0268485017f, -0.0134685582f, -0.0061665117f }, { -0.0074304083f, /* Filter 7 */ 0.0132904385f, 0.0297988389f, -0.1598887936f, 1.0815943275f, 0.0262205388f, 0.0351527365f, -0.0097281399f, -0.0080126751f }, { -0.0087894091f, /* Filter 8 */ 0.0104791756f, 0.0356867178f, -0.1504249523f, 1.1149702451f, -0.0270525892f, 0.0404511689f, -0.0055604029f, -0.0093110519f }, { -0.0097237699f, /* Filter 9 */ 0.0070115978f, 0.0401196528f, -0.1328538516f, 1.1353219580f, -0.0713862169f, 0.0428697868f, -0.0012200200f, -0.0100260759f }, { -0.0101544656f, /* Filter 10 */ 0.0030462720f, 0.0426483505f, -0.1066205506f, 1.1421607874f, -0.1066205506f, 0.0426483505f, 0.0030462720f, -0.0101544656f }, { -0.0100260759f, /* Filter 11 */ -0.0012200200f, 0.0428697868f, -0.0713862169f, 1.1353219580f, -0.1328538517f, 0.0401196528f, 0.0070115978f, -0.0097237699f }, { -0.0093110519f, /* Filter 12 */ -0.0055604029f, 0.0404511689f, -0.0270525892f, 1.1149702451f, -0.1504249524f, 0.0356867178f, 0.0104791756f, -0.0087894091f }, { -0.0080126751f, /* Filter 13 */ -0.0097281399f, 0.0351527365f, 0.0262205388f, 1.0815943275f, -0.1598887936f, 0.0297988389f, 0.0132904385f, -0.0074304083f }, { -0.0061665117f, /* Filter 14 */ -0.0134685582f, 0.0268485017f, 0.0880058079f, 1.0359920618f, -0.1619859120f, 0.0229275652f, 0.0153307042f, -0.0057441235f }, { -0.0038401947f, /* Filter 15 */ -0.0165323542f, 0.0155436170f, 0.1576073967f, 0.9792460963f, -0.1576073891f, 0.0155436576f, 0.0165323372f, -0.0038402662f }, { -0.0011314557f, /* Filter 16 */ -0.0186894796f, 0.0013877622f, 0.2340689660f, 0.9126905398f, -0.1477565732f, 0.0080958424f, 0.0168753681f, -0.0018345641f }, { 0.0018355795f, /* Filter 17 */ -0.0197430380f, -0.0153166425f, 0.3161905873f, 0.8378712699f, -0.1335090587f, 0.0009922293f, 0.0163856870f, 0.0001575806f }, { 0.0049156957f, /* Filter 18 */ -0.0195425394f, -0.0341116983f, 0.4025542919f, 0.7564987705f, -0.1159725328f, -0.0054150755f, 0.0151310537f, 0.0020271568f }, { 0.0079493167f, /* Filter 19 */ -0.0179957571f, -0.0543875542f, 0.4915574837f, 0.6703977010f, -0.0962477460f, -0.0108416500f, 0.0132151788f, 0.0036769624f } }; iaxmodem-1.2.0/lib/spandsp/src/gsm0610_preprocess.c0000644000175000017500000001026011150047216021362 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * gsm0610_preprocess.c - GSM 06.10 full rate speech codec. * * Written by Steve Underwood * * Copyright (C) 2006 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * This code is based on the widely used GSM 06.10 code available from * http://kbs.cs.tu-berlin.de/~jutta/toast.html * * $Id: gsm0610_preprocess.c,v 1.13 2008/07/02 14:48:25 steveu Exp $ */ /*! \file */ #if defined(HAVE_CONFIG_H) #include #endif #include #include #include "floating_fudge.h" #if defined(HAVE_TGMATH_H) #include #endif #if defined(HAVE_MATH_H) #include #endif #include #include "spandsp/telephony.h" #include "spandsp/bitstream.h" #include "spandsp/dc_restore.h" #include "spandsp/gsm0610.h" #include "gsm0610_local.h" /* 4.2.0 .. 4.2.3 PREPROCESSING SECTION After A-law to linear conversion (or directly from the A to D converter) the following scaling is assumed for input to the RPE-LTP algorithm: in: 0.1.....................12 S.v.v.v.v.v.v.v.v.v.v.v.v.*.*.* Where S is the sign bit, v a valid bit, and * a "don't care" bit. The original signal is called sop[..] out: 0.1................... 12 S.S.v.v.v.v.v.v.v.v.v.v.v.v.0.0 */ void gsm0610_preprocess(gsm0610_state_t *s, const int16_t amp[GSM0610_FRAME_LEN], int16_t so[GSM0610_FRAME_LEN]) { int16_t z1; int16_t mp; int16_t s1; int16_t msp; int16_t SO; int32_t L_z2; int32_t L_s2; int32_t L_temp; #if !defined(__GNUC__) int16_t lsp; #endif int k; z1 = s->z1; L_z2 = s->L_z2; mp = s->mp; for (k = 0; k < GSM0610_FRAME_LEN; k++) { /* 4.2.1 Downscaling of the input signal */ SO = (amp[k] >> 1) & ~3; assert(SO >= -0x4000); // downscaled by assert(SO <= 0x3FFC); // previous routine. /* 4.2.2 Offset compensation */ /* This part implements a high-pass filter and requires extended arithmetic precision for the recursive part of this filter. The input of this procedure is the array so[0...159] and the output the array sof[ 0...159 ]. */ /* Compute the non-recursive part */ s1 = SO - z1; z1 = SO; assert(s1 != INT16_MIN); /* Compute the recursive part */ L_s2 = s1; L_s2 <<= 15; /* Perform a 31 by 16 bits multiplication */ #if defined(__GNUC__) L_z2 = ((int64_t) L_z2*32735 + 0x4000) >> 15; /* Alternate (ANSI) version of below line does slightly different rounding: * L_temp = L_z2 >> 9; * L_temp += L_temp >> 5; * L_temp = (++L_temp) >> 1; * L_z2 = L_z2 - L_temp; */ L_z2 = gsm_l_add(L_z2, L_s2); #else /* This does L_z2 = L_z2 * 0x7FD5/0x8000 + L_s2 */ msp = (int16_t) (L_z2 >> 15); lsp = (int16_t) (L_z2 - ((int32_t) msp << 15)); L_s2 += gsm_mult_r(lsp, 32735); L_temp = (int32_t) msp*32735; L_z2 = gsm_l_add(L_temp, L_s2); #endif /* Compute sof[k] with rounding */ L_temp = gsm_l_add(L_z2, 16384); /* 4.2.3 Preemphasis */ msp = gsm_mult_r(mp, -28180); mp = (int16_t) (L_temp >> 15); so[k] = gsm_add(mp, msp); } /*endfor*/ s->z1 = z1; s->L_z2 = L_z2; s->mp = mp; } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/bitstream.c0000644000175000017500000000744211150047216020022 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * bitstream.c - Bitstream composition and decomposition routines. * * Written by Steve Underwood * * Copyright (C) 2006 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: bitstream.c,v 1.13 2008/05/13 13:17:22 steveu Exp $ */ /*! \file */ #if defined(HAVE_CONFIG_H) #include #endif #include #include #include #include #include "spandsp/telephony.h" #include "spandsp/bitstream.h" void bitstream_put(bitstream_state_t *s, uint8_t **c, unsigned int value, int bits) { value &= ((1 << bits) - 1); if (s->residue + bits <= 32) { s->bitstream |= (value << s->residue); s->residue += bits; } while (s->residue >= 8) { s->residue -= 8; *(*c)++ = (uint8_t) (s->bitstream & 0xFF); s->bitstream >>= 8; } } /*- End of function --------------------------------------------------------*/ void bitstream_put2(bitstream_state_t *s, uint8_t **c, unsigned int value, int bits) { value &= ((1 << bits) - 1); if (s->residue + bits <= 32) { s->bitstream = (s->bitstream << bits) | value; s->residue += bits; } while (s->residue >= 8) { s->residue -= 8; *(*c)++ = (uint8_t) ((s->bitstream >> s->residue) & 0xFF); } } /*- End of function --------------------------------------------------------*/ unsigned int bitstream_get(bitstream_state_t *s, const uint8_t **c, int bits) { unsigned int x; while (s->residue < (unsigned int) bits) { x = (unsigned int) *(*c)++; s->bitstream |= (x << s->residue); s->residue += 8; } s->residue -= bits; x = s->bitstream & ((1 << bits) - 1); s->bitstream >>= bits; return x; } /*- End of function --------------------------------------------------------*/ unsigned int bitstream_get2(bitstream_state_t *s, const uint8_t **c, int bits) { unsigned int x; while (s->residue < (unsigned int) bits) { x = (unsigned int) *(*c)++; s->bitstream = (s->bitstream << 8) | x; s->residue += 8; } s->residue -= bits; x = (s->bitstream >> s->residue) & ((1 << bits) - 1); return x; } /*- End of function --------------------------------------------------------*/ void bitstream_flush(bitstream_state_t *s, uint8_t **c) { if (s->residue > 0) { *(*c)++ = (uint8_t) ((s->bitstream << (8 - s->residue)) & 0xFF); s->residue = 0; } } /*- End of function --------------------------------------------------------*/ void bitstream_flush2(bitstream_state_t *s, uint8_t **c) { if (s->residue > 0) { *(*c)++ = (uint8_t) ((s->bitstream << (8 - s->residue)) & 0xFF); s->residue = 0; } } /*- End of function --------------------------------------------------------*/ bitstream_state_t *bitstream_init(bitstream_state_t *s) { if (s == NULL) return NULL; s->bitstream = 0; s->residue = 0; return s; } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/g722_decode.c0000644000175000017500000002656411150047216020022 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * g722_decode.c - The ITU G.722 codec, decode part. * * Written by Steve Underwood * * Copyright (C) 2005 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * Based in part on a single channel G.722 codec which is: * * Copyright (c) CMU 1993 * Computer Science, Speech Group * Chengxiang Lu and Alex Hauptmann * * $Id: g722_decode.c,v 1.24 2008/07/02 14:48:25 steveu Exp $ */ /*! \file */ #if defined(HAVE_CONFIG_H) #include #endif #include #include #include #include "floating_fudge.h" #if defined(HAVE_TGMATH_H) #include #endif #if defined(HAVE_MATH_H) #include #endif #include "spandsp/telephony.h" #include "spandsp/dc_restore.h" #include "spandsp/g722.h" static void block4(g722_decode_state_t *s, int band, int d); static void block4(g722_decode_state_t *s, int band, int d) { int wd1; int wd2; int wd3; int i; /* Block 4, RECONS */ s->band[band].d[0] = d; s->band[band].r[0] = saturate(s->band[band].s + d); /* Block 4, PARREC */ s->band[band].p[0] = saturate(s->band[band].sz + d); /* Block 4, UPPOL2 */ for (i = 0; i < 3; i++) s->band[band].sg[i] = s->band[band].p[i] >> 15; wd1 = saturate(s->band[band].a[1] << 2); wd2 = (s->band[band].sg[0] == s->band[band].sg[1]) ? -wd1 : wd1; if (wd2 > 32767) wd2 = 32767; wd3 = (s->band[band].sg[0] == s->band[band].sg[2]) ? 128 : -128; wd3 += (wd2 >> 7); wd3 += (s->band[band].a[2]*32512) >> 15; if (wd3 > 12288) wd3 = 12288; else if (wd3 < -12288) wd3 = -12288; s->band[band].ap[2] = wd3; /* Block 4, UPPOL1 */ s->band[band].sg[0] = s->band[band].p[0] >> 15; s->band[band].sg[1] = s->band[band].p[1] >> 15; wd1 = (s->band[band].sg[0] == s->band[band].sg[1]) ? 192 : -192; wd2 = (s->band[band].a[1]*32640) >> 15; s->band[band].ap[1] = saturate(wd1 + wd2); wd3 = saturate(15360 - s->band[band].ap[2]); if (s->band[band].ap[1] > wd3) s->band[band].ap[1] = wd3; else if (s->band[band].ap[1] < -wd3) s->band[band].ap[1] = -wd3; /* Block 4, UPZERO */ wd1 = (d == 0) ? 0 : 128; s->band[band].sg[0] = d >> 15; for (i = 1; i < 7; i++) { s->band[band].sg[i] = s->band[band].d[i] >> 15; wd2 = (s->band[band].sg[i] == s->band[band].sg[0]) ? wd1 : -wd1; wd3 = (s->band[band].b[i]*32640) >> 15; s->band[band].bp[i] = saturate(wd2 + wd3); } /* Block 4, DELAYA */ for (i = 6; i > 0; i--) { s->band[band].d[i] = s->band[band].d[i - 1]; s->band[band].b[i] = s->band[band].bp[i]; } for (i = 2; i > 0; i--) { s->band[band].r[i] = s->band[band].r[i - 1]; s->band[band].p[i] = s->band[band].p[i - 1]; s->band[band].a[i] = s->band[band].ap[i]; } /* Block 4, FILTEP */ wd1 = saturate(s->band[band].r[1] + s->band[band].r[1]); wd1 = (s->band[band].a[1]*wd1) >> 15; wd2 = saturate(s->band[band].r[2] + s->band[band].r[2]); wd2 = (s->band[band].a[2]*wd2) >> 15; s->band[band].sp = saturate(wd1 + wd2); /* Block 4, FILTEZ */ s->band[band].sz = 0; for (i = 6; i > 0; i--) { wd1 = saturate(s->band[band].d[i] + s->band[band].d[i]); s->band[band].sz += (s->band[band].b[i]*wd1) >> 15; } s->band[band].sz = saturate(s->band[band].sz); /* Block 4, PREDIC */ s->band[band].s = saturate(s->band[band].sp + s->band[band].sz); } /*- End of function --------------------------------------------------------*/ g722_decode_state_t *g722_decode_init(g722_decode_state_t *s, int rate, int options) { if (s == NULL) { if ((s = (g722_decode_state_t *) malloc(sizeof(*s))) == NULL) return NULL; } memset(s, 0, sizeof(*s)); if (rate == 48000) s->bits_per_sample = 6; else if (rate == 56000) s->bits_per_sample = 7; else s->bits_per_sample = 8; if ((options & G722_SAMPLE_RATE_8000)) s->eight_k = TRUE; if ((options & G722_PACKED) && s->bits_per_sample != 8) s->packed = TRUE; else s->packed = FALSE; s->band[0].det = 32; s->band[1].det = 8; return s; } /*- End of function --------------------------------------------------------*/ int g722_decode_release(g722_decode_state_t *s) { free(s); return 0; } /*- End of function --------------------------------------------------------*/ int g722_decode(g722_decode_state_t *s, int16_t amp[], const uint8_t g722_data[], int len) { static const int wl[8] = { -60, -30, 58, 172, 334, 538, 1198, 3042 }; static const int rl42[16] = { 0, 7, 6, 5, 4, 3, 2, 1, 7, 6, 5, 4, 3, 2, 1, 0 }; static const int ilb[32] = { 2048, 2093, 2139, 2186, 2233, 2282, 2332, 2383, 2435, 2489, 2543, 2599, 2656, 2714, 2774, 2834, 2896, 2960, 3025, 3091, 3158, 3228, 3298, 3371, 3444, 3520, 3597, 3676, 3756, 3838, 3922, 4008 }; static const int wh[3] = { 0, -214, 798 }; static const int rh2[4] = { 2, 1, 2, 1 }; static const int qm2[4] = { -7408, -1616, 7408, 1616 }; static const int qm4[16] = { 0, -20456, -12896, -8968, -6288, -4240, -2584, -1200, 20456, 12896, 8968, 6288, 4240, 2584, 1200, 0 }; static const int qm5[32] = { -280, -280, -23352, -17560, -14120, -11664, -9752, -8184, -6864, -5712, -4696, -3784, -2960, -2208, -1520, -880, 23352, 17560, 14120, 11664, 9752, 8184, 6864, 5712, 4696, 3784, 2960, 2208, 1520, 880, 280, -280 }; static const int qm6[64] = { -136, -136, -136, -136, -24808, -21904, -19008, -16704, -14984, -13512, -12280, -11192, -10232, -9360, -8576, -7856, -7192, -6576, -6000, -5456, -4944, -4464, -4008, -3576, -3168, -2776, -2400, -2032, -1688, -1360, -1040, -728, 24808, 21904, 19008, 16704, 14984, 13512, 12280, 11192, 10232, 9360, 8576, 7856, 7192, 6576, 6000, 5456, 4944, 4464, 4008, 3576, 3168, 2776, 2400, 2032, 1688, 1360, 1040, 728, 432, 136, -432, -136 }; static const int qmf_coeffs[12] = { 3, -11, 12, 32, -210, 951, 3876, -805, 362, -156, 53, -11, }; int dlowt; int rlow; int ihigh; int dhigh; int rhigh; int xout1; int xout2; int wd1; int wd2; int wd3; int code; int outlen; int i; int j; outlen = 0; rhigh = 0; for (j = 0; j < len; ) { if (s->packed) { /* Unpack the code bits */ if (s->in_bits < s->bits_per_sample) { s->in_buffer |= (g722_data[j++] << s->in_bits); s->in_bits += 8; } code = s->in_buffer & ((1 << s->bits_per_sample) - 1); s->in_buffer >>= s->bits_per_sample; s->in_bits -= s->bits_per_sample; } else { code = g722_data[j++]; } switch (s->bits_per_sample) { default: case 8: wd1 = code & 0x3F; ihigh = (code >> 6) & 0x03; wd2 = qm6[wd1]; wd1 >>= 2; break; case 7: wd1 = code & 0x1F; ihigh = (code >> 5) & 0x03; wd2 = qm5[wd1]; wd1 >>= 1; break; case 6: wd1 = code & 0x0F; ihigh = (code >> 4) & 0x03; wd2 = qm4[wd1]; break; } /* Block 5L, LOW BAND INVQBL */ wd2 = (s->band[0].det*wd2) >> 15; /* Block 5L, RECONS */ rlow = s->band[0].s + wd2; /* Block 6L, LIMIT */ if (rlow > 16383) rlow = 16383; else if (rlow < -16384) rlow = -16384; /* Block 2L, INVQAL */ wd2 = qm4[wd1]; dlowt = (s->band[0].det*wd2) >> 15; /* Block 3L, LOGSCL */ wd2 = rl42[wd1]; wd1 = (s->band[0].nb*127) >> 7; wd1 += wl[wd2]; if (wd1 < 0) wd1 = 0; else if (wd1 > 18432) wd1 = 18432; s->band[0].nb = wd1; /* Block 3L, SCALEL */ wd1 = (s->band[0].nb >> 6) & 31; wd2 = 8 - (s->band[0].nb >> 11); wd3 = (wd2 < 0) ? (ilb[wd1] << -wd2) : (ilb[wd1] >> wd2); s->band[0].det = wd3 << 2; block4(s, 0, dlowt); if (!s->eight_k) { /* Block 2H, INVQAH */ wd2 = qm2[ihigh]; dhigh = (s->band[1].det*wd2) >> 15; /* Block 5H, RECONS */ rhigh = dhigh + s->band[1].s; /* Block 6H, LIMIT */ if (rhigh > 16383) rhigh = 16383; else if (rhigh < -16384) rhigh = -16384; /* Block 2H, INVQAH */ wd2 = rh2[ihigh]; wd1 = (s->band[1].nb*127) >> 7; wd1 += wh[wd2]; if (wd1 < 0) wd1 = 0; else if (wd1 > 22528) wd1 = 22528; s->band[1].nb = wd1; /* Block 3H, SCALEH */ wd1 = (s->band[1].nb >> 6) & 31; wd2 = 10 - (s->band[1].nb >> 11); wd3 = (wd2 < 0) ? (ilb[wd1] << -wd2) : (ilb[wd1] >> wd2); s->band[1].det = wd3 << 2; block4(s, 1, dhigh); } if (s->itu_test_mode) { amp[outlen++] = (int16_t) (rlow << 1); amp[outlen++] = (int16_t) (rhigh << 1); } else { if (s->eight_k) { amp[outlen++] = (int16_t) rlow; } else { /* Apply the receive QMF */ memcpy(s->x, &s->x[2], 22*sizeof(s->x[0])); s->x[22] = rlow + rhigh; s->x[23] = rlow - rhigh; xout1 = 0; xout2 = 0; for (i = 0; i < 12; i++) { xout2 += s->x[2*i]*qmf_coeffs[i]; xout1 += s->x[2*i + 1]*qmf_coeffs[11 - i]; } amp[outlen++] = (int16_t) (xout1 >> 12); amp[outlen++] = (int16_t) (xout2 >> 12); } } } return outlen; } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/t30_local.h0000644000175000017500000000232411150047216017607 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * t30_local.h - definitions for T.30 fax processing * * Written by Steve Underwood * * Copyright (C) 2003 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: t30_local.h,v 1.2 2008/04/17 14:26:57 steveu Exp $ */ /*! \file */ #if !defined(_T30_LOCAL_H_) #define _T30_LOCAL_H_ #if defined(__cplusplus) extern "C" { #endif int t30_build_dis_or_dtc(t30_state_t *s); #if defined(__cplusplus) } #endif #endif /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/t31.c0000644000175000017500000022515311150047216016440 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * t31.c - A T.31 compatible class 1 FAX modem interface. * * Written by Steve Underwood * * Special thanks to Lee Howard * for his great work debugging and polishing this code. * * Copyright (C) 2004, 2005, 2006 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: t31.c,v 1.114 2008/07/25 13:56:54 steveu Exp $ */ /*! \file */ #if defined(HAVE_CONFIG_H) #include #endif #include #include #include #include #include #include #include #include #include #include "floating_fudge.h" #if defined(HAVE_TGMATH_H) #include #endif #if defined(HAVE_MATH_H) #include #endif #include #include #include "spandsp/telephony.h" #include "spandsp/logging.h" #include "spandsp/bit_operations.h" #include "spandsp/dc_restore.h" #include "spandsp/queue.h" #include "spandsp/power_meter.h" #include "spandsp/complex.h" #include "spandsp/tone_generate.h" #include "spandsp/async.h" #include "spandsp/hdlc.h" #include "spandsp/silence_gen.h" #include "spandsp/fsk.h" #include "spandsp/v29rx.h" #include "spandsp/v29tx.h" #include "spandsp/v27ter_rx.h" #include "spandsp/v27ter_tx.h" #include "spandsp/v17rx.h" #include "spandsp/v17tx.h" #include "spandsp/t4.h" #include "spandsp/t30.h" #include "spandsp/t30_logging.h" #include "spandsp/t38_core.h" #include "spandsp/at_interpreter.h" #include "spandsp/fax_modems.h" #include "spandsp/t31.h" /* Settings suitable for paced transmission over a UDP transport */ #define MS_PER_TX_CHUNK 30 #define INDICATOR_TX_COUNT 3 #define DATA_TX_COUNT 1 #define DATA_END_TX_COUNT 3 #define DEFAULT_DTE_TIMEOUT 5 /* Settings suitable for unpaced transmission over a TCP transport */ #define MAX_OCTETS_PER_UNPACED_CHUNK 300 /* Backstop timeout if reception of packets stops in the middle of a burst */ #define MID_RX_TIMEOUT 15000 #define HDLC_FRAMING_OK_THRESHOLD 5 typedef const char *(*at_cmd_service_t)(t31_state_t *s, const char *cmd); #define ETX 0x03 #define DLE 0x10 #define SUB 0x1A /* BEWARE: right now this must match up with a list in the AT interpreter code. */ enum { T31_NONE = -1, T31_FLUSH = 0, T31_SILENCE_TX, T31_SILENCE_RX, T31_CED_TONE, T31_CNG_TONE, T31_NOCNG_TONE, T31_V21_TX, T31_V17_TX, T31_V27TER_TX, T31_V29_TX, T31_V21_RX, T31_V17_RX, T31_V27TER_RX, T31_V29_RX }; enum { T38_TIMED_STEP_NONE = 0, T38_TIMED_STEP_NON_ECM_MODEM, T38_TIMED_STEP_NON_ECM_MODEM_2, T38_TIMED_STEP_NON_ECM_MODEM_3, T38_TIMED_STEP_NON_ECM_MODEM_4, T38_TIMED_STEP_NON_ECM_MODEM_5, T38_TIMED_STEP_HDLC_MODEM, T38_TIMED_STEP_HDLC_MODEM_2, T38_TIMED_STEP_HDLC_MODEM_3, T38_TIMED_STEP_HDLC_MODEM_4, T38_TIMED_STEP_CED, T38_TIMED_STEP_CED_2, T38_TIMED_STEP_CNG, T38_TIMED_STEP_CNG_2, T38_TIMED_STEP_PAUSE }; static int restart_modem(t31_state_t *s, int new_modem); static void hdlc_accept(void *user_data, const uint8_t *msg, int len, int ok); static int early_v17_rx(void *user_data, const int16_t amp[], int len); static int early_v27ter_rx(void *user_data, const int16_t amp[], int len); static int early_v29_rx(void *user_data, const int16_t amp[], int len); static int dummy_rx(void *s, const int16_t amp[], int len); static int silence_rx(void *user_data, const int16_t amp[], int len); static int cng_rx(void *user_data, const int16_t amp[], int len); static __inline__ void t31_set_at_rx_mode(t31_state_t *s, int new_mode) { s->at_state.at_rx_mode = new_mode; } /*- End of function --------------------------------------------------------*/ static int process_rx_missing(t38_core_state_t *t, void *user_data, int rx_seq_no, int expected_seq_no) { t31_state_t *s; s = (t31_state_t *) user_data; s->t38_fe.missing_data = TRUE; return 0; } /*- End of function --------------------------------------------------------*/ static int process_rx_indicator(t38_core_state_t *t, void *user_data, int indicator) { t31_state_t *s; t31_t38_front_end_state_t *fe; s = (t31_state_t *) user_data; fe = &s->t38_fe; if (t->current_rx_indicator == indicator) { /* This is probably due to the far end repeating itself. Ignore it. Its harmless */ return 0; } switch (indicator) { case T38_IND_NO_SIGNAL: if (t->current_rx_indicator == T38_IND_V21_PREAMBLE && (fe->current_rx_type == T30_MODEM_V21 || fe->current_rx_type == T30_MODEM_CNG)) { /* TODO: report carrier down */ } fe->timeout_rx_samples = 0; /* TODO: report end of signal */ break; case T38_IND_CNG: break; case T38_IND_CED: break; case T38_IND_V21_PREAMBLE: /* Some people pop these preamble indicators between HDLC frames, so we need to be tolerant of that. */ fe->timeout_rx_samples = fe->samples + ms_to_samples(MID_RX_TIMEOUT); /* TODO: report signal present */ break; case T38_IND_V27TER_2400_TRAINING: case T38_IND_V27TER_4800_TRAINING: case T38_IND_V29_7200_TRAINING: case T38_IND_V29_9600_TRAINING: case T38_IND_V17_7200_SHORT_TRAINING: case T38_IND_V17_7200_LONG_TRAINING: case T38_IND_V17_9600_SHORT_TRAINING: case T38_IND_V17_9600_LONG_TRAINING: case T38_IND_V17_12000_SHORT_TRAINING: case T38_IND_V17_12000_LONG_TRAINING: case T38_IND_V17_14400_SHORT_TRAINING: case T38_IND_V17_14400_LONG_TRAINING: case T38_IND_V33_12000_TRAINING: case T38_IND_V33_14400_TRAINING: fe->timeout_rx_samples = fe->samples + ms_to_samples(MID_RX_TIMEOUT); /* TODO: report signal present */ break; case T38_IND_V8_ANSAM: case T38_IND_V8_SIGNAL: case T38_IND_V34_CNTL_CHANNEL_1200: case T38_IND_V34_PRI_CHANNEL: case T38_IND_V34_CC_RETRAIN: /* TODO: report signal present */ break; default: /* TODO: report end of signal */ break; } fe->hdlc_rx.len = 0; fe->missing_data = FALSE; return 0; } /*- End of function --------------------------------------------------------*/ static int process_rx_data(t38_core_state_t *t, void *user_data, int data_type, int field_type, const uint8_t *buf, int len) { t31_state_t *s; t31_t38_front_end_state_t *fe; #if defined(_MSC_VER) uint8_t *buf2 = (uint8_t *) alloca(len); #else uint8_t buf2[len]; #endif s = (t31_state_t *) user_data; fe = &s->t38_fe; #if 0 switch (data_type) { case T38_DATA_V21: case T38_DATA_V27TER_2400: case T38_DATA_V27TER_4800: case T38_DATA_V29_7200: case T38_DATA_V29_9600: case T38_DATA_V17_7200: case T38_DATA_V17_9600: case T38_DATA_V17_12000: case T38_DATA_V17_14400: case T38_DATA_V8: case T38_DATA_V34_PRI_RATE: case T38_DATA_V34_CC_1200: case T38_DATA_V34_PRI_CH: case T38_DATA_V33_12000: case T38_DATA_V33_14400: default: break; } #endif switch (field_type) { case T38_FIELD_HDLC_DATA: if (fe->timeout_rx_samples == 0) { /* HDLC can just start without any signal indicator on some platforms, even when there is zero packet lost. Nasty, but true. Its a good idea to be tolerant of loss, though, so accepting a sudden start of HDLC data is the right thing to do. */ fe->timeout_rx_samples = fe->samples + ms_to_samples(MID_RX_TIMEOUT); /* TODO: report signal present */ /* All real HDLC messages in the FAX world start with 0xFF. If this one is not starting with 0xFF it would appear some octets must have been missed before this one. */ if (buf[0] != 0xFF) fe->missing_data = TRUE; } if (fe->hdlc_rx.len + len <= T31_T38_MAX_HDLC_LEN) { bit_reverse(fe->hdlc_rx.buf + fe->hdlc_rx.len, buf, len); fe->hdlc_rx.len += len; } fe->timeout_rx_samples = fe->samples + ms_to_samples(MID_RX_TIMEOUT); break; case T38_FIELD_HDLC_FCS_OK: if (len > 0) { span_log(&s->logging, SPAN_LOG_WARNING, "There is data in a T38_FIELD_HDLC_FCS_OK!\n"); /* The sender has incorrectly included data in this message. It is unclear what we should do with it, to maximise tolerance of buggy implementations. */ } /* Some T.38 implementations send multiple T38_FIELD_HDLC_FCS_OK messages, in IFP packets with incrementing sequence numbers, which are actually repeats. They get through to this point because of the incrementing sequence numbers. We need to filter them here in a context sensitive manner. */ if (t->current_rx_data_type != data_type || t->current_rx_field_type != field_type) { span_log(&s->logging, SPAN_LOG_FLOW, "Type %s - CRC OK (%s)\n", (fe->hdlc_rx.len >= 3) ? t30_frametype(fe->hdlc_rx.buf[2]) : "???", (fe->missing_data) ? "missing octets" : "clean"); hdlc_accept((void *) s, fe->hdlc_rx.buf, fe->hdlc_rx.len, !fe->missing_data); } fe->hdlc_rx.len = 0; fe->missing_data = FALSE; break; case T38_FIELD_HDLC_FCS_BAD: if (len > 0) { span_log(&s->logging, SPAN_LOG_WARNING, "There is data in a T38_FIELD_HDLC_FCS_BAD!\n"); /* The sender has incorrectly included data in this message. We can safely ignore it, as the bad FCS means we will throw away the whole message, anyway. */ } /* Some T.38 implementations send multiple T38_FIELD_HDLC_FCS_BAD messages, in IFP packets with incrementing sequence numbers, which are actually repeats. They get through to this point because of the incrementing sequence numbers. We need to filter them here in a context sensitive manner. */ if (t->current_rx_data_type != data_type || t->current_rx_field_type != field_type) { span_log(&s->logging, SPAN_LOG_FLOW, "Type %s - CRC bad (%s)\n", (fe->hdlc_rx.len >= 3) ? t30_frametype(fe->hdlc_rx.buf[2]) : "???", (fe->missing_data) ? "missing octets" : "clean"); hdlc_accept((void *) s, fe->hdlc_rx.buf, fe->hdlc_rx.len, FALSE); } fe->hdlc_rx.len = 0; fe->missing_data = FALSE; break; case T38_FIELD_HDLC_FCS_OK_SIG_END: if (len > 0) { span_log(&s->logging, SPAN_LOG_WARNING, "There is data in a T38_FIELD_HDLC_FCS_OK_SIG_END!\n"); /* The sender has incorrectly included data in this message. It is unclear what we should do with it, to maximise tolerance of buggy implementations. */ } span_log(&s->logging, SPAN_LOG_FLOW, "Type %s - CRC OK, sig end (%s)\n", t30_frametype(s->tx.data[2]), (fe->missing_data) ? "missing octets" : "clean"); if (fe->current_rx_type == T31_V21_RX) { /* Don't deal with zero length frames. Some T.38 implementations send multiple T38_FIELD_HDLC_FCS_OK packets, when they have sent no data for the body of the frame. */ if (s->tx.out_bytes > 0) hdlc_accept((void *) s, fe->hdlc_rx.buf, fe->hdlc_rx.len, TRUE); hdlc_accept((void *) s, NULL, PUTBIT_CARRIER_DOWN, TRUE); } s->tx.out_bytes = 0; fe->missing_data = FALSE; fe->hdlc_rx.len = 0; break; case T38_FIELD_HDLC_FCS_BAD_SIG_END: if (len > 0) span_log(&s->logging, SPAN_LOG_WARNING, "There is data in a T38_FIELD_HDLC_FCS_BAD_SIG_END!\n"); span_log(&s->logging, SPAN_LOG_FLOW, "Type %s - CRC bad, sig end (%s)\n", t30_frametype(s->tx.data[2]), (fe->missing_data) ? "missing octets" : "clean"); if (fe->current_rx_type == T31_V21_RX) hdlc_accept((void *) s, NULL, PUTBIT_CARRIER_DOWN, TRUE); fe->hdlc_rx.len = 0; fe->missing_data = FALSE; break; case T38_FIELD_HDLC_SIG_END: if (len > 0) span_log(&s->logging, SPAN_LOG_WARNING, "There is data in a T38_FIELD_HDLC_SIG_END!\n"); /* This message is expected under 2 circumstances. One is as an alternative to T38_FIELD_HDLC_FCS_OK_SIG_END - i.e. they send T38_FIELD_HDLC_FCS_OK, and then T38_FIELD_HDLC_SIG_END when the carrier actually drops. The other is because the HDLC signal drops unexpectedly - i.e. not just after a final frame. */ if (fe->current_rx_type == T31_V21_RX) hdlc_accept((void *) s, NULL, PUTBIT_CARRIER_DOWN, TRUE); fe->hdlc_rx.len = 0; fe->missing_data = FALSE; break; case T38_FIELD_T4_NON_ECM_DATA: if (!s->at_state.rx_signal_present) { /* TODO: report training succeeded */ s->at_state.rx_signal_present = TRUE; } bit_reverse(buf2, buf, len); /* TODO: put the chunk */ fe->timeout_rx_samples = fe->samples + ms_to_samples(MID_RX_TIMEOUT); break; case T38_FIELD_T4_NON_ECM_SIG_END: /* Some T.38 implementations send multiple T38_FIELD_T4_NON_ECM_SIG_END messages, in IFP packets with incrementing sequence numbers, which are actually repeats. They get through to this point because of the incrementing sequence numbers. We need to filter them here in a context sensitive manner. */ if (t->current_rx_data_type != data_type || t->current_rx_field_type != field_type) { if (len > 0) { if (!s->at_state.rx_signal_present) { /* TODO: report training succeeded */ s->at_state.rx_signal_present = TRUE; } bit_reverse(buf2, buf, len); /* TODO: put the chunk */ } /* WORKAROUND: At least some Mediatrix boxes have a bug, where they can send HDLC signal end where they should send non-ECM signal end. It is possible they also do the opposite. We need to tolerate this, so we use the generic receive complete indication, rather than the specific non-ECM carrier down. */ /* TODO: report receive complete */ } s->at_state.rx_signal_present = FALSE; fe->timeout_rx_samples = 0; break; case T38_FIELD_CM_MESSAGE: case T38_FIELD_JM_MESSAGE: case T38_FIELD_CI_MESSAGE: case T38_FIELD_V34RATE: default: break; } return 0; } /*- End of function --------------------------------------------------------*/ int t31_t38_send_timeout(t31_state_t *s, int samples) { int len; int i; int previous; uint8_t buf[MAX_OCTETS_PER_UNPACED_CHUNK + 50]; t31_t38_front_end_state_t *fe; t38_data_field_t data_fields[2]; /* The times for training, the optional TEP, and the HDLC preamble, for all the modem options, in ms. Note that the preamble for V.21 is 1s+-15%, and for the other modems is 200ms+100ms. */ static const struct { int tep; int training; int flags; } startup_time[] = { { 0, 0, 0}, /* T38_IND_NO_SIGNAL */ { 0, 0, 0}, /* T38_IND_CNG */ { 0, 0, 0}, /* T38_IND_CED */ { 0, 0, 1000}, /* T38_IND_V21_PREAMBLE */ /* TODO: 850ms should be OK for this, but it causes trouble with some ATAs. Why? */ { 215, 943, 200}, /* T38_IND_V27TER_2400_TRAINING */ { 215, 708, 200}, /* T38_IND_V27TER_4800_TRAINING */ { 215, 234, 200}, /* T38_IND_V29_7200_TRAINING */ { 215, 234, 200}, /* T38_IND_V29_9600_TRAINING */ { 215, 142, 200}, /* T38_IND_V17_7200_SHORT_TRAINING */ { 215, 1393, 200}, /* T38_IND_V17_7200_LONG_TRAINING */ { 215, 142, 200}, /* T38_IND_V17_9600_SHORT_TRAINING */ { 215, 1393, 200}, /* T38_IND_V17_9600_LONG_TRAINING */ { 215, 142, 200}, /* T38_IND_V17_12000_SHORT_TRAINING */ { 215, 1393, 200}, /* T38_IND_V17_12000_LONG_TRAINING */ { 215, 142, 200}, /* T38_IND_V17_14400_SHORT_TRAINING */ { 215, 1393, 200}, /* T38_IND_V17_14400_LONG_TRAINING */ { 215, 0, 0}, /* T38_IND_V8_ANSAM */ { 215, 0, 0}, /* T38_IND_V8_SIGNAL */ { 215, 0, 0}, /* T38_IND_V34_CNTL_CHANNEL_1200 */ { 215, 0, 0}, /* T38_IND_V34_PRI_CHANNEL */ { 215, 0, 0}, /* T38_IND_V34_CC_RETRAIN */ { 215, 0, 0}, /* T38_IND_V33_12000_TRAINING */ { 215, 0, 0} /* T38_IND_V33_14400_TRAINING */ }; fe = &s->t38_fe; if (fe->current_rx_type == T30_MODEM_DONE || fe->current_tx_type == T30_MODEM_DONE) return TRUE; fe->samples += samples; if (fe->timeout_rx_samples && fe->samples > fe->timeout_rx_samples) { span_log(&s->logging, SPAN_LOG_FLOW, "Timeout mid-receive\n"); fe->timeout_rx_samples = 0; /* TODO: report completion */ } if (fe->timed_step == T38_TIMED_STEP_NONE) return FALSE; if (fe->samples < fe->next_tx_samples) return FALSE; /* Its time to send something */ switch (fe->timed_step) { case T38_TIMED_STEP_NON_ECM_MODEM: /* Create a 75ms silence */ if (fe->t38.current_tx_indicator != T38_IND_NO_SIGNAL) t38_core_send_indicator(&fe->t38, T38_IND_NO_SIGNAL, fe->t38.indicator_tx_count); fe->timed_step = T38_TIMED_STEP_NON_ECM_MODEM_2; fe->next_tx_samples += ms_to_samples(75); break; case T38_TIMED_STEP_NON_ECM_MODEM_2: /* Switch on a fast modem, and give the training time to complete */ t38_core_send_indicator(&fe->t38, fe->next_tx_indicator, fe->t38.indicator_tx_count); fe->timed_step = T38_TIMED_STEP_NON_ECM_MODEM_3; fe->next_tx_samples += ms_to_samples(startup_time[fe->next_tx_indicator].training); if (s->audio.use_tep) fe->next_tx_samples += ms_to_samples(startup_time[fe->next_tx_indicator].tep); break; case T38_TIMED_STEP_NON_ECM_MODEM_3: /* Send a chunk of non-ECM image data */ /* T.38 says it is OK to send the last of the non-ECM data in the signal end message. However, I think the early versions of T.38 said the signal end message should not contain data. Hopefully, following the current spec will not cause compatibility issues. */ /* Get a chunk of data */ len = fe->octets_per_data_packet; bit_reverse(buf, buf, len); if (len < fe->octets_per_data_packet) { /* That's the end of the image data. Do a little padding now */ memset(buf + len, 0, fe->octets_per_data_packet - len); fe->trailer_bytes = 3*fe->octets_per_data_packet + len; len = fe->octets_per_data_packet; fe->timed_step = T38_TIMED_STEP_NON_ECM_MODEM_4; } t38_core_send_data(&fe->t38, fe->current_tx_data_type, T38_FIELD_T4_NON_ECM_DATA, buf, len, DATA_TX_COUNT); fe->next_tx_samples += ms_to_samples(fe->ms_per_tx_chunk); break; case T38_TIMED_STEP_NON_ECM_MODEM_4: /* This pads the end of the data with some zeros. If we just stop abruptly at the end of the EOLs, some ATAs fail to clean up properly before shutting down their transmit modem, and the last few rows of the image get corrupted. Simply delaying the no-signal message does not help for all implentations. It often appears to be ignored. */ len = fe->octets_per_data_packet; fe->trailer_bytes -= len; if (fe->trailer_bytes <= 0) { len += fe->trailer_bytes; memset(buf, 0, len); t38_core_send_data(&fe->t38, fe->current_tx_data_type, T38_FIELD_T4_NON_ECM_SIG_END, buf, len, fe->data_end_tx_count); fe->timed_step = T38_TIMED_STEP_NON_ECM_MODEM_5; fe->next_tx_samples += ms_to_samples(60); break; } memset(buf, 0, len); t38_core_send_data(&fe->t38, fe->current_tx_data_type, T38_FIELD_T4_NON_ECM_DATA, buf, len, DATA_TX_COUNT); fe->next_tx_samples += ms_to_samples(fe->ms_per_tx_chunk); break; case T38_TIMED_STEP_NON_ECM_MODEM_5: /* This should not be needed, since the message above indicates the end of the signal, but it seems like it can improve compatibility with quirky implementations. */ t38_core_send_indicator(&fe->t38, T38_IND_NO_SIGNAL, fe->t38.indicator_tx_count); fe->timed_step = T38_TIMED_STEP_NONE; /* TODO: report send complete */ break; case T38_TIMED_STEP_HDLC_MODEM: /* Send HDLC preambling */ t38_core_send_indicator(&fe->t38, fe->next_tx_indicator, fe->t38.indicator_tx_count); fe->next_tx_samples += ms_to_samples(startup_time[fe->next_tx_indicator].training + startup_time[fe->next_tx_indicator].flags); if (s->audio.use_tep) fe->next_tx_samples += ms_to_samples(startup_time[fe->next_tx_indicator].tep); fe->timed_step = T38_TIMED_STEP_HDLC_MODEM_2; break; case T38_TIMED_STEP_HDLC_MODEM_2: /* Send a chunk of HDLC data */ i = s->hdlc_tx.len - s->hdlc_tx.ptr; if (fe->octets_per_data_packet >= i) { /* The last part of the HDLC frame */ if (fe->merge_tx_fields) { /* Copy the data, as we might be about to refill the buffer it is in */ memcpy(buf, &s->hdlc_tx.buf[s->hdlc_tx.ptr], i); data_fields[0].field_type = T38_FIELD_HDLC_DATA; data_fields[0].field = buf; data_fields[0].field_len = i; /* Now see about the next HDLC frame. This will tell us whether to send FCS_OK or FCS_OK_SIG_END */ previous = fe->current_tx_data_type; s->hdlc_tx.ptr = 0; s->hdlc_tx.len = 0; /* TODO: report completion */ /* The above step should have got the next HDLC step ready - either another frame, or an instruction to stop transmission. */ if (s->hdlc_tx.len < 0) { data_fields[1].field_type = T38_FIELD_HDLC_FCS_OK_SIG_END; fe->timed_step = T38_TIMED_STEP_HDLC_MODEM_4; } else { data_fields[1].field_type = T38_FIELD_HDLC_FCS_OK; fe->timed_step = T38_TIMED_STEP_HDLC_MODEM_2; } data_fields[1].field = NULL; data_fields[1].field_len = 0; t38_core_send_data_multi_field(&fe->t38, fe->current_tx_data_type, data_fields, 2, DATA_TX_COUNT); } else { t38_core_send_data(&fe->t38, fe->current_tx_data_type, T38_FIELD_HDLC_DATA, &s->hdlc_tx.buf[s->hdlc_tx.ptr], i, DATA_TX_COUNT); fe->timed_step = T38_TIMED_STEP_HDLC_MODEM_3; } fe->next_tx_samples += ms_to_samples(fe->ms_per_tx_chunk); break; } t38_core_send_data(&fe->t38, fe->current_tx_data_type, T38_FIELD_HDLC_DATA, &s->hdlc_tx.buf[s->hdlc_tx.ptr], fe->octets_per_data_packet, DATA_TX_COUNT); s->hdlc_tx.ptr += fe->octets_per_data_packet; fe->next_tx_samples += ms_to_samples(fe->ms_per_tx_chunk); break; case T38_TIMED_STEP_HDLC_MODEM_3: /* End of HDLC frame */ previous = fe->current_tx_data_type; s->hdlc_tx.ptr = 0; s->hdlc_tx.len = 0; /* TODO: report completion */ /* The above step should have got the next HDLC step ready - either another frame, or an instruction to stop transmission. */ if (s->hdlc_tx.len < 0) { t38_core_send_data(&fe->t38, previous, T38_FIELD_HDLC_FCS_OK_SIG_END, NULL, 0, fe->data_end_tx_count); fe->timed_step = T38_TIMED_STEP_HDLC_MODEM_4; fe->next_tx_samples += ms_to_samples(100); break; } t38_core_send_data(&fe->t38, previous, T38_FIELD_HDLC_FCS_OK, NULL, 0, DATA_TX_COUNT); if (s->hdlc_tx.len) fe->timed_step = T38_TIMED_STEP_HDLC_MODEM_2; fe->next_tx_samples += ms_to_samples(fe->ms_per_tx_chunk); break; case T38_TIMED_STEP_HDLC_MODEM_4: /* Note that some boxes do not like us sending a T38_FIELD_HDLC_SIG_END at this point. A T38_IND_NO_SIGNAL should always be OK. */ t38_core_send_indicator(&fe->t38, T38_IND_NO_SIGNAL, fe->t38.indicator_tx_count); s->hdlc_tx.len = 0; //t30_front_end_status(&(s->t30), T30_FRONT_END_SEND_STEP_COMPLETE); break; case T38_TIMED_STEP_CED: /* It seems common practice to start with a no signal indicator, though this is not a specified requirement. Since we should be sending 200ms of silence, starting the delay with a no signal indication makes sense. We do need a 200ms delay, as that is a specification requirement. */ fe->timed_step = T38_TIMED_STEP_CED_2; fe->next_tx_samples = fe->samples + ms_to_samples(200); t38_core_send_indicator(&fe->t38, T38_IND_NO_SIGNAL, fe->t38.indicator_tx_count); fe->current_tx_data_type = T38_DATA_NONE; break; case T38_TIMED_STEP_CED_2: /* Initial 200ms delay over. Send the CED indicator */ fe->next_tx_samples = fe->samples + ms_to_samples(3000); fe->timed_step = T38_TIMED_STEP_PAUSE; t38_core_send_indicator(&fe->t38, T38_IND_CED, fe->t38.indicator_tx_count); fe->current_tx_data_type = T38_DATA_NONE; break; case T38_TIMED_STEP_CNG: /* It seems common practice to start with a no signal indicator, though this is not a specified requirement. Since we should be sending 200ms of silence, starting the delay with a no signal indication makes sense. We do need a 200ms delay, as that is a specification requirement. */ fe->timed_step = T38_TIMED_STEP_CNG_2; fe->next_tx_samples = fe->samples + ms_to_samples(200); t38_core_send_indicator(&fe->t38, T38_IND_NO_SIGNAL, fe->t38.indicator_tx_count); fe->current_tx_data_type = T38_DATA_NONE; break; case T38_TIMED_STEP_CNG_2: /* Initial short delay over. Send the CNG indicator */ fe->timed_step = T38_TIMED_STEP_NONE; t38_core_send_indicator(&fe->t38, T38_IND_CNG, fe->t38.indicator_tx_count); fe->current_tx_data_type = T38_DATA_NONE; break; case T38_TIMED_STEP_PAUSE: /* End of timed pause */ fe->timed_step = T38_TIMED_STEP_NONE; //t30_front_end_status(&(s->t30), T30_FRONT_END_SEND_STEP_COMPLETE); break; } return FALSE; } /*- End of function --------------------------------------------------------*/ static int t31_modem_control_handler(at_state_t *s, void *user_data, int op, const char *num) { t31_state_t *t; t = (t31_state_t *) user_data; switch (op) { case AT_MODEM_CONTROL_CALL: t->call_samples = 0; break; case AT_MODEM_CONTROL_ANSWER: t->call_samples = 0; break; case AT_MODEM_CONTROL_ONHOOK: if (t->tx.holding) { t->tx.holding = FALSE; /* Tell the application to release further data */ at_modem_control(&t->at_state, AT_MODEM_CONTROL_CTS, (void *) 1); } if (t->at_state.rx_signal_present) { t->at_state.rx_data[t->at_state.rx_data_bytes++] = DLE; t->at_state.rx_data[t->at_state.rx_data_bytes++] = ETX; t->at_state.at_tx_handler(&t->at_state, t->at_state.at_tx_user_data, t->at_state.rx_data, t->at_state.rx_data_bytes); t->at_state.rx_data_bytes = 0; } restart_modem(t, T31_SILENCE_TX); break; case AT_MODEM_CONTROL_RESTART: restart_modem(t, (int) (intptr_t) num); return 0; case AT_MODEM_CONTROL_DTE_TIMEOUT: if (num) t->dte_data_timeout = t->call_samples + ms_to_samples((intptr_t) num); else t->dte_data_timeout = 0; return 0; } return t->modem_control_handler(t, t->modem_control_user_data, op, num); } /*- End of function --------------------------------------------------------*/ static void non_ecm_put_bit(void *user_data, int bit) { t31_state_t *s; s = (t31_state_t *) user_data; if (bit < 0) { /* Special conditions */ switch (bit) { case PUTBIT_TRAINING_IN_PROGRESS: break; case PUTBIT_TRAINING_FAILED: s->at_state.rx_trained = FALSE; break; case PUTBIT_TRAINING_SUCCEEDED: /* The modem is now trained */ at_put_response_code(&s->at_state, AT_RESPONSE_CODE_CONNECT); s->at_state.rx_signal_present = TRUE; s->at_state.rx_trained = TRUE; break; case PUTBIT_CARRIER_UP: break; case PUTBIT_CARRIER_DOWN: if (s->at_state.rx_signal_present) { s->at_state.rx_data[s->at_state.rx_data_bytes++] = DLE; s->at_state.rx_data[s->at_state.rx_data_bytes++] = ETX; s->at_state.at_tx_handler(&s->at_state, s->at_state.at_tx_user_data, s->at_state.rx_data, s->at_state.rx_data_bytes); s->at_state.rx_data_bytes = 0; at_put_response_code(&s->at_state, AT_RESPONSE_CODE_NO_CARRIER); t31_set_at_rx_mode(s, AT_MODE_OFFHOOK_COMMAND); } s->at_state.rx_signal_present = FALSE; s->at_state.rx_trained = FALSE; break; default: if (s->at_state.p.result_code_format) span_log(&s->logging, SPAN_LOG_FLOW, "Eh!\n"); break; } return; } s->audio.current_byte = (s->audio.current_byte >> 1) | (bit << 7); if (++s->audio.bit_no >= 8) { if (s->audio.current_byte == DLE) s->at_state.rx_data[s->at_state.rx_data_bytes++] = DLE; s->at_state.rx_data[s->at_state.rx_data_bytes++] = (uint8_t) s->audio.current_byte; if (s->at_state.rx_data_bytes >= 250) { s->at_state.at_tx_handler(&s->at_state, s->at_state.at_tx_user_data, s->at_state.rx_data, s->at_state.rx_data_bytes); s->at_state.rx_data_bytes = 0; } s->audio.bit_no = 0; s->audio.current_byte = 0; } } /*- End of function --------------------------------------------------------*/ static int non_ecm_get_bit(void *user_data) { t31_state_t *s; int bit; s = (t31_state_t *) user_data; if (s->audio.bit_no <= 0) { if (s->tx.out_bytes != s->tx.in_bytes) { /* There is real data available to send */ s->audio.current_byte = s->tx.data[s->tx.out_bytes++]; if (s->tx.out_bytes > T31_TX_BUF_LEN - 1) { s->tx.out_bytes = T31_TX_BUF_LEN - 1; fprintf(stderr, "End of transmit buffer reached!\n"); } if (s->tx.holding) { /* See if the buffer is approaching empty. It might be time to release flow control. */ if (s->tx.out_bytes > 1024) { s->tx.holding = FALSE; /* Tell the application to release further data */ at_modem_control(&s->at_state, AT_MODEM_CONTROL_CTS, (void *) 1); } } s->tx.data_started = TRUE; } else { if (s->tx.final) { s->tx.final = FALSE; /* This will put the modem into its shutdown sequence. When it has finally shut down, an OK response will be sent. */ return PUTBIT_END_OF_DATA; } /* Fill with 0xFF bytes at the start of transmission, or 0x00 if we are in the middle of transmission. This follows T.31 and T.30 practice. */ s->audio.current_byte = (s->tx.data_started) ? 0x00 : 0xFF; } s->audio.bit_no = 8; } s->audio.bit_no--; bit = s->audio.current_byte & 1; s->audio.current_byte >>= 1; return bit; } /*- End of function --------------------------------------------------------*/ static void hdlc_tx_underflow(void *user_data) { t31_state_t *s; s = (t31_state_t *) user_data; if (s->hdlc_tx.final) { s->hdlc_tx.final = FALSE; /* Schedule an orderly shutdown of the modem */ hdlc_tx_frame(&(s->audio.modems.hdlc_tx), NULL, 0); } else { at_put_response_code(&s->at_state, AT_RESPONSE_CODE_CONNECT); } } /*- End of function --------------------------------------------------------*/ static void hdlc_accept(void *user_data, const uint8_t *msg, int len, int ok) { uint8_t buf[256]; t31_state_t *s; int i; s = (t31_state_t *) user_data; if (len < 0) { /* Special conditions */ switch (len) { case PUTBIT_TRAINING_IN_PROGRESS: break; case PUTBIT_TRAINING_FAILED: s->at_state.rx_trained = FALSE; break; case PUTBIT_TRAINING_SUCCEEDED: /* The modem is now trained */ s->at_state.rx_signal_present = TRUE; s->at_state.rx_trained = TRUE; break; case PUTBIT_CARRIER_UP: if (s->modem == T31_CNG_TONE || s->modem == T31_NOCNG_TONE || s->modem == T31_V21_RX) { s->at_state.rx_signal_present = TRUE; s->rx_message_received = FALSE; } break; case PUTBIT_CARRIER_DOWN: if (s->rx_message_received) { if (s->at_state.dte_is_waiting) { if (s->at_state.ok_is_pending) { at_put_response_code(&s->at_state, AT_RESPONSE_CODE_OK); s->at_state.ok_is_pending = FALSE; } else { at_put_response_code(&s->at_state, AT_RESPONSE_CODE_NO_CARRIER); } s->at_state.dte_is_waiting = FALSE; t31_set_at_rx_mode(s, AT_MODE_OFFHOOK_COMMAND); } else { buf[0] = AT_RESPONSE_CODE_NO_CARRIER; queue_write_msg(s->rx_queue, buf, 1); } } s->at_state.rx_signal_present = FALSE; s->at_state.rx_trained = FALSE; break; case PUTBIT_FRAMING_OK: if (s->modem == T31_CNG_TONE || s->modem == T31_NOCNG_TONE) { /* Once we get any valid HDLC the CNG tone stops, and we drop to the V.21 receive modem on its own. */ s->modem = T31_V21_RX; s->at_state.transmit = FALSE; } if (s->modem == T31_V17_RX || s->modem == T31_V27TER_RX || s->modem == T31_V29_RX) { /* V.21 has been detected while expecting a different carrier. If +FAR=0 then result +FCERROR and return to command-mode. If +FAR=1 then report +FRH:3 and CONNECT, switching to V.21 receive mode. */ if (s->at_state.p.adaptive_receive) { s->at_state.rx_signal_present = TRUE; s->rx_message_received = TRUE; s->modem = T31_V21_RX; s->at_state.transmit = FALSE; s->at_state.dte_is_waiting = TRUE; at_put_response_code(&s->at_state, AT_RESPONSE_CODE_FRH3); at_put_response_code(&s->at_state, AT_RESPONSE_CODE_CONNECT); } else { s->modem = T31_SILENCE_TX; t31_set_at_rx_mode(s, AT_MODE_OFFHOOK_COMMAND); s->rx_message_received = FALSE; at_put_response_code(&s->at_state, AT_RESPONSE_CODE_FCERROR); } } else { if (!s->rx_message_received) { if (s->at_state.dte_is_waiting) { /* Report CONNECT as soon as possible to avoid a timeout. */ at_put_response_code(&s->at_state, AT_RESPONSE_CODE_CONNECT); s->rx_message_received = TRUE; } else { buf[0] = AT_RESPONSE_CODE_CONNECT; queue_write_msg(s->rx_queue, buf, 1); } } } break; case PUTBIT_ABORT: /* Just ignore these */ break; default: span_log(&s->logging, SPAN_LOG_WARNING, "Unexpected HDLC special length - %d!\n", len); break; } return; } if (!s->rx_message_received) { if (s->at_state.dte_is_waiting) { /* Report CONNECT as soon as possible to avoid a timeout. */ at_put_response_code(&s->at_state, AT_RESPONSE_CODE_CONNECT); s->rx_message_received = TRUE; } else { buf[0] = AT_RESPONSE_CODE_CONNECT; queue_write_msg(s->rx_queue, buf, 1); } } /* If OK is pending then we just ignore whatever comes in */ if (!s->at_state.ok_is_pending) { if (s->at_state.dte_is_waiting) { /* Send straight away */ /* It is safe to look at the two bytes beyond the length of the message, and expect to find the FCS there. */ for (i = 0; i < len + 2; i++) { if (msg[i] == DLE) s->at_state.rx_data[s->at_state.rx_data_bytes++] = DLE; s->at_state.rx_data[s->at_state.rx_data_bytes++] = msg[i]; } s->at_state.rx_data[s->at_state.rx_data_bytes++] = DLE; s->at_state.rx_data[s->at_state.rx_data_bytes++] = ETX; s->at_state.at_tx_handler(&s->at_state, s->at_state.at_tx_user_data, s->at_state.rx_data, s->at_state.rx_data_bytes); s->at_state.rx_data_bytes = 0; if (msg[1] == 0x13 && ok) { /* This is the last frame. We don't send OK until the carrier drops to avoid redetecting it later. */ s->at_state.ok_is_pending = TRUE; } else { at_put_response_code(&s->at_state, (ok) ? AT_RESPONSE_CODE_OK : AT_RESPONSE_CODE_ERROR); s->at_state.dte_is_waiting = FALSE; s->rx_message_received = FALSE; } } else { /* Queue it */ buf[0] = (ok) ? AT_RESPONSE_CODE_OK : AT_RESPONSE_CODE_ERROR; /* It is safe to look at the two bytes beyond the length of the message, and expect to find the FCS there. */ memcpy(buf + 1, msg, len + 2); queue_write_msg(s->rx_queue, buf, len + 3); } } t31_set_at_rx_mode(s, AT_MODE_OFFHOOK_COMMAND); } /*- End of function --------------------------------------------------------*/ static void t31_v21_rx(t31_state_t *s) { hdlc_rx_init(&(s->audio.modems.hdlc_rx), FALSE, TRUE, HDLC_FRAMING_OK_THRESHOLD, hdlc_accept, s); s->at_state.ok_is_pending = FALSE; s->hdlc_tx.final = FALSE; s->hdlc_tx.len = 0; s->dled = FALSE; fsk_rx_init(&(s->audio.modems.v21_rx), &preset_fsk_specs[FSK_V21CH2], TRUE, (put_bit_func_t) hdlc_rx_put_bit, &(s->audio.modems.hdlc_rx)); fsk_rx_signal_cutoff(&(s->audio.modems.v21_rx), -39.09); s->at_state.transmit = TRUE; } /*- End of function --------------------------------------------------------*/ static int restart_modem(t31_state_t *s, int new_modem) { tone_gen_descriptor_t tone_desc; int ind; span_log(&s->logging, SPAN_LOG_FLOW, "Restart modem %d\n", new_modem); if (s->modem == new_modem) return 0; queue_flush(s->rx_queue); s->modem = new_modem; s->tx.final = FALSE; s->at_state.rx_signal_present = FALSE; s->at_state.rx_trained = FALSE; s->rx_message_received = FALSE; s->audio.rx_handler = (span_rx_handler_t *) &dummy_rx; s->audio.rx_user_data = NULL; switch (s->modem) { case T31_CNG_TONE: if (s->t38_mode) { t38_core_send_indicator(&s->t38_fe.t38, T38_IND_CNG, INDICATOR_TX_COUNT); } else { /* CNG is special, since we need to receive V.21 HDLC messages while sending the tone. Everything else in FAX processing sends only one way at a time. */ /* 0.5s of 1100Hz + 3.0s of silence repeating */ make_tone_gen_descriptor(&tone_desc, 1100, -11, 0, 0, 500, 3000, 0, 0, TRUE); tone_gen_init(&(s->audio.modems.tone_gen), &tone_desc); /* Do V.21/HDLC receive in parallel. The other end may send its first message at any time. The CNG tone will continue until we get a valid preamble. */ s->audio.rx_handler = (span_rx_handler_t *) &cng_rx; s->audio.rx_user_data = s; t31_v21_rx(s); s->audio.tx_handler = (span_tx_handler_t *) &tone_gen; s->audio.tx_user_data = &(s->audio.modems.tone_gen); s->audio.next_tx_handler = NULL; } s->at_state.transmit = TRUE; break; case T31_NOCNG_TONE: if (s->t38_mode) { } else { s->audio.rx_handler = (span_rx_handler_t *) &cng_rx; s->audio.rx_user_data = s; t31_v21_rx(s); silence_gen_set(&(s->audio.modems.silence_gen), 0); s->audio.tx_handler = (span_tx_handler_t *) &silence_gen; s->audio.tx_user_data = &(s->audio.modems.silence_gen); } s->at_state.transmit = FALSE; break; case T31_CED_TONE: if (s->t38_mode) { t38_core_send_indicator(&s->t38_fe.t38, T38_IND_CED, INDICATOR_TX_COUNT); } else { silence_gen_alter(&(s->audio.modems.silence_gen), ms_to_samples(200)); make_tone_gen_descriptor(&tone_desc, 2100, -11, 0, 0, 2600, 75, 0, 0, FALSE); tone_gen_init(&(s->audio.modems.tone_gen), &tone_desc); s->audio.tx_handler = (span_tx_handler_t *) &silence_gen; s->audio.tx_user_data = &(s->audio.modems.silence_gen); s->audio.next_tx_handler = (span_tx_handler_t *) &tone_gen; s->audio.next_tx_user_data = &(s->audio.modems.tone_gen); } s->at_state.transmit = TRUE; break; case T31_V21_TX: if (s->t38_mode) { t38_core_send_indicator(&s->t38_fe.t38, T38_IND_V21_PREAMBLE, INDICATOR_TX_COUNT); } else { hdlc_tx_init(&(s->audio.modems.hdlc_tx), FALSE, 2, FALSE, hdlc_tx_underflow, s); /* The spec says 1s +-15% of preamble. So, the minimum is 32 octets. */ hdlc_tx_flags(&(s->audio.modems.hdlc_tx), 32); fsk_tx_init(&(s->audio.modems.v21_tx), &preset_fsk_specs[FSK_V21CH2], (get_bit_func_t) hdlc_tx_get_bit, &(s->audio.modems.hdlc_tx)); s->audio.tx_handler = (span_tx_handler_t *) &fsk_tx; s->audio.tx_user_data = &(s->audio.modems.v21_tx); s->audio.next_tx_handler = NULL; } s->hdlc_tx.final = FALSE; s->hdlc_tx.len = 0; s->dled = FALSE; s->at_state.transmit = TRUE; break; case T31_V21_RX: if (s->t38_mode) { } else { s->audio.rx_handler = (span_rx_handler_t *) &fsk_rx; s->audio.rx_user_data = &(s->audio.modems.v21_rx); t31_v21_rx(s); } break; case T31_V17_TX: if (s->t38_mode) { switch (s->bit_rate) { case 7200: ind = (s->short_train) ? T38_IND_V17_7200_SHORT_TRAINING : T38_IND_V17_7200_LONG_TRAINING; break; case 9600: ind = (s->short_train) ? T38_IND_V17_9600_SHORT_TRAINING : T38_IND_V17_9600_LONG_TRAINING; break; case 12000: ind = (s->short_train) ? T38_IND_V17_12000_SHORT_TRAINING : T38_IND_V17_12000_LONG_TRAINING; break; case 14400: default: ind = (s->short_train) ? T38_IND_V17_14400_SHORT_TRAINING : T38_IND_V17_14400_LONG_TRAINING; break; } t38_core_send_indicator(&s->t38_fe.t38, ind, INDICATOR_TX_COUNT); } else { v17_tx_restart(&(s->audio.modems.v17_tx), s->bit_rate, FALSE, s->short_train); s->audio.tx_handler = (span_tx_handler_t *) &v17_tx; s->audio.tx_user_data = &(s->audio.modems.v17_tx); s->audio.next_tx_handler = NULL; } s->tx.out_bytes = 0; s->tx.data_started = FALSE; s->at_state.transmit = TRUE; break; case T31_V17_RX: if (!s->t38_mode) { s->audio.rx_handler = (span_rx_handler_t *) &early_v17_rx; s->audio.rx_user_data = s; v17_rx_restart(&(s->audio.modems.v17_rx), s->bit_rate, s->short_train); /* Allow for +FCERROR/+FRH:3 */ t31_v21_rx(s); } s->at_state.transmit = FALSE; break; case T31_V27TER_TX: if (s->t38_mode) { switch (s->bit_rate) { case 2400: ind = T38_IND_V27TER_2400_TRAINING; break; case 4800: default: ind = T38_IND_V27TER_4800_TRAINING; break; } t38_core_send_indicator(&s->t38_fe.t38, ind, INDICATOR_TX_COUNT); } else { v27ter_tx_restart(&(s->audio.modems.v27ter_tx), s->bit_rate, FALSE); s->audio.tx_handler = (span_tx_handler_t *) &v27ter_tx; s->audio.tx_user_data = &(s->audio.modems.v27ter_tx); s->audio.next_tx_handler = NULL; } s->tx.out_bytes = 0; s->tx.data_started = FALSE; s->at_state.transmit = TRUE; break; case T31_V27TER_RX: if (!s->t38_mode) { s->audio.rx_handler = (span_rx_handler_t *) &early_v27ter_rx; s->audio.rx_user_data = s; v27ter_rx_restart(&(s->audio.modems.v27ter_rx), s->bit_rate, FALSE); /* Allow for +FCERROR/+FRH:3 */ t31_v21_rx(s); } s->at_state.transmit = FALSE; break; case T31_V29_TX: if (s->t38_mode) { switch (s->bit_rate) { case 7200: ind = T38_IND_V29_7200_TRAINING; break; case 9600: default: ind = T38_IND_V29_9600_TRAINING; break; } t38_core_send_indicator(&s->t38_fe.t38, ind, INDICATOR_TX_COUNT); } else { v29_tx_restart(&(s->audio.modems.v29_tx), s->bit_rate, FALSE); s->audio.tx_handler = (span_tx_handler_t *) &v29_tx; s->audio.tx_user_data = &(s->audio.modems.v29_tx); s->audio.next_tx_handler = NULL; } s->tx.out_bytes = 0; s->tx.data_started = FALSE; s->at_state.transmit = TRUE; break; case T31_V29_RX: if (!s->t38_mode) { s->audio.rx_handler = (span_rx_handler_t *) &early_v29_rx; s->audio.rx_user_data = s; v29_rx_restart(&(s->audio.modems.v29_rx), s->bit_rate, FALSE); /* Allow for +FCERROR/+FRH:3 */ t31_v21_rx(s); } s->at_state.transmit = FALSE; break; case T31_SILENCE_TX: if (s->t38_mode) { t38_core_send_indicator(&s->t38_fe.t38, T38_IND_NO_SIGNAL, INDICATOR_TX_COUNT); } else { silence_gen_set(&(s->audio.modems.silence_gen), 0); s->audio.tx_handler = (span_tx_handler_t *) &silence_gen; s->audio.tx_user_data = &(s->audio.modems.silence_gen); s->audio.next_tx_handler = NULL; } s->at_state.transmit = FALSE; break; case T31_SILENCE_RX: if (!s->t38_mode) { s->audio.rx_handler = (span_rx_handler_t *) &silence_rx; s->audio.rx_user_data = s; silence_gen_set(&(s->audio.modems.silence_gen), 0); s->audio.tx_handler = (span_tx_handler_t *) &silence_gen; s->audio.tx_user_data = &(s->audio.modems.silence_gen); s->audio.next_tx_handler = NULL; } s->at_state.transmit = FALSE; break; case T31_FLUSH: /* Send 200ms of silence to "push" the last audio out */ if (s->t38_mode) { t38_core_send_indicator(&s->t38_fe.t38, T38_IND_NO_SIGNAL, INDICATOR_TX_COUNT); } else { s->modem = T31_SILENCE_TX; silence_gen_alter(&(s->audio.modems.silence_gen), ms_to_samples(200)); s->audio.tx_handler = (span_tx_handler_t *) &silence_gen; s->audio.tx_user_data = &(s->audio.modems.silence_gen); s->audio.next_tx_handler = NULL; s->at_state.transmit = TRUE; } break; } s->audio.bit_no = 0; s->audio.current_byte = 0xFF; s->tx.in_bytes = 0; s->tx.out_bytes = 0; return 0; } /*- End of function --------------------------------------------------------*/ static __inline__ void dle_unstuff_hdlc(t31_state_t *s, const char *stuffed, int len) { int i; for (i = 0; i < len; i++) { if (s->dled) { s->dled = FALSE; if (stuffed[i] == ETX) { if (s->t38_mode) { } else { hdlc_tx_frame(&(s->audio.modems.hdlc_tx), s->hdlc_tx.buf, s->hdlc_tx.len); } s->hdlc_tx.final = (s->hdlc_tx.buf[1] & 0x10); s->hdlc_tx.len = 0; } else if (stuffed[i] == SUB) { s->hdlc_tx.buf[s->hdlc_tx.len++] = DLE; s->hdlc_tx.buf[s->hdlc_tx.len++] = DLE; } else { s->hdlc_tx.buf[s->hdlc_tx.len++] = stuffed[i]; } } else { if (stuffed[i] == DLE) s->dled = TRUE; else s->hdlc_tx.buf[s->hdlc_tx.len++] = stuffed[i]; } } } /*- End of function --------------------------------------------------------*/ static __inline__ void dle_unstuff(t31_state_t *s, const char *stuffed, int len) { int i; for (i = 0; i < len; i++) { if (s->dled) { s->dled = FALSE; if (stuffed[i] == ETX) { s->tx.final = TRUE; t31_set_at_rx_mode(s, AT_MODE_OFFHOOK_COMMAND); return; } } else if (stuffed[i] == DLE) { s->dled = TRUE; continue; } s->tx.data[s->tx.in_bytes++] = stuffed[i]; if (s->tx.in_bytes > T31_TX_BUF_LEN - 1) { /* Oops. We hit the end of the buffer. Give up. Loose stuff. :-( */ fprintf(stderr, "No room in buffer for new data!\n"); return; } } if (!s->tx.holding) { /* See if the buffer is approaching full. We might need to apply flow control. */ if (s->tx.in_bytes > T31_TX_BUF_LEN - 1024) { s->tx.holding = TRUE; /* Tell the application to hold further data */ at_modem_control(&s->at_state, AT_MODEM_CONTROL_CTS, (void *) 0); } } } /*- End of function --------------------------------------------------------*/ static int process_class1_cmd(at_state_t *t, void *user_data, int direction, int operation, int val) { int new_modem; int new_transmit; int i; int len; int immediate_response; t31_state_t *s; uint8_t msg[256]; s = (t31_state_t *) user_data; new_transmit = direction; immediate_response = TRUE; switch (operation) { case 'S': s->at_state.transmit = new_transmit; if (new_transmit) { /* Send a specified period of silence, to space transmissions. */ restart_modem(s, T31_SILENCE_TX); silence_gen_alter(&(s->audio.modems.silence_gen), ms_to_samples(val*10)); s->at_state.transmit = TRUE; } else { /* Wait until we have received a specified period of silence. */ queue_flush(s->rx_queue); s->silence_awaited = ms_to_samples(val*10); t31_set_at_rx_mode(s, AT_MODE_DELIVERY); restart_modem(s, T31_SILENCE_RX); } immediate_response = FALSE; span_log(&s->logging, SPAN_LOG_FLOW, "Silence %dms\n", val*10); break; case 'H': switch (val) { case 3: new_modem = (new_transmit) ? T31_V21_TX : T31_V21_RX; s->short_train = FALSE; s->bit_rate = 300; break; default: return -1; } span_log(&s->logging, SPAN_LOG_FLOW, "HDLC\n"); if (new_modem != s->modem) { restart_modem(s, new_modem); immediate_response = FALSE; } s->at_state.transmit = new_transmit; if (new_transmit) { t31_set_at_rx_mode(s, AT_MODE_HDLC); at_put_response_code(&s->at_state, AT_RESPONSE_CODE_CONNECT); } else { /* Send straight away, if there is something queued. */ t31_set_at_rx_mode(s, AT_MODE_DELIVERY); s->rx_message_received = FALSE; do { if (!queue_empty(s->rx_queue)) { len = queue_read_msg(s->rx_queue, msg, 256); if (len > 1) { if (msg[0] == AT_RESPONSE_CODE_OK) at_put_response_code(&s->at_state, AT_RESPONSE_CODE_CONNECT); for (i = 1; i < len; i++) { if (msg[i] == DLE) s->at_state.rx_data[s->at_state.rx_data_bytes++] = DLE; s->at_state.rx_data[s->at_state.rx_data_bytes++] = msg[i]; } s->at_state.rx_data[s->at_state.rx_data_bytes++] = DLE; s->at_state.rx_data[s->at_state.rx_data_bytes++] = ETX; s->at_state.at_tx_handler(&s->at_state, s->at_state.at_tx_user_data, s->at_state.rx_data, s->at_state.rx_data_bytes); s->at_state.rx_data_bytes = 0; } at_put_response_code(&s->at_state, msg[0]); } else { s->at_state.dte_is_waiting = TRUE; break; } } while (msg[0] == AT_RESPONSE_CODE_CONNECT); } immediate_response = FALSE; break; default: switch (val) { case 24: new_modem = (new_transmit) ? T31_V27TER_TX : T31_V27TER_RX; s->short_train = FALSE; s->bit_rate = 2400; break; case 48: new_modem = (new_transmit) ? T31_V27TER_TX : T31_V27TER_RX; s->short_train = FALSE; s->bit_rate = 4800; break; case 72: new_modem = (new_transmit) ? T31_V29_TX : T31_V29_RX; s->short_train = FALSE; s->bit_rate = 7200; break; case 96: new_modem = (new_transmit) ? T31_V29_TX : T31_V29_RX; s->short_train = FALSE; s->bit_rate = 9600; break; case 73: new_modem = (new_transmit) ? T31_V17_TX : T31_V17_RX; s->short_train = FALSE; s->bit_rate = 7200; break; case 74: new_modem = (new_transmit) ? T31_V17_TX : T31_V17_RX; s->short_train = TRUE; s->bit_rate = 7200; break; case 97: new_modem = (new_transmit) ? T31_V17_TX : T31_V17_RX; s->short_train = FALSE; s->bit_rate = 9600; break; case 98: new_modem = (new_transmit) ? T31_V17_TX : T31_V17_RX; s->short_train = TRUE; s->bit_rate = 9600; break; case 121: new_modem = (new_transmit) ? T31_V17_TX : T31_V17_RX; s->short_train = FALSE; s->bit_rate = 12000; break; case 122: new_modem = (new_transmit) ? T31_V17_TX : T31_V17_RX; s->short_train = TRUE; s->bit_rate = 12000; break; case 145: new_modem = (new_transmit) ? T31_V17_TX : T31_V17_RX; s->short_train = FALSE; s->bit_rate = 14400; break; case 146: new_modem = (new_transmit) ? T31_V17_TX : T31_V17_RX; s->short_train = TRUE; s->bit_rate = 14400; break; default: return -1; } span_log(&s->logging, SPAN_LOG_FLOW, "Short training = %d, bit rate = %d\n", s->short_train, s->bit_rate); if (new_transmit) { t31_set_at_rx_mode(s, AT_MODE_STUFFED); at_put_response_code(&s->at_state, AT_RESPONSE_CODE_CONNECT); } else { t31_set_at_rx_mode(s, AT_MODE_DELIVERY); } restart_modem(s, new_modem); immediate_response = FALSE; break; } return immediate_response; } /*- End of function --------------------------------------------------------*/ void t31_call_event(t31_state_t *s, int event) { span_log(&s->logging, SPAN_LOG_FLOW, "Call event %d received\n", event); at_call_event(&s->at_state, event); } /*- End of function --------------------------------------------------------*/ int t31_at_rx(t31_state_t *s, const char *t, int len) { if (s->dte_data_timeout) s->dte_data_timeout = s->call_samples + ms_to_samples(5000); switch (s->at_state.at_rx_mode) { case AT_MODE_ONHOOK_COMMAND: case AT_MODE_OFFHOOK_COMMAND: at_interpreter(&s->at_state, t, len); break; case AT_MODE_DELIVERY: /* Data from the DTE in this state returns us to command mode */ if (len) { if (s->at_state.rx_signal_present) { s->at_state.rx_data[s->at_state.rx_data_bytes++] = DLE; s->at_state.rx_data[s->at_state.rx_data_bytes++] = ETX; s->at_state.at_tx_handler(&s->at_state, s->at_state.at_tx_user_data, s->at_state.rx_data, s->at_state.rx_data_bytes); } s->at_state.rx_data_bytes = 0; s->at_state.transmit = FALSE; s->modem = T31_SILENCE_TX; s->audio.rx_handler = dummy_rx; t31_set_at_rx_mode(s, AT_MODE_OFFHOOK_COMMAND); at_put_response_code(&s->at_state, AT_RESPONSE_CODE_OK); } break; case AT_MODE_HDLC: dle_unstuff_hdlc(s, t, len); break; case AT_MODE_STUFFED: if (s->tx.out_bytes) { /* Make room for new data in existing data buffer. */ s->tx.in_bytes = &(s->tx.data[s->tx.in_bytes]) - &(s->tx.data[s->tx.out_bytes]); memmove(&(s->tx.data[0]), &(s->tx.data[s->tx.out_bytes]), s->tx.in_bytes); s->tx.out_bytes = 0; } dle_unstuff(s, t, len); break; } return len; } /*- End of function --------------------------------------------------------*/ static int dummy_rx(void *user_data, const int16_t amp[], int len) { return 0; } /*- End of function --------------------------------------------------------*/ static int silence_rx(void *user_data, const int16_t amp[], int len) { t31_state_t *s; /* Searching for a specified minimum period of silence. */ s = (t31_state_t *) user_data; if (s->silence_awaited && s->audio.silence_heard >= s->silence_awaited) { at_put_response_code(&s->at_state, AT_RESPONSE_CODE_OK); t31_set_at_rx_mode(s, AT_MODE_OFFHOOK_COMMAND); s->audio.silence_heard = 0; s->silence_awaited = 0; } return 0; } /*- End of function --------------------------------------------------------*/ static int cng_rx(void *user_data, const int16_t amp[], int len) { t31_state_t *s; s = (t31_state_t *) user_data; if (s->call_samples > ms_to_samples(s->at_state.p.s_regs[7]*1000)) { /* After calling, S7 has elapsed... no carrier found. */ at_put_response_code(&s->at_state, AT_RESPONSE_CODE_NO_CARRIER); restart_modem(s, T31_SILENCE_TX); at_modem_control(&s->at_state, AT_MODEM_CONTROL_HANGUP, NULL); t31_set_at_rx_mode(s, AT_MODE_ONHOOK_COMMAND); } else { fsk_rx(&(s->audio.modems.v21_rx), amp, len); } return 0; } /*- End of function --------------------------------------------------------*/ static int early_v17_rx(void *user_data, const int16_t amp[], int len) { t31_state_t *s; s = (t31_state_t *) user_data; v17_rx(&(s->audio.modems.v17_rx), amp, len); if (s->at_state.rx_trained) { /* The fast modem has trained, so we no longer need to run the slow one in parallel. */ span_log(&s->logging, SPAN_LOG_FLOW, "Switching from V.17 + V.21 to V.17 (%.2fdBm0)\n", v17_rx_signal_power(&(s->audio.modems.v17_rx))); s->audio.rx_handler = (span_rx_handler_t *) &v17_rx; s->audio.rx_user_data = &(s->audio.modems.v17_rx); } else { fsk_rx(&(s->audio.modems.v21_rx), amp, len); if (s->rx_message_received) { /* We have received something, and the fast modem has not trained. We must be receiving valid V.21 */ span_log(&s->logging, SPAN_LOG_FLOW, "Switching from V.17 + V.21 to V.21\n"); s->audio.rx_handler = (span_rx_handler_t *) &fsk_rx; s->audio.rx_user_data = &(s->audio.modems.v21_rx); } } return len; } /*- End of function --------------------------------------------------------*/ static int early_v27ter_rx(void *user_data, const int16_t amp[], int len) { t31_state_t *s; s = (t31_state_t *) user_data; v27ter_rx(&(s->audio.modems.v27ter_rx), amp, len); if (s->at_state.rx_trained) { /* The fast modem has trained, so we no longer need to run the slow one in parallel. */ span_log(&s->logging, SPAN_LOG_FLOW, "Switching from V.27ter + V.21 to V.27ter (%.2fdBm0)\n", v27ter_rx_signal_power(&(s->audio.modems.v27ter_rx))); s->audio.rx_handler = (span_rx_handler_t *) &v27ter_rx; s->audio.rx_user_data = &(s->audio.modems.v27ter_rx); } else { fsk_rx(&(s->audio.modems.v21_rx), amp, len); if (s->rx_message_received) { /* We have received something, and the fast modem has not trained. We must be receiving valid V.21 */ span_log(&s->logging, SPAN_LOG_FLOW, "Switching from V.27ter + V.21 to V.21\n"); s->audio.rx_handler = (span_rx_handler_t *) &fsk_rx; s->audio.rx_user_data = &(s->audio.modems.v21_rx); } } return len; } /*- End of function --------------------------------------------------------*/ static int early_v29_rx(void *user_data, const int16_t amp[], int len) { t31_state_t *s; s = (t31_state_t *) user_data; v29_rx(&(s->audio.modems.v29_rx), amp, len); if (s->at_state.rx_trained) { /* The fast modem has trained, so we no longer need to run the slow one in parallel. */ span_log(&s->logging, SPAN_LOG_FLOW, "Switching from V.29 + V.21 to V.29 (%.2fdBm0)\n", v29_rx_signal_power(&(s->audio.modems.v29_rx))); s->audio.rx_handler = (span_rx_handler_t *) &v29_rx; s->audio.rx_user_data = &(s->audio.modems.v29_rx); } else { fsk_rx(&(s->audio.modems.v21_rx), amp, len); if (s->rx_message_received) { /* We have received something, and the fast modem has not trained. We must be receiving valid V.21 */ span_log(&s->logging, SPAN_LOG_FLOW, "Switching from V.29 + V.21 to V.21\n"); s->audio.rx_handler = (span_rx_handler_t *) &fsk_rx; s->audio.rx_user_data = &(s->audio.modems.v21_rx); } } return len; } /*- End of function --------------------------------------------------------*/ int t31_rx(t31_state_t *s, int16_t amp[], int len) { int i; int32_t power; /* Monitor for received silence. Maximum needed detection is AT+FRS=255 (255*10ms). */ /* We could probably only run this loop if (s->modem == T31_SILENCE_RX), however, the spec says "when silence has been present on the line for the amount of time specified". That means some of the silence may have occurred before the AT+FRS=n command. This condition, however, is not likely to ever be the case. (AT+FRS=n will usually be issued before the remote goes silent.) */ for (i = 0; i < len; i++) { /* Clean up any DC influence. */ power = power_meter_update(&(s->audio.rx_power), amp[i] - s->audio.last_sample); s->audio.last_sample = amp[i]; if (power > s->audio.silence_threshold_power) { s->audio.silence_heard = 0; } else { if (s->audio.silence_heard <= ms_to_samples(255*10)) s->audio.silence_heard++; } } /* Time is determined by counting the samples in audio packets coming in. */ s->call_samples += len; /* In HDLC transmit mode, if 5 seconds elapse without data from the DTE we must treat this as an error. We return the result ERROR, and change to command-mode. */ if (s->dte_data_timeout && s->call_samples > s->dte_data_timeout) { t31_set_at_rx_mode(s, AT_MODE_OFFHOOK_COMMAND); at_put_response_code(&s->at_state, AT_RESPONSE_CODE_ERROR); restart_modem(s, T31_SILENCE_TX); } if (!s->at_state.transmit || s->modem == T31_CNG_TONE) s->audio.rx_handler(s->audio.rx_user_data, amp, len); return 0; } /*- End of function --------------------------------------------------------*/ static int set_next_tx_type(t31_state_t *s) { if (s->audio.next_tx_handler) { s->audio.tx_handler = s->audio.next_tx_handler; s->audio.tx_user_data = s->audio.next_tx_user_data; s->audio.next_tx_handler = NULL; return 0; } /* If there is nothing else to change to, so use zero length silence */ silence_gen_alter(&(s->audio.modems.silence_gen), 0); s->audio.tx_handler = (span_tx_handler_t *) &silence_gen; s->audio.tx_user_data = &(s->audio.modems.silence_gen); s->audio.next_tx_handler = NULL; return -1; } /*- End of function --------------------------------------------------------*/ int t31_tx(t31_state_t *s, int16_t amp[], int max_len) { int len; len = 0; if (s->at_state.transmit) { if ((len = s->audio.tx_handler(s->audio.tx_user_data, amp, max_len)) < max_len) { /* Allow for one change of tx handler within a block */ set_next_tx_type(s); if ((len += s->audio.tx_handler(s->audio.tx_user_data, amp + len, max_len - len)) < max_len) { switch (s->modem) { case T31_SILENCE_TX: s->modem = T31_NONE; at_put_response_code(&s->at_state, AT_RESPONSE_CODE_OK); if (s->at_state.do_hangup) { at_modem_control(&s->at_state, AT_MODEM_CONTROL_HANGUP, NULL); t31_set_at_rx_mode(s, AT_MODE_ONHOOK_COMMAND); s->at_state.do_hangup = FALSE; } else { t31_set_at_rx_mode(s, AT_MODE_OFFHOOK_COMMAND); } break; case T31_CED_TONE: /* Go directly to V.21/HDLC transmit. */ s->modem = T31_NONE; restart_modem(s, T31_V21_TX); t31_set_at_rx_mode(s, AT_MODE_HDLC); break; case T31_V21_TX: case T31_V17_TX: case T31_V27TER_TX: case T31_V29_TX: s->modem = T31_NONE; at_put_response_code(&s->at_state, AT_RESPONSE_CODE_OK); t31_set_at_rx_mode(s, AT_MODE_OFFHOOK_COMMAND); restart_modem(s, T31_SILENCE_TX); break; } } } } if (s->audio.transmit_on_idle) { /* Pad to the requested length with silence */ memset(amp, 0, max_len*sizeof(int16_t)); len = max_len; } return len; } /*- End of function --------------------------------------------------------*/ void t31_set_transmit_on_idle(t31_state_t *s, int transmit_on_idle) { s->audio.transmit_on_idle = transmit_on_idle; } /*- End of function --------------------------------------------------------*/ void t31_set_tep_mode(t31_state_t *s, int use_tep) { s->audio.use_tep = use_tep; } /*- End of function --------------------------------------------------------*/ void t31_set_t38_config(t31_state_t *s, int without_pacing) { if (without_pacing) { /* Continuous streaming mode, as used for TPKT over TCP transport */ s->t38_fe.t38.indicator_tx_count = 0; s->t38_fe.t38.data_end_tx_count = 1; s->t38_fe.ms_per_tx_chunk = 0; } else { /* Paced streaming mode, as used for UDP transports */ s->t38_fe.t38.indicator_tx_count = INDICATOR_TX_COUNT; s->t38_fe.t38.data_end_tx_count = DATA_END_TX_COUNT; s->t38_fe.ms_per_tx_chunk = MS_PER_TX_CHUNK; } } /*- End of function --------------------------------------------------------*/ t31_state_t *t31_init(t31_state_t *s, at_tx_handler_t *at_tx_handler, void *at_tx_user_data, t31_modem_control_handler_t *modem_control_handler, void *modem_control_user_data, t38_tx_packet_handler_t *tx_t38_packet_handler, void *tx_t38_packet_user_data) { int alloced; if (at_tx_handler == NULL || modem_control_handler == NULL) return NULL; alloced = FALSE; if (s == NULL) { if ((s = (t31_state_t *) malloc(sizeof (*s))) == NULL) return NULL; alloced = TRUE; } memset(s, 0, sizeof(*s)); span_log_init(&s->logging, SPAN_LOG_NONE, NULL); span_log_set_protocol(&s->logging, "T.31"); s->modem_control_handler = modem_control_handler; s->modem_control_user_data = modem_control_user_data; v17_rx_init(&(s->audio.modems.v17_rx), 14400, non_ecm_put_bit, s); v17_tx_init(&(s->audio.modems.v17_tx), 14400, FALSE, non_ecm_get_bit, s); v29_rx_init(&(s->audio.modems.v29_rx), 9600, non_ecm_put_bit, s); v29_rx_signal_cutoff(&(s->audio.modems.v29_rx), -45.5); v29_tx_init(&(s->audio.modems.v29_tx), 9600, FALSE, non_ecm_get_bit, s); v27ter_rx_init(&(s->audio.modems.v27ter_rx), 4800, non_ecm_put_bit, s); v27ter_tx_init(&(s->audio.modems.v27ter_tx), 4800, FALSE, non_ecm_get_bit, s); silence_gen_init(&(s->audio.modems.silence_gen), 0); power_meter_init(&(s->audio.rx_power), 4); s->audio.last_sample = 0; s->audio.silence_threshold_power = power_meter_level_dbm0(-36); s->at_state.rx_signal_present = FALSE; s->at_state.rx_trained = FALSE; s->at_state.do_hangup = FALSE; s->at_state.line_ptr = 0; s->audio.silence_heard = 0; s->silence_awaited = 0; s->call_samples = 0; s->modem = T31_NONE; s->at_state.transmit = TRUE; s->audio.rx_handler = dummy_rx; s->audio.rx_user_data = NULL; s->audio.tx_handler = (span_tx_handler_t *) &silence_gen; s->audio.tx_user_data = &(s->audio.modems.silence_gen); if ((s->rx_queue = queue_init(NULL, 4096, QUEUE_WRITE_ATOMIC | QUEUE_READ_ATOMIC)) == NULL) { if (alloced) free(s); return NULL; } at_init(&s->at_state, at_tx_handler, at_tx_user_data, t31_modem_control_handler, s); at_set_class1_handler(&s->at_state, process_class1_cmd, s); s->at_state.dte_inactivity_timeout = DEFAULT_DTE_TIMEOUT; if (tx_t38_packet_handler) { t38_core_init(&s->t38_fe.t38, process_rx_indicator, process_rx_data, process_rx_missing, (void *) s, tx_t38_packet_handler, tx_t38_packet_user_data); t31_set_t38_config(s, FALSE); } s->t38_mode = FALSE; return s; } /*- End of function --------------------------------------------------------*/ int t31_release(t31_state_t *s) { at_reset_call_info(&s->at_state); free(s); return 0; } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/gsm0610_lpc.c0000644000175000017500000003452311150047216017763 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * gsm0610_lpc.c - GSM 06.10 full rate speech codec. * * Written by Steve Underwood * * Copyright (C) 2006 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * This code is based on the widely used GSM 06.10 code available from * http://kbs.cs.tu-berlin.de/~jutta/toast.html * * $Id: gsm0610_lpc.c,v 1.20 2008/07/02 14:48:25 steveu Exp $ */ /*! \file */ #if defined(HAVE_CONFIG_H) #include #endif #include #include #include "floating_fudge.h" #if defined(HAVE_TGMATH_H) #include #endif #if defined(HAVE_MATH_H) #include #endif #include #include "spandsp/telephony.h" #include "spandsp/bitstream.h" #include "spandsp/bit_operations.h" #include "spandsp/dc_restore.h" #include "spandsp/vector_int.h" #include "spandsp/gsm0610.h" #include "gsm0610_local.h" /* 4.2.4 .. 4.2.7 LPC ANALYSIS SECTION */ /* The number of left shifts needed to normalize the 32 bit variable x for positive values on the interval with minimum of minimum of 1073741824 (01000000000000000000000000000000) and maximum of 2147483647 (01111111111111111111111111111111) and for negative values on the interval with minimum of -2147483648 (-10000000000000000000000000000000) and maximum of -1073741824 ( -1000000000000000000000000000000). In order to normalize the result, the following operation must be done: norm_var1 = x << gsm0610_norm(x); (That's 'ffs', only from the left, not the right..) */ int16_t gsm0610_norm(int32_t x) { assert(x != 0); if (x < 0) { if (x <= -1073741824) return 0; /*endif*/ x = ~x; } /*endif*/ return (int16_t) (30 - top_bit(x)); } /*- End of function --------------------------------------------------------*/ /* (From p. 46, end of section 4.2.5) NOTE: The following lines gives [sic] one correct implementation of the div(num, denum) arithmetic operation. Compute div which is the integer division of num by denom: with denom >= num > 0 */ static int16_t gsm_div(int16_t num, int16_t denom) { int32_t num32; int32_t denom32; int16_t div; int k; /* The parameter num sometimes becomes zero. Although this is explicitly guarded against in 4.2.5, we assume that the result should then be zero as well. */ assert(num >= 0 && denom >= num); if (num == 0) return 0; /*endif*/ num32 = num; denom32 = denom; div = 0; k = 15; while (k--) { div <<= 1; num32 <<= 1; if (num32 >= denom32) { num32 -= denom32; div++; } /*endif*/ } /*endwhile*/ return div; } /*- End of function --------------------------------------------------------*/ #if defined(__GNUC__) && defined(__i386__) void gsm0610_vec_vsraw(const int16_t *p, int n, int bits) { static const int64_t ones = 0x0001000100010001LL; if (n == 0) return; /*endif*/ __asm__ __volatile__( " leal -16(%%esi,%%eax,2),%%edx;\n" /* edx = top - 16 */ " emms;\n" " movd %%ecx,%%mm3;\n" " movq %[ones],%%mm2;\n" " psllw %%mm3,%%mm2;\n" " psrlw $1,%%mm2;\n" " cmpl %%edx,%%esi;" " ja 4f;\n" " .p2align 2;\n" /* 8 words per iteration */ "6:\n" " movq (%%esi),%%mm0;\n" " movq 8(%%esi),%%mm1;\n" " paddsw %%mm2,%%mm0;\n" " psraw %%mm3,%%mm0;\n" " paddsw %%mm2,%%mm1;\n" " psraw %%mm3,%%mm1;\n" " movq %%mm0,(%%esi);\n" " movq %%mm1,8(%%esi);\n" " addl $16,%%esi;\n" " cmpl %%edx,%%esi;\n" " jbe 6b;\n" " .p2align 2;\n" "4:\n" " addl $12,%%edx;\n" /* now edx = top-4 */ " cmpl %%edx,%%esi;\n" " ja 3f;\n" " .p2align 2;\n" /* do up to 6 words, two per iteration */ "5:\n" " movd (%%esi),%%mm0;\n" " paddsw %%mm2,%%mm0;\n" " psraw %%mm3,%%mm0;\n" " movd %%mm0,(%%esi);\n" " addl $4,%%esi;\n" " cmpl %%edx,%%esi;\n" " jbe 5b;\n" " .p2align 2;\n" "3:\n" " addl $2,%%edx;\n" /* now edx = top-2 */ " cmpl %%edx,%%esi;\n" " ja 2f;\n" " movzwl (%%esi),%%eax;\n" " movd %%eax,%%mm0;\n" " paddsw %%mm2,%%mm0;\n" " psraw %%mm3,%%mm0;\n" " movd %%mm0,%%eax;\n" " movw %%ax,(%%esi);\n" " .p2align 2;\n" "2:\n" " emms;\n" : : "S" (p), "a" (n), "c" (bits), [ones] "m" (ones) : "edx" ); } /*- End of function --------------------------------------------------------*/ #endif /* 4.2.4 */ static void autocorrelation(int16_t amp[GSM0610_FRAME_LEN], int32_t L_ACF[9]) { int k; int16_t smax; int16_t scalauto; #if !(defined(__GNUC__) && defined(__i386__)) int i; int temp; int16_t *sp; int16_t sl; #endif /* The goal is to compute the array L_ACF[k]. The signal s[i] must be scaled in order to avoid an overflow situation. */ /* Dynamic scaling of the array s[0..159] */ /* Search for the maximum. */ #if defined(__GNUC__) && defined(__i386__) smax = saturate(vec_min_maxi16(amp, GSM0610_FRAME_LEN, NULL)); #else for (smax = 0, k = 0; k < GSM0610_FRAME_LEN; k++) { temp = gsm_abs(amp[k]); if (temp > smax) smax = (int16_t) temp; /*endif*/ } /*endfor*/ #endif /* Computation of the scaling factor. */ if (smax == 0) { scalauto = 0; } else { assert(smax > 0); scalauto = (int16_t) (4 - gsm0610_norm((int32_t) smax << 16)); } /*endif*/ /* Scaling of the array s[0...159] */ #if defined(__GNUC__) && defined(__i386__) if (scalauto > 0) gsm0610_vec_vsraw(amp, GSM0610_FRAME_LEN, scalauto); /*endif*/ #else if (scalauto > 0) { for (k = 0; k < GSM0610_FRAME_LEN; k++) amp[k] = gsm_mult_r(amp[k], 16384 >> (scalauto - 1)); /*endfor*/ } /*endif*/ #endif /* Compute the L_ACF[..]. */ #if defined(__GNUC__) && defined(__i386__) for (k = 0; k < 9; k++) L_ACF[k] = vec_dot_prodi16(amp, amp + k, GSM0610_FRAME_LEN - k) << 1; /*endfor*/ #else sp = amp; sl = *sp; L_ACF[0] = ((int32_t) sl*sp[0]); sl = *++sp; L_ACF[0] += ((int32_t) sl*sp[0]); L_ACF[1] = ((int32_t) sl*sp[-1]); sl = *++sp; L_ACF[0] += ((int32_t) sl*sp[0]); L_ACF[1] += ((int32_t) sl*sp[-1]); L_ACF[2] = ((int32_t) sl*sp[-2]); sl = *++sp; L_ACF[0] += ((int32_t) sl*sp[0]); L_ACF[1] += ((int32_t) sl*sp[-1]); L_ACF[2] += ((int32_t) sl*sp[-2]); L_ACF[3] = ((int32_t) sl*sp[-3]); sl = *++sp; L_ACF[0] += ((int32_t) sl*sp[0]); L_ACF[1] += ((int32_t) sl*sp[-1]); L_ACF[2] += ((int32_t) sl*sp[-2]); L_ACF[3] += ((int32_t) sl*sp[-3]); L_ACF[4] = ((int32_t) sl*sp[-4]); sl = *++sp; L_ACF[0] += ((int32_t) sl*sp[0]); L_ACF[1] += ((int32_t) sl*sp[-1]); L_ACF[2] += ((int32_t) sl*sp[-2]); L_ACF[3] += ((int32_t) sl*sp[-3]); L_ACF[4] += ((int32_t) sl*sp[-4]); L_ACF[5] = ((int32_t) sl*sp[-5]); sl = *++sp; L_ACF[0] += ((int32_t) sl*sp[0]); L_ACF[1] += ((int32_t) sl*sp[-1]); L_ACF[2] += ((int32_t) sl*sp[-2]); L_ACF[3] += ((int32_t) sl*sp[-3]); L_ACF[4] += ((int32_t) sl*sp[-4]); L_ACF[5] += ((int32_t) sl*sp[-5]); L_ACF[6] = ((int32_t) sl*sp[-6]); sl = *++sp; L_ACF[0] += ((int32_t) sl*sp[0]); L_ACF[1] += ((int32_t) sl*sp[-1]); L_ACF[2] += ((int32_t) sl*sp[-2]); L_ACF[3] += ((int32_t) sl*sp[-3]); L_ACF[4] += ((int32_t) sl*sp[-4]); L_ACF[5] += ((int32_t) sl*sp[-5]); L_ACF[6] += ((int32_t) sl*sp[-6]); L_ACF[7] = ((int32_t) sl*sp[-7]); sl = *++sp; L_ACF[0] += ((int32_t) sl*sp[0]); L_ACF[1] += ((int32_t) sl*sp[-1]); L_ACF[2] += ((int32_t) sl*sp[-2]); L_ACF[3] += ((int32_t) sl*sp[-3]); L_ACF[4] += ((int32_t) sl*sp[-4]); L_ACF[5] += ((int32_t) sl*sp[-5]); L_ACF[6] += ((int32_t) sl*sp[-6]); L_ACF[7] += ((int32_t) sl*sp[-7]); L_ACF[8] = ((int32_t) sl*sp[-8]); for (i = 9; i < GSM0610_FRAME_LEN; i++) { sl = *++sp; L_ACF[0] += ((int32_t) sl*sp[0]); L_ACF[1] += ((int32_t) sl*sp[-1]); L_ACF[2] += ((int32_t) sl*sp[-2]); L_ACF[3] += ((int32_t) sl*sp[-3]); L_ACF[4] += ((int32_t) sl*sp[-4]); L_ACF[5] += ((int32_t) sl*sp[-5]); L_ACF[6] += ((int32_t) sl*sp[-6]); L_ACF[7] += ((int32_t) sl*sp[-7]); L_ACF[8] += ((int32_t) sl*sp[-8]); } /*endfor*/ for (k = 0; k < 9; k++) L_ACF[k] <<= 1; /*endfor*/ #endif /* Rescaling of the array s[0..159] */ if (scalauto > 0) { assert(scalauto <= 4); for (k = 0; k < GSM0610_FRAME_LEN; k++) amp[k] <<= scalauto; /*endfor*/ } /*endif*/ } /*- End of function --------------------------------------------------------*/ /* 4.2.5 */ static void reflection_coefficients(int32_t L_ACF[9], int16_t r[8]) { int i; int m; int n; int16_t temp; int16_t ACF[9]; int16_t P[9]; int16_t K[9]; /* Schur recursion with 16 bits arithmetic. */ if (L_ACF[0] == 0) { for (i = 8; i--; *r++ = 0) ; /*endfor*/ return; } /*endif*/ assert(L_ACF[0] != 0); temp = gsm0610_norm(L_ACF[0]); assert(temp >= 0 && temp < 32); /* ? overflow ? */ for (i = 0; i <= 8; i++) ACF[i] = (int16_t) ((L_ACF[i] << temp) >> 16); /*endfor*/ /* Initialize array P[..] and K[..] for the recursion. */ for (i = 1; i <= 7; i++) K[i] = ACF[i]; /*endfor*/ for (i = 0; i <= 8; i++) P[i] = ACF[i]; /*endfor*/ /* Compute reflection coefficients */ for (n = 1; n <= 8; n++, r++) { temp = P[1]; temp = gsm_abs (temp); if (P[0] < temp) { for (i = n; i <= 8; i++) *r++ = 0; /*endfor*/ return; } /*endif*/ *r = gsm_div(temp, P[0]); assert(*r >= 0); if (P[1] > 0) *r = -*r; /* r[n] = sub(0, r[n]) */ /*endif*/ assert(*r != INT16_MIN); if (n == 8) return; /*endif*/ /* Schur recursion */ temp = gsm_mult_r(P[1], *r); P[0] = gsm_add(P[0], temp); for (m = 1; m <= 8 - n; m++) { temp = gsm_mult_r(K[m], *r); P[m] = gsm_add(P[m + 1], temp); temp = gsm_mult_r(P[m + 1], *r); K[m] = gsm_add(K[m], temp); } /*endfor*/ } /*endfor*/ } /*- End of function --------------------------------------------------------*/ /* 4.2.6 */ static void transform_to_log_area_ratios(int16_t r[8]) { int16_t temp; int i; /* The following scaling for r[..] and LAR[..] has been used: r[..] = integer (real_r[..]*32768.); -1 <= real_r < 1. LAR[..] = integer (real_LAR[..] * 16384); with -1.625 <= real_LAR <= 1.625 */ /* Computation of the LAR[0..7] from the r[0..7] */ for (i = 1; i <= 8; i++, r++) { temp = *r; temp = gsm_abs(temp); assert(temp >= 0); if (temp < 22118) { temp >>= 1; } else if (temp < 31130) { assert(temp >= 11059); temp -= 11059; } else { assert(temp >= 26112); temp -= 26112; temp <<= 2; } /*endif*/ *r = (*r < 0) ? -temp : temp; assert(*r != INT16_MIN); } /*endfor*/ } /*- End of function --------------------------------------------------------*/ /* 4.2.7 */ static void quantization_and_coding(int16_t LAR[8]) { int16_t temp; /* This procedure needs four tables; the following equations give the optimum scaling for the constants: A[0..7] = integer(real_A[0..7] * 1024) B[0..7] = integer(real_B[0..7] * 512) MAC[0..7] = maximum of the LARc[0..7] MIC[0..7] = minimum of the LARc[0..7] */ #undef STEP #define STEP(A,B,MAC,MIC) \ temp = gsm_mult(A, *LAR); \ temp = gsm_add(temp, B); \ temp = gsm_add(temp, 256); \ temp >>= 9; \ *LAR = (int16_t) ((temp > MAC) \ ? \ MAC - MIC \ : \ ((temp < MIC) ? 0 : temp - MIC)); \ LAR++; STEP(20480, 0, 31, -32); STEP(20480, 0, 31, -32); STEP(20480, 2048, 15, -16); STEP(20480, -2560, 15, -16); STEP(13964, 94, 7, -8); STEP(15360, -1792, 7, -8); STEP( 8534, -341, 3, -4); STEP( 9036, -1144, 3, -4); #undef STEP } /*- End of function --------------------------------------------------------*/ void gsm0610_lpc_analysis(gsm0610_state_t *s, int16_t amp[GSM0610_FRAME_LEN], int16_t LARc[8]) { int32_t L_ACF[9]; autocorrelation(amp, L_ACF); reflection_coefficients(L_ACF, LARc); transform_to_log_area_ratios(LARc); quantization_and_coding(LARc); } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/v8.c0000644000175000017500000006261611150047216016371 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * v8.c - V.8 modem negotiation processing. * * Written by Steve Underwood * * Copyright (C) 2004 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: v8.c,v 1.30 2008/07/02 14:48:26 steveu Exp $ */ /*! \file */ #if defined(HAVE_CONFIG_H) #include #endif #include #include #include #include #include "floating_fudge.h" #if defined(HAVE_TGMATH_H) #include #endif #if defined(HAVE_MATH_H) #include #endif #include "spandsp/telephony.h" #include "spandsp/logging.h" #include "spandsp/queue.h" #include "spandsp/async.h" #include "spandsp/complex.h" #include "spandsp/dds.h" #include "spandsp/tone_detect.h" #include "spandsp/tone_generate.h" #include "spandsp/super_tone_rx.h" #include "spandsp/power_meter.h" #include "spandsp/fsk.h" #include "spandsp/modem_connect_tones.h" #include "spandsp/v8.h" #define ms_to_samples(t) (((t)*SAMPLE_RATE)/1000) enum { V8_WAIT_1S, V8_CI, V8_CI_ON, V8_CI_OFF, V8_HEARD_ANSAM, V8_CM_ON, V8_CJ_ON, V8_CM_WAIT, V8_SIGC, V8_WAIT_200MS, V8_JM_ON, V8_SIGA, V8_PARKED } v8_states_e; enum { V8_SYNC_UNKNOWN = 0, V8_SYNC_CI, V8_SYNC_CM_JM, V8_SYNC_V92 } v8_sync_types_e; const char *v8_call_function_to_str(int call_function) { switch (call_function) { case V8_CALL_TBS: return "TBS"; case V8_CALL_H324: return "H.324 PSTN multimedia terminal"; case V8_CALL_V18: return "V.18 textphone"; case V8_CALL_T101: return "T.101 videotext"; case V8_CALL_T30_TX: return "T.30 Tx FAX"; case V8_CALL_T30_RX: return "T.30 Rx FAX"; case V8_CALL_V_SERIES: return "V series modem data"; case V8_CALL_FUNCTION_EXTENSION: return "Call function is in extention octet"; } return "???"; } /*- End of function --------------------------------------------------------*/ const char *v8_modulation_to_str(int modulation_scheme) { switch (modulation_scheme) { case V8_MOD_V17: return "V.17 half-duplex"; case V8_MOD_V21: return "V.21 duplex"; case V8_MOD_V22: return "V.22/V22.bis duplex"; case V8_MOD_V23HALF: return "V.23 half-duplex"; case V8_MOD_V23: return "V.23 duplex"; case V8_MOD_V26BIS: return "V.23 duplex"; case V8_MOD_V26TER: return "V.23 duplex"; case V8_MOD_V27TER: return "V.23 duplex"; case V8_MOD_V29: return "V.29 half-duplex"; case V8_MOD_V32: return "V.32/V32.bis duplex"; case V8_MOD_V34HALF: return "V.34 half-duplex"; case V8_MOD_V34: return "V.34 duplex"; case V8_MOD_V90: return "V.90 duplex"; case V8_MOD_V92: return "V.92 duplex"; case V8_MOD_FAILED: return "negotiation failed"; } return "???"; } /*- End of function --------------------------------------------------------*/ const char *v8_protocol_to_str(int protocol) { switch (protocol) { case V8_PROTOCOL_NONE: return "None"; case V8_PROTOCOL_LAPM_V42: return "LAPM"; case V8_PROTOCOL_EXTENSION: return "Extension"; } return "Undefined"; } /*- End of function --------------------------------------------------------*/ const char *v8_pstn_access_to_str(int pstn_access) { return "???"; } /*- End of function --------------------------------------------------------*/ const char *v8_pcm_modem_availability_to_str(int pcm_modem_availability) { return "???"; } /*- End of function --------------------------------------------------------*/ void v8_log_supported_modulations(v8_state_t *s, int modulation_schemes) { const char *comma; int i; comma = ""; span_log(&s->logging, SPAN_LOG_FLOW, ""); for (i = 0; i < 32; i++) { if ((modulation_schemes & (1 << i))) { span_log(&s->logging, SPAN_LOG_FLOW | SPAN_LOG_SUPPRESS_LABELLING, "%s%s", comma, v8_modulation_to_str(modulation_schemes & (1 << i))); comma = ", "; } } span_log(&s->logging, SPAN_LOG_FLOW | SPAN_LOG_SUPPRESS_LABELLING, " supported\n"); } /*- End of function --------------------------------------------------------*/ static const uint8_t *process_call_function(v8_state_t *s, const uint8_t *p) { int call_function; call_function = (*p >> 5) & 0x07; span_log(&s->logging, SPAN_LOG_FLOW, "%s\n", v8_call_function_to_str(call_function)); s->call_function = call_function; return ++p; } /*- End of function --------------------------------------------------------*/ static const uint8_t *process_modulation_mode(v8_state_t *s, const uint8_t *p) { int far_end_modulations; /* Modulation mode octet */ far_end_modulations = 0; if (*p & 0x80) far_end_modulations |= V8_MOD_V34HALF; if (*p & 0x40) far_end_modulations |= V8_MOD_V34; if (*p & 0x20) far_end_modulations |= V8_MOD_V90; if ((*++p & 0x38) == 0x10) { if (*p & 0x80) far_end_modulations |= V8_MOD_V27TER; if (*p & 0x40) far_end_modulations |= V8_MOD_V29; if (*p & 0x04) far_end_modulations |= V8_MOD_V17; if (*p & 0x02) far_end_modulations |= V8_MOD_V22; if (*p & 0x01) far_end_modulations |= V8_MOD_V32; if ((*++p & 0x38) == 0x10) { if (*p & 0x80) far_end_modulations |= V8_MOD_V21; if (*p & 0x40) far_end_modulations |= V8_MOD_V23HALF; if (*p & 0x04) far_end_modulations |= V8_MOD_V23; if (*p & 0x02) far_end_modulations |= V8_MOD_V26BIS; if (*p & 0x01) far_end_modulations |= V8_MOD_V26TER; /* Skip any future extensions we do not understand */ while ((*++p & 0x38) == 0x10) /* dummy loop */; } } s->far_end_modulations = far_end_modulations; v8_log_supported_modulations(s, s->far_end_modulations); return ++p; } /*- End of function --------------------------------------------------------*/ static const uint8_t *process_protocols(v8_state_t *s, const uint8_t *p) { int protocol; protocol = (*p >> 5) & 0x07; span_log(&s->logging, SPAN_LOG_FLOW, "%s\n", v8_protocol_to_str(protocol)); s->protocol = protocol; return ++p; } /*- End of function --------------------------------------------------------*/ static const uint8_t *process_pstn_access(v8_state_t *s, const uint8_t *p) { int pstn_access; pstn_access = (*p >> 5) & 0x07; if (pstn_access & V8_PSTN_ACCESS_DCE_ON_DIGTIAL) span_log(&s->logging, SPAN_LOG_FLOW, "DCE on digital network connection\n"); else span_log(&s->logging, SPAN_LOG_FLOW, "DCE on analogue network connection\n"); if (pstn_access & V8_PSTN_ACCESS_ANSWER_DCE_CELLULAR) span_log(&s->logging, SPAN_LOG_FLOW, "Answer DCE on cellular connection\n"); if (pstn_access & V8_PSTN_ACCESS_CALL_DCE_CELLULAR) span_log(&s->logging, SPAN_LOG_FLOW, "Call DCE on cellular connection\n"); return ++p; } /*- End of function --------------------------------------------------------*/ static const uint8_t *process_non_standard_facilities(v8_state_t *s, const uint8_t *p) { ++p; p += *p; return p; } /*- End of function --------------------------------------------------------*/ static const uint8_t *process_pcm_modem_availability(v8_state_t *s, const uint8_t *p) { int pcm_availability; pcm_availability = (*p >> 5) & 0x07; if (pcm_availability & V8_PSTN_PCM_MODEM_V91) span_log(&s->logging, SPAN_LOG_FLOW, "V.91 available\n"); if (pcm_availability & V8_PSTN_PCM_MODEM_V90_V92_DIGITAL) span_log(&s->logging, SPAN_LOG_FLOW, "V.90 or V.92 digital modem available\n"); if (pcm_availability & V8_PSTN_PCM_MODEM_V90_V92_ANALOGUE) span_log(&s->logging, SPAN_LOG_FLOW, "V.90 or V.92 analogue modem available\n"); return ++p; } /*- End of function --------------------------------------------------------*/ static const uint8_t *process_t66(v8_state_t *s, const uint8_t *p) { return ++p; } /*- End of function --------------------------------------------------------*/ static void ci_decode(v8_state_t *s) { if ((s->rx_data[0] & 0x1F) == 0x01) process_call_function(s, &s->rx_data[0]); } /*- End of function --------------------------------------------------------*/ static void cm_jm_decode(v8_state_t *s) { const uint8_t *p; if (s->got_cm_jm) return; /* We must receive two consecutive identical CM or JM sequences to accept it. */ if (s->cm_jm_count <= 0 || s->cm_jm_count != s->rx_data_ptr || memcmp(s->cm_jm_data, s->rx_data, s->rx_data_ptr)) { /* Save the current CM or JM sequence */ s->cm_jm_count = s->rx_data_ptr; memcpy(s->cm_jm_data, s->rx_data, s->rx_data_ptr); return; } /* We have a pair of matching CMs or JMs */ s->got_cm_jm = TRUE; span_log(&s->logging, SPAN_LOG_FLOW, "Decoding\n"); /* Zero indicates the end */ s->cm_jm_data[s->cm_jm_count] = 0; s->far_end_modulations = 0; p = s->cm_jm_data; while (*p) { switch (*p & 0x1F) { case 0x01: p = process_call_function(s, p); break; case 0x05: p = process_modulation_mode(s, p); break; case 0x0A: p = process_protocols(s, p); break; case 0x0D: p = process_pstn_access(s, p); break; case 0x0F: p = process_non_standard_facilities(s, p); break; case 0x07: p = process_pcm_modem_availability(s, p); break; case 0x0E: p = process_t66(s, p); break; default: p++; break; } } } /*- End of function --------------------------------------------------------*/ static void put_bit(void *user_data, int bit) { v8_state_t *s; int new_preamble_type; const char *tag; uint8_t data; s = user_data; if (bit < 0) { /* Special conditions */ switch (bit) { case PUTBIT_CARRIER_UP: case PUTBIT_CARRIER_DOWN: case PUTBIT_TRAINING_SUCCEEDED: case PUTBIT_TRAINING_FAILED: break; default: break; } return; } /* Wait until we sync. */ s->bit_stream = (s->bit_stream >> 1) | (bit << 19); if (s->bit_stream == 0x803FF) new_preamble_type = V8_SYNC_CI; else if (s->bit_stream == 0xF03FF) new_preamble_type = V8_SYNC_CM_JM; else if (s->bit_stream == 0xAABFF) new_preamble_type = V8_SYNC_V92; else new_preamble_type = V8_SYNC_UNKNOWN; if (new_preamble_type) { /* Debug */ if (span_log_test(&s->logging, SPAN_LOG_FLOW)) { if (s->preamble_type == V8_SYNC_CI) { tag = "CI: "; } else if (s->preamble_type == V8_SYNC_CM_JM) { if (s->caller) tag = "JM: "; else tag = "CM: "; } else if (s->preamble_type == V8_SYNC_V92) { tag = "V92: "; } else { tag = "??: "; } span_log_buf(&s->logging, SPAN_LOG_FLOW, tag, s->rx_data, s->rx_data_ptr); } /* Decode previous sequence */ switch (s->preamble_type) { case V8_SYNC_CI: ci_decode(s); break; case V8_SYNC_CM_JM: cm_jm_decode(s); break; } s->preamble_type = new_preamble_type; s->bit_cnt = 0; s->rx_data_ptr = 0; } /* Parse octets with 1 bit start, 1 bit stop */ if (s->preamble_type) { s->bit_cnt++; /* Start, stop? */ if ((s->bit_stream & 0x80400) == 0x80000 && s->bit_cnt >= 10) { /* Store the available data */ data = (uint8_t) ((s->bit_stream >> 11) & 0xFF); /* CJ detection */ if (data == 0) { if (++s->zero_byte_count == 3) s->got_cj = TRUE; } else { s->zero_byte_count = 0; } if (s->rx_data_ptr < (int) (sizeof(s->rx_data) - 1)) s->rx_data[s->rx_data_ptr++] = data; s->bit_cnt = 0; } } } /*- End of function --------------------------------------------------------*/ static void v8_decode_init(v8_state_t *s) { if (s->caller) fsk_rx_init(&s->v21rx, &preset_fsk_specs[FSK_V21CH2], FALSE, put_bit, s); else fsk_rx_init(&s->v21rx, &preset_fsk_specs[FSK_V21CH1], FALSE, put_bit, s); s->preamble_type = 0; s->bit_stream = 0; s->cm_jm_count = 0; s->got_cm_jm = FALSE; s->got_cj = FALSE; s->zero_byte_count = 0; s->rx_data_ptr = 0; } /*- End of function --------------------------------------------------------*/ static int get_bit(void *user_data) { v8_state_t *s; uint8_t bit; s = user_data; if (queue_read(s->tx_queue, &bit, 1) <= 0) bit = 1; return bit; } /*- End of function --------------------------------------------------------*/ static void v8_put_byte(v8_state_t *s, int data) { int i; uint8_t bits[10]; /* Insert start & stop bits */ bits[0] = 0; for (i = 1; i < 9; i++) { bits[i] = (uint8_t) (data & 1); data >>= 1; } bits[9] = 1; queue_write(s->tx_queue, bits, 10); } /*- End of function --------------------------------------------------------*/ static void send_cm_jm(v8_state_t *s, int mod_mask) { int val; static const uint8_t preamble[20] = { /* 10 1's (0x3FF), then 10 bits of CM sync (0x00F) */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1 }; /* Send a CM, or a JM as appropriate */ queue_write(s->tx_queue, preamble, 20); /* Data call */ v8_put_byte(s, (V8_CALL_V_SERIES << 5) | 0x01); /* Supported modulations */ val = 0x05; if (mod_mask & V8_MOD_V90) val |= 0x20; if (mod_mask & V8_MOD_V34) val |= 0x40; v8_put_byte(s, val); val = 0x10; if (mod_mask & V8_MOD_V32) val |= 0x01; if (mod_mask & V8_MOD_V22) val |= 0x02; if (mod_mask & V8_MOD_V17) val |= 0x04; if (mod_mask & V8_MOD_V29) val |= 0x40; if (mod_mask & V8_MOD_V27TER) val |= 0x80; v8_put_byte(s, val); val = 0x10; if (mod_mask & V8_MOD_V26TER) val |= 0x01; if (mod_mask & V8_MOD_V26BIS) val |= 0x02; if (mod_mask & V8_MOD_V23) val |= 0x04; if (mod_mask & V8_MOD_V23HALF) val |= 0x40; if (mod_mask & V8_MOD_V21) val |= 0x80; v8_put_byte(s, val); v8_put_byte(s, (0 << 5) | 0x07); v8_put_byte(s, (V8_PROTOCOL_LAPM_V42 << 5) | 0x0A); /* No cellular right now */ v8_put_byte(s, (0 << 5) | 0x0D); } /*- End of function --------------------------------------------------------*/ static int select_modulation(int mask) { if (mask & V8_MOD_V90) return V8_MOD_V90; if (mask & V8_MOD_V34) return V8_MOD_V34; if (mask & V8_MOD_V32) return V8_MOD_V32; if (mask & V8_MOD_V23) return V8_MOD_V23; if (mask & V8_MOD_V21) return V8_MOD_V21; return V8_MOD_FAILED; } /*- End of function --------------------------------------------------------*/ int v8_tx(v8_state_t *s, int16_t *amp, int max_len) { int len; //span_log(&s->logging, SPAN_LOG_FLOW, "v8_tx state %d\n", s->state); len = 0; switch (s->state) { case V8_CI_ON: case V8_CM_ON: case V8_JM_ON: case V8_CJ_ON: len = fsk_tx(&s->v21tx, amp, max_len); break; case V8_CM_WAIT: /* Send the ANSam tone */ len = modem_connect_tones_tx(&s->ansam_tx, amp, max_len); break; } return len; } /*- End of function --------------------------------------------------------*/ int v8_rx(v8_state_t *s, const int16_t *amp, int len) { int i; int residual_samples; v8_result_t result; static const uint8_t preamble[20] = { /* 10 1's (0x3FF), then 10 bits of CI sync (0x001) */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 }; //span_log(&s->logging, SPAN_LOG_FLOW, "v8_rx state %d\n", s->state); residual_samples = 0; switch (s->state) { case V8_WAIT_1S: /* Wait 1 second before sending the first CI packet */ if ((s->negotiation_timer -= len) > 0) break; s->state = V8_CI; s->ci_count = 0; modem_connect_tones_rx_init(&s->ansam_rx, MODEM_CONNECT_TONES_ANS_PR, NULL, NULL); fsk_tx_init(&s->v21tx, &preset_fsk_specs[FSK_V21CH1], get_bit, s); /* Fall through to the next state */ case V8_CI: residual_samples = modem_connect_tones_rx(&s->ansam_rx, amp, len); /* Send 4 CI packets in a burst (the spec says at least 3) */ for (i = 0; i < 4; i++) { /* 10 1's (0x3FF), then CI sync (0x001) */ queue_write(s->tx_queue, preamble, 20); v8_put_byte(s, (V8_CALL_V_SERIES << 5) | 0x01); } s->state = V8_CI_ON; break; case V8_CI_ON: residual_samples = modem_connect_tones_rx(&s->ansam_rx, amp, len); if (queue_empty(s->tx_queue)) { s->state = V8_CI_OFF; s->ci_timer = ms_to_samples(500); } break; case V8_CI_OFF: residual_samples = modem_connect_tones_rx(&s->ansam_rx, amp, len); /* Check if an ANSam tone has been detected */ if (modem_connect_tones_rx_get(&s->ansam_rx)) { /* Set the Te interval. The spec. says 500ms is the minimum, but gives reasons why 1 second is a better value. */ s->ci_timer = ms_to_samples(1000); s->state = V8_HEARD_ANSAM; break; } if ((s->ci_timer -= len) <= 0) { if (++s->ci_count >= 10) { /* The spec says we should give up now. */ s->state = V8_PARKED; if (s->result_handler) s->result_handler(s->result_handler_user_data, NULL); } else { /* Try again */ s->state = V8_CI; } } break; case V8_HEARD_ANSAM: /* We have heard the ANSam signal, but we still need to wait for the end of the Te timeout period to comply with the spec. */ if ((s->ci_timer -= len) <= 0) { v8_decode_init(s); s->state = V8_CM_ON; s->negotiation_timer = ms_to_samples(5000); send_cm_jm(s, s->available_modulations); } break; case V8_CM_ON: residual_samples = fsk_rx(&s->v21rx, amp, len); if (s->got_cm_jm) { /* Now JM has been detected we send CJ and wait for 75 ms before finishing the V.8 analysis. */ s->negotiated_modulation = select_modulation(s->far_end_modulations); queue_flush(s->tx_queue); for (i = 0; i < 9; i++) v8_put_byte(s, 0); s->state = V8_CJ_ON; break; } if ((s->negotiation_timer -= len) <= 0) { /* Timeout */ s->state = V8_PARKED; if (s->result_handler) s->result_handler(s->result_handler_user_data, NULL); } if (queue_empty(s->tx_queue)) { /* Send CM again */ send_cm_jm(s, s->available_modulations); } break; case V8_CJ_ON: residual_samples = fsk_rx(&s->v21rx, amp, len); if (queue_empty(s->tx_queue)) { s->negotiation_timer = ms_to_samples(75); s->state = V8_SIGC; } break; case V8_SIGC: if ((s->negotiation_timer -= len) <= 0) { /* The V.8 negotiation has succeeded. */ s->state = V8_PARKED; if (s->result_handler) { result.call_function = s->call_function; result.available_modulations = s->far_end_modulations; result.negotiated_modulation = s->negotiated_modulation; result.protocol = s->protocol; result.pstn_access = s->pstn_access; result.nsf_seen = s->nsf_seen; result.pcm_modem_availability = s->pcm_modem_availability; result.t66_seen = s->t66_seen; s->result_handler(s->result_handler_user_data, &result); } } break; case V8_WAIT_200MS: if ((s->negotiation_timer -= len) <= 0) { /* Send the ANSam tone */ modem_connect_tones_tx_init(&s->ansam_tx, MODEM_CONNECT_TONES_ANSAM_PR); v8_decode_init(s); s->state = V8_CM_WAIT; s->negotiation_timer = ms_to_samples(5000); } break; case V8_CM_WAIT: residual_samples = fsk_rx(&s->v21rx, amp, len); if (s->got_cm_jm) { /* Stop sending ANSam and send JM instead */ fsk_tx_init(&s->v21tx, &preset_fsk_specs[FSK_V21CH2], get_bit, s); /* Set the timeout for JM */ s->negotiation_timer = ms_to_samples(5000); s->state = V8_JM_ON; s->common_modulations = s->available_modulations & s->far_end_modulations; s->negotiated_modulation = select_modulation(s->common_modulations); send_cm_jm(s, s->common_modulations); break; } if ((s->negotiation_timer -= len) <= 0) { /* Timeout */ s->state = V8_PARKED; if (s->result_handler) s->result_handler(s->result_handler_user_data, NULL); } break; case V8_JM_ON: residual_samples = fsk_rx(&s->v21rx, amp, len); if (s->got_cj) { /* Stop sending JM, and wait 75 ms */ s->negotiation_timer = ms_to_samples(75); s->state = V8_SIGA; break; } if ((s->negotiation_timer -= len) <= 0) { /* Timeout */ s->state = V8_PARKED; if (s->result_handler) s->result_handler(s->result_handler_user_data, NULL); break; } if (queue_empty(s->tx_queue)) { /* Send JM */ send_cm_jm(s, s->common_modulations); } break; case V8_SIGA: if ((s->negotiation_timer -= len) <= 0) { /* The V.8 negotiation has succeeded. */ s->state = V8_PARKED; if (s->result_handler) { result.call_function = s->call_function; result.available_modulations = s->far_end_modulations; result.negotiated_modulation = s->negotiated_modulation; result.protocol = s->protocol; result.pstn_access = s->pstn_access; result.nsf_seen = s->nsf_seen; result.pcm_modem_availability = s->pcm_modem_availability; result.t66_seen = s->t66_seen; s->result_handler(s->result_handler_user_data, &result); } } break; case V8_PARKED: residual_samples = len; break; } return residual_samples; } /*- End of function --------------------------------------------------------*/ v8_state_t *v8_init(v8_state_t *s, int caller, int available_modulations, v8_result_handler_t *result_handler, void *user_data) { if (s == NULL) { if ((s = (v8_state_t *) malloc(sizeof(*s))) == NULL) return NULL; } memset(s, 0, sizeof(*s)); s->caller = caller; s->available_modulations = available_modulations; s->result_handler = result_handler; s->result_handler_user_data = user_data; s->ci_timer = 0; if (s->caller) { s->state = V8_WAIT_1S; s->negotiation_timer = ms_to_samples(1000); } else { s->state = V8_WAIT_200MS; s->negotiation_timer = ms_to_samples(200); } if ((s->tx_queue = queue_init(NULL, 1024, 0)) == NULL) return NULL; return s; } /*- End of function --------------------------------------------------------*/ int v8_release(v8_state_t *s) { return queue_free(s->tx_queue); } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/power_meter.c0000644000175000017500000000656111150047216020361 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * power_meter.c * * Written by Steve Underwood * * Copyright (C) 2003 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: power_meter.c,v 1.24 2008/07/02 14:48:26 steveu Exp $ */ /*! \file */ #if defined(HAVE_CONFIG_H) #include #endif #include #include #include #include #include #include #include "floating_fudge.h" #if defined(HAVE_TGMATH_H) #include #endif #if defined(HAVE_MATH_H) #include #endif #include #include "spandsp/telephony.h" #include "spandsp/power_meter.h" power_meter_t *power_meter_init(power_meter_t *s, int shift) { if (s == NULL) { if ((s = (power_meter_t *) malloc(sizeof(*s))) == NULL) return NULL; } s->shift = shift; s->reading = 0; return s; } /*- End of function --------------------------------------------------------*/ power_meter_t *power_meter_damping(power_meter_t *s, int shift) { s->shift = shift; return s; } /*- End of function --------------------------------------------------------*/ int32_t power_meter_update(power_meter_t *s, int16_t amp) { s->reading += ((amp*amp - s->reading) >> s->shift); return s->reading; } /*- End of function --------------------------------------------------------*/ int32_t power_meter_level_dbm0(float level) { float l; level -= DBM0_MAX_POWER; if (level > 0.0) level = 0.0; l = powf(10.0f, level/10.0f)*(32767.0f*32767.0f); return (int32_t) l; } /*- End of function --------------------------------------------------------*/ int32_t power_meter_level_dbov(float level) { float l; if (level > 0.0) level = 0.0; l = powf(10.0f, level/10.0f)*(32767.0f*32767.0f); return (int32_t) l; } /*- End of function --------------------------------------------------------*/ int32_t power_meter_current(power_meter_t *s) { return s->reading; } /*- End of function --------------------------------------------------------*/ float power_meter_current_dbm0(power_meter_t *s) { if (s->reading <= 0) return FLT_MIN; /* This is based on A-law, but u-law is only 0.03dB different, so don't worry. */ return log10f((float) s->reading/(32767.0f*32767.0f))*10.0f + DBM0_MAX_POWER; } /*- End of function --------------------------------------------------------*/ float power_meter_current_dbov(power_meter_t *s) { if (s->reading <= 0) return FLT_MIN; return log10f((float) s->reading/(32767.0f*32767.0f))*10.0f; } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/t30_logging.c0000644000175000017500000007651211150047216020150 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * t30_logging.c - ITU T.30 FAX transfer processing * * Written by Steve Underwood * * Copyright (C) 2003, 2004, 2005, 2006, 2007 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: t30_logging.c,v 1.5 2008/07/02 14:48:26 steveu Exp $ */ /*! \file */ #if defined(HAVE_CONFIG_H) #include #endif #include #include #include #include #include #include #include "floating_fudge.h" #if defined(HAVE_TGMATH_H) #include #endif #if defined(HAVE_MATH_H) #include #endif #include #include "spandsp/telephony.h" #include "spandsp/logging.h" #include "spandsp/bit_operations.h" #include "spandsp/queue.h" #include "spandsp/power_meter.h" #include "spandsp/complex.h" #include "spandsp/tone_generate.h" #include "spandsp/async.h" #include "spandsp/hdlc.h" #include "spandsp/fsk.h" #include "spandsp/v29rx.h" #include "spandsp/v29tx.h" #include "spandsp/v27ter_rx.h" #include "spandsp/v27ter_tx.h" #include "spandsp/t4.h" #include "spandsp/t30_fcf.h" #include "spandsp/t35.h" #include "spandsp/t30.h" #include "spandsp/t30_logging.h" #include "t30_local.h" typedef struct { int val; const char *str; } value_string_t; enum { DISBIT1 = 0x01, DISBIT2 = 0x02, DISBIT3 = 0x04, DISBIT4 = 0x08, DISBIT5 = 0x10, DISBIT6 = 0x20, DISBIT7 = 0x40, DISBIT8 = 0x80 }; const char *t30_completion_code_to_str(int result) { switch (result) { case T30_ERR_OK: return "OK"; case T30_ERR_CEDTONE: return "The CED tone exceeded 5s"; case T30_ERR_T0_EXPIRED: return "Timed out waiting for initial communication"; case T30_ERR_T1_EXPIRED: return "Timed out waiting for the first message"; case T30_ERR_T3_EXPIRED: return "Timed out waiting for procedural interrupt"; case T30_ERR_HDLC_CARRIER: return "The HDLC carrier did not stop in a timely manner"; case T30_ERR_CANNOT_TRAIN: return "Failed to train with any of the compatible modems"; case T30_ERR_OPER_INT_FAIL: return "Operator intervention failed"; case T30_ERR_INCOMPATIBLE: return "Far end is not compatible"; case T30_ERR_RX_INCAPABLE: return "Far end is not able to receive"; case T30_ERR_TX_INCAPABLE: return "Far end is not able to transmit"; case T30_ERR_NORESSUPPORT: return "Far end cannot receive at the resolution of the image"; case T30_ERR_NOSIZESUPPORT: return "Far end cannot receive at the size of image"; case T30_ERR_UNEXPECTED: return "Unexpected message received"; case T30_ERR_TX_BADDCS: return "Received bad response to DCS or training"; case T30_ERR_TX_BADPG: return "Received a DCN from remote after sending a page"; case T30_ERR_TX_ECMPHD: return "Invalid ECM response received from receiver"; case T30_ERR_TX_GOTDCN: return "Received a DCN while waiting for a DIS"; case T30_ERR_TX_INVALRSP: return "Invalid response after sending a page"; case T30_ERR_TX_NODIS: return "Received other than DIS while waiting for DIS"; case T30_ERR_TX_PHBDEAD: return "Received no response to DCS or TCF"; case T30_ERR_TX_PHDDEAD: return "No response after sending a page"; case T30_ERR_TX_T5EXP: return "Timed out waiting for receiver ready (ECM mode)"; case T30_ERR_RX_ECMPHD: return "Invalid ECM response received from transmitter"; case T30_ERR_RX_GOTDCS: return "DCS received while waiting for DTC"; case T30_ERR_RX_INVALCMD: return "Unexpected command after page received"; case T30_ERR_RX_NOCARRIER: return "Carrier lost during fax receive"; case T30_ERR_RX_NOEOL: return "Timed out while waiting for EOL (end Of line)"; case T30_ERR_RX_NOFAX: return "Timed out while waiting for first line"; case T30_ERR_RX_T2EXPDCN: return "Timer T2 expired while waiting for DCN"; case T30_ERR_RX_T2EXPD: return "Timer T2 expired while waiting for phase D"; case T30_ERR_RX_T2EXPFAX: return "Timer T2 expired while waiting for fax page"; case T30_ERR_RX_T2EXPMPS: return "Timer T2 expired while waiting for next fax page"; case T30_ERR_RX_T2EXPRR: return "Timer T2 expired while waiting for RR command"; case T30_ERR_RX_T2EXP: return "Timer T2 expired while waiting for NSS, DCS or MCF"; case T30_ERR_RX_DCNWHY: return "Unexpected DCN while waiting for DCS or DIS"; case T30_ERR_RX_DCNDATA: return "Unexpected DCN while waiting for image data"; case T30_ERR_RX_DCNFAX: return "Unexpected DCN while waiting for EOM, EOP or MPS"; case T30_ERR_RX_DCNPHD: return "Unexpected DCN after EOM or MPS sequence"; case T30_ERR_RX_DCNRRD: return "Unexpected DCN after RR/RNR sequence"; case T30_ERR_RX_DCNNORTN: return "Unexpected DCN after requested retransmission"; case T30_ERR_FILEERROR: return "TIFF/F file cannot be opened"; case T30_ERR_NOPAGE: return "TIFF/F page not found"; case T30_ERR_BADTIFF: return "TIFF/F format is not compatible"; case T30_ERR_BADPAGE: return "TIFF/F page number tag missing"; case T30_ERR_BADTAG: return "Incorrect values for TIFF/F tags"; case T30_ERR_BADTIFFHDR: return "Bad TIFF/F header - incorrect values in fields"; case T30_ERR_NOMEM: return "Cannot allocate memory for more pages"; case T30_ERR_RETRYDCN: return "Disconnected after permitted retries"; case T30_ERR_CALLDROPPED: return "The call dropped prematurely"; case T30_ERR_NOPOLL: return "Poll not accepted"; case T30_ERR_IDENT_UNACCEPTABLE: return "Ident not accepted"; case T30_ERR_PSA_UNACCEPTABLE: return "Polled sub-address not accepted"; case T30_ERR_SEP_UNACCEPTABLE: return "Selective polling address not accepted"; case T30_ERR_SID_UNACCEPTABLE: return "Sender identification not accepted"; case T30_ERR_PWD_UNACCEPTABLE: return "Password not accepted"; case T30_ERR_SUB_UNACCEPTABLE: return "Sub-address not accepted"; case T30_ERR_TSA_UNACCEPTABLE: return "Transmitting subscriber internet address not accepted"; case T30_ERR_IRA_UNACCEPTABLE: return "Internet routing address not accepted"; case T30_ERR_CIA_UNACCEPTABLE: return "Calling subscriber internet address not accepted"; case T30_ERR_ISP_UNACCEPTABLE: return "Internet selective polling address not accepted"; case T30_ERR_CSA_UNACCEPTABLE: return "Called subscriber internet address not accepted"; } return "???"; } /*- End of function --------------------------------------------------------*/ const char *t30_frametype(uint8_t x) { switch (x & 0xFE) { case T30_DIS: return "DIS"; case T30_CSI: return "CSI"; case T30_NSF: return "NSF"; case T30_DTC: return "DTC"; case T30_CIG: return "CIG"; case T30_NSC: return "NSC"; case T30_PWD: return "PWD"; case T30_SEP: return "SEP"; case T30_PSA: return "PSA"; case T30_CIA: return "CIA"; case T30_ISP: return "ISP"; case T30_DCS: case T30_DCS | 0x01: return "DCS"; case T30_TSI: case T30_TSI | 0x01: return "TSI"; case T30_NSS: case T30_NSS | 0x01: return "NSS"; case T30_SUB: case T30_SUB | 0x01: return "SUB"; case T30_SID: case T30_SID | 0x01: return "SID"; case T30_CTC: case T30_CTC | 0x01: return "CTC"; case T30_TSA: case T30_TSA | 0x01: return "TSA"; case T30_IRA: case T30_IRA | 0x01: return "IRA"; case T30_CFR: case T30_CFR | 0x01: return "CFR"; case T30_FTT: case T30_FTT | 0x01: return "FTT"; case T30_CTR: case T30_CTR | 0x01: return "CTR"; case T30_CSA: case T30_CSA | 0x01: return "CSA"; case T30_EOM: case T30_EOM | 0x01: return "EOM"; case T30_MPS: case T30_MPS | 0x01: return "MPS"; case T30_EOP: case T30_EOP | 0x01: return "EOP"; case T30_PRI_EOM: case T30_PRI_EOM | 0x01: return "PRI-EOM"; case T30_PRI_MPS: case T30_PRI_MPS | 0x01: return "PRI-MPS"; case T30_PRI_EOP: case T30_PRI_EOP | 0x01: return "PRI-EOP"; case T30_EOS: case T30_EOS | 0x01: return "EOS"; case T30_PPS: case T30_PPS | 0x01: return "PPS"; case T30_EOR: case T30_EOR | 0x01: return "EOR"; case T30_RR: case T30_RR | 0x01: return "RR"; case T30_MCF: case T30_MCF | 0x01: return "MCF"; case T30_RTP: case T30_RTP | 0x01: return "RTP"; case T30_RTN: case T30_RTN | 0x01: return "RTN"; case T30_PIP: case T30_PIP | 0x01: return "PIP"; case T30_PIN: case T30_PIN | 0x01: return "PIN"; case T30_PPR: case T30_PPR | 0x01: return "PPR"; case T30_RNR: case T30_RNR | 0x01: return "RNR"; case T30_ERR: case T30_ERR | 0x01: return "ERR"; case T30_FDM: case T30_FDM | 0x01: return "FDM"; case T30_DCN: case T30_DCN | 0x01: return "DCN"; case T30_CRP: case T30_CRP | 0x01: return "CRP"; case T30_FNV: case T30_FNV | 0x01: return "FNV"; case T30_TNR: case T30_TNR | 0x01: return "TNR"; case T30_TR: case T30_TR | 0x01: return "TR"; case T30_TK: return "TK"; case T30_RK: return "RK"; #if 0 case T30_PSS: return "PSS"; #endif case T30_DES: return "DES"; case T30_DEC: return "DEC"; case T30_DER: return "DER"; #if 0 case T30_DTR: return "DTR"; #endif case T30_DNK: case T30_DNK | 0x01: return "DNK"; case T30_PID: case T30_PID | 0x01: return "PID"; case T30_NULL: return "NULL"; case T4_FCD: return "FCD"; case T4_RCP: return "RCP"; } return "???"; } /*- End of function --------------------------------------------------------*/ static void octet_reserved_bit(logging_state_t *log, const uint8_t *msg, int bit_no, int expected) { char s[10] = ".... ...."; int bit; uint8_t octet; /* Break out the octet and the bit number within it. */ octet = msg[((bit_no - 1) >> 3) + 3]; bit_no = (bit_no - 1) & 7; /* Now get the actual bit. */ bit = (octet >> bit_no) & 1; /* Is it what it should be. */ if (bit ^ expected) { /* Only log unexpected values. */ s[7 - bit_no + ((bit_no < 4) ? 1 : 0)] = (uint8_t) (bit + '0'); span_log(log, SPAN_LOG_FLOW, " %s= Unexpected state for reserved bit: %d\n", s, bit); } } /*- End of function --------------------------------------------------------*/ static void octet_bit_field(logging_state_t *log, const uint8_t *msg, int bit_no, const char *desc, const char *yeah, const char *neigh) { char s[10] = ".... ...."; int bit; uint8_t octet; const char *tag; /* Break out the octet and the bit number within it. */ octet = msg[((bit_no - 1) >> 3) + 3]; bit_no = (bit_no - 1) & 7; /* Now get the actual bit. */ bit = (octet >> bit_no) & 1; /* Edit the bit string for display. */ s[7 - bit_no + ((bit_no < 4) ? 1 : 0)] = (uint8_t) (bit + '0'); /* Find the right tag to display. */ if (bit) { if ((tag = yeah) == NULL) tag = "Set"; } else { if ((tag = neigh) == NULL) tag = "Not set"; } /* Eh, voila! */ span_log(log, SPAN_LOG_FLOW, " %s= %s: %s\n", s, desc, tag); } /*- End of function --------------------------------------------------------*/ static void octet_field(logging_state_t *log, const uint8_t *msg, int start, int end, const char *desc, const value_string_t tags[]) { char s[10] = ".... ...."; int i; uint8_t octet; const char *tag; /* Break out the octet and the bit number range within it. */ octet = msg[((start - 1) >> 3) + 3]; start = (start - 1) & 7; end = ((end - 1) & 7) + 1; /* Edit the bit string for display. */ for (i = start; i < end; i++) s[7 - i + ((i < 4) ? 1 : 0)] = (uint8_t) ((octet >> i) & 1) + '0'; /* Find the right tag to display. */ octet = (uint8_t) ((octet >> start) & ((0xFF + (1 << (end - start))) & 0xFF)); tag = "Invalid"; for (i = 0; tags[i].str; i++) { if (octet == tags[i].val) { tag = tags[i].str; break; } } /* Eh, voila! */ span_log(log, SPAN_LOG_FLOW, " %s= %s: %s\n", s, desc, tag); } /*- End of function --------------------------------------------------------*/ void t30_decode_dis_dtc_dcs(t30_state_t *s, const uint8_t *pkt, int len) { logging_state_t *log; uint8_t frame_type; static const value_string_t available_signalling_rate_tags[] = { { 0x00, "V.27 ter fall-back mode" }, { 0x01, "V.29" }, { 0x02, "V.27 ter" }, { 0x03, "V.27 ter and V.29" }, { 0x0B, "V.27 ter, V.29, and V.17" }, { 0x06, "Reserved" }, { 0x0A, "Reserved" }, { 0x0E, "Reserved" }, { 0x0F, "Reserved" }, { 0x04, "Not used" }, { 0x05, "Not used" }, { 0x08, "Not used" }, { 0x09, "Not used" }, { 0x0C, "Not used" }, { 0x0D, "Not used" }, { 0x00, NULL } }; static const value_string_t selected_signalling_rate_tags[] = { { 0x00, "V.27ter 2400bps" }, { 0x01, "V.29, 9600bps" }, { 0x02, "V.27ter 4800bps" }, { 0x03, "V.29 7200bps" }, { 0x08, "V.17 14400bps" }, { 0x09, "V.17 9600bps" }, { 0x0A, "V.17 12000bps" }, { 0x0B, "V.17 7200bps" }, { 0x05, "Reserved" }, { 0x07, "Reserved" }, { 0x0C, "Reserved" }, { 0x0D, "Reserved" }, { 0x0E, "Reserved" }, { 0x0F, "Reserved" }, { 0x00, NULL } }; static const value_string_t available_scan_line_length_tags[] = { { 0x00, "215mm +- 1%" }, { 0x01, "215mm +- 1% and 255mm +- 1%" }, { 0x02, "215mm +- 1%, 255mm +- 1% and 303mm +- 1%" }, { 0x00, NULL } }; static const value_string_t selected_scan_line_length_tags[] = { { 0x00, "215mm +- 1%" }, { 0x01, "255mm +- 1%" }, { 0x02, "303mm +- 1%" }, { 0x00, NULL } }; static const value_string_t available_recording_length_tags[] = { { 0x00, "A4 (297mm)" }, { 0x01, "A4 (297mm) and B4 (364mm)" }, { 0x02, "Unlimited" }, { 0x00, NULL } }; static const value_string_t selected_recording_length_tags[] = { { 0x00, "A4 (297mm)" }, { 0x01, "B4 (364mm)" }, { 0x02, "Unlimited" }, { 0x00, NULL } }; static const value_string_t available_minimum_scan_line_time_tags[] = { { 0x00, "20ms at 3.85 l/mm; T7.7 = T3.85" }, { 0x01, "5ms at 3.85 l/mm; T7.7 = T3.85" }, { 0x02, "10ms at 3.85 l/mm; T7.7 = T3.85" }, { 0x03, "20ms at 3.85 l/mm; T7.7 = 1/2 T3.85" }, { 0x04, "40ms at 3.85 l/mm; T7.7 = T3.85" }, { 0x05, "40ms at 3.85 l/mm; T7.7 = 1/2 T3.85" }, { 0x06, "10ms at 3.85 l/mm; T7.7 = 1/2 T3.85" }, { 0x07, "0ms at 3.85 l/mm; T7.7 = T3.85" }, { 0x00, NULL } }; static const value_string_t selected_minimum_scan_line_time_tags[] = { { 0x00, "20ms" }, { 0x01, "5ms" }, { 0x02, "10ms" }, { 0x04, "40ms" }, { 0x07, "0ms" }, { 0x00, NULL } }; static const value_string_t shared_data_memory_capacity_tags[] = { { 0x00, "Not available" }, { 0x01, "Level 2 = 2.0 Mbytes" }, { 0x02, "Level 1 = 1.0 Mbytes" }, { 0x03, "Level 3 = unlimited (i.e. >= 32 Mbytes)" }, { 0x00, NULL } }; static const value_string_t t89_profile_tags[] = { { 0x00, "Not used" }, { 0x01, "Profiles 2 and 3" }, { 0x02, "Profile 2" }, { 0x04, "Profile 1" }, { 0x06, "Profile 3" }, { 0x03, "Reserved" }, { 0x05, "Reserved" }, { 0x07, "Reserved" }, { 0x00, NULL } }; static const value_string_t t44_mixed_raster_content_tags[] = { { 0x00, "0" }, { 0x01, "1" }, { 0x02, "2" }, { 0x32, "3" }, { 0x04, "4" }, { 0x05, "5" }, { 0x06, "6" }, { 0x07, "7" }, { 0x00, NULL } }; if (!span_log_test(&s->logging, SPAN_LOG_FLOW)) return; frame_type = pkt[2] & 0xFE; log = &s->logging; if (len <= 2) { span_log(log, SPAN_LOG_FLOW, " Frame is short\n"); return; } span_log(log, SPAN_LOG_FLOW, "%s:\n", t30_frametype(pkt[2])); if (len <= 3) { span_log(log, SPAN_LOG_FLOW, " Frame is short\n"); return; } octet_bit_field(log, pkt, 1, "Store and forward Internet fax (T.37)", NULL, NULL); octet_reserved_bit(log, pkt, 2, 0); octet_bit_field(log, pkt, 3, "Real-time Internet fax (T.38)", NULL, NULL); octet_bit_field(log, pkt, 4, "3G mobile network", NULL, NULL); octet_reserved_bit(log, pkt, 5, 0); if (frame_type == T30_DCS) { octet_reserved_bit(log, pkt, 6, 0); octet_reserved_bit(log, pkt, 7, 0); } else { octet_bit_field(log, pkt, 6, "V.8 capabilities", NULL, NULL); octet_bit_field(log, pkt, 7, "Preferred octets", "64 octets", "256 octets"); } octet_reserved_bit(log, pkt, 8, 0); if (len <= 4) { span_log(log, SPAN_LOG_FLOW, " Frame is short\n"); return; } if (frame_type == T30_DCS) { octet_reserved_bit(log, pkt, 9, 0); octet_bit_field(log, pkt, 10, "Receive fax", NULL, NULL); octet_field(log, pkt, 11, 14, "Selected data signalling rate", selected_signalling_rate_tags); } else { octet_bit_field(log, pkt, 9, "Ready to transmit a fax document (polling)", NULL, NULL); octet_bit_field(log, pkt, 10, "Can receive fax", NULL, NULL); octet_field(log, pkt, 11, 14, "Supported data signalling rates", available_signalling_rate_tags); } octet_bit_field(log, pkt, 15, "R8x7.7lines/mm and/or 200x200pels/25.4mm", NULL, NULL); octet_bit_field(log, pkt, 16, "2-D coding", NULL, NULL); if (len <= 5) { span_log(log, SPAN_LOG_FLOW, " Frame is short\n"); return; } if (frame_type == T30_DCS) { octet_field(log, pkt, 17, 18, "Recording width", selected_scan_line_length_tags); octet_field(log, pkt, 19, 20, "Recording length", selected_recording_length_tags); octet_field(log, pkt, 21, 23, "Minimum scan line time", selected_minimum_scan_line_time_tags); } else { octet_field(log, pkt, 17, 18, "Recording width", available_scan_line_length_tags); octet_field(log, pkt, 19, 20, "Recording length", available_recording_length_tags); octet_field(log, pkt, 21, 23, "Receiver's minimum scan line time", available_minimum_scan_line_time_tags); } octet_bit_field(log, pkt, 24, "Extension indicator", NULL, NULL); if (!(pkt[5] & DISBIT8)) return; if (len <= 6) { span_log(log, SPAN_LOG_FLOW, " Frame is short\n"); return; } octet_reserved_bit(log, pkt, 25, 0); octet_bit_field(log, pkt, 26, "Compressed/uncompressed mode", "Uncompressed", "Compressed"); octet_bit_field(log, pkt, 27, "Error correction mode (ECM)", "ECM", "Non-ECM"); if (frame_type == T30_DCS) octet_bit_field(log, pkt, 28, "Frame size", "64 octets", "256 octets"); else octet_reserved_bit(log, pkt, 28, 0); octet_reserved_bit(log, pkt, 29, 0); octet_reserved_bit(log, pkt, 30, 0); octet_bit_field(log, pkt, 31, "T.6 coding", NULL, NULL); octet_bit_field(log, pkt, 32, "Extension indicator", NULL, NULL); if (!(pkt[6] & DISBIT8)) return; if (len <= 7) { span_log(log, SPAN_LOG_FLOW, " Frame is short\n"); return; } octet_bit_field(log, pkt, 33, "\"Field not valid\" supported", NULL, NULL); if (frame_type == T30_DCS) { octet_reserved_bit(log, pkt, 34, 0); octet_reserved_bit(log, pkt, 35, 0); } else { octet_bit_field(log, pkt, 34, "Multiple selective polling", NULL, NULL); octet_bit_field(log, pkt, 35, "Polled sub-address", NULL, NULL); } octet_bit_field(log, pkt, 36, "T.43 coding", NULL, NULL); octet_bit_field(log, pkt, 37, "Plane interleave", NULL, NULL); octet_bit_field(log, pkt, 38, "Voice coding with 32kbit/s ADPCM (Rec. G.726)", NULL, NULL); octet_bit_field(log, pkt, 39, "Reserved for the use of extended voice coding set", NULL, NULL); octet_bit_field(log, pkt, 40, "Extension indicator", NULL, NULL); if (!(pkt[7] & DISBIT8)) return; if (len <= 8) { span_log(log, SPAN_LOG_FLOW, " Frame is short\n"); return; } octet_bit_field(log, pkt, 41, "R8x15.4lines/mm", NULL, NULL); octet_bit_field(log, pkt, 42, "300x300pels/25.4mm", NULL, NULL); octet_bit_field(log, pkt, 43, "R16x15.4lines/mm and/or 400x400pels/25.4mm", NULL, NULL); if (frame_type == T30_DCS) { octet_bit_field(log, pkt, 44, "Resolution type selection", "Inch", "Metric"); octet_reserved_bit(log, pkt, 45, 0); octet_reserved_bit(log, pkt, 46, 0); octet_reserved_bit(log, pkt, 47, 0); } else { octet_bit_field(log, pkt, 44, "Inch-based resolution preferred", NULL, NULL); octet_bit_field(log, pkt, 45, "Metric-based resolution preferred", NULL, NULL); octet_bit_field(log, pkt, 46, "Minimum scan line time for higher resolutions", "T15.4 = 1/2 T7.7", "T15.4 = T7.7"); octet_bit_field(log, pkt, 47, "Selective polling", NULL, NULL); } octet_bit_field(log, pkt, 48, "Extension indicator", NULL, NULL); if (!(pkt[8] & DISBIT8)) return; if (len <= 9) { span_log(log, SPAN_LOG_FLOW, " Frame is short\n"); return; } octet_bit_field(log, pkt, 49, "Sub-addressing", NULL, NULL); if (frame_type == T30_DCS) { octet_bit_field(log, pkt, 50, "Sender identification transmission", NULL, NULL); octet_reserved_bit(log, pkt, 51, 0); } else { octet_bit_field(log, pkt, 50, "Password", NULL, NULL); octet_bit_field(log, pkt, 51, "Ready to transmit a data file (polling)", NULL, NULL); } octet_reserved_bit(log, pkt, 52, 0); octet_bit_field(log, pkt, 53, "Binary file transfer (BFT)", NULL, NULL); octet_bit_field(log, pkt, 54, "Document transfer mode (DTM)", NULL, NULL); octet_bit_field(log, pkt, 55, "Electronic data interchange (EDI)", NULL, NULL); octet_bit_field(log, pkt, 56, "Extension indicator", NULL, NULL); if (!(pkt[9] & DISBIT8)) return; if (len <= 10) { span_log(log, SPAN_LOG_FLOW, " Frame is short\n"); return; } octet_bit_field(log, pkt, 57, "Basic transfer mode (BTM)", NULL, NULL); octet_reserved_bit(log, pkt, 58, 0); if (frame_type == T30_DCS) octet_reserved_bit(log, pkt, 59, 0); else octet_bit_field(log, pkt, 59, "Ready to transfer a character or mixed mode document (polling)", NULL, NULL); octet_bit_field(log, pkt, 60, "Character mode", NULL, NULL); octet_reserved_bit(log, pkt, 61, 0); octet_bit_field(log, pkt, 62, "Mixed mode (Annex E/T.4)", NULL, NULL); octet_reserved_bit(log, pkt, 63, 0); octet_bit_field(log, pkt, 64, "Extension indicator", NULL, NULL); if (!(pkt[10] & DISBIT8)) return; if (len <= 11) { span_log(log, SPAN_LOG_FLOW, " Frame is short\n"); return; } octet_bit_field(log, pkt, 65, "Processable mode 26 (Rec. T.505)", NULL, NULL); octet_bit_field(log, pkt, 66, "Digital network capability", NULL, NULL); octet_bit_field(log, pkt, 67, "Duplex capability", "Full", "Half only"); if (frame_type == T30_DCS) octet_bit_field(log, pkt, 68, "Full colour mode", NULL, NULL); else octet_bit_field(log, pkt, 68, "JPEG coding", NULL, NULL); octet_bit_field(log, pkt, 69, "Full colour mode", NULL, NULL); if (frame_type == T30_DCS) octet_bit_field(log, pkt, 70, "Preferred Huffman tables", NULL, NULL); else octet_reserved_bit(log, pkt, 70, 0); octet_bit_field(log, pkt, 71, "12bits/pel component", NULL, NULL); octet_bit_field(log, pkt, 72, "Extension indicator", NULL, NULL); if (!(pkt[11] & DISBIT8)) return; if (len <= 12) { span_log(log, SPAN_LOG_FLOW, " Frame is short\n"); return; } octet_bit_field(log, pkt, 73, "No subsampling (1:1:1)", NULL, NULL); octet_bit_field(log, pkt, 74, "Custom illuminant", NULL, NULL); octet_bit_field(log, pkt, 75, "Custom gamut range", NULL, NULL); octet_bit_field(log, pkt, 76, "North American Letter (215.9mm x 279.4mm)", NULL, NULL); octet_bit_field(log, pkt, 77, "North American Legal (215.9mm x 355.6mm)", NULL, NULL); octet_bit_field(log, pkt, 78, "Single-progression sequential coding (Rec. T.85) basic", NULL, NULL); octet_bit_field(log, pkt, 79, "Single-progression sequential coding (Rec. T.85) optional L0", NULL, NULL); octet_bit_field(log, pkt, 80, "Extension indicator", NULL, NULL); if (!(pkt[12] & DISBIT8)) return; if (len <= 13) { span_log(log, SPAN_LOG_FLOW, " Frame is short\n"); return; } octet_bit_field(log, pkt, 81, "HKM key management", NULL, NULL); octet_bit_field(log, pkt, 82, "RSA key management", NULL, NULL); octet_bit_field(log, pkt, 83, "Override", NULL, NULL); octet_bit_field(log, pkt, 84, "HFX40 cipher", NULL, NULL); octet_bit_field(log, pkt, 85, "Alternative cipher number 2", NULL, NULL); octet_bit_field(log, pkt, 86, "Alternative cipher number 3", NULL, NULL); octet_bit_field(log, pkt, 87, "HFX40-I hashing", NULL, NULL); octet_bit_field(log, pkt, 88, "Extension indicator", NULL, NULL); if (!(pkt[13] & DISBIT8)) return; if (len <= 14) { span_log(log, SPAN_LOG_FLOW, " Frame is short\n"); return; } octet_bit_field(log, pkt, 89, "Alternative hashing system 2", NULL, NULL); octet_bit_field(log, pkt, 90, "Alternative hashing system 3", NULL, NULL); octet_bit_field(log, pkt, 91, "Reserved for future security features", NULL, NULL); octet_field(log, pkt, 92, 94, "T.44 (Mixed Raster Content)", t44_mixed_raster_content_tags); octet_bit_field(log, pkt, 95, "Page length maximum stripe size for T.44 (Mixed Raster Content)", NULL, NULL); octet_bit_field(log, pkt, 96, "Extension indicator", NULL, NULL); if (!(pkt[14] & DISBIT8)) return; if (len <= 15) { span_log(log, SPAN_LOG_FLOW, " Frame is short\n"); return; } octet_bit_field(log, pkt, 97, "Colour/gray-scale 300pels/25.4mm x 300lines/25.4mm or 400pels/25.4mm x 400lines/25.4mm resolution", NULL, NULL); octet_bit_field(log, pkt, 98, "100pels/25.4mm x 100lines/25.4mm for colour/gray scale", NULL, NULL); octet_bit_field(log, pkt, 99, "Simple phase C BFT negotiations", NULL, NULL); if (frame_type == T30_DCS) { octet_reserved_bit(log, pkt, 100, 0); octet_reserved_bit(log, pkt, 101, 0); } else { octet_bit_field(log, pkt, 100, "Extended BFT Negotiations capable", NULL, NULL); octet_bit_field(log, pkt, 101, "Internet Selective Polling address (ISP)", NULL, NULL); } octet_bit_field(log, pkt, 102, "Internet Routing Address (IRA)", NULL, NULL); octet_reserved_bit(log, pkt, 103, 0); octet_bit_field(log, pkt, 104, "Extension indicator", NULL, NULL); if (!(pkt[15] & DISBIT8)) return; if (len <= 16) { span_log(log, SPAN_LOG_FLOW, " Frame is short\n"); return; } octet_bit_field(log, pkt, 105, "600pels/25.4mm x 600lines/25.4mm", NULL, NULL); octet_bit_field(log, pkt, 106, "1200pels/25.4mm x 1200lines/25.4mm", NULL, NULL); octet_bit_field(log, pkt, 107, "300pels/25.4mm x 600lines/25.4mm", NULL, NULL); octet_bit_field(log, pkt, 108, "400pels/25.4mm x 800lines/25.4mm", NULL, NULL); octet_bit_field(log, pkt, 109, "600pels/25.4mm x 1200lines/25.4mm", NULL, NULL); octet_bit_field(log, pkt, 110, "Colour/gray scale 600pels/25.4mm x 600lines/25.4mm", NULL, NULL); octet_bit_field(log, pkt, 111, "Colour/gray scale 1200pels/25.4mm x 1200lines/25.4mm", NULL, NULL); octet_bit_field(log, pkt, 112, "Extension indicator", NULL, NULL); if (!(pkt[16] & DISBIT8)) return; if (len <= 17) { span_log(log, SPAN_LOG_FLOW, " Frame is short\n"); return; } octet_bit_field(log, pkt, 113, "Double sided printing capability (alternate mode)", NULL, NULL); octet_bit_field(log, pkt, 114, "Double sided printing capability (continuous mode)", NULL, NULL); if (frame_type == T30_DCS) octet_bit_field(log, pkt, 115, "Black and white mixed raster content profile (MRCbw)", NULL, NULL); else octet_reserved_bit(log, pkt, 115, 0); octet_bit_field(log, pkt, 116, "T.45 (run length colour encoded)", NULL, NULL); octet_field(log, pkt, 117, 118, "Shared memory", shared_data_memory_capacity_tags); octet_bit_field(log, pkt, 119, "T.44 colour space", NULL, NULL); octet_bit_field(log, pkt, 120, "Extension indicator", NULL, NULL); if (!(pkt[17] & DISBIT8)) return; if (len <= 18) { span_log(log, SPAN_LOG_FLOW, " Frame is short\n"); return; } octet_bit_field(log, pkt, 121, "Flow control capability for T.38 communication", NULL, NULL); octet_bit_field(log, pkt, 122, "K>4", NULL, NULL); octet_bit_field(log, pkt, 123, "Internet aware T.38 mode fax (not affected by data signal rate bits)", NULL, NULL); octet_field(log, pkt, 124, 126, "T.89 (Application profiles for ITU-T Rec T.8)", t89_profile_tags); octet_bit_field(log, pkt, 127, "sYCC-JPEG coding", NULL, NULL); octet_bit_field(log, pkt, 128, "Extension indicator", NULL, NULL); if (!(pkt[18] & DISBIT8)) return; span_log(log, SPAN_LOG_FLOW, " Extended beyond the current T.30 specification!\n"); } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/complex_filters.c0000644000175000017500000000446211150047216021226 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * complex_filters.c * * Written by Steve Underwood * * Copyright (C) 2003 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: complex_filters.c,v 1.13 2008/05/13 13:17:22 steveu Exp $ */ #if defined(HAVE_CONFIG_H) #include #endif #include #include #include #include "spandsp/complex.h" #include "spandsp/complex_filters.h" filter_t *filter_create(fspec_t *fs) { int i; filter_t *fi; if ((fi = (filter_t *) malloc(sizeof(*fi) + sizeof(float)*(fs->np + 1)))) { fi->fs = fs; fi->sum = 0.0; /* Moving average filters only */ fi->ptr = 0; for (i = 0; i <= fi->fs->np; i++) fi->v[i] = 0.0; } return fi; } void filter_delete(filter_t *fi) { if (fi) free(fi); } float filter_step(filter_t *fi, float x) { return fi->fs->fsf(fi, x); } cfilter_t *cfilter_create(fspec_t *fs) { cfilter_t *cfi; if ((cfi = (cfilter_t *) malloc(sizeof(*cfi)))) { if ((cfi->ref = filter_create(fs)) == NULL) { free(cfi); return NULL; } if ((cfi->imf = filter_create(fs)) == NULL) { free(cfi->ref); free(cfi); return NULL; } } return cfi; } void cfilter_delete(cfilter_t *cfi) { if (cfi) { filter_delete(cfi->ref); filter_delete(cfi->imf); } } complexf_t cfilter_step(cfilter_t *cfi, const complexf_t *z) { complexf_t cc; cc.re = filter_step(cfi->ref, z->re); cc.im = filter_step(cfi->imf, z->im); return cc; } iaxmodem-1.2.0/lib/spandsp/src/modem_echo.c0000644000175000017500000001361611150047216020127 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * modem_echo.c - An echo cancellor, suitable for electrical echos in GSTN modems * * Written by Steve Underwood * * Copyright (C) 2001, 2003, 2004 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: modem_echo.c,v 1.22 2008/07/02 14:48:25 steveu Exp $ */ /*! \file */ /* The FIR taps must be adapted as 32 bit values, to get the necessary finesse in the adaption process. However, they are applied as 16 bit values (bits 30-15 of the 32 bit values) in the FIR. For the working 16 bit values, we need 4 sets. */ #if defined(HAVE_CONFIG_H) #include #endif #include #include #include #include #include "floating_fudge.h" #if defined(HAVE_TGMATH_H) #include #endif #if defined(HAVE_MATH_H) #include #endif #include "spandsp/telephony.h" #include "spandsp/bit_operations.h" #include "spandsp/dc_restore.h" #include "spandsp/modem_echo.h" modem_echo_can_state_t *modem_echo_can_create(int len) { modem_echo_can_state_t *ec; if ((ec = (modem_echo_can_state_t *) malloc(sizeof(*ec))) == NULL) return NULL; memset(ec, 0, sizeof(*ec)); ec->taps = len; ec->curr_pos = ec->taps - 1; if ((ec->fir_taps32 = (int32_t *) malloc(ec->taps*sizeof(int32_t))) == NULL) { free(ec); return NULL; } memset(ec->fir_taps32, 0, ec->taps*sizeof(int32_t)); if ((ec->fir_taps16 = (int16_t *) malloc(ec->taps*sizeof(int16_t))) == NULL) { free(ec->fir_taps32); free(ec); return NULL; } memset(ec->fir_taps16, 0, ec->taps*sizeof(int16_t)); if (fir16_create(&ec->fir_state, ec->fir_taps16, ec->taps) == NULL) { free(ec->fir_taps16); free(ec->fir_taps32); free(ec); return NULL; } return ec; } /*- End of function --------------------------------------------------------*/ void modem_echo_can_free(modem_echo_can_state_t *ec) { fir16_free(&ec->fir_state); free(ec->fir_taps32); free(ec->fir_taps16); free(ec); } /*- End of function --------------------------------------------------------*/ void modem_echo_can_flush(modem_echo_can_state_t *ec) { ec->tx_power = 0; fir16_flush(&ec->fir_state); ec->fir_state.curr_pos = ec->taps - 1; memset(ec->fir_taps32, 0, ec->taps*sizeof(int32_t)); memset(ec->fir_taps16, 0, ec->taps*sizeof(int16_t)); ec->curr_pos = ec->taps - 1; } /*- End of function --------------------------------------------------------*/ void modem_echo_can_adaption_mode(modem_echo_can_state_t *ec, int adapt) { ec->adapt = adapt; } /*- End of function --------------------------------------------------------*/ int16_t modem_echo_can_update(modem_echo_can_state_t *ec, int16_t tx, int16_t rx) { int32_t echo_value; int clean_rx; int shift; int i; int offset1; int offset2; /* Evaluate the echo - i.e. apply the FIR filter */ /* Assume the gain of the FIR does not exceed unity. Exceeding unity would seem like a rather poor thing for an echo cancellor to do :) This means we can compute the result with a total disregard for overflows. 16bits x 16bits -> 31bits, so no overflow can occur in any multiply. While accumulating we may overflow and underflow the 32 bit scale often. However, if the gain does not exceed unity, everything should work itself out, and the final result will be OK, without any saturation logic. */ /* Overflow is very much possible here, and we do nothing about it because of the compute costs */ echo_value = fir16(&ec->fir_state, tx); /* And the answer is..... */ clean_rx = rx - echo_value; //printf("%8d %8d %8d %8d\n", tx, rx, echo_value, clean_rx); if (ec->adapt) { /* Calculate short term power levels using very simple single pole IIRs */ /* TODO: Is the nasty modulus approach the fastest, or would a real tx*tx power calculation actually be faster? Using the squares makes the numbers grow a lot! */ ec->tx_power += ((tx*tx - ec->tx_power) >> 5); shift = 1; /* Update the FIR taps */ offset2 = ec->curr_pos; offset1 = ec->taps - offset2; for (i = ec->taps - 1; i >= offset1; i--) { /* Leak to avoid the coefficients drifting beyond the ability of the adaption process to bring them back under control. */ ec->fir_taps32[i] -= (ec->fir_taps32[i] >> 23); ec->fir_taps32[i] += (ec->fir_state.history[i - offset1]*clean_rx) >> shift; ec->fir_taps16[i] = (int16_t) (ec->fir_taps32[i] >> 15); } for ( ; i >= 0; i--) { ec->fir_taps32[i] -= (ec->fir_taps32[i] >> 23); ec->fir_taps32[i] += (ec->fir_state.history[i + offset2]*clean_rx) >> shift; ec->fir_taps16[i] = (int16_t) (ec->fir_taps32[i] >> 15); } } /* Roll around the rolling buffer */ if (ec->curr_pos <= 0) ec->curr_pos = ec->taps; ec->curr_pos--; return (int16_t) clean_rx; } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/v29rx_fixed_rrc.h0000644000175000017500000011717311150047216021057 0ustar julienjulien#define RX_PULSESHAPER_GAIN 32767.000000f #define RX_PULSESHAPER_COEFF_SETS 48 static const complexi16_t rx_pulseshaper[RX_PULSESHAPER_COEFF_SETS][27] = { { { 0, 0}, /* Filter 0 */ { 35, -11}, { -67, -109}, { 91, -91}, { -80, -49}, { 54, -166}, { -151, -11}, { -65, -413}, { -138, 57}, { -766, -1055}, { 843, -987}, { -1372, -699}, { 1529, -6372}, { 10574, 0}, { 2468, 10282}, { -5839, 2975}, { -1000, -1171}, { -763, 1050}, { -1205, -499}, { 23, -147}, { -416, 32}, { -46, -144}, { -149, 91}, { -66, -66}, { -67, 110}, { -122, -39}, { -2, 36} }, { { 0, 0}, /* Filter 1 */ { 32, -10}, { -68, -111}, { 89, -89}, { -84, -51}, { 53, -163}, { -160, -12}, { -65, -411}, { -158, 65}, { -778, -1070}, { 825, -966}, { -1452, -739}, { 1554, -6476}, { 10621, 0}, { 2457, 10234}, { -5743, 2926}, { -942, -1103}, { -778, 1071}, { -1186, -491}, { 20, -126}, { -418, 32}, { -44, -135}, { -151, 92}, { -63, -63}, { -69, 112}, { -119, -38}, { -3, 40} }, { { 0, 0}, /* Filter 2 */ { 29, -9}, { -69, -113}, { 87, -87}, { -88, -54}, { 52, -161}, { -169, -13}, { -64, -409}, { -179, 74}, { -789, -1086}, { 807, -944}, { -1533, -781}, { 1579, -6580}, { 10667, 0}, { 2445, 10184}, { -5647, 2877}, { -885, -1036}, { -793, 1091}, { -1167, -483}, { 16, -105}, { -418, 32}, { -41, -126}, { -153, 94}, { -59, -59}, { -70, 115}, { -116, -38}, { -3, 43} }, { { 0, 0}, /* Filter 3 */ { 26, -8}, { -71, -116}, { 84, -84}, { -92, -56}, { 51, -157}, { -178, -14}, { -64, -407}, { -199, 82}, { -799, -1101}, { 787, -922}, { -1615, -823}, { 1604, -6683}, { 10711, 0}, { 2432, 10132}, { -5550, 2828}, { -828, -970}, { -806, 1110}, { -1148, -475}, { 13, -84}, { -418, 32}, { -38, -118}, { -155, 95}, { -56, -56}, { -71, 117}, { -114, -37}, { -3, 45} }, { { 0, 0}, /* Filter 4 */ { 23, -7}, { -72, -118}, { 82, -82}, { -96, -59}, { 50, -154}, { -187, -14}, { -64, -404}, { -221, 91}, { -810, -1115}, { 767, -898}, { -1698, -865}, { 1629, -6786}, { 10753, 0}, { 2419, 10079}, { -5453, 2778}, { -773, -905}, { -819, 1128}, { -1128, -467}, { 10, -64}, { -418, 32}, { -35, -109}, { -157, 96}, { -52, -52}, { -73, 119}, { -111, -36}, { -3, 48} }, { { 0, 0}, /* Filter 5 */ { 20, -6}, { -73, -120}, { 79, -79}, { -100, -61}, { 49, -151}, { -196, -15}, { -63, -401}, { -242, 100}, { -820, -1129}, { 745, -873}, { -1781, -907}, { 1653, -6888}, { 10792, 0}, { 2406, 10024}, { -5356, 2729}, { -718, -841}, { -831, 1145}, { -1108, -459}, { 7, -44}, { -418, 32}, { -32, -100}, { -158, 97}, { -49, -49}, { -74, 121}, { -108, -35}, { -4, 51} }, { { 0, 0}, /* Filter 6 */ { 16, -5}, { -74, -121}, { 77, -77}, { -104, -63}, { 47, -147}, { -205, -16}, { -63, -398}, { -264, 109}, { -830, -1142}, { 723, -847}, { -1866, -951}, { 1678, -6989}, { 10830, 0}, { 2392, 9967}, { -5259, 2679}, { -664, -777}, { -843, 1160}, { -1088, -450}, { 3, -24}, { -417, 32}, { -29, -92}, { -160, 98}, { -45, -45}, { -75, 123}, { -105, -34}, { -4, 54} }, { { 0, 0}, /* Filter 7 */ { 13, -4}, { -75, -123}, { 74, -74}, { -108, -66}, { 46, -143}, { -214, -16}, { -62, -394}, { -285, 118}, { -839, -1155}, { 700, -820}, { -1951, -994}, { 1702, -7090}, { 10866, 0}, { 2378, 9908}, { -5161, 2630}, { -610, -715}, { -854, 1175}, { -1067, -442}, { 0, -5}, { -416, 32}, { -27, -83}, { -161, 98}, { -41, -41}, { -76, 125}, { -102, -33}, { -4, 56} }, { { 0, 0}, /* Filter 8 */ { 10, -3}, { -76, -125}, { 72, -72}, { -111, -68}, { 45, -139}, { -222, -17}, { -61, -389}, { -307, 127}, { -848, -1167}, { 676, -792}, { -2038, -1038}, { 1726, -7190}, { 10900, 0}, { 2364, 9848}, { -5064, 2580}, { -558, -653}, { -864, 1189}, { -1046, -433}, { -2, 13}, { -414, 32}, { -24, -75}, { -162, 99}, { -38, -38}, { -77, 127}, { -99, -32}, { -4, 59} }, { { 0, 0}, /* Filter 9 */ { 6, -2}, { -77, -127}, { 69, -69}, { -115, -70}, { 43, -135}, { -231, -18}, { -60, -384}, { -330, 136}, { -857, -1179}, { 652, -763}, { -2125, -1082}, { 1750, -7290}, { 10932, 0}, { 2349, 9786}, { -4966, 2530}, { -506, -592}, { -873, 1202}, { -1025, -424}, { -5, 31}, { -412, 32}, { -21, -66}, { -162, 99}, { -34, -34}, { -78, 128}, { -96, -31}, { -4, 62} }, { { 0, 0}, /* Filter 10 */ { 3, -1}, { -78, -128}, { 66, -66}, { -118, -72}, { 42, -130}, { -240, -18}, { -60, -379}, { -352, 146}, { -865, -1191}, { 626, -733}, { -2212, -1127}, { 1774, -7389}, { 10962, 0}, { 2334, 9723}, { -4868, 2480}, { -455, -533}, { -881, 1213}, { -1003, -415}, { -7, 49}, { -410, 32}, { -18, -58}, { -163, 100}, { -30, -30}, { -79, 130}, { -93, -30}, { -5, 64} }, { { 0, 0}, /* Filter 11 */ { 0, 0}, { -79, -130}, { 63, -63}, { -122, -74}, { 41, -126}, { -248, -19}, { -59, -373}, { -375, 155}, { -873, -1201}, { 599, -702}, { -2301, -1172}, { 1797, -7487}, { 10990, 0}, { 2318, 9658}, { -4770, 2430}, { -405, -474}, { -889, 1224}, { -981, -406}, { -10, 67}, { -407, 32}, { -16, -49}, { -164, 100}, { -27, -27}, { -80, 131}, { -90, -29}, { -5, 66} }, { { 0, 0}, /* Filter 12 */ { -3, 1}, { -80, -131}, { 60, -60}, { -125, -76}, { 39, -121}, { -257, -20}, { -58, -367}, { -398, 164}, { -880, -1211}, { 572, -670}, { -2390, -1217}, { 1820, -7584}, { 11016, 0}, { 2302, 9591}, { -4672, 2380}, { -355, -416}, { -896, 1234}, { -959, -397}, { -13, 84}, { -405, 31}, { -13, -41}, { -164, 100}, { -23, -23}, { -81, 133}, { -86, -28}, { -5, 69} }, { { 0, 0}, /* Filter 13 */ { -6, 2}, { -81, -132}, { 57, -57}, { -128, -78}, { 37, -116}, { -265, -20}, { -57, -361}, { -421, 174}, { -887, -1221}, { 543, -636}, { -2480, -1263}, { 1844, -7680}, { 11040, 0}, { 2286, 9523}, { -4574, 2330}, { -307, -359}, { -903, 1243}, { -937, -388}, { -16, 101}, { -401, 31}, { -10, -33}, { -164, 100}, { -19, -19}, { -82, 134}, { -83, -27}, { -5, 71} }, { { 0, 0}, /* Filter 14 */ { -10, 3}, { -81, -133}, { 54, -54}, { -131, -80}, { 36, -111}, { -273, -21}, { -56, -354}, { -444, 183}, { -893, -1230}, { 514, -602}, { -2570, -1309}, { 1866, -7776}, { 11062, 0}, { 2269, 9453}, { -4476, 2281}, { -259, -303}, { -908, 1251}, { -914, -378}, { -18, 118}, { -398, 31}, { -8, -25}, { -164, 100}, { -15, -15}, { -82, 135}, { -80, -26}, { -5, 73} }, { { 0, 0}, /* Filter 15 */ { -13, 4}, { -82, -134}, { 51, -51}, { -134, -82}, { 34, -105}, { -281, -22}, { -54, -346}, { -467, 193}, { -899, -1238}, { 484, -567}, { -2661, -1356}, { 1889, -7871}, { 11082, 0}, { 2252, 9381}, { -4378, 2231}, { -212, -248}, { -914, 1258}, { -891, -369}, { -21, 134}, { -394, 31}, { -5, -17}, { -164, 100}, { -12, -12}, { -83, 136}, { -76, -25}, { -5, 75} }, { { 0, 0}, /* Filter 16 */ { -17, 5}, { -83, -135}, { 48, -48}, { -137, -84}, { 32, -100}, { -289, -22}, { -53, -338}, { -490, 203}, { -905, -1245}, { 453, -530}, { -2753, -1402}, { 1912, -7964}, { 11099, 0}, { 2234, 9309}, { -4281, 2181}, { -166, -194}, { -918, 1264}, { -868, -359}, { -23, 149}, { -390, 30}, { -3, -9}, { -163, 100}, { -8, -8}, { -84, 137}, { -73, -23}, { -6, 77} }, { { 0, 0}, /* Filter 17 */ { -20, 6}, { -83, -136}, { 45, -45}, { -139, -85}, { 30, -94}, { -297, -23}, { -52, -330}, { -514, 213}, { -910, -1252}, { 421, -493}, { -2845, -1449}, { 1934, -8057}, { 11115, 0}, { 2217, 9234}, { -4183, 2131}, { -120, -141}, { -922, 1269}, { -845, -350}, { -26, 164}, { -385, 30}, { 0, -1}, { -163, 100}, { -4, -4}, { -84, 137}, { -70, -22}, { -6, 79} }, { { 0, 0}, /* Filter 18 */ { -24, 7}, { -84, -137}, { 41, -41}, { -142, -87}, { 28, -88}, { -305, -24}, { -50, -321}, { -537, 222}, { -914, -1258}, { 388, -454}, { -2938, -1497}, { 1956, -8149}, { 11129, 0}, { 2198, 9158}, { -4085, 2081}, { -76, -89}, { -925, 1273}, { -822, -340}, { -28, 179}, { -380, 29}, { 2, 6}, { -162, 99}, { 0, 0}, { -84, 138}, { -66, -21}, { -6, 81} }, { { 0, 0}, /* Filter 19 */ { -27, 9}, { -84, -138}, { 38, -38}, { -144, -88}, { 26, -82}, { -312, -24}, { -49, -312}, { -561, 232}, { -918, -1264}, { 354, -415}, { -3031, -1544}, { 1978, -8239}, { 11140, 0}, { 2180, 9081}, { -3988, 2032}, { -32, -38}, { -927, 1276}, { -798, -330}, { -30, 193}, { -375, 29}, { 4, 13}, { -161, 99}, { 2, 2}, { -85, 138}, { -63, -20}, { -6, 82} }, { { 0, 0}, /* Filter 20 */ { -31, 10}, { -85, -138}, { 34, -34}, { -147, -90}, { 24, -76}, { -319, -25}, { -47, -302}, { -585, 242}, { -922, -1269}, { 319, -374}, { -3125, -1592}, { 1999, -8329}, { 11149, 0}, { 2161, 9003}, { -3891, 1982}, { 9, 11}, { -929, 1279}, { -775, -321}, { -32, 207}, { -370, 29}, { 6, 21}, { -160, 98}, { 6, 6}, { -85, 139}, { -59, -19}, { -6, 84} }, { { 0, 0}, /* Filter 21 */ { -34, 11}, { -85, -139}, { 31, -31}, { -149, -91}, { 22, -70}, { -326, -25}, { -46, -292}, { -609, 252}, { -924, -1273}, { 284, -332}, { -3220, -1640}, { 2020, -8417}, { 11157, 0}, { 2142, 8923}, { -3794, 1933}, { 51, 60}, { -930, 1280}, { -751, -311}, { -35, 221}, { -365, 28}, { 9, 28}, { -159, 97}, { 10, 10}, { -85, 139}, { -56, -18}, { -6, 85} }, { { 0, 0}, /* Filter 22 */ { -38, 12}, { -85, -139}, { 28, -28}, { -151, -92}, { 20, -63}, { -333, -26}, { -44, -281}, { -632, 262}, { -927, -1276}, { 247, -290}, { -3314, -1689}, { 2041, -8505}, { 11162, 0}, { 2122, 8842}, { -3697, 1884}, { 92, 108}, { -931, 1281}, { -727, -301}, { -37, 234}, { -359, 28}, { 11, 35}, { -158, 96}, { 13, 13}, { -85, 139}, { -52, -17}, { -6, 87} }, { { 0, 0}, /* Filter 23 */ { -41, 13}, { -85, -139}, { 24, -24}, { -153, -93}, { 18, -56}, { -340, -26}, { -42, -270}, { -656, 271}, { -929, -1278}, { 210, -246}, { -3410, -1737}, { 2062, -8591}, { 11165, 0}, { 2103, 8759}, { -3601, 1835}, { 132, 155}, { -931, 1281}, { -704, -291}, { -39, 246}, { -353, 27}, { 13, 43}, { -156, 96}, { 17, 17}, { -85, 139}, { -49, -15}, { -6, 88} }, { { 0, 0}, /* Filter 24 */ { -45, 14}, { -85, -139}, { 21, -21}, { -155, -95}, { 16, -50}, { -347, -27}, { -40, -258}, { -680, 281}, { -930, -1280}, { 172, -201}, { -3505, -1786}, { 2082, -8676}, { 11166, 0}, { 2082, 8676}, { -3505, 1786}, { 172, 201}, { -930, 1280}, { -680, -281}, { -40, 258}, { -347, 27}, { 16, 50}, { -155, 95}, { 21, 21}, { -85, 139}, { -45, -14}, { -7, 89} }, { { 0, 0}, /* Filter 25 */ { -49, 15}, { -85, -139}, { 17, -17}, { -156, -96}, { 13, -43}, { -353, -27}, { -39, -246}, { -704, 291}, { -931, -1281}, { 132, -155}, { -3601, -1835}, { 2103, -8759}, { 11165, 0}, { 2062, 8591}, { -3410, 1737}, { 210, 246}, { -929, 1278}, { -656, -271}, { -42, 270}, { -340, 26}, { 18, 56}, { -153, 93}, { 24, 24}, { -85, 139}, { -41, -13}, { -7, 91} }, { { 0, 0}, /* Filter 26 */ { -52, 17}, { -85, -139}, { 13, -13}, { -158, -96}, { 11, -35}, { -359, -28}, { -37, -234}, { -727, 301}, { -931, -1281}, { 92, -108}, { -3697, -1884}, { 2122, -8842}, { 11162, 0}, { 2041, 8505}, { -3314, 1689}, { 247, 290}, { -927, 1276}, { -632, -262}, { -44, 281}, { -333, 26}, { 20, 63}, { -151, 92}, { 28, 28}, { -85, 139}, { -38, -12}, { -7, 92} }, { { 0, 0}, /* Filter 27 */ { -56, 18}, { -85, -139}, { 10, -10}, { -159, -97}, { 9, -28}, { -365, -28}, { -35, -221}, { -751, 311}, { -930, -1280}, { 51, -60}, { -3794, -1933}, { 2142, -8923}, { 11157, 0}, { 2020, 8417}, { -3220, 1640}, { 284, 332}, { -924, 1273}, { -609, -252}, { -46, 292}, { -326, 25}, { 22, 70}, { -149, 91}, { 31, 31}, { -85, 139}, { -34, -11}, { -7, 93} }, { { 0, 0}, /* Filter 28 */ { -59, 19}, { -85, -139}, { 6, -6}, { -160, -98}, { 6, -21}, { -370, -29}, { -32, -207}, { -775, 321}, { -929, -1279}, { 9, -11}, { -3891, -1982}, { 2161, -9003}, { 11149, 0}, { 1999, 8329}, { -3125, 1592}, { 319, 374}, { -922, 1269}, { -585, -242}, { -47, 302}, { -319, 25}, { 24, 76}, { -147, 90}, { 34, 34}, { -85, 138}, { -31, -10}, { -7, 94} }, { { 0, 0}, /* Filter 29 */ { -63, 20}, { -85, -138}, { 2, -2}, { -161, -99}, { 4, -13}, { -375, -29}, { -30, -193}, { -798, 330}, { -927, -1276}, { -32, 38}, { -3988, -2032}, { 2180, -9081}, { 11140, 0}, { 1978, 8239}, { -3031, 1544}, { 354, 415}, { -918, 1264}, { -561, -232}, { -49, 312}, { -312, 24}, { 26, 82}, { -144, 88}, { 38, 38}, { -84, 138}, { -27, -9}, { -7, 94} }, { { 0, 0}, /* Filter 30 */ { -66, 21}, { -84, -138}, { 0, 0}, { -162, -99}, { 2, -6}, { -380, -29}, { -28, -179}, { -822, 340}, { -925, -1273}, { -76, 89}, { -4085, -2081}, { 2198, -9158}, { 11129, 0}, { 1956, 8149}, { -2938, 1497}, { 388, 454}, { -914, 1258}, { -537, -222}, { -50, 321}, { -305, 24}, { 28, 88}, { -142, 87}, { 41, 41}, { -84, 137}, { -24, -7}, { -7, 95} }, { { 0, 0}, /* Filter 31 */ { -70, 22}, { -84, -137}, { -4, 4}, { -163, -100}, { 0, 1}, { -385, -30}, { -26, -164}, { -845, 350}, { -922, -1269}, { -120, 141}, { -4183, -2131}, { 2217, -9234}, { 11115, 0}, { 1934, 8057}, { -2845, 1449}, { 421, 493}, { -910, 1252}, { -514, -213}, { -52, 330}, { -297, 23}, { 30, 94}, { -139, 85}, { 45, 45}, { -83, 136}, { -20, -6}, { -7, 96} }, { { 0, 0}, /* Filter 32 */ { -73, 23}, { -84, -137}, { -8, 8}, { -163, -100}, { -3, 9}, { -390, -30}, { -23, -149}, { -868, 359}, { -918, -1264}, { -166, 194}, { -4281, -2181}, { 2234, -9309}, { 11099, 0}, { 1912, 7964}, { -2753, 1402}, { 453, 530}, { -905, 1245}, { -490, -203}, { -53, 338}, { -289, 22}, { 32, 100}, { -137, 84}, { 48, 48}, { -83, 135}, { -17, -5}, { -7, 96} }, { { 0, 0}, /* Filter 33 */ { -76, 25}, { -83, -136}, { -12, 12}, { -164, -100}, { -5, 17}, { -394, -31}, { -21, -134}, { -891, 369}, { -914, -1258}, { -212, 248}, { -4378, -2231}, { 2252, -9381}, { 11082, 0}, { 1889, 7871}, { -2661, 1356}, { 484, 567}, { -899, 1238}, { -467, -193}, { -54, 346}, { -281, 22}, { 34, 105}, { -134, 82}, { 51, 51}, { -82, 134}, { -13, -4}, { -7, 97} }, { { 0, 0}, /* Filter 34 */ { -80, 26}, { -82, -135}, { -15, 15}, { -164, -100}, { -8, 25}, { -398, -31}, { -18, -118}, { -914, 378}, { -908, -1251}, { -259, 303}, { -4476, -2281}, { 2269, -9453}, { 11062, 0}, { 1866, 7776}, { -2570, 1309}, { 514, 602}, { -893, 1230}, { -444, -183}, { -56, 354}, { -273, 21}, { 36, 111}, { -131, 80}, { 54, 54}, { -81, 133}, { -10, -3}, { -7, 97} }, { { 0, 0}, /* Filter 35 */ { -83, 27}, { -82, -134}, { -19, 19}, { -164, -100}, { -10, 33}, { -401, -31}, { -16, -101}, { -937, 388}, { -903, -1243}, { -307, 359}, { -4574, -2330}, { 2286, -9523}, { 11040, 0}, { 1844, 7680}, { -2480, 1263}, { 543, 636}, { -887, 1221}, { -421, -174}, { -57, 361}, { -265, 20}, { 37, 116}, { -128, 78}, { 57, 57}, { -81, 132}, { -6, -2}, { -7, 97} }, { { 0, 0}, /* Filter 36 */ { -86, 28}, { -81, -133}, { -23, 23}, { -164, -100}, { -13, 41}, { -405, -31}, { -13, -84}, { -959, 397}, { -896, -1234}, { -355, 416}, { -4672, -2380}, { 2302, -9591}, { 11016, 0}, { 1820, 7584}, { -2390, 1217}, { 572, 670}, { -880, 1211}, { -398, -164}, { -58, 367}, { -257, 20}, { 39, 121}, { -125, 76}, { 60, 60}, { -80, 131}, { -3, -1}, { -7, 98} }, { { 0, 0}, /* Filter 37 */ { -90, 29}, { -80, -131}, { -27, 27}, { -164, -100}, { -16, 49}, { -407, -32}, { -10, -67}, { -981, 406}, { -889, -1224}, { -405, 474}, { -4770, -2430}, { 2318, -9658}, { 10990, 0}, { 1797, 7487}, { -2301, 1172}, { 599, 702}, { -873, 1201}, { -375, -155}, { -59, 373}, { -248, 19}, { 41, 126}, { -122, 74}, { 63, 63}, { -79, 130}, { 0, 0}, { -7, 98} }, { { 0, 0}, /* Filter 38 */ { -93, 30}, { -79, -130}, { -30, 30}, { -163, -100}, { -18, 58}, { -410, -32}, { -7, -49}, { -1003, 415}, { -881, -1213}, { -455, 533}, { -4868, -2480}, { 2334, -9723}, { 10962, 0}, { 1774, 7389}, { -2212, 1127}, { 626, 733}, { -865, 1191}, { -352, -146}, { -60, 379}, { -240, 18}, { 42, 130}, { -118, 72}, { 66, 66}, { -78, 128}, { 3, 1}, { -7, 98} }, { { 0, 0}, /* Filter 39 */ { -96, 31}, { -78, -128}, { -34, 34}, { -162, -99}, { -21, 66}, { -412, -32}, { -5, -31}, { -1025, 424}, { -873, -1202}, { -506, 592}, { -4966, -2530}, { 2349, -9786}, { 10932, 0}, { 1750, 7290}, { -2125, 1082}, { 652, 763}, { -857, 1179}, { -330, -136}, { -60, 384}, { -231, 18}, { 43, 135}, { -115, 70}, { 69, 69}, { -77, 127}, { 6, 2}, { -7, 98} }, { { 0, 0}, /* Filter 40 */ { -99, 32}, { -77, -127}, { -38, 38}, { -162, -99}, { -24, 75}, { -414, -32}, { -2, -13}, { -1046, 433}, { -864, -1189}, { -558, 653}, { -5064, -2580}, { 2364, -9848}, { 10900, 0}, { 1726, 7190}, { -2038, 1038}, { 676, 792}, { -848, 1167}, { -307, -127}, { -61, 389}, { -222, 17}, { 45, 139}, { -111, 68}, { 72, 72}, { -76, 125}, { 10, 3}, { -7, 98} }, { { 0, 0}, /* Filter 41 */ { -102, 33}, { -76, -125}, { -41, 41}, { -161, -98}, { -27, 83}, { -416, -32}, { 0, 5}, { -1067, 442}, { -854, -1175}, { -610, 715}, { -5161, -2630}, { 2378, -9908}, { 10866, 0}, { 1702, 7090}, { -1951, 994}, { 700, 820}, { -839, 1155}, { -285, -118}, { -62, 394}, { -214, 16}, { 46, 143}, { -108, 66}, { 74, 74}, { -75, 123}, { 13, 4}, { -7, 97} }, { { 0, 0}, /* Filter 42 */ { -105, 34}, { -75, -123}, { -45, 45}, { -160, -98}, { -29, 92}, { -417, -32}, { 3, 24}, { -1088, 450}, { -843, -1160}, { -664, 777}, { -5259, -2679}, { 2392, -9967}, { 10830, 0}, { 1678, 6989}, { -1866, 951}, { 723, 847}, { -830, 1142}, { -264, -109}, { -63, 398}, { -205, 16}, { 47, 147}, { -104, 63}, { 77, 77}, { -74, 121}, { 16, 5}, { -7, 97} }, { { 0, 0}, /* Filter 43 */ { -108, 35}, { -74, -121}, { -49, 49}, { -158, -97}, { -32, 100}, { -418, -32}, { 7, 44}, { -1108, 459}, { -831, -1145}, { -718, 841}, { -5356, -2729}, { 2406, -10024}, { 10792, 0}, { 1653, 6888}, { -1781, 907}, { 745, 873}, { -820, 1129}, { -242, -100}, { -63, 401}, { -196, 15}, { 49, 151}, { -100, 61}, { 79, 79}, { -73, 120}, { 20, 6}, { -7, 97} }, { { 0, 0}, /* Filter 44 */ { -111, 36}, { -73, -119}, { -52, 52}, { -157, -96}, { -35, 109}, { -418, -32}, { 10, 64}, { -1128, 467}, { -819, -1128}, { -773, 905}, { -5453, -2778}, { 2419, -10079}, { 10753, 0}, { 1629, 6786}, { -1698, 865}, { 767, 898}, { -810, 1115}, { -221, -91}, { -64, 404}, { -187, 14}, { 50, 154}, { -96, 59}, { 82, 82}, { -72, 118}, { 23, 7}, { -7, 96} }, { { 0, 0}, /* Filter 45 */ { -114, 37}, { -71, -117}, { -56, 56}, { -155, -95}, { -38, 118}, { -418, -32}, { 13, 84}, { -1148, 475}, { -806, -1110}, { -828, 970}, { -5550, -2828}, { 2432, -10132}, { 10711, 0}, { 1604, 6683}, { -1615, 823}, { 787, 922}, { -799, 1101}, { -199, -82}, { -64, 407}, { -178, 14}, { 51, 157}, { -92, 56}, { 84, 84}, { -71, 116}, { 26, 8}, { -7, 96} }, { { 0, 0}, /* Filter 46 */ { -116, 38}, { -70, -115}, { -59, 59}, { -153, -94}, { -41, 126}, { -418, -32}, { 16, 105}, { -1167, 483}, { -793, -1091}, { -885, 1036}, { -5647, -2877}, { 2445, -10184}, { 10667, 0}, { 1579, 6580}, { -1533, 781}, { 807, 944}, { -789, 1086}, { -179, -74}, { -64, 409}, { -169, 13}, { 52, 161}, { -88, 54}, { 87, 87}, { -69, 113}, { 29, 9}, { -7, 95} }, { { 0, 0}, /* Filter 47 */ { -119, 38}, { -69, -112}, { -63, 63}, { -151, -92}, { -44, 135}, { -418, -32}, { 20, 126}, { -1186, 491}, { -778, -1071}, { -942, 1103}, { -5743, -2926}, { 2457, -10234}, { 10621, 0}, { 1554, 6476}, { -1452, 739}, { 825, 966}, { -778, 1070}, { -158, -65}, { -65, 411}, { -160, 12}, { 53, 163}, { -84, 51}, { 89, 89}, { -68, 111}, { 32, 10}, { -7, 94} } }; iaxmodem-1.2.0/lib/spandsp/src/t30.c0000644000175000017500000056666411150047216016456 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * t30.c - ITU T.30 FAX transfer processing * * Written by Steve Underwood * * Copyright (C) 2003, 2004, 2005, 2006, 2007 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: t30.c,v 1.252 2008/07/22 13:58:40 steveu Exp $ */ /*! \file */ #if defined(HAVE_CONFIG_H) #include #endif #include #include #include #include #include #include #include "floating_fudge.h" #if defined(HAVE_TGMATH_H) #include #endif #if defined(HAVE_MATH_H) #include #endif #include #include "spandsp/telephony.h" #include "spandsp/logging.h" #include "spandsp/bit_operations.h" #include "spandsp/queue.h" #include "spandsp/power_meter.h" #include "spandsp/complex.h" #include "spandsp/tone_generate.h" #include "spandsp/async.h" #include "spandsp/hdlc.h" #include "spandsp/fsk.h" #include "spandsp/v29rx.h" #include "spandsp/v29tx.h" #include "spandsp/v27ter_rx.h" #include "spandsp/v27ter_tx.h" #include "spandsp/t4.h" #include "spandsp/t30_fcf.h" #include "spandsp/t35.h" #include "spandsp/t30.h" #include "spandsp/t30_api.h" #include "spandsp/t30_logging.h" #include "t30_local.h" #define MAX_MESSAGE_TRIES 3 #define ms_to_samples(t) (((t)*SAMPLE_RATE)/1000) /* T.30 defines the following call phases: Phase A: Call set-up. Exchange of CNG, CED and the called terminal identification. Phase B: Pre-message procedure for identifying and selecting the required facilities. Capabilities negotiation, and training, up the the confirmation to receive. Phase C: Message transmission (includes phasing and synchronization where appropriate). Transfer of the message at high speed. Phase D: Post-message procedure, including end-of-message and confirmation and multi-document procedures. End of message and acknowledgement. Phase E: Call release Final call disconnect. */ enum { T30_PHASE_IDLE = 0, /* Freshly initialised */ T30_PHASE_A_CED, /* Doing the CED (answer) sequence */ T30_PHASE_A_CNG, /* Doing the CNG (caller) sequence */ T30_PHASE_B_RX, /* Receiving pre-message control messages */ T30_PHASE_B_TX, /* Transmitting pre-message control messages */ T30_PHASE_C_NON_ECM_RX, /* Receiving a document message in non-ECM mode */ T30_PHASE_C_NON_ECM_TX, /* Transmitting a document message in non-ECM mode */ T30_PHASE_C_ECM_RX, /* Receiving a document message in ECM (HDLC) mode */ T30_PHASE_C_ECM_TX, /* Transmitting a document message in ECM (HDLC) mode */ T30_PHASE_D_RX, /* Receiving post-message control messages */ T30_PHASE_D_TX, /* Transmitting post-message control messages */ T30_PHASE_E, /* In phase E */ T30_PHASE_CALL_FINISHED /* Call completely finished */ }; static const char *phase_names[] = { "T30_PHASE_IDLE", "T30_PHASE_A_CED", "T30_PHASE_A_CNG", "T30_PHASE_B_RX", "T30_PHASE_B_TX", "T30_PHASE_C_NON_ECM_RX", "T30_PHASE_C_NON_ECM_TX", "T30_PHASE_C_ECM_RX", "T30_PHASE_C_ECM_TX", "T30_PHASE_D_RX", "T30_PHASE_D_TX", "T30_PHASE_E", "T30_PHASE_CALL_FINISHED" }; /* These state names are modelled after places in the T.30 flow charts. */ enum { T30_STATE_ANSWERING = 1, T30_STATE_B, T30_STATE_C, T30_STATE_D, T30_STATE_D_TCF, T30_STATE_D_POST_TCF, T30_STATE_F_TCF, T30_STATE_F_CFR, T30_STATE_F_FTT, T30_STATE_F_DOC_NON_ECM, T30_STATE_F_POST_DOC_NON_ECM, T30_STATE_F_DOC_ECM, T30_STATE_F_POST_DOC_ECM, T30_STATE_F_POST_RCP_MCF, T30_STATE_F_POST_RCP_PPR, T30_STATE_F_POST_RCP_RNR, T30_STATE_R, T30_STATE_T, T30_STATE_I, T30_STATE_II, T30_STATE_II_Q, T30_STATE_III_Q_MCF, T30_STATE_III_Q_RTP, T30_STATE_III_Q_RTN, T30_STATE_IV, T30_STATE_IV_PPS_NULL, T30_STATE_IV_PPS_Q, T30_STATE_IV_PPS_RNR, T30_STATE_IV_CTC, T30_STATE_IV_EOR, T30_STATE_IV_EOR_RNR, T30_STATE_CALL_FINISHED }; enum { T30_MIN_SCAN_20MS = 0, T30_MIN_SCAN_5MS = 1, T30_MIN_SCAN_10MS = 2, T30_MIN_SCAN_40MS = 4, T30_MIN_SCAN_0MS = 7, }; enum { T30_MODE_SEND_DOC = 1, T30_MODE_RECEIVE_DOC }; /*! These are internal assessments of received image quality, used to determine whether we continue, retrain, or abandon the call. */ enum { T30_COPY_QUALITY_PERFECT = 0, T30_COPY_QUALITY_GOOD, T30_COPY_QUALITY_POOR, T30_COPY_QUALITY_BAD }; enum { DISBIT1 = 0x01, DISBIT2 = 0x02, DISBIT3 = 0x04, DISBIT4 = 0x08, DISBIT5 = 0x10, DISBIT6 = 0x20, DISBIT7 = 0x40, DISBIT8 = 0x80 }; /*! There are high level indications of what is happening at any instant, to guide the cleanup process if the call is abandoned. */ enum { OPERATION_IN_PROGRESS_NONE = 0, OPERATION_IN_PROGRESS_T4_RX, OPERATION_IN_PROGRESS_T4_TX }; /* All timers specified in milliseconds */ /* Time-out T0 defines the amount of time an automatic calling terminal waits for the called terminal to answer the call. T0 begins after the dialling of the number is completed and is reset: a) when T0 times out; or b) when timer T1 is started; or c) if the terminal is capable of detecting any condition which indicates that the call will not be successful, when such a condition is detected. The recommended value of T0 is 60+-5s; however, when it is anticipated that a long call set-up time may be encountered, an alternative value of up to 120s may be used. NOTE - National regulations may require the use of other values for T0. */ #define DEFAULT_TIMER_T0 60000 /* Time-out T1 defines the amount of time two terminals will continue to attempt to identify each other. T1 is 35+-5s, begins upon entering phase B, and is reset upon detecting a valid signal or when T1 times out. For operating methods 3 and 4 (see 3.1), the calling terminal starts time-out T1 upon reception of the V.21 modulation scheme. For operating method 4 bis a (see 3.1), the calling terminal starts time-out T1 upon starting transmission using the V.21 modulation scheme. */ #define DEFAULT_TIMER_T1 35000 /* Time-out T2 makes use of the tight control between commands and responses to detect the loss of command/response synchronization. T2 is 6+-1s and begins when initiating a command search (e.g., the first entrance into the "command received" subroutine, reference flow diagram in 5.2). T2 is reset when an HDLC flag is received or when T2 times out. */ #define DEFAULT_TIMER_T2 7000 /* Time-out T3 defines the amount of time a terminal will attempt to alert the local operator in response to a procedural interrupt. Failing to achieve operator intervention, the terminal will discontinue this attempt and shall issue other commands or responses. T3 is 10+-5s, begins on the first detection of a procedural interrupt command/response signal (i.e., PIN/PIP or PRI-Q) and is reset when T3 times out or when the operator initiates a line request. */ #define DEFAULT_TIMER_T3 15000 /* NOTE - For manual FAX units, the value of timer T4 may be either 3.0s +-15% or 4.5s +-15%. If the value of 4.5s is used, then after detection of a valid response to the first DIS, it may be reduced to 3.0s +-15%. T4 = 3.0s +-15% for automatic units. */ #define DEFAULT_TIMER_T4 3450 /* Time-out T5 is defined for the optional T.4 error correction mode. Time-out T5 defines the amount of time waiting for clearance of the busy condition of the receiving terminal. T5 is 60+-5s and begins on the first detection of the RNR response. T5 is reset when T5 times out or the MCF or PIP response is received or when the ERR or PIN response is received in the flow control process after transmitting the EOR command. If the timer T5 has expired, the DCN command is transmitted for call release. */ #define DEFAULT_TIMER_T5 65000 #define DEFAULT_TIMER_T6 5000 #define DEFAULT_TIMER_T7 6000 #define DEFAULT_TIMER_T8 10000 /* Final time we allow for things to flush through the system, before we disconnect, in milliseconds. 200ms should be fine for a PSTN call. For a T.38 call something longer is desirable. */ #define FINAL_FLUSH_TIME 1000 /* The number of PPRs received before CTC or EOR is sent in ECM mode. T.30 defines this as 4, but it could be varied, and the Japanese spec, for example, does make this value a variable. */ #define PPR_LIMIT_BEFORE_CTC_OR_EOR 4 /* Start points in the fallback table for different capabilities */ #define T30_V17_FALLBACK_START 0 #define T30_V29_FALLBACK_START 3 #define T30_V27TER_FALLBACK_START 6 static const struct { int bit_rate; int modem_type; int which; uint8_t dcs_code; } fallback_sequence[] = { {14400, T30_MODEM_V17_14400, T30_SUPPORT_V17, DISBIT6}, {12000, T30_MODEM_V17_12000, T30_SUPPORT_V17, (DISBIT6 | DISBIT4)}, { 9600, T30_MODEM_V17_9600, T30_SUPPORT_V17, (DISBIT6 | DISBIT3)}, { 9600, T30_MODEM_V29_9600, T30_SUPPORT_V29, DISBIT3}, { 7200, T30_MODEM_V17_7200, T30_SUPPORT_V17, (DISBIT6 | DISBIT4 | DISBIT3)}, { 7200, T30_MODEM_V29_7200, T30_SUPPORT_V29, (DISBIT4 | DISBIT3)}, { 4800, T30_MODEM_V27TER_4800, T30_SUPPORT_V27TER, DISBIT4}, { 2400, T30_MODEM_V27TER_2400, T30_SUPPORT_V27TER, 0}, { 0, 0, 0, 0} }; static void queue_phase(t30_state_t *s, int phase); static void set_phase(t30_state_t *s, int phase); static void set_state(t30_state_t *s, int state); static void send_simple_frame(t30_state_t *s, int type); static void send_frame(t30_state_t *s, const uint8_t *fr, int frlen); static void send_dcn(t30_state_t *s); static void repeat_last_command(t30_state_t *s); static void disconnect(t30_state_t *s); static void decode_20digit_msg(t30_state_t *s, char *msg, const uint8_t *pkt, int len); static void decode_url_msg(t30_state_t *s, char *msg, const uint8_t *pkt, int len); static int set_min_scan_time_code(t30_state_t *s); static int send_cfr_sequence(t30_state_t *s, int start); static void timer_t2_start(t30_state_t *s); static void timer_t4_start(t30_state_t *s); #define test_ctrl_bit(s,bit) ((s)[3 + ((bit - 1)/8)] & (1 << ((bit - 1)%8))) #define set_ctrl_bit(s,bit) (s)[3 + ((bit - 1)/8)] |= (1 << ((bit - 1)%8)) #define set_ctrl_bits(s,val,bit) (s)[3 + ((bit - 1)/8)] |= ((val) << ((bit - 1)%8)) #define clr_ctrl_bit(s,bit) (s)[3 + ((bit - 1)/8)] &= ~(1 << ((bit - 1)%8)) static int tx_start_page(t30_state_t *s) { if (t4_tx_start_page(&(s->t4))) { t4_tx_end(&(s->t4)); s->operation_in_progress = OPERATION_IN_PROGRESS_NONE; return -1; } s->ecm_page++; s->ecm_block = 0; span_log(&s->logging, SPAN_LOG_FLOW, "Starting page %d of transfer\n", s->ecm_page + 1); return 0; } /*- End of function --------------------------------------------------------*/ static int rx_start_page(t30_state_t *s) { int i; t4_rx_set_image_width(&(s->t4), s->image_width); t4_rx_set_sub_address(&(s->t4), s->rx_info.sub_address); t4_rx_set_dcs(&(s->t4), s->rx_dcs_string); t4_rx_set_far_ident(&(s->t4), s->rx_info.ident); t4_rx_set_vendor(&(s->t4), s->vendor); t4_rx_set_model(&(s->t4), s->model); t4_rx_set_rx_encoding(&(s->t4), s->line_encoding); t4_rx_set_x_resolution(&(s->t4), s->x_resolution); t4_rx_set_y_resolution(&(s->t4), s->y_resolution); if (t4_rx_start_page(&(s->t4))) return -1; /* Clear the buffer */ for (i = 0; i < 256; i++) s->ecm_len[i] = -1; s->ecm_page++; s->ecm_block = 0; s->ecm_frames = -1; s->ecm_frames_this_tx_burst = 0; return 0; } /*- End of function --------------------------------------------------------*/ static int copy_quality(t30_state_t *s) { t4_stats_t stats; int quality; t4_get_transfer_statistics(&(s->t4), &stats); /* There is no specification for judging copy quality. However, we need to classify it at three levels, to control what we do next: OK; tolerable, but retrain; intolerable. */ /* Based on the thresholds used in the TSB85 tests, we consider: <5% bad rows is OK <15% bad rows to be tolerable, but retrain >15% bad rows to be intolerable */ span_log(&s->logging, SPAN_LOG_FLOW, "Page no = %d\n", stats.pages_transferred + 1); span_log(&s->logging, SPAN_LOG_FLOW, "Image size = %d x %d pixels\n", stats.width, stats.length); span_log(&s->logging, SPAN_LOG_FLOW, "Image resolution = %d/m x %d/m\n", stats.x_resolution, stats.y_resolution); span_log(&s->logging, SPAN_LOG_FLOW, "Bad rows = %d\n", stats.bad_rows); span_log(&s->logging, SPAN_LOG_FLOW, "Longest bad row run = %d\n", stats.longest_bad_row_run); if (stats.bad_rows == 0) { span_log(&s->logging, SPAN_LOG_FLOW, "Page quality is perfect\n"); quality = T30_COPY_QUALITY_PERFECT; } else if (stats.bad_rows*20 < stats.length) { span_log(&s->logging, SPAN_LOG_FLOW, "Page quality is good\n"); quality = T30_COPY_QUALITY_GOOD; } else if (stats.bad_rows*20 < stats.length*3) { span_log(&s->logging, SPAN_LOG_FLOW, "Page quality is poor\n"); quality = T30_COPY_QUALITY_POOR; } else { span_log(&s->logging, SPAN_LOG_FLOW, "Page quality is bad\n"); quality = T30_COPY_QUALITY_BAD; } return quality; } /*- End of function --------------------------------------------------------*/ static void release_resources(t30_state_t *s) { if (s->tx_info.nsf) { free(s->tx_info.nsf); s->tx_info.nsf = NULL; } s->tx_info.nsf_len = 0; if (s->tx_info.nsc) { free(s->tx_info.nsc); s->tx_info.nsc = NULL; } s->tx_info.nsc_len = 0; if (s->tx_info.nss) { free(s->tx_info.nss); s->tx_info.nss = NULL; } s->tx_info.nss_len = 0; if (s->tx_info.tsa) { free(s->tx_info.tsa); s->tx_info.tsa = NULL; } if (s->tx_info.ira) { free(s->tx_info.ira); s->tx_info.ira = NULL; } if (s->tx_info.cia) { free(s->tx_info.cia); s->tx_info.cia = NULL; } if (s->tx_info.isp) { free(s->tx_info.isp); s->tx_info.isp = NULL; } if (s->tx_info.csa) { free(s->tx_info.csa); s->tx_info.csa = NULL; } if (s->rx_info.nsf) { free(s->rx_info.nsf); s->rx_info.nsf = NULL; } s->rx_info.nsf_len = 0; if (s->rx_info.nsc) { free(s->rx_info.nsc); s->rx_info.nsc = NULL; } s->rx_info.nsc_len = 0; if (s->rx_info.nss) { free(s->rx_info.nss); s->rx_info.nss = NULL; } s->rx_info.nss_len = 0; if (s->rx_info.tsa) { free(s->rx_info.tsa); s->rx_info.tsa = NULL; } if (s->rx_info.ira) { free(s->rx_info.ira); s->rx_info.ira = NULL; } if (s->rx_info.cia) { free(s->rx_info.cia); s->rx_info.cia = NULL; } if (s->rx_info.isp) { free(s->rx_info.isp); s->rx_info.isp = NULL; } if (s->rx_info.csa) { free(s->rx_info.csa); s->rx_info.csa = NULL; } } /*- End of function --------------------------------------------------------*/ static int check_next_tx_step(t30_state_t *s) { int more; if (t4_tx_more_pages(&(s->t4)) == 0) return (s->local_interrupt_pending) ? T30_PRI_MPS : T30_MPS; /* Call a user handler, if one is set, to check if another document is to be sent. If so, we send an EOM, rather than an EOP. Then we will renegotiate, and the new document will begin. */ if (s->document_handler) more = s->document_handler(s, s->document_user_data, 0); else more = FALSE; if (more) return (s->local_interrupt_pending) ? T30_PRI_EOM : T30_EOM; return (s->local_interrupt_pending) ? T30_PRI_EOP : T30_EOP; } /*- End of function --------------------------------------------------------*/ static int get_partial_ecm_page(t30_state_t *s) { int i; int len; s->ppr_count = 0; s->ecm_progress = 0; /* Fill our partial page buffer with a partial page. Use the negotiated preferred frame size as the basis for the size of the frames produced. */ /* We fill the buffer with complete HDLC frames, ready to send out. */ /* The frames are all marked as not being final frames. When sent, the are followed by a partial page signal, which is marked as the final frame. */ for (i = 3; i < 32 + 3; i++) s->ecm_frame_map[i] = 0xFF; for (i = 0; i < 256; i++) { s->ecm_len[i] = -1; s->ecm_data[i][0] = 0xFF; s->ecm_data[i][1] = 0x03; s->ecm_data[i][2] = T4_FCD; /* These frames contain a frame sequence number within the partial page (one octet) followed by some image data. */ s->ecm_data[i][3] = (uint8_t) i; if ((len = t4_tx_get_chunk(&(s->t4), &s->ecm_data[i][4], s->octets_per_ecm_frame)) < s->octets_per_ecm_frame) { /* The image is not big enough to fill the entire buffer */ /* We need to pad to a full frame, as most receivers expect that. */ if (len > 0) { memset(&s->ecm_data[i][4 + len], 0, s->octets_per_ecm_frame - len); s->ecm_len[i++] = (int16_t) (s->octets_per_ecm_frame + 4); } s->ecm_frames = i; span_log(&s->logging, SPAN_LOG_FLOW, "Partial page buffer contains %d frames (%d per frame)\n", i, s->octets_per_ecm_frame); s->ecm_at_page_end = TRUE; return i; } s->ecm_len[i] = (int16_t) 4 + len; } /* We filled the entire buffer */ s->ecm_frames = 256; span_log(&s->logging, SPAN_LOG_FLOW, "Partial page buffer full (%d per frame)\n", s->octets_per_ecm_frame); s->ecm_at_page_end = ((t4_tx_check_bit(&(s->t4)) & 2) != 0); return 256; } /*- End of function --------------------------------------------------------*/ static int t30_ecm_commit_partial_page(t30_state_t *s) { int i; span_log(&s->logging, SPAN_LOG_FLOW, "Commiting partial page - %d frames\n", s->ecm_frames); for (i = 0; i < s->ecm_frames; i++) { if (t4_rx_put_chunk(&(s->t4), s->ecm_data[i], s->ecm_len[i])) { /* This is the end of the document */ /* Clear the buffer */ for (i = 0; i < 256; i++) s->ecm_len[i] = -1; s->ecm_frames = -1; return -1; } } /* Clear the buffer */ for (i = 0; i < 256; i++) s->ecm_len[i] = -1; s->ecm_frames = -1; return 0; } /*- End of function --------------------------------------------------------*/ static int send_next_ecm_frame(t30_state_t *s) { int i; uint8_t frame[3]; if (s->ecm_current_tx_frame < s->ecm_frames) { /* Search for the next frame, within the current partial page, which has not been tagged as transferred OK. */ for (i = s->ecm_current_tx_frame; i < s->ecm_frames; i++) { if (s->ecm_len[i] >= 0) { send_frame(s, s->ecm_data[i], s->ecm_len[i]); s->ecm_current_tx_frame = i + 1; s->ecm_frames_this_tx_burst++; return 0; } } s->ecm_current_tx_frame = s->ecm_frames; } if (s->ecm_current_tx_frame <= s->ecm_frames + 3) { /* We have sent all the FCD frames. Send some RCP frames. Three seems to be a popular number, to minimise the risk of a bit error stopping the receiving end from recognising the RCP. */ s->ecm_current_tx_frame++; /* The RCP frame is an odd man out, as its a simple 1 byte control frame, but is specified to not have the final bit set. It doesn't seem to have the DIS received bit set, either. */ frame[0] = 0xFF; frame[1] = 0x03; frame[2] = T4_RCP; send_frame(s, frame, 3); /* In case we are just after a CTC/CTR exchange, which kicked us back to long training */ s->short_train = TRUE; return 0; } return -1; } /*- End of function --------------------------------------------------------*/ static int send_first_ecm_frame(t30_state_t *s) { s->ecm_current_tx_frame = 0; s->ecm_frames_this_tx_burst = 0; return send_next_ecm_frame(s); } /*- End of function --------------------------------------------------------*/ static void print_frame(t30_state_t *s, const char *io, const uint8_t *msg, int len) { span_log(&s->logging, SPAN_LOG_FLOW, "%s %s with%s final frame tag\n", io, t30_frametype(msg[2]), (msg[1] & 0x10) ? "" : "out"); span_log_buf(&s->logging, SPAN_LOG_FLOW, io, msg, len); } /*- End of function --------------------------------------------------------*/ static void send_frame(t30_state_t *s, const uint8_t *msg, int len) { print_frame(s, "Tx: ", msg, len); if (s->real_time_frame_handler) s->real_time_frame_handler(s, s->real_time_frame_user_data, FALSE, msg, len); if (s->send_hdlc_handler) s->send_hdlc_handler(s->send_hdlc_user_data, msg, len); } /*- End of function --------------------------------------------------------*/ static void send_simple_frame(t30_state_t *s, int type) { uint8_t frame[3]; /* The simple command/response frames are always final frames */ frame[0] = 0xFF; frame[1] = 0x13; frame[2] = (uint8_t) (type | s->dis_received); send_frame(s, frame, 3); } /*- End of function --------------------------------------------------------*/ static void send_20digit_msg_frame(t30_state_t *s, int cmd, char *msg) { size_t len; int p; uint8_t frame[23]; len = strlen(msg); p = 0; frame[p++] = 0xFF; frame[p++] = 0x03; frame[p++] = (uint8_t) (cmd | s->dis_received); while (len > 0) frame[p++] = msg[--len]; while (p < 23) frame[p++] = ' '; send_frame(s, frame, 23); } /*- End of function --------------------------------------------------------*/ static int send_nsf_frame(t30_state_t *s) { /* Only send if there is an NSF message to send. */ if (s->tx_info.nsf && s->tx_info.nsf_len) { span_log(&s->logging, SPAN_LOG_FLOW, "Sending user supplied NSF - %d octets\n", s->tx_info.nsf_len); s->tx_info.nsf[0] = 0xFF; s->tx_info.nsf[1] = 0x03; s->tx_info.nsf[2] = (uint8_t) (T30_NSF | s->dis_received); send_frame(s, s->tx_info.nsf, s->tx_info.nsf_len + 3); return TRUE; } return FALSE; } /*- End of function --------------------------------------------------------*/ static int send_nss_frame(t30_state_t *s) { /* Only send if there is an NSF message to send. */ if (s->tx_info.nss && s->tx_info.nss_len) { span_log(&s->logging, SPAN_LOG_FLOW, "Sending user supplied NSS - %d octets\n", s->tx_info.nss_len); s->tx_info.nss[0] = 0xFF; s->tx_info.nss[1] = 0x03; s->tx_info.nss[2] = (uint8_t) (T30_NSS | s->dis_received); send_frame(s, s->tx_info.nss, s->tx_info.nss_len + 3); return TRUE; } return FALSE; } /*- End of function --------------------------------------------------------*/ static int send_nsc_frame(t30_state_t *s) { /* Only send if there is an NSF message to send. */ if (s->tx_info.nsc && s->tx_info.nsc_len) { span_log(&s->logging, SPAN_LOG_FLOW, "Sending user supplied NSC - %d octets\n", s->tx_info.nsc_len); s->tx_info.nsc[0] = 0xFF; s->tx_info.nsc[1] = 0x03; s->tx_info.nsc[2] = (uint8_t) (T30_NSC | s->dis_received); send_frame(s, s->tx_info.nsc, s->tx_info.nsc_len + 3); return TRUE; } return FALSE; } /*- End of function --------------------------------------------------------*/ static int send_ident_frame(t30_state_t *s, uint8_t cmd) { if (s->tx_info.ident[0]) { span_log(&s->logging, SPAN_LOG_FLOW, "Sending ident '%s'\n", s->tx_info.ident); /* 'cmd' should be T30_TSI, T30_CIG or T30_CSI */ send_20digit_msg_frame(s, cmd, s->tx_info.ident); return TRUE; } return FALSE; } /*- End of function --------------------------------------------------------*/ static int send_psa_frame(t30_state_t *s) { if (test_ctrl_bit(s->far_dis_dtc_frame, 35) && s->tx_info.polled_sub_address[0]) { span_log(&s->logging, SPAN_LOG_FLOW, "Sending polled sub-address '%s'\n", s->tx_info.polled_sub_address); send_20digit_msg_frame(s, T30_PSA, s->tx_info.polled_sub_address); return TRUE; set_ctrl_bit(s->local_dis_dtc_frame, 35); } clr_ctrl_bit(s->local_dis_dtc_frame, 35); return FALSE; } /*- End of function --------------------------------------------------------*/ static int send_sep_frame(t30_state_t *s) { if (test_ctrl_bit(s->far_dis_dtc_frame, 47) && s->tx_info.selective_polling_address[0]) { span_log(&s->logging, SPAN_LOG_FLOW, "Sending selective polling address '%s'\n", s->tx_info.selective_polling_address); send_20digit_msg_frame(s, T30_SEP, s->tx_info.selective_polling_address); set_ctrl_bit(s->local_dis_dtc_frame, 47); return TRUE; } clr_ctrl_bit(s->local_dis_dtc_frame, 47); return FALSE; } /*- End of function --------------------------------------------------------*/ static int send_sid_frame(t30_state_t *s) { /* Only send if there is an ID to send. */ if (test_ctrl_bit(s->far_dis_dtc_frame, 50) && s->tx_info.sender_ident[0]) { span_log(&s->logging, SPAN_LOG_FLOW, "Sending sender identification '%s'\n", s->tx_info.sender_ident); send_20digit_msg_frame(s, T30_SID, s->tx_info.sender_ident); set_ctrl_bit(s->dcs_frame, 50); return TRUE; } clr_ctrl_bit(s->dcs_frame, 50); return FALSE; } /*- End of function --------------------------------------------------------*/ static int send_pwd_frame(t30_state_t *s) { /* Only send if there is a password to send. */ if (test_ctrl_bit(s->far_dis_dtc_frame, 50) && s->tx_info.password[0]) { span_log(&s->logging, SPAN_LOG_FLOW, "Sending password '%s'\n", s->tx_info.password); send_20digit_msg_frame(s, T30_PWD, s->tx_info.password); set_ctrl_bit(s->local_dis_dtc_frame, 50); return TRUE; } clr_ctrl_bit(s->local_dis_dtc_frame, 50); return FALSE; } /*- End of function --------------------------------------------------------*/ static int send_sub_frame(t30_state_t *s) { /* Only send if there is a sub-address to send. */ if (test_ctrl_bit(s->far_dis_dtc_frame, 49) && s->tx_info.sub_address[0]) { span_log(&s->logging, SPAN_LOG_FLOW, "Sending sub-address '%s'\n", s->tx_info.sub_address); send_20digit_msg_frame(s, T30_SUB, s->tx_info.sub_address); set_ctrl_bit(s->dcs_frame, 49); return TRUE; } clr_ctrl_bit(s->dcs_frame, 49); return FALSE; } /*- End of function --------------------------------------------------------*/ static int send_tsa_frame(t30_state_t *s) { if ((test_ctrl_bit(s->far_dis_dtc_frame, 1) || test_ctrl_bit(s->far_dis_dtc_frame, 3)) && 0) { span_log(&s->logging, SPAN_LOG_FLOW, "Sending transmitting subscriber internet address '%s'\n", ""); return TRUE; } return FALSE; } /*- End of function --------------------------------------------------------*/ static int send_ira_frame(t30_state_t *s) { if (test_ctrl_bit(s->far_dis_dtc_frame, 102) && 0) { span_log(&s->logging, SPAN_LOG_FLOW, "Sending internet routing address '%s'\n", ""); set_ctrl_bit(s->dcs_frame, 102); return TRUE; } clr_ctrl_bit(s->dcs_frame, 102); return FALSE; } /*- End of function --------------------------------------------------------*/ static int send_cia_frame(t30_state_t *s) { if ((test_ctrl_bit(s->far_dis_dtc_frame, 1) || test_ctrl_bit(s->far_dis_dtc_frame, 3)) && 0) { span_log(&s->logging, SPAN_LOG_FLOW, "Sending calling subscriber internet address '%s'\n", ""); return TRUE; } return FALSE; } /*- End of function --------------------------------------------------------*/ static int send_isp_frame(t30_state_t *s) { if (test_ctrl_bit(s->far_dis_dtc_frame, 101) && 0) { span_log(&s->logging, SPAN_LOG_FLOW, "Sending internet selective polling address '%s'\n", ""); set_ctrl_bit(s->local_dis_dtc_frame, 101); return TRUE; } clr_ctrl_bit(s->local_dis_dtc_frame, 101); return FALSE; } /*- End of function --------------------------------------------------------*/ static int send_csa_frame(t30_state_t *s) { #if 0 if (("in T.37 mode" || "in T.38 mode") && 0) { span_log(&s->logging, SPAN_LOG_FLOW, "Sending called subscriber internet address '%s'\n", ""); return TRUE; } #endif return FALSE; } /*- End of function --------------------------------------------------------*/ static int send_pps_frame(t30_state_t *s) { uint8_t frame[7]; frame[0] = 0xFF; frame[1] = 0x13; frame[2] = (uint8_t) (T30_PPS | s->dis_received); frame[3] = (s->ecm_at_page_end) ? ((uint8_t) (s->next_tx_step | s->dis_received)) : T30_NULL; frame[4] = (uint8_t) (s->ecm_page & 0xFF); frame[5] = (uint8_t) (s->ecm_block & 0xFF); frame[6] = (uint8_t) ((s->ecm_frames_this_tx_burst == 0) ? 0 : (s->ecm_frames_this_tx_burst - 1)); span_log(&s->logging, SPAN_LOG_FLOW, "Sending PPS + %s\n", t30_frametype(frame[3])); send_frame(s, frame, 7); return frame[3] & 0xFE; } /*- End of function --------------------------------------------------------*/ static int set_dis_or_dtc(t30_state_t *s) { /* Whether we use a DIS or a DTC is determined by whether we have received a DIS. We just need to edit the prebuilt message. */ s->local_dis_dtc_frame[2] = (uint8_t) (T30_DIS | s->dis_received); /* If we have a file name to receive into, then we are receive capable */ if (s->rx_file[0]) set_ctrl_bit(s->local_dis_dtc_frame, 10); else clr_ctrl_bit(s->local_dis_dtc_frame, 10); /* If we have a file name to transmit, then we are ready to transmit (polling) */ if (s->tx_file[0]) set_ctrl_bit(s->local_dis_dtc_frame, 9); else clr_ctrl_bit(s->local_dis_dtc_frame, 9); return 0; } /*- End of function --------------------------------------------------------*/ int t30_build_dis_or_dtc(t30_state_t *s) { int i; /* Build a skeleton for the DIS and DTC messages. This will be edited for the dynamically changing capabilities (e.g. can receive) just before it is sent. It might also be edited if the application changes our capabilities (e.g. disabling fine mode). Right now we set up all the unchanging stuff about what we are capable of doing. */ s->local_dis_dtc_frame[0] = 0xFF; s->local_dis_dtc_frame[1] = 0x13; s->local_dis_dtc_frame[2] = (uint8_t) (T30_DIS | s->dis_received); for (i = 3; i < 19; i++) s->local_dis_dtc_frame[i] = 0x00; /* Always say 256 octets per ECM frame preferred, as 64 is never used in the real world. */ if ((s->iaf & T30_IAF_MODE_T37)) set_ctrl_bit(s->local_dis_dtc_frame, 1); if ((s->iaf & T30_IAF_MODE_T38)) set_ctrl_bit(s->local_dis_dtc_frame, 3); /* No 3G mobile */ /* No V.8 */ /* 256 octets preferred - don't bother making this optional, as everything uses 256 */ /* Ready to transmit a fax (polling) will be determined separately, and this message edited. */ /* Ready to receive a fax will be determined separately, and this message edited. */ /* With no modems set we are actually selecting V.27ter fallback at 2400bps */ if ((s->supported_modems & T30_SUPPORT_V27TER)) set_ctrl_bit(s->local_dis_dtc_frame, 12); if ((s->supported_modems & T30_SUPPORT_V29)) set_ctrl_bit(s->local_dis_dtc_frame, 11); /* V.17 is only valid when combined with V.29 and V.27ter, so if we enable V.17 we force the others too. */ if ((s->supported_modems & T30_SUPPORT_V17)) s->local_dis_dtc_frame[4] |= (DISBIT6 | DISBIT4 | DISBIT3); if ((s->supported_resolutions & T30_SUPPORT_FINE_RESOLUTION)) set_ctrl_bit(s->local_dis_dtc_frame, 15); if ((s->supported_compressions & T30_SUPPORT_T4_2D_COMPRESSION)) set_ctrl_bit(s->local_dis_dtc_frame, 16); /* 215mm wide is always supported */ if ((s->supported_image_sizes & T30_SUPPORT_303MM_WIDTH)) set_ctrl_bit(s->local_dis_dtc_frame, 18); else if ((s->supported_image_sizes & T30_SUPPORT_255MM_WIDTH)) set_ctrl_bit(s->local_dis_dtc_frame, 17); /* A4 is always supported. */ if ((s->supported_image_sizes & T30_SUPPORT_UNLIMITED_LENGTH)) set_ctrl_bit(s->local_dis_dtc_frame, 20); else if ((s->supported_image_sizes & T30_SUPPORT_B4_LENGTH)) set_ctrl_bit(s->local_dis_dtc_frame, 19); /* No scan-line padding required. */ set_ctrl_bits(s->local_dis_dtc_frame, s->local_min_scan_time_code, 21); if ((s->supported_compressions & T30_SUPPORT_NO_COMPRESSION)) set_ctrl_bit(s->local_dis_dtc_frame, 26); if (s->ecm_allowed) { /* ECM allowed */ set_ctrl_bit(s->local_dis_dtc_frame, 27); /* Only offer the option of fancy compression schemes, if we are also offering the ECM option needed to support them. */ if ((s->supported_compressions & T30_SUPPORT_T6_COMPRESSION)) set_ctrl_bit(s->local_dis_dtc_frame, 31); if ((s->supported_compressions & T30_SUPPORT_T43_COMPRESSION)) set_ctrl_bit(s->local_dis_dtc_frame, 36); if ((s->supported_compressions & T30_SUPPORT_T85_COMPRESSION)) set_ctrl_bit(s->local_dis_dtc_frame, 78); /* No T.85 optional L0. */ if ((s->supported_compressions & T30_SUPPORT_T45_COMPRESSION)) set_ctrl_bit(s->local_dis_dtc_frame, 116); } if ((s->supported_t30_features & T30_SUPPORT_FIELD_NOT_VALID)) set_ctrl_bit(s->local_dis_dtc_frame, 33); if ((s->supported_t30_features & T30_SUPPORT_MULTIPLE_SELECTIVE_POLLING)) set_ctrl_bit(s->local_dis_dtc_frame, 34); if ((s->supported_t30_features & T30_SUPPORT_POLLED_SUB_ADDRESSING)) set_ctrl_bit(s->local_dis_dtc_frame, 35); /* No plane interleave */ /* No G.726 */ /* No extended voice coding */ if ((s->supported_resolutions & T30_SUPPORT_SUPERFINE_RESOLUTION)) set_ctrl_bit(s->local_dis_dtc_frame, 41); if ((s->supported_resolutions & T30_SUPPORT_300_300_RESOLUTION)) set_ctrl_bit(s->local_dis_dtc_frame, 42); if ((s->supported_resolutions & (T30_SUPPORT_400_400_RESOLUTION | T30_SUPPORT_R16_RESOLUTION))) set_ctrl_bit(s->local_dis_dtc_frame, 43); /* Metric */ set_ctrl_bit(s->local_dis_dtc_frame, 45); /* Superfine minimum scan line time pattern follows fine */ if ((s->supported_t30_features & T30_SUPPORT_SELECTIVE_POLLING)) set_ctrl_bit(s->local_dis_dtc_frame, 47); if ((s->supported_t30_features & T30_SUPPORT_SUB_ADDRESSING)) set_ctrl_bit(s->local_dis_dtc_frame, 49); if ((s->supported_t30_features & T30_SUPPORT_IDENTIFICATION)) set_ctrl_bit(s->local_dis_dtc_frame, 50); /* Ready to transmit a data file (polling) */ if (s->tx_file[0]) set_ctrl_bit(s->local_dis_dtc_frame, 51); /* No Binary file transfer (BFT) */ /* No Document transfer mode (DTM) */ /* No Electronic data interchange (EDI) */ /* No Basic transfer mode (BTM) */ /* No mixed mode (polling) */ /* No character mode */ /* No mixed mode (Annex E/T.4) */ /* No mode 26 (T.505) */ /* No digital network capability */ /* No duplex operation */ /* No JPEG */ /* No full colour */ /* No 12bits/pel */ /* No sub-sampling (1:1:1) */ /* No custom illuminant */ /* No custom gamut range */ if ((s->supported_image_sizes & T30_SUPPORT_US_LETTER_LENGTH)) set_ctrl_bit(s->local_dis_dtc_frame, 76); if ((s->supported_image_sizes & T30_SUPPORT_US_LEGAL_LENGTH)) set_ctrl_bit(s->local_dis_dtc_frame, 77); /* No HKM key management */ /* No RSA key management */ /* No override */ /* No HFX40 cipher */ /* No alternative cipher number 2 */ /* No alternative cipher number 3 */ /* No HFX40-I hashing */ /* No alternative hashing system number 2 */ /* No alternative hashing system number 3 */ /* No T.44 (mixed raster content) */ /* No page length maximum strip size for T.44 (mixed raster content) */ /* No colour/grey scale 300x300 or 400x400 */ /* No colour/grey scale 100x100 */ /* No simple phase C BFT negotiations */ /* No extended BFT negotiations */ if ((s->supported_t30_features & T30_SUPPORT_INTERNET_SELECTIVE_POLLING_ADDRESS)) set_ctrl_bit(s->local_dis_dtc_frame, 101); if ((s->supported_t30_features & T30_SUPPORT_INTERNET_ROUTING_ADDRESS)) set_ctrl_bit(s->local_dis_dtc_frame, 102); if ((s->supported_resolutions & T30_SUPPORT_600_600_RESOLUTION)) set_ctrl_bit(s->local_dis_dtc_frame, 105); if ((s->supported_resolutions & T30_SUPPORT_1200_1200_RESOLUTION)) set_ctrl_bit(s->local_dis_dtc_frame, 106); if ((s->supported_resolutions & T30_SUPPORT_300_600_RESOLUTION)) set_ctrl_bit(s->local_dis_dtc_frame, 107); if ((s->supported_resolutions & T30_SUPPORT_400_800_RESOLUTION)) set_ctrl_bit(s->local_dis_dtc_frame, 108); if ((s->supported_resolutions & T30_SUPPORT_600_1200_RESOLUTION)) set_ctrl_bit(s->local_dis_dtc_frame, 109); /* No colour/grey scale 600x600 */ /* No colour/grey scale 1200x1200 */ /* No double sided printing (alternate mode) */ /* No double sided printing (continuous mode) */ /* No black and white mixed raster content profile */ /* No shared data memory */ /* No T.44 colour space */ if ((s->iaf & T30_IAF_MODE_FLOW_CONTROL)) set_ctrl_bit(s->local_dis_dtc_frame, 121); /* No k > 4 */ if ((s->iaf & T30_IAF_MODE_CONTINUOUS_FLOW)) set_ctrl_bit(s->local_dis_dtc_frame, 123); /* No T.89 profile */ s->local_dis_dtc_len = 19; //t30_decode_dis_dtc_dcs(s, s->local_dis_dtc_frame, s->local_dis_dtc_len); return 0; } /*- End of function --------------------------------------------------------*/ static int prune_dis_dtc(t30_state_t *s) { int i; /* Find the last octet that is really needed, set the extension bits, and trim the message length */ for (i = 18; i > 4; i--) { /* Strip the top bit */ s->local_dis_dtc_frame[i] &= (DISBIT1 | DISBIT2 | DISBIT3 | DISBIT4 | DISBIT5 | DISBIT6 | DISBIT7); /* Check if there is some real message content here */ if (s->local_dis_dtc_frame[i]) break; } s->local_dis_dtc_len = i + 1; /* Fill in any required extension bits */ s->local_dis_dtc_frame[i] &= ~DISBIT8; for (i--; i > 4; i--) s->local_dis_dtc_frame[i] |= DISBIT8; t30_decode_dis_dtc_dcs(s, s->local_dis_dtc_frame, s->local_dis_dtc_len); return s->local_dis_dtc_len; } /*- End of function --------------------------------------------------------*/ static int build_dcs(t30_state_t *s) { int i; int bad; /* Make a DCS frame based on local issues and the latest received DIS/DTC frame. Negotiate the result based on what both parties can do. */ s->dcs_frame[0] = 0xFF; s->dcs_frame[1] = 0x13; s->dcs_frame[2] = (uint8_t) (T30_DCS | s->dis_received); for (i = 3; i < 19; i++) s->dcs_frame[i] = 0x00; #if 0 /* Check for T.37 simple mode. */ if (test_ctrl_bit(s->far_dis_dtc_frame, 1)) set_ctrl_bit(s->dcs_frame, 1); /* Check for T.38 mode. */ if (test_ctrl_bit(s->far_dis_dtc_frame, 3)) set_ctrl_bit(s->dcs_frame, 3); #endif /* Set to required modem rate */ s->dcs_frame[4] |= fallback_sequence[s->current_fallback].dcs_code; /* Select the compression to use. */ switch (s->line_encoding) { case T4_COMPRESSION_ITU_T6: set_ctrl_bit(s->dcs_frame, 31); set_ctrl_bits(s->dcs_frame, T30_MIN_SCAN_0MS, 21); break; case T4_COMPRESSION_ITU_T4_2D: set_ctrl_bit(s->dcs_frame, 16); set_ctrl_bits(s->dcs_frame, s->min_scan_time_code, 21); break; case T4_COMPRESSION_ITU_T4_1D: set_ctrl_bits(s->dcs_frame, s->min_scan_time_code, 21); break; default: set_ctrl_bits(s->dcs_frame, T30_MIN_SCAN_0MS, 21); break; } /* We have a file to send, so tell the far end to go into receive mode. */ set_ctrl_bit(s->dcs_frame, 10); /* Set the Y resolution bits */ bad = T30_ERR_OK; switch (s->y_resolution) { case T4_Y_RESOLUTION_1200: switch (s->x_resolution) { case T4_X_RESOLUTION_600: if (!(s->supported_resolutions & T30_SUPPORT_600_1200_RESOLUTION)) bad = T30_ERR_NORESSUPPORT; else set_ctrl_bit(s->dcs_frame, 109); break; case T4_X_RESOLUTION_1200: if (!(s->supported_resolutions & T30_SUPPORT_1200_1200_RESOLUTION)) bad = T30_ERR_NORESSUPPORT; else set_ctrl_bit(s->dcs_frame, 106); break; default: bad = T30_ERR_NORESSUPPORT; break; } break; case T4_Y_RESOLUTION_800: switch (s->x_resolution) { case T4_X_RESOLUTION_R16: if (!(s->supported_resolutions & T30_SUPPORT_400_800_RESOLUTION)) bad = T30_ERR_NORESSUPPORT; else set_ctrl_bit(s->dcs_frame, 108); break; default: bad = T30_ERR_NORESSUPPORT; break; } break; case T4_Y_RESOLUTION_600: switch (s->x_resolution) { case T4_X_RESOLUTION_300: if (!(s->supported_resolutions & T30_SUPPORT_300_600_RESOLUTION)) bad = T30_ERR_NORESSUPPORT; else set_ctrl_bit(s->dcs_frame, 107); break; case T4_X_RESOLUTION_600: if (!(s->supported_resolutions & T30_SUPPORT_600_600_RESOLUTION)) bad = T30_ERR_NORESSUPPORT; else set_ctrl_bit(s->dcs_frame, 105); break; default: bad = T30_ERR_NORESSUPPORT; break; } break; case T4_Y_RESOLUTION_SUPERFINE: if (!(s->supported_resolutions & T30_SUPPORT_SUPERFINE_RESOLUTION)) { bad = T30_ERR_NORESSUPPORT; } else { switch (s->x_resolution) { case T4_X_RESOLUTION_R8: set_ctrl_bit(s->dcs_frame, 41); break; case T4_X_RESOLUTION_R16: set_ctrl_bit(s->dcs_frame, 43); break; default: bad = T30_ERR_NORESSUPPORT; break; } } break; case T4_Y_RESOLUTION_300: switch (s->x_resolution) { case T4_X_RESOLUTION_300: if (!(s->supported_resolutions & T30_SUPPORT_300_300_RESOLUTION)) bad = T30_ERR_NORESSUPPORT; else set_ctrl_bit(s->dcs_frame, 42); break; default: bad = T30_ERR_NORESSUPPORT; break; } break; case T4_Y_RESOLUTION_FINE: if (!(s->supported_resolutions & T30_SUPPORT_FINE_RESOLUTION)) { bad = T30_ERR_NORESSUPPORT; } else { switch (s->x_resolution) { case T4_X_RESOLUTION_R8: set_ctrl_bit(s->dcs_frame, 15); break; default: bad = T30_ERR_NORESSUPPORT; break; } } break; default: case T4_Y_RESOLUTION_STANDARD: switch (s->x_resolution) { case T4_X_RESOLUTION_R8: /* No bits to set for this */ break; default: bad = T30_ERR_NORESSUPPORT; break; } break; } if (bad != T30_ERR_OK) { s->current_status = bad; span_log(&s->logging, SPAN_LOG_FLOW, "Image resolution (%d x %d) not acceptable\n", s->x_resolution, s->y_resolution); return -1; } /* Deal with the image width. The X resolution will fall in line with any valid width. */ /* Low (R4) res widths are not supported in recent versions of T.30 */ bad = T30_ERR_OK; switch (s->image_width) { case T4_WIDTH_R8_A4: case T4_WIDTH_300_A4: case T4_WIDTH_R16_A4: case T4_WIDTH_600_A4: case T4_WIDTH_1200_A4: /* No width related bits need to be set. */ break; case T4_WIDTH_R8_B4: case T4_WIDTH_300_B4: case T4_WIDTH_R16_B4: case T4_WIDTH_600_B4: case T4_WIDTH_1200_B4: if ((s->far_dis_dtc_frame[5] & (DISBIT2 | DISBIT1)) < 1) bad = T30_ERR_NOSIZESUPPORT; else if (!(s->supported_image_sizes & T30_SUPPORT_255MM_WIDTH)) bad = T30_ERR_BADTIFF; else set_ctrl_bit(s->dcs_frame, 17); break; case T4_WIDTH_R8_A3: case T4_WIDTH_300_A3: case T4_WIDTH_R16_A3: case T4_WIDTH_600_A3: case T4_WIDTH_1200_A3: if ((s->far_dis_dtc_frame[5] & (DISBIT2 | DISBIT1)) < 2) bad = T30_ERR_NOSIZESUPPORT; else if (!(s->supported_image_sizes & T30_SUPPORT_303MM_WIDTH)) bad = T30_ERR_BADTIFF; else set_ctrl_bit(s->dcs_frame, 18); break; default: /* T.30 does not support this width */ bad = T30_ERR_BADTIFF; break; } if (bad != T30_ERR_OK) { s->current_status = bad; span_log(&s->logging, SPAN_LOG_FLOW, "Image width (%d pixels) not a valid FAX image width\n", s->image_width); return -1; } switch (s->image_width) { case T4_WIDTH_R8_A4: case T4_WIDTH_R8_B4: case T4_WIDTH_R8_A3: /* These are always OK */ break; case T4_WIDTH_300_A4: case T4_WIDTH_300_B4: case T4_WIDTH_300_A3: if (!test_ctrl_bit(s->far_dis_dtc_frame, 42) && !test_ctrl_bit(s->far_dis_dtc_frame, 107)) bad = T30_ERR_NOSIZESUPPORT; break; case T4_WIDTH_R16_A4: case T4_WIDTH_R16_B4: case T4_WIDTH_R16_A3: if (!test_ctrl_bit(s->far_dis_dtc_frame, 43)) bad = T30_ERR_NOSIZESUPPORT; break; case T4_WIDTH_600_A4: case T4_WIDTH_600_B4: case T4_WIDTH_600_A3: if (!test_ctrl_bit(s->far_dis_dtc_frame, 105) && !test_ctrl_bit(s->far_dis_dtc_frame, 109)) bad = T30_ERR_NOSIZESUPPORT; break; case T4_WIDTH_1200_A4: case T4_WIDTH_1200_B4: case T4_WIDTH_1200_A3: if (!test_ctrl_bit(s->far_dis_dtc_frame, 106)) bad = T30_ERR_NOSIZESUPPORT; break; default: /* T.30 does not support this width */ bad = T30_ERR_BADTIFF; break; } if (bad != T30_ERR_OK) { s->current_status = bad; span_log(&s->logging, SPAN_LOG_FLOW, "Image width (%d pixels) not a valid FAX image width\n", s->image_width); return -1; } /* Deal with the image length */ /* If the other end supports unlimited length, then use that. Otherwise, if the other end supports B4 use that, as its longer than the default A4 length. */ if (test_ctrl_bit(s->far_dis_dtc_frame, 20)) set_ctrl_bit(s->dcs_frame, 20); else if (test_ctrl_bit(s->far_dis_dtc_frame, 19)) set_ctrl_bit(s->dcs_frame, 19); if (s->error_correcting_mode) set_ctrl_bit(s->dcs_frame, 27); if ((s->iaf & T30_IAF_MODE_FLOW_CONTROL) && test_ctrl_bit(s->far_dis_dtc_frame, 121)) set_ctrl_bit(s->dcs_frame, 121); if ((s->iaf & T30_IAF_MODE_CONTINUOUS_FLOW) && test_ctrl_bit(s->far_dis_dtc_frame, 123)) set_ctrl_bit(s->dcs_frame, 123); s->dcs_len = 19; //t30_decode_dis_dtc_dcs(s, s->dcs_frame, s->dcs_len); return 0; } /*- End of function --------------------------------------------------------*/ static int prune_dcs(t30_state_t *s) { int i; /* Find the last octet that is really needed, set the extension bits, and trim the message length */ for (i = 18; i > 4; i--) { /* Strip the top bit */ s->dcs_frame[i] &= (DISBIT1 | DISBIT2 | DISBIT3 | DISBIT4 | DISBIT5 | DISBIT6 | DISBIT7); /* Check if there is some real message content here */ if (s->dcs_frame[i]) break; } s->dcs_len = i + 1; /* Fill in any required extension bits */ s->local_dis_dtc_frame[i] &= ~DISBIT8; for (i-- ; i > 4; i--) s->dcs_frame[i] |= DISBIT8; t30_decode_dis_dtc_dcs(s, s->dcs_frame, s->dcs_len); return s->dcs_len; } /*- End of function --------------------------------------------------------*/ static int step_fallback_entry(t30_state_t *s) { int min_row_bits; while (fallback_sequence[++s->current_fallback].which) { if ((fallback_sequence[s->current_fallback].which & s->current_permitted_modems)) break; } if (fallback_sequence[s->current_fallback].which == 0) return -1; /* TODO: This only sets the minimum row time for future pages. It doesn't fix up the current page, though it is benign - fallback will only result in an excessive minimum. */ min_row_bits = set_min_scan_time_code(s); t4_tx_set_min_row_bits(&(s->t4), min_row_bits); /* We need to rebuild the DCS message we will send. */ build_dcs(s); return s->current_fallback; } /*- End of function --------------------------------------------------------*/ static int find_fallback_entry(int dcs_code) { int i; /* The table is short, and not searched often, so a brain-dead linear scan seems OK */ for (i = 0; fallback_sequence[i].bit_rate; i++) { if (fallback_sequence[i].dcs_code == dcs_code) break; } if (fallback_sequence[i].bit_rate == 0) return -1; return i; } /*- End of function --------------------------------------------------------*/ static void send_dcn(t30_state_t *s) { queue_phase(s, T30_PHASE_D_TX); set_state(s, T30_STATE_C); send_simple_frame(s, T30_DCN); } /*- End of function --------------------------------------------------------*/ static int send_dis_or_dtc_sequence(t30_state_t *s, int start) { /* (NSF) (CSI) DIS */ /* (NSC) (CIG) (PWD) (SEP) (PSA) (CIA) (ISP) DTC */ if (start) { set_dis_or_dtc(s); set_state(s, T30_STATE_R); s->step = 0; } if (!s->dis_received) { /* DIS sequence */ switch (s->step) { case 0: s->step++; if (send_nsf_frame(s)) break; /* Fall through */ case 1: s->step++; if (send_ident_frame(s, T30_CSI)) break; /* Fall through */ case 2: s->step++; prune_dis_dtc(s); send_frame(s, s->local_dis_dtc_frame, s->local_dis_dtc_len); break; case 3: s->step++; /* Shut down HDLC transmission. */ if (s->send_hdlc_handler) s->send_hdlc_handler(s->send_hdlc_user_data, NULL, 0); break; default: return -1; } } else { /* DTC sequence */ switch (s->step) { case 0: s->step++; if (send_nsc_frame(s)) break; /* Fall through */ case 1: s->step++; if (send_ident_frame(s, T30_CIG)) break; /* Fall through */ case 2: s->step++; if (send_pwd_frame(s)) break; /* Fall through */ case 3: s->step++; if (send_sep_frame(s)) break; /* Fall through */ case 4: s->step++; if (send_psa_frame(s)) break; /* Fall through */ case 5: s->step++; if (send_cia_frame(s)) break; /* Fall through */ case 6: s->step++; if (send_isp_frame(s)) break; /* Fall through */ case 7: s->step++; prune_dis_dtc(s); send_frame(s, s->local_dis_dtc_frame, s->local_dis_dtc_len); break; case 8: s->step++; /* Shut down HDLC transmission. */ if (s->send_hdlc_handler) s->send_hdlc_handler(s->send_hdlc_user_data, NULL, 0); break; default: return -1; } } return 0; } /*- End of function --------------------------------------------------------*/ static int send_dcs_sequence(t30_state_t *s, int start) { /* (NSS) (TSI) (SUB) (SID) (TSA) (IRA) DCS */ /* Schedule training after the messages */ if (start) { prune_dcs(s); set_state(s, T30_STATE_D); s->step = 0; } switch (s->step) { case 0: s->step++; if (send_nss_frame(s)) break; /* Fall through */ case 1: s->step++; if (send_ident_frame(s, T30_TSI)) break; /* Fall through */ case 2: s->step++; if (send_sub_frame(s)) break; /* Fall through */ case 3: s->step++; if (send_sid_frame(s)) break; /* Fall through */ case 4: s->step++; if (send_tsa_frame(s)) break; /* Fall through */ case 5: s->step++; if (send_ira_frame(s)) break; /* Fall through */ case 6: s->step++; prune_dcs(s); send_frame(s, s->dcs_frame, s->dcs_len); break; case 7: s->step++; /* Shut down HDLC transmission. */ if (s->send_hdlc_handler) s->send_hdlc_handler(s->send_hdlc_user_data, NULL, 0); break; default: return -1; } return 0; } /*- End of function --------------------------------------------------------*/ static int send_cfr_sequence(t30_state_t *s, int start) { /* (CSA) CFR */ /* CFR is usually a simple frame, but can become a sequence with Internet FAXing. */ send_simple_frame(s, T30_CFR); return 0; } /*- End of function --------------------------------------------------------*/ static void disconnect(t30_state_t *s) { span_log(&s->logging, SPAN_LOG_FLOW, "Disconnecting\n"); /* Make sure any FAX in progress is tidied up. If the tidying up has already happened, repeating it here is harmless. */ switch (s->operation_in_progress) { case OPERATION_IN_PROGRESS_T4_TX: t4_tx_end(&(s->t4)); break; case OPERATION_IN_PROGRESS_T4_RX: t4_rx_end(&(s->t4)); break; } s->operation_in_progress = OPERATION_IN_PROGRESS_NONE; s->timer_t0_t1 = 0; s->timer_t2_t4 = 0; s->timer_t3 = 0; s->timer_t5 = 0; set_phase(s, T30_PHASE_E); set_state(s, T30_STATE_B); } /*- End of function --------------------------------------------------------*/ static int set_min_scan_time_code(t30_state_t *s) { /* Translation between the codes for the minimum scan times the other end needs, and the codes for what we say will be used. We need 0 minimum. */ static const uint8_t translate_min_scan_time[3][8] = { {T30_MIN_SCAN_20MS, T30_MIN_SCAN_5MS, T30_MIN_SCAN_10MS, T30_MIN_SCAN_20MS, T30_MIN_SCAN_40MS, T30_MIN_SCAN_40MS, T30_MIN_SCAN_10MS, T30_MIN_SCAN_0MS}, /* normal */ {T30_MIN_SCAN_20MS, T30_MIN_SCAN_5MS, T30_MIN_SCAN_10MS, T30_MIN_SCAN_10MS, T30_MIN_SCAN_40MS, T30_MIN_SCAN_20MS, T30_MIN_SCAN_5MS, T30_MIN_SCAN_0MS}, /* fine */ {T30_MIN_SCAN_10MS, T30_MIN_SCAN_5MS, T30_MIN_SCAN_5MS, T30_MIN_SCAN_5MS, T30_MIN_SCAN_20MS, T30_MIN_SCAN_10MS, T30_MIN_SCAN_5MS, T30_MIN_SCAN_0MS} /* superfine, when half fine time is selected */ }; /* Translation between the codes for the minimum scan time we will use, and milliseconds. */ static const int min_scan_times[8] = { 20, 5, 10, 0, 40, 0, 0, 0 }; int min_bits_field; /* Set the minimum scan time bits */ if (s->error_correcting_mode) min_bits_field = T30_MIN_SCAN_0MS; else min_bits_field = (s->far_dis_dtc_frame[5] >> 4) & 7; switch (s->y_resolution) { case T4_Y_RESOLUTION_SUPERFINE: if (!test_ctrl_bit(s->far_dis_dtc_frame, 41)) { s->current_status = T30_ERR_NORESSUPPORT; span_log(&s->logging, SPAN_LOG_FLOW, "Remote FAX does not support super-fine resolution.\n"); return -1; } s->min_scan_time_code = translate_min_scan_time[(test_ctrl_bit(s->far_dis_dtc_frame, 46)) ? 2 : 1][min_bits_field]; break; case T4_Y_RESOLUTION_FINE: if (!test_ctrl_bit(s->far_dis_dtc_frame, 15)) { s->current_status = T30_ERR_NORESSUPPORT; span_log(&s->logging, SPAN_LOG_FLOW, "Remote FAX does not support fine resolution.\n"); return -1; } s->min_scan_time_code = translate_min_scan_time[1][min_bits_field]; break; default: case T4_Y_RESOLUTION_STANDARD: s->min_scan_time_code = translate_min_scan_time[0][min_bits_field]; break; } if (!s->error_correcting_mode && (s->iaf & T30_IAF_MODE_NO_FILL_BITS)) return 0; return fallback_sequence[s->current_fallback].bit_rate*min_scan_times[s->min_scan_time_code]/1000; } /*- End of function --------------------------------------------------------*/ static int start_sending_document(t30_state_t *s) { int min_row_bits; if (s->tx_file[0] == '\0') { /* There is nothing to send */ span_log(&s->logging, SPAN_LOG_FLOW, "No document to send\n"); return -1; } span_log(&s->logging, SPAN_LOG_FLOW, "Start sending document\n"); if (t4_tx_init(&(s->t4), s->tx_file, s->tx_start_page, s->tx_stop_page) == NULL) { span_log(&s->logging, SPAN_LOG_WARNING, "Cannot open source TIFF file '%s'\n", s->tx_file); s->current_status = T30_ERR_FILEERROR; return -1; } s->operation_in_progress = OPERATION_IN_PROGRESS_T4_TX; t4_tx_get_pages_in_file(&(s->t4)); t4_tx_set_tx_encoding(&(s->t4), s->line_encoding); t4_tx_set_local_ident(&(s->t4), s->tx_info.ident); t4_tx_set_header_info(&(s->t4), s->header_info); s->x_resolution = t4_tx_get_x_resolution(&(s->t4)); s->y_resolution = t4_tx_get_y_resolution(&(s->t4)); /* The minimum scan time to be used can't be evaluated until we know the Y resolution, and must be evaluated before the minimum scan row bits can be evaluated. */ if ((min_row_bits = set_min_scan_time_code(s)) < 0) { t4_tx_end(&(s->t4)); s->operation_in_progress = OPERATION_IN_PROGRESS_NONE; return -1; } span_log(&s->logging, SPAN_LOG_FLOW, "Minimum bits per row will be %d\n", min_row_bits); t4_tx_set_min_row_bits(&(s->t4), min_row_bits); s->ecm_page = -1; if (tx_start_page(s)) return -1; s->image_width = t4_tx_get_image_width(&(s->t4)); if (s->error_correcting_mode) { if (get_partial_ecm_page(s) == 0) span_log(&s->logging, SPAN_LOG_WARNING, "No image data to send\n"); } return 0; } /*- End of function --------------------------------------------------------*/ static int restart_sending_document(t30_state_t *s) { t4_tx_restart_page(&(s->t4)); s->retries = 0; s->ecm_block = 0; send_dcs_sequence(s, TRUE); return 0; } /*- End of function --------------------------------------------------------*/ static int start_receiving_document(t30_state_t *s) { if (s->rx_file[0] == '\0') { /* There is nothing to receive to */ span_log(&s->logging, SPAN_LOG_FLOW, "No document to receive\n"); return -1; } span_log(&s->logging, SPAN_LOG_FLOW, "Start receiving document\n"); queue_phase(s, T30_PHASE_B_TX); s->dis_received = FALSE; s->ecm_page = 0; s->ecm_block = 0; send_dis_or_dtc_sequence(s, TRUE); return 0; } /*- End of function --------------------------------------------------------*/ static void unexpected_frame(t30_state_t *s, const uint8_t *msg, int len) { span_log(&s->logging, SPAN_LOG_FLOW, "Unexpected %s received in state %d\n", t30_frametype(msg[2]), s->state); switch (s->state) { case T30_STATE_F_DOC_ECM: case T30_STATE_F_DOC_NON_ECM: s->current_status = T30_ERR_RX_INVALCMD; break; } } /*- End of function --------------------------------------------------------*/ static void unexpected_non_final_frame(t30_state_t *s, const uint8_t *msg, int len) { span_log(&s->logging, SPAN_LOG_FLOW, "Unexpected %s frame in state %d\n", t30_frametype(msg[2]), s->state); s->current_status = T30_ERR_UNEXPECTED; } /*- End of function --------------------------------------------------------*/ static void unexpected_final_frame(t30_state_t *s, const uint8_t *msg, int len) { span_log(&s->logging, SPAN_LOG_FLOW, "Unexpected %s received in state %d\n", t30_frametype(msg[2]), s->state); s->current_status = T30_ERR_UNEXPECTED; send_dcn(s); } /*- End of function --------------------------------------------------------*/ static void unexpected_frame_length(t30_state_t *s, const uint8_t *msg, int len) { span_log(&s->logging, SPAN_LOG_FLOW, "Unexpected %s frame length - %d\n", t30_frametype(msg[0]), len); s->current_status = T30_ERR_UNEXPECTED; send_dcn(s); } /*- End of function --------------------------------------------------------*/ static int process_rx_dis_dtc(t30_state_t *s, const uint8_t *msg, int len) { int new_status; t30_decode_dis_dtc_dcs(s, msg, len); if (len < 6) { span_log(&s->logging, SPAN_LOG_FLOW, "Short DIS/DTC frame\n"); return -1; } if (msg[2] == T30_DIS) s->dis_received = TRUE; /* Make a local copy of the message, padded to the maximum possible length with zeros. This allows us to simply pick out the bits, without worrying about whether they were set from the remote side. */ s->far_dis_dtc_len = (len > T30_MAX_DIS_DTC_DCS_LEN) ? T30_MAX_DIS_DTC_DCS_LEN : len; memcpy(s->far_dis_dtc_frame, msg, s->far_dis_dtc_len); if (s->far_dis_dtc_len < T30_MAX_DIS_DTC_DCS_LEN) memset(s->far_dis_dtc_frame + s->far_dis_dtc_len, 0, T30_MAX_DIS_DTC_DCS_LEN - s->far_dis_dtc_len); s->error_correcting_mode = (s->ecm_allowed && (s->far_dis_dtc_frame[6] & DISBIT3) != 0); /* 256 octets per ECM frame */ s->octets_per_ecm_frame = 256; /* Select the compression to use. */ if (s->error_correcting_mode && (s->supported_compressions & T30_SUPPORT_T6_COMPRESSION) && test_ctrl_bit(s->far_dis_dtc_frame, 31)) { s->line_encoding = T4_COMPRESSION_ITU_T6; } else if ((s->supported_compressions & T30_SUPPORT_T4_2D_COMPRESSION) && test_ctrl_bit(s->far_dis_dtc_frame, 16)) { s->line_encoding = T4_COMPRESSION_ITU_T4_2D; } else { s->line_encoding = T4_COMPRESSION_ITU_T4_1D; } span_log(&s->logging, SPAN_LOG_FLOW, "Selected compression %d\n", s->line_encoding); switch (s->far_dis_dtc_frame[4] & (DISBIT6 | DISBIT5 | DISBIT4 | DISBIT3)) { case (DISBIT6 | DISBIT4 | DISBIT3): if ((s->supported_modems & T30_SUPPORT_V17)) { s->current_permitted_modems = T30_SUPPORT_V17 | T30_SUPPORT_V29 | T30_SUPPORT_V27TER; s->current_fallback = T30_V17_FALLBACK_START; break; } /* Fall through */ case (DISBIT4 | DISBIT3): if ((s->supported_modems & T30_SUPPORT_V29)) { s->current_permitted_modems = T30_SUPPORT_V29 | T30_SUPPORT_V27TER; s->current_fallback = T30_V29_FALLBACK_START; break; } /* Fall through */ case DISBIT4: s->current_permitted_modems = T30_SUPPORT_V27TER; s->current_fallback = T30_V27TER_FALLBACK_START; break; case 0: s->current_permitted_modems = T30_SUPPORT_V27TER; s->current_fallback = T30_V27TER_FALLBACK_START + 1; break; case DISBIT3: if ((s->supported_modems & T30_SUPPORT_V29)) { /* TODO: this doesn't allow for skipping the V.27ter modes */ s->current_permitted_modems = T30_SUPPORT_V29; s->current_fallback = T30_V29_FALLBACK_START; break; } /* Fall through */ default: span_log(&s->logging, SPAN_LOG_FLOW, "Remote does not support a compatible modem\n"); /* We cannot talk to this machine! */ s->current_status = T30_ERR_INCOMPATIBLE; return -1; } if (s->phase_b_handler) { new_status = s->phase_b_handler(s, s->phase_d_user_data, msg[2]); if (new_status != T30_ERR_OK) { span_log(&s->logging, SPAN_LOG_FLOW, "Application rejected DIS/DTC - '%s'\n", t30_completion_code_to_str(new_status)); s->current_status = new_status; /* TODO: If FNV is allowed, process it here */ send_dcn(s); return -1; } } queue_phase(s, T30_PHASE_B_TX); /* Try to send something */ if (s->tx_file[0]) { span_log(&s->logging, SPAN_LOG_FLOW, "Trying to send file '%s'\n", s->tx_file); if (!test_ctrl_bit(s->far_dis_dtc_frame, 10)) { span_log(&s->logging, SPAN_LOG_FLOW, "%s far end cannot receive\n", t30_frametype(msg[2])); s->current_status = T30_ERR_RX_INCAPABLE; send_dcn(s); } if (start_sending_document(s)) { send_dcn(s); return -1; } if (build_dcs(s)) { span_log(&s->logging, SPAN_LOG_FLOW, "The far end is incompatible\n", s->tx_file); send_dcn(s); return -1; } s->retries = 0; send_dcs_sequence(s, TRUE); return 0; } span_log(&s->logging, SPAN_LOG_FLOW, "%s nothing to send\n", t30_frametype(msg[2])); /* ... then try to receive something */ if (s->rx_file[0]) { span_log(&s->logging, SPAN_LOG_FLOW, "Trying to receive file '%s'\n", s->rx_file); if (!test_ctrl_bit(s->far_dis_dtc_frame, 9)) { span_log(&s->logging, SPAN_LOG_FLOW, "%s far end cannot transmit\n", t30_frametype(msg[2])); s->current_status = T30_ERR_TX_INCAPABLE; send_dcn(s); return -1; } if (start_receiving_document(s)) { send_dcn(s); return -1; } s->dis_received = TRUE; if (set_dis_or_dtc(s)) { s->current_status = T30_ERR_INCOMPATIBLE; send_dcn(s); return -1; } s->retries = 0; send_dis_or_dtc_sequence(s, TRUE); return 0; } span_log(&s->logging, SPAN_LOG_FLOW, "%s nothing to receive\n", t30_frametype(msg[2])); /* There is nothing to do, or nothing we are able to do. */ send_dcn(s); return -1; } /*- End of function --------------------------------------------------------*/ static int process_rx_dcs(t30_state_t *s, const uint8_t *msg, int len) { static const int widths[6][4] = { { T4_WIDTH_R4_A4, T4_WIDTH_R4_B4, T4_WIDTH_R4_A3, -1}, /* R4 resolution - no longer used in recent versions of T.30 */ { T4_WIDTH_R8_A4, T4_WIDTH_R8_B4, T4_WIDTH_R8_A3, -1}, /* R8 resolution */ { T4_WIDTH_300_A4, T4_WIDTH_300_B4, T4_WIDTH_300_A3, -1}, /* 300/inch resolution */ { T4_WIDTH_R16_A4, T4_WIDTH_R16_B4, T4_WIDTH_R16_A3, -1}, /* R16 resolution */ { T4_WIDTH_600_A4, T4_WIDTH_600_B4, T4_WIDTH_600_A3, -1}, /* 600/inch resolution */ {T4_WIDTH_1200_A4, T4_WIDTH_1200_B4, T4_WIDTH_1200_A3, -1} /* 1200/inch resolution */ }; uint8_t dcs_frame[T30_MAX_DIS_DTC_DCS_LEN]; int i; int new_status; t30_decode_dis_dtc_dcs(s, msg, len); /* Check DCS frame from remote */ if (len < 6) { span_log(&s->logging, SPAN_LOG_FLOW, "Short DCS frame\n"); return -1; } /* Make an ASCII string format copy of the message, for logging in the received file. This string does not include the frame header octets. */ sprintf(s->rx_dcs_string, "%02X", bit_reverse8(msg[3])); for (i = 4; i < len; i++) sprintf(s->rx_dcs_string + 3*i - 10, " %02X", bit_reverse8(msg[i])); /* Make a local copy of the message, padded to the maximum possible length with zeros. This allows us to simply pick out the bits, without worrying about whether they were set from the remote side. */ if (len > T30_MAX_DIS_DTC_DCS_LEN) { memcpy(dcs_frame, msg, T30_MAX_DIS_DTC_DCS_LEN); } else { memcpy(dcs_frame, msg, len); if (len < T30_MAX_DIS_DTC_DCS_LEN) memset(dcs_frame + len, 0, T30_MAX_DIS_DTC_DCS_LEN - len); } s->octets_per_ecm_frame = test_ctrl_bit(dcs_frame, 28) ? 256 : 64; if (test_ctrl_bit(dcs_frame, 106)) s->x_resolution = T4_X_RESOLUTION_1200; else if (test_ctrl_bit(dcs_frame, 105) || test_ctrl_bit(dcs_frame, 109)) s->x_resolution = T4_X_RESOLUTION_600; else if (test_ctrl_bit(dcs_frame, 43) || test_ctrl_bit(dcs_frame, 108)) s->x_resolution = T4_X_RESOLUTION_R16; else if (test_ctrl_bit(dcs_frame, 42) || test_ctrl_bit(dcs_frame, 107)) s->x_resolution = T4_X_RESOLUTION_300; else s->x_resolution = T4_X_RESOLUTION_R8; if (test_ctrl_bit(dcs_frame, 106) || test_ctrl_bit(dcs_frame, 109)) s->y_resolution = T4_Y_RESOLUTION_1200; else if (test_ctrl_bit(dcs_frame, 108)) s->y_resolution = T4_Y_RESOLUTION_800; else if (test_ctrl_bit(dcs_frame, 105) || test_ctrl_bit(dcs_frame, 107)) s->y_resolution = T4_Y_RESOLUTION_600; else if (test_ctrl_bit(dcs_frame, 41) || test_ctrl_bit(dcs_frame, 43)) s->y_resolution = T4_Y_RESOLUTION_SUPERFINE; else if (test_ctrl_bit(dcs_frame, 42)) s->y_resolution = T4_Y_RESOLUTION_300; else if (test_ctrl_bit(dcs_frame, 15)) s->y_resolution = T4_Y_RESOLUTION_FINE; else s->y_resolution = T4_Y_RESOLUTION_STANDARD; if (s->x_resolution == T4_X_RESOLUTION_1200) i = 5; else if (s->x_resolution == T4_X_RESOLUTION_600) i = 4; else if (s->x_resolution == T4_X_RESOLUTION_R16) i = 3; else if (s->x_resolution == T4_X_RESOLUTION_300) i = 2; else if (s->x_resolution == T4_X_RESOLUTION_R4) i = 0; else i = 1; s->image_width = widths[i][dcs_frame[5] & (DISBIT2 | DISBIT1)]; /* Check which compression we will use. */ if (test_ctrl_bit(dcs_frame, 31)) s->line_encoding = T4_COMPRESSION_ITU_T6; else if (test_ctrl_bit(dcs_frame, 16)) s->line_encoding = T4_COMPRESSION_ITU_T4_2D; else s->line_encoding = T4_COMPRESSION_ITU_T4_1D; span_log(&s->logging, SPAN_LOG_FLOW, "Selected compression %d\n", s->line_encoding); if (!test_ctrl_bit(dcs_frame, 10)) span_log(&s->logging, SPAN_LOG_PROTOCOL_WARNING, "Remote is not requesting receive in DCS\n"); if ((s->current_fallback = find_fallback_entry(dcs_frame[4] & (DISBIT6 | DISBIT5 | DISBIT4 | DISBIT3))) < 0) { span_log(&s->logging, SPAN_LOG_FLOW, "Remote asked for a modem standard we do not support\n"); return -1; } s->error_correcting_mode = (test_ctrl_bit(dcs_frame, 27) != 0); if (s->phase_b_handler) { new_status = s->phase_b_handler(s, s->phase_d_user_data, msg[2]); if (new_status != T30_ERR_OK) { span_log(&s->logging, SPAN_LOG_FLOW, "Application rejected DCS - '%s'\n", t30_completion_code_to_str(new_status)); s->current_status = new_status; /* TODO: If FNV is allowed, process it here */ send_dcn(s); return -1; } } /* Start document reception */ span_log(&s->logging, SPAN_LOG_FLOW, "Get document at %dbps, modem %d\n", fallback_sequence[s->current_fallback].bit_rate, fallback_sequence[s->current_fallback].modem_type); if (s->rx_file[0] == '\0') { span_log(&s->logging, SPAN_LOG_FLOW, "No document to receive\n"); s->current_status = T30_ERR_FILEERROR; send_dcn(s); return -1; } if (!s->in_message) { if (t4_rx_init(&(s->t4), s->rx_file, s->output_encoding) == NULL) { span_log(&s->logging, SPAN_LOG_WARNING, "Cannot open target TIFF file '%s'\n", s->rx_file); s->current_status = T30_ERR_FILEERROR; send_dcn(s); return -1; } s->operation_in_progress = OPERATION_IN_PROGRESS_T4_RX; } if (!(s->iaf & T30_IAF_MODE_NO_TCF)) { timer_t2_start(s); set_state(s, T30_STATE_F_TCF); set_phase(s, T30_PHASE_C_NON_ECM_RX); } return 0; } /*- End of function --------------------------------------------------------*/ static int send_deferred_pps_response(t30_state_t *s) { queue_phase(s, T30_PHASE_D_TX); if (s->ecm_first_bad_frame >= s->ecm_frames) { /* Everything was OK. We can accept the data and move on. */ t30_ecm_commit_partial_page(s); switch (s->last_pps_fcf2) { case T30_NULL: /* We can confirm this partial page. */ break; default: /* We can confirm the whole page. */ s->next_rx_step = s->last_pps_fcf2; t4_rx_end_page(&(s->t4)); if (s->phase_d_handler) s->phase_d_handler(s, s->phase_d_user_data, s->last_pps_fcf2); rx_start_page(s); break; } set_state(s, T30_STATE_F_POST_RCP_MCF); send_simple_frame(s, T30_MCF); } else { /* We need to send the PPR frame we have created, to try to fill in the missing/bad data. */ set_state(s, T30_STATE_F_POST_RCP_PPR); s->ecm_frame_map[0] = 0xFF; s->ecm_frame_map[1] = 0x13; s->ecm_frame_map[2] = (uint8_t) (T30_PPR | s->dis_received); send_frame(s, s->ecm_frame_map, 3 + 32); } return 0; } /*- End of function --------------------------------------------------------*/ static int process_rx_pps(t30_state_t *s, const uint8_t *msg, int len) { int page; int block; int frames; int i; int j; int frame_no; if (len < 7) { span_log(&s->logging, SPAN_LOG_FLOW, "Bad PPS message length %d.\n", len); return -1; } s->last_pps_fcf2 = msg[3] & 0xFE; page = msg[4]; block = msg[5]; /* The frames count is not well specified in T.30. In practice it seems it might be the number of frames in the current block, or it might be the number of frames in the current burst of transmission. For a burst of resent frames this would make it smaller than the actual size of the block. If we only accept the number when it exceeds previous values, we should get the real number of frames in the block. */ frames = msg[6] + 1; if (s->ecm_frames < 0) { /* First time. Take the number and believe in it. */ s->ecm_frames = frames; } else { /* If things have gone wrong, the far end might try to send us zero FCD frames. It can't represent zero in the block count field, so it might put zero there, or it might simplistically insert (blocks - 1), and put 0xFF there. Beware of this. */ if (frames == 0xFF) { /* This is probably zero, erroneously rolled over to the maximum count */ frames = 0; } } span_log(&s->logging, SPAN_LOG_FLOW, "Received PPS + %s\n", t30_frametype(msg[3])); /* Build a bit map of which frames we now have stored OK */ frame_no = 0; s->ecm_first_bad_frame = 256; for (i = 3; i < 3 + 32; i++) { s->ecm_frame_map[i] = 0; for (j = 0; j < 8; j++) { if (s->ecm_len[frame_no] < 0) { s->ecm_frame_map[i] |= (1 << j); if (frame_no < s->ecm_first_bad_frame) s->ecm_first_bad_frame = frame_no; } frame_no++; } } /* Are there any bad frames, or does our scan represent things being OK? */ switch (s->last_pps_fcf2) { case T30_NULL: case T30_EOP: case T30_EOM: case T30_MPS: case T30_PRI_EOP: case T30_PRI_EOM: case T30_PRI_MPS: if (s->receiver_not_ready_count > 0) { queue_phase(s, T30_PHASE_D_TX); s->receiver_not_ready_count--; set_state(s, T30_STATE_F_POST_RCP_RNR); send_simple_frame(s, T30_RNR); } else { send_deferred_pps_response(s); } break; default: unexpected_final_frame(s, msg, len); break; } return 0; } /*- End of function --------------------------------------------------------*/ static void process_rx_ppr(t30_state_t *s, const uint8_t *msg, int len) { int i; int j; int frame_no; uint8_t frame[4]; if (len != 3 + 32) { span_log(&s->logging, SPAN_LOG_FLOW, "Bad length for PPR bits - %d\n", len); /* TODO: probably should send DCN */ return; } /* Check which frames are OK, and mark them as OK. */ for (i = 0; i < 32; i++) { for (j = 0; j < 8; j++) { frame_no = (i << 3) + j; /* Tick off the frames they are not complaining about as OK */ if ((msg[i + 3] & (1 << j)) == 0) { if (s->ecm_len[frame_no] >= 0) s->ecm_progress++; s->ecm_len[frame_no] = -1; } else { if (frame_no < s->ecm_frames) span_log(&s->logging, SPAN_LOG_FLOW, "Frame %d to be resent\n", frame_no); #if 0 /* Diagnostic: See if the other end is complaining about something we didn't even send this time. */ if (s->ecm_len[frame_no] < 0) span_log(&s->logging, SPAN_LOG_FLOW, "PPR contains complaint about frame %d, which was not sent\n", frame_no); #endif } } } if (++s->ppr_count >= PPR_LIMIT_BEFORE_CTC_OR_EOR) { /* Continue to correct? */ /* Continue only if we have been making progress */ s->ppr_count = 0; if (s->ecm_progress) { s->ecm_progress = 0; set_state(s, T30_STATE_IV_CTC); queue_phase(s, T30_PHASE_D_TX); send_simple_frame(s, T30_CTC); } else { set_state(s, T30_STATE_IV_EOR); queue_phase(s, T30_PHASE_D_TX); frame[0] = 0xFF; frame[1] = 0x13; frame[2] = (uint8_t) (T30_EOR | s->dis_received); frame[3] = (s->ecm_at_page_end) ? ((uint8_t) (s->next_tx_step | s->dis_received)) : T30_NULL; span_log(&s->logging, SPAN_LOG_FLOW, "Sending EOR + %s\n", t30_frametype(frame[3])); send_frame(s, frame, 4); } } else { /* Initiate resending of the remainder of the frames. */ set_state(s, T30_STATE_IV); queue_phase(s, T30_PHASE_C_ECM_TX); send_first_ecm_frame(s); } } /*- End of function --------------------------------------------------------*/ static void process_rx_fcd(t30_state_t *s, const uint8_t *msg, int len) { int frame_no; /* Facsimile coded data */ switch (s->state) { case T30_STATE_F_DOC_ECM: if (len <= 4 + 256) { frame_no = msg[3]; /* Just store the actual image data, and record its length */ span_log(&s->logging, SPAN_LOG_FLOW, "Storing ECM frame %d, length %d\n", frame_no, len - 4); memcpy(&s->ecm_data[frame_no][0], &msg[4], len - 4); s->ecm_len[frame_no] = (int16_t) (len - 4); /* In case we are just after a CTC/CTR exchange, which kicked us back to long training */ s->short_train = TRUE; } else { unexpected_frame_length(s, msg, len); } break; default: unexpected_non_final_frame(s, msg, len); break; } } /*- End of function --------------------------------------------------------*/ static void process_rx_rcp(t30_state_t *s, const uint8_t *msg, int len) { /* Return to control for partial page. These might come through with or without the final frame tag, so we have this routine to deal with the "no final frame tag" case. */ switch (s->state) { case T30_STATE_F_DOC_ECM: set_state(s, T30_STATE_F_POST_DOC_ECM); queue_phase(s, T30_PHASE_D_RX); break; case T30_STATE_F_POST_DOC_ECM: /* Just ignore this */ break; default: unexpected_non_final_frame(s, msg, len); break; } } /*- End of function --------------------------------------------------------*/ static void process_rx_fnv(t30_state_t *s, const uint8_t *msg, int len) { logging_state_t *log; const char *x; /* Field not valid */ /* TODO: analyse the message, as per 5.3.6.2.13 */ if (!span_log_test(&s->logging, SPAN_LOG_FLOW)) return; log = &s->logging; if ((msg[3] & 0x01)) span_log(log, SPAN_LOG_FLOW, " Incorrect password (PWD).\n"); if ((msg[3] & 0x02)) span_log(log, SPAN_LOG_FLOW, " Selective polling reference (SEP) not known.\n"); if ((msg[3] & 0x04)) span_log(log, SPAN_LOG_FLOW, " Sub-address (SUB) not known.\n"); if ((msg[3] & 0x08)) span_log(log, SPAN_LOG_FLOW, " Sender identity (SID) not known.\n"); if ((msg[3] & 0x10)) span_log(log, SPAN_LOG_FLOW, " Secure fax error.\n"); if ((msg[3] & 0x20)) span_log(log, SPAN_LOG_FLOW, " Transmitting subscriber identity (TSI) not accepted.\n"); if ((msg[3] & 0x40)) span_log(log, SPAN_LOG_FLOW, " Polled sub-address (PSA) not known.\n"); if (len > 4 && (msg[3] & DISBIT8)) { if ((msg[4] & 0x01)) span_log(log, SPAN_LOG_FLOW, " BFT negotiations request not accepted.\n"); if ((msg[4] & 0x02)) span_log(log, SPAN_LOG_FLOW, " Internet routing address (IRA) not known.\n"); if ((msg[4] & 0x04)) span_log(log, SPAN_LOG_FLOW, " Internet selective polling address (ISP) not known.\n"); } if (len > 5) { span_log(log, SPAN_LOG_FLOW, " FNV sequence number %d.\n", msg[5]); } if (len > 6) { switch (msg[6]) { case T30_PWD: x = "Incorrect password (PWD)"; break; case T30_SEP: x = "Selective polling reference (SEP) not known"; break; case T30_SUB: case T30_SUB | 0x01: x = "Sub-address (SUB) not known"; break; case T30_SID: case T30_SID | 0x01: x = "Sender identity (SID) not known"; break; case T30_SPI: x = "Secure fax error"; break; case T30_TSI: case T30_TSI | 0x01: x = "Transmitting subscriber identity (TSI) not accepted"; break; case T30_PSA: x = "Polled sub-address (PSA) not known"; break; default: x = "???"; break; } span_log(log, SPAN_LOG_FLOW, " FNV diagnostic info type %s.\n", x); } if (len > 7) { span_log(log, SPAN_LOG_FLOW, " FNV length %d.\n", msg[7]); } /* We've decoded it, but we don't yet know how to deal with it, so treat it as unexpected */ unexpected_final_frame(s, msg, len); } /*- End of function --------------------------------------------------------*/ static void process_state_answering(t30_state_t *s, const uint8_t *msg, int len) { switch (msg[2] & 0xFE) { case T30_DIS: /* TODO: This is a fudge to allow for starting up in T.38, where the other end has seen DIS by analogue modem means, and has immediately sent DIS/DTC. We might have missed useful info, like TSI, but just accept things and carry on form now. */ span_log(&s->logging, SPAN_LOG_FLOW, "DIS/DTC before DIS\n"); process_rx_dis_dtc(s, msg, len); break; case T30_DCS: /* TODO: This is a fudge to allow for starting up in T.38, where the other end has seen DIS by analogue modem means, and has immediately sent DCS. We might have missed useful info, like TSI, but just accept things and carry on form now. */ span_log(&s->logging, SPAN_LOG_FLOW, "DCS before DIS\n"); process_rx_dcs(s, msg, len); break; case T30_DCN: s->current_status = T30_ERR_TX_GOTDCN; disconnect(s); break; default: /* We don't know what to do with this. */ unexpected_final_frame(s, msg, len); break; } } /*- End of function --------------------------------------------------------*/ static void process_state_b(t30_state_t *s, const uint8_t *msg, int len) { switch (msg[2] & 0xFE) { case T30_DCN: /* Just ignore any DCN's which appear at this stage. */ break; case T30_CRP: repeat_last_command(s); break; case T30_FNV: process_rx_fnv(s, msg, len); break; default: /* We don't know what to do with this. */ unexpected_final_frame(s, msg, len); break; } } /*- End of function --------------------------------------------------------*/ static void process_state_c(t30_state_t *s, const uint8_t *msg, int len) { switch (msg[2] & 0xFE) { case T30_DCN: /* Just ignore any DCN's which appear at this stage. */ break; case T30_CRP: repeat_last_command(s); break; case T30_FNV: process_rx_fnv(s, msg, len); break; default: /* We don't know what to do with this. */ unexpected_final_frame(s, msg, len); break; } } /*- End of function --------------------------------------------------------*/ static void process_state_d(t30_state_t *s, const uint8_t *msg, int len) { /* We should be sending the DCS sequence right now */ switch (msg[2] & 0xFE) { case T30_DCN: s->current_status = T30_ERR_TX_BADDCS; disconnect(s); break; case T30_CRP: repeat_last_command(s); break; case T30_FNV: process_rx_fnv(s, msg, len); break; default: /* We don't know what to do with this. */ unexpected_final_frame(s, msg, len); break; } } /*- End of function --------------------------------------------------------*/ static void process_state_d_tcf(t30_state_t *s, const uint8_t *msg, int len) { /* We should be sending the TCF data right now */ switch (msg[2] & 0xFE) { case T30_DCN: s->current_status = T30_ERR_TX_BADDCS; disconnect(s); break; case T30_CRP: repeat_last_command(s); break; case T30_FNV: process_rx_fnv(s, msg, len); break; default: /* We don't know what to do with this. */ unexpected_final_frame(s, msg, len); break; } } /*- End of function --------------------------------------------------------*/ static void process_state_d_post_tcf(t30_state_t *s, const uint8_t *msg, int len) { switch (msg[2] & 0xFE) { case T30_CFR: /* Trainability test succeeded. Send the document. */ span_log(&s->logging, SPAN_LOG_FLOW, "Trainability test succeeded\n"); s->retries = 0; s->short_train = TRUE; if (s->error_correcting_mode) { set_state(s, T30_STATE_IV); queue_phase(s, T30_PHASE_C_ECM_TX); send_first_ecm_frame(s); } else { set_state(s, T30_STATE_I); queue_phase(s, T30_PHASE_C_NON_ECM_TX); } break; case T30_FTT: /* Trainability test failed. Try again. */ span_log(&s->logging, SPAN_LOG_FLOW, "Trainability test failed\n"); s->retries = 0; s->short_train = FALSE; if (step_fallback_entry(s) < 0) { /* We have fallen back as far as we can go. Give up. */ s->current_fallback = 0; s->current_status = T30_ERR_CANNOT_TRAIN; send_dcn(s); break; } queue_phase(s, T30_PHASE_B_TX); send_dcs_sequence(s, TRUE); break; case T30_DIS: /* It appears they didn't see what we sent - retry the TCF */ if (++s->retries > MAX_MESSAGE_TRIES) { s->current_status = T30_ERR_RETRYDCN; send_dcn(s); break; } queue_phase(s, T30_PHASE_B_TX); /* TODO: should we reassess the new DIS message, and possibly adjust the DCS we use? */ send_dcs_sequence(s, TRUE); break; case T30_DCN: s->current_status = T30_ERR_TX_BADDCS; disconnect(s); break; case T30_CRP: repeat_last_command(s); break; case T30_FNV: process_rx_fnv(s, msg, len); break; default: /* We don't know what to do with this. */ unexpected_final_frame(s, msg, len); break; } } /*- End of function --------------------------------------------------------*/ static void process_state_f_tcf(t30_state_t *s, const uint8_t *msg, int len) { /* We should be receiving TCF right now, not HDLC messages */ switch (msg[2] & 0xFE) { case T30_CRP: repeat_last_command(s); break; case T30_FNV: process_rx_fnv(s, msg, len); break; default: /* We don't know what to do with this. */ unexpected_final_frame(s, msg, len); break; } } /*- End of function --------------------------------------------------------*/ static void process_state_f_cfr(t30_state_t *s, const uint8_t *msg, int len) { /* We're waiting for a response to the CFR we sent */ switch (msg[2] & 0xFE) { case T30_CRP: repeat_last_command(s); break; case T30_FNV: process_rx_fnv(s, msg, len); break; default: /* We don't know what to do with this. */ unexpected_final_frame(s, msg, len); break; } } /*- End of function --------------------------------------------------------*/ static void process_state_f_ftt(t30_state_t *s, const uint8_t *msg, int len) { /* We're waiting for a response to the FTT we sent */ switch (msg[2] & 0xFE) { case T30_CRP: repeat_last_command(s); break; case T30_FNV: process_rx_fnv(s, msg, len); break; default: /* We don't know what to do with this. */ unexpected_final_frame(s, msg, len); break; } } /*- End of function --------------------------------------------------------*/ static void process_state_f_doc_non_ecm(t30_state_t *s, const uint8_t *msg, int len) { /* If we are getting HDLC messages, and we have not moved to the _POST_DOC_NON_ECM state, it looks like we didn't see the image data carrier properly. */ switch (msg[2] & 0xFE) { case T30_DIS: process_rx_dis_dtc(s, msg, len); break; case T30_DCS: process_rx_dcs(s, msg, len); break; case T30_MPS: /* Treat this as a bad quality page. */ if (s->phase_d_handler) s->phase_d_handler(s, s->phase_d_user_data, msg[2] & 0xFE); s->next_rx_step = T30_MPS; queue_phase(s, T30_PHASE_D_TX); set_state(s, T30_STATE_III_Q_RTN); send_simple_frame(s, T30_RTN); break; case T30_PRI_MPS: /* Treat this as a bad quality page. */ if (s->phase_d_handler) { s->phase_d_handler(s, s->phase_d_user_data, msg[2] & 0xFE); s->timer_t3 = ms_to_samples(DEFAULT_TIMER_T3); } s->next_rx_step = T30_PRI_MPS; set_state(s, T30_STATE_III_Q_RTN); break; case T30_EOM: /* Treat this as a bad quality page. */ if (s->phase_d_handler) s->phase_d_handler(s, s->phase_d_user_data, msg[2] & 0xFE); s->next_rx_step = T30_EOM; /* Return to phase B */ queue_phase(s, T30_PHASE_B_TX); set_state(s, T30_STATE_III_Q_RTN); send_simple_frame(s, T30_RTN); break; case T30_PRI_EOM: /* Treat this as a bad quality page. */ if (s->phase_d_handler) { s->phase_d_handler(s, s->phase_d_user_data, msg[2] & 0xFE); s->timer_t3 = ms_to_samples(DEFAULT_TIMER_T3); } s->next_rx_step = T30_PRI_EOM; set_state(s, T30_STATE_III_Q_RTN); break; case T30_EOP: /* Treat this as a bad quality page. */ if (s->phase_d_handler) s->phase_d_handler(s, s->phase_d_user_data, msg[2] & 0xFE); s->next_rx_step = T30_EOP; queue_phase(s, T30_PHASE_D_TX); set_state(s, T30_STATE_III_Q_RTN); send_simple_frame(s, T30_RTN); break; case T30_PRI_EOP: /* Treat this as a bad quality page. */ if (s->phase_d_handler) { s->phase_d_handler(s, s->phase_d_user_data, msg[2] & 0xFE); s->timer_t3 = ms_to_samples(DEFAULT_TIMER_T3); } s->next_rx_step = T30_PRI_EOP; set_state(s, T30_STATE_III_Q_RTN); break; case T30_DCN: s->current_status = T30_ERR_RX_DCNDATA; disconnect(s); break; case T30_CRP: repeat_last_command(s); break; case T30_FNV: process_rx_fnv(s, msg, len); break; default: /* We don't know what to do with this. */ unexpected_final_frame(s, msg, len); break; } } /*- End of function --------------------------------------------------------*/ static void process_state_f_post_doc_non_ecm(t30_state_t *s, const uint8_t *msg, int len) { switch (msg[2] & 0xFE) { case T30_MPS: if (s->phase_d_handler) s->phase_d_handler(s, s->phase_d_user_data, msg[2] & 0xFE); s->next_rx_step = T30_MPS; queue_phase(s, T30_PHASE_D_TX); switch (copy_quality(s)) { case T30_COPY_QUALITY_PERFECT: case T30_COPY_QUALITY_GOOD: t4_rx_end_page(&(s->t4)); rx_start_page(s); set_state(s, T30_STATE_III_Q_MCF); send_simple_frame(s, T30_MCF); break; case T30_COPY_QUALITY_POOR: t4_rx_end_page(&(s->t4)); rx_start_page(s); set_state(s, T30_STATE_III_Q_RTP); send_simple_frame(s, T30_RTP); break; case T30_COPY_QUALITY_BAD: rx_start_page(s); set_state(s, T30_STATE_III_Q_RTN); send_simple_frame(s, T30_RTN); break; } break; case T30_PRI_MPS: if (s->phase_d_handler) { s->phase_d_handler(s, s->phase_d_user_data, msg[2] & 0xFE); s->timer_t3 = ms_to_samples(DEFAULT_TIMER_T3); } s->next_rx_step = T30_PRI_MPS; switch (copy_quality(s)) { case T30_COPY_QUALITY_PERFECT: case T30_COPY_QUALITY_GOOD: t4_rx_end_page(&(s->t4)); t4_rx_end(&(s->t4)); s->operation_in_progress = OPERATION_IN_PROGRESS_NONE; s->in_message = FALSE; set_state(s, T30_STATE_III_Q_MCF); break; case T30_COPY_QUALITY_POOR: t4_rx_end_page(&(s->t4)); t4_rx_end(&(s->t4)); s->operation_in_progress = OPERATION_IN_PROGRESS_NONE; s->in_message = FALSE; set_state(s, T30_STATE_III_Q_RTP); break; case T30_COPY_QUALITY_BAD: set_state(s, T30_STATE_III_Q_RTN); break; } break; case T30_EOM: if (s->phase_d_handler) s->phase_d_handler(s, s->phase_d_user_data, msg[2] & 0xFE); s->next_rx_step = T30_EOM; /* Return to phase B */ queue_phase(s, T30_PHASE_B_TX); switch (copy_quality(s)) { case T30_COPY_QUALITY_PERFECT: case T30_COPY_QUALITY_GOOD: t4_rx_end_page(&(s->t4)); rx_start_page(s); set_state(s, T30_STATE_III_Q_MCF); send_simple_frame(s, T30_MCF); break; case T30_COPY_QUALITY_POOR: t4_rx_end_page(&(s->t4)); rx_start_page(s); set_state(s, T30_STATE_III_Q_RTP); send_simple_frame(s, T30_RTP); break; case T30_COPY_QUALITY_BAD: rx_start_page(s); set_state(s, T30_STATE_III_Q_RTN); send_simple_frame(s, T30_RTN); break; } break; case T30_PRI_EOM: if (s->phase_d_handler) { s->phase_d_handler(s, s->phase_d_user_data, msg[2] & 0xFE); s->timer_t3 = ms_to_samples(DEFAULT_TIMER_T3); } s->next_rx_step = T30_PRI_EOM; switch (copy_quality(s)) { case T30_COPY_QUALITY_PERFECT: case T30_COPY_QUALITY_GOOD: t4_rx_end_page(&(s->t4)); t4_rx_end(&(s->t4)); s->operation_in_progress = OPERATION_IN_PROGRESS_NONE; s->in_message = FALSE; set_state(s, T30_STATE_III_Q_MCF); break; case T30_COPY_QUALITY_POOR: t4_rx_end_page(&(s->t4)); t4_rx_end(&(s->t4)); s->operation_in_progress = OPERATION_IN_PROGRESS_NONE; s->in_message = FALSE; set_state(s, T30_STATE_III_Q_RTP); break; case T30_COPY_QUALITY_BAD: set_state(s, T30_STATE_III_Q_RTN); break; } break; case T30_EOP: if (s->phase_d_handler) s->phase_d_handler(s, s->phase_d_user_data, msg[2] & 0xFE); s->next_rx_step = T30_EOP; queue_phase(s, T30_PHASE_D_TX); switch (copy_quality(s)) { case T30_COPY_QUALITY_PERFECT: case T30_COPY_QUALITY_GOOD: t4_rx_end_page(&(s->t4)); t4_rx_end(&(s->t4)); s->operation_in_progress = OPERATION_IN_PROGRESS_NONE; s->in_message = FALSE; set_state(s, T30_STATE_III_Q_MCF); send_simple_frame(s, T30_MCF); break; case T30_COPY_QUALITY_POOR: t4_rx_end_page(&(s->t4)); t4_rx_end(&(s->t4)); s->operation_in_progress = OPERATION_IN_PROGRESS_NONE; s->in_message = FALSE; set_state(s, T30_STATE_III_Q_RTP); send_simple_frame(s, T30_RTP); break; case T30_COPY_QUALITY_BAD: set_state(s, T30_STATE_III_Q_RTN); send_simple_frame(s, T30_RTN); break; } break; case T30_PRI_EOP: if (s->phase_d_handler) { s->phase_d_handler(s, s->phase_d_user_data, msg[2] & 0xFE); s->timer_t3 = ms_to_samples(DEFAULT_TIMER_T3); } s->next_rx_step = T30_PRI_EOP; switch (copy_quality(s)) { case T30_COPY_QUALITY_PERFECT: case T30_COPY_QUALITY_GOOD: t4_rx_end_page(&(s->t4)); t4_rx_end(&(s->t4)); s->operation_in_progress = OPERATION_IN_PROGRESS_NONE; s->in_message = FALSE; set_state(s, T30_STATE_III_Q_MCF); break; case T30_COPY_QUALITY_POOR: t4_rx_end_page(&(s->t4)); t4_rx_end(&(s->t4)); s->operation_in_progress = OPERATION_IN_PROGRESS_NONE; s->in_message = FALSE; set_state(s, T30_STATE_III_Q_RTP); break; case T30_COPY_QUALITY_BAD: set_state(s, T30_STATE_III_Q_RTN); break; } break; case T30_DCN: s->current_status = T30_ERR_RX_DCNFAX; disconnect(s); break; case T30_CRP: repeat_last_command(s); break; case T30_FNV: process_rx_fnv(s, msg, len); break; default: /* We don't know what to do with this. */ unexpected_final_frame(s, msg, len); break; } } /*- End of function --------------------------------------------------------*/ static void process_state_f_doc_ecm(t30_state_t *s, const uint8_t *msg, int len) { int fcf2; /* This actually handles 2 states - _DOC_ECM and _POST_DOC_ECM - as they are very similar */ switch (msg[2] & 0xFE) { case T30_DIS: process_rx_dis_dtc(s, msg, len); break; case T30_DCS: process_rx_dcs(s, msg, len); break; case T4_RCP: if (s->state == T30_STATE_F_DOC_ECM) { /* Return to control for partial page */ set_state(s, T30_STATE_F_POST_DOC_ECM); queue_phase(s, T30_PHASE_D_RX); } else { /* Ignore extra RCP frames. The source will usually send several to maximise the chance of one getting through OK. */ } break; case T30_EOR: if (len != 4) { unexpected_frame_length(s, msg, len); break; } fcf2 = msg[3] & 0xFE; span_log(&s->logging, SPAN_LOG_FLOW, "Received EOR + %s\n", t30_frametype(msg[3])); switch (fcf2) { case T30_NULL: break; case T30_PRI_EOM: case T30_PRI_MPS: case T30_PRI_EOP: /* TODO: Alert operator */ /* Fall through */ case T30_EOM: case T30_MPS: case T30_EOP: s->next_rx_step = fcf2; queue_phase(s, T30_PHASE_D_TX); send_simple_frame(s, T30_ERR); break; default: unexpected_final_frame(s, msg, len); break; } break; case T30_PPS: process_rx_pps(s, msg, len); break; case T30_CTC: /* T.30 says we change back to long training here */ s->short_train = FALSE; queue_phase(s, T30_PHASE_D_TX); send_simple_frame(s, T30_CTR); break; case T30_RR: break; case T30_DCN: s->current_status = T30_ERR_RX_DCNDATA; disconnect(s); break; case T30_CRP: repeat_last_command(s); break; case T30_FNV: process_rx_fnv(s, msg, len); break; default: /* We don't know what to do with this. */ unexpected_final_frame(s, msg, len); break; } } /*- End of function --------------------------------------------------------*/ static void process_state_f_post_rcp_mcf(t30_state_t *s, const uint8_t *msg, int len) { switch (msg[2] & 0xFE) { case T30_CRP: repeat_last_command(s); break; case T30_FNV: process_rx_fnv(s, msg, len); break; case T30_DCN: disconnect(s); break; default: /* We don't know what to do with this. */ unexpected_final_frame(s, msg, len); break; } } /*- End of function --------------------------------------------------------*/ static void process_state_f_post_rcp_ppr(t30_state_t *s, const uint8_t *msg, int len) { switch (msg[2] & 0xFE) { case T30_CRP: repeat_last_command(s); break; case T30_FNV: process_rx_fnv(s, msg, len); break; default: /* We don't know what to do with this. */ unexpected_final_frame(s, msg, len); break; } } /*- End of function --------------------------------------------------------*/ static void process_state_f_post_rcp_rnr(t30_state_t *s, const uint8_t *msg, int len) { switch (msg[2] & 0xFE) { case T30_RR: if (s->receiver_not_ready_count > 0) { s->receiver_not_ready_count--; queue_phase(s, T30_PHASE_D_TX); set_state(s, T30_STATE_F_POST_RCP_RNR); send_simple_frame(s, T30_RNR); } else { send_deferred_pps_response(s); } break; case T30_CRP: repeat_last_command(s); break; case T30_FNV: process_rx_fnv(s, msg, len); break; default: /* We don't know what to do with this. */ unexpected_final_frame(s, msg, len); break; } } /*- End of function --------------------------------------------------------*/ static void process_state_r(t30_state_t *s, const uint8_t *msg, int len) { switch (msg[2] & 0xFE) { case T30_DIS: process_rx_dis_dtc(s, msg, len); break; case T30_DCS: process_rx_dcs(s, msg, len); break; case T30_DCN: /* Received a DCN while waiting for a DIS */ s->current_status = T30_ERR_TX_GOTDCN; disconnect(s); break; case T30_CRP: repeat_last_command(s); break; case T30_FNV: process_rx_fnv(s, msg, len); break; default: /* We don't know what to do with this. */ unexpected_final_frame(s, msg, len); break; } } /*- End of function --------------------------------------------------------*/ static void process_state_t(t30_state_t *s, const uint8_t *msg, int len) { switch (msg[2] & 0xFE) { case T30_DIS: process_rx_dis_dtc(s, msg, len); break; case T30_DCN: s->current_status = T30_ERR_RX_DCNWHY; disconnect(s); break; case T30_CRP: repeat_last_command(s); break; case T30_FNV: process_rx_fnv(s, msg, len); break; default: /* We don't know what to do with this. */ unexpected_final_frame(s, msg, len); s->current_status = T30_ERR_TX_NODIS; break; } } /*- End of function --------------------------------------------------------*/ static void process_state_i(t30_state_t *s, const uint8_t *msg, int len) { switch (msg[2] & 0xFE) { case T30_CRP: repeat_last_command(s); break; case T30_FNV: process_rx_fnv(s, msg, len); break; default: /* We don't know what to do with this. */ unexpected_final_frame(s, msg, len); break; } } /*- End of function --------------------------------------------------------*/ static void process_state_ii(t30_state_t *s, const uint8_t *msg, int len) { switch (msg[2] & 0xFE) { case T30_CRP: repeat_last_command(s); break; case T30_FNV: process_rx_fnv(s, msg, len); break; default: /* We don't know what to do with this. */ unexpected_final_frame(s, msg, len); break; } } /*- End of function --------------------------------------------------------*/ static void process_state_ii_q(t30_state_t *s, const uint8_t *msg, int len) { t4_stats_t stats; switch (msg[2] & 0xFE) { case T30_MCF: switch (s->next_tx_step) { case T30_MPS: case T30_PRI_MPS: s->retries = 0; t4_tx_end_page(&(s->t4)); if (s->phase_d_handler) s->phase_d_handler(s, s->phase_d_user_data, T30_MCF); if (tx_start_page(s)) { /* TODO: recover */ break; } set_state(s, T30_STATE_I); queue_phase(s, T30_PHASE_C_NON_ECM_TX); break; case T30_EOM: case T30_PRI_EOM: s->retries = 0; t4_tx_end_page(&(s->t4)); if (s->phase_d_handler) s->phase_d_handler(s, s->phase_d_user_data, T30_MCF); t4_tx_end(&(s->t4)); s->operation_in_progress = OPERATION_IN_PROGRESS_NONE; set_state(s, T30_STATE_R); if (span_log_test(&s->logging, SPAN_LOG_FLOW)) { t4_get_transfer_statistics(&(s->t4), &stats); span_log(&s->logging, SPAN_LOG_FLOW, "Success - delivered %d pages\n", stats.pages_transferred); } break; case T30_EOP: case T30_PRI_EOP: s->retries = 0; t4_tx_end_page(&(s->t4)); if (s->phase_d_handler) s->phase_d_handler(s, s->phase_d_user_data, T30_MCF); t4_tx_end(&(s->t4)); s->operation_in_progress = OPERATION_IN_PROGRESS_NONE; send_dcn(s); if (span_log_test(&s->logging, SPAN_LOG_FLOW)) { t4_get_transfer_statistics(&(s->t4), &stats); span_log(&s->logging, SPAN_LOG_FLOW, "Success - delivered %d pages\n", stats.pages_transferred); } break; } break; case T30_RTP: switch (s->next_tx_step) { case T30_MPS: case T30_PRI_MPS: s->retries = 0; if (s->phase_d_handler) s->phase_d_handler(s, s->phase_d_user_data, T30_RTP); /* Send fresh training, and then the next page */ if (step_fallback_entry(s) < 0) { /* We have fallen back as far as we can go. Give up. */ s->current_fallback = 0; s->current_status = T30_ERR_CANNOT_TRAIN; send_dcn(s); break; } queue_phase(s, T30_PHASE_B_TX); restart_sending_document(s); break; case T30_EOM: case T30_PRI_EOM: s->retries = 0; if (s->phase_d_handler) s->phase_d_handler(s, s->phase_d_user_data, T30_RTP); if (step_fallback_entry(s) < 0) { /* We have fallen back as far as we can go. Give up. */ s->current_fallback = 0; s->current_status = T30_ERR_CANNOT_TRAIN; send_dcn(s); break; } /* TODO: should go back to T, and resend */ set_state(s, T30_STATE_R); break; case T30_EOP: case T30_PRI_EOP: s->retries = 0; if (s->phase_d_handler) s->phase_d_handler(s, s->phase_d_user_data, T30_RTP); s->current_status = T30_ERR_TX_INVALRSP; send_dcn(s); break; } break; case T30_RTN: switch (s->next_tx_step) { case T30_MPS: case T30_PRI_MPS: s->retries = 0; if (s->phase_d_handler) s->phase_d_handler(s, s->phase_d_user_data, T30_RTN); /* Send fresh training, and then repeat the last page */ if (step_fallback_entry(s) < 0) { /* We have fallen back as far as we can go. Give up. */ s->current_fallback = 0; s->current_status = T30_ERR_CANNOT_TRAIN; send_dcn(s); break; } queue_phase(s, T30_PHASE_B_TX); restart_sending_document(s); break; case T30_EOM: case T30_PRI_EOM: case T30_EOP: case T30_PRI_EOP: s->retries = 0; if (s->phase_d_handler) s->phase_d_handler(s, s->phase_d_user_data, T30_RTN); s->current_status = T30_ERR_TX_INVALRSP; send_dcn(s); break; } break; case T30_PIP: s->retries = 0; if (s->phase_d_handler) { s->phase_d_handler(s, s->phase_d_user_data, T30_PIP); s->timer_t3 = ms_to_samples(DEFAULT_TIMER_T3); } break; case T30_PIN: s->retries = 0; if (s->phase_d_handler) { s->phase_d_handler(s, s->phase_d_user_data, T30_PIN); s->timer_t3 = ms_to_samples(DEFAULT_TIMER_T3); } break; case T30_DCN: switch (s->next_tx_step) { case T30_MPS: case T30_PRI_MPS: case T30_EOM: case T30_PRI_EOM: /* Unexpected DCN after EOM or MPS sequence */ s->current_status = T30_ERR_RX_DCNPHD; break; default: s->current_status = T30_ERR_TX_BADPG; break; } disconnect(s); break; case T30_CRP: repeat_last_command(s); break; case T30_FNV: process_rx_fnv(s, msg, len); break; default: /* We don't know what to do with this. */ unexpected_final_frame(s, msg, len); break; } } /*- End of function --------------------------------------------------------*/ static void process_state_iii_q_mcf(t30_state_t *s, const uint8_t *msg, int len) { switch (msg[2] & 0xFE) { case T30_MPS: case T30_EOM: case T30_EOP: /* Looks like they didn't see our signal. Repeat it */ send_simple_frame(s, T30_MCF); break; case T30_CRP: repeat_last_command(s); break; case T30_FNV: process_rx_fnv(s, msg, len); break; case T30_DCN: disconnect(s); break; default: /* We don't know what to do with this. */ unexpected_final_frame(s, msg, len); break; } } /*- End of function --------------------------------------------------------*/ static void process_state_iii_q_rtp(t30_state_t *s, const uint8_t *msg, int len) { switch (msg[2] & 0xFE) { case T30_MPS: case T30_EOM: case T30_EOP: /* Looks like they didn't see our signal. Repeat it */ send_simple_frame(s, T30_RTP); break; case T30_CRP: repeat_last_command(s); break; case T30_FNV: process_rx_fnv(s, msg, len); break; default: /* We don't know what to do with this. */ unexpected_final_frame(s, msg, len); break; } } /*- End of function --------------------------------------------------------*/ static void process_state_iii_q_rtn(t30_state_t *s, const uint8_t *msg, int len) { switch (msg[2] & 0xFE) { case T30_MPS: case T30_EOM: case T30_EOP: /* Looks like they didn't see our signal. Repeat it */ send_simple_frame(s, T30_RTN); break; case T30_DCN: s->current_status = T30_ERR_RX_DCNNORTN; disconnect(s); break; case T30_CRP: repeat_last_command(s); break; case T30_FNV: process_rx_fnv(s, msg, len); break; default: /* We don't know what to do with this. */ unexpected_final_frame(s, msg, len); break; } } /*- End of function --------------------------------------------------------*/ static void process_state_iv(t30_state_t *s, const uint8_t *msg, int len) { switch (msg[2] & 0xFE) { case T30_CRP: repeat_last_command(s); break; case T30_FNV: process_rx_fnv(s, msg, len); break; default: /* We don't know what to do with this. */ unexpected_final_frame(s, msg, len); break; } } /*- End of function --------------------------------------------------------*/ static void process_state_iv_pps_null(t30_state_t *s, const uint8_t *msg, int len) { t4_stats_t stats; switch (msg[2] & 0xFE) { case T30_MCF: s->retries = 0; s->timer_t5 = 0; /* Is there more of the current page to get, or do we move on? */ span_log(&s->logging, SPAN_LOG_FLOW, "Is there more to send? - %d %d\n", s->ecm_frames, s->ecm_len[255]); if (!s->ecm_at_page_end && get_partial_ecm_page(s) > 0) { span_log(&s->logging, SPAN_LOG_WARNING, "Additional image data to send\n"); s->ecm_block++; set_state(s, T30_STATE_IV); queue_phase(s, T30_PHASE_C_ECM_TX); send_first_ecm_frame(s); } else { span_log(&s->logging, SPAN_LOG_FLOW, "Moving on to the next page\n"); switch (s->next_tx_step) { case T30_MPS: case T30_PRI_MPS: s->retries = 0; t4_tx_end_page(&(s->t4)); if (s->phase_d_handler) s->phase_d_handler(s, s->phase_d_user_data, T30_MCF); if (tx_start_page(s)) { /* TODO: recover */ break; } if (get_partial_ecm_page(s) > 0) { set_state(s, T30_STATE_IV); queue_phase(s, T30_PHASE_C_ECM_TX); send_first_ecm_frame(s); } break; case T30_EOM: case T30_PRI_EOM: s->retries = 0; t4_tx_end_page(&(s->t4)); if (s->phase_d_handler) s->phase_d_handler(s, s->phase_d_user_data, T30_MCF); t4_tx_end(&(s->t4)); s->operation_in_progress = OPERATION_IN_PROGRESS_NONE; set_state(s, T30_STATE_R); if (span_log_test(&s->logging, SPAN_LOG_FLOW)) { t4_get_transfer_statistics(&(s->t4), &stats); span_log(&s->logging, SPAN_LOG_FLOW, "Success - delivered %d pages\n", stats.pages_transferred); } break; case T30_EOP: case T30_PRI_EOP: s->retries = 0; t4_tx_end_page(&(s->t4)); if (s->phase_d_handler) s->phase_d_handler(s, s->phase_d_user_data, T30_MCF); t4_tx_end(&(s->t4)); s->operation_in_progress = OPERATION_IN_PROGRESS_NONE; send_dcn(s); if (span_log_test(&s->logging, SPAN_LOG_FLOW)) { t4_get_transfer_statistics(&(s->t4), &stats); span_log(&s->logging, SPAN_LOG_FLOW, "Success - delivered %d pages\n", stats.pages_transferred); } break; } } break; case T30_PPR: process_rx_ppr(s, msg, len); break; case T30_RNR: if (s->timer_t5 == 0) s->timer_t5 = ms_to_samples(DEFAULT_TIMER_T5); set_state(s, T30_STATE_IV_PPS_RNR); queue_phase(s, T30_PHASE_D_TX); send_simple_frame(s, T30_RR); break; case T30_DCN: s->current_status = T30_ERR_TX_BADPG; disconnect(s); break; case T30_CRP: repeat_last_command(s); break; case T30_FNV: process_rx_fnv(s, msg, len); break; default: /* We don't know what to do with this. */ unexpected_final_frame(s, msg, len); s->current_status = T30_ERR_TX_ECMPHD; break; } } /*- End of function --------------------------------------------------------*/ static void process_state_iv_pps_q(t30_state_t *s, const uint8_t *msg, int len) { t4_stats_t stats; switch (msg[2] & 0xFE) { case T30_MCF: s->retries = 0; s->timer_t5 = 0; /* Is there more of the current page to get, or do we move on? */ span_log(&s->logging, SPAN_LOG_FLOW, "Is there more to send? - %d %d\n", s->ecm_frames, s->ecm_len[255]); if (!s->ecm_at_page_end && get_partial_ecm_page(s) > 0) { span_log(&s->logging, SPAN_LOG_WARNING, "Additional image data to send\n"); s->ecm_block++; set_state(s, T30_STATE_IV); queue_phase(s, T30_PHASE_C_ECM_TX); send_first_ecm_frame(s); } else { span_log(&s->logging, SPAN_LOG_FLOW, "Moving on to the next page\n"); switch (s->next_tx_step) { case T30_MPS: case T30_PRI_MPS: s->retries = 0; t4_tx_end_page(&(s->t4)); if (s->phase_d_handler) s->phase_d_handler(s, s->phase_d_user_data, T30_MCF); if (tx_start_page(s)) { /* TODO: recover */ break; } if (get_partial_ecm_page(s) > 0) { set_state(s, T30_STATE_IV); queue_phase(s, T30_PHASE_C_ECM_TX); send_first_ecm_frame(s); } break; case T30_EOM: case T30_PRI_EOM: s->retries = 0; t4_tx_end_page(&(s->t4)); if (s->phase_d_handler) s->phase_d_handler(s, s->phase_d_user_data, T30_MCF); t4_tx_end(&(s->t4)); s->operation_in_progress = OPERATION_IN_PROGRESS_NONE; set_state(s, T30_STATE_R); if (span_log_test(&s->logging, SPAN_LOG_FLOW)) { t4_get_transfer_statistics(&(s->t4), &stats); span_log(&s->logging, SPAN_LOG_FLOW, "Success - delivered %d pages\n", stats.pages_transferred); } break; case T30_EOP: case T30_PRI_EOP: s->retries = 0; t4_tx_end_page(&(s->t4)); if (s->phase_d_handler) s->phase_d_handler(s, s->phase_d_user_data, T30_MCF); t4_tx_end(&(s->t4)); s->operation_in_progress = OPERATION_IN_PROGRESS_NONE; send_dcn(s); if (span_log_test(&s->logging, SPAN_LOG_FLOW)) { t4_get_transfer_statistics(&(s->t4), &stats); span_log(&s->logging, SPAN_LOG_FLOW, "Success - delivered %d pages\n", stats.pages_transferred); } break; } } break; case T30_RNR: if (s->timer_t5 == 0) s->timer_t5 = ms_to_samples(DEFAULT_TIMER_T5); set_state(s, T30_STATE_IV_PPS_RNR); queue_phase(s, T30_PHASE_D_TX); send_simple_frame(s, T30_RR); break; case T30_PIP: s->retries = 0; if (s->phase_d_handler) { s->phase_d_handler(s, s->phase_d_user_data, T30_PIP); s->timer_t3 = ms_to_samples(DEFAULT_TIMER_T3); } break; case T30_PIN: s->retries = 0; if (s->phase_d_handler) { s->phase_d_handler(s, s->phase_d_user_data, T30_PIN); s->timer_t3 = ms_to_samples(DEFAULT_TIMER_T3); } break; case T30_PPR: process_rx_ppr(s, msg, len); break; case T30_DCN: s->current_status = T30_ERR_TX_BADPG; disconnect(s); break; case T30_CRP: repeat_last_command(s); break; case T30_FNV: process_rx_fnv(s, msg, len); break; default: /* We don't know what to do with this. */ unexpected_final_frame(s, msg, len); s->current_status = T30_ERR_TX_ECMPHD; break; } } /*- End of function --------------------------------------------------------*/ static void process_state_iv_pps_rnr(t30_state_t *s, const uint8_t *msg, int len) { t4_stats_t stats; switch (msg[2] & 0xFE) { case T30_MCF: s->retries = 0; s->timer_t5 = 0; /* Is there more of the current page to get, or do we move on? */ span_log(&s->logging, SPAN_LOG_FLOW, "Is there more to send? - %d %d\n", s->ecm_frames, s->ecm_len[255]); if (!s->ecm_at_page_end && get_partial_ecm_page(s) > 0) { span_log(&s->logging, SPAN_LOG_WARNING, "Additional image data to send\n"); s->ecm_block++; set_state(s, T30_STATE_IV); queue_phase(s, T30_PHASE_C_ECM_TX); send_first_ecm_frame(s); } else { span_log(&s->logging, SPAN_LOG_FLOW, "Moving on to the next page\n"); switch (s->next_tx_step) { case T30_MPS: case T30_PRI_MPS: s->retries = 0; t4_tx_end_page(&(s->t4)); if (s->phase_d_handler) s->phase_d_handler(s, s->phase_d_user_data, T30_MCF); if (tx_start_page(s)) { /* TODO: recover */ break; } if (get_partial_ecm_page(s) > 0) { set_state(s, T30_STATE_IV); queue_phase(s, T30_PHASE_C_ECM_TX); send_first_ecm_frame(s); } break; case T30_EOM: case T30_PRI_EOM: s->retries = 0; t4_tx_end_page(&(s->t4)); if (s->phase_d_handler) s->phase_d_handler(s, s->phase_d_user_data, T30_MCF); t4_tx_end(&(s->t4)); s->operation_in_progress = OPERATION_IN_PROGRESS_NONE; set_state(s, T30_STATE_R); if (span_log_test(&s->logging, SPAN_LOG_FLOW)) { t4_get_transfer_statistics(&(s->t4), &stats); span_log(&s->logging, SPAN_LOG_FLOW, "Success - delivered %d pages\n", stats.pages_transferred); } break; case T30_EOP: case T30_PRI_EOP: s->retries = 0; t4_tx_end_page(&(s->t4)); if (s->phase_d_handler) s->phase_d_handler(s, s->phase_d_user_data, T30_MCF); t4_tx_end(&(s->t4)); s->operation_in_progress = OPERATION_IN_PROGRESS_NONE; send_dcn(s); if (span_log_test(&s->logging, SPAN_LOG_FLOW)) { t4_get_transfer_statistics(&(s->t4), &stats); span_log(&s->logging, SPAN_LOG_FLOW, "Success - delivered %d pages\n", stats.pages_transferred); } break; } } break; case T30_RNR: if (s->timer_t5 == 0) s->timer_t5 = ms_to_samples(DEFAULT_TIMER_T5); set_state(s, T30_STATE_IV_PPS_RNR); queue_phase(s, T30_PHASE_D_TX); send_simple_frame(s, T30_RR); break; case T30_PIP: s->retries = 0; if (s->phase_d_handler) { s->phase_d_handler(s, s->phase_d_user_data, T30_PIP); s->timer_t3 = ms_to_samples(DEFAULT_TIMER_T3); } break; case T30_PIN: s->retries = 0; if (s->phase_d_handler) { s->phase_d_handler(s, s->phase_d_user_data, T30_PIN); s->timer_t3 = ms_to_samples(DEFAULT_TIMER_T3); } break; case T30_DCN: s->current_status = T30_ERR_RX_DCNRRD; disconnect(s); break; case T30_CRP: repeat_last_command(s); break; case T30_FNV: process_rx_fnv(s, msg, len); break; default: /* We don't know what to do with this. */ unexpected_final_frame(s, msg, len); break; } } /*- End of function --------------------------------------------------------*/ static void process_state_iv_ctc(t30_state_t *s, const uint8_t *msg, int len) { switch (msg[2] & 0xFE) { case T30_CTR: /* Valid response to a CTC received */ /* T.30 says we change back to long training here */ s->short_train = FALSE; /* Initiate resending of the remainder of the frames. */ set_state(s, T30_STATE_IV); queue_phase(s, T30_PHASE_C_ECM_TX); send_first_ecm_frame(s); break; case T30_CRP: repeat_last_command(s); break; case T30_FNV: process_rx_fnv(s, msg, len); break; default: /* We don't know what to do with this. */ unexpected_final_frame(s, msg, len); break; } } /*- End of function --------------------------------------------------------*/ static void process_state_iv_eor(t30_state_t *s, const uint8_t *msg, int len) { switch (msg[2] & 0xFE) { case T30_RNR: if (s->timer_t5 == 0) s->timer_t5 = ms_to_samples(DEFAULT_TIMER_T5); set_state(s, T30_STATE_IV_EOR_RNR); queue_phase(s, T30_PHASE_D_TX); send_simple_frame(s, T30_RR); break; case T30_PIN: s->retries = 0; if (s->phase_d_handler) { s->phase_d_handler(s, s->phase_d_user_data, T30_PIN); s->timer_t3 = ms_to_samples(DEFAULT_TIMER_T3); } break; case T30_ERR: /* TODO: Continue with the next message if MPS or EOM? */ s->timer_t5 = 0; send_dcn(s); break; case T30_CRP: repeat_last_command(s); break; case T30_FNV: process_rx_fnv(s, msg, len); break; default: /* We don't know what to do with this. */ unexpected_final_frame(s, msg, len); break; } } /*- End of function --------------------------------------------------------*/ static void process_state_iv_eor_rnr(t30_state_t *s, const uint8_t *msg, int len) { switch (msg[2] & 0xFE) { case T30_RNR: if (s->timer_t5 == 0) s->timer_t5 = ms_to_samples(DEFAULT_TIMER_T5); set_state(s, T30_STATE_IV_EOR_RNR); queue_phase(s, T30_PHASE_D_TX); send_simple_frame(s, T30_RR); break; case T30_PIN: s->retries = 0; if (s->phase_d_handler) { s->phase_d_handler(s, s->phase_d_user_data, T30_PIN); s->timer_t3 = ms_to_samples(DEFAULT_TIMER_T3); } break; case T30_ERR: /* TODO: Continue with the next message if MPS or EOM? */ s->timer_t5 = 0; send_dcn(s); break; case T30_DCN: s->current_status = T30_ERR_RX_DCNRRD; disconnect(s); break; case T30_CRP: repeat_last_command(s); break; case T30_FNV: process_rx_fnv(s, msg, len); break; default: /* We don't know what to do with this. */ unexpected_final_frame(s, msg, len); break; } } /*- End of function --------------------------------------------------------*/ static void process_state_call_finished(t30_state_t *s, const uint8_t *msg, int len) { /* Simply ignore anything which comes in when we have declared the call to have finished. */ } /*- End of function --------------------------------------------------------*/ static void process_rx_control_msg(t30_state_t *s, const uint8_t *msg, int len) { /* We should only get good frames here. */ print_frame(s, "Rx: ", msg, len); if (s->real_time_frame_handler) s->real_time_frame_handler(s, s->real_time_frame_user_data, TRUE, msg, len); switch (s->phase) { case T30_PHASE_A_CED: case T30_PHASE_A_CNG: case T30_PHASE_B_RX: case T30_PHASE_C_ECM_RX: case T30_PHASE_D_RX: break; default: span_log(&s->logging, SPAN_LOG_FLOW, "Unexpected HDLC frame received in phase %s, state %d\n", phase_names[s->phase], s->state); break; } if ((msg[1] & 0x10) == 0) { /* This is not a final frame */ /* It seems we should not restart the command or response timer when exchanging HDLC image data. If the modem looses sync in the middle of the image, we should just wait until the carrier goes away before proceeding. */ if (s->phase != T30_PHASE_C_ECM_RX) { /* Restart the command or response timer, T2 or T4 */ if (s->timer_is_t4) timer_t4_start(s); else timer_t2_start(s); } /* The following handles all the message types we expect to get without a final frame tag. If we get one that T.30 says we should not expect in a particular context, its pretty harmless, so don't worry. */ switch (msg[2] & 0xFE) { case T30_CSI: /* Called subscriber identification or Calling subscriber identification (T30_CIG) */ /* OK in (NSF) (CSI) DIS */ /* OK in (NSC) (CIG) DTC */ /* OK in (PWD) (SEP) (CIG) DTC */ decode_20digit_msg(s, s->rx_info.ident, &msg[2], len - 2); break; case T30_NSF: if (msg[2] == T30_NSF) { /* Non-standard facilities */ /* OK in (NSF) (CSI) DIS */ t35_decode(&msg[3], len - 3, &s->country, &s->vendor, &s->model); if (s->country) span_log(&s->logging, SPAN_LOG_FLOW, "The remote was made in '%s'\n", s->country); if (s->vendor) span_log(&s->logging, SPAN_LOG_FLOW, "The remote was made by '%s'\n", s->vendor); if (s->model) span_log(&s->logging, SPAN_LOG_FLOW, "The remote is a '%s'\n", s->model); } else { /* NSC - Non-standard facilities command */ /* OK in (NSC) (CIG) DTC */ } break; case T30_PWD: if (msg[2] == T30_PWD) { /* Password */ /* OK in (SUB) (SID) (SEP) (PWD) (TSI) DCS */ /* OK in (SUB) (SID) (SEP) (PWD) (CIG) DTC */ decode_20digit_msg(s, s->rx_info.password, &msg[2], len - 2); } else { unexpected_frame(s, msg, len); } break; case T30_SEP: if (msg[2] == T30_SEP) { /* Selective polling address */ /* OK in (PWD) (SEP) (CIG) DTC */ decode_20digit_msg(s, s->rx_info.selective_polling_address, &msg[2], len - 2); } else { unexpected_frame(s, msg, len); } break; case T30_PSA: if (msg[2] == T30_PSA) { /* Polled sub-address */ decode_20digit_msg(s, s->rx_info.polled_sub_address, &msg[2], len - 2); } else { unexpected_frame(s, msg, len); } break; case T30_CIA: if (msg[2] == T30_CIA) { /* Calling subscriber internet address */ decode_url_msg(s, NULL, &msg[2], len - 2); } else { unexpected_frame(s, msg, len); } break; case T30_ISP: if (msg[2] == T30_ISP) { /* Internet selective polling address */ decode_url_msg(s, NULL, &msg[2], len - 2); } else { unexpected_frame(s, msg, len); } break; case T30_TSI: /* Transmitting subscriber identity */ /* OK in (PWD) (SUB) (TSI) DCS */ decode_20digit_msg(s, s->rx_info.ident, &msg[2], len - 2); break; case T30_NSS: /* Non-standard facilities set-up */ break; case T30_SUB: /* Sub-address */ /* OK in (PWD) (SUB) (TSI) DCS */ decode_20digit_msg(s, s->rx_info.sub_address, &msg[2], len - 2); break; case T30_SID: /* Sender Identification */ /* OK in (SUB) (SID) (SEP) (PWD) (TSI) DCS */ /* OK in (SUB) (SID) (SEP) (PWD) (CIG) DTC */ decode_20digit_msg(s, s->rx_info.sender_ident, &msg[2], len - 2); break; case T30_CSA: /* Calling subscriber internet address */ decode_url_msg(s, NULL, &msg[2], len - 2); break; case T30_TSA: /* Transmitting subscriber internet address */ decode_url_msg(s, NULL, &msg[2], len - 2); break; case T30_IRA: /* Internet routing address */ decode_url_msg(s, NULL, &msg[2], len - 2); break; case T4_FCD: process_rx_fcd(s, msg, len); break; case T4_RCP: process_rx_rcp(s, msg, len); break; default: unexpected_non_final_frame(s, msg, len); break; } } else { /* This is a final frame */ /* Once we have any successful message from the far end, we cancel timer T1 */ s->timer_t0_t1 = 0; /* The following handles context sensitive message types, which should occur at the end of message sequences. They should, therefore have the final frame flag set. */ span_log(&s->logging, SPAN_LOG_FLOW, "In state %d\n", s->state); switch (s->state) { case T30_STATE_ANSWERING: process_state_answering(s, msg, len); break; case T30_STATE_B: process_state_b(s, msg, len); break; case T30_STATE_C: process_state_c(s, msg, len); break; case T30_STATE_D: process_state_d(s, msg, len); break; case T30_STATE_D_TCF: process_state_d_tcf(s, msg, len); break; case T30_STATE_D_POST_TCF: process_state_d_post_tcf(s, msg, len); break; case T30_STATE_F_TCF: process_state_f_tcf(s, msg, len); break; case T30_STATE_F_CFR: process_state_f_cfr(s, msg, len); break; case T30_STATE_F_FTT: process_state_f_ftt(s, msg, len); break; case T30_STATE_F_DOC_NON_ECM: process_state_f_doc_non_ecm(s, msg, len); break; case T30_STATE_F_POST_DOC_NON_ECM: process_state_f_post_doc_non_ecm(s, msg, len); break; case T30_STATE_F_DOC_ECM: case T30_STATE_F_POST_DOC_ECM: process_state_f_doc_ecm(s, msg, len); break; case T30_STATE_F_POST_RCP_MCF: process_state_f_post_rcp_mcf(s, msg, len); break; case T30_STATE_F_POST_RCP_PPR: process_state_f_post_rcp_ppr(s, msg, len); break; case T30_STATE_F_POST_RCP_RNR: process_state_f_post_rcp_rnr(s, msg, len); break; case T30_STATE_R: process_state_r(s, msg, len); break; case T30_STATE_T: process_state_t(s, msg, len); break; case T30_STATE_I: process_state_i(s, msg, len); break; case T30_STATE_II: process_state_ii(s, msg, len); break; case T30_STATE_II_Q: process_state_ii_q(s, msg, len); break; case T30_STATE_III_Q_MCF: process_state_iii_q_mcf(s, msg, len); break; case T30_STATE_III_Q_RTP: process_state_iii_q_rtp(s, msg, len); break; case T30_STATE_III_Q_RTN: process_state_iii_q_rtn(s, msg, len); break; case T30_STATE_IV: process_state_iv(s, msg, len); break; case T30_STATE_IV_PPS_NULL: process_state_iv_pps_null(s, msg, len); break; case T30_STATE_IV_PPS_Q: process_state_iv_pps_q(s, msg, len); break; case T30_STATE_IV_PPS_RNR: process_state_iv_pps_rnr(s, msg, len); break; case T30_STATE_IV_CTC: process_state_iv_ctc(s, msg, len); break; case T30_STATE_IV_EOR: process_state_iv_eor(s, msg, len); break; case T30_STATE_IV_EOR_RNR: process_state_iv_eor_rnr(s, msg, len); break; case T30_STATE_CALL_FINISHED: process_state_call_finished(s, msg, len); break; default: /* We don't know what to do with this. */ unexpected_final_frame(s, msg, len); break; } } } /*- End of function --------------------------------------------------------*/ static void queue_phase(t30_state_t *s, int phase) { if (s->rx_signal_present) { /* We need to wait for that signal to go away */ s->next_phase = phase; } else { set_phase(s, phase); s->next_phase = T30_PHASE_IDLE; } } /*- End of function --------------------------------------------------------*/ static void set_phase(t30_state_t *s, int phase) { if (phase != s->phase) { span_log(&s->logging, SPAN_LOG_FLOW, "Changing from phase %s to %s\n", phase_names[s->phase], phase_names[phase]); /* We may be killing a receiver before it has declared the end of the signal. Force the signal present indicator to off, because the receiver will never be able to. */ if (s->phase != T30_PHASE_A_CED && s->phase != T30_PHASE_A_CNG) s->rx_signal_present = FALSE; s->rx_trained = FALSE; s->phase = phase; switch (phase) { case T30_PHASE_A_CED: if (s->set_rx_type_handler) s->set_rx_type_handler(s->set_rx_type_user_data, T30_MODEM_V21, FALSE, TRUE); if (s->set_tx_type_handler) s->set_tx_type_handler(s->set_tx_type_user_data, T30_MODEM_CED, FALSE, FALSE); break; case T30_PHASE_A_CNG: if (s->set_rx_type_handler) s->set_rx_type_handler(s->set_rx_type_user_data, T30_MODEM_V21, FALSE, TRUE); if (s->set_tx_type_handler) s->set_tx_type_handler(s->set_tx_type_user_data, T30_MODEM_CNG, FALSE, FALSE); break; case T30_PHASE_B_RX: case T30_PHASE_D_RX: if (s->set_rx_type_handler) s->set_rx_type_handler(s->set_rx_type_user_data, T30_MODEM_V21, FALSE, TRUE); if (s->set_tx_type_handler) s->set_tx_type_handler(s->set_tx_type_user_data, T30_MODEM_NONE, FALSE, FALSE); break; case T30_PHASE_B_TX: case T30_PHASE_D_TX: if (!s->far_end_detected && s->timer_t0_t1 > 0) { s->timer_t0_t1 = ms_to_samples(DEFAULT_TIMER_T1); s->far_end_detected = TRUE; } if (s->set_rx_type_handler) s->set_rx_type_handler(s->set_rx_type_user_data, T30_MODEM_NONE, FALSE, FALSE); if (s->set_tx_type_handler) s->set_tx_type_handler(s->set_tx_type_user_data, T30_MODEM_V21, FALSE, TRUE); break; case T30_PHASE_C_NON_ECM_RX: if (s->set_rx_type_handler) s->set_rx_type_handler(s->set_rx_type_user_data, fallback_sequence[s->current_fallback].modem_type, s->short_train, FALSE); if (s->set_tx_type_handler) s->set_tx_type_handler(s->set_tx_type_user_data, T30_MODEM_NONE, FALSE, FALSE); break; case T30_PHASE_C_NON_ECM_TX: /* Pause before switching from anything to phase C */ /* Always prime the training count for 1.5s of data at the current rate. Its harmless if we prime it and are not doing TCF. */ s->training_test_bits = (3*fallback_sequence[s->current_fallback].bit_rate)/2; if (s->set_rx_type_handler) s->set_rx_type_handler(s->set_rx_type_user_data, T30_MODEM_NONE, FALSE, FALSE); if (s->set_tx_type_handler) s->set_tx_type_handler(s->set_tx_type_user_data, fallback_sequence[s->current_fallback].modem_type, s->short_train, FALSE); break; case T30_PHASE_C_ECM_RX: if (s->set_rx_type_handler) s->set_rx_type_handler(s->set_rx_type_user_data, fallback_sequence[s->current_fallback].modem_type, s->short_train, TRUE); if (s->set_tx_type_handler) s->set_tx_type_handler(s->set_tx_type_user_data, T30_MODEM_NONE, FALSE, FALSE); break; case T30_PHASE_C_ECM_TX: /* Pause before switching from anything to phase C */ if (s->set_rx_type_handler) s->set_rx_type_handler(s->set_rx_type_user_data, T30_MODEM_NONE, FALSE, FALSE); if (s->set_tx_type_handler) s->set_tx_type_handler(s->set_tx_type_user_data, fallback_sequence[s->current_fallback].modem_type, s->short_train, TRUE); break; case T30_PHASE_E: /* Send a little silence before ending things, to ensure the buffers are all flushed through, and the far end has seen the last message we sent. */ s->training_current_zeros = 0; s->training_most_zeros = 0; if (s->set_rx_type_handler) s->set_rx_type_handler(s->set_rx_type_user_data, T30_MODEM_NONE, FALSE, FALSE); if (s->set_tx_type_handler) s->set_tx_type_handler(s->set_tx_type_user_data, T30_MODEM_PAUSE, FINAL_FLUSH_TIME, FALSE); break; case T30_PHASE_CALL_FINISHED: if (s->set_rx_type_handler) s->set_rx_type_handler(s->set_rx_type_user_data, T30_MODEM_DONE, FALSE, FALSE); if (s->set_tx_type_handler) s->set_tx_type_handler(s->set_tx_type_user_data, T30_MODEM_DONE, FALSE, FALSE); break; } } } /*- End of function --------------------------------------------------------*/ static void set_state(t30_state_t *s, int state) { if (s->state != state) { span_log(&s->logging, SPAN_LOG_FLOW, "Changing from state %d to %d\n", s->state, state); s->state = state; } s->step = 0; } /*- End of function --------------------------------------------------------*/ static void repeat_last_command(t30_state_t *s) { s->step = 0; switch (s->state) { case T30_STATE_R: s->dis_received = FALSE; queue_phase(s, T30_PHASE_B_TX); send_dis_or_dtc_sequence(s, TRUE); break; case T30_STATE_III_Q_MCF: queue_phase(s, T30_PHASE_D_TX); send_simple_frame(s, T30_MCF); break; case T30_STATE_III_Q_RTP: queue_phase(s, T30_PHASE_D_TX); send_simple_frame(s, T30_RTP); break; case T30_STATE_III_Q_RTN: queue_phase(s, T30_PHASE_D_TX); send_simple_frame(s, T30_RTN); break; case T30_STATE_II_Q: queue_phase(s, T30_PHASE_D_TX); send_simple_frame(s, s->next_tx_step); break; case T30_STATE_IV_PPS_NULL: case T30_STATE_IV_PPS_Q: queue_phase(s, T30_PHASE_D_TX); send_pps_frame(s); break; case T30_STATE_IV_PPS_RNR: case T30_STATE_IV_EOR_RNR: queue_phase(s, T30_PHASE_D_TX); send_simple_frame(s, T30_RNR); break; case T30_STATE_D: queue_phase(s, T30_PHASE_B_TX); send_dcs_sequence(s, TRUE); break; case T30_STATE_F_FTT: queue_phase(s, T30_PHASE_B_TX); send_simple_frame(s, T30_FTT); break; case T30_STATE_F_CFR: queue_phase(s, T30_PHASE_B_TX); send_cfr_sequence(s, TRUE); break; case T30_STATE_D_POST_TCF: /* Need to send the whole training thing again */ s->short_train = FALSE; queue_phase(s, T30_PHASE_B_TX); send_dcs_sequence(s, TRUE); break; case T30_STATE_F_POST_RCP_RNR: /* Just ignore */ break; default: span_log(&s->logging, SPAN_LOG_FLOW, "Repeat command called with nothing to repeat - phase %s, state %d\n", phase_names[s->phase], s->state); break; } } /*- End of function --------------------------------------------------------*/ static void timer_t2_start(t30_state_t *s) { s->timer_t2_t4 = ms_to_samples(DEFAULT_TIMER_T2); s->timer_is_t4 = FALSE; } /*- End of function --------------------------------------------------------*/ static void timer_t4_start(t30_state_t *s) { s->timer_t2_t4 = ms_to_samples(DEFAULT_TIMER_T4); s->timer_is_t4 = TRUE; } /*- End of function --------------------------------------------------------*/ static void timer_t0_expired(t30_state_t *s) { span_log(&s->logging, SPAN_LOG_FLOW, "T0 expired in state %d\n", s->state); s->current_status = T30_ERR_T0_EXPIRED; /* Just end the call */ disconnect(s); } /*- End of function --------------------------------------------------------*/ static void timer_t1_expired(t30_state_t *s) { span_log(&s->logging, SPAN_LOG_FLOW, "T1 expired in state %d\n", s->state); /* The initial connection establishment has timeout out. In other words, we have been unable to communicate successfully with a remote machine. It is time to abandon the call. */ s->current_status = T30_ERR_T1_EXPIRED; switch (s->state) { case T30_STATE_T: /* Just end the call */ disconnect(s); break; case T30_STATE_R: /* Send disconnect, and then end the call. Since we have not successfully contacted the far end, it is unclear why we should send a disconnect message at this point. However, it is what T.30 says we should do. */ send_dcn(s); break; } } /*- End of function --------------------------------------------------------*/ static void timer_t2_expired(t30_state_t *s) { span_log(&s->logging, SPAN_LOG_FLOW, "T2 expired in phase %s, state %d\n", phase_names[s->phase], s->state); switch (s->state) { case T30_STATE_III_Q_MCF: case T30_STATE_III_Q_RTP: case T30_STATE_III_Q_RTN: case T30_STATE_F_POST_RCP_PPR: case T30_STATE_F_POST_RCP_MCF: switch (s->next_rx_step) { case T30_EOM: case T30_PRI_EOM: /* We didn't receive a response to our T30_MCF after T30_EOM, so we must be OK to proceed to phase B, and pretty act like its the beginning of a call. */ span_log(&s->logging, SPAN_LOG_FLOW, "Returning to phase B after EOM\n"); set_phase(s, T30_PHASE_B_TX); timer_t2_start(s); s->dis_received = FALSE; send_dis_or_dtc_sequence(s, TRUE); return; } break; case T30_STATE_F_TCF: span_log(&s->logging, SPAN_LOG_FLOW, "No TCF data received\n"); set_phase(s, T30_PHASE_B_TX); set_state(s, T30_STATE_F_FTT); send_simple_frame(s, T30_FTT); return; case T30_STATE_F_DOC_ECM: case T30_STATE_F_DOC_NON_ECM: /* While waiting for FAX page */ s->current_status = T30_ERR_RX_T2EXPFAX; break; case T30_STATE_F_POST_DOC_ECM: case T30_STATE_F_POST_DOC_NON_ECM: /* While waiting for next FAX page */ s->current_status = T30_ERR_RX_T2EXPMPS; break; #if 0 case ??????: /* While waiting for DCN */ s->current_status = T30_ERR_RX_T2EXPDCN; break; case ??????: /* While waiting for phase D */ s->current_status = T30_ERR_RX_T2EXPD; break; #endif case T30_STATE_IV_PPS_RNR: case T30_STATE_IV_EOR_RNR: /* While waiting for RR command */ s->current_status = T30_ERR_RX_T2EXPRR; break; case T30_STATE_R: /* While waiting for NSS, DCS or MCF */ s->current_status = T30_ERR_RX_T2EXP; break; case T30_STATE_F_FTT: break; } queue_phase(s, T30_PHASE_B_TX); start_receiving_document(s); } /*- End of function --------------------------------------------------------*/ static void timer_t3_expired(t30_state_t *s) { span_log(&s->logging, SPAN_LOG_FLOW, "T3 expired in phase %s, state %d\n", phase_names[s->phase], s->state); s->current_status = T30_ERR_T3_EXPIRED; disconnect(s); } /*- End of function --------------------------------------------------------*/ static void timer_t4_expired(t30_state_t *s) { /* There was no response (or only a corrupt response) to a command, within the T4 timeout period. */ span_log(&s->logging, SPAN_LOG_FLOW, "T4 expired in phase %s, state %d\n", phase_names[s->phase], s->state); if (++s->retries > MAX_MESSAGE_TRIES) { switch (s->state) { case T30_STATE_D_POST_TCF: /* Received no response to DCS or TCF */ s->current_status = T30_ERR_TX_PHBDEAD; break; case T30_STATE_II_Q: case T30_STATE_IV_PPS_NULL: case T30_STATE_IV_PPS_Q: /* No response after sending a page */ s->current_status = T30_ERR_TX_PHDDEAD; break; default: /* Disconnected after permitted retries */ s->current_status = T30_ERR_RETRYDCN; break; } send_dcn(s); return; } /* Of course, things might just be a little late, especially if there are T.38 links in the path. There is no point in simply timing out, and resending, if we are currently receiving something from the far end - its a half-duplex path, so the two transmissions will conflict. Our best strategy is to wait until there is nothing being received, or give up after a long backstop timeout. In the meantime, if we get a meaningful, if somewhat delayed, response, we should accept it and carry on. */ repeat_last_command(s); } /*- End of function --------------------------------------------------------*/ static void timer_t5_expired(t30_state_t *s) { /* Give up waiting for the receiver to become ready in error correction mode */ span_log(&s->logging, SPAN_LOG_FLOW, "T5 expired in phase %s, state %d\n", phase_names[s->phase], s->state); s->current_status = T30_ERR_TX_T5EXP; send_dcn(s); } /*- End of function --------------------------------------------------------*/ static void decode_20digit_msg(t30_state_t *s, char *msg, const uint8_t *pkt, int len) { int p; int k; char text[T30_MAX_IDENT_LEN + 1]; if (msg == NULL) msg = text; if (len > T30_MAX_IDENT_LEN + 1) { unexpected_frame_length(s, pkt, len); msg[0] = '\0'; return; } p = len; /* Strip trailing spaces */ while (p > 1 && pkt[p - 1] == ' ') p--; /* The string is actually backwards in the message */ k = 0; while (p > 1) msg[k++] = pkt[--p]; msg[k] = '\0'; span_log(&s->logging, SPAN_LOG_FLOW, "Remote gave %s as: \"%s\"\n", t30_frametype(pkt[0]), msg); } /*- End of function --------------------------------------------------------*/ static void decode_url_msg(t30_state_t *s, char *msg, const uint8_t *pkt, int len) { char text[77 + 1]; /* TODO: decode properly, as per T.30 5.3.6.2.12 */ if (msg == NULL) msg = text; if (len < 3 || len > 77 + 3 || len != pkt[2] + 3) { unexpected_frame_length(s, pkt, len); msg[0] = '\0'; return; } /* First octet is the sequence number of the packet. Bit 7 = 1 for more follows, 0 for last packet in the sequence. Bits 6-0 = The sequence number, 0 to 0x7F Second octet is the type of internet address. Bits 7-4 = reserved Bits 3-0 = type: 0 = reserved 1 = e-mail address 2 = URL 3 = TCP/IP V4 4 = TCP/IP V6 5 = international phone number, in the usual +... format 6-15 = reserved Third octet is the length of the internet address Bit 7 = 1 for more follows, 0 for last packet in the sequence. Bits 6-0 = length */ memcpy(msg, &pkt[3], len - 3); msg[len - 3] = '\0'; span_log(&s->logging, SPAN_LOG_FLOW, "Remote fax gave %s as: %d, %d, \"%s\"\n", t30_frametype(pkt[0]), pkt[0], pkt[1], msg); } /*- End of function --------------------------------------------------------*/ void t30_non_ecm_put_bit(void *user_data, int bit) { t30_state_t *s; int was_trained; s = (t30_state_t *) user_data; if (bit < 0) { /* Special conditions */ switch (bit) { case PUTBIT_TRAINING_IN_PROGRESS: break; case PUTBIT_TRAINING_FAILED: span_log(&s->logging, SPAN_LOG_FLOW, "Non-ECM carrier training failed in state %d\n", s->state); s->rx_trained = FALSE; /* Cancel the timer, since we have actually seen something, and wait until the carrier drops before proceeding. */ // TODO: this is not a complete answer to handling failures to train s->timer_t2_t4 = 0; break; case PUTBIT_TRAINING_SUCCEEDED: /* The modem is now trained */ span_log(&s->logging, SPAN_LOG_FLOW, "Non-ECM carrier trained in state %d\n", s->state); /* In case we are in trainability test mode... */ s->training_current_zeros = 0; s->training_most_zeros = 0; s->rx_signal_present = TRUE; s->rx_trained = TRUE; s->timer_t2_t4 = 0; break; case PUTBIT_CARRIER_UP: span_log(&s->logging, SPAN_LOG_FLOW, "Non-ECM carrier up in state %d\n", s->state); break; case PUTBIT_CARRIER_DOWN: span_log(&s->logging, SPAN_LOG_FLOW, "Non-ECM carrier down in state %d\n", s->state); was_trained = s->rx_trained; s->rx_signal_present = FALSE; s->rx_trained = FALSE; switch (s->state) { case T30_STATE_F_TCF: /* Only respond if we managed to actually sync up with the source. We don't want to respond just because we saw a click. These often occur just before the real signal, with many modems. Presumably this is due to switching within the far end modem. We also want to avoid the possibility of responding to the tail end of any slow modem signal. If there was a genuine data signal which we failed to train on it should not matter. If things are that bad, we do not stand much chance of good quality communications. */ if (was_trained) { /* Although T.30 says the training test should be 1.5s of all 0's, some FAX machines send a burst of all 1's before the all 0's. Tolerate this. */ if (s->training_current_zeros > s->training_most_zeros) s->training_most_zeros = s->training_current_zeros; if (s->training_most_zeros < fallback_sequence[s->current_fallback].bit_rate) { span_log(&s->logging, SPAN_LOG_FLOW, "Trainability test failed - longest run of zeros was %d\n", s->training_most_zeros); set_phase(s, T30_PHASE_B_TX); set_state(s, T30_STATE_F_FTT); send_simple_frame(s, T30_FTT); } else { /* The training went OK */ s->short_train = TRUE; s->in_message = TRUE; rx_start_page(s); set_phase(s, T30_PHASE_B_TX); set_state(s, T30_STATE_F_CFR); send_cfr_sequence(s, TRUE); } } break; case T30_STATE_F_POST_DOC_NON_ECM: /* Page ended cleanly */ if (s->current_status == T30_ERR_RX_NOCARRIER) s->current_status = T30_ERR_OK; break; default: /* We should be receiving a document right now, but it did not end cleanly. */ if (was_trained) { span_log(&s->logging, SPAN_LOG_WARNING, "Page did not end cleanly\n"); /* We trained OK, so we should have some kind of received page, even though it did not end cleanly. */ set_state(s, T30_STATE_F_POST_DOC_NON_ECM); set_phase(s, T30_PHASE_D_RX); timer_t2_start(s); if (s->current_status == T30_ERR_RX_NOCARRIER) s->current_status = T30_ERR_OK; } else { span_log(&s->logging, SPAN_LOG_WARNING, "Non-ECM carrier not found\n"); s->current_status = T30_ERR_RX_NOCARRIER; } break; } if (s->next_phase != T30_PHASE_IDLE) { set_phase(s, s->next_phase); s->next_phase = T30_PHASE_IDLE; } break; default: span_log(&s->logging, SPAN_LOG_WARNING, "Unexpected non-ECM special bit - %d!\n", bit); break; } return; } switch (s->state) { case T30_STATE_F_TCF: /* Trainability test */ if (bit) { if (s->training_current_zeros > s->training_most_zeros) s->training_most_zeros = s->training_current_zeros; s->training_current_zeros = 0; } else { s->training_current_zeros++; } break; case T30_STATE_F_DOC_NON_ECM: /* Document transfer */ if (t4_rx_put_bit(&(s->t4), bit)) { /* That is the end of the document */ set_state(s, T30_STATE_F_POST_DOC_NON_ECM); queue_phase(s, T30_PHASE_D_RX); timer_t2_start(s); } break; } } /*- End of function --------------------------------------------------------*/ void t30_non_ecm_put_byte(void *user_data, int byte) { t30_state_t *s; s = (t30_state_t *) user_data; switch (s->state) { case T30_STATE_F_TCF: /* Trainability test */ /* This makes counting zeros fast, but approximate. That really doesn't matter */ if (byte) { if (s->training_current_zeros > s->training_most_zeros) s->training_most_zeros = s->training_current_zeros; s->training_current_zeros = 0; } else { s->training_current_zeros += 8; } break; case T30_STATE_F_DOC_NON_ECM: /* Document transfer */ if (t4_rx_put_byte(&(s->t4), byte)) { /* That is the end of the document */ set_state(s, T30_STATE_F_POST_DOC_NON_ECM); queue_phase(s, T30_PHASE_D_RX); timer_t2_start(s); } break; } } /*- End of function --------------------------------------------------------*/ void t30_non_ecm_put_chunk(void *user_data, const uint8_t buf[], int len) { t30_state_t *s; int i; s = (t30_state_t *) user_data; switch (s->state) { case T30_STATE_F_TCF: /* Trainability test */ /* This makes counting zeros fast, but approximate. That really doesn't matter */ for (i = 0; i < len; i++) { if (buf[i]) { if (s->training_current_zeros > s->training_most_zeros) s->training_most_zeros = s->training_current_zeros; s->training_current_zeros = 0; } else { s->training_current_zeros += 8; } } break; case T30_STATE_F_DOC_NON_ECM: /* Document transfer */ if (t4_rx_put_chunk(&(s->t4), buf, len)) { /* That is the end of the document */ set_state(s, T30_STATE_F_POST_DOC_NON_ECM); queue_phase(s, T30_PHASE_D_RX); timer_t2_start(s); } break; } } /*- End of function --------------------------------------------------------*/ int t30_non_ecm_get_bit(void *user_data) { int bit; t30_state_t *s; s = (t30_state_t *) user_data; switch (s->state) { case T30_STATE_D_TCF: /* Trainability test. */ bit = 0; if (s->training_test_bits-- < 0) { /* Finished sending training test. */ bit = PUTBIT_END_OF_DATA; } break; case T30_STATE_I: /* Transferring real data. */ bit = t4_tx_get_bit(&(s->t4)); break; case T30_STATE_D_POST_TCF: case T30_STATE_II_Q: /* We should be padding out a block of samples if we are here */ bit = 0; break; default: span_log(&s->logging, SPAN_LOG_WARNING, "t30_non_ecm_get_bit in bad state %d\n", s->state); bit = PUTBIT_END_OF_DATA; break; } return bit; } /*- End of function --------------------------------------------------------*/ int t30_non_ecm_get_byte(void *user_data) { int byte; t30_state_t *s; s = (t30_state_t *) user_data; switch (s->state) { case T30_STATE_D_TCF: /* Trainability test. */ byte = 0; if ((s->training_test_bits -= 8) < 0) { /* Finished sending training test. */ byte = 0x100; } break; case T30_STATE_I: /* Transferring real data. */ byte = t4_tx_get_byte(&(s->t4)); break; case T30_STATE_D_POST_TCF: case T30_STATE_II_Q: /* We should be padding out a block of samples if we are here */ byte = 0; break; default: span_log(&s->logging, SPAN_LOG_WARNING, "t30_non_ecm_get_byte in bad state %d\n", s->state); byte = 0x100; break; } return byte; } /*- End of function --------------------------------------------------------*/ int t30_non_ecm_get_chunk(void *user_data, uint8_t buf[], int max_len) { int len; t30_state_t *s; s = (t30_state_t *) user_data; switch (s->state) { case T30_STATE_D_TCF: /* Trainability test. */ for (len = 0; len < max_len; len++) { buf[len] = 0; if ((s->training_test_bits -= 8) < 0) break; } break; case T30_STATE_I: /* Transferring real data. */ len = t4_tx_get_chunk(&(s->t4), buf, max_len); break; case T30_STATE_D_POST_TCF: case T30_STATE_II_Q: /* We should be padding out a block of samples if we are here */ len = 0; break; default: span_log(&s->logging, SPAN_LOG_WARNING, "t30_non_ecm_get_chunk in bad state %d\n", s->state); len = 0; break; } return len; } /*- End of function --------------------------------------------------------*/ void t30_hdlc_accept(void *user_data, const uint8_t *msg, int len, int ok) { t30_state_t *s; s = (t30_state_t *) user_data; if (len < 0) { /* Special conditions */ switch (len) { case PUTBIT_TRAINING_IN_PROGRESS: break; case PUTBIT_TRAINING_FAILED: span_log(&s->logging, SPAN_LOG_FLOW, "HDLC carrier training failed in state %d\n", s->state); s->rx_trained = FALSE; /* Cancel the timer, since we have actually seen something, and wait until the carrier drops before proceeding. */ // TODO: this is not a complete answer to handling failures to train s->timer_t2_t4 = 0; break; case PUTBIT_TRAINING_SUCCEEDED: /* The modem is now trained */ span_log(&s->logging, SPAN_LOG_FLOW, "HDLC carrier trained in state %d\n", s->state); s->rx_signal_present = TRUE; s->rx_trained = TRUE; break; case PUTBIT_CARRIER_UP: span_log(&s->logging, SPAN_LOG_FLOW, "HDLC carrier up in state %d\n", s->state); s->rx_signal_present = TRUE; break; case PUTBIT_CARRIER_DOWN: span_log(&s->logging, SPAN_LOG_FLOW, "HDLC carrier down in state %d\n", s->state); s->rx_signal_present = FALSE; s->rx_trained = FALSE; /* If a phase change has been queued to occur after the receive signal drops, its time to change. */ if (s->next_phase != T30_PHASE_IDLE) { set_phase(s, s->next_phase); s->next_phase = T30_PHASE_IDLE; } break; case PUTBIT_FRAMING_OK: span_log(&s->logging, SPAN_LOG_FLOW, "HDLC framing OK in state %d\n", s->state); if (!s->far_end_detected && s->timer_t0_t1 > 0) { s->timer_t0_t1 = ms_to_samples(DEFAULT_TIMER_T1); s->far_end_detected = TRUE; if (s->phase == T30_PHASE_A_CED || s->phase == T30_PHASE_A_CNG) set_phase(s, T30_PHASE_B_RX); } /* 5.4.3.1 Timer T2 is reset if flag is received */ if (!s->timer_is_t4 && s->timer_t2_t4 > 0) s->timer_t2_t4 = 0; break; case PUTBIT_ABORT: /* Just ignore these */ break; default: span_log(&s->logging, SPAN_LOG_FLOW, "Unexpected HDLC special length - %d!\n", len); break; } return; } /* The spec. says a command or response is not valid if: - any of the frames, optional or mandatory, have an FCS error. - any single frame exceeds 3s +- 15% (i.e. no frame should exceed 2.55s) - the final frame is not tagged as a final frame - the final frame is not a recognised one. The first point seems benign. If we accept an optional frame, and a later frame is bad, having accepted the optional frame should be harmless. The 2.55s maximum seems to limit signalling frames to no more than 95 octets, including FCS, and flag octets (assuming the use of V.21). */ if (!ok) { span_log(&s->logging, SPAN_LOG_FLOW, "Bad CRC received\n"); if ((s->supported_t30_features & T30_SUPPORT_COMMAND_REPEAT)) send_simple_frame(s, T30_CRP); return; } /* Cancel the command or response timer */ s->timer_t2_t4 = 0; if (len < 3) { span_log(&s->logging, SPAN_LOG_FLOW, "Bad HDLC frame length - %d\n", len); return; } if (msg[0] != 0xFF || !(msg[1] == 0x03 || msg[1] == 0x13)) { span_log(&s->logging, SPAN_LOG_FLOW, "Bad HDLC frame header - %02x %02x\n", msg[0], msg[1]); return; } process_rx_control_msg(s, msg, len); } /*- End of function --------------------------------------------------------*/ void t30_front_end_status(void *user_data, int status) { t30_state_t *s; s = (t30_state_t *) user_data; switch (status) { case T30_FRONT_END_SEND_STEP_COMPLETE: span_log(&s->logging, SPAN_LOG_FLOW, "Send complete in phase %s, state %d\n", phase_names[s->phase], s->state); /* We have finished sending our messages, so move on to the next operation. */ switch (s->state) { case T30_STATE_ANSWERING: span_log(&s->logging, SPAN_LOG_FLOW, "Starting answer mode\n"); set_phase(s, T30_PHASE_B_TX); timer_t2_start(s); s->dis_received = FALSE; send_dis_or_dtc_sequence(s, TRUE); break; case T30_STATE_R: if (send_dis_or_dtc_sequence(s, FALSE)) { /* Wait for an acknowledgement. */ set_phase(s, T30_PHASE_B_RX); timer_t4_start(s); } break; case T30_STATE_F_CFR: if (s->step == 0) { /* Shut down HDLC transmission. */ if (s->send_hdlc_handler) s->send_hdlc_handler(s->send_hdlc_user_data, NULL, 0); s->step++; } else { if (s->error_correcting_mode) { set_state(s, T30_STATE_F_DOC_ECM); set_phase(s, T30_PHASE_C_ECM_RX); } else { set_state(s, T30_STATE_F_DOC_NON_ECM); set_phase(s, T30_PHASE_C_NON_ECM_RX); } timer_t2_start(s); s->next_rx_step = T30_MPS; } break; case T30_STATE_F_FTT: if (s->step == 0) { /* Shut down HDLC transmission. */ if (s->send_hdlc_handler) s->send_hdlc_handler(s->send_hdlc_user_data, NULL, 0); s->step++; } else { set_phase(s, T30_PHASE_B_RX); timer_t2_start(s); } break; case T30_STATE_III_Q_MCF: case T30_STATE_III_Q_RTP: case T30_STATE_III_Q_RTN: case T30_STATE_F_POST_RCP_PPR: case T30_STATE_F_POST_RCP_MCF: if (s->step == 0) { /* Shut down HDLC transmission. */ if (s->send_hdlc_handler) s->send_hdlc_handler(s->send_hdlc_user_data, NULL, 0); s->step++; } else { switch (s->next_rx_step) { case T30_MPS: case T30_PRI_MPS: /* We should now start to get another page */ if (s->error_correcting_mode) { set_state(s, T30_STATE_F_DOC_ECM); set_phase(s, T30_PHASE_C_ECM_RX); } else { set_state(s, T30_STATE_F_DOC_NON_ECM); set_phase(s, T30_PHASE_C_NON_ECM_RX); } timer_t2_start(s); break; case T30_EOM: case T30_PRI_EOM: /* See if we get something back, before moving to phase B. */ timer_t2_start(s); set_phase(s, T30_PHASE_D_RX); break; case T30_EOP: case T30_PRI_EOP: /* Wait for a DCN. */ set_phase(s, T30_PHASE_D_RX); timer_t4_start(s); break; default: span_log(&s->logging, SPAN_LOG_FLOW, "Unknown next rx step - %d\n", s->next_rx_step); disconnect(s); break; } } break; case T30_STATE_II_Q: case T30_STATE_IV_PPS_NULL: case T30_STATE_IV_PPS_Q: case T30_STATE_IV_PPS_RNR: case T30_STATE_IV_EOR_RNR: case T30_STATE_F_POST_RCP_RNR: case T30_STATE_IV_EOR: case T30_STATE_IV_CTC: if (s->step == 0) { /* Shut down HDLC transmission. */ if (s->send_hdlc_handler) s->send_hdlc_handler(s->send_hdlc_user_data, NULL, 0); s->step++; } else { /* We have finished sending the post image message. Wait for an acknowledgement. */ set_phase(s, T30_PHASE_D_RX); timer_t4_start(s); } break; case T30_STATE_B: /* We have now allowed time for the last message to flush through the system, so it is safe to report the end of the call. */ if (s->phase_e_handler) s->phase_e_handler(s, s->phase_e_user_data, s->current_status); set_state(s, T30_STATE_CALL_FINISHED); set_phase(s, T30_PHASE_CALL_FINISHED); release_resources(s); break; case T30_STATE_C: if (s->step == 0) { /* Shut down HDLC transmission. */ if (s->send_hdlc_handler) s->send_hdlc_handler(s->send_hdlc_user_data, NULL, 0); s->step++; } else { /* We just sent the disconnect message. Now it is time to disconnect */ disconnect(s); } break; case T30_STATE_D: if (send_dcs_sequence(s, FALSE)) { if ((s->iaf & T30_IAF_MODE_NO_TCF)) { /* Skip the trainability test */ s->retries = 0; s->short_train = TRUE; if (s->error_correcting_mode) { set_state(s, T30_STATE_IV); queue_phase(s, T30_PHASE_C_ECM_TX); } else { set_state(s, T30_STATE_I); queue_phase(s, T30_PHASE_C_NON_ECM_TX); } } else { /* Do the trainability test */ set_state(s, T30_STATE_D_TCF); set_phase(s, T30_PHASE_C_NON_ECM_TX); } } break; case T30_STATE_D_TCF: /* Finished sending training test. Listen for the response. */ set_phase(s, T30_PHASE_B_RX); timer_t4_start(s); set_state(s, T30_STATE_D_POST_TCF); break; case T30_STATE_I: /* Send the end of page message */ set_phase(s, T30_PHASE_D_TX); set_state(s, T30_STATE_II_Q); /* We might need to resend the page we are on, but we need to check if there are any more pages to send, so we can send the correct signal right now. */ send_simple_frame(s, s->next_tx_step = check_next_tx_step(s)); break; case T30_STATE_IV: /* We have finished sending an FCD frame */ if (s->step == 0) { if (send_next_ecm_frame(s)) { /* Shut down HDLC transmission. */ if (s->send_hdlc_handler) s->send_hdlc_handler(s->send_hdlc_user_data, NULL, 0); s->step++; } } else { /* Send the end of page or partial page message */ set_phase(s, T30_PHASE_D_TX); s->next_tx_step = check_next_tx_step(s); if (send_pps_frame(s) == T30_NULL) set_state(s, T30_STATE_IV_PPS_NULL); else set_state(s, T30_STATE_IV_PPS_Q); } break; case T30_STATE_F_DOC_ECM: /* This should be the end of a CTR being sent. */ if (s->step == 0) { /* Shut down HDLC transmission. */ if (s->send_hdlc_handler) s->send_hdlc_handler(s->send_hdlc_user_data, NULL, 0); s->step++; } else { /* We have finished sending the CTR. Wait for image data again. */ set_phase(s, T30_PHASE_C_ECM_RX); timer_t2_start(s); } break; case T30_STATE_CALL_FINISHED: /* Just ignore anything that happens now. We might get here if a premature disconnect from the far end overlaps something. */ break; default: span_log(&s->logging, SPAN_LOG_FLOW, "Bad state for send complete in t30_front_end_status - %d\n", s->state); break; } break; case T30_FRONT_END_RECEIVE_COMPLETE: span_log(&s->logging, SPAN_LOG_FLOW, "Receive complete in phase %s, state %d\n", phase_names[s->phase], s->state); /* Usually receive complete is notified by a carrier down signal. However, in cases like a T.38 packet stream dying in the middle of reception there needs to be a means to stop things. */ switch (s->phase) { case T30_PHASE_C_NON_ECM_RX: t30_non_ecm_put_bit(s, PUTBIT_CARRIER_DOWN); break; default: t30_hdlc_accept(s, NULL, PUTBIT_CARRIER_DOWN, TRUE); break; } break; case T30_FRONT_END_SIGNAL_PRESENT: span_log(&s->logging, SPAN_LOG_FLOW, "A signal is present\n"); /* The front end is explicitly telling us the signal we expect is present. This might be a premature indication from a T.38 implementation, but we have to believe it. if we don't we can time out improperly. For example, we might get an image modem carrier signal, but the first HDLC frame might only occur several seconds later. Many ECM senders idle on HDLC flags while waiting for the paper or filing system to become ready. T.38 offers no specific indication of correct carrier training, so if we don't kill the timer on the initial carrier starting signal, we will surely time out quite often before the next thing we receive. */ switch (s->phase) { case T30_PHASE_A_CED: case T30_PHASE_A_CNG: case T30_PHASE_B_RX: case T30_PHASE_D_RX: /* We are running a V.21 receive modem, where an explicit training indication will not occur. */ t30_hdlc_accept(s, NULL, PUTBIT_CARRIER_UP, TRUE); t30_hdlc_accept(s, NULL, PUTBIT_FRAMING_OK, TRUE); break; default: /* Cancel any receive timeout, and declare that a receive signal is present, since the front end is explicitly telling us we have seen something. */ s->rx_signal_present = TRUE; s->timer_t2_t4 = 0; break; } break; case T30_FRONT_END_SIGNAL_ABSENT: span_log(&s->logging, SPAN_LOG_FLOW, "No signal is present\n"); /* TODO: Should we do anything here? */ break; } } /*- End of function --------------------------------------------------------*/ void t30_timer_update(t30_state_t *s, int samples) { if (s->timer_t0_t1 > 0) { s->timer_t0_t1 -= samples; if (s->timer_t0_t1 <= 0) { if (s->far_end_detected) timer_t1_expired(s); else timer_t0_expired(s); } } if (s->timer_t3 > 0) { s->timer_t3 -= samples; if (s->timer_t3 <= 0) timer_t3_expired(s); } if (s->timer_t2_t4 > 0) { s->timer_t2_t4 -= samples; if (s->timer_t2_t4 <= 0) { if (s->timer_is_t4) timer_t4_expired(s); else timer_t2_expired(s); } } if (s->timer_t5 > 0) { s->timer_t5 -= samples; if (s->timer_t5 <= 0) timer_t5_expired(s); } } /*- End of function --------------------------------------------------------*/ void t30_terminate(t30_state_t *s) { if (s->phase != T30_PHASE_CALL_FINISHED) { /* The far end disconnected early, but was it just a tiny bit too early, as we were just tidying up, or seriously early as in a failure? */ switch (s->state) { case T30_STATE_C: /* We were sending the final disconnect, so just hussle things along. */ disconnect(s); break; case T30_STATE_B: /* We were in the final wait for everything to flush through, so just hussle things along. */ break; default: /* The call terminated prematurely. */ s->current_status = T30_ERR_CALLDROPPED; break; } if (s->phase_e_handler) s->phase_e_handler(s, s->phase_e_user_data, s->current_status); set_state(s, T30_STATE_CALL_FINISHED); set_phase(s, T30_PHASE_CALL_FINISHED); release_resources(s); } } /*- End of function --------------------------------------------------------*/ void t30_get_transfer_statistics(t30_state_t *s, t30_stats_t *t) { t4_stats_t stats; t->bit_rate = fallback_sequence[s->current_fallback].bit_rate; t->error_correcting_mode = s->error_correcting_mode; t4_get_transfer_statistics(&(s->t4), &stats); t->pages_transferred = stats.pages_transferred; t->pages_in_file = stats.pages_in_file; t->width = stats.width; t->length = stats.length; t->bad_rows = stats.bad_rows; t->longest_bad_row_run = stats.longest_bad_row_run; t->x_resolution = stats.x_resolution; t->y_resolution = stats.y_resolution; t->encoding = stats.encoding; t->image_size = stats.line_image_size; t->current_status = s->current_status; } /*- End of function --------------------------------------------------------*/ void t30_local_interrupt_request(t30_state_t *s, int state) { if (s->timer_t3 > 0) { /* Accept the far end's outstanding request for interrupt. */ /* TODO: */ send_simple_frame(s, (state) ? T30_PIP : T30_PIN); } s->local_interrupt_pending = state; } /*- End of function --------------------------------------------------------*/ int t30_restart(t30_state_t *s) { s->phase = T30_PHASE_IDLE; s->next_phase = T30_PHASE_IDLE; s->current_fallback = 0; s->rx_signal_present = FALSE; s->rx_trained = FALSE; s->current_status = T30_ERR_OK; s->ppr_count = 0; s->ecm_progress = 0; s->receiver_not_ready_count = 0; s->far_dis_dtc_len = 0; memset(&s->far_dis_dtc_frame, 0, sizeof(s->far_dis_dtc_frame)); t30_build_dis_or_dtc(s); if (s->calling_party) { set_state(s, T30_STATE_T); set_phase(s, T30_PHASE_A_CNG); } else { set_state(s, T30_STATE_ANSWERING); set_phase(s, T30_PHASE_A_CED); } memset(&s->rx_info, 0, sizeof(s->rx_info)); s->far_end_detected = FALSE; s->timer_t0_t1 = ms_to_samples(DEFAULT_TIMER_T0); release_resources(s); return 0; } /*- End of function --------------------------------------------------------*/ t30_state_t *t30_init(t30_state_t *s, int calling_party, t30_set_handler_t *set_rx_type_handler, void *set_rx_type_user_data, t30_set_handler_t *set_tx_type_handler, void *set_tx_type_user_data, t30_send_hdlc_handler_t *send_hdlc_handler, void *send_hdlc_user_data) { if (s == NULL) { if ((s = (t30_state_t *) malloc(sizeof(*s))) == NULL) return NULL; } memset(s, 0, sizeof(*s)); s->calling_party = calling_party; s->set_rx_type_handler = set_rx_type_handler; s->set_rx_type_user_data = set_rx_type_user_data; s->set_tx_type_handler = set_tx_type_handler; s->set_tx_type_user_data = set_tx_type_user_data; s->send_hdlc_handler = send_hdlc_handler; s->send_hdlc_user_data = send_hdlc_user_data; /* Default to the basic modems. */ s->supported_modems = T30_SUPPORT_V27TER | T30_SUPPORT_V29; s->supported_compressions = T30_SUPPORT_T4_1D_COMPRESSION | T30_SUPPORT_T4_2D_COMPRESSION; s->supported_resolutions = T30_SUPPORT_STANDARD_RESOLUTION | T30_SUPPORT_FINE_RESOLUTION | T30_SUPPORT_SUPERFINE_RESOLUTION | T30_SUPPORT_R8_RESOLUTION; s->supported_image_sizes = T30_SUPPORT_US_LETTER_LENGTH | T30_SUPPORT_US_LEGAL_LENGTH | T30_SUPPORT_UNLIMITED_LENGTH | T30_SUPPORT_215MM_WIDTH; /* Set the output encoding to something safe. Most things get 1D and 2D encoding right. Quite a lot get other things wrong. */ s->output_encoding = T4_COMPRESSION_ITU_T4_2D; s->local_min_scan_time_code = T30_MIN_SCAN_0MS; span_log_init(&s->logging, SPAN_LOG_NONE, NULL); span_log_set_protocol(&s->logging, "T.30"); t30_restart(s); return s; } /*- End of function --------------------------------------------------------*/ int t30_release(t30_state_t *s) { /* Make sure any FAX in progress is tidied up. If the tidying up has already happened, repeating it here is harmless. */ switch (s->operation_in_progress) { case OPERATION_IN_PROGRESS_T4_TX: t4_tx_end(&(s->t4)); break; case OPERATION_IN_PROGRESS_T4_RX: t4_rx_end(&(s->t4)); break; } s->operation_in_progress = OPERATION_IN_PROGRESS_NONE; return 0; } /*- End of function --------------------------------------------------------*/ int t30_free(t30_state_t *s) { t30_release(s); free(s); return 0; } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/gsm0610_encode.c0000644000175000017500000002523511150047216020442 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * gsm0610_encode.c - GSM 06.10 full rate speech codec. * * Written by Steve Underwood * * Copyright (C) 2006 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * This code is based on the widely used GSM 06.10 code available from * http://kbs.cs.tu-berlin.de/~jutta/toast.html * * $Id: gsm0610_encode.c,v 1.25 2008/07/02 14:48:25 steveu Exp $ */ /*! \file */ #if defined(HAVE_CONFIG_H) #include #endif #include #include #include "floating_fudge.h" #if defined(HAVE_TGMATH_H) #include #endif #if defined(HAVE_MATH_H) #include #endif #include #include #include "spandsp/telephony.h" #include "spandsp/bitstream.h" #include "spandsp/dc_restore.h" #include "spandsp/gsm0610.h" #include "gsm0610_local.h" /* 4.2 FIXED POINT IMPLEMENTATION OF THE RPE-LTP CODER */ /* The RPE-LTD coder works on a frame by frame basis. The length of the frame is equal to 160 samples. Some computations are done once per frame to produce at the output of the coder the LARc[1..8] parameters which are the coded LAR coefficients and also to realize the inverse filtering operation for the entire frame (160 samples of signal d[0..159]). These parts produce at the output of the coder: Procedure 4.2.11 to 4.2.18 are to be executed four times per frame. That means once for each sub-segment RPE-LTP analysis of 40 samples. These parts produce at the output of the coder. */ static void encode_a_frame(gsm0610_state_t *s, gsm0610_frame_t *f, const int16_t amp[]) { int k; int16_t *dp; int16_t *dpp; int16_t so[GSM0610_FRAME_LEN]; int i; dp = s->dp0 + 120; dpp = dp; gsm0610_preprocess(s, amp, so); gsm0610_lpc_analysis(s, so, f->LARc); gsm0610_short_term_analysis_filter(s, f->LARc, so); for (k = 0; k < 4; k++) { gsm0610_long_term_predictor(s, so + k*40, dp, s->e + 5, dpp, &f->Nc[k], &f->bc[k]); gsm0610_rpe_encoding(s, s->e + 5, &f->xmaxc[k], &f->Mc[k], f->xMc[k]); for (i = 0; i < 40; i++) dp[i] = gsm_add(s->e[5 + i], dpp[i]); /*endfor*/ dp += 40; dpp += 40; } /*endfor*/ memcpy((char *) s->dp0, (char *) (s->dp0 + GSM0610_FRAME_LEN), 120*sizeof(*s->dp0)); } /*- End of function --------------------------------------------------------*/ gsm0610_state_t *gsm0610_init(gsm0610_state_t *s, int packing) { if (s == NULL) { if ((s = (gsm0610_state_t *) malloc(sizeof (*s))) == NULL) return NULL; /*endif*/ } /*endif*/ memset((char *) s, '\0', sizeof (gsm0610_state_t)); s->nrp = 40; s->packing = packing; return s; } /*- End of function --------------------------------------------------------*/ int gsm0610_set_packing(gsm0610_state_t *s, int packing) { s->packing = packing; return 0; } /*- End of function --------------------------------------------------------*/ int gsm0610_release(gsm0610_state_t *s) { if (s) free(s); /*endif*/ return 0; } /*- End of function --------------------------------------------------------*/ int gsm0610_pack_none(uint8_t c[], const gsm0610_frame_t *s) { int i; int j; int k; i = 0; for (j = 0; j < 8; j++) c[i++] = (uint8_t) s->LARc[j]; for (j = 0; j < 4; j++) { c[i++] = (uint8_t) s->Nc[j]; c[i++] = (uint8_t) s->bc[j]; c[i++] = (uint8_t) s->Mc[j]; c[i++] = (uint8_t) s->xmaxc[j]; for (k = 0; k < 13; k++) c[i++] = (uint8_t) s->xMc[j][k]; } /*endfor*/ return 76; } /*- End of function --------------------------------------------------------*/ int gsm0610_pack_wav49(uint8_t c[], const gsm0610_frame_t *s) { uint16_t sr; int i; sr = 0; sr = (sr >> 6) | (s->LARc[0] << 10); sr = (sr >> 6) | (s->LARc[1] << 10); *c++ = (uint8_t) (sr >> 4); sr = (sr >> 5) | (s->LARc[2] << 11); *c++ = (uint8_t) (sr >> 7); sr = (sr >> 5) | (s->LARc[3] << 11); sr = (sr >> 4) | (s->LARc[4] << 12); *c++ = (uint8_t) (sr >> 6); sr = (sr >> 4) | (s->LARc[5] << 12); sr = (sr >> 3) | (s->LARc[6] << 13); *c++ = (uint8_t) (sr >> 7); sr = (sr >> 3) | (s->LARc[7] << 13); for (i = 0; i < 4; i++) { sr = (sr >> 7) | (s->Nc[i] << 9); *c++ = (uint8_t) (sr >> 5); sr = (sr >> 2) | (s->bc[i] << 14); sr = (sr >> 2) | (s->Mc[i] << 14); sr = (sr >> 6) | (s->xmaxc[i] << 10); *c++ = (uint8_t) (sr >> 3); sr = (sr >> 3) | (s->xMc[i][0] << 13); *c++ = (uint8_t) (sr >> 8); sr = (sr >> 3) | (s->xMc[i][1] << 13); sr = (sr >> 3) | (s->xMc[i][2] << 13); sr = (sr >> 3) | (s->xMc[i][3] << 13); *c++ = (uint8_t) (sr >> 7); sr = (sr >> 3) | (s->xMc[i][4] << 13); sr = (sr >> 3) | (s->xMc[i][5] << 13); sr = (sr >> 3) | (s->xMc[i][6] << 13); *c++ = (uint8_t) (sr >> 6); sr = (sr >> 3) | (s->xMc[i][7] << 13); sr = (sr >> 3) | (s->xMc[i][8] << 13); *c++ = (uint8_t) (sr >> 8); sr = (sr >> 3) | (s->xMc[i][9] << 13); sr = (sr >> 3) | (s->xMc[i][10] << 13); sr = (sr >> 3) | (s->xMc[i][11] << 13); *c++ = (uint8_t) (sr >> 7); sr = (sr >> 3) | (s->xMc[i][12] << 13); } /*endfor*/ s++; sr = (sr >> 6) | (s->LARc[0] << 10); *c++ = (uint8_t) (sr >> 6); sr = (sr >> 6) | (s->LARc[1] << 10); *c++ = (uint8_t) (sr >> 8); sr = (sr >> 5) | (s->LARc[2] << 11); sr = (sr >> 5) | (s->LARc[3] << 11); *c++ = (uint8_t) (sr >> 6); sr = (sr >> 4) | (s->LARc[4] << 12); sr = (sr >> 4) | (s->LARc[5] << 12); *c++ = (uint8_t) (sr >> 6); sr = (sr >> 3) | (s->LARc[6] << 13); sr = (sr >> 3) | (s->LARc[7] << 13); *c++ = (uint8_t) (sr >> 8); for (i = 0; i < 4; i++) { sr = (sr >> 7) | (s->Nc[i] << 9); sr = (sr >> 2) | (s->bc[i] << 14); *c++ = (uint8_t) (sr >> 7); sr = (sr >> 2) | (s->Mc[i] << 14); sr = (sr >> 6) | (s->xmaxc[i] << 10); *c++ = (uint8_t) (sr >> 7); sr = (sr >> 3) | (s->xMc[i][0] << 13); sr = (sr >> 3) | (s->xMc[i][1] << 13); sr = (sr >> 3) | (s->xMc[i][2] << 13); *c++ = (uint8_t) (sr >> 6); sr = (sr >> 3) | (s->xMc[i][3] << 13); sr = (sr >> 3) | (s->xMc[i][4] << 13); *c++ = (uint8_t) (sr >> 8); sr = (sr >> 3) | (s->xMc[i][5] << 13); sr = (sr >> 3) | (s->xMc[i][6] << 13); sr = (sr >> 3) | (s->xMc[i][7] << 13); *c++ = (uint8_t) (sr >> 7); sr = (sr >> 3) | (s->xMc[i][8] << 13); sr = (sr >> 3) | (s->xMc[i][9] << 13); sr = (sr >> 3) | (s->xMc[i][10] << 13); *c++ = (uint8_t) (sr >> 6); sr = (sr >> 3) | (s->xMc[i][11] << 13); sr = (sr >> 3) | (s->xMc[i][12] << 13); *c++ = (uint8_t) (sr >> 8); } /*endfor*/ return 65; } /*- End of function --------------------------------------------------------*/ int gsm0610_pack_voip(uint8_t c[33], const gsm0610_frame_t *s) { int i; *c++ = (uint8_t) (((GSM0610_MAGIC & 0xF) << 4) | ((s->LARc[0] >> 2) & 0xF)); *c++ = (uint8_t) (((s->LARc[0] & 0x3) << 6) | (s->LARc[1] & 0x3F)); *c++ = (uint8_t) (((s->LARc[2] & 0x1F) << 3) | ((s->LARc[3] >> 2) & 0x7)); *c++ = (uint8_t) (((s->LARc[3] & 0x3) << 6) | ((s->LARc[4] & 0xF) << 2) | ((s->LARc[5] >> 2) & 0x3)); *c++ = (uint8_t) (((s->LARc[5] & 0x3) << 6) | ((s->LARc[6] & 0x7) << 3) | (s->LARc[7] & 0x7)); for (i = 0; i < 4; i++) { *c++ = (uint8_t) (((s->Nc[i] & 0x7F) << 1) | ((s->bc[i] >> 1) & 0x1)); *c++ = (uint8_t) (((s->bc[i] & 0x1) << 7) | ((s->Mc[i] & 0x3) << 5) | ((s->xmaxc[i] >> 1) & 0x1F)); *c++ = (uint8_t) (((s->xmaxc[i] & 0x1) << 7) | ((s->xMc[i][0] & 0x7) << 4) | ((s->xMc[i][1] & 0x7) << 1) | ((s->xMc[i][2] >> 2) & 0x1)); *c++ = (uint8_t) (((s->xMc[i][2] & 0x3) << 6) | ((s->xMc[i][3] & 0x7) << 3) | (s->xMc[i][4] & 0x7)); *c++ = (uint8_t) (((s->xMc[i][5] & 0x7) << 5) | ((s->xMc[i][6] & 0x7) << 2) | ((s->xMc[i][7] >> 1) & 0x3)); *c++ = (uint8_t) (((s->xMc[i][7] & 0x1) << 7) | ((s->xMc[i][8] & 0x7) << 4) | ((s->xMc[i][9] & 0x7) << 1) | ((s->xMc[i][10] >> 2) & 0x1)); *c++ = (uint8_t) (((s->xMc[i][10] & 0x3) << 6) | ((s->xMc[i][11] & 0x7) << 3) | (s->xMc[i][12] & 0x7)); } /*endfor*/ return 33; } /*- End of function --------------------------------------------------------*/ int gsm0610_encode(gsm0610_state_t *s, uint8_t code[], const int16_t amp[], int len) { gsm0610_frame_t frame[2]; int bytes; int i; bytes = 0; for (i = 0; i < len; i += GSM0610_FRAME_LEN) { encode_a_frame(s, frame, &[i]); switch (s->packing) { case GSM0610_PACKING_WAV49: i += GSM0610_FRAME_LEN; encode_a_frame(s, frame + 1, &[i]); bytes += gsm0610_pack_wav49(&code[bytes], frame); break; case GSM0610_PACKING_VOIP: bytes += gsm0610_pack_voip(&code[bytes], frame); break; default: bytes += gsm0610_pack_none(&code[bytes], frame); break; } /*endswitch*/ } /*endfor*/ return bytes; } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/noise.c0000644000175000017500000000715011150047216017141 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * noise.c - A low complexity audio noise generator, suitable for * real time generation (current AWGN, and Hoth) * * Written by Steve Underwood * * Copyright (C) 2005 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: noise.c,v 1.23 2008/07/02 14:48:25 steveu Exp $ */ /*! \file */ #if defined(HAVE_CONFIG_H) #include #endif #include #include #include #include #include "floating_fudge.h" #if defined(HAVE_TGMATH_H) #include #endif #if defined(HAVE_MATH_H) #include #endif #include "spandsp/telephony.h" #include "spandsp/dc_restore.h" #include "spandsp/noise.h" int16_t noise(noise_state_t *s) { int32_t val; int i; /* The central limit theorem says if you add a few random numbers together, the result starts to look Gaussian. Quantities above 7 give diminishing returns. Quantites above 20 are exceedingly Gaussian. */ val = 0; for (i = 0; i < s->quality; i++) { s->rndnum = 1664525U*s->rndnum + 1013904223U; val += ((int32_t) s->rndnum) >> 22; } if (s->class_of_noise == NOISE_CLASS_HOTH) { /* Hoth noise is room-like. It should be sculpted, at the high and low ends, and roll off at 5dB/octave across the main part of the band. However, merely rolling off at 6dB/octave across the band gets you close to the subjective effect. */ s->state = (3*val + 5*s->state) >> 3; /* Bring the overall power level back to the pre-filtered level. This simple approx. leaves the signal about 0.35dB low. */ val = s->state << 1; } return saturate((val*s->rms) >> 10); } /*- End of function --------------------------------------------------------*/ noise_state_t *noise_init_dbm0(noise_state_t *s, int seed, float level, int class_of_noise, int quality) { return noise_init_dbov(s, seed, (level - DBM0_MAX_POWER), class_of_noise, quality); } /*- End of function --------------------------------------------------------*/ noise_state_t *noise_init_dbov(noise_state_t *s, int seed, float level, int class_of_noise, int quality) { float rms; if (s == NULL) { if ((s = (noise_state_t *) malloc(sizeof(*s))) == NULL) return NULL; } memset(s, 0, sizeof(*s)); s->rndnum = (uint32_t) seed; rms = 32768.0f*powf(10.0f, level/20.0f); if (quality < 4) s->quality = 4; else if (quality > 20) s->quality = 20; else s->quality = quality; if (class_of_noise == NOISE_CLASS_HOTH) { /* Allow for the gain of the filter */ rms *= 1.043f; } s->rms = (int32_t) (rms*sqrtf(12.0f/quality)); s->class_of_noise = class_of_noise; return s; } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/v29tx_constellation_maps.h0000644000175000017500000000543611150047216023010 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * v29tx_constellation_maps.h - ITU V.29 modem transmit part. * Constellation mapping. * * Written by Steve Underwood * * Copyright (C) 2008 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: v29tx_constellation_maps.h,v 1.1 2008/07/10 13:34:01 steveu Exp $ */ #if defined(SPANDSP_USE_FIXED_POINTx) static const complexi16_t v29_abab_constellation[6] = #else static const complexf_t v29_abab_constellation[6] = #endif { { 3, -3}, /* 315deg high 9600 */ {-3, 0}, /* 180deg low */ { 1, -1}, /* 315deg low 7200 */ {-3, 0}, /* 180deg low */ { 0, -3}, /* 270deg low 4800 */ {-3, 0} /* 180deg low */ }; #if defined(SPANDSP_USE_FIXED_POINTx) static const complexi16_t v29_cdcd_constellation[6] = #else static const complexf_t v29_cdcd_constellation[6] = #endif { { 3, 0}, /* 0deg low 9600 */ {-3, 3}, /* 135deg high */ { 3, 0}, /* 0deg low 7200 */ {-1, 1}, /* 135deg low */ { 3, 0}, /* 0deg low 4800 */ { 0, 3} /* 90deg low */ }; #if defined(SPANDSP_USE_FIXED_POINTx) static const complexi16_t v29_9600_constellation[16] = #else static const complexf_t v29_9600_constellation[16] = #endif { { 3, 0}, /* 0deg low */ { 1, 1}, /* 45deg low */ { 0, 3}, /* 90deg low */ {-1, 1}, /* 135deg low */ {-3, 0}, /* 180deg low */ {-1, -1}, /* 225deg low */ { 0, -3}, /* 270deg low */ { 1, -1}, /* 315deg low */ { 5, 0}, /* 0deg high */ { 3, 3}, /* 45deg high */ { 0, 5}, /* 90deg high */ {-3, 3}, /* 135deg high */ {-5, 0}, /* 180deg high */ {-3, -3}, /* 225deg high */ { 0, -5}, /* 270deg high */ { 3, -3} /* 315deg high */ }; /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/t4.c0000644000175000017500000021114611150047216016355 0ustar julienjulien//#define T4_STATE_DEBUGGING /* * SpanDSP - a series of DSP components for telephony * * t4.c - ITU T.4 FAX image processing * This depends on libtiff (see ) * * Written by Steve Underwood * * Copyright (C) 2003, 2007 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: t4.c,v 1.112 2008/07/22 13:48:15 steveu Exp $ */ /* * Much of this file is based on the T.4 and T.6 support in libtiff, which requires * the following notice in any derived source code: * * Copyright (c) 1990-1997 Sam Leffler * Copyright (c) 1991-1997 Silicon Graphics, Inc. * * Permission to use, copy, modify, distribute, and sell this software and * its documentation for any purpose is hereby granted without fee, provided * that (i) the above copyright notices and this permission notice appear in * all copies of the software and related documentation, and (ii) the names of * Sam Leffler and Silicon Graphics may not be used in any advertising or * publicity relating to the software without the specific, prior written * permission of Sam Leffler and Silicon Graphics. * * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. * * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. * * Decoder support is derived from code in Frank Cringle's viewfax program; * Copyright (C) 1990, 1995 Frank D. Cringle. */ /*! \file */ #if defined(HAVE_CONFIG_H) #include #endif #include #include #include #include #include #include #include #include #include #include "floating_fudge.h" #if defined(HAVE_TGMATH_H) #include #endif #if defined(HAVE_MATH_H) #include #endif #include #include "spandsp/telephony.h" #include "spandsp/logging.h" #include "spandsp/bit_operations.h" #include "spandsp/async.h" #include "spandsp/t4.h" #define CM_PER_INCH 2.54f /* Finite state machine state codes */ enum { S_Null = 0, S_Pass = 1, S_Horiz = 2, S_Vert = 3, S_Ext = 4, S_TermW = 5, S_TermB = 6, S_MakeUpW = 7, S_MakeUpB = 8, S_MakeUp = 9, S_EOL = 10 }; #include "faxfont.h" #if defined(T4_STATE_DEBUGGING) static void STATE_TRACE(const char *format, ...) { va_list arg_ptr; va_start(arg_ptr, format); vprintf(format, arg_ptr); va_end(arg_ptr); } /*- End of function --------------------------------------------------------*/ #else #define STATE_TRACE(...) /**/ #endif /* Finite state machine state table entry */ typedef struct { uint8_t state; /* See above */ uint8_t width; /* Width of code in bits */ int16_t param; /* Run length in bits */ } t4_table_entry_t; typedef struct { uint16_t length; /* Length of T.4 code, in bits */ uint16_t code; /* T.4 code */ int16_t run_length; /* Run length, in bits */ } t4_run_table_entry_t; #include "t4_states.h" static int set_tiff_directory_info(t4_state_t *s) { time_t now; struct tm *tm; char buf[256 + 1]; uint16_t resunit; float x_resolution; float y_resolution; /* Prepare the directory entry fully before writing the image, or libtiff complains */ TIFFSetField(s->tiff_file, TIFFTAG_COMPRESSION, s->output_compression); if (s->output_compression == COMPRESSION_CCITT_T4) { TIFFSetField(s->tiff_file, TIFFTAG_T4OPTIONS, s->output_t4_options); TIFFSetField(s->tiff_file, TIFFTAG_FAXMODE, FAXMODE_CLASSF); } TIFFSetField(s->tiff_file, TIFFTAG_IMAGEWIDTH, s->image_width); TIFFSetField(s->tiff_file, TIFFTAG_BITSPERSAMPLE, 1); TIFFSetField(s->tiff_file, TIFFTAG_ORIENTATION, ORIENTATION_TOPLEFT); TIFFSetField(s->tiff_file, TIFFTAG_SAMPLESPERPIXEL, 1); if (s->output_compression == COMPRESSION_CCITT_T4 || s->output_compression == COMPRESSION_CCITT_T6) { TIFFSetField(s->tiff_file, TIFFTAG_ROWSPERSTRIP, -1L); } else { TIFFSetField(s->tiff_file, TIFFTAG_ROWSPERSTRIP, TIFFDefaultStripSize(s->tiff_file, 0)); } TIFFSetField(s->tiff_file, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG); TIFFSetField(s->tiff_file, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_MINISWHITE); TIFFSetField(s->tiff_file, TIFFTAG_FILLORDER, FILLORDER_LSB2MSB); x_resolution = s->x_resolution/100.0f; y_resolution = s->y_resolution/100.0f; /* Metric seems the sane thing to use in the 21st century, but a lot of lousy software gets FAX resolutions wrong, and more get it wrong using metric than using inches. */ #if 0 TIFFSetField(s->tiff_file, TIFFTAG_XRESOLUTION, x_resolution); TIFFSetField(s->tiff_file, TIFFTAG_YRESOLUTION, y_resolution); resunit = RESUNIT_CENTIMETER; TIFFSetField(s->tiff_file, TIFFTAG_RESOLUTIONUNIT, resunit); #else TIFFSetField(s->tiff_file, TIFFTAG_XRESOLUTION, floorf(x_resolution*CM_PER_INCH + 0.5f)); TIFFSetField(s->tiff_file, TIFFTAG_YRESOLUTION, floorf(y_resolution*CM_PER_INCH + 0.5f)); resunit = RESUNIT_INCH; TIFFSetField(s->tiff_file, TIFFTAG_RESOLUTIONUNIT, resunit); #endif /* TODO: add the version of spandsp */ TIFFSetField(s->tiff_file, TIFFTAG_SOFTWARE, "spandsp"); if (gethostname(buf, sizeof(buf)) == 0) TIFFSetField(s->tiff_file, TIFFTAG_HOSTCOMPUTER, buf); #if defined(TIFFTAG_FAXDCS) if (s->dcs) TIFFSetField(s->tiff_file, TIFFTAG_FAXDCS, s->dcs); #endif if (s->sub_address) TIFFSetField(s->tiff_file, TIFFTAG_FAXSUBADDRESS, s->sub_address); if (s->far_ident) TIFFSetField(s->tiff_file, TIFFTAG_IMAGEDESCRIPTION, s->far_ident); if (s->vendor) TIFFSetField(s->tiff_file, TIFFTAG_MAKE, s->vendor); if (s->model) TIFFSetField(s->tiff_file, TIFFTAG_MODEL, s->model); time(&now); tm = localtime(&now); sprintf(buf, "%4d/%02d/%02d %02d:%02d:%02d", tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec); TIFFSetField(s->tiff_file, TIFFTAG_DATETIME, buf); TIFFSetField(s->tiff_file, TIFFTAG_FAXRECVTIME, now - s->page_start_time); TIFFSetField(s->tiff_file, TIFFTAG_IMAGELENGTH, s->image_length); /* Set the total pages to 1. For any one page document we will get this right. For multi-page documents we will need to come back and fill in the right answer when we know it. */ TIFFSetField(s->tiff_file, TIFFTAG_PAGENUMBER, s->pages_transferred++, 1); s->pages_in_file = s->pages_transferred; if (s->output_compression == COMPRESSION_CCITT_T4) { if (s->bad_rows) { TIFFSetField(s->tiff_file, TIFFTAG_BADFAXLINES, s->bad_rows); TIFFSetField(s->tiff_file, TIFFTAG_CLEANFAXDATA, CLEANFAXDATA_REGENERATED); TIFFSetField(s->tiff_file, TIFFTAG_CONSECUTIVEBADFAXLINES, s->longest_bad_row_run); } else { TIFFSetField(s->tiff_file, TIFFTAG_CLEANFAXDATA, CLEANFAXDATA_CLEAN); } } TIFFSetField(s->tiff_file, TIFFTAG_IMAGEWIDTH, s->image_width); return 0; } /*- End of function --------------------------------------------------------*/ static void update_row_bit_info(t4_state_t *s) { if (s->row_bits > s->max_row_bits) s->max_row_bits = s->row_bits; if (s->row_bits < s->min_row_bits) s->min_row_bits = s->row_bits; s->row_bits = 0; } /*- End of function --------------------------------------------------------*/ static int test_resolution(int res_unit, float actual, float expected) { if (res_unit == RESUNIT_INCH) actual *= 1.0f/CM_PER_INCH; return (expected*0.95f <= actual && actual <= expected*1.05f); } /*- End of function --------------------------------------------------------*/ static int get_tiff_directory_info(t4_state_t *s) { static const struct { float resolution; int code; } x_res_table[] = { { 102.0f/CM_PER_INCH, T4_X_RESOLUTION_R4}, { 204.0f/CM_PER_INCH, T4_X_RESOLUTION_R8}, { 300.0f/CM_PER_INCH, T4_X_RESOLUTION_300}, { 408.0f/CM_PER_INCH, T4_X_RESOLUTION_R16}, { 600.0f/CM_PER_INCH, T4_X_RESOLUTION_600}, { 800.0f/CM_PER_INCH, T4_X_RESOLUTION_800}, {1200.0f/CM_PER_INCH, T4_X_RESOLUTION_1200}, { -1.00f, -1} }; static const struct { float resolution; int code; int max_rows_to_next_1d_row; } y_res_table[] = { { 38.50f, T4_Y_RESOLUTION_STANDARD, 2}, { 77.00f, T4_Y_RESOLUTION_FINE, 4}, { 300.0f/CM_PER_INCH, T4_Y_RESOLUTION_300, 6}, { 154.00f, T4_Y_RESOLUTION_SUPERFINE, 8}, { 600.0f/CM_PER_INCH, T4_Y_RESOLUTION_600, 12}, { 800.0f/CM_PER_INCH, T4_Y_RESOLUTION_800, 16}, {1200.0f/CM_PER_INCH, T4_Y_RESOLUTION_1200, 24}, { -1.00f, -1, -1} }; uint16_t res_unit; uint32_t parm; float x_resolution; float y_resolution; int i; parm = 0; TIFFGetField(s->tiff_file, TIFFTAG_BITSPERSAMPLE, &parm); if (parm != 1) return -1; parm = 0; TIFFGetField(s->tiff_file, TIFFTAG_IMAGEWIDTH, &parm); s->image_width = parm; s->bytes_per_row = (s->image_width + 7)/8; parm = 0; TIFFGetField(s->tiff_file, TIFFTAG_IMAGELENGTH, &parm); s->image_length = parm; x_resolution = 0.0f; TIFFGetField(s->tiff_file, TIFFTAG_XRESOLUTION, &x_resolution); y_resolution = 0.0f; TIFFGetField(s->tiff_file, TIFFTAG_YRESOLUTION, &y_resolution); res_unit = RESUNIT_INCH; TIFFGetField(s->tiff_file, TIFFTAG_RESOLUTIONUNIT, &res_unit); /* Allow a little range for the X resolution in centimeters. The spec doesn't pin down the precise value. The other value should be exact. */ /* Treat everything we can't match as R8. Most FAXes are this resolution anyway. */ s->x_resolution = T4_X_RESOLUTION_R8; for (i = 0; x_res_table[i].code > 0; i++) { if (test_resolution(res_unit, x_resolution, x_res_table[i].resolution)) { s->x_resolution = x_res_table[i].code; break; } } s->y_resolution = T4_Y_RESOLUTION_STANDARD; s->max_rows_to_next_1d_row = 2; for (i = 0; y_res_table[i].code > 0; i++) { if (test_resolution(res_unit, y_resolution, y_res_table[i].resolution)) { s->y_resolution = y_res_table[i].code; s->max_rows_to_next_1d_row = y_res_table[i].max_rows_to_next_1d_row; break; } } return 0; } /*- End of function --------------------------------------------------------*/ static int open_tiff_input_file(t4_state_t *s, const char *file) { if ((s->tiff_file = TIFFOpen(file, "r")) == NULL) return -1; return 0; } /*- End of function --------------------------------------------------------*/ static int close_tiff_input_file(t4_state_t *s) { TIFFClose(s->tiff_file); s->tiff_file = NULL; if (s->file) free((char *) s->file); s->file = NULL; return 0; } /*- End of function --------------------------------------------------------*/ static int open_tiff_output_file(t4_state_t *s, const char *file) { if ((s->tiff_file = TIFFOpen(file, "w")) == NULL) return -1; return 0; } /*- End of function --------------------------------------------------------*/ static int close_tiff_output_file(t4_state_t *s) { int i; /* Perform any operations needed to tidy up a written TIFF file before closure. */ if (s->pages_transferred > 1) { /* We need to edit the TIFF directories. Until now we did not know the total page count, so the TIFF file currently says one. Now we need to set the correct total page count associated with each page. */ for (i = 0; i < s->pages_transferred; i++) { TIFFSetDirectory(s->tiff_file, (tdir_t) i); TIFFSetField(s->tiff_file, TIFFTAG_PAGENUMBER, i, s->pages_transferred); TIFFWriteDirectory(s->tiff_file); } } TIFFClose(s->tiff_file); s->tiff_file = NULL; if (s->file) { /* Try not to leave a file behind, if we didn't receive any pages to put in it. */ if (s->pages_transferred == 0) remove(s->file); free((char *) s->file); } s->file = NULL; return 0; } /*- End of function --------------------------------------------------------*/ #if defined(__i386__) || defined(__x86_64__) || defined(__ppc__) || defined(__powerpc__) static __inline__ int run_length(unsigned int bits) { return 7 - top_bit(bits); } /*- End of function --------------------------------------------------------*/ #else static __inline__ int run_length(unsigned int bits) { static const uint8_t run_len[256] = { 8, 7, 6, 6, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, /* 0x00 - 0x0F */ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, /* 0x10 - 0x1F */ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, /* 0x20 - 0x2F */ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, /* 0x30 - 0x3F */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0x40 - 0x4F */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0x50 - 0x5F */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0x60 - 0x6F */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0x70 - 0x7F */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 - 0x8F */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 - 0x9F */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 - 0xAF */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 - 0xBF */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 - 0xCF */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 - 0xDF */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 - 0xEF */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xF0 - 0xFF */ }; return run_len[bits]; } /*- End of function --------------------------------------------------------*/ #endif static int row_to_run_lengths(uint32_t list[], const uint8_t row[], int width) { uint32_t flip; uint32_t x; int span; int entry; int frag; int rem; int limit; int i; int pos; /* Deal with whole words first. We know we are starting on a word boundary. */ entry = 0; flip = 0; limit = (width >> 3) & ~3; span = 0; pos = 0; for (i = 0; i < limit; i += sizeof(uint32_t)) { x = *((uint32_t *) &row[i]); if (x != flip) { x = ((uint32_t) row[i] << 24) | ((uint32_t) row[i + 1] << 16) | ((uint32_t) row[i + 2] << 8) | ((uint32_t) row[i + 3]); /* We know we are going to find at least one transition. */ frag = 31 - top_bit(x ^ flip); pos += ((i << 3) - span + frag); list[entry++] = pos; x <<= frag; flip ^= 0xFFFFFFFF; rem = 32 - frag; /* Now see if there are any more */ while ((frag = 31 - top_bit(x ^ flip)) < rem) { pos += frag; list[entry++] = pos; x <<= frag; flip ^= 0xFFFFFFFF; rem -= frag; } /* Save the remainder of the word */ span = (i << 3) + 32 - rem; } } /* Now deal with some whole bytes, if there are any left. */ limit = width >> 3; flip &= 0xFF000000; if (i < limit) { for ( ; i < limit; i++) { x = (uint32_t) row[i] << 24; if (x != flip) { /* We know we are going to find at least one transition. */ frag = 31 - top_bit(x ^ flip); pos += ((i << 3) - span + frag); list[entry++] = pos; x <<= frag; flip ^= 0xFF000000; rem = 8 - frag; /* Now see if there are any more */ while ((frag = 31 - top_bit(x ^ flip)) < rem) { pos += frag; list[entry++] = pos; x <<= frag; flip ^= 0xFF000000; rem -= frag; } /* Save the remainder of the word */ span = (i << 3) + 8 - rem; } } } /* Deal with any left over fractional byte. */ span = (i << 3) - span; if ((rem = width & 7)) { x = row[i]; x <<= 24; do { frag = 31 - top_bit(x ^ flip); if (frag > rem) frag = rem; pos += (span + frag); list[entry++] = pos; x <<= frag; span = 0; flip ^= 0xFF000000; rem -= frag; } while (rem > 0); } else { if (span) { pos += span; list[entry++] = pos; } } return entry; } /*- End of function --------------------------------------------------------*/ static int free_buffers(t4_state_t *s) { if (s->image_buffer) { free(s->image_buffer); s->image_buffer = NULL; s->image_buffer_size = 0; } if (s->cur_runs) { free(s->cur_runs); s->cur_runs = NULL; } if (s->ref_runs) { free(s->ref_runs); s->ref_runs = NULL; } if (s->row_buf) { free(s->row_buf); s->row_buf = NULL; } return 0; } /*- End of function --------------------------------------------------------*/ static __inline__ void add_run_to_row(t4_state_t *s) { if (s->run_length >= 0) { s->row_len += s->run_length; /* Don't allow rows to grow too long, and overflow the buffers */ if (s->row_len <= s->image_width) s->cur_runs[s->a_cursor++] = s->run_length; } s->run_length = 0; } /*- End of function --------------------------------------------------------*/ static int put_decoded_row(t4_state_t *s) { static const int msbmask[9] = { 0x00, 0x01, 0x03, 0x07, 0x0f, 0x1f, 0x3f, 0x7f, 0xff }; uint8_t *t; uint32_t i; uint32_t *p; int fudge; int row_starts_at; int x; if (s->run_length) add_run_to_row(s); #if defined(T4_STATE_DEBUGGING) /* Dump the runs of black and white for analysis */ { int total; total = 0; for (x = 0; x < s->b_cursor; x++) total += s->ref_runs[x]; printf("Ref (%d)", total); for (x = 0; x < s->b_cursor; x++) printf(" %" PRIu32, s->ref_runs[x]); printf("\n"); total = 0; for (x = 0; x < s->a_cursor; x++) total += s->cur_runs[x]; printf("Cur (%d)", total); for (x = 0; x < s->a_cursor; x++) printf(" %" PRIu32, s->cur_runs[x]); printf("\n"); } #endif row_starts_at = s->image_size; /* Make sure there is enough room for another row */ if (s->image_size + s->bytes_per_row >= s->image_buffer_size) { if ((t = realloc(s->image_buffer, s->image_buffer_size + 100*s->bytes_per_row)) == NULL) return -1; s->image_buffer_size += 100*s->bytes_per_row; s->image_buffer = t; } if (s->row_len == s->image_width) { STATE_TRACE("%d Good row - %d %s\n", s->image_length, s->row_len, (s->row_is_2d) ? "2D" : "1D"); if (s->curr_bad_row_run) { if (s->curr_bad_row_run > s->longest_bad_row_run) s->longest_bad_row_run = s->curr_bad_row_run; s->curr_bad_row_run = 0; } /* Convert the runs to a bit image of the row */ /* White/black/white... runs, always starting with white. That means the first run could be zero length. */ for (x = 0, fudge = 0; x < s->a_cursor; x++, fudge ^= 0xFF) { i = s->cur_runs[x]; if (i >= s->tx_bits) { s->tx_bitstream = (s->tx_bitstream << s->tx_bits) | (msbmask[s->tx_bits] & fudge); for (i += (8 - s->tx_bits); i >= 8; i -= 8) { s->tx_bits = 8; s->image_buffer[s->image_size++] = (uint8_t) s->tx_bitstream; s->tx_bitstream = fudge; } } s->tx_bitstream = (s->tx_bitstream << i) | (msbmask[i] & fudge); s->tx_bits -= i; } s->image_length++; } else { STATE_TRACE("%d Bad row - %d %s\n", s->image_length, s->row_len, (s->row_is_2d) ? "2D" : "1D"); /* Try to clean up the bad runs, and produce something reasonable as the reference row for the next row. Use a copy of the previous good row as the actual current row. If the row only fell apart near the end, reusing it might be the best solution. */ for (i = 0, fudge = 0; i < s->a_cursor && fudge < s->image_width; i++) fudge += s->cur_runs[i]; if (fudge < s->image_width) { /* Try to pad with white, and avoid black, to minimise mess on the image. */ if ((s->a_cursor & 1)) { /* We currently finish in white. We could extend that, but it is probably of the right length. Changing it would only further mess up what happens in the next row. It seems better to add a black spot, and an extra white run. */ s->cur_runs[s->a_cursor++] = 1; fudge++; if (fudge < s->image_width) s->cur_runs[s->a_cursor++] = s->image_width - fudge; } else { /* We currently finish on black, so we add an extra white run to fill out the line. */ s->cur_runs[s->a_cursor++] = s->image_width - fudge; } } else { /* Trim the last element to align with the proper image width */ s->cur_runs[s->a_cursor] += (s->image_width - fudge); } /* Ensure there is a previous line to copy from. */ if (s->image_size != s->last_row_starts_at) { /* Copy the previous row over this one */ memcpy(s->image_buffer + s->image_size, s->image_buffer + s->last_row_starts_at, s->bytes_per_row); s->image_size += s->bytes_per_row; s->image_length++; } s->bad_rows++; s->curr_bad_row_run++; } /* Pad the row as it becomes the reference row, so there are no odd runs to pick up if we step off the end of the list. */ s->cur_runs[s->a_cursor] = 0; s->cur_runs[s->a_cursor + 1] = 0; /* Prepare the buffers for the next row. */ s->last_row_starts_at = row_starts_at; /* Swap the buffers */ p = s->cur_runs; s->cur_runs = s->ref_runs; s->ref_runs = p; s->b_cursor = 1; s->a_cursor = 0; s->b1 = s->ref_runs[0]; s->a0 = 0; s->run_length = 0; return 0; } /*- End of function --------------------------------------------------------*/ int t4_rx_end_page(t4_state_t *s) { int row; int i; if (s->line_encoding == T4_COMPRESSION_ITU_T6) { /* Push enough zeros through the decoder to flush out any remaining codes */ for (i = 0; i < 13; i++) t4_rx_put_bit(s, 0); } if (s->curr_bad_row_run) { if (s->curr_bad_row_run > s->longest_bad_row_run) s->longest_bad_row_run = s->curr_bad_row_run; s->curr_bad_row_run = 0; } if (s->image_size == 0) return -1; if (s->row_write_handler) { for (row = 0; row < s->image_length; row++) { if (s->row_write_handler(s->row_write_user_data, s->image_buffer + row*s->bytes_per_row, s->bytes_per_row) < 0) { span_log(&s->logging, SPAN_LOG_WARNING, "Write error at row %d.\n", row); break; } } /* Write a blank row to indicate the end of the image. */ if (s->row_write_handler(s->row_write_user_data, NULL, 0) < 0) span_log(&s->logging, SPAN_LOG_WARNING, "Write error at row %d.\n", row); } else { /* Set up the TIFF directory info... */ set_tiff_directory_info(s); /* ..and then write the image... */ if (TIFFWriteEncodedStrip(s->tiff_file, 0, s->image_buffer, s->image_length*s->bytes_per_row) < 0) span_log(&s->logging, SPAN_LOG_WARNING, "%s: Error writing TIFF strip.\n", s->file); /* ...then the directory entry, and libtiff is happy. */ TIFFWriteDirectory(s->tiff_file); } s->rx_bits = 0; s->rx_skip_bits = 0; s->rx_bitstream = 0; s->consecutive_eols = 5; s->image_size = 0; return 0; } /*- End of function --------------------------------------------------------*/ static __inline__ void drop_rx_bits(t4_state_t *s, int bits) { /* Only remove one bit right now. The rest need to be removed step by step, checking for a misaligned EOL along the way. */ s->row_bits += bits; s->rx_skip_bits += (bits - 1); s->rx_bits--; s->rx_bitstream >>= 1; } /*- End of function --------------------------------------------------------*/ static __inline__ void force_drop_rx_bits(t4_state_t *s, int bits) { /* This should only be called to drop the bits of an EOL, as that is the only place where it is safe to drop them all at once. */ s->row_bits += bits; s->rx_skip_bits = 0; s->rx_bits -= bits; s->rx_bitstream >>= bits; } /*- End of function --------------------------------------------------------*/ static int rx_put_bits(t4_state_t *s, uint32_t bit_string, int quantity) { int bits; /* We decompress bit by bit, as the data stream is received. We need to scan continuously for EOLs, so we might as well work this way. */ s->line_image_size += quantity; s->rx_bitstream |= (bit_string << s->rx_bits); /* The longest item we need to scan for is 13 bits long (a 2D EOL), so we need a minimum of 13 bits in the buffer to proceed with any bit stream analysis. */ if ((s->rx_bits += quantity) < 13) return FALSE; if (s->consecutive_eols) { /* Check if the image has already terminated */ if (s->consecutive_eols >= 5) return TRUE; if (s->consecutive_eols < 0) { /* We are waiting for the very first EOL (1D or 2D only). */ while ((s->rx_bitstream & 0xFFF) != 0x800) { s->rx_bitstream >>= 1; if (--s->rx_bits < 13) return FALSE; } s->consecutive_eols = 0; if (s->line_encoding == T4_COMPRESSION_ITU_T4_1D) { s->row_is_2d = FALSE; force_drop_rx_bits(s, 12); } else { s->row_is_2d = !(s->rx_bitstream & 0x1000); force_drop_rx_bits(s, 13); } /* We can proceed to processing the bit stream as an image now */ } } while (s->rx_bits >= 13) { /* We need to check for EOLs bit by bit through the whole stream. If we just try looking between code words, we will miss an EOL when a bit error has throw the code words completely out of step. The can mean recovery takes many lines, and the image gets really messed up. */ /* Although EOLs are not inserted at the end of each row of a T.6 image, they are still perfectly valid, and can terminate an image. */ if ((s->rx_bitstream & 0x0FFF) == 0x0800) { STATE_TRACE("EOL\n"); if (s->row_len == 0) { if (++s->consecutive_eols >= 5) return TRUE; } else { if (s->run_length > 0) add_run_to_row(s); s->consecutive_eols = 0; if (put_decoded_row(s)) return TRUE; update_row_bit_info(s); } if (s->line_encoding == T4_COMPRESSION_ITU_T4_1D) { force_drop_rx_bits(s, 12); } else { s->row_is_2d = !(s->rx_bitstream & 0x1000); force_drop_rx_bits(s, 13); } s->its_black = FALSE; s->black_white = 0; s->run_length = 0; s->row_len = 0; continue; } if (s->rx_skip_bits) { /* We are clearing out the remaining bits of the last code word we absorbed. */ s->rx_skip_bits--; s->rx_bits--; s->rx_bitstream >>= 1; continue; } if (s->row_is_2d && s->black_white == 0) { bits = s->rx_bitstream & 0x7F; STATE_TRACE("State %d, %d - ", t4_2d_table[bits].state, t4_2d_table[bits].width); if (s->row_len >= s->image_width) { drop_rx_bits(s, t4_2d_table[bits].width); continue; } if (s->a_cursor) { /* Move past a0, always staying on the current colour */ for ( ; s->b1 <= s->a0; s->b_cursor += 2) s->b1 += (s->ref_runs[s->b_cursor] + s->ref_runs[s->b_cursor + 1]); } switch (t4_2d_table[bits].state) { case S_Horiz: STATE_TRACE("Horiz %d %d %d\n", s->image_width, s->a0, s->a_cursor); /* We now need to extract a white/black or black/white pair of runs, using the 1D method. If the first of the pair takes us exactly to the end of the row, there should still be a zero length element for the second of the pair. */ s->its_black = s->a_cursor & 1; s->black_white = 2; break; case S_Vert: STATE_TRACE("Vert[%d] %d %d %d %d\n", t4_2d_table[bits].param, s->image_width, s->a0, s->b1, s->run_length); s->run_length += (s->b1 - s->a0 + t4_2d_table[bits].param); s->a0 = s->b1 + t4_2d_table[bits].param; add_run_to_row(s); /* We need to move one step in one direction or the other, to change to the opposite colour */ if (t4_2d_table[bits].param >= 0) { s->b1 += s->ref_runs[s->b_cursor++]; } else { if (s->b_cursor) s->b1 -= s->ref_runs[--s->b_cursor]; } break; case S_Pass: STATE_TRACE("Pass %d %d %d %d %d\n", s->image_width, s->a0, s->b1, s->ref_runs[s->b_cursor], s->ref_runs[s->b_cursor + 1]); s->b1 += s->ref_runs[s->b_cursor++]; s->run_length += (s->b1 - s->a0); s->a0 = s->b1; s->b1 += s->ref_runs[s->b_cursor++]; break; case S_Ext: /* We do not currently handle any kind of extension */ STATE_TRACE("Ext %d %d %d 0x%x\n", s->image_width, s->a0, ((s->rx_bitstream >> t4_2d_table[bits].width) & 0x7), s->rx_bitstream); /* TODO: The uncompressed option should be implemented. */ break; case S_Null: STATE_TRACE("Null\n"); break; default: STATE_TRACE("Unexpected T.4 state\n"); span_log(&s->logging, SPAN_LOG_WARNING, "Unexpected T.4 state %d\n", t4_2d_table[bits].state); break; } drop_rx_bits(s, t4_2d_table[bits].width); } else { if (s->its_black) { bits = s->rx_bitstream & 0x1FFF; STATE_TRACE("State %d, %d - Black %d %d %d\n", t4_1d_black_table[bits].state, t4_1d_black_table[bits].width, s->image_width, s->a0, t4_1d_black_table[bits].param); switch (t4_1d_black_table[bits].state) { case S_MakeUpB: case S_MakeUp: s->run_length += t4_1d_black_table[bits].param; s->a0 += t4_1d_black_table[bits].param; break; case S_TermB: s->its_black = FALSE; if (s->row_len < s->image_width) { s->run_length += t4_1d_black_table[bits].param; s->a0 += t4_1d_black_table[bits].param; add_run_to_row(s); } if (s->black_white) s->black_white--; break; default: /* Bad black */ s->black_white = 0; break; } drop_rx_bits(s, t4_1d_black_table[bits].width); } else { bits = s->rx_bitstream & 0xFFF; STATE_TRACE("State %d, %d - White %d %d %d\n", t4_1d_white_table[bits].state, t4_1d_white_table[bits].width, s->image_width, s->a0, t4_1d_white_table[bits].param); switch (t4_1d_white_table[bits].state) { case S_MakeUpW: case S_MakeUp: s->run_length += t4_1d_white_table[bits].param; s->a0 += t4_1d_white_table[bits].param; break; case S_TermW: s->its_black = TRUE; if (s->row_len < s->image_width) { s->run_length += t4_1d_white_table[bits].param; s->a0 += t4_1d_white_table[bits].param; add_run_to_row(s); } if (s->black_white) s->black_white--; break; default: /* Bad white */ s->black_white = 0; break; } drop_rx_bits(s, t4_1d_white_table[bits].width); } } if (s->a0 >= s->image_width) s->a0 = s->image_width - 1; if (s->line_encoding == T4_COMPRESSION_ITU_T6) { /* T.6 has no EOL markers. We sense the end of a line by its length alone. */ /* The last test here is a backstop protection, so a corrupt image cannot cause us to do bad things. Bad encoders have actually been seen, which demand such protection. */ if (s->black_white == 0 && s->row_len >= s->image_width) { STATE_TRACE("EOL T.6\n"); if (s->run_length > 0) add_run_to_row(s); update_row_bit_info(s); if (put_decoded_row(s)) return TRUE; s->its_black = FALSE; s->black_white = 0; s->run_length = 0; s->row_len = 0; } } } return FALSE; } /*- End of function --------------------------------------------------------*/ int t4_rx_put_bit(t4_state_t *s, int bit) { return rx_put_bits(s, bit & 1, 1); } /*- End of function --------------------------------------------------------*/ int t4_rx_put_byte(t4_state_t *s, uint8_t byte) { return rx_put_bits(s, byte & 0xFF, 8); } /*- End of function --------------------------------------------------------*/ int t4_rx_put_chunk(t4_state_t *s, const uint8_t buf[], int len) { int i; uint8_t byte; for (i = 0; i < len; i++) { byte = buf[i]; if (rx_put_bits(s, byte & 0xFF, 8)) return TRUE; } return FALSE; } /*- End of function --------------------------------------------------------*/ int t4_rx_set_row_write_handler(t4_state_t *s, t4_row_write_handler_t handler, void *user_data) { s->row_write_handler = handler; s->row_write_user_data = user_data; return 0; } /*- End of function --------------------------------------------------------*/ t4_state_t *t4_rx_init(t4_state_t *s, const char *file, int output_encoding) { memset(s, 0, sizeof(*s)); span_log_init(&s->logging, SPAN_LOG_NONE, NULL); span_log_set_protocol(&s->logging, "T.4"); s->rx = TRUE; span_log(&s->logging, SPAN_LOG_FLOW, "Start rx document\n"); if (open_tiff_output_file(s, file) < 0) return NULL; /* Save the file name for logging reports. */ s->file = strdup(file); /* Only provide for one form of coding throughout the file, even though the coding on the wire could change between pages. */ switch (output_encoding) { case T4_COMPRESSION_ITU_T4_1D: s->output_compression = COMPRESSION_CCITT_T4; s->output_t4_options = GROUP3OPT_FILLBITS; break; case T4_COMPRESSION_ITU_T4_2D: s->output_compression = COMPRESSION_CCITT_T4; s->output_t4_options = GROUP3OPT_FILLBITS | GROUP3OPT_2DENCODING; break; case T4_COMPRESSION_ITU_T6: s->output_compression = COMPRESSION_CCITT_T6; s->output_t4_options = 0; break; } /* Until we have a valid figure for the bytes per row, we need it to be set to a suitable value to ensure it will be seen as changing when the real value is used. */ s->bytes_per_row = 0; s->pages_transferred = 0; s->pages_in_file = 0; s->start_page = 0; s->stop_page = INT_MAX; s->image_buffer = NULL; s->image_buffer_size = 0; /* Set some default values */ s->x_resolution = T4_X_RESOLUTION_R8; s->y_resolution = T4_Y_RESOLUTION_FINE; s->image_width = T4_WIDTH_R8_A4; return s; } /*- End of function --------------------------------------------------------*/ int t4_rx_start_page(t4_state_t *s) { int bytes_per_row; int run_space; uint32_t *bufptr; span_log(&s->logging, SPAN_LOG_FLOW, "Start rx page - compression %d\n", s->line_encoding); if (s->tiff_file == NULL) return -1; /* Calculate the scanline/tile width. */ bytes_per_row = (s->image_width + 7)/8; run_space = (s->image_width + 4)*sizeof(uint32_t); if (bytes_per_row != s->bytes_per_row) { /* Allocate the space required for decoding the new row length. */ s->bytes_per_row = bytes_per_row; if ((bufptr = (uint32_t *) realloc(s->cur_runs, run_space)) == NULL) return -1; s->cur_runs = bufptr; if ((bufptr = (uint32_t *) realloc(s->ref_runs, run_space)) == NULL) return -1; s->ref_runs = bufptr; } memset(s->cur_runs, 0, run_space); memset(s->ref_runs, 0, run_space); s->rx_bits = 0; s->rx_skip_bits = 0; s->rx_bitstream = 0; s->row_bits = 0; s->min_row_bits = INT_MAX; s->max_row_bits = 0; s->row_is_2d = (s->line_encoding == T4_COMPRESSION_ITU_T6); /* We start at -1 EOLs for 1D and 2D decoding, as an indication we are waiting for the first EOL. */ s->consecutive_eols = (s->line_encoding == T4_COMPRESSION_ITU_T6) ? 0 : -1; s->bad_rows = 0; s->longest_bad_row_run = 0; s->curr_bad_row_run = 0; s->image_length = 0; s->tx_bitstream = 0; s->tx_bits = 8; s->image_size = 0; s->line_image_size = 0; s->last_row_starts_at = 0; s->row_len = 0; s->its_black = FALSE; s->black_white = 0; /* Initialise the reference line to all white */ s->ref_runs[0] = s->ref_runs[1] = s->ref_runs[2] = s->ref_runs[3] = s->image_width; s->ref_steps = 1; s->b_cursor = 1; s->a_cursor = 0; s->b1 = s->ref_runs[0]; s->a0 = 0; s->run_length = 0; time (&s->page_start_time); return 0; } /*- End of function --------------------------------------------------------*/ int t4_rx_delete(t4_state_t *s) { if (t4_rx_end(s)) return -1; free_buffers(s); free(s); return 0; } /*- End of function --------------------------------------------------------*/ int t4_rx_end(t4_state_t *s) { if (!s->rx) return -1; if (s->tiff_file) close_tiff_output_file(s); free_buffers(s); return 0; } /*- End of function --------------------------------------------------------*/ void t4_rx_set_rx_encoding(t4_state_t *s, int encoding) { s->line_encoding = encoding; } /*- End of function --------------------------------------------------------*/ void t4_rx_set_image_width(t4_state_t *s, int width) { s->image_width = width; } /*- End of function --------------------------------------------------------*/ void t4_rx_set_y_resolution(t4_state_t *s, int resolution) { s->y_resolution = resolution; } /*- End of function --------------------------------------------------------*/ void t4_rx_set_x_resolution(t4_state_t *s, int resolution) { s->x_resolution = resolution; } /*- End of function --------------------------------------------------------*/ void t4_rx_set_dcs(t4_state_t *s, const char *dcs) { s->dcs = (dcs && dcs[0]) ? dcs : NULL; } /*- End of function --------------------------------------------------------*/ void t4_rx_set_sub_address(t4_state_t *s, const char *sub_address) { s->sub_address = (sub_address && sub_address[0]) ? sub_address : NULL; } /*- End of function --------------------------------------------------------*/ void t4_rx_set_far_ident(t4_state_t *s, const char *ident) { s->far_ident = (ident && ident[0]) ? ident : NULL; } /*- End of function --------------------------------------------------------*/ void t4_rx_set_vendor(t4_state_t *s, const char *vendor) { s->vendor = vendor; } /*- End of function --------------------------------------------------------*/ void t4_rx_set_model(t4_state_t *s, const char *model) { s->model = model; } /*- End of function --------------------------------------------------------*/ static __inline__ int put_encoded_bits(t4_state_t *s, uint32_t bits, int length) { uint8_t *t; /* We might be called with a large length value, to spew out a mass of zero bits for minimum row length padding. */ s->tx_bitstream |= (bits << s->tx_bits); s->tx_bits += length; s->row_bits += length; if ((s->image_size + (s->tx_bits + 7)/8) >= s->image_buffer_size) { if ((t = realloc(s->image_buffer, s->image_buffer_size + 100*s->bytes_per_row)) == NULL) return -1; s->image_buffer = t; s->image_buffer_size += 100*s->bytes_per_row; } while (s->tx_bits >= 8) { s->image_buffer[s->image_size++] = (uint8_t) (s->tx_bitstream & 0xFF); s->tx_bitstream >>= 8; s->tx_bits -= 8; } return 0; } /*- End of function --------------------------------------------------------*/ /* * Write the sequence of codes that describes * the specified span of zero's or one's. The * appropriate table that holds the make-up and * terminating codes is supplied. */ static __inline__ int put_1d_span(t4_state_t *s, int32_t span, const t4_run_table_entry_t *tab) { const t4_run_table_entry_t *te; te = &tab[63 + (2560 >> 6)]; while (span >= 2560 + 64) { if (put_encoded_bits(s, te->code, te->length)) return -1; span -= te->run_length; } te = &tab[63 + (span >> 6)]; if (span >= 64) { if (put_encoded_bits(s, te->code, te->length)) return -1; span -= te->run_length; } if (put_encoded_bits(s, tab[span].code, tab[span].length)) return -1; return 0; } /*- End of function --------------------------------------------------------*/ #define pixel_is_black(x,bit) (((x)[(bit) >> 3] << ((bit) & 7)) & 0x80) /* * Write an EOL code to the output stream. We also handle writing the tag * bit for the next scanline when doing 2D encoding. */ static void encode_eol(t4_state_t *s) { uint32_t code; int length; if (s->line_encoding == T4_COMPRESSION_ITU_T4_2D) { code = 0x0800 | ((!s->row_is_2d) << 12); length = 13; } else { /* T.4 1D EOL, or T.6 EOFB */ code = 0x800; length = 12; } if (s->row_bits) { /* We may need to pad the row to a minimum length. */ if (s->row_bits + length < s->min_bits_per_row) put_encoded_bits(s, 0, s->min_bits_per_row - (s->row_bits + length)); put_encoded_bits(s, code, length); update_row_bit_info(s); } else { /* We don't pad zero length rows. They are the consecutive EOLs which end a page. */ put_encoded_bits(s, code, length); } } /*- End of function --------------------------------------------------------*/ /* * 2D-encode a row of pixels. Consult ITU specification T.4 for the algorithm. */ static void encode_2d_row(t4_state_t *s) { static const t4_run_table_entry_t codes[] = { { 7, 0x60, 0 }, /* VR3 0000 011 */ { 6, 0x30, 0 }, /* VR2 0000 11 */ { 3, 0x06, 0 }, /* VR1 011 */ { 1, 0x01, 0 }, /* V0 1 */ { 3, 0x02, 0 }, /* VL1 010 */ { 6, 0x10, 0 }, /* VL2 0000 10 */ { 7, 0x20, 0 }, /* VL3 0000 010 */ { 3, 0x04, 0 }, /* horizontal 001 */ { 4, 0x08, 0 } /* pass 0001 */ }; /* The reference or starting changing element on the coding line. At the start of the coding line, a0 is set on an imaginary white changing element situated just before the first element on the line. During the coding of the coding line, the position of a0 is defined by the previous coding mode. (See T.4/4.2.1.3.2.) */ int a0; /* The next changing element to the right of a0 on the coding line. */ int a1; /* The next changing element to the right of a1 on the coding line. */ int a2; /* The first changing element on the reference line to the right of a0 and of opposite colour to a0. */ int b1; /* The next changing element to the right of b1 on the reference line. */ int b2; int diff; int a_cursor; int b_cursor; int cur_steps; uint32_t *p; /* b1 b2 XX XX XX XX XX -- -- -- -- -- XX XX XX -- -- -- -- -- XX XX XX -- -- -- -- -- XX XX XX XX XX XX -- -- -- -- a0 a1 a2 a) Pass mode This mode is identified when the position of b2 lies to the left of a1. When this mode has been coded, a0 is set on the element of the coding line below b2 in preparation for the next coding (i.e. on a0'). b1 b2 XX XX XX XX -- -- XX XX XX -- -- -- -- -- XX XX -- -- -- -- -- -- -- -- -- -- XX XX a0 a0' a1 Pass mode However, the state where b2 occurs just above a1, as shown in the figure below, is not considered as a pass mode. b1 b2 XX XX XX XX -- -- XX XX XX -- -- -- -- -- XX XX -- -- -- -- -- -- -- XX XX XX XX XX a0 a1 Not pass mode b) Vertical mode When this mode is identified, the position of a1 is coded relative to the position of b1. The relative distance a1b1 can take on one of seven values V(0), VR(1), VR(2), VR(3), VL(1), VL(2) and VL(3), each of which is represented by a separate code word. The subscripts R and L indicate that a1 is to the right or left respectively of b1, and the number in brackets indicates the value of the distance a1b1. After vertical mode coding has occurred, the position of a0 is set on a1 (see figure below). c) Horizontal mode When this mode is identified, both the run-lengths a0a1 and a1a2 are coded using the code words H + M(a0a1) + M(a1a2). H is the flag code word 001 taken from the two-dimensional code table. M(a0a1) and M(a1a2) are code words which represent the length and "colour" of the runs a0a1 and a1a2 respectively and are taken from the appropriate white or black one-dimensional code tables. After a horizontal mode coding, the position of a0 is set on a2 (see figure below). Vertical b1 b2 -- XX XX XX XX XX -- -- -- -- -- -- -- -- XX XX XX XX -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- XX XX XX XX XX XX XX -- -- a0 a1 a2 <-------- a0a1 --------><-------- a1a2 ------------> Horizontal mode Vertical and horizontal modes */ /* The following implements the 2-D encoding section of the flow chart in Figure7/T.4 */ cur_steps = row_to_run_lengths(s->cur_runs, s->row_buf, s->image_width); /* Stretch the row a little, so when we step by 2 we are guaranteed to hit an entry showing the row length */ s->cur_runs[cur_steps] = s->cur_runs[cur_steps + 1] = s->cur_runs[cur_steps + 2] = s->cur_runs[cur_steps - 1]; a0 = 0; a1 = s->cur_runs[0]; b1 = s->ref_runs[0]; a_cursor = 0; b_cursor = 0; for (;;) { b2 = s->ref_runs[b_cursor + 1]; if (b2 >= a1) { diff = b1 - a1; if (abs(diff) <= 3) { /* Vertical mode coding */ put_encoded_bits(s, codes[diff + 3].code, codes[diff + 3].length); a0 = a1; a_cursor++; } else { /* Horizontal mode coding */ a2 = s->cur_runs[a_cursor + 1]; put_encoded_bits(s, codes[7].code, codes[7].length); if (a0 + a1 == 0 || pixel_is_black(s->row_buf, a0) == 0) { put_1d_span(s, a1 - a0, t4_white_codes); put_1d_span(s, a2 - a1, t4_black_codes); } else { put_1d_span(s, a1 - a0, t4_black_codes); put_1d_span(s, a2 - a1, t4_white_codes); } a0 = a2; a_cursor += 2; } if (a0 >= s->image_width) break; if (a_cursor >= cur_steps) a_cursor = cur_steps - 1; a1 = s->cur_runs[a_cursor]; } else { /* Pass mode coding */ put_encoded_bits(s, codes[8].code, codes[8].length); /* We now set a0 to somewhere in the middle of its current run, but we know are aren't moving beyond that run. */ a0 = b2; if (a0 >= s->image_width) break; } /* We need to hunt for the correct position in the reference row, as the runs there have no particular alignment with the runs in the current row. */ if (pixel_is_black(s->row_buf, a0)) b_cursor |= 1; else b_cursor &= ~1; if (a0 < s->ref_runs[b_cursor]) { for ( ; b_cursor >= 0; b_cursor -= 2) { if (a0 >= s->ref_runs[b_cursor]) break; } b_cursor += 2; } else { for ( ; b_cursor < s->ref_steps; b_cursor += 2) { if (a0 < s->ref_runs[b_cursor]) break; } if (b_cursor >= s->ref_steps) b_cursor = s->ref_steps - 1; } b1 = s->ref_runs[b_cursor]; } /* Swap the buffers */ s->ref_steps = cur_steps; p = s->cur_runs; s->cur_runs = s->ref_runs; s->ref_runs = p; } /*- End of function --------------------------------------------------------*/ /* * 1D-encode a row of pixels. The encoding is * a sequence of all-white or all-black spans * of pixels encoded with Huffman codes. */ static void encode_1d_row(t4_state_t *s) { int i; /* Do our work in the reference row buffer, and it is already in place if we need a reference row for a following 2D encoded row. */ s->ref_steps = row_to_run_lengths(s->ref_runs, s->row_buf, s->image_width); put_1d_span(s, s->ref_runs[0], t4_white_codes); for (i = 1; i < s->ref_steps; i++) put_1d_span(s, s->ref_runs[i] - s->ref_runs[i - 1], (i & 1) ? t4_black_codes : t4_white_codes); /* Stretch the row a little, so when we step by 2 we are guaranteed to hit an entry showing the row length */ s->ref_runs[s->ref_steps] = s->ref_runs[s->ref_steps + 1] = s->ref_runs[s->ref_steps + 2] = s->ref_runs[s->ref_steps - 1]; } /*- End of function --------------------------------------------------------*/ static int encode_row(t4_state_t *s) { switch (s->line_encoding) { case T4_COMPRESSION_ITU_T6: /* T.6 compression is a trivial step up from T.4 2D, so we just throw it in here. T.6 is only used with error correction, so it does not need independantly compressed (i.e. 1D) lines to recover from data errors. It doesn't need EOLs, either. */ if (s->row_bits) update_row_bit_info(s); encode_2d_row(s); break; case T4_COMPRESSION_ITU_T4_2D: encode_eol(s); if (s->row_is_2d) { encode_2d_row(s); s->rows_to_next_1d_row--; } else { encode_1d_row(s); s->row_is_2d = TRUE; } if (s->rows_to_next_1d_row <= 0) { /* Insert a row of 1D encoding */ s->row_is_2d = FALSE; s->rows_to_next_1d_row = s->max_rows_to_next_1d_row - 1; } break; default: case T4_COMPRESSION_ITU_T4_1D: encode_eol(s); encode_1d_row(s); break; } s->row++; return 0; } /*- End of function --------------------------------------------------------*/ int t4_tx_set_row_read_handler(t4_state_t *s, t4_row_read_handler_t handler, void *user_data) { s->row_read_handler = handler; s->row_read_user_data = user_data; return 0; } /*- End of function --------------------------------------------------------*/ t4_state_t *t4_tx_init(t4_state_t *s, const char *file, int start_page, int stop_page) { int run_space; memset(s, 0, sizeof(*s)); span_log_init(&s->logging, SPAN_LOG_NONE, NULL); span_log_set_protocol(&s->logging, "T.4"); s->rx = FALSE; span_log(&s->logging, SPAN_LOG_FLOW, "Start tx document\n"); if (open_tiff_input_file(s, file) < 0) return NULL; s->file = strdup(file); s->start_page = (start_page >= 0) ? start_page : 0; s->stop_page = (stop_page >= 0) ? stop_page : INT_MAX; if (get_tiff_directory_info(s)) { close_tiff_input_file(s); return NULL; } s->rows_to_next_1d_row = s->max_rows_to_next_1d_row - 1; s->pages_transferred = s->start_page; s->pages_in_file = -1; run_space = (s->image_width + 4)*sizeof(uint32_t); if ((s->cur_runs = (uint32_t *) malloc(run_space)) == NULL) return NULL; if ((s->ref_runs = (uint32_t *) malloc(run_space)) == NULL) { free_buffers(s); close_tiff_input_file(s); return NULL; } if ((s->row_buf = malloc(s->bytes_per_row)) == NULL) { free_buffers(s); close_tiff_input_file(s); return NULL; } s->ref_runs[0] = s->ref_runs[1] = s->ref_runs[2] = s->ref_runs[3] = s->image_width; s->ref_steps = 1; s->image_buffer_size = 0; return s; } /*- End of function --------------------------------------------------------*/ static void make_header(t4_state_t *s, char *header) { time_t now; struct tm tm; static const char *months[] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" }; time(&now); tm = *localtime(&now); snprintf(header, 132, " %2d-%s-%d %02d:%02d %-50s %-21s p.%d", tm.tm_mday, months[tm.tm_mon], tm.tm_year + 1900, tm.tm_hour, tm.tm_min, s->header_info, s->local_ident, s->pages_transferred + 1); } /*- End of function --------------------------------------------------------*/ int t4_tx_start_page(t4_state_t *s) { int row; int i; int repeats; int pattern; int row_bufptr; int parm; int run_space; int len; char *t; char header[132 + 1]; uint8_t *bufptr8; uint32_t *bufptr; span_log(&s->logging, SPAN_LOG_FLOW, "Start tx page %d\n", s->pages_transferred); if (s->pages_transferred > s->stop_page) return -1; if (s->tiff_file == NULL) return -1; if (!TIFFSetDirectory(s->tiff_file, (tdir_t) s->pages_transferred)) return -1; s->image_size = 0; s->tx_bitstream = 0; s->tx_bits = 0; s->row_is_2d = (s->line_encoding == T4_COMPRESSION_ITU_T6); s->rows_to_next_1d_row = s->max_rows_to_next_1d_row - 1; /* Allow for pages being of different width */ parm = 0; TIFFGetField(s->tiff_file, TIFFTAG_IMAGEWIDTH, &parm); run_space = (parm + 4)*sizeof(uint32_t); if (parm != s->image_width) { s->image_width = parm; s->bytes_per_row = (s->image_width + 7)/8; if ((bufptr = (uint32_t *) realloc(s->cur_runs, run_space)) == NULL) return -1; s->cur_runs = bufptr; if ((bufptr = (uint32_t *) realloc(s->ref_runs, run_space)) == NULL) return -1; s->ref_runs = bufptr; if ((bufptr8 = realloc(s->row_buf, s->bytes_per_row)) == NULL) return -1; s->row_buf = bufptr8; } s->ref_runs[0] = s->ref_runs[1] = s->ref_runs[2] = s->ref_runs[3] = s->image_width; s->ref_steps = 1; s->row_bits = 0; s->min_row_bits = INT_MAX; s->max_row_bits = 0; if (s->header_info && s->header_info[0]) { /* Modify the resulting image to include a header line, typical of hardware FAX machines */ make_header(s, header); switch (s->y_resolution) { case T4_Y_RESOLUTION_1200: repeats = 12; break; case T4_Y_RESOLUTION_800: repeats = 8; break; case T4_Y_RESOLUTION_600: repeats = 6; break; case T4_Y_RESOLUTION_SUPERFINE: repeats = 4; break; case T4_Y_RESOLUTION_300: repeats = 3; break; case T4_Y_RESOLUTION_FINE: repeats = 2; break; default: repeats = 1; break; } for (row = 0; row < 16; row++) { t = header; row_bufptr = 0; for (t = header; *t && row_bufptr <= s->bytes_per_row - 2; t++) { pattern = header_font[(uint8_t) *t][row]; s->row_buf[row_bufptr++] = (uint8_t) (pattern >> 8); s->row_buf[row_bufptr++] = (uint8_t) (pattern & 0xFF); } for ( ; row_bufptr < s->bytes_per_row; ) s->row_buf[row_bufptr++] = 0; for (i = 0; i < repeats; i++) { if (encode_row(s)) return -1; } } } if (s->row_read_handler) { for (row = 0; ; row++) { if ((len = s->row_read_handler(s->row_read_user_data, s->row_buf, s->bytes_per_row)) < 0) { span_log(&s->logging, SPAN_LOG_WARNING, "%s: Read error at row %d.\n", s->file, row); break; } if (len == 0) break; if (encode_row(s)) return -1; } s->image_length = row; } else { s->image_length = 0; TIFFGetField(s->tiff_file, TIFFTAG_IMAGELENGTH, &s->image_length); for (row = 0; row < s->image_length; row++) { if (TIFFReadScanline(s->tiff_file, s->row_buf, row, 0) <= 0) { span_log(&s->logging, SPAN_LOG_WARNING, "%s: Read error at row %d.\n", s->file, row); break; } if (encode_row(s)) return -1; } } if (s->line_encoding == T4_COMPRESSION_ITU_T6) { /* Attach an EOFB (end of facsimile block) to the end of the page */ encode_eol(s); encode_eol(s); } else { /* Attach a return to control (RTC == 6 x EOLs) to the end of the page */ s->row_is_2d = FALSE; for (i = 0; i < 6; i++) encode_eol(s); } /* Force any partial byte in progress to flush */ put_encoded_bits(s, 0, 7); s->bit_pos = 7; s->bit_ptr = 0; s->line_image_size = s->image_size*8; return 0; } /*- End of function --------------------------------------------------------*/ int t4_tx_more_pages(t4_state_t *s) { span_log(&s->logging, SPAN_LOG_FLOW, "Checking for the existance of page %d\n", s->pages_transferred + 1); if (s->pages_transferred >= s->stop_page) return -1; if (s->tiff_file == NULL) return -1; if (s->pages_in_file >= 0) { if (s->pages_transferred + 1 >= s->pages_in_file) return -1; } else { if (!TIFFSetDirectory(s->tiff_file, (tdir_t) s->pages_transferred + 1)) return -1; } return 0; } /*- End of function --------------------------------------------------------*/ int t4_tx_restart_page(t4_state_t *s) { s->bit_pos = 7; s->bit_ptr = 0; return 0; } /*- End of function --------------------------------------------------------*/ int t4_tx_end_page(t4_state_t *s) { s->pages_transferred++; return 0; } /*- End of function --------------------------------------------------------*/ int t4_tx_get_bit(t4_state_t *s) { int bit; if (s->bit_ptr >= s->image_size) return PUTBIT_END_OF_DATA; bit = (s->image_buffer[s->bit_ptr] >> (7 - s->bit_pos)) & 1; if (--s->bit_pos < 0) { s->bit_pos = 7; s->bit_ptr++; } return bit; } /*- End of function --------------------------------------------------------*/ int t4_tx_get_byte(t4_state_t *s) { if (s->bit_ptr >= s->image_size) return 0x100; return s->image_buffer[s->bit_ptr++]; } /*- End of function --------------------------------------------------------*/ int t4_tx_get_chunk(t4_state_t *s, uint8_t buf[], int max_len) { if (s->bit_ptr >= s->image_size) return 0; if (s->bit_ptr + max_len > s->image_size) max_len = s->image_size - s->bit_ptr; memcpy(buf, &s->image_buffer[s->bit_ptr], max_len); s->bit_ptr += max_len; return max_len; } /*- End of function --------------------------------------------------------*/ int t4_tx_check_bit(t4_state_t *s) { int bit; if (s->bit_ptr >= s->image_size) return PUTBIT_END_OF_DATA; bit = (s->image_buffer[s->bit_ptr] >> s->bit_pos) & 1; return bit; } /*- End of function --------------------------------------------------------*/ int t4_tx_delete(t4_state_t *s) { if (t4_tx_end(s)) return -1; free_buffers(s); free(s); return 0; } /*- End of function --------------------------------------------------------*/ int t4_tx_end(t4_state_t *s) { if (s->rx) return -1; if (s->tiff_file) close_tiff_input_file(s); free_buffers(s); return 0; } /*- End of function --------------------------------------------------------*/ void t4_tx_set_tx_encoding(t4_state_t *s, int encoding) { s->line_encoding = encoding; s->rows_to_next_1d_row = s->max_rows_to_next_1d_row - 1; s->row_is_2d = FALSE; } /*- End of function --------------------------------------------------------*/ void t4_tx_set_min_row_bits(t4_state_t *s, int bits) { s->min_bits_per_row = bits; } /*- End of function --------------------------------------------------------*/ void t4_tx_set_local_ident(t4_state_t *s, const char *ident) { s->local_ident = (ident && ident[0]) ? ident : NULL; } /*- End of function --------------------------------------------------------*/ void t4_tx_set_header_info(t4_state_t *s, const char *info) { s->header_info = (info && info[0]) ? info : NULL; } /*- End of function --------------------------------------------------------*/ int t4_tx_get_y_resolution(t4_state_t *s) { return s->y_resolution; } /*- End of function --------------------------------------------------------*/ int t4_tx_get_x_resolution(t4_state_t *s) { return s->x_resolution; } /*- End of function --------------------------------------------------------*/ int t4_tx_get_image_width(t4_state_t *s) { return s->image_width; } /*- End of function --------------------------------------------------------*/ int t4_tx_get_pages_in_file(t4_state_t *s) { int max; /* Each page *should* contain the total number of pages, but can this be trusted? Some files say 0. Actually searching for the last page is more reliable. */ max = 0; while (TIFFSetDirectory(s->tiff_file, (tdir_t) max)) max++; s->pages_in_file = max; /* Back to the previous page */ if (!TIFFSetDirectory(s->tiff_file, (tdir_t) s->pages_transferred)) return -1; return max; } /*- End of function --------------------------------------------------------*/ void t4_get_transfer_statistics(t4_state_t *s, t4_stats_t *t) { t->pages_transferred = s->pages_transferred - s->start_page; t->pages_in_file = s->pages_in_file; t->width = s->image_width; t->length = s->image_length; t->bad_rows = s->bad_rows; t->longest_bad_row_run = s->longest_bad_row_run; t->x_resolution = s->x_resolution; t->y_resolution = s->y_resolution; t->encoding = s->line_encoding; t->line_image_size = s->line_image_size/8; } /*- End of function --------------------------------------------------------*/ const char *t4_encoding_to_str(int encoding) { switch (encoding) { case T4_COMPRESSION_ITU_T4_1D: return "T.4 1-D"; case T4_COMPRESSION_ITU_T4_2D: return "T.4 2-D"; case T4_COMPRESSION_ITU_T6: return "T.6"; } return "???"; } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/libspandsp.dsp0000644000175000017500000003302611150047216020530 0ustar julienjulien# Microsoft Developer Studio Project File - Name="spandsp" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 CFG=spandsp - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "spandsp.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "spandsp.mak" CFG="spandsp - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "spandsp - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") !MESSAGE "spandsp - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe MTL=midl.exe RSC=rc.exe !IF "$(CFG)" == "spandsp - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D HAVE_TGMATH_H /YX /FD /c # ADD CPP /nologo /MT /W3 /GX /Zi /O2 /I "." /I "..\include" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D HAVE_TGMATH_H /D "_WINDLL" /FR /FD /c # SUBTRACT CPP /YX # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 # ADD LINK32 kernel32.lib ws2_32.lib winmm.lib /nologo /dll /map /debug /machine:I386 /out:"Release/libspandsp.dll" !ELSEIF "$(CFG)" == "spandsp - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D HAVE_TGMATH_H /YX /FD /GZ /c # ADD CPP /nologo /MTd /W3 /Gm /GX /Zi /Od /I "." /I "..\include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D HAVE_TGMATH_H /FR /FD /GZ /c # SUBTRACT CPP /WX /YX # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept # ADD LINK32 kernel32.lib ws2_32.lib winmm.lib /nologo /dll /incremental:no /map /debug /machine:I386 /out:"Debug/libspandsp.dll" /pdbtype:sept # SUBTRACT LINK32 /nodefaultlib !ENDIF # Begin Target # Name "spandsp - Win32 Release" # Name "spandsp - Win32 Debug" # Begin Group "Source Files" # Begin Source File SOURCE=.\adsi.c # End Source File # Begin Source File SOURCE=.\async.c # End Source File # Begin Source File SOURCE=.\at_interpreter.c # End Source File # Begin Source File SOURCE=.\awgn.c # End Source File # Begin Source File SOURCE=.\bell_r2_mf.c # End Source File # Begin Source File SOURCE=.\bert.c # End Source File # Begin Source File SOURCE=.\bit_operations.c # End Source File # Begin Source File SOURCE=.\bitstream.c # End Source File # Begin Source File SOURCE=.\complex_filters.c # End Source File # Begin Source File SOURCE=.\complex_vector_float.c # End Source File # Begin Source File SOURCE=.\crc.c # End Source File # Begin Source File SOURCE=.\dds_float.c # End Source File # Begin Source File SOURCE=.\dds_int.c # End Source File # Begin Source File SOURCE=.\dtmf.c # End Source File # Begin Source File SOURCE=.\echo.c # End Source File # Begin Source File SOURCE=.\fax.c # End Source File # Begin Source File SOURCE=.\fsk.c # End Source File # Begin Source File SOURCE=.\g711.c # End Source File # Begin Source File SOURCE=.\g722_encode.c # End Source File # Begin Source File SOURCE=.\g722_decode.c # End Source File # Begin Source File SOURCE=.\g726.c # End Source File # Begin Source File SOURCE=.\gsm0610_decode.c # End Source File # Begin Source File SOURCE=.\gsm0610_encode.c # End Source File # Begin Source File SOURCE=.\gsm0610_long_term.c # End Source File # Begin Source File SOURCE=.\gsm0610_lpc.c # End Source File # Begin Source File SOURCE=.\gsm0610_preprocess.c # End Source File # Begin Source File SOURCE=.\gsm0610_rpe.c # End Source File # Begin Source File SOURCE=.\gsm0610_short_term.c # End Source File # Begin Source File SOURCE=.\hdlc.c # End Source File # Begin Source File SOURCE=.\ima_adpcm.c # End Source File # Begin Source File SOURCE=.\logging.c # End Source File # Begin Source File SOURCE=.\lpc10_analyse.c # End Source File # Begin Source File SOURCE=.\lpc10_decode.c # End Source File # Begin Source File SOURCE=.\lpc10_encode.c # End Source File # Begin Source File SOURCE=.\lpc10_placev.c # End Source File # Begin Source File SOURCE=.\lpc10_voicing.c # End Source File # Begin Source File SOURCE=.\modem_echo.c # End Source File # Begin Source File SOURCE=.\modem_connect_tones.c # End Source File # Begin Source File SOURCE=.\noise.c # End Source File # Begin Source File SOURCE=.\oki_adpcm.c # End Source File # Begin Source File SOURCE=.\playout.c # End Source File # Begin Source File SOURCE=.\plc.c # End Source File # Begin Source File SOURCE=.\power_meter.c # End Source File # Begin Source File SOURCE=.\queue.c # End Source File # Begin Source File SOURCE=.\schedule.c # End Source File # Begin Source File SOURCE=.\sig_tone.c # End Source File # Begin Source File SOURCE=.\silence_gen.c # End Source File # Begin Source File SOURCE=.\super_tone_rx.c # End Source File # Begin Source File SOURCE=.\super_tone_tx.c # End Source File # Begin Source File SOURCE=.\t4.c # End Source File # Begin Source File SOURCE=.\t30.c # End Source File # Begin Source File SOURCE=.\t30_api.c # End Source File # Begin Source File SOURCE=.\t30_logging.c # End Source File # Begin Source File SOURCE=.\t31.c # End Source File # Begin Source File SOURCE=.\t35.c # End Source File # Begin Source File SOURCE=.\t38_core.c # End Source File # Begin Source File SOURCE=.\t38_gateway.c # End Source File # Begin Source File SOURCE=.\t38_terminal.c # End Source File # Begin Source File SOURCE=.\testcpuid.c # End Source File # Begin Source File SOURCE=.\time_scale.c # End Source File # Begin Source File SOURCE=.\tone_detect.c # End Source File # Begin Source File SOURCE=.\tone_generate.c # End Source File # Begin Source File SOURCE=.\v17rx.c # End Source File # Begin Source File SOURCE=.\v17tx.c # End Source File # Begin Source File SOURCE=.\v22bis_rx.c # End Source File # Begin Source File SOURCE=.\v22bis_tx.c # End Source File # Begin Source File SOURCE=.\v27ter_rx.c # End Source File # Begin Source File SOURCE=.\v27ter_tx.c # End Source File # Begin Source File SOURCE=.\v29rx.c # End Source File # Begin Source File SOURCE=.\v29tx.c # End Source File # Begin Source File SOURCE=.\v42.c # End Source File # Begin Source File SOURCE=.\v42bis.c # End Source File # Begin Source File SOURCE=.\v8.c # End Source File # Begin Source File SOURCE=.\vector_float.c # End Source File # Begin Source File SOURCE=.\vector_int.c # End Source File # Begin Source File SOURCE=.\msvc/gettimeofday.c # End Source File # End Group # Begin Group "Header Files" # Begin Source File SOURCE=.\spandsp/adsi.h # End Source File # Begin Source File SOURCE=.\spandsp/async.h # End Source File # Begin Source File SOURCE=.\spandsp/arctan2.h # End Source File # Begin Source File SOURCE=.\spandsp/at_interpreter.h # End Source File # Begin Source File SOURCE=.\spandsp/awgn.h # End Source File # Begin Source File SOURCE=.\spandsp/bell_r2_mf.h # End Source File # Begin Source File SOURCE=.\spandsp/bert.h # End Source File # Begin Source File SOURCE=.\spandsp/biquad.h # End Source File # Begin Source File SOURCE=.\spandsp/bit_operations.h # End Source File # Begin Source File SOURCE=.\spandsp/bitstream.h # End Source File # Begin Source File SOURCE=.\spandsp/crc.h # End Source File # Begin Source File SOURCE=.\spandsp/complex.h # End Source File # Begin Source File SOURCE=.\spandsp/complex_filters.h # End Source File # Begin Source File SOURCE=.\spandsp/complex_vector_float.h # End Source File # Begin Source File SOURCE=.\spandsp/dc_restore.h # End Source File # Begin Source File SOURCE=.\spandsp/dds.h # End Source File # Begin Source File SOURCE=.\spandsp/dtmf.h # End Source File # Begin Source File SOURCE=.\spandsp/echo.h # End Source File # Begin Source File SOURCE=.\spandsp/fax.h # End Source File # Begin Source File SOURCE=.\spandsp/fax_modems.h # End Source File # Begin Source File SOURCE=.\spandsp/fir.h # End Source File # Begin Source File SOURCE=.\spandsp/fsk.h # End Source File # Begin Source File SOURCE=.\spandsp/g168models.h # End Source File # Begin Source File SOURCE=.\spandsp/g711.h # End Source File # Begin Source File SOURCE=.\spandsp/g722.h # End Source File # Begin Source File SOURCE=.\spandsp/g726.h # End Source File # Begin Source File SOURCE=.\spandsp/gsm0610.h # End Source File # Begin Source File SOURCE=.\spandsp/hdlc.h # End Source File # Begin Source File SOURCE=.\spandsp/ima_adpcm.h # End Source File # Begin Source File SOURCE=.\spandsp/logging.h # End Source File # Begin Source File SOURCE=.\spandsp/lpc10.h # End Source File # Begin Source File SOURCE=.\spandsp/modem_echo.h # End Source File # Begin Source File SOURCE=.\spandsp/modem_connect_tones.h # End Source File # Begin Source File SOURCE=.\spandsp/noise.h # End Source File # Begin Source File SOURCE=.\spandsp/oki_adpcm.h # End Source File # Begin Source File SOURCE=.\spandsp/playout.h # End Source File # Begin Source File SOURCE=.\spandsp/plc.h # End Source File # Begin Source File SOURCE=.\spandsp/power_meter.h # End Source File # Begin Source File SOURCE=.\spandsp/queue.h # End Source File # Begin Source File SOURCE=.\spandsp/schedule.h # End Source File # Begin Source File SOURCE=.\spandsp/sig_tone.h # End Source File # Begin Source File SOURCE=.\spandsp/silence_gen.h # End Source File # Begin Source File SOURCE=.\spandsp/super_tone_rx.h # End Source File # Begin Source File SOURCE=.\spandsp/super_tone_tx.h # End Source File # Begin Source File SOURCE=.\spandsp/t4.h # End Source File # Begin Source File SOURCE=.\spandsp/t30.h # End Source File # Begin Source File SOURCE=.\spandsp/t30_api.h # End Source File # Begin Source File SOURCE=.\spandsp/t30_fcf.h # End Source File # Begin Source File SOURCE=.\spandsp/t30_logging.h # End Source File # Begin Source File SOURCE=.\spandsp/t31.h # End Source File # Begin Source File SOURCE=.\spandsp/t35.h # End Source File # Begin Source File SOURCE=.\spandsp/t38_core.h # End Source File # Begin Source File SOURCE=.\spandsp/t38_gateway.h # End Source File # Begin Source File SOURCE=.\spandsp/t38_terminal.h # End Source File # Begin Source File SOURCE=.\spandsp/telephony.h # End Source File # Begin Source File SOURCE=.\spandsp/time_scale.h # End Source File # Begin Source File SOURCE=.\spandsp/timing.h # End Source File # Begin Source File SOURCE=.\spandsp/tone_detect.h # End Source File # Begin Source File SOURCE=.\spandsp/tone_generate.h # End Source File # Begin Source File SOURCE=.\spandsp/v17rx.h # End Source File # Begin Source File SOURCE=.\spandsp/v17tx.h # End Source File # Begin Source File SOURCE=.\spandsp/v22bis.h # End Source File # Begin Source File SOURCE=.\spandsp/v27ter_rx.h # End Source File # Begin Source File SOURCE=.\spandsp/v27ter_tx.h # End Source File # Begin Source File SOURCE=.\spandsp/v29rx.h # End Source File # Begin Source File SOURCE=.\spandsp/v29tx.h # End Source File # Begin Source File SOURCE=.\spandsp/v42.h # End Source File # Begin Source File SOURCE=.\spandsp/v42bis.h # End Source File # Begin Source File SOURCE=.\spandsp/v8.h # End Source File # Begin Source File SOURCE=.\spandsp/vector_float.h # End Source File # Begin Source File SOURCE=.\spandsp/vector_int.h # End Source File # Begin Source File SOURCE=.\spandsp/version.h # End Source File # Begin Source File SOURCE=.\spandsp.h # End Source File # End Group # Begin Group "Resource Files" # PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" # End Group # End Target # End Project iaxmodem-1.2.0/lib/spandsp/src/echo.c0000644000175000017500000004765511150047216016760 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * echo.c - An echo cancellor, suitable for electrical and acoustic * cancellation. This code does not currently comply with * any relevant standards (e.g. G.164/5/7/8). One day.... * * Written by Steve Underwood * * Copyright (C) 2001, 2003 Steve Underwood * * Based on a bit from here, a bit from there, eye of toad, * ear of bat, etc - plus, of course, my own 2 cents. * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: echo.c,v 1.24 2008/05/13 13:17:22 steveu Exp $ */ /*! \file */ /* TODO: Finish the echo suppressor option, however nasty suppression may be. Add an option to reintroduce side tone at -24dB under appropriate conditions. Improve double talk detector (iterative!) */ /* We need to differentiate between transmitted energy which will train the echo canceller well (voice, white noise, and other broadband sources) and energy which will train it badly (supervisory tones, DTMF, whistles, and other narrowband sources). There are many ways this might be done. This canceller uses a method based on the autocorrelation qualities of the transmitted signal. A rather peaky autocorrelation function is a clear sign of a narrowband signal. We only need perform the autocorrelation at well spaced intervals, so the compute load is not too great. Multiple successive autocorrelation functions with a similar peaky shape are a clear indication of a stationary narrowband signal. Using TKEO, it should be possible to greatly reduce the compute requirement for narrowband detection. */ /* The FIR taps must be adapted as 32 bit values, to get the necessary finesse in the adaption process. However, they are applied as 16 bit values (bits 30-15 of the 32 bit values) in the FIR. For the working 16 bit values, we need 4 sets. 3 of the 16 bit sets are used on a rotating basis. Normally the canceller steps round these 3 sets at regular intervals. Any time we detect double talk, we can go back to the set from two steps ago with reasonable assurance it is a well adapted set. We cannot just go back one step, as we may have rotated the sets just before double talk or tone was detected, and that set may already be somewhat corrupted. When narrowband energy is detected we need to continue adapting to it, to echo cancel it. However, the adaption will almost certainly be going astray. Broadband (or even complex sequences of narrowband) energy will normally lead to a well trained cancellor, with taps matching the impulse response of the channel. For stationary narrowband energy, there is usually has an infinite number of alternative tap sets which will cancel it well. A previously well trained set of taps will tend to drift amongst the alternatives. When broadband energy resumes, the taps may be a total mismatch for the signal, and could even amplify rather than attenuate the echo. The solution is to use a fourth set of 16 bit taps. When we first detect the narrowband energy we save the oldest of the group of three sets, but do not change back to an older set. We let the canceller cancel, and it adaption drift while the narrowband energy is present. When we detect the narrowband energy has ceased, we switch to using the fourth set of taps which was saved. When we revert to an older set of taps, we must replace both the 16 bit and 32 bit working tap sets. The saved 16 bit values are good enough to also be used as a replacement for the 32 bit values. We loose the fractions, but they should soon settle down in a reasonable way. */ #if defined(HAVE_CONFIG_H) #include #endif #include #include #include #include #include "spandsp/telephony.h" #include "spandsp/logging.h" #include "spandsp/bit_operations.h" #include "spandsp/echo.h" #if !defined(NULL) #define NULL (void *) 0 #endif #if !defined(FALSE) #define FALSE 0 #endif #if !defined(TRUE) #define TRUE (!FALSE) #endif #define MIN_TX_POWER_FOR_ADAPTION 64*64 #define MIN_RX_POWER_FOR_ADAPTION 64*64 static int narrowband_detect(echo_can_state_t *ec) { int k; int i; float temp; float scale; float sf[128]; float f_acf[128]; int32_t acf[28]; int score; int len = 32; int alen = 9; k = ec->curr_pos; for (i = 0; i < len; i++) { sf[i] = ec->fir_state.history[k++]; if (k >= 256) k = 0; } for (k = 0; k < alen; k++) { temp = 0; for (i = k; i < len; i++) temp += sf[i]*sf[i - k]; f_acf[k] = temp; } scale = 0x1FFFFFFF/f_acf[0]; for (k = 0; k < alen; k++) acf[k] = (int32_t) (f_acf[k]*scale); score = 0; for (i = 0; i < 9; i++) { if (ec->last_acf[i] >= 0 && acf[i] >= 0) { if ((ec->last_acf[i] >> 1) < acf[i] && acf[i] < (ec->last_acf[i] << 1)) score++; } else if (ec->last_acf[i] < 0 && acf[i] < 0) { if ((ec->last_acf[i] >> 1) > acf[i] && acf[i] > (ec->last_acf[i] << 1)) score++; } } memcpy(ec->last_acf, acf, alen*sizeof(ec->last_acf[0])); return score; } static __inline__ void lms_adapt(echo_can_state_t *ec, int factor) { int i; #if 0 mmx_t *mmx_taps; mmx_t *mmx_coeffs; mmx_t *mmx_hist; mmx_t mmx; mmx.w[0] = mmx.w[1] = mmx.w[2] = mmx.w[3] = factor; mmx_hist = (mmx_t *) &fir->history[fir->curr_pos]; mmx_taps = (mmx_t *) &fir->taps; mmx_coeffs = (mmx_t *) fir->coeffs; i = fir->taps; movq_m2r(mmx, mm0); while (i > 0) { movq_m2r(mmx_hist[0], mm1); movq_m2r(mmx_taps[0], mm0); movq_m2r(mmx_taps[1], mm1); movq_r2r(mm1, mm2); pmulhw(mm0, mm1); pmullw(mm0, mm2); pmaddwd_r2r(mm1, mm0); pmaddwd_r2r(mm3, mm2); paddd_r2r(mm0, mm4); paddd_r2r(mm2, mm4); movq_r2m(mm0, mmx_taps[0]); movq_r2m(mm1, mmx_taps[0]); movq_r2m(mm2, mmx_coeffs[0]); mmx_taps += 2; mmx_coeffs += 1; mmx_hist += 1; i -= 4; ) emms(); #elif 0 /* Update the FIR taps */ for (i = ec->taps - 1; i >= 0; i--) { /* Leak to avoid the coefficients drifting beyond the ability of the adaption process to bring them back under control. */ ec->fir_taps32[i] -= (ec->fir_taps32[i] >> 23); ec->fir_taps32[i] += (ec->fir_state.history[i + ec->curr_pos]*factor); ec->latest_correction = (ec->fir_state.history[i + ec->curr_pos]*factor); ec->fir_taps16[ec->tap_set][i] = ec->fir_taps32[i] >> 15; } #else int offset1; int offset2; /* Update the FIR taps */ offset2 = ec->curr_pos; offset1 = ec->taps - offset2; for (i = ec->taps - 1; i >= offset1; i--) { ec->fir_taps32[i] += (ec->fir_state.history[i - offset1]*factor); ec->fir_taps16[ec->tap_set][i] = (int16_t) (ec->fir_taps32[i] >> 15); } for ( ; i >= 0; i--) { ec->fir_taps32[i] += (ec->fir_state.history[i + offset2]*factor); ec->fir_taps16[ec->tap_set][i] = (int16_t) (ec->fir_taps32[i] >> 15); } #endif } /*- End of function --------------------------------------------------------*/ echo_can_state_t *echo_can_create(int len, int adaption_mode) { echo_can_state_t *ec; int i; int j; if ((ec = (echo_can_state_t *) malloc(sizeof(*ec))) == NULL) return NULL; memset(ec, 0, sizeof(*ec)); ec->taps = len; ec->curr_pos = ec->taps - 1; ec->tap_mask = ec->taps - 1; if ((ec->fir_taps32 = (int32_t *) malloc(ec->taps*sizeof(int32_t))) == NULL) { free(ec); return NULL; } memset(ec->fir_taps32, 0, ec->taps*sizeof(int32_t)); for (i = 0; i < 4; i++) { if ((ec->fir_taps16[i] = (int16_t *) malloc(ec->taps*sizeof(int16_t))) == NULL) { for (j = 0; j < i; j++) free(ec->fir_taps16[j]); free(ec->fir_taps32); free(ec); return NULL; } memset(ec->fir_taps16[i], 0, ec->taps*sizeof(int16_t)); } fir16_create(&ec->fir_state, ec->fir_taps16[0], ec->taps); ec->rx_power_threshold = 10000000; ec->geigel_max = 0; ec->geigel_lag = 0; ec->dtd_onset = FALSE; ec->tap_set = 0; ec->tap_rotate_counter = 1600; ec->cng_level = 1000; echo_can_adaption_mode(ec, adaption_mode); return ec; } /*- End of function --------------------------------------------------------*/ void echo_can_free(echo_can_state_t *ec) { int i; fir16_free(&ec->fir_state); free(ec->fir_taps32); for (i = 0; i < 4; i++) free(ec->fir_taps16[i]); free(ec); } /*- End of function --------------------------------------------------------*/ void echo_can_adaption_mode(echo_can_state_t *ec, int adaption_mode) { ec->adaption_mode = adaption_mode; } /*- End of function --------------------------------------------------------*/ void echo_can_flush(echo_can_state_t *ec) { int i; for (i = 0; i < 4; i++) ec->tx_power[i] = 0; for (i = 0; i < 3; i++) ec->rx_power[i] = 0; ec->clean_rx_power = 0; ec->nonupdate_dwell = 0; fir16_flush(&ec->fir_state); ec->fir_state.curr_pos = ec->taps - 1; memset(ec->fir_taps32, 0, ec->taps*sizeof(int32_t)); for (i = 0; i < 4; i++) memset(ec->fir_taps16[i], 0, ec->taps*sizeof(int16_t)); ec->curr_pos = ec->taps - 1; ec->supp_test1 = 0; ec->supp_test2 = 0; ec->supp1 = 0; ec->supp2 = 0; ec->vad = 0; ec->cng_level = 1000; ec->cng_filter = 0; ec->geigel_max = 0; ec->geigel_lag = 0; ec->dtd_onset = FALSE; ec->tap_set = 0; ec->tap_rotate_counter = 1600; ec->latest_correction = 0; memset(ec->last_acf, 0, sizeof(ec->last_acf)); ec->narrowband_count = 0; ec->narrowband_score = 0; } /*- End of function --------------------------------------------------------*/ int sample_no = 0; int16_t echo_can_update(echo_can_state_t *ec, int16_t tx, int16_t rx) { int32_t echo_value; int clean_rx; int nsuppr; int score; int i; sample_no++; ec->latest_correction = 0; /* Evaluate the echo - i.e. apply the FIR filter */ /* Assume the gain of the FIR does not exceed unity. Exceeding unity would seem like a rather poor thing for an echo cancellor to do :) This means we can compute the result with a total disregard for overflows. 16bits x 16bits -> 31bits, so no overflow can occur in any multiply. While accumulating we may overflow and underflow the 32 bit scale often. However, if the gain does not exceed unity, everything should work itself out, and the final result will be OK, without any saturation logic. */ /* Overflow is very much possible here, and we do nothing about it because of the compute costs */ /* 16 bit coeffs for the LMS give lousy results (maths good, actual sound bad!), but 32 bit coeffs require some shifting. On balance 32 bit seems best */ echo_value = fir16(&ec->fir_state, tx); /* And the answer is..... */ clean_rx = rx - echo_value; printf("echo is %" PRId32 "\n", echo_value); /* That was the easy part. Now we need to adapt! */ if (ec->nonupdate_dwell > 0) ec->nonupdate_dwell--; /* Calculate short term power levels using very simple single pole IIRs */ /* TODO: Is the nasty modulus approach the fastest, or would a real tx*tx power calculation actually be faster? Using the squares makes the numbers grow a lot! */ ec->tx_power[3] += ((abs(tx) - ec->tx_power[3]) >> 5); ec->tx_power[2] += ((tx*tx - ec->tx_power[2]) >> 8); ec->tx_power[1] += ((tx*tx - ec->tx_power[1]) >> 5); ec->tx_power[0] += ((tx*tx - ec->tx_power[0]) >> 3); ec->rx_power[1] += ((rx*rx - ec->rx_power[1]) >> 6); ec->rx_power[0] += ((rx*rx - ec->rx_power[0]) >> 3); ec->clean_rx_power += ((clean_rx*clean_rx - ec->clean_rx_power) >> 6); score = 0; /* If there is very little being transmitted, any attempt to train is futile. We would either be training on the far end's noise or signal, the channel's own noise, or our noise. Either way, this is hardly good training, so don't do it (avoid trouble). */ if (ec->tx_power[0] > MIN_TX_POWER_FOR_ADAPTION) { /* If the received power is very low, either we are sending very little or we are already well adapted. There is little point in trying to improve the adaption under these circumstances, so don't do it (reduce the compute load). */ if (ec->tx_power[1] > ec->rx_power[0]) { /* There is no (or little) far-end speech. */ if (ec->nonupdate_dwell == 0) { if (++ec->narrowband_count >= 160) { ec->narrowband_count = 0; score = narrowband_detect(ec); printf("Do the narrowband test %d at %d\n", score, ec->curr_pos); if (score > 6) { if (ec->narrowband_score == 0) memcpy(ec->fir_taps16[3], ec->fir_taps16[(ec->tap_set + 1)%3], ec->taps*sizeof(int16_t)); ec->narrowband_score += score; } else { if (ec->narrowband_score > 200) { printf("Revert to %d at %d\n", (ec->tap_set + 1)%3, sample_no); memcpy(ec->fir_taps16[ec->tap_set], ec->fir_taps16[3], ec->taps*sizeof(int16_t)); memcpy(ec->fir_taps16[(ec->tap_set - 1)%3], ec->fir_taps16[3], ec->taps*sizeof(int16_t)); for (i = 0; i < ec->taps; i++) ec->fir_taps32[i] = ec->fir_taps16[3][i] << 15; ec->tap_rotate_counter = 1600; } ec->narrowband_score = 0; } } ec->dtd_onset = FALSE; if (--ec->tap_rotate_counter <= 0) { printf("Rotate to %d at %d\n", ec->tap_set, sample_no); ec->tap_rotate_counter = 1600; ec->tap_set++; if (ec->tap_set > 2) ec->tap_set = 0; ec->fir_state.coeffs = ec->fir_taps16[ec->tap_set]; } /* ... and we are not in the dwell time from previous speech. */ if ((ec->adaption_mode & ECHO_CAN_USE_ADAPTION) && ec->narrowband_score == 0) { //nsuppr = saturate((clean_rx << 16)/ec->tx_power[1]); //nsuppr = clean_rx/ec->tx_power[1]; /* If a sudden surge in signal level (e.g. the onset of a tone burst) cause an abnormally high instantaneous to average signal power ratio, we could kick the adaption badly in the wrong direction. This is because the tx_power takes too long to react and rise. We need to stop too rapid adaption to the new signal. We normalise to a value derived from the instantaneous signal if it exceeds the peak by too much. */ nsuppr = clean_rx; /* Divide isn't very quick, but the "where is the top bit" and shift instructions are single cycle. */ if (tx > 4*ec->tx_power[3]) i = top_bit(tx) - 8; else i = top_bit(ec->tx_power[3]) - 8; if (i > 0) nsuppr >>= i; lms_adapt(ec, nsuppr); } } //printf("%10d %10d %10d %10d %10d\n", rx, clean_rx, nsuppr, ec->tx_power[1], ec->rx_power[1]); //printf("%.4f\n", (float) ec->rx_power[1]/(float) ec->clean_rx_power); } else { if (!ec->dtd_onset) { printf("Revert to %d at %d\n", (ec->tap_set + 1)%3, sample_no); memcpy(ec->fir_taps16[ec->tap_set], ec->fir_taps16[(ec->tap_set + 1)%3], ec->taps*sizeof(int16_t)); memcpy(ec->fir_taps16[(ec->tap_set - 1)%3], ec->fir_taps16[(ec->tap_set + 1)%3], ec->taps*sizeof(int16_t)); for (i = 0; i < ec->taps; i++) ec->fir_taps32[i] = ec->fir_taps16[(ec->tap_set + 1)%3][i] << 15; ec->tap_rotate_counter = 1600; ec->dtd_onset = TRUE; } ec->nonupdate_dwell = NONUPDATE_DWELL_TIME; } } if (ec->rx_power[1]) ec->vad = (8000*ec->clean_rx_power)/ec->rx_power[1]; else ec->vad = 0; if (ec->rx_power[1] > 2048*2048 && ec->clean_rx_power > 4*ec->rx_power[1]) { /* The EC seems to be making things worse, instead of better. Zap it! */ memset(ec->fir_taps32, 0, ec->taps*sizeof(int32_t)); for (i = 0; i < 4; i++) memset(ec->fir_taps16[i], 0, ec->taps*sizeof(int16_t)); } #if defined(XYZZY) if ((ec->adaption_mode & ECHO_CAN_USE_SUPPRESSOR)) { ec->supp_test1 += (ec->fir_state.history[ec->curr_pos] - ec->fir_state.history[(ec->curr_pos - 7) & ec->tap_mask]); ec->supp_test2 += (ec->fir_state.history[(ec->curr_pos - 24) & ec->tap_mask] - ec->fir_state.history[(ec->curr_pos - 31) & ec->tap_mask]); if (ec->supp_test1 > 42 && ec->supp_test2 > 42) supp_change = 25; else supp_change = 50; supp = supp_change + k1*ec->supp1 + k2*ec->supp2; ec->supp2 = ec->supp1; ec->supp1 = supp; clean_rx *= (1 - supp); } #endif if ((ec->adaption_mode & ECHO_CAN_USE_NLP)) { /* Non-linear processor - a fancy way to say "zap small signals, to avoid residual echo due to (uLaw/ALaw) non-linearity in the channel.". */ if (ec->rx_power[1] < 30000000) { if (!ec->cng) { ec->cng_level = ec->clean_rx_power; ec->cng = TRUE; } if ((ec->adaption_mode & ECHO_CAN_USE_CNG)) { /* Very elementary comfort noise generation */ /* Just random numbers rolled off very vaguely Hoth-like */ ec->cng_rndnum = 1664525U*ec->cng_rndnum + 1013904223U; ec->cng_filter = ((ec->cng_rndnum & 0xFFFF) - 32768 + 5*ec->cng_filter) >> 3; clean_rx = (ec->cng_filter*ec->cng_level) >> 17; /* TODO: A better CNG, with more accurate (tracking) spectral shaping! */ } else { clean_rx = 0; } //clean_rx = -16000; } else { ec->cng = FALSE; } } else { ec->cng = FALSE; } printf("Narrowband score %4d %5d at %d\n", ec->narrowband_score, score, sample_no); /* Roll around the rolling buffer */ if (ec->curr_pos <= 0) ec->curr_pos = ec->taps; ec->curr_pos--; return (int16_t) clean_rx; } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/lpc10_encdecs.h0000644000175000017500000000606711150047216020442 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * lpc10_encdecs.h - LPC10 low bit rate speech codec. * * Written by Steve Underwood * * Copyright (C) 2006 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: lpc10_encdecs.h,v 1.11 2008/04/17 14:26:56 steveu Exp $ */ #define LPC10_ORDER 10 #if !defined(min) #define min(a,b) ((a) <= (b) ? (a) : (b)) #endif #if !defined(max) #define max(a,b) ((a) >= (b) ? (a) : (b)) #endif void lpc10_placea(int32_t *ipitch, int32_t voibuf[4][2], int32_t *obound, int32_t af, int32_t vwin[3][2], int32_t awin[3][2], int32_t ewin[3][2], int32_t lframe, int32_t maxwin); void lpc10_placev(int32_t *osbuf, int32_t *osptr, int32_t oslen, int32_t *obound, int32_t vwin[3][2], int32_t af, int32_t lframe, int32_t minwin, int32_t maxwin, int32_t dvwinl, int32_t dvwinh); void lpc10_voicing(lpc10_encode_state_t *st, int32_t *vwin, float *inbuf, float *lpbuf, const int32_t buflim[], int32_t half, float *minamd, float *maxamd, int32_t *mintau, float *ivrc, int32_t *obound); void lpc10_analyse(lpc10_encode_state_t *st, float *speech, int32_t *voice, int32_t *pitch, float *rms, float rc[]); static __inline__ int32_t pow_ii(int32_t x, int32_t n) { int32_t pow; uint32_t u; if (n <= 0) { if (n == 0 || x == 1) return 1; if (x != -1) return (x == 0) ? 1/x : 0; n = -n; } u = n; for (pow = 1; ; ) { if ((u & 1)) pow *= x; if ((u >>= 1) == 0) break; x *= x; } return pow; } /*- End of function --------------------------------------------------------*/ static __inline__ float r_sign(float a, float b) { float x; x = fabsf(a); return (b >= 0.0f) ? x : -x; } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/vector_int.c0000644000175000017500000002460011150047216020177 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * vector_int.c - Integer vector arithmetic * * Written by Steve Underwood * * Copyright (C) 2006 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: vector_int.c,v 1.11 2008/07/02 14:48:26 steveu Exp $ */ /*! \file */ #if defined(HAVE_CONFIG_H) #include #endif #include #include #include #include #include "floating_fudge.h" #if defined(HAVE_TGMATH_H) #include #endif #if defined(HAVE_MATH_H) #include #endif #include #include "spandsp/telephony.h" #include "spandsp/vector_int.h" int32_t vec_dot_prodi16(const int16_t x[], const int16_t y[], int n) { int32_t z; #if defined(__GNUC__) && defined(__i386__) __asm__ __volatile__( " emms;\n" " pxor %%mm0,%%mm0;\n" " leal -32(%%esi,%%eax,2),%%edx;\n" /* edx = top - 32 */ " cmpl %%edx,%%esi;\n" " ja 1f;\n" /* Work in blocks of 16 int16_t's until we are near the end */ " .p2align 2;\n" "2:\n" " movq (%%edi),%%mm1;\n" " movq (%%esi),%%mm2;\n" " pmaddwd %%mm2,%%mm1;\n" " paddd %%mm1,%%mm0;\n" " movq 8(%%edi),%%mm1;\n" " movq 8(%%esi),%%mm2;\n" " pmaddwd %%mm2,%%mm1;\n" " paddd %%mm1,%%mm0;\n" " movq 16(%%edi),%%mm1;\n" " movq 16(%%esi),%%mm2;\n" " pmaddwd %%mm2,%%mm1;\n" " paddd %%mm1,%%mm0;\n" " movq 24(%%edi),%%mm1;\n" " movq 24(%%esi),%%mm2;\n" " pmaddwd %%mm2,%%mm1;\n" " paddd %%mm1,%%mm0;\n" " addl $32,%%esi;\n" " addl $32,%%edi;\n" " cmpl %%edx,%%esi;\n" " jbe 2b;\n" " .p2align 2;\n" "1:\n" " addl $24,%%edx;\n" /* now edx = top - 8 */ " cmpl %%edx,%%esi;\n" " ja 3f;\n" /* Work in blocks of 4 int16_t's until we are near the end */ " .p2align 2;\n" "4:\n" " movq (%%edi),%%mm1;\n" " movq (%%esi),%%mm2;\n" " pmaddwd %%mm2,%%mm1;\n" " paddd %%mm1,%%mm0;\n" " addl $8,%%esi;\n" " addl $8,%%edi;\n" " cmpl %%edx,%%esi;" " jbe 4b;\n" " .p2align 2;\n" "3:\n" " addl $4,%%edx;\n" /* now edx = top - 4 */ " cmpl %%edx,%%esi;\n" " ja 5f;\n" /* Work in a block of 2 int16_t's */ " movd (%%edi),%%mm1;\n" " movd (%%esi),%%mm2;\n" " pmaddwd %%mm2,%%mm1;\n" " paddd %%mm1,%%mm0;\n" " addl $4,%%esi;\n" " addl $4,%%edi;\n" " .p2align 2;\n" "5:\n" " addl $2,%%edx;\n" /* now edx = top - 2 */ " cmpl %%edx,%%esi;\n" " ja 6f;\n" /* Deal with the very last int16_t, when n is odd */ " movswl (%%edi),%%eax;\n" " andl $65535,%%eax;\n" " movd %%eax,%%mm1;\n" " movswl (%%esi),%%eax;\n" " andl $65535,%%eax;\n" " movd %%eax,%%mm2;\n" " pmaddwd %%mm2,%%mm1;\n" " paddd %%mm1,%%mm0;\n" " .p2align 2;\n" "6:\n" /* Merge the pieces of the answer */ " movq %%mm0,%%mm1;\n" " punpckhdq %%mm0,%%mm1;\n" " paddd %%mm1,%%mm0;\n" /* et voila, eax has the final result */ " movd %%mm0,%%eax;\n" " emms;\n" : "=a" (z) : "S" (x), "D" (y), "a" (n) : "cc" ); #else int i; z = 0; for (i = 0; i < n; i++) z += (int32_t) x[i]*(int32_t) y[i]; #endif return z; } /*- End of function --------------------------------------------------------*/ int32_t vec_min_maxi16(const int16_t x[], int n, int16_t out[]) { #if defined(__GNUC__) && defined(__i386__) static const int32_t lower_bound = 0x80008000; static const int32_t upper_bound = 0x7FFF7FFF; int32_t max; __asm__ __volatile__( " emms;\n" " pushl %%edx;\n" " leal -8(%%esi,%%eax,2),%%edx;\n" " cmpl %%edx,%%esi;\n" " jbe 2f;\n" " movd %[lower],%%mm0;\n" " movd %[upper],%%mm1;\n" " jmp 1f;\n" " .p2align 2;\n" "2:\n" " movq (%%esi),%%mm0;\n" /* mm0 will be max's */ " movq %%mm0,%%mm1;\n" /* mm1 will be min's */ " addl $8,%%esi;\n" " cmpl %%edx,%%esi;\n" " ja 4f;\n" " .p2align 2;\n" "3:\n" " movq (%%esi),%%mm2;\n" " movq %%mm2,%%mm3;\n" " pcmpgtw %%mm0,%%mm3;\n" /* mm3 is bitmask for words where mm2 > mm0 */ " movq %%mm3,%%mm4;\n" " pand %%mm2,%%mm3;\n" /* mm3 is mm2 masked to new max's */ " pandn %%mm0,%%mm4;\n" /* mm4 is mm0 masked to its max's */ " por %%mm3,%%mm4;\n" " movq %%mm4,%%mm0;\n" /* Now mm0 is updated max's */ " movq %%mm1,%%mm3;\n" " pcmpgtw %%mm2,%%mm3;\n" /* mm3 is bitmask for words where mm2 < mm1 */ " pand %%mm3,%%mm2;\n" /* mm2 is mm2 masked to new min's */ " pandn %%mm1,%%mm3;\n" /* mm3 is mm1 masked to its min's */ " por %%mm3,%%mm2;\n" " movq %%mm2,%%mm1;\n" /* now mm1 is updated min's */ " addl $8,%%esi;\n" " cmpl %%edx,%%esi;\n" " jbe 3b;\n" " .p2align 2;\n" "4:\n" /* Merge down the 4-word max/mins to lower 2 words */ " movq %%mm0,%%mm2;\n" " psrlq $32,%%mm2;\n" " movq %%mm2,%%mm3;\n" " pcmpgtw %%mm0,%%mm3;\n" /* mm3 is bitmask for words where mm2 > mm0 */ " pand %%mm3,%%mm2;\n" /* mm2 is mm2 masked to new max's */ " pandn %%mm0,%%mm3;\n" /* mm3 is mm0 masked to its max's */ " por %%mm3,%%mm2;\n" " movq %%mm2,%%mm0;\n" /* now mm0 is updated max's */ " movq %%mm1,%%mm2;\n" " psrlq $32,%%mm2;\n" " movq %%mm1,%%mm3;\n" " pcmpgtw %%mm2,%%mm3;\n" /* mm3 is bitmask for words where mm2 < mm1 */ " pand %%mm3,%%mm2;\n" /* mm2 is mm2 masked to new min's */ " pandn %%mm1,%%mm3;\n" /* mm3 is mm1 masked to its min's */ " por %%mm3,%%mm2;\n" " movq %%mm2,%%mm1;\n" /* now mm1 is updated min's */ " .p2align 2;\n" "1:\n" " addl $4,%%edx;\n" /* now dx = top-4 */ " cmpl %%edx,%%esi;\n" " ja 5f;\n" /* Here, there are >= 2 words of input remaining */ " movd (%%esi),%%mm2;\n" " movq %%mm2,%%mm3;\n" " pcmpgtw %%mm0,%%mm3;\n" /* mm3 is bitmask for words where mm2 > mm0 */ " movq %%mm3,%%mm4;\n" " pand %%mm2,%%mm3;\n" /* mm3 is mm2 masked to new max's */ " pandn %%mm0,%%mm4;\n" /* mm4 is mm0 masked to its max's */ " por %%mm3,%%mm4;\n" " movq %%mm4,%%mm0;\n" /* now mm0 is updated max's */ " movq %%mm1,%%mm3;\n" " pcmpgtw %%mm2,%%mm3;\n" /* mm3 is bitmask for words where mm2 < mm1 */ " pand %%mm3,%%mm2;\n" /* mm2 is mm2 masked to new min's */ " pandn %%mm1,%%mm3;\n" /* mm3 is mm1 masked to its min's */ " por %%mm3,%%mm2;\n" " movq %%mm2,%%mm1;\n" /* now mm1 is updated min's */ " addl $4,%%esi;\n" " .p2align 2;\n" "5:\n" /* Merge down the 2-word max/mins to 1 word */ " movq %%mm0,%%mm2;\n" " psrlq $16,%%mm2;\n" " movq %%mm2,%%mm3;\n" " pcmpgtw %%mm0,%%mm3;\n" /* mm3 is bitmask for words where mm2 > mm0 */ " pand %%mm3,%%mm2;\n" /* mm2 is mm2 masked to new max's */ " pandn %%mm0,%%mm3;\n" /* mm3 is mm0 masked to its max's */ " por %%mm3,%%mm2;\n" " movd %%mm2,%%ecx;\n" /* cx is max so far */ " movq %%mm1,%%mm2;\n" " psrlq $16,%%mm2;\n" " movq %%mm1,%%mm3;\n" " pcmpgtw %%mm2,%%mm3;\n" /* mm3 is bitmask for words where mm2 < mm1 */ " pand %%mm3,%%mm2;\n" /* mm2 is mm2 masked to new min's */ " pandn %%mm1,%%mm3;\n" /* mm3 is mm1 masked to its min's */ " por %%mm3,%%mm2;\n" " movd %%mm2,%%eax;\n" /* ax is min so far */ " addl $2,%%edx;\n" /* now dx = top-2 */ " cmpl %%edx,%%esi;\n" " ja 6f;\n" /* Here, there is one word of input left */ " cmpw (%%esi),%%cx;\n" " jge 9f;\n" " movw (%%esi),%%cx;\n" " .p2align 2;\n" "9:\n" " cmpw (%%esi),%%ax;\n" " jle 6f;\n" " movw (%%esi),%%ax;\n" " .p2align 2;\n" "6:\n" /* (finally!) cx is the max, ax the min */ " movswl %%cx,%%ecx;\n" " movswl %%ax,%%eax;\n" " popl %%edx;\n" /* ptr to output max,min vals */ " andl %%edx,%%edx;\n" " jz 7f;\n" " movw %%cx,(%%edx);\n" /* max */ " movw %%ax,2(%%edx);\n" /* min */ " .p2align 2;\n" "7:\n" /* Now calculate max absolute value */ " negl %%eax;\n" " cmpl %%ecx,%%eax;\n" " jge 8f;\n" " movl %%ecx,%%eax;\n" " .p2align 2;\n" "8:\n" " emms;\n" : "=a" (max) : "S" (x), "a" (n), "d" (out), [lower] "m" (lower_bound), [upper] "m" (upper_bound) : "ecx" ); return max; #else int i; int16_t min; int16_t max; int16_t temp; int32_t z; max = INT16_MIN; min = INT16_MAX; for (i = 0; i < n; i++) { temp = x[i]; if (temp > max) max = temp; /*endif*/ if (temp < min) min = temp; /*endif*/ } /*endfor*/ out[0] = max; out[1] = min; z = abs(min); if (z > max) return z; return max; #endif } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/filter_tools.c0000644000175000017500000001415211150047216020531 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * filter_tools.c - A collection of routines used for filter design. * * Written by Steve Underwood * * Copyright (C) 2008 Steve Underwood * * This includes some elements based on the mkfilter package by * A.J. Fisher, University of York , November 1996 * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: filter_tools.c,v 1.7 2008/07/02 14:48:25 steveu Exp $ */ #if defined(HAVE_CONFIG_H) #include "config.h" #endif #include #include #include #include "floating_fudge.h" #if defined(HAVE_TGMATH_H) #include #endif #if defined(HAVE_MATH_H) #include #endif #include #include #include #include #include "spandsp/telephony.h" #include "spandsp/complex.h" #include "filter_tools.h" #define FALSE 0 #define TRUE (!FALSE) #define MAXPZ 8192 #define SEQLEN 8192 static complex_t circle[SEQLEN/2]; static __inline__ complex_t expj(double theta) { return complex_set(cos(theta), sin(theta)); } /*- End of function --------------------------------------------------------*/ static __inline__ double fix(double x) { /* Nearest integer */ return (x >= 0.0) ? floor(0.5 + x) : -floor(0.5 - x); } /*- End of function --------------------------------------------------------*/ static void fftx(complex_t data[], complex_t temp[], int n) { int i; int h; int p; int t; int i2; complex_t wkt; if (n > 1) { h = n/2; for (i = 0; i < h; i++) { i2 = i*2; temp[i] = data[i2]; /* Even */ temp[h + i] = data[i2 + 1]; /* Odd */ } fftx(&temp[0], &data[0], h); fftx(&temp[h], &data[h], h); p = 0; t = SEQLEN/n; for (i = 0; i < h; i++) { wkt = complex_mul(&circle[p], &temp[h + i]); data[i] = complex_add(&temp[i], &wkt); data[h + i] = complex_sub(&temp[i], &wkt); p += t; } } } /*- End of function --------------------------------------------------------*/ void ifft(complex_t data[], int len) { int i; double x; complex_t temp[SEQLEN]; /* A very slow and clunky FFT, that's just fine for filter design. */ for (i = 0; i < SEQLEN/2; i++) { x = (2.0*3.1415926535*i)/(double) SEQLEN; circle[i] = expj(x); } fftx(data, temp, len); } /*- End of function --------------------------------------------------------*/ void compute_raised_cosine_filter(double coeffs[], int len, int root, int sinc_compensate, double alpha, double beta) { double f; double x; double f1; double f2; double tau; complex_t vec[SEQLEN]; int i; int j; int h; f1 = (1.0 - beta)*alpha; f2 = (1.0 + beta)*alpha; tau = 0.5/alpha; /* (Root) raised cosine */ for (i = 0; i <= SEQLEN/2; i++) { f = (double) i/(double) SEQLEN; if (f <= f1) vec[i] = complex_set(1.0, 0.0); else if (f <= f2) vec[i] = complex_set(0.5*(1.0 + cos((3.1415926535*tau/beta) * (f - f1))), 0.0); else vec[i] = complex_set(0.0, 0.0); } if (root) { for (i = 0; i <= SEQLEN/2; i++) vec[i].re = sqrt(vec[i].re); } if (sinc_compensate) { for (i = 1; i <= SEQLEN/2; i++) { x = 3.1415926535*(double) i/(double) SEQLEN; vec[i].re *= (x/sin(x)); } } for (i = 0; i <= SEQLEN/2; i++) vec[i].re *= tau; for (i = 1; i < SEQLEN/2; i++) vec[SEQLEN - i] = vec[i]; ifft(vec, SEQLEN); h = (len - 1)/2; for (i = 0; i < len; i++) { j = (SEQLEN - h + i)%SEQLEN; coeffs[i] = vec[j].re/(double) SEQLEN; } } /*- End of function --------------------------------------------------------*/ void compute_hilbert_transform(double coeffs[], int len) { double x; int i; int h; h = (len - 1)/2; coeffs[h] = 0.0; for (i = 1; i <= h; i++) { if ((i & 1)) { x = 1.0/(double) i; coeffs[h + i] = -x; coeffs[h - i] = x; } } } /*- End of function --------------------------------------------------------*/ void apply_hamming_window(double coeffs[], int len) { double w; int i; int h; h = (len - 1)/2; for (i = 1; i <= h; i++) { w = 0.53836 - 0.46164*cos(2.0*3.1415926535*(double) (h + i)/(double) (len - 1.0)); coeffs[h + i] *= w; coeffs[h - i] *= w; } } /*- End of function --------------------------------------------------------*/ void truncate_coeffs(double coeffs[], int len, int bits, int hilbert) { double x; double fac; double max; double scale; int h; int i; fac = pow(2.0, (double) (bits - 1.0)); h = (len - 1)/2; max = (hilbert) ? coeffs[h - 1] : coeffs[h]; /* Max coeff */ scale = (fac - 1.0)/(fac*max); for (i = 0; i < len; i++) { x = coeffs[i]*scale; /* Scale coeffs so max is (fac - 1.0)/fac */ coeffs[i] = fix(x*fac)/fac; /* Truncate */ } } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/filter_tools.h0000644000175000017500000000350611150047216020537 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * filter_tools.h - A collection of routines used for filter design. * * Written by Steve Underwood * * Copyright (C) 2008 Steve Underwood * * Based on: * mkshape -- design raised cosine FIR filter * A.J. Fisher, University of York , November 1996 * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: filter_tools.h,v 1.3 2008/04/17 14:26:56 steveu Exp $ */ #if !defined(_FILTER_TOOLS_H_) #define _FILTER_TOOLS_H_ #if defined(__cplusplus) extern "C" { #endif void ifft(complex_t data[], int len); void apply_hamming_window(double coeffs[], int len); void truncate_coeffs(double coeffs[], int len, int bits, int hilbert); void compute_raised_cosine_filter(double coeffs[], int len, int root, int sinc_compensate, double alpha, double beta); void compute_hilbert_transform(double coeffs[], int len); #if defined(__cplusplus) } #endif #endif /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/hdlc.c0000644000175000017500000004401611150047216016740 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * hdlc.c * * Written by Steve Underwood * * Copyright (C) 2003 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: hdlc.c,v 1.60 2008/05/13 13:17:22 steveu Exp $ */ /*! \file */ #if defined(HAVE_CONFIG_H) #include #endif #include #include #include #include #include "spandsp/telephony.h" #include "spandsp/async.h" #include "spandsp/crc.h" #include "spandsp/bit_operations.h" #include "spandsp/hdlc.h" static void rx_special_condition(hdlc_rx_state_t *s, int condition) { /* Special conditions */ switch (condition) { case PUTBIT_CARRIER_UP: case PUTBIT_TRAINING_SUCCEEDED: /* Reset the HDLC receiver. */ s->raw_bit_stream = 0; s->len = 0; s->num_bits = 0; s->flags_seen = 0; s->framing_ok_announced = FALSE; /* Fall through */ case PUTBIT_TRAINING_IN_PROGRESS: case PUTBIT_TRAINING_FAILED: case PUTBIT_CARRIER_DOWN: case PUTBIT_END_OF_DATA: s->frame_handler(s->user_data, NULL, condition, TRUE); break; default: //printf("Eh!\n"); break; } } /*- End of function --------------------------------------------------------*/ static __inline__ void octet_set_and_count(hdlc_rx_state_t *s) { if (s->octet_count_report_interval == 0) return; /* If we are not in octet counting mode, we start it. If we are in octet counting mode, we update it. */ if (s->octet_counting_mode) { if (--s->octet_count <= 0) { s->octet_count = s->octet_count_report_interval; s->frame_handler(s->user_data, NULL, PUTBIT_OCTET_REPORT, TRUE); } } else { s->octet_counting_mode = TRUE; s->octet_count = s->octet_count_report_interval; } } /*- End of function --------------------------------------------------------*/ static __inline__ void octet_count(hdlc_rx_state_t *s) { if (s->octet_count_report_interval == 0) return; /* If we are not in octet counting mode, we start it. If we are in octet counting mode, we update it. */ if (s->octet_counting_mode) { if (--s->octet_count <= 0) { s->octet_count = s->octet_count_report_interval; s->frame_handler(s->user_data, NULL, PUTBIT_OCTET_REPORT, TRUE); } } } /*- End of function --------------------------------------------------------*/ static void rx_flag_or_abort(hdlc_rx_state_t *s) { if ((s->raw_bit_stream & 0x8000)) { /* Hit HDLC abort */ s->rx_aborts++; s->frame_handler(s->user_data, NULL, PUTBIT_ABORT, TRUE); /* If we have not yet seen enough flags, restart the count. If we are beyond that point, just back off one step, so we need to see another flag before proceeding to collect frame octets. */ if (s->flags_seen < s->framing_ok_threshold) s->flags_seen = 0; else s->flags_seen = s->framing_ok_threshold - 1; /* An abort starts octet counting */ octet_set_and_count(s); } else { /* Hit HDLC flag */ /* A flag clears octet counting */ s->octet_counting_mode = FALSE; if (s->flags_seen >= s->framing_ok_threshold) { /* We may have a frame, or we may have back to back flags */ if (s->len) { if (s->num_bits == 7 && s->len >= s->crc_bytes && s->len <= s->max_frame_len) { if ((s->crc_bytes == 2 && crc_itu16_check(s->buffer, s->len)) || (s->crc_bytes != 2 && crc_itu32_check(s->buffer, s->len))) { s->rx_frames++; s->rx_bytes += s->len - s->crc_bytes; s->len -= s->crc_bytes; s->frame_handler(s->user_data, s->buffer, s->len, TRUE); } else { s->rx_crc_errors++; if (s->report_bad_frames) { s->len -= s->crc_bytes; s->frame_handler(s->user_data, s->buffer, s->len, FALSE); } } } else { /* Frame too short or too long, or the flag is misaligned with its octets. */ if (s->report_bad_frames) { /* Don't let the length go below zero, or it will be confused with one of the special conditions. */ if (s->len >= s->crc_bytes) s->len -= s->crc_bytes; else s->len = 0; s->frame_handler(s->user_data, s->buffer, s->len, FALSE); } s->rx_length_errors++; } } } else { /* Check the flags are back-to-back when testing for valid preamble. This greatly reduces the chances of false preamble detection, and anything which doesn't send them back-to-back is badly broken. */ if (s->num_bits != 7) s->flags_seen = 0; if (++s->flags_seen >= s->framing_ok_threshold && !s->framing_ok_announced) { s->frame_handler(s->user_data, NULL, PUTBIT_FRAMING_OK, TRUE); s->framing_ok_announced = TRUE; } } } s->len = 0; s->num_bits = 0; } /*- End of function --------------------------------------------------------*/ static __inline__ void hdlc_rx_put_bit_core(hdlc_rx_state_t *s) { if ((s->raw_bit_stream & 0x3F00) == 0x3E00) { /* Its time to either skip a bit, for stuffing, or process a flag or abort */ if ((s->raw_bit_stream & 0x4000)) rx_flag_or_abort(s); return; } s->num_bits++; if (s->flags_seen < s->framing_ok_threshold) { if ((s->num_bits & 0x7) == 0) octet_count(s); return; } s->byte_in_progress = (s->byte_in_progress | (s->raw_bit_stream & 0x100)) >> 1; if (s->num_bits == 8) { /* Ensure we do not accept an overlength frame, and especially that we do not overflow our buffer */ if (s->len < s->max_frame_len) { s->buffer[s->len++] = (uint8_t) s->byte_in_progress; } else { /* This is too long. Abandon the frame, and wait for the next flag octet. */ s->len = sizeof(s->buffer) + 1; s->flags_seen = s->framing_ok_threshold - 1; octet_set_and_count(s); } s->num_bits = 0; } } /*- End of function --------------------------------------------------------*/ void hdlc_rx_put_bit(hdlc_rx_state_t *s, int new_bit) { if (new_bit < 0) { rx_special_condition(s, new_bit); return; } s->raw_bit_stream = (s->raw_bit_stream << 1) | ((new_bit << 8) & 0x100); hdlc_rx_put_bit_core(s); } /*- End of function --------------------------------------------------------*/ void hdlc_rx_put_byte(hdlc_rx_state_t *s, int new_byte) { int i; if (new_byte < 0) { rx_special_condition(s, new_byte); return; } s->raw_bit_stream |= new_byte; for (i = 0; i < 8; i++) { s->raw_bit_stream <<= 1; hdlc_rx_put_bit_core(s); } } /*- End of function --------------------------------------------------------*/ void hdlc_rx_put(hdlc_rx_state_t *s, const uint8_t buf[], int len) { int i; for (i = 0; i < len; i++) hdlc_rx_put_byte(s, buf[i]); } /*- End of function --------------------------------------------------------*/ void hdlc_rx_set_max_frame_len(hdlc_rx_state_t *s, size_t max_len) { max_len += s->crc_bytes; s->max_frame_len = (max_len <= sizeof(s->buffer)) ? max_len : sizeof(s->buffer); } /*- End of function --------------------------------------------------------*/ void hdlc_rx_set_octet_counting_report_interval(hdlc_rx_state_t *s, int interval) { s->octet_count_report_interval = interval; } /*- End of function --------------------------------------------------------*/ hdlc_rx_state_t *hdlc_rx_init(hdlc_rx_state_t *s, int crc32, int report_bad_frames, int framing_ok_threshold, hdlc_frame_handler_t handler, void *user_data) { if (s == NULL) { if ((s = (hdlc_rx_state_t *) malloc(sizeof(*s))) == NULL) return NULL; } memset(s, 0, sizeof(*s)); s->frame_handler = handler; s->user_data = user_data; s->crc_bytes = (crc32) ? 4 : 2; s->report_bad_frames = report_bad_frames; s->framing_ok_threshold = (framing_ok_threshold < 1) ? 1 : framing_ok_threshold; s->max_frame_len = sizeof(s->buffer); return s; } /*- End of function --------------------------------------------------------*/ int hdlc_rx_get_stats(hdlc_rx_state_t *s, hdlc_rx_stats_t *t) { t->bytes = s->rx_bytes; t->good_frames = s->rx_frames; t->crc_errors = s->rx_crc_errors; t->length_errors = s->rx_length_errors; t->aborts = s->rx_aborts; return 0; } /*- End of function --------------------------------------------------------*/ int hdlc_tx_frame(hdlc_tx_state_t *s, const uint8_t *frame, size_t len) { if (len <= 0) { s->tx_end = TRUE; return 0; } if (s->len + len > s->max_frame_len) return -1; if (s->progressive) { /* Only lock out if we are in the CRC section. */ if (s->pos >= HDLC_MAXFRAME_LEN) return -1; } else { /* Lock out if there is anything in the buffer. */ if (s->len) return -1; } memcpy(s->buffer + s->len, frame, len); if (s->crc_bytes == 2) s->crc = crc_itu16_calc(frame, len, (uint16_t) s->crc); else s->crc = crc_itu32_calc(frame, len, s->crc); if (s->progressive) s->len += len; else s->len = len; s->tx_end = FALSE; return 0; } /*- End of function --------------------------------------------------------*/ int hdlc_tx_flags(hdlc_tx_state_t *s, int len) { /* Some HDLC applications require the ability to force a period of HDLC flag words. */ if (s->pos) return -1; if (len < 0) s->flag_octets += -len; else s->flag_octets = len; s->report_flag_underflow = TRUE; s->tx_end = FALSE; return 0; } /*- End of function --------------------------------------------------------*/ int hdlc_tx_abort(hdlc_tx_state_t *s) { /* TODO: This is a really crude way of just fudging an abort out for simple test purposes. */ s->flag_octets++; s->abort_octets++; return -1; } /*- End of function --------------------------------------------------------*/ int hdlc_tx_corrupt_frame(hdlc_tx_state_t *s) { if (s->len <= 0) return -1; s->crc ^= 0xFFFF; s->buffer[HDLC_MAXFRAME_LEN] ^= 0xFF; s->buffer[HDLC_MAXFRAME_LEN + 1] ^= 0xFF; s->buffer[HDLC_MAXFRAME_LEN + 2] ^= 0xFF; s->buffer[HDLC_MAXFRAME_LEN + 3] ^= 0xFF; return 0; } /*- End of function --------------------------------------------------------*/ int hdlc_tx_get_byte(hdlc_tx_state_t *s) { int i; int byte_in_progress; int txbyte; if (s->flag_octets > 0) { /* We are in a timed flag section (preamble, inter frame gap, etc.) */ if (--s->flag_octets <= 0 && s->report_flag_underflow) { s->report_flag_underflow = FALSE; if (s->len == 0) { /* The timed flags have finished, there is nothing else queued to go, and we have been told to report this underflow. */ if (s->underflow_handler) s->underflow_handler(s->user_data); } } if (s->abort_octets) { s->abort_octets = 0; return 0x7F; } return s->idle_octet; } if (s->len) { if (s->num_bits >= 8) { s->num_bits -= 8; return (s->octets_in_progress >> s->num_bits) & 0xFF; } if (s->pos >= s->len) { if (s->pos == s->len) { s->crc ^= 0xFFFFFFFF; s->buffer[HDLC_MAXFRAME_LEN] = (uint8_t) s->crc; s->buffer[HDLC_MAXFRAME_LEN + 1] = (uint8_t) (s->crc >> 8); if (s->crc_bytes == 4) { s->buffer[HDLC_MAXFRAME_LEN + 2] = (uint8_t) (s->crc >> 16); s->buffer[HDLC_MAXFRAME_LEN + 3] = (uint8_t) (s->crc >> 24); } s->pos = HDLC_MAXFRAME_LEN; } else if (s->pos == HDLC_MAXFRAME_LEN + s->crc_bytes) { /* Finish off the current byte with some flag bits. If we are at the start of a byte we need a at least one whole byte of flag to ensure we cannot end up with back to back frames, and no flag octet at all */ txbyte = (uint8_t) ((s->octets_in_progress << (8 - s->num_bits)) | (0x7E >> s->num_bits)); /* Create a rotated octet of flag for idling... */ s->idle_octet = (0x7E7E >> s->num_bits) & 0xFF; /* ...and the partial flag octet needed to start off the next message. */ s->octets_in_progress = s->idle_octet >> (8 - s->num_bits); s->flag_octets = s->inter_frame_flags - 1; s->len = 0; s->pos = 0; if (s->crc_bytes == 2) s->crc = 0xFFFF; else s->crc = 0xFFFFFFFF; /* Report the underflow now. If there are timed flags still in progress, loading the next frame right now will be harmless. */ s->report_flag_underflow = FALSE; if (s->underflow_handler) s->underflow_handler(s->user_data); /* Make sure we finish off with at least one flag octet, if the underflow report did not result in a new frame being sent. */ if (s->len == 0 && s->flag_octets < 2) s->flag_octets = 2; return txbyte; } } byte_in_progress = s->buffer[s->pos++]; i = bottom_bit(byte_in_progress | 0x100); s->octets_in_progress <<= i; byte_in_progress >>= i; for ( ; i < 8; i++) { s->octets_in_progress = (s->octets_in_progress << 1) | (byte_in_progress & 0x01); byte_in_progress >>= 1; if ((s->octets_in_progress & 0x1F) == 0x1F) { /* There are 5 ones - stuff */ s->octets_in_progress <<= 1; s->num_bits++; } } /* An input byte will generate between 8 and 10 output bits */ return (s->octets_in_progress >> s->num_bits) & 0xFF; } /* Untimed idling on flags */ if (s->tx_end) { s->tx_end = FALSE; return PUTBIT_END_OF_DATA; } return s->idle_octet; } /*- End of function --------------------------------------------------------*/ int hdlc_tx_get_bit(hdlc_tx_state_t *s) { int txbit; if (s->bits == 0) { if ((s->byte = hdlc_tx_get_byte(s)) < 0) return s->byte; s->bits = 8; } s->bits--; txbit = (s->byte >> s->bits) & 0x01; return txbit; } /*- End of function --------------------------------------------------------*/ int hdlc_tx_get(hdlc_tx_state_t *s, uint8_t buf[], size_t max_len) { int i; int x; for (i = 0; i < max_len; i++) { if ((x = hdlc_tx_get_byte(s)) == PUTBIT_END_OF_DATA) return i; buf[i] = x; } return i; } /*- End of function --------------------------------------------------------*/ void hdlc_tx_set_max_frame_len(hdlc_tx_state_t *s, size_t max_len) { s->max_frame_len = (max_len <= HDLC_MAXFRAME_LEN) ? max_len : HDLC_MAXFRAME_LEN; } /*- End of function --------------------------------------------------------*/ hdlc_tx_state_t *hdlc_tx_init(hdlc_tx_state_t *s, int crc32, int inter_frame_flags, int progressive, hdlc_underflow_handler_t handler, void *user_data) { if (s == NULL) { if ((s = (hdlc_tx_state_t *) malloc(sizeof(*s))) == NULL) return NULL; } memset(s, 0, sizeof(*s)); s->idle_octet = 0x7E; s->underflow_handler = handler; s->user_data = user_data; s->inter_frame_flags = (inter_frame_flags < 1) ? 1 : inter_frame_flags; if (crc32) { s->crc_bytes = 4; s->crc = 0xFFFFFFFF; } else { s->crc_bytes = 2; s->crc = 0xFFFF; } s->progressive = progressive; s->max_frame_len = HDLC_MAXFRAME_LEN; return s; } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/make_at_dictionary.c0000644000175000017500000007743111150047216021663 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * make_at_dictionary.c - Generate a trie based dictionary for the AT * commands supported by the AT interpreter. * * Written by Steve Underwood * * Copyright (C) 2006 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: make_at_dictionary.c,v 1.1 2008/07/01 03:27:51 steveu Exp $ */ #if defined(HAVE_CONFIG_H) #include "config.h" #endif #include #include #include #include #include #include #include const char *wordlist[] = { " ", /* Dummy to absorb spaces in commands */ "&C", /* V.250 6.2.8 - Circuit 109 (received line signal detector), behaviour */ "&D", /* V.250 6.2.9 - Circuit 108 (data terminal ready) behaviour */ "&F", /* V.250 6.1.2 - Set to factory-defined configuration */ "+A8A", /* V.251 6.3 - V.8 calling tone indication */ "+A8C", /* V.251 6.2 - V.8 answer signal indication */ "+A8E", /* V.251 5.1 - V.8 and V.8bis operation controls */ "+A8I", /* V.251 6.1 - V.8 CI signal indication */ "+A8J", /* V.251 6.4 - V.8 negotiation complete */ "+A8M", /* V.251 5.2 - Send V.8 menu signals */ "+A8R", /* V.251 6.6 - V.8bis signal and message reporting */ "+A8T", /* V.251 5.3 - Send V.8bis signal and/or message(s) */ "+ASTO", /* V.250 6.3.15 - Store telephone number */ "+CAAP", /* 3GPP TS 27.007 7.25 - Automatic answer for eMLPP Service */ "+CACM", /* 3GPP TS 27.007 8.25 - Accumulated call meter */ "+CACSP", /* 3GPP TS 27.007 11.1.7 - Voice Group or Voice Broadcast Call State Attribute Presentation */ "+CAD", /* IS-99 5.6.3 - Query analogue or digital service */ "+CAEMLPP", /* 3GPP TS 27.007 7.22 - eMLPP Priority Registration and Interrogation */ "+CAHLD", /* 3GPP TS 27.007 11.1.3 - Leave an ongoing Voice Group or Voice Broadcast Call */ "+CAJOIN", /* 3GPP TS 27.007 11.1.1 - Accept an incoming Voice Group or Voice Broadcast Call */ "+CALA", /* 3GPP TS 27.007 8.16 - Alarm */ "+CALCC", /* 3GPP TS 27.007 11.1.6 - List current Voice Group and Voice Broadcast Calls */ "+CALD", /* 3GPP TS 27.007 8.38 - Delete alar m */ "+CALM", /* 3GPP TS 27.007 8.20 - Alert sound mode */ "+CAMM", /* 3GPP TS 27.007 8.26 - Accumulated call meter maximum */ "+CANCHEV", /* 3GPP TS 27.007 11.1.8 - NCH Support Indication */ "+CAOC", /* 3GPP TS 27.007 7.16 - Advice of Charge */ "+CAPD", /* 3GPP TS 27.007 8.39 - Postpone or dismiss an alarm */ "+CAPTT", /* 3GPP TS 27.007 11.1.4 - Talker Access for Voice Group Call */ "+CAREJ", /* 3GPP TS 27.007 11.1.2 - Reject an incoming Voice Group or Voice Broadcast Call */ "+CAULEV", /* 3GPP TS 27.007 11.1.5 - Voice Group Call Uplink Status Presentation */ "+CBC", /* 3GPP TS 27.007 8.4 - Battery charge */ "+CBCS", /* 3GPP TS 27.007 11.3.2 - VBS subscriptions and GId status */ "+CBIP", /* IS-99 5.6 - Base station IP address */ "+CBST", /* 3GPP TS 27.007 6.7 - Select bearer service type */ "+CCFC", /* 3GPP TS 27.007 7.11 - Call forwarding number and conditions */ "+CCLK", /* 3GPP TS 27.007 8.15 - Clock */ "+CCS", /* IS-135 4.1.22 - Compression status */ "+CCUG", /* 3GPP TS 27.007 7.10 - Closed user group */ "+CCWA", /* 3GPP TS 27.007 7.12 - Call waiting */ "+CCWE", /* 3GPP TS 27.007 8.28 - Call Meter maximum event */ "+CDIP", /* 3GPP TS 27.007 7.9 - Called line identification presentation */ "+CDIS", /* 3GPP TS 27.007 8.8 - Display control */ "+CDV", /* IS-99 5.6 - Dial command for voice call */ "+CEER", /* 3GPP TS 27.007 6.10 - Extended error report */ "+CESP", /* GSM07.05 3.2.4 - Enter SMS block mode protocol */ "+CFCS", /* 3GPP TS 27.007 7.24 - Fast call setup conditions */ "+CFG", /* IS-99 5.6 - Configuration string */ "+CFUN", /* 3GPP TS 27.007 8.2 - Set phone functionality */ "+CGACT", /* 3GPP TS 27.007 10.1.10 - PDP context activate or deactivate */ "+CGANS", /* 3GPP TS 27.007 10.1.16 - Manual response to a network request for PDP context activation */ "+CGATT", /* 3GPP TS 27.007 10.1.9 - PS attach or detach */ "+CGAUTO", /* 3GPP TS 27.007 10.1.15 - Automatic response to a network request for PDP context activation */ "+CGCAP", /* IS-99 5.6 - Request complete capabilities list */ "+CGCLASS", /* 3GPP TS 27.007 10.1.17 - GPRS mobile station class (GPRS only) */ "+CGCLOSP", /* 3GPP TS 27.007 10.1.13 - Configure local octet stream PAD parameters (Obsolete) */ "+CGCLPAD", /* 3GPP TS 27.007 10.1.12 - Configure local triple-X PAD parameters (GPRS only) (Obsolete) */ "+CGCMOD", /* 3GPP TS 27.007 10.1.11 - PDP Context Modify */ "+CGCS", /* 3GPP TS 27.007 11.3.1 - VGCS subscriptions and GId status */ "+CGDATA", /* 3GPP TS 27.007 10.1.12 - Enter data state */ "+CGDCONT", /* 3GPP TS 27.007 10.1.1 - Define PDP Context */ "+CGDSCONT",/* 3GPP TS 27.007 10.1.2 - Define Secondary PDP Context */ "+CGEQMIN", /* 3GPP TS 27.007 10.1.7 - 3G Quality of Service Profile (Minimum acceptable) */ "+CGEQNEG", /* 3GPP TS 27.007 10.1.8 - 3G Quality of Service Profile (Negotiated) */ "+CGEQREQ", /* 3GPP TS 27.007 10.1.6 - 3G Quality of Service Profile (Requested) */ "+CGEREP", /* 3GPP TS 27.007 10.1.18 - Packet Domain event reporting */ "+CGMI", /* 3GPP TS 27.007 5.1 - Request manufacturer identification */ "+CGMM", /* 3GPP TS 27.007 5.2 - Request model identification */ "+CGMR", /* 3GPP TS 27.007 5.3 - Request revision identification */ "+CGOI", /* IS-99 5.6 - Request global object identification */ "+CGPADDR", /* 3GPP TS 27.007 10.1.14 - Show PDP address */ "+CGQMIN", /* 3GPP TS 27.007 10.1.5 - Quality of Service Profile (Minimum acceptable) */ "+CGQREQ", /* 3GPP TS 27.007 10.1.4 - Quality of Service Profile (Requested) */ "+CGREG", /* 3GPP TS 27.007 10.1.19 - GPRS network registration status */ "+CGSMS", /* 3GPP TS 27.007 10.1.20 - Select service for MO SMS messages */ "+CGSN", /* 3GPP TS 27.007 5.4 - Request product serial number identification */ "+CGTFT", /* 3GPP TS 27.007 10.1.3 - Traffic Flow Template */ "+CHLD", /* 3GPP TS 27.007 7.13 - Call related supplementary services */ "+CHSA", /* 3GPP TS 27.007 6.18 - HSCSD non-transparent asymmetry configuration */ "+CHSC", /* 3GPP TS 27.007 6.15 - HSCSD current call parameters */ "+CHSD", /* 3GPP TS 27.007 6.12 - HSCSD device parameters */ "+CHSN", /* 3GPP TS 27.007 6.14 - HSCSD non-transparent call configuration */ "+CHSR", /* 3GPP TS 27.007 6.16 - HSCSD parameters report */ "+CHST", /* 3GPP TS 27.007 6.13 - HSCSD transparent call configuration */ "+CHSU", /* 3GPP TS 27.007 6.17 - HSCSD automatic user initiated upgrading */ "+CHUP", /* 3GPP TS 27.007 6.5 - Hangup call */ "+CHV", /* IS-99 5.6 - Hang-up voice */ "+CIMI", /* 3GPP TS 27.007 5.6 - Request international mobile subscriber identity */ "+CIND", /* 3GPP TS 27.007 8.9 - Indicator control */ "+CIT", /* IS-99 5.6 - Command state inactivity timer */ "+CKPD", /* 3GPP TS 27.007 8.7 - Keypad control */ "+CLAC", /* 3GPP TS 27.007 8.37 - List all available AT commands */ "+CLAE", /* 3GPP TS 27.007 8.31 - Language Event */ "+CLAN", /* 3GPP TS 27.007 8.30 - Set Language */ "+CLCC", /* 3GPP TS 27.007 7.18 - List current calls */ "+CLCK", /* 3GPP TS 27.007 7.4 - Facility lock */ "+CLIP", /* 3GPP TS 27.007 7.6 - Calling line identification presentation */ "+CLIR", /* 3GPP TS 27.007 7.7 - Calling line identification restriction */ "+CLVL", /* 3GPP TS 27.007 8.23 - Loudspeaker volume level */ "+CMAR", /* 3GPP TS 27.007 8.36 - Master reset */ "+CMEC", /* 3GPP TS 27.007 8.6 - Mobile termination control mode */ "+CMEE", /* GSM07.07 9.1 - Report mobile equipment error */ "+CMER", /* 3GPP TS 27.007 8.10 - Mobile termination event reporting */ "+CMGC", /* GSM07.05 3.5.5/4.5 - Send command */ "+CMGD", /* GSM07.05 3.5.4 - Delete message */ "+CMGF", /* GSM07.05 3.2.3 - Message Format */ "+CMGL", /* GSM07.05 3.4.2/4.1 - List messages */ "+CMGR", /* GSM07.05 3.4.3/4.2 - Read message */ "+CMGS", /* GSM07.05 3.5.1/4.3 - Send message */ "+CMGW", /* GSM07.05 3.5.3/4.4 - Write message to memory */ "+CMIP", /* IS-99 5.6 - Mobile station IP address */ "+CMM", /* IS-135 4.1.23 - Menu map */ "+CMMS", /* GSM07.05 3.5.6 - More messages to send */ "+CMOD", /* 3GPP TS 27.007 6.4 - Call mode */ "+CMSS", /* GSM07.05 3.5.2/4.7 - Send message from storage */ "+CMUT", /* 3GPP TS 27.007 8.24 - Mute control */ "+CMUX", /* 3GPP TS 27.007 5.7 - Multiplexing mode */ "+CNMA", /* GSM07.05 3.4.4/4.6 - New message acknowledgement to terminal adapter */ "+CNMI", /* GSM07.05 3.4.1 - New message indications to terminal equipment */ "+CNUM", /* 3GPP TS 27.007 7.1 - Subscriber number */ "+COLP", /* 3GPP TS 27.007 7.8 - Connected line identification presentation */ "+COPN", /* 3GPP TS 27.007 7.21 - Read operator names */ "+COPS", /* 3GPP TS 27.007 7.3 - PLMN selection */ "+COS", /* IS-135 4.1.24 - Originating service */ "+COTDI", /* 3GPP TS 27.007 11.1.9 - Originator to Dispatcher Information */ "+CPAS", /* 3GPP TS 27.007 8.1 - Phone activity status */ "+CPBF", /* 3GPP TS 27.007 8.13 - Find phonebook entries */ "+CPBR", /* 3GPP TS 27.007 8.12 - Read phonebook entries */ "+CPBS", /* 3GPP TS 27.007 8.11 - Select phonebook memory storage */ "+CPBW", /* 3GPP TS 27.007 8.14 - Write phonebook entry */ "+CPIN", /* 3GPP TS 27.007 8.3 - Enter PIN */ "+CPLS", /* 3GPP TS 27.007 7.20 - Selection of preferred PLMN list */ "+CPMS", /* GSM07.05 3.2.2 - Preferred message storage */ "+CPOL", /* 3GPP TS 27.007 7.19 - Preferred PLMN list */ "+CPPS", /* 3GPP TS 27.007 7.23 - eMLPP subscriptions */ "+CPROT", /* 3GPP TS 27.007 8.42 - Enter protocol mode */ "+CPUC", /* 3GPP TS 27.007 8.27 - Price per unit and currency table */ "+CPWC", /* 3GPP TS 27.007 8.29 - Power class */ "+CPWD", /* 3GPP TS 27.007 7.5 - Change password */ "+CQD", /* IS-135 4.1.25 - Query disconnect timer */ "+CR", /* 3GPP TS 27.007 6.9 - Service reporting control */ "+CRC", /* 3GPP TS 27.007 6.11 - Cellular result codes */ "+CREG", /* 3GPP TS 27.007 7.2 - Network registration */ "+CRES", /* GSM07.05 3.3.6 - Restore Settings */ "+CRLP", /* 3GPP TS 27.007 6.8 - Radio link protocol */ "+CRM", /* IS-99 5.6 - Set rm interface protocol */ "+CRMC", /* 3GPP TS 27.007 8.34 - Ring Melody Control */ "+CRMP", /* 3GPP TS 27.007 8.35 - Ring Melody Playback */ "+CRSL", /* 3GPP TS 27.007 8.21 - Ringer sound level */ "+CRSM", /* 3GPP TS 27.007 8.18 - Restricted SIM access */ "+CSAS", /* GSM07.05 3.3.5 - Save settings */ "+CSCA", /* GSM07.05 3.3.1 - Service centre address */ "+CSCB", /* GSM07.05 3.3.4 - Select cell broadcast message types */ "+CSCC", /* 3GPP TS 27.007 8.19 - Secure control command */ "+CSCS", /* 3GPP TS 27.007 5.5 - Select TE character set */ "+CSDF", /* 3GPP TS 27.007 6.22 - Settings date format */ "+CSDH", /* GSM07.05 3.3.3 - Show text mode parameters */ "+CSGT", /* 3GPP TS 27.007 8.32 - Set Greeting Text */ "+CSIL", /* 3GPP TS 27.007 6.23 - Silence Command */ "+CSIM", /* 3GPP TS 27.007 8.17 - Generic SIM access */ "+CSMP", /* GSM07.05 3.3.2 - Set text mode parameters */ "+CSMS", /* GSM07.05 3.2.1 - Select Message Service */ "+CSNS", /* 3GPP TS 27.007 6.19 - Single numbering scheme */ "+CSQ", /* 3GPP TS 27.007 8.5 - Signal quality */ "+CSS", /* IS-135 4.1.28 - Serving system identification */ "+CSSN", /* 3GPP TS 27.007 7.17 - Supplementary service notifications */ "+CSTA", /* 3GPP TS 27.007 6.1 - Select type of address */ "+CSTF", /* 3GPP TS 27.007 6.24 - Settings time format */ "+CSVM", /* 3GPP TS 27.007 8.33 - Set Voice Mail Number */ "+CTA", /* IS-135 4.1.29 - MT-Terminated async. Data calls */ "+CTF", /* IS-135 4.1.30 - MT-Terminated FAX calls */ "+CTFR", /* 3GPP TS 27.007 7.14 - Call deflection */ "+CTZR", /* 3GPP TS 27.007 8.41 - Time Zone Reporting */ "+CTZU", /* 3GPP TS 27.007 8.40 - Automatic Time Zone Update */ "+CUSD", /* 3GPP TS 27.007 7.15 - Unstructured supplementary service data */ "+CUUS1", /* 3GPP TS 27.007 7.26 - User to User Signalling Service 1 */ "+CV120", /* 3GPP TS 27.007 6.21 - V.120 rate adaption protocol */ "+CVHU", /* 3GPP TS 27.007 6.20 - Voice Hangup Control */ "+CVIB", /* 3GPP TS 27.007 8.22 - Vibrator mode */ "+CXT", /* IS-99 5.6 - Cellular extension */ "+DR", /* V.250 6.6.2 - Data compression reporting */ "+DS", /* V.250 6.6.1 - Data compression */ "+DS44", /* V.250 6.6.2 - V.44 data compression */ "+EB", /* V.250 6.5.2 - Break handling in error control operation */ "+EFCS", /* V.250 6.5.4 - 32-bit frame check sequence */ "+EFRAM", /* V.250 6.5.8 - Frame length */ "+ER", /* V.250 6.5.5 - Error control reporting */ "+ES", /* V.250 6.5.1 - Error control selection */ "+ESR", /* V.250 6.5.3 - Selective repeat */ "+ETBM", /* V.250 6.5.6 - Call termination buffer management */ "+EWIND", /* V.250 6.5.7 - Window size */ "+FAA", /* T.32 8.5.2.5 - Adaptive Answer parameter */ "+FAP", /* T.32 8.5.1.12 - Addressing and polling capabilities parameter */ "+FAR", /* T.31 8.5.1 - Adaptive reception control */ "+FBO", /* T.32 8.5.3.4 - Phase C data bit order */ "+FBS", /* T.32 8.5.3.2 - Buffer Size, read only parameter */ "+FBU", /* T.32 8.5.1.10 - HDLC Frame Reporting parameter */ "+FCC", /* T.32 8.5.1.1 - DCE capabilities parameters */ "+FCL", /* T.31 8.5.2 - Carrier loss timeout */ "+FCLASS", /* T.31 8.2 - Capabilities identification and control */ "+FCQ", /* T.32 8.5.2.3 - Copy quality checking parameter */ "+FCR", /* T.32 8.5.1.9 - Capability to receive parameter */ "+FCS", /* T.32 8.5.1.3 - Current Session Results parameters */ "+FCT", /* T.32 8.5.2.6 - DTE phase C timeout parameter */ "+FDD", /* T.31 8.5.3 - Double escape character replacement */ "+FDR", /* T.32 8.3.4 - Data reception command */ "+FDT", /* T.32 8.3.3 - Data transmission command */ "+FEA", /* T.32 8.5.3.5 - Phase C received EOL alignment parameter */ "+FFC", /* T.32 8.5.3.6 - Format conversion parameter */ "+FFD", /* T.32 8.5.1.14 - File diagnostic message parameter */ "+FHS", /* T.32 8.5.2.7 - Call termination status parameter */ "+FIE", /* T.32 8.5.2.1 - Procedure interrupt enable parameter */ "+FIP", /* T.32 8.3.6 - Initialize facsimile parameters */ "+FIS", /* T.32 8.5.1.2 - Current session parameters */ "+FIT", /* T.31 8.5.4 - DTE inactivity timeout */ "+FKS", /* T.32 8.3.5 - Session termination command */ "+FLI", /* T.32 8.5.1.5 - Local ID string parameter, TSI or CSI */ "+FLO", /* T.31 says to implement something similar to +IFC */ "+FLP", /* T.32 8.5.1.7 - Indicate document to poll parameter */ "+FMI", /* T.31 says to duplicate +GMI */ "+FMM", /* T.31 says to duplicate +GMM */ "+FMR", /* T.31 says to duplicate +GMR */ "+FMS", /* T.32 8.5.2.9 - Minimum phase C speed parameter */ "+FND", /* T.32 8.5.2.10 - Non-Standard Message Data Indication parameter */ "+FNR", /* T.32 8.5.1.11 - Negotiation message reporting control parameters */ "+FNS", /* T.32 8.5.1.6 - Non-Standard Frame FIF parameter */ "+FPA", /* T.32 8.5.1.13 - Selective polling address parameter */ "+FPI", /* T.32 8.5.1.5 - Local Polling ID String parameter */ "+FPP", /* T.32 8.5.3 - Facsimile packet protocol */ "+FPR", /* T.31 says to implement something similar to +IPR */ "+FPS", /* T.32 8.5.2.2 - Page Status parameter */ "+FPW", /* T.32 8.5.1.13 - PassWord parameter (Sending or Polling) */ "+FRH", /* T.31 8.3.6 - HDLC receive */ "+FRM", /* T.31 8.3.4 - Facsimile receive */ "+FRQ", /* T.32 8.5.2.4 - Receive Quality Thresholds parameters */ "+FRS", /* T.31 8.3.2 - Receive silence */ "+FRY", /* T.32 8.5.2.8 - ECM Retry Value parameter */ "+FSA", /* T.32 8.5.1.13 - Subaddress parameter */ "+FSP", /* T.32 8.5.1.8 - Request to poll parameter */ "+FTH", /* T.31 8.3.5 - HDLC transmit */ "+FTM", /* T.31 8.3.3 - Facsimile transmit */ "+FTS", /* T.31 8.3.1 - Transmit silence */ "+GCAP", /* V.250 6.1.9 - Request complete capabilities list */ "+GCI", /* V.250 6.1.10 - Country of installation, */ "+GMI", /* V.250 6.1.4 - Request manufacturer identification */ "+GMM", /* V.250 6.1.5 - Request model identification */ "+GMR", /* V.250 6.1.6 - Request revision identification */ "+GOI", /* V.250 6.1.8 - Request global object identification */ "+GSN", /* V.250 6.1.7 - Request product serial number identification */ "+IBC", /* TIA-617 8.3 - Control of in-band control */ "+IBM", /* TIA-617 8.4 - In-Band MARK idle reporting control */ "+ICF", /* V.250 6.2.11 - DTE-DCE character framing */ "+ICLOK", /* V.250 6.2.14 - Select sync transmit clock source */ "+IDSR", /* V.250 6.2.16 - Select data set ready option */ "+IFC", /* V.250 6.2.12 - DTE-DCE local flow control */ "+ILRR", /* V.250 6.2.13 - DTE-DCE local rate reporting */ "+ILSD", /* V.250 6.2.15 - Select long space disconnect option */ "+IPR", /* V.250 6.2.10 - Fixed DTE rate */ "+IRTS", /* V.250 6.2.17 - Select synchronous mode RTS option */ "+MA", /* V.250 6.4.2 - Modulation automode control */ "+MR", /* V.250 6.4.3 - Modulation reporting control */ "+MS", /* V.250 6.4.1 - Modulation selection */ "+MSC", /* V.250 6.4.8 - Seamless rate change enable */ "+MV18AM", /* V.250 6.4.6 - V.18 answering message editing */ "+MV18P", /* V.250 6.4.7 - Order of probes */ "+MV18R", /* V.250 6.4.5 - V.18 reporting control */ "+MV18S", /* V.250 6.4.4 - V.18 selection */ "+PCW", /* V.250 6.8.1 - Call waiting enable (V.92 DCE) */ "+PIG", /* V.250 6.8.5 - PCM upstream ignore */ "+PMH", /* V.250 6.8.2 - Modem on hold enable */ "+PMHF", /* V.250 6.8.6 - V.92 Modem on hold hook flash */ "+PMHR", /* V.250 6.8.4 - Initiate modem on hold */ "+PMHT", /* V.250 6.8.3 - Modem on hold timer */ "+PQC", /* V.250 6.8.7 - V.92 Phase 1 and Phase 2 Control */ "+PSS", /* V.250 6.8.8 - V.92 Use Short Sequence */ "+SAC", /* V.252 3.4 - Audio transmit configuration */ "+SAM", /* V.252 3.5 - Audio receive mode */ "+SAR", /* V.252 5.3 - Audio receive channel indication */ "+SARR", /* V.252 3.9 - Audio indication reporting */ "+SAT", /* V.252 5.4 - Audio transmit channel indication */ "+SCRR", /* V.252 3.11 - Capabilities indication reporting */ "+SDC", /* V.252 3.3 - Data configuration */ "+SDI", /* V.252 5.2 - Data channel identification */ "+SDR", /* V.252 3.8 - Data indication reporting */ "+SRSC", /* V.252 5.1.2 - Remote terminal simultaneous capability indication */ "+STC", /* V.252 3.1 - Terminal configuration */ "+STH", /* V.252 3.2 - Close logical channel */ "+SVC", /* V.252 3.6 - Video transmit configuration */ "+SVM", /* V.252 3.7 - Video receive mode */ "+SVR", /* V.252 5.5 - Video receive channel indication */ "+SVRR", /* V.252 3.10 - Video indication reporting */ "+SVT", /* V.252 5.6 - Video transmit channel indication */ "+TADR", /* V.250 6.7.2.9 - Local V.54 address */ "+TAL", /* V.250 6.7.2.15 - Local analogue loop */ "+TALS", /* V.250 6.7.2.6 - Analogue loop status */ "+TDLS", /* V.250 6.7.2.7 - Local digital loop status */ "+TE140", /* V.250 6.7.2.1 - Enable ckt 140 */ "+TE141", /* V.250 6.7.2.2 - Enable ckt 141 */ "+TEPAL", /* V.250 6.7.2.5 - Enable front panel analogue loop */ "+TEPDL", /* V.250 6.7.2.4 - Enable front panel RDL */ "+TERDL", /* V.250 6.7.2.3 - Enable RDL from remote */ "+TLDL", /* V.250 6.7.2.13 - Local digital loop */ "+TMO", /* V.250 6.9 - V.59 command */ "+TMODE", /* V.250 6.7.2.10 - Set V.54 mode */ "+TNUM", /* V.250 6.7.2.12 - Errored bit and block counts */ "+TRDL", /* V.250 6.7.2.14 - Request remote digital loop */ "+TRDLS", /* V.250 6.7.2.8 - Remote digital loop status */ "+TRES", /* V.250 6.7.2.17 - Self test result */ "+TSELF", /* V.250 6.7.2.16 - Self test */ "+TTER", /* V.250 6.7.2.11 - Test error rate */ "+VAC", /* V.252 4.1 - Set audio code */ "+VACR", /* V.252 6.1 - Audio code report */ "+VBT", /* 3GPP TS 27.007 C.2.2 - Buffer threshold setting */ "+VCID", /* V.253 9.2.3 - Caller ID service */ "+VCIDR", /* V.252 6.2 - Caller ID report */ "+VDID", /* V.253 9.2.4 - DID service */ "+VDIDR", /* V.252 6.2 - DID report */ "+VDR", /* V.253 10.3.1 - Distinctive ring (ring cadence reporting) */ "+VDT", /* V.253 10.3.2 - Control tone cadence reporting */ "+VDX", /* V.253 10.5.6 - Speakerphone duplex mode */ "+VEM", /* V.253 10.5.7 - Deliver event reports */ "+VGM", /* V.253 10.5.2 - Microphone gain */ "+VGR", /* V.253 10.2.1 - Receive gain selection */ "+VGS", /* V.253 10.5.3 - Speaker gain */ "+VGT", /* V.253 10.2.2 - Volume selection */ "+VHC", /* V.252 4.12 - Telephony port hook control */ "+VIP", /* V.253 10.1.1 - Initialize voice parameters */ "+VIT", /* V.253 10.2.3 - DTE/DCE inactivity timer */ "+VLS", /* V.253 10.2.4 - Analogue source/destination selection */ "+VNH", /* V.253 9.2.5 - Automatic hangup control */ "+VPH", /* V.252 4.11 - Phone hookswitch status */ "+VPP", /* V.253 10.4.2 - Voice packet protocol */ "+VPR", /* IS-101 10.4.3 - Select DTE/DCE interface rate */ "+VRA", /* V.253 10.2.5 - Ringing tone goes away timer */ "+VRID", /* Extension - Find the originating and destination numbers */ "+VRL", /* V.253 10.1.2 - Ring local phone */ "+VRN", /* V.253 10.2.6 - Ringing tone never appeared timer */ "+VRX", /* V.253 10.1.3 - Voice receive state */ "+VSD", /* V.253 10.2.7 - Silence detection (QUIET and SILENCE) */ "+VSID", /* Extension - Set the originating number */ "+VSM", /* V.253 10.2.8 - Compression method selection */ "+VSP", /* V.253 10.5.1 - Voice speakerphone state */ "+VTA", /* V.253 10.5.4 - Train acoustic echo-canceller */ "+VTD", /* V.253 10.2.9 - Beep tone duration timer */ "+VTER", /* V.252 6.4 - Simple telephony event report */ "+VTH", /* V.253 10.5.5 - Train line echo-canceller */ "+VTR", /* V.253 10.1.4 - Voice duplex state */ "+VTS", /* V.253 10.1.5 - DTMF and tone generation in voice */ "+VTX", /* V.253 10.1.6 - Transmit data state */ "+VXT", /* IS-101 10.1.5 - Translate voice data */ "+W", /* TIA-678 5.2.4.1 - Compliance indication */ "+WBAG", /* TIA-678 C.5.6 Bias modem audio gain */ "+WCDA", /* TIA-678 B.3.2.5 Display data link address */ "+WCHG", /* TIA-678 B.3.2.4 Display battery charging status */ "+WCID", /* TIA-678 B.3.2.1 Display system ID (operator) */ "+WCLK", /* TIA-678 B.3.2.3 Lock/unlock DCE */ "+WCPN", /* TIA-678 B.3.2.2 Set personal identification number */ "+WCXF", /* TIA-678 B.3.2.6 Display supported annex B commands */ "+WDAC", /* TIA-678 C.5.1 Data over analogue cellular command query */ "+WDIR", /* TIA-678 C.5.8 Phone number directory selection */ "+WECR", /* TIA-678 C.5.3 Enable cellular result codes */ "+WFON", /* TIA-678 C.5.5 Phone specification */ "+WKPD", /* TIA-678 C.5.7 Keypad emulation */ "+WPBA", /* TIA-678 C.5.9 Phone battery query */ "+WPTH", /* TIA-678 C.5.10 Call path */ "+WRLK", /* TIA-678 C.5.4 Roam lockout */ "+WS45", /* TIA-678 5.2.4.2 DTE-side stack selection */ "+WS46", /* 3GPP TS 27.007 5.9 - PCCA STD-101 [17] select wireless network */ "+WS50", /* TIA-678 B.3.1.1 Normalized signal strength */ "+WS51", /* TIA-678 B.3.1.2 Carrier detect signal threshold */ "+WS52", /* TIA-678 B.3.1.3 Normalized battery level */ "+WS53", /* TIA-678 B.3.1.4 Normalized channel quality */ "+WS54", /* TIA-678 B.3.1.5 Carrier detect channel quality threshold */ "+WS57", /* TIA-678 B.3.1.7 Antenna preference */ "+WS58", /* TIA-678 B.3.1.8 Idle time-out value */ "+WSTL", /* TIA-678 C.5.2 Call session time limit */ ";", /* Dummy to absorb semi-colon delimiters in commands */ "A", /* V.250 6.3.5 - Answer */ "D", /* V.250 6.3.1 - Dial */ "E", /* V.250 6.2.4 - Command echo */ "H", /* V.250 6.3.6 - Hook control */ "I", /* V.250 6.1.3 - Request identification information */ "L", /* V.250 6.3.13 - Monitor speaker loudness */ "M", /* V.250 6.3.14 - Monitor speaker mode */ "O", /* V.250 6.3.7 - Return to online data state */ "P", /* V.250 6.3.3 - Select pulse dialling (command) */ "Q", /* V.250 6.2.5 - Result code suppression */ "S0", /* V.250 6.3.8 - Automatic answer */ "S10", /* V.250 6.3.12 - Automatic disconnect delay */ "S3", /* V.250 6.2.1 - Command line termination character */ "S4", /* V.250 6.2.2 - Response formatting character */ "S5", /* V.250 6.2.3 - Command line editing character */ "S6", /* V.250 6.3.9 - Pause before blind dialling */ "S7", /* V.250 6.3.10 - Connection completion timeout */ "S8", /* V.250 6.3.11 - Comma dial modifier time */ "T", /* V.250 6.3.2 - Select tone dialling (command) */ "V", /* V.250 6.2.6 - DCE response format */ "X", /* V.250 6.2.7 - Result code selection and call progress monitoring control */ "Z", /* V.250 6.1.1 - Reset to default configuration */ NULL }; int packed_ptr = 0; short int packed_trie[30000]; #define ALPHABET_SIZE 128 typedef struct trie_node_s { int first; int last; int node_no; int entry; /* Array of pointers to children */ struct trie_node_s *child_list[ALPHABET_SIZE]; } trie_node_t; typedef struct { int entries; /* The root of the trie */ trie_node_t *root; } trie_t; static trie_node_t *trie_node_create(void) { trie_node_t *s; if ((s = (trie_node_t *) malloc(sizeof(*s)))) { memset(s, 0, sizeof(*s)); s->first = ALPHABET_SIZE - 1; } return s; } /*- End of function --------------------------------------------------------*/ static trie_t *trie_create(void) { trie_t *s; if ((s = (trie_t *) malloc(sizeof(*s)))) { memset(s, 0, sizeof(*s)); s->root = trie_node_create(); } return s; } /*- End of function --------------------------------------------------------*/ static void trie_recursive_add_node_numbers(trie_node_t *t) { int index; if (t) { if (t->first <= t->last) { t->node_no = packed_ptr + 1; packed_ptr += (t->last - t->first + 1 + 3); for (index = 0; index < ALPHABET_SIZE; index++) trie_recursive_add_node_numbers(t->child_list[index]); } else { t->node_no = packed_ptr + 1; packed_ptr += 3; } } } /*- End of function --------------------------------------------------------*/ static void trie_recursive_build_packed_trie(trie_node_t *t) { int i; if (t) { if (t->first <= t->last) { packed_trie[packed_ptr++] = t->first; packed_trie[packed_ptr++] = t->last; packed_trie[packed_ptr++] = t->entry; for (i = t->first; i <= t->last; i++) packed_trie[packed_ptr++] = (t->child_list[i]) ? t->child_list[i]->node_no : 0; for (i = t->first; i <= t->last; i++) trie_recursive_build_packed_trie(t->child_list[i]); } else { packed_trie[packed_ptr++] = 1; packed_trie[packed_ptr++] = 0; packed_trie[packed_ptr++] = t->entry; } } } /*- End of function --------------------------------------------------------*/ static void trie_add(trie_t *s, const char *u, size_t len) { int i; int index; trie_node_t *t; s->entries++; /* Loop over the length of the string to add and traverse the trie... */ for (t = s->root, i = 0; i < len; i++) { /* The character in u we are processing... */ index = (unsigned char) u[i]; /* Is there a child node for this character? */ if (t->child_list[index] == NULL) { t->child_list[index] = trie_node_create(); if (index < t->first) t->first = index; if (index > t->last) t->last = index; } /* Move to the new node... and loop */ t = t->child_list[index]; } t->entry = s->entries; } /*- End of function --------------------------------------------------------*/ static void dump_trie(void) { int i; printf("\nstatic const at_cmd_service_t at_commands[] =\n{\n"); for (i = 0; wordlist[i]; i++) { switch (wordlist[i][0]) { case ' ': case ';': printf(" at_cmd_dummy,\n"); break; case '+': printf(" at_cmd_plus_%s,\n", wordlist[i] + 1); break; case '&': printf(" at_cmd_amp_%s,\n", wordlist[i] + 1); break; default: printf(" at_cmd_%s,\n", wordlist[i]); break; } } printf("};\n"); printf("\nstatic const uint16_t command_trie[] =\n{"); for (i = 0; i < packed_ptr; i++) { if ((i & 7) == 0) printf("\n "); printf("0x%04X, ", packed_trie[i]); } printf("\n};\n"); printf("\n#define COMMAND_TRIE_LEN %d\n", packed_ptr); } /*- End of function --------------------------------------------------------*/ int main(int argc, char *argv[]) { trie_t *s; int i; s = trie_create(); for (i = 0; wordlist[i]; i++) trie_add(s, wordlist[i], strlen(wordlist[i])); printf("// The trie contains %d entries\n", i); packed_ptr = 0; trie_recursive_add_node_numbers(s->root); packed_ptr = 0; trie_recursive_build_packed_trie(s->root); dump_trie(); return 0; } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/vector_float.c0000644000175000017500000002075411150047216020520 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * vector_float.c - Floating vector arithmetic routines. * * Written by Steve Underwood * * Copyright (C) 2006 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: vector_float.c,v 1.11 2008/07/02 14:48:26 steveu Exp $ */ /*! \file */ #if defined(HAVE_CONFIG_H) #include #endif #include #include #include #include #include "floating_fudge.h" #if defined(HAVE_TGMATH_H) #include #endif #if defined(HAVE_MATH_H) #include #endif #include #include "spandsp/telephony.h" #include "spandsp/vector_float.h" void vec_copyf(float z[], const float x[], int n) { int i; for (i = 0; i < n; i++) z[i] = x[i]; } /*- End of function --------------------------------------------------------*/ void vec_copy(double z[], const double x[], int n) { int i; for (i = 0; i < n; i++) z[i] = x[i]; } /*- End of function --------------------------------------------------------*/ #if defined(HAVE_LONG_DOUBLE) void vec_copyl(long double z[], const long double x[], int n) { int i; for (i = 0; i < n; i++) z[i] = x[i]; } /*- End of function --------------------------------------------------------*/ #endif void vec_zerof(float z[], int n) { int i; for (i = 0; i < n; i++) z[i] = 0.0f; } /*- End of function --------------------------------------------------------*/ void vec_zero(double z[], int n) { int i; for (i = 0; i < n; i++) z[i] = 0.0; } /*- End of function --------------------------------------------------------*/ #if defined(HAVE_LONG_DOUBLE) void vec_zerol(long double z[], int n) { int i; for (i = 0; i < n; i++) z[i] = 0.0; } /*- End of function --------------------------------------------------------*/ #endif void vec_setf(float z[], float x, int n) { int i; for (i = 0; i < n; i++) z[i] = x; } /*- End of function --------------------------------------------------------*/ void vec_set(double z[], double x, int n) { int i; for (i = 0; i < n; i++) z[i] = x; } /*- End of function --------------------------------------------------------*/ #if defined(HAVE_LONG_DOUBLE) void vec_setl(long double z[], long double x, int n) { int i; for (i = 0; i < n; i++) z[i] = x; } /*- End of function --------------------------------------------------------*/ #endif void vec_addf(float z[], const float x[], const float y[], int n) { int i; for (i = 0; i < n; i++) z[i] = x[i] + y[i]; } /*- End of function --------------------------------------------------------*/ void vec_add(double z[], const double x[], const double y[], int n) { int i; for (i = 0; i < n; i++) z[i] = x[i] + y[i]; } /*- End of function --------------------------------------------------------*/ void vec_addl(long double z[], const long double x[], const long double y[], int n) { int i; for (i = 0; i < n; i++) z[i] = x[i] + y[i]; } /*- End of function --------------------------------------------------------*/ void vec_scaled_addf(float z[], const float x[], float x_scale, const float y[], float y_scale, int n) { int i; for (i = 0; i < n; i++) z[i] = x[i]*x_scale + y[i]*y_scale; } /*- End of function --------------------------------------------------------*/ void vec_scaled_add(double z[], const double x[], double x_scale, const double y[], double y_scale, int n) { int i; for (i = 0; i < n; i++) z[i] = x[i]*x_scale + y[i]*y_scale; } /*- End of function --------------------------------------------------------*/ #if defined(HAVE_LONG_DOUBLE) void vec_scaled_addl(long double z[], const long double x[], long double x_scale, const long double y[], long double y_scale, int n) { int i; for (i = 0; i < n; i++) z[i] = x[i]*x_scale + y[i]*y_scale; } /*- End of function --------------------------------------------------------*/ #endif void vec_subf(float z[], const float x[], const float y[], int n) { int i; for (i = 0; i < n; i++) z[i] = x[i] - y[i]; } /*- End of function --------------------------------------------------------*/ void vec_sub(double z[], const double x[], const double y[], int n) { int i; for (i = 0; i < n; i++) z[i] = x[i] - y[i]; } /*- End of function --------------------------------------------------------*/ #if defined(HAVE_LONG_DOUBLE) void vec_subl(long double z[], const long double x[], const long double y[], int n) { int i; for (i = 0; i < n; i++) z[i] = x[i] - y[i]; } /*- End of function --------------------------------------------------------*/ #endif void vec_scaled_subf(float z[], const float x[], float x_scale, const float y[], float y_scale, int n) { int i; for (i = 0; i < n; i++) z[i] = x[i]*x_scale - y[i]*y_scale; } /*- End of function --------------------------------------------------------*/ void vec_scaled_sub(double z[], const double x[], double x_scale, const double y[], double y_scale, int n) { int i; for (i = 0; i < n; i++) z[i] = x[i]*x_scale - y[i]*y_scale; } /*- End of function --------------------------------------------------------*/ #if defined(HAVE_LONG_DOUBLE) void vec_scaled_subl(long double z[], const long double x[], long double x_scale, const long double y[], long double y_scale, int n) { int i; for (i = 0; i < n; i++) z[i] = x[i]*x_scale - y[i]*y_scale; } /*- End of function --------------------------------------------------------*/ #endif void vec_scalar_mulf(float z[], const float x[], float y, int n) { int i; for (i = 0; i < n; i++) z[i] = x[i]*y; } /*- End of function --------------------------------------------------------*/ void vec_scalar_mul(double z[], const double x[], double y, int n) { int i; for (i = 0; i < n; i++) z[i] = x[i]*y; } /*- End of function --------------------------------------------------------*/ #if defined(HAVE_LONG_DOUBLE) void vec_scalar_mull(long double z[], const long double x[], long double y, int n) { int i; for (i = 0; i < n; i++) z[i] = x[i]*y; } /*- End of function --------------------------------------------------------*/ #endif void vec_mulf(float z[], const float x[], const float y[], int n) { int i; for (i = 0; i < n; i++) z[i] = x[i]*y[i]; } /*- End of function --------------------------------------------------------*/ void vec_mul(double z[], const double x[], const double y[], int n) { int i; for (i = 0; i < n; i++) z[i] = x[i]*y[i]; } /*- End of function --------------------------------------------------------*/ #if defined(HAVE_LONG_DOUBLE) void vec_mull(long double z[], const long double x[], const long double y[], int n) { int i; for (i = 0; i < n; i++) z[i] = x[i]*y[i]; } /*- End of function --------------------------------------------------------*/ #endif float vec_dot_prodf(const float x[], const float y[], int n) { int i; float z; z = 0.0f; for (i = 0; i < n; i++) z += x[i]*y[i]; return z; } /*- End of function --------------------------------------------------------*/ double vec_dot_prod(const double x[], const double y[], int n) { int i; double z; z = 0.0; for (i = 0; i < n; i++) z += x[i]*y[i]; return z; } /*- End of function --------------------------------------------------------*/ #if defined(HAVE_LONG_DOUBLE) long double vec_dot_prodl(const long double x[], const long double y[], int n) { int i; long double z; z = 0.0; for (i = 0; i < n; i++) z += x[i]*y[i]; return z; } /*- End of function --------------------------------------------------------*/ #endif /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/bert.c0000644000175000017500000003556111150047216016767 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * bert.c - Bit error rate tests. * * Written by Steve Underwood * * Copyright (C) 2004 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: bert.c,v 1.27 2008/05/13 13:17:22 steveu Exp $ */ #if defined(HAVE_CONFIG_H) #include "config.h" #endif #include #include #include #include #include #include #include "spandsp/telephony.h" #include "spandsp/logging.h" #include "spandsp/async.h" #include "spandsp/bert.h" static const char *qbf = "VoyeZ Le BricK GeanT QuE J'ExaminE PreS Du WharF 123 456 7890 + - * : = $ % ( )" "ThE QuicK BrowN FoX JumpS OveR ThE LazY DoG 123 456 7890 + - * : = $ % ( )"; const char *bert_event_to_str(int event) { switch (event) { case BERT_REPORT_SYNCED: return "synced"; case BERT_REPORT_UNSYNCED: return "unsync'ed"; case BERT_REPORT_REGULAR: return "regular"; case BERT_REPORT_GT_10_2: return "error rate > 1 in 10^2"; case BERT_REPORT_LT_10_2: return "error rate < 1 in 10^2"; case BERT_REPORT_LT_10_3: return "error rate < 1 in 10^3"; case BERT_REPORT_LT_10_4: return "error rate < 1 in 10^4"; case BERT_REPORT_LT_10_5: return "error rate < 1 in 10^5"; case BERT_REPORT_LT_10_6: return "error rate < 1 in 10^6"; case BERT_REPORT_LT_10_7: return "error rate < 1 in 10^7"; } return "???"; } /*- End of function --------------------------------------------------------*/ int bert_get_bit(bert_state_t *s) { int bit; if (s->limit && s->tx_bits >= s->limit) return PUTBIT_END_OF_DATA; bit = 0; switch (s->pattern_class) { case 0: bit = s->tx_reg & 1; s->tx_reg = (s->tx_reg >> 1) | ((s->tx_reg & 1) << s->shift2); break; case 1: bit = s->tx_reg & 1; s->tx_reg = (s->tx_reg >> 1) | (((s->tx_reg ^ (s->tx_reg >> s->shift)) & 1) << s->shift2); if (s->max_zeros) { /* This generator suppresses runs >s->max_zeros */ if (bit) { if (++s->tx_zeros > s->max_zeros) { s->tx_zeros = 0; bit ^= 1; } } else { s->tx_zeros = 0; } } bit ^= s->invert; break; case 2: if (s->tx_step_bit == 0) { s->tx_step_bit = 7; s->tx_reg = qbf[s->tx_step++]; if (s->tx_reg == 0) { s->tx_reg = 'V'; s->tx_step = 1; } } bit = s->tx_reg & 1; s->tx_reg >>= 1; s->tx_step_bit--; break; } s->tx_bits++; return bit; } /*- End of function --------------------------------------------------------*/ static void assess_error_rate(bert_state_t *s) { int i; int j; int sum; int test; /* We assess the error rate in decadic steps. For each decade we assess the error over 10 times the number of bits, to smooth the result. This means we assess the 1 in 100 rate based on 1000 bits (i.e. we look for >=10 errors in 1000 bits). We make an assessment every 100 bits, using a sliding window over the last 1000 bits. We assess the 1 in 1000 rate over 10000 bits in a similar way, and so on for the lower error rates. */ test = TRUE; for (i = 2; i <= 7; i++) { if (++s->decade_ptr[i] < 10) break; /* This decade has reached 10 snapshots, so we need to touch the next decade */ s->decade_ptr[i] = 0; /* Sum the last 10 snapshots from this decade, to see if we overflow into the next decade */ for (sum = 0, j = 0; j < 10; j++) sum += s->decade_bad[i][j]; if (test && sum > 10) { /* We overflow into the next decade */ test = FALSE; if (s->error_rate != i && s->reporter) s->reporter(s->user_data, BERT_REPORT_GT_10_2 + i - 2, &s->results); s->error_rate = i; } s->decade_bad[i][0] = 0; if (i < 7) s->decade_bad[i + 1][s->decade_ptr[i + 1]] = sum; } if (i > 7) { if (s->decade_ptr[i] >= 10) s->decade_ptr[i] = 0; if (test) { if (s->error_rate != i && s->reporter) s->reporter(s->user_data, BERT_REPORT_GT_10_2 + i - 2, &s->results); s->error_rate = i; } } else { s->decade_bad[i][s->decade_ptr[i]] = 0; } } /*- End of function --------------------------------------------------------*/ void bert_put_bit(bert_state_t *s, int bit) { if (bit < 0) { /* Special conditions */ switch (bit) { case PUTBIT_TRAINING_IN_PROGRESS: span_log(&s->logging, SPAN_LOG_FLOW, "Training in progress\n"); break; case PUTBIT_TRAINING_FAILED: span_log(&s->logging, SPAN_LOG_FLOW, "Training failed\n"); break; case PUTBIT_TRAINING_SUCCEEDED: span_log(&s->logging, SPAN_LOG_FLOW, "Training succeeded\n"); break; case PUTBIT_CARRIER_UP: span_log(&s->logging, SPAN_LOG_FLOW, "Carrier up\n"); break; case PUTBIT_CARRIER_DOWN: span_log(&s->logging, SPAN_LOG_FLOW, "Carrier down\n"); break; default: span_log(&s->logging, SPAN_LOG_FLOW, "Eh!\n"); break; } return; } bit = (bit & 1) ^ s->invert; s->rx_bits++; switch (s->pattern_class) { case 0: if (s->resync) { s->rx_reg = (s->rx_reg >> 1) | (bit << s->shift2); s->ref_reg = (s->ref_reg >> 1) | ((s->ref_reg & 1) << s->shift2); if (s->rx_reg == s->ref_reg) { if (++s->resync > s->resync_time) { s->resync = 0; if (s->reporter) s->reporter(s->user_data, BERT_REPORT_SYNCED, &s->results); } } else { s->resync = 2; s->ref_reg = s->master_reg; } } else { s->results.total_bits++; if ((bit ^ s->ref_reg) & 1) s->results.bad_bits++; s->ref_reg = (s->ref_reg >> 1) | ((s->ref_reg & 1) << s->shift2); } break; case 1: if (s->resync) { /* If we get a reasonable period for which we correctly predict the next bit, we must be in sync. */ /* Don't worry about max. zeros tests when resyncing. It might just extend the resync time a little. Trying to include the test might affect robustness. */ if (bit == (int) ((s->rx_reg >> s->shift) & 1)) { if (++s->resync > s->resync_time) { s->resync = 0; if (s->reporter) s->reporter(s->user_data, BERT_REPORT_SYNCED, &s->results); } } else { s->resync = 2; s->rx_reg ^= s->mask; } } else { s->results.total_bits++; if (s->max_zeros) { /* This generator suppresses runs >s->max_zeros */ if ((s->rx_reg & s->mask)) { if (++s->rx_zeros > s->max_zeros) { s->rx_zeros = 0; bit ^= 1; } } else { s->rx_zeros = 0; } } if (bit != (int) ((s->rx_reg >> s->shift) & 1)) { s->results.bad_bits++; s->resync_bad_bits++; s->decade_bad[2][s->decade_ptr[2]]++; } if (--s->step <= 0) { /* Every hundred bits we need to do the error rate measurement */ s->step = 100; assess_error_rate(s); } if (--s->resync_cnt <= 0) { /* Check if there were enough bad bits during this period to justify a resync. */ if (s->resync_bad_bits >= (s->resync_len*s->resync_percent)/100) { s->resync = 1; s->results.resyncs++; if (s->reporter) s->reporter(s->user_data, BERT_REPORT_UNSYNCED, &s->results); } s->resync_cnt = s->resync_len; s->resync_bad_bits = 0; } } s->rx_reg = (s->rx_reg >> 1) | (((s->rx_reg ^ (s->rx_reg >> s->shift)) & 1) << s->shift2); break; case 2: s->rx_reg = (s->rx_reg >> 1) | (bit << 6); /* TODO: There is no mechanism for synching yet. This only works if things start in sync. */ if (++s->rx_step_bit == 7) { s->rx_step_bit = 0; if ((int) s->rx_reg != qbf[s->rx_step]) { /* We need to work out the number of actual bad bits here. We need to look at the error rate, and see it a resync is needed. etc. */ s->results.bad_bits++; } if (qbf[++s->rx_step] == '\0') s->rx_step = 0; } s->results.total_bits++; break; } if (s->report_frequency > 0) { if (--s->report_countdown <= 0) { if (s->reporter) s->reporter(s->user_data, BERT_REPORT_REGULAR, &s->results); s->report_countdown = s->report_frequency; } } } /*- End of function --------------------------------------------------------*/ int bert_result(bert_state_t *s, bert_results_t *results) { results->total_bits = s->results.total_bits; results->bad_bits = s->results.bad_bits; results->resyncs = s->results.resyncs; return sizeof(*results); } /*- End of function --------------------------------------------------------*/ void bert_set_report(bert_state_t *s, int freq, bert_report_func_t reporter, void *user_data) { s->report_frequency = freq; s->reporter = reporter; s->user_data = user_data; s->report_countdown = s->report_frequency; } /*- End of function --------------------------------------------------------*/ bert_state_t *bert_init(bert_state_t *s, int limit, int pattern, int resync_len, int resync_percent) { int i; int j; if (s == NULL) { if ((s = (bert_state_t *) malloc(sizeof(*s))) == NULL) return NULL; } memset(s, 0, sizeof(*s)); s->pattern = pattern; s->limit = limit; s->reporter = NULL; s->user_data = NULL; s->report_frequency = 0; s->resync_time = 72; s->invert = 0; switch (s->pattern) { case BERT_PATTERN_ZEROS: s->tx_reg = 0; s->shift2 = 31; s->pattern_class = 0; break; case BERT_PATTERN_ONES: s->tx_reg = ~((uint32_t) 0); s->shift2 = 31; s->pattern_class = 0; break; case BERT_PATTERN_7_TO_1: s->tx_reg = 0xFEFEFEFE; s->shift2 = 31; s->pattern_class = 0; break; case BERT_PATTERN_3_TO_1: s->tx_reg = 0xEEEEEEEE; s->shift2 = 31; s->pattern_class = 0; break; case BERT_PATTERN_1_TO_1: s->tx_reg = 0xAAAAAAAA; s->shift2 = 31; s->pattern_class = 0; break; case BERT_PATTERN_1_TO_3: s->tx_reg = 0x11111111; s->shift2 = 31; s->pattern_class = 0; break; case BERT_PATTERN_1_TO_7: s->tx_reg = 0x01010101; s->shift2 = 31; s->pattern_class = 0; break; case BERT_PATTERN_QBF: s->tx_reg = 0; s->pattern_class = 2; break; case BERT_PATTERN_ITU_O151_23: s->pattern_class = 1; s->tx_reg = 0x7FFFFF; s->mask = 0x20; s->shift = 5; s->shift2 = 22; s->invert = 1; s->resync_time = 56; s->max_zeros = 0; break; case BERT_PATTERN_ITU_O151_20: s->pattern_class = 1; s->tx_reg = 0xFFFFF; s->mask = 0x8; s->shift = 3; s->shift2 = 19; s->invert = 1; s->resync_time = 50; s->max_zeros = 14; break; case BERT_PATTERN_ITU_O151_15: s->pattern_class = 1; s->tx_reg = 0x7FFF; s->mask = 0x2; s->shift = 1; s->shift2 = 14; s->invert = 1; s->resync_time = 40; s->max_zeros = 0; break; case BERT_PATTERN_ITU_O152_11: s->pattern_class = 1; s->tx_reg = 0x7FF; s->mask = 0x4; s->shift = 2; s->shift2 = 10; s->invert = 0; s->resync_time = 32; s->max_zeros = 0; break; case BERT_PATTERN_ITU_O153_9: s->pattern_class = 1; s->tx_reg = 0x1FF; s->mask = 0x10; s->shift = 4; s->shift2 = 8; s->invert = 0; s->resync_time = 28; s->max_zeros = 0; break; } s->tx_bits = 0; s->tx_step = 0; s->tx_step_bit = 0; s->tx_zeros = 0; s->rx_reg = s->tx_reg; s->ref_reg = s->rx_reg; s->master_reg = s->ref_reg; s->rx_bits = 0; s->rx_step = 0; s->rx_step_bit = 0; s->resync = 1; s->resync_cnt = resync_len; s->resync_bad_bits = 0; s->resync_len = resync_len; s->resync_percent = resync_percent; s->results.total_bits = 0; s->results.bad_bits = 0; s->results.resyncs = 0; s->report_countdown = 0; for (i = 0; i < 8; i++) { for (j = 0; j < 10; j++) s->decade_bad[i][j] = 0; s->decade_ptr[i] = 0; } s->error_rate = 8; s->step = 100; span_log_init(&s->logging, SPAN_LOG_NONE, NULL); span_log_set_protocol(&s->logging, "BERT"); return s; } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/queue.c0000644000175000017500000002460411150047216017153 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * queue.c - simple in-process message queuing * * Written by Steve Underwood * * Copyright (C) 2004 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: queue.c,v 1.22 2008/05/15 14:26:30 steveu Exp $ */ /*! \file */ #if defined(HAVE_CONFIG_H) #include #endif #include #include #include #include #include #include #include #include "spandsp/queue.h" int queue_empty(queue_state_t *s) { return (s->iptr == s->optr); } /*- End of function --------------------------------------------------------*/ int queue_free_space(queue_state_t *s) { int len; if ((len = s->optr - s->iptr - 1) < 0) len += s->len; /*endif*/ return len; } /*- End of function --------------------------------------------------------*/ int queue_contents(queue_state_t *s) { int len; if ((len = s->iptr - s->optr) < 0) len += s->len; /*endif*/ return len; } /*- End of function --------------------------------------------------------*/ void queue_flush(queue_state_t *s) { s->optr = s->iptr; } /*- End of function --------------------------------------------------------*/ int queue_view(queue_state_t *s, uint8_t *buf, int len) { int real_len; int to_end; int iptr; int optr; /* Snapshot the values (although only iptr should be changeable during this processing) */ iptr = s->iptr; optr = s->optr; if ((real_len = iptr - optr) < 0) real_len += s->len; /*endif*/ if (real_len < len) { if (s->flags & QUEUE_READ_ATOMIC) return -1; /*endif*/ } else { real_len = len; } /*endif*/ if (real_len == 0) return 0; /*endif*/ to_end = s->len - optr; if (iptr < optr && to_end < real_len) { /* A two step process */ if (buf) { memcpy(buf, s->data + optr, to_end); memcpy(buf + to_end, s->data, real_len - to_end); } /*endif*/ } else { /* A one step process */ if (buf) memcpy(buf, s->data + optr, real_len); /*endif*/ } /*endif*/ return real_len; } /*- End of function --------------------------------------------------------*/ int queue_read(queue_state_t *s, uint8_t *buf, int len) { int real_len; int to_end; int new_optr; int iptr; int optr; /* Snapshot the values (although only iptr should be changeable during this processing) */ iptr = s->iptr; optr = s->optr; if ((real_len = iptr - optr) < 0) real_len += s->len; /*endif*/ if (real_len < len) { if (s->flags & QUEUE_READ_ATOMIC) return -1; /*endif*/ } else { real_len = len; } /*endif*/ if (real_len == 0) return 0; /*endif*/ to_end = s->len - optr; if (iptr < optr && to_end < real_len) { /* A two step process */ if (buf) { memcpy(buf, s->data + optr, to_end); memcpy(buf + to_end, s->data, real_len - to_end); } /*endif*/ new_optr = real_len - to_end; } else { /* A one step process */ if (buf) memcpy(buf, s->data + optr, real_len); /*endif*/ new_optr = optr + real_len; if (new_optr > s->len) new_optr = 0; /*endif*/ } /*endif*/ /* Only change the pointer now we have really finished */ s->optr = new_optr; return real_len; } /*- End of function --------------------------------------------------------*/ int queue_read_byte(queue_state_t *s) { int real_len; int to_end; int iptr; int optr; int byte; /* Snapshot the values (although only iptr should be changeable during this processing) */ iptr = s->iptr; optr = s->optr; if ((real_len = iptr - optr) < 0) real_len += s->len; /*endif*/ if (real_len < 1) return -1; /*endif*/ to_end = s->len - optr; byte = s->data[optr]; if (++optr >= s->len) optr = 0; /*endif*/ /* Only change the pointer now we have really finished */ s->optr = optr; return byte; } /*- End of function --------------------------------------------------------*/ int queue_write(queue_state_t *s, const uint8_t *buf, int len) { int real_len; int to_end; int new_iptr; int iptr; int optr; /* Snapshot the values (although only optr should be changeable during this processing) */ iptr = s->iptr; optr = s->optr; if ((real_len = optr - iptr - 1) < 0) real_len += s->len; /*endif*/ if (real_len < len) { if (s->flags & QUEUE_WRITE_ATOMIC) return -1; /*endif*/ } else { real_len = len; } /*endif*/ if (real_len == 0) return 0; /*endif*/ to_end = s->len - iptr; if (iptr < optr || to_end >= real_len) { /* A one step process */ memcpy(s->data + iptr, buf, real_len); new_iptr = iptr + real_len; if (new_iptr > s->len) new_iptr = 0; /*endif*/ } else { /* A two step process */ memcpy(s->data + iptr, buf, to_end); memcpy(s->data, buf + to_end, real_len - to_end); new_iptr = real_len - to_end; } /*endif*/ /* Only change the pointer now we have really finished */ s->iptr = new_iptr; return real_len; } /*- End of function --------------------------------------------------------*/ int queue_write_byte(queue_state_t *s, uint8_t byte) { int real_len; int iptr; int optr; /* Snapshot the values (although only optr should be changeable during this processing) */ iptr = s->iptr; optr = s->optr; if ((real_len = optr - iptr - 1) < 0) real_len += s->len; /*endif*/ if (real_len < 1) { if (s->flags & QUEUE_WRITE_ATOMIC) return -1; /*endif*/ return 0; } /*endif*/ s->data[iptr] = byte; if (++iptr >= s->len) iptr = 0; /*endif*/ /* Only change the pointer now we have really finished */ s->iptr = iptr; return 1; } /*- End of function --------------------------------------------------------*/ int queue_state_test_msg(queue_state_t *s) { uint16_t lenx; if (queue_view(s, (uint8_t *) &lenx, sizeof(uint16_t)) != sizeof(uint16_t)) return -1; /*endif*/ return lenx; } /*- End of function --------------------------------------------------------*/ int queue_read_msg(queue_state_t *s, uint8_t *buf, int len) { uint16_t lenx; /* If we assume the write message was atomic, this read message should be safe when conducted in multiple chunks */ if (queue_read(s, (uint8_t *) &lenx, sizeof(uint16_t)) != sizeof(uint16_t)) return -1; /*endif*/ /* If we got this far, the actual message chunk should be guaranteed to be available */ if (lenx == 0) return 0; /*endif*/ if ((int) lenx > len) { len = queue_read(s, buf, len); /* Discard the rest of the message */ queue_read(s, NULL, lenx - len); return len; } /*endif*/ return queue_read(s, buf, lenx); } /*- End of function --------------------------------------------------------*/ int queue_write_msg(queue_state_t *s, const uint8_t *buf, int len) { int real_len; int to_end; int new_iptr; int iptr; int optr; uint16_t lenx; /* Snapshot the values (although only optr should be changeable during this processing) */ iptr = s->iptr; optr = s->optr; if ((real_len = optr - iptr - 1) < 0) real_len += s->len; /*endif*/ if (real_len < len + sizeof(uint16_t)) return -1; /*endif*/ real_len = len + sizeof(uint16_t); to_end = s->len - iptr; lenx = (uint16_t) len; if (iptr < optr || to_end >= real_len) { /* A one step process */ memcpy(s->data + iptr, &lenx, sizeof(uint16_t)); memcpy(s->data + iptr + sizeof(uint16_t), buf, len); new_iptr = iptr + real_len; if (new_iptr > s->len) new_iptr = 0; /*endif*/ } else { /* A two step process */ if (to_end >= sizeof(uint16_t)) { /* The actual message wraps around the end of the buffer */ memcpy(s->data + iptr, &lenx, sizeof(uint16_t)); memcpy(s->data + iptr + sizeof(uint16_t), buf, to_end - sizeof(uint16_t)); memcpy(s->data, buf + to_end - sizeof(uint16_t), real_len - to_end); } else { /* The message length wraps around the end of the buffer */ memcpy(s->data + iptr, (uint8_t *) &lenx, to_end); memcpy(s->data, ((uint8_t *) &lenx) + to_end, sizeof(uint16_t) - to_end); memcpy(s->data + sizeof(uint16_t) - to_end, buf, len); } new_iptr = real_len - to_end; } /*endif*/ /* Only change the pointer now we have really finished */ s->iptr = new_iptr; return len; } /*- End of function --------------------------------------------------------*/ queue_state_t *queue_init(queue_state_t *s, int len, int flags) { if (s == NULL) { if ((s = (queue_state_t *) malloc(sizeof(*s) + len + 1)) == NULL) return NULL; } s->iptr = s->optr = 0; s->flags = flags; s->len = len + 1; return s; } /*- End of function --------------------------------------------------------*/ int queue_free(queue_state_t *s) { free(s); return 0; } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/v22bis_rx_1200_fixed_rrc.h0000644000175000017500000003306711150047216022346 0ustar julienjulien#define RX_PULSESHAPER_1200_GAIN 32767.000000f #define RX_PULSESHAPER_1200_COEFF_SETS 12 static const complexi16_t rx_pulseshaper_1200[RX_PULSESHAPER_1200_COEFF_SETS][37] = { { { 0, 0}, /* Filter 0 */ { 125, -40}, { 162, 118}, { 0, 257}, { -234, 170}, { -269, -87}, { -70, -216}, { 66, -90}, { -65, 0}, { -180, -248}, { 187, -576}, { 903, -293}, { 1071, 778}, { 0, 1705}, { -1676, 1218}, { -2284, -742}, { -825, -2540}, { 1681, -2314}, { 2960, 0}, { 1739, 2394}, { -884, 2721}, { -2540, 825}, { -1943, -1411}, { 0, -2072}, { 1379, -1002}, { 1259, 409}, { 293, 903}, { -356, 490}, { -307, 0}, { -38, -53}, { -34, 106}, { -216, 70}, { -229, -166}, { 0, -289}, { 208, -151}, { 191, 62}, { 40, 125} }, { { 0, 0}, /* Filter 1 */ { 131, -42}, { 166, 121}, { 0, 261}, { -235, 170}, { -266, -86}, { -67, -209}, { 58, -80}, { -83, 0}, { -194, -267}, { 195, -602}, { 932, -303}, { 1096, 796}, { 0, 1737}, { -1700, 1235}, { -2308, -749}, { -831, -2558}, { 1688, -2324}, { 2964, 0}, { 1737, 2391}, { -880, 2709}, { -2521, 819}, { -1922, -1396}, { 0, -2043}, { 1354, -983}, { 1228, 399}, { 284, 875}, { -340, 468}, { -284, 0}, { -28, -39}, { -38, 118}, { -222, 72}, { -231, -167}, { 0, -288}, { 205, -149}, { 185, 60}, { 39, 120} }, { { 0, 0}, /* Filter 2 */ { 136, -44}, { 171, 124}, { 0, 265}, { -235, 171}, { -264, -85}, { -65, -201}, { 51, -70}, { -101, 0}, { -207, -285}, { 204, -628}, { 961, -312}, { 1122, 815}, { 0, 1768}, { -1723, 1252}, { -2331, -757}, { -836, -2575}, { 1695, -2333}, { 2967, 0}, { 1734, 2387}, { -876, 2696}, { -2502, 813}, { -1901, -1381}, { 0, -2013}, { 1328, -965}, { 1198, 389}, { 275, 847}, { -324, 447}, { -262, 0}, { -18, -25}, { -41, 129}, { -228, 74}, { -232, -168}, { 0, -286}, { 201, -146}, { 180, 58}, { 37, 114} }, { { 0, 0}, /* Filter 3 */ { 142, -46}, { 175, 127}, { 0, 268}, { -236, 171}, { -260, -84}, { -63, -194}, { 43, -59}, { -120, 0}, { -221, -305}, { 212, -654}, { 990, -321}, { 1148, 834}, { 0, 1799}, { -1747, 1269}, { -2354, -764}, { -842, -2593}, { 1701, -2342}, { 2969, 0}, { 1730, 2382}, { -872, 2683}, { -2482, 806}, { -1880, -1366}, { 0, -1983}, { 1303, -946}, { 1168, 379}, { 266, 818}, { -309, 426}, { -241, 0}, { -8, -12}, { -45, 139}, { -234, 76}, { -233, -169}, { 0, -284}, { 198, -144}, { 175, 56}, { 35, 108} }, { { 0, 0}, /* Filter 4 */ { 148, -48}, { 179, 130}, { 0, 271}, { -236, 171}, { -257, -83}, { -60, -186}, { 35, -48}, { -139, 0}, { -235, -324}, { 221, -681}, { 1020, -331}, { 1174, 853}, { 0, 1830}, { -1769, 1285}, { -2376, -772}, { -847, -2609}, { 1707, -2350}, { 2971, 0}, { 1726, 2376}, { -867, 2670}, { -2462, 800}, { -1858, -1350}, { 0, -1953}, { 1277, -928}, { 1138, 370}, { 256, 790}, { -294, 405}, { -220, 0}, { 0, 0}, { -48, 149}, { -239, 77}, { -234, -170}, { 0, -282}, { 194, -141}, { 169, 55}, { 33, 103} }, { { 0, 0}, /* Filter 5 */ { 153, -49}, { 183, 133}, { 0, 274}, { -236, 171}, { -253, -82}, { -57, -177}, { 26, -37}, { -159, 0}, { -250, -344}, { 230, -708}, { 1049, -341}, { 1199, 871}, { 0, 1861}, { -1792, 1302}, { -2398, -779}, { -853, -2625}, { 1712, -2357}, { 2972, 0}, { 1722, 2371}, { -862, 2655}, { -2441, 793}, { -1837, -1334}, { 0, -1923}, { 1251, -909}, { 1108, 360}, { 247, 763}, { -279, 384}, { -199, 0}, { 9, 13}, { -51, 159}, { -244, 79}, { -235, -171}, { 0, -280}, { 191, -138}, { 164, 53}, { 31, 97} }, { { 0, 0}, /* Filter 6 */ { 159, -51}, { 187, 136}, { 0, 277}, { -236, 171}, { -249, -80}, { -54, -168}, { 18, -25}, { -178, 0}, { -264, -364}, { 239, -735}, { 1079, -350}, { 1225, 890}, { 0, 1892}, { -1814, 1318}, { -2420, -786}, { -858, -2641}, { 1718, -2364}, { 2972, 0}, { 1718, 2364}, { -858, 2641}, { -2420, 786}, { -1814, -1318}, { 0, -1892}, { 1225, -890}, { 1079, 350}, { 239, 735}, { -264, 364}, { -178, 0}, { 18, 25}, { -54, 168}, { -249, 80}, { -236, -171}, { 0, -277}, { 187, -136}, { 159, 51}, { 29, 92} }, { { 0, 0}, /* Filter 7 */ { 164, -53}, { 191, 138}, { 0, 280}, { -235, 171}, { -244, -79}, { -51, -159}, { 9, -13}, { -199, 0}, { -279, -384}, { 247, -763}, { 1108, -360}, { 1251, 909}, { 0, 1923}, { -1837, 1334}, { -2441, -793}, { -862, -2655}, { 1722, -2371}, { 2972, 0}, { 1712, 2357}, { -853, 2625}, { -2398, 779}, { -1792, -1302}, { 0, -1861}, { 1199, -871}, { 1049, 341}, { 230, 708}, { -250, 344}, { -159, 0}, { 26, 37}, { -57, 177}, { -253, 82}, { -236, -171}, { 0, -274}, { 183, -133}, { 153, 49}, { 28, 86} }, { { 0, 0}, /* Filter 8 */ { 169, -55}, { 194, 141}, { 0, 282}, { -234, 170}, { -239, -77}, { -48, -149}, { 0, 0}, { -220, 0}, { -294, -405}, { 256, -790}, { 1138, -370}, { 1277, 928}, { 0, 1953}, { -1858, 1350}, { -2462, -800}, { -867, -2670}, { 1726, -2376}, { 2971, 0}, { 1707, 2350}, { -847, 2609}, { -2376, 772}, { -1769, -1285}, { 0, -1830}, { 1174, -853}, { 1020, 331}, { 221, 681}, { -235, 324}, { -139, 0}, { 35, 48}, { -60, 186}, { -257, 83}, { -236, -171}, { 0, -271}, { 179, -130}, { 148, 48}, { 26, 81} }, { { 0, 0}, /* Filter 9 */ { 175, -56}, { 198, 144}, { 0, 284}, { -233, 169}, { -234, -76}, { -45, -139}, { -8, 12}, { -241, 0}, { -309, -426}, { 266, -818}, { 1168, -379}, { 1303, 946}, { 0, 1983}, { -1880, 1366}, { -2482, -806}, { -872, -2683}, { 1730, -2382}, { 2969, 0}, { 1701, 2342}, { -842, 2593}, { -2354, 764}, { -1747, -1269}, { 0, -1799}, { 1148, -834}, { 990, 321}, { 212, 654}, { -221, 305}, { -120, 0}, { 43, 59}, { -63, 194}, { -260, 84}, { -236, -171}, { 0, -268}, { 175, -127}, { 142, 46}, { 24, 75} }, { { 0, 0}, /* Filter 10 */ { 180, -58}, { 201, 146}, { 0, 286}, { -232, 168}, { -228, -74}, { -41, -129}, { -18, 25}, { -262, 0}, { -324, -447}, { 275, -847}, { 1198, -389}, { 1328, 965}, { 0, 2013}, { -1901, 1381}, { -2502, -813}, { -876, -2696}, { 1734, -2387}, { 2967, 0}, { 1695, 2333}, { -836, 2575}, { -2331, 757}, { -1723, -1252}, { 0, -1768}, { 1122, -815}, { 961, 312}, { 204, 628}, { -207, 285}, { -101, 0}, { 51, 70}, { -65, 201}, { -264, 85}, { -235, -171}, { 0, -265}, { 171, -124}, { 136, 44}, { 22, 70} }, { { 0, 0}, /* Filter 11 */ { 185, -60}, { 205, 149}, { 0, 288}, { -231, 167}, { -222, -72}, { -38, -118}, { -28, 39}, { -284, 0}, { -340, -468}, { 284, -875}, { 1228, -399}, { 1354, 983}, { 0, 2043}, { -1922, 1396}, { -2521, -819}, { -880, -2709}, { 1737, -2391}, { 2964, 0}, { 1688, 2324}, { -831, 2558}, { -2308, 749}, { -1700, -1235}, { 0, -1737}, { 1096, -796}, { 932, 303}, { 195, 602}, { -194, 267}, { -83, 0}, { 58, 80}, { -67, 209}, { -266, 86}, { -235, -170}, { 0, -261}, { 166, -121}, { 131, 42}, { 21, 65} } }; iaxmodem-1.2.0/lib/spandsp/src/v22bis_rx_1200_floating_rrc.h0000644000175000017500000005076111150047216023052 0ustar julienjulien#define RX_PULSESHAPER_1200_GAIN 1.000000f #define RX_PULSESHAPER_1200_COEFF_SETS 12 static const complexf_t rx_pulseshaper_1200[RX_PULSESHAPER_1200_COEFF_SETS][37] = { { { 0.0005944581f, -0.0018295539f}, /* Filter 0 */ { 0.0038355882f, -0.0012462581f}, { 0.0049609968f, 0.0036043752f}, { -0.0000000000f, 0.0078656419f}, { -0.0071488562f, 0.0051939480f}, { -0.0082219847f, -0.0026714848f}, { -0.0021426098f, -0.0065942748f}, { 0.0020161991f, -0.0027750599f}, { -0.0020114800f, -0.0000000000f}, { -0.0055144152f, -0.0075899414f}, { 0.0057163992f, -0.0175932678f}, { 0.0275887139f, -0.0089641165f}, { 0.0326864751f, 0.0237481142f}, { -0.0000000000f, 0.0520524432f}, { -0.0511755900f, 0.0371812426f}, { -0.0697114085f, -0.0226506097f}, { -0.0251880617f, -0.0775208828f}, { 0.0513295208f, -0.0706490244f}, { 0.0903420234f, 0.0000000000f}, { 0.0531017090f, 0.0730882322f}, { -0.0269855260f, 0.0830529093f}, { -0.0775208828f, 0.0251880617f}, { -0.0593000660f, -0.0430840199f}, { -0.0000000000f, -0.0632565081f}, { 0.0421113111f, -0.0305956585f}, { 0.0384252560f, 0.0124851225f}, { 0.0089641165f, 0.0275887139f}, { -0.0108732375f, 0.0149657275f}, { -0.0093816835f, 0.0000000000f}, { -0.0011823183f, -0.0016273215f}, { -0.0010599786f, 0.0032622786f}, { -0.0065942748f, 0.0021426098f}, { -0.0069940380f, -0.0050814660f}, { -0.0000000000f, -0.0088364722f}, { 0.0063634379f, -0.0046233083f}, { 0.0058320016f, 0.0018949322f}, { 0.0012462581f, 0.0038355882f} }, { { 0.0006465801f, -0.0019899690f}, /* Filter 1 */ { 0.0040066013f, -0.0013018237f}, { 0.0050934529f, 0.0037006101f}, { -0.0000000000f, 0.0079812854f}, { -0.0071761839f, 0.0052138028f}, { -0.0081457795f, -0.0026467242f}, { -0.0020744514f, -0.0063845049f}, { 0.0017937337f, -0.0024688626f}, { -0.0025533503f, -0.0000000000f}, { -0.0059239838f, -0.0081536643f}, { 0.0059724768f, -0.0183813935f}, { 0.0284672348f, -0.0092495653f}, { 0.0334715400f, 0.0243184973f}, { -0.0000000000f, 0.0530130803f}, { -0.0518963804f, 0.0377049274f}, { -0.0704369116f, -0.0228863399f}, { -0.0253682062f, -0.0780753105f}, { 0.0515426342f, -0.0709423499f}, { 0.0904586247f, 0.0000000000f}, { 0.0530207977f, 0.0729768673f}, { -0.0268674426f, 0.0826894857f}, { -0.0769505513f, 0.0250027498f}, { -0.0586725740f, -0.0426281202f}, { -0.0000000000f, -0.0623574663f}, { 0.0413316408f, -0.0300291948f}, { 0.0375040844f, 0.0121858157f}, { 0.0086805868f, 0.0267160989f}, { -0.0103918880f, 0.0143032067f}, { -0.0086971142f, 0.0000000000f}, { -0.0008717462f, -0.0011998558f}, { -0.0011727478f, 0.0036093465f}, { -0.0067921410f, 0.0022069004f}, { -0.0070502812f, -0.0051223291f}, { -0.0000000000f, -0.0087945988f}, { 0.0062655968f, -0.0045522226f}, { 0.0056738985f, 0.0018435614f}, { 0.0011906836f, 0.0036645473f} }, { { 0.0006992621f, -0.0021521075f}, /* Filter 2 */ { 0.0041774074f, -0.0013573219f}, { 0.0052236926f, 0.0037952348f}, { -0.0000000000f, 0.0080913986f}, { -0.0071967801f, 0.0052287668f}, { -0.0080593114f, -0.0026186290f}, { -0.0020023867f, -0.0061627125f}, { 0.0015632808f, -0.0021516714f}, { -0.0031086542f, -0.0000000000f}, { -0.0063406470f, -0.0087271518f}, { 0.0062314920f, -0.0191785603f}, { 0.0293513452f, -0.0095368301f}, { 0.0342577560f, 0.0248897166f}, { -0.0000000000f, 0.0539702141f}, { -0.0526102914f, 0.0382236141f}, { -0.0711499279f, -0.0231180130f}, { -0.0255430962f, -0.0786135668f}, { 0.0517441335f, -0.0712196898f}, { 0.0905540931f, 0.0000000000f}, { 0.0529275462f, 0.0728485177f}, { -0.0267433682f, 0.0823076239f}, { -0.0763645934f, 0.0248123605f}, { -0.0580350475f, -0.0421649301f}, { -0.0000000000f, -0.0614507444f}, { 0.0405498128f, -0.0294611635f}, { 0.0365850135f, 0.0118871915f}, { 0.0083990788f, 0.0258497066f}, { -0.0099164224f, 0.0136487845f}, { -0.0080249289f, 0.0000000000f}, { -0.0005691347f, -0.0007833467f}, { -0.0012813449f, 0.0039435742f}, { -0.0069782257f, 0.0022673630f}, { -0.0070980966f, -0.0051570691f}, { -0.0000000000f, -0.0087448582f}, { 0.0061636632f, -0.0044781635f}, { 0.0055136150f, 0.0017914821f}, { 0.0011351585f, 0.0034936588f} }, { { 0.0007524586f, -0.0023158293f}, /* Filter 3 */ { 0.0043478209f, -0.0014126926f}, { 0.0053515345f, 0.0038881174f}, { -0.0000000000f, 0.0081957427f}, { -0.0072104667f, 0.0052387107f}, { -0.0079624054f, -0.0025871424f}, { -0.0019263796f, -0.0059287867f}, { 0.0013248222f, -0.0018234614f}, { -0.0036773273f, -0.0000000000f}, { -0.0067643060f, -0.0093102685f}, { 0.0064933625f, -0.0199845150f}, { 0.0302407132f, -0.0098258033f}, { 0.0350448010f, 0.0254615384f}, { -0.0000000000f, 0.0549234238f}, { -0.0533169949f, 0.0387370642f}, { -0.0718501024f, -0.0233455134f}, { -0.0257126472f, -0.0791353911f}, { 0.0519339297f, -0.0714809219f}, { 0.0906283998f, 0.0000000000f}, { 0.0528219995f, 0.0727032451f}, { -0.0266133659f, 0.0819075180f}, { -0.0757632982f, 0.0246169878f}, { -0.0573877799f, -0.0416946627f}, { -0.0000000000f, -0.0605367479f}, { 0.0397661628f, -0.0288918084f}, { 0.0356684082f, 0.0115893684f}, { 0.0081196950f, 0.0249898517f}, { -0.0094469844f, 0.0130026585f}, { -0.0073652682f, 0.0000000000f}, { -0.0002745080f, -0.0003778279f}, { -0.0013857854f, 0.0042650089f}, { -0.0071526572f, 0.0023240392f}, { -0.0071376445f, -0.0051858023f}, { -0.0000000000f, -0.0086874779f}, { 0.0060578290f, -0.0044012704f}, { 0.0053513607f, 0.0017387625f}, { 0.0010797387f, 0.0033230939f} }, { { 0.0008061228f, -0.0024809909f}, /* Filter 4 */ { 0.0045176541f, -0.0014678748f}, { 0.0054767942f, 0.0039791239f}, { -0.0000000000f, 0.0082940836f}, { -0.0072170648f, 0.0052435045f}, { -0.0078548930f, -0.0025522094f}, { -0.0018463962f, -0.0056826233f}, { 0.0010783437f, -0.0014842128f}, { -0.0042592917f, -0.0000000000f}, { -0.0071948553f, -0.0099028688f}, { 0.0067580050f, -0.0207990006f}, { 0.0311350075f, -0.0101163772f}, { 0.0358323492f, 0.0260337255f}, { -0.0000000000f, 0.0558722880f}, { -0.0540161669f, 0.0392450425f}, { -0.0725371076f, -0.0235687350f}, { -0.0258767749f, -0.0796405240f}, { 0.0521119220f, -0.0717259073f}, { 0.0906815023f, 0.0000000000f}, { 0.0527042181f, 0.0725411330f}, { -0.0264775002f, 0.0814893666f}, { -0.0751469523f, 0.0244167249f}, { -0.0567310773f, -0.0412175403f}, { -0.0000000000f, -0.0596159016f}, { 0.0389810295f, -0.0283213757f}, { 0.0347546342f, 0.0112924652f}, { 0.0078425317f, 0.0241368306f}, { -0.0089837114f, 0.0123650179f}, { -0.0067182711f, 0.0000000000f}, { 0.0000121147f, 0.0000166744f}, { -0.0014860895f, 0.0045737133f}, { -0.0073155681f, 0.0023769722f}, { -0.0071690834f, -0.0052086440f}, { -0.0000000000f, -0.0086226877f}, { 0.0059482846f, -0.0043216818f}, { 0.0051873402f, 0.0016854690f}, { 0.0010244801f, 0.0031530254f} }, { { 0.0008602070f, -0.0026474449f}, /* Filter 5 */ { 0.0046867184f, -0.0015228071f}, { 0.0055992856f, 0.0040681191f}, { -0.0000000000f, 0.0083861837f}, { -0.0072163979f, 0.0052430199f}, { -0.0077366100f, -0.0025137770f}, { -0.0017624047f, -0.0054241238f}, { 0.0008238360f, -0.0011339130f}, { -0.0048544647f, -0.0000000000f}, { -0.0076321872f, -0.0105048045f}, { 0.0070253327f, -0.0216217509f}, { 0.0320338908f, -0.0104084421f}, { 0.0366200761f, 0.0266060427f}, { -0.0000000000f, 0.0568163868f}, { -0.0547074810f, 0.0397473115f}, { -0.0732106139f, -0.0237875704f}, { -0.0260354008f, -0.0801287243f}, { 0.0522780261f, -0.0719545300f}, { 0.0907133744f, 0.0000000000f}, { 0.0525742489f, 0.0723622457f}, { -0.0263358366f, 0.0810533708f}, { -0.0745158480f, 0.0242116667f}, { -0.0560652526f, -0.0407337903f}, { -0.0000000000f, -0.0586886174f}, { 0.0381947481f, -0.0277501089f}, { 0.0338440552f, 0.0109966001f}, { 0.0075676877f, 0.0232909479f}, { -0.0085267369f, 0.0117360466f}, { -0.0060840594f, 0.0000000000f}, { 0.0002907188f, 0.0004001402f}, { -0.0015822779f, 0.0048697507f}, { -0.0074671003f, 0.0024262080f}, { -0.0071925765f, -0.0052257127f}, { -0.0000000000f, -0.0085507200f}, { 0.0058352199f, -0.0042395355f}, { 0.0050217593f, 0.0016316685f}, { 0.0009694368f, 0.0029836196f} }, { { 0.0009146617f, -0.0028150393f}, /* Filter 6 */ { 0.0048548193f, -0.0015774264f}, { 0.0057188240f, 0.0041549688f}, { -0.0000000000f, 0.0084718067f}, { -0.0072082928f, 0.0052371313f}, { -0.0076073982f, -0.0024717935f}, { -0.0016743743f, -0.0051531942f}, { 0.0005612938f, -0.0007725546f}, { -0.0054627541f, -0.0000000000f}, { -0.0080761873f, -0.0111159182f}, { 0.0072952570f, -0.0224524923f}, { 0.0329370235f, -0.0107018877f}, { 0.0374076526f, 0.0271782505f}, { -0.0000000000f, 0.0577553021f}, { -0.0553906148f, 0.0402436373f}, { -0.0738702978f, -0.0240019147f}, { -0.0261884465f, -0.0805997506f}, { 0.0524321605f, -0.0721666777f}, { 0.0907240049f, 0.0000000000f}, { 0.0524321605f, 0.0721666777f}, { -0.0261884465f, 0.0805997506f}, { -0.0738702978f, 0.0240019147f}, { -0.0553906148f, -0.0402436373f}, { -0.0000000000f, -0.0577553021f}, { 0.0374076525f, -0.0271782505f}, { 0.0329370235f, 0.0107018876f}, { 0.0072952570f, 0.0224524923f}, { -0.0080761873f, 0.0111159182f}, { -0.0054627541f, 0.0000000000f}, { 0.0005612938f, 0.0007725546f}, { -0.0016743743f, 0.0051531942f}, { -0.0076073982f, 0.0024717935f}, { -0.0072082928f, -0.0052371313f}, { -0.0000000000f, -0.0084718067f}, { 0.0057188240f, -0.0041549688f}, { 0.0048548193f, 0.0015774264f}, { 0.0009146617f, 0.0028150393f} }, { { 0.0009694368f, -0.0029836196f}, /* Filter 7 */ { 0.0050217593f, -0.0016316685f}, { 0.0058352199f, 0.0042395355f}, { -0.0000000000f, 0.0085507200f}, { -0.0071925765f, 0.0052257127f}, { -0.0074671003f, -0.0024262080f}, { -0.0015822779f, -0.0048697507f}, { 0.0002907188f, -0.0004001402f}, { -0.0060840594f, -0.0000000000f}, { -0.0085267369f, -0.0117360466f}, { 0.0075676877f, -0.0232909479f}, { 0.0338440552f, -0.0109966001f}, { 0.0381947481f, 0.0277501089f}, { -0.0000000000f, 0.0586886174f}, { -0.0560652526f, 0.0407337903f}, { -0.0745158480f, -0.0242116667f}, { -0.0263358366f, -0.0810533708f}, { 0.0525742489f, -0.0723622457f}, { 0.0907133744f, 0.0000000000f}, { 0.0522780261f, 0.0719545299f}, { -0.0260354008f, 0.0801287243f}, { -0.0732106139f, 0.0237875704f}, { -0.0547074810f, -0.0397473115f}, { -0.0000000000f, -0.0568163868f}, { 0.0366200761f, -0.0266060427f}, { 0.0320338908f, 0.0104084421f}, { 0.0070253327f, 0.0216217509f}, { -0.0076321872f, 0.0105048045f}, { -0.0048544647f, 0.0000000000f}, { 0.0008238360f, 0.0011339130f}, { -0.0017624047f, 0.0054241238f}, { -0.0077366100f, 0.0025137770f}, { -0.0072163979f, -0.0052430199f}, { -0.0000000000f, -0.0083861837f}, { 0.0055992856f, -0.0040681191f}, { 0.0046867184f, 0.0015228071f}, { 0.0008602070f, 0.0026474449f} }, { { 0.0010244801f, -0.0031530254f}, /* Filter 8 */ { 0.0051873402f, -0.0016854690f}, { 0.0059482846f, 0.0043216818f}, { -0.0000000000f, 0.0086226877f}, { -0.0071690834f, 0.0052086440f}, { -0.0073155681f, -0.0023769722f}, { -0.0014860895f, -0.0045737133f}, { 0.0000121147f, -0.0000166744f}, { -0.0067182711f, -0.0000000000f}, { -0.0089837114f, -0.0123650179f}, { 0.0078425317f, -0.0241368306f}, { 0.0347546343f, -0.0112924652f}, { 0.0389810295f, 0.0283213757f}, { -0.0000000000f, 0.0596159016f}, { -0.0567310773f, 0.0412175403f}, { -0.0751469523f, -0.0244167249f}, { -0.0264775002f, -0.0814893666f}, { 0.0527042181f, -0.0725411330f}, { 0.0906815023f, 0.0000000000f}, { 0.0521119220f, 0.0717259073f}, { -0.0258767749f, 0.0796405240f}, { -0.0725371076f, 0.0235687350f}, { -0.0540161669f, -0.0392450425f}, { -0.0000000000f, -0.0558722880f}, { 0.0358323491f, -0.0260337255f}, { 0.0311350075f, 0.0101163772f}, { 0.0067580050f, 0.0207990006f}, { -0.0071948553f, 0.0099028688f}, { -0.0042592917f, 0.0000000000f}, { 0.0010783437f, 0.0014842128f}, { -0.0018463962f, 0.0056826233f}, { -0.0078548930f, 0.0025522094f}, { -0.0072170648f, -0.0052435045f}, { -0.0000000000f, -0.0082940836f}, { 0.0054767942f, -0.0039791239f}, { 0.0045176541f, 0.0014678748f}, { 0.0008061228f, 0.0024809909f} }, { { 0.0010797387f, -0.0033230939f}, /* Filter 9 */ { 0.0053513607f, -0.0017387625f}, { 0.0060578290f, 0.0044012704f}, { -0.0000000000f, 0.0086874779f}, { -0.0071376445f, 0.0051858023f}, { -0.0071526572f, -0.0023240392f}, { -0.0013857854f, -0.0042650089f}, { -0.0002745080f, 0.0003778279f}, { -0.0073652682f, -0.0000000000f}, { -0.0094469844f, -0.0130026585f}, { 0.0081196950f, -0.0249898517f}, { 0.0356684082f, -0.0115893684f}, { 0.0397661628f, 0.0288918084f}, { -0.0000000000f, 0.0605367479f}, { -0.0573877799f, 0.0416946627f}, { -0.0757632982f, -0.0246169878f}, { -0.0266133659f, -0.0819075180f}, { 0.0528219995f, -0.0727032451f}, { 0.0906283998f, 0.0000000000f}, { 0.0519339297f, 0.0714809218f}, { -0.0257126472f, 0.0791353911f}, { -0.0718501024f, 0.0233455134f}, { -0.0533169949f, -0.0387370642f}, { -0.0000000000f, -0.0549234238f}, { 0.0350448010f, -0.0254615383f}, { 0.0302407132f, 0.0098258033f}, { 0.0064933625f, 0.0199845150f}, { -0.0067643060f, 0.0093102685f}, { -0.0036773273f, 0.0000000000f}, { 0.0013248222f, 0.0018234614f}, { -0.0019263796f, 0.0059287867f}, { -0.0079624054f, 0.0025871424f}, { -0.0072104667f, -0.0052387107f}, { -0.0000000000f, -0.0081957427f}, { 0.0053515345f, -0.0038881174f}, { 0.0043478209f, 0.0014126926f}, { 0.0007524586f, 0.0023158293f} }, { { 0.0011351585f, -0.0034936588f}, /* Filter 10 */ { 0.0055136150f, -0.0017914821f}, { 0.0061636632f, 0.0044781635f}, { -0.0000000000f, 0.0087448582f}, { -0.0070980966f, 0.0051570691f}, { -0.0069782257f, -0.0022673630f}, { -0.0012813449f, -0.0039435742f}, { -0.0005691347f, 0.0007833467f}, { -0.0080249289f, -0.0000000000f}, { -0.0099164224f, -0.0136487845f}, { 0.0083990788f, -0.0258497066f}, { 0.0365850135f, -0.0118871915f}, { 0.0405498128f, 0.0294611635f}, { -0.0000000000f, 0.0614507444f}, { -0.0580350475f, 0.0421649301f}, { -0.0763645934f, -0.0248123605f}, { -0.0267433682f, -0.0823076239f}, { 0.0529275462f, -0.0728485177f}, { 0.0905540931f, 0.0000000000f}, { 0.0517441335f, 0.0712196898f}, { -0.0255430962f, 0.0786135668f}, { -0.0711499279f, 0.0231180130f}, { -0.0526102914f, -0.0382236141f}, { -0.0000000000f, -0.0539702141f}, { 0.0342577560f, -0.0248897166f}, { 0.0293513451f, 0.0095368301f}, { 0.0062314920f, 0.0191785603f}, { -0.0063406470f, 0.0087271518f}, { -0.0031086542f, 0.0000000000f}, { 0.0015632808f, 0.0021516714f}, { -0.0020023867f, 0.0061627125f}, { -0.0080593114f, 0.0026186290f}, { -0.0071967801f, -0.0052287668f}, { -0.0000000000f, -0.0080913986f}, { 0.0052236926f, -0.0037952348f}, { 0.0041774074f, 0.0013573219f}, { 0.0006992621f, 0.0021521075f} }, { { 0.0011906836f, -0.0036645473f}, /* Filter 11 */ { 0.0056738985f, -0.0018435614f}, { 0.0062655968f, 0.0045522226f}, { -0.0000000000f, 0.0087945988f}, { -0.0070502812f, 0.0051223291f}, { -0.0067921410f, -0.0022069004f}, { -0.0011727478f, -0.0036093465f}, { -0.0008717462f, 0.0011998558f}, { -0.0086971142f, -0.0000000000f}, { -0.0103918880f, -0.0143032067f}, { 0.0086805868f, -0.0267160990f}, { 0.0375040844f, -0.0121858157f}, { 0.0413316408f, 0.0300291948f}, { -0.0000000000f, 0.0623574663f}, { -0.0586725740f, 0.0426281202f}, { -0.0769505513f, -0.0250027498f}, { -0.0268674426f, -0.0826894857f}, { 0.0530207977f, -0.0729768673f}, { 0.0904586247f, 0.0000000000f}, { 0.0515426342f, 0.0709423499f}, { -0.0253682062f, 0.0780753105f}, { -0.0704369116f, 0.0228863399f}, { -0.0518963804f, -0.0377049274f}, { -0.0000000000f, -0.0530130803f}, { 0.0334715400f, -0.0243184973f}, { 0.0284672348f, 0.0092495653f}, { 0.0059724768f, 0.0183813935f}, { -0.0059239838f, 0.0081536643f}, { -0.0025533503f, 0.0000000000f}, { 0.0017937337f, 0.0024688626f}, { -0.0020744514f, 0.0063845049f}, { -0.0081457795f, 0.0026467242f}, { -0.0071761839f, -0.0052138028f}, { -0.0000000000f, -0.0079812854f}, { 0.0050934529f, -0.0037006101f}, { 0.0040066013f, 0.0013018237f}, { 0.0006465801f, 0.0019899690f} } }; iaxmodem-1.2.0/lib/spandsp/src/g711.c0000644000175000017500000001523111150047216016502 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * g711.c - A-law and u-law transcoding routines * * Written by Steve Underwood * * Copyright (C) 2006 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: g711.c,v 1.11 2008/07/02 14:48:25 steveu Exp $ */ /*! \file */ #if defined(HAVE_CONFIG_H) #include #endif #include #include #include #include "floating_fudge.h" #if defined(HAVE_TGMATH_H) #include #endif #if defined(HAVE_MATH_H) #include #endif #include #include "spandsp/telephony.h" #include "spandsp/bit_operations.h" #include "spandsp/g711.h" /* Copied from the CCITT G.711 specification */ static const uint8_t ulaw_to_alaw_table[256] = { 42, 43, 40, 41, 46, 47, 44, 45, 34, 35, 32, 33, 38, 39, 36, 37, 58, 59, 56, 57, 62, 63, 60, 61, 50, 51, 48, 49, 54, 55, 52, 53, 10, 11, 8, 9, 14, 15, 12, 13, 2, 3, 0, 1, 6, 7, 4, 26, 27, 24, 25, 30, 31, 28, 29, 18, 19, 16, 17, 22, 23, 20, 21, 106, 104, 105, 110, 111, 108, 109, 98, 99, 96, 97, 102, 103, 100, 101, 122, 120, 126, 127, 124, 125, 114, 115, 112, 113, 118, 119, 116, 117, 75, 73, 79, 77, 66, 67, 64, 65, 70, 71, 68, 69, 90, 91, 88, 89, 94, 95, 92, 93, 82, 82, 83, 83, 80, 80, 81, 81, 86, 86, 87, 87, 84, 84, 85, 85, 170, 171, 168, 169, 174, 175, 172, 173, 162, 163, 160, 161, 166, 167, 164, 165, 186, 187, 184, 185, 190, 191, 188, 189, 178, 179, 176, 177, 182, 183, 180, 181, 138, 139, 136, 137, 142, 143, 140, 141, 130, 131, 128, 129, 134, 135, 132, 154, 155, 152, 153, 158, 159, 156, 157, 146, 147, 144, 145, 150, 151, 148, 149, 234, 232, 233, 238, 239, 236, 237, 226, 227, 224, 225, 230, 231, 228, 229, 250, 248, 254, 255, 252, 253, 242, 243, 240, 241, 246, 247, 244, 245, 203, 201, 207, 205, 194, 195, 192, 193, 198, 199, 196, 197, 218, 219, 216, 217, 222, 223, 220, 221, 210, 210, 211, 211, 208, 208, 209, 209, 214, 214, 215, 215, 212, 212, 213, 213 }; /* These transcoding tables are copied from the CCITT G.711 specification. To achieve optimal results, do not change them. */ static const uint8_t alaw_to_ulaw_table[256] = { 42, 43, 40, 41, 46, 47, 44, 45, 34, 35, 32, 33, 38, 39, 36, 37, 57, 58, 55, 56, 61, 62, 59, 60, 49, 50, 47, 48, 53, 54, 51, 52, 10, 11, 8, 9, 14, 15, 12, 13, 2, 3, 0, 1, 6, 7, 4, 5, 26, 27, 24, 25, 30, 31, 28, 29, 18, 19, 16, 17, 22, 23, 20, 21, 98, 99, 96, 97, 102, 103, 100, 101, 93, 93, 92, 92, 95, 95, 94, 94, 116, 118, 112, 114, 124, 126, 120, 122, 106, 107, 104, 105, 110, 111, 108, 109, 72, 73, 70, 71, 76, 77, 74, 75, 64, 65, 63, 63, 68, 69, 66, 67, 86, 87, 84, 85, 90, 91, 88, 89, 79, 79, 78, 78, 82, 83, 80, 81, 170, 171, 168, 169, 174, 175, 172, 173, 162, 163, 160, 161, 166, 167, 164, 165, 185, 186, 183, 184, 189, 190, 187, 188, 177, 178, 175, 176, 181, 182, 179, 180, 138, 139, 136, 137, 142, 143, 140, 141, 130, 131, 128, 129, 134, 135, 132, 133, 154, 155, 152, 153, 158, 159, 156, 157, 146, 147, 144, 145, 150, 151, 148, 149, 226, 227, 224, 225, 230, 231, 228, 229, 221, 221, 220, 220, 223, 223, 222, 222, 244, 246, 240, 242, 252, 254, 248, 250, 234, 235, 232, 233, 238, 239, 236, 237, 200, 201, 198, 199, 204, 205, 202, 203, 192, 193, 191, 191, 196, 197, 194, 195, 214, 215, 212, 213, 218, 219, 216, 217, 207, 207, 206, 206, 210, 211, 208, 209 }; uint8_t alaw_to_ulaw(uint8_t alaw) { return alaw_to_ulaw_table[alaw]; } /*- End of function --------------------------------------------------------*/ uint8_t ulaw_to_alaw(uint8_t ulaw) { return ulaw_to_alaw_table[ulaw]; } /*- End of function --------------------------------------------------------*/ int g711_decode(g711_state_t *s, int16_t amp[], const uint8_t g711_data[], int g711_bytes) { int i; if (s->mode == G711_ALAW) { for (i = 0; i < g711_bytes; i++) amp[i] = alaw_to_linear(g711_data[i]); /*endfor*/ } else { for (i = 0; i < g711_bytes; i++) amp[i] = ulaw_to_linear(g711_data[i]); /*endfor*/ } /*endif*/ return g711_bytes; } /*- End of function --------------------------------------------------------*/ int g711_encode(g711_state_t *s, uint8_t g711_data[], const int16_t amp[], int len) { int i; if (s->mode == G711_ALAW) { for (i = 0; i < len; i++) g711_data[i] = linear_to_alaw(amp[i]); /*endfor*/ } else { for (i = 0; i < len; i++) g711_data[i] = linear_to_ulaw(amp[i]); /*endfor*/ } /*endif*/ return len; } /*- End of function --------------------------------------------------------*/ int g711_transcode(g711_state_t *s, uint8_t g711_out[], const uint8_t g711_in[], int g711_bytes) { int i; if (s->mode == G711_ALAW) { for (i = 0; i < g711_bytes; i++) g711_out[i] = alaw_to_ulaw_table[g711_in[i]]; /*endfor*/ } else { for (i = 0; i < g711_bytes; i++) g711_out[i] = ulaw_to_alaw_table[g711_in[i]]; /*endfor*/ } /*endif*/ return g711_bytes; } /*- End of function --------------------------------------------------------*/ g711_state_t *g711_init(g711_state_t *s, int mode) { if (s == NULL) { if ((s = (g711_state_t *) malloc(sizeof(*s))) == NULL) return NULL; } s->mode = mode; return s; } /*- End of function --------------------------------------------------------*/ int g711_release(g711_state_t *s) { free(s); return 0; } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/v27ter_rx_4800_floating_rrc.h0000644000175000017500000002417211150047216023102 0ustar julienjulien#define RX_PULSESHAPER_4800_GAIN 1.000000f #define RX_PULSESHAPER_4800_COEFF_SETS 8 static const complexf_t rx_pulseshaper_4800[RX_PULSESHAPER_4800_COEFF_SETS][27] = { { { -0.0033256218f, -0.0016944890f}, /* Filter 0 */ { 0.0009305771f, -0.0028640219f}, { -0.0015971835f, -0.0002529690f}, { 0.0000000000f, -0.0071280394f}, { 0.0079803629f, -0.0012639653f}, { 0.0000856199f, 0.0002635111f}, { 0.0134186592f, -0.0068371484f}, { 0.0173489890f, 0.0238788348f}, { -0.0212482252f, 0.0212482252f}, { -0.0043725352f, -0.0031768328f}, { -0.0212278148f, 0.0416619324f}, { -0.1104697471f, -0.0358937967f}, { 0.0285220984f, -0.1800814422f}, { 0.2227359376f, 0.0000000000f}, { 0.0348435773f, 0.2199936886f}, { -0.1734025016f, 0.0563418882f}, { -0.0527331603f, -0.1034946543f}, { 0.0378282430f, -0.0274838273f}, { -0.0038217359f, -0.0038217359f}, { 0.0176626696f, -0.0243105791f}, { 0.0262988265f, 0.0133999214f}, { -0.0046538310f, 0.0143230189f}, { 0.0002736608f, 0.0000433436f}, { 0.0000000000f, 0.0080798392f}, { -0.0070402814f, 0.0011150710f}, { -0.0004997091f, -0.0015379465f}, { -0.0026831867f, 0.0013671519f} }, { { -0.0034458238f, -0.0017557349f}, /* Filter 1 */ { 0.0008096319f, -0.0024917908f}, { -0.0023281305f, -0.0003687396f}, { 0.0000000000f, -0.0076128677f}, { 0.0075308694f, -0.0011927725f}, { -0.0004118109f, -0.0012674236f}, { 0.0152885238f, -0.0077898920f}, { 0.0179999198f, 0.0247747642f}, { -0.0201560074f, 0.0201560073f}, { -0.0002450506f, -0.0001780397f}, { -0.0248951628f, 0.0488595080f}, { -0.1189640874f, -0.0386537751f}, { 0.0295975058f, -0.1868712970f}, { 0.2251016174f, 0.0000000000f}, { 0.0343715984f, 0.2170137312f}, { -0.1664714744f, 0.0540898609f}, { -0.0486568478f, -0.0954944407f}, { 0.0315222376f, -0.0229022462f}, { -0.0071130021f, -0.0071130021f}, { 0.0183322510f, -0.0252321788f}, { 0.0251163790f, 0.0127974343f}, { -0.0040031308f, 0.0123203697f}, { 0.0017373694f, 0.0002751723f}, { 0.0000000000f, 0.0083907693f}, { -0.0064895990f, 0.0010278515f}, { -0.0002763861f, -0.0008506290f}, { -0.0029729852f, 0.0015148116f} }, { { -0.0035131448f, -0.0017900367f}, /* Filter 2 */ { 0.0006690952f, -0.0020592633f}, { -0.0030664478f, -0.0004856776f}, { 0.0000000000f, -0.0080135090f}, { 0.0069350877f, -0.0010984100f}, { -0.0009454877f, -0.0029099119f}, { 0.0171306792f, -0.0087285170f}, { 0.0185057200f, 0.0254709384f}, { -0.0187663603f, 0.0187663602f}, { 0.0042370446f, 0.0030783931f}, { -0.0286756337f, 0.0562791000f}, { -0.1273684894f, -0.0413845309f}, { 0.0306020346f, -0.1932136421f}, { 0.2268016406f, 0.0000000000f}, { 0.0338005382f, 0.2134081993f}, { -0.1591873153f, 0.0517230941f}, { -0.0445801870f, -0.0874935433f}, { 0.0254709341f, -0.0185057168f}, { -0.0100839969f, -0.0100839969f}, { 0.0187737877f, -0.0258399020f}, { 0.0237628386f, 0.0121077710f}, { -0.0033572432f, 0.0103325321f}, { 0.0030664735f, 0.0004856817f}, { 0.0000000000f, 0.0085629052f}, { -0.0058786966f, 0.0009310941f}, { -0.0000612735f, -0.0001885803f}, { -0.0032022929f, 0.0016316497f} }, { { -0.0035245124f, -0.0017958288f}, /* Filter 3 */ { 0.0005101233f, -0.0015699981f}, { -0.0038017456f, -0.0006021373f}, { 0.0000000000f, -0.0083189193f}, { 0.0061906444f, -0.0009805017f}, { -0.0015115772f, -0.0046521564f}, { 0.0189227445f, -0.0096416199f}, { 0.0188507571f, 0.0259458413f}, { -0.0170703338f, 0.0170703338f}, { 0.0090637512f, 0.0065852007f}, { -0.0325525585f, 0.0638879934f}, { -0.1356378526f, -0.0440714099f}, { 0.0315298182f, -0.1990714373f}, { 0.2278257713f, 0.0000000000f}, { 0.0331338197f, 0.2091987041f}, { -0.1515915567f, 0.0492550826f}, { -0.0405239110f, -0.0795326534f}, { 0.0196974299f, -0.0143110205f}, { -0.0127330841f, -0.0127330840f}, { 0.0189988021f, -0.0261496077f}, { 0.0222629772f, 0.0113435535f}, { -0.0027227278f, 0.0083796945f}, { 0.0042544823f, 0.0006738438f}, { 0.0000000000f, 0.0086029159f}, { -0.0052193006f, 0.0008266560f}, { 0.0001430276f, 0.0004401936f}, { -0.0033704179f, 0.0017173137f} }, { { -0.0034775081f, -0.0017718789f}, /* Filter 4 */ { 0.0003341791f, -0.0010284976f}, { -0.0045231271f, -0.0007163930f}, { 0.0000000000f, -0.0085186340f}, { 0.0052967893f, -0.0008389290f}, { -0.0021056563f, -0.0064805437f}, { 0.0206414817f, -0.0105173602f}, { 0.0190199255f, 0.0261786816f}, { -0.0150609085f, 0.0150609085f}, { 0.0142223501f, 0.0103331422f}, { -0.0365082065f, 0.0716513895f}, { -0.1437270842f, -0.0466997606f}, { 0.0323754130f, -0.2044103127f}, { 0.2281678478f, 0.0000000000f}, { 0.0323754130f, 0.2044103127f}, { -0.1437270842f, 0.0466997606f}, { -0.0365082065f, -0.0716513895f}, { 0.0142223501f, -0.0103331422f}, { -0.0150609085f, -0.0150609085f}, { 0.0190199255f, -0.0261786816f}, { 0.0206414817f, 0.0105173602f}, { -0.0021056563f, 0.0064805437f}, { 0.0052967893f, 0.0008389290f}, { 0.0000000000f, 0.0085186340f}, { -0.0045231271f, 0.0007163930f}, { 0.0003341791f, 0.0010284976f}, { -0.0034775081f, 0.0017718789f} }, { { -0.0033704179f, -0.0017173137f}, /* Filter 5 */ { 0.0001430276f, -0.0004401936f}, { -0.0052193006f, -0.0008266560f}, { 0.0000000000f, -0.0086029159f}, { 0.0042544823f, -0.0006738438f}, { -0.0027227278f, -0.0083796945f}, { 0.0222629772f, -0.0113435535f}, { 0.0189988021f, 0.0261496077f}, { -0.0127330840f, 0.0127330840f}, { 0.0196974299f, 0.0143110205f}, { -0.0405239110f, 0.0795326534f}, { -0.1515915567f, -0.0492550826f}, { 0.0331338197f, -0.2091987041f}, { 0.2278257713f, 0.0000000000f}, { 0.0315298182f, 0.1990714373f}, { -0.1356378526f, 0.0440714099f}, { -0.0325525585f, -0.0638879934f}, { 0.0090637512f, -0.0065852007f}, { -0.0170703338f, -0.0170703338f}, { 0.0188507571f, -0.0259458413f}, { 0.0189227445f, 0.0096416199f}, { -0.0015115772f, 0.0046521564f}, { 0.0061906444f, 0.0009805017f}, { 0.0000000000f, 0.0083189193f}, { -0.0038017456f, 0.0006021373f}, { 0.0005101233f, 0.0015699981f}, { -0.0035245124f, 0.0017958288f} }, { { -0.0032022929f, -0.0016316497f}, /* Filter 6 */ { -0.0000612735f, 0.0001885803f}, { -0.0058786966f, -0.0009310941f}, { 0.0000000000f, -0.0085629052f}, { 0.0030664735f, -0.0004856817f}, { -0.0033572432f, -0.0103325321f}, { 0.0237628386f, -0.0121077710f}, { 0.0187737877f, 0.0258399020f}, { -0.0100839969f, 0.0100839969f}, { 0.0254709341f, 0.0185057168f}, { -0.0445801870f, 0.0874935433f}, { -0.1591873153f, -0.0517230941f}, { 0.0338005382f, -0.2134081993f}, { 0.2268016406f, 0.0000000000f}, { 0.0306020346f, 0.1932136421f}, { -0.1273684894f, 0.0413845309f}, { -0.0286756337f, -0.0562791000f}, { 0.0042370446f, -0.0030783931f}, { -0.0187663603f, -0.0187663602f}, { 0.0185057200f, -0.0254709384f}, { 0.0171306792f, 0.0087285170f}, { -0.0009454877f, 0.0029099119f}, { 0.0069350877f, 0.0010984100f}, { 0.0000000000f, 0.0080135090f}, { -0.0030664478f, 0.0004856776f}, { 0.0006690952f, 0.0020592633f}, { -0.0035131448f, 0.0017900367f} }, { { -0.0029729852f, -0.0015148116f}, /* Filter 7 */ { -0.0002763861f, 0.0008506290f}, { -0.0064895990f, -0.0010278515f}, { 0.0000000000f, -0.0083907693f}, { 0.0017373694f, -0.0002751723f}, { -0.0040031308f, -0.0123203697f}, { 0.0251163790f, -0.0127974343f}, { 0.0183322510f, 0.0252321788f}, { -0.0071130021f, 0.0071130021f}, { 0.0315222376f, 0.0229022462f}, { -0.0486568478f, 0.0954944407f}, { -0.1664714744f, -0.0540898609f}, { 0.0343715984f, -0.2170137312f}, { 0.2251016174f, 0.0000000000f}, { 0.0295975058f, 0.1868712970f}, { -0.1189640874f, 0.0386537751f}, { -0.0248951628f, -0.0488595080f}, { -0.0002450506f, 0.0001780397f}, { -0.0201560074f, -0.0201560073f}, { 0.0179999198f, -0.0247747642f}, { 0.0152885238f, 0.0077898920f}, { -0.0004118109f, 0.0012674236f}, { 0.0075308694f, 0.0011927725f}, { 0.0000000000f, 0.0076128677f}, { -0.0023281305f, 0.0003687396f}, { 0.0008096319f, 0.0024917908f}, { -0.0034458238f, 0.0017557349f} } }; iaxmodem-1.2.0/lib/spandsp/src/at_interpreter_dictionary.h0000644000175000017500000012413411150047216023307 0ustar julienjulien// The trie contains 399 entries static const at_cmd_service_t at_commands[] = { at_cmd_dummy, at_cmd_amp_C, at_cmd_amp_D, at_cmd_amp_F, at_cmd_plus_A8A, at_cmd_plus_A8C, at_cmd_plus_A8E, at_cmd_plus_A8I, at_cmd_plus_A8J, at_cmd_plus_A8M, at_cmd_plus_A8R, at_cmd_plus_A8T, at_cmd_plus_ASTO, at_cmd_plus_CAAP, at_cmd_plus_CACM, at_cmd_plus_CACSP, at_cmd_plus_CAD, at_cmd_plus_CAEMLPP, at_cmd_plus_CAHLD, at_cmd_plus_CAJOIN, at_cmd_plus_CALA, at_cmd_plus_CALCC, at_cmd_plus_CALD, at_cmd_plus_CALM, at_cmd_plus_CAMM, at_cmd_plus_CANCHEV, at_cmd_plus_CAOC, at_cmd_plus_CAPD, at_cmd_plus_CAPTT, at_cmd_plus_CAREJ, at_cmd_plus_CAULEV, at_cmd_plus_CBC, at_cmd_plus_CBCS, at_cmd_plus_CBIP, at_cmd_plus_CBST, at_cmd_plus_CCFC, at_cmd_plus_CCLK, at_cmd_plus_CCS, at_cmd_plus_CCUG, at_cmd_plus_CCWA, at_cmd_plus_CCWE, at_cmd_plus_CDIP, at_cmd_plus_CDIS, at_cmd_plus_CDV, at_cmd_plus_CEER, at_cmd_plus_CESP, at_cmd_plus_CFCS, at_cmd_plus_CFG, at_cmd_plus_CFUN, at_cmd_plus_CGACT, at_cmd_plus_CGANS, at_cmd_plus_CGATT, at_cmd_plus_CGAUTO, at_cmd_plus_CGCAP, at_cmd_plus_CGCLASS, at_cmd_plus_CGCLOSP, at_cmd_plus_CGCLPAD, at_cmd_plus_CGCMOD, at_cmd_plus_CGCS, at_cmd_plus_CGDATA, at_cmd_plus_CGDCONT, at_cmd_plus_CGDSCONT, at_cmd_plus_CGEQMIN, at_cmd_plus_CGEQNEG, at_cmd_plus_CGEQREQ, at_cmd_plus_CGEREP, at_cmd_plus_CGMI, at_cmd_plus_CGMM, at_cmd_plus_CGMR, at_cmd_plus_CGOI, at_cmd_plus_CGPADDR, at_cmd_plus_CGQMIN, at_cmd_plus_CGQREQ, at_cmd_plus_CGREG, at_cmd_plus_CGSMS, at_cmd_plus_CGSN, at_cmd_plus_CGTFT, at_cmd_plus_CHLD, at_cmd_plus_CHSA, at_cmd_plus_CHSC, at_cmd_plus_CHSD, at_cmd_plus_CHSN, at_cmd_plus_CHSR, at_cmd_plus_CHST, at_cmd_plus_CHSU, at_cmd_plus_CHUP, at_cmd_plus_CHV, at_cmd_plus_CIMI, at_cmd_plus_CIND, at_cmd_plus_CIT, at_cmd_plus_CKPD, at_cmd_plus_CLAC, at_cmd_plus_CLAE, at_cmd_plus_CLAN, at_cmd_plus_CLCC, at_cmd_plus_CLCK, at_cmd_plus_CLIP, at_cmd_plus_CLIR, at_cmd_plus_CLVL, at_cmd_plus_CMAR, at_cmd_plus_CMEC, at_cmd_plus_CMEE, at_cmd_plus_CMER, at_cmd_plus_CMGC, at_cmd_plus_CMGD, at_cmd_plus_CMGF, at_cmd_plus_CMGL, at_cmd_plus_CMGR, at_cmd_plus_CMGS, at_cmd_plus_CMGW, at_cmd_plus_CMIP, at_cmd_plus_CMM, at_cmd_plus_CMMS, at_cmd_plus_CMOD, at_cmd_plus_CMSS, at_cmd_plus_CMUT, at_cmd_plus_CMUX, at_cmd_plus_CNMA, at_cmd_plus_CNMI, at_cmd_plus_CNUM, at_cmd_plus_COLP, at_cmd_plus_COPN, at_cmd_plus_COPS, at_cmd_plus_COS, at_cmd_plus_COTDI, at_cmd_plus_CPAS, at_cmd_plus_CPBF, at_cmd_plus_CPBR, at_cmd_plus_CPBS, at_cmd_plus_CPBW, at_cmd_plus_CPIN, at_cmd_plus_CPLS, at_cmd_plus_CPMS, at_cmd_plus_CPOL, at_cmd_plus_CPPS, at_cmd_plus_CPROT, at_cmd_plus_CPUC, at_cmd_plus_CPWC, at_cmd_plus_CPWD, at_cmd_plus_CQD, at_cmd_plus_CR, at_cmd_plus_CRC, at_cmd_plus_CREG, at_cmd_plus_CRES, at_cmd_plus_CRLP, at_cmd_plus_CRM, at_cmd_plus_CRMC, at_cmd_plus_CRMP, at_cmd_plus_CRSL, at_cmd_plus_CRSM, at_cmd_plus_CSAS, at_cmd_plus_CSCA, at_cmd_plus_CSCB, at_cmd_plus_CSCC, at_cmd_plus_CSCS, at_cmd_plus_CSDF, at_cmd_plus_CSDH, at_cmd_plus_CSGT, at_cmd_plus_CSIL, at_cmd_plus_CSIM, at_cmd_plus_CSMP, at_cmd_plus_CSMS, at_cmd_plus_CSNS, at_cmd_plus_CSQ, at_cmd_plus_CSS, at_cmd_plus_CSSN, at_cmd_plus_CSTA, at_cmd_plus_CSTF, at_cmd_plus_CSVM, at_cmd_plus_CTA, at_cmd_plus_CTF, at_cmd_plus_CTFR, at_cmd_plus_CTZR, at_cmd_plus_CTZU, at_cmd_plus_CUSD, at_cmd_plus_CUUS1, at_cmd_plus_CV120, at_cmd_plus_CVHU, at_cmd_plus_CVIB, at_cmd_plus_CXT, at_cmd_plus_DR, at_cmd_plus_DS, at_cmd_plus_DS44, at_cmd_plus_EB, at_cmd_plus_EFCS, at_cmd_plus_EFRAM, at_cmd_plus_ER, at_cmd_plus_ES, at_cmd_plus_ESR, at_cmd_plus_ETBM, at_cmd_plus_EWIND, at_cmd_plus_FAA, at_cmd_plus_FAP, at_cmd_plus_FAR, at_cmd_plus_FBO, at_cmd_plus_FBS, at_cmd_plus_FBU, at_cmd_plus_FCC, at_cmd_plus_FCL, at_cmd_plus_FCLASS, at_cmd_plus_FCQ, at_cmd_plus_FCR, at_cmd_plus_FCS, at_cmd_plus_FCT, at_cmd_plus_FDD, at_cmd_plus_FDR, at_cmd_plus_FDT, at_cmd_plus_FEA, at_cmd_plus_FFC, at_cmd_plus_FFD, at_cmd_plus_FHS, at_cmd_plus_FIE, at_cmd_plus_FIP, at_cmd_plus_FIS, at_cmd_plus_FIT, at_cmd_plus_FKS, at_cmd_plus_FLI, at_cmd_plus_FLO, at_cmd_plus_FLP, at_cmd_plus_FMI, at_cmd_plus_FMM, at_cmd_plus_FMR, at_cmd_plus_FMS, at_cmd_plus_FND, at_cmd_plus_FNR, at_cmd_plus_FNS, at_cmd_plus_FPA, at_cmd_plus_FPI, at_cmd_plus_FPP, at_cmd_plus_FPR, at_cmd_plus_FPS, at_cmd_plus_FPW, at_cmd_plus_FRH, at_cmd_plus_FRM, at_cmd_plus_FRQ, at_cmd_plus_FRS, at_cmd_plus_FRY, at_cmd_plus_FSA, at_cmd_plus_FSP, at_cmd_plus_FTH, at_cmd_plus_FTM, at_cmd_plus_FTS, at_cmd_plus_GCAP, at_cmd_plus_GCI, at_cmd_plus_GMI, at_cmd_plus_GMM, at_cmd_plus_GMR, at_cmd_plus_GOI, at_cmd_plus_GSN, at_cmd_plus_IBC, at_cmd_plus_IBM, at_cmd_plus_ICF, at_cmd_plus_ICLOK, at_cmd_plus_IDSR, at_cmd_plus_IFC, at_cmd_plus_ILRR, at_cmd_plus_ILSD, at_cmd_plus_IPR, at_cmd_plus_IRTS, at_cmd_plus_MA, at_cmd_plus_MR, at_cmd_plus_MS, at_cmd_plus_MSC, at_cmd_plus_MV18AM, at_cmd_plus_MV18P, at_cmd_plus_MV18R, at_cmd_plus_MV18S, at_cmd_plus_PCW, at_cmd_plus_PIG, at_cmd_plus_PMH, at_cmd_plus_PMHF, at_cmd_plus_PMHR, at_cmd_plus_PMHT, at_cmd_plus_PQC, at_cmd_plus_PSS, at_cmd_plus_SAC, at_cmd_plus_SAM, at_cmd_plus_SAR, at_cmd_plus_SARR, at_cmd_plus_SAT, at_cmd_plus_SCRR, at_cmd_plus_SDC, at_cmd_plus_SDI, at_cmd_plus_SDR, at_cmd_plus_SRSC, at_cmd_plus_STC, at_cmd_plus_STH, at_cmd_plus_SVC, at_cmd_plus_SVM, at_cmd_plus_SVR, at_cmd_plus_SVRR, at_cmd_plus_SVT, at_cmd_plus_TADR, at_cmd_plus_TAL, at_cmd_plus_TALS, at_cmd_plus_TDLS, at_cmd_plus_TE140, at_cmd_plus_TE141, at_cmd_plus_TEPAL, at_cmd_plus_TEPDL, at_cmd_plus_TERDL, at_cmd_plus_TLDL, at_cmd_plus_TMO, at_cmd_plus_TMODE, at_cmd_plus_TNUM, at_cmd_plus_TRDL, at_cmd_plus_TRDLS, at_cmd_plus_TRES, at_cmd_plus_TSELF, at_cmd_plus_TTER, at_cmd_plus_VAC, at_cmd_plus_VACR, at_cmd_plus_VBT, at_cmd_plus_VCID, at_cmd_plus_VCIDR, at_cmd_plus_VDID, at_cmd_plus_VDIDR, at_cmd_plus_VDR, at_cmd_plus_VDT, at_cmd_plus_VDX, at_cmd_plus_VEM, at_cmd_plus_VGM, at_cmd_plus_VGR, at_cmd_plus_VGS, at_cmd_plus_VGT, at_cmd_plus_VHC, at_cmd_plus_VIP, at_cmd_plus_VIT, at_cmd_plus_VLS, at_cmd_plus_VNH, at_cmd_plus_VPH, at_cmd_plus_VPP, at_cmd_plus_VPR, at_cmd_plus_VRA, at_cmd_plus_VRID, at_cmd_plus_VRL, at_cmd_plus_VRN, at_cmd_plus_VRX, at_cmd_plus_VSD, at_cmd_plus_VSID, at_cmd_plus_VSM, at_cmd_plus_VSP, at_cmd_plus_VTA, at_cmd_plus_VTD, at_cmd_plus_VTER, at_cmd_plus_VTH, at_cmd_plus_VTR, at_cmd_plus_VTS, at_cmd_plus_VTX, at_cmd_plus_VXT, at_cmd_plus_W, at_cmd_plus_WBAG, at_cmd_plus_WCDA, at_cmd_plus_WCHG, at_cmd_plus_WCID, at_cmd_plus_WCLK, at_cmd_plus_WCPN, at_cmd_plus_WCXF, at_cmd_plus_WDAC, at_cmd_plus_WDIR, at_cmd_plus_WECR, at_cmd_plus_WFON, at_cmd_plus_WKPD, at_cmd_plus_WPBA, at_cmd_plus_WPTH, at_cmd_plus_WRLK, at_cmd_plus_WS45, at_cmd_plus_WS46, at_cmd_plus_WS50, at_cmd_plus_WS51, at_cmd_plus_WS52, at_cmd_plus_WS53, at_cmd_plus_WS54, at_cmd_plus_WS57, at_cmd_plus_WS58, at_cmd_plus_WSTL, at_cmd_dummy, at_cmd_A, at_cmd_D, at_cmd_E, at_cmd_H, at_cmd_I, at_cmd_L, at_cmd_M, at_cmd_O, at_cmd_P, at_cmd_Q, at_cmd_S0, at_cmd_S10, at_cmd_S3, at_cmd_S4, at_cmd_S5, at_cmd_S6, at_cmd_S7, at_cmd_S8, at_cmd_T, at_cmd_V, at_cmd_X, at_cmd_Z, }; static const uint16_t command_trie[] = { 0x0020, 0x005A, 0x0000, 0x003F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0042, 0x0000, 0x0000, 0x0000, 0x0000, 0x0052, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0F43, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0F46, 0x0000, 0x0000, 0x0F49, 0x0F4C, 0x0000, 0x0000, 0x0F4F, 0x0F52, 0x0000, 0x0000, 0x0F55, 0x0F58, 0x0000, 0x0F5B, 0x0F5E, 0x0F61, 0x0000, 0x0F64, 0x0F8C, 0x0000, 0x0F8F, 0x0000, 0x0F92, 0x0000, 0x0F95, 0x0001, 0x0000, 0x0001, 0x0043, 0x0046, 0x0000, 0x0049, 0x004C, 0x0000, 0x004F, 0x0001, 0x0000, 0x0002, 0x0001, 0x0000, 0x0003, 0x0001, 0x0000, 0x0004, 0x0041, 0x0057, 0x0000, 0x006C, 0x0000, 0x00C5, 0x07D0, 0x07E3, 0x0848, 0x09EA, 0x0000, 0x0A38, 0x0000, 0x0000, 0x0000, 0x0AAF, 0x0000, 0x0000, 0x0B03, 0x0000, 0x0000, 0x0B52, 0x0BF6, 0x0000, 0x0CDC, 0x0E20, 0x0038, 0x0053, 0x0000, 0x008B, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00BA, 0x0041, 0x0054, 0x0000, 0x00A2, 0x0000, 0x00A5, 0x0000, 0x00A8, 0x0000, 0x0000, 0x0000, 0x00AB, 0x00AE, 0x0000, 0x0000, 0x00B1, 0x0000, 0x0000, 0x0000, 0x0000, 0x00B4, 0x0000, 0x00B7, 0x0001, 0x0000, 0x0005, 0x0001, 0x0000, 0x0006, 0x0001, 0x0000, 0x0007, 0x0001, 0x0000, 0x0008, 0x0001, 0x0000, 0x0009, 0x0001, 0x0000, 0x000A, 0x0001, 0x0000, 0x000B, 0x0001, 0x0000, 0x000C, 0x0054, 0x0054, 0x0000, 0x00BE, 0x004F, 0x004F, 0x0000, 0x00C2, 0x0001, 0x0000, 0x000D, 0x0041, 0x0058, 0x0000, 0x00E0, 0x01BC, 0x01E5, 0x0220, 0x0241, 0x0261, 0x0288, 0x0425, 0x0471, 0x0000, 0x048D, 0x0498, 0x04EE, 0x0580, 0x05A5, 0x05D5, 0x0657, 0x065E, 0x06B4, 0x0748, 0x077C, 0x0794, 0x0000, 0x07C9, 0x0041, 0x0055, 0x0000, 0x00F8, 0x0000, 0x00FF, 0x0113, 0x0116, 0x0000, 0x0000, 0x0129, 0x0000, 0x0134, 0x0000, 0x0143, 0x0163, 0x016A, 0x017D, 0x0184, 0x0000, 0x01A2, 0x0000, 0x0000, 0x01AD, 0x0050, 0x0050, 0x0000, 0x00FC, 0x0001, 0x0000, 0x000E, 0x004D, 0x0053, 0x0000, 0x0109, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x010C, 0x0001, 0x0000, 0x000F, 0x0050, 0x0050, 0x0000, 0x0110, 0x0001, 0x0000, 0x0010, 0x0001, 0x0000, 0x0011, 0x004D, 0x004D, 0x0000, 0x011A, 0x004C, 0x004C, 0x0000, 0x011E, 0x0050, 0x0050, 0x0000, 0x0122, 0x0050, 0x0050, 0x0000, 0x0126, 0x0001, 0x0000, 0x0012, 0x004C, 0x004C, 0x0000, 0x012D, 0x0044, 0x0044, 0x0000, 0x0131, 0x0001, 0x0000, 0x0013, 0x004F, 0x004F, 0x0000, 0x0138, 0x0049, 0x0049, 0x0000, 0x013C, 0x004E, 0x004E, 0x0000, 0x0140, 0x0001, 0x0000, 0x0014, 0x0041, 0x004D, 0x0000, 0x0153, 0x0000, 0x0156, 0x015D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0160, 0x0001, 0x0000, 0x0015, 0x0043, 0x0043, 0x0000, 0x015A, 0x0001, 0x0000, 0x0016, 0x0001, 0x0000, 0x0017, 0x0001, 0x0000, 0x0018, 0x004D, 0x004D, 0x0000, 0x0167, 0x0001, 0x0000, 0x0019, 0x0043, 0x0043, 0x0000, 0x016E, 0x0048, 0x0048, 0x0000, 0x0172, 0x0045, 0x0045, 0x0000, 0x0176, 0x0056, 0x0056, 0x0000, 0x017A, 0x0001, 0x0000, 0x001A, 0x0043, 0x0043, 0x0000, 0x0181, 0x0001, 0x0000, 0x001B, 0x0044, 0x0054, 0x0000, 0x0198, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x019B, 0x0001, 0x0000, 0x001C, 0x0054, 0x0054, 0x0000, 0x019F, 0x0001, 0x0000, 0x001D, 0x0045, 0x0045, 0x0000, 0x01A6, 0x004A, 0x004A, 0x0000, 0x01AA, 0x0001, 0x0000, 0x001E, 0x004C, 0x004C, 0x0000, 0x01B1, 0x0045, 0x0045, 0x0000, 0x01B5, 0x0056, 0x0056, 0x0000, 0x01B9, 0x0001, 0x0000, 0x001F, 0x0043, 0x0053, 0x0000, 0x01D0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x01D7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x01DE, 0x0053, 0x0053, 0x0020, 0x01D4, 0x0001, 0x0000, 0x0021, 0x0050, 0x0050, 0x0000, 0x01DB, 0x0001, 0x0000, 0x0022, 0x0054, 0x0054, 0x0000, 0x01E2, 0x0001, 0x0000, 0x0023, 0x0046, 0x0057, 0x0000, 0x01FA, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0201, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0208, 0x0000, 0x020B, 0x0000, 0x0212, 0x0043, 0x0043, 0x0000, 0x01FE, 0x0001, 0x0000, 0x0024, 0x004B, 0x004B, 0x0000, 0x0205, 0x0001, 0x0000, 0x0025, 0x0001, 0x0000, 0x0026, 0x0047, 0x0047, 0x0000, 0x020F, 0x0001, 0x0000, 0x0027, 0x0041, 0x0045, 0x0000, 0x021A, 0x0000, 0x0000, 0x0000, 0x021D, 0x0001, 0x0000, 0x0028, 0x0001, 0x0000, 0x0029, 0x0049, 0x0056, 0x0000, 0x0231, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x023E, 0x0050, 0x0053, 0x0000, 0x0238, 0x0000, 0x0000, 0x023B, 0x0001, 0x0000, 0x002A, 0x0001, 0x0000, 0x002B, 0x0001, 0x0000, 0x002C, 0x0045, 0x0053, 0x0000, 0x0253, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x025A, 0x0052, 0x0052, 0x0000, 0x0257, 0x0001, 0x0000, 0x002D, 0x0050, 0x0050, 0x0000, 0x025E, 0x0001, 0x0000, 0x002E, 0x0043, 0x0055, 0x0000, 0x0277, 0x0000, 0x0000, 0x0000, 0x027E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0281, 0x0053, 0x0053, 0x0000, 0x027B, 0x0001, 0x0000, 0x002F, 0x0001, 0x0000, 0x0030, 0x004E, 0x004E, 0x0000, 0x0285, 0x0001, 0x0000, 0x0031, 0x0041, 0x0054, 0x0000, 0x029F, 0x0000, 0x02D5, 0x0334, 0x0377, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x03B1, 0x0000, 0x03C7, 0x03CE, 0x03E1, 0x0400, 0x040B, 0x041A, 0x0043, 0x0055, 0x0000, 0x02B5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x02BC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x02C3, 0x02CA, 0x0054, 0x0054, 0x0000, 0x02B9, 0x0001, 0x0000, 0x0032, 0x0053, 0x0053, 0x0000, 0x02C0, 0x0001, 0x0000, 0x0033, 0x0054, 0x0054, 0x0000, 0x02C7, 0x0001, 0x0000, 0x0034, 0x0054, 0x0054, 0x0000, 0x02CE, 0x004F, 0x004F, 0x0000, 0x02D2, 0x0001, 0x0000, 0x0035, 0x0041, 0x0053, 0x0000, 0x02EB, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x02F2, 0x0326, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0331, 0x0050, 0x0050, 0x0000, 0x02EF, 0x0001, 0x0000, 0x0036, 0x0041, 0x0050, 0x0000, 0x0305, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0310, 0x031B, 0x0053, 0x0053, 0x0000, 0x0309, 0x0053, 0x0053, 0x0000, 0x030D, 0x0001, 0x0000, 0x0037, 0x0053, 0x0053, 0x0000, 0x0314, 0x0050, 0x0050, 0x0000, 0x0318, 0x0001, 0x0000, 0x0038, 0x0041, 0x0041, 0x0000, 0x031F, 0x0044, 0x0044, 0x0000, 0x0323, 0x0001, 0x0000, 0x0039, 0x004F, 0x004F, 0x0000, 0x032A, 0x0044, 0x0044, 0x0000, 0x032E, 0x0001, 0x0000, 0x003A, 0x0001, 0x0000, 0x003B, 0x0041, 0x0053, 0x0000, 0x034A, 0x0000, 0x0355, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0364, 0x0054, 0x0054, 0x0000, 0x034E, 0x0041, 0x0041, 0x0000, 0x0352, 0x0001, 0x0000, 0x003C, 0x004F, 0x004F, 0x0000, 0x0359, 0x004E, 0x004E, 0x0000, 0x035D, 0x0054, 0x0054, 0x0000, 0x0361, 0x0001, 0x0000, 0x003D, 0x0043, 0x0043, 0x0000, 0x0368, 0x004F, 0x004F, 0x0000, 0x036C, 0x004E, 0x004E, 0x0000, 0x0370, 0x0054, 0x0054, 0x0000, 0x0374, 0x0001, 0x0000, 0x003E, 0x0051, 0x0052, 0x0000, 0x037C, 0x03A6, 0x004D, 0x0052, 0x0000, 0x0385, 0x0390, 0x0000, 0x0000, 0x0000, 0x039B, 0x0049, 0x0049, 0x0000, 0x0389, 0x004E, 0x004E, 0x0000, 0x038D, 0x0001, 0x0000, 0x003F, 0x0045, 0x0045, 0x0000, 0x0394, 0x0047, 0x0047, 0x0000, 0x0398, 0x0001, 0x0000, 0x0040, 0x0045, 0x0045, 0x0000, 0x039F, 0x0051, 0x0051, 0x0000, 0x03A3, 0x0001, 0x0000, 0x0041, 0x0045, 0x0045, 0x0000, 0x03AA, 0x0050, 0x0050, 0x0000, 0x03AE, 0x0001, 0x0000, 0x0042, 0x0049, 0x0052, 0x0000, 0x03BE, 0x0000, 0x0000, 0x0000, 0x03C1, 0x0000, 0x0000, 0x0000, 0x0000, 0x03C4, 0x0001, 0x0000, 0x0043, 0x0001, 0x0000, 0x0044, 0x0001, 0x0000, 0x0045, 0x0049, 0x0049, 0x0000, 0x03CB, 0x0001, 0x0000, 0x0046, 0x0041, 0x0041, 0x0000, 0x03D2, 0x0044, 0x0044, 0x0000, 0x03D6, 0x0044, 0x0044, 0x0000, 0x03DA, 0x0052, 0x0052, 0x0000, 0x03DE, 0x0001, 0x0000, 0x0047, 0x004D, 0x0052, 0x0000, 0x03EA, 0x0000, 0x0000, 0x0000, 0x0000, 0x03F5, 0x0049, 0x0049, 0x0000, 0x03EE, 0x004E, 0x004E, 0x0000, 0x03F2, 0x0001, 0x0000, 0x0048, 0x0045, 0x0045, 0x0000, 0x03F9, 0x0051, 0x0051, 0x0000, 0x03FD, 0x0001, 0x0000, 0x0049, 0x0045, 0x0045, 0x0000, 0x0404, 0x0047, 0x0047, 0x0000, 0x0408, 0x0001, 0x0000, 0x004A, 0x004D, 0x004E, 0x0000, 0x0410, 0x0417, 0x0053, 0x0053, 0x0000, 0x0414, 0x0001, 0x0000, 0x004B, 0x0001, 0x0000, 0x004C, 0x0046, 0x0046, 0x0000, 0x041E, 0x0054, 0x0054, 0x0000, 0x0422, 0x0001, 0x0000, 0x004D, 0x004C, 0x0056, 0x0000, 0x0433, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x043A, 0x0000, 0x0467, 0x046E, 0x0044, 0x0044, 0x0000, 0x0437, 0x0001, 0x0000, 0x004E, 0x0041, 0x0055, 0x0000, 0x0452, 0x0000, 0x0455, 0x0458, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x045B, 0x0000, 0x0000, 0x0000, 0x045E, 0x0000, 0x0461, 0x0464, 0x0001, 0x0000, 0x004F, 0x0001, 0x0000, 0x0050, 0x0001, 0x0000, 0x0051, 0x0001, 0x0000, 0x0052, 0x0001, 0x0000, 0x0053, 0x0001, 0x0000, 0x0054, 0x0001, 0x0000, 0x0055, 0x0050, 0x0050, 0x0000, 0x046B, 0x0001, 0x0000, 0x0056, 0x0001, 0x0000, 0x0057, 0x004D, 0x0054, 0x0000, 0x047C, 0x0483, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x048A, 0x0049, 0x0049, 0x0000, 0x0480, 0x0001, 0x0000, 0x0058, 0x0044, 0x0044, 0x0000, 0x0487, 0x0001, 0x0000, 0x0059, 0x0001, 0x0000, 0x005A, 0x0050, 0x0050, 0x0000, 0x0491, 0x0044, 0x0044, 0x0000, 0x0495, 0x0001, 0x0000, 0x005B, 0x0041, 0x0056, 0x0000, 0x04B1, 0x0000, 0x04C9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x04DB, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x04E7, 0x0043, 0x004E, 0x0000, 0x04C0, 0x0000, 0x04C3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x04C6, 0x0001, 0x0000, 0x005C, 0x0001, 0x0000, 0x005D, 0x0001, 0x0000, 0x005E, 0x0043, 0x004B, 0x0000, 0x04D5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x04D8, 0x0001, 0x0000, 0x005F, 0x0001, 0x0000, 0x0060, 0x0050, 0x0052, 0x0000, 0x04E1, 0x0000, 0x04E4, 0x0001, 0x0000, 0x0061, 0x0001, 0x0000, 0x0062, 0x004C, 0x004C, 0x0000, 0x04EB, 0x0001, 0x0000, 0x0063, 0x0041, 0x0055, 0x0000, 0x0506, 0x0000, 0x0000, 0x0000, 0x050D, 0x0000, 0x0529, 0x0000, 0x0556, 0x0000, 0x0000, 0x0000, 0x055D, 0x0000, 0x0564, 0x0000, 0x0000, 0x0000, 0x056B, 0x0000, 0x0572, 0x0052, 0x0052, 0x0000, 0x050A, 0x0001, 0x0000, 0x0064, 0x0043, 0x0052, 0x0000, 0x0520, 0x0000, 0x0523, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0526, 0x0001, 0x0000, 0x0065, 0x0001, 0x0000, 0x0066, 0x0001, 0x0000, 0x0067, 0x0043, 0x0057, 0x0000, 0x0541, 0x0544, 0x0000, 0x0547, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x054A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x054D, 0x0550, 0x0000, 0x0000, 0x0000, 0x0553, 0x0001, 0x0000, 0x0068, 0x0001, 0x0000, 0x0069, 0x0001, 0x0000, 0x006A, 0x0001, 0x0000, 0x006B, 0x0001, 0x0000, 0x006C, 0x0001, 0x0000, 0x006D, 0x0001, 0x0000, 0x006E, 0x0050, 0x0050, 0x0000, 0x055A, 0x0001, 0x0000, 0x006F, 0x0053, 0x0053, 0x0070, 0x0561, 0x0001, 0x0000, 0x0071, 0x0044, 0x0044, 0x0000, 0x0568, 0x0001, 0x0000, 0x0072, 0x0053, 0x0053, 0x0000, 0x056F, 0x0001, 0x0000, 0x0073, 0x0054, 0x0058, 0x0000, 0x057A, 0x0000, 0x0000, 0x0000, 0x057D, 0x0001, 0x0000, 0x0074, 0x0001, 0x0000, 0x0075, 0x004D, 0x0055, 0x0000, 0x058C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x059E, 0x0041, 0x0049, 0x0000, 0x0598, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x059B, 0x0001, 0x0000, 0x0076, 0x0001, 0x0000, 0x0077, 0x004D, 0x004D, 0x0000, 0x05A2, 0x0001, 0x0000, 0x0078, 0x004C, 0x0054, 0x0000, 0x05B1, 0x0000, 0x0000, 0x0000, 0x05B8, 0x0000, 0x0000, 0x05C7, 0x05CA, 0x0050, 0x0050, 0x0000, 0x05B5, 0x0001, 0x0000, 0x0079, 0x004E, 0x0053, 0x0000, 0x05C1, 0x0000, 0x0000, 0x0000, 0x0000, 0x05C4, 0x0001, 0x0000, 0x007A, 0x0001, 0x0000, 0x007B, 0x0001, 0x0000, 0x007C, 0x0044, 0x0044, 0x0000, 0x05CE, 0x0049, 0x0049, 0x0000, 0x05D2, 0x0001, 0x0000, 0x007D, 0x0041, 0x0057, 0x0000, 0x05EF, 0x05F6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0617, 0x0000, 0x0000, 0x061E, 0x0625, 0x0000, 0x062C, 0x0633, 0x0000, 0x063A, 0x0000, 0x0000, 0x0645, 0x0000, 0x064C, 0x0053, 0x0053, 0x0000, 0x05F3, 0x0001, 0x0000, 0x007E, 0x0046, 0x0057, 0x0000, 0x060B, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x060E, 0x0611, 0x0000, 0x0000, 0x0000, 0x0614, 0x0001, 0x0000, 0x007F, 0x0001, 0x0000, 0x0080, 0x0001, 0x0000, 0x0081, 0x0001, 0x0000, 0x0082, 0x004E, 0x004E, 0x0000, 0x061B, 0x0001, 0x0000, 0x0083, 0x0053, 0x0053, 0x0000, 0x0622, 0x0001, 0x0000, 0x0084, 0x0053, 0x0053, 0x0000, 0x0629, 0x0001, 0x0000, 0x0085, 0x004C, 0x004C, 0x0000, 0x0630, 0x0001, 0x0000, 0x0086, 0x0053, 0x0053, 0x0000, 0x0637, 0x0001, 0x0000, 0x0087, 0x004F, 0x004F, 0x0000, 0x063E, 0x0054, 0x0054, 0x0000, 0x0642, 0x0001, 0x0000, 0x0088, 0x0043, 0x0043, 0x0000, 0x0649, 0x0001, 0x0000, 0x0089, 0x0043, 0x0044, 0x0000, 0x0651, 0x0654, 0x0001, 0x0000, 0x008A, 0x0001, 0x0000, 0x008B, 0x0044, 0x0044, 0x0000, 0x065B, 0x0001, 0x0000, 0x008C, 0x0043, 0x0053, 0x008D, 0x0672, 0x0000, 0x0675, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x068B, 0x0692, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x06A9, 0x0001, 0x0000, 0x008E, 0x0047, 0x0053, 0x0000, 0x0685, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0688, 0x0001, 0x0000, 0x008F, 0x0001, 0x0000, 0x0090, 0x0050, 0x0050, 0x0000, 0x068F, 0x0001, 0x0000, 0x0091, 0x0043, 0x0050, 0x0092, 0x06A3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x06A6, 0x0001, 0x0000, 0x0093, 0x0001, 0x0000, 0x0094, 0x004C, 0x004D, 0x0000, 0x06AE, 0x06B1, 0x0001, 0x0000, 0x0095, 0x0001, 0x0000, 0x0096, 0x0041, 0x0056, 0x0000, 0x06CD, 0x0000, 0x06D4, 0x06F6, 0x0000, 0x0000, 0x0702, 0x0000, 0x0709, 0x0000, 0x0000, 0x0000, 0x0714, 0x0721, 0x0000, 0x0000, 0x0728, 0x0000, 0x072B, 0x0732, 0x0000, 0x0741, 0x0053, 0x0053, 0x0000, 0x06D1, 0x0001, 0x0000, 0x0097, 0x0041, 0x0053, 0x0000, 0x06EA, 0x06ED, 0x06F0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x06F3, 0x0001, 0x0000, 0x0098, 0x0001, 0x0000, 0x0099, 0x0001, 0x0000, 0x009A, 0x0001, 0x0000, 0x009B, 0x0046, 0x0048, 0x0000, 0x06FC, 0x0000, 0x06FF, 0x0001, 0x0000, 0x009C, 0x0001, 0x0000, 0x009D, 0x0054, 0x0054, 0x0000, 0x0706, 0x0001, 0x0000, 0x009E, 0x004C, 0x004D, 0x0000, 0x070E, 0x0711, 0x0001, 0x0000, 0x009F, 0x0001, 0x0000, 0x00A0, 0x0050, 0x0053, 0x0000, 0x071B, 0x0000, 0x0000, 0x071E, 0x0001, 0x0000, 0x00A1, 0x0001, 0x0000, 0x00A2, 0x0053, 0x0053, 0x0000, 0x0725, 0x0001, 0x0000, 0x00A3, 0x0001, 0x0000, 0x00A4, 0x004E, 0x004E, 0x00A5, 0x072F, 0x0001, 0x0000, 0x00A6, 0x0041, 0x0046, 0x0000, 0x073B, 0x0000, 0x0000, 0x0000, 0x0000, 0x073E, 0x0001, 0x0000, 0x00A7, 0x0001, 0x0000, 0x00A8, 0x004D, 0x004D, 0x0000, 0x0745, 0x0001, 0x0000, 0x00A9, 0x0041, 0x005A, 0x0000, 0x0765, 0x0000, 0x0000, 0x0000, 0x0000, 0x0768, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x076F, 0x0001, 0x0000, 0x00AA, 0x0052, 0x0052, 0x00AB, 0x076C, 0x0001, 0x0000, 0x00AC, 0x0052, 0x0055, 0x0000, 0x0776, 0x0000, 0x0000, 0x0779, 0x0001, 0x0000, 0x00AD, 0x0001, 0x0000, 0x00AE, 0x0053, 0x0055, 0x0000, 0x0782, 0x0000, 0x0789, 0x0044, 0x0044, 0x0000, 0x0786, 0x0001, 0x0000, 0x00AF, 0x0053, 0x0053, 0x0000, 0x078D, 0x0031, 0x0031, 0x0000, 0x0791, 0x0001, 0x0000, 0x00B0, 0x0031, 0x0049, 0x0000, 0x07B0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x07BB, 0x07C2, 0x0032, 0x0032, 0x0000, 0x07B4, 0x0030, 0x0030, 0x0000, 0x07B8, 0x0001, 0x0000, 0x00B1, 0x0055, 0x0055, 0x0000, 0x07BF, 0x0001, 0x0000, 0x00B2, 0x0042, 0x0042, 0x0000, 0x07C6, 0x0001, 0x0000, 0x00B3, 0x0054, 0x0054, 0x0000, 0x07CD, 0x0001, 0x0000, 0x00B4, 0x0052, 0x0053, 0x0000, 0x07D5, 0x07D8, 0x0001, 0x0000, 0x00B5, 0x0034, 0x0034, 0x00B6, 0x07DC, 0x0034, 0x0034, 0x0000, 0x07E0, 0x0001, 0x0000, 0x00B7, 0x0042, 0x0057, 0x0000, 0x07FC, 0x0000, 0x0000, 0x0000, 0x07FF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0824, 0x0827, 0x082E, 0x0000, 0x0000, 0x0839, 0x0001, 0x0000, 0x00B8, 0x0043, 0x0052, 0x0000, 0x0812, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0819, 0x0053, 0x0053, 0x0000, 0x0816, 0x0001, 0x0000, 0x00B9, 0x0041, 0x0041, 0x0000, 0x081D, 0x004D, 0x004D, 0x0000, 0x0821, 0x0001, 0x0000, 0x00BA, 0x0001, 0x0000, 0x00BB, 0x0052, 0x0052, 0x00BC, 0x082B, 0x0001, 0x0000, 0x00BD, 0x0042, 0x0042, 0x0000, 0x0832, 0x004D, 0x004D, 0x0000, 0x0836, 0x0001, 0x0000, 0x00BE, 0x0049, 0x0049, 0x0000, 0x083D, 0x004E, 0x004E, 0x0000, 0x0841, 0x0044, 0x0044, 0x0000, 0x0845, 0x0001, 0x0000, 0x00BF, 0x0041, 0x0054, 0x0000, 0x085F, 0x087D, 0x0890, 0x08C3, 0x08E0, 0x08E7, 0x0000, 0x08F2, 0x08F9, 0x0000, 0x0918, 0x091F, 0x0933, 0x094D, 0x0000, 0x0969, 0x0000, 0x0995, 0x09B9, 0x09D2, 0x0041, 0x0052, 0x0000, 0x0874, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0877, 0x0000, 0x087A, 0x0001, 0x0000, 0x00C0, 0x0001, 0x0000, 0x00C1, 0x0001, 0x0000, 0x00C2, 0x004F, 0x0055, 0x0000, 0x0887, 0x0000, 0x0000, 0x0000, 0x088A, 0x0000, 0x088D, 0x0001, 0x0000, 0x00C3, 0x0001, 0x0000, 0x00C4, 0x0001, 0x0000, 0x00C5, 0x0043, 0x0054, 0x0000, 0x08A5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x08A8, 0x0000, 0x0000, 0x0000, 0x0000, 0x08B7, 0x08BA, 0x08BD, 0x08C0, 0x0001, 0x0000, 0x00C6, 0x0041, 0x0041, 0x00C7, 0x08AC, 0x0053, 0x0053, 0x0000, 0x08B0, 0x0053, 0x0053, 0x0000, 0x08B4, 0x0001, 0x0000, 0x00C8, 0x0001, 0x0000, 0x00C9, 0x0001, 0x0000, 0x00CA, 0x0001, 0x0000, 0x00CB, 0x0001, 0x0000, 0x00CC, 0x0044, 0x0054, 0x0000, 0x08D7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x08DA, 0x0000, 0x08DD, 0x0001, 0x0000, 0x00CD, 0x0001, 0x0000, 0x00CE, 0x0001, 0x0000, 0x00CF, 0x0041, 0x0041, 0x0000, 0x08E4, 0x0001, 0x0000, 0x00D0, 0x0043, 0x0044, 0x0000, 0x08EC, 0x08EF, 0x0001, 0x0000, 0x00D1, 0x0001, 0x0000, 0x00D2, 0x0053, 0x0053, 0x0000, 0x08F6, 0x0001, 0x0000, 0x00D3, 0x0045, 0x0054, 0x0000, 0x090C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x090F, 0x0000, 0x0000, 0x0912, 0x0915, 0x0001, 0x0000, 0x00D4, 0x0001, 0x0000, 0x00D5, 0x0001, 0x0000, 0x00D6, 0x0001, 0x0000, 0x00D7, 0x0053, 0x0053, 0x0000, 0x091C, 0x0001, 0x0000, 0x00D8, 0x0049, 0x0050, 0x0000, 0x092A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x092D, 0x0930, 0x0001, 0x0000, 0x00D9, 0x0001, 0x0000, 0x00DA, 0x0001, 0x0000, 0x00DB, 0x0049, 0x0053, 0x0000, 0x0941, 0x0000, 0x0000, 0x0000, 0x0944, 0x0000, 0x0000, 0x0000, 0x0000, 0x0947, 0x094A, 0x0001, 0x0000, 0x00DC, 0x0001, 0x0000, 0x00DD, 0x0001, 0x0000, 0x00DE, 0x0001, 0x0000, 0x00DF, 0x0044, 0x0053, 0x0000, 0x0960, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0963, 0x0966, 0x0001, 0x0000, 0x00E0, 0x0001, 0x0000, 0x00E1, 0x0001, 0x0000, 0x00E2, 0x0041, 0x0057, 0x0000, 0x0983, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0986, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0989, 0x0000, 0x098C, 0x098F, 0x0000, 0x0000, 0x0000, 0x0992, 0x0001, 0x0000, 0x00E3, 0x0001, 0x0000, 0x00E4, 0x0001, 0x0000, 0x00E5, 0x0001, 0x0000, 0x00E6, 0x0001, 0x0000, 0x00E7, 0x0001, 0x0000, 0x00E8, 0x0048, 0x0059, 0x0000, 0x09AA, 0x0000, 0x0000, 0x0000, 0x0000, 0x09AD, 0x0000, 0x0000, 0x0000, 0x09B0, 0x0000, 0x09B3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x09B6, 0x0001, 0x0000, 0x00E9, 0x0001, 0x0000, 0x00EA, 0x0001, 0x0000, 0x00EB, 0x0001, 0x0000, 0x00EC, 0x0001, 0x0000, 0x00ED, 0x0041, 0x0050, 0x0000, 0x09CC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x09CF, 0x0001, 0x0000, 0x00EE, 0x0001, 0x0000, 0x00EF, 0x0048, 0x0053, 0x0000, 0x09E1, 0x0000, 0x0000, 0x0000, 0x0000, 0x09E4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x09E7, 0x0001, 0x0000, 0x00F0, 0x0001, 0x0000, 0x00F1, 0x0001, 0x0000, 0x00F2, 0x0043, 0x0053, 0x0000, 0x09FE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0A14, 0x0000, 0x0A2A, 0x0000, 0x0000, 0x0000, 0x0A31, 0x0041, 0x0049, 0x0000, 0x0A0A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0A11, 0x0050, 0x0050, 0x0000, 0x0A0E, 0x0001, 0x0000, 0x00F3, 0x0001, 0x0000, 0x00F4, 0x0049, 0x0052, 0x0000, 0x0A21, 0x0000, 0x0000, 0x0000, 0x0A24, 0x0000, 0x0000, 0x0000, 0x0000, 0x0A27, 0x0001, 0x0000, 0x00F5, 0x0001, 0x0000, 0x00F6, 0x0001, 0x0000, 0x00F7, 0x0049, 0x0049, 0x0000, 0x0A2E, 0x0001, 0x0000, 0x00F8, 0x004E, 0x004E, 0x0000, 0x0A35, 0x0001, 0x0000, 0x00F9, 0x0042, 0x0052, 0x0000, 0x0A4C, 0x0A60, 0x0A78, 0x0000, 0x0A83, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0A8A, 0x0000, 0x0000, 0x0000, 0x0A9D, 0x0000, 0x0AA4, 0x0043, 0x004D, 0x0000, 0x0A5A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0A5D, 0x0001, 0x0000, 0x00FA, 0x0001, 0x0000, 0x00FB, 0x0046, 0x004C, 0x0000, 0x0A6A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0A6D, 0x0001, 0x0000, 0x00FC, 0x004F, 0x004F, 0x0000, 0x0A71, 0x004B, 0x004B, 0x0000, 0x0A75, 0x0001, 0x0000, 0x00FD, 0x0053, 0x0053, 0x0000, 0x0A7C, 0x0052, 0x0052, 0x0000, 0x0A80, 0x0001, 0x0000, 0x00FE, 0x0043, 0x0043, 0x0000, 0x0A87, 0x0001, 0x0000, 0x00FF, 0x0052, 0x0053, 0x0000, 0x0A8F, 0x0A96, 0x0052, 0x0052, 0x0000, 0x0A93, 0x0001, 0x0000, 0x0100, 0x0044, 0x0044, 0x0000, 0x0A9A, 0x0001, 0x0000, 0x0101, 0x0052, 0x0052, 0x0000, 0x0AA1, 0x0001, 0x0000, 0x0102, 0x0054, 0x0054, 0x0000, 0x0AA8, 0x0053, 0x0053, 0x0000, 0x0AAC, 0x0001, 0x0000, 0x0103, 0x0041, 0x0056, 0x0000, 0x0AC8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0ACB, 0x0ACE, 0x0000, 0x0000, 0x0AD5, 0x0001, 0x0000, 0x0104, 0x0001, 0x0000, 0x0105, 0x0043, 0x0043, 0x0106, 0x0AD2, 0x0001, 0x0000, 0x0107, 0x0031, 0x0031, 0x0000, 0x0AD9, 0x0038, 0x0038, 0x0000, 0x0ADD, 0x0041, 0x0053, 0x0000, 0x0AF3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0AFA, 0x0000, 0x0AFD, 0x0B00, 0x004D, 0x004D, 0x0000, 0x0AF7, 0x0001, 0x0000, 0x0108, 0x0001, 0x0000, 0x0109, 0x0001, 0x0000, 0x010A, 0x0001, 0x0000, 0x010B, 0x0043, 0x0053, 0x0000, 0x0B17, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0B1E, 0x0000, 0x0000, 0x0000, 0x0B25, 0x0000, 0x0000, 0x0000, 0x0B44, 0x0000, 0x0B4B, 0x0057, 0x0057, 0x0000, 0x0B1B, 0x0001, 0x0000, 0x010C, 0x0047, 0x0047, 0x0000, 0x0B22, 0x0001, 0x0000, 0x010D, 0x0048, 0x0048, 0x0000, 0x0B29, 0x0046, 0x0054, 0x010E, 0x0B3B, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0B3E, 0x0000, 0x0B41, 0x0001, 0x0000, 0x010F, 0x0001, 0x0000, 0x0110, 0x0001, 0x0000, 0x0111, 0x0043, 0x0043, 0x0000, 0x0B48, 0x0001, 0x0000, 0x0112, 0x0053, 0x0053, 0x0000, 0x0B4F, 0x0001, 0x0000, 0x0113, 0x0041, 0x0056, 0x0000, 0x0B6B, 0x0000, 0x0B90, 0x0B9B, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0BB7, 0x0000, 0x0BC2, 0x0000, 0x0BD1, 0x0043, 0x0054, 0x0000, 0x0B80, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0B83, 0x0000, 0x0000, 0x0000, 0x0000, 0x0B86, 0x0000, 0x0B8D, 0x0001, 0x0000, 0x0114, 0x0001, 0x0000, 0x0115, 0x0052, 0x0052, 0x0116, 0x0B8A, 0x0001, 0x0000, 0x0117, 0x0001, 0x0000, 0x0118, 0x0052, 0x0052, 0x0000, 0x0B94, 0x0052, 0x0052, 0x0000, 0x0B98, 0x0001, 0x0000, 0x0119, 0x0043, 0x0052, 0x0000, 0x0BAE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0BB1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0BB4, 0x0001, 0x0000, 0x011A, 0x0001, 0x0000, 0x011B, 0x0001, 0x0000, 0x011C, 0x0053, 0x0053, 0x0000, 0x0BBB, 0x0043, 0x0043, 0x0000, 0x0BBF, 0x0001, 0x0000, 0x011D, 0x0043, 0x0048, 0x0000, 0x0BCB, 0x0000, 0x0000, 0x0000, 0x0000, 0x0BCE, 0x0001, 0x0000, 0x011E, 0x0001, 0x0000, 0x011F, 0x0043, 0x0054, 0x0000, 0x0BE6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0BE9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0BEC, 0x0000, 0x0BF3, 0x0001, 0x0000, 0x0120, 0x0001, 0x0000, 0x0121, 0x0052, 0x0052, 0x0122, 0x0BF0, 0x0001, 0x0000, 0x0123, 0x0001, 0x0000, 0x0124, 0x0041, 0x0054, 0x0000, 0x0C0D, 0x0000, 0x0000, 0x0C27, 0x0C32, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0C86, 0x0C91, 0x0CA0, 0x0000, 0x0000, 0x0000, 0x0CAB, 0x0CC2, 0x0CD1, 0x0044, 0x004C, 0x0000, 0x0C19, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0C20, 0x0052, 0x0052, 0x0000, 0x0C1D, 0x0001, 0x0000, 0x0125, 0x0053, 0x0053, 0x0126, 0x0C24, 0x0001, 0x0000, 0x0127, 0x004C, 0x004C, 0x0000, 0x0C2B, 0x0053, 0x0053, 0x0000, 0x0C2F, 0x0001, 0x0000, 0x0128, 0x0031, 0x0052, 0x0000, 0x0C57, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0C66, 0x0000, 0x0C7B, 0x0034, 0x0034, 0x0000, 0x0C5B, 0x0030, 0x0031, 0x0000, 0x0C60, 0x0C63, 0x0001, 0x0000, 0x0129, 0x0001, 0x0000, 0x012A, 0x0041, 0x0044, 0x0000, 0x0C6D, 0x0000, 0x0000, 0x0C74, 0x004C, 0x004C, 0x0000, 0x0C71, 0x0001, 0x0000, 0x012B, 0x004C, 0x004C, 0x0000, 0x0C78, 0x0001, 0x0000, 0x012C, 0x0044, 0x0044, 0x0000, 0x0C7F, 0x004C, 0x004C, 0x0000, 0x0C83, 0x0001, 0x0000, 0x012D, 0x0044, 0x0044, 0x0000, 0x0C8A, 0x004C, 0x004C, 0x0000, 0x0C8E, 0x0001, 0x0000, 0x012E, 0x004F, 0x004F, 0x0000, 0x0C95, 0x0044, 0x0044, 0x012F, 0x0C99, 0x0045, 0x0045, 0x0000, 0x0C9D, 0x0001, 0x0000, 0x0130, 0x0055, 0x0055, 0x0000, 0x0CA4, 0x004D, 0x004D, 0x0000, 0x0CA8, 0x0001, 0x0000, 0x0131, 0x0044, 0x0045, 0x0000, 0x0CB0, 0x0CBB, 0x004C, 0x004C, 0x0000, 0x0CB4, 0x0053, 0x0053, 0x0132, 0x0CB8, 0x0001, 0x0000, 0x0133, 0x0053, 0x0053, 0x0000, 0x0CBF, 0x0001, 0x0000, 0x0134, 0x0045, 0x0045, 0x0000, 0x0CC6, 0x004C, 0x004C, 0x0000, 0x0CCA, 0x0046, 0x0046, 0x0000, 0x0CCE, 0x0001, 0x0000, 0x0135, 0x0045, 0x0045, 0x0000, 0x0CD5, 0x0052, 0x0052, 0x0000, 0x0CD9, 0x0001, 0x0000, 0x0136, 0x0041, 0x0058, 0x0000, 0x0CF7, 0x0D02, 0x0D09, 0x0D18, 0x0D3F, 0x0000, 0x0D46, 0x0D5D, 0x0D64, 0x0000, 0x0000, 0x0D72, 0x0000, 0x0D79, 0x0000, 0x0D80, 0x0000, 0x0D97, 0x0DC5, 0x0DE5, 0x0000, 0x0000, 0x0000, 0x0E19, 0x0043, 0x0043, 0x0000, 0x0CFB, 0x0052, 0x0052, 0x0137, 0x0CFF, 0x0001, 0x0000, 0x0138, 0x0054, 0x0054, 0x0000, 0x0D06, 0x0001, 0x0000, 0x0139, 0x0049, 0x0049, 0x0000, 0x0D0D, 0x0044, 0x0044, 0x0000, 0x0D11, 0x0052, 0x0052, 0x013A, 0x0D15, 0x0001, 0x0000, 0x013B, 0x0049, 0x0058, 0x0000, 0x0D2B, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0D36, 0x0000, 0x0D39, 0x0000, 0x0000, 0x0000, 0x0D3C, 0x0044, 0x0044, 0x0000, 0x0D2F, 0x0052, 0x0052, 0x013C, 0x0D33, 0x0001, 0x0000, 0x013D, 0x0001, 0x0000, 0x013E, 0x0001, 0x0000, 0x013F, 0x0001, 0x0000, 0x0140, 0x004D, 0x004D, 0x0000, 0x0D43, 0x0001, 0x0000, 0x0141, 0x004D, 0x0054, 0x0000, 0x0D51, 0x0000, 0x0000, 0x0000, 0x0000, 0x0D54, 0x0D57, 0x0D5A, 0x0001, 0x0000, 0x0142, 0x0001, 0x0000, 0x0143, 0x0001, 0x0000, 0x0144, 0x0001, 0x0000, 0x0145, 0x0043, 0x0043, 0x0000, 0x0D61, 0x0001, 0x0000, 0x0146, 0x0050, 0x0054, 0x0000, 0x0D6C, 0x0000, 0x0000, 0x0000, 0x0D6F, 0x0001, 0x0000, 0x0147, 0x0001, 0x0000, 0x0148, 0x0053, 0x0053, 0x0000, 0x0D76, 0x0001, 0x0000, 0x0149, 0x0048, 0x0048, 0x0000, 0x0D7D, 0x0001, 0x0000, 0x014A, 0x0048, 0x0052, 0x0000, 0x0D8E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0D91, 0x0000, 0x0D94, 0x0001, 0x0000, 0x014B, 0x0001, 0x0000, 0x014C, 0x0001, 0x0000, 0x014D, 0x0041, 0x0058, 0x0000, 0x0DB2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0DB5, 0x0000, 0x0000, 0x0DBC, 0x0000, 0x0DBF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0DC2, 0x0001, 0x0000, 0x014E, 0x0044, 0x0044, 0x0000, 0x0DB9, 0x0001, 0x0000, 0x014F, 0x0001, 0x0000, 0x0150, 0x0001, 0x0000, 0x0151, 0x0001, 0x0000, 0x0152, 0x0044, 0x0050, 0x0000, 0x0DD5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0DD8, 0x0000, 0x0000, 0x0000, 0x0DDF, 0x0000, 0x0000, 0x0DE2, 0x0001, 0x0000, 0x0153, 0x0044, 0x0044, 0x0000, 0x0DDC, 0x0001, 0x0000, 0x0154, 0x0001, 0x0000, 0x0155, 0x0001, 0x0000, 0x0156, 0x0041, 0x0058, 0x0000, 0x0E00, 0x0000, 0x0000, 0x0E03, 0x0E06, 0x0000, 0x0000, 0x0E0D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0E10, 0x0E13, 0x0000, 0x0000, 0x0000, 0x0000, 0x0E16, 0x0001, 0x0000, 0x0157, 0x0001, 0x0000, 0x0158, 0x0052, 0x0052, 0x0000, 0x0E0A, 0x0001, 0x0000, 0x0159, 0x0001, 0x0000, 0x015A, 0x0001, 0x0000, 0x015B, 0x0001, 0x0000, 0x015C, 0x0001, 0x0000, 0x015D, 0x0054, 0x0054, 0x0000, 0x0E1D, 0x0001, 0x0000, 0x015E, 0x0042, 0x0053, 0x015F, 0x0E35, 0x0E40, 0x0E82, 0x0E9C, 0x0EA7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0EB2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0EBD, 0x0000, 0x0EE1, 0x0EEC, 0x0041, 0x0041, 0x0000, 0x0E39, 0x0047, 0x0047, 0x0000, 0x0E3D, 0x0001, 0x0000, 0x0160, 0x0044, 0x0058, 0x0000, 0x0E58, 0x0000, 0x0000, 0x0000, 0x0E5F, 0x0E66, 0x0000, 0x0000, 0x0E6D, 0x0000, 0x0000, 0x0000, 0x0E74, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0E7B, 0x0041, 0x0041, 0x0000, 0x0E5C, 0x0001, 0x0000, 0x0161, 0x0047, 0x0047, 0x0000, 0x0E63, 0x0001, 0x0000, 0x0162, 0x0044, 0x0044, 0x0000, 0x0E6A, 0x0001, 0x0000, 0x0163, 0x004B, 0x004B, 0x0000, 0x0E71, 0x0001, 0x0000, 0x0164, 0x004E, 0x004E, 0x0000, 0x0E78, 0x0001, 0x0000, 0x0165, 0x0046, 0x0046, 0x0000, 0x0E7F, 0x0001, 0x0000, 0x0166, 0x0041, 0x0049, 0x0000, 0x0E8E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0E95, 0x0043, 0x0043, 0x0000, 0x0E92, 0x0001, 0x0000, 0x0167, 0x0052, 0x0052, 0x0000, 0x0E99, 0x0001, 0x0000, 0x0168, 0x0043, 0x0043, 0x0000, 0x0EA0, 0x0052, 0x0052, 0x0000, 0x0EA4, 0x0001, 0x0000, 0x0169, 0x004F, 0x004F, 0x0000, 0x0EAB, 0x004E, 0x004E, 0x0000, 0x0EAF, 0x0001, 0x0000, 0x016A, 0x0050, 0x0050, 0x0000, 0x0EB6, 0x0044, 0x0044, 0x0000, 0x0EBA, 0x0001, 0x0000, 0x016B, 0x0042, 0x0054, 0x0000, 0x0ED3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0EDA, 0x0041, 0x0041, 0x0000, 0x0ED7, 0x0001, 0x0000, 0x016C, 0x0048, 0x0048, 0x0000, 0x0EDE, 0x0001, 0x0000, 0x016D, 0x004C, 0x004C, 0x0000, 0x0EE5, 0x004B, 0x004B, 0x0000, 0x0EE9, 0x0001, 0x0000, 0x016E, 0x0034, 0x0054, 0x0000, 0x0F10, 0x0F1B, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0F3C, 0x0035, 0x0036, 0x0000, 0x0F15, 0x0F18, 0x0001, 0x0000, 0x016F, 0x0001, 0x0000, 0x0170, 0x0030, 0x0038, 0x0000, 0x0F27, 0x0F2A, 0x0F2D, 0x0F30, 0x0F33, 0x0000, 0x0000, 0x0F36, 0x0F39, 0x0001, 0x0000, 0x0171, 0x0001, 0x0000, 0x0172, 0x0001, 0x0000, 0x0173, 0x0001, 0x0000, 0x0174, 0x0001, 0x0000, 0x0175, 0x0001, 0x0000, 0x0176, 0x0001, 0x0000, 0x0177, 0x004C, 0x004C, 0x0000, 0x0F40, 0x0001, 0x0000, 0x0178, 0x0001, 0x0000, 0x0179, 0x0001, 0x0000, 0x017A, 0x0001, 0x0000, 0x017B, 0x0001, 0x0000, 0x017C, 0x0001, 0x0000, 0x017D, 0x0001, 0x0000, 0x017E, 0x0001, 0x0000, 0x017F, 0x0001, 0x0000, 0x0180, 0x0001, 0x0000, 0x0181, 0x0001, 0x0000, 0x0182, 0x0001, 0x0000, 0x0183, 0x0030, 0x0038, 0x0000, 0x0F70, 0x0F73, 0x0000, 0x0F7A, 0x0F7D, 0x0F80, 0x0F83, 0x0F86, 0x0F89, 0x0001, 0x0000, 0x0184, 0x0030, 0x0030, 0x0000, 0x0F77, 0x0001, 0x0000, 0x0185, 0x0001, 0x0000, 0x0186, 0x0001, 0x0000, 0x0187, 0x0001, 0x0000, 0x0188, 0x0001, 0x0000, 0x0189, 0x0001, 0x0000, 0x018A, 0x0001, 0x0000, 0x018B, 0x0001, 0x0000, 0x018C, 0x0001, 0x0000, 0x018D, 0x0001, 0x0000, 0x018E, 0x0001, 0x0000, 0x018F, }; #define COMMAND_TRIE_LEN 3991 iaxmodem-1.2.0/lib/spandsp/src/lpc10_decode.c0000644000175000017500000010600411150047216020244 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * lpc10_decode.c - LPC10 low bit rate speech codec. * * Written by Steve Underwood * * Copyright (C) 2006 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * This code is based on the U.S. Department of Defense reference * implementation of the LPC-10 2400 bps Voice Coder. They do not * exert copyright claims on their code, and it may be freely used. * * $Id: lpc10_decode.c,v 1.22 2008/07/02 14:48:25 steveu Exp $ */ #if defined(HAVE_CONFIG_H) #include #endif #include #include #include #include "floating_fudge.h" #if defined(HAVE_TGMATH_H) #include #endif #if defined(HAVE_MATH_H) #include #endif #include #include "spandsp/telephony.h" #include "spandsp/dc_restore.h" #include "spandsp/lpc10.h" #define LPC10_ORDER 10 #if !defined(min) #define min(a,b) ((a) <= (b) ? (a) : (b)) #endif #if !defined(max) #define max(a,b) ((a) >= (b) ? (a) : (b)) #endif /* Pseudo random number generator based on Knuth, Vol 2, p. 27. */ /* lpc10_random - int32_t variable, uniformly distributed over -32768 to 32767 */ static int32_t lpc10_random(lpc10_decode_state_t *s) { int32_t ret_val; /* The following is a 16 bit 2's complement addition, with overflow checking disabled */ s->y[s->k] += s->y[s->j]; ret_val = s->y[s->k]; if (--s->k < 0) s->k = 4; if (--s->j < 0) s->j = 4; return ret_val; } /*- End of function --------------------------------------------------------*/ static __inline__ int32_t pow_ii(int32_t x, int32_t n) { int32_t pow; uint32_t u; if (n <= 0) { if (n == 0 || x == 1) return 1; if (x != -1) return (x == 0) ? 1/x : 0; n = -n; } u = n; for (pow = 1; ; ) { if ((u & 1)) pow *= x; if ((u >>= 1) == 0) break; x *= x; } return pow; } /*- End of function --------------------------------------------------------*/ /* Synthesize one pitch epoch */ static void bsynz(lpc10_decode_state_t *s, float coef[], int32_t ip, int32_t *iv, float sout[], float rms, float ratio, float g2pass) { static const int32_t kexc[25] = { 8, -16, 26, -48, 86, -162, 294, -502, 718, -728, 184, 672, -610, -672, 184, 728, 718, 502, 294, 162, 86, 48, 26, 16, 8 }; int32_t i; int32_t j; int32_t k; int32_t px; float noise[166]; float pulse; float r1; float gain; float xssq; float sscale; float xy; float sum; float ssq; float lpi0; float hpi0; /* MAXPIT + MAXORD = 166 */ /* Calculate history scale factor XY and scale filter state */ /* Computing MIN */ r1 = s->rmso_bsynz/(rms + 1.0e-6f); xy = min(r1, 8.0f); s->rmso_bsynz = rms; for (i = 0; i < LPC10_ORDER; i++) s->exc2[i] = s->exc2[s->ipo + i]*xy; s->ipo = ip; if (*iv == 0) { /* Generate white noise for unvoiced */ for (i = 0; i < ip; i++) s->exc[LPC10_ORDER + i] = (float) (lpc10_random(s)/64); /* Impulse double excitation for plosives */ px = (lpc10_random(s) + 32768)*(ip - 1)/65536 + LPC10_ORDER + 1; r1 = ratio/4.0f; pulse = r1*342; if (pulse > 2.0e3f) pulse = 2.0e3f; s->exc[px - 1] += pulse; s->exc[px] -= pulse; } else { sscale = sqrtf((float) ip)/6.928f; for (i = 0; i < ip; i++) { s->exc[LPC10_ORDER + i] = 0.0f; if (i < 25) s->exc[LPC10_ORDER + i] = sscale*kexc[i]; lpi0 = s->exc[LPC10_ORDER + i]; s->exc[LPC10_ORDER + i] = s->exc[LPC10_ORDER + i]*0.125f + s->lpi[0]*0.75f + s->lpi[1]*0.125f; s->lpi[1] = s->lpi[0]; s->lpi[0] = lpi0; } for (i = 0; i < ip; i++) { noise[LPC10_ORDER + i] = lpc10_random(s)/64.0f; hpi0 = noise[LPC10_ORDER + i]; noise[LPC10_ORDER + i] = noise[LPC10_ORDER + i]*-0.125f + s->hpi[0]*0.25f + s->hpi[1]*-0.125f; s->hpi[1] = s->hpi[0]; s->hpi[0] = hpi0; } for (i = 0; i < ip; i++) s->exc[LPC10_ORDER + i] += noise[LPC10_ORDER + i]; } /* Synthesis filters: */ /* Modify the excitation with all-zero filter 1 + G*SUM */ xssq = 0.0f; for (i = 0; i < ip; i++) { k = LPC10_ORDER + i; sum = 0.0f; for (j = 0; j < LPC10_ORDER; j++) sum += coef[j]*s->exc[k - j - 1]; sum *= g2pass; s->exc2[k] = sum + s->exc[k]; } /* Synthesize using the all pole filter 1/(1 - SUM) */ for (i = 0; i < ip; i++) { k = LPC10_ORDER + i; sum = 0.0f; for (j = 0; j < LPC10_ORDER; j++) sum += coef[j]*s->exc2[k - j - 1]; s->exc2[k] = sum + s->exc2[k]; xssq += s->exc2[k]*s->exc2[k]; } /* Save filter history for next epoch */ for (i = 0; i < LPC10_ORDER; i++) { s->exc[i] = s->exc[ip + i]; s->exc2[i] = s->exc2[ip + i]; } /* Apply gain to match RMS */ ssq = rms*rms*ip; gain = sqrtf(ssq/xssq); for (i = 0; i < ip; i++) sout[i] = gain*s->exc2[LPC10_ORDER + i]; } /*- End of function --------------------------------------------------------*/ /* Synthesize a single pitch epoch */ static int pitsyn(lpc10_decode_state_t *s, int voice[], int32_t *pitch, float *rms, float *rc, int32_t ivuv[], int32_t ipiti[], float *rmsi, float *rci, int32_t *nout, float *ratio) { int32_t rci_dim1; int32_t rci_offset; int32_t i1; int32_t i; int32_t j; int32_t vflag; int32_t jused; int32_t lsamp; int32_t ip; int32_t nl; int32_t ivoice; int32_t istart; float r1; float alrn; float alro; float yarc[10]; float prop; float slope; float uvpit; float xxy; rci_dim1 = LPC10_ORDER; rci_offset = rci_dim1 + 1; rci -= rci_offset; if (*rms < 1.0f) *rms = 1.0f; if (s->rmso < 1.0f) s->rmso = 1.0f; uvpit = 0.0f; *ratio = *rms/(s->rmso + 8.0f); if (s->first_pitsyn) { lsamp = 0; ivoice = voice[1]; if (ivoice == 0) *pitch = LPC10_SAMPLES_PER_FRAME/4; *nout = LPC10_SAMPLES_PER_FRAME / *pitch; s->jsamp = LPC10_SAMPLES_PER_FRAME - *nout * *pitch; i1 = *nout; for (i = 0; i < i1; i++) { for (j = 0; j < LPC10_ORDER; j++) rci[j + (i + 1)*rci_dim1 + 1] = rc[j]; ivuv[i] = ivoice; ipiti[i] = *pitch; rmsi[i] = *rms; } s->first_pitsyn = FALSE; } else { vflag = 0; lsamp = LPC10_SAMPLES_PER_FRAME + s->jsamp; slope = (*pitch - s->ipito)/(float) lsamp; *nout = 0; jused = 0; istart = 1; if (voice[0] == s->ivoico && voice[1] == voice[0]) { if (voice[1] == 0) { /* SSUV - - 0 , 0 , 0 */ *pitch = LPC10_SAMPLES_PER_FRAME/4; s->ipito = *pitch; if (*ratio > 8.0f) s->rmso = *rms; } /* SSVC - - 1 , 1 , 1 */ slope = (*pitch - s->ipito)/(float) lsamp; ivoice = voice[1]; } else { if (s->ivoico != 1) { if (s->ivoico == voice[0]) { /* UV2VC2 - - 0 , 0 , 1 */ nl = lsamp - LPC10_SAMPLES_PER_FRAME/4; } else { /* UV2VC1 - - 0 , 1 , 1 */ nl = lsamp - LPC10_SAMPLES_PER_FRAME*3/4; } ipiti[0] = nl/2; ipiti[1] = nl - ipiti[0]; ivuv[0] = 0; ivuv[1] = 0; rmsi[0] = s->rmso; rmsi[1] = s->rmso; for (i = 0; i < LPC10_ORDER; i++) { rci[i + rci_dim1 + 1] = s->rco[i]; rci[i + (rci_dim1 << 1) + 1] = s->rco[i]; s->rco[i] = rc[i]; } slope = 0.0f; *nout = 2; s->ipito = *pitch; jused = nl; istart = nl + 1; ivoice = 1; } else { if (s->ivoico != voice[0]) { /* VC2UV1 - - 1 , 0 , 0 */ lsamp = LPC10_SAMPLES_PER_FRAME/4 + s->jsamp; } else { /* VC2UV2 - - 1 , 1 , 0 */ lsamp = LPC10_SAMPLES_PER_FRAME*3/4 + s->jsamp; } for (i = 0; i < LPC10_ORDER; i++) { yarc[i] = rc[i]; rc[i] = s->rco[i]; } ivoice = 1; slope = 0.0f; vflag = 1; } } /* Here is the value of most variables that are used below, depending on */ /* the values of IVOICO, VOICE(1), and VOICE(2). VOICE(1) and VOICE(2) */ /* are input arguments, and IVOICO is the value of VOICE(2) on the */ /* previous call (see notes for the IF (NOUT .NE. 0) statement near the */ /* end). Each of these three values is either 0 or 1. These three */ /* values below are given as 3-bit long strings, in the order IVOICO, */ /* VOICE(1), and VOICE(2). It appears that the code above assumes that */ /* the bit sequences 010 and 101 never occur, but I wonder whether a */ /* large enough number of bit errors in the channel could cause such a */ /* thing to happen, and if so, could that cause NOUT to ever go over 11? */ /* Note that all of the 180 values in the table are floatly LFRAME, but */ /* 180 has fewer characters, and it makes the table a little more */ /* concrete. If LFRAME is ever changed, keep this in mind. Similarly, */ /* 135's are 3*LFRAME/4, and 45's are LFRAME/4. If LFRAME is not a */ /* multiple of 4, then the 135 for NL-JSAMP is actually LFRAME-LFRAME/4, */ /* and the 45 for NL-JSAMP is actually LFRAME-3*LFRAME/4. */ /* Note that LSAMP-JSAMP is given as the variable. This was just for */ /* brevity, to avoid adding "+JSAMP" to all of the column entries. */ /* Similarly for NL-JSAMP. */ /* Variable | 000 001 011,010 111 110 100,101 */ /* ------------+-------------------------------------------------- */ /* ISTART | 1 NL+1 NL+1 1 1 1 */ /* LSAMP-JSAMP | 180 180 180 180 135 45 */ /* IPITO | 45 PITCH PITCH oldPITCH oldPITCH oldPITCH */ /* SLOPE | 0 0 0 seebelow 0 0 */ /* JUSED | 0 NL NL 0 0 0 */ /* PITCH | 45 PITCH PITCH PITCH PITCH PITCH */ /* NL-JSAMP | -- 135 45 -- -- -- */ /* VFLAG | 0 0 0 0 1 1 */ /* NOUT | 0 2 2 0 0 0 */ /* IVOICE | 0 1 1 1 1 1 */ /* while_loop | once once once once twice twice */ /* ISTART | -- -- -- -- JUSED+1 JUSED+1 */ /* LSAMP-JSAMP | -- -- -- -- 180 180 */ /* IPITO | -- -- -- -- oldPITCH oldPITCH */ /* SLOPE | -- -- -- -- 0 0 */ /* JUSED | -- -- -- -- ?? ?? */ /* PITCH | -- -- -- -- PITCH PITCH */ /* NL-JSAMP | -- -- -- -- -- -- */ /* VFLAG | -- -- -- -- 0 0 */ /* NOUT | -- -- -- -- ?? ?? */ /* IVOICE | -- -- -- -- 0 0 */ /* UVPIT is always 0.0 on the first pass through the DO WHILE (TRUE) loop below. */ /* The only possible non-0 value of SLOPE (in column 111) is (PITCH-IPITO)/FLOAT(LSAMP) */ /* Column 101 is identical to 100. Any good properties we can prove for 100 will also hold for 101. Similarly for 010 and 011. */ /* synths() calls this subroutine with PITCH restricted to the range 20 to 156. IPITO is similarly restricted to this range, after the first call. IP below is also restricted to this range, given the definitions of IPITO, SLOPE, UVPIT, and that I is in the range ISTART to LSAMP. */ for (;;) { for (i = istart; i <= lsamp; i++) { r1 = s->ipito + slope*i; ip = (int32_t) (r1 + 0.5f); if (uvpit != 0.0f) ip = (int32_t) uvpit; if (ip <= i - jused) { ++(*nout); ipiti[*nout - 1] = ip; *pitch = ip; ivuv[*nout - 1] = ivoice; jused += ip; prop = (jused - ip/2)/(float) lsamp; for (j = 0; j < LPC10_ORDER; j++) { alro = logf((s->rco[j] + 1)/(1 - s->rco[j])); alrn = logf((rc[j] + 1)/(1 - rc[j])); xxy = alro + prop*(alrn - alro); xxy = expf(xxy); rci[j + *nout*rci_dim1 + 1] = (xxy - 1.0f)/(xxy + 1.0f); } rmsi[*nout - 1] = logf(s->rmso) + prop*(logf(*rms) - logf(s->rmso)); rmsi[*nout - 1] = expf(rmsi[*nout - 1]); } } if (vflag != 1) break; vflag = 0; istart = jused + 1; lsamp = LPC10_SAMPLES_PER_FRAME + s->jsamp; slope = 0.0f; ivoice = 0; uvpit = (float) ((lsamp - istart)/2); if (uvpit > 90.0f) uvpit /= 2; s->rmso = *rms; for (i = 0; i < LPC10_ORDER; i++) { rc[i] = yarc[i]; s->rco[i] = yarc[i]; } } s->jsamp = lsamp - jused; } if (*nout != 0) { s->ivoico = voice[1]; s->ipito = *pitch; s->rmso = *rms; for (i = 0; i < LPC10_ORDER; i++) s->rco[i] = rc[i]; } return 0; } /*- End of function --------------------------------------------------------*/ static void deemp(lpc10_decode_state_t *s, float x[], int len) { int i; float r1; float dei0; for (i = 0; i < len; i++) { dei0 = x[i]; r1 = x[i] - s->dei[0]*1.9998f + s->dei[1]; x[i] = r1 + s->deo[0]*2.5f - s->deo[1]*2.0925f + s->deo[2]*0.585f; s->dei[1] = s->dei[0]; s->dei[0] = dei0; s->deo[2] = s->deo[1]; s->deo[1] = s->deo[0]; s->deo[0] = x[i]; } } /*- End of function --------------------------------------------------------*/ /* Convert reflection coefficients to predictor coefficients */ static float reflection_coeffs_to_predictor_coeffs(float rc[], float pc[], float gprime) { float temp[10]; float g2pass; int i; int j; g2pass = 1.0f; for (i = 0; i < LPC10_ORDER; i++) g2pass *= 1.0f - rc[i]*rc[i]; g2pass = gprime*sqrtf(g2pass); pc[0] = rc[0]; for (i = 1; i < LPC10_ORDER; i++) { for (j = 0; j < i; j++) temp[j] = pc[j] - rc[i]*pc[i - j - 1]; for (j = 0; j < i; j++) pc[j] = temp[j]; pc[i] = rc[i]; } return g2pass; } /*- End of function --------------------------------------------------------*/ static int synths(lpc10_decode_state_t *s, int voice[], int32_t *pitch, float *rms, float *rc, float speech[]) { int32_t i1; int32_t ivuv[16]; int32_t ipiti[16]; int32_t nout; int32_t i; int32_t j; float rmsi[16]; float ratio; float g2pass; float pc[10]; float rci[160]; i1 = min(*pitch, 156); *pitch = max(i1, 20); for (i = 0; i < LPC10_ORDER; i++) rc[i] = max(min(rc[i], 0.99f), -0.99f); pitsyn(s, voice, pitch, rms, rc, ivuv, ipiti, rmsi, rci, &nout, &ratio); if (nout > 0) { for (j = 0; j < nout; j++) { /* Add synthesized speech for pitch period J to the end of s->buf. */ g2pass = reflection_coeffs_to_predictor_coeffs(&rci[j*10], pc, 0.7f); bsynz(s, pc, ipiti[j], &ivuv[j], &s->buf[s->buflen], rmsi[j], ratio, g2pass); deemp(s, &s->buf[s->buflen], ipiti[j]); s->buflen += ipiti[j]; } /* Copy first MAXFRM samples from BUF to output array speech (scaling them), and then remove them from the beginning of s->buf. */ for (i = 0; i < LPC10_SAMPLES_PER_FRAME; i++) speech[i] = s->buf[i]/4096.0f; s->buflen -= LPC10_SAMPLES_PER_FRAME; for (i = 0; i < s->buflen; i++) s->buf[i] = s->buf[i + LPC10_SAMPLES_PER_FRAME]; } return 0; } /*- End of function --------------------------------------------------------*/ static void lpc10_unpack(lpc10_frame_t *t, const uint8_t ibits[]) { static const int bit[10] = { 2, 4, 8, 8, 8, 8, 16, 16, 16, 16 }; static const int iblist[53] = { 13, 12, 11, 1, 2, 13, 12, 11, 1, 2, 13, 10, 11, 2, 1, 10, 13, 12, 11, 10, 2, 13, 12, 11, 10, 2, 1, 12, 7, 6, 1, 10, 9, 8, 7, 4, 6, 9, 8, 7, 5, 1, 9, 8, 4, 6, 1, 5, 9, 8, 7, 5, 6 }; int32_t itab[13]; int x; int i; /* ibits is 54 bits of LPC data ordered as follows: */ /* R1-0, R2-0, R3-0, P-0, A-0, */ /* R1-1, R2-1, R3-1, P-1, A-1, */ /* R1-2, R4-0, R3-2, A-2, P-2, R4-1, */ /* R1-3, R2-2, R3-3, R4-2, A-3, */ /* R1-4, R2-3, R3-4, R4-3, A-4, */ /* P-3, R2-4, R7-0, R8-0, P-4, R4-4, */ /* R5-0, R6-0, R7-1,R10-0, R8-1, */ /* R5-1, R6-1, R7-2, R9-0, P-5, */ /* R5-2, R6-2,R10-1, R8-2, P-6, R9-1, */ /* R5-3, R6-3, R7-3, R9-2, R8-3, SYNC */ /* Reconstruct ITAB */ for (i = 0; i < 13; i++) itab[i] = 0; for (i = 0; i < 53; i++) { x = 52 - i; x = (ibits[x >> 3] >> (7 - (x & 7))) & 1; itab[iblist[52 - i] - 1] = (itab[iblist[52 - i] - 1] << 1) | x; } /* Sign extend the RC's */ for (i = 0; i < LPC10_ORDER; i++) { if ((itab[i + 3] & bit[i])) itab[i + 3] -= (bit[i] << 1); } /* Restore variables */ t->ipitch = itab[0]; t->irms = itab[1]; for (i = 0; i < LPC10_ORDER; i++) t->irc[i] = itab[LPC10_ORDER - 1 - i + 3]; } /*- End of function --------------------------------------------------------*/ /* Hamming 8, 4 decoder - can correct 1 out of seven bits and can detect up to two errors. */ /* This subroutine is entered with an eight bit word in INPUT. The 8th */ /* bit is parity and is stripped off. The remaining 7 bits address the */ /* hamming 8, 4 table and the output OUTPUT from the table gives the 4 */ /* bits of corrected data. If bit 4 is set, no error was detected. */ /* ERRCNT is the number of errors counted. */ static int32_t hamming_84_decode(int32_t input, int *errcnt) { static const uint8_t dactab[128] = { 16, 0, 0, 3, 0, 5, 14, 7, 0, 9, 14, 11, 14, 13, 30, 14, 0, 9, 2, 7, 4, 7, 7, 23, 9, 25, 10, 9, 12, 9, 14, 7, 0, 5, 2, 11, 5, 21, 6, 5, 8, 11, 11, 27, 12, 5, 14, 11, 2, 1, 18, 2, 12, 5, 2, 7, 12, 9, 2, 11, 28, 12, 12, 15, 0, 3, 3, 19, 4, 13, 6, 3, 8, 13, 10, 3, 13, 29, 14, 13, 4, 1, 10, 3, 20, 4, 4, 7, 10, 9, 26, 10, 4, 13, 10, 15, 8, 1, 6, 3, 6, 5, 22, 6, 24, 8, 8, 11, 8, 13, 6, 15, 1, 17 , 2, 1, 4, 1, 6, 15, 8, 1, 10, 15, 12, 15, 15, 31 }; int i; int parity; int32_t output; parity = input & 255; parity ^= parity >> 4; parity ^= parity >> 2; parity ^= parity >> 1; parity &= 1; i = dactab[input & 127]; output = i & 15; if ((i & 16)) { /* No errors detected in seven bits */ if (parity) (*errcnt)++; } else { /* One or two errors detected */ (*errcnt)++; if (parity == 0) { /* Two errors detected */ (*errcnt)++; output = -1; } } return output; } /*- End of function --------------------------------------------------------*/ static int32_t median(int32_t d1, int32_t d2, int32_t d3) { int32_t ret_val; ret_val = d2; if (d2 > d1 && d2 > d3) { ret_val = d1; if (d3 > d1) ret_val = d3; } else if (d2 < d1 && d2 < d3) { ret_val = d1; if (d3 < d1) ret_val = d3; } return ret_val; } /*- End of function --------------------------------------------------------*/ static void decode(lpc10_decode_state_t *s, lpc10_frame_t *t, int voice[], int32_t *pitch, float *rms, float rc[]) { static const int32_t ivtab[32] = { 24960, 24960, 24960, 24960, 25480, 25480, 25483, 25480, 16640, 1560, 1560, 1560, 16640, 1816, 1563, 1560, 24960, 24960, 24859, 24856, 26001, 25881, 25915, 25913, 1560, 1560, 7800, 3640, 1561, 1561, 3643, 3641 }; static const float corth[32] = { 32767.0f, 10.0f, 5.0f, 0.0f, 32767.0f, 8.0f, 4.0f, 0.0f, 32.0f, 6.4f, 3.2f, 0.0f, 32.0f, 6.4f, 3.2f, 0.0f, 32.0f, 11.2f, 6.4f, 0.0f, 32.0f, 11.2f, 6.4f, 0.0f, 16.0f, 5.6f, 3.2f, 0.0f, 16.0f, 5.6f, 3.2f, 0.0f }; static const int32_t detau[128] = { 0, 0, 0, 3, 0, 3, 3, 31, 0, 3, 3, 21, 3, 3, 29, 30, 0, 3, 3, 20, 3, 25, 27, 26, 3, 23, 58, 22, 3, 24, 28, 3, 0, 3, 3, 3, 3, 39, 33, 32, 3, 37, 35, 36, 3, 38, 34, 3, 3, 42, 46, 44, 50, 40, 48, 3, 54, 3, 56, 3, 52, 3, 3, 1, 0, 3, 3, 108, 3, 78, 100, 104, 3, 84, 92, 88, 156, 80, 96, 3, 3, 74, 70, 72, 66, 76, 68, 3, 62, 3, 60, 3, 64, 3, 3, 1, 3, 116, 132, 112, 148, 152, 3, 3, 140, 3, 136, 3, 144, 3, 3, 1, 124, 120, 128, 3, 3, 3, 3, 1, 3, 3, 3, 1, 3, 1, 1, 1 }; static const int32_t rmst[64] = { 1024, 936, 856, 784, 718, 656, 600, 550, 502, 460, 420, 384, 352, 328, 294, 270, 246, 226, 206, 188, 172, 158, 144, 132, 120, 110, 102, 92, 84, 78, 70, 64, 60, 54, 50, 46, 42, 38, 34, 32, 30, 26, 24, 22, 20, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 }; static const int32_t detab7[32] = { 4, 11, 18, 25, 32, 39, 46, 53, 60, 66, 72, 77, 82, 87, 92, 96, 101, 104, 108, 111, 114, 115, 117, 119, 121, 122, 123, 124, 125, 126, 127, 127 }; static const float descl[8] = { 0.6953f, 0.625f, 0.5781f, 0.5469f, 0.5312f, 0.5391f, 0.4688f, 0.3828f }; static const int32_t deadd[8] = { 1152, -2816, -1536, -3584, -1280, -2432, 768, -1920 }; static const int32_t qb[8] = { 511, 511, 1023, 1023, 1023, 1023, 2047, 4095 }; static const int32_t nbit[10] = { 8, 8, 5, 5, 4, 4, 4, 4, 3, 2 }; static const int32_t zrc[10] = { 0, 0, 0, 0, 0, 3, 0, 2, 0, 0 }; static const int32_t bit[5] = { 2, 4, 8, 16, 32 }; int32_t ipit; int32_t iout; int32_t i; int32_t icorf; int32_t index; int32_t ivoic; int32_t ixcor; int32_t i1; int32_t i2; int32_t i4; int32_t ishift; int32_t lsb; int errcnt; /* If no error correction, do pitch and voicing then jump to decode */ i4 = detau[t->ipitch]; if (!s->error_correction) { voice[0] = 1; voice[1] = 1; if (t->ipitch <= 1) voice[0] = 0; if (t->ipitch == 0 || t->ipitch == 2) voice[1] = 0; if (i4 <= 4) i4 = s->iptold; *pitch = i4; if (voice[0] == 1 && voice[1] == 1) s->iptold = *pitch; if (voice[0] != voice[1]) *pitch = s->iptold; } else { /* Do error correction pitch and voicing */ if (i4 > 4) { s->dpit[0] = i4; ivoic = 2; s->iavgp = (s->iavgp*15 + i4 + 8)/16; } else { s->dpit[0] = s->iavgp; ivoic = i4; } s->drms[0] = t->irms; for (i = 0; i < LPC10_ORDER; i++) s->drc[i][0] = t->irc[i]; /* Determine index to IVTAB from V/UV decision */ /* If error rate is high then use alternate table */ index = (s->ivp2h << 4) + (s->iovoic << 2) + ivoic + 1; i1 = ivtab[index - 1]; ipit = i1 & 3; icorf = i1 >> 3; if (s->erate < 2048) icorf /= 64; /* Determine error rate: 4=high 1=low */ ixcor = 4; if (s->erate < 2048) ixcor = 3; if (s->erate < 1024) ixcor = 2; if (s->erate < 128) ixcor = 1; /* Voice/unvoice decision determined from bits 0 and 1 of IVTAB */ voice[0] = icorf/2 & 1; voice[1] = icorf & 1; /* Skip decoding on first frame because present data not yet available */ if (s->first) { s->first = FALSE; /* Assign PITCH a "default" value on the first call, since */ /* otherwise it would be left uninitialized. The two lines */ /* below were copied from above, since it seemed like a */ /* reasonable thing to do for the first call. */ if (i4 <= 4) i4 = s->iptold; *pitch = i4; } else { /* If bit 4 of ICORF is set then correct RMS and RC(1) - RC(4). */ /* Determine error rate and correct errors using a Hamming 8,4 code */ /* during transition of unvoiced frames. If IOUT is negative, */ /* more than 1 error occurred, use previous frame's parameters. */ if ((icorf & bit[3]) != 0) { errcnt = 0; lsb = s->drms[1] & 1; index = (s->drc[7][1] << 4) + s->drms[1]/2; iout = hamming_84_decode(index, &errcnt); s->drms[1] = s->drms[2]; if (iout >= 0) s->drms[1] = (iout << 1) + lsb; for (i = 1; i <= 4; i++) { if (i == 1) i1 = ((s->drc[8][1] & 7) << 1) + (s->drc[9][1] & 1); else i1 = s->drc[8 - i][1] & 15; i2 = s->drc[4 - i][1] & 31; lsb = i2 & 1; index = (i1 << 4) + (i2 >> 1); iout = hamming_84_decode(index, &errcnt); if (iout >= 0) { iout = (iout << 1) + lsb; if ((iout & 16) == 16) iout -= 32; } else { iout = s->drc[4 - i][2]; } s->drc[4 - i][1] = iout; } /* Determine error rate */ s->erate = (int32_t) (s->erate*0.96875f + errcnt*102.0f); } /* Get unsmoothed RMS, RC's, and PITCH */ t->irms = s->drms[1]; for (i = 0; i < LPC10_ORDER; i++) t->irc[i] = s->drc[i][1]; if (ipit == 1) s->dpit[1] = s->dpit[2]; if (ipit == 3) s->dpit[1] = s->dpit[0]; *pitch = s->dpit[1]; /* If bit 2 of ICORF is set then smooth RMS and RC's, */ if ((icorf & bit[1]) != 0) { if ((float) abs(s->drms[1] - s->drms[0]) >= corth[ixcor + 3] && (float) abs(s->drms[1] - s->drms[2]) >= corth[ixcor + 3]) { t->irms = median(s->drms[2], s->drms[1], s->drms[0]); } for (i = 0; i < 6; i++) { if ((float) abs(s->drc[i][1] - s->drc[i][0]) >= corth[ixcor + ((i + 3) << 2) - 5] && (float) abs(s->drc[i][1] - s->drc[i][2]) >= corth[ixcor + ((i + 3) << 2) - 5]) { t->irc[i] = median(s->drc[i][2], s->drc[i][1], s->drc[i][0]); } } } /* If bit 3 of ICORF is set then smooth pitch */ if ((icorf & bit[2]) != 0) { if ((float) abs(s->dpit[1] - s->dpit[0]) >= corth[ixcor - 1] && (float) abs(s->dpit[1] - s->dpit[2]) >= corth[ixcor - 1]) { *pitch = median(s->dpit[2], s->dpit[1], s->dpit[0]); } } /* If bit 5 of ICORF is set then RC(5) - RC(10) are loaded with values so that after quantization bias is removed in decode the values will be zero. */ } if ((icorf & bit[4]) != 0) { for (i = 4; i < LPC10_ORDER; i++) t->irc[i] = zrc[i]; } /* Housekeeping - one frame delay */ s->iovoic = ivoic; s->ivp2h = voice[1]; s->dpit[2] = s->dpit[1]; s->dpit[1] = s->dpit[0]; s->drms[2] = s->drms[1]; s->drms[1] = s->drms[0]; for (i = 0; i < LPC10_ORDER; i++) { s->drc[i][2] = s->drc[i][1]; s->drc[i][1] = s->drc[i][0]; } } /* Decode RMS */ t->irms = rmst[(31 - t->irms)*2]; /* Decode RC(1) and RC(2) from log-area-ratios */ /* Protect from illegal coded value (-16) caused by bit errors */ for (i = 0; i < 2; i++) { i2 = t->irc[i]; i1 = 0; if (i2 < 0) { i1 = 1; i2 = -i2; if (i2 > 15) i2 = 0; } i2 = detab7[i2*2]; if (i1 == 1) i2 = -i2; ishift = 15 - nbit[i]; t->irc[i] = i2*pow_ii(2, ishift); } /* Decode RC(3)-RC(10) to sign plus 14 bits */ for (i = 2; i < LPC10_ORDER; i++) { ishift = 15 - nbit[i]; i2 = t->irc[i]*pow_ii(2, ishift) + qb[i - 2]; t->irc[i] = (int32_t) (i2*descl[i - 2] + deadd[i - 2]); } /* Scale RMS and RC's to floats */ *rms = (float) t->irms; for (i = 0; i < LPC10_ORDER; i++) rc[i] = t->irc[i]/16384.0f; } /*- End of function --------------------------------------------------------*/ lpc10_decode_state_t *lpc10_decode_init(lpc10_decode_state_t *s, int error_correction) { static const int16_t rand_init[] = { -21161, -8478, 30892, -10216, 16950 }; int i; int j; if (s == NULL) { if ((s = (lpc10_decode_state_t *) malloc(sizeof(*s))) == NULL) return NULL; } s->error_correction = error_correction; /* State used by function decode */ s->iptold = 60; s->first = TRUE; s->ivp2h = 0; s->iovoic = 0; s->iavgp = 60; s->erate = 0; for (i = 0; i < 3; i++) { for (j = 0; j < 10; j++) s->drc[j][i] = 0; s->dpit[i] = 0; s->drms[i] = 0; } /* State used by function synths */ for (i = 0; i < 360; i++) s->buf[i] = 0.0f; s->buflen = LPC10_SAMPLES_PER_FRAME; /* State used by function pitsyn */ s->rmso = 1.0f; s->first_pitsyn = TRUE; /* State used by function bsynz */ s->ipo = 0; for (i = 0; i < 166; i++) { s->exc[i] = 0.0f; s->exc2[i] = 0.0f; } for (i = 0; i < 3; i++) { s->lpi[i] = 0.0f; s->hpi[i] = 0.0f; } s->rmso_bsynz = 0.0f; /* State used by function lpc10_random */ s->j = 1; s->k = 4; for (i = 0; i < 5; i++) s->y[i] = rand_init[i]; /* State used by function deemp */ for (i = 0; i < 2; i++) s->dei[i] = 0.0f; for (i = 0; i < 3; i++) s->deo[i] = 0.0f; return s; } /*- End of function --------------------------------------------------------*/ int lpc10_decode_release(lpc10_decode_state_t *s) { free(s); return 0; } /*- End of function --------------------------------------------------------*/ int lpc10_decode(lpc10_decode_state_t *s, int16_t amp[], const uint8_t code[], int len) { int voice[2]; int32_t pitch; float speech[LPC10_SAMPLES_PER_FRAME]; float rc[LPC10_ORDER]; lpc10_frame_t frame; float rms; int i; int j; int base; /* Decode 54 bits in 7 bytes to LPC10_SAMPLES_PER_FRAME speech samples. */ len /= 7; for (i = 0; i < len; i++) { lpc10_unpack(&frame, &code[i*7]); decode(s, &frame, voice, &pitch, &rms, rc); synths(s, voice, &pitch, &rms, rc, speech); base = i*LPC10_SAMPLES_PER_FRAME; for (j = 0; j < LPC10_SAMPLES_PER_FRAME; j++) amp[base + j] = (int16_t) lrintf(32768.0f*speech[j]); } return len*LPC10_SAMPLES_PER_FRAME; } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/v27ter_rx_4800_fixed_rrc.h0000644000175000017500000001540011150047216022370 0ustar julienjulien#define RX_PULSESHAPER_4800_GAIN 32767.000000f #define RX_PULSESHAPER_4800_COEFF_SETS 8 static const complexi16_t rx_pulseshaper_4800[RX_PULSESHAPER_4800_COEFF_SETS][27] = { { { 0, 0}, /* Filter 0 */ { 30, -93}, { -52, -8}, { 0, -233}, { 261, -41}, { 2, 8}, { 439, -224}, { 568, 782}, { -696, 696}, { -143, -104}, { -695, 1365}, { -3619, -1176}, { 934, -5900}, { 7298, 0}, { 1141, 7208}, { -5681, 1846}, { -1727, -3391}, { 1239, -900}, { -125, -125}, { 578, -796}, { 861, 439}, { -152, 469}, { 8, 1}, { 0, 264}, { -230, 36}, { -16, -50}, { -87, 44} }, { { 0, 0}, /* Filter 1 */ { 26, -81}, { -76, -12}, { 0, -249}, { 246, -39}, { -13, -41}, { 500, -255}, { 589, 811}, { -660, 660}, { -8, -5}, { -815, 1600}, { -3898, -1266}, { 969, -6123}, { 7375, 0}, { 1126, 7110}, { -5454, 1772}, { -1594, -3129}, { 1032, -750}, { -233, -233}, { 600, -826}, { 822, 419}, { -131, 403}, { 56, 9}, { 0, 274}, { -212, 33}, { -9, -27}, { -97, 49} }, { { 0, 0}, /* Filter 2 */ { 21, -67}, { -100, -15}, { 0, -262}, { 227, -35}, { -30, -95}, { 561, -286}, { 606, 834}, { -614, 614}, { 138, 100}, { -939, 1844}, { -4173, -1356}, { 1002, -6331}, { 7431, 0}, { 1107, 6992}, { -5216, 1694}, { -1460, -2866}, { 834, -606}, { -330, -330}, { 615, -846}, { 778, 396}, { -110, 338}, { 100, 15}, { 0, 280}, { -192, 30}, { -2, -6}, { -104, 53} }, { { 0, 0}, /* Filter 3 */ { 16, -51}, { -124, -19}, { 0, -272}, { 202, -32}, { -49, -152}, { 620, -315}, { 617, 850}, { -559, 559}, { 296, 215}, { -1066, 2093}, { -4444, -1444}, { 1033, -6522}, { 7465, 0}, { 1085, 6854}, { -4967, 1613}, { -1327, -2606}, { 645, -468}, { -417, -417}, { 622, -856}, { 729, 371}, { -89, 274}, { 139, 22}, { 0, 281}, { -171, 27}, { 4, 14}, { -110, 56} }, { { 0, 0}, /* Filter 4 */ { 10, -33}, { -148, -23}, { 0, -279}, { 173, -27}, { -68, -212}, { 676, -344}, { 623, 857}, { -493, 493}, { 466, 338}, { -1196, 2347}, { -4709, -1530}, { 1060, -6697}, { 7476, 0}, { 1060, 6697}, { -4709, 1530}, { -1196, -2347}, { 466, -338}, { -493, -493}, { 623, -857}, { 676, 344}, { -68, 212}, { 173, 27}, { 0, 279}, { -148, 23}, { 10, 33}, { -113, 58} }, { { 0, 0}, /* Filter 5 */ { 4, -14}, { -171, -27}, { 0, -281}, { 139, -22}, { -89, -274}, { 729, -371}, { 622, 856}, { -417, 417}, { 645, 468}, { -1327, 2606}, { -4967, -1613}, { 1085, -6854}, { 7465, 0}, { 1033, 6522}, { -4444, 1444}, { -1066, -2093}, { 296, -215}, { -559, -559}, { 617, -850}, { 620, 315}, { -49, 152}, { 202, 32}, { 0, 272}, { -124, 19}, { 16, 51}, { -115, 58} }, { { 0, 0}, /* Filter 6 */ { -2, 6}, { -192, -30}, { 0, -280}, { 100, -15}, { -110, -338}, { 778, -396}, { 615, 846}, { -330, 330}, { 834, 606}, { -1460, 2866}, { -5216, -1694}, { 1107, -6992}, { 7431, 0}, { 1002, 6331}, { -4173, 1356}, { -939, -1844}, { 138, -100}, { -614, -614}, { 606, -834}, { 561, 286}, { -30, 95}, { 227, 35}, { 0, 262}, { -100, 15}, { 21, 67}, { -115, 58} }, { { 0, 0}, /* Filter 7 */ { -9, 27}, { -212, -33}, { 0, -274}, { 56, -9}, { -131, -403}, { 822, -419}, { 600, 826}, { -233, 233}, { 1032, 750}, { -1594, 3129}, { -5454, -1772}, { 1126, -7110}, { 7375, 0}, { 969, 6123}, { -3898, 1266}, { -815, -1600}, { -8, 5}, { -660, -660}, { 589, -811}, { 500, 255}, { -13, 41}, { 246, 39}, { 0, 249}, { -76, 12}, { 26, 81}, { -112, 57} } }; iaxmodem-1.2.0/lib/spandsp/src/v17rx_floating_rrc.h0000644000175000017500000073616211150047216021565 0ustar julienjulien#define RX_PULSESHAPER_GAIN 1.000000f #define RX_PULSESHAPER_COEFF_SETS 192 static const complexf_t rx_pulseshaper[RX_PULSESHAPER_COEFF_SETS][27] = { { { -0.0020619018f, -0.0010505915f}, /* Filter 0 */ { 0.0003585523f, -0.0011035106f}, { -0.0033205507f, -0.0005259236f}, { 0.0000000000f, -0.0037433761f}, { -0.0024369440f, 0.0003859740f}, { -0.0015483286f, -0.0047652653f}, { -0.0039043549f, 0.0019893682f}, { -0.0072869120f, -0.0100295740f}, { -0.0031365185f, 0.0031365185f}, { -0.0318625939f, -0.0231495296f}, { 0.0179723867f, -0.0352727949f}, { -0.0443341732f, -0.0144050461f}, { 0.0312604822f, -0.1973709165f}, { 0.3230605354f, 0.0000000000f}, { 0.0505378020f, 0.3190831241f}, { -0.1900507362f, 0.0617512275f}, { -0.0211630887f, -0.0415349002f}, { -0.0320270276f, 0.0232689976f}, { -0.0278489283f, -0.0278489283f}, { 0.0026072431f, -0.0035885623f}, { -0.0110460175f, -0.0056282270f}, { 0.0013541001f, -0.0041674916f}, { -0.0049488090f, -0.0007838143f}, { -0.0000000000f, -0.0024673208f}, { -0.0036972890f, 0.0005855930f}, { -0.0010388971f, -0.0031973966f}, { -0.0010338346f, 0.0005267651f} }, { { -0.0020683708f, -0.0010538876f}, /* Filter 1 */ { 0.0003525575f, -0.0010850603f}, { -0.0033401247f, -0.0005290238f}, { 0.0000000000f, -0.0037242426f}, { -0.0024716928f, 0.0003914777f}, { -0.0015426375f, -0.0047477499f}, { -0.0039641299f, 0.0020198251f}, { -0.0072818054f, -0.0100225453f}, { -0.0032521646f, 0.0032521646f}, { -0.0319837501f, -0.0232375547f}, { 0.0178808444f, -0.0350931330f}, { -0.0449835104f, -0.0146160285f}, { 0.0313889711f, -0.1981821640f}, { 0.3234303845f, 0.0000000000f}, { 0.0504793852f, 0.3187142949f}, { -0.1892688035f, 0.0614971622f}, { -0.0208540454f, -0.0409283686f}, { -0.0321881057f, 0.0233860277f}, { -0.0277423727f, -0.0277423727f}, { 0.0025114767f, -0.0034567511f}, { -0.0110530868f, -0.0056318290f}, { 0.0013333687f, -0.0041036870f}, { -0.0049666219f, -0.0007866356f}, { -0.0000000000f, -0.0024320363f}, { -0.0037159717f, 0.0005885521f}, { -0.0010327352f, -0.0031784322f}, { -0.0010510198f, 0.0005355213f} }, { { -0.0020747359f, -0.0010571307f}, /* Filter 2 */ { 0.0003465273f, -0.0010665015f}, { -0.0033595723f, -0.0005321040f}, { 0.0000000000f, -0.0037048962f}, { -0.0025063405f, 0.0003969653f}, { -0.0015368271f, -0.0047298674f}, { -0.0040238979f, 0.0020502784f}, { -0.0072762570f, -0.0100149086f}, { -0.0033682442f, 0.0033682442f}, { -0.0321041418f, -0.0233250244f}, { 0.0177881547f, -0.0349112193f}, { -0.0456347697f, -0.0148276355f}, { 0.0315173303f, -0.1989925922f}, { 0.3237966198f, 0.0000000000f}, { 0.0504204080f, 0.3183419274f}, { -0.1884861003f, 0.0612428465f}, { -0.0205459255f, -0.0403236493f}, { -0.0323471495f, 0.0235015798f}, { -0.0276351622f, -0.0276351621f}, { 0.0024160790f, -0.0033254474f}, { -0.0110594921f, -0.0056350927f}, { 0.0013126376f, -0.0040398833f}, { -0.0049840526f, -0.0007893964f}, { -0.0000000000f, -0.0023966537f}, { -0.0037344368f, 0.0005914767f}, { -0.0010265333f, -0.0031593446f}, { -0.0010681046f, 0.0005442265f} }, { { -0.0020809967f, -0.0010603208f}, /* Filter 3 */ { 0.0003404626f, -0.0010478361f}, { -0.0033788979f, -0.0005351649f}, { 0.0000000000f, -0.0036853371f}, { -0.0025408856f, 0.0004024367f}, { -0.0015308989f, -0.0047116222f}, { -0.0040836583f, 0.0020807278f}, { -0.0072702646f, -0.0100066607f}, { -0.0034847552f, 0.0034847552f}, { -0.0322237637f, -0.0234119347f}, { 0.0176943134f, -0.0347270454f}, { -0.0462879352f, -0.0150398618f}, { 0.0316455549f, -0.1998021699f}, { 0.3241592762f, 0.0000000000f}, { 0.0503608735f, 0.3179660415f}, { -0.1877026542f, 0.0609882894f}, { -0.0202387338f, -0.0397207515f}, { -0.0325041534f, 0.0236156498f}, { -0.0275273031f, -0.0275273031f}, { 0.0023210497f, -0.0031946509f}, { -0.0110652351f, -0.0056380189f}, { 0.0012919081f, -0.0039760844f}, { -0.0050011043f, -0.0007920971f}, { -0.0000000000f, -0.0023611717f}, { -0.0037526894f, 0.0005943676f}, { -0.0010202946f, -0.0031401438f}, { -0.0010850831f, 0.0005528774f} }, { { -0.0020871540f, -0.0010634581f}, /* Filter 4 */ { 0.0003343643f, -0.0010290677f}, { -0.0033980896f, -0.0005382045f}, { 0.0000000000f, -0.0036655608f}, { -0.0025753233f, 0.0004078911f}, { -0.0015248506f, -0.0046930077f}, { -0.0041434070f, 0.0021111713f}, { -0.0072638274f, -0.0099978007f}, { -0.0036016954f, 0.0036016954f}, { -0.0323425986f, -0.0234982733f}, { 0.0175993179f, -0.0345406062f}, { -0.0469429903f, -0.0152527022f}, { 0.0317736429f, -0.2006108859f}, { 0.3245182896f, 0.0000000000f}, { 0.0503007794f, 0.3175866223f}, { -0.1869184792f, 0.0607334955f}, { -0.0199324784f, -0.0391196915f}, { -0.0326591229f, 0.0237282418f}, { -0.0274188054f, -0.0274188054f}, { 0.0022263916f, -0.0030643652f}, { -0.0110703162f, -0.0056406079f}, { 0.0012711815f, -0.0039122945f}, { -0.0050177778f, -0.0007947379f}, { -0.0000000000f, -0.0023255964f}, { -0.0037707253f, 0.0005972242f}, { -0.0010140199f, -0.0031208324f}, { -0.0011019602f, 0.0005614767f} }, { { -0.0020932061f, -0.0010665418f}, /* Filter 5 */ { 0.0003282310f, -0.0010101913f}, { -0.0034171601f, -0.0005412250f}, { 0.0000000000f, -0.0036455684f}, { -0.0026096525f, 0.0004133284f}, { -0.0015186844f, -0.0046740300f}, { -0.0042031392f, 0.0021416064f}, { -0.0072569405f, -0.0099883217f}, { -0.0037190588f, 0.0037190588f}, { -0.0324606458f, -0.0235840397f}, { 0.0175031682f, -0.0343519019f}, { -0.0475999433f, -0.0154661591f}, { 0.0319015944f, -0.2014187397f}, { 0.3248737054f, 0.0000000000f}, { 0.0502401324f, 0.3172037117f}, { -0.1861335945f, 0.0604784710f}, { -0.0196271574f, -0.0385204653f}, { -0.0328120641f, 0.0238393600f}, { -0.0273096732f, -0.0273096732f}, { 0.0021321098f, -0.0029345974f}, { -0.0110747363f, -0.0056428600f}, { 0.0012504589f, -0.0038485167f}, { -0.0050340733f, -0.0007973189f}, { -0.0000000000f, -0.0022899307f}, { -0.0037885462f, 0.0006000468f}, { -0.0010077057f, -0.0031013993f}, { -0.0011187340f, 0.0005700234f} }, { { -0.0020991518f, -0.0010695713f}, /* Filter 6 */ { 0.0003220639f, -0.0009912107f}, { -0.0034360946f, -0.0005442239f}, { 0.0000000000f, -0.0036253614f}, { -0.0026438710f, 0.0004187480f}, { -0.0015124002f, -0.0046546893f}, { -0.0042628518f, 0.0021720315f}, { -0.0072496072f, -0.0099782283f}, { -0.0038368434f, 0.0038368434f}, { -0.0325778977f, -0.0236692282f}, { 0.0174058626f, -0.0341609287f}, { -0.0482587741f, -0.0156802262f}, { 0.0320294011f, -0.2022256796f}, { 0.3252254876f, 0.0000000000f}, { 0.0501789307f, 0.3168172996f}, { -0.1853480191f, 0.0602232221f}, { -0.0193227779f, -0.0379230869f}, { -0.0329629727f, 0.0239490016f}, { -0.0271999184f, -0.0271999184f}, { 0.0020382052f, -0.0028053488f}, { -0.0110785003f, -0.0056447778f}, { 0.0012297420f, -0.0037847567f}, { -0.0050499875f, -0.0007998394f}, { -0.0000000000f, -0.0022541739f}, { -0.0038061482f, 0.0006028347f}, { -0.0010013566f, -0.0030818588f}, { -0.0011354014f, 0.0005785159f} }, { { -0.0021049923f, -0.0010725471f}, /* Filter 7 */ { 0.0003158634f, -0.0009721276f}, { -0.0034549006f, -0.0005472025f}, { 0.0000000000f, -0.0036049447f}, { -0.0026779756f, 0.0004241497f}, { -0.0015059960f, -0.0046349792f}, { -0.0043225420f, 0.0022024452f}, { -0.0072418204f, -0.0099675107f}, { -0.0039550473f, 0.0039550473f}, { -0.0326943386f, -0.0237538274f}, { 0.0173073982f, -0.0339676816f}, { -0.0489194702f, -0.0158948994f}, { 0.0321570632f, -0.2030317064f}, { 0.3255736244f, 0.0000000000f}, { 0.0501171763f, 0.3164273977f}, { -0.1845617592f, 0.0599677508f}, { -0.0190193487f, -0.0373275735f}, { -0.0331118630f, 0.0240571767f}, { -0.0270895417f, -0.0270895417f}, { 0.0019446819f, -0.0026766250f}, { -0.0110816114f, -0.0056463630f}, { 0.0012090309f, -0.0037210144f}, { -0.0050655213f, -0.0008022997f}, { -0.0000000000f, -0.0022183301f}, { -0.0038235324f, 0.0006055880f}, { -0.0009949709f, -0.0030622057f}, { -0.0011519648f, 0.0005869554f} }, { { -0.0021107264f, -0.0010754688f}, /* Filter 8 */ { 0.0003096295f, -0.0009529418f}, { -0.0034735715f, -0.0005501597f}, { 0.0000000000f, -0.0035843186f}, { -0.0027119655f, 0.0004295331f}, { -0.0014994741f, -0.0046149068f}, { -0.0043822054f, 0.0022328452f}, { -0.0072335836f, -0.0099561737f}, { -0.0040736649f, 0.0040736649f}, { -0.0328099690f, -0.0238378378f}, { 0.0172077747f, -0.0337721594f}, { -0.0495820369f, -0.0161101804f}, { 0.0322845815f, -0.2038368254f}, { 0.3259181294f, 0.0000000000f}, { 0.0500548715f, 0.3160340207f}, { -0.1837748387f, 0.0597120648f}, { -0.0187168672f, -0.0367339203f}, { -0.0332587359f, 0.0241638860f}, { -0.0269785595f, -0.0269785594f}, { 0.0018515428f, -0.0025484301f}, { -0.0110840763f, -0.0056476190f}, { 0.0011883268f, -0.0036572938f}, { -0.0050806797f, -0.0008047006f}, { -0.0000000000f, -0.0021824000f}, { -0.0038407034f, 0.0006083077f}, { -0.0009885487f, -0.0030424399f}, { -0.0011684229f, 0.0005953412f} }, { { -0.0021163512f, -0.0010783348f}, /* Filter 9 */ { 0.0003033628f, -0.0009336547f}, { -0.0034921137f, -0.0005530965f}, { 0.0000000000f, -0.0035634797f}, { -0.0027458380f, 0.0004348980f}, { -0.0014928333f, -0.0045944683f}, { -0.0044418429f, 0.0022632320f}, { -0.0072248932f, -0.0099442124f}, { -0.0041926924f, 0.0041926924f}, { -0.0329247776f, -0.0239212511f}, { 0.0171069856f, -0.0335743496f}, { -0.0502464419f, -0.0163260586f}, { 0.0324119487f, -0.2046409903f}, { 0.3262589677f, 0.0000000000f}, { 0.0499920157f, 0.3156371650f}, { -0.1829872716f, 0.0594561687f}, { -0.0184153382f, -0.0361421361f}, { -0.0334035882f, 0.0242691274f}, { -0.0268669691f, -0.0268669691f}, { 0.0017587860f, -0.0024207612f}, { -0.0110858859f, -0.0056485410f}, { 0.0011676322f, -0.0035936024f}, { -0.0050954597f, -0.0008070415f}, { -0.0000000000f, -0.0021463869f}, { -0.0038576503f, 0.0006109918f}, { -0.0009820912f, -0.0030225659f}, { -0.0011847721f, 0.0006036715f} }, { { -0.0021218707f, -0.0010811471f}, /* Filter 10 */ { 0.0002970631f, -0.0009142662f}, { -0.0035105169f, -0.0005560113f}, { 0.0000000000f, -0.0035424291f}, { -0.0027795897f, 0.0004402438f}, { -0.0014860735f, -0.0045736640f}, { -0.0045014440f, 0.0022936003f}, { -0.0072157478f, -0.0099316248f}, { -0.0043121270f, 0.0043121270f}, { -0.0330387505f, -0.0240040573f}, { 0.0170050359f, -0.0333742621f}, { -0.0509126991f, -0.0165425387f}, { 0.0325391632f, -0.2054441908f}, { 0.3265961402f, 0.0000000000f}, { 0.0499286139f, 0.3152368615f}, { -0.1821990707f, 0.0592000667f}, { -0.0181147701f, -0.0355522381f}, { -0.0335464345f, 0.0243729114f}, { -0.0267547838f, -0.0267547838f}, { 0.0016664209f, -0.0022936316f}, { -0.0110870524f, -0.0056491353f}, { 0.0011469467f, -0.0035299389f}, { -0.0051098607f, -0.0008093224f}, { -0.0000000000f, -0.0021102948f}, { -0.0038743798f, 0.0006136415f}, { -0.0009756000f, -0.0030025882f}, { -0.0012010169f, 0.0006119487f} }, { { -0.0021272804f, -0.0010839035f}, /* Filter 11 */ { 0.0002907313f, -0.0008947789f}, { -0.0035287880f, -0.0005589051f}, { 0.0000000000f, -0.0035211710f}, { -0.0028132202f, 0.0004455703f}, { -0.0014791959f, -0.0045524968f}, { -0.0045610084f, 0.0023239498f}, { -0.0072061462f, -0.0099184093f}, { -0.0044319669f, 0.0044319669f}, { -0.0331518885f, -0.0240862569f}, { 0.0169019206f, -0.0331718869f}, { -0.0515807741f, -0.0167596094f}, { 0.0326662218f, -0.2062464072f}, { 0.3269296554f, 0.0000000000f}, { 0.0498646641f, 0.3148330983f}, { -0.1814102747f, 0.0589437714f}, { -0.0178151678f, -0.0349642354f}, { -0.0336872691f, 0.0244752336f}, { -0.0266420053f, -0.0266420053f}, { 0.0015744429f, -0.0021670347f}, { -0.0110875784f, -0.0056494033f}, { 0.0011262723f, -0.0034663098f}, { -0.0051238819f, -0.0008115432f}, { -0.0000000000f, -0.0020741216f}, { -0.0038908892f, 0.0006162563f}, { -0.0009690729f, -0.0029824996f}, { -0.0012171503f, 0.0006201690f} }, { { -0.0021325818f, -0.0010866047f}, /* Filter 12 */ { 0.0002843666f, -0.0008751904f}, { -0.0035469196f, -0.0005617769f}, { 0.0000000000f, -0.0034997014f}, { -0.0028467280f, 0.0004508774f}, { -0.0014721991f, -0.0045309631f}, { -0.0046205348f, 0.0023542801f}, { -0.0071960854f, -0.0099045618f}, { -0.0045522045f, 0.0045522045f}, { -0.0332641784f, -0.0241678403f}, { 0.0167976380f, -0.0329672208f}, { -0.0522506751f, -0.0169772735f}, { 0.0327931228f, -0.2070476286f}, { 0.3272594964f, 0.0000000000f}, { 0.0498001678f, 0.3144258846f}, { -0.1806208765f, 0.0586872803f}, { -0.0175165287f, -0.0343781233f}, { -0.0338261024f, 0.0245761020f}, { -0.0265286487f, -0.0265286487f}, { 0.0014828623f, -0.0020409848f}, { -0.0110874640f, -0.0056493451f}, { 0.0011056098f, -0.0034027170f}, { -0.0051375257f, -0.0008137041f}, { -0.0000000000f, -0.0020378694f}, { -0.0039071795f, 0.0006188364f}, { -0.0009625120f, -0.0029623072f}, { -0.0012331777f, 0.0006283354f} }, { { -0.0021377717f, -0.0010892491f}, /* Filter 13 */ { 0.0002779697f, -0.0008555029f}, { -0.0035649100f, -0.0005646263f}, { 0.0000000000f, -0.0034780238f}, { -0.0028801083f, 0.0004561643f}, { -0.0014650844f, -0.0045090662f}, { -0.0046800169f, 0.0023845877f}, { -0.0071855666f, -0.0098900840f}, { -0.0046728389f, 0.0046728389f}, { -0.0333756137f, -0.0242488027f}, { 0.0166921866f, -0.0327602608f}, { -0.0529223907f, -0.0171955271f}, { 0.0329198616f, -0.2078478261f}, { 0.3275856455f, 0.0000000000f}, { 0.0497351290f, 0.3140152457f}, { -0.1798308921f, 0.0584305988f}, { -0.0172188616f, -0.0337939187f}, { -0.0339629379f, 0.0246755187f}, { -0.0264147135f, -0.0264147135f}, { 0.0013916737f, -0.0019154745f}, { -0.0110867107f, -0.0056489612f}, { 0.0010849601f, -0.0033391637f}, { -0.0051507929f, -0.0008158054f}, { -0.0000000000f, -0.0020015478f}, { -0.0039232480f, 0.0006213814f}, { -0.0009559179f, -0.0029420128f}, { -0.0012490941f, 0.0006364452f} }, { { -0.0021428519f, -0.0010918376f}, /* Filter 14 */ { 0.0002715416f, -0.0008357192f}, { -0.0035827641f, -0.0005674541f}, { 0.0000000000f, -0.0034561409f}, { -0.0029133560f, 0.0004614303f}, { -0.0014578511f, -0.0044868044f}, { -0.0047394533f, 0.0024148721f}, { -0.0071745880f, -0.0098749731f}, { -0.0047938623f, 0.0047938623f}, { -0.0334861824f, -0.0243291356f}, { 0.0165855627f, -0.0325509996f}, { -0.0535958993f, -0.0174143633f}, { 0.0330464377f, -0.2086469963f}, { 0.3279080881f, 0.0000000000f}, { 0.0496695465f, 0.3136011746f}, { -0.1790403429f, 0.0581737338f}, { -0.0169221683f, -0.0332116253f}, { -0.0340977770f, 0.0247734851f}, { -0.0263002096f, -0.0263002095f}, { 0.0013008835f, -0.0017905126f}, { -0.0110853211f, -0.0056482532f}, { 0.0010643250f, -0.0032756556f}, { -0.0051636809f, -0.0008178467f}, { -0.0000000000f, -0.0019651518f}, { -0.0039390981f, 0.0006238918f}, { -0.0009492899f, -0.0029216139f}, { -0.0012649024f, 0.0006445000f} }, { { -0.0021478235f, -0.0010943707f}, /* Filter 15 */ { 0.0002650826f, -0.0008158402f}, { -0.0036004777f, -0.0005702596f}, { 0.0000000000f, -0.0034340508f}, { -0.0029464795f, 0.0004666765f}, { -0.0014504998f, -0.0044641793f}, { -0.0047988370f, 0.0024451296f}, { -0.0071631454f, -0.0098592238f}, { -0.0049152798f, 0.0049152798f}, { -0.0335958803f, -0.0244088358f}, { 0.0164777696f, -0.0323394438f}, { -0.0542712019f, -0.0176337824f}, { 0.0331728498f, -0.2094451305f}, { 0.3282268613f, 0.0000000000f}, { 0.0496034263f, 0.3131837077f}, { -0.1782492532f, 0.0579166932f}, { -0.0166264567f, -0.0326312586f}, { -0.0342306216f, 0.0248700024f}, { -0.0261851487f, -0.0261851487f}, { 0.0012104960f, -0.0016661048f}, { -0.0110832996f, -0.0056472232f}, { 0.0010437052f, -0.0032121944f}, { -0.0051761955f, -0.0008198288f}, { -0.0000000000f, -0.0019286856f}, { -0.0039547236f, 0.0006263667f}, { -0.0009426290f, -0.0029011137f}, { -0.0012806020f, 0.0006524993f} }, { { -0.0021526811f, -0.0010968458f}, /* Filter 16 */ { 0.0002585916f, -0.0007958630f}, { -0.0036180491f, -0.0005730427f}, { 0.0000000000f, -0.0034117569f}, { -0.0029794678f, 0.0004719013f}, { -0.0014430304f, -0.0044411910f}, { -0.0048581698f, 0.0024753611f}, { -0.0071512408f, -0.0098428385f}, { -0.0050370769f, 0.0050370769f}, { -0.0337047030f, -0.0244879001f}, { 0.0163688011f, -0.0321255811f}, { -0.0549482856f, -0.0178537803f}, { 0.0332990916f, -0.2102421898f}, { 0.3285419113f, 0.0000000000f}, { 0.0495367633f, 0.3127628142f}, { -0.1774576372f, 0.0576594816f}, { -0.0163317246f, -0.0320528142f}, { -0.0343614823f, 0.0249650783f}, { -0.0260695287f, -0.0260695287f}, { 0.0011205114f, -0.0015422517f}, { -0.0110806487f, -0.0056458725f}, { 0.0010231017f, -0.0031487834f}, { -0.0051883299f, -0.0008217507f}, { -0.0000000000f, -0.0018921522f}, { -0.0039701300f, 0.0006288068f}, { -0.0009359356f, -0.0028805136f}, { -0.0012961871f, 0.0006604403f} }, { { -0.0021574284f, -0.0010992647f}, /* Filter 17 */ { 0.0002520699f, -0.0007757912f}, { -0.0036354734f, -0.0005758024f}, { 0.0000000000f, -0.0033892575f}, { -0.0030123189f, 0.0004771044f}, { -0.0014354426f, -0.0044178382f}, { -0.0049174434f, 0.0025055626f}, { -0.0071388691f, -0.0098258104f}, { -0.0051592580f, 0.0051592580f}, { -0.0338126301f, -0.0245663138f}, { 0.0162586580f, -0.0319094130f}, { -0.0556271369f, -0.0180743524f}, { 0.0334251612f, -0.2110381623f}, { 0.3288532338f, 0.0000000000f}, { 0.0494695653f, 0.3123385428f}, { -0.1766655070f, 0.0574021029f}, { -0.0160379814f, -0.0314763108f}, { -0.0344903631f, 0.0250587156f}, { -0.0259533663f, -0.0259533663f}, { 0.0010309301f, -0.0014189535f}, { -0.0110773713f, -0.0056442026f}, { 0.0010025158f, -0.0030854265f}, { -0.0052000922f, -0.0008236137f}, { -0.0000000000f, -0.0018555547f}, { -0.0039853119f, 0.0006312114f}, { -0.0009292099f, -0.0028598142f}, { -0.0013116612f, 0.0006683247f} }, { { -0.0021620629f, -0.0011016261f}, /* Filter 18 */ { 0.0002455178f, -0.0007556262f}, { -0.0036527558f, -0.0005785397f}, { 0.0000000000f, -0.0033665528f}, { -0.0030450357f, 0.0004822863f}, { -0.0014277367f, -0.0043941217f}, { -0.0049766550f, 0.0025357324f}, { -0.0071260337f, -0.0098081440f}, { -0.0052818148f, 0.0052818148f}, { -0.0339196635f, -0.0246440780f}, { 0.0161473402f, -0.0316909395f}, { -0.0563077467f, -0.0182954959f}, { 0.0335510562f, -0.2118330321f}, { 0.3291608469f, 0.0000000000f}, { 0.0494018279f, 0.3119108657f}, { -0.1758728665f, 0.0571445584f}, { -0.0157452306f, -0.0309017550f}, { -0.0346172596f, 0.0251509113f}, { -0.0258366582f, -0.0258366582f}, { 0.0009417582f, -0.0012962189f}, { -0.0110734677f, -0.0056422136f}, { 0.0009819489f, -0.0030221280f}, { -0.0052114720f, -0.0008254161f}, { -0.0000000000f, -0.0018188896f}, { -0.0040002741f, 0.0006335812f}, { -0.0009224524f, -0.0028390167f}, { -0.0013270241f, 0.0006761526f} }, { { -0.0021665839f, -0.0011039297f}, /* Filter 19 */ { 0.0002389352f, -0.0007353671f}, { -0.0036698948f, -0.0005812542f}, { 0.0000000000f, -0.0033436471f}, { -0.0030776105f, 0.0004874456f}, { -0.0014199134f, -0.0043700441f}, { -0.0050358040f, 0.0025658703f}, { -0.0071127326f, -0.0097898366f}, { -0.0054047443f, 0.0054047443f}, { -0.0340257897f, -0.0247211833f}, { 0.0160348403f, -0.0314701461f}, { -0.0569901065f, -0.0185172081f}, { 0.0336767754f, -0.2126267914f}, { 0.3294647168f, 0.0000000000f}, { 0.0493335604f, 0.3114798415f}, { -0.1750797642f, 0.0568868638f}, { -0.0154534710f, -0.0303291444f}, { -0.0347421838f, 0.0252416741f}, { -0.0257194246f, -0.0257194246f}, { 0.0008529956f, -0.0011740477f}, { -0.0110689444f, -0.0056399089f}, { 0.0009614017f, -0.0029588901f}, { -0.0052224822f, -0.0008271599f}, { -0.0000000000f, -0.0017821677f}, { -0.0040150098f, 0.0006359151f}, { -0.0009156640f, -0.0028181240f}, { -0.0013422743f, 0.0006839229f} }, { { -0.0021709935f, -0.0011061764f}, /* Filter 20 */ { 0.0002323231f, -0.0007150169f}, { -0.0036868820f, -0.0005839447f}, { 0.0000000000f, -0.0033205371f}, { -0.0031100445f, 0.0004925827f}, { -0.0014119724f, -0.0043456043f}, { -0.0050948817f, 0.0025959719f}, { -0.0070989590f, -0.0097708788f}, { -0.0055280441f, 0.0055280441f}, { -0.0341310065f, -0.0247976278f}, { 0.0159211695f, -0.0312470546f}, { -0.0576741947f, -0.0187394818f}, { 0.0338023139f, -0.2134194107f}, { 0.3297648658f, 0.0000000000f}, { 0.0492647580f, 0.3110454402f}, { -0.1742862004f, 0.0566290193f}, { -0.0151627154f, -0.0297585045f}, { -0.0348651405f, 0.0253310073f}, { -0.0256016596f, -0.0256016596f}, { 0.0007646444f, -0.0010524428f}, { -0.0110638054f, -0.0056372904f}, { 0.0009408753f, -0.0028957165f}, { -0.0052331148f, -0.0008288440f}, { -0.0000000000f, -0.0017453870f}, { -0.0040295204f, 0.0006382133f}, { -0.0009088446f, -0.0027971360f}, { -0.0013574107f, 0.0006916353f} }, { { -0.0021752882f, -0.0011083647f}, /* Filter 21 */ { 0.0002256805f, -0.0006945730f}, { -0.0037037255f, -0.0005866125f}, { 0.0000000000f, -0.0032972252f}, { -0.0031423371f, 0.0004976973f}, { -0.0014039134f, -0.0043208011f}, { -0.0051538904f, 0.0026260383f}, { -0.0070847143f, -0.0097512727f}, { -0.0056517100f, 0.0056517100f}, { -0.0342353018f, -0.0248734028f}, { 0.0158063103f, -0.0310216307f}, { -0.0583600246f, -0.0189623215f}, { 0.0339276705f, -0.2142108808f}, { 0.3300612587f, 0.0000000000f}, { 0.0491954263f, 0.3106076970f}, { -0.1734921841f, 0.0563710278f}, { -0.0148729578f, -0.0291898232f}, { -0.0349861306f, 0.0254189118f}, { -0.0254833823f, -0.0254833823f}, { 0.0006767090f, -0.0009314100f}, { -0.0110580501f, -0.0056343580f}, { 0.0009203707f, -0.0028326096f}, { -0.0052433761f, -0.0008304692f}, { -0.0000000000f, -0.0017085512f}, { -0.0040438090f, 0.0006404764f}, { -0.0009019959f, -0.0027760579f}, { -0.0013724328f, 0.0006992894f} }, { { -0.0021794696f, -0.0011104952f}, /* Filter 22 */ { 0.0002190094f, -0.0006740415f}, { -0.0037204152f, -0.0005892559f}, { 0.0000000000f, -0.0032737161f}, { -0.0031744818f, 0.0005027885f}, { -0.0013957372f, -0.0042956373f}, { -0.0052128211f, 0.0026560650f}, { -0.0070700018f, -0.0097310227f}, { -0.0057757379f, 0.0057757379f}, { -0.0343386669f, -0.0249485018f}, { 0.0156902759f, -0.0307939004f}, { -0.0590475577f, -0.0191857145f}, { 0.0340528424f, -0.2150011852f}, { 0.3303539045f, 0.0000000000f}, { 0.0491255647f, 0.3101666084f}, { -0.1726977302f, 0.0561128940f}, { -0.0145842116f, -0.0286231268f}, { -0.0351051571f, 0.0255053896f}, { -0.0253645869f, -0.0253645868f}, { 0.0005891905f, -0.0008109511f}, { -0.0110516828f, -0.0056311136f}, { 0.0008998894f, -0.0027695749f}, { -0.0052532571f, -0.0008320342f}, { -0.0000000000f, -0.0016716548f}, { -0.0040578765f, 0.0006427045f}, { -0.0008951164f, -0.0027548851f}, { -0.0013873415f, 0.0007068858f} }, { { -0.0021835332f, -0.0011125657f}, /* Filter 23 */ { 0.0002123080f, -0.0006534169f}, { -0.0037369580f, -0.0005918760f}, { 0.0000000000f, -0.0032500058f}, { -0.0032064778f, 0.0005078562f}, { -0.0013874429f, -0.0042701101f}, { -0.0052716754f, 0.0026860528f}, { -0.0070548131f, -0.0097101173f}, { -0.0059001204f, 0.0059001204f}, { -0.0344410900f, -0.0250229166f}, { 0.0155730524f, -0.0305638362f}, { -0.0597367984f, -0.0194096624f}, { 0.0341778230f, -0.2157902819f}, { 0.3306427857f, 0.0000000000f}, { 0.0490551686f, 0.3097221447f}, { -0.1719028769f, 0.0558546306f}, { -0.0142964714f, -0.0280584049f}, { -0.0352222256f, 0.0255904448f}, { -0.0252452876f, -0.0252452876f}, { 0.0005020904f, -0.0006910682f}, { -0.0110447047f, -0.0056275581f}, { 0.0008794327f, -0.0027066155f}, { -0.0052627649f, -0.0008335401f}, { -0.0000000000f, -0.0016347116f}, { -0.0040717178f, 0.0006448967f}, { -0.0008882074f, -0.0027336213f}, { -0.0014021320f, 0.0007144220f} }, { { -0.0021874838f, -0.0011145787f}, /* Filter 24 */ { 0.0002055786f, -0.0006327059f}, { -0.0037533457f, -0.0005944716f}, { 0.0000000000f, -0.0032260964f}, { -0.0032383252f, 0.0005129003f}, { -0.0013790323f, -0.0042442251f}, { -0.0053304459f, 0.0027159978f}, { -0.0070391540f, -0.0096885644f}, { -0.0060248575f, 0.0060248575f}, { -0.0345425735f, -0.0250966487f}, { 0.0154546458f, -0.0303314503f}, { -0.0604277411f, -0.0196341633f}, { 0.0343026178f, -0.2165782048f}, { 0.3309279035f, 0.0000000000f}, { 0.0489842529f, 0.3092744009f}, { -0.1711076163f, 0.0555962347f}, { -0.0140097447f, -0.0274956721f}, { -0.0353373491f, 0.0256740870f}, { -0.0251254954f, -0.0251254954f}, { 0.0004154116f, -0.0005717650f}, { -0.0110371168f, -0.0056236919f}, { 0.0008590005f, -0.0026437316f}, { -0.0052719037f, -0.0008349875f}, { -0.0000000000f, -0.0015977154f}, { -0.0040853303f, 0.0006470528f}, { -0.0008812689f, -0.0027122668f}, { -0.0014168097f, 0.0007219006f} }, { { -0.0021913182f, -0.0011165324f}, /* Filter 25 */ { 0.0001988203f, -0.0006119059f}, { -0.0037695819f, -0.0005970431f}, { 0.0000000000f, -0.0032019911f}, { -0.0032700204f, 0.0005179204f}, { -0.0013705037f, -0.0042179768f}, { -0.0053891314f, 0.0027458996f}, { -0.0070230192f, -0.0096663567f}, { -0.0061499438f, 0.0061499438f}, { -0.0346430960f, -0.0251696825f}, { 0.0153350520f, -0.0300967342f}, { -0.0611203609f, -0.0198592091f}, { 0.0344272156f, -0.2173648848f}, { 0.3312092597f, 0.0000000000f}, { 0.0489128097f, 0.3088233260f}, { -0.1703119776f, 0.0553377160f}, { -0.0137240371f, -0.0269349394f}, { -0.0354505202f, 0.0257563106f}, { -0.0250052112f, -0.0250052112f}, { 0.0003291546f, -0.0004530424f}, { -0.0110289268f, -0.0056195189f}, { 0.0008385950f, -0.0025809300f}, { -0.0052806669f, -0.0008363755f}, { -0.0000000000f, -0.0015606744f}, { -0.0040987206f, 0.0006491736f}, { -0.0008743021f, -0.0026908252f}, { -0.0014313705f, 0.0007293197f} }, { { -0.0021950358f, -0.0011184266f}, /* Filter 26 */ { 0.0001920348f, -0.0005910222f}, { -0.0037856664f, -0.0005995907f}, { 0.0000000000f, -0.0031776877f}, { -0.0033015580f, 0.0005229154f}, { -0.0013618591f, -0.0041913714f}, { -0.0054477253f, 0.0027757547f}, { -0.0070064077f, -0.0096434929f}, { -0.0062753772f, 0.0062753772f}, { -0.0347426640f, -0.0252420229f}, { 0.0152142751f, -0.0298596961f}, { -0.0618146580f, -0.0200847999f}, { 0.0345516193f, -0.2181503385f}, { 0.3314868370f, 0.0000000000f}, { 0.0488408446f, 0.3083689567f}, { -0.1695159803f, 0.0550790808f}, { -0.0134393508f, -0.0263762111f}, { -0.0355617515f, 0.0258371249f}, { -0.0248844430f, -0.0248844430f}, { 0.0002433249f, -0.0003349080f}, { -0.0110201366f, -0.0056150400f}, { 0.0008182166f, -0.0025182118f}, { -0.0052890581f, -0.0008377045f}, { -0.0000000000f, -0.0015235876f}, { -0.0041118878f, 0.0006512590f}, { -0.0008673053f, -0.0026692913f}, { -0.0014458149f, 0.0007366795f} }, { { -0.0021986382f, -0.0011202621f}, /* Filter 27 */ { 0.0001852208f, -0.0005700511f}, { -0.0038015912f, -0.0006021129f}, { 0.0000000000f, -0.0031531871f}, { -0.0033329427f, 0.0005278863f}, { -0.0013530973f, -0.0041644052f}, { -0.0055062248f, 0.0028055617f}, { -0.0069893153f, -0.0096199673f}, { -0.0064011503f, 0.0064011503f}, { -0.0348412605f, -0.0253136575f}, { 0.0150923097f, -0.0296203256f}, { -0.0625106192f, -0.0203109314f}, { 0.0346758233f, -0.2189345318f}, { 0.3317606309f, 0.0000000000f}, { 0.0487683599f, 0.3079113063f}, { -0.1687196397f, 0.0548203341f}, { -0.0131556897f, -0.0258194949f}, { -0.0356710455f, 0.0259165316f}, { -0.0247632008f, -0.0247632008f}, { 0.0001579238f, -0.0002173634f}, { -0.0110107504f, -0.0056102576f}, { 0.0007978665f, -0.0024555805f}, { -0.0052970776f, -0.0008389747f}, { -0.0000000000f, -0.0014864566f}, { -0.0041248212f, 0.0006533075f}, { -0.0008602826f, -0.0026476775f}, { -0.0014601426f, 0.0007439798f} }, { { -0.0022021205f, -0.0011220364f}, /* Filter 28 */ { 0.0001783784f, -0.0005489924f}, { -0.0038173642f, -0.0006046111f}, { 0.0000000000f, -0.0031284972f}, { -0.0033641641f, 0.0005328312f}, { -0.0013442186f, -0.0041370795f}, { -0.0055646300f, 0.0028353206f}, { -0.0069717498f, -0.0095957903f}, { -0.0065272595f, 0.0065272595f}, { -0.0349388718f, -0.0253845763f}, { 0.0149691501f, -0.0293786112f}, { -0.0632082284f, -0.0205375984f}, { 0.0347998259f, -0.2197174532f}, { 0.3320306306f, 0.0000000000f}, { 0.0486953528f, 0.3074503577f}, { -0.1679229530f, 0.0545614749f}, { -0.0128730542f, -0.0252647915f}, { -0.0357784018f, 0.0259945305f}, { -0.0246414871f, -0.0246414870f}, { 0.0000729497f, -0.0001004067f}, { -0.0110007658f, -0.0056051701f}, { 0.0007775460f, -0.0023930406f}, { -0.0053047256f, -0.0008401860f}, { -0.0000000000f, -0.0014492849f}, { -0.0041375369f, 0.0006553215f}, { -0.0008532325f, -0.0026259796f}, { -0.0014743520f, 0.0007512199f} }, { { -0.0022054869f, -0.0011237517f}, /* Filter 29 */ { 0.0001715097f, -0.0005278527f}, { -0.0038329794f, -0.0006070843f}, { 0.0000000000f, -0.0031036105f}, { -0.0033952242f, 0.0005377507f}, { -0.0013352233f, -0.0041093948f}, { -0.0056229327f, 0.0028650273f}, { -0.0069537018f, -0.0095709494f}, { -0.0066537014f, 0.0066537014f}, { -0.0350355011f, -0.0254547815f}, { 0.0148448026f, -0.0291345655f}, { -0.0639074789f, -0.0207647986f}, { 0.0349236250f, -0.2204990899f}, { 0.3322968292f, 0.0000000000f}, { 0.0486218279f, 0.3069861396f}, { -0.1671259528f, 0.0543025138f}, { -0.0125914531f, -0.0247121182f}, { -0.0358838323f, 0.0260711303f}, { -0.0245193118f, -0.0245193118f}, { -0.0000115916f, 0.0000159544f}, { -0.0109901946f, -0.0055997838f}, { 0.0007572560f, -0.0023305944f}, { -0.0053120041f, -0.0008413388f}, { -0.0000000000f, -0.0014120734f}, { -0.0041500234f, 0.0006572991f}, { -0.0008461542f, -0.0026041949f}, { -0.0014884430f, 0.0007583996f} }, { { -0.0022087339f, -0.0011254062f}, /* Filter 30 */ { 0.0001646126f, -0.0005066256f}, { -0.0038484382f, -0.0006095327f}, { 0.0000000000f, -0.0030785301f}, { -0.0034261244f, 0.0005426448f}, { -0.0013261120f, -0.0040813532f}, { -0.0056811318f, 0.0028946812f}, { -0.0069351713f, -0.0095454444f}, { -0.0067804730f, 0.0067804730f}, { -0.0351311327f, -0.0255242620f}, { 0.0147192622f, -0.0288881786f}, { -0.0646083561f, -0.0209925275f}, { 0.0350472173f, -0.2212794214f}, { 0.3325592196f, 0.0000000000f}, { 0.0485477870f, 0.3065186635f}, { -0.1663286640f, 0.0540434590f}, { -0.0123108854f, -0.0241614731f}, { -0.0359873394f, 0.0261463325f}, { -0.0243966809f, -0.0243966808f}, { -0.0000956984f, 0.0001317175f}, { -0.0109790280f, -0.0055940942f}, { 0.0007369976f, -0.0022682453f}, { -0.0053189108f, -0.0008424327f}, { -0.0000000000f, -0.0013748253f}, { -0.0041622804f, 0.0006592405f}, { -0.0008390498f, -0.0025823298f}, { -0.0015024151f, 0.0007655187f} }, { { -0.0022118625f, -0.0011270002f}, /* Filter 31 */ { 0.0001576893f, -0.0004853179f}, { -0.0038637337f, -0.0006119553f}, { 0.0000000000f, -0.0030532624f}, { -0.0034568576f, 0.0005475125f}, { -0.0013168842f, -0.0040529530f}, { -0.0057392236f, 0.0029242805f}, { -0.0069161628f, -0.0095192815f}, { -0.0069075694f, 0.0069075694f}, { -0.0352257635f, -0.0255930153f}, { 0.0145925305f, -0.0286394536f}, { -0.0653108539f, -0.0212207828f}, { 0.0351705998f, -0.2220584278f}, { 0.3328177905f, 0.0000000000f}, { 0.0484732318f, 0.3060479408f}, { -0.1655310827f, 0.0537843091f}, { -0.0120313580f, -0.0236128695f}, { -0.0360889259f, 0.0262201394f}, { -0.0242736037f, -0.0242736037f}, { -0.0001793695f, 0.0002468810f}, { -0.0109672808f, -0.0055881087f}, { 0.0007167720f, -0.0022059974f}, { -0.0053254484f, -0.0008434682f}, { -0.0000000000f, -0.0013375415f}, { -0.0041743131f, 0.0006611462f}, { -0.0008319195f, -0.0025603850f}, { -0.0015162684f, 0.0007725774f} }, { { -0.0022148733f, -0.0011285343f}, /* Filter 32 */ { 0.0001507411f, -0.0004639333f}, { -0.0038788694f, -0.0006143526f}, { 0.0000000000f, -0.0030278003f}, { -0.0034874241f, 0.0005523537f}, { -0.0013075407f, -0.0040241966f}, { -0.0057972012f, 0.0029538215f}, { -0.0068966684f, -0.0094924497f}, { -0.0070349865f, 0.0070349865f}, { -0.0353193822f, -0.0256610332f}, { 0.0144646069f, -0.0283883894f}, { -0.0660149525f, -0.0214495583f}, { 0.0352937702f, -0.2228360951f}, { 0.3330725580f, 0.0000000000f}, { 0.0483981644f, 0.3055739837f}, { -0.1647332531f, 0.0535250786f}, { -0.0117528734f, -0.0230663128f}, { -0.0361885991f, 0.0262925563f}, { -0.0241500844f, -0.0241500844f}, { -0.0002626055f, 0.0003614454f}, { -0.0109549473f, -0.0055818244f}, { 0.0006965800f, -0.0021438527f}, { -0.0053316185f, -0.0008444454f}, { -0.0000000000f, -0.0013002283f}, { -0.0041861158f, 0.0006630156f}, { -0.0008247632f, -0.0025383600f}, { -0.0015300010f, 0.0007795745f} }, { { -0.0022177623f, -0.0011300064f}, /* Filter 33 */ { 0.0001437652f, -0.0004424639f}, { -0.0038938406f, -0.0006167238f}, { 0.0000000000f, -0.0030021495f}, { -0.0035178221f, 0.0005571683f}, { -0.0012980817f, -0.0039950848f}, { -0.0058550643f, 0.0029833043f}, { -0.0068766888f, -0.0094649501f}, { -0.0071627177f, 0.0071627177f}, { -0.0354119781f, -0.0257283081f}, { 0.0143354881f, -0.0281349795f}, { -0.0667206479f, -0.0216788527f}, { 0.0354167248f, -0.2236123999f}, { 0.3333235086f, 0.0000000000f}, { 0.0483225860f, 0.3050968003f}, { -0.1639351598f, 0.0532657623f}, { -0.0114754349f, -0.0225218090f}, { -0.0362863596f, 0.0263635834f}, { -0.0240261303f, -0.0240261303f}, { -0.0003454002f, 0.0004754026f}, { -0.0109420370f, -0.0055752463f}, { 0.0006764229f, -0.0020818155f}, { -0.0053374169f, -0.0008453638f}, { -0.0000000000f, -0.0012628858f}, { -0.0041976948f, 0.0006648496f}, { -0.0008175826f, -0.0025162605f}, { -0.0015436150f, 0.0007865111f} }, { { -0.0022205325f, -0.0011314178f}, /* Filter 34 */ { 0.0001367646f, -0.0004209182f}, { -0.0039086496f, -0.0006190693f}, { 0.0000000000f, -0.0029763130f}, { -0.0035480443f, 0.0005619550f}, { -0.0012885070f, -0.0039656166f}, { -0.0059128092f, 0.0030127268f}, { -0.0068562238f, -0.0094367826f}, { -0.0072907606f, 0.0072907606f}, { -0.0355035484f, -0.0257948378f}, { 0.0142051710f, -0.0278792178f}, { -0.0674279328f, -0.0219086634f}, { 0.0355394639f, -0.2243873441f}, { 0.3335706260f, 0.0000000000f}, { 0.0482464973f, 0.3046163955f}, { -0.1631368376f, 0.0530063717f}, { -0.0111990442f, -0.0219793618f}, { -0.0363822251f, 0.0264332338f}, { -0.0239017519f, -0.0239017519f}, { -0.0004277512f, 0.0005887490f}, { -0.0109285481f, -0.0055683734f}, { 0.0006563010f, -0.0020198867f}, { -0.0053428512f, -0.0008462245f}, { -0.0000000000f, -0.0012255137f}, { -0.0042090432f, 0.0006666470f}, { -0.0008103756f, -0.0024940795f}, { -0.0015571057f, 0.0007933850f} }, { { -0.0022231823f, -0.0011327680f}, /* Filter 35 */ { 0.0001297372f, -0.0003992901f}, { -0.0039232962f, -0.0006213891f}, { 0.0000000000f, -0.0029502835f}, { -0.0035780951f, 0.0005667146f}, { -0.0012788172f, -0.0039357947f}, { -0.0059704311f, 0.0030420866f}, { -0.0068352744f, -0.0094079482f}, { -0.0074191106f, 0.0074191106f}, { -0.0355940851f, -0.0258606166f}, { 0.0140736575f, -0.0276211080f}, { -0.0681367848f, -0.0221389834f}, { 0.0356619806f, -0.2251608839f}, { 0.3338139023f, 0.0000000000f}, { 0.0481699031f, 0.3041327986f}, { -0.1623383067f, 0.0527469133f}, { -0.0109237052f, -0.0214389786f}, { -0.0364761835f, 0.0265014986f}, { -0.0237769522f, -0.0237769522f}, { -0.0005096614f, 0.0007014887f}, { -0.0109144832f, -0.0055612069f}, { 0.0006362162f, -0.0019580722f}, { -0.0053479162f, -0.0008470267f}, { -0.0000000000f, -0.0011881132f}, { -0.0042201659f, 0.0006684086f}, { -0.0008031447f, -0.0024718253f}, { -0.0015704775f, 0.0008001983f} }, { { -0.0022257106f, -0.0011340562f}, /* Filter 36 */ { 0.0001226858f, -0.0003775881f}, { -0.0039377785f, -0.0006236829f}, { 0.0000000000f, -0.0029240706f}, { -0.0036079683f, 0.0005714460f}, { -0.0012690123f, -0.0039056182f}, { -0.0060279260f, 0.0030713817f}, { -0.0068138363f, -0.0093784411f}, { -0.0075477654f, 0.0075477654f}, { -0.0356835773f, -0.0259256365f}, { 0.0139409476f, -0.0273606501f}, { -0.0688471974f, -0.0223698105f}, { 0.0357842761f, -0.2259330273f}, { 0.3340533515f, 0.0000000000f}, { 0.0480928020f, 0.3036460014f}, { -0.1615395679f, 0.0524873873f}, { -0.0106494241f, -0.0209006716f}, { -0.0365682525f, 0.0265683906f}, { -0.0236517400f, -0.0236517400f}, { -0.0005911249f, 0.0008136137f}, { -0.0108998530f, -0.0055537525f}, { 0.0006161688f, -0.0018963726f}, { -0.0053526174f, -0.0008477713f}, { -0.0000000000f, -0.0011506901f}, { -0.0042310587f, 0.0006701339f}, { -0.0007958903f, -0.0024494986f}, { -0.0015837296f, 0.0008069505f} }, { { -0.0022281185f, -0.0011352831f}, /* Filter 37 */ { 0.0001156098f, -0.0003558105f}, { -0.0039520956f, -0.0006259504f}, { 0.0000000000f, -0.0028976751f}, { -0.0036376653f, 0.0005761496f}, { -0.0012590926f, -0.0038750887f}, { -0.0060852914f, 0.0031006109f}, { -0.0067919097f, -0.0093482617f}, { -0.0076767172f, 0.0076767172f}, { -0.0357720145f, -0.0259898899f}, { 0.0138070366f, -0.0270978352f}, { -0.0695591611f, -0.0226011415f}, { 0.0359063480f, -0.2267037589f}, { 0.3342889675f, 0.0000000000f}, { 0.0480151982f, 0.3031560303f}, { -0.1607406510f, 0.0522278035f}, { -0.0103761991f, -0.0203644373f}, { -0.0366584350f, 0.0266339120f}, { -0.0235261215f, -0.0235261215f}, { -0.0006721419f, 0.0009251240f}, { -0.0108846506f, -0.0055460065f}, { 0.0005961600f, -0.0018347918f}, { -0.0053569537f, -0.0008484581f}, { -0.0000000000f, -0.0011132506f}, { -0.0042417193f, 0.0006718223f}, { -0.0007886122f, -0.0024270988f}, { -0.0015968572f, 0.0008136394f} }, { { -0.0022304022f, -0.0011364467f}, /* Filter 38 */ { 0.0001085087f, -0.0003339556f}, { -0.0039662425f, -0.0006281911f}, { 0.0000000000f, -0.0028710917f}, { -0.0036671818f, 0.0005808245f}, { -0.0012490578f, -0.0038442047f}, { -0.0061425226f, 0.0031297716f}, { -0.0067694939f, -0.0093174091f}, { -0.0078059632f, 0.0078059632f}, { -0.0358593925f, -0.0260533737f}, { 0.0136719292f, -0.0268326719f}, { -0.0702726572f, -0.0228329704f}, { 0.0360281864f, -0.2274730162f}, { 0.3345206886f, 0.0000000000f}, { 0.0479370898f, 0.3026628734f}, { -0.1599415609f, 0.0519681634f}, { -0.0101040387f, -0.0198302924f}, { -0.0367467241f, 0.0266980579f}, { -0.0234001010f, -0.0234001010f}, { -0.0007527098f, 0.0010360162f}, { -0.0108688882f, -0.0055379751f}, { 0.0005761918f, -0.0017733359f}, { -0.0053609232f, -0.0008490868f}, { -0.0000000000f, -0.0010757878f}, { -0.0042521612f, 0.0006734762f}, { -0.0007813108f, -0.0024046275f}, { -0.0016098620f, 0.0008202657f} }, { { -0.0022325659f, -0.0011375491f}, /* Filter 39 */ { 0.0001013836f, -0.0003120266f}, { -0.0039802216f, -0.0006304052f}, { 0.0000000000f, -0.0028443280f}, { -0.0036965139f, 0.0005854703f}, { -0.0012389084f, -0.0038129681f}, { -0.0061996157f, 0.0031588620f}, { -0.0067465878f, -0.0092858815f}, { -0.0079354970f, 0.0079354970f}, { -0.0359456982f, -0.0261160785f}, { 0.0135356225f, -0.0265651549f}, { -0.0709876777f, -0.0230652947f}, { 0.0361497965f, -0.2282408324f}, { 0.3347485628f, 0.0000000000f}, { 0.0478584820f, 0.3021665630f}, { -0.1591423172f, 0.0517084734f}, { -0.0098329431f, -0.0192982375f}, { -0.0368331385f, 0.0267608416f}, { -0.0232736903f, -0.0232736903f}, { -0.0008328273f, 0.0011462885f}, { -0.0108525630f, -0.0055296570f}, { 0.0005562642f, -0.0017120052f}, { -0.0053645285f, -0.0008496578f}, { -0.0000000000f, -0.0010383048f}, { -0.0042623665f, 0.0006750925f}, { -0.0007739869f, -0.0023820868f}, { -0.0016227434f, 0.0008268290f} }, { { -0.0022346067f, -0.0011385890f}, /* Filter 40 */ { 0.0000942350f, -0.0002900256f}, { -0.0039940319f, -0.0006325925f}, { 0.0000000000f, -0.0028173807f}, { -0.0037256640f, 0.0005900872f}, { -0.0012286457f, -0.0037813826f}, { -0.0062565682f, 0.0031878807f}, { -0.0067231917f, -0.0092536796f}, { -0.0080653181f, 0.0080653181f}, { -0.0360309323f, -0.0261780046f}, { 0.0133981115f, -0.0262952744f}, { -0.0717042118f, -0.0232981107f}, { 0.0362711726f, -0.2290071711f}, { 0.3349726054f, 0.0000000000f}, { 0.0477793762f, 0.3016671090f}, { -0.1583429520f, 0.0514487439f}, { -0.0095629171f, -0.0187682815f}, { -0.0369176808f, 0.0268222652f}, { -0.0231468974f, -0.0231468974f}, { -0.0009124926f, 0.0012559383f}, { -0.0108356778f, -0.0055210536f}, { 0.0005363782f, -0.0016508024f}, { -0.0053677718f, -0.0008501715f}, { -0.0000000000f, -0.0010008101f}, { -0.0042723457f, 0.0006766731f}, { -0.0007666411f, -0.0023594786f}, { -0.0016355037f, 0.0008333308f} }, { { -0.0022365232f, -0.0011395655f}, /* Filter 41 */ { 0.0000870628f, -0.0002679518f}, { -0.0040076731f, -0.0006347531f}, { 0.0000000000f, -0.0027902521f}, { -0.0037546254f, 0.0005946742f}, { -0.0012182683f, -0.0037494443f}, { -0.0063133765f, 0.0032168260f}, { -0.0066993029f, -0.0092207994f}, { -0.0081954182f, 0.0081954182f}, { -0.0361150801f, -0.0262391416f}, { 0.0132593976f, -0.0260230330f}, { -0.0724222525f, -0.0235314163f}, { 0.0363923116f, -0.2297720123f}, { 0.3351927556f, 0.0000000000f}, { 0.0476997708f, 0.3011645002f}, { -0.1575434521f, 0.0511889706f}, { -0.0092939607f, -0.0182404248f}, { -0.0370003574f, 0.0268823332f}, { -0.0230197214f, -0.0230197214f}, { -0.0009917019f, 0.0013649606f}, { -0.0108182392f, -0.0055121682f}, { 0.0005165348f, -0.0015897306f}, { -0.0053706532f, -0.0008506279f}, { -0.0000000000f, -0.0009633032f}, { -0.0042820985f, 0.0006782178f}, { -0.0007592726f, -0.0023368007f}, { -0.0016481390f, 0.0008397688f} }, { { -0.0022383190f, -0.0011404805f}, /* Filter 42 */ { 0.0000798669f, -0.0002458049f}, { -0.0040211370f, -0.0006368855f}, { 0.0000000000f, -0.0027629465f}, { -0.0037834012f, 0.0005992319f}, { -0.0012077784f, -0.0037171597f}, { -0.0063700344f, 0.0032456946f}, { -0.0066749202f, -0.0091872395f}, { -0.0083257964f, 0.0083257964f}, { -0.0361981388f, -0.0262994873f}, { 0.0131194860f, -0.0257484410f}, { -0.0731417811f, -0.0237652053f}, { 0.0365132145f, -0.2305353631f}, { 0.3354090492f, 0.0000000000f}, { 0.0476196755f, 0.3006587981f}, { -0.1567438739f, 0.0509291719f}, { -0.0090260797f, -0.0177146788f}, { -0.0370811655f, 0.0269410438f}, { -0.0228921794f, -0.0228921794f}, { -0.0010704568f, 0.0014733573f}, { -0.0108002480f, -0.0055030012f}, { 0.0004967352f, -0.0015287938f}, { -0.0053731737f, -0.0008510271f}, { -0.0000000000f, -0.0009257855f}, { -0.0042916190f, 0.0006797257f}, { -0.0007518828f, -0.0023140572f}, { -0.0016606527f, 0.0008461448f} }, { { -0.0022399887f, -0.0011413312f}, /* Filter 43 */ { 0.0000726493f, -0.0002235915f}, { -0.0040344299f, -0.0006389909f}, { 0.0000000000f, -0.0027354617f}, { -0.0038119815f, 0.0006037586f}, { -0.0011971748f, -0.0036845251f}, { -0.0064265378f, 0.0032744845f}, { -0.0066500430f, -0.0091529990f}, { -0.0084564442f, 0.0084564442f}, { -0.0362800956f, -0.0263590324f}, { 0.0129783713f, -0.0254714879f}, { -0.0738627827f, -0.0239994729f}, { 0.0366338730f, -0.2312971713f}, { 0.3356214637f, 0.0000000000f}, { 0.0475390854f, 0.3001499723f}, { -0.1559442033f, 0.0506693432f}, { -0.0087592798f, -0.0171910545f}, { -0.0371601215f, 0.0269984086f}, { -0.0227642672f, -0.0227642672f}, { -0.0011487520f, 0.0015811215f}, { -0.0107817128f, -0.0054935571f}, { 0.0004769806f, -0.0014679953f}, { -0.0053753300f, -0.0008513686f}, { -0.0000000000f, -0.0008882574f}, { -0.0043009099f, 0.0006811972f}, { -0.0007444717f, -0.0022912484f}, { -0.0016730382f, 0.0008524555f} }, { { -0.0022415348f, -0.0011421190f}, /* Filter 44 */ { 0.0000654088f, -0.0002013077f}, { -0.0040475567f, -0.0006410700f}, { 0.0000000000f, -0.0027078003f}, { -0.0038403710f, 0.0006082550f}, { -0.0011864571f, -0.0036515394f}, { -0.0064828908f, 0.0033031978f}, { -0.0066246707f, -0.0091180770f}, { -0.0085873575f, 0.0085873575f}, { -0.0363609391f, -0.0264177686f}, { 0.0128360470f, -0.0251921607f}, { -0.0745852583f, -0.0242342195f}, { 0.0367542882f, -0.2320574430f}, { 0.3358299840f, 0.0000000000f}, { 0.0474580032f, 0.2996380397f}, { -0.1551444498f, 0.0504094875f}, { -0.0084935567f, -0.0166695436f}, { -0.0372372219f, 0.0270544253f}, { -0.0226359994f, -0.0226359994f}, { -0.0012265888f, 0.0016882547f}, { -0.0107626298f, -0.0054838338f}, { 0.0004572711f, -0.0014073357f}, { -0.0053771277f, -0.0008516534f}, { -0.0000000000f, -0.0008507286f}, { -0.0043099736f, 0.0006826328f}, { -0.0007370403f, -0.0022683768f}, { -0.0016852985f, 0.0008587025f} }, { { -0.0022429558f, -0.0011428431f}, /* Filter 45 */ { 0.0000581457f, -0.0001789542f}, { -0.0040605034f, -0.0006431206f}, { 0.0000000000f, -0.0026799609f}, { -0.0038685641f, 0.0006127204f}, { -0.0011756279f, -0.0036182106f}, { -0.0065390777f, 0.0033318265f}, { -0.0065988038f, -0.0090824743f}, { -0.0087185352f, 0.0087185352f}, { -0.0364406716f, -0.0264756977f}, { 0.0126925250f, -0.0249104828f}, { -0.0753091817f, -0.0244694365f}, { 0.0368744548f, -0.2328161450f}, { 0.3360346197f, 0.0000000000f}, { 0.0473764318f, 0.2991230182f}, { -0.1543446506f, 0.0501496170f}, { -0.0082289214f, -0.0161501676f}, { -0.0373124730f, 0.0271090985f}, { -0.0225073789f, -0.0225073789f}, { -0.0013039662f, 0.0017947555f}, { -0.0107430073f, -0.0054738356f}, { 0.0004376090f, -0.0013468222f}, { -0.0053785675f, -0.0008518814f}, { -0.0000000000f, -0.0008131900f}, { -0.0043188118f, 0.0006840326f}, { -0.0007295900f, -0.0022454470f}, { -0.0016974336f, 0.0008648856f} }, { { -0.0022442531f, -0.0011435041f}, /* Filter 46 */ { 0.0000508607f, -0.0001565332f}, { -0.0040732755f, -0.0006451435f}, { 0.0000000000f, -0.0026519463f}, { -0.0038965612f, 0.0006171547f}, { -0.0011646849f, -0.0035845316f}, { -0.0065951068f, 0.0033603747f}, { -0.0065724401f, -0.0090461878f}, { -0.0088499695f, 0.0088499695f}, { -0.0365192713f, -0.0265328037f}, { 0.0125477901f, -0.0246264247f}, { -0.0760345493f, -0.0247051227f}, { 0.0369943758f, -0.2335732964f}, { 0.3362353715f, 0.0000000000f}, { 0.0472943732f, 0.2986049201f}, { -0.1535448176f, 0.0498897355f}, { -0.0079653685f, -0.0156329159f}, { -0.0373858889f, 0.0271624382f}, { -0.0223784170f, -0.0223784170f}, { -0.0013808793f, 0.0019006173f}, { -0.0107228440f, -0.0054635619f}, { 0.0004179944f, -0.0012864544f}, { -0.0053796470f, -0.0008520524f}, { -0.0000000000f, -0.0007756478f}, { -0.0043274173f, 0.0006853956f}, { -0.0007221187f, -0.0022224528f}, { -0.0017094449f, 0.0008710057f} }, { { -0.0022454243f, -0.0011441008f}, /* Filter 47 */ { 0.0000435551f, -0.0001340487f}, { -0.0040858657f, -0.0006471375f}, { 0.0000000000f, -0.0026237608f}, { -0.0039243606f, 0.0006215577f}, { -0.0011536312f, -0.0035505117f}, { -0.0066509631f, 0.0033888350f}, { -0.0065455769f, -0.0090092137f}, { -0.0089816572f, 0.0089816572f}, { -0.0365967449f, -0.0265890915f}, { 0.0124018566f, -0.0243400141f}, { -0.0767613480f, -0.0249412739f}, { 0.0371140423f, -0.2343288410f}, { 0.3364322263f, 0.0000000000f}, { 0.0472118307f, 0.2980837677f}, { -0.1527449650f, 0.0496298476f}, { -0.0077029082f, -0.0151178086f}, { -0.0374574722f, 0.0272144465f}, { -0.0222491169f, -0.0222491169f}, { -0.0014573283f, 0.0020058404f}, { -0.0107021433f, -0.0054530144f}, { 0.0003984276f, -0.0012262341f}, { -0.0053803718f, -0.0008521672f}, { -0.0000000000f, -0.0007381110f}, { -0.0043357913f, 0.0006867219f}, { -0.0007146270f, -0.0021993958f}, { -0.0017213310f, 0.0008770619f} }, { { -0.0022464703f, -0.0011446338f}, /* Filter 48 */ { 0.0000362282f, -0.0001114988f}, { -0.0040982843f, -0.0006491045f}, { 0.0000000000f, -0.0025953985f}, { -0.0039519572f, 0.0006259285f}, { -0.0011424645f, -0.0035161441f}, { -0.0067066524f, 0.0034172101f}, { -0.0065182191f, -0.0089715590f}, { -0.0091135918f, 0.0091135918f}, { -0.0366730754f, -0.0266445489f}, { 0.0122547132f, -0.0240512288f}, { -0.0774895642f, -0.0251778857f}, { 0.0372334541f, -0.2350827773f}, { 0.3366251695f, 0.0000000000f}, { 0.0471288033f, 0.2975595531f}, { -0.1519450992f, 0.0493699555f}, { -0.0074415407f, -0.0146048459f}, { -0.0375272169f, 0.0272651190f}, { -0.0221194870f, -0.0221194870f}, { -0.0015333122f, 0.0021104232f}, { -0.0106809137f, -0.0054421973f}, { 0.0003789110f, -0.0011661681f}, { -0.0053807401f, -0.0008522255f}, { -0.0000000000f, -0.0007005733f}, { -0.0043439389f, 0.0006880123f}, { -0.0007071195f, -0.0021762900f}, { -0.0017330882f, 0.0008830525f} }, { { -0.0022473903f, -0.0011451026f}, /* Filter 49 */ { 0.0000288809f, -0.0000888863f}, { -0.0041105253f, -0.0006510433f}, { 0.0000000000f, -0.0025668690f}, { -0.0039793495f, 0.0006302670f}, { -0.0011311858f, -0.0034814320f}, { -0.0067621637f, 0.0034454945f}, { -0.0064903592f, -0.0089332130f}, { -0.0092457714f, 0.0092457714f}, { -0.0367482531f, -0.0266991688f}, { 0.0121063640f, -0.0237600772f}, { -0.0782191848f, -0.0254149538f}, { 0.0373526110f, -0.2358351039f}, { 0.3368142103f, 0.0000000000f}, { 0.0470452963f, 0.2970323104f}, { -0.1511452494f, 0.0491100685f}, { -0.0071812658f, -0.0140940276f}, { -0.0375951417f, 0.0273144693f}, { -0.0219895354f, -0.0219895354f}, { -0.0016088279f, 0.0022143617f}, { -0.0106591532f, -0.0054311098f}, { 0.0003594448f, -0.0011062575f}, { -0.0053807534f, -0.0008522276f}, { -0.0000000000f, -0.0006630402f}, { -0.0043518542f, 0.0006892660f}, { -0.0006995909f, -0.0021531195f}, { -0.0017447212f, 0.0008889799f} }, { { -0.0022481826f, -0.0011455063f}, /* Filter 50 */ { 0.0000215124f, -0.0000662085f}, { -0.0041225812f, -0.0006529527f}, { 0.0000000000f, -0.0025381729f}, { -0.0040065374f, 0.0006345732f}, { -0.0011197964f, -0.0034463789f}, { -0.0068174982f, 0.0034736888f}, { -0.0064619996f, -0.0088941795f}, { -0.0093781859f, 0.0093781859f}, { -0.0368222770f, -0.0267529502f}, { 0.0119568064f, -0.0234665539f}, { -0.0789501938f, -0.0256524730f}, { 0.0374715012f, -0.2365857471f}, { 0.3369993395f, 0.0000000000f}, { 0.0469613070f, 0.2965020230f}, { -0.1503454306f, 0.0488501916f}, { -0.0069220926f, -0.0135853716f}, { -0.0376612461f, 0.0273624970f}, { -0.0218592629f, -0.0218592629f}, { -0.0016838770f, 0.0023176579f}, { -0.0106368706f, -0.0054197563f}, { 0.0003400298f, -0.0010465041f}, { -0.0053804087f, -0.0008521730f}, { -0.0000000000f, -0.0006255130f}, { -0.0043595438f, 0.0006904839f}, { -0.0006920455f, -0.0021298969f}, { -0.0017562251f, 0.0008948414f} }, { { -0.0022488502f, -0.0011458464f}, /* Filter 51 */ { 0.0000141245f, -0.0000434707f}, { -0.0041344617f, -0.0006548344f}, { 0.0000000000f, -0.0025093019f}, { -0.0040335180f, 0.0006388465f}, { -0.0011082965f, -0.0034109859f}, { -0.0068726491f, 0.0035017896f}, { -0.0064331423f, -0.0088544608f}, { -0.0095108389f, 0.0095108389f}, { -0.0368951402f, -0.0268058885f}, { 0.0118060423f, -0.0231706626f}, { -0.0796825853f, -0.0258904414f}, { 0.0375901346f, -0.2373347695f}, { 0.3371805647f, 0.0000000000f}, { 0.0468768425f, 0.2959687351f}, { -0.1495456540f, 0.0485903285f}, { -0.0066640196f, -0.0130788749f}, { -0.0377255408f, 0.0274092098f}, { -0.0217286837f, -0.0217286837f}, { -0.0017584537f, 0.0024203039f}, { -0.0106140636f, -0.0054081355f}, { 0.0003206673f, -0.0009869126f}, { -0.0053797155f, -0.0008520632f}, { -0.0000000000f, -0.0005879963f}, { -0.0043670009f, 0.0006916650f}, { -0.0006844835f, -0.0021066237f}, { -0.0017676012f, 0.0009006378f} }, { { -0.0022493906f, -0.0011461218f}, /* Filter 52 */ { 0.0000067158f, -0.0000206692f}, { -0.0041461563f, -0.0006566866f}, { 0.0000000000f, -0.0024802648f}, { -0.0040602898f, 0.0006430867f}, { -0.0010966851f, -0.0033752497f}, { -0.0069276141f, 0.0035297957f}, { -0.0064037822f, -0.0088140501f}, { -0.0096437180f, 0.0096437180f}, { -0.0369668239f, -0.0268579697f}, { 0.0116540714f, -0.0228724030f}, { -0.0804163482f, -0.0261288554f}, { 0.0377085026f, -0.2380821155f}, { 0.3373578615f, 0.0000000000f}, { 0.0467919009f, 0.2954324350f}, { -0.1487459309f, 0.0483304827f}, { -0.0064070501f, -0.0125745438f}, { -0.0377880257f, 0.0274546077f}, { -0.0215977999f, -0.0215977999f}, { -0.0018325584f, 0.0025223003f}, { -0.0105907396f, -0.0053962514f}, { 0.0003013579f, -0.0009274844f}, { -0.0053786652f, -0.0008518969f}, { -0.0000000000f, -0.0005504888f}, { -0.0043742317f, 0.0006928102f}, { -0.0006769032f, -0.0020832938f}, { -0.0017788493f, 0.0009063690f} }, { { -0.0022498023f, -0.0011463315f}, /* Filter 53 */ { -0.0000007105f, 0.0000021866f}, { -0.0041576695f, -0.0006585102f}, { 0.0000000000f, -0.0024510651f}, { -0.0040868488f, 0.0006472933f}, { -0.0010849638f, -0.0033391752f}, { -0.0069823897f, 0.0035577053f}, { -0.0063739197f, -0.0087729478f}, { -0.0097768207f, 0.0097768207f}, { -0.0370373273f, -0.0269091934f}, { 0.0115008908f, -0.0225717691f}, { -0.0811514623f, -0.0263677085f}, { 0.0378266004f, -0.2388277557f}, { 0.3375312165f, 0.0000000000f}, { 0.0467064846f, 0.2948931379f}, { -0.1479462926f, 0.0480706645f}, { -0.0061511870f, -0.0120723842f}, { -0.0378487057f, 0.0274986943f}, { -0.0214666211f, -0.0214666211f}, { -0.0019061921f, 0.0026236483f}, { -0.0105669024f, -0.0053841057f}, { 0.0002821033f, -0.0008682246f}, { -0.0053772639f, -0.0008516749f}, { -0.0000000000f, -0.0005129974f}, { -0.0043812313f, 0.0006939189f}, { -0.0006693064f, -0.0020599133f}, { -0.0017899694f, 0.0009120349f} }, { { -0.0022500878f, -0.0011464770f}, /* Filter 54 */ { -0.0000081573f, 0.0000251055f}, { -0.0041690028f, -0.0006603052f}, { 0.0000000000f, -0.0024216984f}, { -0.0041131960f, 0.0006514662f}, { -0.0010731328f, -0.0033027631f}, { -0.0070369692f, 0.0035855149f}, { -0.0063435547f, -0.0087311541f}, { -0.0099101441f, 0.0099101441f}, { -0.0371066415f, -0.0269595532f}, { 0.0113465049f, -0.0222687697f}, { -0.0818879174f, -0.0266069972f}, { 0.0379444273f, -0.2395716850f}, { 0.3377006790f, 0.0000000000f}, { 0.0466205992f, 0.2943508790f}, { -0.1471467472f, 0.0478108764f}, { -0.0058964369f, -0.0115724089f}, { -0.0379075894f, 0.0275414759f}, { -0.0213351496f, -0.0213351496f}, { -0.0019793489f, 0.0027243401f}, { -0.0105425517f, -0.0053716984f}, { 0.0002629036f, -0.0008091340f}, { -0.0053755151f, -0.0008513979f}, { -0.0000000000f, -0.0004755140f}, { -0.0043880048f, 0.0006949917f}, { -0.0006616940f, -0.0020364848f}, { -0.0018009641f, 0.0009176370f} }, { { -0.0022502440f, -0.0011465566f}, /* Filter 55 */ { -0.0000156216f, 0.0000480783f}, { -0.0041801479f, -0.0006620704f}, { 0.0000000000f, -0.0023921649f}, { -0.0041393246f, 0.0006556046f}, { -0.0010611914f, -0.0032660113f}, { -0.0070913538f, 0.0036132252f}, { -0.0063126885f, -0.0086886704f}, { -0.0100436811f, 0.0100436811f}, { -0.0371747573f, -0.0270090421f}, { 0.0111909061f, -0.0219633899f}, { -0.0826257082f, -0.0268467200f}, { 0.0380619805f, -0.2403138872f}, { 0.3378661729f, 0.0000000000f}, { 0.0465342410f, 0.2938056346f}, { -0.1463473013f, 0.0475511207f}, { -0.0056427969f, -0.0110746124f}, { -0.0379646890f, 0.0275829612f}, { -0.0212033969f, -0.0212033969f}, { -0.0020520317f, 0.0028243793f}, { -0.0105176937f, -0.0053590326f}, { 0.0002437596f, -0.0007502150f}, { -0.0053734107f, -0.0008510646f}, { -0.0000000000f, -0.0004380525f}, { -0.0043945464f, 0.0006960278f}, { -0.0006540651f, -0.0020130052f}, { -0.0018118257f, 0.0009231713f} }, { { -0.0022502727f, -0.0011465712f}, /* Filter 56 */ { -0.0000231042f, 0.0000711074f}, { -0.0041911082f, -0.0006638063f}, { 0.0000000000f, -0.0023624732f}, { -0.0041652385f, 0.0006597090f}, { -0.0010491418f, -0.0032289263f}, { -0.0071455361f, 0.0036408325f}, { -0.0062813164f, -0.0086454904f}, { -0.0101774269f, 0.0101774269f}, { -0.0372416715f, -0.0270576581f}, { 0.0110340968f, -0.0216556342f}, { -0.0833648092f, -0.0270868685f}, { 0.0381792592f, -0.2410543557f}, { 0.3380277742f, 0.0000000000f}, { 0.0464474173f, 0.2932574514f}, { -0.1455479905f, 0.0472914089f}, { -0.0053902680f, -0.0105789967f}, { -0.0380200008f, 0.0276231475f}, { -0.0210713702f, -0.0210713702f}, { -0.0021242368f, 0.0029237612f}, { -0.0104923262f, -0.0053461072f}, { 0.0002246725f, -0.0006914707f}, { -0.0053709647f, -0.0008506772f}, { -0.0000000000f, -0.0004006073f}, { -0.0044008610f, 0.0006970279f}, { -0.0006464218f, -0.0019894817f}, { -0.0018225596f, 0.0009286405f} }, { { -0.0022501716f, -0.0011465197f}, /* Filter 57 */ { -0.0000306060f, 0.0000941955f}, { -0.0042018827f, -0.0006655128f}, { 0.0000000000f, -0.0023326243f}, { -0.0041909284f, 0.0006637778f}, { -0.0010369820f, -0.0031915023f}, { -0.0071995141f, 0.0036683357f}, { -0.0062494398f, -0.0086016160f}, { -0.0103113770f, 0.0103113770f}, { -0.0373073694f, -0.0271053905f}, { 0.0108760800f, -0.0213455089f}, { -0.0841052204f, -0.0273274427f}, { 0.0382962586f, -0.2417930608f}, { 0.3381854075f, 0.0000000000f}, { 0.0463601257f, 0.2927063137f}, { -0.1447488052f, 0.0470317378f}, { -0.0051388586f, -0.0100855779f}, { -0.0380735357f, 0.0276620429f}, { -0.0209390691f, -0.0209390691f}, { -0.0021959615f, 0.0030224817f}, { -0.0104664619f, -0.0053329287f}, { 0.0002056433f, -0.0006329051f}, { -0.0053681691f, -0.0008502345f}, { -0.0000000000f, -0.0003631842f}, { -0.0044069406f, 0.0006979908f}, { -0.0006387617f, -0.0019659065f}, { -0.0018331638f, 0.0009340436f} }, { { -0.0022499438f, -0.0011464036f}, /* Filter 58 */ { -0.0000381241f, 0.0001173340f}, { -0.0042124676f, -0.0006671893f}, { 0.0000000000f, -0.0023026112f}, { -0.0042164035f, 0.0006678127f}, { -0.0010247148f, -0.0031537479f}, { -0.0072532811f, 0.0036957313f}, { -0.0062170590f, -0.0085570476f}, { -0.0104455273f, 0.0104455273f}, { -0.0373718527f, -0.0271522404f}, { 0.0107168551f, -0.0210330123f}, { -0.0848469266f, -0.0275684376f}, { 0.0384129780f, -0.2425299982f}, { 0.3383391016f, 0.0000000000f}, { 0.0462723730f, 0.2921522650f}, { -0.1439497886f, 0.0467721216f}, { -0.0048885718f, -0.0095943625f}, { -0.0381252938f, 0.0276996474f}, { -0.0208065105f, -0.0208065104f}, { -0.0022672080f, 0.0031205442f}, { -0.0104400974f, -0.0053194953f}, { 0.0001866731f, -0.0005745208f}, { -0.0053650246f, -0.0008497364f}, { -0.0000000000f, -0.0003257856f}, { -0.0044127979f, 0.0006989185f}, { -0.0006310899f, -0.0019422951f}, { -0.0018436386f, 0.0009393808f} }, { { -0.0022495854f, -0.0011462210f}, /* Filter 59 */ { -0.0000456602f, 0.0001405276f}, { -0.0042228650f, -0.0006688361f}, { 0.0000000000f, -0.0022724392f}, { -0.0042416532f, 0.0006718119f}, { -0.0010123388f, -0.0031156583f}, { -0.0073068366f, 0.0037230192f}, { -0.0061841719f, -0.0085117824f}, { -0.0105798714f, 0.0105798714f}, { -0.0374351001f, -0.0271981923f}, { 0.0105564182f, -0.0207181373f}, { -0.0855898985f, -0.0278098438f}, { 0.0385294149f, -0.2432651518f}, { 0.3384888443f, 0.0000000000f}, { 0.0461841561f, 0.2915952853f}, { -0.1431509477f, 0.0465125625f}, { -0.0046394033f, -0.0091053416f}, { -0.0381752904f, 0.0277359720f}, { -0.0206736926f, -0.0206736926f}, { -0.0023379747f, 0.0032179461f}, { -0.0104132366f, -0.0053058091f}, { 0.0001677624f, -0.0005163194f}, { -0.0053615377f, -0.0008491842f}, { -0.0000000000f, -0.0002884118f}, { -0.0044184245f, 0.0006998097f}, { -0.0006234019f, -0.0019186336f}, { -0.0018539861f, 0.0009446531f} }, { { -0.0022490980f, -0.0011459727f}, /* Filter 60 */ { -0.0000532127f, 0.0001637720f}, { -0.0042330752f, -0.0006704533f}, { 0.0000000000f, -0.0022421145f}, { -0.0042666731f, 0.0006757746f}, { -0.0009998548f, -0.0030772368f}, { -0.0073601752f, 0.0037501966f}, { -0.0061507798f, -0.0084658221f}, { -0.0107144051f, 0.0107144051f}, { -0.0374971151f, -0.0272432488f}, { 0.0103947715f, -0.0204008878f}, { -0.0863341457f, -0.0280516644f}, { 0.0386455624f, -0.2439984781f}, { 0.3386346272f, 0.0000000000f}, { 0.0460954822f, 0.2910354206f}, { -0.1423522805f, 0.0462530597f}, { -0.0043913598f, -0.0086185289f}, { -0.0382235216f, 0.0277710140f}, { -0.0205406256f, -0.0205406256f}, { -0.0024082571f, 0.0033146815f}, { -0.0103858860f, -0.0052918732f}, { 0.0001489124f, -0.0004583052f}, { -0.0053577070f, -0.0008485774f}, { -0.0000000000f, -0.0002510630f}, { -0.0044238206f, 0.0007006644f}, { -0.0006157019f, -0.0018949355f}, { -0.0018642004f, 0.0009498575f} }, { { -0.0022484808f, -0.0011456582f}, /* Filter 61 */ { -0.0000607804f, 0.0001870628f}, { -0.0042430934f, -0.0006720400f}, { 0.0000000000f, -0.0022116302f}, { -0.0042914705f, 0.0006797022f}, { -0.0009872642f, -0.0030384868f}, { -0.0074132930f, 0.0037772614f}, { -0.0061168795f, -0.0084191624f}, { -0.0108491236f, 0.0108491236f}, { -0.0375578842f, -0.0272874001f}, { 0.0102319154f, -0.0200812646f}, { -0.0870796498f, -0.0282938934f}, { 0.0387614234f, -0.2447299955f}, { 0.3387764777f, 0.0000000000f}, { 0.0460063488f, 0.2904726541f}, { -0.1415538244f, 0.0459936256f}, { -0.0041444459f, -0.0081339331f}, { -0.0382700034f, 0.0278047850f}, { -0.0204073193f, -0.0204073193f}, { -0.0024780545f, 0.0034107494f}, { -0.0103580480f, -0.0052776890f}, { 0.0001301236f, -0.0004004791f}, { -0.0053535336f, -0.0008479164f}, { -0.0000000000f, -0.0002137479f}, { -0.0044289903f, 0.0007014831f}, { -0.0006079877f, -0.0018711939f}, { -0.0018742850f, 0.0009549959f} }, { { -0.0022477336f, -0.0011452775f}, /* Filter 62 */ { -0.0000683662f, 0.0002104096f}, { -0.0042529265f, -0.0006735974f}, { 0.0000000000f, -0.0021809969f}, { -0.0043160343f, 0.0006835927f}, { -0.0009745664f, -0.0029994070f}, { -0.0074661872f, 0.0038042124f}, { -0.0060824726f, -0.0083718053f}, { -0.0109840200f, 0.0109840200f}, { -0.0376174025f, -0.0273306427f}, { 0.0100678484f, -0.0197592651f}, { -0.0878263866f, -0.0285365229f}, { 0.0388769943f, -0.2454596814f}, { 0.3389143782f, 0.0000000000f}, { 0.0459167605f, 0.2899070162f}, { -0.1407555807f, 0.0457342605f}, { -0.0038986588f, -0.0076515486f}, { -0.0383147369f, 0.0278372858f}, { -0.0202737736f, -0.0202737736f}, { -0.0025473698f, 0.0035061537f}, { -0.0103297257f, -0.0052632581f}, { 0.0001113966f, -0.0003428435f}, { -0.0053490169f, -0.0008472010f}, { -0.0000000000f, -0.0001764611f}, { -0.0044339292f, 0.0007022654f}, { -0.0006002610f, -0.0018474133f}, { -0.0018842402f, 0.0009600683f} }, { { -0.0022468561f, -0.0011448304f}, /* Filter 63 */ { -0.0000759667f, 0.0002338013f}, { -0.0042625620f, -0.0006751235f}, { 0.0000000000f, -0.0021502064f}, { -0.0043403667f, 0.0006874465f}, { -0.0009617615f, -0.0029599977f}, { -0.0075188538f, 0.0038310474f}, { -0.0060475588f, -0.0083237506f}, { -0.0111190914f, 0.0111190914f}, { -0.0376756581f, -0.0273729679f}, { 0.0099025724f, -0.0194348927f}, { -0.0885743593f, -0.0287795539f}, { 0.0389922690f, -0.2461874974f}, { 0.3390482929f, 0.0000000000f}, { 0.0458267191f, 0.2893385169f}, { -0.1399575771f, 0.0454749735f}, { -0.0036540038f, -0.0071713863f}, { -0.0383577269f, 0.0278685199f}, { -0.0201399968f, -0.0201399968f}, { -0.0026161974f, 0.0036008869f}, { -0.0103009234f, -0.0052485826f}, { 0.0000927328f, -0.0002854022f}, { -0.0053441572f, -0.0008464313f}, { -0.0000000000f, -0.0001392054f}, { -0.0044386430f, 0.0007030120f}, { -0.0005925210f, -0.0018235921f}, { -0.0018940611f, 0.0009650723f} }, { { -0.0022458480f, -0.0011443167f}, /* Filter 64 */ { -0.0000835820f, 0.0002572390f}, { -0.0042720048f, -0.0006766191f}, { 0.0000000000f, -0.0021192677f}, { -0.0043644688f, 0.0006912640f}, { -0.0009488505f, -0.0029202617f}, { -0.0075712885f, 0.0038577642f}, { -0.0060121356f, -0.0082749947f}, { -0.0112543303f, 0.0112543303f}, { -0.0377326433f, -0.0274143701f}, { 0.0097360827f, -0.0191081382f}, { -0.0893235341f, -0.0290229756f}, { 0.0391072478f, -0.2469134452f}, { 0.3391782445f, 0.0000000000f}, { 0.0457362256f, 0.2887671637f}, { -0.1391598293f, 0.0452157695f}, { -0.0034104848f, -0.0066934534f}, { -0.0383989776f, 0.0278984903f}, { -0.0200059998f, -0.0200059998f}, { -0.0026845378f, 0.0036949493f}, { -0.0102716430f, -0.0052336635f}, { 0.0000741335f, -0.0002281595f}, { -0.0053389628f, -0.0008456086f}, { -0.0000000000f, -0.0001019889f}, { -0.0044431266f, 0.0007037221f}, { -0.0005847711f, -0.0017997404f}, { -0.0019037530f, 0.0009700106f} }, { { -0.0022447108f, -0.0011437373f}, /* Filter 65 */ { -0.0000912136f, 0.0002807266f}, { -0.0042812542f, -0.0006780840f}, { 0.0000000000f, -0.0020881801f}, { -0.0043883332f, 0.0006950437f}, { -0.0009358341f, -0.0028802012f}, { -0.0076234876f, 0.0038843610f}, { -0.0059762043f, -0.0082255396f}, { -0.0113897330f, 0.0113897330f}, { -0.0377883557f, -0.0274548475f}, { 0.0095683866f, -0.0187790160f}, { -0.0900739211f, -0.0292667911f}, { 0.0392219302f, -0.2476375210f}, { 0.3393042459f, 0.0000000000f}, { 0.0456452799f, 0.2881929551f}, { -0.1383623364f, 0.0449566483f}, { -0.0031681003f, -0.0062177469f}, { -0.0384385005f, 0.0279272053f}, { -0.0198717871f, -0.0198717871f}, { -0.0027523906f, 0.0037883407f}, { -0.0102418869f, -0.0052185020f}, { 0.0000555987f, -0.0001711151f}, { -0.0053334257f, -0.0008447316f}, { -0.0000000000f, -0.0000648082f}, { -0.0044473797f, 0.0007043957f}, { -0.0005770089f, -0.0017758509f}, { -0.0019133143f, 0.0009748823f} }, { { -0.0022434404f, -0.0011430900f}, /* Filter 66 */ { -0.0000988591f, 0.0003042571f}, { -0.0042903141f, -0.0006795190f}, { 0.0000000000f, -0.0020569427f}, { -0.0044119618f, 0.0006987861f}, { -0.0009227124f, -0.0028398167f}, { -0.0076754477f, 0.0039108359f}, { -0.0059397663f, -0.0081753869f}, { -0.0115252954f, 0.0115252954f}, { -0.0378427866f, -0.0274943939f}, { 0.0093994769f, -0.0184475121f}, { -0.0908254902f, -0.0295109907f}, { 0.0393363079f, -0.2483596736f}, { 0.3394262701f, 0.0000000000f}, { 0.0455538916f, 0.2876159521f}, { -0.1375651403f, 0.0446976236f}, { -0.0029268546f, -0.0057442757f}, { -0.0384763002f, 0.0279546684f}, { -0.0197373608f, -0.0197373608f}, { -0.0028197549f, 0.0038810597f}, { -0.0102116616f, -0.0052031015f}, { 0.0000371295f, -0.0001142728f}, { -0.0053275531f, -0.0008438015f}, { -0.0000000000f, -0.0000276667f}, { -0.0044514082f, 0.0007050338f}, { -0.0005692359f, -0.0017519279f}, { -0.0019227418f, 0.0009796859f} }, { { -0.0022420391f, -0.0011423760f}, /* Filter 67 */ { -0.0001065191f, 0.0003278322f}, { -0.0042991742f, -0.0006809223f}, { 0.0000000000f, -0.0020255556f}, { -0.0044353502f, 0.0007024905f}, { -0.0009094853f, -0.0027991078f}, { -0.0077271635f, 0.0039371865f}, { -0.0059028162f, -0.0081245295f}, { -0.0116610092f, 0.0116610092f}, { -0.0378959245f, -0.0275330008f}, { 0.0092293595f, -0.0181136380f}, { -0.0915782328f, -0.0297555716f}, { 0.0394503819f, -0.2490799083f}, { 0.3395443142f, 0.0000000000f}, { 0.0454620561f, 0.2870361257f}, { -0.1367682311f, 0.0444386921f}, { -0.0026867496f, -0.0052730430f}, { -0.0385123800f, 0.0279808820f}, { -0.0196027359f, -0.0196027359f}, { -0.0028866289f, 0.0039731038f}, { -0.0101809712f, -0.0051874639f}, { 0.0000187268f, -0.0000576352f}, { -0.0053213449f, -0.0008428182f}, { 0.0000000000f, 0.0000094350f}, { -0.0044552115f, 0.0007056362f}, { -0.0005614523f, -0.0017279724f}, { -0.0019320384f, 0.0009844227f} }, { { -0.0022405060f, -0.0011415948f}, /* Filter 68 */ { -0.0001141917f, 0.0003514459f}, { -0.0043078420f, -0.0006822951f}, { 0.0000000000f, -0.0019940273f}, { -0.0044584965f, 0.0007061565f}, { -0.0008961544f, -0.0027580796f}, { -0.0077786333f, 0.0039634116f}, { -0.0058653573f, -0.0080729717f}, { -0.0117968713f, 0.0117968713f}, { -0.0379477617f, -0.0275706627f}, { 0.0090580301f, -0.0177773850f}, { -0.0923321333f, -0.0300005287f}, { 0.0395641481f, -0.2497981996f}, { 0.3396583880f, 0.0000000000f}, { 0.0453697749f, 0.2864534851f}, { -0.1359716398f, 0.0441798639f}, { -0.0024477914f, -0.0048040611f}, { -0.0385467483f, 0.0280058520f}, { -0.0194679109f, -0.0194679108f}, { -0.0029530116f, 0.0040644718f}, { -0.0101498145f, -0.0051715888f}, { 0.0000003917f, -0.0000012056f}, { -0.0053148036f, -0.0008417822f}, { 0.0000000000f, 0.0000464885f}, { -0.0044587869f, 0.0007062025f}, { -0.0005536582f, -0.0017039849f}, { -0.0019412022f, 0.0009890919f} }, { { -0.0022388438f, -0.0011407479f}, /* Filter 69 */ { -0.0001218783f, 0.0003751028f}, { -0.0043163061f, -0.0006836357f}, { 0.0000000000f, -0.0019623556f}, { -0.0044814011f, 0.0007097842f}, { -0.0008827194f, -0.0027167309f}, { -0.0078298528f, 0.0039895092f}, { -0.0058273888f, -0.0080207126f}, { -0.0119328775f, 0.0119328775f}, { -0.0379982948f, -0.0276073771f}, { 0.0088854919f, -0.0174387598f}, { -0.0930871872f, -0.0302458606f}, { 0.0396776072f, -0.2505145525f}, { 0.3397684880f, 0.0000000000f}, { 0.0452770566f, 0.2858680847f}, { -0.1351753758f, 0.0439211421f}, { -0.0022099760f, -0.0043373221f}, { -0.0385794176f, 0.0280295876f}, { -0.0193328981f, -0.0193328981f}, { -0.0030189005f, 0.0041551601f}, { -0.0101182016f, -0.0051554812f}, { -0.0000178756f, 0.0000550153f}, { -0.0053079282f, -0.0008406932f}, { 0.0000000000f, 0.0000835019f}, { -0.0044621312f, 0.0007067322f}, { -0.0005458542f, -0.0016799665f}, { -0.0019502349f, 0.0009936943f} }, { { -0.0022370475f, -0.0011398326f}, /* Filter 70 */ { -0.0001295793f, 0.0003988042f}, { -0.0043245792f, -0.0006849461f}, { 0.0000000000f, -0.0019305404f}, { -0.0045040620f, 0.0007133733f}, { -0.0008691803f, -0.0026750618f}, { -0.0078808157f, 0.0040154761f}, { -0.0057889082f, -0.0079677486f}, { -0.0120690194f, 0.0120690194f}, { -0.0380475075f, -0.0276431323f}, { 0.0087117470f, -0.0170977662f}, { -0.0938433728f, -0.0304915602f}, { 0.0397907528f, -0.2512289255f}, { 0.3398745972f, 0.0000000000f}, { 0.0451838979f, 0.2852799039f}, { -0.1343794616f, 0.0436625339f}, { -0.0019733077f, -0.0038728344f}, { -0.0386103854f, 0.0280520870f}, { -0.0191976997f, -0.0191976997f}, { -0.0030842956f, 0.0042451687f}, { -0.0100861291f, -0.0051391395f}, { -0.0000360739f, 0.0001110239f}, { -0.0053007186f, -0.0008395513f}, { 0.0000000000f, 0.0001204636f}, { -0.0044652477f, 0.0007072258f}, { -0.0005380409f, -0.0016559196f}, { -0.0019591345f, 0.0009982289f} }, { { -0.0022351193f, -0.0011388502f}, /* Filter 71 */ { -0.0001372916f, 0.0004225402f}, { -0.0043326526f, -0.0006862248f}, { 0.0000000000f, -0.0018985847f}, { -0.0045264729f, 0.0007169229f}, { -0.0008555388f, -0.0026330778f}, { -0.0079315220f, 0.0040413123f}, { -0.0057499191f, -0.0079140847f}, { -0.0122052947f, 0.0122052947f}, { -0.0380954013f, -0.0276779292f}, { 0.0085367892f, -0.0167543922f}, { -0.0946006731f, -0.0307376220f}, { 0.0399035852f, -0.2519413212f}, { 0.3399767352f, 0.0000000000f}, { 0.0450903019f, 0.2846889619f}, { -0.1335839077f, 0.0434040427f}, { -0.0017377909f, -0.0034106068f}, { -0.0386396562f, 0.0280733535f}, { -0.0190623224f, -0.0190623224f}, { -0.0031491979f, 0.0043344990f}, { -0.0100536090f, -0.0051225696f}, { -0.0000542017f, 0.0001668158f}, { -0.0052931768f, -0.0008383569f}, { 0.0000000000f, 0.0001573786f}, { -0.0044681412f, 0.0007076840f}, { -0.0005302207f, -0.0016318514f}, { -0.0019679000f, 0.0010026952f} }, { { -0.0022330599f, -0.0011378009f}, /* Filter 72 */ { -0.0001450151f, 0.0004463107f}, { -0.0043405200f, -0.0006874708f}, { 0.0000000000f, -0.0018664891f}, { -0.0045486380f, 0.0007204335f}, { -0.0008417947f, -0.0025907777f}, { -0.0079819653f, 0.0040670144f}, { -0.0057104183f, -0.0078597165f}, { -0.0123416968f, 0.0123416968f}, { -0.0381419710f, -0.0277117641f}, { 0.0083606221f, -0.0164086448f}, { -0.0953590886f, -0.0309840461f}, { 0.0400161008f, -0.2526517170f}, { 0.3400748842f, 0.0000000000f}, { 0.0449962735f, 0.2840952899f}, { -0.1327887358f, 0.0431456757f}, { -0.0015034225f, -0.0029506329f}, { -0.0386672447f, 0.0280933977f}, { -0.0189267792f, -0.0189267792f}, { -0.0032136048f, 0.0044231476f}, { -0.0100206356f, -0.0051057689f}, { -0.0000722598f, 0.0002223928f}, { -0.0052853097f, -0.0008371108f}, { 0.0000000000f, 0.0001942402f}, { -0.0044708094f, 0.0007081066f}, { -0.0005223897f, -0.0016077501f}, { -0.0019765358f, 0.0010070953f} }, { { -0.0022308664f, -0.0011366832f}, /* Filter 73 */ { -0.0001527526f, 0.0004701241f}, { -0.0043481937f, -0.0006886862f}, { 0.0000000000f, -0.0018342587f}, { -0.0045705499f, 0.0007239040f}, { -0.0008279475f, -0.0025481605f}, { -0.0080321422f, 0.0040925809f}, { -0.0056704053f, -0.0078046434f}, { -0.0124782163f, 0.0124782163f}, { -0.0381871931f, -0.0277446198f}, { 0.0081832497f, -0.0160605319f}, { -0.0961186050f, -0.0312308280f}, { 0.0401282958f, -0.2533600885f}, { 0.3401690422f, 0.0000000000f}, { 0.0449018114f, 0.2834988794f}, { -0.1319939386f, 0.0428874304f}, { -0.0012702110f, -0.0024929295f}, { -0.0386931575f, 0.0281122245f}, { -0.0187910667f, -0.0187910667f}, { -0.0032775125f, 0.0045111089f}, { -0.0099872186f, -0.0050887420f}, { -0.0000902463f, 0.0002777495f}, { -0.0052771110f, -0.0008358123f}, { 0.0000000000f, 0.0002310499f}, { -0.0044732506f, 0.0007084933f}, { -0.0005145514f, -0.0015836262f}, { -0.0019850362f, 0.0010114265f} }, { { -0.0022285419f, -0.0011354988f}, /* Filter 74 */ { -0.0001605011f, 0.0004939715f}, { -0.0043556701f, -0.0006898704f}, { 0.0000000000f, -0.0018018889f}, { -0.0045922082f, 0.0007273343f}, { -0.0008139998f, -0.0025052338f}, { -0.0080820516f, 0.0041180110f}, { -0.0056298825f, -0.0077488684f}, { -0.0126148560f, 0.0126148560f}, { -0.0382310777f, -0.0277765039f}, { 0.0080046651f, -0.0157100397f}, { -0.0968791926f, -0.0314779578f}, { 0.0402401713f, -0.2540664421f}, { 0.3402592203f, 0.0000000000f}, { 0.0448069181f, 0.2828997467f}, { -0.1311995619f, 0.0426293218f}, { -0.0010381516f, -0.0020374872f}, { -0.0387173946f, 0.0281298337f}, { -0.0186551985f, -0.0186551985f}, { -0.0033409256f, 0.0045983896f}, { -0.0099533576f, -0.0050714890f}, { -0.0001081607f, 0.0003328846f}, { -0.0052685865f, -0.0008344621f}, { 0.0000000000f, 0.0002678034f}, { -0.0044754634f, 0.0007088438f}, { -0.0005067065f, -0.0015594822f}, { -0.0019934027f, 0.0010156894f} }, { { -0.0022260831f, -0.0011342460f}, /* Filter 75 */ { -0.0001682594f, 0.0005178491f}, { -0.0043629383f, -0.0006910215f}, { 0.0000000000f, -0.0017693819f}, { -0.0046136165f, 0.0007307251f}, { -0.0007999506f, -0.0024619949f}, { -0.0081316854f, 0.0041433007f}, { -0.0055888462f, -0.0076923868f}, { -0.0127516043f, 0.0127516043f}, { -0.0382736074f, -0.0278074035f}, { 0.0078248748f, -0.0153571814f}, { -0.0976408374f, -0.0317254312f}, { 0.0403517197f, -0.2547707314f}, { 0.3403453966f, 0.0000000000f}, { 0.0447115990f, 0.2822979260f}, { -0.1304056099f, 0.0423713512f}, { -0.0008072533f, -0.0015843239f}, { -0.0387399618f, 0.0281462298f}, { -0.0185191789f, -0.0185191789f}, { -0.0034038419f, 0.0046849864f}, { -0.0099190609f, -0.0050540140f}, { -0.0001260014f, 0.0003877925f}, { -0.0052597363f, -0.0008330604f}, { 0.0000000000f, 0.0003045018f}, { -0.0044774545f, 0.0007091591f}, { -0.0004988537f, -0.0015353137f}, { -0.0020016361f, 0.0010198845f} }, { { -0.0022234937f, -0.0011329266f}, /* Filter 76 */ { -0.0001760298f, 0.0005417639f}, { -0.0043700036f, -0.0006921406f}, { 0.0000000000f, -0.0017367458f}, { -0.0046347647f, 0.0007340746f}, { -0.0007858009f, -0.0024184465f}, { -0.0081810412f, 0.0041684487f}, { -0.0055472976f, -0.0076352001f}, { -0.0128884592f, 0.0128884592f}, { -0.0383147780f, -0.0278373157f}, { 0.0076438761f, -0.0150019516f}, { -0.0984035433f, -0.0319732494f}, { 0.0404629427f, -0.2554729654f}, { 0.3404275809f, 0.0000000000f}, { 0.0446158526f, 0.2816934067f}, { -0.1296120935f, 0.0421135221f}, { -0.0005775139f, -0.0011334349f}, { -0.0387608713f, 0.0281614214f}, { -0.0183830151f, -0.0183830151f}, { -0.0034662576f, 0.0047708942f}, { -0.0098843276f, -0.0050363165f}, { -0.0001437692f, 0.0004424761f}, { -0.0052505618f, -0.0008316073f}, { 0.0000000000f, 0.0003411385f}, { -0.0044792187f, 0.0007094385f}, { -0.0004909940f, -0.0015111241f}, { -0.0020097374f, 0.0010240124f} }, { { -0.0022207691f, -0.0011315384f}, /* Filter 77 */ { -0.0001838111f, 0.0005657123f}, { -0.0043768719f, -0.0006932284f}, { 0.0000000000f, -0.0017039785f}, { -0.0046556572f, 0.0007373837f}, { -0.0007715502f, -0.0023745874f}, { -0.0082301158f, 0.0041934535f}, { -0.0055052393f, -0.0075773118f}, { -0.0130254114f, 0.0130254114f}, { -0.0383545750f, -0.0278662299f}, { 0.0074616682f, -0.0146443485f}, { -0.0991672869f, -0.0322214047f}, { 0.0405738379f, -0.2561731303f}, { 0.3405057686f, 0.0000000000f}, { 0.0445196833f, 0.2810862181f}, { -0.1288190325f, 0.0418558409f}, { -0.0003489325f, -0.0006848186f}, { -0.0387801244f, 0.0281754096f}, { -0.0182467125f, -0.0182467125f}, { -0.0035281741f, 0.0048561151f}, { -0.0098491643f, -0.0050183999f}, { -0.0001614619f, 0.0004969285f}, { -0.0052410650f, -0.0008301031f}, { 0.0000000000f, 0.0003777139f}, { -0.0044807549f, 0.0007096819f}, { -0.0004831286f, -0.0014869168f}, { -0.0020177053f, 0.0010280722f} }, { { -0.0022179116f, -0.0011300824f}, /* Filter 78 */ { -0.0001916007f, 0.0005896863f}, { -0.0043835331f, -0.0006942834f}, { 0.0000000000f, -0.0016710782f}, { -0.0046762880f, 0.0007406513f}, { -0.0007572001f, -0.0023304223f}, { -0.0082789073f, 0.0042183140f}, { -0.0054626681f, -0.0075187177f}, { -0.0131624584f, 0.0131624584f}, { -0.0383929951f, -0.0278941437f}, { 0.0072782560f, -0.0142843817f}, { -0.0999320580f, -0.0324698940f}, { 0.0406843964f, -0.2568711694f}, { 0.3405799320f, 0.0000000000f}, { 0.0444230929f, 0.2804763702f}, { -0.1280264277f, 0.0415983080f}, { -0.0001215183f, -0.0002384932f}, { -0.0387977338f, 0.0281882036f}, { -0.0181102764f, -0.0181102764f}, { -0.0035895900f, 0.0049406467f}, { -0.0098135759f, -0.0050002667f}, { -0.0001790793f, 0.0005511493f}, { -0.0052312458f, -0.0008285479f}, { 0.0000000000f, 0.0004142275f}, { -0.0044820704f, 0.0007098902f}, { -0.0004752586f, -0.0014626955f}, { -0.0020255376f, 0.0010320630f} }, { { -0.0022149197f, -0.0011285579f}, /* Filter 79 */ { -0.0001994007f, 0.0006136924f}, { -0.0043899851f, -0.0006953053f}, { 0.0000000000f, -0.0016380516f}, { -0.0046966573f, 0.0007438774f}, { -0.0007427516f, -0.0022859543f}, { -0.0083274089f, 0.0042430267f}, { -0.0054195838f, -0.0074594171f}, { -0.0132995926f, 0.0132995926f}, { -0.0384300398f, -0.0279210583f}, { 0.0070936379f, -0.0139220482f}, { -0.1006978434f, -0.0327187127f}, { 0.0407946244f, -0.2575671213f}, { 0.3406501456f, 0.0000000000f}, { 0.0443260808f, 0.2798638600f}, { -0.1272343255f, 0.0413409384f}, { 0.0001047341f, 0.0002055523f}, { -0.0388137063f, 0.0281998083f}, { -0.0179737156f, -0.0179737156f}, { -0.0036505044f, 0.0050244882f}, { -0.0097775620f, -0.0049819167f}, { -0.0001966211f, 0.0006051376f}, { -0.0052211059f, -0.0008269419f}, { 0.0000000000f, 0.0004506776f}, { -0.0044831588f, 0.0007100626f}, { -0.0004673804f, -0.0014384488f}, { -0.0020332365f, 0.0010359857f} }, { { -0.0022117956f, -0.0011269662f}, /* Filter 80 */ { -0.0002072092f, 0.0006377245f}, { -0.0043962359f, -0.0006962954f}, { 0.0000000000f, -0.0016048978f}, { -0.0047167638f, 0.0007470620f}, { -0.0007282033f, -0.0022411794f}, { -0.0083756155f, 0.0042675892f}, { -0.0053759855f, -0.0073994093f}, { -0.0134368115f, 0.0134368115f}, { -0.0384656852f, -0.0279469562f}, { 0.0069078131f, -0.0135573465f}, { -0.1014646226f, -0.0329678544f}, { 0.0409045147f, -0.2582609415f}, { 0.3407163139f, 0.0000000000f}, { 0.0442286557f, 0.2792487420f}, { -0.1264427052f, 0.0410837254f}, { 0.0003298196f, 0.0006473074f}, { -0.0388280428f, 0.0282102244f}, { -0.0178370350f, -0.0178370350f}, { -0.0037109171f, 0.0051076392f}, { -0.0097411254f, -0.0049633513f}, { -0.0002140858f, 0.0006588884f}, { -0.0052106492f, -0.0008252858f}, { 0.0000000000f, 0.0004870592f}, { -0.0044840278f, 0.0007102002f}, { -0.0004594994f, -0.0014141938f}, { -0.0020408022f, 0.0010398406f} }, { { -0.0022085377f, -0.0011253062f}, /* Filter 81 */ { -0.0002150272f, 0.0006617856f}, { -0.0044022844f, -0.0006972533f}, { 0.0000000000f, -0.0015716164f}, { -0.0047366037f, 0.0007502043f}, { -0.0007135575f, -0.0021961043f}, { -0.0084235294f, 0.0042920026f}, { -0.0053318786f, -0.0073387013f}, { -0.0135741072f, 0.0135741072f}, { -0.0384999357f, -0.0279718407f}, { 0.0067207811f, -0.0131902755f}, { -0.1022323897f, -0.0332173170f}, { 0.0410140671f, -0.2589526285f}, { 0.3407785039f, 0.0000000000f}, { 0.0441308133f, 0.2786309892f}, { -0.1256516079f, 0.0408266823f}, { 0.0005537359f, 0.0010867680f}, { -0.0388407526f, 0.0282194586f}, { -0.0177002397f, -0.0177002397f}, { -0.0037708270f, 0.0051900982f}, { -0.0097042763f, -0.0049445757f}, { -0.0002314730f, 0.0007124005f}, { -0.0051998731f, -0.0008235790f}, { 0.0000000000f, 0.0005233689f}, { -0.0044846698f, 0.0007103019f}, { -0.0004516136f, -0.0013899237f}, { -0.0020482334f, 0.0010436270f} }, { { -0.0022051449f, -0.0011235774f}, /* Filter 82 */ { -0.0002228535f, 0.0006858725f}, { -0.0044081214f, -0.0006981778f}, { 0.0000000000f, -0.0015382175f}, { -0.0047561744f, 0.0007533040f}, { -0.0006988141f, -0.0021507287f}, { -0.0084711411f, 0.0043162620f}, { -0.0052872555f, -0.0072772828f}, { -0.0137114739f, 0.0137114739f}, { -0.0385327768f, -0.0279957011f}, { 0.0065325459f, -0.0128208432f}, { -0.1030011138f, -0.0334670906f}, { 0.0411232740f, -0.2596421332f}, { 0.3408366709f, 0.0000000000f}, { 0.0440325565f, 0.2780106203f}, { -0.1248610407f, 0.0405698114f}, { 0.0007764820f, 0.0015239316f}, { -0.0388518426f, 0.0282275159f}, { -0.0175633376f, -0.0175633376f}, { -0.0038302342f, 0.0052718651f}, { -0.0096670126f, -0.0049255890f}, { -0.0002487817f, 0.0007656713f}, { -0.0051887820f, -0.0008218223f}, { 0.0000000000f, 0.0005596113f}, { -0.0044850891f, 0.0007103683f}, { -0.0004437229f, -0.0013656386f}, { -0.0020555298f, 0.0010473447f} }, { { -0.0022016193f, -0.0011217811f}, /* Filter 83 */ { -0.0002306877f, 0.0007099836f}, { -0.0044137537f, -0.0006990699f}, { 0.0000000000f, -0.0015046928f}, { -0.0047754808f, 0.0007563619f}, { -0.0006839732f, -0.0021050531f}, { -0.0085184500f, 0.0043403671f}, { -0.0052421235f, -0.0072151640f}, { -0.0138489067f, 0.0138489067f}, { -0.0385642057f, -0.0280185355f}, { 0.0063431077f, -0.0124490497f}, { -0.1037708134f, -0.0337171812f}, { 0.0412321395f, -0.2603294831f}, { 0.3408908349f, 0.0000000000f}, { 0.0439338918f, 0.2773876760f}, { -0.1240710155f, 0.0403131167f}, { 0.0009980569f, 0.0019587970f}, { -0.0388613197f, 0.0282344015f}, { -0.0174263349f, -0.0174263349f}, { -0.0038891349f, 0.0053529350f}, { -0.0096293377f, -0.0049063926f}, { -0.0002660115f, 0.0008186992f}, { -0.0051773757f, -0.0008200157f}, { 0.0000000000f, 0.0005957808f}, { -0.0044852873f, 0.0007103997f}, { -0.0004358302f, -0.0013413474f}, { -0.0020626926f, 0.0010509944f} }, { { -0.0021979595f, -0.0011199163f}, /* Filter 84 */ { -0.0002385288f, 0.0007341161f}, { -0.0044191758f, -0.0006999287f}, { 0.0000000000f, -0.0014710468f}, { -0.0047945159f, 0.0007593767f}, { -0.0006690369f, -0.0020590840f}, { -0.0085654504f, 0.0043643149f}, { -0.0051964730f, -0.0071523315f}, { -0.0139864014f, 0.0139864014f}, { -0.0385942197f, -0.0280403419f}, { 0.0061524667f, -0.0120748958f}, { -0.1045414336f, -0.0339675709f}, { 0.0413406572f, -0.2610146369f}, { 0.3409410012f, 0.0000000000f}, { 0.0438348202f, 0.2767621627f}, { -0.1232815667f, 0.0400566092f}, { 0.0012184551f, 0.0023913529f}, { -0.0388691881f, 0.0282401182f}, { -0.0172892379f, -0.0172892379f}, { -0.0039475340f, 0.0054333145f}, { -0.0095912629f, -0.0048869925f}, { -0.0002831613f, 0.0008714809f}, { -0.0051656581f, -0.0008181599f}, { 0.0000000000f, 0.0006318766f}, { -0.0044852615f, 0.0007103956f}, { -0.0004279330f, -0.0013170424f}, { -0.0020697195f, 0.0010545747f} }, { { -0.0021941651f, -0.0011179829f}, /* Filter 85 */ { -0.0002463783f, 0.0007582745f}, { -0.0044243893f, -0.0007007544f}, { 0.0000000000f, -0.0014372807f}, { -0.0048132753f, 0.0007623479f}, { -0.0006540040f, -0.0020128174f}, { -0.0086121372f, 0.0043881031f}, { -0.0051503158f, -0.0070888016f}, { -0.0141239484f, 0.0141239484f}, { -0.0386228004f, -0.0280611071f}, { 0.0059606207f, -0.0116983767f}, { -0.1053130012f, -0.0342182684f}, { 0.0414488287f, -0.2616976047f}, { 0.3409871689f, 0.0000000000f}, { 0.0437353400f, 0.2761340693f}, { -0.1224926731f, 0.0398002822f}, { 0.0014376844f, 0.0028216146f}, { -0.0388754585f, 0.0282446739f}, { -0.0171520528f, -0.0171520528f}, { -0.0040054273f, 0.0055129977f}, { -0.0095527829f, -0.0048673860f}, { -0.0003002310f, 0.0009240159f}, { -0.0051536287f, -0.0008162546f}, { 0.0000000000f, 0.0006678940f}, { -0.0044850110f, 0.0007103560f}, { -0.0004200319f, -0.0012927253f}, { -0.0020766136f, 0.0010580875f} }, { { -0.0021902362f, -0.0011159811f}, /* Filter 86 */ { -0.0002542329f, 0.0007824483f}, { -0.0044293918f, -0.0007015467f}, { 0.0000000000f, -0.0014034000f}, { -0.0048317621f, 0.0007652759f}, { -0.0006388765f, -0.0019662596f}, { -0.0086585095f, 0.0044117309f}, { -0.0051036418f, -0.0070245603f}, { -0.0142615460f, 0.0142615460f}, { -0.0386499515f, -0.0280808335f}, { 0.0057675762f, -0.0113195056f}, { -0.1060854619f, -0.0344692561f}, { 0.0415566435f, -0.2623783208f}, { 0.3410293205f, 0.0000000000f}, { 0.0436354594f, 0.2755034477f}, { -0.1217043906f, 0.0395441536f}, { 0.0016557316f, 0.0032495562f}, { -0.0388801344f, 0.0282480711f}, { -0.0170147852f, -0.0170147851f}, { -0.0040628131f, 0.0055919826f}, { -0.0095139053f, -0.0048475769f}, { -0.0003172191f, 0.0009763001f}, { -0.0051412871f, -0.0008142999f}, { 0.0000000000f, 0.0007038334f}, { -0.0044845442f, 0.0007102820f}, { -0.0004121306f, -0.0012684074f}, { -0.0020833727f, 0.0010615314f} }, { { -0.0021861730f, -0.0011139108f}, /* Filter 87 */ { -0.0002620953f, 0.0008066464f}, { -0.0044341837f, -0.0007023057f}, { 0.0000000000f, -0.0013694064f}, { -0.0048499731f, 0.0007681603f}, { -0.0006236529f, -0.0019194063f}, { -0.0087045644f, 0.0044351971f}, { -0.0050564574f, -0.0069596165f}, { -0.0143991860f, 0.0143991860f}, { -0.0386756494f, -0.0280995041f}, { 0.0055733286f, -0.0109382733f}, { -0.1068588215f, -0.0347205358f}, { 0.0416641070f, -0.2630568185f}, { 0.3410674260f, 0.0000000000f}, { 0.0435351743f, 0.2748702724f}, { -0.1209166937f, 0.0392882154f}, { 0.0018726021f, 0.0036751886f}, { -0.0388832225f, 0.0282503148f}, { -0.0168774407f, -0.0168774407f}, { -0.0041196955f, 0.0056702745f}, { -0.0094746364f, -0.0048275684f}, { -0.0003341249f, 0.0010283306f}, { -0.0051286356f, -0.0008122961f}, { 0.0000000000f, 0.0007396959f}, { -0.0044838549f, 0.0007101728f}, { -0.0004042266f, -0.0012440816f}, { -0.0020899954f, 0.0010649059f} }, { { -0.0021819745f, -0.0011117715f}, /* Filter 88 */ { -0.0002699630f, 0.0008308606f}, { -0.0044387682f, -0.0007030318f}, { 0.0000000000f, -0.0013352954f}, { -0.0048679066f, 0.0007710007f}, { -0.0006083359f, -0.0018722654f}, { -0.0087502942f, 0.0044584976f}, { -0.0050087598f, -0.0068939665f}, { -0.0145368636f, 0.0145368636f}, { -0.0386999026f, -0.0281171251f}, { 0.0053778807f, -0.0105546851f}, { -0.1076330846f, -0.0349721092f}, { 0.0417712137f, -0.2637330636f}, { 0.3411015594f, 0.0000000000f}, { 0.0434344921f, 0.2742345901f}, { -0.1201296241f, 0.0390324810f}, { 0.0020882956f, 0.0040985108f}, { -0.0388847392f, 0.0282514167f}, { -0.0167400259f, -0.0167400258f}, { -0.0041760679f, 0.0057478644f}, { -0.0094349725f, -0.0048073586f}, { -0.0003509489f, 0.0010801096f}, { -0.0051156820f, -0.0008102444f}, { 0.0000000000f, 0.0007754711f}, { -0.0044829413f, 0.0007100281f}, { -0.0003963211f, -0.0012197508f}, { -0.0020964853f, 0.0010682126f} }, { { -0.0021776429f, -0.0011095645f}, /* Filter 89 */ { -0.0002778370f, 0.0008550943f}, { -0.0044431403f, -0.0007037243f}, { 0.0000000000f, -0.0013010732f}, { -0.0048855597f, 0.0007737966f}, { -0.0005929253f, -0.0018248365f}, { -0.0087956998f, 0.0044816329f}, { -0.0049605510f, -0.0068276127f}, { -0.0146745726f, 0.0146745726f}, { -0.0387226943f, -0.0281336842f}, { 0.0051812346f, -0.0101687455f}, { -0.1084082070f, -0.0352239617f}, { 0.0418779607f, -0.2644070374f}, { 0.3411316675f, 0.0000000000f}, { 0.0433334131f, 0.2735964027f}, { -0.1193431900f, 0.0387769531f}, { 0.0023028049f, 0.0045195090f}, { -0.0388846787f, 0.0282513728f}, { -0.0166025495f, -0.0166025495f}, { -0.0042319331f, 0.0058247562f}, { -0.0093949236f, -0.0047869527f}, { -0.0003676890f, 0.0011316304f}, { -0.0051024190f, -0.0008081438f}, { 0.0000000000f, 0.0008111646f}, { -0.0044818123f, 0.0007098493f}, { -0.0003884134f, -0.0011954135f}, { -0.0021028389f, 0.0010714499f} }, { { -0.0021731767f, -0.0011072888f}, /* Filter 90 */ { -0.0002857146f, 0.0008793391f}, { -0.0044472978f, -0.0007043828f}, { 0.0000000000f, -0.0012667403f}, { -0.0049029332f, 0.0007765483f}, { -0.0005774216f, -0.0017771208f}, { -0.0088407725f, 0.0045045986f}, { -0.0049118282f, -0.0067605516f}, { -0.0148123088f, 0.0148123088f}, { -0.0387440238f, -0.0281491810f}, { 0.0049833907f, -0.0097804550f}, { -0.1091841828f, -0.0354760915f}, { 0.0419843498f, -0.2650787521f}, { 0.3411577599f, 0.0000000000f}, { 0.0432319421f, 0.2729557400f}, { -0.1185574135f, 0.0385216388f}, { 0.0025161342f, 0.0049381914f}, { -0.0388830537f, 0.0282501922f}, { -0.0164650142f, -0.0164650142f}, { -0.0042872929f, 0.0059009524f}, { -0.0093544891f, -0.0047663503f}, { -0.0003843450f, 0.0011828923f}, { -0.0050888546f, -0.0008059954f}, { 0.0000000000f, 0.0008467735f}, { -0.0044804608f, 0.0007096353f}, { -0.0003805073f, -0.0011710809f}, { -0.0021090603f, 0.0010746199f} }, { { -0.0021685765f, -0.0011049449f}, /* Filter 91 */ { -0.0002935986f, 0.0009036035f}, { -0.0044512471f, -0.0007050083f}, { 0.0000000000f, -0.0012322999f}, { -0.0049200227f, 0.0007792550f}, { -0.0005618260f, -0.0017291225f}, { -0.0088855104f, 0.0045273937f}, { -0.0048625945f, -0.0066927872f}, { -0.0149500663f, 0.0149500663f}, { -0.0387638855f, -0.0281636114f}, { 0.0047843480f, -0.0093898117f}, { -0.1099610010f, -0.0357284951f}, { 0.0420903738f, -0.2657481612f}, { 0.3411798695f, 0.0000000000f}, { 0.0431300782f, 0.2723125962f}, { -0.1177723028f, 0.0382665409f}, { 0.0027282797f, 0.0053545504f}, { -0.0388798706f, 0.0282478795f}, { -0.0163274298f, -0.0163274298f}, { -0.0043421423f, 0.0059764462f}, { -0.0093136782f, -0.0047455561f}, { -0.0004009170f, 0.0012338955f}, { -0.0050749873f, -0.0008037990f}, { 0.0000000000f, 0.0008822936f}, { -0.0044788886f, 0.0007093863f}, { -0.0003725981f, -0.0011467390f}, { -0.0021151462f, 0.0010777208f} }, { { -0.0021638398f, -0.0011025314f}, /* Filter 92 */ { -0.0003014859f, 0.0009278782f}, { -0.0044549783f, -0.0007055992f}, { 0.0000000000f, -0.0011977518f}, { -0.0049368271f, 0.0007819166f}, { -0.0005461373f, -0.0016808379f}, { -0.0089299112f, 0.0045500170f}, { -0.0048128491f, -0.0066243185f}, { -0.0150878344f, 0.0150878344f}, { -0.0387822560f, -0.0281769583f}, { 0.0045841073f, -0.0089968171f}, { -0.1107386540f, -0.0359811698f}, { 0.0421960299f, -0.2664152474f}, { 0.3411979167f, 0.0000000000f}, { 0.0430278192f, 0.2716669587f}, { -0.1169878611f, 0.0380116603f}, { 0.0029392400f, 0.0057685833f}, { -0.0388751356f, 0.0282444393f}, { -0.0161897978f, -0.0161897978f}, { -0.0043964844f, 0.0060512416f}, { -0.0092724890f, -0.0047245691f}, { -0.0004174029f, 0.0012846341f}, { -0.0050608171f, -0.0008015547f}, { 0.0000000000f, 0.0009177243f}, { -0.0044771017f, 0.0007091032f}, { -0.0003646917f, -0.0011224055f}, { -0.0021210958f, 0.0010807523f} }, { { -0.0021589676f, -0.0011000489f}, /* Filter 93 */ { -0.0003093775f, 0.0009521661f}, { -0.0044584978f, -0.0007061567f}, { 0.0000000000f, -0.0011630979f}, { -0.0049533429f, 0.0007845324f}, { -0.0005303585f, -0.0016322755f}, { -0.0089739699f, 0.0045724660f}, { -0.0047625912f, -0.0065551444f}, { -0.0152256120f, 0.0152256120f}, { -0.0387991482f, -0.0281892312f}, { 0.0043826721f, -0.0086014783f}, { -0.1115171103f, -0.0362341056f}, { 0.0423013184f, -0.2670800130f}, { 0.3412119690f, 0.0000000000f}, { 0.0429251774f, 0.2710189037f}, { -0.1162041184f, 0.0377570069f}, { 0.0031490135f, 0.0061802870f}, { -0.0388688526f, 0.0282398744f}, { -0.0160521270f, -0.0160521270f}, { -0.0044503172f, 0.0061253362f}, { -0.0092309301f, -0.0047033938f}, { -0.0004338029f, 0.0013351080f}, { -0.0050463500f, -0.0007992633f}, { 0.0000000000f, 0.0009530667f}, { -0.0044750950f, 0.0007087854f}, { -0.0003567845f, -0.0010980696f}, { -0.0021269106f, 0.0010837151f} }, { { -0.0021539626f, -0.0010974987f}, /* Filter 94 */ { -0.0003172722f, 0.0009764635f}, { -0.0044618075f, -0.0007066809f}, { 0.0000000000f, -0.0011283415f}, { -0.0049695747f, 0.0007871033f}, { -0.0005144884f, -0.0015834325f}, { -0.0090176834f, 0.0045947392f}, { -0.0047118230f, -0.0064852680f}, { -0.0153633929f, 0.0153633929f}, { -0.0388145423f, -0.0282004157f}, { 0.0041800420f, -0.0082037943f}, { -0.1122963701f, -0.0364873025f}, { 0.0424062358f, -0.2677424355f}, { 0.3412220061f, 0.0000000000f}, { 0.0428221507f, 0.2703684189f}, { -0.1154210879f, 0.0375025848f}, { 0.0033575994f, 0.0065896599f}, { -0.0388610405f, 0.0282341986f}, { -0.0159144236f, -0.0159144236f}, { -0.0045036391f, 0.0061987274f}, { -0.0091890036f, -0.0046820312f}, { -0.0004501161f, 0.0013853149f}, { -0.0050315825f, -0.0007969244f}, { 0.0000000000f, 0.0009883163f}, { -0.0044728687f, 0.0007084328f}, { -0.0003488777f, -0.0010737353f}, { -0.0021325913f, 0.0010866095f} }, { { -0.0021488207f, -0.0010948788f}, /* Filter 95 */ { -0.0003251694f, 0.0010007685f}, { -0.0044648953f, -0.0007071699f}, { 0.0000000000f, -0.0010934830f}, { -0.0049855152f, 0.0007896280f}, { -0.0004985286f, -0.0015343131f}, { -0.0090610460f, 0.0046168336f}, { -0.0046605431f, -0.0064146873f}, { -0.0155011700f, 0.0155011700f}, { -0.0388284352f, -0.0282105095f}, { 0.0039762170f, -0.0078037652f}, { -0.1130764159f, -0.0367407547f}, { 0.0425107787f, -0.2684024935f}, { 0.3412280286f, 0.0000000000f}, { 0.0427187389f, 0.2697155022f}, { -0.1146387803f, 0.0372483977f}, { 0.0035649970f, 0.0069967006f}, { -0.0388516915f, 0.0282274062f}, { -0.0157766902f, -0.0157766902f}, { -0.0045564491f, 0.0062714142f}, { -0.0091467091f, -0.0046604811f}, { -0.0004663419f, 0.0014352527f}, { -0.0050165206f, -0.0007945388f}, { 0.0000000000f, 0.0010234687f}, { -0.0044704284f, 0.0007080463f}, { -0.0003409731f, -0.0010494074f}, { -0.0021381359f, 0.0010894346f} }, { { -0.0021435458f, -0.0010921912f}, /* Filter 96 */ { -0.0003330708f, 0.0010250866f}, { -0.0044677702f, -0.0007076253f}, { 0.0000000000f, -0.0010585255f}, { -0.0050011665f, 0.0007921070f}, { -0.0004824799f, -0.0014849205f}, { -0.0091040561f, 0.0046387483f}, { -0.0046087521f, -0.0063434030f}, { -0.0156389384f, 0.0156389383f}, { -0.0388408234f, -0.0282195101f}, { 0.0037712026f, -0.0074014019f}, { -0.1138572223f, -0.0369944541f}, { 0.0426149488f, -0.2690601973f}, { 0.3412300532f, 0.0000000000f}, { 0.0426149488f, 0.2690601973f}, { -0.1138572223f, 0.0369944541f}, { 0.0037712026f, 0.0074014019f}, { -0.0388408234f, 0.0282195101f}, { -0.0156389384f, -0.0156389384f}, { -0.0046087521f, 0.0063434030f}, { -0.0091040561f, -0.0046387483f}, { -0.0004824799f, 0.0014849205f}, { -0.0050011665f, -0.0007921070f}, { 0.0000000000f, 0.0010585255f}, { -0.0044677702f, 0.0007076253f}, { -0.0003330708f, -0.0010250866f}, { -0.0021435458f, 0.0010921912f} }, { { -0.0021381359f, -0.0010894346f}, /* Filter 97 */ { -0.0003409731f, 0.0010494074f}, { -0.0044704284f, -0.0007080463f}, { 0.0000000000f, -0.0010234687f}, { -0.0050165206f, 0.0007945388f}, { -0.0004663419f, -0.0014352527f}, { -0.0091467091f, 0.0046604811f}, { -0.0045564491f, -0.0062714142f}, { -0.0157766902f, 0.0157766902f}, { -0.0388516915f, -0.0282274062f}, { 0.0035649970f, -0.0069967006f}, { -0.1146387803f, -0.0372483977f}, { 0.0427187389f, -0.2697155022f}, { 0.3412280286f, 0.0000000000f}, { 0.0425107787f, 0.2684024935f}, { -0.1130764159f, 0.0367407547f}, { 0.0039762170f, 0.0078037652f}, { -0.0388284352f, 0.0282105095f}, { -0.0155011700f, -0.0155011700f}, { -0.0046605431f, 0.0064146873f}, { -0.0090610460f, -0.0046168336f}, { -0.0004985286f, 0.0015343131f}, { -0.0049855152f, -0.0007896280f}, { 0.0000000000f, 0.0010934830f}, { -0.0044648953f, 0.0007071699f}, { -0.0003251694f, -0.0010007685f}, { -0.0021488207f, 0.0010948788f} }, { { -0.0021325913f, -0.0010866095f}, /* Filter 98 */ { -0.0003488777f, 0.0010737353f}, { -0.0044728687f, -0.0007084328f}, { 0.0000000000f, -0.0009883163f}, { -0.0050315825f, 0.0007969244f}, { -0.0004501161f, -0.0013853149f}, { -0.0091890036f, 0.0046820312f}, { -0.0045036391f, -0.0061987274f}, { -0.0159144236f, 0.0159144236f}, { -0.0388610405f, -0.0282341986f}, { 0.0033575994f, -0.0065896598f}, { -0.1154210879f, -0.0375025848f}, { 0.0428221507f, -0.2703684189f}, { 0.3412220061f, 0.0000000000f}, { 0.0424062358f, 0.2677424355f}, { -0.1122963701f, 0.0364873025f}, { 0.0041800420f, 0.0082037943f}, { -0.0388145423f, 0.0282004157f}, { -0.0153633929f, -0.0153633929f}, { -0.0047118230f, 0.0064852680f}, { -0.0090176834f, -0.0045947392f}, { -0.0005144884f, 0.0015834325f}, { -0.0049695747f, -0.0007871033f}, { 0.0000000000f, 0.0011283415f}, { -0.0044618075f, 0.0007066809f}, { -0.0003172722f, -0.0009764635f}, { -0.0021539626f, 0.0010974987f} }, { { -0.0021269106f, -0.0010837151f}, /* Filter 99 */ { -0.0003567845f, 0.0010980696f}, { -0.0044750951f, -0.0007087854f}, { 0.0000000000f, -0.0009530667f}, { -0.0050463500f, 0.0007992633f}, { -0.0004338029f, -0.0013351080f}, { -0.0092309301f, 0.0047033938f}, { -0.0044503172f, -0.0061253362f}, { -0.0160521270f, 0.0160521270f}, { -0.0388688526f, -0.0282398744f}, { 0.0031490135f, -0.0061802870f}, { -0.1162041184f, -0.0377570069f}, { 0.0429251774f, -0.2710189037f}, { 0.3412119690f, 0.0000000000f}, { 0.0423013183f, 0.2670800127f}, { -0.1115171103f, 0.0362341056f}, { 0.0043826721f, 0.0086014783f}, { -0.0387991482f, 0.0281892312f}, { -0.0152256120f, -0.0152256120f}, { -0.0047625912f, 0.0065551444f}, { -0.0089739698f, -0.0045724660f}, { -0.0005303585f, 0.0016322755f}, { -0.0049533429f, -0.0007845324f}, { 0.0000000000f, 0.0011630979f}, { -0.0044584978f, 0.0007061567f}, { -0.0003093775f, -0.0009521661f}, { -0.0021589676f, 0.0011000489f} }, { { -0.0021210958f, -0.0010807523f}, /* Filter 100 */ { -0.0003646917f, 0.0011224055f}, { -0.0044771017f, -0.0007091032f}, { 0.0000000000f, -0.0009177243f}, { -0.0050608171f, 0.0008015547f}, { -0.0004174029f, -0.0012846341f}, { -0.0092724890f, 0.0047245691f}, { -0.0043964844f, -0.0060512416f}, { -0.0161897978f, 0.0161897978f}, { -0.0388751356f, -0.0282444393f}, { 0.0029392400f, -0.0057685833f}, { -0.1169878611f, -0.0380116603f}, { 0.0430278192f, -0.2716669587f}, { 0.3411979167f, 0.0000000000f}, { 0.0421960299f, 0.2664152474f}, { -0.1107386540f, 0.0359811698f}, { 0.0045841073f, 0.0089968171f}, { -0.0387822560f, 0.0281769583f}, { -0.0150878344f, -0.0150878344f}, { -0.0048128491f, 0.0066243185f}, { -0.0089299112f, -0.0045500170f}, { -0.0005461373f, 0.0016808379f}, { -0.0049368271f, -0.0007819166f}, { 0.0000000000f, 0.0011977518f}, { -0.0044549783f, 0.0007055992f}, { -0.0003014859f, -0.0009278782f}, { -0.0021638398f, 0.0011025314f} }, { { -0.0021151462f, -0.0010777208f}, /* Filter 101 */ { -0.0003725981f, 0.0011467390f}, { -0.0044788886f, -0.0007093863f}, { 0.0000000000f, -0.0008822936f}, { -0.0050749873f, 0.0008037990f}, { -0.0004009170f, -0.0012338955f}, { -0.0093136782f, 0.0047455561f}, { -0.0043421423f, -0.0059764462f}, { -0.0163274298f, 0.0163274298f}, { -0.0388798706f, -0.0282478795f}, { 0.0027282797f, -0.0053545504f}, { -0.1177723029f, -0.0382665409f}, { 0.0431300782f, -0.2723125962f}, { 0.3411798695f, 0.0000000000f}, { 0.0420903738f, 0.2657481612f}, { -0.1099610010f, 0.0357284950f}, { 0.0047843480f, 0.0093898117f}, { -0.0387638855f, 0.0281636114f}, { -0.0149500663f, -0.0149500663f}, { -0.0048625945f, 0.0066927872f}, { -0.0088855104f, -0.0045273937f}, { -0.0005618260f, 0.0017291225f}, { -0.0049200227f, -0.0007792550f}, { 0.0000000000f, 0.0012322999f}, { -0.0044512471f, 0.0007050083f}, { -0.0002935986f, -0.0009036035f}, { -0.0021685765f, 0.0011049449f} }, { { -0.0021090603f, -0.0010746199f}, /* Filter 102 */ { -0.0003805073f, 0.0011710809f}, { -0.0044804608f, -0.0007096353f}, { 0.0000000000f, -0.0008467735f}, { -0.0050888546f, 0.0008059954f}, { -0.0003843450f, -0.0011828923f}, { -0.0093544891f, 0.0047663503f}, { -0.0042872929f, -0.0059009524f}, { -0.0164650142f, 0.0164650142f}, { -0.0388830537f, -0.0282501922f}, { 0.0025161341f, -0.0049381913f}, { -0.1185574135f, -0.0385216388f}, { 0.0432319421f, -0.2729557400f}, { 0.3411577599f, 0.0000000000f}, { 0.0419843498f, 0.2650787521f}, { -0.1091841828f, 0.0354760915f}, { 0.0049833908f, 0.0097804550f}, { -0.0387440238f, 0.0281491810f}, { -0.0148123088f, -0.0148123088f}, { -0.0049118282f, 0.0067605516f}, { -0.0088407725f, -0.0045045986f}, { -0.0005774216f, 0.0017771208f}, { -0.0049029332f, -0.0007765483f}, { 0.0000000000f, 0.0012667403f}, { -0.0044472978f, 0.0007043828f}, { -0.0002857146f, -0.0008793391f}, { -0.0021731767f, 0.0011072888f} }, { { -0.0021028389f, -0.0010714499f}, /* Filter 103 */ { -0.0003884134f, 0.0011954135f}, { -0.0044818123f, -0.0007098493f}, { 0.0000000000f, -0.0008111646f}, { -0.0051024190f, 0.0008081438f}, { -0.0003676890f, -0.0011316304f}, { -0.0093949236f, 0.0047869527f}, { -0.0042319331f, -0.0058247562f}, { -0.0166025495f, 0.0166025495f}, { -0.0388846787f, -0.0282513728f}, { 0.0023028049f, -0.0045195090f}, { -0.1193431900f, -0.0387769531f}, { 0.0433334131f, -0.2735964027f}, { 0.3411316675f, 0.0000000000f}, { 0.0418779606f, 0.2644070374f}, { -0.1084082070f, 0.0352239617f}, { 0.0051812347f, 0.0101687456f}, { -0.0387226943f, 0.0281336842f}, { -0.0146745726f, -0.0146745726f}, { -0.0049605510f, 0.0068276127f}, { -0.0087956998f, -0.0044816329f}, { -0.0005929253f, 0.0018248365f}, { -0.0048855597f, -0.0007737966f}, { 0.0000000000f, 0.0013010732f}, { -0.0044431403f, 0.0007037243f}, { -0.0002778370f, -0.0008550943f}, { -0.0021776429f, 0.0011095645f} }, { { -0.0020964853f, -0.0010682126f}, /* Filter 104 */ { -0.0003963211f, 0.0012197508f}, { -0.0044829413f, -0.0007100281f}, { 0.0000000000f, -0.0007754711f}, { -0.0051156820f, 0.0008102444f}, { -0.0003509489f, -0.0010801096f}, { -0.0094349725f, 0.0048073586f}, { -0.0041760679f, -0.0057478644f}, { -0.0167400259f, 0.0167400258f}, { -0.0388847392f, -0.0282514167f}, { 0.0020882956f, -0.0040985108f}, { -0.1201296241f, -0.0390324810f}, { 0.0434344921f, -0.2742345901f}, { 0.3411015594f, 0.0000000000f}, { 0.0417712137f, 0.2637330636f}, { -0.1076330846f, 0.0349721092f}, { 0.0053778807f, 0.0105546851f}, { -0.0386999026f, 0.0281171251f}, { -0.0145368636f, -0.0145368636f}, { -0.0050087598f, 0.0068939665f}, { -0.0087502942f, -0.0044584976f}, { -0.0006083359f, 0.0018722654f}, { -0.0048679066f, -0.0007710007f}, { 0.0000000000f, 0.0013352954f}, { -0.0044387682f, 0.0007030318f}, { -0.0002699630f, -0.0008308606f}, { -0.0021819745f, 0.0011117715f} }, { { -0.0020899954f, -0.0010649059f}, /* Filter 105 */ { -0.0004042266f, 0.0012440816f}, { -0.0044838549f, -0.0007101728f}, { 0.0000000000f, -0.0007396959f}, { -0.0051286356f, 0.0008122961f}, { -0.0003341249f, -0.0010283306f}, { -0.0094746364f, 0.0048275684f}, { -0.0041196955f, -0.0056702745f}, { -0.0168774407f, 0.0168774407f}, { -0.0388832225f, -0.0282503148f}, { 0.0018726021f, -0.0036751886f}, { -0.1209166937f, -0.0392882154f}, { 0.0435351743f, -0.2748702724f}, { 0.3410674260f, 0.0000000000f}, { 0.0416641070f, 0.2630568185f}, { -0.1068588215f, 0.0347205358f}, { 0.0055733286f, 0.0109382733f}, { -0.0386756494f, 0.0280995041f}, { -0.0143991860f, -0.0143991860f}, { -0.0050564574f, 0.0069596165f}, { -0.0087045644f, -0.0044351971f}, { -0.0006236529f, 0.0019194063f}, { -0.0048499731f, -0.0007681603f}, { 0.0000000000f, 0.0013694064f}, { -0.0044341837f, 0.0007023057f}, { -0.0002620953f, -0.0008066464f}, { -0.0021861730f, 0.0011139108f} }, { { -0.0020833727f, -0.0010615314f}, /* Filter 106 */ { -0.0004121306f, 0.0012684074f}, { -0.0044845442f, -0.0007102820f}, { 0.0000000000f, -0.0007038334f}, { -0.0051412871f, 0.0008142999f}, { -0.0003172191f, -0.0009763001f}, { -0.0095139053f, 0.0048475769f}, { -0.0040628131f, -0.0055919826f}, { -0.0170147852f, 0.0170147851f}, { -0.0388801344f, -0.0282480711f}, { 0.0016557316f, -0.0032495562f}, { -0.1217043907f, -0.0395441537f}, { 0.0436354594f, -0.2755034477f}, { 0.3410293205f, 0.0000000000f}, { 0.0415566435f, 0.2623783208f}, { -0.1060854619f, 0.0344692561f}, { 0.0057675762f, 0.0113195056f}, { -0.0386499515f, 0.0280808335f}, { -0.0142615460f, -0.0142615460f}, { -0.0051036418f, 0.0070245603f}, { -0.0086585095f, -0.0044117309f}, { -0.0006388765f, 0.0019662596f}, { -0.0048317621f, -0.0007652759f}, { 0.0000000000f, 0.0014034000f}, { -0.0044293918f, 0.0007015467f}, { -0.0002542329f, -0.0007824483f}, { -0.0021902362f, 0.0011159811f} }, { { -0.0020766136f, -0.0010580875f}, /* Filter 107 */ { -0.0004200319f, 0.0012927253f}, { -0.0044850110f, -0.0007103560f}, { 0.0000000000f, -0.0006678940f}, { -0.0051536287f, 0.0008162546f}, { -0.0003002310f, -0.0009240159f}, { -0.0095527829f, 0.0048673860f}, { -0.0040054273f, -0.0055129977f}, { -0.0171520528f, 0.0171520528f}, { -0.0388754585f, -0.0282446739f}, { 0.0014376844f, -0.0028216146f}, { -0.1224926731f, -0.0398002822f}, { 0.0437353400f, -0.2761340693f}, { 0.3409871689f, 0.0000000000f}, { 0.0414488287f, 0.2616976047f}, { -0.1053130012f, 0.0342182684f}, { 0.0059606207f, 0.0116983767f}, { -0.0386228004f, 0.0280611071f}, { -0.0141239484f, -0.0141239484f}, { -0.0051503158f, 0.0070888016f}, { -0.0086121372f, -0.0043881031f}, { -0.0006540040f, 0.0020128174f}, { -0.0048132753f, -0.0007623479f}, { 0.0000000000f, 0.0014372807f}, { -0.0044243893f, 0.0007007544f}, { -0.0002463783f, -0.0007582745f}, { -0.0021941651f, 0.0011179829f} }, { { -0.0020697195f, -0.0010545747f}, /* Filter 108 */ { -0.0004279330f, 0.0013170424f}, { -0.0044852615f, -0.0007103956f}, { 0.0000000000f, -0.0006318766f}, { -0.0051656581f, 0.0008181599f}, { -0.0002831613f, -0.0008714809f}, { -0.0095912629f, 0.0048869925f}, { -0.0039475340f, -0.0054333145f}, { -0.0172892379f, 0.0172892379f}, { -0.0388691881f, -0.0282401182f}, { 0.0012184551f, -0.0023913529f}, { -0.1232815668f, -0.0400566092f}, { 0.0438348202f, -0.2767621627f}, { 0.3409410012f, 0.0000000000f}, { 0.0413406572f, 0.2610146369f}, { -0.1045414336f, 0.0339675709f}, { 0.0061524667f, 0.0120748958f}, { -0.0385942197f, 0.0280403419f}, { -0.0139864014f, -0.0139864014f}, { -0.0051964730f, 0.0071523315f}, { -0.0085654504f, -0.0043643149f}, { -0.0006690369f, 0.0020590840f}, { -0.0047945159f, -0.0007593767f}, { 0.0000000000f, 0.0014710468f}, { -0.0044191758f, 0.0006999287f}, { -0.0002385288f, -0.0007341161f}, { -0.0021979595f, 0.0011199163f} }, { { -0.0020626926f, -0.0010509944f}, /* Filter 109 */ { -0.0004358302f, 0.0013413474f}, { -0.0044852873f, -0.0007103997f}, { 0.0000000000f, -0.0005957808f}, { -0.0051773757f, 0.0008200157f}, { -0.0002660115f, -0.0008186991f}, { -0.0096293377f, 0.0049063926f}, { -0.0038891349f, -0.0053529350f}, { -0.0174263349f, 0.0174263349f}, { -0.0388613197f, -0.0282344015f}, { 0.0009980569f, -0.0019587970f}, { -0.1240710155f, -0.0403131167f}, { 0.0439338918f, -0.2773876760f}, { 0.3408908349f, 0.0000000000f}, { 0.0412321395f, 0.2603294831f}, { -0.1037708134f, 0.0337171812f}, { 0.0063431077f, 0.0124490497f}, { -0.0385642057f, 0.0280185355f}, { -0.0138489067f, -0.0138489067f}, { -0.0052421235f, 0.0072151640f}, { -0.0085184500f, -0.0043403671f}, { -0.0006839732f, 0.0021050531f}, { -0.0047754808f, -0.0007563619f}, { 0.0000000000f, 0.0015046928f}, { -0.0044137537f, 0.0006990699f}, { -0.0002306877f, -0.0007099836f}, { -0.0022016193f, 0.0011217811f} }, { { -0.0020555298f, -0.0010473447f}, /* Filter 110 */ { -0.0004437229f, 0.0013656386f}, { -0.0044850891f, -0.0007103683f}, { 0.0000000000f, -0.0005596113f}, { -0.0051887820f, 0.0008218223f}, { -0.0002487817f, -0.0007656713f}, { -0.0096670126f, 0.0049255890f}, { -0.0038302342f, -0.0052718651f}, { -0.0175633376f, 0.0175633376f}, { -0.0388518426f, -0.0282275159f}, { 0.0007764820f, -0.0015239316f}, { -0.1248610407f, -0.0405698114f}, { 0.0440325565f, -0.2780106203f}, { 0.3408366709f, 0.0000000000f}, { 0.0411232740f, 0.2596421332f}, { -0.1030011138f, 0.0334670906f}, { 0.0065325459f, 0.0128208432f}, { -0.0385327768f, 0.0279957011f}, { -0.0137114739f, -0.0137114739f}, { -0.0052872555f, 0.0072772828f}, { -0.0084711411f, -0.0043162620f}, { -0.0006988141f, 0.0021507287f}, { -0.0047561744f, -0.0007533040f}, { 0.0000000000f, 0.0015382175f}, { -0.0044081214f, 0.0006981778f}, { -0.0002228535f, -0.0006858725f}, { -0.0022051449f, 0.0011235774f} }, { { -0.0020482334f, -0.0010436270f}, /* Filter 111 */ { -0.0004516136f, 0.0013899237f}, { -0.0044846698f, -0.0007103019f}, { 0.0000000000f, -0.0005233689f}, { -0.0051998731f, 0.0008235790f}, { -0.0002314730f, -0.0007124005f}, { -0.0097042763f, 0.0049445757f}, { -0.0037708270f, -0.0051900982f}, { -0.0177002397f, 0.0177002397f}, { -0.0388407526f, -0.0282194586f}, { 0.0005537359f, -0.0010867680f}, { -0.1256516079f, -0.0408266823f}, { 0.0441308133f, -0.2786309892f}, { 0.3407785039f, 0.0000000000f}, { 0.0410140671f, 0.2589526285f}, { -0.1022323897f, 0.0332173170f}, { 0.0067207811f, 0.0131902755f}, { -0.0384999358f, 0.0279718407f}, { -0.0135741072f, -0.0135741072f}, { -0.0053318786f, 0.0073387013f}, { -0.0084235294f, -0.0042920026f}, { -0.0007135575f, 0.0021961043f}, { -0.0047366037f, -0.0007502043f}, { 0.0000000000f, 0.0015716164f}, { -0.0044022844f, 0.0006972533f}, { -0.0002150272f, -0.0006617856f}, { -0.0022085377f, 0.0011253062f} }, { { -0.0020408022f, -0.0010398406f}, /* Filter 112 */ { -0.0004594994f, 0.0014141938f}, { -0.0044840278f, -0.0007102002f}, { 0.0000000000f, -0.0004870592f}, { -0.0052106492f, 0.0008252858f}, { -0.0002140858f, -0.0006588884f}, { -0.0097411254f, 0.0049633513f}, { -0.0037109171f, -0.0051076392f}, { -0.0178370350f, 0.0178370350f}, { -0.0388280428f, -0.0282102244f}, { 0.0003298196f, -0.0006473074f}, { -0.1264427052f, -0.0410837254f}, { 0.0442286557f, -0.2792487420f}, { 0.3407163139f, 0.0000000000f}, { 0.0409045147f, 0.2582609415f}, { -0.1014646226f, 0.0329678544f}, { 0.0069078131f, 0.0135573465f}, { -0.0384656852f, 0.0279469562f}, { -0.0134368115f, -0.0134368115f}, { -0.0053759855f, 0.0073994093f}, { -0.0083756155f, -0.0042675892f}, { -0.0007282033f, 0.0022411794f}, { -0.0047167638f, -0.0007470620f}, { 0.0000000000f, 0.0016048978f}, { -0.0043962359f, 0.0006962954f}, { -0.0002072092f, -0.0006377245f}, { -0.0022117956f, 0.0011269662f} }, { { -0.0020332365f, -0.0010359857f}, /* Filter 113 */ { -0.0004673804f, 0.0014384488f}, { -0.0044831593f, -0.0007100627f}, { 0.0000000000f, -0.0004506776f}, { -0.0052211059f, 0.0008269419f}, { -0.0001966211f, -0.0006051376f}, { -0.0097775620f, 0.0049819167f}, { -0.0036505044f, -0.0050244882f}, { -0.0179737156f, 0.0179737156f}, { -0.0388137063f, -0.0281998083f}, { 0.0001047341f, -0.0002055523f}, { -0.1272343255f, -0.0413409384f}, { 0.0443260808f, -0.2798638600f}, { 0.3406501456f, 0.0000000000f}, { 0.0407946244f, 0.2575671213f}, { -0.1006978434f, 0.0327187127f}, { 0.0070936379f, 0.0139220482f}, { -0.0384300398f, 0.0279210583f}, { -0.0132995926f, -0.0132995926f}, { -0.0054195838f, 0.0074594171f}, { -0.0083274089f, -0.0042430267f}, { -0.0007427516f, 0.0022859543f}, { -0.0046966573f, -0.0007438774f}, { 0.0000000000f, 0.0016380516f}, { -0.0043899851f, 0.0006953053f}, { -0.0001994007f, -0.0006136924f}, { -0.0022149197f, 0.0011285579f} }, { { -0.0020255376f, -0.0010320630f}, /* Filter 114 */ { -0.0004752586f, 0.0014626955f}, { -0.0044820704f, -0.0007098902f}, { 0.0000000000f, -0.0004142275f}, { -0.0052312458f, 0.0008285479f}, { -0.0001790793f, -0.0005511493f}, { -0.0098135759f, 0.0050002667f}, { -0.0035895900f, -0.0049406467f}, { -0.0181102764f, 0.0181102764f}, { -0.0387977338f, -0.0281882036f}, { -0.0001215183f, 0.0002384932f}, { -0.1280264277f, -0.0415983080f}, { 0.0444230929f, -0.2804763703f}, { 0.3405799320f, 0.0000000000f}, { 0.0406843964f, 0.2568711694f}, { -0.0999320580f, 0.0324698939f}, { 0.0072782560f, 0.0142843817f}, { -0.0383929951f, 0.0278941437f}, { -0.0131624584f, -0.0131624584f}, { -0.0054626681f, 0.0075187177f}, { -0.0082789073f, -0.0042183140f}, { -0.0007572001f, 0.0023304223f}, { -0.0046762880f, -0.0007406513f}, { 0.0000000000f, 0.0016710782f}, { -0.0043835331f, 0.0006942834f}, { -0.0001916007f, -0.0005896863f}, { -0.0022179116f, 0.0011300824f} }, { { -0.0020177053f, -0.0010280722f}, /* Filter 115 */ { -0.0004831286f, 0.0014869168f}, { -0.0044807549f, -0.0007096819f}, { 0.0000000000f, -0.0003777139f}, { -0.0052410650f, 0.0008301031f}, { -0.0001614619f, -0.0004969285f}, { -0.0098491643f, 0.0050183999f}, { -0.0035281741f, -0.0048561151f}, { -0.0182467125f, 0.0182467125f}, { -0.0387801244f, -0.0281754096f}, { -0.0003489325f, 0.0006848186f}, { -0.1288190325f, -0.0418558409f}, { 0.0445196833f, -0.2810862181f}, { 0.3405057686f, 0.0000000000f}, { 0.0405738379f, 0.2561731303f}, { -0.0991672869f, 0.0322214047f}, { 0.0074616683f, 0.0146443485f}, { -0.0383545750f, 0.0278662299f}, { -0.0130254114f, -0.0130254114f}, { -0.0055052393f, 0.0075773118f}, { -0.0082301158f, -0.0041934535f}, { -0.0007715502f, 0.0023745874f}, { -0.0046556572f, -0.0007373837f}, { 0.0000000000f, 0.0017039785f}, { -0.0043768718f, 0.0006932284f}, { -0.0001838111f, -0.0005657123f}, { -0.0022207691f, 0.0011315384f} }, { { -0.0020097374f, -0.0010240124f}, /* Filter 116 */ { -0.0004909940f, 0.0015111241f}, { -0.0044792187f, -0.0007094385f}, { 0.0000000000f, -0.0003411385f}, { -0.0052505618f, 0.0008316073f}, { -0.0001437692f, -0.0004424761f}, { -0.0098843276f, 0.0050363165f}, { -0.0034662576f, -0.0047708942f}, { -0.0183830151f, 0.0183830151f}, { -0.0387608713f, -0.0281614214f}, { -0.0005775139f, 0.0011334349f}, { -0.1296120935f, -0.0421135221f}, { 0.0446158526f, -0.2816934067f}, { 0.3404275809f, 0.0000000000f}, { 0.0404629427f, 0.2554729654f}, { -0.0984035433f, 0.0319732494f}, { 0.0076438762f, 0.0150019516f}, { -0.0383147780f, 0.0278373157f}, { -0.0128884592f, -0.0128884592f}, { -0.0055472976f, 0.0076352001f}, { -0.0081810412f, -0.0041684487f}, { -0.0007858009f, 0.0024184465f}, { -0.0046347647f, -0.0007340746f}, { 0.0000000000f, 0.0017367458f}, { -0.0043700036f, 0.0006921406f}, { -0.0001760298f, -0.0005417639f}, { -0.0022234937f, 0.0011329266f} }, { { -0.0020016361f, -0.0010198845f}, /* Filter 117 */ { -0.0004988537f, 0.0015353137f}, { -0.0044774545f, -0.0007091591f}, { 0.0000000000f, -0.0003045018f}, { -0.0052597363f, 0.0008330604f}, { -0.0001260014f, -0.0003877925f}, { -0.0099190609f, 0.0050540140f}, { -0.0034038419f, -0.0046849864f}, { -0.0185191789f, 0.0185191789f}, { -0.0387399618f, -0.0281462298f}, { -0.0008072533f, 0.0015843239f}, { -0.1304056099f, -0.0423713512f}, { 0.0447115990f, -0.2822979260f}, { 0.3403453966f, 0.0000000000f}, { 0.0403517197f, 0.2547707314f}, { -0.0976408374f, 0.0317254312f}, { 0.0078248748f, 0.0153571814f}, { -0.0382736074f, 0.0278074035f}, { -0.0127516043f, -0.0127516043f}, { -0.0055888462f, 0.0076923868f}, { -0.0081316854f, -0.0041433007f}, { -0.0007999506f, 0.0024619949f}, { -0.0046136165f, -0.0007307251f}, { 0.0000000000f, 0.0017693819f}, { -0.0043629383f, 0.0006910215f}, { -0.0001682594f, -0.0005178491f}, { -0.0022260831f, 0.0011342460f} }, { { -0.0019934027f, -0.0010156894f}, /* Filter 118 */ { -0.0005067065f, 0.0015594822f}, { -0.0044754634f, -0.0007088438f}, { 0.0000000000f, -0.0002678034f}, { -0.0052685865f, 0.0008344621f}, { -0.0001081607f, -0.0003328846f}, { -0.0099533576f, 0.0050714890f}, { -0.0033409256f, -0.0045983896f}, { -0.0186551985f, 0.0186551985f}, { -0.0387173945f, -0.0281298337f}, { -0.0010381516f, 0.0020374872f}, { -0.1311995619f, -0.0426293218f}, { 0.0448069181f, -0.2828997467f}, { 0.3402592203f, 0.0000000000f}, { 0.0402401713f, 0.2540664421f}, { -0.0968791926f, 0.0314779578f}, { 0.0080046651f, 0.0157100397f}, { -0.0382310777f, 0.0277765039f}, { -0.0126148560f, -0.0126148560f}, { -0.0056298825f, 0.0077488684f}, { -0.0080820516f, -0.0041180110f}, { -0.0008139998f, 0.0025052338f}, { -0.0045922082f, -0.0007273343f}, { 0.0000000000f, 0.0018018889f}, { -0.0043556701f, 0.0006898704f}, { -0.0001605011f, -0.0004939715f}, { -0.0022285419f, 0.0011354988f} }, { { -0.0019850362f, -0.0010114265f}, /* Filter 119 */ { -0.0005145514f, 0.0015836262f}, { -0.0044732506f, -0.0007084933f}, { 0.0000000000f, -0.0002310499f}, { -0.0052771110f, 0.0008358123f}, { -0.0000902463f, -0.0002777495f}, { -0.0099872186f, 0.0050887420f}, { -0.0032775125f, -0.0045111089f}, { -0.0187910667f, 0.0187910667f}, { -0.0386931575f, -0.0281122245f}, { -0.0012702110f, 0.0024929295f}, { -0.1319939386f, -0.0428874304f}, { 0.0449018114f, -0.2834988794f}, { 0.3401690422f, 0.0000000000f}, { 0.0401282958f, 0.2533600885f}, { -0.0961186050f, 0.0312308279f}, { 0.0081832497f, 0.0160605319f}, { -0.0381871931f, 0.0277446198f}, { -0.0124782163f, -0.0124782163f}, { -0.0056704053f, 0.0078046434f}, { -0.0080321422f, -0.0040925809f}, { -0.0008279475f, 0.0025481605f}, { -0.0045705499f, -0.0007239040f}, { 0.0000000000f, 0.0018342587f}, { -0.0043481937f, 0.0006886862f}, { -0.0001527526f, -0.0004701241f}, { -0.0022308664f, 0.0011366832f} }, { { -0.0019765358f, -0.0010070953f}, /* Filter 120 */ { -0.0005223897f, 0.0016077501f}, { -0.0044708094f, -0.0007081066f}, { 0.0000000000f, -0.0001942402f}, { -0.0052853097f, 0.0008371108f}, { -0.0000722598f, -0.0002223928f}, { -0.0100206356f, 0.0051057689f}, { -0.0032136048f, -0.0044231476f}, { -0.0189267792f, 0.0189267792f}, { -0.0386672447f, -0.0280933977f}, { -0.0015034225f, 0.0029506329f}, { -0.1327887358f, -0.0431456757f}, { 0.0449962735f, -0.2840952899f}, { 0.3400748842f, 0.0000000000f}, { 0.0400161008f, 0.2526517170f}, { -0.0953590886f, 0.0309840461f}, { 0.0083606221f, 0.0164086448f}, { -0.0381419711f, 0.0277117641f}, { -0.0123416969f, -0.0123416968f}, { -0.0057104183f, 0.0078597165f}, { -0.0079819653f, -0.0040670144f}, { -0.0008417947f, 0.0025907777f}, { -0.0045486380f, -0.0007204335f}, { 0.0000000000f, 0.0018664891f}, { -0.0043405200f, 0.0006874708f}, { -0.0001450151f, -0.0004463107f}, { -0.0022330599f, 0.0011378009f} }, { { -0.0019679000f, -0.0010026952f}, /* Filter 121 */ { -0.0005302207f, 0.0016318514f}, { -0.0044681412f, -0.0007076840f}, { 0.0000000000f, -0.0001573786f}, { -0.0052931768f, 0.0008383569f}, { -0.0000542017f, -0.0001668158f}, { -0.0100536090f, 0.0051225696f}, { -0.0031491979f, -0.0043344990f}, { -0.0190623224f, 0.0190623224f}, { -0.0386396562f, -0.0280733535f}, { -0.0017377909f, 0.0034106068f}, { -0.1335839077f, -0.0434040427f}, { 0.0450903019f, -0.2846889619f}, { 0.3399767352f, 0.0000000000f}, { 0.0399035852f, 0.2519413212f}, { -0.0946006731f, 0.0307376220f}, { 0.0085367892f, 0.0167543922f}, { -0.0380954013f, 0.0276779292f}, { -0.0122052947f, -0.0122052947f}, { -0.0057499191f, 0.0079140847f}, { -0.0079315220f, -0.0040413123f}, { -0.0008555388f, 0.0026330778f}, { -0.0045264729f, -0.0007169229f}, { 0.0000000000f, 0.0018985847f}, { -0.0043326526f, 0.0006862248f}, { -0.0001372916f, -0.0004225402f}, { -0.0022351193f, 0.0011388502f} }, { { -0.0019591345f, -0.0009982289f}, /* Filter 122 */ { -0.0005380409f, 0.0016559196f}, { -0.0044652477f, -0.0007072258f}, { 0.0000000000f, -0.0001204636f}, { -0.0053007186f, 0.0008395513f}, { -0.0000360739f, -0.0001110239f}, { -0.0100861291f, 0.0051391395f}, { -0.0030842956f, -0.0042451688f}, { -0.0191976997f, 0.0191976997f}, { -0.0386103853f, -0.0280520870f}, { -0.0019733077f, 0.0038728344f}, { -0.1343794616f, -0.0436625339f}, { 0.0451838979f, -0.2852799039f}, { 0.3398745971f, 0.0000000000f}, { 0.0397907528f, 0.2512289255f}, { -0.0938433728f, 0.0304915602f}, { 0.0087117470f, 0.0170977662f}, { -0.0380475075f, 0.0276431323f}, { -0.0120690194f, -0.0120690194f}, { -0.0057889082f, 0.0079677486f}, { -0.0078808157f, -0.0040154761f}, { -0.0008691803f, 0.0026750618f}, { -0.0045040620f, -0.0007133733f}, { 0.0000000000f, 0.0019305404f}, { -0.0043245792f, 0.0006849461f}, { -0.0001295793f, -0.0003988041f}, { -0.0022370475f, 0.0011398326f} }, { { -0.0019502349f, -0.0009936943f}, /* Filter 123 */ { -0.0005458542f, 0.0016799665f}, { -0.0044621312f, -0.0007067322f}, { 0.0000000000f, -0.0000835019f}, { -0.0053079282f, 0.0008406932f}, { -0.0000178756f, -0.0000550153f}, { -0.0101182016f, 0.0051554812f}, { -0.0030189005f, -0.0041551601f}, { -0.0193328981f, 0.0193328981f}, { -0.0385794176f, -0.0280295876f}, { -0.0022099760f, 0.0043373221f}, { -0.1351753758f, -0.0439211421f}, { 0.0452770566f, -0.2858680847f}, { 0.3397684879f, 0.0000000000f}, { 0.0396776072f, 0.2505145525f}, { -0.0930871855f, 0.0302458600f}, { 0.0088854919f, 0.0174387598f}, { -0.0379982948f, 0.0276073771f}, { -0.0119328775f, -0.0119328775f}, { -0.0058273888f, 0.0080207126f}, { -0.0078298528f, -0.0039895092f}, { -0.0008827194f, 0.0027167309f}, { -0.0044814011f, -0.0007097842f}, { 0.0000000000f, 0.0019623556f}, { -0.0043163061f, 0.0006836357f}, { -0.0001218783f, -0.0003751028f}, { -0.0022388438f, 0.0011407479f} }, { { -0.0019412022f, -0.0009890919f}, /* Filter 124 */ { -0.0005536582f, 0.0017039849f}, { -0.0044587869f, -0.0007062025f}, { 0.0000000000f, -0.0000464885f}, { -0.0053148036f, 0.0008417822f}, { 0.0000003917f, 0.0000012056f}, { -0.0101498145f, 0.0051715888f}, { -0.0029530116f, -0.0040644718f}, { -0.0194679109f, 0.0194679108f}, { -0.0385467483f, -0.0280058520f}, { -0.0024477914f, 0.0048040611f}, { -0.1359716398f, -0.0441798639f}, { 0.0453697749f, -0.2864534851f}, { 0.3396583880f, 0.0000000000f}, { 0.0395641480f, 0.2497981996f}, { -0.0923321333f, 0.0300005287f}, { 0.0090580301f, 0.0177773850f}, { -0.0379477617f, 0.0275706627f}, { -0.0117968713f, -0.0117968713f}, { -0.0058653573f, 0.0080729717f}, { -0.0077786333f, -0.0039634116f}, { -0.0008961544f, 0.0027580796f}, { -0.0044584965f, -0.0007061565f}, { 0.0000000000f, 0.0019940273f}, { -0.0043078420f, 0.0006822951f}, { -0.0001141917f, -0.0003514459f}, { -0.0022405060f, 0.0011415948f} }, { { -0.0019320383f, -0.0009844227f}, /* Filter 125 */ { -0.0005614523f, 0.0017279724f}, { -0.0044552115f, -0.0007056362f}, { 0.0000000000f, -0.0000094350f}, { -0.0053213449f, 0.0008428182f}, { 0.0000187268f, 0.0000576352f}, { -0.0101809712f, 0.0051874639f}, { -0.0028866289f, -0.0039731038f}, { -0.0196027359f, 0.0196027359f}, { -0.0385123811f, -0.0279808828f}, { -0.0026867496f, 0.0052730430f}, { -0.1367682312f, -0.0444386921f}, { 0.0454620561f, -0.2870361257f}, { 0.3395443142f, 0.0000000000f}, { 0.0394503819f, 0.2490799083f}, { -0.0915782327f, 0.0297555716f}, { 0.0092293595f, 0.0181136380f}, { -0.0378959245f, 0.0275330008f}, { -0.0116610092f, -0.0116610092f}, { -0.0059028162f, 0.0081245295f}, { -0.0077271635f, -0.0039371865f}, { -0.0009094853f, 0.0027991078f}, { -0.0044353502f, -0.0007024905f}, { 0.0000000000f, 0.0020255556f}, { -0.0042991742f, 0.0006809223f}, { -0.0001065179f, -0.0003278284f}, { -0.0022420391f, 0.0011423760f} }, { { -0.0019227418f, -0.0009796859f}, /* Filter 126 */ { -0.0005692359f, 0.0017519279f}, { -0.0044514082f, -0.0007050338f}, { -0.0000000000f, 0.0000276667f}, { -0.0053275531f, 0.0008438015f}, { 0.0000371295f, 0.0001142729f}, { -0.0102116616f, 0.0052031015f}, { -0.0028197549f, -0.0038810597f}, { -0.0197373608f, 0.0197373608f}, { -0.0384763002f, -0.0279546684f}, { -0.0029268546f, 0.0057442757f}, { -0.1375651403f, -0.0446976236f}, { 0.0455538916f, -0.2876159521f}, { 0.3394262701f, 0.0000000000f}, { 0.0393363079f, 0.2483596736f}, { -0.0908254902f, 0.0295109907f}, { 0.0093994769f, 0.0184475121f}, { -0.0378427866f, 0.0274943939f}, { -0.0115252954f, -0.0115252954f}, { -0.0059397663f, 0.0081753869f}, { -0.0076754477f, -0.0039108359f}, { -0.0009227124f, 0.0028398167f}, { -0.0044119618f, -0.0006987861f}, { 0.0000000000f, 0.0020569427f}, { -0.0042903141f, 0.0006795190f}, { -0.0000988591f, -0.0003042571f}, { -0.0022434404f, 0.0011430900f} }, { { -0.0019133143f, -0.0009748823f}, /* Filter 127 */ { -0.0005770089f, 0.0017758509f}, { -0.0044473797f, -0.0007043957f}, { -0.0000000000f, 0.0000648082f}, { -0.0053334257f, 0.0008447316f}, { 0.0000555987f, 0.0001711151f}, { -0.0102418869f, 0.0052185020f}, { -0.0027523906f, -0.0037883407f}, { -0.0198717871f, 0.0198717871f}, { -0.0384385005f, -0.0279272053f}, { -0.0031681003f, 0.0062177469f}, { -0.1383623364f, -0.0449566483f}, { 0.0456452799f, -0.2881929551f}, { 0.3393042459f, 0.0000000000f}, { 0.0392219302f, 0.2476375210f}, { -0.0900739211f, 0.0292667911f}, { 0.0095683866f, 0.0187790160f}, { -0.0377883557f, 0.0274548475f}, { -0.0113897330f, -0.0113897330f}, { -0.0059762043f, 0.0082255396f}, { -0.0076234874f, -0.0038843609f}, { -0.0009358341f, 0.0028802012f}, { -0.0043883332f, -0.0006950437f}, { 0.0000000000f, 0.0020881801f}, { -0.0042812542f, 0.0006780840f}, { -0.0000912136f, -0.0002807266f}, { -0.0022447108f, 0.0011437373f} }, { { -0.0019037530f, -0.0009700106f}, /* Filter 128 */ { -0.0005847711f, 0.0017997404f}, { -0.0044431266f, -0.0007037221f}, { -0.0000000000f, 0.0001019889f}, { -0.0053389628f, 0.0008456086f}, { 0.0000741335f, 0.0002281595f}, { -0.0102716430f, 0.0052336635f}, { -0.0026845378f, -0.0036949493f}, { -0.0200059998f, 0.0200059998f}, { -0.0383989776f, -0.0278984903f}, { -0.0034104848f, 0.0066934534f}, { -0.1391598293f, -0.0452157695f}, { 0.0457362256f, -0.2887671637f}, { 0.3391782445f, 0.0000000000f}, { 0.0391072478f, 0.2469134451f}, { -0.0893235341f, 0.0290229756f}, { 0.0097360827f, 0.0191081383f}, { -0.0377326433f, 0.0274143701f}, { -0.0112543303f, -0.0112543303f}, { -0.0060121356f, 0.0082749947f}, { -0.0075712885f, -0.0038577642f}, { -0.0009488505f, 0.0029202617f}, { -0.0043644688f, -0.0006912640f}, { 0.0000000000f, 0.0021192677f}, { -0.0042720048f, 0.0006766191f}, { -0.0000835820f, -0.0002572389f}, { -0.0022458480f, 0.0011443167f} }, { { -0.0018940611f, -0.0009650723f}, /* Filter 129 */ { -0.0005925210f, 0.0018235921f}, { -0.0044386430f, -0.0007030120f}, { -0.0000000000f, 0.0001392054f}, { -0.0053441572f, 0.0008464313f}, { 0.0000927328f, 0.0002854022f}, { -0.0103009234f, 0.0052485826f}, { -0.0026161974f, -0.0036008869f}, { -0.0201399968f, 0.0201399968f}, { -0.0383577269f, -0.0278685199f}, { -0.0036540038f, 0.0071713863f}, { -0.1399575771f, -0.0454749735f}, { 0.0458267191f, -0.2893385169f}, { 0.3390482929f, 0.0000000000f}, { 0.0389922690f, 0.2461874974f}, { -0.0885743593f, 0.0287795539f}, { 0.0099025724f, 0.0194348927f}, { -0.0376756581f, 0.0273729679f}, { -0.0111190914f, -0.0111190914f}, { -0.0060475588f, 0.0083237506f}, { -0.0075188538f, -0.0038310474f}, { -0.0009617615f, 0.0029599977f}, { -0.0043403667f, -0.0006874465f}, { 0.0000000000f, 0.0021502064f}, { -0.0042625620f, 0.0006751235f}, { -0.0000759667f, -0.0002338013f}, { -0.0022468561f, 0.0011448304f} }, { { -0.0018842402f, -0.0009600683f}, /* Filter 130 */ { -0.0006002610f, 0.0018474133f}, { -0.0044339292f, -0.0007022654f}, { -0.0000000000f, 0.0001764611f}, { -0.0053490169f, 0.0008472010f}, { 0.0001113966f, 0.0003428435f}, { -0.0103297257f, 0.0052632581f}, { -0.0025473698f, -0.0035061537f}, { -0.0202737736f, 0.0202737736f}, { -0.0383147369f, -0.0278372858f}, { -0.0038986588f, 0.0076515487f}, { -0.1407555807f, -0.0457342605f}, { 0.0459167605f, -0.2899070162f}, { 0.3389143782f, 0.0000000000f}, { 0.0388769943f, 0.2454596814f}, { -0.0878263866f, 0.0285365229f}, { 0.0100678484f, 0.0197592651f}, { -0.0376174025f, 0.0273306427f}, { -0.0109840200f, -0.0109840200f}, { -0.0060824726f, 0.0083718053f}, { -0.0074661872f, -0.0038042124f}, { -0.0009745664f, 0.0029994070f}, { -0.0043160343f, -0.0006835927f}, { 0.0000000000f, 0.0021809969f}, { -0.0042529265f, 0.0006735974f}, { -0.0000683662f, -0.0002104096f}, { -0.0022477336f, 0.0011452775f} }, { { -0.0018742850f, -0.0009549959f}, /* Filter 131 */ { -0.0006079877f, 0.0018711939f}, { -0.0044289903f, -0.0007014832f}, { -0.0000000000f, 0.0002137479f}, { -0.0053535336f, 0.0008479164f}, { 0.0001301236f, 0.0004004791f}, { -0.0103580469f, 0.0052776885f}, { -0.0024780545f, -0.0034107494f}, { -0.0204073193f, 0.0204073193f}, { -0.0382700034f, -0.0278047850f}, { -0.0041444459f, 0.0081339331f}, { -0.1415538244f, -0.0459936256f}, { 0.0460063488f, -0.2904726541f}, { 0.3387764777f, 0.0000000000f}, { 0.0387614234f, 0.2447299955f}, { -0.0870796498f, 0.0282938934f}, { 0.0102319154f, 0.0200812646f}, { -0.0375578842f, 0.0272874001f}, { -0.0108491236f, -0.0108491236f}, { -0.0061168795f, 0.0084191624f}, { -0.0074132930f, -0.0037772614f}, { -0.0009872642f, 0.0030384868f}, { -0.0042914690f, -0.0006797019f}, { 0.0000000000f, 0.0022116302f}, { -0.0042430934f, 0.0006720400f}, { -0.0000607804f, -0.0001870628f}, { -0.0022484808f, 0.0011456582f} }, { { -0.0018642004f, -0.0009498575f}, /* Filter 132 */ { -0.0006157019f, 0.0018949356f}, { -0.0044238206f, -0.0007006644f}, { -0.0000000000f, 0.0002510630f}, { -0.0053577070f, 0.0008485774f}, { 0.0001489124f, 0.0004583052f}, { -0.0103858860f, 0.0052918732f}, { -0.0024082571f, -0.0033146815f}, { -0.0205406256f, 0.0205406256f}, { -0.0382235216f, -0.0277710140f}, { -0.0043913598f, 0.0086185289f}, { -0.1423522805f, -0.0462530597f}, { 0.0460954822f, -0.2910354206f}, { 0.3386346272f, 0.0000000000f}, { 0.0386455624f, 0.2439984781f}, { -0.0863341457f, 0.0280516644f}, { 0.0103947715f, 0.0204008878f}, { -0.0374971151f, 0.0272432488f}, { -0.0107144051f, -0.0107144051f}, { -0.0061507798f, 0.0084658221f}, { -0.0073601752f, -0.0037501966f}, { -0.0009998548f, 0.0030772368f}, { -0.0042666731f, -0.0006757746f}, { 0.0000000000f, 0.0022421145f}, { -0.0042330752f, 0.0006704533f}, { -0.0000532127f, -0.0001637720f}, { -0.0022490980f, 0.0011459727f} }, { { -0.0018539858f, -0.0009446530f}, /* Filter 133 */ { -0.0006234019f, 0.0019186336f}, { -0.0044184245f, -0.0006998097f}, { -0.0000000000f, 0.0002884118f}, { -0.0053615377f, 0.0008491842f}, { 0.0001677624f, 0.0005163194f}, { -0.0104132366f, 0.0053058091f}, { -0.0023379747f, -0.0032179461f}, { -0.0206736926f, 0.0206736926f}, { -0.0381752904f, -0.0277359720f}, { -0.0046394033f, 0.0091053416f}, { -0.1431509477f, -0.0465125625f}, { 0.0461841561f, -0.2915952853f}, { 0.3384888443f, 0.0000000000f}, { 0.0385294149f, 0.2432651518f}, { -0.0855898984f, 0.0278098438f}, { 0.0105564182f, 0.0207181373f}, { -0.0374351001f, 0.0271981923f}, { -0.0105798714f, -0.0105798714f}, { -0.0061841719f, 0.0085117824f}, { -0.0073068366f, -0.0037230192f}, { -0.0010123388f, 0.0031156583f}, { -0.0042416532f, -0.0006718119f}, { 0.0000000000f, 0.0022724392f}, { -0.0042228650f, 0.0006688361f}, { -0.0000456602f, -0.0001405276f}, { -0.0022495854f, 0.0011462210f} }, { { -0.0018436386f, -0.0009393808f}, /* Filter 134 */ { -0.0006310899f, 0.0019422951f}, { -0.0044127982f, -0.0006989186f}, { -0.0000000000f, 0.0003257856f}, { -0.0053650246f, 0.0008497364f}, { 0.0001866731f, 0.0005745208f}, { -0.0104400974f, 0.0053194953f}, { -0.0022672080f, -0.0031205442f}, { -0.0208065105f, 0.0208065104f}, { -0.0381252938f, -0.0276996474f}, { -0.0048885719f, 0.0095943625f}, { -0.1439497887f, -0.0467721216f}, { 0.0462723730f, -0.2921522650f}, { 0.3383391016f, 0.0000000000f}, { 0.0384129780f, 0.2425299982f}, { -0.0848469266f, 0.0275684376f}, { 0.0107168551f, 0.0210330123f}, { -0.0373718527f, 0.0271522404f}, { -0.0104455273f, -0.0104455273f}, { -0.0062170590f, 0.0085570476f}, { -0.0072532811f, -0.0036957313f}, { -0.0010247148f, 0.0031537479f}, { -0.0042164035f, -0.0006678127f}, { 0.0000000000f, 0.0023026112f}, { -0.0042124676f, 0.0006671893f}, { -0.0000381241f, -0.0001173340f}, { -0.0022499438f, 0.0011464036f} }, { { -0.0018331638f, -0.0009340436f}, /* Filter 135 */ { -0.0006387617f, 0.0019659065f}, { -0.0044069406f, -0.0006979908f}, { -0.0000000000f, 0.0003631842f}, { -0.0053681691f, 0.0008502345f}, { 0.0002056433f, 0.0006329051f}, { -0.0104664619f, 0.0053329287f}, { -0.0021959615f, -0.0030224817f}, { -0.0209390691f, 0.0209390691f}, { -0.0380735357f, -0.0276620429f}, { -0.0051388586f, 0.0100855779f}, { -0.1447488052f, -0.0470317378f}, { 0.0463601257f, -0.2927063137f}, { 0.3381854075f, 0.0000000000f}, { 0.0382962586f, 0.2417930608f}, { -0.0841052204f, 0.0273274427f}, { 0.0108760800f, 0.0213455089f}, { -0.0373073694f, 0.0271053905f}, { -0.0103113770f, -0.0103113770f}, { -0.0062494398f, 0.0086016160f}, { -0.0071995141f, -0.0036683357f}, { -0.0010369820f, 0.0031915023f}, { -0.0041909284f, -0.0006637778f}, { 0.0000000000f, 0.0023326243f}, { -0.0042018827f, 0.0006655128f}, { -0.0000306060f, -0.0000941955f}, { -0.0022501716f, 0.0011465197f} }, { { -0.0018225596f, -0.0009286405f}, /* Filter 136 */ { -0.0006464218f, 0.0019894817f}, { -0.0044008610f, -0.0006970279f}, { -0.0000000000f, 0.0004006073f}, { -0.0053709647f, 0.0008506772f}, { 0.0002246725f, 0.0006914707f}, { -0.0104923262f, 0.0053461072f}, { -0.0021242368f, -0.0029237612f}, { -0.0210713702f, 0.0210713702f}, { -0.0380200008f, -0.0276231475f}, { -0.0053902680f, 0.0105789967f}, { -0.1455479905f, -0.0472914089f}, { 0.0464474173f, -0.2932574514f}, { 0.3380277742f, 0.0000000000f}, { 0.0381792592f, 0.2410543557f}, { -0.0833648092f, 0.0270868685f}, { 0.0110340968f, 0.0216556342f}, { -0.0372416715f, 0.0270576581f}, { -0.0101774269f, -0.0101774269f}, { -0.0062813164f, 0.0086454904f}, { -0.0071455361f, -0.0036408325f}, { -0.0010491418f, 0.0032289263f}, { -0.0041652385f, -0.0006597090f}, { 0.0000000000f, 0.0023624732f}, { -0.0041911082f, 0.0006638063f}, { -0.0000231042f, -0.0000711074f}, { -0.0022502727f, 0.0011465712f} }, { { -0.0018118257f, -0.0009231713f}, /* Filter 137 */ { -0.0006540651f, 0.0020130052f}, { -0.0043945464f, -0.0006960278f}, { -0.0000000000f, 0.0004380525f}, { -0.0053734107f, 0.0008510646f}, { 0.0002437596f, 0.0007502151f}, { -0.0105176937f, 0.0053590326f}, { -0.0020520317f, -0.0028243793f}, { -0.0212033969f, 0.0212033969f}, { -0.0379646890f, -0.0275829612f}, { -0.0056427969f, 0.0110746124f}, { -0.1463473013f, -0.0475511207f}, { 0.0465342410f, -0.2938056346f}, { 0.3378661729f, 0.0000000000f}, { 0.0380619805f, 0.2403138872f}, { -0.0826257082f, 0.0268467200f}, { 0.0111909061f, 0.0219633900f}, { -0.0371747573f, 0.0270090421f}, { -0.0100436811f, -0.0100436811f}, { -0.0063126885f, 0.0086886704f}, { -0.0070913538f, -0.0036132252f}, { -0.0010611914f, 0.0032660113f}, { -0.0041393246f, -0.0006556046f}, { 0.0000000000f, 0.0023921649f}, { -0.0041801479f, 0.0006620704f}, { -0.0000156216f, -0.0000480783f}, { -0.0022502440f, 0.0011465566f} }, { { -0.0018009641f, -0.0009176370f}, /* Filter 138 */ { -0.0006616940f, 0.0020364848f}, { -0.0043880048f, -0.0006949917f}, { -0.0000000000f, 0.0004755140f}, { -0.0053755151f, 0.0008513979f}, { 0.0002629036f, 0.0008091340f}, { -0.0105425517f, 0.0053716984f}, { -0.0019793489f, -0.0027243401f}, { -0.0213351496f, 0.0213351496f}, { -0.0379075894f, -0.0275414759f}, { -0.0058964369f, 0.0115724090f}, { -0.1471467472f, -0.0478108764f}, { 0.0466205992f, -0.2943508790f}, { 0.3377006790f, 0.0000000000f}, { 0.0379444273f, 0.2395716850f}, { -0.0818879174f, 0.0266069972f}, { 0.0113465049f, 0.0222687697f}, { -0.0371066415f, 0.0269595532f}, { -0.0099101441f, -0.0099101441f}, { -0.0063435547f, 0.0087311541f}, { -0.0070369692f, -0.0035855149f}, { -0.0010731328f, 0.0033027631f}, { -0.0041131960f, -0.0006514662f}, { 0.0000000000f, 0.0024216984f}, { -0.0041690028f, 0.0006603052f}, { -0.0000081573f, -0.0000251055f}, { -0.0022500878f, 0.0011464770f} }, { { -0.0017899694f, -0.0009120349f}, /* Filter 139 */ { -0.0006693064f, 0.0020599133f}, { -0.0043812313f, -0.0006939189f}, { -0.0000000000f, 0.0005129974f}, { -0.0053772639f, 0.0008516749f}, { 0.0002821033f, 0.0008682246f}, { -0.0105669024f, 0.0053841057f}, { -0.0019061921f, -0.0026236483f}, { -0.0214666211f, 0.0214666211f}, { -0.0378487057f, -0.0274986943f}, { -0.0061511870f, 0.0120723842f}, { -0.1479462926f, -0.0480706645f}, { 0.0467064846f, -0.2948931379f}, { 0.3375312165f, 0.0000000000f}, { 0.0378266004f, 0.2388277557f}, { -0.0811514623f, 0.0263677085f}, { 0.0115008908f, 0.0225717691f}, { -0.0370373273f, 0.0269091934f}, { -0.0097768207f, -0.0097768207f}, { -0.0063739197f, 0.0087729478f}, { -0.0069823897f, -0.0035577053f}, { -0.0010849638f, 0.0033391752f}, { -0.0040868488f, -0.0006472933f}, { 0.0000000000f, 0.0024510651f}, { -0.0041576695f, 0.0006585102f}, { -0.0000007105f, -0.0000021866f}, { -0.0022498023f, 0.0011463315f} }, { { -0.0017788493f, -0.0009063690f}, /* Filter 140 */ { -0.0006769032f, 0.0020832938f}, { -0.0043742317f, -0.0006928102f}, { -0.0000000000f, 0.0005504888f}, { -0.0053786652f, 0.0008518969f}, { 0.0003013579f, 0.0009274844f}, { -0.0105907396f, 0.0053962514f}, { -0.0018325584f, -0.0025223003f}, { -0.0215977999f, 0.0215977998f}, { -0.0377880256f, -0.0274546077f}, { -0.0064070501f, 0.0125745438f}, { -0.1487459309f, -0.0483304827f}, { 0.0467919009f, -0.2954324350f}, { 0.3373578615f, 0.0000000000f}, { 0.0377085026f, 0.2380821155f}, { -0.0804163482f, 0.0261288554f}, { 0.0116540714f, 0.0228724030f}, { -0.0369668239f, 0.0268579697f}, { -0.0096437180f, -0.0096437180f}, { -0.0064037822f, 0.0088140500f}, { -0.0069276141f, -0.0035297957f}, { -0.0010966851f, 0.0033752497f}, { -0.0040602898f, -0.0006430867f}, { 0.0000000000f, 0.0024802648f}, { -0.0041461563f, 0.0006566866f}, { 0.0000067158f, 0.0000206692f}, { -0.0022493906f, 0.0011461218f} }, { { -0.0017676012f, -0.0009006378f}, /* Filter 141 */ { -0.0006844835f, 0.0021066237f}, { -0.0043670009f, -0.0006916650f}, { -0.0000000000f, 0.0005879963f}, { -0.0053797155f, 0.0008520632f}, { 0.0003206673f, 0.0009869126f}, { -0.0106140636f, 0.0054081355f}, { -0.0017584537f, -0.0024203039f}, { -0.0217286837f, 0.0217286837f}, { -0.0377255408f, -0.0274092098f}, { -0.0066640196f, 0.0130788749f}, { -0.1495456541f, -0.0485903285f}, { 0.0468768425f, -0.2959687351f}, { 0.3371805647f, 0.0000000000f}, { 0.0375901346f, 0.2373347695f}, { -0.0796825853f, 0.0258904414f}, { 0.0118060423f, 0.0231706626f}, { -0.0368951402f, 0.0268058885f}, { -0.0095108389f, -0.0095108389f}, { -0.0064331423f, 0.0088544608f}, { -0.0068726491f, -0.0035017896f}, { -0.0011082965f, 0.0034109859f}, { -0.0040335180f, -0.0006388465f}, { 0.0000000000f, 0.0025093019f}, { -0.0041344617f, 0.0006548344f}, { 0.0000141245f, 0.0000434707f}, { -0.0022488502f, 0.0011458464f} }, { { -0.0017562251f, -0.0008948414f}, /* Filter 142 */ { -0.0006920455f, 0.0021298969f}, { -0.0043595438f, -0.0006904839f}, { -0.0000000000f, 0.0006255130f}, { -0.0053804086f, 0.0008521730f}, { 0.0003400298f, 0.0010465041f}, { -0.0106368706f, 0.0054197563f}, { -0.0016838770f, -0.0023176579f}, { -0.0218592629f, 0.0218592629f}, { -0.0376612461f, -0.0273624970f}, { -0.0069220926f, 0.0135853716f}, { -0.1503454306f, -0.0488501916f}, { 0.0469613070f, -0.2965020230f}, { 0.3369993395f, 0.0000000000f}, { 0.0374715012f, 0.2365857471f}, { -0.0789501938f, 0.0256524730f}, { 0.0119568064f, 0.0234665539f}, { -0.0368222770f, 0.0267529502f}, { -0.0093781859f, -0.0093781859f}, { -0.0064619996f, 0.0088941795f}, { -0.0068174982f, -0.0034736888f}, { -0.0011197964f, 0.0034463789f}, { -0.0040065374f, -0.0006345732f}, { 0.0000000000f, 0.0025381729f}, { -0.0041225812f, 0.0006529527f}, { 0.0000215125f, 0.0000662085f}, { -0.0022481826f, 0.0011455063f} }, { { -0.0017447212f, -0.0008889799f}, /* Filter 143 */ { -0.0006995909f, 0.0021531195f}, { -0.0043518542f, -0.0006892660f}, { -0.0000000000f, 0.0006630402f}, { -0.0053807534f, 0.0008522276f}, { 0.0003594448f, 0.0011062575f}, { -0.0106591532f, 0.0054311098f}, { -0.0016088279f, -0.0022143617f}, { -0.0219895354f, 0.0219895354f}, { -0.0375951417f, -0.0273144693f}, { -0.0071812658f, 0.0140940276f}, { -0.1511452494f, -0.0491100685f}, { 0.0470452963f, -0.2970323104f}, { 0.3368142102f, 0.0000000000f}, { 0.0373526110f, 0.2358351039f}, { -0.0782191848f, 0.0254149538f}, { 0.0121063640f, 0.0237600772f}, { -0.0367482532f, 0.0266991688f}, { -0.0092457714f, -0.0092457714f}, { -0.0064903592f, 0.0089332130f}, { -0.0067621637f, -0.0034454945f}, { -0.0011311858f, 0.0034814320f}, { -0.0039793495f, -0.0006302670f}, { 0.0000000000f, 0.0025668690f}, { -0.0041105253f, 0.0006510433f}, { 0.0000288809f, 0.0000888863f}, { -0.0022473903f, 0.0011451026f} }, { { -0.0017330882f, -0.0008830525f}, /* Filter 144 */ { -0.0007071195f, 0.0021762900f}, { -0.0043439389f, -0.0006880123f}, { -0.0000000000f, 0.0007005733f}, { -0.0053807400f, 0.0008522255f}, { 0.0003789110f, 0.0011661681f}, { -0.0106809137f, 0.0054421973f}, { -0.0015333122f, -0.0021104232f}, { -0.0221194870f, 0.0221194870f}, { -0.0375272169f, -0.0272651190f}, { -0.0074415407f, 0.0146048459f}, { -0.1519450992f, -0.0493699555f}, { 0.0471288033f, -0.2975595531f}, { 0.3366251695f, 0.0000000000f}, { 0.0372334541f, 0.2350827773f}, { -0.0774895642f, 0.0251778857f}, { 0.0122547132f, 0.0240512288f}, { -0.0366730754f, 0.0266445489f}, { -0.0091135918f, -0.0091135918f}, { -0.0065182191f, 0.0089715590f}, { -0.0067066524f, -0.0034172101f}, { -0.0011424645f, 0.0035161441f}, { -0.0039519572f, -0.0006259285f}, { 0.0000000000f, 0.0025953985f}, { -0.0040982843f, 0.0006491045f}, { 0.0000362282f, 0.0001114988f}, { -0.0022464703f, 0.0011446338f} }, { { -0.0017213310f, -0.0008770619f}, /* Filter 145 */ { -0.0007146270f, 0.0021993958f}, { -0.0043357913f, -0.0006867219f}, { -0.0000000000f, 0.0007381110f}, { -0.0053803718f, 0.0008521672f}, { 0.0003984276f, 0.0012262341f}, { -0.0107021433f, 0.0054530144f}, { -0.0014573283f, -0.0020058404f}, { -0.0222491169f, 0.0222491169f}, { -0.0374574722f, -0.0272144465f}, { -0.0077029083f, 0.0151178087f}, { -0.1527449650f, -0.0496298476f}, { 0.0472118307f, -0.2980837677f}, { 0.3364322263f, 0.0000000000f}, { 0.0371140423f, 0.2343288410f}, { -0.0767613480f, 0.0249412739f}, { 0.0124018566f, 0.0243400141f}, { -0.0365967449f, 0.0265890915f}, { -0.0089816572f, -0.0089816572f}, { -0.0065455769f, 0.0090092137f}, { -0.0066509631f, -0.0033888350f}, { -0.0011536312f, 0.0035505117f}, { -0.0039243606f, -0.0006215577f}, { 0.0000000000f, 0.0026237608f}, { -0.0040858657f, 0.0006471375f}, { 0.0000435551f, 0.0001340487f}, { -0.0022454243f, 0.0011441008f} }, { { -0.0017094449f, -0.0008710057f}, /* Filter 146 */ { -0.0007221187f, 0.0022224528f}, { -0.0043274173f, -0.0006853956f}, { -0.0000000000f, 0.0007756478f}, { -0.0053796470f, 0.0008520524f}, { 0.0004179944f, 0.0012864544f}, { -0.0107228440f, 0.0054635619f}, { -0.0013808793f, -0.0019006173f}, { -0.0223784170f, 0.0223784170f}, { -0.0373858889f, -0.0271624382f}, { -0.0079653685f, 0.0156329160f}, { -0.1535448176f, -0.0498897355f}, { 0.0472943732f, -0.2986049201f}, { 0.3362353715f, 0.0000000000f}, { 0.0369943758f, 0.2335732963f}, { -0.0760345493f, 0.0247051227f}, { 0.0125477901f, 0.0246264247f}, { -0.0365192713f, 0.0265328037f}, { -0.0088499695f, -0.0088499695f}, { -0.0065724401f, 0.0090461878f}, { -0.0065951068f, -0.0033603747f}, { -0.0011646849f, 0.0035845316f}, { -0.0038965612f, -0.0006171547f}, { 0.0000000000f, 0.0026519463f}, { -0.0040732755f, 0.0006451435f}, { 0.0000508607f, 0.0001565332f}, { -0.0022442531f, 0.0011435041f} }, { { -0.0016974336f, -0.0008648856f}, /* Filter 147 */ { -0.0007295900f, 0.0022454470f}, { -0.0043188118f, -0.0006840326f}, { -0.0000000000f, 0.0008131900f}, { -0.0053785675f, 0.0008518814f}, { 0.0004376090f, 0.0013468222f}, { -0.0107430073f, 0.0054738356f}, { -0.0013039662f, -0.0017947555f}, { -0.0225073789f, 0.0225073789f}, { -0.0373124730f, -0.0271090985f}, { -0.0082289214f, 0.0161501676f}, { -0.1543446506f, -0.0501496170f}, { 0.0473764318f, -0.2991230182f}, { 0.3360346197f, 0.0000000000f}, { 0.0368744548f, 0.2328161450f}, { -0.0753091817f, 0.0244694365f}, { 0.0126925250f, 0.0249104828f}, { -0.0364406716f, 0.0264756977f}, { -0.0087185354f, -0.0087185354f}, { -0.0065988038f, 0.0090824743f}, { -0.0065390777f, -0.0033318265f}, { -0.0011756279f, 0.0036182106f}, { -0.0038685641f, -0.0006127204f}, { 0.0000000000f, 0.0026799609f}, { -0.0040605034f, 0.0006431206f}, { 0.0000581457f, 0.0001789542f}, { -0.0022429558f, 0.0011428431f} }, { { -0.0016852985f, -0.0008587025f}, /* Filter 148 */ { -0.0007370403f, 0.0022683768f}, { -0.0043099736f, -0.0006826328f}, { -0.0000000000f, 0.0008507285f}, { -0.0053771277f, 0.0008516534f}, { 0.0004572711f, 0.0014073357f}, { -0.0107626298f, 0.0054838338f}, { -0.0012265888f, -0.0016882547f}, { -0.0226359994f, 0.0226359994f}, { -0.0372372219f, -0.0270544253f}, { -0.0084935567f, 0.0166695436f}, { -0.1551444498f, -0.0504094875f}, { 0.0474580032f, -0.2996380397f}, { 0.3358299840f, 0.0000000000f}, { 0.0367542882f, 0.2320574430f}, { -0.0745852583f, 0.0242342195f}, { 0.0128360470f, 0.0251921607f}, { -0.0363609391f, 0.0264177686f}, { -0.0085873575f, -0.0085873575f}, { -0.0066246707f, 0.0091180770f}, { -0.0064828908f, -0.0033031978f}, { -0.0011864571f, 0.0036515394f}, { -0.0038403710f, -0.0006082550f}, { 0.0000000000f, 0.0027078003f}, { -0.0040475567f, 0.0006410700f}, { 0.0000654088f, 0.0002013077f}, { -0.0022415348f, 0.0011421190f} }, { { -0.0016730382f, -0.0008524555f}, /* Filter 149 */ { -0.0007444717f, 0.0022912484f}, { -0.0043009099f, -0.0006811972f}, { -0.0000000000f, 0.0008882574f}, { -0.0053753300f, 0.0008513686f}, { 0.0004769806f, 0.0014679953f}, { -0.0107817128f, 0.0054935571f}, { -0.0011487520f, -0.0015811215f}, { -0.0227642672f, 0.0227642672f}, { -0.0371601215f, -0.0269984086f}, { -0.0087592798f, 0.0171910545f}, { -0.1559442033f, -0.0506693432f}, { 0.0475390854f, -0.3001499723f}, { 0.3356214637f, 0.0000000000f}, { 0.0366338730f, 0.2312971712f}, { -0.0738627827f, 0.0239994729f}, { 0.0129783713f, 0.0254714879f}, { -0.0362800956f, 0.0263590324f}, { -0.0084564442f, -0.0084564442f}, { -0.0066500430f, 0.0091529990f}, { -0.0064265378f, -0.0032744845f}, { -0.0011971748f, 0.0036845251f}, { -0.0038119815f, -0.0006037586f}, { 0.0000000000f, 0.0027354617f}, { -0.0040344299f, 0.0006389909f}, { 0.0000726493f, 0.0002235915f}, { -0.0022399887f, 0.0011413312f} }, { { -0.0016606527f, -0.0008461448f}, /* Filter 150 */ { -0.0007518828f, 0.0023140572f}, { -0.0042916190f, -0.0006797257f}, { -0.0000000000f, 0.0009257855f}, { -0.0053731737f, 0.0008510271f}, { 0.0004967352f, 0.0015287938f}, { -0.0108002480f, 0.0055030012f}, { -0.0010704568f, -0.0014733573f}, { -0.0228921794f, 0.0228921794f}, { -0.0370811655f, -0.0269410438f}, { -0.0090260797f, 0.0177146788f}, { -0.1567438739f, -0.0509291719f}, { 0.0476196755f, -0.3006587981f}, { 0.3354090492f, 0.0000000000f}, { 0.0365132145f, 0.2305353630f}, { -0.0731417811f, 0.0237652053f}, { 0.0131194860f, 0.0257484410f}, { -0.0361981382f, 0.0262994869f}, { -0.0083257964f, -0.0083257964f}, { -0.0066749202f, 0.0091872395f}, { -0.0063700344f, -0.0032456946f}, { -0.0012077784f, 0.0037171597f}, { -0.0037834012f, -0.0005992319f}, { 0.0000000000f, 0.0027629465f}, { -0.0040211370f, 0.0006368855f}, { 0.0000798669f, 0.0002458049f}, { -0.0022383190f, 0.0011404805f} }, { { -0.0016481390f, -0.0008397688f}, /* Filter 151 */ { -0.0007592726f, 0.0023368007f}, { -0.0042820985f, -0.0006782178f}, { -0.0000000000f, 0.0009633032f}, { -0.0053706532f, 0.0008506279f}, { 0.0005165348f, 0.0015897306f}, { -0.0108182392f, 0.0055121682f}, { -0.0009917019f, -0.0013649606f}, { -0.0230197214f, 0.0230197214f}, { -0.0370003574f, -0.0268823332f}, { -0.0092939607f, 0.0182404248f}, { -0.1575434521f, -0.0511889706f}, { 0.0476997708f, -0.3011645002f}, { 0.3351927556f, 0.0000000000f}, { 0.0363923116f, 0.2297720123f}, { -0.0724222525f, 0.0235314163f}, { 0.0132593976f, 0.0260230330f}, { -0.0361150801f, 0.0262391416f}, { -0.0081954182f, -0.0081954182f}, { -0.0066993029f, 0.0092207994f}, { -0.0063133765f, -0.0032168260f}, { -0.0012182683f, 0.0037494443f}, { -0.0037546254f, -0.0005946742f}, { 0.0000000000f, 0.0027902521f}, { -0.0040076731f, 0.0006347531f}, { 0.0000870628f, 0.0002679518f}, { -0.0022365232f, 0.0011395655f} }, { { -0.0016355037f, -0.0008333308f}, /* Filter 152 */ { -0.0007666411f, 0.0023594786f}, { -0.0042723457f, -0.0006766731f}, { -0.0000000000f, 0.0010008101f}, { -0.0053677718f, 0.0008501715f}, { 0.0005363782f, 0.0016508024f}, { -0.0108356778f, 0.0055210536f}, { -0.0009124926f, -0.0012559383f}, { -0.0231468974f, 0.0231468974f}, { -0.0369176808f, -0.0268222652f}, { -0.0095629171f, 0.0187682815f}, { -0.1583429520f, -0.0514487439f}, { 0.0477793762f, -0.3016671090f}, { 0.3349726054f, 0.0000000000f}, { 0.0362711726f, 0.2290071711f}, { -0.0717042118f, 0.0232981107f}, { 0.0133981115f, 0.0262952744f}, { -0.0360309323f, 0.0261780046f}, { -0.0080653181f, -0.0080653181f}, { -0.0067231917f, 0.0092536796f}, { -0.0062565682f, -0.0031878807f}, { -0.0012286457f, 0.0037813826f}, { -0.0037256640f, -0.0005900872f}, { 0.0000000000f, 0.0028173807f}, { -0.0039940319f, 0.0006325925f}, { 0.0000942350f, 0.0002900256f}, { -0.0022346067f, 0.0011385890f} }, { { -0.0016227434f, -0.0008268290f}, /* Filter 153 */ { -0.0007739869f, 0.0023820868f}, { -0.0042623665f, -0.0006750925f}, { -0.0000000000f, 0.0010383048f}, { -0.0053645285f, 0.0008496578f}, { 0.0005562642f, 0.0017120052f}, { -0.0108525630f, 0.0055296570f}, { -0.0008328273f, -0.0011462885f}, { -0.0232736903f, 0.0232736903f}, { -0.0368331385f, -0.0267608416f}, { -0.0098329431f, 0.0192982375f}, { -0.1591423172f, -0.0517084734f}, { 0.0478584820f, -0.3021665631f}, { 0.3347485628f, 0.0000000000f}, { 0.0361497965f, 0.2282408324f}, { -0.0709876776f, 0.0230652947f}, { 0.0135356225f, 0.0265651549f}, { -0.0359456982f, 0.0261160785f}, { -0.0079354970f, -0.0079354970f}, { -0.0067465878f, 0.0092858815f}, { -0.0061996157f, -0.0031588620f}, { -0.0012389084f, 0.0038129681f}, { -0.0036965139f, -0.0005854703f}, { 0.0000000000f, 0.0028443280f}, { -0.0039802216f, 0.0006304052f}, { 0.0001013836f, 0.0003120266f}, { -0.0022325659f, 0.0011375491f} }, { { -0.0016098620f, -0.0008202657f}, /* Filter 154 */ { -0.0007813108f, 0.0024046275f}, { -0.0042521612f, -0.0006734762f}, { -0.0000000000f, 0.0010757878f}, { -0.0053609232f, 0.0008490868f}, { 0.0005761918f, 0.0017733360f}, { -0.0108688882f, 0.0055379751f}, { -0.0007527098f, -0.0010360162f}, { -0.0234001010f, 0.0234001010f}, { -0.0367467241f, -0.0266980579f}, { -0.0101040387f, 0.0198302924f}, { -0.1599415609f, -0.0519681634f}, { 0.0479370898f, -0.3026628735f}, { 0.3345206886f, 0.0000000000f}, { 0.0360281864f, 0.2274730162f}, { -0.0702726572f, 0.0228329704f}, { 0.0136719292f, 0.0268326719f}, { -0.0358593925f, 0.0260533737f}, { -0.0078059632f, -0.0078059632f}, { -0.0067694939f, 0.0093174091f}, { -0.0061425226f, -0.0031297716f}, { -0.0012490578f, 0.0038442047f}, { -0.0036671818f, -0.0005808245f}, { 0.0000000000f, 0.0028710917f}, { -0.0039662425f, 0.0006281911f}, { 0.0001085087f, 0.0003339556f}, { -0.0022304022f, 0.0011364467f} }, { { -0.0015968572f, -0.0008136394f}, /* Filter 155 */ { -0.0007886122f, 0.0024270988f}, { -0.0042417193f, -0.0006718223f}, { -0.0000000000f, 0.0011132506f}, { -0.0053569537f, 0.0008484581f}, { 0.0005961600f, 0.0018347918f}, { -0.0108846506f, 0.0055460065f}, { -0.0006721419f, -0.0009251240f}, { -0.0235261215f, 0.0235261215f}, { -0.0366584350f, -0.0266339120f}, { -0.0103761991f, 0.0203644374f}, { -0.1607406511f, -0.0522278035f}, { 0.0480151982f, -0.3031560303f}, { 0.3342889675f, 0.0000000000f}, { 0.0359063480f, 0.2267037589f}, { -0.0695591611f, 0.0226011415f}, { 0.0138070366f, 0.0270978352f}, { -0.0357720145f, 0.0259898899f}, { -0.0076767172f, -0.0076767172f}, { -0.0067919097f, 0.0093482617f}, { -0.0060852914f, -0.0031006109f}, { -0.0012590926f, 0.0038750887f}, { -0.0036376653f, -0.0005761496f}, { 0.0000000000f, 0.0028976751f}, { -0.0039520956f, 0.0006259504f}, { 0.0001156098f, 0.0003558105f}, { -0.0022281185f, 0.0011352831f} }, { { -0.0015837296f, -0.0008069505f}, /* Filter 156 */ { -0.0007958903f, 0.0024494986f}, { -0.0042310587f, -0.0006701339f}, { -0.0000000000f, 0.0011506901f}, { -0.0053526174f, 0.0008477713f}, { 0.0006161688f, 0.0018963726f}, { -0.0108998530f, 0.0055537525f}, { -0.0005911249f, -0.0008136137f}, { -0.0236517400f, 0.0236517400f}, { -0.0365682525f, -0.0265683906f}, { -0.0106494241f, 0.0209006716f}, { -0.1615395679f, -0.0524873874f}, { 0.0480928020f, -0.3036460014f}, { 0.3340533515f, 0.0000000000f}, { 0.0357842761f, 0.2259330273f}, { -0.0688471974f, 0.0223698105f}, { 0.0139409476f, 0.0273606502f}, { -0.0356835773f, 0.0259256365f}, { -0.0075477654f, -0.0075477654f}, { -0.0068138363f, 0.0093784411f}, { -0.0060279260f, -0.0030713817f}, { -0.0012690123f, 0.0039056182f}, { -0.0036079683f, -0.0005714460f}, { 0.0000000000f, 0.0029240706f}, { -0.0039377785f, 0.0006236829f}, { 0.0001226858f, 0.0003775881f}, { -0.0022257106f, 0.0011340562f} }, { { -0.0015704775f, -0.0008001983f}, /* Filter 157 */ { -0.0008031447f, 0.0024718253f}, { -0.0042201659f, -0.0006684086f}, { -0.0000000000f, 0.0011881132f}, { -0.0053479162f, 0.0008470267f}, { 0.0006362162f, 0.0019580722f}, { -0.0109144832f, 0.0055612069f}, { -0.0005096614f, -0.0007014887f}, { -0.0237769522f, 0.0237769522f}, { -0.0364761835f, -0.0265014986f}, { -0.0109237052f, 0.0214389786f}, { -0.1623383067f, -0.0527469133f}, { 0.0481699031f, -0.3041327986f}, { 0.3338139023f, 0.0000000000f}, { 0.0356619806f, 0.2251608839f}, { -0.0681367848f, 0.0221389834f}, { 0.0140736575f, 0.0276211080f}, { -0.0355940851f, 0.0258606166f}, { -0.0074191106f, -0.0074191106f}, { -0.0068352744f, 0.0094079482f}, { -0.0059704311f, -0.0030420866f}, { -0.0012788172f, 0.0039357947f}, { -0.0035780951f, -0.0005667146f}, { 0.0000000000f, 0.0029502835f}, { -0.0039232962f, 0.0006213891f}, { 0.0001297372f, 0.0003992901f}, { -0.0022231823f, 0.0011327680f} }, { { -0.0015571057f, -0.0007933850f}, /* Filter 158 */ { -0.0008103756f, 0.0024940796f}, { -0.0042090432f, -0.0006666470f}, { -0.0000000000f, 0.0012255137f}, { -0.0053428512f, 0.0008462245f}, { 0.0006563010f, 0.0020198867f}, { -0.0109285481f, 0.0055683734f}, { -0.0004277512f, -0.0005887490f}, { -0.0239017519f, 0.0239017519f}, { -0.0363822251f, -0.0264332338f}, { -0.0111990442f, 0.0219793618f}, { -0.1631368376f, -0.0530063717f}, { 0.0482464973f, -0.3046163955f}, { 0.3335706260f, 0.0000000000f}, { 0.0355394639f, 0.2243873441f}, { -0.0674279327f, 0.0219086634f}, { 0.0142051710f, 0.0278792178f}, { -0.0355035484f, 0.0257948378f}, { -0.0072907606f, -0.0072907606f}, { -0.0068562238f, 0.0094367825f}, { -0.0059128092f, -0.0030127268f}, { -0.0012885070f, 0.0039656166f}, { -0.0035480443f, -0.0005619550f}, { 0.0000000000f, 0.0029763130f}, { -0.0039086496f, 0.0006190693f}, { 0.0001367646f, 0.0004209182f}, { -0.0022205325f, 0.0011314178f} }, { { -0.0015436150f, -0.0007865111f}, /* Filter 159 */ { -0.0008175826f, 0.0025162605f}, { -0.0041976949f, -0.0006648496f}, { -0.0000000000f, 0.0012628858f}, { -0.0053374169f, 0.0008453638f}, { 0.0006764229f, 0.0020818155f}, { -0.0109420370f, 0.0055752463f}, { -0.0003454002f, -0.0004754026f}, { -0.0240261303f, 0.0240261303f}, { -0.0362863596f, -0.0263635834f}, { -0.0114754349f, 0.0225218090f}, { -0.1639351598f, -0.0532657623f}, { 0.0483225860f, -0.3050968004f}, { 0.3333235086f, 0.0000000000f}, { 0.0354167248f, 0.2236123999f}, { -0.0667206479f, 0.0216788527f}, { 0.0143354881f, 0.0281349795f}, { -0.0354119781f, 0.0257283081f}, { -0.0071627177f, -0.0071627177f}, { -0.0068766888f, 0.0094649501f}, { -0.0058550643f, -0.0029833043f}, { -0.0012980817f, 0.0039950848f}, { -0.0035178221f, -0.0005571683f}, { 0.0000000000f, 0.0030021495f}, { -0.0038938406f, 0.0006167238f}, { 0.0001437652f, 0.0004424639f}, { -0.0022177623f, 0.0011300064f} }, { { -0.0015300010f, -0.0007795745f}, /* Filter 160 */ { -0.0008247632f, 0.0025383600f}, { -0.0041861158f, -0.0006630156f}, { -0.0000000000f, 0.0013002283f}, { -0.0053316185f, 0.0008444454f}, { 0.0006965800f, 0.0021438527f}, { -0.0109549473f, 0.0055818244f}, { -0.0002626055f, -0.0003614454f}, { -0.0241500844f, 0.0241500844f}, { -0.0361885991f, -0.0262925563f}, { -0.0117528734f, 0.0230663128f}, { -0.1647332531f, -0.0535250786f}, { 0.0483981644f, -0.3055739837f}, { 0.3330725580f, 0.0000000000f}, { 0.0352937702f, 0.2228360951f}, { -0.0660149525f, 0.0214495583f}, { 0.0144646069f, 0.0283883894f}, { -0.0353193822f, 0.0256610332f}, { -0.0070349865f, -0.0070349865f}, { -0.0068966684f, 0.0094924497f}, { -0.0057972012f, -0.0029538215f}, { -0.0013075407f, 0.0040241966f}, { -0.0034874241f, -0.0005523537f}, { 0.0000000000f, 0.0030278003f}, { -0.0038788694f, 0.0006143526f}, { 0.0001507411f, 0.0004639333f}, { -0.0022148733f, 0.0011285343f} }, { { -0.0015162684f, -0.0007725774f}, /* Filter 161 */ { -0.0008319195f, 0.0025603850f}, { -0.0041743131f, -0.0006611462f}, { -0.0000000000f, 0.0013375415f}, { -0.0053254484f, 0.0008434682f}, { 0.0007167720f, 0.0022059974f}, { -0.0109672808f, 0.0055881087f}, { -0.0001793695f, -0.0002468810f}, { -0.0242736037f, 0.0242736037f}, { -0.0360889259f, -0.0262201394f}, { -0.0120313580f, 0.0236128695f}, { -0.1655310827f, -0.0537843091f}, { 0.0484732318f, -0.3060479408f}, { 0.3328177905f, 0.0000000000f}, { 0.0351705998f, 0.2220584277f}, { -0.0653108539f, 0.0212207828f}, { 0.0145925305f, 0.0286394536f}, { -0.0352257635f, 0.0255930153f}, { -0.0069075694f, -0.0069075694f}, { -0.0069161628f, 0.0095192815f}, { -0.0057392236f, -0.0029242805f}, { -0.0013168843f, 0.0040529530f}, { -0.0034568576f, -0.0005475125f}, { 0.0000000000f, 0.0030532624f}, { -0.0038637337f, 0.0006119553f}, { 0.0001576893f, 0.0004853179f}, { -0.0022118625f, 0.0011270002f} }, { { -0.0015024151f, -0.0007655187f}, /* Filter 162 */ { -0.0008390498f, 0.0025823298f}, { -0.0041622804f, -0.0006592405f}, { -0.0000000000f, 0.0013748252f}, { -0.0053189108f, 0.0008424327f}, { 0.0007369976f, 0.0022682453f}, { -0.0109790280f, 0.0055940942f}, { -0.0000956984f, -0.0001317175f}, { -0.0243966809f, 0.0243966808f}, { -0.0359873394f, -0.0261463325f}, { -0.0123108854f, 0.0241614731f}, { -0.1663286640f, -0.0540434590f}, { 0.0485477870f, -0.3065186635f}, { 0.3325592195f, 0.0000000000f}, { 0.0350472173f, 0.2212794214f}, { -0.0646083561f, 0.0209925275f}, { 0.0147192622f, 0.0288881786f}, { -0.0351311327f, 0.0255242620f}, { -0.0067804730f, -0.0067804730f}, { -0.0069351713f, 0.0095454444f}, { -0.0056811318f, -0.0028946812f}, { -0.0013261120f, 0.0040813532f}, { -0.0034261244f, -0.0005426448f}, { 0.0000000000f, 0.0030785301f}, { -0.0038484382f, 0.0006095327f}, { 0.0001646126f, 0.0005066256f}, { -0.0022087339f, 0.0011254062f} }, { { -0.0014884430f, -0.0007583996f}, /* Filter 163 */ { -0.0008461542f, 0.0026041949f}, { -0.0041500234f, -0.0006572991f}, { -0.0000000000f, 0.0014120734f}, { -0.0053120041f, 0.0008413388f}, { 0.0007572560f, 0.0023305944f}, { -0.0109901946f, 0.0055997838f}, { -0.0000115916f, -0.0000159544f}, { -0.0245193118f, 0.0245193118f}, { -0.0358838323f, -0.0260711303f}, { -0.0125914531f, 0.0247121182f}, { -0.1671259528f, -0.0543025138f}, { 0.0486218279f, -0.3069861396f}, { 0.3322968292f, 0.0000000000f}, { 0.0349236250f, 0.2204990899f}, { -0.0639074789f, 0.0207647986f}, { 0.0148448026f, 0.0291345655f}, { -0.0350355011f, 0.0254547815f}, { -0.0066537014f, -0.0066537014f}, { -0.0069537018f, 0.0095709494f}, { -0.0056229327f, -0.0028650273f}, { -0.0013352233f, 0.0041093948f}, { -0.0033952242f, -0.0005377507f}, { 0.0000000000f, 0.0031036105f}, { -0.0038329794f, 0.0006070843f}, { 0.0001715097f, 0.0005278527f}, { -0.0022054869f, 0.0011237517f} }, { { -0.0014743520f, -0.0007512199f}, /* Filter 164 */ { -0.0008532325f, 0.0026259796f}, { -0.0041375369f, -0.0006553215f}, { -0.0000000000f, 0.0014492849f}, { -0.0053047256f, 0.0008401860f}, { 0.0007775460f, 0.0023930406f}, { -0.0110007658f, 0.0056051701f}, { 0.0000729497f, 0.0001004067f}, { -0.0246414870f, 0.0246414870f}, { -0.0357784018f, -0.0259945305f}, { -0.0128730543f, 0.0252647915f}, { -0.1679229530f, -0.0545614749f}, { 0.0486953528f, -0.3074503577f}, { 0.3320306306f, 0.0000000000f}, { 0.0347998259f, 0.2197174532f}, { -0.0632082284f, 0.0205375984f}, { 0.0149691501f, 0.0293786112f}, { -0.0349388718f, 0.0253845763f}, { -0.0065272595f, -0.0065272595f}, { -0.0069717498f, 0.0095957903f}, { -0.0055646300f, -0.0028353206f}, { -0.0013442186f, 0.0041370795f}, { -0.0033641641f, -0.0005328312f}, { 0.0000000000f, 0.0031284972f}, { -0.0038173642f, 0.0006046111f}, { 0.0001783784f, 0.0005489924f}, { -0.0022021205f, 0.0011220364f} }, { { -0.0014601426f, -0.0007439798f}, /* Filter 165 */ { -0.0008602826f, 0.0026476775f}, { -0.0041248212f, -0.0006533075f}, { -0.0000000000f, 0.0014864566f}, { -0.0052970776f, 0.0008389747f}, { 0.0007978665f, 0.0024555805f}, { -0.0110107504f, 0.0056102576f}, { 0.0001579238f, 0.0002173634f}, { -0.0247632008f, 0.0247632008f}, { -0.0356710455f, -0.0259165316f}, { -0.0131556897f, 0.0258194949f}, { -0.1687196397f, -0.0548203341f}, { 0.0487683599f, -0.3079113063f}, { 0.3317606309f, 0.0000000000f}, { 0.0346758233f, 0.2189345318f}, { -0.0625106192f, 0.0203109314f}, { 0.0150923097f, 0.0296203256f}, { -0.0348412605f, 0.0253136575f}, { -0.0064011503f, -0.0064011503f}, { -0.0069893153f, 0.0096199673f}, { -0.0055062248f, -0.0028055617f}, { -0.0013530973f, 0.0041644052f}, { -0.0033329427f, -0.0005278863f}, { 0.0000000000f, 0.0031531871f}, { -0.0038015912f, 0.0006021129f}, { 0.0001852208f, 0.0005700511f}, { -0.0021986382f, 0.0011202621f} }, { { -0.0014458149f, -0.0007366795f}, /* Filter 166 */ { -0.0008673053f, 0.0026692913f}, { -0.0041118878f, -0.0006512591f}, { -0.0000000000f, 0.0015235876f}, { -0.0052890581f, 0.0008377045f}, { 0.0008182166f, 0.0025182118f}, { -0.0110201366f, 0.0056150401f}, { 0.0002433249f, 0.0003349079f}, { -0.0248844430f, 0.0248844430f}, { -0.0355617515f, -0.0258371249f}, { -0.0134393508f, 0.0263762111f}, { -0.1695159803f, -0.0550790809f}, { 0.0488408446f, -0.3083689567f}, { 0.3314868370f, 0.0000000000f}, { 0.0345516193f, 0.2181503385f}, { -0.0618146579f, 0.0200847999f}, { 0.0152142751f, 0.0298596961f}, { -0.0347426640f, 0.0252420229f}, { -0.0062753772f, -0.0062753772f}, { -0.0070064077f, 0.0096434929f}, { -0.0054477253f, -0.0027757547f}, { -0.0013618591f, 0.0041913714f}, { -0.0033015580f, -0.0005229154f}, { 0.0000000000f, 0.0031776877f}, { -0.0037856664f, 0.0005995907f}, { 0.0001920348f, 0.0005910222f}, { -0.0021950358f, 0.0011184266f} }, { { -0.0014313705f, -0.0007293197f}, /* Filter 167 */ { -0.0008743021f, 0.0026908252f}, { -0.0040987206f, -0.0006491736f}, { -0.0000000000f, 0.0015606744f}, { -0.0052806669f, 0.0008363755f}, { 0.0008385950f, 0.0025809300f}, { -0.0110289268f, 0.0056195189f}, { 0.0003291546f, 0.0004530424f}, { -0.0250052112f, 0.0250052112f}, { -0.0354505202f, -0.0257563105f}, { -0.0137240371f, 0.0269349394f}, { -0.1703119776f, -0.0553377160f}, { 0.0489128097f, -0.3088233260f}, { 0.3312092597f, 0.0000000000f}, { 0.0344272156f, 0.2173648848f}, { -0.0611203609f, 0.0198592091f}, { 0.0153350520f, 0.0300967342f}, { -0.0346430960f, 0.0251696825f}, { -0.0061499438f, -0.0061499438f}, { -0.0070230192f, 0.0096663567f}, { -0.0053891314f, -0.0027458996f}, { -0.0013705037f, 0.0042179768f}, { -0.0032700204f, -0.0005179204f}, { 0.0000000000f, 0.0032019911f}, { -0.0037695819f, 0.0005970431f}, { 0.0001988203f, 0.0006119059f}, { -0.0021913182f, 0.0011165324f} }, { { -0.0014168097f, -0.0007219006f}, /* Filter 168 */ { -0.0008812689f, 0.0027122668f}, { -0.0040853303f, -0.0006470528f}, { -0.0000000000f, 0.0015977154f}, { -0.0052719037f, 0.0008349875f}, { 0.0008590005f, 0.0026437316f}, { -0.0110371168f, 0.0056236919f}, { 0.0004154116f, 0.0005717650f}, { -0.0251254954f, 0.0251254954f}, { -0.0353373491f, -0.0256740870f}, { -0.0140097447f, 0.0274956721f}, { -0.1711076164f, -0.0555962347f}, { 0.0489842529f, -0.3092744009f}, { 0.3309279035f, 0.0000000000f}, { 0.0343026178f, 0.2165782048f}, { -0.0604277411f, 0.0196341633f}, { 0.0154546459f, 0.0303314503f}, { -0.0345425735f, 0.0250966487f}, { -0.0060248575f, -0.0060248575f}, { -0.0070391540f, 0.0096885644f}, { -0.0053304459f, -0.0027159978f}, { -0.0013790323f, 0.0042442251f}, { -0.0032383252f, -0.0005129003f}, { 0.0000000000f, 0.0032260964f}, { -0.0037533457f, 0.0005944716f}, { 0.0002055786f, 0.0006327059f}, { -0.0021874838f, 0.0011145787f} }, { { -0.0014021320f, -0.0007144220f}, /* Filter 169 */ { -0.0008882074f, 0.0027336214f}, { -0.0040717178f, -0.0006448967f}, { -0.0000000000f, 0.0016347116f}, { -0.0052627649f, 0.0008335401f}, { 0.0008794327f, 0.0027066155f}, { -0.0110447047f, 0.0056275581f}, { 0.0005020904f, 0.0006910682f}, { -0.0252452876f, 0.0252452876f}, { -0.0352222256f, -0.0255904448f}, { -0.0142964714f, 0.0280584049f}, { -0.1719028769f, -0.0558546306f}, { 0.0490551686f, -0.3097221447f}, { 0.3306427857f, 0.0000000000f}, { 0.0341778230f, 0.2157902819f}, { -0.0597367984f, 0.0194096624f}, { 0.0155730524f, 0.0305638362f}, { -0.0344410900f, 0.0250229166f}, { -0.0059001204f, -0.0059001204f}, { -0.0070548131f, 0.0097101173f}, { -0.0052716754f, -0.0026860528f}, { -0.0013874429f, 0.0042701101f}, { -0.0032064778f, -0.0005078562f}, { 0.0000000000f, 0.0032500058f}, { -0.0037369580f, 0.0005918760f}, { 0.0002123080f, 0.0006534169f}, { -0.0021835332f, 0.0011125657f} }, { { -0.0013873415f, -0.0007068858f}, /* Filter 170 */ { -0.0008951164f, 0.0027548851f}, { -0.0040578765f, -0.0006427045f}, { -0.0000000000f, 0.0016716548f}, { -0.0052532571f, 0.0008320342f}, { 0.0008998894f, 0.0027695749f}, { -0.0110516828f, 0.0056311136f}, { 0.0005891905f, 0.0008109511f}, { -0.0253645869f, 0.0253645868f}, { -0.0351051571f, -0.0255053896f}, { -0.0145842116f, 0.0286231268f}, { -0.1726977302f, -0.0561128940f}, { 0.0491255647f, -0.3101666084f}, { 0.3303539045f, 0.0000000000f}, { 0.0340528424f, 0.2150011852f}, { -0.0590475577f, 0.0191857145f}, { 0.0156902759f, 0.0307939004f}, { -0.0343386669f, 0.0249485018f}, { -0.0057757379f, -0.0057757379f}, { -0.0070700018f, 0.0097310227f}, { -0.0052128211f, -0.0026560650f}, { -0.0013957372f, 0.0042956373f}, { -0.0031744818f, -0.0005027885f}, { 0.0000000000f, 0.0032737161f}, { -0.0037204152f, 0.0005892559f}, { 0.0002190094f, 0.0006740415f}, { -0.0021794696f, 0.0011104952f} }, { { -0.0013724328f, -0.0006992894f}, /* Filter 171 */ { -0.0009019959f, 0.0027760579f}, { -0.0040438090f, -0.0006404764f}, { -0.0000000000f, 0.0017085512f}, { -0.0052433760f, 0.0008304692f}, { 0.0009203707f, 0.0028326096f}, { -0.0110580501f, 0.0056343580f}, { 0.0006767090f, 0.0009314100f}, { -0.0254833823f, 0.0254833823f}, { -0.0349861306f, -0.0254189118f}, { -0.0148729578f, 0.0291898232f}, { -0.1734921841f, -0.0563710278f}, { 0.0491954263f, -0.3106076970f}, { 0.3300612587f, 0.0000000000f}, { 0.0339276705f, 0.2142108808f}, { -0.0583600246f, 0.0189623215f}, { 0.0158063103f, 0.0310216307f}, { -0.0342353018f, 0.0248734028f}, { -0.0056517100f, -0.0056517100f}, { -0.0070847143f, 0.0097512727f}, { -0.0051538904f, -0.0026260383f}, { -0.0014039134f, 0.0043208011f}, { -0.0031423371f, -0.0004976973f}, { 0.0000000000f, 0.0032972252f}, { -0.0037037255f, 0.0005866125f}, { 0.0002256805f, 0.0006945730f}, { -0.0021752882f, 0.0011083647f} }, { { -0.0013574107f, -0.0006916353f}, /* Filter 172 */ { -0.0009088446f, 0.0027971360f}, { -0.0040295204f, -0.0006382133f}, { -0.0000000000f, 0.0017453870f}, { -0.0052331148f, 0.0008288440f}, { 0.0009408753f, 0.0028957165f}, { -0.0110638054f, 0.0056372904f}, { 0.0007646444f, 0.0010524428f}, { -0.0256016596f, 0.0256016596f}, { -0.0348651405f, -0.0253310073f}, { -0.0151627154f, 0.0297585045f}, { -0.1742862005f, -0.0566290193f}, { 0.0492647580f, -0.3110454402f}, { 0.3297648658f, 0.0000000000f}, { 0.0338023139f, 0.2134194107f}, { -0.0576741947f, 0.0187394818f}, { 0.0159211695f, 0.0312470546f}, { -0.0341310065f, 0.0247976278f}, { -0.0055280441f, -0.0055280441f}, { -0.0070989590f, 0.0097708788f}, { -0.0050948817f, -0.0025959719f}, { -0.0014119724f, 0.0043456043f}, { -0.0031100445f, -0.0004925827f}, { 0.0000000000f, 0.0033205371f}, { -0.0036868820f, 0.0005839447f}, { 0.0002323231f, 0.0007150169f}, { -0.0021709935f, 0.0011061764f} }, { { -0.0013422743f, -0.0006839229f}, /* Filter 173 */ { -0.0009156640f, 0.0028181240f}, { -0.0040150098f, -0.0006359151f}, { -0.0000000000f, 0.0017821677f}, { -0.0052224822f, 0.0008271599f}, { 0.0009614017f, 0.0029588901f}, { -0.0110689444f, 0.0056399089f}, { 0.0008529956f, 0.0011740477f}, { -0.0257194246f, 0.0257194246f}, { -0.0347421838f, -0.0252416741f}, { -0.0154534710f, 0.0303291445f}, { -0.1750797643f, -0.0568868638f}, { 0.0493335604f, -0.3114798415f}, { 0.3294647168f, 0.0000000000f}, { 0.0336767754f, 0.2126267914f}, { -0.0569901065f, 0.0185172081f}, { 0.0160348403f, 0.0314701461f}, { -0.0340257897f, 0.0247211833f}, { -0.0054047446f, -0.0054047446f}, { -0.0071127326f, 0.0097898366f}, { -0.0050358040f, -0.0025658703f}, { -0.0014199134f, 0.0043700441f}, { -0.0030776105f, -0.0004874456f}, { 0.0000000000f, 0.0033436471f}, { -0.0036698948f, 0.0005812542f}, { 0.0002389352f, 0.0007353671f}, { -0.0021665839f, 0.0011039297f} }, { { -0.0013270241f, -0.0006761526f}, /* Filter 174 */ { -0.0009224524f, 0.0028390167f}, { -0.0040002741f, -0.0006335812f}, { -0.0000000000f, 0.0018188896f}, { -0.0052114720f, 0.0008254161f}, { 0.0009819489f, 0.0030221280f}, { -0.0110734677f, 0.0056422136f}, { 0.0009417582f, 0.0012962189f}, { -0.0258366582f, 0.0258366582f}, { -0.0346172596f, -0.0251509113f}, { -0.0157452306f, 0.0309017550f}, { -0.1758728665f, -0.0571445584f}, { 0.0494018279f, -0.3119108658f}, { 0.3291608469f, 0.0000000000f}, { 0.0335510562f, 0.2118330321f}, { -0.0563077467f, 0.0182954959f}, { 0.0161473402f, 0.0316909395f}, { -0.0339196635f, 0.0246440780f}, { -0.0052818148f, -0.0052818148f}, { -0.0071260337f, 0.0098081440f}, { -0.0049766550f, -0.0025357324f}, { -0.0014277367f, 0.0043941217f}, { -0.0030450357f, -0.0004822863f}, { 0.0000000000f, 0.0033665528f}, { -0.0036527558f, 0.0005785397f}, { 0.0002455178f, 0.0007556262f}, { -0.0021620629f, 0.0011016261f} }, { { -0.0013116612f, -0.0006683247f}, /* Filter 175 */ { -0.0009292099f, 0.0028598142f}, { -0.0039853119f, -0.0006312114f}, { -0.0000000000f, 0.0018555547f}, { -0.0052000922f, 0.0008236137f}, { 0.0010025158f, 0.0030854265f}, { -0.0110773713f, 0.0056442026f}, { 0.0010309301f, 0.0014189535f}, { -0.0259533663f, 0.0259533663f}, { -0.0344903630f, -0.0250587156f}, { -0.0160379814f, 0.0314763108f}, { -0.1766655070f, -0.0574021029f}, { 0.0494695653f, -0.3123385428f}, { 0.3288532338f, 0.0000000000f}, { 0.0334251612f, 0.2110381623f}, { -0.0556271369f, 0.0180743524f}, { 0.0162586580f, 0.0319094130f}, { -0.0338126301f, 0.0245663138f}, { -0.0051592580f, -0.0051592580f}, { -0.0071388691f, 0.0098258104f}, { -0.0049174434f, -0.0025055626f}, { -0.0014354426f, 0.0044178382f}, { -0.0030123189f, -0.0004771044f}, { 0.0000000000f, 0.0033892575f}, { -0.0036354734f, 0.0005758024f}, { 0.0002520699f, 0.0007757912f}, { -0.0021574284f, 0.0010992647f} }, { { -0.0012961871f, -0.0006604403f}, /* Filter 176 */ { -0.0009359356f, 0.0028805136f}, { -0.0039701300f, -0.0006288068f}, { -0.0000000000f, 0.0018921522f}, { -0.0051883299f, 0.0008217507f}, { 0.0010231017f, 0.0031487834f}, { -0.0110806487f, 0.0056458725f}, { 0.0011205114f, 0.0015422517f}, { -0.0260695287f, 0.0260695287f}, { -0.0343614823f, -0.0249650782f}, { -0.0163317246f, 0.0320528142f}, { -0.1774576372f, -0.0576594816f}, { 0.0495367633f, -0.3127628142f}, { 0.3285419113f, 0.0000000000f}, { 0.0332990916f, 0.2102421898f}, { -0.0549482856f, 0.0178537803f}, { 0.0163688011f, 0.0321255811f}, { -0.0337047030f, 0.0244879001f}, { -0.0050370769f, -0.0050370769f}, { -0.0071512408f, 0.0098428385f}, { -0.0048581698f, -0.0024753611f}, { -0.0014430304f, 0.0044411910f}, { -0.0029794678f, -0.0004719013f}, { 0.0000000000f, 0.0034117569f}, { -0.0036180491f, 0.0005730427f}, { 0.0002585916f, 0.0007958630f}, { -0.0021526811f, 0.0010968458f} }, { { -0.0012806020f, -0.0006524993f}, /* Filter 177 */ { -0.0009426290f, 0.0029011137f}, { -0.0039547236f, -0.0006263667f}, { -0.0000000000f, 0.0019286856f}, { -0.0051761955f, 0.0008198288f}, { 0.0010437052f, 0.0032121944f}, { -0.0110832996f, 0.0056472232f}, { 0.0012104960f, 0.0016661049f}, { -0.0261851487f, 0.0261851487f}, { -0.0342306216f, -0.0248700024f}, { -0.0166264567f, 0.0326312586f}, { -0.1782492532f, -0.0579166932f}, { 0.0496034263f, -0.3131837077f}, { 0.3282268613f, 0.0000000000f}, { 0.0331728498f, 0.2094451305f}, { -0.0542712019f, 0.0176337824f}, { 0.0164777696f, 0.0323394438f}, { -0.0335958803f, 0.0244088358f}, { -0.0049152798f, -0.0049152798f}, { -0.0071631454f, 0.0098592238f}, { -0.0047988370f, -0.0024451296f}, { -0.0014504998f, 0.0044641793f}, { -0.0029464795f, -0.0004666765f}, { 0.0000000000f, 0.0034340501f}, { -0.0036004777f, 0.0005702596f}, { 0.0002650826f, 0.0008158402f}, { -0.0021478235f, 0.0010943707f} }, { { -0.0012649024f, -0.0006445000f}, /* Filter 178 */ { -0.0009492899f, 0.0029216139f}, { -0.0039390981f, -0.0006238918f}, { -0.0000000000f, 0.0019651518f}, { -0.0051636809f, 0.0008178467f}, { 0.0010643250f, 0.0032756556f}, { -0.0110853211f, 0.0056482532f}, { 0.0013008835f, 0.0017905126f}, { -0.0263002096f, 0.0263002095f}, { -0.0340977770f, -0.0247734851f}, { -0.0169221683f, 0.0332116253f}, { -0.1790403429f, -0.0581737338f}, { 0.0496695465f, -0.3136011746f}, { 0.3279080881f, 0.0000000000f}, { 0.0330464377f, 0.2086469963f}, { -0.0535958992f, 0.0174143633f}, { 0.0165855627f, 0.0325509996f}, { -0.0334861824f, 0.0243291356f}, { -0.0047938623f, -0.0047938623f}, { -0.0071745880f, 0.0098749731f}, { -0.0047394533f, -0.0024148721f}, { -0.0014578511f, 0.0044868044f}, { -0.0029133560f, -0.0004614303f}, { 0.0000000000f, 0.0034561409f}, { -0.0035827641f, 0.0005674541f}, { 0.0002715416f, 0.0008357192f}, { -0.0021428519f, 0.0010918376f} }, { { -0.0012490941f, -0.0006364452f}, /* Filter 179 */ { -0.0009559179f, 0.0029420128f}, { -0.0039232480f, -0.0006213814f}, { -0.0000000000f, 0.0020015478f}, { -0.0051507929f, 0.0008158054f}, { 0.0010849601f, 0.0033391637f}, { -0.0110867107f, 0.0056489612f}, { 0.0013916737f, 0.0019154745f}, { -0.0264147135f, 0.0264147135f}, { -0.0339629379f, -0.0246755187f}, { -0.0172188616f, 0.0337939187f}, { -0.1798308921f, -0.0584305988f}, { 0.0497351290f, -0.3140152457f}, { 0.3275856455f, 0.0000000000f}, { 0.0329198616f, 0.2078478261f}, { -0.0529223907f, 0.0171955271f}, { 0.0166921866f, 0.0327602608f}, { -0.0333756137f, 0.0242488027f}, { -0.0046728389f, -0.0046728389f}, { -0.0071855666f, 0.0098900840f}, { -0.0046800169f, -0.0023845877f}, { -0.0014650844f, 0.0045090662f}, { -0.0028801083f, -0.0004561643f}, { 0.0000000000f, 0.0034780238f}, { -0.0035649100f, 0.0005646263f}, { 0.0002779697f, 0.0008555029f}, { -0.0021377717f, 0.0010892491f} }, { { -0.0012331777f, -0.0006283354f}, /* Filter 180 */ { -0.0009625120f, 0.0029623072f}, { -0.0039071795f, -0.0006188364f}, { -0.0000000000f, 0.0020378694f}, { -0.0051375257f, 0.0008137041f}, { 0.0011056098f, 0.0034027170f}, { -0.0110874640f, 0.0056493451f}, { 0.0014828623f, 0.0020409848f}, { -0.0265286487f, 0.0265286486f}, { -0.0338261024f, -0.0245761020f}, { -0.0175165288f, 0.0343781233f}, { -0.1806208765f, -0.0586872803f}, { 0.0498001678f, -0.3144258846f}, { 0.3272594964f, 0.0000000000f}, { 0.0327931228f, 0.2070476286f}, { -0.0522506751f, 0.0169772735f}, { 0.0167976380f, 0.0329672208f}, { -0.0332641784f, 0.0241678403f}, { -0.0045522045f, -0.0045522045f}, { -0.0071960854f, 0.0099045618f}, { -0.0046205348f, -0.0023542801f}, { -0.0014721991f, 0.0045309631f}, { -0.0028467280f, -0.0004508774f}, { 0.0000000000f, 0.0034997014f}, { -0.0035469196f, 0.0005617769f}, { 0.0002843666f, 0.0008751904f}, { -0.0021325818f, 0.0010866047f} }, { { -0.0012171503f, -0.0006201690f}, /* Filter 181 */ { -0.0009690729f, 0.0029824996f}, { -0.0038908892f, -0.0006162563f}, { -0.0000000000f, 0.0020741216f}, { -0.0051238819f, 0.0008115432f}, { 0.0011262723f, 0.0034663098f}, { -0.0110875784f, 0.0056494033f}, { 0.0015744429f, 0.0021670347f}, { -0.0266420053f, 0.0266420053f}, { -0.0336872691f, -0.0244752336f}, { -0.0178151678f, 0.0349642354f}, { -0.1814102747f, -0.0589437714f}, { 0.0498646641f, -0.3148330983f}, { 0.3269296554f, 0.0000000000f}, { 0.0326662218f, 0.2062464072f}, { -0.0515807741f, 0.0167596094f}, { 0.0169019206f, 0.0331718869f}, { -0.0331518885f, 0.0240862569f}, { -0.0044319669f, -0.0044319669f}, { -0.0072061462f, 0.0099184093f}, { -0.0045610084f, -0.0023239498f}, { -0.0014791959f, 0.0045524968f}, { -0.0028132202f, -0.0004455703f}, { 0.0000000000f, 0.0035211710f}, { -0.0035287880f, 0.0005589051f}, { 0.0002907313f, 0.0008947789f}, { -0.0021272804f, 0.0010839035f} }, { { -0.0012010169f, -0.0006119487f}, /* Filter 182 */ { -0.0009756000f, 0.0030025882f}, { -0.0038743798f, -0.0006136415f}, { -0.0000000000f, 0.0021102948f}, { -0.0051098607f, 0.0008093224f}, { 0.0011469467f, 0.0035299389f}, { -0.0110870524f, 0.0056491353f}, { 0.0016664209f, 0.0022936316f}, { -0.0267547838f, 0.0267547838f}, { -0.0335464345f, -0.0243729114f}, { -0.0181147701f, 0.0355522381f}, { -0.1821990707f, -0.0592000667f}, { 0.0499286139f, -0.3152368615f}, { 0.3265961402f, 0.0000000000f}, { 0.0325391632f, 0.2054441908f}, { -0.0509126991f, 0.0165425387f}, { 0.0170050359f, 0.0333742622f}, { -0.0330387505f, 0.0240040573f}, { -0.0043121270f, -0.0043121270f}, { -0.0072157478f, 0.0099316248f}, { -0.0045014440f, -0.0022936003f}, { -0.0014860735f, 0.0045736640f}, { -0.0027795897f, -0.0004402438f}, { 0.0000000000f, 0.0035424291f}, { -0.0035105169f, 0.0005560113f}, { 0.0002970631f, 0.0009142662f}, { -0.0021218707f, 0.0010811471f} }, { { -0.0011847721f, -0.0006036715f}, /* Filter 183 */ { -0.0009820912f, 0.0030225659f}, { -0.0038576503f, -0.0006109918f}, { -0.0000000000f, 0.0021463869f}, { -0.0050954597f, 0.0008070415f}, { 0.0011676322f, 0.0035936024f}, { -0.0110858859f, 0.0056485410f}, { 0.0017587860f, 0.0024207612f}, { -0.0268669691f, 0.0268669691f}, { -0.0334035882f, -0.0242691274f}, { -0.0184153382f, 0.0361421361f}, { -0.1829872717f, -0.0594561687f}, { 0.0499920157f, -0.3156371650f}, { 0.3262589677f, 0.0000000000f}, { 0.0324119487f, 0.2046409903f}, { -0.0502464419f, 0.0163260586f}, { 0.0171069856f, 0.0335743496f}, { -0.0329247776f, 0.0239212511f}, { -0.0041926924f, -0.0041926924f}, { -0.0072248932f, 0.0099442124f}, { -0.0044418429f, -0.0022632320f}, { -0.0014928333f, 0.0045944683f}, { -0.0027458380f, -0.0004348980f}, { 0.0000000000f, 0.0035634797f}, { -0.0034921137f, 0.0005530965f}, { 0.0003033628f, 0.0009336547f}, { -0.0021163512f, 0.0010783348f} }, { { -0.0011684229f, -0.0005953412f}, /* Filter 184 */ { -0.0009885487f, 0.0030424399f}, { -0.0038407034f, -0.0006083077f}, { -0.0000000000f, 0.0021824000f}, { -0.0050806797f, 0.0008047006f}, { 0.0011883268f, 0.0036572938f}, { -0.0110840763f, 0.0056476190f}, { 0.0018515428f, 0.0025484301f}, { -0.0269785595f, 0.0269785594f}, { -0.0332587359f, -0.0241638860f}, { -0.0187168673f, 0.0367339203f}, { -0.1837748388f, -0.0597120648f}, { 0.0500548715f, -0.3160340207f}, { 0.3259181294f, 0.0000000000f}, { 0.0322845815f, 0.2038368254f}, { -0.0495820369f, 0.0161101804f}, { 0.0172077747f, 0.0337721594f}, { -0.0328099690f, 0.0238378378f}, { -0.0040736649f, -0.0040736649f}, { -0.0072335836f, 0.0099561737f}, { -0.0043822054f, -0.0022328452f}, { -0.0014994741f, 0.0046149068f}, { -0.0027119655f, -0.0004295331f}, { 0.0000000000f, 0.0035843186f}, { -0.0034735715f, 0.0005501597f}, { 0.0003096295f, 0.0009529418f}, { -0.0021107264f, 0.0010754688f} }, { { -0.0011519648f, -0.0005869554f}, /* Filter 185 */ { -0.0009949709f, 0.0030622057f}, { -0.0038235324f, -0.0006055880f}, { -0.0000000000f, 0.0022183301f}, { -0.0050655213f, 0.0008022997f}, { 0.0012090309f, 0.0037210144f}, { -0.0110816114f, 0.0056463630f}, { 0.0019446819f, 0.0026766250f}, { -0.0270895417f, 0.0270895417f}, { -0.0331118630f, -0.0240571767f}, { -0.0190193487f, 0.0373275735f}, { -0.1845617592f, -0.0599677508f}, { 0.0501171763f, -0.3164273977f}, { 0.3255736244f, 0.0000000000f}, { 0.0321570632f, 0.2030317064f}, { -0.0489194701f, 0.0158948994f}, { 0.0173073982f, 0.0339676816f}, { -0.0326943386f, 0.0237538274f}, { -0.0039550473f, -0.0039550473f}, { -0.0072418204f, 0.0099675107f}, { -0.0043225420f, -0.0022024452f}, { -0.0015059960f, 0.0046349792f}, { -0.0026779756f, -0.0004241497f}, { 0.0000000000f, 0.0036049447f}, { -0.0034549005f, 0.0005472025f}, { 0.0003158634f, 0.0009721276f}, { -0.0021049923f, 0.0010725471f} }, { { -0.0011354014f, -0.0005785159f}, /* Filter 186 */ { -0.0010013566f, 0.0030818588f}, { -0.0038061486f, -0.0006028347f}, { -0.0000000000f, 0.0022541739f}, { -0.0050499875f, 0.0007998394f}, { 0.0012297420f, 0.0037847567f}, { -0.0110785003f, 0.0056447778f}, { 0.0020382052f, 0.0028053488f}, { -0.0271999184f, 0.0271999184f}, { -0.0329629727f, -0.0239490016f}, { -0.0193227779f, 0.0379230869f}, { -0.1853480191f, -0.0602232221f}, { 0.0501789307f, -0.3168172996f}, { 0.3252254876f, 0.0000000000f}, { 0.0320294011f, 0.2022256796f}, { -0.0482587741f, 0.0156802262f}, { 0.0174058626f, 0.0341609287f}, { -0.0325778977f, 0.0236692282f}, { -0.0038368434f, -0.0038368434f}, { -0.0072496072f, 0.0099782283f}, { -0.0042628518f, -0.0021720315f}, { -0.0015124002f, 0.0046546893f}, { -0.0026438710f, -0.0004187480f}, { 0.0000000000f, 0.0036253614f}, { -0.0034360946f, 0.0005442239f}, { 0.0003220639f, 0.0009912107f}, { -0.0020991518f, 0.0010695713f} }, { { -0.0011187340f, -0.0005700234f}, /* Filter 187 */ { -0.0010077057f, 0.0031013993f}, { -0.0037885462f, -0.0006000468f}, { -0.0000000000f, 0.0022899307f}, { -0.0050340712f, 0.0007973185f}, { 0.0012504589f, 0.0038485167f}, { -0.0110747363f, 0.0056428600f}, { 0.0021321098f, 0.0029345974f}, { -0.0273096732f, 0.0273096732f}, { -0.0328120641f, -0.0238393600f}, { -0.0196271574f, 0.0385204653f}, { -0.1861335945f, -0.0604784710f}, { 0.0502401324f, -0.3172037117f}, { 0.3248737054f, 0.0000000000f}, { 0.0319015944f, 0.2014187397f}, { -0.0475999433f, 0.0154661591f}, { 0.0175031683f, 0.0343519019f}, { -0.0324606458f, 0.0235840397f}, { -0.0037190588f, -0.0037190588f}, { -0.0072569405f, 0.0099883217f}, { -0.0042031392f, -0.0021416064f}, { -0.0015186844f, 0.0046740300f}, { -0.0026096525f, -0.0004133284f}, { 0.0000000000f, 0.0036455684f}, { -0.0034171601f, 0.0005412250f}, { 0.0003282310f, 0.0010101913f}, { -0.0020932061f, 0.0010665418f} }, { { -0.0011019602f, -0.0005614767f}, /* Filter 188 */ { -0.0010140199f, 0.0031208324f}, { -0.0037707253f, -0.0005972242f}, { -0.0000000000f, 0.0023255964f}, { -0.0050177778f, 0.0007947379f}, { 0.0012711815f, 0.0039122945f}, { -0.0110703162f, 0.0056406079f}, { 0.0022263916f, 0.0030643652f}, { -0.0274188054f, 0.0274188054f}, { -0.0326591229f, -0.0237282417f}, { -0.0199324784f, 0.0391196915f}, { -0.1869184792f, -0.0607334955f}, { 0.0503007794f, -0.3175866223f}, { 0.3245182896f, 0.0000000000f}, { 0.0317736429f, 0.2006108859f}, { -0.0469429903f, 0.0152527022f}, { 0.0175993179f, 0.0345406062f}, { -0.0323425986f, 0.0234982733f}, { -0.0036016954f, -0.0036016954f}, { -0.0072638274f, 0.0099978007f}, { -0.0041434070f, -0.0021111713f}, { -0.0015248506f, 0.0046930077f}, { -0.0025753233f, -0.0004078911f}, { 0.0000000000f, 0.0036655608f}, { -0.0033980896f, 0.0005382045f}, { 0.0003343644f, 0.0010290677f}, { -0.0020871540f, 0.0010634581f} }, { { -0.0010850831f, -0.0005528774f}, /* Filter 189 */ { -0.0010202946f, 0.0031401438f}, { -0.0037526894f, -0.0005943676f}, { -0.0000000000f, 0.0023611717f}, { -0.0050011043f, 0.0007920971f}, { 0.0012919081f, 0.0039760844f}, { -0.0110652351f, 0.0056380189f}, { 0.0023210497f, 0.0031946509f}, { -0.0275273031f, 0.0275273031f}, { -0.0325041534f, -0.0236156498f}, { -0.0202387338f, 0.0397207515f}, { -0.1877026542f, -0.0609882894f}, { 0.0503608735f, -0.3179660415f}, { 0.3241592762f, 0.0000000000f}, { 0.0316455557f, 0.1998021754f}, { -0.0462879351f, 0.0150398618f}, { 0.0176943134f, 0.0347270454f}, { -0.0322237637f, 0.0234119347f}, { -0.0034847552f, -0.0034847552f}, { -0.0072702646f, 0.0100066607f}, { -0.0040836583f, -0.0020807278f}, { -0.0015308989f, 0.0047116222f}, { -0.0025408856f, -0.0004024367f}, { 0.0000000000f, 0.0036853371f}, { -0.0033788979f, 0.0005351649f}, { 0.0003404626f, 0.0010478361f}, { -0.0020809967f, 0.0010603208f} }, { { -0.0010681046f, -0.0005442265f}, /* Filter 190 */ { -0.0010265333f, 0.0031593446f}, { -0.0037344368f, -0.0005914767f}, { -0.0000000000f, 0.0023966537f}, { -0.0049840526f, 0.0007893964f}, { 0.0013126376f, 0.0040398833f}, { -0.0110594921f, 0.0056350927f}, { 0.0024160790f, 0.0033254474f}, { -0.0276351622f, 0.0276351621f}, { -0.0323471495f, -0.0235015798f}, { -0.0205459255f, 0.0403236493f}, { -0.1884861004f, -0.0612428465f}, { 0.0504204080f, -0.3183419274f}, { 0.3237966197f, 0.0000000000f}, { 0.0315173303f, 0.1989925921f}, { -0.0456347697f, 0.0148276355f}, { 0.0177881547f, 0.0349112193f}, { -0.0321041418f, 0.0233250244f}, { -0.0033682442f, -0.0033682442f}, { -0.0072762570f, 0.0100149086f}, { -0.0040238979f, -0.0020502784f}, { -0.0015368271f, 0.0047298674f}, { -0.0025063405f, -0.0003969653f}, { 0.0000000000f, 0.0037048962f}, { -0.0033595723f, 0.0005321040f}, { 0.0003465273f, 0.0010665015f}, { -0.0020747359f, 0.0010571307f} }, { { -0.0010510198f, -0.0005355213f}, /* Filter 191 */ { -0.0010327352f, 0.0031784322f}, { -0.0037159717f, -0.0005885521f}, { -0.0000000000f, 0.0024320363f}, { -0.0049666219f, 0.0007866356f}, { 0.0013333687f, 0.0041036870f}, { -0.0110530868f, 0.0056318290f}, { 0.0025114767f, 0.0034567511f}, { -0.0277423727f, 0.0277423726f}, { -0.0321881057f, -0.0233860277f}, { -0.0208540454f, 0.0409283686f}, { -0.1892688035f, -0.0614971622f}, { 0.0504793852f, -0.3187142949f}, { 0.3234303845f, 0.0000000000f}, { 0.0313889711f, 0.1981821640f}, { -0.0449835104f, 0.0146160285f}, { 0.0178808444f, 0.0350931330f}, { -0.0319837501f, 0.0232375547f}, { -0.0032521646f, -0.0032521646f}, { -0.0072818054f, 0.0100225453f}, { -0.0039641299f, -0.0020198251f}, { -0.0015426375f, 0.0047477499f}, { -0.0024716928f, -0.0003914777f}, { 0.0000000000f, 0.0037242426f}, { -0.0033401247f, 0.0005290238f}, { 0.0003525575f, 0.0010850603f}, { -0.0020683708f, 0.0010538876f} } }; iaxmodem-1.2.0/lib/spandsp/src/logging.c0000644000175000017500000001716711150047216017463 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * logging.c - error and debug logging. * * Written by Steve Underwood * * Copyright (C) 2005 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: logging.c,v 1.26 2008/05/13 13:17:22 steveu Exp $ */ /*! \file */ #if defined(HAVE_CONFIG_H) #include #endif #include #include #include #include #include #include #include #include #include #include #include #include "spandsp/telephony.h" #include "spandsp/logging.h" static void default_message_handler(int level, const char *text); static message_handler_func_t __span_message = *default_message_handler; static error_handler_func_t __span_error = NULL; /* Note that this list *must* match the enum definition in logging.h */ static const char *severities[] = { "NONE", "ERROR", "WARNING", "PROTOCOL_ERROR", "PROTOCOL_WARNING", "FLOW", "FLOW 2", "FLOW 3", "DEBUG 1", "DEBUG 2", "DEBUG 3" }; static void default_message_handler(int level, const char *text) { fprintf(stderr, "%s", text); } /*- End of function --------------------------------------------------------*/ int span_log_test(logging_state_t *s, int level) { if (s && (s->level & SPAN_LOG_SEVERITY_MASK) >= (level & SPAN_LOG_SEVERITY_MASK)) return TRUE; return FALSE; } /*- End of function --------------------------------------------------------*/ int span_log(logging_state_t *s, int level, const char *format, ...) { char msg[1024 + 1]; va_list arg_ptr; int len; struct tm *tim; struct timeval nowx; time_t now; if (span_log_test(s, level)) { va_start(arg_ptr, format); len = 0; if ((level & SPAN_LOG_SUPPRESS_LABELLING) == 0) { if ((s->level & SPAN_LOG_SHOW_DATE)) { gettimeofday(&nowx, NULL); now = nowx.tv_sec; tim = gmtime(&now); len += snprintf(msg + len, 1024 - len, "%04d/%02d/%02d %02d:%02d:%02d.%03d ", tim->tm_year + 1900, tim->tm_mon + 1, tim->tm_mday, tim->tm_hour, tim->tm_min, tim->tm_sec, (int) nowx.tv_usec/1000); } /*endif*/ if ((s->level & SPAN_LOG_SHOW_SAMPLE_TIME)) { now = s->elapsed_samples/s->samples_per_second; tim = gmtime(&now); len += snprintf(msg + len, 1024 - len, "%02d:%02d:%02d.%03d ", tim->tm_hour, tim->tm_min, tim->tm_sec, (int) (s->elapsed_samples%s->samples_per_second)*1000/s->samples_per_second); } /*endif*/ if ((s->level & SPAN_LOG_SHOW_SEVERITY) && (level & SPAN_LOG_SEVERITY_MASK) <= SPAN_LOG_DEBUG_3) len += snprintf(msg + len, 1024 - len, "%s ", severities[level & SPAN_LOG_SEVERITY_MASK]); /*endif*/ if ((s->level & SPAN_LOG_SHOW_PROTOCOL) && s->protocol) len += snprintf(msg + len, 1024 - len, "%s ", s->protocol); /*endif*/ if ((s->level & SPAN_LOG_SHOW_TAG) && s->tag) len += snprintf(msg + len, 1024 - len, "%s ", s->tag); /*endif*/ } /*endif*/ len += vsnprintf(msg + len, 1024 - len, format, arg_ptr); if (s->span_error && level == SPAN_LOG_ERROR) s->span_error(msg); else if (__span_error && level == SPAN_LOG_ERROR) __span_error(msg); else if (s->span_message) s->span_message(level, msg); else if (__span_message) __span_message(level, msg); /*endif*/ va_end(arg_ptr); return 1; } /*endif*/ return 0; } /*- End of function --------------------------------------------------------*/ int span_log_buf(logging_state_t *s, int level, const char *tag, const uint8_t *buf, int len) { char msg[1024]; int i; int msg_len; if (span_log_test(s, level)) { msg_len = 0; if (tag) msg_len += snprintf(msg + msg_len, 1024 - msg_len, "%s", tag); for (i = 0; i < len && msg_len < 800; i++) msg_len += snprintf(msg + msg_len, 1024 - msg_len, " %02x", buf[i]); msg_len += snprintf(msg + msg_len, 1024 - msg_len, "\n"); return span_log(s, level, msg); } return 0; } /*- End of function --------------------------------------------------------*/ int span_log_init(logging_state_t *s, int level, const char *tag) { s->span_error = __span_error; s->span_message = __span_message; s->level = level; s->tag = tag; s->protocol = NULL; s->samples_per_second = SAMPLE_RATE; s->elapsed_samples = 0; return 0; } /*- End of function --------------------------------------------------------*/ int span_log_set_level(logging_state_t *s, int level) { s->level = level; return 0; } /*- End of function --------------------------------------------------------*/ int span_log_set_tag(logging_state_t *s, const char *tag) { s->tag = tag; return 0; } /*- End of function --------------------------------------------------------*/ int span_log_set_protocol(logging_state_t *s, const char *protocol) { s->protocol = protocol; return 0; } /*- End of function --------------------------------------------------------*/ int span_log_set_sample_rate(logging_state_t *s, int samples_per_second) { s->samples_per_second = samples_per_second; return 0; } /*- End of function --------------------------------------------------------*/ int span_log_bump_samples(logging_state_t *s, int samples) { s->elapsed_samples += samples; return 0; } /*- End of function --------------------------------------------------------*/ void span_log_set_message_handler(logging_state_t *s, message_handler_func_t func) { s->span_message = func; } /*- End of function --------------------------------------------------------*/ void span_log_set_error_handler(logging_state_t *s, error_handler_func_t func) { s->span_error = func; } /*- End of function --------------------------------------------------------*/ void span_set_message_handler(message_handler_func_t func) { __span_message = func; } /*- End of function --------------------------------------------------------*/ void span_set_error_handler(error_handler_func_t func) { __span_error = func; } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/t38_terminal.c0000644000175000017500000013136311150047216020341 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * t38_terminal.c - T.38 termination, less the packet exchange part * * Written by Steve Underwood * * Copyright (C) 2005, 2006 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: t38_terminal.c,v 1.98 2008/07/25 13:56:54 steveu Exp $ */ /*! \file */ #if defined(HAVE_CONFIG_H) #include "config.h" #endif #include #include #include #include #include #include #include #include "floating_fudge.h" #if defined(HAVE_TGMATH_H) #include #endif #if defined(HAVE_MATH_H) #include #endif #include #include #include "spandsp/telephony.h" #include "spandsp/logging.h" #include "spandsp/bit_operations.h" #include "spandsp/queue.h" #include "spandsp/power_meter.h" #include "spandsp/complex.h" #include "spandsp/tone_generate.h" #include "spandsp/async.h" #include "spandsp/hdlc.h" #include "spandsp/fsk.h" #include "spandsp/v29rx.h" #include "spandsp/v29tx.h" #include "spandsp/v27ter_rx.h" #include "spandsp/v27ter_tx.h" #include "spandsp/v17rx.h" #include "spandsp/v17tx.h" #include "spandsp/t4.h" #include "spandsp/t30_fcf.h" #include "spandsp/t35.h" #include "spandsp/t30.h" #include "spandsp/t30_api.h" #include "spandsp/t30_logging.h" #include "spandsp/t38_core.h" #include "spandsp/t38_terminal.h" /* Settings suitable for paced transmission over a UDP transport */ #define MS_PER_TX_CHUNK 30 #define INDICATOR_TX_COUNT 3 #define DATA_TX_COUNT 1 #define DATA_END_TX_COUNT 3 /* Settings suitable for unpaced transmission over a TCP transport */ #define MAX_OCTETS_PER_UNPACED_CHUNK 300 /* Backstop timeout if reception of packets stops in the middle of a burst */ #define MID_RX_TIMEOUT 15000 #define T38_CHUNKING_MERGE_FCS_WITH_DATA 0x0001 #define T38_CHUNKING_WHOLE_FRAMES 0x0002 #define T38_CHUNKING_ALLOW_TEP_TIME 0x0004 enum { T38_TIMED_STEP_NONE = 0, T38_TIMED_STEP_NON_ECM_MODEM, T38_TIMED_STEP_NON_ECM_MODEM_2, T38_TIMED_STEP_NON_ECM_MODEM_3, T38_TIMED_STEP_NON_ECM_MODEM_4, T38_TIMED_STEP_NON_ECM_MODEM_5, T38_TIMED_STEP_HDLC_MODEM, T38_TIMED_STEP_HDLC_MODEM_2, T38_TIMED_STEP_HDLC_MODEM_3, T38_TIMED_STEP_HDLC_MODEM_4, T38_TIMED_STEP_CED, T38_TIMED_STEP_CED_2, T38_TIMED_STEP_CNG, T38_TIMED_STEP_CNG_2, T38_TIMED_STEP_PAUSE }; static int extra_bits_in_stuffed_frame(const uint8_t buf[], int len) { int bitstream; int ones; int stuffed; int i; int j; bitstream = 0; ones = 0; stuffed = 0; /* We should really append the CRC, and included the stuffed bits for that, to get the exact number of bits in the frame. */ //len = crc_itu16_append(buf, len); for (i = 0; i < len; i++) { bitstream = buf[i]; for (j = 0; j < 8; j++) { if ((bitstream & 1)) { if (++ones >= 5) { ones = 0; stuffed++; } } else { ones = 0; } bitstream >>= 1; } } /* The total length of the frame is: the number of bits in the body + the number of additional bits in the body due to stuffing + the number of bits in the CRC + the number of additional bits in the CRC due to stuffing + 16 bits for the two terminating flag octets. Lets just allow 3 bits for the CRC, which is the worst case. It avoids calculating the real CRC, and the worst it can do is cause a flag octet's worth of additional output. */ return stuffed + 16 + 3 + 16; } /*- End of function --------------------------------------------------------*/ static int process_rx_missing(t38_core_state_t *t, void *user_data, int rx_seq_no, int expected_seq_no) { t38_terminal_state_t *s; s = (t38_terminal_state_t *) user_data; s->t38_fe.missing_data = TRUE; return 0; } /*- End of function --------------------------------------------------------*/ static int process_rx_indicator(t38_core_state_t *t, void *user_data, int indicator) { t38_terminal_state_t *s; t38_terminal_front_end_state_t *fe; s = (t38_terminal_state_t *) user_data; fe = &s->t38_fe; if (t->current_rx_indicator == indicator) { /* This is probably due to the far end repeating itself, or slipping preamble messages in between HDLC frames. T.38/V.1.3 tells us to ignore it. Its harmless. */ return 0; } /* In termination mode we don't care very much about indicators telling us training is starting. We only care about V.21 preamble starting, for timeout control, and the actual data. */ switch (indicator) { case T38_IND_NO_SIGNAL: if (t->current_rx_indicator == T38_IND_V21_PREAMBLE && (fe->current_rx_type == T30_MODEM_V21 || fe->current_rx_type == T30_MODEM_CNG)) { t30_hdlc_accept(&(s->t30), NULL, PUTBIT_CARRIER_DOWN, TRUE); } fe->timeout_rx_samples = 0; t30_front_end_status(&(s->t30), T30_FRONT_END_SIGNAL_ABSENT); break; case T38_IND_CNG: break; case T38_IND_CED: break; case T38_IND_V21_PREAMBLE: /* Some people pop these preamble indicators between HDLC frames, so we need to be tolerant of that. */ fe->timeout_rx_samples = fe->samples + ms_to_samples(MID_RX_TIMEOUT); t30_front_end_status(&(s->t30), T30_FRONT_END_SIGNAL_PRESENT); break; case T38_IND_V27TER_2400_TRAINING: case T38_IND_V27TER_4800_TRAINING: case T38_IND_V29_7200_TRAINING: case T38_IND_V29_9600_TRAINING: case T38_IND_V17_7200_SHORT_TRAINING: case T38_IND_V17_7200_LONG_TRAINING: case T38_IND_V17_9600_SHORT_TRAINING: case T38_IND_V17_9600_LONG_TRAINING: case T38_IND_V17_12000_SHORT_TRAINING: case T38_IND_V17_12000_LONG_TRAINING: case T38_IND_V17_14400_SHORT_TRAINING: case T38_IND_V17_14400_LONG_TRAINING: case T38_IND_V33_12000_TRAINING: case T38_IND_V33_14400_TRAINING: fe->timeout_rx_samples = fe->samples + ms_to_samples(MID_RX_TIMEOUT); t30_front_end_status(&(s->t30), T30_FRONT_END_SIGNAL_PRESENT); break; case T38_IND_V8_ANSAM: case T38_IND_V8_SIGNAL: case T38_IND_V34_CNTL_CHANNEL_1200: case T38_IND_V34_PRI_CHANNEL: case T38_IND_V34_CC_RETRAIN: t30_front_end_status(&(s->t30), T30_FRONT_END_SIGNAL_PRESENT); break; default: t30_front_end_status(&(s->t30), T30_FRONT_END_SIGNAL_ABSENT); break; } fe->hdlc_rx.len = 0; fe->missing_data = FALSE; return 0; } /*- End of function --------------------------------------------------------*/ static int process_rx_data(t38_core_state_t *t, void *user_data, int data_type, int field_type, const uint8_t *buf, int len) { t38_terminal_state_t *s; t38_terminal_front_end_state_t *fe; #if defined(_MSC_VER) uint8_t *buf2 = alloca(len); #else uint8_t buf2[len]; #endif s = (t38_terminal_state_t *) user_data; fe = &s->t38_fe; #if 0 /* In termination mode we don't care very much what the data type is. */ switch (data_type) { case T38_DATA_V21: case T38_DATA_V27TER_2400: case T38_DATA_V27TER_4800: case T38_DATA_V29_7200: case T38_DATA_V29_9600: case T38_DATA_V17_7200: case T38_DATA_V17_9600: case T38_DATA_V17_12000: case T38_DATA_V17_14400: case T38_DATA_V8: case T38_DATA_V34_PRI_RATE: case T38_DATA_V34_CC_1200: case T38_DATA_V34_PRI_CH: case T38_DATA_V33_12000: case T38_DATA_V33_14400: default: break; } #endif switch (field_type) { case T38_FIELD_HDLC_DATA: if (fe->timeout_rx_samples == 0) { /* HDLC can just start without any signal indicator on some platforms, even when there is zero packet lost. Nasty, but true. Its a good idea to be tolerant of loss, though, so accepting a sudden start of HDLC data is the right thing to do. */ fe->timeout_rx_samples = fe->samples + ms_to_samples(MID_RX_TIMEOUT); t30_front_end_status(&(s->t30), T30_FRONT_END_SIGNAL_PRESENT); /* All real HDLC messages in the FAX world start with 0xFF. If this one is not starting with 0xFF it would appear some octets must have been missed before this one. */ if (buf[0] != 0xFF) fe->missing_data = TRUE; } if (fe->hdlc_rx.len + len <= T38_MAX_HDLC_LEN) { bit_reverse(fe->hdlc_rx.buf + fe->hdlc_rx.len, buf, len); fe->hdlc_rx.len += len; } fe->timeout_rx_samples = fe->samples + ms_to_samples(MID_RX_TIMEOUT); break; case T38_FIELD_HDLC_FCS_OK: if (len > 0) { span_log(&s->logging, SPAN_LOG_WARNING, "There is data in a T38_FIELD_HDLC_FCS_OK!\n"); /* The sender has incorrectly included data in this message. It is unclear what we should do with it, to maximise tolerance of buggy implementations. */ } /* Some T.38 implementations send multiple T38_FIELD_HDLC_FCS_OK messages, in IFP packets with incrementing sequence numbers, which are actually repeats. They get through to this point because of the incrementing sequence numbers. We need to filter them here in a context sensitive manner. */ if (t->current_rx_data_type != data_type || t->current_rx_field_type != field_type) { span_log(&s->logging, SPAN_LOG_FLOW, "Type %s - CRC OK (%s)\n", (fe->hdlc_rx.len >= 3) ? t30_frametype(fe->hdlc_rx.buf[2]) : "???", (fe->missing_data) ? "missing octets" : "clean"); t30_hdlc_accept(&(s->t30), fe->hdlc_rx.buf, fe->hdlc_rx.len, !fe->missing_data); } fe->hdlc_rx.len = 0; fe->missing_data = FALSE; fe->timeout_rx_samples = fe->samples + ms_to_samples(MID_RX_TIMEOUT); break; case T38_FIELD_HDLC_FCS_BAD: if (len > 0) { span_log(&s->logging, SPAN_LOG_WARNING, "There is data in a T38_FIELD_HDLC_FCS_BAD!\n"); /* The sender has incorrectly included data in this message. We can safely ignore it, as the bad FCS means we will throw away the whole message, anyway. */ } /* Some T.38 implementations send multiple T38_FIELD_HDLC_FCS_BAD messages, in IFP packets with incrementing sequence numbers, which are actually repeats. They get through to this point because of the incrementing sequence numbers. We need to filter them here in a context sensitive manner. */ if (t->current_rx_data_type != data_type || t->current_rx_field_type != field_type) { span_log(&s->logging, SPAN_LOG_FLOW, "Type %s - CRC bad (%s)\n", (fe->hdlc_rx.len >= 3) ? t30_frametype(fe->hdlc_rx.buf[2]) : "???", (fe->missing_data) ? "missing octets" : "clean"); t30_hdlc_accept(&(s->t30), fe->hdlc_rx.buf, fe->hdlc_rx.len, FALSE); } fe->hdlc_rx.len = 0; fe->missing_data = FALSE; fe->timeout_rx_samples = fe->samples + ms_to_samples(MID_RX_TIMEOUT); break; case T38_FIELD_HDLC_FCS_OK_SIG_END: if (len > 0) { span_log(&s->logging, SPAN_LOG_WARNING, "There is data in a T38_FIELD_HDLC_FCS_OK_SIG_END!\n"); /* The sender has incorrectly included data in this message. It is unclear what we should do with it, to maximise tolerance of buggy implementations. */ } /* Some T.38 implementations send multiple T38_FIELD_HDLC_FCS_OK_SIG_END messages, in IFP packets with incrementing sequence numbers, which are actually repeats. They get through to this point because of the incrementing sequence numbers. We need to filter them here in a context sensitive manner. */ if (t->current_rx_data_type != data_type || t->current_rx_field_type != field_type) { span_log(&s->logging, SPAN_LOG_FLOW, "Type %s - CRC OK, sig end (%s)\n", (fe->hdlc_rx.len >= 3) ? t30_frametype(fe->hdlc_rx.buf[2]) : "???", (fe->missing_data) ? "missing octets" : "clean"); t30_hdlc_accept(&(s->t30), fe->hdlc_rx.buf, fe->hdlc_rx.len, !fe->missing_data); t30_hdlc_accept(&(s->t30), NULL, PUTBIT_CARRIER_DOWN, TRUE); } fe->hdlc_rx.len = 0; fe->missing_data = FALSE; fe->timeout_rx_samples = 0; break; case T38_FIELD_HDLC_FCS_BAD_SIG_END: if (len > 0) { span_log(&s->logging, SPAN_LOG_WARNING, "There is data in a T38_FIELD_HDLC_FCS_BAD_SIG_END!\n"); /* The sender has incorrectly included data in this message. We can safely ignore it, as the bad FCS means we will throw away the whole message, anyway. */ } /* Some T.38 implementations send multiple T38_FIELD_HDLC_FCS_BAD_SIG_END messages, in IFP packets with incrementing sequence numbers, which are actually repeats. They get through to this point because of the incrementing sequence numbers. We need to filter them here in a context sensitive manner. */ if (t->current_rx_data_type != data_type || t->current_rx_field_type != field_type) { span_log(&s->logging, SPAN_LOG_FLOW, "Type %s - CRC bad, sig end (%s)\n", (fe->hdlc_rx.len >= 3) ? t30_frametype(fe->hdlc_rx.buf[2]) : "???", (fe->missing_data) ? "missing octets" : "clean"); t30_hdlc_accept(&(s->t30), fe->hdlc_rx.buf, fe->hdlc_rx.len, FALSE); t30_hdlc_accept(&(s->t30), NULL, PUTBIT_CARRIER_DOWN, TRUE); } fe->hdlc_rx.len = 0; fe->missing_data = FALSE; fe->timeout_rx_samples = 0; break; case T38_FIELD_HDLC_SIG_END: if (len > 0) { span_log(&s->logging, SPAN_LOG_WARNING, "There is data in a T38_FIELD_HDLC_SIG_END!\n"); /* The sender has incorrectly included data in this message, but there seems nothing meaningful it could be. There could not be an FCS good/bad report beyond this. */ } /* Some T.38 implementations send multiple T38_FIELD_HDLC_SIG_END messages, in IFP packets with incrementing sequence numbers, which are actually repeats. They get through to this point because of the incrementing sequence numbers. We need to filter them here in a context sensitive manner. */ if (t->current_rx_data_type != data_type || t->current_rx_field_type != field_type) { /* WORKAROUND: At least some Mediatrix boxes have a bug, where they can send this message at the end of non-ECM data. We need to tolerate this. We use the generic receive complete indication, rather than the specific HDLC carrier down. */ /* This message is expected under 2 circumstances. One is as an alternative to T38_FIELD_HDLC_FCS_OK_SIG_END - i.e. they send T38_FIELD_HDLC_FCS_OK, and then T38_FIELD_HDLC_SIG_END when the carrier actually drops. The other is because the HDLC signal drops unexpectedly - i.e. not just after a final frame. */ fe->hdlc_rx.len = 0; fe->missing_data = FALSE; fe->timeout_rx_samples = 0; t30_front_end_status(&(s->t30), T30_FRONT_END_RECEIVE_COMPLETE); } break; case T38_FIELD_T4_NON_ECM_DATA: if (!fe->rx_signal_present) { t30_non_ecm_put_bit(&(s->t30), PUTBIT_TRAINING_SUCCEEDED); fe->rx_signal_present = TRUE; } bit_reverse(buf2, buf, len); t30_non_ecm_put_chunk(&(s->t30), buf2, len); fe->timeout_rx_samples = fe->samples + ms_to_samples(MID_RX_TIMEOUT); break; case T38_FIELD_T4_NON_ECM_SIG_END: /* Some T.38 implementations send multiple T38_FIELD_T4_NON_ECM_SIG_END messages, in IFP packets with incrementing sequence numbers, which are actually repeats. They get through to this point because of the incrementing sequence numbers. We need to filter them here in a context sensitive manner. */ if (t->current_rx_data_type != data_type || t->current_rx_field_type != field_type) { if (len > 0) { if (!fe->rx_signal_present) { t30_non_ecm_put_bit(&(s->t30), PUTBIT_TRAINING_SUCCEEDED); fe->rx_signal_present = TRUE; } bit_reverse(buf2, buf, len); t30_non_ecm_put_chunk(&(s->t30), buf2, len); } /* WORKAROUND: At least some Mediatrix boxes have a bug, where they can send HDLC signal end where they should send non-ECM signal end. It is possible they also do the opposite. We need to tolerate this, so we use the generic receive complete indication, rather than the specific non-ECM carrier down. */ t30_front_end_status(&(s->t30), T30_FRONT_END_RECEIVE_COMPLETE); } fe->rx_signal_present = FALSE; fe->timeout_rx_samples = 0; break; case T38_FIELD_CM_MESSAGE: if (len >= 1) span_log(&s->logging, SPAN_LOG_FLOW, "CM profile %d - %s\n", buf[0] - '0', t38_cm_profile_to_str(buf[0])); else span_log(&s->logging, SPAN_LOG_FLOW, "Bad length for CM message - %d\n", len); break; case T38_FIELD_JM_MESSAGE: if (len >= 2) span_log(&s->logging, SPAN_LOG_FLOW, "JM - %s\n", t38_jm_to_str(buf, len)); else span_log(&s->logging, SPAN_LOG_FLOW, "Bad length for JM message - %d\n", len); break; case T38_FIELD_CI_MESSAGE: if (len >= 1) span_log(&s->logging, SPAN_LOG_FLOW, "CI 0x%X\n", buf[0]); else span_log(&s->logging, SPAN_LOG_FLOW, "Bad length for CI message - %d\n", len); break; case T38_FIELD_V34RATE: if (len >= 3) { fe->t38.v34_rate = t38_v34rate_to_bps(buf, len); span_log(&s->logging, SPAN_LOG_FLOW, "V.34 rate %d bps\n", fe->t38.v34_rate); } else { span_log(&s->logging, SPAN_LOG_FLOW, "Bad length for V34rate message - %d\n", len); } break; default: break; } return 0; } /*- End of function --------------------------------------------------------*/ static void send_hdlc(void *user_data, const uint8_t *msg, int len) { t38_terminal_state_t *s; s = (t38_terminal_state_t *) user_data; if (len <= 0) { s->t38_fe.tx.len = -1; } else { s->t38_fe.tx.extra_bits = extra_bits_in_stuffed_frame(msg, len); bit_reverse(s->t38_fe.tx.buf, msg, len); s->t38_fe.tx.len = len; s->t38_fe.tx.ptr = 0; } } /*- End of function --------------------------------------------------------*/ static __inline__ int bits_to_samples(t38_terminal_state_t *s, int bits) { /* This does not handle fractions properly, so they may accumulate. They shouldn't be able to accumulate far enough to be troublesome. */ /* TODO: Is the above statement accurate when sending a long string of octets, one per IFP packet, at V.21 rate? */ if (s->t38_fe.ms_per_tx_chunk == 0) return 0; return bits*8000/s->t38_fe.bit_rate; } /*- End of function --------------------------------------------------------*/ static void set_octets_per_data_packet(t38_terminal_state_t *s, int bit_rate) { s->t38_fe.bit_rate = bit_rate; if (s->t38_fe.ms_per_tx_chunk == 0) { s->t38_fe.octets_per_data_packet = MAX_OCTETS_PER_UNPACED_CHUNK; } else { s->t38_fe.octets_per_data_packet = s->t38_fe.ms_per_tx_chunk*bit_rate/(8*1000); /* Make sure we have a positive number (i.e. we didn't truncate to zero). */ if (s->t38_fe.octets_per_data_packet < 1) s->t38_fe.octets_per_data_packet = 1; } } /*- End of function --------------------------------------------------------*/ int t38_terminal_send_timeout(t38_terminal_state_t *s, int samples) { int len; int i; int previous; uint8_t buf[MAX_OCTETS_PER_UNPACED_CHUNK + 50]; t38_terminal_front_end_state_t *fe; t38_data_field_t data_fields[2]; /* The times for training, the optional TEP, and the HDLC preamble, for all the modem options, in ms. Note that the preamble for V.21 is 1s+-15%, and for the other modems is 200ms+100ms. */ static const struct { int tep; int training; int flags; } startup_time[] = { { 0, 0, 0}, /* T38_IND_NO_SIGNAL */ { 0, 0, 0}, /* T38_IND_CNG */ { 0, 0, 0}, /* T38_IND_CED */ { 0, 0, 1000}, /* T38_IND_V21_PREAMBLE */ /* TODO: 850ms should be OK for this, but it causes trouble with some ATAs. Why? */ { 215, 943, 200}, /* T38_IND_V27TER_2400_TRAINING */ { 215, 708, 200}, /* T38_IND_V27TER_4800_TRAINING */ { 215, 234, 200}, /* T38_IND_V29_7200_TRAINING */ { 215, 234, 200}, /* T38_IND_V29_9600_TRAINING */ { 215, 142, 200}, /* T38_IND_V17_7200_SHORT_TRAINING */ { 215, 1393, 200}, /* T38_IND_V17_7200_LONG_TRAINING */ { 215, 142, 200}, /* T38_IND_V17_9600_SHORT_TRAINING */ { 215, 1393, 200}, /* T38_IND_V17_9600_LONG_TRAINING */ { 215, 142, 200}, /* T38_IND_V17_12000_SHORT_TRAINING */ { 215, 1393, 200}, /* T38_IND_V17_12000_LONG_TRAINING */ { 215, 142, 200}, /* T38_IND_V17_14400_SHORT_TRAINING */ { 215, 1393, 200}, /* T38_IND_V17_14400_LONG_TRAINING */ { 215, 0, 0}, /* T38_IND_V8_ANSAM */ { 215, 0, 0}, /* T38_IND_V8_SIGNAL */ { 215, 0, 0}, /* T38_IND_V34_CNTL_CHANNEL_1200 */ { 215, 0, 0}, /* T38_IND_V34_PRI_CHANNEL */ { 215, 0, 0}, /* T38_IND_V34_CC_RETRAIN */ { 215, 0, 0}, /* T38_IND_V33_12000_TRAINING */ { 215, 0, 0} /* T38_IND_V33_14400_TRAINING */ }; fe = &s->t38_fe; if (fe->current_rx_type == T30_MODEM_DONE || fe->current_tx_type == T30_MODEM_DONE) return TRUE; fe->samples += samples; t30_timer_update(&s->t30, samples); if (fe->timeout_rx_samples && fe->samples > fe->timeout_rx_samples) { span_log(&s->logging, SPAN_LOG_FLOW, "Timeout mid-receive\n"); fe->timeout_rx_samples = 0; t30_front_end_status(&(s->t30), T30_FRONT_END_RECEIVE_COMPLETE); } if (fe->timed_step == T38_TIMED_STEP_NONE) return FALSE; /* Wait until the right time comes along, unless we are working in "no delays" mode, while talking to an IAF terminal. */ if (fe->ms_per_tx_chunk && fe->samples < fe->next_tx_samples) return FALSE; /* Its time to send something */ switch (fe->timed_step) { case T38_TIMED_STEP_NON_ECM_MODEM: /* Create a 75ms silence */ if (fe->t38.current_tx_indicator != T38_IND_NO_SIGNAL) t38_core_send_indicator(&fe->t38, T38_IND_NO_SIGNAL, fe->t38.indicator_tx_count); fe->timed_step = T38_TIMED_STEP_NON_ECM_MODEM_2; fe->next_tx_samples += ms_to_samples(75); break; case T38_TIMED_STEP_NON_ECM_MODEM_2: /* Switch on a fast modem, and give the training time to complete */ t38_core_send_indicator(&fe->t38, fe->next_tx_indicator, fe->t38.indicator_tx_count); fe->timed_step = T38_TIMED_STEP_NON_ECM_MODEM_3; fe->next_tx_samples += ms_to_samples(startup_time[fe->next_tx_indicator].training); if ((fe->chunking_modes & T38_CHUNKING_ALLOW_TEP_TIME)) fe->next_tx_samples += ms_to_samples(startup_time[fe->next_tx_indicator].tep); break; case T38_TIMED_STEP_NON_ECM_MODEM_3: /* Send a chunk of non-ECM image data */ /* T.38 says it is OK to send the last of the non-ECM data in the signal end message. However, I think the early versions of T.38 said the signal end message should not contain data. Hopefully, following the current spec will not cause compatibility issues. */ len = t30_non_ecm_get_chunk(&s->t30, buf, fe->octets_per_data_packet); bit_reverse(buf, buf, len); if (len < fe->octets_per_data_packet) { /* That's the end of the image data. Do a little padding now */ memset(buf + len, 0, fe->octets_per_data_packet - len); fe->trailer_bytes = 3*fe->octets_per_data_packet + len; len = fe->octets_per_data_packet; fe->timed_step = T38_TIMED_STEP_NON_ECM_MODEM_4; } t38_core_send_data(&fe->t38, fe->current_tx_data_type, T38_FIELD_T4_NON_ECM_DATA, buf, len, fe->t38.data_tx_count); fe->next_tx_samples += bits_to_samples(s, 8*len); break; case T38_TIMED_STEP_NON_ECM_MODEM_4: /* This pads the end of the data with some zeros. If we just stop abruptly at the end of the EOLs, some ATAs fail to clean up properly before shutting down their transmit modem, and the last few rows of the image get corrupted. Simply delaying the no-signal message does not help for all implentations. It often appears to be ignored. */ len = fe->octets_per_data_packet; fe->trailer_bytes -= len; if (fe->trailer_bytes <= 0) { len += fe->trailer_bytes; memset(buf, 0, len); t38_core_send_data(&fe->t38, fe->current_tx_data_type, T38_FIELD_T4_NON_ECM_SIG_END, buf, len, fe->t38.data_end_tx_count); fe->timed_step = T38_TIMED_STEP_NON_ECM_MODEM_5; /* Allow a bit more time than the data will take to play out, to ensure the far ATA does not cut things short. */ fe->next_tx_samples += (bits_to_samples(s, 8*len) + ms_to_samples(60)); break; } memset(buf, 0, len); t38_core_send_data(&fe->t38, fe->current_tx_data_type, T38_FIELD_T4_NON_ECM_DATA, buf, len, fe->t38.data_tx_count); fe->next_tx_samples += bits_to_samples(s, 8*len); break; case T38_TIMED_STEP_NON_ECM_MODEM_5: /* This should not be needed, since the message above indicates the end of the signal, but it seems like it can improve compatibility with quirky implementations. */ t38_core_send_indicator(&fe->t38, T38_IND_NO_SIGNAL, fe->t38.indicator_tx_count); fe->timed_step = T38_TIMED_STEP_NONE; t30_front_end_status(&(s->t30), T30_FRONT_END_SEND_STEP_COMPLETE); break; case T38_TIMED_STEP_HDLC_MODEM: /* Send HDLC preambling */ t38_core_send_indicator(&fe->t38, fe->next_tx_indicator, fe->t38.indicator_tx_count); fe->next_tx_samples += ms_to_samples(startup_time[fe->next_tx_indicator].training + startup_time[fe->next_tx_indicator].flags); if (fe->chunking_modes & T38_CHUNKING_ALLOW_TEP_TIME) fe->next_tx_samples += ms_to_samples(startup_time[fe->next_tx_indicator].tep); fe->timed_step = T38_TIMED_STEP_HDLC_MODEM_2; break; case T38_TIMED_STEP_HDLC_MODEM_2: /* Send a chunk of HDLC data */ i = fe->tx.len - fe->tx.ptr; if (fe->octets_per_data_packet >= i) { /* The last part of an HDLC frame */ if (fe->chunking_modes & T38_CHUNKING_MERGE_FCS_WITH_DATA) { /* Copy the data, as we might be about to refill the buffer it is in */ memcpy(buf, &fe->tx.buf[fe->tx.ptr], i); data_fields[0].field_type = T38_FIELD_HDLC_DATA; data_fields[0].field = buf; data_fields[0].field_len = i; /* Now see about the next HDLC frame. This will tell us whether to send FCS_OK or FCS_OK_SIG_END */ previous = fe->current_tx_data_type; fe->tx.ptr = 0; fe->tx.len = 0; t30_front_end_status(&(s->t30), T30_FRONT_END_SEND_STEP_COMPLETE); /* The above step should have got the next HDLC step ready - either another frame, or an instruction to stop transmission. */ if (fe->tx.len < 0) { data_fields[1].field_type = T38_FIELD_HDLC_FCS_OK_SIG_END; fe->timed_step = T38_TIMED_STEP_HDLC_MODEM_4; /* We add a bit of extra time here, as with some implementations the carrier falling too abruptly causes data loss. */ fe->next_tx_samples += (bits_to_samples(s, i*8 + fe->tx.extra_bits) + ms_to_samples(100)); } else { data_fields[1].field_type = T38_FIELD_HDLC_FCS_OK; fe->timed_step = T38_TIMED_STEP_HDLC_MODEM_2; fe->next_tx_samples += bits_to_samples(s, i*8 + fe->tx.extra_bits); } data_fields[1].field = NULL; data_fields[1].field_len = 0; t38_core_send_data_multi_field(&fe->t38, fe->current_tx_data_type, data_fields, 2, fe->t38.data_tx_count); } else { t38_core_send_data(&fe->t38, fe->current_tx_data_type, T38_FIELD_HDLC_DATA, &fe->tx.buf[fe->tx.ptr], i, fe->t38.data_tx_count); fe->timed_step = T38_TIMED_STEP_HDLC_MODEM_3; fe->next_tx_samples += bits_to_samples(s, i*8); } break; } t38_core_send_data(&fe->t38, fe->current_tx_data_type, T38_FIELD_HDLC_DATA, &fe->tx.buf[fe->tx.ptr], fe->octets_per_data_packet, fe->t38.data_tx_count); fe->tx.ptr += fe->octets_per_data_packet; fe->next_tx_samples += bits_to_samples(s, fe->octets_per_data_packet*8); break; case T38_TIMED_STEP_HDLC_MODEM_3: /* End of HDLC frame */ previous = fe->current_tx_data_type; fe->tx.ptr = 0; fe->tx.len = 0; t30_front_end_status(&(s->t30), T30_FRONT_END_SEND_STEP_COMPLETE); /* The above step should have got the next HDLC step ready - either another frame, or an instruction to stop transmission. */ if (fe->tx.len < 0) { /* End of transmission */ t38_core_send_data(&fe->t38, previous, T38_FIELD_HDLC_FCS_OK_SIG_END, NULL, 0, fe->t38.data_end_tx_count); fe->timed_step = T38_TIMED_STEP_HDLC_MODEM_4; fe->next_tx_samples += (bits_to_samples(s, fe->tx.extra_bits) + ms_to_samples(100)); break; } if (fe->tx.len == 0) { /* Now, how did we get here? We have finished a frame, but have no new frame to send, and no end of transmission condition. */ span_log(&s->logging, SPAN_LOG_FLOW, "No new frame or end transmission condition.\n"); } /* Finish the current frame off, and prepare for the next one. */ t38_core_send_data(&fe->t38, previous, T38_FIELD_HDLC_FCS_OK, NULL, 0, fe->t38.data_tx_count); fe->timed_step = T38_TIMED_STEP_HDLC_MODEM_2; /* We should now wait 3 octet times - the duration of the FCS + a flag octet - and send the next chunk. To give a little more latitude, and allow for stuffing in the FCS, add time for an extra flag octet. */ fe->next_tx_samples += bits_to_samples(s, fe->tx.extra_bits); break; case T38_TIMED_STEP_HDLC_MODEM_4: /* Note that some boxes do not like us sending a T38_FIELD_HDLC_SIG_END at this point. A T38_IND_NO_SIGNAL should always be OK. */ t38_core_send_indicator(&fe->t38, T38_IND_NO_SIGNAL, fe->t38.indicator_tx_count); fe->timed_step = T38_TIMED_STEP_NONE; t30_front_end_status(&(s->t30), T30_FRONT_END_SEND_STEP_COMPLETE); break; case T38_TIMED_STEP_CED: /* It seems common practice to start with a no signal indicator, though this is not a specified requirement. Since we should be sending 200ms of silence, starting the delay with a no signal indication makes sense. We do need a 200ms delay, as that is a specification requirement. */ fe->timed_step = T38_TIMED_STEP_CED_2; fe->next_tx_samples = fe->samples + ms_to_samples(200); t38_core_send_indicator(&fe->t38, T38_IND_NO_SIGNAL, fe->t38.indicator_tx_count); fe->current_tx_data_type = T38_DATA_NONE; break; case T38_TIMED_STEP_CED_2: /* Initial 200ms delay over. Send the CED indicator */ fe->next_tx_samples = fe->samples + ms_to_samples(3000); fe->timed_step = T38_TIMED_STEP_PAUSE; t38_core_send_indicator(&fe->t38, T38_IND_CED, fe->t38.indicator_tx_count); fe->current_tx_data_type = T38_DATA_NONE; break; case T38_TIMED_STEP_CNG: /* It seems common practice to start with a no signal indicator, though this is not a specified requirement. Since we should be sending 200ms of silence, starting the delay with a no signal indication makes sense. We do need a 200ms delay, as that is a specification requirement. */ fe->timed_step = T38_TIMED_STEP_CNG_2; fe->next_tx_samples = fe->samples + ms_to_samples(200); t38_core_send_indicator(&fe->t38, T38_IND_NO_SIGNAL, fe->t38.indicator_tx_count); fe->current_tx_data_type = T38_DATA_NONE; break; case T38_TIMED_STEP_CNG_2: /* Initial short delay over. Send the CNG indicator */ fe->timed_step = T38_TIMED_STEP_NONE; t38_core_send_indicator(&fe->t38, T38_IND_CNG, fe->t38.indicator_tx_count); fe->current_tx_data_type = T38_DATA_NONE; break; case T38_TIMED_STEP_PAUSE: /* End of timed pause */ fe->timed_step = T38_TIMED_STEP_NONE; t30_front_end_status(&(s->t30), T30_FRONT_END_SEND_STEP_COMPLETE); break; } return FALSE; } /*- End of function --------------------------------------------------------*/ static void set_rx_type(void *user_data, int type, int short_train, int use_hdlc) { t38_terminal_state_t *s; s = (t38_terminal_state_t *) user_data; span_log(&s->logging, SPAN_LOG_FLOW, "Set rx type %d\n", type); s->t38_fe.current_rx_type = type; } /*- End of function --------------------------------------------------------*/ static void set_tx_type(void *user_data, int type, int short_train, int use_hdlc) { t38_terminal_state_t *s; s = (t38_terminal_state_t *) user_data; span_log(&s->logging, SPAN_LOG_FLOW, "Set tx type %d\n", type); if (s->t38_fe.current_tx_type == type) return; switch (type) { case T30_MODEM_NONE: s->t38_fe.timed_step = T38_TIMED_STEP_NONE; s->t38_fe.current_tx_data_type = T38_DATA_NONE; break; case T30_MODEM_PAUSE: s->t38_fe.next_tx_samples = s->t38_fe.samples + ms_to_samples(short_train); s->t38_fe.timed_step = T38_TIMED_STEP_PAUSE; s->t38_fe.current_tx_data_type = T38_DATA_NONE; break; case T30_MODEM_CED: /* A 200ms initial delay is specified. Delay this amount before the CED indicator is sent. */ s->t38_fe.next_tx_samples = s->t38_fe.samples; s->t38_fe.timed_step = T38_TIMED_STEP_CED; s->t38_fe.current_tx_data_type = T38_DATA_NONE; break; case T30_MODEM_CNG: /* Allow a short initial delay, so the chances of the other end actually being ready to receive the CNG indicator are improved. */ s->t38_fe.next_tx_samples = s->t38_fe.samples; s->t38_fe.timed_step = T38_TIMED_STEP_CNG; s->t38_fe.current_tx_data_type = T38_DATA_NONE; break; case T30_MODEM_V21: if (s->t38_fe.current_tx_type > T30_MODEM_V21) { /* Pause before switching from phase C, as per T.30. If we omit this, the receiver might not see the carrier fall between the high speed and low speed sections. */ s->t38_fe.next_tx_samples = s->t38_fe.samples + ms_to_samples(75); } else { s->t38_fe.next_tx_samples = s->t38_fe.samples; } set_octets_per_data_packet(s, 300); s->t38_fe.next_tx_indicator = T38_IND_V21_PREAMBLE; s->t38_fe.current_tx_data_type = T38_DATA_V21; s->t38_fe.timed_step = (use_hdlc) ? T38_TIMED_STEP_HDLC_MODEM : T38_TIMED_STEP_NON_ECM_MODEM; break; case T30_MODEM_V27TER_2400: set_octets_per_data_packet(s, 2400); s->t38_fe.next_tx_indicator = T38_IND_V27TER_2400_TRAINING; s->t38_fe.current_tx_data_type = T38_DATA_V27TER_2400; s->t38_fe.timed_step = (use_hdlc) ? T38_TIMED_STEP_HDLC_MODEM : T38_TIMED_STEP_NON_ECM_MODEM; s->t38_fe.next_tx_samples = s->t38_fe.samples + ms_to_samples(30); break; case T30_MODEM_V27TER_4800: set_octets_per_data_packet(s, 4800); s->t38_fe.next_tx_indicator = T38_IND_V27TER_4800_TRAINING; s->t38_fe.current_tx_data_type = T38_DATA_V27TER_4800; s->t38_fe.timed_step = (use_hdlc) ? T38_TIMED_STEP_HDLC_MODEM : T38_TIMED_STEP_NON_ECM_MODEM; s->t38_fe.next_tx_samples = s->t38_fe.samples + ms_to_samples(30); break; case T30_MODEM_V29_7200: set_octets_per_data_packet(s, 7200); s->t38_fe.next_tx_indicator = T38_IND_V29_7200_TRAINING; s->t38_fe.current_tx_data_type = T38_DATA_V29_7200; s->t38_fe.timed_step = (use_hdlc) ? T38_TIMED_STEP_HDLC_MODEM : T38_TIMED_STEP_NON_ECM_MODEM; s->t38_fe.next_tx_samples = s->t38_fe.samples + ms_to_samples(30); break; case T30_MODEM_V29_9600: set_octets_per_data_packet(s, 9600); s->t38_fe.next_tx_indicator = T38_IND_V29_9600_TRAINING; s->t38_fe.current_tx_data_type = T38_DATA_V29_9600; s->t38_fe.timed_step = (use_hdlc) ? T38_TIMED_STEP_HDLC_MODEM : T38_TIMED_STEP_NON_ECM_MODEM; s->t38_fe.next_tx_samples = s->t38_fe.samples + ms_to_samples(30); break; case T30_MODEM_V17_7200: set_octets_per_data_packet(s, 7200); s->t38_fe.next_tx_indicator = (short_train) ? T38_IND_V17_7200_SHORT_TRAINING : T38_IND_V17_7200_LONG_TRAINING; s->t38_fe.current_tx_data_type = T38_DATA_V17_7200; s->t38_fe.timed_step = (use_hdlc) ? T38_TIMED_STEP_HDLC_MODEM : T38_TIMED_STEP_NON_ECM_MODEM; s->t38_fe.next_tx_samples = s->t38_fe.samples + ms_to_samples(30); break; case T30_MODEM_V17_9600: set_octets_per_data_packet(s, 9600); s->t38_fe.next_tx_indicator = (short_train) ? T38_IND_V17_9600_SHORT_TRAINING : T38_IND_V17_9600_LONG_TRAINING; s->t38_fe.current_tx_data_type = T38_DATA_V17_9600; s->t38_fe.timed_step = (use_hdlc) ? T38_TIMED_STEP_HDLC_MODEM : T38_TIMED_STEP_NON_ECM_MODEM; s->t38_fe.next_tx_samples = s->t38_fe.samples + ms_to_samples(30); break; case T30_MODEM_V17_12000: set_octets_per_data_packet(s, 12000); s->t38_fe.next_tx_indicator = (short_train) ? T38_IND_V17_12000_SHORT_TRAINING : T38_IND_V17_12000_LONG_TRAINING; s->t38_fe.current_tx_data_type = T38_DATA_V17_12000; s->t38_fe.timed_step = (use_hdlc) ? T38_TIMED_STEP_HDLC_MODEM : T38_TIMED_STEP_NON_ECM_MODEM; s->t38_fe.next_tx_samples = s->t38_fe.samples + ms_to_samples(30); break; case T30_MODEM_V17_14400: set_octets_per_data_packet(s, 14400); s->t38_fe.next_tx_indicator = (short_train) ? T38_IND_V17_14400_SHORT_TRAINING : T38_IND_V17_14400_LONG_TRAINING; s->t38_fe.current_tx_data_type = T38_DATA_V17_14400; s->t38_fe.timed_step = (use_hdlc) ? T38_TIMED_STEP_HDLC_MODEM : T38_TIMED_STEP_NON_ECM_MODEM; s->t38_fe.next_tx_samples = s->t38_fe.samples + ms_to_samples(30); break; case T30_MODEM_DONE: span_log(&s->logging, SPAN_LOG_FLOW, "FAX exchange complete\n"); s->t38_fe.timed_step = T38_TIMED_STEP_NONE; s->t38_fe.current_tx_data_type = T38_DATA_NONE; break; } s->t38_fe.current_tx_type = type; } /*- End of function --------------------------------------------------------*/ void t38_terminal_set_config(t38_terminal_state_t *s, int without_pacing) { if (without_pacing) { /* Continuous streaming mode, as used for TPKT over TCP transport */ /* Inhibit indicator packets */ s->t38_fe.t38.indicator_tx_count = 0; s->t38_fe.t38.data_tx_count = 1; s->t38_fe.t38.data_end_tx_count = 1; s->t38_fe.ms_per_tx_chunk = 0; } else { /* Paced streaming mode, as used for UDP transports */ s->t38_fe.t38.indicator_tx_count = INDICATOR_TX_COUNT; s->t38_fe.t38.data_tx_count = DATA_TX_COUNT; s->t38_fe.t38.data_end_tx_count = DATA_END_TX_COUNT; s->t38_fe.ms_per_tx_chunk = MS_PER_TX_CHUNK; } set_octets_per_data_packet(s, 300); } /*- End of function --------------------------------------------------------*/ void t38_terminal_set_tep_mode(t38_terminal_state_t *s, int use_tep) { if (use_tep) s->t38_fe.chunking_modes |= T38_CHUNKING_ALLOW_TEP_TIME; else s->t38_fe.chunking_modes &= ~T38_CHUNKING_ALLOW_TEP_TIME; } /*- End of function --------------------------------------------------------*/ void t38_terminal_set_fill_bit_removal(t38_terminal_state_t *s, int remove) { if (remove) s->t38_fe.iaf |= T30_IAF_MODE_NO_FILL_BITS; else s->t38_fe.iaf &= ~T30_IAF_MODE_NO_FILL_BITS; t30_set_iaf_mode(&(s->t30), s->t38_fe.iaf); } /*- End of function --------------------------------------------------------*/ t30_state_t *t38_terminal_get_t30_state(t38_terminal_state_t *s) { return &s->t30; } /*- End of function --------------------------------------------------------*/ static int t38_terminal_t38_fe_init(t38_terminal_state_t *t, t38_tx_packet_handler_t *tx_packet_handler, void *tx_packet_user_data) { t38_terminal_front_end_state_t *s; s = &t->t38_fe; t38_core_init(&s->t38, process_rx_indicator, process_rx_data, process_rx_missing, (void *) t, tx_packet_handler, tx_packet_user_data); s->rx_signal_present = FALSE; s->timed_step = T38_TIMED_STEP_NONE; s->tx.ptr = 0; s->iaf = T30_IAF_MODE_T37 | T30_IAF_MODE_T38; s->current_tx_data_type = T38_DATA_NONE; s->next_tx_samples = 0; s->chunking_modes = T38_CHUNKING_ALLOW_TEP_TIME; s->t38.fastest_image_data_rate = 14400; return 0; } /*- End of function --------------------------------------------------------*/ t38_terminal_state_t *t38_terminal_init(t38_terminal_state_t *s, int calling_party, t38_tx_packet_handler_t *tx_packet_handler, void *tx_packet_user_data) { if (tx_packet_handler == NULL) return NULL; if (s == NULL) { if ((s = (t38_terminal_state_t *) malloc(sizeof(*s))) == NULL) return NULL; } memset(s, 0, sizeof(*s)); span_log_init(&s->logging, SPAN_LOG_NONE, NULL); span_log_set_protocol(&s->logging, "T.38T"); t38_terminal_t38_fe_init(s, tx_packet_handler, tx_packet_user_data); t38_terminal_set_config(s, FALSE); t30_init(&(s->t30), calling_party, set_rx_type, (void *) s, set_tx_type, (void *) s, send_hdlc, (void *) s); t30_set_iaf_mode(&(s->t30), s->t38_fe.iaf); t30_set_supported_modems(&(s->t30), T30_SUPPORT_V27TER | T30_SUPPORT_V29 | T30_SUPPORT_V17 | T30_SUPPORT_IAF); t30_restart(&s->t30); return s; } /*- End of function --------------------------------------------------------*/ int t38_terminal_release(t38_terminal_state_t *s) { t30_release(&s->t30); return 0; } /*- End of function --------------------------------------------------------*/ int t38_terminal_free(t38_terminal_state_t *s) { t30_release(&s->t30); free(s); return 0; } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/v27ter_rx_2400_floating_rrc.h0000644000175000017500000003614111150047216023073 0ustar julienjulien#define RX_PULSESHAPER_2400_GAIN 1.000000f #define RX_PULSESHAPER_2400_COEFF_SETS 12 static const complexf_t rx_pulseshaper_2400[RX_PULSESHAPER_2400_COEFF_SETS][27] = { { { 0.0055897353f, 0.0028481124f}, /* Filter 0 */ { -0.0017768555f, 0.0054685989f}, { -0.0013103940f, -0.0002075460f}, { -0.0000000000f, 0.0066437545f}, { -0.0158167680f, 0.0025051299f}, { -0.0071354798f, -0.0219607487f}, { 0.0209536104f, -0.0106763977f}, { 0.0079805594f, 0.0109842977f}, { 0.0059737033f, -0.0059737033f}, { 0.0334507241f, 0.0243033737f}, { -0.0366873785f, 0.0720030344f}, { -0.1142993318f, -0.0371381042f}, { 0.0237732032f, -0.1500980975f}, { 0.1697241571f, 0.0000000000f}, { 0.0265507077f, 0.1676345711f}, { -0.1445311926f, 0.0469610312f}, { -0.0545612273f, -0.1070824379f}, { 0.0653773871f, -0.0474994521f}, { 0.0292370049f, 0.0292370049f}, { -0.0049656640f, 0.0068346502f}, { 0.0120974973f, 0.0061639827f}, { -0.0072670867f, 0.0223657932f}, { -0.0228066104f, -0.0036122122f}, { -0.0000000000f, -0.0160139260f}, { 0.0065619589f, -0.0010393122f}, { -0.0004099816f, -0.0012617935f}, { 0.0051233099f, -0.0026104568f} }, { { 0.0056661324f, 0.0028870387f}, /* Filter 1 */ { -0.0017109303f, 0.0052657019f}, { -0.0007708414f, -0.0001220893f}, { -0.0000000000f, 0.0074134959f}, { -0.0165439672f, 0.0026203070f}, { -0.0072433070f, -0.0222926068f}, { 0.0206042610f, -0.0104983953f}, { 0.0071755753f, 0.0098763321f}, { 0.0076467868f, -0.0076467868f}, { 0.0359728632f, 0.0261358150f}, { -0.0382251381f, 0.0750210576f}, { -0.1171902140f, -0.0380774087f}, { 0.0240999725f, -0.1521612376f}, { 0.1704283439f, 0.0000000000f}, { 0.0264209157f, 0.1668150966f}, { -0.1424503693f, 0.0462849307f}, { -0.0531570681f, -0.1043266203f}, { 0.0626369632f, -0.0455084176f}, { 0.0270658031f, 0.0270658031f}, { -0.0036203809f, 0.0049830269f}, { 0.0132414079f, 0.0067468343f}, { -0.0073656400f, 0.0226691090f}, { -0.0224159869f, -0.0035503435f}, { -0.0000000000f, -0.0152621568f}, { 0.0058122224f, -0.0009205656f}, { -0.0005708451f, -0.0017568807f}, { 0.0052884998f, -0.0026946253f} }, { { 0.0057239310f, 0.0029164885f}, /* Filter 2 */ { -0.0016362891f, 0.0050359799f}, { -0.0002066397f, -0.0000327285f}, { -0.0000000000f, 0.0081920829f}, { -0.0172533640f, 0.0027326644f}, { -0.0073359675f, -0.0225777865f}, { 0.0201882078f, -0.0102864056f}, { 0.0063201372f, 0.0086989226f}, { 0.0093733613f, -0.0093733613f}, { 0.0385302697f, 0.0279938795f}, { -0.0397608538f, 0.0780350694f}, { -0.1200263595f, -0.0389989283f}, { 0.0244107583f, -0.1541234619f}, { 0.1710059274f, 0.0000000000f}, { 0.0262716833f, 0.1658728803f}, { -0.1402783754f, 0.0455792071f}, { -0.0517306911f, -0.1015271978f}, { 0.0598999355f, -0.0435198506f}, { 0.0249301574f, 0.0249301574f}, { -0.0023214919f, 0.0031952595f}, { 0.0143092559f, 0.0072909301f}, { -0.0074421425f, 0.0229045595f}, { -0.0219819125f, -0.0034815929f}, { -0.0000000000f, -0.0144973559f}, { 0.0050747268f, -0.0008037578f}, { -0.0007235567f, -0.0022268784f}, { 0.0054290965f, -0.0027662629f} }, { { 0.0057623290f, 0.0029360533f}, /* Filter 3 */ { -0.0015528738f, 0.0047792542f}, { 0.0003813736f, 0.0000604036f}, { -0.0000000000f, 0.0089776236f}, { -0.0179424453f, 0.0028418041f}, { -0.0074126928f, -0.0228139225f}, { 0.0197040287f, -0.0100397041f}, { 0.0054142358f, 0.0074520562f}, { 0.0111521022f, -0.0111521022f}, { 0.0411200929f, 0.0298754963f}, { -0.0412925136f, 0.0810411210f}, { -0.1228037562f, -0.0399013592f}, { 0.0247051059f, -0.1559818998f}, { 0.1714560725f, 0.0000000000f}, { 0.0261032340f, 0.1648093332f}, { -0.1380184057f, 0.0448448985f}, { -0.0502840872f, -0.0986880778f}, { 0.0571697634f, -0.0415362644f}, { 0.0228323007f, 0.0228323007f}, { -0.0010698185f, 0.0014724788f}, { 0.0153014454f, 0.0077964758f}, { -0.0074971800f, 0.0230739473f}, { -0.0215069309f, -0.0034063632f}, { -0.0000000000f, -0.0137219696f}, { 0.0043511037f, -0.0006891471f}, { -0.0008679402f, -0.0026712454f}, { 0.0055454595f, -0.0028255527f} }, { { 0.0057805629f, 0.0029453439f}, /* Filter 4 */ { -0.0014606490f, 0.0044954152f}, { 0.0009922677f, 0.0001571598f}, { -0.0000000000f, 0.0097681519f}, { -0.0186086705f, 0.0029473238f}, { -0.0074727246f, -0.0229986814f}, { 0.0191503979f, -0.0097576151f}, { 0.0044579578f, 0.0061358525f}, { 0.0129815758f, -0.0129815758f}, { 0.0437393992f, 0.0317785336f}, { -0.0428181071f, 0.0840352668f}, { -0.1255184420f, -0.0407834141f}, { 0.0249825756f, -0.1577337746f}, { 0.1717780904f, 0.0000000000f}, { 0.0259158247f, 0.1636260777f}, { -0.1356737711f, 0.0440830805f}, { -0.0488192570f, -0.0958131866f}, { 0.0544498624f, -0.0395601407f}, { 0.0207743813f, 0.0207743813f}, { 0.0001339048f, -0.0001843041f}, { 0.0162185066f, 0.0082637419f}, { -0.0075313657f, 0.0231791603f}, { -0.0209936138f, -0.0033250618f}, { -0.0000000000f, -0.0129383854f}, { 0.0036429017f, -0.0005769789f}, { -0.0010038447f, -0.0030895164f}, { 0.0056380167f, -0.0028727130f} }, { { 0.0057779068f, 0.0029439906f}, /* Filter 5 */ { -0.0013596055f, 0.0041844356f}, { 0.0016250229f, 0.0002573783f}, { -0.0000000000f, 0.0105616312f}, { -0.0192494812f, 0.0030488183f}, { -0.0075153229f, -0.0231297855f}, { 0.0185260951f, -0.0094395169f}, { 0.0034514727f, 0.0047505446f}, { 0.0148602405f, -0.0148602405f}, { 0.0463851645f, 0.0337007947f}, { -0.0443356077f, 0.0870135294f}, { -0.1281665483f, -0.0416438360f}, { 0.0252427568f, -0.1593764942f}, { 0.1719714956f, 0.0000000000f}, { 0.0257097307f, 0.1623248514f}, { -0.1332478798f, 0.0432948606f}, { -0.0473382129f, -0.0929064739f}, { 0.0517436041f, -0.0375939289f}, { 0.0187584474f, 0.0187584474f}, { 0.0012890415f, -0.0017742134f}, { 0.0170610995f, 0.0086930644f}, { -0.0075453395f, 0.0232221670f}, { -0.0204445393f, -0.0032380969f}, { -0.0000000000f, -0.0121489492f}, { 0.0029515842f, -0.0004674850f}, { -0.0011311490f, -0.0034813187f}, { 0.0057072442f, -0.0029079862f} }, { { 0.0057536787f, 0.0029316457f}, /* Filter 6 */ { -0.0012497586f, 0.0038463614f}, { 0.0022785281f, 0.0003608834f}, { -0.0000000000f, 0.0113559549f}, { -0.0198622982f, 0.0031458790f}, { -0.0075397630f, -0.0232050046f}, { 0.0178299978f, -0.0090848376f}, { 0.0023950476f, 0.0032965003f}, { 0.0167864468f, -0.0167864468f}, { 0.0490542902f, 0.0356400280f}, { -0.0458429864f, 0.0899719266f}, { -0.1307442661f, -0.0424813872f}, { 0.0254852625f, -0.1609076145f}, { 0.1720360055f, 0.0000000000f}, { 0.0254852625f, 0.1609076145f}, { -0.1307442661f, 0.0424813872f}, { -0.0458429864f, -0.0899719266f}, { 0.0490542902f, -0.0356400280f}, { 0.0167864468f, 0.0167864468f}, { 0.0023950476f, -0.0032965003f}, { 0.0178299978f, 0.0090848376f}, { -0.0075397630f, 0.0232050046f}, { -0.0198622982f, -0.0031458790f}, { -0.0000000000f, -0.0113559549f}, { 0.0022785281f, -0.0003608834f}, { -0.0012497586f, -0.0038463614f}, { 0.0057536787f, -0.0029316457f} }, { { 0.0057072442f, 0.0029079862f}, /* Filter 7 */ { -0.0011311490f, 0.0034813187f}, { 0.0029515842f, 0.0004674850f}, { -0.0000000000f, 0.0121489492f}, { -0.0204445393f, 0.0032380969f}, { -0.0075453394f, -0.0232221670f}, { 0.0170610995f, -0.0086930644f}, { 0.0012890415f, 0.0017742134f}, { 0.0187584474f, -0.0187584474f}, { 0.0517436041f, 0.0375939290f}, { -0.0473382129f, 0.0929064739f}, { -0.1332478798f, -0.0432948606f}, { 0.0257097307f, -0.1623248514f}, { 0.1719714956f, 0.0000000000f}, { 0.0252427568f, 0.1593764942f}, { -0.1281665483f, 0.0416438359f}, { -0.0443356077f, -0.0870135294f}, { 0.0463851645f, -0.0337007947f}, { 0.0148602405f, 0.0148602405f}, { 0.0034514727f, -0.0047505446f}, { 0.0185260951f, 0.0094395170f}, { -0.0075153229f, 0.0231297855f}, { -0.0192494812f, -0.0030488183f}, { -0.0000000000f, -0.0105616312f}, { 0.0016250229f, -0.0002573783f}, { -0.0013596055f, -0.0041844356f}, { 0.0057779068f, -0.0029439906f} }, { { 0.0056380167f, 0.0028727130f}, /* Filter 8 */ { -0.0010038447f, 0.0030895164f}, { 0.0036429017f, 0.0005769789f}, { -0.0000000000f, 0.0129383854f}, { -0.0209936138f, 0.0033250618f}, { -0.0075313657f, -0.0231791603f}, { 0.0162185066f, -0.0082637419f}, { 0.0001339048f, 0.0001843041f}, { 0.0207743813f, -0.0207743813f}, { 0.0544498624f, 0.0395601407f}, { -0.0488192570f, 0.0958131866f}, { -0.1356737711f, -0.0440830805f}, { 0.0259158247f, -0.1636260777f}, { 0.1717780904f, 0.0000000000f}, { 0.0249825756f, 0.1577337746f}, { -0.1255184420f, 0.0407834141f}, { -0.0428181071f, -0.0840352668f}, { 0.0437393992f, -0.0317785336f}, { 0.0129815758f, 0.0129815758f}, { 0.0044579578f, -0.0061358525f}, { 0.0191503979f, 0.0097576151f}, { -0.0074727246f, 0.0229986814f}, { -0.0186086705f, -0.0029473238f}, { -0.0000000000f, -0.0097681519f}, { 0.0009922677f, -0.0001571598f}, { -0.0014606490f, -0.0044954152f}, { 0.0057805629f, -0.0029453439f} }, { { 0.0055454595f, 0.0028255527f}, /* Filter 9 */ { -0.0008679402f, 0.0026712454f}, { 0.0043511037f, 0.0006891471f}, { -0.0000000000f, 0.0137219696f}, { -0.0215069309f, 0.0034063632f}, { -0.0074971800f, -0.0230739473f}, { 0.0153014454f, -0.0077964758f}, { -0.0010698185f, -0.0014724788f}, { 0.0228323007f, -0.0228323007f}, { 0.0571697634f, 0.0415362644f}, { -0.0502840872f, 0.0986880778f}, { -0.1380184057f, -0.0448448985f}, { 0.0261032340f, -0.1648093332f}, { 0.1714560725f, 0.0000000000f}, { 0.0247051059f, 0.1559818998f}, { -0.1228037562f, 0.0399013592f}, { -0.0412925136f, -0.0810411210f}, { 0.0411200929f, -0.0298754963f}, { 0.0111521022f, 0.0111521022f}, { 0.0054142358f, -0.0074520562f}, { 0.0197040287f, 0.0100397041f}, { -0.0074126928f, 0.0228139225f}, { -0.0179424453f, -0.0028418041f}, { -0.0000000000f, -0.0089776236f}, { 0.0003813736f, -0.0000604036f}, { -0.0015528738f, -0.0047792542f}, { 0.0057623290f, -0.0029360533f} }, { { 0.0054290965f, 0.0027662629f}, /* Filter 10 */ { -0.0007235567f, 0.0022268784f}, { 0.0050747268f, 0.0008037578f}, { -0.0000000000f, 0.0144973559f}, { -0.0219819125f, 0.0034815929f}, { -0.0074421425f, -0.0229045595f}, { 0.0143092559f, -0.0072909301f}, { -0.0023214919f, -0.0031952595f}, { 0.0249301574f, -0.0249301574f}, { 0.0598999355f, 0.0435198506f}, { -0.0517306911f, 0.1015271978f}, { -0.1402783754f, -0.0455792071f}, { 0.0262716833f, -0.1658728803f}, { 0.1710059274f, 0.0000000000f}, { 0.0244107583f, 0.1541234619f}, { -0.1200263595f, 0.0389989283f}, { -0.0397608538f, -0.0780350694f}, { 0.0385302696f, -0.0279938795f}, { 0.0093733613f, 0.0093733613f}, { 0.0063201372f, -0.0086989227f}, { 0.0201882078f, 0.0102864056f}, { -0.0073359675f, 0.0225777865f}, { -0.0172533640f, -0.0027326644f}, { -0.0000000000f, -0.0081920829f}, { -0.0002066397f, 0.0000327285f}, { -0.0016362891f, -0.0050359799f}, { 0.0057239310f, -0.0029164885f} }, { { 0.0052884998f, 0.0026946253f}, /* Filter 11 */ { -0.0005708451f, 0.0017568807f}, { 0.0058122224f, 0.0009205656f}, { -0.0000000000f, 0.0152621568f}, { -0.0224159869f, 0.0035503435f}, { -0.0073656400f, -0.0226691090f}, { 0.0132414079f, -0.0067468343f}, { -0.0036203809f, -0.0049830269f}, { 0.0270658031f, -0.0270658031f}, { 0.0626369632f, 0.0455084176f}, { -0.0531570681f, 0.1043266203f}, { -0.1424503693f, -0.0462849307f}, { 0.0264209157f, -0.1668150966f}, { 0.1704283439f, 0.0000000000f}, { 0.0240999725f, 0.1521612376f}, { -0.1171902140f, 0.0380774087f}, { -0.0382251381f, -0.0750210576f}, { 0.0359728632f, -0.0261358150f}, { 0.0076467868f, 0.0076467868f}, { 0.0071755753f, -0.0098763321f}, { 0.0206042610f, 0.0104983953f}, { -0.0072433070f, 0.0222926068f}, { -0.0165439672f, -0.0026203070f}, { -0.0000000000f, -0.0074134959f}, { -0.0007708414f, 0.0001220893f}, { -0.0017109303f, -0.0052657019f}, { 0.0056661324f, -0.0028870387f} } }; iaxmodem-1.2.0/lib/spandsp/src/lpc10_encode.c0000644000175000017500000002564011150047216020264 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * lpc10_encode.c - LPC10 low bit rate speech codec. * * Written by Steve Underwood * * Copyright (C) 2006 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * This code is based on the U.S. Department of Defense reference * implementation of the LPC-10 2400 bps Voice Coder. They do not * exert copyright claims on their code, and it may be freely used. * * $Id: lpc10_encode.c,v 1.23 2008/07/02 14:48:25 steveu Exp $ */ #if defined(HAVE_CONFIG_H) #include #endif #include #include #include #include #include "floating_fudge.h" #if defined(HAVE_TGMATH_H) #include #endif #if defined(HAVE_MATH_H) #include #endif #include "spandsp/telephony.h" #include "spandsp/dc_restore.h" #include "spandsp/lpc10.h" #include "lpc10_encdecs.h" static void lpc10_pack(lpc10_encode_state_t *s, uint8_t ibits[], lpc10_frame_t *t) { static const int iblist[53] = { 13, 12, 11, 1, 2, 13, 12, 11, 1, 2, 13, 10, 11, 2, 1, 10, 13, 12, 11, 10, 2, 13, 12, 11, 10, 2, 1, 12, 7, 6, 1, 10, 9, 8, 7, 4, 6, 9, 8, 7, 5, 1, 9, 8, 4, 6, 1, 5, 9, 8, 7, 5, 6 }; int32_t itab[13]; int x; int i; /* ibits is 54 bits of LPC data ordered as follows: */ /* R1-0, R2-0, R3-0, P-0, A-0, */ /* R1-1, R2-1, R3-1, P-1, A-1, */ /* R1-2, R4-0, R3-2, A-2, P-2, R4-1, */ /* R1-3, R2-2, R3-3, R4-2, A-3, */ /* R1-4, R2-3, R3-4, R4-3, A-4, */ /* P-3, R2-4, R7-0, R8-0, P-4, R4-4, */ /* R5-0, R6-0, R7-1,R10-0, R8-1, */ /* R5-1, R6-1, R7-2, R9-0, P-5, */ /* R5-2, R6-2,R10-1, R8-2, P-6, R9-1, */ /* R5-3, R6-3, R7-3, R9-2, R8-3, SYNC */ itab[0] = t->ipitch; itab[1] = t->irms; itab[2] = 0; for (i = 0; i < LPC10_ORDER; i++) itab[i + 3] = t->irc[LPC10_ORDER - 1 - i] & 0x7FFF; /* Put 54 bits into the output buffer */ x = 0; for (i = 0; i < 53; i++) { x = (x << 1) | (itab[iblist[i] - 1] & 1); if ((i & 7) == 7) ibits[i >> 3] = (uint8_t) (x & 0xFF); itab[iblist[i] - 1] >>= 1; } x = (x << 1) | (s->isync & 1); s->isync ^= 1; x <<= 2; ibits[6] = (uint8_t) (x & 0xFF); } /*- End of function --------------------------------------------------------*/ /* Quantize LPC parameters for transmission */ static int encode(lpc10_encode_state_t *s, lpc10_frame_t *t, int32_t *voice, int32_t pitch, float rms, float *rc) { static const int32_t enctab[16] = { 0, 7, 11, 12, 13, 10, 6, 1, 14, 9, 5, 2, 3, 4, 8, 15 }; static const int32_t entau[60] = { 19, 11, 27, 25, 29, 21, 23, 22, 30, 14, 15, 7, 39, 38, 46, 42, 43, 41, 45, 37, 53, 49, 51, 50, 54, 52, 60, 56, 58, 26, 90, 88, 92, 84, 86, 82, 83, 81, 85, 69, 77, 73, 75, 74, 78, 70, 71, 67, 99, 97, 113, 112, 114, 98, 106, 104, 108, 100, 101, 76 }; static const int32_t enadd[8] = { 1920, -768, 2432, 1280, 3584, 1536, 2816, -1152 }; static const float enscl[8] = { 0.0204f, 0.0167f, 0.0145f, 0.0147f, 0.0143f, 0.0135f, 0.0125f, 0.0112f }; static const int32_t enbits[8] = { 6, 5, 4, 4, 4, 4, 3, 3 }; static const int32_t entab6[64] = { 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 10, 10, 11, 11, 12, 13, 14, 15 }; static const int32_t rmst[64] = { 1024, 936, 856, 784, 718, 656, 600, 550, 502, 460, 420, 384, 352, 328, 294, 270, 246, 226, 206, 188, 172, 158, 144, 132, 120, 110, 102, 92, 84, 78, 70, 64, 60, 54, 50, 46, 42, 38, 34, 32, 30, 26, 24, 22, 20, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 }; int32_t idel; int32_t nbit; int32_t i; int32_t j; int32_t i2; int32_t i3; int32_t mrk; /* Scale RMS and RC's to int32_ts */ t->irms = (int32_t) rms; for (i = 0; i < LPC10_ORDER; i++) t->irc[i] = (int32_t) (rc[i]*32768.0f); if (voice[0] != 0 && voice[1] != 0) { t->ipitch = entau[pitch - 1]; } else { if (s->error_correction) { t->ipitch = 0; if (voice[0] != voice[1]) t->ipitch = 127; } else { t->ipitch = (voice[0] << 1) + voice[1]; } } /* Encode RMS by binary table search */ j = 32; idel = 16; t->irms = min(t->irms, 1023); while (idel > 0) { if (t->irms > rmst[j - 1]) j -= idel; if (t->irms < rmst[j - 1]) j += idel; idel /= 2; } if (t->irms > rmst[j - 1]) --j; t->irms = 31 - j/2; /* Encode RC(1) and (2) as log-area-ratios */ for (i = 0; i < 2; i++) { i2 = t->irc[i]; mrk = 0; if (i2 < 0) { i2 = -i2; mrk = 1; } i2 = min(i2/512, 63); i2 = entab6[i2]; if (mrk != 0) i2 = -i2; t->irc[i] = i2; } /* Encode RC(3) - (10) linearly, remove bias then scale */ for (i = 2; i < LPC10_ORDER; i++) { i2 = (int32_t) ((t->irc[i]/2 + enadd[LPC10_ORDER - 1 - i])*enscl[LPC10_ORDER - 1 - i]); i2 = max(i2, -127); i2 = min(i2, 127); nbit = enbits[LPC10_ORDER - 1 - i]; i3 = (i2 < 0); i2 /= pow_ii(2, nbit); if (i3) i2--; t->irc[i] = i2; } /* Protect the most significant bits of the most important parameters during non-voiced frames. RC(1) - RC(4) are protected using 20 parity bits replacing RC(5) - RC(10). */ if (s->error_correction) { if (t->ipitch == 0 || t->ipitch == 127) { t->irc[4] = enctab[(t->irc[0] & 0x1E) >> 1]; t->irc[5] = enctab[(t->irc[1] & 0x1E) >> 1]; t->irc[6] = enctab[(t->irc[2] & 0x1E) >> 1]; t->irc[7] = enctab[(t->irms & 0x1E) >> 1]; t->irc[8] = enctab[(t->irc[3] & 0x1E) >> 1] >> 1; t->irc[9] = enctab[(t->irc[3] & 0x1E) >> 1] & 1; } } return 0; } /*- End of function --------------------------------------------------------*/ static void high_pass_100hz(lpc10_encode_state_t *s, float speech[], int start, int len) { float si; float err; int i; /* 100 Hz high pass filter */ for (i = start; i < len; i++) { si = speech[i]; err = si + s->z11*1.859076f - s->z21*0.8648249f; si = err - s->z11*2.0f + s->z21; s->z21 = s->z11; s->z11 = err; err = si + s->z12*1.935715f - s->z22*0.9417004f; si = err - s->z12*2.0f + s->z22; s->z22 = s->z12; s->z12 = err; speech[i] = si*0.902428f; } } /*- End of function --------------------------------------------------------*/ lpc10_encode_state_t *lpc10_encode_init(lpc10_encode_state_t *s, int error_correction) { int i; int j; if (s == NULL) { if ((s = (lpc10_encode_state_t *) malloc(sizeof(*s))) == NULL) return NULL; } s->error_correction = error_correction; /* State used only by function high_pass_100hz */ s->z11 = 0.0f; s->z21 = 0.0f; s->z12 = 0.0f; s->z22 = 0.0f; /* State used by function lpc10_analyse */ for (i = 0; i < 540; i++) { s->inbuf[i] = 0.0f; s->pebuf[i] = 0.0f; } for (i = 0; i < 696; i++) s->lpbuf[i] = 0.0f; for (i = 0; i < 312; i++) s->ivbuf[i] = 0.0f; s->bias = 0.0f; s->osptr = 1; for (i = 0; i < 3; i++) s->obound[i] = 0; s->vwin[2][0] = 307; s->vwin[2][1] = 462; s->awin[2][0] = 307; s->awin[2][1] = 462; for (i = 0; i < 4; i++) { s->voibuf[i][0] = 0; s->voibuf[i][1] = 0; } for (i = 0; i < 3; i++) s->rmsbuf[i] = 0.0f; for (i = 0; i < 3; i++) { for (j = 0; j < 10; j++) s->rcbuf[i][j] = 0.0f; } s->zpre = 0.0f; /* State used by function onset */ s->n = 0.0f; s->d__ = 1.0f; for (i = 0; i < 16; i++) s->l2buf[i] = 0.0f; s->l2sum1 = 0.0f; s->l2ptr1 = 1; s->l2ptr2 = 9; s->hyst = FALSE; /* State used by function lpc10_voicing */ s->dither = 20.0f; s->maxmin = 0.0f; for (i = 0; i < 3; i++) { s->voice[i][0] = 0.0f; s->voice[i][1] = 0.0f; } s->lbve = 3000; s->fbve = 3000; s->fbue = 187; s->ofbue = 187; s->sfbue = 187; s->lbue = 93; s->olbue = 93; s->slbue = 93; s->snr = (float) (s->fbve / s->fbue << 6); /* State used by function dynamic_pitch_tracking */ for (i = 0; i < 60; i++) s->s[i] = 0.0f; for (i = 0; i < 2; i++) { for (j = 0; j < 60; j++) s->p[i][j] = 0; } s->ipoint = 0; s->alphax = 0.0f; /* State used by function lpc10_pack */ s->isync = 0; return s; } /*- End of function --------------------------------------------------------*/ int lpc10_encode_release(lpc10_encode_state_t *s) { free(s); return 0; } /*- End of function --------------------------------------------------------*/ int lpc10_encode(lpc10_encode_state_t *s, uint8_t code[], const int16_t amp[], int len) { int32_t voice[2]; int32_t pitch; float speech[LPC10_SAMPLES_PER_FRAME]; float rc[LPC10_ORDER]; float rms; lpc10_frame_t frame; int i; int j; len /= LPC10_SAMPLES_PER_FRAME; for (i = 0; i < len; i++) { for (j = 0; j < LPC10_SAMPLES_PER_FRAME; j++) speech[j] = (float) amp[i*LPC10_SAMPLES_PER_FRAME + j]/32768.0f; high_pass_100hz(s, speech, 0, LPC10_SAMPLES_PER_FRAME); lpc10_analyse(s, speech, voice, &pitch, &rms, rc); encode(s, &frame, voice, pitch, rms, rc); lpc10_pack(s, &code[7*i], &frame); } return len*7; } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/v29tx_fixed_rrc.h0000644000175000017500000000404511150047216021052 0ustar julienjulien#define TX_PULSESHAPER_GAIN 0.948561f #define TX_PULSESHAPER_COEFF_SETS 10 static const int16_t tx_pulseshaper[TX_PULSESHAPER_COEFF_SETS][9] = { { -89, /* Filter 0 */ -561, 2002, -5223, 19071, 19071, -5223, 2002, -561 }, { 97, /* Filter 1 */ -922, 2553, -6054, 23507, 14325, -3959, 1300, -183 }, { 297, /* Filter 2 */ -1210, 2855, -6268, 27331, 9577, -2461, 548, 159 }, { 478, /* Filter 3 */ -1370, 2827, -5713, 30276, 5120, -924, -157, 426 }, { 605, /* Filter 4 */ -1359, 2421, -4291, 32132, 1207, 482, -741, 593 }, { 650, /* Filter 5 */ -1150, 1627, -1970, 32767, -1970, 1627, -1150, 650 }, { 593, /* Filter 6 */ -741, 482, 1207, 32132, -4291, 2421, -1359, 605 }, { 426, /* Filter 7 */ -157, -924, 5120, 30276, -5713, 2827, -1370, 478 }, { 159, /* Filter 8 */ 548, -2461, 9577, 27331, -6268, 2855, -1210, 297 }, { -183, /* Filter 9 */ 1300, -3959, 14325, 23507, -6054, 2553, -922, 97 } }; iaxmodem-1.2.0/lib/spandsp/src/v27ter_rx.c0000644000175000017500000011141211150047216017663 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * v27ter_rx.c - ITU V.27ter modem receive part * * Written by Steve Underwood * * Copyright (C) 2003 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: v27ter_rx.c,v 1.96 2008/07/16 17:01:49 steveu Exp $ */ /*! \file */ #if defined(HAVE_CONFIG_H) #include #endif #include #include #include #include #include "floating_fudge.h" #if defined(HAVE_TGMATH_H) #include #endif #if defined(HAVE_MATH_H) #include #endif #include "spandsp/telephony.h" #include "spandsp/logging.h" #include "spandsp/complex.h" #include "spandsp/vector_float.h" #include "spandsp/complex_vector_float.h" #include "spandsp/async.h" #include "spandsp/power_meter.h" #include "spandsp/arctan2.h" #include "spandsp/dds.h" #include "spandsp/complex_filters.h" #include "spandsp/v29rx.h" #include "spandsp/v27ter_rx.h" #if defined(SPANDSP_USE_FIXED_POINT) #include "v27ter_rx_4800_fixed_rrc.h" #include "v27ter_rx_2400_fixed_rrc.h" #else #include "v27ter_rx_4800_floating_rrc.h" #include "v27ter_rx_2400_floating_rrc.h" #endif /* V.27ter is a DPSK modem, but this code treats it like QAM. It nails down the signal to a static constellation, even though dealing with differences is all that is necessary. */ #define CARRIER_NOMINAL_FREQ 1800.0f #define EQUALIZER_DELTA 0.25f /* Segments of the training sequence */ /* V.27ter defines a long and a short sequence. FAX doesn't use the short sequence, so it is not implemented here. */ #define V27TER_TRAINING_SEG_3_LEN 50 #define V27TER_TRAINING_SEG_5_LEN 1074 #define V27TER_TRAINING_SEG_6_LEN 8 enum { TRAINING_STAGE_NORMAL_OPERATION = 0, TRAINING_STAGE_SYMBOL_ACQUISITION, TRAINING_STAGE_LOG_PHASE, TRAINING_STAGE_WAIT_FOR_HOP, TRAINING_STAGE_TRAIN_ON_ABAB, TRAINING_STAGE_TEST_ONES, TRAINING_STAGE_PARKED }; static const complexf_t v27ter_constellation[8] = { { 1.414f, 0.0f}, /* 0deg */ { 1.0f, 1.0f}, /* 45deg */ { 0.0f, 1.414f}, /* 90deg */ {-1.0f, 1.0f}, /* 135deg */ {-1.414f, 0.0f}, /* 180deg */ {-1.0f, -1.0f}, /* 225deg */ { 0.0f, -1.414f}, /* 270deg */ { 1.0f, -1.0f} /* 315deg */ }; float v27ter_rx_carrier_frequency(v27ter_rx_state_t *s) { return dds_frequencyf(s->carrier_phase_rate); } /*- End of function --------------------------------------------------------*/ float v27ter_rx_symbol_timing_correction(v27ter_rx_state_t *s) { int steps_per_symbol; steps_per_symbol = (s->bit_rate == 4800) ? RX_PULSESHAPER_4800_COEFF_SETS*5 : RX_PULSESHAPER_2400_COEFF_SETS*20/3; return (float) s->total_baud_timing_correction/(float) steps_per_symbol; } /*- End of function --------------------------------------------------------*/ float v27ter_rx_signal_power(v27ter_rx_state_t *s) { return power_meter_current_dbm0(&s->power); } /*- End of function --------------------------------------------------------*/ void v27ter_rx_signal_cutoff(v27ter_rx_state_t *s, float cutoff) { /* The 0.4 factor allows for the gain of the DC blocker */ s->carrier_on_power = (int32_t) (power_meter_level_dbm0(cutoff + 2.5f)*0.4f); s->carrier_off_power = (int32_t) (power_meter_level_dbm0(cutoff - 2.5f)*0.4f); } /*- End of function --------------------------------------------------------*/ int v27ter_rx_equalizer_state(v27ter_rx_state_t *s, complexf_t **coeffs) { *coeffs = s->eq_coeff; return V27TER_EQUALIZER_PRE_LEN + 1 + V27TER_EQUALIZER_POST_LEN; } /*- End of function --------------------------------------------------------*/ static void report_status_change(v27ter_rx_state_t *s, int status) { if (s->status_handler) s->status_handler(s->status_user_data, status); else if (s->put_bit) s->put_bit(s->put_bit_user_data, status); } /*- End of function --------------------------------------------------------*/ static void equalizer_save(v27ter_rx_state_t *s) { cvec_copyf(s->eq_coeff_save, s->eq_coeff, V27TER_EQUALIZER_PRE_LEN + 1 + V27TER_EQUALIZER_POST_LEN); } /*- End of function --------------------------------------------------------*/ static void equalizer_restore(v27ter_rx_state_t *s) { cvec_copyf(s->eq_coeff, s->eq_coeff_save, V27TER_EQUALIZER_PRE_LEN + 1 + V27TER_EQUALIZER_POST_LEN); cvec_zerof(s->eq_buf, V27TER_EQUALIZER_MASK); s->eq_put_step = (s->bit_rate == 4800) ? RX_PULSESHAPER_4800_COEFF_SETS*5/2 : RX_PULSESHAPER_2400_COEFF_SETS*20/(3*2); s->eq_step = 0; s->eq_delta = EQUALIZER_DELTA/(V27TER_EQUALIZER_PRE_LEN + 1 + V27TER_EQUALIZER_POST_LEN); } /*- End of function --------------------------------------------------------*/ static void equalizer_reset(v27ter_rx_state_t *s) { /* Start with an equalizer based on everything being perfect */ cvec_zerof(s->eq_coeff, V27TER_EQUALIZER_PRE_LEN + 1 + V27TER_EQUALIZER_POST_LEN); s->eq_coeff[V27TER_EQUALIZER_PRE_LEN] = complex_setf(1.414f, 0.0f); cvec_zerof(s->eq_buf, V27TER_EQUALIZER_MASK); s->eq_put_step = (s->bit_rate == 4800) ? RX_PULSESHAPER_4800_COEFF_SETS*5/2 : RX_PULSESHAPER_2400_COEFF_SETS*20/(3*2); s->eq_step = 0; s->eq_delta = EQUALIZER_DELTA/(V27TER_EQUALIZER_PRE_LEN + 1 + V27TER_EQUALIZER_POST_LEN); } /*- End of function --------------------------------------------------------*/ static __inline__ complexf_t equalizer_get(v27ter_rx_state_t *s) { int i; int p; complexf_t z; complexf_t z1; /* Get the next equalized value. */ z = complex_setf(0.0f, 0.0f); p = s->eq_step - 1; for (i = 0; i < V27TER_EQUALIZER_PRE_LEN + 1 + V27TER_EQUALIZER_POST_LEN; i++) { p = (p - 1) & V27TER_EQUALIZER_MASK; z1 = complex_mulf(&s->eq_coeff[i], &s->eq_buf[p]); z = complex_addf(&z, &z1); } return z; } /*- End of function --------------------------------------------------------*/ static void tune_equalizer(v27ter_rx_state_t *s, const complexf_t *z, const complexf_t *target) { int i; int p; complexf_t ez; complexf_t z1; /* Find the x and y mismatch from the exact constellation position. */ ez = complex_subf(target, z); ez.re *= s->eq_delta; ez.im *= s->eq_delta; p = s->eq_step - 1; for (i = 0; i < V27TER_EQUALIZER_PRE_LEN + 1 + V27TER_EQUALIZER_POST_LEN; i++) { p = (p - 1) & V27TER_EQUALIZER_MASK; z1 = complex_conjf(&s->eq_buf[p]); z1 = complex_mulf(&ez, &z1); s->eq_coeff[i] = complex_addf(&s->eq_coeff[i], &z1); /* Leak a little to tame uncontrolled wandering */ s->eq_coeff[i].re *= 0.9999f; s->eq_coeff[i].im *= 0.9999f; } } /*- End of function --------------------------------------------------------*/ static __inline__ void track_carrier(v27ter_rx_state_t *s, const complexf_t *z, const complexf_t *target) { float error; /* For small errors the imaginary part of the difference between the actual and the target positions is proportional to the phase error, for any particular target. However, the different amplitudes of the various target positions scale things. */ error = z->im*target->re - z->re*target->im; s->carrier_phase_rate += (int32_t) (s->carrier_track_i*error); s->carrier_phase += (int32_t) (s->carrier_track_p*error); //span_log(&s->logging, SPAN_LOG_FLOW, "Im = %15.5f f = %15.5f\n", error, dds_frequencyf(s->carrier_phase_rate)); } /*- End of function --------------------------------------------------------*/ static __inline__ int descramble(v27ter_rx_state_t *s, int in_bit) { int out_bit; out_bit = (in_bit ^ (s->scramble_reg >> 5) ^ (s->scramble_reg >> 6)) & 1; if (s->scrambler_pattern_count >= 33) { out_bit ^= 1; s->scrambler_pattern_count = 0; } else { if (s->training_stage > TRAINING_STAGE_NORMAL_OPERATION && s->training_stage < TRAINING_STAGE_TEST_ONES) { s->scrambler_pattern_count = 0; } else { if ((((s->scramble_reg >> 7) ^ in_bit) & ((s->scramble_reg >> 8) ^ in_bit) & ((s->scramble_reg >> 11) ^ in_bit) & 1)) s->scrambler_pattern_count = 0; else s->scrambler_pattern_count++; } } s->scramble_reg <<= 1; if (s->training_stage > TRAINING_STAGE_NORMAL_OPERATION && s->training_stage < TRAINING_STAGE_TEST_ONES) s->scramble_reg |= out_bit; else s->scramble_reg |= in_bit; return out_bit; } /*- End of function --------------------------------------------------------*/ static __inline__ void put_bit(v27ter_rx_state_t *s, int bit) { int out_bit; bit &= 1; out_bit = descramble(s, bit); /* We need to strip the last part of the training before we let data go to the application. */ if (s->training_stage == TRAINING_STAGE_NORMAL_OPERATION) { s->put_bit(s->put_bit_user_data, out_bit); } else { //span_log(&s->logging, SPAN_LOG_FLOW, "Test bit %d\n", out_bit); /* The bits during the final stage of training should be all ones. However, buggy modems mean you cannot rely on this. Therefore we don't bother testing for ones, but just rely on a constellation mismatch measurement. */ } } /*- End of function --------------------------------------------------------*/ static __inline__ int find_quadrant(const complexf_t *z) { int b1; int b2; /* Split the space along the two diagonals. */ b1 = (z->im > z->re); b2 = (z->im < -z->re); return (b2 << 1) | (b1 ^ b2); } /*- End of function --------------------------------------------------------*/ static __inline__ int find_octant(complexf_t *z) { float abs_re; float abs_im; int b1; int b2; int bits; /* Are we near an axis or a diagonal? */ abs_re = fabsf(z->re); abs_im = fabsf(z->im); if (abs_im > abs_re*0.4142136f && abs_im < abs_re*2.4142136f) { /* Split the space along the two axes. */ b1 = (z->re < 0.0f); b2 = (z->im < 0.0f); bits = (b2 << 2) | ((b1 ^ b2) << 1) | 1; } else { /* Split the space along the two diagonals. */ b1 = (z->im > z->re); b2 = (z->im < -z->re); bits = (b2 << 2) | ((b1 ^ b2) << 1); } return bits; } /*- End of function --------------------------------------------------------*/ static void decode_baud(v27ter_rx_state_t *s, complexf_t *z) { static const uint8_t phase_steps_4800[8] = { 4, 0, 2, 6, 7, 3, 1, 5 }; static const uint8_t phase_steps_2400[4] = { 0, 2, 3, 1 }; int nearest; int raw_bits; switch (s->bit_rate) { case 4800: default: nearest = find_octant(z); raw_bits = phase_steps_4800[(nearest - s->constellation_state) & 7]; put_bit(s, raw_bits); put_bit(s, raw_bits >> 1); put_bit(s, raw_bits >> 2); s->constellation_state = nearest; break; case 2400: nearest = find_quadrant(z); raw_bits = phase_steps_2400[(nearest - s->constellation_state) & 3]; put_bit(s, raw_bits); put_bit(s, raw_bits >> 1); s->constellation_state = nearest; nearest <<= 1; break; } track_carrier(s, z, &v27ter_constellation[nearest]); if (--s->eq_skip <= 0) { /* Once we are in the data the equalization should not need updating. However, the line characteristics may slowly drift. We, therefore, tune up on the occassional sample, keeping the compute down. */ s->eq_skip = 100; tune_equalizer(s, z, &v27ter_constellation[nearest]); } } /*- End of function --------------------------------------------------------*/ static __inline__ void process_half_baud(v27ter_rx_state_t *s, const complexf_t *sample) { static const int abab_pos[2] = { 0, 4 }; complexf_t z; complexf_t zz; float p; float q; int i; int j; int32_t angle; int32_t ang; /* Add a sample to the equalizer's circular buffer, but don't calculate anything at this time. */ s->eq_buf[s->eq_step] = *sample; s->eq_step = (s->eq_step + 1) & V27TER_EQUALIZER_MASK; /* On alternate insertions we have a whole baud, and must process it. */ if ((s->baud_phase ^= 1)) { //span_log(&s->logging, SPAN_LOG_FLOW, "Samp, %f, %f, %f, -1, 0x%X\n", z.re, z.im, sqrtf(z.re*z.re + z.im*z.im), s->eq_put_step); return; } //span_log(&s->logging, SPAN_LOG_FLOW, "Samp, %f, %f, %f, 1, 0x%X\n", z.re, z.im, sqrtf(z.re*z.re + z.im*z.im), s->eq_put_step); /* Perform a Gardner test for baud alignment */ p = s->eq_buf[(s->eq_step - 3) & V27TER_EQUALIZER_MASK].re - s->eq_buf[(s->eq_step - 1) & V27TER_EQUALIZER_MASK].re; p *= s->eq_buf[(s->eq_step - 2) & V27TER_EQUALIZER_MASK].re; q = s->eq_buf[(s->eq_step - 3) & V27TER_EQUALIZER_MASK].im - s->eq_buf[(s->eq_step - 1) & V27TER_EQUALIZER_MASK].im; q *= s->eq_buf[(s->eq_step - 2) & V27TER_EQUALIZER_MASK].im; s->gardner_integrate += (p + q > 0.0f) ? s->gardner_step : -s->gardner_step; if (abs(s->gardner_integrate) >= 256) { /* This integrate and dump approach avoids rapid changes of the equalizer put step. Rapid changes, without hysteresis, are bad. They degrade the equalizer performance when the true symbol boundary is close to a sample boundary. */ //span_log(&s->logging, SPAN_LOG_FLOW, "Hop %d\n", s->gardner_integrate); s->eq_put_step += (s->gardner_integrate/256); s->total_baud_timing_correction += (s->gardner_integrate/256); if (s->qam_report) s->qam_report(s->qam_user_data, NULL, NULL, s->gardner_integrate); s->gardner_integrate = 0; } //span_log(&s->logging, SPAN_LOG_FLOW, "Gardner=%10.5f 0x%X\n", p, s->eq_put_step); z = equalizer_get(s); //span_log(&s->logging, SPAN_LOG_FLOW, "Equalized symbol - %15.5f %15.5f\n", z.re, z.im); switch (s->training_stage) { case TRAINING_STAGE_NORMAL_OPERATION: decode_baud(s, &z); break; case TRAINING_STAGE_SYMBOL_ACQUISITION: /* Allow time for the Gardner algorithm to settle the baud timing */ /* Don't start narrowing the bandwidth of the Gardner algorithm too early. Some modems are a bit wobbly when they start sending the signal. Also, we start this analysis before our filter buffers have completely filled. */ if (++s->training_count >= 30) { s->gardner_step = 32; s->training_stage = TRAINING_STAGE_LOG_PHASE; s->angles[0] = s->start_angles[0] = arctan2(z.im, z.re); } break; case TRAINING_STAGE_LOG_PHASE: /* Record the current alternate phase angle */ angle = arctan2(z.im, z.re); s->angles[1] = s->start_angles[1] = angle; s->training_count = 1; s->training_stage = TRAINING_STAGE_WAIT_FOR_HOP; break; case TRAINING_STAGE_WAIT_FOR_HOP: angle = arctan2(z.im, z.re); /* Look for the initial ABAB sequence to display a phase reversal, which will signal the start of the scrambled ABAB segment */ ang = angle - s->angles[(s->training_count - 1) & 0xF]; s->angles[(s->training_count + 1) & 0xF] = angle; if ((ang > 0x20000000 || ang < -0x20000000) && s->training_count >= 3) { /* We seem to have a phase reversal */ /* Slam the carrier frequency into line, based on the total phase drift over the last section. Use the shift from the odd bits and the shift from the even bits to get better jitter suppression. We need to scale here, or at the maximum specified frequency deviation we could overflow, and get a silly answer. */ /* Step back a few symbols so we don't get ISI distorting things. */ i = (s->training_count - 8) & ~1; /* Avoid the possibility of a divide by zero */ if (i) { j = i & 0xF; ang = (s->angles[j] - s->start_angles[0])/i + (s->angles[j | 0x1] - s->start_angles[1])/i; if (s->bit_rate == 4800) s->carrier_phase_rate += ang/10; else s->carrier_phase_rate += 3*(ang/40); } span_log(&s->logging, SPAN_LOG_FLOW, "Coarse carrier frequency %7.2f (%d)\n", dds_frequencyf(s->carrier_phase_rate), s->training_count); /* Check if the carrier frequency is plausible */ if (s->carrier_phase_rate < dds_phase_ratef(CARRIER_NOMINAL_FREQ - 20.0f) || s->carrier_phase_rate > dds_phase_ratef(CARRIER_NOMINAL_FREQ + 20.0f)) { span_log(&s->logging, SPAN_LOG_FLOW, "Training failed (sequence failed)\n"); /* Park this modem */ s->training_stage = TRAINING_STAGE_PARKED; report_status_change(s, PUTBIT_TRAINING_FAILED); break; } /* Make a step shift in the phase, to pull it into line. We need to rotate the equalizer buffer, as well as the carrier phase, for this to play out nicely. */ angle += 0x80000000; p = angle*2.0f*3.14159f/(65536.0f*65536.0f); zz = complex_setf(cosf(p), -sinf(p)); for (i = 0; i <= V27TER_EQUALIZER_MASK; i++) s->eq_buf[i] = complex_mulf(&s->eq_buf[i], &zz); s->carrier_phase += angle; s->gardner_step = 2; /* We have just seen the first element of the scrambled sequence so skip it. */ s->training_bc = 1; s->training_bc ^= descramble(s, 1); descramble(s, 1); descramble(s, 1); s->training_count = 1; s->training_stage = TRAINING_STAGE_TRAIN_ON_ABAB; report_status_change(s, PUTBIT_TRAINING_IN_PROGRESS); } else if (++s->training_count > V27TER_TRAINING_SEG_3_LEN) { /* This is bogus. There are not this many bits in this section of a real training sequence. */ span_log(&s->logging, SPAN_LOG_FLOW, "Training failed (sequence failed)\n"); /* Park this modem */ s->training_stage = TRAINING_STAGE_PARKED; report_status_change(s, PUTBIT_TRAINING_FAILED); } break; case TRAINING_STAGE_TRAIN_ON_ABAB: /* Train on the scrambled ABAB section */ s->training_bc ^= descramble(s, 1); descramble(s, 1); descramble(s, 1); s->constellation_state = abab_pos[s->training_bc]; track_carrier(s, &z, &v27ter_constellation[s->constellation_state]); tune_equalizer(s, &z, &v27ter_constellation[s->constellation_state]); if (++s->training_count >= V27TER_TRAINING_SEG_5_LEN) { s->constellation_state = (s->bit_rate == 4800) ? 4 : 2; s->training_count = 0; s->training_stage = TRAINING_STAGE_TEST_ONES; s->carrier_track_i = 400.0f; s->carrier_track_p = 1000000.0f; } break; case TRAINING_STAGE_TEST_ONES: decode_baud(s, &z); /* Measure the training error */ if (s->bit_rate == 4800) zz = complex_subf(&z, &v27ter_constellation[s->constellation_state]); else zz = complex_subf(&z, &v27ter_constellation[s->constellation_state << 1]); s->training_error += powerf(&zz); if (++s->training_count >= V27TER_TRAINING_SEG_6_LEN) { if ((s->bit_rate == 4800 && s->training_error < 1.0f) || (s->bit_rate == 2400 && s->training_error < 1.0f)) { /* We are up and running */ span_log(&s->logging, SPAN_LOG_FLOW, "Training succeeded (constellation mismatch %f)\n", s->training_error); report_status_change(s, PUTBIT_TRAINING_SUCCEEDED); /* Apply some lag to the carrier off condition, to ensure the last few bits get pushed through the processing. */ s->signal_present = (s->bit_rate == 4800) ? 90 : 120; s->training_stage = TRAINING_STAGE_NORMAL_OPERATION; equalizer_save(s); s->carrier_phase_rate_save = s->carrier_phase_rate; s->agc_scaling_save = s->agc_scaling; } else { /* Training has failed */ span_log(&s->logging, SPAN_LOG_FLOW, "Training failed (constellation mismatch %f)\n", s->training_error); /* Park this modem */ s->training_stage = TRAINING_STAGE_PARKED; report_status_change(s, PUTBIT_TRAINING_FAILED); } } break; case TRAINING_STAGE_PARKED: /* We failed to train! */ /* Park here until the carrier drops. */ break; } if (s->qam_report) { s->qam_report(s->qam_user_data, &z, &v27ter_constellation[s->constellation_state], s->constellation_state); } } /*- End of function --------------------------------------------------------*/ int v27ter_rx(v27ter_rx_state_t *s, const int16_t amp[], int len) { int i; int j; int step; int16_t x; int32_t diff; complexf_t z; complexf_t zz; complexf_t sample; #if defined(SPANDSP_USE_FIXED_POINT) complexi_t zi; #endif int32_t power; if (s->bit_rate == 4800) { for (i = 0; i < len; i++) { s->rrc_filter[s->rrc_filter_step] = s->rrc_filter[s->rrc_filter_step + V27TER_RX_4800_FILTER_STEPS] = amp[i]; if (++s->rrc_filter_step >= V27TER_RX_4800_FILTER_STEPS) s->rrc_filter_step = 0; /* There should be no DC in the signal, but sometimes there is. We need to measure the power with the DC blocked, but not using a slow to respond DC blocker. Use the most elementary HPF. */ x = amp[i] >> 1; diff = x - s->last_sample; power = power_meter_update(&(s->power), diff); #if defined(IAXMODEM_STUFF) /* Quick power drop fudge */ diff = abs(diff); if (10*diff < s->high_sample) { if (++s->low_samples > 120) { power_meter_init(&(s->power), 4); s->high_sample = 0; s->low_samples = 0; } } else { s->low_samples = 0; if (diff > s->high_sample) s->high_sample = diff; } #endif s->last_sample = x; //span_log(&s->logging, SPAN_LOG_FLOW, "Power = %f\n", power_meter_current_dbm0(&(s->power))); if (s->signal_present) { /* Look for power below turnoff threshold to turn the carrier off */ #if defined(IAXMODEM_STUFF) if (s->carrier_drop_pending || power < s->carrier_off_power) #else if (power < s->carrier_off_power) #endif { if (--s->signal_present <= 0) { /* Count down a short delay, to ensure we push the last few bits through the filters before stopping. */ v27ter_rx_restart(s, s->bit_rate, FALSE); report_status_change(s, PUTBIT_CARRIER_DOWN); continue; } #if defined(IAXMODEM_STUFF) /* Carrier has dropped, but the put_bit is pending the signal_present delay. */ s->carrier_drop_pending = TRUE; #endif } } else { /* Look for power exceeding turnon threshold to turn the carrier on */ if (power < s->carrier_on_power) continue; s->signal_present = 1; #if defined(IAXMODEM_STUFF) s->carrier_drop_pending = FALSE; #endif report_status_change(s, PUTBIT_CARRIER_UP); } /* Only spend effort processing this data if the modem is not parked, after training failure. */ if (s->training_stage == TRAINING_STAGE_PARKED) continue; /* Put things into the equalization buffer at T/2 rate. The Gardner algorithm will fiddle the step to align this with the symbols. */ if ((s->eq_put_step -= RX_PULSESHAPER_4800_COEFF_SETS) <= 0) { if (s->training_stage == TRAINING_STAGE_SYMBOL_ACQUISITION) { /* Only AGC during the initial training */ s->agc_scaling = (1.0f/RX_PULSESHAPER_4800_GAIN)*1.414f/sqrtf(power); } /* Pulse shape while still at the carrier frequency, using a quadrature pair of filters. This results in a properly bandpass filtered complex signal, which can be brought directly to baseband by complex mixing. No further filtering, to remove mixer harmonics, is needed. */ step = -s->eq_put_step; if (step > RX_PULSESHAPER_4800_COEFF_SETS - 1) step = RX_PULSESHAPER_4800_COEFF_SETS - 1; s->eq_put_step += RX_PULSESHAPER_4800_COEFF_SETS*5/2; #if defined(SPANDSP_USE_FIXED_POINT) zi.re = (int32_t) rx_pulseshaper_4800[step][0].re*(int32_t) s->rrc_filter[s->rrc_filter_step]; zi.im = (int32_t) rx_pulseshaper_4800[step][0].im*(int32_t) s->rrc_filter[s->rrc_filter_step]; for (j = 1; j < V27TER_RX_4800_FILTER_STEPS; j++) { zi.re += (int32_t) rx_pulseshaper_4800[step][j].re*(int32_t) s->rrc_filter[j + s->rrc_filter_step]; zi.im += (int32_t) rx_pulseshaper_4800[step][j].im*(int32_t) s->rrc_filter[j + s->rrc_filter_step]; } sample.re = zi.re*s->agc_scaling; sample.im = zi.im*s->agc_scaling; #else zz.re = rx_pulseshaper_4800[step][0].re*s->rrc_filter[s->rrc_filter_step]; zz.im = rx_pulseshaper_4800[step][0].im*s->rrc_filter[s->rrc_filter_step]; for (j = 1; j < V27TER_RX_4800_FILTER_STEPS; j++) { zz.re += rx_pulseshaper_4800[step][j].re*s->rrc_filter[j + s->rrc_filter_step]; zz.im += rx_pulseshaper_4800[step][j].im*s->rrc_filter[j + s->rrc_filter_step]; } sample.re = zz.re*s->agc_scaling; sample.im = zz.im*s->agc_scaling; #endif /* Shift to baseband - since this is done in a full complex form, the result is clean, and requires no further filtering, apart from the equalizer. */ z = dds_lookup_complexf(s->carrier_phase); zz.re = sample.re*z.re - sample.im*z.im; zz.im = -sample.re*z.im - sample.im*z.re; process_half_baud(s, &zz); } dds_advancef(&(s->carrier_phase), s->carrier_phase_rate); } } else { for (i = 0; i < len; i++) { s->rrc_filter[s->rrc_filter_step] = s->rrc_filter[s->rrc_filter_step + V27TER_RX_2400_FILTER_STEPS] = amp[i]; if (++s->rrc_filter_step >= V27TER_RX_2400_FILTER_STEPS) s->rrc_filter_step = 0; /* There should be no DC in the signal, but sometimes there is. We need to measure the power with the DC blocked, but not using a slow to respond DC blocker. Use the most elementary HPF. */ x = amp[i] >> 1; diff = x - s->last_sample; power = power_meter_update(&(s->power), diff); #if defined(IAXMODEM_STUFF) /* Quick power drop fudge */ diff = abs(diff); if (10*diff < s->high_sample) { if (++s->low_samples > 120) { power_meter_init(&(s->power), 4); s->high_sample = 0; s->low_samples = 0; } } else { s->low_samples = 0; if (diff > s->high_sample) s->high_sample = diff; } #endif s->last_sample = x; //span_log(&s->logging, SPAN_LOG_FLOW, "Power = %f\n", power_meter_current_dbm0(&(s->power))); if (s->signal_present) { /* Look for power below turnoff threshold to turn the carrier off */ #if defined(IAXMODEM_STUFF) if (s->carrier_drop_pending || power < s->carrier_off_power) #else if (power < s->carrier_off_power) #endif { if (--s->signal_present <= 0) { /* Count down a short delay, to ensure we push the last few bits through the filters before stopping. */ v27ter_rx_restart(s, s->bit_rate, FALSE); report_status_change(s, PUTBIT_CARRIER_DOWN); continue; } #if defined(IAXMODEM_STUFF) /* Carrier has dropped, but the put_bit is pending the signal_present delay. */ s->carrier_drop_pending = TRUE; #endif } } else { /* Look for power exceeding turnon threshold to turn the carrier on */ if (power < s->carrier_on_power) continue; s->signal_present = 1; #if defined(IAXMODEM_STUFF) s->carrier_drop_pending = FALSE; #endif report_status_change(s, PUTBIT_CARRIER_UP); } /* Only spend effort processing this data if the modem is not parked, after training failure. */ if (s->training_stage == TRAINING_STAGE_PARKED) continue; /* Put things into the equalization buffer at T/2 rate. The Gardner algorithm will fiddle the step to align this with the symbols. */ if ((s->eq_put_step -= RX_PULSESHAPER_2400_COEFF_SETS) <= 0) { if (s->training_stage == TRAINING_STAGE_SYMBOL_ACQUISITION) { /* Only AGC during the initial training */ s->agc_scaling = (1.0f/RX_PULSESHAPER_2400_GAIN)*1.414f/sqrtf(power); } /* Pulse shape while still at the carrier frequency, using a quadrature pair of filters. This results in a properly bandpass filtered complex signal, which can be brought directly to bandband by complex mixing. No further filtering, to remove mixer harmonics, is needed. */ step = -s->eq_put_step; if (step > RX_PULSESHAPER_2400_COEFF_SETS - 1) step = RX_PULSESHAPER_2400_COEFF_SETS - 1; s->eq_put_step += RX_PULSESHAPER_2400_COEFF_SETS*20/(3*2); #if defined(SPANDSP_USE_FIXED_POINT) zi.re = (int32_t) rx_pulseshaper_2400[step][0].re*(int32_t) s->rrc_filter[s->rrc_filter_step]; zi.im = (int32_t) rx_pulseshaper_2400[step][0].im*(int32_t) s->rrc_filter[s->rrc_filter_step]; for (j = 1; j < V27TER_RX_2400_FILTER_STEPS; j++) { zi.re += (int32_t) rx_pulseshaper_2400[step][j].re*(int32_t) s->rrc_filter[j + s->rrc_filter_step]; zi.im += (int32_t) rx_pulseshaper_2400[step][j].im*(int32_t) s->rrc_filter[j + s->rrc_filter_step]; } sample.re = zi.re*s->agc_scaling; sample.im = zi.im*s->agc_scaling; #else zz.re = rx_pulseshaper_2400[step][0].re*s->rrc_filter[s->rrc_filter_step]; zz.im = rx_pulseshaper_2400[step][0].im*s->rrc_filter[s->rrc_filter_step]; for (j = 1; j < V27TER_RX_2400_FILTER_STEPS; j++) { zz.re += rx_pulseshaper_2400[step][j].re*s->rrc_filter[j + s->rrc_filter_step]; zz.im += rx_pulseshaper_2400[step][j].im*s->rrc_filter[j + s->rrc_filter_step]; } sample.re = zz.re*s->agc_scaling; sample.im = zz.im*s->agc_scaling; #endif /* Shift to baseband - since this is done in a full complex form, the result is clean, and requires no further filtering apart from the equalizer. */ z = dds_lookup_complexf(s->carrier_phase); zz.re = sample.re*z.re - sample.im*z.im; zz.im = -sample.re*z.im - sample.im*z.re; process_half_baud(s, &zz); } dds_advancef(&(s->carrier_phase), s->carrier_phase_rate); } } return 0; } /*- End of function --------------------------------------------------------*/ void v27ter_rx_set_put_bit(v27ter_rx_state_t *s, put_bit_func_t put_bit, void *user_data) { s->put_bit = put_bit; s->put_bit_user_data = user_data; } /*- End of function --------------------------------------------------------*/ void v27ter_rx_set_modem_status_handler(v27ter_rx_state_t *s, modem_tx_status_func_t handler, void *user_data) { s->status_handler = handler; s->status_user_data = user_data; } /*- End of function --------------------------------------------------------*/ int v27ter_rx_restart(v27ter_rx_state_t *s, int bit_rate, int old_train) { span_log(&s->logging, SPAN_LOG_FLOW, "Restarting V.27ter\n"); if (bit_rate != 4800 && bit_rate != 2400) return -1; s->bit_rate = bit_rate; #if defined(SPANDSP_USE_FIXED_POINT) memset(s->rrc_filter, 0, sizeof(s->rrc_filter)); #else vec_zerof(s->rrc_filter, sizeof(s->rrc_filter)/sizeof(s->rrc_filter[0])); #endif s->rrc_filter_step = 0; s->scramble_reg = 0x3C; s->scrambler_pattern_count = 0; s->training_stage = TRAINING_STAGE_SYMBOL_ACQUISITION; s->training_bc = 0; s->training_count = 0; s->training_error = 0.0f; s->signal_present = 0; #if defined(IAXMODEM_STUFF) s->high_sample = 0; s->low_samples = 0; s->carrier_drop_pending = FALSE; #endif s->carrier_phase = 0; s->carrier_track_i = 200000.0f; s->carrier_track_p = 10000000.0f; power_meter_init(&(s->power), 4); s->constellation_state = 0; if (s->old_train) { s->carrier_phase_rate = s->carrier_phase_rate_save; s->agc_scaling = s->agc_scaling_save; equalizer_restore(s); } else { s->carrier_phase_rate = dds_phase_ratef(CARRIER_NOMINAL_FREQ); s->agc_scaling = 0.005f/RX_PULSESHAPER_4800_GAIN; equalizer_reset(s); } s->eq_skip = 0; s->last_sample = 0; s->gardner_integrate = 0; s->total_baud_timing_correction = 0; s->gardner_step = 512; s->baud_phase = 0; return 0; } /*- End of function --------------------------------------------------------*/ v27ter_rx_state_t *v27ter_rx_init(v27ter_rx_state_t *s, int bit_rate, put_bit_func_t put_bit, void *user_data) { if (s == NULL) { if ((s = (v27ter_rx_state_t *) malloc(sizeof(*s))) == NULL) return NULL; } memset(s, 0, sizeof(*s)); span_log_init(&s->logging, SPAN_LOG_NONE, NULL); span_log_set_protocol(&s->logging, "V.27ter RX"); v27ter_rx_signal_cutoff(s, -45.5f); s->put_bit = put_bit; s->put_bit_user_data = user_data; v27ter_rx_restart(s, bit_rate, FALSE); return s; } /*- End of function --------------------------------------------------------*/ int v27ter_rx_free(v27ter_rx_state_t *s) { free(s); return 0; } /*- End of function --------------------------------------------------------*/ void v27ter_rx_set_qam_report_handler(v27ter_rx_state_t *s, qam_report_handler_t handler, void *user_data) { s->qam_report = handler; s->qam_user_data = user_data; } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/v17rx_constellation_maps.h0000644000175000017500000117427211150047216023011 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * v17rx_constellation_maps.h - ITU V.17 modem receive part. * Constellation mapping. * * Written by Steve Underwood * * Copyright (C) 2004 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: v17rx_constellation_maps.h,v 1.6 2008/07/10 13:34:00 steveu Exp $ */ /* The following table maps the 8 soft-decisions associated with every possible point in the constellation space. If you look at the constellations carefully, all 4 can be accurately mapped at 0.5 unit resolution. */ static const uint8_t constel_maps[4][36][36][8] = { { /* 14,400bps map */ { {0x50, 0x69, 0x5a, 0x63, 0x6c, 0x55, 0x66, 0x5f}, {0x50, 0x69, 0x5a, 0x63, 0x6c, 0x55, 0x66, 0x5f}, {0x50, 0x69, 0x5a, 0x63, 0x6c, 0x55, 0x66, 0x5f}, {0x00, 0x49, 0x5a, 0x63, 0x6c, 0x55, 0x66, 0x5f}, {0x00, 0x49, 0x5a, 0x63, 0x6c, 0x55, 0x66, 0x5f}, {0x00, 0x49, 0x5a, 0x63, 0x6c, 0x55, 0x66, 0x5f}, {0x00, 0x49, 0x5a, 0x63, 0x6c, 0x55, 0x66, 0x5f}, {0x00, 0x49, 0x5a, 0x63, 0x4c, 0x05, 0x66, 0x5f}, {0x00, 0x49, 0x5a, 0x63, 0x4c, 0x05, 0x66, 0x5f}, {0x00, 0x49, 0x5a, 0x63, 0x4c, 0x05, 0x66, 0x5f}, {0x00, 0x49, 0x5a, 0x63, 0x4c, 0x05, 0x66, 0x5f}, {0x00, 0x49, 0x5a, 0x63, 0x4c, 0x05, 0x66, 0x5f}, {0x00, 0x49, 0x7a, 0x63, 0x4c, 0x05, 0x66, 0x5f}, {0x00, 0x49, 0x7a, 0x63, 0x4c, 0x05, 0x66, 0x5f}, {0x00, 0x49, 0x7a, 0x73, 0x4c, 0x05, 0x66, 0x7f}, {0x00, 0x49, 0x7a, 0x73, 0x4c, 0x05, 0x66, 0x7f}, {0x08, 0x49, 0x7a, 0x73, 0x4c, 0x05, 0x76, 0x7f}, {0x08, 0x49, 0x7a, 0x73, 0x4c, 0x05, 0x76, 0x7f}, {0x08, 0x41, 0x7a, 0x73, 0x4c, 0x0d, 0x76, 0x7f}, {0x08, 0x41, 0x7a, 0x73, 0x4c, 0x0d, 0x76, 0x7f}, {0x08, 0x41, 0x6a, 0x73, 0x44, 0x0d, 0x76, 0x7f}, {0x08, 0x41, 0x6a, 0x73, 0x44, 0x0d, 0x76, 0x7f}, {0x08, 0x41, 0x6a, 0x53, 0x44, 0x0d, 0x76, 0x6f}, {0x08, 0x41, 0x6a, 0x53, 0x44, 0x0d, 0x76, 0x6f}, {0x08, 0x41, 0x6a, 0x53, 0x44, 0x0d, 0x56, 0x6f}, {0x08, 0x41, 0x6a, 0x53, 0x44, 0x0d, 0x56, 0x6f}, {0x08, 0x41, 0x6a, 0x53, 0x44, 0x0d, 0x56, 0x6f}, {0x08, 0x41, 0x6a, 0x53, 0x44, 0x0d, 0x56, 0x6f}, {0x08, 0x41, 0x6a, 0x53, 0x44, 0x0d, 0x56, 0x6f}, {0x08, 0x41, 0x6a, 0x53, 0x44, 0x0d, 0x56, 0x6f}, {0x58, 0x41, 0x6a, 0x53, 0x44, 0x5d, 0x56, 0x6f}, {0x58, 0x41, 0x6a, 0x53, 0x44, 0x5d, 0x56, 0x6f}, {0x58, 0x41, 0x6a, 0x53, 0x44, 0x5d, 0x56, 0x6f}, {0x58, 0x41, 0x6a, 0x53, 0x44, 0x5d, 0x56, 0x6f}, {0x58, 0x61, 0x6a, 0x53, 0x64, 0x5d, 0x56, 0x6f}, {0x58, 0x61, 0x6a, 0x53, 0x64, 0x5d, 0x56, 0x6f} }, { {0x50, 0x69, 0x5a, 0x63, 0x6c, 0x55, 0x66, 0x5f}, {0x50, 0x69, 0x5a, 0x63, 0x6c, 0x55, 0x66, 0x5f}, {0x50, 0x69, 0x5a, 0x63, 0x6c, 0x55, 0x66, 0x5f}, {0x50, 0x69, 0x5a, 0x63, 0x6c, 0x55, 0x66, 0x5f}, {0x00, 0x49, 0x5a, 0x63, 0x6c, 0x55, 0x66, 0x5f}, {0x00, 0x49, 0x5a, 0x63, 0x6c, 0x55, 0x66, 0x5f}, {0x00, 0x49, 0x5a, 0x63, 0x6c, 0x55, 0x66, 0x5f}, {0x00, 0x49, 0x5a, 0x63, 0x6c, 0x55, 0x66, 0x5f}, {0x00, 0x49, 0x5a, 0x63, 0x4c, 0x05, 0x66, 0x5f}, {0x00, 0x49, 0x5a, 0x63, 0x4c, 0x05, 0x66, 0x5f}, {0x00, 0x49, 0x5a, 0x63, 0x4c, 0x05, 0x66, 0x5f}, {0x00, 0x49, 0x5a, 0x63, 0x4c, 0x05, 0x66, 0x5f}, {0x00, 0x49, 0x7a, 0x63, 0x4c, 0x05, 0x66, 0x5f}, {0x00, 0x49, 0x7a, 0x63, 0x4c, 0x05, 0x66, 0x5f}, {0x00, 0x49, 0x7a, 0x73, 0x4c, 0x05, 0x66, 0x7f}, {0x00, 0x49, 0x7a, 0x73, 0x4c, 0x05, 0x66, 0x7f}, {0x08, 0x49, 0x7a, 0x73, 0x4c, 0x05, 0x76, 0x7f}, {0x08, 0x49, 0x7a, 0x73, 0x4c, 0x05, 0x76, 0x7f}, {0x08, 0x41, 0x7a, 0x73, 0x4c, 0x0d, 0x76, 0x7f}, {0x08, 0x41, 0x7a, 0x73, 0x4c, 0x0d, 0x76, 0x7f}, {0x08, 0x41, 0x6a, 0x73, 0x44, 0x0d, 0x76, 0x7f}, {0x08, 0x41, 0x6a, 0x73, 0x44, 0x0d, 0x76, 0x7f}, {0x08, 0x41, 0x6a, 0x53, 0x44, 0x0d, 0x76, 0x6f}, {0x08, 0x41, 0x6a, 0x53, 0x44, 0x0d, 0x76, 0x6f}, {0x08, 0x41, 0x6a, 0x53, 0x44, 0x0d, 0x56, 0x6f}, {0x08, 0x41, 0x6a, 0x53, 0x44, 0x0d, 0x56, 0x6f}, {0x08, 0x41, 0x6a, 0x53, 0x44, 0x0d, 0x56, 0x6f}, {0x08, 0x41, 0x6a, 0x53, 0x44, 0x0d, 0x56, 0x6f}, {0x08, 0x41, 0x6a, 0x53, 0x44, 0x0d, 0x56, 0x6f}, {0x58, 0x41, 0x6a, 0x53, 0x44, 0x5d, 0x56, 0x6f}, {0x58, 0x41, 0x6a, 0x53, 0x44, 0x5d, 0x56, 0x6f}, {0x58, 0x41, 0x6a, 0x53, 0x44, 0x5d, 0x56, 0x6f}, {0x58, 0x41, 0x6a, 0x53, 0x44, 0x5d, 0x56, 0x6f}, {0x58, 0x61, 0x6a, 0x53, 0x64, 0x5d, 0x56, 0x6f}, {0x58, 0x61, 0x6a, 0x53, 0x64, 0x5d, 0x56, 0x6f}, {0x58, 0x61, 0x6a, 0x53, 0x64, 0x5d, 0x56, 0x6f} }, { {0x50, 0x69, 0x5a, 0x63, 0x6c, 0x55, 0x66, 0x5f}, {0x50, 0x69, 0x5a, 0x63, 0x6c, 0x55, 0x66, 0x5f}, {0x50, 0x69, 0x5a, 0x63, 0x6c, 0x55, 0x66, 0x5f}, {0x50, 0x69, 0x5a, 0x63, 0x6c, 0x55, 0x66, 0x5f}, {0x50, 0x69, 0x5a, 0x63, 0x6c, 0x55, 0x66, 0x5f}, {0x00, 0x49, 0x5a, 0x63, 0x6c, 0x55, 0x66, 0x5f}, {0x00, 0x49, 0x5a, 0x63, 0x6c, 0x55, 0x66, 0x5f}, {0x00, 0x49, 0x5a, 0x63, 0x6c, 0x55, 0x66, 0x5f}, {0x00, 0x49, 0x5a, 0x63, 0x6c, 0x55, 0x66, 0x5f}, {0x00, 0x49, 0x5a, 0x63, 0x4c, 0x05, 0x66, 0x5f}, {0x00, 0x49, 0x5a, 0x63, 0x4c, 0x05, 0x66, 0x5f}, {0x00, 0x49, 0x5a, 0x63, 0x4c, 0x05, 0x66, 0x5f}, {0x00, 0x49, 0x7a, 0x63, 0x4c, 0x05, 0x66, 0x5f}, {0x00, 0x49, 0x7a, 0x63, 0x4c, 0x05, 0x66, 0x5f}, {0x00, 0x49, 0x7a, 0x73, 0x4c, 0x05, 0x66, 0x7f}, {0x00, 0x49, 0x7a, 0x73, 0x4c, 0x05, 0x66, 0x7f}, {0x08, 0x49, 0x7a, 0x73, 0x4c, 0x05, 0x76, 0x7f}, {0x08, 0x49, 0x7a, 0x73, 0x4c, 0x05, 0x76, 0x7f}, {0x08, 0x41, 0x7a, 0x73, 0x4c, 0x0d, 0x76, 0x7f}, {0x08, 0x41, 0x7a, 0x73, 0x4c, 0x0d, 0x76, 0x7f}, {0x08, 0x41, 0x6a, 0x73, 0x44, 0x0d, 0x76, 0x7f}, {0x08, 0x41, 0x6a, 0x73, 0x44, 0x0d, 0x76, 0x7f}, {0x08, 0x41, 0x6a, 0x53, 0x44, 0x0d, 0x76, 0x6f}, {0x08, 0x41, 0x6a, 0x53, 0x44, 0x0d, 0x76, 0x6f}, {0x08, 0x41, 0x6a, 0x53, 0x44, 0x0d, 0x56, 0x6f}, {0x08, 0x41, 0x6a, 0x53, 0x44, 0x0d, 0x56, 0x6f}, {0x08, 0x41, 0x6a, 0x53, 0x44, 0x0d, 0x56, 0x6f}, {0x08, 0x41, 0x6a, 0x53, 0x44, 0x0d, 0x56, 0x6f}, {0x58, 0x41, 0x6a, 0x53, 0x44, 0x5d, 0x56, 0x6f}, {0x58, 0x41, 0x6a, 0x53, 0x44, 0x5d, 0x56, 0x6f}, {0x58, 0x41, 0x6a, 0x53, 0x44, 0x5d, 0x56, 0x6f}, {0x58, 0x41, 0x6a, 0x53, 0x44, 0x5d, 0x56, 0x6f}, {0x58, 0x61, 0x6a, 0x53, 0x64, 0x5d, 0x56, 0x6f}, {0x58, 0x61, 0x6a, 0x53, 0x64, 0x5d, 0x56, 0x6f}, {0x58, 0x61, 0x6a, 0x53, 0x64, 0x5d, 0x56, 0x6f}, {0x58, 0x61, 0x6a, 0x53, 0x64, 0x5d, 0x56, 0x6f} }, { {0x50, 0x69, 0x5a, 0x43, 0x6c, 0x55, 0x46, 0x5f}, {0x50, 0x69, 0x5a, 0x63, 0x6c, 0x55, 0x66, 0x5f}, {0x50, 0x69, 0x5a, 0x63, 0x6c, 0x55, 0x66, 0x5f}, {0x50, 0x69, 0x5a, 0x63, 0x6c, 0x55, 0x66, 0x5f}, {0x50, 0x69, 0x5a, 0x63, 0x6c, 0x55, 0x66, 0x5f}, {0x50, 0x69, 0x5a, 0x63, 0x6c, 0x55, 0x66, 0x5f}, {0x00, 0x49, 0x5a, 0x63, 0x6c, 0x55, 0x66, 0x5f}, {0x00, 0x49, 0x5a, 0x63, 0x6c, 0x55, 0x66, 0x5f}, {0x00, 0x49, 0x5a, 0x63, 0x6c, 0x55, 0x66, 0x5f}, {0x00, 0x49, 0x5a, 0x63, 0x6c, 0x55, 0x66, 0x5f}, {0x00, 0x49, 0x5a, 0x63, 0x4c, 0x05, 0x66, 0x5f}, {0x00, 0x49, 0x5a, 0x63, 0x4c, 0x05, 0x66, 0x5f}, {0x00, 0x49, 0x7a, 0x63, 0x4c, 0x05, 0x66, 0x5f}, {0x00, 0x49, 0x7a, 0x63, 0x4c, 0x05, 0x66, 0x5f}, {0x00, 0x49, 0x7a, 0x73, 0x4c, 0x05, 0x66, 0x7f}, {0x00, 0x49, 0x7a, 0x73, 0x4c, 0x05, 0x66, 0x7f}, {0x08, 0x49, 0x7a, 0x73, 0x4c, 0x05, 0x76, 0x7f}, {0x08, 0x49, 0x7a, 0x73, 0x4c, 0x05, 0x76, 0x7f}, {0x08, 0x41, 0x7a, 0x73, 0x4c, 0x0d, 0x76, 0x7f}, {0x08, 0x41, 0x7a, 0x73, 0x4c, 0x0d, 0x76, 0x7f}, {0x08, 0x41, 0x6a, 0x73, 0x44, 0x0d, 0x76, 0x7f}, {0x08, 0x41, 0x6a, 0x73, 0x44, 0x0d, 0x76, 0x7f}, {0x08, 0x41, 0x6a, 0x53, 0x44, 0x0d, 0x76, 0x6f}, {0x08, 0x41, 0x6a, 0x53, 0x44, 0x0d, 0x76, 0x6f}, {0x08, 0x41, 0x6a, 0x53, 0x44, 0x0d, 0x56, 0x6f}, {0x08, 0x41, 0x6a, 0x53, 0x44, 0x0d, 0x56, 0x6f}, {0x08, 0x41, 0x6a, 0x53, 0x44, 0x0d, 0x56, 0x6f}, {0x58, 0x41, 0x6a, 0x53, 0x44, 0x5d, 0x56, 0x6f}, {0x58, 0x41, 0x6a, 0x53, 0x44, 0x5d, 0x56, 0x6f}, {0x58, 0x41, 0x6a, 0x53, 0x44, 0x5d, 0x56, 0x6f}, {0x58, 0x41, 0x6a, 0x53, 0x44, 0x5d, 0x56, 0x6f}, {0x58, 0x61, 0x6a, 0x53, 0x64, 0x5d, 0x56, 0x6f}, {0x58, 0x61, 0x6a, 0x53, 0x64, 0x5d, 0x56, 0x6f}, {0x58, 0x61, 0x6a, 0x53, 0x64, 0x5d, 0x56, 0x6f}, {0x58, 0x61, 0x6a, 0x53, 0x64, 0x5d, 0x56, 0x6f}, {0x58, 0x61, 0x4a, 0x03, 0x64, 0x5d, 0x56, 0x6f} }, { {0x50, 0x69, 0x5a, 0x43, 0x6c, 0x55, 0x46, 0x5f}, {0x50, 0x69, 0x5a, 0x43, 0x6c, 0x55, 0x46, 0x5f}, {0x50, 0x69, 0x5a, 0x63, 0x6c, 0x55, 0x66, 0x5f}, {0x50, 0x69, 0x5a, 0x63, 0x6c, 0x55, 0x66, 0x5f}, {0x50, 0x69, 0x5a, 0x63, 0x6c, 0x55, 0x66, 0x5f}, {0x50, 0x69, 0x5a, 0x63, 0x6c, 0x55, 0x66, 0x5f}, {0x50, 0x69, 0x5a, 0x63, 0x6c, 0x55, 0x66, 0x5f}, {0x00, 0x49, 0x5a, 0x63, 0x6c, 0x55, 0x66, 0x5f}, {0x00, 0x49, 0x5a, 0x63, 0x6c, 0x55, 0x66, 0x5f}, {0x00, 0x49, 0x5a, 0x63, 0x6c, 0x55, 0x66, 0x5f}, {0x00, 0x49, 0x5a, 0x63, 0x6c, 0x15, 0x66, 0x5f}, {0x00, 0x49, 0x5a, 0x63, 0x4c, 0x15, 0x66, 0x5f}, {0x00, 0x49, 0x7a, 0x63, 0x4c, 0x15, 0x66, 0x5f}, {0x00, 0x49, 0x7a, 0x63, 0x4c, 0x15, 0x66, 0x5f}, {0x00, 0x49, 0x7a, 0x73, 0x4c, 0x15, 0x66, 0x7f}, {0x00, 0x49, 0x7a, 0x73, 0x4c, 0x15, 0x66, 0x7f}, {0x08, 0x49, 0x7a, 0x73, 0x4c, 0x15, 0x76, 0x7f}, {0x08, 0x49, 0x7a, 0x73, 0x4c, 0x15, 0x76, 0x7f}, {0x08, 0x41, 0x7a, 0x73, 0x4c, 0x1d, 0x76, 0x7f}, {0x08, 0x41, 0x7a, 0x73, 0x4c, 0x1d, 0x76, 0x7f}, {0x08, 0x41, 0x6a, 0x73, 0x44, 0x1d, 0x76, 0x7f}, {0x08, 0x41, 0x6a, 0x73, 0x44, 0x1d, 0x76, 0x7f}, {0x08, 0x41, 0x6a, 0x53, 0x44, 0x1d, 0x76, 0x6f}, {0x08, 0x41, 0x6a, 0x53, 0x44, 0x1d, 0x76, 0x6f}, {0x08, 0x41, 0x6a, 0x53, 0x44, 0x1d, 0x56, 0x6f}, {0x08, 0x41, 0x6a, 0x53, 0x44, 0x1d, 0x56, 0x6f}, {0x58, 0x41, 0x6a, 0x53, 0x44, 0x5d, 0x56, 0x6f}, {0x58, 0x41, 0x6a, 0x53, 0x44, 0x5d, 0x56, 0x6f}, {0x58, 0x41, 0x6a, 0x53, 0x44, 0x5d, 0x56, 0x6f}, {0x58, 0x41, 0x6a, 0x53, 0x44, 0x5d, 0x56, 0x6f}, {0x58, 0x61, 0x6a, 0x53, 0x64, 0x5d, 0x56, 0x6f}, {0x58, 0x61, 0x6a, 0x53, 0x64, 0x5d, 0x56, 0x6f}, {0x58, 0x61, 0x6a, 0x53, 0x64, 0x5d, 0x56, 0x6f}, {0x58, 0x61, 0x6a, 0x53, 0x64, 0x5d, 0x56, 0x6f}, {0x58, 0x61, 0x4a, 0x03, 0x64, 0x5d, 0x56, 0x6f}, {0x58, 0x61, 0x4a, 0x03, 0x64, 0x5d, 0x56, 0x6f} }, { {0x50, 0x69, 0x5a, 0x43, 0x6c, 0x55, 0x46, 0x5f}, {0x50, 0x69, 0x5a, 0x43, 0x6c, 0x55, 0x46, 0x5f}, {0x50, 0x69, 0x5a, 0x43, 0x6c, 0x55, 0x46, 0x5f}, {0x50, 0x69, 0x5a, 0x63, 0x6c, 0x55, 0x66, 0x5f}, {0x50, 0x69, 0x5a, 0x63, 0x6c, 0x55, 0x66, 0x5f}, {0x50, 0x69, 0x5a, 0x63, 0x6c, 0x55, 0x66, 0x5f}, {0x50, 0x69, 0x5a, 0x63, 0x6c, 0x55, 0x66, 0x5f}, {0x50, 0x69, 0x5a, 0x63, 0x6c, 0x55, 0x66, 0x5f}, {0x00, 0x49, 0x5a, 0x63, 0x6c, 0x55, 0x66, 0x5f}, {0x00, 0x49, 0x5a, 0x63, 0x6c, 0x55, 0x66, 0x5f}, {0x00, 0x49, 0x5a, 0x63, 0x6c, 0x15, 0x66, 0x5f}, {0x00, 0x49, 0x5a, 0x63, 0x6c, 0x15, 0x66, 0x5f}, {0x00, 0x49, 0x7a, 0x63, 0x4c, 0x15, 0x66, 0x5f}, {0x00, 0x49, 0x7a, 0x63, 0x4c, 0x15, 0x66, 0x5f}, {0x00, 0x49, 0x7a, 0x73, 0x4c, 0x15, 0x66, 0x7f}, {0x00, 0x49, 0x7a, 0x73, 0x4c, 0x15, 0x66, 0x7f}, {0x08, 0x49, 0x7a, 0x73, 0x4c, 0x15, 0x76, 0x7f}, {0x08, 0x49, 0x7a, 0x73, 0x4c, 0x15, 0x76, 0x7f}, {0x08, 0x41, 0x7a, 0x73, 0x4c, 0x1d, 0x76, 0x7f}, {0x08, 0x41, 0x7a, 0x73, 0x4c, 0x1d, 0x76, 0x7f}, {0x08, 0x41, 0x6a, 0x73, 0x44, 0x1d, 0x76, 0x7f}, {0x08, 0x41, 0x6a, 0x73, 0x44, 0x1d, 0x76, 0x7f}, {0x08, 0x41, 0x6a, 0x53, 0x44, 0x1d, 0x76, 0x6f}, {0x08, 0x41, 0x6a, 0x53, 0x44, 0x1d, 0x76, 0x6f}, {0x08, 0x41, 0x6a, 0x53, 0x44, 0x1d, 0x56, 0x6f}, {0x58, 0x41, 0x6a, 0x53, 0x44, 0x1d, 0x56, 0x6f}, {0x58, 0x41, 0x6a, 0x53, 0x44, 0x5d, 0x56, 0x6f}, {0x58, 0x41, 0x6a, 0x53, 0x44, 0x5d, 0x56, 0x6f}, {0x58, 0x41, 0x6a, 0x53, 0x44, 0x5d, 0x56, 0x6f}, {0x58, 0x61, 0x6a, 0x53, 0x64, 0x5d, 0x56, 0x6f}, {0x58, 0x61, 0x6a, 0x53, 0x64, 0x5d, 0x56, 0x6f}, {0x58, 0x61, 0x6a, 0x53, 0x64, 0x5d, 0x56, 0x6f}, {0x58, 0x61, 0x6a, 0x53, 0x64, 0x5d, 0x56, 0x6f}, {0x58, 0x61, 0x4a, 0x03, 0x64, 0x5d, 0x56, 0x6f}, {0x58, 0x61, 0x4a, 0x03, 0x64, 0x5d, 0x56, 0x6f}, {0x58, 0x61, 0x4a, 0x03, 0x64, 0x5d, 0x56, 0x6f} }, { {0x50, 0x69, 0x5a, 0x43, 0x6c, 0x55, 0x46, 0x5f}, {0x50, 0x69, 0x5a, 0x43, 0x6c, 0x55, 0x46, 0x5f}, {0x50, 0x69, 0x5a, 0x43, 0x6c, 0x55, 0x46, 0x5f}, {0x50, 0x69, 0x5a, 0x43, 0x6c, 0x55, 0x46, 0x5f}, {0x50, 0x69, 0x5a, 0x63, 0x6c, 0x55, 0x66, 0x5f}, {0x50, 0x69, 0x5a, 0x63, 0x6c, 0x55, 0x66, 0x5f}, {0x50, 0x69, 0x5a, 0x63, 0x6c, 0x55, 0x66, 0x5f}, {0x50, 0x69, 0x5a, 0x63, 0x6c, 0x55, 0x66, 0x5f}, {0x10, 0x69, 0x5a, 0x63, 0x6c, 0x55, 0x66, 0x5f}, {0x10, 0x49, 0x5a, 0x63, 0x6c, 0x55, 0x66, 0x5f}, {0x10, 0x49, 0x5a, 0x63, 0x6c, 0x15, 0x66, 0x5f}, {0x10, 0x49, 0x5a, 0x63, 0x6c, 0x15, 0x66, 0x5f}, {0x10, 0x49, 0x7a, 0x63, 0x2c, 0x15, 0x66, 0x5f}, {0x10, 0x49, 0x7a, 0x63, 0x2c, 0x15, 0x66, 0x5f}, {0x10, 0x49, 0x7a, 0x73, 0x2c, 0x15, 0x66, 0x7f}, {0x10, 0x49, 0x7a, 0x73, 0x2c, 0x15, 0x66, 0x7f}, {0x18, 0x49, 0x7a, 0x73, 0x2c, 0x15, 0x76, 0x7f}, {0x18, 0x49, 0x7a, 0x73, 0x2c, 0x15, 0x76, 0x7f}, {0x18, 0x41, 0x7a, 0x73, 0x2c, 0x1d, 0x76, 0x7f}, {0x18, 0x41, 0x7a, 0x73, 0x2c, 0x1d, 0x76, 0x7f}, {0x18, 0x41, 0x6a, 0x73, 0x24, 0x1d, 0x76, 0x7f}, {0x18, 0x41, 0x6a, 0x73, 0x24, 0x1d, 0x76, 0x7f}, {0x18, 0x41, 0x6a, 0x53, 0x24, 0x1d, 0x76, 0x6f}, {0x18, 0x41, 0x6a, 0x53, 0x24, 0x1d, 0x76, 0x6f}, {0x58, 0x41, 0x6a, 0x53, 0x24, 0x1d, 0x56, 0x6f}, {0x58, 0x41, 0x6a, 0x53, 0x24, 0x1d, 0x56, 0x6f}, {0x58, 0x41, 0x6a, 0x53, 0x24, 0x5d, 0x56, 0x6f}, {0x58, 0x41, 0x6a, 0x53, 0x24, 0x5d, 0x56, 0x6f}, {0x58, 0x61, 0x6a, 0x53, 0x64, 0x5d, 0x56, 0x6f}, {0x58, 0x61, 0x6a, 0x53, 0x64, 0x5d, 0x56, 0x6f}, {0x58, 0x61, 0x6a, 0x53, 0x64, 0x5d, 0x56, 0x6f}, {0x58, 0x61, 0x6a, 0x53, 0x64, 0x5d, 0x56, 0x6f}, {0x58, 0x61, 0x4a, 0x03, 0x64, 0x5d, 0x56, 0x6f}, {0x58, 0x61, 0x4a, 0x03, 0x64, 0x5d, 0x56, 0x6f}, {0x58, 0x61, 0x4a, 0x03, 0x64, 0x5d, 0x56, 0x6f}, {0x58, 0x61, 0x4a, 0x03, 0x64, 0x5d, 0x56, 0x6f} }, { {0x50, 0x69, 0x0a, 0x43, 0x6c, 0x55, 0x46, 0x0f}, {0x50, 0x69, 0x5a, 0x43, 0x6c, 0x55, 0x46, 0x5f}, {0x50, 0x69, 0x5a, 0x43, 0x6c, 0x55, 0x46, 0x5f}, {0x50, 0x69, 0x5a, 0x43, 0x6c, 0x55, 0x46, 0x5f}, {0x50, 0x69, 0x5a, 0x43, 0x6c, 0x55, 0x46, 0x5f}, {0x50, 0x69, 0x5a, 0x63, 0x6c, 0x55, 0x66, 0x5f}, {0x50, 0x69, 0x5a, 0x63, 0x6c, 0x55, 0x66, 0x5f}, {0x50, 0x69, 0x5a, 0x63, 0x6c, 0x55, 0x66, 0x5f}, {0x10, 0x69, 0x5a, 0x63, 0x6c, 0x55, 0x66, 0x5f}, {0x10, 0x69, 0x5a, 0x63, 0x6c, 0x55, 0x66, 0x5f}, {0x10, 0x49, 0x5a, 0x63, 0x6c, 0x15, 0x66, 0x5f}, {0x10, 0x49, 0x5a, 0x63, 0x6c, 0x15, 0x66, 0x5f}, {0x10, 0x49, 0x7a, 0x63, 0x2c, 0x15, 0x66, 0x5f}, {0x10, 0x49, 0x7a, 0x63, 0x2c, 0x15, 0x66, 0x5f}, {0x10, 0x49, 0x7a, 0x73, 0x2c, 0x15, 0x66, 0x7f}, {0x10, 0x49, 0x7a, 0x73, 0x2c, 0x15, 0x66, 0x7f}, {0x18, 0x49, 0x7a, 0x73, 0x2c, 0x15, 0x76, 0x7f}, {0x18, 0x49, 0x7a, 0x73, 0x2c, 0x15, 0x76, 0x7f}, {0x18, 0x41, 0x7a, 0x73, 0x2c, 0x1d, 0x76, 0x7f}, {0x18, 0x41, 0x7a, 0x73, 0x2c, 0x1d, 0x76, 0x7f}, {0x18, 0x41, 0x6a, 0x73, 0x24, 0x1d, 0x76, 0x7f}, {0x18, 0x41, 0x6a, 0x73, 0x24, 0x1d, 0x76, 0x7f}, {0x18, 0x41, 0x6a, 0x53, 0x24, 0x1d, 0x76, 0x6f}, {0x18, 0x41, 0x6a, 0x53, 0x24, 0x1d, 0x76, 0x6f}, {0x58, 0x41, 0x6a, 0x53, 0x24, 0x1d, 0x56, 0x6f}, {0x58, 0x41, 0x6a, 0x53, 0x24, 0x1d, 0x56, 0x6f}, {0x58, 0x41, 0x6a, 0x53, 0x24, 0x5d, 0x56, 0x6f}, {0x58, 0x61, 0x6a, 0x53, 0x24, 0x5d, 0x56, 0x6f}, {0x58, 0x61, 0x6a, 0x53, 0x64, 0x5d, 0x56, 0x6f}, {0x58, 0x61, 0x6a, 0x53, 0x64, 0x5d, 0x56, 0x6f}, {0x58, 0x61, 0x6a, 0x53, 0x64, 0x5d, 0x56, 0x6f}, {0x58, 0x61, 0x4a, 0x03, 0x64, 0x5d, 0x56, 0x6f}, {0x58, 0x61, 0x4a, 0x03, 0x64, 0x5d, 0x56, 0x6f}, {0x58, 0x61, 0x4a, 0x03, 0x64, 0x5d, 0x56, 0x6f}, {0x58, 0x61, 0x4a, 0x03, 0x64, 0x5d, 0x56, 0x6f}, {0x58, 0x61, 0x4a, 0x03, 0x64, 0x5d, 0x06, 0x4f} }, { {0x50, 0x69, 0x0a, 0x43, 0x6c, 0x55, 0x46, 0x0f}, {0x50, 0x69, 0x0a, 0x43, 0x6c, 0x55, 0x46, 0x0f}, {0x50, 0x69, 0x5a, 0x43, 0x6c, 0x55, 0x46, 0x5f}, {0x50, 0x69, 0x5a, 0x43, 0x6c, 0x55, 0x46, 0x5f}, {0x50, 0x69, 0x5a, 0x43, 0x6c, 0x55, 0x46, 0x5f}, {0x50, 0x69, 0x5a, 0x43, 0x6c, 0x55, 0x46, 0x5f}, {0x50, 0x69, 0x5a, 0x23, 0x6c, 0x55, 0x66, 0x5f}, {0x50, 0x69, 0x5a, 0x23, 0x6c, 0x55, 0x66, 0x5f}, {0x10, 0x69, 0x5a, 0x23, 0x6c, 0x55, 0x66, 0x5f}, {0x10, 0x69, 0x5a, 0x23, 0x6c, 0x55, 0x66, 0x5f}, {0x10, 0x29, 0x5a, 0x23, 0x6c, 0x15, 0x66, 0x5f}, {0x10, 0x29, 0x5a, 0x23, 0x6c, 0x15, 0x66, 0x5f}, {0x10, 0x29, 0x7a, 0x23, 0x2c, 0x15, 0x66, 0x5f}, {0x10, 0x29, 0x7a, 0x23, 0x2c, 0x15, 0x66, 0x5f}, {0x10, 0x29, 0x7a, 0x33, 0x2c, 0x15, 0x66, 0x7f}, {0x10, 0x29, 0x7a, 0x33, 0x2c, 0x15, 0x66, 0x7f}, {0x18, 0x29, 0x7a, 0x33, 0x2c, 0x15, 0x76, 0x7f}, {0x18, 0x29, 0x7a, 0x33, 0x2c, 0x15, 0x76, 0x7f}, {0x18, 0x21, 0x7a, 0x33, 0x2c, 0x1d, 0x76, 0x7f}, {0x18, 0x21, 0x7a, 0x33, 0x2c, 0x1d, 0x76, 0x7f}, {0x18, 0x21, 0x6a, 0x33, 0x24, 0x1d, 0x76, 0x7f}, {0x18, 0x21, 0x6a, 0x33, 0x24, 0x1d, 0x76, 0x7f}, {0x18, 0x21, 0x6a, 0x13, 0x24, 0x1d, 0x76, 0x6f}, {0x18, 0x21, 0x6a, 0x13, 0x24, 0x1d, 0x76, 0x6f}, {0x58, 0x21, 0x6a, 0x13, 0x24, 0x1d, 0x56, 0x6f}, {0x58, 0x21, 0x6a, 0x13, 0x24, 0x1d, 0x56, 0x6f}, {0x58, 0x61, 0x6a, 0x13, 0x24, 0x5d, 0x56, 0x6f}, {0x58, 0x61, 0x6a, 0x13, 0x24, 0x5d, 0x56, 0x6f}, {0x58, 0x61, 0x6a, 0x13, 0x64, 0x5d, 0x56, 0x6f}, {0x58, 0x61, 0x6a, 0x13, 0x64, 0x5d, 0x56, 0x6f}, {0x58, 0x61, 0x4a, 0x03, 0x64, 0x5d, 0x56, 0x6f}, {0x58, 0x61, 0x4a, 0x03, 0x64, 0x5d, 0x56, 0x6f}, {0x58, 0x61, 0x4a, 0x03, 0x64, 0x5d, 0x56, 0x6f}, {0x58, 0x61, 0x4a, 0x03, 0x64, 0x5d, 0x56, 0x6f}, {0x58, 0x61, 0x4a, 0x03, 0x64, 0x5d, 0x06, 0x4f}, {0x58, 0x61, 0x4a, 0x03, 0x64, 0x5d, 0x06, 0x4f} }, { {0x50, 0x69, 0x0a, 0x43, 0x6c, 0x55, 0x46, 0x0f}, {0x50, 0x69, 0x0a, 0x43, 0x6c, 0x55, 0x46, 0x0f}, {0x50, 0x69, 0x0a, 0x43, 0x6c, 0x55, 0x46, 0x0f}, {0x50, 0x69, 0x5a, 0x43, 0x6c, 0x55, 0x46, 0x5f}, {0x50, 0x69, 0x5a, 0x43, 0x6c, 0x55, 0x46, 0x5f}, {0x50, 0x69, 0x5a, 0x43, 0x6c, 0x55, 0x46, 0x5f}, {0x50, 0x69, 0x5a, 0x23, 0x6c, 0x55, 0x46, 0x5f}, {0x50, 0x69, 0x5a, 0x23, 0x6c, 0x55, 0x66, 0x5f}, {0x10, 0x69, 0x5a, 0x23, 0x6c, 0x55, 0x66, 0x5f}, {0x10, 0x69, 0x5a, 0x23, 0x6c, 0x55, 0x66, 0x5f}, {0x10, 0x29, 0x5a, 0x23, 0x6c, 0x15, 0x66, 0x5f}, {0x10, 0x29, 0x5a, 0x23, 0x6c, 0x15, 0x66, 0x5f}, {0x10, 0x29, 0x7a, 0x23, 0x2c, 0x15, 0x66, 0x5f}, {0x10, 0x29, 0x7a, 0x23, 0x2c, 0x15, 0x66, 0x5f}, {0x10, 0x29, 0x7a, 0x33, 0x2c, 0x15, 0x66, 0x7f}, {0x10, 0x29, 0x7a, 0x33, 0x2c, 0x15, 0x66, 0x7f}, {0x18, 0x29, 0x7a, 0x33, 0x2c, 0x15, 0x76, 0x7f}, {0x18, 0x29, 0x7a, 0x33, 0x2c, 0x15, 0x76, 0x7f}, {0x18, 0x21, 0x7a, 0x33, 0x2c, 0x1d, 0x76, 0x7f}, {0x18, 0x21, 0x7a, 0x33, 0x2c, 0x1d, 0x76, 0x7f}, {0x18, 0x21, 0x6a, 0x33, 0x24, 0x1d, 0x76, 0x7f}, {0x18, 0x21, 0x6a, 0x33, 0x24, 0x1d, 0x76, 0x7f}, {0x18, 0x21, 0x6a, 0x13, 0x24, 0x1d, 0x76, 0x6f}, {0x18, 0x21, 0x6a, 0x13, 0x24, 0x1d, 0x76, 0x6f}, {0x58, 0x21, 0x6a, 0x13, 0x24, 0x1d, 0x56, 0x6f}, {0x58, 0x21, 0x6a, 0x13, 0x24, 0x1d, 0x56, 0x6f}, {0x58, 0x61, 0x6a, 0x13, 0x24, 0x5d, 0x56, 0x6f}, {0x58, 0x61, 0x6a, 0x13, 0x24, 0x5d, 0x56, 0x6f}, {0x58, 0x61, 0x6a, 0x13, 0x64, 0x5d, 0x56, 0x6f}, {0x58, 0x61, 0x4a, 0x13, 0x64, 0x5d, 0x56, 0x6f}, {0x58, 0x61, 0x4a, 0x03, 0x64, 0x5d, 0x56, 0x6f}, {0x58, 0x61, 0x4a, 0x03, 0x64, 0x5d, 0x56, 0x6f}, {0x58, 0x61, 0x4a, 0x03, 0x64, 0x5d, 0x56, 0x6f}, {0x58, 0x61, 0x4a, 0x03, 0x64, 0x5d, 0x06, 0x4f}, {0x58, 0x61, 0x4a, 0x03, 0x64, 0x5d, 0x06, 0x4f}, {0x58, 0x61, 0x4a, 0x03, 0x64, 0x5d, 0x06, 0x4f} }, { {0x50, 0x69, 0x0a, 0x43, 0x6c, 0x55, 0x46, 0x0f}, {0x50, 0x69, 0x0a, 0x43, 0x6c, 0x55, 0x46, 0x0f}, {0x50, 0x69, 0x0a, 0x43, 0x6c, 0x55, 0x46, 0x0f}, {0x50, 0x69, 0x0a, 0x43, 0x6c, 0x55, 0x46, 0x0f}, {0x50, 0x69, 0x1a, 0x43, 0x6c, 0x55, 0x46, 0x5f}, {0x50, 0x69, 0x1a, 0x43, 0x6c, 0x55, 0x46, 0x5f}, {0x50, 0x69, 0x1a, 0x23, 0x6c, 0x55, 0x46, 0x5f}, {0x50, 0x69, 0x1a, 0x23, 0x6c, 0x55, 0x46, 0x5f}, {0x10, 0x69, 0x1a, 0x23, 0x6c, 0x55, 0x26, 0x5f}, {0x10, 0x69, 0x1a, 0x23, 0x6c, 0x55, 0x26, 0x5f}, {0x10, 0x29, 0x1a, 0x23, 0x6c, 0x15, 0x26, 0x5f}, {0x10, 0x29, 0x1a, 0x23, 0x6c, 0x15, 0x26, 0x5f}, {0x10, 0x29, 0x3a, 0x23, 0x2c, 0x15, 0x26, 0x5f}, {0x10, 0x29, 0x3a, 0x23, 0x2c, 0x15, 0x26, 0x5f}, {0x10, 0x29, 0x3a, 0x33, 0x2c, 0x15, 0x26, 0x7f}, {0x10, 0x29, 0x3a, 0x33, 0x2c, 0x15, 0x26, 0x7f}, {0x18, 0x29, 0x3a, 0x33, 0x2c, 0x15, 0x36, 0x7f}, {0x18, 0x29, 0x3a, 0x33, 0x2c, 0x15, 0x36, 0x7f}, {0x18, 0x21, 0x3a, 0x33, 0x2c, 0x1d, 0x36, 0x7f}, {0x18, 0x21, 0x3a, 0x33, 0x2c, 0x1d, 0x36, 0x7f}, {0x18, 0x21, 0x2a, 0x33, 0x24, 0x1d, 0x36, 0x7f}, {0x18, 0x21, 0x2a, 0x33, 0x24, 0x1d, 0x36, 0x7f}, {0x18, 0x21, 0x2a, 0x13, 0x24, 0x1d, 0x36, 0x6f}, {0x18, 0x21, 0x2a, 0x13, 0x24, 0x1d, 0x36, 0x6f}, {0x58, 0x21, 0x2a, 0x13, 0x24, 0x1d, 0x16, 0x6f}, {0x58, 0x21, 0x2a, 0x13, 0x24, 0x1d, 0x16, 0x6f}, {0x58, 0x61, 0x2a, 0x13, 0x24, 0x5d, 0x16, 0x6f}, {0x58, 0x61, 0x2a, 0x13, 0x24, 0x5d, 0x16, 0x6f}, {0x58, 0x61, 0x4a, 0x13, 0x64, 0x5d, 0x16, 0x6f}, {0x58, 0x61, 0x4a, 0x13, 0x64, 0x5d, 0x16, 0x6f}, {0x58, 0x61, 0x4a, 0x03, 0x64, 0x5d, 0x16, 0x6f}, {0x58, 0x61, 0x4a, 0x03, 0x64, 0x5d, 0x16, 0x6f}, {0x58, 0x61, 0x4a, 0x03, 0x64, 0x5d, 0x06, 0x4f}, {0x58, 0x61, 0x4a, 0x03, 0x64, 0x5d, 0x06, 0x4f}, {0x58, 0x61, 0x4a, 0x03, 0x64, 0x5d, 0x06, 0x4f}, {0x58, 0x61, 0x4a, 0x03, 0x64, 0x5d, 0x06, 0x4f} }, { {0x50, 0x69, 0x0a, 0x43, 0x6c, 0x55, 0x46, 0x0f}, {0x50, 0x69, 0x0a, 0x43, 0x6c, 0x55, 0x46, 0x0f}, {0x50, 0x69, 0x0a, 0x43, 0x6c, 0x55, 0x46, 0x0f}, {0x50, 0x69, 0x0a, 0x43, 0x6c, 0x55, 0x46, 0x0f}, {0x50, 0x69, 0x1a, 0x43, 0x6c, 0x55, 0x46, 0x0f}, {0x50, 0x69, 0x1a, 0x43, 0x6c, 0x55, 0x46, 0x5f}, {0x50, 0x69, 0x1a, 0x23, 0x6c, 0x55, 0x46, 0x5f}, {0x50, 0x69, 0x1a, 0x23, 0x6c, 0x55, 0x46, 0x5f}, {0x10, 0x69, 0x1a, 0x23, 0x6c, 0x55, 0x26, 0x5f}, {0x10, 0x69, 0x1a, 0x23, 0x6c, 0x55, 0x26, 0x5f}, {0x10, 0x29, 0x1a, 0x23, 0x6c, 0x15, 0x26, 0x5f}, {0x10, 0x29, 0x1a, 0x23, 0x6c, 0x15, 0x26, 0x5f}, {0x10, 0x29, 0x3a, 0x23, 0x2c, 0x15, 0x26, 0x5f}, {0x10, 0x29, 0x3a, 0x23, 0x2c, 0x15, 0x26, 0x5f}, {0x10, 0x29, 0x3a, 0x33, 0x2c, 0x15, 0x26, 0x7f}, {0x10, 0x29, 0x3a, 0x33, 0x2c, 0x15, 0x26, 0x7f}, {0x18, 0x29, 0x3a, 0x33, 0x2c, 0x15, 0x36, 0x7f}, {0x18, 0x29, 0x3a, 0x33, 0x2c, 0x15, 0x36, 0x7f}, {0x18, 0x21, 0x3a, 0x33, 0x2c, 0x1d, 0x36, 0x7f}, {0x18, 0x21, 0x3a, 0x33, 0x2c, 0x1d, 0x36, 0x7f}, {0x18, 0x21, 0x2a, 0x33, 0x24, 0x1d, 0x36, 0x7f}, {0x18, 0x21, 0x2a, 0x33, 0x24, 0x1d, 0x36, 0x7f}, {0x18, 0x21, 0x2a, 0x13, 0x24, 0x1d, 0x36, 0x6f}, {0x18, 0x21, 0x2a, 0x13, 0x24, 0x1d, 0x36, 0x6f}, {0x58, 0x21, 0x2a, 0x13, 0x24, 0x1d, 0x16, 0x6f}, {0x58, 0x21, 0x2a, 0x13, 0x24, 0x1d, 0x16, 0x6f}, {0x58, 0x61, 0x2a, 0x13, 0x24, 0x5d, 0x16, 0x6f}, {0x58, 0x61, 0x2a, 0x13, 0x24, 0x5d, 0x16, 0x6f}, {0x58, 0x61, 0x4a, 0x13, 0x64, 0x5d, 0x16, 0x6f}, {0x58, 0x61, 0x4a, 0x13, 0x64, 0x5d, 0x16, 0x6f}, {0x58, 0x61, 0x4a, 0x03, 0x64, 0x5d, 0x16, 0x6f}, {0x58, 0x61, 0x4a, 0x03, 0x64, 0x5d, 0x16, 0x4f}, {0x58, 0x61, 0x4a, 0x03, 0x64, 0x5d, 0x06, 0x4f}, {0x58, 0x61, 0x4a, 0x03, 0x64, 0x5d, 0x06, 0x4f}, {0x58, 0x61, 0x4a, 0x03, 0x64, 0x5d, 0x06, 0x4f}, {0x58, 0x61, 0x4a, 0x03, 0x64, 0x5d, 0x06, 0x4f} }, { {0x50, 0x69, 0x0a, 0x43, 0x6c, 0x75, 0x46, 0x0f}, {0x50, 0x69, 0x0a, 0x43, 0x6c, 0x75, 0x46, 0x0f}, {0x50, 0x69, 0x0a, 0x43, 0x6c, 0x75, 0x46, 0x0f}, {0x50, 0x69, 0x0a, 0x43, 0x6c, 0x75, 0x46, 0x0f}, {0x50, 0x69, 0x1a, 0x43, 0x6c, 0x75, 0x46, 0x0f}, {0x50, 0x69, 0x1a, 0x43, 0x6c, 0x75, 0x46, 0x0f}, {0x50, 0x69, 0x1a, 0x23, 0x6c, 0x75, 0x46, 0x1f}, {0x50, 0x69, 0x1a, 0x23, 0x6c, 0x75, 0x46, 0x1f}, {0x10, 0x69, 0x1a, 0x23, 0x6c, 0x75, 0x26, 0x1f}, {0x10, 0x69, 0x1a, 0x23, 0x6c, 0x75, 0x26, 0x1f}, {0x10, 0x29, 0x1a, 0x23, 0x6c, 0x35, 0x26, 0x1f}, {0x10, 0x29, 0x1a, 0x23, 0x6c, 0x35, 0x26, 0x1f}, {0x10, 0x29, 0x3a, 0x23, 0x2c, 0x35, 0x26, 0x1f}, {0x10, 0x29, 0x3a, 0x23, 0x2c, 0x35, 0x26, 0x1f}, {0x10, 0x29, 0x3a, 0x33, 0x2c, 0x35, 0x26, 0x3f}, {0x10, 0x29, 0x3a, 0x33, 0x2c, 0x35, 0x26, 0x3f}, {0x18, 0x29, 0x3a, 0x33, 0x2c, 0x35, 0x36, 0x3f}, {0x18, 0x29, 0x3a, 0x33, 0x2c, 0x35, 0x36, 0x3f}, {0x18, 0x21, 0x3a, 0x33, 0x2c, 0x3d, 0x36, 0x3f}, {0x18, 0x21, 0x3a, 0x33, 0x2c, 0x3d, 0x36, 0x3f}, {0x18, 0x21, 0x2a, 0x33, 0x24, 0x3d, 0x36, 0x3f}, {0x18, 0x21, 0x2a, 0x33, 0x24, 0x3d, 0x36, 0x3f}, {0x18, 0x21, 0x2a, 0x13, 0x24, 0x3d, 0x36, 0x2f}, {0x18, 0x21, 0x2a, 0x13, 0x24, 0x3d, 0x36, 0x2f}, {0x58, 0x21, 0x2a, 0x13, 0x24, 0x3d, 0x16, 0x2f}, {0x58, 0x21, 0x2a, 0x13, 0x24, 0x3d, 0x16, 0x2f}, {0x58, 0x61, 0x2a, 0x13, 0x24, 0x7d, 0x16, 0x2f}, {0x58, 0x61, 0x2a, 0x13, 0x24, 0x7d, 0x16, 0x2f}, {0x58, 0x61, 0x4a, 0x13, 0x64, 0x7d, 0x16, 0x2f}, {0x58, 0x61, 0x4a, 0x13, 0x64, 0x7d, 0x16, 0x2f}, {0x58, 0x61, 0x4a, 0x03, 0x64, 0x7d, 0x16, 0x4f}, {0x58, 0x61, 0x4a, 0x03, 0x64, 0x7d, 0x16, 0x4f}, {0x58, 0x61, 0x4a, 0x03, 0x64, 0x7d, 0x06, 0x4f}, {0x58, 0x61, 0x4a, 0x03, 0x64, 0x7d, 0x06, 0x4f}, {0x58, 0x61, 0x4a, 0x03, 0x64, 0x7d, 0x06, 0x4f}, {0x58, 0x61, 0x4a, 0x03, 0x64, 0x7d, 0x06, 0x4f} }, { {0x50, 0x69, 0x0a, 0x43, 0x6c, 0x75, 0x46, 0x0f}, {0x50, 0x69, 0x0a, 0x43, 0x6c, 0x75, 0x46, 0x0f}, {0x50, 0x69, 0x0a, 0x43, 0x6c, 0x75, 0x46, 0x0f}, {0x50, 0x69, 0x0a, 0x43, 0x6c, 0x75, 0x46, 0x0f}, {0x50, 0x69, 0x1a, 0x43, 0x6c, 0x75, 0x46, 0x0f}, {0x50, 0x69, 0x1a, 0x43, 0x6c, 0x75, 0x46, 0x0f}, {0x50, 0x69, 0x1a, 0x23, 0x6c, 0x75, 0x46, 0x1f}, {0x50, 0x69, 0x1a, 0x23, 0x6c, 0x75, 0x46, 0x1f}, {0x10, 0x69, 0x1a, 0x23, 0x6c, 0x75, 0x26, 0x1f}, {0x10, 0x69, 0x1a, 0x23, 0x6c, 0x75, 0x26, 0x1f}, {0x10, 0x29, 0x1a, 0x23, 0x6c, 0x35, 0x26, 0x1f}, {0x10, 0x29, 0x1a, 0x23, 0x6c, 0x35, 0x26, 0x1f}, {0x10, 0x29, 0x3a, 0x23, 0x2c, 0x35, 0x26, 0x1f}, {0x10, 0x29, 0x3a, 0x23, 0x2c, 0x35, 0x26, 0x1f}, {0x10, 0x29, 0x3a, 0x33, 0x2c, 0x35, 0x26, 0x3f}, {0x10, 0x29, 0x3a, 0x33, 0x2c, 0x35, 0x26, 0x3f}, {0x18, 0x29, 0x3a, 0x33, 0x2c, 0x35, 0x36, 0x3f}, {0x18, 0x29, 0x3a, 0x33, 0x2c, 0x35, 0x36, 0x3f}, {0x18, 0x21, 0x3a, 0x33, 0x2c, 0x3d, 0x36, 0x3f}, {0x18, 0x21, 0x3a, 0x33, 0x2c, 0x3d, 0x36, 0x3f}, {0x18, 0x21, 0x2a, 0x33, 0x24, 0x3d, 0x36, 0x3f}, {0x18, 0x21, 0x2a, 0x33, 0x24, 0x3d, 0x36, 0x3f}, {0x18, 0x21, 0x2a, 0x13, 0x24, 0x3d, 0x36, 0x2f}, {0x18, 0x21, 0x2a, 0x13, 0x24, 0x3d, 0x36, 0x2f}, {0x58, 0x21, 0x2a, 0x13, 0x24, 0x3d, 0x16, 0x2f}, {0x58, 0x21, 0x2a, 0x13, 0x24, 0x3d, 0x16, 0x2f}, {0x58, 0x61, 0x2a, 0x13, 0x24, 0x7d, 0x16, 0x2f}, {0x58, 0x61, 0x2a, 0x13, 0x24, 0x7d, 0x16, 0x2f}, {0x58, 0x61, 0x4a, 0x13, 0x64, 0x7d, 0x16, 0x2f}, {0x58, 0x61, 0x4a, 0x13, 0x64, 0x7d, 0x16, 0x2f}, {0x58, 0x61, 0x4a, 0x03, 0x64, 0x7d, 0x16, 0x4f}, {0x58, 0x61, 0x4a, 0x03, 0x64, 0x7d, 0x16, 0x4f}, {0x58, 0x61, 0x4a, 0x03, 0x64, 0x7d, 0x06, 0x4f}, {0x58, 0x61, 0x4a, 0x03, 0x64, 0x7d, 0x06, 0x4f}, {0x58, 0x61, 0x4a, 0x03, 0x64, 0x7d, 0x06, 0x4f}, {0x58, 0x61, 0x4a, 0x03, 0x64, 0x7d, 0x06, 0x4f} }, { {0x70, 0x69, 0x0a, 0x43, 0x7c, 0x75, 0x46, 0x0f}, {0x70, 0x69, 0x0a, 0x43, 0x7c, 0x75, 0x46, 0x0f}, {0x70, 0x69, 0x0a, 0x43, 0x7c, 0x75, 0x46, 0x0f}, {0x70, 0x69, 0x0a, 0x43, 0x7c, 0x75, 0x46, 0x0f}, {0x70, 0x69, 0x1a, 0x43, 0x7c, 0x75, 0x46, 0x0f}, {0x70, 0x69, 0x1a, 0x43, 0x7c, 0x75, 0x46, 0x0f}, {0x70, 0x69, 0x1a, 0x23, 0x7c, 0x75, 0x46, 0x1f}, {0x70, 0x69, 0x1a, 0x23, 0x7c, 0x75, 0x46, 0x1f}, {0x30, 0x69, 0x1a, 0x23, 0x7c, 0x75, 0x26, 0x1f}, {0x30, 0x69, 0x1a, 0x23, 0x7c, 0x75, 0x26, 0x1f}, {0x30, 0x29, 0x1a, 0x23, 0x7c, 0x35, 0x26, 0x1f}, {0x30, 0x29, 0x1a, 0x23, 0x7c, 0x35, 0x26, 0x1f}, {0x30, 0x29, 0x3a, 0x23, 0x3c, 0x35, 0x26, 0x1f}, {0x30, 0x29, 0x3a, 0x23, 0x3c, 0x35, 0x26, 0x1f}, {0x30, 0x29, 0x3a, 0x33, 0x3c, 0x35, 0x26, 0x3f}, {0x30, 0x29, 0x3a, 0x33, 0x3c, 0x35, 0x26, 0x3f}, {0x38, 0x29, 0x3a, 0x33, 0x3c, 0x35, 0x36, 0x3f}, {0x38, 0x29, 0x3a, 0x33, 0x3c, 0x35, 0x36, 0x3f}, {0x38, 0x21, 0x3a, 0x33, 0x3c, 0x3d, 0x36, 0x3f}, {0x38, 0x21, 0x3a, 0x33, 0x3c, 0x3d, 0x36, 0x3f}, {0x38, 0x21, 0x2a, 0x33, 0x34, 0x3d, 0x36, 0x3f}, {0x38, 0x21, 0x2a, 0x33, 0x34, 0x3d, 0x36, 0x3f}, {0x38, 0x21, 0x2a, 0x13, 0x34, 0x3d, 0x36, 0x2f}, {0x38, 0x21, 0x2a, 0x13, 0x34, 0x3d, 0x36, 0x2f}, {0x78, 0x21, 0x2a, 0x13, 0x34, 0x3d, 0x16, 0x2f}, {0x78, 0x21, 0x2a, 0x13, 0x34, 0x3d, 0x16, 0x2f}, {0x78, 0x61, 0x2a, 0x13, 0x34, 0x7d, 0x16, 0x2f}, {0x78, 0x61, 0x2a, 0x13, 0x34, 0x7d, 0x16, 0x2f}, {0x78, 0x61, 0x4a, 0x13, 0x74, 0x7d, 0x16, 0x2f}, {0x78, 0x61, 0x4a, 0x13, 0x74, 0x7d, 0x16, 0x2f}, {0x78, 0x61, 0x4a, 0x03, 0x74, 0x7d, 0x16, 0x4f}, {0x78, 0x61, 0x4a, 0x03, 0x74, 0x7d, 0x16, 0x4f}, {0x78, 0x61, 0x4a, 0x03, 0x74, 0x7d, 0x06, 0x4f}, {0x78, 0x61, 0x4a, 0x03, 0x74, 0x7d, 0x06, 0x4f}, {0x78, 0x61, 0x4a, 0x03, 0x74, 0x7d, 0x06, 0x4f}, {0x78, 0x61, 0x4a, 0x03, 0x74, 0x7d, 0x06, 0x4f} }, { {0x70, 0x69, 0x0a, 0x43, 0x7c, 0x75, 0x46, 0x0f}, {0x70, 0x69, 0x0a, 0x43, 0x7c, 0x75, 0x46, 0x0f}, {0x70, 0x69, 0x0a, 0x43, 0x7c, 0x75, 0x46, 0x0f}, {0x70, 0x69, 0x0a, 0x43, 0x7c, 0x75, 0x46, 0x0f}, {0x70, 0x69, 0x1a, 0x43, 0x7c, 0x75, 0x46, 0x0f}, {0x70, 0x69, 0x1a, 0x43, 0x7c, 0x75, 0x46, 0x0f}, {0x70, 0x69, 0x1a, 0x23, 0x7c, 0x75, 0x46, 0x1f}, {0x70, 0x69, 0x1a, 0x23, 0x7c, 0x75, 0x46, 0x1f}, {0x30, 0x69, 0x1a, 0x23, 0x7c, 0x75, 0x26, 0x1f}, {0x30, 0x69, 0x1a, 0x23, 0x7c, 0x75, 0x26, 0x1f}, {0x30, 0x29, 0x1a, 0x23, 0x7c, 0x35, 0x26, 0x1f}, {0x30, 0x29, 0x1a, 0x23, 0x7c, 0x35, 0x26, 0x1f}, {0x30, 0x29, 0x3a, 0x23, 0x3c, 0x35, 0x26, 0x1f}, {0x30, 0x29, 0x3a, 0x23, 0x3c, 0x35, 0x26, 0x1f}, {0x30, 0x29, 0x3a, 0x33, 0x3c, 0x35, 0x26, 0x3f}, {0x30, 0x29, 0x3a, 0x33, 0x3c, 0x35, 0x26, 0x3f}, {0x38, 0x29, 0x3a, 0x33, 0x3c, 0x35, 0x36, 0x3f}, {0x38, 0x29, 0x3a, 0x33, 0x3c, 0x35, 0x36, 0x3f}, {0x38, 0x21, 0x3a, 0x33, 0x3c, 0x3d, 0x36, 0x3f}, {0x38, 0x21, 0x3a, 0x33, 0x3c, 0x3d, 0x36, 0x3f}, {0x38, 0x21, 0x2a, 0x33, 0x34, 0x3d, 0x36, 0x3f}, {0x38, 0x21, 0x2a, 0x33, 0x34, 0x3d, 0x36, 0x3f}, {0x38, 0x21, 0x2a, 0x13, 0x34, 0x3d, 0x36, 0x2f}, {0x38, 0x21, 0x2a, 0x13, 0x34, 0x3d, 0x36, 0x2f}, {0x78, 0x21, 0x2a, 0x13, 0x34, 0x3d, 0x16, 0x2f}, {0x78, 0x21, 0x2a, 0x13, 0x34, 0x3d, 0x16, 0x2f}, {0x78, 0x61, 0x2a, 0x13, 0x34, 0x7d, 0x16, 0x2f}, {0x78, 0x61, 0x2a, 0x13, 0x34, 0x7d, 0x16, 0x2f}, {0x78, 0x61, 0x4a, 0x13, 0x74, 0x7d, 0x16, 0x2f}, {0x78, 0x61, 0x4a, 0x13, 0x74, 0x7d, 0x16, 0x2f}, {0x78, 0x61, 0x4a, 0x03, 0x74, 0x7d, 0x16, 0x4f}, {0x78, 0x61, 0x4a, 0x03, 0x74, 0x7d, 0x16, 0x4f}, {0x78, 0x61, 0x4a, 0x03, 0x74, 0x7d, 0x06, 0x4f}, {0x78, 0x61, 0x4a, 0x03, 0x74, 0x7d, 0x06, 0x4f}, {0x78, 0x61, 0x4a, 0x03, 0x74, 0x7d, 0x06, 0x4f}, {0x78, 0x61, 0x4a, 0x03, 0x74, 0x7d, 0x06, 0x4f} }, { {0x70, 0x79, 0x0a, 0x4b, 0x7c, 0x75, 0x46, 0x0f}, {0x70, 0x79, 0x0a, 0x4b, 0x7c, 0x75, 0x46, 0x0f}, {0x70, 0x79, 0x0a, 0x4b, 0x7c, 0x75, 0x46, 0x0f}, {0x70, 0x79, 0x0a, 0x4b, 0x7c, 0x75, 0x46, 0x0f}, {0x70, 0x79, 0x1a, 0x4b, 0x7c, 0x75, 0x46, 0x0f}, {0x70, 0x79, 0x1a, 0x4b, 0x7c, 0x75, 0x46, 0x0f}, {0x70, 0x79, 0x1a, 0x2b, 0x7c, 0x75, 0x46, 0x1f}, {0x70, 0x79, 0x1a, 0x2b, 0x7c, 0x75, 0x46, 0x1f}, {0x30, 0x79, 0x1a, 0x2b, 0x7c, 0x75, 0x26, 0x1f}, {0x30, 0x79, 0x1a, 0x2b, 0x7c, 0x75, 0x26, 0x1f}, {0x30, 0x39, 0x1a, 0x2b, 0x7c, 0x35, 0x26, 0x1f}, {0x30, 0x39, 0x1a, 0x2b, 0x7c, 0x35, 0x26, 0x1f}, {0x30, 0x39, 0x3a, 0x2b, 0x3c, 0x35, 0x26, 0x1f}, {0x30, 0x39, 0x3a, 0x2b, 0x3c, 0x35, 0x26, 0x1f}, {0x30, 0x39, 0x3a, 0x3b, 0x3c, 0x35, 0x26, 0x3f}, {0x30, 0x39, 0x3a, 0x3b, 0x3c, 0x35, 0x26, 0x3f}, {0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x35, 0x36, 0x3f}, {0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x35, 0x36, 0x3f}, {0x38, 0x31, 0x3a, 0x3b, 0x3c, 0x3d, 0x36, 0x3f}, {0x38, 0x31, 0x3a, 0x3b, 0x3c, 0x3d, 0x36, 0x3f}, {0x38, 0x31, 0x2a, 0x3b, 0x34, 0x3d, 0x36, 0x3f}, {0x38, 0x31, 0x2a, 0x3b, 0x34, 0x3d, 0x36, 0x3f}, {0x38, 0x31, 0x2a, 0x1b, 0x34, 0x3d, 0x36, 0x2f}, {0x38, 0x31, 0x2a, 0x1b, 0x34, 0x3d, 0x36, 0x2f}, {0x78, 0x31, 0x2a, 0x1b, 0x34, 0x3d, 0x16, 0x2f}, {0x78, 0x31, 0x2a, 0x1b, 0x34, 0x3d, 0x16, 0x2f}, {0x78, 0x71, 0x2a, 0x1b, 0x34, 0x7d, 0x16, 0x2f}, {0x78, 0x71, 0x2a, 0x1b, 0x34, 0x7d, 0x16, 0x2f}, {0x78, 0x71, 0x4a, 0x1b, 0x74, 0x7d, 0x16, 0x2f}, {0x78, 0x71, 0x4a, 0x1b, 0x74, 0x7d, 0x16, 0x2f}, {0x78, 0x71, 0x4a, 0x0b, 0x74, 0x7d, 0x16, 0x4f}, {0x78, 0x71, 0x4a, 0x0b, 0x74, 0x7d, 0x16, 0x4f}, {0x78, 0x71, 0x4a, 0x0b, 0x74, 0x7d, 0x06, 0x4f}, {0x78, 0x71, 0x4a, 0x0b, 0x74, 0x7d, 0x06, 0x4f}, {0x78, 0x71, 0x4a, 0x0b, 0x74, 0x7d, 0x06, 0x4f}, {0x78, 0x71, 0x4a, 0x0b, 0x74, 0x7d, 0x06, 0x4f} }, { {0x70, 0x79, 0x0a, 0x4b, 0x7c, 0x75, 0x46, 0x0f}, {0x70, 0x79, 0x0a, 0x4b, 0x7c, 0x75, 0x46, 0x0f}, {0x70, 0x79, 0x0a, 0x4b, 0x7c, 0x75, 0x46, 0x0f}, {0x70, 0x79, 0x0a, 0x4b, 0x7c, 0x75, 0x46, 0x0f}, {0x70, 0x79, 0x1a, 0x4b, 0x7c, 0x75, 0x46, 0x0f}, {0x70, 0x79, 0x1a, 0x4b, 0x7c, 0x75, 0x46, 0x0f}, {0x70, 0x79, 0x1a, 0x2b, 0x7c, 0x75, 0x46, 0x1f}, {0x70, 0x79, 0x1a, 0x2b, 0x7c, 0x75, 0x46, 0x1f}, {0x30, 0x79, 0x1a, 0x2b, 0x7c, 0x75, 0x26, 0x1f}, {0x30, 0x79, 0x1a, 0x2b, 0x7c, 0x75, 0x26, 0x1f}, {0x30, 0x39, 0x1a, 0x2b, 0x7c, 0x35, 0x26, 0x1f}, {0x30, 0x39, 0x1a, 0x2b, 0x7c, 0x35, 0x26, 0x1f}, {0x30, 0x39, 0x3a, 0x2b, 0x3c, 0x35, 0x26, 0x1f}, {0x30, 0x39, 0x3a, 0x2b, 0x3c, 0x35, 0x26, 0x1f}, {0x30, 0x39, 0x3a, 0x3b, 0x3c, 0x35, 0x26, 0x3f}, {0x30, 0x39, 0x3a, 0x3b, 0x3c, 0x35, 0x26, 0x3f}, {0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x35, 0x36, 0x3f}, {0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x35, 0x36, 0x3f}, {0x38, 0x31, 0x3a, 0x3b, 0x3c, 0x3d, 0x36, 0x3f}, {0x38, 0x31, 0x3a, 0x3b, 0x3c, 0x3d, 0x36, 0x3f}, {0x38, 0x31, 0x2a, 0x3b, 0x34, 0x3d, 0x36, 0x3f}, {0x38, 0x31, 0x2a, 0x3b, 0x34, 0x3d, 0x36, 0x3f}, {0x38, 0x31, 0x2a, 0x1b, 0x34, 0x3d, 0x36, 0x2f}, {0x38, 0x31, 0x2a, 0x1b, 0x34, 0x3d, 0x36, 0x2f}, {0x78, 0x31, 0x2a, 0x1b, 0x34, 0x3d, 0x16, 0x2f}, {0x78, 0x31, 0x2a, 0x1b, 0x34, 0x3d, 0x16, 0x2f}, {0x78, 0x71, 0x2a, 0x1b, 0x34, 0x7d, 0x16, 0x2f}, {0x78, 0x71, 0x2a, 0x1b, 0x34, 0x7d, 0x16, 0x2f}, {0x78, 0x71, 0x4a, 0x1b, 0x74, 0x7d, 0x16, 0x2f}, {0x78, 0x71, 0x4a, 0x1b, 0x74, 0x7d, 0x16, 0x2f}, {0x78, 0x71, 0x4a, 0x0b, 0x74, 0x7d, 0x16, 0x4f}, {0x78, 0x71, 0x4a, 0x0b, 0x74, 0x7d, 0x16, 0x4f}, {0x78, 0x71, 0x4a, 0x0b, 0x74, 0x7d, 0x06, 0x4f}, {0x78, 0x71, 0x4a, 0x0b, 0x74, 0x7d, 0x06, 0x4f}, {0x78, 0x71, 0x4a, 0x0b, 0x74, 0x7d, 0x06, 0x4f}, {0x78, 0x71, 0x4a, 0x0b, 0x74, 0x7d, 0x06, 0x4f} }, { {0x70, 0x79, 0x02, 0x4b, 0x7c, 0x75, 0x4e, 0x0f}, {0x70, 0x79, 0x02, 0x4b, 0x7c, 0x75, 0x4e, 0x0f}, {0x70, 0x79, 0x02, 0x4b, 0x7c, 0x75, 0x4e, 0x0f}, {0x70, 0x79, 0x02, 0x4b, 0x7c, 0x75, 0x4e, 0x0f}, {0x70, 0x79, 0x12, 0x4b, 0x7c, 0x75, 0x4e, 0x0f}, {0x70, 0x79, 0x12, 0x4b, 0x7c, 0x75, 0x4e, 0x0f}, {0x70, 0x79, 0x12, 0x2b, 0x7c, 0x75, 0x4e, 0x1f}, {0x70, 0x79, 0x12, 0x2b, 0x7c, 0x75, 0x4e, 0x1f}, {0x30, 0x79, 0x12, 0x2b, 0x7c, 0x75, 0x2e, 0x1f}, {0x30, 0x79, 0x12, 0x2b, 0x7c, 0x75, 0x2e, 0x1f}, {0x30, 0x39, 0x12, 0x2b, 0x7c, 0x35, 0x2e, 0x1f}, {0x30, 0x39, 0x12, 0x2b, 0x7c, 0x35, 0x2e, 0x1f}, {0x30, 0x39, 0x32, 0x2b, 0x3c, 0x35, 0x2e, 0x1f}, {0x30, 0x39, 0x32, 0x2b, 0x3c, 0x35, 0x2e, 0x1f}, {0x30, 0x39, 0x32, 0x3b, 0x3c, 0x35, 0x2e, 0x3f}, {0x30, 0x39, 0x32, 0x3b, 0x3c, 0x35, 0x2e, 0x3f}, {0x38, 0x39, 0x32, 0x3b, 0x3c, 0x35, 0x3e, 0x3f}, {0x38, 0x39, 0x32, 0x3b, 0x3c, 0x35, 0x3e, 0x3f}, {0x38, 0x31, 0x32, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f}, {0x38, 0x31, 0x32, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f}, {0x38, 0x31, 0x22, 0x3b, 0x34, 0x3d, 0x3e, 0x3f}, {0x38, 0x31, 0x22, 0x3b, 0x34, 0x3d, 0x3e, 0x3f}, {0x38, 0x31, 0x22, 0x1b, 0x34, 0x3d, 0x3e, 0x2f}, {0x38, 0x31, 0x22, 0x1b, 0x34, 0x3d, 0x3e, 0x2f}, {0x78, 0x31, 0x22, 0x1b, 0x34, 0x3d, 0x1e, 0x2f}, {0x78, 0x31, 0x22, 0x1b, 0x34, 0x3d, 0x1e, 0x2f}, {0x78, 0x71, 0x22, 0x1b, 0x34, 0x7d, 0x1e, 0x2f}, {0x78, 0x71, 0x22, 0x1b, 0x34, 0x7d, 0x1e, 0x2f}, {0x78, 0x71, 0x42, 0x1b, 0x74, 0x7d, 0x1e, 0x2f}, {0x78, 0x71, 0x42, 0x1b, 0x74, 0x7d, 0x1e, 0x2f}, {0x78, 0x71, 0x42, 0x0b, 0x74, 0x7d, 0x1e, 0x4f}, {0x78, 0x71, 0x42, 0x0b, 0x74, 0x7d, 0x1e, 0x4f}, {0x78, 0x71, 0x42, 0x0b, 0x74, 0x7d, 0x0e, 0x4f}, {0x78, 0x71, 0x42, 0x0b, 0x74, 0x7d, 0x0e, 0x4f}, {0x78, 0x71, 0x42, 0x0b, 0x74, 0x7d, 0x0e, 0x4f}, {0x78, 0x71, 0x42, 0x0b, 0x74, 0x7d, 0x0e, 0x4f} }, { {0x70, 0x79, 0x02, 0x4b, 0x7c, 0x75, 0x4e, 0x0f}, {0x70, 0x79, 0x02, 0x4b, 0x7c, 0x75, 0x4e, 0x0f}, {0x70, 0x79, 0x02, 0x4b, 0x7c, 0x75, 0x4e, 0x0f}, {0x70, 0x79, 0x02, 0x4b, 0x7c, 0x75, 0x4e, 0x0f}, {0x70, 0x79, 0x12, 0x4b, 0x7c, 0x75, 0x4e, 0x0f}, {0x70, 0x79, 0x12, 0x4b, 0x7c, 0x75, 0x4e, 0x0f}, {0x70, 0x79, 0x12, 0x2b, 0x7c, 0x75, 0x4e, 0x1f}, {0x70, 0x79, 0x12, 0x2b, 0x7c, 0x75, 0x4e, 0x1f}, {0x30, 0x79, 0x12, 0x2b, 0x7c, 0x75, 0x2e, 0x1f}, {0x30, 0x79, 0x12, 0x2b, 0x7c, 0x75, 0x2e, 0x1f}, {0x30, 0x39, 0x12, 0x2b, 0x7c, 0x35, 0x2e, 0x1f}, {0x30, 0x39, 0x12, 0x2b, 0x7c, 0x35, 0x2e, 0x1f}, {0x30, 0x39, 0x32, 0x2b, 0x3c, 0x35, 0x2e, 0x1f}, {0x30, 0x39, 0x32, 0x2b, 0x3c, 0x35, 0x2e, 0x1f}, {0x30, 0x39, 0x32, 0x3b, 0x3c, 0x35, 0x2e, 0x3f}, {0x30, 0x39, 0x32, 0x3b, 0x3c, 0x35, 0x2e, 0x3f}, {0x38, 0x39, 0x32, 0x3b, 0x3c, 0x35, 0x3e, 0x3f}, {0x38, 0x39, 0x32, 0x3b, 0x3c, 0x35, 0x3e, 0x3f}, {0x38, 0x31, 0x32, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f}, {0x38, 0x31, 0x32, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f}, {0x38, 0x31, 0x22, 0x3b, 0x34, 0x3d, 0x3e, 0x3f}, {0x38, 0x31, 0x22, 0x3b, 0x34, 0x3d, 0x3e, 0x3f}, {0x38, 0x31, 0x22, 0x1b, 0x34, 0x3d, 0x3e, 0x2f}, {0x38, 0x31, 0x22, 0x1b, 0x34, 0x3d, 0x3e, 0x2f}, {0x78, 0x31, 0x22, 0x1b, 0x34, 0x3d, 0x1e, 0x2f}, {0x78, 0x31, 0x22, 0x1b, 0x34, 0x3d, 0x1e, 0x2f}, {0x78, 0x71, 0x22, 0x1b, 0x34, 0x7d, 0x1e, 0x2f}, {0x78, 0x71, 0x22, 0x1b, 0x34, 0x7d, 0x1e, 0x2f}, {0x78, 0x71, 0x42, 0x1b, 0x74, 0x7d, 0x1e, 0x2f}, {0x78, 0x71, 0x42, 0x1b, 0x74, 0x7d, 0x1e, 0x2f}, {0x78, 0x71, 0x42, 0x0b, 0x74, 0x7d, 0x1e, 0x4f}, {0x78, 0x71, 0x42, 0x0b, 0x74, 0x7d, 0x1e, 0x4f}, {0x78, 0x71, 0x42, 0x0b, 0x74, 0x7d, 0x0e, 0x4f}, {0x78, 0x71, 0x42, 0x0b, 0x74, 0x7d, 0x0e, 0x4f}, {0x78, 0x71, 0x42, 0x0b, 0x74, 0x7d, 0x0e, 0x4f}, {0x78, 0x71, 0x42, 0x0b, 0x74, 0x7d, 0x0e, 0x4f} }, { {0x70, 0x79, 0x02, 0x4b, 0x7c, 0x65, 0x4e, 0x07}, {0x70, 0x79, 0x02, 0x4b, 0x7c, 0x65, 0x4e, 0x07}, {0x70, 0x79, 0x02, 0x4b, 0x7c, 0x65, 0x4e, 0x07}, {0x70, 0x79, 0x02, 0x4b, 0x7c, 0x65, 0x4e, 0x07}, {0x70, 0x79, 0x12, 0x4b, 0x7c, 0x65, 0x4e, 0x07}, {0x70, 0x79, 0x12, 0x4b, 0x7c, 0x65, 0x4e, 0x07}, {0x70, 0x79, 0x12, 0x2b, 0x7c, 0x65, 0x4e, 0x17}, {0x70, 0x79, 0x12, 0x2b, 0x7c, 0x65, 0x4e, 0x17}, {0x30, 0x79, 0x12, 0x2b, 0x7c, 0x65, 0x2e, 0x17}, {0x30, 0x79, 0x12, 0x2b, 0x7c, 0x65, 0x2e, 0x17}, {0x30, 0x39, 0x12, 0x2b, 0x7c, 0x25, 0x2e, 0x17}, {0x30, 0x39, 0x12, 0x2b, 0x7c, 0x25, 0x2e, 0x17}, {0x30, 0x39, 0x32, 0x2b, 0x3c, 0x25, 0x2e, 0x17}, {0x30, 0x39, 0x32, 0x2b, 0x3c, 0x25, 0x2e, 0x17}, {0x30, 0x39, 0x32, 0x3b, 0x3c, 0x25, 0x2e, 0x37}, {0x30, 0x39, 0x32, 0x3b, 0x3c, 0x25, 0x2e, 0x37}, {0x38, 0x39, 0x32, 0x3b, 0x3c, 0x25, 0x3e, 0x37}, {0x38, 0x39, 0x32, 0x3b, 0x3c, 0x25, 0x3e, 0x37}, {0x38, 0x31, 0x32, 0x3b, 0x3c, 0x2d, 0x3e, 0x37}, {0x38, 0x31, 0x32, 0x3b, 0x3c, 0x2d, 0x3e, 0x37}, {0x38, 0x31, 0x22, 0x3b, 0x34, 0x2d, 0x3e, 0x37}, {0x38, 0x31, 0x22, 0x3b, 0x34, 0x2d, 0x3e, 0x37}, {0x38, 0x31, 0x22, 0x1b, 0x34, 0x2d, 0x3e, 0x27}, {0x38, 0x31, 0x22, 0x1b, 0x34, 0x2d, 0x3e, 0x27}, {0x78, 0x31, 0x22, 0x1b, 0x34, 0x2d, 0x1e, 0x27}, {0x78, 0x31, 0x22, 0x1b, 0x34, 0x2d, 0x1e, 0x27}, {0x78, 0x71, 0x22, 0x1b, 0x34, 0x6d, 0x1e, 0x27}, {0x78, 0x71, 0x22, 0x1b, 0x34, 0x6d, 0x1e, 0x27}, {0x78, 0x71, 0x42, 0x1b, 0x74, 0x6d, 0x1e, 0x27}, {0x78, 0x71, 0x42, 0x1b, 0x74, 0x6d, 0x1e, 0x27}, {0x78, 0x71, 0x42, 0x0b, 0x74, 0x6d, 0x1e, 0x47}, {0x78, 0x71, 0x42, 0x0b, 0x74, 0x6d, 0x1e, 0x47}, {0x78, 0x71, 0x42, 0x0b, 0x74, 0x6d, 0x0e, 0x47}, {0x78, 0x71, 0x42, 0x0b, 0x74, 0x6d, 0x0e, 0x47}, {0x78, 0x71, 0x42, 0x0b, 0x74, 0x6d, 0x0e, 0x47}, {0x78, 0x71, 0x42, 0x0b, 0x74, 0x6d, 0x0e, 0x47} }, { {0x70, 0x79, 0x02, 0x4b, 0x7c, 0x65, 0x4e, 0x07}, {0x70, 0x79, 0x02, 0x4b, 0x7c, 0x65, 0x4e, 0x07}, {0x70, 0x79, 0x02, 0x4b, 0x7c, 0x65, 0x4e, 0x07}, {0x70, 0x79, 0x02, 0x4b, 0x7c, 0x65, 0x4e, 0x07}, {0x70, 0x79, 0x12, 0x4b, 0x7c, 0x65, 0x4e, 0x07}, {0x70, 0x79, 0x12, 0x4b, 0x7c, 0x65, 0x4e, 0x07}, {0x70, 0x79, 0x12, 0x2b, 0x7c, 0x65, 0x4e, 0x17}, {0x70, 0x79, 0x12, 0x2b, 0x7c, 0x65, 0x4e, 0x17}, {0x30, 0x79, 0x12, 0x2b, 0x7c, 0x65, 0x2e, 0x17}, {0x30, 0x79, 0x12, 0x2b, 0x7c, 0x65, 0x2e, 0x17}, {0x30, 0x39, 0x12, 0x2b, 0x7c, 0x25, 0x2e, 0x17}, {0x30, 0x39, 0x12, 0x2b, 0x7c, 0x25, 0x2e, 0x17}, {0x30, 0x39, 0x32, 0x2b, 0x3c, 0x25, 0x2e, 0x17}, {0x30, 0x39, 0x32, 0x2b, 0x3c, 0x25, 0x2e, 0x17}, {0x30, 0x39, 0x32, 0x3b, 0x3c, 0x25, 0x2e, 0x37}, {0x30, 0x39, 0x32, 0x3b, 0x3c, 0x25, 0x2e, 0x37}, {0x38, 0x39, 0x32, 0x3b, 0x3c, 0x25, 0x3e, 0x37}, {0x38, 0x39, 0x32, 0x3b, 0x3c, 0x25, 0x3e, 0x37}, {0x38, 0x31, 0x32, 0x3b, 0x3c, 0x2d, 0x3e, 0x37}, {0x38, 0x31, 0x32, 0x3b, 0x3c, 0x2d, 0x3e, 0x37}, {0x38, 0x31, 0x22, 0x3b, 0x34, 0x2d, 0x3e, 0x37}, {0x38, 0x31, 0x22, 0x3b, 0x34, 0x2d, 0x3e, 0x37}, {0x38, 0x31, 0x22, 0x1b, 0x34, 0x2d, 0x3e, 0x27}, {0x38, 0x31, 0x22, 0x1b, 0x34, 0x2d, 0x3e, 0x27}, {0x78, 0x31, 0x22, 0x1b, 0x34, 0x2d, 0x1e, 0x27}, {0x78, 0x31, 0x22, 0x1b, 0x34, 0x2d, 0x1e, 0x27}, {0x78, 0x71, 0x22, 0x1b, 0x34, 0x6d, 0x1e, 0x27}, {0x78, 0x71, 0x22, 0x1b, 0x34, 0x6d, 0x1e, 0x27}, {0x78, 0x71, 0x42, 0x1b, 0x74, 0x6d, 0x1e, 0x27}, {0x78, 0x71, 0x42, 0x1b, 0x74, 0x6d, 0x1e, 0x27}, {0x78, 0x71, 0x42, 0x0b, 0x74, 0x6d, 0x1e, 0x47}, {0x78, 0x71, 0x42, 0x0b, 0x74, 0x6d, 0x1e, 0x47}, {0x78, 0x71, 0x42, 0x0b, 0x74, 0x6d, 0x0e, 0x47}, {0x78, 0x71, 0x42, 0x0b, 0x74, 0x6d, 0x0e, 0x47}, {0x78, 0x71, 0x42, 0x0b, 0x74, 0x6d, 0x0e, 0x47}, {0x78, 0x71, 0x42, 0x0b, 0x74, 0x6d, 0x0e, 0x47} }, { {0x60, 0x79, 0x02, 0x4b, 0x5c, 0x65, 0x4e, 0x07}, {0x60, 0x79, 0x02, 0x4b, 0x5c, 0x65, 0x4e, 0x07}, {0x60, 0x79, 0x02, 0x4b, 0x5c, 0x65, 0x4e, 0x07}, {0x60, 0x79, 0x02, 0x4b, 0x5c, 0x65, 0x4e, 0x07}, {0x60, 0x79, 0x12, 0x4b, 0x5c, 0x65, 0x4e, 0x07}, {0x60, 0x79, 0x12, 0x4b, 0x5c, 0x65, 0x4e, 0x07}, {0x60, 0x79, 0x12, 0x2b, 0x5c, 0x65, 0x4e, 0x17}, {0x60, 0x79, 0x12, 0x2b, 0x5c, 0x65, 0x4e, 0x17}, {0x20, 0x79, 0x12, 0x2b, 0x5c, 0x65, 0x2e, 0x17}, {0x20, 0x79, 0x12, 0x2b, 0x5c, 0x65, 0x2e, 0x17}, {0x20, 0x39, 0x12, 0x2b, 0x5c, 0x25, 0x2e, 0x17}, {0x20, 0x39, 0x12, 0x2b, 0x5c, 0x25, 0x2e, 0x17}, {0x20, 0x39, 0x32, 0x2b, 0x1c, 0x25, 0x2e, 0x17}, {0x20, 0x39, 0x32, 0x2b, 0x1c, 0x25, 0x2e, 0x17}, {0x20, 0x39, 0x32, 0x3b, 0x1c, 0x25, 0x2e, 0x37}, {0x20, 0x39, 0x32, 0x3b, 0x1c, 0x25, 0x2e, 0x37}, {0x28, 0x39, 0x32, 0x3b, 0x1c, 0x25, 0x3e, 0x37}, {0x28, 0x39, 0x32, 0x3b, 0x1c, 0x25, 0x3e, 0x37}, {0x28, 0x31, 0x32, 0x3b, 0x1c, 0x2d, 0x3e, 0x37}, {0x28, 0x31, 0x32, 0x3b, 0x1c, 0x2d, 0x3e, 0x37}, {0x28, 0x31, 0x22, 0x3b, 0x14, 0x2d, 0x3e, 0x37}, {0x28, 0x31, 0x22, 0x3b, 0x14, 0x2d, 0x3e, 0x37}, {0x28, 0x31, 0x22, 0x1b, 0x14, 0x2d, 0x3e, 0x27}, {0x28, 0x31, 0x22, 0x1b, 0x14, 0x2d, 0x3e, 0x27}, {0x68, 0x31, 0x22, 0x1b, 0x14, 0x2d, 0x1e, 0x27}, {0x68, 0x31, 0x22, 0x1b, 0x14, 0x2d, 0x1e, 0x27}, {0x68, 0x71, 0x22, 0x1b, 0x14, 0x6d, 0x1e, 0x27}, {0x68, 0x71, 0x22, 0x1b, 0x14, 0x6d, 0x1e, 0x27}, {0x68, 0x71, 0x42, 0x1b, 0x54, 0x6d, 0x1e, 0x27}, {0x68, 0x71, 0x42, 0x1b, 0x54, 0x6d, 0x1e, 0x27}, {0x68, 0x71, 0x42, 0x0b, 0x54, 0x6d, 0x1e, 0x47}, {0x68, 0x71, 0x42, 0x0b, 0x54, 0x6d, 0x1e, 0x47}, {0x68, 0x71, 0x42, 0x0b, 0x54, 0x6d, 0x0e, 0x47}, {0x68, 0x71, 0x42, 0x0b, 0x54, 0x6d, 0x0e, 0x47}, {0x68, 0x71, 0x42, 0x0b, 0x54, 0x6d, 0x0e, 0x47}, {0x68, 0x71, 0x42, 0x0b, 0x54, 0x6d, 0x0e, 0x47} }, { {0x60, 0x79, 0x02, 0x4b, 0x5c, 0x65, 0x4e, 0x07}, {0x60, 0x79, 0x02, 0x4b, 0x5c, 0x65, 0x4e, 0x07}, {0x60, 0x79, 0x02, 0x4b, 0x5c, 0x65, 0x4e, 0x07}, {0x60, 0x79, 0x02, 0x4b, 0x5c, 0x65, 0x4e, 0x07}, {0x60, 0x79, 0x12, 0x4b, 0x5c, 0x65, 0x4e, 0x07}, {0x60, 0x79, 0x12, 0x4b, 0x5c, 0x65, 0x4e, 0x07}, {0x60, 0x79, 0x12, 0x2b, 0x5c, 0x65, 0x4e, 0x17}, {0x60, 0x79, 0x12, 0x2b, 0x5c, 0x65, 0x4e, 0x17}, {0x20, 0x79, 0x12, 0x2b, 0x5c, 0x65, 0x2e, 0x17}, {0x20, 0x79, 0x12, 0x2b, 0x5c, 0x65, 0x2e, 0x17}, {0x20, 0x39, 0x12, 0x2b, 0x5c, 0x25, 0x2e, 0x17}, {0x20, 0x39, 0x12, 0x2b, 0x5c, 0x25, 0x2e, 0x17}, {0x20, 0x39, 0x32, 0x2b, 0x1c, 0x25, 0x2e, 0x17}, {0x20, 0x39, 0x32, 0x2b, 0x1c, 0x25, 0x2e, 0x17}, {0x20, 0x39, 0x32, 0x3b, 0x1c, 0x25, 0x2e, 0x37}, {0x20, 0x39, 0x32, 0x3b, 0x1c, 0x25, 0x2e, 0x37}, {0x28, 0x39, 0x32, 0x3b, 0x1c, 0x25, 0x3e, 0x37}, {0x28, 0x39, 0x32, 0x3b, 0x1c, 0x25, 0x3e, 0x37}, {0x28, 0x31, 0x32, 0x3b, 0x1c, 0x2d, 0x3e, 0x37}, {0x28, 0x31, 0x32, 0x3b, 0x1c, 0x2d, 0x3e, 0x37}, {0x28, 0x31, 0x22, 0x3b, 0x14, 0x2d, 0x3e, 0x37}, {0x28, 0x31, 0x22, 0x3b, 0x14, 0x2d, 0x3e, 0x37}, {0x28, 0x31, 0x22, 0x1b, 0x14, 0x2d, 0x3e, 0x27}, {0x28, 0x31, 0x22, 0x1b, 0x14, 0x2d, 0x3e, 0x27}, {0x68, 0x31, 0x22, 0x1b, 0x14, 0x2d, 0x1e, 0x27}, {0x68, 0x31, 0x22, 0x1b, 0x14, 0x2d, 0x1e, 0x27}, {0x68, 0x71, 0x22, 0x1b, 0x14, 0x6d, 0x1e, 0x27}, {0x68, 0x71, 0x22, 0x1b, 0x14, 0x6d, 0x1e, 0x27}, {0x68, 0x71, 0x42, 0x1b, 0x54, 0x6d, 0x1e, 0x27}, {0x68, 0x71, 0x42, 0x1b, 0x54, 0x6d, 0x1e, 0x27}, {0x68, 0x71, 0x42, 0x0b, 0x54, 0x6d, 0x1e, 0x47}, {0x68, 0x71, 0x42, 0x0b, 0x54, 0x6d, 0x1e, 0x47}, {0x68, 0x71, 0x42, 0x0b, 0x54, 0x6d, 0x0e, 0x47}, {0x68, 0x71, 0x42, 0x0b, 0x54, 0x6d, 0x0e, 0x47}, {0x68, 0x71, 0x42, 0x0b, 0x54, 0x6d, 0x0e, 0x47}, {0x68, 0x71, 0x42, 0x0b, 0x54, 0x6d, 0x0e, 0x47} }, { {0x60, 0x59, 0x02, 0x4b, 0x5c, 0x65, 0x4e, 0x07}, {0x60, 0x59, 0x02, 0x4b, 0x5c, 0x65, 0x4e, 0x07}, {0x60, 0x59, 0x02, 0x4b, 0x5c, 0x65, 0x4e, 0x07}, {0x60, 0x59, 0x02, 0x4b, 0x5c, 0x65, 0x4e, 0x07}, {0x60, 0x59, 0x12, 0x4b, 0x5c, 0x65, 0x4e, 0x07}, {0x60, 0x59, 0x12, 0x4b, 0x5c, 0x65, 0x4e, 0x07}, {0x60, 0x59, 0x12, 0x6b, 0x5c, 0x65, 0x4e, 0x17}, {0x60, 0x59, 0x12, 0x6b, 0x5c, 0x65, 0x4e, 0x17}, {0x20, 0x59, 0x12, 0x6b, 0x5c, 0x65, 0x2e, 0x17}, {0x20, 0x59, 0x12, 0x6b, 0x5c, 0x65, 0x2e, 0x17}, {0x20, 0x19, 0x12, 0x6b, 0x5c, 0x25, 0x2e, 0x17}, {0x20, 0x19, 0x12, 0x6b, 0x5c, 0x25, 0x2e, 0x17}, {0x20, 0x19, 0x32, 0x6b, 0x1c, 0x25, 0x2e, 0x17}, {0x20, 0x19, 0x32, 0x6b, 0x1c, 0x25, 0x2e, 0x17}, {0x20, 0x19, 0x32, 0x7b, 0x1c, 0x25, 0x2e, 0x37}, {0x20, 0x19, 0x32, 0x7b, 0x1c, 0x25, 0x2e, 0x37}, {0x28, 0x19, 0x32, 0x7b, 0x1c, 0x25, 0x3e, 0x37}, {0x28, 0x19, 0x32, 0x7b, 0x1c, 0x25, 0x3e, 0x37}, {0x28, 0x11, 0x32, 0x7b, 0x1c, 0x2d, 0x3e, 0x37}, {0x28, 0x11, 0x32, 0x7b, 0x1c, 0x2d, 0x3e, 0x37}, {0x28, 0x11, 0x22, 0x7b, 0x14, 0x2d, 0x3e, 0x37}, {0x28, 0x11, 0x22, 0x7b, 0x14, 0x2d, 0x3e, 0x37}, {0x28, 0x11, 0x22, 0x5b, 0x14, 0x2d, 0x3e, 0x27}, {0x28, 0x11, 0x22, 0x5b, 0x14, 0x2d, 0x3e, 0x27}, {0x68, 0x11, 0x22, 0x5b, 0x14, 0x2d, 0x1e, 0x27}, {0x68, 0x11, 0x22, 0x5b, 0x14, 0x2d, 0x1e, 0x27}, {0x68, 0x51, 0x22, 0x5b, 0x14, 0x6d, 0x1e, 0x27}, {0x68, 0x51, 0x22, 0x5b, 0x14, 0x6d, 0x1e, 0x27}, {0x68, 0x51, 0x42, 0x5b, 0x54, 0x6d, 0x1e, 0x27}, {0x68, 0x51, 0x42, 0x5b, 0x54, 0x6d, 0x1e, 0x27}, {0x68, 0x51, 0x42, 0x5b, 0x54, 0x6d, 0x1e, 0x47}, {0x68, 0x51, 0x42, 0x0b, 0x54, 0x6d, 0x1e, 0x47}, {0x68, 0x51, 0x42, 0x0b, 0x54, 0x6d, 0x0e, 0x47}, {0x68, 0x51, 0x42, 0x0b, 0x54, 0x6d, 0x0e, 0x47}, {0x68, 0x51, 0x42, 0x0b, 0x54, 0x6d, 0x0e, 0x47}, {0x68, 0x51, 0x42, 0x0b, 0x54, 0x6d, 0x0e, 0x47} }, { {0x60, 0x59, 0x02, 0x4b, 0x5c, 0x65, 0x4e, 0x07}, {0x60, 0x59, 0x02, 0x4b, 0x5c, 0x65, 0x4e, 0x07}, {0x60, 0x59, 0x02, 0x4b, 0x5c, 0x65, 0x4e, 0x07}, {0x60, 0x59, 0x02, 0x4b, 0x5c, 0x65, 0x4e, 0x07}, {0x60, 0x59, 0x12, 0x4b, 0x5c, 0x65, 0x4e, 0x07}, {0x60, 0x59, 0x12, 0x6b, 0x5c, 0x65, 0x4e, 0x07}, {0x60, 0x59, 0x12, 0x6b, 0x5c, 0x65, 0x4e, 0x17}, {0x60, 0x59, 0x12, 0x6b, 0x5c, 0x65, 0x4e, 0x17}, {0x20, 0x59, 0x12, 0x6b, 0x5c, 0x65, 0x2e, 0x17}, {0x20, 0x59, 0x12, 0x6b, 0x5c, 0x65, 0x2e, 0x17}, {0x20, 0x19, 0x12, 0x6b, 0x5c, 0x25, 0x2e, 0x17}, {0x20, 0x19, 0x12, 0x6b, 0x5c, 0x25, 0x2e, 0x17}, {0x20, 0x19, 0x32, 0x6b, 0x1c, 0x25, 0x2e, 0x17}, {0x20, 0x19, 0x32, 0x6b, 0x1c, 0x25, 0x2e, 0x17}, {0x20, 0x19, 0x32, 0x7b, 0x1c, 0x25, 0x2e, 0x37}, {0x20, 0x19, 0x32, 0x7b, 0x1c, 0x25, 0x2e, 0x37}, {0x28, 0x19, 0x32, 0x7b, 0x1c, 0x25, 0x3e, 0x37}, {0x28, 0x19, 0x32, 0x7b, 0x1c, 0x25, 0x3e, 0x37}, {0x28, 0x11, 0x32, 0x7b, 0x1c, 0x2d, 0x3e, 0x37}, {0x28, 0x11, 0x32, 0x7b, 0x1c, 0x2d, 0x3e, 0x37}, {0x28, 0x11, 0x22, 0x7b, 0x14, 0x2d, 0x3e, 0x37}, {0x28, 0x11, 0x22, 0x7b, 0x14, 0x2d, 0x3e, 0x37}, {0x28, 0x11, 0x22, 0x5b, 0x14, 0x2d, 0x3e, 0x27}, {0x28, 0x11, 0x22, 0x5b, 0x14, 0x2d, 0x3e, 0x27}, {0x68, 0x11, 0x22, 0x5b, 0x14, 0x2d, 0x1e, 0x27}, {0x68, 0x11, 0x22, 0x5b, 0x14, 0x2d, 0x1e, 0x27}, {0x68, 0x51, 0x22, 0x5b, 0x14, 0x6d, 0x1e, 0x27}, {0x68, 0x51, 0x22, 0x5b, 0x14, 0x6d, 0x1e, 0x27}, {0x68, 0x51, 0x42, 0x5b, 0x54, 0x6d, 0x1e, 0x27}, {0x68, 0x51, 0x42, 0x5b, 0x54, 0x6d, 0x1e, 0x27}, {0x68, 0x51, 0x42, 0x5b, 0x54, 0x6d, 0x1e, 0x47}, {0x68, 0x51, 0x42, 0x5b, 0x54, 0x6d, 0x1e, 0x47}, {0x68, 0x51, 0x42, 0x0b, 0x54, 0x6d, 0x0e, 0x47}, {0x68, 0x51, 0x42, 0x0b, 0x54, 0x6d, 0x0e, 0x47}, {0x68, 0x51, 0x42, 0x0b, 0x54, 0x6d, 0x0e, 0x47}, {0x68, 0x51, 0x42, 0x0b, 0x54, 0x6d, 0x0e, 0x47} }, { {0x60, 0x59, 0x02, 0x4b, 0x5c, 0x65, 0x4e, 0x07}, {0x60, 0x59, 0x02, 0x4b, 0x5c, 0x65, 0x4e, 0x07}, {0x60, 0x59, 0x02, 0x4b, 0x5c, 0x65, 0x4e, 0x07}, {0x60, 0x59, 0x02, 0x4b, 0x5c, 0x65, 0x4e, 0x07}, {0x60, 0x59, 0x52, 0x6b, 0x5c, 0x65, 0x4e, 0x07}, {0x60, 0x59, 0x52, 0x6b, 0x5c, 0x65, 0x4e, 0x07}, {0x60, 0x59, 0x52, 0x6b, 0x5c, 0x65, 0x4e, 0x17}, {0x60, 0x59, 0x52, 0x6b, 0x5c, 0x65, 0x4e, 0x17}, {0x20, 0x59, 0x52, 0x6b, 0x5c, 0x65, 0x6e, 0x17}, {0x20, 0x59, 0x52, 0x6b, 0x5c, 0x65, 0x6e, 0x17}, {0x20, 0x19, 0x52, 0x6b, 0x5c, 0x25, 0x6e, 0x17}, {0x20, 0x19, 0x52, 0x6b, 0x5c, 0x25, 0x6e, 0x17}, {0x20, 0x19, 0x72, 0x6b, 0x1c, 0x25, 0x6e, 0x17}, {0x20, 0x19, 0x72, 0x6b, 0x1c, 0x25, 0x6e, 0x17}, {0x20, 0x19, 0x72, 0x7b, 0x1c, 0x25, 0x6e, 0x37}, {0x20, 0x19, 0x72, 0x7b, 0x1c, 0x25, 0x6e, 0x37}, {0x28, 0x19, 0x72, 0x7b, 0x1c, 0x25, 0x7e, 0x37}, {0x28, 0x19, 0x72, 0x7b, 0x1c, 0x25, 0x7e, 0x37}, {0x28, 0x11, 0x72, 0x7b, 0x1c, 0x2d, 0x7e, 0x37}, {0x28, 0x11, 0x72, 0x7b, 0x1c, 0x2d, 0x7e, 0x37}, {0x28, 0x11, 0x62, 0x7b, 0x14, 0x2d, 0x7e, 0x37}, {0x28, 0x11, 0x62, 0x7b, 0x14, 0x2d, 0x7e, 0x37}, {0x28, 0x11, 0x62, 0x5b, 0x14, 0x2d, 0x7e, 0x27}, {0x28, 0x11, 0x62, 0x5b, 0x14, 0x2d, 0x7e, 0x27}, {0x68, 0x11, 0x62, 0x5b, 0x14, 0x2d, 0x5e, 0x27}, {0x68, 0x11, 0x62, 0x5b, 0x14, 0x2d, 0x5e, 0x27}, {0x68, 0x51, 0x62, 0x5b, 0x14, 0x6d, 0x5e, 0x27}, {0x68, 0x51, 0x62, 0x5b, 0x14, 0x6d, 0x5e, 0x27}, {0x68, 0x51, 0x62, 0x5b, 0x54, 0x6d, 0x5e, 0x27}, {0x68, 0x51, 0x42, 0x5b, 0x54, 0x6d, 0x5e, 0x27}, {0x68, 0x51, 0x42, 0x5b, 0x54, 0x6d, 0x5e, 0x47}, {0x68, 0x51, 0x42, 0x5b, 0x54, 0x6d, 0x5e, 0x47}, {0x68, 0x51, 0x42, 0x5b, 0x54, 0x6d, 0x5e, 0x47}, {0x68, 0x51, 0x42, 0x0b, 0x54, 0x6d, 0x0e, 0x47}, {0x68, 0x51, 0x42, 0x0b, 0x54, 0x6d, 0x0e, 0x47}, {0x68, 0x51, 0x42, 0x0b, 0x54, 0x6d, 0x0e, 0x47} }, { {0x60, 0x59, 0x02, 0x4b, 0x5c, 0x65, 0x4e, 0x07}, {0x60, 0x59, 0x02, 0x4b, 0x5c, 0x65, 0x4e, 0x07}, {0x60, 0x59, 0x02, 0x4b, 0x5c, 0x65, 0x4e, 0x07}, {0x60, 0x59, 0x52, 0x6b, 0x5c, 0x65, 0x4e, 0x07}, {0x60, 0x59, 0x52, 0x6b, 0x5c, 0x65, 0x4e, 0x07}, {0x60, 0x59, 0x52, 0x6b, 0x5c, 0x65, 0x4e, 0x07}, {0x60, 0x59, 0x52, 0x6b, 0x5c, 0x65, 0x4e, 0x17}, {0x60, 0x59, 0x52, 0x6b, 0x5c, 0x65, 0x6e, 0x17}, {0x20, 0x59, 0x52, 0x6b, 0x5c, 0x65, 0x6e, 0x17}, {0x20, 0x59, 0x52, 0x6b, 0x5c, 0x65, 0x6e, 0x17}, {0x20, 0x19, 0x52, 0x6b, 0x5c, 0x25, 0x6e, 0x17}, {0x20, 0x19, 0x52, 0x6b, 0x5c, 0x25, 0x6e, 0x17}, {0x20, 0x19, 0x72, 0x6b, 0x1c, 0x25, 0x6e, 0x17}, {0x20, 0x19, 0x72, 0x6b, 0x1c, 0x25, 0x6e, 0x17}, {0x20, 0x19, 0x72, 0x7b, 0x1c, 0x25, 0x6e, 0x37}, {0x20, 0x19, 0x72, 0x7b, 0x1c, 0x25, 0x6e, 0x37}, {0x28, 0x19, 0x72, 0x7b, 0x1c, 0x25, 0x7e, 0x37}, {0x28, 0x19, 0x72, 0x7b, 0x1c, 0x25, 0x7e, 0x37}, {0x28, 0x11, 0x72, 0x7b, 0x1c, 0x2d, 0x7e, 0x37}, {0x28, 0x11, 0x72, 0x7b, 0x1c, 0x2d, 0x7e, 0x37}, {0x28, 0x11, 0x62, 0x7b, 0x14, 0x2d, 0x7e, 0x37}, {0x28, 0x11, 0x62, 0x7b, 0x14, 0x2d, 0x7e, 0x37}, {0x28, 0x11, 0x62, 0x5b, 0x14, 0x2d, 0x7e, 0x27}, {0x28, 0x11, 0x62, 0x5b, 0x14, 0x2d, 0x7e, 0x27}, {0x68, 0x11, 0x62, 0x5b, 0x14, 0x2d, 0x5e, 0x27}, {0x68, 0x11, 0x62, 0x5b, 0x14, 0x2d, 0x5e, 0x27}, {0x68, 0x51, 0x62, 0x5b, 0x14, 0x6d, 0x5e, 0x27}, {0x68, 0x51, 0x62, 0x5b, 0x14, 0x6d, 0x5e, 0x27}, {0x68, 0x51, 0x62, 0x5b, 0x54, 0x6d, 0x5e, 0x27}, {0x68, 0x51, 0x62, 0x5b, 0x54, 0x6d, 0x5e, 0x27}, {0x68, 0x51, 0x42, 0x5b, 0x54, 0x6d, 0x5e, 0x47}, {0x68, 0x51, 0x42, 0x5b, 0x54, 0x6d, 0x5e, 0x47}, {0x68, 0x51, 0x42, 0x5b, 0x54, 0x6d, 0x5e, 0x47}, {0x68, 0x51, 0x42, 0x5b, 0x54, 0x6d, 0x5e, 0x47}, {0x68, 0x51, 0x42, 0x0b, 0x54, 0x6d, 0x0e, 0x47}, {0x68, 0x51, 0x42, 0x0b, 0x54, 0x6d, 0x0e, 0x47} }, { {0x60, 0x59, 0x02, 0x4b, 0x5c, 0x65, 0x4e, 0x07}, {0x60, 0x59, 0x02, 0x4b, 0x5c, 0x65, 0x4e, 0x07}, {0x60, 0x59, 0x52, 0x6b, 0x5c, 0x65, 0x4e, 0x07}, {0x60, 0x59, 0x52, 0x6b, 0x5c, 0x65, 0x4e, 0x07}, {0x60, 0x59, 0x52, 0x6b, 0x5c, 0x65, 0x4e, 0x07}, {0x60, 0x59, 0x52, 0x6b, 0x5c, 0x65, 0x4e, 0x07}, {0x60, 0x59, 0x52, 0x6b, 0x5c, 0x65, 0x6e, 0x57}, {0x60, 0x59, 0x52, 0x6b, 0x5c, 0x65, 0x6e, 0x57}, {0x20, 0x59, 0x52, 0x6b, 0x5c, 0x65, 0x6e, 0x57}, {0x20, 0x59, 0x52, 0x6b, 0x5c, 0x65, 0x6e, 0x57}, {0x20, 0x19, 0x52, 0x6b, 0x5c, 0x45, 0x6e, 0x57}, {0x20, 0x19, 0x52, 0x6b, 0x5c, 0x45, 0x6e, 0x57}, {0x20, 0x19, 0x72, 0x6b, 0x1c, 0x45, 0x6e, 0x57}, {0x20, 0x19, 0x72, 0x6b, 0x1c, 0x45, 0x6e, 0x57}, {0x20, 0x19, 0x72, 0x7b, 0x1c, 0x45, 0x6e, 0x77}, {0x20, 0x19, 0x72, 0x7b, 0x1c, 0x45, 0x6e, 0x77}, {0x28, 0x19, 0x72, 0x7b, 0x1c, 0x45, 0x7e, 0x77}, {0x28, 0x19, 0x72, 0x7b, 0x1c, 0x45, 0x7e, 0x77}, {0x28, 0x11, 0x72, 0x7b, 0x1c, 0x4d, 0x7e, 0x77}, {0x28, 0x11, 0x72, 0x7b, 0x1c, 0x4d, 0x7e, 0x77}, {0x28, 0x11, 0x62, 0x7b, 0x14, 0x4d, 0x7e, 0x77}, {0x28, 0x11, 0x62, 0x7b, 0x14, 0x4d, 0x7e, 0x77}, {0x28, 0x11, 0x62, 0x5b, 0x14, 0x4d, 0x7e, 0x67}, {0x28, 0x11, 0x62, 0x5b, 0x14, 0x4d, 0x7e, 0x67}, {0x68, 0x11, 0x62, 0x5b, 0x14, 0x4d, 0x5e, 0x67}, {0x68, 0x11, 0x62, 0x5b, 0x14, 0x4d, 0x5e, 0x67}, {0x68, 0x51, 0x62, 0x5b, 0x14, 0x6d, 0x5e, 0x67}, {0x68, 0x51, 0x62, 0x5b, 0x14, 0x6d, 0x5e, 0x67}, {0x68, 0x51, 0x62, 0x5b, 0x54, 0x6d, 0x5e, 0x67}, {0x68, 0x51, 0x62, 0x5b, 0x54, 0x6d, 0x5e, 0x67}, {0x68, 0x51, 0x62, 0x5b, 0x54, 0x6d, 0x5e, 0x67}, {0x68, 0x51, 0x42, 0x5b, 0x54, 0x6d, 0x5e, 0x47}, {0x68, 0x51, 0x42, 0x5b, 0x54, 0x6d, 0x5e, 0x47}, {0x68, 0x51, 0x42, 0x5b, 0x54, 0x6d, 0x5e, 0x47}, {0x68, 0x51, 0x42, 0x0b, 0x54, 0x6d, 0x0e, 0x47}, {0x68, 0x51, 0x42, 0x0b, 0x54, 0x6d, 0x0e, 0x47} }, { {0x60, 0x59, 0x02, 0x4b, 0x5c, 0x65, 0x4e, 0x07}, {0x60, 0x59, 0x52, 0x6b, 0x5c, 0x65, 0x4e, 0x07}, {0x60, 0x59, 0x52, 0x6b, 0x5c, 0x65, 0x4e, 0x07}, {0x60, 0x59, 0x52, 0x6b, 0x5c, 0x65, 0x4e, 0x07}, {0x60, 0x59, 0x52, 0x6b, 0x5c, 0x65, 0x4e, 0x07}, {0x60, 0x59, 0x52, 0x6b, 0x5c, 0x65, 0x6e, 0x57}, {0x60, 0x59, 0x52, 0x6b, 0x5c, 0x65, 0x6e, 0x57}, {0x60, 0x59, 0x52, 0x6b, 0x5c, 0x65, 0x6e, 0x57}, {0x20, 0x59, 0x52, 0x6b, 0x5c, 0x65, 0x6e, 0x57}, {0x20, 0x59, 0x52, 0x6b, 0x5c, 0x45, 0x6e, 0x57}, {0x20, 0x19, 0x52, 0x6b, 0x5c, 0x45, 0x6e, 0x57}, {0x20, 0x19, 0x52, 0x6b, 0x5c, 0x45, 0x6e, 0x57}, {0x20, 0x19, 0x72, 0x6b, 0x1c, 0x45, 0x6e, 0x57}, {0x20, 0x19, 0x72, 0x6b, 0x1c, 0x45, 0x6e, 0x57}, {0x20, 0x19, 0x72, 0x7b, 0x1c, 0x45, 0x6e, 0x77}, {0x20, 0x19, 0x72, 0x7b, 0x1c, 0x45, 0x6e, 0x77}, {0x28, 0x19, 0x72, 0x7b, 0x1c, 0x45, 0x7e, 0x77}, {0x28, 0x19, 0x72, 0x7b, 0x1c, 0x45, 0x7e, 0x77}, {0x28, 0x11, 0x72, 0x7b, 0x1c, 0x4d, 0x7e, 0x77}, {0x28, 0x11, 0x72, 0x7b, 0x1c, 0x4d, 0x7e, 0x77}, {0x28, 0x11, 0x62, 0x7b, 0x14, 0x4d, 0x7e, 0x77}, {0x28, 0x11, 0x62, 0x7b, 0x14, 0x4d, 0x7e, 0x77}, {0x28, 0x11, 0x62, 0x5b, 0x14, 0x4d, 0x7e, 0x67}, {0x28, 0x11, 0x62, 0x5b, 0x14, 0x4d, 0x7e, 0x67}, {0x68, 0x11, 0x62, 0x5b, 0x14, 0x4d, 0x5e, 0x67}, {0x68, 0x11, 0x62, 0x5b, 0x14, 0x4d, 0x5e, 0x67}, {0x68, 0x51, 0x62, 0x5b, 0x14, 0x4d, 0x5e, 0x67}, {0x68, 0x51, 0x62, 0x5b, 0x14, 0x6d, 0x5e, 0x67}, {0x68, 0x51, 0x62, 0x5b, 0x54, 0x6d, 0x5e, 0x67}, {0x68, 0x51, 0x62, 0x5b, 0x54, 0x6d, 0x5e, 0x67}, {0x68, 0x51, 0x62, 0x5b, 0x54, 0x6d, 0x5e, 0x67}, {0x68, 0x51, 0x62, 0x5b, 0x54, 0x6d, 0x5e, 0x67}, {0x68, 0x51, 0x42, 0x5b, 0x54, 0x6d, 0x5e, 0x47}, {0x68, 0x51, 0x42, 0x5b, 0x54, 0x6d, 0x5e, 0x47}, {0x68, 0x51, 0x42, 0x5b, 0x54, 0x6d, 0x5e, 0x47}, {0x68, 0x51, 0x42, 0x0b, 0x54, 0x6d, 0x0e, 0x47} }, { {0x60, 0x59, 0x52, 0x6b, 0x5c, 0x65, 0x4e, 0x07}, {0x60, 0x59, 0x52, 0x6b, 0x5c, 0x65, 0x4e, 0x07}, {0x60, 0x59, 0x52, 0x6b, 0x5c, 0x65, 0x4e, 0x07}, {0x60, 0x59, 0x52, 0x6b, 0x5c, 0x65, 0x4e, 0x07}, {0x60, 0x59, 0x52, 0x6b, 0x5c, 0x65, 0x6e, 0x57}, {0x60, 0x59, 0x52, 0x6b, 0x5c, 0x65, 0x6e, 0x57}, {0x60, 0x59, 0x52, 0x6b, 0x5c, 0x65, 0x6e, 0x57}, {0x60, 0x59, 0x52, 0x6b, 0x5c, 0x65, 0x6e, 0x57}, {0x40, 0x59, 0x52, 0x6b, 0x5c, 0x45, 0x6e, 0x57}, {0x40, 0x59, 0x52, 0x6b, 0x5c, 0x45, 0x6e, 0x57}, {0x40, 0x19, 0x52, 0x6b, 0x5c, 0x45, 0x6e, 0x57}, {0x40, 0x19, 0x52, 0x6b, 0x5c, 0x45, 0x6e, 0x57}, {0x40, 0x19, 0x72, 0x6b, 0x0c, 0x45, 0x6e, 0x57}, {0x40, 0x19, 0x72, 0x6b, 0x0c, 0x45, 0x6e, 0x57}, {0x40, 0x19, 0x72, 0x7b, 0x0c, 0x45, 0x6e, 0x77}, {0x40, 0x19, 0x72, 0x7b, 0x0c, 0x45, 0x6e, 0x77}, {0x48, 0x19, 0x72, 0x7b, 0x0c, 0x45, 0x7e, 0x77}, {0x48, 0x19, 0x72, 0x7b, 0x0c, 0x45, 0x7e, 0x77}, {0x48, 0x11, 0x72, 0x7b, 0x0c, 0x4d, 0x7e, 0x77}, {0x48, 0x11, 0x72, 0x7b, 0x0c, 0x4d, 0x7e, 0x77}, {0x48, 0x11, 0x62, 0x7b, 0x04, 0x4d, 0x7e, 0x77}, {0x48, 0x11, 0x62, 0x7b, 0x04, 0x4d, 0x7e, 0x77}, {0x48, 0x11, 0x62, 0x5b, 0x04, 0x4d, 0x7e, 0x67}, {0x48, 0x11, 0x62, 0x5b, 0x04, 0x4d, 0x7e, 0x67}, {0x68, 0x11, 0x62, 0x5b, 0x04, 0x4d, 0x5e, 0x67}, {0x68, 0x11, 0x62, 0x5b, 0x04, 0x4d, 0x5e, 0x67}, {0x68, 0x51, 0x62, 0x5b, 0x04, 0x4d, 0x5e, 0x67}, {0x68, 0x51, 0x62, 0x5b, 0x04, 0x4d, 0x5e, 0x67}, {0x68, 0x51, 0x62, 0x5b, 0x54, 0x6d, 0x5e, 0x67}, {0x68, 0x51, 0x62, 0x5b, 0x54, 0x6d, 0x5e, 0x67}, {0x68, 0x51, 0x62, 0x5b, 0x54, 0x6d, 0x5e, 0x67}, {0x68, 0x51, 0x62, 0x5b, 0x54, 0x6d, 0x5e, 0x67}, {0x68, 0x51, 0x62, 0x5b, 0x54, 0x6d, 0x5e, 0x67}, {0x68, 0x51, 0x42, 0x5b, 0x54, 0x6d, 0x5e, 0x47}, {0x68, 0x51, 0x42, 0x5b, 0x54, 0x6d, 0x5e, 0x47}, {0x68, 0x51, 0x42, 0x5b, 0x54, 0x6d, 0x5e, 0x47} }, { {0x60, 0x59, 0x52, 0x6b, 0x5c, 0x65, 0x4e, 0x07}, {0x60, 0x59, 0x52, 0x6b, 0x5c, 0x65, 0x4e, 0x07}, {0x60, 0x59, 0x52, 0x6b, 0x5c, 0x65, 0x4e, 0x07}, {0x60, 0x59, 0x52, 0x6b, 0x5c, 0x65, 0x6e, 0x57}, {0x60, 0x59, 0x52, 0x6b, 0x5c, 0x65, 0x6e, 0x57}, {0x60, 0x59, 0x52, 0x6b, 0x5c, 0x65, 0x6e, 0x57}, {0x60, 0x59, 0x52, 0x6b, 0x5c, 0x65, 0x6e, 0x57}, {0x40, 0x59, 0x52, 0x6b, 0x5c, 0x45, 0x6e, 0x57}, {0x40, 0x59, 0x52, 0x6b, 0x5c, 0x45, 0x6e, 0x57}, {0x40, 0x59, 0x52, 0x6b, 0x5c, 0x45, 0x6e, 0x57}, {0x40, 0x19, 0x52, 0x6b, 0x5c, 0x45, 0x6e, 0x57}, {0x40, 0x19, 0x52, 0x6b, 0x0c, 0x45, 0x6e, 0x57}, {0x40, 0x19, 0x72, 0x6b, 0x0c, 0x45, 0x6e, 0x57}, {0x40, 0x19, 0x72, 0x6b, 0x0c, 0x45, 0x6e, 0x57}, {0x40, 0x19, 0x72, 0x7b, 0x0c, 0x45, 0x6e, 0x77}, {0x40, 0x19, 0x72, 0x7b, 0x0c, 0x45, 0x6e, 0x77}, {0x48, 0x19, 0x72, 0x7b, 0x0c, 0x45, 0x7e, 0x77}, {0x48, 0x19, 0x72, 0x7b, 0x0c, 0x45, 0x7e, 0x77}, {0x48, 0x11, 0x72, 0x7b, 0x0c, 0x4d, 0x7e, 0x77}, {0x48, 0x11, 0x72, 0x7b, 0x0c, 0x4d, 0x7e, 0x77}, {0x48, 0x11, 0x62, 0x7b, 0x04, 0x4d, 0x7e, 0x77}, {0x48, 0x11, 0x62, 0x7b, 0x04, 0x4d, 0x7e, 0x77}, {0x48, 0x11, 0x62, 0x5b, 0x04, 0x4d, 0x7e, 0x67}, {0x48, 0x11, 0x62, 0x5b, 0x04, 0x4d, 0x7e, 0x67}, {0x48, 0x11, 0x62, 0x5b, 0x04, 0x4d, 0x5e, 0x67}, {0x68, 0x11, 0x62, 0x5b, 0x04, 0x4d, 0x5e, 0x67}, {0x68, 0x51, 0x62, 0x5b, 0x04, 0x4d, 0x5e, 0x67}, {0x68, 0x51, 0x62, 0x5b, 0x04, 0x4d, 0x5e, 0x67}, {0x68, 0x51, 0x62, 0x5b, 0x04, 0x4d, 0x5e, 0x67}, {0x68, 0x51, 0x62, 0x5b, 0x54, 0x6d, 0x5e, 0x67}, {0x68, 0x51, 0x62, 0x5b, 0x54, 0x6d, 0x5e, 0x67}, {0x68, 0x51, 0x62, 0x5b, 0x54, 0x6d, 0x5e, 0x67}, {0x68, 0x51, 0x62, 0x5b, 0x54, 0x6d, 0x5e, 0x67}, {0x68, 0x51, 0x62, 0x5b, 0x54, 0x6d, 0x5e, 0x67}, {0x68, 0x51, 0x42, 0x5b, 0x54, 0x6d, 0x5e, 0x47}, {0x68, 0x51, 0x42, 0x5b, 0x54, 0x6d, 0x5e, 0x47} }, { {0x60, 0x59, 0x52, 0x6b, 0x5c, 0x65, 0x4e, 0x07}, {0x60, 0x59, 0x52, 0x6b, 0x5c, 0x65, 0x4e, 0x07}, {0x60, 0x59, 0x52, 0x6b, 0x5c, 0x65, 0x6e, 0x57}, {0x60, 0x59, 0x52, 0x6b, 0x5c, 0x65, 0x6e, 0x57}, {0x60, 0x59, 0x52, 0x6b, 0x5c, 0x65, 0x6e, 0x57}, {0x60, 0x59, 0x52, 0x6b, 0x5c, 0x65, 0x6e, 0x57}, {0x40, 0x59, 0x52, 0x6b, 0x5c, 0x45, 0x6e, 0x57}, {0x40, 0x59, 0x52, 0x6b, 0x5c, 0x45, 0x6e, 0x57}, {0x40, 0x59, 0x52, 0x6b, 0x5c, 0x45, 0x6e, 0x57}, {0x40, 0x59, 0x52, 0x6b, 0x5c, 0x45, 0x6e, 0x57}, {0x40, 0x09, 0x52, 0x6b, 0x0c, 0x45, 0x6e, 0x57}, {0x40, 0x09, 0x52, 0x6b, 0x0c, 0x45, 0x6e, 0x57}, {0x40, 0x09, 0x72, 0x6b, 0x0c, 0x45, 0x6e, 0x57}, {0x40, 0x09, 0x72, 0x6b, 0x0c, 0x45, 0x6e, 0x57}, {0x40, 0x09, 0x72, 0x7b, 0x0c, 0x45, 0x6e, 0x77}, {0x40, 0x09, 0x72, 0x7b, 0x0c, 0x45, 0x6e, 0x77}, {0x48, 0x09, 0x72, 0x7b, 0x0c, 0x45, 0x7e, 0x77}, {0x48, 0x09, 0x72, 0x7b, 0x0c, 0x45, 0x7e, 0x77}, {0x48, 0x01, 0x72, 0x7b, 0x0c, 0x4d, 0x7e, 0x77}, {0x48, 0x01, 0x72, 0x7b, 0x0c, 0x4d, 0x7e, 0x77}, {0x48, 0x01, 0x62, 0x7b, 0x04, 0x4d, 0x7e, 0x77}, {0x48, 0x01, 0x62, 0x7b, 0x04, 0x4d, 0x7e, 0x77}, {0x48, 0x01, 0x62, 0x5b, 0x04, 0x4d, 0x7e, 0x67}, {0x48, 0x01, 0x62, 0x5b, 0x04, 0x4d, 0x7e, 0x67}, {0x48, 0x01, 0x62, 0x5b, 0x04, 0x4d, 0x5e, 0x67}, {0x48, 0x01, 0x62, 0x5b, 0x04, 0x4d, 0x5e, 0x67}, {0x68, 0x51, 0x62, 0x5b, 0x04, 0x4d, 0x5e, 0x67}, {0x68, 0x51, 0x62, 0x5b, 0x04, 0x4d, 0x5e, 0x67}, {0x68, 0x51, 0x62, 0x5b, 0x04, 0x4d, 0x5e, 0x67}, {0x68, 0x51, 0x62, 0x5b, 0x04, 0x4d, 0x5e, 0x67}, {0x68, 0x51, 0x62, 0x5b, 0x54, 0x6d, 0x5e, 0x67}, {0x68, 0x51, 0x62, 0x5b, 0x54, 0x6d, 0x5e, 0x67}, {0x68, 0x51, 0x62, 0x5b, 0x54, 0x6d, 0x5e, 0x67}, {0x68, 0x51, 0x62, 0x5b, 0x54, 0x6d, 0x5e, 0x67}, {0x68, 0x51, 0x42, 0x5b, 0x54, 0x6d, 0x5e, 0x47}, {0x68, 0x51, 0x42, 0x5b, 0x54, 0x6d, 0x5e, 0x47} }, { {0x60, 0x59, 0x52, 0x6b, 0x5c, 0x65, 0x4e, 0x07}, {0x60, 0x59, 0x52, 0x6b, 0x5c, 0x65, 0x6e, 0x57}, {0x60, 0x59, 0x52, 0x6b, 0x5c, 0x65, 0x6e, 0x57}, {0x60, 0x59, 0x52, 0x6b, 0x5c, 0x65, 0x6e, 0x57}, {0x60, 0x59, 0x52, 0x6b, 0x5c, 0x65, 0x6e, 0x57}, {0x40, 0x59, 0x52, 0x6b, 0x5c, 0x45, 0x6e, 0x57}, {0x40, 0x59, 0x52, 0x6b, 0x5c, 0x45, 0x6e, 0x57}, {0x40, 0x59, 0x52, 0x6b, 0x5c, 0x45, 0x6e, 0x57}, {0x40, 0x59, 0x52, 0x6b, 0x5c, 0x45, 0x6e, 0x57}, {0x40, 0x09, 0x52, 0x6b, 0x0c, 0x45, 0x6e, 0x57}, {0x40, 0x09, 0x52, 0x6b, 0x0c, 0x45, 0x6e, 0x57}, {0x40, 0x09, 0x52, 0x6b, 0x0c, 0x45, 0x6e, 0x57}, {0x40, 0x09, 0x72, 0x6b, 0x0c, 0x45, 0x6e, 0x57}, {0x40, 0x09, 0x72, 0x6b, 0x0c, 0x45, 0x6e, 0x57}, {0x40, 0x09, 0x72, 0x7b, 0x0c, 0x45, 0x6e, 0x77}, {0x40, 0x09, 0x72, 0x7b, 0x0c, 0x45, 0x6e, 0x77}, {0x48, 0x09, 0x72, 0x7b, 0x0c, 0x45, 0x7e, 0x77}, {0x48, 0x09, 0x72, 0x7b, 0x0c, 0x45, 0x7e, 0x77}, {0x48, 0x01, 0x72, 0x7b, 0x0c, 0x4d, 0x7e, 0x77}, {0x48, 0x01, 0x72, 0x7b, 0x0c, 0x4d, 0x7e, 0x77}, {0x48, 0x01, 0x62, 0x7b, 0x04, 0x4d, 0x7e, 0x77}, {0x48, 0x01, 0x62, 0x7b, 0x04, 0x4d, 0x7e, 0x77}, {0x48, 0x01, 0x62, 0x5b, 0x04, 0x4d, 0x7e, 0x67}, {0x48, 0x01, 0x62, 0x5b, 0x04, 0x4d, 0x7e, 0x67}, {0x48, 0x01, 0x62, 0x5b, 0x04, 0x4d, 0x5e, 0x67}, {0x48, 0x01, 0x62, 0x5b, 0x04, 0x4d, 0x5e, 0x67}, {0x48, 0x01, 0x62, 0x5b, 0x04, 0x4d, 0x5e, 0x67}, {0x68, 0x51, 0x62, 0x5b, 0x04, 0x4d, 0x5e, 0x67}, {0x68, 0x51, 0x62, 0x5b, 0x04, 0x4d, 0x5e, 0x67}, {0x68, 0x51, 0x62, 0x5b, 0x04, 0x4d, 0x5e, 0x67}, {0x68, 0x51, 0x62, 0x5b, 0x04, 0x4d, 0x5e, 0x67}, {0x68, 0x51, 0x62, 0x5b, 0x54, 0x6d, 0x5e, 0x67}, {0x68, 0x51, 0x62, 0x5b, 0x54, 0x6d, 0x5e, 0x67}, {0x68, 0x51, 0x62, 0x5b, 0x54, 0x6d, 0x5e, 0x67}, {0x68, 0x51, 0x62, 0x5b, 0x54, 0x6d, 0x5e, 0x67}, {0x68, 0x51, 0x42, 0x5b, 0x54, 0x6d, 0x5e, 0x47} }, { {0x60, 0x59, 0x52, 0x6b, 0x5c, 0x65, 0x6e, 0x57}, {0x60, 0x59, 0x52, 0x6b, 0x5c, 0x65, 0x6e, 0x57}, {0x60, 0x59, 0x52, 0x6b, 0x5c, 0x65, 0x6e, 0x57}, {0x60, 0x59, 0x52, 0x6b, 0x5c, 0x65, 0x6e, 0x57}, {0x40, 0x59, 0x52, 0x6b, 0x5c, 0x45, 0x6e, 0x57}, {0x40, 0x59, 0x52, 0x6b, 0x5c, 0x45, 0x6e, 0x57}, {0x40, 0x59, 0x52, 0x6b, 0x5c, 0x45, 0x6e, 0x57}, {0x40, 0x59, 0x52, 0x6b, 0x5c, 0x45, 0x6e, 0x57}, {0x40, 0x09, 0x52, 0x6b, 0x0c, 0x45, 0x6e, 0x57}, {0x40, 0x09, 0x52, 0x6b, 0x0c, 0x45, 0x6e, 0x57}, {0x40, 0x09, 0x52, 0x6b, 0x0c, 0x45, 0x6e, 0x57}, {0x40, 0x09, 0x52, 0x6b, 0x0c, 0x45, 0x6e, 0x57}, {0x40, 0x09, 0x72, 0x6b, 0x0c, 0x45, 0x6e, 0x57}, {0x40, 0x09, 0x72, 0x6b, 0x0c, 0x45, 0x6e, 0x57}, {0x40, 0x09, 0x72, 0x7b, 0x0c, 0x45, 0x6e, 0x77}, {0x40, 0x09, 0x72, 0x7b, 0x0c, 0x45, 0x6e, 0x77}, {0x48, 0x09, 0x72, 0x7b, 0x0c, 0x45, 0x7e, 0x77}, {0x48, 0x09, 0x72, 0x7b, 0x0c, 0x45, 0x7e, 0x77}, {0x48, 0x01, 0x72, 0x7b, 0x0c, 0x4d, 0x7e, 0x77}, {0x48, 0x01, 0x72, 0x7b, 0x0c, 0x4d, 0x7e, 0x77}, {0x48, 0x01, 0x62, 0x7b, 0x04, 0x4d, 0x7e, 0x77}, {0x48, 0x01, 0x62, 0x7b, 0x04, 0x4d, 0x7e, 0x77}, {0x48, 0x01, 0x62, 0x5b, 0x04, 0x4d, 0x7e, 0x67}, {0x48, 0x01, 0x62, 0x5b, 0x04, 0x4d, 0x7e, 0x67}, {0x48, 0x01, 0x62, 0x5b, 0x04, 0x4d, 0x5e, 0x67}, {0x48, 0x01, 0x62, 0x5b, 0x04, 0x4d, 0x5e, 0x67}, {0x48, 0x01, 0x62, 0x5b, 0x04, 0x4d, 0x5e, 0x67}, {0x48, 0x01, 0x62, 0x5b, 0x04, 0x4d, 0x5e, 0x67}, {0x48, 0x01, 0x62, 0x5b, 0x04, 0x4d, 0x5e, 0x67}, {0x68, 0x51, 0x62, 0x5b, 0x04, 0x4d, 0x5e, 0x67}, {0x68, 0x51, 0x62, 0x5b, 0x04, 0x4d, 0x5e, 0x67}, {0x68, 0x51, 0x62, 0x5b, 0x04, 0x4d, 0x5e, 0x67}, {0x68, 0x51, 0x62, 0x5b, 0x04, 0x4d, 0x5e, 0x67}, {0x68, 0x51, 0x62, 0x5b, 0x54, 0x6d, 0x5e, 0x67}, {0x68, 0x51, 0x62, 0x5b, 0x54, 0x6d, 0x5e, 0x67}, {0x68, 0x51, 0x62, 0x5b, 0x54, 0x6d, 0x5e, 0x67} }, { {0x60, 0x59, 0x52, 0x6b, 0x5c, 0x65, 0x6e, 0x57}, {0x60, 0x59, 0x52, 0x6b, 0x5c, 0x65, 0x6e, 0x57}, {0x60, 0x59, 0x52, 0x6b, 0x5c, 0x65, 0x6e, 0x57}, {0x40, 0x59, 0x52, 0x6b, 0x5c, 0x45, 0x6e, 0x57}, {0x40, 0x59, 0x52, 0x6b, 0x5c, 0x45, 0x6e, 0x57}, {0x40, 0x59, 0x52, 0x6b, 0x5c, 0x45, 0x6e, 0x57}, {0x40, 0x59, 0x52, 0x6b, 0x5c, 0x45, 0x6e, 0x57}, {0x40, 0x09, 0x52, 0x6b, 0x0c, 0x45, 0x6e, 0x57}, {0x40, 0x09, 0x52, 0x6b, 0x0c, 0x45, 0x6e, 0x57}, {0x40, 0x09, 0x52, 0x6b, 0x0c, 0x45, 0x6e, 0x57}, {0x40, 0x09, 0x52, 0x6b, 0x0c, 0x45, 0x6e, 0x57}, {0x40, 0x09, 0x52, 0x6b, 0x0c, 0x45, 0x6e, 0x57}, {0x40, 0x09, 0x72, 0x6b, 0x0c, 0x45, 0x6e, 0x57}, {0x40, 0x09, 0x72, 0x6b, 0x0c, 0x45, 0x6e, 0x57}, {0x40, 0x09, 0x72, 0x7b, 0x0c, 0x45, 0x6e, 0x77}, {0x40, 0x09, 0x72, 0x7b, 0x0c, 0x45, 0x6e, 0x77}, {0x48, 0x09, 0x72, 0x7b, 0x0c, 0x45, 0x7e, 0x77}, {0x48, 0x09, 0x72, 0x7b, 0x0c, 0x45, 0x7e, 0x77}, {0x48, 0x01, 0x72, 0x7b, 0x0c, 0x4d, 0x7e, 0x77}, {0x48, 0x01, 0x72, 0x7b, 0x0c, 0x4d, 0x7e, 0x77}, {0x48, 0x01, 0x62, 0x7b, 0x04, 0x4d, 0x7e, 0x77}, {0x48, 0x01, 0x62, 0x7b, 0x04, 0x4d, 0x7e, 0x77}, {0x48, 0x01, 0x62, 0x5b, 0x04, 0x4d, 0x7e, 0x67}, {0x48, 0x01, 0x62, 0x5b, 0x04, 0x4d, 0x7e, 0x67}, {0x48, 0x01, 0x62, 0x5b, 0x04, 0x4d, 0x5e, 0x67}, {0x48, 0x01, 0x62, 0x5b, 0x04, 0x4d, 0x5e, 0x67}, {0x48, 0x01, 0x62, 0x5b, 0x04, 0x4d, 0x5e, 0x67}, {0x48, 0x01, 0x62, 0x5b, 0x04, 0x4d, 0x5e, 0x67}, {0x48, 0x01, 0x62, 0x5b, 0x04, 0x4d, 0x5e, 0x67}, {0x48, 0x01, 0x62, 0x5b, 0x04, 0x4d, 0x5e, 0x67}, {0x68, 0x51, 0x62, 0x5b, 0x04, 0x4d, 0x5e, 0x67}, {0x68, 0x51, 0x62, 0x5b, 0x04, 0x4d, 0x5e, 0x67}, {0x68, 0x51, 0x62, 0x5b, 0x04, 0x4d, 0x5e, 0x67}, {0x68, 0x51, 0x62, 0x5b, 0x04, 0x4d, 0x5e, 0x67}, {0x68, 0x51, 0x62, 0x5b, 0x54, 0x6d, 0x5e, 0x67}, {0x68, 0x51, 0x62, 0x5b, 0x54, 0x6d, 0x5e, 0x67} } }, { /* 12,000bps map */ { {0x38, 0x21, 0x32, 0x13, 0x24, 0x3d, 0x16, 0x37}, {0x38, 0x01, 0x32, 0x13, 0x24, 0x3d, 0x16, 0x37}, {0x38, 0x01, 0x32, 0x13, 0x24, 0x3d, 0x16, 0x37}, {0x38, 0x01, 0x32, 0x13, 0x24, 0x3d, 0x16, 0x37}, {0x38, 0x01, 0x32, 0x13, 0x24, 0x3d, 0x16, 0x37}, {0x38, 0x01, 0x32, 0x13, 0x04, 0x3d, 0x16, 0x37}, {0x38, 0x01, 0x32, 0x13, 0x04, 0x3d, 0x16, 0x37}, {0x38, 0x01, 0x32, 0x13, 0x04, 0x3d, 0x16, 0x37}, {0x38, 0x01, 0x32, 0x13, 0x04, 0x3d, 0x16, 0x37}, {0x38, 0x01, 0x32, 0x13, 0x04, 0x3d, 0x16, 0x37}, {0x38, 0x01, 0x32, 0x13, 0x04, 0x3d, 0x16, 0x37}, {0x38, 0x01, 0x32, 0x13, 0x04, 0x3d, 0x16, 0x37}, {0x38, 0x01, 0x22, 0x1b, 0x04, 0x3d, 0x16, 0x37}, {0x38, 0x01, 0x22, 0x1b, 0x04, 0x3d, 0x16, 0x37}, {0x38, 0x01, 0x22, 0x1b, 0x04, 0x3d, 0x16, 0x37}, {0x38, 0x01, 0x22, 0x1b, 0x04, 0x3d, 0x16, 0x37}, {0x38, 0x01, 0x22, 0x1b, 0x04, 0x3d, 0x1e, 0x27}, {0x38, 0x01, 0x22, 0x1b, 0x04, 0x3d, 0x1e, 0x27}, {0x38, 0x01, 0x22, 0x1b, 0x04, 0x3d, 0x1e, 0x27}, {0x38, 0x01, 0x22, 0x1b, 0x04, 0x3d, 0x1e, 0x27}, {0x30, 0x01, 0x22, 0x1b, 0x04, 0x35, 0x1e, 0x27}, {0x30, 0x01, 0x22, 0x1b, 0x04, 0x35, 0x1e, 0x27}, {0x30, 0x01, 0x22, 0x1b, 0x04, 0x35, 0x1e, 0x27}, {0x30, 0x01, 0x22, 0x1b, 0x04, 0x35, 0x1e, 0x27}, {0x30, 0x11, 0x22, 0x1b, 0x14, 0x35, 0x1e, 0x27}, {0x30, 0x11, 0x22, 0x1b, 0x14, 0x35, 0x1e, 0x27}, {0x30, 0x11, 0x22, 0x1b, 0x14, 0x35, 0x1e, 0x27}, {0x30, 0x11, 0x22, 0x1b, 0x14, 0x35, 0x1e, 0x27}, {0x30, 0x11, 0x22, 0x1b, 0x14, 0x35, 0x1e, 0x27}, {0x30, 0x11, 0x22, 0x1b, 0x14, 0x35, 0x1e, 0x27}, {0x30, 0x11, 0x22, 0x1b, 0x14, 0x35, 0x1e, 0x27}, {0x30, 0x11, 0x22, 0x1b, 0x14, 0x35, 0x1e, 0x27}, {0x30, 0x11, 0x22, 0x3b, 0x14, 0x35, 0x1e, 0x27}, {0x30, 0x11, 0x22, 0x3b, 0x14, 0x35, 0x1e, 0x27}, {0x30, 0x11, 0x22, 0x3b, 0x14, 0x35, 0x1e, 0x27}, {0x30, 0x11, 0x22, 0x3b, 0x14, 0x35, 0x1e, 0x27} }, { {0x38, 0x21, 0x32, 0x13, 0x24, 0x1d, 0x16, 0x37}, {0x38, 0x21, 0x32, 0x13, 0x24, 0x3d, 0x16, 0x37}, {0x38, 0x01, 0x32, 0x13, 0x24, 0x3d, 0x16, 0x37}, {0x38, 0x01, 0x32, 0x13, 0x24, 0x3d, 0x16, 0x37}, {0x38, 0x01, 0x32, 0x13, 0x24, 0x3d, 0x16, 0x37}, {0x38, 0x01, 0x32, 0x13, 0x24, 0x3d, 0x16, 0x37}, {0x38, 0x01, 0x32, 0x13, 0x04, 0x3d, 0x16, 0x37}, {0x38, 0x01, 0x32, 0x13, 0x04, 0x3d, 0x16, 0x37}, {0x38, 0x01, 0x32, 0x13, 0x04, 0x3d, 0x16, 0x37}, {0x38, 0x01, 0x32, 0x13, 0x04, 0x3d, 0x16, 0x37}, {0x38, 0x01, 0x32, 0x13, 0x04, 0x3d, 0x16, 0x37}, {0x38, 0x01, 0x32, 0x13, 0x04, 0x3d, 0x16, 0x37}, {0x38, 0x01, 0x22, 0x1b, 0x04, 0x3d, 0x16, 0x37}, {0x38, 0x01, 0x22, 0x1b, 0x04, 0x3d, 0x16, 0x37}, {0x38, 0x01, 0x22, 0x1b, 0x04, 0x3d, 0x16, 0x37}, {0x38, 0x01, 0x22, 0x1b, 0x04, 0x3d, 0x16, 0x37}, {0x38, 0x01, 0x22, 0x1b, 0x04, 0x3d, 0x1e, 0x27}, {0x38, 0x01, 0x22, 0x1b, 0x04, 0x3d, 0x1e, 0x27}, {0x38, 0x01, 0x22, 0x1b, 0x04, 0x3d, 0x1e, 0x27}, {0x38, 0x01, 0x22, 0x1b, 0x04, 0x3d, 0x1e, 0x27}, {0x30, 0x01, 0x22, 0x1b, 0x04, 0x35, 0x1e, 0x27}, {0x30, 0x01, 0x22, 0x1b, 0x04, 0x35, 0x1e, 0x27}, {0x30, 0x01, 0x22, 0x1b, 0x04, 0x35, 0x1e, 0x27}, {0x30, 0x01, 0x22, 0x1b, 0x04, 0x35, 0x1e, 0x27}, {0x30, 0x11, 0x22, 0x1b, 0x14, 0x35, 0x1e, 0x27}, {0x30, 0x11, 0x22, 0x1b, 0x14, 0x35, 0x1e, 0x27}, {0x30, 0x11, 0x22, 0x1b, 0x14, 0x35, 0x1e, 0x27}, {0x30, 0x11, 0x22, 0x1b, 0x14, 0x35, 0x1e, 0x27}, {0x30, 0x11, 0x22, 0x1b, 0x14, 0x35, 0x1e, 0x27}, {0x30, 0x11, 0x22, 0x1b, 0x14, 0x35, 0x1e, 0x27}, {0x30, 0x11, 0x22, 0x1b, 0x14, 0x35, 0x1e, 0x27}, {0x30, 0x11, 0x22, 0x3b, 0x14, 0x35, 0x1e, 0x27}, {0x30, 0x11, 0x22, 0x3b, 0x14, 0x35, 0x1e, 0x27}, {0x30, 0x11, 0x22, 0x3b, 0x14, 0x35, 0x1e, 0x27}, {0x30, 0x11, 0x22, 0x3b, 0x14, 0x35, 0x1e, 0x27}, {0x30, 0x11, 0x02, 0x3b, 0x14, 0x35, 0x3e, 0x27} }, { {0x38, 0x21, 0x32, 0x13, 0x24, 0x1d, 0x16, 0x37}, {0x38, 0x21, 0x32, 0x13, 0x24, 0x1d, 0x16, 0x37}, {0x38, 0x21, 0x32, 0x13, 0x24, 0x3d, 0x16, 0x37}, {0x38, 0x01, 0x32, 0x13, 0x24, 0x3d, 0x16, 0x37}, {0x38, 0x01, 0x32, 0x13, 0x24, 0x3d, 0x16, 0x37}, {0x38, 0x01, 0x32, 0x13, 0x24, 0x3d, 0x16, 0x37}, {0x38, 0x01, 0x32, 0x13, 0x24, 0x3d, 0x16, 0x37}, {0x38, 0x01, 0x32, 0x13, 0x04, 0x3d, 0x16, 0x37}, {0x38, 0x01, 0x32, 0x13, 0x04, 0x3d, 0x16, 0x37}, {0x38, 0x01, 0x32, 0x13, 0x04, 0x3d, 0x16, 0x37}, {0x38, 0x01, 0x32, 0x13, 0x04, 0x3d, 0x16, 0x37}, {0x38, 0x01, 0x32, 0x13, 0x04, 0x3d, 0x16, 0x37}, {0x38, 0x01, 0x22, 0x1b, 0x04, 0x3d, 0x16, 0x37}, {0x38, 0x01, 0x22, 0x1b, 0x04, 0x3d, 0x16, 0x37}, {0x38, 0x01, 0x22, 0x1b, 0x04, 0x3d, 0x16, 0x37}, {0x38, 0x01, 0x22, 0x1b, 0x04, 0x3d, 0x16, 0x37}, {0x38, 0x01, 0x22, 0x1b, 0x04, 0x3d, 0x1e, 0x27}, {0x38, 0x01, 0x22, 0x1b, 0x04, 0x3d, 0x1e, 0x27}, {0x38, 0x01, 0x22, 0x1b, 0x04, 0x3d, 0x1e, 0x27}, {0x38, 0x01, 0x22, 0x1b, 0x04, 0x3d, 0x1e, 0x27}, {0x30, 0x01, 0x22, 0x1b, 0x04, 0x35, 0x1e, 0x27}, {0x30, 0x01, 0x22, 0x1b, 0x04, 0x35, 0x1e, 0x27}, {0x30, 0x01, 0x22, 0x1b, 0x04, 0x35, 0x1e, 0x27}, {0x30, 0x01, 0x22, 0x1b, 0x04, 0x35, 0x1e, 0x27}, {0x30, 0x11, 0x22, 0x1b, 0x14, 0x35, 0x1e, 0x27}, {0x30, 0x11, 0x22, 0x1b, 0x14, 0x35, 0x1e, 0x27}, {0x30, 0x11, 0x22, 0x1b, 0x14, 0x35, 0x1e, 0x27}, {0x30, 0x11, 0x22, 0x1b, 0x14, 0x35, 0x1e, 0x27}, {0x30, 0x11, 0x22, 0x1b, 0x14, 0x35, 0x1e, 0x27}, {0x30, 0x11, 0x22, 0x1b, 0x14, 0x35, 0x1e, 0x27}, {0x30, 0x11, 0x22, 0x3b, 0x14, 0x35, 0x1e, 0x27}, {0x30, 0x11, 0x22, 0x3b, 0x14, 0x35, 0x1e, 0x27}, {0x30, 0x11, 0x22, 0x3b, 0x14, 0x35, 0x1e, 0x27}, {0x30, 0x11, 0x22, 0x3b, 0x14, 0x35, 0x1e, 0x27}, {0x30, 0x11, 0x02, 0x3b, 0x14, 0x35, 0x3e, 0x27}, {0x30, 0x11, 0x02, 0x3b, 0x14, 0x35, 0x3e, 0x27} }, { {0x38, 0x21, 0x32, 0x13, 0x24, 0x1d, 0x16, 0x37}, {0x38, 0x21, 0x32, 0x13, 0x24, 0x1d, 0x16, 0x37}, {0x38, 0x21, 0x32, 0x13, 0x24, 0x1d, 0x16, 0x37}, {0x38, 0x21, 0x32, 0x13, 0x24, 0x3d, 0x16, 0x37}, {0x38, 0x01, 0x32, 0x13, 0x24, 0x3d, 0x16, 0x37}, {0x38, 0x01, 0x32, 0x13, 0x24, 0x3d, 0x16, 0x37}, {0x38, 0x01, 0x32, 0x13, 0x24, 0x3d, 0x16, 0x37}, {0x38, 0x01, 0x32, 0x13, 0x24, 0x3d, 0x16, 0x37}, {0x38, 0x01, 0x32, 0x13, 0x04, 0x3d, 0x16, 0x37}, {0x38, 0x01, 0x32, 0x13, 0x04, 0x3d, 0x16, 0x37}, {0x38, 0x01, 0x32, 0x13, 0x04, 0x3d, 0x16, 0x37}, {0x38, 0x01, 0x32, 0x13, 0x04, 0x3d, 0x16, 0x37}, {0x38, 0x01, 0x22, 0x1b, 0x04, 0x3d, 0x16, 0x37}, {0x38, 0x01, 0x22, 0x1b, 0x04, 0x3d, 0x16, 0x37}, {0x38, 0x01, 0x22, 0x1b, 0x04, 0x3d, 0x16, 0x37}, {0x38, 0x01, 0x22, 0x1b, 0x04, 0x3d, 0x16, 0x37}, {0x38, 0x01, 0x22, 0x1b, 0x04, 0x3d, 0x1e, 0x27}, {0x38, 0x01, 0x22, 0x1b, 0x04, 0x3d, 0x1e, 0x27}, {0x38, 0x01, 0x22, 0x1b, 0x04, 0x3d, 0x1e, 0x27}, {0x38, 0x01, 0x22, 0x1b, 0x04, 0x3d, 0x1e, 0x27}, {0x30, 0x01, 0x22, 0x1b, 0x04, 0x35, 0x1e, 0x27}, {0x30, 0x01, 0x22, 0x1b, 0x04, 0x35, 0x1e, 0x27}, {0x30, 0x01, 0x22, 0x1b, 0x04, 0x35, 0x1e, 0x27}, {0x30, 0x01, 0x22, 0x1b, 0x04, 0x35, 0x1e, 0x27}, {0x30, 0x11, 0x22, 0x1b, 0x14, 0x35, 0x1e, 0x27}, {0x30, 0x11, 0x22, 0x1b, 0x14, 0x35, 0x1e, 0x27}, {0x30, 0x11, 0x22, 0x1b, 0x14, 0x35, 0x1e, 0x27}, {0x30, 0x11, 0x22, 0x1b, 0x14, 0x35, 0x1e, 0x27}, {0x30, 0x11, 0x22, 0x1b, 0x14, 0x35, 0x1e, 0x27}, {0x30, 0x11, 0x22, 0x3b, 0x14, 0x35, 0x1e, 0x27}, {0x30, 0x11, 0x22, 0x3b, 0x14, 0x35, 0x1e, 0x27}, {0x30, 0x11, 0x22, 0x3b, 0x14, 0x35, 0x1e, 0x27}, {0x30, 0x11, 0x22, 0x3b, 0x14, 0x35, 0x1e, 0x27}, {0x30, 0x11, 0x02, 0x3b, 0x14, 0x35, 0x3e, 0x27}, {0x30, 0x11, 0x02, 0x3b, 0x14, 0x35, 0x3e, 0x27}, {0x30, 0x11, 0x02, 0x3b, 0x14, 0x35, 0x3e, 0x27} }, { {0x38, 0x21, 0x32, 0x13, 0x24, 0x1d, 0x16, 0x37}, {0x38, 0x21, 0x32, 0x13, 0x24, 0x1d, 0x16, 0x37}, {0x38, 0x21, 0x32, 0x13, 0x24, 0x1d, 0x16, 0x37}, {0x38, 0x21, 0x32, 0x13, 0x24, 0x1d, 0x16, 0x37}, {0x38, 0x21, 0x32, 0x13, 0x24, 0x3d, 0x16, 0x37}, {0x38, 0x01, 0x32, 0x13, 0x24, 0x3d, 0x16, 0x37}, {0x38, 0x01, 0x32, 0x13, 0x24, 0x3d, 0x16, 0x37}, {0x38, 0x01, 0x32, 0x13, 0x24, 0x3d, 0x16, 0x37}, {0x38, 0x01, 0x32, 0x13, 0x24, 0x3d, 0x16, 0x37}, {0x38, 0x01, 0x32, 0x13, 0x04, 0x3d, 0x16, 0x37}, {0x38, 0x01, 0x32, 0x13, 0x04, 0x3d, 0x16, 0x37}, {0x38, 0x01, 0x32, 0x13, 0x04, 0x3d, 0x16, 0x37}, {0x38, 0x01, 0x22, 0x1b, 0x04, 0x3d, 0x16, 0x37}, {0x38, 0x01, 0x22, 0x1b, 0x04, 0x3d, 0x16, 0x37}, {0x38, 0x01, 0x22, 0x1b, 0x04, 0x3d, 0x16, 0x37}, {0x38, 0x01, 0x22, 0x1b, 0x04, 0x3d, 0x16, 0x37}, {0x38, 0x01, 0x22, 0x1b, 0x04, 0x3d, 0x1e, 0x27}, {0x38, 0x01, 0x22, 0x1b, 0x04, 0x3d, 0x1e, 0x27}, {0x38, 0x01, 0x22, 0x1b, 0x04, 0x3d, 0x1e, 0x27}, {0x38, 0x01, 0x22, 0x1b, 0x04, 0x3d, 0x1e, 0x27}, {0x30, 0x01, 0x22, 0x1b, 0x04, 0x35, 0x1e, 0x27}, {0x30, 0x01, 0x22, 0x1b, 0x04, 0x35, 0x1e, 0x27}, {0x30, 0x01, 0x22, 0x1b, 0x04, 0x35, 0x1e, 0x27}, {0x30, 0x01, 0x22, 0x1b, 0x04, 0x35, 0x1e, 0x27}, {0x30, 0x11, 0x22, 0x1b, 0x14, 0x35, 0x1e, 0x27}, {0x30, 0x11, 0x22, 0x1b, 0x14, 0x35, 0x1e, 0x27}, {0x30, 0x11, 0x22, 0x1b, 0x14, 0x35, 0x1e, 0x27}, {0x30, 0x11, 0x22, 0x1b, 0x14, 0x35, 0x1e, 0x27}, {0x30, 0x11, 0x22, 0x3b, 0x14, 0x35, 0x1e, 0x27}, {0x30, 0x11, 0x22, 0x3b, 0x14, 0x35, 0x1e, 0x27}, {0x30, 0x11, 0x22, 0x3b, 0x14, 0x35, 0x1e, 0x27}, {0x30, 0x11, 0x22, 0x3b, 0x14, 0x35, 0x1e, 0x27}, {0x30, 0x11, 0x02, 0x3b, 0x14, 0x35, 0x3e, 0x27}, {0x30, 0x11, 0x02, 0x3b, 0x14, 0x35, 0x3e, 0x27}, {0x30, 0x11, 0x02, 0x3b, 0x14, 0x35, 0x3e, 0x27}, {0x30, 0x11, 0x02, 0x3b, 0x14, 0x35, 0x3e, 0x27} }, { {0x18, 0x21, 0x32, 0x13, 0x24, 0x1d, 0x16, 0x37}, {0x38, 0x21, 0x32, 0x13, 0x24, 0x1d, 0x16, 0x37}, {0x38, 0x21, 0x32, 0x13, 0x24, 0x1d, 0x16, 0x37}, {0x38, 0x21, 0x32, 0x13, 0x24, 0x1d, 0x16, 0x37}, {0x38, 0x21, 0x32, 0x13, 0x24, 0x1d, 0x16, 0x37}, {0x38, 0x21, 0x32, 0x13, 0x24, 0x3d, 0x16, 0x37}, {0x38, 0x01, 0x32, 0x13, 0x24, 0x3d, 0x16, 0x37}, {0x38, 0x01, 0x32, 0x13, 0x24, 0x3d, 0x16, 0x37}, {0x38, 0x01, 0x32, 0x13, 0x24, 0x3d, 0x16, 0x37}, {0x38, 0x01, 0x32, 0x13, 0x24, 0x3d, 0x16, 0x37}, {0x38, 0x01, 0x32, 0x13, 0x04, 0x3d, 0x16, 0x37}, {0x38, 0x01, 0x32, 0x0b, 0x04, 0x3d, 0x16, 0x37}, {0x38, 0x01, 0x22, 0x0b, 0x04, 0x3d, 0x16, 0x37}, {0x38, 0x01, 0x22, 0x1b, 0x04, 0x3d, 0x16, 0x37}, {0x38, 0x01, 0x22, 0x1b, 0x04, 0x3d, 0x16, 0x37}, {0x38, 0x01, 0x22, 0x1b, 0x04, 0x3d, 0x0e, 0x37}, {0x38, 0x01, 0x22, 0x1b, 0x04, 0x3d, 0x0e, 0x27}, {0x38, 0x01, 0x22, 0x1b, 0x04, 0x3d, 0x1e, 0x27}, {0x38, 0x01, 0x22, 0x1b, 0x04, 0x3d, 0x1e, 0x27}, {0x38, 0x01, 0x22, 0x1b, 0x04, 0x2d, 0x1e, 0x27}, {0x30, 0x01, 0x22, 0x1b, 0x04, 0x2d, 0x1e, 0x27}, {0x30, 0x01, 0x22, 0x1b, 0x04, 0x35, 0x1e, 0x27}, {0x30, 0x01, 0x22, 0x1b, 0x04, 0x35, 0x1e, 0x27}, {0x30, 0x01, 0x22, 0x1b, 0x0c, 0x35, 0x1e, 0x27}, {0x30, 0x11, 0x22, 0x1b, 0x0c, 0x35, 0x1e, 0x27}, {0x30, 0x11, 0x22, 0x1b, 0x14, 0x35, 0x1e, 0x27}, {0x30, 0x11, 0x22, 0x1b, 0x14, 0x35, 0x1e, 0x27}, {0x30, 0x11, 0x22, 0x3b, 0x14, 0x35, 0x1e, 0x27}, {0x30, 0x11, 0x22, 0x3b, 0x14, 0x35, 0x1e, 0x27}, {0x30, 0x11, 0x22, 0x3b, 0x14, 0x35, 0x1e, 0x27}, {0x30, 0x11, 0x22, 0x3b, 0x14, 0x35, 0x1e, 0x27}, {0x30, 0x11, 0x02, 0x3b, 0x14, 0x35, 0x3e, 0x27}, {0x30, 0x11, 0x02, 0x3b, 0x14, 0x35, 0x3e, 0x27}, {0x30, 0x11, 0x02, 0x3b, 0x14, 0x35, 0x3e, 0x27}, {0x30, 0x11, 0x02, 0x3b, 0x14, 0x35, 0x3e, 0x27}, {0x30, 0x11, 0x02, 0x3b, 0x14, 0x35, 0x3e, 0x07} }, { {0x18, 0x21, 0x32, 0x13, 0x24, 0x1d, 0x16, 0x37}, {0x18, 0x21, 0x32, 0x13, 0x24, 0x1d, 0x16, 0x37}, {0x38, 0x21, 0x32, 0x13, 0x24, 0x1d, 0x16, 0x37}, {0x38, 0x21, 0x32, 0x13, 0x24, 0x1d, 0x16, 0x37}, {0x38, 0x21, 0x32, 0x13, 0x24, 0x1d, 0x16, 0x37}, {0x38, 0x21, 0x32, 0x13, 0x24, 0x1d, 0x16, 0x37}, {0x38, 0x21, 0x32, 0x13, 0x24, 0x3d, 0x16, 0x37}, {0x38, 0x01, 0x32, 0x13, 0x24, 0x3d, 0x16, 0x37}, {0x38, 0x01, 0x32, 0x13, 0x24, 0x3d, 0x16, 0x37}, {0x38, 0x01, 0x32, 0x13, 0x24, 0x3d, 0x16, 0x37}, {0x38, 0x01, 0x32, 0x0b, 0x24, 0x3d, 0x16, 0x37}, {0x38, 0x01, 0x32, 0x0b, 0x04, 0x3d, 0x16, 0x37}, {0x38, 0x01, 0x22, 0x0b, 0x04, 0x3d, 0x16, 0x37}, {0x38, 0x01, 0x22, 0x0b, 0x04, 0x3d, 0x16, 0x37}, {0x38, 0x01, 0x22, 0x1b, 0x04, 0x3d, 0x0e, 0x37}, {0x38, 0x01, 0x22, 0x1b, 0x04, 0x3d, 0x0e, 0x37}, {0x38, 0x01, 0x22, 0x1b, 0x04, 0x3d, 0x0e, 0x27}, {0x38, 0x01, 0x22, 0x1b, 0x04, 0x3d, 0x0e, 0x27}, {0x38, 0x01, 0x22, 0x1b, 0x04, 0x2d, 0x1e, 0x27}, {0x38, 0x01, 0x22, 0x1b, 0x04, 0x2d, 0x1e, 0x27}, {0x30, 0x01, 0x22, 0x1b, 0x04, 0x2d, 0x1e, 0x27}, {0x30, 0x01, 0x22, 0x1b, 0x04, 0x2d, 0x1e, 0x27}, {0x30, 0x01, 0x22, 0x1b, 0x0c, 0x35, 0x1e, 0x27}, {0x30, 0x01, 0x22, 0x1b, 0x0c, 0x35, 0x1e, 0x27}, {0x30, 0x11, 0x22, 0x1b, 0x0c, 0x35, 0x1e, 0x27}, {0x30, 0x11, 0x22, 0x1b, 0x0c, 0x35, 0x1e, 0x27}, {0x30, 0x11, 0x22, 0x3b, 0x14, 0x35, 0x1e, 0x27}, {0x30, 0x11, 0x22, 0x3b, 0x14, 0x35, 0x1e, 0x27}, {0x30, 0x11, 0x22, 0x3b, 0x14, 0x35, 0x1e, 0x27}, {0x30, 0x11, 0x22, 0x3b, 0x14, 0x35, 0x1e, 0x27}, {0x30, 0x11, 0x02, 0x3b, 0x14, 0x35, 0x3e, 0x27}, {0x30, 0x11, 0x02, 0x3b, 0x14, 0x35, 0x3e, 0x27}, {0x30, 0x11, 0x02, 0x3b, 0x14, 0x35, 0x3e, 0x27}, {0x30, 0x11, 0x02, 0x3b, 0x14, 0x35, 0x3e, 0x27}, {0x30, 0x11, 0x02, 0x3b, 0x14, 0x35, 0x3e, 0x07}, {0x30, 0x11, 0x02, 0x3b, 0x14, 0x35, 0x3e, 0x07} }, { {0x18, 0x21, 0x32, 0x13, 0x24, 0x1d, 0x16, 0x37}, {0x18, 0x21, 0x32, 0x13, 0x24, 0x1d, 0x16, 0x37}, {0x18, 0x21, 0x32, 0x13, 0x24, 0x1d, 0x16, 0x37}, {0x38, 0x21, 0x32, 0x13, 0x24, 0x1d, 0x16, 0x37}, {0x38, 0x21, 0x32, 0x13, 0x24, 0x1d, 0x16, 0x37}, {0x38, 0x21, 0x32, 0x13, 0x24, 0x1d, 0x16, 0x37}, {0x38, 0x21, 0x32, 0x13, 0x24, 0x1d, 0x16, 0x37}, {0x38, 0x21, 0x32, 0x13, 0x24, 0x3d, 0x16, 0x37}, {0x38, 0x01, 0x32, 0x13, 0x24, 0x3d, 0x16, 0x37}, {0x38, 0x01, 0x32, 0x0b, 0x24, 0x3d, 0x16, 0x37}, {0x38, 0x01, 0x32, 0x0b, 0x24, 0x3d, 0x16, 0x37}, {0x38, 0x01, 0x32, 0x0b, 0x24, 0x3d, 0x16, 0x37}, {0x38, 0x01, 0x22, 0x0b, 0x04, 0x3d, 0x16, 0x37}, {0x38, 0x01, 0x22, 0x0b, 0x04, 0x3d, 0x0e, 0x37}, {0x38, 0x01, 0x22, 0x0b, 0x04, 0x3d, 0x0e, 0x37}, {0x38, 0x01, 0x22, 0x1b, 0x04, 0x3d, 0x0e, 0x37}, {0x38, 0x01, 0x22, 0x1b, 0x04, 0x3d, 0x0e, 0x27}, {0x38, 0x01, 0x22, 0x1b, 0x04, 0x2d, 0x0e, 0x27}, {0x38, 0x01, 0x22, 0x1b, 0x04, 0x2d, 0x0e, 0x27}, {0x38, 0x01, 0x22, 0x1b, 0x04, 0x2d, 0x1e, 0x27}, {0x30, 0x01, 0x22, 0x1b, 0x04, 0x2d, 0x1e, 0x27}, {0x30, 0x01, 0x22, 0x1b, 0x0c, 0x2d, 0x1e, 0x27}, {0x30, 0x01, 0x22, 0x1b, 0x0c, 0x2d, 0x1e, 0x27}, {0x30, 0x01, 0x22, 0x1b, 0x0c, 0x35, 0x1e, 0x27}, {0x30, 0x11, 0x22, 0x1b, 0x0c, 0x35, 0x1e, 0x27}, {0x30, 0x11, 0x22, 0x3b, 0x0c, 0x35, 0x1e, 0x27}, {0x30, 0x11, 0x22, 0x3b, 0x0c, 0x35, 0x1e, 0x27}, {0x30, 0x11, 0x22, 0x3b, 0x14, 0x35, 0x1e, 0x27}, {0x30, 0x11, 0x22, 0x3b, 0x14, 0x35, 0x1e, 0x27}, {0x30, 0x11, 0x02, 0x3b, 0x14, 0x35, 0x3e, 0x27}, {0x30, 0x11, 0x02, 0x3b, 0x14, 0x35, 0x3e, 0x27}, {0x30, 0x11, 0x02, 0x3b, 0x14, 0x35, 0x3e, 0x27}, {0x30, 0x11, 0x02, 0x3b, 0x14, 0x35, 0x3e, 0x27}, {0x30, 0x11, 0x02, 0x3b, 0x14, 0x35, 0x3e, 0x07}, {0x30, 0x11, 0x02, 0x3b, 0x14, 0x35, 0x3e, 0x07}, {0x30, 0x11, 0x02, 0x3b, 0x14, 0x35, 0x3e, 0x07} }, { {0x18, 0x21, 0x32, 0x13, 0x24, 0x1d, 0x16, 0x37}, {0x18, 0x21, 0x32, 0x13, 0x24, 0x1d, 0x16, 0x37}, {0x18, 0x21, 0x32, 0x13, 0x24, 0x1d, 0x16, 0x37}, {0x18, 0x21, 0x32, 0x13, 0x24, 0x1d, 0x16, 0x37}, {0x38, 0x21, 0x32, 0x13, 0x24, 0x1d, 0x16, 0x37}, {0x38, 0x21, 0x32, 0x13, 0x24, 0x1d, 0x16, 0x37}, {0x38, 0x21, 0x32, 0x13, 0x24, 0x1d, 0x16, 0x37}, {0x38, 0x21, 0x32, 0x13, 0x24, 0x1d, 0x16, 0x37}, {0x38, 0x21, 0x32, 0x0b, 0x24, 0x3d, 0x16, 0x37}, {0x38, 0x01, 0x32, 0x0b, 0x24, 0x3d, 0x16, 0x37}, {0x38, 0x01, 0x32, 0x0b, 0x24, 0x3d, 0x16, 0x37}, {0x38, 0x01, 0x32, 0x0b, 0x24, 0x3d, 0x16, 0x37}, {0x38, 0x01, 0x2a, 0x0b, 0x24, 0x3d, 0x0e, 0x37}, {0x38, 0x01, 0x22, 0x0b, 0x04, 0x3d, 0x0e, 0x37}, {0x38, 0x01, 0x22, 0x0b, 0x04, 0x3d, 0x0e, 0x37}, {0x38, 0x01, 0x22, 0x0b, 0x04, 0x3d, 0x0e, 0x37}, {0x38, 0x01, 0x22, 0x1b, 0x04, 0x2d, 0x0e, 0x27}, {0x38, 0x01, 0x22, 0x1b, 0x04, 0x2d, 0x0e, 0x27}, {0x38, 0x01, 0x22, 0x1b, 0x04, 0x2d, 0x0e, 0x27}, {0x38, 0x01, 0x22, 0x1b, 0x04, 0x2d, 0x0e, 0x27}, {0x30, 0x01, 0x22, 0x1b, 0x0c, 0x2d, 0x1e, 0x27}, {0x30, 0x01, 0x22, 0x1b, 0x0c, 0x2d, 0x1e, 0x27}, {0x30, 0x01, 0x22, 0x1b, 0x0c, 0x2d, 0x1e, 0x27}, {0x30, 0x01, 0x22, 0x1b, 0x0c, 0x2d, 0x1e, 0x27}, {0x30, 0x11, 0x22, 0x3b, 0x0c, 0x35, 0x1e, 0x27}, {0x30, 0x11, 0x22, 0x3b, 0x0c, 0x35, 0x1e, 0x27}, {0x30, 0x11, 0x22, 0x3b, 0x0c, 0x35, 0x1e, 0x27}, {0x30, 0x11, 0x22, 0x3b, 0x0c, 0x35, 0x1e, 0x27}, {0x30, 0x11, 0x02, 0x3b, 0x14, 0x35, 0x3e, 0x27}, {0x30, 0x11, 0x02, 0x3b, 0x14, 0x35, 0x3e, 0x27}, {0x30, 0x11, 0x02, 0x3b, 0x14, 0x35, 0x3e, 0x27}, {0x30, 0x11, 0x02, 0x3b, 0x14, 0x35, 0x3e, 0x27}, {0x30, 0x11, 0x02, 0x3b, 0x14, 0x35, 0x3e, 0x07}, {0x30, 0x11, 0x02, 0x3b, 0x14, 0x35, 0x3e, 0x07}, {0x30, 0x11, 0x02, 0x3b, 0x14, 0x35, 0x3e, 0x07}, {0x30, 0x11, 0x02, 0x3b, 0x14, 0x35, 0x3e, 0x07} }, { {0x18, 0x21, 0x32, 0x13, 0x24, 0x1d, 0x16, 0x37}, {0x18, 0x21, 0x32, 0x13, 0x24, 0x1d, 0x16, 0x37}, {0x18, 0x21, 0x32, 0x13, 0x24, 0x1d, 0x16, 0x37}, {0x18, 0x21, 0x32, 0x13, 0x24, 0x1d, 0x16, 0x37}, {0x18, 0x21, 0x32, 0x13, 0x24, 0x1d, 0x16, 0x37}, {0x38, 0x21, 0x32, 0x13, 0x24, 0x1d, 0x16, 0x37}, {0x38, 0x21, 0x32, 0x13, 0x24, 0x1d, 0x16, 0x37}, {0x38, 0x21, 0x32, 0x0b, 0x24, 0x1d, 0x16, 0x37}, {0x38, 0x21, 0x32, 0x0b, 0x24, 0x1d, 0x16, 0x37}, {0x38, 0x21, 0x32, 0x0b, 0x24, 0x3d, 0x16, 0x37}, {0x38, 0x01, 0x32, 0x0b, 0x24, 0x3d, 0x16, 0x37}, {0x38, 0x01, 0x2a, 0x0b, 0x24, 0x3d, 0x0e, 0x37}, {0x38, 0x01, 0x2a, 0x0b, 0x24, 0x3d, 0x0e, 0x37}, {0x38, 0x01, 0x2a, 0x0b, 0x24, 0x3d, 0x0e, 0x37}, {0x38, 0x01, 0x22, 0x0b, 0x04, 0x3d, 0x0e, 0x37}, {0x38, 0x01, 0x22, 0x0b, 0x04, 0x2d, 0x0e, 0x2f}, {0x38, 0x01, 0x22, 0x0b, 0x04, 0x2d, 0x0e, 0x2f}, {0x38, 0x01, 0x22, 0x1b, 0x04, 0x2d, 0x0e, 0x27}, {0x38, 0x01, 0x22, 0x1b, 0x04, 0x2d, 0x0e, 0x27}, {0x28, 0x01, 0x22, 0x1b, 0x0c, 0x2d, 0x0e, 0x27}, {0x28, 0x01, 0x22, 0x1b, 0x0c, 0x2d, 0x0e, 0x27}, {0x30, 0x01, 0x22, 0x1b, 0x0c, 0x2d, 0x1e, 0x27}, {0x30, 0x01, 0x22, 0x1b, 0x0c, 0x2d, 0x1e, 0x27}, {0x30, 0x09, 0x22, 0x3b, 0x0c, 0x2d, 0x1e, 0x27}, {0x30, 0x09, 0x22, 0x3b, 0x0c, 0x2d, 0x1e, 0x27}, {0x30, 0x11, 0x22, 0x3b, 0x0c, 0x35, 0x1e, 0x27}, {0x30, 0x11, 0x22, 0x3b, 0x0c, 0x35, 0x1e, 0x27}, {0x30, 0x11, 0x02, 0x3b, 0x0c, 0x35, 0x3e, 0x27}, {0x30, 0x11, 0x02, 0x3b, 0x0c, 0x35, 0x3e, 0x27}, {0x30, 0x11, 0x02, 0x3b, 0x14, 0x35, 0x3e, 0x27}, {0x30, 0x11, 0x02, 0x3b, 0x14, 0x35, 0x3e, 0x27}, {0x30, 0x11, 0x02, 0x3b, 0x14, 0x35, 0x3e, 0x07}, {0x30, 0x11, 0x02, 0x3b, 0x14, 0x35, 0x3e, 0x07}, {0x30, 0x11, 0x02, 0x3b, 0x14, 0x35, 0x3e, 0x07}, {0x30, 0x11, 0x02, 0x3b, 0x14, 0x35, 0x3e, 0x07}, {0x30, 0x11, 0x02, 0x3b, 0x14, 0x35, 0x3e, 0x07} }, { {0x18, 0x21, 0x32, 0x13, 0x24, 0x1d, 0x16, 0x37}, {0x18, 0x21, 0x32, 0x13, 0x24, 0x1d, 0x16, 0x37}, {0x18, 0x21, 0x32, 0x13, 0x24, 0x1d, 0x16, 0x37}, {0x18, 0x21, 0x32, 0x13, 0x24, 0x1d, 0x16, 0x37}, {0x18, 0x21, 0x32, 0x13, 0x24, 0x1d, 0x16, 0x37}, {0x18, 0x21, 0x32, 0x13, 0x24, 0x1d, 0x16, 0x37}, {0x38, 0x21, 0x32, 0x0b, 0x24, 0x1d, 0x16, 0x37}, {0x38, 0x21, 0x32, 0x0b, 0x24, 0x1d, 0x16, 0x37}, {0x38, 0x21, 0x32, 0x0b, 0x24, 0x1d, 0x16, 0x37}, {0x38, 0x21, 0x32, 0x0b, 0x24, 0x1d, 0x16, 0x37}, {0x38, 0x21, 0x2a, 0x0b, 0x24, 0x3d, 0x0e, 0x37}, {0x38, 0x01, 0x2a, 0x0b, 0x24, 0x3d, 0x0e, 0x37}, {0x38, 0x01, 0x2a, 0x0b, 0x24, 0x3d, 0x0e, 0x37}, {0x38, 0x01, 0x2a, 0x0b, 0x24, 0x3d, 0x0e, 0x37}, {0x38, 0x01, 0x22, 0x0b, 0x04, 0x2d, 0x0e, 0x2f}, {0x38, 0x01, 0x22, 0x0b, 0x04, 0x2d, 0x0e, 0x2f}, {0x38, 0x01, 0x22, 0x0b, 0x04, 0x2d, 0x0e, 0x2f}, {0x38, 0x01, 0x22, 0x0b, 0x04, 0x2d, 0x0e, 0x2f}, {0x28, 0x01, 0x22, 0x1b, 0x0c, 0x2d, 0x0e, 0x27}, {0x28, 0x01, 0x22, 0x1b, 0x0c, 0x2d, 0x0e, 0x27}, {0x28, 0x01, 0x22, 0x1b, 0x0c, 0x2d, 0x0e, 0x27}, {0x28, 0x01, 0x22, 0x1b, 0x0c, 0x2d, 0x0e, 0x27}, {0x30, 0x09, 0x22, 0x3b, 0x0c, 0x2d, 0x1e, 0x27}, {0x30, 0x09, 0x22, 0x3b, 0x0c, 0x2d, 0x1e, 0x27}, {0x30, 0x09, 0x22, 0x3b, 0x0c, 0x2d, 0x1e, 0x27}, {0x30, 0x09, 0x22, 0x3b, 0x0c, 0x2d, 0x1e, 0x27}, {0x30, 0x11, 0x02, 0x3b, 0x0c, 0x35, 0x3e, 0x27}, {0x30, 0x11, 0x02, 0x3b, 0x0c, 0x35, 0x3e, 0x27}, {0x30, 0x11, 0x02, 0x3b, 0x0c, 0x35, 0x3e, 0x27}, {0x30, 0x11, 0x02, 0x3b, 0x0c, 0x35, 0x3e, 0x27}, {0x30, 0x11, 0x02, 0x3b, 0x14, 0x35, 0x3e, 0x07}, {0x30, 0x11, 0x02, 0x3b, 0x14, 0x35, 0x3e, 0x07}, {0x30, 0x11, 0x02, 0x3b, 0x14, 0x35, 0x3e, 0x07}, {0x30, 0x11, 0x02, 0x3b, 0x14, 0x35, 0x3e, 0x07}, {0x30, 0x11, 0x02, 0x3b, 0x14, 0x35, 0x3e, 0x07}, {0x30, 0x11, 0x02, 0x3b, 0x14, 0x35, 0x3e, 0x07} }, { {0x18, 0x21, 0x32, 0x13, 0x24, 0x1d, 0x16, 0x37}, {0x18, 0x21, 0x32, 0x13, 0x24, 0x1d, 0x16, 0x37}, {0x18, 0x21, 0x32, 0x13, 0x24, 0x1d, 0x16, 0x37}, {0x18, 0x21, 0x32, 0x13, 0x24, 0x1d, 0x16, 0x37}, {0x18, 0x21, 0x32, 0x13, 0x24, 0x1d, 0x16, 0x37}, {0x18, 0x21, 0x32, 0x0b, 0x24, 0x1d, 0x16, 0x37}, {0x18, 0x21, 0x32, 0x0b, 0x24, 0x1d, 0x16, 0x37}, {0x38, 0x21, 0x32, 0x0b, 0x24, 0x1d, 0x16, 0x37}, {0x38, 0x21, 0x32, 0x0b, 0x24, 0x1d, 0x16, 0x37}, {0x38, 0x21, 0x2a, 0x0b, 0x24, 0x1d, 0x0e, 0x37}, {0x38, 0x21, 0x2a, 0x0b, 0x24, 0x1d, 0x0e, 0x37}, {0x38, 0x21, 0x2a, 0x0b, 0x24, 0x3d, 0x0e, 0x37}, {0x38, 0x01, 0x2a, 0x0b, 0x24, 0x3d, 0x0e, 0x37}, {0x38, 0x01, 0x2a, 0x0b, 0x24, 0x2d, 0x0e, 0x2f}, {0x38, 0x01, 0x2a, 0x0b, 0x24, 0x2d, 0x0e, 0x2f}, {0x38, 0x01, 0x22, 0x0b, 0x04, 0x2d, 0x0e, 0x2f}, {0x38, 0x01, 0x22, 0x0b, 0x04, 0x2d, 0x0e, 0x2f}, {0x28, 0x01, 0x22, 0x0b, 0x0c, 0x2d, 0x0e, 0x2f}, {0x28, 0x01, 0x22, 0x0b, 0x0c, 0x2d, 0x0e, 0x2f}, {0x28, 0x01, 0x22, 0x1b, 0x0c, 0x2d, 0x0e, 0x27}, {0x28, 0x01, 0x22, 0x1b, 0x0c, 0x2d, 0x0e, 0x27}, {0x28, 0x09, 0x22, 0x3b, 0x0c, 0x2d, 0x0e, 0x27}, {0x28, 0x09, 0x22, 0x3b, 0x0c, 0x2d, 0x0e, 0x27}, {0x30, 0x09, 0x22, 0x3b, 0x0c, 0x2d, 0x1e, 0x27}, {0x30, 0x09, 0x22, 0x3b, 0x0c, 0x2d, 0x1e, 0x27}, {0x30, 0x09, 0x02, 0x3b, 0x0c, 0x2d, 0x3e, 0x27}, {0x30, 0x09, 0x02, 0x3b, 0x0c, 0x2d, 0x3e, 0x27}, {0x30, 0x11, 0x02, 0x3b, 0x0c, 0x35, 0x3e, 0x27}, {0x30, 0x11, 0x02, 0x3b, 0x0c, 0x35, 0x3e, 0x27}, {0x30, 0x11, 0x02, 0x3b, 0x0c, 0x35, 0x3e, 0x07}, {0x30, 0x11, 0x02, 0x3b, 0x0c, 0x35, 0x3e, 0x07}, {0x30, 0x11, 0x02, 0x3b, 0x14, 0x35, 0x3e, 0x07}, {0x30, 0x11, 0x02, 0x3b, 0x14, 0x35, 0x3e, 0x07}, {0x30, 0x11, 0x02, 0x3b, 0x14, 0x35, 0x3e, 0x07}, {0x30, 0x11, 0x02, 0x3b, 0x14, 0x35, 0x3e, 0x07}, {0x30, 0x11, 0x02, 0x3b, 0x14, 0x35, 0x3e, 0x07} }, { {0x18, 0x21, 0x32, 0x03, 0x24, 0x1d, 0x06, 0x37}, {0x18, 0x21, 0x32, 0x03, 0x24, 0x1d, 0x06, 0x37}, {0x18, 0x21, 0x32, 0x03, 0x24, 0x1d, 0x06, 0x37}, {0x18, 0x21, 0x32, 0x03, 0x24, 0x1d, 0x06, 0x37}, {0x18, 0x21, 0x32, 0x0b, 0x24, 0x1d, 0x06, 0x37}, {0x18, 0x21, 0x32, 0x0b, 0x24, 0x1d, 0x06, 0x37}, {0x18, 0x21, 0x32, 0x0b, 0x24, 0x1d, 0x06, 0x37}, {0x18, 0x21, 0x32, 0x0b, 0x24, 0x1d, 0x06, 0x37}, {0x38, 0x21, 0x2a, 0x0b, 0x24, 0x1d, 0x0e, 0x37}, {0x38, 0x21, 0x2a, 0x0b, 0x24, 0x1d, 0x0e, 0x37}, {0x38, 0x21, 0x2a, 0x0b, 0x24, 0x1d, 0x0e, 0x37}, {0x38, 0x21, 0x2a, 0x0b, 0x24, 0x1d, 0x0e, 0x37}, {0x38, 0x21, 0x2a, 0x0b, 0x24, 0x2d, 0x0e, 0x2f}, {0x38, 0x01, 0x2a, 0x0b, 0x24, 0x2d, 0x0e, 0x2f}, {0x38, 0x01, 0x2a, 0x0b, 0x24, 0x2d, 0x0e, 0x2f}, {0x38, 0x01, 0x2a, 0x0b, 0x24, 0x2d, 0x0e, 0x2f}, {0x28, 0x01, 0x22, 0x0b, 0x0c, 0x2d, 0x0e, 0x2f}, {0x28, 0x01, 0x22, 0x0b, 0x0c, 0x2d, 0x0e, 0x2f}, {0x28, 0x01, 0x22, 0x0b, 0x0c, 0x2d, 0x0e, 0x2f}, {0x28, 0x01, 0x22, 0x0b, 0x0c, 0x2d, 0x0e, 0x2f}, {0x28, 0x09, 0x22, 0x3b, 0x0c, 0x2d, 0x0e, 0x27}, {0x28, 0x09, 0x22, 0x3b, 0x0c, 0x2d, 0x0e, 0x27}, {0x28, 0x09, 0x22, 0x3b, 0x0c, 0x2d, 0x0e, 0x27}, {0x28, 0x09, 0x22, 0x3b, 0x0c, 0x2d, 0x0e, 0x27}, {0x30, 0x09, 0x02, 0x3b, 0x0c, 0x2d, 0x3e, 0x27}, {0x30, 0x09, 0x02, 0x3b, 0x0c, 0x2d, 0x3e, 0x27}, {0x30, 0x09, 0x02, 0x3b, 0x0c, 0x2d, 0x3e, 0x27}, {0x30, 0x09, 0x02, 0x3b, 0x0c, 0x2d, 0x3e, 0x27}, {0x30, 0x11, 0x02, 0x3b, 0x0c, 0x25, 0x3e, 0x07}, {0x30, 0x11, 0x02, 0x3b, 0x0c, 0x25, 0x3e, 0x07}, {0x30, 0x11, 0x02, 0x3b, 0x0c, 0x25, 0x3e, 0x07}, {0x30, 0x11, 0x02, 0x3b, 0x0c, 0x25, 0x3e, 0x07}, {0x30, 0x11, 0x02, 0x3b, 0x1c, 0x25, 0x3e, 0x07}, {0x30, 0x11, 0x02, 0x3b, 0x1c, 0x25, 0x3e, 0x07}, {0x30, 0x11, 0x02, 0x3b, 0x1c, 0x25, 0x3e, 0x07}, {0x30, 0x11, 0x02, 0x3b, 0x1c, 0x25, 0x3e, 0x07} }, { {0x18, 0x21, 0x32, 0x03, 0x24, 0x1d, 0x06, 0x37}, {0x18, 0x21, 0x32, 0x03, 0x24, 0x1d, 0x06, 0x37}, {0x18, 0x21, 0x32, 0x03, 0x24, 0x1d, 0x06, 0x37}, {0x18, 0x21, 0x32, 0x03, 0x24, 0x1d, 0x06, 0x37}, {0x18, 0x21, 0x32, 0x03, 0x24, 0x1d, 0x06, 0x37}, {0x18, 0x21, 0x32, 0x0b, 0x24, 0x1d, 0x06, 0x37}, {0x18, 0x21, 0x32, 0x0b, 0x24, 0x1d, 0x06, 0x37}, {0x18, 0x21, 0x2a, 0x0b, 0x24, 0x1d, 0x06, 0x37}, {0x18, 0x21, 0x2a, 0x0b, 0x24, 0x1d, 0x06, 0x37}, {0x38, 0x21, 0x2a, 0x0b, 0x24, 0x1d, 0x0e, 0x37}, {0x38, 0x21, 0x2a, 0x0b, 0x24, 0x1d, 0x0e, 0x37}, {0x38, 0x21, 0x2a, 0x0b, 0x24, 0x0d, 0x0e, 0x2f}, {0x38, 0x21, 0x2a, 0x0b, 0x24, 0x0d, 0x0e, 0x2f}, {0x38, 0x21, 0x2a, 0x0b, 0x24, 0x2d, 0x0e, 0x2f}, {0x38, 0x01, 0x2a, 0x0b, 0x24, 0x2d, 0x0e, 0x2f}, {0x28, 0x01, 0x2a, 0x0b, 0x2c, 0x2d, 0x0e, 0x2f}, {0x28, 0x01, 0x2a, 0x0b, 0x2c, 0x2d, 0x0e, 0x2f}, {0x28, 0x01, 0x22, 0x0b, 0x0c, 0x2d, 0x0e, 0x2f}, {0x28, 0x01, 0x22, 0x0b, 0x0c, 0x2d, 0x0e, 0x2f}, {0x28, 0x09, 0x22, 0x2b, 0x0c, 0x2d, 0x0e, 0x2f}, {0x28, 0x09, 0x22, 0x2b, 0x0c, 0x2d, 0x0e, 0x2f}, {0x28, 0x09, 0x22, 0x3b, 0x0c, 0x2d, 0x0e, 0x27}, {0x28, 0x09, 0x22, 0x3b, 0x0c, 0x2d, 0x0e, 0x27}, {0x28, 0x09, 0x02, 0x3b, 0x0c, 0x2d, 0x2e, 0x27}, {0x28, 0x09, 0x02, 0x3b, 0x0c, 0x2d, 0x2e, 0x27}, {0x30, 0x09, 0x02, 0x3b, 0x0c, 0x2d, 0x3e, 0x27}, {0x30, 0x09, 0x02, 0x3b, 0x0c, 0x2d, 0x3e, 0x27}, {0x30, 0x09, 0x02, 0x3b, 0x0c, 0x25, 0x3e, 0x07}, {0x30, 0x09, 0x02, 0x3b, 0x0c, 0x25, 0x3e, 0x07}, {0x30, 0x11, 0x02, 0x3b, 0x0c, 0x25, 0x3e, 0x07}, {0x30, 0x11, 0x02, 0x3b, 0x0c, 0x25, 0x3e, 0x07}, {0x30, 0x11, 0x02, 0x3b, 0x1c, 0x25, 0x3e, 0x07}, {0x30, 0x11, 0x02, 0x3b, 0x1c, 0x25, 0x3e, 0x07}, {0x30, 0x11, 0x02, 0x3b, 0x1c, 0x25, 0x3e, 0x07}, {0x30, 0x11, 0x02, 0x3b, 0x1c, 0x25, 0x3e, 0x07}, {0x30, 0x11, 0x02, 0x3b, 0x1c, 0x25, 0x3e, 0x07} }, { {0x18, 0x21, 0x32, 0x03, 0x24, 0x1d, 0x06, 0x37}, {0x18, 0x21, 0x32, 0x03, 0x24, 0x1d, 0x06, 0x37}, {0x18, 0x21, 0x32, 0x03, 0x24, 0x1d, 0x06, 0x37}, {0x18, 0x21, 0x32, 0x03, 0x24, 0x1d, 0x06, 0x37}, {0x18, 0x21, 0x32, 0x03, 0x24, 0x1d, 0x06, 0x37}, {0x18, 0x21, 0x32, 0x03, 0x24, 0x1d, 0x06, 0x37}, {0x18, 0x21, 0x2a, 0x03, 0x24, 0x1d, 0x06, 0x37}, {0x18, 0x21, 0x2a, 0x0b, 0x24, 0x1d, 0x06, 0x37}, {0x18, 0x21, 0x2a, 0x0b, 0x24, 0x1d, 0x06, 0x37}, {0x18, 0x21, 0x2a, 0x0b, 0x24, 0x1d, 0x06, 0x37}, {0x18, 0x21, 0x2a, 0x0b, 0x24, 0x0d, 0x06, 0x2f}, {0x38, 0x21, 0x2a, 0x0b, 0x24, 0x0d, 0x0e, 0x2f}, {0x38, 0x21, 0x2a, 0x0b, 0x24, 0x0d, 0x0e, 0x2f}, {0x38, 0x21, 0x2a, 0x0b, 0x24, 0x0d, 0x0e, 0x2f}, {0x28, 0x21, 0x2a, 0x0b, 0x2c, 0x2d, 0x0e, 0x2f}, {0x28, 0x01, 0x2a, 0x0b, 0x2c, 0x2d, 0x0e, 0x2f}, {0x28, 0x01, 0x2a, 0x0b, 0x2c, 0x2d, 0x0e, 0x2f}, {0x28, 0x01, 0x2a, 0x0b, 0x2c, 0x2d, 0x0e, 0x2f}, {0x28, 0x09, 0x2a, 0x2b, 0x2c, 0x2d, 0x0e, 0x2f}, {0x28, 0x09, 0x22, 0x2b, 0x0c, 0x2d, 0x0e, 0x2f}, {0x28, 0x09, 0x22, 0x2b, 0x0c, 0x2d, 0x0e, 0x2f}, {0x28, 0x09, 0x22, 0x2b, 0x0c, 0x2d, 0x0e, 0x2f}, {0x28, 0x09, 0x02, 0x2b, 0x0c, 0x2d, 0x2e, 0x2f}, {0x28, 0x09, 0x02, 0x3b, 0x0c, 0x2d, 0x2e, 0x27}, {0x28, 0x09, 0x02, 0x3b, 0x0c, 0x2d, 0x2e, 0x27}, {0x28, 0x09, 0x02, 0x3b, 0x0c, 0x2d, 0x2e, 0x27}, {0x28, 0x09, 0x02, 0x3b, 0x0c, 0x25, 0x2e, 0x07}, {0x30, 0x09, 0x02, 0x3b, 0x0c, 0x25, 0x3e, 0x07}, {0x30, 0x09, 0x02, 0x3b, 0x0c, 0x25, 0x3e, 0x07}, {0x30, 0x09, 0x02, 0x3b, 0x0c, 0x25, 0x3e, 0x07}, {0x30, 0x09, 0x02, 0x3b, 0x1c, 0x25, 0x3e, 0x07}, {0x30, 0x11, 0x02, 0x3b, 0x1c, 0x25, 0x3e, 0x07}, {0x30, 0x11, 0x02, 0x3b, 0x1c, 0x25, 0x3e, 0x07}, {0x30, 0x11, 0x02, 0x3b, 0x1c, 0x25, 0x3e, 0x07}, {0x30, 0x11, 0x02, 0x3b, 0x1c, 0x25, 0x3e, 0x07}, {0x30, 0x11, 0x02, 0x3b, 0x1c, 0x25, 0x3e, 0x07} }, { {0x18, 0x21, 0x32, 0x03, 0x24, 0x1d, 0x06, 0x37}, {0x18, 0x21, 0x32, 0x03, 0x24, 0x1d, 0x06, 0x37}, {0x18, 0x21, 0x32, 0x03, 0x24, 0x1d, 0x06, 0x37}, {0x18, 0x21, 0x32, 0x03, 0x24, 0x1d, 0x06, 0x37}, {0x18, 0x21, 0x32, 0x03, 0x24, 0x1d, 0x06, 0x37}, {0x18, 0x21, 0x2a, 0x03, 0x24, 0x1d, 0x06, 0x37}, {0x18, 0x21, 0x2a, 0x03, 0x24, 0x1d, 0x06, 0x37}, {0x18, 0x21, 0x2a, 0x03, 0x24, 0x1d, 0x06, 0x37}, {0x18, 0x21, 0x2a, 0x0b, 0x24, 0x1d, 0x06, 0x37}, {0x18, 0x21, 0x2a, 0x0b, 0x24, 0x0d, 0x06, 0x2f}, {0x18, 0x21, 0x2a, 0x0b, 0x24, 0x0d, 0x06, 0x2f}, {0x18, 0x21, 0x2a, 0x0b, 0x24, 0x0d, 0x06, 0x2f}, {0x38, 0x21, 0x2a, 0x0b, 0x24, 0x0d, 0x0e, 0x2f}, {0x28, 0x21, 0x2a, 0x0b, 0x2c, 0x0d, 0x0e, 0x2f}, {0x28, 0x21, 0x2a, 0x0b, 0x2c, 0x0d, 0x0e, 0x2f}, {0x28, 0x21, 0x2a, 0x0b, 0x2c, 0x2d, 0x0e, 0x2f}, {0x28, 0x01, 0x2a, 0x0b, 0x2c, 0x2d, 0x0e, 0x2f}, {0x28, 0x09, 0x2a, 0x2b, 0x2c, 0x2d, 0x0e, 0x2f}, {0x28, 0x09, 0x2a, 0x2b, 0x2c, 0x2d, 0x0e, 0x2f}, {0x28, 0x09, 0x2a, 0x2b, 0x2c, 0x2d, 0x0e, 0x2f}, {0x28, 0x09, 0x22, 0x2b, 0x0c, 0x2d, 0x0e, 0x2f}, {0x28, 0x09, 0x02, 0x2b, 0x0c, 0x2d, 0x2e, 0x2f}, {0x28, 0x09, 0x02, 0x2b, 0x0c, 0x2d, 0x2e, 0x2f}, {0x28, 0x09, 0x02, 0x2b, 0x0c, 0x2d, 0x2e, 0x2f}, {0x28, 0x09, 0x02, 0x3b, 0x0c, 0x2d, 0x2e, 0x27}, {0x28, 0x09, 0x02, 0x3b, 0x0c, 0x25, 0x2e, 0x07}, {0x28, 0x09, 0x02, 0x3b, 0x0c, 0x25, 0x2e, 0x07}, {0x28, 0x09, 0x02, 0x3b, 0x0c, 0x25, 0x2e, 0x07}, {0x30, 0x09, 0x02, 0x3b, 0x0c, 0x25, 0x3e, 0x07}, {0x30, 0x09, 0x02, 0x3b, 0x1c, 0x25, 0x3e, 0x07}, {0x30, 0x09, 0x02, 0x3b, 0x1c, 0x25, 0x3e, 0x07}, {0x30, 0x09, 0x02, 0x3b, 0x1c, 0x25, 0x3e, 0x07}, {0x30, 0x11, 0x02, 0x3b, 0x1c, 0x25, 0x3e, 0x07}, {0x30, 0x11, 0x02, 0x3b, 0x1c, 0x25, 0x3e, 0x07}, {0x30, 0x11, 0x02, 0x3b, 0x1c, 0x25, 0x3e, 0x07}, {0x30, 0x11, 0x02, 0x3b, 0x1c, 0x25, 0x3e, 0x07} }, { {0x18, 0x21, 0x3a, 0x03, 0x24, 0x1d, 0x06, 0x3f}, {0x18, 0x21, 0x3a, 0x03, 0x24, 0x1d, 0x06, 0x3f}, {0x18, 0x21, 0x3a, 0x03, 0x24, 0x1d, 0x06, 0x3f}, {0x18, 0x21, 0x3a, 0x03, 0x24, 0x1d, 0x06, 0x3f}, {0x18, 0x21, 0x3a, 0x03, 0x24, 0x1d, 0x06, 0x3f}, {0x18, 0x21, 0x2a, 0x03, 0x24, 0x1d, 0x06, 0x3f}, {0x18, 0x21, 0x2a, 0x03, 0x24, 0x1d, 0x06, 0x3f}, {0x18, 0x21, 0x2a, 0x03, 0x24, 0x1d, 0x06, 0x3f}, {0x18, 0x21, 0x2a, 0x03, 0x24, 0x0d, 0x06, 0x3f}, {0x18, 0x21, 0x2a, 0x0b, 0x24, 0x0d, 0x06, 0x2f}, {0x18, 0x21, 0x2a, 0x0b, 0x24, 0x0d, 0x06, 0x2f}, {0x18, 0x21, 0x2a, 0x0b, 0x24, 0x0d, 0x06, 0x2f}, {0x08, 0x21, 0x2a, 0x0b, 0x2c, 0x0d, 0x06, 0x2f}, {0x28, 0x21, 0x2a, 0x0b, 0x2c, 0x0d, 0x0e, 0x2f}, {0x28, 0x21, 0x2a, 0x0b, 0x2c, 0x0d, 0x0e, 0x2f}, {0x28, 0x21, 0x2a, 0x0b, 0x2c, 0x0d, 0x0e, 0x2f}, {0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x0e, 0x2f}, {0x28, 0x09, 0x2a, 0x2b, 0x2c, 0x2d, 0x0e, 0x2f}, {0x28, 0x09, 0x2a, 0x2b, 0x2c, 0x2d, 0x0e, 0x2f}, {0x28, 0x09, 0x2a, 0x2b, 0x2c, 0x2d, 0x0e, 0x2f}, {0x28, 0x09, 0x0a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f}, {0x28, 0x09, 0x02, 0x2b, 0x0c, 0x2d, 0x2e, 0x2f}, {0x28, 0x09, 0x02, 0x2b, 0x0c, 0x2d, 0x2e, 0x2f}, {0x28, 0x09, 0x02, 0x2b, 0x0c, 0x2d, 0x2e, 0x2f}, {0x28, 0x09, 0x02, 0x2b, 0x0c, 0x25, 0x2e, 0x0f}, {0x28, 0x09, 0x02, 0x3b, 0x0c, 0x25, 0x2e, 0x07}, {0x28, 0x09, 0x02, 0x3b, 0x0c, 0x25, 0x2e, 0x07}, {0x28, 0x09, 0x02, 0x3b, 0x0c, 0x25, 0x2e, 0x07}, {0x20, 0x09, 0x02, 0x3b, 0x1c, 0x25, 0x2e, 0x07}, {0x20, 0x09, 0x02, 0x3b, 0x1c, 0x25, 0x3e, 0x07}, {0x20, 0x09, 0x02, 0x3b, 0x1c, 0x25, 0x3e, 0x07}, {0x20, 0x09, 0x02, 0x3b, 0x1c, 0x25, 0x3e, 0x07}, {0x20, 0x19, 0x02, 0x3b, 0x1c, 0x25, 0x3e, 0x07}, {0x20, 0x19, 0x02, 0x3b, 0x1c, 0x25, 0x3e, 0x07}, {0x20, 0x19, 0x02, 0x3b, 0x1c, 0x25, 0x3e, 0x07}, {0x20, 0x19, 0x02, 0x3b, 0x1c, 0x25, 0x3e, 0x07} }, { {0x18, 0x21, 0x3a, 0x03, 0x24, 0x1d, 0x06, 0x3f}, {0x18, 0x21, 0x3a, 0x03, 0x24, 0x1d, 0x06, 0x3f}, {0x18, 0x21, 0x3a, 0x03, 0x24, 0x1d, 0x06, 0x3f}, {0x18, 0x21, 0x3a, 0x03, 0x24, 0x1d, 0x06, 0x3f}, {0x18, 0x21, 0x3a, 0x03, 0x24, 0x1d, 0x06, 0x3f}, {0x18, 0x21, 0x3a, 0x03, 0x24, 0x1d, 0x06, 0x3f}, {0x18, 0x21, 0x2a, 0x03, 0x24, 0x1d, 0x06, 0x3f}, {0x18, 0x21, 0x2a, 0x03, 0x24, 0x0d, 0x06, 0x3f}, {0x18, 0x21, 0x2a, 0x03, 0x24, 0x0d, 0x06, 0x3f}, {0x18, 0x21, 0x2a, 0x03, 0x24, 0x0d, 0x06, 0x3f}, {0x18, 0x21, 0x2a, 0x0b, 0x24, 0x0d, 0x06, 0x2f}, {0x08, 0x21, 0x2a, 0x0b, 0x2c, 0x0d, 0x06, 0x2f}, {0x08, 0x21, 0x2a, 0x0b, 0x2c, 0x0d, 0x06, 0x2f}, {0x08, 0x21, 0x2a, 0x0b, 0x2c, 0x0d, 0x06, 0x2f}, {0x28, 0x21, 0x2a, 0x0b, 0x2c, 0x0d, 0x0e, 0x2f}, {0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x0d, 0x0e, 0x2f}, {0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x0d, 0x0e, 0x2f}, {0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x0e, 0x2f}, {0x28, 0x09, 0x2a, 0x2b, 0x2c, 0x2d, 0x0e, 0x2f}, {0x28, 0x09, 0x0a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f}, {0x28, 0x09, 0x0a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f}, {0x28, 0x09, 0x0a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f}, {0x28, 0x09, 0x02, 0x2b, 0x0c, 0x2d, 0x2e, 0x2f}, {0x28, 0x09, 0x02, 0x2b, 0x0c, 0x25, 0x2e, 0x0f}, {0x28, 0x09, 0x02, 0x2b, 0x0c, 0x25, 0x2e, 0x0f}, {0x28, 0x09, 0x02, 0x2b, 0x0c, 0x25, 0x2e, 0x0f}, {0x28, 0x09, 0x02, 0x3b, 0x0c, 0x25, 0x2e, 0x07}, {0x20, 0x09, 0x02, 0x3b, 0x1c, 0x25, 0x2e, 0x07}, {0x20, 0x09, 0x02, 0x3b, 0x1c, 0x25, 0x2e, 0x07}, {0x20, 0x09, 0x02, 0x3b, 0x1c, 0x25, 0x2e, 0x07}, {0x20, 0x09, 0x02, 0x3b, 0x1c, 0x25, 0x3e, 0x07}, {0x20, 0x19, 0x02, 0x3b, 0x1c, 0x25, 0x3e, 0x07}, {0x20, 0x19, 0x02, 0x3b, 0x1c, 0x25, 0x3e, 0x07}, {0x20, 0x19, 0x02, 0x3b, 0x1c, 0x25, 0x3e, 0x07}, {0x20, 0x19, 0x02, 0x3b, 0x1c, 0x25, 0x3e, 0x07}, {0x20, 0x19, 0x02, 0x3b, 0x1c, 0x25, 0x3e, 0x07} }, { {0x18, 0x21, 0x3a, 0x03, 0x24, 0x1d, 0x06, 0x3f}, {0x18, 0x21, 0x3a, 0x03, 0x24, 0x1d, 0x06, 0x3f}, {0x18, 0x21, 0x3a, 0x03, 0x24, 0x1d, 0x06, 0x3f}, {0x18, 0x21, 0x3a, 0x03, 0x24, 0x1d, 0x06, 0x3f}, {0x18, 0x21, 0x3a, 0x03, 0x24, 0x1d, 0x06, 0x3f}, {0x18, 0x21, 0x3a, 0x03, 0x24, 0x1d, 0x06, 0x3f}, {0x18, 0x21, 0x3a, 0x03, 0x24, 0x0d, 0x06, 0x3f}, {0x18, 0x21, 0x2a, 0x03, 0x24, 0x0d, 0x06, 0x3f}, {0x18, 0x21, 0x2a, 0x03, 0x24, 0x0d, 0x06, 0x3f}, {0x18, 0x21, 0x2a, 0x03, 0x24, 0x0d, 0x06, 0x3f}, {0x08, 0x21, 0x2a, 0x03, 0x2c, 0x0d, 0x06, 0x3f}, {0x08, 0x21, 0x2a, 0x0b, 0x2c, 0x0d, 0x06, 0x2f}, {0x08, 0x21, 0x2a, 0x0b, 0x2c, 0x0d, 0x06, 0x2f}, {0x08, 0x21, 0x2a, 0x0b, 0x2c, 0x0d, 0x06, 0x2f}, {0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x0d, 0x0e, 0x2f}, {0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x0d, 0x0e, 0x2f}, {0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x0d, 0x0e, 0x2f}, {0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x0d, 0x0e, 0x2f}, {0x28, 0x29, 0x0a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f}, {0x28, 0x09, 0x0a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f}, {0x28, 0x09, 0x0a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f}, {0x28, 0x09, 0x0a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f}, {0x28, 0x09, 0x0a, 0x2b, 0x2c, 0x25, 0x2e, 0x0f}, {0x28, 0x09, 0x02, 0x2b, 0x0c, 0x25, 0x2e, 0x0f}, {0x28, 0x09, 0x02, 0x2b, 0x0c, 0x25, 0x2e, 0x0f}, {0x28, 0x09, 0x02, 0x2b, 0x0c, 0x25, 0x2e, 0x0f}, {0x20, 0x09, 0x02, 0x2b, 0x1c, 0x25, 0x2e, 0x0f}, {0x20, 0x09, 0x02, 0x3b, 0x1c, 0x25, 0x2e, 0x07}, {0x20, 0x09, 0x02, 0x3b, 0x1c, 0x25, 0x2e, 0x07}, {0x20, 0x09, 0x02, 0x3b, 0x1c, 0x25, 0x2e, 0x07}, {0x20, 0x19, 0x02, 0x3b, 0x1c, 0x25, 0x2e, 0x07}, {0x20, 0x19, 0x02, 0x3b, 0x1c, 0x25, 0x3e, 0x07}, {0x20, 0x19, 0x02, 0x3b, 0x1c, 0x25, 0x3e, 0x07}, {0x20, 0x19, 0x02, 0x3b, 0x1c, 0x25, 0x3e, 0x07}, {0x20, 0x19, 0x02, 0x3b, 0x1c, 0x25, 0x3e, 0x07}, {0x20, 0x19, 0x02, 0x3b, 0x1c, 0x25, 0x3e, 0x07} }, { {0x18, 0x21, 0x3a, 0x03, 0x24, 0x1d, 0x06, 0x3f}, {0x18, 0x21, 0x3a, 0x03, 0x24, 0x1d, 0x06, 0x3f}, {0x18, 0x21, 0x3a, 0x03, 0x24, 0x1d, 0x06, 0x3f}, {0x18, 0x21, 0x3a, 0x03, 0x24, 0x1d, 0x06, 0x3f}, {0x18, 0x21, 0x3a, 0x03, 0x24, 0x1d, 0x06, 0x3f}, {0x18, 0x21, 0x3a, 0x03, 0x24, 0x0d, 0x06, 0x3f}, {0x18, 0x21, 0x3a, 0x03, 0x24, 0x0d, 0x06, 0x3f}, {0x18, 0x21, 0x3a, 0x03, 0x24, 0x0d, 0x06, 0x3f}, {0x18, 0x21, 0x2a, 0x03, 0x24, 0x0d, 0x06, 0x3f}, {0x08, 0x21, 0x2a, 0x03, 0x2c, 0x0d, 0x06, 0x3f}, {0x08, 0x21, 0x2a, 0x03, 0x2c, 0x0d, 0x06, 0x3f}, {0x08, 0x21, 0x2a, 0x03, 0x2c, 0x0d, 0x06, 0x3f}, {0x08, 0x21, 0x2a, 0x0b, 0x2c, 0x0d, 0x06, 0x2f}, {0x08, 0x29, 0x2a, 0x2b, 0x2c, 0x0d, 0x06, 0x2f}, {0x08, 0x29, 0x2a, 0x2b, 0x2c, 0x0d, 0x06, 0x2f}, {0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x0d, 0x0e, 0x2f}, {0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x0d, 0x0e, 0x2f}, {0x28, 0x29, 0x0a, 0x2b, 0x2c, 0x0d, 0x2e, 0x2f}, {0x28, 0x29, 0x0a, 0x2b, 0x2c, 0x0d, 0x2e, 0x2f}, {0x28, 0x29, 0x0a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f}, {0x28, 0x09, 0x0a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f}, {0x28, 0x09, 0x0a, 0x2b, 0x2c, 0x25, 0x2e, 0x0f}, {0x28, 0x09, 0x0a, 0x2b, 0x2c, 0x25, 0x2e, 0x0f}, {0x28, 0x09, 0x0a, 0x2b, 0x2c, 0x25, 0x2e, 0x0f}, {0x28, 0x09, 0x02, 0x2b, 0x0c, 0x25, 0x2e, 0x0f}, {0x20, 0x09, 0x02, 0x2b, 0x1c, 0x25, 0x2e, 0x0f}, {0x20, 0x09, 0x02, 0x2b, 0x1c, 0x25, 0x2e, 0x0f}, {0x20, 0x09, 0x02, 0x2b, 0x1c, 0x25, 0x2e, 0x0f}, {0x20, 0x09, 0x02, 0x3b, 0x1c, 0x25, 0x2e, 0x07}, {0x20, 0x19, 0x02, 0x3b, 0x1c, 0x25, 0x2e, 0x07}, {0x20, 0x19, 0x02, 0x3b, 0x1c, 0x25, 0x2e, 0x07}, {0x20, 0x19, 0x02, 0x3b, 0x1c, 0x25, 0x2e, 0x07}, {0x20, 0x19, 0x02, 0x3b, 0x1c, 0x25, 0x3e, 0x07}, {0x20, 0x19, 0x02, 0x3b, 0x1c, 0x25, 0x3e, 0x07}, {0x20, 0x19, 0x02, 0x3b, 0x1c, 0x25, 0x3e, 0x07}, {0x20, 0x19, 0x02, 0x3b, 0x1c, 0x25, 0x3e, 0x07} }, { {0x18, 0x21, 0x3a, 0x03, 0x34, 0x15, 0x06, 0x3f}, {0x18, 0x21, 0x3a, 0x03, 0x34, 0x15, 0x06, 0x3f}, {0x18, 0x21, 0x3a, 0x03, 0x34, 0x15, 0x06, 0x3f}, {0x18, 0x21, 0x3a, 0x03, 0x34, 0x15, 0x06, 0x3f}, {0x18, 0x21, 0x3a, 0x03, 0x34, 0x15, 0x06, 0x3f}, {0x18, 0x21, 0x3a, 0x03, 0x34, 0x0d, 0x06, 0x3f}, {0x18, 0x21, 0x3a, 0x03, 0x34, 0x0d, 0x06, 0x3f}, {0x18, 0x21, 0x3a, 0x03, 0x34, 0x0d, 0x06, 0x3f}, {0x08, 0x21, 0x3a, 0x03, 0x34, 0x0d, 0x06, 0x3f}, {0x08, 0x21, 0x2a, 0x03, 0x2c, 0x0d, 0x06, 0x3f}, {0x08, 0x21, 0x2a, 0x03, 0x2c, 0x0d, 0x06, 0x3f}, {0x08, 0x21, 0x2a, 0x03, 0x2c, 0x0d, 0x06, 0x3f}, {0x08, 0x29, 0x2a, 0x23, 0x2c, 0x0d, 0x06, 0x3f}, {0x08, 0x29, 0x2a, 0x2b, 0x2c, 0x0d, 0x06, 0x2f}, {0x08, 0x29, 0x2a, 0x2b, 0x2c, 0x0d, 0x06, 0x2f}, {0x08, 0x29, 0x2a, 0x2b, 0x2c, 0x0d, 0x06, 0x2f}, {0x28, 0x29, 0x0a, 0x2b, 0x2c, 0x0d, 0x2e, 0x2f}, {0x28, 0x29, 0x0a, 0x2b, 0x2c, 0x0d, 0x2e, 0x2f}, {0x28, 0x29, 0x0a, 0x2b, 0x2c, 0x0d, 0x2e, 0x2f}, {0x28, 0x29, 0x0a, 0x2b, 0x2c, 0x0d, 0x2e, 0x2f}, {0x28, 0x29, 0x0a, 0x2b, 0x2c, 0x25, 0x2e, 0x0f}, {0x28, 0x09, 0x0a, 0x2b, 0x2c, 0x25, 0x2e, 0x0f}, {0x28, 0x09, 0x0a, 0x2b, 0x2c, 0x25, 0x2e, 0x0f}, {0x28, 0x09, 0x0a, 0x2b, 0x2c, 0x25, 0x2e, 0x0f}, {0x20, 0x09, 0x0a, 0x2b, 0x3c, 0x25, 0x2e, 0x0f}, {0x20, 0x09, 0x02, 0x2b, 0x1c, 0x25, 0x2e, 0x0f}, {0x20, 0x09, 0x02, 0x2b, 0x1c, 0x25, 0x2e, 0x0f}, {0x20, 0x09, 0x02, 0x2b, 0x1c, 0x25, 0x2e, 0x0f}, {0x20, 0x19, 0x02, 0x33, 0x1c, 0x25, 0x2e, 0x0f}, {0x20, 0x19, 0x02, 0x33, 0x1c, 0x25, 0x2e, 0x07}, {0x20, 0x19, 0x02, 0x33, 0x1c, 0x25, 0x2e, 0x07}, {0x20, 0x19, 0x02, 0x33, 0x1c, 0x25, 0x2e, 0x07}, {0x20, 0x19, 0x02, 0x33, 0x1c, 0x25, 0x36, 0x07}, {0x20, 0x19, 0x02, 0x33, 0x1c, 0x25, 0x36, 0x07}, {0x20, 0x19, 0x02, 0x33, 0x1c, 0x25, 0x36, 0x07}, {0x20, 0x19, 0x02, 0x33, 0x1c, 0x25, 0x36, 0x07} }, { {0x18, 0x21, 0x3a, 0x03, 0x34, 0x15, 0x06, 0x3f}, {0x18, 0x21, 0x3a, 0x03, 0x34, 0x15, 0x06, 0x3f}, {0x18, 0x21, 0x3a, 0x03, 0x34, 0x15, 0x06, 0x3f}, {0x18, 0x21, 0x3a, 0x03, 0x34, 0x15, 0x06, 0x3f}, {0x18, 0x21, 0x3a, 0x03, 0x34, 0x15, 0x06, 0x3f}, {0x18, 0x21, 0x3a, 0x03, 0x34, 0x15, 0x06, 0x3f}, {0x18, 0x21, 0x3a, 0x03, 0x34, 0x0d, 0x06, 0x3f}, {0x08, 0x21, 0x3a, 0x03, 0x34, 0x0d, 0x06, 0x3f}, {0x08, 0x21, 0x3a, 0x03, 0x34, 0x0d, 0x06, 0x3f}, {0x08, 0x21, 0x3a, 0x03, 0x34, 0x0d, 0x06, 0x3f}, {0x08, 0x21, 0x2a, 0x03, 0x2c, 0x0d, 0x06, 0x3f}, {0x08, 0x29, 0x2a, 0x23, 0x2c, 0x0d, 0x06, 0x3f}, {0x08, 0x29, 0x2a, 0x23, 0x2c, 0x0d, 0x06, 0x3f}, {0x08, 0x29, 0x2a, 0x23, 0x2c, 0x0d, 0x06, 0x3f}, {0x08, 0x29, 0x2a, 0x2b, 0x2c, 0x0d, 0x06, 0x2f}, {0x08, 0x29, 0x0a, 0x2b, 0x2c, 0x0d, 0x26, 0x2f}, {0x08, 0x29, 0x0a, 0x2b, 0x2c, 0x0d, 0x26, 0x2f}, {0x28, 0x29, 0x0a, 0x2b, 0x2c, 0x0d, 0x2e, 0x2f}, {0x28, 0x29, 0x0a, 0x2b, 0x2c, 0x0d, 0x2e, 0x2f}, {0x28, 0x29, 0x0a, 0x2b, 0x2c, 0x05, 0x2e, 0x0f}, {0x28, 0x29, 0x0a, 0x2b, 0x2c, 0x05, 0x2e, 0x0f}, {0x28, 0x29, 0x0a, 0x2b, 0x2c, 0x25, 0x2e, 0x0f}, {0x28, 0x09, 0x0a, 0x2b, 0x2c, 0x25, 0x2e, 0x0f}, {0x20, 0x09, 0x0a, 0x2b, 0x3c, 0x25, 0x2e, 0x0f}, {0x20, 0x09, 0x0a, 0x2b, 0x3c, 0x25, 0x2e, 0x0f}, {0x20, 0x09, 0x0a, 0x2b, 0x3c, 0x25, 0x2e, 0x0f}, {0x20, 0x09, 0x02, 0x2b, 0x1c, 0x25, 0x2e, 0x0f}, {0x20, 0x19, 0x02, 0x33, 0x1c, 0x25, 0x2e, 0x0f}, {0x20, 0x19, 0x02, 0x33, 0x1c, 0x25, 0x2e, 0x0f}, {0x20, 0x19, 0x02, 0x33, 0x1c, 0x25, 0x2e, 0x0f}, {0x20, 0x19, 0x02, 0x33, 0x1c, 0x25, 0x2e, 0x07}, {0x20, 0x19, 0x02, 0x33, 0x1c, 0x25, 0x36, 0x07}, {0x20, 0x19, 0x02, 0x33, 0x1c, 0x25, 0x36, 0x07}, {0x20, 0x19, 0x02, 0x33, 0x1c, 0x25, 0x36, 0x07}, {0x20, 0x19, 0x02, 0x33, 0x1c, 0x25, 0x36, 0x07}, {0x20, 0x19, 0x02, 0x33, 0x1c, 0x25, 0x36, 0x07} }, { {0x18, 0x21, 0x3a, 0x03, 0x34, 0x15, 0x06, 0x3f}, {0x18, 0x21, 0x3a, 0x03, 0x34, 0x15, 0x06, 0x3f}, {0x18, 0x21, 0x3a, 0x03, 0x34, 0x15, 0x06, 0x3f}, {0x18, 0x21, 0x3a, 0x03, 0x34, 0x15, 0x06, 0x3f}, {0x18, 0x21, 0x3a, 0x03, 0x34, 0x15, 0x06, 0x3f}, {0x18, 0x21, 0x3a, 0x03, 0x34, 0x15, 0x06, 0x3f}, {0x08, 0x21, 0x3a, 0x03, 0x34, 0x15, 0x06, 0x3f}, {0x08, 0x21, 0x3a, 0x03, 0x34, 0x0d, 0x06, 0x3f}, {0x08, 0x21, 0x3a, 0x03, 0x34, 0x0d, 0x06, 0x3f}, {0x08, 0x21, 0x3a, 0x03, 0x34, 0x0d, 0x06, 0x3f}, {0x08, 0x29, 0x3a, 0x23, 0x34, 0x0d, 0x06, 0x3f}, {0x08, 0x29, 0x2a, 0x23, 0x2c, 0x0d, 0x06, 0x3f}, {0x08, 0x29, 0x2a, 0x23, 0x2c, 0x0d, 0x06, 0x3f}, {0x08, 0x29, 0x2a, 0x23, 0x2c, 0x0d, 0x06, 0x3f}, {0x08, 0x29, 0x0a, 0x2b, 0x2c, 0x0d, 0x26, 0x2f}, {0x08, 0x29, 0x0a, 0x2b, 0x2c, 0x0d, 0x26, 0x2f}, {0x08, 0x29, 0x0a, 0x2b, 0x2c, 0x0d, 0x26, 0x2f}, {0x08, 0x29, 0x0a, 0x2b, 0x2c, 0x0d, 0x26, 0x2f}, {0x28, 0x29, 0x0a, 0x2b, 0x2c, 0x05, 0x2e, 0x0f}, {0x28, 0x29, 0x0a, 0x2b, 0x2c, 0x05, 0x2e, 0x0f}, {0x28, 0x29, 0x0a, 0x2b, 0x2c, 0x05, 0x2e, 0x0f}, {0x28, 0x29, 0x0a, 0x2b, 0x2c, 0x05, 0x2e, 0x0f}, {0x20, 0x29, 0x0a, 0x2b, 0x3c, 0x25, 0x2e, 0x0f}, {0x20, 0x09, 0x0a, 0x2b, 0x3c, 0x25, 0x2e, 0x0f}, {0x20, 0x09, 0x0a, 0x2b, 0x3c, 0x25, 0x2e, 0x0f}, {0x20, 0x09, 0x0a, 0x2b, 0x3c, 0x25, 0x2e, 0x0f}, {0x20, 0x19, 0x0a, 0x33, 0x3c, 0x25, 0x2e, 0x0f}, {0x20, 0x19, 0x02, 0x33, 0x1c, 0x25, 0x2e, 0x0f}, {0x20, 0x19, 0x02, 0x33, 0x1c, 0x25, 0x2e, 0x0f}, {0x20, 0x19, 0x02, 0x33, 0x1c, 0x25, 0x2e, 0x0f}, {0x20, 0x19, 0x02, 0x33, 0x1c, 0x25, 0x36, 0x0f}, {0x20, 0x19, 0x02, 0x33, 0x1c, 0x25, 0x36, 0x07}, {0x20, 0x19, 0x02, 0x33, 0x1c, 0x25, 0x36, 0x07}, {0x20, 0x19, 0x02, 0x33, 0x1c, 0x25, 0x36, 0x07}, {0x20, 0x19, 0x02, 0x33, 0x1c, 0x25, 0x36, 0x07}, {0x20, 0x19, 0x02, 0x33, 0x1c, 0x25, 0x36, 0x07} }, { {0x18, 0x21, 0x3a, 0x03, 0x34, 0x15, 0x06, 0x3f}, {0x18, 0x21, 0x3a, 0x03, 0x34, 0x15, 0x06, 0x3f}, {0x18, 0x21, 0x3a, 0x03, 0x34, 0x15, 0x06, 0x3f}, {0x18, 0x21, 0x3a, 0x03, 0x34, 0x15, 0x06, 0x3f}, {0x18, 0x21, 0x3a, 0x03, 0x34, 0x15, 0x06, 0x3f}, {0x08, 0x21, 0x3a, 0x03, 0x34, 0x15, 0x06, 0x3f}, {0x08, 0x21, 0x3a, 0x03, 0x34, 0x15, 0x06, 0x3f}, {0x08, 0x21, 0x3a, 0x03, 0x34, 0x15, 0x06, 0x3f}, {0x08, 0x21, 0x3a, 0x03, 0x34, 0x0d, 0x06, 0x3f}, {0x08, 0x29, 0x3a, 0x23, 0x34, 0x0d, 0x06, 0x3f}, {0x08, 0x29, 0x3a, 0x23, 0x34, 0x0d, 0x06, 0x3f}, {0x08, 0x29, 0x3a, 0x23, 0x34, 0x0d, 0x06, 0x3f}, {0x08, 0x29, 0x2a, 0x23, 0x2c, 0x0d, 0x06, 0x3f}, {0x08, 0x29, 0x0a, 0x23, 0x2c, 0x0d, 0x26, 0x3f}, {0x08, 0x29, 0x0a, 0x23, 0x2c, 0x0d, 0x26, 0x3f}, {0x08, 0x29, 0x0a, 0x2b, 0x2c, 0x0d, 0x26, 0x2f}, {0x08, 0x29, 0x0a, 0x2b, 0x2c, 0x0d, 0x26, 0x2f}, {0x08, 0x29, 0x0a, 0x2b, 0x2c, 0x05, 0x26, 0x0f}, {0x08, 0x29, 0x0a, 0x2b, 0x2c, 0x05, 0x26, 0x0f}, {0x28, 0x29, 0x0a, 0x2b, 0x2c, 0x05, 0x2e, 0x0f}, {0x28, 0x29, 0x0a, 0x2b, 0x2c, 0x05, 0x2e, 0x0f}, {0x20, 0x29, 0x0a, 0x2b, 0x3c, 0x05, 0x2e, 0x0f}, {0x20, 0x29, 0x0a, 0x2b, 0x3c, 0x05, 0x2e, 0x0f}, {0x20, 0x29, 0x0a, 0x2b, 0x3c, 0x25, 0x2e, 0x0f}, {0x20, 0x09, 0x0a, 0x2b, 0x3c, 0x25, 0x2e, 0x0f}, {0x20, 0x19, 0x0a, 0x33, 0x3c, 0x25, 0x2e, 0x0f}, {0x20, 0x19, 0x0a, 0x33, 0x3c, 0x25, 0x2e, 0x0f}, {0x20, 0x19, 0x0a, 0x33, 0x3c, 0x25, 0x2e, 0x0f}, {0x20, 0x19, 0x02, 0x33, 0x1c, 0x25, 0x2e, 0x0f}, {0x20, 0x19, 0x02, 0x33, 0x1c, 0x25, 0x36, 0x0f}, {0x20, 0x19, 0x02, 0x33, 0x1c, 0x25, 0x36, 0x0f}, {0x20, 0x19, 0x02, 0x33, 0x1c, 0x25, 0x36, 0x0f}, {0x20, 0x19, 0x02, 0x33, 0x1c, 0x25, 0x36, 0x07}, {0x20, 0x19, 0x02, 0x33, 0x1c, 0x25, 0x36, 0x07}, {0x20, 0x19, 0x02, 0x33, 0x1c, 0x25, 0x36, 0x07}, {0x20, 0x19, 0x02, 0x33, 0x1c, 0x25, 0x36, 0x07} }, { {0x10, 0x31, 0x3a, 0x03, 0x34, 0x15, 0x06, 0x3f}, {0x10, 0x31, 0x3a, 0x03, 0x34, 0x15, 0x06, 0x3f}, {0x10, 0x31, 0x3a, 0x03, 0x34, 0x15, 0x06, 0x3f}, {0x10, 0x31, 0x3a, 0x03, 0x34, 0x15, 0x06, 0x3f}, {0x10, 0x31, 0x3a, 0x03, 0x34, 0x15, 0x06, 0x3f}, {0x08, 0x31, 0x3a, 0x03, 0x34, 0x15, 0x06, 0x3f}, {0x08, 0x31, 0x3a, 0x03, 0x34, 0x15, 0x06, 0x3f}, {0x08, 0x31, 0x3a, 0x03, 0x34, 0x15, 0x06, 0x3f}, {0x08, 0x31, 0x3a, 0x23, 0x34, 0x15, 0x06, 0x3f}, {0x08, 0x29, 0x3a, 0x23, 0x34, 0x0d, 0x06, 0x3f}, {0x08, 0x29, 0x3a, 0x23, 0x34, 0x0d, 0x06, 0x3f}, {0x08, 0x29, 0x3a, 0x23, 0x34, 0x0d, 0x06, 0x3f}, {0x08, 0x29, 0x1a, 0x23, 0x34, 0x0d, 0x26, 0x3f}, {0x08, 0x29, 0x0a, 0x23, 0x2c, 0x0d, 0x26, 0x3f}, {0x08, 0x29, 0x0a, 0x23, 0x2c, 0x0d, 0x26, 0x3f}, {0x08, 0x29, 0x0a, 0x23, 0x2c, 0x0d, 0x26, 0x3f}, {0x08, 0x29, 0x0a, 0x2b, 0x2c, 0x05, 0x26, 0x0f}, {0x08, 0x29, 0x0a, 0x2b, 0x2c, 0x05, 0x26, 0x0f}, {0x08, 0x29, 0x0a, 0x2b, 0x2c, 0x05, 0x26, 0x0f}, {0x08, 0x29, 0x0a, 0x2b, 0x2c, 0x05, 0x26, 0x0f}, {0x20, 0x29, 0x0a, 0x2b, 0x3c, 0x05, 0x2e, 0x0f}, {0x20, 0x29, 0x0a, 0x2b, 0x3c, 0x05, 0x2e, 0x0f}, {0x20, 0x29, 0x0a, 0x2b, 0x3c, 0x05, 0x2e, 0x0f}, {0x20, 0x29, 0x0a, 0x2b, 0x3c, 0x05, 0x2e, 0x0f}, {0x20, 0x39, 0x0a, 0x33, 0x3c, 0x25, 0x2e, 0x0f}, {0x20, 0x19, 0x0a, 0x33, 0x3c, 0x25, 0x2e, 0x0f}, {0x20, 0x19, 0x0a, 0x33, 0x3c, 0x25, 0x2e, 0x0f}, {0x20, 0x19, 0x0a, 0x33, 0x3c, 0x25, 0x2e, 0x0f}, {0x20, 0x19, 0x12, 0x33, 0x3c, 0x25, 0x36, 0x0f}, {0x20, 0x19, 0x12, 0x33, 0x1c, 0x25, 0x36, 0x0f}, {0x20, 0x19, 0x12, 0x33, 0x1c, 0x25, 0x36, 0x0f}, {0x20, 0x19, 0x12, 0x33, 0x1c, 0x25, 0x36, 0x0f}, {0x20, 0x19, 0x12, 0x33, 0x1c, 0x25, 0x36, 0x17}, {0x20, 0x19, 0x12, 0x33, 0x1c, 0x25, 0x36, 0x17}, {0x20, 0x19, 0x12, 0x33, 0x1c, 0x25, 0x36, 0x17}, {0x20, 0x19, 0x12, 0x33, 0x1c, 0x25, 0x36, 0x17} }, { {0x10, 0x31, 0x3a, 0x03, 0x34, 0x15, 0x06, 0x3f}, {0x10, 0x31, 0x3a, 0x03, 0x34, 0x15, 0x06, 0x3f}, {0x10, 0x31, 0x3a, 0x03, 0x34, 0x15, 0x06, 0x3f}, {0x10, 0x31, 0x3a, 0x03, 0x34, 0x15, 0x06, 0x3f}, {0x10, 0x31, 0x3a, 0x03, 0x34, 0x15, 0x06, 0x3f}, {0x10, 0x31, 0x3a, 0x03, 0x34, 0x15, 0x06, 0x3f}, {0x08, 0x31, 0x3a, 0x03, 0x34, 0x15, 0x06, 0x3f}, {0x08, 0x31, 0x3a, 0x23, 0x34, 0x15, 0x06, 0x3f}, {0x08, 0x31, 0x3a, 0x23, 0x34, 0x15, 0x06, 0x3f}, {0x08, 0x31, 0x3a, 0x23, 0x34, 0x15, 0x06, 0x3f}, {0x08, 0x29, 0x3a, 0x23, 0x34, 0x0d, 0x06, 0x3f}, {0x08, 0x29, 0x1a, 0x23, 0x34, 0x0d, 0x26, 0x3f}, {0x08, 0x29, 0x1a, 0x23, 0x34, 0x0d, 0x26, 0x3f}, {0x08, 0x29, 0x1a, 0x23, 0x34, 0x0d, 0x26, 0x3f}, {0x08, 0x29, 0x0a, 0x23, 0x2c, 0x0d, 0x26, 0x3f}, {0x08, 0x29, 0x0a, 0x23, 0x2c, 0x05, 0x26, 0x1f}, {0x08, 0x29, 0x0a, 0x23, 0x2c, 0x05, 0x26, 0x1f}, {0x08, 0x29, 0x0a, 0x2b, 0x2c, 0x05, 0x26, 0x0f}, {0x08, 0x29, 0x0a, 0x2b, 0x2c, 0x05, 0x26, 0x0f}, {0x00, 0x29, 0x0a, 0x2b, 0x3c, 0x05, 0x26, 0x0f}, {0x00, 0x29, 0x0a, 0x2b, 0x3c, 0x05, 0x26, 0x0f}, {0x20, 0x29, 0x0a, 0x2b, 0x3c, 0x05, 0x2e, 0x0f}, {0x20, 0x29, 0x0a, 0x2b, 0x3c, 0x05, 0x2e, 0x0f}, {0x20, 0x39, 0x0a, 0x33, 0x3c, 0x05, 0x2e, 0x0f}, {0x20, 0x39, 0x0a, 0x33, 0x3c, 0x05, 0x2e, 0x0f}, {0x20, 0x39, 0x0a, 0x33, 0x3c, 0x25, 0x2e, 0x0f}, {0x20, 0x19, 0x0a, 0x33, 0x3c, 0x25, 0x2e, 0x0f}, {0x20, 0x19, 0x12, 0x33, 0x3c, 0x25, 0x36, 0x0f}, {0x20, 0x19, 0x12, 0x33, 0x3c, 0x25, 0x36, 0x0f}, {0x20, 0x19, 0x12, 0x33, 0x3c, 0x25, 0x36, 0x0f}, {0x20, 0x19, 0x12, 0x33, 0x1c, 0x25, 0x36, 0x0f}, {0x20, 0x19, 0x12, 0x33, 0x1c, 0x25, 0x36, 0x17}, {0x20, 0x19, 0x12, 0x33, 0x1c, 0x25, 0x36, 0x17}, {0x20, 0x19, 0x12, 0x33, 0x1c, 0x25, 0x36, 0x17}, {0x20, 0x19, 0x12, 0x33, 0x1c, 0x25, 0x36, 0x17}, {0x20, 0x19, 0x12, 0x33, 0x1c, 0x25, 0x36, 0x17} }, { {0x10, 0x31, 0x3a, 0x03, 0x34, 0x15, 0x06, 0x3f}, {0x10, 0x31, 0x3a, 0x03, 0x34, 0x15, 0x06, 0x3f}, {0x10, 0x31, 0x3a, 0x03, 0x34, 0x15, 0x06, 0x3f}, {0x10, 0x31, 0x3a, 0x03, 0x34, 0x15, 0x06, 0x3f}, {0x10, 0x31, 0x3a, 0x03, 0x34, 0x15, 0x06, 0x3f}, {0x10, 0x31, 0x3a, 0x03, 0x34, 0x15, 0x06, 0x3f}, {0x10, 0x31, 0x3a, 0x23, 0x34, 0x15, 0x06, 0x3f}, {0x08, 0x31, 0x3a, 0x23, 0x34, 0x15, 0x06, 0x3f}, {0x08, 0x31, 0x3a, 0x23, 0x34, 0x15, 0x06, 0x3f}, {0x08, 0x31, 0x3a, 0x23, 0x34, 0x15, 0x06, 0x3f}, {0x08, 0x31, 0x1a, 0x23, 0x34, 0x15, 0x26, 0x3f}, {0x08, 0x29, 0x1a, 0x23, 0x34, 0x0d, 0x26, 0x3f}, {0x08, 0x29, 0x1a, 0x23, 0x34, 0x0d, 0x26, 0x3f}, {0x08, 0x29, 0x1a, 0x23, 0x34, 0x0d, 0x26, 0x3f}, {0x08, 0x29, 0x0a, 0x23, 0x2c, 0x05, 0x26, 0x1f}, {0x08, 0x29, 0x0a, 0x23, 0x2c, 0x05, 0x26, 0x1f}, {0x08, 0x29, 0x0a, 0x23, 0x2c, 0x05, 0x26, 0x1f}, {0x08, 0x29, 0x0a, 0x23, 0x2c, 0x05, 0x26, 0x1f}, {0x00, 0x29, 0x0a, 0x2b, 0x3c, 0x05, 0x26, 0x0f}, {0x00, 0x29, 0x0a, 0x2b, 0x3c, 0x05, 0x26, 0x0f}, {0x00, 0x29, 0x0a, 0x2b, 0x3c, 0x05, 0x26, 0x0f}, {0x00, 0x29, 0x0a, 0x2b, 0x3c, 0x05, 0x26, 0x0f}, {0x20, 0x39, 0x0a, 0x33, 0x3c, 0x05, 0x2e, 0x0f}, {0x20, 0x39, 0x0a, 0x33, 0x3c, 0x05, 0x2e, 0x0f}, {0x20, 0x39, 0x0a, 0x33, 0x3c, 0x05, 0x2e, 0x0f}, {0x20, 0x39, 0x0a, 0x33, 0x3c, 0x05, 0x2e, 0x0f}, {0x20, 0x39, 0x12, 0x33, 0x3c, 0x25, 0x36, 0x0f}, {0x20, 0x19, 0x12, 0x33, 0x3c, 0x25, 0x36, 0x0f}, {0x20, 0x19, 0x12, 0x33, 0x3c, 0x25, 0x36, 0x0f}, {0x20, 0x19, 0x12, 0x33, 0x3c, 0x25, 0x36, 0x0f}, {0x20, 0x19, 0x12, 0x33, 0x3c, 0x25, 0x36, 0x17}, {0x20, 0x19, 0x12, 0x33, 0x1c, 0x25, 0x36, 0x17}, {0x20, 0x19, 0x12, 0x33, 0x1c, 0x25, 0x36, 0x17}, {0x20, 0x19, 0x12, 0x33, 0x1c, 0x25, 0x36, 0x17}, {0x20, 0x19, 0x12, 0x33, 0x1c, 0x25, 0x36, 0x17}, {0x20, 0x19, 0x12, 0x33, 0x1c, 0x25, 0x36, 0x17} }, { {0x10, 0x31, 0x3a, 0x03, 0x34, 0x15, 0x06, 0x3f}, {0x10, 0x31, 0x3a, 0x03, 0x34, 0x15, 0x06, 0x3f}, {0x10, 0x31, 0x3a, 0x03, 0x34, 0x15, 0x06, 0x3f}, {0x10, 0x31, 0x3a, 0x03, 0x34, 0x15, 0x06, 0x3f}, {0x10, 0x31, 0x3a, 0x03, 0x34, 0x15, 0x06, 0x3f}, {0x10, 0x31, 0x3a, 0x23, 0x34, 0x15, 0x06, 0x3f}, {0x10, 0x31, 0x3a, 0x23, 0x34, 0x15, 0x06, 0x3f}, {0x10, 0x31, 0x3a, 0x23, 0x34, 0x15, 0x06, 0x3f}, {0x08, 0x31, 0x3a, 0x23, 0x34, 0x15, 0x06, 0x3f}, {0x08, 0x31, 0x1a, 0x23, 0x34, 0x15, 0x26, 0x3f}, {0x08, 0x31, 0x1a, 0x23, 0x34, 0x15, 0x26, 0x3f}, {0x08, 0x31, 0x1a, 0x23, 0x34, 0x15, 0x26, 0x3f}, {0x08, 0x29, 0x1a, 0x23, 0x34, 0x0d, 0x26, 0x3f}, {0x08, 0x29, 0x1a, 0x23, 0x34, 0x05, 0x26, 0x1f}, {0x08, 0x29, 0x1a, 0x23, 0x34, 0x05, 0x26, 0x1f}, {0x08, 0x29, 0x0a, 0x23, 0x2c, 0x05, 0x26, 0x1f}, {0x08, 0x29, 0x0a, 0x23, 0x2c, 0x05, 0x26, 0x1f}, {0x00, 0x29, 0x0a, 0x23, 0x3c, 0x05, 0x26, 0x1f}, {0x00, 0x29, 0x0a, 0x23, 0x3c, 0x05, 0x26, 0x1f}, {0x00, 0x29, 0x0a, 0x2b, 0x3c, 0x05, 0x26, 0x0f}, {0x00, 0x29, 0x0a, 0x2b, 0x3c, 0x05, 0x26, 0x0f}, {0x00, 0x39, 0x0a, 0x33, 0x3c, 0x05, 0x26, 0x0f}, {0x00, 0x39, 0x0a, 0x33, 0x3c, 0x05, 0x26, 0x0f}, {0x20, 0x39, 0x0a, 0x33, 0x3c, 0x05, 0x2e, 0x0f}, {0x20, 0x39, 0x0a, 0x33, 0x3c, 0x05, 0x2e, 0x0f}, {0x20, 0x39, 0x12, 0x33, 0x3c, 0x05, 0x36, 0x0f}, {0x20, 0x39, 0x12, 0x33, 0x3c, 0x05, 0x36, 0x0f}, {0x20, 0x39, 0x12, 0x33, 0x3c, 0x25, 0x36, 0x0f}, {0x20, 0x19, 0x12, 0x33, 0x3c, 0x25, 0x36, 0x0f}, {0x20, 0x19, 0x12, 0x33, 0x3c, 0x25, 0x36, 0x17}, {0x20, 0x19, 0x12, 0x33, 0x3c, 0x25, 0x36, 0x17}, {0x20, 0x19, 0x12, 0x33, 0x3c, 0x25, 0x36, 0x17}, {0x20, 0x19, 0x12, 0x33, 0x1c, 0x25, 0x36, 0x17}, {0x20, 0x19, 0x12, 0x33, 0x1c, 0x25, 0x36, 0x17}, {0x20, 0x19, 0x12, 0x33, 0x1c, 0x25, 0x36, 0x17}, {0x20, 0x19, 0x12, 0x33, 0x1c, 0x25, 0x36, 0x17} }, { {0x10, 0x31, 0x3a, 0x03, 0x34, 0x15, 0x06, 0x3f}, {0x10, 0x31, 0x3a, 0x03, 0x34, 0x15, 0x06, 0x3f}, {0x10, 0x31, 0x3a, 0x03, 0x34, 0x15, 0x06, 0x3f}, {0x10, 0x31, 0x3a, 0x03, 0x34, 0x15, 0x06, 0x3f}, {0x10, 0x31, 0x3a, 0x23, 0x34, 0x15, 0x06, 0x3f}, {0x10, 0x31, 0x3a, 0x23, 0x34, 0x15, 0x06, 0x3f}, {0x10, 0x31, 0x3a, 0x23, 0x34, 0x15, 0x06, 0x3f}, {0x10, 0x31, 0x3a, 0x23, 0x34, 0x15, 0x06, 0x3f}, {0x10, 0x31, 0x1a, 0x23, 0x34, 0x15, 0x26, 0x3f}, {0x08, 0x31, 0x1a, 0x23, 0x34, 0x15, 0x26, 0x3f}, {0x08, 0x31, 0x1a, 0x23, 0x34, 0x15, 0x26, 0x3f}, {0x08, 0x31, 0x1a, 0x23, 0x34, 0x15, 0x26, 0x3f}, {0x08, 0x31, 0x1a, 0x23, 0x34, 0x05, 0x26, 0x1f}, {0x08, 0x29, 0x1a, 0x23, 0x34, 0x05, 0x26, 0x1f}, {0x08, 0x29, 0x1a, 0x23, 0x34, 0x05, 0x26, 0x1f}, {0x08, 0x29, 0x1a, 0x23, 0x34, 0x05, 0x26, 0x1f}, {0x00, 0x29, 0x0a, 0x23, 0x3c, 0x05, 0x26, 0x1f}, {0x00, 0x29, 0x0a, 0x23, 0x3c, 0x05, 0x26, 0x1f}, {0x00, 0x29, 0x0a, 0x23, 0x3c, 0x05, 0x26, 0x1f}, {0x00, 0x29, 0x0a, 0x23, 0x3c, 0x05, 0x26, 0x1f}, {0x00, 0x39, 0x0a, 0x33, 0x3c, 0x05, 0x26, 0x0f}, {0x00, 0x39, 0x0a, 0x33, 0x3c, 0x05, 0x26, 0x0f}, {0x00, 0x39, 0x0a, 0x33, 0x3c, 0x05, 0x26, 0x0f}, {0x00, 0x39, 0x0a, 0x33, 0x3c, 0x05, 0x26, 0x0f}, {0x20, 0x39, 0x12, 0x33, 0x3c, 0x05, 0x36, 0x0f}, {0x20, 0x39, 0x12, 0x33, 0x3c, 0x05, 0x36, 0x0f}, {0x20, 0x39, 0x12, 0x33, 0x3c, 0x05, 0x36, 0x0f}, {0x20, 0x39, 0x12, 0x33, 0x3c, 0x05, 0x36, 0x0f}, {0x20, 0x39, 0x12, 0x33, 0x3c, 0x25, 0x36, 0x17}, {0x20, 0x19, 0x12, 0x33, 0x3c, 0x25, 0x36, 0x17}, {0x20, 0x19, 0x12, 0x33, 0x3c, 0x25, 0x36, 0x17}, {0x20, 0x19, 0x12, 0x33, 0x3c, 0x25, 0x36, 0x17}, {0x20, 0x19, 0x12, 0x33, 0x3c, 0x25, 0x36, 0x17}, {0x20, 0x19, 0x12, 0x33, 0x1c, 0x25, 0x36, 0x17}, {0x20, 0x19, 0x12, 0x33, 0x1c, 0x25, 0x36, 0x17}, {0x20, 0x19, 0x12, 0x33, 0x1c, 0x25, 0x36, 0x17} }, { {0x10, 0x31, 0x3a, 0x03, 0x34, 0x15, 0x06, 0x3f}, {0x10, 0x31, 0x3a, 0x03, 0x34, 0x15, 0x06, 0x3f}, {0x10, 0x31, 0x3a, 0x03, 0x34, 0x15, 0x06, 0x3f}, {0x10, 0x31, 0x3a, 0x23, 0x34, 0x15, 0x06, 0x3f}, {0x10, 0x31, 0x3a, 0x23, 0x34, 0x15, 0x06, 0x3f}, {0x10, 0x31, 0x3a, 0x23, 0x34, 0x15, 0x06, 0x3f}, {0x10, 0x31, 0x3a, 0x23, 0x34, 0x15, 0x06, 0x3f}, {0x10, 0x31, 0x1a, 0x23, 0x34, 0x15, 0x26, 0x3f}, {0x10, 0x31, 0x1a, 0x23, 0x34, 0x15, 0x26, 0x3f}, {0x10, 0x31, 0x1a, 0x23, 0x34, 0x15, 0x26, 0x3f}, {0x08, 0x31, 0x1a, 0x23, 0x34, 0x15, 0x26, 0x3f}, {0x08, 0x31, 0x1a, 0x23, 0x34, 0x15, 0x26, 0x1f}, {0x08, 0x31, 0x1a, 0x23, 0x34, 0x05, 0x26, 0x1f}, {0x08, 0x31, 0x1a, 0x23, 0x34, 0x05, 0x26, 0x1f}, {0x08, 0x29, 0x1a, 0x23, 0x34, 0x05, 0x26, 0x1f}, {0x00, 0x29, 0x1a, 0x23, 0x34, 0x05, 0x26, 0x1f}, {0x00, 0x29, 0x1a, 0x23, 0x3c, 0x05, 0x26, 0x1f}, {0x00, 0x29, 0x0a, 0x23, 0x3c, 0x05, 0x26, 0x1f}, {0x00, 0x29, 0x0a, 0x23, 0x3c, 0x05, 0x26, 0x1f}, {0x00, 0x39, 0x0a, 0x23, 0x3c, 0x05, 0x26, 0x1f}, {0x00, 0x39, 0x0a, 0x33, 0x3c, 0x05, 0x26, 0x1f}, {0x00, 0x39, 0x0a, 0x33, 0x3c, 0x05, 0x26, 0x0f}, {0x00, 0x39, 0x0a, 0x33, 0x3c, 0x05, 0x26, 0x0f}, {0x00, 0x39, 0x12, 0x33, 0x3c, 0x05, 0x26, 0x0f}, {0x00, 0x39, 0x12, 0x33, 0x3c, 0x05, 0x36, 0x0f}, {0x20, 0x39, 0x12, 0x33, 0x3c, 0x05, 0x36, 0x0f}, {0x20, 0x39, 0x12, 0x33, 0x3c, 0x05, 0x36, 0x0f}, {0x20, 0x39, 0x12, 0x33, 0x3c, 0x05, 0x36, 0x17}, {0x20, 0x39, 0x12, 0x33, 0x3c, 0x05, 0x36, 0x17}, {0x20, 0x39, 0x12, 0x33, 0x3c, 0x25, 0x36, 0x17}, {0x20, 0x19, 0x12, 0x33, 0x3c, 0x25, 0x36, 0x17}, {0x20, 0x19, 0x12, 0x33, 0x3c, 0x25, 0x36, 0x17}, {0x20, 0x19, 0x12, 0x33, 0x3c, 0x25, 0x36, 0x17}, {0x20, 0x19, 0x12, 0x33, 0x3c, 0x25, 0x36, 0x17}, {0x20, 0x19, 0x12, 0x33, 0x1c, 0x25, 0x36, 0x17}, {0x20, 0x19, 0x12, 0x33, 0x1c, 0x25, 0x36, 0x17} }, { {0x10, 0x31, 0x3a, 0x03, 0x34, 0x15, 0x06, 0x3f}, {0x10, 0x31, 0x3a, 0x03, 0x34, 0x15, 0x06, 0x3f}, {0x10, 0x31, 0x3a, 0x23, 0x34, 0x15, 0x06, 0x3f}, {0x10, 0x31, 0x3a, 0x23, 0x34, 0x15, 0x06, 0x3f}, {0x10, 0x31, 0x3a, 0x23, 0x34, 0x15, 0x06, 0x3f}, {0x10, 0x31, 0x3a, 0x23, 0x34, 0x15, 0x06, 0x3f}, {0x10, 0x31, 0x1a, 0x23, 0x34, 0x15, 0x26, 0x3f}, {0x10, 0x31, 0x1a, 0x23, 0x34, 0x15, 0x26, 0x3f}, {0x10, 0x31, 0x1a, 0x23, 0x34, 0x15, 0x26, 0x3f}, {0x10, 0x31, 0x1a, 0x23, 0x34, 0x15, 0x26, 0x3f}, {0x10, 0x31, 0x1a, 0x23, 0x34, 0x15, 0x26, 0x1f}, {0x08, 0x31, 0x1a, 0x23, 0x34, 0x15, 0x26, 0x1f}, {0x08, 0x31, 0x1a, 0x23, 0x34, 0x05, 0x26, 0x1f}, {0x08, 0x31, 0x1a, 0x23, 0x34, 0x05, 0x26, 0x1f}, {0x00, 0x29, 0x1a, 0x23, 0x34, 0x05, 0x26, 0x1f}, {0x00, 0x29, 0x1a, 0x23, 0x34, 0x05, 0x26, 0x1f}, {0x00, 0x29, 0x1a, 0x23, 0x3c, 0x05, 0x26, 0x1f}, {0x00, 0x29, 0x1a, 0x23, 0x3c, 0x05, 0x26, 0x1f}, {0x00, 0x39, 0x0a, 0x23, 0x3c, 0x05, 0x26, 0x1f}, {0x00, 0x39, 0x0a, 0x23, 0x3c, 0x05, 0x26, 0x1f}, {0x00, 0x39, 0x0a, 0x33, 0x3c, 0x05, 0x26, 0x1f}, {0x00, 0x39, 0x0a, 0x33, 0x3c, 0x05, 0x26, 0x1f}, {0x00, 0x39, 0x12, 0x33, 0x3c, 0x05, 0x26, 0x1f}, {0x00, 0x39, 0x12, 0x33, 0x3c, 0x05, 0x26, 0x0f}, {0x00, 0x39, 0x12, 0x33, 0x3c, 0x05, 0x36, 0x0f}, {0x00, 0x39, 0x12, 0x33, 0x3c, 0x05, 0x36, 0x0f}, {0x20, 0x39, 0x12, 0x33, 0x3c, 0x05, 0x36, 0x17}, {0x20, 0x39, 0x12, 0x33, 0x3c, 0x05, 0x36, 0x17}, {0x20, 0x39, 0x12, 0x33, 0x3c, 0x05, 0x36, 0x17}, {0x20, 0x39, 0x12, 0x33, 0x3c, 0x05, 0x36, 0x17}, {0x20, 0x39, 0x12, 0x33, 0x3c, 0x25, 0x36, 0x17}, {0x20, 0x19, 0x12, 0x33, 0x3c, 0x25, 0x36, 0x17}, {0x20, 0x19, 0x12, 0x33, 0x3c, 0x25, 0x36, 0x17}, {0x20, 0x19, 0x12, 0x33, 0x3c, 0x25, 0x36, 0x17}, {0x20, 0x19, 0x12, 0x33, 0x1c, 0x25, 0x36, 0x17}, {0x20, 0x19, 0x12, 0x33, 0x1c, 0x25, 0x36, 0x17} }, { {0x10, 0x31, 0x3a, 0x03, 0x34, 0x15, 0x06, 0x3f}, {0x10, 0x31, 0x3a, 0x23, 0x34, 0x15, 0x06, 0x3f}, {0x10, 0x31, 0x3a, 0x23, 0x34, 0x15, 0x06, 0x3f}, {0x10, 0x31, 0x3a, 0x23, 0x34, 0x15, 0x06, 0x3f}, {0x10, 0x31, 0x3a, 0x23, 0x34, 0x15, 0x06, 0x3f}, {0x10, 0x31, 0x1a, 0x23, 0x34, 0x15, 0x26, 0x3f}, {0x10, 0x31, 0x1a, 0x23, 0x34, 0x15, 0x26, 0x3f}, {0x10, 0x31, 0x1a, 0x23, 0x34, 0x15, 0x26, 0x3f}, {0x10, 0x31, 0x1a, 0x23, 0x34, 0x15, 0x26, 0x3f}, {0x10, 0x31, 0x1a, 0x23, 0x34, 0x15, 0x26, 0x1f}, {0x10, 0x31, 0x1a, 0x23, 0x34, 0x15, 0x26, 0x1f}, {0x10, 0x31, 0x1a, 0x23, 0x34, 0x15, 0x26, 0x1f}, {0x08, 0x31, 0x1a, 0x23, 0x34, 0x05, 0x26, 0x1f}, {0x00, 0x31, 0x1a, 0x23, 0x34, 0x05, 0x26, 0x1f}, {0x00, 0x31, 0x1a, 0x23, 0x34, 0x05, 0x26, 0x1f}, {0x00, 0x29, 0x1a, 0x23, 0x34, 0x05, 0x26, 0x1f}, {0x00, 0x29, 0x1a, 0x23, 0x3c, 0x05, 0x26, 0x1f}, {0x00, 0x39, 0x1a, 0x23, 0x3c, 0x05, 0x26, 0x1f}, {0x00, 0x39, 0x1a, 0x23, 0x3c, 0x05, 0x26, 0x1f}, {0x00, 0x39, 0x0a, 0x23, 0x3c, 0x05, 0x26, 0x1f}, {0x00, 0x39, 0x0a, 0x33, 0x3c, 0x05, 0x26, 0x1f}, {0x00, 0x39, 0x12, 0x33, 0x3c, 0x05, 0x26, 0x1f}, {0x00, 0x39, 0x12, 0x33, 0x3c, 0x05, 0x26, 0x1f}, {0x00, 0x39, 0x12, 0x33, 0x3c, 0x05, 0x26, 0x1f}, {0x00, 0x39, 0x12, 0x33, 0x3c, 0x05, 0x36, 0x0f}, {0x00, 0x39, 0x12, 0x33, 0x3c, 0x05, 0x36, 0x17}, {0x00, 0x39, 0x12, 0x33, 0x3c, 0x05, 0x36, 0x17}, {0x20, 0x39, 0x12, 0x33, 0x3c, 0x05, 0x36, 0x17}, {0x20, 0x39, 0x12, 0x33, 0x3c, 0x05, 0x36, 0x17}, {0x20, 0x39, 0x12, 0x33, 0x3c, 0x05, 0x36, 0x17}, {0x20, 0x39, 0x12, 0x33, 0x3c, 0x05, 0x36, 0x17}, {0x20, 0x39, 0x12, 0x33, 0x3c, 0x25, 0x36, 0x17}, {0x20, 0x19, 0x12, 0x33, 0x3c, 0x25, 0x36, 0x17}, {0x20, 0x19, 0x12, 0x33, 0x3c, 0x25, 0x36, 0x17}, {0x20, 0x19, 0x12, 0x33, 0x3c, 0x25, 0x36, 0x17}, {0x20, 0x19, 0x12, 0x33, 0x1c, 0x25, 0x36, 0x17} }, { {0x10, 0x31, 0x3a, 0x23, 0x34, 0x15, 0x06, 0x3f}, {0x10, 0x31, 0x3a, 0x23, 0x34, 0x15, 0x06, 0x3f}, {0x10, 0x31, 0x3a, 0x23, 0x34, 0x15, 0x06, 0x3f}, {0x10, 0x31, 0x3a, 0x23, 0x34, 0x15, 0x06, 0x3f}, {0x10, 0x31, 0x1a, 0x23, 0x34, 0x15, 0x26, 0x3f}, {0x10, 0x31, 0x1a, 0x23, 0x34, 0x15, 0x26, 0x3f}, {0x10, 0x31, 0x1a, 0x23, 0x34, 0x15, 0x26, 0x3f}, {0x10, 0x31, 0x1a, 0x23, 0x34, 0x15, 0x26, 0x3f}, {0x10, 0x31, 0x1a, 0x23, 0x34, 0x15, 0x26, 0x1f}, {0x10, 0x31, 0x1a, 0x23, 0x34, 0x15, 0x26, 0x1f}, {0x10, 0x31, 0x1a, 0x23, 0x34, 0x15, 0x26, 0x1f}, {0x10, 0x31, 0x1a, 0x23, 0x34, 0x15, 0x26, 0x1f}, {0x00, 0x31, 0x1a, 0x23, 0x34, 0x05, 0x26, 0x1f}, {0x00, 0x31, 0x1a, 0x23, 0x34, 0x05, 0x26, 0x1f}, {0x00, 0x31, 0x1a, 0x23, 0x34, 0x05, 0x26, 0x1f}, {0x00, 0x31, 0x1a, 0x23, 0x34, 0x05, 0x26, 0x1f}, {0x00, 0x39, 0x1a, 0x23, 0x3c, 0x05, 0x26, 0x1f}, {0x00, 0x39, 0x1a, 0x23, 0x3c, 0x05, 0x26, 0x1f}, {0x00, 0x39, 0x1a, 0x23, 0x3c, 0x05, 0x26, 0x1f}, {0x00, 0x39, 0x1a, 0x23, 0x3c, 0x05, 0x26, 0x1f}, {0x00, 0x39, 0x12, 0x33, 0x3c, 0x05, 0x26, 0x1f}, {0x00, 0x39, 0x12, 0x33, 0x3c, 0x05, 0x26, 0x1f}, {0x00, 0x39, 0x12, 0x33, 0x3c, 0x05, 0x26, 0x1f}, {0x00, 0x39, 0x12, 0x33, 0x3c, 0x05, 0x26, 0x1f}, {0x00, 0x39, 0x12, 0x33, 0x3c, 0x05, 0x36, 0x17}, {0x00, 0x39, 0x12, 0x33, 0x3c, 0x05, 0x36, 0x17}, {0x00, 0x39, 0x12, 0x33, 0x3c, 0x05, 0x36, 0x17}, {0x00, 0x39, 0x12, 0x33, 0x3c, 0x05, 0x36, 0x17}, {0x20, 0x39, 0x12, 0x33, 0x3c, 0x05, 0x36, 0x17}, {0x20, 0x39, 0x12, 0x33, 0x3c, 0x05, 0x36, 0x17}, {0x20, 0x39, 0x12, 0x33, 0x3c, 0x05, 0x36, 0x17}, {0x20, 0x39, 0x12, 0x33, 0x3c, 0x05, 0x36, 0x17}, {0x20, 0x39, 0x12, 0x33, 0x3c, 0x25, 0x36, 0x17}, {0x20, 0x19, 0x12, 0x33, 0x3c, 0x25, 0x36, 0x17}, {0x20, 0x19, 0x12, 0x33, 0x3c, 0x25, 0x36, 0x17}, {0x20, 0x19, 0x12, 0x33, 0x3c, 0x25, 0x36, 0x17} }, { {0x10, 0x31, 0x3a, 0x23, 0x34, 0x15, 0x06, 0x3f}, {0x10, 0x31, 0x3a, 0x23, 0x34, 0x15, 0x06, 0x3f}, {0x10, 0x31, 0x3a, 0x23, 0x34, 0x15, 0x06, 0x3f}, {0x10, 0x31, 0x1a, 0x23, 0x34, 0x15, 0x26, 0x3f}, {0x10, 0x31, 0x1a, 0x23, 0x34, 0x15, 0x26, 0x3f}, {0x10, 0x31, 0x1a, 0x23, 0x34, 0x15, 0x26, 0x3f}, {0x10, 0x31, 0x1a, 0x23, 0x34, 0x15, 0x26, 0x3f}, {0x10, 0x31, 0x1a, 0x23, 0x34, 0x15, 0x26, 0x1f}, {0x10, 0x31, 0x1a, 0x23, 0x34, 0x15, 0x26, 0x1f}, {0x10, 0x31, 0x1a, 0x23, 0x34, 0x15, 0x26, 0x1f}, {0x10, 0x31, 0x1a, 0x23, 0x34, 0x15, 0x26, 0x1f}, {0x10, 0x31, 0x1a, 0x23, 0x34, 0x15, 0x26, 0x1f}, {0x00, 0x31, 0x1a, 0x23, 0x34, 0x05, 0x26, 0x1f}, {0x00, 0x31, 0x1a, 0x23, 0x34, 0x05, 0x26, 0x1f}, {0x00, 0x31, 0x1a, 0x23, 0x34, 0x05, 0x26, 0x1f}, {0x00, 0x31, 0x1a, 0x23, 0x34, 0x05, 0x26, 0x1f}, {0x00, 0x39, 0x1a, 0x23, 0x3c, 0x05, 0x26, 0x1f}, {0x00, 0x39, 0x1a, 0x23, 0x3c, 0x05, 0x26, 0x1f}, {0x00, 0x39, 0x1a, 0x23, 0x3c, 0x05, 0x26, 0x1f}, {0x00, 0x39, 0x1a, 0x23, 0x3c, 0x05, 0x26, 0x1f}, {0x00, 0x39, 0x12, 0x33, 0x3c, 0x05, 0x26, 0x1f}, {0x00, 0x39, 0x12, 0x33, 0x3c, 0x05, 0x26, 0x1f}, {0x00, 0x39, 0x12, 0x33, 0x3c, 0x05, 0x26, 0x1f}, {0x00, 0x39, 0x12, 0x33, 0x3c, 0x05, 0x26, 0x1f}, {0x00, 0x39, 0x12, 0x33, 0x3c, 0x05, 0x36, 0x17}, {0x00, 0x39, 0x12, 0x33, 0x3c, 0x05, 0x36, 0x17}, {0x00, 0x39, 0x12, 0x33, 0x3c, 0x05, 0x36, 0x17}, {0x00, 0x39, 0x12, 0x33, 0x3c, 0x05, 0x36, 0x17}, {0x00, 0x39, 0x12, 0x33, 0x3c, 0x05, 0x36, 0x17}, {0x20, 0x39, 0x12, 0x33, 0x3c, 0x05, 0x36, 0x17}, {0x20, 0x39, 0x12, 0x33, 0x3c, 0x05, 0x36, 0x17}, {0x20, 0x39, 0x12, 0x33, 0x3c, 0x05, 0x36, 0x17}, {0x20, 0x39, 0x12, 0x33, 0x3c, 0x05, 0x36, 0x17}, {0x20, 0x39, 0x12, 0x33, 0x3c, 0x25, 0x36, 0x17}, {0x20, 0x19, 0x12, 0x33, 0x3c, 0x25, 0x36, 0x17}, {0x20, 0x19, 0x12, 0x33, 0x3c, 0x25, 0x36, 0x17} }, { {0x10, 0x31, 0x3a, 0x23, 0x34, 0x15, 0x06, 0x3f}, {0x10, 0x31, 0x3a, 0x23, 0x34, 0x15, 0x06, 0x3f}, {0x10, 0x31, 0x1a, 0x23, 0x34, 0x15, 0x26, 0x3f}, {0x10, 0x31, 0x1a, 0x23, 0x34, 0x15, 0x26, 0x3f}, {0x10, 0x31, 0x1a, 0x23, 0x34, 0x15, 0x26, 0x3f}, {0x10, 0x31, 0x1a, 0x23, 0x34, 0x15, 0x26, 0x3f}, {0x10, 0x31, 0x1a, 0x23, 0x34, 0x15, 0x26, 0x1f}, {0x10, 0x31, 0x1a, 0x23, 0x34, 0x15, 0x26, 0x1f}, {0x10, 0x31, 0x1a, 0x23, 0x34, 0x15, 0x26, 0x1f}, {0x10, 0x31, 0x1a, 0x23, 0x34, 0x15, 0x26, 0x1f}, {0x10, 0x31, 0x1a, 0x23, 0x34, 0x15, 0x26, 0x1f}, {0x10, 0x31, 0x1a, 0x23, 0x34, 0x15, 0x26, 0x1f}, {0x00, 0x31, 0x1a, 0x23, 0x34, 0x05, 0x26, 0x1f}, {0x00, 0x31, 0x1a, 0x23, 0x34, 0x05, 0x26, 0x1f}, {0x00, 0x31, 0x1a, 0x23, 0x34, 0x05, 0x26, 0x1f}, {0x00, 0x31, 0x1a, 0x23, 0x34, 0x05, 0x26, 0x1f}, {0x00, 0x39, 0x1a, 0x23, 0x3c, 0x05, 0x26, 0x1f}, {0x00, 0x39, 0x1a, 0x23, 0x3c, 0x05, 0x26, 0x1f}, {0x00, 0x39, 0x1a, 0x23, 0x3c, 0x05, 0x26, 0x1f}, {0x00, 0x39, 0x1a, 0x23, 0x3c, 0x05, 0x26, 0x1f}, {0x00, 0x39, 0x12, 0x33, 0x3c, 0x05, 0x26, 0x1f}, {0x00, 0x39, 0x12, 0x33, 0x3c, 0x05, 0x26, 0x1f}, {0x00, 0x39, 0x12, 0x33, 0x3c, 0x05, 0x26, 0x1f}, {0x00, 0x39, 0x12, 0x33, 0x3c, 0x05, 0x26, 0x1f}, {0x00, 0x39, 0x12, 0x33, 0x3c, 0x05, 0x36, 0x17}, {0x00, 0x39, 0x12, 0x33, 0x3c, 0x05, 0x36, 0x17}, {0x00, 0x39, 0x12, 0x33, 0x3c, 0x05, 0x36, 0x17}, {0x00, 0x39, 0x12, 0x33, 0x3c, 0x05, 0x36, 0x17}, {0x00, 0x39, 0x12, 0x33, 0x3c, 0x05, 0x36, 0x17}, {0x00, 0x39, 0x12, 0x33, 0x3c, 0x05, 0x36, 0x17}, {0x00, 0x39, 0x12, 0x33, 0x3c, 0x05, 0x36, 0x17}, {0x20, 0x39, 0x12, 0x33, 0x3c, 0x05, 0x36, 0x17}, {0x20, 0x39, 0x12, 0x33, 0x3c, 0x05, 0x36, 0x17}, {0x20, 0x39, 0x12, 0x33, 0x3c, 0x05, 0x36, 0x17}, {0x20, 0x39, 0x12, 0x33, 0x3c, 0x25, 0x36, 0x17}, {0x20, 0x19, 0x12, 0x33, 0x3c, 0x25, 0x36, 0x17} }, { {0x10, 0x31, 0x3a, 0x23, 0x34, 0x15, 0x06, 0x3f}, {0x10, 0x31, 0x1a, 0x23, 0x34, 0x15, 0x26, 0x3f}, {0x10, 0x31, 0x1a, 0x23, 0x34, 0x15, 0x26, 0x3f}, {0x10, 0x31, 0x1a, 0x23, 0x34, 0x15, 0x26, 0x3f}, {0x10, 0x31, 0x1a, 0x23, 0x34, 0x15, 0x26, 0x3f}, {0x10, 0x31, 0x1a, 0x23, 0x34, 0x15, 0x26, 0x1f}, {0x10, 0x31, 0x1a, 0x23, 0x34, 0x15, 0x26, 0x1f}, {0x10, 0x31, 0x1a, 0x23, 0x34, 0x15, 0x26, 0x1f}, {0x10, 0x31, 0x1a, 0x23, 0x34, 0x15, 0x26, 0x1f}, {0x10, 0x31, 0x1a, 0x23, 0x34, 0x15, 0x26, 0x1f}, {0x10, 0x31, 0x1a, 0x23, 0x34, 0x15, 0x26, 0x1f}, {0x10, 0x31, 0x1a, 0x23, 0x34, 0x15, 0x26, 0x1f}, {0x00, 0x31, 0x1a, 0x23, 0x34, 0x05, 0x26, 0x1f}, {0x00, 0x31, 0x1a, 0x23, 0x34, 0x05, 0x26, 0x1f}, {0x00, 0x31, 0x1a, 0x23, 0x34, 0x05, 0x26, 0x1f}, {0x00, 0x31, 0x1a, 0x23, 0x34, 0x05, 0x26, 0x1f}, {0x00, 0x39, 0x1a, 0x23, 0x3c, 0x05, 0x26, 0x1f}, {0x00, 0x39, 0x1a, 0x23, 0x3c, 0x05, 0x26, 0x1f}, {0x00, 0x39, 0x1a, 0x23, 0x3c, 0x05, 0x26, 0x1f}, {0x00, 0x39, 0x1a, 0x23, 0x3c, 0x05, 0x26, 0x1f}, {0x00, 0x39, 0x12, 0x33, 0x3c, 0x05, 0x26, 0x1f}, {0x00, 0x39, 0x12, 0x33, 0x3c, 0x05, 0x26, 0x1f}, {0x00, 0x39, 0x12, 0x33, 0x3c, 0x05, 0x26, 0x1f}, {0x00, 0x39, 0x12, 0x33, 0x3c, 0x05, 0x26, 0x1f}, {0x00, 0x39, 0x12, 0x33, 0x3c, 0x05, 0x36, 0x17}, {0x00, 0x39, 0x12, 0x33, 0x3c, 0x05, 0x36, 0x17}, {0x00, 0x39, 0x12, 0x33, 0x3c, 0x05, 0x36, 0x17}, {0x00, 0x39, 0x12, 0x33, 0x3c, 0x05, 0x36, 0x17}, {0x00, 0x39, 0x12, 0x33, 0x3c, 0x05, 0x36, 0x17}, {0x00, 0x39, 0x12, 0x33, 0x3c, 0x05, 0x36, 0x17}, {0x00, 0x39, 0x12, 0x33, 0x3c, 0x05, 0x36, 0x17}, {0x00, 0x39, 0x12, 0x33, 0x3c, 0x05, 0x36, 0x17}, {0x20, 0x39, 0x12, 0x33, 0x3c, 0x05, 0x36, 0x17}, {0x20, 0x39, 0x12, 0x33, 0x3c, 0x05, 0x36, 0x17}, {0x20, 0x39, 0x12, 0x33, 0x3c, 0x05, 0x36, 0x17}, {0x20, 0x39, 0x12, 0x33, 0x3c, 0x25, 0x36, 0x17} } }, { /* 9,600bps map */ { {0x10, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x0e, 0x07}, {0x10, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x0e, 0x07}, {0x10, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x0e, 0x07}, {0x10, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x0e, 0x07}, {0x10, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x0e, 0x07}, {0x00, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x0e, 0x07}, {0x00, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x0e, 0x07}, {0x00, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x0e, 0x07}, {0x00, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x0e, 0x07}, {0x00, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x0e, 0x07}, {0x00, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x0e, 0x0f}, {0x00, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x0e, 0x0f}, {0x00, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x0e, 0x0f}, {0x00, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x0e, 0x0f}, {0x00, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x1e, 0x0f}, {0x00, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x1e, 0x0f}, {0x00, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x1e, 0x0f}, {0x00, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x1e, 0x0f}, {0x00, 0x09, 0x12, 0x13, 0x1c, 0x15, 0x1e, 0x0f}, {0x00, 0x09, 0x12, 0x13, 0x1c, 0x15, 0x1e, 0x0f}, {0x00, 0x09, 0x12, 0x13, 0x1c, 0x15, 0x1e, 0x0f}, {0x00, 0x09, 0x12, 0x13, 0x1c, 0x15, 0x1e, 0x0f}, {0x00, 0x09, 0x02, 0x13, 0x1c, 0x15, 0x1e, 0x0f}, {0x00, 0x09, 0x02, 0x13, 0x1c, 0x15, 0x1e, 0x0f}, {0x00, 0x09, 0x02, 0x13, 0x1c, 0x15, 0x1e, 0x0f}, {0x00, 0x09, 0x02, 0x13, 0x1c, 0x15, 0x1e, 0x0f}, {0x00, 0x09, 0x02, 0x13, 0x1c, 0x15, 0x1e, 0x1f}, {0x00, 0x09, 0x02, 0x13, 0x1c, 0x15, 0x1e, 0x1f}, {0x00, 0x09, 0x02, 0x13, 0x1c, 0x15, 0x1e, 0x1f}, {0x00, 0x09, 0x02, 0x13, 0x1c, 0x15, 0x1e, 0x1f}, {0x00, 0x09, 0x02, 0x13, 0x1c, 0x15, 0x1e, 0x1f}, {0x00, 0x09, 0x02, 0x13, 0x1c, 0x15, 0x1e, 0x1f}, {0x00, 0x09, 0x02, 0x13, 0x14, 0x15, 0x1e, 0x1f}, {0x00, 0x09, 0x02, 0x13, 0x14, 0x15, 0x1e, 0x1f}, {0x00, 0x09, 0x02, 0x13, 0x14, 0x15, 0x1e, 0x1f}, {0x00, 0x09, 0x02, 0x13, 0x14, 0x15, 0x1e, 0x1f} }, { {0x10, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x0e, 0x07}, {0x10, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x0e, 0x07}, {0x10, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x0e, 0x07}, {0x10, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x0e, 0x07}, {0x10, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x0e, 0x07}, {0x10, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x0e, 0x07}, {0x00, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x0e, 0x07}, {0x00, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x0e, 0x07}, {0x00, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x0e, 0x07}, {0x00, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x0e, 0x07}, {0x00, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x0e, 0x0f}, {0x00, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x0e, 0x0f}, {0x00, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x0e, 0x0f}, {0x00, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x0e, 0x0f}, {0x00, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x1e, 0x0f}, {0x00, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x1e, 0x0f}, {0x00, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x1e, 0x0f}, {0x00, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x1e, 0x0f}, {0x00, 0x09, 0x12, 0x13, 0x1c, 0x15, 0x1e, 0x0f}, {0x00, 0x09, 0x12, 0x13, 0x1c, 0x15, 0x1e, 0x0f}, {0x00, 0x09, 0x12, 0x13, 0x1c, 0x15, 0x1e, 0x0f}, {0x00, 0x09, 0x12, 0x13, 0x1c, 0x15, 0x1e, 0x0f}, {0x00, 0x09, 0x02, 0x13, 0x1c, 0x15, 0x1e, 0x0f}, {0x00, 0x09, 0x02, 0x13, 0x1c, 0x15, 0x1e, 0x0f}, {0x00, 0x09, 0x02, 0x13, 0x1c, 0x15, 0x1e, 0x0f}, {0x00, 0x09, 0x02, 0x13, 0x1c, 0x15, 0x1e, 0x0f}, {0x00, 0x09, 0x02, 0x13, 0x1c, 0x15, 0x1e, 0x1f}, {0x00, 0x09, 0x02, 0x13, 0x1c, 0x15, 0x1e, 0x1f}, {0x00, 0x09, 0x02, 0x13, 0x1c, 0x15, 0x1e, 0x1f}, {0x00, 0x09, 0x02, 0x13, 0x1c, 0x15, 0x1e, 0x1f}, {0x00, 0x09, 0x02, 0x13, 0x1c, 0x15, 0x1e, 0x1f}, {0x00, 0x09, 0x02, 0x13, 0x14, 0x15, 0x1e, 0x1f}, {0x00, 0x09, 0x02, 0x13, 0x14, 0x15, 0x1e, 0x1f}, {0x00, 0x09, 0x02, 0x13, 0x14, 0x15, 0x1e, 0x1f}, {0x00, 0x09, 0x02, 0x13, 0x14, 0x15, 0x1e, 0x1f}, {0x00, 0x09, 0x02, 0x13, 0x14, 0x15, 0x1e, 0x1f} }, { {0x10, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x0e, 0x07}, {0x10, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x0e, 0x07}, {0x10, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x0e, 0x07}, {0x10, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x0e, 0x07}, {0x10, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x0e, 0x07}, {0x10, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x0e, 0x07}, {0x10, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x0e, 0x07}, {0x00, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x0e, 0x07}, {0x00, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x0e, 0x07}, {0x00, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x0e, 0x07}, {0x00, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x0e, 0x0f}, {0x00, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x0e, 0x0f}, {0x00, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x0e, 0x0f}, {0x00, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x0e, 0x0f}, {0x00, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x1e, 0x0f}, {0x00, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x1e, 0x0f}, {0x00, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x1e, 0x0f}, {0x00, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x1e, 0x0f}, {0x00, 0x09, 0x12, 0x13, 0x1c, 0x15, 0x1e, 0x0f}, {0x00, 0x09, 0x12, 0x13, 0x1c, 0x15, 0x1e, 0x0f}, {0x00, 0x09, 0x12, 0x13, 0x1c, 0x15, 0x1e, 0x0f}, {0x00, 0x09, 0x12, 0x13, 0x1c, 0x15, 0x1e, 0x0f}, {0x00, 0x09, 0x02, 0x13, 0x1c, 0x15, 0x1e, 0x0f}, {0x00, 0x09, 0x02, 0x13, 0x1c, 0x15, 0x1e, 0x0f}, {0x00, 0x09, 0x02, 0x13, 0x1c, 0x15, 0x1e, 0x0f}, {0x00, 0x09, 0x02, 0x13, 0x1c, 0x15, 0x1e, 0x0f}, {0x00, 0x09, 0x02, 0x13, 0x1c, 0x15, 0x1e, 0x1f}, {0x00, 0x09, 0x02, 0x13, 0x1c, 0x15, 0x1e, 0x1f}, {0x00, 0x09, 0x02, 0x13, 0x1c, 0x15, 0x1e, 0x1f}, {0x00, 0x09, 0x02, 0x13, 0x1c, 0x15, 0x1e, 0x1f}, {0x00, 0x09, 0x02, 0x13, 0x14, 0x15, 0x1e, 0x1f}, {0x00, 0x09, 0x02, 0x13, 0x14, 0x15, 0x1e, 0x1f}, {0x00, 0x09, 0x02, 0x13, 0x14, 0x15, 0x1e, 0x1f}, {0x00, 0x09, 0x02, 0x13, 0x14, 0x15, 0x1e, 0x1f}, {0x00, 0x09, 0x02, 0x13, 0x14, 0x15, 0x1e, 0x1f}, {0x00, 0x09, 0x02, 0x13, 0x14, 0x15, 0x1e, 0x1f} }, { {0x10, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x0e, 0x07}, {0x10, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x0e, 0x07}, {0x10, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x0e, 0x07}, {0x10, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x0e, 0x07}, {0x10, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x0e, 0x07}, {0x10, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x0e, 0x07}, {0x10, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x0e, 0x07}, {0x10, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x0e, 0x07}, {0x00, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x0e, 0x07}, {0x00, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x0e, 0x07}, {0x00, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x0e, 0x0f}, {0x00, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x0e, 0x0f}, {0x00, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x0e, 0x0f}, {0x00, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x0e, 0x0f}, {0x00, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x1e, 0x0f}, {0x00, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x1e, 0x0f}, {0x00, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x1e, 0x0f}, {0x00, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x1e, 0x0f}, {0x00, 0x09, 0x12, 0x13, 0x1c, 0x15, 0x1e, 0x0f}, {0x00, 0x09, 0x12, 0x13, 0x1c, 0x15, 0x1e, 0x0f}, {0x00, 0x09, 0x12, 0x13, 0x1c, 0x15, 0x1e, 0x0f}, {0x00, 0x09, 0x12, 0x13, 0x1c, 0x15, 0x1e, 0x0f}, {0x00, 0x09, 0x02, 0x13, 0x1c, 0x15, 0x1e, 0x0f}, {0x00, 0x09, 0x02, 0x13, 0x1c, 0x15, 0x1e, 0x0f}, {0x00, 0x09, 0x02, 0x13, 0x1c, 0x15, 0x1e, 0x0f}, {0x00, 0x09, 0x02, 0x13, 0x1c, 0x15, 0x1e, 0x0f}, {0x00, 0x09, 0x02, 0x13, 0x1c, 0x15, 0x1e, 0x1f}, {0x00, 0x09, 0x02, 0x13, 0x1c, 0x15, 0x1e, 0x1f}, {0x00, 0x09, 0x02, 0x13, 0x1c, 0x15, 0x1e, 0x1f}, {0x00, 0x09, 0x02, 0x13, 0x14, 0x15, 0x1e, 0x1f}, {0x00, 0x09, 0x02, 0x13, 0x14, 0x15, 0x1e, 0x1f}, {0x00, 0x09, 0x02, 0x13, 0x14, 0x15, 0x1e, 0x1f}, {0x00, 0x09, 0x02, 0x13, 0x14, 0x15, 0x1e, 0x1f}, {0x00, 0x09, 0x02, 0x13, 0x14, 0x15, 0x1e, 0x1f}, {0x00, 0x09, 0x02, 0x13, 0x14, 0x15, 0x1e, 0x1f}, {0x00, 0x09, 0x02, 0x13, 0x14, 0x15, 0x1e, 0x1f} }, { {0x10, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x0e, 0x07}, {0x10, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x0e, 0x07}, {0x10, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x0e, 0x07}, {0x10, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x0e, 0x07}, {0x10, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x0e, 0x07}, {0x10, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x0e, 0x07}, {0x10, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x0e, 0x07}, {0x10, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x0e, 0x07}, {0x10, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x0e, 0x07}, {0x00, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x0e, 0x07}, {0x00, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x0e, 0x0f}, {0x00, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x0e, 0x0f}, {0x00, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x0e, 0x0f}, {0x00, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x0e, 0x0f}, {0x00, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x1e, 0x0f}, {0x00, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x1e, 0x0f}, {0x00, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x1e, 0x0f}, {0x00, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x1e, 0x0f}, {0x00, 0x09, 0x12, 0x13, 0x1c, 0x15, 0x1e, 0x0f}, {0x00, 0x09, 0x12, 0x13, 0x1c, 0x15, 0x1e, 0x0f}, {0x00, 0x09, 0x12, 0x13, 0x1c, 0x15, 0x1e, 0x0f}, {0x00, 0x09, 0x12, 0x13, 0x1c, 0x15, 0x1e, 0x0f}, {0x00, 0x09, 0x02, 0x13, 0x1c, 0x15, 0x1e, 0x0f}, {0x00, 0x09, 0x02, 0x13, 0x1c, 0x15, 0x1e, 0x0f}, {0x00, 0x09, 0x02, 0x13, 0x1c, 0x15, 0x1e, 0x0f}, {0x00, 0x09, 0x02, 0x13, 0x1c, 0x15, 0x1e, 0x0f}, {0x00, 0x09, 0x02, 0x13, 0x1c, 0x15, 0x1e, 0x1f}, {0x00, 0x09, 0x02, 0x13, 0x1c, 0x15, 0x1e, 0x1f}, {0x00, 0x09, 0x02, 0x13, 0x14, 0x15, 0x1e, 0x1f}, {0x00, 0x09, 0x02, 0x13, 0x14, 0x15, 0x1e, 0x1f}, {0x00, 0x09, 0x02, 0x13, 0x14, 0x15, 0x1e, 0x1f}, {0x00, 0x09, 0x02, 0x13, 0x14, 0x15, 0x1e, 0x1f}, {0x00, 0x09, 0x02, 0x13, 0x14, 0x15, 0x1e, 0x1f}, {0x00, 0x09, 0x02, 0x13, 0x14, 0x15, 0x1e, 0x1f}, {0x00, 0x09, 0x02, 0x13, 0x14, 0x15, 0x1e, 0x1f}, {0x00, 0x09, 0x02, 0x13, 0x14, 0x15, 0x1e, 0x1f} }, { {0x10, 0x01, 0x12, 0x1b, 0x1c, 0x1d, 0x0e, 0x07}, {0x10, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x0e, 0x07}, {0x10, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x0e, 0x07}, {0x10, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x0e, 0x07}, {0x10, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x0e, 0x07}, {0x10, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x0e, 0x07}, {0x10, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x0e, 0x07}, {0x10, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x0e, 0x07}, {0x10, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x0e, 0x07}, {0x10, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x0e, 0x07}, {0x00, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x0e, 0x0f}, {0x00, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x0e, 0x0f}, {0x00, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x0e, 0x0f}, {0x00, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x0e, 0x0f}, {0x00, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x1e, 0x0f}, {0x00, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x1e, 0x0f}, {0x00, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x1e, 0x0f}, {0x00, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x1e, 0x0f}, {0x00, 0x09, 0x12, 0x13, 0x1c, 0x15, 0x1e, 0x0f}, {0x00, 0x09, 0x12, 0x13, 0x1c, 0x15, 0x1e, 0x0f}, {0x00, 0x09, 0x12, 0x13, 0x1c, 0x15, 0x1e, 0x0f}, {0x00, 0x09, 0x12, 0x13, 0x1c, 0x15, 0x1e, 0x0f}, {0x00, 0x09, 0x02, 0x13, 0x1c, 0x15, 0x1e, 0x0f}, {0x00, 0x09, 0x02, 0x13, 0x1c, 0x15, 0x1e, 0x0f}, {0x00, 0x09, 0x02, 0x13, 0x1c, 0x15, 0x1e, 0x0f}, {0x00, 0x09, 0x02, 0x13, 0x1c, 0x15, 0x1e, 0x0f}, {0x00, 0x09, 0x02, 0x13, 0x1c, 0x15, 0x1e, 0x1f}, {0x00, 0x09, 0x02, 0x13, 0x14, 0x15, 0x1e, 0x1f}, {0x00, 0x09, 0x02, 0x13, 0x14, 0x15, 0x1e, 0x1f}, {0x00, 0x09, 0x02, 0x13, 0x14, 0x15, 0x1e, 0x1f}, {0x00, 0x09, 0x02, 0x13, 0x14, 0x15, 0x1e, 0x1f}, {0x00, 0x09, 0x02, 0x13, 0x14, 0x15, 0x1e, 0x1f}, {0x00, 0x09, 0x02, 0x13, 0x14, 0x15, 0x1e, 0x1f}, {0x00, 0x09, 0x02, 0x13, 0x14, 0x15, 0x1e, 0x1f}, {0x00, 0x09, 0x02, 0x13, 0x14, 0x15, 0x1e, 0x1f}, {0x00, 0x09, 0x02, 0x03, 0x14, 0x15, 0x1e, 0x1f} }, { {0x10, 0x01, 0x12, 0x1b, 0x1c, 0x1d, 0x0e, 0x07}, {0x10, 0x01, 0x12, 0x1b, 0x1c, 0x1d, 0x0e, 0x07}, {0x10, 0x01, 0x12, 0x1b, 0x1c, 0x1d, 0x0e, 0x07}, {0x10, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x0e, 0x07}, {0x10, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x0e, 0x07}, {0x10, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x0e, 0x07}, {0x10, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x0e, 0x07}, {0x10, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x0e, 0x07}, {0x10, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x0e, 0x07}, {0x10, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x0e, 0x07}, {0x10, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x0e, 0x0f}, {0x00, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x0e, 0x0f}, {0x00, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x0e, 0x0f}, {0x00, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x0e, 0x0f}, {0x00, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x1e, 0x0f}, {0x00, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x1e, 0x0f}, {0x00, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x1e, 0x0f}, {0x00, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x1e, 0x0f}, {0x00, 0x09, 0x12, 0x13, 0x1c, 0x15, 0x1e, 0x0f}, {0x00, 0x09, 0x12, 0x13, 0x1c, 0x15, 0x1e, 0x0f}, {0x00, 0x09, 0x12, 0x13, 0x1c, 0x15, 0x1e, 0x0f}, {0x00, 0x09, 0x12, 0x13, 0x1c, 0x15, 0x1e, 0x0f}, {0x00, 0x09, 0x02, 0x13, 0x1c, 0x15, 0x1e, 0x0f}, {0x00, 0x09, 0x02, 0x13, 0x1c, 0x15, 0x1e, 0x0f}, {0x00, 0x09, 0x02, 0x13, 0x1c, 0x15, 0x1e, 0x0f}, {0x00, 0x09, 0x02, 0x13, 0x1c, 0x15, 0x1e, 0x0f}, {0x00, 0x09, 0x02, 0x13, 0x14, 0x15, 0x1e, 0x1f}, {0x00, 0x09, 0x02, 0x13, 0x14, 0x15, 0x1e, 0x1f}, {0x00, 0x09, 0x02, 0x13, 0x14, 0x15, 0x1e, 0x1f}, {0x00, 0x09, 0x02, 0x13, 0x14, 0x15, 0x1e, 0x1f}, {0x00, 0x09, 0x02, 0x13, 0x14, 0x15, 0x1e, 0x1f}, {0x00, 0x09, 0x02, 0x13, 0x14, 0x15, 0x1e, 0x1f}, {0x00, 0x09, 0x02, 0x13, 0x14, 0x15, 0x1e, 0x1f}, {0x00, 0x09, 0x02, 0x13, 0x14, 0x15, 0x1e, 0x1f}, {0x00, 0x09, 0x02, 0x03, 0x14, 0x15, 0x1e, 0x1f}, {0x00, 0x09, 0x02, 0x03, 0x14, 0x15, 0x1e, 0x1f} }, { {0x10, 0x01, 0x12, 0x1b, 0x1c, 0x1d, 0x0e, 0x07}, {0x10, 0x01, 0x12, 0x1b, 0x1c, 0x1d, 0x0e, 0x07}, {0x10, 0x01, 0x12, 0x1b, 0x1c, 0x1d, 0x0e, 0x07}, {0x10, 0x01, 0x12, 0x1b, 0x1c, 0x1d, 0x0e, 0x07}, {0x10, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x0e, 0x07}, {0x10, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x0e, 0x07}, {0x10, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x0e, 0x07}, {0x10, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x0e, 0x07}, {0x10, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x0e, 0x07}, {0x10, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x0e, 0x07}, {0x10, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x0e, 0x0f}, {0x10, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x0e, 0x0f}, {0x00, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x0e, 0x0f}, {0x00, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x0e, 0x0f}, {0x00, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x1e, 0x0f}, {0x00, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x1e, 0x0f}, {0x00, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x1e, 0x0f}, {0x00, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x1e, 0x0f}, {0x00, 0x09, 0x12, 0x13, 0x1c, 0x15, 0x1e, 0x0f}, {0x00, 0x09, 0x12, 0x13, 0x1c, 0x15, 0x1e, 0x0f}, {0x00, 0x09, 0x12, 0x13, 0x1c, 0x15, 0x1e, 0x0f}, {0x00, 0x09, 0x12, 0x13, 0x1c, 0x15, 0x1e, 0x0f}, {0x00, 0x09, 0x02, 0x13, 0x1c, 0x15, 0x1e, 0x0f}, {0x00, 0x09, 0x02, 0x13, 0x1c, 0x15, 0x1e, 0x0f}, {0x00, 0x09, 0x02, 0x13, 0x1c, 0x15, 0x1e, 0x0f}, {0x00, 0x09, 0x02, 0x13, 0x14, 0x15, 0x1e, 0x0f}, {0x00, 0x09, 0x02, 0x13, 0x14, 0x15, 0x1e, 0x1f}, {0x00, 0x09, 0x02, 0x13, 0x14, 0x15, 0x1e, 0x1f}, {0x00, 0x09, 0x02, 0x13, 0x14, 0x15, 0x1e, 0x1f}, {0x00, 0x09, 0x02, 0x13, 0x14, 0x15, 0x1e, 0x1f}, {0x00, 0x09, 0x02, 0x13, 0x14, 0x15, 0x1e, 0x1f}, {0x00, 0x09, 0x02, 0x13, 0x14, 0x15, 0x1e, 0x1f}, {0x00, 0x09, 0x02, 0x13, 0x14, 0x15, 0x1e, 0x1f}, {0x00, 0x09, 0x02, 0x03, 0x14, 0x15, 0x1e, 0x1f}, {0x00, 0x09, 0x02, 0x03, 0x14, 0x15, 0x1e, 0x1f}, {0x00, 0x09, 0x02, 0x03, 0x14, 0x15, 0x1e, 0x1f} }, { {0x10, 0x01, 0x12, 0x1b, 0x1c, 0x1d, 0x0e, 0x07}, {0x10, 0x01, 0x12, 0x1b, 0x1c, 0x1d, 0x0e, 0x07}, {0x10, 0x01, 0x12, 0x1b, 0x1c, 0x1d, 0x0e, 0x07}, {0x10, 0x01, 0x12, 0x1b, 0x1c, 0x1d, 0x0e, 0x07}, {0x10, 0x01, 0x12, 0x1b, 0x1c, 0x1d, 0x0e, 0x07}, {0x10, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x0e, 0x07}, {0x10, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x0e, 0x07}, {0x10, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x0e, 0x07}, {0x10, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x0e, 0x07}, {0x10, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x0e, 0x07}, {0x10, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x0e, 0x0f}, {0x10, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x0e, 0x0f}, {0x10, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x0e, 0x0f}, {0x00, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x0e, 0x0f}, {0x00, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x1e, 0x0f}, {0x00, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x1e, 0x0f}, {0x00, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x1e, 0x0f}, {0x00, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x1e, 0x0f}, {0x00, 0x09, 0x12, 0x13, 0x1c, 0x15, 0x1e, 0x0f}, {0x00, 0x09, 0x12, 0x13, 0x1c, 0x15, 0x1e, 0x0f}, {0x00, 0x09, 0x12, 0x13, 0x1c, 0x15, 0x1e, 0x0f}, {0x00, 0x09, 0x12, 0x13, 0x1c, 0x15, 0x1e, 0x0f}, {0x00, 0x09, 0x02, 0x13, 0x1c, 0x15, 0x1e, 0x0f}, {0x00, 0x09, 0x02, 0x13, 0x1c, 0x15, 0x1e, 0x0f}, {0x00, 0x09, 0x02, 0x13, 0x14, 0x15, 0x1e, 0x0f}, {0x00, 0x09, 0x02, 0x13, 0x14, 0x15, 0x1e, 0x0f}, {0x00, 0x09, 0x02, 0x13, 0x14, 0x15, 0x1e, 0x1f}, {0x00, 0x09, 0x02, 0x13, 0x14, 0x15, 0x1e, 0x1f}, {0x00, 0x09, 0x02, 0x13, 0x14, 0x15, 0x1e, 0x1f}, {0x00, 0x09, 0x02, 0x13, 0x14, 0x15, 0x1e, 0x1f}, {0x00, 0x09, 0x02, 0x13, 0x14, 0x15, 0x1e, 0x1f}, {0x00, 0x09, 0x02, 0x13, 0x14, 0x15, 0x1e, 0x1f}, {0x00, 0x09, 0x02, 0x03, 0x14, 0x15, 0x1e, 0x1f}, {0x00, 0x09, 0x02, 0x03, 0x14, 0x15, 0x1e, 0x1f}, {0x00, 0x09, 0x02, 0x03, 0x14, 0x15, 0x1e, 0x1f}, {0x00, 0x09, 0x02, 0x03, 0x14, 0x15, 0x1e, 0x1f} }, { {0x10, 0x01, 0x12, 0x1b, 0x1c, 0x1d, 0x0e, 0x07}, {0x10, 0x01, 0x12, 0x1b, 0x1c, 0x1d, 0x0e, 0x07}, {0x10, 0x01, 0x12, 0x1b, 0x1c, 0x1d, 0x0e, 0x07}, {0x10, 0x01, 0x12, 0x1b, 0x1c, 0x1d, 0x0e, 0x07}, {0x10, 0x01, 0x12, 0x1b, 0x1c, 0x1d, 0x0e, 0x07}, {0x10, 0x01, 0x12, 0x1b, 0x1c, 0x1d, 0x0e, 0x07}, {0x10, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x0e, 0x07}, {0x10, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x0e, 0x07}, {0x10, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x0e, 0x07}, {0x10, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x0e, 0x07}, {0x10, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x0e, 0x0f}, {0x10, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x0e, 0x0f}, {0x10, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x0e, 0x0f}, {0x10, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x0e, 0x0f}, {0x00, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x1e, 0x0f}, {0x00, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x1e, 0x0f}, {0x00, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x1e, 0x0f}, {0x00, 0x01, 0x12, 0x13, 0x1c, 0x1d, 0x1e, 0x0f}, {0x00, 0x09, 0x12, 0x13, 0x1c, 0x15, 0x1e, 0x0f}, {0x00, 0x09, 0x12, 0x13, 0x1c, 0x15, 0x1e, 0x0f}, {0x00, 0x09, 0x12, 0x13, 0x1c, 0x15, 0x1e, 0x0f}, {0x00, 0x09, 0x12, 0x13, 0x1c, 0x15, 0x1e, 0x0f}, {0x00, 0x09, 0x02, 0x13, 0x1c, 0x15, 0x1e, 0x0f}, {0x00, 0x09, 0x02, 0x13, 0x14, 0x15, 0x1e, 0x0f}, {0x00, 0x09, 0x02, 0x13, 0x14, 0x15, 0x1e, 0x0f}, {0x00, 0x09, 0x02, 0x13, 0x14, 0x15, 0x1e, 0x0f}, {0x00, 0x09, 0x02, 0x13, 0x14, 0x15, 0x1e, 0x1f}, {0x00, 0x09, 0x02, 0x13, 0x14, 0x15, 0x1e, 0x1f}, {0x00, 0x09, 0x02, 0x13, 0x14, 0x15, 0x1e, 0x1f}, {0x00, 0x09, 0x02, 0x13, 0x14, 0x15, 0x1e, 0x1f}, {0x00, 0x09, 0x02, 0x13, 0x14, 0x15, 0x1e, 0x1f}, {0x00, 0x09, 0x02, 0x03, 0x14, 0x15, 0x1e, 0x1f}, {0x00, 0x09, 0x02, 0x03, 0x14, 0x15, 0x1e, 0x1f}, {0x00, 0x09, 0x02, 0x03, 0x14, 0x15, 0x1e, 0x1f}, {0x00, 0x09, 0x02, 0x03, 0x14, 0x15, 0x1e, 0x1f}, {0x00, 0x09, 0x02, 0x03, 0x14, 0x15, 0x1e, 0x1f} }, { {0x10, 0x01, 0x12, 0x1b, 0x0c, 0x1d, 0x0e, 0x07}, {0x10, 0x01, 0x12, 0x1b, 0x0c, 0x1d, 0x0e, 0x07}, {0x10, 0x01, 0x12, 0x1b, 0x0c, 0x1d, 0x0e, 0x07}, {0x10, 0x01, 0x12, 0x1b, 0x0c, 0x1d, 0x0e, 0x07}, {0x10, 0x01, 0x12, 0x1b, 0x0c, 0x1d, 0x0e, 0x07}, {0x10, 0x01, 0x12, 0x1b, 0x0c, 0x1d, 0x0e, 0x07}, {0x10, 0x01, 0x12, 0x1b, 0x0c, 0x1d, 0x0e, 0x07}, {0x10, 0x01, 0x12, 0x13, 0x0c, 0x1d, 0x0e, 0x07}, {0x10, 0x01, 0x12, 0x13, 0x0c, 0x1d, 0x0e, 0x07}, {0x10, 0x01, 0x12, 0x13, 0x0c, 0x1d, 0x0e, 0x07}, {0x10, 0x01, 0x12, 0x13, 0x0c, 0x1d, 0x0e, 0x0f}, {0x10, 0x01, 0x12, 0x13, 0x0c, 0x1d, 0x0e, 0x0f}, {0x10, 0x01, 0x12, 0x13, 0x0c, 0x1d, 0x0e, 0x0f}, {0x10, 0x01, 0x12, 0x13, 0x0c, 0x1d, 0x0e, 0x0f}, {0x08, 0x01, 0x12, 0x13, 0x0c, 0x1d, 0x1e, 0x0f}, {0x08, 0x01, 0x12, 0x13, 0x0c, 0x1d, 0x1e, 0x0f}, {0x08, 0x01, 0x12, 0x13, 0x0c, 0x1d, 0x1e, 0x0f}, {0x08, 0x01, 0x12, 0x13, 0x0c, 0x1d, 0x1e, 0x0f}, {0x08, 0x09, 0x12, 0x13, 0x0c, 0x15, 0x1e, 0x0f}, {0x08, 0x09, 0x12, 0x13, 0x0c, 0x15, 0x1e, 0x0f}, {0x08, 0x09, 0x12, 0x13, 0x0c, 0x15, 0x1e, 0x0f}, {0x08, 0x09, 0x12, 0x13, 0x0c, 0x15, 0x1e, 0x0f}, {0x08, 0x09, 0x02, 0x13, 0x14, 0x15, 0x1e, 0x0f}, {0x08, 0x09, 0x02, 0x13, 0x14, 0x15, 0x1e, 0x0f}, {0x08, 0x09, 0x02, 0x13, 0x14, 0x15, 0x1e, 0x0f}, {0x08, 0x09, 0x02, 0x13, 0x14, 0x15, 0x1e, 0x0f}, {0x08, 0x09, 0x02, 0x13, 0x14, 0x15, 0x1e, 0x1f}, {0x08, 0x09, 0x02, 0x13, 0x14, 0x15, 0x1e, 0x1f}, {0x08, 0x09, 0x02, 0x13, 0x14, 0x15, 0x1e, 0x1f}, {0x08, 0x09, 0x02, 0x13, 0x14, 0x15, 0x1e, 0x1f}, {0x08, 0x09, 0x02, 0x03, 0x14, 0x15, 0x1e, 0x1f}, {0x08, 0x09, 0x02, 0x03, 0x14, 0x15, 0x1e, 0x1f}, {0x08, 0x09, 0x02, 0x03, 0x14, 0x15, 0x1e, 0x1f}, {0x08, 0x09, 0x02, 0x03, 0x14, 0x15, 0x1e, 0x1f}, {0x08, 0x09, 0x02, 0x03, 0x14, 0x15, 0x1e, 0x1f}, {0x08, 0x09, 0x02, 0x03, 0x14, 0x15, 0x1e, 0x1f} }, { {0x10, 0x01, 0x12, 0x1b, 0x0c, 0x1d, 0x0e, 0x07}, {0x10, 0x01, 0x12, 0x1b, 0x0c, 0x1d, 0x0e, 0x07}, {0x10, 0x01, 0x12, 0x1b, 0x0c, 0x1d, 0x0e, 0x07}, {0x10, 0x01, 0x12, 0x1b, 0x0c, 0x1d, 0x0e, 0x07}, {0x10, 0x01, 0x12, 0x1b, 0x0c, 0x1d, 0x0e, 0x07}, {0x10, 0x01, 0x12, 0x1b, 0x0c, 0x1d, 0x0e, 0x07}, {0x10, 0x01, 0x12, 0x1b, 0x0c, 0x1d, 0x0e, 0x07}, {0x10, 0x01, 0x12, 0x1b, 0x0c, 0x1d, 0x0e, 0x07}, {0x10, 0x01, 0x12, 0x13, 0x0c, 0x1d, 0x0e, 0x07}, {0x10, 0x01, 0x12, 0x13, 0x0c, 0x1d, 0x0e, 0x07}, {0x10, 0x01, 0x12, 0x13, 0x0c, 0x1d, 0x0e, 0x0f}, {0x10, 0x01, 0x12, 0x13, 0x0c, 0x1d, 0x0e, 0x0f}, {0x10, 0x01, 0x12, 0x13, 0x0c, 0x1d, 0x0e, 0x0f}, {0x10, 0x01, 0x12, 0x13, 0x0c, 0x1d, 0x0e, 0x0f}, {0x08, 0x01, 0x12, 0x13, 0x0c, 0x1d, 0x1e, 0x0f}, {0x08, 0x01, 0x12, 0x13, 0x0c, 0x1d, 0x1e, 0x0f}, {0x08, 0x01, 0x12, 0x13, 0x0c, 0x1d, 0x1e, 0x0f}, {0x08, 0x01, 0x12, 0x13, 0x0c, 0x1d, 0x1e, 0x0f}, {0x08, 0x09, 0x12, 0x13, 0x0c, 0x15, 0x1e, 0x0f}, {0x08, 0x09, 0x12, 0x13, 0x0c, 0x15, 0x1e, 0x0f}, {0x08, 0x09, 0x12, 0x13, 0x0c, 0x15, 0x1e, 0x0f}, {0x08, 0x09, 0x12, 0x13, 0x0c, 0x15, 0x1e, 0x0f}, {0x08, 0x09, 0x02, 0x13, 0x14, 0x15, 0x1e, 0x0f}, {0x08, 0x09, 0x02, 0x13, 0x14, 0x15, 0x1e, 0x0f}, {0x08, 0x09, 0x02, 0x13, 0x14, 0x15, 0x1e, 0x0f}, {0x08, 0x09, 0x02, 0x13, 0x14, 0x15, 0x1e, 0x0f}, {0x08, 0x09, 0x02, 0x13, 0x14, 0x15, 0x1e, 0x1f}, {0x08, 0x09, 0x02, 0x13, 0x14, 0x15, 0x1e, 0x1f}, {0x08, 0x09, 0x02, 0x13, 0x14, 0x15, 0x1e, 0x1f}, {0x08, 0x09, 0x02, 0x03, 0x14, 0x15, 0x1e, 0x1f}, {0x08, 0x09, 0x02, 0x03, 0x14, 0x15, 0x1e, 0x1f}, {0x08, 0x09, 0x02, 0x03, 0x14, 0x15, 0x1e, 0x1f}, {0x08, 0x09, 0x02, 0x03, 0x14, 0x15, 0x1e, 0x1f}, {0x08, 0x09, 0x02, 0x03, 0x14, 0x15, 0x1e, 0x1f}, {0x08, 0x09, 0x02, 0x03, 0x14, 0x15, 0x1e, 0x1f}, {0x08, 0x09, 0x02, 0x03, 0x14, 0x15, 0x1e, 0x1f} }, { {0x10, 0x01, 0x12, 0x1b, 0x0c, 0x1d, 0x0e, 0x07}, {0x10, 0x01, 0x12, 0x1b, 0x0c, 0x1d, 0x0e, 0x07}, {0x10, 0x01, 0x12, 0x1b, 0x0c, 0x1d, 0x0e, 0x07}, {0x10, 0x01, 0x12, 0x1b, 0x0c, 0x1d, 0x0e, 0x07}, {0x10, 0x01, 0x12, 0x1b, 0x0c, 0x1d, 0x0e, 0x07}, {0x10, 0x01, 0x12, 0x1b, 0x0c, 0x1d, 0x0e, 0x07}, {0x10, 0x01, 0x12, 0x1b, 0x0c, 0x1d, 0x0e, 0x07}, {0x10, 0x01, 0x12, 0x1b, 0x0c, 0x1d, 0x0e, 0x07}, {0x10, 0x01, 0x12, 0x1b, 0x0c, 0x1d, 0x0e, 0x07}, {0x10, 0x01, 0x12, 0x13, 0x0c, 0x1d, 0x0e, 0x07}, {0x10, 0x01, 0x12, 0x13, 0x0c, 0x1d, 0x0e, 0x0f}, {0x10, 0x01, 0x12, 0x13, 0x0c, 0x1d, 0x0e, 0x0f}, {0x10, 0x01, 0x12, 0x13, 0x0c, 0x1d, 0x0e, 0x0f}, {0x10, 0x01, 0x12, 0x13, 0x0c, 0x1d, 0x0e, 0x0f}, {0x08, 0x01, 0x12, 0x13, 0x0c, 0x1d, 0x1e, 0x0f}, {0x08, 0x01, 0x12, 0x13, 0x0c, 0x1d, 0x1e, 0x0f}, {0x08, 0x01, 0x12, 0x13, 0x0c, 0x1d, 0x1e, 0x0f}, {0x08, 0x01, 0x12, 0x13, 0x0c, 0x1d, 0x1e, 0x0f}, {0x08, 0x09, 0x12, 0x13, 0x0c, 0x15, 0x1e, 0x0f}, {0x08, 0x09, 0x12, 0x13, 0x0c, 0x15, 0x1e, 0x0f}, {0x08, 0x09, 0x12, 0x13, 0x0c, 0x15, 0x1e, 0x0f}, {0x08, 0x09, 0x12, 0x13, 0x0c, 0x15, 0x1e, 0x0f}, {0x08, 0x09, 0x02, 0x13, 0x14, 0x15, 0x1e, 0x0f}, {0x08, 0x09, 0x02, 0x13, 0x14, 0x15, 0x1e, 0x0f}, {0x08, 0x09, 0x02, 0x13, 0x14, 0x15, 0x1e, 0x0f}, {0x08, 0x09, 0x02, 0x13, 0x14, 0x15, 0x1e, 0x0f}, {0x08, 0x09, 0x02, 0x13, 0x14, 0x15, 0x1e, 0x1f}, {0x08, 0x09, 0x02, 0x13, 0x14, 0x15, 0x1e, 0x1f}, {0x08, 0x09, 0x02, 0x03, 0x14, 0x15, 0x1e, 0x1f}, {0x08, 0x09, 0x02, 0x03, 0x14, 0x15, 0x1e, 0x1f}, {0x08, 0x09, 0x02, 0x03, 0x14, 0x15, 0x1e, 0x1f}, {0x08, 0x09, 0x02, 0x03, 0x14, 0x15, 0x1e, 0x1f}, {0x08, 0x09, 0x02, 0x03, 0x14, 0x15, 0x1e, 0x1f}, {0x08, 0x09, 0x02, 0x03, 0x14, 0x15, 0x1e, 0x1f}, {0x08, 0x09, 0x02, 0x03, 0x14, 0x15, 0x1e, 0x1f}, {0x08, 0x09, 0x02, 0x03, 0x14, 0x15, 0x1e, 0x1f} }, { {0x10, 0x01, 0x12, 0x1b, 0x0c, 0x1d, 0x0e, 0x07}, {0x10, 0x01, 0x12, 0x1b, 0x0c, 0x1d, 0x0e, 0x07}, {0x10, 0x01, 0x12, 0x1b, 0x0c, 0x1d, 0x0e, 0x07}, {0x10, 0x01, 0x12, 0x1b, 0x0c, 0x1d, 0x0e, 0x07}, {0x10, 0x01, 0x12, 0x1b, 0x0c, 0x1d, 0x0e, 0x07}, {0x10, 0x01, 0x12, 0x1b, 0x0c, 0x1d, 0x0e, 0x07}, {0x10, 0x01, 0x12, 0x1b, 0x0c, 0x1d, 0x0e, 0x07}, {0x10, 0x01, 0x12, 0x1b, 0x0c, 0x1d, 0x0e, 0x07}, {0x10, 0x01, 0x12, 0x1b, 0x0c, 0x1d, 0x0e, 0x07}, {0x10, 0x01, 0x12, 0x1b, 0x0c, 0x1d, 0x0e, 0x07}, {0x10, 0x01, 0x12, 0x13, 0x0c, 0x1d, 0x0e, 0x0f}, {0x10, 0x01, 0x12, 0x13, 0x0c, 0x1d, 0x0e, 0x0f}, {0x10, 0x01, 0x12, 0x13, 0x0c, 0x1d, 0x0e, 0x0f}, {0x10, 0x01, 0x12, 0x13, 0x0c, 0x1d, 0x0e, 0x0f}, {0x08, 0x01, 0x12, 0x13, 0x0c, 0x1d, 0x1e, 0x0f}, {0x08, 0x01, 0x12, 0x13, 0x0c, 0x1d, 0x1e, 0x0f}, {0x08, 0x01, 0x12, 0x13, 0x0c, 0x1d, 0x1e, 0x0f}, {0x08, 0x01, 0x12, 0x13, 0x0c, 0x1d, 0x1e, 0x0f}, {0x08, 0x09, 0x12, 0x13, 0x0c, 0x15, 0x1e, 0x0f}, {0x08, 0x09, 0x12, 0x13, 0x0c, 0x15, 0x1e, 0x0f}, {0x08, 0x09, 0x12, 0x13, 0x0c, 0x15, 0x1e, 0x0f}, {0x08, 0x09, 0x12, 0x13, 0x0c, 0x15, 0x1e, 0x0f}, {0x08, 0x09, 0x02, 0x13, 0x14, 0x15, 0x1e, 0x0f}, {0x08, 0x09, 0x02, 0x13, 0x14, 0x15, 0x1e, 0x0f}, {0x08, 0x09, 0x02, 0x13, 0x14, 0x15, 0x1e, 0x0f}, {0x08, 0x09, 0x02, 0x13, 0x14, 0x15, 0x1e, 0x0f}, {0x08, 0x09, 0x02, 0x13, 0x14, 0x15, 0x1e, 0x1f}, {0x08, 0x09, 0x02, 0x03, 0x14, 0x15, 0x1e, 0x1f}, {0x08, 0x09, 0x02, 0x03, 0x14, 0x15, 0x1e, 0x1f}, {0x08, 0x09, 0x02, 0x03, 0x14, 0x15, 0x1e, 0x1f}, {0x08, 0x09, 0x02, 0x03, 0x14, 0x15, 0x1e, 0x1f}, {0x08, 0x09, 0x02, 0x03, 0x14, 0x15, 0x1e, 0x1f}, {0x08, 0x09, 0x02, 0x03, 0x14, 0x15, 0x1e, 0x1f}, {0x08, 0x09, 0x02, 0x03, 0x14, 0x15, 0x1e, 0x1f}, {0x08, 0x09, 0x02, 0x03, 0x14, 0x15, 0x1e, 0x1f}, {0x08, 0x09, 0x02, 0x03, 0x14, 0x15, 0x1e, 0x1f} }, { {0x10, 0x11, 0x12, 0x1b, 0x0c, 0x1d, 0x0e, 0x07}, {0x10, 0x11, 0x12, 0x1b, 0x0c, 0x1d, 0x0e, 0x07}, {0x10, 0x11, 0x12, 0x1b, 0x0c, 0x1d, 0x0e, 0x07}, {0x10, 0x11, 0x12, 0x1b, 0x0c, 0x1d, 0x0e, 0x07}, {0x10, 0x11, 0x12, 0x1b, 0x0c, 0x1d, 0x0e, 0x07}, {0x10, 0x11, 0x12, 0x1b, 0x0c, 0x1d, 0x0e, 0x07}, {0x10, 0x11, 0x12, 0x1b, 0x0c, 0x1d, 0x0e, 0x07}, {0x10, 0x11, 0x12, 0x1b, 0x0c, 0x1d, 0x0e, 0x07}, {0x10, 0x11, 0x12, 0x1b, 0x0c, 0x1d, 0x0e, 0x07}, {0x10, 0x11, 0x12, 0x1b, 0x0c, 0x1d, 0x0e, 0x07}, {0x10, 0x11, 0x12, 0x0b, 0x0c, 0x1d, 0x0e, 0x0f}, {0x10, 0x11, 0x12, 0x0b, 0x0c, 0x1d, 0x0e, 0x0f}, {0x10, 0x11, 0x12, 0x0b, 0x0c, 0x1d, 0x0e, 0x0f}, {0x10, 0x11, 0x12, 0x0b, 0x0c, 0x1d, 0x0e, 0x0f}, {0x08, 0x11, 0x12, 0x0b, 0x0c, 0x1d, 0x1e, 0x0f}, {0x08, 0x11, 0x12, 0x0b, 0x0c, 0x1d, 0x1e, 0x0f}, {0x08, 0x11, 0x12, 0x0b, 0x0c, 0x1d, 0x1e, 0x0f}, {0x08, 0x11, 0x12, 0x0b, 0x0c, 0x1d, 0x1e, 0x0f}, {0x08, 0x19, 0x12, 0x0b, 0x0c, 0x15, 0x1e, 0x0f}, {0x08, 0x19, 0x12, 0x0b, 0x0c, 0x15, 0x1e, 0x0f}, {0x08, 0x19, 0x12, 0x0b, 0x0c, 0x15, 0x1e, 0x0f}, {0x08, 0x19, 0x12, 0x0b, 0x0c, 0x15, 0x1e, 0x0f}, {0x08, 0x19, 0x02, 0x0b, 0x14, 0x15, 0x1e, 0x0f}, {0x08, 0x19, 0x02, 0x0b, 0x14, 0x15, 0x1e, 0x0f}, {0x08, 0x19, 0x02, 0x0b, 0x14, 0x15, 0x1e, 0x0f}, {0x08, 0x19, 0x02, 0x0b, 0x14, 0x15, 0x1e, 0x0f}, {0x08, 0x19, 0x02, 0x03, 0x14, 0x15, 0x1e, 0x1f}, {0x08, 0x19, 0x02, 0x03, 0x14, 0x15, 0x1e, 0x1f}, {0x08, 0x19, 0x02, 0x03, 0x14, 0x15, 0x1e, 0x1f}, {0x08, 0x19, 0x02, 0x03, 0x14, 0x15, 0x1e, 0x1f}, {0x08, 0x19, 0x02, 0x03, 0x14, 0x15, 0x1e, 0x1f}, {0x08, 0x19, 0x02, 0x03, 0x14, 0x15, 0x1e, 0x1f}, {0x08, 0x19, 0x02, 0x03, 0x14, 0x15, 0x1e, 0x1f}, {0x08, 0x19, 0x02, 0x03, 0x14, 0x15, 0x1e, 0x1f}, {0x08, 0x19, 0x02, 0x03, 0x14, 0x15, 0x1e, 0x1f}, {0x08, 0x19, 0x02, 0x03, 0x14, 0x15, 0x1e, 0x1f} }, { {0x10, 0x11, 0x12, 0x1b, 0x0c, 0x1d, 0x0e, 0x07}, {0x10, 0x11, 0x12, 0x1b, 0x0c, 0x1d, 0x0e, 0x07}, {0x10, 0x11, 0x12, 0x1b, 0x0c, 0x1d, 0x0e, 0x07}, {0x10, 0x11, 0x12, 0x1b, 0x0c, 0x1d, 0x0e, 0x07}, {0x10, 0x11, 0x12, 0x1b, 0x0c, 0x1d, 0x0e, 0x07}, {0x10, 0x11, 0x12, 0x1b, 0x0c, 0x1d, 0x0e, 0x07}, {0x10, 0x11, 0x12, 0x1b, 0x0c, 0x1d, 0x0e, 0x07}, {0x10, 0x11, 0x12, 0x1b, 0x0c, 0x1d, 0x0e, 0x07}, {0x10, 0x11, 0x12, 0x1b, 0x0c, 0x1d, 0x0e, 0x07}, {0x10, 0x11, 0x12, 0x1b, 0x0c, 0x1d, 0x0e, 0x07}, {0x10, 0x11, 0x12, 0x0b, 0x0c, 0x1d, 0x0e, 0x0f}, {0x10, 0x11, 0x12, 0x0b, 0x0c, 0x1d, 0x0e, 0x0f}, {0x10, 0x11, 0x12, 0x0b, 0x0c, 0x1d, 0x0e, 0x0f}, {0x10, 0x11, 0x12, 0x0b, 0x0c, 0x1d, 0x0e, 0x0f}, {0x08, 0x11, 0x12, 0x0b, 0x0c, 0x1d, 0x1e, 0x0f}, {0x08, 0x11, 0x12, 0x0b, 0x0c, 0x1d, 0x1e, 0x0f}, {0x08, 0x11, 0x12, 0x0b, 0x0c, 0x1d, 0x1e, 0x0f}, {0x08, 0x11, 0x12, 0x0b, 0x0c, 0x1d, 0x1e, 0x0f}, {0x08, 0x19, 0x12, 0x0b, 0x0c, 0x15, 0x1e, 0x0f}, {0x08, 0x19, 0x12, 0x0b, 0x0c, 0x15, 0x1e, 0x0f}, {0x08, 0x19, 0x12, 0x0b, 0x0c, 0x15, 0x1e, 0x0f}, {0x08, 0x19, 0x12, 0x0b, 0x0c, 0x15, 0x1e, 0x0f}, {0x08, 0x19, 0x02, 0x0b, 0x14, 0x15, 0x1e, 0x0f}, {0x08, 0x19, 0x02, 0x0b, 0x14, 0x15, 0x1e, 0x0f}, {0x08, 0x19, 0x02, 0x0b, 0x14, 0x15, 0x1e, 0x0f}, {0x08, 0x19, 0x02, 0x0b, 0x14, 0x15, 0x1e, 0x0f}, {0x08, 0x19, 0x02, 0x03, 0x14, 0x15, 0x1e, 0x1f}, {0x08, 0x19, 0x02, 0x03, 0x14, 0x15, 0x1e, 0x1f}, {0x08, 0x19, 0x02, 0x03, 0x14, 0x15, 0x1e, 0x1f}, {0x08, 0x19, 0x02, 0x03, 0x14, 0x15, 0x1e, 0x1f}, {0x08, 0x19, 0x02, 0x03, 0x14, 0x15, 0x1e, 0x1f}, {0x08, 0x19, 0x02, 0x03, 0x14, 0x15, 0x1e, 0x1f}, {0x08, 0x19, 0x02, 0x03, 0x14, 0x15, 0x1e, 0x1f}, {0x08, 0x19, 0x02, 0x03, 0x14, 0x15, 0x1e, 0x1f}, {0x08, 0x19, 0x02, 0x03, 0x14, 0x15, 0x1e, 0x1f}, {0x08, 0x19, 0x02, 0x03, 0x14, 0x15, 0x1e, 0x1f} }, { {0x10, 0x11, 0x12, 0x1b, 0x0c, 0x1d, 0x0e, 0x07}, {0x10, 0x11, 0x12, 0x1b, 0x0c, 0x1d, 0x0e, 0x07}, {0x10, 0x11, 0x12, 0x1b, 0x0c, 0x1d, 0x0e, 0x07}, {0x10, 0x11, 0x12, 0x1b, 0x0c, 0x1d, 0x0e, 0x07}, {0x10, 0x11, 0x12, 0x1b, 0x0c, 0x1d, 0x0e, 0x07}, {0x10, 0x11, 0x12, 0x1b, 0x0c, 0x1d, 0x0e, 0x07}, {0x10, 0x11, 0x12, 0x1b, 0x0c, 0x1d, 0x0e, 0x07}, {0x10, 0x11, 0x12, 0x1b, 0x0c, 0x1d, 0x0e, 0x07}, {0x10, 0x11, 0x12, 0x1b, 0x0c, 0x1d, 0x0e, 0x07}, {0x10, 0x11, 0x12, 0x1b, 0x0c, 0x1d, 0x0e, 0x07}, {0x10, 0x11, 0x12, 0x0b, 0x0c, 0x1d, 0x0e, 0x0f}, {0x10, 0x11, 0x12, 0x0b, 0x0c, 0x1d, 0x0e, 0x0f}, {0x10, 0x11, 0x12, 0x0b, 0x0c, 0x1d, 0x0e, 0x0f}, {0x10, 0x11, 0x12, 0x0b, 0x0c, 0x1d, 0x0e, 0x0f}, {0x08, 0x11, 0x12, 0x0b, 0x0c, 0x1d, 0x1e, 0x0f}, {0x08, 0x11, 0x12, 0x0b, 0x0c, 0x1d, 0x1e, 0x0f}, {0x08, 0x11, 0x12, 0x0b, 0x0c, 0x1d, 0x1e, 0x0f}, {0x08, 0x11, 0x12, 0x0b, 0x0c, 0x1d, 0x1e, 0x0f}, {0x08, 0x19, 0x12, 0x0b, 0x0c, 0x15, 0x1e, 0x0f}, {0x08, 0x19, 0x12, 0x0b, 0x0c, 0x15, 0x1e, 0x0f}, {0x08, 0x19, 0x12, 0x0b, 0x0c, 0x15, 0x1e, 0x0f}, {0x08, 0x19, 0x12, 0x0b, 0x0c, 0x15, 0x1e, 0x0f}, {0x08, 0x19, 0x02, 0x0b, 0x14, 0x15, 0x1e, 0x0f}, {0x08, 0x19, 0x02, 0x0b, 0x14, 0x15, 0x1e, 0x0f}, {0x08, 0x19, 0x02, 0x0b, 0x14, 0x15, 0x1e, 0x0f}, {0x08, 0x19, 0x02, 0x0b, 0x14, 0x15, 0x1e, 0x0f}, {0x08, 0x19, 0x02, 0x03, 0x14, 0x15, 0x1e, 0x1f}, {0x08, 0x19, 0x02, 0x03, 0x14, 0x15, 0x1e, 0x1f}, {0x08, 0x19, 0x02, 0x03, 0x14, 0x15, 0x1e, 0x1f}, {0x08, 0x19, 0x02, 0x03, 0x14, 0x15, 0x1e, 0x1f}, {0x08, 0x19, 0x02, 0x03, 0x14, 0x15, 0x1e, 0x1f}, {0x08, 0x19, 0x02, 0x03, 0x14, 0x15, 0x1e, 0x1f}, {0x08, 0x19, 0x02, 0x03, 0x14, 0x15, 0x1e, 0x1f}, {0x08, 0x19, 0x02, 0x03, 0x14, 0x15, 0x1e, 0x1f}, {0x08, 0x19, 0x02, 0x03, 0x14, 0x15, 0x1e, 0x1f}, {0x08, 0x19, 0x02, 0x03, 0x14, 0x15, 0x1e, 0x1f} }, { {0x10, 0x11, 0x12, 0x1b, 0x0c, 0x1d, 0x0e, 0x07}, {0x10, 0x11, 0x12, 0x1b, 0x0c, 0x1d, 0x0e, 0x07}, {0x10, 0x11, 0x12, 0x1b, 0x0c, 0x1d, 0x0e, 0x07}, {0x10, 0x11, 0x12, 0x1b, 0x0c, 0x1d, 0x0e, 0x07}, {0x10, 0x11, 0x12, 0x1b, 0x0c, 0x1d, 0x0e, 0x07}, {0x10, 0x11, 0x12, 0x1b, 0x0c, 0x1d, 0x0e, 0x07}, {0x10, 0x11, 0x12, 0x1b, 0x0c, 0x1d, 0x0e, 0x07}, {0x10, 0x11, 0x12, 0x1b, 0x0c, 0x1d, 0x0e, 0x07}, {0x10, 0x11, 0x12, 0x1b, 0x0c, 0x1d, 0x0e, 0x07}, {0x10, 0x11, 0x12, 0x1b, 0x0c, 0x1d, 0x0e, 0x07}, {0x10, 0x11, 0x12, 0x0b, 0x0c, 0x1d, 0x0e, 0x0f}, {0x10, 0x11, 0x12, 0x0b, 0x0c, 0x1d, 0x0e, 0x0f}, {0x10, 0x11, 0x12, 0x0b, 0x0c, 0x1d, 0x0e, 0x0f}, {0x10, 0x11, 0x12, 0x0b, 0x0c, 0x1d, 0x0e, 0x0f}, {0x08, 0x11, 0x12, 0x0b, 0x0c, 0x1d, 0x1e, 0x0f}, {0x08, 0x11, 0x12, 0x0b, 0x0c, 0x1d, 0x1e, 0x0f}, {0x08, 0x11, 0x12, 0x0b, 0x0c, 0x1d, 0x1e, 0x0f}, {0x08, 0x11, 0x12, 0x0b, 0x0c, 0x1d, 0x1e, 0x0f}, {0x08, 0x19, 0x12, 0x0b, 0x0c, 0x15, 0x1e, 0x0f}, {0x08, 0x19, 0x12, 0x0b, 0x0c, 0x15, 0x1e, 0x0f}, {0x08, 0x19, 0x12, 0x0b, 0x0c, 0x15, 0x1e, 0x0f}, {0x08, 0x19, 0x12, 0x0b, 0x0c, 0x15, 0x1e, 0x0f}, {0x08, 0x19, 0x02, 0x0b, 0x14, 0x15, 0x1e, 0x0f}, {0x08, 0x19, 0x02, 0x0b, 0x14, 0x15, 0x1e, 0x0f}, {0x08, 0x19, 0x02, 0x0b, 0x14, 0x15, 0x1e, 0x0f}, {0x08, 0x19, 0x02, 0x0b, 0x14, 0x15, 0x1e, 0x0f}, {0x08, 0x19, 0x02, 0x03, 0x14, 0x15, 0x1e, 0x1f}, {0x08, 0x19, 0x02, 0x03, 0x14, 0x15, 0x1e, 0x1f}, {0x08, 0x19, 0x02, 0x03, 0x14, 0x15, 0x1e, 0x1f}, {0x08, 0x19, 0x02, 0x03, 0x14, 0x15, 0x1e, 0x1f}, {0x08, 0x19, 0x02, 0x03, 0x14, 0x15, 0x1e, 0x1f}, {0x08, 0x19, 0x02, 0x03, 0x14, 0x15, 0x1e, 0x1f}, {0x08, 0x19, 0x02, 0x03, 0x14, 0x15, 0x1e, 0x1f}, {0x08, 0x19, 0x02, 0x03, 0x14, 0x15, 0x1e, 0x1f}, {0x08, 0x19, 0x02, 0x03, 0x14, 0x15, 0x1e, 0x1f}, {0x08, 0x19, 0x02, 0x03, 0x14, 0x15, 0x1e, 0x1f} }, { {0x10, 0x11, 0x1a, 0x1b, 0x0c, 0x1d, 0x06, 0x07}, {0x10, 0x11, 0x1a, 0x1b, 0x0c, 0x1d, 0x06, 0x07}, {0x10, 0x11, 0x1a, 0x1b, 0x0c, 0x1d, 0x06, 0x07}, {0x10, 0x11, 0x1a, 0x1b, 0x0c, 0x1d, 0x06, 0x07}, {0x10, 0x11, 0x1a, 0x1b, 0x0c, 0x1d, 0x06, 0x07}, {0x10, 0x11, 0x1a, 0x1b, 0x0c, 0x1d, 0x06, 0x07}, {0x10, 0x11, 0x1a, 0x1b, 0x0c, 0x1d, 0x06, 0x07}, {0x10, 0x11, 0x1a, 0x1b, 0x0c, 0x1d, 0x06, 0x07}, {0x10, 0x11, 0x1a, 0x1b, 0x0c, 0x1d, 0x06, 0x07}, {0x10, 0x11, 0x1a, 0x1b, 0x0c, 0x1d, 0x06, 0x07}, {0x10, 0x11, 0x1a, 0x0b, 0x0c, 0x1d, 0x06, 0x0f}, {0x10, 0x11, 0x1a, 0x0b, 0x0c, 0x1d, 0x06, 0x0f}, {0x10, 0x11, 0x1a, 0x0b, 0x0c, 0x1d, 0x06, 0x0f}, {0x10, 0x11, 0x1a, 0x0b, 0x0c, 0x1d, 0x06, 0x0f}, {0x08, 0x11, 0x1a, 0x0b, 0x0c, 0x1d, 0x16, 0x0f}, {0x08, 0x11, 0x1a, 0x0b, 0x0c, 0x1d, 0x16, 0x0f}, {0x08, 0x11, 0x1a, 0x0b, 0x0c, 0x1d, 0x16, 0x0f}, {0x08, 0x11, 0x1a, 0x0b, 0x0c, 0x1d, 0x16, 0x0f}, {0x08, 0x19, 0x1a, 0x0b, 0x0c, 0x15, 0x16, 0x0f}, {0x08, 0x19, 0x1a, 0x0b, 0x0c, 0x15, 0x16, 0x0f}, {0x08, 0x19, 0x1a, 0x0b, 0x0c, 0x15, 0x16, 0x0f}, {0x08, 0x19, 0x1a, 0x0b, 0x0c, 0x15, 0x16, 0x0f}, {0x08, 0x19, 0x0a, 0x0b, 0x14, 0x15, 0x16, 0x0f}, {0x08, 0x19, 0x0a, 0x0b, 0x14, 0x15, 0x16, 0x0f}, {0x08, 0x19, 0x0a, 0x0b, 0x14, 0x15, 0x16, 0x0f}, {0x08, 0x19, 0x0a, 0x0b, 0x14, 0x15, 0x16, 0x0f}, {0x08, 0x19, 0x0a, 0x03, 0x14, 0x15, 0x16, 0x1f}, {0x08, 0x19, 0x0a, 0x03, 0x14, 0x15, 0x16, 0x1f}, {0x08, 0x19, 0x0a, 0x03, 0x14, 0x15, 0x16, 0x1f}, {0x08, 0x19, 0x0a, 0x03, 0x14, 0x15, 0x16, 0x1f}, {0x08, 0x19, 0x0a, 0x03, 0x14, 0x15, 0x16, 0x1f}, {0x08, 0x19, 0x0a, 0x03, 0x14, 0x15, 0x16, 0x1f}, {0x08, 0x19, 0x0a, 0x03, 0x14, 0x15, 0x16, 0x1f}, {0x08, 0x19, 0x0a, 0x03, 0x14, 0x15, 0x16, 0x1f}, {0x08, 0x19, 0x0a, 0x03, 0x14, 0x15, 0x16, 0x1f}, {0x08, 0x19, 0x0a, 0x03, 0x14, 0x15, 0x16, 0x1f} }, { {0x10, 0x11, 0x1a, 0x1b, 0x0c, 0x1d, 0x06, 0x07}, {0x10, 0x11, 0x1a, 0x1b, 0x0c, 0x1d, 0x06, 0x07}, {0x10, 0x11, 0x1a, 0x1b, 0x0c, 0x1d, 0x06, 0x07}, {0x10, 0x11, 0x1a, 0x1b, 0x0c, 0x1d, 0x06, 0x07}, {0x10, 0x11, 0x1a, 0x1b, 0x0c, 0x1d, 0x06, 0x07}, {0x10, 0x11, 0x1a, 0x1b, 0x0c, 0x1d, 0x06, 0x07}, {0x10, 0x11, 0x1a, 0x1b, 0x0c, 0x1d, 0x06, 0x07}, {0x10, 0x11, 0x1a, 0x1b, 0x0c, 0x1d, 0x06, 0x07}, {0x10, 0x11, 0x1a, 0x1b, 0x0c, 0x1d, 0x06, 0x07}, {0x10, 0x11, 0x1a, 0x1b, 0x0c, 0x1d, 0x06, 0x07}, {0x10, 0x11, 0x1a, 0x0b, 0x0c, 0x1d, 0x06, 0x0f}, {0x10, 0x11, 0x1a, 0x0b, 0x0c, 0x1d, 0x06, 0x0f}, {0x10, 0x11, 0x1a, 0x0b, 0x0c, 0x1d, 0x06, 0x0f}, {0x10, 0x11, 0x1a, 0x0b, 0x0c, 0x1d, 0x06, 0x0f}, {0x08, 0x11, 0x1a, 0x0b, 0x0c, 0x1d, 0x16, 0x0f}, {0x08, 0x11, 0x1a, 0x0b, 0x0c, 0x1d, 0x16, 0x0f}, {0x08, 0x11, 0x1a, 0x0b, 0x0c, 0x1d, 0x16, 0x0f}, {0x08, 0x11, 0x1a, 0x0b, 0x0c, 0x1d, 0x16, 0x0f}, {0x08, 0x19, 0x1a, 0x0b, 0x0c, 0x15, 0x16, 0x0f}, {0x08, 0x19, 0x1a, 0x0b, 0x0c, 0x15, 0x16, 0x0f}, {0x08, 0x19, 0x1a, 0x0b, 0x0c, 0x15, 0x16, 0x0f}, {0x08, 0x19, 0x1a, 0x0b, 0x0c, 0x15, 0x16, 0x0f}, {0x08, 0x19, 0x0a, 0x0b, 0x14, 0x15, 0x16, 0x0f}, {0x08, 0x19, 0x0a, 0x0b, 0x14, 0x15, 0x16, 0x0f}, {0x08, 0x19, 0x0a, 0x0b, 0x14, 0x15, 0x16, 0x0f}, {0x08, 0x19, 0x0a, 0x0b, 0x14, 0x15, 0x16, 0x0f}, {0x08, 0x19, 0x0a, 0x03, 0x14, 0x15, 0x16, 0x1f}, {0x08, 0x19, 0x0a, 0x03, 0x14, 0x15, 0x16, 0x1f}, {0x08, 0x19, 0x0a, 0x03, 0x14, 0x15, 0x16, 0x1f}, {0x08, 0x19, 0x0a, 0x03, 0x14, 0x15, 0x16, 0x1f}, {0x08, 0x19, 0x0a, 0x03, 0x14, 0x15, 0x16, 0x1f}, {0x08, 0x19, 0x0a, 0x03, 0x14, 0x15, 0x16, 0x1f}, {0x08, 0x19, 0x0a, 0x03, 0x14, 0x15, 0x16, 0x1f}, {0x08, 0x19, 0x0a, 0x03, 0x14, 0x15, 0x16, 0x1f}, {0x08, 0x19, 0x0a, 0x03, 0x14, 0x15, 0x16, 0x1f}, {0x08, 0x19, 0x0a, 0x03, 0x14, 0x15, 0x16, 0x1f} }, { {0x10, 0x11, 0x1a, 0x1b, 0x0c, 0x1d, 0x06, 0x07}, {0x10, 0x11, 0x1a, 0x1b, 0x0c, 0x1d, 0x06, 0x07}, {0x10, 0x11, 0x1a, 0x1b, 0x0c, 0x1d, 0x06, 0x07}, {0x10, 0x11, 0x1a, 0x1b, 0x0c, 0x1d, 0x06, 0x07}, {0x10, 0x11, 0x1a, 0x1b, 0x0c, 0x1d, 0x06, 0x07}, {0x10, 0x11, 0x1a, 0x1b, 0x0c, 0x1d, 0x06, 0x07}, {0x10, 0x11, 0x1a, 0x1b, 0x0c, 0x1d, 0x06, 0x07}, {0x10, 0x11, 0x1a, 0x1b, 0x0c, 0x1d, 0x06, 0x07}, {0x10, 0x11, 0x1a, 0x1b, 0x0c, 0x1d, 0x06, 0x07}, {0x10, 0x11, 0x1a, 0x1b, 0x0c, 0x1d, 0x06, 0x07}, {0x10, 0x11, 0x1a, 0x0b, 0x0c, 0x1d, 0x06, 0x0f}, {0x10, 0x11, 0x1a, 0x0b, 0x0c, 0x1d, 0x06, 0x0f}, {0x10, 0x11, 0x1a, 0x0b, 0x0c, 0x1d, 0x06, 0x0f}, {0x10, 0x11, 0x1a, 0x0b, 0x0c, 0x1d, 0x06, 0x0f}, {0x08, 0x11, 0x1a, 0x0b, 0x0c, 0x1d, 0x16, 0x0f}, {0x08, 0x11, 0x1a, 0x0b, 0x0c, 0x1d, 0x16, 0x0f}, {0x08, 0x11, 0x1a, 0x0b, 0x0c, 0x1d, 0x16, 0x0f}, {0x08, 0x11, 0x1a, 0x0b, 0x0c, 0x1d, 0x16, 0x0f}, {0x08, 0x19, 0x1a, 0x0b, 0x0c, 0x15, 0x16, 0x0f}, {0x08, 0x19, 0x1a, 0x0b, 0x0c, 0x15, 0x16, 0x0f}, {0x08, 0x19, 0x1a, 0x0b, 0x0c, 0x15, 0x16, 0x0f}, {0x08, 0x19, 0x1a, 0x0b, 0x0c, 0x15, 0x16, 0x0f}, {0x08, 0x19, 0x0a, 0x0b, 0x14, 0x15, 0x16, 0x0f}, {0x08, 0x19, 0x0a, 0x0b, 0x14, 0x15, 0x16, 0x0f}, {0x08, 0x19, 0x0a, 0x0b, 0x14, 0x15, 0x16, 0x0f}, {0x08, 0x19, 0x0a, 0x0b, 0x14, 0x15, 0x16, 0x0f}, {0x08, 0x19, 0x0a, 0x03, 0x14, 0x15, 0x16, 0x1f}, {0x08, 0x19, 0x0a, 0x03, 0x14, 0x15, 0x16, 0x1f}, {0x08, 0x19, 0x0a, 0x03, 0x14, 0x15, 0x16, 0x1f}, {0x08, 0x19, 0x0a, 0x03, 0x14, 0x15, 0x16, 0x1f}, {0x08, 0x19, 0x0a, 0x03, 0x14, 0x15, 0x16, 0x1f}, {0x08, 0x19, 0x0a, 0x03, 0x14, 0x15, 0x16, 0x1f}, {0x08, 0x19, 0x0a, 0x03, 0x14, 0x15, 0x16, 0x1f}, {0x08, 0x19, 0x0a, 0x03, 0x14, 0x15, 0x16, 0x1f}, {0x08, 0x19, 0x0a, 0x03, 0x14, 0x15, 0x16, 0x1f}, {0x08, 0x19, 0x0a, 0x03, 0x14, 0x15, 0x16, 0x1f} }, { {0x10, 0x11, 0x1a, 0x1b, 0x0c, 0x1d, 0x06, 0x07}, {0x10, 0x11, 0x1a, 0x1b, 0x0c, 0x1d, 0x06, 0x07}, {0x10, 0x11, 0x1a, 0x1b, 0x0c, 0x1d, 0x06, 0x07}, {0x10, 0x11, 0x1a, 0x1b, 0x0c, 0x1d, 0x06, 0x07}, {0x10, 0x11, 0x1a, 0x1b, 0x0c, 0x1d, 0x06, 0x07}, {0x10, 0x11, 0x1a, 0x1b, 0x0c, 0x1d, 0x06, 0x07}, {0x10, 0x11, 0x1a, 0x1b, 0x0c, 0x1d, 0x06, 0x07}, {0x10, 0x11, 0x1a, 0x1b, 0x0c, 0x1d, 0x06, 0x07}, {0x10, 0x11, 0x1a, 0x1b, 0x0c, 0x1d, 0x06, 0x07}, {0x10, 0x11, 0x1a, 0x1b, 0x0c, 0x1d, 0x06, 0x07}, {0x10, 0x11, 0x1a, 0x0b, 0x0c, 0x1d, 0x06, 0x0f}, {0x10, 0x11, 0x1a, 0x0b, 0x0c, 0x1d, 0x06, 0x0f}, {0x10, 0x11, 0x1a, 0x0b, 0x0c, 0x1d, 0x06, 0x0f}, {0x10, 0x11, 0x1a, 0x0b, 0x0c, 0x1d, 0x06, 0x0f}, {0x08, 0x11, 0x1a, 0x0b, 0x0c, 0x1d, 0x16, 0x0f}, {0x08, 0x11, 0x1a, 0x0b, 0x0c, 0x1d, 0x16, 0x0f}, {0x08, 0x11, 0x1a, 0x0b, 0x0c, 0x1d, 0x16, 0x0f}, {0x08, 0x11, 0x1a, 0x0b, 0x0c, 0x1d, 0x16, 0x0f}, {0x08, 0x19, 0x1a, 0x0b, 0x0c, 0x15, 0x16, 0x0f}, {0x08, 0x19, 0x1a, 0x0b, 0x0c, 0x15, 0x16, 0x0f}, {0x08, 0x19, 0x1a, 0x0b, 0x0c, 0x15, 0x16, 0x0f}, {0x08, 0x19, 0x1a, 0x0b, 0x0c, 0x15, 0x16, 0x0f}, {0x08, 0x19, 0x0a, 0x0b, 0x14, 0x15, 0x16, 0x0f}, {0x08, 0x19, 0x0a, 0x0b, 0x14, 0x15, 0x16, 0x0f}, {0x08, 0x19, 0x0a, 0x0b, 0x14, 0x15, 0x16, 0x0f}, {0x08, 0x19, 0x0a, 0x0b, 0x14, 0x15, 0x16, 0x0f}, {0x08, 0x19, 0x0a, 0x03, 0x14, 0x15, 0x16, 0x1f}, {0x08, 0x19, 0x0a, 0x03, 0x14, 0x15, 0x16, 0x1f}, {0x08, 0x19, 0x0a, 0x03, 0x14, 0x15, 0x16, 0x1f}, {0x08, 0x19, 0x0a, 0x03, 0x14, 0x15, 0x16, 0x1f}, {0x08, 0x19, 0x0a, 0x03, 0x14, 0x15, 0x16, 0x1f}, {0x08, 0x19, 0x0a, 0x03, 0x14, 0x15, 0x16, 0x1f}, {0x08, 0x19, 0x0a, 0x03, 0x14, 0x15, 0x16, 0x1f}, {0x08, 0x19, 0x0a, 0x03, 0x14, 0x15, 0x16, 0x1f}, {0x08, 0x19, 0x0a, 0x03, 0x14, 0x15, 0x16, 0x1f}, {0x08, 0x19, 0x0a, 0x03, 0x14, 0x15, 0x16, 0x1f} }, { {0x10, 0x11, 0x1a, 0x1b, 0x0c, 0x0d, 0x06, 0x07}, {0x10, 0x11, 0x1a, 0x1b, 0x0c, 0x0d, 0x06, 0x07}, {0x10, 0x11, 0x1a, 0x1b, 0x0c, 0x0d, 0x06, 0x07}, {0x10, 0x11, 0x1a, 0x1b, 0x0c, 0x0d, 0x06, 0x07}, {0x10, 0x11, 0x1a, 0x1b, 0x0c, 0x0d, 0x06, 0x07}, {0x10, 0x11, 0x1a, 0x1b, 0x0c, 0x0d, 0x06, 0x07}, {0x10, 0x11, 0x1a, 0x1b, 0x0c, 0x0d, 0x06, 0x07}, {0x10, 0x11, 0x1a, 0x1b, 0x0c, 0x0d, 0x06, 0x07}, {0x10, 0x11, 0x1a, 0x1b, 0x0c, 0x0d, 0x06, 0x07}, {0x10, 0x11, 0x1a, 0x1b, 0x0c, 0x0d, 0x06, 0x07}, {0x10, 0x11, 0x1a, 0x0b, 0x0c, 0x0d, 0x06, 0x17}, {0x10, 0x11, 0x1a, 0x0b, 0x0c, 0x0d, 0x06, 0x17}, {0x10, 0x11, 0x1a, 0x0b, 0x0c, 0x0d, 0x06, 0x17}, {0x10, 0x11, 0x1a, 0x0b, 0x0c, 0x0d, 0x06, 0x17}, {0x08, 0x11, 0x1a, 0x0b, 0x0c, 0x0d, 0x16, 0x17}, {0x08, 0x11, 0x1a, 0x0b, 0x0c, 0x0d, 0x16, 0x17}, {0x08, 0x11, 0x1a, 0x0b, 0x0c, 0x0d, 0x16, 0x17}, {0x08, 0x11, 0x1a, 0x0b, 0x0c, 0x0d, 0x16, 0x17}, {0x08, 0x19, 0x1a, 0x0b, 0x0c, 0x05, 0x16, 0x17}, {0x08, 0x19, 0x1a, 0x0b, 0x0c, 0x05, 0x16, 0x17}, {0x08, 0x19, 0x1a, 0x0b, 0x0c, 0x05, 0x16, 0x17}, {0x08, 0x19, 0x1a, 0x0b, 0x0c, 0x05, 0x16, 0x17}, {0x08, 0x19, 0x0a, 0x0b, 0x14, 0x05, 0x16, 0x17}, {0x08, 0x19, 0x0a, 0x0b, 0x14, 0x05, 0x16, 0x17}, {0x08, 0x19, 0x0a, 0x0b, 0x14, 0x05, 0x16, 0x17}, {0x08, 0x19, 0x0a, 0x0b, 0x14, 0x05, 0x16, 0x17}, {0x08, 0x19, 0x0a, 0x03, 0x14, 0x05, 0x16, 0x1f}, {0x08, 0x19, 0x0a, 0x03, 0x14, 0x05, 0x16, 0x1f}, {0x08, 0x19, 0x0a, 0x03, 0x14, 0x05, 0x16, 0x1f}, {0x08, 0x19, 0x0a, 0x03, 0x14, 0x05, 0x16, 0x1f}, {0x08, 0x19, 0x0a, 0x03, 0x14, 0x05, 0x16, 0x1f}, {0x08, 0x19, 0x0a, 0x03, 0x14, 0x05, 0x16, 0x1f}, {0x08, 0x19, 0x0a, 0x03, 0x14, 0x05, 0x16, 0x1f}, {0x08, 0x19, 0x0a, 0x03, 0x14, 0x05, 0x16, 0x1f}, {0x08, 0x19, 0x0a, 0x03, 0x14, 0x05, 0x16, 0x1f}, {0x08, 0x19, 0x0a, 0x03, 0x14, 0x05, 0x16, 0x1f} }, { {0x10, 0x11, 0x1a, 0x1b, 0x0c, 0x0d, 0x06, 0x07}, {0x10, 0x11, 0x1a, 0x1b, 0x0c, 0x0d, 0x06, 0x07}, {0x10, 0x11, 0x1a, 0x1b, 0x0c, 0x0d, 0x06, 0x07}, {0x10, 0x11, 0x1a, 0x1b, 0x0c, 0x0d, 0x06, 0x07}, {0x10, 0x11, 0x1a, 0x1b, 0x0c, 0x0d, 0x06, 0x07}, {0x10, 0x11, 0x1a, 0x1b, 0x0c, 0x0d, 0x06, 0x07}, {0x10, 0x11, 0x1a, 0x1b, 0x0c, 0x0d, 0x06, 0x07}, {0x10, 0x11, 0x1a, 0x1b, 0x0c, 0x0d, 0x06, 0x07}, {0x10, 0x11, 0x1a, 0x1b, 0x0c, 0x0d, 0x06, 0x07}, {0x10, 0x11, 0x1a, 0x1b, 0x0c, 0x0d, 0x06, 0x17}, {0x10, 0x11, 0x1a, 0x0b, 0x0c, 0x0d, 0x06, 0x17}, {0x10, 0x11, 0x1a, 0x0b, 0x0c, 0x0d, 0x06, 0x17}, {0x10, 0x11, 0x1a, 0x0b, 0x0c, 0x0d, 0x06, 0x17}, {0x10, 0x11, 0x1a, 0x0b, 0x0c, 0x0d, 0x06, 0x17}, {0x08, 0x11, 0x1a, 0x0b, 0x0c, 0x0d, 0x16, 0x17}, {0x08, 0x11, 0x1a, 0x0b, 0x0c, 0x0d, 0x16, 0x17}, {0x08, 0x11, 0x1a, 0x0b, 0x0c, 0x0d, 0x16, 0x17}, {0x08, 0x11, 0x1a, 0x0b, 0x0c, 0x0d, 0x16, 0x17}, {0x08, 0x19, 0x1a, 0x0b, 0x0c, 0x05, 0x16, 0x17}, {0x08, 0x19, 0x1a, 0x0b, 0x0c, 0x05, 0x16, 0x17}, {0x08, 0x19, 0x1a, 0x0b, 0x0c, 0x05, 0x16, 0x17}, {0x08, 0x19, 0x1a, 0x0b, 0x0c, 0x05, 0x16, 0x17}, {0x08, 0x19, 0x0a, 0x0b, 0x14, 0x05, 0x16, 0x17}, {0x08, 0x19, 0x0a, 0x0b, 0x14, 0x05, 0x16, 0x17}, {0x08, 0x19, 0x0a, 0x0b, 0x14, 0x05, 0x16, 0x17}, {0x08, 0x19, 0x0a, 0x0b, 0x14, 0x05, 0x16, 0x17}, {0x08, 0x19, 0x0a, 0x03, 0x14, 0x05, 0x16, 0x17}, {0x08, 0x19, 0x0a, 0x03, 0x14, 0x05, 0x16, 0x1f}, {0x08, 0x19, 0x0a, 0x03, 0x14, 0x05, 0x16, 0x1f}, {0x08, 0x19, 0x0a, 0x03, 0x14, 0x05, 0x16, 0x1f}, {0x08, 0x19, 0x0a, 0x03, 0x14, 0x05, 0x16, 0x1f}, {0x08, 0x19, 0x0a, 0x03, 0x14, 0x05, 0x16, 0x1f}, {0x08, 0x19, 0x0a, 0x03, 0x14, 0x05, 0x16, 0x1f}, {0x08, 0x19, 0x0a, 0x03, 0x14, 0x05, 0x16, 0x1f}, {0x08, 0x19, 0x0a, 0x03, 0x14, 0x05, 0x16, 0x1f}, {0x08, 0x19, 0x0a, 0x03, 0x14, 0x05, 0x16, 0x1f} }, { {0x10, 0x11, 0x1a, 0x1b, 0x0c, 0x0d, 0x06, 0x07}, {0x10, 0x11, 0x1a, 0x1b, 0x0c, 0x0d, 0x06, 0x07}, {0x10, 0x11, 0x1a, 0x1b, 0x0c, 0x0d, 0x06, 0x07}, {0x10, 0x11, 0x1a, 0x1b, 0x0c, 0x0d, 0x06, 0x07}, {0x10, 0x11, 0x1a, 0x1b, 0x0c, 0x0d, 0x06, 0x07}, {0x10, 0x11, 0x1a, 0x1b, 0x0c, 0x0d, 0x06, 0x07}, {0x10, 0x11, 0x1a, 0x1b, 0x0c, 0x0d, 0x06, 0x07}, {0x10, 0x11, 0x1a, 0x1b, 0x0c, 0x0d, 0x06, 0x07}, {0x10, 0x11, 0x1a, 0x1b, 0x0c, 0x0d, 0x06, 0x17}, {0x10, 0x11, 0x1a, 0x1b, 0x0c, 0x0d, 0x06, 0x17}, {0x10, 0x11, 0x1a, 0x0b, 0x0c, 0x0d, 0x06, 0x17}, {0x10, 0x11, 0x1a, 0x0b, 0x0c, 0x0d, 0x06, 0x17}, {0x10, 0x11, 0x1a, 0x0b, 0x0c, 0x0d, 0x06, 0x17}, {0x10, 0x11, 0x1a, 0x0b, 0x0c, 0x0d, 0x06, 0x17}, {0x08, 0x11, 0x1a, 0x0b, 0x0c, 0x0d, 0x16, 0x17}, {0x08, 0x11, 0x1a, 0x0b, 0x0c, 0x0d, 0x16, 0x17}, {0x08, 0x11, 0x1a, 0x0b, 0x0c, 0x0d, 0x16, 0x17}, {0x08, 0x11, 0x1a, 0x0b, 0x0c, 0x0d, 0x16, 0x17}, {0x08, 0x19, 0x1a, 0x0b, 0x0c, 0x05, 0x16, 0x17}, {0x08, 0x19, 0x1a, 0x0b, 0x0c, 0x05, 0x16, 0x17}, {0x08, 0x19, 0x1a, 0x0b, 0x0c, 0x05, 0x16, 0x17}, {0x08, 0x19, 0x1a, 0x0b, 0x0c, 0x05, 0x16, 0x17}, {0x08, 0x19, 0x0a, 0x0b, 0x14, 0x05, 0x16, 0x17}, {0x08, 0x19, 0x0a, 0x0b, 0x14, 0x05, 0x16, 0x17}, {0x08, 0x19, 0x0a, 0x0b, 0x14, 0x05, 0x16, 0x17}, {0x08, 0x19, 0x0a, 0x0b, 0x14, 0x05, 0x16, 0x17}, {0x08, 0x19, 0x0a, 0x03, 0x14, 0x05, 0x16, 0x17}, {0x08, 0x19, 0x0a, 0x03, 0x14, 0x05, 0x16, 0x17}, {0x08, 0x19, 0x0a, 0x03, 0x14, 0x05, 0x16, 0x1f}, {0x08, 0x19, 0x0a, 0x03, 0x14, 0x05, 0x16, 0x1f}, {0x08, 0x19, 0x0a, 0x03, 0x14, 0x05, 0x16, 0x1f}, {0x08, 0x19, 0x0a, 0x03, 0x14, 0x05, 0x16, 0x1f}, {0x08, 0x19, 0x0a, 0x03, 0x14, 0x05, 0x16, 0x1f}, {0x08, 0x19, 0x0a, 0x03, 0x14, 0x05, 0x16, 0x1f}, {0x08, 0x19, 0x0a, 0x03, 0x14, 0x05, 0x16, 0x1f}, {0x08, 0x19, 0x0a, 0x03, 0x14, 0x05, 0x16, 0x1f} }, { {0x10, 0x11, 0x1a, 0x1b, 0x0c, 0x0d, 0x06, 0x07}, {0x10, 0x11, 0x1a, 0x1b, 0x0c, 0x0d, 0x06, 0x07}, {0x10, 0x11, 0x1a, 0x1b, 0x0c, 0x0d, 0x06, 0x07}, {0x10, 0x11, 0x1a, 0x1b, 0x0c, 0x0d, 0x06, 0x07}, {0x10, 0x11, 0x1a, 0x1b, 0x0c, 0x0d, 0x06, 0x07}, {0x10, 0x11, 0x1a, 0x1b, 0x0c, 0x0d, 0x06, 0x07}, {0x10, 0x11, 0x1a, 0x1b, 0x0c, 0x0d, 0x06, 0x07}, {0x10, 0x11, 0x1a, 0x1b, 0x0c, 0x0d, 0x06, 0x17}, {0x10, 0x11, 0x1a, 0x1b, 0x0c, 0x0d, 0x06, 0x17}, {0x10, 0x11, 0x1a, 0x1b, 0x0c, 0x0d, 0x06, 0x17}, {0x10, 0x11, 0x1a, 0x0b, 0x0c, 0x0d, 0x06, 0x17}, {0x10, 0x11, 0x1a, 0x0b, 0x0c, 0x0d, 0x06, 0x17}, {0x10, 0x11, 0x1a, 0x0b, 0x0c, 0x0d, 0x06, 0x17}, {0x10, 0x11, 0x1a, 0x0b, 0x0c, 0x0d, 0x06, 0x17}, {0x08, 0x11, 0x1a, 0x0b, 0x0c, 0x0d, 0x16, 0x17}, {0x08, 0x11, 0x1a, 0x0b, 0x0c, 0x0d, 0x16, 0x17}, {0x08, 0x11, 0x1a, 0x0b, 0x0c, 0x0d, 0x16, 0x17}, {0x08, 0x11, 0x1a, 0x0b, 0x0c, 0x0d, 0x16, 0x17}, {0x08, 0x19, 0x1a, 0x0b, 0x0c, 0x05, 0x16, 0x17}, {0x08, 0x19, 0x1a, 0x0b, 0x0c, 0x05, 0x16, 0x17}, {0x08, 0x19, 0x1a, 0x0b, 0x0c, 0x05, 0x16, 0x17}, {0x08, 0x19, 0x1a, 0x0b, 0x0c, 0x05, 0x16, 0x17}, {0x08, 0x19, 0x0a, 0x0b, 0x14, 0x05, 0x16, 0x17}, {0x08, 0x19, 0x0a, 0x0b, 0x14, 0x05, 0x16, 0x17}, {0x08, 0x19, 0x0a, 0x0b, 0x14, 0x05, 0x16, 0x17}, {0x08, 0x19, 0x0a, 0x0b, 0x14, 0x05, 0x16, 0x17}, {0x08, 0x19, 0x0a, 0x03, 0x14, 0x05, 0x16, 0x17}, {0x08, 0x19, 0x0a, 0x03, 0x14, 0x05, 0x16, 0x17}, {0x08, 0x19, 0x0a, 0x03, 0x14, 0x05, 0x16, 0x17}, {0x08, 0x19, 0x0a, 0x03, 0x14, 0x05, 0x16, 0x1f}, {0x08, 0x19, 0x0a, 0x03, 0x14, 0x05, 0x16, 0x1f}, {0x08, 0x19, 0x0a, 0x03, 0x14, 0x05, 0x16, 0x1f}, {0x08, 0x19, 0x0a, 0x03, 0x14, 0x05, 0x16, 0x1f}, {0x08, 0x19, 0x0a, 0x03, 0x14, 0x05, 0x16, 0x1f}, {0x08, 0x19, 0x0a, 0x03, 0x14, 0x05, 0x16, 0x1f}, {0x08, 0x19, 0x0a, 0x03, 0x14, 0x05, 0x16, 0x1f} }, { {0x10, 0x11, 0x1a, 0x1b, 0x04, 0x0d, 0x06, 0x07}, {0x10, 0x11, 0x1a, 0x1b, 0x04, 0x0d, 0x06, 0x07}, {0x10, 0x11, 0x1a, 0x1b, 0x04, 0x0d, 0x06, 0x07}, {0x10, 0x11, 0x1a, 0x1b, 0x04, 0x0d, 0x06, 0x07}, {0x10, 0x11, 0x1a, 0x1b, 0x04, 0x0d, 0x06, 0x07}, {0x10, 0x11, 0x1a, 0x1b, 0x04, 0x0d, 0x06, 0x07}, {0x10, 0x11, 0x1a, 0x1b, 0x04, 0x0d, 0x06, 0x17}, {0x10, 0x11, 0x1a, 0x1b, 0x04, 0x0d, 0x06, 0x17}, {0x10, 0x11, 0x1a, 0x1b, 0x04, 0x0d, 0x06, 0x17}, {0x10, 0x11, 0x1a, 0x1b, 0x04, 0x0d, 0x06, 0x17}, {0x10, 0x11, 0x1a, 0x0b, 0x04, 0x0d, 0x06, 0x17}, {0x10, 0x11, 0x1a, 0x0b, 0x04, 0x0d, 0x06, 0x17}, {0x10, 0x11, 0x1a, 0x0b, 0x04, 0x0d, 0x06, 0x17}, {0x10, 0x11, 0x1a, 0x0b, 0x04, 0x0d, 0x06, 0x17}, {0x18, 0x11, 0x1a, 0x0b, 0x04, 0x0d, 0x16, 0x17}, {0x18, 0x11, 0x1a, 0x0b, 0x04, 0x0d, 0x16, 0x17}, {0x18, 0x11, 0x1a, 0x0b, 0x04, 0x0d, 0x16, 0x17}, {0x18, 0x11, 0x1a, 0x0b, 0x04, 0x0d, 0x16, 0x17}, {0x18, 0x19, 0x1a, 0x0b, 0x04, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x1a, 0x0b, 0x04, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x1a, 0x0b, 0x04, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x1a, 0x0b, 0x04, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x0a, 0x0b, 0x14, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x0a, 0x0b, 0x14, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x0a, 0x0b, 0x14, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x0a, 0x0b, 0x14, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x0a, 0x03, 0x14, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x0a, 0x03, 0x14, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x0a, 0x03, 0x14, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x0a, 0x03, 0x14, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x0a, 0x03, 0x14, 0x05, 0x16, 0x1f}, {0x18, 0x19, 0x0a, 0x03, 0x14, 0x05, 0x16, 0x1f}, {0x18, 0x19, 0x0a, 0x03, 0x14, 0x05, 0x16, 0x1f}, {0x18, 0x19, 0x0a, 0x03, 0x14, 0x05, 0x16, 0x1f}, {0x18, 0x19, 0x0a, 0x03, 0x14, 0x05, 0x16, 0x1f}, {0x18, 0x19, 0x0a, 0x03, 0x14, 0x05, 0x16, 0x1f} }, { {0x10, 0x11, 0x1a, 0x1b, 0x04, 0x0d, 0x06, 0x07}, {0x10, 0x11, 0x1a, 0x1b, 0x04, 0x0d, 0x06, 0x07}, {0x10, 0x11, 0x1a, 0x1b, 0x04, 0x0d, 0x06, 0x07}, {0x10, 0x11, 0x1a, 0x1b, 0x04, 0x0d, 0x06, 0x07}, {0x10, 0x11, 0x1a, 0x1b, 0x04, 0x0d, 0x06, 0x07}, {0x10, 0x11, 0x1a, 0x1b, 0x04, 0x0d, 0x06, 0x17}, {0x10, 0x11, 0x1a, 0x1b, 0x04, 0x0d, 0x06, 0x17}, {0x10, 0x11, 0x1a, 0x1b, 0x04, 0x0d, 0x06, 0x17}, {0x10, 0x11, 0x1a, 0x1b, 0x04, 0x0d, 0x06, 0x17}, {0x10, 0x11, 0x1a, 0x1b, 0x04, 0x0d, 0x06, 0x17}, {0x10, 0x11, 0x1a, 0x0b, 0x04, 0x0d, 0x06, 0x17}, {0x10, 0x11, 0x1a, 0x0b, 0x04, 0x0d, 0x06, 0x17}, {0x10, 0x11, 0x1a, 0x0b, 0x04, 0x0d, 0x06, 0x17}, {0x18, 0x11, 0x1a, 0x0b, 0x04, 0x0d, 0x06, 0x17}, {0x18, 0x11, 0x1a, 0x0b, 0x04, 0x0d, 0x16, 0x17}, {0x18, 0x11, 0x1a, 0x0b, 0x04, 0x0d, 0x16, 0x17}, {0x18, 0x11, 0x1a, 0x0b, 0x04, 0x0d, 0x16, 0x17}, {0x18, 0x11, 0x1a, 0x0b, 0x04, 0x0d, 0x16, 0x17}, {0x18, 0x19, 0x1a, 0x0b, 0x04, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x1a, 0x0b, 0x04, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x1a, 0x0b, 0x04, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x1a, 0x0b, 0x04, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x0a, 0x0b, 0x04, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x0a, 0x0b, 0x14, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x0a, 0x0b, 0x14, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x0a, 0x0b, 0x14, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x0a, 0x03, 0x14, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x0a, 0x03, 0x14, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x0a, 0x03, 0x14, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x0a, 0x03, 0x14, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x0a, 0x03, 0x14, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x0a, 0x03, 0x14, 0x05, 0x16, 0x1f}, {0x18, 0x19, 0x0a, 0x03, 0x14, 0x05, 0x16, 0x1f}, {0x18, 0x19, 0x0a, 0x03, 0x14, 0x05, 0x16, 0x1f}, {0x18, 0x19, 0x0a, 0x03, 0x14, 0x05, 0x16, 0x1f}, {0x18, 0x19, 0x0a, 0x03, 0x14, 0x05, 0x16, 0x1f} }, { {0x10, 0x11, 0x1a, 0x1b, 0x04, 0x0d, 0x06, 0x07}, {0x10, 0x11, 0x1a, 0x1b, 0x04, 0x0d, 0x06, 0x07}, {0x10, 0x11, 0x1a, 0x1b, 0x04, 0x0d, 0x06, 0x07}, {0x10, 0x11, 0x1a, 0x1b, 0x04, 0x0d, 0x06, 0x07}, {0x10, 0x11, 0x1a, 0x1b, 0x04, 0x0d, 0x06, 0x17}, {0x10, 0x11, 0x1a, 0x1b, 0x04, 0x0d, 0x06, 0x17}, {0x10, 0x11, 0x1a, 0x1b, 0x04, 0x0d, 0x06, 0x17}, {0x10, 0x11, 0x1a, 0x1b, 0x04, 0x0d, 0x06, 0x17}, {0x10, 0x11, 0x1a, 0x1b, 0x04, 0x0d, 0x06, 0x17}, {0x10, 0x11, 0x1a, 0x1b, 0x04, 0x0d, 0x06, 0x17}, {0x10, 0x11, 0x1a, 0x0b, 0x04, 0x0d, 0x06, 0x17}, {0x10, 0x11, 0x1a, 0x0b, 0x04, 0x0d, 0x06, 0x17}, {0x18, 0x11, 0x1a, 0x0b, 0x04, 0x0d, 0x06, 0x17}, {0x18, 0x11, 0x1a, 0x0b, 0x04, 0x0d, 0x06, 0x17}, {0x18, 0x11, 0x1a, 0x0b, 0x04, 0x0d, 0x16, 0x17}, {0x18, 0x11, 0x1a, 0x0b, 0x04, 0x0d, 0x16, 0x17}, {0x18, 0x11, 0x1a, 0x0b, 0x04, 0x0d, 0x16, 0x17}, {0x18, 0x11, 0x1a, 0x0b, 0x04, 0x0d, 0x16, 0x17}, {0x18, 0x19, 0x1a, 0x0b, 0x04, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x1a, 0x0b, 0x04, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x1a, 0x0b, 0x04, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x1a, 0x0b, 0x04, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x0a, 0x0b, 0x04, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x0a, 0x0b, 0x04, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x0a, 0x0b, 0x14, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x0a, 0x0b, 0x14, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x0a, 0x03, 0x14, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x0a, 0x03, 0x14, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x0a, 0x03, 0x14, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x0a, 0x03, 0x14, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x0a, 0x03, 0x14, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x0a, 0x03, 0x14, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x0a, 0x03, 0x14, 0x05, 0x16, 0x1f}, {0x18, 0x19, 0x0a, 0x03, 0x14, 0x05, 0x16, 0x1f}, {0x18, 0x19, 0x0a, 0x03, 0x14, 0x05, 0x16, 0x1f}, {0x18, 0x19, 0x0a, 0x03, 0x14, 0x05, 0x16, 0x1f} }, { {0x10, 0x11, 0x1a, 0x1b, 0x04, 0x0d, 0x06, 0x07}, {0x10, 0x11, 0x1a, 0x1b, 0x04, 0x0d, 0x06, 0x07}, {0x10, 0x11, 0x1a, 0x1b, 0x04, 0x0d, 0x06, 0x07}, {0x10, 0x11, 0x1a, 0x1b, 0x04, 0x0d, 0x06, 0x17}, {0x10, 0x11, 0x1a, 0x1b, 0x04, 0x0d, 0x06, 0x17}, {0x10, 0x11, 0x1a, 0x1b, 0x04, 0x0d, 0x06, 0x17}, {0x10, 0x11, 0x1a, 0x1b, 0x04, 0x0d, 0x06, 0x17}, {0x10, 0x11, 0x1a, 0x1b, 0x04, 0x0d, 0x06, 0x17}, {0x10, 0x11, 0x1a, 0x1b, 0x04, 0x0d, 0x06, 0x17}, {0x10, 0x11, 0x1a, 0x1b, 0x04, 0x0d, 0x06, 0x17}, {0x10, 0x11, 0x1a, 0x0b, 0x04, 0x0d, 0x06, 0x17}, {0x18, 0x11, 0x1a, 0x0b, 0x04, 0x0d, 0x06, 0x17}, {0x18, 0x11, 0x1a, 0x0b, 0x04, 0x0d, 0x06, 0x17}, {0x18, 0x11, 0x1a, 0x0b, 0x04, 0x0d, 0x06, 0x17}, {0x18, 0x11, 0x1a, 0x0b, 0x04, 0x0d, 0x16, 0x17}, {0x18, 0x11, 0x1a, 0x0b, 0x04, 0x0d, 0x16, 0x17}, {0x18, 0x11, 0x1a, 0x0b, 0x04, 0x0d, 0x16, 0x17}, {0x18, 0x11, 0x1a, 0x0b, 0x04, 0x0d, 0x16, 0x17}, {0x18, 0x19, 0x1a, 0x0b, 0x04, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x1a, 0x0b, 0x04, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x1a, 0x0b, 0x04, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x1a, 0x0b, 0x04, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x0a, 0x0b, 0x04, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x0a, 0x0b, 0x04, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x0a, 0x0b, 0x04, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x0a, 0x0b, 0x14, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x0a, 0x03, 0x14, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x0a, 0x03, 0x14, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x0a, 0x03, 0x14, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x0a, 0x03, 0x14, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x0a, 0x03, 0x14, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x0a, 0x03, 0x14, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x0a, 0x03, 0x14, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x0a, 0x03, 0x14, 0x05, 0x16, 0x1f}, {0x18, 0x19, 0x0a, 0x03, 0x14, 0x05, 0x16, 0x1f}, {0x18, 0x19, 0x0a, 0x03, 0x14, 0x05, 0x16, 0x1f} }, { {0x10, 0x11, 0x1a, 0x1b, 0x04, 0x0d, 0x06, 0x07}, {0x10, 0x11, 0x1a, 0x1b, 0x04, 0x0d, 0x06, 0x07}, {0x10, 0x11, 0x1a, 0x1b, 0x04, 0x0d, 0x06, 0x17}, {0x10, 0x11, 0x1a, 0x1b, 0x04, 0x0d, 0x06, 0x17}, {0x10, 0x11, 0x1a, 0x1b, 0x04, 0x0d, 0x06, 0x17}, {0x10, 0x11, 0x1a, 0x1b, 0x04, 0x0d, 0x06, 0x17}, {0x10, 0x11, 0x1a, 0x1b, 0x04, 0x0d, 0x06, 0x17}, {0x10, 0x11, 0x1a, 0x1b, 0x04, 0x0d, 0x06, 0x17}, {0x10, 0x11, 0x1a, 0x1b, 0x04, 0x0d, 0x06, 0x17}, {0x10, 0x11, 0x1a, 0x1b, 0x04, 0x0d, 0x06, 0x17}, {0x18, 0x11, 0x1a, 0x0b, 0x04, 0x0d, 0x06, 0x17}, {0x18, 0x11, 0x1a, 0x0b, 0x04, 0x0d, 0x06, 0x17}, {0x18, 0x11, 0x1a, 0x0b, 0x04, 0x0d, 0x06, 0x17}, {0x18, 0x11, 0x1a, 0x0b, 0x04, 0x0d, 0x06, 0x17}, {0x18, 0x11, 0x1a, 0x0b, 0x04, 0x0d, 0x16, 0x17}, {0x18, 0x11, 0x1a, 0x0b, 0x04, 0x0d, 0x16, 0x17}, {0x18, 0x11, 0x1a, 0x0b, 0x04, 0x0d, 0x16, 0x17}, {0x18, 0x11, 0x1a, 0x0b, 0x04, 0x0d, 0x16, 0x17}, {0x18, 0x19, 0x1a, 0x0b, 0x04, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x1a, 0x0b, 0x04, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x1a, 0x0b, 0x04, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x1a, 0x0b, 0x04, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x0a, 0x0b, 0x04, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x0a, 0x0b, 0x04, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x0a, 0x0b, 0x04, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x0a, 0x0b, 0x04, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x0a, 0x03, 0x14, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x0a, 0x03, 0x14, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x0a, 0x03, 0x14, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x0a, 0x03, 0x14, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x0a, 0x03, 0x14, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x0a, 0x03, 0x14, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x0a, 0x03, 0x14, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x0a, 0x03, 0x14, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x0a, 0x03, 0x14, 0x05, 0x16, 0x1f}, {0x18, 0x19, 0x0a, 0x03, 0x14, 0x05, 0x16, 0x1f} }, { {0x10, 0x11, 0x1a, 0x1b, 0x04, 0x0d, 0x06, 0x07}, {0x10, 0x11, 0x1a, 0x1b, 0x04, 0x0d, 0x06, 0x17}, {0x10, 0x11, 0x1a, 0x1b, 0x04, 0x0d, 0x06, 0x17}, {0x10, 0x11, 0x1a, 0x1b, 0x04, 0x0d, 0x06, 0x17}, {0x10, 0x11, 0x1a, 0x1b, 0x04, 0x0d, 0x06, 0x17}, {0x10, 0x11, 0x1a, 0x1b, 0x04, 0x0d, 0x06, 0x17}, {0x10, 0x11, 0x1a, 0x1b, 0x04, 0x0d, 0x06, 0x17}, {0x10, 0x11, 0x1a, 0x1b, 0x04, 0x0d, 0x06, 0x17}, {0x10, 0x11, 0x1a, 0x1b, 0x04, 0x0d, 0x06, 0x17}, {0x18, 0x11, 0x1a, 0x1b, 0x04, 0x0d, 0x06, 0x17}, {0x18, 0x11, 0x1a, 0x0b, 0x04, 0x0d, 0x06, 0x17}, {0x18, 0x11, 0x1a, 0x0b, 0x04, 0x0d, 0x06, 0x17}, {0x18, 0x11, 0x1a, 0x0b, 0x04, 0x0d, 0x06, 0x17}, {0x18, 0x11, 0x1a, 0x0b, 0x04, 0x0d, 0x06, 0x17}, {0x18, 0x11, 0x1a, 0x0b, 0x04, 0x0d, 0x16, 0x17}, {0x18, 0x11, 0x1a, 0x0b, 0x04, 0x0d, 0x16, 0x17}, {0x18, 0x11, 0x1a, 0x0b, 0x04, 0x0d, 0x16, 0x17}, {0x18, 0x11, 0x1a, 0x0b, 0x04, 0x0d, 0x16, 0x17}, {0x18, 0x19, 0x1a, 0x0b, 0x04, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x1a, 0x0b, 0x04, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x1a, 0x0b, 0x04, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x1a, 0x0b, 0x04, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x0a, 0x0b, 0x04, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x0a, 0x0b, 0x04, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x0a, 0x0b, 0x04, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x0a, 0x0b, 0x04, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x0a, 0x03, 0x04, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x0a, 0x03, 0x14, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x0a, 0x03, 0x14, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x0a, 0x03, 0x14, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x0a, 0x03, 0x14, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x0a, 0x03, 0x14, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x0a, 0x03, 0x14, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x0a, 0x03, 0x14, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x0a, 0x03, 0x14, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x0a, 0x03, 0x14, 0x05, 0x16, 0x1f} }, { {0x10, 0x11, 0x1a, 0x1b, 0x04, 0x0d, 0x06, 0x17}, {0x10, 0x11, 0x1a, 0x1b, 0x04, 0x0d, 0x06, 0x17}, {0x10, 0x11, 0x1a, 0x1b, 0x04, 0x0d, 0x06, 0x17}, {0x10, 0x11, 0x1a, 0x1b, 0x04, 0x0d, 0x06, 0x17}, {0x10, 0x11, 0x1a, 0x1b, 0x04, 0x0d, 0x06, 0x17}, {0x10, 0x11, 0x1a, 0x1b, 0x04, 0x0d, 0x06, 0x17}, {0x10, 0x11, 0x1a, 0x1b, 0x04, 0x0d, 0x06, 0x17}, {0x10, 0x11, 0x1a, 0x1b, 0x04, 0x0d, 0x06, 0x17}, {0x18, 0x11, 0x1a, 0x1b, 0x04, 0x0d, 0x06, 0x17}, {0x18, 0x11, 0x1a, 0x1b, 0x04, 0x0d, 0x06, 0x17}, {0x18, 0x11, 0x1a, 0x0b, 0x04, 0x0d, 0x06, 0x17}, {0x18, 0x11, 0x1a, 0x0b, 0x04, 0x0d, 0x06, 0x17}, {0x18, 0x11, 0x1a, 0x0b, 0x04, 0x0d, 0x06, 0x17}, {0x18, 0x11, 0x1a, 0x0b, 0x04, 0x0d, 0x06, 0x17}, {0x18, 0x11, 0x1a, 0x0b, 0x04, 0x0d, 0x16, 0x17}, {0x18, 0x11, 0x1a, 0x0b, 0x04, 0x0d, 0x16, 0x17}, {0x18, 0x11, 0x1a, 0x0b, 0x04, 0x0d, 0x16, 0x17}, {0x18, 0x11, 0x1a, 0x0b, 0x04, 0x0d, 0x16, 0x17}, {0x18, 0x19, 0x1a, 0x0b, 0x04, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x1a, 0x0b, 0x04, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x1a, 0x0b, 0x04, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x1a, 0x0b, 0x04, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x0a, 0x0b, 0x04, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x0a, 0x0b, 0x04, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x0a, 0x0b, 0x04, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x0a, 0x0b, 0x04, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x0a, 0x03, 0x04, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x0a, 0x03, 0x04, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x0a, 0x03, 0x14, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x0a, 0x03, 0x14, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x0a, 0x03, 0x14, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x0a, 0x03, 0x14, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x0a, 0x03, 0x14, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x0a, 0x03, 0x14, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x0a, 0x03, 0x14, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x0a, 0x03, 0x14, 0x05, 0x16, 0x17} }, { {0x10, 0x11, 0x1a, 0x1b, 0x04, 0x0d, 0x06, 0x17}, {0x10, 0x11, 0x1a, 0x1b, 0x04, 0x0d, 0x06, 0x17}, {0x10, 0x11, 0x1a, 0x1b, 0x04, 0x0d, 0x06, 0x17}, {0x10, 0x11, 0x1a, 0x1b, 0x04, 0x0d, 0x06, 0x17}, {0x10, 0x11, 0x1a, 0x1b, 0x04, 0x0d, 0x06, 0x17}, {0x10, 0x11, 0x1a, 0x1b, 0x04, 0x0d, 0x06, 0x17}, {0x10, 0x11, 0x1a, 0x1b, 0x04, 0x0d, 0x06, 0x17}, {0x18, 0x11, 0x1a, 0x1b, 0x04, 0x0d, 0x06, 0x17}, {0x18, 0x11, 0x1a, 0x1b, 0x04, 0x0d, 0x06, 0x17}, {0x18, 0x11, 0x1a, 0x1b, 0x04, 0x0d, 0x06, 0x17}, {0x18, 0x11, 0x1a, 0x0b, 0x04, 0x0d, 0x06, 0x17}, {0x18, 0x11, 0x1a, 0x0b, 0x04, 0x0d, 0x06, 0x17}, {0x18, 0x11, 0x1a, 0x0b, 0x04, 0x0d, 0x06, 0x17}, {0x18, 0x11, 0x1a, 0x0b, 0x04, 0x0d, 0x06, 0x17}, {0x18, 0x11, 0x1a, 0x0b, 0x04, 0x0d, 0x16, 0x17}, {0x18, 0x11, 0x1a, 0x0b, 0x04, 0x0d, 0x16, 0x17}, {0x18, 0x11, 0x1a, 0x0b, 0x04, 0x0d, 0x16, 0x17}, {0x18, 0x11, 0x1a, 0x0b, 0x04, 0x0d, 0x16, 0x17}, {0x18, 0x19, 0x1a, 0x0b, 0x04, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x1a, 0x0b, 0x04, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x1a, 0x0b, 0x04, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x1a, 0x0b, 0x04, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x0a, 0x0b, 0x04, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x0a, 0x0b, 0x04, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x0a, 0x0b, 0x04, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x0a, 0x0b, 0x04, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x0a, 0x03, 0x04, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x0a, 0x03, 0x04, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x0a, 0x03, 0x04, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x0a, 0x03, 0x14, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x0a, 0x03, 0x14, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x0a, 0x03, 0x14, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x0a, 0x03, 0x14, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x0a, 0x03, 0x14, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x0a, 0x03, 0x14, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x0a, 0x03, 0x14, 0x05, 0x16, 0x17} }, { {0x10, 0x11, 0x1a, 0x1b, 0x04, 0x0d, 0x06, 0x17}, {0x10, 0x11, 0x1a, 0x1b, 0x04, 0x0d, 0x06, 0x17}, {0x10, 0x11, 0x1a, 0x1b, 0x04, 0x0d, 0x06, 0x17}, {0x10, 0x11, 0x1a, 0x1b, 0x04, 0x0d, 0x06, 0x17}, {0x10, 0x11, 0x1a, 0x1b, 0x04, 0x0d, 0x06, 0x17}, {0x10, 0x11, 0x1a, 0x1b, 0x04, 0x0d, 0x06, 0x17}, {0x18, 0x11, 0x1a, 0x1b, 0x04, 0x0d, 0x06, 0x17}, {0x18, 0x11, 0x1a, 0x1b, 0x04, 0x0d, 0x06, 0x17}, {0x18, 0x11, 0x1a, 0x1b, 0x04, 0x0d, 0x06, 0x17}, {0x18, 0x11, 0x1a, 0x1b, 0x04, 0x0d, 0x06, 0x17}, {0x18, 0x11, 0x1a, 0x0b, 0x04, 0x0d, 0x06, 0x17}, {0x18, 0x11, 0x1a, 0x0b, 0x04, 0x0d, 0x06, 0x17}, {0x18, 0x11, 0x1a, 0x0b, 0x04, 0x0d, 0x06, 0x17}, {0x18, 0x11, 0x1a, 0x0b, 0x04, 0x0d, 0x06, 0x17}, {0x18, 0x11, 0x1a, 0x0b, 0x04, 0x0d, 0x16, 0x17}, {0x18, 0x11, 0x1a, 0x0b, 0x04, 0x0d, 0x16, 0x17}, {0x18, 0x11, 0x1a, 0x0b, 0x04, 0x0d, 0x16, 0x17}, {0x18, 0x11, 0x1a, 0x0b, 0x04, 0x0d, 0x16, 0x17}, {0x18, 0x19, 0x1a, 0x0b, 0x04, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x1a, 0x0b, 0x04, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x1a, 0x0b, 0x04, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x1a, 0x0b, 0x04, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x0a, 0x0b, 0x04, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x0a, 0x0b, 0x04, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x0a, 0x0b, 0x04, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x0a, 0x0b, 0x04, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x0a, 0x03, 0x04, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x0a, 0x03, 0x04, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x0a, 0x03, 0x04, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x0a, 0x03, 0x04, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x0a, 0x03, 0x04, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x0a, 0x03, 0x14, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x0a, 0x03, 0x14, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x0a, 0x03, 0x14, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x0a, 0x03, 0x14, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x0a, 0x03, 0x14, 0x05, 0x16, 0x17} }, { {0x10, 0x11, 0x1a, 0x1b, 0x04, 0x0d, 0x06, 0x17}, {0x10, 0x11, 0x1a, 0x1b, 0x04, 0x0d, 0x06, 0x17}, {0x10, 0x11, 0x1a, 0x1b, 0x04, 0x0d, 0x06, 0x17}, {0x10, 0x11, 0x1a, 0x1b, 0x04, 0x0d, 0x06, 0x17}, {0x10, 0x11, 0x1a, 0x1b, 0x04, 0x0d, 0x06, 0x17}, {0x18, 0x11, 0x1a, 0x1b, 0x04, 0x0d, 0x06, 0x17}, {0x18, 0x11, 0x1a, 0x1b, 0x04, 0x0d, 0x06, 0x17}, {0x18, 0x11, 0x1a, 0x1b, 0x04, 0x0d, 0x06, 0x17}, {0x18, 0x11, 0x1a, 0x1b, 0x04, 0x0d, 0x06, 0x17}, {0x18, 0x11, 0x1a, 0x1b, 0x04, 0x0d, 0x06, 0x17}, {0x18, 0x11, 0x1a, 0x0b, 0x04, 0x0d, 0x06, 0x17}, {0x18, 0x11, 0x1a, 0x0b, 0x04, 0x0d, 0x06, 0x17}, {0x18, 0x11, 0x1a, 0x0b, 0x04, 0x0d, 0x06, 0x17}, {0x18, 0x11, 0x1a, 0x0b, 0x04, 0x0d, 0x06, 0x17}, {0x18, 0x11, 0x1a, 0x0b, 0x04, 0x0d, 0x16, 0x17}, {0x18, 0x11, 0x1a, 0x0b, 0x04, 0x0d, 0x16, 0x17}, {0x18, 0x11, 0x1a, 0x0b, 0x04, 0x0d, 0x16, 0x17}, {0x18, 0x11, 0x1a, 0x0b, 0x04, 0x0d, 0x16, 0x17}, {0x18, 0x19, 0x1a, 0x0b, 0x04, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x1a, 0x0b, 0x04, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x1a, 0x0b, 0x04, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x1a, 0x0b, 0x04, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x0a, 0x0b, 0x04, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x0a, 0x0b, 0x04, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x0a, 0x0b, 0x04, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x0a, 0x0b, 0x04, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x0a, 0x03, 0x04, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x0a, 0x03, 0x04, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x0a, 0x03, 0x04, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x0a, 0x03, 0x04, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x0a, 0x03, 0x04, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x0a, 0x03, 0x04, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x0a, 0x03, 0x14, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x0a, 0x03, 0x14, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x0a, 0x03, 0x14, 0x05, 0x16, 0x17}, {0x18, 0x19, 0x0a, 0x03, 0x14, 0x05, 0x16, 0x17} } }, { /* 7,200bps map */ { {0x08, 0x09, 0x0a, 0x03, 0x0c, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x0c, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x0c, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x0c, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x0c, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x0c, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x0c, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x0c, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x0c, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x0b, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x0b, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x0b, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x0b, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x0b, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x0b, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x0b, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x0b, 0x04, 0x0d, 0x06, 0x0f} }, { {0x08, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x08, 0x09, 0x0a, 0x03, 0x0c, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x0c, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x0c, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x0c, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x0c, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x0c, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x0c, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x0c, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x0c, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x0b, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x0b, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x0b, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x0b, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x0b, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x0b, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x0b, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x0b, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x0f} }, { {0x08, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x08, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x08, 0x09, 0x0a, 0x03, 0x0c, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x0c, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x0c, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x0c, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x0c, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x0c, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x0c, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x0c, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x0c, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x0b, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x0b, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x0b, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x0b, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x0b, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x0b, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x0b, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x0b, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x0f}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x0f} }, { {0x08, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x08, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x08, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x08, 0x09, 0x0a, 0x03, 0x0c, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x0c, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x0c, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x0c, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x0c, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x0c, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x0c, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x0c, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x0c, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x0b, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x0b, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x0b, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x0b, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x0b, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x0b, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x0b, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x0b, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x0f}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x0f}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x0f} }, { {0x08, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x08, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x08, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x08, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x08, 0x09, 0x0a, 0x03, 0x0c, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x0c, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x0c, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x0c, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x0c, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x0c, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x0c, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x0c, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x0c, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x0b, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x0b, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x0b, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x0b, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x0b, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x0b, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x0b, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x0b, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x0f}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x0f}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x0f}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x0f} }, { {0x08, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x08, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x08, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x08, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x08, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x08, 0x09, 0x0a, 0x03, 0x0c, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x0c, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x0c, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x0c, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x0c, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x0c, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x0c, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x0c, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x0c, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x0b, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x0b, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x0b, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x0b, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x0b, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x0b, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x0b, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x0b, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x0f}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x0f}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x0f}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x0f}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x0f} }, { {0x08, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x08, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x08, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x08, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x08, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x08, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x08, 0x09, 0x0a, 0x03, 0x0c, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x0c, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x0c, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x0c, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x0c, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x0c, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x0c, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x0c, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x0b, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x0b, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x0b, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x0b, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x0b, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x0b, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x0b, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x0b, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x0f}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x0f}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x0f}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x0f}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x0f}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x0f} }, { {0x08, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x08, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x08, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x08, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x08, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x08, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x08, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x08, 0x09, 0x0a, 0x03, 0x0c, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x0c, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x0c, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x0c, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x0c, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x0c, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x0c, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x0c, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x0b, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x0b, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x0b, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x0b, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x0b, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x0b, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x0b, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x0b, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x0f}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x0f}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x0f}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x0f}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x0f}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x0f}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x0f} }, { {0x08, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x08, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x08, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x08, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x08, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x08, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x08, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x08, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x08, 0x09, 0x0a, 0x03, 0x0c, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x0c, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x0c, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x0c, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x0c, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x0c, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x0c, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x0c, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x0c, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x0b, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x0b, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x0b, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x0b, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x0b, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x0b, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x0b, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x0b, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x0f}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x0f}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x0f}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x0f}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x0f}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x0f}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x0f}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x0f} }, { {0x00, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x08, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x08, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x08, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x08, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x08, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x08, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x08, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x08, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x08, 0x09, 0x0a, 0x03, 0x0c, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x0c, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x0c, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x0c, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x0c, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x0c, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x0c, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x0c, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x0c, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x0b, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x0b, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x0b, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x0b, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x0b, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x0b, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x0b, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x0b, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x0f}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x0f}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x0f}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x0f}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x0f}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x0f}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x0f}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x0f}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x07} }, { {0x00, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x08, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x08, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x08, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x08, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x08, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x08, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x08, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x08, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x08, 0x09, 0x0a, 0x03, 0x0c, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x0c, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x0c, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x0c, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x0c, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x0c, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x0c, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x0c, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x0b, 0x0c, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x0b, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x0b, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x0b, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x0b, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x0b, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x0b, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x0b, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x0f}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x0f}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x0f}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x0f}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x0f}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x0f}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x0f}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x0f}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x07} }, { {0x00, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x08, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x08, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x08, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x08, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x08, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x08, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x08, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x08, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x08, 0x09, 0x0a, 0x03, 0x0c, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x0c, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x0c, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x0c, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x0c, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x0c, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x0b, 0x0c, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x0b, 0x0c, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x0b, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x0b, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x0b, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x0b, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x0b, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x0b, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x0f}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x0f}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x0f}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x0f}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x0f}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x0f}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x0f}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x0f}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x07} }, { {0x00, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x08, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x08, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x08, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x08, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x08, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x08, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x08, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x08, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x08, 0x09, 0x0a, 0x03, 0x0c, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x0c, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x0c, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x0c, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x0b, 0x0c, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x0b, 0x0c, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x0b, 0x0c, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x0b, 0x0c, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x0b, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x0b, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x0b, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x0b, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x0f}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x0f}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x0f}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x0f}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x0f}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x0f}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x0f}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x0f}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x07} }, { {0x00, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x08, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x08, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x08, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x08, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x08, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x08, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x08, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x08, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x08, 0x09, 0x0a, 0x03, 0x0c, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x03, 0x0c, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x0b, 0x0c, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x0b, 0x0c, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x0b, 0x0c, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x0b, 0x0c, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x0b, 0x0c, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x0b, 0x0c, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x0b, 0x0c, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x0b, 0x04, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x0f}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x0f}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x0f}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x0f}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x0f}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x0f}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x0f}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x0f}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x07} }, { {0x00, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x08, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x08, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x08, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x08, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x08, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x08, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x08, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x0b, 0x0c, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x0b, 0x0c, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x0b, 0x0c, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x0b, 0x0c, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x0b, 0x0c, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x0b, 0x0c, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x0b, 0x0c, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x02, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x0f}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x0f}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x0f}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x0f}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x0f}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x0f}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x0f}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x07} }, { {0x00, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x08, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x08, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x08, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x08, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x08, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x05, 0x06, 0x0f}, {0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x05, 0x06, 0x0f}, {0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x0b, 0x0c, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x0b, 0x0c, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x0b, 0x0c, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x0b, 0x0c, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x0b, 0x0c, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x02, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f}, {0x08, 0x01, 0x02, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f}, {0x08, 0x01, 0x02, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x0f}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x0f}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x0f}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x0f}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x0f}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x07} }, { {0x00, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x08, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x08, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x08, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x08, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x05, 0x06, 0x0f}, {0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x05, 0x06, 0x0f}, {0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x05, 0x06, 0x0f}, {0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x05, 0x06, 0x0f}, {0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x0b, 0x0c, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x0b, 0x0c, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x0b, 0x0c, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x02, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f}, {0x08, 0x01, 0x02, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f}, {0x08, 0x01, 0x02, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f}, {0x08, 0x01, 0x02, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f}, {0x08, 0x01, 0x02, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x0f}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x0f}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x0f}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x07} }, { {0x00, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x08, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x08, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x05, 0x06, 0x0f}, {0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x05, 0x06, 0x0f}, {0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x05, 0x06, 0x0f}, {0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x05, 0x06, 0x0f}, {0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x05, 0x06, 0x0f}, {0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x05, 0x06, 0x0f}, {0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x0a, 0x0b, 0x0c, 0x0d, 0x06, 0x0f}, {0x08, 0x01, 0x02, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f}, {0x08, 0x01, 0x02, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f}, {0x08, 0x01, 0x02, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f}, {0x08, 0x01, 0x02, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f}, {0x08, 0x01, 0x02, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f}, {0x08, 0x01, 0x02, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f}, {0x08, 0x01, 0x02, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x0f}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x07} }, { {0x00, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x05, 0x06, 0x0f}, {0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x05, 0x06, 0x0f}, {0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x05, 0x06, 0x0f}, {0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x05, 0x06, 0x0f}, {0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x05, 0x06, 0x0f}, {0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x05, 0x06, 0x0f}, {0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x05, 0x06, 0x0f}, {0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x05, 0x06, 0x0f}, {0x08, 0x09, 0x02, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f}, {0x08, 0x01, 0x02, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f}, {0x08, 0x01, 0x02, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f}, {0x08, 0x01, 0x02, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f}, {0x08, 0x01, 0x02, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f}, {0x08, 0x01, 0x02, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f}, {0x08, 0x01, 0x02, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f}, {0x08, 0x01, 0x02, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f}, {0x08, 0x01, 0x02, 0x0b, 0x0c, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x07} }, { {0x00, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x0b, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x0b, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x0b, 0x0c, 0x05, 0x06, 0x0f}, {0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x05, 0x06, 0x0f}, {0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x05, 0x06, 0x0f}, {0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x05, 0x06, 0x0f}, {0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x05, 0x06, 0x0f}, {0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x05, 0x06, 0x0f}, {0x08, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x0f}, {0x08, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x0f}, {0x08, 0x09, 0x02, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f}, {0x08, 0x01, 0x02, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f}, {0x08, 0x01, 0x02, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f}, {0x08, 0x01, 0x02, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f}, {0x08, 0x01, 0x02, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f}, {0x08, 0x01, 0x02, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f}, {0x08, 0x01, 0x02, 0x0b, 0x0c, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x0c, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x0c, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x07} }, { {0x00, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x0b, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x0b, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x0b, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x0b, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x0b, 0x0c, 0x05, 0x06, 0x0f}, {0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x05, 0x06, 0x0f}, {0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x05, 0x06, 0x0f}, {0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x05, 0x06, 0x0f}, {0x08, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x0f}, {0x08, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x0f}, {0x08, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x0f}, {0x08, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x0f}, {0x08, 0x09, 0x02, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f}, {0x08, 0x01, 0x02, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f}, {0x08, 0x01, 0x02, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f}, {0x08, 0x01, 0x02, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f}, {0x08, 0x01, 0x02, 0x0b, 0x0c, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x0c, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x0c, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x0c, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x0c, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x07} }, { {0x00, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x0b, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x0b, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x0b, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x0b, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x0b, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x0b, 0x0c, 0x05, 0x06, 0x0f}, {0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x05, 0x06, 0x0f}, {0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x05, 0x06, 0x0f}, {0x08, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x0f}, {0x08, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x0f}, {0x08, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x0f}, {0x08, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x0f}, {0x08, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x0f}, {0x08, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x0f}, {0x08, 0x09, 0x02, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f}, {0x08, 0x01, 0x02, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f}, {0x08, 0x01, 0x02, 0x0b, 0x0c, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x0c, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x0c, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x0c, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x0c, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x0c, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x0c, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x07} }, { {0x00, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x0b, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x0b, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x0b, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x0b, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x0b, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x0b, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x0b, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x0b, 0x0c, 0x05, 0x06, 0x0f}, {0x08, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x0f}, {0x08, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x0f}, {0x08, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x0f}, {0x08, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x0f}, {0x08, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x0f}, {0x08, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x0f}, {0x08, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x0f}, {0x08, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x0f}, {0x08, 0x09, 0x02, 0x0b, 0x0c, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x0c, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x0c, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x0c, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x0c, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x0c, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x0c, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x0c, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x0c, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x07} }, { {0x00, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x0b, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x0b, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x0b, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x0b, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x0b, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x0b, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x0b, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x0b, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x0f}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x0f}, {0x08, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x0f}, {0x08, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x0f}, {0x08, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x0f}, {0x08, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x0f}, {0x08, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x0f}, {0x08, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x0f}, {0x08, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x08, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x08, 0x09, 0x02, 0x0b, 0x0c, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x0c, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x0c, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x0c, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x0c, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x0c, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x0c, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x0c, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x0c, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x07} }, { {0x00, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x0b, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x0b, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x0b, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x0b, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x0b, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x0b, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x0b, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x0b, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x0f}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x0f}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x0f}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x0f}, {0x08, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x0f}, {0x08, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x0f}, {0x08, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x0f}, {0x08, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x0f}, {0x08, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x08, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x08, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x08, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x08, 0x09, 0x02, 0x0b, 0x0c, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x0c, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x0c, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x0c, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x0c, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x0c, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x0c, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x0c, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x0c, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x07} }, { {0x00, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x0b, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x0b, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x0b, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x0b, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x0b, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x0b, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x0b, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x0b, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x0f}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x0f}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x0f}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x0f}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x0f}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x0f}, {0x08, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x0f}, {0x08, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x0f}, {0x08, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x08, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x08, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x08, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x08, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x08, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x08, 0x09, 0x02, 0x0b, 0x0c, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x0c, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x0c, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x0c, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x0c, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x0c, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x0c, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x0c, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x0c, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x07} }, { {0x00, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x0b, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x0b, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x0b, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x0b, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x0b, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x0b, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x0b, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x0b, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x0f}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x0f}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x0f}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x0f}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x0f}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x0f}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x0f}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x0f}, {0x08, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x08, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x08, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x08, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x08, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x08, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x08, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x08, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x08, 0x09, 0x02, 0x0b, 0x0c, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x0c, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x0c, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x0c, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x0c, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x0c, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x0c, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x0c, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x07} }, { {0x00, 0x09, 0x0a, 0x03, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x0b, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x0b, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x0b, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x0b, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x0b, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x0b, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x0b, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x0b, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x0f}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x0f}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x0f}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x0f}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x0f}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x0f}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x0f}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x0f}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x08, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x08, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x08, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x08, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x08, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x08, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x08, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x08, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x08, 0x09, 0x02, 0x0b, 0x0c, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x0c, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x0c, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x0c, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x0c, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x0c, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x0c, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x0c, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x04, 0x0d, 0x0e, 0x07} }, { {0x00, 0x09, 0x0a, 0x0b, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x0b, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x0b, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x0b, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x0b, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x0b, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x0b, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x0b, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x0f}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x0f}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x0f}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x0f}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x0f}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x0f}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x0f}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x0f}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x08, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x08, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x08, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x08, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x08, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x08, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x08, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x08, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x08, 0x09, 0x02, 0x0b, 0x0c, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x0c, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x0c, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x0c, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x0c, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x0c, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x0c, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x0c, 0x0d, 0x0e, 0x07} }, { {0x00, 0x09, 0x0a, 0x0b, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x0b, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x0b, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x0b, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x0b, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x0b, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x0b, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x0f}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x0f}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x0f}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x0f}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x0f}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x0f}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x0f}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x0f}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x08, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x08, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x08, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x08, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x08, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x08, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x08, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x08, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x08, 0x09, 0x02, 0x0b, 0x0c, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x0c, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x0c, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x0c, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x0c, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x0c, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x0c, 0x0d, 0x0e, 0x07} }, { {0x00, 0x09, 0x0a, 0x0b, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x0b, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x0b, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x0b, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x0b, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x0b, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x0f}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x0f}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x0f}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x0f}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x0f}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x0f}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x0f}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x0f}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x08, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x08, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x08, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x08, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x08, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x08, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x08, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x08, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x08, 0x09, 0x02, 0x0b, 0x0c, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x0c, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x0c, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x0c, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x0c, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x0c, 0x0d, 0x0e, 0x07} }, { {0x00, 0x09, 0x0a, 0x0b, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x0b, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x0b, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x0b, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x0b, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x0f}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x0f}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x0f}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x0f}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x0f}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x0f}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x0f}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x0f}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x08, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x08, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x08, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x08, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x08, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x08, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x08, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x08, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x08, 0x09, 0x02, 0x0b, 0x0c, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x0c, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x0c, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x0c, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x0c, 0x0d, 0x0e, 0x07} }, { {0x00, 0x09, 0x0a, 0x0b, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x0b, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x0b, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x0b, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x0f}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x0f}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x0f}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x0f}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x0f}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x0f}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x0f}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x0f}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x08, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x08, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x08, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x08, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x08, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x08, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x08, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x08, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x08, 0x09, 0x02, 0x0b, 0x0c, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x0c, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x0c, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x0c, 0x0d, 0x0e, 0x07} }, { {0x00, 0x09, 0x0a, 0x0b, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x0b, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x0b, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x0f}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x0f}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x0f}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x0f}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x0f}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x0f}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x0f}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x0f}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x08, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x08, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x08, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x08, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x08, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x08, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x08, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x08, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x08, 0x09, 0x02, 0x0b, 0x0c, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x0c, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x0c, 0x0d, 0x0e, 0x07} }, { {0x00, 0x09, 0x0a, 0x0b, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x0a, 0x0b, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x0f}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x0f}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x0f}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x0f}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x0f}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x0f}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x0f}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x0f}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x08, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x08, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x08, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x08, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x08, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x08, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x08, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x08, 0x09, 0x02, 0x0b, 0x0c, 0x0d, 0x0e, 0x07}, {0x08, 0x01, 0x02, 0x0b, 0x0c, 0x0d, 0x0e, 0x07} }, { {0x00, 0x09, 0x0a, 0x0b, 0x0c, 0x05, 0x06, 0x0f}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x0f}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x0f}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x0f}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x0f}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x0f}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x0f}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x0f}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x0f}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x00, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x08, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x08, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x08, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x08, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x08, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x08, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x08, 0x09, 0x02, 0x0b, 0x0c, 0x05, 0x0e, 0x07}, {0x08, 0x09, 0x02, 0x0b, 0x0c, 0x0d, 0x0e, 0x07} } } }; /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/awgn.c0000644000175000017500000001042611150047216016760 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * awgn.c - An additive Gaussian white noise generator * * Written by Steve Underwood * * Copyright (C) 2001 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: awgn.c,v 1.16 2008/07/02 14:48:25 steveu Exp $ */ /*! \file */ /* This code is based on some demonstration code in a research paper somewhere. I can't track down where I got the original from, so that due recognition can be given. The original had no explicit copyright notice, and I hope nobody objects to its use here. Having a reasonable Gaussian noise generator is pretty important for telephony testing (in fact, pretty much any DSP testing), and this one seems to have served me OK. Since the generation of Gaussian noise is only for test purposes, and not a core system component, I don't intend to worry excessively about copyright issues, unless someone worries me. The non-core nature of this code also explains why it is unlikely to ever be optimised. */ #if defined(HAVE_CONFIG_H) #include #endif #include #include #include "floating_fudge.h" #if defined(HAVE_TGMATH_H) #include #endif #if defined(HAVE_MATH_H) #include #endif #include "spandsp/telephony.h" #include "spandsp/dc_restore.h" #include "spandsp/awgn.h" /* Gaussian noise generator constants */ #define M1 259200 #define IA1 7141 #define IC1 54773 #define RM1 (1.0/M1) #define M2 134456 #define IA2 8121 #define IC2 28411 #define RM2 (1.0/M2) #define M3 243000 #define IA3 4561 #define IC3 51349 static double ran1(awgn_state_t *s) { double temp; int j; s->ix1 = (IA1*s->ix1 + IC1)%M1; s->ix2 = (IA2*s->ix2 + IC2)%M2; s->ix3 = (IA3*s->ix3 + IC3)%M3; j = 1 + ((97*s->ix3)/M3); if (j > 97 || j < 1) { /* Error */ return -1; } temp = s->r[j]; s->r[j] = (s->ix1 + s->ix2*RM2)*RM1; return temp; } /*- End of function --------------------------------------------------------*/ awgn_state_t *awgn_init_dbm0(awgn_state_t *s, int idum, float level) { return awgn_init_dbov(s, idum, level - DBM0_MAX_POWER); } /*- End of function --------------------------------------------------------*/ awgn_state_t *awgn_init_dbov(awgn_state_t *s, int idum, float level) { int j; if (s == NULL) { if ((s = (awgn_state_t *) malloc(sizeof(*s))) == NULL) return NULL; } if (idum < 0) idum = -idum; s->rms = pow(10.0, level/20.0)*32768.0; s->ix1 = (IC1 + idum)%M1; s->ix1 = (IA1*s->ix1 + IC1)%M1; s->ix2 = s->ix1%M2; s->ix1 = (IA1*s->ix1 + IC1)%M1; s->ix3 = s->ix1%M3; s->r[0] = 0.0; for (j = 1; j <= 97; j++) { s->ix1 = (IA1*s->ix1 + IC1)%M1; s->ix2 = (IA2*s->ix2 + IC2)%M2; s->r[j] = (s->ix1 + s->ix2*RM2)*RM1; } s->gset = 0.0; s->iset = 0; return s; } /*- End of function --------------------------------------------------------*/ int16_t awgn(awgn_state_t *s) { double fac; double r; double v1; double v2; double amp; if (s->iset == 0) { do { v1 = 2.0*ran1(s) - 1.0; v2 = 2.0*ran1(s) - 1.0; r = v1*v1 + v2*v2; } while (r >= 1.0); fac = sqrt(-2.0*log(r)/r); s->gset = v1*fac; s->iset = 1; amp = v2*fac*s->rms; } else { s->iset = 0; amp = s->gset*s->rms; } return fsaturate(amp); } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/t30_api.c0000644000175000017500000004741411150047216017272 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * t30_api.c - ITU T.30 FAX transfer processing * * Written by Steve Underwood * * Copyright (C) 2003, 2004, 2005, 2006, 2007 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: t30_api.c,v 1.7 2008/07/02 14:48:26 steveu Exp $ */ /*! \file */ #if defined(HAVE_CONFIG_H) #include #endif #include #include #include #include #include #include #include "floating_fudge.h" #if defined(HAVE_TGMATH_H) #include #endif #if defined(HAVE_MATH_H) #include #endif #include #include "spandsp/telephony.h" #include "spandsp/logging.h" #include "spandsp/bit_operations.h" #include "spandsp/queue.h" #include "spandsp/power_meter.h" #include "spandsp/complex.h" #include "spandsp/tone_generate.h" #include "spandsp/async.h" #include "spandsp/hdlc.h" #include "spandsp/fsk.h" #include "spandsp/v29rx.h" #include "spandsp/v29tx.h" #include "spandsp/v27ter_rx.h" #include "spandsp/v27ter_tx.h" #include "spandsp/t4.h" #include "spandsp/t30_fcf.h" #include "spandsp/t35.h" #include "spandsp/t30.h" #include "spandsp/t30_api.h" #include "spandsp/t30_logging.h" #include "t30_local.h" int t30_set_tx_ident(t30_state_t *s, const char *id) { if (id == NULL) { s->tx_info.ident[0] = '\0'; return 0; } if (strlen(id) > T30_MAX_IDENT_LEN) return -1; strcpy(s->tx_info.ident, id); t4_tx_set_local_ident(&(s->t4), s->tx_info.ident); return 0; } /*- End of function --------------------------------------------------------*/ const char *t30_get_tx_ident(t30_state_t *s) { if (s->tx_info.ident[0] == '\0') return NULL; return s->tx_info.ident; } /*- End of function --------------------------------------------------------*/ const char *t30_get_rx_ident(t30_state_t *s) { if (s->rx_info.ident[0] == '\0') return NULL; return s->rx_info.ident; } /*- End of function --------------------------------------------------------*/ int t30_set_tx_sub_address(t30_state_t *s, const char *sub_address) { if (sub_address == NULL) { s->tx_info.sub_address[0] = '\0'; return 0; } if (strlen(sub_address) > T30_MAX_IDENT_LEN) return -1; strcpy(s->tx_info.sub_address, sub_address); return 0; } /*- End of function --------------------------------------------------------*/ const char *t30_get_tx_sub_address(t30_state_t *s) { if (s->tx_info.sub_address[0] == '\0') return NULL; return s->tx_info.sub_address; } /*- End of function --------------------------------------------------------*/ const char *t30_get_rx_sub_address(t30_state_t *s) { if (s->rx_info.sub_address[0] == '\0') return NULL; return s->rx_info.sub_address; } /*- End of function --------------------------------------------------------*/ int t30_set_tx_selective_polling_address(t30_state_t *s, const char *selective_polling_address) { if (selective_polling_address == NULL) { s->tx_info.selective_polling_address[0] = '\0'; return 0; } if (strlen(selective_polling_address) > T30_MAX_IDENT_LEN) return -1; strcpy(s->tx_info.selective_polling_address, selective_polling_address); return 0; } /*- End of function --------------------------------------------------------*/ const char *t30_get_tx_selective_polling_address(t30_state_t *s) { if (s->tx_info.selective_polling_address[0] == '\0') return NULL; return s->tx_info.selective_polling_address; } /*- End of function --------------------------------------------------------*/ const char *t30_get_rx_selective_polling_address(t30_state_t *s) { if (s->rx_info.selective_polling_address[0] == '\0') return NULL; return s->rx_info.selective_polling_address; } /*- End of function --------------------------------------------------------*/ int t30_set_tx_polled_sub_address(t30_state_t *s, const char *polled_sub_address) { if (polled_sub_address == NULL) { s->tx_info.polled_sub_address[0] = '\0'; return 0; } if (strlen(polled_sub_address) > T30_MAX_IDENT_LEN) return -1; strcpy(s->tx_info.polled_sub_address, polled_sub_address); return 0; } /*- End of function --------------------------------------------------------*/ const char *t30_get_tx_polled_sub_address(t30_state_t *s) { if (s->tx_info.polled_sub_address[0] == '\0') return NULL; return s->tx_info.polled_sub_address; } /*- End of function --------------------------------------------------------*/ const char *t30_get_rx_polled_sub_address(t30_state_t *s) { if (s->rx_info.polled_sub_address[0] == '\0') return NULL; return s->rx_info.polled_sub_address; } /*- End of function --------------------------------------------------------*/ int t30_set_tx_sender_ident(t30_state_t *s, const char *sender_ident) { if (sender_ident == NULL) { s->tx_info.sender_ident[0] = '\0'; return 0; } if (strlen(sender_ident) > T30_MAX_IDENT_LEN) return -1; strcpy(s->tx_info.sender_ident, sender_ident); return 0; } /*- End of function --------------------------------------------------------*/ const char *t30_get_tx_sender_ident(t30_state_t *s) { if (s->tx_info.sender_ident[0] == '\0') return NULL; return s->tx_info.sender_ident; } /*- End of function --------------------------------------------------------*/ const char *t30_get_rx_sender_ident(t30_state_t *s) { if (s->rx_info.sender_ident[0] == '\0') return NULL; return s->rx_info.sender_ident; } /*- End of function --------------------------------------------------------*/ int t30_set_tx_password(t30_state_t *s, const char *password) { if (password == NULL) { s->tx_info.password[0] = '\0'; return 0; } if (strlen(password) > T30_MAX_IDENT_LEN) return -1; strcpy(s->tx_info.password, password); return 0; } /*- End of function --------------------------------------------------------*/ const char *t30_get_tx_password(t30_state_t *s) { if (s->tx_info.password[0] == '\0') return NULL; return s->tx_info.password; } /*- End of function --------------------------------------------------------*/ const char *t30_get_rx_password(t30_state_t *s) { if (s->rx_info.password[0] == '\0') return NULL; return s->rx_info.password; } /*- End of function --------------------------------------------------------*/ int t30_set_tx_nsf(t30_state_t *s, const uint8_t *nsf, int len) { if (s->tx_info.nsf) free(s->tx_info.nsf); if (nsf && len > 0 && (s->tx_info.nsf = malloc(len + 3))) { memcpy(s->tx_info.nsf + 3, nsf, len); s->tx_info.nsf_len = len; } else { s->tx_info.nsf = NULL; s->tx_info.nsf_len = 0; } return 0; } /*- End of function --------------------------------------------------------*/ size_t t30_get_tx_nsf(t30_state_t *s, const uint8_t *nsf[]) { if (nsf) *nsf = s->tx_info.nsf; return s->tx_info.nsf_len; } /*- End of function --------------------------------------------------------*/ size_t t30_get_rx_nsf(t30_state_t *s, const uint8_t *nsf[]) { if (nsf) *nsf = s->rx_info.nsf; return s->rx_info.nsf_len; } /*- End of function --------------------------------------------------------*/ int t30_set_tx_nsc(t30_state_t *s, const uint8_t *nsc, int len) { if (s->tx_info.nsc) free(s->tx_info.nsc); if (nsc && len > 0 && (s->tx_info.nsc = malloc(len + 3))) { memcpy(s->tx_info.nsc + 3, nsc, len); s->tx_info.nsc_len = len; } else { s->tx_info.nsc = NULL; s->tx_info.nsc_len = 0; } return 0; } /*- End of function --------------------------------------------------------*/ size_t t30_get_tx_nsc(t30_state_t *s, const uint8_t *nsc[]) { if (nsc) *nsc = s->tx_info.nsc; return s->tx_info.nsc_len; } /*- End of function --------------------------------------------------------*/ size_t t30_get_rx_nsc(t30_state_t *s, const uint8_t *nsc[]) { if (nsc) *nsc = s->rx_info.nsc; return s->rx_info.nsc_len; } /*- End of function --------------------------------------------------------*/ int t30_set_tx_nss(t30_state_t *s, const uint8_t *nss, int len) { if (s->tx_info.nss) free(s->tx_info.nss); if (nss && len > 0 && (s->tx_info.nss = malloc(len + 3))) { memcpy(s->tx_info.nss + 3, nss, len); s->tx_info.nss_len = len; } else { s->tx_info.nss = NULL; s->tx_info.nss_len = 0; } return 0; } /*- End of function --------------------------------------------------------*/ size_t t30_get_tx_nss(t30_state_t *s, const uint8_t *nss[]) { if (nss) *nss = s->tx_info.nss; return s->tx_info.nss_len; } /*- End of function --------------------------------------------------------*/ size_t t30_get_rx_nss(t30_state_t *s, const uint8_t *nss[]) { if (nss) *nss = s->rx_info.nss; return s->rx_info.nss_len; } /*- End of function --------------------------------------------------------*/ int t30_set_tx_tsa(t30_state_t *s, int type, const char *address, int len) { if (s->tx_info.tsa) free(s->tx_info.tsa); if (address == NULL || len == 0) { s->tx_info.tsa = NULL; s->tx_info.tsa_len = 0; return 0; } s->tx_info.tsa_type = type; if (len < 0) len = strlen(address); if ((s->tx_info.tsa = malloc(len))) { memcpy(s->tx_info.tsa, address, len); s->tx_info.tsa_len = len; } return 0; } /*- End of function --------------------------------------------------------*/ size_t t30_get_tx_tsa(t30_state_t *s, int *type, const char *address[]) { if (type) *type = s->tx_info.tsa_type; if (address) *address = s->tx_info.tsa; return s->tx_info.tsa_len; } /*- End of function --------------------------------------------------------*/ size_t t30_get_rx_tsa(t30_state_t *s, int *type, const char *address[]) { if (type) *type = s->rx_info.tsa_type; if (address) *address = s->rx_info.tsa; return s->rx_info.tsa_len; } /*- End of function --------------------------------------------------------*/ int t30_set_tx_ira(t30_state_t *s, int type, const char *address, int len) { if (s->tx_info.ira) free(s->tx_info.ira); if (address == NULL) { s->tx_info.ira = NULL; return 0; } s->tx_info.ira = strdup(address); return 0; } /*- End of function --------------------------------------------------------*/ size_t t30_get_tx_ira(t30_state_t *s, int *type, const char *address[]) { if (type) *type = s->tx_info.ira_type; if (address) *address = s->tx_info.ira; return s->tx_info.ira_len; } /*- End of function --------------------------------------------------------*/ size_t t30_get_rx_ira(t30_state_t *s, int *type, const char *address[]) { if (type) *type = s->rx_info.ira_type; if (address) *address = s->rx_info.ira; return s->rx_info.ira_len; } /*- End of function --------------------------------------------------------*/ int t30_set_tx_cia(t30_state_t *s, int type, const char *address, int len) { if (s->tx_info.cia) free(s->tx_info.cia); if (address == NULL) { s->tx_info.cia = NULL; return 0; } s->tx_info.cia = strdup(address); return 0; } /*- End of function --------------------------------------------------------*/ size_t t30_get_tx_cia(t30_state_t *s, int *type, const char *address[]) { if (type) *type = s->tx_info.cia_type; if (address) *address = s->tx_info.cia; return s->tx_info.cia_len; } /*- End of function --------------------------------------------------------*/ size_t t30_get_rx_cia(t30_state_t *s, int *type, const char *address[]) { if (type) *type = s->rx_info.cia_type; if (address) *address = s->rx_info.cia; return s->rx_info.cia_len; } /*- End of function --------------------------------------------------------*/ int t30_set_tx_isp(t30_state_t *s, int type, const char *address, int len) { if (s->tx_info.isp) free(s->tx_info.isp); if (address == NULL) { s->tx_info.isp = NULL; return 0; } s->tx_info.isp = strdup(address); return 0; } /*- End of function --------------------------------------------------------*/ size_t t30_get_tx_isp(t30_state_t *s, int *type, const char *address[]) { if (type) *type = s->tx_info.isp_type; if (address) *address = s->tx_info.isp; return s->tx_info.isp_len; } /*- End of function --------------------------------------------------------*/ size_t t30_get_rx_isp(t30_state_t *s, int *type, const char *address[]) { if (type) *type = s->rx_info.isp_type; if (address) *address = s->rx_info.isp; return s->rx_info.isp_len; } /*- End of function --------------------------------------------------------*/ int t30_set_tx_csa(t30_state_t *s, int type, const char *address, int len) { if (s->tx_info.csa) free(s->tx_info.csa); if (address == NULL) { s->tx_info.csa = NULL; return 0; } s->tx_info.csa = strdup(address); return 0; } /*- End of function --------------------------------------------------------*/ size_t t30_get_tx_csa(t30_state_t *s, int *type, const char *address[]) { if (type) *type = s->tx_info.csa_type; if (address) *address = s->tx_info.csa; return s->tx_info.csa_len; } /*- End of function --------------------------------------------------------*/ size_t t30_get_rx_csa(t30_state_t *s, int *type, const char *address[]) { if (type) *type = s->rx_info.csa_type; if (address) *address = s->rx_info.csa; return s->rx_info.csa_len; } /*- End of function --------------------------------------------------------*/ int t30_set_tx_page_header_info(t30_state_t *s, const char *info) { if (info == NULL) { s->header_info[0] = '\0'; return 0; } if (strlen(info) > T30_MAX_PAGE_HEADER_INFO) return -1; strcpy(s->header_info, info); t4_tx_set_header_info(&(s->t4), s->header_info); return 0; } /*- End of function --------------------------------------------------------*/ size_t t30_get_tx_page_header_info(t30_state_t *s, char *info) { if (info) strcpy(info, s->header_info); return strlen(s->header_info); } /*- End of function --------------------------------------------------------*/ const char *t30_get_rx_country(t30_state_t *s) { return s->country; } /*- End of function --------------------------------------------------------*/ const char *t30_get_rx_vendor(t30_state_t *s) { return s->vendor; } /*- End of function --------------------------------------------------------*/ const char *t30_get_rx_model(t30_state_t *s) { return s->model; } /*- End of function --------------------------------------------------------*/ void t30_set_rx_file(t30_state_t *s, const char *file, int stop_page) { strncpy(s->rx_file, file, sizeof(s->rx_file)); s->rx_file[sizeof(s->rx_file) - 1] = '\0'; s->rx_stop_page = stop_page; } /*- End of function --------------------------------------------------------*/ void t30_set_tx_file(t30_state_t *s, const char *file, int start_page, int stop_page) { strncpy(s->tx_file, file, sizeof(s->tx_file)); s->tx_file[sizeof(s->tx_file) - 1] = '\0'; s->tx_start_page = start_page; s->tx_stop_page = stop_page; } /*- End of function --------------------------------------------------------*/ void t30_set_iaf_mode(t30_state_t *s, int iaf) { s->iaf = iaf; } /*- End of function --------------------------------------------------------*/ int t30_set_ecm_capability(t30_state_t *s, int enabled) { s->ecm_allowed = enabled; t30_build_dis_or_dtc(s); return 0; } /*- End of function --------------------------------------------------------*/ int t30_set_rx_encoding(t30_state_t *s, int encoding) { switch (encoding) { case T4_COMPRESSION_ITU_T4_1D: case T4_COMPRESSION_ITU_T4_2D: case T4_COMPRESSION_ITU_T6: s->output_encoding = encoding; return 0; } return -1; } /*- End of function --------------------------------------------------------*/ int t30_set_supported_modems(t30_state_t *s, int supported_modems) { s->supported_modems = supported_modems; t30_build_dis_or_dtc(s); return 0; } /*- End of function --------------------------------------------------------*/ int t30_set_supported_compressions(t30_state_t *s, int supported_compressions) { s->supported_compressions = supported_compressions; t30_build_dis_or_dtc(s); return 0; } /*- End of function --------------------------------------------------------*/ int t30_set_supported_resolutions(t30_state_t *s, int supported_resolutions) { s->supported_resolutions = supported_resolutions; t30_build_dis_or_dtc(s); return 0; } /*- End of function --------------------------------------------------------*/ int t30_set_supported_image_sizes(t30_state_t *s, int supported_image_sizes) { s->supported_image_sizes = supported_image_sizes; t30_build_dis_or_dtc(s); return 0; } /*- End of function --------------------------------------------------------*/ int t30_set_supported_t30_features(t30_state_t *s, int supported_t30_features) { s->supported_t30_features = supported_t30_features; t30_build_dis_or_dtc(s); return 0; } /*- End of function --------------------------------------------------------*/ void t30_set_status(t30_state_t *s, int status) { s->current_status = status; } /*- End of function --------------------------------------------------------*/ int t30_set_receiver_not_ready(t30_state_t *s, int count) { s->receiver_not_ready_count = count; return 0; } /*- End of function --------------------------------------------------------*/ void t30_set_phase_b_handler(t30_state_t *s, t30_phase_b_handler_t *handler, void *user_data) { s->phase_b_handler = handler; s->phase_b_user_data = user_data; } /*- End of function --------------------------------------------------------*/ void t30_set_phase_d_handler(t30_state_t *s, t30_phase_d_handler_t *handler, void *user_data) { s->phase_d_handler = handler; s->phase_d_user_data = user_data; } /*- End of function --------------------------------------------------------*/ void t30_set_phase_e_handler(t30_state_t *s, t30_phase_e_handler_t *handler, void *user_data) { s->phase_e_handler = handler; s->phase_e_user_data = user_data; } /*- End of function --------------------------------------------------------*/ void t30_set_document_handler(t30_state_t *s, t30_document_handler_t *handler, void *user_data) { s->document_handler = handler; s->document_user_data = user_data; } /*- End of function --------------------------------------------------------*/ void t30_set_real_time_frame_handler(t30_state_t *s, t30_real_time_frame_handler_t *handler, void *user_data) { s->real_time_frame_handler = handler; s->real_time_frame_user_data = user_data; } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/fax.c0000644000175000017500000006023111150047216016601 0ustar julienjulien//#define LOG_FAX_AUDIO /* * SpanDSP - a series of DSP components for telephony * * fax.c - Analogue line ITU T.30 FAX transfer processing * * Written by Steve Underwood * * Copyright (C) 2003, 2005, 2006 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: fax.c,v 1.72 2008/07/25 13:56:54 steveu Exp $ */ /*! \file */ #if defined(HAVE_CONFIG_H) #include #endif #include #include #include #include #include "floating_fudge.h" #if defined(HAVE_TGMATH_H) #include #endif #if defined(HAVE_MATH_H) #include #endif #include #include #include #if defined(LOG_FAX_AUDIO) #include #endif #include #include "spandsp/telephony.h" #include "spandsp/logging.h" #include "spandsp/queue.h" #include "spandsp/dc_restore.h" #include "spandsp/power_meter.h" #include "spandsp/complex.h" #include "spandsp/tone_generate.h" #include "spandsp/async.h" #include "spandsp/hdlc.h" #include "spandsp/silence_gen.h" #include "spandsp/fsk.h" #include "spandsp/v29rx.h" #include "spandsp/v29tx.h" #include "spandsp/v27ter_rx.h" #include "spandsp/v27ter_tx.h" #include "spandsp/v17rx.h" #include "spandsp/v17tx.h" #include "spandsp/t4.h" #include "spandsp/t30_fcf.h" #include "spandsp/t35.h" #include "spandsp/t30.h" #include "spandsp/t30_api.h" #include "spandsp/t30_logging.h" #include "spandsp/fax_modems.h" #include "spandsp/fax.h" #define HDLC_FRAMING_OK_THRESHOLD 5 static void fax_send_hdlc(void *user_data, const uint8_t *msg, int len) { fax_state_t *s; s = (fax_state_t *) user_data; hdlc_tx_frame(&(s->fe.modems.hdlc_tx), msg, len); } /*- End of function --------------------------------------------------------*/ static void hdlc_underflow_handler(void *user_data) { t30_state_t *s; s = (t30_state_t *) user_data; t30_front_end_status(s, T30_FRONT_END_SEND_STEP_COMPLETE); } /*- End of function --------------------------------------------------------*/ static int dummy_rx(void *user_data, const int16_t amp[], int len) { return 0; } /*- End of function --------------------------------------------------------*/ static int early_v17_rx(void *user_data, const int16_t amp[], int len) { fax_state_t *s; s = (fax_state_t *) user_data; v17_rx(&(s->fe.modems.v17_rx), amp, len); fsk_rx(&(s->fe.modems.v21_rx), amp, len); if (s->t30.rx_trained) { /* The fast modem has trained, so we no longer need to run the slow one in parallel. */ span_log(&s->logging, SPAN_LOG_FLOW, "Switching from V.17 + V.21 to V.17 (%.2fdBm0)\n", v17_rx_signal_power(&(s->fe.modems.v17_rx))); s->fe.rx_handler = (span_rx_handler_t *) &v17_rx; s->fe.rx_user_data = &(s->fe.modems.v17_rx); } return 0; } /*- End of function --------------------------------------------------------*/ static int early_v27ter_rx(void *user_data, const int16_t amp[], int len) { fax_state_t *s; s = (fax_state_t *) user_data; v27ter_rx(&(s->fe.modems.v27ter_rx), amp, len); fsk_rx(&(s->fe.modems.v21_rx), amp, len); if (s->t30.rx_trained) { /* The fast modem has trained, so we no longer need to run the slow one in parallel. */ span_log(&s->logging, SPAN_LOG_FLOW, "Switching from V.27ter + V.21 to V.27ter (%.2fdBm0)\n", v27ter_rx_signal_power(&(s->fe.modems.v27ter_rx))); s->fe.rx_handler = (span_rx_handler_t *) &v27ter_rx; s->fe.rx_user_data = &(s->fe.modems.v27ter_rx); } return 0; } /*- End of function --------------------------------------------------------*/ static int early_v29_rx(void *user_data, const int16_t amp[], int len) { fax_state_t *s; s = (fax_state_t *) user_data; v29_rx(&(s->fe.modems.v29_rx), amp, len); fsk_rx(&(s->fe.modems.v21_rx), amp, len); if (s->t30.rx_trained) { /* The fast modem has trained, so we no longer need to run the slow one in parallel. */ span_log(&s->logging, SPAN_LOG_FLOW, "Switching from V.29 + V.21 to V.29 (%.2fdBm0)\n", v29_rx_signal_power(&(s->fe.modems.v29_rx))); s->fe.rx_handler = (span_rx_handler_t *) &v29_rx; s->fe.rx_user_data = &(s->fe.modems.v29_rx); } return 0; } /*- End of function --------------------------------------------------------*/ int fax_rx(fax_state_t *s, int16_t *amp, int len) { int i; #if defined(LOG_FAX_AUDIO) if (s->fe.fax_audio_rx_log >= 0) write(s->fe.fax_audio_rx_log, amp, len*sizeof(int16_t)); #endif for (i = 0; i < len; i++) amp[i] = dc_restore(&(s->fe.modems.dc_restore), amp[i]); s->fe.rx_handler(s->fe.rx_user_data, amp, len); t30_timer_update(&(s->t30), len); return 0; } /*- End of function --------------------------------------------------------*/ static int set_next_tx_type(fax_state_t *s) { if (s->fe.next_tx_handler) { s->fe.tx_handler = s->fe.next_tx_handler; s->fe.tx_user_data = s->fe.next_tx_user_data; s->fe.next_tx_handler = NULL; return 0; } /* If there is nothing else to change to, so use zero length silence */ silence_gen_alter(&(s->fe.modems.silence_gen), 0); s->fe.tx_handler = (span_tx_handler_t *) &silence_gen; s->fe.tx_user_data = &(s->fe.modems.silence_gen); s->fe.next_tx_handler = NULL; s->fe.transmit = FALSE; return -1; } /*- End of function --------------------------------------------------------*/ int fax_tx(fax_state_t *s, int16_t *amp, int max_len) { int len; #if defined(LOG_FAX_AUDIO) int required_len; required_len = max_len; #endif len = 0; if (s->fe.transmit) { while ((len += s->fe.tx_handler(s->fe.tx_user_data, amp + len, max_len - len)) < max_len) { /* Allow for a change of tx handler within a block */ if (set_next_tx_type(s) && s->fe.current_tx_type != T30_MODEM_NONE && s->fe.current_tx_type != T30_MODEM_DONE) t30_front_end_status(&(s->t30), T30_FRONT_END_SEND_STEP_COMPLETE); if (!s->fe.transmit) { if (s->fe.transmit_on_idle) { /* Pad to the requested length with silence */ memset(amp + len, 0, (max_len - len)*sizeof(int16_t)); len = max_len; } break; } } } else { if (s->fe.transmit_on_idle) { /* Pad to the requested length with silence */ memset(amp, 0, max_len*sizeof(int16_t)); len = max_len; } } #if defined(LOG_FAX_AUDIO) if (s->fe.fax_audio_tx_log >= 0) { if (len < required_len) memset(amp + len, 0, (required_len - len)*sizeof(int16_t)); write(s->fe.fax_audio_tx_log, amp, required_len*sizeof(int16_t)); } #endif return len; } /*- End of function --------------------------------------------------------*/ static void fax_set_rx_type(void *user_data, int type, int short_train, int use_hdlc) { fax_state_t *s; put_bit_func_t put_bit_func; void *put_bit_user_data; s = (fax_state_t *) user_data; span_log(&s->logging, SPAN_LOG_FLOW, "Set rx type %d\n", type); if (s->fe.current_rx_type == type) return; s->fe.current_rx_type = type; if (use_hdlc) { put_bit_func = (put_bit_func_t) hdlc_rx_put_bit; put_bit_user_data = (void *) &(s->fe.modems.hdlc_rx); hdlc_rx_init(&(s->fe.modems.hdlc_rx), FALSE, FALSE, HDLC_FRAMING_OK_THRESHOLD, t30_hdlc_accept, &(s->t30)); } else { put_bit_func = t30_non_ecm_put_bit; put_bit_user_data = (void *) &(s->t30); } switch (type) { case T30_MODEM_V21: if (s->fe.flush_handler) s->fe.flush_handler(s, s->fe.flush_user_data, 3); fsk_rx_init(&(s->fe.modems.v21_rx), &preset_fsk_specs[FSK_V21CH2], TRUE, (put_bit_func_t) hdlc_rx_put_bit, put_bit_user_data); fsk_rx_signal_cutoff(&(s->fe.modems.v21_rx), -45.5); s->fe.rx_handler = (span_rx_handler_t *) &fsk_rx; s->fe.rx_user_data = &(s->fe.modems.v21_rx); break; case T30_MODEM_V27TER_2400: v27ter_rx_restart(&(s->fe.modems.v27ter_rx), 2400, FALSE); v27ter_rx_set_put_bit(&(s->fe.modems.v27ter_rx), put_bit_func, put_bit_user_data); s->fe.rx_handler = (span_rx_handler_t *) &early_v27ter_rx; s->fe.rx_user_data = s; break; case T30_MODEM_V27TER_4800: v27ter_rx_restart(&(s->fe.modems.v27ter_rx), 4800, FALSE); v27ter_rx_set_put_bit(&(s->fe.modems.v27ter_rx), put_bit_func, put_bit_user_data); s->fe.rx_handler = (span_rx_handler_t *) &early_v27ter_rx; s->fe.rx_user_data = s; break; case T30_MODEM_V29_7200: v29_rx_restart(&(s->fe.modems.v29_rx), 7200, FALSE); v29_rx_set_put_bit(&(s->fe.modems.v29_rx), put_bit_func, put_bit_user_data); s->fe.rx_handler = (span_rx_handler_t *) &early_v29_rx; s->fe.rx_user_data = s; break; case T30_MODEM_V29_9600: v29_rx_restart(&(s->fe.modems.v29_rx), 9600, FALSE); v29_rx_set_put_bit(&(s->fe.modems.v29_rx), put_bit_func, put_bit_user_data); s->fe.rx_handler = (span_rx_handler_t *) &early_v29_rx; s->fe.rx_user_data = s; break; case T30_MODEM_V17_7200: v17_rx_restart(&(s->fe.modems.v17_rx), 7200, short_train); v17_rx_set_put_bit(&(s->fe.modems.v17_rx), put_bit_func, put_bit_user_data); s->fe.rx_handler = (span_rx_handler_t *) &early_v17_rx; s->fe.rx_user_data = s; break; case T30_MODEM_V17_9600: v17_rx_restart(&(s->fe.modems.v17_rx), 9600, short_train); v17_rx_set_put_bit(&(s->fe.modems.v17_rx), put_bit_func, put_bit_user_data); s->fe.rx_handler = (span_rx_handler_t *) &early_v17_rx; s->fe.rx_user_data = s; break; case T30_MODEM_V17_12000: v17_rx_restart(&(s->fe.modems.v17_rx), 12000, short_train); v17_rx_set_put_bit(&(s->fe.modems.v17_rx), put_bit_func, put_bit_user_data); s->fe.rx_handler = (span_rx_handler_t *) &early_v17_rx; s->fe.rx_user_data = s; break; case T30_MODEM_V17_14400: v17_rx_restart(&(s->fe.modems.v17_rx), 14400, short_train); v17_rx_set_put_bit(&(s->fe.modems.v17_rx), put_bit_func, put_bit_user_data); s->fe.rx_handler = (span_rx_handler_t *) &early_v17_rx; s->fe.rx_user_data = s; break; case T30_MODEM_DONE: span_log(&s->logging, SPAN_LOG_FLOW, "FAX exchange complete\n"); default: s->fe.rx_handler = (span_rx_handler_t *) &dummy_rx; s->fe.rx_user_data = s; break; } } /*- End of function --------------------------------------------------------*/ static void fax_set_tx_type(void *user_data, int type, int short_train, int use_hdlc) { fax_state_t *s; tone_gen_descriptor_t tone_desc; get_bit_func_t get_bit_func; void *get_bit_user_data; s = (fax_state_t *) user_data; span_log(&s->logging, SPAN_LOG_FLOW, "Set tx type %d\n", type); if (s->fe.current_tx_type == type) return; if (use_hdlc) { get_bit_func = (get_bit_func_t) hdlc_tx_get_bit; get_bit_user_data = (void *) &(s->fe.modems.hdlc_tx); } else { get_bit_func = t30_non_ecm_get_bit; get_bit_user_data = (void *) &(s->t30); } switch (type) { case T30_MODEM_PAUSE: silence_gen_alter(&(s->fe.modems.silence_gen), ms_to_samples(short_train)); s->fe.tx_handler = (span_tx_handler_t *) &silence_gen; s->fe.tx_user_data = &(s->fe.modems.silence_gen); s->fe.next_tx_handler = NULL; s->fe.transmit = TRUE; break; case T30_MODEM_CNG: /* 0.5s of 1100Hz+-38Hz + 3.0s of silence repeating. Timing +-15% */ make_tone_gen_descriptor(&tone_desc, 1100, -11, 0, 0, 500, 3000, 0, 0, TRUE); tone_gen_init(&(s->fe.modems.tone_gen), &tone_desc); s->fe.tx_handler = (span_tx_handler_t *) &tone_gen; s->fe.tx_user_data = &(s->fe.modems.tone_gen); s->fe.next_tx_handler = NULL; s->fe.transmit = TRUE; break; case T30_MODEM_CED: /* 0.2s of silence, then 2.6s to 4s of 2100Hz+-15Hz tone, then 75ms of silence. The 75ms of silence will be inserted by the pre V.21 pause we use for any switch to V.21. */ silence_gen_alter(&(s->fe.modems.silence_gen), ms_to_samples(200)); make_tone_gen_descriptor(&tone_desc, 2100, -11, 0, 0, 2600, 0, 0, 0, FALSE); tone_gen_init(&(s->fe.modems.tone_gen), &tone_desc); s->fe.tx_handler = (span_tx_handler_t *) &silence_gen; s->fe.tx_user_data = &(s->fe.modems.silence_gen); s->fe.next_tx_handler = (span_tx_handler_t *) &tone_gen; s->fe.next_tx_user_data = &(s->fe.modems.tone_gen); s->fe.transmit = TRUE; break; case T30_MODEM_V21: fsk_tx_init(&(s->fe.modems.v21_tx), &preset_fsk_specs[FSK_V21CH2], get_bit_func, get_bit_user_data); /* The spec says 1s +-15% of preamble. So, the minimum is 32 octets. */ hdlc_tx_flags(&(s->fe.modems.hdlc_tx), 32); /* Pause before switching from phase C, as per T.30 5.3.2.2. If we omit this, the receiver might not see the carrier fall between the high speed and low speed sections. In practice, a 75ms gap before any V.21 transmission is harmless, adds little to the overall length of a call, and ensures the receiving end is ready. */ silence_gen_alter(&(s->fe.modems.silence_gen), ms_to_samples(75)); s->fe.tx_handler = (span_tx_handler_t *) &silence_gen; s->fe.tx_user_data = &(s->fe.modems.silence_gen); s->fe.next_tx_handler = (span_tx_handler_t *) &fsk_tx; s->fe.next_tx_user_data = &(s->fe.modems.v21_tx); s->fe.transmit = TRUE; break; case T30_MODEM_V27TER_2400: silence_gen_alter(&(s->fe.modems.silence_gen), ms_to_samples(75)); v27ter_tx_restart(&(s->fe.modems.v27ter_tx), 2400, s->fe.use_tep); v27ter_tx_set_get_bit(&(s->fe.modems.v27ter_tx), get_bit_func, get_bit_user_data); s->fe.tx_handler = (span_tx_handler_t *) &silence_gen; s->fe.tx_user_data = &(s->fe.modems.silence_gen); s->fe.next_tx_handler = (span_tx_handler_t *) &v27ter_tx; s->fe.next_tx_user_data = &(s->fe.modems.v27ter_tx); hdlc_tx_flags(&(s->fe.modems.hdlc_tx), 60); s->fe.transmit = TRUE; break; case T30_MODEM_V27TER_4800: silence_gen_alter(&(s->fe.modems.silence_gen), ms_to_samples(75)); v27ter_tx_restart(&(s->fe.modems.v27ter_tx), 4800, s->fe.use_tep); v27ter_tx_set_get_bit(&(s->fe.modems.v27ter_tx), get_bit_func, get_bit_user_data); s->fe.tx_handler = (span_tx_handler_t *) &silence_gen; s->fe.tx_user_data = &(s->fe.modems.silence_gen); s->fe.next_tx_handler = (span_tx_handler_t *) &v27ter_tx; s->fe.next_tx_user_data = &(s->fe.modems.v27ter_tx); hdlc_tx_flags(&(s->fe.modems.hdlc_tx), 120); s->fe.transmit = TRUE; break; case T30_MODEM_V29_7200: silence_gen_alter(&(s->fe.modems.silence_gen), ms_to_samples(75)); v29_tx_restart(&(s->fe.modems.v29_tx), 7200, s->fe.use_tep); v29_tx_set_get_bit(&(s->fe.modems.v29_tx), get_bit_func, get_bit_user_data); s->fe.tx_handler = (span_tx_handler_t *) &silence_gen; s->fe.tx_user_data = &(s->fe.modems.silence_gen); s->fe.next_tx_handler = (span_tx_handler_t *) &v29_tx; s->fe.next_tx_user_data = &(s->fe.modems.v29_tx); hdlc_tx_flags(&(s->fe.modems.hdlc_tx), 180); s->fe.transmit = TRUE; break; case T30_MODEM_V29_9600: silence_gen_alter(&(s->fe.modems.silence_gen), ms_to_samples(75)); v29_tx_restart(&(s->fe.modems.v29_tx), 9600, s->fe.use_tep); v29_tx_set_get_bit(&(s->fe.modems.v29_tx), get_bit_func, get_bit_user_data); s->fe.tx_handler = (span_tx_handler_t *) &silence_gen; s->fe.tx_user_data = &(s->fe.modems.silence_gen); s->fe.next_tx_handler = (span_tx_handler_t *) &v29_tx; s->fe.next_tx_user_data = &(s->fe.modems.v29_tx); hdlc_tx_flags(&(s->fe.modems.hdlc_tx), 240); s->fe.transmit = TRUE; break; case T30_MODEM_V17_7200: silence_gen_alter(&(s->fe.modems.silence_gen), ms_to_samples(75)); v17_tx_restart(&(s->fe.modems.v17_tx), 7200, s->fe.use_tep, short_train); v17_tx_set_get_bit(&(s->fe.modems.v17_tx), get_bit_func, get_bit_user_data); s->fe.tx_handler = (span_tx_handler_t *) &silence_gen; s->fe.tx_user_data = &(s->fe.modems.silence_gen); s->fe.next_tx_handler = (span_tx_handler_t *) &v17_tx; s->fe.next_tx_user_data = &(s->fe.modems.v17_tx); hdlc_tx_flags(&(s->fe.modems.hdlc_tx), 180); s->fe.transmit = TRUE; break; case T30_MODEM_V17_9600: silence_gen_alter(&(s->fe.modems.silence_gen), ms_to_samples(75)); v17_tx_restart(&(s->fe.modems.v17_tx), 9600, s->fe.use_tep, short_train); v17_tx_set_get_bit(&(s->fe.modems.v17_tx), get_bit_func, get_bit_user_data); s->fe.tx_handler = (span_tx_handler_t *) &silence_gen; s->fe.tx_user_data = &(s->fe.modems.silence_gen); s->fe.next_tx_handler = (span_tx_handler_t *) &v17_tx; s->fe.next_tx_user_data = &(s->fe.modems.v17_tx); hdlc_tx_flags(&(s->fe.modems.hdlc_tx), 240); s->fe.transmit = TRUE; break; case T30_MODEM_V17_12000: silence_gen_alter(&(s->fe.modems.silence_gen), ms_to_samples(75)); v17_tx_restart(&(s->fe.modems.v17_tx), 12000, s->fe.use_tep, short_train); v17_tx_set_get_bit(&(s->fe.modems.v17_tx), get_bit_func, get_bit_user_data); s->fe.tx_handler = (span_tx_handler_t *) &silence_gen; s->fe.tx_user_data = &(s->fe.modems.silence_gen); s->fe.next_tx_handler = (span_tx_handler_t *) &v17_tx; s->fe.next_tx_user_data = &(s->fe.modems.v17_tx); hdlc_tx_flags(&(s->fe.modems.hdlc_tx), 300); s->fe.transmit = TRUE; break; case T30_MODEM_V17_14400: silence_gen_alter(&(s->fe.modems.silence_gen), ms_to_samples(75)); v17_tx_restart(&(s->fe.modems.v17_tx), 14400, s->fe.use_tep, short_train); v17_tx_set_get_bit(&(s->fe.modems.v17_tx), get_bit_func, get_bit_user_data); s->fe.tx_handler = (span_tx_handler_t *) &silence_gen; s->fe.tx_user_data = &(s->fe.modems.silence_gen); s->fe.next_tx_handler = (span_tx_handler_t *) &v17_tx; s->fe.next_tx_user_data = &(s->fe.modems.v17_tx); hdlc_tx_flags(&(s->fe.modems.hdlc_tx), 360); s->fe.transmit = TRUE; break; case T30_MODEM_DONE: span_log(&s->logging, SPAN_LOG_FLOW, "FAX exchange complete\n"); /* Fall through */ default: silence_gen_alter(&(s->fe.modems.silence_gen), 0); s->fe.tx_handler = (span_tx_handler_t *) &silence_gen; s->fe.tx_user_data = &(s->fe.modems.silence_gen); s->fe.next_tx_handler = NULL; s->fe.transmit = FALSE; break; } s->fe.current_tx_type = type; } /*- End of function --------------------------------------------------------*/ void fax_set_transmit_on_idle(fax_state_t *s, int transmit_on_idle) { s->fe.transmit_on_idle = transmit_on_idle; } /*- End of function --------------------------------------------------------*/ void fax_set_tep_mode(fax_state_t *s, int use_tep) { s->fe.use_tep = use_tep; } /*- End of function --------------------------------------------------------*/ t30_state_t *fax_get_t30_state(fax_state_t *s) { return &s->t30; } /*- End of function --------------------------------------------------------*/ fax_state_t *fax_init(fax_state_t *s, int calling_party) { if (s == NULL) { if ((s = (fax_state_t *) malloc(sizeof(*s))) == NULL) return NULL; } memset(s, 0, sizeof(*s)); span_log_init(&s->logging, SPAN_LOG_NONE, NULL); span_log_set_protocol(&s->logging, "FAX"); t30_init(&(s->t30), calling_party, fax_set_rx_type, (void *) s, fax_set_tx_type, (void *) s, fax_send_hdlc, (void *) s); t30_set_supported_modems(&(s->t30), T30_SUPPORT_V27TER | T30_SUPPORT_V29); hdlc_rx_init(&(s->fe.modems.hdlc_rx), FALSE, FALSE, HDLC_FRAMING_OK_THRESHOLD, t30_hdlc_accept, &(s->t30)); fsk_rx_init(&(s->fe.modems.v21_rx), &preset_fsk_specs[FSK_V21CH2], TRUE, (put_bit_func_t) hdlc_rx_put_bit, &(s->fe.modems.hdlc_rx)); fsk_rx_signal_cutoff(&(s->fe.modems.v21_rx), -45.5); hdlc_tx_init(&(s->fe.modems.hdlc_tx), FALSE, 2, FALSE, hdlc_underflow_handler, &(s->t30)); fsk_tx_init(&(s->fe.modems.v21_tx), &preset_fsk_specs[FSK_V21CH2], (get_bit_func_t) hdlc_tx_get_bit, &(s->fe.modems.hdlc_tx)); v17_rx_init(&(s->fe.modems.v17_rx), 14400, t30_non_ecm_put_bit, &(s->t30)); v17_tx_init(&(s->fe.modems.v17_tx), 14400, s->fe.use_tep, t30_non_ecm_get_bit, &(s->t30)); v29_rx_init(&(s->fe.modems.v29_rx), 9600, t30_non_ecm_put_bit, &(s->t30)); v29_rx_signal_cutoff(&(s->fe.modems.v29_rx), -45.5); v29_tx_init(&(s->fe.modems.v29_tx), 9600, s->fe.use_tep, t30_non_ecm_get_bit, &(s->t30)); v27ter_rx_init(&(s->fe.modems.v27ter_rx), 4800, t30_non_ecm_put_bit, &(s->t30)); v27ter_tx_init(&(s->fe.modems.v27ter_tx), 4800, s->fe.use_tep, t30_non_ecm_get_bit, &(s->t30)); silence_gen_init(&(s->fe.modems.silence_gen), 0); dc_restore_init(&(s->fe.modems.dc_restore)); t30_restart(&(s->t30)); #if defined(LOG_FAX_AUDIO) { char buf[100 + 1]; struct tm *tm; time_t now; time(&now); tm = localtime(&now); sprintf(buf, "/tmp/fax-rx-audio-%p-%02d%02d%02d%02d%02d%02d", s, tm->tm_year%100, tm->tm_mon + 1, tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec); s->fe.fax_audio_rx_log = open(buf, O_CREAT | O_TRUNC | O_WRONLY, 0666); sprintf(buf, "/tmp/fax-tx-audio-%p-%02d%02d%02d%02d%02d%02d", s, tm->tm_year%100, tm->tm_mon + 1, tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec); s->fe.fax_audio_tx_log = open(buf, O_CREAT | O_TRUNC | O_WRONLY, 0666); } #endif return s; } /*- End of function --------------------------------------------------------*/ int fax_release(fax_state_t *s) { t30_release(&s->t30); return 0; } /*- End of function --------------------------------------------------------*/ int fax_free(fax_state_t *s) { t30_release(&s->t30); free(s); return 0; } /*- End of function --------------------------------------------------------*/ void fax_set_flush_handler(fax_state_t *s, fax_flush_handler_t *handler, void *user_data) { s->fe.flush_handler = handler; s->fe.flush_user_data = user_data; } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/lpc10_voicing.c0000644000175000017500000004316111150047216020463 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * lpc10_voicing.c - LPC10 low bit rate speech codec. * * Written by Steve Underwood * * Copyright (C) 2006 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * This code is based on the U.S. Department of Defense reference * implementation of the LPC-10 2400 bps Voice Coder. They do not * exert copyright claims on their code, and it may be freely used. * * $Id: lpc10_voicing.c,v 1.14 2008/07/02 14:48:25 steveu Exp $ */ #if defined(HAVE_CONFIG_H) #include #endif #include #include #include #include #include "floating_fudge.h" #if defined(HAVE_TGMATH_H) #include #endif #if defined(HAVE_MATH_H) #include #endif #include "spandsp/telephony.h" #include "spandsp/dc_restore.h" #include "spandsp/lpc10.h" #include "lpc10_encdecs.h" static void vparms(int32_t vwin[], float *inbuf, float *lpbuf, const int32_t buflim[], int32_t half, float *dither, int32_t *mintau, int32_t *zc, int32_t *lbe, int32_t *fbe, float *qs, float *rc1, float *ar_b, float *ar_f) { int32_t inbuf_offset; int32_t lpbuf_offset; int32_t vlen; int32_t stop; int32_t i; int32_t start; float r1; float r2; float e_pre; float ap_rms; float e_0; float oldsgn; float lp_rms; float e_b; float e_f; float r_b; float r_f; float e0ap; /* Calculate zero crossings (ZC) and several energy and correlation */ /* measures on low band and full band speech. Each measure is taken */ /* over either the first or the second half of the voicing window, */ /* depending on the variable HALF. */ lpbuf_offset = buflim[2]; lpbuf -= lpbuf_offset; inbuf_offset = buflim[0]; inbuf -= inbuf_offset; lp_rms = 0.0f; ap_rms = 0.0f; e_pre = 0.0f; e0ap = 0.0f; *rc1 = 0.0f; e_0 = 0.0f; e_b = 0.0f; e_f = 0.0f; r_f = 0.0f; r_b = 0.0f; *zc = 0; vlen = vwin[1] - vwin[0] + 1; start = vwin[0] + half*vlen/2 + 1; stop = start + vlen/2 - 1; /* I'll use the symbol HVL in the table below to represent the value */ /* VLEN/2. Note that if VLEN is odd, then HVL should be rounded down, */ /* i.e., HVL = (VLEN-1)/2. */ /* HALF START STOP */ /* 1 VWIN(1)+1 VWIN(1)+HVL */ /* 2 VWIN(1)+HVL+1 VWIN(1)+2*HVL */ oldsgn = r_sign(1.0f, inbuf[start - 1] - *dither); for (i = start; i <= stop; i++) { lp_rms += fabsf(lpbuf[i]); ap_rms += fabsf(inbuf[i]); e_pre += fabsf(inbuf[i] - inbuf[i - 1]); r1 = inbuf[i]; e0ap += r1*r1; *rc1 += inbuf[i]*inbuf[i - 1]; r1 = lpbuf[i]; e_0 += r1*r1; r1 = lpbuf[i - *mintau]; e_b += r1*r1; r1 = lpbuf[i + *mintau]; e_f += r1*r1; r_f += lpbuf[i]*lpbuf[i + *mintau]; r_b += lpbuf[i]*lpbuf[i - *mintau]; r1 = inbuf[i] + *dither; if (r_sign(1.0f, r1) != oldsgn) { ++(*zc); oldsgn = -oldsgn; } *dither = -(*dither); } /* Normalized short-term autocovariance coefficient at unit sample delay */ *rc1 /= max(e0ap, 1.0f); /* Ratio of the energy of the first difference signal (6 dB/oct preemphasis)*/ /* to the energy of the full band signal */ /* Computing MAX */ r1 = ap_rms*2.0f; *qs = e_pre/max(r1, 1.0f); /* aR_b is the product of the forward and reverse prediction gains, */ /* looking backward in time (the causal case). */ *ar_b = r_b/max(e_b, 1.0f)*(r_b/max(e_0, 1.0f)); /* aR_f is the same as aR_b, but looking forward in time (non causal case).*/ *ar_f = r_f/max(e_f, 1.0f)*(r_f/max(e_0, 1.0f)); /* Normalize ZC, LBE, and FBE to old fixed window length of 180. */ /* (The fraction 90/VLEN has a range of 0.58 to 1) */ r2 = (float) (*zc << 1); *zc = lrintf(r2*(90.0f/vlen)); r1 = lp_rms/4*(90.0f/vlen); *lbe = min(lrintf(r1), 32767); r1 = ap_rms/4*(90.0f/vlen); *fbe = min(lrintf(r1), 32767); } /*- End of function --------------------------------------------------------*/ /* Voicing detection makes voicing decisions for each half */ /* frame of input speech. Tentative voicing decisions are made two frames*/ /* in the future (2F) for each half frame. These decisions are carried */ /* through one frame in the future (1F) to the present (P) frame where */ /* they are examined and smoothed, resulting in the final voicing */ /* decisions for each half frame. */ /* The voicing parameter (signal measurement) column vector (VALUE) */ /* is based on a rectangular window of speech samples determined by the */ /* window placement algorithm. The voicing parameter vector contains the*/ /* AMDF windowed maximum-to-minimum ratio, the zero crossing rate, energy*/ /* measures, reflection coefficients, and prediction gains. The voicing */ /* window is placed to avoid contamination of the voicing parameter vector*/ /* with speech onsets. */ /* The input signal is then classified as unvoiced (including */ /* silence) or voiced. This decision is made by a linear discriminant */ /* function consisting of a dot product of the voicing decision */ /* coefficient (VDC) row vector with the measurement column vector */ /* (VALUE). The VDC vector is 2-dimensional, each row vector is optimized*/ /* for a particular signal-to-noise ratio (SNR). So, before the dot */ /* product is performed, the SNR is estimated to select the appropriate */ /* VDC vector. */ /* The smoothing algorithm is a modified median smoother. The */ /* voicing discriminant function is used by the smoother to determine how*/ /* strongly voiced or unvoiced a signal is. The smoothing is further */ /* modified if a speech onset and a voicing decision transition occur */ /* within one half frame. In this case, the voicing decision transition */ /* is extended to the speech onset. For transmission purposes, there are*/ /* constraints on the duration and transition of voicing decisions. The */ /* smoother takes these constraints into account. */ /* Finally, the energy estimates are updated along with the dither */ /* threshold used to calculate the zero crossing rate (ZC). */ void lpc10_voicing(lpc10_encode_state_t *s, int32_t vwin[], float *inbuf, float *lpbuf, const int32_t buflim[], int32_t half, float *minamd, float *maxamd, int32_t *mintau, float ivrc[], int32_t obound[]) { static const float vdc[100] = { 0.0f, 1714.0f, -110.0f, 334.0f, -4096.0f, -654.0f, 3752.0f, 3769.0f, 0.0f, 1181.0f, 0.0f, 874.0f, -97.0f, 300.0f, -4096.0f, -1021.0f, 2451.0f, 2527.0f, 0.0f, -500.0f, 0.0f, 510.0f, -70.0f, 250.0f, -4096.0f, -1270.0f, 2194.0f, 2491.0f, 0.0f, -1500.0f, 0.0f, 500.0f, -10.0f, 200.0f, -4096.0f, -1300.0f, 2.0e3f, 2.0e3f, 0.0f, -2.0e3f, 0.0f, 500.0f, 0.0f, 0.0f, -4096.0f, -1300.0f, 2.0e3f, 2.0e3f, 0.0f, -2500.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f }; static const int nvdcl = 5; static const float vdcl[10] = { 600.0f, 450.0f, 300.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f }; int32_t inbuf_offset; int32_t lpbuf_offset; int32_t i1; float r1; float r2; float ar_b; float ar_f; int32_t snrl; int32_t i; float value[9]; int32_t zc; int ot; float qs; int32_t vstate; float rc1; int32_t fbe; int32_t lbe; float snr2; #if (_MSC_VER >= 1400) __analysis_assume(half >= 0 && half < 2); #endif inbuf_offset = 0; lpbuf_offset = 0; if (inbuf) { inbuf_offset = buflim[0]; inbuf -= inbuf_offset; } if (lpbuf) { lpbuf_offset = buflim[2]; lpbuf -= lpbuf_offset; } /* Voicing Decision Parameter vector (* denotes zero coefficient): */ /* * MAXMIN */ /* LBE/LBVE */ /* ZC */ /* RC1 */ /* QS */ /* IVRC2 */ /* aR_B */ /* aR_F */ /* * LOG(LBE/LBVE) */ /* Define 2-D voicing decision coefficient vector according to the voicing */ /* parameter order above. Each row (VDC vector) is optimized for a specific */ /* SNR. The last element of the vector is the constant. */ /* E ZC RC1 Qs IVRC2 aRb aRf c */ /* The VOICE array contains the result of the linear discriminant function*/ /* (analog values). The VOIBUF array contains the hard-limited binary */ /* voicing decisions. The VOICE and VOIBUF arrays, according to FORTRAN */ /* memory allocation, are addressed as: */ /* (half-frame number, future-frame number) */ /* | Past | Present | Future1 | Future2 | */ /* | 1,0 | 2,0 | 1,1 | 2,1 | 1,2 | 2,2 | 1,3 | 2,3 | ---> time */ /* Update linear discriminant function history each frame: */ if (half == 0) { s->voice[0][0] = s->voice[1][0]; s->voice[0][1] = s->voice[1][1]; s->voice[1][0] = s->voice[2][0]; s->voice[1][1] = s->voice[2][1]; s->maxmin = *maxamd / max(*minamd, 1.0f); } /* Calculate voicing parameters twice per frame */ vparms(vwin, &inbuf[inbuf_offset], &lpbuf[lpbuf_offset], buflim, half, &s->dither, mintau, &zc, &lbe, &fbe, &qs, &rc1, &ar_b, &ar_f); /* Estimate signal-to-noise ratio to select the appropriate VDC vector. */ /* The SNR is estimated as the running average of the ratio of the */ /* running average full-band voiced energy to the running average */ /* full-band unvoiced energy. SNR filter has gain of 63. */ r1 = (s->snr + s->fbve/(float) max(s->fbue, 1))*63/64.0f; s->snr = (float) lrintf(r1); snr2 = s->snr*s->fbue/max(s->lbue, 1); /* Quantize SNR to SNRL according to VDCL thresholds. */ i1 = nvdcl - 1; for (snrl = 0; snrl < i1; snrl++) { if (snr2 > vdcl[snrl]) break; } /* (Note: SNRL = NVDCL here) */ /* Linear discriminant voicing parameters: */ value[0] = s->maxmin; value[1] = (float) lbe/max(s->lbve, 1); value[2] = (float) zc; value[3] = rc1; value[4] = qs; value[5] = ivrc[1]; value[6] = ar_b; value[7] = ar_f; /* Evaluation of linear discriminant function: */ s->voice[2][half] = vdc[snrl*10 + 9]; for (i = 0; i < 8; i++) s->voice[2][half] += vdc[snrl*10 + i]*value[i]; /* Classify as voiced if discriminant > 0, otherwise unvoiced */ /* Voicing decision for current half-frame: 1 = Voiced; 0 = Unvoiced */ s->voibuf[3][half] = (s->voice[2][half] > 0.0f) ? 1 : 0; /* Skip voicing decision smoothing in first half-frame: */ /* Give a value to VSTATE, so that trace statements below will print */ /* a consistent value from one call to the next when HALF .EQ. 1. */ /* The value of VSTATE is not used for any other purpose when this is */ /* true. */ vstate = -1; if (half != 0) { /* Voicing decision smoothing rules (override of linear combination): */ /* Unvoiced half-frames: At least two in a row. */ /* -------------------- */ /* Voiced half-frames: At least two in a row in one frame. */ /* ------------------- Otherwise at least three in a row. */ /* (Due to the way transition frames are encoded) */ /* In many cases, the discriminant function determines how to smooth. */ /* In the following chart, the decisions marked with a * may be overridden. */ /* Voicing override of transitions at onsets: */ /* If a V/UV or UV/V voicing decision transition occurs within one-half */ /* frame of an onset bounding a voicing window, then the transition is */ /* moved to occur at the onset. */ /* P 1F */ /* ----- ----- */ /* 0 0 0 0 */ /* 0 0 0* 1 (If there is an onset there) */ /* 0 0 1* 0* (Based on 2F and discriminant distance) */ /* 0 0 1 1 */ /* 0 1* 0 0 (Always) */ /* 0 1* 0* 1 (Based on discriminant distance) */ /* 0* 1 1 0* (Based on past, 2F, and discriminant distance) */ /* 0 1* 1 1 (If there is an onset there) */ /* 1 0* 0 0 (If there is an onset there) */ /* 1 0 0 1 */ /* 1 0* 1* 0 (Based on discriminant distance) */ /* 1 0* 1 1 (Always) */ /* 1 1 0 0 */ /* 1 1 0* 1* (Based on 2F and discriminant distance) */ /* 1 1 1* 0 (If there is an onset there) */ /* 1 1 1 1 */ /* Determine if there is an onset transition between P and 1F. */ /* OT (Onset Transition) is true if there is an onset between */ /* P and 1F but not after 1F. */ ot = ((obound[0] & 2) != 0 || obound[1] == 1) && (obound[2] & 1) == 0; /* Multi-way dispatch on voicing decision history: */ vstate = (s->voibuf[1][0] << 3) + (s->voibuf[1][1] << 2) + (s->voibuf[2][0] << 1) + s->voibuf[2][1]; switch (vstate + 1) { case 2: if (ot && s->voibuf[3][0] == 1) s->voibuf[2][0] = 1; break; case 3: if (s->voibuf[3][0] == 0 || s->voice[1][0] < -s->voice[1][1]) s->voibuf[2][0] = 0; else s->voibuf[2][1] = 1; break; case 5: s->voibuf[1][1] = 0; break; case 6: if (s->voice[0][1] < -s->voice[1][0]) s->voibuf[1][1] = 0; else s->voibuf[2][0] = 1; break; case 7: if (s->voibuf[0][0] == 1 || s->voibuf[3][0] == 1 || s->voice[1][1] > s->voice[0][0]) s->voibuf[2][1] = 1; else s->voibuf[1][0] = 1; break; case 8: if (ot) s->voibuf[1][1] = 0; break; case 9: if (ot) s->voibuf[1][1] = 1; break; case 11: if (s->voice[1][9] < -s->voice[0][1]) s->voibuf[2][0] = 0; else s->voibuf[1][1] = 1; break; case 12: s->voibuf[1][1] = 1; break; case 14: if (s->voibuf[3][0] == 0 && s->voice[1][1] < -s->voice[1][0]) s->voibuf[2][1] = 0; else s->voibuf[2][0] = 1; break; case 15: if (ot && s->voibuf[3][0] == 0) s->voibuf[2][0] = 0; break; } } /* During unvoiced half-frames, update the low band and full band unvoiced*/ /* energy estimates (LBUE and FBUE) and also the zero crossing */ /* threshold (DITHER). (The input to the unvoiced energy filters is */ /* restricted to be less than 10dB above the previous inputs of the */ /* filters.) */ /* During voiced half-frames, update the low-pass (LBVE) and all-pass */ /* (FBVE) voiced energy estimates. */ if (s->voibuf[3][half] == 0) { r1 = (s->sfbue*63 + (min(fbe, s->ofbue*3) << 3))/64.0f; s->sfbue = lrintf(r1); s->fbue = s->sfbue/8; s->ofbue = fbe; r1 = (s->slbue*63 + (min(lbe, s->olbue*3) << 3))/64.0f; s->slbue = lrintf(r1); s->lbue = s->slbue/8; s->olbue = lbe; } else { s->lbve = lrintf((s->lbve*63 + lbe)/64.0f); s->fbve = lrintf((s->fbve*63 + fbe)/64.0f); } /* Set dither threshold to yield proper zero crossing rates in the */ /* presence of low frequency noise and low level signal input. */ /* NOTE: The divisor is a function of REF, the expected energies. */ /* Computing MIN */ /* Computing MAX */ r2 = sqrtf((float) (s->lbue*s->lbve))*64/3000; r1 = max(r2, 1.0f); s->dither = min(r1, 20.0f); /* Voicing decisions are returned in VOIBUF. */ } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/v42.c0000644000175000017500000013115411150047216016441 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * v42.c * * Written by Steve Underwood * * Copyright (C) 2004 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: v42.c,v 1.42 2008/05/13 13:17:25 steveu Exp $ */ /* THIS IS A WORK IN PROGRESS. IT IS NOT FINISHED. */ /*! \file */ #if defined(HAVE_CONFIG_H) #include #endif #include #include #include #include #include #include "spandsp/telephony.h" #include "spandsp/logging.h" #include "spandsp/async.h" #include "spandsp/hdlc.h" #include "spandsp/schedule.h" #include "spandsp/queue.h" #include "spandsp/v42.h" #if !defined(FALSE) #define FALSE 0 #endif #if !defined(TRUE) #define TRUE (!FALSE) #endif #define LAPM_FRAMETYPE_MASK 0x03 #define LAPM_FRAMETYPE_I 0x00 #define LAPM_FRAMETYPE_I_ALT 0x02 #define LAPM_FRAMETYPE_S 0x01 #define LAPM_FRAMETYPE_U 0x03 /* Timer values */ #define T_WAIT_MIN 2000 #define T_WAIT_MAX 10000 /* Detection phase timer */ #define T_400 750000 /* Acknowledgement timer - 1 second between SABME's */ #define T_401 1000000 /* Replay delay timer (optional) */ #define T_402 1000000 /* Inactivity timer (optional). No default - use 10 seconds with no packets */ #define T_403 10000000 /* Max retries */ #define N_400 3 /* Max octets in an information field */ #define N_401 128 #define LAPM_DLCI_DTE_TO_DTE 0 #define LAPM_DLCI_LAYER2_MANAGEMENT 63 static void t401_expired(span_sched_state_t *s, void *user_data); static void t403_expired(span_sched_state_t *s, void *user_data); void lapm_reset(lapm_state_t *s); void lapm_restart(lapm_state_t *s); static void lapm_link_down(lapm_state_t *s); static __inline__ void lapm_init_header(uint8_t *frame, int command) { /* Data link connection identifier (0) */ /* Command/response (0 if answerer, 1 if originator) */ /* Extended address (1) */ frame[0] = (LAPM_DLCI_DTE_TO_DTE << 2) | ((command) ? 0x02 : 0x00) | 0x01; } /*- End of function --------------------------------------------------------*/ static int lapm_tx_frame(lapm_state_t *s, uint8_t *frame, int len) { if ((s->debug & LAPM_DEBUG_LAPM_DUMP)) lapm_dump(s, frame, len, s->debug & LAPM_DEBUG_LAPM_RAW, TRUE); /*endif*/ hdlc_tx_frame(&s->hdlc_tx, frame, len); return 0; } /*- End of function --------------------------------------------------------*/ static void t400_expired(span_sched_state_t *ss, void *user_data) { v42_state_t *s; /* Give up trying to detect a V.42 capable peer. */ s = (v42_state_t *) user_data; s->t400_timer = -1; s->lapm.state = LAPM_UNSUPPORTED; if (s->lapm.status_callback) s->lapm.status_callback(s->lapm.status_callback_user_data, s->lapm.state); /*endif*/ } /*- End of function --------------------------------------------------------*/ static void lapm_send_ua(lapm_state_t *s, int pfbit) { uint8_t frame[3]; lapm_init_header(frame, !s->we_are_originator); frame[1] = (uint8_t) (0x63 | (pfbit << 4)); frame[2] = 0; span_log(&s->logging, SPAN_LOG_FLOW, "Sending unnumbered acknowledgement\n"); lapm_tx_frame(s, frame, 3); } /*- End of function --------------------------------------------------------*/ static void lapm_send_sabme(span_sched_state_t *ss, void *user_data) { lapm_state_t *s; uint8_t frame[3]; s = (lapm_state_t *) user_data; if (s->t401_timer >= 0) { fprintf(stderr, "Deleting T401 q [%p] %d\n", (void *) s, s->t401_timer); span_schedule_del(&s->sched, s->t401_timer); s->t401_timer = -1; } /*endif*/ if (++s->retransmissions > N_400) { /* 8.3.2.2 Too many retries */ s->state = LAPM_RELEASE; if (s->status_callback) s->status_callback(s->status_callback_user_data, s->state); /*endif*/ return; } /*endif*/ fprintf(stderr, "Setting T401 a1 [%p]\n", (void *) s); s->t401_timer = span_schedule_event(&s->sched, T_401, lapm_send_sabme, s); lapm_init_header(frame, s->we_are_originator); frame[1] = 0x7F; frame[2] = 0; span_log(&s->logging, SPAN_LOG_FLOW, "Sending SABME (set asynchronous balanced mode extended)\n"); lapm_tx_frame(s, frame, 3); } /*- End of function --------------------------------------------------------*/ static int lapm_ack_packet(lapm_state_t *s, int num) { lapm_frame_queue_t *f; lapm_frame_queue_t *prev; for (prev = NULL, f = s->txqueue; f; prev = f, f = f->next) { if ((f->frame[1] >> 1) == num) { /* Cancel each packet, as necessary */ if (prev) prev->next = f->next; else s->txqueue = f->next; /*endif*/ span_log(&s->logging, SPAN_LOG_FLOW, "-- ACKing packet %d. New txqueue is %d (-1 means empty)\n", (f->frame[1] >> 1), (s->txqueue) ? (s->txqueue->frame[1] >> 1) : -1); s->last_frame_peer_acknowledged = num; free(f); /* Reset retransmission count if we actually acked something */ s->retransmissions = 0; return 1; } /*endif*/ } /*endfor*/ return 0; } /*- End of function --------------------------------------------------------*/ static void lapm_ack_rx(lapm_state_t *s, int ack) { int i; int cnt; /* This might not be acking anything new */ if (s->last_frame_peer_acknowledged == ack) return; /*endif*/ /* It should be acking something that is actually outstanding */ if ((s->last_frame_peer_acknowledged < s->next_tx_frame && (ack < s->last_frame_peer_acknowledged || ack > s->next_tx_frame)) || (s->last_frame_peer_acknowledged > s->next_tx_frame && (ack > s->last_frame_peer_acknowledged || ack < s->next_tx_frame))) { /* ACK was outside our window --- ignore */ span_log(&s->logging, SPAN_LOG_FLOW, "ACK received outside window, ignoring\n"); return; } /*endif*/ /* Cancel each packet, as necessary */ span_log(&s->logging, SPAN_LOG_FLOW, "-- ACKing all packets from %d to (but not including) %d\n", s->last_frame_peer_acknowledged, ack); for (cnt = 0, i = s->last_frame_peer_acknowledged; i != ack; i = (i + 1) & 0x7F) cnt += lapm_ack_packet(s, i); /*endfor*/ s->last_frame_peer_acknowledged = ack; if (s->txqueue == NULL) { span_log(&s->logging, SPAN_LOG_FLOW, "-- Since there was nothing left, stopping timer T_401\n"); /* Something was ACK'd. Stop timer T_401. */ fprintf(stderr, "T401 a2 is %d [%p]\n", s->t401_timer, (void *) s); if (s->t401_timer >= 0) { fprintf(stderr, "Deleting T401 a3 [%p] %d\n", (void *) s, s->t401_timer); span_schedule_del(&s->sched, s->t401_timer); s->t401_timer = -1; } /*endif*/ } /*endif*/ if (s->t403_timer >= 0) { span_log(&s->logging, SPAN_LOG_FLOW, "-- Stopping timer T_403, since we got an ACK\n"); if (s->t403_timer >= 0) { fprintf(stderr, "Deleting T403 b %d\n", s->t403_timer); span_schedule_del(&s->sched, s->t403_timer); s->t403_timer = -1; } /*endif*/ } /*endif*/ if (s->txqueue) { /* Something left to transmit. Start timer T_401 again if it is stopped */ span_log(&s->logging, SPAN_LOG_FLOW, "-- Something left to transmit (%d). Restarting timer T_401\n", s->txqueue->frame[1] >> 1); if (s->t401_timer < 0) { fprintf(stderr, "Setting T401 b [%p]\n", (void *) s); s->t401_timer = span_schedule_event(&s->sched, T_401, t401_expired, s); } /*endif*/ } else { span_log(&s->logging, SPAN_LOG_FLOW, "-- Nothing left, starting timer T_403\n"); /* Nothing to transmit. Start timer T_403. */ fprintf(stderr, "Setting T403 c\n"); s->t403_timer = span_schedule_event(&s->sched, T_403, t403_expired, s); } /*endif*/ } /*- End of function --------------------------------------------------------*/ static void lapm_reject(lapm_state_t *s) { uint8_t frame[4]; lapm_init_header(frame, !s->we_are_originator); frame[1] = (uint8_t) (0x00 | 0x08 | LAPM_FRAMETYPE_S); /* Where to start retransmission */ frame[2] = (uint8_t) ((s->next_expected_frame << 1) | 0x01); span_log(&s->logging, SPAN_LOG_FLOW, "Sending REJ (reject (%d)\n", s->next_expected_frame); lapm_tx_frame(s, frame, 4); } /*- End of function --------------------------------------------------------*/ static void lapm_rr(lapm_state_t *s, int pfbit) { uint8_t frame[4]; lapm_init_header(frame, !s->we_are_originator); frame[1] = (uint8_t) (0x00 | 0x00 | LAPM_FRAMETYPE_S); frame[2] = (uint8_t) ((s->next_expected_frame << 1) | pfbit); /* Note that we have already ACKed this */ s->last_frame_we_acknowledged = s->next_expected_frame; span_log(&s->logging, SPAN_LOG_FLOW, "Sending RR (receiver ready) (%d)\n", s->next_expected_frame); lapm_tx_frame(s, frame, 4); } /*- End of function --------------------------------------------------------*/ static void t401_expired(span_sched_state_t *ss, void *user_data) { lapm_state_t *s; s = (lapm_state_t *) user_data; fprintf(stderr, "Expiring T401 a4 [%p]\n", (void *) s); s->t401_timer = -1; if (s->txqueue) { /* Retransmit first packet in the queue, setting the poll bit */ span_log(&s->logging, SPAN_LOG_FLOW, "-- Timer T_401 expired, What to do...\n"); /* Update N(R), and set the poll bit */ s->txqueue->frame[2] = (uint8_t)((s->next_expected_frame << 1) | 0x01); s->last_frame_we_acknowledged = s->next_expected_frame; s->solicit_f_bit = TRUE; if (++s->retransmissions <= N_400) { /* Reschedule timer T401 */ span_log(&s->logging, SPAN_LOG_FLOW, "-- Retransmitting %d bytes\n", s->txqueue->len); lapm_tx_frame(s, s->txqueue->frame, s->txqueue->len); span_log(&s->logging, SPAN_LOG_FLOW, "-- Scheduling retransmission (%d)\n", s->retransmissions); fprintf(stderr, "Setting T401 d [%p]\n", (void *) s); s->t401_timer = span_schedule_event(&s->sched, T_401, t401_expired, s); } else { span_log(&s->logging, SPAN_LOG_FLOW, "-- Timeout occured\n"); s->state = LAPM_RELEASE; if (s->status_callback) s->status_callback(s->status_callback_user_data, s->state); lapm_link_down(s); lapm_restart(s); } /*endif*/ } else { span_log(&s->logging, SPAN_LOG_FLOW, "Timer T_401 expired. Nothing to send...\n"); } /*endif*/ } /*- End of function --------------------------------------------------------*/ const char *lapm_status_to_str(int status) { switch (status) { case LAPM_DETECT: return "LAPM_DETECT"; case LAPM_ESTABLISH: return "LAPM_ESTABLISH"; case LAPM_DATA: return "LAPM_DATA"; case LAPM_RELEASE: return "LAPM_RELEASE"; case LAPM_SIGNAL: return "LAPM_SIGNAL"; case LAPM_SETPARM: return "LAPM_SETPARM"; case LAPM_TEST: return "LAPM_TEST"; case LAPM_UNSUPPORTED: return "LAPM_UNSUPPORTED"; } /*endswitch*/ return "???"; } /*- End of function --------------------------------------------------------*/ int lapm_tx(lapm_state_t *s, const void *buf, int len) { return queue_write(s->tx_queue, buf, len); } /*- End of function --------------------------------------------------------*/ int lapm_release(lapm_state_t *s) { s->state = LAPM_RELEASE; return 0; } /*- End of function --------------------------------------------------------*/ int lapm_loopback(lapm_state_t *s, int enable) { s->state = LAPM_TEST; return 0; } /*- End of function --------------------------------------------------------*/ int lapm_break(lapm_state_t *s, int enable) { s->state = LAPM_SIGNAL; return 0; } /*- End of function --------------------------------------------------------*/ int lapm_tx_iframe(lapm_state_t *s, const void *buf, int len, int cr) { lapm_frame_queue_t *f; if ((f = malloc(sizeof(*f) + len + 4)) == NULL) { span_log(&s->logging, SPAN_LOG_FLOW, "Out of memory\n"); return -1; } /*endif*/ lapm_init_header(f->frame, (s->peer_is_originator) ? cr : !cr); f->next = NULL; f->len = len + 4; f->frame[1] = (uint8_t) (s->next_tx_frame << 1); f->frame[2] = (uint8_t) (s->next_expected_frame << 1); memcpy(f->frame + 3, buf, len); s->next_tx_frame = (s->next_tx_frame + 1) & 0x7F; s->last_frame_we_acknowledged = s->next_expected_frame; /* Clear poll bit */ f->frame[2] &= ~0x01; if (s->tx_last) s->tx_last->next = f; else s->txqueue = f; /*endif*/ s->tx_last = f; /* Immediately transmit unless we're in a recovery state */ if (s->retransmissions == 0) lapm_tx_frame(s, f->frame, f->len); /*endif*/ if (s->t403_timer >= 0) { span_log(&s->logging, SPAN_LOG_FLOW, "Stopping T_403 timer\n"); fprintf(stderr, "Deleting T403 c %d\n", s->t403_timer); span_schedule_del(&s->sched, s->t403_timer); s->t403_timer = -1; } /*endif*/ if (s->t401_timer < 0) { span_log(&s->logging, SPAN_LOG_FLOW, "Starting timer T_401\n"); s->t401_timer = span_schedule_event(&s->sched, T_401, t401_expired, s); fprintf(stderr, "Setting T401 e %d [%p]\n", s->t401_timer, (void *) s); } else { span_log(&s->logging, SPAN_LOG_FLOW, "Timer T_401 already running (%d)\n", s->t401_timer); } /*endif*/ return 0; } /*- End of function --------------------------------------------------------*/ static void t403_expired(span_sched_state_t *ss, void *user_data) { lapm_state_t *s; s = (lapm_state_t *) user_data; span_log(&s->logging, SPAN_LOG_FLOW, "Timer T_403 expired. Sending RR and scheduling T_403 again\n"); s->t403_timer = -1; s->retransmissions = 0; /* Solicit an F-bit in the other end's RR */ s->solicit_f_bit = TRUE; lapm_rr(s, 1); /* Restart ourselves */ fprintf(stderr, "Setting T403 f\n"); s->t401_timer = span_schedule_event(&s->sched, T_401, t401_expired, s); } /*- End of function --------------------------------------------------------*/ void lapm_dump(lapm_state_t *s, const uint8_t *frame, int len, int showraw, int txrx) { const char *type; char direction_tag[2]; direction_tag[0] = txrx ? '>' : '<'; direction_tag[1] = '\0'; if (showraw) span_log_buf(&s->logging, SPAN_LOG_FLOW, direction_tag, frame, len); /*endif*/ switch ((frame[1] & LAPM_FRAMETYPE_MASK)) { case LAPM_FRAMETYPE_I: case LAPM_FRAMETYPE_I_ALT: span_log(&s->logging, SPAN_LOG_FLOW, "%c Information frame:\n", direction_tag[0]); break; case LAPM_FRAMETYPE_S: span_log(&s->logging, SPAN_LOG_FLOW, "%c Supervisory frame:\n", direction_tag[0]); break; case LAPM_FRAMETYPE_U: span_log(&s->logging, SPAN_LOG_FLOW, "%c Unnumbered frame:\n", direction_tag[0]); break; } /*endswitch*/ span_log(&s->logging, SPAN_LOG_FLOW, "%c DLCI: %2d C/R: %d EA: %d\n", direction_tag[0], (frame[0] >> 2), (frame[0] & 0x02) ? 1 : 0, (frame[0] & 0x01), direction_tag[0]); switch ((frame[1] & LAPM_FRAMETYPE_MASK)) { case LAPM_FRAMETYPE_I: case LAPM_FRAMETYPE_I_ALT: /* Information frame */ span_log(&s->logging, SPAN_LOG_FLOW, "%c N(S): %03d\n", direction_tag[0], (frame[1] >> 1)); span_log(&s->logging, SPAN_LOG_FLOW, "%c N(R): %03d P: %d\n", direction_tag[0], (frame[2] >> 1), (frame[2] & 0x01)); span_log(&s->logging, SPAN_LOG_FLOW, "%c %d bytes of data\n", direction_tag[0], len - 4); break; case LAPM_FRAMETYPE_S: /* Supervisory frame */ switch (frame[1] & 0x0C) { case 0x00: type = "RR (receive ready)"; break; case 0x04: type = "RNR (receive not ready)"; break; case 0x08: type = "REJ (reject)"; break; case 0x0C: type = "SREJ (selective reject)"; break; default: type = "???"; break; } /*endswitch*/ span_log(&s->logging, SPAN_LOG_FLOW, "%c S: %03d [ %s ]\n", direction_tag[0], frame[1], type); span_log(&s->logging, SPAN_LOG_FLOW, "%c N(R): %03d P/F: %d\n", direction_tag[0], frame[2] >> 1, frame[2] & 0x01); span_log(&s->logging, SPAN_LOG_FLOW, "%c %d bytes of data\n", direction_tag[0], len - 4); break; case LAPM_FRAMETYPE_U: /* Unnumbered frame */ switch (frame[1] & 0xEC) { case 0x00: type = "UI (unnumbered information)"; break; case 0x0C: type = "DM (disconnect mode)"; break; case 0x40: type = "DISC (disconnect)"; break; case 0x60: type = "UA (unnumbered acknowledgement)"; break; case 0x6C: type = "SABME (set asynchronous balanced mode extended)"; break; case 0x84: type = "FRMR (frame reject)"; break; case 0xAC: type = "XID (exchange identification)"; break; case 0xE0: type = "TEST (test)"; break; default: type = "???"; break; } /*endswitch*/ span_log(&s->logging, SPAN_LOG_FLOW, "%c M: %03d [ %s ] P/F: %d\n", direction_tag[0], frame[1], type, (frame[1] >> 4) & 1); span_log(&s->logging, SPAN_LOG_FLOW, "%c %d bytes of data\n", direction_tag[0], len - 3); break; } /*endswitch*/ } /*- End of function --------------------------------------------------------*/ static void lapm_link_up(lapm_state_t *s) { uint8_t buf[1024]; int len; lapm_reset(s); /* Go into connection established state */ s->state = LAPM_DATA; if (s->status_callback) s->status_callback(s->status_callback_user_data, s->state); /*endif*/ if (!queue_empty(s->tx_queue)) { if ((len = queue_read(s->tx_queue, buf, s->n401)) > 0) lapm_tx_iframe(s, buf, len, TRUE); /*endif*/ } /*endif*/ if (s->t401_timer >= 0) { fprintf(stderr, "Deleting T401 x [%p] %d\n", (void *) s, s->t401_timer); span_schedule_del(&s->sched, s->t401_timer); s->t401_timer = -1; } /*endif*/ /* Start the T403 timer */ fprintf(stderr, "Setting T403 g\n"); s->t403_timer = span_schedule_event(&s->sched, T_403, t403_expired, s); } /*- End of function --------------------------------------------------------*/ static void lapm_link_down(lapm_state_t *s) { lapm_reset(s); if (s->status_callback) s->status_callback(s->status_callback_user_data, s->state); /*endif*/ } /*- End of function --------------------------------------------------------*/ void lapm_reset(lapm_state_t *s) { lapm_frame_queue_t *f; lapm_frame_queue_t *p; /* Having received a SABME, we need to reset our entire state */ s->next_tx_frame = 0; s->last_frame_peer_acknowledged = 0; s->next_expected_frame = 0; s->last_frame_we_acknowledged = 0; s->window_size_k = 15; s->n401 = 128; if (s->t401_timer >= 0) { fprintf(stderr, "Deleting T401 d [%p] %d\n", (void *) s, s->t401_timer); span_schedule_del(&s->sched, s->t401_timer); s->t401_timer = -1; } /*endif*/ if (s->t403_timer >= 0) { fprintf(stderr, "Deleting T403 e %d\n", s->t403_timer); span_schedule_del(&s->sched, s->t403_timer); s->t403_timer = -1; } /*endif*/ s->busy = FALSE; s->solicit_f_bit = FALSE; s->state = LAPM_RELEASE; s->retransmissions = 0; /* Discard anything waiting to go out */ for (f = s->txqueue; f; ) { p = f; f = f->next; free(p); } /*endfor*/ s->txqueue = NULL; } /*- End of function --------------------------------------------------------*/ void lapm_receive(void *user_data, const uint8_t *frame, int len, int ok) { lapm_state_t *s; lapm_frame_queue_t *f; int sendnow; int octet; int s_field; int m_field; fprintf(stderr, "LAPM receive %d %d\n", ok, len); if (!ok || len == 0) return; /*endif*/ s = (lapm_state_t *) user_data; if (len < 0) { /* Special conditions */ switch (len) { case PUTBIT_TRAINING_FAILED: span_log(&s->logging, SPAN_LOG_DEBUG, "Training failed\n"); break; case PUTBIT_TRAINING_SUCCEEDED: span_log(&s->logging, SPAN_LOG_DEBUG, "Training succeeded\n"); break; case PUTBIT_CARRIER_UP: span_log(&s->logging, SPAN_LOG_DEBUG, "Carrier up\n"); break; case PUTBIT_CARRIER_DOWN: span_log(&s->logging, SPAN_LOG_DEBUG, "Carrier down\n"); break; case PUTBIT_FRAMING_OK: span_log(&s->logging, SPAN_LOG_DEBUG, "Framing OK\n"); break; case PUTBIT_ABORT: span_log(&s->logging, SPAN_LOG_DEBUG, "Abort\n"); break; default: span_log(&s->logging, SPAN_LOG_DEBUG, "Eh!\n"); break; } /*endswitch*/ return; } /*endif*/ if ((s->debug & LAPM_DEBUG_LAPM_DUMP)) lapm_dump(s, frame, len, s->debug & LAPM_DEBUG_LAPM_RAW, FALSE); /*endif*/ octet = 0; /* We do not expect extended addresses */ if ((frame[octet] & 0x01) == 0) return; /*endif*/ /* Check for DLCIs we do not recognise */ if ((frame[octet] >> 2) != LAPM_DLCI_DTE_TO_DTE) return; /*endif*/ octet++; switch (frame[octet] & LAPM_FRAMETYPE_MASK) { case LAPM_FRAMETYPE_I: case LAPM_FRAMETYPE_I_ALT: if (s->state != LAPM_DATA) { span_log(&s->logging, SPAN_LOG_FLOW, "!! Got an I-frame while link state is %d\n", s->state); break; } /*endif*/ /* Information frame */ if (len < 4) { span_log(&s->logging, SPAN_LOG_FLOW, "!! Received short I-frame (expected 4, got %d)\n", len); break; } /*endif*/ /* Make sure this is a valid packet */ if ((frame[1] >> 1) == s->next_expected_frame) { /* Increment next expected I-frame */ s->next_expected_frame = (s->next_expected_frame + 1) & 0x7F; /* Handle their ACK */ lapm_ack_rx(s, frame[2] >> 1); if ((frame[2] & 0x01)) { /* If the Poll/Final bit is set, send the RR immediately */ lapm_rr(s, 1); } /*endif*/ s->iframe_receive(s->iframe_receive_user_data, frame + 3, len - 4); /* Send an RR if one wasn't sent already */ if (s->last_frame_we_acknowledged != s->next_expected_frame) lapm_rr(s, 0); /*endif*/ } else { if (((s->next_expected_frame - (frame[1] >> 1)) & 127) < s->window_size_k) { /* It's within our window -- send back an RR */ lapm_rr(s, 0); } else { lapm_reject(s); } /*endif*/ } /*endif*/ break; case LAPM_FRAMETYPE_S: if (s->state != LAPM_DATA) { span_log(&s->logging, SPAN_LOG_FLOW, "!! Got S-frame while link down\n"); break; } /*endif*/ if (len < 4) { span_log(&s->logging, SPAN_LOG_FLOW, "!! Received short S-frame (expected 4, got %d)\n", len); break; } /*endif*/ s_field = frame[octet] & 0xEC; switch (s_field) { case 0x00: /* RR (receive ready) */ s->busy = FALSE; /* Acknowledge frames as necessary */ lapm_ack_rx(s, frame[2] >> 1); if ((frame[2] & 0x01)) { /* If P/F is one, respond with an RR with the P/F bit set */ if (s->solicit_f_bit) { span_log(&s->logging, SPAN_LOG_FLOW, "-- Got RR response to our frame\n"); } else { span_log(&s->logging, SPAN_LOG_FLOW, "-- Unsolicited RR with P/F bit, responding\n"); lapm_rr(s, 1); } /*endif*/ s->solicit_f_bit = FALSE; } /*endif*/ break; case 0x04: /* RNR (receive not ready) */ span_log(&s->logging, SPAN_LOG_FLOW, "-- Got receiver not ready\n"); s->busy = TRUE; break; case 0x08: /* REJ (reject) */ /* Just retransmit */ span_log(&s->logging, SPAN_LOG_FLOW, "-- Got reject requesting packet %d... Retransmitting.\n", frame[2] >> 1); if ((frame[2] & 0x01)) { /* If it has the poll bit set, send an appropriate supervisory response */ lapm_rr(s, 1); } /*endif*/ sendnow = FALSE; /* Resend the appropriate I-frame */ for (f = s->txqueue; f; f = f->next) { if (sendnow || (f->frame[1] >> 1) == (frame[2] >> 1)) { /* Matches the request, or follows in our window */ sendnow = TRUE; span_log(&s->logging, SPAN_LOG_FLOW, "!! Got reject for frame %d, retransmitting frame %d now, updating n_r!\n", frame[2] >> 1, f->frame[1] >> 1); f->frame[2] = (uint8_t) (s->next_expected_frame << 1); lapm_tx_frame(s, f->frame, f->len); } /*endif*/ } /*endfor*/ if (!sendnow) { if (s->txqueue) { /* This should never happen */ if ((frame[2] & 0x01) == 0 || (frame[2] >> 1)) { span_log(&s->logging, SPAN_LOG_FLOW, "!! Got reject for frame %d, but we only have others!\n", frame[2] >> 1); } /*endif*/ } else { /* Hrm, we have nothing to send, but have been REJ'd. Reset last_frame_peer_acknowledged, next_tx_frame, etc */ span_log(&s->logging, SPAN_LOG_FLOW, "!! Got reject for frame %d, but we have nothing -- resetting!\n", frame[2] >> 1); s->last_frame_peer_acknowledged = s->next_tx_frame = frame[2] >> 1; /* Reset t401 timer if it was somehow going */ if (s->t401_timer >= 0) { fprintf(stderr, "Deleting T401 f [%p] %d\n", (void *) s, s->t401_timer); span_schedule_del(&s->sched, s->t401_timer); s->t401_timer = -1; } /*endif*/ /* Reset and restart t403 timer */ if (s->t403_timer >= 0) { fprintf(stderr, "Deleting T403 g %d\n", s->t403_timer); span_schedule_del(&s->sched, s->t403_timer); s->t403_timer = -1; } /*endif*/ fprintf(stderr, "Setting T403 h\n"); s->t403_timer = span_schedule_event(&s->sched, T_403, t403_expired, s); } /*endif*/ } /*endif*/ break; case 0x0C: /* SREJ (selective reject) */ break; default: span_log(&s->logging, SPAN_LOG_FLOW, "!! XXX Unknown Supervisory frame sd=0x%02x,pf=%02xnr=%02x vs=%02x, va=%02x XXX\n", s_field, frame[2] & 0x01, frame[2] >> 1, s->next_tx_frame, s->last_frame_peer_acknowledged); break; } /*endswitch*/ break; case LAPM_FRAMETYPE_U: if (len < 3) { span_log(&s->logging, SPAN_LOG_FLOW, "!! Received too short unnumbered frame\n"); break; } /*endif*/ m_field = frame[octet] & 0xEC; switch (m_field) { case 0x00: /* UI (unnumbered information) */ switch (frame[++octet] & 0x7F) { case 0x40: /* BRK */ span_log(&s->logging, SPAN_LOG_FLOW, "BRK - option %d, length %d\n", (frame[octet] >> 5), frame[octet + 1]); octet += 2; break; case 0x60: /* BRKACK */ span_log(&s->logging, SPAN_LOG_FLOW, "BRKACK\n"); break; default: /* Unknown */ span_log(&s->logging, SPAN_LOG_FLOW, "Unknown UI type\n"); break; } /*endswitch*/ break; case 0x0C: /* DM (disconnect mode) */ if ((frame[octet] & 0x10)) { span_log(&s->logging, SPAN_LOG_FLOW, "-- Got Unconnected Mode from peer.\n"); /* Disconnected mode, try again */ lapm_link_down(s); lapm_restart(s); } else { span_log(&s->logging, SPAN_LOG_FLOW, "-- DM (disconnect mode) requesting SABME, starting.\n"); /* Requesting that we start */ lapm_restart(s); } /*endif*/ break; case 0x40: /* DISC (disconnect) */ span_log(&s->logging, SPAN_LOG_FLOW, "-- Got DISC (disconnect) from peer.\n"); /* Acknowledge */ lapm_send_ua(s, (frame[octet] & 0x10)); lapm_link_down(s); break; case 0x60: /* UA (unnumbered acknowledgement) */ if (s->state == LAPM_ESTABLISH) { span_log(&s->logging, SPAN_LOG_FLOW, "-- Got UA (unnumbered acknowledgement) from %s peer. Link up.\n", (frame[0] & 0x02) ? "xxx" : "yyy"); lapm_link_up(s); } else { span_log(&s->logging, SPAN_LOG_FLOW, "!! Got a UA (unnumbered acknowledgement) in state %d\n", s->state); } /*endif*/ break; case 0x6C: /* SABME (set asynchronous balanced mode extended) */ span_log(&s->logging, SPAN_LOG_FLOW, "-- Got SABME (set asynchronous balanced mode extended) from %s peer.\n", (frame[0] & 0x02) ? "yyy" : "xxx"); if ((frame[0] & 0x02)) { s->peer_is_originator = TRUE; if (s->we_are_originator) { /* We can't both be originators */ span_log(&s->logging, SPAN_LOG_FLOW, "We think we are the originator, but they think so too."); break; } /*endif*/ } else { s->peer_is_originator = FALSE; if (!s->we_are_originator) { /* We can't both be answerers */ span_log(&s->logging, SPAN_LOG_FLOW, "We think we are the answerer, but they think so too.\n"); break; } /*endif*/ } /*endif*/ /* Send unnumbered acknowledgement */ lapm_send_ua(s, (frame[octet] & 0x10)); lapm_link_up(s); break; case 0x84: /* FRMR (frame reject) */ span_log(&s->logging, SPAN_LOG_FLOW, "!! FRMR (frame reject).\n"); break; case 0xAC: /* XID (exchange identification) */ span_log(&s->logging, SPAN_LOG_FLOW, "!! XID (exchange identification) frames not supported\n"); break; case 0xE0: /* TEST (test) */ span_log(&s->logging, SPAN_LOG_FLOW, "!! TEST (test) frames not supported\n"); break; default: span_log(&s->logging, SPAN_LOG_FLOW, "!! Don't know what to do with M=%X u-frames\n", m_field); break; } /*endswitch*/ break; } /*endswitch*/ } /*- End of function --------------------------------------------------------*/ static void lapm_hdlc_underflow(void *user_data) { lapm_state_t *s; uint8_t buf[1024]; int len; s = (lapm_state_t *) user_data; span_log(&s->logging, SPAN_LOG_FLOW, "HDLC underflow\n"); if (s->state == LAPM_DATA) { if (!queue_empty(s->tx_queue)) { if ((len = queue_read(s->tx_queue, buf, s->n401)) > 0) lapm_tx_iframe(s, buf, len, TRUE); /*endif*/ } /*endif*/ } /*endif*/ } /*- End of function --------------------------------------------------------*/ void lapm_restart(lapm_state_t *s) { #if 0 if (s->state != LAPM_RELEASE) { span_log(&s->logging, SPAN_LOG_FLOW, "!! lapm_restart: Not in 'Link Connection Released' state\n"); return; } /*endif*/ #endif span_log_init(&s->logging, SPAN_LOG_NONE, NULL); span_log_set_protocol(&s->logging, "LAP.M"); hdlc_tx_init(&s->hdlc_tx, FALSE, 1, TRUE, lapm_hdlc_underflow, s); hdlc_rx_init(&s->hdlc_rx, FALSE, FALSE, 1, lapm_receive, s); /* TODO: This is a bodge! */ s->t401_timer = -1; s->t402_timer = -1; s->t403_timer = -1; lapm_reset(s); /* TODO: Maybe we should implement T_WAIT? */ lapm_send_sabme(NULL, s); } /*- End of function --------------------------------------------------------*/ #if 0 static void lapm_init(lapm_state_t *s) { lapm_restart(s); } /*- End of function --------------------------------------------------------*/ #endif static void negotiation_rx_bit(v42_state_t *s, int new_bit) { /* DC1 with even parity, 8-16 ones, DC1 with odd parity, 8-16 ones */ //uint8_t odp = "0100010001 11111111 0100010011 11111111"; /* V.42 OK E , 8-16 ones, C, 8-16 ones */ //uint8_t adp_v42 = "0101000101 11111111 0110000101 11111111"; /* V.42 disabled E, 8-16 ones, NULL, 8-16 ones */ //uint8_t adp_nov42 = "0101000101 11111111 0000000001 11111111"; /* There may be no negotiation, so we need to process this data through the HDLC receiver as well */ if (new_bit < 0) { /* Special conditions */ switch (new_bit) { case PUTBIT_CARRIER_UP: break; case PUTBIT_CARRIER_DOWN: case PUTBIT_TRAINING_SUCCEEDED: case PUTBIT_TRAINING_FAILED: break; default: span_log(&s->logging, SPAN_LOG_WARNING, "Unexpected special 'bit' code %d\n", new_bit); break; } /*endswitch*/ return; } /*endif*/ new_bit &= 1; s->rxstream = (s->rxstream << 1) | new_bit; switch (s->rx_negotiation_step) { case 0: /* Look for some ones */ if (new_bit) break; /*endif*/ s->rx_negotiation_step = 1; s->rxbits = 0; s->rxstream = ~1; s->rxoks = 0; break; case 1: /* Look for the first character */ if (++s->rxbits < 9) break; /*endif*/ s->rxstream &= 0x3FF; if (s->caller && s->rxstream == 0x145) { s->rx_negotiation_step++; } else if (!s->caller && s->rxstream == 0x111) { s->rx_negotiation_step++; } else { s->rx_negotiation_step = 0; } /*endif*/ s->rxbits = 0; s->rxstream = ~0; break; case 2: /* Look for 8 to 16 ones */ s->rxbits++; if (new_bit) break; /*endif*/ if (s->rxbits >= 8 && s->rxbits <= 16) s->rx_negotiation_step++; else s->rx_negotiation_step = 0; /*endif*/ s->rxbits = 0; s->rxstream = ~1; break; case 3: /* Look for the second character */ if (++s->rxbits < 9) break; /*endif*/ s->rxstream &= 0x3FF; if (s->caller && s->rxstream == 0x185) { s->rx_negotiation_step++; } else if (s->caller && s->rxstream == 0x001) { s->rx_negotiation_step++; } else if (!s->caller && s->rxstream == 0x113) { s->rx_negotiation_step++; } else { s->rx_negotiation_step = 0; } /*endif*/ s->rxbits = 0; s->rxstream = ~0; break; case 4: /* Look for 8 to 16 ones */ s->rxbits++; if (new_bit) break; /*endif*/ if (s->rxbits >= 8 && s->rxbits <= 16) { if (++s->rxoks >= 2) { /* HIT */ s->rx_negotiation_step++; if (s->caller) { if (s->t400_timer >= 0) { fprintf(stderr, "Deleting T400 h %d\n", s->t400_timer); span_schedule_del(&s->lapm.sched, s->t400_timer); s->t400_timer = -1; } /*endif*/ s->lapm.state = LAPM_ESTABLISH; if (s->lapm.status_callback) s->lapm.status_callback(s->lapm.status_callback_user_data, s->lapm.state); /*endif*/ } else { s->odp_seen = TRUE; } /*endif*/ break; } /*endif*/ s->rx_negotiation_step = 1; s->rxbits = 0; s->rxstream = ~1; } else { s->rx_negotiation_step = 0; s->rxbits = 0; s->rxstream = ~0; } /*endif*/ break; case 5: /* Parked */ break; } /*endswitch*/ } /*- End of function --------------------------------------------------------*/ static int v42_support_negotiation_tx_bit(v42_state_t *s) { int bit; if (s->caller) { if (s->txbits <= 0) { s->txstream = 0x3FE22; s->txbits = 36; } else if (s->txbits == 18) { s->txstream = 0x3FF22; } /*endif*/ bit = s->txstream & 1; s->txstream >>= 1; s->txbits--; } else { if (s->odp_seen && s->txadps < 10) { if (s->txbits <= 0) { if (++s->txadps >= 10) { if (s->t400_timer >= 0) { fprintf(stderr, "Deleting T400 i %d\n", s->t400_timer); span_schedule_del(&s->lapm.sched, s->t400_timer); s->t400_timer = -1; } /*endif*/ s->lapm.state = LAPM_ESTABLISH; if (s->lapm.status_callback) s->lapm.status_callback(s->lapm.status_callback_user_data, s->lapm.state); /*endif*/ s->txstream = 1; } else { s->txstream = 0x3FE8A; s->txbits = 36; } /*endif*/ } else if (s->txbits == 18) { s->txstream = 0x3FE86; } /*endif*/ bit = s->txstream & 1; s->txstream >>= 1; s->txbits--; } else { bit = 1; } /*endif*/ } /*endif*/ return bit; } /*- End of function --------------------------------------------------------*/ void v42_rx_bit(void *user_data, int bit) { v42_state_t *s; s = (v42_state_t *) user_data; if (s->lapm.state == LAPM_DETECT) negotiation_rx_bit(s, bit); else hdlc_rx_put_bit(&s->lapm.hdlc_rx, bit); /*endif*/ } /*- End of function --------------------------------------------------------*/ int v42_tx_bit(void *user_data) { v42_state_t *s; int bit; s = (v42_state_t *) user_data; if (s->lapm.state == LAPM_DETECT) bit = v42_support_negotiation_tx_bit(s); else bit = hdlc_tx_get_bit(&s->lapm.hdlc_tx); /*endif*/ return bit; } /*- End of function --------------------------------------------------------*/ void v42_set_status_callback(v42_state_t *s, v42_status_func_t callback, void *user_data) { s->lapm.status_callback = callback; s->lapm.status_callback_user_data = user_data; } /*- End of function --------------------------------------------------------*/ void v42_restart(v42_state_t *s) { span_schedule_init(&s->lapm.sched); s->lapm.we_are_originator = s->caller; lapm_restart(&s->lapm); if (s->detect) { s->txstream = ~0; s->txbits = 0; s->rxstream = ~0; s->rxbits = 0; s->rxoks = 0; s->txadps = 0; s->rx_negotiation_step = 0; s->odp_seen = FALSE; fprintf(stderr, "Setting T400 i\n"); s->t400_timer = span_schedule_event(&s->lapm.sched, T_400, t400_expired, s); s->lapm.state = LAPM_DETECT; } else { s->lapm.state = LAPM_ESTABLISH; } /*endif*/ } /*- End of function --------------------------------------------------------*/ v42_state_t *v42_init(v42_state_t *s, int caller, int detect, v42_frame_handler_t frame_handler, void *user_data) { int alloced; if (frame_handler == NULL) return NULL; /*endif*/ alloced = FALSE; if (s == NULL) { if ((s = (v42_state_t *) malloc(sizeof(*s))) == NULL) return NULL; alloced = TRUE; } memset(s, 0, sizeof(*s)); s->caller = caller; s->detect = detect; s->lapm.iframe_receive = frame_handler; s->lapm.iframe_receive_user_data = user_data; s->lapm.debug |= (LAPM_DEBUG_LAPM_RAW | LAPM_DEBUG_LAPM_DUMP | LAPM_DEBUG_LAPM_STATE); s->lapm.t401_timer = s->lapm.t402_timer = s->lapm.t403_timer = -1; if ((s->lapm.tx_queue = queue_init(NULL, 16384, 0)) == NULL) { if (alloced) free(s); return NULL; } /*endif*/ span_log_init(&s->logging, SPAN_LOG_NONE, NULL); span_log_set_protocol(&s->logging, "V.42"); v42_restart(s); return s; } /*- End of function --------------------------------------------------------*/ int v42_release(v42_state_t *s) { free(s); return 0; } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/ima_adpcm.c0000644000175000017500000003305211150047216017736 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * ima_adpcm.c - Conversion routines between linear 16 bit PCM data and * IMA/DVI/Intel ADPCM format. * * Written by Steve Underwood * * Copyright (C) 2001, 2004 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: ima_adpcm.c,v 1.28 2008/07/02 14:48:25 steveu Exp $ */ /*! \file */ #if defined(HAVE_CONFIG_H) #include #endif #include #include #include #include "floating_fudge.h" #if defined(HAVE_TGMATH_H) #include #endif #if defined(HAVE_MATH_H) #include #endif #include "spandsp/telephony.h" #include "spandsp/dc_restore.h" #include "spandsp/ima_adpcm.h" /* * Intel/DVI ADPCM coder/decoder. * * The algorithm for this coder was taken from the IMA Compatability Project * proceedings, Vol 2, Number 2; May 1992. * * The RTP payload specs. reference a variant of DVI, called VDVI. This attempts to * further compress, in a variable bit rate manner, by expressing the 4 bit codes * from the DVI codec as: * * 0 00 * 1 010 * 2 1100 * 3 11100 * 4 111100 * 5 1111100 * 6 11111100 * 7 11111110 * 8 10 * 9 011 * 10 1101 * 11 11101 * 12 111101 * 13 1111101 * 14 11111101 * 15 11111111 * * Any left over bits in the last octet of an encoded burst are set to one. */ /* DVI4 uses an adaptive delta pulse code modulation (ADPCM) encoding scheme that was specified by the Interactive Multimedia Association (IMA) as the "IMA ADPCM wave type". However, the encoding defined here as DVI4 differs in three respects from the IMA specification: o The RTP DVI4 header contains the predicted value rather than the first sample value contained the IMA ADPCM block header. o IMA ADPCM blocks contain an odd number of samples, since the first sample of a block is contained just in the header (uncompressed), followed by an even number of compressed samples. DVI4 has an even number of compressed samples only, using the `predict' word from the header to decode the first sample. o For DVI4, the 4-bit samples are packed with the first sample in the four most significant bits and the second sample in the four least significant bits. In the IMA ADPCM codec, the samples are packed in the opposite order. Each packet contains a single DVI block. This profile only defines the 4-bit-per-sample version, while IMA also specified a 3-bit-per- sample encoding. The "header" word for each channel has the following structure: int16 predict; // predicted value of first sample // from the previous block (L16 format) u_int8 index; // current index into stepsize table u_int8 reserved; // set to zero by sender, ignored by receiver Each octet following the header contains two 4-bit samples, thus the number of samples per packet MUST be even because there is no means to indicate a partially filled last octet. */ #define STEP_MAX 88 /* Intel ADPCM step variation table */ static const int step_size[STEP_MAX + 1] = { 7, 8, 9, 10, 11, 12, 13, 14, 16, 17, 19, 21, 23, 25, 28, 31, 34, 37, 41, 45, 50, 55, 60, 66, 73, 80, 88, 97, 107, 118, 130, 143, 157, 173, 190, 209, 230, 253, 279, 307, 337, 371, 408, 449, 494, 544, 598, 658, 724, 796, 876, 963, 1060, 1166, 1282, 1411, 1552, 1707, 1878, 2066, 2272, 2499, 2749, 3024, 3327, 3660, 4026, 4428, 4871, 5358, 5894, 6484, 7132, 7845, 8630, 9493, 10442, 11487, 12635, 13899, 15289, 16818, 18500, 20350, 22385, 24623, 27086, 29794, 32767 }; static const int step_adjustment[8] = { -1, -1, -1, -1, 2, 4, 6, 8 }; static const struct { uint8_t code; uint8_t bits; } vdvi_encode[] = { {0x00, 2}, {0x02, 3}, {0x0C, 4}, {0x1C, 5}, {0x3C, 6}, {0x7C, 7}, {0xFC, 8}, {0xFE, 8}, {0x02, 2}, {0x03, 3}, {0x0D, 4}, {0x1D, 5}, {0x3D, 6}, {0x7D, 7}, {0xFD, 8}, {0xFF, 8} }; static const struct { uint16_t code; uint16_t mask; uint8_t bits; } vdvi_decode[] = { {0x0000, 0xC000, 2}, {0x4000, 0xE000, 3}, {0xC000, 0xF000, 4}, {0xE000, 0xF800, 5}, {0xF000, 0xFC00, 6}, {0xF800, 0xFE00, 7}, {0xFC00, 0xFF00, 8}, {0xFE00, 0xFF00, 8}, {0x8000, 0xC000, 2}, {0x6000, 0xE000, 3}, {0xD000, 0xF000, 4}, {0xE800, 0xF800, 5}, {0xF400, 0xFC00, 6}, {0xFA00, 0xFE00, 7}, {0xFD00, 0xFF00, 8}, {0xFF00, 0xFF00, 8} }; static int16_t decode(ima_adpcm_state_t *s, uint8_t adpcm) { int e; int ss; int16_t linear; /* e = (adpcm+0.5)*step/4 */ ss = step_size[s->step_index]; e = ss >> 3; if (adpcm & 0x01) e += (ss >> 2); /*endif*/ if (adpcm & 0x02) e += (ss >> 1); /*endif*/ if (adpcm & 0x04) e += ss; /*endif*/ if (adpcm & 0x08) e = -e; /*endif*/ linear = saturate(s->last + e); s->last = linear; s->step_index += step_adjustment[adpcm & 0x07]; if (s->step_index < 0) s->step_index = 0; else if (s->step_index > STEP_MAX) s->step_index = STEP_MAX; /*endif*/ return linear; } /*- End of function --------------------------------------------------------*/ static uint8_t encode(ima_adpcm_state_t *s, int16_t linear) { int e; int ss; int adpcm; int diff; int initial_e; ss = step_size[s->step_index]; initial_e = e = linear - s->last; diff = ss >> 3; adpcm = (uint8_t) 0x00; if (e < 0) { adpcm = (uint8_t) 0x08; e = -e; } /*endif*/ if (e >= ss) { adpcm |= (uint8_t) 0x04; e -= ss; } /*endif*/ ss >>= 1; if (e >= ss) { adpcm |= (uint8_t) 0x02; e -= ss; } /*endif*/ ss >>= 1; if (e >= ss) { adpcm |= (uint8_t) 0x01; e -= ss; } /*endif*/ if (initial_e < 0) diff = -(diff - initial_e - e); else diff = diff + initial_e - e; /*endif*/ s->last = saturate(diff + s->last); s->step_index += step_adjustment[adpcm & 0x07]; if (s->step_index < 0) s->step_index = 0; else if (s->step_index > STEP_MAX) s->step_index = STEP_MAX; /*endif*/ return (uint8_t) adpcm; } /*- End of function --------------------------------------------------------*/ ima_adpcm_state_t *ima_adpcm_init(ima_adpcm_state_t *s, int variant, int chunk_size) { if (s == NULL) { if ((s = (ima_adpcm_state_t *) malloc(sizeof(*s))) == NULL) return NULL; } /*endif*/ memset(s, 0, sizeof(*s)); s->variant = variant; s->chunk_size = chunk_size; return s; } /*- End of function --------------------------------------------------------*/ int ima_adpcm_release(ima_adpcm_state_t *s) { free(s); return 0; } /*- End of function --------------------------------------------------------*/ int ima_adpcm_decode(ima_adpcm_state_t *s, int16_t amp[], const uint8_t ima_data[], int ima_bytes) { int i; int j; int samples; uint16_t code; samples = 0; switch (s->variant) { case IMA_ADPCM_IMA4: i = 0; if (s->chunk_size == 0) { amp[samples++] = (ima_data[1] << 8) | ima_data[0]; s->step_index = ima_data[2]; s->last = amp[0]; i = 4; } /*endif*/ for ( ; i < ima_bytes; i++) { amp[samples++] = decode(s, ima_data[i] & 0xF); amp[samples++] = decode(s, (ima_data[i] >> 4) & 0xF); } /*endfor*/ break; case IMA_ADPCM_DVI4: i = 0; if (s->chunk_size == 0) { s->last = (int16_t) ((ima_data[0] << 8) | ima_data[1]); s->step_index = ima_data[2]; i = 4; } /*endif*/ for ( ; i < ima_bytes; i++) { amp[samples++] = decode(s, (ima_data[i] >> 4) & 0xF); amp[samples++] = decode(s, ima_data[i] & 0xF); } /*endfor*/ break; case IMA_ADPCM_VDVI: i = 0; if (s->chunk_size == 0) { s->last = (int16_t) ((ima_data[0] << 8) | ima_data[1]); s->step_index = ima_data[2]; i = 4; } /*endif*/ code = 0; s->bits = 0; for (;;) { if (s->bits <= 8) { if (i >= ima_bytes) break; /*endif*/ code |= ((uint16_t) ima_data[i++] << (8 - s->bits)); s->bits += 8; } /*endif*/ for (j = 0; j < 8; j++) { if ((vdvi_decode[j].mask & code) == vdvi_decode[j].code) break; if ((vdvi_decode[j + 8].mask & code) == vdvi_decode[j + 8].code) { j += 8; break; } /*endif*/ } /*endfor*/ amp[samples++] = decode(s, (uint8_t) j); code <<= vdvi_decode[j].bits; s->bits -= vdvi_decode[j].bits; } /*endfor*/ /* Use up the remanents of the last octet */ while (s->bits > 0) { for (j = 0; j < 8; j++) { if ((vdvi_decode[j].mask & code) == vdvi_decode[j].code) break; /*endif*/ if ((vdvi_decode[j + 8].mask & code) == vdvi_decode[j + 8].code) { j += 8; break; } /*endif*/ } /*endfor*/ if (vdvi_decode[j].bits > s->bits) break; /*endif*/ amp[samples++] = decode(s, (uint8_t) j); code <<= vdvi_decode[j].bits; s->bits -= vdvi_decode[j].bits; } /*endwhile*/ break; } /*endswitch*/ return samples; } /*- End of function --------------------------------------------------------*/ int ima_adpcm_encode(ima_adpcm_state_t *s, uint8_t ima_data[], const int16_t amp[], int len) { int i; int bytes; uint8_t code; bytes = 0; switch (s->variant) { case IMA_ADPCM_IMA4: i = 0; if (s->chunk_size == 0) { ima_data[bytes++] = (uint8_t) amp[0]; ima_data[bytes++] = (uint8_t) (amp[0] >> 8); ima_data[bytes++] = (uint8_t) s->step_index; ima_data[bytes++] = 0; s->last = amp[0]; s->bits = 0; i = 1; } /*endif*/ for ( ; i < len; i++) { s->ima_byte = (uint8_t) ((s->ima_byte >> 4) | (encode(s, amp[i]) << 4)); if ((s->bits++ & 1)) ima_data[bytes++] = (uint8_t) s->ima_byte; /*endif*/ } /*endfor*/ break; case IMA_ADPCM_DVI4: if (s->chunk_size == 0) { ima_data[bytes++] = (uint8_t) (s->last >> 8); ima_data[bytes++] = (uint8_t) s->last; ima_data[bytes++] = (uint8_t) s->step_index; ima_data[bytes++] = 0; } /*endif*/ for (i = 0; i < len; i++) { s->ima_byte = (uint8_t) ((s->ima_byte << 4) | encode(s, amp[i])); if ((s->bits++ & 1)) ima_data[bytes++] = (uint8_t) s->ima_byte; /*endif*/ } /*endfor*/ break; case IMA_ADPCM_VDVI: if (s->chunk_size == 0) { ima_data[bytes++] = (uint8_t) (s->last >> 8); ima_data[bytes++] = (uint8_t) s->last; ima_data[bytes++] = (uint8_t) s->step_index; ima_data[bytes++] = 0; } /*endif*/ s->bits = 0; for (i = 0; i < len; i++) { code = encode(s, amp[i]); s->ima_byte = (s->ima_byte << vdvi_encode[code].bits) | vdvi_encode[code].code; s->bits += vdvi_encode[code].bits; if (s->bits >= 8) { s->bits -= 8; ima_data[bytes++] = (uint8_t) (s->ima_byte >> s->bits); } /*endif*/ } /*endfor*/ if (s->bits) ima_data[bytes++] = (uint8_t) (((s->ima_byte << 8) | 0xFF) >> s->bits); /*endif*/ break; } /*endswitch*/ return bytes; } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/gsm0610_long_term.c0000644000175000017500000003045011150047216021166 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * gsm0610_long_term.c - GSM 06.10 full rate speech codec. * * Written by Steve Underwood * * Copyright (C) 2006 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * This code is based on the widely used GSM 06.10 code available from * http://kbs.cs.tu-berlin.de/~jutta/toast.html * * $Id: gsm0610_long_term.c,v 1.16 2008/07/02 14:48:25 steveu Exp $ */ /*! \file */ #if defined(HAVE_CONFIG_H) #include #endif #include #include #include "floating_fudge.h" #if defined(HAVE_TGMATH_H) #include #endif #if defined(HAVE_MATH_H) #include #endif #include #include "spandsp/telephony.h" #include "spandsp/bitstream.h" #include "spandsp/dc_restore.h" #include "spandsp/gsm0610.h" #include "gsm0610_local.h" /* Table 4.3a Decision level of the LTP gain quantizer */ static const int16_t gsm_DLB[4] = { 6554, 16384, 26214, 32767 }; /* Table 4.3b Quantization levels of the LTP gain quantizer */ static const int16_t gsm_QLB[4] = { 3277, 11469, 21299, 32767 }; /* 4.2.11 .. 4.2.12 LONG TERM PREDICTOR (LTP) SECTION */ #if defined(__GNUC__) && defined(__i386__) int32_t gsm0610_max_cross_corr(const int16_t *wt, const int16_t *dp, int16_t *Nc_out) { int32_t lmax; int32_t out; __asm__ __volatile__( " emms;\n" " pushl %%ebx;\n" " movl $0,%%edx;\n" /* Will be maximum inner-product */ " movl $40,%%ebx;\n" " movl %%ebx,%%ecx;\n" /* Will be index of max inner-product */ " subl $80,%%esi;\n" " .p2align 2;\n" "1:\n" " movq (%%edi),%%mm0;\n" " movq (%%esi),%%mm2;\n" " pmaddwd %%mm2,%%mm0;\n" " movq 8(%%edi),%%mm1;\n" " movq 8(%%esi),%%mm2;\n" " pmaddwd %%mm2,%%mm1;\n" " paddd %%mm1,%%mm0;\n" " movq 16(%%edi),%%mm1;\n" " movq 16(%%esi),%%mm2;\n" " pmaddwd %%mm2,%%mm1;\n" " paddd %%mm1,%%mm0;\n" " movq 24(%%edi),%%mm1;\n" " movq 24(%%esi),%%mm2;\n" " pmaddwd %%mm2,%%mm1;\n" " paddd %%mm1,%%mm0;\n" " movq 32(%%edi),%%mm1;\n" " movq 32(%%esi),%%mm2;\n" " pmaddwd %%mm2,%%mm1;\n" " paddd %%mm1,%%mm0;\n" " movq 40(%%edi),%%mm1;\n" " movq 40(%%esi),%%mm2;\n" " pmaddwd %%mm2,%%mm1;\n" " paddd %%mm1,%%mm0;\n" " movq 48(%%edi),%%mm1;\n" " movq 48(%%esi),%%mm2;\n" " pmaddwd %%mm2,%%mm1;\n" " paddd %%mm1,%%mm0;\n" " movq 56(%%edi),%%mm1;\n" " movq 56(%%esi),%%mm2;\n" " pmaddwd %%mm2,%%mm1;\n" " paddd %%mm1,%%mm0;\n" " movq 64(%%edi),%%mm1;\n" " movq 64(%%esi),%%mm2;\n" " pmaddwd %%mm2,%%mm1;\n" " paddd %%mm1,%%mm0;\n" " movq 72(%%edi),%%mm1;\n" " movq 72(%%esi),%%mm2;\n" " pmaddwd %%mm2,%%mm1;\n" " paddd %%mm1,%%mm0;\n" " movq %%mm0,%%mm1;\n" " punpckhdq %%mm0,%%mm1;\n" /* mm1 has high int32 of mm0 dup'd */ " paddd %%mm1,%%mm0;\n" " movd %%mm0,%%eax;\n" /* eax has result */ " cmpl %%edx,%%eax;\n" " jle 2f;\n" " movl %%eax,%%edx;\n" " movl %%ebx,%%ecx;\n" " .p2align 2;\n" "2:\n" " subl $2,%%esi;\n" " incl %%ebx;\n" " cmpl $120,%%ebx;\n" " jle 1b;\n" " popl %%ebx;\n" " emms;\n" : "=d" (lmax), "=c" (out) : "D" (wt), "S" (dp) : "eax" ); *Nc_out = out; return lmax; } /*- End of function --------------------------------------------------------*/ #endif /* This procedure computes the LTP gain (bc) and the LTP lag (Nc) for the long term analysis filter. This is done by calculating a maximum of the cross-correlation function between the current sub-segment short term residual signal d[0..39] (output of the short term analysis filter; for simplification the index of this array begins at 0 and ends at 39 for each sub-segment of the RPE-LTP analysis) and the previous reconstructed short term residual signal dp[ -120 .. -1 ]. A dynamic scaling must be performed to avoid overflow. */ /* This procedure exists in three versions. First, the integer version; then, the two floating point versions (as another function), with or without scaling. */ static int16_t evaluate_ltp_parameters(int16_t d[40], int16_t *dp, // [-120..-1] IN int16_t *Nc_out) { int k; int16_t Nc; int16_t bc; int16_t wt[40]; int32_t L_max; int32_t L_power; int16_t R; int16_t S; int16_t dmax; int16_t scale; int16_t temp; int32_t L_temp; #if !(defined(__GNUC__) && defined(__i386__)) int16_t lambda; #endif /* Search of the optimum scaling of d[0..39]. */ dmax = 0; for (k = 0; k < 40; k++) { temp = d[k]; temp = gsm_abs(temp); if (temp > dmax) dmax = temp; /*endif*/ } /*endfor*/ if (dmax == 0) { temp = 0; } else { assert(dmax > 0); temp = gsm0610_norm((int32_t) dmax << 16); } /*endif*/ if (temp > 6) scale = 0; else scale = (int16_t) (6 - temp); /*endif*/ assert(scale >= 0); /* Initialization of a working array wt */ for (k = 0; k < 40; k++) wt[k] = d[k] >> scale; /*endfor*/ /* Search for the maximum cross-correlation and coding of the LTP lag */ #if defined(__GNUC__) && defined(__i386__) L_max = gsm0610_max_cross_corr(wt, dp, &Nc); #else L_max = 0; Nc = 40; /* index for the maximum cross-correlation */ for (lambda = 40; lambda <= 120; lambda++) { int32_t L_result; L_result = (wt[0]*dp[0 - lambda]) + (wt[1]*dp[1 - lambda]) + (wt[2]*dp[2 - lambda]) + (wt[3]*dp[3 - lambda]) + (wt[4]*dp[4 - lambda]) + (wt[5]*dp[5 - lambda]) + (wt[6]*dp[6 - lambda]) + (wt[7]*dp[7 - lambda]) + (wt[8]*dp[8 - lambda]) + (wt[9]*dp[9 - lambda]) + (wt[10]*dp[10 - lambda]) + (wt[11]*dp[11 - lambda]) + (wt[12]*dp[12 - lambda]) + (wt[13]*dp[13 - lambda]) + (wt[14]*dp[14 - lambda]) + (wt[15]*dp[15 - lambda]) + (wt[16]*dp[16 - lambda]) + (wt[17]*dp[17 - lambda]) + (wt[18]*dp[18 - lambda]) + (wt[19]*dp[19 - lambda]) + (wt[20]*dp[20 - lambda]) + (wt[21]*dp[21 - lambda]) + (wt[22]*dp[22 - lambda]) + (wt[23]*dp[23 - lambda]) + (wt[24]*dp[24 - lambda]) + (wt[25]*dp[25 - lambda]) + (wt[26]*dp[26 - lambda]) + (wt[27]*dp[27 - lambda]) + (wt[28]*dp[28 - lambda]) + (wt[29]*dp[29 - lambda]) + (wt[30]*dp[30 - lambda]) + (wt[31]*dp[31 - lambda]) + (wt[32]*dp[32 - lambda]) + (wt[33]*dp[33 - lambda]) + (wt[34]*dp[34 - lambda]) + (wt[35]*dp[35 - lambda]) + (wt[36]*dp[36 - lambda]) + (wt[37]*dp[37 - lambda]) + (wt[38]*dp[38 - lambda]) + (wt[39]*dp[39 - lambda]); if (L_result > L_max) { Nc = lambda; L_max = L_result; } /*endif*/ } /*endfor*/ #endif *Nc_out = Nc; L_max <<= 1; /* Rescaling of L_max */ assert(scale <= 100 && scale >= -100); L_max = L_max >> (6 - scale); assert(Nc <= 120 && Nc >= 40); /* Compute the power of the reconstructed short term residual signal dp[..] */ L_power = 0; for (k = 0; k < 40; k++) { L_temp = dp[k - Nc] >> 3; L_power += L_temp*L_temp; } /*endfor*/ L_power <<= 1; /* from L_MULT */ /* Normalization of L_max and L_power */ if (L_max <= 0) return 0; /*endif*/ if (L_max >= L_power) return 3; /*endif*/ temp = gsm0610_norm(L_power); R = (int16_t) ((L_max << temp) >> 16); S = (int16_t) ((L_power << temp) >> 16); /* Coding of the LTP gain */ /* Table 4.3a must be used to obtain the level DLB[i] for the quantization of the LTP gain b to get the coded version bc. */ for (bc = 0; bc <= 2; bc++) { if (R <= gsm_mult(S, gsm_DLB[bc])) break; /*endif*/ } /*endfor*/ return bc; } /*- End of function --------------------------------------------------------*/ /* 4.2.12 */ static void long_term_analysis_filtering(int16_t bc, int16_t Nc, int16_t *dp, // previous d [-120..-1] IN int16_t d[40], int16_t dpp[40], int16_t e[40]) { int k; /* In this part, we have to decode the bc parameter to compute the samples of the estimate dpp[0..39]. The decoding of bc needs the use of table 4.3b. The long term residual signal e[0..39] is then calculated to be fed to the RPE encoding section. */ for (k = 0; k < 40; k++) { dpp[k] = gsm_mult_r(gsm_QLB[bc], dp[k - Nc]); e[k] = gsm_sub(d[k], dpp[k]); } /*endfor*/ } /*- End of function --------------------------------------------------------*/ /* 4x for 160 samples */ void gsm0610_long_term_predictor(gsm0610_state_t *s, int16_t d[40], int16_t *dp, // [-120..-1] d' IN int16_t e[40], int16_t dpp[40], int16_t *Nc, int16_t *bc) { #if 0 assert(d); assert(dp); assert(e); assert(dpp); assert(Nc); assert(bc); #endif *bc = evaluate_ltp_parameters(d, dp, Nc); long_term_analysis_filtering(*bc, *Nc, dp, d, dpp, e); } /*- End of function --------------------------------------------------------*/ /* 4.3.2 */ void gsm0610_long_term_synthesis_filtering(gsm0610_state_t *s, int16_t Ncr, int16_t bcr, int16_t erp[40], int16_t *drp) // [-120..-1] IN, [0..40] OUT { int k; int16_t brp; int16_t drpp; int16_t Nr; /* This procedure uses the bcr and Ncr parameter to realize the long term synthesis filter. The decoding of bcr needs table 4.3b. */ /* Check the limits of Nr. */ Nr = (Ncr < 40 || Ncr > 120) ? s->nrp : Ncr; s->nrp = Nr; assert (Nr >= 40 && Nr <= 120); /* Decode the LTP gain, bcr */ brp = gsm_QLB[bcr]; /* Compute the reconstructed short term residual signal, drp[0..39] */ assert(brp != INT16_MIN); for (k = 0; k < 40; k++) { drpp = gsm_mult_r(brp, drp[k - Nr]); drp[k] = gsm_add(erp[k], drpp); } /*endfor*/ /* Update the reconstructed short term residual signal, drp[-1..-120] */ for (k = 0; k < 120; k++) drp[k - 120] = drp[k - 80]; /*endfor*/ } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/lpc10_analyse.c0000644000175000017500000005655411150047216020473 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * lpc10_analyse.c - LPC10 low bit rate speech codec. * * Written by Steve Underwood * * Copyright (C) 2006 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * This code is based on the U.S. Department of Defense reference * implementation of the LPC-10 2400 bps Voice Coder. They do not * exert copyright claims on their code, and it may be freely used. * * $Id: lpc10_analyse.c,v 1.19 2008/07/02 14:48:25 steveu Exp $ */ #if defined(HAVE_CONFIG_H) #include #endif #include #include #include #include #include "floating_fudge.h" #if defined(HAVE_TGMATH_H) #include #endif #if defined(HAVE_MATH_H) #include #endif #include "spandsp/telephony.h" #include "spandsp/dc_restore.h" #include "spandsp/lpc10.h" #include "lpc10_encdecs.h" static __inline__ float energyf(float amp[], int len) { int i; float rms; rms = 0.0f; for (i = 0; i < len; i++) rms += amp[i]*amp[i]; rms = sqrtf(rms/len); return rms; } /*- End of function --------------------------------------------------------*/ static void remove_dc_bias(float speech[], int len, float sigout[]) { float bias; int i; bias = 0.0f; for (i = 0; i < len; i++) bias += speech[i]; bias /= len; for (i = 0; i < len; i++) sigout[i] = speech[i] - bias; } /*- End of function --------------------------------------------------------*/ static void eval_amdf(float speech[], int32_t lpita, const int32_t tau[], int32_t ltau, int32_t maxlag, float amdf[], int32_t *minptr, int32_t *maxptr) { float sum; int i; int j; int n1; int n2; *minptr = 0; *maxptr = 0; for (i = 0; i < ltau; i++) { n1 = (maxlag - tau[i])/2 + 1; n2 = n1 + lpita - 1; sum = 0.0f; for (j = n1; j <= n2; j += 4) sum += fabsf(speech[j - 1] - speech[j + tau[i] - 1]); amdf[i] = sum; if (amdf[i] < amdf[*minptr]) *minptr = i; if (amdf[i] > amdf[*maxptr]) *maxptr = i; } } /*- End of function --------------------------------------------------------*/ static void eval_highres_amdf(float speech[], int32_t lpita, const int32_t tau[], int32_t ltau, float amdf[], int32_t *minptr, int32_t *maxptr, int32_t *mintau) { float amdf2[6]; int32_t tau2[6]; int32_t minp2; int32_t ltau2; int32_t maxp2; int32_t minamd; int i; int i2; int ptr; /* Compute full AMDF using log spaced lags, find coarse minimum */ eval_amdf(speech, lpita, tau, ltau, tau[ltau - 1], amdf, minptr, maxptr); *mintau = tau[*minptr]; minamd = (int32_t) amdf[*minptr]; /* Build table containing all lags within +/- 3 of the AMDF minimum, excluding all that have already been computed */ ltau2 = 0; ptr = *minptr - 2; i2 = min(*mintau + 4, tau[ltau - 1]); for (i = max(*mintau - 3, 41); i < i2; i++) { while (tau[ptr] < i) ptr++; if (tau[ptr] != i) tau2[ltau2++] = i; } /* Compute AMDF of the new lags, if there are any, and choose one if it is better than the coarse minimum */ if (ltau2 > 0) { eval_amdf(speech, lpita, tau2, ltau2, tau[ltau - 1], amdf2, &minp2, &maxp2); if (amdf2[minp2] < (float) minamd) { *mintau = tau2[minp2]; minamd = (int32_t) amdf2[minp2]; } } /* Check one octave up, if there are any lags not yet computed */ if (*mintau >= 80) { i = *mintau/2; if ((i & 1) == 0) { ltau2 = 2; tau2[0] = i - 1; tau2[1] = i + 1; } else { ltau2 = 1; tau2[0] = i; } eval_amdf(speech, lpita, tau2, ltau2, tau[ltau - 1], amdf2, &minp2, &maxp2); if (amdf2[minp2] < (float) minamd) { *mintau = tau2[minp2]; minamd = (int32_t) amdf2[minp2]; *minptr -= 20; } } /* Force minimum of the AMDF array to the high resolution minimum */ amdf[*minptr] = (float) minamd; /* Find maximum of AMDF within 1/2 octave of minimum */ *maxptr = max(*minptr - 5, 0); i2 = min(*minptr + 6, ltau); for (i = *maxptr; i < i2; i++) { if (amdf[i] > amdf[*maxptr]) *maxptr = i; } } /*- End of function --------------------------------------------------------*/ static void dynamic_pitch_tracking(lpc10_encode_state_t *s, float amdf[], int32_t ltau, int32_t *minptr, int32_t voice, int32_t *pitch, int32_t *midx) { int32_t pbar; float sbar; int32_t path[2]; int32_t i; int32_t j; float alpha; float minsc; float maxsc; /* Calculate the confidence factor ALPHA, used as a threshold slope in */ /* SEESAW. If unvoiced, set high slope so that every point in P array */ /*is marked as a potential pitch frequency. A scaled up version (ALPHAX )*/ /* is used to maintain arithmetic precision. */ if (voice == 1) s->alphax = s->alphax*0.75f + amdf[*minptr - 1]*0.5f; else s->alphax *= 0.984375f; alpha = s->alphax/16; if (voice == 0 && s->alphax < 128.0f) alpha = 8.0f; /* SEESAW: Construct a pitch pointer array and intermediate winner function */ /* Left to right pass: */ s->p[s->ipoint][0] = 1; pbar = 1; sbar = s->s[0]; for (i = 0; i < ltau; i++) { sbar += alpha; if (sbar < s->s[i]) { s->s[i] = sbar; } else { pbar = i + 1; sbar = s->s[i]; } s->p[s->ipoint][i] = pbar; } /* Right to left pass: */ sbar = s->s[pbar - 1]; for (i = pbar - 2; i >= 0; i--) { sbar += alpha; if (sbar < s->s[i]) { s->s[i] = sbar; s->p[s->ipoint][i] = pbar; } else { pbar = s->p[s->ipoint][i]; i = pbar - 1; sbar = s->s[i]; } } /* Update S using AMDF */ /* Find maximum, minimum, and location of minimum */ s->s[0] += amdf[0]/2; minsc = s->s[0]; maxsc = minsc; *midx = 1; for (i = 1; i < ltau; i++) { s->s[i] += amdf[i]/2; if (s->s[i] > maxsc) maxsc = s->s[i]; if (s->s[i] < minsc) { *midx = i + 1; minsc = s->s[i]; } } /* Subtract MINSC from S to prevent overflow */ for (i = 0; i < ltau; i++) s->s[i] -= minsc; maxsc -= minsc; /* Use higher octave pitch if significant null there */ j = 0; for (i = 20; i <= 40; i += 10) { if (*midx > i) { if (s->s[*midx - i - 1] < maxsc / 4) j = i; } } *midx -= j; /* TRACE: look back two frames to find minimum cost pitch estimate */ *pitch = *midx; for (i = 0, j = s->ipoint; i < 2; i++, j++) { *pitch = s->p[j & 1][*pitch - 1]; path[i] = *pitch; } /* The following statement subtracts one from IPOINT, mod DEPTH. I */ /* think the author chose to add DEPTH-1, instead of subtracting 1, */ /* because then it will work even if MOD doesn't work as desired on */ /* negative arguments. */ s->ipoint = (s->ipoint + 1) & 1; } /*- End of function --------------------------------------------------------*/ /* Detection of onsets in (or slightly preceding) the futuremost frame of speech. */ static void onset(lpc10_encode_state_t *s, float *pebuf, int32_t osbuf[], int32_t *osptr, int32_t oslen, int32_t sbufl, int32_t sbufh, int32_t lframe) { int32_t i; float r1; float l2sum2; pebuf -= sbufl; if (s->hyst) s->lasti -= lframe; for (i = sbufh - lframe + 1; i <= sbufh; i++) { /* Compute FPC; Use old FPC on divide by zero; Clamp FPC to +/- 1. */ s->n = (pebuf[i]*pebuf[i - 1] + s->n*63.0f)/64.0f; /* Computing 2nd power */ r1 = pebuf[i - 1]; s->d__ = (r1*r1 + s->d__*63.0f)/64.0f; if (s->d__ != 0.0f) { if (fabsf(s->n) > s->d__) s->fpc = r_sign(1.0f, s->n); else s->fpc = s->n/s->d__; } /* Filter FPC */ l2sum2 = s->l2buf[s->l2ptr1 - 1]; s->l2sum1 = s->l2sum1 - s->l2buf[s->l2ptr2 - 1] + s->fpc; s->l2buf[s->l2ptr2 - 1] = s->l2sum1; s->l2buf[s->l2ptr1 - 1] = s->fpc; s->l2ptr1 = (s->l2ptr1 & 0xF) + 1; s->l2ptr2 = (s->l2ptr2 & 0xF) + 1; if (fabsf(s->l2sum1 - l2sum2) > 1.7f) { if (!s->hyst) { /* Ignore if buffer full */ if (*osptr <= oslen) { osbuf[*osptr - 1] = i - 9; (*osptr)++; } s->hyst = TRUE; } s->lasti = i; /* After one onset detection, at least OSHYST sample times must go */ /* by before another is allowed to occur. */ } else if (s->hyst && i - s->lasti >= 10) { s->hyst = FALSE; } } } /*- End of function --------------------------------------------------------*/ /* Load a covariance matrix. */ static void mload(int32_t order, int32_t awins, int32_t awinf, float speech[], float phi[], float psi[]) { int32_t start; int i; int r; start = awins + order; for (r = 1; r <= order; r++) { phi[r - 1] = 0.0f; for (i = start; i <= awinf; i++) phi[r - 1] += speech[i - 2]*speech[i - r - 1]; } /* Load last element of vector PSI */ psi[order - 1] = 0.0f; for (i = start - 1; i < awinf; i++) psi[order - 1] += speech[i]*speech[i - order]; /* End correct to get additional columns of phi */ for (r = 1; r < order; r++) { for (i = 1; i <= r; i++) { phi[i*order + r] = phi[(i - 1)*order + r - 1] - speech[awinf - (r + 1)]*speech[awinf - (i + 1)] + speech[start - (r + 2)]*speech[start - (i + 2)]; } } /* End correct to get additional elements of PSI */ for (i = 0; i < order - 1; i++) { psi[i] = phi[i + 1] - speech[start - 2]*speech[start - i - 3] + speech[awinf - 1]*speech[awinf - i - 2]; } } /*- End of function --------------------------------------------------------*/ /* Preemphasize speech with a single-zero filter. */ /* (When coef = .9375, preemphasis is as in LPC43.) */ static float preemp(float inbuf[], float pebuf[], int nsamp, float coeff, float z) { float temp; int i; for (i = 0; i < nsamp; i++) { temp = inbuf[i] - coeff*z; z = inbuf[i]; pebuf[i] = temp; } return z; } /*- End of function --------------------------------------------------------*/ /* Invert a covariance matrix using Choleski decomposition method. */ static void invert(int32_t order, float phi[], float psi[], float rc[]) { float r1; int32_t i; int32_t j; int32_t k; float v[10][10]; for (j = 0; j < order; j++) { for (i = j; i < order; i++) v[j][i] = phi[i + j*order]; for (k = 0; k < j; k++) { r1 = v[k][j]*v[k][k]; for (i = j; i <= order; i++) v[j][i] -= v[k][i]*r1; } /* Compute intermediate results, which are similar to RC's */ if (fabsf(v[j][j]) < 1.0e-10f) { for (i = j; i < order; i++) rc[i] = 0.0f; return; } rc[j] = psi[j]; for (k = 0; k < j; k++) rc[j] -= rc[k]*v[k][j]; v[j][j] = 1.0f/v[j][j]; rc[j] *= v[j][j]; r1 = min(rc[j], 0.999f); rc[j] = max(r1, -0.999f); } } /*- End of function --------------------------------------------------------*/ /* Check RC's, repeat previous frame's RC's if unstable */ static int rcchk(int order, float rc1f[], float rc2f[]) { int i; for (i = 0; i < order; i++) { if (fabsf(rc2f[i]) > 0.99f) { for (i = 0; i < order; i++) rc2f[i] = rc1f[i]; break; } } return 0; } /*- End of function --------------------------------------------------------*/ static void lpfilt(float inbuf[], float lpbuf[], int32_t len, int32_t nsamp) { int32_t j; float t; /* 31 point equiripple FIR LPF */ /* Linear phase, delay = 15 samples */ /* Passband: ripple = 0.25 dB, cutoff = 800 Hz */ /* Stopband: atten. = 40. dB, cutoff = 1240 Hz */ for (j = len - nsamp; j < len; j++) { t = (inbuf[j] + inbuf[j - 30]) * -0.0097201988f; t += (inbuf[j - 1] + inbuf[j - 29]) * -0.0105179986f; t += (inbuf[j - 2] + inbuf[j - 28]) * -0.0083479648f; t += (inbuf[j - 3] + inbuf[j - 27]) * 5.860774e-4f; t += (inbuf[j - 4] + inbuf[j - 26]) * 0.0130892089f; t += (inbuf[j - 5] + inbuf[j - 25]) * 0.0217052232f; t += (inbuf[j - 6] + inbuf[j - 24]) * 0.0184161253f; t += (inbuf[j - 7] + inbuf[j - 23]) * 3.39723e-4f; t += (inbuf[j - 8] + inbuf[j - 22]) * -0.0260797087f; t += (inbuf[j - 9] + inbuf[j - 21]) * -0.0455563702f; t += (inbuf[j - 10] + inbuf[j - 20]) * -0.040306855f; t += (inbuf[j - 11] + inbuf[j - 19]) * 5.029835e-4f; t += (inbuf[j - 12] + inbuf[j - 18]) * 0.0729262903f; t += (inbuf[j - 13] + inbuf[j - 17]) * 0.1572008878f; t += (inbuf[j - 14] + inbuf[j - 16]) * 0.2247288674f; t += inbuf[j - 15] * 0.250535965f; lpbuf[j] = t; } } /*- End of function --------------------------------------------------------*/ /* 2nd order inverse filter, speech is decimated 4:1 */ static void ivfilt(float lpbuf[], float ivbuf[], int32_t len, int32_t nsamp, float ivrc[]) { int32_t i; int32_t j; int32_t k; float r[3]; float pc1; float pc2; /* Calculate autocorrelations */ for (i = 1; i <= 3; i++) { r[i - 1] = 0.0f; k = (i - 1) << 2; for (j = (i << 2) + len - nsamp; j <= len; j += 2) r[i - 1] += lpbuf[j - 1]*lpbuf[j - k - 1]; } /* Calculate predictor coefficients */ pc1 = 0.0f; pc2 = 0.0f; ivrc[0] = 0.0f; ivrc[1] = 0.0f; if (r[0] > 1.0e-10f) { ivrc[0] = r[1]/r[0]; ivrc[1] = (r[2] - ivrc[0]*r[1])/(r[0] - ivrc[0]*r[1]); pc1 = ivrc[0] - ivrc[0]*ivrc[1]; pc2 = ivrc[1]; } /* Inverse filter LPBUF into IVBUF */ for (i = len - nsamp; i < len; i++) ivbuf[i] = lpbuf[i] - pc1*lpbuf[i - 4] - pc2*lpbuf[i - 8]; } /*- End of function --------------------------------------------------------*/ void lpc10_analyse(lpc10_encode_state_t *s, float speech[], int32_t voice[], int32_t *pitch, float *rms, float rc[]) { static const int32_t tau[60] = { 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 84, 88, 92, 96, 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140, 144, 148, 152, 156 }; static const int32_t buflim[4] = { 181, 720, 25, 720 }; static const float precoef = 0.9375f; float amdf[60]; float abuf[156]; float ivrc[2]; float temp; float phi[100] /* was [10][10] */; float psi[10]; int32_t half; int32_t midx; int32_t ewin[3][2]; int32_t i; int32_t j; int32_t lanal; int32_t ipitch; int32_t mintau; int32_t minptr; int32_t maxptr; /* Calculations are done on future frame due to requirements of the pitch tracker. Delay RMS and RC's 2 frames to give current frame parameters on return. */ for (i = 0; i <= 720 - LPC10_SAMPLES_PER_FRAME - 181; i++) { s->inbuf[i] = s->inbuf[LPC10_SAMPLES_PER_FRAME + i]; s->pebuf[i] = s->pebuf[LPC10_SAMPLES_PER_FRAME + i]; } for (i = 0; i <= 540 - LPC10_SAMPLES_PER_FRAME - 229; i++) s->ivbuf[i] = s->ivbuf[LPC10_SAMPLES_PER_FRAME + i]; for (i = 0; i <= 720 - LPC10_SAMPLES_PER_FRAME - 25; i++) s->lpbuf[i] = s->lpbuf[LPC10_SAMPLES_PER_FRAME + i]; for (i = 0, j = 0; i < s->osptr - 1; i++) { if (s->osbuf[i] > LPC10_SAMPLES_PER_FRAME) s->osbuf[j++] = s->osbuf[i] - LPC10_SAMPLES_PER_FRAME; } s->osptr = j + 1; s->voibuf[0][0] = s->voibuf[1][0]; s->voibuf[0][1] = s->voibuf[1][1]; for (i = 0; i < 2; i++) { s->vwin[i][0] = s->vwin[i + 1][0] - LPC10_SAMPLES_PER_FRAME; s->vwin[i][1] = s->vwin[i + 1][1] - LPC10_SAMPLES_PER_FRAME; s->awin[i][0] = s->awin[i + 1][0] - LPC10_SAMPLES_PER_FRAME; s->awin[i][1] = s->awin[i + 1][1] - LPC10_SAMPLES_PER_FRAME; s->obound[i] = s->obound[i + 1]; s->voibuf[i + 1][0] = s->voibuf[i + 2][0]; s->voibuf[i + 1][1] = s->voibuf[i + 2][1]; s->rmsbuf[i] = s->rmsbuf[i + 1]; for (j = 0; j < LPC10_ORDER; j++) s->rcbuf[i][j] = s->rcbuf[i + 1][j]; } /* If the average value in the frame was over 1/4096 (after current BIAS correction), then subtract that much more from samples in the next frame. If the average value in the frame was under -1/4096, add 1/4096 more to samples in next frame. In all other cases, keep BIAS the same. */ temp = 0.0f; for (i = 0; i < LPC10_SAMPLES_PER_FRAME; i++) { s->inbuf[720 - 2*LPC10_SAMPLES_PER_FRAME + i] = speech[i]*4096.0f - s->bias; temp += s->inbuf[720 - 2*LPC10_SAMPLES_PER_FRAME + i]; } if (temp > (float) LPC10_SAMPLES_PER_FRAME) s->bias++; else if (temp < (float) (-LPC10_SAMPLES_PER_FRAME)) s->bias--; /* Place voicing window */ i = 721 - LPC10_SAMPLES_PER_FRAME; s->zpre = preemp(&s->inbuf[i - 181], &s->pebuf[i - 181], LPC10_SAMPLES_PER_FRAME, precoef, s->zpre); onset(s, s->pebuf, s->osbuf, &s->osptr, 10, 181, 720, LPC10_SAMPLES_PER_FRAME); lpc10_placev(s->osbuf, &s->osptr, 10, &s->obound[2], s->vwin, 3, LPC10_SAMPLES_PER_FRAME, 90, 156, 307, 462); /* The Pitch Extraction algorithm estimates the pitch for a frame of speech by locating the minimum of the average magnitude difference function (AMDF). The AMDF operates on low-pass, inverse filtered speech. (The low-pass filter is an 800 Hz, 19 tap, equiripple, FIR filter and the inverse filter is a 2nd-order LPC filter.) The pitch estimate is later refined by dynamic tracking. However, since some of the tracking parameters are a function of the voicing decisions, a voicing decision must precede the final pitch estimation. */ /* See subroutines LPFILT, IVFILT, and eval_highres_amdf. */ /* LPFILT reads indices LBUFH-LFRAME-29 = 511 through LBUFH = 720 of INBUF, and writes indices LBUFH+1-LFRAME = 541 through LBUFH = 720 of LPBUF. */ lpfilt(&s->inbuf[228], &s->lpbuf[384], 312, LPC10_SAMPLES_PER_FRAME); /* IVFILT reads indices (PWINH-LFRAME-7) = 353 through PWINH = 540 of LPBUF, and writes indices (PWINH-LFRAME+1) = 361 through PWINH = 540 of IVBUF. */ ivfilt(&s->lpbuf[204], s->ivbuf, 312, LPC10_SAMPLES_PER_FRAME, ivrc); /* eval_highres_amdf reads indices PWINL = 229 through (PWINL-1)+MAXWIN+(TAU(LTAU)-TAU(1))/2 = 452 of IVBUF, and writes indices 1 through LTAU = 60 of AMDF. */ eval_highres_amdf(s->ivbuf, 156, tau, 60, amdf, &minptr, &maxptr, &mintau); /* Voicing decisions are made for each half frame of input speech. An initial voicing classification is made for each half of the analysis frame, and the voicing decisions for the present frame are finalized. See subroutine VOICIN. */ /* The voicing detector (VOICIN) classifies the input signal as unvoiced (including silence) or voiced using the AMDF windowed maximum-to-minimum ratio, the zero crossing rate, energy measures, reflection coefficients, and prediction gains. */ /* The pitch and voicing rules apply smoothing and isolated corrections to the pitch and voicing estimates and, in the process, introduce two frames of delay into the corrected pitch estimates and voicing decisions. */ for (half = 0; half < 2; half++) { lpc10_voicing(s, &s->vwin[2][0], s->inbuf, s->lpbuf, buflim, half, &amdf[minptr], &amdf[maxptr], &mintau, ivrc, s->obound); } /* Find the minimum cost pitch decision over several frames, given the current voicing decision and the AMDF array */ minptr++; dynamic_pitch_tracking(s, amdf, 60, &minptr, s->voibuf[3][1], pitch, &midx); ipitch = tau[midx - 1]; /* Place spectrum analysis and energy windows */ lpc10_placea(&ipitch, s->voibuf, &s->obound[2], 3, s->vwin, s->awin, ewin, LPC10_SAMPLES_PER_FRAME, 156); /* Remove short term DC bias over the analysis window. */ lanal = s->awin[2][1] + 1 - s->awin[2][0]; remove_dc_bias(&s->pebuf[s->awin[2][0] - 181], lanal, abuf); /* Compute RMS over integer number of pitch periods within the analysis window. */ /* Note that in a hardware implementation this computation may be simplified by using diagonal elements of phi computed by mload(). */ s->rmsbuf[2] = energyf(&abuf[ewin[2][0] - s->awin[2][0]], ewin[2][1] - ewin[2][0] + 1); /* Matrix load and invert, check RC's for stability */ mload(LPC10_ORDER, 1, lanal, abuf, phi, psi); invert(LPC10_ORDER, phi, psi, &s->rcbuf[2][0]); rcchk(LPC10_ORDER, &s->rcbuf[1][0], &s->rcbuf[2][0]); /* Set return parameters */ voice[0] = s->voibuf[1][0]; voice[1] = s->voibuf[1][1]; *rms = s->rmsbuf[0]; for (i = 0; i < LPC10_ORDER; i++) rc[i] = s->rcbuf[0][i]; } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/lpc10_placev.c0000644000175000017500000002707311150047216020303 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * lpc10_placev.c - LPC10 low bit rate speech codec. * * Written by Steve Underwood * * Copyright (C) 2006 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * This code is based on the U.S. Department of Defense reference * implementation of the LPC-10 2400 bps Voice Coder. They do not * exert copyright claims on their code, and it may be freely used. * * $Id: lpc10_placev.c,v 1.17 2008/07/02 14:48:25 steveu Exp $ */ #if defined(HAVE_CONFIG_H) #include #endif #include #include #include #include #include "floating_fudge.h" #if defined(HAVE_TGMATH_H) #include #endif #if defined(HAVE_MATH_H) #include #endif #include "spandsp/telephony.h" #include "spandsp/dc_restore.h" #include "spandsp/lpc10.h" #include "lpc10_encdecs.h" #define subsc(x,y) (((x) << 1) + (y)) void lpc10_placea(int32_t *ipitch, int32_t voibuf[3][2], int32_t *obound, int32_t af, int32_t vwin[3][2], int32_t awin[3][2], int32_t ewin[3][2], int32_t lframe, int32_t maxwin) { int allv; int winv; int32_t i; int32_t j; int32_t k; int32_t l; int32_t hrange; int ephase; int32_t lrange; lrange = (af - 2)*lframe + 1; hrange = af*lframe; /* Place the analysis window based on the voicing window placement, onsets, tentative voicing decision, and pitch. */ /* Case 1: Sustained voiced speech If the five most recent voicing decisions are voiced, then the window is placed phase-synchronously with the previous window, as close to the present voicing window if possible. If onsets bound the voicing window, then preference is given to a phase-synchronous placement which does not overlap these onsets. */ /* Case 2: Voiced transition If at least one voicing decision in AF is voicied, and there are no onsets, then the window is placed as in case 1. */ /* Case 3: Unvoiced speech or onsets If both voicing decisions in AF are unvoiced, or there are onsets then the window is placed coincident with the voicing window. */ /* Note: During phase-synchronous placement of windows, the length is not altered from MAXWIN, since this would defeat the purpose of phase-synchronous placement. */ /* Check for case 1 and case 2 */ allv = voibuf[af - 2][1] == 1 && voibuf[af - 1][0] == 1 && voibuf[af - 1][1] == 1 && voibuf[af][0] == 1 && voibuf[af][1] == 1; winv = voibuf[af][0] == 1 || voibuf[af][1] == 1; if (allv || (winv && *obound == 0)) { /* APHASE: Phase synchronous window placement. */ /* Get minimum lower index of the window. */ i = (lrange + *ipitch - 1 - awin[af - 2][0]) / *ipitch; i *= *ipitch; i += awin[af - 2][0]; /* l = the actual length of this frame's analysis window. */ l = maxwin; /* Calculate the location where a perfectly centered window would start. */ k = (vwin[af - 1][0] + vwin[af - 1][1] + 1 - l)/2; /* Choose the actual location to be the pitch multiple closest to this */ awin[af - 1][0] = i + ((int) floorf((float) (k - i)/(float) *ipitch + 0.5f))*(*ipitch); awin[af - 1][1] = awin[af - 1][0] + l - 1; /* If there is an onset bounding the right of the voicing window and the analysis window overlaps that, then move the analysis window backward to avoid this onset. */ if (*obound >= 2 && awin[af - 1][1] > vwin[af - 1][1]) { awin[af - 1][0] -= *ipitch; awin[af - 1][1] -= *ipitch; } /* Similarly for the left of the voicing window. */ if ((*obound == 1 || *obound == 3) && awin[af - 1][0] < vwin[af - 1][0]) { awin[af - 1][0] += *ipitch; awin[af - 1][1] += *ipitch; } /* If this placement puts the analysis window above HRANGE, then move it backward an integer number of pitch periods. */ while (awin[af - 1][1] > hrange) { awin[af - 1][0] -= *ipitch; awin[af - 1][1] -= *ipitch; } /* Similarly if the placement puts the analysis window below LRANGE. */ while (awin[af - 1][0] < lrange) { awin[af - 1][0] += *ipitch; awin[af - 1][1] += *ipitch; } /* Make energy window be phase-synchronous. */ ephase = TRUE; } else { /* Case 3 */ awin[af - 1][0] = vwin[af - 1][0]; awin[af - 1][1] = vwin[af - 1][1]; ephase = FALSE; } /* RMS is computed over an integer number of pitch periods in the analysis window. When it is not placed phase-synchronously, it is placed as close as possible to onsets. */ j = (awin[af - 1][1] - awin[af - 1][0] + 1) / *ipitch * *ipitch; if (j == 0 || !winv) { ewin[af - 1][0] = vwin[af - 1][0]; ewin[af - 1][1] = vwin[af - 1][1]; } else if (!ephase && *obound == 2) { ewin[af - 1][0] = awin[af - 1][1] - j + 1; ewin[af - 1][1] = awin[af - 1][1]; } else { ewin[af - 1][0] = awin[af - 1][0]; ewin[af - 1][1] = awin[af - 1][0] + j - 1; } } /*- End of function --------------------------------------------------------*/ void lpc10_placev(int32_t *osbuf, int32_t *osptr, int32_t oslen, int32_t *obound, int32_t vwin[3][2], int32_t af, int32_t lframe, int32_t minwin, int32_t maxwin, int32_t dvwinl, int32_t dvwinh) { int32_t i1; int32_t i2; int crit; int32_t q; int32_t osptr1; int32_t hrange; int32_t lrange; int i; /* Voicing window placement */ /* __________________ __________________ ______________ */ /* | | | */ /* | 1F | 2F | 3F ... */ /* |__________________|__________________|______________ */ /* Previous | */ /* Window | */ /* ...________| */ /* | | */ /* ------>| This window's placement range |<------ */ /* | | */ /* There are three cases. Note these are different from those given in the LPC-10e phase 1 report. */ /* 1. If there are no onsets in this range, then the voicing window is centered in the pitch window. If such a placement is not within the window's placement range, then the window is placed in the left-most portion of the placement range. Its length is always MAXWIN. */ /* 2. If the first onset is in 2F and there is sufficient room to place the window immediately before this onset, then the window is placed there, and its length is set to the maximum possible under these constraints. */ /* "Critical Region Exception": If there is another onset in 2F such that a window can be placed between the two onsets, the window is placed there (ie, as in case 3). */ /* 3. Otherwise, the window is placed immediately after the onset. The window's length is the longest length that can fit in the range under these constraints, except that the window may be shortened even further to avoid overlapping other onsets in the placement range. In any case, the window's length is at least MINWIN. */ /* Note that the values of MINWIN and LFRAME must be chosen such that case 2 = false implies case 3 = true. This means that MINWIN <= LFRAME/2. If this were not the case, then a fourth case would have to be added for when the window cannot fit either before or after the onset. */ /* Note also that onsets which weren't in 2F last time may be in 1F this time, due to the filter delays in computing onsets. The result is that occasionally a voicing window will overlap that onset. The only way to circumvent this problem is to add more delay in processing input speech. In the trade-off between delay and window-placement, window placement lost. */ /* Compute the placement range */ /* Computing MAX */ i1 = vwin[af - 2][1] + 1; i2 = (af - 2)*lframe + 1; lrange = max(i1, i2); hrange = af*lframe; /* Compute OSPTR1, so the following code only looks at relevant onsets. */ for (osptr1 = *osptr - 1; osptr1 >= 1; osptr1--) { if (osbuf[osptr1 - 1] <= hrange) break; } osptr1++; /* Check for case 1 first (fast case) */ if (osptr1 <= 1 || osbuf[osptr1 - 2] < lrange) { /* Compute max */ i1 = vwin[af - 2][1] + 1; vwin[af - 1][0] = max(i1, dvwinl); vwin[af - 1][1] = vwin[af - 1][0] + maxwin - 1; *obound = 0; } else { /* Search backward in OSBUF for first onset in range. */ /* This code relies on the above check being performed first. */ for (q = osptr1 - 1; q >= 1; q--) { if (osbuf[q - 1] < lrange) break; } q++; /* Check for case 2 (placement before onset): */ /* Check for critical region exception: */ crit = FALSE; for (i = q + 1; i < osptr1; i++) { if (osbuf[i - 1] - osbuf[q - 1] >= minwin) { crit = TRUE; break; } } /* Compute max */ i1 = (af - 1)*lframe; i2 = lrange + minwin - 1; if (!crit && osbuf[q - 1] > max(i1, i2)) { vwin[af - 1][1] = osbuf[q - 1] - 1; /* Compute max */ i2 = vwin[af - 1][1] - maxwin + 1; vwin[af - 1][0] = max(lrange, i2); *obound = 2; } else { /* Case 3 (placement after onset) */ vwin[af - 1][0] = osbuf[q - 1]; do { if (++q >= osptr1 || osbuf[q - 1] > vwin[af - 1][0] + maxwin) { /* Compute min */ i1 = vwin[af - 1][0] + maxwin - 1; vwin[af - 1][1] = min(i1, hrange); *obound = 1; return; } } while (osbuf[q - 1] < vwin[af - 1][0] + minwin); vwin[af - 1][1] = osbuf[q - 1] - 1; *obound = 3; } } } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/g726.c0000644000175000017500000010155411150047216016514 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * g726.c - The ITU G.726 codec. * * Written by Steve Underwood * * Copyright (C) 2006 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * Based on G.721/G.723 code which is: * * This source code is a product of Sun Microsystems, Inc. and is provided * for unrestricted use. Users may copy or modify this source code without * charge. * * SUN SOURCE CODE IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING * THE WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE. * * Sun source code is provided with no support and without any obligation on * the part of Sun Microsystems, Inc. to assist in its use, correction, * modification or enhancement. * * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY THIS SOFTWARE * OR ANY PART THEREOF. * * In no event will Sun Microsystems, Inc. be liable for any lost revenue * or profits or other special, indirect and consequential damages, even if * Sun has been advised of the possibility of such damages. * * Sun Microsystems, Inc. * 2550 Garcia Avenue * Mountain View, California 94043 * * $Id: g726.c,v 1.22 2008/07/02 14:48:25 steveu Exp $ */ /*! \file */ #if defined(HAVE_CONFIG_H) #include #endif #include #include #include #include "floating_fudge.h" #if defined(HAVE_TGMATH_H) #include #endif #if defined(HAVE_MATH_H) #include #endif #include "spandsp/telephony.h" #include "spandsp/dc_restore.h" #include "spandsp/bitstream.h" #include "spandsp/bit_operations.h" #include "spandsp/g711.h" #include "spandsp/g726.h" /* * Maps G.726_16 code word to reconstructed scale factor normalized log * magnitude values. */ static const int g726_16_dqlntab[4] = { 116, 365, 365, 116 }; /* Maps G.726_16 code word to log of scale factor multiplier. */ static const int g726_16_witab[4] = { -704, 14048, 14048, -704 }; /* * Maps G.726_16 code words to a set of values whose long and short * term averages are computed and then compared to give an indication * how stationary (steady state) the signal is. */ static const int g726_16_fitab[4] = { 0x000, 0xE00, 0xE00, 0x000 }; static const int qtab_726_16[1] = { 261 }; /* * Maps G.726_24 code word to reconstructed scale factor normalized log * magnitude values. */ static const int g726_24_dqlntab[8] = { -2048, 135, 273, 373, 373, 273, 135, -2048 }; /* Maps G.726_24 code word to log of scale factor multiplier. */ static const int g726_24_witab[8] = { -128, 960, 4384, 18624, 18624, 4384, 960, -128 }; /* * Maps G.726_24 code words to a set of values whose long and short * term averages are computed and then compared to give an indication * how stationary (steady state) the signal is. */ static const int g726_24_fitab[8] = { 0x000, 0x200, 0x400, 0xE00, 0xE00, 0x400, 0x200, 0x000 }; static const int qtab_726_24[3] = { 8, 218, 331 }; /* * Maps G.726_32 code word to reconstructed scale factor normalized log * magnitude values. */ static const int g726_32_dqlntab[16] = { -2048, 4, 135, 213, 273, 323, 373, 425, 425, 373, 323, 273, 213, 135, 4, -2048 }; /* Maps G.726_32 code word to log of scale factor multiplier. */ static const int g726_32_witab[16] = { -384, 576, 1312, 2048, 3584, 6336, 11360, 35904, 35904, 11360, 6336, 3584, 2048, 1312, 576, -384 }; /* * Maps G.726_32 code words to a set of values whose long and short * term averages are computed and then compared to give an indication * how stationary (steady state) the signal is. */ static const int g726_32_fitab[16] = { 0x000, 0x000, 0x000, 0x200, 0x200, 0x200, 0x600, 0xE00, 0xE00, 0x600, 0x200, 0x200, 0x200, 0x000, 0x000, 0x000 }; static const int qtab_726_32[7] = { -124, 80, 178, 246, 300, 349, 400 }; /* * Maps G.726_40 code word to ructeconstructed scale factor normalized log * magnitude values. */ static const int g726_40_dqlntab[32] = { -2048, -66, 28, 104, 169, 224, 274, 318, 358, 395, 429, 459, 488, 514, 539, 566, 566, 539, 514, 488, 459, 429, 395, 358, 318, 274, 224, 169, 104, 28, -66, -2048 }; /* Maps G.726_40 code word to log of scale factor multiplier. */ static const int g726_40_witab[32] = { 448, 448, 768, 1248, 1280, 1312, 1856, 3200, 4512, 5728, 7008, 8960, 11456, 14080, 16928, 22272, 22272, 16928, 14080, 11456, 8960, 7008, 5728, 4512, 3200, 1856, 1312, 1280, 1248, 768, 448, 448 }; /* * Maps G.726_40 code words to a set of values whose long and short * term averages are computed and then compared to give an indication * how stationary (steady state) the signal is. */ static const int g726_40_fitab[32] = { 0x000, 0x000, 0x000, 0x000, 0x000, 0x200, 0x200, 0x200, 0x200, 0x200, 0x400, 0x600, 0x800, 0xA00, 0xC00, 0xC00, 0xC00, 0xC00, 0xA00, 0x800, 0x600, 0x400, 0x200, 0x200, 0x200, 0x200, 0x200, 0x000, 0x000, 0x000, 0x000, 0x000 }; static const int qtab_726_40[15] = { -122, -16, 68, 139, 198, 250, 298, 339, 378, 413, 445, 475, 502, 528, 553 }; /* * returns the integer product of the 14-bit integer "an" and * "floating point" representation (4-bit exponent, 6-bit mantessa) "srn". */ static int16_t fmult(int16_t an, int16_t srn) { int16_t anmag; int16_t anexp; int16_t anmant; int16_t wanexp; int16_t wanmant; int16_t retval; anmag = (an > 0) ? an : ((-an) & 0x1FFF); anexp = (int16_t) (top_bit(anmag) - 5); anmant = (anmag == 0) ? 32 : (anexp >= 0) ? (anmag >> anexp) : (anmag << -anexp); wanexp = anexp + ((srn >> 6) & 0xF) - 13; wanmant = (anmant*(srn & 0x3F) + 0x30) >> 4; retval = (wanexp >= 0) ? ((wanmant << wanexp) & 0x7FFF) : (wanmant >> -wanexp); return (((an ^ srn) < 0) ? -retval : retval); } /*- End of function --------------------------------------------------------*/ /* * Compute the estimated signal from the 6-zero predictor. */ static __inline__ int16_t predictor_zero(g726_state_t *s) { int i; int sezi; sezi = fmult(s->b[0] >> 2, s->dq[0]); /* ACCUM */ for (i = 1; i < 6; i++) sezi += fmult(s->b[i] >> 2, s->dq[i]); return (int16_t) sezi; } /*- End of function --------------------------------------------------------*/ /* * Computes the estimated signal from the 2-pole predictor. */ static __inline__ int16_t predictor_pole(g726_state_t *s) { return (fmult(s->a[1] >> 2, s->sr[1]) + fmult(s->a[0] >> 2, s->sr[0])); } /*- End of function --------------------------------------------------------*/ /* * Computes the quantization step size of the adaptive quantizer. */ static int step_size(g726_state_t *s) { int y; int dif; int al; if (s->ap >= 256) return s->yu; y = s->yl >> 6; dif = s->yu - y; al = s->ap >> 2; if (dif > 0) y += (dif*al) >> 6; else if (dif < 0) y += (dif*al + 0x3F) >> 6; return y; } /*- End of function --------------------------------------------------------*/ /* * Given a raw sample, 'd', of the difference signal and a * quantization step size scale factor, 'y', this routine returns the * ADPCM codeword to which that sample gets quantized. The step * size scale factor division operation is done in the log base 2 domain * as a subtraction. */ static int16_t quantize(int d, /* Raw difference signal sample */ int y, /* Step size multiplier */ const int table[], /* quantization table */ int quantizer_states) /* table size of int16_t integers */ { int16_t dqm; /* Magnitude of 'd' */ int16_t exp; /* Integer part of base 2 log of 'd' */ int16_t mant; /* Fractional part of base 2 log */ int16_t dl; /* Log of magnitude of 'd' */ int16_t dln; /* Step size scale factor normalized log */ int i; int size; /* * LOG * * Compute base 2 log of 'd', and store in 'dl'. */ dqm = (int16_t) abs(d); exp = (int16_t) (top_bit(dqm >> 1) + 1); /* Fractional portion. */ mant = ((dqm << 7) >> exp) & 0x7F; dl = (exp << 7) + mant; /* * SUBTB * * "Divide" by step size multiplier. */ dln = dl - (int16_t) (y >> 2); /* * QUAN * * Search for codword i for 'dln'. */ size = (quantizer_states - 1) >> 1; for (i = 0; i < size; i++) { if (dln < table[i]) break; } if (d < 0) { /* Take 1's complement of i */ return (int16_t) ((size << 1) + 1 - i); } if (i == 0 && (quantizer_states & 1)) { /* Zero is only valid if there are an even number of states, so take the 1's complement if the code is zero. */ return (int16_t) quantizer_states; } return (int16_t) i; } /*- End of function --------------------------------------------------------*/ /* * Returns reconstructed difference signal 'dq' obtained from * codeword 'i' and quantization step size scale factor 'y'. * Multiplication is performed in log base 2 domain as addition. */ static int16_t reconstruct(int sign, /* 0 for non-negative value */ int dqln, /* G.72x codeword */ int y) /* Step size multiplier */ { int16_t dql; /* Log of 'dq' magnitude */ int16_t dex; /* Integer part of log */ int16_t dqt; int16_t dq; /* Reconstructed difference signal sample */ dql = (int16_t) (dqln + (y >> 2)); /* ADDA */ if (dql < 0) return ((sign) ? -0x8000 : 0); /* ANTILOG */ dex = (dql >> 7) & 15; dqt = 128 + (dql & 127); dq = (dqt << 7) >> (14 - dex); return ((sign) ? (dq - 0x8000) : dq); } /*- End of function --------------------------------------------------------*/ /* * updates the state variables for each output code */ static void update(g726_state_t *s, int y, /* quantizer step size */ int wi, /* scale factor multiplier */ int fi, /* for long/short term energies */ int dq, /* quantized prediction difference */ int sr, /* reconstructed signal */ int dqsez) /* difference from 2-pole predictor */ { int16_t mag; int16_t exp; int16_t a2p; /* LIMC */ int16_t a1ul; /* UPA1 */ int16_t pks1; /* UPA2 */ int16_t fa1; int16_t ylint; int16_t dqthr; int16_t ylfrac; int16_t thr; int16_t pk0; int i; int tr; a2p = 0; /* Needed in updating predictor poles */ pk0 = (dqsez < 0) ? 1 : 0; /* prediction difference magnitude */ mag = (int16_t) (dq & 0x7FFF); /* TRANS */ ylint = (int16_t) (s->yl >> 15); /* exponent part of yl */ ylfrac = (int16_t) ((s->yl >> 10) & 0x1F); /* fractional part of yl */ /* Limit threshold to 31 << 10 */ thr = (ylint > 9) ? (31 << 10) : ((32 + ylfrac) << ylint); dqthr = (thr + (thr >> 1)) >> 1; /* dqthr = 0.75 * thr */ if (!s->td) /* signal supposed voice */ tr = FALSE; else if (mag <= dqthr) /* supposed data, but small mag */ tr = FALSE; /* treated as voice */ else /* signal is data (modem) */ tr = TRUE; /* * Quantizer scale factor adaptation. */ /* FUNCTW & FILTD & DELAY */ /* update non-steady state step size multiplier */ s->yu = (int16_t) (y + ((wi - y) >> 5)); /* LIMB */ if (s->yu < 544) s->yu = 544; else if (s->yu > 5120) s->yu = 5120; /* FILTE & DELAY */ /* update steady state step size multiplier */ s->yl += s->yu + ((-s->yl) >> 6); /* * Adaptive predictor coefficients. */ if (tr) { /* Reset the a's and b's for a modem signal */ s->a[0] = 0; s->a[1] = 0; s->b[0] = 0; s->b[1] = 0; s->b[2] = 0; s->b[3] = 0; s->b[4] = 0; s->b[5] = 0; } else { /* Update the a's and b's */ /* UPA2 */ pks1 = pk0 ^ s->pk[0]; /* Update predictor pole a[1] */ a2p = s->a[1] - (s->a[1] >> 7); if (dqsez != 0) { fa1 = (pks1) ? s->a[0] : -s->a[0]; /* a2p = function of fa1 */ if (fa1 < -8191) a2p -= 0x100; else if (fa1 > 8191) a2p += 0xFF; else a2p += fa1 >> 5; if (pk0 ^ s->pk[1]) { /* LIMC */ if (a2p <= -12160) a2p = -12288; else if (a2p >= 12416) a2p = 12288; else a2p -= 0x80; } else if (a2p <= -12416) a2p = -12288; else if (a2p >= 12160) a2p = 12288; else a2p += 0x80; } /* TRIGB & DELAY */ s->a[1] = a2p; /* UPA1 */ /* Update predictor pole a[0] */ s->a[0] -= s->a[0] >> 8; if (dqsez != 0) { if (pks1 == 0) s->a[0] += 192; else s->a[0] -= 192; } /* LIMD */ a1ul = 15360 - a2p; if (s->a[0] < -a1ul) s->a[0] = -a1ul; else if (s->a[0] > a1ul) s->a[0] = a1ul; /* UPB : update predictor zeros b[6] */ for (i = 0; i < 6; i++) { /* Distinguish 40Kbps mode from the others */ s->b[i] -= s->b[i] >> ((s->bits_per_sample == 5) ? 9 : 8); if (dq & 0x7FFF) { /* XOR */ if ((dq ^ s->dq[i]) >= 0) s->b[i] += 128; else s->b[i] -= 128; } } } for (i = 5; i > 0; i--) s->dq[i] = s->dq[i - 1]; /* FLOAT A : convert dq[0] to 4-bit exp, 6-bit mantissa f.p. */ if (mag == 0) { s->dq[0] = (dq >= 0) ? 0x20 : 0xFC20; } else { exp = (int16_t) (top_bit(mag) + 1); s->dq[0] = (dq >= 0) ? ((exp << 6) + ((mag << 6) >> exp)) : ((exp << 6) + ((mag << 6) >> exp) - 0x400); } s->sr[1] = s->sr[0]; /* FLOAT B : convert sr to 4-bit exp., 6-bit mantissa f.p. */ if (sr == 0) { s->sr[0] = 0x20; } else if (sr > 0) { exp = (int16_t) (top_bit(sr) + 1); s->sr[0] = (int16_t) ((exp << 6) + ((sr << 6) >> exp)); } else if (sr > -32768) { mag = (int16_t) -sr; exp = (int16_t) (top_bit(mag) + 1); s->sr[0] = (exp << 6) + ((mag << 6) >> exp) - 0x400; } else { s->sr[0] = (uint16_t) 0xFC20; } /* DELAY A */ s->pk[1] = s->pk[0]; s->pk[0] = pk0; /* TONE */ if (tr) /* this sample has been treated as data */ s->td = FALSE; /* next one will be treated as voice */ else if (a2p < -11776) /* small sample-to-sample correlation */ s->td = TRUE; /* signal may be data */ else /* signal is voice */ s->td = FALSE; /* Adaptation speed control. */ /* FILTA */ s->dms += ((int16_t) fi - s->dms) >> 5; /* FILTB */ s->dml += (((int16_t) (fi << 2) - s->dml) >> 7); if (tr) s->ap = 256; else if (y < 1536) /* SUBTC */ s->ap += (0x200 - s->ap) >> 4; else if (s->td) s->ap += (0x200 - s->ap) >> 4; else if (abs((s->dms << 2) - s->dml) >= (s->dml >> 3)) s->ap += (0x200 - s->ap) >> 4; else s->ap += (-s->ap) >> 4; } /*- End of function --------------------------------------------------------*/ static int16_t tandem_adjust_alaw(int16_t sr, /* decoder output linear PCM sample */ int se, /* predictor estimate sample */ int y, /* quantizer step size */ int i, /* decoder input code */ int sign, const int qtab[], int quantizer_states) { uint8_t sp; /* A-law compressed 8-bit code */ int16_t dx; /* prediction error */ int id; /* quantized prediction error */ int sd; /* adjusted A-law decoded sample value */ if (sr <= -32768) sr = -1; sp = linear_to_alaw((sr >> 1) << 3); /* 16-bit prediction error */ dx = (int16_t) ((alaw_to_linear(sp) >> 2) - se); id = quantize(dx, y, qtab, quantizer_states); if (id == i) { /* No adjustment of sp required */ return (int16_t) sp; } /* sp adjustment needed */ /* ADPCM codes : 8, 9, ... F, 0, 1, ... , 6, 7 */ /* 2's complement to biased unsigned */ if ((id ^ sign) > (i ^ sign)) { /* sp adjusted to next lower value */ if (sp & 0x80) sd = (sp == 0xD5) ? 0x55 : (((sp ^ 0x55) - 1) ^ 0x55); else sd = (sp == 0x2A) ? 0x2A : (((sp ^ 0x55) + 1) ^ 0x55); } else { /* sp adjusted to next higher value */ if (sp & 0x80) sd = (sp == 0xAA) ? 0xAA : (((sp ^ 0x55) + 1) ^ 0x55); else sd = (sp == 0x55) ? 0xD5 : (((sp ^ 0x55) - 1) ^ 0x55); } return (int16_t) sd; } /*- End of function --------------------------------------------------------*/ static int16_t tandem_adjust_ulaw(int16_t sr, /* decoder output linear PCM sample */ int se, /* predictor estimate sample */ int y, /* quantizer step size */ int i, /* decoder input code */ int sign, const int qtab[], int quantizer_states) { uint8_t sp; /* u-law compressed 8-bit code */ int16_t dx; /* prediction error */ int id; /* quantized prediction error */ int sd; /* adjusted u-law decoded sample value */ if (sr <= -32768) sr = 0; sp = linear_to_ulaw(sr << 2); /* 16-bit prediction error */ dx = (int16_t) ((ulaw_to_linear(sp) >> 2) - se); id = quantize(dx, y, qtab, quantizer_states); if (id == i) { /* No adjustment of sp required. */ return (int16_t) sp; } /* ADPCM codes : 8, 9, ... F, 0, 1, ... , 6, 7 */ /* 2's complement to biased unsigned */ if ((id ^ sign) > (i ^ sign)) { /* sp adjusted to next lower value */ if (sp & 0x80) sd = (sp == 0xFF) ? 0x7E : (sp + 1); else sd = (sp == 0x00) ? 0x00 : (sp - 1); } else { /* sp adjusted to next higher value */ if (sp & 0x80) sd = (sp == 0x80) ? 0x80 : (sp - 1); else sd = (sp == 0x7F) ? 0xFE : (sp + 1); } return (int16_t) sd; } /*- End of function --------------------------------------------------------*/ /* * Encodes a linear PCM, A-law or u-law input sample and returns its 3-bit code. */ static uint8_t g726_16_encoder(g726_state_t *s, int16_t amp) { int y; int16_t sei; int16_t sezi; int16_t se; int16_t d; int16_t sr; int16_t dqsez; int16_t dq; int16_t i; sezi = predictor_zero(s); sei = sezi + predictor_pole(s); se = sei >> 1; d = amp - se; /* Quantize prediction difference */ y = step_size(s); i = quantize(d, y, qtab_726_16, 4); dq = reconstruct(i & 2, g726_16_dqlntab[i], y); /* Reconstruct the signal */ sr = (dq < 0) ? (se - (dq & 0x3FFF)) : (se + dq); /* Pole prediction difference */ dqsez = sr + (sezi >> 1) - se; update(s, y, g726_16_witab[i], g726_16_fitab[i], dq, sr, dqsez); return (uint8_t) i; } /*- End of function --------------------------------------------------------*/ /* * Decodes a 2-bit CCITT G.726_16 ADPCM code and returns * the resulting 16-bit linear PCM, A-law or u-law sample value. */ static int16_t g726_16_decoder(g726_state_t *s, uint8_t code) { int16_t sezi; int16_t sei; int16_t se; int16_t sr; int16_t dq; int16_t dqsez; int y; /* Mask to get proper bits */ code &= 0x03; sezi = predictor_zero(s); sei = sezi + predictor_pole(s); y = step_size(s); dq = reconstruct(code & 2, g726_16_dqlntab[code], y); /* Reconstruct the signal */ se = sei >> 1; sr = (dq < 0) ? (se - (dq & 0x3FFF)) : (se + dq); /* Pole prediction difference */ dqsez = sr + (sezi >> 1) - se; update(s, y, g726_16_witab[code], g726_16_fitab[code], dq, sr, dqsez); switch (s->ext_coding) { case G726_ENCODING_ALAW: return tandem_adjust_alaw(sr, se, y, code, 2, qtab_726_16, 4); case G726_ENCODING_ULAW: return tandem_adjust_ulaw(sr, se, y, code, 2, qtab_726_16, 4); } return (sr << 2); } /*- End of function --------------------------------------------------------*/ /* * Encodes a linear PCM, A-law or u-law input sample and returns its 3-bit code. */ static uint8_t g726_24_encoder(g726_state_t *s, int16_t amp) { int16_t sei; int16_t sezi; int16_t se; int16_t d; int16_t sr; int16_t dqsez; int16_t dq; int16_t i; int y; sezi = predictor_zero(s); sei = sezi + predictor_pole(s); se = sei >> 1; d = amp - se; /* Quantize prediction difference */ y = step_size(s); i = quantize(d, y, qtab_726_24, 7); dq = reconstruct(i & 4, g726_24_dqlntab[i], y); /* Reconstruct the signal */ sr = (dq < 0) ? (se - (dq & 0x3FFF)) : (se + dq); /* Pole prediction difference */ dqsez = sr + (sezi >> 1) - se; update(s, y, g726_24_witab[i], g726_24_fitab[i], dq, sr, dqsez); return (uint8_t) i; } /*- End of function --------------------------------------------------------*/ /* * Decodes a 3-bit CCITT G.726_24 ADPCM code and returns * the resulting 16-bit linear PCM, A-law or u-law sample value. */ static int16_t g726_24_decoder(g726_state_t *s, uint8_t code) { int16_t sezi; int16_t sei; int16_t se; int16_t sr; int16_t dq; int16_t dqsez; int y; /* Mask to get proper bits */ code &= 0x07; sezi = predictor_zero(s); sei = sezi + predictor_pole(s); y = step_size(s); dq = reconstruct(code & 4, g726_24_dqlntab[code], y); /* Reconstruct the signal */ se = sei >> 1; sr = (dq < 0) ? (se - (dq & 0x3FFF)) : (se + dq); /* Pole prediction difference */ dqsez = sr + (sezi >> 1) - se; update(s, y, g726_24_witab[code], g726_24_fitab[code], dq, sr, dqsez); switch (s->ext_coding) { case G726_ENCODING_ALAW: return tandem_adjust_alaw(sr, se, y, code, 4, qtab_726_24, 7); case G726_ENCODING_ULAW: return tandem_adjust_ulaw(sr, se, y, code, 4, qtab_726_24, 7); } return (sr << 2); } /*- End of function --------------------------------------------------------*/ /* * Encodes a linear input sample and returns its 4-bit code. */ static uint8_t g726_32_encoder(g726_state_t *s, int16_t amp) { int16_t sei; int16_t sezi; int16_t se; int16_t d; int16_t sr; int16_t dqsez; int16_t dq; int16_t i; int y; sezi = predictor_zero(s); sei = sezi + predictor_pole(s); se = sei >> 1; d = amp - se; /* Quantize the prediction difference */ y = step_size(s); i = quantize(d, y, qtab_726_32, 15); dq = reconstruct(i & 8, g726_32_dqlntab[i], y); /* Reconstruct the signal */ sr = (dq < 0) ? (se - (dq & 0x3FFF)) : (se + dq); /* Pole prediction difference */ dqsez = sr + (sezi >> 1) - se; update(s, y, g726_32_witab[i], g726_32_fitab[i], dq, sr, dqsez); return (uint8_t) i; } /*- End of function --------------------------------------------------------*/ /* * Decodes a 4-bit CCITT G.726_32 ADPCM code and returns * the resulting 16-bit linear PCM, A-law or u-law sample value. */ static int16_t g726_32_decoder(g726_state_t *s, uint8_t code) { int16_t sezi; int16_t sei; int16_t se; int16_t sr; int16_t dq; int16_t dqsez; int y; /* Mask to get proper bits */ code &= 0x0F; sezi = predictor_zero(s); sei = sezi + predictor_pole(s); y = step_size(s); dq = reconstruct(code & 8, g726_32_dqlntab[code], y); /* Reconstruct the signal */ se = sei >> 1; sr = (dq < 0) ? (se - (dq & 0x3FFF)) : (se + dq); /* Pole prediction difference */ dqsez = sr + (sezi >> 1) - se; update(s, y, g726_32_witab[code], g726_32_fitab[code], dq, sr, dqsez); switch (s->ext_coding) { case G726_ENCODING_ALAW: return tandem_adjust_alaw(sr, se, y, code, 8, qtab_726_32, 15); case G726_ENCODING_ULAW: return tandem_adjust_ulaw(sr, se, y, code, 8, qtab_726_32, 15); } return (sr << 2); } /*- End of function --------------------------------------------------------*/ /* * Encodes a 16-bit linear PCM, A-law or u-law input sample and retuens * the resulting 5-bit CCITT G.726 40Kbps code. */ static uint8_t g726_40_encoder(g726_state_t *s, int16_t amp) { int16_t sei; int16_t sezi; int16_t se; int16_t d; int16_t sr; int16_t dqsez; int16_t dq; int16_t i; int y; sezi = predictor_zero(s); sei = sezi + predictor_pole(s); se = sei >> 1; d = amp - se; /* Quantize prediction difference */ y = step_size(s); i = quantize(d, y, qtab_726_40, 31); dq = reconstruct(i & 0x10, g726_40_dqlntab[i], y); /* Reconstruct the signal */ sr = (dq < 0) ? (se - (dq & 0x7FFF)) : (se + dq); /* Pole prediction difference */ dqsez = sr + (sezi >> 1) - se; update(s, y, g726_40_witab[i], g726_40_fitab[i], dq, sr, dqsez); return (uint8_t) i; } /*- End of function --------------------------------------------------------*/ /* * Decodes a 5-bit CCITT G.726 40Kbps code and returns * the resulting 16-bit linear PCM, A-law or u-law sample value. */ static int16_t g726_40_decoder(g726_state_t *s, uint8_t code) { int16_t sezi; int16_t sei; int16_t se; int16_t sr; int16_t dq; int16_t dqsez; int y; /* Mask to get proper bits */ code &= 0x1F; sezi = predictor_zero(s); sei = sezi + predictor_pole(s); y = step_size(s); dq = reconstruct(code & 0x10, g726_40_dqlntab[code], y); /* Reconstruct the signal */ se = sei >> 1; sr = (dq < 0) ? (se - (dq & 0x7FFF)) : (se + dq); /* Pole prediction difference */ dqsez = sr + (sezi >> 1) - se; update(s, y, g726_40_witab[code], g726_40_fitab[code], dq, sr, dqsez); switch (s->ext_coding) { case G726_ENCODING_ALAW: return tandem_adjust_alaw(sr, se, y, code, 0x10, qtab_726_40, 31); case G726_ENCODING_ULAW: return tandem_adjust_ulaw(sr, se, y, code, 0x10, qtab_726_40, 31); } return (sr << 2); } /*- End of function --------------------------------------------------------*/ g726_state_t *g726_init(g726_state_t *s, int bit_rate, int ext_coding, int packing) { int i; if (bit_rate != 16000 && bit_rate != 24000 && bit_rate != 32000 && bit_rate != 40000) return NULL; if (s == NULL) { if ((s = (g726_state_t *) malloc(sizeof(*s))) == NULL) return NULL; } s->yl = 34816; s->yu = 544; s->dms = 0; s->dml = 0; s->ap = 0; s->rate = bit_rate; s->ext_coding = ext_coding; s->packing = packing; for (i = 0; i < 2; i++) { s->a[i] = 0; s->pk[i] = 0; s->sr[i] = 32; } for (i = 0; i < 6; i++) { s->b[i] = 0; s->dq[i] = 32; } s->td = FALSE; switch (bit_rate) { case 16000: s->enc_func = g726_16_encoder; s->dec_func = g726_16_decoder; s->bits_per_sample = 2; break; case 24000: s->enc_func = g726_24_encoder; s->dec_func = g726_24_decoder; s->bits_per_sample = 3; break; case 32000: default: s->enc_func = g726_32_encoder; s->dec_func = g726_32_decoder; s->bits_per_sample = 4; break; case 40000: s->enc_func = g726_40_encoder; s->dec_func = g726_40_decoder; s->bits_per_sample = 5; break; } bitstream_init(&s->bs); return s; } /*- End of function --------------------------------------------------------*/ int g726_release(g726_state_t *s) { free(s); return 0; } /*- End of function --------------------------------------------------------*/ int g726_decode(g726_state_t *s, int16_t amp[], const uint8_t g726_data[], int g726_bytes) { int i; int samples; uint8_t code; int sl; for (samples = i = 0; ; ) { if (s->packing != G726_PACKING_NONE) { /* Unpack the code bits */ if (s->packing != G726_PACKING_LEFT) { if (s->bs.residue < s->bits_per_sample) { if (i >= g726_bytes) break; s->bs.bitstream |= (g726_data[i++] << s->bs.residue); s->bs.residue += 8; } code = (uint8_t) (s->bs.bitstream & ((1 << s->bits_per_sample) - 1)); s->bs.bitstream >>= s->bits_per_sample; } else { if (s->bs.residue < s->bits_per_sample) { if (i >= g726_bytes) break; s->bs.bitstream = (s->bs.bitstream << 8) | g726_data[i++]; s->bs.residue += 8; } code = (uint8_t) ((s->bs.bitstream >> (s->bs.residue - s->bits_per_sample)) & ((1 << s->bits_per_sample) - 1)); } s->bs.residue -= s->bits_per_sample; } else { if (i >= g726_bytes) break; code = g726_data[i++]; } sl = s->dec_func(s, code); if (s->ext_coding != G726_ENCODING_LINEAR) ((uint8_t *) amp)[samples++] = (uint8_t) sl; else amp[samples++] = (int16_t) sl; } return samples; } /*- End of function --------------------------------------------------------*/ int g726_encode(g726_state_t *s, uint8_t g726_data[], const int16_t amp[], int len) { int i; int g726_bytes; int16_t sl; uint8_t code; for (g726_bytes = i = 0; i < len; i++) { /* Linearize the input sample to 14-bit PCM */ switch (s->ext_coding) { case G726_ENCODING_ALAW: sl = alaw_to_linear(((const uint8_t *) amp)[i]) >> 2; break; case G726_ENCODING_ULAW: sl = ulaw_to_linear(((const uint8_t *) amp)[i]) >> 2; break; default: sl = amp[i] >> 2; break; } code = s->enc_func(s, sl); if (s->packing != G726_PACKING_NONE) { /* Pack the code bits */ if (s->packing != G726_PACKING_LEFT) { s->bs.bitstream |= (code << s->bs.residue); s->bs.residue += s->bits_per_sample; if (s->bs.residue >= 8) { g726_data[g726_bytes++] = (uint8_t) (s->bs.bitstream & 0xFF); s->bs.bitstream >>= 8; s->bs.residue -= 8; } } else { s->bs.bitstream = (s->bs.bitstream << s->bits_per_sample) | code; s->bs.residue += s->bits_per_sample; if (s->bs.residue >= 8) { g726_data[g726_bytes++] = (uint8_t) ((s->bs.bitstream >> (s->bs.residue - 8)) & 0xFF); s->bs.residue -= 8; } } } else { g726_data[g726_bytes++] = (uint8_t) code; } } return g726_bytes; } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/t35.c0000644000175000017500000007341311150047216016444 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * t35.c - ITU T.35 FAX non-standard facility processing. * * Written by Steve Underwood * * Copyright (C) 2003 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: t35.c,v 1.27 2008/05/13 13:17:23 steveu Exp $ */ /* * The NSF data tables are adapted from the NSF handling in HylaFAX, which * carries the following copyright notice: * * Created by Dmitry Bely, April 2000 * Copyright (c) 1994-1996 Sam Leffler * Copyright (c) 1994-1996 Silicon Graphics, Inc. * HylaFAX is a trademark of Silicon Graphics * * Permission to use, copy, modify, distribute, and sell this software and * its documentation for any purpose is hereby granted without fee, provided * that (i) the above copyright notices and this permission notice appear in * all copies of the software and related documentation, and (ii) the names of * Sam Leffler and Silicon Graphics may not be used in any advertising or * publicity relating to the software without the specific, prior written * permission of Sam Leffler and Silicon Graphics. * * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. * * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ /*! \file */ #if defined(HAVE_CONFIG_H) #include #endif #include #include #include #include "spandsp/telephony.h" #include "spandsp/bit_operations.h" #include "spandsp/t35.h" typedef struct { int model_id_size; const char *model_id; const char *model_name; } model_data_t; typedef struct { const char *vendor_id; int vendor_id_len; const char *vendor_name; int inverse_station_id_order; const model_data_t *known_models; } nsf_data_t; const char *t35_country_codes[256] = { "Japan", /* 0x00 */ "Albania", "Algeria", "American Samoa", "Germany", "Anguilla", "Antigua and Barbuda", "Argentina", "Ascension (see S. Helena)", "Australia", "Austria", "Bahamas", "Bahrain", "Bangladesh", "Barbados", "Belgium", "Belize", "Benin (Republic of)", "Bermudas", "Bhutan (Kingdom of)", "Bolivia", "Botswana", "Brazil", "British Antarctic Territory", "British Indian Ocean Territory", "British Virgin Islands", "Brunei Darussalam", "Bulgaria", "Myanmar (Union of)", "Burundi", "Byelorussia", "Cameroon", "Canada", /* 0x20 */ "Cape Verde", "Cayman Islands", "Central African Republic", "Chad", "Chile", "China", "Colombia", "Comoros", "Congo", "Cook Islands", "Costa Rica", "Cuba", "Cyprus", "Czech and Slovak Federal Republic", "Cambodia", "Democratic People's Republic of Korea", "Denmark", "Djibouti", "Dominican Republic", "Dominica", "Ecuador", "Egypt", "El Salvador", "Equatorial Guinea", "Ethiopia", "Falkland Islands", "Fiji", "Finland", "France", "French Polynesia", "French Southern and Antarctic Lands", "Gabon", /* 0x40 */ "Gambia", "Germany (Federal Republic of)", "Angola", "Ghana", "Gibraltar", "Greece", "Grenada", "Guam", "Guatemala", "Guernsey", "Guinea", "Guinea-Bissau", "Guayana", "Haiti", "Honduras", "Hong Kong", "Hungary (Republic of)", "Iceland", "India", "Indonesia", "Iran (Islamic Republic of)", "Iraq", "Ireland", "Israel", "Italy", "Cote d'Ivoire", "Jamaica", "Afghanistan", "Jersey", "Jordan", "Kenya", "Kiribati", /* 0x60 */ "Korea (Republic of)", "Kuwait", "Lao (People's Democratic Republic)", "Lebanon", "Lesotho", "Liberia", "Libya", "Liechtenstein", "Luxembourg", "Macau", "Madagascar", "Malaysia", "Malawi", "Maldives", "Mali", "Malta", "Mauritania", "Mauritius", "Mexico", "Monaco", "Mongolia", "Montserrat", "Morocco", "Mozambique", "Nauru", "Nepal", "Netherlands", "Netherlands Antilles", "New Caledonia", "New Zealand", "Nicaragua", "Niger", /* 0x80 */ "Nigeria", "Norway", "Oman", "Pakistan", "Panama", "Papua New Guinea", "Paraguay", "Peru", "Philippines", "Poland (Republic of)", "Portugal", "Puerto Rico", "Qatar", "Romania", "Rwanda", "Saint Kitts and Nevis", "Saint Croix", "Saint Helena and Ascension", "Saint Lucia", "San Marino", "Saint Thomas", "Sao Tome and Principe", "Saint Vincent and the Grenadines", "Saudi Arabia", "Senegal", "Seychelles", "Sierra Leone", "Singapore", "Solomon Islands", "Somalia", "South Africa", "Spain", /* 0xA0 */ "Sri Lanka", "Sudan", "Suriname", "Swaziland", "Sweden", "Switzerland", "Syria", "Tanzania", "Thailand", "Togo", "Tonga", "Trinidad and Tobago", "Tunisia", "Turkey", "Turks and Caicos Islands", "Tuvalu", "Uganda", "Ukraine", "United Arab Emirates", "United Kingdom", "United States", "Burkina Faso", "Uruguay", "U.S.S.R.", "Vanuatu", "Vatican City State", "Venezuela", "Viet Nam", "Wallis and Futuna", "Western Samoa", "Yemen (Republic of)", "Yemen (Republic of)", /* 0xC0 */ "Yugoslavia", "Zaire", "Zambia", "Zimbabwe" "Slovakia", "Slovenia", "(available)", "(available)", "(available)", "(available)", "(available)", "(available)", "(available)", "(available)", "(available)", "(available)", /* 0xD0 */ "(available)", "(available)", "(available)", "(available)", "(available)", "(available)", "(available)", "(available)", "(available)", "(available)", "(available)", "(available)", "(available)", "(available)", "(available)", "(available)", /* 0xE0 */ "(available)", "(available)", "(available)", "(available)", "(available)", "(available)", "(available)", "(available)", "(available)", "(available)", "(available)", "(available)", "(available)", "(available)", "(available)", "(available)", /* 0xF0 */ "(available)", "(available)", "(available)", "(available)", "(available)", "(available)", "Lithuania", "Latvia", "Estonia", "US Virgin Islands", "(available)", "(available)", "(Universal)", "Taiwan", "(extension)" }; static const model_data_t Canon[] = { {5, "\x80\x00\x80\x48\x00", "Faxphone B640"}, {5, "\x80\x00\x80\x49\x10", "Fax B100"}, {5, "\x80\x00\x8A\x49\x10", "Laser Class 9000 Series"}, {0, NULL, NULL} }; static const model_data_t Brother[] = { {9, "\x55\x55\x00\x88\x90\x80\x5F\x00\x15\x51", "Intellifax 770"}, {9, "\x55\x55\x00\x80\xB0\x80\x00\x00\x59\xD4", "Personal fax 190"}, {9, "\x55\x55\x00\x8C\x90\x80\xF0\x02\x20", "MFC-8600"}, {0, NULL, NULL} }; static const model_data_t Panasonic0E[] = { {10, "\x00\x00\x00\x96\x0F\x01\x02\x00\x10\x05\x02\x95\xC8\x08\x01\x49\x02\x41\x53\x54\x47", "KX-F90"}, {10, "\x00\x00\x00\x96\x0F\x01\x03\x00\x10\x05\x02\x95\xC8\x08\x01\x49\x02 \x03", "KX-F230 or KX-FT21 or ..."}, {10, "\x00\x00\x00\x16\x0F\x01\x03\x00\x10\x05\x02\x95\xC8\x08", "KX-F780"}, {10, "\x00\x00\x00\x16\x0F\x01\x03\x00\x10\x00\x02\x95\x80\x08\x75\xB5", "KX-M260"}, {10, "\x00\x00\x00\x16\x0F\x01\x02\x00\x10\x05\x02\x85\xC8\x08\xAD", "KX-F2050BS"}, {0, NULL, NULL} }; static const model_data_t Panasonic79[] = { {10, "\x00\x00\x00\x02\x0F\x09\x12\x00\x10\x05\x02\x95\xC8\x88\x80\x80\x01", "UF-S10"}, {10, "\x00\x00\x00\x16\x7F\x09\x13\x00\x10\x05\x16\x8D\xC0\xD0\xF8\x80\x01", "/Siemens Fax 940"}, {10, "\x00\x00\x00\x16\x0F\x09\x13\x00\x10\x05\x06\x8D\xC0\x50\xCB", "Panafax UF-321"}, {0, NULL, NULL} }; static const model_data_t Ricoh[] = { {10, "\x00\x00\x00\x12\x10\x0D\x02\x00\x50\x00\x2A\xB8\x2C", "/Nashuatec P394"}, {0, NULL, NULL} }; static const model_data_t Samsung16[] = { {4, "\x00\x00\xA4\x01", "M545 6800"}, {0, NULL, NULL} }; static const model_data_t Samsung5A[] = { {4, "\x00\x00\xC0\x00", "SF-5100"}, {0, NULL, NULL} }; static const model_data_t Samsung8C[] = { {4, "\x00\x00\x01\x00", "SF-2010"}, {0, NULL, NULL} }; static const model_data_t SamsungA2[] = { {4, "\x00\x00\x80\x00", "FX-4000"}, {0, NULL, NULL} }; static const model_data_t Sanyo[] = { {10, "\x00\x00\x10\xB1\x04\x04\x04\x04\x04\x04\x04\x04\x04\x04\x04\x04\x04\x04\x04\x04\x04\x04\x04\x04\x04\x04\x04\x04\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x41\x26\xFF\xFF\x00\x00\x85\xA1", "SFX-107"}, {10, "\x00\x00\x00\xB1\x12\xF2\x62\xB4\x82\x0A\xF2\x2A\x12\xD2\xA2\x04\x04\x04\x04\x04\x04\x04\x04\x04\x04\x04\x04\x04\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x41\x4E\xFF\xFF\x00\x00", "MFP-510"}, {0, NULL, NULL} }; static const model_data_t HP[] = { {5, "\x20\x00\x45\x00\x0C\x04\x70\xCD\x4F\x00\x7F\x49", "LaserJet 3150"}, {5, "\x40\x80\x84\x01\xF0\x6A", "OfficeJet"}, {5, "\xC0\x00\x00\x00\x00", "OfficeJet 500"}, {5, "\xC0\x00\x00\x00\x00\x8B", "Fax-920"}, {0, NULL, NULL} }; static const model_data_t Sharp[] = { {32, "\x00\xCE\xB8\x80\x80\x11\x85\x0D\xDD\x00\x00\xDD\xDD\x00\x00\xDD\xDD\x00\x00\x00\x00\x00\x00\x00\x00\xED\x22\xB0\x00\x00\x90\x00", "Sharp F0-10"}, {33, "\x00\xCE\xB8\x80\x80\x11\x85\x0D\xDD\x00\x00\xDD\xDD\x00\x00\xDD\xDD\x00\x00\x00\x00\x00\x00\x00\x00\xED\x22\xB0\x00\x00\x90\x00\x8C", "Sharp UX-460"}, {33, "\x00\x4E\xB8\x80\x80\x11\x84\x0D\xDD\x00\x00\xDD\xDD\x00\x00\xDD\xDD\x00\x00\x00\x00\x00\x00\x00\x00\xED\x22\xB0\x00\x00\x90\x00\xAD", "Sharp UX-177"}, {33, "\x00\xCE\xB8\x00\x84\x0D\xDD\x00\x00\xDD\xDD\x00\x00\xDD\xDD\xDD\xDD\xDD\x02\x05\x28\x02\x22\x43\x29\xED\x23\x90\x00\x00\x90\x01\x00", "Sharp FO-4810"}, {0, NULL, NULL} }; static const model_data_t Xerox[] = { {10, "\x00\x08\x2D\x43\x57\x50\x61\x75\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x01\x1A\x02\x02\x10\x01\x82\x01\x30\x34", "635 Workcenter"}, {0, NULL, NULL} }; static const model_data_t XeroxDA[] = { {4, "\x00\x00\xC0\x00", "Workcentre Pro 580"}, {0, NULL, NULL} }; static const model_data_t Lexmark[] = { {4, "\x00\x80\xA0\x00", "X4270"}, {0, NULL, NULL} }; static const model_data_t JetFax[] = { {6, "\x01\x00\x45\x00\x0D\x7F", "M910e"}, {0, NULL, NULL} }; static const model_data_t PitneyBowes[] = { {6, "\x79\x91\xB1\xB8\x7A\xD8", "9550"}, {0, NULL, NULL} }; static const model_data_t Dialogic[] = { {8, "\x56\x8B\x06\x55\x00\x15\x00\x00", "VFX/40ESC"}, {0, NULL, NULL} }; static const model_data_t Muratec45[] = { {10, "\xF4\x91\xFF\xFF\xFF\x42\x2A\xBC\x01\x57", "M4700"}, {0, NULL, NULL} }; /* Muratec uses unregistered Japan code "00 00 48" */ static const model_data_t Muratec48[] = { {3, "\x53\x53\x61", "M620"}, {0, NULL, NULL} }; /* * Country code first byte, then manufacturer is last two bytes. See T.35. * Apparently Germany issued some manufacturer codes before the two-byte * standard was accepted, and so some few German manufacturers are * identified by a single manufacturer byte. * * T.30 5.3.6.2.7 (2003) states that the NSF FIF is transmitted * in MSB2LSB order. Revisions of T.30 prior to 2003 did not * contain explicit specification as to the transmit bit order. * (Although it did otherwise state that all HDLC frame data should * be in MSB order except as noted.) Because CSI, TSI, and other * prologue frames were in LSB order by way of an exception to the * general rule (T.30 5.3.6.2.4-11) many manufacturers assumed that * NSF should also be in LSB order. Consequently there will be * some country-code "masquerading" as a terminal may use the * proper country-code, but with an inverted bit order. * * Thus, country code x61 (Korea) turns into x86 (Papua New Guinea), * code xB5 (USA) turns into xAD (Tunisia), code x26 (China) turns * into x64 (Lebanon), code x04 (Germany) turns into x20 (Canada), * and code x3D (France) turns into xBC (Vietnam). * * For the most part it should be safe to identify a manufacturer * both with the MSB and LSB ordered bits, as the "masqueraded" country * is likely to not be actively assigning T.38 manufacturer codes. * However, some manufacturers (e.g. Microsoft) may use MSB for the * country code and LSB for the rest of the NSF, and so basically this * table must be verified and corrected against actual real-world * results. */ static const nsf_data_t known_nsf[] = { /* Japan */ {"\x00\x00\x00", 3, "unknown - indeterminate", TRUE, NULL}, {"\x00\x00\x01", 3, "Anjitsu", FALSE, NULL}, {"\x00\x00\x02", 3, "Nippon Telephone", FALSE, NULL}, {"\x00\x00\x05", 3, "Mitsuba Electric", FALSE, NULL}, {"\x00\x00\x06", 3, "Master Net", FALSE, NULL}, {"\x00\x00\x09", 3, "Xerox/Toshiba", TRUE, Xerox}, {"\x00\x00\x0A", 3, "Kokusai", FALSE, NULL}, {"\x00\x00\x0D", 3, "Logic System International", FALSE, NULL}, {"\x00\x00\x0E", 3, "Panasonic", FALSE, Panasonic0E}, {"\x00\x00\x11", 3, "Canon", FALSE, Canon}, {"\x00\x00\x15", 3, "Toyotsushen Machinery", FALSE, NULL}, {"\x00\x00\x16", 3, "System House Mind", FALSE, NULL}, {"\x00\x00\x19", 3, "Xerox", TRUE, NULL}, {"\x00\x00\x1D", 3, "Hitachi Software", FALSE, NULL}, {"\x00\x00\x21", 3, "OKI Electric/Lanier", TRUE, NULL}, {"\x00\x00\x25", 3, "Ricoh", TRUE, Ricoh}, {"\x00\x00\x26", 3, "Konica", FALSE, NULL}, {"\x00\x00\x29", 3, "Japan Wireless", FALSE, NULL}, {"\x00\x00\x2D", 3, "Sony", FALSE, NULL}, {"\x00\x00\x31", 3, "Sharp/Olivetti", FALSE, Sharp}, {"\x00\x00\x35", 3, "Kogyu", FALSE, NULL}, {"\x00\x00\x36", 3, "Japan Telecom", FALSE, NULL}, {"\x00\x00\x3D", 3, "IBM Japan", FALSE, NULL}, {"\x00\x00\x39", 3, "Panasonic", FALSE, NULL}, {"\x00\x00\x41", 3, "Swasaki Communication", FALSE, NULL}, {"\x00\x00\x45", 3, "Muratec", FALSE, Muratec45}, {"\x00\x00\x46", 3, "Pheonix", FALSE, NULL}, {"\x00\x00\x48", 3, "Muratec", FALSE, Muratec48}, // not registered {"\x00\x00\x49", 3, "Japan Electric", FALSE, NULL}, {"\x00\x00\x4D", 3, "Okura Electric", FALSE, NULL}, {"\x00\x00\x51", 3, "Sanyo", FALSE, Sanyo}, {"\x00\x00\x55", 3, "unknown - Japan 55", FALSE, NULL}, {"\x00\x00\x56", 3, "Brother", FALSE, Brother}, {"\x00\x00\x59", 3, "Fujitsu", FALSE, NULL}, {"\x00\x00\x5D", 3, "Kuoni", FALSE, NULL}, {"\x00\x00\x61", 3, "Casio", FALSE, NULL}, {"\x00\x00\x65", 3, "Tateishi Electric", FALSE, NULL}, {"\x00\x00\x66", 3, "Utax/Mita", TRUE, NULL}, {"\x00\x00\x69", 3, "Hitachi Production", FALSE, NULL}, {"\x00\x00\x6D", 3, "Hitachi Telecom", FALSE, NULL}, {"\x00\x00\x71", 3, "Tamura Electric Works", FALSE, NULL}, {"\x00\x00\x75", 3, "Tokyo Electric Corp.", FALSE, NULL}, {"\x00\x00\x76", 3, "Advance", FALSE, NULL}, {"\x00\x00\x79", 3, "Panasonic", FALSE, Panasonic79}, {"\x00\x00\x7D", 3, "Seiko", FALSE, NULL}, {"\x00\x08\x00", 3, "Daiko", FALSE, NULL}, {"\x00\x10\x00", 3, "Funai Electric", FALSE, NULL}, {"\x00\x20\x00", 3, "Eagle System", FALSE, NULL}, {"\x00\x30\x00", 3, "Nippon Business Systems", FALSE, NULL}, {"\x00\x40\x00", 3, "Comtron", FALSE, NULL}, {"\x00\x48\x00", 3, "Cosmo Consulting", FALSE, NULL}, {"\x00\x50\x00", 3, "Orion Electric", FALSE, NULL}, {"\x00\x60\x00", 3, "Nagano Nippon", FALSE, NULL}, {"\x00\x70\x00", 3, "Kyocera", FALSE, NULL}, {"\x00\x80\x00", 3, "Kanda Networks", FALSE, NULL}, {"\x00\x88\x00", 3, "Soft Front", FALSE, NULL}, {"\x00\x90\x00", 3, "Arctic", FALSE, NULL}, {"\x00\xA0\x00", 3, "Nakushima", FALSE, NULL}, {"\x00\xB0\x00", 3, "Minolta", FALSE, NULL}, {"\x00\xC0\x00", 3, "Tohoku Pioneer", FALSE, NULL}, {"\x00\xD0\x00", 3, "USC", FALSE, NULL}, {"\x00\xE0\x00", 3, "Hiboshi", FALSE, NULL}, {"\x00\xF0\x00", 3, "Sumitomo Electric", FALSE, NULL}, /* Germany */ {"\x20\x09", 2, "ITK Institut für Telekommunikation GmbH & Co KG", FALSE, NULL}, {"\x20\x11", 2, "Dr. Neuhaus Mikroelektronik", FALSE, NULL}, {"\x20\x21", 2, "ITO Communication", FALSE, NULL}, {"\x20\x31", 2, "mbp Kommunikationssysteme GmbH", FALSE, NULL}, {"\x20\x41", 2, "Siemens", FALSE, NULL}, {"\x20\x42", 2, "Deutsche Telekom AG", FALSE, NULL}, {"\x20\x51", 2, "mps Software", FALSE, NULL}, {"\x20\x61", 2, "Hauni Elektronik", FALSE, NULL}, {"\x20\x71", 2, "Digitronic computersysteme gmbh", FALSE, NULL}, {"\x20\x81\x00", 3, "Innovaphone GmbH", FALSE, NULL}, {"\x20\x81\x40", 3, "TEDAS Gesellschaft für Telekommunikations-, Daten- und Audiosysteme mbH", FALSE, NULL}, {"\x20\x81\x80", 3, "AVM Audiovisuelles Marketing und Computersysteme GmbH", FALSE, NULL}, {"\x20\x81\xC0", 3, "EICON Technology Research GmbH", FALSE, NULL}, {"\x20\xB1", 2, "Schneider Rundfunkwerke AG", FALSE, NULL}, {"\x20\xC2", 2, "Deutsche Telekom AG", FALSE, NULL}, {"\x20\xD1", 2, "Ferrari electronik GmbH", FALSE, NULL}, {"\x20\xF1", 2, "DeTeWe - Deutsche Telephonwerke AG & Co", FALSE, NULL}, {"\x20\xFF", 2, "Germany Regional Code", FALSE, NULL}, /* China */ {"\x64\x00\x00", 3, "unknown - China 00 00", FALSE, NULL}, {"\x64\x01\x00", 3, "unknown - China 01 00", FALSE, NULL}, {"\x64\x01\x01", 3, "unknown - China 01 01", FALSE, NULL}, {"\x64\x01\x02", 3, "unknown - China 01 02", FALSE, NULL}, /* France */ {"\xBC\x53\x01", 3, "Minolta", FALSE, NULL}, /* Korea */ {"\x86\x00\x02", 3, "unknown - Korea 02", FALSE, NULL}, {"\x86\x00\x06", 3, "unknown - Korea 06", FALSE, NULL}, {"\x86\x00\x08", 3, "unknown - Korea 08", FALSE, NULL}, {"\x86\x00\x0A", 3, "unknown - Korea 0A", FALSE, NULL}, {"\x86\x00\x0E", 3, "unknown - Korea 0E", FALSE, NULL}, {"\x86\x00\x10", 3, "Samsung", FALSE, NULL}, {"\x86\x00\x11", 3, "unknown - Korea 11", FALSE, NULL}, {"\x86\x00\x16", 3, "Samsung", FALSE, Samsung16}, {"\x86\x00\x1A", 3, "unknown - Korea 1A", FALSE, NULL}, {"\x86\x00\x40", 3, "unknown - Korea 40", FALSE, NULL}, {"\x86\x00\x48", 3, "unknown - Korea 48", FALSE, NULL}, {"\x86\x00\x52", 3, "unknown - Korea 52", FALSE, NULL}, {"\x86\x00\x5A", 3, "Samsung", FALSE, Samsung5A}, {"\x86\x00\x5E", 3, "unknown - Korea 5E", FALSE, NULL}, {"\x86\x00\x66", 3, "unknown - Korea 66", FALSE, NULL}, {"\x86\x00\x6E", 3, "unknown - Korea 6E", FALSE, NULL}, {"\x86\x00\x82", 3, "unknown - Korea 82", FALSE, NULL}, {"\x86\x00\x88", 3, "unknown - Korea 88", FALSE, NULL}, {"\x86\x00\x8A", 3, "unknown - Korea 8A", FALSE, NULL}, {"\x86\x00\x8C", 3, "Samsung", FALSE, Samsung8C}, {"\x86\x00\x92", 3, "unknown - Korea 92", FALSE, NULL}, {"\x86\x00\x98", 3, "Samsung", FALSE, NULL}, {"\x86\x00\xA2", 3, "Samsung", FALSE, SamsungA2}, {"\x86\x00\xA4", 3, "unknown - Korea A4", FALSE, NULL}, {"\x86\x00\xC2", 3, "Samsung", FALSE, NULL}, {"\x86\x00\xC9", 3, "unknown - Korea C9", FALSE, NULL}, {"\x86\x00\xCC", 3, "unknown - Korea CC", FALSE, NULL}, {"\x86\x00\xD2", 3, "unknown - Korea D2", FALSE, NULL}, {"\x86\x00\xDA", 3, "Xerox", FALSE, XeroxDA}, {"\x86\x00\xE2", 3, "unknown - Korea E2", FALSE, NULL}, {"\x86\x00\xEC", 3, "unknown - Korea EC", FALSE, NULL}, {"\x86\x00\xEE", 3, "unknown - Korea EE", FALSE, NULL}, /* United Kingdom */ {"\xB4\x00\xB0", 3, "DCE", FALSE, NULL}, {"\xB4\x00\xB1", 3, "Hasler", FALSE, NULL}, {"\xB4\x00\xB2", 3, "Interquad", FALSE, NULL}, {"\xB4\x00\xB3", 3, "Comwave", FALSE, NULL}, {"\xB4\x00\xB4", 3, "Iconographic", FALSE, NULL}, {"\xB4\x00\xB5", 3, "Wordcraft", FALSE, NULL}, {"\xB4\x00\xB6", 3, "Acorn", FALSE, NULL}, /* United States */ {"\xAD\x00\x00", 3, "Pitney Bowes", FALSE, PitneyBowes}, {"\xAD\x00\x0C", 3, "Dialogic", FALSE, NULL}, {"\xAD\x00\x15", 3, "Lexmark", FALSE, Lexmark}, {"\xAD\x00\x16", 3, "JetFax", FALSE, JetFax}, {"\xAD\x00\x24", 3, "Octel", FALSE, NULL}, {"\xAD\x00\x36", 3, "HP", FALSE, HP}, {"\xAD\x00\x42", 3, "FaxTalk", FALSE, NULL}, {"\xAD\x00\x44", 3, NULL, TRUE, NULL}, {"\xAD\x00\x46", 3, "BrookTrout", FALSE, NULL}, {"\xAD\x00\x51", 3, "Telogy Networks", FALSE, NULL}, {"\xAD\x00\x55", 3, "HylaFAX", FALSE, NULL}, {"\xAD\x00\x5C", 3, "IBM", FALSE, NULL}, {"\xAD\x00\x98", 3, "unknown - USA 98", TRUE, NULL}, {"\xB5\x00\x01", 3, "Picturetel", FALSE, NULL}, {"\xB5\x00\x20", 3, "Conexant", FALSE, NULL}, {"\xB5\x00\x22", 3, "Comsat", FALSE, NULL}, {"\xB5\x00\x24", 3, "Octel", FALSE, NULL}, {"\xB5\x00\x26", 3, "ROLM", FALSE, NULL}, {"\xB5\x00\x28", 3, "SOFNET", FALSE, NULL}, {"\xB5\x00\x29", 3, "TIA TR-29 Committee", FALSE, NULL}, {"\xB5\x00\x2A", 3, "STF Tech", FALSE, NULL}, {"\xB5\x00\x2C", 3, "HKB", FALSE, NULL}, {"\xB5\x00\x2E", 3, "Delrina", FALSE, NULL}, {"\xB5\x00\x30", 3, "Dialogic", FALSE, NULL}, {"\xB5\x00\x32", 3, "Applied Synergy", FALSE, NULL}, {"\xB5\x00\x34", 3, "Syncro Development", FALSE, NULL}, {"\xB5\x00\x36", 3, "Genoa", FALSE, NULL}, {"\xB5\x00\x38", 3, "Texas Instruments", FALSE, NULL}, {"\xB5\x00\x3A", 3, "IBM", FALSE, NULL}, {"\xB5\x00\x3C", 3, "ViaSat", FALSE, NULL}, {"\xB5\x00\x3E", 3, "Ericsson", FALSE, NULL}, {"\xB5\x00\x42", 3, "Bogosian", FALSE, NULL}, {"\xB5\x00\x44", 3, "Adobe", FALSE, NULL}, {"\xB5\x00\x46", 3, "Fremont Communications", FALSE, NULL}, {"\xB5\x00\x48", 3, "Hayes", FALSE, NULL}, {"\xB5\x00\x4A", 3, "Lucent", FALSE, NULL}, {"\xB5\x00\x4C", 3, "Data Race", FALSE, NULL}, {"\xB5\x00\x4E", 3, "TRW", FALSE, NULL}, {"\xB5\x00\x52", 3, "Audiofax", FALSE, NULL}, {"\xB5\x00\x54", 3, "Computer Automation", FALSE, NULL}, {"\xB5\x00\x56", 3, "Serca", FALSE, NULL}, {"\xB5\x00\x58", 3, "Octocom", FALSE, NULL}, {"\xB5\x00\x5C", 3, "Power Solutions", FALSE, NULL}, {"\xB5\x00\x5A", 3, "Digital Sound", FALSE, NULL}, {"\xB5\x00\x5E", 3, "Pacific Data", FALSE, NULL}, {"\xB5\x00\x60", 3, "Commetrex", FALSE, NULL}, {"\xB5\x00\x62", 3, "BrookTrout", FALSE, NULL}, {"\xB5\x00\x64", 3, "Gammalink", FALSE, NULL}, {"\xB5\x00\x66", 3, "Castelle", FALSE, NULL}, {"\xB5\x00\x68", 3, "Hybrid Fax", FALSE, NULL}, {"\xB5\x00\x6A", 3, "Omnifax", FALSE, NULL}, {"\xB5\x00\x6C", 3, "HP", FALSE, NULL}, {"\xB5\x00\x6E", 3, "Microsoft", FALSE, NULL}, {"\xB5\x00\x72", 3, "Speaking Devices", FALSE, NULL}, {"\xB5\x00\x74", 3, "Compaq", FALSE, NULL}, /* {"\xB5\x00\x76", 3, "Trust - Cryptek", FALSE, NULL}, // collision with Microsoft */ {"\xB5\x00\x76", 3, "Microsoft", FALSE, NULL}, // uses LSB for country but MSB for manufacturer {"\xB5\x00\x78", 3, "Cylink", FALSE, NULL}, {"\xB5\x00\x7A", 3, "Pitney Bowes", FALSE, NULL}, {"\xB5\x00\x7C", 3, "Digiboard", FALSE, NULL}, {"\xB5\x00\x7E", 3, "Codex", FALSE, NULL}, {"\xB5\x00\x82", 3, "Wang Labs", FALSE, NULL}, {"\xB5\x00\x84", 3, "Netexpress Communications", FALSE, NULL}, {"\xB5\x00\x86", 3, "Cable-Sat", FALSE, NULL}, {"\xB5\x00\x88", 3, "MFPA", FALSE, NULL}, {"\xB5\x00\x8A", 3, "Telogy Networks", FALSE, NULL}, {"\xB5\x00\x8E", 3, "Telecom Multimedia Systems", FALSE, NULL}, {"\xB5\x00\x8C", 3, "AT&T", FALSE, NULL}, {"\xB5\x00\x92", 3, "Nuera", FALSE, NULL}, {"\xB5\x00\x94", 3, "K56flex", FALSE, NULL}, {"\xB5\x00\x96", 3, "MiBridge", FALSE, NULL}, {"\xB5\x00\x98", 3, "Xerox", FALSE, NULL}, {"\xB5\x00\x9A", 3, "Fujitsu", FALSE, NULL}, {"\xB5\x00\x9B", 3, "Fujitsu", FALSE, NULL}, {"\xB5\x00\x9C", 3, "Natural Microsystems", FALSE, NULL}, {"\xB5\x00\x9E", 3, "CopyTele", FALSE, NULL}, {"\xB5\x00\xA2", 3, "Murata", FALSE, NULL}, {"\xB5\x00\xA4", 3, "Lanier", FALSE, NULL}, {"\xB5\x00\xA6", 3, "Qualcomm", FALSE, NULL}, {"\xB5\x00\xAA", 3, "HylaFAX", FALSE, NULL}, // we did it backwards for a while {NULL, 0, NULL, FALSE, NULL} }; #if 0 void nsf_find_station_id(int reverse_order) { const char *id = NULL; int idSize = 0; const char *maxId = NULL; int maxIdSize = 0; const char *p; /* Trying to find the longest printable ASCII sequence */ for (p = (const char *) nsf + T35_VENDOR_ID_LEN, *end = p + nsf.length(); p < end; p++) { if (isprint(*p)) { if (!idSize++) id = p; if (idSize > maxIdSize) { max_id = id; max_id_size = idSize; } } else { id = NULL; id_size = 0; } } /* Minimum acceptable id length */ const int MinIdSize = 4; if (maxIdSize >= min_id_size) { stationId.resize(0); const char *p; int dir; if (reverseOrder) { p = maxId + maxIdSize - 1; dir = -1; } else { p = maxId; dir = 1; } for (int i = 0; i < maxIdSize; i++) { stationId.append(*p); p += dir; } station_id_decoded = TRUE; } } /*- End of function --------------------------------------------------------*/ #endif int t35_decode(const uint8_t *msg, int len, const char **country, const char **vendor, const char **model) { int vendor_decoded; const nsf_data_t *p; const model_data_t *pp; vendor_decoded = FALSE; if (country) *country = NULL; if (vendor) *vendor = NULL; if (model) *model = NULL; if (country) { /* We need to apply realism over accuracy, though it blocks out some countries. It is very rare to find a machine from any country but the following: Japan 0x00 (no confusion) Germany 0x04 (0x20) (Canada/Germany confusion) China 0x26 (0x64) (China/Lebanon confusion) Korea 0x61 (0x86) (Korea/Papua New Guinea confusion) UK 0xB4 (0x2D) (UK/Cyprus confusion) USA 0xB5 (0xAD) (USA/Tunisia confusion) France 0x3D (0xBC) (France/Vietnam confusion) If we force the most likely of the two possible countries (forward or bit reversed), the only mixup with any realistic probability is the Canada/Germany confusion. We will just live with this, and force the more likely countries. */ switch (msg[0]) { case 0x20: /* Force Germany */ *country = t35_country_codes[0x04]; break; case 0x64: /* Force China */ *country = t35_country_codes[0x26]; break; case 0x86: /* Force Korea */ *country = t35_country_codes[0x61]; break; case 0x2D: /* Force UK */ *country = t35_country_codes[0xB4]; break; case 0xAD: /* Force USA */ *country = t35_country_codes[0xB5]; break; case 0xBC: /* Force France */ *country = t35_country_codes[0x3D]; break; default: /* Try the country code at face value, then bit reversed */ if (t35_country_codes[msg[0]]) *country = t35_country_codes[msg[0]]; else if (t35_country_codes[bit_reverse8(msg[0])]) *country = t35_country_codes[bit_reverse8(msg[0])]; break; } } for (p = known_nsf; p->vendor_id; p++) { if (len >= p->vendor_id_len && memcmp(p->vendor_id, msg, p->vendor_id_len) == 0) { if (p->vendor_name && vendor) *vendor = p->vendor_name; if (p->known_models && model) { for (pp = p->known_models; pp->model_id; pp++) { if (len == p->vendor_id_len + pp->model_id_size && memcmp(pp->model_id, &msg[p->vendor_id_len], pp->model_id_size) == 0) { *model = pp->model_name; break; } } } #if 0 findStationId(p->inverse_station_id_order); #endif vendor_decoded = TRUE; break; } } #if 0 if (!vendor_found()) find_station_id(0); #endif return vendor_decoded; } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/v22bis_rx_2400_floating_rrc.h0000644000175000017500000005076111150047216023055 0ustar julienjulien#define RX_PULSESHAPER_2400_GAIN 1.000000f #define RX_PULSESHAPER_2400_COEFF_SETS 12 static const complexf_t rx_pulseshaper_2400[RX_PULSESHAPER_2400_COEFF_SETS][37] = { { { 0.0015563115f, 0.0011307265f}, /* Filter 0 */ { -0.0032627462f, 0.0023705238f}, { -0.0018949322f, -0.0058320016f}, { 0.0078656419f, 0.0000000000f}, { -0.0027306201f, 0.0084039844f}, { -0.0069940380f, -0.0050814660f}, { 0.0056094252f, -0.0040754860f}, { 0.0010599786f, 0.0032622786f}, { 0.0020114800f, 0.0000000000f}, { -0.0028990996f, 0.0089225112f}, { -0.0149657275f, -0.0108732375f}, { 0.0234683618f, -0.0170507629f}, { 0.0124851225f, 0.0384252560f}, { -0.0520524432f, -0.0000000000f}, { 0.0195473360f, -0.0601605142f}, { 0.0593000660f, 0.0430840199f}, { -0.0659432016f, 0.0479105404f}, { -0.0269855260f, -0.0830529093f}, { 0.0903420234f, 0.0000000000f}, { -0.0279172205f, 0.0859203700f}, { -0.0706490244f, -0.0513295208f}, { 0.0659432016f, -0.0479105404f}, { 0.0226506097f, 0.0697114085f}, { -0.0632565081f, 0.0000000000f}, { 0.0160850895f, -0.0495048153f}, { 0.0326864751f, 0.0237481142f}, { -0.0234683618f, 0.0170507629f}, { -0.0057163992f, -0.0175932678f}, { 0.0093816835f, -0.0000000000f}, { -0.0006215815f, 0.0019130312f}, { 0.0027750599f, 0.0020161991f}, { -0.0056094252f, 0.0040754860f}, { -0.0026714848f, -0.0082219847f}, { 0.0088364722f, -0.0000000000f}, { -0.0024306170f, 0.0074806699f}, { -0.0049609969f, -0.0036043752f}, { 0.0032627462f, -0.0023705238f} }, { { 0.0016927688f, 0.0012298685f}, /* Filter 1 */ { -0.0034082187f, 0.0024762158f}, { -0.0019455259f, -0.0059877130f}, { 0.0079812854f, 0.0000000000f}, { -0.0027410584f, 0.0084361101f}, { -0.0069292139f, -0.0050343686f}, { 0.0054309843f, -0.0039458410f}, { 0.0009430216f, 0.0029023221f}, { 0.0025533503f, 0.0000000000f}, { -0.0031144226f, 0.0095852072f}, { -0.0156361473f, -0.0113603260f}, { 0.0242156763f, -0.0175937187f}, { 0.0127849906f, 0.0393481552f}, { -0.0530130803f, -0.0000000000f}, { 0.0198226534f, -0.0610078541f}, { 0.0599172158f, 0.0435324055f}, { -0.0664148260f, 0.0482531955f}, { -0.0270975664f, -0.0833977341f}, { 0.0904586247f, 0.0000000000f}, { -0.0278746829f, 0.0857894527f}, { -0.0703398778f, -0.0511049127f}, { 0.0654580487f, -0.0475580562f}, { 0.0224109291f, 0.0689737474f}, { -0.0623574663f, 0.0000000000f}, { 0.0157872820f, -0.0485882579f}, { 0.0319028797f, 0.0231787989f}, { -0.0227260712f, 0.0165114572f}, { -0.0054633388f, -0.0168144279f}, { 0.0086971142f, -0.0000000000f}, { -0.0004583041f, 0.0014105150f}, { 0.0030702935f, 0.0022306988f}, { -0.0057777402f, 0.0041977740f}, { -0.0026929678f, -0.0082881026f}, { 0.0087945988f, -0.0000000000f}, { -0.0023932450f, 0.0073656508f}, { -0.0048265064f, -0.0035066621f}, { 0.0031172501f, -0.0022648148f} }, { { 0.0018306919f, 0.0013300756f}, /* Filter 2 */ { -0.0035535150f, 0.0025817797f}, { -0.0019952730f, -0.0061408189f}, { 0.0080913986f, 0.0000000000f}, { -0.0027489254f, 0.0084603224f}, { -0.0068556597f, -0.0049809284f}, { 0.0052423164f, -0.0038087658f}, { 0.0008218653f, 0.0025294414f}, { 0.0031086542f, 0.0000000000f}, { -0.0033334754f, 0.0102593823f}, { -0.0163142578f, -0.0118530021f}, { 0.0249677455f, -0.0181401289f}, { 0.0130852984f, 0.0402724075f}, { -0.0539702141f, -0.0000000000f}, { 0.0200953432f, -0.0618471069f}, { 0.0605237437f, 0.0439730737f}, { -0.0668726942f, 0.0485858563f}, { -0.0272035008f, -0.0837237667f}, { 0.0905540931f, 0.0000000000f}, { -0.0278256577f, 0.0856385688f}, { -0.0700150468f, -0.0508689091f}, { 0.0649596031f, -0.0471959142f}, { 0.0221674156f, 0.0682242900f}, { -0.0614507444f, 0.0000000000f}, { 0.0154886502f, -0.0476691639f}, { 0.0311210713f, 0.0226107818f}, { -0.0219890738f, 0.0159759973f}, { -0.0052133718f, -0.0160451085f}, { 0.0080249289f, -0.0000000000f}, { -0.0002992118f, 0.0009208793f}, { 0.0033546046f, 0.0024372629f}, { -0.0059360333f, 0.0043127806f}, { -0.0027112317f, -0.0083443130f}, { 0.0087448582f, -0.0000000000f}, { -0.0023543099f, 0.0072458207f}, { -0.0046901610f, -0.0034076014f}, { 0.0029718837f, -0.0021591999f} }, { { 0.0019699621f, 0.0014312612f}, /* Filter 3 */ { -0.0036984773f, 0.0026871011f}, { -0.0020441043f, -0.0062911061f}, { 0.0081957427f, 0.0000000000f}, { -0.0027541532f, 0.0084764120f}, { -0.0067732266f, -0.0049210372f}, { 0.0050433272f, -0.0036641917f}, { 0.0006965003f, 0.0021436074f}, { 0.0036773273f, 0.0000000000f}, { -0.0035562061f, 0.0109448771f}, { -0.0169998438f, -0.0123511095f}, { 0.0257242871f, -0.0186897886f}, { 0.0133859229f, 0.0411976345f}, { -0.0549234238f, -0.0000000000f}, { 0.0203652799f, -0.0626778865f}, { 0.0611193477f, 0.0444058054f}, { -0.0673165844f, 0.0489083614f}, { -0.0273032826f, -0.0840308634f}, { 0.0906283998f, 0.0000000000f}, { -0.0277701685f, 0.0854677905f}, { -0.0696746964f, -0.0506216301f}, { 0.0644481108f, -0.0468242934f}, { 0.0219201814f, 0.0674633814f}, { -0.0605367479f, 0.0000000000f}, { 0.0151893226f, -0.0467479280f}, { 0.0303413603f, 0.0220442886f}, { -0.0212576375f, 0.0154445777f}, { -0.0049665736f, -0.0152855418f}, { 0.0073652682f, -0.0000000000f}, { -0.0001443174f, 0.0004441633f}, { 0.0036280332f, 0.0026359204f}, { -0.0060844136f, 0.0044205852f}, { -0.0027263376f, -0.0083908043f}, { 0.0086874779f, -0.0000000000f}, { -0.0023138848f, 0.0071214052f}, { -0.0045521393f, -0.0033073228f}, { 0.0028267925f, -0.0020537850f} }, { { 0.0021104569f, 0.0015333367f}, /* Filter 4 */ { -0.0038429461f, 0.0027920638f}, { -0.0020919492f, -0.0064383577f}, { 0.0082940836f, 0.0000000000f}, { -0.0027566735f, 0.0084841685f}, { -0.0066817710f, -0.0048545908f}, { 0.0048339281f, -0.0035120543f}, { 0.0005669188f, 0.0017447968f}, { 0.0042592917f, 0.0000000000f}, { -0.0037825593f, 0.0116415204f}, { -0.0176926866f, -0.0128544893f}, { 0.0264850193f, -0.0192424929f}, { 0.0136867395f, 0.0421234528f}, { -0.0558722880f, -0.0000000000f}, { 0.0206323398f, -0.0634998126f}, { 0.0617037492f, 0.0448303979f}, { -0.0677462761f, 0.0492205507f}, { -0.0273968587f, -0.0843188611f}, { 0.0906815023f, 0.0000000000f}, { -0.0277082472f, 0.0852772163f}, { -0.0693189956f, -0.0503631983f}, { 0.0639238157f, -0.0464433707f}, { 0.0216693433f, 0.0666913811f}, { -0.0596159016f, 0.0000000000f}, { 0.0148894283f, -0.0458249485f}, { 0.0295640577f, 0.0214795452f}, { -0.0205320145f, 0.0149173817f}, { -0.0047230166f, -0.0145359503f}, { 0.0067182711f, -0.0000000000f}, { 0.0000063691f, -0.0000196020f}, { 0.0038906329f, 0.0028267103f}, { -0.0062229939f, 0.0045212697f}, { -0.0027383462f, -0.0084277630f}, { 0.0086226877f, -0.0000000000f}, { -0.0022720426f, 0.0069926280f}, { -0.0044126151f, -0.0032059525f}, { 0.0026821236f, -0.0019486769f} }, { { 0.0022520511f, 0.0016362109f}, /* Filter 5 */ { -0.0039867608f, 0.0028965513f}, { -0.0021387368f, -0.0065823550f}, { 0.0083861837f, 0.0000000000f}, { -0.0027564187f, 0.0084833845f}, { -0.0065811535f, -0.0047814879f}, { 0.0046140353f, -0.0033522929f}, { 0.0004331162f, 0.0013329947f}, { 0.0048544647f, 0.0000000000f}, { -0.0040124783f, 0.0123491384f}, { -0.0183925599f, -0.0133629770f}, { 0.0272496551f, -0.0197980333f}, { 0.0139876244f, 0.0430494814f}, { -0.0568163868f, -0.0000000000f}, { 0.0208963983f, -0.0643125010f}, { 0.0622766679f, 0.0452466478f}, { -0.0681615641f, 0.0495222751f}, { -0.0274841848f, -0.0845876231f}, { 0.0907133744f, 0.0000000000f}, { -0.0276399183f, 0.0850669216f}, { -0.0689481154f, -0.0500937381f}, { 0.0633869663f, -0.0460533268f}, { 0.0214150209f, 0.0659086572f}, { -0.0586886174f, 0.0000000000f}, { 0.0145890956f, -0.0449006193f}, { 0.0287894729f, 0.0209167764f}, { -0.0198124637f, 0.0143945974f}, { -0.0044827709f, -0.0137965502f}, { 0.0060840594f, -0.0000000000f}, { 0.0001528399f, -0.0004703930f}, { 0.0041424574f, 0.0030096715f}, { -0.0063518949f, 0.0046149218f}, { -0.0027473198f, -0.0084553808f}, { 0.0085507200f, -0.0000000000f}, { -0.0022288557f, 0.0068597125f}, { -0.0042717636f, -0.0031036179f}, { 0.0025380184f, -0.0018439783f} }, { { 0.0023946154f, 0.0017397900f}, /* Filter 6 */ { -0.0041297560f, 0.0030004433f}, { -0.0021843964f, -0.0067228808f}, { 0.0084718067f, 0.0000000000f}, { -0.0027533229f, 0.0084738564f}, { -0.0064712394f, -0.0047016307f}, { 0.0043835688f, -0.0031848491f}, { 0.0002950896f, 0.0009081924f}, { 0.0054627541f, 0.0000000000f}, { -0.0042459030f, 0.0130675456f}, { -0.0190992307f, -0.0138764034f}, { 0.0280179056f, -0.0203562000f}, { 0.0142884518f, 0.0439753330f}, { -0.0577553021f, -0.0000000000f}, { 0.0211573322f, -0.0651155730f}, { 0.0628378285f, 0.0456543548f}, { -0.0685622430f, 0.0498133853f}, { -0.0275652180f, -0.0848370177f}, { 0.0907240049f, 0.0000000000f}, { -0.0275652180f, 0.0848370177f}, { -0.0685622430f, -0.0498133853f}, { 0.0628378285f, -0.0456543548f}, { 0.0211573322f, 0.0651155730f}, { -0.0577553021f, 0.0000000000f}, { 0.0142884518f, -0.0439753330f}, { 0.0280179056f, 0.0203562000f}, { -0.0190992307f, 0.0138764034f}, { -0.0042459030f, -0.0130675456f}, { 0.0054627541f, -0.0000000000f}, { 0.0002950896f, -0.0009081924f}, { 0.0043835688f, 0.0031848491f}, { -0.0064712394f, 0.0047016307f}, { -0.0027533229f, -0.0084738564f}, { 0.0084718067f, -0.0000000000f}, { -0.0021843964f, 0.0067228808f}, { -0.0041297560f, -0.0030004433f}, { 0.0023946154f, -0.0017397900f} }, { { 0.0025380184f, 0.0018439783f}, /* Filter 7 */ { -0.0042717636f, 0.0031036179f}, { -0.0022288557f, -0.0068597125f}, { 0.0085507200f, 0.0000000000f}, { -0.0027473198f, 0.0084553808f}, { -0.0063518949f, -0.0046149218f}, { 0.0041424574f, -0.0030096715f}, { 0.0001528399f, 0.0004703930f}, { 0.0060840594f, 0.0000000000f}, { -0.0044827709f, 0.0137965502f}, { -0.0198124637f, -0.0143945974f}, { 0.0287894729f, -0.0209167764f}, { 0.0145890956f, 0.0449006193f}, { -0.0586886174f, -0.0000000000f}, { 0.0214150209f, -0.0659086573f}, { 0.0633869663f, 0.0460533268f}, { -0.0689481154f, 0.0500937381f}, { -0.0276399183f, -0.0850669216f}, { 0.0907133744f, 0.0000000000f}, { -0.0274841848f, 0.0845876231f}, { -0.0681615641f, -0.0495222751f}, { 0.0622766679f, -0.0452466478f}, { 0.0208963983f, 0.0643125010f}, { -0.0568163868f, 0.0000000000f}, { 0.0139876244f, -0.0430494814f}, { 0.0272496551f, 0.0197980333f}, { -0.0183925599f, 0.0133629770f}, { -0.0040124783f, -0.0123491384f}, { 0.0048544647f, -0.0000000000f}, { 0.0004331162f, -0.0013329947f}, { 0.0046140353f, 0.0033522929f}, { -0.0065811535f, 0.0047814879f}, { -0.0027564187f, -0.0084833845f}, { 0.0083861837f, -0.0000000000f}, { -0.0021387368f, 0.0065823550f}, { -0.0039867608f, -0.0028965513f}, { 0.0022520511f, -0.0016362109f} }, { { 0.0026821236f, 0.0019486769f}, /* Filter 8 */ { -0.0044126151f, 0.0032059525f}, { -0.0022720426f, -0.0069926280f}, { 0.0086226877f, 0.0000000000f}, { -0.0027383462f, 0.0084277630f}, { -0.0062229939f, -0.0045212697f}, { 0.0038906329f, -0.0028267103f}, { 0.0000063691f, 0.0000196020f}, { 0.0067182711f, 0.0000000000f}, { -0.0047230166f, 0.0145359503f}, { -0.0205320145f, -0.0149173817f}, { 0.0295640577f, -0.0214795452f}, { 0.0148894283f, 0.0458249485f}, { -0.0596159016f, -0.0000000000f}, { 0.0216693433f, -0.0666913811f}, { 0.0639238157f, 0.0464433707f}, { -0.0693189956f, 0.0503631983f}, { -0.0277082472f, -0.0852772163f}, { 0.0906815023f, 0.0000000000f}, { -0.0273968587f, 0.0843188611f}, { -0.0677462761f, -0.0492205507f}, { 0.0617037492f, -0.0448303979f}, { 0.0206323398f, 0.0634998126f}, { -0.0558722880f, 0.0000000000f}, { 0.0136867395f, -0.0421234528f}, { 0.0264850193f, 0.0192424929f}, { -0.0176926866f, 0.0128544893f}, { -0.0037825593f, -0.0116415204f}, { 0.0042592917f, -0.0000000000f}, { 0.0005669188f, -0.0017447968f}, { 0.0048339281f, 0.0035120543f}, { -0.0066817710f, 0.0048545908f}, { -0.0027566735f, -0.0084841685f}, { 0.0082940836f, -0.0000000000f}, { -0.0020919492f, 0.0064383577f}, { -0.0038429461f, -0.0027920638f}, { 0.0021104569f, -0.0015333367f} }, { { 0.0028267925f, 0.0020537850f}, /* Filter 9 */ { -0.0045521393f, 0.0033073228f}, { -0.0023138848f, -0.0071214052f}, { 0.0086874779f, 0.0000000000f}, { -0.0027263376f, 0.0083908043f}, { -0.0060844136f, -0.0044205852f}, { 0.0036280332f, -0.0026359204f}, { -0.0001443174f, -0.0004441633f}, { 0.0073652682f, 0.0000000000f}, { -0.0049665736f, 0.0152855418f}, { -0.0212576375f, -0.0154445777f}, { 0.0303413603f, -0.0220442886f}, { 0.0151893226f, 0.0467479280f}, { -0.0605367479f, -0.0000000000f}, { 0.0219201814f, -0.0674633814f}, { 0.0644481108f, 0.0468242934f}, { -0.0696746964f, 0.0506216301f}, { -0.0277701685f, -0.0854677905f}, { 0.0906283998f, 0.0000000000f}, { -0.0273032826f, 0.0840308634f}, { -0.0673165844f, -0.0489083614f}, { 0.0611193477f, -0.0444058054f}, { 0.0203652799f, 0.0626778865f}, { -0.0549234238f, 0.0000000000f}, { 0.0133859229f, -0.0411976344f}, { 0.0257242871f, 0.0186897886f}, { -0.0169998438f, 0.0123511095f}, { -0.0035562061f, -0.0109448771f}, { 0.0036773273f, -0.0000000000f}, { 0.0006965003f, -0.0021436074f}, { 0.0050433272f, 0.0036641917f}, { -0.0067732266f, 0.0049210372f}, { -0.0027541532f, -0.0084764120f}, { 0.0081957427f, -0.0000000000f}, { -0.0020441043f, 0.0062911061f}, { -0.0036984773f, -0.0026871011f}, { 0.0019699621f, -0.0014312612f} }, { { 0.0029718837f, 0.0021591999f}, /* Filter 10 */ { -0.0046901610f, 0.0034076014f}, { -0.0023543099f, -0.0072458207f}, { 0.0087448582f, 0.0000000000f}, { -0.0027112317f, 0.0083443130f}, { -0.0059360333f, -0.0043127806f}, { 0.0033546046f, -0.0024372629f}, { -0.0002992118f, -0.0009208793f}, { 0.0080249289f, 0.0000000000f}, { -0.0052133718f, 0.0160451085f}, { -0.0219890738f, -0.0159759973f}, { 0.0311210713f, -0.0226107818f}, { 0.0154886502f, 0.0476691639f}, { -0.0614507444f, -0.0000000000f}, { 0.0221674156f, -0.0682242900f}, { 0.0649596031f, 0.0471959142f}, { -0.0700150468f, 0.0508689091f}, { -0.0278256577f, -0.0856385688f}, { 0.0905540931f, 0.0000000000f}, { -0.0272035008f, 0.0837237667f}, { -0.0668726942f, -0.0485858563f}, { 0.0605237437f, -0.0439730737f}, { 0.0200953432f, 0.0618471068f}, { -0.0539702141f, 0.0000000000f}, { 0.0130852984f, -0.0402724075f}, { 0.0249677455f, 0.0181401289f}, { -0.0163142578f, 0.0118530021f}, { -0.0033334754f, -0.0102593823f}, { 0.0031086542f, -0.0000000000f}, { 0.0008218653f, -0.0025294414f}, { 0.0052423164f, 0.0038087658f}, { -0.0068556597f, 0.0049809284f}, { -0.0027489254f, -0.0084603224f}, { 0.0080913986f, -0.0000000000f}, { -0.0019952730f, 0.0061408189f}, { -0.0035535150f, -0.0025817797f}, { 0.0018306919f, -0.0013300756f} }, { { 0.0031172501f, 0.0022648148f}, /* Filter 11 */ { -0.0048265064f, 0.0035066621f}, { -0.0023932450f, -0.0073656508f}, { 0.0087945988f, 0.0000000000f}, { -0.0026929678f, 0.0082881026f}, { -0.0057777402f, -0.0041977740f}, { 0.0030702935f, -0.0022306988f}, { -0.0004583041f, -0.0014105150f}, { 0.0086971142f, 0.0000000000f}, { -0.0054633388f, 0.0168144279f}, { -0.0227260712f, -0.0165114572f}, { 0.0319028797f, -0.0231787989f}, { 0.0157872820f, 0.0485882579f}, { -0.0623574663f, -0.0000000000f}, { 0.0224109291f, -0.0689737474f}, { 0.0654580487f, 0.0475580562f}, { -0.0703398778f, 0.0511049127f}, { -0.0278746829f, -0.0857894527f}, { 0.0904586247f, 0.0000000000f}, { -0.0270975664f, 0.0833977341f}, { -0.0664148260f, -0.0482531955f}, { 0.0599172158f, -0.0435324055f}, { 0.0198226534f, 0.0610078541f}, { -0.0530130803f, 0.0000000000f}, { 0.0127849906f, -0.0393481552f}, { 0.0242156763f, 0.0175937187f}, { -0.0156361472f, 0.0113603260f}, { -0.0031144226f, -0.0095852072f}, { 0.0025533503f, -0.0000000000f}, { 0.0009430216f, -0.0029023221f}, { 0.0054309843f, 0.0039458410f}, { -0.0069292139f, 0.0050343686f}, { -0.0027410584f, -0.0084361101f}, { 0.0079812854f, -0.0000000000f}, { -0.0019455259f, 0.0059877130f}, { -0.0034082187f, -0.0024762158f}, { 0.0016927688f, -0.0012298685f} } }; iaxmodem-1.2.0/lib/spandsp/src/v29rx_floating_rrc.h0000644000175000017500000016756511150047216021575 0ustar julienjulien#define RX_PULSESHAPER_GAIN 1.000000f #define RX_PULSESHAPER_COEFF_SETS 48 static const complexf_t rx_pulseshaper[RX_PULSESHAPER_COEFF_SETS][27] = { { { -0.0002255872f, -0.0028663575f}, /* Filter 0 */ { 0.0010772212f, -0.0003500104f}, { -0.0020489447f, -0.0033435739f}, { 0.0027904154f, -0.0027904154f}, { -0.0024613384f, -0.0015083101f}, { 0.0016519063f, -0.0050840449f}, { -0.0046141775f, -0.0003631436f}, { -0.0019967001f, -0.0126066685f}, { -0.0042213211f, 0.0017485284f}, { -0.0233976901f, -0.0322041576f}, { 0.0257378164f, -0.0301351111f}, { -0.0418758474f, -0.0213368100f}, { 0.0466891744f, -0.1944744073f}, { 0.3227157380f, 0.0000000000f}, { 0.0753364929f, 0.3137990765f}, { -0.1782016926f, 0.0907982975f}, { -0.0305229947f, -0.0357378350f}, { -0.0232941017f, 0.0320615804f}, { -0.0367764365f, -0.0152332987f}, { 0.0007147686f, -0.0045128715f}, { -0.0127244656f, 0.0010014372f}, { -0.0014302683f, -0.0044019132f}, { -0.0045579424f, 0.0027931107f}, { -0.0020412235f, -0.0020412235f}, { -0.0020619065f, 0.0033647255f}, { -0.0037295073f, -0.0012117904f}, { -0.0000888673f, 0.0011291658f} }, { { -0.0002275045f, -0.0028907191f}, /* Filter 1 */ { 0.0009871039f, -0.0003207295f}, { -0.0020910004f, -0.0034122025f}, { 0.0027251726f, -0.0027251726f}, { -0.0025870146f, -0.0015853246f}, { 0.0016252861f, -0.0050021163f}, { -0.0048916464f, -0.0003849809f}, { -0.0019896284f, -0.0125620192f}, { -0.0048397188f, 0.0020046772f}, { -0.0237455028f, -0.0326828808f}, { 0.0251964799f, -0.0295012876f}, { -0.0443225478f, -0.0225834661f}, { 0.0474524780f, -0.1976537959f}, { 0.3241661780f, 0.0000000000f}, { 0.0749845580f, 0.3123331620f}, { -0.1752765433f, 0.0893078595f}, { -0.0287604570f, -0.0336741686f}, { -0.0237602556f, 0.0327031863f}, { -0.0362156056f, -0.0150009950f}, { 0.0006115934f, -0.0038614490f}, { -0.0127572528f, 0.0010040176f}, { -0.0013441756f, -0.0041369471f}, { -0.0046259384f, 0.0028347787f}, { -0.0019355976f, -0.0019355976f}, { -0.0021082375f, 0.0034403309f}, { -0.0036506231f, -0.0011861593f}, { -0.0000961620f, 0.0012218546f} }, { { -0.0002292356f, -0.0029127149f}, /* Filter 2 */ { 0.0008953512f, -0.0002909172f}, { -0.0021317304f, -0.0034786678f}, { 0.0026574255f, -0.0026574255f}, { -0.0027108763f, -0.0016612271f}, { 0.0015966923f, -0.0049141135f}, { -0.0051685871f, -0.0004067766f}, { -0.0019806027f, -0.0125050331f}, { -0.0054668817f, 0.0022644566f}, { -0.0240839365f, -0.0331486948f}, { 0.0246287071f, -0.0288365110f}, { -0.0467972792f, -0.0238444047f}, { 0.0482124309f, -0.2008192272f}, { 0.3255589646f, 0.0000000000f}, { 0.0746194196f, 0.3108122511f}, { -0.1723405821f, 0.0878119126f}, { -0.0270191676f, -0.0316353806f}, { -0.0242027907f, 0.0333122836f}, { -0.0356412303f, -0.0147630810f}, { 0.0005100000f, -0.0032200134f}, { -0.0127779299f, 0.0010056449f}, { -0.0012580756f, -0.0038719586f}, { -0.0046884762f, 0.0028731019f}, { -0.0018286776f, -0.0018286776f}, { -0.0021526634f, 0.0035128275f}, { -0.0035694823f, -0.0011597951f}, { -0.0001033121f, 0.0013127044f} }, { { -0.0002307776f, -0.0029323077f}, /* Filter 3 */ { 0.0008020327f, -0.0002605962f}, { -0.0021710931f, -0.0035429020f}, { 0.0025872148f, -0.0025872148f}, { -0.0028327978f, -0.0017359407f}, { 0.0015661291f, -0.0048200496f}, { -0.0054447492f, -0.0004285111f}, { -0.0019695990f, -0.0124355589f}, { -0.0061025091f, 0.0025277420f}, { -0.0244126095f, -0.0336010744f}, { 0.0240343336f, -0.0281405891f}, { -0.0492994388f, -0.0251193187f}, { 0.0489687748f, -0.2039696262f}, { 0.3268935535f, 0.0000000000f}, { 0.0742412161f, 0.3092369205f}, { -0.1693947992f, 0.0863109612f}, { -0.0252995186f, -0.0296219304f}, { -0.0246218736f, 0.0338891017f}, { -0.0350539120f, -0.0145198058f}, { 0.0004100342f, -0.0025888544f}, { -0.0127866782f, 0.0010063334f}, { -0.0011720449f, -0.0036071832f}, { -0.0047455578f, 0.0029080816f}, { -0.0017205660f, -0.0017205660f}, { -0.0021951585f, 0.0035821731f}, { -0.0034861718f, -0.0011327259f}, { -0.0001103122f, 0.0014016500f} }, { { -0.0002321276f, -0.0029494611f}, /* Filter 4 */ { 0.0007072103f, -0.0002297865f}, { -0.0022090444f, -0.0036048329f}, { 0.0025145856f, -0.0025145856f}, { -0.0029526533f, -0.0018093883f}, { 0.0015336029f, -0.0047199445f}, { -0.0057198731f, -0.0004501638f}, { -0.0019565932f, -0.0123534430f}, { -0.0067462847f, 0.0027944026f}, { -0.0247311428f, -0.0340394978f}, { 0.0234132130f, -0.0274133503f}, { -0.0518284449f, -0.0264079117f}, { 0.0497212515f, -0.2071039176f}, { 0.3281694617f, 0.0000000000f}, { 0.0738500836f, 0.3076077361f}, { -0.1664401728f, 0.0848055039f}, { -0.0236018860f, -0.0276342580f}, { -0.0250176852f, 0.0344338896f}, { -0.0344542448f, -0.0142714155f}, { 0.0003117406f, -0.0019682529f}, { -0.0127836805f, 0.0010060975f}, { -0.0010861574f, -0.0033428487f}, { -0.0047971886f, 0.0029397209f}, { -0.0016113720f, -0.0016113720f}, { -0.0022357000f, 0.0036483309f}, { -0.0034007733f, -0.0011049782f}, { -0.0001171583f, 0.0014886367f} }, { { -0.0002332832f, -0.0029641442f}, /* Filter 5 */ { 0.0006109549f, -0.0001985113f}, { -0.0022455442f, -0.0036643951f}, { 0.0024395825f, -0.0024395825f}, { -0.0030703178f, -0.0018814932f}, { 0.0014991220f, -0.0046138230f}, { -0.0059936966f, -0.0004717142f}, { -0.0019415623f, -0.0122585417f}, { -0.0073978880f, 0.0030643056f}, { -0.0250391496f, -0.0344634328f}, { 0.0227652173f, -0.0266546448f}, { -0.0543836682f, -0.0277098630f}, { 0.0504696014f, -0.2102210189f}, { 0.3293862057f, 0.0000000000f}, { 0.0734461719f, 0.3059253229f}, { -0.1634776964f, 0.0832960468f}, { -0.0219266458f, -0.0256728037f}, { -0.0253904152f, 0.0349469084f}, { -0.0338428277f, -0.0140181582f}, { 0.0002151614f, -0.0013584756f}, { -0.0127691311f, 0.0010049524f}, { -0.0010004881f, -0.0030791857f}, { -0.0048433801f, 0.0029680271f}, { -0.0015011959f, -0.0015011959f}, { -0.0022742667f, 0.0037112660f}, { -0.0033133678f, -0.0010765785f}, { -0.0001238455f, 0.0015736058f} }, { { -0.0002342418f, -0.0029763241f}, /* Filter 6 */ { 0.0005133336f, -0.0001667922f}, { -0.0022805536f, -0.0037215252f}, { 0.0023622545f, -0.0023622545f}, { -0.0031856701f, -0.0019521811f}, { 0.0014626959f, -0.0045017152f}, { -0.0062659606f, -0.0004931418f}, { -0.0019244846f, -0.0121507178f}, { -0.0080569843f, 0.0033373122f}, { -0.0253362547f, -0.0348723628f}, { 0.0220902122f, -0.0258643154f}, { -0.0569644843f, -0.0290248545f}, { 0.0512135691f, -0.2133198677f}, { 0.3305433046f, 0.0000000000f}, { 0.0730296300f, 0.3041903010f}, { -0.1605083564f, 0.0817830924f}, { -0.0202741482f, -0.0237379776f}, { -0.0257402535f, 0.0354284196f}, { -0.0332202557f, -0.0137602804f}, { 0.0001203382f, -0.0007597857f}, { -0.0127432290f, 0.0010029139f}, { -0.0009151099f, -0.0028164188f}, { -0.0048841463f, 0.0029930087f}, { -0.0013901463f, -0.0013901463f}, { -0.0023108391f, 0.0037709467f}, { -0.0032240442f, -0.0010475555f}, { -0.0001303693f, 0.0016564989f} }, { { -0.0002350011f, -0.0029859721f}, /* Filter 7 */ { 0.0004144205f, -0.0001346534f}, { -0.0023140327f, -0.0037761582f}, { 0.0022826512f, -0.0022826512f}, { -0.0032985844f, -0.0020213751f}, { 0.0014243364f, -0.0043836566f}, { -0.0065363981f, -0.0005144257f}, { -0.0019053410f, -0.0120298496f}, { -0.0087232308f, 0.0036132805f}, { -0.0256220747f, -0.0352657604f}, { 0.0213880887f, -0.0250422344f}, { -0.0595702454f, -0.0303525561f}, { 0.0519528957f, -0.2163993844f}, { 0.3316403995f, 0.0000000000f}, { 0.0726006106f, 0.3024033067f}, { -0.1575331331f, 0.0802671405f}, { -0.0186447416f, -0.0218301876f}, { -0.0260674081f, 0.0358787093f}, { -0.0325871180f, -0.0134980262f}, { 0.0000273092f, -0.0001724233f}, { -0.0127061747f, 0.0009999976f}, { -0.0008300950f, -0.0025547698f}, { -0.0049195054f, 0.0030146768f}, { -0.0012783271f, -0.0012783271f}, { -0.0023454000f, 0.0038273449f}, { -0.0031328855f, -0.0010179362f}, { -0.0001367258f, 0.0017372664f} }, { { -0.0002355590f, -0.0029930609f}, /* Filter 8 */ { 0.0003142843f, -0.0001021172f}, { -0.0023459445f, -0.0038282335f}, { 0.0022008259f, -0.0022008259f}, { -0.0034089378f, -0.0020889998f}, { 0.0013840565f, -0.0042596878f}, { -0.0068047424f, -0.0005355448f}, { -0.0018841113f, -0.0118958109f}, { -0.0093962743f, 0.0038920642f}, { -0.0258962331f, -0.0356431071f}, { 0.0206587490f, -0.0241882872f}, { -0.0622002845f, -0.0316926279f}, { 0.0526873296f, -0.2194585217f}, { 0.3326769857f, 0.0000000000f}, { 0.0721592734f, 0.3005650049f}, { -0.1545530146f, 0.0787486942f}, { -0.0170387579f, -0.0199498223f}, { -0.0263720939f, 0.0362980733f}, { -0.0319440023f, -0.0132316390f}, { -0.0000638882f, 0.0004033739f}, { -0.0126581845f, 0.0009962207f}, { -0.0007455134f, -0.0022944544f}, { -0.0049494845f, 0.0030330480f}, { -0.0011658419f, -0.0011658419f}, { -0.0023779327f, 0.0038804334f}, { -0.0030399798f, -0.0009877493f}, { -0.0001429107f, 0.0018158530f} }, { { -0.0002359134f, -0.0029975637f}, /* Filter 9 */ { 0.0002129997f, -0.0000692078f}, { -0.0023762496f, -0.0038776870f}, { 0.0021168342f, -0.0021168342f}, { -0.0035166109f, -0.0021549819f}, { 0.0013418720f, -0.0041298574f}, { -0.0070707263f, -0.0005564782f}, { -0.0018607775f, -0.0117484865f}, { -0.0100757513f, 0.0041735128f}, { -0.0261583498f, -0.0360038798f}, { 0.0199020969f, -0.0233023615f}, { -0.0648539333f, -0.0330447295f}, { 0.0534166146f, -0.2224962126f}, { 0.3336527424f, 0.0000000000f}, { 0.0717057869f, 0.2986760977f}, { -0.1515689653f, 0.0772282452f}, { -0.0154565158f, -0.0180972548f}, { -0.0266545289f, 0.0366868117f}, { -0.0312914991f, -0.0129613633f}, { -0.0001532180f, 0.0009673802f}, { -0.0125994670f, 0.0009915996f}, { -0.0006614353f, -0.0020356887f}, { -0.0049741065f, 0.0030481364f}, { -0.0010527980f, -0.0010527980f}, { -0.0024084239f, 0.0039301906f}, { -0.0029454189f, -0.0009570246f}, { -0.0001489206f, 0.0018922157f} }, { { -0.0002360624f, -0.0029994575f}, /* Filter 10 */ { 0.0001106457f, -0.0000359510f}, { -0.0024049153f, -0.0039244652f}, { 0.0020307330f, -0.0020307330f}, { -0.0036214854f, -0.0022192491f}, { 0.0012977996f, -0.0039942164f}, { -0.0073340784f, -0.0005772045f}, { -0.0018353240f, -0.0115877798f}, { -0.0107612899f, 0.0044574722f}, { -0.0264080456f, -0.0363475566f}, { 0.0191180538f, -0.0223843650f}, { -0.0675304887f, -0.0344085026f}, { 0.0541404956f, -0.2255113940f}, { 0.3345672589f, 0.0000000000f}, { 0.0712403148f, 0.2967372670f}, { -0.1485819667f, 0.0757062934f}, { -0.0138983208f, -0.0162728428f}, { -0.0269149412f, 0.0370452384f}, { -0.0306301910f, -0.0126874405f}, { -0.0002406474f, 0.0015193877f}, { -0.0125302396f, 0.0009861512f}, { -0.0005779288f, -0.0017786820f}, { -0.0049934088f, 0.0030599648f}, { -0.0009392972f, -0.0009392972f}, { -0.0024368605f, 0.0039765949f}, { -0.0028492882f, -0.0009257899f}, { -0.0001547513f, 0.0019663015f} }, { { -0.0002360044f, -0.0029987207f}, /* Filter 11 */ { 0.0000072962f, -0.0000023707f}, { -0.0024319051f, -0.0039685085f}, { 0.0019425826f, -0.0019425826f}, { -0.0037234402f, -0.0022817271f}, { 0.0012518575f, -0.0038528212f}, { -0.0075945285f, -0.0005977024f}, { -0.0018077349f, -0.0114135888f}, { -0.0114525069f, 0.0047437837f}, { -0.0266449530f, -0.0366736316f}, { 0.0183065518f, -0.0214342183f}, { -0.0702292589f, -0.0357835947f}, { 0.0548587201f, -0.2285030143f}, { 0.3354202137f, 0.0000000000f}, { 0.0707630243f, 0.2947492090f}, { -0.1455930052f, 0.0741833414f}, { -0.0123644684f, -0.0144769324f}, { -0.0271535702f, 0.0373736831f}, { -0.0299606569f, -0.0124101104f}, { -0.0003261437f, 0.0020591900f}, { -0.0124507320f, 0.0009798939f}, { -0.0004950602f, -0.0015236388f}, { -0.0050074246f, 0.0030685537f}, { -0.0008254433f, -0.0008254433f}, { -0.0024632328f, 0.0040196306f}, { -0.0027516756f, -0.0008940736f}, { -0.0001603995f, 0.0020380694f} }, { { -0.0002357379f, -0.0029953343f}, /* Filter 12 */ { -0.0000969713f, 0.0000315079f}, { -0.0024571849f, -0.0040097613f}, { 0.0018524437f, -0.0018524437f}, { -0.0038223595f, -0.0023423449f}, { 0.0012040677f, -0.0037057392f}, { -0.0078518000f, -0.0006179501f}, { -0.0017779973f, -0.0112258334f}, { -0.0121490133f, 0.0050322861f}, { -0.0268686949f, -0.0369815859f}, { 0.0174675392f, -0.0204518607f}, { -0.0729495201f, -0.0371696370f}, { 0.0555710382f, -0.2314700325f}, { 0.3362112915f, 0.0000000000f}, { 0.0702740993f, 0.2927126894f}, { -0.1426030329f, 0.0726598745f}, { -0.0108552443f, -0.0127098581f}, { -0.0273706579f, 0.0376724787f}, { -0.0292834752f, -0.0121296126f}, { -0.0004096775f, 0.0025866021f}, { -0.0123611702f, 0.0009728452f}, { -0.0004128962f, -0.0012707638f}, { -0.0050161963f, 0.0030739290f}, { -0.0007113378f, -0.0007113378f}, { -0.0024875330f, 0.0040592849f}, { -0.0026526758f, -0.0008619066f}, { -0.0001658620f, 0.0021074766f} }, { { -0.0002352615f, -0.0029892802f}, /* Filter 13 */ { -0.0002020749f, 0.0000656581f}, { -0.0024807241f, -0.0040481738f}, { 0.0017603822f, -0.0017603822f}, { -0.0039181269f, -0.0024010313f}, { 0.0011544503f, -0.0035530327f}, { -0.0081056228f, -0.0006379263f}, { -0.0017460976f, -0.0110244264f}, { -0.0128504066f, 0.0053228127f}, { -0.0270788976f, -0.0372709051f}, { 0.0166009646f, -0.0194372322f}, { -0.0756905423f, -0.0385662576f}, { 0.0562772022f, -0.2344114175f}, { 0.3369401960f, 0.0000000000f}, { 0.0697737216f, 0.2906284665f}, { -0.1396130136f, 0.0711363835f}, { -0.0093709121f, -0.0109719283f}, { -0.0275664600f, 0.0379419771f}, { -0.0285992217f, -0.0118461855f}, { -0.0004912199f, 0.0031014405f}, { -0.0122617888f, 0.0009650237f}, { -0.0003314995f, -0.0010202504f}, { -0.0050197673f, 0.0030761174f}, { -0.0005970840f, -0.0005970840f}, { -0.0025097527f, 0.0040955442f}, { -0.0025523730f, -0.0008293163f}, { -0.0001711354f, 0.0021744821f} }, { { -0.0002345739f, -0.0029805445f}, /* Filter 14 */ { -0.0003079322f, 0.0001000532f}, { -0.0025024909f, -0.0040836940f}, { 0.0016664628f, -0.0016664628f}, { -0.0040106281f, -0.0024577161f}, { 0.0011030318f, -0.0033947827f}, { -0.0083557204f, -0.0006576095f}, { -0.0017120255f, -0.0108093037f}, { -0.0135562762f, 0.0056151934f}, { -0.0272751934f, -0.0375410830f}, { 0.0157068004f, -0.0183903004f}, { -0.0784515724f, -0.0399730727f}, { 0.0569769519f, -0.2373260846f}, { 0.3376066341f, 0.0000000000f}, { 0.0692620702f, 0.2884972851f}, { -0.1366239180f, 0.0696133632f}, { -0.0079117353f, -0.0092634518f}, { -0.0277412306f, 0.0381825282f}, { -0.0279084621f, -0.0115600635f}, { -0.0005707451f, 0.0036035431f}, { -0.0121528275f, 0.0009564483f}, { -0.0002509341f, -0.0007722959f}, { -0.0050181849f, 0.0030751477f}, { -0.0004827837f, -0.0004827837f}, { -0.0025298884f, 0.0041284027f}, { -0.0024508655f, -0.0007963345f}, { -0.0001762169f, 0.0022390484f} }, { { -0.0002336743f, -0.0029691137f}, /* Filter 15 */ { -0.0004144665f, 0.0001346683f}, { -0.0025224541f, -0.0041162709f}, { 0.0015707543f, -0.0015707543f}, { -0.0040997524f, -0.0025123315f}, { 0.0010498359f, -0.0032310628f}, { -0.0086018170f, -0.0006769777f}, { -0.0016757712f, -0.0105804032f}, { -0.0142662044f, 0.0059092553f}, { -0.0274572178f, -0.0377916182f}, { 0.0147850271f, -0.0173110425f}, { -0.0812318644f, -0.0413897022f}, { 0.0576700502f, -0.2402130469f}, { 0.3382103275f, 0.0000000000f}, { 0.0687393345f, 0.2863199341f}, { -0.1336366907f, 0.0680912949f}, { -0.0064779557f, -0.0075847116f}, { -0.0278952373f, 0.0383945004f}, { -0.0272117582f, -0.0112714793f}, { -0.0006482276f, 0.0040927478f}, { -0.0120345250f, 0.0009471377f}, { -0.0001712606f, -0.0005270858f}, { -0.0050115039f, 0.0030710535f}, { -0.0003685390f, -0.0003685390f}, { -0.0025479356f, 0.0041578530f}, { -0.0023482397f, -0.0007629893f}, { -0.0001811037f, 0.0023011405f} }, { { -0.0002325617f, -0.0029549761f}, /* Filter 16 */ { -0.0005215883f, 0.0001694743f}, { -0.0025405864f, -0.0041458602f}, { 0.0014733283f, -0.0014733283f}, { -0.0041853880f, -0.0025648091f}, { 0.0009948916f, -0.0030619615f}, { -0.0088436386f, -0.0006960095f}, { -0.0016373263f, -0.0103376715f}, { -0.0149797642f, 0.0062048215f}, { -0.0276246022f, -0.0380220031f}, { 0.0138356301f, -0.0161994415f}, { -0.0840306457f, -0.0428157525f}, { 0.0583562562f, -0.2430713004f}, { 0.3387511245f, 0.0000000000f}, { 0.0682057069f, 0.2840972152f}, { -0.1306522782f, 0.0665706608f}, { -0.0050698048f, -0.0059359787f}, { -0.0280287578f, 0.0385782755f}, { -0.0265096776f, -0.0109806680f}, { -0.0007236441f, 0.0045689089f}, { -0.0119071307f, 0.0009371115f}, { -0.0000925386f, -0.0002848044f}, { -0.0049997803f, 0.0030638693f}, { -0.0002544469f, -0.0002544469f}, { -0.0025638940f, 0.0041838948f}, { -0.0022445889f, -0.0007293112f}, { -0.0001857931f, 0.0023607247f} }, { { -0.0002312353f, -0.0029381234f}, /* Filter 17 */ { -0.0006292185f, 0.0002044455f}, { -0.0025568618f, -0.0041724192f}, { 0.0013742551f, -0.0013742551f}, { -0.0042674275f, -0.0026150829f}, { 0.0009382281f, -0.0028875692f}, { -0.0090809063f, -0.0007146828f}, { -0.0015966847f, -0.0100810704f}, { -0.0156965162f, 0.0065017099f}, { -0.0277769912f, -0.0382317485f}, { 0.0128586169f, -0.0150555060f}, { -0.0868471324f, -0.0442508242f}, { 0.0590353166f, -0.2458997907f}, { 0.3392287675f, 0.0000000000f}, { 0.0676613773f, 0.2818299191f}, { -0.1276716186f, 0.0650519389f}, { -0.0036874988f, -0.0043175064f}, { -0.0281420647f, 0.0387342290f}, { -0.0258027739f, -0.0106878589f}, { -0.0007969746f, 0.0050318997f}, { -0.0117708870f, 0.0009263889f}, { -0.0000148270f, -0.0000456328f}, { -0.0049830706f, 0.0030536296f}, { -0.0001406071f, -0.0001406071f}, { -0.0025777636f, 0.0042065279f}, { -0.0021400055f, -0.0006953299f}, { -0.0001902827f, 0.0024177706f} }, { { -0.0002296949f, -0.0029185509f}, /* Filter 18 */ { -0.0007372681f, 0.0002395529f}, { -0.0025712503f, -0.0041958991f}, { 0.0012736106f, -0.0012736106f}, { -0.0043457630f, -0.0026630870f}, { 0.0008798771f, -0.0027079834f}, { -0.0093133450f, -0.0007329762f}, { -0.0015538410f, -0.0098105660f}, { -0.0164160198f, 0.0067997380f}, { -0.0279140251f, -0.0384203595f}, { 0.0118540046f, -0.0138792561f}, { -0.0896805216f, -0.0456945081f}, { 0.0597069972f, -0.2486975418f}, { 0.3396430866f, 0.0000000000f}, { 0.0671065597f, 0.2795189375f}, { -0.1246956673f, 0.0635356160f}, { -0.0023312476f, -0.0027295403f}, { -0.0282354500f, 0.0388627630f}, { -0.0250915936f, -0.0103932783f}, { -0.0008681988f, 0.0054815914f}, { -0.0116260558f, 0.0009149904f}, { 0.0000618176f, 0.0001902551f}, { -0.0049614426f, 0.0030403759f}, { -0.0000271166f, -0.0000271166f}, { -0.0025895460f, 0.0042257549f}, { -0.0020345799f, -0.0006610751f}, { -0.0001945702f, 0.0024722493f} }, { { -0.0002279401f, -0.0028962540f}, /* Filter 19 */ { -0.0008456543f, 0.0002747697f}, { -0.0025837316f, -0.0042162668f}, { 0.0011714716f, -0.0011714716f}, { -0.0044202915f, -0.0027087581f}, { 0.0008198714f, -0.0025233048f}, { -0.0095406775f, -0.0007508676f}, { -0.0015087910f, -0.0095261317f}, { -0.0171378180f, 0.0070987166f}, { -0.0280353473f, -0.0385873452f}, { 0.0108218242f, -0.0126707281f}, { -0.0925300161f, -0.0471463981f}, { 0.0603710541f, -0.2514635379f}, { 0.3399939607f, 0.0000000000f}, { 0.0665414417f, 0.2771650518f}, { -0.1217253322f, 0.0620221546f}, { -0.0010012477f, -0.0011723105f}, { -0.0283092030f, 0.0389642752f}, { -0.0243766792f, -0.0100971511f}, { -0.0009372986f, 0.0059178704f}, { -0.0114728855f, 0.0009029357f}, { 0.0001373402f, 0.0004226896f}, { -0.0049349593f, 0.0030241469f}, { 0.0000859258f, 0.0000859258f}, { -0.0025992464f, 0.0042415846f}, { -0.0019284058f, -0.0006265770f}, { -0.0001986536f, 0.0025241333f} }, { { -0.0002259705f, -0.0028712275f}, /* Filter 20 */ { -0.0009542871f, 0.0003100667f}, { -0.0025942816f, -0.0042334829f}, { 0.0010679155f, -0.0010679155f}, { -0.0044909097f, -0.0027520330f}, { 0.0007582451f, -0.0023336385f}, { -0.0097626270f, -0.0007683354f}, { -0.0014615333f, -0.0092277581f}, { -0.0178614493f, 0.0073984545f}, { -0.0281406040f, -0.0387322185f}, { 0.0097621099f, -0.0114299621f}, { -0.0953947966f, -0.0486060766f}, { 0.0610272510f, -0.2541967944f}, { 0.3402811755f, 0.0000000000f}, { 0.0659662416f, 0.2747691711f}, { -0.1187615389f, 0.0605120265f}, { 0.0003023311f, 0.0003539842f}, { -0.0283636203f, 0.0390391742f}, { -0.0236585774f, -0.0097997036f}, { -0.0010042585f, 0.0063406383f}, { -0.0113116356f, 0.0008902450f}, { 0.0002116873f, 0.0006515064f}, { -0.0049036953f, 0.0030049884f}, { 0.0001984275f, 0.0001984275f}, { -0.0026068687f, 0.0042540230f}, { -0.0018215759f, -0.0005918659f}, { -0.0002025310f, 0.0025734007f} }, { { -0.0002237865f, -0.0028434772f}, /* Filter 21 */ { -0.0010630796f, 0.0003454155f}, { -0.0026028786f, -0.0042475118f}, { 0.0009630217f, -0.0009630217f}, { -0.0045575184f, -0.0027928509f}, { 0.0006950360f, -0.0021391009f}, { -0.0099789231f, -0.0007853583f}, { -0.0014120671f, -0.0089154411f}, { -0.0185864475f, 0.0076987586f}, { -0.0282294528f, -0.0388545084f}, { 0.0086749174f, -0.0101570232f}, { -0.0982740298f, -0.0500731192f}, { 0.0616753532f, -0.2568963346f}, { 0.3405046930f, 0.0000000000f}, { 0.0653811602f, 0.2723321314f}, { -0.1158052202f, 0.0590057069f}, { 0.0015793088f, 0.0018491331f}, { -0.0283990101f, 0.0390878840f}, { -0.0229378136f, -0.0095011535f}, { -0.0010690639f, 0.0067498038f}, { -0.0111425708f, 0.0008769393f}, { 0.0002848063f, 0.0008765438f}, { -0.0048677212f, 0.0029829434f}, { 0.0003102929f, 0.0003102929f}, { -0.0026124209f, 0.0042630834f}, { -0.0017141812f, -0.0005569712f}, { -0.0002062007f, 0.0026200288f} }, { { -0.0002213879f, -0.0028130005f}, /* Filter 22 */ { -0.0011719437f, 0.0003807876f}, { -0.0026095012f, -0.0042583189f}, { 0.0008568735f, -0.0008568735f}, { -0.0046200208f, -0.0028311524f}, { 0.0006302820f, -0.0019398084f}, { -0.0101892831f, -0.0008019140f}, { -0.0013603937f, -0.0085891878f}, { -0.0193123302f, 0.0079994291f}, { -0.0283015482f, -0.0389537393f}, { 0.0075603134f, -0.0088519897f}, { -0.1011668788f, -0.0515470994f}, { 0.0623151315f, -0.2595612030f}, { 0.3406644084f, 0.0000000000f}, { 0.0647864110f, 0.2698548228f}, { -0.1128572498f, 0.0575036409f}, { 0.0028295415f, 0.0033129675f}, { -0.0284156811f, 0.0391108297f}, { -0.0222149183f, -0.0092017204f}, { -0.0011317024f, 0.0071452877f}, { -0.0109659520f, 0.0008630391f}, { 0.0003566476f, 0.0010976484f}, { -0.0048271153f, 0.0029580601f}, { 0.0004214283f, 0.0004214283f}, { -0.0026159113f, 0.0042687793f}, { -0.0016063144f, -0.0005219232f}, { -0.0002096613f, 0.0026639994f} }, { { -0.0002187756f, -0.0027798077f}, /* Filter 23 */ { -0.0012807894f, 0.0004161537f}, { -0.0026141320f, -0.0042658758f}, { 0.0007495544f, -0.0007495544f}, { -0.0046783235f, -0.0028668803f}, { 0.0005640234f, -0.0017358856f}, { -0.0103934397f, -0.0008179815f}, { -0.0013065154f, -0.0082490135f}, { -0.0200386163f, 0.0083002667f}, { -0.0283565494f, -0.0390294419f}, { 0.0064183775f, -0.0075149545f}, { -0.1040724930f, -0.0530275838f}, { 0.0629463524f, -0.2621904272f}, { 0.3407602619f, 0.0000000000f}, { 0.0641822150f, 0.2673381654f}, { -0.1099185532f, 0.0560063002f}, { 0.0040528797f, 0.0047453124f}, { -0.0284139469f, 0.0391084429f}, { -0.0214904145f, -0.0089016211f}, { -0.0011921632f, 0.0075270221f}, { -0.0107820433f, 0.0008485652f}, { 0.0004271619f, 0.0013146691f}, { -0.0047819563f, 0.0029303866f}, { 0.0005317429f, 0.0005317429f}, { -0.0026173521f, 0.0042711304f}, { -0.0014980664f, -0.0004867513f}, { -0.0002129114f, 0.0027052959f} }, { { -0.0002159498f, -0.0027439022f}, /* Filter 24 */ { -0.0013895273f, 0.0004514848f}, { -0.0026167546f, -0.0042701555f}, { 0.0006411480f, -0.0006411480f}, { -0.0047323313f, -0.0028999763f}, { 0.0004963023f, -0.0015274614f}, { -0.0105911158f, -0.0008335389f}, { -0.0012504366f, -0.0078949462f}, { -0.0207648111f, 0.0086010664f}, { -0.0283941279f, -0.0390811643f}, { 0.0052491967f, -0.0061460197f}, { -0.1069900047f, -0.0545141302f}, { 0.0635687875f, -0.2647830558f}, { 0.3407922346f, 0.0000000000f}, { 0.0635687875f, 0.2647830558f}, { -0.1069900047f, 0.0545141302f}, { 0.0052491967f, 0.0061460197f}, { -0.0283941279f, 0.0390811643f}, { -0.0207648111f, -0.0086010664f}, { -0.0012504366f, 0.0078949462f}, { -0.0105911158f, 0.0008335389f}, { 0.0004963023f, 0.0015274614f}, { -0.0047323313f, 0.0028999763f}, { 0.0006411480f, 0.0006411480f}, { -0.0026167546f, 0.0042701555f}, { -0.0013895273f, -0.0004514848f}, { -0.0002159498f, 0.0027439022f} }, { { -0.0002129114f, -0.0027052959f}, /* Filter 25 */ { -0.0014980664f, 0.0004867513f}, { -0.0026173521f, -0.0042711304f}, { 0.0005317429f, -0.0005317429f}, { -0.0047819563f, -0.0029303866f}, { 0.0004271619f, -0.0013146691f}, { -0.0107820433f, -0.0008485652f}, { -0.0011921632f, -0.0075270221f}, { -0.0214904145f, 0.0089016211f}, { -0.0284139469f, -0.0391084429f}, { 0.0040528797f, -0.0047453124f}, { -0.1099185532f, -0.0560063002f}, { 0.0641822150f, -0.2673381655f}, { 0.3407602619f, 0.0000000000f}, { 0.0629463524f, 0.2621904272f}, { -0.1040724930f, 0.0530275838f}, { 0.0064183775f, 0.0075149545f}, { -0.0283565494f, 0.0390294419f}, { -0.0200386164f, -0.0083002667f}, { -0.0013065154f, 0.0082490135f}, { -0.0103934397f, 0.0008179814f}, { 0.0005640234f, 0.0017358856f}, { -0.0046783235f, 0.0028668803f}, { 0.0007495544f, 0.0007495544f}, { -0.0026141320f, 0.0042658758f}, { -0.0012807894f, -0.0004161537f}, { -0.0002187756f, 0.0027798077f} }, { { -0.0002096613f, -0.0026639994f}, /* Filter 26 */ { -0.0016063144f, 0.0005219232f}, { -0.0026159113f, -0.0042687793f}, { 0.0004214283f, -0.0004214283f}, { -0.0048271153f, -0.0029580601f}, { 0.0003566476f, -0.0010976484f}, { -0.0109659520f, -0.0008630391f}, { -0.0011317024f, -0.0071452877f}, { -0.0222149182f, 0.0092017204f}, { -0.0284156811f, -0.0391108297f}, { 0.0028295415f, -0.0033129675f}, { -0.1128572498f, -0.0575036410f}, { 0.0647864110f, -0.2698548228f}, { 0.3406644084f, 0.0000000000f}, { 0.0623151315f, 0.2595612030f}, { -0.1011668788f, 0.0515470994f}, { 0.0075603134f, 0.0088519897f}, { -0.0283015482f, 0.0389537393f}, { -0.0193123302f, -0.0079994291f}, { -0.0013603937f, 0.0085891878f}, { -0.0101892831f, 0.0008019140f}, { 0.0006302820f, 0.0019398084f}, { -0.0046200208f, 0.0028311524f}, { 0.0008568735f, 0.0008568735f}, { -0.0026095012f, 0.0042583189f}, { -0.0011719437f, -0.0003807876f}, { -0.0002213879f, 0.0028130005f} }, { { -0.0002062007f, -0.0026200288f}, /* Filter 27 */ { -0.0017141812f, 0.0005569712f}, { -0.0026124209f, -0.0042630834f}, { 0.0003102929f, -0.0003102929f}, { -0.0048677212f, -0.0029829434f}, { 0.0002848063f, -0.0008765438f}, { -0.0111425708f, -0.0008769393f}, { -0.0010690639f, -0.0067498036f}, { -0.0229378136f, 0.0095011535f}, { -0.0283990101f, -0.0390878840f}, { 0.0015793088f, -0.0018491331f}, { -0.1158052202f, -0.0590057069f}, { 0.0653811602f, -0.2723321315f}, { 0.3405046930f, 0.0000000000f}, { 0.0616753532f, 0.2568963346f}, { -0.0982740298f, 0.0500731192f}, { 0.0086749174f, 0.0101570232f}, { -0.0282294527f, 0.0388545084f}, { -0.0185864475f, -0.0076987586f}, { -0.0014120671f, 0.0089154411f}, { -0.0099789231f, 0.0007853583f}, { 0.0006950360f, 0.0021391009f}, { -0.0045575184f, 0.0027928509f}, { 0.0009630217f, 0.0009630217f}, { -0.0026028786f, 0.0042475118f}, { -0.0010630796f, -0.0003454155f}, { -0.0002237865f, 0.0028434772f} }, { { -0.0002025310f, -0.0025734007f}, /* Filter 28 */ { -0.0018215759f, 0.0005918659f}, { -0.0026068687f, -0.0042540230f}, { 0.0001984275f, -0.0001984275f}, { -0.0049036953f, -0.0030049884f}, { 0.0002116873f, -0.0006515064f}, { -0.0113116356f, -0.0008902450f}, { -0.0010042585f, -0.0063406383f}, { -0.0236585774f, 0.0097997036f}, { -0.0283636203f, -0.0390391742f}, { 0.0003023310f, -0.0003539842f}, { -0.1187615389f, -0.0605120265f}, { 0.0659662416f, -0.2747691711f}, { 0.3402811755f, 0.0000000000f}, { 0.0610272510f, 0.2541967944f}, { -0.0953947966f, 0.0486060766f}, { 0.0097621099f, 0.0114299621f}, { -0.0281406040f, 0.0387322185f}, { -0.0178614493f, -0.0073984545f}, { -0.0014615333f, 0.0092277581f}, { -0.0097626270f, 0.0007683354f}, { 0.0007582451f, 0.0023336385f}, { -0.0044909097f, 0.0027520330f}, { 0.0010679155f, 0.0010679155f}, { -0.0025942816f, 0.0042334829f}, { -0.0009542871f, -0.0003100667f}, { -0.0002259705f, 0.0028712275f} }, { { -0.0001986536f, -0.0025241333f}, /* Filter 29 */ { -0.0019284058f, 0.0006265770f}, { -0.0025992464f, -0.0042415846f}, { 0.0000859258f, -0.0000859258f}, { -0.0049349593f, -0.0030241469f}, { 0.0001373402f, -0.0004226896f}, { -0.0114728855f, -0.0009029357f}, { -0.0009372986f, -0.0059178704f}, { -0.0243766792f, 0.0100971511f}, { -0.0283092030f, -0.0389642752f}, { -0.0010012477f, 0.0011723105f}, { -0.1217253322f, -0.0620221546f}, { 0.0665414417f, -0.2771650518f}, { 0.3399939607f, 0.0000000000f}, { 0.0603710541f, 0.2514635379f}, { -0.0925300161f, 0.0471463981f}, { 0.0108218242f, 0.0126707281f}, { -0.0280353473f, 0.0385873452f}, { -0.0171378180f, -0.0070987166f}, { -0.0015087910f, 0.0095261317f}, { -0.0095406775f, 0.0007508676f}, { 0.0008198714f, 0.0025233048f}, { -0.0044202915f, 0.0027087581f}, { 0.0011714716f, 0.0011714716f}, { -0.0025837316f, 0.0042162668f}, { -0.0008456543f, -0.0002747697f}, { -0.0002279401f, 0.0028962540f} }, { { -0.0001945702f, -0.0024722493f}, /* Filter 30 */ { -0.0020345799f, 0.0006610751f}, { -0.0025895460f, -0.0042257549f}, { -0.0000271166f, 0.0000271166f}, { -0.0049614426f, -0.0030403759f}, { 0.0000618176f, -0.0001902551f}, { -0.0116260558f, -0.0009149904f}, { -0.0008681988f, -0.0054815914f}, { -0.0250915936f, 0.0103932783f}, { -0.0282354500f, -0.0388627629f}, { -0.0023312476f, 0.0027295403f}, { -0.1246956674f, -0.0635356160f}, { 0.0671065597f, -0.2795189375f}, { 0.3396430866f, 0.0000000000f}, { 0.0597069972f, 0.2486975418f}, { -0.0896805216f, 0.0456945081f}, { 0.0118540046f, 0.0138792561f}, { -0.0279140251f, 0.0384203595f}, { -0.0164160198f, -0.0067997380f}, { -0.0015538410f, 0.0098105660f}, { -0.0093133450f, 0.0007329762f}, { 0.0008798771f, 0.0027079834f}, { -0.0043457630f, 0.0026630870f}, { 0.0012736106f, 0.0012736106f}, { -0.0025712503f, 0.0041958991f}, { -0.0007372681f, -0.0002395529f}, { -0.0002296949f, 0.0029185509f} }, { { -0.0001902827f, -0.0024177706f}, /* Filter 31 */ { -0.0021400055f, 0.0006953299f}, { -0.0025777636f, -0.0042065279f}, { -0.0001406071f, 0.0001406071f}, { -0.0049830706f, -0.0030536296f}, { -0.0000148270f, 0.0000456328f}, { -0.0117708870f, -0.0009263889f}, { -0.0007969746f, -0.0050318997f}, { -0.0258027739f, 0.0106878589f}, { -0.0281420646f, -0.0387342290f}, { -0.0036874988f, 0.0043175064f}, { -0.1276716186f, -0.0650519389f}, { 0.0676613773f, -0.2818299191f}, { 0.3392287675f, 0.0000000000f}, { 0.0590353166f, 0.2458997907f}, { -0.0868471324f, 0.0442508242f}, { 0.0128586169f, 0.0150555060f}, { -0.0277769912f, 0.0382317485f}, { -0.0156965162f, -0.0065017099f}, { -0.0015966847f, 0.0100810704f}, { -0.0090809063f, 0.0007146828f}, { 0.0009382281f, 0.0028875692f}, { -0.0042674275f, 0.0026150829f}, { 0.0013742551f, 0.0013742551f}, { -0.0025568618f, 0.0041724192f}, { -0.0006292185f, -0.0002044455f}, { -0.0002312353f, 0.0029381234f} }, { { -0.0001857931f, -0.0023607247f}, /* Filter 32 */ { -0.0022445889f, 0.0007293112f}, { -0.0025638940f, -0.0041838948f}, { -0.0002544469f, 0.0002544469f}, { -0.0049997803f, -0.0030638693f}, { -0.0000925386f, 0.0002848044f}, { -0.0119071307f, -0.0009371115f}, { -0.0007236441f, -0.0045689089f}, { -0.0265096776f, 0.0109806680f}, { -0.0280287578f, -0.0385782755f}, { -0.0050698048f, 0.0059359787f}, { -0.1306522782f, -0.0665706608f}, { 0.0682057069f, -0.2840972153f}, { 0.3387511245f, 0.0000000000f}, { 0.0583562562f, 0.2430713004f}, { -0.0840306457f, 0.0428157525f}, { 0.0138356301f, 0.0161994415f}, { -0.0276246022f, 0.0380220031f}, { -0.0149797642f, -0.0062048215f}, { -0.0016373263f, 0.0103376715f}, { -0.0088436386f, 0.0006960095f}, { 0.0009948916f, 0.0030619615f}, { -0.0041853880f, 0.0025648091f}, { 0.0014733283f, 0.0014733283f}, { -0.0025405864f, 0.0041458602f}, { -0.0005215883f, -0.0001694743f}, { -0.0002325617f, 0.0029549761f} }, { { -0.0001811037f, -0.0023011405f}, /* Filter 33 */ { -0.0023482397f, 0.0007629893f}, { -0.0025479356f, -0.0041578530f}, { -0.0003685390f, 0.0003685390f}, { -0.0050115039f, -0.0030710535f}, { -0.0001712606f, 0.0005270858f}, { -0.0120345250f, -0.0009471377f}, { -0.0006482276f, -0.0040927478f}, { -0.0272117582f, 0.0112714793f}, { -0.0278952373f, -0.0383945003f}, { -0.0064779557f, 0.0075847116f}, { -0.1336366907f, -0.0680912949f}, { 0.0687393345f, -0.2863199341f}, { 0.3382103275f, 0.0000000000f}, { 0.0576700502f, 0.2402130469f}, { -0.0812318644f, 0.0413897022f}, { 0.0147850271f, 0.0173110426f}, { -0.0274572178f, 0.0377916182f}, { -0.0142662044f, -0.0059092553f}, { -0.0016757712f, 0.0105804032f}, { -0.0086018170f, 0.0006769777f}, { 0.0010498359f, 0.0032310628f}, { -0.0040997524f, 0.0025123315f}, { 0.0015707543f, 0.0015707543f}, { -0.0025224541f, 0.0041162709f}, { -0.0004144665f, -0.0001346683f}, { -0.0002336743f, 0.0029691137f} }, { { -0.0001762169f, -0.0022390484f}, /* Filter 34 */ { -0.0024508655f, 0.0007963345f}, { -0.0025298884f, -0.0041284027f}, { -0.0004827837f, 0.0004827837f}, { -0.0050181849f, -0.0030751477f}, { -0.0002509341f, 0.0007722959f}, { -0.0121528275f, -0.0009564483f}, { -0.0005707451f, -0.0036035431f}, { -0.0279084621f, 0.0115600635f}, { -0.0277412306f, -0.0381825282f}, { -0.0079117353f, 0.0092634518f}, { -0.1366239180f, -0.0696133632f}, { 0.0692620702f, -0.2884972852f}, { 0.3376066341f, 0.0000000000f}, { 0.0569769519f, 0.2373260846f}, { -0.0784515724f, 0.0399730727f}, { 0.0157068004f, 0.0183903004f}, { -0.0272751934f, 0.0375410830f}, { -0.0135562762f, -0.0056151934f}, { -0.0017120255f, 0.0108093037f}, { -0.0083557204f, 0.0006576095f}, { 0.0011030318f, 0.0033947827f}, { -0.0040106281f, 0.0024577161f}, { 0.0016664628f, 0.0016664628f}, { -0.0025024909f, 0.0040836940f}, { -0.0003079322f, -0.0001000532f}, { -0.0002345739f, 0.0029805445f} }, { { -0.0001711354f, -0.0021744821f}, /* Filter 35 */ { -0.0025523730f, 0.0008293163f}, { -0.0025097527f, -0.0040955442f}, { -0.0005970840f, 0.0005970840f}, { -0.0050197673f, -0.0030761174f}, { -0.0003314995f, 0.0010202504f}, { -0.0122617888f, -0.0009650237f}, { -0.0004912199f, -0.0031014405f}, { -0.0285992217f, 0.0118461855f}, { -0.0275664600f, -0.0379419771f}, { -0.0093709121f, 0.0109719284f}, { -0.1396130136f, -0.0711363835f}, { 0.0697737216f, -0.2906284665f}, { 0.3369401960f, 0.0000000000f}, { 0.0562772022f, 0.2344114175f}, { -0.0756905422f, 0.0385662576f}, { 0.0166009646f, 0.0194372322f}, { -0.0270788976f, 0.0372709051f}, { -0.0128504066f, -0.0053228127f}, { -0.0017460976f, 0.0110244264f}, { -0.0081056228f, 0.0006379263f}, { 0.0011544503f, 0.0035530327f}, { -0.0039181269f, 0.0024010313f}, { 0.0017603822f, 0.0017603822f}, { -0.0024807241f, 0.0040481738f}, { -0.0002020749f, -0.0000656581f}, { -0.0002352615f, 0.0029892802f} }, { { -0.0001658620f, -0.0021074766f}, /* Filter 36 */ { -0.0026526758f, 0.0008619066f}, { -0.0024875330f, -0.0040592849f}, { -0.0007113378f, 0.0007113378f}, { -0.0050161963f, -0.0030739290f}, { -0.0004128962f, 0.0012707638f}, { -0.0123611702f, -0.0009728452f}, { -0.0004096775f, -0.0025866021f}, { -0.0292834752f, 0.0121296126f}, { -0.0273706579f, -0.0376724787f}, { -0.0108552443f, 0.0127098581f}, { -0.1426030329f, -0.0726598745f}, { 0.0702740993f, -0.2927126894f}, { 0.3362112915f, 0.0000000000f}, { 0.0555710382f, 0.2314700325f}, { -0.0729495201f, 0.0371696370f}, { 0.0174675393f, 0.0204518608f}, { -0.0268686949f, 0.0369815859f}, { -0.0121490134f, -0.0050322861f}, { -0.0017779973f, 0.0112258334f}, { -0.0078518000f, 0.0006179501f}, { 0.0012040677f, 0.0037057392f}, { -0.0038223595f, 0.0023423449f}, { 0.0018524437f, 0.0018524437f}, { -0.0024571849f, 0.0040097613f}, { -0.0000969713f, -0.0000315079f}, { -0.0002357379f, 0.0029953343f} }, { { -0.0001603995f, -0.0020380694f}, /* Filter 37 */ { -0.0027516756f, 0.0008940736f}, { -0.0024632328f, -0.0040196306f}, { -0.0008254433f, 0.0008254433f}, { -0.0050074246f, -0.0030685537f}, { -0.0004950602f, 0.0015236388f}, { -0.0124507320f, -0.0009798939f}, { -0.0003261437f, -0.0020591900f}, { -0.0299606569f, 0.0124101104f}, { -0.0271535702f, -0.0373736831f}, { -0.0123644684f, 0.0144769324f}, { -0.1455930052f, -0.0741833414f}, { 0.0707630243f, -0.2947492090f}, { 0.3354202136f, 0.0000000000f}, { 0.0548587201f, 0.2285030143f}, { -0.0702292589f, 0.0357835947f}, { 0.0183065518f, 0.0214342183f}, { -0.0266449530f, 0.0366736316f}, { -0.0114525069f, -0.0047437837f}, { -0.0018077349f, 0.0114135888f}, { -0.0075945285f, 0.0005977024f}, { 0.0012518575f, 0.0038528212f}, { -0.0037234402f, 0.0022817271f}, { 0.0019425826f, 0.0019425826f}, { -0.0024319051f, 0.0039685085f}, { 0.0000072962f, 0.0000023707f}, { -0.0002360044f, 0.0029987207f} }, { { -0.0001547513f, -0.0019663015f}, /* Filter 38 */ { -0.0028492882f, 0.0009257899f}, { -0.0024368605f, -0.0039765949f}, { -0.0009392972f, 0.0009392972f}, { -0.0049934088f, -0.0030599648f}, { -0.0005779288f, 0.0017786820f}, { -0.0125302396f, -0.0009861512f}, { -0.0002406474f, -0.0015193877f}, { -0.0306301910f, 0.0126874405f}, { -0.0269149412f, -0.0370452384f}, { -0.0138983208f, 0.0162728428f}, { -0.1485819667f, -0.0757062934f}, { 0.0712403148f, -0.2967372670f}, { 0.3345672589f, 0.0000000000f}, { 0.0541404956f, 0.2255113940f}, { -0.0675304887f, 0.0344085026f}, { 0.0191180538f, 0.0223843650f}, { -0.0264080456f, 0.0363475566f}, { -0.0107612899f, -0.0044574722f}, { -0.0018353240f, 0.0115877798f}, { -0.0073340784f, 0.0005772045f}, { 0.0012977996f, 0.0039942164f}, { -0.0036214854f, 0.0022192491f}, { 0.0020307330f, 0.0020307330f}, { -0.0024049153f, 0.0039244652f}, { 0.0001106457f, 0.0000359510f}, { -0.0002360624f, 0.0029994575f} }, { { -0.0001489206f, -0.0018922157f}, /* Filter 39 */ { -0.0029454189f, 0.0009570246f}, { -0.0024084239f, -0.0039301906f}, { -0.0010527980f, 0.0010527980f}, { -0.0049741065f, -0.0030481364f}, { -0.0006614353f, 0.0020356887f}, { -0.0125994671f, -0.0009915996f}, { -0.0001532180f, -0.0009673802f}, { -0.0312914991f, 0.0129613633f}, { -0.0266545289f, -0.0366868117f}, { -0.0154565158f, 0.0180972548f}, { -0.1515689653f, -0.0772282452f}, { 0.0717057869f, -0.2986760977f}, { 0.3336527424f, 0.0000000000f}, { 0.0534166146f, 0.2224962126f}, { -0.0648539333f, 0.0330447295f}, { 0.0199020969f, 0.0233023615f}, { -0.0261583498f, 0.0360038798f}, { -0.0100757513f, -0.0041735128f}, { -0.0018607775f, 0.0117484865f}, { -0.0070707263f, 0.0005564782f}, { 0.0013418720f, 0.0041298574f}, { -0.0035166109f, 0.0021549819f}, { 0.0021168342f, 0.0021168342f}, { -0.0023762496f, 0.0038776870f}, { 0.0002129997f, 0.0000692078f}, { -0.0002359134f, 0.0029975637f} }, { { -0.0001429107f, -0.0018158530f}, /* Filter 40 */ { -0.0030399798f, 0.0009877493f}, { -0.0023779327f, -0.0038804334f}, { -0.0011658419f, 0.0011658419f}, { -0.0049494845f, -0.0030330480f}, { -0.0007455134f, 0.0022944544f}, { -0.0126581845f, -0.0009962207f}, { -0.0000638882f, -0.0004033739f}, { -0.0319440023f, 0.0132316390f}, { -0.0263720939f, -0.0362980733f}, { -0.0170387579f, 0.0199498223f}, { -0.1545530146f, -0.0787486942f}, { 0.0721592734f, -0.3005650049f}, { 0.3326769857f, 0.0000000000f}, { 0.0526873296f, 0.2194585217f}, { -0.0622002845f, 0.0316926279f}, { 0.0206587490f, 0.0241882873f}, { -0.0258962331f, 0.0356431071f}, { -0.0093962743f, -0.0038920642f}, { -0.0018841113f, 0.0118958109f}, { -0.0068047424f, 0.0005355448f}, { 0.0013840565f, 0.0042596878f}, { -0.0034089378f, 0.0020889998f}, { 0.0022008259f, 0.0022008259f}, { -0.0023459445f, 0.0038282335f}, { 0.0003142843f, 0.0001021172f}, { -0.0002355590f, 0.0029930609f} }, { { -0.0001367258f, -0.0017372664f}, /* Filter 41 */ { -0.0031328855f, 0.0010179362f}, { -0.0023454000f, -0.0038273449f}, { -0.0012783271f, 0.0012783271f}, { -0.0049195054f, -0.0030146768f}, { -0.0008300950f, 0.0025547698f}, { -0.0127061747f, -0.0009999976f}, { 0.0000273092f, 0.0001724233f}, { -0.0325871180f, 0.0134980262f}, { -0.0260674081f, -0.0358787092f}, { -0.0186447416f, 0.0218301877f}, { -0.1575331331f, -0.0802671405f}, { 0.0726006106f, -0.3024033068f}, { 0.3316403995f, 0.0000000000f}, { 0.0519528957f, 0.2163993844f}, { -0.0595702454f, 0.0303525561f}, { 0.0213880887f, 0.0250422344f}, { -0.0256220747f, 0.0352657604f}, { -0.0087232308f, -0.0036132805f}, { -0.0019053410f, 0.0120298496f}, { -0.0065363981f, 0.0005144257f}, { 0.0014243364f, 0.0043836566f}, { -0.0032985844f, 0.0020213751f}, { 0.0022826512f, 0.0022826512f}, { -0.0023140327f, 0.0037761582f}, { 0.0004144205f, 0.0001346534f}, { -0.0002350011f, 0.0029859721f} }, { { -0.0001303693f, -0.0016564989f}, /* Filter 42 */ { -0.0032240442f, 0.0010475555f}, { -0.0023108391f, -0.0037709467f}, { -0.0013901463f, 0.0013901463f}, { -0.0048841463f, -0.0029930087f}, { -0.0009151099f, 0.0028164188f}, { -0.0127432290f, -0.0010029139f}, { 0.0001203382f, 0.0007597857f}, { -0.0332202557f, 0.0137602804f}, { -0.0257402535f, -0.0354284196f}, { -0.0202741482f, 0.0237379776f}, { -0.1605083564f, -0.0817830924f}, { 0.0730296300f, -0.3041903010f}, { 0.3305433046f, 0.0000000000f}, { 0.0512135691f, 0.2133198677f}, { -0.0569644843f, 0.0290248545f}, { 0.0220902122f, 0.0258643154f}, { -0.0253362547f, 0.0348723629f}, { -0.0080569843f, -0.0033373122f}, { -0.0019244846f, 0.0121507178f}, { -0.0062659606f, 0.0004931418f}, { 0.0014626959f, 0.0045017152f}, { -0.0031856701f, 0.0019521811f}, { 0.0023622545f, 0.0023622545f}, { -0.0022805536f, 0.0037215252f}, { 0.0005133336f, 0.0001667922f}, { -0.0002342418f, 0.0029763241f} }, { { -0.0001238455f, -0.0015736058f}, /* Filter 43 */ { -0.0033133678f, 0.0010765785f}, { -0.0022742667f, -0.0037112660f}, { -0.0015011959f, 0.0015011959f}, { -0.0048433801f, -0.0029680271f}, { -0.0010004881f, 0.0030791857f}, { -0.0127691311f, -0.0010049524f}, { 0.0002151614f, 0.0013584756f}, { -0.0338428277f, 0.0140181582f}, { -0.0253904152f, -0.0349469084f}, { -0.0219266458f, 0.0256728037f}, { -0.1634776964f, -0.0832960468f}, { 0.0734461719f, -0.3059253229f}, { 0.3293862057f, 0.0000000000f}, { 0.0504696014f, 0.2102210189f}, { -0.0543836682f, 0.0277098630f}, { 0.0227652173f, 0.0266546448f}, { -0.0250391496f, 0.0344634328f}, { -0.0073978880f, -0.0030643056f}, { -0.0019415623f, 0.0122585417f}, { -0.0059936966f, 0.0004717142f}, { 0.0014991220f, 0.0046138230f}, { -0.0030703178f, 0.0018814932f}, { 0.0024395825f, 0.0024395825f}, { -0.0022455442f, 0.0036643951f}, { 0.0006109549f, 0.0001985113f}, { -0.0002332832f, 0.0029641442f} }, { { -0.0001171583f, -0.0014886367f}, /* Filter 44 */ { -0.0034007733f, 0.0011049782f}, { -0.0022357000f, -0.0036483309f}, { -0.0016113720f, 0.0016113720f}, { -0.0047971886f, -0.0029397209f}, { -0.0010861574f, 0.0033428487f}, { -0.0127836805f, -0.0010060975f}, { 0.0003117406f, 0.0019682529f}, { -0.0344542448f, 0.0142714155f}, { -0.0250176852f, -0.0344338896f}, { -0.0236018860f, 0.0276342580f}, { -0.1664401729f, -0.0848055039f}, { 0.0738500836f, -0.3076077361f}, { 0.3281694617f, 0.0000000000f}, { 0.0497212515f, 0.2071039176f}, { -0.0518284449f, 0.0264079117f}, { 0.0234132131f, 0.0274133503f}, { -0.0247311428f, 0.0340394978f}, { -0.0067462847f, -0.0027944026f}, { -0.0019565932f, 0.0123534430f}, { -0.0057198731f, 0.0004501638f}, { 0.0015336029f, 0.0047199445f}, { -0.0029526533f, 0.0018093883f}, { 0.0025145856f, 0.0025145856f}, { -0.0022090444f, 0.0036048329f}, { 0.0007072103f, 0.0002297865f}, { -0.0002321276f, 0.0029494611f} }, { { -0.0001103122f, -0.0014016500f}, /* Filter 45 */ { -0.0034861718f, 0.0011327259f}, { -0.0021951585f, -0.0035821731f}, { -0.0017205660f, 0.0017205660f}, { -0.0047455579f, -0.0029080816f}, { -0.0011720449f, 0.0036071832f}, { -0.0127866782f, -0.0010063334f}, { 0.0004100342f, 0.0025888544f}, { -0.0350539120f, 0.0145198058f}, { -0.0246218736f, -0.0338891017f}, { -0.0252995186f, 0.0296219304f}, { -0.1693947993f, -0.0863109612f}, { 0.0742412161f, -0.3092369205f}, { 0.3268935535f, 0.0000000000f}, { 0.0489687748f, 0.2039696262f}, { -0.0492994388f, 0.0251193187f}, { 0.0240343336f, 0.0281405891f}, { -0.0244126095f, 0.0336010744f}, { -0.0061025091f, -0.0025277420f}, { -0.0019695990f, 0.0124355589f}, { -0.0054447492f, 0.0004285111f}, { 0.0015661291f, 0.0048200496f}, { -0.0028327978f, 0.0017359407f}, { 0.0025872148f, 0.0025872148f}, { -0.0021710931f, 0.0035429020f}, { 0.0008020327f, 0.0002605962f}, { -0.0002307776f, 0.0029323077f} }, { { -0.0001033121f, -0.0013127044f}, /* Filter 46 */ { -0.0035694823f, 0.0011597951f}, { -0.0021526634f, -0.0035128275f}, { -0.0018286776f, 0.0018286776f}, { -0.0046884762f, -0.0028731019f}, { -0.0012580756f, 0.0038719586f}, { -0.0127779299f, -0.0010056449f}, { 0.0005100000f, 0.0032200133f}, { -0.0356412303f, 0.0147630810f}, { -0.0242027907f, -0.0333122836f}, { -0.0270191676f, 0.0316353806f}, { -0.1723405821f, -0.0878119126f}, { 0.0746194196f, -0.3108122511f}, { 0.3255589646f, 0.0000000000f}, { 0.0482124309f, 0.2008192272f}, { -0.0467972792f, 0.0238444047f}, { 0.0246287071f, 0.0288365110f}, { -0.0240839365f, 0.0331486948f}, { -0.0054668817f, -0.0022644566f}, { -0.0019806027f, 0.0125050331f}, { -0.0051685871f, 0.0004067766f}, { 0.0015966923f, 0.0049141135f}, { -0.0027108763f, 0.0016612271f}, { 0.0026574255f, 0.0026574255f}, { -0.0021317304f, 0.0034786678f}, { 0.0008953512f, 0.0002909172f}, { -0.0002292356f, 0.0029127149f} }, { { -0.0000961620f, -0.0012218546f}, /* Filter 47 */ { -0.0036506231f, 0.0011861593f}, { -0.0021082375f, -0.0034403309f}, { -0.0019355976f, 0.0019355976f}, { -0.0046259384f, -0.0028347787f}, { -0.0013441756f, 0.0041369471f}, { -0.0127572528f, -0.0010040176f}, { 0.0006115934f, 0.0038614490f}, { -0.0362156056f, 0.0150009950f}, { -0.0237602556f, -0.0327031863f}, { -0.0287604570f, 0.0336741686f}, { -0.1752765433f, -0.0893078595f}, { 0.0749845580f, -0.3123331621f}, { 0.3241661779f, 0.0000000000f}, { 0.0474524780f, 0.1976537959f}, { -0.0443225478f, 0.0225834661f}, { 0.0251964799f, 0.0295012876f}, { -0.0237455028f, 0.0326828808f}, { -0.0048397188f, -0.0020046772f}, { -0.0019896284f, 0.0125620192f}, { -0.0048916464f, 0.0003849809f}, { 0.0016252861f, 0.0050021163f}, { -0.0025870146f, 0.0015853246f}, { 0.0027251726f, 0.0027251726f}, { -0.0020910004f, 0.0034122025f}, { 0.0009871039f, 0.0003207295f}, { -0.0002275045f, 0.0028907191f} } }; iaxmodem-1.2.0/lib/spandsp/src/fsk.c0000644000175000017500000003075711150047216016620 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * fsk.c - FSK modem transmit and receive parts * * Written by Steve Underwood * * Copyright (C) 2003 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: fsk.c,v 1.44 2008/07/16 17:01:49 steveu Exp $ */ /*! \file */ #if defined(HAVE_CONFIG_H) #include #endif #include #include #include #include "floating_fudge.h" #if defined(HAVE_TGMATH_H) #include #endif #if defined(HAVE_MATH_H) #include #endif #include #include "spandsp/telephony.h" #include "spandsp/complex.h" #include "spandsp/dds.h" #include "spandsp/power_meter.h" #include "spandsp/async.h" #include "spandsp/fsk.h" const fsk_spec_t preset_fsk_specs[] = { { "V21 ch 1", 1080 + 100, 1080 - 100, -14, -30, 300*100 }, { "V21 ch 2", 1750 + 100, 1750 - 100, -14, -30, 300*100 }, { "V23 ch 1", 2100, 1300, -14, -30, 1200*100 }, { "V23 ch 2", 450, 390, -14, -30, 75*100 }, { "Bell103 ch 1", 2125 - 100, 2125 + 100, -14, -30, 300*100 }, { "Bell103 ch 2", 1170 - 100, 1170 + 100, -14, -30, 300*100 }, { "Bell202", 2200, 1200, -14, -30, 1200*100 }, { "Weitbrecht", /* Used for TDD (Telecoms Device for the Deaf) */ 1800, 1400, -14, -30, 4545 } }; fsk_tx_state_t *fsk_tx_init(fsk_tx_state_t *s, const fsk_spec_t *spec, get_bit_func_t get_bit, void *user_data) { if (s == NULL) { if ((s = (fsk_tx_state_t *) malloc(sizeof(*s))) == NULL) return NULL; } s->baud_rate = spec->baud_rate; s->get_bit = get_bit; s->get_bit_user_data = user_data; s->phase_rates[0] = dds_phase_rate((float) spec->freq_zero); s->phase_rates[1] = dds_phase_rate((float) spec->freq_one); s->scaling = dds_scaling_dbm0((float) spec->tx_level); /* Initialise fractional sample baud generation. */ s->phase_acc = 0; s->baud_inc = s->baud_rate; s->baud_frac = 0; s->current_phase_rate = s->phase_rates[1]; s->shutdown = FALSE; return s; } /*- End of function --------------------------------------------------------*/ int fsk_tx(fsk_tx_state_t *s, int16_t *amp, int len) { int sample; int bit; if (s->shutdown) return 0; /* Make the transitions between 0 and 1 phase coherent, but instantaneous jumps. There is currently no interpolation for bauds that end mid-sample. Mainstream users will not care. Some specialist users might have a problem with them, if they care about accurate transition timing. */ for (sample = 0; sample < len; sample++) { if ((s->baud_frac += s->baud_inc) >= SAMPLE_RATE*100) { s->baud_frac -= SAMPLE_RATE*100; if ((bit = s->get_bit(s->get_bit_user_data)) == PUTBIT_END_OF_DATA) { if (s->status_handler) s->status_handler(s->status_user_data, MODEM_TX_STATUS_DATA_EXHAUSTED); if (s->status_handler) s->status_handler(s->status_user_data, MODEM_TX_STATUS_SHUTDOWN_COMPLETE); s->shutdown = TRUE; break; } s->current_phase_rate = s->phase_rates[bit & 1]; } amp[sample] = dds_mod(&(s->phase_acc), s->current_phase_rate, s->scaling, 0); } return sample; } /*- End of function --------------------------------------------------------*/ void fsk_tx_power(fsk_tx_state_t *s, float power) { s->scaling = dds_scaling_dbm0(power); } /*- End of function --------------------------------------------------------*/ void fsk_tx_set_get_bit(fsk_tx_state_t *s, get_bit_func_t get_bit, void *user_data) { s->get_bit = get_bit; s->get_bit_user_data = user_data; } /*- End of function --------------------------------------------------------*/ void fsk_tx_set_modem_status_handler(fsk_tx_state_t *s, modem_tx_status_func_t handler, void *user_data) { s->status_handler = handler; s->status_user_data = user_data; } /*- End of function --------------------------------------------------------*/ void fsk_rx_signal_cutoff(fsk_rx_state_t *s, float cutoff) { /* The 6.04 allows for the gain of the DC blocker */ s->carrier_on_power = (int32_t) (power_meter_level_dbm0(cutoff + 2.5f - 6.04f)); s->carrier_off_power = (int32_t) (power_meter_level_dbm0(cutoff - 2.5f - 6.04f)); } /*- End of function --------------------------------------------------------*/ float fsk_rx_signal_power(fsk_rx_state_t *s) { return power_meter_current_dbm0(&s->power); } /*- End of function --------------------------------------------------------*/ void fsk_rx_set_put_bit(fsk_rx_state_t *s, put_bit_func_t put_bit, void *user_data) { s->put_bit = put_bit; s->put_bit_user_data = user_data; } /*- End of function --------------------------------------------------------*/ void fsk_rx_set_modem_status_handler(fsk_rx_state_t *s, modem_tx_status_func_t handler, void *user_data) { s->status_handler = handler; s->status_user_data = user_data; } /*- End of function --------------------------------------------------------*/ fsk_rx_state_t *fsk_rx_init(fsk_rx_state_t *s, const fsk_spec_t *spec, int sync_mode, put_bit_func_t put_bit, void *user_data) { int chop; if (s == NULL) { if ((s = (fsk_rx_state_t *) malloc(sizeof(*s))) == NULL) return NULL; } memset(s, 0, sizeof(*s)); s->baud_rate = spec->baud_rate; s->sync_mode = sync_mode; fsk_rx_signal_cutoff(s, (float) spec->min_level); s->put_bit = put_bit; s->put_bit_user_data = user_data; /* Detect by correlating against the tones we want, over a period of one baud. The correlation must be quadrature. */ /* First we need the quadrature tone generators to correlate against. */ s->phase_rate[0] = dds_phase_rate((float) spec->freq_zero); s->phase_rate[1] = dds_phase_rate((float) spec->freq_one); s->phase_acc[0] = 0; s->phase_acc[1] = 0; s->last_sample = 0; /* The correlation should be over one baud. */ s->correlation_span = SAMPLE_RATE*100/spec->baud_rate; /* But limit it for very slow baud rates, so we do not overflow our buffer. */ if (s->correlation_span > FSK_MAX_WINDOW_LEN) s->correlation_span = FSK_MAX_WINDOW_LEN; /* We need to scale, to avoid overflow in the correlation. */ s->scaling_shift = 0; chop = s->correlation_span; while (chop != 0) { s->scaling_shift++; chop >>= 1; } /* Initialise the baud/bit rate tracking. */ s->baud_inc = s->baud_rate; s->baud_pll = 0; /* Initialise a power detector, so sense when a signal is present. */ power_meter_init(&(s->power), 4); s->signal_present = 0; return s; } /*- End of function --------------------------------------------------------*/ static void report_status_change(fsk_rx_state_t *s, int status) { if (s->status_handler) s->status_handler(s->status_user_data, status); else if (s->put_bit) s->put_bit(s->put_bit_user_data, status); } /*- End of function --------------------------------------------------------*/ int fsk_rx(fsk_rx_state_t *s, const int16_t *amp, int len) { int buf_ptr; int baudstate; int i; int j; int16_t x; int32_t dot; int32_t sum[2]; int32_t power; complexi_t ph; buf_ptr = s->buf_ptr; for (i = 0; i < len; i++) { /* If there isn't much signal, don't demodulate - it will only produce useless junk results. */ /* There should be no DC in the signal, but sometimes there is. We need to measure the power with the DC blocked, but not using a slow to respond DC blocker. Use the most elementary HPF. */ x = amp[i] >> 1; power = power_meter_update(&(s->power), x - s->last_sample); s->last_sample = x; if (s->signal_present) { /* Look for power below turn-off threshold to turn the carrier off */ if (power < s->carrier_off_power) { if (--s->signal_present <= 0) { /* Count down a short delay, to ensure we push the last few bits through the filters before stopping. */ report_status_change(s, PUTBIT_CARRIER_DOWN); continue; } } } else { /* Look for power exceeding turn-on threshold to turn the carrier on */ if (power < s->carrier_on_power) continue; s->signal_present = 1; report_status_change(s, PUTBIT_CARRIER_UP); } /* Non-coherent FSK demodulation by correlation with the target tones over a one baud interval. The slow V.xx specs. are too open ended to allow anything fancier to be used. The dot products are calculated using a sliding window approach, so the compute load is not that great. */ /* The *totally* asynchronous character to character behaviour of these modems, when carrying async. data, seems to force a sample by sample approach. */ for (j = 0; j < 2; j++) { s->dot[j].re -= s->window[j][buf_ptr].re; s->dot[j].im -= s->window[j][buf_ptr].im; ph = dds_complexi(&(s->phase_acc[j]), s->phase_rate[j]); s->window[j][buf_ptr].re = (ph.re*amp[i]) >> s->scaling_shift; s->window[j][buf_ptr].im = (ph.im*amp[i]) >> s->scaling_shift; s->dot[j].re += s->window[j][buf_ptr].re; s->dot[j].im += s->window[j][buf_ptr].im; dot = s->dot[j].re >> 15; sum[j] = dot*dot; dot = s->dot[j].im >> 15; sum[j] += dot*dot; } baudstate = (sum[0] < sum[1]); if (s->lastbit != baudstate) { s->lastbit = baudstate; if (s->sync_mode) { /* For synchronous use (e.g. HDLC channels in FAX modems), nudge the baud phase gently, trying to keep it centred on the bauds. */ if (s->baud_pll < (SAMPLE_RATE*50)) s->baud_pll += (s->baud_inc >> 3); else s->baud_pll -= (s->baud_inc >> 3); } else { /* For async. operation, believe transitions completely, and sample appropriately. This allows instant start on the first transition. */ /* We must now be about half way to a sampling point. We do not do any fractional sample estimation of the transitions, so this is the most accurate baud alignment we can do. */ s->baud_pll = SAMPLE_RATE*50; } } if ((s->baud_pll += s->baud_inc) >= (SAMPLE_RATE*100)) { /* We should be in the middle of a baud now, so report the current state as the next bit */ s->baud_pll -= (SAMPLE_RATE*100); s->put_bit(s->put_bit_user_data, baudstate); } if (++buf_ptr >= s->correlation_span) buf_ptr = 0; } s->buf_ptr = buf_ptr; return 0; } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/dds_float.c0000644000175000017500000012021111150047216017755 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * complex_dds.c * * Written by Steve Underwood * * Copyright (C) 2003 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: dds_float.c,v 1.8 2008/07/02 14:48:25 steveu Exp $ */ /*! \file */ #if defined(HAVE_CONFIG_H) #include #endif #include #include #include "floating_fudge.h" #if defined(HAVE_TGMATH_H) #include #endif #if defined(HAVE_MATH_H) #include #endif #include "spandsp/telephony.h" #include "spandsp/complex.h" #include "spandsp/dds.h" #define SLENK 11 #define SINELEN (1 << SLENK) /* Precreating this table allows it to be in const memory, which might have some performance advantage. */ static const float sine_table[SINELEN] = { 0.00000000f, 0.00306796f, 0.00613588f, 0.00920375f, 0.01227154f, 0.01533921f, 0.01840673f, 0.02147408f, 0.02454123f, 0.02760815f, 0.03067480f, 0.03374117f, 0.03680722f, 0.03987293f, 0.04293826f, 0.04600318f, 0.04906767f, 0.05213170f, 0.05519524f, 0.05825826f, 0.06132074f, 0.06438263f, 0.06744392f, 0.07050457f, 0.07356456f, 0.07662386f, 0.07968244f, 0.08274026f, 0.08579731f, 0.08885355f, 0.09190896f, 0.09496350f, 0.09801714f, 0.10106986f, 0.10412163f, 0.10717242f, 0.11022221f, 0.11327095f, 0.11631863f, 0.11936521f, 0.12241068f, 0.12545498f, 0.12849811f, 0.13154003f, 0.13458071f, 0.13762012f, 0.14065824f, 0.14369503f, 0.14673047f, 0.14976453f, 0.15279719f, 0.15582840f, 0.15885814f, 0.16188639f, 0.16491312f, 0.16793829f, 0.17096189f, 0.17398387f, 0.17700422f, 0.18002290f, 0.18303989f, 0.18605515f, 0.18906866f, 0.19208040f, 0.19509032f, 0.19809841f, 0.20110463f, 0.20410897f, 0.20711138f, 0.21011184f, 0.21311032f, 0.21610680f, 0.21910124f, 0.22209362f, 0.22508391f, 0.22807208f, 0.23105811f, 0.23404196f, 0.23702361f, 0.24000302f, 0.24298018f, 0.24595505f, 0.24892761f, 0.25189782f, 0.25486566f, 0.25783110f, 0.26079412f, 0.26375468f, 0.26671276f, 0.26966833f, 0.27262136f, 0.27557182f, 0.27851969f, 0.28146494f, 0.28440754f, 0.28734746f, 0.29028468f, 0.29321916f, 0.29615089f, 0.29907983f, 0.30200595f, 0.30492923f, 0.30784964f, 0.31076715f, 0.31368174f, 0.31659338f, 0.31950203f, 0.32240768f, 0.32531029f, 0.32820984f, 0.33110631f, 0.33399965f, 0.33688985f, 0.33977688f, 0.34266072f, 0.34554132f, 0.34841868f, 0.35129276f, 0.35416353f, 0.35703096f, 0.35989504f, 0.36275572f, 0.36561300f, 0.36846683f, 0.37131719f, 0.37416406f, 0.37700741f, 0.37984721f, 0.38268343f, 0.38551605f, 0.38834505f, 0.39117038f, 0.39399204f, 0.39680999f, 0.39962420f, 0.40243465f, 0.40524131f, 0.40804416f, 0.41084317f, 0.41363831f, 0.41642956f, 0.41921689f, 0.42200027f, 0.42477968f, 0.42755509f, 0.43032648f, 0.43309382f, 0.43585708f, 0.43861624f, 0.44137127f, 0.44412214f, 0.44686884f, 0.44961133f, 0.45234959f, 0.45508359f, 0.45781330f, 0.46053871f, 0.46325978f, 0.46597650f, 0.46868882f, 0.47139674f, 0.47410021f, 0.47679923f, 0.47949376f, 0.48218377f, 0.48486925f, 0.48755016f, 0.49022648f, 0.49289819f, 0.49556526f, 0.49822767f, 0.50088538f, 0.50353838f, 0.50618665f, 0.50883014f, 0.51146885f, 0.51410274f, 0.51673180f, 0.51935599f, 0.52197529f, 0.52458968f, 0.52719913f, 0.52980362f, 0.53240313f, 0.53499762f, 0.53758708f, 0.54017147f, 0.54275078f, 0.54532499f, 0.54789406f, 0.55045797f, 0.55301671f, 0.55557023f, 0.55811853f, 0.56066158f, 0.56319934f, 0.56573181f, 0.56825895f, 0.57078075f, 0.57329717f, 0.57580819f, 0.57831380f, 0.58081396f, 0.58330865f, 0.58579786f, 0.58828155f, 0.59075970f, 0.59323230f, 0.59569930f, 0.59816071f, 0.60061648f, 0.60306660f, 0.60551104f, 0.60794978f, 0.61038281f, 0.61281008f, 0.61523159f, 0.61764731f, 0.62005721f, 0.62246128f, 0.62485949f, 0.62725182f, 0.62963824f, 0.63201874f, 0.63439328f, 0.63676186f, 0.63912444f, 0.64148101f, 0.64383154f, 0.64617601f, 0.64851440f, 0.65084668f, 0.65317284f, 0.65549285f, 0.65780669f, 0.66011434f, 0.66241578f, 0.66471098f, 0.66699992f, 0.66928259f, 0.67155895f, 0.67382900f, 0.67609270f, 0.67835004f, 0.68060100f, 0.68284555f, 0.68508367f, 0.68731534f, 0.68954054f, 0.69175926f, 0.69397146f, 0.69617713f, 0.69837625f, 0.70056879f, 0.70275474f, 0.70493408f, 0.70710678f, 0.70927283f, 0.71143220f, 0.71358487f, 0.71573083f, 0.71787005f, 0.72000251f, 0.72212819f, 0.72424708f, 0.72635916f, 0.72846439f, 0.73056277f, 0.73265427f, 0.73473888f, 0.73681657f, 0.73888732f, 0.74095113f, 0.74300795f, 0.74505779f, 0.74710061f, 0.74913639f, 0.75116513f, 0.75318680f, 0.75520138f, 0.75720885f, 0.75920919f, 0.76120239f, 0.76318842f, 0.76516727f, 0.76713891f, 0.76910334f, 0.77106052f, 0.77301045f, 0.77495311f, 0.77688847f, 0.77881651f, 0.78073723f, 0.78265060f, 0.78455660f, 0.78645521f, 0.78834643f, 0.79023022f, 0.79210658f, 0.79397548f, 0.79583690f, 0.79769084f, 0.79953727f, 0.80137617f, 0.80320753f, 0.80503133f, 0.80684755f, 0.80865618f, 0.81045720f, 0.81225059f, 0.81403633f, 0.81581441f, 0.81758481f, 0.81934752f, 0.82110251f, 0.82284978f, 0.82458930f, 0.82632106f, 0.82804505f, 0.82976123f, 0.83146961f, 0.83317016f, 0.83486287f, 0.83654773f, 0.83822471f, 0.83989379f, 0.84155498f, 0.84320824f, 0.84485357f, 0.84649094f, 0.84812034f, 0.84974177f, 0.85135519f, 0.85296060f, 0.85455799f, 0.85614733f, 0.85772861f, 0.85930182f, 0.86086694f, 0.86242396f, 0.86397286f, 0.86551362f, 0.86704625f, 0.86857071f, 0.87008699f, 0.87159509f, 0.87309498f, 0.87458665f, 0.87607009f, 0.87754529f, 0.87901223f, 0.88047089f, 0.88192126f, 0.88336334f, 0.88479710f, 0.88622253f, 0.88763962f, 0.88904836f, 0.89044872f, 0.89184071f, 0.89322430f, 0.89459949f, 0.89596625f, 0.89732458f, 0.89867447f, 0.90001589f, 0.90134885f, 0.90267332f, 0.90398929f, 0.90529676f, 0.90659570f, 0.90788612f, 0.90916798f, 0.91044129f, 0.91170603f, 0.91296219f, 0.91420976f, 0.91544872f, 0.91667906f, 0.91790078f, 0.91911385f, 0.92031828f, 0.92151404f, 0.92270113f, 0.92387953f, 0.92504924f, 0.92621024f, 0.92736253f, 0.92850608f, 0.92964090f, 0.93076696f, 0.93188427f, 0.93299280f, 0.93409255f, 0.93518351f, 0.93626567f, 0.93733901f, 0.93840353f, 0.93945922f, 0.94050607f, 0.94154407f, 0.94257320f, 0.94359346f, 0.94460484f, 0.94560733f, 0.94660091f, 0.94758559f, 0.94856135f, 0.94952818f, 0.95048607f, 0.95143502f, 0.95237501f, 0.95330604f, 0.95422810f, 0.95514117f, 0.95604525f, 0.95694034f, 0.95782641f, 0.95870347f, 0.95957151f, 0.96043052f, 0.96128049f, 0.96212140f, 0.96295327f, 0.96377607f, 0.96458979f, 0.96539444f, 0.96619000f, 0.96697647f, 0.96775384f, 0.96852209f, 0.96928124f, 0.97003125f, 0.97077214f, 0.97150389f, 0.97222650f, 0.97293995f, 0.97364425f, 0.97433938f, 0.97502535f, 0.97570213f, 0.97636973f, 0.97702814f, 0.97767736f, 0.97831737f, 0.97894818f, 0.97956977f, 0.98018214f, 0.98078528f, 0.98137919f, 0.98196387f, 0.98253930f, 0.98310549f, 0.98366242f, 0.98421009f, 0.98474850f, 0.98527764f, 0.98579751f, 0.98630810f, 0.98680940f, 0.98730142f, 0.98778414f, 0.98825757f, 0.98872169f, 0.98917651f, 0.98962202f, 0.99005821f, 0.99048508f, 0.99090264f, 0.99131086f, 0.99170975f, 0.99209931f, 0.99247953f, 0.99285041f, 0.99321195f, 0.99356414f, 0.99390697f, 0.99424045f, 0.99456457f, 0.99487933f, 0.99518473f, 0.99548076f, 0.99576741f, 0.99604470f, 0.99631261f, 0.99657115f, 0.99682030f, 0.99706007f, 0.99729046f, 0.99751146f, 0.99772307f, 0.99792529f, 0.99811811f, 0.99830154f, 0.99847558f, 0.99864022f, 0.99879546f, 0.99894129f, 0.99907773f, 0.99920476f, 0.99932238f, 0.99943060f, 0.99952942f, 0.99961882f, 0.99969882f, 0.99976941f, 0.99983058f, 0.99988235f, 0.99992470f, 0.99995764f, 0.99998118f, 0.99999529f, 1.00000000f, 0.99999529f, 0.99998118f, 0.99995764f, 0.99992470f, 0.99988235f, 0.99983058f, 0.99976941f, 0.99969882f, 0.99961882f, 0.99952942f, 0.99943060f, 0.99932238f, 0.99920476f, 0.99907773f, 0.99894129f, 0.99879546f, 0.99864022f, 0.99847558f, 0.99830154f, 0.99811811f, 0.99792529f, 0.99772307f, 0.99751146f, 0.99729046f, 0.99706007f, 0.99682030f, 0.99657115f, 0.99631261f, 0.99604470f, 0.99576741f, 0.99548076f, 0.99518473f, 0.99487933f, 0.99456457f, 0.99424045f, 0.99390697f, 0.99356414f, 0.99321195f, 0.99285041f, 0.99247953f, 0.99209931f, 0.99170975f, 0.99131086f, 0.99090264f, 0.99048508f, 0.99005821f, 0.98962202f, 0.98917651f, 0.98872169f, 0.98825757f, 0.98778414f, 0.98730142f, 0.98680940f, 0.98630810f, 0.98579751f, 0.98527764f, 0.98474850f, 0.98421009f, 0.98366242f, 0.98310549f, 0.98253930f, 0.98196387f, 0.98137919f, 0.98078528f, 0.98018214f, 0.97956977f, 0.97894818f, 0.97831737f, 0.97767736f, 0.97702814f, 0.97636973f, 0.97570213f, 0.97502535f, 0.97433938f, 0.97364425f, 0.97293995f, 0.97222650f, 0.97150389f, 0.97077214f, 0.97003125f, 0.96928124f, 0.96852209f, 0.96775384f, 0.96697647f, 0.96619000f, 0.96539444f, 0.96458979f, 0.96377607f, 0.96295327f, 0.96212140f, 0.96128049f, 0.96043052f, 0.95957151f, 0.95870347f, 0.95782641f, 0.95694034f, 0.95604525f, 0.95514117f, 0.95422810f, 0.95330604f, 0.95237501f, 0.95143502f, 0.95048607f, 0.94952818f, 0.94856135f, 0.94758559f, 0.94660091f, 0.94560733f, 0.94460484f, 0.94359346f, 0.94257320f, 0.94154407f, 0.94050607f, 0.93945922f, 0.93840353f, 0.93733901f, 0.93626567f, 0.93518351f, 0.93409255f, 0.93299280f, 0.93188427f, 0.93076696f, 0.92964090f, 0.92850608f, 0.92736253f, 0.92621024f, 0.92504924f, 0.92387953f, 0.92270113f, 0.92151404f, 0.92031828f, 0.91911385f, 0.91790078f, 0.91667906f, 0.91544872f, 0.91420976f, 0.91296219f, 0.91170603f, 0.91044129f, 0.90916798f, 0.90788612f, 0.90659570f, 0.90529676f, 0.90398929f, 0.90267332f, 0.90134885f, 0.90001589f, 0.89867447f, 0.89732458f, 0.89596625f, 0.89459949f, 0.89322430f, 0.89184071f, 0.89044872f, 0.88904836f, 0.88763962f, 0.88622253f, 0.88479710f, 0.88336334f, 0.88192126f, 0.88047089f, 0.87901223f, 0.87754529f, 0.87607009f, 0.87458665f, 0.87309498f, 0.87159509f, 0.87008699f, 0.86857071f, 0.86704625f, 0.86551362f, 0.86397286f, 0.86242396f, 0.86086694f, 0.85930182f, 0.85772861f, 0.85614733f, 0.85455799f, 0.85296060f, 0.85135519f, 0.84974177f, 0.84812034f, 0.84649094f, 0.84485357f, 0.84320824f, 0.84155498f, 0.83989379f, 0.83822471f, 0.83654773f, 0.83486287f, 0.83317016f, 0.83146961f, 0.82976123f, 0.82804505f, 0.82632106f, 0.82458930f, 0.82284978f, 0.82110251f, 0.81934752f, 0.81758481f, 0.81581441f, 0.81403633f, 0.81225059f, 0.81045720f, 0.80865618f, 0.80684755f, 0.80503133f, 0.80320753f, 0.80137617f, 0.79953727f, 0.79769084f, 0.79583690f, 0.79397548f, 0.79210658f, 0.79023022f, 0.78834643f, 0.78645521f, 0.78455660f, 0.78265060f, 0.78073723f, 0.77881651f, 0.77688847f, 0.77495311f, 0.77301045f, 0.77106052f, 0.76910334f, 0.76713891f, 0.76516727f, 0.76318842f, 0.76120239f, 0.75920919f, 0.75720885f, 0.75520138f, 0.75318680f, 0.75116513f, 0.74913639f, 0.74710061f, 0.74505779f, 0.74300795f, 0.74095113f, 0.73888732f, 0.73681657f, 0.73473888f, 0.73265427f, 0.73056277f, 0.72846439f, 0.72635916f, 0.72424708f, 0.72212819f, 0.72000251f, 0.71787005f, 0.71573083f, 0.71358487f, 0.71143220f, 0.70927283f, 0.70710678f, 0.70493408f, 0.70275474f, 0.70056879f, 0.69837625f, 0.69617713f, 0.69397146f, 0.69175926f, 0.68954054f, 0.68731534f, 0.68508367f, 0.68284555f, 0.68060100f, 0.67835004f, 0.67609270f, 0.67382900f, 0.67155895f, 0.66928259f, 0.66699992f, 0.66471098f, 0.66241578f, 0.66011434f, 0.65780669f, 0.65549285f, 0.65317284f, 0.65084668f, 0.64851440f, 0.64617601f, 0.64383154f, 0.64148101f, 0.63912444f, 0.63676186f, 0.63439328f, 0.63201874f, 0.62963824f, 0.62725182f, 0.62485949f, 0.62246128f, 0.62005721f, 0.61764731f, 0.61523159f, 0.61281008f, 0.61038281f, 0.60794978f, 0.60551104f, 0.60306660f, 0.60061648f, 0.59816071f, 0.59569930f, 0.59323230f, 0.59075970f, 0.58828155f, 0.58579786f, 0.58330865f, 0.58081396f, 0.57831380f, 0.57580819f, 0.57329717f, 0.57078075f, 0.56825895f, 0.56573181f, 0.56319934f, 0.56066158f, 0.55811853f, 0.55557023f, 0.55301671f, 0.55045797f, 0.54789406f, 0.54532499f, 0.54275078f, 0.54017147f, 0.53758708f, 0.53499762f, 0.53240313f, 0.52980362f, 0.52719913f, 0.52458968f, 0.52197529f, 0.51935599f, 0.51673180f, 0.51410274f, 0.51146885f, 0.50883014f, 0.50618665f, 0.50353838f, 0.50088538f, 0.49822767f, 0.49556526f, 0.49289819f, 0.49022648f, 0.48755016f, 0.48486925f, 0.48218377f, 0.47949376f, 0.47679923f, 0.47410021f, 0.47139674f, 0.46868882f, 0.46597650f, 0.46325978f, 0.46053871f, 0.45781330f, 0.45508359f, 0.45234959f, 0.44961133f, 0.44686884f, 0.44412214f, 0.44137127f, 0.43861624f, 0.43585708f, 0.43309382f, 0.43032648f, 0.42755509f, 0.42477968f, 0.42200027f, 0.41921689f, 0.41642956f, 0.41363831f, 0.41084317f, 0.40804416f, 0.40524131f, 0.40243465f, 0.39962420f, 0.39680999f, 0.39399204f, 0.39117038f, 0.38834505f, 0.38551605f, 0.38268343f, 0.37984721f, 0.37700741f, 0.37416406f, 0.37131719f, 0.36846683f, 0.36561300f, 0.36275572f, 0.35989504f, 0.35703096f, 0.35416353f, 0.35129276f, 0.34841868f, 0.34554132f, 0.34266072f, 0.33977688f, 0.33688985f, 0.33399965f, 0.33110631f, 0.32820984f, 0.32531029f, 0.32240768f, 0.31950203f, 0.31659338f, 0.31368174f, 0.31076715f, 0.30784964f, 0.30492923f, 0.30200595f, 0.29907983f, 0.29615089f, 0.29321916f, 0.29028468f, 0.28734746f, 0.28440754f, 0.28146494f, 0.27851969f, 0.27557182f, 0.27262136f, 0.26966833f, 0.26671276f, 0.26375468f, 0.26079412f, 0.25783110f, 0.25486566f, 0.25189782f, 0.24892761f, 0.24595505f, 0.24298018f, 0.24000302f, 0.23702361f, 0.23404196f, 0.23105811f, 0.22807208f, 0.22508391f, 0.22209362f, 0.21910124f, 0.21610680f, 0.21311032f, 0.21011184f, 0.20711138f, 0.20410897f, 0.20110463f, 0.19809841f, 0.19509032f, 0.19208040f, 0.18906866f, 0.18605515f, 0.18303989f, 0.18002290f, 0.17700422f, 0.17398387f, 0.17096189f, 0.16793829f, 0.16491312f, 0.16188639f, 0.15885814f, 0.15582840f, 0.15279719f, 0.14976453f, 0.14673047f, 0.14369503f, 0.14065824f, 0.13762012f, 0.13458071f, 0.13154003f, 0.12849811f, 0.12545498f, 0.12241068f, 0.11936521f, 0.11631863f, 0.11327095f, 0.11022221f, 0.10717242f, 0.10412163f, 0.10106986f, 0.09801714f, 0.09496350f, 0.09190896f, 0.08885355f, 0.08579731f, 0.08274026f, 0.07968244f, 0.07662386f, 0.07356456f, 0.07050457f, 0.06744392f, 0.06438263f, 0.06132074f, 0.05825826f, 0.05519524f, 0.05213170f, 0.04906767f, 0.04600318f, 0.04293826f, 0.03987293f, 0.03680722f, 0.03374117f, 0.03067480f, 0.02760815f, 0.02454123f, 0.02147408f, 0.01840673f, 0.01533921f, 0.01227154f, 0.00920375f, 0.00613588f, 0.00306796f, 0.00000000f, -0.00306796f, -0.00613588f, -0.00920375f, -0.01227154f, -0.01533921f, -0.01840673f, -0.02147408f, -0.02454123f, -0.02760815f, -0.03067480f, -0.03374117f, -0.03680722f, -0.03987293f, -0.04293826f, -0.04600318f, -0.04906767f, -0.05213170f, -0.05519524f, -0.05825826f, -0.06132074f, -0.06438263f, -0.06744392f, -0.07050457f, -0.07356456f, -0.07662386f, -0.07968244f, -0.08274026f, -0.08579731f, -0.08885355f, -0.09190896f, -0.09496350f, -0.09801714f, -0.10106986f, -0.10412163f, -0.10717242f, -0.11022221f, -0.11327095f, -0.11631863f, -0.11936521f, -0.12241068f, -0.12545498f, -0.12849811f, -0.13154003f, -0.13458071f, -0.13762012f, -0.14065824f, -0.14369503f, -0.14673047f, -0.14976453f, -0.15279719f, -0.15582840f, -0.15885814f, -0.16188639f, -0.16491312f, -0.16793829f, -0.17096189f, -0.17398387f, -0.17700422f, -0.18002290f, -0.18303989f, -0.18605515f, -0.18906866f, -0.19208040f, -0.19509032f, -0.19809841f, -0.20110463f, -0.20410897f, -0.20711138f, -0.21011184f, -0.21311032f, -0.21610680f, -0.21910124f, -0.22209362f, -0.22508391f, -0.22807208f, -0.23105811f, -0.23404196f, -0.23702361f, -0.24000302f, -0.24298018f, -0.24595505f, -0.24892761f, -0.25189782f, -0.25486566f, -0.25783110f, -0.26079412f, -0.26375468f, -0.26671276f, -0.26966833f, -0.27262136f, -0.27557182f, -0.27851969f, -0.28146494f, -0.28440754f, -0.28734746f, -0.29028468f, -0.29321916f, -0.29615089f, -0.29907983f, -0.30200595f, -0.30492923f, -0.30784964f, -0.31076715f, -0.31368174f, -0.31659338f, -0.31950203f, -0.32240768f, -0.32531029f, -0.32820984f, -0.33110631f, -0.33399965f, -0.33688985f, -0.33977688f, -0.34266072f, -0.34554132f, -0.34841868f, -0.35129276f, -0.35416353f, -0.35703096f, -0.35989504f, -0.36275572f, -0.36561300f, -0.36846683f, -0.37131719f, -0.37416406f, -0.37700741f, -0.37984721f, -0.38268343f, -0.38551605f, -0.38834505f, -0.39117038f, -0.39399204f, -0.39680999f, -0.39962420f, -0.40243465f, -0.40524131f, -0.40804416f, -0.41084317f, -0.41363831f, -0.41642956f, -0.41921689f, -0.42200027f, -0.42477968f, -0.42755509f, -0.43032648f, -0.43309382f, -0.43585708f, -0.43861624f, -0.44137127f, -0.44412214f, -0.44686884f, -0.44961133f, -0.45234959f, -0.45508359f, -0.45781330f, -0.46053871f, -0.46325978f, -0.46597650f, -0.46868882f, -0.47139674f, -0.47410021f, -0.47679923f, -0.47949376f, -0.48218377f, -0.48486925f, -0.48755016f, -0.49022648f, -0.49289819f, -0.49556526f, -0.49822767f, -0.50088538f, -0.50353838f, -0.50618665f, -0.50883014f, -0.51146885f, -0.51410274f, -0.51673180f, -0.51935599f, -0.52197529f, -0.52458968f, -0.52719913f, -0.52980362f, -0.53240313f, -0.53499762f, -0.53758708f, -0.54017147f, -0.54275078f, -0.54532499f, -0.54789406f, -0.55045797f, -0.55301671f, -0.55557023f, -0.55811853f, -0.56066158f, -0.56319934f, -0.56573181f, -0.56825895f, -0.57078075f, -0.57329717f, -0.57580819f, -0.57831380f, -0.58081396f, -0.58330865f, -0.58579786f, -0.58828155f, -0.59075970f, -0.59323230f, -0.59569930f, -0.59816071f, -0.60061648f, -0.60306660f, -0.60551104f, -0.60794978f, -0.61038281f, -0.61281008f, -0.61523159f, -0.61764731f, -0.62005721f, -0.62246128f, -0.62485949f, -0.62725182f, -0.62963824f, -0.63201874f, -0.63439328f, -0.63676186f, -0.63912444f, -0.64148101f, -0.64383154f, -0.64617601f, -0.64851440f, -0.65084668f, -0.65317284f, -0.65549285f, -0.65780669f, -0.66011434f, -0.66241578f, -0.66471098f, -0.66699992f, -0.66928259f, -0.67155895f, -0.67382900f, -0.67609270f, -0.67835004f, -0.68060100f, -0.68284555f, -0.68508367f, -0.68731534f, -0.68954054f, -0.69175926f, -0.69397146f, -0.69617713f, -0.69837625f, -0.70056879f, -0.70275474f, -0.70493408f, -0.70710678f, -0.70927283f, -0.71143220f, -0.71358487f, -0.71573083f, -0.71787005f, -0.72000251f, -0.72212819f, -0.72424708f, -0.72635916f, -0.72846439f, -0.73056277f, -0.73265427f, -0.73473888f, -0.73681657f, -0.73888732f, -0.74095113f, -0.74300795f, -0.74505779f, -0.74710061f, -0.74913639f, -0.75116513f, -0.75318680f, -0.75520138f, -0.75720885f, -0.75920919f, -0.76120239f, -0.76318842f, -0.76516727f, -0.76713891f, -0.76910334f, -0.77106052f, -0.77301045f, -0.77495311f, -0.77688847f, -0.77881651f, -0.78073723f, -0.78265060f, -0.78455660f, -0.78645521f, -0.78834643f, -0.79023022f, -0.79210658f, -0.79397548f, -0.79583690f, -0.79769084f, -0.79953727f, -0.80137617f, -0.80320753f, -0.80503133f, -0.80684755f, -0.80865618f, -0.81045720f, -0.81225059f, -0.81403633f, -0.81581441f, -0.81758481f, -0.81934752f, -0.82110251f, -0.82284978f, -0.82458930f, -0.82632106f, -0.82804505f, -0.82976123f, -0.83146961f, -0.83317016f, -0.83486287f, -0.83654773f, -0.83822471f, -0.83989379f, -0.84155498f, -0.84320824f, -0.84485357f, -0.84649094f, -0.84812034f, -0.84974177f, -0.85135519f, -0.85296060f, -0.85455799f, -0.85614733f, -0.85772861f, -0.85930182f, -0.86086694f, -0.86242396f, -0.86397286f, -0.86551362f, -0.86704625f, -0.86857071f, -0.87008699f, -0.87159509f, -0.87309498f, -0.87458665f, -0.87607009f, -0.87754529f, -0.87901223f, -0.88047089f, -0.88192126f, -0.88336334f, -0.88479710f, -0.88622253f, -0.88763962f, -0.88904836f, -0.89044872f, -0.89184071f, -0.89322430f, -0.89459949f, -0.89596625f, -0.89732458f, -0.89867447f, -0.90001589f, -0.90134885f, -0.90267332f, -0.90398929f, -0.90529676f, -0.90659570f, -0.90788612f, -0.90916798f, -0.91044129f, -0.91170603f, -0.91296219f, -0.91420976f, -0.91544872f, -0.91667906f, -0.91790078f, -0.91911385f, -0.92031828f, -0.92151404f, -0.92270113f, -0.92387953f, -0.92504924f, -0.92621024f, -0.92736253f, -0.92850608f, -0.92964090f, -0.93076696f, -0.93188427f, -0.93299280f, -0.93409255f, -0.93518351f, -0.93626567f, -0.93733901f, -0.93840353f, -0.93945922f, -0.94050607f, -0.94154407f, -0.94257320f, -0.94359346f, -0.94460484f, -0.94560733f, -0.94660091f, -0.94758559f, -0.94856135f, -0.94952818f, -0.95048607f, -0.95143502f, -0.95237501f, -0.95330604f, -0.95422810f, -0.95514117f, -0.95604525f, -0.95694034f, -0.95782641f, -0.95870347f, -0.95957151f, -0.96043052f, -0.96128049f, -0.96212140f, -0.96295327f, -0.96377607f, -0.96458979f, -0.96539444f, -0.96619000f, -0.96697647f, -0.96775384f, -0.96852209f, -0.96928124f, -0.97003125f, -0.97077214f, -0.97150389f, -0.97222650f, -0.97293995f, -0.97364425f, -0.97433938f, -0.97502535f, -0.97570213f, -0.97636973f, -0.97702814f, -0.97767736f, -0.97831737f, -0.97894818f, -0.97956977f, -0.98018214f, -0.98078528f, -0.98137919f, -0.98196387f, -0.98253930f, -0.98310549f, -0.98366242f, -0.98421009f, -0.98474850f, -0.98527764f, -0.98579751f, -0.98630810f, -0.98680940f, -0.98730142f, -0.98778414f, -0.98825757f, -0.98872169f, -0.98917651f, -0.98962202f, -0.99005821f, -0.99048508f, -0.99090264f, -0.99131086f, -0.99170975f, -0.99209931f, -0.99247953f, -0.99285041f, -0.99321195f, -0.99356414f, -0.99390697f, -0.99424045f, -0.99456457f, -0.99487933f, -0.99518473f, -0.99548076f, -0.99576741f, -0.99604470f, -0.99631261f, -0.99657115f, -0.99682030f, -0.99706007f, -0.99729046f, -0.99751146f, -0.99772307f, -0.99792529f, -0.99811811f, -0.99830154f, -0.99847558f, -0.99864022f, -0.99879546f, -0.99894129f, -0.99907773f, -0.99920476f, -0.99932238f, -0.99943060f, -0.99952942f, -0.99961882f, -0.99969882f, -0.99976941f, -0.99983058f, -0.99988235f, -0.99992470f, -0.99995764f, -0.99998118f, -0.99999529f, -1.00000000f, -0.99999529f, -0.99998118f, -0.99995764f, -0.99992470f, -0.99988235f, -0.99983058f, -0.99976941f, -0.99969882f, -0.99961882f, -0.99952942f, -0.99943060f, -0.99932238f, -0.99920476f, -0.99907773f, -0.99894129f, -0.99879546f, -0.99864022f, -0.99847558f, -0.99830154f, -0.99811811f, -0.99792529f, -0.99772307f, -0.99751146f, -0.99729046f, -0.99706007f, -0.99682030f, -0.99657115f, -0.99631261f, -0.99604470f, -0.99576741f, -0.99548076f, -0.99518473f, -0.99487933f, -0.99456457f, -0.99424045f, -0.99390697f, -0.99356414f, -0.99321195f, -0.99285041f, -0.99247953f, -0.99209931f, -0.99170975f, -0.99131086f, -0.99090264f, -0.99048508f, -0.99005821f, -0.98962202f, -0.98917651f, -0.98872169f, -0.98825757f, -0.98778414f, -0.98730142f, -0.98680940f, -0.98630810f, -0.98579751f, -0.98527764f, -0.98474850f, -0.98421009f, -0.98366242f, -0.98310549f, -0.98253930f, -0.98196387f, -0.98137919f, -0.98078528f, -0.98018214f, -0.97956977f, -0.97894818f, -0.97831737f, -0.97767736f, -0.97702814f, -0.97636973f, -0.97570213f, -0.97502535f, -0.97433938f, -0.97364425f, -0.97293995f, -0.97222650f, -0.97150389f, -0.97077214f, -0.97003125f, -0.96928124f, -0.96852209f, -0.96775384f, -0.96697647f, -0.96619000f, -0.96539444f, -0.96458979f, -0.96377607f, -0.96295327f, -0.96212140f, -0.96128049f, -0.96043052f, -0.95957151f, -0.95870347f, -0.95782641f, -0.95694034f, -0.95604525f, -0.95514117f, -0.95422810f, -0.95330604f, -0.95237501f, -0.95143502f, -0.95048607f, -0.94952818f, -0.94856135f, -0.94758559f, -0.94660091f, -0.94560733f, -0.94460484f, -0.94359346f, -0.94257320f, -0.94154407f, -0.94050607f, -0.93945922f, -0.93840353f, -0.93733901f, -0.93626567f, -0.93518351f, -0.93409255f, -0.93299280f, -0.93188427f, -0.93076696f, -0.92964090f, -0.92850608f, -0.92736253f, -0.92621024f, -0.92504924f, -0.92387953f, -0.92270113f, -0.92151404f, -0.92031828f, -0.91911385f, -0.91790078f, -0.91667906f, -0.91544872f, -0.91420976f, -0.91296219f, -0.91170603f, -0.91044129f, -0.90916798f, -0.90788612f, -0.90659570f, -0.90529676f, -0.90398929f, -0.90267332f, -0.90134885f, -0.90001589f, -0.89867447f, -0.89732458f, -0.89596625f, -0.89459949f, -0.89322430f, -0.89184071f, -0.89044872f, -0.88904836f, -0.88763962f, -0.88622253f, -0.88479710f, -0.88336334f, -0.88192126f, -0.88047089f, -0.87901223f, -0.87754529f, -0.87607009f, -0.87458665f, -0.87309498f, -0.87159509f, -0.87008699f, -0.86857071f, -0.86704625f, -0.86551362f, -0.86397286f, -0.86242396f, -0.86086694f, -0.85930182f, -0.85772861f, -0.85614733f, -0.85455799f, -0.85296060f, -0.85135519f, -0.84974177f, -0.84812034f, -0.84649094f, -0.84485357f, -0.84320824f, -0.84155498f, -0.83989379f, -0.83822471f, -0.83654773f, -0.83486287f, -0.83317016f, -0.83146961f, -0.82976123f, -0.82804505f, -0.82632106f, -0.82458930f, -0.82284978f, -0.82110251f, -0.81934752f, -0.81758481f, -0.81581441f, -0.81403633f, -0.81225059f, -0.81045720f, -0.80865618f, -0.80684755f, -0.80503133f, -0.80320753f, -0.80137617f, -0.79953727f, -0.79769084f, -0.79583690f, -0.79397548f, -0.79210658f, -0.79023022f, -0.78834643f, -0.78645521f, -0.78455660f, -0.78265060f, -0.78073723f, -0.77881651f, -0.77688847f, -0.77495311f, -0.77301045f, -0.77106052f, -0.76910334f, -0.76713891f, -0.76516727f, -0.76318842f, -0.76120239f, -0.75920919f, -0.75720885f, -0.75520138f, -0.75318680f, -0.75116513f, -0.74913639f, -0.74710061f, -0.74505779f, -0.74300795f, -0.74095113f, -0.73888732f, -0.73681657f, -0.73473888f, -0.73265427f, -0.73056277f, -0.72846439f, -0.72635916f, -0.72424708f, -0.72212819f, -0.72000251f, -0.71787005f, -0.71573083f, -0.71358487f, -0.71143220f, -0.70927283f, -0.70710678f, -0.70493408f, -0.70275474f, -0.70056879f, -0.69837625f, -0.69617713f, -0.69397146f, -0.69175926f, -0.68954054f, -0.68731534f, -0.68508367f, -0.68284555f, -0.68060100f, -0.67835004f, -0.67609270f, -0.67382900f, -0.67155895f, -0.66928259f, -0.66699992f, -0.66471098f, -0.66241578f, -0.66011434f, -0.65780669f, -0.65549285f, -0.65317284f, -0.65084668f, -0.64851440f, -0.64617601f, -0.64383154f, -0.64148101f, -0.63912444f, -0.63676186f, -0.63439328f, -0.63201874f, -0.62963824f, -0.62725182f, -0.62485949f, -0.62246128f, -0.62005721f, -0.61764731f, -0.61523159f, -0.61281008f, -0.61038281f, -0.60794978f, -0.60551104f, -0.60306660f, -0.60061648f, -0.59816071f, -0.59569930f, -0.59323230f, -0.59075970f, -0.58828155f, -0.58579786f, -0.58330865f, -0.58081396f, -0.57831380f, -0.57580819f, -0.57329717f, -0.57078075f, -0.56825895f, -0.56573181f, -0.56319934f, -0.56066158f, -0.55811853f, -0.55557023f, -0.55301671f, -0.55045797f, -0.54789406f, -0.54532499f, -0.54275078f, -0.54017147f, -0.53758708f, -0.53499762f, -0.53240313f, -0.52980362f, -0.52719913f, -0.52458968f, -0.52197529f, -0.51935599f, -0.51673180f, -0.51410274f, -0.51146885f, -0.50883014f, -0.50618665f, -0.50353838f, -0.50088538f, -0.49822767f, -0.49556526f, -0.49289819f, -0.49022648f, -0.48755016f, -0.48486925f, -0.48218377f, -0.47949376f, -0.47679923f, -0.47410021f, -0.47139674f, -0.46868882f, -0.46597650f, -0.46325978f, -0.46053871f, -0.45781330f, -0.45508359f, -0.45234959f, -0.44961133f, -0.44686884f, -0.44412214f, -0.44137127f, -0.43861624f, -0.43585708f, -0.43309382f, -0.43032648f, -0.42755509f, -0.42477968f, -0.42200027f, -0.41921689f, -0.41642956f, -0.41363831f, -0.41084317f, -0.40804416f, -0.40524131f, -0.40243465f, -0.39962420f, -0.39680999f, -0.39399204f, -0.39117038f, -0.38834505f, -0.38551605f, -0.38268343f, -0.37984721f, -0.37700741f, -0.37416406f, -0.37131719f, -0.36846683f, -0.36561300f, -0.36275572f, -0.35989504f, -0.35703096f, -0.35416353f, -0.35129276f, -0.34841868f, -0.34554132f, -0.34266072f, -0.33977688f, -0.33688985f, -0.33399965f, -0.33110631f, -0.32820984f, -0.32531029f, -0.32240768f, -0.31950203f, -0.31659338f, -0.31368174f, -0.31076715f, -0.30784964f, -0.30492923f, -0.30200595f, -0.29907983f, -0.29615089f, -0.29321916f, -0.29028468f, -0.28734746f, -0.28440754f, -0.28146494f, -0.27851969f, -0.27557182f, -0.27262136f, -0.26966833f, -0.26671276f, -0.26375468f, -0.26079412f, -0.25783110f, -0.25486566f, -0.25189782f, -0.24892761f, -0.24595505f, -0.24298018f, -0.24000302f, -0.23702361f, -0.23404196f, -0.23105811f, -0.22807208f, -0.22508391f, -0.22209362f, -0.21910124f, -0.21610680f, -0.21311032f, -0.21011184f, -0.20711138f, -0.20410897f, -0.20110463f, -0.19809841f, -0.19509032f, -0.19208040f, -0.18906866f, -0.18605515f, -0.18303989f, -0.18002290f, -0.17700422f, -0.17398387f, -0.17096189f, -0.16793829f, -0.16491312f, -0.16188639f, -0.15885814f, -0.15582840f, -0.15279719f, -0.14976453f, -0.14673047f, -0.14369503f, -0.14065824f, -0.13762012f, -0.13458071f, -0.13154003f, -0.12849811f, -0.12545498f, -0.12241068f, -0.11936521f, -0.11631863f, -0.11327095f, -0.11022221f, -0.10717242f, -0.10412163f, -0.10106986f, -0.09801714f, -0.09496350f, -0.09190896f, -0.08885355f, -0.08579731f, -0.08274026f, -0.07968244f, -0.07662386f, -0.07356456f, -0.07050457f, -0.06744392f, -0.06438263f, -0.06132074f, -0.05825826f, -0.05519524f, -0.05213170f, -0.04906767f, -0.04600318f, -0.04293826f, -0.03987293f, -0.03680722f, -0.03374117f, -0.03067480f, -0.02760815f, -0.02454123f, -0.02147408f, -0.01840673f, -0.01533921f, -0.01227154f, -0.00920375f, -0.00613588f, -0.00306796f }; int32_t dds_phase_ratef(float frequency) { return (int32_t) (frequency*65536.0f*65536.0f/SAMPLE_RATE); } /*- End of function --------------------------------------------------------*/ float dds_frequencyf(int32_t phase_rate) { return (float) phase_rate*(float) SAMPLE_RATE/(65536.0f*65536.0f); } /*- End of function --------------------------------------------------------*/ float dds_scaling_dbm0f(float level) { return powf(10.0f, (level - DBM0_MAX_SINE_POWER)/20.0f)*32767.0f; } /*- End of function --------------------------------------------------------*/ float dds_scaling_dbovf(float level) { return powf(10.0f, (level - DBOV_MAX_SINE_POWER)/20.0f)*32767.0f; } /*- End of function --------------------------------------------------------*/ void dds_advancef(uint32_t *phase_acc, int32_t phase_rate) { *phase_acc += phase_rate; } /*- End of function --------------------------------------------------------*/ float ddsf(uint32_t *phase_acc, int32_t phase_rate) { float amp; amp = sine_table[*phase_acc >> (32 - SLENK)]; *phase_acc += phase_rate; return amp; } /*- End of function --------------------------------------------------------*/ float dds_lookupf(uint32_t phase) { return sine_table[phase >> (32 - SLENK)]; } /*- End of function --------------------------------------------------------*/ float dds_modf(uint32_t *phase_acc, int32_t phase_rate, float scale, int32_t phase) { float amp; amp = sine_table[*(phase_acc + phase) >> (32 - SLENK)]*scale; *phase_acc += phase_rate; return amp; } /*- End of function --------------------------------------------------------*/ complexf_t dds_complexf(uint32_t *phase_acc, int32_t phase_rate) { complexf_t amp; amp = complex_setf(sine_table[(*phase_acc + (1 << 30)) >> (32 - SLENK)], sine_table[*phase_acc >> (32 - SLENK)]); *phase_acc += phase_rate; return amp; } /*- End of function --------------------------------------------------------*/ complexf_t dds_lookup_complexf(uint32_t phase) { return complex_setf(sine_table[(phase + (1 << 30)) >> (32 - SLENK)], sine_table[phase >> (32 - SLENK)]); } /*- End of function --------------------------------------------------------*/ complexf_t dds_complex_modf(uint32_t *phase_acc, int32_t phase_rate, float scale, int32_t phase) { complexf_t amp; amp = complex_setf(sine_table[(*phase_acc + phase + (1 << 30)) >> (32 - SLENK)]*scale, sine_table[(*phase_acc + phase) >> (32 - SLENK)]*scale); *phase_acc += phase_rate; return amp; } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/v22bis_rx_2400_fixed_rrc.h0000644000175000017500000003306711150047216022351 0ustar julienjulien#define RX_PULSESHAPER_2400_GAIN 32767.000000f #define RX_PULSESHAPER_2400_COEFF_SETS 12 static const complexi16_t rx_pulseshaper_2400[RX_PULSESHAPER_2400_COEFF_SETS][37] = { { { 0, 0}, /* Filter 0 */ { -106, 77}, { -62, -191}, { 257, 0}, { -89, 275}, { -229, -166}, { 183, -133}, { 34, 106}, { 65, 0}, { -94, 292}, { -490, -356}, { 768, -558}, { 409, 1259}, { -1705, 0}, { 640, -1971}, { 1943, 1411}, { -2160, 1569}, { -884, -2721}, { 2960, 0}, { -914, 2815}, { -2314, -1681}, { 2160, -1569}, { 742, 2284}, { -2072, 0}, { 527, -1622}, { 1071, 778}, { -768, 558}, { -187, -576}, { 307, 0}, { -20, 62}, { 90, 66}, { -183, 133}, { -87, -269}, { 289, 0}, { -79, 245}, { -162, -118}, { 106, -77} }, { { 0, 0}, /* Filter 1 */ { -111, 81}, { -63, -196}, { 261, 0}, { -89, 276}, { -227, -164}, { 177, -129}, { 30, 95}, { 83, 0}, { -102, 314}, { -512, -372}, { 793, -576}, { 418, 1289}, { -1737, 0}, { 649, -1999}, { 1963, 1426}, { -2176, 1581}, { -887, -2732}, { 2964, 0}, { -913, 2811}, { -2304, -1674}, { 2144, -1558}, { 734, 2260}, { -2043, 0}, { 517, -1592}, { 1045, 759}, { -744, 541}, { -179, -550}, { 284, 0}, { -15, 46}, { 100, 73}, { -189, 137}, { -88, -271}, { 288, 0}, { -78, 241}, { -158, -114}, { 102, -74} }, { { 0, 0}, /* Filter 2 */ { -116, 84}, { -65, -201}, { 265, 0}, { -90, 277}, { -224, -163}, { 171, -124}, { 26, 82}, { 101, 0}, { -109, 336}, { -534, -388}, { 818, -594}, { 428, 1319}, { -1768, 0}, { 658, -2026}, { 1983, 1440}, { -2191, 1592}, { -891, -2743}, { 2967, 0}, { -911, 2806}, { -2294, -1666}, { 2128, -1546}, { 726, 2235}, { -2013, 0}, { 507, -1561}, { 1019, 740}, { -720, 523}, { -170, -525}, { 262, 0}, { -9, 30}, { 109, 79}, { -194, 141}, { -88, -273}, { 286, 0}, { -77, 237}, { -153, -111}, { 97, -70} }, { { 0, 0}, /* Filter 3 */ { -121, 88}, { -66, -206}, { 268, 0}, { -90, 277}, { -221, -161}, { 165, -120}, { 22, 70}, { 120, 0}, { -116, 358}, { -557, -404}, { 842, -612}, { 438, 1349}, { -1799, 0}, { 667, -2053}, { 2002, 1455}, { -2205, 1602}, { -894, -2753}, { 2969, 0}, { -909, 2800}, { -2283, -1658}, { 2111, -1534}, { 718, 2210}, { -1983, 0}, { 497, -1531}, { 994, 722}, { -696, 506}, { -162, -500}, { 241, 0}, { -4, 14}, { 118, 86}, { -199, 144}, { -89, -274}, { 284, 0}, { -75, 233}, { -149, -108}, { 92, -67} }, { { 0, 0}, /* Filter 4 */ { -125, 91}, { -68, -210}, { 271, 0}, { -90, 278}, { -218, -159}, { 158, -115}, { 18, 57}, { 139, 0}, { -123, 381}, { -579, -421}, { 867, -630}, { 448, 1380}, { -1830, 0}, { 676, -2080}, { 2021, 1468}, { -2219, 1612}, { -897, -2762}, { 2971, 0}, { -907, 2794}, { -2271, -1650}, { 2094, -1521}, { 710, 2185}, { -1953, 0}, { 487, -1501}, { 968, 703}, { -672, 488}, { -154, -476}, { 220, 0}, { 0, 0}, { 127, 92}, { -203, 148}, { -89, -276}, { 282, 0}, { -74, 229}, { -144, -105}, { 87, -63} }, { { 0, 0}, /* Filter 5 */ { -130, 94}, { -70, -215}, { 274, 0}, { -90, 277}, { -215, -156}, { 151, -109}, { 14, 43}, { 159, 0}, { -131, 404}, { -602, -437}, { 892, -648}, { 458, 1410}, { -1861, 0}, { 684, -2107}, { 2040, 1482}, { -2233, 1622}, { -900, -2771}, { 2972, 0}, { -905, 2787}, { -2259, -1641}, { 2077, -1509}, { 701, 2159}, { -1923, 0}, { 478, -1471}, { 943, 685}, { -649, 471}, { -146, -452}, { 199, 0}, { 5, -15}, { 135, 98}, { -208, 151}, { -90, -277}, { 280, 0}, { -73, 224}, { -139, -101}, { 83, -60} }, { { 0, 0}, /* Filter 6 */ { -135, 98}, { -71, -220}, { 277, 0}, { -90, 277}, { -212, -154}, { 143, -104}, { 9, 29}, { 178, 0}, { -139, 428}, { -625, -454}, { 918, -667}, { 468, 1440}, { -1892, 0}, { 693, -2133}, { 2059, 1495}, { -2246, 1632}, { -903, -2779}, { 2972, 0}, { -903, 2779}, { -2246, -1632}, { 2059, -1495}, { 693, 2133}, { -1892, 0}, { 468, -1440}, { 918, 667}, { -625, 454}, { -139, -428}, { 178, 0}, { 9, -29}, { 143, 104}, { -212, 154}, { -90, -277}, { 277, 0}, { -71, 220}, { -135, -98}, { 78, -57} }, { { 0, 0}, /* Filter 7 */ { -139, 101}, { -73, -224}, { 280, 0}, { -90, 277}, { -208, -151}, { 135, -98}, { 5, 15}, { 199, 0}, { -146, 452}, { -649, -471}, { 943, -685}, { 478, 1471}, { -1923, 0}, { 701, -2159}, { 2077, 1509}, { -2259, 1641}, { -905, -2787}, { 2972, 0}, { -900, 2771}, { -2233, -1622}, { 2040, -1482}, { 684, 2107}, { -1861, 0}, { 458, -1410}, { 892, 648}, { -602, 437}, { -131, -404}, { 159, 0}, { 14, -43}, { 151, 109}, { -215, 156}, { -90, -277}, { 274, 0}, { -70, 215}, { -130, -94}, { 73, -53} }, { { 0, 0}, /* Filter 8 */ { -144, 105}, { -74, -229}, { 282, 0}, { -89, 276}, { -203, -148}, { 127, -92}, { 0, 0}, { 220, 0}, { -154, 476}, { -672, -488}, { 968, -703}, { 487, 1501}, { -1953, 0}, { 710, -2185}, { 2094, 1521}, { -2271, 1650}, { -907, -2794}, { 2971, 0}, { -897, 2762}, { -2219, -1612}, { 2021, -1468}, { 676, 2080}, { -1830, 0}, { 448, -1380}, { 867, 630}, { -579, 421}, { -123, -381}, { 139, 0}, { 18, -57}, { 158, 115}, { -218, 159}, { -90, -278}, { 271, 0}, { -68, 210}, { -125, -91}, { 69, -50} }, { { 0, 0}, /* Filter 9 */ { -149, 108}, { -75, -233}, { 284, 0}, { -89, 274}, { -199, -144}, { 118, -86}, { -4, -14}, { 241, 0}, { -162, 500}, { -696, -506}, { 994, -722}, { 497, 1531}, { -1983, 0}, { 718, -2210}, { 2111, 1534}, { -2283, 1658}, { -909, -2800}, { 2969, 0}, { -894, 2753}, { -2205, -1602}, { 2002, -1455}, { 667, 2053}, { -1799, 0}, { 438, -1349}, { 842, 612}, { -557, 404}, { -116, -358}, { 120, 0}, { 22, -70}, { 165, 120}, { -221, 161}, { -90, -277}, { 268, 0}, { -66, 206}, { -121, -88}, { 64, -46} }, { { 0, 0}, /* Filter 10 */ { -153, 111}, { -77, -237}, { 286, 0}, { -88, 273}, { -194, -141}, { 109, -79}, { -9, -30}, { 262, 0}, { -170, 525}, { -720, -523}, { 1019, -740}, { 507, 1561}, { -2013, 0}, { 726, -2235}, { 2128, 1546}, { -2294, 1666}, { -911, -2806}, { 2967, 0}, { -891, 2743}, { -2191, -1592}, { 1983, -1440}, { 658, 2026}, { -1768, 0}, { 428, -1319}, { 818, 594}, { -534, 388}, { -109, -336}, { 101, 0}, { 26, -82}, { 171, 124}, { -224, 163}, { -90, -277}, { 265, 0}, { -65, 201}, { -116, -84}, { 59, -43} }, { { 0, 0}, /* Filter 11 */ { -158, 114}, { -78, -241}, { 288, 0}, { -88, 271}, { -189, -137}, { 100, -73}, { -15, -46}, { 284, 0}, { -179, 550}, { -744, -541}, { 1045, -759}, { 517, 1592}, { -2043, 0}, { 734, -2260}, { 2144, 1558}, { -2304, 1674}, { -913, -2811}, { 2964, 0}, { -887, 2732}, { -2176, -1581}, { 1963, -1426}, { 649, 1999}, { -1737, 0}, { 418, -1289}, { 793, 576}, { -512, 372}, { -102, -314}, { 83, 0}, { 30, -95}, { 177, 129}, { -227, 164}, { -89, -276}, { 261, 0}, { -63, 196}, { -111, -81}, { 55, -40} } }; iaxmodem-1.2.0/lib/spandsp/src/testcpuid.c0000644000175000017500000001317011150047216020027 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * testcpuid.c - Check the CPU type, to identify special features, like SSE. * * Written by Steve Underwood * Stitched together from bits of testing code found here and there * * Copyright (C) 2004 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: testcpuid.c,v 1.12 2008/05/13 13:17:24 steveu Exp $ */ /*! \file */ #if defined(HAVE_CONFIG_H) #include #endif #include /* Make this file just disappear if we are not on an x86 machine */ #if defined(__i386__) // || defined(__x86_64__) #define X86_EFLAGS_CF 0x00000001 /* Carry Flag */ #define X86_EFLAGS_PF 0x00000004 /* Parity Flag */ #define X86_EFLAGS_AF 0x00000010 /* Auxillary carry Flag */ #define X86_EFLAGS_ZF 0x00000040 /* Zero Flag */ #define X86_EFLAGS_SF 0x00000080 /* Sign Flag */ #define X86_EFLAGS_TF 0x00000100 /* Trap Flag */ #define X86_EFLAGS_IF 0x00000200 /* Interrupt Flag */ #define X86_EFLAGS_DF 0x00000400 /* Direction Flag */ #define X86_EFLAGS_OF 0x00000800 /* Overflow Flag */ #define X86_EFLAGS_IOPL 0x00003000 /* IOPL mask */ #define X86_EFLAGS_NT 0x00004000 /* Nested Task */ #define X86_EFLAGS_RF 0x00010000 /* Resume Flag */ #define X86_EFLAGS_VM 0x00020000 /* Virtual Mode */ #define X86_EFLAGS_AC 0x00040000 /* Alignment Check */ #define X86_EFLAGS_VIF 0x00080000 /* Virtual Interrupt Flag */ #define X86_EFLAGS_VIP 0x00100000 /* Virtual Interrupt Pending */ #define X86_EFLAGS_ID 0x00200000 /* CPUID detection flag */ /* Standard macro to see if a specific flag is changeable */ static __inline__ int flag_is_changeable_p(uint32_t flag) { uint32_t f1; uint32_t f2; __asm__ __volatile__ ( " pushfl\n" " pushfl\n" " popl %0\n" " movl %0,%1\n" " xorl %2,%0\n" " pushl %0\n" " popfl\n" " pushfl\n" " popl %0\n" " popfl\n" : "=&r" (f1), "=&r" (f2) : "ir" (flag)); return ((f1^f2) & flag) != 0; } /*- End of function --------------------------------------------------------*/ /* Probe for the CPUID instruction */ static int have_cpuid_p(void) { return flag_is_changeable_p(X86_EFLAGS_ID); } /*- End of function --------------------------------------------------------*/ int has_MMX(void) { int result; if (!have_cpuid_p()) return 0; /*endif*/ __asm__ __volatile__ ( " push %%ebx;\n" " mov $1,%%eax;\n" " cpuid;\n" " xor %%eax,%%eax;\n" " test $0x800000,%%edx;\n" " jz 1f;\n" /* no MMX support */ " inc %%eax;\n" /* MMX support */ "1:\n" " pop %%ebx;\n" : "=a" (result) : : "ecx", "edx"); return result; } /*- End of function --------------------------------------------------------*/ int has_SIMD(void) { int result; if (!have_cpuid_p()) return 0; /*endif*/ __asm__ __volatile__ ( " push %%ebx;\n" " mov $1,%%eax;\n" " cpuid;\n" " xor %%eax,%%eax;\n" " test $0x02000000,%%edx;\n" " jz 1f;\n" /* no SIMD support */ " inc %%eax;\n" /* SIMD support */ "1:\n" " pop %%ebx;\n" : "=a" (result) : : "ecx", "edx"); return result; } /*- End of function --------------------------------------------------------*/ int has_SIMD2(void) { int result; if (!have_cpuid_p()) return 0; /*endif*/ __asm__ __volatile__ ( " push %%ebx;\n" " mov $1,%%eax;\n" " cpuid;\n" " xor %%eax,%%eax;\n" " test $0x04000000,%%edx;\n" " jz 1f;\n" /* no SIMD2 support */ " inc %%eax;\n" /* SIMD2 support */ "1:\n" " pop %%ebx;\n" : "=a" (result) : : "ecx", "edx"); return result; } /*- End of function --------------------------------------------------------*/ int has_3DNow(void) { int result; if (!have_cpuid_p()) return 0; /*endif*/ __asm__ __volatile__ ( " push %%ebx;\n" " mov $0x80000000,%%eax;\n" " cpuid;\n" " xor %%ecx,%%ecx;\n" " cmp $0x80000000,%%eax;\n" " jbe 1f;\n" /* no extended MSR(1), so no 3DNow! */ " mov $0x80000001,%%eax;\n" " cpuid;\n" " xor %%ecx,%%ecx;\n" " test $0x80000000,%%edx;\n" " jz 1f;\n" /* no 3DNow! support */ " inc %%ecx;\n" /* 3DNow! support */ "1:\n" " pop %%ebx;\n" : "=c" (result) : : "eax", "edx"); return result; } /*- End of function --------------------------------------------------------*/ #if defined(TESTBED) int main(int argc, char *argv[]) { int result; result = has_MMX(); printf("MMX is %x\n", result); result = has_SIMD(); printf("SIMD is %x\n", result); result = has_SIMD2(); printf("SIMD2 is %x\n", result); result = has_3DNow(); printf("3DNow is %x\n", result); return 0; } /*- End of function --------------------------------------------------------*/ #endif #endif /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/gsm0610_rpe.c0000644000175000017500000003373611150047216020000 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * gsm0610_rpe.c - GSM 06.10 full rate speech codec. * * Written by Steve Underwood * * Copyright (C) 2006 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * This code is based on the widely used GSM 06.10 code available from * http://kbs.cs.tu-berlin.de/~jutta/toast.html * * $Id: gsm0610_rpe.c,v 1.21 2008/07/02 14:48:25 steveu Exp $ */ /*! \file */ #if defined(HAVE_CONFIG_H) #include #endif #include #include #include "floating_fudge.h" #if defined(HAVE_TGMATH_H) #include #endif #if defined(HAVE_MATH_H) #include #endif #include #include "spandsp/telephony.h" #include "spandsp/bitstream.h" #include "spandsp/dc_restore.h" #include "spandsp/gsm0610.h" #include "gsm0610_local.h" /* 4.2.13 .. 4.2.17 RPE ENCODING SECTION */ /* 4.2.13 */ static void weighting_filter(const int16_t *e, // signal [-5..0.39.44] IN int16_t x[40]) { #if defined(__GNUC__) && defined(__i386__) /* Table 4.4 Coefficients of the weighting filter */ /* This must be padded to a multiple of 4 for MMX to work */ static const union { int16_t gsm_H[12]; uint64_t x[3]; } gsm_H = { { -134, -374, 0, 2054, 5741, 8192, 5741, 2054, 0, -374, -134, 0 } }; __asm__ __volatile__( " emms;\n" " addl $-10,%%ecx;\n" " movl $0x1000,%%eax;\n" " movd %%eax,%%mm5;\n" /* for rounding */ " movq %[gsm_H],%%mm1;\n" " movq %[gsm_H8],%%mm2;\n" " movq %[gsm_H16],%%mm3;\n" " xorl %%esi,%%esi;\n" " .p2align 2;\n" "1:;\n" " movq (%%ecx,%%esi,2),%%mm0;\n" " pmaddwd %%mm1,%%mm0;\n" " movq 8(%%ecx,%%esi,2),%%mm4;\n" " pmaddwd %%mm2,%%mm4;\n" " paddd %%mm4,%%mm0;\n" " movq 16(%%ecx,%%esi,2),%%mm4;\n" " pmaddwd %%mm3,%%mm4;\n" " paddd %%mm4,%%mm0;\n" " movq %%mm0,%%mm4;\n" " punpckhdq %%mm0,%%mm4;\n" /* mm4 has high int32 of mm0 dup'd */ " paddd %%mm4,%%mm0;\n" " paddd %%mm5,%%mm0;\n" /* Add for roundoff */ " psrad $13,%%mm0;\n" " packssdw %%mm0,%%mm0;\n" " movd %%mm0,%%eax;\n" /* eax has result */ " movw %%ax,(%%edi,%%esi,2);\n" " incl %%esi;\n" " cmpl $39,%%esi;\n" " jle 1b;\n" " emms;\n" : : "c" (e), "D" (x), [gsm_H] "X" (gsm_H.x[0]), [gsm_H8] "X" (gsm_H.x[1]), [gsm_H16] "X" (gsm_H.x[2]) : "eax", "edx", "esi" ); #else int32_t L_result; int k; /* The coefficients of the weighting filter are stored in a table (see table 4.4). The following scaling is used: H[0..10] = integer(real_H[0..10] * 8192); */ /* Initialization of a temporary working array wt[0...49] */ /* for (k = 0; k <= 4; k++) wt[k] = 0; * for (k = 5; k <= 44; k++) wt[k] = *e++; * for (k = 45; k <= 49; k++) wt[k] = 0; * * (e[-5..-1] and e[40..44] are allocated by the caller, * are initially zero and are not written anywhere.) */ e -= 5; /* Compute the signal x[0..39] */ for (k = 0; k < 40; k++) { L_result = 8192 >> 1; /* for (i = 0; i <= 10; i++) * { * L_temp = gsm_l_mult(wt[k + i], gsm_H[i]); * L_result = gsm_l_add(L_result, L_temp); * } */ #undef STEP #define STEP(i,H) (e[k + i] * (int32_t) H) /* Every one of these multiplications is done twice, but I don't see an elegant way to optimize this. Do you? */ L_result += STEP( 0, -134); L_result += STEP( 1, -374); // += STEP( 2, 0 ); L_result += STEP( 3, 2054); L_result += STEP( 4, 5741); L_result += STEP( 5, 8192); L_result += STEP( 6, 5741); L_result += STEP( 7, 2054); // += STEP( 8, 0 ); L_result += STEP( 9, -374); L_result += STEP(10, -134); /* 2 adds vs. >> 16 => 14, minus one shift to compensate for those we lost when replacing L_MULT by '*'. */ L_result >>= 13; x[k] = saturate(L_result); } /*endfor*/ #endif } /*- End of function --------------------------------------------------------*/ /* 4.2.14 */ static void rpe_grid_selection(int16_t x[40], int16_t xM[13], int16_t *Mc_out) { int i; int32_t L_result; int32_t L_temp; int32_t EM; /* xxx should be L_EM? */ int16_t Mc; int32_t L_common_0_3; /* The signal x[0..39] is used to select the RPE grid which is represented by Mc. */ EM = 0; Mc = 0; #undef STEP #define STEP(m,i) \ L_temp = x[m + 3*i] >> 2; \ L_result += L_temp*L_temp; /* Common part of 0 and 3 */ L_result = 0; STEP(0, 1); STEP(0, 2); STEP(0, 3); STEP(0, 4); STEP(0, 5); STEP(0, 6); STEP(0, 7); STEP(0, 8); STEP(0, 9); STEP(0, 10); STEP(0, 11); STEP(0, 12); L_common_0_3 = L_result; /* i = 0 */ STEP(0, 0); L_result <<= 1; /* implicit in L_MULT */ EM = L_result; /* i = 1 */ L_result = 0; STEP(1, 0); STEP(1, 1); STEP(1, 2); STEP(1, 3); STEP(1, 4); STEP(1, 5); STEP(1, 6); STEP(1, 7); STEP(1, 8); STEP(1, 9); STEP(1, 10); STEP(1, 11); STEP(1, 12); L_result <<= 1; if (L_result > EM) { Mc = 1; EM = L_result; } /*endif*/ /* i = 2 */ L_result = 0; STEP(2, 0); STEP(2, 1); STEP(2, 2); STEP(2, 3); STEP(2, 4); STEP(2, 5); STEP(2, 6); STEP(2, 7); STEP(2, 8); STEP(2, 9); STEP(2, 10); STEP(2, 11); STEP(2, 12); L_result <<= 1; if (L_result > EM) { Mc = 2; EM = L_result; } /*endif*/ /* i = 3 */ L_result = L_common_0_3; STEP(3, 12); L_result <<= 1; if (L_result > EM) { Mc = 3; EM = L_result; } /*endif*/ /* Down-sampling by a factor 3 to get the selected xM[0..12] RPE sequence. */ for (i = 0; i < 13; i++) xM[i] = x[Mc + 3*i]; /*endfor*/ *Mc_out = Mc; } /*- End of function --------------------------------------------------------*/ /* 4.12.15 */ static void apcm_quantization_xmaxc_to_exp_mant(int16_t xmaxc, int16_t *exp_out, int16_t *mant_out) { int16_t exp; int16_t mant; /* Compute exponent and mantissa of the decoded version of xmaxc */ exp = 0; if (xmaxc > 15) exp = (int16_t) ((xmaxc >> 3) - 1); /*endif*/ mant = xmaxc - (exp << 3); if (mant == 0) { exp = -4; mant = 7; } else { while (mant <= 7) { mant = (int16_t) (mant << 1 | 1); exp--; } /*endwhile*/ mant -= 8; } /*endif*/ assert(exp >= -4 && exp <= 6); assert(mant >= 0 && mant <= 7); *exp_out = exp; *mant_out = mant; } /*- End of function --------------------------------------------------------*/ static void apcm_quantization(int16_t xM[13], int16_t xMc[13], int16_t *mant_out, int16_t *exp_out, int16_t *xmaxc_out) { /* Table 4.5 Normalized inverse mantissa used to compute xM/xmax */ static const int16_t gsm_NRFAC[8] = { 29128, 26215, 23832, 21846, 20165, 18725, 17476, 16384 }; int i; int itest; int16_t xmax; int16_t xmaxc; int16_t temp; int16_t temp1; int16_t temp2; int16_t exp; int16_t mant; /* Find the maximum absolute value xmax of xM[0..12]. */ xmax = 0; for (i = 0; i < 13; i++) { temp = xM[i]; temp = gsm_abs(temp); if (temp > xmax) xmax = temp; /*endif*/ } /*endfor*/ /* Quantizing and coding of xmax to get xmaxc. */ exp = 0; temp = xmax >> 9; itest = 0; for (i = 0; i <= 5; i++) { itest |= (temp <= 0); temp >>= 1; assert(exp <= 5); if (itest == 0) exp++; /*endif*/ } /*endfor*/ assert(exp <= 6 && exp >= 0); temp = (int16_t) (exp + 5); assert(temp <= 11 && temp >= 0); xmaxc = gsm_add((xmax >> temp), exp << 3); /* Quantizing and coding of the xM[0..12] RPE sequence to get the xMc[0..12] */ apcm_quantization_xmaxc_to_exp_mant(xmaxc, &exp, &mant); /* This computation uses the fact that the decoded version of xmaxc can be calculated by using the exponent and the mantissa part of xmaxc (logarithmic table). So, this method avoids any division and uses only a scaling of the RPE samples by a function of the exponent. A direct multiplication by the inverse of the mantissa (NRFAC[0..7] found in table 4.5) gives the 3 bit coded version xMc[0..12] of the RPE samples. */ /* Direct computation of xMc[0..12] using table 4.5 */ assert(exp <= 4096 && exp >= -4096); assert(mant >= 0 && mant <= 7); temp1 = (int16_t) (6 - exp); /* Normalization by the exponent */ temp2 = gsm_NRFAC[mant]; /* Inverse mantissa */ for (i = 0; i < 13; i++) { assert(temp1 >= 0 && temp1 < 16); temp = xM[i] << temp1; temp = gsm_mult(temp, temp2); temp >>= 12; xMc[i] = (int16_t) (temp + 4); /* See note below */ } /*endfor*/ /* NOTE: This equation is used to make all the xMc[i] positive. */ *mant_out = mant; *exp_out = exp; *xmaxc_out = xmaxc; } /*- End of function --------------------------------------------------------*/ /* 4.2.16 */ static void apcm_inverse_quantization(int16_t xMc[13], int16_t mant, int16_t exp, int16_t xMp[13]) { /* Table 4.6 Normalized direct mantissa used to compute xM/xmax */ static const int16_t gsm_FAC[8] = { 18431, 20479, 22527, 24575, 26623, 28671, 30719, 32767 }; int i; int16_t temp; int16_t temp1; int16_t temp2; int16_t temp3; /* This part is for decoding the RPE sequence of coded xMc[0..12] samples to obtain the xMp[0..12] array. Table 4.6 is used to get the mantissa of xmaxc (FAC[0..7]). */ #if 0 assert(mant >= 0 && mant <= 7); #endif temp1 = gsm_FAC[mant]; /* See 4.2-15 for mant */ temp2 = gsm_sub(6, exp); /* See 4.2-15 for exp */ temp3 = gsm_asl(1, gsm_sub (temp2, 1)); for (i = 0; i < 13; i++) { assert(xMc[i] >= 0 && xMc[i] <= 7); /* 3 bit unsigned */ temp = (int16_t) ((xMc[i] << 1) - 7); /* Restore sign */ assert(temp <= 7 && temp >= -7); /* 4 bit signed */ temp <<= 12; /* 16 bit signed */ temp = gsm_mult_r(temp1, temp); temp = gsm_add(temp, temp3); xMp[i] = gsm_asr(temp, temp2); } /*endfor*/ } /*- End of function --------------------------------------------------------*/ /* 4.2.17 */ static void rpe_grid_positioning(int16_t Mc, int16_t xMp[13], int16_t ep[40]) { int i = 13; /* This procedure computes the reconstructed long term residual signal ep[0..39] for the LTP analysis filter. The inputs are the Mc which is the grid position selection and the xMp[0..12] decoded RPE samples which are upsampled by a factor of 3 by inserting zero values. */ assert(0 <= Mc && Mc <= 3); switch (Mc) { case 3: *ep++ = 0; case 2: do { *ep++ = 0; case 1: *ep++ = 0; case 0: *ep++ = *xMp++; } while (--i); } /*endswitch*/ while (++Mc < 4) *ep++ = 0; /*endwhile*/ } /*- End of function --------------------------------------------------------*/ void gsm0610_rpe_encoding(gsm0610_state_t *s, int16_t *e, // [-5..-1][0..39][40..44] int16_t *xmaxc, int16_t *Mc, int16_t xMc[13]) { int16_t x[40]; int16_t xM[13]; int16_t xMp[13]; int16_t mant; int16_t exp; weighting_filter(e, x); rpe_grid_selection(x, xM, Mc); apcm_quantization(xM, xMc, &mant, &exp, xmaxc); apcm_inverse_quantization(xMc, mant, exp, xMp); rpe_grid_positioning(*Mc, xMp, e); } /*- End of function --------------------------------------------------------*/ void gsm0610_rpe_decoding(gsm0610_state_t *s, int16_t xmaxc, int16_t Mcr, int16_t xMcr[13], int16_t erp[40]) { int16_t exp; int16_t mant; int16_t xMp[13]; apcm_quantization_xmaxc_to_exp_mant(xmaxc, &exp, &mant); apcm_inverse_quantization(xMcr, mant, exp, xMp); rpe_grid_positioning(Mcr, xMp, erp); } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/v27ter_tx_4800_fixed_rrc.h0000644000175000017500000000216311150047216022374 0ustar julienjulien#define TX_PULSESHAPER_4800_GAIN 0.875534f #define TX_PULSESHAPER_4800_COEFF_SETS 5 static const int16_t tx_pulseshaper_4800[TX_PULSESHAPER_4800_COEFF_SETS][9] = { { 58, /* Filter 0 */ 434, -155, -3327, 21702, 11548, -978, -560, 141 }, { -164, /* Filter 1 */ 439, 657, -4647, 29721, 2524, 770, -386, -176 }, { -291, /* Filter 2 */ 87, 1223, -3058, 32767, -3058, 1223, 87, -291 }, { -176, /* Filter 3 */ -386, 770, 2524, 29721, -4647, 657, 439, -164 }, { 141, /* Filter 4 */ -560, -978, 11548, 21702, -3327, -155, 434, 58 } }; iaxmodem-1.2.0/lib/spandsp/src/v22bis_tx.c0000644000175000017500000006526011150047216017654 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * v22bis_tx.c - ITU V.22bis modem transmit part * * Written by Steve Underwood * * Copyright (C) 2004 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: v22bis_tx.c,v 1.43 2008/07/02 14:48:26 steveu Exp $ */ /*! \file */ /* THIS IS A WORK IN PROGRESS - NOT YET FUNCTIONAL! */ #if defined(HAVE_CONFIG_H) #include #endif #include #include #include #include #include "floating_fudge.h" #if defined(HAVE_TGMATH_H) #include #endif #if defined(HAVE_MATH_H) #include #endif #include "spandsp/telephony.h" #include "spandsp/logging.h" #include "spandsp/complex.h" #include "spandsp/vector_float.h" #include "spandsp/complex_vector_float.h" #include "spandsp/async.h" #include "spandsp/dds.h" #include "spandsp/power_meter.h" #include "spandsp/v29rx.h" #include "spandsp/v22bis.h" #if defined(SPANDSP_USE_FIXED_POINT) #include "v22bis_tx_fixed_rrc.h" #else #include "v22bis_tx_floating_rrc.h" #endif /* Quoting from the V.22bis spec. 6.3.1.1 Interworking at 2400 bit/s 6.3.1.1.1 Calling modem a) On connection to line the calling modem shall be conditioned to receive signals in the high channel at 1200 bit/s and transmit signals in the low channel at 1200 bit/s in accordance with section 2.5.2.2. It shall apply an ON condition to circuit 107 in accordance with Recommendation V.25. The modem shall initially remain silent. b) After 155 +-10 ms of unscrambled binary 1 has been detected, the modem shall remain silent for a further 456 +-10 ms then transmit an unscrambled repetitive double dibit pattern of 00 and 11 at 1200 bit/s for 100 +-3 ms. Following this signal the modem shall transmit scrambled binary 1 at 1200 bit/s. c) If the modem detects scrambled binary 1 in the high channel at 1200 bit/s for 270 +-40 ms, the handshake shall continue in accordance with section 6.3.1.2.1 c) and d). However, if unscrambled repetitive double dibit 00 and 11 at 1200 bit/s is detected in the high channel, then at the end of receipt of this signal the modem shall apply an ON condition to circuit 112. d) 600 +-10 ms after circuit 112 has been turned ON the modem shall begin transmitting scrambled binary 1 at 2400 bit/s, and 450 +-10 ms after circuit 112 has been turned ON the receiver may begin making 16-way decisions. e) Following transmission of scrambled binary 1 at 2400 bit/s for 200 +-10 ms, circuit 106 shall be conditioned to respond to circuit 105 and the modem shall be ready to transmit data at 2400 bit/s. f) When 32 consecutive bits of scrambled binary 1 at 2400 bit/s have been detected in the high channel the modem shall be ready to receive data at 2400 bit/s and shall apply an ON condition to circuit 109. 6.3.1.1.2 Answering modem a) On connection to line the answering modem shall be conditioned to transmit signals in the high channel at 1200 bit/s in accordance with section 2.5.2.2 and receive signals in the low channel at 1200 bit/s. Following transmission of the answer sequence in accordance with Recommendation V.25, the modem shall apply an ON condition to circuit 107 and then transmit unscrambled binary 1 at 1200 bit/s. b) If the modem detects scrambled binary 1 or 0 in the low channel at 1200 bit/s for 270 +-40 ms, the handshake shall continue in accordance with section 6.3.1.2.2 b) and c). However, if unscrambled repetitive double dibit 00 and 11 at 1200 bit/s is detected in the low channel, at the end of receipt of this signal the modem shall apply an ON condition to circuit 112 and then transmit an unscrambled repetitive double dibit pattern of 00 and 11 at 1200 bit/s for 100 +-3 ms. Following these signals the modem shall transmit scrambled binary 1 at 1200 bit/s. c) 600 +-10 ms after circuit 112 has been turned ON the modem shall begin transmitting scrambled binary 1 at 2400 bit/s, and 450 +-10 ms after circuit 112 has been turned ON the receiver may begin making 16-way decisions. d) Following transmission of scrambled binary 1 at 2400 bit/s for 200 +-10 ms, circuit 106 shall be conditioned to respond to circuit 105 and the modem shall be ready to transmit data at 2400 bit/s. e) When 32 consecutive bits of scrambled binary 1 at 2400 bit/s have been detected in the low channel the modem shall be ready to receive data at 2400 bit/s and shall apply an ON condition to circuit 109. 6.3.1.2 Interworking at 1200 bit/s The following handshake is identical to the Recommendation V.22 alternative A and B handshake. 6.3.1.2.1 Calling modem a) On connection to line the calling modem shall be conditioned to receive signals in the high channel at 1200 bit/s and transmit signals in the low channel at 1200 bit/s in accordance with section 2.5.2.2. It shall apply an ON condition to circuit 107 in accordance with Recommendation V.25. The modem shall initially remain silent. b) After 155 +-10 ms of unscrambled binary 1 has been detected, the modem shall remain silent for a further 456 +-10 ms then transmit scrambled binary 1 at 1200 bit/s (a preceding V.22 bis signal, as shown in Figure 7/V.22 bis, would not affect the operation of a V.22 answer modem). c) On detection of scrambled binary 1 in the high channel at 1200 bit/s for 270 +-40 ms the modem shall be ready to receive data at 1200 bit/s and shall apply an ON condition to circuit 109 and an OFF condition to circuit 112. d) 765 +-10 ms after circuit 109 has been turned ON, circuit 106 shall be conditioned to respond to circuit 105 and the modem shall be ready to transmit data at 1200 bit/s. 6.3.1.2.2 Answering modem a) On connection to line the answering modem shall be conditioned to transmit signals in the high channel at 1200 bit/s in accordance with section 2.5.2.2 and receive signals in the low channel at 1200 bit/s. Following transmission of the answer sequence in accordance with V.25 the modem shall apply an ON condition to circuit 107 and then transmit unscrambled binary 1 at 1200 bit/s. b) On detection of scrambled binary 1 or 0 in the low channel at 1200 bit/s for 270 +-40 ms the modem shall apply an OFF condition to circuit 112 and shall then transmit scrambled binary 1 at 1200 bit/s. c) After scrambled binary 1 has been transmitted at 1200 bit/s for 765 +-10 ms the modem shall be ready to transmit and receive data at 1200 bit/s, shall condition circuit 106 to respond to circuit 105 and shall apply an ON condition to circuit 109. Note - Manufacturers may wish to note that in certain countries, for national purposes, modems are in service which emit an answering tone of 2225 Hz instead of unscrambled binary 1. V.22bis to V.22bis ------------------ Calling party S1 scrambled 1's scrambled 1's data at 1200bps at 2400bps |---------------------------------------------------------|XXXXXXXX|XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX|XXXXXXXXXXXXXX|XXXXXXXXXXXXX |<155+-10>|<456+-10>|<100+-3>| |<------600+-10------>|<---200+-10-->| ^ | ^<----450+-100---->|[16 way decisions begin] | | | | v | | |<------450+-100----->|[16 way decisions begin] | |<----------600+-10-------->| |<2150+-350>|<--3300+-700->|<75+-20>| |<100+-3>| |<---200+-10--> |-----------|XXXXXXXXXXXXXX|--------|XXXXXXXXXXXXXXXXXXXXXXXXXXXX|XXXXXXXX|XXXXXXXXXXXXXXXXXX|XXXXXXXXXXXXXX|XXXXXXXXXXXXX silence 2100Hz unscrambled 1's S1 scrambled 1's scrambled 1's data at 1200bps at 1200bps at 2400bps Answering party S1 = Unscrambled double dibit 00 and 11 at 1200bps When the 2400bps section starts, both sides should look for 32 bits of continuous ones, as a test of integrity. V.22 to V.22bis --------------- Calling party scrambled 1's data at 1200bps |---------------------------------------------------------|XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX|XXXXXXXXXXXXX |<155+-10>|<456+-10>| |<270+-40>|<--------765+-10-------->| ^ | ^ | | | | | | | | | | v | |<2150+-350>|<--3300+-700->|<75+-20>| |<270+-40>|<---------765+-10-------->| |-----------|XXXXXXXXXXXXXX|--------|XXXXXXXXXXXXXXXXXXXXXXXXXXXXX|XXXXXXXXXXXXXXXXXXXXXXXXXX|XXXXXXXXXXXXX silence 2100Hz unscrambled 1's scrambled 1's data at 1200bps at 1200bps Answering party Both ends should accept unscrambled binary 1 or binary 0 as the preamble. V.22bis to V.22 --------------- Calling party S1 scrambled 1's data at 1200bps |---------------------------------------------------------|XXXXXXXX|XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX|XXXXXXXXXXXXX |<155+-10>|<456+-10>|<100+-3>| |<-270+-40-><------765+-10------>| ^ | ^ | | | | v | | | | | |<2150+-350>|<--3300+-700->|<75+-20>| |<-270+-40->|<------765+-10----->| |-----------|XXXXXXXXXXXXXX|--------|XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX|XXXXXXXXXXXXXXXXXXXX|XXXXXXXXXXXXX silence 2100Hz unscrambled 1's scrambled 1's data at 1200bps at 1200bps Answering party Both ends should accept unscrambled binary 1 or binary 0 as the preamble. */ #define ms_to_symbols(t) (((t)*600)/1000) /* Segments of the training sequence */ enum { V22BIS_TRAINING_STAGE_NORMAL_OPERATION = 0, V22BIS_TRAINING_STAGE_INITIAL_SILENCE, V22BIS_TRAINING_STAGE_UNSCRAMBLED_ONES, V22BIS_TRAINING_STAGE_UNSCRAMBLED_0011, V22BIS_TRAINING_STAGE_SCRAMBLED_ONES_AT_1200, V22BIS_TRAINING_STAGE_SCRAMBLED_ONES_AT_2400, V22BIS_TRAINING_STAGE_PARKED }; static const int phase_steps[4] = { 1, 0, 2, 3 }; const complexf_t v22bis_constellation[16] = { { 1.0f, 1.0f}, { 3.0f, 1.0f}, { 1.0f, 3.0f}, { 3.0f, 3.0f}, {-1.0f, 1.0f}, {-1.0f, 3.0f}, {-3.0f, 1.0f}, {-3.0f, 3.0f}, {-1.0f, -1.0f}, {-3.0f, -1.0f}, {-1.0f, -3.0f}, {-3.0f, -3.0f}, { 1.0f, -1.0f}, { 1.0f, -3.0f}, { 3.0f, -1.0f}, { 3.0f, -3.0f} }; static int fake_get_bit(void *user_data) { return 1; } /*- End of function --------------------------------------------------------*/ static __inline__ int scramble(v22bis_state_t *s, int bit) { int out_bit; out_bit = (bit ^ (s->tx.scramble_reg >> 14) ^ (s->tx.scramble_reg >> 17)) & 1; if (s->tx.scrambler_pattern_count >= 64) { out_bit ^= 1; s->tx.scrambler_pattern_count = 0; } if (out_bit == 1) s->tx.scrambler_pattern_count++; else s->tx.scrambler_pattern_count = 0; s->tx.scramble_reg = (s->tx.scramble_reg << 1) | out_bit; return out_bit; } /*- End of function --------------------------------------------------------*/ static __inline__ int get_scrambled_bit(v22bis_state_t *s) { int bit; if ((bit = s->tx.current_get_bit(s->user_data)) == PUTBIT_END_OF_DATA) { /* Fill out this symbol with ones, and prepare to send the rest of the shutdown sequence. */ s->tx.current_get_bit = fake_get_bit; s->tx.shutdown = 1; bit = 1; } return scramble(s, bit); } /*- End of function --------------------------------------------------------*/ static complexf_t training_get(v22bis_state_t *s) { complexf_t z; int bits; /* V.22bis training sequence */ switch (s->tx.training) { case V22BIS_TRAINING_STAGE_INITIAL_SILENCE: /* Segment 1: silence */ s->tx.constellation_state = 0; z = complex_setf(0.0f, 0.0f); if (s->caller) { /* The caller just waits for a signal from the far end, which should be unscrambled ones */ if (s->detected_unscrambled_ones_or_zeros) { if (s->bit_rate == 2400) { /* Try to establish at 2400bps */ span_log(&s->logging, SPAN_LOG_FLOW, "+++ starting unscrambled 0011 at 1200 (S1)\n"); s->tx.training = V22BIS_TRAINING_STAGE_UNSCRAMBLED_0011; } else { /* Only try at 1200bps */ span_log(&s->logging, SPAN_LOG_FLOW, "+++ starting scrambled ones at 1200 (A)\n"); s->tx.training = V22BIS_TRAINING_STAGE_SCRAMBLED_ONES_AT_1200; } s->tx.training_count = 0; } } else { /* The answerer waits 75ms, then sends unscrambled ones */ if (++s->tx.training_count >= ms_to_symbols(75)) { /* Inital 75ms of silence is over */ span_log(&s->logging, SPAN_LOG_FLOW, "+++ starting unscrambled ones at 1200\n"); s->tx.training = V22BIS_TRAINING_STAGE_UNSCRAMBLED_ONES; s->tx.training_count = 0; } } break; case V22BIS_TRAINING_STAGE_UNSCRAMBLED_ONES: /* Segment 2: Continuous unscrambled ones at 1200bps (i.e. reversals). */ /* Only the answering modem sends unscrambled ones. It is the first thing exchanged between the modems. */ s->tx.constellation_state = (s->tx.constellation_state + phase_steps[3]) & 3; z = v22bis_constellation[(s->tx.constellation_state << 2) | 0x01]; if (s->bit_rate == 2400 && s->detected_unscrambled_0011_ending) { /* We are allowed to use 2400bps, and the far end is requesting 2400bps. Result: we are going to work at 2400bps */ span_log(&s->logging, SPAN_LOG_FLOW, "+++ [2400] starting unscrambled 0011 at 1200 (S1)\n"); s->tx.training = V22BIS_TRAINING_STAGE_UNSCRAMBLED_0011; s->tx.training_count = 0; break; } if (s->detected_scrambled_ones_or_zeros_at_1200bps) { /* We are going to work at 1200bps. */ span_log(&s->logging, SPAN_LOG_FLOW, "+++ [1200] starting scrambled ones at 1200 (B)\n"); s->bit_rate = 1200; s->tx.training = V22BIS_TRAINING_STAGE_SCRAMBLED_ONES_AT_1200; s->tx.training_count = 0; break; } break; case V22BIS_TRAINING_STAGE_UNSCRAMBLED_0011: /* Segment 3: Continuous unscrambled double dibit 00 11 at 1200bps. This is termed the S1 segment in the V.22bis spec. It is only sent to request or accept 2400bps mode, and lasts 100+-3ms. After this timed burst, we unconditionally change to sending scrambled ones at 1200bps. */ s->tx.constellation_state = (s->tx.constellation_state + phase_steps[(s->tx.training_count & 1) ? 3 : 0]) & 3; span_log(&s->logging, SPAN_LOG_FLOW, "U0011 Tx 0x%02x\n", s->tx.constellation_state); z = v22bis_constellation[(s->tx.constellation_state << 2) | 0x01]; if (++s->tx.training_count >= ms_to_symbols(100)) { span_log(&s->logging, SPAN_LOG_FLOW, "+++ starting scrambled ones at 1200 (C)\n"); s->tx.training = V22BIS_TRAINING_STAGE_SCRAMBLED_ONES_AT_1200; s->tx.training_count = 0; } break; case V22BIS_TRAINING_STAGE_SCRAMBLED_ONES_AT_1200: /* Segment 4: Scrambled ones at 1200bps. */ bits = scramble(s, 1); bits = (bits << 1) | scramble(s, 1); s->tx.constellation_state = (s->tx.constellation_state + phase_steps[bits]) & 3; z = v22bis_constellation[(s->tx.constellation_state << 2) | 0x01]; if (s->caller) { if (s->detected_unscrambled_0011_ending) { /* Continue for a further 600+-10ms */ if (++s->tx.training_count >= ms_to_symbols(600)) { span_log(&s->logging, SPAN_LOG_FLOW, "+++ starting scrambled ones at 2400 (A)\n"); s->tx.training = V22BIS_TRAINING_STAGE_SCRAMBLED_ONES_AT_2400; s->tx.training_count = 0; } } else if (s->detected_scrambled_ones_or_zeros_at_1200bps) { if (s->bit_rate == 2400) { /* Continue for a further 756+-10ms */ if (++s->tx.training_count >= ms_to_symbols(756)) { span_log(&s->logging, SPAN_LOG_FLOW, "+++ starting scrambled ones at 2400 (B)\n"); s->tx.training = V22BIS_TRAINING_STAGE_SCRAMBLED_ONES_AT_2400; s->tx.training_count = 0; } } else { span_log(&s->logging, SPAN_LOG_FLOW, "+++ finished\n"); s->tx.training = V22BIS_TRAINING_STAGE_NORMAL_OPERATION; s->tx.training_count = 0; s->tx.current_get_bit = s->get_bit; } } } else { if (s->bit_rate == 2400) { if (++s->tx.training_count >= ms_to_symbols(500)) { span_log(&s->logging, SPAN_LOG_FLOW, "+++ starting scrambled ones at 2400 (C)\n"); s->tx.training = V22BIS_TRAINING_STAGE_SCRAMBLED_ONES_AT_2400; s->tx.training_count = 0; } } else { if (++s->tx.training_count >= ms_to_symbols(756)) { span_log(&s->logging, SPAN_LOG_FLOW, "+++ finished\n"); s->tx.training = 0; s->tx.training_count = 0; } } } break; case V22BIS_TRAINING_STAGE_SCRAMBLED_ONES_AT_2400: /* Segment 4: Scrambled ones at 2400bps. */ bits = scramble(s, 1); bits = (bits << 1) | scramble(s, 1); s->tx.constellation_state = (s->tx.constellation_state + phase_steps[bits]) & 3; bits = scramble(s, 1); bits = (bits << 1) | scramble(s, 1); z = v22bis_constellation[(s->tx.constellation_state << 2) | 0x01]; if (++s->tx.training_count >= ms_to_symbols(200)) { /* We have completed training. Now handle some real work. */ span_log(&s->logging, SPAN_LOG_FLOW, "+++ finished\n"); s->tx.training = 0; s->tx.training_count = 0; s->tx.current_get_bit = s->get_bit; } break; case V22BIS_TRAINING_STAGE_PARKED: default: z = complex_setf(0.0f, 0.0f); break; } return z; } /*- End of function --------------------------------------------------------*/ static complexf_t getbaud(v22bis_state_t *s) { int bits; if (s->tx.training) { /* Send the training sequence */ return training_get(s); } /* There is no graceful shutdown procedure defined for V.22bis. Just send some ones, to ensure we get the real data bits through, even with bad ISI. */ if (s->tx.shutdown) { if (++s->tx.shutdown > 10) return complex_setf(0.0f, 0.0f); } /* The first two bits define the quadrant */ bits = get_scrambled_bit(s); bits = (bits << 1) | get_scrambled_bit(s); s->tx.constellation_state = (s->tx.constellation_state + phase_steps[bits]) & 3; if (s->bit_rate == 1200) { bits = 0x01; } else { /* The other two bits define the position within the quadrant */ bits = get_scrambled_bit(s); bits = (bits << 1) | get_scrambled_bit(s); } return v22bis_constellation[(s->tx.constellation_state << 2) | bits]; } /*- End of function --------------------------------------------------------*/ int v22bis_tx(v22bis_state_t *s, int16_t amp[], int len) { complexf_t x; complexf_t z; int i; int sample; float famp; if (s->tx.shutdown > 10) return 0; for (sample = 0; sample < len; sample++) { if ((s->tx.baud_phase += 3) >= 40) { s->tx.baud_phase -= 40; s->tx.rrc_filter[s->tx.rrc_filter_step] = s->tx.rrc_filter[s->tx.rrc_filter_step + V22BIS_TX_FILTER_STEPS] = getbaud(s); if (++s->tx.rrc_filter_step >= V22BIS_TX_FILTER_STEPS) s->tx.rrc_filter_step = 0; } /* Root raised cosine pulse shaping at baseband */ x = complex_setf(0.0f, 0.0f); for (i = 0; i < V22BIS_TX_FILTER_STEPS; i++) { x.re += tx_pulseshaper[39 - s->tx.baud_phase][i]*s->tx.rrc_filter[i + s->tx.rrc_filter_step].re; x.im += tx_pulseshaper[39 - s->tx.baud_phase][i]*s->tx.rrc_filter[i + s->tx.rrc_filter_step].im; } /* Now create and modulate the carrier */ z = dds_complexf(&(s->tx.carrier_phase), s->tx.carrier_phase_rate); famp = (x.re*z.re - x.im*z.im)*s->tx.gain; if (s->tx.guard_phase_rate && (s->tx.rrc_filter[s->tx.rrc_filter_step].re != 0.0f || s->tx.rrc_filter[i + s->tx.rrc_filter_step].im != 0.0f)) { /* Add the guard tone */ famp += dds_modf(&(s->tx.guard_phase), s->tx.guard_phase_rate, s->tx.guard_level, 0); } /* Don't bother saturating. We should never clip. */ amp[sample] = (int16_t) lrintf(famp); } return sample; } /*- End of function --------------------------------------------------------*/ void v22bis_tx_power(v22bis_state_t *s, float power) { float l; l = 1.6f*powf(10.0f, (power - DBM0_MAX_POWER)/20.0f); s->tx.gain = l*32768.0f/(TX_PULSESHAPER_GAIN*3.0f); } /*- End of function --------------------------------------------------------*/ static int v22bis_tx_restart(v22bis_state_t *s, int bit_rate) { s->bit_rate = bit_rate; cvec_zerof(s->tx.rrc_filter, sizeof(s->tx.rrc_filter)/sizeof(s->tx.rrc_filter[0])); s->tx.rrc_filter_step = 0; s->tx.scramble_reg = 0; s->tx.scrambler_pattern_count = 0; s->tx.training = V22BIS_TRAINING_STAGE_INITIAL_SILENCE; s->tx.training_count = 0; s->tx.carrier_phase = 0; s->tx.guard_phase = 0; s->tx.baud_phase = 0; s->tx.constellation_state = 0; s->tx.current_get_bit = fake_get_bit; s->tx.shutdown = 0; return 0; } /*- End of function --------------------------------------------------------*/ void v22bis_set_get_bit(v22bis_state_t *s, get_bit_func_t get_bit, void *user_data) { s->get_bit = get_bit; s->user_data = user_data; } /*- End of function --------------------------------------------------------*/ void v22bis_set_put_bit(v22bis_state_t *s, put_bit_func_t put_bit, void *user_data) { s->put_bit = put_bit; s->user_data = user_data; } /*- End of function --------------------------------------------------------*/ int v22bis_restart(v22bis_state_t *s, int bit_rate) { if (bit_rate != 2400 && bit_rate != 1200) return -1; if (v22bis_tx_restart(s, bit_rate)) return -1; return v22bis_rx_restart(s, bit_rate); } /*- End of function --------------------------------------------------------*/ v22bis_state_t *v22bis_init(v22bis_state_t *s, int bit_rate, int guard, int caller, get_bit_func_t get_bit, put_bit_func_t put_bit, void *user_data) { if (s == NULL) { if ((s = (v22bis_state_t *) malloc(sizeof(*s))) == NULL) return NULL; } memset(s, 0, sizeof(*s)); span_log_init(&s->logging, SPAN_LOG_NONE, NULL); span_log_set_protocol(&s->logging, "V.22bis"); s->bit_rate = bit_rate; s->caller = caller; s->get_bit = get_bit; s->put_bit = put_bit; s->user_data = user_data; if (s->caller) { s->tx.carrier_phase_rate = dds_phase_ratef(1200.0f); } else { s->tx.carrier_phase_rate = dds_phase_ratef(2400.0f); if (guard) { if (guard == 1) { s->tx.guard_phase_rate = dds_phase_ratef(550.0f); s->tx.guard_level = 1500.0f; } else { s->tx.guard_phase_rate = dds_phase_ratef(1800.0f); s->tx.guard_level = 1000.0f; } } } v22bis_tx_power(s, -10.0f); v22bis_restart(s, s->bit_rate); return s; } /*- End of function --------------------------------------------------------*/ int v22bis_free(v22bis_state_t *s) { free(s); return 0; } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/v22bis_rx.c0000644000175000017500000006474311150047216017657 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * v22bis_rx.c - ITU V.22bis modem receive part * * Written by Steve Underwood * * Copyright (C) 2004 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: v22bis_rx.c,v 1.40 2008/07/25 13:56:54 steveu Exp $ */ /*! \file */ /* THIS IS A WORK IN PROGRESS - NOT YET FUNCTIONAL! */ #if defined(HAVE_CONFIG_H) #include #endif #include #include #include #include #include "floating_fudge.h" #if defined(HAVE_TGMATH_H) #include #endif #if defined(HAVE_MATH_H) #include #endif #include "spandsp/telephony.h" #include "spandsp/logging.h" #include "spandsp/vector_float.h" #include "spandsp/async.h" #include "spandsp/power_meter.h" #include "spandsp/arctan2.h" #include "spandsp/complex.h" #include "spandsp/dds.h" #include "spandsp/complex_filters.h" #include "spandsp/v29rx.h" #include "spandsp/v22bis.h" #if defined(SPANDSP_USE_FIXED_POINT) #include "v22bis_rx_1200_floating_rrc.h" #include "v22bis_rx_2400_floating_rrc.h" #else #include "v22bis_rx_1200_floating_rrc.h" #include "v22bis_rx_2400_floating_rrc.h" #endif #define ms_to_symbols(t) (((t)*600)/1000) #define EQUALIZER_DELTA 0.25f #define PULSESHAPER_COEFF_SETS 12 /* The basic method used by the V.22bis receiver is: Put each sample into the pulse-shaping and phase shift filter buffer At T/2 rate: Filter and demodulate the contents of the input filter buffer, producing a sample in the equalizer filter buffer. Tune the symbol timing based on the latest 3 samples in the equalizer buffer. This updates the decision points for taking the T/2 samples. Equalize the contents of the equalizer buffer, producing a demodulated constellation point. Find the nearest constellation point to the received position. This is our received symbol. Tune the local carrier, based on the angular mismatch between the actual signal and the decision. Tune the equalizer, based on the mismatch between the actual signal and the decision. Descramble and output the bits represented by the decision. */ enum { V22BIS_TRAINING_STAGE_NORMAL_OPERATION, V22BIS_TRAINING_STAGE_SYMBOL_ACQUISITION, V22BIS_TRAINING_STAGE_LOG_PHASE, V22BIS_TRAINING_STAGE_UNSCRAMBLED_ONES, V22BIS_TRAINING_STAGE_UNSCRAMBLED_0011, V22BIS_TRAINING_STAGE_SCRAMBLED_ONES_AT_1200, V22BIS_TRAINING_STAGE_SCRAMBLED_ONES_AT_2400, V22BIS_TRAINING_STAGE_WAIT_FOR_START_1, V22BIS_TRAINING_STAGE_WAIT_FOR_START_2, V22BIS_TRAINING_STAGE_PARKED }; static const uint8_t space_map_v22bis[6][6] = { {11, 9, 9, 6, 6, 7}, {10, 8, 8, 4, 4, 5}, {10, 8, 8, 4, 4, 5}, {13, 12, 12, 0, 0, 2}, {13, 12, 12, 0, 0, 2}, {15, 14, 14, 1, 1, 3} }; float v22bis_rx_carrier_frequency(v22bis_state_t *s) { return dds_frequencyf(s->rx.carrier_phase_rate); } /*- End of function --------------------------------------------------------*/ float v22bis_symbol_timing_correction(v22bis_state_t *s) { return (float) s->rx.total_baud_timing_correction/((float) PULSESHAPER_COEFF_SETS*40.0f/(3.0f*2.0f)); } /*- End of function --------------------------------------------------------*/ float v22bis_rx_signal_power(v22bis_state_t *s) { return power_meter_current_dbm0(&s->rx.rx_power); } /*- End of function --------------------------------------------------------*/ int v22bis_equalizer_state(v22bis_state_t *s, complexf_t **coeffs) { *coeffs = s->rx.eq_coeff; return 2*V22BIS_EQUALIZER_LEN + 1; } /*- End of function --------------------------------------------------------*/ static void equalizer_reset(v22bis_state_t *s) { int i; /* Start with an equalizer based on everything being perfect */ for (i = 0; i < 2*V22BIS_EQUALIZER_LEN + 1; i++) s->rx.eq_coeff[i] = complex_setf(0.0f, 0.0f); s->rx.eq_coeff[V22BIS_EQUALIZER_LEN] = complex_setf(3.0f, 0.0f); for (i = 0; i <= V22BIS_EQUALIZER_MASK; i++) s->rx.eq_buf[i] = complex_setf(0.0f, 0.0f); s->rx.eq_coeff[V22BIS_EQUALIZER_LEN - 6].re = -0.02f; s->rx.eq_coeff[V22BIS_EQUALIZER_LEN - 5].re = 0.035f; s->rx.eq_coeff[V22BIS_EQUALIZER_LEN - 4].re = 0.08f; s->rx.eq_coeff[V22BIS_EQUALIZER_LEN - 3].re = -0.30f; s->rx.eq_coeff[V22BIS_EQUALIZER_LEN - 2].re = -0.37f; s->rx.eq_coeff[V22BIS_EQUALIZER_LEN - 1].re = 0.09f; s->rx.eq_coeff[V22BIS_EQUALIZER_LEN].re = 3.19f; s->rx.eq_coeff[V22BIS_EQUALIZER_LEN + 1].re = 0.09f; s->rx.eq_coeff[V22BIS_EQUALIZER_LEN + 2].re = -0.37f; s->rx.eq_coeff[V22BIS_EQUALIZER_LEN + 3].re = -0.30f; s->rx.eq_coeff[V22BIS_EQUALIZER_LEN + 5].re = 0.035f; s->rx.eq_coeff[V22BIS_EQUALIZER_LEN + 6].re = -0.02f; s->rx.eq_put_step = 20 - 1; s->rx.eq_step = 0; s->rx.eq_delta = EQUALIZER_DELTA/(2*V22BIS_EQUALIZER_LEN + 1); } /*- End of function --------------------------------------------------------*/ static complexf_t equalizer_get(v22bis_state_t *s) { int i; int p; complexf_t z; complexf_t z1; /* Get the next equalized value. */ z = complex_setf(0.0f, 0.0f); p = s->rx.eq_step - 1; for (i = 0; i < 2*V22BIS_EQUALIZER_LEN + 1; i++) { p = (p - 1) & V22BIS_EQUALIZER_MASK; z1 = complex_mulf(&s->rx.eq_coeff[i], &s->rx.eq_buf[p]); z = complex_addf(&z, &z1); } return z; } /*- End of function --------------------------------------------------------*/ static void tune_equalizer(v22bis_state_t *s, const complexf_t *z, const complexf_t *target) { int i; int p; complexf_t ez; complexf_t z1; /* Find the x and y mismatch from the exact constellation position. */ ez = complex_subf(target, z); ez.re *= s->rx.eq_delta; ez.im *= s->rx.eq_delta; p = s->rx.eq_step - 1; for (i = 0; i < 2*V22BIS_EQUALIZER_LEN + 1; i++) { p = (p - 1) & V22BIS_EQUALIZER_MASK; z1 = complex_conjf(&s->rx.eq_buf[p]); z1 = complex_mulf(&ez, &z1); s->rx.eq_coeff[i] = complex_addf(&s->rx.eq_coeff[i], &z1); /* If we don't leak a little bit we seem to get some wandering adaption */ s->rx.eq_coeff[i].re *= 0.9999f; s->rx.eq_coeff[i].im *= 0.9999f; } } /*- End of function --------------------------------------------------------*/ static __inline__ void track_carrier(v22bis_state_t *s, const complexf_t *z, const complexf_t *target) { float error; /* For small errors the imaginary part of the difference between the actual and the target positions is proportional to the phase error, for any particular target. However, the different amplitudes of the various target positions scale things. */ error = z->im*target->re - z->re*target->im; s->rx.carrier_phase_rate += (int32_t) (s->rx.carrier_track_i*error); s->rx.carrier_phase += (int32_t) (s->rx.carrier_track_p*error); //span_log(&s->logging, SPAN_LOG_FLOW, "Im = %15.5f f = %15.5f\n", error, dds_frequencyf(s->rx.carrier_phase_rate)); } /*- End of function --------------------------------------------------------*/ static __inline__ void put_bit(v22bis_state_t *s, int bit) { int out_bit; bit &= 1; /* Descramble the bit */ s->rx.scramble_reg = (s->rx.scramble_reg << 1) | bit; out_bit = (bit ^ (s->rx.scramble_reg >> 15) ^ (s->rx.scramble_reg >> 18)) & 1; if (s->rx.scrambler_pattern_count >= 64) { out_bit ^= 1; s->rx.scrambler_pattern_count = 0; } if (bit) s->rx.scrambler_pattern_count++; else s->rx.scrambler_pattern_count = 0; s->put_bit(s->user_data, out_bit); } /*- End of function --------------------------------------------------------*/ static void decode_baud(v22bis_state_t *s, int nearest) { static const uint8_t phase_steps[4] = { 1, 0, 2, 3 }; int raw_bits; raw_bits = phase_steps[((nearest - s->rx.constellation_state) >> 2) & 3]; /* The first two bits are the quadrant */ put_bit(s, raw_bits); put_bit(s, raw_bits >> 1); if (s->bit_rate == 2400) { /* The other two bits are the position within the quadrant */ put_bit(s, nearest >> 1); put_bit(s, nearest); } s->rx.constellation_state = nearest; } /*- End of function --------------------------------------------------------*/ static __inline__ int find_quadrant(const complexf_t *z) { int b1; int b2; #if 0 /* Split along the axes, as follows: 1 0 2 3 */ b1 = (z->re <= 0.0f); b2 = (z->im <= 0.0f); return (b2 << 1) | (b1 ^ b2); #endif /* Split the space along the two diagonals, as follows: \ 1 / 2 0 / 3 \ */ b1 = (z->im > z->re); b2 = (z->im < -z->re); return (b2 << 1) | (b1 ^ b2); } /*- End of function --------------------------------------------------------*/ static void process_half_baud(v22bis_state_t *s, const complexf_t *sample) { complexf_t a; complexf_t b; complexf_t c; complexf_t z; complexf_t zz; const complexf_t *target; float p; float q; int re; int im; int nearest; z.re = sample->re; z.im = sample->im; /* Add a sample to the equalizer's circular buffer, but don't calculate anything at this time. */ s->rx.eq_buf[s->rx.eq_step] = z; s->rx.eq_step = (s->rx.eq_step + 1) & V22BIS_EQUALIZER_MASK; /* On alternate insertions we have a whole baud and must process it. */ if ((s->rx.baud_phase ^= 1)) return; /* Perform a Gardner test for baud alignment on the three most recent samples. */ #if 0 p = s->rx.eq_buf[(s->rx.eq_step - 3) & V22BIS_EQUALIZER_MASK].re - s->rx.eq_buf[(s->rx.eq_step - 1) & V22BIS_EQUALIZER_MASK].re; p *= s->rx.eq_buf[(s->rx.eq_step - 2) & V22BIS_EQUALIZER_MASK].re; q = s->rx.eq_buf[(s->rx.eq_step - 3) & V22BIS_EQUALIZER_MASK].im - s->rx.eq_buf[(s->rx.eq_step - 1) & V22BIS_EQUALIZER_MASK].im; q *= s->rx.eq_buf[(s->rx.eq_step - 2) & V22BIS_EQUALIZER_MASK].im; #else if (s->rx.sixteen_way_decisions) { p = s->rx.eq_buf[(s->rx.eq_step - 3) & V22BIS_EQUALIZER_MASK].re - s->rx.eq_buf[(s->rx.eq_step - 1) & V22BIS_EQUALIZER_MASK].re; p *= s->rx.eq_buf[(s->rx.eq_step - 2) & V22BIS_EQUALIZER_MASK].re; q = s->rx.eq_buf[(s->rx.eq_step - 3) & V22BIS_EQUALIZER_MASK].im - s->rx.eq_buf[(s->rx.eq_step - 1) & V22BIS_EQUALIZER_MASK].im; q *= s->rx.eq_buf[(s->rx.eq_step - 2) & V22BIS_EQUALIZER_MASK].im; } else { /* Rotate the points to the 45 degree positions, to maximise the effectiveness of the Gardner algorithm */ zz = complex_setf(cosf(26.57f*3.14159f/180.0f), sinf(26.57f*3.14159f/180.0f)); a = complex_mulf(&s->rx.eq_buf[(s->rx.eq_step - 3) & V22BIS_EQUALIZER_MASK], &zz); b = complex_mulf(&s->rx.eq_buf[(s->rx.eq_step - 2) & V22BIS_EQUALIZER_MASK], &zz); c = complex_mulf(&s->rx.eq_buf[(s->rx.eq_step - 1) & V22BIS_EQUALIZER_MASK], &zz); p = (a.re - c.re)*b.re; q = (a.im - c.im)*b.im; } #endif p += q; s->rx.gardner_integrate += ((p + q) > 0.0f) ? s->rx.gardner_step : -s->rx.gardner_step; if (abs(s->rx.gardner_integrate) >= 16) { /* This integrate and dump approach avoids rapid changes of the equalizer put step. Rapid changes, without hysteresis, are bad. They degrade the equalizer performance when the true symbol boundary is close to a sample boundary. */ s->rx.eq_put_step += (s->rx.gardner_integrate/16); s->rx.total_baud_timing_correction += (s->rx.gardner_integrate/16); span_log(&s->logging, SPAN_LOG_FLOW, "Gardner kick %d [total %d]\n", s->rx.gardner_integrate, s->rx.total_baud_timing_correction); if (s->rx.qam_report) s->rx.qam_report(s->rx.qam_user_data, NULL, NULL, s->rx.gardner_integrate); s->rx.gardner_integrate = 0; } z = equalizer_get(s); printf("VVV %15.5f %15.5f\n", z.re, z.im); span_log(&s->logging, SPAN_LOG_FLOW, "VVV %p %d\n", s->user_data, s->rx.training); if (s->rx.sixteen_way_decisions) { re = (int) (z.re + 3.0f); if (re > 5) re = 5; else if (re < 0) re = 0; im = (int) (z.im + 3.0f); if (im > 5) im = 5; else if (im < 0) im = 0; nearest = space_map_v22bis[re][im]; } else { zz = complex_setf(3.0f/sqrtf(10.0f), -1.0f/sqrtf(10.0f)); zz = complex_mulf(&z, &zz); nearest = (find_quadrant(&zz) << 2) | 0x01; printf("Trackit %15.5f %15.5f %15.5f %15.5f %d\n", z.re, z.im, zz.re, zz.im, nearest); } switch (s->rx.training) { case V22BIS_TRAINING_STAGE_NORMAL_OPERATION: /* Normal operation. */ track_carrier(s, &z, &v22bis_constellation[nearest]); tune_equalizer(s, &z, &v22bis_constellation[nearest]); decode_baud(s, nearest); target = &v22bis_constellation[s->rx.constellation_state]; break; case V22BIS_TRAINING_STAGE_SYMBOL_ACQUISITION: /* Allow time for the Gardner algorithm to settle the symbol timing. */ target = &z; if (++s->rx.training_count >= 40) { s->rx.gardner_step = 4; if (s->caller) { s->rx.training = V22BIS_TRAINING_STAGE_UNSCRAMBLED_ONES; } else { if (s->bit_rate == 2400) s->rx.training = V22BIS_TRAINING_STAGE_UNSCRAMBLED_0011; else s->rx.training = V22BIS_TRAINING_STAGE_SCRAMBLED_ONES_AT_1200; } break; } /* QAM and Gardner only play nicely with heavy damping, so we need to change to a slow rate of symbol timing adaption. However, it must not be so slow that it cannot track the worst case timing error specified in V.22bis. This should be 0.01%, but since we might be off in the opposite direction from the source, the total error could be higher. */ if (s->rx.training_count == 30) s->rx.gardner_step = 32; break; case V22BIS_TRAINING_STAGE_UNSCRAMBLED_ONES: /* The answering modem should initially receive unscrambled ones at 1200bps */ track_carrier(s, &z, &v22bis_constellation[nearest]); target = &z; if (nearest == ((s->rx.constellation_state - 4) & 0x0F)) s->detected_unscrambled_ones++; if (nearest == ((s->rx.constellation_state + 4) & 0x0F)) s->detected_unscrambled_zeros++; s->rx.constellation_state = nearest; span_log(&s->logging, SPAN_LOG_FLOW, "TWIDDLING THUMBS - %d\n", s->rx.training_count); if (++s->rx.training_count == ms_to_symbols(155 + 456)) { if (s->detected_unscrambled_ones >= 250 || s->detected_unscrambled_zeros >= 250) s->detected_unscrambled_ones_or_zeros = TRUE; } if (s->rx.training_count == ms_to_symbols(155 + 457)) { /* We should only bother looking for the 2400bps marker if we are allowed to use 2400bps */ s->rx.training_count = 0; if (s->bit_rate == 2400) s->rx.training = V22BIS_TRAINING_STAGE_UNSCRAMBLED_0011; else s->rx.training = V22BIS_TRAINING_STAGE_SCRAMBLED_ONES_AT_1200; } break; case V22BIS_TRAINING_STAGE_UNSCRAMBLED_0011: s->rx.sixteen_way_decisions = TRUE; /* If we can actually find this it means we can use 2400bps. If we find unscrambled ones, it means we we must use 1200bps. */ track_carrier(s, &z, &v22bis_constellation[nearest]); tune_equalizer(s, &z, &v22bis_constellation[nearest]); target = &z; //s->rx.carrier_track_i = 1000.0f; //s->rx.carrier_track_p = 1000000.0f; #if 0 if (++s->rx.training_count > ms_to_symbols(800)) { s->detected_unscrambled_0011_ending = TRUE; s->rx.training = V22BIS_TRAINING_STAGE_UNSCRAMBLED_ONES; } #else if (++s->rx.training_count == 1) { s->detected_unscrambled_zeros = nearest; s->detected_unscrambled_ones = 0; } else { span_log(&s->logging, SPAN_LOG_FLOW, "0x%X 0x%X 0x%X\n", s->detected_unscrambled_zeros, nearest, (s->detected_unscrambled_zeros + nearest) & 0x0F); if ((s->rx.training_count & 1) == 0) { span_log(&s->logging, SPAN_LOG_FLOW, "AAA\n"); if (((s->detected_unscrambled_zeros + nearest) & 0x0F) == 0x06) s->detected_unscrambled_ones = 1; else if (((s->detected_unscrambled_zeros + nearest) & 0x0F) == 0x02) s->detected_unscrambled_ones = -1; else { span_log(&s->logging, SPAN_LOG_FLOW, "AAA 1\n"); if (s->detected_unscrambled_ones > 5 || s->detected_unscrambled_ones < -5) s->detected_unscrambled_0011_ending = TRUE; else s->bit_rate = 1200; s->rx.training = V22BIS_TRAINING_STAGE_SCRAMBLED_ONES_AT_1200; } } else { span_log(&s->logging, SPAN_LOG_FLOW, "BBB\n"); if (((s->detected_unscrambled_zeros + nearest) & 0x0F) == 0x06) s->detected_unscrambled_ones = 1; else if (((s->detected_unscrambled_zeros + nearest) & 0x0F) == 0x02) s->detected_unscrambled_ones = -1; else { span_log(&s->logging, SPAN_LOG_FLOW, "BBB 1\n"); if (s->detected_unscrambled_ones > 5 || s->detected_unscrambled_ones < -5) s->detected_unscrambled_0011_ending = TRUE; else s->bit_rate = 1200; s->rx.training = V22BIS_TRAINING_STAGE_SCRAMBLED_ONES_AT_1200; } } } #endif break; case V22BIS_TRAINING_STAGE_SCRAMBLED_ONES_AT_1200: track_carrier(s, &z, &v22bis_constellation[nearest]); tune_equalizer(s, &z, &v22bis_constellation[nearest]); target = &z; span_log(&s->logging, SPAN_LOG_FLOW, "S11 0x%02x\n", nearest); if (++s->rx.training_count > ms_to_symbols(900)) { s->detected_scrambled_ones_or_zeros_at_1200bps = TRUE; s->rx.training = V22BIS_TRAINING_STAGE_NORMAL_OPERATION; } if (s->bit_rate == 2400 && s->rx.training_count == ms_to_symbols(450)) s->rx.sixteen_way_decisions = TRUE; break; case V22BIS_TRAINING_STAGE_SCRAMBLED_ONES_AT_2400: track_carrier(s, &z, &v22bis_constellation[nearest]); tune_equalizer(s, &z, &v22bis_constellation[nearest]); s->rx.sixteen_way_decisions = TRUE; target = &z; break; case V22BIS_TRAINING_STAGE_PARKED: default: /* We failed to train! */ /* Park here until the carrier drops. */ target = &z; break; } if (s->rx.qam_report) s->rx.qam_report(s->rx.qam_user_data, &z, target, s->rx.constellation_state); } /*- End of function --------------------------------------------------------*/ int v22bis_rx(v22bis_state_t *s, const int16_t amp[], int len) { int i; int j; int step; complexf_t z; complexf_t zz; int32_t power; complexf_t sample; float ii; float qq; for (i = 0; i < len; i++) { /* Complex bandpass filter the signal, using a pair of FIRs, and RRC coeffs shifted to centre at 1200Hz or 2400Hz. The filters support 12 fractional phase shifts, to permit signal extraction very close to the middle of a symbol. */ s->rx.rrc_filter[s->rx.rrc_filter_step] = s->rx.rrc_filter[s->rx.rrc_filter_step + V22BIS_RX_FILTER_STEPS] = amp[i]; if (++s->rx.rrc_filter_step >= V22BIS_RX_FILTER_STEPS) s->rx.rrc_filter_step = 0; /* Calculate the I filter, with an arbitrary phase step, just so we can calculate the signal power. */ /* TODO: get rid of this */ if (s->caller) { ii = rx_pulseshaper_2400[6][0].re*s->rx.rrc_filter[s->rx.rrc_filter_step]; for (j = 1; j < V22BIS_RX_FILTER_STEPS; j++) ii += rx_pulseshaper_2400[6][j].re*s->rx.rrc_filter[j + s->rx.rrc_filter_step]; } else { ii = rx_pulseshaper_1200[6][0].re*s->rx.rrc_filter[s->rx.rrc_filter_step]; for (j = 1; j < V22BIS_RX_FILTER_STEPS; j++) ii += rx_pulseshaper_1200[6][j].re*s->rx.rrc_filter[j + s->rx.rrc_filter_step]; } power = power_meter_update(&(s->rx.rx_power), (int16_t) (ii/10.0f)); if (s->rx.signal_present) { /* Look for power below -48dBm0 to turn the carrier off */ if (power < s->rx.carrier_off_power) { v22bis_rx_restart(s, s->bit_rate); s->put_bit(s->user_data, PUTBIT_CARRIER_DOWN); continue; } } else { /* Look for power exceeding -43dBm0 to turn the carrier on */ if (power < s->rx.carrier_on_power) continue; s->rx.signal_present = TRUE; s->put_bit(s->user_data, PUTBIT_CARRIER_UP); } if (s->rx.training != V22BIS_TRAINING_STAGE_PARKED) { /* Only spend effort processing this data if the modem is not parked, after training failure. */ z = dds_complexf(&(s->rx.carrier_phase), s->rx.carrier_phase_rate); if (s->rx.training == V22BIS_TRAINING_STAGE_SYMBOL_ACQUISITION) { /* Only AGC during the initial symbol acquisition, and then lock the gain. */ s->rx.agc_scaling = 0.018f*3.60f/sqrtf(power); } /* Put things into the equalization buffer at T/2 rate. The Gardner algorithm will fiddle the step to align this with the symbols. */ if ((s->rx.eq_put_step -= PULSESHAPER_COEFF_SETS) <= 0) { /* Pulse shape while still at the carrier frequency, using a quadrature pair of filters. This results in a properly bandpass filtered complex signal, which can be brought directly to bandband by complex mixing. No further filtering, to remove mixer harmonics, is needed. */ step = -s->rx.eq_put_step; if (step > PULSESHAPER_COEFF_SETS - 1) step = PULSESHAPER_COEFF_SETS - 1; s->rx.eq_put_step += PULSESHAPER_COEFF_SETS*40/(3*2); if (s->caller) { ii = rx_pulseshaper_2400[step][0].re*s->rx.rrc_filter[s->rx.rrc_filter_step]; qq = rx_pulseshaper_2400[step][0].im*s->rx.rrc_filter[s->rx.rrc_filter_step]; for (j = 1; j < V22BIS_RX_FILTER_STEPS; j++) { ii += rx_pulseshaper_2400[step][j].re*s->rx.rrc_filter[j + s->rx.rrc_filter_step]; qq += rx_pulseshaper_2400[step][j].im*s->rx.rrc_filter[j + s->rx.rrc_filter_step]; } } else { ii = rx_pulseshaper_1200[step][0].re*s->rx.rrc_filter[s->rx.rrc_filter_step]; qq = rx_pulseshaper_1200[step][0].im*s->rx.rrc_filter[s->rx.rrc_filter_step]; for (j = 1; j < V22BIS_RX_FILTER_STEPS; j++) { ii += rx_pulseshaper_1200[step][j].re*s->rx.rrc_filter[j + s->rx.rrc_filter_step]; qq += rx_pulseshaper_1200[step][j].im*s->rx.rrc_filter[j + s->rx.rrc_filter_step]; } } sample.re = ii*s->rx.agc_scaling; sample.im = qq*s->rx.agc_scaling; /* Shift to baseband - since this is done in a full complex form, the result is clean, and requires no further filtering apart from the equalizer. */ zz.re = sample.re*z.re - sample.im*z.im; zz.im = -sample.re*z.im - sample.im*z.re; process_half_baud(s, &zz); } } } return 0; } /*- End of function --------------------------------------------------------*/ int v22bis_rx_restart(v22bis_state_t *s, int bit_rate) { /* If bit_rate is 2400, the real bit rate is negotiated. If bit_rate is 1200, the real bit rate is forced to 1200. */ s->bit_rate = bit_rate; vec_zerof(s->rx.rrc_filter, sizeof(s->rx.rrc_filter)/sizeof(s->rx.rrc_filter[0])); s->rx.rrc_filter_step = 0; s->rx.scramble_reg = 0; s->rx.scrambler_pattern_count = 0; s->rx.training = V22BIS_TRAINING_STAGE_SYMBOL_ACQUISITION; s->rx.training_count = 0; s->rx.signal_present = FALSE; s->rx.carrier_phase_rate = dds_phase_ratef((s->caller) ? 2400.0f : 1200.0f); s->rx.carrier_phase = 0; power_meter_init(&(s->rx.rx_power), 5); s->rx.carrier_on_power = power_meter_level_dbm0(-43); s->rx.carrier_off_power = power_meter_level_dbm0(-48); s->rx.agc_scaling = 0.0005f*0.025f; s->rx.constellation_state = 0; s->rx.sixteen_way_decisions = FALSE; equalizer_reset(s); s->detected_unscrambled_ones = 0; s->detected_unscrambled_zeros = 0; s->rx.gardner_integrate = 0; s->rx.gardner_step = 256; s->rx.baud_phase = 0; s->rx.carrier_track_i = 8000.0f; s->rx.carrier_track_p = 8000000.0f; return 0; } /*- End of function --------------------------------------------------------*/ void v22bis_set_qam_report_handler(v22bis_state_t *s, qam_report_handler_t handler, void *user_data) { s->rx.qam_report = handler; s->rx.qam_user_data = user_data; } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/complex_vector_float.c0000644000175000017500000000276411150047216022250 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * vector_float.c - Floating vector arithmetic routines. * * Written by Steve Underwood * * Copyright (C) 2006 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: complex_vector_float.c,v 1.8 2008/07/02 14:48:25 steveu Exp $ */ /*! \file */ #if defined(HAVE_CONFIG_H) #include #endif #include #include #include #include #include "floating_fudge.h" #if defined(HAVE_TGMATH_H) #include #endif #if defined(HAVE_MATH_H) #include #endif #include #include "spandsp/telephony.h" #include "spandsp/logging.h" #include "spandsp/complex.h" #include "spandsp/vector_float.h" #include "spandsp/complex_vector_float.h" /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/v17tx.c0000644000175000017500000003240711150047216017020 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * v17tx.c - ITU V.17 modem transmit part * * Written by Steve Underwood * * Copyright (C) 2004 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: v17tx.c,v 1.62 2008/07/16 14:23:47 steveu Exp $ */ /*! \file */ #if defined(HAVE_CONFIG_H) #include #endif #include #include #include #include #include "floating_fudge.h" #if defined(HAVE_TGMATH_H) #include #endif #if defined(HAVE_MATH_H) #include #endif #include "spandsp/telephony.h" #include "spandsp/logging.h" #include "spandsp/complex.h" #include "spandsp/vector_float.h" #include "spandsp/complex_vector_float.h" #include "spandsp/async.h" #include "spandsp/dds.h" #include "spandsp/power_meter.h" #include "spandsp/v17tx.h" #if defined(SPANDSP_USE_FIXED_POINT) #define SPANDSP_USE_FIXED_POINTx #endif #include "v17tx_constellation_maps.h" #if defined(SPANDSP_USE_FIXED_POINT) #include "v17tx_fixed_rrc.h" #else #include "v17tx_floating_rrc.h" #endif #define CARRIER_NOMINAL_FREQ 1800.0f /* Segments of the training sequence */ #define V17_TRAINING_SEG_TEP_A 0 #define V17_TRAINING_SEG_TEP_B (V17_TRAINING_SEG_TEP_A + 480) #define V17_TRAINING_SEG_1 (V17_TRAINING_SEG_TEP_B + 48) #define V17_TRAINING_SEG_2 (V17_TRAINING_SEG_1 + 256) #define V17_TRAINING_SEG_3 (V17_TRAINING_SEG_2 + 2976) #define V17_TRAINING_SEG_4 (V17_TRAINING_SEG_3 + 64) #define V17_TRAINING_END (V17_TRAINING_SEG_4 + 48) #define V17_TRAINING_SHUTDOWN_A (V17_TRAINING_END + 32) #define V17_TRAINING_SHUTDOWN_END (V17_TRAINING_SHUTDOWN_A + 48) #define V17_TRAINING_SHORT_SEG_4 (V17_TRAINING_SEG_2 + 38) #define V17_BRIDGE_WORD 0x8880 static __inline__ int scramble(v17_tx_state_t *s, int in_bit) { int out_bit; out_bit = (in_bit ^ (s->scramble_reg >> 17) ^ (s->scramble_reg >> 22)) & 1; s->scramble_reg = (s->scramble_reg << 1) | out_bit; return out_bit; } /*- End of function --------------------------------------------------------*/ #if defined(SPANDSP_USE_FIXED_POINT) static __inline__ complexi16_t training_get(v17_tx_state_t *s) #else static __inline__ complexf_t training_get(v17_tx_state_t *s) #endif { static const int cdba_to_abcd[4] = { 2, 3, 1, 0 }; static const int dibit_to_step[4] = { 1, 0, 2, 3 }; int bits; int shift; if (++s->training_step <= V17_TRAINING_SEG_3) { if (s->training_step <= V17_TRAINING_SEG_2) { if (s->training_step <= V17_TRAINING_SEG_TEP_B) { /* Optional segment: Unmodulated carrier (talker echo protection) */ return v17_abcd_constellation[0]; } if (s->training_step <= V17_TRAINING_SEG_1) { /* Optional segment: silence (talker echo protection) */ #if defined(SPANDSP_USE_FIXED_POINT) return complex_seti16(0, 0); #else return complex_setf(0.0f, 0.0f); #endif } /* Segment 1: ABAB... */ return v17_abcd_constellation[(s->training_step & 1) ^ 1]; } /* Segment 2: CDBA... */ /* Apply the scrambler */ bits = scramble(s, 1); bits = (bits << 1) | scramble(s, 1); s->constellation_state = cdba_to_abcd[bits]; if (s->short_train && s->training_step == V17_TRAINING_SHORT_SEG_4) { /* Go straight to the ones test. */ s->training_step = V17_TRAINING_SEG_4; } return v17_abcd_constellation[s->constellation_state]; } /* Segment 3: Bridge... */ shift = ((s->training_step - V17_TRAINING_SEG_3 - 1) & 0x7) << 1; span_log(&s->logging, SPAN_LOG_FLOW, "Seg 3 shift %d\n", shift); bits = scramble(s, V17_BRIDGE_WORD >> shift); bits = (bits << 1) | scramble(s, V17_BRIDGE_WORD >> (shift + 1)); s->constellation_state = (s->constellation_state + dibit_to_step[bits]) & 3; return v17_abcd_constellation[s->constellation_state]; } /*- End of function --------------------------------------------------------*/ static __inline__ int diff_and_convolutional_encode(v17_tx_state_t *s, int q) { static const int diff_code[16] = { 0, 1, 2, 3, 1, 2, 3, 0, 2, 3, 0, 1, 3, 0, 1, 2 }; int y1; int y2; int this1; int this2; /* Differentially encode */ s->diff = diff_code[((q & 0x03) << 2) | s->diff]; /* Convolutionally encode the redundant bit */ y2 = s->diff >> 1; y1 = s->diff; this2 = y2 ^ y1 ^ (s->convolution >> 2) ^ ((y2 ^ (s->convolution >> 1)) & s->convolution); this1 = y2 ^ (s->convolution >> 1) ^ (y1 & s->convolution); s->convolution = ((s->convolution & 1) << 2) | ((this2 & 1) << 1) | (this1 & 1); return ((q << 1) & 0x78) | (s->diff << 1) | ((s->convolution >> 2) & 1); } /*- End of function --------------------------------------------------------*/ static int fake_get_bit(void *user_data) { return 1; } /*- End of function --------------------------------------------------------*/ #if defined(SPANDSP_USE_FIXED_POINT) static __inline__ complexi16_t getbaud(v17_tx_state_t *s) #else static __inline__ complexf_t getbaud(v17_tx_state_t *s) #endif { int i; int bit; int bits; if (s->in_training) { if (s->training_step <= V17_TRAINING_END) { /* Send the training sequence */ if (s->training_step < V17_TRAINING_SEG_4) return training_get(s); /* The last step in training is to send some 1's */ if (++s->training_step > V17_TRAINING_END) { /* Training finished - commence normal operation. */ s->current_get_bit = s->get_bit; s->in_training = FALSE; } } else { if (++s->training_step > V17_TRAINING_SHUTDOWN_A) { /* The shutdown sequence is 32 bauds of all 1's, then 48 bauds of silence */ #if defined(SPANDSP_USE_FIXED_POINT) return complex_seti16(0, 0); #else return complex_setf(0.0f, 0.0f); #endif } if (s->training_step == V17_TRAINING_SHUTDOWN_END) { if (s->status_handler) s->status_handler(s->status_user_data, MODEM_TX_STATUS_SHUTDOWN_COMPLETE); } } } bits = 0; for (i = 0; i < s->bits_per_symbol; i++) { if ((bit = s->current_get_bit(s->get_bit_user_data)) == PUTBIT_END_OF_DATA) { /* End of real data. Switch to the fake get_bit routine, until we have shut down completely. */ if (s->status_handler) s->status_handler(s->status_user_data, MODEM_TX_STATUS_DATA_EXHAUSTED); s->current_get_bit = fake_get_bit; s->in_training = TRUE; bit = 1; } bits |= (scramble(s, bit) << i); } return s->constellation[diff_and_convolutional_encode(s, bits)]; } /*- End of function --------------------------------------------------------*/ int v17_tx(v17_tx_state_t *s, int16_t amp[], int len) { #if defined(SPANDSP_USE_FIXED_POINT) complexi_t x; complexi_t z; #else complexf_t x; complexf_t z; #endif int i; int sample; if (s->training_step >= V17_TRAINING_SHUTDOWN_END) { /* Once we have sent the shutdown sequence, we stop sending completely. */ return 0; } for (sample = 0; sample < len; sample++) { if ((s->baud_phase += 3) >= 10) { s->baud_phase -= 10; s->rrc_filter[s->rrc_filter_step] = s->rrc_filter[s->rrc_filter_step + V17_TX_FILTER_STEPS] = getbaud(s); if (++s->rrc_filter_step >= V17_TX_FILTER_STEPS) s->rrc_filter_step = 0; } /* Root raised cosine pulse shaping at baseband */ #if defined(SPANDSP_USE_FIXED_POINT) x = complex_seti(0, 0); for (i = 0; i < V17_TX_FILTER_STEPS; i++) { x.re += (int32_t) tx_pulseshaper[TX_PULSESHAPER_COEFF_SETS - 1 - s->baud_phase][i]*(int32_t) s->rrc_filter[i + s->rrc_filter_step].re; x.im += (int32_t) tx_pulseshaper[TX_PULSESHAPER_COEFF_SETS - 1 - s->baud_phase][i]*(int32_t) s->rrc_filter[i + s->rrc_filter_step].im; } /* Now create and modulate the carrier */ x.re >>= 4; x.im >>= 4; z = dds_complexi(&(s->carrier_phase), s->carrier_phase_rate); /* Don't bother saturating. We should never clip. */ i = (x.re*z.re - x.im*z.im) >> 15; amp[sample] = (int16_t) ((i*s->gain) >> 15); #else x = complex_setf(0.0f, 0.0f); for (i = 0; i < V17_TX_FILTER_STEPS; i++) { x.re += tx_pulseshaper[TX_PULSESHAPER_COEFF_SETS - 1 - s->baud_phase][i]*s->rrc_filter[i + s->rrc_filter_step].re; x.im += tx_pulseshaper[TX_PULSESHAPER_COEFF_SETS - 1 - s->baud_phase][i]*s->rrc_filter[i + s->rrc_filter_step].im; } /* Now create and modulate the carrier */ z = dds_complexf(&(s->carrier_phase), s->carrier_phase_rate); /* Don't bother saturating. We should never clip. */ amp[sample] = (int16_t) lrintf((x.re*z.re - x.im*z.im)*s->gain); #endif } return sample; } /*- End of function --------------------------------------------------------*/ void v17_tx_power(v17_tx_state_t *s, float power) { /* The constellation design seems to keep the average power the same, regardless of which bit rate is in use. */ #if defined(SPANDSP_USE_FIXED_POINT) s->gain = 0.223f*powf(10.0f, (power - DBM0_MAX_POWER)/20.0f)*16.0f*(32767.0f/30672.52f)*32768.0f/TX_PULSESHAPER_GAIN; #else s->gain = 0.223f*powf(10.0f, (power - DBM0_MAX_POWER)/20.0f)*32768.0f/TX_PULSESHAPER_GAIN; #endif } /*- End of function --------------------------------------------------------*/ void v17_tx_set_get_bit(v17_tx_state_t *s, get_bit_func_t get_bit, void *user_data) { if (s->get_bit == s->current_get_bit) s->current_get_bit = get_bit; s->get_bit = get_bit; s->get_bit_user_data = user_data; } /*- End of function --------------------------------------------------------*/ void v17_tx_set_modem_status_handler(v17_tx_state_t *s, modem_tx_status_func_t handler, void *user_data) { s->status_handler = handler; s->status_user_data = user_data; } /*- End of function --------------------------------------------------------*/ int v17_tx_restart(v17_tx_state_t *s, int bit_rate, int tep, int short_train) { switch (bit_rate) { case 14400: s->bits_per_symbol = 6; s->constellation = v17_14400_constellation; break; case 12000: s->bits_per_symbol = 5; s->constellation = v17_12000_constellation; break; case 9600: s->bits_per_symbol = 4; s->constellation = v17_9600_constellation; break; case 7200: s->bits_per_symbol = 3; s->constellation = v17_7200_constellation; break; default: return -1; } /* NB: some modems seem to use 3 instead of 1 for long training */ s->diff = (short_train) ? 0 : 1; s->bit_rate = bit_rate; #if defined(SPANDSP_USE_FIXED_POINT) memset(s->rrc_filter, 0, sizeof(s->rrc_filter)); #else cvec_zerof(s->rrc_filter, sizeof(s->rrc_filter)/sizeof(s->rrc_filter[0])); #endif s->rrc_filter_step = 0; s->convolution = 0; s->scramble_reg = 0x2ECDD5; s->in_training = TRUE; s->short_train = short_train; s->training_step = (tep) ? V17_TRAINING_SEG_TEP_A : V17_TRAINING_SEG_1; s->carrier_phase = 0; s->baud_phase = 0; s->constellation_state = 0; s->current_get_bit = fake_get_bit; return 0; } /*- End of function --------------------------------------------------------*/ v17_tx_state_t *v17_tx_init(v17_tx_state_t *s, int bit_rate, int tep, get_bit_func_t get_bit, void *user_data) { if (s == NULL) { if ((s = (v17_tx_state_t *) malloc(sizeof(*s))) == NULL) return NULL; } memset(s, 0, sizeof(*s)); span_log_init(&s->logging, SPAN_LOG_NONE, NULL); span_log_set_protocol(&s->logging, "V.17 TX"); s->get_bit = get_bit; s->get_bit_user_data = user_data; s->carrier_phase_rate = dds_phase_ratef(CARRIER_NOMINAL_FREQ); v17_tx_power(s, -14.0f); v17_tx_restart(s, bit_rate, tep, FALSE); return s; } /*- End of function --------------------------------------------------------*/ int v17_tx_free(v17_tx_state_t *s) { free(s); return 0; } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/spandsp.h.in0000644000175000017500000000645411150047216020114 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * spandsp.h - The head guy amongst the headers * * Written by Steve Underwood * * Copyright (C) 2003 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: spandsp.h.in,v 1.8 2008/07/25 13:56:54 steveu Exp $ */ /*! \file */ #if !defined(_SPANDSP_H_) #define _SPANDSP_H_ @SPANDSP_USE_FIXED_POINT@ @SPANDSP_MISALIGNED_ACCESS_FAILS@ #include @INSERT_INTTYPES_HEADER@ #include #include #include @INSERT_MATH_HEADER@ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #endif /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/v17rx.c0000644000175000017500000013614311150047216017020 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * v17rx.c - ITU V.17 modem receive part * * Written by Steve Underwood * * Copyright (C) 2004, 2005, 2006, 2007 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: v17rx.c,v 1.112 2008/07/17 19:12:27 steveu Exp $ */ /*! \file */ #if defined(HAVE_CONFIG_H) #include #endif #include #include #include #include #include "floating_fudge.h" #if defined(HAVE_TGMATH_H) #include #endif #if defined(HAVE_MATH_H) #include #endif #include "spandsp/telephony.h" #include "spandsp/logging.h" #include "spandsp/complex.h" #include "spandsp/vector_float.h" #include "spandsp/complex_vector_float.h" #include "spandsp/async.h" #include "spandsp/power_meter.h" #include "spandsp/arctan2.h" #include "spandsp/dds.h" #include "spandsp/complex_filters.h" #include "spandsp/v29rx.h" #include "spandsp/v17tx.h" #include "spandsp/v17rx.h" #include "v17tx_constellation_maps.h" #include "v17rx_constellation_maps.h" #if defined(SPANDSP_USE_FIXED_POINT) #include "v17rx_fixed_rrc.h" #else #include "v17rx_floating_rrc.h" #endif #define CARRIER_NOMINAL_FREQ 1800.0f #define BAUD_RATE 2400 #define EQUALIZER_DELTA 0.21f #define EQUALIZER_SLOW_ADAPT_RATIO 0.1f /* Segments of the training sequence */ #define V17_TRAINING_SEG_1_LEN 256 #define V17_TRAINING_SEG_2_LEN 2976 #define V17_TRAINING_SHORT_SEG_2_LEN 38 #define V17_TRAINING_SEG_3_LEN 64 #define V17_TRAINING_SEG_4A_LEN 15 #define V17_TRAINING_SEG_4_LEN 48 #define V17_BRIDGE_WORD 0x8880 enum { TRAINING_STAGE_NORMAL_OPERATION = 0, TRAINING_STAGE_SYMBOL_ACQUISITION, TRAINING_STAGE_LOG_PHASE, TRAINING_STAGE_SHORT_WAIT_FOR_CDBA, TRAINING_STAGE_WAIT_FOR_CDBA, TRAINING_STAGE_COARSE_TRAIN_ON_CDBA, TRAINING_STAGE_FINE_TRAIN_ON_CDBA, TRAINING_STAGE_SHORT_TRAIN_ON_CDBA_AND_TEST, TRAINING_STAGE_TRAIN_ON_CDBA_AND_TEST, TRAINING_STAGE_BRIDGE, TRAINING_STAGE_TCM_WINDUP, TRAINING_STAGE_TEST_ONES, TRAINING_STAGE_PARKED }; /* Coefficients for the band edge symbol timing synchroniser (alpha = 0.99) */ #define SYNC_LOW_BAND_EDGE_COEFF_0 1.764193f /* 2*alpha*cos(low_edge) */ #define SYNC_LOW_BAND_EDGE_COEFF_1 -0.980100f /* -alpha^2 */ #define SYNC_HIGH_BAND_EDGE_COEFF_0 -1.400072f /* 2*alpha*cos(high_edge) */ #define SYNC_HIGH_BAND_EDGE_COEFF_1 -0.980100f /* -alpha^2 */ #define SYNC_CROSS_CORR_COEFF_A -0.932131f /* -alpha^2*sin(freq_diff) */ #define SYNC_CROSS_CORR_COEFF_B 0.700036f /* alpha*sin(high_edge) */ #define SYNC_CROSS_CORR_COEFF_C -0.449451f /* -alpha*sin(low_edge) */ float v17_rx_carrier_frequency(v17_rx_state_t *s) { return dds_frequencyf(s->carrier_phase_rate); } /*- End of function --------------------------------------------------------*/ float v17_rx_symbol_timing_correction(v17_rx_state_t *s) { return (float) s->total_baud_timing_correction/((float) RX_PULSESHAPER_COEFF_SETS*10.0f/3.0f); } /*- End of function --------------------------------------------------------*/ float v17_rx_signal_power(v17_rx_state_t *s) { return power_meter_current_dbm0(&s->power); } /*- End of function --------------------------------------------------------*/ void v17_rx_signal_cutoff(v17_rx_state_t *s, float cutoff) { /* The 0.4 factor allows for the gain of the DC blocker */ s->carrier_on_power = (int32_t) (power_meter_level_dbm0(cutoff + 2.5f)*0.4f); s->carrier_off_power = (int32_t) (power_meter_level_dbm0(cutoff - 2.5f)*0.4f); } /*- End of function --------------------------------------------------------*/ int v17_rx_equalizer_state(v17_rx_state_t *s, complexf_t **coeffs) { *coeffs = s->eq_coeff; return V17_EQUALIZER_PRE_LEN + 1 + V17_EQUALIZER_POST_LEN; } /*- End of function --------------------------------------------------------*/ static void report_status_change(v17_rx_state_t *s, int status) { if (s->status_handler) s->status_handler(s->status_user_data, status); else if (s->put_bit) s->put_bit(s->put_bit_user_data, status); } /*- End of function --------------------------------------------------------*/ static void equalizer_save(v17_rx_state_t *s) { cvec_copyf(s->eq_coeff_save, s->eq_coeff, V17_EQUALIZER_PRE_LEN + 1 + V17_EQUALIZER_POST_LEN); } /*- End of function --------------------------------------------------------*/ static void equalizer_restore(v17_rx_state_t *s) { cvec_copyf(s->eq_coeff, s->eq_coeff_save, V17_EQUALIZER_PRE_LEN + 1 + V17_EQUALIZER_POST_LEN); cvec_zerof(s->eq_buf, V17_EQUALIZER_MASK); s->eq_put_step = RX_PULSESHAPER_COEFF_SETS*10/(3*2) - 1; s->eq_step = 0; s->eq_delta = EQUALIZER_SLOW_ADAPT_RATIO*EQUALIZER_DELTA/(V17_EQUALIZER_PRE_LEN + 1 + V17_EQUALIZER_POST_LEN); } /*- End of function --------------------------------------------------------*/ static void equalizer_reset(v17_rx_state_t *s) { /* Start with an equalizer based on everything being perfect */ cvec_zerof(s->eq_coeff, V17_EQUALIZER_PRE_LEN + 1 + V17_EQUALIZER_POST_LEN); s->eq_coeff[V17_EQUALIZER_PRE_LEN] = complex_setf(3.0f, 0.0f); cvec_zerof(s->eq_buf, V17_EQUALIZER_MASK); s->eq_put_step = RX_PULSESHAPER_COEFF_SETS*10/(3*2) - 1; s->eq_step = 0; s->eq_delta = EQUALIZER_DELTA/(V17_EQUALIZER_PRE_LEN + 1 + V17_EQUALIZER_POST_LEN); } /*- End of function --------------------------------------------------------*/ static __inline__ complexf_t equalizer_get(v17_rx_state_t *s) { int i; int p; complexf_t z; complexf_t z1; /* Get the next equalized value. */ z = complex_setf(0.0f, 0.0f); p = s->eq_step - 1; for (i = 0; i < V17_EQUALIZER_PRE_LEN + 1 + V17_EQUALIZER_POST_LEN; i++) { p = (p - 1) & V17_EQUALIZER_MASK; z1 = complex_mulf(&s->eq_coeff[i], &s->eq_buf[p]); z = complex_addf(&z, &z1); } return z; } /*- End of function --------------------------------------------------------*/ static void tune_equalizer(v17_rx_state_t *s, const complexf_t *z, const complexf_t *target) { int i; int p; complexf_t ez; complexf_t z1; /* Find the x and y mismatch from the exact constellation position. */ ez = complex_subf(target, z); //span_log(&s->logging, SPAN_LOG_FLOW, "Equalizer error %f\n", sqrt(ez.re*ez.re + ez.im*ez.im)); ez.re *= s->eq_delta; ez.im *= s->eq_delta; p = s->eq_step - 1; for (i = 0; i < V17_EQUALIZER_PRE_LEN + 1 + V17_EQUALIZER_POST_LEN; i++) { p = (p - 1) & V17_EQUALIZER_MASK; z1 = complex_conjf(&s->eq_buf[p]); z1 = complex_mulf(&ez, &z1); s->eq_coeff[i] = complex_addf(&s->eq_coeff[i], &z1); /* Leak a little to tame uncontrolled wandering */ s->eq_coeff[i].re *= 0.9999f; s->eq_coeff[i].im *= 0.9999f; } } /*- End of function --------------------------------------------------------*/ static int descramble(v17_rx_state_t *s, int in_bit) { int out_bit; out_bit = (in_bit ^ (s->scramble_reg >> 17) ^ (s->scramble_reg >> 22)) & 1; s->scramble_reg <<= 1; if (s->training_stage > TRAINING_STAGE_NORMAL_OPERATION && s->training_stage < TRAINING_STAGE_TCM_WINDUP) s->scramble_reg |= out_bit; else s->scramble_reg |= (in_bit & 1); return out_bit; } /*- End of function --------------------------------------------------------*/ static __inline__ int find_quadrant(complexf_t *z) { int b1; int b2; /* Split the space along the two diagonals. */ b1 = (z->im > z->re); b2 = (z->im < -z->re); return (b2 << 1) | (b1 ^ b2); } /*- End of function --------------------------------------------------------*/ static void track_carrier(v17_rx_state_t *s, const complexf_t *z, const complexf_t *target) { float error; /* For small errors the imaginary part of the difference between the actual and the target positions is proportional to the phase error, for any particular target. However, the different amplitudes of the various target positions scale things. */ error = z->im*target->re - z->re*target->im; s->carrier_phase_rate += (int32_t) (s->carrier_track_i*error); s->carrier_phase += (int32_t) (s->carrier_track_p*error); //span_log(&s->logging, SPAN_LOG_FLOW, "Im = %15.5f f = %15.5f\n", error, dds_frequencyf(s->carrier_phase_rate)); //printf("XXX Im = %15.5f f = %15.5f %f %f %f %f (%f %f)\n", error, dds_frequencyf(s->carrier_phase_rate), target->re, target->im, z->re, z->im, s->carrier_track_i, s->carrier_track_p); } /*- End of function --------------------------------------------------------*/ static __inline__ void put_bit(v17_rx_state_t *s, int bit) { int out_bit; /* We need to strip the last part of the training - the test period of all 1s - before we let data go to the application. */ if (s->training_stage == TRAINING_STAGE_NORMAL_OPERATION) { out_bit = descramble(s, bit); s->put_bit(s->put_bit_user_data, out_bit); } else if (s->training_stage == TRAINING_STAGE_TEST_ONES) { /* The bits during the final stage of training should be all ones. However, buggy modems mean you cannot rely on this. Therefore we don't bother testing for ones, but just rely on a constellation mismatch measurement. */ out_bit = descramble(s, bit); //span_log(&s->logging, SPAN_LOG_FLOW, "A 1 is really %d\n", out_bit); } } /*- End of function --------------------------------------------------------*/ #if defined(SPANDSP_USE_FIXED_POINTx) static __inline__ uint32_t dist_sq(const complexi_t *x, const complexi_t *y) { return (x->re - y->re)*(x->re - y->re) + (x->im - y->im)*(x->im - y->im); } /*- End of function --------------------------------------------------------*/ #else static __inline__ float dist_sq(const complexf_t *x, const complexf_t *y) { return (x->re - y->re)*(x->re - y->re) + (x->im - y->im)*(x->im - y->im); } /*- End of function --------------------------------------------------------*/ #endif static int decode_baud(v17_rx_state_t *s, complexf_t *z) { static const int diff_code[16] = { 0, 3, 2, 1, 1, 0, 3, 2, 2, 1, 0, 3, 3, 2, 1, 0 }; static const int tcm_paths[8][4] = { {0, 6, 2, 4}, {6, 0, 4, 2}, {2, 4, 0, 6}, {4, 2, 6, 0}, {1, 3, 7, 5}, {5, 7, 3, 1}, {7, 5, 1, 3}, {3, 1, 5, 7} }; int nearest; int i; int j; int k; int re; int im; int raw; int constellation_state; #if defined(SPANDSP_USE_FIXED_POINTx) #define DIST_FACTOR 2048 /* Something less than sqrt(0xFFFFFFFF/10)/10 */ complexi_t zi; uint32_t distances[8]; uint32_t new_distances[8]; uint32_t min; complexi_t ci; #else float distances[8]; float new_distances[8]; float min; #endif re = (int) ((z->re + 9.0f)*2.0f); if (re > 35) re = 35; else if (re < 0) re = 0; im = (int) ((z->im + 9.0f)*2.0f); if (im > 35) im = 35; else if (im < 0) im = 0; /* Find a set of 8 candidate constellation positions, that are the closest to the target, with different patterns in the last 3 bits. */ #if defined(SPANDSP_USE_FIXED_POINTx) min = 0xFFFFFFFF; zi = complex_seti(z->re*DIST_FACTOR, z->im*DIST_FACTOR); #else min = 9999999.0f; #endif j = 0; for (i = 0; i < 8; i++) { nearest = constel_maps[s->space_map][re][im][i]; #if defined(SPANDSP_USE_FIXED_POINTx) ci = complex_seti(s->constellation[nearest].re*DIST_FACTOR, s->constellation[nearest].im*DIST_FACTOR); distances[i] = dist_sq(&ci, &zi); #else distances[i] = dist_sq(&s->constellation[nearest], z); #endif if (min > distances[i]) { min = distances[i]; j = i; } } /* Use the nearest of these soft-decisions as the basis for DFE */ constellation_state = constel_maps[s->space_map][re][im][j]; /* Control the equalizer, carrier tracking, etc. based on the non-trellis corrected information. The trellis correct stuff comes out a bit late. */ track_carrier(s, z, &s->constellation[constellation_state]); //tune_equalizer(s, z, &s->constellation[constellation_state]); /* Now do the trellis decoding */ /* TODO: change to processing blocks of stored symbols here, instead of processing one symbol at a time, to speed up the processing. */ /* Update the minimum accumulated distance to each of the 8 states */ if (++s->trellis_ptr >= V17_TRELLIS_STORAGE_DEPTH) s->trellis_ptr = 0; for (i = 0; i < 4; i++) { min = distances[tcm_paths[i][0]] + s->distances[0]; k = 0; for (j = 1; j < 4; j++) { if (min > distances[tcm_paths[i][j]] + s->distances[j << 1]) { min = distances[tcm_paths[i][j]] + s->distances[j << 1]; k = j; } } /* Use an elementary IIR filter to track the distance to date. */ #if defined(SPANDSP_USE_FIXED_POINTx) new_distances[i] = s->distances[k << 1]*9/10 + distances[tcm_paths[i][k]]*1/10; #else new_distances[i] = s->distances[k << 1]*0.9f + distances[tcm_paths[i][k]]*0.1f; #endif s->full_path_to_past_state_locations[s->trellis_ptr][i] = constel_maps[s->space_map][re][im][tcm_paths[i][k]]; s->past_state_locations[s->trellis_ptr][i] = k << 1; } for (i = 4; i < 8; i++) { min = distances[tcm_paths[i][0]] + s->distances[1]; k = 0; for (j = 1; j < 4; j++) { if (min > distances[tcm_paths[i][j]] + s->distances[(j << 1) + 1]) { min = distances[tcm_paths[i][j]] + s->distances[(j << 1) + 1]; k = j; } } #if defined(SPANDSP_USE_FIXED_POINTx) new_distances[i] = s->distances[(k << 1) + 1]*9/10 + distances[tcm_paths[i][k]]*1/10; #else new_distances[i] = s->distances[(k << 1) + 1]*0.9f + distances[tcm_paths[i][k]]*0.1f; #endif s->full_path_to_past_state_locations[s->trellis_ptr][i] = constel_maps[s->space_map][re][im][tcm_paths[i][k]]; s->past_state_locations[s->trellis_ptr][i] = (k << 1) + 1; } memcpy(s->distances, new_distances, sizeof(s->distances)); /* Find the minimum distance to date. This is the start of the path back to the result. */ min = s->distances[0]; k = 0; for (i = 1; i < 8; i++) { if (min > s->distances[i]) { min = s->distances[i]; k = i; } } /* Trace back through every time step, starting with the current one, and find the state from which the path came one step before. At the end of this search, the last state found also points to the constellation point at that state. This is the output of the trellis. */ for (i = 0, j = s->trellis_ptr; i < V17_TRELLIS_LOOKBACK_DEPTH - 1; i++) { k = s->past_state_locations[j][k]; if (--j < 0) j = V17_TRELLIS_STORAGE_DEPTH - 1; } nearest = s->full_path_to_past_state_locations[j][k] >> 1; /* Differentially decode */ raw = (nearest & 0x3C) | diff_code[((nearest & 0x03) << 2) | s->diff]; s->diff = nearest & 0x03; for (i = 0; i < s->bits_per_symbol; i++) { put_bit(s, raw); raw >>= 1; } return constellation_state; } /*- End of function --------------------------------------------------------*/ static void process_half_baud(v17_rx_state_t *s, const complexf_t *sample) { static const complexf_t cdba[4] = { { 6.0f, 2.0f}, {-2.0f, 6.0f}, { 2.0f, -6.0f}, {-6.0f, -2.0f} }; complexf_t z; complexf_t zz; #if defined(SPANDSP_USE_FIXED_POINTx) const complexi_t *target; #else const complexf_t *target; #endif float v; float p; int bit; int i; int j; int32_t angle; int32_t ang; int constellation_state; /* This routine processes every half a baud, as we put things into the equalizer at the T/2 rate. This routine adapts the position of the half baud samples, which the caller takes. */ /* Add a sample to the equalizer's circular buffer, but don't calculate anything at this time. */ s->eq_buf[s->eq_step] = *sample; s->eq_step = (s->eq_step + 1) & V17_EQUALIZER_MASK; /* On alternate insertions we have a whole baud and must process it. */ if ((s->baud_half ^= 1)) return; /* Symbol timing synchronisation */ /* Cross correlate */ v = s->symbol_sync_low[1]*s->symbol_sync_high[1]*SYNC_CROSS_CORR_COEFF_A + s->symbol_sync_low[0]*s->symbol_sync_high[1]*SYNC_CROSS_CORR_COEFF_B + s->symbol_sync_low[1]*s->symbol_sync_high[0]*SYNC_CROSS_CORR_COEFF_C; /* Filter away any DC component */ p = v - s->symbol_sync_dc_filter[1]; s->symbol_sync_dc_filter[1] = s->symbol_sync_dc_filter[0]; s->symbol_sync_dc_filter[0] = v; /* A little integration will now filter away much of the HF noise */ s->baud_phase -= p; if (fabsf(s->baud_phase) > 100.0f) { if (s->baud_phase > 0.0f) i = (s->baud_phase > 1000.0f) ? 15 : 1; else i = (s->baud_phase < -1000.0f) ? -15 : -1; //printf("v = %10.5f %5d - %f %f %d\n", v, i, p, s->baud_phase, s->total_baud_timing_correction); s->eq_put_step += i; s->total_baud_timing_correction += i; } z = equalizer_get(s); constellation_state = 0; switch (s->training_stage) { case TRAINING_STAGE_NORMAL_OPERATION: /* Normal operation. */ constellation_state = decode_baud(s, &z); target = &s->constellation[constellation_state]; break; case TRAINING_STAGE_SYMBOL_ACQUISITION: /* Allow time for the symbol synchronisation to settle the symbol timing. */ target = &z; #if defined(IAXMODEM_STUFF) if (++s->training_count >= 100) #else if (++s->training_count >= 50) #endif { /* Record the current phase angle */ s->angles[0] = s->start_angles[0] = arctan2(z.im, z.re); s->training_stage = TRAINING_STAGE_LOG_PHASE; if (s->agc_scaling_save == 0.0f) s->agc_scaling_save = s->agc_scaling; } break; case TRAINING_STAGE_LOG_PHASE: /* Record the current alternate phase angle */ target = &z; angle = arctan2(z.im, z.re); s->training_count = 1; if (s->short_train) { /* We should already know the accurate carrier frequency. All we need to sort out is the phase. */ /* Check if we just saw A or B */ if ((uint32_t) (angle - s->start_angles[0]) < 0x80000000U) { angle = s->start_angles[0]; s->angles[0] = 0xC0000000 + 219937506; s->angles[1] = 0x80000000 + 219937506; } else { s->angles[0] = 0x80000000 + 219937506; s->angles[1] = 0xC0000000 + 219937506; } /* Make a step shift in the phase, to pull it into line. We need to rotate the equalizer buffer, as well as the carrier phase, for this to play out nicely. */ /* angle is now the difference between where A is, and where it should be */ p = 3.14159f + angle*2.0f*3.14159f/(65536.0f*65536.0f) - 0.321751f; span_log(&s->logging, SPAN_LOG_FLOW, "Spin (short) by %.5f rads\n", p); zz = complex_setf(cosf(p), -sinf(p)); for (i = 0; i <= V17_EQUALIZER_MASK; i++) s->eq_buf[i] = complex_mulf(&s->eq_buf[i], &zz); s->carrier_phase += (0x80000000 + angle - 219937506); s->carrier_track_p = 500000.0f; s->training_stage = TRAINING_STAGE_SHORT_WAIT_FOR_CDBA; } else { s->angles[1] = s->start_angles[1] = angle; s->training_stage = TRAINING_STAGE_WAIT_FOR_CDBA; } break; case TRAINING_STAGE_WAIT_FOR_CDBA: target = &z; angle = arctan2(z.im, z.re); /* Look for the initial ABAB sequence to display a phase reversal, which will signal the start of the scrambled CDBA segment */ ang = angle - s->angles[(s->training_count - 1) & 0xF]; s->angles[(s->training_count + 1) & 0xF] = angle; /* Do a coarse frequency adjustment about half way through the reversals, as if we wait until the end, we might have rotated too far to correct properly. */ if (s->training_count == 100) { i = s->training_count; /* Avoid the possibility of a divide by zero */ if (i) { j = i & 0xF; ang = (s->angles[j] - s->start_angles[0])/i + (s->angles[j | 0x1] - s->start_angles[1])/i; s->carrier_phase_rate += 3*(ang/20); //span_log(&s->logging, SPAN_LOG_FLOW, "Angles %x, %x, %x, %x, dist %d\n", s->angles[j], s->start_angles[0], s->angles[j | 0x1], s->start_angles[1], i); s->start_angles[0] = s->angles[j]; s->start_angles[1] = s->angles[j | 0x1]; } //span_log(&s->logging, SPAN_LOG_FLOW, "%d %d %d %d %d\n", s->angles[s->training_count & 0xF], s->start_angles[0], s->angles[(s->training_count | 0x1) & 0xF], s->start_angles[1], s->training_count); span_log(&s->logging, SPAN_LOG_FLOW, "First coarse carrier frequency %7.2f (%d)\n", dds_frequencyf(s->carrier_phase_rate), s->training_count); } if ((ang > 0x40000000 || ang < -0x40000000) && s->training_count >= 13) { span_log(&s->logging, SPAN_LOG_FLOW, "We seem to have a reversal at symbol %d\n", s->training_count); /* We seem to have a phase reversal */ /* Slam the carrier frequency into line, based on the total phase drift over the last section. Use the shift from the odd bits and the shift from the even bits to get better jitter suppression. */ /* TODO: We are supposed to deal with frequancy errors up to +-8Hz. Over 200+ symbols that is more than half a cycle. We get confused an do crazy things. We can only cope with errors up to 5Hz right now. We need to implement greater tolerance to be compliant, although it doesn't really matter much these days. */ /* Step back a few symbols so we don't get ISI distorting things. */ i = (s->training_count - 8) & ~1; /* Avoid the possibility of a divide by zero */ if (i - 100 + 8) { j = i & 0xF; ang = (s->angles[j] - s->start_angles[0])/(i - 100 + 8) + (s->angles[j | 0x1] - s->start_angles[1])/(i - 100 + 8); s->carrier_phase_rate += 3*(ang/20); span_log(&s->logging, SPAN_LOG_FLOW, "Angles %x, %x, %x, %x, dist %d\n", s->angles[j], s->start_angles[0], s->angles[j | 0x1], s->start_angles[1], i); } //span_log(&s->logging, SPAN_LOG_FLOW, "%d %d %d %d %d\n", s->angles[s->training_count & 0xF], s->start_angles[0], s->angles[(s->training_count | 0x1) & 0xF], s->start_angles[1], s->training_count); span_log(&s->logging, SPAN_LOG_FLOW, "Second coarse carrier frequency %7.2f (%d)\n", dds_frequencyf(s->carrier_phase_rate), s->training_count); /* Check if the carrier frequency is plausible */ if (s->carrier_phase_rate < dds_phase_ratef(CARRIER_NOMINAL_FREQ - 20.0f) || s->carrier_phase_rate > dds_phase_ratef(CARRIER_NOMINAL_FREQ + 20.0f)) { span_log(&s->logging, SPAN_LOG_FLOW, "Training failed (sequence failed)\n"); /* Park this modem */ s->agc_scaling_save = 0.0f; s->training_stage = TRAINING_STAGE_PARKED; report_status_change(s, PUTBIT_TRAINING_FAILED); break; } /* Make a step shift in the phase, to pull it into line. We need to rotate the equalizer buffer, as well as the carrier phase, for this to play out nicely. */ /* angle is now the difference between where C is, and where it should be */ p = angle*2.0f*3.14159f/(65536.0f*65536.0f) - 0.321751f; span_log(&s->logging, SPAN_LOG_FLOW, "Spin (long) by %.5f rads\n", p); zz = complex_setf(cosf(p), -sinf(p)); for (i = 0; i <= V17_EQUALIZER_MASK; i++) s->eq_buf[i] = complex_mulf(&s->eq_buf[i], &zz); s->carrier_phase += (angle - 219937506); /* We have just seen the first symbol of the scrambled sequence, so skip it. */ descramble(s, 1); descramble(s, 1); s->training_count = 1; s->training_stage = TRAINING_STAGE_COARSE_TRAIN_ON_CDBA; report_status_change(s, PUTBIT_TRAINING_IN_PROGRESS); break; } if (++s->training_count > V17_TRAINING_SEG_1_LEN) { /* This is bogus. There are not this many bits in this section of a real training sequence. Note that this might be TEP. */ span_log(&s->logging, SPAN_LOG_FLOW, "Training failed (sequence failed)\n"); /* Park this modem */ s->agc_scaling_save = 0.0f; s->training_stage = TRAINING_STAGE_PARKED; report_status_change(s, PUTBIT_TRAINING_FAILED); } break; case TRAINING_STAGE_COARSE_TRAIN_ON_CDBA: /* Train on the scrambled CDBA section. */ bit = descramble(s, 1); bit = (bit << 1) | descramble(s, 1); target = &cdba[bit]; track_carrier(s, &z, target); tune_equalizer(s, &z, target); #if defined(IAXMODEM_STUFF) zz = complex_subf(&z, target); s->training_error = powerf(&zz); if (++s->training_count == V17_TRAINING_SEG_2_LEN - 2000 || s->training_error < 1.0f || s->training_error > 200.0f) #else if (++s->training_count == V17_TRAINING_SEG_2_LEN - 2000) #endif { /* Now the equaliser adaption should be getting somewhere, slow it down, or it will never tune very well on a noisy signal. */ s->eq_delta *= EQUALIZER_SLOW_ADAPT_RATIO; s->carrier_track_i = 1000.0f; s->training_stage = TRAINING_STAGE_FINE_TRAIN_ON_CDBA; } break; case TRAINING_STAGE_FINE_TRAIN_ON_CDBA: /* Train on the scrambled CDBA section. */ bit = descramble(s, 1); bit = (bit << 1) | descramble(s, 1); target = &cdba[bit]; /* By this point the training should be comming into focus. */ track_carrier(s, &z, target); tune_equalizer(s, &z, target); if (++s->training_count >= V17_TRAINING_SEG_2_LEN - 48) { s->training_error = 0.0f; s->carrier_track_i = 100.0f; s->carrier_track_p = 500000.0f; s->training_stage = TRAINING_STAGE_TRAIN_ON_CDBA_AND_TEST; } break; case TRAINING_STAGE_TRAIN_ON_CDBA_AND_TEST: /* Continue training on the scrambled CDBA section, but measure the quality of training too. */ bit = descramble(s, 1); bit = (bit << 1) | descramble(s, 1); target = &cdba[bit]; //span_log(&s->logging, SPAN_LOG_FLOW, "%5d [%15.5f, %15.5f] [%15.5f, %15.5f]\n", s->training_count, z.re, z.im, cdba[bit].re, cdba[bit].im); /* We ignore the last few symbols because it seems some modems do not end this part properly, and it throws things off. */ if (++s->training_count < V17_TRAINING_SEG_2_LEN - 20) { track_carrier(s, &z, target); tune_equalizer(s, &z, target); /* Measure the training error */ zz = complex_subf(&z, &cdba[bit]); s->training_error += powerf(&zz); } else if (s->training_count >= V17_TRAINING_SEG_2_LEN) { span_log(&s->logging, SPAN_LOG_FLOW, "Long training error %f\n", s->training_error); if (s->training_error < 40.0f) { s->training_count = 0; s->training_error = 0.0f; s->training_stage = TRAINING_STAGE_BRIDGE; } else { span_log(&s->logging, SPAN_LOG_FLOW, "Training failed (convergence failed)\n"); /* Park this modem */ s->agc_scaling_save = 0.0f; s->training_stage = TRAINING_STAGE_PARKED; report_status_change(s, PUTBIT_TRAINING_FAILED); } } break; case TRAINING_STAGE_BRIDGE: descramble(s, V17_BRIDGE_WORD >> ((s->training_count & 0x7) << 1)); descramble(s, V17_BRIDGE_WORD >> (((s->training_count & 0x7) << 1) + 1)); target = &z; if (++s->training_count >= V17_TRAINING_SEG_3_LEN) { s->training_count = 0; s->training_error = 0.0f; s->training_stage = TRAINING_STAGE_TCM_WINDUP; } break; case TRAINING_STAGE_SHORT_WAIT_FOR_CDBA: target = &cdba[(s->training_count & 1) + 2]; /* Look for the initial ABAB sequence to display a phase reversal, which will signal the start of the scrambled CDBA segment */ angle = arctan2(z.im, z.re); ang = angle - s->angles[s->training_count & 1]; if (ang > 0x40000000 || ang < -0x40000000) { /* We seem to have a phase reversal */ /* We have just seen the first symbol of the scrambled sequence, so skip it. */ descramble(s, 1); descramble(s, 1); s->training_count = 1; s->training_error = 0.0f; s->training_stage = TRAINING_STAGE_SHORT_TRAIN_ON_CDBA_AND_TEST; break; } track_carrier(s, &z, target); if (++s->training_count > V17_TRAINING_SEG_1_LEN) { /* This is bogus. There are not this many bits in this section of a real training sequence. Note that this might be TEP. */ span_log(&s->logging, SPAN_LOG_FLOW, "Training failed (sequence failed)\n"); /* Park this modem */ report_status_change(s, PUTBIT_TRAINING_FAILED); s->training_stage = TRAINING_STAGE_PARKED; } break; case TRAINING_STAGE_SHORT_TRAIN_ON_CDBA_AND_TEST: /* Short retrain on the scrambled CDBA section, but measure the quality of training too. */ bit = descramble(s, 1); bit = (bit << 1) | descramble(s, 1); //span_log(&s->logging, SPAN_LOG_FLOW, "%5d [%15.5f, %15.5f] [%15.5f, %15.5f] %d\n", s->training_count, z.re, z.im, cdba[bit].re, cdba[bit].im, arctan2(z.im, z.re)); target = &cdba[bit]; track_carrier(s, &z, target); //tune_equalizer(s, &z, target); /* Measure the training error */ if (s->training_count > 8) { zz = complex_subf(&z, &cdba[bit]); s->training_error += powerf(&zz); } if (++s->training_count >= V17_TRAINING_SHORT_SEG_2_LEN) { span_log(&s->logging, SPAN_LOG_FLOW, "Short training error %f\n", s->training_error); s->carrier_track_i = 100.0f; s->carrier_track_p = 500000.0f; /* TODO: This was changed from 20.0 to 200.0 after studying real world failures. However, it is not clear why this is an improvement, If something gives a training error way over 20, surely it shouldn't decode too well? */ if (s->training_error < 200.0f) { s->training_count = 0; s->training_stage = TRAINING_STAGE_TCM_WINDUP; report_status_change(s, PUTBIT_TRAINING_IN_PROGRESS); } else { span_log(&s->logging, SPAN_LOG_FLOW, "Short training failed (convergence failed)\n"); /* Park this modem */ report_status_change(s, PUTBIT_TRAINING_FAILED); s->training_stage = TRAINING_STAGE_PARKED; } } break; case TRAINING_STAGE_TCM_WINDUP: /* We need to wait 15 bauds while the trellis fills up. */ //span_log(&s->logging, SPAN_LOG_FLOW, "%5d %15.5f, %15.5f\n", s->training_count, z.re, z.im); constellation_state = decode_baud(s, &z); target = &s->constellation[constellation_state]; /* Measure the training error */ zz = complex_subf(&z, target); s->training_error += powerf(&zz); if (++s->training_count >= V17_TRAINING_SEG_4A_LEN) { s->training_count = 0; s->training_error = 0.0f; /* Restart the differential decoder */ s->diff = (s->short_train) ? 0 : 1; s->training_stage = TRAINING_STAGE_TEST_ONES; } break; case TRAINING_STAGE_TEST_ONES: /* We are in the test phase, where we check that we can receive reliably. We should get a run of 1's, 48 symbols long. */ //span_log(&s->logging, SPAN_LOG_FLOW, "%5d %15.5f, %15.5f\n", s->training_count, z.re, z.im); constellation_state = decode_baud(s, &z); target = &s->constellation[constellation_state]; /* Measure the training error */ zz = complex_subf(&z, target); s->training_error += powerf(&zz); if (++s->training_count >= V17_TRAINING_SEG_4_LEN) { #if defined(IAXMODEM_STUFF) if (s->training_error < 80.0f) #else if (s->training_error < 30.0f) #endif { /* We are up and running */ span_log(&s->logging, SPAN_LOG_FLOW, "Training succeeded (constellation mismatch %f)\n", s->training_error); report_status_change(s, PUTBIT_TRAINING_SUCCEEDED); /* Apply some lag to the carrier off condition, to ensure the last few bits get pushed through the processing. */ s->signal_present = 60; equalizer_save(s); s->carrier_phase_rate_save = s->carrier_phase_rate; s->short_train = TRUE; s->training_stage = TRAINING_STAGE_NORMAL_OPERATION; } else { /* Training has failed */ span_log(&s->logging, SPAN_LOG_FLOW, "Training failed (constellation mismatch %f)\n", s->training_error); /* Park this modem */ if (!s->short_train) s->agc_scaling_save = 0.0f; report_status_change(s, PUTBIT_TRAINING_FAILED); s->training_stage = TRAINING_STAGE_PARKED; } } break; case TRAINING_STAGE_PARKED: default: /* We failed to train! */ /* Park here until the carrier drops. */ target = &z; break; } if (s->qam_report) s->qam_report(s->qam_user_data, &z, target, constellation_state); } /*- End of function --------------------------------------------------------*/ int v17_rx(v17_rx_state_t *s, const int16_t amp[], int len) { int i; int j; int step; int16_t x; int32_t diff; complexf_t z; complexf_t zz; complexf_t sample; #if defined(SPANDSP_USE_FIXED_POINT) complexi_t zi; #endif int32_t power; float v; for (i = 0; i < len; i++) { s->rrc_filter[s->rrc_filter_step] = s->rrc_filter[s->rrc_filter_step + V17_RX_FILTER_STEPS] = amp[i]; if (++s->rrc_filter_step >= V17_RX_FILTER_STEPS) s->rrc_filter_step = 0; /* There should be no DC in the signal, but sometimes there is. We need to measure the power with the DC blocked, but not using a slow to respond DC blocker. Use the most elementary HPF. */ x = amp[i] >> 1; diff = x - s->last_sample; power = power_meter_update(&(s->power), diff); #if defined(IAXMODEM_STUFF) /* Quick power drop fudge */ diff = abs(diff); if (10*diff < s->high_sample) { if (++s->low_samples > 120) { power_meter_init(&(s->power), 4); s->high_sample = 0; s->low_samples = 0; } } else { s->low_samples = 0; if (diff > s->high_sample) s->high_sample = diff; } #endif s->last_sample = x; if (s->signal_present) { /* Look for power below turnoff threshold to turn the carrier off */ #if defined(IAXMODEM_STUFF) if (s->carrier_drop_pending || power < s->carrier_off_power) #else if (power < s->carrier_off_power) #endif { if (--s->signal_present <= 0) { /* Count down a short delay, to ensure we push the last few bits through the filters before stopping. */ v17_rx_restart(s, s->bit_rate, s->short_train); report_status_change(s, PUTBIT_CARRIER_DOWN); continue; } #if defined(IAXMODEM_STUFF) /* Carrier has dropped, but the put_bit is pending the signal_present delay. */ s->carrier_drop_pending = TRUE; #endif } } else { /* Look for power exceeding turnon threshold to turn the carrier on */ if (power < s->carrier_on_power) continue; s->signal_present = 1; #if defined(IAXMODEM_STUFF) s->carrier_drop_pending = FALSE; #endif report_status_change(s, PUTBIT_CARRIER_UP); } if (s->training_stage == TRAINING_STAGE_PARKED) continue; /* Only spend effort processing this data if the modem is not parked, after training failure. */ s->eq_put_step -= RX_PULSESHAPER_COEFF_SETS; step = -s->eq_put_step; if (step > RX_PULSESHAPER_COEFF_SETS - 1) step = RX_PULSESHAPER_COEFF_SETS - 1; if (step < 0) step += RX_PULSESHAPER_COEFF_SETS; #if defined(SPANDSP_USE_FIXED_POINT) zi.re = (int32_t) rx_pulseshaper[step][0].re*(int32_t) s->rrc_filter[s->rrc_filter_step]; for (j = 1; j < V17_RX_FILTER_STEPS; j++) zi.re += (int32_t) rx_pulseshaper[step][j].re*(int32_t) s->rrc_filter[j + s->rrc_filter_step]; sample.re = zi.re*s->agc_scaling; #else zz.re = rx_pulseshaper[step][0].re*s->rrc_filter[s->rrc_filter_step]; for (j = 1; j < V17_RX_FILTER_STEPS; j++) zz.re += rx_pulseshaper[step][j].re*s->rrc_filter[j + s->rrc_filter_step]; sample.re = zz.re*s->agc_scaling; #endif /* Symbol timing synchronisation band edge filters */ /* Low Nyquist band edge filter */ v = s->symbol_sync_low[0]*SYNC_LOW_BAND_EDGE_COEFF_0 + s->symbol_sync_low[1]*SYNC_LOW_BAND_EDGE_COEFF_1 + sample.re; s->symbol_sync_low[1] = s->symbol_sync_low[0]; s->symbol_sync_low[0] = v; /* High Nyquist band edge filter */ v = s->symbol_sync_high[0]*SYNC_HIGH_BAND_EDGE_COEFF_0 + s->symbol_sync_high[1]*SYNC_HIGH_BAND_EDGE_COEFF_1 + sample.re; s->symbol_sync_high[1] = s->symbol_sync_high[0]; s->symbol_sync_high[0] = v; /* Put things into the equalization buffer at T/2 rate. The symbol sync. will fiddle the step to align this with the symbols. */ if (s->eq_put_step <= 0) { /* Only AGC until we have locked down the setting. */ if (s->agc_scaling_save == 0.0f) s->agc_scaling = (1.0f/RX_PULSESHAPER_GAIN)*2.17f/sqrtf(power); /* Pulse shape while still at the carrier frequency, using a quadrature pair of filters. This results in a properly bandpass filtered complex signal, which can be brought directly to baseband by complex mixing. No further filtering, to remove mixer harmonics, is needed. */ step = -s->eq_put_step; if (step > RX_PULSESHAPER_COEFF_SETS - 1) step = RX_PULSESHAPER_COEFF_SETS - 1; #if defined(SPANDSP_USE_FIXED_POINT) zi.im = (int32_t) rx_pulseshaper[step][0].im*(int32_t) s->rrc_filter[s->rrc_filter_step]; for (j = 1; j < V17_RX_FILTER_STEPS; j++) zi.im += (int32_t) rx_pulseshaper[step][j].im*(int32_t) s->rrc_filter[j + s->rrc_filter_step]; sample.im = zi.im*s->agc_scaling; #else zz.im = rx_pulseshaper[step][0].im*s->rrc_filter[s->rrc_filter_step]; for (j = 1; j < V17_RX_FILTER_STEPS; j++) zz.im += rx_pulseshaper[step][j].im*s->rrc_filter[j + s->rrc_filter_step]; sample.im = zz.im*s->agc_scaling; #endif s->eq_put_step += RX_PULSESHAPER_COEFF_SETS*10/(3*2); /* Shift to baseband - since this is done in a full complex form, the result is clean, and requires no further filtering, apart from the equalizer. */ z = dds_lookup_complexf(s->carrier_phase); zz.re = sample.re*z.re - sample.im*z.im; zz.im = -sample.re*z.im - sample.im*z.re; process_half_baud(s, &zz); } dds_advancef(&(s->carrier_phase), s->carrier_phase_rate); } return 0; } /*- End of function --------------------------------------------------------*/ void v17_rx_set_put_bit(v17_rx_state_t *s, put_bit_func_t put_bit, void *user_data) { s->put_bit = put_bit; s->put_bit_user_data = user_data; } /*- End of function --------------------------------------------------------*/ void v17_rx_set_modem_status_handler(v17_rx_state_t *s, modem_tx_status_func_t handler, void *user_data) { s->status_handler = handler; s->status_user_data = user_data; } /*- End of function --------------------------------------------------------*/ int v17_rx_restart(v17_rx_state_t *s, int bit_rate, int short_train) { int i; span_log(&s->logging, SPAN_LOG_FLOW, "Restarting V.17, %dbps, %s training\n", bit_rate, (short_train) ? "short" : "long"); switch (bit_rate) { case 14400: s->constellation = v17_14400_constellation; s->space_map = 0; s->bits_per_symbol = 6; break; case 12000: s->constellation = v17_12000_constellation; s->space_map = 1; s->bits_per_symbol = 5; break; case 9600: s->constellation = v17_9600_constellation; s->space_map = 2; s->bits_per_symbol = 4; break; case 7200: s->constellation = v17_7200_constellation; s->space_map = 3; s->bits_per_symbol = 3; break; default: return -1; } s->bit_rate = bit_rate; #if defined(SPANDSP_USE_FIXED_POINT) memset(s->rrc_filter, 0, sizeof(s->rrc_filter)); #else vec_zerof(s->rrc_filter, sizeof(s->rrc_filter)/sizeof(s->rrc_filter[0])); #endif s->rrc_filter_step = 0; s->diff = 1; s->scramble_reg = 0x2ECDD5; s->training_stage = TRAINING_STAGE_SYMBOL_ACQUISITION; s->training_count = 0; s->training_error = 0.0f; s->signal_present = 0; #if defined(IAXMODEM_STUFF) s->high_sample = 0; s->low_samples = 0; s->carrier_drop_pending = FALSE; #endif if (short_train != 2) s->short_train = short_train; memset(s->start_angles, 0, sizeof(s->start_angles)); memset(s->angles, 0, sizeof(s->angles)); /* Initialise the TCM decoder parameters. */ /* The accumulated distance vectors are set so state zero starts at a value of zero, and all others start larger. This forces the initial paths to merge at the zero states. */ for (i = 0; i < 8; i++) #if defined(SPANDSP_USE_FIXED_POINTx) s->distances[i] = 99*DIST_FACTOR*DIST_FACTOR; #else s->distances[i] = 99.0f; #endif memset(s->full_path_to_past_state_locations, 0, sizeof(s->full_path_to_past_state_locations)); memset(s->past_state_locations, 0, sizeof(s->past_state_locations)); s->distances[0] = 0; s->trellis_ptr = 14; span_log(&s->logging, SPAN_LOG_FLOW, "Phase rates %f %f\n", dds_frequencyf(s->carrier_phase_rate), dds_frequencyf(s->carrier_phase_rate_save)); s->carrier_phase = 0; power_meter_init(&(s->power), 4); if (s->short_train) { s->carrier_phase_rate = s->carrier_phase_rate_save; s->agc_scaling = s->agc_scaling_save; equalizer_restore(s); /* Don't allow any frequency correction at all, until we start to pull the phase in. */ s->carrier_track_i = 0.0f; s->carrier_track_p = 40000.0f; } else { s->carrier_phase_rate = dds_phase_ratef(CARRIER_NOMINAL_FREQ); s->agc_scaling_save = 0.0f; s->agc_scaling = 0.0017f/RX_PULSESHAPER_GAIN; equalizer_reset(s); s->carrier_track_i = 5000.0f; s->carrier_track_p = 40000.0f; } s->last_sample = 0; /* Initialise the working data for symbol timing synchronisation */ s->symbol_sync_low[0] = 0.0f; s->symbol_sync_low[1] = 0.0f; s->symbol_sync_high[0] = 0.0f; s->symbol_sync_high[1] = 0.0f; s->symbol_sync_dc_filter[0] = 0.0f; s->symbol_sync_dc_filter[1] = 0.0f; s->baud_phase = 0.0f; s->baud_half = 0; s->total_baud_timing_correction = 0; return 0; } /*- End of function --------------------------------------------------------*/ v17_rx_state_t *v17_rx_init(v17_rx_state_t *s, int bit_rate, put_bit_func_t put_bit, void *user_data) { if (s == NULL) { if ((s = (v17_rx_state_t *) malloc(sizeof(*s))) == NULL) return NULL; } memset(s, 0, sizeof(*s)); span_log_init(&s->logging, SPAN_LOG_NONE, NULL); span_log_set_protocol(&s->logging, "V.17 RX"); s->put_bit = put_bit; s->put_bit_user_data = user_data; s->short_train = FALSE; v17_rx_signal_cutoff(s, -45.5f); s->agc_scaling = 0.0017f/RX_PULSESHAPER_GAIN; s->agc_scaling_save = 0.0f; s->carrier_phase_rate_save = dds_phase_ratef(CARRIER_NOMINAL_FREQ); v17_rx_restart(s, bit_rate, s->short_train); return s; } /*- End of function --------------------------------------------------------*/ int v17_rx_free(v17_rx_state_t *s) { free(s); return 0; } /*- End of function --------------------------------------------------------*/ void v17_rx_set_qam_report_handler(v17_rx_state_t *s, qam_report_handler_t handler, void *user_data) { s->qam_report = handler; s->qam_user_data = user_data; } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/t4_states.h0000644000175000017500000132662511150047216017757 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * t4_states.h - state tables for T.4 FAX image processing * * Written by Steve Underwood * * Copyright (C) 2004 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: t4_states.h,v 1.7 2008/04/17 14:26:58 steveu Exp $ */ /* Legitimate runs of zero bits which are the tail end of one code plus the start of the next code do not exceed 10 bits. */ /* * Note that these tables are ordered such that the * index into the table is known to be either the * run length, or (run length / 64) + a fixed offset. */ static const t4_run_table_entry_t t4_white_codes[] = { { 8, 0x00AC, 0}, /* 0011 0101 */ { 6, 0x0038, 1}, /* 0001 11 */ { 4, 0x000E, 2}, /* 0111 */ { 4, 0x0001, 3}, /* 1000 */ { 4, 0x000D, 4}, /* 1011 */ { 4, 0x0003, 5}, /* 1100 */ { 4, 0x0007, 6}, /* 1110 */ { 4, 0x000F, 7}, /* 1111 */ { 5, 0x0019, 8}, /* 1001 1 */ { 5, 0x0005, 9}, /* 1010 0 */ { 5, 0x001C, 10}, /* 0011 1 */ { 5, 0x0002, 11}, /* 0100 0 */ { 6, 0x0004, 12}, /* 0010 00 */ { 6, 0x0030, 13}, /* 0000 11 */ { 6, 0x000B, 14}, /* 1101 00 */ { 6, 0x002B, 15}, /* 1101 01 */ { 6, 0x0015, 16}, /* 1010 10 */ { 6, 0x0035, 17}, /* 1010 11 */ { 7, 0x0072, 18}, /* 0100 111 */ { 7, 0x0018, 19}, /* 0001 100 */ { 7, 0x0008, 20}, /* 0001 000 */ { 7, 0x0074, 21}, /* 0010 111 */ { 7, 0x0060, 22}, /* 0000 011 */ { 7, 0x0010, 23}, /* 0000 100 */ { 7, 0x000A, 24}, /* 0101 000 */ { 7, 0x006A, 25}, /* 0101 011 */ { 7, 0x0064, 26}, /* 0010 011 */ { 7, 0x0012, 27}, /* 0100 100 */ { 7, 0x000C, 28}, /* 0011 000 */ { 8, 0x0040, 29}, /* 0000 0010 */ { 8, 0x00C0, 30}, /* 0000 0011 */ { 8, 0x0058, 31}, /* 0001 1010 */ { 8, 0x00D8, 32}, /* 0001 1011 */ { 8, 0x0048, 33}, /* 0001 0010 */ { 8, 0x00C8, 34}, /* 0001 0011 */ { 8, 0x0028, 35}, /* 0001 0100 */ { 8, 0x00A8, 36}, /* 0001 0101 */ { 8, 0x0068, 37}, /* 0001 0110 */ { 8, 0x00E8, 38}, /* 0001 0111 */ { 8, 0x0014, 39}, /* 0010 1000 */ { 8, 0x0094, 40}, /* 0010 1001 */ { 8, 0x0054, 41}, /* 0010 1010 */ { 8, 0x00D4, 42}, /* 0010 1011 */ { 8, 0x0034, 43}, /* 0010 1100 */ { 8, 0x00B4, 44}, /* 0010 1101 */ { 8, 0x0020, 45}, /* 0000 0100 */ { 8, 0x00A0, 46}, /* 0000 0101 */ { 8, 0x0050, 47}, /* 0000 1010 */ { 8, 0x00D0, 48}, /* 0000 1011 */ { 8, 0x004A, 49}, /* 0101 0010 */ { 8, 0x00CA, 50}, /* 0101 0011 */ { 8, 0x002A, 51}, /* 0101 0100 */ { 8, 0x00AA, 52}, /* 0101 0101 */ { 8, 0x0024, 53}, /* 0010 0100 */ { 8, 0x00A4, 54}, /* 0010 0101 */ { 8, 0x001A, 55}, /* 0101 1000 */ { 8, 0x009A, 56}, /* 0101 1001 */ { 8, 0x005A, 57}, /* 0101 1010 */ { 8, 0x00DA, 58}, /* 0101 1011 */ { 8, 0x0052, 59}, /* 0100 1010 */ { 8, 0x00D2, 60}, /* 0100 1011 */ { 8, 0x004C, 61}, /* 0011 0010 */ { 8, 0x00CC, 62}, /* 0011 0011 */ { 8, 0x002C, 63}, /* 0011 0100 */ { 5, 0x001B, 64}, /* 1101 1 */ { 5, 0x0009, 128}, /* 1001 0 */ { 6, 0x003A, 192}, /* 0101 11 */ { 7, 0x0076, 256}, /* 0110 111 */ { 8, 0x006C, 320}, /* 0011 0110 */ { 8, 0x00EC, 384}, /* 0011 0111 */ { 8, 0x0026, 448}, /* 0110 0100 */ { 8, 0x00A6, 512}, /* 0110 0101 */ { 8, 0x0016, 576}, /* 0110 1000 */ { 8, 0x00E6, 640}, /* 0110 0111 */ { 9, 0x0066, 704}, /* 0110 0110 0 */ { 9, 0x0166, 768}, /* 0110 0110 1 */ { 9, 0x0096, 832}, /* 0110 1001 0 */ { 9, 0x0196, 896}, /* 0110 1001 1 */ { 9, 0x0056, 960}, /* 0110 1010 0 */ { 9, 0x0156, 1024}, /* 0110 1010 1 */ { 9, 0x00D6, 1088}, /* 0110 1011 0 */ { 9, 0x01D6, 1152}, /* 0110 1011 1 */ { 9, 0x0036, 1216}, /* 0110 1100 0 */ { 9, 0x0136, 1280}, /* 0110 1100 1 */ { 9, 0x00B6, 1344}, /* 0110 1101 0 */ { 9, 0x01B6, 1408}, /* 0110 1101 1 */ { 9, 0x0032, 1472}, /* 0100 1100 0 */ { 9, 0x0132, 1536}, /* 0100 1100 1 */ { 9, 0x00B2, 1600}, /* 0100 1101 0 */ { 6, 0x0006, 1664}, /* 0110 00 */ { 9, 0x01B2, 1728}, /* 0100 1101 1 */ {11, 0x0080, 1792}, /* 0000 0001 000 */ {11, 0x0180, 1856}, /* 0000 0001 100 */ {11, 0x0580, 1920}, /* 0000 0001 101 */ {12, 0x0480, 1984}, /* 0000 0001 0010 */ {12, 0x0C80, 2048}, /* 0000 0001 0011 */ {12, 0x0280, 2112}, /* 0000 0001 0100 */ {12, 0x0A80, 2176}, /* 0000 0001 0101 */ {12, 0x0680, 2240}, /* 0000 0001 0110 */ {12, 0x0E80, 2304}, /* 0000 0001 0111 */ {12, 0x0380, 2368}, /* 0000 0001 1100 */ {12, 0x0B80, 2432}, /* 0000 0001 1101 */ {12, 0x0780, 2496}, /* 0000 0001 1110 */ {12, 0x0F80, 2560}, /* 0000 0001 1111 */ }; static const t4_run_table_entry_t t4_black_codes[] = { {10, 0x03B0, 0}, /* 0000 1101 11 */ { 3, 0x0002, 1}, /* 010 */ { 2, 0x0003, 2}, /* 11 */ { 2, 0x0001, 3}, /* 10 */ { 3, 0x0006, 4}, /* 011 */ { 4, 0x000C, 5}, /* 0011 */ { 4, 0x0004, 6}, /* 0010 */ { 5, 0x0018, 7}, /* 0001 1 */ { 6, 0x0028, 8}, /* 0001 01 */ { 6, 0x0008, 9}, /* 0001 00 */ { 7, 0x0010, 10}, /* 0000 100 */ { 7, 0x0050, 11}, /* 0000 101 */ { 7, 0x0070, 12}, /* 0000 111 */ { 8, 0x0020, 13}, /* 0000 0100 */ { 8, 0x00E0, 14}, /* 0000 0111 */ { 9, 0x0030, 15}, /* 0000 1100 0 */ {10, 0x03A0, 16}, /* 0000 0101 11 */ {10, 0x0060, 17}, /* 0000 0110 00 */ {10, 0x0040, 18}, /* 0000 0010 00 */ {11, 0x0730, 19}, /* 0000 1100 111 */ {11, 0x00B0, 20}, /* 0000 1101 000 */ {11, 0x01B0, 21}, /* 0000 1101 100 */ {11, 0x0760, 22}, /* 0000 0110 111 */ {11, 0x00A0, 23}, /* 0000 0101 000 */ {11, 0x0740, 24}, /* 0000 0010 111 */ {11, 0x00C0, 25}, /* 0000 0011 000 */ {12, 0x0530, 26}, /* 0000 1100 1010 */ {12, 0x0D30, 27}, /* 0000 1100 1011 */ {12, 0x0330, 28}, /* 0000 1100 1100 */ {12, 0x0B30, 29}, /* 0000 1100 1101 */ {12, 0x0160, 30}, /* 0000 0110 1000 */ {12, 0x0960, 31}, /* 0000 0110 1001 */ {12, 0x0560, 32}, /* 0000 0110 1010 */ {12, 0x0D60, 33}, /* 0000 0110 1011 */ {12, 0x04B0, 34}, /* 0000 1101 0010 */ {12, 0x0CB0, 35}, /* 0000 1101 0011 */ {12, 0x02B0, 36}, /* 0000 1101 0100 */ {12, 0x0AB0, 37}, /* 0000 1101 0101 */ {12, 0x06B0, 38}, /* 0000 1101 0110 */ {12, 0x0EB0, 39}, /* 0000 1101 0111 */ {12, 0x0360, 40}, /* 0000 0110 1100 */ {12, 0x0B60, 41}, /* 0000 0110 1101 */ {12, 0x05B0, 42}, /* 0000 1101 1010 */ {12, 0x0DB0, 43}, /* 0000 1101 1011 */ {12, 0x02A0, 44}, /* 0000 0101 0100 */ {12, 0x0AA0, 45}, /* 0000 0101 0101 */ {12, 0x06A0, 46}, /* 0000 0101 0110 */ {12, 0x0EA0, 47}, /* 0000 0101 0111 */ {12, 0x0260, 48}, /* 0000 0110 0100 */ {12, 0x0A60, 49}, /* 0000 0110 0101 */ {12, 0x04A0, 50}, /* 0000 0101 0010 */ {12, 0x0CA0, 51}, /* 0000 0101 0011 */ {12, 0x0240, 52}, /* 0000 0010 0100 */ {12, 0x0EC0, 53}, /* 0000 0011 0111 */ {12, 0x01C0, 54}, /* 0000 0011 1000 */ {12, 0x0E40, 55}, /* 0000 0010 0111 */ {12, 0x0140, 56}, /* 0000 0010 1000 */ {12, 0x01A0, 57}, /* 0000 0101 1000 */ {12, 0x09A0, 58}, /* 0000 0101 1001 */ {12, 0x0D40, 59}, /* 0000 0010 1011 */ {12, 0x0340, 60}, /* 0000 0010 1100 */ {12, 0x05A0, 61}, /* 0000 0101 1010 */ {12, 0x0660, 62}, /* 0000 0110 0110 */ {12, 0x0E60, 63}, /* 0000 0110 0111 */ {10, 0x03C0, 64}, /* 0000 0011 11 */ {12, 0x0130, 128}, /* 0000 1100 1000 */ {12, 0x0930, 192}, /* 0000 1100 1001 */ {12, 0x0DA0, 256}, /* 0000 0101 1011 */ {12, 0x0CC0, 320}, /* 0000 0011 0011 */ {12, 0x02C0, 384}, /* 0000 0011 0100 */ {12, 0x0AC0, 448}, /* 0000 0011 0101 */ {13, 0x06C0, 512}, /* 0000 0011 0110 0 */ {13, 0x16C0, 576}, /* 0000 0011 0110 1 */ {13, 0x0A40, 640}, /* 0000 0010 0101 0 */ {13, 0x1A40, 704}, /* 0000 0010 0101 1 */ {13, 0x0640, 768}, /* 0000 0010 0110 0 */ {13, 0x1640, 832}, /* 0000 0010 0110 1 */ {13, 0x09C0, 896}, /* 0000 0011 1001 0 */ {13, 0x19C0, 960}, /* 0000 0011 1001 1 */ {13, 0x05C0, 1024}, /* 0000 0011 1010 0 */ {13, 0x15C0, 1088}, /* 0000 0011 1010 1 */ {13, 0x0DC0, 1152}, /* 0000 0011 1011 0 */ {13, 0x1DC0, 1216}, /* 0000 0011 1011 1 */ {13, 0x0940, 1280}, /* 0000 0010 1001 0 */ {13, 0x1940, 1344}, /* 0000 0010 1001 1 */ {13, 0x0540, 1408}, /* 0000 0010 1010 0 */ {13, 0x1540, 1472}, /* 0000 0010 1010 1 */ {13, 0x0B40, 1536}, /* 0000 0010 1101 0 */ {13, 0x1B40, 1600}, /* 0000 0010 1101 1 */ {13, 0x04C0, 1664}, /* 0000 0011 0010 0 */ {13, 0x14C0, 1728}, /* 0000 0011 0010 1 */ {11, 0x0080, 1792}, /* 0000 0001 000 */ {11, 0x0180, 1856}, /* 0000 0001 100 */ {11, 0x0580, 1920}, /* 0000 0001 101 */ {12, 0x0480, 1984}, /* 0000 0001 0010 */ {12, 0x0C80, 2048}, /* 0000 0001 0011 */ {12, 0x0280, 2112}, /* 0000 0001 0100 */ {12, 0x0A80, 2176}, /* 0000 0001 0101 */ {12, 0x0680, 2240}, /* 0000 0001 0110 */ {12, 0x0E80, 2304}, /* 0000 0001 0111 */ {12, 0x0380, 2368}, /* 0000 0001 1100 */ {12, 0x0B80, 2432}, /* 0000 0001 1101 */ {12, 0x0780, 2496}, /* 0000 0001 1110 */ {12, 0x0F80, 2560}, /* 0000 0001 1111 */ }; static const t4_table_entry_t t4_2d_table[128] = { {S_Null, 1, 0}, {S_Vert, 1, 0}, {S_Vert, 3, -1}, {S_Vert, 1, 0}, {S_Horiz, 3, 0}, {S_Vert, 1, 0}, {S_Vert, 3, 1}, {S_Vert, 1, 0}, {S_Pass, 4, 0}, {S_Vert, 1, 0}, {S_Vert, 3, -1}, {S_Vert, 1, 0}, {S_Horiz, 3, 0}, {S_Vert, 1, 0}, {S_Vert, 3, 1}, {S_Vert, 1, 0}, {S_Vert, 6, -2}, {S_Vert, 1, 0}, {S_Vert, 3, -1}, {S_Vert, 1, 0}, {S_Horiz, 3, 0}, {S_Vert, 1, 0}, {S_Vert, 3, 1}, {S_Vert, 1, 0}, {S_Pass, 4, 0}, {S_Vert, 1, 0}, {S_Vert, 3, -1}, {S_Vert, 1, 0}, {S_Horiz, 3, 0}, {S_Vert, 1, 0}, {S_Vert, 3, 1}, {S_Vert, 1, 0}, {S_Vert, 7, -3}, {S_Vert, 1, 0}, {S_Vert, 3, -1}, {S_Vert, 1, 0}, {S_Horiz, 3, 0}, {S_Vert, 1, 0}, {S_Vert, 3, 1}, {S_Vert, 1, 0}, {S_Pass, 4, 0}, {S_Vert, 1, 0}, {S_Vert, 3, -1}, {S_Vert, 1, 0}, {S_Horiz, 3, 0}, {S_Vert, 1, 0}, {S_Vert, 3, 1}, {S_Vert, 1, 0}, {S_Vert, 6, 2}, {S_Vert, 1, 0}, {S_Vert, 3, -1}, {S_Vert, 1, 0}, {S_Horiz, 3, 0}, {S_Vert, 1, 0}, {S_Vert, 3, 1}, {S_Vert, 1, 0}, {S_Pass, 4, 0}, {S_Vert, 1, 0}, {S_Vert, 3, -1}, {S_Vert, 1, 0}, {S_Horiz, 3, 0}, {S_Vert, 1, 0}, {S_Vert, 3, 1}, {S_Vert, 1, 0}, {S_Ext, 7, 0}, {S_Vert, 1, 0}, {S_Vert, 3, -1}, {S_Vert, 1, 0}, {S_Horiz, 3, 0}, {S_Vert, 1, 0}, {S_Vert, 3, 1}, {S_Vert, 1, 0}, {S_Pass, 4, 0}, {S_Vert, 1, 0}, {S_Vert, 3, -1}, {S_Vert, 1, 0}, {S_Horiz, 3, 0}, {S_Vert, 1, 0}, {S_Vert, 3, 1}, {S_Vert, 1, 0}, {S_Vert, 6, -2}, {S_Vert, 1, 0}, {S_Vert, 3, -1}, {S_Vert, 1, 0}, {S_Horiz, 3, 0}, {S_Vert, 1, 0}, {S_Vert, 3, 1}, {S_Vert, 1, 0}, {S_Pass, 4, 0}, {S_Vert, 1, 0}, {S_Vert, 3, -1}, {S_Vert, 1, 0}, {S_Horiz, 3, 0}, {S_Vert, 1, 0}, {S_Vert, 3, 1}, {S_Vert, 1, 0}, {S_Vert, 7, 3}, {S_Vert, 1, 0}, {S_Vert, 3, -1}, {S_Vert, 1, 0}, {S_Horiz, 3, 0}, {S_Vert, 1, 0}, {S_Vert, 3, 1}, {S_Vert, 1, 0}, {S_Pass, 4, 0}, {S_Vert, 1, 0}, {S_Vert, 3, -1}, {S_Vert, 1, 0}, {S_Horiz, 3, 0}, {S_Vert, 1, 0}, {S_Vert, 3, 1}, {S_Vert, 1, 0}, {S_Vert, 6, 2}, {S_Vert, 1, 0}, {S_Vert, 3, -1}, {S_Vert, 1, 0}, {S_Horiz, 3, 0}, {S_Vert, 1, 0}, {S_Vert, 3, 1}, {S_Vert, 1, 0}, {S_Pass, 4, 0}, {S_Vert, 1, 0}, {S_Vert, 3, -1}, {S_Vert, 1, 0}, {S_Horiz, 3, 0}, {S_Vert, 1, 0}, {S_Vert, 3, 1}, {S_Vert, 1, 0} }; static const t4_table_entry_t t4_1d_white_table[4096] = { {S_Null, 1, 0}, {S_TermW, 4, 3}, {S_TermW, 5, 11}, {S_TermW, 4, 5}, {S_TermW, 6, 12}, {S_TermW, 5, 9}, {S_MakeUpW, 6, 1664}, {S_TermW, 4, 6}, {S_TermW, 7, 20}, {S_MakeUpW, 5, 128}, {S_TermW, 7, 24}, {S_TermW, 6, 14}, {S_TermW, 7, 28}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 7, 23}, {S_TermW, 4, 3}, {S_TermW, 7, 27}, {S_TermW, 4, 5}, {S_TermW, 8, 39}, {S_TermW, 6, 16}, {S_MakeUpW, 8, 576}, {S_TermW, 4, 6}, {S_TermW, 7, 19}, {S_TermW, 5, 8}, {S_TermW, 8, 55}, {S_MakeUpW, 5, 64}, {S_TermW, 5, 10}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 8, 45}, {S_TermW, 4, 3}, {S_TermW, 5, 11}, {S_TermW, 4, 5}, {S_TermW, 8, 53}, {S_TermW, 5, 9}, {S_MakeUpW, 8, 448}, {S_TermW, 4, 6}, {S_TermW, 8, 35}, {S_MakeUpW, 5, 128}, {S_TermW, 8, 51}, {S_TermW, 6, 15}, {S_TermW, 8, 63}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 6, 13}, {S_TermW, 4, 3}, {S_MakeUpW, 9, 1472}, {S_TermW, 4, 5}, {S_TermW, 8, 43}, {S_TermW, 6, 17}, {S_MakeUpW, 9, 1216}, {S_TermW, 4, 6}, {S_TermW, 6, 1}, {S_TermW, 5, 8}, {S_MakeUpW, 6, 192}, {S_MakeUpW, 5, 64}, {S_TermW, 5, 10}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 8, 29}, {S_TermW, 4, 3}, {S_TermW, 5, 11}, {S_TermW, 4, 5}, {S_TermW, 6, 12}, {S_TermW, 5, 9}, {S_MakeUpW, 6, 1664}, {S_TermW, 4, 6}, {S_TermW, 8, 33}, {S_MakeUpW, 5, 128}, {S_TermW, 8, 49}, {S_TermW, 6, 14}, {S_TermW, 8, 61}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 8, 47}, {S_TermW, 4, 3}, {S_TermW, 8, 59}, {S_TermW, 4, 5}, {S_TermW, 8, 41}, {S_TermW, 6, 16}, {S_MakeUpW, 9, 960}, {S_TermW, 4, 6}, {S_TermW, 8, 31}, {S_TermW, 5, 8}, {S_TermW, 8, 57}, {S_MakeUpW, 5, 64}, {S_TermW, 5, 10}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 7, 22}, {S_TermW, 4, 3}, {S_TermW, 5, 11}, {S_TermW, 4, 5}, {S_TermW, 7, 26}, {S_TermW, 5, 9}, {S_MakeUpW, 9, 704}, {S_TermW, 4, 6}, {S_TermW, 8, 37}, {S_MakeUpW, 5, 128}, {S_TermW, 7, 25}, {S_TermW, 6, 15}, {S_MakeUpW, 8, 320}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 6, 13}, {S_TermW, 4, 3}, {S_TermW, 7, 18}, {S_TermW, 4, 5}, {S_TermW, 7, 21}, {S_TermW, 6, 17}, {S_MakeUpW, 7, 256}, {S_TermW, 4, 6}, {S_TermW, 6, 1}, {S_TermW, 5, 8}, {S_MakeUpW, 6, 192}, {S_MakeUpW, 5, 64}, {S_TermW, 5, 10}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_MakeUp, 11, 1792}, {S_TermW, 4, 3}, {S_TermW, 5, 11}, {S_TermW, 4, 5}, {S_TermW, 6, 12}, {S_TermW, 5, 9}, {S_MakeUpW, 6, 1664}, {S_TermW, 4, 6}, {S_TermW, 7, 20}, {S_MakeUpW, 5, 128}, {S_TermW, 7, 24}, {S_TermW, 6, 14}, {S_TermW, 7, 28}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 7, 23}, {S_TermW, 4, 3}, {S_TermW, 7, 27}, {S_TermW, 4, 5}, {S_TermW, 8, 40}, {S_TermW, 6, 16}, {S_MakeUpW, 9, 832}, {S_TermW, 4, 6}, {S_TermW, 7, 19}, {S_TermW, 5, 8}, {S_TermW, 8, 56}, {S_MakeUpW, 5, 64}, {S_TermW, 5, 10}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 8, 46}, {S_TermW, 4, 3}, {S_TermW, 5, 11}, {S_TermW, 4, 5}, {S_TermW, 8, 54}, {S_TermW, 5, 9}, {S_MakeUpW, 8, 512}, {S_TermW, 4, 6}, {S_TermW, 8, 36}, {S_MakeUpW, 5, 128}, {S_TermW, 8, 52}, {S_TermW, 6, 15}, {S_TermW, 8, 0}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 6, 13}, {S_TermW, 4, 3}, {S_MakeUpW, 9, 1600}, {S_TermW, 4, 5}, {S_TermW, 8, 44}, {S_TermW, 6, 17}, {S_MakeUpW, 9, 1344}, {S_TermW, 4, 6}, {S_TermW, 6, 1}, {S_TermW, 5, 8}, {S_MakeUpW, 6, 192}, {S_MakeUpW, 5, 64}, {S_TermW, 5, 10}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 8, 30}, {S_TermW, 4, 3}, {S_TermW, 5, 11}, {S_TermW, 4, 5}, {S_TermW, 6, 12}, {S_TermW, 5, 9}, {S_MakeUpW, 6, 1664}, {S_TermW, 4, 6}, {S_TermW, 8, 34}, {S_MakeUpW, 5, 128}, {S_TermW, 8, 50}, {S_TermW, 6, 14}, {S_TermW, 8, 62}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 8, 48}, {S_TermW, 4, 3}, {S_TermW, 8, 60}, {S_TermW, 4, 5}, {S_TermW, 8, 42}, {S_TermW, 6, 16}, {S_MakeUpW, 9, 1088}, {S_TermW, 4, 6}, {S_TermW, 8, 32}, {S_TermW, 5, 8}, {S_TermW, 8, 58}, {S_MakeUpW, 5, 64}, {S_TermW, 5, 10}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 7, 22}, {S_TermW, 4, 3}, {S_TermW, 5, 11}, {S_TermW, 4, 5}, {S_TermW, 7, 26}, {S_TermW, 5, 9}, {S_MakeUpW, 8, 640}, {S_TermW, 4, 6}, {S_TermW, 8, 38}, {S_MakeUpW, 5, 128}, {S_TermW, 7, 25}, {S_TermW, 6, 15}, {S_MakeUpW, 8, 384}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 6, 13}, {S_TermW, 4, 3}, {S_TermW, 7, 18}, {S_TermW, 4, 5}, {S_TermW, 7, 21}, {S_TermW, 6, 17}, {S_MakeUpW, 7, 256}, {S_TermW, 4, 6}, {S_TermW, 6, 1}, {S_TermW, 5, 8}, {S_MakeUpW, 6, 192}, {S_MakeUpW, 5, 64}, {S_TermW, 5, 10}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_Null, 1, 0}, {S_TermW, 4, 3}, {S_TermW, 5, 11}, {S_TermW, 4, 5}, {S_TermW, 6, 12}, {S_TermW, 5, 9}, {S_MakeUpW, 6, 1664}, {S_TermW, 4, 6}, {S_TermW, 7, 20}, {S_MakeUpW, 5, 128}, {S_TermW, 7, 24}, {S_TermW, 6, 14}, {S_TermW, 7, 28}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 7, 23}, {S_TermW, 4, 3}, {S_TermW, 7, 27}, {S_TermW, 4, 5}, {S_TermW, 8, 39}, {S_TermW, 6, 16}, {S_MakeUpW, 8, 576}, {S_TermW, 4, 6}, {S_TermW, 7, 19}, {S_TermW, 5, 8}, {S_TermW, 8, 55}, {S_MakeUpW, 5, 64}, {S_TermW, 5, 10}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 8, 45}, {S_TermW, 4, 3}, {S_TermW, 5, 11}, {S_TermW, 4, 5}, {S_TermW, 8, 53}, {S_TermW, 5, 9}, {S_MakeUpW, 8, 448}, {S_TermW, 4, 6}, {S_TermW, 8, 35}, {S_MakeUpW, 5, 128}, {S_TermW, 8, 51}, {S_TermW, 6, 15}, {S_TermW, 8, 63}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 6, 13}, {S_TermW, 4, 3}, {S_MakeUpW, 9, 1536}, {S_TermW, 4, 5}, {S_TermW, 8, 43}, {S_TermW, 6, 17}, {S_MakeUpW, 9, 1280}, {S_TermW, 4, 6}, {S_TermW, 6, 1}, {S_TermW, 5, 8}, {S_MakeUpW, 6, 192}, {S_MakeUpW, 5, 64}, {S_TermW, 5, 10}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 8, 29}, {S_TermW, 4, 3}, {S_TermW, 5, 11}, {S_TermW, 4, 5}, {S_TermW, 6, 12}, {S_TermW, 5, 9}, {S_MakeUpW, 6, 1664}, {S_TermW, 4, 6}, {S_TermW, 8, 33}, {S_MakeUpW, 5, 128}, {S_TermW, 8, 49}, {S_TermW, 6, 14}, {S_TermW, 8, 61}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 8, 47}, {S_TermW, 4, 3}, {S_TermW, 8, 59}, {S_TermW, 4, 5}, {S_TermW, 8, 41}, {S_TermW, 6, 16}, {S_MakeUpW, 9, 1024}, {S_TermW, 4, 6}, {S_TermW, 8, 31}, {S_TermW, 5, 8}, {S_TermW, 8, 57}, {S_MakeUpW, 5, 64}, {S_TermW, 5, 10}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 7, 22}, {S_TermW, 4, 3}, {S_TermW, 5, 11}, {S_TermW, 4, 5}, {S_TermW, 7, 26}, {S_TermW, 5, 9}, {S_MakeUpW, 9, 768}, {S_TermW, 4, 6}, {S_TermW, 8, 37}, {S_MakeUpW, 5, 128}, {S_TermW, 7, 25}, {S_TermW, 6, 15}, {S_MakeUpW, 8, 320}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 6, 13}, {S_TermW, 4, 3}, {S_TermW, 7, 18}, {S_TermW, 4, 5}, {S_TermW, 7, 21}, {S_TermW, 6, 17}, {S_MakeUpW, 7, 256}, {S_TermW, 4, 6}, {S_TermW, 6, 1}, {S_TermW, 5, 8}, {S_MakeUpW, 6, 192}, {S_MakeUpW, 5, 64}, {S_TermW, 5, 10}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_MakeUp, 11, 1856}, {S_TermW, 4, 3}, {S_TermW, 5, 11}, {S_TermW, 4, 5}, {S_TermW, 6, 12}, {S_TermW, 5, 9}, {S_MakeUpW, 6, 1664}, {S_TermW, 4, 6}, {S_TermW, 7, 20}, {S_MakeUpW, 5, 128}, {S_TermW, 7, 24}, {S_TermW, 6, 14}, {S_TermW, 7, 28}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 7, 23}, {S_TermW, 4, 3}, {S_TermW, 7, 27}, {S_TermW, 4, 5}, {S_TermW, 8, 40}, {S_TermW, 6, 16}, {S_MakeUpW, 9, 896}, {S_TermW, 4, 6}, {S_TermW, 7, 19}, {S_TermW, 5, 8}, {S_TermW, 8, 56}, {S_MakeUpW, 5, 64}, {S_TermW, 5, 10}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 8, 46}, {S_TermW, 4, 3}, {S_TermW, 5, 11}, {S_TermW, 4, 5}, {S_TermW, 8, 54}, {S_TermW, 5, 9}, {S_MakeUpW, 8, 512}, {S_TermW, 4, 6}, {S_TermW, 8, 36}, {S_MakeUpW, 5, 128}, {S_TermW, 8, 52}, {S_TermW, 6, 15}, {S_TermW, 8, 0}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 6, 13}, {S_TermW, 4, 3}, {S_MakeUpW, 9, 1728}, {S_TermW, 4, 5}, {S_TermW, 8, 44}, {S_TermW, 6, 17}, {S_MakeUpW, 9, 1408}, {S_TermW, 4, 6}, {S_TermW, 6, 1}, {S_TermW, 5, 8}, {S_MakeUpW, 6, 192}, {S_MakeUpW, 5, 64}, {S_TermW, 5, 10}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 8, 30}, {S_TermW, 4, 3}, {S_TermW, 5, 11}, {S_TermW, 4, 5}, {S_TermW, 6, 12}, {S_TermW, 5, 9}, {S_MakeUpW, 6, 1664}, {S_TermW, 4, 6}, {S_TermW, 8, 34}, {S_MakeUpW, 5, 128}, {S_TermW, 8, 50}, {S_TermW, 6, 14}, {S_TermW, 8, 62}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 8, 48}, {S_TermW, 4, 3}, {S_TermW, 8, 60}, {S_TermW, 4, 5}, {S_TermW, 8, 42}, {S_TermW, 6, 16}, {S_MakeUpW, 9, 1152}, {S_TermW, 4, 6}, {S_TermW, 8, 32}, {S_TermW, 5, 8}, {S_TermW, 8, 58}, {S_MakeUpW, 5, 64}, {S_TermW, 5, 10}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 7, 22}, {S_TermW, 4, 3}, {S_TermW, 5, 11}, {S_TermW, 4, 5}, {S_TermW, 7, 26}, {S_TermW, 5, 9}, {S_MakeUpW, 8, 640}, {S_TermW, 4, 6}, {S_TermW, 8, 38}, {S_MakeUpW, 5, 128}, {S_TermW, 7, 25}, {S_TermW, 6, 15}, {S_MakeUpW, 8, 384}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 6, 13}, {S_TermW, 4, 3}, {S_TermW, 7, 18}, {S_TermW, 4, 5}, {S_TermW, 7, 21}, {S_TermW, 6, 17}, {S_MakeUpW, 7, 256}, {S_TermW, 4, 6}, {S_TermW, 6, 1}, {S_TermW, 5, 8}, {S_MakeUpW, 6, 192}, {S_MakeUpW, 5, 64}, {S_TermW, 5, 10}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_Null, 1, 0}, {S_TermW, 4, 3}, {S_TermW, 5, 11}, {S_TermW, 4, 5}, {S_TermW, 6, 12}, {S_TermW, 5, 9}, {S_MakeUpW, 6, 1664}, {S_TermW, 4, 6}, {S_TermW, 7, 20}, {S_MakeUpW, 5, 128}, {S_TermW, 7, 24}, {S_TermW, 6, 14}, {S_TermW, 7, 28}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 7, 23}, {S_TermW, 4, 3}, {S_TermW, 7, 27}, {S_TermW, 4, 5}, {S_TermW, 8, 39}, {S_TermW, 6, 16}, {S_MakeUpW, 8, 576}, {S_TermW, 4, 6}, {S_TermW, 7, 19}, {S_TermW, 5, 8}, {S_TermW, 8, 55}, {S_MakeUpW, 5, 64}, {S_TermW, 5, 10}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 8, 45}, {S_TermW, 4, 3}, {S_TermW, 5, 11}, {S_TermW, 4, 5}, {S_TermW, 8, 53}, {S_TermW, 5, 9}, {S_MakeUpW, 8, 448}, {S_TermW, 4, 6}, {S_TermW, 8, 35}, {S_MakeUpW, 5, 128}, {S_TermW, 8, 51}, {S_TermW, 6, 15}, {S_TermW, 8, 63}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 6, 13}, {S_TermW, 4, 3}, {S_MakeUpW, 9, 1472}, {S_TermW, 4, 5}, {S_TermW, 8, 43}, {S_TermW, 6, 17}, {S_MakeUpW, 9, 1216}, {S_TermW, 4, 6}, {S_TermW, 6, 1}, {S_TermW, 5, 8}, {S_MakeUpW, 6, 192}, {S_MakeUpW, 5, 64}, {S_TermW, 5, 10}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 8, 29}, {S_TermW, 4, 3}, {S_TermW, 5, 11}, {S_TermW, 4, 5}, {S_TermW, 6, 12}, {S_TermW, 5, 9}, {S_MakeUpW, 6, 1664}, {S_TermW, 4, 6}, {S_TermW, 8, 33}, {S_MakeUpW, 5, 128}, {S_TermW, 8, 49}, {S_TermW, 6, 14}, {S_TermW, 8, 61}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 8, 47}, {S_TermW, 4, 3}, {S_TermW, 8, 59}, {S_TermW, 4, 5}, {S_TermW, 8, 41}, {S_TermW, 6, 16}, {S_MakeUpW, 9, 960}, {S_TermW, 4, 6}, {S_TermW, 8, 31}, {S_TermW, 5, 8}, {S_TermW, 8, 57}, {S_MakeUpW, 5, 64}, {S_TermW, 5, 10}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 7, 22}, {S_TermW, 4, 3}, {S_TermW, 5, 11}, {S_TermW, 4, 5}, {S_TermW, 7, 26}, {S_TermW, 5, 9}, {S_MakeUpW, 9, 704}, {S_TermW, 4, 6}, {S_TermW, 8, 37}, {S_MakeUpW, 5, 128}, {S_TermW, 7, 25}, {S_TermW, 6, 15}, {S_MakeUpW, 8, 320}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 6, 13}, {S_TermW, 4, 3}, {S_TermW, 7, 18}, {S_TermW, 4, 5}, {S_TermW, 7, 21}, {S_TermW, 6, 17}, {S_MakeUpW, 7, 256}, {S_TermW, 4, 6}, {S_TermW, 6, 1}, {S_TermW, 5, 8}, {S_MakeUpW, 6, 192}, {S_MakeUpW, 5, 64}, {S_TermW, 5, 10}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_MakeUp, 12, 2112}, {S_TermW, 4, 3}, {S_TermW, 5, 11}, {S_TermW, 4, 5}, {S_TermW, 6, 12}, {S_TermW, 5, 9}, {S_MakeUpW, 6, 1664}, {S_TermW, 4, 6}, {S_TermW, 7, 20}, {S_MakeUpW, 5, 128}, {S_TermW, 7, 24}, {S_TermW, 6, 14}, {S_TermW, 7, 28}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 7, 23}, {S_TermW, 4, 3}, {S_TermW, 7, 27}, {S_TermW, 4, 5}, {S_TermW, 8, 40}, {S_TermW, 6, 16}, {S_MakeUpW, 9, 832}, {S_TermW, 4, 6}, {S_TermW, 7, 19}, {S_TermW, 5, 8}, {S_TermW, 8, 56}, {S_MakeUpW, 5, 64}, {S_TermW, 5, 10}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 8, 46}, {S_TermW, 4, 3}, {S_TermW, 5, 11}, {S_TermW, 4, 5}, {S_TermW, 8, 54}, {S_TermW, 5, 9}, {S_MakeUpW, 8, 512}, {S_TermW, 4, 6}, {S_TermW, 8, 36}, {S_MakeUpW, 5, 128}, {S_TermW, 8, 52}, {S_TermW, 6, 15}, {S_TermW, 8, 0}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 6, 13}, {S_TermW, 4, 3}, {S_MakeUpW, 9, 1600}, {S_TermW, 4, 5}, {S_TermW, 8, 44}, {S_TermW, 6, 17}, {S_MakeUpW, 9, 1344}, {S_TermW, 4, 6}, {S_TermW, 6, 1}, {S_TermW, 5, 8}, {S_MakeUpW, 6, 192}, {S_MakeUpW, 5, 64}, {S_TermW, 5, 10}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 8, 30}, {S_TermW, 4, 3}, {S_TermW, 5, 11}, {S_TermW, 4, 5}, {S_TermW, 6, 12}, {S_TermW, 5, 9}, {S_MakeUpW, 6, 1664}, {S_TermW, 4, 6}, {S_TermW, 8, 34}, {S_MakeUpW, 5, 128}, {S_TermW, 8, 50}, {S_TermW, 6, 14}, {S_TermW, 8, 62}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 8, 48}, {S_TermW, 4, 3}, {S_TermW, 8, 60}, {S_TermW, 4, 5}, {S_TermW, 8, 42}, {S_TermW, 6, 16}, {S_MakeUpW, 9, 1088}, {S_TermW, 4, 6}, {S_TermW, 8, 32}, {S_TermW, 5, 8}, {S_TermW, 8, 58}, {S_MakeUpW, 5, 64}, {S_TermW, 5, 10}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 7, 22}, {S_TermW, 4, 3}, {S_TermW, 5, 11}, {S_TermW, 4, 5}, {S_TermW, 7, 26}, {S_TermW, 5, 9}, {S_MakeUpW, 8, 640}, {S_TermW, 4, 6}, {S_TermW, 8, 38}, {S_MakeUpW, 5, 128}, {S_TermW, 7, 25}, {S_TermW, 6, 15}, {S_MakeUpW, 8, 384}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 6, 13}, {S_TermW, 4, 3}, {S_TermW, 7, 18}, {S_TermW, 4, 5}, {S_TermW, 7, 21}, {S_TermW, 6, 17}, {S_MakeUpW, 7, 256}, {S_TermW, 4, 6}, {S_TermW, 6, 1}, {S_TermW, 5, 8}, {S_MakeUpW, 6, 192}, {S_MakeUpW, 5, 64}, {S_TermW, 5, 10}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_Null, 1, 0}, {S_TermW, 4, 3}, {S_TermW, 5, 11}, {S_TermW, 4, 5}, {S_TermW, 6, 12}, {S_TermW, 5, 9}, {S_MakeUpW, 6, 1664}, {S_TermW, 4, 6}, {S_TermW, 7, 20}, {S_MakeUpW, 5, 128}, {S_TermW, 7, 24}, {S_TermW, 6, 14}, {S_TermW, 7, 28}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 7, 23}, {S_TermW, 4, 3}, {S_TermW, 7, 27}, {S_TermW, 4, 5}, {S_TermW, 8, 39}, {S_TermW, 6, 16}, {S_MakeUpW, 8, 576}, {S_TermW, 4, 6}, {S_TermW, 7, 19}, {S_TermW, 5, 8}, {S_TermW, 8, 55}, {S_MakeUpW, 5, 64}, {S_TermW, 5, 10}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 8, 45}, {S_TermW, 4, 3}, {S_TermW, 5, 11}, {S_TermW, 4, 5}, {S_TermW, 8, 53}, {S_TermW, 5, 9}, {S_MakeUpW, 8, 448}, {S_TermW, 4, 6}, {S_TermW, 8, 35}, {S_MakeUpW, 5, 128}, {S_TermW, 8, 51}, {S_TermW, 6, 15}, {S_TermW, 8, 63}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 6, 13}, {S_TermW, 4, 3}, {S_MakeUpW, 9, 1536}, {S_TermW, 4, 5}, {S_TermW, 8, 43}, {S_TermW, 6, 17}, {S_MakeUpW, 9, 1280}, {S_TermW, 4, 6}, {S_TermW, 6, 1}, {S_TermW, 5, 8}, {S_MakeUpW, 6, 192}, {S_MakeUpW, 5, 64}, {S_TermW, 5, 10}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 8, 29}, {S_TermW, 4, 3}, {S_TermW, 5, 11}, {S_TermW, 4, 5}, {S_TermW, 6, 12}, {S_TermW, 5, 9}, {S_MakeUpW, 6, 1664}, {S_TermW, 4, 6}, {S_TermW, 8, 33}, {S_MakeUpW, 5, 128}, {S_TermW, 8, 49}, {S_TermW, 6, 14}, {S_TermW, 8, 61}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 8, 47}, {S_TermW, 4, 3}, {S_TermW, 8, 59}, {S_TermW, 4, 5}, {S_TermW, 8, 41}, {S_TermW, 6, 16}, {S_MakeUpW, 9, 1024}, {S_TermW, 4, 6}, {S_TermW, 8, 31}, {S_TermW, 5, 8}, {S_TermW, 8, 57}, {S_MakeUpW, 5, 64}, {S_TermW, 5, 10}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 7, 22}, {S_TermW, 4, 3}, {S_TermW, 5, 11}, {S_TermW, 4, 5}, {S_TermW, 7, 26}, {S_TermW, 5, 9}, {S_MakeUpW, 9, 768}, {S_TermW, 4, 6}, {S_TermW, 8, 37}, {S_MakeUpW, 5, 128}, {S_TermW, 7, 25}, {S_TermW, 6, 15}, {S_MakeUpW, 8, 320}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 6, 13}, {S_TermW, 4, 3}, {S_TermW, 7, 18}, {S_TermW, 4, 5}, {S_TermW, 7, 21}, {S_TermW, 6, 17}, {S_MakeUpW, 7, 256}, {S_TermW, 4, 6}, {S_TermW, 6, 1}, {S_TermW, 5, 8}, {S_MakeUpW, 6, 192}, {S_MakeUpW, 5, 64}, {S_TermW, 5, 10}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_MakeUp, 12, 2368}, {S_TermW, 4, 3}, {S_TermW, 5, 11}, {S_TermW, 4, 5}, {S_TermW, 6, 12}, {S_TermW, 5, 9}, {S_MakeUpW, 6, 1664}, {S_TermW, 4, 6}, {S_TermW, 7, 20}, {S_MakeUpW, 5, 128}, {S_TermW, 7, 24}, {S_TermW, 6, 14}, {S_TermW, 7, 28}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 7, 23}, {S_TermW, 4, 3}, {S_TermW, 7, 27}, {S_TermW, 4, 5}, {S_TermW, 8, 40}, {S_TermW, 6, 16}, {S_MakeUpW, 9, 896}, {S_TermW, 4, 6}, {S_TermW, 7, 19}, {S_TermW, 5, 8}, {S_TermW, 8, 56}, {S_MakeUpW, 5, 64}, {S_TermW, 5, 10}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 8, 46}, {S_TermW, 4, 3}, {S_TermW, 5, 11}, {S_TermW, 4, 5}, {S_TermW, 8, 54}, {S_TermW, 5, 9}, {S_MakeUpW, 8, 512}, {S_TermW, 4, 6}, {S_TermW, 8, 36}, {S_MakeUpW, 5, 128}, {S_TermW, 8, 52}, {S_TermW, 6, 15}, {S_TermW, 8, 0}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 6, 13}, {S_TermW, 4, 3}, {S_MakeUpW, 9, 1728}, {S_TermW, 4, 5}, {S_TermW, 8, 44}, {S_TermW, 6, 17}, {S_MakeUpW, 9, 1408}, {S_TermW, 4, 6}, {S_TermW, 6, 1}, {S_TermW, 5, 8}, {S_MakeUpW, 6, 192}, {S_MakeUpW, 5, 64}, {S_TermW, 5, 10}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 8, 30}, {S_TermW, 4, 3}, {S_TermW, 5, 11}, {S_TermW, 4, 5}, {S_TermW, 6, 12}, {S_TermW, 5, 9}, {S_MakeUpW, 6, 1664}, {S_TermW, 4, 6}, {S_TermW, 8, 34}, {S_MakeUpW, 5, 128}, {S_TermW, 8, 50}, {S_TermW, 6, 14}, {S_TermW, 8, 62}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 8, 48}, {S_TermW, 4, 3}, {S_TermW, 8, 60}, {S_TermW, 4, 5}, {S_TermW, 8, 42}, {S_TermW, 6, 16}, {S_MakeUpW, 9, 1152}, {S_TermW, 4, 6}, {S_TermW, 8, 32}, {S_TermW, 5, 8}, {S_TermW, 8, 58}, {S_MakeUpW, 5, 64}, {S_TermW, 5, 10}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 7, 22}, {S_TermW, 4, 3}, {S_TermW, 5, 11}, {S_TermW, 4, 5}, {S_TermW, 7, 26}, {S_TermW, 5, 9}, {S_MakeUpW, 8, 640}, {S_TermW, 4, 6}, {S_TermW, 8, 38}, {S_MakeUpW, 5, 128}, {S_TermW, 7, 25}, {S_TermW, 6, 15}, {S_MakeUpW, 8, 384}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 6, 13}, {S_TermW, 4, 3}, {S_TermW, 7, 18}, {S_TermW, 4, 5}, {S_TermW, 7, 21}, {S_TermW, 6, 17}, {S_MakeUpW, 7, 256}, {S_TermW, 4, 6}, {S_TermW, 6, 1}, {S_TermW, 5, 8}, {S_MakeUpW, 6, 192}, {S_MakeUpW, 5, 64}, {S_TermW, 5, 10}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_Null, 1, 0}, {S_TermW, 4, 3}, {S_TermW, 5, 11}, {S_TermW, 4, 5}, {S_TermW, 6, 12}, {S_TermW, 5, 9}, {S_MakeUpW, 6, 1664}, {S_TermW, 4, 6}, {S_TermW, 7, 20}, {S_MakeUpW, 5, 128}, {S_TermW, 7, 24}, {S_TermW, 6, 14}, {S_TermW, 7, 28}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 7, 23}, {S_TermW, 4, 3}, {S_TermW, 7, 27}, {S_TermW, 4, 5}, {S_TermW, 8, 39}, {S_TermW, 6, 16}, {S_MakeUpW, 8, 576}, {S_TermW, 4, 6}, {S_TermW, 7, 19}, {S_TermW, 5, 8}, {S_TermW, 8, 55}, {S_MakeUpW, 5, 64}, {S_TermW, 5, 10}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 8, 45}, {S_TermW, 4, 3}, {S_TermW, 5, 11}, {S_TermW, 4, 5}, {S_TermW, 8, 53}, {S_TermW, 5, 9}, {S_MakeUpW, 8, 448}, {S_TermW, 4, 6}, {S_TermW, 8, 35}, {S_MakeUpW, 5, 128}, {S_TermW, 8, 51}, {S_TermW, 6, 15}, {S_TermW, 8, 63}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 6, 13}, {S_TermW, 4, 3}, {S_MakeUpW, 9, 1472}, {S_TermW, 4, 5}, {S_TermW, 8, 43}, {S_TermW, 6, 17}, {S_MakeUpW, 9, 1216}, {S_TermW, 4, 6}, {S_TermW, 6, 1}, {S_TermW, 5, 8}, {S_MakeUpW, 6, 192}, {S_MakeUpW, 5, 64}, {S_TermW, 5, 10}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 8, 29}, {S_TermW, 4, 3}, {S_TermW, 5, 11}, {S_TermW, 4, 5}, {S_TermW, 6, 12}, {S_TermW, 5, 9}, {S_MakeUpW, 6, 1664}, {S_TermW, 4, 6}, {S_TermW, 8, 33}, {S_MakeUpW, 5, 128}, {S_TermW, 8, 49}, {S_TermW, 6, 14}, {S_TermW, 8, 61}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 8, 47}, {S_TermW, 4, 3}, {S_TermW, 8, 59}, {S_TermW, 4, 5}, {S_TermW, 8, 41}, {S_TermW, 6, 16}, {S_MakeUpW, 9, 960}, {S_TermW, 4, 6}, {S_TermW, 8, 31}, {S_TermW, 5, 8}, {S_TermW, 8, 57}, {S_MakeUpW, 5, 64}, {S_TermW, 5, 10}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 7, 22}, {S_TermW, 4, 3}, {S_TermW, 5, 11}, {S_TermW, 4, 5}, {S_TermW, 7, 26}, {S_TermW, 5, 9}, {S_MakeUpW, 9, 704}, {S_TermW, 4, 6}, {S_TermW, 8, 37}, {S_MakeUpW, 5, 128}, {S_TermW, 7, 25}, {S_TermW, 6, 15}, {S_MakeUpW, 8, 320}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 6, 13}, {S_TermW, 4, 3}, {S_TermW, 7, 18}, {S_TermW, 4, 5}, {S_TermW, 7, 21}, {S_TermW, 6, 17}, {S_MakeUpW, 7, 256}, {S_TermW, 4, 6}, {S_TermW, 6, 1}, {S_TermW, 5, 8}, {S_MakeUpW, 6, 192}, {S_MakeUpW, 5, 64}, {S_TermW, 5, 10}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_MakeUp, 12, 1984}, {S_TermW, 4, 3}, {S_TermW, 5, 11}, {S_TermW, 4, 5}, {S_TermW, 6, 12}, {S_TermW, 5, 9}, {S_MakeUpW, 6, 1664}, {S_TermW, 4, 6}, {S_TermW, 7, 20}, {S_MakeUpW, 5, 128}, {S_TermW, 7, 24}, {S_TermW, 6, 14}, {S_TermW, 7, 28}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 7, 23}, {S_TermW, 4, 3}, {S_TermW, 7, 27}, {S_TermW, 4, 5}, {S_TermW, 8, 40}, {S_TermW, 6, 16}, {S_MakeUpW, 9, 832}, {S_TermW, 4, 6}, {S_TermW, 7, 19}, {S_TermW, 5, 8}, {S_TermW, 8, 56}, {S_MakeUpW, 5, 64}, {S_TermW, 5, 10}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 8, 46}, {S_TermW, 4, 3}, {S_TermW, 5, 11}, {S_TermW, 4, 5}, {S_TermW, 8, 54}, {S_TermW, 5, 9}, {S_MakeUpW, 8, 512}, {S_TermW, 4, 6}, {S_TermW, 8, 36}, {S_MakeUpW, 5, 128}, {S_TermW, 8, 52}, {S_TermW, 6, 15}, {S_TermW, 8, 0}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 6, 13}, {S_TermW, 4, 3}, {S_MakeUpW, 9, 1600}, {S_TermW, 4, 5}, {S_TermW, 8, 44}, {S_TermW, 6, 17}, {S_MakeUpW, 9, 1344}, {S_TermW, 4, 6}, {S_TermW, 6, 1}, {S_TermW, 5, 8}, {S_MakeUpW, 6, 192}, {S_MakeUpW, 5, 64}, {S_TermW, 5, 10}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 8, 30}, {S_TermW, 4, 3}, {S_TermW, 5, 11}, {S_TermW, 4, 5}, {S_TermW, 6, 12}, {S_TermW, 5, 9}, {S_MakeUpW, 6, 1664}, {S_TermW, 4, 6}, {S_TermW, 8, 34}, {S_MakeUpW, 5, 128}, {S_TermW, 8, 50}, {S_TermW, 6, 14}, {S_TermW, 8, 62}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 8, 48}, {S_TermW, 4, 3}, {S_TermW, 8, 60}, {S_TermW, 4, 5}, {S_TermW, 8, 42}, {S_TermW, 6, 16}, {S_MakeUpW, 9, 1088}, {S_TermW, 4, 6}, {S_TermW, 8, 32}, {S_TermW, 5, 8}, {S_TermW, 8, 58}, {S_MakeUpW, 5, 64}, {S_TermW, 5, 10}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 7, 22}, {S_TermW, 4, 3}, {S_TermW, 5, 11}, {S_TermW, 4, 5}, {S_TermW, 7, 26}, {S_TermW, 5, 9}, {S_MakeUpW, 8, 640}, {S_TermW, 4, 6}, {S_TermW, 8, 38}, {S_MakeUpW, 5, 128}, {S_TermW, 7, 25}, {S_TermW, 6, 15}, {S_MakeUpW, 8, 384}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 6, 13}, {S_TermW, 4, 3}, {S_TermW, 7, 18}, {S_TermW, 4, 5}, {S_TermW, 7, 21}, {S_TermW, 6, 17}, {S_MakeUpW, 7, 256}, {S_TermW, 4, 6}, {S_TermW, 6, 1}, {S_TermW, 5, 8}, {S_MakeUpW, 6, 192}, {S_MakeUpW, 5, 64}, {S_TermW, 5, 10}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_Null, 1, 0}, {S_TermW, 4, 3}, {S_TermW, 5, 11}, {S_TermW, 4, 5}, {S_TermW, 6, 12}, {S_TermW, 5, 9}, {S_MakeUpW, 6, 1664}, {S_TermW, 4, 6}, {S_TermW, 7, 20}, {S_MakeUpW, 5, 128}, {S_TermW, 7, 24}, {S_TermW, 6, 14}, {S_TermW, 7, 28}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 7, 23}, {S_TermW, 4, 3}, {S_TermW, 7, 27}, {S_TermW, 4, 5}, {S_TermW, 8, 39}, {S_TermW, 6, 16}, {S_MakeUpW, 8, 576}, {S_TermW, 4, 6}, {S_TermW, 7, 19}, {S_TermW, 5, 8}, {S_TermW, 8, 55}, {S_MakeUpW, 5, 64}, {S_TermW, 5, 10}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 8, 45}, {S_TermW, 4, 3}, {S_TermW, 5, 11}, {S_TermW, 4, 5}, {S_TermW, 8, 53}, {S_TermW, 5, 9}, {S_MakeUpW, 8, 448}, {S_TermW, 4, 6}, {S_TermW, 8, 35}, {S_MakeUpW, 5, 128}, {S_TermW, 8, 51}, {S_TermW, 6, 15}, {S_TermW, 8, 63}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 6, 13}, {S_TermW, 4, 3}, {S_MakeUpW, 9, 1536}, {S_TermW, 4, 5}, {S_TermW, 8, 43}, {S_TermW, 6, 17}, {S_MakeUpW, 9, 1280}, {S_TermW, 4, 6}, {S_TermW, 6, 1}, {S_TermW, 5, 8}, {S_MakeUpW, 6, 192}, {S_MakeUpW, 5, 64}, {S_TermW, 5, 10}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 8, 29}, {S_TermW, 4, 3}, {S_TermW, 5, 11}, {S_TermW, 4, 5}, {S_TermW, 6, 12}, {S_TermW, 5, 9}, {S_MakeUpW, 6, 1664}, {S_TermW, 4, 6}, {S_TermW, 8, 33}, {S_MakeUpW, 5, 128}, {S_TermW, 8, 49}, {S_TermW, 6, 14}, {S_TermW, 8, 61}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 8, 47}, {S_TermW, 4, 3}, {S_TermW, 8, 59}, {S_TermW, 4, 5}, {S_TermW, 8, 41}, {S_TermW, 6, 16}, {S_MakeUpW, 9, 1024}, {S_TermW, 4, 6}, {S_TermW, 8, 31}, {S_TermW, 5, 8}, {S_TermW, 8, 57}, {S_MakeUpW, 5, 64}, {S_TermW, 5, 10}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 7, 22}, {S_TermW, 4, 3}, {S_TermW, 5, 11}, {S_TermW, 4, 5}, {S_TermW, 7, 26}, {S_TermW, 5, 9}, {S_MakeUpW, 9, 768}, {S_TermW, 4, 6}, {S_TermW, 8, 37}, {S_MakeUpW, 5, 128}, {S_TermW, 7, 25}, {S_TermW, 6, 15}, {S_MakeUpW, 8, 320}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 6, 13}, {S_TermW, 4, 3}, {S_TermW, 7, 18}, {S_TermW, 4, 5}, {S_TermW, 7, 21}, {S_TermW, 6, 17}, {S_MakeUpW, 7, 256}, {S_TermW, 4, 6}, {S_TermW, 6, 1}, {S_TermW, 5, 8}, {S_MakeUpW, 6, 192}, {S_MakeUpW, 5, 64}, {S_TermW, 5, 10}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_MakeUp, 11, 1920}, {S_TermW, 4, 3}, {S_TermW, 5, 11}, {S_TermW, 4, 5}, {S_TermW, 6, 12}, {S_TermW, 5, 9}, {S_MakeUpW, 6, 1664}, {S_TermW, 4, 6}, {S_TermW, 7, 20}, {S_MakeUpW, 5, 128}, {S_TermW, 7, 24}, {S_TermW, 6, 14}, {S_TermW, 7, 28}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 7, 23}, {S_TermW, 4, 3}, {S_TermW, 7, 27}, {S_TermW, 4, 5}, {S_TermW, 8, 40}, {S_TermW, 6, 16}, {S_MakeUpW, 9, 896}, {S_TermW, 4, 6}, {S_TermW, 7, 19}, {S_TermW, 5, 8}, {S_TermW, 8, 56}, {S_MakeUpW, 5, 64}, {S_TermW, 5, 10}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 8, 46}, {S_TermW, 4, 3}, {S_TermW, 5, 11}, {S_TermW, 4, 5}, {S_TermW, 8, 54}, {S_TermW, 5, 9}, {S_MakeUpW, 8, 512}, {S_TermW, 4, 6}, {S_TermW, 8, 36}, {S_MakeUpW, 5, 128}, {S_TermW, 8, 52}, {S_TermW, 6, 15}, {S_TermW, 8, 0}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 6, 13}, {S_TermW, 4, 3}, {S_MakeUpW, 9, 1728}, {S_TermW, 4, 5}, {S_TermW, 8, 44}, {S_TermW, 6, 17}, {S_MakeUpW, 9, 1408}, {S_TermW, 4, 6}, {S_TermW, 6, 1}, {S_TermW, 5, 8}, {S_MakeUpW, 6, 192}, {S_MakeUpW, 5, 64}, {S_TermW, 5, 10}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 8, 30}, {S_TermW, 4, 3}, {S_TermW, 5, 11}, {S_TermW, 4, 5}, {S_TermW, 6, 12}, {S_TermW, 5, 9}, {S_MakeUpW, 6, 1664}, {S_TermW, 4, 6}, {S_TermW, 8, 34}, {S_MakeUpW, 5, 128}, {S_TermW, 8, 50}, {S_TermW, 6, 14}, {S_TermW, 8, 62}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 8, 48}, {S_TermW, 4, 3}, {S_TermW, 8, 60}, {S_TermW, 4, 5}, {S_TermW, 8, 42}, {S_TermW, 6, 16}, {S_MakeUpW, 9, 1152}, {S_TermW, 4, 6}, {S_TermW, 8, 32}, {S_TermW, 5, 8}, {S_TermW, 8, 58}, {S_MakeUpW, 5, 64}, {S_TermW, 5, 10}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 7, 22}, {S_TermW, 4, 3}, {S_TermW, 5, 11}, {S_TermW, 4, 5}, {S_TermW, 7, 26}, {S_TermW, 5, 9}, {S_MakeUpW, 8, 640}, {S_TermW, 4, 6}, {S_TermW, 8, 38}, {S_MakeUpW, 5, 128}, {S_TermW, 7, 25}, {S_TermW, 6, 15}, {S_MakeUpW, 8, 384}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 6, 13}, {S_TermW, 4, 3}, {S_TermW, 7, 18}, {S_TermW, 4, 5}, {S_TermW, 7, 21}, {S_TermW, 6, 17}, {S_MakeUpW, 7, 256}, {S_TermW, 4, 6}, {S_TermW, 6, 1}, {S_TermW, 5, 8}, {S_MakeUpW, 6, 192}, {S_MakeUpW, 5, 64}, {S_TermW, 5, 10}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_Null, 1, 0}, {S_TermW, 4, 3}, {S_TermW, 5, 11}, {S_TermW, 4, 5}, {S_TermW, 6, 12}, {S_TermW, 5, 9}, {S_MakeUpW, 6, 1664}, {S_TermW, 4, 6}, {S_TermW, 7, 20}, {S_MakeUpW, 5, 128}, {S_TermW, 7, 24}, {S_TermW, 6, 14}, {S_TermW, 7, 28}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 7, 23}, {S_TermW, 4, 3}, {S_TermW, 7, 27}, {S_TermW, 4, 5}, {S_TermW, 8, 39}, {S_TermW, 6, 16}, {S_MakeUpW, 8, 576}, {S_TermW, 4, 6}, {S_TermW, 7, 19}, {S_TermW, 5, 8}, {S_TermW, 8, 55}, {S_MakeUpW, 5, 64}, {S_TermW, 5, 10}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 8, 45}, {S_TermW, 4, 3}, {S_TermW, 5, 11}, {S_TermW, 4, 5}, {S_TermW, 8, 53}, {S_TermW, 5, 9}, {S_MakeUpW, 8, 448}, {S_TermW, 4, 6}, {S_TermW, 8, 35}, {S_MakeUpW, 5, 128}, {S_TermW, 8, 51}, {S_TermW, 6, 15}, {S_TermW, 8, 63}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 6, 13}, {S_TermW, 4, 3}, {S_MakeUpW, 9, 1472}, {S_TermW, 4, 5}, {S_TermW, 8, 43}, {S_TermW, 6, 17}, {S_MakeUpW, 9, 1216}, {S_TermW, 4, 6}, {S_TermW, 6, 1}, {S_TermW, 5, 8}, {S_MakeUpW, 6, 192}, {S_MakeUpW, 5, 64}, {S_TermW, 5, 10}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 8, 29}, {S_TermW, 4, 3}, {S_TermW, 5, 11}, {S_TermW, 4, 5}, {S_TermW, 6, 12}, {S_TermW, 5, 9}, {S_MakeUpW, 6, 1664}, {S_TermW, 4, 6}, {S_TermW, 8, 33}, {S_MakeUpW, 5, 128}, {S_TermW, 8, 49}, {S_TermW, 6, 14}, {S_TermW, 8, 61}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 8, 47}, {S_TermW, 4, 3}, {S_TermW, 8, 59}, {S_TermW, 4, 5}, {S_TermW, 8, 41}, {S_TermW, 6, 16}, {S_MakeUpW, 9, 960}, {S_TermW, 4, 6}, {S_TermW, 8, 31}, {S_TermW, 5, 8}, {S_TermW, 8, 57}, {S_MakeUpW, 5, 64}, {S_TermW, 5, 10}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 7, 22}, {S_TermW, 4, 3}, {S_TermW, 5, 11}, {S_TermW, 4, 5}, {S_TermW, 7, 26}, {S_TermW, 5, 9}, {S_MakeUpW, 9, 704}, {S_TermW, 4, 6}, {S_TermW, 8, 37}, {S_MakeUpW, 5, 128}, {S_TermW, 7, 25}, {S_TermW, 6, 15}, {S_MakeUpW, 8, 320}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 6, 13}, {S_TermW, 4, 3}, {S_TermW, 7, 18}, {S_TermW, 4, 5}, {S_TermW, 7, 21}, {S_TermW, 6, 17}, {S_MakeUpW, 7, 256}, {S_TermW, 4, 6}, {S_TermW, 6, 1}, {S_TermW, 5, 8}, {S_MakeUpW, 6, 192}, {S_MakeUpW, 5, 64}, {S_TermW, 5, 10}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_MakeUp, 12, 2240}, {S_TermW, 4, 3}, {S_TermW, 5, 11}, {S_TermW, 4, 5}, {S_TermW, 6, 12}, {S_TermW, 5, 9}, {S_MakeUpW, 6, 1664}, {S_TermW, 4, 6}, {S_TermW, 7, 20}, {S_MakeUpW, 5, 128}, {S_TermW, 7, 24}, {S_TermW, 6, 14}, {S_TermW, 7, 28}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 7, 23}, {S_TermW, 4, 3}, {S_TermW, 7, 27}, {S_TermW, 4, 5}, {S_TermW, 8, 40}, {S_TermW, 6, 16}, {S_MakeUpW, 9, 832}, {S_TermW, 4, 6}, {S_TermW, 7, 19}, {S_TermW, 5, 8}, {S_TermW, 8, 56}, {S_MakeUpW, 5, 64}, {S_TermW, 5, 10}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 8, 46}, {S_TermW, 4, 3}, {S_TermW, 5, 11}, {S_TermW, 4, 5}, {S_TermW, 8, 54}, {S_TermW, 5, 9}, {S_MakeUpW, 8, 512}, {S_TermW, 4, 6}, {S_TermW, 8, 36}, {S_MakeUpW, 5, 128}, {S_TermW, 8, 52}, {S_TermW, 6, 15}, {S_TermW, 8, 0}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 6, 13}, {S_TermW, 4, 3}, {S_MakeUpW, 9, 1600}, {S_TermW, 4, 5}, {S_TermW, 8, 44}, {S_TermW, 6, 17}, {S_MakeUpW, 9, 1344}, {S_TermW, 4, 6}, {S_TermW, 6, 1}, {S_TermW, 5, 8}, {S_MakeUpW, 6, 192}, {S_MakeUpW, 5, 64}, {S_TermW, 5, 10}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 8, 30}, {S_TermW, 4, 3}, {S_TermW, 5, 11}, {S_TermW, 4, 5}, {S_TermW, 6, 12}, {S_TermW, 5, 9}, {S_MakeUpW, 6, 1664}, {S_TermW, 4, 6}, {S_TermW, 8, 34}, {S_MakeUpW, 5, 128}, {S_TermW, 8, 50}, {S_TermW, 6, 14}, {S_TermW, 8, 62}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 8, 48}, {S_TermW, 4, 3}, {S_TermW, 8, 60}, {S_TermW, 4, 5}, {S_TermW, 8, 42}, {S_TermW, 6, 16}, {S_MakeUpW, 9, 1088}, {S_TermW, 4, 6}, {S_TermW, 8, 32}, {S_TermW, 5, 8}, {S_TermW, 8, 58}, {S_MakeUpW, 5, 64}, {S_TermW, 5, 10}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 7, 22}, {S_TermW, 4, 3}, {S_TermW, 5, 11}, {S_TermW, 4, 5}, {S_TermW, 7, 26}, {S_TermW, 5, 9}, {S_MakeUpW, 8, 640}, {S_TermW, 4, 6}, {S_TermW, 8, 38}, {S_MakeUpW, 5, 128}, {S_TermW, 7, 25}, {S_TermW, 6, 15}, {S_MakeUpW, 8, 384}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 6, 13}, {S_TermW, 4, 3}, {S_TermW, 7, 18}, {S_TermW, 4, 5}, {S_TermW, 7, 21}, {S_TermW, 6, 17}, {S_MakeUpW, 7, 256}, {S_TermW, 4, 6}, {S_TermW, 6, 1}, {S_TermW, 5, 8}, {S_MakeUpW, 6, 192}, {S_MakeUpW, 5, 64}, {S_TermW, 5, 10}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_Null, 1, 0}, {S_TermW, 4, 3}, {S_TermW, 5, 11}, {S_TermW, 4, 5}, {S_TermW, 6, 12}, {S_TermW, 5, 9}, {S_MakeUpW, 6, 1664}, {S_TermW, 4, 6}, {S_TermW, 7, 20}, {S_MakeUpW, 5, 128}, {S_TermW, 7, 24}, {S_TermW, 6, 14}, {S_TermW, 7, 28}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 7, 23}, {S_TermW, 4, 3}, {S_TermW, 7, 27}, {S_TermW, 4, 5}, {S_TermW, 8, 39}, {S_TermW, 6, 16}, {S_MakeUpW, 8, 576}, {S_TermW, 4, 6}, {S_TermW, 7, 19}, {S_TermW, 5, 8}, {S_TermW, 8, 55}, {S_MakeUpW, 5, 64}, {S_TermW, 5, 10}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 8, 45}, {S_TermW, 4, 3}, {S_TermW, 5, 11}, {S_TermW, 4, 5}, {S_TermW, 8, 53}, {S_TermW, 5, 9}, {S_MakeUpW, 8, 448}, {S_TermW, 4, 6}, {S_TermW, 8, 35}, {S_MakeUpW, 5, 128}, {S_TermW, 8, 51}, {S_TermW, 6, 15}, {S_TermW, 8, 63}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 6, 13}, {S_TermW, 4, 3}, {S_MakeUpW, 9, 1536}, {S_TermW, 4, 5}, {S_TermW, 8, 43}, {S_TermW, 6, 17}, {S_MakeUpW, 9, 1280}, {S_TermW, 4, 6}, {S_TermW, 6, 1}, {S_TermW, 5, 8}, {S_MakeUpW, 6, 192}, {S_MakeUpW, 5, 64}, {S_TermW, 5, 10}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 8, 29}, {S_TermW, 4, 3}, {S_TermW, 5, 11}, {S_TermW, 4, 5}, {S_TermW, 6, 12}, {S_TermW, 5, 9}, {S_MakeUpW, 6, 1664}, {S_TermW, 4, 6}, {S_TermW, 8, 33}, {S_MakeUpW, 5, 128}, {S_TermW, 8, 49}, {S_TermW, 6, 14}, {S_TermW, 8, 61}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 8, 47}, {S_TermW, 4, 3}, {S_TermW, 8, 59}, {S_TermW, 4, 5}, {S_TermW, 8, 41}, {S_TermW, 6, 16}, {S_MakeUpW, 9, 1024}, {S_TermW, 4, 6}, {S_TermW, 8, 31}, {S_TermW, 5, 8}, {S_TermW, 8, 57}, {S_MakeUpW, 5, 64}, {S_TermW, 5, 10}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 7, 22}, {S_TermW, 4, 3}, {S_TermW, 5, 11}, {S_TermW, 4, 5}, {S_TermW, 7, 26}, {S_TermW, 5, 9}, {S_MakeUpW, 9, 768}, {S_TermW, 4, 6}, {S_TermW, 8, 37}, {S_MakeUpW, 5, 128}, {S_TermW, 7, 25}, {S_TermW, 6, 15}, {S_MakeUpW, 8, 320}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 6, 13}, {S_TermW, 4, 3}, {S_TermW, 7, 18}, {S_TermW, 4, 5}, {S_TermW, 7, 21}, {S_TermW, 6, 17}, {S_MakeUpW, 7, 256}, {S_TermW, 4, 6}, {S_TermW, 6, 1}, {S_TermW, 5, 8}, {S_MakeUpW, 6, 192}, {S_MakeUpW, 5, 64}, {S_TermW, 5, 10}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_MakeUp, 12, 2496}, {S_TermW, 4, 3}, {S_TermW, 5, 11}, {S_TermW, 4, 5}, {S_TermW, 6, 12}, {S_TermW, 5, 9}, {S_MakeUpW, 6, 1664}, {S_TermW, 4, 6}, {S_TermW, 7, 20}, {S_MakeUpW, 5, 128}, {S_TermW, 7, 24}, {S_TermW, 6, 14}, {S_TermW, 7, 28}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 7, 23}, {S_TermW, 4, 3}, {S_TermW, 7, 27}, {S_TermW, 4, 5}, {S_TermW, 8, 40}, {S_TermW, 6, 16}, {S_MakeUpW, 9, 896}, {S_TermW, 4, 6}, {S_TermW, 7, 19}, {S_TermW, 5, 8}, {S_TermW, 8, 56}, {S_MakeUpW, 5, 64}, {S_TermW, 5, 10}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 8, 46}, {S_TermW, 4, 3}, {S_TermW, 5, 11}, {S_TermW, 4, 5}, {S_TermW, 8, 54}, {S_TermW, 5, 9}, {S_MakeUpW, 8, 512}, {S_TermW, 4, 6}, {S_TermW, 8, 36}, {S_MakeUpW, 5, 128}, {S_TermW, 8, 52}, {S_TermW, 6, 15}, {S_TermW, 8, 0}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 6, 13}, {S_TermW, 4, 3}, {S_MakeUpW, 9, 1728}, {S_TermW, 4, 5}, {S_TermW, 8, 44}, {S_TermW, 6, 17}, {S_MakeUpW, 9, 1408}, {S_TermW, 4, 6}, {S_TermW, 6, 1}, {S_TermW, 5, 8}, {S_MakeUpW, 6, 192}, {S_MakeUpW, 5, 64}, {S_TermW, 5, 10}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 8, 30}, {S_TermW, 4, 3}, {S_TermW, 5, 11}, {S_TermW, 4, 5}, {S_TermW, 6, 12}, {S_TermW, 5, 9}, {S_MakeUpW, 6, 1664}, {S_TermW, 4, 6}, {S_TermW, 8, 34}, {S_MakeUpW, 5, 128}, {S_TermW, 8, 50}, {S_TermW, 6, 14}, {S_TermW, 8, 62}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 8, 48}, {S_TermW, 4, 3}, {S_TermW, 8, 60}, {S_TermW, 4, 5}, {S_TermW, 8, 42}, {S_TermW, 6, 16}, {S_MakeUpW, 9, 1152}, {S_TermW, 4, 6}, {S_TermW, 8, 32}, {S_TermW, 5, 8}, {S_TermW, 8, 58}, {S_MakeUpW, 5, 64}, {S_TermW, 5, 10}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 7, 22}, {S_TermW, 4, 3}, {S_TermW, 5, 11}, {S_TermW, 4, 5}, {S_TermW, 7, 26}, {S_TermW, 5, 9}, {S_MakeUpW, 8, 640}, {S_TermW, 4, 6}, {S_TermW, 8, 38}, {S_MakeUpW, 5, 128}, {S_TermW, 7, 25}, {S_TermW, 6, 15}, {S_MakeUpW, 8, 384}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 6, 13}, {S_TermW, 4, 3}, {S_TermW, 7, 18}, {S_TermW, 4, 5}, {S_TermW, 7, 21}, {S_TermW, 6, 17}, {S_MakeUpW, 7, 256}, {S_TermW, 4, 6}, {S_TermW, 6, 1}, {S_TermW, 5, 8}, {S_MakeUpW, 6, 192}, {S_MakeUpW, 5, 64}, {S_TermW, 5, 10}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_EOL, 12, 0}, {S_TermW, 4, 3}, {S_TermW, 5, 11}, {S_TermW, 4, 5}, {S_TermW, 6, 12}, {S_TermW, 5, 9}, {S_MakeUpW, 6, 1664}, {S_TermW, 4, 6}, {S_TermW, 7, 20}, {S_MakeUpW, 5, 128}, {S_TermW, 7, 24}, {S_TermW, 6, 14}, {S_TermW, 7, 28}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 7, 23}, {S_TermW, 4, 3}, {S_TermW, 7, 27}, {S_TermW, 4, 5}, {S_TermW, 8, 39}, {S_TermW, 6, 16}, {S_MakeUpW, 8, 576}, {S_TermW, 4, 6}, {S_TermW, 7, 19}, {S_TermW, 5, 8}, {S_TermW, 8, 55}, {S_MakeUpW, 5, 64}, {S_TermW, 5, 10}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 8, 45}, {S_TermW, 4, 3}, {S_TermW, 5, 11}, {S_TermW, 4, 5}, {S_TermW, 8, 53}, {S_TermW, 5, 9}, {S_MakeUpW, 8, 448}, {S_TermW, 4, 6}, {S_TermW, 8, 35}, {S_MakeUpW, 5, 128}, {S_TermW, 8, 51}, {S_TermW, 6, 15}, {S_TermW, 8, 63}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 6, 13}, {S_TermW, 4, 3}, {S_MakeUpW, 9, 1472}, {S_TermW, 4, 5}, {S_TermW, 8, 43}, {S_TermW, 6, 17}, {S_MakeUpW, 9, 1216}, {S_TermW, 4, 6}, {S_TermW, 6, 1}, {S_TermW, 5, 8}, {S_MakeUpW, 6, 192}, {S_MakeUpW, 5, 64}, {S_TermW, 5, 10}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 8, 29}, {S_TermW, 4, 3}, {S_TermW, 5, 11}, {S_TermW, 4, 5}, {S_TermW, 6, 12}, {S_TermW, 5, 9}, {S_MakeUpW, 6, 1664}, {S_TermW, 4, 6}, {S_TermW, 8, 33}, {S_MakeUpW, 5, 128}, {S_TermW, 8, 49}, {S_TermW, 6, 14}, {S_TermW, 8, 61}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 8, 47}, {S_TermW, 4, 3}, {S_TermW, 8, 59}, {S_TermW, 4, 5}, {S_TermW, 8, 41}, {S_TermW, 6, 16}, {S_MakeUpW, 9, 960}, {S_TermW, 4, 6}, {S_TermW, 8, 31}, {S_TermW, 5, 8}, {S_TermW, 8, 57}, {S_MakeUpW, 5, 64}, {S_TermW, 5, 10}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 7, 22}, {S_TermW, 4, 3}, {S_TermW, 5, 11}, {S_TermW, 4, 5}, {S_TermW, 7, 26}, {S_TermW, 5, 9}, {S_MakeUpW, 9, 704}, {S_TermW, 4, 6}, {S_TermW, 8, 37}, {S_MakeUpW, 5, 128}, {S_TermW, 7, 25}, {S_TermW, 6, 15}, {S_MakeUpW, 8, 320}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 6, 13}, {S_TermW, 4, 3}, {S_TermW, 7, 18}, {S_TermW, 4, 5}, {S_TermW, 7, 21}, {S_TermW, 6, 17}, {S_MakeUpW, 7, 256}, {S_TermW, 4, 6}, {S_TermW, 6, 1}, {S_TermW, 5, 8}, {S_MakeUpW, 6, 192}, {S_MakeUpW, 5, 64}, {S_TermW, 5, 10}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_MakeUp, 11, 1792}, {S_TermW, 4, 3}, {S_TermW, 5, 11}, {S_TermW, 4, 5}, {S_TermW, 6, 12}, {S_TermW, 5, 9}, {S_MakeUpW, 6, 1664}, {S_TermW, 4, 6}, {S_TermW, 7, 20}, {S_MakeUpW, 5, 128}, {S_TermW, 7, 24}, {S_TermW, 6, 14}, {S_TermW, 7, 28}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 7, 23}, {S_TermW, 4, 3}, {S_TermW, 7, 27}, {S_TermW, 4, 5}, {S_TermW, 8, 40}, {S_TermW, 6, 16}, {S_MakeUpW, 9, 832}, {S_TermW, 4, 6}, {S_TermW, 7, 19}, {S_TermW, 5, 8}, {S_TermW, 8, 56}, {S_MakeUpW, 5, 64}, {S_TermW, 5, 10}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 8, 46}, {S_TermW, 4, 3}, {S_TermW, 5, 11}, {S_TermW, 4, 5}, {S_TermW, 8, 54}, {S_TermW, 5, 9}, {S_MakeUpW, 8, 512}, {S_TermW, 4, 6}, {S_TermW, 8, 36}, {S_MakeUpW, 5, 128}, {S_TermW, 8, 52}, {S_TermW, 6, 15}, {S_TermW, 8, 0}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 6, 13}, {S_TermW, 4, 3}, {S_MakeUpW, 9, 1600}, {S_TermW, 4, 5}, {S_TermW, 8, 44}, {S_TermW, 6, 17}, {S_MakeUpW, 9, 1344}, {S_TermW, 4, 6}, {S_TermW, 6, 1}, {S_TermW, 5, 8}, {S_MakeUpW, 6, 192}, {S_MakeUpW, 5, 64}, {S_TermW, 5, 10}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 8, 30}, {S_TermW, 4, 3}, {S_TermW, 5, 11}, {S_TermW, 4, 5}, {S_TermW, 6, 12}, {S_TermW, 5, 9}, {S_MakeUpW, 6, 1664}, {S_TermW, 4, 6}, {S_TermW, 8, 34}, {S_MakeUpW, 5, 128}, {S_TermW, 8, 50}, {S_TermW, 6, 14}, {S_TermW, 8, 62}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 8, 48}, {S_TermW, 4, 3}, {S_TermW, 8, 60}, {S_TermW, 4, 5}, {S_TermW, 8, 42}, {S_TermW, 6, 16}, {S_MakeUpW, 9, 1088}, {S_TermW, 4, 6}, {S_TermW, 8, 32}, {S_TermW, 5, 8}, {S_TermW, 8, 58}, {S_MakeUpW, 5, 64}, {S_TermW, 5, 10}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 7, 22}, {S_TermW, 4, 3}, {S_TermW, 5, 11}, {S_TermW, 4, 5}, {S_TermW, 7, 26}, {S_TermW, 5, 9}, {S_MakeUpW, 8, 640}, {S_TermW, 4, 6}, {S_TermW, 8, 38}, {S_MakeUpW, 5, 128}, {S_TermW, 7, 25}, {S_TermW, 6, 15}, {S_MakeUpW, 8, 384}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 6, 13}, {S_TermW, 4, 3}, {S_TermW, 7, 18}, {S_TermW, 4, 5}, {S_TermW, 7, 21}, {S_TermW, 6, 17}, {S_MakeUpW, 7, 256}, {S_TermW, 4, 6}, {S_TermW, 6, 1}, {S_TermW, 5, 8}, {S_MakeUpW, 6, 192}, {S_MakeUpW, 5, 64}, {S_TermW, 5, 10}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_Null, 1, 0}, {S_TermW, 4, 3}, {S_TermW, 5, 11}, {S_TermW, 4, 5}, {S_TermW, 6, 12}, {S_TermW, 5, 9}, {S_MakeUpW, 6, 1664}, {S_TermW, 4, 6}, {S_TermW, 7, 20}, {S_MakeUpW, 5, 128}, {S_TermW, 7, 24}, {S_TermW, 6, 14}, {S_TermW, 7, 28}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 7, 23}, {S_TermW, 4, 3}, {S_TermW, 7, 27}, {S_TermW, 4, 5}, {S_TermW, 8, 39}, {S_TermW, 6, 16}, {S_MakeUpW, 8, 576}, {S_TermW, 4, 6}, {S_TermW, 7, 19}, {S_TermW, 5, 8}, {S_TermW, 8, 55}, {S_MakeUpW, 5, 64}, {S_TermW, 5, 10}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 8, 45}, {S_TermW, 4, 3}, {S_TermW, 5, 11}, {S_TermW, 4, 5}, {S_TermW, 8, 53}, {S_TermW, 5, 9}, {S_MakeUpW, 8, 448}, {S_TermW, 4, 6}, {S_TermW, 8, 35}, {S_MakeUpW, 5, 128}, {S_TermW, 8, 51}, {S_TermW, 6, 15}, {S_TermW, 8, 63}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 6, 13}, {S_TermW, 4, 3}, {S_MakeUpW, 9, 1536}, {S_TermW, 4, 5}, {S_TermW, 8, 43}, {S_TermW, 6, 17}, {S_MakeUpW, 9, 1280}, {S_TermW, 4, 6}, {S_TermW, 6, 1}, {S_TermW, 5, 8}, {S_MakeUpW, 6, 192}, {S_MakeUpW, 5, 64}, {S_TermW, 5, 10}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 8, 29}, {S_TermW, 4, 3}, {S_TermW, 5, 11}, {S_TermW, 4, 5}, {S_TermW, 6, 12}, {S_TermW, 5, 9}, {S_MakeUpW, 6, 1664}, {S_TermW, 4, 6}, {S_TermW, 8, 33}, {S_MakeUpW, 5, 128}, {S_TermW, 8, 49}, {S_TermW, 6, 14}, {S_TermW, 8, 61}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 8, 47}, {S_TermW, 4, 3}, {S_TermW, 8, 59}, {S_TermW, 4, 5}, {S_TermW, 8, 41}, {S_TermW, 6, 16}, {S_MakeUpW, 9, 1024}, {S_TermW, 4, 6}, {S_TermW, 8, 31}, {S_TermW, 5, 8}, {S_TermW, 8, 57}, {S_MakeUpW, 5, 64}, {S_TermW, 5, 10}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 7, 22}, {S_TermW, 4, 3}, {S_TermW, 5, 11}, {S_TermW, 4, 5}, {S_TermW, 7, 26}, {S_TermW, 5, 9}, {S_MakeUpW, 9, 768}, {S_TermW, 4, 6}, {S_TermW, 8, 37}, {S_MakeUpW, 5, 128}, {S_TermW, 7, 25}, {S_TermW, 6, 15}, {S_MakeUpW, 8, 320}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 6, 13}, {S_TermW, 4, 3}, {S_TermW, 7, 18}, {S_TermW, 4, 5}, {S_TermW, 7, 21}, {S_TermW, 6, 17}, {S_MakeUpW, 7, 256}, {S_TermW, 4, 6}, {S_TermW, 6, 1}, {S_TermW, 5, 8}, {S_MakeUpW, 6, 192}, {S_MakeUpW, 5, 64}, {S_TermW, 5, 10}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_MakeUp, 11, 1856}, {S_TermW, 4, 3}, {S_TermW, 5, 11}, {S_TermW, 4, 5}, {S_TermW, 6, 12}, {S_TermW, 5, 9}, {S_MakeUpW, 6, 1664}, {S_TermW, 4, 6}, {S_TermW, 7, 20}, {S_MakeUpW, 5, 128}, {S_TermW, 7, 24}, {S_TermW, 6, 14}, {S_TermW, 7, 28}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 7, 23}, {S_TermW, 4, 3}, {S_TermW, 7, 27}, {S_TermW, 4, 5}, {S_TermW, 8, 40}, {S_TermW, 6, 16}, {S_MakeUpW, 9, 896}, {S_TermW, 4, 6}, {S_TermW, 7, 19}, {S_TermW, 5, 8}, {S_TermW, 8, 56}, {S_MakeUpW, 5, 64}, {S_TermW, 5, 10}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 8, 46}, {S_TermW, 4, 3}, {S_TermW, 5, 11}, {S_TermW, 4, 5}, {S_TermW, 8, 54}, {S_TermW, 5, 9}, {S_MakeUpW, 8, 512}, {S_TermW, 4, 6}, {S_TermW, 8, 36}, {S_MakeUpW, 5, 128}, {S_TermW, 8, 52}, {S_TermW, 6, 15}, {S_TermW, 8, 0}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 6, 13}, {S_TermW, 4, 3}, {S_MakeUpW, 9, 1728}, {S_TermW, 4, 5}, {S_TermW, 8, 44}, {S_TermW, 6, 17}, {S_MakeUpW, 9, 1408}, {S_TermW, 4, 6}, {S_TermW, 6, 1}, {S_TermW, 5, 8}, {S_MakeUpW, 6, 192}, {S_MakeUpW, 5, 64}, {S_TermW, 5, 10}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 8, 30}, {S_TermW, 4, 3}, {S_TermW, 5, 11}, {S_TermW, 4, 5}, {S_TermW, 6, 12}, {S_TermW, 5, 9}, {S_MakeUpW, 6, 1664}, {S_TermW, 4, 6}, {S_TermW, 8, 34}, {S_MakeUpW, 5, 128}, {S_TermW, 8, 50}, {S_TermW, 6, 14}, {S_TermW, 8, 62}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 8, 48}, {S_TermW, 4, 3}, {S_TermW, 8, 60}, {S_TermW, 4, 5}, {S_TermW, 8, 42}, {S_TermW, 6, 16}, {S_MakeUpW, 9, 1152}, {S_TermW, 4, 6}, {S_TermW, 8, 32}, {S_TermW, 5, 8}, {S_TermW, 8, 58}, {S_MakeUpW, 5, 64}, {S_TermW, 5, 10}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 7, 22}, {S_TermW, 4, 3}, {S_TermW, 5, 11}, {S_TermW, 4, 5}, {S_TermW, 7, 26}, {S_TermW, 5, 9}, {S_MakeUpW, 8, 640}, {S_TermW, 4, 6}, {S_TermW, 8, 38}, {S_MakeUpW, 5, 128}, {S_TermW, 7, 25}, {S_TermW, 6, 15}, {S_MakeUpW, 8, 384}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 6, 13}, {S_TermW, 4, 3}, {S_TermW, 7, 18}, {S_TermW, 4, 5}, {S_TermW, 7, 21}, {S_TermW, 6, 17}, {S_MakeUpW, 7, 256}, {S_TermW, 4, 6}, {S_TermW, 6, 1}, {S_TermW, 5, 8}, {S_MakeUpW, 6, 192}, {S_MakeUpW, 5, 64}, {S_TermW, 5, 10}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_Null, 1, 0}, {S_TermW, 4, 3}, {S_TermW, 5, 11}, {S_TermW, 4, 5}, {S_TermW, 6, 12}, {S_TermW, 5, 9}, {S_MakeUpW, 6, 1664}, {S_TermW, 4, 6}, {S_TermW, 7, 20}, {S_MakeUpW, 5, 128}, {S_TermW, 7, 24}, {S_TermW, 6, 14}, {S_TermW, 7, 28}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 7, 23}, {S_TermW, 4, 3}, {S_TermW, 7, 27}, {S_TermW, 4, 5}, {S_TermW, 8, 39}, {S_TermW, 6, 16}, {S_MakeUpW, 8, 576}, {S_TermW, 4, 6}, {S_TermW, 7, 19}, {S_TermW, 5, 8}, {S_TermW, 8, 55}, {S_MakeUpW, 5, 64}, {S_TermW, 5, 10}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 8, 45}, {S_TermW, 4, 3}, {S_TermW, 5, 11}, {S_TermW, 4, 5}, {S_TermW, 8, 53}, {S_TermW, 5, 9}, {S_MakeUpW, 8, 448}, {S_TermW, 4, 6}, {S_TermW, 8, 35}, {S_MakeUpW, 5, 128}, {S_TermW, 8, 51}, {S_TermW, 6, 15}, {S_TermW, 8, 63}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 6, 13}, {S_TermW, 4, 3}, {S_MakeUpW, 9, 1472}, {S_TermW, 4, 5}, {S_TermW, 8, 43}, {S_TermW, 6, 17}, {S_MakeUpW, 9, 1216}, {S_TermW, 4, 6}, {S_TermW, 6, 1}, {S_TermW, 5, 8}, {S_MakeUpW, 6, 192}, {S_MakeUpW, 5, 64}, {S_TermW, 5, 10}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 8, 29}, {S_TermW, 4, 3}, {S_TermW, 5, 11}, {S_TermW, 4, 5}, {S_TermW, 6, 12}, {S_TermW, 5, 9}, {S_MakeUpW, 6, 1664}, {S_TermW, 4, 6}, {S_TermW, 8, 33}, {S_MakeUpW, 5, 128}, {S_TermW, 8, 49}, {S_TermW, 6, 14}, {S_TermW, 8, 61}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 8, 47}, {S_TermW, 4, 3}, {S_TermW, 8, 59}, {S_TermW, 4, 5}, {S_TermW, 8, 41}, {S_TermW, 6, 16}, {S_MakeUpW, 9, 960}, {S_TermW, 4, 6}, {S_TermW, 8, 31}, {S_TermW, 5, 8}, {S_TermW, 8, 57}, {S_MakeUpW, 5, 64}, {S_TermW, 5, 10}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 7, 22}, {S_TermW, 4, 3}, {S_TermW, 5, 11}, {S_TermW, 4, 5}, {S_TermW, 7, 26}, {S_TermW, 5, 9}, {S_MakeUpW, 9, 704}, {S_TermW, 4, 6}, {S_TermW, 8, 37}, {S_MakeUpW, 5, 128}, {S_TermW, 7, 25}, {S_TermW, 6, 15}, {S_MakeUpW, 8, 320}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 6, 13}, {S_TermW, 4, 3}, {S_TermW, 7, 18}, {S_TermW, 4, 5}, {S_TermW, 7, 21}, {S_TermW, 6, 17}, {S_MakeUpW, 7, 256}, {S_TermW, 4, 6}, {S_TermW, 6, 1}, {S_TermW, 5, 8}, {S_MakeUpW, 6, 192}, {S_MakeUpW, 5, 64}, {S_TermW, 5, 10}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_MakeUp, 12, 2176}, {S_TermW, 4, 3}, {S_TermW, 5, 11}, {S_TermW, 4, 5}, {S_TermW, 6, 12}, {S_TermW, 5, 9}, {S_MakeUpW, 6, 1664}, {S_TermW, 4, 6}, {S_TermW, 7, 20}, {S_MakeUpW, 5, 128}, {S_TermW, 7, 24}, {S_TermW, 6, 14}, {S_TermW, 7, 28}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 7, 23}, {S_TermW, 4, 3}, {S_TermW, 7, 27}, {S_TermW, 4, 5}, {S_TermW, 8, 40}, {S_TermW, 6, 16}, {S_MakeUpW, 9, 832}, {S_TermW, 4, 6}, {S_TermW, 7, 19}, {S_TermW, 5, 8}, {S_TermW, 8, 56}, {S_MakeUpW, 5, 64}, {S_TermW, 5, 10}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 8, 46}, {S_TermW, 4, 3}, {S_TermW, 5, 11}, {S_TermW, 4, 5}, {S_TermW, 8, 54}, {S_TermW, 5, 9}, {S_MakeUpW, 8, 512}, {S_TermW, 4, 6}, {S_TermW, 8, 36}, {S_MakeUpW, 5, 128}, {S_TermW, 8, 52}, {S_TermW, 6, 15}, {S_TermW, 8, 0}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 6, 13}, {S_TermW, 4, 3}, {S_MakeUpW, 9, 1600}, {S_TermW, 4, 5}, {S_TermW, 8, 44}, {S_TermW, 6, 17}, {S_MakeUpW, 9, 1344}, {S_TermW, 4, 6}, {S_TermW, 6, 1}, {S_TermW, 5, 8}, {S_MakeUpW, 6, 192}, {S_MakeUpW, 5, 64}, {S_TermW, 5, 10}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 8, 30}, {S_TermW, 4, 3}, {S_TermW, 5, 11}, {S_TermW, 4, 5}, {S_TermW, 6, 12}, {S_TermW, 5, 9}, {S_MakeUpW, 6, 1664}, {S_TermW, 4, 6}, {S_TermW, 8, 34}, {S_MakeUpW, 5, 128}, {S_TermW, 8, 50}, {S_TermW, 6, 14}, {S_TermW, 8, 62}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 8, 48}, {S_TermW, 4, 3}, {S_TermW, 8, 60}, {S_TermW, 4, 5}, {S_TermW, 8, 42}, {S_TermW, 6, 16}, {S_MakeUpW, 9, 1088}, {S_TermW, 4, 6}, {S_TermW, 8, 32}, {S_TermW, 5, 8}, {S_TermW, 8, 58}, {S_MakeUpW, 5, 64}, {S_TermW, 5, 10}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 7, 22}, {S_TermW, 4, 3}, {S_TermW, 5, 11}, {S_TermW, 4, 5}, {S_TermW, 7, 26}, {S_TermW, 5, 9}, {S_MakeUpW, 8, 640}, {S_TermW, 4, 6}, {S_TermW, 8, 38}, {S_MakeUpW, 5, 128}, {S_TermW, 7, 25}, {S_TermW, 6, 15}, {S_MakeUpW, 8, 384}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 6, 13}, {S_TermW, 4, 3}, {S_TermW, 7, 18}, {S_TermW, 4, 5}, {S_TermW, 7, 21}, {S_TermW, 6, 17}, {S_MakeUpW, 7, 256}, {S_TermW, 4, 6}, {S_TermW, 6, 1}, {S_TermW, 5, 8}, {S_MakeUpW, 6, 192}, {S_MakeUpW, 5, 64}, {S_TermW, 5, 10}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_Null, 1, 0}, {S_TermW, 4, 3}, {S_TermW, 5, 11}, {S_TermW, 4, 5}, {S_TermW, 6, 12}, {S_TermW, 5, 9}, {S_MakeUpW, 6, 1664}, {S_TermW, 4, 6}, {S_TermW, 7, 20}, {S_MakeUpW, 5, 128}, {S_TermW, 7, 24}, {S_TermW, 6, 14}, {S_TermW, 7, 28}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 7, 23}, {S_TermW, 4, 3}, {S_TermW, 7, 27}, {S_TermW, 4, 5}, {S_TermW, 8, 39}, {S_TermW, 6, 16}, {S_MakeUpW, 8, 576}, {S_TermW, 4, 6}, {S_TermW, 7, 19}, {S_TermW, 5, 8}, {S_TermW, 8, 55}, {S_MakeUpW, 5, 64}, {S_TermW, 5, 10}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 8, 45}, {S_TermW, 4, 3}, {S_TermW, 5, 11}, {S_TermW, 4, 5}, {S_TermW, 8, 53}, {S_TermW, 5, 9}, {S_MakeUpW, 8, 448}, {S_TermW, 4, 6}, {S_TermW, 8, 35}, {S_MakeUpW, 5, 128}, {S_TermW, 8, 51}, {S_TermW, 6, 15}, {S_TermW, 8, 63}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 6, 13}, {S_TermW, 4, 3}, {S_MakeUpW, 9, 1536}, {S_TermW, 4, 5}, {S_TermW, 8, 43}, {S_TermW, 6, 17}, {S_MakeUpW, 9, 1280}, {S_TermW, 4, 6}, {S_TermW, 6, 1}, {S_TermW, 5, 8}, {S_MakeUpW, 6, 192}, {S_MakeUpW, 5, 64}, {S_TermW, 5, 10}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 8, 29}, {S_TermW, 4, 3}, {S_TermW, 5, 11}, {S_TermW, 4, 5}, {S_TermW, 6, 12}, {S_TermW, 5, 9}, {S_MakeUpW, 6, 1664}, {S_TermW, 4, 6}, {S_TermW, 8, 33}, {S_MakeUpW, 5, 128}, {S_TermW, 8, 49}, {S_TermW, 6, 14}, {S_TermW, 8, 61}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 8, 47}, {S_TermW, 4, 3}, {S_TermW, 8, 59}, {S_TermW, 4, 5}, {S_TermW, 8, 41}, {S_TermW, 6, 16}, {S_MakeUpW, 9, 1024}, {S_TermW, 4, 6}, {S_TermW, 8, 31}, {S_TermW, 5, 8}, {S_TermW, 8, 57}, {S_MakeUpW, 5, 64}, {S_TermW, 5, 10}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 7, 22}, {S_TermW, 4, 3}, {S_TermW, 5, 11}, {S_TermW, 4, 5}, {S_TermW, 7, 26}, {S_TermW, 5, 9}, {S_MakeUpW, 9, 768}, {S_TermW, 4, 6}, {S_TermW, 8, 37}, {S_MakeUpW, 5, 128}, {S_TermW, 7, 25}, {S_TermW, 6, 15}, {S_MakeUpW, 8, 320}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 6, 13}, {S_TermW, 4, 3}, {S_TermW, 7, 18}, {S_TermW, 4, 5}, {S_TermW, 7, 21}, {S_TermW, 6, 17}, {S_MakeUpW, 7, 256}, {S_TermW, 4, 6}, {S_TermW, 6, 1}, {S_TermW, 5, 8}, {S_MakeUpW, 6, 192}, {S_MakeUpW, 5, 64}, {S_TermW, 5, 10}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_MakeUp, 12, 2432}, {S_TermW, 4, 3}, {S_TermW, 5, 11}, {S_TermW, 4, 5}, {S_TermW, 6, 12}, {S_TermW, 5, 9}, {S_MakeUpW, 6, 1664}, {S_TermW, 4, 6}, {S_TermW, 7, 20}, {S_MakeUpW, 5, 128}, {S_TermW, 7, 24}, {S_TermW, 6, 14}, {S_TermW, 7, 28}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 7, 23}, {S_TermW, 4, 3}, {S_TermW, 7, 27}, {S_TermW, 4, 5}, {S_TermW, 8, 40}, {S_TermW, 6, 16}, {S_MakeUpW, 9, 896}, {S_TermW, 4, 6}, {S_TermW, 7, 19}, {S_TermW, 5, 8}, {S_TermW, 8, 56}, {S_MakeUpW, 5, 64}, {S_TermW, 5, 10}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 8, 46}, {S_TermW, 4, 3}, {S_TermW, 5, 11}, {S_TermW, 4, 5}, {S_TermW, 8, 54}, {S_TermW, 5, 9}, {S_MakeUpW, 8, 512}, {S_TermW, 4, 6}, {S_TermW, 8, 36}, {S_MakeUpW, 5, 128}, {S_TermW, 8, 52}, {S_TermW, 6, 15}, {S_TermW, 8, 0}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 6, 13}, {S_TermW, 4, 3}, {S_MakeUpW, 9, 1728}, {S_TermW, 4, 5}, {S_TermW, 8, 44}, {S_TermW, 6, 17}, {S_MakeUpW, 9, 1408}, {S_TermW, 4, 6}, {S_TermW, 6, 1}, {S_TermW, 5, 8}, {S_MakeUpW, 6, 192}, {S_MakeUpW, 5, 64}, {S_TermW, 5, 10}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 8, 30}, {S_TermW, 4, 3}, {S_TermW, 5, 11}, {S_TermW, 4, 5}, {S_TermW, 6, 12}, {S_TermW, 5, 9}, {S_MakeUpW, 6, 1664}, {S_TermW, 4, 6}, {S_TermW, 8, 34}, {S_MakeUpW, 5, 128}, {S_TermW, 8, 50}, {S_TermW, 6, 14}, {S_TermW, 8, 62}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 8, 48}, {S_TermW, 4, 3}, {S_TermW, 8, 60}, {S_TermW, 4, 5}, {S_TermW, 8, 42}, {S_TermW, 6, 16}, {S_MakeUpW, 9, 1152}, {S_TermW, 4, 6}, {S_TermW, 8, 32}, {S_TermW, 5, 8}, {S_TermW, 8, 58}, {S_MakeUpW, 5, 64}, {S_TermW, 5, 10}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 7, 22}, {S_TermW, 4, 3}, {S_TermW, 5, 11}, {S_TermW, 4, 5}, {S_TermW, 7, 26}, {S_TermW, 5, 9}, {S_MakeUpW, 8, 640}, {S_TermW, 4, 6}, {S_TermW, 8, 38}, {S_MakeUpW, 5, 128}, {S_TermW, 7, 25}, {S_TermW, 6, 15}, {S_MakeUpW, 8, 384}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 6, 13}, {S_TermW, 4, 3}, {S_TermW, 7, 18}, {S_TermW, 4, 5}, {S_TermW, 7, 21}, {S_TermW, 6, 17}, {S_MakeUpW, 7, 256}, {S_TermW, 4, 6}, {S_TermW, 6, 1}, {S_TermW, 5, 8}, {S_MakeUpW, 6, 192}, {S_MakeUpW, 5, 64}, {S_TermW, 5, 10}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_Null, 1, 0}, {S_TermW, 4, 3}, {S_TermW, 5, 11}, {S_TermW, 4, 5}, {S_TermW, 6, 12}, {S_TermW, 5, 9}, {S_MakeUpW, 6, 1664}, {S_TermW, 4, 6}, {S_TermW, 7, 20}, {S_MakeUpW, 5, 128}, {S_TermW, 7, 24}, {S_TermW, 6, 14}, {S_TermW, 7, 28}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 7, 23}, {S_TermW, 4, 3}, {S_TermW, 7, 27}, {S_TermW, 4, 5}, {S_TermW, 8, 39}, {S_TermW, 6, 16}, {S_MakeUpW, 8, 576}, {S_TermW, 4, 6}, {S_TermW, 7, 19}, {S_TermW, 5, 8}, {S_TermW, 8, 55}, {S_MakeUpW, 5, 64}, {S_TermW, 5, 10}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 8, 45}, {S_TermW, 4, 3}, {S_TermW, 5, 11}, {S_TermW, 4, 5}, {S_TermW, 8, 53}, {S_TermW, 5, 9}, {S_MakeUpW, 8, 448}, {S_TermW, 4, 6}, {S_TermW, 8, 35}, {S_MakeUpW, 5, 128}, {S_TermW, 8, 51}, {S_TermW, 6, 15}, {S_TermW, 8, 63}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 6, 13}, {S_TermW, 4, 3}, {S_MakeUpW, 9, 1472}, {S_TermW, 4, 5}, {S_TermW, 8, 43}, {S_TermW, 6, 17}, {S_MakeUpW, 9, 1216}, {S_TermW, 4, 6}, {S_TermW, 6, 1}, {S_TermW, 5, 8}, {S_MakeUpW, 6, 192}, {S_MakeUpW, 5, 64}, {S_TermW, 5, 10}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 8, 29}, {S_TermW, 4, 3}, {S_TermW, 5, 11}, {S_TermW, 4, 5}, {S_TermW, 6, 12}, {S_TermW, 5, 9}, {S_MakeUpW, 6, 1664}, {S_TermW, 4, 6}, {S_TermW, 8, 33}, {S_MakeUpW, 5, 128}, {S_TermW, 8, 49}, {S_TermW, 6, 14}, {S_TermW, 8, 61}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 8, 47}, {S_TermW, 4, 3}, {S_TermW, 8, 59}, {S_TermW, 4, 5}, {S_TermW, 8, 41}, {S_TermW, 6, 16}, {S_MakeUpW, 9, 960}, {S_TermW, 4, 6}, {S_TermW, 8, 31}, {S_TermW, 5, 8}, {S_TermW, 8, 57}, {S_MakeUpW, 5, 64}, {S_TermW, 5, 10}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 7, 22}, {S_TermW, 4, 3}, {S_TermW, 5, 11}, {S_TermW, 4, 5}, {S_TermW, 7, 26}, {S_TermW, 5, 9}, {S_MakeUpW, 9, 704}, {S_TermW, 4, 6}, {S_TermW, 8, 37}, {S_MakeUpW, 5, 128}, {S_TermW, 7, 25}, {S_TermW, 6, 15}, {S_MakeUpW, 8, 320}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 6, 13}, {S_TermW, 4, 3}, {S_TermW, 7, 18}, {S_TermW, 4, 5}, {S_TermW, 7, 21}, {S_TermW, 6, 17}, {S_MakeUpW, 7, 256}, {S_TermW, 4, 6}, {S_TermW, 6, 1}, {S_TermW, 5, 8}, {S_MakeUpW, 6, 192}, {S_MakeUpW, 5, 64}, {S_TermW, 5, 10}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_MakeUp, 12, 2048}, {S_TermW, 4, 3}, {S_TermW, 5, 11}, {S_TermW, 4, 5}, {S_TermW, 6, 12}, {S_TermW, 5, 9}, {S_MakeUpW, 6, 1664}, {S_TermW, 4, 6}, {S_TermW, 7, 20}, {S_MakeUpW, 5, 128}, {S_TermW, 7, 24}, {S_TermW, 6, 14}, {S_TermW, 7, 28}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 7, 23}, {S_TermW, 4, 3}, {S_TermW, 7, 27}, {S_TermW, 4, 5}, {S_TermW, 8, 40}, {S_TermW, 6, 16}, {S_MakeUpW, 9, 832}, {S_TermW, 4, 6}, {S_TermW, 7, 19}, {S_TermW, 5, 8}, {S_TermW, 8, 56}, {S_MakeUpW, 5, 64}, {S_TermW, 5, 10}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 8, 46}, {S_TermW, 4, 3}, {S_TermW, 5, 11}, {S_TermW, 4, 5}, {S_TermW, 8, 54}, {S_TermW, 5, 9}, {S_MakeUpW, 8, 512}, {S_TermW, 4, 6}, {S_TermW, 8, 36}, {S_MakeUpW, 5, 128}, {S_TermW, 8, 52}, {S_TermW, 6, 15}, {S_TermW, 8, 0}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 6, 13}, {S_TermW, 4, 3}, {S_MakeUpW, 9, 1600}, {S_TermW, 4, 5}, {S_TermW, 8, 44}, {S_TermW, 6, 17}, {S_MakeUpW, 9, 1344}, {S_TermW, 4, 6}, {S_TermW, 6, 1}, {S_TermW, 5, 8}, {S_MakeUpW, 6, 192}, {S_MakeUpW, 5, 64}, {S_TermW, 5, 10}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 8, 30}, {S_TermW, 4, 3}, {S_TermW, 5, 11}, {S_TermW, 4, 5}, {S_TermW, 6, 12}, {S_TermW, 5, 9}, {S_MakeUpW, 6, 1664}, {S_TermW, 4, 6}, {S_TermW, 8, 34}, {S_MakeUpW, 5, 128}, {S_TermW, 8, 50}, {S_TermW, 6, 14}, {S_TermW, 8, 62}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 8, 48}, {S_TermW, 4, 3}, {S_TermW, 8, 60}, {S_TermW, 4, 5}, {S_TermW, 8, 42}, {S_TermW, 6, 16}, {S_MakeUpW, 9, 1088}, {S_TermW, 4, 6}, {S_TermW, 8, 32}, {S_TermW, 5, 8}, {S_TermW, 8, 58}, {S_MakeUpW, 5, 64}, {S_TermW, 5, 10}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 7, 22}, {S_TermW, 4, 3}, {S_TermW, 5, 11}, {S_TermW, 4, 5}, {S_TermW, 7, 26}, {S_TermW, 5, 9}, {S_MakeUpW, 8, 640}, {S_TermW, 4, 6}, {S_TermW, 8, 38}, {S_MakeUpW, 5, 128}, {S_TermW, 7, 25}, {S_TermW, 6, 15}, {S_MakeUpW, 8, 384}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 6, 13}, {S_TermW, 4, 3}, {S_TermW, 7, 18}, {S_TermW, 4, 5}, {S_TermW, 7, 21}, {S_TermW, 6, 17}, {S_MakeUpW, 7, 256}, {S_TermW, 4, 6}, {S_TermW, 6, 1}, {S_TermW, 5, 8}, {S_MakeUpW, 6, 192}, {S_MakeUpW, 5, 64}, {S_TermW, 5, 10}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_Null, 1, 0}, {S_TermW, 4, 3}, {S_TermW, 5, 11}, {S_TermW, 4, 5}, {S_TermW, 6, 12}, {S_TermW, 5, 9}, {S_MakeUpW, 6, 1664}, {S_TermW, 4, 6}, {S_TermW, 7, 20}, {S_MakeUpW, 5, 128}, {S_TermW, 7, 24}, {S_TermW, 6, 14}, {S_TermW, 7, 28}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 7, 23}, {S_TermW, 4, 3}, {S_TermW, 7, 27}, {S_TermW, 4, 5}, {S_TermW, 8, 39}, {S_TermW, 6, 16}, {S_MakeUpW, 8, 576}, {S_TermW, 4, 6}, {S_TermW, 7, 19}, {S_TermW, 5, 8}, {S_TermW, 8, 55}, {S_MakeUpW, 5, 64}, {S_TermW, 5, 10}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 8, 45}, {S_TermW, 4, 3}, {S_TermW, 5, 11}, {S_TermW, 4, 5}, {S_TermW, 8, 53}, {S_TermW, 5, 9}, {S_MakeUpW, 8, 448}, {S_TermW, 4, 6}, {S_TermW, 8, 35}, {S_MakeUpW, 5, 128}, {S_TermW, 8, 51}, {S_TermW, 6, 15}, {S_TermW, 8, 63}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 6, 13}, {S_TermW, 4, 3}, {S_MakeUpW, 9, 1536}, {S_TermW, 4, 5}, {S_TermW, 8, 43}, {S_TermW, 6, 17}, {S_MakeUpW, 9, 1280}, {S_TermW, 4, 6}, {S_TermW, 6, 1}, {S_TermW, 5, 8}, {S_MakeUpW, 6, 192}, {S_MakeUpW, 5, 64}, {S_TermW, 5, 10}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 8, 29}, {S_TermW, 4, 3}, {S_TermW, 5, 11}, {S_TermW, 4, 5}, {S_TermW, 6, 12}, {S_TermW, 5, 9}, {S_MakeUpW, 6, 1664}, {S_TermW, 4, 6}, {S_TermW, 8, 33}, {S_MakeUpW, 5, 128}, {S_TermW, 8, 49}, {S_TermW, 6, 14}, {S_TermW, 8, 61}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 8, 47}, {S_TermW, 4, 3}, {S_TermW, 8, 59}, {S_TermW, 4, 5}, {S_TermW, 8, 41}, {S_TermW, 6, 16}, {S_MakeUpW, 9, 1024}, {S_TermW, 4, 6}, {S_TermW, 8, 31}, {S_TermW, 5, 8}, {S_TermW, 8, 57}, {S_MakeUpW, 5, 64}, {S_TermW, 5, 10}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 7, 22}, {S_TermW, 4, 3}, {S_TermW, 5, 11}, {S_TermW, 4, 5}, {S_TermW, 7, 26}, {S_TermW, 5, 9}, {S_MakeUpW, 9, 768}, {S_TermW, 4, 6}, {S_TermW, 8, 37}, {S_MakeUpW, 5, 128}, {S_TermW, 7, 25}, {S_TermW, 6, 15}, {S_MakeUpW, 8, 320}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 6, 13}, {S_TermW, 4, 3}, {S_TermW, 7, 18}, {S_TermW, 4, 5}, {S_TermW, 7, 21}, {S_TermW, 6, 17}, {S_MakeUpW, 7, 256}, {S_TermW, 4, 6}, {S_TermW, 6, 1}, {S_TermW, 5, 8}, {S_MakeUpW, 6, 192}, {S_MakeUpW, 5, 64}, {S_TermW, 5, 10}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_MakeUp, 11, 1920}, {S_TermW, 4, 3}, {S_TermW, 5, 11}, {S_TermW, 4, 5}, {S_TermW, 6, 12}, {S_TermW, 5, 9}, {S_MakeUpW, 6, 1664}, {S_TermW, 4, 6}, {S_TermW, 7, 20}, {S_MakeUpW, 5, 128}, {S_TermW, 7, 24}, {S_TermW, 6, 14}, {S_TermW, 7, 28}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 7, 23}, {S_TermW, 4, 3}, {S_TermW, 7, 27}, {S_TermW, 4, 5}, {S_TermW, 8, 40}, {S_TermW, 6, 16}, {S_MakeUpW, 9, 896}, {S_TermW, 4, 6}, {S_TermW, 7, 19}, {S_TermW, 5, 8}, {S_TermW, 8, 56}, {S_MakeUpW, 5, 64}, {S_TermW, 5, 10}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 8, 46}, {S_TermW, 4, 3}, {S_TermW, 5, 11}, {S_TermW, 4, 5}, {S_TermW, 8, 54}, {S_TermW, 5, 9}, {S_MakeUpW, 8, 512}, {S_TermW, 4, 6}, {S_TermW, 8, 36}, {S_MakeUpW, 5, 128}, {S_TermW, 8, 52}, {S_TermW, 6, 15}, {S_TermW, 8, 0}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 6, 13}, {S_TermW, 4, 3}, {S_MakeUpW, 9, 1728}, {S_TermW, 4, 5}, {S_TermW, 8, 44}, {S_TermW, 6, 17}, {S_MakeUpW, 9, 1408}, {S_TermW, 4, 6}, {S_TermW, 6, 1}, {S_TermW, 5, 8}, {S_MakeUpW, 6, 192}, {S_MakeUpW, 5, 64}, {S_TermW, 5, 10}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 8, 30}, {S_TermW, 4, 3}, {S_TermW, 5, 11}, {S_TermW, 4, 5}, {S_TermW, 6, 12}, {S_TermW, 5, 9}, {S_MakeUpW, 6, 1664}, {S_TermW, 4, 6}, {S_TermW, 8, 34}, {S_MakeUpW, 5, 128}, {S_TermW, 8, 50}, {S_TermW, 6, 14}, {S_TermW, 8, 62}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 8, 48}, {S_TermW, 4, 3}, {S_TermW, 8, 60}, {S_TermW, 4, 5}, {S_TermW, 8, 42}, {S_TermW, 6, 16}, {S_MakeUpW, 9, 1152}, {S_TermW, 4, 6}, {S_TermW, 8, 32}, {S_TermW, 5, 8}, {S_TermW, 8, 58}, {S_MakeUpW, 5, 64}, {S_TermW, 5, 10}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 7, 22}, {S_TermW, 4, 3}, {S_TermW, 5, 11}, {S_TermW, 4, 5}, {S_TermW, 7, 26}, {S_TermW, 5, 9}, {S_MakeUpW, 8, 640}, {S_TermW, 4, 6}, {S_TermW, 8, 38}, {S_MakeUpW, 5, 128}, {S_TermW, 7, 25}, {S_TermW, 6, 15}, {S_MakeUpW, 8, 384}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 6, 13}, {S_TermW, 4, 3}, {S_TermW, 7, 18}, {S_TermW, 4, 5}, {S_TermW, 7, 21}, {S_TermW, 6, 17}, {S_MakeUpW, 7, 256}, {S_TermW, 4, 6}, {S_TermW, 6, 1}, {S_TermW, 5, 8}, {S_MakeUpW, 6, 192}, {S_MakeUpW, 5, 64}, {S_TermW, 5, 10}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_Null, 1, 0}, {S_TermW, 4, 3}, {S_TermW, 5, 11}, {S_TermW, 4, 5}, {S_TermW, 6, 12}, {S_TermW, 5, 9}, {S_MakeUpW, 6, 1664}, {S_TermW, 4, 6}, {S_TermW, 7, 20}, {S_MakeUpW, 5, 128}, {S_TermW, 7, 24}, {S_TermW, 6, 14}, {S_TermW, 7, 28}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 7, 23}, {S_TermW, 4, 3}, {S_TermW, 7, 27}, {S_TermW, 4, 5}, {S_TermW, 8, 39}, {S_TermW, 6, 16}, {S_MakeUpW, 8, 576}, {S_TermW, 4, 6}, {S_TermW, 7, 19}, {S_TermW, 5, 8}, {S_TermW, 8, 55}, {S_MakeUpW, 5, 64}, {S_TermW, 5, 10}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 8, 45}, {S_TermW, 4, 3}, {S_TermW, 5, 11}, {S_TermW, 4, 5}, {S_TermW, 8, 53}, {S_TermW, 5, 9}, {S_MakeUpW, 8, 448}, {S_TermW, 4, 6}, {S_TermW, 8, 35}, {S_MakeUpW, 5, 128}, {S_TermW, 8, 51}, {S_TermW, 6, 15}, {S_TermW, 8, 63}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 6, 13}, {S_TermW, 4, 3}, {S_MakeUpW, 9, 1472}, {S_TermW, 4, 5}, {S_TermW, 8, 43}, {S_TermW, 6, 17}, {S_MakeUpW, 9, 1216}, {S_TermW, 4, 6}, {S_TermW, 6, 1}, {S_TermW, 5, 8}, {S_MakeUpW, 6, 192}, {S_MakeUpW, 5, 64}, {S_TermW, 5, 10}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 8, 29}, {S_TermW, 4, 3}, {S_TermW, 5, 11}, {S_TermW, 4, 5}, {S_TermW, 6, 12}, {S_TermW, 5, 9}, {S_MakeUpW, 6, 1664}, {S_TermW, 4, 6}, {S_TermW, 8, 33}, {S_MakeUpW, 5, 128}, {S_TermW, 8, 49}, {S_TermW, 6, 14}, {S_TermW, 8, 61}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 8, 47}, {S_TermW, 4, 3}, {S_TermW, 8, 59}, {S_TermW, 4, 5}, {S_TermW, 8, 41}, {S_TermW, 6, 16}, {S_MakeUpW, 9, 960}, {S_TermW, 4, 6}, {S_TermW, 8, 31}, {S_TermW, 5, 8}, {S_TermW, 8, 57}, {S_MakeUpW, 5, 64}, {S_TermW, 5, 10}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 7, 22}, {S_TermW, 4, 3}, {S_TermW, 5, 11}, {S_TermW, 4, 5}, {S_TermW, 7, 26}, {S_TermW, 5, 9}, {S_MakeUpW, 9, 704}, {S_TermW, 4, 6}, {S_TermW, 8, 37}, {S_MakeUpW, 5, 128}, {S_TermW, 7, 25}, {S_TermW, 6, 15}, {S_MakeUpW, 8, 320}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 6, 13}, {S_TermW, 4, 3}, {S_TermW, 7, 18}, {S_TermW, 4, 5}, {S_TermW, 7, 21}, {S_TermW, 6, 17}, {S_MakeUpW, 7, 256}, {S_TermW, 4, 6}, {S_TermW, 6, 1}, {S_TermW, 5, 8}, {S_MakeUpW, 6, 192}, {S_MakeUpW, 5, 64}, {S_TermW, 5, 10}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_MakeUp, 12, 2304}, {S_TermW, 4, 3}, {S_TermW, 5, 11}, {S_TermW, 4, 5}, {S_TermW, 6, 12}, {S_TermW, 5, 9}, {S_MakeUpW, 6, 1664}, {S_TermW, 4, 6}, {S_TermW, 7, 20}, {S_MakeUpW, 5, 128}, {S_TermW, 7, 24}, {S_TermW, 6, 14}, {S_TermW, 7, 28}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 7, 23}, {S_TermW, 4, 3}, {S_TermW, 7, 27}, {S_TermW, 4, 5}, {S_TermW, 8, 40}, {S_TermW, 6, 16}, {S_MakeUpW, 9, 832}, {S_TermW, 4, 6}, {S_TermW, 7, 19}, {S_TermW, 5, 8}, {S_TermW, 8, 56}, {S_MakeUpW, 5, 64}, {S_TermW, 5, 10}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 8, 46}, {S_TermW, 4, 3}, {S_TermW, 5, 11}, {S_TermW, 4, 5}, {S_TermW, 8, 54}, {S_TermW, 5, 9}, {S_MakeUpW, 8, 512}, {S_TermW, 4, 6}, {S_TermW, 8, 36}, {S_MakeUpW, 5, 128}, {S_TermW, 8, 52}, {S_TermW, 6, 15}, {S_TermW, 8, 0}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 6, 13}, {S_TermW, 4, 3}, {S_MakeUpW, 9, 1600}, {S_TermW, 4, 5}, {S_TermW, 8, 44}, {S_TermW, 6, 17}, {S_MakeUpW, 9, 1344}, {S_TermW, 4, 6}, {S_TermW, 6, 1}, {S_TermW, 5, 8}, {S_MakeUpW, 6, 192}, {S_MakeUpW, 5, 64}, {S_TermW, 5, 10}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 8, 30}, {S_TermW, 4, 3}, {S_TermW, 5, 11}, {S_TermW, 4, 5}, {S_TermW, 6, 12}, {S_TermW, 5, 9}, {S_MakeUpW, 6, 1664}, {S_TermW, 4, 6}, {S_TermW, 8, 34}, {S_MakeUpW, 5, 128}, {S_TermW, 8, 50}, {S_TermW, 6, 14}, {S_TermW, 8, 62}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 8, 48}, {S_TermW, 4, 3}, {S_TermW, 8, 60}, {S_TermW, 4, 5}, {S_TermW, 8, 42}, {S_TermW, 6, 16}, {S_MakeUpW, 9, 1088}, {S_TermW, 4, 6}, {S_TermW, 8, 32}, {S_TermW, 5, 8}, {S_TermW, 8, 58}, {S_MakeUpW, 5, 64}, {S_TermW, 5, 10}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 7, 22}, {S_TermW, 4, 3}, {S_TermW, 5, 11}, {S_TermW, 4, 5}, {S_TermW, 7, 26}, {S_TermW, 5, 9}, {S_MakeUpW, 8, 640}, {S_TermW, 4, 6}, {S_TermW, 8, 38}, {S_MakeUpW, 5, 128}, {S_TermW, 7, 25}, {S_TermW, 6, 15}, {S_MakeUpW, 8, 384}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 6, 13}, {S_TermW, 4, 3}, {S_TermW, 7, 18}, {S_TermW, 4, 5}, {S_TermW, 7, 21}, {S_TermW, 6, 17}, {S_MakeUpW, 7, 256}, {S_TermW, 4, 6}, {S_TermW, 6, 1}, {S_TermW, 5, 8}, {S_MakeUpW, 6, 192}, {S_MakeUpW, 5, 64}, {S_TermW, 5, 10}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_Null, 1, 0}, {S_TermW, 4, 3}, {S_TermW, 5, 11}, {S_TermW, 4, 5}, {S_TermW, 6, 12}, {S_TermW, 5, 9}, {S_MakeUpW, 6, 1664}, {S_TermW, 4, 6}, {S_TermW, 7, 20}, {S_MakeUpW, 5, 128}, {S_TermW, 7, 24}, {S_TermW, 6, 14}, {S_TermW, 7, 28}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 7, 23}, {S_TermW, 4, 3}, {S_TermW, 7, 27}, {S_TermW, 4, 5}, {S_TermW, 8, 39}, {S_TermW, 6, 16}, {S_MakeUpW, 8, 576}, {S_TermW, 4, 6}, {S_TermW, 7, 19}, {S_TermW, 5, 8}, {S_TermW, 8, 55}, {S_MakeUpW, 5, 64}, {S_TermW, 5, 10}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 8, 45}, {S_TermW, 4, 3}, {S_TermW, 5, 11}, {S_TermW, 4, 5}, {S_TermW, 8, 53}, {S_TermW, 5, 9}, {S_MakeUpW, 8, 448}, {S_TermW, 4, 6}, {S_TermW, 8, 35}, {S_MakeUpW, 5, 128}, {S_TermW, 8, 51}, {S_TermW, 6, 15}, {S_TermW, 8, 63}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 6, 13}, {S_TermW, 4, 3}, {S_MakeUpW, 9, 1536}, {S_TermW, 4, 5}, {S_TermW, 8, 43}, {S_TermW, 6, 17}, {S_MakeUpW, 9, 1280}, {S_TermW, 4, 6}, {S_TermW, 6, 1}, {S_TermW, 5, 8}, {S_MakeUpW, 6, 192}, {S_MakeUpW, 5, 64}, {S_TermW, 5, 10}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 8, 29}, {S_TermW, 4, 3}, {S_TermW, 5, 11}, {S_TermW, 4, 5}, {S_TermW, 6, 12}, {S_TermW, 5, 9}, {S_MakeUpW, 6, 1664}, {S_TermW, 4, 6}, {S_TermW, 8, 33}, {S_MakeUpW, 5, 128}, {S_TermW, 8, 49}, {S_TermW, 6, 14}, {S_TermW, 8, 61}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 8, 47}, {S_TermW, 4, 3}, {S_TermW, 8, 59}, {S_TermW, 4, 5}, {S_TermW, 8, 41}, {S_TermW, 6, 16}, {S_MakeUpW, 9, 1024}, {S_TermW, 4, 6}, {S_TermW, 8, 31}, {S_TermW, 5, 8}, {S_TermW, 8, 57}, {S_MakeUpW, 5, 64}, {S_TermW, 5, 10}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 7, 22}, {S_TermW, 4, 3}, {S_TermW, 5, 11}, {S_TermW, 4, 5}, {S_TermW, 7, 26}, {S_TermW, 5, 9}, {S_MakeUpW, 9, 768}, {S_TermW, 4, 6}, {S_TermW, 8, 37}, {S_MakeUpW, 5, 128}, {S_TermW, 7, 25}, {S_TermW, 6, 15}, {S_MakeUpW, 8, 320}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 6, 13}, {S_TermW, 4, 3}, {S_TermW, 7, 18}, {S_TermW, 4, 5}, {S_TermW, 7, 21}, {S_TermW, 6, 17}, {S_MakeUpW, 7, 256}, {S_TermW, 4, 6}, {S_TermW, 6, 1}, {S_TermW, 5, 8}, {S_MakeUpW, 6, 192}, {S_MakeUpW, 5, 64}, {S_TermW, 5, 10}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_MakeUp, 12, 2560}, {S_TermW, 4, 3}, {S_TermW, 5, 11}, {S_TermW, 4, 5}, {S_TermW, 6, 12}, {S_TermW, 5, 9}, {S_MakeUpW, 6, 1664}, {S_TermW, 4, 6}, {S_TermW, 7, 20}, {S_MakeUpW, 5, 128}, {S_TermW, 7, 24}, {S_TermW, 6, 14}, {S_TermW, 7, 28}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 7, 23}, {S_TermW, 4, 3}, {S_TermW, 7, 27}, {S_TermW, 4, 5}, {S_TermW, 8, 40}, {S_TermW, 6, 16}, {S_MakeUpW, 9, 896}, {S_TermW, 4, 6}, {S_TermW, 7, 19}, {S_TermW, 5, 8}, {S_TermW, 8, 56}, {S_MakeUpW, 5, 64}, {S_TermW, 5, 10}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 8, 46}, {S_TermW, 4, 3}, {S_TermW, 5, 11}, {S_TermW, 4, 5}, {S_TermW, 8, 54}, {S_TermW, 5, 9}, {S_MakeUpW, 8, 512}, {S_TermW, 4, 6}, {S_TermW, 8, 36}, {S_MakeUpW, 5, 128}, {S_TermW, 8, 52}, {S_TermW, 6, 15}, {S_TermW, 8, 0}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 6, 13}, {S_TermW, 4, 3}, {S_MakeUpW, 9, 1728}, {S_TermW, 4, 5}, {S_TermW, 8, 44}, {S_TermW, 6, 17}, {S_MakeUpW, 9, 1408}, {S_TermW, 4, 6}, {S_TermW, 6, 1}, {S_TermW, 5, 8}, {S_MakeUpW, 6, 192}, {S_MakeUpW, 5, 64}, {S_TermW, 5, 10}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 8, 30}, {S_TermW, 4, 3}, {S_TermW, 5, 11}, {S_TermW, 4, 5}, {S_TermW, 6, 12}, {S_TermW, 5, 9}, {S_MakeUpW, 6, 1664}, {S_TermW, 4, 6}, {S_TermW, 8, 34}, {S_MakeUpW, 5, 128}, {S_TermW, 8, 50}, {S_TermW, 6, 14}, {S_TermW, 8, 62}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 8, 48}, {S_TermW, 4, 3}, {S_TermW, 8, 60}, {S_TermW, 4, 5}, {S_TermW, 8, 42}, {S_TermW, 6, 16}, {S_MakeUpW, 9, 1152}, {S_TermW, 4, 6}, {S_TermW, 8, 32}, {S_TermW, 5, 8}, {S_TermW, 8, 58}, {S_MakeUpW, 5, 64}, {S_TermW, 5, 10}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 7, 22}, {S_TermW, 4, 3}, {S_TermW, 5, 11}, {S_TermW, 4, 5}, {S_TermW, 7, 26}, {S_TermW, 5, 9}, {S_MakeUpW, 8, 640}, {S_TermW, 4, 6}, {S_TermW, 8, 38}, {S_MakeUpW, 5, 128}, {S_TermW, 7, 25}, {S_TermW, 6, 15}, {S_MakeUpW, 8, 384}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7}, {S_TermW, 6, 13}, {S_TermW, 4, 3}, {S_TermW, 7, 18}, {S_TermW, 4, 5}, {S_TermW, 7, 21}, {S_TermW, 6, 17}, {S_MakeUpW, 7, 256}, {S_TermW, 4, 6}, {S_TermW, 6, 1}, {S_TermW, 5, 8}, {S_MakeUpW, 6, 192}, {S_MakeUpW, 5, 64}, {S_TermW, 5, 10}, {S_TermW, 4, 4}, {S_TermW, 4, 2}, {S_TermW, 4, 7} }; static const t4_table_entry_t t4_1d_black_table[8192] = { {S_Null, 1, 0}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 9}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 10}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 8, 13}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 8}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 9, 15}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 10, 18}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 9}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 11}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 10, 17}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 8}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 12}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_MakeUp, 11, 1792}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 9}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 10}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 11, 23}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 8}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 11, 20}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 11, 25}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 9}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 11}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 8, 14}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 8}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 12}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_Null, 1, 0}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 9}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 10}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 8, 13}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 8}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_MakeUpB, 12, 128}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 12, 56}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 9}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 11}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 12, 30}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 8}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 12}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_MakeUp, 11, 1856}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 9}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 10}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 12, 57}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 8}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 11, 21}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 12, 54}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 9}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 11}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 8, 14}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 8}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 12}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_Null, 1, 0}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 9}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 10}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 8, 13}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 8}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 9, 15}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 12, 52}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 9}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 11}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 12, 48}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 8}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 12}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_MakeUp, 12, 2112}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 9}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 10}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 12, 44}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 8}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 12, 36}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_MakeUpB, 12, 384}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 9}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 11}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 8, 14}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 8}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 12}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_Null, 1, 0}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 9}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 10}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 8, 13}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 8}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 12, 28}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 12, 60}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 9}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 11}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 12, 40}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 8}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 12}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_MakeUp, 12, 2368}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 9}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 10}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 10, 16}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 8}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 10, 0}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_MakeUpB, 10, 64}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 9}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 11}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 8, 14}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 8}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 12}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_Null, 1, 0}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 9}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 10}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 8, 13}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 8}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 9, 15}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 10, 18}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 9}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 11}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 10, 17}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 8}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 12}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_MakeUp, 12, 1984}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 9}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 10}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 12, 50}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 8}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 12, 34}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_MakeUpB, 13, 1664}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 9}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 11}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 8, 14}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 8}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 12}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_Null, 1, 0}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 9}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 10}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 8, 13}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 8}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 12, 26}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_MakeUpB, 13, 1408}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 9}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 11}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 12, 32}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 8}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 12}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_MakeUp, 11, 1920}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 9}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 10}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 12, 61}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 8}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 12, 42}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_MakeUpB, 13, 1024}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 9}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 11}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 8, 14}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 8}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 12}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_Null, 1, 0}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 9}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 10}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 8, 13}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 8}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 9, 15}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_MakeUpB, 13, 768}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 9}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 11}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 12, 62}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 8}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 12}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_MakeUp, 12, 2240}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 9}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 10}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 12, 46}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 8}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 12, 38}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_MakeUpB, 13, 512}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 9}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 11}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 8, 14}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 8}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 12}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_Null, 1, 0}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 9}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 10}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 8, 13}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 8}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 11, 19}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 11, 24}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 9}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 11}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 11, 22}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 8}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 12}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_MakeUp, 12, 2496}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 9}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 10}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 10, 16}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 8}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 10, 0}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_MakeUpB, 10, 64}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 9}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 11}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 8, 14}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 8}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 12}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_EOL, 12, 0}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 9}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 10}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 8, 13}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 8}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 9, 15}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 10, 18}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 9}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 11}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 10, 17}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 8}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 12}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_MakeUp, 11, 1792}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 9}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 10}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 11, 23}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 8}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 11, 20}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 11, 25}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 9}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 11}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 8, 14}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 8}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 12}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_Null, 1, 0}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 9}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 10}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 8, 13}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 8}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_MakeUpB, 12, 192}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_MakeUpB, 13, 1280}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 9}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 11}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 12, 31}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 8}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 12}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_MakeUp, 11, 1856}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 9}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 10}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 12, 58}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 8}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 11, 21}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_MakeUpB, 13, 896}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 9}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 11}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 8, 14}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 8}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 12}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_Null, 1, 0}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 9}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 10}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 8, 13}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 8}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 9, 15}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_MakeUpB, 13, 640}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 9}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 11}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 12, 49}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 8}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 12}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_MakeUp, 12, 2176}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 9}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 10}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 12, 45}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 8}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 12, 37}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_MakeUpB, 12, 448}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 9}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 11}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 8, 14}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 8}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 12}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_Null, 1, 0}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 9}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 10}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 8, 13}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 8}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 12, 29}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_MakeUpB, 13, 1536}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 9}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 11}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 12, 41}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 8}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 12}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_MakeUp, 12, 2432}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 9}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 10}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 10, 16}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 8}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 10, 0}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_MakeUpB, 10, 64}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 9}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 11}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 8, 14}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 8}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 12}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_Null, 1, 0}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 9}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 10}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 8, 13}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 8}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 9, 15}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 10, 18}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 9}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 11}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 10, 17}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 8}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 12}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_MakeUp, 12, 2048}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 9}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 10}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 12, 51}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 8}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 12, 35}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_MakeUpB, 12, 320}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 9}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 11}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 8, 14}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 8}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 12}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_Null, 1, 0}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 9}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 10}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 8, 13}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 8}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 12, 27}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 12, 59}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 9}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 11}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 12, 33}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 8}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 12}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_MakeUp, 11, 1920}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 9}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 10}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_MakeUpB, 12, 256}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 8}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 12, 43}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_MakeUpB, 13, 1152}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 9}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 11}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 8, 14}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 8}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 12}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_Null, 1, 0}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 9}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 10}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 8, 13}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 8}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 9, 15}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 12, 55}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 9}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 11}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 12, 63}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 8}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 12}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_MakeUp, 12, 2304}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 9}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 10}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 12, 47}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 8}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 12, 39}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 12, 53}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 9}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 11}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 8, 14}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 8}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 12}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_Null, 1, 0}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 9}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 10}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 8, 13}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 8}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 11, 19}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 11, 24}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 9}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 11}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 11, 22}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 8}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 12}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_MakeUp, 12, 2560}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 9}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 10}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 10, 16}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 8}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 10, 0}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_MakeUpB, 10, 64}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 9}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 11}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 8, 14}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 8}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 12}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_Null, 1, 0}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 9}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 10}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 8, 13}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 8}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 9, 15}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 10, 18}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 9}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 11}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 10, 17}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 8}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 12}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_MakeUp, 11, 1792}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 9}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 10}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 11, 23}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 8}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 11, 20}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 11, 25}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 9}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 11}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 8, 14}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 8}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 12}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_Null, 1, 0}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 9}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 10}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 8, 13}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 8}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_MakeUpB, 12, 128}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 12, 56}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 9}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 11}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 12, 30}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 8}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 12}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_MakeUp, 11, 1856}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 9}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 10}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 12, 57}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 8}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 11, 21}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 12, 54}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 9}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 11}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 8, 14}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 8}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 12}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_Null, 1, 0}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 9}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 10}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 8, 13}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 8}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 9, 15}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 12, 52}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 9}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 11}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 12, 48}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 8}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 12}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_MakeUp, 12, 2112}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 9}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 10}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 12, 44}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 8}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 12, 36}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_MakeUpB, 12, 384}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 9}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 11}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 8, 14}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 8}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 12}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_Null, 1, 0}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 9}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 10}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 8, 13}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 8}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 12, 28}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 12, 60}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 9}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 11}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 12, 40}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 8}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 12}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_MakeUp, 12, 2368}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 9}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 10}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 10, 16}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 8}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 10, 0}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_MakeUpB, 10, 64}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 9}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 11}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 8, 14}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 8}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 12}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_Null, 1, 0}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 9}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 10}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 8, 13}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 8}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 9, 15}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 10, 18}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 9}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 11}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 10, 17}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 8}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 12}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_MakeUp, 12, 1984}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 9}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 10}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 12, 50}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 8}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 12, 34}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_MakeUpB, 13, 1728}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 9}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 11}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 8, 14}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 8}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 12}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_Null, 1, 0}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 9}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 10}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 8, 13}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 8}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 12, 26}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_MakeUpB, 13, 1472}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 9}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 11}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 12, 32}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 8}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 12}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_MakeUp, 11, 1920}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 9}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 10}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 12, 61}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 8}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 12, 42}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_MakeUpB, 13, 1088}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 9}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 11}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 8, 14}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 8}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 12}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_Null, 1, 0}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 9}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 10}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 8, 13}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 8}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 9, 15}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_MakeUpB, 13, 832}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 9}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 11}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 12, 62}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 8}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 12}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_MakeUp, 12, 2240}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 9}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 10}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 12, 46}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 8}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 12, 38}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_MakeUpB, 13, 576}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 9}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 11}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 8, 14}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 8}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 12}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_Null, 1, 0}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 9}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 10}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 8, 13}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 8}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 11, 19}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 11, 24}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 9}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 11}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 11, 22}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 8}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 12}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_MakeUp, 12, 2496}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 9}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 10}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 10, 16}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 8}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 10, 0}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_MakeUpB, 10, 64}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 9}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 11}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 8, 14}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 8}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 12}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_EOL, 12, 0}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 9}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 10}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 8, 13}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 8}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 9, 15}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 10, 18}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 9}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 11}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 10, 17}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 8}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 12}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_MakeUp, 11, 1792}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 9}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 10}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 11, 23}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 8}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 11, 20}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 11, 25}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 9}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 11}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 8, 14}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 8}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 12}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_Null, 1, 0}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 9}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 10}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 8, 13}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 8}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_MakeUpB, 12, 192}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_MakeUpB, 13, 1344}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 9}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 11}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 12, 31}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 8}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 12}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_MakeUp, 11, 1856}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 9}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 10}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 12, 58}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 8}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 11, 21}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_MakeUpB, 13, 960}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 9}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 11}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 8, 14}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 8}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 12}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_Null, 1, 0}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 9}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 10}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 8, 13}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 8}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 9, 15}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_MakeUpB, 13, 704}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 9}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 11}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 12, 49}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 8}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 12}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_MakeUp, 12, 2176}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 9}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 10}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 12, 45}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 8}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 12, 37}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_MakeUpB, 12, 448}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 9}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 11}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 8, 14}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 8}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 12}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_Null, 1, 0}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 9}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 10}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 8, 13}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 8}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 12, 29}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_MakeUpB, 13, 1600}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 9}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 11}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 12, 41}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 8}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 12}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_MakeUp, 12, 2432}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 9}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 10}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 10, 16}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 8}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 10, 0}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_MakeUpB, 10, 64}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 9}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 11}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 8, 14}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 8}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 12}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_Null, 1, 0}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 9}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 10}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 8, 13}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 8}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 9, 15}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 10, 18}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 9}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 11}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 10, 17}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 8}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 12}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_MakeUp, 12, 2048}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 9}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 10}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 12, 51}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 8}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 12, 35}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_MakeUpB, 12, 320}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 9}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 11}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 8, 14}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 8}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 12}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_Null, 1, 0}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 9}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 10}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 8, 13}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 8}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 12, 27}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 12, 59}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 9}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 11}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 12, 33}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 8}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 12}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_MakeUp, 11, 1920}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 9}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 10}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_MakeUpB, 12, 256}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 8}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 12, 43}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_MakeUpB, 13, 1216}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 9}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 11}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 8, 14}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 8}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 12}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_Null, 1, 0}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 9}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 10}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 8, 13}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 8}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 9, 15}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 12, 55}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 9}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 11}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 12, 63}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 8}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 12}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_MakeUp, 12, 2304}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 9}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 10}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 12, 47}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 8}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 12, 39}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 12, 53}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 9}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 11}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 8, 14}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 8}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 12}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_Null, 1, 0}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 9}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 10}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 8, 13}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 8}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 11, 19}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 11, 24}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 9}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 11}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 11, 22}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 8}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 12}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_MakeUp, 12, 2560}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 9}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 10}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 10, 16}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 8}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 10, 0}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_MakeUpB, 10, 64}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 9}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 11}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 8, 14}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 6, 8}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 7, 12}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 6}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2}, {S_TermB, 5, 7}, {S_TermB, 2, 3}, {S_TermB, 3, 1}, {S_TermB, 2, 2}, {S_TermB, 4, 5}, {S_TermB, 2, 3}, {S_TermB, 3, 4}, {S_TermB, 2, 2} }; /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/schedule.c0000644000175000017500000000777611150047216017636 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * schedule.c * * Written by Steve Underwood * * Copyright (C) 2004 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: schedule.c,v 1.17 2008/05/13 13:17:23 steveu Exp $ */ #if defined(HAVE_CONFIG_H) #include #endif #include #include #include #include #include "spandsp/telephony.h" #include "spandsp/logging.h" #include "spandsp/schedule.h" int span_schedule_event(span_sched_state_t *s, int us, span_sched_callback_func_t function, void *user_data) { int i; for (i = 0; i < s->max_to_date; i++) { if (s->sched[i].callback == NULL) break; /*endif*/ } /*endfor*/ if (i >= s->allocated) { s->allocated += 5; s->sched = (span_sched_t *) realloc(s->sched, sizeof(span_sched_t)*s->allocated); } /*endif*/ if (i >= s->max_to_date) s->max_to_date = i + 1; /*endif*/ s->sched[i].when = s->ticker + us; s->sched[i].callback = function; s->sched[i].user_data = user_data; return i; } /*- End of function --------------------------------------------------------*/ uint64_t span_schedule_next(span_sched_state_t *s) { int i; uint64_t earliest; earliest = ~((uint64_t) 0); for (i = 0; i < s->max_to_date; i++) { if (s->sched[i].callback && earliest > s->sched[i].when) earliest = s->sched[i].when; /*endif*/ } /*endfor*/ return earliest; } /*- End of function --------------------------------------------------------*/ uint64_t span_schedule_time(span_sched_state_t *s) { return s->ticker; } /*- End of function --------------------------------------------------------*/ void span_schedule_update(span_sched_state_t *s, int us) { int i; span_sched_callback_func_t callback; void *user_data; s->ticker += us; for (i = 0; i < s->max_to_date; i++) { if (s->sched[i].callback && s->sched[i].when <= s->ticker) { callback = s->sched[i].callback; user_data = s->sched[i].user_data; s->sched[i].callback = NULL; s->sched[i].user_data = NULL; callback(s, user_data); } /*endif*/ } /*endfor*/ } /*- End of function --------------------------------------------------------*/ void span_schedule_del(span_sched_state_t *s, int i) { if (i >= s->max_to_date || i < 0 || s->sched[i].callback == NULL) { span_log(&s->logging, SPAN_LOG_WARNING, "Requested to delete invalid scheduled ID %d ?\n", i); return; } /*endif*/ s->sched[i].callback = NULL; } /*- End of function --------------------------------------------------------*/ span_sched_state_t *span_schedule_init(span_sched_state_t *s) { memset(s, 0, sizeof(*s)); span_log_init(&s->logging, SPAN_LOG_NONE, NULL); span_log_set_protocol(&s->logging, "SCHEDULE"); return s; } /*- End of function --------------------------------------------------------*/ int span_schedule_release(span_sched_state_t *s) { if (s->sched) { free(s->sched); s->sched = NULL; } return 0; } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/src/v27ter_tx_2400_fixed_rrc.h0000644000175000017500000000771511150047216022376 0ustar julienjulien#define TX_PULSESHAPER_2400_GAIN 0.875533f #define TX_PULSESHAPER_2400_COEFF_SETS 20 static const int16_t tx_pulseshaper_2400[TX_PULSESHAPER_2400_COEFF_SETS][9] = { { 144, /* Filter 0 */ 308, -432, -2162, 16681, 16681, -2162, -432, 308 }, { 105, /* Filter 1 */ 379, -311, -2761, 19232, 14102, -1560, -516, 228 }, { 58, /* Filter 2 */ 434, -155, -3327, 21702, 11548, -978, -560, 141 }, { 4, /* Filter 3 */ 470, 28, -3830, 24037, 9071, -439, -566, 52 }, { -52, /* Filter 4 */ 484, 232, -4238, 26183, 6715, 39, -536, -32 }, { -110, /* Filter 5 */ 474, 445, -4521, 28093, 4521, 445, -474, -110 }, { -164, /* Filter 6 */ 439, 657, -4647, 29721, 2524, 770, -386, -176 }, { -213, /* Filter 7 */ 381, 854, -4586, 31029, 752, 1008, -279, -229 }, { -252, /* Filter 8 */ 300, 1023, -4315, 31986, -776, 1160, -159, -267 }, { -278, /* Filter 9 */ 201, 1150, -3811, 32570, -2047, 1229, -35, -287 }, { -291, /* Filter 10 */ 87, 1223, -3058, 32767, -3058, 1223, 87, -291 }, { -287, /* Filter 11 */ -35, 1229, -2047, 32570, -3811, 1150, 201, -278 }, { -267, /* Filter 12 */ -159, 1160, -776, 31986, -4315, 1023, 300, -252 }, { -229, /* Filter 13 */ -279, 1008, 752, 31029, -4586, 854, 381, -213 }, { -176, /* Filter 14 */ -386, 770, 2524, 29721, -4647, 657, 439, -164 }, { -110, /* Filter 15 */ -474, 445, 4521, 28093, -4521, 445, 474, -110 }, { -32, /* Filter 16 */ -536, 39, 6715, 26183, -4238, 232, 484, -52 }, { 52, /* Filter 17 */ -566, -439, 9071, 24037, -3830, 28, 470, 4 }, { 141, /* Filter 18 */ -560, -978, 11548, 21702, -3327, -155, 434, 58 }, { 228, /* Filter 19 */ -516, -1560, 14102, 19232, -2761, -311, 379, 105 } }; iaxmodem-1.2.0/lib/spandsp/src/libspandsp.sln0000644000175000017500000000272211150047216020535 0ustar julienjulien Microsoft Visual Studio Solution File, Format Version 9.00 # Visual Studio 2005 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libspandsp", "libspandsp.vcproj", "{CF70F278-3364-4395-A2E1-23501C9B8AD2}" ProjectSection(ProjectDependencies) = postProject {1CED5987-A529-46DC-B30F-870D85FF9C94} = {1CED5987-A529-46DC-B30F-870D85FF9C94} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "at_dictionary_gen", "src\msvc\at_dictionary_gen.vcproj", "{1CED5987-A529-46DC-B30F-870D85FF9C94}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 Release|Win32 = Release|Win32 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {CF70F278-3364-4395-A2E1-23501C9B8AD2}.Debug|Win32.ActiveCfg = Debug|Win32 {CF70F278-3364-4395-A2E1-23501C9B8AD2}.Debug|Win32.Build.0 = Debug|Win32 {CF70F278-3364-4395-A2E1-23501C9B8AD2}.Release|Win32.ActiveCfg = Release|Win32 {CF70F278-3364-4395-A2E1-23501C9B8AD2}.Release|Win32.Build.0 = Release|Win32 {1CED5987-A529-46DC-B30F-870D85FF9C94}.Debug|Win32.ActiveCfg = Debug|Win32 {1CED5987-A529-46DC-B30F-870D85FF9C94}.Debug|Win32.Build.0 = Debug|Win32 {1CED5987-A529-46DC-B30F-870D85FF9C94}.Release|Win32.ActiveCfg = Release|Win32 {1CED5987-A529-46DC-B30F-870D85FF9C94}.Release|Win32.Build.0 = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal iaxmodem-1.2.0/lib/spandsp/spandsp-sim/0000755000175000017500000000000011150047621017324 5ustar julienjulieniaxmodem-1.2.0/lib/spandsp/spandsp-sim/spandsp-sim.h0000644000175000017500000000250711150047216021737 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * spandsp-sim.h - The head guy amongst the simulator headers * * Written by Steve Underwood * * Copyright (C) 2007 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2, as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: spandsp-sim.h,v 1.5 2008/04/26 13:39:16 steveu Exp $ */ /*! \file */ #if !defined(_SPANDSP_SIM_H_) #define _SPANDSP_SIM_H_ #include #include #include #include #include #include #include #include #include #endif /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/spandsp-sim/Makefile.am0000644000175000017500000000700411150047216021361 0ustar julienjulien## ## SpanDSP - a series of DSP components for telephony ## ## Makefile.am - Process this file with automake to produce Makefile.in ## ## This program is free software; you can redistribute it and/or modify ## it under the terms of the GNU General Public License version 2, as ## published by the Free Software Foundation. ## ## This program is distributed in the hope that it will be useful, ## but WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ## GNU General Public License for more details. ## ## You should have received a copy of the GNU General Public License ## along with this program; if not, write to the Free Software ## Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ## ## $Id: Makefile.am,v 1.7 2008/05/03 13:05:04 steveu Exp $ AM_CFLAGS = $(COMP_VENDOR_CFLAGS) AM_LDFLAGS = $(COMP_VENDOR_LDFLAGS) LIBS += $(TESTLIBS) MAINTAINERCLEANFILES = Makefile.in INCLUDES = -I$(top_builddir) -I$(top_builddir)/src -DDATADIR="\"$(pkgdatadir)\"" noinst_PROGRAMS = make_line_models lib_LTLIBRARIES = libspandsp-sim.la libspandsp_sim_la_SOURCES = g1050.c \ line_model.c \ rfc2198_sim.c \ test_utils.c nodist_libspandsp_sim_la_SOURCES = line_models.c libspandsp_sim_la_LDFLAGS = -version-info @SPANDSP_LT_CURRENT@:@SPANDSP_LT_REVISION@:@SPANDSP_LT_AGE@ nobase_include_HEADERS = spandsp/g1050.h \ spandsp/line_model.h \ spandsp/line_models.h \ spandsp/rfc2198_sim.h \ spandsp/test_utils.h \ spandsp-sim.h make_line_models_SOURCES = make_line_models.c make_line_models_LDADD = -L$(top_builddir)/src -lspandsp # We need to run make_line_models, so it generates the line_models.h file # used by several of the test programs. line_models.lo: make_line_models$(EXEEXT) line_models.c line_models.$(OBJEXT): make_line_models$(EXEEXT) line_models.c line_models.c: make_line_models$(EXEEXT) ./make_line_models$(EXEEXT) DSP = libspandsp-sim.dsp VCPROJ = libspandsp-sim.vcproj WIN32SOURCES = $(libspandsp_sim_la_SOURCES) msvc/gettimeofday.c WIN32HEADERS = $(nobase_include_HEADERS) spandsp-sim.h DSPOUT = | awk '{printf("%s\r\n", $$0)}' >> $(DSP) VCPROJOUT = | awk '{printf("%s\r\n", $$0)}' >> $(VCPROJ) $(DSP): msvc/msvcproj.head msvc/msvcproj.foot Makefile.am echo "creating $(DSP)" @(cp $(srcdir)/msvc/msvcproj.head $(DSP); \ echo "# Begin Group \"Source Files\"" $(DSPOUT); \ for file in $(WIN32SOURCES); do \ echo "# Begin Source File" $(DSPOUT); \ echo "" $(DSPOUT); \ echo "SOURCE=.\\"$$file $(DSPOUT); \ echo "# End Source File" $(DSPOUT); \ done; \ echo "# End Group" $(DSPOUT); \ echo "# Begin Group \"Header Files\"" $(DSPOUT); \ for file in $(WIN32HEADERS); do \ echo "# Begin Source File" $(DSPOUT); \ echo "" $(DSPOUT); \ echo "SOURCE=.\\"$$file $(DSPOUT); \ echo "# End Source File" $(DSPOUT); \ done; \ echo "# End Group" $(DSPOUT); \ cat $(srcdir)/msvc/msvcproj.foot $(DSPOUT) ) $(VCPROJ): msvc/vc8proj.head msvc/vc8proj.foot Makefile.am echo "creating $(VCPROJ)" @(cp $(srcdir)/msvc/vc8proj.head $(VCPROJ); \ for file in $(WIN32SOURCES); do \ echo "" $(VCPROJOUT); \ done; \ echo "" $(VCPROJOUT); \ for file in $(WIN32HEADERS); do \ echo "" $(VCPROJOUT); \ done; \ cat $(srcdir)/msvc/vc8proj.foot $(VCPROJOUT) ) iaxmodem-1.2.0/lib/spandsp/spandsp-sim/Makefile.in0000644000175000017500000005020611150047457021403 0ustar julienjulien# Makefile.in generated by automake 1.9.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = .. am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd INSTALL = @INSTALL@ install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ noinst_PROGRAMS = make_line_models$(EXEEXT) subdir = spandsp-sim DIST_COMMON = $(nobase_include_HEADERS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/config/ax_compiler_vendor.m4 \ $(top_srcdir)/config/ax_check_real_file.m4 \ $(top_srcdir)/config/ax_fixed_point_machine.m4 \ $(top_srcdir)/config/ax_misaligned_access_fails.m4 \ $(top_srcdir)/config/ax_c99_features.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/src/config.h CONFIG_CLEAN_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = `echo $$p | sed -e 's|^.*/||'`; am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(includedir)" libLTLIBRARIES_INSTALL = $(INSTALL) LTLIBRARIES = $(lib_LTLIBRARIES) libspandsp_sim_la_LIBADD = am_libspandsp_sim_la_OBJECTS = g1050.lo line_model.lo rfc2198_sim.lo \ test_utils.lo nodist_libspandsp_sim_la_OBJECTS = line_models.lo libspandsp_sim_la_OBJECTS = $(am_libspandsp_sim_la_OBJECTS) \ $(nodist_libspandsp_sim_la_OBJECTS) PROGRAMS = $(noinst_PROGRAMS) am_make_line_models_OBJECTS = make_line_models.$(OBJEXT) make_line_models_OBJECTS = $(am_make_line_models_OBJECTS) make_line_models_DEPENDENCIES = DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)/src depcomp = $(SHELL) $(top_srcdir)/config/depcomp am__depfiles_maybe = depfiles COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ SOURCES = $(libspandsp_sim_la_SOURCES) \ $(nodist_libspandsp_sim_la_SOURCES) \ $(make_line_models_SOURCES) DIST_SOURCES = $(libspandsp_sim_la_SOURCES) \ $(make_line_models_SOURCES) nobase_includeHEADERS_INSTALL = $(install_sh_DATA) HEADERS = $(nobase_include_HEADERS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMDEP_FALSE = @AMDEP_FALSE@ AMDEP_TRUE = @AMDEP_TRUE@ AMTAR = @AMTAR@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CC_FOR_BUILD = @CC_FOR_BUILD@ CFLAGS = @CFLAGS@ COMP_VENDOR_CFLAGS = @COMP_VENDOR_CFLAGS@ COMP_VENDOR_LDFLAGS = @COMP_VENDOR_LDFLAGS@ COND_DOC_FALSE = @COND_DOC_FALSE@ COND_DOC_TRUE = @COND_DOC_TRUE@ COND_MMX_FALSE = @COND_MMX_FALSE@ COND_MMX_TRUE = @COND_MMX_TRUE@ COND_SSE_FALSE = @COND_SSE_FALSE@ COND_SSE_TRUE = @COND_SSE_TRUE@ COND_TESTDATA_FALSE = @COND_TESTDATA_FALSE@ COND_TESTDATA_TRUE = @COND_TESTDATA_TRUE@ COND_TESTS_FALSE = @COND_TESTS_FALSE@ COND_TESTS_TRUE = @COND_TESTS_TRUE@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CPPFLAGS_FOR_BUILD = @CPPFLAGS_FOR_BUILD@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DSYMUTIL = @DSYMUTIL@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ GREP = @GREP@ INSERT_INTTYPES_HEADER = @INSERT_INTTYPES_HEADER@ INSERT_MATH_HEADER = @INSERT_MATH_HEADER@ INSERT_STDINT_HEADER = @INSERT_STDINT_HEADER@ INSERT_TGMATH_HEADER = @INSERT_TGMATH_HEADER@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ $(TESTLIBS) LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ NMEDIT = @NMEDIT@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SPANDSP_LT_AGE = @SPANDSP_LT_AGE@ SPANDSP_LT_CURRENT = @SPANDSP_LT_CURRENT@ SPANDSP_LT_REVISION = @SPANDSP_LT_REVISION@ SPANDSP_MISALIGNED_ACCESS_FAILS = @SPANDSP_MISALIGNED_ACCESS_FAILS@ SPANDSP_USE_FIXED_POINT = @SPANDSP_USE_FIXED_POINT@ STRIP = @STRIP@ TESTLIBS = @TESTLIBS@ VERSION = @VERSION@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ AM_CFLAGS = $(COMP_VENDOR_CFLAGS) AM_LDFLAGS = $(COMP_VENDOR_LDFLAGS) MAINTAINERCLEANFILES = Makefile.in INCLUDES = -I$(top_builddir) -I$(top_builddir)/src -DDATADIR="\"$(pkgdatadir)\"" lib_LTLIBRARIES = libspandsp-sim.la libspandsp_sim_la_SOURCES = g1050.c \ line_model.c \ rfc2198_sim.c \ test_utils.c nodist_libspandsp_sim_la_SOURCES = line_models.c libspandsp_sim_la_LDFLAGS = -version-info @SPANDSP_LT_CURRENT@:@SPANDSP_LT_REVISION@:@SPANDSP_LT_AGE@ nobase_include_HEADERS = spandsp/g1050.h \ spandsp/line_model.h \ spandsp/line_models.h \ spandsp/rfc2198_sim.h \ spandsp/test_utils.h \ spandsp-sim.h make_line_models_SOURCES = make_line_models.c make_line_models_LDADD = -L$(top_builddir)/src -lspandsp DSP = libspandsp-sim.dsp VCPROJ = libspandsp-sim.vcproj WIN32SOURCES = $(libspandsp_sim_la_SOURCES) msvc/gettimeofday.c WIN32HEADERS = $(nobase_include_HEADERS) spandsp-sim.h DSPOUT = | awk '{printf("%s\r\n", $$0)}' >> $(DSP) VCPROJOUT = | awk '{printf("%s\r\n", $$0)}' >> $(VCPROJ) all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu spandsp-sim/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu spandsp-sim/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh install-libLTLIBRARIES: $(lib_LTLIBRARIES) @$(NORMAL_INSTALL) test -z "$(libdir)" || $(mkdir_p) "$(DESTDIR)$(libdir)" @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ if test -f $$p; then \ f=$(am__strip_dir) \ echo " $(LIBTOOL) --mode=install $(libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) '$$p' '$(DESTDIR)$(libdir)/$$f'"; \ $(LIBTOOL) --mode=install $(libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) "$$p" "$(DESTDIR)$(libdir)/$$f"; \ else :; fi; \ done uninstall-libLTLIBRARIES: @$(NORMAL_UNINSTALL) @set -x; list='$(lib_LTLIBRARIES)'; for p in $$list; do \ p=$(am__strip_dir) \ echo " $(LIBTOOL) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$p'"; \ $(LIBTOOL) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$p"; \ done clean-libLTLIBRARIES: -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libspandsp-sim.la: $(libspandsp_sim_la_OBJECTS) $(libspandsp_sim_la_DEPENDENCIES) $(LINK) -rpath $(libdir) $(libspandsp_sim_la_LDFLAGS) $(libspandsp_sim_la_OBJECTS) $(libspandsp_sim_la_LIBADD) $(LIBS) clean-noinstPROGRAMS: @list='$(noinst_PROGRAMS)'; for p in $$list; do \ f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ echo " rm -f $$p $$f"; \ rm -f $$p $$f ; \ done make_line_models$(EXEEXT): $(make_line_models_OBJECTS) $(make_line_models_DEPENDENCIES) @rm -f make_line_models$(EXEEXT) $(LINK) $(make_line_models_LDFLAGS) $(make_line_models_OBJECTS) $(make_line_models_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/g1050.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/line_model.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/line_models.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/make_line_models.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rfc2198_sim.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_utils.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ if $(LTCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs distclean-libtool: -rm -f libtool uninstall-info-am: install-nobase_includeHEADERS: $(nobase_include_HEADERS) @$(NORMAL_INSTALL) test -z "$(includedir)" || $(mkdir_p) "$(DESTDIR)$(includedir)" @$(am__vpath_adj_setup) \ list='$(nobase_include_HEADERS)'; for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ $(am__vpath_adj) \ echo " $(nobase_includeHEADERS_INSTALL) '$$d$$p' '$(DESTDIR)$(includedir)/$$f'"; \ $(nobase_includeHEADERS_INSTALL) "$$d$$p" "$(DESTDIR)$(includedir)/$$f"; \ done uninstall-nobase_includeHEADERS: @$(NORMAL_UNINSTALL) @$(am__vpath_adj_setup) \ list='$(nobase_include_HEADERS)'; for p in $$list; do \ $(am__vpath_adj) \ echo " rm -f '$(DESTDIR)$(includedir)/$$f'"; \ rm -f "$(DESTDIR)$(includedir)/$$f"; \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) $(mkdir_p) $(distdir)/spandsp @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ list='$(DISTFILES)'; for file in $$list; do \ case $$file in \ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ esac; \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ dir="/$$dir"; \ $(mkdir_p) "$(distdir)$$dir"; \ else \ dir=''; \ fi; \ if test -d $$d/$$file; then \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(includedir)"; do \ test -z "$$dir" || $(mkdir_p) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-am clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \ clean-noinstPROGRAMS mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-libtool distclean-tags dvi: dvi-am dvi-am: html: html-am info: info-am info-am: install-data-am: install-nobase_includeHEADERS install-exec-am: install-libLTLIBRARIES install-info: install-info-am install-man: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-info-am uninstall-libLTLIBRARIES \ uninstall-nobase_includeHEADERS .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libLTLIBRARIES clean-libtool clean-noinstPROGRAMS ctags \ distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-exec install-exec-am install-info \ install-info-am install-libLTLIBRARIES install-man \ install-nobase_includeHEADERS install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-info-am \ uninstall-libLTLIBRARIES uninstall-nobase_includeHEADERS # We need to run make_line_models, so it generates the line_models.h file # used by several of the test programs. line_models.lo: make_line_models$(EXEEXT) line_models.c line_models.$(OBJEXT): make_line_models$(EXEEXT) line_models.c line_models.c: make_line_models$(EXEEXT) ./make_line_models$(EXEEXT) $(DSP): msvc/msvcproj.head msvc/msvcproj.foot Makefile.am echo "creating $(DSP)" @(cp $(srcdir)/msvc/msvcproj.head $(DSP); \ echo "# Begin Group \"Source Files\"" $(DSPOUT); \ for file in $(WIN32SOURCES); do \ echo "# Begin Source File" $(DSPOUT); \ echo "" $(DSPOUT); \ echo "SOURCE=.\\"$$file $(DSPOUT); \ echo "# End Source File" $(DSPOUT); \ done; \ echo "# End Group" $(DSPOUT); \ echo "# Begin Group \"Header Files\"" $(DSPOUT); \ for file in $(WIN32HEADERS); do \ echo "# Begin Source File" $(DSPOUT); \ echo "" $(DSPOUT); \ echo "SOURCE=.\\"$$file $(DSPOUT); \ echo "# End Source File" $(DSPOUT); \ done; \ echo "# End Group" $(DSPOUT); \ cat $(srcdir)/msvc/msvcproj.foot $(DSPOUT) ) $(VCPROJ): msvc/vc8proj.head msvc/vc8proj.foot Makefile.am echo "creating $(VCPROJ)" @(cp $(srcdir)/msvc/vc8proj.head $(VCPROJ); \ for file in $(WIN32SOURCES); do \ echo "" $(VCPROJOUT); \ done; \ echo "" $(VCPROJOUT); \ for file in $(WIN32HEADERS); do \ echo "" $(VCPROJOUT); \ done; \ cat $(srcdir)/msvc/vc8proj.foot $(VCPROJOUT) ) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: iaxmodem-1.2.0/lib/spandsp/spandsp-sim/spandsp/0000755000175000017500000000000011150047216020774 5ustar julienjulieniaxmodem-1.2.0/lib/spandsp/spandsp-sim/spandsp/g1050.h0000644000175000017500000002302411150047216021702 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * g1050.h - IP network modeling, as per G.1050/TIA-921. * * Written by Steve Underwood * * Copyright (C) 2007 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: g1050.h,v 1.7 2008/04/17 18:03:23 steveu Exp $ */ /*! \file */ /*! \page g1050_ip_network_model_page G.1050/TIA-921 IP network path model \section g1050_ip_network_model_page_sec_1 What does it do? The ITU G.1050 specification defines a model of an IP network, appropriate for the testing of how streaming media woud behave across the internet. The model is based on a path having 5 segments: - a local LAN (wired or wireless) - an access link to the internet - an internet of arbitrary complexity - an access link from the internet - a distant LAN (wired or wireless) The impairments typical of these segments at various service levels are modelled. 8 standard service level behaviours are defined, covering lightly loaded to heavily congested levels. 133 standard sets of link speeds are defined, covering typical wired and wireless LAN, broadband access link, and backbone characteristics. The G.1050 model is suitable for testing the behaviour of RTP, UDPTL and other streaming protocols for packet loss and jitter behaviour. */ #if !defined(_G1050_H_) #define _G1050_H_ /* This is the time slice at which delays, packet loss, etc. are calculated. */ #define G1050_TICKS_PER_SEC 1000 /* Search back 200 ms to preserve order of legitimately out of sequence packets. */ #define SEARCHBACK_PERIOD 200 #define G1050_LOW_LOSS 0 #define G1050_HIGH_LOSS 1 #define G1050_LAN_LINK 1 #define G1050_ACCESS_LINK 2 /*! Segment constants, as defined in G.1050. */ typedef struct { /*! Probability of changing from low to high and high to low loss states */ double prob_loss_rate_change[2]; /*! Probability of an impulse in the low and high loss states */ double prob_impulse[2][2]; /*! Impulse height, based on MTU and bit rate */ double impulse_height; /*! Impulse decay coefficient for the single pole IIR filter. */ double impulse_coeff; /*! Probability of packet loss due to occupancy. */ double prob_packet_loss; /*! Probability of packet loss due to a multiple access collision. */ double prob_packet_collision_loss; } g1050_segment_constants_t; /*! End-to-end constants, as defined in G.1050. */ typedef struct { g1050_segment_constants_t segment[4]; } g1050_constants_t; /*! The model definition for a LAN or access link segment */ typedef struct { /*! Percentage occupancy of the media */ double percentage_occupancy; /*! MTU of the media */ int mtu; /*! Maximum jitter in the segment. */ double max_jitter; } g1050_segment_model_t; /*! The model definition for the core network (backbone) segment */ typedef struct { /*! Basic delay of the backbone for regional paths */ double base_regional_delay; /*! Basic delay of the backbone for intercontinental paths */ double base_intercontinental_delay; /*! Percentage packet loss of the backbone */ /*! Percentage packet loss of the backbone. */ double percentage_packet_loss; /*! Maximum jitter in the backbone. */ double max_jitter; /*! Interval between the backbone route flapping between two paths, in seconds. */ double route_flap_interval; /*! The difference in backbone delay between the two routes we flap between, in seconds. */ double route_flap_delay; /*! The interval between link failures. */ double link_failure_interval; /*! The duration of link failures. */ double link_failure_duration; /*! Probability of packet loss in the backbone. */ double prob_packet_loss; /*! Probability of a packet going out of sequence in the backbone. */ double prob_oos; } g1050_core_model_t; /*! The model definition for a complete end-to-end path */ typedef struct { /*! The likelyhood of occurance probabilities for the A, B and C scenarios defined in G.1050 */ int loo[3]; g1050_segment_model_t sidea_lan; g1050_segment_model_t sidea_access_link; g1050_core_model_t core; g1050_segment_model_t sideb_access_link; g1050_segment_model_t sideb_lan; } g1050_model_t; /*! The speed model for a complete end-to-end path */ typedef struct { int sidea_lan_bit_rate; int sidea_lan_multiple_access; int sidea_access_link_bit_rate_ab; int sidea_access_link_bit_rate_ba; int sidea_access_link_qos_enabled; int sideb_lan_bit_rate; int sideb_lan_multiple_access; int sideb_access_link_bit_rate_ab; int sideb_access_link_bit_rate_ba; int sideb_access_link_qos_enabled; double loo; } g1050_channel_speeds_t; /*! The model state for a LAN or access link segment */ typedef struct { /*! The type of link, G1050_LAN_LINK or G_1050_ACCESS_LINK */ int link_type; /*! 1 if in the high loss state, or 0 if in the low loss state. */ int high_loss; /*! The probability of a loss rate change, for both loss rate states. */ double prob_loss_rate_change[2]; /*! The probability of a impulse occuring, for both loss rate states. */ double prob_impulse[2]; /*! The maximum permitted height of impulses. */ double impulse_height; /*! The impulse decay coefficient. */ double impulse_coeff; /*! The basic serial delay due to the link. */ double serial_delay; /*! Peak jitter in the segment. */ double max_jitter; /*! The probability of packet loss. */ double prob_packet_loss; /*! The probability of packet loss due to collision. */ double prob_packet_collision_loss; /*! The maximum addition delay due to congestion. */ double congestion_delay; /*! TRUE if QoS is enabled on the link. */ int qos_enabled; /*! TRUE if the link is a multiple access type (e.g. an ethernet hub). */ int multiple_access; /*! The latest packet arrival time seen on the link. */ double last_arrival_time; /*! 3 seconds of predicted delays for the link */ double delays[3*G1050_TICKS_PER_SEC]; /*! A count of packets lost on the link. */ uint32_t lost_packets; /*! An extra debug count of packets lost on the link. */ uint32_t lost_packets_2; } g1050_segment_state_t; /*! The model state for the core network (backbone) segment */ typedef struct { /* Router model. */ int32_t route_flap_counter; int32_t route_flap_interval; double route_flap_delta; /* Link failure model. */ int32_t link_failure_counter; int32_t link_recovery_counter; int32_t link_failure_interval_ticks; int32_t link_failure_duration_ticks; /*! Basic backbone delay */ double base_delay; /*! Peak jitter in the backbone delay */ double max_jitter; /*! Probability of packet loss in the backbone, in percent */ double prob_packet_loss; /*! Probability of a packet going out of sequence in the backbone. */ double prob_oos; /*! The latest packet arrival time seen on the link. */ double last_arrival_time; double delay_delta; /*! 3 seconds of predicted delays for the link */ double delays[3*G1050_TICKS_PER_SEC]; /*! A count of packets lost on the link. */ uint32_t lost_packets; /*! An extra debug count of packets lost on the link. */ uint32_t lost_packets_2; } g1050_core_state_t; /*! The definition of an element in the packet queue */ typedef struct g1050_queue_element_s { struct g1050_queue_element_s *next; struct g1050_queue_element_s *prev; int seq_no; double departure_time; double arrival_time; int len; uint8_t pkt[0]; } g1050_queue_element_t; /*! The model definition for a complete end-to-end path */ typedef struct { int packet_rate; int packet_size; float base_time; g1050_segment_state_t segment[4]; g1050_core_state_t core; double arrival_times_1[3*G1050_TICKS_PER_SEC]; double arrival_times_2[3*G1050_TICKS_PER_SEC]; g1050_queue_element_t *first; g1050_queue_element_t *last; } g1050_state_t; extern g1050_constants_t g1050_constants[1]; extern g1050_channel_speeds_t g1050_speed_patterns[133]; extern g1050_model_t g1050_standard_models[9]; #ifdef __cplusplus extern "C" { #endif g1050_state_t *g1050_init(int model, int speed_pattern, int packet_size, int packet_rate); void g1050_dump_parms(int model, int speed_pattern); int g1050_put(g1050_state_t *s, const uint8_t buf[], int len, int seq_no, double departure_time); int g1050_get(g1050_state_t *s, uint8_t buf[], int max_len, double current_time, int *seq_no, double *departure_time, double *arrival_time); void g1050_queue_dump(g1050_state_t *s); #ifdef __cplusplus } #endif #endif /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/spandsp-sim/spandsp/rfc2198_sim.h0000644000175000017500000000543011150047216023115 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * rfc2198_sim.h - Simulate the behaviour of RFC2198 (or UDPTL) redundancy. * * Written by Steve Underwood * * Copyright (C) 2007 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: rfc2198_sim.h,v 1.3 2008/04/17 18:03:23 steveu Exp $ */ /*! \file */ /*! \page rfc2198_model_page RFC2198 simulation \section rfc2198_model_page_sec_1 What does it do? */ #if !defined(_RFC2198_SIM_H_) #define _RFC2198_SIM_H_ /*! The definition of an element in the packet queue */ typedef struct rfc2198_sim_queue_element_s { struct rfc2198_sim_queue_element_s *next; struct rfc2198_sim_queue_element_s *prev; int seq_no; double departure_time; double arrival_time; int len; uint8_t pkt[0]; } rfc2198_sim_queue_element_t; /*! The model definition for a complete end-to-end path */ typedef struct { int redundancy_depth; int next_seq_no; g1050_state_t *g1050; rfc2198_sim_queue_element_t *first; rfc2198_sim_queue_element_t *last; uint8_t tx_pkt[32][1024]; int tx_pkt_len[32]; int tx_pkt_seq_no[32]; int next_pkt; uint8_t rx_pkt[32][1024]; int rx_pkt_len[32]; int rx_pkt_seq_no[32]; int rx_queued_pkts; } rfc2198_sim_state_t; #ifdef __cplusplus extern "C" { #endif rfc2198_sim_state_t *rfc2198_sim_init(int model, int speed_pattern, int packet_size, int packet_rate, int redundancy_depth); int rfc2198_sim_put(rfc2198_sim_state_t *s, const uint8_t buf[], int len, int seq_no, double departure_time); int rfc2198_sim_get(rfc2198_sim_state_t *s, uint8_t buf[], int max_len, double current_time, int *seq_no, double *departure_time, double *arrival_time); #ifdef __cplusplus } #endif #endif /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/spandsp-sim/spandsp/line_model.h0000644000175000017500000001304511150047216023257 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * line_model.h - Model a telephone line. * * Written by Steve Underwood * * Copyright (C) 2004 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: line_model.h,v 1.3 2008/04/17 18:03:23 steveu Exp $ */ /*! \file */ /*! \page line_model_page Telephone line model \section line_model_page_sec_1 What does it do? The telephone line modelling module provides simple modelling of one way and two way telephone lines. The path being modelled is: - terminal - | < hybrid echo (2-way models) - | - | < noise and filtering - | - | < hybrid echo (2-way models) - CO - | - | < A-law distortion + bulk delay - | - CO - | < hybrid echo (2-way models) - | - | < noise and filtering - | - | < hybrid echo (2-way models) - terminal */ #if !defined(_SPANDSP_LINE_MODEL_H_) #define _SPANDSP_LINE_MODEL_H_ #define LINE_FILTER_SIZE 129 /*! One way line model descriptor. This holds the complete state of a line model with transmission in only one direction. */ typedef struct { codec_munge_state_t *munge; /*! The coefficients for the near end analogue section simulation filter */ float *near_filter; /*! The number of coefficients for the near end analogue section simulation filter */ int near_filter_len; /*! Last transmitted samples (ring buffer, used by the line filter) */ float near_buf[LINE_FILTER_SIZE]; /*! Pointer of the last transmitted sample in buf */ int near_buf_ptr; /*! The noise source for local analogue section of the line */ awgn_state_t near_noise; /*! The bulk delay of the path, in samples */ int bulk_delay; /*! A pointer to the current write position in the bulk delay store. */ int bulk_delay_ptr; /*! The data store for simulating the bulk delay */ int16_t bulk_delay_buf[8000]; /*! The coefficients for the far end analogue section simulation filter */ float *far_filter; /*! The number of coefficients for the far end analogue section simulation filter */ int far_filter_len; /*! Last transmitted samples (ring buffer, used by the line filter) */ float far_buf[LINE_FILTER_SIZE]; /*! Pointer of the last transmitted sample in buf */ int far_buf_ptr; /*! The noise source for distant analogue section of the line */ awgn_state_t far_noise; /*! The scaling factor for the local CPE hybrid echo */ float near_cpe_hybrid_echo; /*! The scaling factor for the local CO hybrid echo */ float near_co_hybrid_echo; /*! The scaling factor for the far CPE hybrid echo */ float far_cpe_hybrid_echo; /*! The scaling factor for the far CO hybrid echo */ float far_co_hybrid_echo; /*! DC offset impairment */ float dc_offset; /*! Mains pickup impairment */ int mains_interference; tone_gen_state_t mains_tone; } one_way_line_model_state_t; /*! Two way line model descriptor. This holds the complete state of a line model with transmission in both directions. */ typedef struct { one_way_line_model_state_t line1; one_way_line_model_state_t line2; float fout1; float fout2; } both_ways_line_model_state_t; #ifdef __cplusplus extern "C" { #endif void both_ways_line_model(both_ways_line_model_state_t *s, int16_t output1[], const int16_t input1[], int16_t output2[], const int16_t input2[], int samples); void both_ways_line_model_set_dc(both_ways_line_model_state_t *s, float dc1, float dc2); void both_ways_line_model_set_mains_pickup(both_ways_line_model_state_t *s, int f, float level1, float level2); both_ways_line_model_state_t *both_ways_line_model_init(int model1, float noise1, int model2, float noise2, int codec, int rbs_pattern); int both_ways_line_model_release(both_ways_line_model_state_t *s); void one_way_line_model(one_way_line_model_state_t *s, int16_t output[], const int16_t input[], int samples); void one_way_line_model_set_dc(one_way_line_model_state_t *s, float dc); void one_way_line_model_set_mains_pickup(one_way_line_model_state_t *s, int f, float level); one_way_line_model_state_t *one_way_line_model_init(int model, float noise, int codec, int rbs_pattern); int one_way_line_model_release(one_way_line_model_state_t *s); #ifdef __cplusplus } #endif #endif /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/spandsp-sim/spandsp/line_models.h0000644000175000017500000000343611150047216023445 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * line_model.h - Model a telephone line. * * Written by Steve Underwood * * Copyright (C) 2004 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: line_models.h,v 1.3 2008/04/17 18:03:23 steveu Exp $ */ /*! \file */ #if !defined(_SPANDSP_LINE_MODELS_H_) #define _SPANDSP_LINE_MODELS_H_ extern float proakis_line_model[]; extern float ad_1_edd_1_model[]; extern float ad_1_edd_2_model[]; extern float ad_1_edd_3_model[]; extern float ad_5_edd_1_model[]; extern float ad_5_edd_2_model[]; extern float ad_5_edd_3_model[]; extern float ad_6_edd_1_model[]; extern float ad_6_edd_2_model[]; extern float ad_6_edd_3_model[]; extern float ad_7_edd_1_model[]; extern float ad_7_edd_2_model[]; extern float ad_7_edd_3_model[]; extern float ad_8_edd_1_model[]; extern float ad_8_edd_2_model[]; extern float ad_8_edd_3_model[]; extern float ad_9_edd_1_model[]; extern float ad_9_edd_2_model[]; extern float ad_9_edd_3_model[]; #ifdef __cplusplus extern "C" { #endif #ifdef __cplusplus } #endif #endif /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/spandsp-sim/spandsp/test_utils.h0000644000175000017500000000342511150047216023350 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * test_utils.h - Utility routines for module tests. * * Written by Steve Underwood * * Copyright (C) 2006 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: test_utils.h,v 1.3 2008/04/17 18:03:23 steveu Exp $ */ /*! \file */ #if !defined(_TEST_UTILS_H_) #define _TEST_UTILS_H_ enum { MUNGE_CODEC_NONE = 0, MUNGE_CODEC_ALAW, MUNGE_CODEC_ULAW, MUNGE_CODEC_G726_40K, MUNGE_CODEC_G726_32K, MUNGE_CODEC_G726_24K, MUNGE_CODEC_G726_16K, }; typedef struct codec_munge_state_s codec_munge_state_t; typedef struct complexify_state_s complexify_state_t; #ifdef __cplusplus extern "C" { #endif complexify_state_t *complexify_init(void); void complexify_release(complexify_state_t *s); complexf_t complexify(complexify_state_t *s, int16_t amp); codec_munge_state_t *codec_munge_init(int codec, int info); void codec_munge_release(codec_munge_state_t *s); void codec_munge(codec_munge_state_t *s, int16_t amp[], int len); #ifdef __cplusplus } #endif #endif /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/spandsp-sim/test_utils.c0000644000175000017500000001463611150047216021701 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * test_utils.c - Utility routines for module tests. * * Written by Steve Underwood * * Copyright (C) 2006 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2, as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: test_utils.c,v 1.6 2008/07/02 14:48:25 steveu Exp $ */ /*! \file */ #if defined(HAVE_CONFIG_H) #include "config.h" #endif #include #include #include #include #include "floating_fudge.h" #if defined(HAVE_TGMATH_H) #include #endif #if defined(HAVE_MATH_H) #include #endif #include #include #include #include "spandsp.h" #include "spandsp-sim.h" struct codec_munge_state_s { int munging_codec; g726_state_t g726_enc_state; g726_state_t g726_dec_state; int rbs_pattern; int sequence; }; struct complexify_state_s { float history[128]; int ptr; }; complexify_state_t *complexify_init(void) { complexify_state_t *s; int i; if ((s = (complexify_state_t *) malloc(sizeof(*s)))) { s->ptr = 0; for (i = 0; i < 128; i++) s->history[i] = 0.0f; } return s; } /*- End of function --------------------------------------------------------*/ void complexify_release(complexify_state_t *s) { free(s); } /*- End of function --------------------------------------------------------*/ complexf_t complexify(complexify_state_t *s, int16_t amp) { #define HILBERT_GAIN 1.569546344 static const float hilbert_coeffs[] = { +0.0012698413f, +0.0013489483f, +0.0015105196f, +0.0017620440f, +0.0021112899f, +0.0025663788f, +0.0031358856f, +0.0038289705f, +0.0046555545f, +0.0056265487f, +0.0067541562f, +0.0080522707f, +0.0095370033f, +0.0112273888f, +0.0131463382f, +0.0153219442f, +0.0177892941f, +0.0205930381f, +0.0237910974f, +0.0274601544f, +0.0317040029f, +0.0366666667f, +0.0425537942f, +0.0496691462f, +0.0584802574f, +0.0697446887f, +0.0847739823f, +0.1060495199f, +0.1388940865f, +0.1971551103f, +0.3316207267f, +0.9994281838f, }; float famp; int i; int j; int k; complexf_t res; s->history[s->ptr] = amp; i = s->ptr - 63; if (i < 0) i += 128; res.re = s->history[i]; famp = 0.0f; j = s->ptr - 126; if (j < 0) j += 128; for (i = 0, k = s->ptr; i < 32; i++) { famp += (s->history[k] - s->history[j])*hilbert_coeffs[i]; j += 2; if (j >= 128) j -= 128; k -= 2; if (k < 0) k += 128; } res.im = famp/HILBERT_GAIN; if (++s->ptr >= 128) s->ptr = 0; return res; } /*- End of function --------------------------------------------------------*/ codec_munge_state_t *codec_munge_init(int codec, int info) { codec_munge_state_t *s; if ((s = (codec_munge_state_t *) malloc(sizeof(*s)))) { switch (codec) { case MUNGE_CODEC_G726_40K: g726_init(&s->g726_enc_state, 40000, G726_ENCODING_LINEAR, G726_PACKING_NONE); g726_init(&s->g726_dec_state, 40000, G726_ENCODING_LINEAR, G726_PACKING_NONE); s->munging_codec = MUNGE_CODEC_G726_32K; break; case MUNGE_CODEC_G726_32K: g726_init(&s->g726_enc_state, 32000, G726_ENCODING_LINEAR, G726_PACKING_NONE); g726_init(&s->g726_dec_state, 32000, G726_ENCODING_LINEAR, G726_PACKING_NONE); s->munging_codec = MUNGE_CODEC_G726_32K; break; case MUNGE_CODEC_G726_24K: g726_init(&s->g726_enc_state, 24000, G726_ENCODING_LINEAR, G726_PACKING_NONE); g726_init(&s->g726_dec_state, 24000, G726_ENCODING_LINEAR, G726_PACKING_NONE); s->munging_codec = MUNGE_CODEC_G726_32K; break; case MUNGE_CODEC_G726_16K: g726_init(&s->g726_enc_state, 16000, G726_ENCODING_LINEAR, G726_PACKING_NONE); g726_init(&s->g726_dec_state, 16000, G726_ENCODING_LINEAR, G726_PACKING_NONE); s->munging_codec = MUNGE_CODEC_G726_32K; break; default: s->munging_codec = codec; break; } s->sequence = 0; s->rbs_pattern = info; } return s; } /*- End of function --------------------------------------------------------*/ void codec_munge_release(codec_munge_state_t *s) { free(s); } /*- End of function --------------------------------------------------------*/ void codec_munge(codec_munge_state_t *s, int16_t amp[], int len) { uint8_t law; uint8_t adpcmdata[160]; int i; int adpcm; int x; switch (s->munging_codec) { case MUNGE_CODEC_NONE: /* Do nothing */ break; case MUNGE_CODEC_ALAW: for (i = 0; i < len; i++) { law = linear_to_alaw(amp[i]); amp[i] = alaw_to_linear(law); } break; case MUNGE_CODEC_ULAW: for (i = 0; i < len; i++) { law = linear_to_ulaw(amp[i]); if (s->rbs_pattern & (1 << s->sequence)) { /* Strip the bottom bit at the RBS rate */ law &= 0xFE; } amp[i] = ulaw_to_linear(law); } break; case MUNGE_CODEC_G726_32K: /* This could actually be any of the G.726 rates */ for (i = 0; i < len; i += x) { x = (len - i >= 160) ? 160 : (len - i); adpcm = g726_encode(&s->g726_enc_state, adpcmdata, amp + i, x); g726_decode(&s->g726_dec_state, amp + i, adpcmdata, adpcm); } break; } } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/spandsp-sim/rfc2198_sim.c0000644000175000017500000001224211150047216021437 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * rfc2198_sim.c - Simulate the behaviour of RFC2198 (or UDPTL) redundancy. * * Written by Steve Underwood * * Copyright (C) 2007 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2, as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: rfc2198_sim.c,v 1.6 2008/07/02 14:48:25 steveu Exp $ */ #if defined(HAVE_CONFIG_H) #include "config.h" #endif #include #include #include #include #include #include #include #include #include "floating_fudge.h" #if defined(HAVE_TGMATH_H) #include #endif #if defined(HAVE_MATH_H) #define GEN_CONST #include #endif #include "spandsp.h" #include "spandsp/g1050.h" #include "spandsp/rfc2198_sim.h" #define PACKET_LOSS_TIME -1 #define FALSE 0 #define TRUE (!FALSE) rfc2198_sim_state_t *rfc2198_sim_init(int model, int speed_pattern, int packet_size, int packet_rate, int redundancy_depth) { rfc2198_sim_state_t *s; if ((s = (rfc2198_sim_state_t *) malloc(sizeof(*s))) == NULL) return NULL; memset(s, 0, sizeof(*s)); s->g1050 = g1050_init(model, speed_pattern, packet_size, packet_rate); s->redundancy_depth = redundancy_depth; return s; } /*- End of function --------------------------------------------------------*/ int rfc2198_sim_put(rfc2198_sim_state_t *s, const uint8_t buf[], int len, int seq_no, double departure_time) { uint8_t buf2[8192]; uint8_t *p; uint16_t *q; int slot; int i; /* Save the packet in the history buffer */ memcpy(s->tx_pkt[s->next_pkt], buf, len); s->tx_pkt_len[s->next_pkt] = len; s->tx_pkt_seq_no[s->next_pkt] = seq_no; /* Construct the redundant packet */ p = buf2; slot = s->next_pkt; q = (uint16_t *) p; *q = s->redundancy_depth; p += sizeof(uint16_t); for (i = 0; i < s->redundancy_depth; i++) { q = (uint16_t *) p; *q = s->tx_pkt_len[slot]; p += sizeof(uint16_t); memcpy(p, s->tx_pkt[slot], s->tx_pkt_len[slot]); p += s->tx_pkt_len[slot]; slot = (slot - 1) & 0x1F; } s->next_pkt = (s->next_pkt + 1) & 0x1F; return g1050_put(s->g1050, buf2, p - buf2, seq_no, departure_time); } /*- End of function --------------------------------------------------------*/ int rfc2198_sim_get(rfc2198_sim_state_t *s, uint8_t buf[], int max_len, double current_time, int *seq_no, double *departure_time, double *arrival_time) { int len; int lenx; int seq_nox; int i; uint8_t bufx[s->redundancy_depth*1024]; uint8_t *p; uint16_t *q; int redundancy_depth; if (s->rx_queued_pkts) { /* We have some stuff from the last g1050_get() still to deliver */ s->rx_queued_pkts--; memcpy(buf, s->rx_pkt[s->rx_queued_pkts], s->rx_pkt_len[s->rx_queued_pkts]); *seq_no = s->rx_pkt_seq_no[s->rx_queued_pkts]; return s->rx_pkt_len[s->rx_queued_pkts]; } len = g1050_get(s->g1050, bufx, s->redundancy_depth*1024, current_time, &seq_nox, departure_time, arrival_time); if (len > 0) { p = bufx; q = (uint16_t *) p; redundancy_depth = *q; p += sizeof(uint16_t); i = 0; if (seq_nox > s->next_seq_no) { /* Some stuff is missing. Try to fill it in. */ s->rx_queued_pkts = seq_nox - s->next_seq_no; if (s->rx_queued_pkts >= redundancy_depth) s->rx_queued_pkts = redundancy_depth - 1; for (i = 0; i < s->rx_queued_pkts; i++) { q = (uint16_t *) p; s->rx_pkt_len[i] = *q; p += sizeof(uint16_t); memcpy(s->rx_pkt[i], p, s->rx_pkt_len[i]); s->rx_pkt_seq_no[i] = seq_nox - i; p += s->rx_pkt_len[i]; } } *seq_no = seq_nox - i; q = (uint16_t *) p; lenx = *q; p += sizeof(uint16_t); memcpy(buf, p, lenx); s->next_seq_no = seq_nox + 1; } else { lenx = len; } return lenx; } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/spandsp-sim/g1050.c0000644000175000017500000016543211150047216020237 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * g1050.c - IP network modeling, as per G.1050/TIA-921. * * Written by Steve Underwood * * Copyright (C) 2007 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2, as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: g1050.c,v 1.10 2008/07/02 14:48:25 steveu Exp $ */ #if defined(HAVE_CONFIG_H) #include "config.h" #endif #include #include #include #include #include #include #include #include #include "floating_fudge.h" #if defined(HAVE_TGMATH_H) #include #endif #if defined(HAVE_MATH_H) #define GEN_CONST #include #endif #include "spandsp.h" #include "spandsp/g1050.h" #define PACKET_LOSS_TIME -1 #define FALSE 0 #define TRUE (!FALSE) g1050_constants_t g1050_constants[1] = { { { { /* Side A LAN */ { 0.004, /*! Probability of loss rate change low->high */ 0.1 /*! Probability of loss rate change high->low */ }, { { 0.0, /*! Probability of an impulse */ 0.0, }, { 0.5, 0.0 } }, 1.0, /*! Impulse height, based on MTU and bit rate */ 0.0, /*! Impulse decay coefficient */ 0.001, /*! Probability of packet loss due to occupancy. */ 0.15 /*! Probability of packet loss due to a multiple access collision. */ }, { /* Side A access link */ { 0.0002, /*! Probability of loss rate change low->high */ 0.2 /*! Probability of loss rate change high->low */ }, { { 0.001, /*! Probability of an impulse */ 0.0, }, { 0.3, 0.4 } }, 40.0, /*! Impulse height, based on MTU and bit rate */ 0.75, /*! Impulse decay coefficient */ 0.0005, /*! Probability of packet loss due to occupancy. */ 0.0 /*! Probability of packet loss due to a multiple access collision. */ }, { /* Side B access link */ { 0.0002, /*! Probability of loss rate change low->high */ 0.2 /*! Probability of loss rate change high->low */ }, { { 0.001, /*! Probability of an impulse */ 0.0, }, { 0.3, 0.4 } }, 40.0, /*! Impulse height, based on MTU and bit rate */ 0.75, /*! Impulse decay coefficient */ 0.0005, /*! Probability of packet loss due to occupancy. */ 0.0 /*! Probability of packet loss due to a multiple access collision. */ }, { /* Side B LAN */ { 0.004, /*! Probability of loss rate change low->high */ 0.1 /*! Probability of loss rate change high->low */ }, { { 0.0, /*! Probability of an impulse */ 0.0, }, { 0.5, 0.0 } }, 1.0, /*! Impulse height, based on MTU and bit rate */ 0.0, /*! Impulse decay coefficient */ 0.001, /*! Probability of packet loss due to occupancy. */ 0.15 /*! Probability of packet loss due to a multiple access collision. */ } } } }; g1050_channel_speeds_t g1050_speed_patterns[133] = { { 4000000, 0, 128000, 768000, 0, 4000000, 0, 128000, 768000, 0, 2.2500}, { 4000000, 0, 128000, 768000, 0, 20000000, 0, 128000, 768000, 0, 1.5000}, { 20000000, 0, 128000, 768000, 0, 20000000, 0, 128000, 768000, 0, 0.2500}, { 4000000, 0, 128000, 1536000, 0, 4000000, 0, 384000, 768000, 0, 3.4125}, { 4000000, 0, 128000, 1536000, 0, 20000000, 0, 384000, 768000, 0, 2.6750}, { 20000000, 0, 128000, 1536000, 0, 20000000, 0, 384000, 768000, 0, 0.5125}, { 4000000, 0, 128000, 3000000, 0, 4000000, 0, 384000, 768000, 0, 0.7875}, { 4000000, 0, 128000, 3000000, 0, 20000000, 0, 384000, 768000, 0, 0.6750}, { 20000000, 0, 128000, 3000000, 0, 20000000, 0, 384000, 768000, 0, 0.1375}, { 4000000, 0, 384000, 768000, 0, 4000000, 0, 128000, 1536000, 0, 3.4125}, { 4000000, 0, 384000, 768000, 0, 20000000, 0, 128000, 1536000, 0, 2.6750}, { 20000000, 0, 384000, 768000, 0, 20000000, 0, 128000, 1536000, 0, 0.5125}, { 4000000, 0, 384000, 1536000, 0, 4000000, 0, 384000, 1536000, 0, 5.1756}, { 4000000, 0, 384000, 1536000, 0, 20000000, 0, 384000, 1536000, 0, 4.6638}, { 20000000, 0, 384000, 1536000, 0, 20000000, 0, 384000, 1536000, 0, 1.0506}, { 4000000, 0, 384000, 3000000, 0, 4000000, 0, 384000, 1536000, 0, 1.1944}, { 4000000, 0, 384000, 3000000, 0, 20000000, 0, 384000, 1536000, 0, 1.1638}, { 20000000, 0, 384000, 3000000, 0, 20000000, 0, 384000, 1536000, 0, 0.2819}, { 4000000, 0, 384000, 768000, 0, 4000000, 0, 128000, 3000000, 0, 0.7875}, { 4000000, 0, 384000, 768000, 0, 20000000, 0, 128000, 3000000, 0, 0.6750}, { 20000000, 0, 384000, 768000, 0, 20000000, 0, 128000, 3000000, 0, 0.1375}, { 4000000, 0, 384000, 1536000, 0, 4000000, 0, 384000, 3000000, 0, 1.1944}, { 4000000, 0, 384000, 1536000, 0, 20000000, 0, 384000, 3000000, 0, 1.1638}, { 20000000, 0, 384000, 1536000, 0, 20000000, 0, 384000, 3000000, 0, 0.2819}, { 4000000, 0, 384000, 3000000, 0, 4000000, 0, 384000, 3000000, 0, 0.2756}, { 4000000, 0, 384000, 3000000, 0, 20000000, 0, 384000, 3000000, 0, 0.2888}, { 20000000, 0, 384000, 3000000, 0, 20000000, 0, 384000, 3000000, 0, 0.0756}, { 4000000, 0, 128000, 1536000, 0, 100000000, 0, 384000, 768000, 0, 1.8000}, { 20000000, 0, 128000, 1536000, 0, 100000000, 0, 384000, 768000, 0, 0.6000}, { 4000000, 0, 128000, 3000000, 0, 100000000, 0, 384000, 768000, 0, 0.6750}, { 20000000, 0, 128000, 3000000, 0, 100000000, 0, 384000, 768000, 0, 0.2250}, { 4000000, 0, 128000, 1536000, 0, 4000000, 0, 768000, 1536000, 0, 0.6000}, { 4000000, 0, 128000, 1536000, 0, 20000000, 0, 768000, 1536000, 0, 0.8000}, { 4000000, 0, 128000, 1536000, 0, 100000000, 0, 768000, 1536000, 0, 1.8000}, { 20000000, 0, 128000, 1536000, 0, 20000000, 0, 768000, 1536000, 0, 0.2000}, { 20000000, 0, 128000, 1536000, 0, 100000000, 0, 768000, 1536000, 0, 0.6000}, { 4000000, 0, 128000, 43000000, 0, 4000000, 0, 768000, 43000000, 0, 0.0750}, { 4000000, 0, 128000, 43000000, 0, 20000000, 0, 768000, 43000000, 0, 0.1000}, { 4000000, 0, 128000, 43000000, 0, 100000000, 0, 768000, 43000000, 0, 0.2250}, { 20000000, 0, 128000, 43000000, 0, 20000000, 0, 768000, 43000000, 0, 0.0250}, { 20000000, 0, 128000, 43000000, 0, 100000000, 0, 768000, 43000000, 0, 0.0750}, { 4000000, 0, 384000, 1536000, 0, 100000000, 0, 384000, 1536000, 0, 5.4600}, { 20000000, 0, 384000, 1536000, 0, 100000000, 0, 384000, 1536000, 0, 2.4600}, { 4000000, 0, 384000, 3000000, 0, 100000000, 0, 384000, 1536000, 0, 1.6538}, { 20000000, 0, 384000, 3000000, 0, 100000000, 0, 384000, 1536000, 0, 0.7913}, { 4000000, 0, 384000, 1536000, 0, 4000000, 0, 1536000, 1536000, 0, 0.9100}, { 4000000, 0, 384000, 1536000, 0, 20000000, 0, 1536000, 1536000, 0, 1.3200}, { 4000000, 0, 384000, 1536000, 0, 100000000, 0, 1536000, 1536000, 0, 3.2100}, { 20000000, 0, 384000, 1536000, 0, 20000000, 0, 1536000, 1536000, 0, 0.4100}, { 20000000, 0, 384000, 1536000, 0, 100000000, 0, 1536000, 1536000, 0, 1.7100}, { 4000000, 0, 384000, 43000000, 0, 4000000, 0, 1536000, 43000000, 0, 0.1138}, { 4000000, 0, 384000, 43000000, 0, 20000000, 0, 1536000, 43000000, 0, 0.1650}, { 4000000, 0, 384000, 43000000, 0, 100000000, 0, 1536000, 43000000, 0, 0.4013}, { 20000000, 0, 384000, 43000000, 0, 20000000, 0, 1536000, 43000000, 0, 0.0513}, { 20000000, 0, 384000, 43000000, 0, 100000000, 0, 1536000, 43000000, 0, 0.2138}, { 4000000, 0, 384000, 1536000, 0, 100000000, 0, 384000, 3000000, 0, 1.6538}, { 20000000, 0, 384000, 1536000, 0, 100000000, 0, 384000, 3000000, 0, 0.7913}, { 4000000, 0, 384000, 3000000, 0, 100000000, 0, 384000, 3000000, 0, 0.4725}, { 20000000, 0, 384000, 3000000, 0, 100000000, 0, 384000, 3000000, 0, 0.2475}, { 4000000, 0, 384000, 1536000, 0, 4000000, 0, 1536000, 3000000, 0, 0.2100}, { 4000000, 0, 384000, 1536000, 0, 20000000, 0, 1536000, 3000000, 0, 0.3200}, { 4000000, 0, 384000, 1536000, 0, 100000000, 0, 1536000, 3000000, 0, 0.8100}, { 20000000, 0, 384000, 1536000, 0, 20000000, 0, 1536000, 3000000, 0, 0.1100}, { 20000000, 0, 384000, 1536000, 0, 100000000, 0, 1536000, 3000000, 0, 0.5100}, { 4000000, 0, 384000, 43000000, 0, 4000000, 0, 3000000, 43000000, 0, 0.0263}, { 4000000, 0, 384000, 43000000, 0, 20000000, 0, 3000000, 43000000, 0, 0.0400}, { 4000000, 0, 384000, 43000000, 0, 100000000, 0, 3000000, 43000000, 0, 0.1013}, { 20000000, 0, 384000, 43000000, 0, 20000000, 0, 3000000, 43000000, 0, 0.0138}, { 20000000, 0, 384000, 43000000, 0, 100000000, 0, 3000000, 43000000, 0, 0.0638}, { 4000000, 0, 384000, 768000, 0, 100000000, 0, 128000, 1536000, 0, 1.8000}, { 20000000, 0, 384000, 768000, 0, 100000000, 0, 128000, 1536000, 0, 0.6000}, { 4000000, 0, 384000, 768000, 0, 100000000, 0, 128000, 3000000, 0, 0.6750}, { 20000000, 0, 384000, 768000, 0, 100000000, 0, 128000, 3000000, 0, 0.2250}, { 4000000, 0, 768000, 1536000, 0, 4000000, 0, 128000, 1536000, 0, 0.6000}, { 4000000, 0, 768000, 1536000, 0, 20000000, 0, 128000, 1536000, 0, 0.8000}, { 20000000, 0, 768000, 1536000, 0, 20000000, 0, 128000, 1536000, 0, 0.2000}, { 4000000, 0, 768000, 1536000, 0, 100000000, 0, 128000, 1536000, 0, 1.8000}, { 20000000, 0, 768000, 1536000, 0, 100000000, 0, 128000, 1536000, 0, 0.6000}, { 4000000, 0, 1536000, 1536000, 0, 4000000, 0, 384000, 1536000, 0, 0.9100}, { 4000000, 0, 1536000, 1536000, 0, 20000000, 0, 384000, 1536000, 0, 1.3200}, { 20000000, 0, 1536000, 1536000, 0, 20000000, 0, 384000, 1536000, 0, 0.4100}, { 4000000, 0, 1536000, 1536000, 0, 100000000, 0, 384000, 1536000, 0, 3.2100}, { 20000000, 0, 1536000, 1536000, 0, 100000000, 0, 384000, 1536000, 0, 1.7100}, { 4000000, 0, 1536000, 3000000, 0, 4000000, 0, 384000, 1536000, 0, 0.2100}, { 4000000, 0, 1536000, 3000000, 0, 20000000, 0, 384000, 1536000, 0, 0.3200}, { 20000000, 0, 1536000, 3000000, 0, 20000000, 0, 384000, 1536000, 0, 0.1100}, { 4000000, 0, 1536000, 3000000, 0, 100000000, 0, 384000, 1536000, 0, 0.8100}, { 20000000, 0, 1536000, 3000000, 0, 100000000, 0, 384000, 1536000, 0, 0.5100}, { 4000000, 0, 768000, 43000000, 0, 4000000, 0, 128000, 43000000, 0, 0.0750}, { 4000000, 0, 768000, 43000000, 0, 20000000, 0, 128000, 43000000, 0, 0.1000}, { 20000000, 0, 768000, 43000000, 0, 20000000, 0, 128000, 43000000, 0, 0.0250}, { 4000000, 0, 768000, 43000000, 0, 100000000, 0, 128000, 43000000, 0, 0.2250}, { 20000000, 0, 768000, 43000000, 0, 100000000, 0, 128000, 43000000, 0, 0.0750}, { 4000000, 0, 1536000, 43000000, 0, 4000000, 0, 384000, 43000000, 0, 0.1138}, { 4000000, 0, 1536000, 43000000, 0, 20000000, 0, 384000, 43000000, 0, 0.1650}, { 20000000, 0, 1536000, 43000000, 0, 20000000, 0, 384000, 43000000, 0, 0.0513}, { 4000000, 0, 1536000, 43000000, 0, 100000000, 0, 384000, 43000000, 0, 0.4013}, { 20000000, 0, 1536000, 43000000, 0, 100000000, 0, 384000, 43000000, 0, 0.2138}, { 4000000, 0, 3000000, 43000000, 0, 4000000, 0, 384000, 43000000, 0, 0.0263}, { 4000000, 0, 3000000, 43000000, 0, 20000000, 0, 384000, 43000000, 0, 0.0400}, { 20000000, 0, 3000000, 43000000, 0, 20000000, 0, 384000, 43000000, 0, 0.0138}, { 4000000, 0, 3000000, 43000000, 0, 100000000, 0, 384000, 43000000, 0, 0.1013}, { 20000000, 0, 3000000, 43000000, 0, 100000000, 0, 384000, 43000000, 0, 0.0638}, {100000000, 0, 384000, 1536000, 0, 100000000, 0, 384000, 1536000, 0, 1.4400}, {100000000, 0, 384000, 3000000, 0, 100000000, 0, 384000, 1536000, 0, 0.5400}, {100000000, 0, 384000, 1536000, 0, 100000000, 0, 1536000, 1536000, 0, 1.4400}, {100000000, 0, 384000, 43000000, 0, 100000000, 0, 1536000, 43000000, 0, 0.1800}, {100000000, 0, 384000, 1536000, 0, 100000000, 0, 384000, 3000000, 0, 0.5400}, {100000000, 0, 384000, 3000000, 0, 100000000, 0, 384000, 3000000, 0, 0.2025}, {100000000, 0, 384000, 1536000, 0, 100000000, 0, 1536000, 3000000, 0, 0.5400}, {100000000, 0, 384000, 43000000, 0, 100000000, 0, 3000000, 43000000, 0, 0.0675}, {100000000, 0, 1536000, 1536000, 0, 100000000, 0, 384000, 1536000, 0, 1.4400}, {100000000, 0, 1536000, 3000000, 0, 100000000, 0, 384000, 1536000, 0, 0.5400}, { 4000000, 0, 1536000, 1536000, 0, 4000000, 0, 1536000, 1536000, 0, 0.1600}, { 4000000, 0, 1536000, 1536000, 0, 20000000, 0, 1536000, 1536000, 0, 0.3200}, { 4000000, 0, 1536000, 1536000, 0, 100000000, 0, 1536000, 1536000, 0, 0.9600}, { 20000000, 0, 1536000, 1536000, 0, 20000000, 0, 1536000, 1536000, 0, 0.1600}, { 20000000, 0, 1536000, 1536000, 0, 100000000, 0, 1536000, 1536000, 0, 0.9600}, {100000000, 0, 1536000, 1536000, 0, 100000000, 0, 1536000, 1536000, 0, 1.4400}, { 4000000, 0, 1536000, 43000000, 0, 4000000, 0, 1536000, 43000000, 0, 0.0400}, { 4000000, 0, 1536000, 43000000, 0, 20000000, 0, 1536000, 43000000, 0, 0.0800}, { 4000000, 0, 1536000, 43000000, 0, 100000000, 0, 1536000, 43000000, 0, 0.2400}, { 20000000, 0, 1536000, 43000000, 0, 20000000, 0, 1536000, 43000000, 0, 0.0400}, { 20000000, 0, 1536000, 43000000, 0, 100000000, 0, 1536000, 43000000, 0, 0.2400}, {100000000, 0, 1536000, 43000000, 0, 100000000, 0, 1536000, 43000000, 0, 0.3600}, {100000000, 0, 1536000, 43000000, 0, 100000000, 0, 384000, 43000000, 0, 0.1800}, {100000000, 0, 3000000, 43000000, 0, 100000000, 0, 384000, 43000000, 0, 0.0675}, { 4000000, 0, 43000000, 43000000, 0, 4000000, 0, 43000000, 43000000, 0, 0.0025}, { 4000000, 0, 43000000, 43000000, 0, 20000000, 0, 43000000, 43000000, 0, 0.0050}, { 4000000, 0, 43000000, 43000000, 0, 100000000, 0, 43000000, 43000000, 0, 0.0150}, { 20000000, 0, 43000000, 43000000, 0, 20000000, 0, 43000000, 43000000, 0, 0.0025}, { 20000000, 0, 43000000, 43000000, 0, 100000000, 0, 43000000, 43000000, 0, 0.0150}, {100000000, 0, 43000000, 43000000, 0, 100000000, 0, 43000000, 43000000, 0, 0.0225} }; g1050_model_t g1050_standard_models[9] = { { /* Severity 0 - no impairment */ { 0, /*! Percentage likelihood of occurance in scenario A */ 0, /*! Percentage likelihood of occurance in scenario B */ 0, /*! Percentage likelihood of occurance in scenario C */ }, { 0.0, /*! Percentage occupancy */ 1508, /*! MTU */ 0.0 /*! Peak jitter */ }, { 0.0, /*! Percentage occupancy */ 512, /*! MTU */ 0.0 /*! Peak jitter */ }, { 0.0, /*! Basic delay of the regional backbone, in seconds */ 0.0, /*! Basic delay of the intercontinental backbone, in seconds */ 0.0, /*! Percentage packet loss of the backbone */ 0.0, /*! Maximum jitter of the backbone, in seconds */ 0.0, /*! Interval between the backbone route flapping between two paths, in seconds */ 0.0, /*! The difference in backbone delay between the two routes we flap between, in seconds */ 0.0, /*! The interval between link failures, in seconds */ 0.0, /*! The duration of link failures, in seconds */ 0.0, /*! Probability of packet loss in the backbone, in percent */ 0.0 /*! Probability of a packet going out of sequence in the backbone. */ }, { 0.0, /*! Percentage occupancy */ 512, /*! MTU */ 0.0 /*! Peak jitter */ }, { 0.0, /*! Percentage occupancy */ 1508, /*! MTU */ 0.0 /*! Peak jitter */ } }, { /* Severity A */ { 50, /*! Percentage likelihood of occurance in scenario A */ 5, /*! Percentage likelihood of occurance in scenario B */ 5, /*! Percentage likelihood of occurance in scenario C */ }, { 1.0, /*! Percentage occupancy */ 1508, /*! MTU */ 0.0015 /*! Peak jitter */ }, { 0.0, /*! Percentage occupancy */ 512, /*! MTU */ 0.0 /*! Peak jitter */ }, { 0.004, /*! Basic delay of the regional backbone, in seconds */ 0.016, /*! Basic delay of the intercontinental backbone, in seconds */ 0.0, /*! Percentage packet loss of the backbone */ 0.005, /*! Maximum jitter of the backbone, in seconds */ 0.0, /*! Interval between the backbone route flapping between two paths, in seconds */ 0.0, /*! The difference in backbone delay between the two routes we flap between, in seconds */ 0.0, /*! The interval between link failures, in seconds */ 0.0, /*! The duration of link failures, in seconds */ 0.0, /*! Probability of packet loss in the backbone, in percent */ 0.0 /*! Probability of a packet going out of sequence in the backbone. */ }, { 0.0, /*! Percentage occupancy */ 512, /*! MTU */ 0.0 /*! Peak jitter */ }, { 1.0, /*! Percentage occupancy */ 1508, /*! MTU */ 0.0015 /*! Peak jitter */ } }, { /* Severity B */ { 30, /*! Percentage likelihood of occurance in scenario A */ 25, /*! Percentage likelihood of occurance in scenario B */ 5, /*! Percentage likelihood of occurance in scenario C */ }, { 2.0, /*! Percentage occupancy */ 1508, /*! MTU */ 0.0015 /*! Peak jitter */ }, { 1.0, /*! Percentage occupancy */ 512, /*! MTU */ 0.0 /*! Peak jitter */ }, { 0.008, /*! Basic delay of the regional backbone, in seconds */ 0.032, /*! Basic delay of the intercontinental backbone, in seconds */ 0.01, /*! Percentage packet loss of the backbone */ 0.01, /*! Maximum jitter of the backbone, in seconds */ 3600.0, /*! Interval between the backbone route flapping between two paths, in seconds */ 0.002, /*! The difference in backbone delay between the two routes we flap between, in seconds */ 3600.0, /*! The interval between link failures, in seconds */ 0.064, /*! The duration of link failures, in seconds */ 0.0, /*! Probability of packet loss in the backbone, in percent */ 0.0 /*! Probability of a packet going out of sequence in the backbone. */ }, { 1.0, /*! Percentage occupancy */ 512, /*! MTU */ 0.0 /*! Peak jitter */ }, { 2.0, /*! Percentage occupancy */ 1508, /*! MTU */ 0.0015 /*! Peak jitter */ } }, { /* Severity C */ { 15, /*! Percentage likelihood of occurance in scenario A */ 30, /*! Percentage likelihood of occurance in scenario B */ 10, /*! Percentage likelihood of occurance in scenario C */ }, { 3.0, /*! Percentage occupancy */ 1508, /*! MTU */ 0.0015 /*! Peak jitter */ }, { 2.0, /*! Percentage occupancy */ 1508, /*! MTU */ 0.0 /*! Peak jitter */ }, { 0.016, /*! Basic delay of the regional backbone, in seconds */ 0.064, /*! Basic delay of the intercontinental backbone, in seconds */ 0.02, /*! Percentage packet loss of the backbone */ 0.016, /*! Maximum jitter of the backbone, in seconds */ 1800.0, /*! Interval between the backbone route flapping between two paths, in seconds */ 0.004, /*! The difference in backbone delay between the two routes we flap between, in seconds */ 1800.0, /*! The interval between link failures, in seconds */ 0.128, /*! The duration of link failures, in seconds */ 0.0, /*! Probability of packet loss in the backbone, in percent */ 0.0 /*! Probability of a packet going out of sequence in the backbone. */ }, { 2.0, /*! Percentage occupancy */ 1508, /*! MTU */ 0.0 /*! Peak jitter */ }, { 3.0, /*! Percentage occupancy */ 1508, /*! MTU */ 0.0015 /*! Peak jitter */ } }, { /* Severity D */ { 5, /*! Percentage likelihood of occurance in scenario A */ 25, /*! Percentage likelihood of occurance in scenario B */ 15, /*! Percentage likelihood of occurance in scenario C */ }, { 5.0, /*! Percentage occupancy */ 1508, /*! MTU */ 0.0015 /*! Peak jitter */ }, { 4.0, /*! Percentage occupancy */ 1508, /*! MTU */ 0.0 /*! Peak jitter */ }, { 0.032, /*! Basic delay of the regional backbone, in seconds */ 0.128, /*! Basic delay of the intercontinental backbone, in seconds */ 0.04, /*! Percentage packet loss of the backbone */ 0.04, /*! Maximum jitter of the backbone, in seconds */ 900.0, /*! Interval between the backbone route flapping between two paths, in seconds */ 0.008, /*! The difference in backbone delay between the two routes we flap between, in seconds */ 900.0, /*! The interval between link failures, in seconds */ 0.256, /*! The duration of link failures, in seconds */ 0.0, /*! Probability of packet loss in the backbone, in percent */ 0.0 /*! Probability of a packet going out of sequence in the backbone. */ }, { 4.0, /*! Percentage occupancy */ 1508, /*! MTU */ 0.0 /*! Peak jitter */ }, { 5.0, /*! Percentage occupancy */ 1508, /*! MTU */ 0.0015 /*! Peak jitter */ } }, { /* Severity E */ { 0, /*! Percentage likelihood of occurance in scenario A */ 10, /*! Percentage likelihood of occurance in scenario B */ 20, /*! Percentage likelihood of occurance in scenario C */ }, { 8.0, /*! Percentage occupancy */ 1508, /*! MTU */ 0.0015 /*! Peak jitter */ }, { 8.0, /*! Percentage occupancy */ 1508, /*! MTU */ 0.0 /*! Peak jitter */ }, { 0.064, /*! Basic delay of the regional backbone, in seconds */ 0.196, /*! Basic delay of the intercontinental backbone, in seconds */ 0.1, /*! Percentage packet loss of the backbone */ 0.07, /*! Maximum jitter of the backbone, in seconds */ 480.0, /*! Interval between the backbone route flapping between two paths, in seconds */ 0.016, /*! The difference in backbone delay between the two routes we flap between, in seconds */ 480.0, /*! The interval between link failures, in seconds */ 0.4, /*! The duration of link failures, in seconds */ 0.0, /*! Probability of packet loss in the backbone, in percent */ 0.0 /*! Probability of a packet going out of sequence in the backbone. */ }, { 8.0, /*! Percentage occupancy */ 1508, /*! MTU */ 0.0 /*! Peak jitter */ }, { 8.0, /*! Percentage occupancy */ 1508, /*! MTU */ 0.0015 /*! Peak jitter */ } }, { /* Severity F */ { 0, /*! Percentage likelihood of occurance in scenario A */ 0, /*! Percentage likelihood of occurance in scenario B */ 25, /*! Percentage likelihood of occurance in scenario C */ }, { 12.0, /*! Percentage occupancy */ 1508, /*! MTU */ 0.0015 /*! Peak jitter */ }, { 15.0, /*! Percentage occupancy */ 1508, /*! MTU */ 0.0 /*! Peak jitter */ }, { 0.128, /*! Basic delay of the regional backbone, in seconds */ 0.256, /*! Basic delay of the intercontinental backbone, in seconds */ 0.2, /*! Percentage packet loss of the backbone */ 0.1, /*! Maximum jitter of the backbone, in seconds */ 240.0, /*! Interval between the backbone route flapping between two paths, in seconds */ 0.032, /*! The difference in backbone delay between the two routes we flap between, in seconds */ 240.0, /*! The interval between link failures, in seconds */ 0.8, /*! The duration of link failures, in seconds */ 0.0, /*! Probability of packet loss in the backbone, in percent */ 0.0 /*! Probability of a packet going out of sequence in the backbone. */ }, { 15.0, /*! Percentage occupancy */ 1508, /*! MTU */ 0.0 /*! Peak jitter */ }, { 12.0, /*! Percentage occupancy */ 1508, /*! MTU */ 0.0015 /*! Peak jitter */ } }, { /* Severity G */ { 0, /*! Percentage likelihood of occurance in scenario A */ 0, /*! Percentage likelihood of occurance in scenario B */ 15, /*! Percentage likelihood of occurance in scenario C */ }, { 16.0, /*! Percentage occupancy */ 1508, /*! MTU */ 0.0015 /*! Peak jitter */ }, { 30.0, /*! Percentage occupancy */ 1508, /*! MTU */ 0.0 /*! Peak jitter */ }, { 0.256, /*! Basic delay of the regional backbone, in seconds */ 0.512, /*! Basic delay of the intercontinental backbone, in seconds */ 0.5, /*! Percentage packet loss of the backbone */ 0.15, /*! Maximum jitter of the backbone, in seconds */ 120.0, /*! Interval between the backbone route flapping between two paths, in seconds */ 0.064, /*! The difference in backbone delay between the two routes we flap between, in seconds */ 120.0, /*! The interval between link failures, in seconds */ 1.6, /*! The duration of link failures, in seconds */ 0.0, /*! Probability of packet loss in the backbone, in percent */ 0.0 /*! Probability of a packet going out of sequence in the backbone. */ }, { 30.0, /*! Percentage occupancy */ 1508, /*! MTU */ 0.0 /*! Peak jitter */ }, { 16.0, /*! Percentage occupancy */ 1508, /*! MTU */ 0.0015 /*! Peak jitter */ } }, { /* Severity H */ { 0, /*! Percentage likelihood of occurance in scenario A */ 0, /*! Percentage likelihood of occurance in scenario B */ 5, /*! Percentage likelihood of occurance in scenario C */ }, { 20.0, /*! Percentage occupancy */ 1508, /*! MTU */ 0.0015 /*! Peak jitter */ }, { 50.0, /*! Percentage occupancy */ 1508, /*! MTU */ 0.0 /*! Peak jitter */ }, { 0.512, /*! Basic delay of the regional backbone, in seconds */ 0.768, /*! Basic delay of the intercontinental backbone, in seconds */ 1.0, /*! Percentage packet loss of the backbone */ 0.5, /*! Maximum jitter of the backbone, in seconds */ 60.0, /*! Interval between the backbone route flapping between two paths, in seconds */ 0.128, /*! The difference in backbone delay between the two routes we flap between, in seconds */ 60.0, /*! The interval between link failures, in seconds */ 3.0, /*! The duration of link failures, in seconds */ 1.0, /*! Probability of packet loss in the backbone, in percent */ 1.0 /*! Probability of a packet going out of sequence in the backbone. */ }, { 50.0, /*! Percentage occupancy */ 1508, /*! MTU */ 0.0 /*! Peak jitter */ }, { 20.0, /*! Percentage occupancy */ 1508, /*! MTU */ 0.0015 /*! Peak jitter */ } } }; static __inline__ double q1050_rand(void) { return drand48(); } /*- End of function --------------------------------------------------------*/ static __inline__ double scale_probability(double prob, double scale) { /* Re-calculate probability based on a different time interval */ return 1.0 - pow(1.0 - prob, scale); } /*- End of function --------------------------------------------------------*/ static void g1050_segment_init(g1050_segment_state_t *s, int link_type, g1050_segment_constants_t *constants, g1050_segment_model_t *parms, int bit_rate, int multiple_access, int qos_enabled, int packet_size, int packet_rate) { double x; double packet_interval; memset(s, 0, sizeof(*s)); packet_interval = 1000.0/packet_rate; /* Some calculatons are common to both LAN and access links, and those that are not. */ s->link_type = link_type; s->prob_loss_rate_change[0] = scale_probability(constants->prob_loss_rate_change[0]*parms->percentage_occupancy, 1.0/packet_interval); s->serial_delay = packet_size*8.0/bit_rate; if (link_type == G1050_LAN_LINK) { s->prob_loss_rate_change[1] = scale_probability(constants->prob_loss_rate_change[1], 1.0/packet_interval); s->prob_impulse[0] = constants->prob_impulse[0][0]; s->prob_impulse[1] = constants->prob_impulse[1][0]; s->impulse_coeff = constants->impulse_coeff; s->impulse_height = parms->mtu*(8.0/bit_rate)*(1.0 + parms->percentage_occupancy/constants->impulse_height); } else if (link_type == G1050_ACCESS_LINK) { s->prob_loss_rate_change[1] = scale_probability(constants->prob_loss_rate_change[1]/(1.0 + parms->percentage_occupancy), 1.0/packet_interval); s->prob_impulse[0] = scale_probability(constants->prob_impulse[0][0] + (parms->percentage_occupancy/2000.0), 1.0/packet_interval); s->prob_impulse[1] = scale_probability(constants->prob_impulse[1][0] + (constants->prob_impulse[1][1]*parms->percentage_occupancy/100.0), 1.0/packet_interval); s->impulse_coeff = 1.0 - scale_probability(1.0 - constants->impulse_coeff, 1.0/packet_interval); x = (1.0 - constants->impulse_coeff)/(1.0 - s->impulse_coeff); s->impulse_height = x*parms->mtu*(8.0/bit_rate)*(1.0 + parms->percentage_occupancy/constants->impulse_height); } /* The following are calculated the same way for LAN and access links */ s->prob_packet_loss = constants->prob_packet_loss*parms->percentage_occupancy; s->qos_enabled = qos_enabled; s->multiple_access = multiple_access; s->prob_packet_collision_loss = constants->prob_packet_collision_loss; s->max_jitter = parms->max_jitter; /* The following is common state information to all links. */ s->high_loss = FALSE; s->congestion_delay = 0.0; s->last_arrival_time = 0.0; /* Count of packets lost in this segment. */ s->lost_packets = 0; s->lost_packets_2 = 0; } /*- End of function --------------------------------------------------------*/ static void g1050_core_init(g1050_core_state_t *s, g1050_core_model_t *parms, int packet_rate) { memset(s, 0, sizeof(*s)); /* Set up route flapping. */ /* This is the length of the period of both the delayed duration and the non-delayed. */ s->route_flap_interval = parms->route_flap_interval*G1050_TICKS_PER_SEC; /* How much additional delay is added or subtracted during route flaps. */ s->route_flap_delta = parms->route_flap_delay; /* Current tick count. This is initialized so that we are part way into the first CLEAN interval before the first change occurs. This is a random portion of the period. When we reach the first flap, the flapping in both directions becomes periodic. */ s->route_flap_counter = s->route_flap_interval - 99 - floor(s->route_flap_interval*q1050_rand()); s->link_failure_interval_ticks = parms->link_failure_interval*G1050_TICKS_PER_SEC; /* Link failures occur when the count reaches this number of ticks. */ /* Duration of a failure. */ s->link_failure_duration_ticks = floor((G1050_TICKS_PER_SEC*parms->link_failure_duration)); /* How far into the first CLEAN interval we are. This is like the route flap initialzation. */ s->link_failure_counter = s->link_failure_interval_ticks - 99 - floor(s->link_failure_interval_ticks*q1050_rand()); s->link_recovery_counter = s->link_failure_duration_ticks; s->base_delay = parms->base_regional_delay; s->max_jitter = parms->max_jitter; s->prob_packet_loss = parms->prob_packet_loss/100.0; s->prob_oos = parms->prob_oos/100.0; s->last_arrival_time = 0.0; s->delay_delta = 0; /* Count of packets lost in this segment. */ s->lost_packets = 0; s->lost_packets_2 = 0; } /*- End of function --------------------------------------------------------*/ static void g1050_segment_model(g1050_segment_state_t *s, double delays[], int len) { int i; int lose; int was_high_loss; double impulse; double slice_delay; /* Compute delay and loss value for each time slice. */ for (i = 0; i < len; i++) { lose = FALSE; /* Initialize delay to the serial delay plus some jitter. */ slice_delay = s->serial_delay + s->max_jitter*q1050_rand(); /* If no QoS, do congestion delay and packet loss analysis. */ if (!s->qos_enabled) { /* To match the logic in G.1050 we need to record the current loss state, before checking if we should change. */ was_high_loss = s->high_loss; /* Toggle between the low-loss and high-loss states, based on the transition probability. */ if (q1050_rand() < s->prob_loss_rate_change[was_high_loss]) s->high_loss = !s->high_loss; impulse = 0.0; if (q1050_rand() < s->prob_impulse[was_high_loss]) { impulse = s->impulse_height; if (!was_high_loss || s->link_type == G1050_LAN_LINK) impulse *= q1050_rand(); } if (was_high_loss && q1050_rand() < s->prob_packet_loss) lose = TRUE; /* Single pole LPF for the congestion delay impulses. */ s->congestion_delay = s->congestion_delay*s->impulse_coeff + impulse*(1.0 - s->impulse_coeff); slice_delay += s->congestion_delay; } /* If duplex mismatch on LAN, packet loss based on loss probability. */ if (s->multiple_access && (q1050_rand() < s->prob_packet_collision_loss)) lose = TRUE; /* Put computed delay into time slice array. */ if (lose) { delays[i] = PACKET_LOSS_TIME; s->lost_packets++; } else { delays[i] = slice_delay; } } } /*- End of function --------------------------------------------------------*/ static void g1050_core_model(g1050_core_state_t *s, double delays[], int len) { int32_t i; int lose; double jitter_delay; for (i = 0; i < len; i++) { lose = FALSE; jitter_delay = s->base_delay + s->max_jitter*q1050_rand(); /* Route flapping */ if (--s->route_flap_counter <= 0) { /* Route changed */ s->delay_delta = s->route_flap_delta - s->delay_delta; s->route_flap_counter = s->route_flap_interval; } if (q1050_rand() < s->prob_packet_loss) lose = TRUE; /* Link failures */ if (--s->link_failure_counter <= 0) { /* We are in a link failure */ lose = TRUE; if (--s->link_recovery_counter <= 0) { /* Leave failure state. */ s->link_failure_counter = s->link_failure_interval_ticks; s->link_recovery_counter = s->link_failure_duration_ticks; lose = FALSE; } } if (lose) { delays[i] = PACKET_LOSS_TIME; s->lost_packets++; } else { delays[i] = jitter_delay + s->delay_delta; } } } /*- End of function --------------------------------------------------------*/ static int g1050_segment_delay(g1050_segment_state_t *s, double base_time, double arrival_times[], double delays[], int num_packets) { int i; int32_t departure_time; int lost_packets; /* Add appropriate delays to the packets for the segments before the core. */ lost_packets = 0; for (i = 0; i < num_packets; i++) { /* Apply half a millisecond of rounding, as we working in millisecond steps. */ departure_time = (arrival_times[i] + 0.0005 - base_time)*G1050_TICKS_PER_SEC; if (arrival_times[i] == PACKET_LOSS_TIME) { /* Lost already */ } else if (delays[departure_time] == PACKET_LOSS_TIME) { arrival_times[i] = PACKET_LOSS_TIME; lost_packets++; } else { arrival_times[i] += delays[departure_time]; if (arrival_times[i] < s->last_arrival_time) arrival_times[i] = s->last_arrival_time; else s->last_arrival_time = arrival_times[i]; } } return lost_packets; } /*- End of function --------------------------------------------------------*/ static int g1050_segment_delay_preserve_order(g1050_segment_state_t *s, double base_time, double arrival_times_a[], double arrival_times_b[], double delays[], int num_packets) { int i; int j; int departure_time; double last_arrival_time; double last_arrival_time_temp; int lost_packets; /* Add appropriate delays to the packets for the segments after the core. */ last_arrival_time = 0.0; last_arrival_time_temp = 0.0; lost_packets = 0; for (i = 0; i < num_packets; i++) { /* We need to preserve the order that came out of the core, so we use an alternate array for the results. */ /* Apply half a millisecond of rounding, as we working in millisecond steps. */ departure_time = (arrival_times_a[i] + 0.0005 - base_time)*G1050_TICKS_PER_SEC; if (arrival_times_a[i] == PACKET_LOSS_TIME) { /* Lost already */ arrival_times_b[i] = PACKET_LOSS_TIME; } else if (delays[departure_time] == PACKET_LOSS_TIME) { arrival_times_b[i] = PACKET_LOSS_TIME; lost_packets++; } else { arrival_times_b[i] = arrival_times_a[i] + delays[departure_time]; if (arrival_times_a[i] < last_arrival_time) { /* If a legitimate out of sequence packet is detected, search back a fixed amount of time to preserve order. */ for (j = i - 1; j >= 0; j--) { if ((arrival_times_a[j] != PACKET_LOSS_TIME) && (arrival_times_b[j] != PACKET_LOSS_TIME)) { if ((arrival_times_a[i] - arrival_times_a[j]) > SEARCHBACK_PERIOD) break; if ((arrival_times_a[j] > arrival_times_a[i]) && (arrival_times_b[j] < arrival_times_b[i])) { arrival_times_b[j] = arrival_times_b[i]; } } } } else { last_arrival_time = arrival_times_a[i]; if (arrival_times_b[i] < last_arrival_time_temp) arrival_times_b[i] = last_arrival_time_temp; else last_arrival_time_temp = arrival_times_b[i]; } } } return lost_packets; } /*- End of function --------------------------------------------------------*/ static int g1050_core_delay(g1050_core_state_t *s, double base_time, double arrival_times[], double delays[], int num_packets) { int i; int departure_time; int lost_packets; /* This element does NOT preserve packet order. */ lost_packets = 0; for (i = 0; i < num_packets; i++) { /* Apply half a millisecond of rounding, as we working in millisecond steps. */ departure_time = (arrival_times[i] + 0.0005 - base_time)*G1050_TICKS_PER_SEC; if (arrival_times[i] == PACKET_LOSS_TIME) { /* Lost already */ } else if (delays[departure_time] == PACKET_LOSS_TIME) { arrival_times[i] = PACKET_LOSS_TIME; lost_packets++; } else { /* Not lost. Compute arrival time. */ arrival_times[i] += delays[departure_time]; if (arrival_times[i] < s->last_arrival_time) { /* This packet is EARLIER than the last one. It is out of order! */ /* Do we allow it to stay out of order? */ if (q1050_rand() >= s->prob_oos) arrival_times[i] = s->last_arrival_time; } else { /* Packet is in the correct order, relative to the last one. */ s->last_arrival_time = arrival_times[i]; } } } return lost_packets; } /*- End of function --------------------------------------------------------*/ static void g1050_simulate_chunk(g1050_state_t *s) { int i; s->base_time += 1.0; memcpy(&s->segment[0].delays[0], &s->segment[0].delays[G1050_TICKS_PER_SEC], 2*G1050_TICKS_PER_SEC*sizeof(s->segment[0].delays[0])); g1050_segment_model(&s->segment[0], &s->segment[0].delays[2*G1050_TICKS_PER_SEC], G1050_TICKS_PER_SEC); memcpy(&s->segment[1].delays[0], &s->segment[1].delays[G1050_TICKS_PER_SEC], 2*G1050_TICKS_PER_SEC*sizeof(s->segment[1].delays[0])); g1050_segment_model(&s->segment[1], &s->segment[1].delays[2*G1050_TICKS_PER_SEC], G1050_TICKS_PER_SEC); memcpy(&s->core.delays[0], &s->core.delays[G1050_TICKS_PER_SEC], 2*G1050_TICKS_PER_SEC*sizeof(s->core.delays[0])); g1050_core_model(&s->core, &s->core.delays[2*G1050_TICKS_PER_SEC], G1050_TICKS_PER_SEC); memcpy(&s->segment[2].delays[0], &s->segment[2].delays[G1050_TICKS_PER_SEC], 2*G1050_TICKS_PER_SEC*sizeof(s->segment[2].delays[0])); g1050_segment_model(&s->segment[2], &s->segment[2].delays[2*G1050_TICKS_PER_SEC], G1050_TICKS_PER_SEC); memcpy(&s->segment[3].delays[0], &s->segment[3].delays[G1050_TICKS_PER_SEC], 2*G1050_TICKS_PER_SEC*sizeof(s->segment[3].delays[0])); g1050_segment_model(&s->segment[3], &s->segment[3].delays[2*G1050_TICKS_PER_SEC], G1050_TICKS_PER_SEC); memcpy(&s->arrival_times_1[0], &s->arrival_times_1[s->packet_rate], 2*s->packet_rate*sizeof(s->arrival_times_1[0])); memcpy(&s->arrival_times_2[0], &s->arrival_times_2[s->packet_rate], 2*s->packet_rate*sizeof(s->arrival_times_2[0])); for (i = 0; i < s->packet_rate; i++) { s->arrival_times_1[2*s->packet_rate + i] = s->base_time + 2.0 + (double) i/(double) s->packet_rate; s->arrival_times_2[2*s->packet_rate + i] = 0.0; } s->segment[0].lost_packets_2 += g1050_segment_delay(&s->segment[0], s->base_time, s->arrival_times_1, s->segment[0].delays, s->packet_rate); s->segment[1].lost_packets_2 += g1050_segment_delay(&s->segment[1], s->base_time, s->arrival_times_1, s->segment[1].delays, s->packet_rate); s->core.lost_packets_2 += g1050_core_delay(&s->core, s->base_time, s->arrival_times_1, s->core.delays, s->packet_rate); s->segment[2].lost_packets_2 += g1050_segment_delay_preserve_order(&s->segment[2], s->base_time, s->arrival_times_1, s->arrival_times_2, s->segment[2].delays, s->packet_rate); s->segment[3].lost_packets_2 += g1050_segment_delay_preserve_order(&s->segment[3], s->base_time, s->arrival_times_2, s->arrival_times_1, s->segment[3].delays, s->packet_rate); } /*- End of function --------------------------------------------------------*/ g1050_state_t *g1050_init(int model, int speed_pattern, int packet_size, int packet_rate) { g1050_state_t *s; g1050_constants_t *constants; g1050_channel_speeds_t *sp; g1050_model_t *mo; int i; /* If the random generator has not been seeded it might give endless zeroes - it depends on the platform. */ for (i = 0; i < 10; i++) { if (q1050_rand() != 0.0) break; } if (i >= 10) srand48(time(NULL)); if ((s = (g1050_state_t *) malloc(sizeof(*s))) == NULL) return NULL; memset(s, 0, sizeof(*s)); constants = &g1050_constants[0]; sp = &g1050_speed_patterns[speed_pattern - 1]; mo = &g1050_standard_models[model]; memset(s, 0, sizeof(*s)); s->packet_rate = packet_rate; s->packet_size = packet_size; g1050_segment_init(&s->segment[0], G1050_LAN_LINK, &constants->segment[0], &mo->sidea_lan, sp->sidea_lan_bit_rate, sp->sidea_lan_multiple_access, FALSE, packet_size, packet_rate); g1050_segment_init(&s->segment[1], G1050_ACCESS_LINK, &constants->segment[1], &mo->sidea_access_link, sp->sidea_access_link_bit_rate_ab, FALSE, sp->sidea_access_link_qos_enabled, packet_size, packet_rate); g1050_core_init(&s->core, &mo->core, packet_rate); g1050_segment_init(&s->segment[2], G1050_ACCESS_LINK, &constants->segment[2], &mo->sideb_access_link, sp->sideb_access_link_bit_rate_ba, FALSE, sp->sideb_access_link_qos_enabled, packet_size, packet_rate); g1050_segment_init(&s->segment[3], G1050_LAN_LINK, &constants->segment[3], &mo->sideb_lan, sp->sideb_lan_bit_rate, sp->sideb_lan_multiple_access, FALSE, packet_size, packet_rate); s->base_time = 0.0; /* Start with enough of the future modelled to allow for the worst jitter. After this we will always keep at least 2 seconds of the future modelled. */ g1050_segment_model(&s->segment[0], s->segment[0].delays, 3*G1050_TICKS_PER_SEC); g1050_segment_model(&s->segment[1], s->segment[1].delays, 3*G1050_TICKS_PER_SEC); g1050_core_model(&s->core, s->core.delays, 3*G1050_TICKS_PER_SEC); g1050_segment_model(&s->segment[2], s->segment[2].delays, 3*G1050_TICKS_PER_SEC); g1050_segment_model(&s->segment[3], s->segment[3].delays, 3*G1050_TICKS_PER_SEC); /* Initialise the arrival times to the departure times */ for (i = 0; i < 3*s->packet_rate; i++) { s->arrival_times_1[i] = s->base_time + (double) i/(double)s->packet_rate; s->arrival_times_2[i] = 0.0; } s->segment[0].lost_packets_2 += g1050_segment_delay(&s->segment[0], s->base_time, s->arrival_times_1, s->segment[0].delays, s->packet_rate); s->segment[1].lost_packets_2 += g1050_segment_delay(&s->segment[1], s->base_time, s->arrival_times_1, s->segment[1].delays, s->packet_rate); s->core.lost_packets_2 += g1050_core_delay(&s->core, s->base_time, s->arrival_times_1, s->core.delays, s->packet_rate); s->segment[2].lost_packets_2 += g1050_segment_delay_preserve_order(&s->segment[2], s->base_time, s->arrival_times_1, s->arrival_times_2, s->segment[2].delays, s->packet_rate); s->segment[3].lost_packets_2 += g1050_segment_delay_preserve_order(&s->segment[3], s->base_time, s->arrival_times_2, s->arrival_times_1, s->segment[3].delays, s->packet_rate); s->first = NULL; s->last = NULL; return s; } /*- End of function --------------------------------------------------------*/ void g1050_dump_parms(int model, int speed_pattern) { g1050_channel_speeds_t *sp; g1050_model_t *mo; sp = &g1050_speed_patterns[speed_pattern - 1]; mo = &g1050_standard_models[model]; printf("Model %d%c\n", speed_pattern, 'A' + model - 1); printf("LOO %.6f%% %.6f%% %.6f%%\n", mo->loo[0]*sp->loo/100.0, mo->loo[1]*sp->loo/100.0, mo->loo[2]*sp->loo/100.0); printf("Side A LAN %dbps, %.3f%% occupancy, MTU %d, %s MA\n", sp->sidea_lan_bit_rate, mo->sidea_lan.percentage_occupancy, mo->sidea_lan.mtu, (sp->sidea_lan_multiple_access) ? "" : "no"); printf("Side A access %dbps, %.3f%% occupancy, MTU %d, %s QoS\n", sp->sidea_access_link_bit_rate_ab, mo->sidea_access_link.percentage_occupancy, mo->sidea_access_link.mtu, (sp->sidea_access_link_qos_enabled) ? "" : "no"); printf("Core delay %.4fs (%.4fs), peak jitter %.4fs, prob loss %.4f%%, prob OOS %.4f%%\n", mo->core.base_regional_delay, mo->core.base_intercontinental_delay, mo->core.max_jitter, mo->core.prob_packet_loss, mo->core.prob_oos); printf(" Route flap interval %.4fs, delay change %.4fs\n", mo->core.route_flap_interval, mo->core.route_flap_delay); printf(" Link failure interval %.4fs, duration %.4fs\n", mo->core.link_failure_interval, mo->core.link_failure_duration); printf("Side B access %dbps, %.3f%% occupancy, MTU %d, %s QoS\n", sp->sideb_access_link_bit_rate_ba, mo->sideb_access_link.percentage_occupancy, mo->sideb_access_link.mtu, (sp->sideb_access_link_qos_enabled) ? "" : "no"); printf("Side B LAN %dbps, %.3f%% occupancy, MTU %d, %s MA\n", sp->sideb_lan_bit_rate, mo->sideb_lan.percentage_occupancy, mo->sideb_lan.mtu, (sp->sideb_lan_multiple_access) ? "" : "no"); } /*- End of function --------------------------------------------------------*/ int g1050_put(g1050_state_t *s, const uint8_t buf[], int len, int seq_no, double departure_time) { g1050_queue_element_t *element; g1050_queue_element_t *e; double arrival_time; while (departure_time >= s->base_time + 1.0) g1050_simulate_chunk(s); arrival_time = s->arrival_times_1[(int) ((departure_time - s->base_time)*(double) s->packet_rate + 0.5)]; if (arrival_time < 0) { /* This packet is lost */ return 0; } if ((element = (g1050_queue_element_t *) malloc(sizeof(*element) + len)) == NULL) return -1; element->next = NULL; element->prev = NULL; element->seq_no = seq_no; element->departure_time = departure_time; element->arrival_time = arrival_time; element->len = len; memcpy(element->pkt, buf, len); /* Add it to the queue, in order */ if (s->last == NULL) { /* The queue is empty */ s->first = s->last = element; } else { for (e = s->last; e; e = e->prev) { if (e->arrival_time <= arrival_time) break; } if (e) { element->next = e->next; element->prev = e; e->next = element; } else { element->next = s->first; s->first = element; } if (element->next) element->next->prev = element; else s->last = element; } //printf(">> Seq %d, departs %f, arrives %f\n", seq_no, departure_time, arrival_time); return len; } /*- End of function --------------------------------------------------------*/ int g1050_get(g1050_state_t *s, uint8_t buf[], int max_len, double current_time, int *seq_no, double *departure_time, double *arrival_time) { int len; g1050_queue_element_t *element; element = s->first; if (element == NULL) { if (seq_no) *seq_no = -1; if (departure_time) *departure_time = -1; if (arrival_time) *arrival_time = -1; return -1; } if (element->arrival_time > current_time) { if (seq_no) *seq_no = element->seq_no; if (departure_time) *departure_time = element->departure_time; if (arrival_time) *arrival_time = element->arrival_time; return -1; } /* Return the first packet in the queue */ len = element->len; memcpy(buf, element->pkt, len); if (seq_no) *seq_no = element->seq_no; if (departure_time) *departure_time = element->departure_time; if (arrival_time) *arrival_time = element->arrival_time; //printf("<< Seq %d, arrives %f (%f)\n", element->seq_no, element->arrival_time, current_time); /* Remove it from the queue */ if (s->first == s->last) s->last = NULL; s->first = element->next; if (element->next) element->next->prev = NULL; free(element); return len; } /*- End of function --------------------------------------------------------*/ void g1050_queue_dump(g1050_state_t *s) { g1050_queue_element_t *e; printf("Queue scanned forewards\n"); for (e = s->first; e; e = e->next) printf("Seq %5d, arrival %10.4f, len %3d\n", e->seq_no, e->arrival_time, e->len); printf("Queue scanned backwards\n"); for (e = s->last; e; e = e->prev) printf("Seq %5d, arrival %10.4f, len %3d\n", e->seq_no, e->arrival_time, e->len); } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/spandsp-sim/make_line_models.c0000644000175000017500000013573611150047216022776 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * make_line_models.c * * Written by Steve Underwood * * Copyright (C) 2004 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2, as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: make_line_models.c,v 1.7 2008/07/25 13:56:54 steveu Exp $ */ /*! \page make_line_models_page Telephony line model construction \section make_line_models_page_sec_1 What does it do? ???. \section make_line_models_page_sec_2 How does it work? ???. */ #if defined(HAVE_CONFIG_H) #include "config.h" #endif #include #include #include #include #include "floating_fudge.h" #if defined(HAVE_FFTW3_H) #include #else #include #endif #if defined(HAVE_TGMATH_H) #include #endif #if defined(HAVE_MATH_H) #include #endif #include "spandsp.h" #if !defined(M_PI) # define M_PI 3.14159265358979323846 /* pi */ #endif #define LINE_MODEL_FILE_NAME "line_models.c" #define SAMPLE_RATE 8000 #define LINE_FILTER_SIZE 129 #define FFT_SIZE 1024 /* Tabulated medium range telephone line response (from p 537, Digital Communication, John G. Proakis */ /* amp 1.0 -> 2.15, freq = 3000 Hz -> 3.2, by 0.2 increments delay = 4 ms -> 2.2 */ struct { int frequency; float amp; float delay; } proakis[] = { { 0, 0.00, 4.80}, { 200, 0.90, 3.50}, { 400, 1.40, 2.20}, { 600, 1.80, 0.90}, { 800, 2.00, 0.50}, {1000, 2.10, 0.25}, {1200, 2.30, 0.10}, {1400, 2.30, 0.05}, {1600, 2.20, 0.00}, {1800, 2.10, 0.00}, {2000, 2.00, 0.00}, {2200, 1.85, 0.05}, {2400, 1.75, 0.10}, {2600, 1.55, 0.20}, {2800, 1.30, 0.40}, {3000, 1.10, 0.50}, {3200, 0.80, 0.90}, {3400, 0.55, 1.20}, {3600, 0.25, 2.20}, {3800, 0.05, 3.20}, {4000, 0.05, 4.20}, {4200, 0.05, 5.20} }; #define CPE_TO_CO_ATTENUATION 0 /* In dB */ #define CPE_TO_CO_DELAY 1 /* In us */ #define CPE_TO_CO_IMPEDANCE 2 /* In ohms */ #define CPE_TO_CO_PHASE 3 /* In degrees */ #define CO_TO_CPE_IMPEDANCE 4 /* In ohms */ #define CO_TO_CPE_PHASE 5 /* In degrees */ #define CO_TO_CPE_ATTENUATION 6 /* In dB */ #define CO_TO_CPE_DELAY 7 /* In us */ /* Terms used, for V.56bis: AD = attenuation distortion EDD = envelope delay distortion */ /* V.56bis EIA LL-1, non-loaded loop */ struct { int freq; float ad[8]; } eia_ll1[] = { { 200, {0.0, 0.4, 767, -1.4, 767, -1.4, 0.0, 0.4}}, { 300, {0.0, 0.7, 766, -2.0, 766, -2.0, 0.0, 0.7}}, { 400, {0.0, 0.5, 763, -2.8, 763, -2.8, 0.0, 0.5}}, { 500, {0.0, 0.6, 765, -3.4, 765, -3.4, 0.0, 0.6}}, { 600, {0.0, 0.2, 764, -4.1, 764, -4.1, 0.0, 0.2}}, { 700, {0.0, 0.4, 764, -4.7, 764, -4.7, 0.0, 0.4}}, { 800, {0.0, 0.4, 762, -5.4, 762, -5.4, 0.0, 0.4}}, { 900, {0.0, 0.2, 762, -6.0, 762, -6.0, 0.0, 0.2}}, {1000, {1.2, 0.5, 761, -6.7, 761, -6.7, 1.2, 0.5}}, {1100, {0.0, 0.6, 759, -7.4, 759, -7.4, 0.0, 0.6}}, {1200, {0.0, 0.4, 757, -8.1, 757, -8.1, 0.0, 0.4}}, {1300, {0.0, 0.1, 757, -8.6, 757, -8.6, 0.0, 0.1}}, {1400, {0.0, 0.3, 755, -9.3, 755, -9.3, 0.0, 0.3}}, {1500, {0.0, 0.4, 753, -10.0, 753, -10.0, 0.0, 0.4}}, {1600, {0.0, 0.3, 751, -10.7, 751, -10.7, 0.0, 0.3}}, {1700, {0.0, 0.1, 748, -11.3, 748, -11.3, 0.0, 0.1}}, {1800, {0.0, 11.0, 748, -11.9, 748, -11.9, 0.0, 11.0}}, {1900, {0.1, 0.1, 745, -12.5, 745, -12.5, 0.1, 0.1}}, {2000, {0.1, 0.3, 743, -13.9, 743, -13.9, 0.1, 0.3}}, {2100, {0.1, 0.3, 740, -13.9, 740, -13.9, 0.1, 0.3}}, {2200, {0.1, 0.3, 737, -14.5, 737, -14.5, 0.1, 0.3}}, {2300, {0.1, 0.3, 734, -15.2, 734, -15.2, 0.1, 0.3}}, {2400, {0.1, 0.2, 731, -15.8, 731, -15.8, 0.1, 0.2}}, {2500, {0.1, 0.0, 728, -16.4, 728, -16.4, 0.1, 0.0}}, {2600, {0.1, 0.0, 729, -16.8, 729, -16.8, 0.1, 0.0}}, {2700, {0.2, 0.1, 726, -17.4, 726, -17.4, 0.2, 0.1}}, {2800, {0.2, 0.2, 722, -18.0, 722, -18.0, 0.2, 0.2}}, {2900, {0.2, 0.3, 719, -18.6, 719, -18.6, 0.2, 0.3}}, {3000, {0.2, 0.4, 715, -19.3, 715, -19.3, 0.2, 0.4}}, {3100, {0.2, 0.4, 712, -19.9, 712, -19.9, 0.2, 0.4}}, {3200, {0.2, 0.5, 708, -20.5, 708, -20.5, 0.2, 0.5}}, {3300, {0.2, 0.5, 704, -21.1, 704, -21.1, 0.2, 0.5}}, {3400, {0.2, 0.5, 700, -21.7, 700, -21.7, 0.2, 0.5}}, {3500, {0.2, 0.5, 696, -22.3, 696, -22.3, 0.2, 0.5}}, {3600, {0.2, 0.4, 692, -22.9, 692, -22.9, 0.2, 0.4}}, {3700, {0.2, 0.3, 688, -23.5, 688, -23.5, 0.2, 0.3}}, {3800, {0.2, 0.2, 684, -24.1, 684, -24.1, 0.2, 0.2}}, {3900, {0.2, 0.1, 680, -24.7, 680, -24.7, 0.2, 0.1}}, {4000, {0.2, -0.1, 676, -25.2, 676, -25.2, 0.2, -0.1}} }; /* V.56bis EIA LL-2, non-loaded loop */ struct { int freq; float ad[8]; } eia_ll2[] = { { 200, {-0.2, 6.6, 1086, -4.9, 1085, -5.6, -0.2, 6.6}}, { 300, {-0.2, 7.7, 1079, -7.3, 1077, -8.3, -0.2, 7.7}}, { 400, {-0.2, 6.7, 1062, -9.9, 1058, -11.2, -0.2, 6.7}}, { 500, {-0.2, 7.1, 1059, -12.0, 1053, -13.6, -0.2, 7.1}}, { 600, {-0.1, 5.2, 1041, -14.4, 1034, -16.3, -0.1, 5.2}}, { 700, {-0.1, 5.8, 1030, -16.5, 1020, -18.6, -0.1, 5.8}}, { 800, {-0.1, 5.4, 1010, -18.7, 998, -21.0, -0.1, 5.4}}, { 900, { 0.0, 4.5, 997, -20.5, 982, -23.1, 0.0, 4.5}}, {1000, { 3.2, 5.1, 976, -22.5, 959, -25.3, 3.2, 5.1}}, {1100, { 0.1, 5.0, 954, -24.5, 934, -27.4, 0.1, 5.0}}, {1200, { 0.1, 4.0, 931, -26.2, 909, -29.4, 0.1, 4.0}}, {1300, { 0.2, 2.7, 918, -27.6, 894, -30.9, 0.2, 2.7}}, {1400, { 0.2, 2.8, 897, -29.2, 871, -32.6, 0.2, 2.8}}, {1500, { 0.3, 2.6, 874, -30.7, 847, -34.3, 0.3, 2.6}}, {1600, { 0.3, 2.0, 852, -32.1, 823, -35.8, 0.3, 2.0}}, {1700, { 0.4, 0.9, 831, -33.4, 800, -37.2, 0.4, 0.9}}, {1800, { 0.5, 40.8, 816, -34.4, 783, -38.4, 0.5, 40.8}}, {1900, { 0.6, 0.0, 796, -35.6, 762, -39.6, 0.6, 0.0}}, {2000, { 0.6, -0.2, 776, -36.6, 741, -40.7, 0.6, -0.2}}, {2100, { 0.7, -0.6, 756, -37.6, 720, -41.8, 0.7, -0.6}}, {2200, { 0.8, -1.1, 737, -38.6, 700, -42.9, 0.8, -1.1}}, {2300, { 0.9, -1.8, 719, -39.4, 681, -43.8, 0.9, -1.8}}, {2400, { 1.0, -2.6, 701, -40.2, 663, -44.7, 1.0, -2.6}}, {2500, { 1.0, -3.7, 684, -41.0, 646, -45.5, 1.0, -3.7}}, {2600, { 1.1, -4.1, 678, -41.3, 639, -45.9, 1.1, -4.1}}, {2700, { 1.2, -4.3, 663, -42.0, 623, -46.6, 1.2, -4.3}}, {2800, { 1.3, -4.5, 647, -42.6, 607, -47.3, 1.3, -4.5}}, {2900, { 1.4, -4.8, 632, -43.1, 591, -47.9, 1.4, -4.8}}, {3000, { 1.5, -5.2, 617, -43.6, 576, -48.4, 1.5, -5.2}}, {3100, { 1.6, -5.6, 603, -44.1, 562, -49.0, 1.6, -5.6}}, {3200, { 1.7, -6.0, 589, -44.5, 548, -49.5, 1.7, -6.0}}, {3300, { 1.8, -6.5, 576, -44.9, 535, -49.9, 1.8, -6.5}}, {3400, { 1.9, -7.1, 563, -45.3, 522, -50.3, 1.9, -7.1}}, {3500, { 2.0, -7.7, 551, -45.6, 509, -50.7, 2.0, -7.7}}, {3600, { 2.1, -8.4, 539, -45.9, 498, -51.0, 2.1, -8.4}}, {3700, { 2.2, -9.1, 528, -46.2, 486, -51.3, 2.2, -9.1}}, {3800, { 2.3, -9.9, 518, -46.4, 476, -51.6, 2.3, -9.9}}, {3900, { 2.4, -10.6, 507, -46.6, 466, -51.9, 2.4, -10.6}}, {4000, { 2.5, -11.5, 498, -46.8, 456, -52.1, 2.5, -11.5}} }; /* V.56bis EIA LL-3, non-loaded loop */ struct { int freq; float ad[8]; } eia_ll3[] = { { 200, {-0.3, 10.5, 1176, -5.9, 1173, -7.4, -0.3, 10.5}}, { 300, {-0.3, 11.5, 1165, -8.8, 1159, -11.0, -0.3, 11.5}}, { 400, {-0.3, 10.6, 1140, -11.8, 1130, -14.7, -0.3, 10.6}}, { 500, {-0.3, 11.0, 1133, -14.3, 1117, -17.8, -0.3, 11.0}}, { 600, {-0.2, 8.5, 1108, -17.1, 1086, -21.2, -0.2, 8.5}}, { 700, {-0.2, 8.5, 1090, -19.4, 1062, -24.0, -0.2, 8.5}}, { 800, {-0.1, 8.4, 1062, -21.9, 1029, -27.0, -0.1, 8.4}}, { 900, { 0.0, 7.1, 1042, -23.9, 1003, -29.4, 0.0, 7.1}}, {1000, { 3.8, 7.7, 1013, -23.0, 969, -31.9, 3.8, 7.7}}, {1100, { 0.1, 7.4, 982, -28.1, 934, -34.3, 0.1, 7.4}}, {1200, { 0.1, 6.0, 953, -29.9, 900, -36.5, 0.1, 6.0}}, {1300, { 0.2, 4.2, 935, -31.3, 878, -38.1, 0.2, 4.2}}, {1400, { 0.3, 4.2, 907, -32.8, 847, -40.0, 0.3, 4.2}}, {1500, { 0.4, 3.7, 880, -34.3, 817, -41.7, 0.4, 3.7}}, {1600, { 0.5, 2.7, 853, -35.6, 787, -43.2, 0.5, 2.7}}, {1700, { 0.6, 1.2, 827, -36.8, 760, -44.6, 0.6, 1.2}}, {1800, { 0.7, 48.7, 809, -37.8, 739, -45.8, 0.7, 48.7}}, {1900, { 0.8, -0.2, 785, -38.8, 715, -47.0, 0.8, -0.2}}, {2000, { 0.9, -0.7, 763, -39.7, 691, -48.0, 0.9, -0.7}}, {2100, { 1.0, -1.3, 741, -40.5, 668, -49.1, 1.0, -1.3}}, {2200, { 1.1, -2.1, 719, -41.3, 647, -50.0, 1.1, -2.1}}, {2300, { 1.2, -2.1, 699, -42.0, 625, -50.8, 1.2, -2.1}}, {2400, { 1.2, -4.3, 680, -42.6, 606, -51.6, 1.2, -4.3}}, {2500, { 1.3, -5.6, 663, -43.2, 588, -52.3, 1.3, -5.6}}, {2600, { 1.6, -6.2, 656, -43.4, 581, -52.7, 1.6, -6.2}}, {2700, { 1.7, -6.6, 640, -43.9, 564, -53.3, 1.7, -6.6}}, {2800, { 1.8, -7.0, 624, -44.3, 548, -53.9, 1.8, -7.0}}, {2900, { 1.9, -7.5, 609, -44.7, 533, -54.4, 1.9, -7.5}}, {3000, { 2.0, -8.0, 594, -45.0, 518, -54.8, 2.0, -8.0}}, {3100, { 2.2, -8.6, 580, -45.3, 504, -55.3, 2.2, -8.6}}, {3200, { 2.3, -9.2, 566, -45.6, 490, -55.7, 2.3, -9.2}}, {3300, { 2.4, -9.9, 553, -45.8, 477, -56.0, 2.4, -9.9}}, {3400, { 2.6, -10.7, 540, -46.0, 465, -56.3, 2.6, -10.7}}, {3500, { 2.7, -11.4, 529, -46.2, 454, -56.6, 2.7, -11.4}}, {3600, { 2.8, -12.3, 517, -46.3, 443, -56.9, 2.8, -12.3}}, {3700, { 3.0, -13.1, 507, -46.4, 432, -57.1, 3.0, -13.1}}, {3800, { 3.1, -14.0, 497, -46.5, 422, -57.3, 3.1, -14.0}}, {3900, { 3.2, -14.9, 487, -46.6, 413, -57.5, 3.2, -14.9}}, {4000, { 3.3, -15.9, 478, -46.6, 404, -57.7, 3.3, -15.9}} }; /* V.56bis EIA LL-4, non-loaded loop */ struct { int freq; float ad[8]; } eia_ll4[] = { { 200, {-0.8, 31.0, 1564, -10.7, 1564, -10.7, -0.8, 31.0}}, { 300, {-0.8, 32.6, 1520, -15.6, 1520, -15.6, -0.8, 32.6}}, { 400, {-0.8, 29.8, 1447, -20.5, 1447, -20.5, -0.8, 29.8}}, { 500, {-0.6, 29.7, 1402, -24.3, 1402, -24.3, -0.6, 29.7}}, { 600, {-0.5, 24.9, 1328, -28.1, 1328, -28.1, -0.5, 24.9}}, { 700, {-0.4, 24.8, 1270, -31.2, 1270, -31.2, -0.4, 24.8}}, { 800, {-0.3, 22.7, 1200, -34.0, 1200, -34.0, -0.3, 22.7}}, { 900, {-0.1, 19.8, 1148, -36.2, 1148, -36.2, -0.1, 19.8}}, {1000, { 6.1, 19.3, 1086, -38.3, 1086, -38.3, 6.1, 19.3}}, {1100, { 0.1, 17.5, 1027, -40.1, 1027, -40.1, 0.1, 17.5}}, {1200, { 0.3, 14.3, 974, -41.6, 974, -41.6, 0.3, 14.3}}, {1300, { 0.5, 10.9, 941, -42.6, 941, -42.6, 0.5, 10.9}}, {1400, { 0.7, 9.6, 897, -43.7, 897, -43.7, 0.7, 9.6}}, {1500, { 0.9, 7.7, 856, -44.6, 856, -44.6, 0.9, 7.7}}, {1600, { 1.1, 5.3, 818, -45.3, 818, -45.3, 1.1, 5.3}}, {1700, { 1.3, 2.4, 784, -45.9, 784, -45.9, 1.3, 2.4}}, {1800, { 1.4, 69.1, 761, -46.3, 761, -46.3, 1.4, 69.1}}, {1900, { 1.7, -1.3, 732, -46.6, 732, -46.6, 1.7, -1.3}}, {2000, { 1.9, -2.7, 706, -46.9, 706, -46.9, 1.9, -2.7}}, {2100, { 2.1, -4.3, 682, -47.1, 682, -47.1, 2.1, -4.3}}, {2200, { 2.3, -6.0, 659, -47.3, 659, -47.3, 2.3, -6.0}}, {2300, { 2.5, -7.9, 638, -47.4, 638, -47.4, 2.5, -7.9}}, {2400, { 2.7, -9.9, 619, -47.4, 619, -47.4, 2.7, -9.9}}, {2500, { 2.9, -12.0, 602, -47.5, 602, -47.5, 2.9, -12.0}}, {2600, { 3.1, -13.0, 596, -47.4, 596, -47.4, 3.1, -13.0}}, {2700, { 3.3, -13.9, 580, -47.4, 580, -47.4, 3.3, -13.9}}, {2800, { 3.5, -14.8, 566, -47.3, 566, -47.3, 3.5, -14.8}}, {2900, { 3.7, -15.7, 552, -47.2, 552, -47.2, 3.7, -15.7}}, {3000, { 3.9, -16.7, 539, -47.1, 539, -47.1, 3.9, -16.7}}, {3100, { 4.1, -17.7, 526, -47.0, 526, -47.0, 4.1, -17.7}}, {3200, { 4.3, -18.7, 515, -46.8, 515, -46.8, 4.3, -18.7}}, {3300, { 4.5, -19.8, 504, -46.7, 504, -46.7, 4.5, -19.8}}, {3400, { 4.7, -20.8, 493, -46.5, 493, -46.5, 4.7, -20.8}}, {3500, { 4.9, -21.8, 484, -46.4, 484, -46.4, 4.9, -21.8}}, {3600, { 5.1, -22.9, 475, -46.2, 475, -46.2, 5.1, -22.9}}, {3700, { 5.3, -23.9, 466, -46.0, 466, -46.0, 5.3, -23.9}}, {3800, { 5.5, -25.0, 458, -45.9, 458, -45.9, 5.5, -25.0}}, {3900, { 5.6, -26.1, 451, -45.7, 451, -45.7, 5.6, -26.1}}, {4000, { 5.8, -27.2, 444, -45.5, 444, -45.5, 5.8, -27.2}} }; /* V.56bis EIA LL-5, non-loaded loop */ struct { int freq; float ad[8]; } eia_ll5[] = { { 200, {-1.4, 55.8, 1607, -12.7, 1574, -17.4, -1.4, 55.8}}, { 300, {-1.3, 57.2, 1541, -18.3, 1478, -24.8, -1.3, 57.2}}, { 400, {-1.2, 52.2, 1443, -23.6, 1350, -31.5, -1.2, 52.2}}, { 500, {-1.0, 51.0, 1379, -27.5, 1261, -36.4, -1.0, 51.0}}, { 600, {-0.9, 43.2, 1287, -31.2, 1150, -40.7, -0.9, 43.2}}, { 700, {-0.7, 41.8, 1216, -34.0, 1066, -44.0, -0.7, 41.8}}, { 800, {-0.5, 37.4, 1137, -36.5, 979, -46.9, -0.5, 37.4}}, { 900, {-0.2, 32.4, 1080, -38.3, 915, -48.9, -0.2, 32.4}}, {1000, { 7.0, 30.5, 1015, -39.8, 848, -50.7, 7.0, 30.5}}, {1100, { 0.3, 26.8, 956, -41.1, 788, -52.2, 0.3, 26.8}}, {1200, { 0.5, 21.5, 904, -42.1, 736, -53.3, 0.5, 21.5}}, {1300, { 0.8, 16.6, 873, -42.7, 703, -54.1, 0.8, 16.6}}, {1400, { 1.0, 14.1, 832, -43.2, 663, -54.8, 1.0, 14.1}}, {1500, { 1.3, 10.9, 795, -43.7, 627, -55.3, 1.3, 10.9}}, {1600, { 1.6, 7.3, 762, -44.0, 595, -55.7, 1.6, 7.3}}, {1700, { 1.9, 3.2, 733, -44.2, 567, -56.0, 1.9, 3.2}}, {1800, { 2.2, 81.5, 713, -44.3, 547, -56.2, 2.2, 81.5}}, {1900, { 2.4, -1.9, 689, -44.4, 524, -56.4, 2.4, -1.9}}, {2000, { 2.7, -3.9, 667, -44.4, 503, -56.5, 2.7, -3.9}}, {2100, { 3.0, -6.1, 646, -44.4, 485, -56.5, 3.0, -6.1}}, {2200, { 3.3, -8.3, 628, -44.4, 466, -56.5, 3.3, -8.3}}, {2300, { 3.6, -10.7, 610, -44.3, 450, -56.5, 3.6, -10.7}}, {2400, { 3.8, -13.1, 595, -44.2, 436, -56.4, 3.8, -13.1}}, {2500, { 4.1, -15.5, 581, -44.1, 422, -56.3, 4.1, -15.5}}, {2600, { 4.3, -16.7, 577, -44.0, 417, -56.2, 4.3, -16.7}}, {2700, { 4.6, -17.7, 565, -43.9, 406, -56.1, 4.6, -17.7}}, {2800, { 4.8, -18.8, 553, -43.8, 395, -56.0, 4.8, -18.8}}, {2900, { 5.1, -19.9, 542, -43.7, 395, -55.9, 5.1, -19.9}}, {3000, { 5.4, -21.0, 531, -43.6, 375, -55.7, 5.4, -21.0}}, {3100, { 5.6, -22.1, 521, -43.5, 366, -55.6, 5.6, -22.1}}, {3200, { 5.9, -23.2, 511, -43.4, 357, -55.4, 5.9, -23.2}}, {3300, { 6.1, -24.3, 502, -43.3, 349, -55.3, 6.1, -24.3}}, {3400, { 6.4, -25.4, 494, -43.2, 341, -55.1, 6.4, -25.4}}, {3500, { 6.6, -26.5, 486, -43.1, 334, -55.0, 6.6, -26.5}}, {3600, { 6.9, -27.6, 478, -43.0, 327, -54.8, 6.9, -27.6}}, {3700, { 7.1, -28.7, 471, -42.9, 321, -54.7, 7.1, -28.7}}, {3800, { 7.3, -29.9, 464, -42.8, 315, -54.6, 7.3, -29.9}}, {3900, { 7.5, -31.0, 458, -42.7, 310, -54.4, 7.5, -31.0}}, {4000, { 7.8, -32.1, 452, -42.7, 304, -54.3, 7.8, -32.1}} }; /* V.56bis EIA LL-6, non-loaded loop */ struct { int freq; float ad[8]; } eia_ll6[] = { { 200, {-0.2, -39.3, 1756, -12.0, 1748, -19.8, -0.2, -39.3}}, { 300, {-0.2, -31.7, 1642, -15.9, 1689, -26.9, -0.2, -31.7}}, { 400, {-0.2, -37.5, 1506, -18.4, 1427, -33.4, -0.2, -37.5}}, { 500, {-0.1, -34.7, 1442, -19.5, 1301, -37.7, -0.1, -34.7}}, { 600, {-0.1, -46.0, 1363, -20.1, 1153, -40.7, -0.1, -46.0}}, { 700, { 0.0, -40.8, 1320, -20.7, 1045, -42.2, 0.0, -40.8}}, { 800, { 0.0, -40.1, 1269, -21.5, 943, -42.3, 0.0, -40.1}}, { 900, { 0.0, -40.6, 1227, -22.5, 878, -41.3, 0.0, -40.6}}, {1000, { 6.6, -28.0, 1161, -23.4, 825, -39.3, 6.6, -28.0}}, {1100, { 0.0, -16.5, 1082, -23.5, 797, -36.8, 0.0, -16.5}}, {1200, {-0.1, 0.3, 1000, -22.2, 798, -34.4, -0.1, 0.3}}, {1300, { 0.0, -2.3, 943, -19.3, 826, -33.2, 0.0, -2.3}}, {1400, { 0.0, 13.5, 896, -14.0, 870, -33.8, 0.0, 13.5}}, {1500, { 0.1, 22.6, 890, -7.2, 916, -36.8, 0.1, 22.6}}, {1600, { 0.3, 30.3, 940, -0.3, 938, -42.0, 0.3, 30.3}}, {1700, { 0.5, 12.5, 1052, 4.6, 929, -48.0, 0.5, 12.5}}, {1800, { 0.8, 458.6, 1212, 6.9, 880, -52.8, 0.8, 458.6}}, {1900, { 1.1, -5.1, 1410, 3.5, 814, -56.5, 1.1, -5.1}}, {2000, { 1.4, -5.0, 1579, -3.6, 747, -58.5, 1.4, -5.0}}, {2100, { 1.5, 6.1, 1618, -13.2, 688, -58.8, 1.5, 6.1}}, {2200, { 1.5, 33.5, 1491, -21.5, 646, -57.7, 1.5, 33.5}}, {2300, { 1.4, 80.5, 1275, -24.9, 625, -55.6, 1.4, 80.5}}, {2400, { 1.3, 142.3, 1078, -20.8, 633, -53.8, 1.3, 142.3}}, {2500, { 1.4, 196.5, 985, -9.3, 664, -54.5, 1.4, 196.5}}, {2600, { 1.6, 214.5, 1045, 2.4, 692, -57.6, 1.6, 214.5}}, {2700, { 2.4, 196.8, 1326, 13.7, 684, -63.5, 2.4, 196.8}}, {2800, { 3.4, 150.4, 1887, 14.7, 637, -68.3, 3.4, 150.4}}, {2900, { 4.3, 125.3, 2608, 1.3, 501, -70.7, 4.3, 125.3}}, {3000, { 4.9, 174.6, 2730, -21.8, 533, -70.6, 4.9, 174.6}}, {3100, { 4.9, 380.0, 2094, -33.7, 506, -68.5, 4.9, 380.0}}, {3200, { 5.2, 759.3, 1642, -21.3, 522, -67.0, 5.2, 759.3}}, {3300, { 8.0, 680.1, 2348, 0.5, 531, -72.9, 8.0, 680.1}}, {3400, {13.1, 237.8, 4510, -20.9, 482, -77.3, 13.1, 237.8}}, {3500, {18.2, -18.8, 4116, -59.6, 439, -78.0, 18.2, -18.8}}, {3600, {22.7, -145.4, 3041, -74.4, 487, -77.7, 22.7, -145.4}}, {3700, {26.8, -214.5, 2427, -80.1, 383, -77.1, 26.8, -214.5}}, {3800, {30.4, -257.0, 2054, -82.7, 364, -76.4, 30.4, -257.0}}, {3900, {33.7, -285.6, 1803, -84.2, 348, -75.0, 33.7, -285.6}}, {4000, {36.8, -306.2, 1621, -85.1, 334, -75.7, 36.8, -306.2}} }; /* V.56bis EIA LL-7, non-loaded loop */ struct { int freq; float ad[8]; } eia_ll7[] = { { 200, { 0.4, -81.3, 1848, -10.5, 1737, -15.6, 0.4, -81.3}}, { 300, { 0.3, -68.9, 1785, -16.2, 1585, -21.6, 0.3, -68.9}}, { 400, { 0.2, -68.1, 1646, -22.0, 1388, -25.8, 0.2, -68.1}}, { 500, { 0.1, -57.0, 1528, -26.2, 1247, -27.7, 0.1, -57.0}}, { 600, { 0.0, -59.8, 1349, -28.9, 1087, -27.3, 0.0, -59.8}}, { 700, { 0.0, -45.0, 1205, -29.1, 975, -24.8, 0.0, -45.0}}, { 800, {-0.1, -36.9, 1064, -26.8, 885, -19.7, -0.1, -36.9}}, { 900, {-0.1, -37.1, 989, -22.6, 846, -13.5, -0.1, -37.1}}, {1000, { 5.9, -29.2, 944, -16.6, 847, -6.1, 5.9, -29.2}}, {1100, { 0.1, -30.8, 951, -10.5, 900, 0.3, 0.1, -30.8}}, {1200, { 0.2, -40.7, 1008, -5.9, 999, 4.9, 0.2, -40.7}}, {1300, { 0.4, -53.3, 1897, -4.0, 1122, 4.6, 0.4, -53.3}}, {1400, { 0.5, -52.7, 1197, -4.8, 1253, 1.9, 0.5, -52.7}}, {1500, { 0.6, -48.3, 1269, -8.4, 1339, -3.8, 0.6, -48.3}}, {1600, { 0.6, -38.0, 1274, -13.2, 1337, -10.4, 0.6, -38.0}}, {1700, { 0.5, -21.6, 1208, -16.9, 1250, -15.2, 0.5, -21.6}}, {1800, { 0.4, 539.7, 1119, -17.8, 1143, -16.6, 0.4, 539.7}}, {1900, { 0.3, 35.4, 1027, -14.7, 1036, -13.7, 0.3, 35.4}}, {2000, { 0.3, 64.1, 989, -7.9, 998, -6.9, 0.3, 64.1}}, {2100, { 0.4, 76.1, 1045, 0.1, 1040, 1.0, 0.4, 76.1}}, {2200, { 0.6, 69.8, 1210, 5.3, 1197, 6.9, 0.6, 69.8}}, {2300, { 1.0, 55.9, 1460, 4.6, 1430, 5.4, 1.0, 55.9}}, {2400, { 1.2, 51.3, 1692, -2.8, 1640, -1.7, 1.2, 51.3}}, {2500, { 1.3, 72.6, 1730, -13.4, 1666, -11.5, 1.3, 72.6}}, {2600, { 1.3, 117.1, 1613, -49.6, 1556, -16.9, 1.3, 117.1}}, {2700, { 1.1, 222.5, 1371, -19.5, 1334, -16.1, 1.1, 222.5}}, {2800, { 1.1, 332.3, 1258, -8.9, 1243, -5.1, 1.1, 332.3}}, {2900, { 1.7, 356.1, 1474, 4.8, 1480, 8.4, 1.7, 356.1}}, {3000, { 2.8, 299.9, 2128, 6.6, 2143, 9.8, 2.8, 299.9}}, {3100, { 3.9, 309.4, 2813, -10.5, 2882, -7.1, 3.9, 309.4}}, {3200, { 4.4, 576.4, 2490, -27.7, 2487, -22.2, 4.4, 576.4}}, {3300, { 5.6, 1030.6, 2237, -17.4, 2385, -9.0, 5.6, 1030.6}}, {3400, {10.7, 570.2, 3882, -19.2, 4855, -14.9, 10.7, 570.2}}, {3500, {17.3, 83.5, 4116, -57.4, 4649, -63.5, 17.3, 83.5}}, {3600, {23.2, -130.6, 3057, -74.0, 3175, -78.6, 23.2, -130.6}}, {3700, {28.3, -153.9, 2432, -80.0, 2471, -83.1, 28.3, -153.9}}, {3800, {32.8, -292.4, 2055, -82.8, 2072, -85.1, 32.8, -292.4}}, {3900, {36.9, -249.9, 1803, -84.2, 1811, -86.1, 36.9, -249.9}}, {4000, {40.7, -356.2, 1621, -85.1, 1625, -86.7, 40.7, -356.2}} }; /* V.56bis ETSI LL-1, non-loaded loop */ struct { int freq; float ad[8]; } etsi_ll1[] = { { 200, {-0.78, 14.0, 1248.5, -9.7, 1248.5, -9.7, -0.78, 14.0}}, { 300, {-0.74, 10.0, 1220.9, -14.3, 1220.9, -14.3, -0.74, 10.0}}, { 400, {-0.68, 8.0, 1185.2, -18.6, 1185.2, -18.6, -0.68, 8.0}}, { 500, {-0.60, 7.0, 1143.9, -22.6, 1143.9, -22.6, -0.60, 7.0}}, { 600, {-0.51, 6.0, 1099.0, -26.2, 1099.0, -26.2, -0.51, 6.0}}, { 700, {-0.40, 5.6, 1052.5, -29.5, 1052.5, -29.5, -0.40, 5.6}}, { 800, {-0.28, 5.3, 1005.9, -32.4, 1005.9, -32.4, -0.28, 5.3}}, { 900, {-0.14, 5.0, 960.3, -35.0, 960.3, -35.0, -0.14, 5.0}}, {1000, { 4.7, 4.6, 916.4, -37.3, 916.4, -37.3, 4.7, 4.6}}, {1100, { 0.16, 4.3, 874.6, -39.3, 874.6, -39.3, 0.16, 4.3}}, {1200, { 0.33, 3.6, 835.3, -41.1, 835.3, -41.1, 0.33, 3.6}}, {1300, { 0.49, 2.6, 798.5, -42.6, 798.5, -42.6, 0.49, 2.6}}, {1400, { 0.67, 2.0, 764.2, -43.9, 764.2, -43.9, 0.67, 2.0}}, {1500, { 0.85, 1.0, 732.3, -45.1, 732.3, -45.1, 0.85, 1.0}}, {1600, { 1.04, 0.6, 702.7, -46.1, 702.7, -46.1, 1.04, 0.6}}, {1700, { 1.23, 0.3, 675.3, -47.0, 675.3, -47.0, 1.23, 0.3}}, {1800, { 1.43, 40.0, 649.8, -47.7, 649.8, -47.7, 1.43, 40.0}}, {1900, { 1.63, -1.0, 626.2, -48.4, 626.2, -48.4, 1.63, -1.0}}, {2000, { 1.83, -2.0, 604.3, -48.9, 604.3, -48.9, 1.83, -2.0}}, {2100, { 2.03, -3.3, 584.0, -49.4, 584.0, -49.4, 2.03, -3.3}}, {2200, { 2.23, -3.6, 565.1, -49.8, 565.1, -49.8, 2.23, -3.6}}, {2300, { 2.44, -4.3, 547.5, -50.1, 547.5, -50.1, 2.44, -4.3}}, {2400, { 2.64, -5.0, 531.1, -50.4, 531.1, -50.4, 2.64, -5.0}}, {2500, { 2.84, -6.1, 515.9, -50.6, 515.9, -50.6, 2.84, -6.1}}, {2600, { 3.05, -6.6, 501.6, -50.8, 501.6, -50.8, 3.05, -6.6}}, {2700, { 3.25, -7.3, 488.2, -51.0, 488.2, -51.0, 3.25, -7.3}}, {2800, { 3.45, -7.6, 475.7, -51.1, 475.7, -51.1, 3.45, -7.6}}, {2900, { 3.65, -8.3, 464.0, -51.1, 464.0, -51.1, 3.65, -8.3}}, {3000, { 3.85, -8.6, 453.0, -51.2, 453.0, -51.2, 3.85, -8.6}}, {3100, { 4.04, -9.3, 442.6, -51.2, 442.6, -51.2, 4.04, -9.3}}, {3200, { 4.24, -10.3, 432.9, -51.2, 432.9, -51.2, 4.24, -10.3}}, {3300, { 4.43, -10.6, 423.7, -51.2, 423.7, -51.2, 4.43, -10.6}}, {3400, { 4.62, -11.3, 415.1, -51.2, 415.1, -51.2, 4.62, -11.3}}, {3500, { 4.81, -11.6, 406.9, -51.1, 406.9, -51.1, 4.81, -11.6}}, {3600, { 5.00, -12.3, 399.1, -51.1, 399.1, -51.1, 5.00, -12.3}}, {3700, { 5.19, -13.0, 391.8, -51.0, 391.8, -51.0, 5.19, -13.0}}, {3800, { 5.37, -13.4, 384.9, -51.0, 384.9, -51.0, 5.37, -13.4}}, {3900, { 5.56, -13.8, 378.3, -50.9, 378.3, -50.9, 5.56, -13.8}}, {4000, { 5.74, -14.4, 372.0, -50.8, 372.0, -50.8, 5.74, -14.4}} }; /* V.56bis ETSI LL-2, non-loaded loop */ struct { int freq; float ad[8]; } etsi_ll2[] = { { 200, {-0.10, 15.0, 850.3, -3.4, 850.3, -3.4, -0.10, 15.0}}, { 300, {-0.09, 8.0, 848.1, -5.1, 848.1, -5.1, -0.09, 8.0}}, { 400, {-0.09, 7.0, 845.1, -6.7, 845.1, -6.7, -0.09, 7.0}}, { 500, {-0.08, 5.0, 841.3, -8.4, 841.3, -8.4, -0.08, 5.0}}, { 600, {-0.07, 4.6, 836.7, -10.0, 836.7, -10.0, -0.07, 4.6}}, { 700, {-0.06, 4.3, 831.3, -11.6, 831.3, -11.6, -0.06, 4.3}}, { 800, {-0.04, 3.8, 825.3, -13.2, 825.3, -13.2, -0.04, 3.8}}, { 900, {-0.02, 3.4, 818.6, -14.8, 818.6, -14.8, -0.02, 3.4}}, {1000, { 1.80, 3.0, 811.4, -16.3, 811.4, -16.3, 1.8, 3.0}}, {1100, { 0.02, 2.6, 803.6, -17.8, 803.6, -17.8, 0.02, 2.6}}, {1200, { 0.04, 2.3, 795.3, -19.3, 795.3, -19.3, 0.04, 2.3}}, {1300, { 0.06, 1.3, 786.6, -20.7, 786.6, -20.7, 0.06, 1.3}}, {1400, { 0.09, 0.9, 777.5, -22.1, 777.5, -22.1, 0.09, 0.9}}, {1500, { 0.12, 0.6, 768.1, -23.5, 768.1, -23.5, 0.12, 0.6}}, {1600, { 0.15, 0.3, 758.4, -24.8, 758.4, -24.8, 0.15, 0.3}}, {1700, { 0.18, 0.0, 748.4, -26.1, 748.4, -26.1, 0.18, 0.0}}, {1800, { 0.21, 15, 738.4, -27.3, 738.4, -27.3, 0.21, 15.0}}, {1900, { 0.24, -1.0, 728.1, -28.5, 728.1, -28.5, 0.24, -1.0}}, {2000, { 0.28, -2.3, 717.8, -29.7, 717.8, -29.7, 0.28, -2.3}}, {2100, { 0.32, -2.6, 707.4, -30.8, 707.4, -30.8, 0.32, -2.6}}, {2200, { 0.36, -3.0, 697.0, -31.9, 697.0, -31.9, 0.36, -3.0}}, {2300, { 0.40, -3.3, 686.6, -33.0, 686.6, -33.0, 0.40, -3.3}}, {2400, { 0.44, -3.6, 676.2, -34.0, 676.2, -34.0, 0.44, -3.6}}, {2500, { 0.48, -4.5, 665.9, -35.0, 665.9, -35.0, 0.48, -4.5}}, {2600, { 0.53, -5.4, 655.6, -35.9, 655.6, -35.9, 0.53, -5.4}}, {2700, { 0.57, -6.3, 645.5, -36.8, 645.5, -36.8, 0.57, -6.3}}, {2800, { 0.62, -6.6, 635.5, -37.7, 635.5, -37.7, 0.62, -6.6}}, {2900, { 0.67, -6.9, 625.6, -38.6, 625.6, -38.6, 0.67, -6.9}}, {3000, { 0.72, -7.5, 615.8, -39.4, 615.8, -39.4, 0.72, -7.5}}, {3100, { 0.77, -8.3, 606.2, -40.2, 606.2, -40.2, 0.77, -8.3}}, {3200, { 0.82, -8.6, 596.7, -40.9, 596.7, -40.9, 0.82, -8.6}}, {3300, { 0.87, -9.3, 587.4, -41.6, 587.4, -41.6, 0.87, -9.3}}, {3400, { 0.92, -9.6, 578.3, -42.3, 578.3, -42.3, 0.92, -9.6}}, {3500, { 0.98, -10.3, 569.3, -43.0, 569.3, -43.0, 0.98, -10.3}}, {3600, { 1.03, -10.6, 560.6, -43.7, 560.6, -43.7, 1.03, -10.6}}, {3700, { 1.09, -11.3, 552.0, -44.3, 552.0, -44.3, 1.09, -11.3}}, {3800, { 1.14, -11.6, 543.5, -44.9, 543.5, -44.9, 1.14, -11.6}}, {3900, { 1.20, -12.3, 535.3, -45.4, 535.3, -45.4, 1.20, -12.3}}, {4000, { 1.26, -13.3, 527.2, -46.0, 527.2, -46.0, 1.26, -13.3}} }; /* V.56bis AD-1 AD-5 AD-6 AD-7 AD-8 AD-9 */ struct { int freq; float ad[6]; } ad[] = { { 0, {90.0, 90.0, 90.0, 90.0, 90.0, 90.0}}, { 200, { 6.0, 3.2, 3.0, 2.9, 11.6, 23.3}}, { 300, { 1.3, 1.4, 1.2, 1.1, 6.9, 13.9}}, { 400, { 0.0, 0.4, 0.3, 0.3, 4.0, 7.9}}, { 500, { 0.0, -0.1, 0.0, 0.1, 2.0, 4.1}}, { 600, { 0.0, -0.1, 0.0, 0.1, 1.2, 2.4}}, { 700, { 0.0, 0.1, 0.0, 0.0, 0.8, 1.7}}, { 800, { 0.0, 0.0, 0.0, -0.1, 0.5, 1.1}}, { 900, { 0.0, 0.0, 0.0, -0.1, 0.2, 0.4}}, {1000, { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}, {1100, { 0.0, 0.0, 0.1, 0.0, -0.1, -0.2}}, {1200, { 0.0, 0.0, 0.1, 0.1, -0.1, -0.2}}, {1300, { 0.0, 0.1, 0.2, 0.3, -0.1, -0.2}}, {1400, { 0.0, 0.2, 0.3, 0.4, -0.1, -0.3}}, {1500, { 0.0, 0.2, 0.3, 0.4, -0.2, -0.4}}, {1600, { 0.0, 0.3, 0.5, 0.5, -0.1, -0.3}}, {1700, { 0.0, 0.3, 0.5, 0.6, -0.1, -0.1}}, {1800, { 0.0, 0.3, 0.5, 0.6, 0.0, 0.0}}, {1900, { 0.0, 0.4, 0.7, 0.7, 0.1, 0.2}}, {2000, { 0.0, 0.5, 0.8, 0.9, 0.2, 0.5}}, {2100, { 0.1, 0.6, 1.0, 1.0, 0.5, 0.9}}, {2200, { 0.2, 0.7, 1.1, 1.1, 0.6, 1.1}}, {2300, { 0.3, 0.9, 1.2, 1.4, 0.8, 1.5}}, {2400, { 0.4, 1.1, 1.5, 1.6, 0.9, 1.8}}, {2500, { 0.5, 1.3, 1.8, 2.0, 1.1, 2.3}}, {2600, { 0.6, 1.6, 2.4, 2.7, 1.4, 2.8}}, {2700, { 0.7, 2.0, 3.0, 3.5, 1.7, 3.4}}, {2800, { 0.7, 2.3, 3.5, 4.3, 2.0, 4.0}}, {2900, { 0.9, 2.8, 4.2, 5.0, 2.4, 4.9}}, {3000, { 1.1, 3.2, 4.9, 5.8, 3.0, 5.9}}, {3100, { 1.2, 3.5, 5.6, 6.7, 3.4, 6.8}}, {3200, { 1.3, 4.1, 6.7, 8.0, 3.9, 7.7}}, {3300, { 1.6, 4.8, 8.0, 9.6, 4.6, 9.2}}, {3400, { 1.8, 5.3, 9.1, 11.0, 5.4, 10.7}}, {3500, { 2.4, 5.7, 10.3, 12.2, 6.3, 12.6}}, {3600, { 3.0, 6.6, 12.1, 13.9, 7.8, 15.5}}, {3700, { 5.7, 8.9, 15.8, 17.3, 10.3, 20.5}}, {3800, {13.5, 15.7, 24.4, 25.7, 16.2, 32.4}}, {3900, {31.2, 31.1, 42.2, 43.3, 29.9, 59.9}}, {4000, {31.2, 31.1, 42.2, 43.3, 29.9, 59.9}} }; /* V.56bis EDD-1 EDD-2 EDD-3 */ struct { int freq; float edd[3]; } edd[] = { { 0, {3.98, 3.76, 8.00}}, { 200, {3.98, 3.76, 8.00}}, { 300, {2.70, 3.76, 8.00}}, { 400, {1.69, 2.20, 6.90}}, { 500, {1.15, 1.36, 5.50}}, { 600, {0.80, 0.91, 4.40}}, { 700, {0.60, 0.64, 3.40}}, { 800, {0.50, 0.46, 2.80}}, { 900, {0.40, 0.34, 2.00}}, {1000, {0.30, 0.24, 1.50}}, {1100, {0.20, 0.16, 1.00}}, {1200, {0.20, 0.11, 0.70}}, {1300, {0.10, 0.07, 0.40}}, {1400, {0.05, 0.05, 0.30}}, {1500, {0.00, 0.03, 0.20}}, {1600, {0.00, 0.01, 0.10}}, {1700, {0.00, 0.00, 0.10}}, {1800, {0.00, 0.00, 0.00}}, {1900, {0.00, 0.02, 0.10}}, {2000, {0.00, 0.04, 0.10}}, {2100, {0.02, 0.08, 0.10}}, {2200, {0.02, 0.12, 0.20}}, {2300, {0.02, 0.16, 0.20}}, {2400, {0.02, 0.20, 0.30}}, {2500, {0.10, 0.27, 0.40}}, {2600, {0.12, 0.36, 0.50}}, {2700, {0.15, 0.47, 0.80}}, {2800, {0.20, 0.60, 1.10}}, {2900, {0.27, 0.77, 1.50}}, {3000, {0.40, 1.01, 2.00}}, {3100, {0.56, 1.32, 2.60}}, {3200, {0.83, 1.78, 3.20}}, {3300, {1.07, 1.78, 4.00}}, {3400, {1.39, 1.78, 4.00}}, {3500, {1.39, 1.78, 4.00}}, {3600, {1.39, 1.78, 4.00}}, {3700, {1.39, 1.78, 4.00}}, {3800, {1.39, 1.78, 4.00}}, {3900, {1.39, 1.78, 4.00}}, {4000, {1.39, 1.78, 4.00}} }; /* V.56bis PCM AD-1, AD-2, AD-3 */ struct { int freq; float ad[3]; } pcm_ad[] = { { 50, {41.4, 77.8, 114.2}}, { 100, {15.5, 27.7, 39.9}}, { 150, { 3.7, 6.1, 8.6}}, { 200, { 0.5, 0.8, 1.0}}, { 250, {-0.2, -0.2, -0.3}}, { 300, {-0.2, -0.3, -0.4}}, { 400, { 0.0, -0.2, -0.3}}, { 500, {-0.2, -0.4, -0.5}}, { 600, {-0.2, -0.3, -0.5}}, { 700, {-0.2, -0.3, -0.5}}, { 800, {-0.2, -0.4, -0.5}}, { 900, {-0.2, -0.3, -0.4}}, {1000, {-0.1, -0.2, -0.3}}, {1100, {-0.2, -0.3, -0.3}}, {1200, {-0.2, -0.3, -0.4}}, {1300, {-0.2, -0.3, -0.5}}, {1400, {-0.1, -0.3, -0.4}}, {1500, {-0.1, -0.3, -0.4}}, {1600, {-0.1, -0.2, -0.3}}, {1700, {-0.1, -0.3, -0.4}}, {1800, {-0.2, -0.3, -0.4}}, {1900, {-0.2, -0.3, -0.3}}, {2000, {-0.1, -0.2, -0.3}}, {2100, {-0.1, -0.2, -0.3}}, {2200, {-0.1, -0.3, -0.4}}, {2300, {-0.1, -0.1, -0.2}}, {2400, {-0.1, -0.1, -0.2}}, {2500, { 0.0, -0.1, -0.1}}, {2600, { 0.0, -0.1, -0.1}}, {2700, { 0.0, 0.0, 0.1}}, {2800, { 0.0, 0.0, 0.1}}, {2900, { 0.1, 0.2, 0.2}}, {3000, { 0.0, 0.0, 0.1}}, {3100, { 0.0, 0.0, 0.0}}, {3200, { 0.0, 0.0, 0.1}}, {3300, { 0.3, 0.7, 1.0}}, {3400, { 1.2, 2.4, 3.6}}, {3500, { 3.2, 6.3, 9.5}}, {3550, { 5.0, 9.6, 14.3}}, {3600, { 7.0, 13.5, 19.9}}, {3650, {10.0, 18.7, 27.5}}, {3700, {13.4, 24.6, 35.8}}, {3750, {18.1, 32.1, 46.2}}, {3800, {24.3, 41.2, 58.2}}, {3850, {32.5, 52.6, 72.7}}, {3900, {43.4, 66.6, 89.8}}, {4000, {43.4, 66.6, 89.8}} }; /* V.56bis PCM EDD-1, EDD-2, EDD-3 */ struct { int freq; float edd[3]; } pcm_edd[] = { { 150, { 2.76, 5.5, 8.3}}, { 200, { 1.70, 3.4, 5.1}}, { 250, { 0.92, 1.8, 2.8}}, { 300, { 0.55, 1.1, 1.7}}, { 400, { 0.25, 0.5, 0.7}}, { 500, { 0.12, 0.2, 0.4}}, { 600, { 0.06, 0.1, 0.2}}, { 700, { 0.03, 0.1, 0.1}}, { 800, { 0.01, 0.0, 0.0}}, { 900, { 0.00, 0.0, 0.0}}, {1000, {-0.01, 0.0, 0.0}}, {1100, {-0.01, 0.0, 0.0}}, {1200, {-0.02, 0.0, -0.1}}, {1300, {-0.02, 0.0, -0.1}}, {1400, {-0.01, 0.0, 0.0}}, {1500, {-0.01, 0.0, 0.0}}, {1600, { 0.00, 0.0, 0.0}}, {1700, { 0.00, 0.0, 0.0}}, {1800, { 0.01, 0.0, 0.0}}, {1900, { 0.02, 0.0, 0.0}}, {2000, { 0.02, 0.0, 0.1}}, {2100, { 0.04, 0.1, 0.1}}, {2200, { 0.05, 0.1, 0.2}}, {2300, { 0.06, 0.1, 0.2}}, {2400, { 0.07, 0.1, 0.2}}, {2500, { 0.10, 0.2, 0.3}}, {2600, { 0.11, 0.2, 0.3}}, {2700, { 0.14, 0.3, 0.4}}, {2800, { 0.18, 0.4, 0.5}}, {2900, { 0.22, 0.4, 0.6}}, {3000, { 0.27, 0.5, 0.8}}, {3100, { 0.34, 0.7, 1.0}}, {3200, { 0.45, 0.9, 1.4}}, {3250, { 0.52, 1.0, 1.6}}, {3300, { 0.60, 1.2, 1.8}}, {3350, { 0.66, 1.3, 2.0}}, {3400, { 0.74, 1.5, 2.2}}, {3450, { 0.79, 1.6, 2.4}}, {3500, { 0.83, 1.7, 2.5}}, {3550, { 0.84, 1.7, 2.5}}, {3600, { 0.81, 1.6, 2.4}}, {3700, { 0.81, 1.6, 2.4}}, {3800, { 0.81, 1.6, 2.4}}, {3900, { 0.81, 1.6, 2.4}}, {4000, { 0.81, 1.6, 2.4}} }; FILE *outfile; float impulse_responses[100][LINE_FILTER_SIZE]; int filter_sets = 0; static void generate_ad_edd(void) { float f; float offset; float amp; float phase; float delay; float pw; #if defined(HAVE_FFTW3_H) double in[FFT_SIZE][2]; double out[FFT_SIZE][2]; #else fftw_complex in[FFT_SIZE]; fftw_complex out[FFT_SIZE]; #endif fftw_plan p; int i; int j; int k; int l; #if defined(HAVE_FFTW3_H) p = fftw_plan_dft_1d(FFT_SIZE, in, out, FFTW_BACKWARD, FFTW_ESTIMATE); #else p = fftw_create_plan(FFT_SIZE, FFTW_BACKWARD, FFTW_ESTIMATE); #endif for (j = 0; j < 6; j++) { for (k = 0; k < 3; k++) { for (i = 0; i < FFT_SIZE; i++) { #if defined(HAVE_FFTW3_H) in[i][0] = in[i][1] = 0.0f; #else in[i].re = in[i].im = 0.0f; #endif } for (i = 1; i < FFT_SIZE/2; i++) { f = (float) i*SAMPLE_RATE/FFT_SIZE; amp = 0.0f; for (l = 0; l < (int) (sizeof(ad)/sizeof(ad[0])); l++) { if (f < ad[l].freq) break; } if (l < (int) (sizeof(ad)/sizeof(ad[0]))) { offset = (f - ad[l - 1].freq)/(ad[l].freq - ad[l - 1].freq); amp = (1.0 - offset)*ad[l - 1].ad[j] + offset*ad[l].ad[j]; amp = pow(10.0, -amp/20.0); } delay = 0.0f; for (l = 0; l < (int) (sizeof(edd)/sizeof(edd[0])); l++) { if (f < edd[l].freq) break; } if (l < (int) (sizeof(edd)/sizeof(edd[0]))) { offset = (f - edd[l - 1].freq)/(edd[l].freq - edd[l - 1].freq); delay = (1.0f - offset)*edd[l - 1].edd[k] + offset*edd[l].edd[k]; } phase = 2.0f*M_PI*f*delay*0.001f; #if defined(HAVE_FFTW3_H) in[i][0] = amp*cosf(phase); in[i][1] = amp*sinf(phase); in[FFT_SIZE - i][0] = in[i][0]; in[FFT_SIZE - i][1] = -in[i][1]; #else in[i].re = amp*cosf(phase); in[i].im = amp*sinf(phase); in[FFT_SIZE - i].re = in[i].re; in[FFT_SIZE - i].im = -in[i].im; #endif } #if 0 for (i = 0; i < FFT_SIZE; i++) fprintf(outfile, "%5d %15.5f,%15.5f\n", i, in[i].re, in[i].im); #endif #if defined(HAVE_FFTW3_H) fftw_execute(p); #else fftw_one(p, in, out); #endif fprintf(outfile, "/* V.56bis AD-%d, EDD%d */\n", (j == 0) ? 1 : j + 4, k + 1); fprintf(outfile, "float ad_%d_edd_%d_model[] =\n", (j == 0) ? 1 : j + 4, k + 1); fprintf(outfile, "{\n"); /* Normalise the filter's gain */ pw = 0.0f; l = FFT_SIZE - (LINE_FILTER_SIZE - 1)/2; for (i = 0; i < LINE_FILTER_SIZE; i++) { #if defined(HAVE_FFTW3_H) pw += out[l][0]*out[l][0]; #else pw += out[l].re*out[l].re; #endif if (++l == FFT_SIZE) l = 0; } pw = sqrt(pw); l = FFT_SIZE - (LINE_FILTER_SIZE - 1)/2; for (i = 0; i < LINE_FILTER_SIZE; i++) { #if defined(HAVE_FFTW3_H) impulse_responses[filter_sets][i] = out[l][0]/pw; #else impulse_responses[filter_sets][i] = out[l].re/pw; #endif fprintf(outfile, "%15.5f,\n", impulse_responses[filter_sets][i]); if (++l == FFT_SIZE) l = 0; } fprintf(outfile, "};\n\n"); filter_sets++; } } } static void generate_proakis(void) { float f; float f1; float offset; float amp; float phase; float delay; float pw; int index; int i; int l; #if defined(HAVE_FFTW3_H) double in[FFT_SIZE][2]; double out[FFT_SIZE][2]; #else fftw_complex in[FFT_SIZE]; fftw_complex out[FFT_SIZE]; #endif fftw_plan p; #if defined(HAVE_FFTW3_H) p = fftw_plan_dft_1d(FFT_SIZE, in, out, FFTW_BACKWARD, FFTW_ESTIMATE); #else p = fftw_create_plan(FFT_SIZE, FFTW_BACKWARD, FFTW_ESTIMATE); #endif for (i = 0; i < FFT_SIZE; i++) { #if defined(HAVE_FFTW3_H) in[i][0] = in[i][1] = 0.0f; #else in[i].re = in[i].im = 0.0f; #endif } for (i = 1; i < FFT_SIZE/2; i++) { f = (float) i*SAMPLE_RATE/FFT_SIZE; f1 = f/200.0f; offset = f1 - floor(f1); index = (int) floor(f1); /* Linear interpolation */ amp = ((1.0f - offset)*proakis[index].amp + offset*proakis[index + 1].amp)/2.3f; delay = (1.0f - offset)*proakis[index].delay + offset*proakis[index + 1].delay; phase = 2.0f*M_PI*f*delay*0.001f; #if defined(HAVE_FFTW3_H) in[i][0] = amp*cosf(phase); in[i][1] = amp*sinf(phase); in[FFT_SIZE - i][0] = in[i][0]; in[FFT_SIZE - i][1] = -in[i][1]; #else in[i].re = amp*cosf(phase); in[i].im = amp*sinf(phase); in[FFT_SIZE - i].re = in[i].re; in[FFT_SIZE - i].im = -in[i].im; #endif } #if defined(HAVE_FFTW3_H) fftw_execute(p); #else fftw_one(p, in, out); #endif fprintf(outfile, "/* Medium range telephone line response\n"); fprintf(outfile, " (from p 537, Digital Communication, John G. Proakis */\n"); fprintf(outfile, "float proakis_line_model[] =\n"); fprintf(outfile, "{\n"); /* Normalise the filter's gain */ pw = 0.0f; l = FFT_SIZE - (LINE_FILTER_SIZE - 1)/2; for (i = 0; i < LINE_FILTER_SIZE; i++) { #if defined(HAVE_FFTW3_H) pw += out[l][0]*out[l][0]; #else pw += out[l].re*out[l].re; #endif if (++l == FFT_SIZE) l = 0; } pw = sqrt(pw); l = FFT_SIZE - (LINE_FILTER_SIZE - 1)/2; for (i = 0; i < LINE_FILTER_SIZE; i++) { #if defined(HAVE_FFTW3_H) impulse_responses[filter_sets][i] = out[l][0]/pw; #else impulse_responses[filter_sets][i] = out[l].re/pw; #endif fprintf(outfile, "%15.5f,\n", impulse_responses[filter_sets][i]); if (++l == FFT_SIZE) l = 0; } fprintf(outfile, "};\n\n"); filter_sets++; } int main(int argc, char *argv[]) { int i; int j; if ((outfile = fopen(LINE_MODEL_FILE_NAME, "w")) == NULL) { fprintf(stderr, "Failed to open %s\n", "line_model.txt"); exit(2); } generate_proakis(); generate_ad_edd(); fclose(outfile); if (argc > 1) { for (i = 0; i < LINE_FILTER_SIZE; i++) { printf("%d, ", i); for (j = 0; j < filter_sets; j++) { printf("%15.5f, ", impulse_responses[j][i]); } printf("\n"); } } return 0; } iaxmodem-1.2.0/lib/spandsp/spandsp-sim/line_model.c0000644000175000017500000003326511150047216021610 0ustar julienjulien/* * SpanDSP - a series of DSP components for telephony * * line_model.c - Model a telephone line. * * Written by Steve Underwood * * Copyright (C) 2004 Steve Underwood * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2, as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: line_model.c,v 1.6 2008/07/02 14:48:25 steveu Exp $ */ #if defined(HAVE_CONFIG_H) #include "config.h" #endif #include #include #include #include #include #include #include #include #include "floating_fudge.h" #if defined(HAVE_TGMATH_H) #include #endif #if defined(HAVE_MATH_H) #define GEN_CONST #include #endif #include "spandsp.h" #include "spandsp-sim.h" #include "spandsp/g168models.h" #if !defined(NULL) #define NULL (void *) 0 #endif float null_line_model[] = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0 }; static float *models[] = { null_line_model, /* 0 */ proakis_line_model, ad_1_edd_1_model, ad_1_edd_2_model, ad_1_edd_3_model, ad_5_edd_1_model, /* 5 */ ad_5_edd_2_model, ad_5_edd_3_model, ad_6_edd_1_model, ad_6_edd_2_model, ad_6_edd_3_model, /* 10 */ ad_7_edd_1_model, ad_7_edd_2_model, ad_7_edd_3_model, ad_8_edd_1_model, ad_8_edd_2_model, /* 15 */ ad_8_edd_3_model, ad_9_edd_1_model, ad_9_edd_2_model, ad_9_edd_3_model }; static float calc_near_line_filter(one_way_line_model_state_t *s, float v) { float sum; int j; int p; /* Add the sample in the filter buffer */ p = s->near_buf_ptr; s->near_buf[p] = v; if (++p == s->near_filter_len) p = 0; s->near_buf_ptr = p; /* Apply the filter */ sum = 0; for (j = 0; j < s->near_filter_len; j++) { sum += s->near_filter[j]*s->near_buf[p]; if (++p >= s->near_filter_len) p = 0; } /* Add noise */ sum += awgn(&s->near_noise); return sum; } /*- End of function --------------------------------------------------------*/ static float calc_far_line_filter(one_way_line_model_state_t *s, float v) { float sum; int j; int p; /* Add the sample in the filter buffer */ p = s->far_buf_ptr; s->far_buf[p] = v; if (++p == s->far_filter_len) p = 0; s->far_buf_ptr = p; /* Apply the filter */ sum = 0; for (j = 0; j < s->far_filter_len; j++) { sum += s->far_filter[j]*s->far_buf[p]; if (++p >= s->far_filter_len) p = 0; } /* Add noise */ sum += awgn(&s->far_noise); return sum; } /*- End of function --------------------------------------------------------*/ void one_way_line_model(one_way_line_model_state_t *s, int16_t output[], const int16_t input[], int samples) { int i; float in; float out; float out1; int16_t amp[1]; /* The path being modelled is: terminal | < hybrid | | < noise and filtering | | < hybrid CO | | < A-law distortion + bulk delay | CO | < hybrid | | < noise and filtering | | < hybrid terminal */ for (i = 0; i < samples; i++) { in = input[i]; /* Near end analogue section */ /* Line model filters & noise */ out = calc_near_line_filter(s, in); /* Long distance digital section */ amp[0] = out; codec_munge(s->munge, amp, 1); out = amp[0]; /* Introduce the bulk delay of the long distance link. */ out1 = s->bulk_delay_buf[s->bulk_delay_ptr]; s->bulk_delay_buf[s->bulk_delay_ptr] = out; out = out1; if (++s->bulk_delay_ptr >= s->bulk_delay) s->bulk_delay_ptr = 0; /* Far end analogue section */ /* Line model filters & noise */ out = calc_far_line_filter(s, out); if (s->mains_interference) { tone_gen(&s->mains_tone, amp, 1); out += amp[0]; } output[i] = out + s->dc_offset; } } /*- End of function --------------------------------------------------------*/ void one_way_line_model_set_dc(one_way_line_model_state_t *s, float dc) { s->dc_offset = dc; } /*- End of function --------------------------------------------------------*/ void one_way_line_model_set_mains_pickup(one_way_line_model_state_t *s, int f, float level) { tone_gen_descriptor_t mains_tone_desc; if (f) { make_tone_gen_descriptor(&mains_tone_desc, f, (int) (level - 10.0f), f*3, (int) level, 1, 0, 0, 0, TRUE); tone_gen_init(&s->mains_tone, &mains_tone_desc); } s->mains_interference = f; } /*- End of function --------------------------------------------------------*/ void both_ways_line_model(both_ways_line_model_state_t *s, int16_t output1[], const int16_t input1[], int16_t output2[], const int16_t input2[], int samples) { int i; float in1; float in2; float out1; float out2; float tmp1; float tmp2; int16_t amp[1]; /* The path being modelled is: terminal | < hybrid echo | | < noise and filtering | | < hybrid echo CO | | < A-law distortion + bulk delay | CO | < hybrid echo | | < noise and filtering | | < hybrid echo terminal */ for (i = 0; i < samples; i++) { in1 = input1[i]; in2 = input2[i]; /* Near end analogue sections */ /* Echo from each terminal's CO hybrid */ tmp1 = in1 + s->fout2*s->line1.near_co_hybrid_echo; tmp2 = in2 + s->fout1*s->line2.near_co_hybrid_echo; /* Line model filters & noise */ s->fout1 = calc_near_line_filter(&s->line1, tmp1); s->fout2 = calc_near_line_filter(&s->line2, tmp2); /* Long distance digital section */ /* Introduce distortion due to A-law or u-law munging. */ amp[0] = s->fout1; codec_munge(s->line1.munge, amp, 1); s->fout1 = amp[0]; amp[0] = s->fout2; codec_munge(s->line2.munge, amp, 1); s->fout2 = amp[0]; /* Introduce the bulk delay of the long distance digital link. */ out1 = s->line1.bulk_delay_buf[s->line1.bulk_delay_ptr]; s->line1.bulk_delay_buf[s->line1.bulk_delay_ptr] = s->fout1; s->fout1 = out1; if (++s->line1.bulk_delay_ptr >= s->line1.bulk_delay) s->line1.bulk_delay_ptr = 0; out2 = s->line2.bulk_delay_buf[s->line2.bulk_delay_ptr]; s->line2.bulk_delay_buf[s->line2.bulk_delay_ptr] = s->fout2; s->fout2 = out2; if (++s->line2.bulk_delay_ptr >= s->line2.bulk_delay) s->line2.bulk_delay_ptr = 0; /* Far end analogue sections */ /* Echo from each terminal's own hybrid */ out1 += in2*s->line1.far_cpe_hybrid_echo; out2 += in1*s->line2.far_cpe_hybrid_echo; /* Line model filters & noise */ out1 = calc_far_line_filter(&s->line1, out1); out2 = calc_far_line_filter(&s->line2, out2); output1[i] = fsaturate(out1 + s->line1.dc_offset); output2[i] = fsaturate(out2 + s->line2.dc_offset); } } /*- End of function --------------------------------------------------------*/ void both_ways_line_model_set_dc(both_ways_line_model_state_t *s, float dc1, float dc2) { s->line1.dc_offset = dc1; s->line2.dc_offset = dc2; } /*- End of function --------------------------------------------------------*/ void both_ways_line_model_set_mains_pickup(both_ways_line_model_state_t *s, int f, float level1, float level2) { tone_gen_descriptor_t mains_tone_desc; if (f) { make_tone_gen_descriptor(&mains_tone_desc, f, (int) (level1 - 10.0f), f*3, (int) level1, 1, 0, 0, 0, TRUE); tone_gen_init(&s->line1.mains_tone, &mains_tone_desc); make_tone_gen_descriptor(&mains_tone_desc, f, (int) (level2 - 10.0f), f*3, (int) level2, 1, 0, 0, 0, TRUE); tone_gen_init(&s->line2.mains_tone, &mains_tone_desc); } s->line1.mains_interference = f; s->line2.mains_interference = f; } /*- End of function --------------------------------------------------------*/ one_way_line_model_state_t *one_way_line_model_init(int model, float noise, int codec, int rbs_pattern) { one_way_line_model_state_t *s; if ((s = (one_way_line_model_state_t *) malloc(sizeof(*s))) == NULL) return NULL; memset(s, 0, sizeof(*s)); s->bulk_delay = 8; s->bulk_delay_ptr = 0; s->munge = codec_munge_init(codec, rbs_pattern); s->near_filter = models[model]; s->near_filter_len = 129; s->far_filter = models[model]; s->far_filter_len = 129; awgn_init_dbm0(&s->near_noise, 1234567, noise); awgn_init_dbm0(&s->far_noise, 1234567, noise); s->dc_offset = 0.0f; s->mains_interference = 0; return s; } /*- End of function --------------------------------------------------------*/ int one_way_line_model_release(one_way_line_model_state_t *s) { free(s); return 0; } /*- End of function --------------------------------------------------------*/ both_ways_line_model_state_t *both_ways_line_model_init(int model1, float noise1, int model2, float noise2, int codec, int rbs_pattern) { float echo_level; both_ways_line_model_state_t *s; if ((s = (both_ways_line_model_state_t *) malloc(sizeof(*s))) == NULL) return NULL; memset(s, 0, sizeof(*s)); s->line1.munge = codec_munge_init(codec, rbs_pattern); s->line2.munge = codec_munge_init(codec, rbs_pattern); s->line1.bulk_delay = 8; s->line2.bulk_delay = 8; s->line1.bulk_delay_ptr = 0; s->line2.bulk_delay_ptr = 0; s->line1.near_filter = models[model1]; s->line1.near_filter_len = 129; s->line2.near_filter = models[model2]; s->line2.near_filter_len = 129; s->line1.far_filter = models[model1]; s->line1.far_filter_len = 129; s->line2.far_filter = models[model2]; s->line2.far_filter_len = 129; awgn_init_dbm0(&s->line1.near_noise, 1234567, noise1); awgn_init_dbm0(&s->line2.near_noise, 7654321, noise2); awgn_init_dbm0(&s->line1.far_noise, 1234567, noise1); awgn_init_dbm0(&s->line2.far_noise, 7654321, noise2); s->line1.dc_offset = 0.0f; s->line2.dc_offset = 0.0f; s->line1.mains_interference = 0; s->line2.mains_interference = 0; /* Echos */ echo_level = -15; /* in dB */ s->line1.near_co_hybrid_echo = pow(10, echo_level/20.0); s->line2.near_co_hybrid_echo = pow(10, echo_level/20.0); s->line1.near_cpe_hybrid_echo = pow(10, echo_level/20.0); s->line2.near_cpe_hybrid_echo = pow(10, echo_level/20.0); return s; } /*- End of function --------------------------------------------------------*/ int both_ways_line_model_release(both_ways_line_model_state_t *s) { free(s); return 0; } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ iaxmodem-1.2.0/lib/spandsp/COPYING0000644000175000017500000012706311150047216016132 0ustar julienjulienThe spandsp library is licenced under LGPL 2.1. The test suite, and some of the supporting code, are licenced under GPL 2. The full text of both licences may be found below. GNU LESSER GENERAL PUBLIC LICENSE Version 2.1, February 1999 Copyright (C) 1991, 1999 Free Software Foundation, Inc. 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. [This is the first released version of the Lesser GPL. It also counts as the successor of the GNU Library Public License, version 2, hence the version number 2.1.] Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below. When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things. To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it. For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights. We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library. To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others. Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license. Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs. When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library. We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances. For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License. In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system. Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library. The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run. GNU LESSER GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you". A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) "Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. 1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) The modified work must itself be a software library. b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. This option is useful when you wish to copy part of the code of the Library into a program that is not a library. 4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. 5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. 6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with. c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. 10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License. 11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 13. The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Libraries If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License). To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Also add information on how to contact you by electronic and paper mail. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the library `Frob' (a library for tweaking knobs) written by James Random Hacker. , 1 April 1990 Ty Coon, President of Vice That's all there is to it! GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. iaxmodem-1.2.0/lib/spandsp/INSTALL0000644000175000017500000001722711150047217016131 0ustar julienjulienBasic Installation ================== These are generic installation instructions. The `configure' shell script attempts to guess correct values for various system-dependent variables used during compilation. It uses those values to create a `Makefile' in each directory of the package. It may also create one or more `.h' files containing system-dependent definitions. Finally, it creates a shell script `config.status' that you can run in the future to recreate the current configuration, a file `config.cache' that saves the results of its tests to speed up reconfiguring, and a file `config.log' containing compiler output (useful mainly for debugging `configure'). If you need to do unusual things to compile the package, please try to figure out how `configure' could check whether to do them, and mail diffs or instructions to the address given in the `README' so they can be considered for the next release. If at some point `config.cache' contains results you don't want to keep, you may remove or edit it. The file `configure.ac' is used to create `configure' by a program called `autoconf'. You only need `configure.ac' if you want to change it or regenerate `configure' using a newer version of `autoconf'. The simplest way to compile this package is: 1. `cd' to the directory containing the package's source code and type `./configure' to configure the package for your system. If you're using `csh' on an old version of System V, you might need to type `sh ./configure' instead to prevent `csh' from trying to execute `configure' itself. Running `configure' takes awhile. While running, it prints some messages telling which features it is checking for. 2. Type `make' to compile the package. 3. Optionally, type `make check' to run any self-tests that come with the package. 4. Type `make install' to install the programs and any data files and documentation. 5. You can remove the program binaries and object files from the source code directory by typing `make clean'. To also remove the files that `configure' created (so you can compile the package for a different kind of computer), type `make distclean'. There is also a `make maintainer-clean' target, but that is intended mainly for the package's developers. If you use it, you may have to get all sorts of other programs in order to regenerate files that came with the distribution. Compilers and Options ===================== Some systems require unusual options for compilation or linking that the `configure' script does not know about. You can give `configure' initial values for variables by setting them in the environment. Using a Bourne-compatible shell, you can do that on the command line like this: CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure Or on systems that have the `env' program, you can do it like this: env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure Compiling For Multiple Architectures ==================================== You can compile the package for more than one kind of computer at the same time, by placing the object files for each architecture in their own directory. To do this, you must use a version of `make' that supports the `VPATH' variable, such as GNU `make'. `cd' to the directory where you want the object files and executables to go and run the `configure' script. `configure' automatically checks for the source code in the directory that `configure' is in and in `..'. If you have to use a `make' that does not supports the `VPATH' variable, you have to compile the package for one architecture at a time in the source code directory. After you have installed the package for one architecture, use `make distclean' before reconfiguring for another architecture. Installation Names ================== By default, `make install' will install the package's files in `/usr/local/bin', `/usr/local/man', etc. You can specify an installation prefix other than `/usr/local' by giving `configure' the option `--prefix=PATH'. You can specify separate installation prefixes for architecture-specific files and architecture-independent files. If you give `configure' the option `--exec-prefix=PATH', the package will use PATH as the prefix for installing programs and libraries. Documentation and other data files will still use the regular prefix. In addition, if you use an unusual directory layout you can give options like `--bindir=PATH' to specify different values for particular kinds of files. Run `configure --help' for a list of the directories you can set and what kinds of files go in them. If the package supports it, you can cause programs to be installed with an extra prefix or suffix on their names by giving `configure' the option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. Optional Features ================= Some packages pay attention to `--enable-FEATURE' options to `configure', where FEATURE indicates an optional part of the package. They may also pay attention to `--with-PACKAGE' options, where PACKAGE is something like `gnu-as' or `x' (for the X Window System). The `README' should mention any `--enable-' and `--with-' options that the package recognizes. For packages that use the X Window System, `configure' can usually find the X include and library files automatically, but if it doesn't, you can use the `configure' options `--x-includes=DIR' and `--x-libraries=DIR' to specify their locations. Specifying the System Type ========================== There may be some features `configure' can not figure out automatically, but needs to determine by the type of host the package will run on. Usually `configure' can figure that out, but if it prints a message saying it can not guess the host type, give it the `--host=TYPE' option. TYPE can either be a short name for the system type, such as `sun4', or a canonical name with three fields: CPU-COMPANY-SYSTEM See the file `config.sub' for the possible values of each field. If `config.sub' isn't included in this package, then this package doesn't need to know the host type. If you are building compiler tools for cross-compiling, you can also use the `--target=TYPE' option to select the type of system they will produce code for and the `--build=TYPE' option to select the type of system on which you are compiling the package. Sharing Defaults ================ If you want to set default values for `configure' scripts to share, you can create a site shell script called `config.site' that gives default values for variables like `CC', `cache_file', and `prefix'. `configure' looks for `PREFIX/share/config.site' if it exists, then `PREFIX/etc/config.site' if it exists. Or, you can set the `CONFIG_SITE' environment variable to the location of the site script. A warning: not all `configure' scripts look for a site script. Operation Controls ================== `configure' recognizes the following options to control how it operates. `--cache-file=FILE' Use and save the results of the tests in FILE instead of `./config.cache'. Set FILE to `/dev/null' to disable caching, for debugging `configure'. `--help' Print a summary of the options to `configure', and exit. `--quiet' `--silent' `-q' Do not print messages saying which checks are being made. To suppress all normal output, redirect it to `/dev/null' (any error messages will still be shown). `--srcdir=DIR' Look for the package's source code in directory DIR. Usually `configure' can determine that directory automatically. `--version' Print the version of Autoconf used to generate the `configure' script, and exit. `configure' also accepts some other, not widely useful, options. iaxmodem-1.2.0/lib/spandsp/unpack_g726_data.sh0000755000175000017500000000314311150047217020446 0ustar julienjulien#!/bin/sh # # SpanDSP - a series of DSP components for telephony # # unpack_g726_data.sh # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License version 2.1, # as published by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this program; if not, write to the Free Software # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. # # $Id: unpack_g726_data.sh,v 1.6 2008/05/03 07:55:04 steveu Exp $ # ITUDATA="../../../T-REC-G.726-199103-I!AppII!SOFT-ZST-E.zip" cd test-data/itu if [ -d g726 ] then cd g726 else mkdir g726 RETVAL=$? if [ $RETVAL != 0 ] then echo Cannot create test-data/itu/g726! exit $RETVAL fi cd g726 fi rm -rf DISK1 rm -rf DISK2 rm -rf G726piiE.WW7.doc rm -rf Software.zip unzip ${ITUDATA} >/dev/null RETVAL=$? if [ $RETVAL != 0 ] then echo Cannot unpack the ITU test vectors for G.726! exit $RETVAL fi #rm $(ITUDATA} rm G726piiE.WW7.doc unzip Software.zip >/dev/null RETVAL=$? if [ $RETVAL != 0 ] then echo Cannot unpack the ITU test vectors for G.726! exit $RETVAL fi rm Software.zip mv ./software/G726ap2/G726ap2e/DISK1 . mv ./software/G726ap2/G726ap2e/DISK2 . rm -rf ./software echo The ITU test vectors for G.726 should now be in the g726 directory iaxmodem-1.2.0/lib/spandsp/spandsp.spec.in0000644000175000017500000000425411150047217020025 0ustar julienjulienSummary: A DSP library for telephony. Name: @PACKAGE@ Version: @VERSION@ Release: 1 License: GPL Group: System Environment/Libraries URL: http://www.soft-switch.org/spandsp BuildRoot: %{_tmppath}/%{name}-%{version}-root Source: http://www.soft-switch.org/downloads/spandsp/@PACKAGE@-@VERSION@.tar.gz BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) Docdir: %{_prefix}/doc BuildRequires: libtiff-devel BuildRequires: audiofile-devel BuildRequires: doxygen %description SpanDSP is a library of DSP functions for telephony, in the 8000 sample per second world of E1s, T1s, and higher order PCM channels. It contains low level functions, such as basic filters. It also contains higher level functions, such as cadenced supervisory tone detection, and a complete software FAX machine. The software has been designed to avoid intellectual property issues, using mature techniques where all relevant patents have expired. See the file DueDiligence for important information about these intellectual property issues. %package devel Summary: SpanDSP development files Group: Development/Libraries Requires: spandsp = %{version} Requires: libtiff-devel PreReq: /sbin/install-info %description devel SpanDSP development files. %prep %setup -q %build %configure --enable-doc --disable-static --disable-rpath make %install rm -rf %{buildroot} make install DESTDIR=%{buildroot} rm %{buildroot}%{_libdir}/libspandsp.la %clean rm -rf %{buildroot} %files %defattr(-,root,root,-) %doc DueDiligence ChangeLog AUTHORS COPYING NEWS README %{_libdir}/libspandsp.so.* %{_datadir}/spandsp %files devel %defattr(-,root,root,-) %doc doc/api %{_includedir}/spandsp.h %{_includedir}/spandsp %{_libdir}/libspandsp.so %post -p /sbin/ldconfig %postun -p /sbin/ldconfig %changelog * Mon 23 Jun 2008 Steve Underwood 0.0.5-1 - Cleared out the dependency on libxml2 * Sun Dec 31 2006 Steve Underwood 0.0.3-1 - Preparing for 0.0.3 release * Sat Oct 16 2004 Steve Underwood 0.0.2-1 - Preparing for 0.0.2 release * Thu Apr 15 2004 Steve Underwood 0.0.1-1 - Initial version iaxmodem-1.2.0/lib/spandsp/autogen.sh0000755000175000017500000001006111150047217017066 0ustar julienjulien#!/usr/bin/env sh # # SpanDSP - a series of DSP components for telephony # # autogen script # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License version 2.1, # as published by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this program; if not, write to the Free Software # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. # # $Id: autogen.sh,v 1.6 2008/03/30 18:33:24 steveu Exp $ # UNAME=`uname` if [ "x$UNAME" = "xFreeBSD" ]; then echo "" echo "" echo "******************************************" echo "*** NOTICE ***" echo "******************************************" echo " " echo "FreeBSD is buggy. Please use this " echo "workaround if you want to bootstrap " echo "on FreeBSD. " echo " " echo "cd /usr/local/share/aclocal19 " echo "ln -s ../aclocal/libtool15.m4 . " echo "ln -s ../aclocal/ltdl15.m4 . " echo " " echo "******************************************" echo "" fi debug () { # Outputs debug statments if DEBUG var is set if [ ! -z "$DEBUG" ]; then echo "DEBUG: $1" fi } version_compare() { # Checks a command is found and the version is high enough PROGRAM=$1 MAJOR=$2 MINOR=$3 MICRO=$4 test -z "$MAJOR" && MAJOR=0 test -z "$MINOR" && MINOR=0 test -z "$MICRO" && MICRO=0 debug "Checking $PROGRAM >= $MAJOR.$MINOR.$MICRO" WHICH_PATH=`whereis which | cut -f2 -d' '` COMMAND=`$WHICH_PATH $PROGRAM` if [ -z $COMMAND ]; then echo "$PROGRAM-$MAJOR.$MINOR.$MICRO is required and was not found." return 1 else debug "Found $COMMAND" fi INS_VER=`$COMMAND --version | head -1 | sed 's/[^0-9]*//' | cut -d' ' -f1` INS_MAJOR=`echo $INS_VER | cut -d. -f1 | sed s/[a-zA-Z\-].*//g` INS_MINOR=`echo $INS_VER | cut -d. -f2 | sed s/[a-zA-Z\-].*//g` INS_MICRO=`echo $INS_VER | cut -d. -f3 | sed s/[a-zA-Z\-].*//g` test -z "$INS_MAJOR" && INS_MAJOR=0 test -z "$INS_MINOR" && INS_MINOR=0 test -z "$INS_MICRO" && INS_MICRO=0 debug "Installed version: $INS_VER" if [ "$INS_MAJOR" -gt "$MAJOR" ]; then debug "MAJOR: $INS_MAJOR > $MAJOR" return 0 elif [ "$INS_MAJOR" -eq "$MAJOR" ]; then debug "MAJOR: $INS_MAJOR = $MAJOR" if [ "$INS_MINOR" -gt "$MINOR" ]; then debug "MINOR: $INS_MINOR > $MINOR" return 0 elif [ "$INS_MINOR" -eq "$MINOR" ]; then if [ "$INS_MICRO" -ge "$MICRO" ]; then debug "MICRO: $INS_MICRO >= $MICRO" return 0 else debug "MICRO: $INS_MICRO < $MICRO" fi else debug "MINOR: $INS_MINOR < $MINOR" fi else debug "MAJOR: $INS_MAJOR < $MAJOR" fi echo "You have the wrong version of $PROGRAM. The minimum required version is $MAJOR.$MINOR.$MICRO" echo " and the version installed is $INS_MAJOR.$INS_MINOR.$INS_MICRO ($COMMAND)." return 1 } # Check for required version and die if unhappy if [ "x$UNAME" = "xFreeBSD" ]; then version_compare libtoolize 1 5 16 || exit 1 version_compare automake19 1 9 5 || exit 1 version_compare autoconf259 2 59 || exit 1 ACLOCAL=aclocal19 AUTOHEADER=autoheader259 AUTOMAKE=automake19 AUTOCONF=autoconf259 else version_compare libtoolize 1 5 16 || exit 1 version_compare automake 1 9 5 || exit 1 version_compare autoconf 2 59 || exit 1 ACLOCAL=aclocal AUTOHEADER=autoheader AUTOMAKE=automake AUTOCONF=autoconf fi libtoolize --copy --force --ltdl #NetBSD seems to need this file writable chmod u+w libltdl/configure $ACLOCAL $AUTOHEADER --force $AUTOMAKE --copy --add-missing $AUTOCONF --force #chmod ug+x debian/rules if [ "x$UNAME" = "xNetBSD" ]; then echo "" echo "Please remember to run gmake instead of make on NetBSD" echo "" fi iaxmodem-1.2.0/lib/spandsp/aclocal.m40000644000175000017500000101472511150047457016747 0ustar julienjulien# generated automatically by aclocal 1.9.6 -*- Autoconf -*- # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, # 2005 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. # libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- # serial 52 AC_PROG_LIBTOOL # AC_PROVIDE_IFELSE(MACRO-NAME, IF-PROVIDED, IF-NOT-PROVIDED) # ----------------------------------------------------------- # If this macro is not defined by Autoconf, define it here. m4_ifdef([AC_PROVIDE_IFELSE], [], [m4_define([AC_PROVIDE_IFELSE], [m4_ifdef([AC_PROVIDE_$1], [$2], [$3])])]) # AC_PROG_LIBTOOL # --------------- AC_DEFUN([AC_PROG_LIBTOOL], [AC_REQUIRE([_AC_PROG_LIBTOOL])dnl dnl If AC_PROG_CXX has already been expanded, run AC_LIBTOOL_CXX dnl immediately, otherwise, hook it in at the end of AC_PROG_CXX. AC_PROVIDE_IFELSE([AC_PROG_CXX], [AC_LIBTOOL_CXX], [define([AC_PROG_CXX], defn([AC_PROG_CXX])[AC_LIBTOOL_CXX ])]) dnl And a similar setup for Fortran 77 support AC_PROVIDE_IFELSE([AC_PROG_F77], [AC_LIBTOOL_F77], [define([AC_PROG_F77], defn([AC_PROG_F77])[AC_LIBTOOL_F77 ])]) dnl Quote A][M_PROG_GCJ so that aclocal doesn't bring it in needlessly. dnl If either AC_PROG_GCJ or A][M_PROG_GCJ have already been expanded, run dnl AC_LIBTOOL_GCJ immediately, otherwise, hook it in at the end of both. AC_PROVIDE_IFELSE([AC_PROG_GCJ], [AC_LIBTOOL_GCJ], [AC_PROVIDE_IFELSE([A][M_PROG_GCJ], [AC_LIBTOOL_GCJ], [AC_PROVIDE_IFELSE([LT_AC_PROG_GCJ], [AC_LIBTOOL_GCJ], [ifdef([AC_PROG_GCJ], [define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[AC_LIBTOOL_GCJ])]) ifdef([A][M_PROG_GCJ], [define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[AC_LIBTOOL_GCJ])]) ifdef([LT_AC_PROG_GCJ], [define([LT_AC_PROG_GCJ], defn([LT_AC_PROG_GCJ])[AC_LIBTOOL_GCJ])])])]) ])])# AC_PROG_LIBTOOL # _AC_PROG_LIBTOOL # ---------------- AC_DEFUN([_AC_PROG_LIBTOOL], [AC_REQUIRE([AC_LIBTOOL_SETUP])dnl AC_BEFORE([$0],[AC_LIBTOOL_CXX])dnl AC_BEFORE([$0],[AC_LIBTOOL_F77])dnl AC_BEFORE([$0],[AC_LIBTOOL_GCJ])dnl # This can be used to rebuild libtool when needed LIBTOOL_DEPS="$ac_aux_dir/ltmain.sh" # Always use our own libtool. LIBTOOL='$(SHELL) $(top_builddir)/libtool' AC_SUBST(LIBTOOL)dnl # Prevent multiple expansion define([AC_PROG_LIBTOOL], []) ])# _AC_PROG_LIBTOOL # AC_LIBTOOL_SETUP # ---------------- AC_DEFUN([AC_LIBTOOL_SETUP], [AC_PREREQ(2.50)dnl AC_REQUIRE([AC_ENABLE_SHARED])dnl AC_REQUIRE([AC_ENABLE_STATIC])dnl AC_REQUIRE([AC_ENABLE_FAST_INSTALL])dnl AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_PROG_LD])dnl AC_REQUIRE([AC_PROG_LD_RELOAD_FLAG])dnl AC_REQUIRE([AC_PROG_NM])dnl AC_REQUIRE([AC_PROG_LN_S])dnl AC_REQUIRE([AC_DEPLIBS_CHECK_METHOD])dnl # Autoconf 2.13's AC_OBJEXT and AC_EXEEXT macros only works for C compilers! AC_REQUIRE([AC_OBJEXT])dnl AC_REQUIRE([AC_EXEEXT])dnl dnl AC_LIBTOOL_SYS_MAX_CMD_LEN AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE AC_LIBTOOL_OBJDIR AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl _LT_AC_PROG_ECHO_BACKSLASH case $host_os in aix3*) # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi ;; esac # Sed substitution that helps us do robust quoting. It backslashifies # metacharacters that are still active within double-quoted strings. Xsed='sed -e 1s/^X//' [sed_quote_subst='s/\([\\"\\`$\\\\]\)/\\\1/g'] # Same as above, but do not quote variable references. [double_quote_subst='s/\([\\"\\`\\\\]\)/\\\1/g'] # Sed substitution to delay expansion of an escaped shell variable in a # double_quote_subst'ed string. delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' # Sed substitution to avoid accidental globbing in evaled expressions no_glob_subst='s/\*/\\\*/g' # Constants: rm="rm -f" # Global variables: default_ofile=libtool can_build_shared=yes # All known linkers require a `.a' archive for static linking (except MSVC, # which needs '.lib'). libext=a ltmain="$ac_aux_dir/ltmain.sh" ofile="$default_ofile" with_gnu_ld="$lt_cv_prog_gnu_ld" AC_CHECK_TOOL(AR, ar, false) AC_CHECK_TOOL(RANLIB, ranlib, :) AC_CHECK_TOOL(STRIP, strip, :) old_CC="$CC" old_CFLAGS="$CFLAGS" # Set sane defaults for various variables test -z "$AR" && AR=ar test -z "$AR_FLAGS" && AR_FLAGS=cru test -z "$AS" && AS=as test -z "$CC" && CC=cc test -z "$LTCC" && LTCC=$CC test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS test -z "$DLLTOOL" && DLLTOOL=dlltool test -z "$LD" && LD=ld test -z "$LN_S" && LN_S="ln -s" test -z "$MAGIC_CMD" && MAGIC_CMD=file test -z "$NM" && NM=nm test -z "$SED" && SED=sed test -z "$OBJDUMP" && OBJDUMP=objdump test -z "$RANLIB" && RANLIB=: test -z "$STRIP" && STRIP=: test -z "$ac_objext" && ac_objext=o # Determine commands to create old-style static archives. old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' old_postinstall_cmds='chmod 644 $oldlib' old_postuninstall_cmds= if test -n "$RANLIB"; then case $host_os in openbsd*) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$oldlib" ;; *) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib" ;; esac old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib" fi _LT_CC_BASENAME([$compiler]) # Only perform the check for file, if the check method requires it case $deplibs_check_method in file_magic*) if test "$file_magic_cmd" = '$MAGIC_CMD'; then AC_PATH_MAGIC fi ;; esac _LT_REQUIRED_DARWIN_CHECKS AC_PROVIDE_IFELSE([AC_LIBTOOL_DLOPEN], enable_dlopen=yes, enable_dlopen=no) AC_PROVIDE_IFELSE([AC_LIBTOOL_WIN32_DLL], enable_win32_dll=yes, enable_win32_dll=no) AC_ARG_ENABLE([libtool-lock], [AC_HELP_STRING([--disable-libtool-lock], [avoid locking (might break parallel builds)])]) test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes AC_ARG_WITH([pic], [AC_HELP_STRING([--with-pic], [try to use only PIC/non-PIC objects @<:@default=use both@:>@])], [pic_mode="$withval"], [pic_mode=default]) test -z "$pic_mode" && pic_mode=default # Use C for the default configuration in the libtool script tagname= AC_LIBTOOL_LANG_C_CONFIG _LT_AC_TAGCONFIG ])# AC_LIBTOOL_SETUP # _LT_AC_SYS_COMPILER # ------------------- AC_DEFUN([_LT_AC_SYS_COMPILER], [AC_REQUIRE([AC_PROG_CC])dnl # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC ])# _LT_AC_SYS_COMPILER # _LT_CC_BASENAME(CC) # ------------------- # Calculate cc_basename. Skip known compiler wrappers and cross-prefix. AC_DEFUN([_LT_CC_BASENAME], [for cc_temp in $1""; do case $cc_temp in compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;; distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` ]) # _LT_COMPILER_BOILERPLATE # ------------------------ # Check for compiler boilerplate output or warnings with # the simple compiler test code. AC_DEFUN([_LT_COMPILER_BOILERPLATE], [AC_REQUIRE([LT_AC_PROG_SED])dnl ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $rm conftest* ])# _LT_COMPILER_BOILERPLATE # _LT_LINKER_BOILERPLATE # ---------------------- # Check for linker boilerplate output or warnings with # the simple link test code. AC_DEFUN([_LT_LINKER_BOILERPLATE], [AC_REQUIRE([LT_AC_PROG_SED])dnl ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $rm -r conftest* ])# _LT_LINKER_BOILERPLATE # _LT_REQUIRED_DARWIN_CHECKS # -------------------------- # Check for some things on darwin AC_DEFUN([_LT_REQUIRED_DARWIN_CHECKS],[ case $host_os in rhapsody* | darwin*) AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:]) AC_CHECK_TOOL([NMEDIT], [nmedit], [:]) AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod], [lt_cv_apple_cc_single_mod=no if test -z "${LT_MULTI_MODULE}"; then # By default we will add the -single_module flag. You can override # by either setting the environment variable LT_MULTI_MODULE # non-empty at configure time, or by adding -multi_module to the # link flags. echo "int foo(void){return 1;}" > conftest.c $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib ${wl}-single_module conftest.c if test -f libconftest.dylib; then lt_cv_apple_cc_single_mod=yes rm -rf libconftest.dylib* fi rm conftest.c fi]) AC_CACHE_CHECK([for -exported_symbols_list linker flag], [lt_cv_ld_exported_symbols_list], [lt_cv_ld_exported_symbols_list=no save_LDFLAGS=$LDFLAGS echo "_main" > conftest.sym LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], [lt_cv_ld_exported_symbols_list=yes], [lt_cv_ld_exported_symbols_list=no]) LDFLAGS="$save_LDFLAGS" ]) case $host_os in rhapsody* | darwin1.[[0123]]) _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; darwin1.*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; darwin*) # if running on 10.5 or later, the deployment target defaults # to the OS version, if on x86, and 10.4, the deployment # target defaults to 10.4. Don't you love it? case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in 10.0,*86*-darwin8*|10.0,*-darwin[[91]]*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; 10.[[012]]*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; 10.*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; esac ;; esac if test "$lt_cv_apple_cc_single_mod" = "yes"; then _lt_dar_single_mod='$single_module' fi if test "$lt_cv_ld_exported_symbols_list" = "yes"; then _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' else _lt_dar_export_syms="~$NMEDIT -s \$output_objdir/\${libname}-symbols.expsym \${lib}" fi if test "$DSYMUTIL" != ":"; then _lt_dsymutil="~$DSYMUTIL \$lib || :" else _lt_dsymutil= fi ;; esac ]) # _LT_AC_SYS_LIBPATH_AIX # ---------------------- # Links a minimal program and checks the executable # for the system default hardcoded library path. In most cases, # this is /usr/lib:/lib, but when the MPI compilers are used # the location of the communication and MPI libs are included too. # If we don't find anything, use the default library path according # to the aix ld manual. AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX], [AC_REQUIRE([LT_AC_PROG_SED])dnl AC_LINK_IFELSE(AC_LANG_PROGRAM,[ lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/ p } }' aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi],[]) if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi ])# _LT_AC_SYS_LIBPATH_AIX # _LT_AC_SHELL_INIT(ARG) # ---------------------- AC_DEFUN([_LT_AC_SHELL_INIT], [ifdef([AC_DIVERSION_NOTICE], [AC_DIVERT_PUSH(AC_DIVERSION_NOTICE)], [AC_DIVERT_PUSH(NOTICE)]) $1 AC_DIVERT_POP ])# _LT_AC_SHELL_INIT # _LT_AC_PROG_ECHO_BACKSLASH # -------------------------- # Add some code to the start of the generated configure script which # will find an echo command which doesn't interpret backslashes. AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH], [_LT_AC_SHELL_INIT([ # Check that we are running under the correct shell. SHELL=${CONFIG_SHELL-/bin/sh} case X$ECHO in X*--fallback-echo) # Remove one level of quotation (which was required for Make). ECHO=`echo "$ECHO" | sed 's,\\\\\[$]\\[$]0,'[$]0','` ;; esac echo=${ECHO-echo} if test "X[$]1" = X--no-reexec; then # Discard the --no-reexec flag, and continue. shift elif test "X[$]1" = X--fallback-echo; then # Avoid inline document here, it may be left over : elif test "X`($echo '\t') 2>/dev/null`" = 'X\t' ; then # Yippee, $echo works! : else # Restart under the correct shell. exec $SHELL "[$]0" --no-reexec ${1+"[$]@"} fi if test "X[$]1" = X--fallback-echo; then # used as fallback echo shift cat </dev/null 2>&1 && unset CDPATH if test -z "$ECHO"; then if test "X${echo_test_string+set}" != Xset; then # find a string as large as possible, as long as the shell can cope with it for cmd in 'sed 50q "[$]0"' 'sed 20q "[$]0"' 'sed 10q "[$]0"' 'sed 2q "[$]0"' 'echo test'; do # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ... if (echo_test_string=`eval $cmd`) 2>/dev/null && echo_test_string=`eval $cmd` && (test "X$echo_test_string" = "X$echo_test_string") 2>/dev/null then break fi done fi if test "X`($echo '\t') 2>/dev/null`" = 'X\t' && echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then : else # The Solaris, AIX, and Digital Unix default echo programs unquote # backslashes. This makes it impossible to quote backslashes using # echo "$something" | sed 's/\\/\\\\/g' # # So, first we look for a working echo in the user's PATH. lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for dir in $PATH /usr/ucb; do IFS="$lt_save_ifs" if (test -f $dir/echo || test -f $dir/echo$ac_exeext) && test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' && echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then echo="$dir/echo" break fi done IFS="$lt_save_ifs" if test "X$echo" = Xecho; then # We didn't find a better echo, so look for alternatives. if test "X`(print -r '\t') 2>/dev/null`" = 'X\t' && echo_testing_string=`(print -r "$echo_test_string") 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then # This shell has a builtin print -r that does the trick. echo='print -r' elif (test -f /bin/ksh || test -f /bin/ksh$ac_exeext) && test "X$CONFIG_SHELL" != X/bin/ksh; then # If we have ksh, try running configure again with it. ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh} export ORIGINAL_CONFIG_SHELL CONFIG_SHELL=/bin/ksh export CONFIG_SHELL exec $CONFIG_SHELL "[$]0" --no-reexec ${1+"[$]@"} else # Try using printf. echo='printf %s\n' if test "X`($echo '\t') 2>/dev/null`" = 'X\t' && echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then # Cool, printf works : elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` && test "X$echo_testing_string" = 'X\t' && echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL export CONFIG_SHELL SHELL="$CONFIG_SHELL" export SHELL echo="$CONFIG_SHELL [$]0 --fallback-echo" elif echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` && test "X$echo_testing_string" = 'X\t' && echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then echo="$CONFIG_SHELL [$]0 --fallback-echo" else # maybe with a smaller string... prev=: for cmd in 'echo test' 'sed 2q "[$]0"' 'sed 10q "[$]0"' 'sed 20q "[$]0"' 'sed 50q "[$]0"'; do if (test "X$echo_test_string" = "X`eval $cmd`") 2>/dev/null then break fi prev="$cmd" done if test "$prev" != 'sed 50q "[$]0"'; then echo_test_string=`eval $prev` export echo_test_string exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "[$]0" ${1+"[$]@"} else # Oops. We lost completely, so just stick with echo. echo=echo fi fi fi fi fi fi # Copy echo and quote the copy suitably for passing to libtool from # the Makefile, instead of quoting the original, which is used later. ECHO=$echo if test "X$ECHO" = "X$CONFIG_SHELL [$]0 --fallback-echo"; then ECHO="$CONFIG_SHELL \\\$\[$]0 --fallback-echo" fi AC_SUBST(ECHO) ])])# _LT_AC_PROG_ECHO_BACKSLASH # _LT_AC_LOCK # ----------- AC_DEFUN([_LT_AC_LOCK], [AC_ARG_ENABLE([libtool-lock], [AC_HELP_STRING([--disable-libtool-lock], [avoid locking (might break parallel builds)])]) test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes # Some flags need to be propagated to the compiler or linker for good # libtool support. case $host in ia64-*-hpux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.$ac_objext` in *ELF-32*) HPUX_IA64_MODE="32" ;; *ELF-64*) HPUX_IA64_MODE="64" ;; esac fi rm -rf conftest* ;; *-*-irix6*) # Find out which ABI we are using. echo '[#]line __oline__ "configure"' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then if test "$lt_cv_prog_gnu_ld" = yes; then case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -melf32bsmip" ;; *N32*) LD="${LD-ld} -melf32bmipn32" ;; *64-bit*) LD="${LD-ld} -melf64bmip" ;; esac else case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -32" ;; *N32*) LD="${LD-ld} -n32" ;; *64-bit*) LD="${LD-ld} -64" ;; esac fi fi rm -rf conftest* ;; x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \ s390*-*linux*|sparc*-*linux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.o` in *32-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_i386_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_i386" ;; ppc64-*linux*|powerpc64-*linux*) LD="${LD-ld} -m elf32ppclinux" ;; s390x-*linux*) LD="${LD-ld} -m elf_s390" ;; sparc64-*linux*) LD="${LD-ld} -m elf32_sparc" ;; esac ;; *64-bit*) libsuff=64 case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_x86_64_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_x86_64" ;; ppc*-*linux*|powerpc*-*linux*) LD="${LD-ld} -m elf64ppc" ;; s390*-*linux*) LD="${LD-ld} -m elf64_s390" ;; sparc*-*linux*) LD="${LD-ld} -m elf64_sparc" ;; esac ;; esac fi rm -rf conftest* ;; *-*-sco3.2v5*) # On SCO OpenServer 5, we need -belf to get full-featured binaries. SAVE_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -belf" AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf, [AC_LANG_PUSH(C) AC_TRY_LINK([],[],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no]) AC_LANG_POP]) if test x"$lt_cv_cc_needs_belf" != x"yes"; then # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf CFLAGS="$SAVE_CFLAGS" fi ;; sparc*-*solaris*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.o` in *64-bit*) case $lt_cv_prog_gnu_ld in yes*) LD="${LD-ld} -m elf64_sparc" ;; *) if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then LD="${LD-ld} -64" fi ;; esac ;; esac fi rm -rf conftest* ;; AC_PROVIDE_IFELSE([AC_LIBTOOL_WIN32_DLL], [*-*-cygwin* | *-*-mingw* | *-*-pw32*) AC_CHECK_TOOL(DLLTOOL, dlltool, false) AC_CHECK_TOOL(AS, as, false) AC_CHECK_TOOL(OBJDUMP, objdump, false) ;; ]) esac need_locks="$enable_libtool_lock" ])# _LT_AC_LOCK # AC_LIBTOOL_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, # [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE]) # ---------------------------------------------------------------- # Check whether the given compiler option works AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], [AC_REQUIRE([LT_AC_PROG_SED]) AC_CACHE_CHECK([$1], [$2], [$2=no ifelse([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4]) echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$3" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&AS_MESSAGE_LOG_FD echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then $2=yes fi fi $rm conftest* ]) if test x"[$]$2" = xyes; then ifelse([$5], , :, [$5]) else ifelse([$6], , :, [$6]) fi ])# AC_LIBTOOL_COMPILER_OPTION # AC_LIBTOOL_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, # [ACTION-SUCCESS], [ACTION-FAILURE]) # ------------------------------------------------------------ # Check whether the given compiler option works AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], [AC_REQUIRE([LT_AC_PROG_SED])dnl AC_CACHE_CHECK([$1], [$2], [$2=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $3" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&AS_MESSAGE_LOG_FD $echo "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then $2=yes fi else $2=yes fi fi $rm -r conftest* LDFLAGS="$save_LDFLAGS" ]) if test x"[$]$2" = xyes; then ifelse([$4], , :, [$4]) else ifelse([$5], , :, [$5]) fi ])# AC_LIBTOOL_LINKER_OPTION # AC_LIBTOOL_SYS_MAX_CMD_LEN # -------------------------- AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], [# find the maximum length of command line arguments AC_MSG_CHECKING([the maximum length of command line arguments]) AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl i=0 teststring="ABCD" case $build_os in msdosdjgpp*) # On DJGPP, this test can blow up pretty badly due to problems in libc # (any single argument exceeding 2000 bytes causes a buffer overrun # during glob expansion). Even if it were fixed, the result of this # check would be larger than it should be. lt_cv_sys_max_cmd_len=12288; # 12K is about right ;; gnu*) # Under GNU Hurd, this test is not required because there is # no limit to the length of command line arguments. # Libtool will interpret -1 as no limit whatsoever lt_cv_sys_max_cmd_len=-1; ;; cygwin* | mingw*) # On Win9x/ME, this test blows up -- it succeeds, but takes # about 5 minutes as the teststring grows exponentially. # Worse, since 9x/ME are not pre-emptively multitasking, # you end up with a "frozen" computer, even though with patience # the test eventually succeeds (with a max line length of 256k). # Instead, let's just punt: use the minimum linelength reported by # all of the supported platforms: 8192 (on NT/2K/XP). lt_cv_sys_max_cmd_len=8192; ;; amigaos*) # On AmigaOS with pdksh, this test takes hours, literally. # So we just punt and use a minimum line length of 8192. lt_cv_sys_max_cmd_len=8192; ;; netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) # This has been around since 386BSD, at least. Likely further. if test -x /sbin/sysctl; then lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` elif test -x /usr/sbin/sysctl; then lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` else lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs fi # And add a safety zone lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` ;; interix*) # We know the value 262144 and hardcode it with a safety zone (like BSD) lt_cv_sys_max_cmd_len=196608 ;; osf*) # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not # nice to cause kernel panics so lets avoid the loop below. # First set a reasonable default. lt_cv_sys_max_cmd_len=16384 # if test -x /sbin/sysconfig; then case `/sbin/sysconfig -q proc exec_disable_arg_limit` in *1*) lt_cv_sys_max_cmd_len=-1 ;; esac fi ;; sco3.2v5*) lt_cv_sys_max_cmd_len=102400 ;; sysv5* | sco5v6* | sysv4.2uw2*) kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` if test -n "$kargmax"; then lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[ ]]//'` else lt_cv_sys_max_cmd_len=32768 fi ;; *) lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` if test -n "$lt_cv_sys_max_cmd_len"; then lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` else SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} while (test "X"`$SHELL [$]0 --fallback-echo "X$teststring" 2>/dev/null` \ = "XX$teststring") >/dev/null 2>&1 && new_result=`expr "X$teststring" : ".*" 2>&1` && lt_cv_sys_max_cmd_len=$new_result && test $i != 17 # 1/2 MB should be enough do i=`expr $i + 1` teststring=$teststring$teststring done teststring= # Add a significant safety factor because C++ compilers can tack on massive # amounts of additional arguments before passing them to the linker. # It appears as though 1/2 is a usable value. lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` fi ;; esac ]) if test -n $lt_cv_sys_max_cmd_len ; then AC_MSG_RESULT($lt_cv_sys_max_cmd_len) else AC_MSG_RESULT(none) fi ])# AC_LIBTOOL_SYS_MAX_CMD_LEN # _LT_AC_CHECK_DLFCN # ------------------ AC_DEFUN([_LT_AC_CHECK_DLFCN], [AC_CHECK_HEADERS(dlfcn.h)dnl ])# _LT_AC_CHECK_DLFCN # _LT_AC_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE, # ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING) # --------------------------------------------------------------------- AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF], [AC_REQUIRE([_LT_AC_CHECK_DLFCN])dnl if test "$cross_compiling" = yes; then : [$4] else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext < #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif #ifdef __cplusplus extern "C" void exit (int); #endif void fnord() { int i=42;} int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; /* dlclose (self); */ } else puts (dlerror ()); exit (status); }] EOF if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) $1 ;; x$lt_dlneed_uscore) $2 ;; x$lt_dlunknown|x*) $3 ;; esac else : # compilation failed $3 fi fi rm -fr conftest* ])# _LT_AC_TRY_DLOPEN_SELF # AC_LIBTOOL_DLOPEN_SELF # ---------------------- AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], [AC_REQUIRE([_LT_AC_CHECK_DLFCN])dnl if test "x$enable_dlopen" != xyes; then enable_dlopen=unknown enable_dlopen_self=unknown enable_dlopen_self_static=unknown else lt_cv_dlopen=no lt_cv_dlopen_libs= case $host_os in beos*) lt_cv_dlopen="load_add_on" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ;; mingw* | pw32*) lt_cv_dlopen="LoadLibrary" lt_cv_dlopen_libs= ;; cygwin*) lt_cv_dlopen="dlopen" lt_cv_dlopen_libs= ;; darwin*) # if libdl is installed we need to link against it AC_CHECK_LIB([dl], [dlopen], [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[ lt_cv_dlopen="dyld" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ]) ;; *) AC_CHECK_FUNC([shl_load], [lt_cv_dlopen="shl_load"], [AC_CHECK_LIB([dld], [shl_load], [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"], [AC_CHECK_FUNC([dlopen], [lt_cv_dlopen="dlopen"], [AC_CHECK_LIB([dl], [dlopen], [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"], [AC_CHECK_LIB([svld], [dlopen], [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"], [AC_CHECK_LIB([dld], [dld_link], [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"]) ]) ]) ]) ]) ]) ;; esac if test "x$lt_cv_dlopen" != xno; then enable_dlopen=yes else enable_dlopen=no fi case $lt_cv_dlopen in dlopen) save_CPPFLAGS="$CPPFLAGS" test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" save_LDFLAGS="$LDFLAGS" wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" save_LIBS="$LIBS" LIBS="$lt_cv_dlopen_libs $LIBS" AC_CACHE_CHECK([whether a program can dlopen itself], lt_cv_dlopen_self, [dnl _LT_AC_TRY_DLOPEN_SELF( lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes, lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross) ]) if test "x$lt_cv_dlopen_self" = xyes; then wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" AC_CACHE_CHECK([whether a statically linked program can dlopen itself], lt_cv_dlopen_self_static, [dnl _LT_AC_TRY_DLOPEN_SELF( lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=no, lt_cv_dlopen_self_static=cross) ]) fi CPPFLAGS="$save_CPPFLAGS" LDFLAGS="$save_LDFLAGS" LIBS="$save_LIBS" ;; esac case $lt_cv_dlopen_self in yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; *) enable_dlopen_self=unknown ;; esac case $lt_cv_dlopen_self_static in yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; *) enable_dlopen_self_static=unknown ;; esac fi ])# AC_LIBTOOL_DLOPEN_SELF # AC_LIBTOOL_PROG_CC_C_O([TAGNAME]) # --------------------------------- # Check to see if options -c and -o are simultaneously supported by compiler AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O], [AC_REQUIRE([LT_AC_PROG_SED])dnl AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext], [_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)], [_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no $rm -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&AS_MESSAGE_LOG_FD echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then _LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes fi fi chmod u+w . 2>&AS_MESSAGE_LOG_FD $rm conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files $rm out/* && rmdir out cd .. rmdir conftest $rm conftest* ]) ])# AC_LIBTOOL_PROG_CC_C_O # AC_LIBTOOL_SYS_HARD_LINK_LOCKS([TAGNAME]) # ----------------------------------------- # Check to see if we can do hard links to lock some files if needed AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_REQUIRE([_LT_AC_LOCK])dnl hard_links="nottested" if test "$_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user AC_MSG_CHECKING([if we can lock with hard links]) hard_links=yes $rm conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no AC_MSG_RESULT([$hard_links]) if test "$hard_links" = no; then AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe]) need_locks=warn fi else need_locks=no fi ])# AC_LIBTOOL_SYS_HARD_LINK_LOCKS # AC_LIBTOOL_OBJDIR # ----------------- AC_DEFUN([AC_LIBTOOL_OBJDIR], [AC_CACHE_CHECK([for objdir], [lt_cv_objdir], [rm -f .libs 2>/dev/null mkdir .libs 2>/dev/null if test -d .libs; then lt_cv_objdir=.libs else # MS-DOS does not allow filenames that begin with a dot. lt_cv_objdir=_libs fi rmdir .libs 2>/dev/null]) objdir=$lt_cv_objdir ])# AC_LIBTOOL_OBJDIR # AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH([TAGNAME]) # ---------------------------------------------- # Check hardcoding attributes. AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_MSG_CHECKING([how to hardcode library paths into programs]) _LT_AC_TAGVAR(hardcode_action, $1)= if test -n "$_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)" || \ test -n "$_LT_AC_TAGVAR(runpath_var, $1)" || \ test "X$_LT_AC_TAGVAR(hardcode_automatic, $1)" = "Xyes" ; then # We can hardcode non-existant directories. if test "$_LT_AC_TAGVAR(hardcode_direct, $1)" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, $1)" != no && test "$_LT_AC_TAGVAR(hardcode_minus_L, $1)" != no; then # Linking always hardcodes the temporary library directory. _LT_AC_TAGVAR(hardcode_action, $1)=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. _LT_AC_TAGVAR(hardcode_action, $1)=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. _LT_AC_TAGVAR(hardcode_action, $1)=unsupported fi AC_MSG_RESULT([$_LT_AC_TAGVAR(hardcode_action, $1)]) if test "$_LT_AC_TAGVAR(hardcode_action, $1)" = relink; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || test "$enable_shared" = no; then # Fast installation is not necessary enable_fast_install=needless fi ])# AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH # AC_LIBTOOL_SYS_LIB_STRIP # ------------------------ AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP], [striplib= old_striplib= AC_MSG_CHECKING([whether stripping libraries is possible]) if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" test -z "$striplib" && striplib="$STRIP --strip-unneeded" AC_MSG_RESULT([yes]) else # FIXME - insert some real tests, host_os isn't really good enough case $host_os in darwin*) if test -n "$STRIP" ; then striplib="$STRIP -x" old_striplib="$STRIP -S" AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) fi ;; *) AC_MSG_RESULT([no]) ;; esac fi ])# AC_LIBTOOL_SYS_LIB_STRIP # AC_LIBTOOL_SYS_DYNAMIC_LINKER # ----------------------------- # PORTME Fill in your ld.so characteristics AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER], [AC_REQUIRE([LT_AC_PROG_SED])dnl AC_MSG_CHECKING([dynamic linker characteristics]) library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=".so" postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" m4_if($1,[],[ if test "$GCC" = yes; then case $host_os in darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; *) lt_awk_arg="/^libraries:/" ;; esac lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e "s,=/,/,g"` if echo "$lt_search_path_spec" | grep ';' >/dev/null ; then # if the path contains ";" then we assume it to be the separator # otherwise default to the standard path separator (i.e. ":") - it is # assumed that no part of a normal pathname contains ";" but that should # okay in the real world where ";" in dirpaths is itself problematic. lt_search_path_spec=`echo "$lt_search_path_spec" | $SED -e 's/;/ /g'` else lt_search_path_spec=`echo "$lt_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi # Ok, now we have the path, separated by spaces, we can step through it # and add multilib dir if necessary. lt_tmp_lt_search_path_spec= lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` for lt_sys_path in $lt_search_path_spec; do if test -d "$lt_sys_path/$lt_multi_os_dir"; then lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" else test -d "$lt_sys_path" && \ lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" fi done lt_search_path_spec=`echo $lt_tmp_lt_search_path_spec | awk ' BEGIN {RS=" "; FS="/|\n";} { lt_foo=""; lt_count=0; for (lt_i = NF; lt_i > 0; lt_i--) { if ($lt_i != "" && $lt_i != ".") { if ($lt_i == "..") { lt_count++; } else { if (lt_count == 0) { lt_foo="/" $lt_i lt_foo; } else { lt_count--; } } } } if (lt_foo != "") { lt_freq[[lt_foo]]++; } if (lt_freq[[lt_foo]] == 1) { print lt_foo; } }'` sys_lib_search_path_spec=`echo $lt_search_path_spec` else sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" fi]) need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='${libname}${release}${shared_ext}$major' ;; aix[[4-9]]*) version_type=linux need_lib_prefix=no need_version=no hardcode_into_libs=yes if test "$host_cpu" = ia64; then # AIX 5 supports IA64 library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line `#! .'. This would cause the generated library to # depend on `.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[[01]] | aix4.[[01]].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then : else can_build_shared=no fi ;; esac # AIX (on Power*) has no versioning support, so currently we can not hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' else # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='${libname}${release}.a $libname.a' soname_spec='${libname}${release}${shared_ext}$major' fi shlibpath_var=LIBPATH fi ;; amigaos*) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; beos*) library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[[45]]*) version_type=linux need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no case $GCC,$host_os in yes,cygwin* | yes,mingw* | yes,pw32*) library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $rm \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" ;; mingw*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` if echo "$sys_lib_search_path_spec" | [grep ';[c-zC-Z]:/' >/dev/null]; then # It is most probably a Windows format PATH printed by # mingw gcc, but we are running on Cygwin. Gcc prints its search # path with ; separators, and with drive letters. We can handle the # drive letters (cygwin fileutils understands them), so leave them, # especially as we might pass files found there to a mingw objdump, # which wouldn't understand a cygwinified path. Ahh. sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' ;; esac ;; *) library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib' ;; esac dynamic_linker='Win32 ld.exe' # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext' soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' m4_if([$1], [],[ sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"]) sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd1*) dynamic_linker=no ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[[123]]*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2*) shlibpath_overrides_runpath=yes ;; freebsd3.[[01]]* | freebsdelf3.[[01]]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \ freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; gnu*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' if test "X$HPUX_IA64_MODE" = X32; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555. postinstall_cmds='chmod 555 $lib' ;; interix[[3-9]]*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then version_type=linux else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; # This must be Linux ELF. linux* | k*bsd*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; nto-qnx*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; openbsd*) version_type=sunos sys_lib_dlsearch_path_spec="/usr/lib" need_lib_prefix=no # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. case $host_os in openbsd3.3 | openbsd3.3.*) need_version=yes ;; *) need_version=no ;; esac library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[[89]] | openbsd2.[[89]].*) shlibpath_overrides_runpath=no ;; *) shlibpath_overrides_runpath=yes ;; esac else shlibpath_overrides_runpath=yes fi ;; os2*) libname_spec='$name' shrext_cmds=".dll" need_lib_prefix=no library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test "$with_gnu_ld" = yes; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no export_dynamic_flag_spec='${wl}-Blargedynsym' runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec ;then version_type=linux library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=freebsd-elf need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH hardcode_into_libs=yes if test "$with_gnu_ld" = yes; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' shlibpath_overrides_runpath=no else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' shlibpath_overrides_runpath=yes case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; uts4*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac AC_MSG_RESULT([$dynamic_linker]) test "$dynamic_linker" = no && can_build_shared=no AC_CACHE_VAL([lt_cv_sys_lib_search_path_spec], [lt_cv_sys_lib_search_path_spec="$sys_lib_search_path_spec"]) sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" AC_CACHE_VAL([lt_cv_sys_lib_dlsearch_path_spec], [lt_cv_sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec"]) sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi ])# AC_LIBTOOL_SYS_DYNAMIC_LINKER # _LT_AC_TAGCONFIG # ---------------- AC_DEFUN([_LT_AC_TAGCONFIG], [AC_REQUIRE([LT_AC_PROG_SED])dnl AC_ARG_WITH([tags], [AC_HELP_STRING([--with-tags@<:@=TAGS@:>@], [include additional configurations @<:@automatic@:>@])], [tagnames="$withval"]) if test -f "$ltmain" && test -n "$tagnames"; then if test ! -f "${ofile}"; then AC_MSG_WARN([output file `$ofile' does not exist]) fi if test -z "$LTCC"; then eval "`$SHELL ${ofile} --config | grep '^LTCC='`" if test -z "$LTCC"; then AC_MSG_WARN([output file `$ofile' does not look like a libtool script]) else AC_MSG_WARN([using `LTCC=$LTCC', extracted from `$ofile']) fi fi if test -z "$LTCFLAGS"; then eval "`$SHELL ${ofile} --config | grep '^LTCFLAGS='`" fi # Extract list of available tagged configurations in $ofile. # Note that this assumes the entire list is on one line. available_tags=`grep "^available_tags=" "${ofile}" | $SED -e 's/available_tags=\(.*$\)/\1/' -e 's/\"//g'` lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for tagname in $tagnames; do IFS="$lt_save_ifs" # Check whether tagname contains only valid characters case `$echo "X$tagname" | $Xsed -e 's:[[-_ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890,/]]::g'` in "") ;; *) AC_MSG_ERROR([invalid tag name: $tagname]) ;; esac if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$" < "${ofile}" > /dev/null then AC_MSG_ERROR([tag name \"$tagname\" already exists]) fi # Update the list of available tags. if test -n "$tagname"; then echo appending configuration tag \"$tagname\" to $ofile case $tagname in CXX) if test -n "$CXX" && ( test "X$CXX" != "Xno" && ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || (test "X$CXX" != "Xg++"))) ; then AC_LIBTOOL_LANG_CXX_CONFIG else tagname="" fi ;; F77) if test -n "$F77" && test "X$F77" != "Xno"; then AC_LIBTOOL_LANG_F77_CONFIG else tagname="" fi ;; GCJ) if test -n "$GCJ" && test "X$GCJ" != "Xno"; then AC_LIBTOOL_LANG_GCJ_CONFIG else tagname="" fi ;; RC) AC_LIBTOOL_LANG_RC_CONFIG ;; *) AC_MSG_ERROR([Unsupported tag name: $tagname]) ;; esac # Append the new tag name to the list of available tags. if test -n "$tagname" ; then available_tags="$available_tags $tagname" fi fi done IFS="$lt_save_ifs" # Now substitute the updated list of available tags. if eval "sed -e 's/^available_tags=.*\$/available_tags=\"$available_tags\"/' \"$ofile\" > \"${ofile}T\""; then mv "${ofile}T" "$ofile" chmod +x "$ofile" else rm -f "${ofile}T" AC_MSG_ERROR([unable to update list of available tagged configurations.]) fi fi ])# _LT_AC_TAGCONFIG # AC_LIBTOOL_DLOPEN # ----------------- # enable checks for dlopen support AC_DEFUN([AC_LIBTOOL_DLOPEN], [AC_BEFORE([$0],[AC_LIBTOOL_SETUP]) ])# AC_LIBTOOL_DLOPEN # AC_LIBTOOL_WIN32_DLL # -------------------- # declare package support for building win32 DLLs AC_DEFUN([AC_LIBTOOL_WIN32_DLL], [AC_BEFORE([$0], [AC_LIBTOOL_SETUP]) ])# AC_LIBTOOL_WIN32_DLL # AC_ENABLE_SHARED([DEFAULT]) # --------------------------- # implement the --enable-shared flag # DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. AC_DEFUN([AC_ENABLE_SHARED], [define([AC_ENABLE_SHARED_DEFAULT], ifelse($1, no, no, yes))dnl AC_ARG_ENABLE([shared], [AC_HELP_STRING([--enable-shared@<:@=PKGS@:>@], [build shared libraries @<:@default=]AC_ENABLE_SHARED_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_shared=yes ;; no) enable_shared=no ;; *) enable_shared=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_shared=yes fi done IFS="$lt_save_ifs" ;; esac], [enable_shared=]AC_ENABLE_SHARED_DEFAULT) ])# AC_ENABLE_SHARED # AC_DISABLE_SHARED # ----------------- # set the default shared flag to --disable-shared AC_DEFUN([AC_DISABLE_SHARED], [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl AC_ENABLE_SHARED(no) ])# AC_DISABLE_SHARED # AC_ENABLE_STATIC([DEFAULT]) # --------------------------- # implement the --enable-static flag # DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. AC_DEFUN([AC_ENABLE_STATIC], [define([AC_ENABLE_STATIC_DEFAULT], ifelse($1, no, no, yes))dnl AC_ARG_ENABLE([static], [AC_HELP_STRING([--enable-static@<:@=PKGS@:>@], [build static libraries @<:@default=]AC_ENABLE_STATIC_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_static=yes ;; no) enable_static=no ;; *) enable_static=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_static=yes fi done IFS="$lt_save_ifs" ;; esac], [enable_static=]AC_ENABLE_STATIC_DEFAULT) ])# AC_ENABLE_STATIC # AC_DISABLE_STATIC # ----------------- # set the default static flag to --disable-static AC_DEFUN([AC_DISABLE_STATIC], [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl AC_ENABLE_STATIC(no) ])# AC_DISABLE_STATIC # AC_ENABLE_FAST_INSTALL([DEFAULT]) # --------------------------------- # implement the --enable-fast-install flag # DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. AC_DEFUN([AC_ENABLE_FAST_INSTALL], [define([AC_ENABLE_FAST_INSTALL_DEFAULT], ifelse($1, no, no, yes))dnl AC_ARG_ENABLE([fast-install], [AC_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@], [optimize for fast installation @<:@default=]AC_ENABLE_FAST_INSTALL_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_fast_install=yes ;; no) enable_fast_install=no ;; *) enable_fast_install=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_fast_install=yes fi done IFS="$lt_save_ifs" ;; esac], [enable_fast_install=]AC_ENABLE_FAST_INSTALL_DEFAULT) ])# AC_ENABLE_FAST_INSTALL # AC_DISABLE_FAST_INSTALL # ----------------------- # set the default to --disable-fast-install AC_DEFUN([AC_DISABLE_FAST_INSTALL], [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl AC_ENABLE_FAST_INSTALL(no) ])# AC_DISABLE_FAST_INSTALL # AC_LIBTOOL_PICMODE([MODE]) # -------------------------- # implement the --with-pic flag # MODE is either `yes' or `no'. If omitted, it defaults to `both'. AC_DEFUN([AC_LIBTOOL_PICMODE], [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl pic_mode=ifelse($#,1,$1,default) ])# AC_LIBTOOL_PICMODE # AC_PROG_EGREP # ------------- # This is predefined starting with Autoconf 2.54, so this conditional # definition can be removed once we require Autoconf 2.54 or later. m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP], [AC_CACHE_CHECK([for egrep], [ac_cv_prog_egrep], [if echo a | (grep -E '(a|b)') >/dev/null 2>&1 then ac_cv_prog_egrep='grep -E' else ac_cv_prog_egrep='egrep' fi]) EGREP=$ac_cv_prog_egrep AC_SUBST([EGREP]) ])]) # AC_PATH_TOOL_PREFIX # ------------------- # find a file program which can recognize shared library AC_DEFUN([AC_PATH_TOOL_PREFIX], [AC_REQUIRE([AC_PROG_EGREP])dnl AC_MSG_CHECKING([for $1]) AC_CACHE_VAL(lt_cv_path_MAGIC_CMD, [case $MAGIC_CMD in [[\\/*] | ?:[\\/]*]) lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD="$MAGIC_CMD" lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR dnl $ac_dummy forces splitting on constant user-supplied paths. dnl POSIX.2 word splitting is done only on the output of word expansions, dnl not every word. This closes a longstanding sh security hole. ac_dummy="ifelse([$2], , $PATH, [$2])" for ac_dir in $ac_dummy; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$1; then lt_cv_path_MAGIC_CMD="$ac_dir/$1" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org EOF fi ;; esac fi break fi done IFS="$lt_save_ifs" MAGIC_CMD="$lt_save_MAGIC_CMD" ;; esac]) MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if test -n "$MAGIC_CMD"; then AC_MSG_RESULT($MAGIC_CMD) else AC_MSG_RESULT(no) fi ])# AC_PATH_TOOL_PREFIX # AC_PATH_MAGIC # ------------- # find a file program which can recognize a shared library AC_DEFUN([AC_PATH_MAGIC], [AC_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH) if test -z "$lt_cv_path_MAGIC_CMD"; then if test -n "$ac_tool_prefix"; then AC_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH) else MAGIC_CMD=: fi fi ])# AC_PATH_MAGIC # AC_PROG_LD # ---------- # find the pathname to the GNU or non-GNU linker AC_DEFUN([AC_PROG_LD], [AC_ARG_WITH([gnu-ld], [AC_HELP_STRING([--with-gnu-ld], [assume the C compiler uses GNU ld @<:@default=no@:>@])], [test "$withval" = no || with_gnu_ld=yes], [with_gnu_ld=no]) AC_REQUIRE([LT_AC_PROG_SED])dnl AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. AC_MSG_CHECKING([for ld used by $CC]) case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [[\\/]]* | ?:[[\\/]]*) re_direlt='/[[^/]][[^/]]*/\.\./' # Canonicalize the pathname of ld ac_prog=`echo $ac_prog| $SED 's%\\\\%/%g'` while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do ac_prog=`echo $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then AC_MSG_CHECKING([for GNU ld]) else AC_MSG_CHECKING([for non-GNU ld]) fi AC_CACHE_VAL(lt_cv_path_LD, [if test -z "$LD"; then lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &1 /dev/null 2>&1; then lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' else lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?' lt_cv_file_magic_cmd='$OBJDUMP -f' fi ;; darwin* | rhapsody*) lt_cv_deplibs_check_method=pass_all ;; freebsd* | dragonfly*) if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then case $host_cpu in i*86 ) # Not sure whether the presence of OpenBSD here was a mistake. # Let's accept both of them until this is cleared up. lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` ;; esac else lt_cv_deplibs_check_method=pass_all fi ;; gnu*) lt_cv_deplibs_check_method=pass_all ;; hpux10.20* | hpux11*) lt_cv_file_magic_cmd=/usr/bin/file case $host_cpu in ia64*) lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64' lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so ;; hppa*64*) [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - PA-RISC [0-9].[0-9]'] lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl ;; *) lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]].[[0-9]]) shared library' lt_cv_file_magic_test_file=/usr/lib/libc.sl ;; esac ;; interix[[3-9]]*) # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$' ;; irix5* | irix6* | nonstopux*) case $LD in *-32|*"-32 ") libmagic=32-bit;; *-n32|*"-n32 ") libmagic=N32;; *-64|*"-64 ") libmagic=64-bit;; *) libmagic=never-match;; esac lt_cv_deplibs_check_method=pass_all ;; # This must be Linux ELF. linux* | k*bsd*-gnu) lt_cv_deplibs_check_method=pass_all ;; netbsd*) if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$' fi ;; newos6*) lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=/usr/lib/libnls.so ;; nto-qnx*) lt_cv_deplibs_check_method=unknown ;; openbsd*) if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' fi ;; osf3* | osf4* | osf5*) lt_cv_deplibs_check_method=pass_all ;; rdos*) lt_cv_deplibs_check_method=pass_all ;; solaris*) lt_cv_deplibs_check_method=pass_all ;; sysv4 | sysv4.3*) case $host_vendor in motorola) lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]' lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` ;; ncr) lt_cv_deplibs_check_method=pass_all ;; sequent) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' ;; sni) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib" lt_cv_file_magic_test_file=/lib/libc.so ;; siemens) lt_cv_deplibs_check_method=pass_all ;; pc) lt_cv_deplibs_check_method=pass_all ;; esac ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) lt_cv_deplibs_check_method=pass_all ;; esac ]) file_magic_cmd=$lt_cv_file_magic_cmd deplibs_check_method=$lt_cv_deplibs_check_method test -z "$deplibs_check_method" && deplibs_check_method=unknown ])# AC_DEPLIBS_CHECK_METHOD # AC_PROG_NM # ---------- # find the pathname to a BSD-compatible name lister AC_DEFUN([AC_PROG_NM], [AC_CACHE_CHECK([for BSD-compatible nm], lt_cv_path_NM, [if test -n "$NM"; then # Let the user override the test. lt_cv_path_NM="$NM" else lt_nm_to_check="${ac_tool_prefix}nm" if test -n "$ac_tool_prefix" && test "$build" = "$host"; then lt_nm_to_check="$lt_nm_to_check nm" fi for lt_tmp_nm in $lt_nm_to_check; do lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. tmp_nm="$ac_dir/$lt_tmp_nm" if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then # Check to see if the nm accepts a BSD-compat flag. # Adding the `sed 1q' prevents false positives on HP-UX, which says: # nm: unknown option "B" ignored # Tru64's nm complains that /dev/null is an invalid object file case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in */dev/null* | *'Invalid file or object type'*) lt_cv_path_NM="$tmp_nm -B" break ;; *) case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in */dev/null*) lt_cv_path_NM="$tmp_nm -p" break ;; *) lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but continue # so that we can try to find one that supports BSD flags ;; esac ;; esac fi done IFS="$lt_save_ifs" done test -z "$lt_cv_path_NM" && lt_cv_path_NM=nm fi]) NM="$lt_cv_path_NM" ])# AC_PROG_NM # AC_CHECK_LIBM # ------------- # check for math library AC_DEFUN([AC_CHECK_LIBM], [AC_REQUIRE([AC_CANONICAL_HOST])dnl LIBM= case $host in *-*-beos* | *-*-cygwin* | *-*-pw32* | *-*-darwin*) # These system don't have libm, or don't need it ;; *-ncr-sysv4.3*) AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw") AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm") ;; *) AC_CHECK_LIB(m, cos, LIBM="-lm") ;; esac ])# AC_CHECK_LIBM # AC_LIBLTDL_CONVENIENCE([DIRECTORY]) # ----------------------------------- # sets LIBLTDL to the link flags for the libltdl convenience library and # LTDLINCL to the include flags for the libltdl header and adds # --enable-ltdl-convenience to the configure arguments. Note that # AC_CONFIG_SUBDIRS is not called here. If DIRECTORY is not provided, # it is assumed to be `libltdl'. LIBLTDL will be prefixed with # '${top_builddir}/' and LTDLINCL will be prefixed with '${top_srcdir}/' # (note the single quotes!). If your package is not flat and you're not # using automake, define top_builddir and top_srcdir appropriately in # the Makefiles. AC_DEFUN([AC_LIBLTDL_CONVENIENCE], [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl case $enable_ltdl_convenience in no) AC_MSG_ERROR([this package needs a convenience libltdl]) ;; "") enable_ltdl_convenience=yes ac_configure_args="$ac_configure_args --enable-ltdl-convenience" ;; esac LIBLTDL='${top_builddir}/'ifelse($#,1,[$1],['libltdl'])/libltdlc.la LTDLINCL='-I${top_srcdir}/'ifelse($#,1,[$1],['libltdl']) # For backwards non-gettext consistent compatibility... INCLTDL="$LTDLINCL" ])# AC_LIBLTDL_CONVENIENCE # AC_LIBLTDL_INSTALLABLE([DIRECTORY]) # ----------------------------------- # sets LIBLTDL to the link flags for the libltdl installable library and # LTDLINCL to the include flags for the libltdl header and adds # --enable-ltdl-install to the configure arguments. Note that # AC_CONFIG_SUBDIRS is not called here. If DIRECTORY is not provided, # and an installed libltdl is not found, it is assumed to be `libltdl'. # LIBLTDL will be prefixed with '${top_builddir}/'# and LTDLINCL with # '${top_srcdir}/' (note the single quotes!). If your package is not # flat and you're not using automake, define top_builddir and top_srcdir # appropriately in the Makefiles. # In the future, this macro may have to be called after AC_PROG_LIBTOOL. AC_DEFUN([AC_LIBLTDL_INSTALLABLE], [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl AC_CHECK_LIB(ltdl, lt_dlinit, [test x"$enable_ltdl_install" != xyes && enable_ltdl_install=no], [if test x"$enable_ltdl_install" = xno; then AC_MSG_WARN([libltdl not installed, but installation disabled]) else enable_ltdl_install=yes fi ]) if test x"$enable_ltdl_install" = x"yes"; then ac_configure_args="$ac_configure_args --enable-ltdl-install" LIBLTDL='${top_builddir}/'ifelse($#,1,[$1],['libltdl'])/libltdl.la LTDLINCL='-I${top_srcdir}/'ifelse($#,1,[$1],['libltdl']) else ac_configure_args="$ac_configure_args --enable-ltdl-install=no" LIBLTDL="-lltdl" LTDLINCL= fi # For backwards non-gettext consistent compatibility... INCLTDL="$LTDLINCL" ])# AC_LIBLTDL_INSTALLABLE # AC_LIBTOOL_CXX # -------------- # enable support for C++ libraries AC_DEFUN([AC_LIBTOOL_CXX], [AC_REQUIRE([_LT_AC_LANG_CXX]) ])# AC_LIBTOOL_CXX # _LT_AC_LANG_CXX # --------------- AC_DEFUN([_LT_AC_LANG_CXX], [AC_REQUIRE([AC_PROG_CXX]) AC_REQUIRE([_LT_AC_PROG_CXXCPP]) _LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}CXX]) ])# _LT_AC_LANG_CXX # _LT_AC_PROG_CXXCPP # ------------------ AC_DEFUN([_LT_AC_PROG_CXXCPP], [ AC_REQUIRE([AC_PROG_CXX]) if test -n "$CXX" && ( test "X$CXX" != "Xno" && ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || (test "X$CXX" != "Xg++"))) ; then AC_PROG_CXXCPP fi ])# _LT_AC_PROG_CXXCPP # AC_LIBTOOL_F77 # -------------- # enable support for Fortran 77 libraries AC_DEFUN([AC_LIBTOOL_F77], [AC_REQUIRE([_LT_AC_LANG_F77]) ])# AC_LIBTOOL_F77 # _LT_AC_LANG_F77 # --------------- AC_DEFUN([_LT_AC_LANG_F77], [AC_REQUIRE([AC_PROG_F77]) _LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}F77]) ])# _LT_AC_LANG_F77 # AC_LIBTOOL_GCJ # -------------- # enable support for GCJ libraries AC_DEFUN([AC_LIBTOOL_GCJ], [AC_REQUIRE([_LT_AC_LANG_GCJ]) ])# AC_LIBTOOL_GCJ # _LT_AC_LANG_GCJ # --------------- AC_DEFUN([_LT_AC_LANG_GCJ], [AC_PROVIDE_IFELSE([AC_PROG_GCJ],[], [AC_PROVIDE_IFELSE([A][M_PROG_GCJ],[], [AC_PROVIDE_IFELSE([LT_AC_PROG_GCJ],[], [ifdef([AC_PROG_GCJ],[AC_REQUIRE([AC_PROG_GCJ])], [ifdef([A][M_PROG_GCJ],[AC_REQUIRE([A][M_PROG_GCJ])], [AC_REQUIRE([A][C_PROG_GCJ_OR_A][M_PROG_GCJ])])])])])]) _LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}GCJ]) ])# _LT_AC_LANG_GCJ # AC_LIBTOOL_RC # ------------- # enable support for Windows resource files AC_DEFUN([AC_LIBTOOL_RC], [AC_REQUIRE([LT_AC_PROG_RC]) _LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}RC]) ])# AC_LIBTOOL_RC # AC_LIBTOOL_LANG_C_CONFIG # ------------------------ # Ensure that the configuration vars for the C compiler are # suitably defined. Those variables are subsequently used by # AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'. AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG], [_LT_AC_LANG_C_CONFIG]) AC_DEFUN([_LT_AC_LANG_C_CONFIG], [lt_save_CC="$CC" AC_LANG_PUSH(C) # Source file extension for C test sources. ac_ext=c # Object file extension for compiled C test sources. objext=o _LT_AC_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(){return(0);}' _LT_AC_SYS_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE AC_LIBTOOL_PROG_COMPILER_NO_RTTI($1) AC_LIBTOOL_PROG_COMPILER_PIC($1) AC_LIBTOOL_PROG_CC_C_O($1) AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1) AC_LIBTOOL_PROG_LD_SHLIBS($1) AC_LIBTOOL_SYS_DYNAMIC_LINKER($1) AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1) AC_LIBTOOL_SYS_LIB_STRIP AC_LIBTOOL_DLOPEN_SELF # Report which library types will actually be built AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes AC_MSG_RESULT([$enable_static]) AC_LIBTOOL_CONFIG($1) AC_LANG_POP CC="$lt_save_CC" ])# AC_LIBTOOL_LANG_C_CONFIG # AC_LIBTOOL_LANG_CXX_CONFIG # -------------------------- # Ensure that the configuration vars for the C compiler are # suitably defined. Those variables are subsequently used by # AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'. AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG], [_LT_AC_LANG_CXX_CONFIG(CXX)]) AC_DEFUN([_LT_AC_LANG_CXX_CONFIG], [AC_LANG_PUSH(C++) AC_REQUIRE([AC_PROG_CXX]) AC_REQUIRE([_LT_AC_PROG_CXXCPP]) _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no _LT_AC_TAGVAR(allow_undefined_flag, $1)= _LT_AC_TAGVAR(always_export_symbols, $1)=no _LT_AC_TAGVAR(archive_expsym_cmds, $1)= _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)= _LT_AC_TAGVAR(hardcode_direct, $1)=no _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= _LT_AC_TAGVAR(hardcode_libdir_separator, $1)= _LT_AC_TAGVAR(hardcode_minus_L, $1)=no _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported _LT_AC_TAGVAR(hardcode_automatic, $1)=no _LT_AC_TAGVAR(module_cmds, $1)= _LT_AC_TAGVAR(module_expsym_cmds, $1)= _LT_AC_TAGVAR(link_all_deplibs, $1)=unknown _LT_AC_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_AC_TAGVAR(no_undefined_flag, $1)= _LT_AC_TAGVAR(whole_archive_flag_spec, $1)= _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Dependencies to place before and after the object being linked: _LT_AC_TAGVAR(predep_objects, $1)= _LT_AC_TAGVAR(postdep_objects, $1)= _LT_AC_TAGVAR(predeps, $1)= _LT_AC_TAGVAR(postdeps, $1)= _LT_AC_TAGVAR(compiler_lib_search_path, $1)= _LT_AC_TAGVAR(compiler_lib_search_dirs, $1)= # Source file extension for C++ test sources. ac_ext=cpp # Object file extension for compiled C++ test sources. objext=o _LT_AC_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_AC_SYS_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_LD=$LD lt_save_GCC=$GCC GCC=$GXX lt_save_with_gnu_ld=$with_gnu_ld lt_save_path_LD=$lt_cv_path_LD if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx else $as_unset lt_cv_prog_gnu_ld fi if test -n "${lt_cv_path_LDCXX+set}"; then lt_cv_path_LD=$lt_cv_path_LDCXX else $as_unset lt_cv_path_LD fi test -z "${LDCXX+set}" || LD=$LDCXX CC=${CXX-"c++"} compiler=$CC _LT_AC_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) # We don't want -fno-exception wen compiling C++ code, so set the # no_builtin_flag separately if test "$GXX" = yes; then _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' else _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= fi if test "$GXX" = yes; then # Set up default GNU C++ configuration AC_PROG_LD # Check if GNU C++ uses GNU ld as the underlying linker, since the # archiving commands below assume that GNU ld is being used. if test "$with_gnu_ld" = yes; then _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' # If archive_cmds runs LD, not CC, wlarc should be empty # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to # investigate it a little bit more. (MM) wlarc='${wl}' # ancient GNU ld didn't support --whole-archive et. al. if eval "`$CC -print-prog-name=ld` --help 2>&1" | \ grep 'no-whole-archive' > /dev/null; then _LT_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else _LT_AC_TAGVAR(whole_archive_flag_spec, $1)= fi else with_gnu_ld=no wlarc= # A generic and very simple default shared library creation # command for GNU C++ for the case where it uses the native # linker, instead of GNU ld. If possible, this setting should # overridden to take advantage of the native linker features on # the platform it is being used on. _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' fi # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' else GXX=no with_gnu_ld=no wlarc= fi # PORTME: fill in a description of your system's C++ link characteristics AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) _LT_AC_TAGVAR(ld_shlibs, $1)=yes case $host_os in aix3*) # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; aix[[4-9]]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) for ld_flag in $LDFLAGS; do case $ld_flag in *-brtl*) aix_use_runtimelinking=yes break ;; esac done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. _LT_AC_TAGVAR(archive_cmds, $1)='' _LT_AC_TAGVAR(hardcode_direct, $1)=yes _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_AC_TAGVAR(link_all_deplibs, $1)=yes if test "$GXX" = yes; then case $host_os in aix4.[[012]]|aix4.[[012]].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && \ strings "$collect2name" | grep resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 _LT_AC_TAGVAR(hardcode_direct, $1)=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)= fi ;; esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. _LT_AC_TAGVAR(always_export_symbols, $1)=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. _LT_AC_TAGVAR(allow_undefined_flag, $1)='-berok' # Determine the default libpath from the value encoded in an empty executable. _LT_AC_SYS_LIBPATH_AIX _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' _LT_AC_TAGVAR(allow_undefined_flag, $1)="-z nodefs" _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an empty executable. _LT_AC_SYS_LIBPATH_AIX _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. _LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' # Exported symbols can be pulled into shared objects from archives _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='$convenience' _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes # This is similar to how AIX traditionally builds its shared libraries. _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; beos*) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME _LT_AC_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else _LT_AC_TAGVAR(ld_shlibs, $1)=no fi ;; chorus*) case $cc_basename in *) # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; esac ;; cygwin* | mingw* | pw32*) # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, # as there is no search path for DLLs. _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_AC_TAGVAR(always_export_symbols, $1)=no _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... _LT_AC_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else _LT_AC_TAGVAR(ld_shlibs, $1)=no fi ;; darwin* | rhapsody*) _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no _LT_AC_TAGVAR(hardcode_direct, $1)=no _LT_AC_TAGVAR(hardcode_automatic, $1)=yes _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='' _LT_AC_TAGVAR(link_all_deplibs, $1)=yes _LT_AC_TAGVAR(allow_undefined_flag, $1)="$_lt_dar_allow_undefined" if test "$GXX" = yes ; then output_verbose_link_cmd='echo' _LT_AC_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" _LT_AC_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" _LT_AC_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" _LT_AC_TAGVAR(module_expsym_cmds, $1)="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" if test "$lt_cv_apple_cc_single_mod" != "yes"; then _LT_AC_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}" _LT_AC_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}" fi else case $cc_basename in xlc*) output_verbose_link_cmd='echo' _LT_AC_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $xlcverstring' _LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $xlcverstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' ;; *) _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; esac fi ;; dgux*) case $cc_basename in ec++*) # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; ghcx*) # Green Hills C++ Compiler # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; esac ;; freebsd[[12]]*) # C++ shared libraries reported to be fairly broken before switch to ELF _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; freebsd-elf*) _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no ;; freebsd* | dragonfly*) # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF # conventions _LT_AC_TAGVAR(ld_shlibs, $1)=yes ;; gnu*) ;; hpux9*) _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' _LT_AC_TAGVAR(hardcode_direct, $1)=yes _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, # but as the default # location of the library. case $cc_basename in CC*) # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; aCC*) _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "[[-]]L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' ;; *) if test "$GXX" = yes; then _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -shared -nostdlib -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; hpux10*|hpux11*) if test $with_gnu_ld = no; then _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: case $host_cpu in hppa*64*|ia64*) ;; *) _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' ;; esac fi case $host_cpu in hppa*64*|ia64*) _LT_AC_TAGVAR(hardcode_direct, $1)=no _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_AC_TAGVAR(hardcode_direct, $1)=yes _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, # but as the default # location of the library. ;; esac case $cc_basename in CC*) # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; aCC*) case $host_cpu in hppa*64*) _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' ;; *) if test "$GXX" = yes; then if test $with_gnu_ld = no; then case $host_cpu in hppa*64*) _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac fi else # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; interix[[3-9]]*) _LT_AC_TAGVAR(hardcode_direct, $1)=no _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; irix5* | irix6*) case $cc_basename in CC*) # SGI C++ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' # Archives containing C++ object files must be created using # "CC -ar", where "CC" is the IRIX C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs' ;; *) if test "$GXX" = yes; then if test "$with_gnu_ld" = no; then _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` -o $lib' fi fi _LT_AC_TAGVAR(link_all_deplibs, $1)=yes ;; esac _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: ;; linux* | k*bsd*-gnu) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. _LT_AC_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | grep "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath,$libdir' _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' # Archives containing C++ object files must be created using # "CC -Bstatic", where "CC" is the KAI C++ compiler. _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; icpc*) # Intel C++ with_gnu_ld=yes # version 8.0 and above of icpc choke on multiply defined symbols # if we add $predep_objects and $postdep_objects, however 7.1 and # earlier do not add the objects themselves. case `$CC -V 2>&1` in *"Version 7."*) _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ;; *) # Version 8.0 or newer tmp_idyn= case $host_cpu in ia64*) tmp_idyn=' -i_dynamic';; esac _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ;; esac _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' ;; pgCC* | pgcpp*) # Portland Group C++ compiler _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' ;; cxx*) # Compaq C++ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' runpath_var=LD_RUN_PATH _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 _LT_AC_TAGVAR(no_undefined_flag, $1)=' -zdefs' _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' # Not sure whether something based on # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 # would be better. output_verbose_link_cmd='echo' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' ;; esac ;; esac ;; lynxos*) # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; m88k*) # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; mvs*) case $cc_basename in cxx*) # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; esac ;; netbsd*) if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' wlarc= _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_AC_TAGVAR(hardcode_direct, $1)=yes _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no fi # Workaround some broken pre-1.5 toolchains output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' ;; openbsd2*) # C++ shared libraries are fairly broken _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; openbsd*) if test -f /usr/libexec/ld.so; then _LT_AC_TAGVAR(hardcode_direct, $1)=yes _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' _LT_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' fi output_verbose_link_cmd='echo' else _LT_AC_TAGVAR(ld_shlibs, $1)=no fi ;; osf3*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. _LT_AC_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: # Archives containing C++ object files must be created using # "CC -Bstatic", where "CC" is the KAI C++ compiler. _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; RCC*) # Rational C++ 2.4.1 # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; cxx*) _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && echo ${wl}-set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' ;; *) if test "$GXX" = yes && test "$with_gnu_ld" = no; then _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' else # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; osf4* | osf5*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. _LT_AC_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: # Archives containing C++ object files must be created using # the KAI C++ compiler. _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;; RCC*) # Rational C++ 2.4.1 # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; cxx*) _LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ echo "-hidden">> $lib.exp~ $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname -Wl,-input -Wl,$lib.exp `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib~ $rm $lib.exp' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' ;; *) if test "$GXX" = yes && test "$with_gnu_ld" = no; then _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' else # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; psos*) # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; lcc*) # Lucid # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; esac ;; solaris*) case $cc_basename in CC*) # Sun C++ 4.2, 5.x and Centerline C++ _LT_AC_TAGVAR(archive_cmds_need_lc,$1)=yes _LT_AC_TAGVAR(no_undefined_flag, $1)=' -zdefs' _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. # Supported since Solaris 2.6 (maybe 2.5.1?) _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' ;; esac _LT_AC_TAGVAR(link_all_deplibs, $1)=yes output_verbose_link_cmd='echo' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' ;; gcx*) # Green Hills C++ Compiler _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' # The C++ compiler must be used to create the archive. _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs' ;; *) # GNU C++ compiler with Solaris linker if test "$GXX" = yes && test "$with_gnu_ld" = no; then _LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs' if $CC --version | grep -v '^2\.7' > /dev/null; then _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $CC -shared -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd="$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\"" else # g++ 2.7 appears to require `-G' NOT `-shared' on this # platform. _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd="$CC -G $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\"" fi _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir' case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' ;; esac fi ;; esac ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) _LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var='LD_RUN_PATH' case $cc_basename in CC*) _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; *) _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. # For security reasons, it is highly recommended that you always # use absolute paths for naming shared libraries, and exclude the # DT_RUNPATH tag from executables and libraries. But doing so # requires that you compile everything twice, which is a pain. # So that behaviour is only enabled if SCOABSPATH is set to a # non-empty value in the environment. Most likely only useful for # creating official distributions of packages. # This is a hack until libtool officially supports absolute path # names for shared libraries. _LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_AC_TAGVAR(link_all_deplibs, $1)=yes _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' runpath_var='LD_RUN_PATH' case $cc_basename in CC*) _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; *) _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; esac ;; vxworks*) # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; esac AC_MSG_RESULT([$_LT_AC_TAGVAR(ld_shlibs, $1)]) test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no _LT_AC_TAGVAR(GCC, $1)="$GXX" _LT_AC_TAGVAR(LD, $1)="$LD" AC_LIBTOOL_POSTDEP_PREDEP($1) AC_LIBTOOL_PROG_COMPILER_PIC($1) AC_LIBTOOL_PROG_CC_C_O($1) AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1) AC_LIBTOOL_PROG_LD_SHLIBS($1) AC_LIBTOOL_SYS_DYNAMIC_LINKER($1) AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1) AC_LIBTOOL_CONFIG($1) AC_LANG_POP CC=$lt_save_CC LDCXX=$LD LD=$lt_save_LD GCC=$lt_save_GCC with_gnu_ldcxx=$with_gnu_ld with_gnu_ld=$lt_save_with_gnu_ld lt_cv_path_LDCXX=$lt_cv_path_LD lt_cv_path_LD=$lt_save_path_LD lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld ])# AC_LIBTOOL_LANG_CXX_CONFIG # AC_LIBTOOL_POSTDEP_PREDEP([TAGNAME]) # ------------------------------------ # Figure out "hidden" library dependencies from verbose # compiler output when linking a shared library. # Parse the compiler output and extract the necessary # objects, libraries and library flags. AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP], [AC_REQUIRE([LT_AC_PROG_SED])dnl dnl we can't use the lt_simple_compile_test_code here, dnl because it contains code intended for an executable, dnl not a library. It's possible we should let each dnl tag define a new lt_????_link_test_code variable, dnl but it's only used here... ifelse([$1],[],[cat > conftest.$ac_ext < conftest.$ac_ext < conftest.$ac_ext < conftest.$ac_ext <&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 # # The more standards-conforming stlport4 library is # incompatible with the Cstd library. Avoid specifying # it if it's in CXXFLAGS. Ignore libCrun as # -library=stlport4 depends on it. case " $CXX $CXXFLAGS " in *" -library=stlport4 "*) solaris_use_stlport4=yes ;; esac if test "$solaris_use_stlport4" != yes; then _LT_AC_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' fi ;; esac ;; solaris*) case $cc_basename in CC*) # The more standards-conforming stlport4 library is # incompatible with the Cstd library. Avoid specifying # it if it's in CXXFLAGS. Ignore libCrun as # -library=stlport4 depends on it. case " $CXX $CXXFLAGS " in *" -library=stlport4 "*) solaris_use_stlport4=yes ;; esac # Adding this requires a known-good setup of shared libraries for # Sun compiler versions before 5.6, else PIC objects from an old # archive will be linked into the output, leading to subtle bugs. if test "$solaris_use_stlport4" != yes; then _LT_AC_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' fi ;; esac ;; esac ]) case " $_LT_AC_TAGVAR(postdeps, $1) " in *" -lc "*) _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no ;; esac ])# AC_LIBTOOL_POSTDEP_PREDEP # AC_LIBTOOL_LANG_F77_CONFIG # -------------------------- # Ensure that the configuration vars for the C compiler are # suitably defined. Those variables are subsequently used by # AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'. AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG], [_LT_AC_LANG_F77_CONFIG(F77)]) AC_DEFUN([_LT_AC_LANG_F77_CONFIG], [AC_REQUIRE([AC_PROG_F77]) AC_LANG_PUSH(Fortran 77) _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no _LT_AC_TAGVAR(allow_undefined_flag, $1)= _LT_AC_TAGVAR(always_export_symbols, $1)=no _LT_AC_TAGVAR(archive_expsym_cmds, $1)= _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)= _LT_AC_TAGVAR(hardcode_direct, $1)=no _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= _LT_AC_TAGVAR(hardcode_libdir_separator, $1)= _LT_AC_TAGVAR(hardcode_minus_L, $1)=no _LT_AC_TAGVAR(hardcode_automatic, $1)=no _LT_AC_TAGVAR(module_cmds, $1)= _LT_AC_TAGVAR(module_expsym_cmds, $1)= _LT_AC_TAGVAR(link_all_deplibs, $1)=unknown _LT_AC_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_AC_TAGVAR(no_undefined_flag, $1)= _LT_AC_TAGVAR(whole_archive_flag_spec, $1)= _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for f77 test sources. ac_ext=f # Object file extension for compiled f77 test sources. objext=o _LT_AC_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="\ subroutine t return end " # Code to be used in simple link tests lt_simple_link_test_code="\ program t end " # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_AC_SYS_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC="$CC" CC=${F77-"f77"} compiler=$CC _LT_AC_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_AC_TAGVAR(GCC, $1)="$G77" _LT_AC_TAGVAR(LD, $1)="$LD" AC_LIBTOOL_PROG_COMPILER_PIC($1) AC_LIBTOOL_PROG_CC_C_O($1) AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1) AC_LIBTOOL_PROG_LD_SHLIBS($1) AC_LIBTOOL_SYS_DYNAMIC_LINKER($1) AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1) AC_LIBTOOL_CONFIG($1) AC_LANG_POP CC="$lt_save_CC" ])# AC_LIBTOOL_LANG_F77_CONFIG # AC_LIBTOOL_LANG_GCJ_CONFIG # -------------------------- # Ensure that the configuration vars for the C compiler are # suitably defined. Those variables are subsequently used by # AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'. AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG], [_LT_AC_LANG_GCJ_CONFIG(GCJ)]) AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG], [AC_LANG_SAVE # Source file extension for Java test sources. ac_ext=java # Object file extension for compiled Java test sources. objext=o _LT_AC_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="class foo {}" # Code to be used in simple link tests lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_AC_SYS_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC="$CC" CC=${GCJ-"gcj"} compiler=$CC _LT_AC_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) # GCJ did not exist at the time GCC didn't implicitly link libc in. _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no _LT_AC_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds AC_LIBTOOL_PROG_COMPILER_NO_RTTI($1) AC_LIBTOOL_PROG_COMPILER_PIC($1) AC_LIBTOOL_PROG_CC_C_O($1) AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1) AC_LIBTOOL_PROG_LD_SHLIBS($1) AC_LIBTOOL_SYS_DYNAMIC_LINKER($1) AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1) AC_LIBTOOL_CONFIG($1) AC_LANG_RESTORE CC="$lt_save_CC" ])# AC_LIBTOOL_LANG_GCJ_CONFIG # AC_LIBTOOL_LANG_RC_CONFIG # ------------------------- # Ensure that the configuration vars for the Windows resource compiler are # suitably defined. Those variables are subsequently used by # AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'. AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG], [_LT_AC_LANG_RC_CONFIG(RC)]) AC_DEFUN([_LT_AC_LANG_RC_CONFIG], [AC_LANG_SAVE # Source file extension for RC test sources. ac_ext=rc # Object file extension for compiled RC test sources. objext=o _LT_AC_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }' # Code to be used in simple link tests lt_simple_link_test_code="$lt_simple_compile_test_code" # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_AC_SYS_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC="$CC" CC=${RC-"windres"} compiler=$CC _LT_AC_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) _LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes AC_LIBTOOL_CONFIG($1) AC_LANG_RESTORE CC="$lt_save_CC" ])# AC_LIBTOOL_LANG_RC_CONFIG # AC_LIBTOOL_CONFIG([TAGNAME]) # ---------------------------- # If TAGNAME is not passed, then create an initial libtool script # with a default configuration from the untagged config vars. Otherwise # add code to config.status for appending the configuration named by # TAGNAME from the matching tagged config vars. AC_DEFUN([AC_LIBTOOL_CONFIG], [# The else clause should only fire when bootstrapping the # libtool distribution, otherwise you forgot to ship ltmain.sh # with your package, and you will get complaints that there are # no rules to generate ltmain.sh. if test -f "$ltmain"; then # See if we are running on zsh, and set the options which allow our commands through # without removal of \ escapes. if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi # Now quote all the things that may contain metacharacters while being # careful not to overquote the AC_SUBSTed values. We take copies of the # variables and quote the copies for generation of the libtool script. for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \ SED SHELL STRIP \ libname_spec library_names_spec soname_spec extract_expsyms_cmds \ old_striplib striplib file_magic_cmd finish_cmds finish_eval \ deplibs_check_method reload_flag reload_cmds need_locks \ lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \ lt_cv_sys_global_symbol_to_c_name_address \ sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ old_postinstall_cmds old_postuninstall_cmds \ _LT_AC_TAGVAR(compiler, $1) \ _LT_AC_TAGVAR(CC, $1) \ _LT_AC_TAGVAR(LD, $1) \ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1) \ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1) \ _LT_AC_TAGVAR(lt_prog_compiler_static, $1) \ _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) \ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1) \ _LT_AC_TAGVAR(thread_safe_flag_spec, $1) \ _LT_AC_TAGVAR(whole_archive_flag_spec, $1) \ _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1) \ _LT_AC_TAGVAR(old_archive_cmds, $1) \ _LT_AC_TAGVAR(old_archive_from_new_cmds, $1) \ _LT_AC_TAGVAR(predep_objects, $1) \ _LT_AC_TAGVAR(postdep_objects, $1) \ _LT_AC_TAGVAR(predeps, $1) \ _LT_AC_TAGVAR(postdeps, $1) \ _LT_AC_TAGVAR(compiler_lib_search_path, $1) \ _LT_AC_TAGVAR(compiler_lib_search_dirs, $1) \ _LT_AC_TAGVAR(archive_cmds, $1) \ _LT_AC_TAGVAR(archive_expsym_cmds, $1) \ _LT_AC_TAGVAR(postinstall_cmds, $1) \ _LT_AC_TAGVAR(postuninstall_cmds, $1) \ _LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1) \ _LT_AC_TAGVAR(allow_undefined_flag, $1) \ _LT_AC_TAGVAR(no_undefined_flag, $1) \ _LT_AC_TAGVAR(export_symbols_cmds, $1) \ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) \ _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1) \ _LT_AC_TAGVAR(hardcode_libdir_separator, $1) \ _LT_AC_TAGVAR(hardcode_automatic, $1) \ _LT_AC_TAGVAR(module_cmds, $1) \ _LT_AC_TAGVAR(module_expsym_cmds, $1) \ _LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1) \ _LT_AC_TAGVAR(fix_srcfile_path, $1) \ _LT_AC_TAGVAR(exclude_expsyms, $1) \ _LT_AC_TAGVAR(include_expsyms, $1); do case $var in _LT_AC_TAGVAR(old_archive_cmds, $1) | \ _LT_AC_TAGVAR(old_archive_from_new_cmds, $1) | \ _LT_AC_TAGVAR(archive_cmds, $1) | \ _LT_AC_TAGVAR(archive_expsym_cmds, $1) | \ _LT_AC_TAGVAR(module_cmds, $1) | \ _LT_AC_TAGVAR(module_expsym_cmds, $1) | \ _LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1) | \ _LT_AC_TAGVAR(export_symbols_cmds, $1) | \ extract_expsyms_cmds | reload_cmds | finish_cmds | \ postinstall_cmds | postuninstall_cmds | \ old_postinstall_cmds | old_postuninstall_cmds | \ sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) # Double-quote double-evaled strings. eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" ;; *) eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" ;; esac done case $lt_echo in *'\[$]0 --fallback-echo"') lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\[$]0 --fallback-echo"[$]/[$]0 --fallback-echo"/'` ;; esac ifelse([$1], [], [cfgfile="${ofile}T" trap "$rm \"$cfgfile\"; exit 1" 1 2 15 $rm -f "$cfgfile" AC_MSG_NOTICE([creating $ofile])], [cfgfile="$ofile"]) cat <<__EOF__ >> "$cfgfile" ifelse([$1], [], [#! $SHELL # `$echo "$cfgfile" | sed 's%^.*/%%'` - Provide generalized library-building support services. # Generated automatically by $PROGRAM (GNU $PACKAGE $VERSION$TIMESTAMP) # NOTE: Changes made to this file will be lost: look at ltmain.sh. # # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 # Free Software Foundation, Inc. # # This file is part of GNU Libtool: # Originally by Gordon Matzigkeit , 1996 # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # A sed program that does not truncate output. SED=$lt_SED # Sed that helps us avoid accidentally triggering echo(1) options like -n. Xsed="$SED -e 1s/^X//" # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # The names of the tagged configurations supported by this script. available_tags= # ### BEGIN LIBTOOL CONFIG], [# ### BEGIN LIBTOOL TAG CONFIG: $tagname]) # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # Shell to use when invoking shell scripts. SHELL=$lt_SHELL # Whether or not to build shared libraries. build_libtool_libs=$enable_shared # Whether or not to build static libraries. build_old_libs=$enable_static # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$_LT_AC_TAGVAR(archive_cmds_need_lc, $1) # Whether or not to disallow shared libs when runtime libs are static allow_libtool_libs_with_static_runtimes=$_LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1) # Whether or not to optimize for fast installation. fast_install=$enable_fast_install # The host system. host_alias=$host_alias host=$host host_os=$host_os # The build system. build_alias=$build_alias build=$build build_os=$build_os # An echo program that does not interpret backslashes. echo=$lt_echo # The archiver. AR=$lt_AR AR_FLAGS=$lt_AR_FLAGS # A C compiler. LTCC=$lt_LTCC # LTCC compiler flags. LTCFLAGS=$lt_LTCFLAGS # A language-specific compiler. CC=$lt_[]_LT_AC_TAGVAR(compiler, $1) # Is the compiler the GNU C compiler? with_gcc=$_LT_AC_TAGVAR(GCC, $1) # An ERE matcher. EGREP=$lt_EGREP # The linker used to build libraries. LD=$lt_[]_LT_AC_TAGVAR(LD, $1) # Whether we need hard or soft links. LN_S=$lt_LN_S # A BSD-compatible nm program. NM=$lt_NM # A symbol stripping program STRIP=$lt_STRIP # Used to examine libraries when file_magic_cmd begins "file" MAGIC_CMD=$MAGIC_CMD # Used on cygwin: DLL creation program. DLLTOOL="$DLLTOOL" # Used on cygwin: object dumper. OBJDUMP="$OBJDUMP" # Used on cygwin: assembler. AS="$AS" # The name of the directory that contains temporary libtool files. objdir=$objdir # How to create reloadable object files. reload_flag=$lt_reload_flag reload_cmds=$lt_reload_cmds # How to pass a linker flag through the compiler. wl=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_wl, $1) # Object file suffix (normally "o"). objext="$ac_objext" # Old archive suffix (normally "a"). libext="$libext" # Shared library suffix (normally ".so"). shrext_cmds='$shrext_cmds' # Executable file suffix (normally ""). exeext="$exeext" # Additional compiler flags for building library objects. pic_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) pic_mode=$pic_mode # What is the maximum length of a command? max_cmd_len=$lt_cv_sys_max_cmd_len # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_[]_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1) # Must we lock files when doing compilation? need_locks=$lt_need_locks # Do we need the lib prefix for modules? need_lib_prefix=$need_lib_prefix # Do we need a version for libraries? need_version=$need_version # Whether dlopen is supported. dlopen_support=$enable_dlopen # Whether dlopen of programs is supported. dlopen_self=$enable_dlopen_self # Whether dlopen of statically linked programs is supported. dlopen_self_static=$enable_dlopen_self_static # Compiler flag to prevent dynamic linking. link_static_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_static, $1) # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_[]_LT_AC_TAGVAR(export_dynamic_flag_spec, $1) # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec=$lt_[]_LT_AC_TAGVAR(whole_archive_flag_spec, $1) # Compiler flag to generate thread-safe objects. thread_safe_flag_spec=$lt_[]_LT_AC_TAGVAR(thread_safe_flag_spec, $1) # Library versioning type. version_type=$version_type # Format of library name prefix. libname_spec=$lt_libname_spec # List of archive names. First name is the real one, the rest are links. # The last name is the one that the linker finds with -lNAME. library_names_spec=$lt_library_names_spec # The coded name of the library, if different from the real name. soname_spec=$lt_soname_spec # Commands used to build and install an old-style archive. RANLIB=$lt_RANLIB old_archive_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_cmds, $1) old_postinstall_cmds=$lt_old_postinstall_cmds old_postuninstall_cmds=$lt_old_postuninstall_cmds # Create an old-style archive from a shared archive. old_archive_from_new_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_from_new_cmds, $1) # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1) # Commands used to build and install a shared archive. archive_cmds=$lt_[]_LT_AC_TAGVAR(archive_cmds, $1) archive_expsym_cmds=$lt_[]_LT_AC_TAGVAR(archive_expsym_cmds, $1) postinstall_cmds=$lt_postinstall_cmds postuninstall_cmds=$lt_postuninstall_cmds # Commands used to build a loadable module (assumed same as above if empty) module_cmds=$lt_[]_LT_AC_TAGVAR(module_cmds, $1) module_expsym_cmds=$lt_[]_LT_AC_TAGVAR(module_expsym_cmds, $1) # Commands to strip libraries. old_striplib=$lt_old_striplib striplib=$lt_striplib # Dependencies to place before the objects being linked to create a # shared library. predep_objects=$lt_[]_LT_AC_TAGVAR(predep_objects, $1) # Dependencies to place after the objects being linked to create a # shared library. postdep_objects=$lt_[]_LT_AC_TAGVAR(postdep_objects, $1) # Dependencies to place before the objects being linked to create a # shared library. predeps=$lt_[]_LT_AC_TAGVAR(predeps, $1) # Dependencies to place after the objects being linked to create a # shared library. postdeps=$lt_[]_LT_AC_TAGVAR(postdeps, $1) # The directories searched by this compiler when creating a shared # library compiler_lib_search_dirs=$lt_[]_LT_AC_TAGVAR(compiler_lib_search_dirs, $1) # The library search path used internally by the compiler when linking # a shared library. compiler_lib_search_path=$lt_[]_LT_AC_TAGVAR(compiler_lib_search_path, $1) # Method to check whether dependent libraries are shared objects. deplibs_check_method=$lt_deplibs_check_method # Command to use when deplibs_check_method == file_magic. file_magic_cmd=$lt_file_magic_cmd # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_[]_LT_AC_TAGVAR(allow_undefined_flag, $1) # Flag that forces no undefined symbols. no_undefined_flag=$lt_[]_LT_AC_TAGVAR(no_undefined_flag, $1) # Commands used to finish a libtool library installation in a directory. finish_cmds=$lt_finish_cmds # Same as above, but a single script fragment to be evaled but not shown. finish_eval=$lt_finish_eval # Take the output of nm and produce a listing of raw symbols and C names. global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe # Transform the output of nm in a proper C declaration global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl # Transform the output of nm in a C name address pair global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address # This is the shared library runtime path variable. runpath_var=$runpath_var # This is the shared library path variable. shlibpath_var=$shlibpath_var # Is shlibpath searched before the hard-coded library search path? shlibpath_overrides_runpath=$shlibpath_overrides_runpath # How to hardcode a shared library path into an executable. hardcode_action=$_LT_AC_TAGVAR(hardcode_action, $1) # Whether we should hardcode library paths into libraries. hardcode_into_libs=$hardcode_into_libs # Flag to hardcode \$libdir into a binary during linking. # This must work even if \$libdir does not exist. hardcode_libdir_flag_spec=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) # If ld is used when linking, flag to hardcode \$libdir into # a binary during linking. This must work even if \$libdir does # not exist. hardcode_libdir_flag_spec_ld=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1) # Whether we need a single -rpath flag with a separated argument. hardcode_libdir_separator=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_separator, $1) # Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the # resulting binary. hardcode_direct=$_LT_AC_TAGVAR(hardcode_direct, $1) # Set to yes if using the -LDIR flag during linking hardcodes DIR into the # resulting binary. hardcode_minus_L=$_LT_AC_TAGVAR(hardcode_minus_L, $1) # Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into # the resulting binary. hardcode_shlibpath_var=$_LT_AC_TAGVAR(hardcode_shlibpath_var, $1) # Set to yes if building a shared library automatically hardcodes DIR into the library # and all subsequent libraries and executables linked against it. hardcode_automatic=$_LT_AC_TAGVAR(hardcode_automatic, $1) # Variables whose values should be saved in libtool wrapper scripts and # restored at relink time. variables_saved_for_relink="$variables_saved_for_relink" # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$_LT_AC_TAGVAR(link_all_deplibs, $1) # Compile-time system search path for libraries sys_lib_search_path_spec=$lt_sys_lib_search_path_spec # Run-time system search path for libraries sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec # Fix the shell variable \$srcfile for the compiler. fix_srcfile_path=$lt_fix_srcfile_path # Set to yes if exported symbols are required. always_export_symbols=$_LT_AC_TAGVAR(always_export_symbols, $1) # The commands to list exported symbols. export_symbols_cmds=$lt_[]_LT_AC_TAGVAR(export_symbols_cmds, $1) # The commands to extract the exported symbol list from a shared archive. extract_expsyms_cmds=$lt_extract_expsyms_cmds # Symbols that should not be listed in the preloaded symbols. exclude_expsyms=$lt_[]_LT_AC_TAGVAR(exclude_expsyms, $1) # Symbols that must always be exported. include_expsyms=$lt_[]_LT_AC_TAGVAR(include_expsyms, $1) ifelse([$1],[], [# ### END LIBTOOL CONFIG], [# ### END LIBTOOL TAG CONFIG: $tagname]) __EOF__ ifelse([$1],[], [ case $host_os in aix3*) cat <<\EOF >> "$cfgfile" # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi EOF ;; esac # We use sed instead of cat because bash on DJGPP gets confused if # if finds mixed CR/LF and LF-only lines. Since sed operates in # text mode, it properly converts lines to CR/LF. This bash problem # is reportedly fixed, but why not run on old versions too? sed '$q' "$ltmain" >> "$cfgfile" || (rm -f "$cfgfile"; exit 1) mv -f "$cfgfile" "$ofile" || \ (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") chmod +x "$ofile" ]) else # If there is no Makefile yet, we rely on a make rule to execute # `config.status --recheck' to rerun these tests and create the # libtool script then. ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` if test -f "$ltmain_in"; then test -f Makefile && make "$ltmain" fi fi ])# AC_LIBTOOL_CONFIG # AC_LIBTOOL_PROG_COMPILER_NO_RTTI([TAGNAME]) # ------------------------------------------- AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= if test "$GCC" = yes; then _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' AC_LIBTOOL_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions], lt_cv_prog_compiler_rtti_exceptions, [-fno-rtti -fno-exceptions], [], [_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"]) fi ])# AC_LIBTOOL_PROG_COMPILER_NO_RTTI # AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE # --------------------------------- AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_REQUIRE([AC_CANONICAL_HOST]) AC_REQUIRE([LT_AC_PROG_SED]) AC_REQUIRE([AC_PROG_NM]) AC_REQUIRE([AC_OBJEXT]) # Check for command to grab the raw symbol name followed by C symbol from nm. AC_MSG_CHECKING([command to parse $NM output from $compiler object]) AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe], [ # These are sane defaults that work on at least a few old systems. # [They come from Ultrix. What could be older than Ultrix?!! ;)] # Character class describing NM global symbol codes. symcode='[[BCDEGRST]]' # Regexp to match symbols that can be accessed directly from C. sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)' # Transform an extracted symbol line into a proper C declaration lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^. .* \(.*\)$/extern int \1;/p'" # Transform an extracted symbol line into symbol name and symbol address lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" # Define system-specific variables. case $host_os in aix*) symcode='[[BCDT]]' ;; cygwin* | mingw* | pw32*) symcode='[[ABCDGISTW]]' ;; hpux*) # Its linker distinguishes data from code symbols if test "$host_cpu" = ia64; then symcode='[[ABCDEGRST]]' fi lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" ;; linux* | k*bsd*-gnu) if test "$host_cpu" = ia64; then symcode='[[ABCDGIRSTW]]' lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" fi ;; irix* | nonstopux*) symcode='[[BCDEGRST]]' ;; osf*) symcode='[[BCDEGQRST]]' ;; solaris*) symcode='[[BDRT]]' ;; sco3.2v5*) symcode='[[DT]]' ;; sysv4.2uw2*) symcode='[[DT]]' ;; sysv5* | sco5v6* | unixware* | OpenUNIX*) symcode='[[ABDT]]' ;; sysv4) symcode='[[DFNSTU]]' ;; esac # Handle CRLF in mingw tool chain opt_cr= case $build_os in mingw*) opt_cr=`echo 'x\{0,1\}' | tr x '\015'` # option cr in regexp ;; esac # If we're using GNU nm, then use its standard symbol codes. case `$NM -V 2>&1` in *GNU* | *'with BFD'*) symcode='[[ABCDGIRSTW]]' ;; esac # Try without a prefix undercore, then with it. for ac_symprfx in "" "_"; do # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. symxfrm="\\1 $ac_symprfx\\2 \\2" # Write the raw and C identifiers. lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" # Check to see that the pipe works correctly. pipe_works=no rm -f conftest* cat > conftest.$ac_ext < $nlist) && test -s "$nlist"; then # Try sorting and uniquifying the output. if sort "$nlist" | uniq > "$nlist"T; then mv -f "$nlist"T "$nlist" else rm -f "$nlist"T fi # Make sure that we snagged all the symbols we need. if grep ' nm_test_var$' "$nlist" >/dev/null; then if grep ' nm_test_func$' "$nlist" >/dev/null; then cat < conftest.$ac_ext #ifdef __cplusplus extern "C" { #endif EOF # Now generate the symbol file. eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | grep -v main >> conftest.$ac_ext' cat <> conftest.$ac_ext #if defined (__STDC__) && __STDC__ # define lt_ptr_t void * #else # define lt_ptr_t char * # define const #endif /* The mapping between symbol names and symbols. */ const struct { const char *name; lt_ptr_t address; } lt_preloaded_symbols[[]] = { EOF $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (lt_ptr_t) \&\2},/" < "$nlist" | grep -v main >> conftest.$ac_ext cat <<\EOF >> conftest.$ac_ext {0, (lt_ptr_t) 0} }; #ifdef __cplusplus } #endif EOF # Now try linking the two files. mv conftest.$ac_objext conftstm.$ac_objext lt_save_LIBS="$LIBS" lt_save_CFLAGS="$CFLAGS" LIBS="conftstm.$ac_objext" CFLAGS="$CFLAGS$_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)" if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then pipe_works=yes fi LIBS="$lt_save_LIBS" CFLAGS="$lt_save_CFLAGS" else echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD fi else echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD fi else echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD fi else echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD cat conftest.$ac_ext >&5 fi rm -rf conftest* conftst* # Do not use the global_symbol_pipe unless it works. if test "$pipe_works" = yes; then break else lt_cv_sys_global_symbol_pipe= fi done ]) if test -z "$lt_cv_sys_global_symbol_pipe"; then lt_cv_sys_global_symbol_to_cdecl= fi if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then AC_MSG_RESULT(failed) else AC_MSG_RESULT(ok) fi ]) # AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE # AC_LIBTOOL_PROG_COMPILER_PIC([TAGNAME]) # --------------------------------------- AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC], [_LT_AC_TAGVAR(lt_prog_compiler_wl, $1)= _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= _LT_AC_TAGVAR(lt_prog_compiler_static, $1)= AC_MSG_CHECKING([for $compiler option to produce PIC]) ifelse([$1],[CXX],[ # C++ specific cases for pic, static, wl, etc. if test "$GXX" = yes; then _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; amigaos*) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | os2* | pw32*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries m4_if([$1], [GCJ], [], [_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' ;; *djgpp*) # DJGPP does not support shared libraries at all _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= ;; interix[[3-9]]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; sysv4*MP*) if test -d /usr/nec; then _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic fi ;; hpux*) # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) ;; *) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac ;; *) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac else case $host_os in aix[[4-9]]*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' else _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' fi ;; chorus*) case $cc_basename in cxch68*) # Green Hills C++ Compiler # _LT_AC_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" ;; esac ;; darwin*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files case $cc_basename in xlc*) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-qnocommon' _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' ;; esac ;; dgux*) case $cc_basename in ec++*) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' ;; ghcx*) # Green Hills C++ Compiler _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; *) ;; esac ;; freebsd* | dragonfly*) # FreeBSD uses GNU C++ ;; hpux9* | hpux10* | hpux11*) case $cc_basename in CC*) _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' if test "$host_cpu" != ia64; then _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z' fi ;; aCC*) _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z' ;; esac ;; *) ;; esac ;; interix*) # This is c89, which is MS Visual C++ (no shared libs) # Anyone wants to do a port? ;; irix5* | irix6* | nonstopux*) case $cc_basename in CC*) _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' # CC pic flag -KPIC is the default. ;; *) ;; esac ;; linux* | k*bsd*-gnu) case $cc_basename in KCC*) # KAI C++ Compiler _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; icpc* | ecpc*) # Intel C++ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; pgCC* | pgcpp*) # Portland Group C++ compiler. _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; cxx*) # Compaq C++ # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; esac ;; esac ;; lynxos*) ;; m88k*) ;; mvs*) case $cc_basename in cxx*) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall' ;; *) ;; esac ;; netbsd*) ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' ;; RCC*) # Rational C++ 2.4.1 _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; cxx*) # Digital/Compaq C++ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; *) ;; esac ;; psos*) ;; solaris*) case $cc_basename in CC*) # Sun C++ 4.2, 5.x and Centerline C++ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; gcx*) # Green Hills C++ Compiler _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' ;; *) ;; esac ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; lcc*) # Lucid _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; *) ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' ;; *) ;; esac ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) case $cc_basename in CC*) _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; esac ;; vxworks*) ;; *) _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; esac fi ], [ if test "$GCC" = yes; then _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; amigaos*) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | pw32* | os2*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries m4_if([$1], [GCJ], [], [_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' ;; interix[[3-9]]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no enable_shared=no ;; sysv4*MP*) if test -d /usr/nec; then _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic fi ;; hpux*) # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac ;; *) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in aix*) _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' else _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' fi ;; darwin*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files case $cc_basename in xlc*) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-qnocommon' _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' ;; esac ;; mingw* | cygwin* | pw32* | os2*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). m4_if([$1], [GCJ], [], [_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; hpux9* | hpux10* | hpux11*) _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z' ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # PIC (with -KPIC) is the default. _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; newsos6) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; linux* | k*bsd*-gnu) case $cc_basename in icc* | ecc*) _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; pgcc* | pgf77* | pgf90* | pgf95*) # Portland Group compilers (*not* the Pentium gcc compiler, # which looks to be a dead project) _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; ccc*) _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # All Alpha code is PIC. _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C 5.9 _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' ;; *Sun\ F*) # Sun Fortran 8.3 passes all unrecognized flags to the linker _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='' ;; esac ;; esac ;; osf3* | osf4* | osf5*) _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # All OSF/1 code is PIC. _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; rdos*) _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; solaris*) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' case $cc_basename in f77* | f90* | f95*) _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';; *) _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';; esac ;; sunos4*) _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3*) _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec ;then _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; unicos*) _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; uts4*) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; *) _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; esac fi ]) AC_MSG_RESULT([$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)]) # # Check to make sure the PIC flag actually works. # if test -n "$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)"; then AC_LIBTOOL_COMPILER_OPTION([if $compiler PIC flag $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) works], _LT_AC_TAGVAR(lt_cv_prog_compiler_pic_works, $1), [$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)ifelse([$1],[],[ -DPIC],[ifelse([$1],[CXX],[ -DPIC],[])])], [], [case $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) in "" | " "*) ;; *) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)" ;; esac], [_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no]) fi case $host_os in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= ;; *) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)ifelse([$1],[],[ -DPIC],[ifelse([$1],[CXX],[ -DPIC],[])])" ;; esac # # Check to make sure the static flag actually works. # wl=$_LT_AC_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_AC_TAGVAR(lt_prog_compiler_static, $1)\" AC_LIBTOOL_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works], _LT_AC_TAGVAR(lt_cv_prog_compiler_static_works, $1), $lt_tmp_static_flag, [], [_LT_AC_TAGVAR(lt_prog_compiler_static, $1)=]) ]) # AC_LIBTOOL_PROG_LD_SHLIBS([TAGNAME]) # ------------------------------------ # See if the linker supports building shared libraries. AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS], [AC_REQUIRE([LT_AC_PROG_SED])dnl AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) ifelse([$1],[CXX],[ _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' case $host_os in aix[[4-9]]*) # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm if $NM -V 2>&1 | grep 'GNU' > /dev/null; then _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols' else _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols' fi ;; pw32*) _LT_AC_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds" ;; cygwin* | mingw*) _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;/^.*[[ ]]__nm__/s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols' ;; *) _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' ;; esac _LT_AC_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] ],[ runpath_var= _LT_AC_TAGVAR(allow_undefined_flag, $1)= _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=no _LT_AC_TAGVAR(archive_cmds, $1)= _LT_AC_TAGVAR(archive_expsym_cmds, $1)= _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)= _LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1)= _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)= _LT_AC_TAGVAR(whole_archive_flag_spec, $1)= _LT_AC_TAGVAR(thread_safe_flag_spec, $1)= _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= _LT_AC_TAGVAR(hardcode_libdir_separator, $1)= _LT_AC_TAGVAR(hardcode_direct, $1)=no _LT_AC_TAGVAR(hardcode_minus_L, $1)=no _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported _LT_AC_TAGVAR(link_all_deplibs, $1)=unknown _LT_AC_TAGVAR(hardcode_automatic, $1)=no _LT_AC_TAGVAR(module_cmds, $1)= _LT_AC_TAGVAR(module_expsym_cmds, $1)= _LT_AC_TAGVAR(always_export_symbols, $1)=no _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' # include_expsyms should be a list of space-separated symbols to be *always* # included in the symbol list _LT_AC_TAGVAR(include_expsyms, $1)= # exclude_expsyms can be an extended regexp of symbols to exclude # it will be wrapped by ` (' and `)$', so one must not match beginning or # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', # as well as any symbol that contains `d'. _LT_AC_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out # platforms (ab)use it in PIC code, but their linkers get confused if # the symbol is explicitly referenced. Since portable code cannot # rely on this symbol name, it's probably fine to never include it in # preloaded symbol tables. # Exclude shared library initialization/finalization symbols. dnl Note also adjust exclude_expsyms for C++ above. extract_expsyms_cmds= # Just being paranoid about ensuring that cc_basename is set. _LT_CC_BASENAME([$compiler]) case $host_os in cygwin* | mingw* | pw32*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test "$GCC" != yes; then with_gnu_ld=no fi ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++) with_gnu_ld=yes ;; openbsd*) with_gnu_ld=no ;; esac _LT_AC_TAGVAR(ld_shlibs, $1)=yes if test "$with_gnu_ld" = yes; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='${wl}' # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. runpath_var=LD_RUN_PATH _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' # ancient GNU ld didn't support --whole-archive et. al. if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then _LT_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else _LT_AC_TAGVAR(whole_archive_flag_spec, $1)= fi supports_anon_versioning=no case `$LD -v 2>/dev/null` in *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... *\ 2.11.*) ;; # other 2.11 versions *) supports_anon_versioning=yes ;; esac # See if GNU ld supports shared libraries. case $host_os in aix[[3-9]]*) # On AIX/PPC, the GNU linker is very broken if test "$host_cpu" != ia64; then _LT_AC_TAGVAR(ld_shlibs, $1)=no cat <&2 *** Warning: the GNU linker, at least up to release 2.9.1, is reported *** to be unable to reliably create shared libraries on AIX. *** Therefore, libtool is disabling shared libraries support. If you *** really care for shared libraries, you may want to modify your PATH *** so that a non-GNU linker is found, and then restart. EOF fi ;; amigaos*) _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes # Samuel A. Falvo II reports # that the semantics of dynamic libraries on AmigaOS, at least up # to version 4, is to share data among multiple programs linked # with the same dynamic library. Since this doesn't match the # behavior of shared libraries on other platforms, we can't use # them. _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; beos*) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME _LT_AC_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else _LT_AC_TAGVAR(ld_shlibs, $1)=no fi ;; cygwin* | mingw* | pw32*) # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, # as there is no search path for DLLs. _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_AC_TAGVAR(always_export_symbols, $1)=no _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/'\'' -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols' if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... _LT_AC_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else _LT_AC_TAGVAR(ld_shlibs, $1)=no fi ;; interix[[3-9]]*) _LT_AC_TAGVAR(hardcode_direct, $1)=no _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; gnu* | linux* | k*bsd*-gnu) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then tmp_addflag= case $cc_basename,$host_cpu in pgcc*) # Portland Group C compiler _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag' ;; pgf77* | pgf90* | pgf95*) # Portland Group f77 and f90 compilers _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag -Mnomain' ;; ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 tmp_addflag=' -i_dynamic' ;; efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 tmp_addflag=' -i_dynamic -nofor_main' ;; ifc* | ifort*) # Intel Fortran compiler tmp_addflag=' -nofor_main' ;; esac case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C 5.9 _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' tmp_sharedflag='-G' ;; *Sun\ F*) # Sun Fortran 8.3 tmp_sharedflag='-G' ;; *) tmp_sharedflag='-shared' ;; esac _LT_AC_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test $supports_anon_versioning = yes; then _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ $echo "local: *; };" >> $output_objdir/$libname.ver~ $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi else _LT_AC_TAGVAR(ld_shlibs, $1)=no fi ;; netbsd*) if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' fi ;; solaris*) if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then _LT_AC_TAGVAR(ld_shlibs, $1)=no cat <&2 *** Warning: The releases 2.8.* of the GNU linker cannot reliably *** create shared libraries on Solaris systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.9.1 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. EOF elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else _LT_AC_TAGVAR(ld_shlibs, $1)=no fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) case `$LD -v 2>&1` in *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*) _LT_AC_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not *** reliably create shared libraries on SCO systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.16.91.0.3 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF ;; *) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`' _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname,-retain-symbols-file,$export_symbols -o $lib' else _LT_AC_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; sunos4*) _LT_AC_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= _LT_AC_TAGVAR(hardcode_direct, $1)=yes _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else _LT_AC_TAGVAR(ld_shlibs, $1)=no fi ;; esac if test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = no; then runpath_var= _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)= _LT_AC_TAGVAR(whole_archive_flag_spec, $1)= fi else # PORTME fill in a description of your system's linker (not GNU ld) case $host_os in aix3*) _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_AC_TAGVAR(always_export_symbols, $1)=yes _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. _LT_AC_TAGVAR(hardcode_direct, $1)=unsupported fi ;; aix[[4-9]]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm if $NM -V 2>&1 | grep 'GNU' > /dev/null; then _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols' else _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols' fi aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) for ld_flag in $LDFLAGS; do if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then aix_use_runtimelinking=yes break fi done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. _LT_AC_TAGVAR(archive_cmds, $1)='' _LT_AC_TAGVAR(hardcode_direct, $1)=yes _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_AC_TAGVAR(link_all_deplibs, $1)=yes if test "$GCC" = yes; then case $host_os in aix4.[[012]]|aix4.[[012]].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && \ strings "$collect2name" | grep resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 _LT_AC_TAGVAR(hardcode_direct, $1)=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)= fi ;; esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. _LT_AC_TAGVAR(always_export_symbols, $1)=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. _LT_AC_TAGVAR(allow_undefined_flag, $1)='-berok' # Determine the default libpath from the value encoded in an empty executable. _LT_AC_SYS_LIBPATH_AIX _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' _LT_AC_TAGVAR(allow_undefined_flag, $1)="-z nodefs" _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an empty executable. _LT_AC_SYS_LIBPATH_AIX _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. _LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' # Exported symbols can be pulled into shared objects from archives _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='$convenience' _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes # This is similar to how AIX traditionally builds its shared libraries. _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; amigaos*) _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes # see comment about different semantics on the GNU ld section _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; bsdi[[45]]*) _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic ;; cygwin* | mingw* | pw32*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. _LT_AC_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames=' # The linker will automatically build a .lib file if we build a DLL. _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)='true' # FIXME: Should let the user specify the lib program. _LT_AC_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs' _LT_AC_TAGVAR(fix_srcfile_path, $1)='`cygpath -w "$srcfile"`' _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes ;; darwin* | rhapsody*) case $host_os in rhapsody* | darwin1.[[012]]) _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-undefined ${wl}suppress' ;; *) # Darwin 1.3 on if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' else case ${MACOSX_DEPLOYMENT_TARGET} in 10.[[012]]) _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; 10.*) _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-undefined ${wl}dynamic_lookup' ;; esac fi ;; esac _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no _LT_AC_TAGVAR(hardcode_direct, $1)=no _LT_AC_TAGVAR(hardcode_automatic, $1)=yes _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='' _LT_AC_TAGVAR(link_all_deplibs, $1)=yes if test "$GCC" = yes ; then output_verbose_link_cmd='echo' _LT_AC_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" _LT_AC_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" _LT_AC_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" _LT_AC_TAGVAR(module_expsym_cmds, $1)="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" else case $cc_basename in xlc*) output_verbose_link_cmd='echo' _LT_AC_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $xlcverstring' _LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $xlcverstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' ;; *) _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; esac fi ;; dgux*) _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ;; freebsd1*) _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor # support. Future versions do this automatically, but an explicit c++rt0.o # does not break anything, and helps significantly (at the cost of a little # extra space). freebsd2.2*) _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_AC_TAGVAR(hardcode_direct, $1)=yes _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # Unfortunately, older versions of FreeBSD 2 do not have this feature. freebsd2*) _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' _LT_AC_TAGVAR(hardcode_direct, $1)=yes _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. freebsd* | dragonfly*) _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_AC_TAGVAR(hardcode_direct, $1)=yes _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ;; hpux9*) if test "$GCC" = yes; then _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' fi _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: _LT_AC_TAGVAR(hardcode_direct, $1)=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' ;; hpux10*) if test "$GCC" = yes -a "$with_gnu_ld" = no; then _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else _LT_AC_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi if test "$with_gnu_ld" = no; then _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: _LT_AC_TAGVAR(hardcode_direct, $1)=yes _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes fi ;; hpux11*) if test "$GCC" = yes -a "$with_gnu_ld" = no; then case $host_cpu in hppa*64*) _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else case $host_cpu in hppa*64*) _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac fi if test "$with_gnu_ld" = no; then _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: case $host_cpu in hppa*64*|ia64*) _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='+b $libdir' _LT_AC_TAGVAR(hardcode_direct, $1)=no _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_AC_TAGVAR(hardcode_direct, $1)=yes _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) if test "$GCC" = yes; then _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='-rpath $libdir' fi _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: _LT_AC_TAGVAR(link_all_deplibs, $1)=yes ;; netbsd*) if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF fi _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_AC_TAGVAR(hardcode_direct, $1)=yes _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ;; newsos6) _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_AC_TAGVAR(hardcode_direct, $1)=yes _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ;; openbsd*) if test -f /usr/libexec/ld.so; then _LT_AC_TAGVAR(hardcode_direct, $1)=yes _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' else case $host_os in openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*) _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' ;; *) _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' ;; esac fi else _LT_AC_TAGVAR(ld_shlibs, $1)=no fi ;; os2*) _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_AC_TAGVAR(archive_cmds, $1)='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' ;; osf3*) if test "$GCC" = yes; then _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else _LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' fi _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: ;; osf4* | osf5*) # as osf3* with the addition of -msym flag if test "$GCC" = yes; then _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' else _LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~ $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib~$rm $lib.exp' # Both c and cxx compiler support -rpath directly _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' fi _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: ;; solaris*) _LT_AC_TAGVAR(no_undefined_flag, $1)=' -z text' if test "$GCC" = yes; then wlarc='${wl}' _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp' else wlarc='' _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' fi _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. GCC discards it without `$wl', # but is careful enough not to reorder. # Supported since Solaris 2.6 (maybe 2.5.1?) if test "$GCC" = yes; then _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' else _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' fi ;; esac _LT_AC_TAGVAR(link_all_deplibs, $1)=yes ;; sunos4*) if test "x$host_vendor" = xsequent; then # Use $CC to link under sequent, because it throws in some extra .o # files that make .init and .fini sections work. _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_AC_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' fi _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_AC_TAGVAR(hardcode_direct, $1)=yes _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ;; sysv4) case $host_vendor in sni) _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_AC_TAGVAR(hardcode_direct, $1)=yes # is this really true??? ;; siemens) ## LD is ld it makes a PLAMLIB ## CC just makes a GrossModule. _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' _LT_AC_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs' _LT_AC_TAGVAR(hardcode_direct, $1)=no ;; motorola) _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_AC_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie ;; esac runpath_var='LD_RUN_PATH' _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ;; sysv4.3*) _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport' ;; sysv4*MP*) if test -d /usr/nec; then _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var=LD_RUN_PATH hardcode_runpath_var=yes _LT_AC_TAGVAR(ld_shlibs, $1)=yes fi ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) _LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. _LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_AC_TAGVAR(link_all_deplibs, $1)=yes _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; uts4*) _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; esac fi ]) AC_MSG_RESULT([$_LT_AC_TAGVAR(ld_shlibs, $1)]) test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no # # Do we need to explicitly link libc? # case "x$_LT_AC_TAGVAR(archive_cmds_need_lc, $1)" in x|xyes) # Assume -lc should be added _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes if test "$enable_shared" = yes && test "$GCC" = yes; then case $_LT_AC_TAGVAR(archive_cmds, $1) in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. AC_MSG_CHECKING([whether -lc should be explicitly linked in]) $rm conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if AC_TRY_EVAL(ac_compile) 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$_LT_AC_TAGVAR(lt_prog_compiler_wl, $1) pic_flag=$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$_LT_AC_TAGVAR(allow_undefined_flag, $1) _LT_AC_TAGVAR(allow_undefined_flag, $1)= if AC_TRY_EVAL(_LT_AC_TAGVAR(archive_cmds, $1) 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) then _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no else _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes fi _LT_AC_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $rm conftest* AC_MSG_RESULT([$_LT_AC_TAGVAR(archive_cmds_need_lc, $1)]) ;; esac fi ;; esac ])# AC_LIBTOOL_PROG_LD_SHLIBS # _LT_AC_FILE_LTDLL_C # ------------------- # Be careful that the start marker always follows a newline. AC_DEFUN([_LT_AC_FILE_LTDLL_C], [ # /* ltdll.c starts here */ # #define WIN32_LEAN_AND_MEAN # #include # #undef WIN32_LEAN_AND_MEAN # #include # # #ifndef __CYGWIN__ # # ifdef __CYGWIN32__ # # define __CYGWIN__ __CYGWIN32__ # # endif # #endif # # #ifdef __cplusplus # extern "C" { # #endif # BOOL APIENTRY DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved); # #ifdef __cplusplus # } # #endif # # #ifdef __CYGWIN__ # #include # DECLARE_CYGWIN_DLL( DllMain ); # #endif # HINSTANCE __hDllInstance_base; # # BOOL APIENTRY # DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved) # { # __hDllInstance_base = hInst; # return TRUE; # } # /* ltdll.c ends here */ ])# _LT_AC_FILE_LTDLL_C # _LT_AC_TAGVAR(VARNAME, [TAGNAME]) # --------------------------------- AC_DEFUN([_LT_AC_TAGVAR], [ifelse([$2], [], [$1], [$1_$2])]) # old names AC_DEFUN([AM_PROG_LIBTOOL], [AC_PROG_LIBTOOL]) AC_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)]) AC_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)]) AC_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)]) AC_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)]) AC_DEFUN([AM_PROG_LD], [AC_PROG_LD]) AC_DEFUN([AM_PROG_NM], [AC_PROG_NM]) # This is just to silence aclocal about the macro not being used ifelse([AC_DISABLE_FAST_INSTALL]) AC_DEFUN([LT_AC_PROG_GCJ], [AC_CHECK_TOOL(GCJ, gcj, no) test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2" AC_SUBST(GCJFLAGS) ]) AC_DEFUN([LT_AC_PROG_RC], [AC_CHECK_TOOL(RC, windres, no) ]) # Cheap backport of AS_EXECUTABLE_P and required macros # from Autoconf 2.59; we should not use $as_executable_p directly. # _AS_TEST_PREPARE # ---------------- m4_ifndef([_AS_TEST_PREPARE], [m4_defun([_AS_TEST_PREPARE], [if test -x / >/dev/null 2>&1; then as_executable_p='test -x' else as_executable_p='test -f' fi ])])# _AS_TEST_PREPARE # AS_EXECUTABLE_P # --------------- # Check whether a file is executable. m4_ifndef([AS_EXECUTABLE_P], [m4_defun([AS_EXECUTABLE_P], [AS_REQUIRE([_AS_TEST_PREPARE])dnl $as_executable_p $1[]dnl ])])# AS_EXECUTABLE_P # NOTE: This macro has been submitted for inclusion into # # GNU Autoconf as AC_PROG_SED. When it is available in # # a released version of Autoconf we should remove this # # macro and use it instead. # # LT_AC_PROG_SED # -------------- # Check for a fully-functional sed program, that truncates # as few characters as possible. Prefer GNU sed if found. AC_DEFUN([LT_AC_PROG_SED], [AC_MSG_CHECKING([for a sed that does not truncate output]) AC_CACHE_VAL(lt_cv_path_SED, [# Loop through the user's path and test for sed and gsed. # Then use that list of sed's as ones to test for truncation. as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for lt_ac_prog in sed gsed; do for ac_exec_ext in '' $ac_executable_extensions; do if AS_EXECUTABLE_P(["$as_dir/$lt_ac_prog$ac_exec_ext"]); then lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" fi done done done IFS=$as_save_IFS lt_ac_max=0 lt_ac_count=0 # Add /usr/xpg4/bin/sed as it is typically found on Solaris # along with /bin/sed that truncates output. for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do test ! -f $lt_ac_sed && continue cat /dev/null > conftest.in lt_ac_count=0 echo $ECHO_N "0123456789$ECHO_C" >conftest.in # Check for GNU sed and select it if it is found. if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then lt_cv_path_SED=$lt_ac_sed break fi while true; do cat conftest.in conftest.in >conftest.tmp mv conftest.tmp conftest.in cp conftest.in conftest.nl echo >>conftest.nl $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break cmp -s conftest.out conftest.nl || break # 10000 chars as input seems more than enough test $lt_ac_count -gt 10 && break lt_ac_count=`expr $lt_ac_count + 1` if test $lt_ac_count -gt $lt_ac_max; then lt_ac_max=$lt_ac_count lt_cv_path_SED=$lt_ac_sed fi done done ]) SED=$lt_cv_path_SED AC_SUBST([SED]) AC_MSG_RESULT([$SED]) ]) # Copyright (C) 2002, 2003, 2005 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_AUTOMAKE_VERSION(VERSION) # ---------------------------- # Automake X.Y traces this macro to ensure aclocal.m4 has been # generated from the m4 files accompanying Automake X.Y. AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version="1.9"]) # AM_SET_CURRENT_AUTOMAKE_VERSION # ------------------------------- # Call AM_AUTOMAKE_VERSION so it can be traced. # This function is AC_REQUIREd by AC_INIT_AUTOMAKE. AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], [AM_AUTOMAKE_VERSION([1.9.6])]) # AM_AUX_DIR_EXPAND -*- Autoconf -*- # Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets # $ac_aux_dir to `$srcdir/foo'. In other projects, it is set to # `$srcdir', `$srcdir/..', or `$srcdir/../..'. # # Of course, Automake must honor this variable whenever it calls a # tool from the auxiliary directory. The problem is that $srcdir (and # therefore $ac_aux_dir as well) can be either absolute or relative, # depending on how configure is run. This is pretty annoying, since # it makes $ac_aux_dir quite unusable in subdirectories: in the top # source directory, any form will work fine, but in subdirectories a # relative path needs to be adjusted first. # # $ac_aux_dir/missing # fails when called from a subdirectory if $ac_aux_dir is relative # $top_srcdir/$ac_aux_dir/missing # fails if $ac_aux_dir is absolute, # fails when called from a subdirectory in a VPATH build with # a relative $ac_aux_dir # # The reason of the latter failure is that $top_srcdir and $ac_aux_dir # are both prefixed by $srcdir. In an in-source build this is usually # harmless because $srcdir is `.', but things will broke when you # start a VPATH build or use an absolute $srcdir. # # So we could use something similar to $top_srcdir/$ac_aux_dir/missing, # iff we strip the leading $srcdir from $ac_aux_dir. That would be: # am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` # and then we would define $MISSING as # MISSING="\${SHELL} $am_aux_dir/missing" # This will work as long as MISSING is not called from configure, because # unfortunately $(top_srcdir) has no meaning in configure. # However there are other variables, like CC, which are often used in # configure, and could therefore not use this "fixed" $ac_aux_dir. # # Another solution, used here, is to always expand $ac_aux_dir to an # absolute PATH. The drawback is that using absolute paths prevent a # configured tree to be moved without reconfiguration. AC_DEFUN([AM_AUX_DIR_EXPAND], [dnl Rely on autoconf to set up CDPATH properly. AC_PREREQ([2.50])dnl # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` ]) # AM_CONDITIONAL -*- Autoconf -*- # Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 7 # AM_CONDITIONAL(NAME, SHELL-CONDITION) # ------------------------------------- # Define a conditional. AC_DEFUN([AM_CONDITIONAL], [AC_PREREQ(2.52)dnl ifelse([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl AC_SUBST([$1_TRUE]) AC_SUBST([$1_FALSE]) if $2; then $1_TRUE= $1_FALSE='#' else $1_TRUE='#' $1_FALSE= fi AC_CONFIG_COMMANDS_PRE( [if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then AC_MSG_ERROR([[conditional "$1" was never defined. Usually this means the macro was only invoked conditionally.]]) fi])]) # Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 8 # There are a few dirty hacks below to avoid letting `AC_PROG_CC' be # written in clear, in which case automake, when reading aclocal.m4, # will think it sees a *use*, and therefore will trigger all it's # C support machinery. Also note that it means that autoscan, seeing # CC etc. in the Makefile, will ask for an AC_PROG_CC use... # _AM_DEPENDENCIES(NAME) # ---------------------- # See how the compiler implements dependency checking. # NAME is "CC", "CXX", "GCJ", or "OBJC". # We try a few techniques and use that to set a single cache variable. # # We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was # modified to invoke _AM_DEPENDENCIES(CC); we would have a circular # dependency, and given that the user is not expected to run this macro, # just rely on AC_PROG_CC. AC_DEFUN([_AM_DEPENDENCIES], [AC_REQUIRE([AM_SET_DEPDIR])dnl AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl AC_REQUIRE([AM_MAKE_INCLUDE])dnl AC_REQUIRE([AM_DEP_TRACK])dnl ifelse([$1], CC, [depcc="$CC" am_compiler_list=], [$1], CXX, [depcc="$CXX" am_compiler_list=], [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'], [$1], GCJ, [depcc="$GCJ" am_compiler_list='gcc3 gcc'], [depcc="$$1" am_compiler_list=]) AC_CACHE_CHECK([dependency style of $depcc], [am_cv_$1_dependencies_compiler_type], [if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named `D' -- because `-MD' means `put the output # in D'. mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_$1_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` fi for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with # Solaris 8's {/usr,}/bin/sh. touch sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf case $depmode in nosideeffect) # after this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; none) break ;; esac # We check with `-c' and `-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle `-M -o', and we need to detect this. if depmode=$depmode \ source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_$1_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_$1_dependencies_compiler_type=none fi ]) AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) AM_CONDITIONAL([am__fastdep$1], [ test "x$enable_dependency_tracking" != xno \ && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) ]) # AM_SET_DEPDIR # ------------- # Choose a directory name for dependency files. # This macro is AC_REQUIREd in _AM_DEPENDENCIES AC_DEFUN([AM_SET_DEPDIR], [AC_REQUIRE([AM_SET_LEADING_DOT])dnl AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl ]) # AM_DEP_TRACK # ------------ AC_DEFUN([AM_DEP_TRACK], [AC_ARG_ENABLE(dependency-tracking, [ --disable-dependency-tracking speeds up one-time build --enable-dependency-tracking do not reject slow dependency extractors]) if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' fi AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) AC_SUBST([AMDEPBACKSLASH]) ]) # Generate code to set up dependency tracking. -*- Autoconf -*- # Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. #serial 3 # _AM_OUTPUT_DEPENDENCY_COMMANDS # ------------------------------ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], [for mf in $CONFIG_FILES; do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named `Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # So let's grep whole file. if grep '^#.*generated by automake' $mf > /dev/null 2>&1; then dirpart=`AS_DIRNAME("$mf")` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running `make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # When using ansi2knr, U may be empty or an underscore; expand it U=`sed -n 's/^U = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`AS_DIRNAME(["$file"])` AS_MKDIR_P([$dirpart/$fdir]) # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done ])# _AM_OUTPUT_DEPENDENCY_COMMANDS # AM_OUTPUT_DEPENDENCY_COMMANDS # ----------------------------- # This macro should only be invoked once -- use via AC_REQUIRE. # # This code is only required when automatic dependency tracking # is enabled. FIXME. This creates each `.P' file that we will # need in order to bootstrap the dependency handling code. AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], [AC_CONFIG_COMMANDS([depfiles], [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) ]) # Do all the work for Automake. -*- Autoconf -*- # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 12 # This macro actually does too much. Some checks are only needed if # your package does certain things. But this isn't really a big deal. # AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) # AM_INIT_AUTOMAKE([OPTIONS]) # ----------------------------------------------- # The call with PACKAGE and VERSION arguments is the old style # call (pre autoconf-2.50), which is being phased out. PACKAGE # and VERSION should now be passed to AC_INIT and removed from # the call to AM_INIT_AUTOMAKE. # We support both call styles for the transition. After # the next Automake release, Autoconf can make the AC_INIT # arguments mandatory, and then we can depend on a new Autoconf # release and drop the old call support. AC_DEFUN([AM_INIT_AUTOMAKE], [AC_PREREQ([2.58])dnl dnl Autoconf wants to disallow AM_ names. We explicitly allow dnl the ones we care about. m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl AC_REQUIRE([AC_PROG_INSTALL])dnl # test to see if srcdir already configured if test "`cd $srcdir && pwd`" != "`pwd`" && test -f $srcdir/config.status; then AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi AC_SUBST([CYGPATH_W]) # Define the identity of the package. dnl Distinguish between old-style and new-style calls. m4_ifval([$2], [m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl AC_SUBST([PACKAGE], [$1])dnl AC_SUBST([VERSION], [$2])], [_AM_SET_OPTIONS([$1])dnl AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl _AM_IF_OPTION([no-define],, [AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package]) AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl # Some tools Automake needs. AC_REQUIRE([AM_SANITY_CHECK])dnl AC_REQUIRE([AC_ARG_PROGRAM])dnl AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version}) AM_MISSING_PROG(AUTOCONF, autoconf) AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version}) AM_MISSING_PROG(AUTOHEADER, autoheader) AM_MISSING_PROG(MAKEINFO, makeinfo) AM_PROG_INSTALL_SH AM_PROG_INSTALL_STRIP AC_REQUIRE([AM_PROG_MKDIR_P])dnl # We need awk for the "check" target. The system "awk" is bad on # some platforms. AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AM_SET_LEADING_DOT])dnl _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], [_AM_PROG_TAR([v7])])]) _AM_IF_OPTION([no-dependencies],, [AC_PROVIDE_IFELSE([AC_PROG_CC], [_AM_DEPENDENCIES(CC)], [define([AC_PROG_CC], defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl AC_PROVIDE_IFELSE([AC_PROG_CXX], [_AM_DEPENDENCIES(CXX)], [define([AC_PROG_CXX], defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl ]) ]) # When config.status generates a header, we must update the stamp-h file. # This file resides in the same directory as the config header # that is generated. The stamp files are numbered to have different names. # Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the # loop where config.status creates the headers, so we can generate # our stamp files there. AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], [# Compute $1's index in $config_headers. _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $1 | $1:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $1" >`AS_DIRNAME([$1])`/stamp-h[]$_am_stamp_count]) # Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_INSTALL_SH # ------------------ # Define $install_sh. AC_DEFUN([AM_PROG_INSTALL_SH], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl install_sh=${install_sh-"$am_aux_dir/install-sh"} AC_SUBST(install_sh)]) # Copyright (C) 2003, 2005 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 2 # Check whether the underlying file-system supports filenames # with a leading dot. For instance MS-DOS doesn't. AC_DEFUN([AM_SET_LEADING_DOT], [rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null AC_SUBST([am__leading_dot])]) # Check to see how 'make' treats includes. -*- Autoconf -*- # Copyright (C) 2001, 2002, 2003, 2005 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 3 # AM_MAKE_INCLUDE() # ----------------- # Check to see how make treats includes. AC_DEFUN([AM_MAKE_INCLUDE], [am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo done .PHONY: am__doit END # If we don't find an include directive, just comment out the code. AC_MSG_CHECKING([for style of include used by $am_make]) am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # We grep out `Entering directory' and `Leaving directory' # messages which can occur if `w' ends up in MAKEFLAGS. # In particular we don't look at `^make:' because GNU make might # be invoked under some other name (usually "gmake"), in which # case it prints its new name instead of `make'. if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then am__include=include am__quote= _am_result=GNU fi # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then am__include=.include am__quote="\"" _am_result=BSD fi fi AC_SUBST([am__include]) AC_SUBST([am__quote]) AC_MSG_RESULT([$_am_result]) rm -f confinc confmf ]) # Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- # Copyright (C) 1997, 1999, 2000, 2001, 2003, 2005 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 4 # AM_MISSING_PROG(NAME, PROGRAM) # ------------------------------ AC_DEFUN([AM_MISSING_PROG], [AC_REQUIRE([AM_MISSING_HAS_RUN]) $1=${$1-"${am_missing_run}$2"} AC_SUBST($1)]) # AM_MISSING_HAS_RUN # ------------------ # Define MISSING if not defined so far and test if it supports --run. # If it does, set am_missing_run to use it, otherwise, to nothing. AC_DEFUN([AM_MISSING_HAS_RUN], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing" # Use eval to expand $SHELL if eval "$MISSING --run true"; then am_missing_run="$MISSING --run " else am_missing_run= AC_MSG_WARN([`missing' script is too old or missing]) fi ]) # Copyright (C) 2003, 2004, 2005 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_MKDIR_P # --------------- # Check whether `mkdir -p' is supported, fallback to mkinstalldirs otherwise. # # Automake 1.8 used `mkdir -m 0755 -p --' to ensure that directories # created by `make install' are always world readable, even if the # installer happens to have an overly restrictive umask (e.g. 077). # This was a mistake. There are at least two reasons why we must not # use `-m 0755': # - it causes special bits like SGID to be ignored, # - it may be too restrictive (some setups expect 775 directories). # # Do not use -m 0755 and let people choose whatever they expect by # setting umask. # # We cannot accept any implementation of `mkdir' that recognizes `-p'. # Some implementations (such as Solaris 8's) are not thread-safe: if a # parallel make tries to run `mkdir -p a/b' and `mkdir -p a/c' # concurrently, both version can detect that a/ is missing, but only # one can create it and the other will error out. Consequently we # restrict ourselves to GNU make (using the --version option ensures # this.) AC_DEFUN([AM_PROG_MKDIR_P], [if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then # We used to keeping the `.' as first argument, in order to # allow $(mkdir_p) to be used without argument. As in # $(mkdir_p) $(somedir) # where $(somedir) is conditionally defined. However this is wrong # for two reasons: # 1. if the package is installed by a user who cannot write `.' # make install will fail, # 2. the above comment should most certainly read # $(mkdir_p) $(DESTDIR)$(somedir) # so it does not work when $(somedir) is undefined and # $(DESTDIR) is not. # To support the latter case, we have to write # test -z "$(somedir)" || $(mkdir_p) $(DESTDIR)$(somedir), # so the `.' trick is pointless. mkdir_p='mkdir -p --' else # On NextStep and OpenStep, the `mkdir' command does not # recognize any option. It will interpret all options as # directories to create, and then abort because `.' already # exists. for d in ./-p ./--version; do test -d $d && rmdir $d done # $(mkinstalldirs) is defined by Automake if mkinstalldirs exists. if test -f "$ac_aux_dir/mkinstalldirs"; then mkdir_p='$(mkinstalldirs)' else mkdir_p='$(install_sh) -d' fi fi AC_SUBST([mkdir_p])]) # Helper functions for option handling. -*- Autoconf -*- # Copyright (C) 2001, 2002, 2003, 2005 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 3 # _AM_MANGLE_OPTION(NAME) # ----------------------- AC_DEFUN([_AM_MANGLE_OPTION], [[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) # _AM_SET_OPTION(NAME) # ------------------------------ # Set option NAME. Presently that only means defining a flag for this option. AC_DEFUN([_AM_SET_OPTION], [m4_define(_AM_MANGLE_OPTION([$1]), 1)]) # _AM_SET_OPTIONS(OPTIONS) # ---------------------------------- # OPTIONS is a space-separated list of Automake options. AC_DEFUN([_AM_SET_OPTIONS], [AC_FOREACH([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) # _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) # ------------------------------------------- # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. AC_DEFUN([_AM_IF_OPTION], [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) # Check to make sure that the build environment is sane. -*- Autoconf -*- # Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 4 # AM_SANITY_CHECK # --------------- AC_DEFUN([AM_SANITY_CHECK], [AC_MSG_CHECKING([whether build environment is sane]) # Just in case sleep 1 echo timestamp > conftest.file # Do `set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null` if test "$[*]" = "X"; then # -L didn't work. set X `ls -t $srcdir/configure conftest.file` fi rm -f conftest.file if test "$[*]" != "X $srcdir/configure conftest.file" \ && test "$[*]" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken alias in your environment]) fi test "$[2]" = conftest.file ) then # Ok. : else AC_MSG_ERROR([newly created file is older than distributed files! Check your system clock]) fi AC_MSG_RESULT(yes)]) # Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_INSTALL_STRIP # --------------------- # One issue with vendor `install' (even GNU) is that you can't # specify the program used to strip binaries. This is especially # annoying in cross-compiling environments, where the build's strip # is unlikely to handle the host's binaries. # Fortunately install-sh will honor a STRIPPROG variable, so we # always use install-sh in `make install-strip', and initialize # STRIPPROG with the value of the STRIP variable (set by the user). AC_DEFUN([AM_PROG_INSTALL_STRIP], [AC_REQUIRE([AM_PROG_INSTALL_SH])dnl # Installed binaries are usually stripped using `strip' when the user # run `make install-strip'. However `strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the `STRIP' environment variable to overrule this program. dnl Don't test for $cross_compiling = yes, because it might be `maybe'. if test "$cross_compiling" != no; then AC_CHECK_TOOL([STRIP], [strip], :) fi INSTALL_STRIP_PROGRAM="\${SHELL} \$(install_sh) -c -s" AC_SUBST([INSTALL_STRIP_PROGRAM])]) # Check how to create a tarball. -*- Autoconf -*- # Copyright (C) 2004, 2005 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 2 # _AM_PROG_TAR(FORMAT) # -------------------- # Check how to create a tarball in format FORMAT. # FORMAT should be one of `v7', `ustar', or `pax'. # # Substitute a variable $(am__tar) that is a command # writing to stdout a FORMAT-tarball containing the directory # $tardir. # tardir=directory && $(am__tar) > result.tar # # Substitute a variable $(am__untar) that extract such # a tarball read from stdin. # $(am__untar) < result.tar AC_DEFUN([_AM_PROG_TAR], [# Always define AMTAR for backward compatibility. AM_MISSING_PROG([AMTAR], [tar]) m4_if([$1], [v7], [am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'], [m4_case([$1], [ustar],, [pax],, [m4_fatal([Unknown tar format])]) AC_MSG_CHECKING([how to create a $1 tar archive]) # Loop over all known methods to create a tar archive until one works. _am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' _am_tools=${am_cv_prog_tar_$1-$_am_tools} # Do not fold the above two line into one, because Tru64 sh and # Solaris sh will not grok spaces in the rhs of `-'. for _am_tool in $_am_tools do case $_am_tool in gnutar) for _am_tar in tar gnutar gtar; do AM_RUN_LOG([$_am_tar --version]) && break done am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' am__untar="$_am_tar -xf -" ;; plaintar) # Must skip GNU tar: if it does not support --format= it doesn't create # ustar tarball either. (tar --version) >/dev/null 2>&1 && continue am__tar='tar chf - "$$tardir"' am__tar_='tar chf - "$tardir"' am__untar='tar xf -' ;; pax) am__tar='pax -L -x $1 -w "$$tardir"' am__tar_='pax -L -x $1 -w "$tardir"' am__untar='pax -r' ;; cpio) am__tar='find "$$tardir" -print | cpio -o -H $1 -L' am__tar_='find "$tardir" -print | cpio -o -H $1 -L' am__untar='cpio -i -H $1 -d' ;; none) am__tar=false am__tar_=false am__untar=false ;; esac # If the value was cached, stop now. We just wanted to have am__tar # and am__untar set. test -n "${am_cv_prog_tar_$1}" && break # tar/untar a dummy directory, and stop if the command works rm -rf conftest.dir mkdir conftest.dir echo GrepMe > conftest.dir/file AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) rm -rf conftest.dir if test -s conftest.tar; then AM_RUN_LOG([$am__untar /dev/null 2>&1 && break fi done rm -rf conftest.dir AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) AC_MSG_RESULT([$am_cv_prog_tar_$1])]) AC_SUBST([am__tar]) AC_SUBST([am__untar]) ]) # _AM_PROG_TAR iaxmodem-1.2.0/lib/spandsp/unpack_gsm0610_data.sh0000755000175000017500000002041211150047217021054 0ustar julienjulien#!/bin/sh # # SpanDSP - a series of DSP components for telephony # # unpack_gsm0610_data.sh # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License version 2.1, # as published by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this program; if not, write to the Free Software # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. # # $Id: unpack_gsm0610_data.sh,v 1.7 2008/05/03 10:59:44 steveu Exp $ # # The ETSI distribution file extracts to 5 ZIP files, called DISK1.ZIP to DISK5.ZIP # These were originally the contents of 5 floppy disks. Disks 1 to 3 contain data # files. However, disks 4 and 5 contain .EXE files, which unpack.... but only in an # MS environment. These files need to be executed in a Windows or DOS environment, # or a good emulation like FreeDOS or Wine. ETSIDATA="../../../en_300961v080101p0.zip" cd test-data if [ -d etsi ] then cd etsi else mkdir etsi RETVAL=$? if [ $RETVAL != 0 ] then echo Cannot create test-data/etsi! exit $RETVAL fi cd etsi fi if [ -d gsm0610 ] then cd gsm0610 else mkdir gsm0610 RETVAL=$? if [ $RETVAL != 0 ] then echo Cannot create test-data/etsi/gsm0610! exit $RETVAL fi cd gsm0610 fi if [ $1x == --no-exe-runx ] then # Run the .exe files, which should be here ./FR_A.EXE ./FR_HOM_A.EXE ./FR_SYN_A.EXE ./FR_U.EXE ./FR_HOM_U.EXE ./FR_SYN_U.EXE exit 0 fi # Clear out any leftovers from the past rm -rf ASN.1.txt rm -rf DISK1.ZIP rm -rf DISK2.ZIP rm -rf DISK3.ZIP rm -rf DISK4.ZIP rm -rf DISK5.ZIP rm -rf *.EXE rm -rf READ_FRA.TXT rm -rf ACTION rm -rf unpacked if [ $1x == --no-exex ] then # We need to prepare the .exe files to be run separately rm -rf *.INP rm -rf *.COD rm -rf *.OUT unzip ${ETSIDATA} >/dev/null RETVAL=$? if [ $RETVAL != 0 ] then echo Cannot unpack the ETSI test vectors for GSM 06.10! exit $RETVAL fi unzip ./DISK4.ZIP >/dev/null RETVAL=$? if [ $RETVAL != 0 ] then echo Cannot unpack the ETSI test vectors for GSM 06.10! exit $RETVAL fi unzip ./DISK5.ZIP >/dev/null RETVAL=$? if [ $RETVAL != 0 ] then echo Cannot unpack the ETSI test vectors for GSM 06.10! exit $RETVAL fi rm -rf ASN.1.txt rm -rf DISK1.ZIP rm -rf DISK2.ZIP rm -rf DISK3.ZIP rm -rf DISK4.ZIP rm -rf DISK5.ZIP rm -rf READ_FRA.TXT # An environment which is emulating an MS one will probably need # to make the .EXE files actually executable. chmod 755 *.EXE echo "Now copy the files from the test-data/etsi/gsm0610 directory to a Windows," echo "DOS or other machine which can run .exe files. Run each of the .exe" echo "files (there are 6 of them), and copy the whole directory back here." echo "You can then complete the creation of the working data directories" echo "with the command:" echo $0 "--no-exe-continue" exit 0 fi unzip ${ETSIDATA} >/dev/null RETVAL=$? if [ $RETVAL != 0 ] then echo Cannot unpack the ETSI test vectors for GSM 06.10! exit $RETVAL fi #rm ${ETSIDATA} rm -rf ASN.1.txt if [ $1x != --no-exe-continuex ] then # We need to extract and run the .exe files right now. For this to succeed # we must be running in an environment which can run .exe files. This has been # tested with Cygwin on a Windows XP machine. rm -rf *.INP rm -rf *.COD rm -rf *.OUT unzip ./DISK4.ZIP >/dev/null RETVAL=$? if [ $RETVAL != 0 ] then echo Cannot unpack the ETSI test vectors for GSM 06.10! exit $RETVAL fi unzip ./DISK5.ZIP >/dev/null RETVAL=$? if [ $RETVAL != 0 ] then echo Cannot unpack the ETSI test vectors for GSM 06.10! exit $RETVAL fi # An environment which is emulating an MS one will probably need # to make the .EXE files actually executable. chmod 755 *.EXE ./FR_HOM_A.EXE >/dev/null ./FR_SYN_A.EXE >/dev/null ./FR_A.EXE >/dev/null ./FR_HOM_U.EXE >/dev/null ./FR_SYN_U.EXE >/dev/null ./FR_U.EXE >/dev/null rm -rf READ_FRA.TXT fi rm -rf DISK4.ZIP rm -rf DISK5.ZIP rm -rf *.EXE chmod 644 *.INP chmod 644 *.OUT chmod 644 *.COD # Create the directories where we want to put the test data files. mkdir unpacked mkdir unpacked/fr_A mkdir unpacked/fr_L mkdir unpacked/fr_U mkdir unpacked/fr_homing_A mkdir unpacked/fr_homing_L mkdir unpacked/fr_homing_U mkdir unpacked/fr_sync_A mkdir unpacked/fr_sync_L mkdir unpacked/fr_sync_U # Disks 1, 2 and 3 simply unzip, and the files have sensible file names. We # just need to rearrange the directories in which they are located. unzip ./DISK1.ZIP >/dev/null RETVAL=$? if [ $RETVAL != 0 ] then echo Cannot unpack the ETSI test vectors for GSM 06.10! exit $RETVAL fi unzip ./DISK2.ZIP >/dev/null RETVAL=$? if [ $RETVAL != 0 ] then echo Cannot unpack the ETSI test vectors for GSM 06.10! exit $RETVAL fi unzip ./DISK3.ZIP >/dev/null RETVAL=$? if [ $RETVAL != 0 ] then echo Cannot unpack the ETSI test vectors for GSM 06.10! exit $RETVAL fi rm -rf DISK1.ZIP rm -rf DISK2.ZIP rm -rf DISK3.ZIP mv "./ACTION/SMG#23/HOLD/0610_5~1/TESTSE~1/DISK1/"* ./unpacked/fr_L mv "./ACTION/SMG#23/HOLD/0610_5~1/TESTSE~1/DISK3/"Sync*.cod ./unpacked/fr_sync_L mv "./ACTION/SMG#23/HOLD/0610_5~1/TESTSE~1/DISK2/"Seq*h.* ./unpacked/fr_homing_L mv "./ACTION/SMG#23/HOLD/0610_5~1/TESTSE~1/DISK3/"Seq*h.* ./unpacked/fr_homing_L mv "./ACTION/SMG#23/HOLD/0610_5~1/TESTSE~1/DISK3/Bitsync.inp" ./unpacked/fr_sync_L mv "./ACTION/SMG#23/HOLD/0610_5~1/TESTSE~1/DISK3/Seqsync.inp" ./unpacked/fr_sync_L mv "./ACTION/SMG#23/HOLD/0610_5~1/TESTSE~1/DISK3/Homing01.cod" ./unpacked/fr_homing_L mv "./ACTION/SMG#23/HOLD/0610_5~1/TESTSE~1/DISK3/Homing01.out" ./unpacked/fr_homing_L rm -rf ACTION # The files extracted by the .EXE files have messy naming, and are not in # a sane directory layout. We rename and move them, to make the final result of # the files extracted from all five of the original .ZIP files reasonably # consistent, and easy to follow. rm -rf READ_FRA.TXT for I in SYN*_A.COD ; do mv $I `echo $I | sed -e "s|SYN|./unpacked/fr_sync_A/Sync|" | sed -e "s/COD/cod/"` done for I in SYN*_U.COD ; do mv $I `echo $I | sed -e "s|SYN|./unpacked/fr_sync_U/Sync|" | sed -e "s/COD/cod/"` done for I in SEQ*H_A.COD ; do mv $I `echo $I | sed -e "s|SEQ|./unpacked/fr_homing_A/Seq|" | sed -e "s/COD/cod/"` done for I in SEQ*H_U.COD ; do mv $I `echo $I | sed -e "s|SEQ|./unpacked/fr_homing_U/Seq|" | sed -e "s/COD/cod/"` done for I in SEQ*H_A.INP ; do mv $I `echo $I | sed -e "s|SEQ|./unpacked/fr_homing_A/Seq|" | sed -e "s/INP/inp/"` done for I in SEQ*H_U.INP ; do mv $I `echo $I | sed -e "s|SEQ|./unpacked/fr_homing_U/Seq|" | sed -e "s/INP/inp/"` done for I in SEQ*H_A.OUT ; do mv $I `echo $I | sed -e "s|SEQ|./unpacked/fr_homing_A/Seq|" | sed -e "s/OUT/out/"` done for I in SEQ*H_U.OUT ; do mv $I `echo $I | sed -e "s|SEQ|./unpacked/fr_homing_U/Seq|" | sed -e "s/OUT/out/"` done for I in SEQ*-A.COD ; do mv $I `echo $I | sed -e "s|SEQ|./unpacked/fr_A/Seq|" | sed -e "s/COD/cod/"` done for I in SEQ*-U.COD ; do mv $I `echo $I | sed -e "s|SEQ|./unpacked/fr_U/Seq|" | sed -e "s/COD/cod/"` done for I in SEQ*-A.INP ; do mv $I `echo $I | sed -e "s|SEQ|./unpacked/fr_A/Seq|" | sed -e "s/INP/inp/"` done for I in SEQ*-U.INP ; do mv $I `echo $I | sed -e "s|SEQ|./unpacked/fr_U/Seq|" | sed -e "s/INP/inp/"` done for I in SEQ*-A.OUT ; do mv $I `echo $I | sed -e "s|SEQ|./unpacked/fr_A/Seq|" | sed -e "s/OUT/out/"` done for I in SEQ*-U.OUT ; do mv $I `echo $I | sed -e "s|SEQ|./unpacked/fr_U/Seq|" | sed -e "s/OUT/out/"` done mv HOM01_A.OUT ./unpacked/fr_homing_A/Homing01_A.out mv HOM01_U.OUT ./unpacked/fr_homing_U/Homing01_U.out mv SEQSYN_A.INP ./unpacked/fr_sync_A/Seqsync_A.inp mv SEQSYN_U.INP ./unpacked/fr_sync_U/Seqsync_U.inp echo "The ETSI test vectors for GSM 06.10 should now be correctly laid out in the" echo "gsm0610 directory" iaxmodem-1.2.0/lib/spandsp/unpack_g722_data.sh0000755000175000017500000000277011150047217020447 0ustar julienjulien#!/bin/sh # # SpanDSP - a series of DSP components for telephony # # unpack_g722_data.sh # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License version 2.1, # as published by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this program; if not, write to the Free Software # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. # # $Id: unpack_g722_data.sh,v 1.5 2008/05/03 07:55:04 steveu Exp $ # ITUDATA="../../../T-REC-G.722-198703-I!AppII!ZPF-E.zip" cd test-data/itu if [ -d g722 ] then cd g722 else mkdir g722 RETVAL=$? if [ $RETVAL != 0 ] then echo Cannot create test-data/itu/g722! exit $RETVAL fi cd g722 fi rm -rf T* rm -rf software unzip ${ITUDATA} >/dev/null RETVAL=$? if [ $RETVAL != 0 ] then echo Cannot unpack the ITU test vectors for G.722! exit $RETVAL fi #rm ${ITUDATA} unzip ./software/G722ap2/G722E/Software.zip >/dev/null RETVAL=$? if [ $RETVAL != 0 ] then echo Cannot unpack the ITU test vectors for G.722! exit $RETVAL fi mv ./software/G722ap2/G722E/T* . rm -rf software echo The ITU test vectors for G.722 should now be in the g722 directory iaxmodem-1.2.0/lib/spandsp/configure.ac0000644000175000017500000003217111150047217017361 0ustar julienjulien# # SpanDSP - a series of DSP components for telephony # # configure.ac - Process this file with autoconf to produce configure # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License version 2.1, # as published by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this program; if not, write to the Free Software # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. # # $Id: configure.ac,v 1.56 2008/07/10 12:44:54 steveu Exp $ # @start 1 AC_INIT m4_include(config/ax_compiler_vendor.m4) m4_include(config/ax_check_real_file.m4) m4_include(config/ax_fixed_point_machine.m4) m4_include(config/ax_misaligned_access_fails.m4) m4_include(config/ax_c99_features.m4) SPANDSP_MAJOR_VERSION=0 SPANDSP_MINOR_VERSION=0 SPANDSP_MICRO_VERSION=5 SPANDSP_LT_CURRENT=1 SPANDSP_LT_REVISION=0 SPANDSP_LT_AGE=0 VERSION=$SPANDSP_MAJOR_VERSION.$SPANDSP_MINOR_VERSION.$SPANDSP_MICRO_VERSION PACKAGE=spandsp AC_SUBST(SPANDSP_LT_CURRENT) AC_SUBST(SPANDSP_LT_REVISION) AC_SUBST(SPANDSP_LT_AGE) AC_CONFIG_SRCDIR([src/tone_generate.c]) AC_CONFIG_AUX_DIR(config) AC_CONFIG_HEADERS([src/config.h:config-h.in]) AM_INIT_AUTOMAKE($PACKAGE, $VERSION) AC_CANONICAL_HOST AC_CANONICAL_BUILD AC_PROG_CC AC_PROG_CXX AC_PROG_GCC_TRADITIONAL AC_PROG_LIBTOOL AC_LANG([C]) AX_COMPILER_VENDOR if test "${build}" != "${host}" then # If we are doing a Canadian Cross, in which the host and build systems # are not the same, we set reasonable default values for the tools. CC_FOR_BUILD=${CC_FOR_BUILD-gcc} CPPFLAGS_FOR_BUILD="\$(CPPFLAGS)" CC=${CC-${host_alias}-gcc} CFLAGS=${CFLAGS-"-g -O2"} CXX=${CXX-${host_alias}-c++} CXXFLAGS=${CXXFLAGS-"-g -O2"} else # Set reasonable default values for some tools even if not Canadian. # Of course, these are different reasonable default values, originally # specified directly in the Makefile. # We don't export, so that autoconf can do its job. # Note that all these settings are above the fragment inclusion point # in Makefile.in, so can still be overridden by fragments. # This is all going to change when we autoconfiscate... CC_FOR_BUILD="\$(CC)" CPPFLAGS_FOR_BUILD="\$(CPPFLAGS)" AC_PROG_CC # We must set the default linker to the linker used by gcc for the correct # operation of libtool. If LD is not defined and we are using gcc, try to # set the LD default to the ld used by gcc. if test -z "$LD" then if test "$GCC" = yes then case $build in *-*-mingw*) gcc_prog_ld=`$CC -print-prog-name=ld 2>&1 | tr -d '\015'` ;; *) gcc_prog_ld=`$CC -print-prog-name=ld 2>&1` ;; esac case $gcc_prog_ld in # Accept absolute paths. [[\\/]* | [A-Za-z]:[\\/]*)] LD="$gcc_prog_ld" ;; esac fi fi CXX=${CXX-"c++"} CFLAGS=${CFLAGS-"-g -O2"} CXXFLAGS=${CXXFLAGS-"-g -O2"} fi AC_C_CONST AC_C_INLINE AC_C_VOLATILE AC_CHECK_TYPES(long long) AC_CHECK_TYPES(long double) AC_TYPE_SIGNAL AC_ARG_ENABLE(doc, [ --enable-doc Build the documentation]) AC_ARG_ENABLE(tests, [ --enable-tests Build the test programs]) AC_ARG_ENABLE(test_data, [ --enable-test-data Build TIFF test files for some ITU test images]) AC_ARG_ENABLE(mmx, [ --enable-mmx Enable MMX support]) AC_ARG_ENABLE(sse, [ --enable-sse Enable SSE support]) AC_ARG_ENABLE(fixed_point, [ --enable-fixed-point Enable fixed point support]) AC_FUNC_ERROR_AT_LINE AC_FUNC_VPRINTF AC_FUNC_MALLOC AC_FUNC_MEMCMP AC_FUNC_REALLOC AC_FUNC_SELECT_ARGTYPES AX_C99_FUNC_LRINT AX_C99_FUNC_LRINTF AX_C99_FUNC_LLRINT AX_C99_FUNC_LLRINTF if test "x$ac_cv_c99_lrint" = "xno" ; then if test "x$ac_cv_c99_lrintf" = "xno" ; then AC_MSG_WARN([[*** Missing C99 standard functions lrint() and lrintf().]]) AC_MSG_WARN([[*** This may cause benign compiler warnings on some systems (ie Solaris).]]) fi fi AX_C99_FLEXIBLE_ARRAY AC_CHECK_FUNCS([memmove]) AC_CHECK_FUNCS([memset]) AC_CHECK_FUNCS([select]) AC_CHECK_FUNCS([strcasecmp]) AC_CHECK_FUNCS([strchr]) AC_CHECK_FUNCS([strdup]) AC_CHECK_FUNCS([strerror]) AC_CHECK_FUNCS([strstr]) AC_CHECK_FUNCS([strtol]) AC_CHECK_FUNCS([gettimeofday]) AC_HEADER_STDC AC_HEADER_SYS_WAIT AC_HEADER_TIME # Check for header files. AC_CHECK_HEADERS([socket.h]) AC_CHECK_HEADERS([inttypes.h], [INSERT_INTTYPES_HEADER="#include "]) AC_CHECK_HEADERS([stdint.h], [INSERT_STDINT_HEADER="#include "]) AC_CHECK_HEADERS([unistd.h]) AC_CHECK_HEADERS([stdlib.h]) AC_CHECK_HEADERS([string.h]) AC_CHECK_HEADERS([strings.h]) AC_CHECK_HEADERS([malloc.h]) AC_CHECK_HEADERS([tgmath.h], [INSERT_TGMATH_HEADER="#include "]) AC_CHECK_HEADERS([math.h], [INSERT_MATH_HEADER="#include "]) AC_CHECK_HEADERS([float.h]) AC_CHECK_HEADERS([fcntl.h]) AC_CHECK_HEADERS([sys/time.h]) AC_CHECK_HEADERS([sys/select.h]) AC_CHECK_HEADERS([sys/ioctl.h]) AC_CHECK_HEADERS([sys/fcntl.h]) AC_CHECK_HEADERS([audiofile.h]) AC_CHECK_HEADERS([fftw3.h], , [AC_CHECK_HEADERS([fftw.h])]) AC_CHECK_HEADERS([tiffio.h]) AC_CHECK_HEADERS([pthread.h]) AC_CHECK_HEADERS([unicall.h]) if test "${build}" == "${host}" then AC_CHECK_HEADERS([X11/X.h]) fi # Determine XML2 include path AC_MSG_CHECKING(for libxml/xmlmemory.h) # Can we include headers using system include dirs? AC_TRY_COMPILE([#include ], [int a = 1;], XML2_INCLUDE=" ", XML2_INCLUDE= ) # Hunt through several possible directories to find the includes for libxml2 if test "x$XML2_INCLUDE" = "x"; then old_CPPFLAGS="$CPPFLAGS" for i in $xml2_include_dir /usr/include /usr/local/include /usr/include/libxml2 /usr/local/include/libxml2 ; do CPPFLAGS="$old_CPPFLAGS -I$i" AC_TRY_COMPILE([#include ], [int a = 1;], XML2_INCLUDE="-I$i", XML2_INCLUDE= ) if test "x$XML2_INCLUDE" != "x"; then break; fi done CPPFLAGS="$old_CPPFLAGS $XML2_INCLUDE" fi AC_CHECK_HEADERS([libxml/xmlmemory.h]) AC_CHECK_HEADERS([libxml/parser.h]) AC_CHECK_HEADERS([libxml/xinclude.h]) AC_LANG([C++]) AC_CHECK_HEADERS([FL/Fl.H]) AC_CHECK_HEADERS([FL/Fl_Overlay_Window.H]) AC_CHECK_HEADERS([FL/Fl_Light_Button.H]) AC_CHECK_HEADERS([FL/fl_draw.H]) AC_CHECK_HEADERS([FL/Fl_Cartesian.H], [], [], [],[[#include ]]) AC_CHECK_HEADERS([FL/Fl_Audio_Meter.H], [], [], [],[[#include ]]) AC_LANG([C]) if test "${build}" == "${host}" then case "${host}" in x86_64-*) AX_CHECK_REAL_FILE([${prefix}/lib64], libdir='$(exec_prefix)/lib64') ;; esac fi AC_CHECK_LIB([m], [cos]) # Some platforms still seem to lack the basic single precision trig and power related function. AC_SEARCH_LIBS([sinf], [m], AC_DEFINE([HAVE_SINF], [1], [Define to 1 if you have the sinf() function.])) AC_SEARCH_LIBS([cosf], [m], AC_DEFINE([HAVE_COSF], [1], [Define to 1 if you have the cosf() function.])) AC_SEARCH_LIBS([tanf], [m], AC_DEFINE([HAVE_TANF], [1], [Define to 1 if you have the tanf() function.])) AC_SEARCH_LIBS([asinf], [m], AC_DEFINE([HAVE_ASINF], [1], [Define to 1 if you have the asinf() function.])) AC_SEARCH_LIBS([acosf], [m], AC_DEFINE([HAVE_ACOSF], [1], [Define to 1 if you have the acosf() function.])) AC_SEARCH_LIBS([atanf], [m], AC_DEFINE([HAVE_ATANF], [1], [Define to 1 if you have the atanf() function.])) AC_SEARCH_LIBS([atan2f], [m], AC_DEFINE([HAVE_ATAN2F], [1], [Define to 1 if you have the atan2f() function.])) AC_SEARCH_LIBS([ceilf], [m], AC_DEFINE([HAVE_CEILF], [1], [Define to 1 if you have the ceilf() function.])) AC_SEARCH_LIBS([floorf], [m], AC_DEFINE([HAVE_FLOORF], [1], [Define to 1 if you have the floorf() function.])) AC_SEARCH_LIBS([powf], [m], AC_DEFINE([HAVE_POWF], [1], [Define to 1 if you have the powf() function.])) AC_SEARCH_LIBS([expf], [m], AC_DEFINE([HAVE_EXPF], [1], [Define to 1 if you have the expf() function.])) AC_SEARCH_LIBS([logf], [m], AC_DEFINE([HAVE_LOGF], [1], [Define to 1 if you have the logf() function.])) AC_SEARCH_LIBS([log10f], [m], AC_DEFINE([HAVE_LOG10F], [1], [Define to 1 if you have the log10f() function.])) if test "${build}" == "${host}" then case "${host}" in x86_64-*) # X86_64 Linux machines may have both 64 bit and 32 bit libraries. We need to choose the right set AX_CHECK_REAL_FILE([/usr/X11R6/lib64], [TESTLIBS="$TESTLIBS -L/usr/X11R6/lib64"], AC_CHECK_FILE([/usr/X11R6/lib], [TESTLIBS="$TESTLIBS -L/usr/X11R6/lib"])) ;; esac fi # Checks for libraries. AC_CHECK_LIB([tiff], [TIFFOpen], , AC_MSG_ERROR("Can't build without libtiff (does your system require a libtiff-devel package?)"), -lm) AC_CHECK_LIB([xml2], [xmlParseFile], [AC_DEFINE([HAVE_LIBXML2], [1], [Define to 1 if you have the 'libxml2' library (-lxml2).]) TESTLIBS="$TESTLIBS -lxml2"]) if test -n "$enable_tests" ; then AC_LANG([C]) AC_CHECK_LIB([audiofile], [afOpenFile], TESTLIBS="$TESTLIBS -laudiofile", AC_MSG_ERROR("Can't make tests without libaudiofile (does your system require a libaudiofile-devel package?)")) AC_CHECK_LIB([fftw3], [fftw_plan_dft_1d], TESTLIBS="$TESTLIBS -lfftw3", [AC_CHECK_LIB([fftw], [fftw_create_plan], TESTLIBS="$TESTLIBS -lfftw")]) AC_CHECK_LIB([pthread], [pthread_attr_init], TESTLIBS="$TESTLIBS -lpthread") AC_CHECK_LIB([dl], [dlopen], TESTLIBS="$TESTLIBS -ldl") AC_CHECK_LIB([unicall], [uc_start], TESTLIBS="$TESTLIBS -lunicall",, -ltiff -ldl) AC_CHECK_LIB([Xft], [XftFontOpen], TESTLIBS="$TESTLIBS -lXft",, $TESTLIBS) AC_CHECK_LIB([Xext], [XextCreateExtension], TESTLIBS="$TESTLIBS -lXext",, $TESTLIBS) AC_CHECK_LIB([X11], [XOpenDisplay], TESTLIBS="$TESTLIBS -lX11",, $TESTLIBS) AC_LANG([C++]) AC_CHECK_LIB([fltk], [main], TESTLIBS="$TESTLIBS -lfltk -lsupc++",, $TESTLIBS) AC_CHECK_LIB([fltk_cartesian], [main], TESTLIBS="-lfltk_cartesian $TESTLIBS",, $TESTLIBS) AC_CHECK_LIB([fltk_audio_meter], [main], TESTLIBS="-lfltk_audio_meter $TESTLIBS",, $TESTLIBS) AC_LANG([C]) fi case "${ax_cv_c_compiler_vendor}" in gnu) COMP_VENDOR_CFLAGS="-std=gnu99 -ffast-math -Wall -Wunused-variable -Wwrite-strings -Wstrict-prototypes -Wmissing-prototypes" if test "$enable_sse" = "yes" ; then COMP_VENDOR_CFLAGS="-msse $COMP_VENDOR_CFLAGS" fi if test "$enable_mmx" = "yes" ; then COMP_VENDOR_CFLAGS="-mmmx $COMP_VENDOR_CFLAGS" fi case $host_os in mingw* | cygwin*) COMP_VENDOR_LDFLAGS="-no-undefined" ;; *) COMP_VENDOR_LDFLAGS= ;; esac ;; sun) COMP_VENDOR_CFLAGS="-xc99=all -mt -xCC -errwarn=%all -xvpara" if test "$enable_sse" = "yes" ; then COMP_VENDOR_CFLAGS="-native -fast $COMP_VENDOR_CFLAGS" fi if test "$enable_mmx" = "yes" ; then COMP_VENDOR_CFLAGS="-native -fast $COMP_VENDOR_CFLAGS" fi COMP_VENDOR_LDFLAGS= ;; *) COMP_VENDOR_CFLAGS="-std=c99 -Wall -Wunused-variable -Wwrite-strings -Wstrict-prototypes -Wmissing-prototypes" COMP_VENDOR_LDFLAGS= ;; esac COMP_VENDOR_CFLAGS="-DNDEBUG -DIAXMODEM_STUFF $COMP_VENDOR_CFLAGS" AM_CONDITIONAL([COND_DOC], [test "$enable_doc" = yes]) AM_CONDITIONAL([COND_TESTS], [test "$enable_tests" = yes]) AM_CONDITIONAL([COND_TESTDATA], [test "$enable_test_data" = yes]) AM_CONDITIONAL([COND_MMX], [test "$enable_mmx" = yes]) AM_CONDITIONAL([COND_SSE], [test "$enable_sse" = yes]) if test "$enable_fixed_point" = "yes" ; then AC_DEFINE([SPANDSP_USE_FIXED_POINT], [1], [Enable fixed point processing, where possible, instead of floating point]) SPANDSP_USE_FIXED_POINT="#define SPANDSP_USE_FIXED_POINT 1" else AX_FIXED_POINT_MACHINE([$host], [AC_DEFINE([SPANDSP_USE_FIXED_POINT], [1], [Enable fixed point processing, where possible, instead of floating point]) SPANDSP_USE_FIXED_POINT="#define SPANDSP_USE_FIXED_POINT 1"], [SPANDSP_USE_FIXED_POINT="#undef SPANDSP_USE_FIXED_POINT"]) fi AX_MISALIGNED_ACCESS_FAILS([$host], [AC_DEFINE([SPANDSP_MISALIGNED_ACCESS_FAILS], [1], [Do not expect a misaligned memory access to work correctly]) SPANDSP_MISALIGNED_ACCESS_FAILS="#define SPANDSP_MISALIGNED_ACCESS_FAILS 1"], [SPANDSP_MISALIGNED_ACCESS_FAILS="#undef SPANDSP_MISALIGNED_ACCESS_FAILS"]) AC_SUBST(CC_FOR_BUILD) AC_SUBST(CPPFLAGS_FOR_BUILD) AC_SUBST(COMP_VENDOR_CFLAGS) AC_SUBST(COMP_VENDOR_LDFLAGS) AC_SUBST(TESTLIBS) AC_SUBST(SPANDSP_USE_FIXED_POINT) AC_SUBST(SPANDSP_MISALIGNED_ACCESS_FAILS) AC_SUBST(INSERT_INTTYPES_HEADER) AC_SUBST(INSERT_STDINT_HEADER) AC_SUBST(INSERT_TGMATH_HEADER) AC_SUBST(INSERT_MATH_HEADER) AC_CONFIG_FILES([Makefile doc/Makefile doc/doxygen src/Makefile src/spandsp.h spandsp-sim/Makefile test-data/Makefile test-data/etsi/Makefile test-data/etsi/fax/Makefile test-data/itu/Makefile test-data/itu/fax/Makefile test-data/local/Makefile tests/Makefile spandsp.spec]) AC_OUTPUT # @end 1 iaxmodem-1.2.0/lib/spandsp/wrapper.xsl0000644000175000017500000000040311150047217017274 0ustar julienjulien css.css iaxmodem-1.2.0/lib/spandsp/ChangeLog0000644000175000017500000000533611150047217016650 0ustar julienjulien07.08.29 - 0.0.4 - Steve Underwood - 06.05.23 - 0.0.3 - Steve Underwood - T.38 now implemented, though it needs further polishing. - G.726 and G.722 now implemented. 04.08.29 - 0.0.2 - Steve Underwood - T.4 no longer uses libtiff for compresion and decompression on the line side (it is still used to handle the TIFF files). Spandsp no longer depends on accessing the "internals" of libtiff. New 1D and 2D compression and decompression code now handles the line side. This should be more robust than using libtiff, and handles the fudging of bad scan lines rather better. - T.30 line turn-around timing corrected. - T.30 DCS header contents corrected. - T.30 provision for V.17 added, as an option. - T.30 now has a statistics interface, for applications to find details about image transfers. - T.30 processing now correctly closes TIFF files are they have been sent. - FAX header line insertion is now supported for transmitted FAXes. - asynchronous serial processing now has a V.14 compatible rate adaption option. - V.8 modem negotiation module added. - OKI ADPCM now supports Dialogic compatible operation at 6k samples/second, as well as 8k samples/second, using its own sample rate converter. - message queuing added to ease things like T.31 handling - incomplete skeleton (still rather nasty, to be honest) T.31 processing. - incomplete skeleton of V.22bis added. There is probably quite a bit to do to get this complete and robust. It probably requires the T.31 processing be expanded to something more like V.250, so it doesn't just handle FAX. - Incomplete V.17 added (there could be an IBM patent related to the TCM part of V.17, but I think it has expired. Don't distribute binaries of spandsp built with V.17 enabled until this is resolved - and the modem is completed, of course :-) ). The current version transmits OK. It receives OK with the long training sequence, but the symbol and carrier syncing isn't good enough for robust receiving with the short training sequence. - A basic BER tester has been added. - The faster modems now have proper shutdown procedures, whether one is defined in the spec. or not. - The modems (except simple FSK) now have APIs to access performance information. - A common GUI (using FLTK) added for the modem tests. - A bit more documentation added. - Some API inconsistencies cleaned up. - The usual bundle of assorted buglet fixes and polishing. 04.04.29 - 0.0.1k - Steve Underwood - The first version which gives solid faxing for a large number of people. iaxmodem-1.2.0/lib/libiax2/0000755000175000017500000000000011150047457014757 5ustar julienjulieniaxmodem-1.2.0/lib/libiax2/Makefile.am0000644000175000017500000000017511150047217017010 0ustar julienjulienSUBDIRS = src bin_SCRIPTS=iax-config BUILT_SCOURCES=iax-config EXTRA_DIST=iax.spec libiax2.vcproj iax-config: iax-config.in iaxmodem-1.2.0/lib/libiax2/Makefile.in0000644000175000017500000004560311150047414017025 0ustar julienjulien# Makefile.in generated by automake 1.8.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = . am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd INSTALL = @INSTALL@ install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : host_triplet = @host@ DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in $(srcdir)/iax-config.in \ $(srcdir)/iax.spec.in $(top_srcdir)/configure AUTHORS COPYING \ COPYING.LIB ChangeLog INSTALL NEWS config.guess config.sub \ depcomp install-sh ltmain.sh missing mkinstalldirs subdir = . ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.in am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ configure.lineno configure.status.lineno mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_CLEAN_FILES = iax.spec iax-config am__installdirs = "$(DESTDIR)$(bindir)" binSCRIPT_INSTALL = $(INSTALL_SCRIPT) SCRIPTS = $(bin_SCRIPTS) SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-exec-recursive install-info-recursive \ install-recursive installcheck-recursive installdirs-recursive \ pdf-recursive ps-recursive uninstall-info-recursive \ uninstall-recursive ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) am__remove_distdir = \ { test ! -d $(distdir) \ || { find $(distdir) -type d ! -perm -200 -exec chmod u+w {} ';' \ && rm -fr $(distdir); }; } DIST_ARCHIVES = $(distdir).tar.gz GZIP_ENV = --best distuninstallcheck_listfiles = find . -type f -print distcleancheck_listfiles = find . -type f -print ACLOCAL = @ACLOCAL@ AMDEP_FALSE = @AMDEP_FALSE@ AMDEP_TRUE = @AMDEP_TRUE@ AMTAR = @AMTAR@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ IAX_VERSION = @IAX_VERSION@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ ac_ct_RANLIB = @ac_ct_RANLIB@ ac_ct_STRIP = @ac_ct_STRIP@ am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ datadir = @datadir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ prefix = @prefix@ program_transform_name = @program_transform_name@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ SUBDIRS = src bin_SCRIPTS = iax-config BUILT_SCOURCES = iax-config EXTRA_DIST = iax.spec libiax2.vcproj all: all-recursive .SUFFIXES: am--refresh: @: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ echo ' cd $(srcdir) && $(AUTOMAKE) --gnu '; \ cd $(srcdir) && $(AUTOMAKE) --gnu \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ echo ' $(SHELL) ./config.status'; \ $(SHELL) ./config.status;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) $(SHELL) ./config.status --recheck $(top_srcdir)/configure: $(am__configure_deps) cd $(srcdir) && $(AUTOCONF) $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) iax.spec: $(top_builddir)/config.status $(srcdir)/iax.spec.in cd $(top_builddir) && $(SHELL) ./config.status $@ iax-config: $(top_builddir)/config.status $(srcdir)/iax-config.in cd $(top_builddir) && $(SHELL) ./config.status $@ install-binSCRIPTS: $(bin_SCRIPTS) @$(NORMAL_INSTALL) test -z "$(bindir)" || $(mkdir_p) "$(DESTDIR)$(bindir)" @list='$(bin_SCRIPTS)'; for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ if test -f $$d$$p; then \ f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \ echo " $(binSCRIPT_INSTALL) '$$d$$p' '$(DESTDIR)$(bindir)/$$f'"; \ $(binSCRIPT_INSTALL) "$$d$$p" "$(DESTDIR)$(bindir)/$$f"; \ else :; fi; \ done uninstall-binSCRIPTS: @$(NORMAL_UNINSTALL) @list='$(bin_SCRIPTS)'; for p in $$list; do \ f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \ echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \ rm -f "$(DESTDIR)$(bindir)/$$f"; \ done mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs distclean-libtool: -rm -f libtool uninstall-info-am: # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @set fnord $$MAKEFLAGS; amf=$$2; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" mostlyclean-recursive clean-recursive distclean-recursive \ maintainer-clean-recursive: @set fnord $$MAKEFLAGS; amf=$$2; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ if (etags --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ else \ include_option=--include; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -f $$subdir/TAGS && \ tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(ETAGS_ARGS)$$tags$$unique" \ || $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) $(am__remove_distdir) mkdir $(distdir) $(mkdir_p) $(distdir)/. @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ list='$(DISTFILES)'; for file in $$list; do \ case $$file in \ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ esac; \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ dir="/$$dir"; \ $(mkdir_p) "$(distdir)$$dir"; \ else \ dir=''; \ fi; \ if test -d $$d/$$file; then \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -d "$(distdir)/$$subdir" \ || mkdir "$(distdir)/$$subdir" \ || exit 1; \ (cd $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="../$(top_distdir)" \ distdir="../$(distdir)/$$subdir" \ distdir) \ || exit 1; \ fi; \ done -find $(distdir) -type d ! -perm -777 -exec chmod a+rwx {} \; -o \ ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ ! -type d ! -perm -444 -exec $(SHELL) $(install_sh) -c -m a+r {} {} \; \ || chmod -R a+r $(distdir) dist-gzip: distdir $(AMTAR) chof - $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz $(am__remove_distdir) dist-bzip2: distdir $(AMTAR) chof - $(distdir) | bzip2 -9 -c >$(distdir).tar.bz2 $(am__remove_distdir) dist-tarZ: distdir $(AMTAR) chof - $(distdir) | compress -c >$(distdir).tar.Z $(am__remove_distdir) dist-shar: distdir shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz $(am__remove_distdir) dist-zip: distdir -rm -f $(distdir).zip zip -rq $(distdir).zip $(distdir) $(am__remove_distdir) dist dist-all: distdir $(AMTAR) chof - $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz $(am__remove_distdir) # This target untars the dist file and tries a VPATH configuration. Then # it guarantees that the distribution is self-contained by making another # tarfile. distcheck: dist case '$(DIST_ARCHIVES)' in \ *.tar.gz*) \ GZIP=$(GZIP_ENV) gunzip -c $(distdir).tar.gz | $(AMTAR) xf - ;;\ *.tar.bz2*) \ bunzip2 -c $(distdir).tar.bz2 | $(AMTAR) xf - ;;\ *.tar.Z*) \ uncompress -c $(distdir).tar.Z | $(AMTAR) xf - ;;\ *.shar.gz*) \ GZIP=$(GZIP_ENV) gunzip -c $(distdir).tar.gz | unshar ;;\ *.zip*) \ unzip $(distdir).zip ;;\ esac chmod -R a-w $(distdir); chmod a+w $(distdir) mkdir $(distdir)/_build mkdir $(distdir)/_inst chmod a-w $(distdir) dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ && cd $(distdir)/_build \ && ../configure --srcdir=.. --prefix="$$dc_install_base" \ $(DISTCHECK_CONFIGURE_FLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) dvi \ && $(MAKE) $(AM_MAKEFLAGS) check \ && $(MAKE) $(AM_MAKEFLAGS) install \ && $(MAKE) $(AM_MAKEFLAGS) installcheck \ && $(MAKE) $(AM_MAKEFLAGS) uninstall \ && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ distuninstallcheck \ && chmod -R a-w "$$dc_install_base" \ && ({ \ (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ } || { rm -rf "$$dc_destdir"; exit 1; }) \ && rm -rf "$$dc_destdir" \ && $(MAKE) $(AM_MAKEFLAGS) dist \ && rm -rf $(DIST_ARCHIVES) \ && $(MAKE) $(AM_MAKEFLAGS) distcleancheck $(am__remove_distdir) @(echo "$(distdir) archives ready for distribution: "; \ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ sed -e '1{h;s/./=/g;p;x;}' -e '$${p;x;}' distuninstallcheck: @cd $(distuninstallcheck_dir) \ && test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \ || { echo "ERROR: files left after uninstall:" ; \ if test -n "$(DESTDIR)"; then \ echo " (check DESTDIR support)"; \ fi ; \ $(distuninstallcheck_listfiles) ; \ exit 1; } >&2 distcleancheck: distclean @if test '$(srcdir)' = . ; then \ echo "ERROR: distcleancheck can only run from a VPATH build" ; \ exit 1 ; \ fi @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left in build directory after distclean:" ; \ $(distcleancheck_listfiles) ; \ exit 1; } >&2 check-am: all-am check: check-recursive all-am: Makefile $(SCRIPTS) installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(bindir)"; do \ test -z "$$dir" || $(mkdir_p) "$$dir"; \ done install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -f Makefile distclean-am: clean-am distclean-generic distclean-libtool \ distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive info: info-recursive info-am: install-data-am: install-exec-am: install-binSCRIPTS install-info: install-info-recursive install-man: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -rf $(top_srcdir)/autom4te.cache -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-binSCRIPTS uninstall-info-am uninstall-info: uninstall-info-recursive .PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am am--refresh check \ check-am clean clean-generic clean-libtool clean-recursive \ ctags ctags-recursive dist dist-all dist-bzip2 dist-gzip \ dist-shar dist-tarZ dist-zip distcheck distclean \ distclean-generic distclean-libtool distclean-recursive \ distclean-tags distcleancheck distdir distuninstallcheck dvi \ dvi-am html html-am info info-am install install-am \ install-binSCRIPTS install-data install-data-am install-exec \ install-exec-am install-info install-info-am install-man \ install-strip installcheck installcheck-am installdirs \ installdirs-am maintainer-clean maintainer-clean-generic \ maintainer-clean-recursive mostlyclean mostlyclean-generic \ mostlyclean-libtool mostlyclean-recursive pdf pdf-am ps ps-am \ tags tags-recursive uninstall uninstall-am \ uninstall-binSCRIPTS uninstall-info-am iax-config: iax-config.in # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: iaxmodem-1.2.0/lib/libiax2/install-sh0000755000175000017500000002177011150047217016764 0ustar julienjulien#!/bin/sh # install - install a program, script, or datafile scriptversion=2004-02-15.20 # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the # following copyright and license. # # Copyright (C) 1994 X Consortium # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to # deal in the Software without restriction, including without limitation the # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or # sell copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN # AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- # TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # Except as contained in this notice, the name of the X Consortium shall not # be used in advertising or otherwise to promote the sale, use or other deal- # ings in this Software without prior written authorization from the X Consor- # tium. # # # FSF changes to this file are in the public domain. # # Calling this script install-sh is preferred over install.sh, to prevent # `make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. It can only install one file at a time, a restriction # shared with many OS's install programs. # set DOITPROG to echo to test this script # Don't use :- since 4.3BSD and earlier shells don't like it. doit="${DOITPROG-}" # put in absolute paths if you don't have them in your path; or use env. vars. mvprog="${MVPROG-mv}" cpprog="${CPPROG-cp}" chmodprog="${CHMODPROG-chmod}" chownprog="${CHOWNPROG-chown}" chgrpprog="${CHGRPPROG-chgrp}" stripprog="${STRIPPROG-strip}" rmprog="${RMPROG-rm}" mkdirprog="${MKDIRPROG-mkdir}" transformbasename= transform_arg= instcmd="$mvprog" chmodcmd="$chmodprog 0755" chowncmd= chgrpcmd= stripcmd= rmcmd="$rmprog -f" mvcmd="$mvprog" src= dst= dir_arg= usage="Usage: $0 [OPTION]... SRCFILE DSTFILE or: $0 [OPTION]... SRCFILES... DIRECTORY or: $0 -d DIRECTORIES... In the first form, install SRCFILE to DSTFILE, removing SRCFILE by default. In the second, create the directory path DIR. Options: -b=TRANSFORMBASENAME -c copy source (using $cpprog) instead of moving (using $mvprog). -d create directories instead of installing files. -g GROUP $chgrp installed files to GROUP. -m MODE $chmod installed files to MODE. -o USER $chown installed files to USER. -s strip installed files (using $stripprog). -t=TRANSFORM --help display this help and exit. --version display version info and exit. Environment variables override the default commands: CHGRPPROG CHMODPROG CHOWNPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG " while test -n "$1"; do case $1 in -b=*) transformbasename=`echo $1 | sed 's/-b=//'` shift continue;; -c) instcmd=$cpprog shift continue;; -d) dir_arg=true shift continue;; -g) chgrpcmd="$chgrpprog $2" shift shift continue;; --help) echo "$usage"; exit 0;; -m) chmodcmd="$chmodprog $2" shift shift continue;; -o) chowncmd="$chownprog $2" shift shift continue;; -s) stripcmd=$stripprog shift continue;; -t=*) transformarg=`echo $1 | sed 's/-t=//'` shift continue;; --version) echo "$0 $scriptversion"; exit 0;; *) # When -d is used, all remaining arguments are directories to create. test -n "$dir_arg" && break # Otherwise, the last argument is the destination. Remove it from $@. for arg do if test -n "$dstarg"; then # $@ is not empty: it contains at least $arg. set fnord "$@" "$dstarg" shift # fnord fi shift # arg dstarg=$arg done break;; esac done if test -z "$1"; then if test -z "$dir_arg"; then echo "$0: no input file specified." >&2 exit 1 fi # It's OK to call `install-sh -d' without argument. # This can happen when creating conditional directories. exit 0 fi for src do # Protect names starting with `-'. case $src in -*) src=./$src ;; esac if test -n "$dir_arg"; then dst=$src src= if test -d "$dst"; then instcmd=: chmodcmd= else instcmd=$mkdirprog fi else # Waiting for this to be detected by the "$instcmd $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if test ! -f "$src" && test ! -d "$src"; then echo "$0: $src does not exist." >&2 exit 1 fi if test -z "$dstarg"; then echo "$0: no destination specified." >&2 exit 1 fi dst=$dstarg # Protect names starting with `-'. case $dst in -*) dst=./$dst ;; esac # If destination is a directory, append the input filename; won't work # if double slashes aren't ignored. if test -d "$dst"; then dst=$dst/`basename "$src"` fi fi # This sed command emulates the dirname command. dstdir=`echo "$dst" | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'` # Make sure that the destination directory exists. # Skip lots of stat calls in the usual case. if test ! -d "$dstdir"; then defaultIFS=' ' IFS="${IFS-$defaultIFS}" oIFS=$IFS # Some sh's can't handle IFS=/ for some reason. IFS='%' set - `echo "$dstdir" | sed -e 's@/@%@g' -e 's@^%@/@'` IFS=$oIFS pathcomp= while test $# -ne 0 ; do pathcomp=$pathcomp$1 shift if test ! -d "$pathcomp"; then $mkdirprog "$pathcomp" || lasterr=$? # mkdir can fail with a `File exist' error in case several # install-sh are creating the directory concurrently. This # is OK. test ! -d "$pathcomp" && { (exit ${lasterr-1}); exit; } fi pathcomp=$pathcomp/ done fi if test -n "$dir_arg"; then $doit $instcmd "$dst" \ && { test -z "$chowncmd" || $doit $chowncmd "$dst"; } \ && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } \ && { test -z "$stripcmd" || $doit $stripcmd "$dst"; } \ && { test -z "$chmodcmd" || $doit $chmodcmd "$dst"; } else # If we're going to rename the final executable, determine the name now. if test -z "$transformarg"; then dstfile=`basename "$dst"` else dstfile=`basename "$dst" $transformbasename \ | sed $transformarg`$transformbasename fi # don't allow the sed command to completely eliminate the filename. test -z "$dstfile" && dstfile=`basename "$dst"` # Make a couple of temp file names in the proper directory. dsttmp=$dstdir/_inst.$$_ rmtmp=$dstdir/_rm.$$_ # Trap to clean up those temp files at exit. trap 'status=$?; rm -f "$dsttmp" "$rmtmp" && exit $status' 0 trap '(exit $?); exit' 1 2 13 15 # Move or copy the file name to the temp name $doit $instcmd "$src" "$dsttmp" && # and set any options; do chmod last to preserve setuid bits. # # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $instcmd $src $dsttmp" command. # { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } \ && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } \ && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } \ && { test -z "$chmodcmd" || $doit $chmodcmd "$dsttmp"; } && # Now remove or move aside any old file at destination location. We # try this two ways since rm can't unlink itself on some systems and # the destination file might be busy for other reasons. In this case, # the final cleanup might fail but the new file should still install # successfully. { if test -f "$dstdir/$dstfile"; then $doit $rmcmd -f "$dstdir/$dstfile" 2>/dev/null \ || $doit $mvcmd -f "$dstdir/$dstfile" "$rmtmp" 2>/dev/null \ || { echo "$0: cannot unlink or rename $dstdir/$dstfile" >&2 (exit 1); exit } else : fi } && # Now rename the file to the real destination. $doit $mvcmd "$dsttmp" "$dstdir/$dstfile" fi || { (exit 1); exit; } done # The final little trick to "correctly" pass the exit status to the exit trap. { (exit 0); exit } # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-end: "$" # End: iaxmodem-1.2.0/lib/libiax2/configure.in0000644000175000017500000000144311150047217017264 0ustar julienjuliendnl Yo Yo Yo AC_INIT(src/iax.c) AM_INIT_AUTOMAKE([iax], [0.2.3]) dnl Check for various goodies AC_PROG_CC AM_PROG_LIBTOOL dnl LIBTOOL="$LIBTOOL --silent" AC_PROG_INSTALL dnl Check for libraries dnl None available dnl Check header files AC_HEADER_STDC AC_SUBST(LIBS) AC_ARG_ENABLE(snomhack, [ --enable-snomhack Use slower memset for SNOM phoneem ],,enable_snomhack=no) AC_ARG_ENABLE(extreme_debug, [ --enable-extreme-debug Compile with extreme debugging code enabled ],,enable_extreme_debug=no) if test "$enable_snomhack" = yes ; then AC_DEFINE(SNOM_HACK) fi if test "$enable_extreme_debug" = yes ; then AC_DEFINE(EXTREME_DEBUG) fi AC_SUBST(IAX_VERSION) AC_OUTPUT([ Makefile src/Makefile iax.spec iax-config],[case "$CONFIG_FILES" in *iax-config*)chmod +x iax-config;; esac]) iaxmodem-1.2.0/lib/libiax2/missing0000755000175000017500000002466611150047217016366 0ustar julienjulien#! /bin/sh # Common stub for a few missing GNU programs while installing. scriptversion=2003-09-02.23 # Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003 # Free Software Foundation, Inc. # Originally by Fran,cois Pinard , 1996. # 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, 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. # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. if test $# -eq 0; then echo 1>&2 "Try \`$0 --help' for more information" exit 1 fi run=: # In the cases where this matters, `missing' is being run in the # srcdir already. if test -f configure.ac; then configure_ac=configure.ac else configure_ac=configure.in fi msg="missing on your system" case "$1" in --run) # Try to run requested program, and just exit if it succeeds. run= shift "$@" && exit 0 # Exit code 63 means version mismatch. This often happens # when the user try to use an ancient version of a tool on # a file that requires a minimum version. In this case we # we should proceed has if the program had been absent, or # if --run hadn't been passed. if test $? = 63; then run=: msg="probably too old" fi ;; esac # If it does not exist, or fails to run (possibly an outdated version), # try to emulate it. case "$1" in -h|--h|--he|--hel|--help) echo "\ $0 [OPTION]... PROGRAM [ARGUMENT]... Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an error status if there is no known handling for PROGRAM. Options: -h, --help display this help and exit -v, --version output version information and exit --run try to run the given command, and emulate it if it fails Supported PROGRAM values: aclocal touch file \`aclocal.m4' autoconf touch file \`configure' autoheader touch file \`config.h.in' automake touch all \`Makefile.in' files bison create \`y.tab.[ch]', if possible, from existing .[ch] flex create \`lex.yy.c', if possible, from existing .c help2man touch the output file lex create \`lex.yy.c', if possible, from existing .c makeinfo touch the output file tar try tar, gnutar, gtar, then tar without non-portable flags yacc create \`y.tab.[ch]', if possible, from existing .[ch] Send bug reports to ." ;; -v|--v|--ve|--ver|--vers|--versi|--versio|--version) echo "missing $scriptversion (GNU Automake)" ;; -*) echo 1>&2 "$0: Unknown \`$1' option" echo 1>&2 "Try \`$0 --help' for more information" exit 1 ;; aclocal*) if test -z "$run" && ($1 --version) > /dev/null 2>&1; then # We have it, but it failed. exit 1 fi echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`acinclude.m4' or \`${configure_ac}'. You might want to install the \`Automake' and \`Perl' packages. Grab them from any GNU archive site." touch aclocal.m4 ;; autoconf) if test -z "$run" && ($1 --version) > /dev/null 2>&1; then # We have it, but it failed. exit 1 fi echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`${configure_ac}'. You might want to install the \`Autoconf' and \`GNU m4' packages. Grab them from any GNU archive site." touch configure ;; autoheader) if test -z "$run" && ($1 --version) > /dev/null 2>&1; then # We have it, but it failed. exit 1 fi echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`acconfig.h' or \`${configure_ac}'. You might want to install the \`Autoconf' and \`GNU m4' packages. Grab them from any GNU archive site." files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}` test -z "$files" && files="config.h" touch_files= for f in $files; do case "$f" in *:*) touch_files="$touch_files "`echo "$f" | sed -e 's/^[^:]*://' -e 's/:.*//'`;; *) touch_files="$touch_files $f.in";; esac done touch $touch_files ;; automake*) if test -z "$run" && ($1 --version) > /dev/null 2>&1; then # We have it, but it failed. exit 1 fi echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'. You might want to install the \`Automake' and \`Perl' packages. Grab them from any GNU archive site." find . -type f -name Makefile.am -print | sed 's/\.am$/.in/' | while read f; do touch "$f"; done ;; autom4te) if test -z "$run" && ($1 --version) > /dev/null 2>&1; then # We have it, but it failed. exit 1 fi echo 1>&2 "\ WARNING: \`$1' is needed, but is $msg. You might have modified some files without having the proper tools for further handling them. You can get \`$1' as part of \`Autoconf' from any GNU archive site." file=`echo "$*" | sed -n 's/.*--output[ =]*\([^ ]*\).*/\1/p'` test -z "$file" && file=`echo "$*" | sed -n 's/.*-o[ ]*\([^ ]*\).*/\1/p'` if test -f "$file"; then touch $file else test -z "$file" || exec >$file echo "#! /bin/sh" echo "# Created by GNU Automake missing as a replacement of" echo "# $ $@" echo "exit 0" chmod +x $file exit 1 fi ;; bison|yacc) echo 1>&2 "\ WARNING: \`$1' $msg. You should only need it if you modified a \`.y' file. You may need the \`Bison' package in order for those modifications to take effect. You can get \`Bison' from any GNU archive site." rm -f y.tab.c y.tab.h if [ $# -ne 1 ]; then eval LASTARG="\${$#}" case "$LASTARG" in *.y) SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'` if [ -f "$SRCFILE" ]; then cp "$SRCFILE" y.tab.c fi SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'` if [ -f "$SRCFILE" ]; then cp "$SRCFILE" y.tab.h fi ;; esac fi if [ ! -f y.tab.h ]; then echo >y.tab.h fi if [ ! -f y.tab.c ]; then echo 'main() { return 0; }' >y.tab.c fi ;; lex|flex) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a \`.l' file. You may need the \`Flex' package in order for those modifications to take effect. You can get \`Flex' from any GNU archive site." rm -f lex.yy.c if [ $# -ne 1 ]; then eval LASTARG="\${$#}" case "$LASTARG" in *.l) SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'` if [ -f "$SRCFILE" ]; then cp "$SRCFILE" lex.yy.c fi ;; esac fi if [ ! -f lex.yy.c ]; then echo 'main() { return 0; }' >lex.yy.c fi ;; help2man) if test -z "$run" && ($1 --version) > /dev/null 2>&1; then # We have it, but it failed. exit 1 fi echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a dependency of a manual page. You may need the \`Help2man' package in order for those modifications to take effect. You can get \`Help2man' from any GNU archive site." file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'` if test -z "$file"; then file=`echo "$*" | sed -n 's/.*--output=\([^ ]*\).*/\1/p'` fi if [ -f "$file" ]; then touch $file else test -z "$file" || exec >$file echo ".ab help2man is required to generate this page" exit 1 fi ;; makeinfo) if test -z "$run" && (makeinfo --version) > /dev/null 2>&1; then # We have makeinfo, but it failed. exit 1 fi echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a \`.texi' or \`.texinfo' file, or any other file indirectly affecting the aspect of the manual. The spurious call might also be the consequence of using a buggy \`make' (AIX, DU, IRIX). You might want to install the \`Texinfo' package or the \`GNU make' package. Grab either from any GNU archive site." file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'` if test -z "$file"; then file=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` file=`sed -n '/^@setfilename/ { s/.* \([^ ]*\) *$/\1/; p; q; }' $file` fi touch $file ;; tar) shift if test -n "$run"; then echo 1>&2 "ERROR: \`tar' requires --run" exit 1 fi # We have already tried tar in the generic part. # Look for gnutar/gtar before invocation to avoid ugly error # messages. if (gnutar --version > /dev/null 2>&1); then gnutar "$@" && exit 0 fi if (gtar --version > /dev/null 2>&1); then gtar "$@" && exit 0 fi firstarg="$1" if shift; then case "$firstarg" in *o*) firstarg=`echo "$firstarg" | sed s/o//` tar "$firstarg" "$@" && exit 0 ;; esac case "$firstarg" in *h*) firstarg=`echo "$firstarg" | sed s/h//` tar "$firstarg" "$@" && exit 0 ;; esac fi echo 1>&2 "\ WARNING: I can't seem to be able to run \`tar' with the given arguments. You may want to install GNU tar or Free paxutils, or check the command line arguments." exit 1 ;; *) echo 1>&2 "\ WARNING: \`$1' is needed, and is $msg. You might have modified some files without having the proper tools for further handling them. Check the \`README' file, it often tells you about the needed prerequisites for installing this package. You may also peek at any GNU archive site, in case some other package would contain this missing \`$1' program." exit 1 ;; esac exit 0 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-end: "$" # End: iaxmodem-1.2.0/lib/libiax2/AUTHORS0000644000175000017500000000000011150047217016007 0ustar julienjulieniaxmodem-1.2.0/lib/libiax2/bootstrap.sh0000755000175000017500000000024411150047217017325 0ustar julienjulienecho If this fails you probably need to download the latest echo libtool,aclocal,autoconf and automake libtoolize --force aclocal --force autoconf -f automake -acf iaxmodem-1.2.0/lib/libiax2/configure0000755000175000017500000241270411150047425016673 0ustar julienjulien#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.59. # # Copyright (C) 2003 Free Software Foundation, Inc. # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## --------------------- ## ## M4sh Initialization. ## ## --------------------- ## # Be Bourne compatible if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then set -o posix fi DUALCASE=1; export DUALCASE # for MKS sh # Support unset when possible. if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then as_unset=unset else as_unset=false fi # Work around bugs in pre-3.0 UWIN ksh. $as_unset ENV MAIL MAILPATH PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. for as_var in \ LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ LC_TELEPHONE LC_TIME do if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then eval $as_var=C; export $as_var else $as_unset $as_var fi done # Required to use basename. if expr a : '\(a\)' >/dev/null 2>&1; then as_expr=expr else as_expr=false fi if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi # Name of the executable. as_me=`$as_basename "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)$' \| \ . : '\(.\)' 2>/dev/null || echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; } /^X\/\(\/\/\)$/{ s//\1/; q; } /^X\/\(\/\).*/{ s//\1/; q; } s/.*/./; q'` # PATH needs CR, and LINENO needs CR and PATH. # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then echo "#! /bin/sh" >conf$$.sh echo "exit 0" >>conf$$.sh chmod +x conf$$.sh if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then PATH_SEPARATOR=';' else PATH_SEPARATOR=: fi rm -f conf$$.sh fi as_lineno_1=$LINENO as_lineno_2=$LINENO as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` test "x$as_lineno_1" != "x$as_lineno_2" && test "x$as_lineno_3" = "x$as_lineno_2" || { # Find who we are. Look in the path if we contain no path at all # relative or not. case $0 in *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then { echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2 { (exit 1); exit 1; }; } fi case $CONFIG_SHELL in '') as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for as_base in sh bash ksh sh5; do case $as_dir in /*) if ("$as_dir/$as_base" -c ' as_lineno_1=$LINENO as_lineno_2=$LINENO as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` test "x$as_lineno_1" != "x$as_lineno_2" && test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; } $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; } CONFIG_SHELL=$as_dir/$as_base export CONFIG_SHELL exec "$CONFIG_SHELL" "$0" ${1+"$@"} fi;; esac done done ;; esac # Create $as_me.lineno as a copy of $as_myself, but with $LINENO # uniformly replaced by the line number. The first 'sed' inserts a # line-number line before each line; the second 'sed' does the real # work. The second script uses 'N' to pair each line-number line # with the numbered line, and appends trailing '-' during # substitution so that $LINENO is not a special case at line end. # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-) sed '=' <$as_myself | sed ' N s,$,-, : loop s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3, t loop s,-$,, s,^['$as_cr_digits']*\n,, ' >$as_me.lineno && chmod +x $as_me.lineno || { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 { (exit 1); exit 1; }; } # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensible to this). . ./$as_me.lineno # Exit status is that of the last command. exit } case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in *c*,-n*) ECHO_N= ECHO_C=' ' ECHO_T=' ' ;; *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;; *) ECHO_N= ECHO_C='\c' ECHO_T= ;; esac if expr a : '\(a\)' >/dev/null 2>&1; then as_expr=expr else as_expr=false fi rm -f conf$$ conf$$.exe conf$$.file echo >conf$$.file if ln -s conf$$.file conf$$ 2>/dev/null; then # We could just check for DJGPP; but this test a) works b) is more generic # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04). if test -f conf$$.exe; then # Don't use ln at all; we don't have any links as_ln_s='cp -p' else as_ln_s='ln -s' fi elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.file if mkdir -p . 2>/dev/null; then as_mkdir_p=: else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_executable_p="test -f" # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" # IFS # We need space, tab and new line, in precisely that order. as_nl=' ' IFS=" $as_nl" # CDPATH. $as_unset CDPATH # Check that we are running under the correct shell. SHELL=${CONFIG_SHELL-/bin/sh} case X$ECHO in X*--fallback-echo) # Remove one level of quotation (which was required for Make). ECHO=`echo "$ECHO" | sed 's,\\\\\$\\$0,'$0','` ;; esac echo=${ECHO-echo} if test "X$1" = X--no-reexec; then # Discard the --no-reexec flag, and continue. shift elif test "X$1" = X--fallback-echo; then # Avoid inline document here, it may be left over : elif test "X`($echo '\t') 2>/dev/null`" = 'X\t' ; then # Yippee, $echo works! : else # Restart under the correct shell. exec $SHELL "$0" --no-reexec ${1+"$@"} fi if test "X$1" = X--fallback-echo; then # used as fallback echo shift cat </dev/null && echo_test_string="`eval $cmd`" && (test "X$echo_test_string" = "X$echo_test_string") 2>/dev/null then break fi done fi if test "X`($echo '\t') 2>/dev/null`" = 'X\t' && echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then : else # The Solaris, AIX, and Digital Unix default echo programs unquote # backslashes. This makes it impossible to quote backslashes using # echo "$something" | sed 's/\\/\\\\/g' # # So, first we look for a working echo in the user's PATH. lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for dir in $PATH /usr/ucb; do IFS="$lt_save_ifs" if (test -f $dir/echo || test -f $dir/echo$ac_exeext) && test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' && echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then echo="$dir/echo" break fi done IFS="$lt_save_ifs" if test "X$echo" = Xecho; then # We didn't find a better echo, so look for alternatives. if test "X`(print -r '\t') 2>/dev/null`" = 'X\t' && echo_testing_string=`(print -r "$echo_test_string") 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then # This shell has a builtin print -r that does the trick. echo='print -r' elif (test -f /bin/ksh || test -f /bin/ksh$ac_exeext) && test "X$CONFIG_SHELL" != X/bin/ksh; then # If we have ksh, try running configure again with it. ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh} export ORIGINAL_CONFIG_SHELL CONFIG_SHELL=/bin/ksh export CONFIG_SHELL exec $CONFIG_SHELL "$0" --no-reexec ${1+"$@"} else # Try using printf. echo='printf %s\n' if test "X`($echo '\t') 2>/dev/null`" = 'X\t' && echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then # Cool, printf works : elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "$0" --fallback-echo '\t') 2>/dev/null` && test "X$echo_testing_string" = 'X\t' && echo_testing_string=`($ORIGINAL_CONFIG_SHELL "$0" --fallback-echo "$echo_test_string") 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL export CONFIG_SHELL SHELL="$CONFIG_SHELL" export SHELL echo="$CONFIG_SHELL $0 --fallback-echo" elif echo_testing_string=`($CONFIG_SHELL "$0" --fallback-echo '\t') 2>/dev/null` && test "X$echo_testing_string" = 'X\t' && echo_testing_string=`($CONFIG_SHELL "$0" --fallback-echo "$echo_test_string") 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then echo="$CONFIG_SHELL $0 --fallback-echo" else # maybe with a smaller string... prev=: for cmd in 'echo test' 'sed 2q "$0"' 'sed 10q "$0"' 'sed 20q "$0"' 'sed 50q "$0"'; do if (test "X$echo_test_string" = "X`eval $cmd`") 2>/dev/null then break fi prev="$cmd" done if test "$prev" != 'sed 50q "$0"'; then echo_test_string=`eval $prev` export echo_test_string exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "$0" ${1+"$@"} else # Oops. We lost completely, so just stick with echo. echo=echo fi fi fi fi fi fi # Copy echo and quote the copy suitably for passing to libtool from # the Makefile, instead of quoting the original, which is used later. ECHO=$echo if test "X$ECHO" = "X$CONFIG_SHELL $0 --fallback-echo"; then ECHO="$CONFIG_SHELL \\\$\$0 --fallback-echo" fi tagnames=${tagnames+${tagnames},}CXX tagnames=${tagnames+${tagnames},}F77 # Name of the host. # hostname on some systems (SVR3.2, Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` exec 6>&1 # # Initializations. # ac_default_prefix=/usr/local ac_config_libobj_dir=. cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= SHELL=${CONFIG_SHELL-/bin/sh} # Maximum number of lines to put in a shell here document. # This variable seems obsolete. It should probably be removed, and # only ac_max_sed_lines should be used. : ${ac_max_here_lines=38} # Identity of this package. PACKAGE_NAME= PACKAGE_TARNAME= PACKAGE_VERSION= PACKAGE_STRING= PACKAGE_BUGREPORT= ac_unique_file="src/iax.c" # Factoring default headers for most tests. ac_includes_default="\ #include #if HAVE_SYS_TYPES_H # include #endif #if HAVE_SYS_STAT_H # include #endif #if STDC_HEADERS # include # include #else # if HAVE_STDLIB_H # include # endif #endif #if HAVE_STRING_H # if !STDC_HEADERS && HAVE_MEMORY_H # include # endif # include #endif #if HAVE_STRINGS_H # include #endif #if HAVE_INTTYPES_H # include #else # if HAVE_STDINT_H # include # endif #endif #if HAVE_UNISTD_H # include #endif" ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA CYGPATH_W PACKAGE VERSION ACLOCAL AUTOCONF AUTOMAKE AUTOHEADER MAKEINFO AMTAR install_sh STRIP ac_ct_STRIP INSTALL_STRIP_PROGRAM mkdir_p AWK SET_MAKE am__leading_dot CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT DEPDIR am__include am__quote AMDEP_TRUE AMDEP_FALSE AMDEPBACKSLASH CCDEPMODE am__fastdepCC_TRUE am__fastdepCC_FALSE build build_cpu build_vendor build_os host host_cpu host_vendor host_os EGREP LN_S ECHO AR ac_ct_AR RANLIB ac_ct_RANLIB CPP CXX CXXFLAGS ac_ct_CXX CXXDEPMODE am__fastdepCXX_TRUE am__fastdepCXX_FALSE CXXCPP F77 FFLAGS ac_ct_F77 LIBTOOL IAX_VERSION LIBOBJS LTLIBOBJS' ac_subst_files='' # Initialize some variables set by options. ac_init_help= ac_init_version=false # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datadir='${prefix}/share' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' libdir='${exec_prefix}/lib' includedir='${prefix}/include' oldincludedir='/usr/include' infodir='${prefix}/info' mandir='${prefix}/man' ac_prev= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval "$ac_prev=\$ac_option" ac_prev= continue fi ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'` # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_option in -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad | --data | --dat | --da) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \ | --da=*) datadir=$ac_optarg ;; -disable-* | --disable-*) ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid feature name: $ac_feature" >&2 { (exit 1); exit 1; }; } ac_feature=`echo $ac_feature | sed 's/-/_/g'` eval "enable_$ac_feature=no" ;; -enable-* | --enable-*) ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid feature name: $ac_feature" >&2 { (exit 1); exit 1; }; } ac_feature=`echo $ac_feature | sed 's/-/_/g'` case $ac_option in *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;; *) ac_optarg=yes ;; esac eval "enable_$ac_feature='$ac_optarg'" ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst \ | --locals | --local | --loca | --loc | --lo) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* \ | --locals=* | --local=* | --loca=* | --loc=* | --lo=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid package name: $ac_package" >&2 { (exit 1); exit 1; }; } ac_package=`echo $ac_package| sed 's/-/_/g'` case $ac_option in *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;; *) ac_optarg=yes ;; esac eval "with_$ac_package='$ac_optarg'" ;; -without-* | --without-*) ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid package name: $ac_package" >&2 { (exit 1); exit 1; }; } ac_package=`echo $ac_package | sed 's/-/_/g'` eval "with_$ac_package=no" ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) { echo "$as_me: error: unrecognized option: $ac_option Try \`$0 --help' for more information." >&2 { (exit 1); exit 1; }; } ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid variable name: $ac_envvar" >&2 { (exit 1); exit 1; }; } ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` eval "$ac_envvar='$ac_optarg'" export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option} ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` { echo "$as_me: error: missing argument to $ac_option" >&2 { (exit 1); exit 1; }; } fi # Be sure to have absolute paths. for ac_var in exec_prefix prefix do eval ac_val=$`echo $ac_var` case $ac_val in [\\/$]* | ?:[\\/]* | NONE | '' ) ;; *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 { (exit 1); exit 1; }; };; esac done # Be sure to have absolute paths. for ac_var in bindir sbindir libexecdir datadir sysconfdir sharedstatedir \ localstatedir libdir includedir oldincludedir infodir mandir do eval ac_val=$`echo $ac_var` case $ac_val in [\\/$]* | ?:[\\/]* ) ;; *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 { (exit 1); exit 1; }; };; esac done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host. If a cross compiler is detected then cross compile mode will be used." >&2 elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then its parent. ac_confdir=`(dirname "$0") 2>/dev/null || $as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$0" : 'X\(//\)[^/]' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| \ . : '\(.\)' 2>/dev/null || echo X"$0" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } /^X\(\/\/\)$/{ s//\1/; q; } /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'` srcdir=$ac_confdir if test ! -r $srcdir/$ac_unique_file; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r $srcdir/$ac_unique_file; then if test "$ac_srcdir_defaulted" = yes; then { echo "$as_me: error: cannot find sources ($ac_unique_file) in $ac_confdir or .." >&2 { (exit 1); exit 1; }; } else { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2 { (exit 1); exit 1; }; } fi fi (cd $srcdir && test -r ./$ac_unique_file) 2>/dev/null || { echo "$as_me: error: sources are in $srcdir, but \`cd $srcdir' does not work" >&2 { (exit 1); exit 1; }; } srcdir=`echo "$srcdir" | sed 's%\([^\\/]\)[\\/]*$%\1%'` ac_env_build_alias_set=${build_alias+set} ac_env_build_alias_value=$build_alias ac_cv_env_build_alias_set=${build_alias+set} ac_cv_env_build_alias_value=$build_alias ac_env_host_alias_set=${host_alias+set} ac_env_host_alias_value=$host_alias ac_cv_env_host_alias_set=${host_alias+set} ac_cv_env_host_alias_value=$host_alias ac_env_target_alias_set=${target_alias+set} ac_env_target_alias_value=$target_alias ac_cv_env_target_alias_set=${target_alias+set} ac_cv_env_target_alias_value=$target_alias ac_env_CC_set=${CC+set} ac_env_CC_value=$CC ac_cv_env_CC_set=${CC+set} ac_cv_env_CC_value=$CC ac_env_CFLAGS_set=${CFLAGS+set} ac_env_CFLAGS_value=$CFLAGS ac_cv_env_CFLAGS_set=${CFLAGS+set} ac_cv_env_CFLAGS_value=$CFLAGS ac_env_LDFLAGS_set=${LDFLAGS+set} ac_env_LDFLAGS_value=$LDFLAGS ac_cv_env_LDFLAGS_set=${LDFLAGS+set} ac_cv_env_LDFLAGS_value=$LDFLAGS ac_env_CPPFLAGS_set=${CPPFLAGS+set} ac_env_CPPFLAGS_value=$CPPFLAGS ac_cv_env_CPPFLAGS_set=${CPPFLAGS+set} ac_cv_env_CPPFLAGS_value=$CPPFLAGS ac_env_CPP_set=${CPP+set} ac_env_CPP_value=$CPP ac_cv_env_CPP_set=${CPP+set} ac_cv_env_CPP_value=$CPP ac_env_CXX_set=${CXX+set} ac_env_CXX_value=$CXX ac_cv_env_CXX_set=${CXX+set} ac_cv_env_CXX_value=$CXX ac_env_CXXFLAGS_set=${CXXFLAGS+set} ac_env_CXXFLAGS_value=$CXXFLAGS ac_cv_env_CXXFLAGS_set=${CXXFLAGS+set} ac_cv_env_CXXFLAGS_value=$CXXFLAGS ac_env_CXXCPP_set=${CXXCPP+set} ac_env_CXXCPP_value=$CXXCPP ac_cv_env_CXXCPP_set=${CXXCPP+set} ac_cv_env_CXXCPP_value=$CXXCPP ac_env_F77_set=${F77+set} ac_env_F77_value=$F77 ac_cv_env_F77_set=${F77+set} ac_cv_env_F77_value=$F77 ac_env_FFLAGS_set=${FFLAGS+set} ac_env_FFLAGS_value=$FFLAGS ac_cv_env_FFLAGS_set=${FFLAGS+set} ac_cv_env_FFLAGS_value=$FFLAGS # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures this package to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] _ACEOF cat <<_ACEOF Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --datadir=DIR read-only architecture-independent data [PREFIX/share] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --infodir=DIR info documentation [PREFIX/info] --mandir=DIR man documentation [PREFIX/man] _ACEOF cat <<\_ACEOF Program names: --program-prefix=PREFIX prepend PREFIX to installed program names --program-suffix=SUFFIX append SUFFIX to installed program names --program-transform-name=PROGRAM run sed PROGRAM on installed program names System types: --build=BUILD configure for building on BUILD [guessed] --host=HOST cross-compile to build programs to run on HOST [BUILD] _ACEOF fi if test -n "$ac_init_help"; then cat <<\_ACEOF Optional Features: --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --disable-dependency-tracking speeds up one-time build --enable-dependency-tracking do not reject slow dependency extractors --enable-shared[=PKGS] build shared libraries [default=yes] --enable-static[=PKGS] build static libraries [default=yes] --enable-fast-install[=PKGS] optimize for fast installation [default=yes] --disable-libtool-lock avoid locking (might break parallel builds) --enable-snomhack Use slower memset for SNOM phoneem --enable-extreme-debug Compile with extreme debugging code enabled Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-gnu-ld assume the C compiler uses GNU ld [default=no] --with-pic try to use only PIC/non-PIC objects [default=use both] --with-tags[=TAGS] include additional configurations [automatic] Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory CPPFLAGS C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CPP C preprocessor CXX C++ compiler command CXXFLAGS C++ compiler flags CXXCPP C++ preprocessor F77 Fortran 77 compiler command FFLAGS Fortran 77 compiler flags Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. _ACEOF fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. ac_popdir=`pwd` for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d $ac_dir || continue ac_builddir=. if test "$ac_dir" != .; then ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` # A "../" for each directory in $ac_dir_suffix. ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` else ac_dir_suffix= ac_top_builddir= fi case $srcdir in .) # No --srcdir option. We are building in place. ac_srcdir=. if test -z "$ac_top_builddir"; then ac_top_srcdir=. else ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` fi ;; [\\/]* | ?:[\\/]* ) # Absolute path. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ;; *) # Relative path. ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_builddir$srcdir ;; esac # Do not use `cd foo && pwd` to compute absolute paths, because # the directories may not exist. case `pwd` in .) ac_abs_builddir="$ac_dir";; *) case "$ac_dir" in .) ac_abs_builddir=`pwd`;; [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";; *) ac_abs_builddir=`pwd`/"$ac_dir";; esac;; esac case $ac_abs_builddir in .) ac_abs_top_builddir=${ac_top_builddir}.;; *) case ${ac_top_builddir}. in .) ac_abs_top_builddir=$ac_abs_builddir;; [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;; *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;; esac;; esac case $ac_abs_builddir in .) ac_abs_srcdir=$ac_srcdir;; *) case $ac_srcdir in .) ac_abs_srcdir=$ac_abs_builddir;; [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;; *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;; esac;; esac case $ac_abs_builddir in .) ac_abs_top_srcdir=$ac_top_srcdir;; *) case $ac_top_srcdir in .) ac_abs_top_srcdir=$ac_abs_builddir;; [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;; *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;; esac;; esac cd $ac_dir # Check for guested configure; otherwise get Cygnus style configure. if test -f $ac_srcdir/configure.gnu; then echo $SHELL $ac_srcdir/configure.gnu --help=recursive elif test -f $ac_srcdir/configure; then echo $SHELL $ac_srcdir/configure --help=recursive elif test -f $ac_srcdir/configure.ac || test -f $ac_srcdir/configure.in; then echo $ac_configure --help else echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi cd $ac_popdir done fi test -n "$ac_init_help" && exit 0 if $ac_init_version; then cat <<\_ACEOF Copyright (C) 2003 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit 0 fi exec 5>config.log cat >&5 <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by $as_me, which was generated by GNU Autoconf 2.59. Invocation command line was $ $0 $@ _ACEOF { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` hostinfo = `(hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. echo "PATH: $as_dir" done } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_sep= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*) ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;; 2) ac_configure_args1="$ac_configure_args1 '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi ac_configure_args="$ac_configure_args$ac_sep'$ac_arg'" # Get rid of the leading space. ac_sep=" " ;; esac done done $as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; } $as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export ac_configure_args1; } # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Be sure not to use single quotes in there, as some shells, # such as our DU 5.0 friend, will then `close' the trap. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo cat <<\_ASBOX ## ---------------- ## ## Cache variables. ## ## ---------------- ## _ASBOX echo # The following way of writing the cache mishandles newlines in values, { (set) 2>&1 | case `(ac_space='"'"' '"'"'; set | grep ac_space) 2>&1` in *ac_space=\ *) sed -n \ "s/'"'"'/'"'"'\\\\'"'"''"'"'/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='"'"'\\2'"'"'/p" ;; *) sed -n \ "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" ;; esac; } echo cat <<\_ASBOX ## ----------------- ## ## Output variables. ## ## ----------------- ## _ASBOX echo for ac_var in $ac_subst_vars do eval ac_val=$`echo $ac_var` echo "$ac_var='"'"'$ac_val'"'"'" done | sort echo if test -n "$ac_subst_files"; then cat <<\_ASBOX ## ------------- ## ## Output files. ## ## ------------- ## _ASBOX echo for ac_var in $ac_subst_files do eval ac_val=$`echo $ac_var` echo "$ac_var='"'"'$ac_val'"'"'" done | sort echo fi if test -s confdefs.h; then cat <<\_ASBOX ## ----------- ## ## confdefs.h. ## ## ----------- ## _ASBOX echo sed "/^$/d" confdefs.h | sort echo fi test "$ac_signal" != 0 && echo "$as_me: caught signal $ac_signal" echo "$as_me: exit $exit_status" } >&5 rm -f core *.core && rm -rf conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -rf conftest* confdefs.h # AIX cpp loses on an empty file, so make sure it contains at least a newline. echo >confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer explicitly selected file to automatically selected ones. if test -z "$CONFIG_SITE"; then if test "x$prefix" != xNONE; then CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site" else CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" fi fi for ac_site_file in $CONFIG_SITE; do if test -r "$ac_site_file"; then { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5 echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special # files actually), so we avoid doing that. if test -f "$cache_file"; then { echo "$as_me:$LINENO: loading cache $cache_file" >&5 echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . $cache_file;; *) . ./$cache_file;; esac fi else { echo "$as_me:$LINENO: creating cache $cache_file" >&5 echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in `(set) 2>&1 | sed -n 's/^ac_env_\([a-zA-Z_0-9]*\)_set=.*/\1/p'`; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val="\$ac_cv_env_${ac_var}_value" eval ac_new_val="\$ac_env_${ac_var}_value" case $ac_old_set,$ac_new_set in set,) { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5 echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then { echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5 echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} { echo "$as_me:$LINENO: former value: $ac_old_val" >&5 echo "$as_me: former value: $ac_old_val" >&2;} { echo "$as_me:$LINENO: current value: $ac_new_val" >&5 echo "$as_me: current value: $ac_new_val" >&2;} ac_cache_corrupted=: fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*) ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) ac_configure_args="$ac_configure_args '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5 echo "$as_me: error: changes in the environment can compromise the build" >&2;} { { echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5 echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;} { (exit 1); exit 1; }; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu am__api_version="1.8" ac_aux_dir= for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do if test -f $ac_dir/install-sh; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f $ac_dir/install.sh; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f $ac_dir/shtool; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then { { echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&5 echo "$as_me: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&2;} { (exit 1); exit 1; }; } fi ac_config_guess="$SHELL $ac_aux_dir/config.guess" ac_config_sub="$SHELL $ac_aux_dir/config.sub" ac_configure="$SHELL $ac_aux_dir/configure" # This should be Cygnus configure. # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5 echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6 if test -z "$INSTALL"; then if test "${ac_cv_path_install+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in ./ | .// | /cC/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi done done ;; esac done fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. We don't cache a # path for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the path is relative. INSTALL=$ac_install_sh fi fi echo "$as_me:$LINENO: result: $INSTALL" >&5 echo "${ECHO_T}$INSTALL" >&6 # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' echo "$as_me:$LINENO: checking whether build environment is sane" >&5 echo $ECHO_N "checking whether build environment is sane... $ECHO_C" >&6 # Just in case sleep 1 echo timestamp > conftest.file # Do `set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null` if test "$*" = "X"; then # -L didn't work. set X `ls -t $srcdir/configure conftest.file` fi rm -f conftest.file if test "$*" != "X $srcdir/configure conftest.file" \ && test "$*" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". { { echo "$as_me:$LINENO: error: ls -t appears to fail. Make sure there is not a broken alias in your environment" >&5 echo "$as_me: error: ls -t appears to fail. Make sure there is not a broken alias in your environment" >&2;} { (exit 1); exit 1; }; } fi test "$2" = conftest.file ) then # Ok. : else { { echo "$as_me:$LINENO: error: newly created file is older than distributed files! Check your system clock" >&5 echo "$as_me: error: newly created file is older than distributed files! Check your system clock" >&2;} { (exit 1); exit 1; }; } fi echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6 test "$program_prefix" != NONE && program_transform_name="s,^,$program_prefix,;$program_transform_name" # Use a double $ so make ignores it. test "$program_suffix" != NONE && program_transform_name="s,\$,$program_suffix,;$program_transform_name" # Double any \ or $. echo might interpret backslashes. # By default was `s,x,x', remove it if useless. cat <<\_ACEOF >conftest.sed s/[\\$]/&&/g;s/;s,x,x,$// _ACEOF program_transform_name=`echo $program_transform_name | sed -f conftest.sed` rm conftest.sed # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing" # Use eval to expand $SHELL if eval "$MISSING --run true"; then am_missing_run="$MISSING --run " else am_missing_run= { echo "$as_me:$LINENO: WARNING: \`missing' script is too old or missing" >&5 echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;} fi if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then # Keeping the `.' argument allows $(mkdir_p) to be used without # argument. Indeed, we sometimes output rules like # $(mkdir_p) $(somedir) # where $(somedir) is conditionally defined. # (`test -n '$(somedir)' && $(mkdir_p) $(somedir)' is a more # expensive solution, as it forces Make to start a sub-shell.) mkdir_p='mkdir -p -- .' else # On NextStep and OpenStep, the `mkdir' command does not # recognize any option. It will interpret all options as # directories to create, and then abort because `.' already # exists. for d in ./-p ./--version; do test -d $d && rmdir $d done # $(mkinstalldirs) is defined by Automake if mkinstalldirs exists. if test -f "$ac_aux_dir/mkinstalldirs"; then mkdir_p='$(mkinstalldirs)' else mkdir_p='$(install_sh) -d' fi fi for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_AWK+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AWK="$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then echo "$as_me:$LINENO: result: $AWK" >&5 echo "${ECHO_T}$AWK" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi test -n "$AWK" && break done echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5 echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6 set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y,:./+-,___p_,'` if eval "test \"\${ac_cv_prog_make_${ac_make}_set+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.make <<\_ACEOF all: @echo 'ac_maketemp="$(MAKE)"' _ACEOF # GNU make sometimes prints "make[1]: Entering...", which would confuse us. eval `${MAKE-make} -f conftest.make 2>/dev/null | grep temp=` if test -n "$ac_maketemp"; then eval ac_cv_prog_make_${ac_make}_set=yes else eval ac_cv_prog_make_${ac_make}_set=no fi rm -f conftest.make fi if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6 SET_MAKE= else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 SET_MAKE="MAKE=${MAKE-make}" fi rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null # test to see if srcdir already configured if test "`cd $srcdir && pwd`" != "`pwd`" && test -f $srcdir/config.status; then { { echo "$as_me:$LINENO: error: source directory already configured; run \"make distclean\" there first" >&5 echo "$as_me: error: source directory already configured; run \"make distclean\" there first" >&2;} { (exit 1); exit 1; }; } fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi # Define the identity of the package. PACKAGE=iax VERSION=0.2.3 cat >>confdefs.h <<_ACEOF #define PACKAGE "$PACKAGE" _ACEOF cat >>confdefs.h <<_ACEOF #define VERSION "$VERSION" _ACEOF # Some tools Automake needs. ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} AMTAR=${AMTAR-"${am_missing_run}tar"} install_sh=${install_sh-"$am_aux_dir/install-sh"} # Installed binaries are usually stripped using `strip' when the user # run `make install-strip'. However `strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the `STRIP' environment variable to overrule this program. if test "$cross_compiling" != no; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_STRIP+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then echo "$as_me:$LINENO: result: $STRIP" >&5 echo "${ECHO_T}$STRIP" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done test -z "$ac_cv_prog_ac_ct_STRIP" && ac_cv_prog_ac_ct_STRIP=":" fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5 echo "${ECHO_T}$ac_ct_STRIP" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi STRIP=$ac_ct_STRIP else STRIP="$ac_cv_prog_STRIP" fi fi INSTALL_STRIP_PROGRAM="\${SHELL} \$(install_sh) -c -s" # We need awk for the "check" target. The system "awk" is bad on # some platforms. ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then echo "$as_me:$LINENO: result: $CC" >&5 echo "${ECHO_T}$CC" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_ac_ct_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 echo "${ECHO_T}$ac_ct_CC" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi CC=$ac_ct_CC else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then echo "$as_me:$LINENO: result: $CC" >&5 echo "${ECHO_T}$CC" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_ac_ct_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="cc" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 echo "${ECHO_T}$ac_ct_CC" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi CC=$ac_ct_CC else CC="$ac_cv_prog_CC" fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then echo "$as_me:$LINENO: result: $CC" >&5 echo "${ECHO_T}$CC" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then echo "$as_me:$LINENO: result: $CC" >&5 echo "${ECHO_T}$CC" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_ac_ct_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 echo "${ECHO_T}$ac_ct_CC" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi test -n "$ac_ct_CC" && break done CC=$ac_ct_CC fi fi test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH See \`config.log' for more details." >&5 echo "$as_me: error: no acceptable C compiler found in \$PATH See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } # Provide some information about the compiler. echo "$as_me:$LINENO:" \ "checking for C compiler version" >&5 ac_compiler=`set X $ac_compile; echo $2` { (eval echo "$as_me:$LINENO: \"$ac_compiler --version &5\"") >&5 (eval $ac_compiler --version &5) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { (eval echo "$as_me:$LINENO: \"$ac_compiler -v &5\"") >&5 (eval $ac_compiler -v &5) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { (eval echo "$as_me:$LINENO: \"$ac_compiler -V &5\"") >&5 (eval $ac_compiler -V &5) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. echo "$as_me:$LINENO: checking for C compiler default output file name" >&5 echo $ECHO_N "checking for C compiler default output file name... $ECHO_C" >&6 ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` if { (eval echo "$as_me:$LINENO: \"$ac_link_default\"") >&5 (eval $ac_link_default) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then # Find the output, starting from the most likely. This scheme is # not robust to junk in `.', hence go to wildcards (a.*) only as a last # resort. # Be careful to initialize this variable, since it used to be cached. # Otherwise an old cache value of `no' led to `EXEEXT = no' in a Makefile. ac_cv_exeext= # b.out is created by i960 compilers. for ac_file in a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj ) ;; conftest.$ac_ext ) # This is the source file. ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` # FIXME: I believe we export ac_cv_exeext for Libtool, # but it would be cool to find out if it's true. Does anybody # maintain Libtool? --akim. export ac_cv_exeext break;; * ) break;; esac done else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { echo "$as_me:$LINENO: error: C compiler cannot create executables See \`config.log' for more details." >&5 echo "$as_me: error: C compiler cannot create executables See \`config.log' for more details." >&2;} { (exit 77); exit 77; }; } fi ac_exeext=$ac_cv_exeext echo "$as_me:$LINENO: result: $ac_file" >&5 echo "${ECHO_T}$ac_file" >&6 # Check the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. echo "$as_me:$LINENO: checking whether the C compiler works" >&5 echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6 # FIXME: These cross compiler hacks should be removed for Autoconf 3.0 # If not cross compiling, check that we can run a simple program. if test "$cross_compiling" != yes; then if { ac_try='./$ac_file' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { echo "$as_me:$LINENO: error: cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details." >&5 echo "$as_me: error: cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } fi fi fi echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6 rm -f a.out a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save # Check the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. echo "$as_me:$LINENO: checking whether we are cross compiling" >&5 echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6 echo "$as_me:$LINENO: result: $cross_compiling" >&5 echo "${ECHO_T}$cross_compiling" >&6 echo "$as_me:$LINENO: checking for suffix of executables" >&5 echo $ECHO_N "checking for suffix of executables... $ECHO_C" >&6 if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` export ac_cv_exeext break;; * ) break;; esac done else { { echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link See \`config.log' for more details." >&5 echo "$as_me: error: cannot compute suffix of executables: cannot compile and link See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } fi rm -f conftest$ac_cv_exeext echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5 echo "${ECHO_T}$ac_cv_exeext" >&6 rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT echo "$as_me:$LINENO: checking for suffix of object files" >&5 echo $ECHO_N "checking for suffix of object files... $ECHO_C" >&6 if test "${ac_cv_objext+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then for ac_file in `(ls conftest.o conftest.obj; ls conftest.*) 2>/dev/null`; do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile See \`config.log' for more details." >&5 echo "$as_me: error: cannot compute suffix of object files: cannot compile See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_objext" >&5 echo "${ECHO_T}$ac_cv_objext" >&6 OBJEXT=$ac_cv_objext ac_objext=$OBJEXT echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5 echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6 if test "${ac_cv_c_compiler_gnu+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_compiler_gnu=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_compiler_gnu=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5 echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6 GCC=`test $ac_compiler_gnu = yes && echo yes` ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS CFLAGS="-g" echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5 echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6 if test "${ac_cv_prog_cc_g+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_prog_cc_g=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_prog_cc_g=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5 echo "${ECHO_T}$ac_cv_prog_cc_g" >&6 if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi echo "$as_me:$LINENO: checking for $CC option to accept ANSI C" >&5 echo $ECHO_N "checking for $CC option to accept ANSI C... $ECHO_C" >&6 if test "${ac_cv_prog_cc_stdc+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_cv_prog_cc_stdc=no ac_save_CC=$CC cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include #include #include /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std1 is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std1. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF # Don't try gcc -ansi; that turns off useful extensions and # breaks some systems' header files. # AIX -qlanglvl=ansi # Ultrix and OSF/1 -std1 # HP-UX 10.20 and later -Ae # HP-UX older versions -Aa -D_HPUX_SOURCE # SVR4 -Xc -D__EXTENSIONS__ for ac_arg in "" -qlanglvl=ansi -std1 -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_prog_cc_stdc=$ac_arg break else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext done rm -f conftest.$ac_ext conftest.$ac_objext CC=$ac_save_CC fi case "x$ac_cv_prog_cc_stdc" in x|xno) echo "$as_me:$LINENO: result: none needed" >&5 echo "${ECHO_T}none needed" >&6 ;; *) echo "$as_me:$LINENO: result: $ac_cv_prog_cc_stdc" >&5 echo "${ECHO_T}$ac_cv_prog_cc_stdc" >&6 CC="$CC $ac_cv_prog_cc_stdc" ;; esac # Some people use a C++ compiler to compile C. Since we use `exit', # in C++ we need to declare it. In case someone uses the same compiler # for both compiling C and C++ we need to have the C++ compiler decide # the declaration of exit, since it's the most demanding environment. cat >conftest.$ac_ext <<_ACEOF #ifndef __cplusplus choke me #endif _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then for ac_declaration in \ '' \ 'extern "C" void std::exit (int) throw (); using std::exit;' \ 'extern "C" void std::exit (int); using std::exit;' \ 'extern "C" void exit (int) throw ();' \ 'extern "C" void exit (int);' \ 'void exit (int);' do cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_declaration #include int main () { exit (42); ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then : else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 continue fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_declaration int main () { exit (42); ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then break else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext done rm -f conftest* if test -n "$ac_declaration"; then echo '#ifdef __cplusplus' >>confdefs.h echo $ac_declaration >>confdefs.h echo '#endif' >>confdefs.h fi else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu DEPDIR="${am__leading_dot}deps" ac_config_commands="$ac_config_commands depfiles" am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo done .PHONY: am__doit END # If we don't find an include directive, just comment out the code. echo "$as_me:$LINENO: checking for style of include used by $am_make" >&5 echo $ECHO_N "checking for style of include used by $am_make... $ECHO_C" >&6 am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # We grep out `Entering directory' and `Leaving directory' # messages which can occur if `w' ends up in MAKEFLAGS. # In particular we don't look at `^make:' because GNU make might # be invoked under some other name (usually "gmake"), in which # case it prints its new name instead of `make'. if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then am__include=include am__quote= _am_result=GNU fi # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then am__include=.include am__quote="\"" _am_result=BSD fi fi echo "$as_me:$LINENO: result: $_am_result" >&5 echo "${ECHO_T}$_am_result" >&6 rm -f confinc confmf # Check whether --enable-dependency-tracking or --disable-dependency-tracking was given. if test "${enable_dependency_tracking+set}" = set; then enableval="$enable_dependency_tracking" fi; if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' fi if test "x$enable_dependency_tracking" != xno; then AMDEP_TRUE= AMDEP_FALSE='#' else AMDEP_TRUE='#' AMDEP_FALSE= fi depcc="$CC" am_compiler_list= echo "$as_me:$LINENO: checking dependency style of $depcc" >&5 echo $ECHO_N "checking dependency style of $depcc... $ECHO_C" >&6 if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named `D' -- because `-MD' means `put the output # in D'. mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CC_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with # Solaris 8's {/usr,}/bin/sh. touch sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf case $depmode in nosideeffect) # after this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; none) break ;; esac # We check with `-c' and `-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle `-M -o', and we need to detect this. if depmode=$depmode \ source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # (even with -Werror). So we grep stderr for any message # that says an option was ignored. if grep 'ignoring option' conftest.err >/dev/null 2>&1; then :; else am_cv_CC_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CC_dependencies_compiler_type=none fi fi echo "$as_me:$LINENO: result: $am_cv_CC_dependencies_compiler_type" >&5 echo "${ECHO_T}$am_cv_CC_dependencies_compiler_type" >&6 CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then am__fastdepCC_TRUE= am__fastdepCC_FALSE='#' else am__fastdepCC_TRUE='#' am__fastdepCC_FALSE= fi # Check whether --enable-shared or --disable-shared was given. if test "${enable_shared+set}" = set; then enableval="$enable_shared" p=${PACKAGE-default} case $enableval in yes) enable_shared=yes ;; no) enable_shared=no ;; *) enable_shared=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_shared=yes fi done IFS="$lt_save_ifs" ;; esac else enable_shared=yes fi; # Check whether --enable-static or --disable-static was given. if test "${enable_static+set}" = set; then enableval="$enable_static" p=${PACKAGE-default} case $enableval in yes) enable_static=yes ;; no) enable_static=no ;; *) enable_static=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_static=yes fi done IFS="$lt_save_ifs" ;; esac else enable_static=yes fi; # Check whether --enable-fast-install or --disable-fast-install was given. if test "${enable_fast_install+set}" = set; then enableval="$enable_fast_install" p=${PACKAGE-default} case $enableval in yes) enable_fast_install=yes ;; no) enable_fast_install=no ;; *) enable_fast_install=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_fast_install=yes fi done IFS="$lt_save_ifs" ;; esac else enable_fast_install=yes fi; # Make sure we can run config.sub. $ac_config_sub sun4 >/dev/null 2>&1 || { { echo "$as_me:$LINENO: error: cannot run $ac_config_sub" >&5 echo "$as_me: error: cannot run $ac_config_sub" >&2;} { (exit 1); exit 1; }; } echo "$as_me:$LINENO: checking build system type" >&5 echo $ECHO_N "checking build system type... $ECHO_C" >&6 if test "${ac_cv_build+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_cv_build_alias=$build_alias test -z "$ac_cv_build_alias" && ac_cv_build_alias=`$ac_config_guess` test -z "$ac_cv_build_alias" && { { echo "$as_me:$LINENO: error: cannot guess build type; you must specify one" >&5 echo "$as_me: error: cannot guess build type; you must specify one" >&2;} { (exit 1); exit 1; }; } ac_cv_build=`$ac_config_sub $ac_cv_build_alias` || { { echo "$as_me:$LINENO: error: $ac_config_sub $ac_cv_build_alias failed" >&5 echo "$as_me: error: $ac_config_sub $ac_cv_build_alias failed" >&2;} { (exit 1); exit 1; }; } fi echo "$as_me:$LINENO: result: $ac_cv_build" >&5 echo "${ECHO_T}$ac_cv_build" >&6 build=$ac_cv_build build_cpu=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` build_vendor=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` build_os=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` echo "$as_me:$LINENO: checking host system type" >&5 echo $ECHO_N "checking host system type... $ECHO_C" >&6 if test "${ac_cv_host+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_cv_host_alias=$host_alias test -z "$ac_cv_host_alias" && ac_cv_host_alias=$ac_cv_build_alias ac_cv_host=`$ac_config_sub $ac_cv_host_alias` || { { echo "$as_me:$LINENO: error: $ac_config_sub $ac_cv_host_alias failed" >&5 echo "$as_me: error: $ac_config_sub $ac_cv_host_alias failed" >&2;} { (exit 1); exit 1; }; } fi echo "$as_me:$LINENO: result: $ac_cv_host" >&5 echo "${ECHO_T}$ac_cv_host" >&6 host=$ac_cv_host host_cpu=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` host_vendor=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` host_os=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` echo "$as_me:$LINENO: checking for a sed that does not truncate output" >&5 echo $ECHO_N "checking for a sed that does not truncate output... $ECHO_C" >&6 if test "${lt_cv_path_SED+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else # Loop through the user's path and test for sed and gsed. # Then use that list of sed's as ones to test for truncation. as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for lt_ac_prog in sed gsed; do for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" fi done done done lt_ac_max=0 lt_ac_count=0 # Add /usr/xpg4/bin/sed as it is typically found on Solaris # along with /bin/sed that truncates output. for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do test ! -f $lt_ac_sed && break cat /dev/null > conftest.in lt_ac_count=0 echo $ECHO_N "0123456789$ECHO_C" >conftest.in # Check for GNU sed and select it if it is found. if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then lt_cv_path_SED=$lt_ac_sed break fi while true; do cat conftest.in conftest.in >conftest.tmp mv conftest.tmp conftest.in cp conftest.in conftest.nl echo >>conftest.nl $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break cmp -s conftest.out conftest.nl || break # 10000 chars as input seems more than enough test $lt_ac_count -gt 10 && break lt_ac_count=`expr $lt_ac_count + 1` if test $lt_ac_count -gt $lt_ac_max; then lt_ac_max=$lt_ac_count lt_cv_path_SED=$lt_ac_sed fi done done SED=$lt_cv_path_SED fi echo "$as_me:$LINENO: result: $SED" >&5 echo "${ECHO_T}$SED" >&6 echo "$as_me:$LINENO: checking for egrep" >&5 echo $ECHO_N "checking for egrep... $ECHO_C" >&6 if test "${ac_cv_prog_egrep+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if echo a | (grep -E '(a|b)') >/dev/null 2>&1 then ac_cv_prog_egrep='grep -E' else ac_cv_prog_egrep='egrep' fi fi echo "$as_me:$LINENO: result: $ac_cv_prog_egrep" >&5 echo "${ECHO_T}$ac_cv_prog_egrep" >&6 EGREP=$ac_cv_prog_egrep # Check whether --with-gnu-ld or --without-gnu-ld was given. if test "${with_gnu_ld+set}" = set; then withval="$with_gnu_ld" test "$withval" = no || with_gnu_ld=yes else with_gnu_ld=no fi; ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. echo "$as_me:$LINENO: checking for ld used by $CC" >&5 echo $ECHO_N "checking for ld used by $CC... $ECHO_C" >&6 case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [\\/]* | ?:[\\/]*) re_direlt='/[^/][^/]*/\.\./' # Canonicalize the pathname of ld ac_prog=`echo $ac_prog| $SED 's%\\\\%/%g'` while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do ac_prog=`echo $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then echo "$as_me:$LINENO: checking for GNU ld" >&5 echo $ECHO_N "checking for GNU ld... $ECHO_C" >&6 else echo "$as_me:$LINENO: checking for non-GNU ld" >&5 echo $ECHO_N "checking for non-GNU ld... $ECHO_C" >&6 fi if test "${lt_cv_path_LD+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -z "$LD"; then lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some GNU ld's only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &5 echo "${ECHO_T}$LD" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi test -z "$LD" && { { echo "$as_me:$LINENO: error: no acceptable ld found in \$PATH" >&5 echo "$as_me: error: no acceptable ld found in \$PATH" >&2;} { (exit 1); exit 1; }; } echo "$as_me:$LINENO: checking if the linker ($LD) is GNU ld" >&5 echo $ECHO_N "checking if the linker ($LD) is GNU ld... $ECHO_C" >&6 if test "${lt_cv_prog_gnu_ld+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else # I'd rather use --version here, but apparently some GNU ld's only accept -v. case `$LD -v 2>&1 &5 echo "${ECHO_T}$lt_cv_prog_gnu_ld" >&6 with_gnu_ld=$lt_cv_prog_gnu_ld echo "$as_me:$LINENO: checking for $LD option to reload object files" >&5 echo $ECHO_N "checking for $LD option to reload object files... $ECHO_C" >&6 if test "${lt_cv_ld_reload_flag+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lt_cv_ld_reload_flag='-r' fi echo "$as_me:$LINENO: result: $lt_cv_ld_reload_flag" >&5 echo "${ECHO_T}$lt_cv_ld_reload_flag" >&6 reload_flag=$lt_cv_ld_reload_flag case $reload_flag in "" | " "*) ;; *) reload_flag=" $reload_flag" ;; esac reload_cmds='$LD$reload_flag -o $output$reload_objs' echo "$as_me:$LINENO: checking for BSD-compatible nm" >&5 echo $ECHO_N "checking for BSD-compatible nm... $ECHO_C" >&6 if test "${lt_cv_path_NM+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$NM"; then # Let the user override the test. lt_cv_path_NM="$NM" else lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH /usr/ccs/bin /usr/ucb /bin; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. tmp_nm="$ac_dir/${ac_tool_prefix}nm" if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then # Check to see if the nm accepts a BSD-compat flag. # Adding the `sed 1q' prevents false positives on HP-UX, which says: # nm: unknown option "B" ignored # Tru64's nm complains that /dev/null is an invalid object file case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in */dev/null* | *'Invalid file or object type'*) lt_cv_path_NM="$tmp_nm -B" break ;; *) case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in */dev/null*) lt_cv_path_NM="$tmp_nm -p" break ;; *) lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but continue # so that we can try to find one that supports BSD flags ;; esac esac fi done IFS="$lt_save_ifs" test -z "$lt_cv_path_NM" && lt_cv_path_NM=nm fi fi echo "$as_me:$LINENO: result: $lt_cv_path_NM" >&5 echo "${ECHO_T}$lt_cv_path_NM" >&6 NM="$lt_cv_path_NM" echo "$as_me:$LINENO: checking whether ln -s works" >&5 echo $ECHO_N "checking whether ln -s works... $ECHO_C" >&6 LN_S=$as_ln_s if test "$LN_S" = "ln -s"; then echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6 else echo "$as_me:$LINENO: result: no, using $LN_S" >&5 echo "${ECHO_T}no, using $LN_S" >&6 fi echo "$as_me:$LINENO: checking how to recognise dependent libraries" >&5 echo $ECHO_N "checking how to recognise dependent libraries... $ECHO_C" >&6 if test "${lt_cv_deplibs_check_method+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lt_cv_file_magic_cmd='$MAGIC_CMD' lt_cv_file_magic_test_file= lt_cv_deplibs_check_method='unknown' # Need to set the preceding variable on all platforms that support # interlibrary dependencies. # 'none' -- dependencies not supported. # `unknown' -- same as none, but documents that we really don't know. # 'pass_all' -- all dependencies passed with no checks. # 'test_compile' -- check by making test program. # 'file_magic [[regex]]' -- check by looking for files in library path # which responds to the $file_magic_cmd with a given extended regex. # If you have `file' or equivalent on your system and you're not sure # whether `pass_all' will *always* work, you probably want this one. case $host_os in aix4* | aix5*) lt_cv_deplibs_check_method=pass_all ;; beos*) lt_cv_deplibs_check_method=pass_all ;; bsdi4*) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)' lt_cv_file_magic_cmd='/usr/bin/file -L' lt_cv_file_magic_test_file=/shlib/libc.so ;; cygwin*) # func_win32_libid is a shell function defined in ltmain.sh lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' ;; mingw* | pw32*) # Base MSYS/MinGW do not provide the 'file' command needed by # func_win32_libid shell function, so use a weaker test based on 'objdump'. lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?' lt_cv_file_magic_cmd='$OBJDUMP -f' ;; darwin* | rhapsody*) lt_cv_deplibs_check_method=pass_all ;; freebsd* | kfreebsd*-gnu) if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then case $host_cpu in i*86 ) # Not sure whether the presence of OpenBSD here was a mistake. # Let's accept both of them until this is cleared up. lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD)/i[3-9]86 (compact )?demand paged shared library' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` ;; esac else lt_cv_deplibs_check_method=pass_all fi ;; gnu*) lt_cv_deplibs_check_method=pass_all ;; hpux10.20* | hpux11*) lt_cv_file_magic_cmd=/usr/bin/file case "$host_cpu" in ia64*) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64' lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so ;; hppa*64*) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - PA-RISC [0-9].[0-9]' lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl ;; *) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9].[0-9]) shared library' lt_cv_file_magic_test_file=/usr/lib/libc.sl ;; esac ;; irix5* | irix6* | nonstopux*) case $LD in *-32|*"-32 ") libmagic=32-bit;; *-n32|*"-n32 ") libmagic=N32;; *-64|*"-64 ") libmagic=64-bit;; *) libmagic=never-match;; esac lt_cv_deplibs_check_method=pass_all ;; # This must be Linux ELF. linux*) case $host_cpu in alpha*|hppa*|i*86|ia64*|m68*|mips*|powerpc*|sparc*|s390*|sh*|x86_64*) lt_cv_deplibs_check_method=pass_all ;; *) # glibc up to 2.1.1 does not perform some relocations on ARM # this will be overridden with pass_all, but let us keep it just in case lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' ;; esac lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` lt_cv_deplibs_check_method=pass_all ;; netbsd*) if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$' fi ;; newos6*) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=/usr/lib/libnls.so ;; nto-qnx*) lt_cv_deplibs_check_method=unknown ;; openbsd*) lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB shared object' else lt_cv_deplibs_check_method='file_magic OpenBSD.* shared library' fi ;; osf3* | osf4* | osf5*) lt_cv_deplibs_check_method=pass_all ;; sco3.2v5*) lt_cv_deplibs_check_method=pass_all ;; solaris*) lt_cv_deplibs_check_method=pass_all ;; sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) case $host_vendor in motorola) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]' lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` ;; ncr) lt_cv_deplibs_check_method=pass_all ;; sequent) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' ;; sni) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib" lt_cv_file_magic_test_file=/lib/libc.so ;; siemens) lt_cv_deplibs_check_method=pass_all ;; esac ;; sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[78]* | unixware7* | sysv4*uw2*) lt_cv_deplibs_check_method=pass_all ;; esac fi echo "$as_me:$LINENO: result: $lt_cv_deplibs_check_method" >&5 echo "${ECHO_T}$lt_cv_deplibs_check_method" >&6 file_magic_cmd=$lt_cv_file_magic_cmd deplibs_check_method=$lt_cv_deplibs_check_method test -z "$deplibs_check_method" && deplibs_check_method=unknown # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # Allow CC to be a program name with arguments. compiler=$CC # Check whether --enable-libtool-lock or --disable-libtool-lock was given. if test "${enable_libtool_lock+set}" = set; then enableval="$enable_libtool_lock" fi; test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes # Some flags need to be propagated to the compiler or linker for good # libtool support. case $host in ia64-*-hpux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then case `/usr/bin/file conftest.$ac_objext` in *ELF-32*) HPUX_IA64_MODE="32" ;; *ELF-64*) HPUX_IA64_MODE="64" ;; esac fi rm -rf conftest* ;; *-*-irix6*) # Find out which ABI we are using. echo '#line 3633 "configure"' > conftest.$ac_ext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then if test "$lt_cv_prog_gnu_ld" = yes; then case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -melf32bsmip" ;; *N32*) LD="${LD-ld} -melf32bmipn32" ;; *64-bit*) LD="${LD-ld} -melf64bmip" ;; esac else case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -32" ;; *N32*) LD="${LD-ld} -n32" ;; *64-bit*) LD="${LD-ld} -64" ;; esac fi fi rm -rf conftest* ;; x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*|s390*-*linux*|sparc*-*linux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then case "`/usr/bin/file conftest.o`" in *32-bit*) case $host in x86_64-*linux*) LD="${LD-ld} -m elf_i386" ;; ppc64-*linux*|powerpc64-*linux*) LD="${LD-ld} -m elf32ppclinux" ;; s390x-*linux*) LD="${LD-ld} -m elf_s390" ;; sparc64-*linux*) LD="${LD-ld} -m elf32_sparc" ;; esac ;; *64-bit*) case $host in x86_64-*linux*) LD="${LD-ld} -m elf_x86_64" ;; ppc*-*linux*|powerpc*-*linux*) LD="${LD-ld} -m elf64ppc" ;; s390*-*linux*) LD="${LD-ld} -m elf64_s390" ;; sparc*-*linux*) LD="${LD-ld} -m elf64_sparc" ;; esac ;; esac fi rm -rf conftest* ;; *-*-sco3.2v5*) # On SCO OpenServer 5, we need -belf to get full-featured binaries. SAVE_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -belf" echo "$as_me:$LINENO: checking whether the C compiler needs -belf" >&5 echo $ECHO_N "checking whether the C compiler needs -belf... $ECHO_C" >&6 if test "${lt_cv_cc_needs_belf+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then lt_cv_cc_needs_belf=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 lt_cv_cc_needs_belf=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu fi echo "$as_me:$LINENO: result: $lt_cv_cc_needs_belf" >&5 echo "${ECHO_T}$lt_cv_cc_needs_belf" >&6 if test x"$lt_cv_cc_needs_belf" != x"yes"; then # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf CFLAGS="$SAVE_CFLAGS" fi ;; esac need_locks="$enable_libtool_lock" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5 echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&6 # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if test "${ac_cv_prog_CPP+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then : else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Broken: fails on valid input. continue fi rm -f conftest.err conftest.$ac_ext # OK, works on sane cases. Now check whether non-existent headers # can be detected and how. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then # Broken: success on invalid input. continue else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.err conftest.$ac_ext if $ac_preproc_ok; then break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi echo "$as_me:$LINENO: result: $CPP" >&5 echo "${ECHO_T}$CPP" >&6 ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then : else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Broken: fails on valid input. continue fi rm -f conftest.err conftest.$ac_ext # OK, works on sane cases. Now check whether non-existent headers # can be detected and how. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then # Broken: success on invalid input. continue else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details." >&5 echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu echo "$as_me:$LINENO: checking for ANSI C header files" >&5 echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6 if test "${ac_cv_header_stdc+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_header_stdc=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_header_stdc=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) exit(2); exit (0); } _ACEOF rm -f conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='./conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then : else echo "$as_me: program exited with status $ac_status" >&5 echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ( exit $ac_status ) ac_cv_header_stdc=no fi rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi fi fi echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5 echo "${ECHO_T}$ac_cv_header_stdc" >&6 if test $ac_cv_header_stdc = yes; then cat >>confdefs.h <<\_ACEOF #define STDC_HEADERS 1 _ACEOF fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then eval "$as_ac_Header=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 eval "$as_ac_Header=no" fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 if test `eval echo '${'$as_ac_Header'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in dlfcn.h do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` if eval "test \"\${$as_ac_Header+set}\" = set"; then echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 else # Is the header compilable? echo "$as_me:$LINENO: checking $ac_header usability" >&5 echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_header_compiler=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_compiler=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 echo "${ECHO_T}$ac_header_compiler" >&6 # Is the header present? echo "$as_me:$LINENO: checking $ac_header presence" >&5 echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include <$ac_header> _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then ac_header_preproc=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_preproc=no fi rm -f conftest.err conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 echo "${ECHO_T}$ac_header_preproc" >&6 # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in yes:no: ) { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} ac_header_preproc=yes ;; no:yes:* ) { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} ( cat <<\_ASBOX ## ------------------------------------------ ## ## Report this to the AC_PACKAGE_NAME lists. ## ## ------------------------------------------ ## _ASBOX ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else eval "$as_ac_Header=\$ac_header_preproc" fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 fi if test `eval echo '${'$as_ac_Header'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done ac_ext=cc ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test -n "$ac_tool_prefix"; then for ac_prog in $CCC g++ c++ gpp aCC CC cxx cc++ cl FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_CXX+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$CXX"; then ac_cv_prog_CXX="$CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi CXX=$ac_cv_prog_CXX if test -n "$CXX"; then echo "$as_me:$LINENO: result: $CXX" >&5 echo "${ECHO_T}$CXX" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi test -n "$CXX" && break done fi if test -z "$CXX"; then ac_ct_CXX=$CXX for ac_prog in $CCC g++ c++ gpp aCC CC cxx cc++ cl FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_ac_ct_CXX+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$ac_ct_CXX"; then ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CXX="$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi ac_ct_CXX=$ac_cv_prog_ac_ct_CXX if test -n "$ac_ct_CXX"; then echo "$as_me:$LINENO: result: $ac_ct_CXX" >&5 echo "${ECHO_T}$ac_ct_CXX" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi test -n "$ac_ct_CXX" && break done test -n "$ac_ct_CXX" || ac_ct_CXX="g++" CXX=$ac_ct_CXX fi # Provide some information about the compiler. echo "$as_me:$LINENO:" \ "checking for C++ compiler version" >&5 ac_compiler=`set X $ac_compile; echo $2` { (eval echo "$as_me:$LINENO: \"$ac_compiler --version &5\"") >&5 (eval $ac_compiler --version &5) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { (eval echo "$as_me:$LINENO: \"$ac_compiler -v &5\"") >&5 (eval $ac_compiler -v &5) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { (eval echo "$as_me:$LINENO: \"$ac_compiler -V &5\"") >&5 (eval $ac_compiler -V &5) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } echo "$as_me:$LINENO: checking whether we are using the GNU C++ compiler" >&5 echo $ECHO_N "checking whether we are using the GNU C++ compiler... $ECHO_C" >&6 if test "${ac_cv_cxx_compiler_gnu+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_compiler_gnu=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_compiler_gnu=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_cxx_compiler_gnu=$ac_compiler_gnu fi echo "$as_me:$LINENO: result: $ac_cv_cxx_compiler_gnu" >&5 echo "${ECHO_T}$ac_cv_cxx_compiler_gnu" >&6 GXX=`test $ac_compiler_gnu = yes && echo yes` ac_test_CXXFLAGS=${CXXFLAGS+set} ac_save_CXXFLAGS=$CXXFLAGS CXXFLAGS="-g" echo "$as_me:$LINENO: checking whether $CXX accepts -g" >&5 echo $ECHO_N "checking whether $CXX accepts -g... $ECHO_C" >&6 if test "${ac_cv_prog_cxx_g+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_prog_cxx_g=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_prog_cxx_g=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_prog_cxx_g" >&5 echo "${ECHO_T}$ac_cv_prog_cxx_g" >&6 if test "$ac_test_CXXFLAGS" = set; then CXXFLAGS=$ac_save_CXXFLAGS elif test $ac_cv_prog_cxx_g = yes; then if test "$GXX" = yes; then CXXFLAGS="-g -O2" else CXXFLAGS="-g" fi else if test "$GXX" = yes; then CXXFLAGS="-O2" else CXXFLAGS= fi fi for ac_declaration in \ '' \ 'extern "C" void std::exit (int) throw (); using std::exit;' \ 'extern "C" void std::exit (int); using std::exit;' \ 'extern "C" void exit (int) throw ();' \ 'extern "C" void exit (int);' \ 'void exit (int);' do cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_declaration #include int main () { exit (42); ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then : else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 continue fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_declaration int main () { exit (42); ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then break else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext done rm -f conftest* if test -n "$ac_declaration"; then echo '#ifdef __cplusplus' >>confdefs.h echo $ac_declaration >>confdefs.h echo '#endif' >>confdefs.h fi ac_ext=cc ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu depcc="$CXX" am_compiler_list= echo "$as_me:$LINENO: checking dependency style of $depcc" >&5 echo $ECHO_N "checking dependency style of $depcc... $ECHO_C" >&6 if test "${am_cv_CXX_dependencies_compiler_type+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named `D' -- because `-MD' means `put the output # in D'. mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CXX_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with # Solaris 8's {/usr,}/bin/sh. touch sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf case $depmode in nosideeffect) # after this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; none) break ;; esac # We check with `-c' and `-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle `-M -o', and we need to detect this. if depmode=$depmode \ source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # (even with -Werror). So we grep stderr for any message # that says an option was ignored. if grep 'ignoring option' conftest.err >/dev/null 2>&1; then :; else am_cv_CXX_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CXX_dependencies_compiler_type=none fi fi echo "$as_me:$LINENO: result: $am_cv_CXX_dependencies_compiler_type" >&5 echo "${ECHO_T}$am_cv_CXX_dependencies_compiler_type" >&6 CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then am__fastdepCXX_TRUE= am__fastdepCXX_FALSE='#' else am__fastdepCXX_TRUE='#' am__fastdepCXX_FALSE= fi ac_ext=cc ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu echo "$as_me:$LINENO: checking how to run the C++ preprocessor" >&5 echo $ECHO_N "checking how to run the C++ preprocessor... $ECHO_C" >&6 if test -z "$CXXCPP"; then if test "${ac_cv_prog_CXXCPP+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else # Double quotes because CXXCPP needs to be expanded for CXXCPP in "$CXX -E" "/lib/cpp" do ac_preproc_ok=false for ac_cxx_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_cxx_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then : else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Broken: fails on valid input. continue fi rm -f conftest.err conftest.$ac_ext # OK, works on sane cases. Now check whether non-existent headers # can be detected and how. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_cxx_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then # Broken: success on invalid input. continue else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.err conftest.$ac_ext if $ac_preproc_ok; then break fi done ac_cv_prog_CXXCPP=$CXXCPP fi CXXCPP=$ac_cv_prog_CXXCPP else ac_cv_prog_CXXCPP=$CXXCPP fi echo "$as_me:$LINENO: result: $CXXCPP" >&5 echo "${ECHO_T}$CXXCPP" >&6 ac_preproc_ok=false for ac_cxx_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_cxx_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then : else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Broken: fails on valid input. continue fi rm -f conftest.err conftest.$ac_ext # OK, works on sane cases. Now check whether non-existent headers # can be detected and how. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_cxx_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then # Broken: success on invalid input. continue else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { echo "$as_me:$LINENO: error: C++ preprocessor \"$CXXCPP\" fails sanity check See \`config.log' for more details." >&5 echo "$as_me: error: C++ preprocessor \"$CXXCPP\" fails sanity check See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } fi ac_ext=cc ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu ac_ext=f ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5' ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_f77_compiler_gnu if test -n "$ac_tool_prefix"; then for ac_prog in g77 f77 xlf frt pgf77 fort77 fl32 af77 f90 xlf90 pgf90 epcf90 f95 fort xlf95 ifc efc pgf95 lf95 gfortran do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_F77+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$F77"; then ac_cv_prog_F77="$F77" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_F77="$ac_tool_prefix$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi F77=$ac_cv_prog_F77 if test -n "$F77"; then echo "$as_me:$LINENO: result: $F77" >&5 echo "${ECHO_T}$F77" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi test -n "$F77" && break done fi if test -z "$F77"; then ac_ct_F77=$F77 for ac_prog in g77 f77 xlf frt pgf77 fort77 fl32 af77 f90 xlf90 pgf90 epcf90 f95 fort xlf95 ifc efc pgf95 lf95 gfortran do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_ac_ct_F77+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$ac_ct_F77"; then ac_cv_prog_ac_ct_F77="$ac_ct_F77" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_F77="$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi ac_ct_F77=$ac_cv_prog_ac_ct_F77 if test -n "$ac_ct_F77"; then echo "$as_me:$LINENO: result: $ac_ct_F77" >&5 echo "${ECHO_T}$ac_ct_F77" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi test -n "$ac_ct_F77" && break done F77=$ac_ct_F77 fi # Provide some information about the compiler. echo "$as_me:5200:" \ "checking for Fortran 77 compiler version" >&5 ac_compiler=`set X $ac_compile; echo $2` { (eval echo "$as_me:$LINENO: \"$ac_compiler --version &5\"") >&5 (eval $ac_compiler --version &5) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { (eval echo "$as_me:$LINENO: \"$ac_compiler -v &5\"") >&5 (eval $ac_compiler -v &5) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { (eval echo "$as_me:$LINENO: \"$ac_compiler -V &5\"") >&5 (eval $ac_compiler -V &5) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } rm -f a.out # If we don't use `.F' as extension, the preprocessor is not run on the # input file. (Note that this only needs to work for GNU compilers.) ac_save_ext=$ac_ext ac_ext=F echo "$as_me:$LINENO: checking whether we are using the GNU Fortran 77 compiler" >&5 echo $ECHO_N "checking whether we are using the GNU Fortran 77 compiler... $ECHO_C" >&6 if test "${ac_cv_f77_compiler_gnu+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF program main #ifndef __GNUC__ choke me #endif end _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_f77_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_compiler_gnu=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_compiler_gnu=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_f77_compiler_gnu=$ac_compiler_gnu fi echo "$as_me:$LINENO: result: $ac_cv_f77_compiler_gnu" >&5 echo "${ECHO_T}$ac_cv_f77_compiler_gnu" >&6 ac_ext=$ac_save_ext ac_test_FFLAGS=${FFLAGS+set} ac_save_FFLAGS=$FFLAGS FFLAGS= echo "$as_me:$LINENO: checking whether $F77 accepts -g" >&5 echo $ECHO_N "checking whether $F77 accepts -g... $ECHO_C" >&6 if test "${ac_cv_prog_f77_g+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else FFLAGS=-g cat >conftest.$ac_ext <<_ACEOF program main end _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_f77_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_prog_f77_g=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_prog_f77_g=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_prog_f77_g" >&5 echo "${ECHO_T}$ac_cv_prog_f77_g" >&6 if test "$ac_test_FFLAGS" = set; then FFLAGS=$ac_save_FFLAGS elif test $ac_cv_prog_f77_g = yes; then if test "x$ac_cv_f77_compiler_gnu" = xyes; then FFLAGS="-g -O2" else FFLAGS="-g" fi else if test "x$ac_cv_f77_compiler_gnu" = xyes; then FFLAGS="-O2" else FFLAGS= fi fi G77=`test $ac_compiler_gnu = yes && echo yes` ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu # Autoconf 2.13's AC_OBJEXT and AC_EXEEXT macros only works for C compilers! # find the maximum length of command line arguments echo "$as_me:$LINENO: checking the maximum length of command line arguments" >&5 echo $ECHO_N "checking the maximum length of command line arguments... $ECHO_C" >&6 if test "${lt_cv_sys_max_cmd_len+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else i=0 teststring="ABCD" case $build_os in msdosdjgpp*) # On DJGPP, this test can blow up pretty badly due to problems in libc # (any single argument exceeding 2000 bytes causes a buffer overrun # during glob expansion). Even if it were fixed, the result of this # check would be larger than it should be. lt_cv_sys_max_cmd_len=12288; # 12K is about right ;; gnu*) # Under GNU Hurd, this test is not required because there is # no limit to the length of command line arguments. # Libtool will interpret -1 as no limit whatsoever lt_cv_sys_max_cmd_len=-1; ;; cygwin* | mingw*) # On Win9x/ME, this test blows up -- it succeeds, but takes # about 5 minutes as the teststring grows exponentially. # Worse, since 9x/ME are not pre-emptively multitasking, # you end up with a "frozen" computer, even though with patience # the test eventually succeeds (with a max line length of 256k). # Instead, let's just punt: use the minimum linelength reported by # all of the supported platforms: 8192 (on NT/2K/XP). lt_cv_sys_max_cmd_len=8192; ;; amigaos*) # On AmigaOS with pdksh, this test takes hours, literally. # So we just punt and use a minimum line length of 8192. lt_cv_sys_max_cmd_len=8192; ;; *) # If test is not a shell built-in, we'll probably end up computing a # maximum length that is only half of the actual maximum length, but # we can't tell. while (test "X"`$CONFIG_SHELL $0 --fallback-echo "X$teststring" 2>/dev/null` \ = "XX$teststring") >/dev/null 2>&1 && new_result=`expr "X$teststring" : ".*" 2>&1` && lt_cv_sys_max_cmd_len=$new_result && test $i != 17 # 1/2 MB should be enough do i=`expr $i + 1` teststring=$teststring$teststring done teststring= # Add a significant safety factor because C++ compilers can tack on massive # amounts of additional arguments before passing them to the linker. # It appears as though 1/2 is a usable value. lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` ;; esac fi if test -n $lt_cv_sys_max_cmd_len ; then echo "$as_me:$LINENO: result: $lt_cv_sys_max_cmd_len" >&5 echo "${ECHO_T}$lt_cv_sys_max_cmd_len" >&6 else echo "$as_me:$LINENO: result: none" >&5 echo "${ECHO_T}none" >&6 fi # Check for command to grab the raw symbol name followed by C symbol from nm. echo "$as_me:$LINENO: checking command to parse $NM output from $compiler object" >&5 echo $ECHO_N "checking command to parse $NM output from $compiler object... $ECHO_C" >&6 if test "${lt_cv_sys_global_symbol_pipe+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else # These are sane defaults that work on at least a few old systems. # [They come from Ultrix. What could be older than Ultrix?!! ;)] # Character class describing NM global symbol codes. symcode='[BCDEGRST]' # Regexp to match symbols that can be accessed directly from C. sympat='\([_A-Za-z][_A-Za-z0-9]*\)' # Transform the above into a raw symbol and a C symbol. symxfrm='\1 \2\3 \3' # Transform an extracted symbol line into a proper C declaration lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^. .* \(.*\)$/extern int \1;/p'" # Transform an extracted symbol line into symbol name and symbol address lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode \([^ ]*\) \([^ ]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" # Define system-specific variables. case $host_os in aix*) symcode='[BCDT]' ;; cygwin* | mingw* | pw32*) symcode='[ABCDGISTW]' ;; hpux*) # Its linker distinguishes data from code symbols if test "$host_cpu" = ia64; then symcode='[ABCDEGRST]' fi lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" ;; irix* | nonstopux*) symcode='[BCDEGRST]' ;; osf*) symcode='[BCDEGQRST]' ;; solaris* | sysv5*) symcode='[BDRT]' ;; sysv4) symcode='[DFNSTU]' ;; esac # Handle CRLF in mingw tool chain opt_cr= case $build_os in mingw*) opt_cr=`echo 'x\{0,1\}' | tr x '\015'` # option cr in regexp ;; esac # If we're using GNU nm, then use its standard symbol codes. case `$NM -V 2>&1` in *GNU* | *'with BFD'*) symcode='[ABCDGIRSTW]' ;; esac # Try without a prefix undercore, then with it. for ac_symprfx in "" "_"; do # Write the raw and C identifiers. lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*\($ac_symprfx\)$sympat$opt_cr$/$symxfrm/p'" # Check to see that the pipe works correctly. pipe_works=no rm -f conftest* cat > conftest.$ac_ext <&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then # Now try to grab the symbols. nlist=conftest.nm if { (eval echo "$as_me:$LINENO: \"$NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist\"") >&5 (eval $NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && test -s "$nlist"; then # Try sorting and uniquifying the output. if sort "$nlist" | uniq > "$nlist"T; then mv -f "$nlist"T "$nlist" else rm -f "$nlist"T fi # Make sure that we snagged all the symbols we need. if grep ' nm_test_var$' "$nlist" >/dev/null; then if grep ' nm_test_func$' "$nlist" >/dev/null; then cat < conftest.$ac_ext #ifdef __cplusplus extern "C" { #endif EOF # Now generate the symbol file. eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | grep -v main >> conftest.$ac_ext' cat <> conftest.$ac_ext #if defined (__STDC__) && __STDC__ # define lt_ptr_t void * #else # define lt_ptr_t char * # define const #endif /* The mapping between symbol names and symbols. */ const struct { const char *name; lt_ptr_t address; } lt_preloaded_symbols[] = { EOF $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (lt_ptr_t) \&\2},/" < "$nlist" | grep -v main >> conftest.$ac_ext cat <<\EOF >> conftest.$ac_ext {0, (lt_ptr_t) 0} }; #ifdef __cplusplus } #endif EOF # Now try linking the two files. mv conftest.$ac_objext conftstm.$ac_objext lt_save_LIBS="$LIBS" lt_save_CFLAGS="$CFLAGS" LIBS="conftstm.$ac_objext" CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag" if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && test -s conftest${ac_exeext}; then pipe_works=yes fi LIBS="$lt_save_LIBS" CFLAGS="$lt_save_CFLAGS" else echo "cannot find nm_test_func in $nlist" >&5 fi else echo "cannot find nm_test_var in $nlist" >&5 fi else echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5 fi else echo "$progname: failed program was:" >&5 cat conftest.$ac_ext >&5 fi rm -f conftest* conftst* # Do not use the global_symbol_pipe unless it works. if test "$pipe_works" = yes; then break else lt_cv_sys_global_symbol_pipe= fi done fi if test -z "$lt_cv_sys_global_symbol_pipe"; then lt_cv_sys_global_symbol_to_cdecl= fi if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then echo "$as_me:$LINENO: result: failed" >&5 echo "${ECHO_T}failed" >&6 else echo "$as_me:$LINENO: result: ok" >&5 echo "${ECHO_T}ok" >&6 fi echo "$as_me:$LINENO: checking for objdir" >&5 echo $ECHO_N "checking for objdir... $ECHO_C" >&6 if test "${lt_cv_objdir+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else rm -f .libs 2>/dev/null mkdir .libs 2>/dev/null if test -d .libs; then lt_cv_objdir=.libs else # MS-DOS does not allow filenames that begin with a dot. lt_cv_objdir=_libs fi rmdir .libs 2>/dev/null fi echo "$as_me:$LINENO: result: $lt_cv_objdir" >&5 echo "${ECHO_T}$lt_cv_objdir" >&6 objdir=$lt_cv_objdir case $host_os in aix3*) # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi ;; esac # Sed substitution that helps us do robust quoting. It backslashifies # metacharacters that are still active within double-quoted strings. Xsed='sed -e s/^X//' sed_quote_subst='s/\([\\"\\`$\\\\]\)/\\\1/g' # Same as above, but do not quote variable references. double_quote_subst='s/\([\\"\\`\\\\]\)/\\\1/g' # Sed substitution to delay expansion of an escaped shell variable in a # double_quote_subst'ed string. delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' # Sed substitution to avoid accidental globbing in evaled expressions no_glob_subst='s/\*/\\\*/g' # Constants: rm="rm -f" # Global variables: default_ofile=libtool can_build_shared=yes # All known linkers require a `.a' archive for static linking (except M$VC, # which needs '.lib'). libext=a ltmain="$ac_aux_dir/ltmain.sh" ofile="$default_ofile" with_gnu_ld="$lt_cv_prog_gnu_ld" if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args. set dummy ${ac_tool_prefix}ar; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_AR+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$AR"; then ac_cv_prog_AR="$AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AR="${ac_tool_prefix}ar" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi AR=$ac_cv_prog_AR if test -n "$AR"; then echo "$as_me:$LINENO: result: $AR" >&5 echo "${ECHO_T}$AR" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi fi if test -z "$ac_cv_prog_AR"; then ac_ct_AR=$AR # Extract the first word of "ar", so it can be a program name with args. set dummy ar; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_ac_ct_AR+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$ac_ct_AR"; then ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_AR="ar" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done test -z "$ac_cv_prog_ac_ct_AR" && ac_cv_prog_ac_ct_AR="false" fi fi ac_ct_AR=$ac_cv_prog_ac_ct_AR if test -n "$ac_ct_AR"; then echo "$as_me:$LINENO: result: $ac_ct_AR" >&5 echo "${ECHO_T}$ac_ct_AR" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi AR=$ac_ct_AR else AR="$ac_cv_prog_AR" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_RANLIB+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then echo "$as_me:$LINENO: result: $RANLIB" >&5 echo "${ECHO_T}$RANLIB" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi fi if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_RANLIB="ranlib" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done test -z "$ac_cv_prog_ac_ct_RANLIB" && ac_cv_prog_ac_ct_RANLIB=":" fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then echo "$as_me:$LINENO: result: $ac_ct_RANLIB" >&5 echo "${ECHO_T}$ac_ct_RANLIB" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi RANLIB=$ac_ct_RANLIB else RANLIB="$ac_cv_prog_RANLIB" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_STRIP+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then echo "$as_me:$LINENO: result: $STRIP" >&5 echo "${ECHO_T}$STRIP" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done test -z "$ac_cv_prog_ac_ct_STRIP" && ac_cv_prog_ac_ct_STRIP=":" fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5 echo "${ECHO_T}$ac_ct_STRIP" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi STRIP=$ac_ct_STRIP else STRIP="$ac_cv_prog_STRIP" fi old_CC="$CC" old_CFLAGS="$CFLAGS" # Set sane defaults for various variables test -z "$AR" && AR=ar test -z "$AR_FLAGS" && AR_FLAGS=cru test -z "$AS" && AS=as test -z "$CC" && CC=cc test -z "$LTCC" && LTCC=$CC test -z "$DLLTOOL" && DLLTOOL=dlltool test -z "$LD" && LD=ld test -z "$LN_S" && LN_S="ln -s" test -z "$MAGIC_CMD" && MAGIC_CMD=file test -z "$NM" && NM=nm test -z "$SED" && SED=sed test -z "$OBJDUMP" && OBJDUMP=objdump test -z "$RANLIB" && RANLIB=: test -z "$STRIP" && STRIP=: test -z "$ac_objext" && ac_objext=o # Determine commands to create old-style static archives. old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs$old_deplibs' old_postinstall_cmds='chmod 644 $oldlib' old_postuninstall_cmds= if test -n "$RANLIB"; then case $host_os in openbsd*) old_postinstall_cmds="\$RANLIB -t \$oldlib~$old_postinstall_cmds" ;; *) old_postinstall_cmds="\$RANLIB \$oldlib~$old_postinstall_cmds" ;; esac old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib" fi # Only perform the check for file, if the check method requires it case $deplibs_check_method in file_magic*) if test "$file_magic_cmd" = '$MAGIC_CMD'; then echo "$as_me:$LINENO: checking for ${ac_tool_prefix}file" >&5 echo $ECHO_N "checking for ${ac_tool_prefix}file... $ECHO_C" >&6 if test "${lt_cv_path_MAGIC_CMD+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else case $MAGIC_CMD in [\\/*] | ?:[\\/]*) lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD="$MAGIC_CMD" lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" for ac_dir in $ac_dummy; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/${ac_tool_prefix}file; then lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex="`expr \"$deplibs_check_method\" : \"file_magic \(.*\)\"`" MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org EOF fi ;; esac fi break fi done IFS="$lt_save_ifs" MAGIC_CMD="$lt_save_MAGIC_CMD" ;; esac fi MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if test -n "$MAGIC_CMD"; then echo "$as_me:$LINENO: result: $MAGIC_CMD" >&5 echo "${ECHO_T}$MAGIC_CMD" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi if test -z "$lt_cv_path_MAGIC_CMD"; then if test -n "$ac_tool_prefix"; then echo "$as_me:$LINENO: checking for file" >&5 echo $ECHO_N "checking for file... $ECHO_C" >&6 if test "${lt_cv_path_MAGIC_CMD+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else case $MAGIC_CMD in [\\/*] | ?:[\\/]*) lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD="$MAGIC_CMD" lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" for ac_dir in $ac_dummy; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/file; then lt_cv_path_MAGIC_CMD="$ac_dir/file" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex="`expr \"$deplibs_check_method\" : \"file_magic \(.*\)\"`" MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org EOF fi ;; esac fi break fi done IFS="$lt_save_ifs" MAGIC_CMD="$lt_save_MAGIC_CMD" ;; esac fi MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if test -n "$MAGIC_CMD"; then echo "$as_me:$LINENO: result: $MAGIC_CMD" >&5 echo "${ECHO_T}$MAGIC_CMD" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi else MAGIC_CMD=: fi fi fi ;; esac enable_dlopen=no enable_win32_dll=no # Check whether --enable-libtool-lock or --disable-libtool-lock was given. if test "${enable_libtool_lock+set}" = set; then enableval="$enable_libtool_lock" fi; test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes # Check whether --with-pic or --without-pic was given. if test "${with_pic+set}" = set; then withval="$with_pic" pic_mode="$withval" else pic_mode=default fi; test -z "$pic_mode" && pic_mode=default # Use C for the default configuration in the libtool script tagname= lt_save_CC="$CC" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu # Source file extension for C test sources. ac_ext=c # Object file extension for compiled C test sources. objext=o objext=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;\n" # Code to be used in simple link tests lt_simple_link_test_code='int main(){return(0);}\n' # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # Allow CC to be a program name with arguments. compiler=$CC # # Check for any special shared library compilation flags. # lt_prog_cc_shlib= if test "$GCC" = no; then case $host_os in sco3.2v5*) lt_prog_cc_shlib='-belf' ;; esac fi if test -n "$lt_prog_cc_shlib"; then { echo "$as_me:$LINENO: WARNING: \`$CC' requires \`$lt_prog_cc_shlib' to build shared libraries" >&5 echo "$as_me: WARNING: \`$CC' requires \`$lt_prog_cc_shlib' to build shared libraries" >&2;} if echo "$old_CC $old_CFLAGS " | grep "[ ]$lt_prog_cc_shlib[ ]" >/dev/null; then : else { echo "$as_me:$LINENO: WARNING: add \`$lt_prog_cc_shlib' to the CC or CFLAGS env variable and reconfigure" >&5 echo "$as_me: WARNING: add \`$lt_prog_cc_shlib' to the CC or CFLAGS env variable and reconfigure" >&2;} lt_cv_prog_cc_can_build_shared=no fi fi # # Check to make sure the static flag actually works. # echo "$as_me:$LINENO: checking if $compiler static flag $lt_prog_compiler_static works" >&5 echo $ECHO_N "checking if $compiler static flag $lt_prog_compiler_static works... $ECHO_C" >&6 if test "${lt_prog_compiler_static_works+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lt_prog_compiler_static_works=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $lt_prog_compiler_static" printf "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 else lt_prog_compiler_static_works=yes fi fi $rm conftest* LDFLAGS="$save_LDFLAGS" fi echo "$as_me:$LINENO: result: $lt_prog_compiler_static_works" >&5 echo "${ECHO_T}$lt_prog_compiler_static_works" >&6 if test x"$lt_prog_compiler_static_works" = xyes; then : else lt_prog_compiler_static= fi lt_prog_compiler_no_builtin_flag= if test "$GCC" = yes; then lt_prog_compiler_no_builtin_flag=' -fno-builtin' echo "$as_me:$LINENO: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 echo $ECHO_N "checking if $compiler supports -fno-rtti -fno-exceptions... $ECHO_C" >&6 if test "${lt_cv_prog_compiler_rtti_exceptions+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lt_cv_prog_compiler_rtti_exceptions=no ac_outfile=conftest.$ac_objext printf "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-fno-rtti -fno-exceptions" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:6234: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:6238: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings if test ! -s conftest.err; then lt_cv_prog_compiler_rtti_exceptions=yes fi fi $rm conftest* fi echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 echo "${ECHO_T}$lt_cv_prog_compiler_rtti_exceptions" >&6 if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions" else : fi fi lt_prog_compiler_wl= lt_prog_compiler_pic= lt_prog_compiler_static= echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5 echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6 if test "$GCC" = yes; then lt_prog_compiler_wl='-Wl,' lt_prog_compiler_static='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static='-Bstatic' fi ;; amigaos*) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4' ;; beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | pw32* | os2*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). lt_prog_compiler_pic='-DDLL_EXPORT' ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic='-fno-common' ;; msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. lt_prog_compiler_can_build_shared=no enable_shared=no ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic=-Kconform_pic fi ;; hpux*) # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case "$host_cpu" in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic='-fPIC' ;; esac ;; *) lt_prog_compiler_pic='-fPIC' ;; esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in aix*) lt_prog_compiler_wl='-Wl,' if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static='-Bstatic' else lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp' fi ;; mingw* | pw32* | os2*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). lt_prog_compiler_pic='-DDLL_EXPORT' ;; hpux9* | hpux10* | hpux11*) lt_prog_compiler_wl='-Wl,' # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case "$host_cpu" in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic='+Z' ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? lt_prog_compiler_static='${wl}-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) lt_prog_compiler_wl='-Wl,' # PIC (with -KPIC) is the default. lt_prog_compiler_static='-non_shared' ;; newsos6) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; linux*) case $CC in icc* | ecc*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-static' ;; ccc*) lt_prog_compiler_wl='-Wl,' # All Alpha code is PIC. lt_prog_compiler_static='-non_shared' ;; esac ;; osf3* | osf4* | osf5*) lt_prog_compiler_wl='-Wl,' # All OSF/1 code is PIC. lt_prog_compiler_static='-non_shared' ;; sco3.2v5*) lt_prog_compiler_pic='-Kpic' lt_prog_compiler_static='-dn' ;; solaris*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; sunos4*) lt_prog_compiler_wl='-Qoption ld ' lt_prog_compiler_pic='-PIC' lt_prog_compiler_static='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec ;then lt_prog_compiler_pic='-Kconform_pic' lt_prog_compiler_static='-Bstatic' fi ;; uts4*) lt_prog_compiler_pic='-pic' lt_prog_compiler_static='-Bstatic' ;; *) lt_prog_compiler_can_build_shared=no ;; esac fi echo "$as_me:$LINENO: result: $lt_prog_compiler_pic" >&5 echo "${ECHO_T}$lt_prog_compiler_pic" >&6 # # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic"; then echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic works... $ECHO_C" >&6 if test "${lt_prog_compiler_pic_works+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lt_prog_compiler_pic_works=no ac_outfile=conftest.$ac_objext printf "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$lt_prog_compiler_pic -DPIC" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:6467: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:6471: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings if test ! -s conftest.err; then lt_prog_compiler_pic_works=yes fi fi $rm conftest* fi echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_works" >&5 echo "${ECHO_T}$lt_prog_compiler_pic_works" >&6 if test x"$lt_prog_compiler_pic_works" = xyes; then case $lt_prog_compiler_pic in "" | " "*) ;; *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;; esac else lt_prog_compiler_pic= lt_prog_compiler_can_build_shared=no fi fi case "$host_os" in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) lt_prog_compiler_pic= ;; *) lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC" ;; esac echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5 echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6 if test "${lt_cv_prog_compiler_c_o+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lt_cv_prog_compiler_c_o=no $rm -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out printf "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:6527: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:6531: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings if test ! -s out/conftest.err; then lt_cv_prog_compiler_c_o=yes fi fi chmod u+w . $rm conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files $rm out/* && rmdir out cd .. rmdir conftest $rm conftest* fi echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o" >&5 echo "${ECHO_T}$lt_cv_prog_compiler_c_o" >&6 hard_links="nottested" if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user echo "$as_me:$LINENO: checking if we can lock with hard links" >&5 echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&6 hard_links=yes $rm conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no echo "$as_me:$LINENO: result: $hard_links" >&5 echo "${ECHO_T}$hard_links" >&6 if test "$hard_links" = no; then { echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} need_locks=warn fi else need_locks=no fi echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6 runpath_var= allow_undefined_flag= enable_shared_with_static_runtimes=no archive_cmds= archive_expsym_cmds= old_archive_From_new_cmds= old_archive_from_expsyms_cmds= export_dynamic_flag_spec= whole_archive_flag_spec= thread_safe_flag_spec= hardcode_libdir_flag_spec= hardcode_libdir_flag_spec_ld= hardcode_libdir_separator= hardcode_direct=no hardcode_minus_L=no hardcode_shlibpath_var=unsupported link_all_deplibs=unknown hardcode_automatic=no module_cmds= module_expsym_cmds= always_export_symbols=no export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' # include_expsyms should be a list of space-separated symbols to be *always* # included in the symbol list include_expsyms= # exclude_expsyms can be an extended regexp of symbols to exclude # it will be wrapped by ` (' and `)$', so one must not match beginning or # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', # as well as any symbol that contains `d'. exclude_expsyms="_GLOBAL_OFFSET_TABLE_" # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out # platforms (ab)use it in PIC code, but their linkers get confused if # the symbol is explicitly referenced. Since portable code cannot # rely on this symbol name, it's probably fine to never include it in # preloaded symbol tables. extract_expsyms_cmds= case $host_os in cygwin* | mingw* | pw32*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test "$GCC" != yes; then with_gnu_ld=no fi ;; openbsd*) with_gnu_ld=no ;; esac ld_shlibs=yes if test "$with_gnu_ld" = yes; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='${wl}' # See if GNU ld supports shared libraries. case $host_os in aix3* | aix4* | aix5*) # On AIX/PPC, the GNU linker is very broken if test "$host_cpu" != ia64; then ld_shlibs=no cat <&2 *** Warning: the GNU linker, at least up to release 2.9.1, is reported *** to be unable to reliably create shared libraries on AIX. *** Therefore, libtool is disabling shared libraries support. If you *** really care for shared libraries, you may want to modify your PATH *** so that a non-GNU linker is found, and then restart. EOF fi ;; amigaos*) archive_cmds='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes # Samuel A. Falvo II reports # that the semantics of dynamic libraries on AmigaOS, at least up # to version 4, is to share data among multiple programs linked # with the same dynamic library. Since this doesn't match the # behavior of shared libraries on other platforms, we can't use # them. ld_shlibs=no ;; beos*) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then allow_undefined_flag=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else ld_shlibs=no fi ;; cygwin* | mingw* | pw32*) # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless, # as there is no search path for DLLs. hardcode_libdir_flag_spec='-L$libdir' allow_undefined_flag=unsupported always_export_symbols=no enable_shared_with_static_runtimes=yes export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGS] /s/.* \([^ ]*\)/\1 DATA/'\'' | $SED -e '\''/^[AITW] /s/.* //'\'' | sort | uniq > $export_symbols' if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' else ld_shlibs=no fi ;; netbsd*) if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' fi ;; solaris* | sysv5*) if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then ld_shlibs=no cat <&2 *** Warning: The releases 2.8.* of the GNU linker cannot reliably *** create shared libraries on Solaris systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.9.1 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. EOF elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; sunos4*) archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= hardcode_direct=yes hardcode_shlibpath_var=no ;; linux*) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then tmp_archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_cmds="$tmp_archive_cmds" supports_anon_versioning=no case `$LD -v 2>/dev/null` in *\ 01.* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... *\ 2.11.*) ;; # other 2.11 versions *) supports_anon_versioning=yes ;; esac if test $supports_anon_versioning = yes; then archive_expsym_cmds='$echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ $echo "local: *; };" >> $output_objdir/$libname.ver~ $CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' else archive_expsym_cmds="$tmp_archive_cmds" fi else ld_shlibs=no fi ;; *) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; esac if test "$ld_shlibs" = yes; then runpath_var=LD_RUN_PATH hardcode_libdir_flag_spec='${wl}--rpath ${wl}$libdir' export_dynamic_flag_spec='${wl}--export-dynamic' # ancient GNU ld didn't support --whole-archive et. al. if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else whole_archive_flag_spec= fi fi else # PORTME fill in a description of your system's linker (not GNU ld) case $host_os in aix3*) allow_undefined_flag=unsupported always_export_symbols=yes archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. hardcode_minus_L=yes if test "$GCC" = yes && test -z "$link_static_flag"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. hardcode_direct=unsupported fi ;; aix4* | aix5*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm if $NM -V 2>&1 | grep 'GNU' > /dev/null; then export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' else export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' fi aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[23]|aix4.[23].*|aix5*) for ld_flag in $LDFLAGS; do if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then aix_use_runtimelinking=yes break fi done esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. archive_cmds='' hardcode_direct=yes hardcode_libdir_separator=':' link_all_deplibs=yes if test "$GCC" = yes; then case $host_os in aix4.012|aix4.012.*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && \ strings "$collect2name" | grep resolve_lib_name >/dev/null then # We have reworked collect2 hardcode_direct=yes else # We have old collect2 hardcode_direct=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking hardcode_minus_L=yes hardcode_libdir_flag_spec='-L$libdir' hardcode_libdir_separator= fi esac shared_flag='-shared' else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. always_export_symbols=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. allow_undefined_flag='-berok' # Determine the default libpath from the value encoded in an empty executable. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'` # Check for a 64-bit object if we didn't find anything. if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'`; fi else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" archive_expsym_cmds="\$CC"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' allow_undefined_flag="-z nodefs" archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an empty executable. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'` # Check for a 64-bit object if we didn't find anything. if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'`; fi else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. no_undefined_flag=' ${wl}-bernotok' allow_undefined_flag=' ${wl}-berok' # -bexpall does not export symbols beginning with underscore (_) always_export_symbols=yes # Exported symbols can be pulled into shared objects from archives whole_archive_flag_spec=' ' archive_cmds_need_lc=yes # This is similar to how AIX traditionally builds it's shared libraries. archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}-bE:$export_symbols ${wl}-bnoentry${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; amigaos*) archive_cmds='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes # see comment about different semantics on the GNU ld section ld_shlibs=no ;; bsdi4*) export_dynamic_flag_spec=-rdynamic ;; cygwin* | mingw* | pw32*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. hardcode_libdir_flag_spec=' ' allow_undefined_flag=unsupported # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. archive_cmds='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames=' # The linker will automatically build a .lib file if we build a DLL. old_archive_From_new_cmds='true' # FIXME: Should let the user specify the lib program. old_archive_cmds='lib /OUT:$oldlib$oldobjs$old_deplibs' fix_srcfile_path='`cygpath -w "$srcfile"`' enable_shared_with_static_runtimes=yes ;; darwin* | rhapsody*) if test "$GXX" = yes ; then archive_cmds_need_lc=no case "$host_os" in rhapsody* | darwin1.[012]) allow_undefined_flag='-undefined suppress' ;; *) # Darwin 1.3 on if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then allow_undefined_flag='-flat_namespace -undefined suppress' else case ${MACOSX_DEPLOYMENT_TARGET} in 10.[012]) allow_undefined_flag='-flat_namespace -undefined suppress' ;; 10.*) allow_undefined_flag='-undefined dynamic_lookup' ;; esac fi ;; esac lt_int_apple_cc_single_mod=no output_verbose_link_cmd='echo' if $CC -dumpspecs 2>&1 | grep 'single_module' >/dev/null ; then lt_int_apple_cc_single_mod=yes fi if test "X$lt_int_apple_cc_single_mod" = Xyes ; then archive_cmds='$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' else archive_cmds='$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring' fi module_cmds='$CC ${wl}-bind_at_load $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's if test "X$lt_int_apple_cc_single_mod" = Xyes ; then archive_expsym_cmds='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' else archive_expsym_cmds='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' fi module_expsym_cmds='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' hardcode_direct=no hardcode_automatic=yes hardcode_shlibpath_var=unsupported whole_archive_flag_spec='-all_load $convenience' link_all_deplibs=yes else ld_shlibs=no fi ;; dgux*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-L$libdir' hardcode_shlibpath_var=no ;; freebsd1*) ld_shlibs=no ;; # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor # support. Future versions do this automatically, but an explicit c++rt0.o # does not break anything, and helps significantly (at the cost of a little # extra space). freebsd2.2*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; # Unfortunately, older versions of FreeBSD 2 do not have this feature. freebsd2*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes hardcode_minus_L=yes hardcode_shlibpath_var=no ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. freebsd* | kfreebsd*-gnu) archive_cmds='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; hpux9*) if test "$GCC" = yes; then archive_cmds='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else archive_cmds='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' fi hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: hardcode_direct=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes export_dynamic_flag_spec='${wl}-E' ;; hpux10* | hpux11*) if test "$GCC" = yes -a "$with_gnu_ld" = no; then case "$host_cpu" in hppa*64*|ia64*) archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else case "$host_cpu" in hppa*64*|ia64*) archive_cmds='$LD -b +h $soname -o $lib $libobjs $deplibs $linker_flags' ;; *) archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' ;; esac fi if test "$with_gnu_ld" = no; then case "$host_cpu" in hppa*64*) hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_flag_spec_ld='+b $libdir' hardcode_libdir_separator=: hardcode_direct=no hardcode_shlibpath_var=no ;; ia64*) hardcode_libdir_flag_spec='-L$libdir' hardcode_direct=no hardcode_shlibpath_var=no # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes ;; *) hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: hardcode_direct=yes export_dynamic_flag_spec='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) if test "$GCC" = yes; then archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' hardcode_libdir_flag_spec_ld='-rpath $libdir' fi hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: link_all_deplibs=yes ;; netbsd*) if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF fi hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; newsos6) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: hardcode_shlibpath_var=no ;; openbsd*) hardcode_direct=yes hardcode_shlibpath_var=no if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec='${wl}-rpath,$libdir' export_dynamic_flag_spec='${wl}-E' else case $host_os in openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-R$libdir' ;; *) archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec='${wl}-rpath,$libdir' ;; esac fi ;; os2*) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes allow_undefined_flag=unsupported archive_cmds='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' old_archive_From_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' ;; osf3*) if test "$GCC" = yes; then allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else allow_undefined_flag=' -expect_unresolved \*' archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' fi hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: ;; osf4* | osf5*) # as osf3* with the addition of -msym flag if test "$GCC" = yes; then allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' else allow_undefined_flag=' -expect_unresolved \*' archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~ $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib~$rm $lib.exp' # Both c and cxx compiler support -rpath directly hardcode_libdir_flag_spec='-rpath $libdir' fi hardcode_libdir_separator=: ;; sco3.2v5*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var=no export_dynamic_flag_spec='${wl}-Bexport' runpath_var=LD_RUN_PATH hardcode_runpath_var=yes ;; solaris*) no_undefined_flag=' -z text' if test "$GCC" = yes; then archive_cmds='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp' else archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' fi hardcode_libdir_flag_spec='-R$libdir' hardcode_shlibpath_var=no case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) # Supported since Solaris 2.6 (maybe 2.5.1?) whole_archive_flag_spec='-z allextract$convenience -z defaultextract' ;; esac link_all_deplibs=yes ;; sunos4*) if test "x$host_vendor" = xsequent; then # Use $CC to link under sequent, because it throws in some extra .o # files that make .init and .fini sections work. archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' fi hardcode_libdir_flag_spec='-L$libdir' hardcode_direct=yes hardcode_minus_L=yes hardcode_shlibpath_var=no ;; sysv4) case $host_vendor in sni) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes # is this really true??? ;; siemens) ## LD is ld it makes a PLAMLIB ## CC just makes a GrossModule. archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' reload_cmds='$CC -r -o $output$reload_objs' hardcode_direct=no ;; motorola) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=no #Motorola manual says yes, but my tests say they lie ;; esac runpath_var='LD_RUN_PATH' hardcode_shlibpath_var=no ;; sysv4.3*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var=no export_dynamic_flag_spec='-Bexport' ;; sysv4*MP*) if test -d /usr/nec; then archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var=no runpath_var=LD_RUN_PATH hardcode_runpath_var=yes ld_shlibs=yes fi ;; sysv4.2uw2*) archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes hardcode_minus_L=no hardcode_shlibpath_var=no hardcode_runpath_var=yes runpath_var=LD_RUN_PATH ;; sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[78]* | unixware7*) no_undefined_flag='${wl}-z ${wl}text' if test "$GCC" = yes; then archive_cmds='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$CC -G ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' fi runpath_var='LD_RUN_PATH' hardcode_shlibpath_var=no ;; sysv5*) no_undefined_flag=' -z text' # $CC -shared without GNU ld will not create a library from C++ # object files and a static libstdc++, better avoid it by now archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' hardcode_libdir_flag_spec= hardcode_shlibpath_var=no runpath_var='LD_RUN_PATH' ;; uts4*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-L$libdir' hardcode_shlibpath_var=no ;; *) ld_shlibs=no ;; esac fi echo "$as_me:$LINENO: result: $ld_shlibs" >&5 echo "${ECHO_T}$ld_shlibs" >&6 test "$ld_shlibs" = no && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi # # Do we need to explicitly link libc? # case "x$archive_cmds_need_lc" in x|xyes) # Assume -lc should be added archive_cmds_need_lc=yes if test "$enable_shared" = yes && test "$GCC" = yes; then case $archive_cmds in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5 echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6 $rm conftest* printf "$lt_simple_compile_test_code" > conftest.$ac_ext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$lt_prog_compiler_wl compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$allow_undefined_flag allow_undefined_flag= if { (eval echo "$as_me:$LINENO: \"$archive_cmds 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\"") >&5 (eval $archive_cmds 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } then archive_cmds_need_lc=no else archive_cmds_need_lc=yes fi allow_undefined_flag=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $rm conftest* echo "$as_me:$LINENO: result: $archive_cmds_need_lc" >&5 echo "${ECHO_T}$archive_cmds_need_lc" >&6 ;; esac fi ;; esac echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5 echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&6 library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=".so" postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" if test "$GCC" = yes; then sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then # if the path contains ";" then we assume it to be the separator # otherwise default to the standard path separator (i.e. ":") - it is # assumed that no part of a normal pathname contains ";" but that should # okay in the real world where ";" in dirpaths is itself problematic. sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi else sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" fi need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='${libname}${release}${shared_ext}$major' ;; aix4* | aix5*) version_type=linux need_lib_prefix=no need_version=no hardcode_into_libs=yes if test "$host_cpu" = ia64; then # AIX 5 supports IA64 library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line `#! .'. This would cause the generated library to # depend on `.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[01] | aix4.[01].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then : else can_build_shared=no fi ;; esac # AIX (on Power*) has no versioning support, so currently we can not hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' else # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='${libname}${release}.a $libname.a' soname_spec='${libname}${release}${shared_ext}$major' fi shlibpath_var=LIBPATH fi ;; amigaos*) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; beos*) library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi4*) version_type=linux need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no case $GCC,$host_os in yes,cygwin* | yes,mingw* | yes,pw32*) library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $rm \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" ;; mingw*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then # It is most probably a Windows format PATH printed by # mingw gcc, but we are running on Cygwin. Gcc prints its search # path with ; separators, and with drive letters. We can handle the # drive letters (cygwin fileutils understands them), so leave them, # especially as we might pass files found there to a mingw objdump, # which wouldn't understand a cygwinified path. Ahh. sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/./-/g'`${versuffix}${shared_ext}' ;; esac ;; *) library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' ;; esac dynamic_linker='Win32 ld.exe' # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext' soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='$(test .$module = .yes && echo .so || echo .dylib)' # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same. if test "$GCC" = yes; then sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"` else sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib' fi sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd1*) dynamic_linker=no ;; kfreebsd*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='GNU ld.so' ;; freebsd*) objformat=`test -x /usr/bin/objformat && /usr/bin/objformat || echo aout` version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2*) shlibpath_overrides_runpath=yes ;; freebsd3.01* | freebsdelf3.01*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; *) # from 3.2 on shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; esac ;; gnu*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case "$host_cpu" in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' if test "X$HPUX_IA64_MODE" = X32; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555. postinstall_cmds='chmod 555 $lib' ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then version_type=linux else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; # This must be Linux ELF. linux*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # find out which ABI we are using libsuff= case "$host_cpu" in x86_64*|s390x*|powerpc64*) echo '#line 7861 "configure"' > conftest.$ac_ext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then case `/usr/bin/file conftest.$ac_objext` in *64-bit*) libsuff=64 sys_lib_search_path_spec="/lib${libsuff} /usr/lib${libsuff} /usr/local/lib${libsuff}" ;; esac fi rm -rf conftest* ;; esac # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then lt_ld_extra=`$SED -e 's/:,\t/ /g;s/=^=*$//;s/=^= * / /g' /etc/ld.so.conf | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib${libsuff} /usr/lib${libsuff} $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; knetbsd*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='GNU ld.so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; nto-qnx*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; openbsd*) version_type=sunos need_lib_prefix=no need_version=yes library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[89] | openbsd2.[89].*) shlibpath_overrides_runpath=no ;; *) shlibpath_overrides_runpath=yes ;; esac else shlibpath_overrides_runpath=yes fi ;; os2*) libname_spec='$name' shrext_cmds=".dll" need_lib_prefix=no library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; sco3.2v5*) version_type=osf soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH ;; solaris*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test "$with_gnu_ld" = yes; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no export_dynamic_flag_spec='${wl}-Blargedynsym' runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec ;then version_type=linux library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; uts4*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac echo "$as_me:$LINENO: result: $dynamic_linker" >&5 echo "${ECHO_T}$dynamic_linker" >&6 test "$dynamic_linker" = no && can_build_shared=no echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5 echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6 hardcode_action= if test -n "$hardcode_libdir_flag_spec" || \ test -n "$runpath_var " || \ test "X$hardcode_automatic"="Xyes" ; then # We can hardcode non-existant directories. if test "$hardcode_direct" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, )" != no && test "$hardcode_minus_L" != no; then # Linking always hardcodes the temporary library directory. hardcode_action=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. hardcode_action=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. hardcode_action=unsupported fi echo "$as_me:$LINENO: result: $hardcode_action" >&5 echo "${ECHO_T}$hardcode_action" >&6 if test "$hardcode_action" = relink; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || test "$enable_shared" = no; then # Fast installation is not necessary enable_fast_install=needless fi striplib= old_striplib= echo "$as_me:$LINENO: checking whether stripping libraries is possible" >&5 echo $ECHO_N "checking whether stripping libraries is possible... $ECHO_C" >&6 if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" test -z "$striplib" && striplib="$STRIP --strip-unneeded" echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6 else # FIXME - insert some real tests, host_os isn't really good enough case $host_os in darwin*) if test -n "$STRIP" ; then striplib="$STRIP -x" echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi ;; *) echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 ;; esac fi if test "x$enable_dlopen" != xyes; then enable_dlopen=unknown enable_dlopen_self=unknown enable_dlopen_self_static=unknown else lt_cv_dlopen=no lt_cv_dlopen_libs= case $host_os in beos*) lt_cv_dlopen="load_add_on" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ;; mingw* | pw32*) lt_cv_dlopen="LoadLibrary" lt_cv_dlopen_libs= ;; cygwin*) lt_cv_dlopen="dlopen" lt_cv_dlopen_libs= ;; darwin*) # if libdl is installed we need to link against it echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5 echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6 if test "${ac_cv_lib_dl_dlopen+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char dlopen (); int main () { dlopen (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_lib_dl_dlopen=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_dl_dlopen=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5 echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6 if test $ac_cv_lib_dl_dlopen = yes; then lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" else lt_cv_dlopen="dyld" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes fi ;; *) echo "$as_me:$LINENO: checking for shl_load" >&5 echo $ECHO_N "checking for shl_load... $ECHO_C" >&6 if test "${ac_cv_func_shl_load+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Define shl_load to an innocuous variant, in case declares shl_load. For example, HP-UX 11i declares gettimeofday. */ #define shl_load innocuous_shl_load /* System header to define __stub macros and hopefully few prototypes, which can conflict with char shl_load (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef shl_load /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" { #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char shl_load (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined (__stub_shl_load) || defined (__stub___shl_load) choke me #else char (*f) () = shl_load; #endif #ifdef __cplusplus } #endif int main () { return f != shl_load; ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_func_shl_load=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_func_shl_load=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_func_shl_load" >&5 echo "${ECHO_T}$ac_cv_func_shl_load" >&6 if test $ac_cv_func_shl_load = yes; then lt_cv_dlopen="shl_load" else echo "$as_me:$LINENO: checking for shl_load in -ldld" >&5 echo $ECHO_N "checking for shl_load in -ldld... $ECHO_C" >&6 if test "${ac_cv_lib_dld_shl_load+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char shl_load (); int main () { shl_load (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_lib_dld_shl_load=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_dld_shl_load=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_dld_shl_load" >&5 echo "${ECHO_T}$ac_cv_lib_dld_shl_load" >&6 if test $ac_cv_lib_dld_shl_load = yes; then lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-dld" else echo "$as_me:$LINENO: checking for dlopen" >&5 echo $ECHO_N "checking for dlopen... $ECHO_C" >&6 if test "${ac_cv_func_dlopen+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Define dlopen to an innocuous variant, in case declares dlopen. For example, HP-UX 11i declares gettimeofday. */ #define dlopen innocuous_dlopen /* System header to define __stub macros and hopefully few prototypes, which can conflict with char dlopen (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef dlopen /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" { #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char dlopen (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined (__stub_dlopen) || defined (__stub___dlopen) choke me #else char (*f) () = dlopen; #endif #ifdef __cplusplus } #endif int main () { return f != dlopen; ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_func_dlopen=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_func_dlopen=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_func_dlopen" >&5 echo "${ECHO_T}$ac_cv_func_dlopen" >&6 if test $ac_cv_func_dlopen = yes; then lt_cv_dlopen="dlopen" else echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5 echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6 if test "${ac_cv_lib_dl_dlopen+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char dlopen (); int main () { dlopen (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_lib_dl_dlopen=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_dl_dlopen=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5 echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6 if test $ac_cv_lib_dl_dlopen = yes; then lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" else echo "$as_me:$LINENO: checking for dlopen in -lsvld" >&5 echo $ECHO_N "checking for dlopen in -lsvld... $ECHO_C" >&6 if test "${ac_cv_lib_svld_dlopen+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lsvld $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char dlopen (); int main () { dlopen (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_lib_svld_dlopen=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_svld_dlopen=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_svld_dlopen" >&5 echo "${ECHO_T}$ac_cv_lib_svld_dlopen" >&6 if test $ac_cv_lib_svld_dlopen = yes; then lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld" else echo "$as_me:$LINENO: checking for dld_link in -ldld" >&5 echo $ECHO_N "checking for dld_link in -ldld... $ECHO_C" >&6 if test "${ac_cv_lib_dld_dld_link+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char dld_link (); int main () { dld_link (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_lib_dld_dld_link=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_dld_dld_link=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_dld_dld_link" >&5 echo "${ECHO_T}$ac_cv_lib_dld_dld_link" >&6 if test $ac_cv_lib_dld_dld_link = yes; then lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-dld" fi fi fi fi fi fi ;; esac if test "x$lt_cv_dlopen" != xno; then enable_dlopen=yes else enable_dlopen=no fi case $lt_cv_dlopen in dlopen) save_CPPFLAGS="$CPPFLAGS" test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" save_LDFLAGS="$LDFLAGS" eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" save_LIBS="$LIBS" LIBS="$lt_cv_dlopen_libs $LIBS" echo "$as_me:$LINENO: checking whether a program can dlopen itself" >&5 echo $ECHO_N "checking whether a program can dlopen itself... $ECHO_C" >&6 if test "${lt_cv_dlopen_self+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test "$cross_compiling" = yes; then : lt_cv_dlopen_self=cross else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext < #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif #ifdef __cplusplus extern "C" void exit (int); #endif void fnord() { int i=42;} int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; /* dlclose (self); */ } exit (status); } EOF if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; x$lt_unknown|x*) lt_cv_dlopen_self=no ;; esac else : # compilation failed lt_cv_dlopen_self=no fi fi rm -fr conftest* fi echo "$as_me:$LINENO: result: $lt_cv_dlopen_self" >&5 echo "${ECHO_T}$lt_cv_dlopen_self" >&6 if test "x$lt_cv_dlopen_self" = xyes; then LDFLAGS="$LDFLAGS $link_static_flag" echo "$as_me:$LINENO: checking whether a statically linked program can dlopen itself" >&5 echo $ECHO_N "checking whether a statically linked program can dlopen itself... $ECHO_C" >&6 if test "${lt_cv_dlopen_self_static+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test "$cross_compiling" = yes; then : lt_cv_dlopen_self_static=cross else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext < #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif #ifdef __cplusplus extern "C" void exit (int); #endif void fnord() { int i=42;} int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; /* dlclose (self); */ } exit (status); } EOF if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; x$lt_unknown|x*) lt_cv_dlopen_self_static=no ;; esac else : # compilation failed lt_cv_dlopen_self_static=no fi fi rm -fr conftest* fi echo "$as_me:$LINENO: result: $lt_cv_dlopen_self_static" >&5 echo "${ECHO_T}$lt_cv_dlopen_self_static" >&6 fi CPPFLAGS="$save_CPPFLAGS" LDFLAGS="$save_LDFLAGS" LIBS="$save_LIBS" ;; esac case $lt_cv_dlopen_self in yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; *) enable_dlopen_self=unknown ;; esac case $lt_cv_dlopen_self_static in yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; *) enable_dlopen_self_static=unknown ;; esac fi # Report which librarie types wil actually be built echo "$as_me:$LINENO: checking if libtool supports shared libraries" >&5 echo $ECHO_N "checking if libtool supports shared libraries... $ECHO_C" >&6 echo "$as_me:$LINENO: result: $can_build_shared" >&5 echo "${ECHO_T}$can_build_shared" >&6 echo "$as_me:$LINENO: checking whether to build shared libraries" >&5 echo $ECHO_N "checking whether to build shared libraries... $ECHO_C" >&6 test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case "$host_os" in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix4* | aix5*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; darwin* | rhapsody*) if test "$GCC" = yes; then archive_cmds_need_lc=no case "$host_os" in rhapsody* | darwin1.[012]) allow_undefined_flag='-undefined suppress' ;; *) # Darwin 1.3 on if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then allow_undefined_flag='-flat_namespace -undefined suppress' else case ${MACOSX_DEPLOYMENT_TARGET} in 10.[012]) allow_undefined_flag='-flat_namespace -undefined suppress' ;; 10.*) allow_undefined_flag='-undefined dynamic_lookup' ;; esac fi ;; esac output_verbose_link_cmd='echo' archive_cmds='$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs$compiler_flags -install_name $rpath/$soname $verstring' module_cmds='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's archive_expsym_cmds='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs$compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' module_expsym_cmds='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' hardcode_direct=no hardcode_automatic=yes hardcode_shlibpath_var=unsupported whole_archive_flag_spec='-all_load $convenience' link_all_deplibs=yes else ld_shlibs=no fi ;; esac echo "$as_me:$LINENO: result: $enable_shared" >&5 echo "${ECHO_T}$enable_shared" >&6 echo "$as_me:$LINENO: checking whether to build static libraries" >&5 echo $ECHO_N "checking whether to build static libraries... $ECHO_C" >&6 # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes echo "$as_me:$LINENO: result: $enable_static" >&5 echo "${ECHO_T}$enable_static" >&6 # The else clause should only fire when bootstrapping the # libtool distribution, otherwise you forgot to ship ltmain.sh # with your package, and you will get complaints that there are # no rules to generate ltmain.sh. if test -f "$ltmain"; then # See if we are running on zsh, and set the options which allow our commands through # without removal of \ escapes. if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi # Now quote all the things that may contain metacharacters while being # careful not to overquote the AC_SUBSTed values. We take copies of the # variables and quote the copies for generation of the libtool script. for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC NM \ SED SHELL STRIP \ libname_spec library_names_spec soname_spec extract_expsyms_cmds \ old_striplib striplib file_magic_cmd finish_cmds finish_eval \ deplibs_check_method reload_flag reload_cmds need_locks \ lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \ lt_cv_sys_global_symbol_to_c_name_address \ sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ old_postinstall_cmds old_postuninstall_cmds \ compiler \ CC \ LD \ lt_prog_compiler_wl \ lt_prog_compiler_pic \ lt_prog_compiler_static \ lt_prog_compiler_no_builtin_flag \ export_dynamic_flag_spec \ thread_safe_flag_spec \ whole_archive_flag_spec \ enable_shared_with_static_runtimes \ old_archive_cmds \ old_archive_from_new_cmds \ predep_objects \ postdep_objects \ predeps \ postdeps \ compiler_lib_search_path \ archive_cmds \ archive_expsym_cmds \ postinstall_cmds \ postuninstall_cmds \ old_archive_from_expsyms_cmds \ allow_undefined_flag \ no_undefined_flag \ export_symbols_cmds \ hardcode_libdir_flag_spec \ hardcode_libdir_flag_spec_ld \ hardcode_libdir_separator \ hardcode_automatic \ module_cmds \ module_expsym_cmds \ lt_cv_prog_compiler_c_o \ exclude_expsyms \ include_expsyms; do case $var in old_archive_cmds | \ old_archive_from_new_cmds | \ archive_cmds | \ archive_expsym_cmds | \ module_cmds | \ module_expsym_cmds | \ old_archive_from_expsyms_cmds | \ export_symbols_cmds | \ extract_expsyms_cmds | reload_cmds | finish_cmds | \ postinstall_cmds | postuninstall_cmds | \ old_postinstall_cmds | old_postuninstall_cmds | \ sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) # Double-quote double-evaled strings. eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" ;; *) eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" ;; esac done case $lt_echo in *'\$0 --fallback-echo"') lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'` ;; esac cfgfile="${ofile}T" trap "$rm \"$cfgfile\"; exit 1" 1 2 15 $rm -f "$cfgfile" { echo "$as_me:$LINENO: creating $ofile" >&5 echo "$as_me: creating $ofile" >&6;} cat <<__EOF__ >> "$cfgfile" #! $SHELL # `$echo "$cfgfile" | sed 's%^.*/%%'` - Provide generalized library-building support services. # Generated automatically by $PROGRAM (GNU $PACKAGE $VERSION$TIMESTAMP) # NOTE: Changes made to this file will be lost: look at ltmain.sh. # # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001 # Free Software Foundation, Inc. # # This file is part of GNU Libtool: # Originally by Gordon Matzigkeit , 1996 # # 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. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # A sed program that does not truncate output. SED=$lt_SED # Sed that helps us avoid accidentally triggering echo(1) options like -n. Xsed="$SED -e s/^X//" # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. if test "X\${CDPATH+set}" = Xset; then CDPATH=:; export CDPATH; fi # The names of the tagged configurations supported by this script. available_tags= # ### BEGIN LIBTOOL CONFIG # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # Shell to use when invoking shell scripts. SHELL=$lt_SHELL # Whether or not to build shared libraries. build_libtool_libs=$enable_shared # Whether or not to build static libraries. build_old_libs=$enable_static # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$archive_cmds_need_lc # Whether or not to disallow shared libs when runtime libs are static allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes # Whether or not to optimize for fast installation. fast_install=$enable_fast_install # The host system. host_alias=$host_alias host=$host # An echo program that does not interpret backslashes. echo=$lt_echo # The archiver. AR=$lt_AR AR_FLAGS=$lt_AR_FLAGS # A C compiler. LTCC=$lt_LTCC # A language-specific compiler. CC=$lt_compiler # Is the compiler the GNU C compiler? with_gcc=$GCC # An ERE matcher. EGREP=$lt_EGREP # The linker used to build libraries. LD=$lt_LD # Whether we need hard or soft links. LN_S=$lt_LN_S # A BSD-compatible nm program. NM=$lt_NM # A symbol stripping program STRIP=$lt_STRIP # Used to examine libraries when file_magic_cmd begins "file" MAGIC_CMD=$MAGIC_CMD # Used on cygwin: DLL creation program. DLLTOOL="$DLLTOOL" # Used on cygwin: object dumper. OBJDUMP="$OBJDUMP" # Used on cygwin: assembler. AS="$AS" # The name of the directory that contains temporary libtool files. objdir=$objdir # How to create reloadable object files. reload_flag=$lt_reload_flag reload_cmds=$lt_reload_cmds # How to pass a linker flag through the compiler. wl=$lt_lt_prog_compiler_wl # Object file suffix (normally "o"). objext="$ac_objext" # Old archive suffix (normally "a"). libext="$libext" # Shared library suffix (normally ".so"). shrext_cmds='$shrext_cmds' # Executable file suffix (normally ""). exeext="$exeext" # Additional compiler flags for building library objects. pic_flag=$lt_lt_prog_compiler_pic pic_mode=$pic_mode # What is the maximum length of a command? max_cmd_len=$lt_cv_sys_max_cmd_len # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_lt_cv_prog_compiler_c_o # Must we lock files when doing compilation ? need_locks=$lt_need_locks # Do we need the lib prefix for modules? need_lib_prefix=$need_lib_prefix # Do we need a version for libraries? need_version=$need_version # Whether dlopen is supported. dlopen_support=$enable_dlopen # Whether dlopen of programs is supported. dlopen_self=$enable_dlopen_self # Whether dlopen of statically linked programs is supported. dlopen_self_static=$enable_dlopen_self_static # Compiler flag to prevent dynamic linking. link_static_flag=$lt_lt_prog_compiler_static # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_export_dynamic_flag_spec # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec=$lt_whole_archive_flag_spec # Compiler flag to generate thread-safe objects. thread_safe_flag_spec=$lt_thread_safe_flag_spec # Library versioning type. version_type=$version_type # Format of library name prefix. libname_spec=$lt_libname_spec # List of archive names. First name is the real one, the rest are links. # The last name is the one that the linker finds with -lNAME. library_names_spec=$lt_library_names_spec # The coded name of the library, if different from the real name. soname_spec=$lt_soname_spec # Commands used to build and install an old-style archive. RANLIB=$lt_RANLIB old_archive_cmds=$lt_old_archive_cmds old_postinstall_cmds=$lt_old_postinstall_cmds old_postuninstall_cmds=$lt_old_postuninstall_cmds # Create an old-style archive from a shared archive. old_archive_from_new_cmds=$lt_old_archive_from_new_cmds # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds # Commands used to build and install a shared archive. archive_cmds=$lt_archive_cmds archive_expsym_cmds=$lt_archive_expsym_cmds postinstall_cmds=$lt_postinstall_cmds postuninstall_cmds=$lt_postuninstall_cmds # Commands used to build a loadable module (assumed same as above if empty) module_cmds=$lt_module_cmds module_expsym_cmds=$lt_module_expsym_cmds # Commands to strip libraries. old_striplib=$lt_old_striplib striplib=$lt_striplib # Dependencies to place before the objects being linked to create a # shared library. predep_objects=$lt_predep_objects # Dependencies to place after the objects being linked to create a # shared library. postdep_objects=$lt_postdep_objects # Dependencies to place before the objects being linked to create a # shared library. predeps=$lt_predeps # Dependencies to place after the objects being linked to create a # shared library. postdeps=$lt_postdeps # The library search path used internally by the compiler when linking # a shared library. compiler_lib_search_path=$lt_compiler_lib_search_path # Method to check whether dependent libraries are shared objects. deplibs_check_method=$lt_deplibs_check_method # Command to use when deplibs_check_method == file_magic. file_magic_cmd=$lt_file_magic_cmd # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_allow_undefined_flag # Flag that forces no undefined symbols. no_undefined_flag=$lt_no_undefined_flag # Commands used to finish a libtool library installation in a directory. finish_cmds=$lt_finish_cmds # Same as above, but a single script fragment to be evaled but not shown. finish_eval=$lt_finish_eval # Take the output of nm and produce a listing of raw symbols and C names. global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe # Transform the output of nm in a proper C declaration global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl # Transform the output of nm in a C name address pair global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address # This is the shared library runtime path variable. runpath_var=$runpath_var # This is the shared library path variable. shlibpath_var=$shlibpath_var # Is shlibpath searched before the hard-coded library search path? shlibpath_overrides_runpath=$shlibpath_overrides_runpath # How to hardcode a shared library path into an executable. hardcode_action=$hardcode_action # Whether we should hardcode library paths into libraries. hardcode_into_libs=$hardcode_into_libs # Flag to hardcode \$libdir into a binary during linking. # This must work even if \$libdir does not exist. hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec # If ld is used when linking, flag to hardcode \$libdir into # a binary during linking. This must work even if \$libdir does # not exist. hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld # Whether we need a single -rpath flag with a separated argument. hardcode_libdir_separator=$lt_hardcode_libdir_separator # Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the # resulting binary. hardcode_direct=$hardcode_direct # Set to yes if using the -LDIR flag during linking hardcodes DIR into the # resulting binary. hardcode_minus_L=$hardcode_minus_L # Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into # the resulting binary. hardcode_shlibpath_var=$hardcode_shlibpath_var # Set to yes if building a shared library automatically hardcodes DIR into the library # and all subsequent libraries and executables linked against it. hardcode_automatic=$hardcode_automatic # Variables whose values should be saved in libtool wrapper scripts and # restored at relink time. variables_saved_for_relink="$variables_saved_for_relink" # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$link_all_deplibs # Compile-time system search path for libraries sys_lib_search_path_spec=$lt_sys_lib_search_path_spec # Run-time system search path for libraries sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec # Fix the shell variable \$srcfile for the compiler. fix_srcfile_path="$fix_srcfile_path" # Set to yes if exported symbols are required. always_export_symbols=$always_export_symbols # The commands to list exported symbols. export_symbols_cmds=$lt_export_symbols_cmds # The commands to extract the exported symbol list from a shared archive. extract_expsyms_cmds=$lt_extract_expsyms_cmds # Symbols that should not be listed in the preloaded symbols. exclude_expsyms=$lt_exclude_expsyms # Symbols that must always be exported. include_expsyms=$lt_include_expsyms # ### END LIBTOOL CONFIG __EOF__ case $host_os in aix3*) cat <<\EOF >> "$cfgfile" # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi EOF ;; esac # We use sed instead of cat because bash on DJGPP gets confused if # if finds mixed CR/LF and LF-only lines. Since sed operates in # text mode, it properly converts lines to CR/LF. This bash problem # is reportedly fixed, but why not run on old versions too? sed '$q' "$ltmain" >> "$cfgfile" || (rm -f "$cfgfile"; exit 1) mv -f "$cfgfile" "$ofile" || \ (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") chmod +x "$ofile" else # If there is no Makefile yet, we rely on a make rule to execute # `config.status --recheck' to rerun these tests and create the # libtool script then. ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` if test -f "$ltmain_in"; then test -f Makefile && make "$ltmain" fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu CC="$lt_save_CC" # Check whether --with-tags or --without-tags was given. if test "${with_tags+set}" = set; then withval="$with_tags" tagnames="$withval" fi; if test -f "$ltmain" && test -n "$tagnames"; then if test ! -f "${ofile}"; then { echo "$as_me:$LINENO: WARNING: output file \`$ofile' does not exist" >&5 echo "$as_me: WARNING: output file \`$ofile' does not exist" >&2;} fi if test -z "$LTCC"; then eval "`$SHELL ${ofile} --config | grep '^LTCC='`" if test -z "$LTCC"; then { echo "$as_me:$LINENO: WARNING: output file \`$ofile' does not look like a libtool script" >&5 echo "$as_me: WARNING: output file \`$ofile' does not look like a libtool script" >&2;} else { echo "$as_me:$LINENO: WARNING: using \`LTCC=$LTCC', extracted from \`$ofile'" >&5 echo "$as_me: WARNING: using \`LTCC=$LTCC', extracted from \`$ofile'" >&2;} fi fi # Extract list of available tagged configurations in $ofile. # Note that this assumes the entire list is on one line. available_tags=`grep "^available_tags=" "${ofile}" | $SED -e 's/available_tags=\(.*$\)/\1/' -e 's/\"//g'` lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for tagname in $tagnames; do IFS="$lt_save_ifs" # Check whether tagname contains only valid characters case `$echo "X$tagname" | $Xsed -e 's:[-_ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890,/]::g'` in "") ;; *) { { echo "$as_me:$LINENO: error: invalid tag name: $tagname" >&5 echo "$as_me: error: invalid tag name: $tagname" >&2;} { (exit 1); exit 1; }; } ;; esac if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$" < "${ofile}" > /dev/null then { { echo "$as_me:$LINENO: error: tag name \"$tagname\" already exists" >&5 echo "$as_me: error: tag name \"$tagname\" already exists" >&2;} { (exit 1); exit 1; }; } fi # Update the list of available tags. if test -n "$tagname"; then echo appending configuration tag \"$tagname\" to $ofile case $tagname in CXX) if test -n "$CXX" && test "X$CXX" != "Xno"; then ac_ext=cc ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu archive_cmds_need_lc_CXX=no allow_undefined_flag_CXX= always_export_symbols_CXX=no archive_expsym_cmds_CXX= export_dynamic_flag_spec_CXX= hardcode_direct_CXX=no hardcode_libdir_flag_spec_CXX= hardcode_libdir_flag_spec_ld_CXX= hardcode_libdir_separator_CXX= hardcode_minus_L_CXX=no hardcode_automatic_CXX=no module_cmds_CXX= module_expsym_cmds_CXX= link_all_deplibs_CXX=unknown old_archive_cmds_CXX=$old_archive_cmds no_undefined_flag_CXX= whole_archive_flag_spec_CXX= enable_shared_with_static_runtimes_CXX=no # Dependencies to place before and after the object being linked: predep_objects_CXX= postdep_objects_CXX= predeps_CXX= postdeps_CXX= compiler_lib_search_path_CXX= # Source file extension for C++ test sources. ac_ext=cc # Object file extension for compiled C++ test sources. objext=o objext_CXX=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;\n" # Code to be used in simple link tests lt_simple_link_test_code='int main(int, char *) { return(0); }\n' # ltmain only uses $CC for tagged configurations so make sure $CC is set. # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # Allow CC to be a program name with arguments. compiler=$CC # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_LD=$LD lt_save_GCC=$GCC GCC=$GXX lt_save_with_gnu_ld=$with_gnu_ld lt_save_path_LD=$lt_cv_path_LD if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx else unset lt_cv_prog_gnu_ld fi if test -n "${lt_cv_path_LDCXX+set}"; then lt_cv_path_LD=$lt_cv_path_LDCXX else unset lt_cv_path_LD fi test -z "${LDCXX+set}" || LD=$LDCXX CC=${CXX-"c++"} compiler=$CC compiler_CXX=$CC cc_basename=`$echo X"$compiler" | $Xsed -e 's%^.*/%%'` # We don't want -fno-exception wen compiling C++ code, so set the # no_builtin_flag separately if test "$GXX" = yes; then lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin' else lt_prog_compiler_no_builtin_flag_CXX= fi if test "$GXX" = yes; then # Set up default GNU C++ configuration # Check whether --with-gnu-ld or --without-gnu-ld was given. if test "${with_gnu_ld+set}" = set; then withval="$with_gnu_ld" test "$withval" = no || with_gnu_ld=yes else with_gnu_ld=no fi; ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. echo "$as_me:$LINENO: checking for ld used by $CC" >&5 echo $ECHO_N "checking for ld used by $CC... $ECHO_C" >&6 case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [\\/]* | ?:[\\/]*) re_direlt='/[^/][^/]*/\.\./' # Canonicalize the pathname of ld ac_prog=`echo $ac_prog| $SED 's%\\\\%/%g'` while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do ac_prog=`echo $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then echo "$as_me:$LINENO: checking for GNU ld" >&5 echo $ECHO_N "checking for GNU ld... $ECHO_C" >&6 else echo "$as_me:$LINENO: checking for non-GNU ld" >&5 echo $ECHO_N "checking for non-GNU ld... $ECHO_C" >&6 fi if test "${lt_cv_path_LD+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -z "$LD"; then lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some GNU ld's only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &5 echo "${ECHO_T}$LD" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi test -z "$LD" && { { echo "$as_me:$LINENO: error: no acceptable ld found in \$PATH" >&5 echo "$as_me: error: no acceptable ld found in \$PATH" >&2;} { (exit 1); exit 1; }; } echo "$as_me:$LINENO: checking if the linker ($LD) is GNU ld" >&5 echo $ECHO_N "checking if the linker ($LD) is GNU ld... $ECHO_C" >&6 if test "${lt_cv_prog_gnu_ld+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else # I'd rather use --version here, but apparently some GNU ld's only accept -v. case `$LD -v 2>&1 &5 echo "${ECHO_T}$lt_cv_prog_gnu_ld" >&6 with_gnu_ld=$lt_cv_prog_gnu_ld # Check if GNU C++ uses GNU ld as the underlying linker, since the # archiving commands below assume that GNU ld is being used. if test "$with_gnu_ld" = yes; then archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' hardcode_libdir_flag_spec_CXX='${wl}--rpath ${wl}$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' # If archive_cmds runs LD, not CC, wlarc should be empty # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to # investigate it a little bit more. (MM) wlarc='${wl}' # ancient GNU ld didn't support --whole-archive et. al. if eval "`$CC -print-prog-name=ld` --help 2>&1" | \ grep 'no-whole-archive' > /dev/null; then whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else whole_archive_flag_spec_CXX= fi else with_gnu_ld=no wlarc= # A generic and very simple default shared library creation # command for GNU C++ for the case where it uses the native # linker, instead of GNU ld. If possible, this setting should # overridden to take advantage of the native linker features on # the platform it is being used on. archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' fi # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' else GXX=no with_gnu_ld=no wlarc= fi # PORTME: fill in a description of your system's C++ link characteristics echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6 ld_shlibs_CXX=yes case $host_os in aix3*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; aix4* | aix5*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[23]|aix4.[23].*|aix5*) for ld_flag in $LDFLAGS; do case $ld_flag in *-brtl*) aix_use_runtimelinking=yes break ;; esac done esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. archive_cmds_CXX='' hardcode_direct_CXX=yes hardcode_libdir_separator_CXX=':' link_all_deplibs_CXX=yes if test "$GXX" = yes; then case $host_os in aix4.012|aix4.012.*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && \ strings "$collect2name" | grep resolve_lib_name >/dev/null then # We have reworked collect2 hardcode_direct_CXX=yes else # We have old collect2 hardcode_direct_CXX=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking hardcode_minus_L_CXX=yes hardcode_libdir_flag_spec_CXX='-L$libdir' hardcode_libdir_separator_CXX= fi esac shared_flag='-shared' else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. always_export_symbols_CXX=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. allow_undefined_flag_CXX='-berok' # Determine the default libpath from the value encoded in an empty executable. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'` # Check for a 64-bit object if we didn't find anything. if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'`; fi else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" archive_expsym_cmds_CXX="\$CC"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then hardcode_libdir_flag_spec_CXX='${wl}-R $libdir:/usr/lib:/lib' allow_undefined_flag_CXX="-z nodefs" archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an empty executable. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'` # Check for a 64-bit object if we didn't find anything. if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'`; fi else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. no_undefined_flag_CXX=' ${wl}-bernotok' allow_undefined_flag_CXX=' ${wl}-berok' # -bexpall does not export symbols beginning with underscore (_) always_export_symbols_CXX=yes # Exported symbols can be pulled into shared objects from archives whole_archive_flag_spec_CXX=' ' archive_cmds_need_lc_CXX=yes # This is similar to how AIX traditionally builds it's shared libraries. archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}-bE:$export_symbols ${wl}-bnoentry${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; chorus*) case $cc_basename in *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; cygwin* | mingw* | pw32*) # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless, # as there is no search path for DLLs. hardcode_libdir_flag_spec_CXX='-L$libdir' allow_undefined_flag_CXX=unsupported always_export_symbols_CXX=no enable_shared_with_static_runtimes_CXX=yes if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' else ld_shlibs_CXX=no fi ;; darwin* | rhapsody*) if test "$GXX" = yes; then archive_cmds_need_lc_CXX=no case "$host_os" in rhapsody* | darwin1.[012]) allow_undefined_flag_CXX='-undefined suppress' ;; *) # Darwin 1.3 on if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then allow_undefined_flag_CXX='-flat_namespace -undefined suppress' else case ${MACOSX_DEPLOYMENT_TARGET} in 10.[012]) allow_undefined_flag_CXX='-flat_namespace -undefined suppress' ;; 10.*) allow_undefined_flag_CXX='-undefined dynamic_lookup' ;; esac fi ;; esac lt_int_apple_cc_single_mod=no output_verbose_link_cmd='echo' if $CC -dumpspecs 2>&1 | grep 'single_module' >/dev/null ; then lt_int_apple_cc_single_mod=yes fi if test "X$lt_int_apple_cc_single_mod" = Xyes ; then archive_cmds_CXX='$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' else archive_cmds_CXX='$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring' fi module_cmds_CXX='$CC ${wl}-bind_at_load $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's if test "X$lt_int_apple_cc_single_mod" = Xyes ; then archive_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' else archive_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' fi module_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' hardcode_direct_CXX=no hardcode_automatic_CXX=yes hardcode_shlibpath_var_CXX=unsupported whole_archive_flag_spec_CXX='-all_load $convenience' link_all_deplibs_CXX=yes else ld_shlibs_CXX=no fi ;; dgux*) case $cc_basename in ec++) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; ghcx) # Green Hills C++ Compiler # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; freebsd12*) # C++ shared libraries reported to be fairly broken before switch to ELF ld_shlibs_CXX=no ;; freebsd-elf*) archive_cmds_need_lc_CXX=no ;; freebsd* | kfreebsd*-gnu) # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF # conventions ld_shlibs_CXX=yes ;; gnu*) ;; hpux9*) hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' hardcode_libdir_separator_CXX=: export_dynamic_flag_spec_CXX='${wl}-E' hardcode_direct_CXX=yes hardcode_minus_L_CXX=yes # Not in the search PATH, # but as the default # location of the library. case $cc_basename in CC) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; aCC) archive_cmds_CXX='$rm $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' ;; *) if test "$GXX" = yes; then archive_cmds_CXX='$rm $output_objdir/$soname~$CC -shared -nostdlib -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else # FIXME: insert proper C++ library support ld_shlibs_CXX=no fi ;; esac ;; hpux10*|hpux11*) if test $with_gnu_ld = no; then case "$host_cpu" in hppa*64*) hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' hardcode_libdir_flag_spec_ld_CXX='+b $libdir' hardcode_libdir_separator_CXX=: ;; ia64*) hardcode_libdir_flag_spec_CXX='-L$libdir' ;; *) hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' hardcode_libdir_separator_CXX=: export_dynamic_flag_spec_CXX='${wl}-E' ;; esac fi case "$host_cpu" in hppa*64*) hardcode_direct_CXX=no hardcode_shlibpath_var_CXX=no ;; ia64*) hardcode_direct_CXX=no hardcode_shlibpath_var_CXX=no hardcode_minus_L_CXX=yes # Not in the search PATH, # but as the default # location of the library. ;; *) hardcode_direct_CXX=yes hardcode_minus_L_CXX=yes # Not in the search PATH, # but as the default # location of the library. ;; esac case $cc_basename in CC) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; aCC) case "$host_cpu" in hppa*64*|ia64*) archive_cmds_CXX='$LD -b +h $soname -o $lib $linker_flags $libobjs $deplibs' ;; *) archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' ;; *) if test "$GXX" = yes; then if test $with_gnu_ld = no; then case "$host_cpu" in ia64*|hppa*64*) archive_cmds_CXX='$LD -b +h $soname -o $lib $linker_flags $libobjs $deplibs' ;; *) archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac fi else # FIXME: insert proper C++ library support ld_shlibs_CXX=no fi ;; esac ;; irix5* | irix6*) case $cc_basename in CC) # SGI C++ archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib' # Archives containing C++ object files must be created using # "CC -ar", where "CC" is the IRIX C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. old_archive_cmds_CXX='$CC -ar -WR,-u -o $oldlib $oldobjs' ;; *) if test "$GXX" = yes; then if test "$with_gnu_ld" = no; then archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib' else archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` -o $lib' fi fi link_all_deplibs_CXX=yes ;; esac hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_CXX=: ;; linux*) case $cc_basename in KCC) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' archive_expsym_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | grep "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' hardcode_libdir_flag_spec_CXX='${wl}--rpath,$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' # Archives containing C++ object files must be created using # "CC -Bstatic", where "CC" is the KAI C++ compiler. old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;; icpc) # Intel C++ with_gnu_ld=yes archive_cmds_need_lc_CXX=no archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive' ;; cxx) # Compaq C++ archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' runpath_var=LD_RUN_PATH hardcode_libdir_flag_spec_CXX='-rpath $libdir' hardcode_libdir_separator_CXX=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' ;; esac ;; lynxos*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; m88k*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; mvs*) case $cc_basename in cxx) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; netbsd*) if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then archive_cmds_CXX='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' wlarc= hardcode_libdir_flag_spec_CXX='-R$libdir' hardcode_direct_CXX=yes hardcode_shlibpath_var_CXX=no fi # Workaround some broken pre-1.5 toolchains output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' ;; osf3*) case $cc_basename in KCC) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' hardcode_libdir_separator_CXX=: # Archives containing C++ object files must be created using # "CC -Bstatic", where "CC" is the KAI C++ compiler. old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;; RCC) # Rational C++ 2.4.1 # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; cxx) allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && echo ${wl}-set_version $verstring` -update_registry ${objdir}/so_locations -o $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_CXX=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' ;; *) if test "$GXX" = yes && test "$with_gnu_ld" = no; then allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_CXX=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' else # FIXME: insert proper C++ library support ld_shlibs_CXX=no fi ;; esac ;; osf4* | osf5*) case $cc_basename in KCC) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' hardcode_libdir_separator_CXX=: # Archives containing C++ object files must be created using # the KAI C++ compiler. old_archive_cmds_CXX='$CC -o $oldlib $oldobjs' ;; RCC) # Rational C++ 2.4.1 # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; cxx) allow_undefined_flag_CXX=' -expect_unresolved \*' archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib' archive_expsym_cmds_CXX='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ echo "-hidden">> $lib.exp~ $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname -Wl,-input -Wl,$lib.exp `test -n "$verstring" && echo -set_version $verstring` -update_registry $objdir/so_locations -o $lib~ $rm $lib.exp' hardcode_libdir_flag_spec_CXX='-rpath $libdir' hardcode_libdir_separator_CXX=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' ;; *) if test "$GXX" = yes && test "$with_gnu_ld" = no; then allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_CXX=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' else # FIXME: insert proper C++ library support ld_shlibs_CXX=no fi ;; esac ;; psos*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; sco*) archive_cmds_need_lc_CXX=no case $cc_basename in CC) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; sunos4*) case $cc_basename in CC) # Sun C++ 4.x # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; lcc) # Lucid # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; solaris*) case $cc_basename in CC) # Sun C++ 4.2, 5.x and Centerline C++ no_undefined_flag_CXX=' -zdefs' archive_cmds_CXX='$CC -G${allow_undefined_flag} -nolib -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' archive_expsym_cmds_CXX='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $CC -G${allow_undefined_flag} -nolib ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' hardcode_libdir_flag_spec_CXX='-R$libdir' hardcode_shlibpath_var_CXX=no case $host_os in solaris2.0-5 | solaris2.0-5.*) ;; *) # The C++ compiler is used as linker so we must use $wl # flag to pass the commands to the underlying system # linker. # Supported since Solaris 2.6 (maybe 2.5.1?) whole_archive_flag_spec_CXX='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' ;; esac link_all_deplibs_CXX=yes # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -G $CFLAGS -v conftest.$objext 2>&1 | grep "\-[LR]"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' ;; gcx) # Green Hills C++ Compiler archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' # The C++ compiler must be used to create the archive. old_archive_cmds_CXX='$CC $LDFLAGS -archive -o $oldlib $oldobjs' ;; *) # GNU C++ compiler with Solaris linker if test "$GXX" = yes && test "$with_gnu_ld" = no; then no_undefined_flag_CXX=' ${wl}-z ${wl}defs' if $CC --version | grep -v '^2\.7' > /dev/null; then archive_cmds_CXX='$CC -shared -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' archive_expsym_cmds_CXX='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $CC -shared -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd="$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\"" else # g++ 2.7 appears to require `-G' NOT `-shared' on this # platform. archive_cmds_CXX='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' archive_expsym_cmds_CXX='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd="$CC -G $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\"" fi hardcode_libdir_flag_spec_CXX='${wl}-R $wl$libdir' fi ;; esac ;; sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[78]* | unixware7*) archive_cmds_need_lc_CXX=no ;; tandem*) case $cc_basename in NCC) # NonStop-UX NCC 3.20 # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; vxworks*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac echo "$as_me:$LINENO: result: $ld_shlibs_CXX" >&5 echo "${ECHO_T}$ld_shlibs_CXX" >&6 test "$ld_shlibs_CXX" = no && can_build_shared=no GCC_CXX="$GXX" LD_CXX="$LD" cat > conftest.$ac_ext <&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then # Parse the compiler output and extract the necessary # objects, libraries and library flags. # Sentinel used to keep track of whether or not we are before # the conftest object file. pre_test_object_deps_done=no # The `*' in the case matches for architectures that use `case' in # $output_verbose_cmd can trigger glob expansion during the loop # eval without this substitution. output_verbose_link_cmd="`$echo \"X$output_verbose_link_cmd\" | $Xsed -e \"$no_glob_subst\"`" for p in `eval $output_verbose_link_cmd`; do case $p in -L* | -R* | -l*) # Some compilers place space between "-{L,R}" and the path. # Remove the space. if test $p = "-L" \ || test $p = "-R"; then prev=$p continue else prev= fi if test "$pre_test_object_deps_done" = no; then case $p in -L* | -R*) # Internal compiler library paths should come after those # provided the user. The postdeps already come after the # user supplied libs so there is no need to process them. if test -z "$compiler_lib_search_path_CXX"; then compiler_lib_search_path_CXX="${prev}${p}" else compiler_lib_search_path_CXX="${compiler_lib_search_path_CXX} ${prev}${p}" fi ;; # The "-l" case would never come before the object being # linked, so don't bother handling this case. esac else if test -z "$postdeps_CXX"; then postdeps_CXX="${prev}${p}" else postdeps_CXX="${postdeps_CXX} ${prev}${p}" fi fi ;; *.$objext) # This assumes that the test object file only shows up # once in the compiler output. if test "$p" = "conftest.$objext"; then pre_test_object_deps_done=yes continue fi if test "$pre_test_object_deps_done" = no; then if test -z "$predep_objects_CXX"; then predep_objects_CXX="$p" else predep_objects_CXX="$predep_objects_CXX $p" fi else if test -z "$postdep_objects_CXX"; then postdep_objects_CXX="$p" else postdep_objects_CXX="$postdep_objects_CXX $p" fi fi ;; *) ;; # Ignore the rest. esac done # Clean up. rm -f a.out a.exe else echo "libtool.m4: error: problem compiling CXX test program" fi $rm -f confest.$objext case " $postdeps_CXX " in *" -lc "*) archive_cmds_need_lc_CXX=no ;; esac lt_prog_compiler_wl_CXX= lt_prog_compiler_pic_CXX= lt_prog_compiler_static_CXX= echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5 echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6 # C++ specific cases for pic, static, wl, etc. if test "$GXX" = yes; then lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static_CXX='-Bstatic' fi ;; amigaos*) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. lt_prog_compiler_pic_CXX='-m68020 -resident32 -malways-restore-a4' ;; beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | os2* | pw32*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). lt_prog_compiler_pic_CXX='-DDLL_EXPORT' ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic_CXX='-fno-common' ;; *djgpp*) # DJGPP does not support shared libraries at all lt_prog_compiler_pic_CXX= ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic_CXX=-Kconform_pic fi ;; hpux*) # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case "$host_cpu" in hppa*64*|ia64*) ;; *) lt_prog_compiler_pic_CXX='-fPIC' ;; esac ;; *) lt_prog_compiler_pic_CXX='-fPIC' ;; esac else case $host_os in aix4* | aix5*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static_CXX='-Bstatic' else lt_prog_compiler_static_CXX='-bnso -bI:/lib/syscalls.exp' fi ;; chorus*) case $cc_basename in cxch68) # Green Hills C++ Compiler # _LT_AC_TAGVAR(lt_prog_compiler_static, CXX)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" ;; esac ;; dgux*) case $cc_basename in ec++) lt_prog_compiler_pic_CXX='-KPIC' ;; ghcx) # Green Hills C++ Compiler lt_prog_compiler_pic_CXX='-pic' ;; *) ;; esac ;; freebsd* | kfreebsd*-gnu) # FreeBSD uses GNU C++ ;; hpux9* | hpux10* | hpux11*) case $cc_basename in CC) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX="${ac_cv_prog_cc_wl}-a ${ac_cv_prog_cc_wl}archive" if test "$host_cpu" != ia64; then lt_prog_compiler_pic_CXX='+Z' fi ;; aCC) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX="${ac_cv_prog_cc_wl}-a ${ac_cv_prog_cc_wl}archive" case "$host_cpu" in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic_CXX='+Z' ;; esac ;; *) ;; esac ;; irix5* | irix6* | nonstopux*) case $cc_basename in CC) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='-non_shared' # CC pic flag -KPIC is the default. ;; *) ;; esac ;; linux*) case $cc_basename in KCC) # KAI C++ Compiler lt_prog_compiler_wl_CXX='--backend -Wl,' lt_prog_compiler_pic_CXX='-fPIC' ;; icpc) # Intel C++ lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-static' ;; cxx) # Compaq C++ # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. lt_prog_compiler_pic_CXX= lt_prog_compiler_static_CXX='-non_shared' ;; *) ;; esac ;; lynxos*) ;; m88k*) ;; mvs*) case $cc_basename in cxx) lt_prog_compiler_pic_CXX='-W c,exportall' ;; *) ;; esac ;; netbsd*) ;; osf3* | osf4* | osf5*) case $cc_basename in KCC) lt_prog_compiler_wl_CXX='--backend -Wl,' ;; RCC) # Rational C++ 2.4.1 lt_prog_compiler_pic_CXX='-pic' ;; cxx) # Digital/Compaq C++ lt_prog_compiler_wl_CXX='-Wl,' # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. lt_prog_compiler_pic_CXX= lt_prog_compiler_static_CXX='-non_shared' ;; *) ;; esac ;; psos*) ;; sco*) case $cc_basename in CC) lt_prog_compiler_pic_CXX='-fPIC' ;; *) ;; esac ;; solaris*) case $cc_basename in CC) # Sun C++ 4.2, 5.x and Centerline C++ lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-Bstatic' lt_prog_compiler_wl_CXX='-Qoption ld ' ;; gcx) # Green Hills C++ Compiler lt_prog_compiler_pic_CXX='-PIC' ;; *) ;; esac ;; sunos4*) case $cc_basename in CC) # Sun C++ 4.x lt_prog_compiler_pic_CXX='-pic' lt_prog_compiler_static_CXX='-Bstatic' ;; lcc) # Lucid lt_prog_compiler_pic_CXX='-pic' ;; *) ;; esac ;; tandem*) case $cc_basename in NCC) # NonStop-UX NCC 3.20 lt_prog_compiler_pic_CXX='-KPIC' ;; *) ;; esac ;; unixware*) ;; vxworks*) ;; *) lt_prog_compiler_can_build_shared_CXX=no ;; esac fi echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_CXX" >&5 echo "${ECHO_T}$lt_prog_compiler_pic_CXX" >&6 # # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic_CXX"; then echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5 echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... $ECHO_C" >&6 if test "${lt_prog_compiler_pic_works_CXX+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lt_prog_compiler_pic_works_CXX=no ac_outfile=conftest.$ac_objext printf "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$lt_prog_compiler_pic_CXX -DPIC" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:11009: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:11013: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings if test ! -s conftest.err; then lt_prog_compiler_pic_works_CXX=yes fi fi $rm conftest* fi echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_works_CXX" >&5 echo "${ECHO_T}$lt_prog_compiler_pic_works_CXX" >&6 if test x"$lt_prog_compiler_pic_works_CXX" = xyes; then case $lt_prog_compiler_pic_CXX in "" | " "*) ;; *) lt_prog_compiler_pic_CXX=" $lt_prog_compiler_pic_CXX" ;; esac else lt_prog_compiler_pic_CXX= lt_prog_compiler_can_build_shared_CXX=no fi fi case "$host_os" in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) lt_prog_compiler_pic_CXX= ;; *) lt_prog_compiler_pic_CXX="$lt_prog_compiler_pic_CXX -DPIC" ;; esac echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5 echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6 if test "${lt_cv_prog_compiler_c_o_CXX+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lt_cv_prog_compiler_c_o_CXX=no $rm -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out printf "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:11069: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:11073: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings if test ! -s out/conftest.err; then lt_cv_prog_compiler_c_o_CXX=yes fi fi chmod u+w . $rm conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files $rm out/* && rmdir out cd .. rmdir conftest $rm conftest* fi echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o_CXX" >&5 echo "${ECHO_T}$lt_cv_prog_compiler_c_o_CXX" >&6 hard_links="nottested" if test "$lt_cv_prog_compiler_c_o_CXX" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user echo "$as_me:$LINENO: checking if we can lock with hard links" >&5 echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&6 hard_links=yes $rm conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no echo "$as_me:$LINENO: result: $hard_links" >&5 echo "${ECHO_T}$hard_links" >&6 if test "$hard_links" = no; then { echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} need_locks=warn fi else need_locks=no fi echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6 export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' case $host_os in aix4* | aix5*) # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm if $NM -V 2>&1 | grep 'GNU' > /dev/null; then export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' else export_symbols_cmds_CXX='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' fi ;; pw32*) export_symbols_cmds_CXX="$ltdll_cmds" ;; cygwin* | mingw*) export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGS] /s/.* \([^ ]*\)/\1 DATA/'\'' | $SED -e '\''/^[AITW] /s/.* //'\'' | sort | uniq > $export_symbols' ;; *) export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' ;; esac echo "$as_me:$LINENO: result: $ld_shlibs_CXX" >&5 echo "${ECHO_T}$ld_shlibs_CXX" >&6 test "$ld_shlibs_CXX" = no && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi # # Do we need to explicitly link libc? # case "x$archive_cmds_need_lc_CXX" in x|xyes) # Assume -lc should be added archive_cmds_need_lc_CXX=yes if test "$enable_shared" = yes && test "$GCC" = yes; then case $archive_cmds_CXX in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5 echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6 $rm conftest* printf "$lt_simple_compile_test_code" > conftest.$ac_ext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$lt_prog_compiler_wl_CXX compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$allow_undefined_flag_CXX allow_undefined_flag_CXX= if { (eval echo "$as_me:$LINENO: \"$archive_cmds_CXX 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\"") >&5 (eval $archive_cmds_CXX 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } then archive_cmds_need_lc_CXX=no else archive_cmds_need_lc_CXX=yes fi allow_undefined_flag_CXX=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $rm conftest* echo "$as_me:$LINENO: result: $archive_cmds_need_lc_CXX" >&5 echo "${ECHO_T}$archive_cmds_need_lc_CXX" >&6 ;; esac fi ;; esac echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5 echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&6 library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=".so" postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" if test "$GCC" = yes; then sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then # if the path contains ";" then we assume it to be the separator # otherwise default to the standard path separator (i.e. ":") - it is # assumed that no part of a normal pathname contains ";" but that should # okay in the real world where ";" in dirpaths is itself problematic. sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi else sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" fi need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='${libname}${release}${shared_ext}$major' ;; aix4* | aix5*) version_type=linux need_lib_prefix=no need_version=no hardcode_into_libs=yes if test "$host_cpu" = ia64; then # AIX 5 supports IA64 library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line `#! .'. This would cause the generated library to # depend on `.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[01] | aix4.[01].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then : else can_build_shared=no fi ;; esac # AIX (on Power*) has no versioning support, so currently we can not hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' else # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='${libname}${release}.a $libname.a' soname_spec='${libname}${release}${shared_ext}$major' fi shlibpath_var=LIBPATH fi ;; amigaos*) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; beos*) library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi4*) version_type=linux need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no case $GCC,$host_os in yes,cygwin* | yes,mingw* | yes,pw32*) library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $rm \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" ;; mingw*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then # It is most probably a Windows format PATH printed by # mingw gcc, but we are running on Cygwin. Gcc prints its search # path with ; separators, and with drive letters. We can handle the # drive letters (cygwin fileutils understands them), so leave them, # especially as we might pass files found there to a mingw objdump, # which wouldn't understand a cygwinified path. Ahh. sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/./-/g'`${versuffix}${shared_ext}' ;; esac ;; *) library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' ;; esac dynamic_linker='Win32 ld.exe' # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext' soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='$(test .$module = .yes && echo .so || echo .dylib)' # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same. if test "$GCC" = yes; then sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"` else sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib' fi sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd1*) dynamic_linker=no ;; kfreebsd*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='GNU ld.so' ;; freebsd*) objformat=`test -x /usr/bin/objformat && /usr/bin/objformat || echo aout` version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2*) shlibpath_overrides_runpath=yes ;; freebsd3.01* | freebsdelf3.01*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; *) # from 3.2 on shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; esac ;; gnu*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case "$host_cpu" in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' if test "X$HPUX_IA64_MODE" = X32; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555. postinstall_cmds='chmod 555 $lib' ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then version_type=linux else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; # This must be Linux ELF. linux*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # find out which ABI we are using libsuff= case "$host_cpu" in x86_64*|s390x*|powerpc64*) echo '#line 11580 "configure"' > conftest.$ac_ext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then case `/usr/bin/file conftest.$ac_objext` in *64-bit*) libsuff=64 sys_lib_search_path_spec="/lib${libsuff} /usr/lib${libsuff} /usr/local/lib${libsuff}" ;; esac fi rm -rf conftest* ;; esac # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then lt_ld_extra=`$SED -e 's/:,\t/ /g;s/=^=*$//;s/=^= * / /g' /etc/ld.so.conf | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib${libsuff} /usr/lib${libsuff} $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; knetbsd*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='GNU ld.so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; nto-qnx*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; openbsd*) version_type=sunos need_lib_prefix=no need_version=yes library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[89] | openbsd2.[89].*) shlibpath_overrides_runpath=no ;; *) shlibpath_overrides_runpath=yes ;; esac else shlibpath_overrides_runpath=yes fi ;; os2*) libname_spec='$name' shrext_cmds=".dll" need_lib_prefix=no library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; sco3.2v5*) version_type=osf soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH ;; solaris*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test "$with_gnu_ld" = yes; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no export_dynamic_flag_spec='${wl}-Blargedynsym' runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec ;then version_type=linux library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; uts4*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac echo "$as_me:$LINENO: result: $dynamic_linker" >&5 echo "${ECHO_T}$dynamic_linker" >&6 test "$dynamic_linker" = no && can_build_shared=no echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5 echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6 hardcode_action_CXX= if test -n "$hardcode_libdir_flag_spec_CXX" || \ test -n "$runpath_var CXX" || \ test "X$hardcode_automatic_CXX"="Xyes" ; then # We can hardcode non-existant directories. if test "$hardcode_direct_CXX" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, CXX)" != no && test "$hardcode_minus_L_CXX" != no; then # Linking always hardcodes the temporary library directory. hardcode_action_CXX=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. hardcode_action_CXX=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. hardcode_action_CXX=unsupported fi echo "$as_me:$LINENO: result: $hardcode_action_CXX" >&5 echo "${ECHO_T}$hardcode_action_CXX" >&6 if test "$hardcode_action_CXX" = relink; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || test "$enable_shared" = no; then # Fast installation is not necessary enable_fast_install=needless fi striplib= old_striplib= echo "$as_me:$LINENO: checking whether stripping libraries is possible" >&5 echo $ECHO_N "checking whether stripping libraries is possible... $ECHO_C" >&6 if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" test -z "$striplib" && striplib="$STRIP --strip-unneeded" echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6 else # FIXME - insert some real tests, host_os isn't really good enough case $host_os in darwin*) if test -n "$STRIP" ; then striplib="$STRIP -x" echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi ;; *) echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 ;; esac fi if test "x$enable_dlopen" != xyes; then enable_dlopen=unknown enable_dlopen_self=unknown enable_dlopen_self_static=unknown else lt_cv_dlopen=no lt_cv_dlopen_libs= case $host_os in beos*) lt_cv_dlopen="load_add_on" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ;; mingw* | pw32*) lt_cv_dlopen="LoadLibrary" lt_cv_dlopen_libs= ;; cygwin*) lt_cv_dlopen="dlopen" lt_cv_dlopen_libs= ;; darwin*) # if libdl is installed we need to link against it echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5 echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6 if test "${ac_cv_lib_dl_dlopen+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char dlopen (); int main () { dlopen (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_lib_dl_dlopen=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_dl_dlopen=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5 echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6 if test $ac_cv_lib_dl_dlopen = yes; then lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" else lt_cv_dlopen="dyld" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes fi ;; *) echo "$as_me:$LINENO: checking for shl_load" >&5 echo $ECHO_N "checking for shl_load... $ECHO_C" >&6 if test "${ac_cv_func_shl_load+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Define shl_load to an innocuous variant, in case declares shl_load. For example, HP-UX 11i declares gettimeofday. */ #define shl_load innocuous_shl_load /* System header to define __stub macros and hopefully few prototypes, which can conflict with char shl_load (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef shl_load /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" { #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char shl_load (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined (__stub_shl_load) || defined (__stub___shl_load) choke me #else char (*f) () = shl_load; #endif #ifdef __cplusplus } #endif int main () { return f != shl_load; ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_func_shl_load=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_func_shl_load=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_func_shl_load" >&5 echo "${ECHO_T}$ac_cv_func_shl_load" >&6 if test $ac_cv_func_shl_load = yes; then lt_cv_dlopen="shl_load" else echo "$as_me:$LINENO: checking for shl_load in -ldld" >&5 echo $ECHO_N "checking for shl_load in -ldld... $ECHO_C" >&6 if test "${ac_cv_lib_dld_shl_load+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char shl_load (); int main () { shl_load (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_lib_dld_shl_load=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_dld_shl_load=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_dld_shl_load" >&5 echo "${ECHO_T}$ac_cv_lib_dld_shl_load" >&6 if test $ac_cv_lib_dld_shl_load = yes; then lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-dld" else echo "$as_me:$LINENO: checking for dlopen" >&5 echo $ECHO_N "checking for dlopen... $ECHO_C" >&6 if test "${ac_cv_func_dlopen+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Define dlopen to an innocuous variant, in case declares dlopen. For example, HP-UX 11i declares gettimeofday. */ #define dlopen innocuous_dlopen /* System header to define __stub macros and hopefully few prototypes, which can conflict with char dlopen (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef dlopen /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" { #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char dlopen (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined (__stub_dlopen) || defined (__stub___dlopen) choke me #else char (*f) () = dlopen; #endif #ifdef __cplusplus } #endif int main () { return f != dlopen; ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_func_dlopen=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_func_dlopen=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_func_dlopen" >&5 echo "${ECHO_T}$ac_cv_func_dlopen" >&6 if test $ac_cv_func_dlopen = yes; then lt_cv_dlopen="dlopen" else echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5 echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6 if test "${ac_cv_lib_dl_dlopen+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char dlopen (); int main () { dlopen (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_lib_dl_dlopen=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_dl_dlopen=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5 echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6 if test $ac_cv_lib_dl_dlopen = yes; then lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" else echo "$as_me:$LINENO: checking for dlopen in -lsvld" >&5 echo $ECHO_N "checking for dlopen in -lsvld... $ECHO_C" >&6 if test "${ac_cv_lib_svld_dlopen+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lsvld $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char dlopen (); int main () { dlopen (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_lib_svld_dlopen=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_svld_dlopen=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_svld_dlopen" >&5 echo "${ECHO_T}$ac_cv_lib_svld_dlopen" >&6 if test $ac_cv_lib_svld_dlopen = yes; then lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld" else echo "$as_me:$LINENO: checking for dld_link in -ldld" >&5 echo $ECHO_N "checking for dld_link in -ldld... $ECHO_C" >&6 if test "${ac_cv_lib_dld_dld_link+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char dld_link (); int main () { dld_link (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_lib_dld_dld_link=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_dld_dld_link=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_dld_dld_link" >&5 echo "${ECHO_T}$ac_cv_lib_dld_dld_link" >&6 if test $ac_cv_lib_dld_dld_link = yes; then lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-dld" fi fi fi fi fi fi ;; esac if test "x$lt_cv_dlopen" != xno; then enable_dlopen=yes else enable_dlopen=no fi case $lt_cv_dlopen in dlopen) save_CPPFLAGS="$CPPFLAGS" test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" save_LDFLAGS="$LDFLAGS" eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" save_LIBS="$LIBS" LIBS="$lt_cv_dlopen_libs $LIBS" echo "$as_me:$LINENO: checking whether a program can dlopen itself" >&5 echo $ECHO_N "checking whether a program can dlopen itself... $ECHO_C" >&6 if test "${lt_cv_dlopen_self+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test "$cross_compiling" = yes; then : lt_cv_dlopen_self=cross else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext < #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif #ifdef __cplusplus extern "C" void exit (int); #endif void fnord() { int i=42;} int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; /* dlclose (self); */ } exit (status); } EOF if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; x$lt_unknown|x*) lt_cv_dlopen_self=no ;; esac else : # compilation failed lt_cv_dlopen_self=no fi fi rm -fr conftest* fi echo "$as_me:$LINENO: result: $lt_cv_dlopen_self" >&5 echo "${ECHO_T}$lt_cv_dlopen_self" >&6 if test "x$lt_cv_dlopen_self" = xyes; then LDFLAGS="$LDFLAGS $link_static_flag" echo "$as_me:$LINENO: checking whether a statically linked program can dlopen itself" >&5 echo $ECHO_N "checking whether a statically linked program can dlopen itself... $ECHO_C" >&6 if test "${lt_cv_dlopen_self_static+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test "$cross_compiling" = yes; then : lt_cv_dlopen_self_static=cross else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext < #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif #ifdef __cplusplus extern "C" void exit (int); #endif void fnord() { int i=42;} int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; /* dlclose (self); */ } exit (status); } EOF if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; x$lt_unknown|x*) lt_cv_dlopen_self_static=no ;; esac else : # compilation failed lt_cv_dlopen_self_static=no fi fi rm -fr conftest* fi echo "$as_me:$LINENO: result: $lt_cv_dlopen_self_static" >&5 echo "${ECHO_T}$lt_cv_dlopen_self_static" >&6 fi CPPFLAGS="$save_CPPFLAGS" LDFLAGS="$save_LDFLAGS" LIBS="$save_LIBS" ;; esac case $lt_cv_dlopen_self in yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; *) enable_dlopen_self=unknown ;; esac case $lt_cv_dlopen_self_static in yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; *) enable_dlopen_self_static=unknown ;; esac fi # The else clause should only fire when bootstrapping the # libtool distribution, otherwise you forgot to ship ltmain.sh # with your package, and you will get complaints that there are # no rules to generate ltmain.sh. if test -f "$ltmain"; then # See if we are running on zsh, and set the options which allow our commands through # without removal of \ escapes. if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi # Now quote all the things that may contain metacharacters while being # careful not to overquote the AC_SUBSTed values. We take copies of the # variables and quote the copies for generation of the libtool script. for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC NM \ SED SHELL STRIP \ libname_spec library_names_spec soname_spec extract_expsyms_cmds \ old_striplib striplib file_magic_cmd finish_cmds finish_eval \ deplibs_check_method reload_flag reload_cmds need_locks \ lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \ lt_cv_sys_global_symbol_to_c_name_address \ sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ old_postinstall_cmds old_postuninstall_cmds \ compiler_CXX \ CC_CXX \ LD_CXX \ lt_prog_compiler_wl_CXX \ lt_prog_compiler_pic_CXX \ lt_prog_compiler_static_CXX \ lt_prog_compiler_no_builtin_flag_CXX \ export_dynamic_flag_spec_CXX \ thread_safe_flag_spec_CXX \ whole_archive_flag_spec_CXX \ enable_shared_with_static_runtimes_CXX \ old_archive_cmds_CXX \ old_archive_from_new_cmds_CXX \ predep_objects_CXX \ postdep_objects_CXX \ predeps_CXX \ postdeps_CXX \ compiler_lib_search_path_CXX \ archive_cmds_CXX \ archive_expsym_cmds_CXX \ postinstall_cmds_CXX \ postuninstall_cmds_CXX \ old_archive_from_expsyms_cmds_CXX \ allow_undefined_flag_CXX \ no_undefined_flag_CXX \ export_symbols_cmds_CXX \ hardcode_libdir_flag_spec_CXX \ hardcode_libdir_flag_spec_ld_CXX \ hardcode_libdir_separator_CXX \ hardcode_automatic_CXX \ module_cmds_CXX \ module_expsym_cmds_CXX \ lt_cv_prog_compiler_c_o_CXX \ exclude_expsyms_CXX \ include_expsyms_CXX; do case $var in old_archive_cmds_CXX | \ old_archive_from_new_cmds_CXX | \ archive_cmds_CXX | \ archive_expsym_cmds_CXX | \ module_cmds_CXX | \ module_expsym_cmds_CXX | \ old_archive_from_expsyms_cmds_CXX | \ export_symbols_cmds_CXX | \ extract_expsyms_cmds | reload_cmds | finish_cmds | \ postinstall_cmds | postuninstall_cmds | \ old_postinstall_cmds | old_postuninstall_cmds | \ sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) # Double-quote double-evaled strings. eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" ;; *) eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" ;; esac done case $lt_echo in *'\$0 --fallback-echo"') lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'` ;; esac cfgfile="$ofile" cat <<__EOF__ >> "$cfgfile" # ### BEGIN LIBTOOL TAG CONFIG: $tagname # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # Shell to use when invoking shell scripts. SHELL=$lt_SHELL # Whether or not to build shared libraries. build_libtool_libs=$enable_shared # Whether or not to build static libraries. build_old_libs=$enable_static # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$archive_cmds_need_lc_CXX # Whether or not to disallow shared libs when runtime libs are static allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_CXX # Whether or not to optimize for fast installation. fast_install=$enable_fast_install # The host system. host_alias=$host_alias host=$host # An echo program that does not interpret backslashes. echo=$lt_echo # The archiver. AR=$lt_AR AR_FLAGS=$lt_AR_FLAGS # A C compiler. LTCC=$lt_LTCC # A language-specific compiler. CC=$lt_compiler_CXX # Is the compiler the GNU C compiler? with_gcc=$GCC_CXX # An ERE matcher. EGREP=$lt_EGREP # The linker used to build libraries. LD=$lt_LD_CXX # Whether we need hard or soft links. LN_S=$lt_LN_S # A BSD-compatible nm program. NM=$lt_NM # A symbol stripping program STRIP=$lt_STRIP # Used to examine libraries when file_magic_cmd begins "file" MAGIC_CMD=$MAGIC_CMD # Used on cygwin: DLL creation program. DLLTOOL="$DLLTOOL" # Used on cygwin: object dumper. OBJDUMP="$OBJDUMP" # Used on cygwin: assembler. AS="$AS" # The name of the directory that contains temporary libtool files. objdir=$objdir # How to create reloadable object files. reload_flag=$lt_reload_flag reload_cmds=$lt_reload_cmds # How to pass a linker flag through the compiler. wl=$lt_lt_prog_compiler_wl_CXX # Object file suffix (normally "o"). objext="$ac_objext" # Old archive suffix (normally "a"). libext="$libext" # Shared library suffix (normally ".so"). shrext_cmds='$shrext_cmds' # Executable file suffix (normally ""). exeext="$exeext" # Additional compiler flags for building library objects. pic_flag=$lt_lt_prog_compiler_pic_CXX pic_mode=$pic_mode # What is the maximum length of a command? max_cmd_len=$lt_cv_sys_max_cmd_len # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX # Must we lock files when doing compilation ? need_locks=$lt_need_locks # Do we need the lib prefix for modules? need_lib_prefix=$need_lib_prefix # Do we need a version for libraries? need_version=$need_version # Whether dlopen is supported. dlopen_support=$enable_dlopen # Whether dlopen of programs is supported. dlopen_self=$enable_dlopen_self # Whether dlopen of statically linked programs is supported. dlopen_self_static=$enable_dlopen_self_static # Compiler flag to prevent dynamic linking. link_static_flag=$lt_lt_prog_compiler_static_CXX # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_CXX # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_CXX # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec=$lt_whole_archive_flag_spec_CXX # Compiler flag to generate thread-safe objects. thread_safe_flag_spec=$lt_thread_safe_flag_spec_CXX # Library versioning type. version_type=$version_type # Format of library name prefix. libname_spec=$lt_libname_spec # List of archive names. First name is the real one, the rest are links. # The last name is the one that the linker finds with -lNAME. library_names_spec=$lt_library_names_spec # The coded name of the library, if different from the real name. soname_spec=$lt_soname_spec # Commands used to build and install an old-style archive. RANLIB=$lt_RANLIB old_archive_cmds=$lt_old_archive_cmds_CXX old_postinstall_cmds=$lt_old_postinstall_cmds old_postuninstall_cmds=$lt_old_postuninstall_cmds # Create an old-style archive from a shared archive. old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_CXX # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_CXX # Commands used to build and install a shared archive. archive_cmds=$lt_archive_cmds_CXX archive_expsym_cmds=$lt_archive_expsym_cmds_CXX postinstall_cmds=$lt_postinstall_cmds postuninstall_cmds=$lt_postuninstall_cmds # Commands used to build a loadable module (assumed same as above if empty) module_cmds=$lt_module_cmds_CXX module_expsym_cmds=$lt_module_expsym_cmds_CXX # Commands to strip libraries. old_striplib=$lt_old_striplib striplib=$lt_striplib # Dependencies to place before the objects being linked to create a # shared library. predep_objects=$lt_predep_objects_CXX # Dependencies to place after the objects being linked to create a # shared library. postdep_objects=$lt_postdep_objects_CXX # Dependencies to place before the objects being linked to create a # shared library. predeps=$lt_predeps_CXX # Dependencies to place after the objects being linked to create a # shared library. postdeps=$lt_postdeps_CXX # The library search path used internally by the compiler when linking # a shared library. compiler_lib_search_path=$lt_compiler_lib_search_path_CXX # Method to check whether dependent libraries are shared objects. deplibs_check_method=$lt_deplibs_check_method # Command to use when deplibs_check_method == file_magic. file_magic_cmd=$lt_file_magic_cmd # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_allow_undefined_flag_CXX # Flag that forces no undefined symbols. no_undefined_flag=$lt_no_undefined_flag_CXX # Commands used to finish a libtool library installation in a directory. finish_cmds=$lt_finish_cmds # Same as above, but a single script fragment to be evaled but not shown. finish_eval=$lt_finish_eval # Take the output of nm and produce a listing of raw symbols and C names. global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe # Transform the output of nm in a proper C declaration global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl # Transform the output of nm in a C name address pair global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address # This is the shared library runtime path variable. runpath_var=$runpath_var # This is the shared library path variable. shlibpath_var=$shlibpath_var # Is shlibpath searched before the hard-coded library search path? shlibpath_overrides_runpath=$shlibpath_overrides_runpath # How to hardcode a shared library path into an executable. hardcode_action=$hardcode_action_CXX # Whether we should hardcode library paths into libraries. hardcode_into_libs=$hardcode_into_libs # Flag to hardcode \$libdir into a binary during linking. # This must work even if \$libdir does not exist. hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_CXX # If ld is used when linking, flag to hardcode \$libdir into # a binary during linking. This must work even if \$libdir does # not exist. hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_CXX # Whether we need a single -rpath flag with a separated argument. hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX # Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the # resulting binary. hardcode_direct=$hardcode_direct_CXX # Set to yes if using the -LDIR flag during linking hardcodes DIR into the # resulting binary. hardcode_minus_L=$hardcode_minus_L_CXX # Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into # the resulting binary. hardcode_shlibpath_var=$hardcode_shlibpath_var_CXX # Set to yes if building a shared library automatically hardcodes DIR into the library # and all subsequent libraries and executables linked against it. hardcode_automatic=$hardcode_automatic_CXX # Variables whose values should be saved in libtool wrapper scripts and # restored at relink time. variables_saved_for_relink="$variables_saved_for_relink" # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$link_all_deplibs_CXX # Compile-time system search path for libraries sys_lib_search_path_spec=$lt_sys_lib_search_path_spec # Run-time system search path for libraries sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec # Fix the shell variable \$srcfile for the compiler. fix_srcfile_path="$fix_srcfile_path_CXX" # Set to yes if exported symbols are required. always_export_symbols=$always_export_symbols_CXX # The commands to list exported symbols. export_symbols_cmds=$lt_export_symbols_cmds_CXX # The commands to extract the exported symbol list from a shared archive. extract_expsyms_cmds=$lt_extract_expsyms_cmds # Symbols that should not be listed in the preloaded symbols. exclude_expsyms=$lt_exclude_expsyms_CXX # Symbols that must always be exported. include_expsyms=$lt_include_expsyms_CXX # ### END LIBTOOL TAG CONFIG: $tagname __EOF__ else # If there is no Makefile yet, we rely on a make rule to execute # `config.status --recheck' to rerun these tests and create the # libtool script then. ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` if test -f "$ltmain_in"; then test -f Makefile && make "$ltmain" fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu CC=$lt_save_CC LDCXX=$LD LD=$lt_save_LD GCC=$lt_save_GCC with_gnu_ldcxx=$with_gnu_ld with_gnu_ld=$lt_save_with_gnu_ld lt_cv_path_LDCXX=$lt_cv_path_LD lt_cv_path_LD=$lt_save_path_LD lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld else tagname="" fi ;; F77) if test -n "$F77" && test "X$F77" != "Xno"; then ac_ext=f ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5' ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_f77_compiler_gnu archive_cmds_need_lc_F77=no allow_undefined_flag_F77= always_export_symbols_F77=no archive_expsym_cmds_F77= export_dynamic_flag_spec_F77= hardcode_direct_F77=no hardcode_libdir_flag_spec_F77= hardcode_libdir_flag_spec_ld_F77= hardcode_libdir_separator_F77= hardcode_minus_L_F77=no hardcode_automatic_F77=no module_cmds_F77= module_expsym_cmds_F77= link_all_deplibs_F77=unknown old_archive_cmds_F77=$old_archive_cmds no_undefined_flag_F77= whole_archive_flag_spec_F77= enable_shared_with_static_runtimes_F77=no # Source file extension for f77 test sources. ac_ext=f # Object file extension for compiled f77 test sources. objext=o objext_F77=$objext # Code to be used in simple compile tests lt_simple_compile_test_code=" subroutine t\n return\n end\n" # Code to be used in simple link tests lt_simple_link_test_code=" program t\n end\n" # ltmain only uses $CC for tagged configurations so make sure $CC is set. # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # Allow CC to be a program name with arguments. compiler=$CC # Allow CC to be a program name with arguments. lt_save_CC="$CC" CC=${F77-"f77"} compiler=$CC compiler_F77=$CC cc_basename=`$echo X"$compiler" | $Xsed -e 's%^.*/%%'` echo "$as_me:$LINENO: checking if libtool supports shared libraries" >&5 echo $ECHO_N "checking if libtool supports shared libraries... $ECHO_C" >&6 echo "$as_me:$LINENO: result: $can_build_shared" >&5 echo "${ECHO_T}$can_build_shared" >&6 echo "$as_me:$LINENO: checking whether to build shared libraries" >&5 echo $ECHO_N "checking whether to build shared libraries... $ECHO_C" >&6 test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case "$host_os" in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix4* | aix5*) test "$enable_shared" = yes && enable_static=no ;; esac echo "$as_me:$LINENO: result: $enable_shared" >&5 echo "${ECHO_T}$enable_shared" >&6 echo "$as_me:$LINENO: checking whether to build static libraries" >&5 echo $ECHO_N "checking whether to build static libraries... $ECHO_C" >&6 # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes echo "$as_me:$LINENO: result: $enable_static" >&5 echo "${ECHO_T}$enable_static" >&6 test "$ld_shlibs_F77" = no && can_build_shared=no GCC_F77="$G77" LD_F77="$LD" lt_prog_compiler_wl_F77= lt_prog_compiler_pic_F77= lt_prog_compiler_static_F77= echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5 echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6 if test "$GCC" = yes; then lt_prog_compiler_wl_F77='-Wl,' lt_prog_compiler_static_F77='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static_F77='-Bstatic' fi ;; amigaos*) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. lt_prog_compiler_pic_F77='-m68020 -resident32 -malways-restore-a4' ;; beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | pw32* | os2*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). lt_prog_compiler_pic_F77='-DDLL_EXPORT' ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic_F77='-fno-common' ;; msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. lt_prog_compiler_can_build_shared_F77=no enable_shared=no ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic_F77=-Kconform_pic fi ;; hpux*) # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case "$host_cpu" in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic_F77='-fPIC' ;; esac ;; *) lt_prog_compiler_pic_F77='-fPIC' ;; esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in aix*) lt_prog_compiler_wl_F77='-Wl,' if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static_F77='-Bstatic' else lt_prog_compiler_static_F77='-bnso -bI:/lib/syscalls.exp' fi ;; mingw* | pw32* | os2*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). lt_prog_compiler_pic_F77='-DDLL_EXPORT' ;; hpux9* | hpux10* | hpux11*) lt_prog_compiler_wl_F77='-Wl,' # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case "$host_cpu" in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic_F77='+Z' ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? lt_prog_compiler_static_F77='${wl}-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) lt_prog_compiler_wl_F77='-Wl,' # PIC (with -KPIC) is the default. lt_prog_compiler_static_F77='-non_shared' ;; newsos6) lt_prog_compiler_pic_F77='-KPIC' lt_prog_compiler_static_F77='-Bstatic' ;; linux*) case $CC in icc* | ecc*) lt_prog_compiler_wl_F77='-Wl,' lt_prog_compiler_pic_F77='-KPIC' lt_prog_compiler_static_F77='-static' ;; ccc*) lt_prog_compiler_wl_F77='-Wl,' # All Alpha code is PIC. lt_prog_compiler_static_F77='-non_shared' ;; esac ;; osf3* | osf4* | osf5*) lt_prog_compiler_wl_F77='-Wl,' # All OSF/1 code is PIC. lt_prog_compiler_static_F77='-non_shared' ;; sco3.2v5*) lt_prog_compiler_pic_F77='-Kpic' lt_prog_compiler_static_F77='-dn' ;; solaris*) lt_prog_compiler_wl_F77='-Wl,' lt_prog_compiler_pic_F77='-KPIC' lt_prog_compiler_static_F77='-Bstatic' ;; sunos4*) lt_prog_compiler_wl_F77='-Qoption ld ' lt_prog_compiler_pic_F77='-PIC' lt_prog_compiler_static_F77='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) lt_prog_compiler_wl_F77='-Wl,' lt_prog_compiler_pic_F77='-KPIC' lt_prog_compiler_static_F77='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec ;then lt_prog_compiler_pic_F77='-Kconform_pic' lt_prog_compiler_static_F77='-Bstatic' fi ;; uts4*) lt_prog_compiler_pic_F77='-pic' lt_prog_compiler_static_F77='-Bstatic' ;; *) lt_prog_compiler_can_build_shared_F77=no ;; esac fi echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_F77" >&5 echo "${ECHO_T}$lt_prog_compiler_pic_F77" >&6 # # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic_F77"; then echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic_F77 works" >&5 echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic_F77 works... $ECHO_C" >&6 if test "${lt_prog_compiler_pic_works_F77+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lt_prog_compiler_pic_works_F77=no ac_outfile=conftest.$ac_objext printf "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$lt_prog_compiler_pic_F77" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:13376: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:13380: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings if test ! -s conftest.err; then lt_prog_compiler_pic_works_F77=yes fi fi $rm conftest* fi echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_works_F77" >&5 echo "${ECHO_T}$lt_prog_compiler_pic_works_F77" >&6 if test x"$lt_prog_compiler_pic_works_F77" = xyes; then case $lt_prog_compiler_pic_F77 in "" | " "*) ;; *) lt_prog_compiler_pic_F77=" $lt_prog_compiler_pic_F77" ;; esac else lt_prog_compiler_pic_F77= lt_prog_compiler_can_build_shared_F77=no fi fi case "$host_os" in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) lt_prog_compiler_pic_F77= ;; *) lt_prog_compiler_pic_F77="$lt_prog_compiler_pic_F77" ;; esac echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5 echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6 if test "${lt_cv_prog_compiler_c_o_F77+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lt_cv_prog_compiler_c_o_F77=no $rm -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out printf "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:13436: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:13440: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings if test ! -s out/conftest.err; then lt_cv_prog_compiler_c_o_F77=yes fi fi chmod u+w . $rm conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files $rm out/* && rmdir out cd .. rmdir conftest $rm conftest* fi echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o_F77" >&5 echo "${ECHO_T}$lt_cv_prog_compiler_c_o_F77" >&6 hard_links="nottested" if test "$lt_cv_prog_compiler_c_o_F77" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user echo "$as_me:$LINENO: checking if we can lock with hard links" >&5 echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&6 hard_links=yes $rm conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no echo "$as_me:$LINENO: result: $hard_links" >&5 echo "${ECHO_T}$hard_links" >&6 if test "$hard_links" = no; then { echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} need_locks=warn fi else need_locks=no fi echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6 runpath_var= allow_undefined_flag_F77= enable_shared_with_static_runtimes_F77=no archive_cmds_F77= archive_expsym_cmds_F77= old_archive_From_new_cmds_F77= old_archive_from_expsyms_cmds_F77= export_dynamic_flag_spec_F77= whole_archive_flag_spec_F77= thread_safe_flag_spec_F77= hardcode_libdir_flag_spec_F77= hardcode_libdir_flag_spec_ld_F77= hardcode_libdir_separator_F77= hardcode_direct_F77=no hardcode_minus_L_F77=no hardcode_shlibpath_var_F77=unsupported link_all_deplibs_F77=unknown hardcode_automatic_F77=no module_cmds_F77= module_expsym_cmds_F77= always_export_symbols_F77=no export_symbols_cmds_F77='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' # include_expsyms should be a list of space-separated symbols to be *always* # included in the symbol list include_expsyms_F77= # exclude_expsyms can be an extended regexp of symbols to exclude # it will be wrapped by ` (' and `)$', so one must not match beginning or # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', # as well as any symbol that contains `d'. exclude_expsyms_F77="_GLOBAL_OFFSET_TABLE_" # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out # platforms (ab)use it in PIC code, but their linkers get confused if # the symbol is explicitly referenced. Since portable code cannot # rely on this symbol name, it's probably fine to never include it in # preloaded symbol tables. extract_expsyms_cmds= case $host_os in cygwin* | mingw* | pw32*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test "$GCC" != yes; then with_gnu_ld=no fi ;; openbsd*) with_gnu_ld=no ;; esac ld_shlibs_F77=yes if test "$with_gnu_ld" = yes; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='${wl}' # See if GNU ld supports shared libraries. case $host_os in aix3* | aix4* | aix5*) # On AIX/PPC, the GNU linker is very broken if test "$host_cpu" != ia64; then ld_shlibs_F77=no cat <&2 *** Warning: the GNU linker, at least up to release 2.9.1, is reported *** to be unable to reliably create shared libraries on AIX. *** Therefore, libtool is disabling shared libraries support. If you *** really care for shared libraries, you may want to modify your PATH *** so that a non-GNU linker is found, and then restart. EOF fi ;; amigaos*) archive_cmds_F77='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec_F77='-L$libdir' hardcode_minus_L_F77=yes # Samuel A. Falvo II reports # that the semantics of dynamic libraries on AmigaOS, at least up # to version 4, is to share data among multiple programs linked # with the same dynamic library. Since this doesn't match the # behavior of shared libraries on other platforms, we can't use # them. ld_shlibs_F77=no ;; beos*) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then allow_undefined_flag_F77=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME archive_cmds_F77='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else ld_shlibs_F77=no fi ;; cygwin* | mingw* | pw32*) # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, F77) is actually meaningless, # as there is no search path for DLLs. hardcode_libdir_flag_spec_F77='-L$libdir' allow_undefined_flag_F77=unsupported always_export_symbols_F77=no enable_shared_with_static_runtimes_F77=yes export_symbols_cmds_F77='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGS] /s/.* \([^ ]*\)/\1 DATA/'\'' | $SED -e '\''/^[AITW] /s/.* //'\'' | sort | uniq > $export_symbols' if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... archive_expsym_cmds_F77='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' else ld_shlibs=no fi ;; netbsd*) if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then archive_cmds_F77='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' fi ;; solaris* | sysv5*) if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then ld_shlibs_F77=no cat <&2 *** Warning: The releases 2.8.* of the GNU linker cannot reliably *** create shared libraries on Solaris systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.9.1 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. EOF elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs_F77=no fi ;; sunos4*) archive_cmds_F77='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= hardcode_direct_F77=yes hardcode_shlibpath_var_F77=no ;; linux*) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then tmp_archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_cmds_F77="$tmp_archive_cmds" supports_anon_versioning=no case `$LD -v 2>/dev/null` in *\ 01.* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... *\ 2.11.*) ;; # other 2.11 versions *) supports_anon_versioning=yes ;; esac if test $supports_anon_versioning = yes; then archive_expsym_cmds_F77='$echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ $echo "local: *; };" >> $output_objdir/$libname.ver~ $CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' else archive_expsym_cmds_F77="$tmp_archive_cmds" fi else ld_shlibs_F77=no fi ;; *) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs_F77=no fi ;; esac if test "$ld_shlibs_F77" = yes; then runpath_var=LD_RUN_PATH hardcode_libdir_flag_spec_F77='${wl}--rpath ${wl}$libdir' export_dynamic_flag_spec_F77='${wl}--export-dynamic' # ancient GNU ld didn't support --whole-archive et. al. if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then whole_archive_flag_spec_F77="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else whole_archive_flag_spec_F77= fi fi else # PORTME fill in a description of your system's linker (not GNU ld) case $host_os in aix3*) allow_undefined_flag_F77=unsupported always_export_symbols_F77=yes archive_expsym_cmds_F77='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. hardcode_minus_L_F77=yes if test "$GCC" = yes && test -z "$link_static_flag"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. hardcode_direct_F77=unsupported fi ;; aix4* | aix5*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm if $NM -V 2>&1 | grep 'GNU' > /dev/null; then export_symbols_cmds_F77='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' else export_symbols_cmds_F77='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' fi aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[23]|aix4.[23].*|aix5*) for ld_flag in $LDFLAGS; do if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then aix_use_runtimelinking=yes break fi done esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. archive_cmds_F77='' hardcode_direct_F77=yes hardcode_libdir_separator_F77=':' link_all_deplibs_F77=yes if test "$GCC" = yes; then case $host_os in aix4.012|aix4.012.*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && \ strings "$collect2name" | grep resolve_lib_name >/dev/null then # We have reworked collect2 hardcode_direct_F77=yes else # We have old collect2 hardcode_direct_F77=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking hardcode_minus_L_F77=yes hardcode_libdir_flag_spec_F77='-L$libdir' hardcode_libdir_separator_F77= fi esac shared_flag='-shared' else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. always_export_symbols_F77=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. allow_undefined_flag_F77='-berok' # Determine the default libpath from the value encoded in an empty executable. cat >conftest.$ac_ext <<_ACEOF program main end _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_f77_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'` # Check for a 64-bit object if we didn't find anything. if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'`; fi else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi hardcode_libdir_flag_spec_F77='${wl}-blibpath:$libdir:'"$aix_libpath" archive_expsym_cmds_F77="\$CC"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then hardcode_libdir_flag_spec_F77='${wl}-R $libdir:/usr/lib:/lib' allow_undefined_flag_F77="-z nodefs" archive_expsym_cmds_F77="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an empty executable. cat >conftest.$ac_ext <<_ACEOF program main end _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_f77_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'` # Check for a 64-bit object if we didn't find anything. if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'`; fi else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi hardcode_libdir_flag_spec_F77='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. no_undefined_flag_F77=' ${wl}-bernotok' allow_undefined_flag_F77=' ${wl}-berok' # -bexpall does not export symbols beginning with underscore (_) always_export_symbols_F77=yes # Exported symbols can be pulled into shared objects from archives whole_archive_flag_spec_F77=' ' archive_cmds_need_lc_F77=yes # This is similar to how AIX traditionally builds it's shared libraries. archive_expsym_cmds_F77="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}-bE:$export_symbols ${wl}-bnoentry${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; amigaos*) archive_cmds_F77='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec_F77='-L$libdir' hardcode_minus_L_F77=yes # see comment about different semantics on the GNU ld section ld_shlibs_F77=no ;; bsdi4*) export_dynamic_flag_spec_F77=-rdynamic ;; cygwin* | mingw* | pw32*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. hardcode_libdir_flag_spec_F77=' ' allow_undefined_flag_F77=unsupported # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. archive_cmds_F77='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames=' # The linker will automatically build a .lib file if we build a DLL. old_archive_From_new_cmds_F77='true' # FIXME: Should let the user specify the lib program. old_archive_cmds_F77='lib /OUT:$oldlib$oldobjs$old_deplibs' fix_srcfile_path='`cygpath -w "$srcfile"`' enable_shared_with_static_runtimes_F77=yes ;; darwin* | rhapsody*) if test "$GXX" = yes ; then archive_cmds_need_lc_F77=no case "$host_os" in rhapsody* | darwin1.[012]) allow_undefined_flag_F77='-undefined suppress' ;; *) # Darwin 1.3 on if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then allow_undefined_flag_F77='-flat_namespace -undefined suppress' else case ${MACOSX_DEPLOYMENT_TARGET} in 10.[012]) allow_undefined_flag_F77='-flat_namespace -undefined suppress' ;; 10.*) allow_undefined_flag_F77='-undefined dynamic_lookup' ;; esac fi ;; esac lt_int_apple_cc_single_mod=no output_verbose_link_cmd='echo' if $CC -dumpspecs 2>&1 | grep 'single_module' >/dev/null ; then lt_int_apple_cc_single_mod=yes fi if test "X$lt_int_apple_cc_single_mod" = Xyes ; then archive_cmds_F77='$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' else archive_cmds_F77='$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring' fi module_cmds_F77='$CC ${wl}-bind_at_load $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's if test "X$lt_int_apple_cc_single_mod" = Xyes ; then archive_expsym_cmds_F77='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' else archive_expsym_cmds_F77='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' fi module_expsym_cmds_F77='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' hardcode_direct_F77=no hardcode_automatic_F77=yes hardcode_shlibpath_var_F77=unsupported whole_archive_flag_spec_F77='-all_load $convenience' link_all_deplibs_F77=yes else ld_shlibs_F77=no fi ;; dgux*) archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec_F77='-L$libdir' hardcode_shlibpath_var_F77=no ;; freebsd1*) ld_shlibs_F77=no ;; # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor # support. Future versions do this automatically, but an explicit c++rt0.o # does not break anything, and helps significantly (at the cost of a little # extra space). freebsd2.2*) archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' hardcode_libdir_flag_spec_F77='-R$libdir' hardcode_direct_F77=yes hardcode_shlibpath_var_F77=no ;; # Unfortunately, older versions of FreeBSD 2 do not have this feature. freebsd2*) archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_direct_F77=yes hardcode_minus_L_F77=yes hardcode_shlibpath_var_F77=no ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. freebsd* | kfreebsd*-gnu) archive_cmds_F77='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec_F77='-R$libdir' hardcode_direct_F77=yes hardcode_shlibpath_var_F77=no ;; hpux9*) if test "$GCC" = yes; then archive_cmds_F77='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else archive_cmds_F77='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' fi hardcode_libdir_flag_spec_F77='${wl}+b ${wl}$libdir' hardcode_libdir_separator_F77=: hardcode_direct_F77=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L_F77=yes export_dynamic_flag_spec_F77='${wl}-E' ;; hpux10* | hpux11*) if test "$GCC" = yes -a "$with_gnu_ld" = no; then case "$host_cpu" in hppa*64*|ia64*) archive_cmds_F77='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds_F77='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else case "$host_cpu" in hppa*64*|ia64*) archive_cmds_F77='$LD -b +h $soname -o $lib $libobjs $deplibs $linker_flags' ;; *) archive_cmds_F77='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' ;; esac fi if test "$with_gnu_ld" = no; then case "$host_cpu" in hppa*64*) hardcode_libdir_flag_spec_F77='${wl}+b ${wl}$libdir' hardcode_libdir_flag_spec_ld_F77='+b $libdir' hardcode_libdir_separator_F77=: hardcode_direct_F77=no hardcode_shlibpath_var_F77=no ;; ia64*) hardcode_libdir_flag_spec_F77='-L$libdir' hardcode_direct_F77=no hardcode_shlibpath_var_F77=no # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L_F77=yes ;; *) hardcode_libdir_flag_spec_F77='${wl}+b ${wl}$libdir' hardcode_libdir_separator_F77=: hardcode_direct_F77=yes export_dynamic_flag_spec_F77='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L_F77=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) if test "$GCC" = yes; then archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else archive_cmds_F77='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' hardcode_libdir_flag_spec_ld_F77='-rpath $libdir' fi hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_F77=: link_all_deplibs_F77=yes ;; netbsd*) if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else archive_cmds_F77='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF fi hardcode_libdir_flag_spec_F77='-R$libdir' hardcode_direct_F77=yes hardcode_shlibpath_var_F77=no ;; newsos6) archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct_F77=yes hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_F77=: hardcode_shlibpath_var_F77=no ;; openbsd*) hardcode_direct_F77=yes hardcode_shlibpath_var_F77=no if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then archive_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec_F77='${wl}-rpath,$libdir' export_dynamic_flag_spec_F77='${wl}-E' else case $host_os in openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec_F77='-R$libdir' ;; *) archive_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec_F77='${wl}-rpath,$libdir' ;; esac fi ;; os2*) hardcode_libdir_flag_spec_F77='-L$libdir' hardcode_minus_L_F77=yes allow_undefined_flag_F77=unsupported archive_cmds_F77='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' old_archive_From_new_cmds_F77='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' ;; osf3*) if test "$GCC" = yes; then allow_undefined_flag_F77=' ${wl}-expect_unresolved ${wl}\*' archive_cmds_F77='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else allow_undefined_flag_F77=' -expect_unresolved \*' archive_cmds_F77='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' fi hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_F77=: ;; osf4* | osf5*) # as osf3* with the addition of -msym flag if test "$GCC" = yes; then allow_undefined_flag_F77=' ${wl}-expect_unresolved ${wl}\*' archive_cmds_F77='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir' else allow_undefined_flag_F77=' -expect_unresolved \*' archive_cmds_F77='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' archive_expsym_cmds_F77='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~ $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib~$rm $lib.exp' # Both c and cxx compiler support -rpath directly hardcode_libdir_flag_spec_F77='-rpath $libdir' fi hardcode_libdir_separator_F77=: ;; sco3.2v5*) archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var_F77=no export_dynamic_flag_spec_F77='${wl}-Bexport' runpath_var=LD_RUN_PATH hardcode_runpath_var=yes ;; solaris*) no_undefined_flag_F77=' -z text' if test "$GCC" = yes; then archive_cmds_F77='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_F77='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp' else archive_cmds_F77='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' archive_expsym_cmds_F77='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' fi hardcode_libdir_flag_spec_F77='-R$libdir' hardcode_shlibpath_var_F77=no case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) # Supported since Solaris 2.6 (maybe 2.5.1?) whole_archive_flag_spec_F77='-z allextract$convenience -z defaultextract' ;; esac link_all_deplibs_F77=yes ;; sunos4*) if test "x$host_vendor" = xsequent; then # Use $CC to link under sequent, because it throws in some extra .o # files that make .init and .fini sections work. archive_cmds_F77='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds_F77='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' fi hardcode_libdir_flag_spec_F77='-L$libdir' hardcode_direct_F77=yes hardcode_minus_L_F77=yes hardcode_shlibpath_var_F77=no ;; sysv4) case $host_vendor in sni) archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct_F77=yes # is this really true??? ;; siemens) ## LD is ld it makes a PLAMLIB ## CC just makes a GrossModule. archive_cmds_F77='$LD -G -o $lib $libobjs $deplibs $linker_flags' reload_cmds_F77='$CC -r -o $output$reload_objs' hardcode_direct_F77=no ;; motorola) archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct_F77=no #Motorola manual says yes, but my tests say they lie ;; esac runpath_var='LD_RUN_PATH' hardcode_shlibpath_var_F77=no ;; sysv4.3*) archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var_F77=no export_dynamic_flag_spec_F77='-Bexport' ;; sysv4*MP*) if test -d /usr/nec; then archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var_F77=no runpath_var=LD_RUN_PATH hardcode_runpath_var=yes ld_shlibs_F77=yes fi ;; sysv4.2uw2*) archive_cmds_F77='$LD -G -o $lib $libobjs $deplibs $linker_flags' hardcode_direct_F77=yes hardcode_minus_L_F77=no hardcode_shlibpath_var_F77=no hardcode_runpath_var=yes runpath_var=LD_RUN_PATH ;; sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[78]* | unixware7*) no_undefined_flag_F77='${wl}-z ${wl}text' if test "$GCC" = yes; then archive_cmds_F77='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds_F77='$CC -G ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' fi runpath_var='LD_RUN_PATH' hardcode_shlibpath_var_F77=no ;; sysv5*) no_undefined_flag_F77=' -z text' # $CC -shared without GNU ld will not create a library from C++ # object files and a static libstdc++, better avoid it by now archive_cmds_F77='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' archive_expsym_cmds_F77='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' hardcode_libdir_flag_spec_F77= hardcode_shlibpath_var_F77=no runpath_var='LD_RUN_PATH' ;; uts4*) archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec_F77='-L$libdir' hardcode_shlibpath_var_F77=no ;; *) ld_shlibs_F77=no ;; esac fi echo "$as_me:$LINENO: result: $ld_shlibs_F77" >&5 echo "${ECHO_T}$ld_shlibs_F77" >&6 test "$ld_shlibs_F77" = no && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi # # Do we need to explicitly link libc? # case "x$archive_cmds_need_lc_F77" in x|xyes) # Assume -lc should be added archive_cmds_need_lc_F77=yes if test "$enable_shared" = yes && test "$GCC" = yes; then case $archive_cmds_F77 in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5 echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6 $rm conftest* printf "$lt_simple_compile_test_code" > conftest.$ac_ext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$lt_prog_compiler_wl_F77 compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$allow_undefined_flag_F77 allow_undefined_flag_F77= if { (eval echo "$as_me:$LINENO: \"$archive_cmds_F77 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\"") >&5 (eval $archive_cmds_F77 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } then archive_cmds_need_lc_F77=no else archive_cmds_need_lc_F77=yes fi allow_undefined_flag_F77=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $rm conftest* echo "$as_me:$LINENO: result: $archive_cmds_need_lc_F77" >&5 echo "${ECHO_T}$archive_cmds_need_lc_F77" >&6 ;; esac fi ;; esac echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5 echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&6 library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=".so" postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" if test "$GCC" = yes; then sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then # if the path contains ";" then we assume it to be the separator # otherwise default to the standard path separator (i.e. ":") - it is # assumed that no part of a normal pathname contains ";" but that should # okay in the real world where ";" in dirpaths is itself problematic. sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi else sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" fi need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='${libname}${release}${shared_ext}$major' ;; aix4* | aix5*) version_type=linux need_lib_prefix=no need_version=no hardcode_into_libs=yes if test "$host_cpu" = ia64; then # AIX 5 supports IA64 library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line `#! .'. This would cause the generated library to # depend on `.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[01] | aix4.[01].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then : else can_build_shared=no fi ;; esac # AIX (on Power*) has no versioning support, so currently we can not hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' else # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='${libname}${release}.a $libname.a' soname_spec='${libname}${release}${shared_ext}$major' fi shlibpath_var=LIBPATH fi ;; amigaos*) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; beos*) library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi4*) version_type=linux need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no case $GCC,$host_os in yes,cygwin* | yes,mingw* | yes,pw32*) library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $rm \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" ;; mingw*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then # It is most probably a Windows format PATH printed by # mingw gcc, but we are running on Cygwin. Gcc prints its search # path with ; separators, and with drive letters. We can handle the # drive letters (cygwin fileutils understands them), so leave them, # especially as we might pass files found there to a mingw objdump, # which wouldn't understand a cygwinified path. Ahh. sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/./-/g'`${versuffix}${shared_ext}' ;; esac ;; *) library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' ;; esac dynamic_linker='Win32 ld.exe' # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext' soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='$(test .$module = .yes && echo .so || echo .dylib)' # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same. if test "$GCC" = yes; then sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"` else sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib' fi sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd1*) dynamic_linker=no ;; kfreebsd*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='GNU ld.so' ;; freebsd*) objformat=`test -x /usr/bin/objformat && /usr/bin/objformat || echo aout` version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2*) shlibpath_overrides_runpath=yes ;; freebsd3.01* | freebsdelf3.01*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; *) # from 3.2 on shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; esac ;; gnu*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case "$host_cpu" in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' if test "X$HPUX_IA64_MODE" = X32; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555. postinstall_cmds='chmod 555 $lib' ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then version_type=linux else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; # This must be Linux ELF. linux*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # find out which ABI we are using libsuff= case "$host_cpu" in x86_64*|s390x*|powerpc64*) echo '#line 14750 "configure"' > conftest.$ac_ext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then case `/usr/bin/file conftest.$ac_objext` in *64-bit*) libsuff=64 sys_lib_search_path_spec="/lib${libsuff} /usr/lib${libsuff} /usr/local/lib${libsuff}" ;; esac fi rm -rf conftest* ;; esac # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then lt_ld_extra=`$SED -e 's/:,\t/ /g;s/=^=*$//;s/=^= * / /g' /etc/ld.so.conf | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib${libsuff} /usr/lib${libsuff} $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; knetbsd*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='GNU ld.so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; nto-qnx*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; openbsd*) version_type=sunos need_lib_prefix=no need_version=yes library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[89] | openbsd2.[89].*) shlibpath_overrides_runpath=no ;; *) shlibpath_overrides_runpath=yes ;; esac else shlibpath_overrides_runpath=yes fi ;; os2*) libname_spec='$name' shrext_cmds=".dll" need_lib_prefix=no library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; sco3.2v5*) version_type=osf soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH ;; solaris*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test "$with_gnu_ld" = yes; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no export_dynamic_flag_spec='${wl}-Blargedynsym' runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec ;then version_type=linux library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; uts4*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac echo "$as_me:$LINENO: result: $dynamic_linker" >&5 echo "${ECHO_T}$dynamic_linker" >&6 test "$dynamic_linker" = no && can_build_shared=no echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5 echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6 hardcode_action_F77= if test -n "$hardcode_libdir_flag_spec_F77" || \ test -n "$runpath_var F77" || \ test "X$hardcode_automatic_F77"="Xyes" ; then # We can hardcode non-existant directories. if test "$hardcode_direct_F77" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, F77)" != no && test "$hardcode_minus_L_F77" != no; then # Linking always hardcodes the temporary library directory. hardcode_action_F77=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. hardcode_action_F77=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. hardcode_action_F77=unsupported fi echo "$as_me:$LINENO: result: $hardcode_action_F77" >&5 echo "${ECHO_T}$hardcode_action_F77" >&6 if test "$hardcode_action_F77" = relink; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || test "$enable_shared" = no; then # Fast installation is not necessary enable_fast_install=needless fi striplib= old_striplib= echo "$as_me:$LINENO: checking whether stripping libraries is possible" >&5 echo $ECHO_N "checking whether stripping libraries is possible... $ECHO_C" >&6 if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" test -z "$striplib" && striplib="$STRIP --strip-unneeded" echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6 else # FIXME - insert some real tests, host_os isn't really good enough case $host_os in darwin*) if test -n "$STRIP" ; then striplib="$STRIP -x" echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi ;; *) echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 ;; esac fi # The else clause should only fire when bootstrapping the # libtool distribution, otherwise you forgot to ship ltmain.sh # with your package, and you will get complaints that there are # no rules to generate ltmain.sh. if test -f "$ltmain"; then # See if we are running on zsh, and set the options which allow our commands through # without removal of \ escapes. if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi # Now quote all the things that may contain metacharacters while being # careful not to overquote the AC_SUBSTed values. We take copies of the # variables and quote the copies for generation of the libtool script. for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC NM \ SED SHELL STRIP \ libname_spec library_names_spec soname_spec extract_expsyms_cmds \ old_striplib striplib file_magic_cmd finish_cmds finish_eval \ deplibs_check_method reload_flag reload_cmds need_locks \ lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \ lt_cv_sys_global_symbol_to_c_name_address \ sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ old_postinstall_cmds old_postuninstall_cmds \ compiler_F77 \ CC_F77 \ LD_F77 \ lt_prog_compiler_wl_F77 \ lt_prog_compiler_pic_F77 \ lt_prog_compiler_static_F77 \ lt_prog_compiler_no_builtin_flag_F77 \ export_dynamic_flag_spec_F77 \ thread_safe_flag_spec_F77 \ whole_archive_flag_spec_F77 \ enable_shared_with_static_runtimes_F77 \ old_archive_cmds_F77 \ old_archive_from_new_cmds_F77 \ predep_objects_F77 \ postdep_objects_F77 \ predeps_F77 \ postdeps_F77 \ compiler_lib_search_path_F77 \ archive_cmds_F77 \ archive_expsym_cmds_F77 \ postinstall_cmds_F77 \ postuninstall_cmds_F77 \ old_archive_from_expsyms_cmds_F77 \ allow_undefined_flag_F77 \ no_undefined_flag_F77 \ export_symbols_cmds_F77 \ hardcode_libdir_flag_spec_F77 \ hardcode_libdir_flag_spec_ld_F77 \ hardcode_libdir_separator_F77 \ hardcode_automatic_F77 \ module_cmds_F77 \ module_expsym_cmds_F77 \ lt_cv_prog_compiler_c_o_F77 \ exclude_expsyms_F77 \ include_expsyms_F77; do case $var in old_archive_cmds_F77 | \ old_archive_from_new_cmds_F77 | \ archive_cmds_F77 | \ archive_expsym_cmds_F77 | \ module_cmds_F77 | \ module_expsym_cmds_F77 | \ old_archive_from_expsyms_cmds_F77 | \ export_symbols_cmds_F77 | \ extract_expsyms_cmds | reload_cmds | finish_cmds | \ postinstall_cmds | postuninstall_cmds | \ old_postinstall_cmds | old_postuninstall_cmds | \ sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) # Double-quote double-evaled strings. eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" ;; *) eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" ;; esac done case $lt_echo in *'\$0 --fallback-echo"') lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'` ;; esac cfgfile="$ofile" cat <<__EOF__ >> "$cfgfile" # ### BEGIN LIBTOOL TAG CONFIG: $tagname # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # Shell to use when invoking shell scripts. SHELL=$lt_SHELL # Whether or not to build shared libraries. build_libtool_libs=$enable_shared # Whether or not to build static libraries. build_old_libs=$enable_static # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$archive_cmds_need_lc_F77 # Whether or not to disallow shared libs when runtime libs are static allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_F77 # Whether or not to optimize for fast installation. fast_install=$enable_fast_install # The host system. host_alias=$host_alias host=$host # An echo program that does not interpret backslashes. echo=$lt_echo # The archiver. AR=$lt_AR AR_FLAGS=$lt_AR_FLAGS # A C compiler. LTCC=$lt_LTCC # A language-specific compiler. CC=$lt_compiler_F77 # Is the compiler the GNU C compiler? with_gcc=$GCC_F77 # An ERE matcher. EGREP=$lt_EGREP # The linker used to build libraries. LD=$lt_LD_F77 # Whether we need hard or soft links. LN_S=$lt_LN_S # A BSD-compatible nm program. NM=$lt_NM # A symbol stripping program STRIP=$lt_STRIP # Used to examine libraries when file_magic_cmd begins "file" MAGIC_CMD=$MAGIC_CMD # Used on cygwin: DLL creation program. DLLTOOL="$DLLTOOL" # Used on cygwin: object dumper. OBJDUMP="$OBJDUMP" # Used on cygwin: assembler. AS="$AS" # The name of the directory that contains temporary libtool files. objdir=$objdir # How to create reloadable object files. reload_flag=$lt_reload_flag reload_cmds=$lt_reload_cmds # How to pass a linker flag through the compiler. wl=$lt_lt_prog_compiler_wl_F77 # Object file suffix (normally "o"). objext="$ac_objext" # Old archive suffix (normally "a"). libext="$libext" # Shared library suffix (normally ".so"). shrext_cmds='$shrext_cmds' # Executable file suffix (normally ""). exeext="$exeext" # Additional compiler flags for building library objects. pic_flag=$lt_lt_prog_compiler_pic_F77 pic_mode=$pic_mode # What is the maximum length of a command? max_cmd_len=$lt_cv_sys_max_cmd_len # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_lt_cv_prog_compiler_c_o_F77 # Must we lock files when doing compilation ? need_locks=$lt_need_locks # Do we need the lib prefix for modules? need_lib_prefix=$need_lib_prefix # Do we need a version for libraries? need_version=$need_version # Whether dlopen is supported. dlopen_support=$enable_dlopen # Whether dlopen of programs is supported. dlopen_self=$enable_dlopen_self # Whether dlopen of statically linked programs is supported. dlopen_self_static=$enable_dlopen_self_static # Compiler flag to prevent dynamic linking. link_static_flag=$lt_lt_prog_compiler_static_F77 # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_F77 # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_F77 # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec=$lt_whole_archive_flag_spec_F77 # Compiler flag to generate thread-safe objects. thread_safe_flag_spec=$lt_thread_safe_flag_spec_F77 # Library versioning type. version_type=$version_type # Format of library name prefix. libname_spec=$lt_libname_spec # List of archive names. First name is the real one, the rest are links. # The last name is the one that the linker finds with -lNAME. library_names_spec=$lt_library_names_spec # The coded name of the library, if different from the real name. soname_spec=$lt_soname_spec # Commands used to build and install an old-style archive. RANLIB=$lt_RANLIB old_archive_cmds=$lt_old_archive_cmds_F77 old_postinstall_cmds=$lt_old_postinstall_cmds old_postuninstall_cmds=$lt_old_postuninstall_cmds # Create an old-style archive from a shared archive. old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_F77 # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_F77 # Commands used to build and install a shared archive. archive_cmds=$lt_archive_cmds_F77 archive_expsym_cmds=$lt_archive_expsym_cmds_F77 postinstall_cmds=$lt_postinstall_cmds postuninstall_cmds=$lt_postuninstall_cmds # Commands used to build a loadable module (assumed same as above if empty) module_cmds=$lt_module_cmds_F77 module_expsym_cmds=$lt_module_expsym_cmds_F77 # Commands to strip libraries. old_striplib=$lt_old_striplib striplib=$lt_striplib # Dependencies to place before the objects being linked to create a # shared library. predep_objects=$lt_predep_objects_F77 # Dependencies to place after the objects being linked to create a # shared library. postdep_objects=$lt_postdep_objects_F77 # Dependencies to place before the objects being linked to create a # shared library. predeps=$lt_predeps_F77 # Dependencies to place after the objects being linked to create a # shared library. postdeps=$lt_postdeps_F77 # The library search path used internally by the compiler when linking # a shared library. compiler_lib_search_path=$lt_compiler_lib_search_path_F77 # Method to check whether dependent libraries are shared objects. deplibs_check_method=$lt_deplibs_check_method # Command to use when deplibs_check_method == file_magic. file_magic_cmd=$lt_file_magic_cmd # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_allow_undefined_flag_F77 # Flag that forces no undefined symbols. no_undefined_flag=$lt_no_undefined_flag_F77 # Commands used to finish a libtool library installation in a directory. finish_cmds=$lt_finish_cmds # Same as above, but a single script fragment to be evaled but not shown. finish_eval=$lt_finish_eval # Take the output of nm and produce a listing of raw symbols and C names. global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe # Transform the output of nm in a proper C declaration global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl # Transform the output of nm in a C name address pair global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address # This is the shared library runtime path variable. runpath_var=$runpath_var # This is the shared library path variable. shlibpath_var=$shlibpath_var # Is shlibpath searched before the hard-coded library search path? shlibpath_overrides_runpath=$shlibpath_overrides_runpath # How to hardcode a shared library path into an executable. hardcode_action=$hardcode_action_F77 # Whether we should hardcode library paths into libraries. hardcode_into_libs=$hardcode_into_libs # Flag to hardcode \$libdir into a binary during linking. # This must work even if \$libdir does not exist. hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_F77 # If ld is used when linking, flag to hardcode \$libdir into # a binary during linking. This must work even if \$libdir does # not exist. hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_F77 # Whether we need a single -rpath flag with a separated argument. hardcode_libdir_separator=$lt_hardcode_libdir_separator_F77 # Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the # resulting binary. hardcode_direct=$hardcode_direct_F77 # Set to yes if using the -LDIR flag during linking hardcodes DIR into the # resulting binary. hardcode_minus_L=$hardcode_minus_L_F77 # Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into # the resulting binary. hardcode_shlibpath_var=$hardcode_shlibpath_var_F77 # Set to yes if building a shared library automatically hardcodes DIR into the library # and all subsequent libraries and executables linked against it. hardcode_automatic=$hardcode_automatic_F77 # Variables whose values should be saved in libtool wrapper scripts and # restored at relink time. variables_saved_for_relink="$variables_saved_for_relink" # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$link_all_deplibs_F77 # Compile-time system search path for libraries sys_lib_search_path_spec=$lt_sys_lib_search_path_spec # Run-time system search path for libraries sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec # Fix the shell variable \$srcfile for the compiler. fix_srcfile_path="$fix_srcfile_path_F77" # Set to yes if exported symbols are required. always_export_symbols=$always_export_symbols_F77 # The commands to list exported symbols. export_symbols_cmds=$lt_export_symbols_cmds_F77 # The commands to extract the exported symbol list from a shared archive. extract_expsyms_cmds=$lt_extract_expsyms_cmds # Symbols that should not be listed in the preloaded symbols. exclude_expsyms=$lt_exclude_expsyms_F77 # Symbols that must always be exported. include_expsyms=$lt_include_expsyms_F77 # ### END LIBTOOL TAG CONFIG: $tagname __EOF__ else # If there is no Makefile yet, we rely on a make rule to execute # `config.status --recheck' to rerun these tests and create the # libtool script then. ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` if test -f "$ltmain_in"; then test -f Makefile && make "$ltmain" fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu CC="$lt_save_CC" else tagname="" fi ;; GCJ) if test -n "$GCJ" && test "X$GCJ" != "Xno"; then # Source file extension for Java test sources. ac_ext=java # Object file extension for compiled Java test sources. objext=o objext_GCJ=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="class foo {}\n" # Code to be used in simple link tests lt_simple_link_test_code='public class conftest { public static void main(String argv) {}; }\n' # ltmain only uses $CC for tagged configurations so make sure $CC is set. # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # Allow CC to be a program name with arguments. compiler=$CC # Allow CC to be a program name with arguments. lt_save_CC="$CC" CC=${GCJ-"gcj"} compiler=$CC compiler_GCJ=$CC # GCJ did not exist at the time GCC didn't implicitly link libc in. archive_cmds_need_lc_GCJ=no lt_prog_compiler_no_builtin_flag_GCJ= if test "$GCC" = yes; then lt_prog_compiler_no_builtin_flag_GCJ=' -fno-builtin' echo "$as_me:$LINENO: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 echo $ECHO_N "checking if $compiler supports -fno-rtti -fno-exceptions... $ECHO_C" >&6 if test "${lt_cv_prog_compiler_rtti_exceptions+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lt_cv_prog_compiler_rtti_exceptions=no ac_outfile=conftest.$ac_objext printf "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-fno-rtti -fno-exceptions" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:15491: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:15495: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings if test ! -s conftest.err; then lt_cv_prog_compiler_rtti_exceptions=yes fi fi $rm conftest* fi echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 echo "${ECHO_T}$lt_cv_prog_compiler_rtti_exceptions" >&6 if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then lt_prog_compiler_no_builtin_flag_GCJ="$lt_prog_compiler_no_builtin_flag_GCJ -fno-rtti -fno-exceptions" else : fi fi lt_prog_compiler_wl_GCJ= lt_prog_compiler_pic_GCJ= lt_prog_compiler_static_GCJ= echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5 echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6 if test "$GCC" = yes; then lt_prog_compiler_wl_GCJ='-Wl,' lt_prog_compiler_static_GCJ='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static_GCJ='-Bstatic' fi ;; amigaos*) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. lt_prog_compiler_pic_GCJ='-m68020 -resident32 -malways-restore-a4' ;; beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | pw32* | os2*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). lt_prog_compiler_pic_GCJ='-DDLL_EXPORT' ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic_GCJ='-fno-common' ;; msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. lt_prog_compiler_can_build_shared_GCJ=no enable_shared=no ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic_GCJ=-Kconform_pic fi ;; hpux*) # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case "$host_cpu" in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic_GCJ='-fPIC' ;; esac ;; *) lt_prog_compiler_pic_GCJ='-fPIC' ;; esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in aix*) lt_prog_compiler_wl_GCJ='-Wl,' if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static_GCJ='-Bstatic' else lt_prog_compiler_static_GCJ='-bnso -bI:/lib/syscalls.exp' fi ;; mingw* | pw32* | os2*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). lt_prog_compiler_pic_GCJ='-DDLL_EXPORT' ;; hpux9* | hpux10* | hpux11*) lt_prog_compiler_wl_GCJ='-Wl,' # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case "$host_cpu" in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic_GCJ='+Z' ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? lt_prog_compiler_static_GCJ='${wl}-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) lt_prog_compiler_wl_GCJ='-Wl,' # PIC (with -KPIC) is the default. lt_prog_compiler_static_GCJ='-non_shared' ;; newsos6) lt_prog_compiler_pic_GCJ='-KPIC' lt_prog_compiler_static_GCJ='-Bstatic' ;; linux*) case $CC in icc* | ecc*) lt_prog_compiler_wl_GCJ='-Wl,' lt_prog_compiler_pic_GCJ='-KPIC' lt_prog_compiler_static_GCJ='-static' ;; ccc*) lt_prog_compiler_wl_GCJ='-Wl,' # All Alpha code is PIC. lt_prog_compiler_static_GCJ='-non_shared' ;; esac ;; osf3* | osf4* | osf5*) lt_prog_compiler_wl_GCJ='-Wl,' # All OSF/1 code is PIC. lt_prog_compiler_static_GCJ='-non_shared' ;; sco3.2v5*) lt_prog_compiler_pic_GCJ='-Kpic' lt_prog_compiler_static_GCJ='-dn' ;; solaris*) lt_prog_compiler_wl_GCJ='-Wl,' lt_prog_compiler_pic_GCJ='-KPIC' lt_prog_compiler_static_GCJ='-Bstatic' ;; sunos4*) lt_prog_compiler_wl_GCJ='-Qoption ld ' lt_prog_compiler_pic_GCJ='-PIC' lt_prog_compiler_static_GCJ='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) lt_prog_compiler_wl_GCJ='-Wl,' lt_prog_compiler_pic_GCJ='-KPIC' lt_prog_compiler_static_GCJ='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec ;then lt_prog_compiler_pic_GCJ='-Kconform_pic' lt_prog_compiler_static_GCJ='-Bstatic' fi ;; uts4*) lt_prog_compiler_pic_GCJ='-pic' lt_prog_compiler_static_GCJ='-Bstatic' ;; *) lt_prog_compiler_can_build_shared_GCJ=no ;; esac fi echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_GCJ" >&5 echo "${ECHO_T}$lt_prog_compiler_pic_GCJ" >&6 # # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic_GCJ"; then echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic_GCJ works" >&5 echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic_GCJ works... $ECHO_C" >&6 if test "${lt_prog_compiler_pic_works_GCJ+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lt_prog_compiler_pic_works_GCJ=no ac_outfile=conftest.$ac_objext printf "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$lt_prog_compiler_pic_GCJ" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:15724: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:15728: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings if test ! -s conftest.err; then lt_prog_compiler_pic_works_GCJ=yes fi fi $rm conftest* fi echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_works_GCJ" >&5 echo "${ECHO_T}$lt_prog_compiler_pic_works_GCJ" >&6 if test x"$lt_prog_compiler_pic_works_GCJ" = xyes; then case $lt_prog_compiler_pic_GCJ in "" | " "*) ;; *) lt_prog_compiler_pic_GCJ=" $lt_prog_compiler_pic_GCJ" ;; esac else lt_prog_compiler_pic_GCJ= lt_prog_compiler_can_build_shared_GCJ=no fi fi case "$host_os" in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) lt_prog_compiler_pic_GCJ= ;; *) lt_prog_compiler_pic_GCJ="$lt_prog_compiler_pic_GCJ" ;; esac echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5 echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6 if test "${lt_cv_prog_compiler_c_o_GCJ+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lt_cv_prog_compiler_c_o_GCJ=no $rm -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out printf "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:15784: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:15788: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings if test ! -s out/conftest.err; then lt_cv_prog_compiler_c_o_GCJ=yes fi fi chmod u+w . $rm conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files $rm out/* && rmdir out cd .. rmdir conftest $rm conftest* fi echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o_GCJ" >&5 echo "${ECHO_T}$lt_cv_prog_compiler_c_o_GCJ" >&6 hard_links="nottested" if test "$lt_cv_prog_compiler_c_o_GCJ" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user echo "$as_me:$LINENO: checking if we can lock with hard links" >&5 echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&6 hard_links=yes $rm conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no echo "$as_me:$LINENO: result: $hard_links" >&5 echo "${ECHO_T}$hard_links" >&6 if test "$hard_links" = no; then { echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} need_locks=warn fi else need_locks=no fi echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6 runpath_var= allow_undefined_flag_GCJ= enable_shared_with_static_runtimes_GCJ=no archive_cmds_GCJ= archive_expsym_cmds_GCJ= old_archive_From_new_cmds_GCJ= old_archive_from_expsyms_cmds_GCJ= export_dynamic_flag_spec_GCJ= whole_archive_flag_spec_GCJ= thread_safe_flag_spec_GCJ= hardcode_libdir_flag_spec_GCJ= hardcode_libdir_flag_spec_ld_GCJ= hardcode_libdir_separator_GCJ= hardcode_direct_GCJ=no hardcode_minus_L_GCJ=no hardcode_shlibpath_var_GCJ=unsupported link_all_deplibs_GCJ=unknown hardcode_automatic_GCJ=no module_cmds_GCJ= module_expsym_cmds_GCJ= always_export_symbols_GCJ=no export_symbols_cmds_GCJ='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' # include_expsyms should be a list of space-separated symbols to be *always* # included in the symbol list include_expsyms_GCJ= # exclude_expsyms can be an extended regexp of symbols to exclude # it will be wrapped by ` (' and `)$', so one must not match beginning or # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', # as well as any symbol that contains `d'. exclude_expsyms_GCJ="_GLOBAL_OFFSET_TABLE_" # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out # platforms (ab)use it in PIC code, but their linkers get confused if # the symbol is explicitly referenced. Since portable code cannot # rely on this symbol name, it's probably fine to never include it in # preloaded symbol tables. extract_expsyms_cmds= case $host_os in cygwin* | mingw* | pw32*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test "$GCC" != yes; then with_gnu_ld=no fi ;; openbsd*) with_gnu_ld=no ;; esac ld_shlibs_GCJ=yes if test "$with_gnu_ld" = yes; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='${wl}' # See if GNU ld supports shared libraries. case $host_os in aix3* | aix4* | aix5*) # On AIX/PPC, the GNU linker is very broken if test "$host_cpu" != ia64; then ld_shlibs_GCJ=no cat <&2 *** Warning: the GNU linker, at least up to release 2.9.1, is reported *** to be unable to reliably create shared libraries on AIX. *** Therefore, libtool is disabling shared libraries support. If you *** really care for shared libraries, you may want to modify your PATH *** so that a non-GNU linker is found, and then restart. EOF fi ;; amigaos*) archive_cmds_GCJ='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec_GCJ='-L$libdir' hardcode_minus_L_GCJ=yes # Samuel A. Falvo II reports # that the semantics of dynamic libraries on AmigaOS, at least up # to version 4, is to share data among multiple programs linked # with the same dynamic library. Since this doesn't match the # behavior of shared libraries on other platforms, we can't use # them. ld_shlibs_GCJ=no ;; beos*) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then allow_undefined_flag_GCJ=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME archive_cmds_GCJ='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else ld_shlibs_GCJ=no fi ;; cygwin* | mingw* | pw32*) # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, GCJ) is actually meaningless, # as there is no search path for DLLs. hardcode_libdir_flag_spec_GCJ='-L$libdir' allow_undefined_flag_GCJ=unsupported always_export_symbols_GCJ=no enable_shared_with_static_runtimes_GCJ=yes export_symbols_cmds_GCJ='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGS] /s/.* \([^ ]*\)/\1 DATA/'\'' | $SED -e '\''/^[AITW] /s/.* //'\'' | sort | uniq > $export_symbols' if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... archive_expsym_cmds_GCJ='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' else ld_shlibs=no fi ;; netbsd*) if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then archive_cmds_GCJ='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' fi ;; solaris* | sysv5*) if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then ld_shlibs_GCJ=no cat <&2 *** Warning: The releases 2.8.* of the GNU linker cannot reliably *** create shared libraries on Solaris systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.9.1 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. EOF elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs_GCJ=no fi ;; sunos4*) archive_cmds_GCJ='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= hardcode_direct_GCJ=yes hardcode_shlibpath_var_GCJ=no ;; linux*) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then tmp_archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_cmds_GCJ="$tmp_archive_cmds" supports_anon_versioning=no case `$LD -v 2>/dev/null` in *\ 01.* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... *\ 2.11.*) ;; # other 2.11 versions *) supports_anon_versioning=yes ;; esac if test $supports_anon_versioning = yes; then archive_expsym_cmds_GCJ='$echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ $echo "local: *; };" >> $output_objdir/$libname.ver~ $CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' else archive_expsym_cmds_GCJ="$tmp_archive_cmds" fi else ld_shlibs_GCJ=no fi ;; *) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs_GCJ=no fi ;; esac if test "$ld_shlibs_GCJ" = yes; then runpath_var=LD_RUN_PATH hardcode_libdir_flag_spec_GCJ='${wl}--rpath ${wl}$libdir' export_dynamic_flag_spec_GCJ='${wl}--export-dynamic' # ancient GNU ld didn't support --whole-archive et. al. if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then whole_archive_flag_spec_GCJ="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else whole_archive_flag_spec_GCJ= fi fi else # PORTME fill in a description of your system's linker (not GNU ld) case $host_os in aix3*) allow_undefined_flag_GCJ=unsupported always_export_symbols_GCJ=yes archive_expsym_cmds_GCJ='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. hardcode_minus_L_GCJ=yes if test "$GCC" = yes && test -z "$link_static_flag"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. hardcode_direct_GCJ=unsupported fi ;; aix4* | aix5*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm if $NM -V 2>&1 | grep 'GNU' > /dev/null; then export_symbols_cmds_GCJ='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' else export_symbols_cmds_GCJ='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' fi aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[23]|aix4.[23].*|aix5*) for ld_flag in $LDFLAGS; do if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then aix_use_runtimelinking=yes break fi done esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. archive_cmds_GCJ='' hardcode_direct_GCJ=yes hardcode_libdir_separator_GCJ=':' link_all_deplibs_GCJ=yes if test "$GCC" = yes; then case $host_os in aix4.012|aix4.012.*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && \ strings "$collect2name" | grep resolve_lib_name >/dev/null then # We have reworked collect2 hardcode_direct_GCJ=yes else # We have old collect2 hardcode_direct_GCJ=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking hardcode_minus_L_GCJ=yes hardcode_libdir_flag_spec_GCJ='-L$libdir' hardcode_libdir_separator_GCJ= fi esac shared_flag='-shared' else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. always_export_symbols_GCJ=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. allow_undefined_flag_GCJ='-berok' # Determine the default libpath from the value encoded in an empty executable. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'` # Check for a 64-bit object if we didn't find anything. if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'`; fi else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi hardcode_libdir_flag_spec_GCJ='${wl}-blibpath:$libdir:'"$aix_libpath" archive_expsym_cmds_GCJ="\$CC"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then hardcode_libdir_flag_spec_GCJ='${wl}-R $libdir:/usr/lib:/lib' allow_undefined_flag_GCJ="-z nodefs" archive_expsym_cmds_GCJ="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an empty executable. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'` # Check for a 64-bit object if we didn't find anything. if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'`; fi else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi hardcode_libdir_flag_spec_GCJ='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. no_undefined_flag_GCJ=' ${wl}-bernotok' allow_undefined_flag_GCJ=' ${wl}-berok' # -bexpall does not export symbols beginning with underscore (_) always_export_symbols_GCJ=yes # Exported symbols can be pulled into shared objects from archives whole_archive_flag_spec_GCJ=' ' archive_cmds_need_lc_GCJ=yes # This is similar to how AIX traditionally builds it's shared libraries. archive_expsym_cmds_GCJ="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}-bE:$export_symbols ${wl}-bnoentry${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; amigaos*) archive_cmds_GCJ='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec_GCJ='-L$libdir' hardcode_minus_L_GCJ=yes # see comment about different semantics on the GNU ld section ld_shlibs_GCJ=no ;; bsdi4*) export_dynamic_flag_spec_GCJ=-rdynamic ;; cygwin* | mingw* | pw32*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. hardcode_libdir_flag_spec_GCJ=' ' allow_undefined_flag_GCJ=unsupported # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. archive_cmds_GCJ='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames=' # The linker will automatically build a .lib file if we build a DLL. old_archive_From_new_cmds_GCJ='true' # FIXME: Should let the user specify the lib program. old_archive_cmds_GCJ='lib /OUT:$oldlib$oldobjs$old_deplibs' fix_srcfile_path='`cygpath -w "$srcfile"`' enable_shared_with_static_runtimes_GCJ=yes ;; darwin* | rhapsody*) if test "$GXX" = yes ; then archive_cmds_need_lc_GCJ=no case "$host_os" in rhapsody* | darwin1.[012]) allow_undefined_flag_GCJ='-undefined suppress' ;; *) # Darwin 1.3 on if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then allow_undefined_flag_GCJ='-flat_namespace -undefined suppress' else case ${MACOSX_DEPLOYMENT_TARGET} in 10.[012]) allow_undefined_flag_GCJ='-flat_namespace -undefined suppress' ;; 10.*) allow_undefined_flag_GCJ='-undefined dynamic_lookup' ;; esac fi ;; esac lt_int_apple_cc_single_mod=no output_verbose_link_cmd='echo' if $CC -dumpspecs 2>&1 | grep 'single_module' >/dev/null ; then lt_int_apple_cc_single_mod=yes fi if test "X$lt_int_apple_cc_single_mod" = Xyes ; then archive_cmds_GCJ='$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' else archive_cmds_GCJ='$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring' fi module_cmds_GCJ='$CC ${wl}-bind_at_load $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's if test "X$lt_int_apple_cc_single_mod" = Xyes ; then archive_expsym_cmds_GCJ='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' else archive_expsym_cmds_GCJ='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' fi module_expsym_cmds_GCJ='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' hardcode_direct_GCJ=no hardcode_automatic_GCJ=yes hardcode_shlibpath_var_GCJ=unsupported whole_archive_flag_spec_GCJ='-all_load $convenience' link_all_deplibs_GCJ=yes else ld_shlibs_GCJ=no fi ;; dgux*) archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec_GCJ='-L$libdir' hardcode_shlibpath_var_GCJ=no ;; freebsd1*) ld_shlibs_GCJ=no ;; # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor # support. Future versions do this automatically, but an explicit c++rt0.o # does not break anything, and helps significantly (at the cost of a little # extra space). freebsd2.2*) archive_cmds_GCJ='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' hardcode_libdir_flag_spec_GCJ='-R$libdir' hardcode_direct_GCJ=yes hardcode_shlibpath_var_GCJ=no ;; # Unfortunately, older versions of FreeBSD 2 do not have this feature. freebsd2*) archive_cmds_GCJ='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_direct_GCJ=yes hardcode_minus_L_GCJ=yes hardcode_shlibpath_var_GCJ=no ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. freebsd* | kfreebsd*-gnu) archive_cmds_GCJ='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec_GCJ='-R$libdir' hardcode_direct_GCJ=yes hardcode_shlibpath_var_GCJ=no ;; hpux9*) if test "$GCC" = yes; then archive_cmds_GCJ='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else archive_cmds_GCJ='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' fi hardcode_libdir_flag_spec_GCJ='${wl}+b ${wl}$libdir' hardcode_libdir_separator_GCJ=: hardcode_direct_GCJ=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L_GCJ=yes export_dynamic_flag_spec_GCJ='${wl}-E' ;; hpux10* | hpux11*) if test "$GCC" = yes -a "$with_gnu_ld" = no; then case "$host_cpu" in hppa*64*|ia64*) archive_cmds_GCJ='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds_GCJ='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else case "$host_cpu" in hppa*64*|ia64*) archive_cmds_GCJ='$LD -b +h $soname -o $lib $libobjs $deplibs $linker_flags' ;; *) archive_cmds_GCJ='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' ;; esac fi if test "$with_gnu_ld" = no; then case "$host_cpu" in hppa*64*) hardcode_libdir_flag_spec_GCJ='${wl}+b ${wl}$libdir' hardcode_libdir_flag_spec_ld_GCJ='+b $libdir' hardcode_libdir_separator_GCJ=: hardcode_direct_GCJ=no hardcode_shlibpath_var_GCJ=no ;; ia64*) hardcode_libdir_flag_spec_GCJ='-L$libdir' hardcode_direct_GCJ=no hardcode_shlibpath_var_GCJ=no # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L_GCJ=yes ;; *) hardcode_libdir_flag_spec_GCJ='${wl}+b ${wl}$libdir' hardcode_libdir_separator_GCJ=: hardcode_direct_GCJ=yes export_dynamic_flag_spec_GCJ='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L_GCJ=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) if test "$GCC" = yes; then archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else archive_cmds_GCJ='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' hardcode_libdir_flag_spec_ld_GCJ='-rpath $libdir' fi hardcode_libdir_flag_spec_GCJ='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_GCJ=: link_all_deplibs_GCJ=yes ;; netbsd*) if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then archive_cmds_GCJ='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else archive_cmds_GCJ='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF fi hardcode_libdir_flag_spec_GCJ='-R$libdir' hardcode_direct_GCJ=yes hardcode_shlibpath_var_GCJ=no ;; newsos6) archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct_GCJ=yes hardcode_libdir_flag_spec_GCJ='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_GCJ=: hardcode_shlibpath_var_GCJ=no ;; openbsd*) hardcode_direct_GCJ=yes hardcode_shlibpath_var_GCJ=no if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then archive_cmds_GCJ='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec_GCJ='${wl}-rpath,$libdir' export_dynamic_flag_spec_GCJ='${wl}-E' else case $host_os in openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) archive_cmds_GCJ='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec_GCJ='-R$libdir' ;; *) archive_cmds_GCJ='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec_GCJ='${wl}-rpath,$libdir' ;; esac fi ;; os2*) hardcode_libdir_flag_spec_GCJ='-L$libdir' hardcode_minus_L_GCJ=yes allow_undefined_flag_GCJ=unsupported archive_cmds_GCJ='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' old_archive_From_new_cmds_GCJ='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' ;; osf3*) if test "$GCC" = yes; then allow_undefined_flag_GCJ=' ${wl}-expect_unresolved ${wl}\*' archive_cmds_GCJ='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else allow_undefined_flag_GCJ=' -expect_unresolved \*' archive_cmds_GCJ='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' fi hardcode_libdir_flag_spec_GCJ='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_GCJ=: ;; osf4* | osf5*) # as osf3* with the addition of -msym flag if test "$GCC" = yes; then allow_undefined_flag_GCJ=' ${wl}-expect_unresolved ${wl}\*' archive_cmds_GCJ='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' hardcode_libdir_flag_spec_GCJ='${wl}-rpath ${wl}$libdir' else allow_undefined_flag_GCJ=' -expect_unresolved \*' archive_cmds_GCJ='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' archive_expsym_cmds_GCJ='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~ $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib~$rm $lib.exp' # Both c and cxx compiler support -rpath directly hardcode_libdir_flag_spec_GCJ='-rpath $libdir' fi hardcode_libdir_separator_GCJ=: ;; sco3.2v5*) archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var_GCJ=no export_dynamic_flag_spec_GCJ='${wl}-Bexport' runpath_var=LD_RUN_PATH hardcode_runpath_var=yes ;; solaris*) no_undefined_flag_GCJ=' -z text' if test "$GCC" = yes; then archive_cmds_GCJ='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_GCJ='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp' else archive_cmds_GCJ='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' archive_expsym_cmds_GCJ='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' fi hardcode_libdir_flag_spec_GCJ='-R$libdir' hardcode_shlibpath_var_GCJ=no case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) # Supported since Solaris 2.6 (maybe 2.5.1?) whole_archive_flag_spec_GCJ='-z allextract$convenience -z defaultextract' ;; esac link_all_deplibs_GCJ=yes ;; sunos4*) if test "x$host_vendor" = xsequent; then # Use $CC to link under sequent, because it throws in some extra .o # files that make .init and .fini sections work. archive_cmds_GCJ='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds_GCJ='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' fi hardcode_libdir_flag_spec_GCJ='-L$libdir' hardcode_direct_GCJ=yes hardcode_minus_L_GCJ=yes hardcode_shlibpath_var_GCJ=no ;; sysv4) case $host_vendor in sni) archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct_GCJ=yes # is this really true??? ;; siemens) ## LD is ld it makes a PLAMLIB ## CC just makes a GrossModule. archive_cmds_GCJ='$LD -G -o $lib $libobjs $deplibs $linker_flags' reload_cmds_GCJ='$CC -r -o $output$reload_objs' hardcode_direct_GCJ=no ;; motorola) archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct_GCJ=no #Motorola manual says yes, but my tests say they lie ;; esac runpath_var='LD_RUN_PATH' hardcode_shlibpath_var_GCJ=no ;; sysv4.3*) archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var_GCJ=no export_dynamic_flag_spec_GCJ='-Bexport' ;; sysv4*MP*) if test -d /usr/nec; then archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var_GCJ=no runpath_var=LD_RUN_PATH hardcode_runpath_var=yes ld_shlibs_GCJ=yes fi ;; sysv4.2uw2*) archive_cmds_GCJ='$LD -G -o $lib $libobjs $deplibs $linker_flags' hardcode_direct_GCJ=yes hardcode_minus_L_GCJ=no hardcode_shlibpath_var_GCJ=no hardcode_runpath_var=yes runpath_var=LD_RUN_PATH ;; sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[78]* | unixware7*) no_undefined_flag_GCJ='${wl}-z ${wl}text' if test "$GCC" = yes; then archive_cmds_GCJ='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds_GCJ='$CC -G ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' fi runpath_var='LD_RUN_PATH' hardcode_shlibpath_var_GCJ=no ;; sysv5*) no_undefined_flag_GCJ=' -z text' # $CC -shared without GNU ld will not create a library from C++ # object files and a static libstdc++, better avoid it by now archive_cmds_GCJ='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' archive_expsym_cmds_GCJ='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' hardcode_libdir_flag_spec_GCJ= hardcode_shlibpath_var_GCJ=no runpath_var='LD_RUN_PATH' ;; uts4*) archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec_GCJ='-L$libdir' hardcode_shlibpath_var_GCJ=no ;; *) ld_shlibs_GCJ=no ;; esac fi echo "$as_me:$LINENO: result: $ld_shlibs_GCJ" >&5 echo "${ECHO_T}$ld_shlibs_GCJ" >&6 test "$ld_shlibs_GCJ" = no && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi # # Do we need to explicitly link libc? # case "x$archive_cmds_need_lc_GCJ" in x|xyes) # Assume -lc should be added archive_cmds_need_lc_GCJ=yes if test "$enable_shared" = yes && test "$GCC" = yes; then case $archive_cmds_GCJ in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5 echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6 $rm conftest* printf "$lt_simple_compile_test_code" > conftest.$ac_ext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$lt_prog_compiler_wl_GCJ compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$allow_undefined_flag_GCJ allow_undefined_flag_GCJ= if { (eval echo "$as_me:$LINENO: \"$archive_cmds_GCJ 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\"") >&5 (eval $archive_cmds_GCJ 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } then archive_cmds_need_lc_GCJ=no else archive_cmds_need_lc_GCJ=yes fi allow_undefined_flag_GCJ=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $rm conftest* echo "$as_me:$LINENO: result: $archive_cmds_need_lc_GCJ" >&5 echo "${ECHO_T}$archive_cmds_need_lc_GCJ" >&6 ;; esac fi ;; esac echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5 echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&6 library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=".so" postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" if test "$GCC" = yes; then sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then # if the path contains ";" then we assume it to be the separator # otherwise default to the standard path separator (i.e. ":") - it is # assumed that no part of a normal pathname contains ";" but that should # okay in the real world where ";" in dirpaths is itself problematic. sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi else sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" fi need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='${libname}${release}${shared_ext}$major' ;; aix4* | aix5*) version_type=linux need_lib_prefix=no need_version=no hardcode_into_libs=yes if test "$host_cpu" = ia64; then # AIX 5 supports IA64 library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line `#! .'. This would cause the generated library to # depend on `.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[01] | aix4.[01].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then : else can_build_shared=no fi ;; esac # AIX (on Power*) has no versioning support, so currently we can not hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' else # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='${libname}${release}.a $libname.a' soname_spec='${libname}${release}${shared_ext}$major' fi shlibpath_var=LIBPATH fi ;; amigaos*) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; beos*) library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi4*) version_type=linux need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no case $GCC,$host_os in yes,cygwin* | yes,mingw* | yes,pw32*) library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $rm \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" ;; mingw*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then # It is most probably a Windows format PATH printed by # mingw gcc, but we are running on Cygwin. Gcc prints its search # path with ; separators, and with drive letters. We can handle the # drive letters (cygwin fileutils understands them), so leave them, # especially as we might pass files found there to a mingw objdump, # which wouldn't understand a cygwinified path. Ahh. sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/./-/g'`${versuffix}${shared_ext}' ;; esac ;; *) library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' ;; esac dynamic_linker='Win32 ld.exe' # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext' soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='$(test .$module = .yes && echo .so || echo .dylib)' # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same. if test "$GCC" = yes; then sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"` else sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib' fi sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd1*) dynamic_linker=no ;; kfreebsd*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='GNU ld.so' ;; freebsd*) objformat=`test -x /usr/bin/objformat && /usr/bin/objformat || echo aout` version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2*) shlibpath_overrides_runpath=yes ;; freebsd3.01* | freebsdelf3.01*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; *) # from 3.2 on shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; esac ;; gnu*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case "$host_cpu" in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' if test "X$HPUX_IA64_MODE" = X32; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555. postinstall_cmds='chmod 555 $lib' ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then version_type=linux else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; # This must be Linux ELF. linux*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # find out which ABI we are using libsuff= case "$host_cpu" in x86_64*|s390x*|powerpc64*) echo '#line 17118 "configure"' > conftest.$ac_ext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then case `/usr/bin/file conftest.$ac_objext` in *64-bit*) libsuff=64 sys_lib_search_path_spec="/lib${libsuff} /usr/lib${libsuff} /usr/local/lib${libsuff}" ;; esac fi rm -rf conftest* ;; esac # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then lt_ld_extra=`$SED -e 's/:,\t/ /g;s/=^=*$//;s/=^= * / /g' /etc/ld.so.conf | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib${libsuff} /usr/lib${libsuff} $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; knetbsd*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='GNU ld.so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; nto-qnx*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; openbsd*) version_type=sunos need_lib_prefix=no need_version=yes library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[89] | openbsd2.[89].*) shlibpath_overrides_runpath=no ;; *) shlibpath_overrides_runpath=yes ;; esac else shlibpath_overrides_runpath=yes fi ;; os2*) libname_spec='$name' shrext_cmds=".dll" need_lib_prefix=no library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; sco3.2v5*) version_type=osf soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH ;; solaris*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test "$with_gnu_ld" = yes; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no export_dynamic_flag_spec='${wl}-Blargedynsym' runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec ;then version_type=linux library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; uts4*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac echo "$as_me:$LINENO: result: $dynamic_linker" >&5 echo "${ECHO_T}$dynamic_linker" >&6 test "$dynamic_linker" = no && can_build_shared=no echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5 echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6 hardcode_action_GCJ= if test -n "$hardcode_libdir_flag_spec_GCJ" || \ test -n "$runpath_var GCJ" || \ test "X$hardcode_automatic_GCJ"="Xyes" ; then # We can hardcode non-existant directories. if test "$hardcode_direct_GCJ" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, GCJ)" != no && test "$hardcode_minus_L_GCJ" != no; then # Linking always hardcodes the temporary library directory. hardcode_action_GCJ=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. hardcode_action_GCJ=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. hardcode_action_GCJ=unsupported fi echo "$as_me:$LINENO: result: $hardcode_action_GCJ" >&5 echo "${ECHO_T}$hardcode_action_GCJ" >&6 if test "$hardcode_action_GCJ" = relink; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || test "$enable_shared" = no; then # Fast installation is not necessary enable_fast_install=needless fi striplib= old_striplib= echo "$as_me:$LINENO: checking whether stripping libraries is possible" >&5 echo $ECHO_N "checking whether stripping libraries is possible... $ECHO_C" >&6 if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" test -z "$striplib" && striplib="$STRIP --strip-unneeded" echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6 else # FIXME - insert some real tests, host_os isn't really good enough case $host_os in darwin*) if test -n "$STRIP" ; then striplib="$STRIP -x" echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi ;; *) echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 ;; esac fi if test "x$enable_dlopen" != xyes; then enable_dlopen=unknown enable_dlopen_self=unknown enable_dlopen_self_static=unknown else lt_cv_dlopen=no lt_cv_dlopen_libs= case $host_os in beos*) lt_cv_dlopen="load_add_on" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ;; mingw* | pw32*) lt_cv_dlopen="LoadLibrary" lt_cv_dlopen_libs= ;; cygwin*) lt_cv_dlopen="dlopen" lt_cv_dlopen_libs= ;; darwin*) # if libdl is installed we need to link against it echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5 echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6 if test "${ac_cv_lib_dl_dlopen+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char dlopen (); int main () { dlopen (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_lib_dl_dlopen=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_dl_dlopen=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5 echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6 if test $ac_cv_lib_dl_dlopen = yes; then lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" else lt_cv_dlopen="dyld" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes fi ;; *) echo "$as_me:$LINENO: checking for shl_load" >&5 echo $ECHO_N "checking for shl_load... $ECHO_C" >&6 if test "${ac_cv_func_shl_load+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Define shl_load to an innocuous variant, in case declares shl_load. For example, HP-UX 11i declares gettimeofday. */ #define shl_load innocuous_shl_load /* System header to define __stub macros and hopefully few prototypes, which can conflict with char shl_load (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef shl_load /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" { #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char shl_load (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined (__stub_shl_load) || defined (__stub___shl_load) choke me #else char (*f) () = shl_load; #endif #ifdef __cplusplus } #endif int main () { return f != shl_load; ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_func_shl_load=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_func_shl_load=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_func_shl_load" >&5 echo "${ECHO_T}$ac_cv_func_shl_load" >&6 if test $ac_cv_func_shl_load = yes; then lt_cv_dlopen="shl_load" else echo "$as_me:$LINENO: checking for shl_load in -ldld" >&5 echo $ECHO_N "checking for shl_load in -ldld... $ECHO_C" >&6 if test "${ac_cv_lib_dld_shl_load+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char shl_load (); int main () { shl_load (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_lib_dld_shl_load=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_dld_shl_load=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_dld_shl_load" >&5 echo "${ECHO_T}$ac_cv_lib_dld_shl_load" >&6 if test $ac_cv_lib_dld_shl_load = yes; then lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-dld" else echo "$as_me:$LINENO: checking for dlopen" >&5 echo $ECHO_N "checking for dlopen... $ECHO_C" >&6 if test "${ac_cv_func_dlopen+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Define dlopen to an innocuous variant, in case declares dlopen. For example, HP-UX 11i declares gettimeofday. */ #define dlopen innocuous_dlopen /* System header to define __stub macros and hopefully few prototypes, which can conflict with char dlopen (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef dlopen /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" { #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char dlopen (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined (__stub_dlopen) || defined (__stub___dlopen) choke me #else char (*f) () = dlopen; #endif #ifdef __cplusplus } #endif int main () { return f != dlopen; ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_func_dlopen=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_func_dlopen=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_func_dlopen" >&5 echo "${ECHO_T}$ac_cv_func_dlopen" >&6 if test $ac_cv_func_dlopen = yes; then lt_cv_dlopen="dlopen" else echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5 echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6 if test "${ac_cv_lib_dl_dlopen+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char dlopen (); int main () { dlopen (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_lib_dl_dlopen=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_dl_dlopen=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5 echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6 if test $ac_cv_lib_dl_dlopen = yes; then lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" else echo "$as_me:$LINENO: checking for dlopen in -lsvld" >&5 echo $ECHO_N "checking for dlopen in -lsvld... $ECHO_C" >&6 if test "${ac_cv_lib_svld_dlopen+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lsvld $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char dlopen (); int main () { dlopen (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_lib_svld_dlopen=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_svld_dlopen=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_svld_dlopen" >&5 echo "${ECHO_T}$ac_cv_lib_svld_dlopen" >&6 if test $ac_cv_lib_svld_dlopen = yes; then lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld" else echo "$as_me:$LINENO: checking for dld_link in -ldld" >&5 echo $ECHO_N "checking for dld_link in -ldld... $ECHO_C" >&6 if test "${ac_cv_lib_dld_dld_link+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char dld_link (); int main () { dld_link (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_lib_dld_dld_link=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_dld_dld_link=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_dld_dld_link" >&5 echo "${ECHO_T}$ac_cv_lib_dld_dld_link" >&6 if test $ac_cv_lib_dld_dld_link = yes; then lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-dld" fi fi fi fi fi fi ;; esac if test "x$lt_cv_dlopen" != xno; then enable_dlopen=yes else enable_dlopen=no fi case $lt_cv_dlopen in dlopen) save_CPPFLAGS="$CPPFLAGS" test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" save_LDFLAGS="$LDFLAGS" eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" save_LIBS="$LIBS" LIBS="$lt_cv_dlopen_libs $LIBS" echo "$as_me:$LINENO: checking whether a program can dlopen itself" >&5 echo $ECHO_N "checking whether a program can dlopen itself... $ECHO_C" >&6 if test "${lt_cv_dlopen_self+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test "$cross_compiling" = yes; then : lt_cv_dlopen_self=cross else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext < #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif #ifdef __cplusplus extern "C" void exit (int); #endif void fnord() { int i=42;} int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; /* dlclose (self); */ } exit (status); } EOF if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; x$lt_unknown|x*) lt_cv_dlopen_self=no ;; esac else : # compilation failed lt_cv_dlopen_self=no fi fi rm -fr conftest* fi echo "$as_me:$LINENO: result: $lt_cv_dlopen_self" >&5 echo "${ECHO_T}$lt_cv_dlopen_self" >&6 if test "x$lt_cv_dlopen_self" = xyes; then LDFLAGS="$LDFLAGS $link_static_flag" echo "$as_me:$LINENO: checking whether a statically linked program can dlopen itself" >&5 echo $ECHO_N "checking whether a statically linked program can dlopen itself... $ECHO_C" >&6 if test "${lt_cv_dlopen_self_static+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test "$cross_compiling" = yes; then : lt_cv_dlopen_self_static=cross else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext < #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif #ifdef __cplusplus extern "C" void exit (int); #endif void fnord() { int i=42;} int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; /* dlclose (self); */ } exit (status); } EOF if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; x$lt_unknown|x*) lt_cv_dlopen_self_static=no ;; esac else : # compilation failed lt_cv_dlopen_self_static=no fi fi rm -fr conftest* fi echo "$as_me:$LINENO: result: $lt_cv_dlopen_self_static" >&5 echo "${ECHO_T}$lt_cv_dlopen_self_static" >&6 fi CPPFLAGS="$save_CPPFLAGS" LDFLAGS="$save_LDFLAGS" LIBS="$save_LIBS" ;; esac case $lt_cv_dlopen_self in yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; *) enable_dlopen_self=unknown ;; esac case $lt_cv_dlopen_self_static in yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; *) enable_dlopen_self_static=unknown ;; esac fi # The else clause should only fire when bootstrapping the # libtool distribution, otherwise you forgot to ship ltmain.sh # with your package, and you will get complaints that there are # no rules to generate ltmain.sh. if test -f "$ltmain"; then # See if we are running on zsh, and set the options which allow our commands through # without removal of \ escapes. if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi # Now quote all the things that may contain metacharacters while being # careful not to overquote the AC_SUBSTed values. We take copies of the # variables and quote the copies for generation of the libtool script. for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC NM \ SED SHELL STRIP \ libname_spec library_names_spec soname_spec extract_expsyms_cmds \ old_striplib striplib file_magic_cmd finish_cmds finish_eval \ deplibs_check_method reload_flag reload_cmds need_locks \ lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \ lt_cv_sys_global_symbol_to_c_name_address \ sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ old_postinstall_cmds old_postuninstall_cmds \ compiler_GCJ \ CC_GCJ \ LD_GCJ \ lt_prog_compiler_wl_GCJ \ lt_prog_compiler_pic_GCJ \ lt_prog_compiler_static_GCJ \ lt_prog_compiler_no_builtin_flag_GCJ \ export_dynamic_flag_spec_GCJ \ thread_safe_flag_spec_GCJ \ whole_archive_flag_spec_GCJ \ enable_shared_with_static_runtimes_GCJ \ old_archive_cmds_GCJ \ old_archive_from_new_cmds_GCJ \ predep_objects_GCJ \ postdep_objects_GCJ \ predeps_GCJ \ postdeps_GCJ \ compiler_lib_search_path_GCJ \ archive_cmds_GCJ \ archive_expsym_cmds_GCJ \ postinstall_cmds_GCJ \ postuninstall_cmds_GCJ \ old_archive_from_expsyms_cmds_GCJ \ allow_undefined_flag_GCJ \ no_undefined_flag_GCJ \ export_symbols_cmds_GCJ \ hardcode_libdir_flag_spec_GCJ \ hardcode_libdir_flag_spec_ld_GCJ \ hardcode_libdir_separator_GCJ \ hardcode_automatic_GCJ \ module_cmds_GCJ \ module_expsym_cmds_GCJ \ lt_cv_prog_compiler_c_o_GCJ \ exclude_expsyms_GCJ \ include_expsyms_GCJ; do case $var in old_archive_cmds_GCJ | \ old_archive_from_new_cmds_GCJ | \ archive_cmds_GCJ | \ archive_expsym_cmds_GCJ | \ module_cmds_GCJ | \ module_expsym_cmds_GCJ | \ old_archive_from_expsyms_cmds_GCJ | \ export_symbols_cmds_GCJ | \ extract_expsyms_cmds | reload_cmds | finish_cmds | \ postinstall_cmds | postuninstall_cmds | \ old_postinstall_cmds | old_postuninstall_cmds | \ sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) # Double-quote double-evaled strings. eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" ;; *) eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" ;; esac done case $lt_echo in *'\$0 --fallback-echo"') lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'` ;; esac cfgfile="$ofile" cat <<__EOF__ >> "$cfgfile" # ### BEGIN LIBTOOL TAG CONFIG: $tagname # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # Shell to use when invoking shell scripts. SHELL=$lt_SHELL # Whether or not to build shared libraries. build_libtool_libs=$enable_shared # Whether or not to build static libraries. build_old_libs=$enable_static # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$archive_cmds_need_lc_GCJ # Whether or not to disallow shared libs when runtime libs are static allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_GCJ # Whether or not to optimize for fast installation. fast_install=$enable_fast_install # The host system. host_alias=$host_alias host=$host # An echo program that does not interpret backslashes. echo=$lt_echo # The archiver. AR=$lt_AR AR_FLAGS=$lt_AR_FLAGS # A C compiler. LTCC=$lt_LTCC # A language-specific compiler. CC=$lt_compiler_GCJ # Is the compiler the GNU C compiler? with_gcc=$GCC_GCJ # An ERE matcher. EGREP=$lt_EGREP # The linker used to build libraries. LD=$lt_LD_GCJ # Whether we need hard or soft links. LN_S=$lt_LN_S # A BSD-compatible nm program. NM=$lt_NM # A symbol stripping program STRIP=$lt_STRIP # Used to examine libraries when file_magic_cmd begins "file" MAGIC_CMD=$MAGIC_CMD # Used on cygwin: DLL creation program. DLLTOOL="$DLLTOOL" # Used on cygwin: object dumper. OBJDUMP="$OBJDUMP" # Used on cygwin: assembler. AS="$AS" # The name of the directory that contains temporary libtool files. objdir=$objdir # How to create reloadable object files. reload_flag=$lt_reload_flag reload_cmds=$lt_reload_cmds # How to pass a linker flag through the compiler. wl=$lt_lt_prog_compiler_wl_GCJ # Object file suffix (normally "o"). objext="$ac_objext" # Old archive suffix (normally "a"). libext="$libext" # Shared library suffix (normally ".so"). shrext_cmds='$shrext_cmds' # Executable file suffix (normally ""). exeext="$exeext" # Additional compiler flags for building library objects. pic_flag=$lt_lt_prog_compiler_pic_GCJ pic_mode=$pic_mode # What is the maximum length of a command? max_cmd_len=$lt_cv_sys_max_cmd_len # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_lt_cv_prog_compiler_c_o_GCJ # Must we lock files when doing compilation ? need_locks=$lt_need_locks # Do we need the lib prefix for modules? need_lib_prefix=$need_lib_prefix # Do we need a version for libraries? need_version=$need_version # Whether dlopen is supported. dlopen_support=$enable_dlopen # Whether dlopen of programs is supported. dlopen_self=$enable_dlopen_self # Whether dlopen of statically linked programs is supported. dlopen_self_static=$enable_dlopen_self_static # Compiler flag to prevent dynamic linking. link_static_flag=$lt_lt_prog_compiler_static_GCJ # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_GCJ # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_GCJ # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec=$lt_whole_archive_flag_spec_GCJ # Compiler flag to generate thread-safe objects. thread_safe_flag_spec=$lt_thread_safe_flag_spec_GCJ # Library versioning type. version_type=$version_type # Format of library name prefix. libname_spec=$lt_libname_spec # List of archive names. First name is the real one, the rest are links. # The last name is the one that the linker finds with -lNAME. library_names_spec=$lt_library_names_spec # The coded name of the library, if different from the real name. soname_spec=$lt_soname_spec # Commands used to build and install an old-style archive. RANLIB=$lt_RANLIB old_archive_cmds=$lt_old_archive_cmds_GCJ old_postinstall_cmds=$lt_old_postinstall_cmds old_postuninstall_cmds=$lt_old_postuninstall_cmds # Create an old-style archive from a shared archive. old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_GCJ # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_GCJ # Commands used to build and install a shared archive. archive_cmds=$lt_archive_cmds_GCJ archive_expsym_cmds=$lt_archive_expsym_cmds_GCJ postinstall_cmds=$lt_postinstall_cmds postuninstall_cmds=$lt_postuninstall_cmds # Commands used to build a loadable module (assumed same as above if empty) module_cmds=$lt_module_cmds_GCJ module_expsym_cmds=$lt_module_expsym_cmds_GCJ # Commands to strip libraries. old_striplib=$lt_old_striplib striplib=$lt_striplib # Dependencies to place before the objects being linked to create a # shared library. predep_objects=$lt_predep_objects_GCJ # Dependencies to place after the objects being linked to create a # shared library. postdep_objects=$lt_postdep_objects_GCJ # Dependencies to place before the objects being linked to create a # shared library. predeps=$lt_predeps_GCJ # Dependencies to place after the objects being linked to create a # shared library. postdeps=$lt_postdeps_GCJ # The library search path used internally by the compiler when linking # a shared library. compiler_lib_search_path=$lt_compiler_lib_search_path_GCJ # Method to check whether dependent libraries are shared objects. deplibs_check_method=$lt_deplibs_check_method # Command to use when deplibs_check_method == file_magic. file_magic_cmd=$lt_file_magic_cmd # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_allow_undefined_flag_GCJ # Flag that forces no undefined symbols. no_undefined_flag=$lt_no_undefined_flag_GCJ # Commands used to finish a libtool library installation in a directory. finish_cmds=$lt_finish_cmds # Same as above, but a single script fragment to be evaled but not shown. finish_eval=$lt_finish_eval # Take the output of nm and produce a listing of raw symbols and C names. global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe # Transform the output of nm in a proper C declaration global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl # Transform the output of nm in a C name address pair global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address # This is the shared library runtime path variable. runpath_var=$runpath_var # This is the shared library path variable. shlibpath_var=$shlibpath_var # Is shlibpath searched before the hard-coded library search path? shlibpath_overrides_runpath=$shlibpath_overrides_runpath # How to hardcode a shared library path into an executable. hardcode_action=$hardcode_action_GCJ # Whether we should hardcode library paths into libraries. hardcode_into_libs=$hardcode_into_libs # Flag to hardcode \$libdir into a binary during linking. # This must work even if \$libdir does not exist. hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_GCJ # If ld is used when linking, flag to hardcode \$libdir into # a binary during linking. This must work even if \$libdir does # not exist. hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_GCJ # Whether we need a single -rpath flag with a separated argument. hardcode_libdir_separator=$lt_hardcode_libdir_separator_GCJ # Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the # resulting binary. hardcode_direct=$hardcode_direct_GCJ # Set to yes if using the -LDIR flag during linking hardcodes DIR into the # resulting binary. hardcode_minus_L=$hardcode_minus_L_GCJ # Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into # the resulting binary. hardcode_shlibpath_var=$hardcode_shlibpath_var_GCJ # Set to yes if building a shared library automatically hardcodes DIR into the library # and all subsequent libraries and executables linked against it. hardcode_automatic=$hardcode_automatic_GCJ # Variables whose values should be saved in libtool wrapper scripts and # restored at relink time. variables_saved_for_relink="$variables_saved_for_relink" # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$link_all_deplibs_GCJ # Compile-time system search path for libraries sys_lib_search_path_spec=$lt_sys_lib_search_path_spec # Run-time system search path for libraries sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec # Fix the shell variable \$srcfile for the compiler. fix_srcfile_path="$fix_srcfile_path_GCJ" # Set to yes if exported symbols are required. always_export_symbols=$always_export_symbols_GCJ # The commands to list exported symbols. export_symbols_cmds=$lt_export_symbols_cmds_GCJ # The commands to extract the exported symbol list from a shared archive. extract_expsyms_cmds=$lt_extract_expsyms_cmds # Symbols that should not be listed in the preloaded symbols. exclude_expsyms=$lt_exclude_expsyms_GCJ # Symbols that must always be exported. include_expsyms=$lt_include_expsyms_GCJ # ### END LIBTOOL TAG CONFIG: $tagname __EOF__ else # If there is no Makefile yet, we rely on a make rule to execute # `config.status --recheck' to rerun these tests and create the # libtool script then. ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` if test -f "$ltmain_in"; then test -f Makefile && make "$ltmain" fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu CC="$lt_save_CC" else tagname="" fi ;; RC) # Source file extension for RC test sources. ac_ext=rc # Object file extension for compiled RC test sources. objext=o objext_RC=$objext # Code to be used in simple compile tests lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }\n' # Code to be used in simple link tests lt_simple_link_test_code="$lt_simple_compile_test_code" # ltmain only uses $CC for tagged configurations so make sure $CC is set. # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # Allow CC to be a program name with arguments. compiler=$CC # Allow CC to be a program name with arguments. lt_save_CC="$CC" CC=${RC-"windres"} compiler=$CC compiler_RC=$CC lt_cv_prog_compiler_c_o_RC=yes # The else clause should only fire when bootstrapping the # libtool distribution, otherwise you forgot to ship ltmain.sh # with your package, and you will get complaints that there are # no rules to generate ltmain.sh. if test -f "$ltmain"; then # See if we are running on zsh, and set the options which allow our commands through # without removal of \ escapes. if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi # Now quote all the things that may contain metacharacters while being # careful not to overquote the AC_SUBSTed values. We take copies of the # variables and quote the copies for generation of the libtool script. for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC NM \ SED SHELL STRIP \ libname_spec library_names_spec soname_spec extract_expsyms_cmds \ old_striplib striplib file_magic_cmd finish_cmds finish_eval \ deplibs_check_method reload_flag reload_cmds need_locks \ lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \ lt_cv_sys_global_symbol_to_c_name_address \ sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ old_postinstall_cmds old_postuninstall_cmds \ compiler_RC \ CC_RC \ LD_RC \ lt_prog_compiler_wl_RC \ lt_prog_compiler_pic_RC \ lt_prog_compiler_static_RC \ lt_prog_compiler_no_builtin_flag_RC \ export_dynamic_flag_spec_RC \ thread_safe_flag_spec_RC \ whole_archive_flag_spec_RC \ enable_shared_with_static_runtimes_RC \ old_archive_cmds_RC \ old_archive_from_new_cmds_RC \ predep_objects_RC \ postdep_objects_RC \ predeps_RC \ postdeps_RC \ compiler_lib_search_path_RC \ archive_cmds_RC \ archive_expsym_cmds_RC \ postinstall_cmds_RC \ postuninstall_cmds_RC \ old_archive_from_expsyms_cmds_RC \ allow_undefined_flag_RC \ no_undefined_flag_RC \ export_symbols_cmds_RC \ hardcode_libdir_flag_spec_RC \ hardcode_libdir_flag_spec_ld_RC \ hardcode_libdir_separator_RC \ hardcode_automatic_RC \ module_cmds_RC \ module_expsym_cmds_RC \ lt_cv_prog_compiler_c_o_RC \ exclude_expsyms_RC \ include_expsyms_RC; do case $var in old_archive_cmds_RC | \ old_archive_from_new_cmds_RC | \ archive_cmds_RC | \ archive_expsym_cmds_RC | \ module_cmds_RC | \ module_expsym_cmds_RC | \ old_archive_from_expsyms_cmds_RC | \ export_symbols_cmds_RC | \ extract_expsyms_cmds | reload_cmds | finish_cmds | \ postinstall_cmds | postuninstall_cmds | \ old_postinstall_cmds | old_postuninstall_cmds | \ sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) # Double-quote double-evaled strings. eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" ;; *) eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" ;; esac done case $lt_echo in *'\$0 --fallback-echo"') lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'` ;; esac cfgfile="$ofile" cat <<__EOF__ >> "$cfgfile" # ### BEGIN LIBTOOL TAG CONFIG: $tagname # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # Shell to use when invoking shell scripts. SHELL=$lt_SHELL # Whether or not to build shared libraries. build_libtool_libs=$enable_shared # Whether or not to build static libraries. build_old_libs=$enable_static # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$archive_cmds_need_lc_RC # Whether or not to disallow shared libs when runtime libs are static allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_RC # Whether or not to optimize for fast installation. fast_install=$enable_fast_install # The host system. host_alias=$host_alias host=$host # An echo program that does not interpret backslashes. echo=$lt_echo # The archiver. AR=$lt_AR AR_FLAGS=$lt_AR_FLAGS # A C compiler. LTCC=$lt_LTCC # A language-specific compiler. CC=$lt_compiler_RC # Is the compiler the GNU C compiler? with_gcc=$GCC_RC # An ERE matcher. EGREP=$lt_EGREP # The linker used to build libraries. LD=$lt_LD_RC # Whether we need hard or soft links. LN_S=$lt_LN_S # A BSD-compatible nm program. NM=$lt_NM # A symbol stripping program STRIP=$lt_STRIP # Used to examine libraries when file_magic_cmd begins "file" MAGIC_CMD=$MAGIC_CMD # Used on cygwin: DLL creation program. DLLTOOL="$DLLTOOL" # Used on cygwin: object dumper. OBJDUMP="$OBJDUMP" # Used on cygwin: assembler. AS="$AS" # The name of the directory that contains temporary libtool files. objdir=$objdir # How to create reloadable object files. reload_flag=$lt_reload_flag reload_cmds=$lt_reload_cmds # How to pass a linker flag through the compiler. wl=$lt_lt_prog_compiler_wl_RC # Object file suffix (normally "o"). objext="$ac_objext" # Old archive suffix (normally "a"). libext="$libext" # Shared library suffix (normally ".so"). shrext_cmds='$shrext_cmds' # Executable file suffix (normally ""). exeext="$exeext" # Additional compiler flags for building library objects. pic_flag=$lt_lt_prog_compiler_pic_RC pic_mode=$pic_mode # What is the maximum length of a command? max_cmd_len=$lt_cv_sys_max_cmd_len # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_lt_cv_prog_compiler_c_o_RC # Must we lock files when doing compilation ? need_locks=$lt_need_locks # Do we need the lib prefix for modules? need_lib_prefix=$need_lib_prefix # Do we need a version for libraries? need_version=$need_version # Whether dlopen is supported. dlopen_support=$enable_dlopen # Whether dlopen of programs is supported. dlopen_self=$enable_dlopen_self # Whether dlopen of statically linked programs is supported. dlopen_self_static=$enable_dlopen_self_static # Compiler flag to prevent dynamic linking. link_static_flag=$lt_lt_prog_compiler_static_RC # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_RC # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_RC # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec=$lt_whole_archive_flag_spec_RC # Compiler flag to generate thread-safe objects. thread_safe_flag_spec=$lt_thread_safe_flag_spec_RC # Library versioning type. version_type=$version_type # Format of library name prefix. libname_spec=$lt_libname_spec # List of archive names. First name is the real one, the rest are links. # The last name is the one that the linker finds with -lNAME. library_names_spec=$lt_library_names_spec # The coded name of the library, if different from the real name. soname_spec=$lt_soname_spec # Commands used to build and install an old-style archive. RANLIB=$lt_RANLIB old_archive_cmds=$lt_old_archive_cmds_RC old_postinstall_cmds=$lt_old_postinstall_cmds old_postuninstall_cmds=$lt_old_postuninstall_cmds # Create an old-style archive from a shared archive. old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_RC # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_RC # Commands used to build and install a shared archive. archive_cmds=$lt_archive_cmds_RC archive_expsym_cmds=$lt_archive_expsym_cmds_RC postinstall_cmds=$lt_postinstall_cmds postuninstall_cmds=$lt_postuninstall_cmds # Commands used to build a loadable module (assumed same as above if empty) module_cmds=$lt_module_cmds_RC module_expsym_cmds=$lt_module_expsym_cmds_RC # Commands to strip libraries. old_striplib=$lt_old_striplib striplib=$lt_striplib # Dependencies to place before the objects being linked to create a # shared library. predep_objects=$lt_predep_objects_RC # Dependencies to place after the objects being linked to create a # shared library. postdep_objects=$lt_postdep_objects_RC # Dependencies to place before the objects being linked to create a # shared library. predeps=$lt_predeps_RC # Dependencies to place after the objects being linked to create a # shared library. postdeps=$lt_postdeps_RC # The library search path used internally by the compiler when linking # a shared library. compiler_lib_search_path=$lt_compiler_lib_search_path_RC # Method to check whether dependent libraries are shared objects. deplibs_check_method=$lt_deplibs_check_method # Command to use when deplibs_check_method == file_magic. file_magic_cmd=$lt_file_magic_cmd # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_allow_undefined_flag_RC # Flag that forces no undefined symbols. no_undefined_flag=$lt_no_undefined_flag_RC # Commands used to finish a libtool library installation in a directory. finish_cmds=$lt_finish_cmds # Same as above, but a single script fragment to be evaled but not shown. finish_eval=$lt_finish_eval # Take the output of nm and produce a listing of raw symbols and C names. global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe # Transform the output of nm in a proper C declaration global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl # Transform the output of nm in a C name address pair global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address # This is the shared library runtime path variable. runpath_var=$runpath_var # This is the shared library path variable. shlibpath_var=$shlibpath_var # Is shlibpath searched before the hard-coded library search path? shlibpath_overrides_runpath=$shlibpath_overrides_runpath # How to hardcode a shared library path into an executable. hardcode_action=$hardcode_action_RC # Whether we should hardcode library paths into libraries. hardcode_into_libs=$hardcode_into_libs # Flag to hardcode \$libdir into a binary during linking. # This must work even if \$libdir does not exist. hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_RC # If ld is used when linking, flag to hardcode \$libdir into # a binary during linking. This must work even if \$libdir does # not exist. hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_RC # Whether we need a single -rpath flag with a separated argument. hardcode_libdir_separator=$lt_hardcode_libdir_separator_RC # Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the # resulting binary. hardcode_direct=$hardcode_direct_RC # Set to yes if using the -LDIR flag during linking hardcodes DIR into the # resulting binary. hardcode_minus_L=$hardcode_minus_L_RC # Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into # the resulting binary. hardcode_shlibpath_var=$hardcode_shlibpath_var_RC # Set to yes if building a shared library automatically hardcodes DIR into the library # and all subsequent libraries and executables linked against it. hardcode_automatic=$hardcode_automatic_RC # Variables whose values should be saved in libtool wrapper scripts and # restored at relink time. variables_saved_for_relink="$variables_saved_for_relink" # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$link_all_deplibs_RC # Compile-time system search path for libraries sys_lib_search_path_spec=$lt_sys_lib_search_path_spec # Run-time system search path for libraries sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec # Fix the shell variable \$srcfile for the compiler. fix_srcfile_path="$fix_srcfile_path_RC" # Set to yes if exported symbols are required. always_export_symbols=$always_export_symbols_RC # The commands to list exported symbols. export_symbols_cmds=$lt_export_symbols_cmds_RC # The commands to extract the exported symbol list from a shared archive. extract_expsyms_cmds=$lt_extract_expsyms_cmds # Symbols that should not be listed in the preloaded symbols. exclude_expsyms=$lt_exclude_expsyms_RC # Symbols that must always be exported. include_expsyms=$lt_include_expsyms_RC # ### END LIBTOOL TAG CONFIG: $tagname __EOF__ else # If there is no Makefile yet, we rely on a make rule to execute # `config.status --recheck' to rerun these tests and create the # libtool script then. ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` if test -f "$ltmain_in"; then test -f Makefile && make "$ltmain" fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu CC="$lt_save_CC" ;; *) { { echo "$as_me:$LINENO: error: Unsupported tag name: $tagname" >&5 echo "$as_me: error: Unsupported tag name: $tagname" >&2;} { (exit 1); exit 1; }; } ;; esac # Append the new tag name to the list of available tags. if test -n "$tagname" ; then available_tags="$available_tags $tagname" fi fi done IFS="$lt_save_ifs" # Now substitute the updated list of available tags. if eval "sed -e 's/^available_tags=.*\$/available_tags=\"$available_tags\"/' \"$ofile\" > \"${ofile}T\""; then mv "${ofile}T" "$ofile" chmod +x "$ofile" else rm -f "${ofile}T" { { echo "$as_me:$LINENO: error: unable to update list of available tagged configurations." >&5 echo "$as_me: error: unable to update list of available tagged configurations." >&2;} { (exit 1); exit 1; }; } fi fi # This can be used to rebuild libtool when needed LIBTOOL_DEPS="$ac_aux_dir/ltmain.sh" # Always use our own libtool. LIBTOOL='$(SHELL) $(top_builddir)/libtool' # Prevent multiple expansion # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5 echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6 if test -z "$INSTALL"; then if test "${ac_cv_path_install+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in ./ | .// | /cC/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi done done ;; esac done fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. We don't cache a # path for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the path is relative. INSTALL=$ac_install_sh fi fi echo "$as_me:$LINENO: result: $INSTALL" >&5 echo "${ECHO_T}$INSTALL" >&6 # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' echo "$as_me:$LINENO: checking for ANSI C header files" >&5 echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6 if test "${ac_cv_header_stdc+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_header_stdc=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_header_stdc=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) exit(2); exit (0); } _ACEOF rm -f conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='./conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then : else echo "$as_me: program exited with status $ac_status" >&5 echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ( exit $ac_status ) ac_cv_header_stdc=no fi rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi fi fi echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5 echo "${ECHO_T}$ac_cv_header_stdc" >&6 if test $ac_cv_header_stdc = yes; then cat >>confdefs.h <<\_ACEOF #define STDC_HEADERS 1 _ACEOF fi # Check whether --enable-snomhack or --disable-snomhack was given. if test "${enable_snomhack+set}" = set; then enableval="$enable_snomhack" else enable_snomhack=no fi; # Check whether --enable-extreme_debug or --disable-extreme_debug was given. if test "${enable_extreme_debug+set}" = set; then enableval="$enable_extreme_debug" else enable_extreme_debug=no fi; if test "$enable_snomhack" = yes ; then cat >>confdefs.h <<\_ACEOF #define SNOM_HACK 1 _ACEOF fi if test "$enable_extreme_debug" = yes ; then cat >>confdefs.h <<\_ACEOF #define EXTREME_DEBUG 1 _ACEOF fi ac_config_files="$ac_config_files Makefile src/Makefile iax.spec iax-config" ac_config_commands="$ac_config_commands default" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, don't put newlines in cache variables' values. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. { (set) 2>&1 | case `(ac_space=' '; set | grep ac_space) 2>&1` in *ac_space=\ *) # `set' does not quote correctly, so add quotes (double-quote # substitution turns \\\\ into \\, and sed turns \\ into \). sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n \ "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" ;; esac; } | sed ' t clear : clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end /^ac_cv_env/!s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ : end' >>confcache if diff $cache_file confcache >/dev/null 2>&1; then :; else if test -w $cache_file; then test "x$cache_file" != "x/dev/null" && echo "updating cache $cache_file" cat confcache >$cache_file else echo "not updating unwritable cache $cache_file" fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' # VPATH may cause trouble with some makes, so we remove $(srcdir), # ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=/{ s/:*\$(srcdir):*/:/; s/:*\${srcdir}:*/:/; s/:*@srcdir@:*/:/; s/^\([^=]*=[ ]*\):*/\1/; s/:*$//; s/^[^=]*=[ ]*$//; }' fi # Transform confdefs.h into DEFS. # Protect against shell expansion while executing Makefile rules. # Protect against Makefile macro expansion. # # If the first sed substitution is executed (which looks for macros that # take arguments), then we branch to the quote section. Otherwise, # look for a macro that doesn't take arguments. cat >confdef2opt.sed <<\_ACEOF t clear : clear s,^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\),-D\1=\2,g t quote s,^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\),-D\1=\2,g t quote d : quote s,[ `~#$^&*(){}\\|;'"<>?],\\&,g s,\[,\\&,g s,\],\\&,g s,\$,$$,g p _ACEOF # We use echo to avoid assuming a particular line-breaking character. # The extra dot is to prevent the shell from consuming trailing # line-breaks from the sub-command output. A line-break within # single-quotes doesn't work because, if this script is created in a # platform that uses two characters for line-breaks (e.g., DOS), tr # would break. ac_LF_and_DOT=`echo; echo .` DEFS=`sed -n -f confdef2opt.sed confdefs.h | tr "$ac_LF_and_DOT" ' .'` rm -f confdef2opt.sed ac_libobjs= ac_ltlibobjs= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_i=`echo "$ac_i" | sed 's/\$U\././;s/\.o$//;s/\.obj$//'` # 2. Add them. ac_libobjs="$ac_libobjs $ac_i\$U.$ac_objext" ac_ltlibobjs="$ac_ltlibobjs $ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then { { echo "$as_me:$LINENO: error: conditional \"AMDEP\" was never defined. Usually this means the macro was only invoked conditionally." >&5 echo "$as_me: error: conditional \"AMDEP\" was never defined. Usually this means the macro was only invoked conditionally." >&2;} { (exit 1); exit 1; }; } fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then { { echo "$as_me:$LINENO: error: conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." >&5 echo "$as_me: error: conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." >&2;} { (exit 1); exit 1; }; } fi if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then { { echo "$as_me:$LINENO: error: conditional \"am__fastdepCXX\" was never defined. Usually this means the macro was only invoked conditionally." >&5 echo "$as_me: error: conditional \"am__fastdepCXX\" was never defined. Usually this means the macro was only invoked conditionally." >&2;} { (exit 1); exit 1; }; } fi : ${CONFIG_STATUS=./config.status} ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5 echo "$as_me: creating $CONFIG_STATUS" >&6;} cat >$CONFIG_STATUS <<_ACEOF #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF ## --------------------- ## ## M4sh Initialization. ## ## --------------------- ## # Be Bourne compatible if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then set -o posix fi DUALCASE=1; export DUALCASE # for MKS sh # Support unset when possible. if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then as_unset=unset else as_unset=false fi # Work around bugs in pre-3.0 UWIN ksh. $as_unset ENV MAIL MAILPATH PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. for as_var in \ LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ LC_TELEPHONE LC_TIME do if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then eval $as_var=C; export $as_var else $as_unset $as_var fi done # Required to use basename. if expr a : '\(a\)' >/dev/null 2>&1; then as_expr=expr else as_expr=false fi if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi # Name of the executable. as_me=`$as_basename "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)$' \| \ . : '\(.\)' 2>/dev/null || echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; } /^X\/\(\/\/\)$/{ s//\1/; q; } /^X\/\(\/\).*/{ s//\1/; q; } s/.*/./; q'` # PATH needs CR, and LINENO needs CR and PATH. # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then echo "#! /bin/sh" >conf$$.sh echo "exit 0" >>conf$$.sh chmod +x conf$$.sh if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then PATH_SEPARATOR=';' else PATH_SEPARATOR=: fi rm -f conf$$.sh fi as_lineno_1=$LINENO as_lineno_2=$LINENO as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` test "x$as_lineno_1" != "x$as_lineno_2" && test "x$as_lineno_3" = "x$as_lineno_2" || { # Find who we are. Look in the path if we contain no path at all # relative or not. case $0 in *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then { { echo "$as_me:$LINENO: error: cannot find myself; rerun with an absolute path" >&5 echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2;} { (exit 1); exit 1; }; } fi case $CONFIG_SHELL in '') as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for as_base in sh bash ksh sh5; do case $as_dir in /*) if ("$as_dir/$as_base" -c ' as_lineno_1=$LINENO as_lineno_2=$LINENO as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` test "x$as_lineno_1" != "x$as_lineno_2" && test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; } $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; } CONFIG_SHELL=$as_dir/$as_base export CONFIG_SHELL exec "$CONFIG_SHELL" "$0" ${1+"$@"} fi;; esac done done ;; esac # Create $as_me.lineno as a copy of $as_myself, but with $LINENO # uniformly replaced by the line number. The first 'sed' inserts a # line-number line before each line; the second 'sed' does the real # work. The second script uses 'N' to pair each line-number line # with the numbered line, and appends trailing '-' during # substitution so that $LINENO is not a special case at line end. # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-) sed '=' <$as_myself | sed ' N s,$,-, : loop s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3, t loop s,-$,, s,^['$as_cr_digits']*\n,, ' >$as_me.lineno && chmod +x $as_me.lineno || { { echo "$as_me:$LINENO: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&5 echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2;} { (exit 1); exit 1; }; } # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensible to this). . ./$as_me.lineno # Exit status is that of the last command. exit } case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in *c*,-n*) ECHO_N= ECHO_C=' ' ECHO_T=' ' ;; *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;; *) ECHO_N= ECHO_C='\c' ECHO_T= ;; esac if expr a : '\(a\)' >/dev/null 2>&1; then as_expr=expr else as_expr=false fi rm -f conf$$ conf$$.exe conf$$.file echo >conf$$.file if ln -s conf$$.file conf$$ 2>/dev/null; then # We could just check for DJGPP; but this test a) works b) is more generic # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04). if test -f conf$$.exe; then # Don't use ln at all; we don't have any links as_ln_s='cp -p' else as_ln_s='ln -s' fi elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.file if mkdir -p . 2>/dev/null; then as_mkdir_p=: else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_executable_p="test -f" # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" # IFS # We need space, tab and new line, in precisely that order. as_nl=' ' IFS=" $as_nl" # CDPATH. $as_unset CDPATH exec 6>&1 # Open the log real soon, to keep \$[0] and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. Logging --version etc. is OK. exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX } >&5 cat >&5 <<_CSEOF This file was extended by $as_me, which was generated by GNU Autoconf 2.59. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ _CSEOF echo "on `(hostname || uname -n) 2>/dev/null | sed 1q`" >&5 echo >&5 _ACEOF # Files that config.status was made for. if test -n "$ac_config_files"; then echo "config_files=\"$ac_config_files\"" >>$CONFIG_STATUS fi if test -n "$ac_config_headers"; then echo "config_headers=\"$ac_config_headers\"" >>$CONFIG_STATUS fi if test -n "$ac_config_links"; then echo "config_links=\"$ac_config_links\"" >>$CONFIG_STATUS fi if test -n "$ac_config_commands"; then echo "config_commands=\"$ac_config_commands\"" >>$CONFIG_STATUS fi cat >>$CONFIG_STATUS <<\_ACEOF ac_cs_usage="\ \`$as_me' instantiates files from templates according to the current configuration. Usage: $0 [OPTIONS] [FILE]... -h, --help print this help, then exit -V, --version print version number, then exit -q, --quiet do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE Configuration files: $config_files Configuration commands: $config_commands Report bugs to ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF ac_cs_version="\\ config.status configured by $0, generated by GNU Autoconf 2.59, with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\" Copyright (C) 2003 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." srcdir=$srcdir INSTALL="$INSTALL" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF # If no file are specified by the user, then we need to provide default # value. By we need to know if files were specified by the user. ac_need_defaults=: while test $# != 0 do case $1 in --*=*) ac_option=`expr "x$1" : 'x\([^=]*\)='` ac_optarg=`expr "x$1" : 'x[^=]*=\(.*\)'` ac_shift=: ;; -*) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; *) # This is not an option, so the user has probably given explicit # arguments. ac_option=$1 ac_need_defaults=false;; esac case $ac_option in # Handling of the options. _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --vers* | -V ) echo "$ac_cs_version"; exit 0 ;; --he | --h) # Conflict between --help and --header { { echo "$as_me:$LINENO: error: ambiguous option: $1 Try \`$0 --help' for more information." >&5 echo "$as_me: error: ambiguous option: $1 Try \`$0 --help' for more information." >&2;} { (exit 1); exit 1; }; };; --help | --hel | -h ) echo "$ac_cs_usage"; exit 0 ;; --debug | --d* | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift CONFIG_FILES="$CONFIG_FILES $ac_optarg" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift CONFIG_HEADERS="$CONFIG_HEADERS $ac_optarg" ac_need_defaults=false;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) { { echo "$as_me:$LINENO: error: unrecognized option: $1 Try \`$0 --help' for more information." >&5 echo "$as_me: error: unrecognized option: $1 Try \`$0 --help' for more information." >&2;} { (exit 1); exit 1; }; } ;; *) ac_config_targets="$ac_config_targets $1" ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF if \$ac_cs_recheck; then echo "running $SHELL $0 " $ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6 exec $SHELL $0 $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF # # INIT-COMMANDS section. # AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF for ac_config_target in $ac_config_targets do case "$ac_config_target" in # Handling of arguments. "Makefile" ) CONFIG_FILES="$CONFIG_FILES Makefile" ;; "src/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/Makefile" ;; "iax.spec" ) CONFIG_FILES="$CONFIG_FILES iax.spec" ;; "iax-config" ) CONFIG_FILES="$CONFIG_FILES iax-config" ;; "depfiles" ) CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; "default" ) CONFIG_COMMANDS="$CONFIG_COMMANDS default" ;; *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5 echo "$as_me: error: invalid argument: $ac_config_target" >&2;} { (exit 1); exit 1; }; };; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason to put it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Create a temporary directory, and hook for its removal unless debugging. $debug || { trap 'exit_status=$?; rm -rf $tmp && exit $exit_status' 0 trap '{ (exit 1); exit 1; }' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d -q "./confstatXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" } || { tmp=./confstat$$-$RANDOM (umask 077 && mkdir $tmp) } || { echo "$me: cannot create a temporary directory in ." >&2 { (exit 1); exit 1; } } _ACEOF cat >>$CONFIG_STATUS <<_ACEOF # # CONFIG_FILES section. # # No need to generate the scripts if there are no CONFIG_FILES. # This happens for instance when ./config.status config.h if test -n "\$CONFIG_FILES"; then # Protect against being on the right side of a sed subst in config.status. sed 's/,@/@@/; s/@,/@@/; s/,;t t\$/@;t t/; /@;t t\$/s/[\\\\&,]/\\\\&/g; s/@@/,@/; s/@@/@,/; s/@;t t\$/,;t t/' >\$tmp/subs.sed <<\\CEOF s,@SHELL@,$SHELL,;t t s,@PATH_SEPARATOR@,$PATH_SEPARATOR,;t t s,@PACKAGE_NAME@,$PACKAGE_NAME,;t t s,@PACKAGE_TARNAME@,$PACKAGE_TARNAME,;t t s,@PACKAGE_VERSION@,$PACKAGE_VERSION,;t t s,@PACKAGE_STRING@,$PACKAGE_STRING,;t t s,@PACKAGE_BUGREPORT@,$PACKAGE_BUGREPORT,;t t s,@exec_prefix@,$exec_prefix,;t t s,@prefix@,$prefix,;t t s,@program_transform_name@,$program_transform_name,;t t s,@bindir@,$bindir,;t t s,@sbindir@,$sbindir,;t t s,@libexecdir@,$libexecdir,;t t s,@datadir@,$datadir,;t t s,@sysconfdir@,$sysconfdir,;t t s,@sharedstatedir@,$sharedstatedir,;t t s,@localstatedir@,$localstatedir,;t t s,@libdir@,$libdir,;t t s,@includedir@,$includedir,;t t s,@oldincludedir@,$oldincludedir,;t t s,@infodir@,$infodir,;t t s,@mandir@,$mandir,;t t s,@build_alias@,$build_alias,;t t s,@host_alias@,$host_alias,;t t s,@target_alias@,$target_alias,;t t s,@DEFS@,$DEFS,;t t s,@ECHO_C@,$ECHO_C,;t t s,@ECHO_N@,$ECHO_N,;t t s,@ECHO_T@,$ECHO_T,;t t s,@LIBS@,$LIBS,;t t s,@INSTALL_PROGRAM@,$INSTALL_PROGRAM,;t t s,@INSTALL_SCRIPT@,$INSTALL_SCRIPT,;t t s,@INSTALL_DATA@,$INSTALL_DATA,;t t s,@CYGPATH_W@,$CYGPATH_W,;t t s,@PACKAGE@,$PACKAGE,;t t s,@VERSION@,$VERSION,;t t s,@ACLOCAL@,$ACLOCAL,;t t s,@AUTOCONF@,$AUTOCONF,;t t s,@AUTOMAKE@,$AUTOMAKE,;t t s,@AUTOHEADER@,$AUTOHEADER,;t t s,@MAKEINFO@,$MAKEINFO,;t t s,@AMTAR@,$AMTAR,;t t s,@install_sh@,$install_sh,;t t s,@STRIP@,$STRIP,;t t s,@ac_ct_STRIP@,$ac_ct_STRIP,;t t s,@INSTALL_STRIP_PROGRAM@,$INSTALL_STRIP_PROGRAM,;t t s,@mkdir_p@,$mkdir_p,;t t s,@AWK@,$AWK,;t t s,@SET_MAKE@,$SET_MAKE,;t t s,@am__leading_dot@,$am__leading_dot,;t t s,@CC@,$CC,;t t s,@CFLAGS@,$CFLAGS,;t t s,@LDFLAGS@,$LDFLAGS,;t t s,@CPPFLAGS@,$CPPFLAGS,;t t s,@ac_ct_CC@,$ac_ct_CC,;t t s,@EXEEXT@,$EXEEXT,;t t s,@OBJEXT@,$OBJEXT,;t t s,@DEPDIR@,$DEPDIR,;t t s,@am__include@,$am__include,;t t s,@am__quote@,$am__quote,;t t s,@AMDEP_TRUE@,$AMDEP_TRUE,;t t s,@AMDEP_FALSE@,$AMDEP_FALSE,;t t s,@AMDEPBACKSLASH@,$AMDEPBACKSLASH,;t t s,@CCDEPMODE@,$CCDEPMODE,;t t s,@am__fastdepCC_TRUE@,$am__fastdepCC_TRUE,;t t s,@am__fastdepCC_FALSE@,$am__fastdepCC_FALSE,;t t s,@build@,$build,;t t s,@build_cpu@,$build_cpu,;t t s,@build_vendor@,$build_vendor,;t t s,@build_os@,$build_os,;t t s,@host@,$host,;t t s,@host_cpu@,$host_cpu,;t t s,@host_vendor@,$host_vendor,;t t s,@host_os@,$host_os,;t t s,@EGREP@,$EGREP,;t t s,@LN_S@,$LN_S,;t t s,@ECHO@,$ECHO,;t t s,@AR@,$AR,;t t s,@ac_ct_AR@,$ac_ct_AR,;t t s,@RANLIB@,$RANLIB,;t t s,@ac_ct_RANLIB@,$ac_ct_RANLIB,;t t s,@CPP@,$CPP,;t t s,@CXX@,$CXX,;t t s,@CXXFLAGS@,$CXXFLAGS,;t t s,@ac_ct_CXX@,$ac_ct_CXX,;t t s,@CXXDEPMODE@,$CXXDEPMODE,;t t s,@am__fastdepCXX_TRUE@,$am__fastdepCXX_TRUE,;t t s,@am__fastdepCXX_FALSE@,$am__fastdepCXX_FALSE,;t t s,@CXXCPP@,$CXXCPP,;t t s,@F77@,$F77,;t t s,@FFLAGS@,$FFLAGS,;t t s,@ac_ct_F77@,$ac_ct_F77,;t t s,@LIBTOOL@,$LIBTOOL,;t t s,@IAX_VERSION@,$IAX_VERSION,;t t s,@LIBOBJS@,$LIBOBJS,;t t s,@LTLIBOBJS@,$LTLIBOBJS,;t t CEOF _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF # Split the substitutions into bite-sized pieces for seds with # small command number limits, like on Digital OSF/1 and HP-UX. ac_max_sed_lines=48 ac_sed_frag=1 # Number of current file. ac_beg=1 # First line for current file. ac_end=$ac_max_sed_lines # Line after last line for current file. ac_more_lines=: ac_sed_cmds= while $ac_more_lines; do if test $ac_beg -gt 1; then sed "1,${ac_beg}d; ${ac_end}q" $tmp/subs.sed >$tmp/subs.frag else sed "${ac_end}q" $tmp/subs.sed >$tmp/subs.frag fi if test ! -s $tmp/subs.frag; then ac_more_lines=false else # The purpose of the label and of the branching condition is to # speed up the sed processing (if there are no `@' at all, there # is no need to browse any of the substitutions). # These are the two extra sed commands mentioned above. (echo ':t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b' && cat $tmp/subs.frag) >$tmp/subs-$ac_sed_frag.sed if test -z "$ac_sed_cmds"; then ac_sed_cmds="sed -f $tmp/subs-$ac_sed_frag.sed" else ac_sed_cmds="$ac_sed_cmds | sed -f $tmp/subs-$ac_sed_frag.sed" fi ac_sed_frag=`expr $ac_sed_frag + 1` ac_beg=$ac_end ac_end=`expr $ac_end + $ac_max_sed_lines` fi done if test -z "$ac_sed_cmds"; then ac_sed_cmds=cat fi fi # test -n "$CONFIG_FILES" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF for ac_file in : $CONFIG_FILES; do test "x$ac_file" = x: && continue # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". case $ac_file in - | *:- | *:-:* ) # input from stdin cat >$tmp/stdin ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; * ) ac_file_in=$ac_file.in ;; esac # Compute @srcdir@, @top_srcdir@, and @INSTALL@ for subdirectories. ac_dir=`(dirname "$ac_file") 2>/dev/null || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| \ . : '\(.\)' 2>/dev/null || echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } /^X\(\/\/\)$/{ s//\1/; q; } /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'` { if $as_mkdir_p; then mkdir -p "$ac_dir" else as_dir="$ac_dir" as_dirs= while test ! -d "$as_dir"; do as_dirs="$as_dir $as_dirs" as_dir=`(dirname "$as_dir") 2>/dev/null || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| \ . : '\(.\)' 2>/dev/null || echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } /^X\(\/\/\)$/{ s//\1/; q; } /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'` done test ! -n "$as_dirs" || mkdir $as_dirs fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5 echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;} { (exit 1); exit 1; }; }; } ac_builddir=. if test "$ac_dir" != .; then ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` # A "../" for each directory in $ac_dir_suffix. ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` else ac_dir_suffix= ac_top_builddir= fi case $srcdir in .) # No --srcdir option. We are building in place. ac_srcdir=. if test -z "$ac_top_builddir"; then ac_top_srcdir=. else ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` fi ;; [\\/]* | ?:[\\/]* ) # Absolute path. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ;; *) # Relative path. ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_builddir$srcdir ;; esac # Do not use `cd foo && pwd` to compute absolute paths, because # the directories may not exist. case `pwd` in .) ac_abs_builddir="$ac_dir";; *) case "$ac_dir" in .) ac_abs_builddir=`pwd`;; [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";; *) ac_abs_builddir=`pwd`/"$ac_dir";; esac;; esac case $ac_abs_builddir in .) ac_abs_top_builddir=${ac_top_builddir}.;; *) case ${ac_top_builddir}. in .) ac_abs_top_builddir=$ac_abs_builddir;; [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;; *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;; esac;; esac case $ac_abs_builddir in .) ac_abs_srcdir=$ac_srcdir;; *) case $ac_srcdir in .) ac_abs_srcdir=$ac_abs_builddir;; [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;; *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;; esac;; esac case $ac_abs_builddir in .) ac_abs_top_srcdir=$ac_top_srcdir;; *) case $ac_top_srcdir in .) ac_abs_top_srcdir=$ac_abs_builddir;; [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;; *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;; esac;; esac case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_builddir$INSTALL ;; esac if test x"$ac_file" != x-; then { echo "$as_me:$LINENO: creating $ac_file" >&5 echo "$as_me: creating $ac_file" >&6;} rm -f "$ac_file" fi # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ if test x"$ac_file" = x-; then configure_input= else configure_input="$ac_file. " fi configure_input=$configure_input"Generated from `echo $ac_file_in | sed 's,.*/,,'` by configure." # First look for the input files in the build tree, otherwise in the # src tree. ac_file_inputs=`IFS=: for f in $ac_file_in; do case $f in -) echo $tmp/stdin ;; [\\/$]*) # Absolute (can't be DOS-style, as IFS=:) test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 echo "$as_me: error: cannot find input file: $f" >&2;} { (exit 1); exit 1; }; } echo "$f";; *) # Relative if test -f "$f"; then # Build tree echo "$f" elif test -f "$srcdir/$f"; then # Source tree echo "$srcdir/$f" else # /dev/null tree { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 echo "$as_me: error: cannot find input file: $f" >&2;} { (exit 1); exit 1; }; } fi;; esac done` || { (exit 1); exit 1; } _ACEOF cat >>$CONFIG_STATUS <<_ACEOF sed "$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s,@configure_input@,$configure_input,;t t s,@srcdir@,$ac_srcdir,;t t s,@abs_srcdir@,$ac_abs_srcdir,;t t s,@top_srcdir@,$ac_top_srcdir,;t t s,@abs_top_srcdir@,$ac_abs_top_srcdir,;t t s,@builddir@,$ac_builddir,;t t s,@abs_builddir@,$ac_abs_builddir,;t t s,@top_builddir@,$ac_top_builddir,;t t s,@abs_top_builddir@,$ac_abs_top_builddir,;t t s,@INSTALL@,$ac_INSTALL,;t t " $ac_file_inputs | (eval "$ac_sed_cmds") >$tmp/out rm -f $tmp/stdin if test x"$ac_file" != x-; then mv $tmp/out $ac_file else cat $tmp/out rm -f $tmp/out fi done _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF # # CONFIG_COMMANDS section. # for ac_file in : $CONFIG_COMMANDS; do test "x$ac_file" = x: && continue ac_dest=`echo "$ac_file" | sed 's,:.*,,'` ac_source=`echo "$ac_file" | sed 's,[^:]*:,,'` ac_dir=`(dirname "$ac_dest") 2>/dev/null || $as_expr X"$ac_dest" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_dest" : 'X\(//\)[^/]' \| \ X"$ac_dest" : 'X\(//\)$' \| \ X"$ac_dest" : 'X\(/\)' \| \ . : '\(.\)' 2>/dev/null || echo X"$ac_dest" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } /^X\(\/\/\)$/{ s//\1/; q; } /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'` { if $as_mkdir_p; then mkdir -p "$ac_dir" else as_dir="$ac_dir" as_dirs= while test ! -d "$as_dir"; do as_dirs="$as_dir $as_dirs" as_dir=`(dirname "$as_dir") 2>/dev/null || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| \ . : '\(.\)' 2>/dev/null || echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } /^X\(\/\/\)$/{ s//\1/; q; } /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'` done test ! -n "$as_dirs" || mkdir $as_dirs fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5 echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;} { (exit 1); exit 1; }; }; } ac_builddir=. if test "$ac_dir" != .; then ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` # A "../" for each directory in $ac_dir_suffix. ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` else ac_dir_suffix= ac_top_builddir= fi case $srcdir in .) # No --srcdir option. We are building in place. ac_srcdir=. if test -z "$ac_top_builddir"; then ac_top_srcdir=. else ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` fi ;; [\\/]* | ?:[\\/]* ) # Absolute path. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ;; *) # Relative path. ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_builddir$srcdir ;; esac # Do not use `cd foo && pwd` to compute absolute paths, because # the directories may not exist. case `pwd` in .) ac_abs_builddir="$ac_dir";; *) case "$ac_dir" in .) ac_abs_builddir=`pwd`;; [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";; *) ac_abs_builddir=`pwd`/"$ac_dir";; esac;; esac case $ac_abs_builddir in .) ac_abs_top_builddir=${ac_top_builddir}.;; *) case ${ac_top_builddir}. in .) ac_abs_top_builddir=$ac_abs_builddir;; [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;; *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;; esac;; esac case $ac_abs_builddir in .) ac_abs_srcdir=$ac_srcdir;; *) case $ac_srcdir in .) ac_abs_srcdir=$ac_abs_builddir;; [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;; *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;; esac;; esac case $ac_abs_builddir in .) ac_abs_top_srcdir=$ac_top_srcdir;; *) case $ac_top_srcdir in .) ac_abs_top_srcdir=$ac_abs_builddir;; [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;; *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;; esac;; esac { echo "$as_me:$LINENO: executing $ac_dest commands" >&5 echo "$as_me: executing $ac_dest commands" >&6;} case $ac_dest in depfiles ) test x"$AMDEP_TRUE" != x"" || for mf in $CONFIG_FILES; do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named `Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # So let's grep whole file. if grep '^#.*generated by automake' $mf > /dev/null 2>&1; then dirpart=`(dirname "$mf") 2>/dev/null || $as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$mf" : 'X\(//\)[^/]' \| \ X"$mf" : 'X\(//\)$' \| \ X"$mf" : 'X\(/\)' \| \ . : '\(.\)' 2>/dev/null || echo X"$mf" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } /^X\(\/\/\)$/{ s//\1/; q; } /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'` else continue fi grep '^DEP_FILES *= *[^ #]' < "$mf" > /dev/null || continue # Extract the definition of DEP_FILES from the Makefile without # running `make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue # When using ansi2knr, U may be empty or an underscore; expand it U=`sed -n 's/^U = //p' < "$mf"` test -d "$dirpart/$DEPDIR" || mkdir "$dirpart/$DEPDIR" # We invoke sed twice because it is the simplest approach to # changing $(DEPDIR) to its actual value in the expansion. for file in `sed -n ' /^DEP_FILES = .*\\\\$/ { s/^DEP_FILES = // :loop s/\\\\$// p n /\\\\$/ b loop p } /^DEP_FILES = / s/^DEP_FILES = //p' < "$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`(dirname "$file") 2>/dev/null || $as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$file" : 'X\(//\)[^/]' \| \ X"$file" : 'X\(//\)$' \| \ X"$file" : 'X\(/\)' \| \ . : '\(.\)' 2>/dev/null || echo X"$file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } /^X\(\/\/\)$/{ s//\1/; q; } /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'` { if $as_mkdir_p; then mkdir -p $dirpart/$fdir else as_dir=$dirpart/$fdir as_dirs= while test ! -d "$as_dir"; do as_dirs="$as_dir $as_dirs" as_dir=`(dirname "$as_dir") 2>/dev/null || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| \ . : '\(.\)' 2>/dev/null || echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } /^X\(\/\/\)$/{ s//\1/; q; } /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'` done test ! -n "$as_dirs" || mkdir $as_dirs fi || { { echo "$as_me:$LINENO: error: cannot create directory $dirpart/$fdir" >&5 echo "$as_me: error: cannot create directory $dirpart/$fdir" >&2;} { (exit 1); exit 1; }; }; } # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done ;; default ) case "$CONFIG_FILES" in *iax-config*)chmod +x iax-config;; esac ;; esac done _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF { (exit 0); exit 0; } _ACEOF chmod +x $CONFIG_STATUS ac_clean_files=$ac_clean_files_save # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || { (exit 1); exit 1; } fi iaxmodem-1.2.0/lib/libiax2/README0000644000175000017500000000027511150047217015635 0ustar julienjulienlibiax: An implementation of the Inter-Asterisk eXchange protocol distributed under the terms of the GNU Lesser General Public License Written by Mark Spencer iaxmodem-1.2.0/lib/libiax2/NEWS0000644000175000017500000000014711150047217015452 0ustar julienjulienlibiax ====== 0.2.3: 0.2.2: 0.2.1: 0.2.0 (Oct 10th, 2001): Initial Release. Hooray! Rejoice! :) iaxmodem-1.2.0/lib/libiax2/src/0000755000175000017500000000000011150047457015546 5ustar julienjulieniaxmodem-1.2.0/lib/libiax2/src/Makefile.am0000644000175000017500000000122711150047217017576 0ustar julienjulienAM_CFLAGS = -Wall -O2 AM_CFLAGS += -g -Wall -Wstrict-prototypes -I . AM_CFLAGS += -DDEBUG_SUPPORT -DLIBIAX AM_CFLAGS += -fsigned-char # -DDEBUG_DEFAULT AM_CFLAGS += $(UCFLAGS) pkgdir = $(libdir) pkg_LTLIBRARIES=libiax.la libiax_la_SOURCES = iax2-parser.c iax.c md5.c jitterbuf.c EXTRA_DIST = md5.h frame.h iax-client.h iax2.h iax2-parser.h jitterbuf.h install-data-local: mkdir -p $(includedir)/iax install -m 644 md5.h $(includedir)/iax install -m 644 frame.h $(includedir)/iax install -m 644 iax.h $(includedir)/iax install -m 644 iax2.h $(includedir)/iax install -m 644 iax2-parser.h $(includedir)/iax install -m 644 iax-client.h $(includedir)/iax iaxmodem-1.2.0/lib/libiax2/src/jitterbuf.c0000644000175000017500000005277711150047217017724 0ustar julienjulien/* * jitterbuf: an application-independent jitterbuffer * * Copyrights: * Copyright (C) 2004-2005, Horizon Wimba, Inc. * * Contributors: * Steve Kann * * This program is free software, distributed under the terms of * the GNU Lesser (Library) General Public License * * Copyright on this file is disclaimed to Digium for inclusion in Asterisk */ #include #include #include #include #include "jitterbuf.h" /* define these here, just for ancient compiler systems */ #define JB_LONGMAX 2147483647L #define JB_LONGMIN (-JB_LONGMAX - 1L) /* MS VC can't do __VA_ARGS__ */ #if (defined(WIN32) || defined(_WIN32_WCE)) && defined(_MSC_VER) #define jb_warn if (warnf) warnf #define jb_err if (errf) errf #define jb_dbg if (dbgf) dbgf #ifdef DEEP_DEBUG #define jb_dbg2 if (dbgf) dbgf #else #define jb_dbg2 if (0) dbgf #endif #else #define jb_warn(...) (warnf ? warnf(__VA_ARGS__) : (void)0) #define jb_err(...) (errf ? errf(__VA_ARGS__) : (void)0) #define jb_dbg(...) (dbgf ? dbgf(__VA_ARGS__) : (void)0) #ifdef DEEP_DEBUG #define jb_dbg2(...) (dbgf ? dbgf(__VA_ARGS__) : (void)0) #else #define jb_dbg2(...) ((void)0) #endif #endif static jb_output_function_t warnf, errf, dbgf; void jb_setoutput(jb_output_function_t err, jb_output_function_t warn, jb_output_function_t dbg) { errf = err; warnf = warn; dbgf = dbg; } static void increment_losspct(jitterbuf *jb) { jb->info.losspct = (100000 + 499 * jb->info.losspct)/500; } static void decrement_losspct(jitterbuf *jb) { jb->info.losspct = (499 * jb->info.losspct)/500; } void jb_reset(jitterbuf *jb) { /* only save settings */ jb_conf s = jb->info.conf; memset(jb, 0, sizeof(*jb)); jb->info.conf = s; /* initialize length, using the configured value */ jb->info.current = jb->info.target = jb->info.conf.target_extra; jb->info.silence_begin_ts = -1; } jitterbuf * jb_new() { jitterbuf *jb; if (!(jb = (jitterbuf *)malloc(sizeof(*jb)))) return NULL; jb->info.conf.target_extra = JB_TARGET_EXTRA; jb_reset(jb); jb_dbg2("jb_new() = %x\n", jb); return jb; } void jb_destroy(jitterbuf *jb) { jb_frame *frame; jb_dbg2("jb_destroy(%x)\n", jb); /* free all the frames on the "free list" */ frame = jb->free; while (frame != NULL) { jb_frame *next = frame->next; free(frame); frame = next; } /* free ourselves! */ free(jb); } #if 0 static int longcmp(const void *a, const void *b) { return *(long *)a - *(long *)b; } #endif /* simple history manipulation */ /* maybe later we can make the history buckets variable size, or something? */ /* drop parameter determines whether we will drop outliers to minimize * delay */ static int history_put(jitterbuf *jb, long ts, long now, long ms) { long delay = now - (ts - jb->info.resync_offset); long threshold = 2 * jb->info.jitter + jb->info.conf.resync_threshold; long kicked; /* don't add special/negative times to history */ if (ts <= 0) return 0; /* check for drastic change in delay */ if (jb->info.conf.resync_threshold != -1) { if (abs(delay - jb->info.last_delay) > threshold) { jb->info.cnt_delay_discont++; if (jb->info.cnt_delay_discont > 3) { /* resync the jitterbuffer */ jb->info.cnt_delay_discont = 0; jb->hist_ptr = 0; jb->hist_maxbuf_valid = 0; jb_warn("Resyncing the jb. last_delay %ld, this delay %ld, threshold %ld, new offset %ld\n", jb->info.last_delay, delay, threshold, ts - now); jb->info.resync_offset = ts - now; jb->info.last_delay = delay = 0; /* after resync, frame is right on time */ } else { return -1; } } else { jb->info.last_delay = delay; jb->info.cnt_delay_discont = 0; } } kicked = jb->history[jb->hist_ptr % JB_HISTORY_SZ]; jb->history[(jb->hist_ptr++) % JB_HISTORY_SZ] = delay; /* optimization; the max/min buffers don't need to be recalculated, * if this packet's entry doesn't change them. This happens if this * packet is not involved, _and_ any packet that got kicked out of * the history is also not involved. We do a number of comparisons, * but it's probably still worthwhile, because it will usually * succeed, and should be a lot faster than going through all 500 * packets in history */ if (!jb->hist_maxbuf_valid) return 0; /* don't do this until we've filled history * (reduces some edge cases below) */ if (jb->hist_ptr < JB_HISTORY_SZ) goto invalidate; /* if the new delay would go into min */ if (delay < jb->hist_minbuf[JB_HISTORY_MAXBUF_SZ-1]) goto invalidate; /* or max.. */ if (delay > jb->hist_maxbuf[JB_HISTORY_MAXBUF_SZ-1]) goto invalidate; /* or the kicked delay would be in min */ if (kicked <= jb->hist_minbuf[JB_HISTORY_MAXBUF_SZ-1]) goto invalidate; if (kicked >= jb->hist_maxbuf[JB_HISTORY_MAXBUF_SZ-1]) goto invalidate; /* if we got here, we don't need to invalidate, 'cause this delay didn't * affect things */ return 0; /* end optimization */ invalidate: jb->hist_maxbuf_valid = 0; return 0; } static void history_calc_maxbuf(jitterbuf *jb) { int i,j; if (jb->hist_ptr == 0) return; /* initialize maxbuf/minbuf to the latest value */ for (i=0;ihist_maxbuf[i] = jb->history[(jb->hist_ptr-1) % JB_HISTORY_SZ]; * jb->hist_minbuf[i] = jb->history[(jb->hist_ptr-1) % JB_HISTORY_SZ]; */ jb->hist_maxbuf[i] = JB_LONGMIN; jb->hist_minbuf[i] = JB_LONGMAX; } /* use insertion sort to populate maxbuf */ /* we want it to be the top "n" values, in order */ /* start at the beginning, or JB_HISTORY_SZ frames ago */ i = (jb->hist_ptr > JB_HISTORY_SZ) ? (jb->hist_ptr - JB_HISTORY_SZ) : 0; for (;ihist_ptr;i++) { long toins = jb->history[i % JB_HISTORY_SZ]; /* if the maxbuf should get this */ if (toins > jb->hist_maxbuf[JB_HISTORY_MAXBUF_SZ-1]) { /* insertion-sort it into the maxbuf */ for (j=0;j jb->hist_maxbuf[j]) { /* move over */ memmove(jb->hist_maxbuf + j + 1, jb->hist_maxbuf + j, (JB_HISTORY_MAXBUF_SZ - (j + 1)) * sizeof(jb->hist_maxbuf[0])); /* insert */ jb->hist_maxbuf[j] = toins; break; } } } /* if the minbuf should get this */ if (toins < jb->hist_minbuf[JB_HISTORY_MAXBUF_SZ-1]) { /* insertion-sort it into the maxbuf */ for (j=0;jhist_minbuf[j]) { /* move over */ memmove(jb->hist_minbuf + j + 1, jb->hist_minbuf + j, (JB_HISTORY_MAXBUF_SZ - (j + 1)) * sizeof(jb->hist_minbuf[0])); /* insert */ jb->hist_minbuf[j] = toins; break; } } } if (0) { int k; fprintf(stderr, "toins = %ld\n", toins); fprintf(stderr, "maxbuf ="); for (k=0;khist_maxbuf[k]); fprintf(stderr, "\nminbuf ="); for (k=0;khist_minbuf[k]); fprintf(stderr, "\n"); } } jb->hist_maxbuf_valid = 1; } static void history_get(jitterbuf *jb) { long max, min, jitter; int index; int count; if (!jb->hist_maxbuf_valid) history_calc_maxbuf(jb); /* count is how many items in history we're examining */ count = (jb->hist_ptr < JB_HISTORY_SZ) ? jb->hist_ptr : JB_HISTORY_SZ; /* index is the "n"ths highest/lowest that we'll look for */ index = count * JB_HISTORY_DROPPCT / 100; /* sanity checks for index */ if (index > (JB_HISTORY_MAXBUF_SZ - 1)) index = JB_HISTORY_MAXBUF_SZ - 1; if (index < 0) { jb->info.min = 0; jb->info.jitter = 0; return; } max = jb->hist_maxbuf[index]; min = jb->hist_minbuf[index]; jitter = max - min; /* these debug stmts compare the difference between looking at the absolute jitter, and the * values we get by throwing away the outliers */ /* fprintf(stderr, "[%d] min=%d, max=%d, jitter=%d\n", index, min, max, jitter); fprintf(stderr, "[%d] min=%d, max=%d, jitter=%d\n", 0, jb->hist_minbuf[0], jb->hist_maxbuf[0], jb->hist_maxbuf[0]-jb->hist_minbuf[0]); */ jb->info.min = min; jb->info.jitter = jitter; } /* returns 1 if frame was inserted into head of queue, 0 otherwise */ static int queue_put(jitterbuf *jb, void *data, const enum jb_frame_type type, long ms, long ts) { jb_frame *frame; jb_frame *p; int head = 0; long resync_ts = ts - jb->info.resync_offset; if ((frame = jb->free)) { jb->free = frame->next; } else if (!(frame = (jb_frame *)malloc(sizeof(*frame)))) { jb_err("cannot allocate frame\n"); return 0; } jb->info.frames_cur++; frame->data = data; frame->ts = resync_ts; frame->ms = ms; frame->type = type; /* * frames are a circular list, jb-frames points to to the lowest ts, * jb->frames->prev points to the highest ts */ if (!jb->frames) { /* queue is empty */ jb->frames = frame; frame->next = frame; frame->prev = frame; head = 1; } else if (resync_ts < jb->frames->ts) { frame->next = jb->frames; frame->prev = jb->frames->prev; frame->next->prev = frame; frame->prev->next = frame; /* frame is out of order */ jb->info.frames_ooo++; jb->frames = frame; head = 1; } else { p = jb->frames; /* frame is out of order */ if (resync_ts < p->prev->ts) jb->info.frames_ooo++; while (resync_ts < p->prev->ts && p->prev != jb->frames) p = p->prev; frame->next = p; frame->prev = p->prev; frame->next->prev = frame; frame->prev->next = frame; } return head; } static long queue_next(jitterbuf *jb) { if (jb->frames) return jb->frames->ts; else return -1; } static long queue_last(jitterbuf *jb) { if (jb->frames) return jb->frames->prev->ts; else return -1; } static jb_frame *_queue_get(jitterbuf *jb, long ts, int all) { jb_frame *frame; frame = jb->frames; if (!frame) return NULL; /*jb_warn("queue_get: ASK %ld FIRST %ld\n", ts, frame->ts); */ if (all || ts >= frame->ts) { /* remove this frame */ frame->prev->next = frame->next; frame->next->prev = frame->prev; if (frame->next == frame) jb->frames = NULL; else jb->frames = frame->next; /* insert onto "free" single-linked list */ frame->next = jb->free; jb->free = frame; jb->info.frames_cur--; /* we return the frame pointer, even though it's on free list, * but caller must copy data */ return frame; } return NULL; } static jb_frame *queue_get(jitterbuf *jb, long ts) { return _queue_get(jb,ts,0); } static jb_frame *queue_getall(jitterbuf *jb) { return _queue_get(jb,0,1); } #if 0 /* some diagnostics */ static void jb_dbginfo(jitterbuf *jb) { if (dbgf == NULL) return; jb_dbg("\njb info: fin=%ld fout=%ld flate=%ld flost=%ld fdrop=%ld fcur=%ld\n", jb->info.frames_in, jb->info.frames_out, jb->info.frames_late, jb->info.frames_lost, jb->info.frames_dropped, jb->info.frames_cur); jb_dbg("jitter=%ld current=%ld target=%ld min=%ld sil=%d len=%d len/fcur=%ld\n", jb->info.jitter, jb->info.current, jb->info.target, jb->info.min, jb->info.silence_begin_ts, jb->info.current - jb->info.min, jb->info.frames_cur ? (jb->info.current - jb->info.min)/jb->info.frames_cur : -8); if (jb->info.frames_in > 0) jb_dbg("jb info: Loss PCT = %ld%%, Late PCT = %ld%%\n", jb->info.frames_lost * 100/(jb->info.frames_in + jb->info.frames_lost), jb->info.frames_late * 100/jb->info.frames_in); jb_dbg("jb info: queue %d -> %d. last_ts %d (queue len: %d) last_ms %d\n", queue_next(jb), queue_last(jb), jb->info.next_voice_ts, queue_last(jb) - queue_next(jb), jb->info.last_voice_ms); } #endif #ifdef DEEP_DEBUG static void jb_chkqueue(jitterbuf *jb) { int i=0; jb_frame *p = jb->frames; if (!p) { return; } do { if (p->next == NULL) { jb_err("Queue is BROKEN at item [%d]", i); } i++; p=p->next; } while (p->next != jb->frames); } static void jb_dbgqueue(jitterbuf *jb) { int i=0; jb_frame *p = jb->frames; jb_dbg("queue: "); if (!p) { jb_dbg("EMPTY\n"); return; } do { jb_dbg("[%d]=%ld ", i++, p->ts); p=p->next; } while (p->next != jb->frames); jb_dbg("\n"); } #endif enum jb_return_code jb_put(jitterbuf *jb, void *data, const enum jb_frame_type type, long ms, long ts, long now) { jb_dbg2("jb_put(%x,%x,%ld,%ld,%ld)\n", jb, data, ms, ts, now); jb->info.frames_in++; if (type == JB_TYPE_VOICE) { /* presently, I'm only adding VOICE frames to history and drift * calculations; mostly because with the IAX integrations, I'm * sending retransmitted control frames with their awkward * timestamps through */ if (history_put(jb,ts,now,ms)) return JB_DROP; } /* if put into head of queue, caller needs to reschedule */ if (queue_put(jb,data,type,ms,ts)) { return JB_SCHED; } return JB_OK; } static enum jb_return_code _jb_get(jitterbuf *jb, jb_frame *frameout, long now, long interpl) { jb_frame *frame; long diff; /*if ((now - jb_next(jb)) > 2 * jb->info.last_voice_ms) jb_warn("SCHED: %ld", (now - jb_next(jb))); */ /* get jitter info */ history_get(jb); /* target */ jb->info.target = jb->info.jitter + jb->info.min + jb->info.conf.target_extra; /* if a hard clamp was requested, use it */ if ((jb->info.conf.max_jitterbuf) && ((jb->info.target - jb->info.min) > jb->info.conf.max_jitterbuf)) { jb_dbg("clamping target from %d to %d\n", (jb->info.target - jb->info.min), jb->info.conf.max_jitterbuf); jb->info.target = jb->info.min + jb->info.conf.max_jitterbuf; } diff = jb->info.target - jb->info.current; /* jb_warn("diff = %d lms=%d last = %d now = %d\n", diff, */ /* jb->info.last_voice_ms, jb->info.last_adjustment, now); */ /* let's work on non-silent case first */ if (!jb->info.silence_begin_ts) { /* we want to grow */ if ((diff > 0) && /* we haven't grown in the delay length */ (((jb->info.last_adjustment + JB_ADJUST_DELAY) < now) || /* we need to grow more than the "length" we have left */ (diff > queue_last(jb) - queue_next(jb)) ) ) { /* grow by interp frame length */ jb->info.current += interpl; jb->info.next_voice_ts += interpl; jb->info.last_voice_ms = interpl; jb->info.last_adjustment = now; jb->info.cnt_contig_interp++; /* assume silence instead of continuing to interpolate */ if (jb->info.conf.max_contig_interp && jb->info.cnt_contig_interp >= jb->info.conf.max_contig_interp) { jb->info.silence_begin_ts = jb->info.next_voice_ts - jb->info.current; } jb_dbg("G"); return JB_INTERP; } frame = queue_get(jb, jb->info.next_voice_ts - jb->info.current); /* not a voice frame; just return it. */ if (frame && frame->type != JB_TYPE_VOICE) { /* track start of silence */ if (frame->type == JB_TYPE_SILENCE) { jb->info.silence_begin_ts = frame->ts; jb->info.cnt_contig_interp = 0; } *frameout = *frame; jb->info.frames_out++; jb_dbg("o"); return JB_OK; } /* voice frame is later than expected */ if (frame && frame->ts + jb->info.current < jb->info.next_voice_ts) { if (frame->ts + jb->info.current > jb->info.next_voice_ts - jb->info.last_voice_ms) { /* either we interpolated past this frame in the last jb_get */ /* or the frame is still in order, but came a little too quick */ *frameout = *frame; /* reset expectation for next frame */ jb->info.next_voice_ts = frame->ts + jb->info.current + frame->ms; jb->info.frames_out++; decrement_losspct(jb); jb->info.cnt_contig_interp = 0; jb_dbg("v"); return JB_OK; } else { /* voice frame is late */ *frameout = *frame; jb->info.frames_out++; decrement_losspct(jb); jb->info.frames_late++; jb->info.frames_lost--; jb_dbg("l"); /*jb_warn("\nlate: wanted=%ld, this=%ld, next=%ld\n", jb->info.next_voice_ts - jb->info.current, frame->ts, queue_next(jb)); jb_warninfo(jb); */ return JB_DROP; } } /* keep track of frame sizes, to allow for variable sized-frames */ if (frame && frame->ms > 0) { jb->info.last_voice_ms = frame->ms; } /* we want to shrink; shrink at 1 frame / 500ms */ /* unless we don't have a frame, then shrink 1 frame */ /* every 80ms (though perhaps we can shrink even faster */ /* in this case) */ if (diff < -jb->info.conf.target_extra && ((!frame && jb->info.last_adjustment + 80 < now) || (jb->info.last_adjustment + 500 < now))) { jb->info.last_adjustment = now; jb->info.cnt_contig_interp = 0; if (frame) { *frameout = *frame; /* shrink by frame size we're throwing out */ jb->info.current -= frame->ms; jb->info.frames_out++; decrement_losspct(jb); jb->info.frames_dropped++; jb_dbg("s"); return JB_DROP; } else { /* shrink by last_voice_ms */ jb->info.current -= jb->info.last_voice_ms; jb->info.frames_lost++; increment_losspct(jb); jb_dbg("S"); return JB_NOFRAME; } } /* lost frame */ if (!frame) { /* this is a bit of a hack for now, but if we're close to * target, and we find a missing frame, it makes sense to * grow, because the frame might just be a bit late; * otherwise, we presently get into a pattern where we return * INTERP for the lost frame, then it shows up next, and we * throw it away because it's late */ /* I've recently only been able to replicate this using * iaxclient talking to app_echo on asterisk. In this case, * my outgoing packets go through asterisk's (old) * jitterbuffer, and then might get an unusual increasing delay * there if it decides to grow?? */ /* Update: that might have been a different bug, that has been fixed.. * But, this still seemed like a good idea, except that it ended up making a single actual * lost frame get interpolated two or more times, when there was "room" to grow, so it might * be a bit of a bad idea overall */ /*if (diff > -1 * jb->info.last_voice_ms) { jb->info.current += jb->info.last_voice_ms; jb->info.last_adjustment = now; jb_warn("g"); return JB_INTERP; } */ jb->info.frames_lost++; increment_losspct(jb); jb->info.next_voice_ts += interpl; jb->info.last_voice_ms = interpl; jb->info.cnt_contig_interp++; /* assume silence instead of continuing to interpolate */ if (jb->info.conf.max_contig_interp && jb->info.cnt_contig_interp >= jb->info.conf.max_contig_interp) { jb->info.silence_begin_ts = jb->info.next_voice_ts - jb->info.current; } jb_dbg("L"); return JB_INTERP; } /* normal case; return the frame, increment stuff */ *frameout = *frame; jb->info.next_voice_ts += frame->ms; jb->info.frames_out++; jb->info.cnt_contig_interp = 0; decrement_losspct(jb); jb_dbg("v"); return JB_OK; } else { /* TODO: after we get the non-silent case down, we'll make the * silent case -- basically, we'll just grow and shrink faster * here, plus handle next_voice_ts a bit differently */ /* to disable silent special case altogether, just uncomment this: */ /* jb->info.silence_begin_ts = 0; */ /* shrink interpl len every 10ms during silence */ if (diff < -jb->info.conf.target_extra && jb->info.last_adjustment + 10 <= now) { jb->info.current -= interpl; jb->info.last_adjustment = now; } frame = queue_get(jb, now - jb->info.current); if (!frame) { return JB_NOFRAME; } else if (frame->type != JB_TYPE_VOICE) { /* normal case; in silent mode, got a non-voice frame */ *frameout = *frame; jb->info.frames_out++; return JB_OK; } if (frame->ts < jb->info.silence_begin_ts) { /* voice frame is late */ *frameout = *frame; jb->info.frames_out++; decrement_losspct(jb); jb->info.frames_late++; jb->info.frames_lost--; jb_dbg("l"); /*jb_warn("\nlate: wanted=%ld, this=%ld, next=%ld\n", jb->info.next_voice_ts - jb->info.current, frame->ts, queue_next(jb)); jb_warninfo(jb); */ return JB_DROP; } else { /* voice frame */ /* try setting current to target right away here */ jb->info.current = jb->info.target; jb->info.silence_begin_ts = 0; jb->info.next_voice_ts = frame->ts + jb->info.current + frame->ms; jb->info.last_voice_ms = frame->ms; jb->info.frames_out++; decrement_losspct(jb); *frameout = *frame; jb_dbg("V"); return JB_OK; } } } long jb_next(jitterbuf *jb) { if (jb->info.silence_begin_ts) { if (jb->frames) { long next = queue_next(jb); history_get(jb); /* shrink during silence */ if (jb->info.target - jb->info.current < -jb->info.conf.target_extra) return jb->info.last_adjustment + 10; return next + jb->info.target; } else return JB_LONGMAX; } else { return jb->info.next_voice_ts; } } enum jb_return_code jb_get(jitterbuf *jb, jb_frame *frameout, long now, long interpl) { enum jb_return_code ret = _jb_get(jb, frameout, now, interpl); #if 0 static int lastts=0; int thists = ((ret == JB_OK) || (ret == JB_DROP)) ? frameout->ts : 0; jb_warn("jb_get(%x,%x,%ld) = %d (%d)\n", jb, frameout, now, ret, thists); if (thists && thists < lastts) jb_warn("XXXX timestamp roll-back!!!\n"); lastts = thists; #endif return ret; } enum jb_return_code jb_getall(jitterbuf *jb, jb_frame *frameout) { jb_frame *frame; frame = queue_getall(jb); if (!frame) { return JB_NOFRAME; } *frameout = *frame; return JB_OK; } enum jb_return_code jb_getinfo(jitterbuf *jb, jb_info *stats) { history_get(jb); *stats = jb->info; return JB_OK; } enum jb_return_code jb_setconf(jitterbuf *jb, jb_conf *conf) { /* take selected settings from the struct */ jb->info.conf.max_jitterbuf = conf->max_jitterbuf; jb->info.conf.resync_threshold = conf->resync_threshold; jb->info.conf.max_contig_interp = conf->max_contig_interp; /* -1 indicates use of the default JB_TARGET_EXTRA value */ jb->info.conf.target_extra = ( conf->target_extra == -1 ) ? JB_TARGET_EXTRA : conf->target_extra ; /* update these to match new target_extra setting */ jb->info.current = jb->info.conf.target_extra; jb->info.target = jb->info.conf.target_extra; return JB_OK; } iaxmodem-1.2.0/lib/libiax2/src/iax2-parser.h0000644000175000017500000000774411150047217020062 0ustar julienjulien/* * Asterisk -- A telephony toolkit for Linux. * * Implementation of Inter-Asterisk eXchange * * Copyright (C) 2003, Digium * * Mark Spencer * * This program is free software, distributed under the terms of * the GNU Lesser (Library) General Public License */ #ifndef _IAX2_PARSER_H #define _IAX2_PARSER_H struct iax_ies { char *called_number; char *calling_number; char *calling_ani; char *calling_name; int calling_ton; int calling_tns; int calling_pres; char *called_context; char *username; char *password; unsigned int capability; unsigned int format; char *codec_prefs; char *language; int version; unsigned short adsicpe; char *dnid; char *rdnis; unsigned int authmethods; char *challenge; char *md5_result; char *rsa_result; struct sockaddr_in *apparent_addr; unsigned short refresh; unsigned short dpstatus; unsigned short callno; char *cause; unsigned char causecode; unsigned char iax_unknown; int msgcount; int autoanswer; int musiconhold; unsigned int transferid; unsigned int datetime; char *devicetype; char *serviceident; int firmwarever; unsigned int fwdesc; unsigned char *fwdata; unsigned char fwdatalen; unsigned int provver; unsigned short samprate; unsigned int provverpres; unsigned int rr_jitter; unsigned int rr_loss; unsigned int rr_pkts; unsigned short rr_delay; unsigned int rr_dropped; unsigned int rr_ooo; }; #define DIRECTION_INGRESS 1 #define DIRECTION_OUTGRESS 2 struct iax_frame { #ifdef LIBIAX struct iax_session *session; struct iax_event *event; #endif /* /Our/ call number */ unsigned short callno; /* /Their/ call number */ unsigned short dcallno; /* Start of raw frame (outgoing only) */ void *data; /* Length of frame (outgoing only) */ int datalen; /* How many retries so far? */ int retries; /* Outgoing relative timestamp (ms) */ unsigned int ts; /* How long to wait before retrying */ int retrytime; /* Are we received out of order? */ int outoforder; /* Have we been sent at all yet? */ int sentyet; /* Outgoing Packet sequence number */ int oseqno; /* Next expected incoming packet sequence number */ int iseqno; /* Non-zero if should be sent to transfer peer */ int transfer; /* Non-zero if this is the final message */ int final; /* Ingress or outgres */ int direction; /* Retransmission ID */ int retrans; /* Easy linking */ struct iax_frame *next; struct iax_frame *prev; /* Actual, isolated frame header */ struct ast_frame af; unsigned char unused[AST_FRIENDLY_OFFSET]; unsigned char afdata[0]; /* Data for frame */ }; struct iax_ie_data { unsigned char buf[1024]; int pos; }; /* Choose a different function for output */ extern void iax_set_output(void (*output)(const char *data)); /* Choose a different function for errors */ extern void iax_set_error(void (*output)(const char *data)); extern void iax_showframe(struct iax_frame *f, struct ast_iax2_full_hdr *fhi, int rx, struct sockaddr_in *sin, int datalen); extern const char *iax_ie2str(int ie); extern int iax_ie_append_raw(struct iax_ie_data *ied, unsigned char ie, const void *data, int datalen); extern int iax_ie_append_addr(struct iax_ie_data *ied, unsigned char ie, struct sockaddr_in *sin); extern int iax_ie_append_int(struct iax_ie_data *ied, unsigned char ie, unsigned int value); extern int iax_ie_append_short(struct iax_ie_data *ied, unsigned char ie, unsigned short value); extern int iax_ie_append_str(struct iax_ie_data *ied, unsigned char ie, const char *str); extern int iax_ie_append_byte(struct iax_ie_data *ied, unsigned char ie, unsigned char dat); extern int iax_ie_append(struct iax_ie_data *ied, unsigned char ie); extern int iax_parse_ies(struct iax_ies *ies, unsigned char *data, int datalen); extern int iax_get_frames(void); extern int iax_get_iframes(void); extern int iax_get_oframes(void); extern void iax_frame_wrap(struct iax_frame *fr, struct ast_frame *f); extern struct iax_frame *iax_frame_new(int direction, int datalen); extern void iax_frame_free(struct iax_frame *fr); #endif iaxmodem-1.2.0/lib/libiax2/src/Makefile.in0000644000175000017500000003515211150047416017614 0ustar julienjulien# Makefile.in generated by automake 1.8.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ SOURCES = $(libiax_la_SOURCES) srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = .. am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd INSTALL = @INSTALL@ install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : host_triplet = @host@ subdir = src DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.in am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_CLEAN_FILES = am__installdirs = "$(DESTDIR)$(pkgdir)" pkgLTLIBRARIES_INSTALL = $(INSTALL) LTLIBRARIES = $(pkg_LTLIBRARIES) libiax_la_LIBADD = am_libiax_la_OBJECTS = iax2-parser.lo iax.lo md5.lo jitterbuf.lo libiax_la_OBJECTS = $(am_libiax_la_OBJECTS) DEFAULT_INCLUDES = -I. -I$(srcdir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles @AMDEP_TRUE@DEP_FILES = ./$(DEPDIR)/iax.Plo \ @AMDEP_TRUE@ ./$(DEPDIR)/iax2-parser.Plo \ @AMDEP_TRUE@ ./$(DEPDIR)/jitterbuf.Plo ./$(DEPDIR)/md5.Plo COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(LIBTOOL) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ SOURCES = $(libiax_la_SOURCES) DIST_SOURCES = $(libiax_la_SOURCES) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMDEP_FALSE = @AMDEP_FALSE@ AMDEP_TRUE = @AMDEP_TRUE@ AMTAR = @AMTAR@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ IAX_VERSION = @IAX_VERSION@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ ac_ct_RANLIB = @ac_ct_RANLIB@ ac_ct_STRIP = @ac_ct_STRIP@ am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ datadir = @datadir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ prefix = @prefix@ program_transform_name = @program_transform_name@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ # -DDEBUG_DEFAULT AM_CFLAGS = -Wall -O2 -g -Wall -Wstrict-prototypes -I . -DDEBUG_SUPPORT -DLIBIAX -fsigned-char $(UCFLAGS) pkgdir = $(libdir) pkg_LTLIBRARIES = libiax.la libiax_la_SOURCES = iax2-parser.c iax.c md5.c jitterbuf.c EXTRA_DIST = md5.h frame.h iax-client.h iax2.h iax2-parser.h jitterbuf.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu src/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh install-pkgLTLIBRARIES: $(pkg_LTLIBRARIES) @$(NORMAL_INSTALL) test -z "$(pkgdir)" || $(mkdir_p) "$(DESTDIR)$(pkgdir)" @list='$(pkg_LTLIBRARIES)'; for p in $$list; do \ if test -f $$p; then \ f="`echo $$p | sed -e 's|^.*/||'`"; \ echo " $(LIBTOOL) --mode=install $(pkgLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) '$$p' '$(DESTDIR)$(pkgdir)/$$f'"; \ $(LIBTOOL) --mode=install $(pkgLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) "$$p" "$(DESTDIR)$(pkgdir)/$$f"; \ else :; fi; \ done uninstall-pkgLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(pkg_LTLIBRARIES)'; for p in $$list; do \ p="`echo $$p | sed -e 's|^.*/||'`"; \ echo " $(LIBTOOL) --mode=uninstall rm -f '$(DESTDIR)$(pkgdir)/$$p'"; \ $(LIBTOOL) --mode=uninstall rm -f "$(DESTDIR)$(pkgdir)/$$p"; \ done clean-pkgLTLIBRARIES: -test -z "$(pkg_LTLIBRARIES)" || rm -f $(pkg_LTLIBRARIES) @list='$(pkg_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" = "$$p" && dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libiax.la: $(libiax_la_OBJECTS) $(libiax_la_DEPENDENCIES) $(LINK) -rpath $(pkgdir) $(libiax_la_LDFLAGS) $(libiax_la_OBJECTS) $(libiax_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/iax.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/iax2-parser.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jitterbuf.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/md5.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ if $(LTCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ depfile='$(DEPDIR)/$*.Plo' tmpdepfile='$(DEPDIR)/$*.TPlo' @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs distclean-libtool: -rm -f libtool uninstall-info-am: ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(ETAGS_ARGS)$$tags$$unique" \ || $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ list='$(DISTFILES)'; for file in $$list; do \ case $$file in \ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ esac; \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ dir="/$$dir"; \ $(mkdir_p) "$(distdir)$$dir"; \ else \ dir=''; \ fi; \ if test -d $$d/$$file; then \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: for dir in "$(DESTDIR)$(pkgdir)"; do \ test -z "$$dir" || $(mkdir_p) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-pkgLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-libtool distclean-tags dvi: dvi-am dvi-am: html: html-am info: info-am info-am: install-data-am: install-data-local install-pkgLTLIBRARIES install-exec-am: install-info: install-info-am install-man: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-info-am uninstall-pkgLTLIBRARIES .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-pkgLTLIBRARIES ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am \ install-data-local install-exec install-exec-am install-info \ install-info-am install-man install-pkgLTLIBRARIES \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am tags uninstall uninstall-am \ uninstall-info-am uninstall-pkgLTLIBRARIES install-data-local: mkdir -p $(includedir)/iax install -m 644 md5.h $(includedir)/iax install -m 644 frame.h $(includedir)/iax install -m 644 iax.h $(includedir)/iax install -m 644 iax2.h $(includedir)/iax install -m 644 iax2-parser.h $(includedir)/iax install -m 644 iax-client.h $(includedir)/iax # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: iaxmodem-1.2.0/lib/libiax2/src/miniphone.h0000644000175000017500000000020011150047217017667 0ustar julienjulien#define RBUFSIZE 256 #define MAXARGS 10 #define MAXARG 256 #define MAX_SESSIONS 4 extern void parse_cmd(FILE *, int, char **); iaxmodem-1.2.0/lib/libiax2/src/jitterbuf.h0000644000175000017500000001420511150047217017711 0ustar julienjulien/* * jitterbuf: an application-independent jitterbuffer * * Copyrights: * Copyright (C) 2004-2005, Horizon Wimba, Inc. * * Contributors: * Steve Kann * * This program is free software, distributed under the terms of * the GNU Lesser (Library) General Public License * * Copyright on this file is disclaimed to Digium for inclusion in Asterisk */ #ifndef _JITTERBUF_H_ #define _JITTERBUF_H_ #ifdef __cplusplus extern "C" { #endif /* configuration constants */ /* Number of historical timestamps to use in calculating jitter and drift */ #define JB_HISTORY_SZ 500 /* what percentage of timestamps should we drop from the history when we examine it; * this might eventually be something made configurable */ #define JB_HISTORY_DROPPCT 3 /* the maximum droppct we can handle (say it was configurable). */ #define JB_HISTORY_DROPPCT_MAX 4 /* the size of the buffer we use to keep the top and botton timestamps for dropping */ #define JB_HISTORY_MAXBUF_SZ JB_HISTORY_SZ * JB_HISTORY_DROPPCT_MAX / 100 /* amount of additional jitterbuffer adjustment */ #define JB_TARGET_EXTRA 40 /* ms between growing and shrinking; may not be honored if jitterbuffer runs out of space */ #define JB_ADJUST_DELAY 40 enum jb_return_code { /* return codes */ JB_OK, /* 0 */ JB_EMPTY, /* 1 */ JB_NOFRAME, /* 2 */ JB_INTERP, /* 3 */ JB_DROP, /* 4 */ JB_SCHED /* 5 */ }; enum jb_frame_type { /* frame types */ JB_TYPE_CONTROL, /* 0 */ JB_TYPE_VOICE, /* 1 */ JB_TYPE_VIDEO, /* 2 - reserved */ JB_TYPE_SILENCE /* 3 */ }; typedef struct jb_conf { /* settings */ long max_jitterbuf; /* defines a hard clamp to use in setting the jitter buffer delay */ long resync_threshold; /* the jb will resync when delay increases to (2 * jitter) + this param */ long max_contig_interp; /* the max interp frames to return in a row */ long target_extra; /* amount of additional jitterbuffer adjustment, overrides JB_TARGET_EXTRA */ } jb_conf; typedef struct jb_info { jb_conf conf; /* statistics */ long frames_in; /* number of frames input to the jitterbuffer.*/ long frames_out; /* number of frames output from the jitterbuffer.*/ long frames_late; /* number of frames which were too late, and dropped.*/ long frames_lost; /* number of missing frames.*/ long frames_dropped; /* number of frames dropped (shrinkage) */ long frames_ooo; /* number of frames received out-of-order */ long frames_cur; /* number of frames presently in jb, awaiting delivery.*/ long jitter; /* jitter measured within current history interval*/ long min; /* minimum lateness within current history interval */ long current; /* the present jitterbuffer adjustment */ long target; /* the target jitterbuffer adjustment */ long losspct; /* recent lost frame percentage (* 1000) */ long next_voice_ts; /* the ts of the next frame to be read from the jb - in receiver's time */ long last_voice_ms; /* the duration of the last voice frame */ long silence_begin_ts; /* the time of the last CNG frame, when in silence */ long last_adjustment; /* the time of the last adjustment */ long last_delay; /* the last now added to history */ long cnt_delay_discont; /* the count of discontinuous delays */ long resync_offset; /* the amount to offset ts to support resyncs */ long cnt_contig_interp; /* the number of contiguous interp frames returned */ } jb_info; typedef struct jb_frame { void *data; /* the frame data */ long ts; /* the relative delivery time expected */ long ms; /* the time covered by this frame, in sec/8000 */ enum jb_frame_type type; /* the type of frame */ struct jb_frame *next, *prev; } jb_frame; typedef struct jitterbuf { jb_info info; /* history */ long history[JB_HISTORY_SZ]; /* history */ int hist_ptr; /* points to index in history for next entry */ long hist_maxbuf[JB_HISTORY_MAXBUF_SZ]; /* a sorted buffer of the max delays (highest first) */ long hist_minbuf[JB_HISTORY_MAXBUF_SZ]; /* a sorted buffer of the min delays (lowest first) */ int hist_maxbuf_valid; /* are the "maxbuf"/minbuf valid? */ jb_frame *frames; /* queued frames */ jb_frame *free; /* free frames (avoid malloc?) */ } jitterbuf; /* new jitterbuf */ jitterbuf * jb_new(void); /* destroy jitterbuf */ void jb_destroy(jitterbuf *jb); /* reset jitterbuf */ /* NOTE: The jitterbuffer should be empty before you call this, otherwise * you will leak queued frames, and some internal structures */ void jb_reset(jitterbuf *jb); /* queue a frame data=frame data, timings (in ms): ms=length of frame (for voice), ts=ts (sender's time) * now=now (in receiver's time) return value is one of * JB_OK: Frame added. Last call to jb_next() still valid * JB_DROP: Drop this frame immediately * JB_SCHED: Frame added. Call jb_next() to get a new time for the next frame */ enum jb_return_code jb_put(jitterbuf *jb, void *data, const enum jb_frame_type type, long ms, long ts, long now); /* get a frame for time now (receiver's time) return value is one of * JB_OK: You've got frame! * JB_DROP: Here's an audio frame you should just drop. Ask me again for this time.. * JB_NOFRAME: There's no frame scheduled for this time. * JB_INTERP: Please interpolate an interpl-length frame for this time (either we need to grow, or there was a lost frame) * JB_EMPTY: The jb is empty. */ enum jb_return_code jb_get(jitterbuf *jb, jb_frame *frame, long now, long interpl); /* unconditionally get frames from jitterbuf until empty */ enum jb_return_code jb_getall(jitterbuf *jb, jb_frame *frameout); /* when is the next frame due out, in receiver's time (0=EMPTY) * This value may change as frames are added (esp non-audio frames) */ long jb_next(jitterbuf *jb); /* get jitterbuf info: only "statistics" may be valid */ enum jb_return_code jb_getinfo(jitterbuf *jb, jb_info *stats); /* set jitterbuf conf */ enum jb_return_code jb_setconf(jitterbuf *jb, jb_conf *conf); typedef void (*jb_output_function_t)(const char *fmt, ...); extern void jb_setoutput(jb_output_function_t err, jb_output_function_t warn, jb_output_function_t dbg); #ifdef __cplusplus } #endif #endif iaxmodem-1.2.0/lib/libiax2/src/ringtone.h0000644000175000017500000000313511150047217017540 0ustar julienjulien/* ringtone.h: Generated from frequencies 440 and 480 by gensound. 200 samples */ static short ringtone[200] = { 0, 11581, 21659, 28927, 32445, 31764, 26981, 18727, 8084, -3559, -14693, -23875, -29927, -32083, -30088, -24228, -15290, -4453, 6864, 17195, 25212, 29902, 30693, 27526, 20856, 11585, 944, -9673, -18899, -25560, -28837, -28357, -24244, -17089, -7868, 2192, 11780, 19667, 24872, 26779, 25212, 20450, 13179, 4396, -4731, -13019, -19421, -23164, -23839, -21446, -16384, -9384, -1408, 6484, 13281, 18145, 20517, 20182, 17286, 12301, 5951, -887, -7314, -12519, -15886, -17068, -16017, -12983, -8458, -3109, 2327, 7142, 10750, 12757, 13007, 11585, 8793, 5095, 1044, -2800, -5951, -8053, -8921, -8560, -7141, -4967, -2421, 104, 2260, 3791, 4567, 4589, 3977, 2941, 1733, 600, -257, -722, -772, -481, 0, 481, 772, 722, 257, -600, -1733, -2941, -3977, -4589, -4567, -3791, -2260, -104, 2421, 4967, 7141, 8560, 8921, 8053, 5951, 2800, -1044, -5095, -8793, -11585, -13007, -12757, -10750, -7142, -2327, 3109, 8458, 12983, 16017, 17068, 15886, 12519, 7314, 887, -5951, -12301, -17286, -20182, -20517, -18145, -13281, -6484, 1408, 9384, 16384, 21446, 23839, 23164, 19421, 13019, 4731, -4396, -13179, -20450, -25212, -26779, -24872, -19667, -11780, -2192, 7868, 17089, 24244, 28357, 28837, 25560, 18899, 9673, -944, -11585, -20856, -27526, -30693, -29902, -25212, -17195, -6864, 4453, 15290, 24228, 30088, 32083, 29927, 23875, 14693, 3559, -8084, -18727, -26981, -31764, -32445, -28927, -21659, -11581, }; iaxmodem-1.2.0/lib/libiax2/src/options.h0000644000175000017500000000105311150047220017375 0ustar julienjulien/* * Snomphone: IAX software for SNOM 100 Phone * * IAX Support for talking to Asterisk and other Gnophone clients * * Copyright (C) 1999, Linux Support Services, Inc. * * Mark Spencer * * This program is free software, distributed under the terms of * the GNU General Public License */ extern char regpeer[256]; extern char regsecret[256]; extern char regpeer[256]; extern char server[256]; extern int refresh; extern char context[256]; extern char language[256]; int save_options(void); int load_options(void); iaxmodem-1.2.0/lib/libiax2/src/md5.h0000644000175000017500000000112511150047220016367 0ustar julienjulien#ifndef MD5_H #define MD5_H #ifndef _MSC_VER #include #else typedef unsigned int uint32_t; typedef unsigned char uint8_t; #endif struct MD5Context { uint32_t buf[4]; uint32_t bits[2]; uint8_t in[64]; }; void MD5Init(struct MD5Context *context); void MD5Update(struct MD5Context *context, uint8_t const *buf, unsigned int len); void MD5Final(uint8_t digest[16], struct MD5Context *context); void MD5Transform(uint32_t buf[4], uint32_t const in[16]); /* * This is needed to make RSAREF happy on some MS-DOS compilers. */ typedef struct MD5Context MD5_CTX; #endif /* !MD5_H */ iaxmodem-1.2.0/lib/libiax2/src/iax.c0000644000175000017500000027007311150047220016470 0ustar julienjulien /* * libiax: An implementation of Inter-Asterisk eXchange * * Copyright (C) 2001, Linux Support Services, Inc. * * Mark Spencer * Frik Strecker * * This program is free software, distributed under the terms of * the GNU Lesser (Library) General Public License */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #if defined(WIN32) || defined(_WIN32_WCE) #undef __STRICT_ANSI__ //for strdup with ms #if defined(_WIN32_WCE) #define strdup _strdup #else #include #include #include #include #endif #include #include #include #include #include #include #include #include #define snprintf _snprintf #if defined(_MSC_VER) #define close closesocket #if !defined(_WIN32_WCE) #define inline __inline #endif #endif #ifdef __cplusplus extern "C" { #endif void gettimeofday(struct timeval *tv, void /*struct timezone*/ *tz); #ifdef __cplusplus } #endif #else #include #include #include #include #include #ifdef __GNUC__ #ifndef __USE_SVID #define __USE_SVID #endif #endif #include #include #include #include #include #include #include #include #include #include #if !defined(MACOSX) && !defined(__OpenBSD__) #include #if !defined(SOLARIS) #include #endif #endif #endif #include "jitterbuf.h" #include "iax-client.h" #include "md5.h" /* Define socket options for IAX2 sockets, based on platform * availability of flags */ #if defined(WIN32) || defined(_WIN32_WCE) #define IAX_SOCKOPTS 0 #else #ifdef MACOSX #define IAX_SOCKOPTS MSG_DONTWAIT #else #if defined(SOLARIS) || defined(__OpenBSD__) #define IAX_SOCKOPTS MSG_DONTWAIT #else /* Linux and others */ #define IAX_SOCKOPTS MSG_DONTWAIT | MSG_NOSIGNAL #endif #endif #endif #ifdef SNOM_HACK /* The snom phone seems to improperly execute memset in some cases */ #include "../../snom_phonecore2/include/snom_memset.h" #endif /* Voice TS Prediction causes libiax2 to clean up the timestamps on * outgoing frames. It works best with either continuous voice, or * callers who call iax_send_cng to indicate DTX for silence */ #define USE_VOICE_TS_PREDICTION #define MIN_RETRY_TIME 10 #define MAX_RETRY_TIME 4000 #define MEMORY_SIZE 1000 #define TRANSFER_NONE 0 #define TRANSFER_BEGIN 1 #define TRANSFER_READY 2 #define TRANSFER_REL 3 /* Video frames bypass jitterbuffer */ static int video_bypass_jitterbuffer = 0; /* To use or not to use the jitterbuffer */ static int iax_use_jitterbuffer = 1; /* UDP Socket (file descriptor) */ static int netfd = -1; /* Max timeouts */ static const int maxretries = 10; /* configurable jitterbuffer options */ static long jb_target_extra = -1; /* external global networking replacements */ static iax_sendto_t iax_sendto = (iax_sendto_t) sendto; static iax_recvfrom_t iax_recvfrom = (iax_recvfrom_t) recvfrom; /* ping interval (seconds) */ static int ping_time = 10; static void send_ping(void *session); struct iax_session { /* Private data */ void *pvt; /* session-local Sendto function */ iax_sendto_t sendto; /* Is voice quelched (e.g. hold) */ int quelch; /* Codec Pref Order */ char codec_order[32]; /* Codec Pref Order Index*/ int codec_order_len; /* Last received voice format */ int voiceformat; /* Last transmitted voice format */ int svoiceformat; /* Last received video format */ int videoformat; /* Last transmitted video format */ int svideoformat; /* Per session capability */ int capability; /* Last received timestamp */ unsigned int last_ts; /* Last transmitted timestamp */ unsigned int lastsent; #ifdef USE_VOICE_TS_PREDICTION /* Next predicted voice ts */ unsigned int nextpred; /* True if the last voice we transmitted was not silence/CNG */ int notsilenttx; #endif /* Our last measured ping time */ unsigned int pingtime; /* Address of peer */ struct sockaddr_in peeraddr; /* Our call number */ int callno; /* Peer's call number */ int peercallno; /* Our next outgoing sequence number */ unsigned char oseqno; /* Next sequence number they have not yet acknowledged */ unsigned char rseqno; /* Our last received incoming sequence number */ unsigned char iseqno; /* Last acknowledged sequence number */ unsigned char aseqno; /* Last sequence number we VNAKd */ unsigned char lastvnak; /* Time value that we base our transmission on */ struct timeval offset; /* Time value we base our delivery on */ struct timeval rxcore; /* Current link state */ int state; /* Unregister reason */ char unregreason[MAXSTRLEN]; /* Expected Username */ char username[MAXSTRLEN]; /* Expected Secret */ char secret[MAXSTRLEN]; /* Refresh if applicable */ int refresh; /* ping scheduler id */ int pingid; /* Transfer stuff */ struct sockaddr_in transfer; int transferring; int transfercallno; int transferid; int transferpeer; /* for attended transfer */ int transfer_moh; /* for music on hold while performing attended transfer */ jitterbuf *jb; struct iax_netstat remote_netstats; /* For linking if there are multiple connections */ struct iax_session *next; }; char iax_errstr[256]; #define IAXERROR snprintf(iax_errstr, sizeof(iax_errstr), #ifdef DEBUG_SUPPORT #ifdef DEBUG_DEFAULT static int debug = 1; #else static int debug = 0; #endif void iax_enable_debug(void) { debug = 1; } void iax_disable_debug(void) { debug = 0; } void iax_enable_jitterbuffer(void) { iax_use_jitterbuffer = 1; } void iax_disable_jitterbuffer(void) { iax_use_jitterbuffer = 0; } void iax_set_private(struct iax_session *s, void *ptr) { s->pvt = ptr; } void *iax_get_private(struct iax_session *s) { return s->pvt; } void iax_set_sendto(struct iax_session *s, iax_sendto_t ptr) { s->sendto = ptr; } void iax_seed_random() { #if defined(HAVE_SRANDOMDEV) srandomdev(); #elif defined(HAVE_SRANDOM) srandom((unsigned int)time(0)); #elif defined(HAVE_SRAND48) srand48((long int)time(0)); #else srand((unsigned int)time(0)); #endif } int iax_random() { #if defined(HAVE_RANDOM) return (int)random(); #elif defined(HAVE_LRAND48) return (int)lrand48(); #else return rand(); #endif } /* This is a little strange, but to debug you call DEBU(G "Hello World!\n"); */ #if defined(WIN32) || defined(_WIN32_WCE) #define G __FILE__, __LINE__, #else #define G __FILE__, __LINE__, __PRETTY_FUNCTION__, #endif #define DEBU __debug #if defined(WIN32) || defined(_WIN32_WCE) static int __debug(const char *file, int lineno, const char *fmt, ...) { va_list args; va_start(args, fmt); if (debug) { fprintf(stderr, "%s line %d: ", file, lineno); vfprintf(stderr, fmt, args); } va_end(args); return 0; } #else static int __debug(const char *file, int lineno, const char *func, const char *fmt, ...) { va_list args; va_start(args, fmt); if (debug) { fprintf(stderr, "%s line %d in %s: ", file, lineno, func); vfprintf(stderr, fmt, args); } va_end(args); return 0; } #endif #else /* No debug support */ #if defined(WIN32) || defined(_WIN32_WCE) #define DEBU #else #define DEBU(fmt...) \ do {} while(0) #endif #define G #endif typedef void (*sched_func)(void *); struct iax_sched { /* These are scheduled things to be delivered */ struct timeval when; /* If event is non-NULL then we're delivering an event */ struct iax_event *event; /* If frame is non-NULL then we're transmitting a frame */ struct iax_frame *frame; /* If func is non-NULL then we should call it */ sched_func func; /* and pass it this argument */ void *arg; /* Easy linking */ struct iax_sched *next; }; static struct iax_sched *schedq = NULL; static struct iax_session *sessions = NULL; static int callnums = 1; unsigned int iax_session_get_capability(struct iax_session *s) { return s->capability; } static int inaddrcmp(struct sockaddr_in *sin1, struct sockaddr_in *sin2) { return (sin1->sin_addr.s_addr != sin2->sin_addr.s_addr) || (sin1->sin_port != sin2->sin_port); } static int iax_sched_add(struct iax_event *event, struct iax_frame *frame, sched_func func, void *arg, int ms) { /* Schedule event to be delivered to the client in ms milliseconds from now, or a reliable frame to be retransmitted */ struct iax_sched *sched, *cur, *prev = NULL; if (!event && !frame && !func) { DEBU(G "No event, no frame, no func? what are we scheduling?\n"); return -1; } //fprintf(stderr, "scheduling event %d ms from now\n", ms); sched = (struct iax_sched*)malloc(sizeof(struct iax_sched)); if (sched) { memset(sched, 0, sizeof(struct iax_sched)); gettimeofday(&sched->when, NULL); sched->when.tv_sec += (ms / 1000); ms = ms % 1000; sched->when.tv_usec += (ms * 1000); if (sched->when.tv_usec > 1000000) { sched->when.tv_usec -= 1000000; sched->when.tv_sec++; } sched->event = event; sched->frame = frame; sched->func = func; sched->arg = arg; /* Put it in the list, in order */ cur = schedq; while(cur && ((cur->when.tv_sec < sched->when.tv_sec) || ((cur->when.tv_usec <= sched->when.tv_usec) && (cur->when.tv_sec == sched->when.tv_sec)))) { prev = cur; cur = cur->next; } sched->next = cur; if (prev) { prev->next = sched; } else { schedq = sched; } return 0; } else { DEBU(G "Out of memory!\n"); return -1; } } static int iax_sched_del(struct iax_event *event, struct iax_frame *frame, sched_func func, void *arg, int all) { struct iax_sched *cur, *tmp, *prev = NULL; cur = schedq; while (cur) { if (cur->event == event && cur->frame == frame && cur->func == func && cur->arg == arg) { if (prev) prev->next = cur->next; else schedq = cur->next; tmp = cur; cur = cur->next; free(tmp); if (!all) return -1; } else { prev = cur; cur = cur->next; } } return 0; } int iax_time_to_next_event(void) { struct timeval tv; struct iax_sched *cur = schedq; int ms, min = 999999999; /* If there are no pending events, we don't need to timeout */ if (!cur) return -1; gettimeofday(&tv, NULL); while(cur) { ms = (cur->when.tv_sec - tv.tv_sec) * 1000 + (cur->when.tv_usec - tv.tv_usec) / 1000; if (ms < min) min = ms; cur = cur->next; } if (min < 0) min = 0; return min; } struct iax_session *iax_session_new(void) { struct iax_session *s; s = (struct iax_session *)malloc(sizeof(struct iax_session)); if (s) { jb_conf jbconf; memset(s, 0, sizeof(struct iax_session)); /* Initialize important fields */ s->voiceformat = -1; s->svoiceformat = -1; s->videoformat = -1; /* Default pingtime to 100 ms -- should cover most decent net connections */ s->pingtime = 100; /* XXX Not quite right -- make sure it's not in use, but that won't matter unless you've had at least 65k calls. XXX */ s->callno = callnums++; if (callnums > 32767) callnums = 1; s->peercallno = 0; s->lastvnak = -1; s->transferpeer = 0; /* for attended transfer */ s->next = sessions; s->sendto = iax_sendto; s->pingid = -1; #ifdef USE_VOICE_TS_PREDICTION s->nextpred = 0; #endif s->jb = jb_new(); if ( !s->jb ) { free(s); return 0; } jbconf.max_jitterbuf = 0; jbconf.resync_threshold = 1000; jbconf.max_contig_interp = 0; jbconf.target_extra = jb_target_extra; jb_setconf(s->jb, &jbconf); sessions = s; } return s; } static int iax_session_valid(struct iax_session *session) { /* Return -1 on a valid iax session pointer, 0 on a failure */ struct iax_session *cur = sessions; while(cur) { if (session == cur) return -1; cur = cur->next; } return 0; } int iax_get_netstats(struct iax_session *session, int *rtt, struct iax_netstat *local, struct iax_netstat *remote) { jb_info stats; if(!iax_session_valid(session)) return -1; *rtt = session->pingtime; *remote = session->remote_netstats; jb_getinfo(session->jb, &stats); local->jitter = stats.jitter; /* XXX: should be short-term loss pct.. */ if(stats.frames_in == 0) stats.frames_in = 1; local->losspct = stats.losspct/1000; local->losscnt = stats.frames_lost; local->packets = stats.frames_in; local->delay = stats.current - stats.min; local->dropped = stats.frames_dropped; local->ooo = stats.frames_ooo; return 0; } #ifdef USE_VOICE_TS_PREDICTION static void add_ms(struct timeval *tv, int ms) { tv->tv_usec += ms * 1000; if (tv->tv_usec > 999999) { tv->tv_sec += tv->tv_usec / 1000000; tv->tv_usec %= 1000000; } if (tv->tv_usec < 0) { tv->tv_sec += (tv->tv_usec / 1000000 - 1); tv->tv_usec = (tv->tv_usec % 1000000) + 1000000; } } #endif static int calc_timestamp(struct iax_session *session, unsigned int ts, struct ast_frame *f) { int ms; struct timeval tv; int voice = 0; int video = 0; int genuine = 0; if ( f && f->frametype == AST_FRAME_VOICE ) { voice = 1; } else if ( f && f->frametype == AST_FRAME_VIDEO ) { video = 1; } else if (!f || f->frametype == AST_FRAME_IAX) { genuine = 1; } /* If this is the first packet we're sending, get our offset now. */ if (!session->offset.tv_sec && !session->offset.tv_usec) gettimeofday(&session->offset, NULL); /* If the timestamp is specified, just use their specified timestamp no matter what. Usually this is done for special cases. */ if (ts) { if ( f && session ) session->lastsent = ts; return ts; } /* Otherwise calculate the timestamp from the current time */ gettimeofday(&tv, NULL); /* Calculate the number of milliseconds since we sent the first packet */ ms = (tv.tv_sec - session->offset.tv_sec) * 1000 + (tv.tv_usec - session->offset.tv_usec) / 1000; if (ms < 0) ms = 0; if(voice) { #ifdef USE_VOICE_TS_PREDICTION /* If we haven't most recently sent silence, and we're * close in time, use predicted time */ if(session->notsilenttx && abs(ms - session->nextpred) <= 240) { /* Adjust our txcore, keeping voice and non-voice * synchronized */ add_ms(&session->offset, (int)(ms - session->nextpred)/10); if(!session->nextpred) session->nextpred = ms; ms = session->nextpred; } else { /* in this case, just use the actual time, since * we're either way off (shouldn't happen), or we're * ending a silent period -- and seed the next predicted * time. Also, round ms to the next multiple of * frame size (so our silent periods are multiples * of frame size too) */ int diff = ms % (f->samples / 8); if(diff) ms += f->samples/8 - diff; session->nextpred = ms; } session->notsilenttx = 1; #else if(ms <= session->lastsent) ms = session->lastsent + 3; #endif } else if (video) { if ((unsigned int)ms <= session->lastsent) ms = session->lastsent + 3; } else { /* On a dataframe, use last value + 3 (to accomodate jitter buffer shrinking) if appropriate unless it's a genuine frame */ if (genuine) { if ((unsigned int)ms <= session->lastsent) ms = session->lastsent + 3; } else if (abs(ms - session->lastsent) <= 240) { ms = session->lastsent + 3; } } /* Record the last sent packet for future reference */ /* unless an AST_FRAME_IAX */ if (!genuine) session->lastsent = ms; #ifdef USE_VOICE_TS_PREDICTION /* set next predicted ts based on 8khz samples */ if(voice) session->nextpred += f->samples / 8; #endif return ms; } static unsigned char get_n_bits_at(unsigned char *data, int n, int bit) { int byte = bit / 8; /* byte containing first bit */ int rem = 8 - (bit % 8); /* remaining bits in first byte */ unsigned char ret = 0; if (n <= 0 || n > 8) return 0; if (rem < n) { ret = (data[byte] << (n - rem)); ret |= (data[byte + 1] >> (8 - n + rem)); } else { ret = (data[byte] >> (rem - n)); } return (ret & (0xff >> (8 - n))); } static int speex_get_wb_sz_at(unsigned char *data, int len, int bit) { static int SpeexWBSubModeSz[] = { 0, 36, 112, 192, 352, 0, 0, 0 }; int off = bit; unsigned char c; /* skip up to two wideband frames */ if (((len * 8 - off) >= 5) && get_n_bits_at(data, 1, off)) { c = get_n_bits_at(data, 3, off + 1); off += SpeexWBSubModeSz[c]; if (((len * 8 - off) >= 5) && get_n_bits_at(data, 1, off)) { c = get_n_bits_at(data, 3, off + 1); off += SpeexWBSubModeSz[c]; if (((len * 8 - off) >= 5) && get_n_bits_at(data, 1, off)) { /* too many in a row */ DEBU(G "\tCORRUPT too many wideband streams in a row\n"); return -1; } } } return off - bit; } static int speex_get_samples(unsigned char *data, int len) { static int SpeexSubModeSz[] = { 0, 43, 119, 160, 220, 300, 364, 492, 79, 0, 0, 0, 0, 0, 0, 0 }; static int SpeexInBandSz[] = { 1, 1, 4, 4, 4, 4, 4, 4, 8, 8, 16, 16, 32, 32, 64, 64 }; int bit = 0; int cnt = 0; int off = 0; unsigned char c; DEBU(G "speex_get_samples(%d)\n", len); while ((len * 8 - bit) >= 5) { /* skip wideband frames */ off = speex_get_wb_sz_at(data, len, bit); if (off < 0) { DEBU(G "\tERROR reading wideband frames\n"); break; } bit += off; if ((len * 8 - bit) < 5) { DEBU(G "\tERROR not enough bits left after wb\n"); break; } /* get control bits */ c = get_n_bits_at(data, 5, bit); DEBU(G "\tCONTROL: %d at %d\n", c, bit); bit += 5; if (c == 15) { DEBU(G "\tTERMINATOR\n"); break; } else if (c == 14) { /* in-band signal; next 4 bits contain signal id */ c = get_n_bits_at(data, 4, bit); bit += 4; DEBU(G "\tIN-BAND %d bits\n", SpeexInBandSz[c]); bit += SpeexInBandSz[c]; } else if (c == 13) { /* user in-band; next 5 bits contain msg len */ c = get_n_bits_at(data, 5, bit); bit += 5; DEBU(G "\tUSER-BAND %d bytes\n", c); bit += c * 8; } else if (c > 8) { DEBU(G "\tUNKNOWN sub-mode %d\n", c); break; } else { /* skip number bits for submode (less the 5 control bits) */ DEBU(G "\tSUBMODE %d %d bits\n", c, SpeexSubModeSz[c]); bit += SpeexSubModeSz[c] - 5; cnt += 160; /* new frame */ } } DEBU(G "\tSAMPLES: %d\n", cnt); return cnt; } static inline int get_interp_len(int format) { return (format == AST_FORMAT_ILBC) ? 30 : 20; } static int get_sample_cnt(struct iax_event *e) { int cnt = 0; /* * In the case of zero length frames, do not return a cnt of 0 */ if ( e->datalen == 0 ) { return get_interp_len( e->subclass ) * 8; } switch (e->subclass) { case AST_FORMAT_SPEEX: cnt = speex_get_samples(e->data, e->datalen); break; case AST_FORMAT_G723_1: cnt = 240; /* FIXME Not always the case */ break; case AST_FORMAT_ILBC: cnt = 240 * (e->datalen / 50); break; case AST_FORMAT_GSM: cnt = 160 * (e->datalen / 33); break; case AST_FORMAT_G729A: cnt = 160 * (e->datalen / 20); break; case AST_FORMAT_SLINEAR: cnt = e->datalen / 2; break; case AST_FORMAT_LPC10: cnt = 22 * 8 + (((char *)(e->data))[7] & 0x1) * 8; break; case AST_FORMAT_ULAW: case AST_FORMAT_ALAW: cnt = e->datalen; break; case AST_FORMAT_ADPCM: case AST_FORMAT_G726: cnt = e->datalen * 2; break; default: return 0; } return cnt; } static int iax_xmit_frame(struct iax_frame *f) { int res; #ifdef DEBUG_SUPPORT if (debug) { struct ast_iax2_full_hdr *h = (struct ast_iax2_full_hdr *)f->data; if (ntohs(h->scallno) & IAX_FLAG_FULL) iax_showframe(f, NULL, 0, f->transfer ? &(f->session->transfer) : &(f->session->peeraddr), f->datalen - sizeof(struct ast_iax2_full_hdr)); } #endif /* Send the frame raw */ res = f->session->sendto(netfd, (const char *) f->data, f->datalen, IAX_SOCKOPTS, f->transfer ? (struct sockaddr *)&(f->session->transfer) : (struct sockaddr *)&(f->session->peeraddr), sizeof(f->session->peeraddr)); return res; } static int iax_reliable_xmit(struct iax_frame *f) { struct iax_frame *fc; struct ast_iax2_full_hdr *fh; fh = (struct ast_iax2_full_hdr *) f->data; if (!fh->type) { return -2; } fc = (struct iax_frame *)malloc(sizeof(struct iax_frame)); if (fc) { /* Make a copy of the frame */ memcpy(fc, f, sizeof(struct iax_frame)); /* And a copy of the data if applicable */ if (!fc->data || !fc->datalen) { IAXERROR "No frame data?"); DEBU(G "No frame data?\n"); return -1; } else { fc->data = (char *)malloc(fc->datalen); if (!fc->data) { DEBU(G "Out of memory\n"); IAXERROR "Out of memory\n"); return -1; } memcpy(fc->data, f->data, f->datalen); iax_sched_add(NULL, fc, NULL, NULL, fc->retrytime); return iax_xmit_frame(fc); } } else return -1; } void iax_set_networking(iax_sendto_t st, iax_recvfrom_t rf) { iax_sendto = st; iax_recvfrom = rf; } void iax_set_jb_target_extra( long value ) { /* store in jb_target_extra, a static global */ jb_target_extra = value ; } int iax_init(int preferredportno) { int portno = preferredportno; if (iax_recvfrom == (iax_recvfrom_t)recvfrom) { struct sockaddr_in sin; socklen_t sinlen; int flags; int bufsize = 128 * 1024; if (netfd > -1) { /* Okay, just don't do anything */ DEBU(G "Already initialized."); return 0; } netfd = (int)socket(AF_INET, SOCK_DGRAM, IPPROTO_IP); if (netfd < 0) { DEBU(G "Unable to allocate UDP socket\n"); IAXERROR "Unable to allocate UDP socket\n"); return -1; } if (preferredportno == 0) preferredportno = IAX_DEFAULT_PORTNO; if (preferredportno < 0) preferredportno = 0; sin.sin_family = AF_INET; sin.sin_addr.s_addr = 0; sin.sin_port = htons((short)preferredportno); if (bind(netfd, (struct sockaddr *) &sin, sizeof(sin)) < 0) { #if defined(WIN32) || defined(_WIN32_WCE) if (WSAGetLastError() == WSAEADDRINUSE) #else if (errno == EADDRINUSE) #endif { /*the port is already in use, so bind to a free port chosen by the IP stack*/ DEBU(G "Unable to bind to preferred port - port is in use. Trying to bind to a free one"); sin.sin_port = htons((short)0); if (bind(netfd, (struct sockaddr *) &sin, sizeof(sin)) < 0) { IAXERROR "Unable to bind UDP socket\n"); return -1; } } else { IAXERROR "Unable to bind UDP socket\n"); return -1; } } sinlen = sizeof(sin); if (getsockname(netfd, (struct sockaddr *) &sin, &sinlen) < 0) { close(netfd); netfd = -1; DEBU(G "Unable to figure out what I'm bound to."); IAXERROR "Unable to determine bound port number."); return -1; } #if defined(WIN32) || defined(_WIN32_WCE) flags = 1; if (ioctlsocket(netfd,FIONBIO,(unsigned long *) &flags)) { closesocket(netfd); netfd = -1; DEBU(G "Unable to set non-blocking mode."); IAXERROR "Unable to set non-blocking mode."); return -1; } #else if ((flags = fcntl(netfd, F_GETFL)) < 0) { close(netfd); netfd = -1; DEBU(G "Unable to retrieve socket flags."); IAXERROR "Unable to retrieve socket flags."); return -1; } if (fcntl(netfd, F_SETFL, flags | O_NONBLOCK) < 0) { close(netfd); netfd = -1; DEBU(G "Unable to set non-blocking mode."); IAXERROR "Unable to set non-blocking mode."); return -1; } #endif /* Mihai: increase UDP socket buffers to avoid packet loss. */ if (setsockopt(netfd, SOL_SOCKET, SO_RCVBUF, (char *)&bufsize, sizeof(bufsize)) < 0) { DEBU(G "Unable to set receive buffer size."); IAXERROR "Unable to set receive buffer size."); } /* set send buffer size too */ if (setsockopt(netfd, SOL_SOCKET, SO_SNDBUF, (char *)&bufsize, sizeof(bufsize)) < 0) { DEBU(G "Unable to set send buffer size."); IAXERROR "Unable to set send buffer size."); } portno = ntohs(sin.sin_port); DEBU(G "Started on port %d\n", portno); } iax_seed_random(); callnums = 1 + (int)(32767.0 * (iax_random() / (RAND_MAX + 1.0))); return portno; } static void destroy_session(struct iax_session *session); static void convert_reply(char *out, unsigned char *in) { int x; for (x=0;x<16;x++) sprintf(out + (x << 1), "%2.2x", (int)in[x]); } static unsigned char compress_subclass(int subclass) { int x; int power=-1; /* If it's 128 or smaller, just return it */ if (subclass < IAX_FLAG_SC_LOG) return subclass; /* Otherwise find its power */ for (x = 0; x < IAX_MAX_SHIFT; x++) { if (subclass & (1 << x)) { if (power > -1) { DEBU(G "Can't compress subclass %d\n", subclass); return 0; } else power = x; } } return power | IAX_FLAG_SC_LOG; } static int iax_send(struct iax_session *pvt, struct ast_frame *f, unsigned int ts, int seqno, int now, int transfer, int final, int fullframe) { /* Queue a packet for delivery on a given private structure. Use "ts" for timestamp, or calculate if ts is 0. Send immediately without retransmission or delayed, with retransmission */ struct ast_iax2_full_hdr *fh; struct ast_iax2_mini_hdr *mh; struct ast_iax2_video_hdr *vh; //unsigned char buf[5120]; //fd: changed max packet size[5120]; unsigned char buf[32 * 1024]; //Mihai: let's see if this is where it crashes struct iax_frame *fr; int res; int sendmini=0; unsigned int nextpred; unsigned int fts; if (!pvt) { IAXERROR "No private structure for packet?\n"); return -1; } /* Calculate actual timestamp */ fts = calc_timestamp(pvt, ts, f); /* If the next predicted VOICE timestamp will overflow the 16-bit portion of the timestamp then we send a full VOICE frame to keep the 32-bit portion of the timestamp synchronized. */ nextpred = pvt->nextpred; if (((fts & 0xFFFF0000L) == (nextpred & 0xFFFF0000L)) /* High two bits are the same on timestamp, or sending on a trunk */ && (f->frametype == AST_FRAME_VOICE) /* is a voice frame */ && (f->subclass == pvt->svoiceformat) /* is the same type */ ) { /* Force immediate rather than delayed transmission */ now = 1; /* Mark that mini-style frame is appropriate */ sendmini = 1; } /* Bitmask taken from chan_iax2.c... I must ask Mark Spencer for this? I think not... */ if ( f->frametype == AST_FRAME_VIDEO ) { if (((fts & 0xFFFF8000L) == (nextpred & 0xFFFF8000L)) /* High two bits are the same on timestamp, or sending on a trunk */ && ((f->subclass & ~0x01) == pvt->svideoformat) /* is the same type */ ) { /* Force immediate rather than delayed transmission */ now = 1; /* Mark that mini-style frame is appropriate */ sendmini = 1; } else { /* we want to send a fullframe and be able to retransmit it */ now = 0; sendmini = 0; } } /* if requested, force a full frame */ if ( fullframe ) { now = 0; sendmini = 0; } /* Allocate an iax_frame */ if (now) { fr = (struct iax_frame *) buf; } else { fr = iax_frame_new(DIRECTION_OUTGRESS, f->datalen); if ( fr == NULL ) { IAXERROR "Out of memory\n"); return -1; } } /* Copy our prospective frame into our immediate or retransmitted wrapper */ iax_frame_wrap(fr, f); fr->ts = fts; if (!fr->ts) { IAXERROR "timestamp is 0?\n"); if (!now) iax_frame_free(fr); return -1; } fr->callno = pvt->callno; fr->transfer = transfer; fr->final = final; fr->session = pvt; if (!sendmini) { /* We need a full frame */ if (seqno > -1) fr->oseqno = seqno; else fr->oseqno = pvt->oseqno++; fr->iseqno = pvt->iseqno; fh = (struct ast_iax2_full_hdr *)(((char *)fr->af.data) - sizeof(struct ast_iax2_full_hdr)); fh->scallno = htons(fr->callno | IAX_FLAG_FULL); fh->ts = htonl(fr->ts); fh->oseqno = fr->oseqno; if (transfer) { fh->iseqno = 0; } else fh->iseqno = fr->iseqno; /* Keep track of the last thing we've acknowledged */ pvt->aseqno = fr->iseqno; fh->type = fr->af.frametype & 0xFF; if (f->frametype == AST_FRAME_VIDEO) fh->csub = compress_subclass(fr->af.subclass & ~0x1) | ((fr->af.subclass & 0x1) << 6); else fh->csub = compress_subclass(fr->af.subclass); if (transfer) { fr->dcallno = pvt->transfercallno; } else fr->dcallno = pvt->peercallno; fh->dcallno = htons(fr->dcallno); fr->datalen = fr->af.datalen + sizeof(struct ast_iax2_full_hdr); fr->data = fh; fr->retries = maxretries; /* Retry after 2x the ping time has passed */ fr->retrytime = pvt->pingtime * 2; if (fr->retrytime < MIN_RETRY_TIME) fr->retrytime = MIN_RETRY_TIME; if (fr->retrytime > MAX_RETRY_TIME) fr->retrytime = MAX_RETRY_TIME; /* Acks' don't get retried */ if ((f->frametype == AST_FRAME_IAX) && (f->subclass == IAX_COMMAND_ACK)) fr->retries = -1; if (f->frametype == AST_FRAME_VOICE) { pvt->svoiceformat = f->subclass; } else if (f->frametype == AST_FRAME_VIDEO) { pvt->svideoformat = f->subclass & ~0x1; } if (now) { res = iax_xmit_frame(fr); } else res = iax_reliable_xmit(fr); } else { if (fr->af.frametype == AST_FRAME_VIDEO) { /* Video frame have no sequence number */ fr->oseqno = -1; fr->iseqno = -1; vh = (struct ast_iax2_video_hdr *)(((char* )fr->af.data) - sizeof(struct ast_iax2_video_hdr)); vh->zeros = 0; vh->callno = htons(0x8000 | fr->callno); vh->ts = htons((fr->ts & 0x7FFF) | (fr->af.subclass & 0x1 ? 0x8000 : 0)); fr->datalen = fr->af.datalen + sizeof(struct ast_iax2_video_hdr); fr->data = vh; fr->retries = -1; res = iax_xmit_frame(fr); } else { /* Mini-frames have no sequence number */ fr->oseqno = -1; fr->iseqno = -1; /* Mini frame will do */ mh = (struct ast_iax2_mini_hdr *)(((char *)fr->af.data) - sizeof(struct ast_iax2_mini_hdr)); mh->callno = htons(fr->callno); mh->ts = htons(fr->ts & 0xFFFF); fr->datalen = fr->af.datalen + sizeof(struct ast_iax2_mini_hdr); fr->data = mh; fr->retries = -1; res = iax_xmit_frame(fr); } } if( !now && fr!=NULL ) iax_frame_free( fr ); return res; } #if 0 static int iax_predestroy(struct iax_session *pvt) { if (!pvt) { return -1; } if (!pvt->alreadygone) { /* No more pings or lagrq's */ if (pvt->pingid > -1) ast_sched_del(sched, pvt->pingid); if (pvt->lagid > -1) ast_sched_del(sched, pvt->lagid); if (pvt->autoid > -1) ast_sched_del(sched, pvt->autoid); if (pvt->initid > -1) ast_sched_del(sched, pvt->initid); pvt->pingid = -1; pvt->lagid = -1; pvt->autoid = -1; pvt->initid = -1; pvt->alreadygone = 1; } return 0; } #endif static int __send_command(struct iax_session *i, char type, int command, unsigned int ts, unsigned char *data, int datalen, int seqno, int now, int transfer, int final, int fullframe, int samples) { struct ast_frame f; f.frametype = type; f.subclass = command; f.datalen = datalen; f.samples = samples; f.mallocd = 0; f.offset = 0; #ifdef __GNUC__ f.src = (char *) __FUNCTION__; #else f.src = (char *) __FILE__; #endif f.data = data; return iax_send(i, &f, ts, seqno, now, transfer, final, fullframe); } static int send_command(struct iax_session *i, char type, int command, unsigned int ts, unsigned char *data, int datalen, int seqno) { return __send_command(i, type, command, ts, data, datalen, seqno, 0, 0, 0, 0, 0); } static int send_command_video(struct iax_session *i, char type, int command, unsigned int ts, unsigned char *data, int datalen, int seqno, int fullframe) { return __send_command(i, type, command, ts, data, datalen, seqno, 1, 0, 0, fullframe, 0); } static int send_command_final(struct iax_session *i, char type, int command, unsigned int ts, unsigned char *data, int datalen, int seqno) { #if 0 /* It is assumed that the callno has already been locked */ iax_predestroy(i); #endif int r; r = __send_command(i, type, command, ts, data, datalen, seqno, 0, 0, 1, 0, 0); if (r >= 0) destroy_session(i); return r; } static int send_command_immediate(struct iax_session *i, char type, int command, unsigned int ts, unsigned char *data, int datalen, int seqno) { return __send_command(i, type, command, ts, data, datalen, seqno, 1, 0, 0, 0, 0); } static int send_command_transfer(struct iax_session *i, char type, int command, unsigned int ts, unsigned char *data, int datalen) { return __send_command(i, type, command, ts, data, datalen, 0, 0, 1, 0, 0, 0); } static int send_command_samples(struct iax_session *i, char type, int command, unsigned int ts, unsigned char *data, int datalen, int seqno, int samples) { return __send_command(i, type, command, ts, data, datalen, seqno, 0, 0, 0, 0, samples); } int iax_transfer(struct iax_session *session, const char *number) { static int res; //Return Code struct iax_ie_data ied; //IE Data Structure (Stuff To Send) // Clear The Memory Used For IE Buffer memset(&ied, 0, sizeof(ied)); // Copy The Transfer Destination Into The IE Structure iax_ie_append_str(&ied, IAX_IE_CALLED_NUMBER, number); // Send The Transfer Command - Asterisk Will Handle The Rest! res = send_command(session, AST_FRAME_IAX, IAX_COMMAND_TRANSFER, 0, ied.buf, ied.pos, -1); // Return Success return 0; } static void stop_transfer(struct iax_session *session) { struct iax_sched *sch; sch = schedq; while(sch) { if (sch->frame && (sch->frame->session == session)) sch->frame->retries = -1; sch = sch->next; } } /* stop_transfer */ static void complete_transfer(struct iax_session *session, int peercallno, int xfr2peer, int preserveSeq) { jb_frame frame; session->peercallno = peercallno; /* Change from transfer to session now */ if (xfr2peer) { memcpy(&session->peeraddr, &session->transfer, sizeof(session->peeraddr)); memset(&session->transfer, 0, sizeof(session->transfer)); session->transferring = TRANSFER_NONE; session->transferpeer = 0; session->transfer_moh = 0; /* Force retransmission of a real voice packet, and reset all timing */ session->svoiceformat = -1; session->voiceformat = 0; session->svideoformat = -1; session->videoformat = 0; } memset(&session->rxcore, 0, sizeof(session->rxcore)); memset(&session->offset, 0, sizeof(session->offset)); /* Reset jitterbuffer */ while(jb_getall(session->jb,&frame) == JB_OK) iax_event_free((struct iax_event *)frame.data); jb_reset(session->jb); if (! preserveSeq) { /* Reset sequence numbers */ session->aseqno = 0; session->oseqno = 0; session->iseqno = 0; } session->lastsent = 0; session->last_ts = 0; session->pingtime = 30; /* We have to dump anything we were going to (re)transmit now that we've been transferred since they're all invalid and for the old host. */ stop_transfer(session); } /* complete_transfer */ int iax_setup_transfer(struct iax_session *org_session, struct iax_session *new_session) { int res; struct iax_ie_data ied0; struct iax_ie_data ied1; struct iax_session *s0 = org_session; struct iax_session *s1 = new_session; memset(&ied0, 0, sizeof(ied0)); memset(&ied1, 0, sizeof(ied1)); int transfer_id = 1 + (int)(32767.0 * (iax_random() / (RAND_MAX + 1.0))); /* reversed setup */ iax_ie_append_addr(&ied0, IAX_IE_APPARENT_ADDR, &s1->peeraddr); iax_ie_append_short(&ied0, IAX_IE_CALLNO, s1->peercallno); iax_ie_append_int(&ied0, IAX_IE_TRANSFERID, transfer_id); iax_ie_append_addr(&ied1, IAX_IE_APPARENT_ADDR, &s0->peeraddr); iax_ie_append_short(&ied1, IAX_IE_CALLNO, s0->peercallno); iax_ie_append_int(&ied1, IAX_IE_TRANSFERID, transfer_id); s0->transfer = s1->peeraddr; s1->transfer = s0->peeraddr; s0->transferid = transfer_id; s1->transferid = transfer_id; s0->transfercallno = s0->peercallno; s1->transfercallno = s1->peercallno; s0->transferring = TRANSFER_BEGIN; s1->transferring = TRANSFER_BEGIN; s0->transferpeer = s1->callno; s1->transferpeer = s0->callno; #ifdef DEBUG_SUPPORT if (debug) { DEBU(G "iax_setup_transfer(%d, %d) transfer_id=%d\n", s0->callno, s1->callno, transfer_id); DEBU(G "\torg: callno=%d peercallno=%d peeraddr=%s peerport=%d\n", s0->callno, s0->peercallno, inet_ntoa(s0->peeraddr.sin_addr), ntohs(s0->peeraddr.sin_port)); DEBU(G "\tnew: callno=%d peercallno=%d peeraddr=%s peerport=%d\n", s1->callno, s1->peercallno, inet_ntoa(s1->peeraddr.sin_addr), ntohs(s1->peeraddr.sin_port)); } #endif res = send_command(s0, AST_FRAME_IAX, IAX_COMMAND_TXREQ, 0, ied0.buf, ied0.pos, -1); if (res < 0) { return -1; } res = send_command(s1, AST_FRAME_IAX, IAX_COMMAND_TXREQ, 0, ied1.buf, ied1.pos, -1); if (res < 0) { return -1; } return 0; } static int iax_finish_transfer(struct iax_session *s, short new_peer) { int res; struct iax_ie_data ied; memset(&ied, 0, sizeof(ied)); iax_ie_append_short(&ied, IAX_IE_CALLNO, new_peer); res = send_command(s, AST_FRAME_IAX, IAX_COMMAND_TXREL, 0, ied.buf, ied.pos, -1); complete_transfer(s, new_peer, 0, 1); return res; } static struct iax_session *iax_find_session2(short callno) { struct iax_session *cur = sessions; while(cur) { if (callno == cur->callno && callno != 0) { return cur; } cur = cur->next; } return NULL; } static int iax_handle_txready(struct iax_session *s) { struct iax_session *s0, *s1; short s0_org_peer, s1_org_peer; if (s->transfer_moh) { s->transfer_moh = 0; iax_unquelch(s); } complete_transfer(s, s->peercallno, 0, 1); s->transferring = TRANSFER_REL; s0 = s; s1 = iax_find_session2(s0->transferpeer); if (s1 != NULL && s1->callno == s0->transferpeer && s0->transferring == TRANSFER_REL && s1->transferring == TRANSFER_REL) { s0_org_peer = s0->peercallno; s1_org_peer = s1->peercallno; iax_finish_transfer(s0, s1_org_peer); iax_finish_transfer(s1, s0_org_peer); return 1; } return 0; } static void iax_handle_txreject(struct iax_session *s) { struct iax_session *s0, *s1; s0 = s; s1 = iax_find_session2(s0->transferpeer); if (s1 != NULL && s0->transferpeer == s1->callno && s1->transferring) { if (s1->transfer_moh) { s1->transfer_moh = 0; send_command_immediate(s1, AST_FRAME_IAX, IAX_COMMAND_UNQUELCH, 0, NULL, 0, s1->iseqno); } } if (s0->transfer_moh) { s0->transfer_moh = 0; send_command_immediate(s0, AST_FRAME_IAX, IAX_COMMAND_UNQUELCH, 0, NULL, 0, s0->iseqno); } memset(&s->transfer, 0, sizeof(s->transfer)); s->transferring = TRANSFER_NONE; s->transferpeer = 0; s->transfer_moh = 0; } static void destroy_session(struct iax_session *session) { struct iax_session *cur, *prev=NULL; struct iax_sched *curs, *prevs=NULL, *nexts=NULL; int loop_cnt=0; curs = schedq; while(curs) { nexts = curs->next; if (curs->frame && curs->frame->session == session) { /* Just mark these frames as if they've been sent */ curs->frame->retries = -1; } else if (curs->event && curs->event->session == session) { if (prevs) prevs->next = nexts; else schedq = nexts; if (curs->event) iax_event_free(curs->event); free(curs); } else { prevs = curs; } curs = nexts; loop_cnt++; } cur = sessions; while(cur) { if (cur == session) { jb_frame frame; if (prev) prev->next = session->next; else sessions = session->next; while(jb_getall(session->jb,&frame) == JB_OK) iax_event_free((struct iax_event *)frame.data); jb_destroy(session->jb); free(session); return; } prev = cur; cur = cur->next; } } static int iax_send_lagrp(struct iax_session *session, unsigned int ts); static int iax_send_pong(struct iax_session *session, unsigned int ts); static struct iax_event *handle_event(struct iax_event *event) { /* We have a candidate event to be delievered. Be sure the session still exists. */ if (event) { if ( event->etype == IAX_EVENT_NULL ) return event; if (iax_session_valid(event->session)) { /* Lag requests are never actually sent to the client, but other than that are handled as normal packets */ switch(event->etype) { /* the user on the outside may need to look at the session so we will not free it here anymore we will test for hangup event in iax_event_free and do it there. */ case IAX_EVENT_REJECT: case IAX_EVENT_HANGUP: /* Destroy this session -- it's no longer valid */ destroy_session(event->session); return event; case IAX_EVENT_LAGRQ: event->etype = IAX_EVENT_LAGRP; iax_send_lagrp(event->session, event->ts); iax_event_free(event); break; case IAX_EVENT_PING: event->etype = IAX_EVENT_PONG; iax_send_pong(event->session, event->ts); iax_event_free(event); break; case IAX_EVENT_POKE: event->etype = IAX_EVENT_PONG; iax_send_pong(event->session, event->ts); destroy_session(event->session); iax_event_free(event); break; default: return event; } } else iax_event_free(event); } return NULL; } static int iax2_vnak(struct iax_session *session) { /* send vnak just once for a given sequence number */ if ( (unsigned char)(session->lastvnak - session->iseqno) < 128 ) { return 0; } session->lastvnak = session->iseqno; return send_command_immediate(session, AST_FRAME_IAX, IAX_COMMAND_VNAK, 0, NULL, 0, session->iseqno); } int iax_send_dtmf(struct iax_session *session, char digit) { return send_command(session, AST_FRAME_DTMF, digit, 0, NULL, 0, -1); } int iax_send_voice(struct iax_session *session, int format, unsigned char *data, int datalen, int samples) { /* Send a (possibly compressed) voice frame */ if (!session->quelch) return send_command_samples(session, AST_FRAME_VOICE, format, 0, data, datalen, -1, samples); return 0; } int iax_send_cng(struct iax_session *session, int level, unsigned char *data, int datalen) { #ifdef USE_VOICE_TS_PREDICTION session->notsilenttx = 0; #endif return send_command(session, AST_FRAME_CNG, level, 0, data, datalen, -1); } int iax_send_image(struct iax_session *session, int format, unsigned char *data, int datalen) { /* Send an image frame */ return send_command(session, AST_FRAME_IMAGE, format, 0, data, datalen, -1); } int iax_send_video(struct iax_session *session, int format, unsigned char *data, int datalen, int fullframe) { if (!session->quelch) { int res = send_command_video(session, AST_FRAME_VIDEO, format, 0, data, datalen, -1, fullframe); return res; } return 0; } int iax_send_video_trunk(struct iax_session *session, int format, char *data, int datalen, int fullframe, int ntrunk) { static int my_lastts = 0; if ( ntrunk == 0 ) my_lastts = calc_timestamp(session, 0, NULL); if ( !session->quelch ) { return send_command_video(session, AST_FRAME_VIDEO, format, my_lastts, (unsigned char *)data, datalen, -1, fullframe); } return 0; } int iax_video_bypass_jitter(struct iax_session *s, int mode) { video_bypass_jitterbuffer = mode; return 0; } int iax_register(struct iax_session *session, const char *server, const char *peer, const char *secret, int refresh) { /* Send a registration request */ char tmp[256]; char *p; int res; int portno = IAX_DEFAULT_PORTNO; struct iax_ie_data ied; struct hostent *hp; tmp[255] = '\0'; strncpy(tmp, server, sizeof(tmp) - 1); p = strchr(tmp, ':'); if (p) { *p = '\0'; portno = atoi(p+1); } memset(&ied, 0, sizeof(ied)); if (secret) strncpy(session->secret, secret, sizeof(session->secret) - 1); else strcpy(session->secret, ""); memset(&session->unregreason, 0, sizeof(session->unregreason)); /* Connect first */ hp = gethostbyname(tmp); if (!hp) { snprintf(iax_errstr, sizeof(iax_errstr), "Invalid hostname: %s", tmp); return -1; } memcpy(&session->peeraddr.sin_addr, hp->h_addr, sizeof(session->peeraddr.sin_addr)); session->peeraddr.sin_port = htons(portno); session->peeraddr.sin_family = AF_INET; strncpy(session->username, peer, sizeof(session->username) - 1); session->refresh = refresh; iax_ie_append_str(&ied, IAX_IE_USERNAME, peer); iax_ie_append_short(&ied, IAX_IE_REFRESH, refresh); res = send_command(session, AST_FRAME_IAX, IAX_COMMAND_REGREQ, 0, ied.buf, ied.pos, -1); return res; } int iax_unregister(struct iax_session *session, const char *server, const char *peer, const char *secret, const char *reason) { /* Send an unregistration request */ char tmp[256]; char *p; int portno = IAX_DEFAULT_PORTNO; struct iax_ie_data ied; struct hostent *hp; tmp[255] = '\0'; strncpy(tmp, server, sizeof(tmp) - 1); p = strchr(tmp, ':'); if (p) { *p = '\0'; portno = atoi(p+1); } memset(&ied, 0, sizeof(ied)); if (secret) strncpy(session->secret, secret, sizeof(session->secret) - 1); else strcpy(session->secret, ""); if (reason && strlen(reason)) strncpy(session->unregreason, reason, sizeof(session->unregreason) - 1); else strcpy(session->unregreason, "Unspecified"); /* Connect first */ hp = gethostbyname(tmp); if (!hp) { snprintf(iax_errstr, sizeof(iax_errstr), "Invalid hostname: %s", tmp); return -1; } memcpy(&session->peeraddr.sin_addr, hp->h_addr, sizeof(session->peeraddr.sin_addr)); session->peeraddr.sin_port = htons(portno); session->peeraddr.sin_family = AF_INET; strncpy(session->username, peer, sizeof(session->username) - 1); iax_ie_append_str(&ied, IAX_IE_USERNAME, peer); iax_ie_append_str(&ied, IAX_IE_CAUSE, session->unregreason); return send_command(session, AST_FRAME_IAX, IAX_COMMAND_REGREL, 0, ied.buf, ied.pos, -1); } int iax_reject(struct iax_session *session, char *reason) { struct iax_ie_data ied; memset(&ied, 0, sizeof(ied)); iax_ie_append_str(&ied, IAX_IE_CAUSE, reason ? reason : "Unspecified"); return send_command_final(session, AST_FRAME_IAX, IAX_COMMAND_REJECT, 0, ied.buf, ied.pos, -1); } int iax_hangup(struct iax_session *session, char *byemsg) { struct iax_ie_data ied; iax_sched_del(NULL, NULL, send_ping, (void *) session, 1); memset(&ied, 0, sizeof(ied)); iax_ie_append_str(&ied, IAX_IE_CAUSE, byemsg ? byemsg : "Normal clearing"); return send_command_final(session, AST_FRAME_IAX, IAX_COMMAND_HANGUP, 0, ied.buf, ied.pos, -1); } int iax_sendurl(struct iax_session *session, char *url) { return send_command(session, AST_FRAME_HTML, AST_HTML_URL, 0, (unsigned char *)url, (int)strlen(url), -1); } int iax_ring_announce(struct iax_session *session) { return send_command(session, AST_FRAME_CONTROL, AST_CONTROL_RINGING, 0, NULL, 0, -1); } int iax_lag_request(struct iax_session *session) { return send_command(session, AST_FRAME_IAX, IAX_COMMAND_LAGRQ, 0, NULL, 0, -1); } int iax_busy(struct iax_session *session) { return send_command(session, AST_FRAME_CONTROL, AST_CONTROL_BUSY, 0, NULL, 0, -1); } int iax_congestion(struct iax_session *session) { return send_command(session, AST_FRAME_CONTROL, AST_CONTROL_CONGESTION, 0, NULL, 0, -1); } int iax_accept(struct iax_session *session, int format) { struct iax_ie_data ied; memset(&ied, 0, sizeof(ied)); iax_ie_append_int(&ied, IAX_IE_FORMAT, format); return send_command(session, AST_FRAME_IAX, IAX_COMMAND_ACCEPT, 0, ied.buf, ied.pos, -1); } int iax_answer(struct iax_session *session) { return send_command(session, AST_FRAME_CONTROL, AST_CONTROL_ANSWER, 0, NULL, 0, -1); } int iax_load_complete(struct iax_session *session) { return send_command(session, AST_FRAME_HTML, AST_HTML_LDCOMPLETE, 0, NULL, 0, -1); } int iax_send_url(struct iax_session *session, const char *url, int link) { return send_command(session, AST_FRAME_HTML, link ? AST_HTML_LINKURL : AST_HTML_URL, 0, (unsigned char *)url, (int)strlen(url), -1); } int iax_send_text(struct iax_session *session, const char *text) { return send_command(session, AST_FRAME_TEXT, 0, 0, (unsigned char *)text, (int)strlen(text) + 1, -1); } int iax_send_unlink(struct iax_session *session) { return send_command(session, AST_FRAME_HTML, AST_HTML_UNLINK, 0, NULL, 0, -1); } int iax_send_link_reject(struct iax_session *session) { return send_command(session, AST_FRAME_HTML, AST_HTML_LINKREJECT, 0, NULL, 0, -1); } static int iax_send_pong(struct iax_session *session, unsigned int ts) { struct iax_ie_data ied; jb_info stats; memset(&ied, 0, sizeof(ied)); jb_getinfo(session->jb, &stats); iax_ie_append_int(&ied,IAX_IE_RR_JITTER, stats.jitter); /* XXX: should be short-term loss pct.. */ if(stats.frames_in == 0) stats.frames_in = 1; iax_ie_append_int(&ied,IAX_IE_RR_LOSS, ((0xff & (stats.losspct/1000)) << 24 | (stats.frames_lost & 0x00ffffff))); iax_ie_append_int(&ied,IAX_IE_RR_PKTS, stats.frames_in); iax_ie_append_short(&ied,IAX_IE_RR_DELAY, (unsigned short)(stats.current - stats.min)); iax_ie_append_int(&ied,IAX_IE_RR_DROPPED, stats.frames_dropped); iax_ie_append_int(&ied,IAX_IE_RR_OOO, stats.frames_ooo); return send_command(session, AST_FRAME_IAX, IAX_COMMAND_PONG, ts, ied.buf, ied.pos, -1); } /* external API; deprecated since we send pings ourselves now (finally) */ int iax_send_ping(struct iax_session *session) { return send_command(session, AST_FRAME_IAX, IAX_COMMAND_PING, 0, NULL, 0, -1); } /* scheduled ping sender; sends ping, then reschedules */ static void send_ping(void *s) { struct iax_session *session = (struct iax_session *)s; /* important, eh? */ if(!iax_session_valid(session)) return; send_command(session, AST_FRAME_IAX, IAX_COMMAND_PING, 0, NULL, 0, -1); session->pingid = iax_sched_add(NULL,NULL, send_ping, (void *)session, ping_time * 1000); return; } static int iax_send_lagrp(struct iax_session *session, unsigned int ts) { return send_command(session, AST_FRAME_IAX, IAX_COMMAND_LAGRP, ts, NULL, 0, -1); } static int iax_send_txcnt(struct iax_session *session) { struct iax_ie_data ied; memset(&ied, 0, sizeof(ied)); iax_ie_append_int(&ied, IAX_IE_TRANSFERID, session->transferid); return send_command_transfer(session, AST_FRAME_IAX, IAX_COMMAND_TXCNT, 0, ied.buf, ied.pos); } static int iax_send_txrej(struct iax_session *session) { struct iax_ie_data ied; memset(&ied, 0, sizeof(ied)); iax_ie_append_int(&ied, IAX_IE_TRANSFERID, session->transferid); return send_command_transfer(session, AST_FRAME_IAX, IAX_COMMAND_TXREJ, 0, ied.buf, ied.pos); } static int iax_send_txaccept(struct iax_session *session) { struct iax_ie_data ied; memset(&ied, 0, sizeof(ied)); iax_ie_append_int(&ied, IAX_IE_TRANSFERID, session->transferid); return send_command_transfer(session, AST_FRAME_IAX, IAX_COMMAND_TXACC, 0, ied.buf, ied.pos); } static int iax_send_txready(struct iax_session *session) { struct iax_ie_data ied; memset(&ied, 0, sizeof(ied)); /* see asterisk chan_iax2.c */ iax_ie_append_short(&ied, IAX_IE_CALLNO, session->callno); return send_command(session, AST_FRAME_IAX, IAX_COMMAND_TXREADY, 0, ied.buf, ied.pos, -1); } int iax_auth_reply(struct iax_session *session, char *password, char *challenge, int methods) { char reply[16]; struct MD5Context md5; char realreply[256]; struct iax_ie_data ied; memset(&ied, 0, sizeof(ied)); if ((methods & IAX_AUTH_MD5) && challenge) { MD5Init(&md5); MD5Update(&md5, (const unsigned char *) challenge, (unsigned int)strlen(challenge)); MD5Update(&md5, (const unsigned char *) password, (unsigned int)strlen(password)); MD5Final((unsigned char *) reply, &md5); memset(realreply, 0, sizeof(realreply)); convert_reply(realreply, (unsigned char *) reply); iax_ie_append_str(&ied, IAX_IE_MD5_RESULT, realreply); } else { iax_ie_append_str(&ied, IAX_IE_PASSWORD, password); } return send_command(session, AST_FRAME_IAX, IAX_COMMAND_AUTHREP, 0, ied.buf, ied.pos, -1); } static int iax_regauth_reply(struct iax_session *session, char *password, char *challenge, int methods) { char reply[16]; struct MD5Context md5; char realreply[256]; struct iax_ie_data ied; memset(&ied, 0, sizeof(ied)); iax_ie_append_str(&ied, IAX_IE_USERNAME, session->username); if ((methods & IAX_AUTHMETHOD_MD5) && challenge) { MD5Init(&md5); MD5Update(&md5, (const unsigned char *) challenge, (unsigned int)strlen(challenge)); MD5Update(&md5, (const unsigned char *) password, (unsigned int)strlen(password)); MD5Final((unsigned char *) reply, &md5); memset(realreply, 0, sizeof(realreply)); convert_reply(realreply, (unsigned char *) reply); iax_ie_append_str(&ied, IAX_IE_MD5_RESULT, realreply); } else { iax_ie_append_str(&ied, IAX_IE_PASSWORD, password); } if (strlen(session->unregreason)) { /* Non-zero unregreason length indicates REGREL */ iax_ie_append_str(&ied, IAX_IE_CAUSE, session->unregreason); return send_command(session, AST_FRAME_IAX, IAX_COMMAND_REGREL, 0, ied.buf, ied.pos, -1); } else { iax_ie_append_short(&ied, IAX_IE_REFRESH, session->refresh); return send_command(session, AST_FRAME_IAX, IAX_COMMAND_REGREQ, 0, ied.buf, ied.pos, -1); } } int iax_dial(struct iax_session *session, char *number) { struct iax_ie_data ied; memset(&ied, 0, sizeof(ied)); iax_ie_append_str(&ied, IAX_IE_CALLED_NUMBER, number); return send_command(session, AST_FRAME_IAX, IAX_COMMAND_DIAL, 0, ied.buf, ied.pos, -1); } int iax_quelch(struct iax_session *session) { return send_command(session, AST_FRAME_IAX, IAX_COMMAND_QUELCH, 0, NULL, 0, -1); } int iax_unquelch(struct iax_session *session) { return send_command(session, AST_FRAME_IAX, IAX_COMMAND_UNQUELCH, 0, NULL, 0, -1); } int iax_dialplan_request(struct iax_session *session, char *number) { struct iax_ie_data ied; memset(&ied, 0, sizeof(ied)); iax_ie_append_str(&ied, IAX_IE_CALLED_NUMBER, number); return send_command(session, AST_FRAME_IAX, IAX_COMMAND_DPREQ, 0, ied.buf, ied.pos, -1); } static inline int which_bit(unsigned int i) { char x; for(x = 0; x < 32; x++) { if ((1U << x) == i) { return x + 1; } } return 0; } char iax_pref_codec_add(struct iax_session *session, unsigned int format) { int diff = (int) 'A'; session->codec_order[session->codec_order_len++] = (which_bit(format)) + diff; session->codec_order[session->codec_order_len] = '\0'; return session->codec_order[session->codec_order_len-1]; } void iax_pref_codec_del(struct iax_session *session, unsigned int format) { int diff = (int) 'A'; int x; char old[32]; char remove = which_bit(format) + diff; strncpy(old, session->codec_order, sizeof(old)); session->codec_order_len = 0; for (x = 0; x < (int) strlen(old); x++) { if (old[x] != remove) { session->codec_order[session->codec_order_len++] = old[x]; } } session->codec_order[session->codec_order_len] = '\0'; } int iax_pref_codec_get(struct iax_session *session, unsigned int *array, int len) { int diff = (int) 'A'; int x; for (x = 0; x < session->codec_order_len && x < len; x++) { array[x] = (1 << (session->codec_order[x] - diff - 1)); } return x; } int iax_call(struct iax_session *session, const char *cidnum, const char *cidname, const char *ich, const char *lang, int wait, int formats, int capabilities) { char tmp[256]=""; char *part1, *part2; int res; int portno; char *username, *hostname, *secret, *context, *exten, *dnid; struct iax_ie_data ied; struct hostent *hp; /* We start by parsing up the temporary variable which is of the form of: [user@]peer[:portno][/exten[@context]] */ if (!ich) { IAXERROR "Invalid IAX Call Handle\n"); DEBU(G "Invalid IAX Call Handle\n"); return -1; } memset(&ied, 0, sizeof(ied)); strncpy(tmp, ich, sizeof(tmp) - 1); iax_ie_append_short(&ied, IAX_IE_VERSION, IAX_PROTO_VERSION); if (cidnum) iax_ie_append_str(&ied, IAX_IE_CALLING_NUMBER, cidnum); if (cidname) iax_ie_append_str(&ied, IAX_IE_CALLING_NAME, cidname); if (session->codec_order_len) { iax_ie_append_str(&ied, IAX_IE_CODEC_PREFS, session->codec_order); } session->capability = capabilities; session->pingid = iax_sched_add(NULL,NULL, send_ping, (void *)session, 2 * 1000); /* XXX We should have a preferred format XXX */ iax_ie_append_int(&ied, IAX_IE_FORMAT, formats); iax_ie_append_int(&ied, IAX_IE_CAPABILITY, capabilities); if (lang) iax_ie_append_str(&ied, IAX_IE_LANGUAGE, lang); /* Part 1 is [user[:password]@]peer[:port] */ part1 = strtok(tmp, "/"); /* Part 2 is exten[@context] if it is anything all */ part2 = strtok(NULL, "/"); if (strchr(part1, '@')) { username = strtok(part1, "@"); hostname = strtok(NULL, "@"); } else { username = NULL; hostname = part1; } if (username && strchr(username, ':')) { username = strtok(username, ":"); secret = strtok(NULL, ":"); } else secret = NULL; if(username) strncpy(session->username, username, sizeof(session->username) - 1); if(secret) strncpy(session->secret, secret, sizeof(session->secret) - 1); if (strchr(hostname, ':')) { strtok(hostname, ":"); portno = atoi(strtok(NULL, ":")); } else { portno = IAX_DEFAULT_PORTNO; } if (part2) { exten = strtok(part2, "@"); dnid = exten; context = strtok(NULL, "@"); } else { exten = NULL; dnid = NULL; context = NULL; } if (username) iax_ie_append_str(&ied, IAX_IE_USERNAME, username); if (exten && strlen(exten)) iax_ie_append_str(&ied, IAX_IE_CALLED_NUMBER, exten); if (dnid && strlen(dnid)) iax_ie_append_str(&ied, IAX_IE_DNID, dnid); if (context && strlen(context)) iax_ie_append_str(&ied, IAX_IE_CALLED_CONTEXT, context); /* Setup host connection */ hp = gethostbyname(hostname); if (!hp) { snprintf(iax_errstr, sizeof(iax_errstr), "Invalid hostname: %s", hostname); return -1; } memcpy(&session->peeraddr.sin_addr, hp->h_addr, sizeof(session->peeraddr.sin_addr)); session->peeraddr.sin_port = htons(portno); session->peeraddr.sin_family = AF_INET; res = send_command(session, AST_FRAME_IAX, IAX_COMMAND_NEW, 0, ied.buf, ied.pos, -1); if (res < 0) return res; if (wait) { DEBU(G "Waiting not yet implemented\n"); return -1; } return res; } static int calc_rxstamp(struct iax_session *session) { struct timeval tv; int ms; if (!session->rxcore.tv_sec && !session->rxcore.tv_usec) { gettimeofday(&session->rxcore, NULL); } gettimeofday(&tv, NULL); ms = (tv.tv_sec - session->rxcore.tv_sec) * 1000 + (tv.tv_usec - session->rxcore.tv_usec) / 1000; return ms; } #ifdef notdef_cruft static int match(struct sockaddr_in *sin, short callno, short dcallno, struct iax_session *cur) { if ((cur->peeraddr.sin_addr.s_addr == sin->sin_addr.s_addr) && (cur->peeraddr.sin_port == sin->sin_port)) { /* This is the main host */ if ((cur->peercallno == callno) || ((dcallno == cur->callno) && !cur->peercallno)) { /* That's us. Be sure we keep track of the peer call number */ cur->peercallno = callno; return 1; } } if ((cur->transfer.sin_addr.s_addr == sin->sin_addr.s_addr) && (cur->transfer.sin_port == sin->sin_port) && (cur->transferring)) { /* We're transferring */ if (dcallno == cur->callno) return 1; } return 0; } #endif /* splitted match into 2 passes otherwise causing problem of matching up the wrong session using the dcallno and the peercallno because during a transfer (2 IAX channels on the same client/system) the same peercallno (from two different asterisks) exist in more than one session. */ static int forward_match(struct sockaddr_in *sin, short callno, short dcallno, struct iax_session *cur) { if ((cur->transfer.sin_addr.s_addr == sin->sin_addr.s_addr) && (cur->transfer.sin_port == sin->sin_port) && (cur->transferring)) { /* We're transferring */ if (dcallno == cur->callno) { return 1; } } if ((cur->peeraddr.sin_addr.s_addr == sin->sin_addr.s_addr) && (cur->peeraddr.sin_port == sin->sin_port)) { if (dcallno == cur->callno && dcallno != 0) { /* That's us. Be sure we keep track of the peer call number */ if (cur->peercallno == 0) { cur->peercallno = callno; } else if ( cur->peercallno != callno ) { // print a warning when the callno's don't match fprintf( stderr, "WARNING: peercallno does not match callno" ", peercallno => %d, callno => %d, dcallno => %d", cur->peercallno, callno, dcallno ) ; return 0 ; } return 1; } } return 0; } static int reverse_match(struct sockaddr_in *sin, short callno, struct iax_session *cur) { if ((cur->transfer.sin_addr.s_addr == sin->sin_addr.s_addr) && (cur->transfer.sin_port == sin->sin_port) && (cur->transferring)) { /* We're transferring */ if (callno == cur->peercallno) { return 1; } } if ((cur->peeraddr.sin_addr.s_addr == sin->sin_addr.s_addr) && (cur->peeraddr.sin_port == sin->sin_port)) { if (callno == cur->peercallno) { return 1; } } return 0; } static struct iax_session *iax_find_session(struct sockaddr_in *sin, short callno, short dcallno, int makenew) { struct iax_session *cur = sessions; while(cur) { if (forward_match(sin, callno, dcallno, cur)) { return cur; } cur = cur->next; } cur = sessions; while(cur) { if (reverse_match(sin, callno, cur)) { return cur; } cur = cur->next; } if (makenew && !dcallno) { cur = iax_session_new(); cur->peercallno = callno; cur->peeraddr.sin_addr.s_addr = sin->sin_addr.s_addr; cur->peeraddr.sin_port = sin->sin_port; cur->peeraddr.sin_family = AF_INET; cur->pingid = iax_sched_add(NULL,NULL, send_ping, (void *)cur, 2 * 1000); DEBU(G "Making new session, peer callno %d, our callno %d\n", callno, cur->callno); } else { DEBU(G "No session, peer = %d, us = %d\n", callno, dcallno); } return cur; } #ifdef EXTREME_DEBUG static int display_time(int ms) { static int oldms = -1; if (oldms < 0) { DEBU(G "First measure\n"); oldms = ms; return 0; } DEBU(G "Time from last frame is %d ms\n", ms - oldms); oldms = ms; return 0; } #endif /* From chan_iax2/steve davies: need to get permission from steve or digium, I guess */ static long unwrap_timestamp(long ts, long last) { int x; if ( (ts & 0xFFFF0000) == (last & 0xFFFF0000) ) { x = ts - last; if (x < -50000) { /* Sudden big jump backwards in timestamp: What likely happened here is that miniframe timestamp has circled but we haven't gotten the update from the main packet. We'll just pretend that we did, and update the timestamp appropriately. */ ts = ( (last & 0xFFFF0000) + 0x10000) | (ts & 0xFFFF); DEBU(G "schedule_delivery: pushed forward timestamp\n"); } if (x > 50000) { /* Sudden apparent big jump forwards in timestamp: What's likely happened is this is an old miniframe belonging to the previous top-16-bit timestamp that has turned up out of order. Adjust the timestamp appropriately. */ ts = ( (last & 0xFFFF0000) - 0x10000) | (ts & 0xFFFF); DEBU(G "schedule_delivery: pushed back timestamp\n"); } } else if ( (ts & 0xFFFF8000L) == (last & 0xFFFF8000L) ) { x = ts - last; if (x < -50000) { /* Sudden big jump backwards in timestamp: What likely happened here is that miniframe timestamp has circled but we haven't gotten the update from the main packet. We'll just pretend that we did, and update the timestamp appropriately. */ ts = ( (last & 0xFFFF8000L) + 0x10000) | (ts & 0xFFFF); DEBU(G "schedule_delivery: pushed forward timestamp\n"); } if (x > 50000) { /* Sudden apparent big jump forwards in timestamp: * What's likely happened is this is an old miniframe * belonging to the previous top-16-bit timestamp that * has turned up out of order. Adjust the timestamp * appropriately. */ ts = ( (last & 0xFFFF8000L) - 0x10000) | (ts & 0xFFFF); DEBU(G "schedule_delivery: pushed back timestamp\n"); } } return ts; } static struct iax_event *schedule_delivery(struct iax_event *e, unsigned int ts, int updatehistory) { /* * This is the core of the IAX jitterbuffer delivery mechanism: * Dynamically adjust the jitterbuffer and decide how long to wait * before delivering the packet. */ #ifdef EXTREME_DEBUG DEBU(G "[%p] We are at %d, packet is for %d\n", e->session, calc_rxstamp(e->session), ts); #endif /* insert into jitterbuffer */ /* TODO: Perhaps we could act immediately if it's not droppable and late */ if ( !iax_use_jitterbuffer || (e->etype == IAX_EVENT_VIDEO && video_bypass_jitterbuffer) ) { iax_sched_add(e, NULL, NULL, NULL, 0); return NULL; } else { int type = JB_TYPE_CONTROL; int len = 0; if(e->etype == IAX_EVENT_VOICE) { type = JB_TYPE_VOICE; /* The frame time only has an effect for voice */ len = get_sample_cnt(e) / 8; } else if(e->etype == IAX_EVENT_VIDEO) { type = JB_TYPE_VIDEO; } else if(e->etype == IAX_EVENT_CNG) { type = JB_TYPE_SILENCE; } /* unwrap timestamp */ ts = unwrap_timestamp(ts,e->session->last_ts); /* move forward last_ts if it's greater. We do this _after_ * unwrapping, because asterisk _still_ has cases where it * doesn't send full frames when it ought to */ if(ts > e->session->last_ts) { e->session->last_ts = ts; } if(jb_put(e->session->jb, e, type, len, ts, calc_rxstamp(e->session)) == JB_DROP) { iax_event_free(e); } } return NULL; } static int uncompress_subclass(unsigned char csub) { /* If the SC_LOG flag is set, return 2^csub otherwise csub */ if (csub & IAX_FLAG_SC_LOG) return 1 << (csub & ~IAX_FLAG_SC_LOG & IAX_MAX_SHIFT); else return csub; } static void iax_handle_vnak(struct iax_session *session, struct ast_iax2_full_hdr *fh) { struct iax_sched *sch, *list, *l, *tmp; /* * According to the IAX2 02 draft, we MUST immediately retransmit all frames * with higher sequence number than the VNAK's iseqno * However, it seems that the right thing to do would be to retransmit * frames with sequence numbers higher OR EQUAL to VNAK's iseqno. */ sch = schedq; list = NULL; while ( sch != NULL ) { if ( sch->frame != NULL && sch->frame->session == session ) { /* * We want to check if our frame's oseqno is greater or equal than * the VNAK's iseqno, but we need to take into account sequence * number wrap-arounds * session->rseqno is our last acknowledged sequence number, so * we use that as a base */ if ( (unsigned char)(fh->iseqno - session->rseqno) <= (unsigned char)(sch->frame->oseqno - session->rseqno) ) { /* * We cannot retransmit immediately, since the frames are ordered by retransmit time * We need to collect them and orrange them in ascending order of their oseqno */ tmp = (struct iax_sched *)calloc(1, sizeof(struct iax_sched)); tmp->frame = sch->frame; if ( list == NULL || (list->frame->oseqno - session->rseqno) > (tmp->frame->oseqno - session->rseqno) ) { tmp->next = list; list = tmp; } else { l = list; while ( l != NULL ) { if ( l->next == NULL || (l->next->frame->oseqno - session->rseqno) > (tmp->frame->oseqno - session->rseqno) ) { tmp->next = l->next; l->next = tmp; break; } l = l->next; } } } } sch = sch->next; } /* Transmit collected frames and free the space */ while ( list != NULL ) { tmp = list; iax_xmit_frame(tmp->frame); list = list->next; free(tmp); } } static struct iax_event *iax_header_to_event(struct iax_session *session, struct ast_iax2_full_hdr *fh, int datalen, struct sockaddr_in *sin) { struct iax_event *e; struct iax_sched *sch; unsigned int ts; int subclass; int nowts; int updatehistory = 1; ts = ntohl(fh->ts); if (fh->type==AST_FRAME_VIDEO) subclass = uncompress_subclass(fh->csub & ~0x40) | ((fh->csub >> 6) & 0x1); else subclass = uncompress_subclass(fh->csub); /* don't run last_ts backwards; i.e. for retransmits and the like */ if (ts > session->last_ts && ((fh->type == AST_FRAME_IAX || fh->type == AST_FRAME_VOICE) && subclass != IAX_COMMAND_ACK && subclass != IAX_COMMAND_PONG && subclass != IAX_COMMAND_LAGRP)) { session->last_ts = ts; } #ifdef DEBUG_SUPPORT if (debug) iax_showframe(NULL, fh, 1, sin, datalen); #endif /* Get things going with it, timestamp wise, if we haven't already. */ /* Handle implicit ACKing unless this is an INVAL, and only if this is from the real peer, not the transfer peer */ if ( !inaddrcmp(sin, &session->peeraddr) && ( subclass != IAX_COMMAND_INVAL || fh->type != AST_FRAME_IAX ) ) { unsigned char x; /* XXX This code is not very efficient. Surely there is a better way which still properly handles boundary conditions? XXX */ /* First we have to qualify that the ACKed value is within our window */ for (x=session->rseqno; x != session->oseqno; x++) if (fh->iseqno == x) break; if ((x != session->oseqno) || (session->oseqno == fh->iseqno)) { /* The acknowledgement is within our window. Time to acknowledge everything that it says to */ for (x=session->rseqno; x != fh->iseqno; x++) { /* Ack the packet with the given timestamp */ DEBU(G "Cancelling transmission of packet %d\n", x); sch = schedq; while(sch) { if ( sch->frame && sch->frame->session == session && sch->frame->oseqno == x ) sch->frame->retries = -1; sch = sch->next; } } /* Note how much we've received acknowledgement for */ session->rseqno = fh->iseqno; } else DEBU(G "Received iseqno %d not within window %d->%d\n", fh->iseqno, session->rseqno, session->oseqno); } /* Check where we are */ if ((ntohs(fh->dcallno) & IAX_FLAG_RETRANS) || ((fh->type != AST_FRAME_VOICE) && (fh->type != AST_FRAME_VIDEO))) updatehistory = 0; if ((session->iseqno != fh->oseqno) && (session->iseqno || ((subclass != IAX_COMMAND_TXREADY) && (subclass != IAX_COMMAND_TXREL) && (subclass != IAX_COMMAND_TXCNT) && (subclass != IAX_COMMAND_TXACC)) || (fh->type != AST_FRAME_IAX))) { if ( ((subclass != IAX_COMMAND_ACK) && (subclass != IAX_COMMAND_INVAL) && (subclass != IAX_COMMAND_TXREADY) && (subclass != IAX_COMMAND_TXREL) && (subclass != IAX_COMMAND_TXCNT) && (subclass != IAX_COMMAND_TXACC) && (subclass != IAX_COMMAND_VNAK)) || (fh->type != AST_FRAME_IAX)) { /* If it's not an ACK packet, it's out of order. */ DEBU(G "Packet arrived out of order (expecting %d, got %d) (frametype = %d, subclass = %d)\n", session->iseqno, fh->oseqno, fh->type, subclass); /* * Check if session->iseqno > fh->oseqno, accounting for possible wrap around * This is correct if the two values are not equal (which, in this case, is guaranteed) */ if ( (unsigned char)(session->iseqno - fh->oseqno) < 128 ) { /* If we've already seen it, ack it XXX There's a border condition here XXX */ if ((fh->type != AST_FRAME_IAX) || ((subclass != IAX_COMMAND_ACK) && (subclass != IAX_COMMAND_INVAL))) { DEBU(G "Acking anyway\n"); /* XXX Maybe we should handle its ack to us, but then again, it's probably outdated anyway, and if we have anything to send, we'll retransmit and get an ACK back anyway XXX */ send_command_immediate(session, AST_FRAME_IAX, IAX_COMMAND_ACK, ts, NULL, 0,fh->iseqno); } } else { /* Send a VNAK requesting retransmission */ iax2_vnak(session); } return NULL; } } else { /* Increment unless it's an ACK or VNAK */ if (((subclass != IAX_COMMAND_ACK) && (subclass != IAX_COMMAND_INVAL) && (subclass != IAX_COMMAND_TXCNT) && (subclass != IAX_COMMAND_TXACC) && (subclass != IAX_COMMAND_VNAK)) || (fh->type != AST_FRAME_IAX)) session->iseqno++; } e = (struct iax_event *)malloc(sizeof(struct iax_event) + datalen + 1); if (e) { memset(e, 0, sizeof(struct iax_event) + datalen); /* Set etype to some unknown value so do not inavertently sending IAX_EVENT_CONNECT event, which is 0 to application. */ e->etype = -1; e->session = session; e->ts = ts; switch(fh->type) { case AST_FRAME_DTMF: e->etype = IAX_EVENT_DTMF; e->subclass = subclass; /* We want the DTMF event deliver immediately so all I/O can be terminate quickly in an IVR system. e = schedule_delivery(e, ts, updatehistory); */ break; case AST_FRAME_VOICE: e->etype = IAX_EVENT_VOICE; e->subclass = subclass; session->voiceformat = subclass; if (datalen) { memcpy(e->data, fh->iedata, datalen); e->datalen = datalen; } e = schedule_delivery(e, ts, updatehistory); break; case AST_FRAME_CNG: e->etype = IAX_EVENT_CNG; e->subclass = subclass; if (datalen) { memcpy(e->data, fh->iedata, datalen); e->datalen = datalen; } e = schedule_delivery(e, ts, updatehistory); break; case AST_FRAME_IAX: /* Parse IE's */ if (datalen) { memcpy(e->data, fh->iedata, datalen); e->datalen = datalen; } if (iax_parse_ies(&e->ies, e->data, e->datalen)) { IAXERROR "Unable to parse IE's"); free(e); e = NULL; break; } switch(subclass) { case IAX_COMMAND_NEW: /* This is a new, incoming call */ /* save the capability for validation */ session->capability = e->ies.capability; if (e->ies.codec_prefs) { strncpy(session->codec_order, e->ies.codec_prefs, sizeof(session->codec_order)); session->codec_order_len = (int)strlen(session->codec_order); } e->etype = IAX_EVENT_CONNECT; e = schedule_delivery(e, ts, updatehistory); break; case IAX_COMMAND_AUTHREQ: /* This is a request for a call */ e->etype = IAX_EVENT_AUTHRQ; if (strlen(session->username) && !strcmp(e->ies.username, session->username) && strlen(session->secret)) { /* Hey, we already know this one */ iax_auth_reply(session, session->secret, e->ies.challenge, e->ies.authmethods); free(e); e = NULL; break; } e = schedule_delivery(e, ts, updatehistory); break; case IAX_COMMAND_HANGUP: e->etype = IAX_EVENT_HANGUP; e = schedule_delivery(e, ts, updatehistory); break; case IAX_COMMAND_INVAL: e->etype = IAX_EVENT_HANGUP; e = schedule_delivery(e, ts, updatehistory); break; case IAX_COMMAND_REJECT: e->etype = IAX_EVENT_REJECT; e = schedule_delivery(e, ts, updatehistory); break; case IAX_COMMAND_ACK: free(e); e = NULL; break; case IAX_COMMAND_VNAK: iax_handle_vnak(session, fh); free(e); e = NULL; break; case IAX_COMMAND_LAGRQ: /* Pass this along for later handling */ e->etype = IAX_EVENT_LAGRQ; e = schedule_delivery(e, ts, updatehistory); break; case IAX_COMMAND_POKE: e->etype = IAX_EVENT_POKE; break; case IAX_COMMAND_PING: /* PINGS and PONGS don't get scheduled; */ e->etype = IAX_EVENT_PING; break; case IAX_COMMAND_PONG: e->etype = IAX_EVENT_PONG; /* track weighted average of ping time */ session->pingtime = ((2 * session->pingtime) + (calc_timestamp(session,0,NULL) - ts)) / 3; session->remote_netstats.jitter = e->ies.rr_jitter; session->remote_netstats.losspct = e->ies.rr_loss >> 24;; session->remote_netstats.losscnt = e->ies.rr_loss & 0xffffff; session->remote_netstats.packets = e->ies.rr_pkts; session->remote_netstats.delay = e->ies.rr_delay; session->remote_netstats.dropped = e->ies.rr_dropped; session->remote_netstats.ooo = e->ies.rr_ooo; break; case IAX_COMMAND_ACCEPT: if (e->ies.format & session->capability) { e->etype = IAX_EVENT_ACCEPT; } else { struct iax_ie_data ied; /* Although this should not happen, we * added this to make sure the * negotiation protocol is enforced. * For lack of event to notify the * application we use the defined * REJECT event. */ memset(&ied, 0, sizeof(ied)); iax_ie_append_str(&ied, IAX_IE_CAUSE, "Unable to negotiate codec"); send_command_final(session, AST_FRAME_IAX, IAX_COMMAND_REJECT, 0, ied.buf, ied.pos, -1); e->etype = IAX_EVENT_REJECT; } e = schedule_delivery(e, ts, updatehistory); break; case IAX_COMMAND_REGACK: e->etype = IAX_EVENT_REGACK; e = schedule_delivery(e, ts, updatehistory); break; case IAX_COMMAND_REGAUTH: iax_regauth_reply(session, session->secret, e->ies.challenge, e->ies.authmethods); free(e); e = NULL; break; case IAX_COMMAND_REGREJ: e->etype = IAX_EVENT_REGREJ; e = schedule_delivery(e, ts, updatehistory); break; case IAX_COMMAND_LAGRP: e->etype = IAX_EVENT_LAGRP; nowts = calc_timestamp(session, 0, NULL); e->ts = nowts - ts; /* Can't call schedule_delivery since timestamp is non-normal */ break;; case IAX_COMMAND_TXREQ: /* added check for defensive programming * - in case the asterisk server * or another client does not send the * apparent transfer address */ if (e->ies.apparent_addr != NULL) { /* so a full voice frame is sent on the next voice output */ session->svoiceformat = -1; session->transfer = *e->ies.apparent_addr; session->transfer.sin_family = AF_INET; session->transfercallno = e->ies.callno; session->transferring = TRANSFER_BEGIN; session->transferid = e->ies.transferid; iax_send_txcnt(session); } free(e); e = NULL; break; case IAX_COMMAND_DPREP: /* Received dialplan reply */ e->etype = IAX_EVENT_DPREP; /* Return immediately, makes no sense to schedule */ break; case IAX_COMMAND_TXCNT: if (session->transferring) { session->transfer = *sin; iax_send_txaccept(session); } free(e); e = NULL; break; case IAX_COMMAND_TXACC: if (session->transferring) { stop_transfer(session); session->transferring = TRANSFER_READY; iax_send_txready(session); } free(e); e = NULL; break; case IAX_COMMAND_TXREL: /* Release the transfer */ send_command_immediate(session, AST_FRAME_IAX, IAX_COMMAND_ACK, ts, NULL, 0, fh->iseqno); if (session->transferring) { complete_transfer(session, e->ies.callno, 1, 0); } else { complete_transfer(session, session->peercallno, 0, 1); } e->etype = IAX_EVENT_TRANSFER; /* notify that asterisk no longer sitting between peers */ e = schedule_delivery(e, ts, updatehistory); break; case IAX_COMMAND_QUELCH: e->etype = IAX_EVENT_QUELCH; session->quelch = 1; break; case IAX_COMMAND_UNQUELCH: e->etype = IAX_EVENT_UNQUELCH; session->quelch = 0; break; case IAX_COMMAND_TXREJ: e->etype = IAX_EVENT_TXREJECT; iax_handle_txreject(session); break; case IAX_COMMAND_TXREADY: send_command_immediate(session, AST_FRAME_IAX, IAX_COMMAND_ACK, ts, NULL, 0, fh->iseqno); if (iax_handle_txready(session)) { e->etype = IAX_EVENT_TXREADY; } else { free(e); e = NULL; } break; default: DEBU(G "Don't know what to do with IAX command %d\n", subclass); free(e); e = NULL; } break; case AST_FRAME_CONTROL: switch(subclass) { case AST_CONTROL_ANSWER: e->etype = IAX_EVENT_ANSWER; e = schedule_delivery(e, ts, updatehistory); break; case AST_CONTROL_CONGESTION: case AST_CONTROL_BUSY: e->etype = IAX_EVENT_BUSY; e = schedule_delivery(e, ts, updatehistory); break; case AST_CONTROL_RINGING: e->etype = IAX_EVENT_RINGA; e = schedule_delivery(e, ts, updatehistory); break; default: DEBU(G "Don't know what to do with AST control %d\n", subclass); free(e); return NULL; } break; case AST_FRAME_IMAGE: e->etype = IAX_EVENT_IMAGE; e->subclass = subclass; if (datalen) { memcpy(e->data, fh->iedata, datalen); } e = schedule_delivery(e, ts, updatehistory); break; case AST_FRAME_VIDEO: e->etype = IAX_EVENT_VIDEO; e->subclass = subclass; session->videoformat = e->subclass; memcpy(e->data, fh->iedata, datalen); e->datalen = datalen; e = schedule_delivery(e, ts, updatehistory); break; case AST_FRAME_TEXT: e->etype = IAX_EVENT_TEXT; if (datalen) { memcpy(e->data, fh->iedata, datalen); e->datalen = datalen; } e = schedule_delivery(e, ts, updatehistory); break; case AST_FRAME_HTML: switch(fh->csub) { case AST_HTML_LINKURL: e->etype = IAX_EVENT_LINKURL; /* Fall through */ case AST_HTML_URL: if (e->etype == -1) e->etype = IAX_EVENT_URL; e->subclass = fh->csub; e->datalen = datalen; if (datalen) { memcpy(e->data, fh->iedata, datalen); } e = schedule_delivery(e, ts, updatehistory); break; case AST_HTML_LDCOMPLETE: e->etype = IAX_EVENT_LDCOMPLETE; e = schedule_delivery(e, ts, updatehistory); break; case AST_HTML_UNLINK: e->etype = IAX_EVENT_UNLINK; e = schedule_delivery(e, ts, updatehistory); break; case AST_HTML_LINKREJECT: e->etype = IAX_EVENT_LINKREJECT; e = schedule_delivery(e, ts, updatehistory); break; default: DEBU(G "Don't know how to handle HTML type %d frames\n", fh->csub); free(e); return NULL; } break; default: DEBU(G "Don't know what to do with frame type %d\n", fh->type); free(e); return NULL; } } else DEBU(G "Out of memory\n"); /* Already ack'd iax frames */ if (session->aseqno != session->iseqno) { send_command_immediate(session, AST_FRAME_IAX, IAX_COMMAND_ACK, ts, NULL, 0, fh->iseqno); } return e; } /* Some parts taken from iax_miniheader_to_event and from from chan_iax2.c. We must inform Mark Spencer? */ static struct iax_event *iax_videoheader_to_event(struct iax_session *session, struct ast_iax2_video_hdr *vh, int datalen) { struct iax_event * e; if ( session->videoformat <= 0 ) { DEBU(G "No last video format received on session %d\n", session->callno); return 0; } e = (struct iax_event *)malloc(sizeof(struct iax_event) + datalen); if ( !e ) { DEBU(G "Out of memory\n"); return 0; } e->etype = IAX_EVENT_VIDEO; e->session = session; e->subclass = session->videoformat | (ntohs(vh->ts) & 0x8000 ? 1 : 0); e->datalen = datalen; memcpy(e->data, vh->data, e->datalen); e->ts = (session->last_ts & 0xFFFF8000L) | (ntohs(vh->ts) & 0x7fff); return schedule_delivery(e, e->ts, 1); } static struct iax_event *iax_miniheader_to_event(struct iax_session *session, struct ast_iax2_mini_hdr *mh, int datalen) { struct iax_event * e; if ( session->voiceformat <= 0 ) { DEBU(G "No last format received on session %d\n", session->callno); return 0; } e = (struct iax_event *)malloc(sizeof(struct iax_event) + datalen); if ( !e ) { DEBU(G "Out of memory\n"); return 0; } e->etype = IAX_EVENT_VOICE; e->session = session; e->subclass = session->voiceformat; e->datalen = datalen; memcpy(e->data, mh->data, datalen); e->ts = (session->last_ts & 0xFFFF0000L) | (ntohs(mh->ts) & 0xFFFF); e->ts = unwrap_timestamp(e->ts, session->last_ts); return schedule_delivery(e, e->ts, 1); } void iax_destroy(struct iax_session *session) { destroy_session(session); } static struct iax_event *iax_net_read(void) { unsigned char buf[65536]; int res; struct sockaddr_in sin; socklen_t sinlen; struct iax_event *event; sinlen = sizeof(sin); res = iax_recvfrom(netfd, (char *)buf, sizeof(buf), 0, (struct sockaddr *) &sin, &sinlen); if (res < 0) { #if defined(_WIN32_WCE) if (WSAGetLastError() != WSAEWOULDBLOCK) { DEBU(G "Error on read: %d\n", WSAGetLastError()); IAXERROR "Read error on network socket: ???"); } #elif defined(WIN32) || defined(_WIN32_WCE) if (WSAGetLastError() != WSAEWOULDBLOCK) { DEBU(G "Error on read: %d\n", WSAGetLastError()); IAXERROR "Read error on network socket: %s", strerror(errno)); } #else if (errno != EAGAIN) { DEBU(G "Error on read: %s\n", strerror(errno)); IAXERROR "Read error on network socket: %s", strerror(errno)); } #endif return NULL; } event = iax_net_process(buf, res, &sin); if ( event == NULL ) { // We have received a frame. The corresponding event is queued // We need to motify the entire stack of calling functions so they // don't go to sleep thinking there are no more frames to process // TODO: this is buttugly from a design point of view. Basically we // change libiax2 behavior to accomodate iaxclient. // There must be a way to do it better. event = (struct iax_event *)malloc(sizeof(struct iax_event)); if ( event != NULL ) event->etype = IAX_EVENT_NULL; } return event; } static struct iax_session *iax_txcnt_session(struct ast_iax2_full_hdr *fh, int datalen, struct sockaddr_in *sin, short callno, short dcallno) { int subclass = uncompress_subclass(fh->csub); unsigned char buf[ 65536 ]; /* allocated on stack with same size as iax_net_read() */ struct iax_ies ies; struct iax_session *cur; if ((fh->type != AST_FRAME_IAX) || (subclass != IAX_COMMAND_TXCNT) || (!datalen)) { return NULL; /* special handling for TXCNT only */ } memcpy(buf, fh->iedata, datalen); /* prepare local buf for iax_parse_ies() */ if (iax_parse_ies(&ies, buf, datalen)) { return NULL; /* Unable to parse IE's */ } if (!ies.transferid) { return NULL; /* TXCNT without proper IAX_IE_TRANSFERID */ } for( cur=sessions; cur; cur=cur->next ) { if ((cur->transferring) && (cur->transferid == (int) ies.transferid) && (cur->callno == dcallno) && (cur->transfercallno == callno)) { /* We're transferring --- * skip address/port checking which would fail while * remote peer behind symmetric NAT, verify * transferid instead */ cur->transfer.sin_addr.s_addr = sin->sin_addr.s_addr; /* setup for further handling */ cur->transfer.sin_port = sin->sin_port; break; } } return cur; } struct iax_event *iax_net_process(unsigned char *buf, int len, struct sockaddr_in *sin) { struct ast_iax2_full_hdr *fh = (struct ast_iax2_full_hdr *)buf; struct ast_iax2_mini_hdr *mh = (struct ast_iax2_mini_hdr *)buf; struct ast_iax2_video_hdr *vh = (struct ast_iax2_video_hdr *)buf; struct iax_session *session; if (ntohs(fh->scallno) & IAX_FLAG_FULL) { /* Full size header */ if ((size_t)len < sizeof(struct ast_iax2_full_hdr)) { DEBU(G "Short header received from %s\n", inet_ntoa(sin->sin_addr)); IAXERROR "Short header received from %s\n", inet_ntoa(sin->sin_addr)); return NULL; } /* We have a full header, process appropriately */ session = iax_find_session(sin, ntohs(fh->scallno) & ~IAX_FLAG_FULL, ntohs(fh->dcallno) & ~IAX_FLAG_RETRANS, 1); if (!session) session = iax_txcnt_session(fh, len - sizeof(struct ast_iax2_full_hdr), sin, ntohs(fh->scallno) & ~IAX_FLAG_FULL, ntohs(fh->dcallno) & ~IAX_FLAG_RETRANS); if (session) return iax_header_to_event(session, fh, len - sizeof(struct ast_iax2_full_hdr), sin); DEBU(G "No session?\n"); return NULL; } else { if ((size_t)len < sizeof(struct ast_iax2_mini_hdr)) { DEBU(G "Short header received from %s\n", inet_ntoa(sin->sin_addr)); IAXERROR "Short header received from %s\n", inet_ntoa(sin->sin_addr)); return NULL; } /* Miniature, voice frame */ if ((vh->zeros == 0) && (ntohs(vh->callno) & 0x8000)) { session = iax_find_session(sin, ntohs(vh->callno) & ~0x8000, 0, 0); if (session) return iax_videoheader_to_event(session, vh, len - sizeof(struct ast_iax2_video_hdr)); } else { /* audio frame */ session = iax_find_session(sin, ntohs(fh->scallno), 0, 0); if (session) return iax_miniheader_to_event(session, mh, len - sizeof(struct ast_iax2_mini_hdr)); } DEBU(G "No session?\n"); return NULL; } } static struct iax_sched *iax_get_sched(struct timeval tv) { struct iax_sched *cur, *prev=NULL; cur = schedq; /* Check the event schedule first. */ while(cur) { if ((tv.tv_sec > cur->when.tv_sec) || ((tv.tv_sec == cur->when.tv_sec) && (tv.tv_usec >= cur->when.tv_usec))) { /* Take it out of the event queue */ if (prev) { prev->next = cur->next; } else { schedq = cur->next; } return cur; } cur = cur->next; } return NULL; } struct iax_event *iax_get_event(int blocking) { struct iax_event *event; struct iax_frame *frame; struct timeval tv; struct iax_sched *cur; struct iax_session *session; gettimeofday(&tv, NULL); while((cur = iax_get_sched(tv))) { event = cur->event; frame = cur->frame; if (event) { /* See if this is an event we need to handle */ event = handle_event(event); if (event) { free(cur); return event; } } else if(frame) { /* It's a frame, transmit it and schedule a retry */ if (frame->retries < 0) { /* It's been acked. No need to send it. Destroy the old frame. If final, destroy the session. */ if (frame->final) /* sskacar: Quick deallocation and allocation of sessions may result in the same-address-use ! Therefore we cannot trust remote-sent address only Best bet is checking by somewhat unique properties to decide if we really intend to destroy this session. Example Case: - Have a call - Dump that call and immediately request a new call (or have a incoming call request by a lesser chance) - By considerable probability, you might get the previous address for the session. - When execution hits to this point as a result of previous call ending (as client informs server about dumping and frees the previous session, server proccess call-dumping and eventually this point reached) - frame->session param to the destroy_session() belongs to the new & valid session ! */ if (frame->session && (frame->callno == frame->session->callno)) destroy_session(frame->session); if (frame->data) free(frame->data); free(frame); } else if (frame->retries == 0) { if (frame->transfer) { /* Send a transfer reject since we weren't able to connect */ iax_send_txrej(frame->session); if (frame->data) free(frame->data); free(frame); free(cur); break; } else { /* We haven't been able to get an ACK on this packet. If a final frame, destroy the session, otherwise, pass up timeout */ if (frame->final) { destroy_session(frame->session); if (frame->data) free(frame->data); free(frame); } else { event = (struct iax_event *)malloc(sizeof(struct iax_event)); if (event) { event->etype = IAX_EVENT_TIMEOUT; event->session = frame->session; if (frame->data) free(frame->data); free(frame); free(cur); return handle_event(event); } } } } else { struct ast_iax2_full_hdr *fh; /* Decrement remaining retries */ frame->retries--; /* Multiply next retry time by 4, not above MAX_RETRY_TIME though */ frame->retrytime *= 4; /* Keep under 1000 ms if this is a transfer packet */ if (!frame->transfer) { if (frame->retrytime > MAX_RETRY_TIME) frame->retrytime = MAX_RETRY_TIME; } else if (frame->retrytime > 1000) frame->retrytime = 1000; fh = (struct ast_iax2_full_hdr *)(frame->data); fh->dcallno = htons(IAX_FLAG_RETRANS | frame->dcallno); iax_xmit_frame(frame); /* Schedule another retransmission */ DEBU(G "Scheduling retransmission %d\n", frame->retries); iax_sched_add(NULL, frame, NULL, NULL, frame->retrytime); } } else if (cur->func) { cur->func(cur->arg); } free(cur); } /* get jitterbuffer-scheduled events */ for ( session = sessions; session; session = session->next ) { int ret; long now; long next; jb_frame frame; now = (tv.tv_sec - session->rxcore.tv_sec) * 1000 + (tv.tv_usec - session->rxcore.tv_usec) / 1000; if ( now <= (next = jb_next(session->jb)) ) continue; /* interp len no longer hardcoded, now determined by get_interp_len */ ret = jb_get(session->jb,&frame,now,get_interp_len(session->voiceformat)); switch(ret) { case JB_OK: event = (struct iax_event *)frame.data; event = handle_event(event); if (event) { return event; } break; case JB_INTERP: /* create an interpolation frame */ //fprintf(stderr, "Making Interpolation frame\n"); event = (struct iax_event *)malloc(sizeof(struct iax_event)); if (event) { event->etype = IAX_EVENT_VOICE; event->subclass = session->voiceformat; /* XXX: ??? applications probably ignore this anyway */ event->ts = now; event->session = session; event->datalen = 0; event = handle_event(event); if(event) return event; } break; case JB_DROP: iax_event_free((struct iax_event *)frame.data); break; case JB_NOFRAME: case JB_EMPTY: /* do nothing */ break; default: /* shouldn't happen */ break; } } /* Now look for networking events */ if (blocking) { /* Block until there is data if desired */ fd_set fds; int nextEventTime; FD_ZERO(&fds); FD_SET(netfd, &fds); nextEventTime = iax_time_to_next_event(); if(nextEventTime < 0) select(netfd + 1, &fds, NULL, NULL, NULL); else { struct timeval nextEvent; nextEvent.tv_sec = nextEventTime / 1000; nextEvent.tv_usec = (nextEventTime % 1000) * 1000; select(netfd + 1, &fds, NULL, NULL, &nextEvent); } } event = iax_net_read(); return handle_event(event); } struct sockaddr_in iax_get_peer_addr(struct iax_session *session) { return session->peeraddr; } void iax_session_destroy(struct iax_session **session) { destroy_session(*session); *session = NULL; } void iax_event_free(struct iax_event *event) { /* We gave the user a chance to play with the session now we need to * destroy it if you are not calling this function on every event you * read you are now going to leak sessions as well as events! */ switch(event->etype) { case IAX_EVENT_REJECT: case IAX_EVENT_HANGUP: /* Destroy this session -- it's no longer valid */ if (event->session) { /* maybe the user did it already */ destroy_session(event->session); } break; } free(event); } int iax_get_fd(void) { /* Return our network file descriptor. The client can select on this * (probably with other things, or can add it to a network add sort * of gtk_input_add for example */ return netfd; } int iax_quelch_moh(struct iax_session *session, int MOH) { struct iax_ie_data ied; //IE Data Structure (Stuff To Send) memset(&ied, 0, sizeof(ied)); // You can't quelch the quelched if (session->quelch == 1) return -1; if (MOH) { iax_ie_append(&ied, IAX_IE_MUSICONHOLD); session->transfer_moh = 1; } return send_command(session, AST_FRAME_IAX, IAX_COMMAND_QUELCH, 0, ied.buf, ied.pos, -1); } iaxmodem-1.2.0/lib/libiax2/src/miniphone.c0000644000175000017500000004246611150047220017700 0ustar julienjulien/* * Miniphone: A simple, command line telephone * * IAX Support for talking to Asterisk and other Gnophone clients * * Copyright (C) 1999, Linux Support Services, Inc. * * Mark Spencer * * This program is free software, distributed under the terms of * the GNU General Public License */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "busy.h" #include "dialtone.h" #include "answer.h" #include "ringtone.h" #include "ring10.h" #include "options.h" #define FRAME_SIZE 160 static char callerid[80]; struct peer { int time; gsm gsmin; gsm gsmout; struct iax_session *session; struct peer *next; }; static char *audiodev = "/dev/dsp"; static int audiofd = -1; static struct peer *peers; static int answered_call = 0; static struct peer *find_peer(struct iax_session *); static int audio_setup(char *); static void sighandler(int); static void parse_args(FILE *, unsigned char *); void do_iax_event(FILE *); void call(FILE *, char *); void answer_call(void); void reject_call(void); static void handle_event(FILE *, struct iax_event *e, struct peer *p); void parse_cmd(FILE *, int, char **); void issue_prompt(FILE *); void dump_array(FILE *, char **); struct sound { short *data; int datalen; int samplen; int silencelen; int repeat; }; static int cursound = -1; static int sampsent = 0; static int offset = 0; static int silencelen = 0; static int nosound = 0; static int offhook = 0; static int ringing = 0; static int writeonly = 0; static struct iax_session *registry = NULL; static struct timeval regtime; #define TONE_NONE -1 #define TONE_RINGTONE 0 #define TONE_BUSY 1 #define TONE_CONGEST 2 #define TONE_RINGER 3 #define TONE_ANSWER 4 #define TONE_DIALTONE 5 #define OUTPUT_NONE 0 #define OUTPUT_SPEAKER 1 #define OUTPUT_HANDSET 2 #define OUTPUT_BOTH 3 static struct sound sounds[] = { { ringtone, sizeof(ringtone)/2, 16000, 32000, 1 }, { busy, sizeof(busy)/2, 4000, 4000, 1 }, { busy, sizeof(busy)/2, 2000, 2000, 1 }, { ring10, sizeof(ring10)/2, 16000, 32000, 1 }, { answer, sizeof(answer)/2, 2200, 0, 0 }, { dialtone, sizeof(dialtone)/2, 8000, 0, 1 }, }; static char *help[] = { "Welcome to the miniphone telephony client, the commands are as follows:\n", "Help\t\t-\tDisplays this screen.", "Help \t-\tInqueries specific information on a command.", "Dial \t-\tDials the number supplied in the first arguement", "Status\t\t-\tLists the current sessions and their current status.", "Quit\t\t-\tShuts down the client.", "", 0 }; static short silence[FRAME_SIZE]; static struct peer *most_recent_answer; static struct iax_session *newcall = 0; static struct peer *find_peer(struct iax_session *session) { struct peer *cur = peers; while(cur) { if (cur->session == session) return cur; cur = cur->next; } return NULL; } static int audio_setup(char *dev) { int fd; int fmt = AFMT_S16_LE; int channels = 1; int speed = 8000; int fragsize = (40 << 16) | 6; if ( (fd = open(dev, O_RDWR | O_NONBLOCK)) < 0) { fprintf(stderr, "Unable to open audio device %s: %s\n", dev, strerror(errno)); return -1; } if (ioctl(fd, SNDCTL_DSP_SETFMT, &fmt) || (fmt != AFMT_S16_LE)) { fprintf(stderr, "Unable to set in signed linear format.\n"); return -1; } if (ioctl(fd, SNDCTL_DSP_SETDUPLEX, 0)) { fprintf(stderr, "Unable to set full duplex operation.\n"); writeonly = 1; /* return -1; */ } if (ioctl(fd, SNDCTL_DSP_CHANNELS, &channels) || (channels != 1)) { fprintf(stderr, "Unable to set to mono\n"); return -1; } if (ioctl(fd, SNDCTL_DSP_SPEED, &speed) || (speed != 8000)) { fprintf(stderr, "Unable to set speed to 8000 hz\n"); return -1; } if (ioctl(fd, SNDCTL_DSP_SETFRAGMENT, &fragsize)) { fprintf(stderr, "Unable to set fragment size...\n"); return -1; } return fd; } static int send_sound(int soundfd) { /* Send FRAME_SIZE samples of whatever */ short myframe[FRAME_SIZE]; short *frame = NULL; int total = FRAME_SIZE; int amt=0; int res; int myoff; audio_buf_info abi; if (cursound > -1) { res = ioctl(soundfd, SNDCTL_DSP_GETOSPACE ,&abi); if (res) { fprintf(stderr,"Unable to read output space\n"); return -1; } /* Calculate how many samples we can send, max */ if (total > (abi.fragments * abi.fragsize / 2)) total = abi.fragments * abi.fragsize / 2; res = total; if (sampsent < sounds[cursound].samplen) { myoff=0; while(total) { amt = total; if (amt > (sounds[cursound].datalen - offset)) amt = sounds[cursound].datalen - offset; memcpy(myframe + myoff, sounds[cursound].data + offset, amt * 2); total -= amt; offset += amt; sampsent += amt; myoff += amt; if (offset >= sounds[cursound].datalen) offset = 0; } /* Set it up for silence */ if (sampsent >= sounds[cursound].samplen) silencelen = sounds[cursound].silencelen; frame = myframe; } else { if (silencelen > 0) { frame = silence; silencelen -= res; } else { if (sounds[cursound].repeat) { /* Start over */ sampsent = 0; offset = 0; } else { cursound = -1; nosound = 0; } } } #if 0 if (frame) printf("res is %d, frame[0] is %d\n", res, frame[0]); #endif res = write(soundfd, frame, res * 2); if (res > 0) return 0; return res; } return 0; } static int iax_regtimeout(int timeout) { if (timeout) { gettimeofday(®time, NULL); regtime.tv_sec += timeout; } else { regtime.tv_usec = 0; regtime.tv_sec = 0; } return 0; } static int check_iax_register(void) { int res; if (strlen(regpeer) && strlen(server)) { registry = iax_session_new(); res = iax_register(registry, server,regpeer,regsecret, refresh); if (res) { fprintf(stderr, "Failed registration: %s\n", iax_errstr); return -1; } iax_regtimeout(5 * refresh / 6); } else { iax_regtimeout(0); refresh = 60; } return 0; } static int check_iax_timeout(void) { struct timeval tv; int ms; if (!regtime.tv_usec || !regtime.tv_sec) return -1; gettimeofday(&tv, NULL); if ((tv.tv_usec >= regtime.tv_usec) && (tv.tv_sec >= regtime.tv_sec)) { check_iax_register(); /* Have it check again soon */ return 100; } ms = (regtime.tv_sec - tv.tv_sec) * 1000 + (regtime.tv_usec - tv.tv_usec) / 1000; return ms; } static int gentone(int sound, int uninterruptible) { cursound = sound; sampsent = 0; offset = 0; silencelen = 0; nosound = uninterruptible; printf("Sending tone %d\n", sound); return 0; } void sighandler(int sig) { if(sig == SIGHUP) { puts("rehashing!"); } else if(sig == SIGINT) { static int prev = 0; int cur; if ( (cur = time(0))-prev <= 5) { printf("Terminating!\n"); exit(0); } else { prev = cur; printf("Press interrupt key again in the next %d seconds to really terminate\n", 5-(cur-prev)); } } } void parse_args(FILE *f, unsigned char *cmd) { static char *argv[MAXARGS]; unsigned char *parse = cmd; int argc = 0, t = 0; // Don't mess with anything that doesn't exist... if(!*parse) return; bzero(argv, sizeof(argv)); while(*parse) { if(*parse < 33 || *parse > 128) { *parse = 0, t++; if(t > MAXARG) { fprintf(f, "Warning: Argument exceeds maximum argument size, command ignored!\n"); return; } } else if(t || !argc) { if(argc == MAXARGS) { fprintf(f, "Warning: Command ignored, too many arguments\n"); return; } argv[argc++] = parse; t = 0; } parse++; } if(argc) parse_cmd(f, argc, argv); } int main(int argc, char *argv[]) { int port; int netfd; int c, h=0, m, regm; FILE *f; int fd = STDIN_FILENO; char rcmd[RBUFSIZE]; fd_set readfd; fd_set writefd; struct timeval timer; struct timeval *timerptr = NULL; gsm_frame fo; load_options(); if (!strlen(callerid)) gethostname(callerid, sizeof(callerid)); signal(SIGHUP, sighandler); signal(SIGINT, sighandler); if ( !(f = fdopen(fd, "w+"))) { fprintf(stderr, "Unable to create file on fd %d\n", fd); return -1; } if ( (audiofd = audio_setup(audiodev)) == -1) { fprintf(stderr, "Fatal error: failed to open sound device"); return -1; } if ( (port = iax_init(0) < 0)) { fprintf(stderr, "Fatal error: failed to initialize iax with port %d\n", port); return -1; } iax_set_formats(AST_FORMAT_GSM); netfd = iax_get_fd(); check_iax_register(); fprintf(f, "Text Based Telephony Client.\n\n"); issue_prompt(f); timer.tv_sec = 0; timer.tv_usec = 0; while(1) { FD_ZERO(&readfd); FD_ZERO(&writefd); FD_SET(fd, &readfd); if(fd > h) h = fd; if(answered_call && !writeonly) { FD_SET(audiofd, &readfd); if(audiofd > h) h = audiofd; } if (cursound > -1) { FD_SET(audiofd, &writefd); if (audiofd > h) h = audiofd; } FD_SET(netfd, &readfd); if(netfd > h) h = netfd; if ( (c = select(h+1, &readfd, &writefd, 0, timerptr)) >= 0) { if(FD_ISSET(fd, &readfd)) { if ( ( fgets(&*rcmd, 256, f))) { rcmd[strlen(rcmd)-1] = 0; parse_args(f, &*rcmd); } else fprintf(f, "Fatal error: failed to read data!\n"); issue_prompt(f); } if(answered_call) { if(FD_ISSET(audiofd, &readfd)) { static int ret, rlen = 0; static short rbuf[FRAME_SIZE]; if ( (ret = read(audiofd, rbuf + rlen, 2 * (FRAME_SIZE-rlen))) == -1) { puts("Failed to read audio."); return -1; } rlen += ret/2; if(rlen == FRAME_SIZE) { rlen = 0; if(!most_recent_answer->gsmout) most_recent_answer->gsmout = gsm_create(); gsm_encode(most_recent_answer->gsmout, rbuf, fo); if(iax_send_voice(most_recent_answer->session, AST_FORMAT_GSM, (char *)fo, sizeof(fo)) == -1) puts("Failed to send voice!"); } } } do_iax_event(f); m = iax_time_to_next_event(); if(m > -1) { timerptr = &timer; timer.tv_sec = m /1000; timer.tv_usec = (m % 1000) * 1000; } else timerptr = 0; regm = check_iax_timeout(); if (!timerptr || (m > regm)) { timerptr = &timer; timer.tv_sec = regm /1000; timer.tv_usec = (regm % 1000) * 1000; } if (FD_ISSET(audiofd, &writefd)) { send_sound(audiofd); } } else { if(errno == EINTR) continue; fprintf(stderr, "Fatal error in select(): %s\n", strerror(errno)); return -1; } } return 0; } void do_iax_event(FILE *f) { int sessions = 0; struct iax_event *e = 0; struct peer *peer; while ( (e = iax_get_event(0))) { peer = find_peer(e->session); if(peer) { handle_event(f, e, peer); } else if (e->session == registry) { fprintf(stderr, "Registration complete: %s (%d)\n", (e->event.regreply.status == IAX_REG_SUCCESS) ? "Success" : "Failed", e->event.regreply.status); registry = NULL; } else { if(e->etype != IAX_EVENT_CONNECT) { fprintf(stderr, "Huh? This is an event for a non-existant session?\n"); continue; } sessions++; if(sessions >= MAX_SESSIONS) { fprintf(f, "Missed a call... too many sessions open.\n"); } if(e->event.connect.callerid && e->event.connect.dnid) fprintf(f, "Call from '%s' for '%s'", e->event.connect.callerid, e->event.connect.dnid); else if(e->event.connect.dnid) { fprintf(f, "Call from '%s'", e->event.connect.dnid); } else if(e->event.connect.callerid) { fprintf(f, "Call from '%s'", e->event.connect.callerid); } else printf("Call from"); fprintf(f, " (%s)\n", inet_ntoa(iax_get_peer_addr(e->session).sin_addr)); if(most_recent_answer) { fprintf(f, "Incoming call ignored, there's already a call waiting for answer... \ please accept or reject first\n"); iax_reject(e->session, "Too many calls, we're busy!"); } else { if ( !(peer = malloc(sizeof(struct peer)))) { fprintf(f, "Warning: Unable to allocate memory!\n"); return; } peer->time = time(0); peer->session = e->session; if (peer->gsmin) free(peer->gsmin); peer->gsmin = 0; if (peer->gsmout) free(peer->gsmout); peer->gsmout = 0; peer->next = peers; peers = peer; iax_accept(peer->session); iax_ring_announce(peer->session); most_recent_answer = peer; ringing = 1; gentone(TONE_RINGER, 0); fprintf(f, "Incoming call!\n"); } issue_prompt(f); } iax_event_free(e); } } void call(FILE *f, char *num) { struct peer *peer; if(!newcall) newcall = iax_session_new(); else { fprintf(f, "Already attempting to call somewhere, please cancel first!\n"); return; } if ( !(peer = malloc(sizeof(struct peer)))) { fprintf(f, "Warning: Unable to allocate memory!\n"); return; } peer->time = time(0); peer->session = newcall; peer->gsmin = 0; peer->gsmout = 0; peer->next = peers; peers = peer; most_recent_answer = peer; offhook = 1; iax_call(peer->session, callerid, num, NULL, 10); } void answer_call(void) { if(most_recent_answer) iax_answer(most_recent_answer->session); printf("Answering call!\n"); answered_call = 1; offhook = 1; ringing = 0; gentone(TONE_ANSWER, 1); } void reject_call(void) { iax_reject(most_recent_answer->session, "Call rejected manually."); most_recent_answer = 0; ringing = 0; gentone(TONE_NONE, 1); } void handle_event(FILE *f, struct iax_event *e, struct peer *p) { short fr[FRAME_SIZE]; int len; switch(e->etype) { case IAX_EVENT_HANGUP: iax_hangup(most_recent_answer->session, "Byeee!"); fprintf(f, "Call disconnected by peer\n"); free(most_recent_answer); most_recent_answer = 0; answered_call = 0; peers = 0; newcall = 0; if (offhook) gentone(TONE_CONGEST, 0); break; case IAX_EVENT_REJECT: fprintf(f, "Authentication was rejected\n"); break; case IAX_EVENT_ACCEPT: fprintf(f, "Accepted...\n"); issue_prompt(f); break; case IAX_EVENT_RINGA: fprintf(f, "Ringing...\n"); issue_prompt(f); gentone(TONE_RINGTONE, 0); break; case IAX_EVENT_ANSWER: answer_call(); gentone(TONE_ANSWER, 1); break; case IAX_EVENT_VOICE: switch(e->event.voice.format) { case AST_FORMAT_GSM: if(e->event.voice.datalen % 33) { fprintf(stderr, "Weird gsm frame, not a multiple of 33.\n"); break; } if (!p->gsmin) p->gsmin = gsm_create(); len = 0; while(len < e->event.voice.datalen) { if(gsm_decode(p->gsmin, e->event.voice.data + len, fr)) { fprintf(stderr, "Bad GSM data\n"); break; } else { int res; res = write(audiofd, fr, sizeof(fr)); if (res < 0) fprintf(f, "Write failed: %s\n", strerror(errno)); } len += 33; } break; default : fprintf(f, "Don't know how to handle that format %d\n", e->event.voice.format); } break; default: fprintf(f, "Unknown event: %d\n", e->etype); } } void dump_call(void) { if(most_recent_answer) { printf("Dumping call!\n"); iax_hangup(most_recent_answer->session,""); free(most_recent_answer); } answered_call = 0; most_recent_answer = 0; answered_call = 0; peers = 0; newcall = 0; offhook = 0; ringing = 0; gentone(TONE_NONE, 0); } void parse_cmd(FILE *f, int argc, char **argv) { if(!strcasecmp(argv[0], "HELP")) { if(argc == 1) dump_array(f, help); else if(argc == 2) { if(!strcasecmp(argv[1], "HELP")) fprintf(f, "Help \t-\tDisplays general help or specific help on command if supplied an arguement\n"); else if(!strcasecmp(argv[1], "QUIT")) fprintf(f, "Quit\t\t-\tShuts down the miniphone\n"); else fprintf(f, "No help available on %s\n", argv[1]); } else { fprintf(f, "Too many arguements for command help.\n"); } } else if(!strcasecmp(argv[0], "STATUS")) { if(argc == 1) { int c = 0; struct peer *peerptr = peers; if(!peerptr) fprintf(f, "No session matches found.\n"); else while(peerptr) { fprintf(f, "Listing sessions:\n\n"); fprintf(f, "Session %d\n", ++c); fprintf(f, "Session existed for %d seconds\n", (int)time(0)-peerptr->time); if(answered_call) fprintf(f, "Call answered.\n"); else fprintf(f, "Call ringing.\n"); peerptr = peerptr->next; } } else fprintf(f, "Too many arguments for command status.\n"); } else if(!strcasecmp(argv[0], "ANSWER")) { if(argc > 1) fprintf(f, "Too many arguements for command answer\n"); else answer_call(); } else if(!strcasecmp(argv[0], "REJECT")) { if(argc > 1) fprintf(f, "Too many arguements for command reject\n"); else { fprintf(f, "Rejecting current phone call.\n"); reject_call(); } } else if (!strcasecmp(argv[0], "DUMP")) { dump_call(); } else if (!strcasecmp(argv[0], "HANGUP")) { dump_call(); } else if(!strcasecmp(argv[0], "CALL")) { if(argc > 2) fprintf(f, "Too many arguements for command call\n"); else { call(f, argv[1]); } } else if(!strcasecmp(argv[0], "QUIT")) { if(argc > 1) fprintf(f, "Too many arguements for command quit\n"); else { fprintf(f, "Good bye!\n"); exit(1); } } else fprintf(f, "Unknown command of %s\n", argv[0]); } void issue_prompt(FILE *f) { fprintf(f, "TeleClient> "); fflush(f); } void dump_array(FILE *f, char **array) { while(*array) fprintf(f, "%s\n", *array++); } iaxmodem-1.2.0/lib/libiax2/src/options.c0000644000175000017500000000565211150047220017401 0ustar julienjulien/* * Snomphone: IAX software for SNOM 100 Phone * * IAX Support for talking to Asterisk and other Gnophone clients * * Copyright (C) 1999, Linux Support Services, Inc. * * Mark Spencer * * This program is free software, distributed under the terms of * the GNU General Public License */ #define CONFIG_FILE "/etc/miniphone.conf" #define USER_FILE "%s/.miniphone-conf" #include #include #include #include char regpeer[256]; char regsecret[256]; char server[256]; int refresh = 60; char context[256]; char language[256]; #define TYPE_STRING 0 #define TYPE_INT 1 struct opt { char *name; void *where; int len; int type; }; static struct opt opts[] = { { "regpeer", regpeer, sizeof(regpeer), TYPE_STRING }, { "regsecret", regsecret, sizeof(regsecret), TYPE_STRING }, { "server", server, sizeof(server), TYPE_STRING }, { "context", context, sizeof(context), TYPE_STRING }, { "language", language, sizeof(language), TYPE_STRING }, { "refresh", &refresh, sizeof(refresh), TYPE_INT }, }; static int __load_options(char *filename) { FILE *f; int lineno = 0; char buf[256]; char *var, *value; int x; char *c; f = fopen(filename, "r"); if (!f) { fprintf(stderr, "Failed to open '%s': %s\n", filename, strerror(errno)); return -1; } while(!feof(f)) { fgets(buf, sizeof(buf), f); if (!feof(f)) { /* Ditch comments */ if ((c = strchr(buf, '#'))) *c = 0; lineno++; /* Strip CR */ buf[strlen(buf)-1] = '\0'; if (strlen(buf)) { var = strtok(buf, "="); value = strtok(NULL, "="); if (!var || !value) { fprintf(stderr, "Syntax error line %d\n", lineno); continue; } for (x=0;x * * This program is free software, distributed under the terms of * the GNU Lesser (Library) General Public License */ #ifndef _IAX_H #define _IAX_H /* Max version of IAX protocol we support */ #define IAX_PROTO_VERSION 1 #define IAX_MAX_CALLS 32768 #define IAX_FLAG_FULL 0x8000 #define IAX_FLAG_SC_LOG 0x80 #define IAX_MAX_SHIFT 0x1F /* Maximum size of an IAX frame (max size of UDP frame) */ #define IAX_MAX_BUF_SIZE 65536 /* Subclass for IAX_FRAME_IAX */ #define IAX_COMMAND_NEW 1 #define IAX_COMMAND_PING 2 #define IAX_COMMAND_PONG 3 #define IAX_COMMAND_ACK 4 #define IAX_COMMAND_HANGUP 5 #define IAX_COMMAND_REJECT 6 #define IAX_COMMAND_ACCEPT 7 #define IAX_COMMAND_AUTHREQ 8 #define IAX_COMMAND_AUTHREP 9 #define IAX_COMMAND_INVAL 10 #define IAX_COMMAND_LAGRQ 11 #define IAX_COMMAND_LAGRP 12 #define IAX_COMMAND_REGREQ 13 /* Registration request */ #define IAX_COMMAND_REGAUTH 14 /* Registration authentication required */ #define IAX_COMMAND_REGACK 15 /* Registration accepted */ #define IAX_COMMAND_REGREJ 16 /* Registration rejected */ #define IAX_COMMAND_REGREL 17 /* Force release of registration */ #define IAX_COMMAND_VNAK 18 /* If we receive voice before valid first voice frame, send this */ #define IAX_COMMAND_DPREQ 19 /* Request status of a dialplan entry */ #define IAX_COMMAND_DPREP 20 /* Request status of a dialplan entry */ #define IAX_COMMAND_DIAL 21 /* Request a dial on channel brought up TBD */ #define IAX_COMMAND_TXREQ 22 /* Transfer Request */ #define IAX_COMMAND_TXCNT 23 /* Transfer Connect */ #define IAX_COMMAND_TXACC 24 /* Transfer Accepted */ #define IAX_COMMAND_TXREADY 25 /* Transfer ready */ #define IAX_COMMAND_TXREL 26 /* Transfer release */ #define IAX_COMMAND_TXREJ 27 /* Transfer reject */ #define IAX_COMMAND_QUELCH 28 /* Stop audio/video transmission */ #define IAX_COMMAND_UNQUELCH 29 /* Resume audio/video transmission */ #define IAX_DEFAULT_REG_EXPIRE 60 #define IAX_DEFAULT_PORTNO 5036 /* Full frames are always delivered reliably */ struct iax_full_hdr { short callno; /* Source call number -- high bit must be 1 */ short dcallno; /* Destination call number */ unsigned int ts; /* 32-bit timestamp in milliseconds */ unsigned short seqno; /* Packet number */ char type; /* Frame type */ unsigned char csub; /* Compressed subclass */ char data[0]; }; /* Mini header is used only for voice frames -- delivered unreliably */ struct iax_mini_hdr { short callno; /* Source call number -- high bit must be 0 */ unsigned short ts; /* 16-bit Timestamp (high 16 bits from last IAX_full_hdr) */ /* Frametype implicitly VOICE_FRAME */ /* subclass implicit from last IAX_full_hdr */ char data[0]; }; #endif iaxmodem-1.2.0/lib/libiax2/src/answer.h0000644000175000017500000004373211150047220017213 0ustar julienjulien/* * Signed 16-bit audio data * * Source: answer.raw * * Copyright (C) 1999, Mark Spencer and Linux Support Services * * Distributed under the terms of the GNU General Public License * */ static signed short answer[] = { 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 0x19b7, 0x0245, 0xeee5, 0xb875, 0xd9a4, 0x6018, 0x660a, 0xc3c6, 0x8741, 0xff55, 0x4c2e, 0x2146, 0xfed2, 0xf079, 0xcbd4, 0xe561, 0x3c41, 0x3166, 0xd425, 0xdc59, 0x2748, 0x087d, 0xc72b, 0xfe3a, 0x4681, 0x14c6, 0xcf45, 0xdd38, 0xf8dd, 0x0a39, 0x3a5a, 0x32b9, 0xbfec, 0x957f, 0x15a3, 0x70f4, 0x1d95, 0xbfc4, 0xd367, 0xfda0, 0x0dc0, 0x29eb, 0x1fc2, 0xd684, 0xcab1, 0x19c7, 0x29ef, 0xe679, 0xe9d0, 0x2b82, 0x151a, 0xca9f, 0xdb68, 0x1f4a, 0x271c, 0x0e2a, 0xfb32, 0xd1b2, 0xc8ff, 0x2382, 0x6380, 0x0a52, 0xa118, 0xccbf, 0x2ddc, 0x33fd, 0x0964, 0xf2a4, 0xdd81, 0xe092, 0x1a00, 0x325c, 0xf5e3, 0xd6a1, 0x0b6c, 0x1c75, 0xe4f8, 0xe07c, 0x2082, 0x2b3e, 0xf445, 0xdaa9, 0xea13, 0xff3c, 0x245c, 0x35c1, 0xf308, 0xab53, 0xdf59, 0x4698, 0x3f3b, 0xe7f7, 0xca84, 0xed4d, 0x0c3f, 0x1e94, 0x1c2d, 0xf06f, 0xd4df, 0xff34, 0x23d8, 0x001e, 0xe3f1, 0x0b15, 0x2113, 0xf3fd, 0xd768, 0xf9a0, 0x1d31, 0x1c6e, 0x0797, 0xe3a0, 0xce6c, 0xfd7b, 0x422a, 0x2c4c, 0xd364, 0xbf42, 0x0278, 0x303e, 0x1c51, 0xf737, 0xe25a, 0xe75f, 0x0a8f, 0x22ab, 0x05f4, 0xe3f9, 0xf8c4, 0x1705, 0x0162, 0xe49f, 0xfb8b, 0x1e2b, 0x13ac, 0xf044, 0xe07b, 0xf01a, 0x1567, 0x2cbf, 0x0b75, 0xd01b, 0xd206, 0x1563, 0x38d7, 0x0f2e, 0xdb32, 0xdc30, 0x023b, 0x1e44, 0x16eb, 0xf5f7, 0xe425, 0xfa33, 0x14d5, 0x0968, 0xeff2, 0xf762, 0x1137, 0x0e59, 0xf13a, 0xe651, 0xff41, 0x1d60, 0x18fd, 0xf1e6, 0xd75f, 0xf097, 0x20ec, 0x27fa, 0xfba4, 0xd5b8, 0xe68e, 0x1657, 0x2518, 0x04f6, 0xe5a3, 0xe976, 0x0578, 0x18fa, 0x0a92, 0xec0a, 0xef2a, 0x111f, 0x12f4, 0xeec3, 0xe95e, 0x0d3a, 0x18fd, 0xff72, 0xeefc, 0xf114, 0xfaaa, 0x14ee, 0x21db, 0xf56e, 0xcb49, 0xf621, 0x3323, 0x1947, 0xe017, 0xe7e9, 0x0819, 0x0707, 0x084c, 0x0f57, 0xf152, 0xdf92, 0x104a, 0x28eb, 0xedcc, 0xd4ad, 0x1415, 0x296d, 0xed9a, 0xdf57, 0x0cc2, 0x0d95, 0xf7b5, 0x0deb, 0x0b34, 0xd713, 0xea08, 0x38d6, 0x216d, 0xc727, 0xdc32, 0x2cd2, 0x1822, 0xe2d5, 0xfeb3, 0x106c, 0xe6e5, 0xf81e, 0x2fe8, 0x01af, 0xc180, 0x037a, 0x42d8, 0xf88d, 0xc344, 0x0a4f, 0x2c4e, 0xf19d, 0xebeb, 0x162c, 0xf9e9, 0xde93, 0x1b56, 0x2c60, 0xd8aa, 0xce3e, 0x2a41, 0x2eeb, 0xdab1, 0xde32, 0x1c32, 0x0aba, 0xeabe, 0x1008, 0x136d, 0xda2f, 0xec3b, 0x31dd, 0x1130, 0xca79, 0xf5b8, 0x3423, 0x0274, 0xd27d, 0x035e, 0x1e68, 0xf641, 0xf904, 0x1691, 0xef7d, 0xd57a, 0x1c3b, 0x3c23, 0xe881, 0xc274, 0x0af5, 0x2962, 0xfa34, 0xf676, 0x0f71, 0xefcc, 0xe01f, 0x19e7, 0x276f, 0xe694, 0xe134, 0x1c3a, 0x0e8b, 0xd8e7, 0xfa81, 0x2f8b, 0x07c5, 0xd904, 0xf6fa, 0x0ca5, 0xf9a2, 0x0dc7, 0x2623, 0xec54, 0xbe23, 0x02b6, 0x4296, 0x10cd, 0xda61, 0xf11c, 0x0103, 0xf41c, 0x10b4, 0x2a03, 0xf63c, 0xce1a, 0xfdbd, 0x1fb4, 0xfc51, 0xf727, 0x1c8a, 0x04ff, 0xcf41, 0xec05, 0x2913, 0x1ce8, 0xf70c, 0xf744, 0xede8, 0xdd77, 0x0d99, 0x43f1, 0x119c, 0xc14f, 0xd60e, 0x17cb, 0x1e19, 0x0d4e, 0x0c95, 0xeed1, 0xcdf4, 0xf7a5, 0x331f, 0x1cd0, 0xeb17, 0xf082, 0xfb19, 0xe899, 0xfdeb, 0x323c, 0x2036, 0xdad3, 0xd134, 0xfd03, 0x1345, 0x1c10, 0x2239, 0xf656, 0xbc22, 0xdc3f, 0x3392, 0x3d59, 0xfd77, 0xdb4d, 0xe23f, 0xedbe, 0x0f7e, 0x35cc, 0x1947, 0xd5dc, 0xd1bf, 0x035d, 0x16fc, 0x1174, 0x1675, 0x0249, 0xd2d4, 0xd851, 0x184d, 0x32fe, 0x0f91, 0xee14, 0xe1e6, 0xdf9b, 0x016b, 0x3668, 0x2b2b, 0xe20c, 0xc554, 0xf257, 0x1c05, 0x1fc5, 0x14f0, 0xf891, 0xd41c, 0xdf83, 0x1865, 0x2de1, 0x0b16, 0xed58, 0xea0c, 0xea79, 0xfbd9, 0x22af, 0x2732, 0xf62f, 0xd389, 0xe7d9, 0x0b39, 0x1cdc, 0x1de3, 0x038a, 0xd809, 0xd5f7, 0x0b55, 0x305e, 0x1910, 0xf02e, 0xe089, 0xe7c7, 0x0195, 0x2265, 0x21da, 0xf743, 0xd8f2, 0xe978, 0x09a1, 0x190a, 0x17c5, 0x045a, 0xe46d, 0xdd06, 0xffb2, 0x2293, 0x1cfe, 0xfd4d, 0xe4f9, 0xe310, 0xfaf1, 0x1d22, 0x2376, 0x0113, 0xde3a, 0xe21b, 0x0204, 0x1ba1, 0x1bd6, 0x0333, 0xe563, 0xe104, 0xfd51, 0x1bc1, 0x1ccf, 0x0285, 0xe757, 0xe35e, 0xfaf2, 0x185d, 0x1d46, 0x06b7, 0xec13, 0xe108, 0xef6e, 0x121d, 0x2a17, 0x16a6, 0xe32c, 0xc9a9, 0xf070, 0x2f48, 0x3788, 0xfa4e, 0xc32a, 0xd9c2, 0x1fa1, 0x36fe, 0x07fa, 0xd9e4, 0xe577, 0x0e5e, 0x1755, 0xfb53, 0xed71, 0x0540, 0x19e0, 0x0301, 0xdc97, 0xe391, 0x1937, 0x367c, 0x0bc9, 0xca4c, 0xc96b, 0x105d, 0x461f, 0x2416, 0xd481, 0xbc97, 0xf8b7, 0x39af, 0x2ec9, 0xecc6, 0xcb50, 0xeee3, 0x1ffe, 0x1e8e, 0xf700, 0xe66a, 0xff58, 0x149f, 0x02e5, 0xe792, 0xf2d8, 0x1a4d, 0x225a, 0xf642, 0xce7f, 0xe6a6, 0x25e2, 0x38f5, 0x01d0, 0xc50f, 0xd243, 0x19bd, 0x3fc6, 0x14f0, 0xd2d7, 0xcdb6, 0x069a, 0x2ffe, 0x1847, 0xe6f8, 0xdf0a, 0x0337, 0x1a90, 0x067a, 0xeb5b, 0xf541, 0x143b, 0x14f2, 0xf092, 0xdc02, 0xfb91, 0x28a3, 0x2274, 0xeaa8, 0xc9e7, 0xef48, 0x2d01, 0x322e, 0xf6d2, 0xc7cb, 0xe13b, 0x1fda, 0x3217, 0x0458, 0xd690, 0xe2bf, 0x11c4, 0x21d5, 0x0291, 0xe5c8, 0xf3a9, 0x12ba, 0x11aa, 0xf22b, 0xe627, 0x03ec, 0x219a, 0x1036, 0xe2f2, 0xd93f, 0x059c, 0x2ed6, 0x1b75, 0xe227, 0xce55, 0xfb19, 0x2de0, 0x2477, 0xed08, 0xd148, 0xf307, 0x21d4, 0x2002, 0xf543, 0xdeac, 0xf7f9, 0x18a9, 0x11d6, 0xf0ef, 0xe8e4, 0x05ea, 0x1ba5, 0x0727, 0xe448, 0xe748, 0x100e, 0x265e, 0x07fc, 0xdbae, 0xde78, 0x0efa, 0x2ce0, 0x0f94, 0xddf1, 0xd9ea, 0x0797, 0x28f6, 0x12eb, 0xe60c, 0xdf46, 0x0469, 0x1fbb, 0x0ced, 0xe9f6, 0xe95f, 0x09fe, 0x1ab9, 0x02cb, 0xe5a4, 0xef2a, 0x1327, 0x1d7b, 0xfd07, 0xde3d, 0xed9c, 0x17e5, 0x22e7, 0xfe3a, 0xdb38, 0xe9b9, 0x161a, 0x2416, 0x0175, 0xde3d, 0xe9de, 0x1294, 0x1fc9, 0x00ea, 0xe2a7, 0xeee2, 0x1298, 0x1a7d, 0xfc1d, 0xe3bb, 0xf47a, 0x1642, 0x185e, 0xf727, 0xe1af, 0xf709, 0x19c3, 0x18e7, 0xf50d, 0xe010, 0xf75b, 0x1a9c, 0x18d8, 0xf4c5, 0xe0c9, 0xf865, 0x1a1c, 0x16d5, 0xf3a6, 0xe257, 0xfaf2, 0x1a44, 0x14d5, 0xf34f, 0xe4b6, 0xfc77, 0x17d5, 0x0ff8, 0xf133, 0xe8b7, 0x0344, 0x1a37, 0x0ad5, 0xe95e, 0xe61a, 0x08a5, 0x227e, 0x0e33, 0xe4a7, 0xdd70, 0x03b0, 0x25f4, 0x17b2, 0xec0a, 0xdb4e, 0xf898, 0x1ba3, 0x18f6, 0xf973, 0xe87f, 0xf77a, 0x0b93, 0x096c, 0xfb0e, 0xfb03, 0x0896, 0x0940, 0xf51d, 0xe904, 0xfdc7, 0x1dda, 0x1bf9, 0xf29b, 0xd37f, 0xea1b, 0x1f37, 0x3175, 0x07eb, 0xd3f7, 0xd46b, 0x077d, 0x2eeb, 0x1e67, 0xeeae, 0xd8c7, 0xef85, 0x1119, 0x18d3, 0x088e, 0xf953, 0xf5ad, 0xf556, 0xf63d, 0x0234, 0x167a, 0x19a1, 0xfbf9, 0xd873, 0xdd4b, 0x0f06, 0x3748, 0x21e6, 0xe181, 0xc032, 0xe79a, 0x2bec, 0x3e76, 0x0b1b, 0xce41, 0xcb23, 0xff96, 0x2d79, 0x26d1, 0xfcc7, 0xdf8a, 0xe525, 0xfd83, 0x10f1, 0x16d7, 0x0f50, 0xfaea, 0xe3f1, 0xe20f, 0x0158, 0x27d9, 0x2866, 0xf96f, 0xcb34, 0xd563, 0x11d6, 0x3d25, 0x2424, 0xe254, 0xc2c9, 0xe7cd, 0x248d, 0x34f5, 0x0c42, 0xdcd0, 0xd827, 0xfa65, 0x19eb, 0x1b50, 0x0721, 0xf396, 0xeb9c, 0xefde, 0x0016, 0x1594, 0x1cc1, 0x0658, 0xe22b, 0xd852, 0xfb3e, 0x2923, 0x2c78, 0xfc87, 0xcdb5, 0xd69c, 0x0e3c, 0x3527, 0x201f, 0xe993, 0xcf9e, 0xeb21, 0x183f, 0x25ea, 0x0c93, 0xed4d, 0xe5f9, 0xf548, 0x07fb, 0x117c, 0x0ff2, 0x0398, 0xf08c, 0xe628, 0xf489, 0x143b, 0x2419, 0x0ccf, 0xe2cc, 0xd5a6, 0xf861, 0x2615, 0x2a1b, 0xfeb4, 0xd543, 0xdc53, 0x09b4, 0x2901, 0x19ff, 0xf24a, 0xde86, 0xeec4, 0x0b7b, 0x1733, 0x0d0a, 0xfc24, 0xf1bb, 0xf110, 0xfa03, 0x0a0f, 0x15d4, 0x0e21, 0xf435, 0xe17e, 0xee90, 0x1225, 0x2527, 0x0efa, 0xe61f, 0xd916, 0xf7b8, 0x1f50, 0x2326, 0x0099, 0xe01e, 0xe473, 0x0491, 0x1b37, 0x1360, 0xfb17, 0xecd9, 0xf20d, 0x0051, 0x0aec, 0x0d4a, 0x073d, 0xfa5a, 0xeeb8, 0xf165, 0x0516, 0x17dc, 0x12da, 0xf71b, 0xe213, 0xed85, 0x0eef, 0x20c8, 0x0e09, 0xebcc, 0xe0d4, 0xf848, 0x1637, 0x19d6, 0x026b, 0xec09, 0xed00, 0xff9b, 0x0e5a, 0x0d6b, 0x026c, 0xf865, 0xf4da, 0xf888, 0x025a, 0x0cbb, 0x0d53, 0xff96, 0xeefa, 0xee80, 0x021c, 0x15d6, 0x126a, 0xf9c1, 0xe724, 0xf017, 0x0aa1, 0x18b6, 0x0b4e, 0xf2d7, 0xea91, 0xf957, 0x0cac, 0x1061, 0x03f4, 0xf6ad, 0xf476, 0xfbdf, 0x0489, 0x08b1, 0x06df, 0xffcf, 0xf766, 0xf537, 0xfddf, 0x0ad4, 0x0e15, 0x01da, 0xf205, 0xf0a0, 0x0082, 0x1066, 0x0e41, 0xfc71, 0xef1b, 0xf4ad, 0x05cd, 0x0f32, 0x07ed, 0xf9c8, 0xf401, 0xfa93, 0x04af, 0x088c, 0x04a7, 0xfe15, 0xf9f1, 0xfa64, 0xff1e, 0x0539, 0x078c, 0x02af, 0xfa1a, 0xf69d, 0xfd09, 0x075b, 0x0a3d, 0x01f2, 0xf761, 0xf642, 0xffa7, 0x08f3, 0x0830, 0xff05, 0xf7db, 0xf9bc, 0x0174, 0x068b, 0x04b2, 0xfeff, 0xfb39, 0xfc1a, 000000, 0x0371, 0x03d7, 0x00fe, 0xfd37, 0xfbe0, 0xfe78, 0x02af, 0x044a, 0x0180, 0xfd43, 0xfc00, 0xfed1, 0x02aa, 0x0346, 0x00dd, 0xfde0, 0xfbfe, 0x0114, 0x0987, 0x04bc, 0xf49d, 0xf23a, 0x06ab, 0x162e, 0x0544, 0xe76b, 0xea25, 0x1015, 0x2474, 0x0431, 0xd7d3, 0xe1ec, 0x1923, 0x2df5, 0x01cd, 0xd386, 0xe3d9, 0x1b9d, 0x2c62, 0xfeb8, 0xd31a, 0xe6ba, 0x1dbd, 0x2abb, 0xfbab, 0xd2ed, 0xe9ab, 0x1fa7, 0x28ef, 0xf8b3, 0xd2f5, 0xeca5, 0x2160, 0x26fd, 0xf5d7, 0xd334, 0xefa1, 0x22e5, 0x24ea, 0xf31b, 0xd3a9, 0xf29f, 0x2435, 0x22b6, 0xf07e, 0xd44e, 0xf59b, 0x2551, 0x2067, 0xee08, 0xd527, 0xf88e, 0x2639, 0x1e00, 0xebb6, 0xd62d, 0xfb77, 0x26eb, 0x1b85, 0xe98b, 0xd75f, 0xfe51, 0x276b, 0x18f9, 0xe78e, 0xd8b9, 0x011a, 0x27b6, 0x1660, 0xe5bb, 0xda3a, 0x03cc, 0x27cf, 0x13bd, 0xe415, 0xdbdf, 0x066a, 0x27b7, 0x1117, 0xe29e, 0xdda5, 0x08ec, 0x276e, 0x0e6d, 0xe154, 0xdf89, 0x0b52, 0x26f6, 0x0bc7, 0xe039, 0xe185, 0x0d96, 0x2653, 0x0924, 0xdf4e, 0xe399, 0x0fb9, 0x2584, 0x068b, 0xde93, 0xe5c0, 0x11b8, 0x248e, 0x03fd, 0xde08, 0xe7f8, 0x1390, 0x2372, 0x0180, 0xddaa, 0xea3c, 0x1544, 0x2231, 0xff12, 0xdd7a, 0xec89, 0x16cf, 0x20d0, 0xfcb9, 0xdd77, 0xeedb, 0x1831, 0x1f52, 0xfa77, 0xdd9f, 0xf132, 0x1969, 0x1db7, 0xf850, 0xddf1, 0xf385, 0x1a75, 0x1c06, 0xf645, 0xde6b, 0xf5d7, 0x1b5b, 0x1a3f, 0xf457, 0xdf0d, 0xf820, 0x1c13, 0x1867, 0xf288, 0xdfd2, 0xfa5f, 0x1ca1, 0x167f, 0xf0db, 0xe0ba, 0xfc92, 0x1d06, 0x148b, 0xef50, 0xe1c1, 0xfeb5, 0x1d43, 0x1290, 0xede9, 0xe2e6, 0x00c6, 0x1d58, 0x108e, 0xeca7, 0xe426, 0x02c4, 0x1d45, 0x0e8a, 0xeb8a, 0xe57f, 0x04a9, 0x1d0e, 0x0c87, 0xea92, 0xe6ec, 0x0677, 0x1cb2, 0x0a87, 0xe9be, 0xe86e, 0x082a, 0x1c34, 0x088b, 0xe912, 0xe9fe, 0x09c1, 0x1b95, 0x069c, 0xe88c, 0xeb9c, 0x0b3a, 0x1ad9, 0x04b6, 0xe82a, 0xed43, 0x0c96, 0x1a00, 0x02df, 0xe7eb, 0xeef3, 0x0dd0, 0x190d, 0x0116, 0xe7d0, 0xf0a8, 0x0eec, 0x1804, 0xff61, 0xe7d8, 0xf25d, 0x0fe6, 0x16e3, 0xfdc0, 0xe800, 0xf412, 0x10bf, 0x15b1, 0xfc36, 0xe848, 0xf5c5, 0x1176, 0x146e, 0xfac2, 0xe8ad, 0xf771, 0x120d, 0x1320, 0xf969, 0xe92e, 0xf913, 0x1282, 0x11c4, 0xf828, 0xe9cb, 0xfaac, 0x12d8, 0x1062, 0xf703, 0xea7e, 0xfc38, 0x130e, 0x0efa, 0xf5fb, 0xeb49, 0xfdb5, 0x1325, 0x0d8e, 0xf50e, 0xec26, 0xff20, 0x131e, 0x0c21, 0xf43f, 0xed15, 0x007a, 0x12fa, 0x0ab6, 0xf38d, 0xee15, 0x01be, 0x12bd, 0x094f, 0xf2f9, 0xef22, 0x02ef, 0x1265, 0x07f0, 0xf283, 0xf037, 0x0408, 0x11f6, 0x0699, 0xf226, 0xf156, 0x050a, 0x1170, 0x054b, 0xf1e8, 0xf27a, 0x05f4, 0x10d8, 0x040c, 0xf1c5, 0xf3a3, 0x06c2, 0x102c, 0x02da, 0xf1bc, 0xf4cc, 0x0779, 0x0f71, 0x01b7, 0xf1cc, 0xf5f5, 0x0815, 0x0ea7, 0x00a8, 0xf1f4, 0xf719, 0x0899, 0x0dd2, 0xffab, 0xf233, 0xf839, 0x0902, 0x0cf4, 0xfec0, 0xf288, 0xf950, 0x0952, 0x0c0e, 0xfdec, 0xf2ee, 0xfa5d, 0x0989, 0x0b23, 0xfd2d, 0xf368, 0xfb62, 0x09a7, 0x0a35, 0xfc85, 0xf3f1, 0xfc58, 0x09af, 0x0946, 0xfbf2, 0xf488, 0xfd3f, 0x09a1, 0x0859, 0xfb77, 0xf52c, 0xfe17, 0x097d, 0x076f, 0xfb14, 0xf5d8, 0xfede, 0x0945, 0x068a, 0xfac6, 0xf68d, 0xff93, 0x08fb, 0x05ad, 0xfa8e, 0xf747, 0x0034, 0x08a1, 0x04da, 0xfa6f, 0xf805, 0x00c2, 0x0836, 0x0410, 0xfa63, 0xf8c6, 0x013c, 0x07bf, 0x0354, 0xfa6c, 0xf985, 0x01a1, 0x073b, 0x02a4, 0xfa8a, 0xfa43, 0x01f1, 0x06af, 0x0204, 0xfab9, 0xfafc, 0x022c, 0x0619, 0x0175, 0xfafa, 0xfbae, 0x0252, 0x057f, 0x00f6, 0xfb4b, 0xfc5a, 0x0263, 0x04e0, 0x008b, 0xfbaa, 0xfcfa, 0x0262, 0x0440, 0x0032, 0xfc16, 0xfd90, 0x024b, 0x03a0, 0xffec, 0xfc8c, 0xfe19, 0x0225, 0x0301, 0xffb9, 0xfd0c, 0xfe93, 0x01ea, 0x0267, 0xff9c, 0xfd95, 0xfefe, 0x01a0, 0x01d3, 0xff90, 0xfe22, 0xff5a, 0x0147, 0x0145, 0xff99, 0xfeb3, 0xffa1, 0x00e0, 0x00c3, 0xffb6, 0xff46, 0xffd9, 0x006d, 0x004b, 0xffe5, 0xffda, 0xfffc, 000000, 0xfffe, 000000, 0xffff, 000000, 0xffff, 0xffff, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000 }; iaxmodem-1.2.0/lib/libiax2/src/winiphone.c0000644000175000017500000004762711150047220017716 0ustar julienjulien/* * Miniphone: A simple, command line telephone * * IAX Support for talking to Asterisk and other Gnophone clients * * Copyright (C) 1999, Linux Support Services, Inc. * * Mark Spencer * * This program is free software, distributed under the terms of * the GNU General Public License */ /* #define PRINTCHUCK /* enable this to indicate chucked incomming packets */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "gsm.h" #include "iax-client.h" #include "frame.h" #include "miniphone.h" struct peer { int time; gsm gsmin; gsm gsmout; struct iax_session *session; struct peer *next; }; static struct peer *peers; static int answered_call = 0; /* stuff for wave audio device */ HWAVEOUT wout; HWAVEIN win; typedef struct whout { WAVEHDR w; short data[160]; struct whout *next; } WHOUT; WHOUT *outqueue = NULL; /* parameters for audio in */ #define NWHIN 8 /* number of input buffer entries */ /* NOTE the OUT_INTERVAL parameter *SHOULD* be more around 18 to 20 or so, since the packets should be spaced by 20 milliseconds. However, in practice, especially in Windoze-95, setting it that high caused underruns. 10 is just ever so slightly agressive, and the receiver has to chuck a packet every now and then. Thats about the way it should be to be happy. */ #define OUT_INTERVAL 10 /* number of ms to wait before sending more data to peer */ /* parameters for audio out */ #define OUT_DEPTH 12 /* number of outbut buffer entries */ #define OUT_PAUSE_THRESHOLD 2 /* number of active entries needed to start output (for smoothing) */ /* audio input buffer headers */ WAVEHDR whin[NWHIN]; /* audio input buffers */ char bufin[NWHIN][320]; /* initialize the sequence variables for the audio in stuff */ unsigned int whinserial = 1,nextwhin = 1; static struct peer *find_peer(struct iax_session *); static void parse_args(FILE *, unsigned char *); void do_iax_event(FILE *); void call(FILE *, char *); void answer_call(void); void reject_call(void); static void handle_event(FILE *, struct iax_event *e, struct peer *p); void parse_cmd(FILE *, int, char **); void issue_prompt(FILE *); void dump_array(FILE *, char **); static char *help[] = { "Welcome to the miniphone telephony client, the commands are as follows:\n", "Help\t\t-\tDisplays this screen.", "Call \t-\tDials the number supplied.", "Answer\t\t-\tAnswers an Inbound call.", "Reject\t\t-\tRejects an Inbound call.", "Dump\t\t-\tDumps (disconnects) the current call.", "Dtmf \t-\tSends specified DTMF digit.", "Status\t\t-\tLists the current sessions and their current status.", "Quit\t\t-\tShuts down the client.", "", 0 }; static struct peer *most_recent_answer; static struct iax_session *newcall = 0; /* holder of the time, relative to startup in system ticks. See our gettimeofday() implementation */ time_t startuptime; /* routine called at exit to shutdown audio I/O and close nicely. NOTE: If all this isnt done, the system doesnt not handle this cleanly and has to be rebooted. What a pile of doo doo!! */ void killem(void) { waveInStop(win); waveInReset(win); waveInClose(win); waveOutReset(wout); waveOutClose(wout); WSACleanup(); /* dont forget socket stuff too */ return; } /* Win-doze doenst have gettimeofday(). This sux. So, what we did is provide some gettimeofday-like functionality that works for our purposes. In the main(), we take a sample of the system tick counter (into startuptime). This function returns the relative time since program startup, more or less, which is certainly good enough for our purposes. */ void gettimeofday(struct timeval *tv, struct timezone *tz) { long l = startuptime + GetTickCount(); tv->tv_sec = l / 1000; tv->tv_usec = (l % 1000) * 1000; return; } static struct peer *find_peer(struct iax_session *session) { struct peer *cur = peers; while(cur) { if (cur->session == session) return cur; cur = cur->next; } return NULL; } void parse_args(FILE *f, unsigned char *cmd) { static char *argv[MAXARGS]; unsigned char *parse = cmd; int argc = 0, t = 0; // Don't mess with anything that doesn't exist... if(!*parse) return; memset(argv, 0, sizeof(argv)); while(*parse) { if(*parse < 33 || *parse > 128) { *parse = 0, t++; if(t > MAXARG) { fprintf(f, "Warning: Argument exceeds maximum argument size, command ignored!\n"); return; } } else if(t || !argc) { if(argc == MAXARGS) { fprintf(f, "Warning: Command ignored, too many arguments\n"); return; } argv[argc++] = parse; t = 0; } parse++; } if(argc) parse_cmd(f, argc, argv); } /* handle all network requests, and a pending scheduled event, if any */ void service_network(int netfd, FILE *f) { fd_set readfd; struct timeval dumbtimer; /* set up a timer that falls-through */ dumbtimer.tv_sec = 0; dumbtimer.tv_usec = 0; for(;;) /* suck everything outa network stuff */ { FD_ZERO(&readfd); FD_SET(netfd, &readfd); if (select(netfd + 1, &readfd, 0, 0, &dumbtimer) > 0) { if (FD_ISSET(netfd,&readfd)) { do_iax_event(f); (void) iax_time_to_next_event(); } else break; } else break; } do_iax_event(f); /* do pending event if any */ } int main(int argc, char *argv[]) { int port; int netfd; int c, i; FILE *f; char rcmd[RBUFSIZE]; gsm_frame fo; WSADATA foop; time_t t; WAVEFORMATEX wf; WHOUT *wh,*wh1,*wh2; unsigned long lastouttick = 0; /* get time of day in milliseconds, offset by tick count (see our gettimeofday() implementation) */ time(&t); startuptime = ((t % 86400) * 1000) - GetTickCount(); f = stdout; _dup2(fileno(stdout),fileno(stderr)); /* start up the windoze-socket layer stuff */ if (WSAStartup(0x0101,&foop)) { fprintf(stderr,"Fatal error: Falied to startup windows sockets\n"); return -1; } /* setup the format for opening audio channels */ wf.wFormatTag = WAVE_FORMAT_PCM; wf.nChannels = 1; wf.nSamplesPerSec = 8000; wf.nAvgBytesPerSec = 16000; wf.nBlockAlign = 2; wf.wBitsPerSample = 16; wf.cbSize = 0; /* open the audio out channel */ if (waveOutOpen(&wout,0,&wf,0,0,CALLBACK_NULL) != MMSYSERR_NOERROR) { fprintf(stderr,"Fatal Error: Failed to open wave output device\n"); return -1; } /* open the audio in channel */ if (waveInOpen(&win,0,&wf,0,0,CALLBACK_NULL) != MMSYSERR_NOERROR) { fprintf(stderr,"Fatal Error: Failed to open wave input device\n"); waveOutReset(wout); waveOutClose(wout); return -1; } /* activate the exit handler */ atexit(killem); /* initialize the audio in buffer structures */ memset(&whin,0,sizeof(whin)); if ( (port = iax_init(0) < 0)) { fprintf(stderr, "Fatal error: failed to initialize iax with port %d\n", port); return -1; } iax_set_formats(AST_FORMAT_GSM); netfd = iax_get_fd(); fprintf(f, "Text Based Telephony Client.\n\n"); issue_prompt(f); /* main tight loop */ while(1) { /* service the network stuff */ service_network(netfd,f); if (outqueue) /* if stuff in audio output queue, free it up if its available */ { /* go through audio output queue */ for(wh = outqueue,wh1 = wh2 = NULL,i = 0; wh != NULL; wh = wh->next) { service_network(netfd,f); /* service network here for better performance */ /* if last one was removed from queue, zot it here */ if (i && wh1) { free(wh1); wh1 = wh2; } i = 0; /* reset "last one removed" flag */ if (wh->w.dwFlags & WHDR_DONE) /* if this one is done */ { /* prepare audio header */ if ((c = waveOutUnprepareHeader(wout,&wh->w,sizeof(WAVEHDR))) != MMSYSERR_NOERROR) { fprintf(stderr,"Cannot unprepare audio out header, error %d\n",c); exit(255); } if (wh1 != NULL) /* if there was a last one */ { wh1->next = wh->next; } if (outqueue == wh) /* is first one, so set outqueue to next one */ { outqueue = wh->next; } i = 1; /* set 'to free' flag */ } wh2 = wh1; /* save old,old wh pointer */ wh1 = wh; /* save the old wh pointer */ } } /* go through all audio in buffers, and prepare and queue ones that are currently idle */ for(i = 0; i < NWHIN; i++) { service_network(netfd,f); /* service network stuff here for better performance */ if (!(whin[i].dwFlags & WHDR_PREPARED)) /* if not prepared, do so */ { /* setup this input buffer header */ memset(&whin[i],0,sizeof(WAVEHDR)); whin[i].lpData = bufin[i]; whin[i].dwBufferLength = 320; whin[i].dwUser = whinserial++; /* set 'user data' to current serial number */ /* prepare the buffer */ if (waveInPrepareHeader(win,&whin[i],sizeof(WAVEHDR))) { fprintf(stderr,"Unable to prepare header for input\n"); return -1; } /* add it to device (queue) */ if (waveInAddBuffer(win,&whin[i],sizeof(WAVEHDR))) { fprintf(stderr,"Unable to prepare header for input\n"); return -1; } } waveInStart(win); /* start it (if not already started) */ } /* if key pressed, do command stuff */ if(_kbhit()) { if ( ( fgets(&*rcmd, 256, stdin))) { rcmd[strlen(rcmd)-1] = 0; parse_args(f, &*rcmd); } else fprintf(f, "Fatal error: failed to read data!\n"); issue_prompt(f); } /* do audio input stuff for buffers that have received data from audio in device already. Must do them in serial number order (the order in which they were originally queued). */ if(answered_call) /* send audio only if call answered */ { for(;;) /* loop until all are found */ { for(i = 0; i < NWHIN; i++) /* find an available one that's the one we are looking for */ { service_network(netfd,f); /* service network here for better performance */ /* if not time to send any more, dont */ if (GetTickCount() < (lastouttick + OUT_INTERVAL)) { i = NWHIN; /* set to value that WILL exit loop */ break; } if ((whin[i].dwUser == nextwhin) && (whin[i].dwFlags & WHDR_DONE)) { /* if audio is ready */ /* must have read exactly 320 bytes */ if (whin[i].dwBytesRecorded != whin[i].dwBufferLength) { fprintf(stderr,"Short audio read, got %d bytes, expected %d bytes\n", whin[i].dwBytesRecorded, whin[i].dwBufferLength); return -1; } if(!most_recent_answer->gsmout) most_recent_answer->gsmout = gsm_create(); service_network(netfd,f); /* service network here for better performance */ /* encode the audio from the buffer into GSM format */ gsm_encode(most_recent_answer->gsmout, (short *) ((char *) whin[i].lpData), fo); if(iax_send_voice(most_recent_answer->session, AST_FORMAT_GSM, (char *)fo, sizeof(gsm_frame)) == -1) puts("Failed to send voice!"); lastouttick = GetTickCount(); /* save time of last output */ /* unprepare (free) the header */ waveInUnprepareHeader(win,&whin[i],sizeof(WAVEHDR)); /* initialize the buffer */ memset(&whin[i],0,sizeof(WAVEHDR)); /* bump the serial number to look for the next time */ nextwhin++; /* exit the loop so that we can start at lowest buffer again */ break; } } if (i >= NWHIN) break; /* if all found, get out of loop */ } } } return 0; } void do_iax_event(FILE *f) { int sessions = 0; struct iax_event *e = 0; struct peer *peer; while ( (e = iax_get_event(0))) { peer = find_peer(e->session); if(peer) { handle_event(f, e, peer); } else { if(e->etype != IAX_EVENT_CONNECT) { fprintf(stderr, "Huh? This is an event for a non-existant session?\n"); } sessions++; if(sessions >= MAX_SESSIONS) { fprintf(f, "Missed a call... too many sessions open.\n"); } if(e->event.connect.callerid && e->event.connect.dnid) fprintf(f, "Call from '%s' for '%s'", e->event.connect.callerid, e->event.connect.dnid); else if(e->event.connect.dnid) { fprintf(f, "Call from '%s'", e->event.connect.dnid); } else if(e->event.connect.callerid) { fprintf(f, "Call from '%s'", e->event.connect.callerid); } else printf("Call from"); fprintf(f, " (%s)\n", inet_ntoa(iax_get_peer_addr(e->session).sin_addr)); if(most_recent_answer) { fprintf(f, "Incoming call ignored, there's already a call waiting for answer... \ please accept or reject first\n"); iax_reject(e->session, "Too many calls, we're busy!"); } else { if ( !(peer = malloc(sizeof(struct peer)))) { fprintf(f, "Warning: Unable to allocate memory!\n"); return; } peer->time = time(0); peer->session = e->session; peer->gsmin = 0; peer->gsmout = 0; peer->next = peers; peers = peer; iax_accept(peer->session); iax_ring_announce(peer->session); most_recent_answer = peer; fprintf(f, "Incoming call!\n"); } iax_event_free(e); issue_prompt(f); } } } void call(FILE *f, char *num) { struct peer *peer; if(!newcall) newcall = iax_session_new(); else { fprintf(f, "Already attempting to call somewhere, please cancel first!\n"); return; } if ( !(peer = malloc(sizeof(struct peer)))) { fprintf(f, "Warning: Unable to allocate memory!\n"); return; } peer->time = time(0); peer->session = newcall; peer->gsmin = 0; peer->gsmout = 0; peer->next = peers; peers = peer; most_recent_answer = peer; iax_call(peer->session, num, 10); } void answer_call(void) { if(most_recent_answer) iax_answer(most_recent_answer->session); printf("Answering call!\n"); answered_call = 1; } void dump_call(void) { if(most_recent_answer) { iax_hangup(most_recent_answer->session,""); free(most_recent_answer); } printf("Dumping call!\n"); answered_call = 0; most_recent_answer = 0; answered_call = 0; peers = 0; newcall = 0; } void reject_call(void) { iax_reject(most_recent_answer->session, "Call rejected manually."); most_recent_answer = 0; } void handle_event(FILE *f, struct iax_event *e, struct peer *p) { int len,n; WHOUT *wh,*wh1; short fr[160]; static paused_xmit = 0; switch(e->etype) { case IAX_EVENT_HANGUP: iax_hangup(most_recent_answer->session, "Byeee!"); fprintf(f, "Call disconnected by peer\n"); free(most_recent_answer); most_recent_answer = 0; answered_call = 0; peers = 0; newcall = 0; break; case IAX_EVENT_REJECT: fprintf(f, "Authentication was rejected\n"); break; case IAX_EVENT_ACCEPT: fprintf(f, "Waiting for answer... RING RING\n"); issue_prompt(f); break; case IAX_EVENT_ANSWER: answer_call(); break; case IAX_EVENT_VOICE: switch(e->event.voice.format) { case AST_FORMAT_GSM: if(e->event.voice.datalen % 33) { fprintf(stderr, "Weird gsm frame, not a multiple of 33.\n"); break; } if (!p->gsmin) p->gsmin = gsm_create(); len = 0; while(len < e->event.voice.datalen) { if(gsm_decode(p->gsmin, (char *) e->event.voice.data + len, fr)) { fprintf(stderr, "Bad GSM data\n"); break; } else { /* its an audio packet to be output to user */ /* get count of pending items in audio output queue */ n = 0; if (outqueue) { /* determine number of pending out queue items */ for(wh = outqueue; wh != NULL; wh = wh->next) { if (!(wh->w.dwFlags & WHDR_DONE)) n++; } } /* if not too many, send to user, otherwise chuck packet */ if (n <= OUT_DEPTH) /* if not to chuck packet */ { /* malloc the memory for the queue item */ wh = (WHOUT *) malloc(sizeof(WHOUT)); if (wh == (WHOUT *) NULL) /* if error, bail */ { fprintf(stderr,"Outa memory!!!!\n"); exit(255); } /* initialize the queue entry */ memset(wh,0,sizeof(WHOUT)); /* copy the PCM data from the gsm conversion buffer */ memcpy((char *)wh->data,(char *)fr,sizeof(fr)); /* set parameters for data */ wh->w.lpData = (char *) wh->data; wh->w.dwBufferLength = 320; /* prepare buffer for output */ if (waveOutPrepareHeader(wout,&wh->w,sizeof(WAVEHDR))) { fprintf(stderr,"Cannot prepare header for audio out\n"); exit(255); } /* if not currently transmitting, hold off a couple of packets for smooth sounding output */ if ((!n) && (!paused_xmit)) { /* pause output (before starting) */ waveOutPause(wout); /* indicate as such */ paused_xmit = 1; } /* queue packet for output on audio device */ if (waveOutWrite(wout,&wh->w,sizeof(WAVEHDR))) { fprintf(stderr,"Cannot output to wave output device\n"); exit(255); } /* if we are paused, and we have enough packets, start audio */ if ((n > OUT_PAUSE_THRESHOLD) && paused_xmit) { /* start the output */ waveOutRestart(wout); /* indicate as such */ paused_xmit = 0; } /* insert it onto tail of outqueue */ if (outqueue == NULL) /* if empty queue */ outqueue = wh; /* point queue to new entry */ else /* otherwise is non-empty queue */ { wh1 = outqueue; while(wh1->next) wh1 = wh1->next; /* find last entry in queue */ wh1->next = wh; /* point it to new entry */ } } #ifdef PRINTCHUCK else printf("Chucking packet!!\n"); #endif } len += 33; } break; default : fprintf(f, "Don't know how to handle that format %d\n", e->event.voice.format); } break; case IAX_EVENT_RINGA: break; default: fprintf(f, "Unknown event: %d\n", e->etype); break; } } void parse_cmd(FILE *f, int argc, char **argv) { _strupr(argv[0]); if(!strcmp(argv[0], "HELP")) { if(argc == 1) dump_array(f, help); else if(argc == 2) { if(!strcmp(argv[1], "HELP")) fprintf(f, "Help \t-\tDisplays general help or specific help on command if supplied an arguement\n"); else if(!strcmp(argv[1], "QUIT")) fprintf(f, "Quit\t\t-\tShuts down the miniphone\n"); else fprintf(f, "No help available on %s\n", argv[1]); } else { fprintf(f, "Too many arguements for command help.\n"); } } else if(!strcmp(argv[0], "STATUS")) { if(argc == 1) { int c = 0; struct peer *peerptr = peers; if(!peerptr) fprintf(f, "No session matches found.\n"); else while(peerptr) { fprintf(f, "Listing sessions:\n\n"); fprintf(f, "Session %d\n", ++c); fprintf(f, "Session existed for %d seconds\n", (int)time(0)-peerptr->time); if(answered_call) fprintf(f, "Call answered.\n"); else fprintf(f, "Call ringing.\n"); peerptr = peerptr->next; } } else fprintf(f, "Too many arguments for command status.\n"); } else if(!strcmp(argv[0], "ANSWER")) { if(argc > 1) fprintf(f, "Too many arguements for command answer\n"); else answer_call(); } else if(!strcmp(argv[0], "REJECT")) { if(argc > 1) fprintf(f, "Too many arguements for command reject\n"); else { fprintf(f, "Rejecting current phone call.\n"); reject_call(); } } else if(!strcmp(argv[0], "CALL")) { if(argc > 2) fprintf(f, "Too many arguements for command call\n"); else { call(f, argv[1]); } } else if(!strcmp(argv[0], "DUMP")) { if(argc > 1) fprintf(f, "Too many arguements for command dump\n"); else { dump_call(); } } else if(!strcmp(argv[0], "DTMF")) { if(argc > 2) { fprintf(f, "Too many arguements for command dtmf\n"); return; } if (argc < 1) { fprintf(f, "Too many arguements for command dtmf\n"); return; } if(most_recent_answer) iax_send_dtmf(most_recent_answer->session,*argv[1]); } else if(!strcmp(argv[0], "QUIT")) { if(argc > 1) fprintf(f, "Too many arguements for command quit\n"); else { fprintf(f, "Good bye!\n"); exit(1); } } else fprintf(f, "Unknown command of %s\n", argv[0]); } void issue_prompt(FILE *f) { fprintf(f, "TeleClient> "); fflush(f); } void dump_array(FILE *f, char **array) { while(*array) fprintf(f, "%s\n", *array++); } iaxmodem-1.2.0/lib/libiax2/src/iax-client.h0000644000175000017500000002444311150047220017747 0ustar julienjulien/* * Asterisk -- A telephony toolkit for Linux. * * Implementation of Inter-Asterisk eXchange * * Copyright (C) 1999, Mark Spencer * * Mark Spencer * * This program is free software, distributed under the terms of * the GNU Lesser General Public License (LGPL) */ #ifndef _ASTERISK_IAX_CLIENT_H #define _ASTERISK_IAX_CLIENT_H #if defined(_MSC_VER) /* disable zero-sized array in struct/union warning */ #pragma warning(disable:4200) #endif #ifdef WIN32 #define socklen_t int #endif #include "frame.h" #include "iax2.h" #include "iax2-parser.h" #define MAXSTRLEN 80 #define IAX_AUTHMETHOD_PLAINTEXT IAX_AUTH_PLAINTEXT #define IAX_AUTHMETHOD_MD5 IAX_AUTH_MD5 extern char iax_errstr[]; struct iax_session; #define IAX_EVENT_CONNECT 0 /* Connect a new call */ #define IAX_EVENT_ACCEPT 1 /* Accept a call */ #define IAX_EVENT_HANGUP 2 /* Hang up a call */ #define IAX_EVENT_REJECT 3 /* Rejected call */ #define IAX_EVENT_VOICE 4 /* Voice Data */ #define IAX_EVENT_DTMF 5 /* A DTMF Tone */ #define IAX_EVENT_TIMEOUT 6 /* Connection timeout... session will be a pointer to free()'d memory! */ #define IAX_EVENT_LAGRQ 7 /* Lag request -- Internal use only */ #define IAX_EVENT_LAGRP 8 /* Lag Measurement. See event.lag */ #define IAX_EVENT_RINGA 9 /* Announce we/they are ringing */ #define IAX_EVENT_PING 10 /* Ping -- internal use only */ #define IAX_EVENT_PONG 11 /* Pong -- internal use only */ #define IAX_EVENT_BUSY 12 /* Report a line busy */ #define IAX_EVENT_ANSWER 13 /* Answer the line */ #define IAX_EVENT_IMAGE 14 /* Send/Receive an image */ #define IAX_EVENT_AUTHRQ 15 /* Authentication request */ #define IAX_EVENT_AUTHRP 16 /* Authentication reply */ #define IAX_EVENT_REGREQ 17 /* Registration request */ #define IAX_EVENT_REGACK 18 /* Registration reply */ #define IAX_EVENT_URL 19 /* URL received */ #define IAX_EVENT_LDCOMPLETE 20 /* URL loading complete */ #define IAX_EVENT_TRANSFER 21 /* Transfer has taken place */ #define IAX_EVENT_DPREQ 22 /* Dialplan request */ #define IAX_EVENT_DPREP 23 /* Dialplan reply */ #define IAX_EVENT_DIAL 24 /* Dial on a TBD call */ #define IAX_EVENT_QUELCH 25 /* Quelch Audio */ #define IAX_EVENT_UNQUELCH 26 /* Unquelch Audio */ #define IAX_EVENT_UNLINK 27 /* Unlink */ #define IAX_EVENT_LINKREJECT 28 /* Link Rejection */ #define IAX_EVENT_TEXT 29 /* Text Frame :-) */ #define IAX_EVENT_REGREJ 30 /* Registration reply */ #define IAX_EVENT_LINKURL 31 /* Unlink */ #define IAX_EVENT_CNG 32 /* Comfort-noise (almost silence) */ #define IAX_EVENT_POKE 33 #define IAX_EVENT_VIDEO 34 /* Send/receive video */ /* moved from iax.c to support attended transfer */ #define IAX_EVENT_REREQUEST 999 #define IAX_EVENT_TXREPLY 1000 #define IAX_EVENT_TXREJECT 1001 #define IAX_EVENT_TXACCEPT 1002 #define IAX_EVENT_TXREADY 1003 /* * Null event. We use it to notify back the caller that a frame has been * received and is queued for delivery * Applciations should simply ignore it */ #define IAX_EVENT_NULL 65535 #define IAX_SCHEDULE_FUZZ 0 /* ms of fuzz to drop */ #if defined(WIN32) || defined(_WIN32_WCE) #if defined(_MSC_VER) typedef int (__stdcall *iax_sendto_t)(SOCKET, const void *, size_t, int, const struct sockaddr *, socklen_t); typedef int (__stdcall *iax_recvfrom_t)(SOCKET, void *, size_t, int, struct sockaddr *, socklen_t *); #else typedef int PASCAL (*iax_sendto_t)(SOCKET, const char *, int, int, const struct sockaddr *, int); typedef int PASCAL (*iax_recvfrom_t)(SOCKET, char *, int, int, struct sockaddr *, int *); #endif #else typedef int (*iax_sendto_t)(int, const void *, size_t, int, const struct sockaddr *, socklen_t); typedef int (*iax_recvfrom_t)(int, void *, size_t, int, struct sockaddr *, socklen_t *); #endif struct iax_event { int etype; /* Type of event */ int subclass; /* Subclass data (event specific) */ unsigned int ts; /* Timestamp */ struct iax_session *session; /* Applicable session */ int datalen; /* Length of raw data */ struct iax_ies ies; /* IE's for IAX2 frames */ unsigned char data[0]; /* Raw data if applicable */ }; #if defined(__cplusplus) extern "C" { #endif /* All functions return 0 on success and -1 on failure unless otherwise specified */ /* Called to initialize IAX structures and sockets. Returns actual portnumber (which it will try preferred portno first, but if not take what it can get */ extern int iax_init(int preferredportno); /* Get filedescriptor for IAX to use with select or gtk_input_add */ extern int iax_get_fd(void); /* Find out how many milliseconds until the next scheduled event */ extern int iax_time_to_next_event(void); /* Generate a new IAX session */ extern struct iax_session *iax_session_new(void); /* Return exactly one iax event (if there is one pending). If blocking is non-zero, IAX will block until some event is received */ extern struct iax_event *iax_get_event(int blocking); extern int iax_auth_reply(struct iax_session *session, char *password, char *challenge, int methods); /* Free an event */ extern void iax_event_free(struct iax_event *event); struct sockaddr_in; /* Front ends for sending events */ extern int iax_send_dtmf(struct iax_session *session, char digit); extern int iax_send_voice(struct iax_session *session, int format, unsigned char *data, int datalen, int samples); extern int iax_send_cng(struct iax_session *session, int level, unsigned char *data, int datalen); extern int iax_send_image(struct iax_session *session, int format, unsigned char *data, int datalen); extern int iax_send_url(struct iax_session *session, const char *url, int link); extern int iax_send_text(struct iax_session *session, const char *text); extern int iax_send_ping(struct iax_session *session); extern int iax_load_complete(struct iax_session *session); extern int iax_reject(struct iax_session *session, char *reason); extern int iax_busy(struct iax_session *session); extern int iax_congestion(struct iax_session *session); extern int iax_hangup(struct iax_session *session, char *byemsg); extern int iax_call(struct iax_session *session, const char *cidnum, const char *cidname, const char *ich, const char *lang, int wait, int format, int capability); extern int iax_accept(struct iax_session *session, int format); extern int iax_answer(struct iax_session *session); extern int iax_sendurl(struct iax_session *session, char *url); extern int iax_send_unlink(struct iax_session *session); extern int iax_send_link_reject(struct iax_session *session); extern int iax_ring_announce(struct iax_session *session); extern struct sockaddr_in iax_get_peer_addr(struct iax_session *session); extern int iax_register(struct iax_session *session, const char *hostname, const char *peer, const char *secret, int refresh); extern int iax_unregister(struct iax_session *session, const char *hostname, const char *peer, const char *secret, const char *reason); extern int iax_lag_request(struct iax_session *session); extern int iax_dial(struct iax_session *session, char *number); /* Dial on a TBD call */ extern int iax_dialplan_request(struct iax_session *session, char *number); /* Request dialplan status for number */ extern int iax_quelch(struct iax_session *session); extern int iax_unquelch(struct iax_session * session); extern int iax_transfer(struct iax_session *session, const char *number); extern int iax_quelch_moh(struct iax_session *session, int MOH); extern int iax_send_video(struct iax_session *session, int format, unsigned char *data, int datalen, int fullframe); extern int iax_send_video_trunk(struct iax_session *session, int format, char *data, int datalen, int fullframe, int ntrunk); extern void iax_destroy(struct iax_session * session); extern void iax_enable_debug(void); extern void iax_disable_debug(void); /* For attended transfer, application create a new session, * make a call on the new session. * On answer of the new session, call iax_setup_transfer and wait for * IAX_EVENT_TXREADY when both sides are completed succefully or * IAX_EVENT_TXREJECT for either side. * If there are music on hold the it will be stopped by this library. */ extern int iax_setup_transfer(struct iax_session *s0, struct iax_session *s1); struct iax_netstat { int jitter; int losspct; int losscnt; int packets; int delay; int dropped; int ooo; }; /* fills in rtt, and an iax_netstat structure for each of local/remote directions of call */ extern int iax_get_netstats(struct iax_session *s, int *rtt, struct iax_netstat *local, struct iax_netstat *remote); extern void iax_set_private(struct iax_session *s, void *pvt); extern void *iax_get_private(struct iax_session *s); extern void iax_set_sendto(struct iax_session *s, iax_sendto_t sendto); /* to use application networking instead of internal, set call this instead of iax_init, * and pass in sendto and recvfrom replacements. blocking reads may not be implemented */ extern void iax_set_networking(iax_sendto_t st, iax_recvfrom_t rf); /* destroy an iax session */ extern void iax_session_destroy(struct iax_session **session); /* To control use of jitter buffer for video event */ int iax_video_bypass_jitter(struct iax_session*, int ); /* Handle externally received frames */ struct iax_event *iax_net_process(unsigned char *buf, int len, struct sockaddr_in *sin); extern unsigned int iax_session_get_capability(struct iax_session *s); extern char iax_pref_codec_add(struct iax_session *session, unsigned int format); extern void iax_pref_codec_del(struct iax_session *session, unsigned int format); extern int iax_pref_codec_get(struct iax_session *session, unsigned int *array, int len); /* Fine tune jitterbuffer */ extern void iax_set_jb_target_extra( long value ); /* Portable 'decent' random number generation */ extern void iax_seed_random(void); extern int iax_random(void); #if defined(__cplusplus) } #endif #endif /* _ASTERISK_IAX_CLIENT_H */ iaxmodem-1.2.0/lib/libiax2/src/iax2.h0000644000175000017500000002443311150047220016554 0ustar julienjulien/* * Asterisk -- A telephony toolkit for Linux. * * Implementation of Inter-Asterisk eXchange * * Copyright (C) 2003, Digium * * Mark Spencer * * This program is free software, distributed under the terms of * the GNU Lesser (Library) General Public License */ #ifndef _IAX2_H #define _IAX2_H /* Max version of IAX protocol we support */ #define IAX_PROTO_VERSION 2 #define IAX_MAX_CALLS 32768 #define IAX_FLAG_FULL 0x8000 #define IAX_FLAG_RETRANS 0x8000 #define IAX_FLAG_SC_LOG 0x80 #define IAX_MAX_SHIFT 0x1F #define IAX_WINDOW 64 static inline unsigned int get_unaligned_uint32(void *p) { struct { unsigned int d; } __attribute__((packed)) *pp = (void *)p; return pp->d; } static inline unsigned short get_unaligned_uint16(void *p) { struct { unsigned short d; } __attribute__((packed)) *pp = (void *)p; return pp->d; } /* Subclass for AST_FRAME_IAX */ #define IAX_COMMAND_NEW 1 #define IAX_COMMAND_PING 2 #define IAX_COMMAND_PONG 3 #define IAX_COMMAND_ACK 4 #define IAX_COMMAND_HANGUP 5 #define IAX_COMMAND_REJECT 6 #define IAX_COMMAND_ACCEPT 7 #define IAX_COMMAND_AUTHREQ 8 #define IAX_COMMAND_AUTHREP 9 #define IAX_COMMAND_INVAL 10 #define IAX_COMMAND_LAGRQ 11 #define IAX_COMMAND_LAGRP 12 #define IAX_COMMAND_REGREQ 13 /* Registration request */ #define IAX_COMMAND_REGAUTH 14 /* Registration authentication required */ #define IAX_COMMAND_REGACK 15 /* Registration accepted */ #define IAX_COMMAND_REGREJ 16 /* Registration rejected */ #define IAX_COMMAND_REGREL 17 /* Force release of registration */ #define IAX_COMMAND_VNAK 18 /* If we receive voice before valid first voice frame, send this */ #define IAX_COMMAND_DPREQ 19 /* Request status of a dialplan entry */ #define IAX_COMMAND_DPREP 20 /* Request status of a dialplan entry */ #define IAX_COMMAND_DIAL 21 /* Request a dial on channel brought up TBD */ #define IAX_COMMAND_TXREQ 22 /* Transfer Request */ #define IAX_COMMAND_TXCNT 23 /* Transfer Connect */ #define IAX_COMMAND_TXACC 24 /* Transfer Accepted */ #define IAX_COMMAND_TXREADY 25 /* Transfer ready */ #define IAX_COMMAND_TXREL 26 /* Transfer release */ #define IAX_COMMAND_TXREJ 27 /* Transfer reject */ #define IAX_COMMAND_QUELCH 28 /* Stop audio/video transmission */ #define IAX_COMMAND_UNQUELCH 29 /* Resume audio/video transmission */ #define IAX_COMMAND_POKE 30 /* Like ping, but does not require an open connection */ #define IAX_COMMAND_PAGE 31 /* Paging description */ #define IAX_COMMAND_MWI 32 /* Stand-alone message waiting indicator */ #define IAX_COMMAND_UNSUPPORT 33 /* Unsupported message received */ #define IAX_COMMAND_TRANSFER 34 /* Request remote transfer */ #define IAX_COMMAND_PROVISION 35 /* Provision device */ #define IAX_COMMAND_FWDOWNL 36 /* Download firmware */ #define IAX_COMMAND_FWDATA 37 /* Firmware Data */ #define IAX_DEFAULT_REG_EXPIRE 60 /* By default require re-registration once per minute */ #define IAX_LINGER_TIMEOUT 10 /* How long to wait before closing bridged call */ #define IAX_DEFAULT_PORTNO 4569 /* IAX Information elements */ #define IAX_IE_CALLED_NUMBER 1 /* Number/extension being called - string */ #define IAX_IE_CALLING_NUMBER 2 /* Calling number - string */ #define IAX_IE_CALLING_ANI 3 /* Calling number ANI for billing - string */ #define IAX_IE_CALLING_NAME 4 /* Name of caller - string */ #define IAX_IE_CALLED_CONTEXT 5 /* Context for number - string */ #define IAX_IE_USERNAME 6 /* Username (peer or user) for authentication - string */ #define IAX_IE_PASSWORD 7 /* Password for authentication - string */ #define IAX_IE_CAPABILITY 8 /* Actual codec capability - unsigned int */ #define IAX_IE_FORMAT 9 /* Desired codec format - unsigned int */ #define IAX_IE_LANGUAGE 10 /* Desired language - string */ #define IAX_IE_VERSION 11 /* Protocol version - short */ #define IAX_IE_ADSICPE 12 /* CPE ADSI capability - short */ #define IAX_IE_DNID 13 /* Originally dialed DNID - string */ #define IAX_IE_AUTHMETHODS 14 /* Authentication method(s) - short */ #define IAX_IE_CHALLENGE 15 /* Challenge data for MD5/RSA - string */ #define IAX_IE_MD5_RESULT 16 /* MD5 challenge result - string */ #define IAX_IE_RSA_RESULT 17 /* RSA challenge result - string */ #define IAX_IE_APPARENT_ADDR 18 /* Apparent address of peer - struct sockaddr_in */ #define IAX_IE_REFRESH 19 /* When to refresh registration - short */ #define IAX_IE_DPSTATUS 20 /* Dialplan status - short */ #define IAX_IE_CALLNO 21 /* Call number of peer - short */ #define IAX_IE_CAUSE 22 /* Cause - string */ #define IAX_IE_IAX_UNKNOWN 23 /* Unknown IAX command - byte */ #define IAX_IE_MSGCOUNT 24 /* How many messages waiting - short */ #define IAX_IE_AUTOANSWER 25 /* Request auto-answering -- none */ #define IAX_IE_MUSICONHOLD 26 /* Request musiconhold with QUELCH -- none or string */ #define IAX_IE_TRANSFERID 27 /* Transfer Request Identifier -- int */ #define IAX_IE_RDNIS 28 /* Referring DNIS -- string */ #define IAX_IE_PROVISIONING 29 /* Provisioning info */ #define IAX_IE_AESPROVISIONING 30 /* AES Provisioning info */ #define IAX_IE_DATETIME 31 /* Date/Time */ #define IAX_IE_DEVICETYPE 32 /* Device Type -- string */ #define IAX_IE_SERVICEIDENT 33 /* Service Identifier -- string */ #define IAX_IE_FIRMWAREVER 34 /* Firmware revision -- u16 */ #define IAX_IE_FWBLOCKDESC 35 /* Firmware block description -- u32 */ #define IAX_IE_FWBLOCKDATA 36 /* Firmware block of data -- raw */ #define IAX_IE_PROVVER 37 /* Provisioning Version (u32) */ #define IAX_IE_CALLINGPRES 38 /* Calling presentation (u8) */ #define IAX_IE_CALLINGTON 39 /* Calling type of number (u8) */ #define IAX_IE_CALLINGTNS 40 /* Calling transit network select (u16) */ #define IAX_IE_SAMPLINGRATE 41 /* Supported sampling rates (u16) */ #define IAX_IE_CAUSECODE 42 /* Hangup cause (u8) */ #define IAX_IE_ENCRYPTION 43 /* Encryption format (u16) */ #define IAX_IE_ENCKEY 44 /* Encryption key (raw) */ #define IAX_IE_CODEC_PREFS 45 /* Codec Negotiation */ #define IAX_IE_RR_JITTER 46 /* Received jitter (as in RFC1889) u32 */ #define IAX_IE_RR_LOSS 47 /* Received loss (high byte loss pct, low 24 bits loss count, as in rfc1889 */ #define IAX_IE_RR_PKTS 48 /* Received frames (total frames received) u32 */ #define IAX_IE_RR_DELAY 49 /* Max playout delay for received frames (in ms) u16 */ #define IAX_IE_RR_DROPPED 50 /* Dropped frames (presumably by jitterbuf) u32 */ #define IAX_IE_RR_OOO 51 /* Frames received Out of Order u32 */ #define IAX_AUTH_PLAINTEXT (1 << 0) #define IAX_AUTH_MD5 (1 << 1) #define IAX_AUTH_RSA (1 << 2) #define IAX_META_TRUNK 1 /* Trunk meta-message */ #define IAX_META_VIDEO 2 /* Video frame */ #define IAX_RATE_8KHZ (1 << 0) /* 8khz sampling (default if absent) */ #define IAX_RATE_11KHZ (1 << 1) /* 11.025khz sampling */ #define IAX_RATE_16KHZ (1 << 2) /* 16khz sampling */ #define IAX_RATE_22KHZ (1 << 3) /* 22.05khz sampling */ #define IAX_RATE_44KHZ (1 << 4) /* 44.1khz sampling */ #define IAX_RATE_48KHZ (1 << 5) /* 48khz sampling */ #define IAX_DPSTATUS_EXISTS (1 << 0) #define IAX_DPSTATUS_CANEXIST (1 << 1) #define IAX_DPSTATUS_NONEXISTANT (1 << 2) #define IAX_DPSTATUS_IGNOREPAT (1 << 14) #define IAX_DPSTATUS_MATCHMORE (1 << 15) #if defined(_MSC_VER) #pragma pack(push,1) #define __PACKED #else #define __PACKED __attribute__ ((__packed__)) #endif /* Full frames are always delivered reliably */ struct ast_iax2_full_hdr { unsigned short scallno; /* Source call number -- high bit must be 1 */ unsigned short dcallno; /* Destination call number -- high bit is 1 if retransmission */ unsigned int ts; /* 32-bit timestamp in milliseconds (from 1st transmission) */ unsigned char oseqno; /* Packet number (outgoing) */ unsigned char iseqno; /* Packet number (next incoming expected) */ char type; /* Frame type */ unsigned char csub; /* Compressed subclass */ unsigned char iedata[0]; } __PACKED; /* Mini header is used only for voice frames -- delivered unreliably */ struct ast_iax2_mini_hdr { unsigned short callno; /* Source call number -- high bit must be 0, rest must be non-zero */ unsigned short ts; /* 16-bit Timestamp (high 16 bits from last ast_iax2_full_hdr) */ /* Frametype implicitly VOICE_FRAME */ /* subclass implicit from last ast_iax2_full_hdr */ unsigned char data[0]; } __PACKED; struct ast_iax2_meta_hdr { unsigned short zeros; /* Zeros field -- must be zero */ unsigned char metacmd; /* Meta command */ unsigned char cmddata; /* Command Data */ unsigned char data[0]; } __PACKED; struct ast_iax2_video_hdr { unsigned short zeros; /* Zeros field -- must be zero */ unsigned short callno; /* Video call number */ unsigned short ts; /* Timestamp and mark if present */ unsigned char data[0]; } __PACKED; struct ast_iax2_meta_trunk_hdr { unsigned int ts; /* 32-bit timestamp for all messages */ unsigned char data[0]; } __PACKED; struct ast_iax2_meta_trunk_entry { unsigned short callno; /* Call number */ unsigned short len; /* Length of data for this callno */ } __PACKED; #define IAX_FIRMWARE_MAGIC 0x69617879 struct ast_iax2_firmware_header { unsigned int magic; /* Magic number */ unsigned short version; /* Software version */ unsigned char devname[16]; /* Device */ unsigned int datalen; /* Data length of file beyond header */ unsigned char chksum[16]; /* Checksum of all data */ unsigned char data[0]; } __PACKED; #if defined(_MSC_VER) #pragma pack(pop) #endif #undef __PACKED #endif iaxmodem-1.2.0/lib/libiax2/src/ring10.h0000644000175000017500000042360411150047220017014 0ustar julienjulien/* * Signed 16-bit audio data * * Source: /home/markster/ring10.raw * * Copyright (C) 1999, Mark Spencer and Linux Support Services * * Distributed under the terms of the GNU General Public License * */ static signed short ring10[] = { 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 0x82a0, 0x8dc7, 0x607e, 0xc0c6, 0x2bd3, 0x8df5, 0x828d, 0x0716, 0xaca6, 0xcefe, 0x41df, 0xd185, 0x8aa3, 0x8b1a, 0x789b, 0x82a2, 0x804f, 0x7ea8, 0x8113, 0x7f7d, 0x7fff, 0x801e, 0x801d, 0x7f32, 0x82ec, 0x83e1, 0x7fb0, 0x7f71, 0x80de, 0x7f3d, 0x7fe3, 0x81b4, 0x7c37, 0x8553, 0x7b29, 0x7ede, 0xde6e, 0x0e64, 0xf9f4, 0x015e, 0x00f6, 0xfe56, 0x0019, 0xf8bb, 0xfd90, 0x08cc, 0x05ab, 0xfd0b, 0xf9c6, 0xf875, 0xf789, 0xfc74, 0x032e, 0xf97a, 0xf4bb, 0x0212, 0x006e, 0x03df, 0x17c5, 0x0f50, 0xfb23, 0xfdbd, 0xf7cf, 0xdf5b, 0xe2d3, 0xf111, 0xef27, 0x11c5, 0x33a4, 0x168d, 0x0145, 0x0494, 0xe85c, 0xdac3, 0xf0c7, 0xeea8, 0x0023, 0x3036, 0x252a, 0xffb7, 0x01d1, 0xf637, 0xd506, 0xe8eb, 0xf5ff, 0xe5ca, 0x1ec5, 0x3fa4, 0x0e3c, 0x1570, 0x2b37, 0xea23, 0xca43, 0xf392, 0xdf0e, 0xde40, 0x2e7c, 0x276f, 0x035c, 0x2ccc, 0x1acf, 0xcf4a, 0xeb5b, 0x0fb1, 0xe01a, 0x0c69, 0x3a97, 0xfb54, 0x0751, 0x20f1, 0xdce9, 0xd2a2, 0x19b3, 0x096f, 0xf1b6, 0x38de, 0x1f70, 0xf32b, 0x2569, 0x0650, 0xc3d7, 0xf1ad, 0x1aa5, 0xe87e, 0x0c7f, 0x406d, 0xffaa, 0x0ba8, 0x2e02, 0xe545, 0xcebb, 0x10fc, 0x0102, 0xded8, 0x2b7c, 0x2053, 0xec6f, 0x266e, 0x1770, 0xcb63, 0xf18e, 0x2015, 0xe6ef, 0xfe64, 0x3700, 0xf628, 0xfb00, 0x2e43, 0xee48, 0xcd4a, 0x1867, 0x0ec3, 0xdd77, 0x2291, 0x1c80, 0xe325, 0x19b7, 0x1719, 0xcb88, 0xeded, 0x258c, 0xe7e8, 0xf0c6, 0x2d21, 0xf3d5, 0xf494, 0x290d, 0xef7b, 0xca28, 0x12c8, 0x0d8d, 0xd5f3, 0x171d, 0x1994, 0xe0c0, 0x1348, 0x1929, 0xcf9b, 0xe6fb, 0x20ae, 0xe921, 0xed2b, 0x2c54, 0xf96e, 0xf19f, 0x21b6, 0xf12e, 0xc8b4, 0x0907, 0x0964, 0xd049, 0x0eb8, 0x1fa6, 0xe6b5, 0x0cec, 0x16b6, 0xcd0c, 0xda57, 0x17c9, 0xe440, 0xe2a2, 0x2b4d, 0xffa2, 0xec7e, 0x1ee9, 0xf674, 0xbfcb, 0xf769, 0x0402, 0xcfe8, 0x104b, 0x2734, 0xe7e9, 0x07d9, 0x19f4, 0xd032, 0xd00b, 0x0e46, 0xe17d, 0xe2d8, 0x3456, 0x0781, 0xed01, 0x238d, 0xfa72, 0xbb51, 0xf543, 0x050b, 0xccd5, 0x1491, 0x3358, 0xedad, 0x10c4, 0x283b, 0xd051, 0xc9e9, 0x11f8, 0xe2cb, 0xe534, 0x43aa, 0x1090, 0xf11b, 0x3267, 0x02c3, 0xb72d, 0xf9ac, 0x0fbd, 0xce45, 0x1d7b, 0x4389, 0xef2e, 0x1593, 0x348e, 0xd0cb, 0xca8c, 0x1f61, 0xe981, 0xdef7, 0x4774, 0x15ae, 0xefab, 0x3b28, 0x0a9e, 0xb2f6, 0xf9e9, 0x1976, 0xcc08, 0x15ab, 0x4534, 0xee6c, 0x159b, 0x3753, 0xcf09, 0xc69a, 0x2270, 0xf15c, 0xdee6, 0x48ce, 0x1af4, 0xf169, 0x3da0, 0x0d68, 0xb573, 0xff9e, 0x20ba, 0xcbfe, 0x142d, 0x4879, 0xed49, 0x1434, 0x3d96, 0xd714, 0xca99, 0x298b, 0xf708, 0xd92c, 0x4632, 0x1acc, 0xea6e, 0x3d2c, 0x1412, 0xb534, 0xfbfa, 0x24f9, 0xcd72, 0x0df9, 0x48f8, 0xeb87, 0x0bca, 0x3dd5, 0xd6cc, 0xc015, 0x2605, 0xfa87, 0xd1a9, 0x40d0, 0x1c59, 0xe0de, 0x34f9, 0x14c6, 0xaf61, 0xf2a5, 0x23e6, 0xc929, 0x01be, 0x4423, 0xe53b, 0x0182, 0x3c3a, 0xd758, 0xbb9d, 0x1fa9, 0xf454, 0xc611, 0x36e8, 0x18f7, 0xdac9, 0x2e8a, 0x126d, 0xac14, 0xead6, 0x2215, 0xc990, 0xf9f5, 0x43cb, 0xea01, 0xfcbf, 0x38fd, 0xd9f3, 0xb7cd, 0x1bc4, 0xfd41, 0xca56, 0x31e3, 0x1d4b, 0xdca2, 0x2a9f, 0x1c24, 0xb8aa, 0xeb59, 0x25d5, 0xd2d0, 0xfa10, 0x44fa, 0xefe0, 0xfced, 0x3ef4, 0xe9a1, 0xbdf0, 0x19ac, 0x0198, 0xca6f, 0x2f04, 0x25b6, 0xe187, 0x29ba, 0x250a, 0xbe42, 0xe40e, 0x24ef, 0xd75d, 0xf476, 0x44f8, 0xf719, 0xf7a1, 0x3c94, 0xf20e, 0xbcdf, 0x16a3, 0x07e8, 0xc8d4, 0x2a3e, 0x2b3f, 0xdf4e, 0x235d, 0x2c92, 0xc2c7, 0xdf39, 0x2873, 0xd790, 0xea2a, 0x47fd, 0xfd0e, 0xf0e3, 0x3bd8, 0xf4e9, 0xb265, 0x0c2c, 0x0751, 0xc302, 0x29bb, 0x37bd, 0xe138, 0x1e0c, 0x2d09, 0xbddb, 0xd246, 0x24c4, 0xd87a, 0xe5df, 0x4ff6, 0x08d6, 0xf0d8, 0x3d61, 0xf8bf, 0xaede, 0x0a36, 0x0df3, 0xc0f5, 0x23ec, 0x3e92, 0xe3d7, 0x1cad, 0x348e, 0xc0d6, 0xcd4e, 0x265c, 0xd9b6, 0xdf83, 0x510e, 0x0c41, 0xeece, 0x4153, 0xfeeb, 0xa9f6, 0x04b3, 0x12a4, 0xbf2f, 0x20d1, 0x42f4, 0xe1b1, 0x1b1e, 0x3980, 0xc2b4, 0xcb50, 0x2b74, 0xded0, 0xd835, 0x4e7a, 0x0b46, 0xe555, 0x4015, 0x0517, 0xaa54, 0x0504, 0x1932, 0xbc34, 0x1a77, 0x48b1, 0xe0bb, 0x149b, 0x3ba7, 0xc34a, 0xc481, 0x2bc2, 0xe401, 0xd20e, 0x4f53, 0x1389, 0xe3b7, 0x418b, 0x0a15, 0xa70d, 0x0024, 0x1f9f, 0xbf65, 0x142d, 0x4a81, 0xe0ca, 0x1152, 0x4325, 0xcb03, 0xc18a, 0x2b95, 0xeb45, 0xcf92, 0x4c54, 0x18ad, 0xe08b, 0x3f12, 0x1264, 0xa9fc, 0xfd97, 0x246f, 0xbf86, 0x0ce2, 0x4e7c, 0xe4f3, 0x0c20, 0x44e0, 0xd069, 0xbdcb, 0x2b8e, 0xf32d, 0xcad4, 0x464f, 0x1e76, 0xdf62, 0x3b07, 0x17ea, 0xaafb, 0xf5a0, 0x2835, 0xc7c2, 0x0842, 0x4d2b, 0xe634, 0x03ef, 0x42bc, 0xd7f2, 0xbb73, 0x2662, 0xf892, 0xc8b3, 0x3e30, 0x1f20, 0xdcca, 0x354a, 0x1c6b, 0xaf75, 0xf0f7, 0x2963, 0xc908, 0xfdbf, 0x4c3c, 0xebe5, 0x00e3, 0x44c4, 0xdf15, 0xb9e9, 0x243b, 0x00e9, 0xcb76, 0x3b53, 0x248e, 0xdc27, 0x2fcb, 0x22e5, 0xb66c, 0xec96, 0x2b19, 0xd0ef, 0xf97b, 0x48ae, 0xecc0, 0xf8b4, 0x411d, 0xe769, 0xb9f7, 0x1c41, 0x0022, 0xc369, 0x2ced, 0x23ac, 0xd8eb, 0x2522, 0x232a, 0xb611, 0xe19f, 0x2738, 0xd013, 0xece5, 0x434c, 0xf00e, 0xefcc, 0x3b79, 0xeb32, 0xb19c, 0x135e, 0x04ef, 0xc1b9, 0x27a8, 0x2992, 0xd7b3, 0x1ba5, 0x2481, 0xb8c5, 0xd97d, 0x246f, 0xd113, 0xe45d, 0x4486, 0xf7f7, 0xeb36, 0x395a, 0xf122, 0xaea5, 0x0c28, 0x05eb, 0xbde4, 0x2585, 0x36a2, 0xde67, 0x1b86, 0x2dac, 0xbd03, 0xd2b8, 0x2624, 0xd8b8, 0xe802, 0x521b, 0x0855, 0xefbc, 0x4048, 0xfad2, 0xafe2, 0x0fb1, 0x12b2, 0xc62c, 0x2c2a, 0x43f5, 0xe562, 0x1fcb, 0x3791, 0xc2ac, 0xd4d1, 0x2dfd, 0xde0a, 0xe53f, 0x5578, 0x0f49, 0xf2b6, 0x4609, 0x0105, 0xabf5, 0x09a8, 0x157e, 0xc286, 0x23e7, 0x425f, 0xe36a, 0x1d93, 0x3580, 0xbf80, 0xcaf2, 0x2a04, 0xf16e, 0xd92b, 0x0eaa, 0xf1a7, 0x1ddb, 0x5b52, 0x0665, 0xd2e3, 0x15f8, 0xf606, 0x9d42, 0xdba7, 0xf312, 0xd349, 0x21ed, 0x576a, 0x34e8, 0x2450, 0x2679, 0xdc01, 0xb506, 0xcb0f, 0xa454, 0xccf3, 0x2c13, 0x1673, 0xf8ca, 0x4ff1, 0x63ac, 0xec26, 0xd77c, 0xf1f9, 0xc268, 0xb11a, 0xdfe4, 0x02e7, 0x10f5, 0x3512, 0x19dd, 0x0edc, 0x3568, 0xf6f7, 0xbe10, 0xda93, 0xf4fe, 0xda03, 0xe293, 0x15dd, 0x15f3, 0x1ba5, 0x1521, 0x12e8, 0x23ab, 0x0fc3, 0xdb3e, 0xb671, 0xe960, 0xe13c, 0xc695, 0x1a81, 0x3d23, 0x1c56, 0x190d, 0x4234, 0x1970, 0xd784, 0xd86b, 0xb5e8, 0xc9f3, 0xeb89, 0xe344, 0x17ae, 0x5713, 0x37fc, 0xffe2, 0x36b3, 0x1dfe, 0xb963, 0xbf9c, 0xc9a1, 0xcc7b, 0xe409, 0x08a6, 0x2077, 0x3b4d, 0x3cba, 0x0553, 0x220e, 0x226e, 0xd219, 0xb7ec, 0xcb8b, 0xdf2a, 0xd0c7, 0xf5be, 0x2ff0, 0x42a6, 0x3c24, 0x25ae, 0x2d6d, 0x0d94, 0xde80, 0xb78b, 0xb12b, 0xdf7a, 0xde33, 0x0046, 0x47b1, 0x5170, 0x29c0, 0x2945, 0x3ab5, 0xf08f, 0xc806, 0xc229, 0xbbf4, 0xe40d, 0xf365, 0x0bfe, 0x448d, 0x5cd8, 0x1e52, 0x10ba, 0x3908, 0xefa4, 0xc243, 0xcf89, 0xd02d, 0xde92, 0xf8e0, 0x191e, 0x2f7b, 0x48e6, 0x1e38, 0x1074, 0x3785, 0xf8be, 0xbd1c, 0xc06b, 0xdc36, 0xdb97, 0xe3c0, 0x2042, 0x37c5, 0x36ff, 0x1b73, 0x2064, 0x2c9a, 0xefa2, 0xbf0c, 0xb7f0, 0xe221, 0xe243, 0xd998, 0x2263, 0x4bae, 0x3596, 0x18aa, 0x3763, 0x27d0, 0xdcc6, 0xcacc, 0xc06f, 0xd83d, 0xecfe, 0xeefa, 0x1ffa, 0x5052, 0x393f, 0x0af5, 0x3c9e, 0x316b, 0xd2df, 0xc575, 0xd3c8, 0xddd2, 0xdf98, 0xfbd7, 0x2929, 0x4879, 0x4052, 0x160c, 0x3708, 0x2b31, 0xdac6, 0xc0c3, 0xcfc0, 0xe71d, 0xddec, 0x0145, 0x3847, 0x457c, 0x356b, 0x214a, 0x3a5f, 0x1474, 0xd892, 0xc579, 0xc6a7, 0xe77a, 0xe4dc, 0x00ab, 0x3b89, 0x4eba, 0x290a, 0x16ea, 0x3dc6, 0x0956, 0xcc12, 0xc3bd, 0xc9e9, 0xe4be, 0xe60b, 0x0561, 0x3707, 0x4c82, 0x2444, 0x1406, 0x3a8e, 0xff5b, 0xc494, 0xbf9f, 0xcb26, 0xdfef, 0xe755, 0x1060, 0x334f, 0x40e5, 0x1f87, 0x16b9, 0x33e8, 0xfa6e, 0xc670, 0xb774, 0xcc17, 0xe18f, 0xdd0f, 0x102c, 0x3f0d, 0x4098, 0x1b95, 0x24b2, 0x315a, 0xe9d8, 0xc459, 0xb314, 0xc524, 0xe2a6, 0xe1cf, 0x100a, 0x44af, 0x455c, 0x1551, 0x264f, 0x2ab1, 0xd681, 0xb90c, 0xb4d6, 0xc68d, 0xddac, 0xef74, 0x1f57, 0x4357, 0x4192, 0x0e60, 0x1bcb, 0x20fd, 0xd477, 0xb435, 0xb3e3, 0xcdc3, 0xd9c4, 0xef97, 0x2384, 0x3b60, 0x34c9, 0x119d, 0x1f15, 0x0fb3, 0xd15d, 0xb30d, 0xa9e3, 0xd431, 0xdc02, 0xe98a, 0x2987, 0x4204, 0x290c, 0x1181, 0x2d0c, 0x0800, 0xcb55, 0xb8f5, 0xaaa6, 0xd49f, 0xe57c, 0xf063, 0x281c, 0x4c65, 0x2d19, 0x0cd2, 0x2ddb, 0xfefe, 0xc171, 0xbd4c, 0xb7c2, 0xd4c5, 0xe6f3, 0x0040, 0x2b86, 0x4b6d, 0x2ed1, 0x0ce3, 0x2d97, 0x01f9, 0xc2ad, 0xb8fc, 0xc53e, 0xe1cf, 0xea35, 0x0eb0, 0x38b8, 0x4a3b, 0x2a1e, 0x1457, 0x2a1e, 0xfbca, 0xcdf1, 0xbc93, 0xcc0b, 0xec27, 0xeb05, 0x144b, 0x4443, 0x496d, 0x2233, 0x2180, 0x30b2, 0xf03c, 0xcced, 0xbf0d, 0xcc55, 0xeec3, 0xf367, 0x186f, 0x45cd, 0x4e7d, 0x215a, 0x2485, 0x3122, 0xe7a8, 0xc40a, 0xbf85, 0xd4dd, 0xebe8, 0xf32b, 0x2121, 0x49bb, 0x4c61, 0x1af5, 0x1f88, 0x2c32, 0xe8c5, 0xc512, 0xc0b7, 0xdbf9, 0xe9ea, 0xf2f4, 0x2584, 0x43e2, 0x3e1b, 0x19cf, 0x28d2, 0x2442, 0xe27b, 0xc589, 0xbe8a, 0xdddc, 0xe567, 0xed4e, 0x27f2, 0x48cd, 0x3505, 0x0e88, 0x2cd5, 0x207d, 0xda54, 0xc1cf, 0xb8c1, 0xd925, 0xe569, 0xefd0, 0x2723, 0x4dd1, 0x38b2, 0x0de5, 0x2d90, 0x155b, 0xca06, 0xbab6, 0xbf37, 0xdd46, 0xe3fd, 0xfb50, 0x2e5d, 0x487b, 0x343e, 0x0abe, 0x25e9, 0x0f65, 0xcb83, 0xb474, 0xbc50, 0xe2ab, 0xe1df, 0xfd3e, 0x3672, 0x458b, 0x294e, 0x10fd, 0x2afa, 0x027f, 0xcae8, 0xb95b, 0xbc6f, 0xe536, 0xe3af, 0xfd1c, 0x3b18, 0x4cb1, 0x23ff, 0x13eb, 0x3353, 0xfb34, 0xc4aa, 0xb71a, 0xb9f2, 0xe1d7, 0xe97f, 0x058d, 0x3a0f, 0x4fcd, 0x2408, 0x11a3, 0x2fb9, 0xf271, 0xbb7f, 0xb447, 0xc317, 0xde44, 0xe56a, 0x110a, 0x3ccc, 0x494a, 0x1f80, 0x11af, 0x26a1, 0xeb09, 0xbcd0, 0xaf90, 0xc8d4, 0xe63f, 0xe47d, 0x1435, 0x3f4f, 0x3fbe, 0x17c7, 0x1a4f, 0x2393, 0xe191, 0xbfa1, 0xb0e4, 0xc7c9, 0xe2d9, 0xe363, 0x1625, 0x4320, 0x3da9, 0x11c4, 0x1e02, 0x1d1b, 0xd6be, 0xbe96, 0xb123, 0xc8a4, 0xe6ce, 0xef2e, 0x1c03, 0x4584, 0x3fd1, 0x1006, 0x20d8, 0x197b, 0xcf64, 0xb99e, 0xb693, 0xd396, 0xe8eb, 0xfb01, 0x2aca, 0x4b38, 0x3f87, 0x0de0, 0x1f2f, 0x1503, 0xd574, 0xba46, 0xb72d, 0xf07a, 0xfa16, 0xf608, 0x29c0, 0x3a7e, 0x42a7, 0x43ac, 0x2717, 0xec6f, 0xd732, 0xc1ac, 0xa146, 0xef37, 0x122b, 0x05c1, 0x5c67, 0x8e8c, 0x3d5e, 0x0043, 0x00d0, 0xb9ef, 0xa38d, 0xc8dd, 0xc921, 0x15c9, 0x5fe3, 0x531a, 0x477d, 0x5852, 0x1b9f, 0xb930, 0xd1b6, 0xde60, 0xbcce, 0xe7f7, 0x16b1, 0x2aeb, 0x4605, 0x3592, 0xfe8c, 0x0c1d, 0x1b24, 0xd084, 0xd667, 0x2736, 0x06f7, 0xdfa7, 0x1976, 0x0df9, 0xc5e8, 0x032b, 0x324e, 0xea0e, 0x1ab4, 0x46e4, 0xf72e, 0x0369, 0x0ef3, 0xbe35, 0xbd17, 0x10fd, 0xfb35, 0xeb3f, 0x4e43, 0x2da4, 0xfe31, 0x2f50, 0xf64c, 0xafd6, 0xe267, 0xfd01, 0xca77, 0x1087, 0x48c1, 0xfcf4, 0x1bb0, 0x31af, 0xd234, 0xc0cb, 0x054e, 0xec6b, 0xce29, 0x29db, 0x1bb4, 0xf0fd, 0x3608, 0x12eb, 0xbb40, 0xeaa8, 0x190f, 0xce00, 0xed59, 0x39ef, 0xf1f0, 0xfb2a, 0x3535, 0xe3b3, 0xbf33, 0x1a9b, 0x013b, 0xc2ab, 0x2976, 0x21e0, 0xd3d8, 0x1ca6, 0x14ae, 0xb242, 0xe538, 0x2958, 0xd98c, 0xf279, 0x4106, 0xf13e, 0xf68b, 0x3379, 0xe023, 0xb4a8, 0x104b, 0x0685, 0xcca4, 0x2e61, 0x2d96, 0xe2b8, 0x26ac, 0x2510, 0xc114, 0xd9e5, 0x1f91, 0xdbc9, 0xe515, 0x40bd, 0x0693, 0xff44, 0x3c5e, 0xf664, 0xb8dc, 0x0b37, 0x1314, 0xc29c, 0x161f, 0x3582, 0xe32e, 0x17c0, 0x2de6, 0xc7c1, 0xcfeb, 0x23a6, 0xe644, 0xe65f, 0x4256, 0xf765, 0xe698, 0x4148, 0xfbe1, 0xa6b4, 0x03fa, 0x1c92, 0xcb85, 0x1a54, 0x37af, 0xe830, 0x1b0b, 0x255d, 0xc13f, 0xd3d9, 0x205e, 0xde69, 0xe2ab, 0x48d5, 0x0931, 0xee2f, 0x3d79, 0x0658, 0xb36c, 0xf59e, 0x11f4, 0xd042, 0x110b, 0x2e1b, 0xe763, 0x2269, 0x3bda, 0xcefb, 0xd37b, 0x2d7f, 0xe9d7, 0xd48e, 0x3fd2, 0x0e86, 0xea62, 0x3cd5, 0x11e0, 0xc1dc, 0x08e0, 0x1f68, 0xd3f1, 0x1fc8, 0x3da6, 0xe12f, 0x1d62, 0x4060, 0xccb6, 0xd211, 0x316f, 0xf370, 0xe20e, 0x4657, 0x1280, 0xf30a, 0x3df0, 0x07fc, 0xb956, 0x023e, 0x1978, 0xcbba, 0x137d, 0x3ff7, 0xecbc, 0x1698, 0x3f29, 0xdf9f, 0xcc1c, 0x1bdc, 0xef17, 0xd3da, 0x346b, 0x1296, 0xeb25, 0x3885, 0x190f, 0xbf13, 0xfb71, 0x1df2, 0xc509, 0xffa2, 0x3a66, 0xe5fd, 0x04f6, 0x36be, 0xda99, 0xc67e, 0x1fc2, 0xef95, 0xcfa8, 0x39df, 0x0f1a, 0xd986, 0x2d7b, 0x0e88, 0xb2a2, 0xf40f, 0x1bd3, 0xc95c, 0x0511, 0x408d, 0xec48, 0x03d2, 0x3281, 0xd7a0, 0xb9a0, 0x13ab, 0xf02d, 0xc92c, 0x3af6, 0x26c0, 0xe5f8, 0x2de7, 0x18b9, 0xafd8, 0xddbf, 0x15bc, 0xc4d3, 0xf6dc, 0x4b73, 0xf89f, 0x018a, 0x3c4e, 0xdf11, 0xb20d, 0x12d7, 0xf511, 0xbf7e, 0x33aa, 0x286f, 0xe309, 0x3107, 0x1f74, 0xb1c3, 0xe10f, 0x1fd3, 0xc7d4, 0xef6e, 0x4b78, 0xf32f, 0xf8e5, 0x43cb, 0xe7da, 0xaf46, 0x115a, 0xfeb2, 0xbf7a, 0x2e9a, 0x2ed7, 0xde2f, 0x2807, 0x259c, 0xb09f, 0xd3d4, 0x2606, 0xd544, 0xeb3d, 0x5107, 0xfecf, 0xf63f, 0x4304, 0xedfe, 0xae0d, 0x0d7f, 0x0957, 0xc47d, 0x2f62, 0x3b51, 0xdfea, 0x2a01, 0x3390, 0xb825, 0xd3e9, 0x29f1, 0xd82e, 0xe2e3, 0x509a, 0x061c, 0xf530, 0x48b1, 0xf740, 0xabeb, 0x0d93, 0x0ed4, 0xbed0, 0x274e, 0x3e3b, 0xddc2, 0x2168, 0x35a1, 0xbbb0, 0xcedb, 0x2b94, 0xdd5b, 0xdd2d, 0x4e6a, 0x068d, 0xe741, 0x3eef, 0xfe34, 0xad12, 0x0bb7, 0x1a73, 0xbea5, 0x1c31, 0x4269, 0xdc1a, 0x1611, 0x37d6, 0xc048, 0xcaa3, 0x2f7e, 0xe59c, 0xd94c, 0x4ed8, 0x0af6, 0xe225, 0x3c84, 0xfd49, 0xa4b2, 0x048d, 0x1ed5, 0xc496, 0x1caa, 0x4641, 0xddd4, 0x1578, 0x37dc, 0xc13b, 0xcab7, 0x30dc, 0xfec0, 0xd462, 0x1387, 0x07dd, 0x14c1, 0x4b92, 0x0d74, 0xda49, 0x12de, 0x02fe, 0xb8fe, 0xeaae, 0x0363, 0xdab0, 0x23b0, 0x68fb, 0x3681, 0x1351, 0x29fc, 0xf22e, 0xb781, 0xd225, 0xc11d, 0xd7d8, 0x354d, 0x26b8, 0x09af, 0x60fa, 0x5f8c, 0xe302, 0xde80, 0xff6a, 0xbb95, 0xafec, 0x029f, 0x161d, 0x0fee, 0x3924, 0x2b6c, 0x1ed5, 0x24fe, 0xec7b, 0xc1fe, 0xe22b, 0xfbcd, 0xdc4d, 0xf3f7, 0x210f, 0x1d01, 0x1305, 0x1342, 0x1f6c, 0x0852, 0xfea5, 0xdd42, 0xc083, 0xf243, 0xde95, 0xd818, 0x23f7, 0x3eab, 0x0891, 0x1381, 0x52fd, 0xff10, 0xc983, 0xe091, 0xc3b8, 0xcafc, 0xe7d7, 0xfc8d, 0x2043, 0x559d, 0x2c2e, 0x0418, 0x4485, 0x0b4c, 0xb4e5, 0xc68e, 0xddbf, 0xd0b6, 0xdc81, 0x1e4b, 0x2d10, 0x365b, 0x2c50, 0x170a, 0x303e, 0x0a60, 0xcc89, 0xb88a, 0xdbc7, 0xe3e7, 0xcdd2, 0x0b38, 0x3c7e, 0x392b, 0x254c, 0x3272, 0x2fc9, 0xf0ee, 0xd4d8, 0xb5b4, 0xc03b, 0xdef0, 0xd8e9, 0x0edc, 0x533e, 0x46e4, 0x0fc4, 0x358a, 0x34b8, 0xd1c3, 0xbf29, 0xbb64, 0xbeea, 0xdb1c, 0xf31b, 0x17f1, 0x44fa, 0x4bfb, 0x0a36, 0x1fe2, 0x2ce9, 0xcf0d, 0xb605, 0xc6c6, 0xcc96, 0xcf30, 0xf9cd, 0x25fb, 0x36d1, 0x4086, 0x1499, 0x21d8, 0x287f, 0xde77, 0xb0fd, 0xba6d, 0xe0f5, 0xd3e4, 0xee77, 0x3561, 0x4077, 0x2baa, 0x1d38, 0x3753, 0x1587, 0xd2e2, 0xb252, 0xb44b, 0xe5a7, 0xdbb5, 0xe778, 0x3790, 0x55cb, 0x234e, 0x10ab, 0x42e9, 0x083e, 0xc15a, 0xc2a9, 0xbe30, 0xd7d1, 0xe76a, 0xfa22, 0x2b37, 0x53cb, 0x29a6, 0x0950, 0x4086, 0x0f68, 0xbba0, 0xb824, 0xcc9c, 0xd743, 0xd665, 0x06ae, 0x3597, 0x44f1, 0x2854, 0x19d4, 0x3395, 0xfe8f, 0xc1b9, 0xad2d, 0xc39d, 0xde05, 0xd850, 0x0bf2, 0x4266, 0x457f, 0x1d4b, 0x2284, 0x337f, 0xe442, 0xbc43, 0xb8ba, 0xc33a, 0xe0e4, 0xe8f8, 0x10b5, 0x4262, 0x4afc, 0x1744, 0x1d2b, 0x3125, 0xe2b5, 0xbcb6, 0xbdea, 0xccfd, 0xdfe5, 0xefed, 0x1bae, 0x3f5e, 0x451d, 0x167c, 0x1ea7, 0x2848, 0xdf70, 0xbb35, 0xbbfc, 0xd959, 0xe266, 0xec2b, 0x20e3, 0x435c, 0x3878, 0x0fee, 0x25e8, 0x1ba1, 0xdaf0, 0xc061, 0xb76f, 0xdd9c, 0xe727, 0xece4, 0x247e, 0x48ee, 0x303d, 0x099a, 0x320b, 0x19b9, 0xd0b8, 0xc508, 0xbe20, 0xd52c, 0xe430, 0xf5f1, 0x21d1, 0x4aae, 0x3670, 0x0bc4, 0x349a, 0x16c6, 0xc9e1, 0xbb8f, 0xc44e, 0xdbed, 0xde26, 0x03b2, 0x34c9, 0x4689, 0x30a8, 0x17ea, 0x33bd, 0x0b87, 0xcd79, 0xb9b9, 0xc3c1, 0xe227, 0xdffc, 0x07ae, 0x3deb, 0x4732, 0x25e8, 0x1ef9, 0x370f, 0xfb29, 0xcc78, 0xbf32, 0xc5c0, 0xe807, 0xe571, 0x074b, 0x4121, 0x4902, 0x1968, 0x206c, 0x3da5, 0xf467, 0xc9c7, 0xc240, 0xc6d8, 0xe2b1, 0xeca9, 0x0f7d, 0x3a80, 0x4ac1, 0x1bda, 0x1cdc, 0x3836, 0xee35, 0xc32e, 0xc0a2, 0xce3e, 0xdfd7, 0xe9c8, 0x162c, 0x3eb5, 0x48b0, 0x1a61, 0x1e8f, 0x2cf5, 0xe5c6, 0xbb80, 0xb378, 0xd228, 0xe3dd, 0xeba5, 0x2266, 0x46f5, 0x3e1f, 0x13fa, 0x26ea, 0x21ec, 0xd925, 0xbdc7, 0xb66d, 0xd76b, 0xe81e, 0xf025, 0x269d, 0x4d69, 0x3d40, 0x1027, 0x2c58, 0x1cc9, 0xd265, 0xbfd4, 0xbabe, 0xd919, 0xe822, 0xf931, 0x2bc9, 0x4c69, 0x3d20, 0x158d, 0x31ca, 0x1821, 0xce8a, 0xb8af, 0xba0f, 0xdfb6, 0xe677, 0xfd3b, 0x385e, 0x53d9, 0x3764, 0x14a8, 0x30af, 0x0a51, 0xcb95, 0xbad7, 0xbc48, 0xe366, 0xea7e, 0x06cf, 0x3f08, 0x53c7, 0x2fe0, 0x189d, 0x383f, 0x00fd, 0xc5f3, 0xbf0d, 0xc38f, 0xe4a3, 0xecee, 0x0ef5, 0x432c, 0x54a7, 0x2a15, 0x190d, 0x3675, 0xf7bc, 0xc3e0, 0xbc22, 0xc381, 0xe210, 0xec59, 0x15ed, 0x4300, 0x4fd8, 0x269c, 0x1bda, 0x324a, 0xed57, 0xbb9c, 0xb705, 0xceb8, 0xeb30, 0xed72, 0x1baa, 0x48ad, 0x4bd3, 0x1fde, 0x1ea9, 0x2826, 0xe505, 0xc2b3, 0xb577, 0xceec, 0xeeb9, 0xef73, 0x1fd5, 0x4c99, 0x41f7, 0x12c7, 0x24ad, 0x22eb, 0xd504, 0xbfe3, 0xba2a, 0xd063, 0xea6f, 0xf037, 0x1c9c, 0x4acf, 0x430c, 0x0b68, 0x200d, 0x1c9e, 0xcce4, 0xb9ad, 0xbc29, 0xd211, 0xe475, 0xfc21, 0x2910, 0x443b, 0x3a83, 0x0ef1, 0x2295, 0x15ac, 0xd00d, 0xb774, 0xbaff, 0xded3, 0xe41e, 0xf945, 0x331e, 0x49b7, 0x3276, 0x128d, 0x28c7, 0x08f2, 0xce8e, 0xbb2e, 0xb907, 0xe4c0, 0xe9f8, 0xf98a, 0x3323, 0x4a75, 0x2718, 0x0ddc, 0x3369, 0x0795, 0xc936, 0xc192, 0xc3cc, 0xe2b9, 0xe583, 0xfce9, 0x312f, 0x4951, 0x266f, 0x0ffe, 0x3698, 0x0679, 0xca63, 0xc301, 0xc844, 0xde4c, 0xe26e, 0x076e, 0x3283, 0x4507, 0x259a, 0x11af, 0x30ff, 0xfd1c, 0xc1b2, 0xb384, 0xc924, 0xe414, 0xde8f, 0x0781, 0x295f, 0x51b4, 0x5b09, 0x17c9, 0xf17b, 0xd9cd, 0xb11a, 0x8396, 0xbd98, 0x073f, 0x0598, 0x5258, 0x7bf8, 0x3dd3, 0x096d, 0xe7f8, 0xa966, 0x9271, 0xc3c7, 0xb173, 0xf5d9, 0x6db2, 0x3b89, 0x2231, 0x4aaf, 0x1c3b, 0xc115, 0xcb06, 0xd460, 0xbb98, 0x03f6, 0xf9d7, 0xecaf, 0x4aa5, 0x27cf, 0xcf8c, 0x0764, 0x3489, 0xd9cb, 0xf31b, 0x39b5, 0xebc3, 0xeb7f, 0x1192, 0xceee, 0xbd72, 0x16f9, 0x1b5a, 0xf888, 0x4a44, 0x34a8, 0xedd8, 0x18bb, 0xf8d6, 0xa74c, 0xd19c, 0x139c, 0xeaf7, 0x0d0b, 0x5317, 0x0e81, 0x0c44, 0x35bd, 0xe010, 0xb51d, 0x075b, 0xfc77, 0xc9ae, 0x2b95, 0x35a1, 0xf0e8, 0x2c61, 0x2481, 0xc370, 0xe826, 0x20b5, 0xd95a, 0xf832, 0x43e0, 0xf261, 0xf7ef, 0x414e, 0xf14b, 0xbf9e, 0x1c6c, 0x1380, 0xd3d1, 0x2650, 0x1f52, 0xd592, 0x1ddb, 0x2414, 0xc347, 0xebd1, 0x3e70, 0xf240, 0xeb89, 0x3d66, 0xf738, 0xe57b, 0x2fe8, 0xf22d, 0xbd68, 0x1e7b, 0x2466, 0xd858, 0x2613, 0x3122, 0xdc86, 0x16b9, 0x277b, 0xc324, 0xdb13, 0x2c78, 0xe8ab, 0xed0b, 0x49bb, 0x0342, 0xf02a, 0x3b6c, 0xf7d9, 0xb9c6, 0x0fd8, 0x1192, 0xc763, 0x12e5, 0x2738, 0xe26c, 0x1a89, 0x2a72, 0xcd72, 0xdca7, 0x27a9, 0xe962, 0xd98a, 0x271e, 0xf948, 0xe783, 0x29f0, 0x000e, 0xc137, 0x064c, 0x17e6, 0xcd48, 0x0efb, 0x329b, 0xdc50, 0xf9d6, 0x28fd, 0xd866, 0xc34b, 0x13df, 0xefa3, 0xdcbf, 0x3578, 0x09a7, 0xe33f, 0x2c3f, 0x02a6, 0xaa76, 0xf3eb, 0x1870, 0xc21d, 0x029e, 0x3d07, 0xedbb, 0x0a92, 0x33dc, 0xd94f, 0xc985, 0x15a5, 0xdf1c, 0xd3f5, 0x3f5e, 0x0fca, 0xe50f, 0x3b04, 0x1a3d, 0xb99b, 0xf6d1, 0x1c75, 0xcc21, 0x0987, 0x3e95, 0xed51, 0x0dcf, 0x3b32, 0xd980, 0xc6f7, 0x280e, 0xf587, 0xd3c2, 0x4871, 0x233c, 0xe02f, 0x3039, 0x183d, 0xaecf, 0xf137, 0x2776, 0xcc66, 0x0bf0, 0x5162, 0xeddf, 0x088c, 0x4536, 0xd457, 0xb205, 0x2315, 0xf51a, 0xc60d, 0x4281, 0x2682, 0xe5d9, 0x3aad, 0x1cab, 0xb02d, 0xf294, 0x20af, 0xbecb, 0x0084, 0x4c16, 0xeaf2, 0x054e, 0x449f, 0xdf02, 0xbd48, 0x25bf, 0xfda9, 0xcb15, 0x3a93, 0x1e9b, 0xddd4, 0x3408, 0x1f70, 0xb333, 0xf3df, 0x32ab, 0xd133, 0x014e, 0x52b2, 0xf138, 0xfe00, 0x4260, 0xe1f2, 0xbbac, 0x28bf, 0x0404, 0xcc81, 0x4649, 0x2e56, 0xdee8, 0x3677, 0x23ef, 0xabc0, 0xea62, 0x3159, 0xcf59, 0xfdcf, 0x575a, 0xf403, 0xfe40, 0x4759, 0xe094, 0xb225, 0x1ffa, 0xfefc, 0xc26f, 0x3a61, 0x2be1, 0xdb44, 0x2efe, 0x2504, 0xadcb, 0xe074, 0x2713, 0xc6d3, 0xecc2, 0x48d6, 0xea4d, 0xf2ec, 0x43a0, 0xe1fc, 0xaa5f, 0x1825, 0xffd7, 0xba38, 0x2bdb, 0x24a3, 0xce10, 0x1cd8, 0x1cfc, 0xab2e, 0xdc4d, 0x276d, 0xca22, 0xeb01, 0x4a08, 0xeb0e, 0xe94c, 0x3cd7, 0xe45f, 0xa6c6, 0x0f8c, 0x066f, 0xc2d2, 0x2a01, 0x2aea, 0xd9bf, 0x251a, 0x2933, 0xb64d, 0xd9b5, 0x26a1, 0xd2ba, 0xe822, 0x4af1, 0xfec7, 0xf323, 0x3fdf, 0xf78e, 0xb4c1, 0x0f7f, 0x0e1c, 0xc7ce, 0x25fb, 0x3129, 0xdeb5, 0x2268, 0x3385, 0xc266, 0xd9b6, 0x2efc, 0xddb0, 0xe00f, 0x45ac, 0x0168, 0xea8d, 0x3cd9, 0xfeda, 0xb603, 0x13c5, 0x166b, 0xc192, 0x1f5a, 0x3804, 0xda94, 0x15a3, 0x35b3, 0xc729, 0xd3ae, 0x2e68, 0xe359, 0xde70, 0x4764, 0x0725, 0xe6b1, 0x3882, 0xfed4, 0xad23, 0x0819, 0x16c2, 0xc15b, 0x1c91, 0x4358, 0xe49c, 0x1162, 0x35d1, 0xc8f8, 0xc74f, 0x2676, 0xe0e9, 0xd0d7, 0x4b09, 0x1cea, 0xedea, 0x3f3b, 0x11f4, 0xb09a, 0xfc73, 0x177b, 0xba40, 0x109f, 0x4fcb, 0xf285, 0x1d0f, 0x3dc2, 0xc588, 0xc98d, 0x329a, 0xfd8a, 0xcc33, 0x1573, 0x1810, 0x1532, 0x434e, 0x102d, 0xd555, 0x08d4, 0x0011, 0xb77c, 0xec37, 0x098c, 0xd4fc, 0x2033, 0x7926, 0x32be, 0xfe95, 0x28ab, 0xef9c, 0xa428, 0xcffc, 0xcbdf, 0xd07c, 0x3681, 0x2f87, 0x0680, 0x626e, 0x5e9c, 0xd624, 0xd9e4, 0x080a, 0xadfe, 0xa2f5, 0x12af, 0x142c, 0xffde, 0x3703, 0x3570, 0x269e, 0x24fb, 0xe8a1, 0xb7ec, 0xe753, 0xf82a, 0xce4d, 0x001a, 0x2e98, 0x1f84, 0x0eb8, 0x1beb, 0x2603, 0xfcff, 0xfd98, 0xd8c0, 0xc719, 0xfc52, 0xddd2, 0xe3ec, 0x2ee0, 0x4393, 0x042b, 0x1929, 0x569a, 0xef83, 0xc35d, 0xd9e5, 0xc6ce, 0xd1e0, 0xed86, 0x0b2a, 0x23b2, 0x504c, 0x20ad, 0x029d, 0x3b72, 0xf5a5, 0xad6b, 0xbe54, 0xddfc, 0xd162, 0xddcd, 0x2952, 0x324b, 0x3156, 0x1d3f, 0x12f5, 0x235b, 0xf27f, 0xc001, 0xb250, 0xdfdd, 0xe3f3, 0xd455, 0x14e4, 0x3c06, 0x3326, 0x1a60, 0x30e7, 0x24a0, 0xe2c3, 0xcd08, 0xb21c, 0xc75c, 0xdc66, 0xe088, 0x1e09, 0x54ef, 0x4197, 0x0dca, 0x356f, 0x22ce, 0xcaf2, 0xc0ce, 0xbc3d, 0xcfda, 0xe59b, 0xfe5c, 0x27b1, 0x4caa, 0x45a1, 0x0add, 0x274f, 0x1c6c, 0xcde6, 0xc343, 0xd011, 0xdf48, 0xe021, 0x0b0c, 0x335a, 0x3c8e, 0x345d, 0x0d86, 0x278e, 0x1b8f, 0xdc12, 0xbc28, 0xc6ff, 0xead3, 0xdba0, 0xfdee, 0x39b8, 0x3f03, 0x2143, 0x1858, 0x376b, 0x021b, 0xcaa8, 0xbb59, 0xc6f6, 0xef67, 0xe041, 0xf9ba, 0x3cd7, 0x4cfd, 0x168d, 0x1037, 0x3fec, 0xf71d, 0xbed3, 0xc8d6, 0xcbc6, 0xdd8f, 0xea8c, 0x09b1, 0x2e92, 0x4701, 0x1829, 0x091c, 0x3ad7, 0xfd4b, 0xb999, 0xbe68, 0xdc50, 0xdc39, 0xd663, 0x1009, 0x330e, 0x37f3, 0x1ad3, 0x1cca, 0x3476, 0xf66a, 0xc5e8, 0xbb6f, 0xd5e8, 0xe008, 0xd5ea, 0x10b5, 0x3f63, 0x3725, 0x1102, 0x2911, 0x3855, 0xe9cb, 0xc610, 0xc44b, 0xd547, 0xdd89, 0xe4aa, 0x195d, 0x4084, 0x3d9b, 0x10ab, 0x2a1f, 0x3667, 0xe38c, 0xc1a0, 0xc4c5, 0xdd94, 0xe21b, 0xe99c, 0x1f49, 0x4312, 0x3b69, 0x0f14, 0x2b3d, 0x2eaa, 0xdeab, 0xc00a, 0xc634, 0xe225, 0xe0e3, 0xf311, 0x2b9a, 0x44fd, 0x3881, 0x11ee, 0x2f2a, 0x2428, 0xdc87, 0xc347, 0xc2d0, 0xe6e0, 0xe5b0, 0xf196, 0x2d4e, 0x4a97, 0x3366, 0x1388, 0x3ae0, 0x1bf8, 0xd058, 0xc212, 0xc09b, 0xdbf3, 0xe25c, 0xfa1f, 0x3093, 0x4e94, 0x31f0, 0x12fe, 0x3bde, 0x11ad, 0xc841, 0xb8bd, 0xbe0b, 0xdd25, 0xdd7e, 0x0138, 0x3ac9, 0x4ccb, 0x2ba2, 0x1359, 0x3033, 0xfbc6, 0xc14d, 0xb543, 0xbd7e, 0xdcf8, 0xde2b, 0x0754, 0x388b, 0x409a, 0x1e0d, 0x134a, 0x2ba8, 0xeee4, 0xbe5b, 0xafaf, 0xbb90, 0xe059, 0xde74, 0x0736, 0x3d1c, 0x4310, 0x16f1, 0x1686, 0x2f2a, 0xe9de, 0xbe17, 0xb446, 0xc0ca, 0xdd27, 0xe1a0, 0x0ccd, 0x3c13, 0x4661, 0x1949, 0x196a, 0x2a50, 0xdf8d, 0xb6a7, 0xb25a, 0xc8aa, 0xdf0e, 0xe6dc, 0x19c8, 0x411d, 0x423f, 0x15db, 0x1a0d, 0x2316, 0xdf69, 0xba97, 0xb2a9, 0xd092, 0xe29a, 0xebf2, 0x2556, 0x4a3b, 0x3fb1, 0x16cb, 0x2603, 0x1c1b, 0xd67d, 0xbcf3, 0xb765, 0xdad1, 0xea4b, 0xf176, 0x27e4, 0x4d31, 0x3b4c, 0x0fab, 0x2ad5, 0x1a4d, 0xd10b, 0xbc49, 0xba78, 0xda1f, 0xe903, 0xffda, 0x308c, 0x4a2f, 0x38ce, 0x11cc, 0x299c, 0x105c, 0xcdc3, 0xba31, 0xc03e, 0xe616, 0xe849, 0xfec7, 0x37e1, 0x4e98, 0x3198, 0x12d8, 0x2aeb, 0x03e5, 0xcb29, 0xbccb, 0xc232, 0xe734, 0xeb9c, 0x07ed, 0x3d12, 0x4b48, 0x2515, 0x14e8, 0x330c, 0xfd19, 0xc86d, 0xc241, 0xca17, 0xe64b, 0xe918, 0x09ed, 0x3ba3, 0x4eee, 0x25e2, 0x167a, 0x38a6, 0xffcf, 0xcb0e, 0xc615, 0xd055, 0xe3d3, 0xeafc, 0x1602, 0x3e86, 0x49c2, 0x257e, 0x2166, 0x3bcd, 0xfc55, 0xc4ad, 0xbb87, 0xd6e3, 0xe7a1, 0xe64f, 0x1ddd, 0x4682, 0x4516, 0x1dee, 0x1dc5, 0x2b0d, 0xed86, 0xc590, 0xb97d, 0xd84f, 0xec06, 0xe368, 0x1c7f, 0x4cee, 0x3f07, 0x13c3, 0x289d, 0x28fb, 0xdcf0, 0xc5b7, 0xbdb7, 0xd4a7, 0xec46, 0xecd0, 0x1bda, 0x48cc, 0x4019, 0x0cd7, 0x23a7, 0x2698, 0xd5be, 0xbc3e, 0xb90e, 0xcc6c, 0xddf3, 0xf12b, 0x24f1, 0x4448, 0x3b5c, 0x118e, 0x2441, 0x1c2b, 0xd270, 0xb368, 0xb6c7, 0xdd46, 0xdf51, 0xefbb, 0x3138, 0x49d2, 0x3667, 0x1864, 0x2b86, 0x1073, 0xd35e, 0xbbf4, 0xb47a, 0xdfb4, 0xe8bb, 0xf6b2, 0x353a, 0x4fd4, 0x2e9f, 0x12a8, 0x323d, 0x07c8, 0xcb04, 0xc1fa, 0xbd57, 0xdf17, 0xe6e8, 0xfa82, 0x3052, 0x4c63, 0x2d83, 0x12bf, 0x3366, 0x0318, 0xc6dd, 0xbd85, 0xbc4f, 0xd9e1, 0xe604, 0x0814, 0x34df, 0x4a09, 0x2d9d, 0x148f, 0x2e79, 0xfba1, 0xc12c, 0xb277, 0xbf95, 0xdeb7, 0xe211, 0x10bc, 0x423c, 0x4956, 0x24f7, 0x1571, 0x2434, 0xebbb, 0xc333, 0xb587, 0xc733, 0xedc0, 0xebba, 0x0854, 0x3f2e, 0x6f7e, 0x4a81, 0x0e5e, 0x03fe, 0xcb43, 0xa313, 0xa8c3, 0xd5fe, 0x0fe0, 0x3ce3, 0x6922, 0x5cb3, 0x4541, 0x10b8, 0xc5c1, 0xb7c8, 0xca44, 0xca38, 0xd7f7, 0x38e7, 0x4e53, 0x1cb5, 0x3dfb, 0x3d19, 0x06ab, 0xeda0, 0xe9ef, 0xd83d, 0xf9bf, 0x0ebe, 0xca2a, 0x0a79, 0x510e, 0xf01d, 0xe7eb, 0x3be6, 0x1a2e, 0xf989, 0x353e, 0x099c, 0xe538, 0x16d7, 0xd697, 0xa93c, 0x0407, 0x1bee, 0xf75f, 0x46c6, 0x50e3, 0xf430, 0x1813, 0x169b, 0xaf5d, 0xc57c, 0x0fb5, 0xe638, 0xf7e9, 0x459c, 0x122e, 0x0654, 0x352e, 0xfc93, 0xc262, 0xf99c, 0x072c, 0xc8f1, 0x0bf2, 0x32cd, 0xf85b, 0x1790, 0x25c1, 0xde96, 0xd882, 0x18ea, 0xe834, 0xd77c, 0x3995, 0x1231, 0xeab1, 0x28e3, 0x0cfc, 0xc5ef, 0xf7bd, 0x18f1, 0xd03e, 0x057e, 0x320a, 0xe5e4, 0x07c7, 0x2d5d, 0xd88a, 0xc884, 0x2072, 0xfd6c, 0xd3d0, 0x2a59, 0x1066, 0xe564, 0x22a2, 0x047a, 0xb2ee, 0xeaad, 0x1c28, 0xcc6c, 0xf7e5, 0x3c36, 0xee88, 0xfbfb, 0x3085, 0xddf6, 0xb28a, 0x0aaf, 0xf456, 0xbc45, 0x223a, 0x21ed, 0xe31c, 0x2214, 0x1882, 0xb51a, 0xdbdc, 0x18ba, 0xc1ce, 0xe1c3, 0x397c, 0xed39, 0xf426, 0x3690, 0xe68c, 0xb498, 0x0e83, 0x00c5, 0xc494, 0x1ef7, 0x1b31, 0xdc33, 0x1f84, 0x1b7f, 0xb9c1, 0xdc07, 0x2246, 0xd5fb, 0xeaf7, 0x4a41, 0x042a, 0xed8c, 0x29a9, 0xf4c4, 0xbbf5, 0xffbd, 0x02b3, 0xd089, 0x2a98, 0x349a, 0xe5f4, 0x231d, 0x3682, 0xc042, 0xc757, 0x28ee, 0xe56b, 0xda47, 0x3eac, 0x0d7c, 0xfc17, 0x4512, 0x05d1, 0xbb63, 0x0fc8, 0x0da5, 0xb98f, 0x1ecc, 0x3aea, 0xdbbd, 0x1bd6, 0x4041, 0xd007, 0xd35e, 0x2aaf, 0xea38, 0xe711, 0x3e4a, 0xfa47, 0xef65, 0x3f02, 0xf730, 0xae98, 0x0fae, 0x1e19, 0xc953, 0x1ea3, 0x3db2, 0xe20d, 0x1043, 0x2d87, 0xc8ab, 0xca8a, 0x2270, 0xe769, 0xe021, 0x4751, 0x0a42, 0xed5b, 0x468e, 0x0a0e, 0xa823, 0xfc1e, 0x19ce, 0xc19e, 0x0fd8, 0x3c33, 0xe854, 0x1d91, 0x3f3f, 0xd03c, 0xd290, 0x2d60, 0xe292, 0xd443, 0x4229, 0x0590, 0xe446, 0x3c78, 0x0d2e, 0xbba0, 0x0b10, 0x1fdc, 0xccc6, 0x142f, 0x3174, 0xdc18, 0x1061, 0x371b, 0xd368, 0xd200, 0x2d59, 0xf1a5, 0xdc23, 0x3edd, 0x0fb6, 0xe812, 0x2f6f, 0x0a77, 0xb941, 0xfe00, 0x1d36, 0xcc9c, 0x11f2, 0x404a, 0xe70a, 0x0abc, 0x3965, 0xd3be, 0xbed2, 0x1fe7, 0xee09, 0xd03e, 0x3f07, 0x1799, 0xe33b, 0x342f, 0x1443, 0xb44b, 0xf906, 0x1979, 0xbeaf, 0x0a9f, 0x45b3, 0xe73c, 0x0a6f, 0x3e78, 0xd655, 0xc03d, 0x2087, 0xeb0b, 0xcf7a, 0x4395, 0x1915, 0xe1a6, 0x34d0, 0x134e, 0xac96, 0xeeeb, 0x1aa0, 0xc459, 0x0965, 0x4852, 0xe8bd, 0x0151, 0x3569, 0xd16f, 0xb855, 0x1c6f, 0xed54, 0xcabb, 0x428e, 0x1dfb, 0xdf3c, 0x323b, 0x15f0, 0xab84, 0xe597, 0x18a2, 0xc34f, 0x0120, 0x48dd, 0xedf1, 0x07d1, 0x3f6b, 0xd521, 0xb0ac, 0x1903, 0xf0c7, 0xc122, 0x3959, 0x22ad, 0xe010, 0x2ec7, 0x1837, 0xaaf6, 0xe170, 0x1e2b, 0xc7b9, 0xfdb5, 0x4c53, 0xebef, 0xfb34, 0x3ee4, 0xdef9, 0xb297, 0x1b34, 0xfd76, 0xc42a, 0x391e, 0x2b29, 0xde3f, 0x2dc8, 0x2491, 0xb2a5, 0xe544, 0x2b06, 0xcad8, 0xf507, 0x54ba, 0xf673, 0xfa92, 0x48ca, 0xe9a8, 0xafd3, 0x1ef7, 0x084a, 0xc383, 0x3a6e, 0x3354, 0xdbff, 0x2c3f, 0x2b2a, 0xb115, 0xe1c4, 0x348d, 0xd2d5, 0xf3b1, 0x5801, 0xf84b, 0xf5dc, 0x4897, 0xeba9, 0xac5a, 0x1d11, 0x0bb4, 0xbcd7, 0x32ed, 0x3809, 0xdc0a, 0x2aa8, 0x3035, 0xb63c, 0xddf9, 0x3359, 0xe1e6, 0xdc8c, 0x1666, 0xf007, 0x2428, 0x5dbe, 0x00c2, 0xd781, 0x22f0, 0xf405, 0xa1af, 0xed74, 0xf64b, 0xd808, 0x304e, 0x5c2f, 0x2e87, 0x2aaf, 0x32b5, 0xdc5e, 0xbf90, 0xd852, 0xad5b, 0xdde3, 0x38e2, 0x1923, 0x04d1, 0x62c4, 0x5bb8, 0xe529, 0xeaaf, 0xfd61, 0xc422, 0xc0df, 0xfa6b, 0x0d7b, 0x16ff, 0x3f3e, 0x1d78, 0x1a46, 0x3b1d, 0xf55f, 0xc829, 0xeeb5, 0x0157, 0xdd55, 0xf41a, 0x20b5, 0x1533, 0x2329, 0x1f7c, 0x1523, 0x1e43, 0x1419, 0xdc00, 0xbfc2, 0xfbcf, 0xe187, 0xd1ef, 0x2a18, 0x3c8b, 0x1862, 0x2179, 0x4380, 0x06a1, 0xdc67, 0xe0e4, 0xb854, 0xda4e, 0xf2b5, 0xe744, 0x1f54, 0x57ea, 0x2932, 0xfa55, 0x3961, 0x0fd9, 0xbac6, 0xcdda, 0xd258, 0xcf89, 0xe3ab, 0x0707, 0x1a3e, 0x3967, 0x30cc, 0x0264, 0x2d4f, 0x1e6c, 0xcc01, 0xb70b, 0xd1c4, 0xdac0, 0xca7b, 0xfba8, 0x26c2, 0x371b, 0x359b, 0x23c6, 0x2fb4, 0x0da1, 0xd9bd, 0xae9d, 0xb89c, 0xdb61, 0xcb90, 0x0132, 0x482d, 0x42cd, 0x1e49, 0x2e1f, 0x3691, 0xe7fa, 0xc93c, 0xba66, 0xbb0a, 0xe251, 0xe472, 0x0383, 0x3f08, 0x4cc8, 0x1215, 0x1c80, 0x3b71, 0xe4f3, 0xc431, 0xcbb0, 0xc403, 0xd2f9, 0xf12b, 0x1313, 0x2f50, 0x4774, 0x1313, 0x18c4, 0x4058, 0xed5d, 0xb643, 0xc25a, 0xd92a, 0xcdc3, 0xe267, 0x25f0, 0x37bf, 0x38e3, 0x1db0, 0x2909, 0x2dab, 0xe635, 0xb3fb, 0xb52f, 0xe71a, 0xdad1, 0xdbe5, 0x2dd4, 0x4a45, 0x2f11, 0x15fc, 0x375b, 0x1edc, 0xd95e, 0xc7dd, 0xb91d, 0xdb9a, 0xe8d2, 0xea7d, 0x243c, 0x50aa, 0x347a, 0x0b10, 0x3f2c, 0x24ae, 0xc984, 0xc48d, 0xccec, 0xd726, 0xda77, 0xf845, 0x2782, 0x491b, 0x3bb7, 0x1233, 0x3698, 0x200c, 0xcd29, 0xb25f, 0xc2ef, 0xdd85, 0xd457, 0xfe96, 0x3830, 0x43f0, 0x2e94, 0x1a60, 0x3369, 0x07e9, 0xcb4f, 0xb645, 0xba73, 0xdbb8, 0xdb8f, 0xffae, 0x3a33, 0x48d7, 0x2211, 0x15da, 0x362f, 0xfbd5, 0xc39a, 0xb7fb, 0xc2cf, 0xe1cd, 0xe2d2, 0x0604, 0x36c9, 0x495d, 0x209d, 0x15d2, 0x37e6, 0xf91a, 0xc431, 0xbe00, 0xccf7, 0xe3be, 0xe90a, 0x14f8, 0x3bed, 0x4775, 0x22c5, 0x1a55, 0x2eb8, 0xf7ab, 0xcbee, 0xbb0a, 0xd4b7, 0xea3e, 0xe43a, 0x18fd, 0x455e, 0x429e, 0x1d75, 0x27b4, 0x2e04, 0xeadd, 0xca0c, 0xb834, 0xcf7e, 0xebe8, 0xec12, 0x1d2b, 0x4ce6, 0x4388, 0x1410, 0x2882, 0x2863, 0xdbfa, 0xc201, 0xbc64, 0xd1a8, 0xe40d, 0xf23c, 0x21f6, 0x44ac, 0x3ed5, 0x105b, 0x1f33, 0x1ab9, 0xd393, 0xb879, 0xb8a2, 0xd559, 0xdf87, 0xf31b, 0x2555, 0x3b7c, 0x3066, 0x0f9b, 0x206c, 0x1043, 0xd352, 0xb6fe, 0xb4ae, 0xdacb, 0xdd79, 0xed28, 0x2944, 0x40cc, 0x26e3, 0x1073, 0x2c6d, 0x0a8e, 0xd1fe, 0xbe7c, 0xb79c, 0xdbb0, 0xe28f, 0xf1b8, 0x2782, 0x45d6, 0x288a, 0x146e, 0x3752, 0x08d7, 0xccea, 0xc003, 0xbd89, 0xda98, 0xe4f4, 0x0193, 0x3341, 0x4c65, 0x29eb, 0x1665, 0x385c, 0x0502, 0xcaf3, 0xbfdd, 0xc859, 0xe1b4, 0xe85f, 0x0f40, 0x394b, 0x49b1, 0x2907, 0x1adb, 0x324c, 0xf922, 0xc6e9, 0xb961, 0xcbdd, 0xe7b2, 0xe6bd, 0x11f6, 0x3fef, 0x46fb, 0x1df6, 0x1d0f, 0x2f40, 0xeef5, 0xc4a6, 0xb575, 0xcb9f, 0xe637, 0xea22, 0x1afc, 0x450f, 0x486c, 0x1ca2, 0x2081, 0x27c1, 0xe170, 0xbe81, 0xb610, 0xd4bd, 0xe951, 0xed82, 0x22d8, 0x4920, 0x44fd, 0x1967, 0x24be, 0x230d, 0xdd5b, 0xbd48, 0xb2b2, 0xd74f, 0xebd6, 0xf51e, 0x2d0e, 0x4f15, 0x406d, 0x18ea, 0x2d32, 0x1b37, 0xd68b, 0xc044, 0xb935, 0xdd2b, 0xe8ca, 0xf474, 0x309b, 0x54b6, 0x3c42, 0x14ba, 0x347b, 0x1910, 0xd0a8, 0xbcba, 0xb8c9, 0xdc46, 0xe9fe, 0xfff4, 0x3532, 0x5389, 0x3988, 0x14af, 0x3504, 0x102d, 0xc848, 0xb929, 0xbe6f, 0xdd0e, 0xe430, 0x059c, 0x3ba7, 0x4f58, 0x2e33, 0x10f0, 0x2a2f, 0xfdb9, 0xc2f6, 0xafbb, 0xbb99, 0xe4f6, 0xe5f2, 0x07f0, 0x3ce6, 0x4606, 0x2206, 0x1803, 0x2b80, 0xee52, 0xc24f, 0xb46d, 0xbb4a, 0xe32e, 0xe633, 0x0953, 0x4238, 0x4b00, 0x1a28, 0x1723, 0x280d, 0xe191, 0xbf29, 0xb512, 0xbb95, 0xe083, 0xee77, 0x11e1, 0x3d02, 0x4905, 0x18fb, 0x175c, 0x25d3, 0xdaba, 0xb4bd, 0xb51c, 0xcc2b, 0xe1c5, 0xed1f, 0x1d15, 0x42ae, 0x42e0, 0x12aa, 0x15c7, 0x1ce6, 0xdd86, 0xbb2e, 0xb339, 0xd4c6, 0xe6a3, 0xee5c, 0x246d, 0x4599, 0x378a, 0x117f, 0x247f, 0x1587, 0xd40f, 0xc211, 0xba12, 0xda04, 0xe9d2, 0xf097, 0x2593, 0x4a0d, 0x33f2, 0x0e58, 0x2f92, 0x1796, 0xd23e, 0xc5d1, 0xbd1d, 0xd6a8, 0xea03, 0xfd4b, 0x2b76, 0x4d07, 0x372b, 0x12c1, 0x3610, 0x1455, 0xc9fa, 0xc082, 0xc65f, 0xdbf3, 0xe5fa, 0x0864, 0x3695, 0x4d6d, 0x3441, 0x13be, 0x2f2f, 0x090c, 0xce34, 0xb830, 0xc505, 0xfada, 0xec81, 0xfb68, 0x2eba, 0x319e, 0x3ce2, 0x44fb, 0x1d01, 0xdd9d, 0xd66a, 0xb232, 0xa016, 0xf64b, 0xfff6, 0x09d5, 0x7376, 0x8570, 0x20f6, 0xfe82, 0xf200, 0x9a52, 0xa325, 0xc4f5, 0xcbde, 0x2c79, 0x67bb, 0x4c8f, 0x46a8, 0x523c, 0xf79d, 0xabd0, 0xda12, 0xcc15, 0xb71c, 0xf62d, 0x1e60, 0x327a, 0x4b18, 0x2770, 0xf598, 0x157f, 0x094e, 0xbe89, 0xebf7, 0x2a77, 0xf098, 0xe9ee, 0x28e2, 0xf32a, 0xc056, 0x237c, 0x271d, 0xe4a4, 0x3978, 0x35ba, 0xe536, 0x10f5, 0xfdaa, 0xa68b, 0xd3ea, 0x212f, 0xea07, 0x08a6, 0x5e96, 0x0ae2, 0x07c6, 0x37b6, 0xd70c, 0xb092, 0xfe7d, 0xf21a, 0xcad9, 0x34d2, 0x36e9, 0xf083, 0x37da, 0x22a5, 0xbc01, 0xdc00, 0x1395, 0xd553, 0xe5e3, 0x3bac, 0xfd08, 0xfe92, 0x3f5c, 0xee23, 0xbc45, 0x0d39, 0x0a9c, 0xc61a, 0x146f, 0x2951, 0xdb39, 0x171e, 0x293d, 0xc2e7, 0xdd20, 0x32b9, 0xe330, 0xd7b9, 0x3cc5, 0xf7d9, 0xdcad, 0x311b, 0xf1df, 0xb0b8, 0x105b, 0x1a8c, 0xca51, 0x1be5, 0x2f80, 0xd616, 0x11ca, 0x2652, 0xbc4e, 0xcb96, 0x21a7, 0xe4b4, 0xe253, 0x4487, 0x0196, 0xe674, 0x3516, 0xfb04, 0xb3bc, 0xfeb8, 0x1079, 0xc24e, 0x088e, 0x3298, 0xe80b, 0x14c1, 0x2ed3, 0xd1a8, 0xcf82, 0x2207, 0xee50, 0xcf02, 0x2dec, 0x08af, 0xe42a, 0x344d, 0x0fb2, 0xb971, 0xfa3f, 0x1df7, 0xd32e, 0x11cc, 0x3722, 0xda30, 0x07ac, 0x3d3f, 0xd7ab, 0xc34d, 0x271b, 0xfe76, 0xdbb3, 0x3d61, 0x18ed, 0xed9b, 0x3389, 0x0c14, 0xba7c, 0xf987, 0x187e, 0xcd50, 0x1066, 0x476b, 0xf480, 0x1314, 0x42bb, 0xe5fe, 0xc3be, 0x1389, 0xf39f, 0xd575, 0x3648, 0x1e47, 0xf2fa, 0x3e74, 0x234a, 0xbf4c, 0xf288, 0x221b, 0xc710, 0xfa3c, 0x5035, 0xfb9e, 0x0502, 0x44eb, 0xeee6, 0xc43e, 0x1d61, 0xfb1c, 0xc9de, 0x3c74, 0x2aae, 0xe190, 0x3674, 0x2619, 0xaff2, 0xe8b6, 0x2937, 0xc78c, 0xf5df, 0x540b, 0xfb05, 0x020b, 0x434b, 0xe0e6, 0xacc1, 0x10fc, 0xf91d, 0xbcee, 0x3592, 0x3566, 0xe36e, 0x337d, 0x30bf, 0xb32f, 0xd426, 0x2162, 0xc820, 0xe042, 0x4c56, 0xfe46, 0xf61f, 0x4a89, 0xf803, 0xad4d, 0x11a6, 0x0a6c, 0xb6d1, 0x253a, 0x3311, 0xd5a0, 0x2667, 0x3498, 0xb800, 0xd872, 0x2f83, 0xd41e, 0xe4e1, 0x5463, 0xf738, 0xea30, 0x492c, 0xf007, 0xaab2, 0x16ec, 0x11da, 0xc262, 0x2e37, 0x3e3b, 0xdd03, 0x22dd, 0x30e8, 0xb674, 0xd170, 0x2e2c, 0xdcd6, 0xe399, 0x56b9, 0x04f1, 0xea52, 0x4a44, 0xfd31, 0xa60d, 0x09bf, 0x162d, 0xbcc9, 0x1f55, 0x4352, 0xde68, 0x1cd9, 0x3c0d, 0xbf98, 0xc8d8, 0x2a1f, 0xdc64, 0xd503, 0x4d6c, 0x0785, 0xe7a8, 0x476e, 0xff01, 0xa5cd, 0x064f, 0x17bf, 0xbe55, 0x1800, 0x3b7b, 0xd4d9, 0x10f0, 0x3690, 0xbf8d, 0xc71e, 0x297a, 0xe393, 0xd729, 0x47fe, 0x0285, 0xda51, 0x391b, 0xfeb3, 0xa48e, 0xfbc3, 0x19a9, 0xc3a0, 0x108e, 0x3eae, 0xdebc, 0x0f12, 0x36a2, 0xc4c0, 0xbf91, 0x1e2f, 0xe5de, 0xd395, 0x4354, 0x10d5, 0xe319, 0x39c0, 0x0a87, 0xace4, 0xf7d2, 0x18b7, 0xc582, 0x0b6f, 0x3da5, 0xe290, 0x0dde, 0x3c3e, 0xcfe6, 0xc55b, 0x253d, 0xeca1, 0xcf94, 0x3b7a, 0x0f41, 0xdf74, 0x366b, 0x1370, 0xb644, 0xfb14, 0x1f1e, 0xc7c9, 0x07b4, 0x41e9, 0xe70d, 0x071d, 0x3d77, 0xdb66, 0xc478, 0x265f, 0xf916, 0xd180, 0x3ee6, 0x1beb, 0xdeb9, 0x31d9, 0x191a, 0xb479, 0xf52c, 0x2801, 0xccf7, 0x03d4, 0x4bd7, 0xedac, 0x016a, 0x3a65, 0xd6fc, 0xbe27, 0x2266, 0x07f4, 0xd0c6, 0x0dcf, 0x1281, 0x0eb0, 0x45e8, 0x1d9a, 0xd8e3, 0x05c1, 0x084a, 0xb5be, 0xdaec, 0x09a2, 0xe1b9, 0x11ee, 0x6086, 0x43d5, 0x17db, 0x2892, 0xfb50, 0xb60e, 0xc9f7, 0xc054, 0xc68d, 0x23e0, 0x2ffe, 0x062b, 0x4e99, 0x701f, 0xf80e, 0xd329, 0xff2c, 0xcb90, 0xa2d6, 0xed8c, 0x1910, 0x0699, 0x2f80, 0x3089, 0x1d1c, 0x374f, 0x03b2, 0xc14c, 0xd8b6, 0xfb3d, 0xd617, 0xe1a7, 0x22a2, 0x2021, 0x1a55, 0x1dcb, 0x2025, 0x150c, 0x0753, 0xe11c, 0xb5ad, 0xeb4f, 0xe450, 0xcc01, 0x1b1d, 0x3faa, 0x18aa, 0x0e6d, 0x4970, 0x17e5, 0xcba3, 0xd80b, 0xbb23, 0xc5d9, 0xe755, 0xf01c, 0x158e, 0x5028, 0x3e7d, 0xfcdb, 0x3482, 0x21eb, 0xbae5, 0xbfbe, 0xd2fb, 0xcfc4, 0xd821, 0x0aca, 0x27bb, 0x3924, 0x3d1e, 0x0e86, 0x271a, 0x205b, 0xd16c, 0xaf53, 0xc9df, 0xe377, 0xce6f, 0xfa21, 0x34f1, 0x4083, 0x3410, 0x259d, 0x319d, 0x06b6, 0xd9dc, 0xb750, 0xb2df, 0xde42, 0xd8e4, 0xfe96, 0x4970, 0x54f6, 0x25ba, 0x2520, 0x3c2e, 0xedea, 0xc061, 0xba0d, 0xba48, 0xde9c, 0xeb84, 0x0af2, 0x401e, 0x56b2, 0x1aa5, 0x0f66, 0x36cf, 0xe844, 0xb80e, 0xc1dd, 0xc246, 0xcece, 0xe9fe, 0x177a, 0x32d2, 0x4547, 0x1818, 0x0c52, 0x30b6, 0xec12, 0xaf1a, 0xb2f2, 0xcfa8, 0xd2b1, 0xdf9e, 0x2116, 0x3ab2, 0x35ab, 0x1b48, 0x247c, 0x25e1, 0xdedd, 0xb1e5, 0xaf2b, 0xdb4a, 0xe17b, 0xdfc7, 0x27da, 0x4f71, 0x34be, 0x0ed1, 0x2d58, 0x1ef5, 0xd091, 0xc1bb, 0xbe47, 0xd524, 0xeaee, 0xf469, 0x2112, 0x4cf4, 0x3d3e, 0x0aff, 0x304c, 0x281a, 0xcdc7, 0xbbed, 0xd088, 0xe04a, 0xdeea, 0xfee9, 0x2f94, 0x47fc, 0x3dff, 0x1a27, 0x31e9, 0x1deb, 0xd894, 0xbec6, 0xc6e8, 0xe5fc, 0xe340, 0x014d, 0x3cd1, 0x4e2f, 0x32bd, 0x1d0c, 0x372e, 0x0af1, 0xce88, 0xc502, 0xc97d, 0xe495, 0xeb9c, 0x0798, 0x374a, 0x4e4d, 0x2a7e, 0x16b3, 0x3ddd, 0x08ed, 0xc949, 0xc5ee, 0xce08, 0xdf28, 0xe8b7, 0x0fe9, 0x3689, 0x490a, 0x2817, 0x1714, 0x38c1, 0x0109, 0xc527, 0xc1af, 0xd087, 0xdced, 0xe41e, 0x12dc, 0x3476, 0x3cd2, 0x201b, 0x1cbb, 0x2e40, 0xf269, 0xc5fe, 0xb844, 0xcaac, 0xdf7f, 0xe02f, 0x0f09, 0x373a, 0x383b, 0x13eb, 0x21ef, 0x2cbc, 0xe41a, 0xc568, 0xb82e, 0xc319, 0xdca2, 0xe63b, 0x0f93, 0x3ca2, 0x4202, 0x11af, 0x2392, 0x2ac6, 0xd906, 0xb7d3, 0xb715, 0xce35, 0xdb89, 0xef49, 0x2213, 0x3ff6, 0x3f4b, 0x14d9, 0x2398, 0x1f27, 0xd7ab, 0xb866, 0xb50a, 0xd74b, 0xe11e, 0xf58b, 0x2ece, 0x467f, 0x3963, 0x1933, 0x2caa, 0x1426, 0xd5d8, 0xbe81, 0xb620, 0xdf76, 0xe789, 0xf65e, 0x349f, 0x505c, 0x3366, 0x16ea, 0x3646, 0x0f5a, 0xd18a, 0xc1b2, 0xb7f7, 0xdd2a, 0xeb2f, 0xfd79, 0x30f5, 0x516e, 0x31d6, 0x12af, 0x388a, 0x0be7, 0xca82, 0xbdf0, 0xbc89, 0xda3c, 0xe687, 0x06e8, 0x3695, 0x5204, 0x3323, 0x158c, 0x3447, 0x05f1, 0xca02, 0xb88d, 0xc1cf, 0xe381, 0xea5c, 0x110d, 0x40c6, 0x4e27, 0x2a69, 0x1e8c, 0x30b5, 0xf349, 0xc5eb, 0xb6f0, 0xc440, 0xe7cd, 0xebf2, 0x1281, 0x4308, 0x4ce7, 0x1f25, 0x1bf5, 0x2d5c, 0xe897, 0xc291, 0xb85f, 0xc6be, 0xe556, 0xf257, 0x1cc0, 0x442d, 0x4d14, 0x200a, 0x1f36, 0x26a6, 0xdf96, 0xbef2, 0xb898, 0xd0e1, 0xe9a1, 0xf513, 0x2536, 0x486a, 0x4666, 0x1bd4, 0x216e, 0x1a61, 0xd966, 0xbfd6, 0xb46f, 0xd414, 0xeb0f, 0xf5c1, 0x2917, 0x4b03, 0x3b01, 0x120a, 0x279d, 0x127b, 0xce60, 0xc0b2, 0xbaa1, 0xd93a, 0xea16, 0xf79d, 0x29e1, 0x4e28, 0x3952, 0x0c9b, 0x2918, 0x0da3, 0xc8e3, 0xbf5d, 0xbd5b, 0xd7be, 0xe6b5, 0xff78, 0x2bfe, 0x474e, 0x30ea, 0x0afb, 0x2996, 0x09da, 0xc618, 0xb66b, 0xc002, 0xde8f, 0xe009, 0x0068, 0x34b1, 0x479e, 0x290d, 0x1057, 0x2cf4, 0x0037, 0xc901, 0xba19, 0xc161, 0xe4c1, 0xe626, 0x06b7, 0x3bce, 0x46e6, 0x1fc6, 0x1c43, 0x37dd, 0xf4a3, 0xc6e9, 0xc0da, 0xc57a, 0xe45d, 0xe96e, 0x0b68, 0x3e09, 0x4c53, 0x1c9e, 0x1978, 0x350c, 0xec82, 0xc2fd, 0xc069, 0xc683, 0xdf64, 0xee42, 0x1619, 0x39da, 0x4685, 0x1dc8, 0x1c78, 0x2de4, 0xe52f, 0xbb56, 0xb88c, 0xd10f, 0xe424, 0xed39, 0x226e, 0x45c9, 0x4373, 0x1798, 0x1d16, 0x2213, 0xe050, 0xbf9c, 0xb315, 0xd32f, 0xe7c5, 0xec31, 0x23d2, 0x48dd, 0x38f4, 0x0de0, 0x25fc, 0x1996, 0xcef8, 0xbc82, 0xb55a, 0xd59c, 0xe89f, 0xefe0, 0x23a4, 0x4993, 0x37a4, 0x0c32, 0x2be5, 0x17d1, 0xcddd, 0xc07a, 0xb8e9, 0xd329, 0xe54b, 0xfb4e, 0x2cfc, 0x4d3a, 0x3bad, 0x0fee, 0x2b2b, 0x1047, 0xc712, 0xb4f7, 0xbbf0, 0xdc5f, 0xe2f3, 0xfef6, 0x224e, 0x4c36, 0x6c76, 0x2b5c, 0xfa57, 0xe594, 0xbdb1, 0x8b0a, 0xa7ca, 0x0160, 0x0786, 0x400c, 0x8424, 0x5796, 0x1be9, 0xf540, 0xbdf9, 0x9768, 0xc4df, 0xbd3d, 0xdd3d, 0x63d3, 0x4e65, 0x1fea, 0x4e57, 0x38bb, 0xd91b, 0xcd56, 0xe3ad, 0xbffd, 0xfbd6, 0x0607, 0xdb8e, 0x3ccb, 0x4192, 0xd6b0, 0xf73b, 0x42bf, 0xeff1, 0xe330, 0x3dbd, 0xfa84, 0xdccf, 0x13df, 0xde74, 0xb718, 0x0b45, 0x28d2, 0xfb25, 0x3fa0, 0x4276, 0xedb2, 0x1335, 0x0954, 0xadc9, 0xc6fc, 0x1522, 0xf53c, 0xfe45, 0x4b87, 0x18e7, 0x04a7, 0x3412, 0xee3f, 0xb321, 0xfd48, 0x04c9, 0xc508, 0x15a8, 0x372c, 0xeb2f, 0x165c, 0x2ca0, 0xce55, 0xd34d, 0x1c95, 0xe2fd, 0xdd7e, 0x3294, 0xf905, 0xe452, 0x34a4, 0x04d0, 0xbdd7, 0x0a01, 0x1d14, 0xce45, 0x0c02, 0x2888, 0xd716, 0x03dc, 0x2b4a, 0xd5cd, 0xd68c, 0x2ef2, 0xfc10, 0xda6f, 0x316f, 0x0773, 0xda8e, 0x2215, 0x0507, 0xb6f3, 0xfe70, 0x2a5d, 0xd6c8, 0x0b84, 0x4188, 0xe8c4, 0xfdd0, 0x2ec5, 0xd794, 0xc3a2, 0x2279, 0xf779, 0xd09d, 0x423d, 0x27fc, 0xe6f8, 0x2f40, 0x1b5a, 0xbc8b, 0xf157, 0x1fb4, 0xcaa0, 0xfa3a, 0x4232, 0xf922, 0x0ecb, 0x3f09, 0xe3ee, 0xc318, 0x1cef, 0xfdc1, 0xca4c, 0x2a22, 0x20f1, 0xe87d, 0x279c, 0x1afc, 0xbe72, 0xe720, 0x2220, 0xd1d4, 0xf6a7, 0x4e3e, 0xf5f4, 0xecca, 0x3b54, 0xf567, 0xb06f, 0x0a45, 0x0b98, 0xc973, 0x28f0, 0x2f21, 0xdfeb, 0x24a0, 0x2810, 0xaef4, 0xd207, 0x2ab3, 0xcd51, 0xdc82, 0x4ca3, 0xfdde, 0xef82, 0x40ab, 0xf143, 0xac33, 0x082b, 0xfdac, 0xb9b7, 0x28f3, 0x2b71, 0xd054, 0x2723, 0x3651, 0xb6cf, 0xd176, 0x2ba8, 0xd75d, 0xdb92, 0x450f, 0xfd8f, 0xec9c, 0x3e23, 0xf598, 0xaf02, 0x111a, 0x135a, 0xbd2d, 0x2334, 0x3d0a, 0xd3d8, 0x1768, 0x3bb0, 0xbab9, 0xc676, 0x311a, 0xe06f, 0xd889, 0x5018, 0x070b, 0xe756, 0x4942, 0xfd09, 0x9d71, 0x0bcc, 0x1bed, 0xb4ce, 0x1c66, 0x47ec, 0xdc5f, 0x1b74, 0x4238, 0xc481, 0xcf1b, 0x32f5, 0xe1ce, 0xda85, 0x4e4d, 0x0437, 0xe474, 0x4777, 0x07ed, 0xaff9, 0x127d, 0x24cd, 0xc370, 0x199d, 0x3e29, 0xd8bf, 0x14fd, 0x3d8b, 0xc8ea, 0xd1b6, 0x3766, 0xecd3, 0xda6f, 0x4fa7, 0x0ce7, 0xdddd, 0x4019, 0x0c05, 0xaedb, 0x0dbc, 0x2b4c, 0xcdd3, 0x1ddc, 0x470d, 0xe283, 0x1764, 0x40d4, 0xcabb, 0xcd66, 0x3585, 0xf1c2, 0xdda9, 0x4ffb, 0x11e4, 0xe28a, 0x415d, 0x12d2, 0xb486, 0x055e, 0x1fd4, 0xc66e, 0x12ca, 0x417e, 0xe4e2, 0x1229, 0x3e2a, 0xd10c, 0xc800, 0x29e0, 0xed4e, 0xd10c, 0x3fcc, 0x11a3, 0xe1f9, 0x3ad7, 0x16ca, 0xb727, 0x0155, 0x2400, 0xc8c6, 0x0c22, 0x40bf, 0xe1dc, 0x06e9, 0x3e89, 0xd924, 0xc59a, 0x27a2, 0xf22c, 0xcfad, 0x3f51, 0x14cd, 0xda51, 0x2f15, 0x1235, 0xae68, 0xedef, 0x1983, 0xc602, 0x06d9, 0x46e6, 0xe9de, 0x01cd, 0x3928, 0xd470, 0xb512, 0x15ff, 0xec31, 0xc9cd, 0x3f78, 0x243a, 0xe15e, 0x29ed, 0x1245, 0xaba1, 0xe5e9, 0x199e, 0xc296, 0xfe39, 0x4ac5, 0xeb5f, 0xfa56, 0x3c11, 0xd94f, 0xae50, 0x1511, 0xf001, 0xbde3, 0x36c2, 0x230d, 0xd7fe, 0x2c17, 0x1e3a, 0xaa06, 0xe31f, 0x226e, 0xc144, 0xf626, 0x4f4e, 0xeb1e, 0xf4dd, 0x3e8c, 0xdc0a, 0xaf47, 0x1e56, 0xfed8, 0xc48e, 0x3d56, 0x2b0f, 0xd682, 0x2918, 0x1dec, 0xa955, 0xe5bb, 0x2b6b, 0xc9b8, 0xfa77, 0x56f8, 0xf481, 0xfb61, 0x4479, 0xdf2e, 0xabca, 0x1c70, 0xffe7, 0xbc88, 0x3a59, 0x3826, 0xe054, 0x2f4b, 0x2c11, 0xb1dd, 0xe03e, 0x2b29, 0xc998, 0xf18d, 0x59ee, 0xf7ac, 0xf73d, 0x4d8e, 0xed67, 0xb1d8, 0x21a9, 0x1848, 0xccda, 0x07a8, 0xffcd, 0xfa23, 0x5aea, 0x3797, 0xd62f, 0x0ab0, 0x245e, 0xb225, 0xc27c, 0x09d2, 0xd863, 0xfe56, 0x5bb6, 0x4ddb, 0x2aa0, 0x3bda, 0x0b4a, 0xc172, 0xdcc2, 0xc178, 0xb04a, 0x211f, 0x3a69, 0xf99a, 0x3316, 0x7dfa, 0x1afe, 0xd954, 0x046d, 0xdf49, 0xb051, 0xdb3e, 0x09de, 0x0f9f, 0x347e, 0x2f84, 0x0af2, 0x3895, 0x1ade, 0xc5b6, 0xd468, 0xfe63, 0xe6d0, 0xddae, 0x14b5, 0x175e, 0x16c3, 0x1fae, 0x122e, 0x1fcb, 0x16f5, 0xef7f, 0xbe99, 0xdd8a, 0xf61b, 0xc6ce, 0x019a, 0x43c3, 0x2909, 0x1168, 0x39ad, 0x2f76, 0xde14, 0xddd2, 0xc963, 0xbd2a, 0xea45, 0xea62, 0x0266, 0x4616, 0x4e1c, 0x015e, 0x18de, 0x36f6, 0xcf20, 0xb656, 0xd210, 0xd017, 0xd8b3, 0xfb2f, 0x1950, 0x2b27, 0x3c69, 0x095e, 0x0ec5, 0x2d9c, 0xe85e, 0xb75b, 0xc4ac, 0xe1a3, 0xcfe0, 0xdf2a, 0x1a10, 0x3183, 0x376b, 0x1d4c, 0x237d, 0x185c, 0xe4f3, 0xbf7b, 0xab18, 0xcfc2, 0xd346, 0xe11c, 0x2903, 0x45ea, 0x24aa, 0x102b, 0x353d, 0x080f, 0xc677, 0xbdeb, 0xb32e, 0xd477, 0xe331, 0xef66, 0x2325, 0x4c5c, 0x27b3, 0xfaf5, 0x3106, 0x1252, 0xc709, 0xca81, 0xcbe5, 0xd04d, 0xdd4e, 0xfd3c, 0x1a5f, 0x3c21, 0x2935, 0x0252, 0x3750, 0x1e8e, 0xc8e4, 0xb83e, 0xd48f, 0xdc6e, 0xce04, 0x0585, 0x31bc, 0x360a, 0x2009, 0x14c2, 0x394e, 0x10a3, 0xc93d, 0xafa5, 0xd6b1, 0xef04, 0xcd94, 0x0467, 0x48be, 0x4051, 0x1437, 0x1fb5, 0x3cd3, 0xf79e, 0xcc8f, 0xc153, 0xcd1f, 0xeeb7, 0xe37c, 0x03cf, 0x4174, 0x4958, 0x1000, 0x1d3b, 0x4853, 0xf289, 0xbea9, 0xc9e2, 0xd4e7, 0xde7b, 0xe633, 0x1461, 0x3e75, 0x4911, 0x1b5a, 0x2106, 0x4059, 0xf467, 0xbf92, 0xc1f8, 0xd995, 0xdcf6, 0xe0ba, 0x1eb5, 0x4600, 0x4167, 0x1d25, 0x2ef9, 0x3639, 0xe56b, 0xc105, 0xc027, 0xd70a, 0xe1eb, 0xea01, 0x247e, 0x4c66, 0x3f10, 0x14c8, 0x3245, 0x3094, 0xdd32, 0xc132, 0xc147, 0xd9a1, 0xe18c, 0xeeb8, 0x2824, 0x4a69, 0x395c, 0x1015, 0x3040, 0x238d, 0xd48a, 0xc21b, 0xc53b, 0xdc6d, 0xe1ce, 0xf6ef, 0x2ad6, 0x46b7, 0x34da, 0x1114, 0x34eb, 0x1e8c, 0xd361, 0xbe8c, 0xc1c6, 0xe012, 0xdf71, 0xf81f, 0x3359, 0x4a06, 0x2d71, 0x1454, 0x38da, 0x0f58, 0xccf4, 0xbea1, 0xbbb5, 0xdb25, 0xe2c4, 0xfd77, 0x3627, 0x5121, 0x2c35, 0x15a0, 0x3989, 0x0018, 0xc03f, 0xbaf5, 0xc3cd, 0xe02b, 0xe6c9, 0x0e3d, 0x3eb5, 0x4d58, 0x26cb, 0x1318, 0x2fe0, 0xf891, 0xc27d, 0xb828, 0xc71e, 0xe21d, 0xe699, 0x15c5, 0x4058, 0x45ef, 0x2262, 0x1985, 0x28bc, 0xeca7, 0xc32c, 0xb7e4, 0xcfc1, 0xea07, 0xe4ac, 0x173a, 0x461c, 0x3eba, 0x15fa, 0x2087, 0x2703, 0xe29a, 0xc4b3, 0xb600, 0xc8f7, 0xe687, 0xe9ba, 0x15c4, 0x426b, 0x3e74, 0x0edd, 0x1f75, 0x23b8, 0xd925, 0xc0ab, 0xba1f, 0xcb2d, 0xe095, 0xeca2, 0x1990, 0x40e5, 0x3c5d, 0x1023, 0x24d2, 0x1ebd, 0xd280, 0xbab7, 0xba30, 0xd226, 0xe0d0, 0xf39a, 0x22d6, 0x4063, 0x34fc, 0x0f3b, 0x2825, 0x190f, 0xd310, 0xbcd9, 0xbd2e, 0xd80b, 0xdd5a, 0xf3ce, 0x2b22, 0x4783, 0x32fb, 0x13a4, 0x3361, 0x1484, 0xcf84, 0xc067, 0xc184, 0xdb6a, 0xe3e8, 0x0230, 0x3122, 0x4768, 0x320a, 0x16c1, 0x3427, 0x0aed, 0xc9bb, 0xba81, 0xc328, 0xe12c, 0xe1e3, 0x07e1, 0x3ec1, 0x4f67, 0x2ddc, 0x15f0, 0x2f32, 0xfe24, 0xc964, 0xbbfd, 0xc754, 0xe848, 0xe9ef, 0x1196, 0x41b3, 0x4b5f, 0x2760, 0x1f91, 0x35ce, 0xf3d5, 0xc722, 0xbfad, 0xcade, 0xe85a, 0xeaa5, 0x1660, 0x4809, 0x4c60, 0x1f11, 0x212f, 0x36b0, 0xefd1, 0xc764, 0xbc28, 0xc837, 0xe455, 0xec50, 0x1c88, 0x4b3c, 0x4de3, 0x2041, 0x28c6, 0x32d7, 0xe1ea, 0xbea7, 0xbd29, 0xd1a9, 0xe60c, 0xf02d, 0x2433, 0x4c51, 0x4811, 0x1816, 0x23ce, 0x292b, 0xdf35, 0xbcec, 0xb6b3, 0xd50d, 0xe49a, 0xee6a, 0x2b0c, 0x4b27, 0x39f9, 0x15f5, 0x29d8, 0x1859, 0xd36e, 0xc04c, 0xb5ab, 0xd4b0, 0xe461, 0xec0c, 0x2803, 0x4fb2, 0x371f, 0x0f49, 0x2de8, 0x1063, 0xc7dd, 0xbbcc, 0xb195, 0xcdad, 0xe2b5, 0xf6ed, 0x29d0, 0x4ac5, 0x31e4, 0x0aa9, 0x2acb, 0x0735, 0xbe72, 0xb39c, 0xb620, 0xd1d9, 0xdc5c, 0xfcdd, 0x307a, 0x46be, 0x2c7c, 0x0a2b, 0x22ab, 0xfca8, 0xc0ac, 0xafc4, 0xb815, 0xde74, 0xe13f, 0x0269, 0x370e, 0x4107, 0x21c4, 0x13c8, 0x26a3, 0xf061, 0xc3ac, 0xb5ad, 0xbbea, 0xe2b6, 0xe314, 0x03cd, 0x3a8a, 0x453e, 0x1c0b, 0x167a, 0x2afd, 0xe8ae, 0xc330, 0xbb1d, 0xbd71, 0xdff6, 0xea8c, 0x0cd6, 0x3cc1, 0x4b59, 0x1e08, 0x1762, 0x288a, 0xe327, 0xbcf5, 0xbc04, 0xcc41, 0xe3b8, 0xf214, 0x1f63, 0x40b7, 0x4556, 0x1932, 0x14e9, 0x22d4, 0xe5af, 0xc176, 0xbaf1, 0xd516, 0xeaa3, 0xed1a, 0x10a5, 0x4490, 0x6d0e, 0x387d, 0x06ad, 0xf979, 0xc011, 0x9e3c, 0xad92, 0xe582, 0x1234, 0x4531, 0x6a71, 0x4d3b, 0x3443, 0xfe14, 0xbf35, 0xb76f, 0xcbe7, 0xc8b4, 0xe9aa, 0x501f, 0x43d8, 0x1d18, 0x4560, 0x2e0d, 0xf4de, 0xea75, 0xe7b7, 0xd73f, 0x0fdc, 0x11cd, 0xd145, 0x29c3, 0x44d4, 0xdad6, 0xf4f0, 0x3e51, 0x092e, 0x07b6, 0x43ce, 0xfd5a, 0xf591, 0x1f19, 0xc2ea, 0xb2d7, 0x198e, 0x140f, 0xfa53, 0x5e12, 0x4564, 0xf1ae, 0x2e33, 0x0b49, 0xa4bb, 0xdaed, 0x1485, 0xdc90, 0x0cbf, 0x4f0d, 0x0854, 0x15b5, 0x3b75, 0xe6b5, 0xbe4e, 0x0981, 0xfc23, 0xc6c6, 0x22a2, 0x2984, 0xf1db, 0x27f9, 0x1ab0, 0xc60e, 0xe49e, 0x21a8, 0xd681, 0xe953, 0x41f4, 0xf337, 0xeb9d, 0x3560, 0xf514, 0xbd12, 0x135a, 0x1144, 0xc99f, 0x21e0, 0x2271, 0xd155, 0x1a35, 0x25a3, 0xbec7, 0xdc7d, 0x31ed, 0xe802, 0xe46d, 0x3ef6, 0xfc72, 0xeb7d, 0x2fc5, 0xecf1, 0xb132, 0x0d6d, 0x171d, 0xcaf3, 0x20be, 0x36cd, 0xdeff, 0x1430, 0x2c97, 0xc49c, 0xcab8, 0x247c, 0xe2b5, 0xd3f1, 0x3d93, 0x0c22, 0xee37, 0x3907, 0x01ea, 0xb32c, 0x07e5, 0x153f, 0xb7d0, 0x0a61, 0x333d, 0xdb8a, 0x1138, 0x3892, 0xcfca, 0xccd1, 0x2831, 0xeb12, 0xd73f, 0x357e, 0xfe1d, 0xe21b, 0x300a, 0xfded, 0xaf91, 0xffaf, 0x1ba1, 0xc5b1, 0x0c52, 0x3c73, 0xe33f, 0xfac8, 0x2338, 0xd7bc, 0xc7f4, 0x0f99, 0xe739, 0xd9e0, 0x3980, 0x0e6d, 0xe382, 0x335e, 0x15f9, 0xae82, 0xe698, 0x1c86, 0xca1d, 0xf6f1, 0x34d2, 0xf14d, 0x0fec, 0x3c9a, 0xdef1, 0xc8df, 0x20f3, 0xea68, 0xc50a, 0x33ef, 0x1185, 0xd7d4, 0x2ebc, 0x2178, 0xc1c1, 0xf72b, 0x2354, 0xd2eb, 0x0168, 0x30db, 0xe0a6, 0x05a6, 0x3bad, 0xdc09, 0xc45f, 0x276d, 0xfd11, 0xcf0a, 0x363e, 0x204b, 0xe4d0, 0x2851, 0x199c, 0xbc3c, 0xe9df, 0x1c38, 0xcf05, 0x03b3, 0x4c0e, 0xf6ee, 0x068d, 0x44a0, 0xe3e0, 0xb163, 0x17fa, 0xfdee, 0xc709, 0x37cd, 0x2e63, 0xea1c, 0x3531, 0x2ca0, 0xbf9e, 0xeeec, 0x2b06, 0xc5f7, 0xf1c8, 0x5385, 0xfc84, 0x0002, 0x49cb, 0xf52b, 0xbfbf, 0x204d, 0x04c6, 0xc649, 0x35e9, 0x30b9, 0xe658, 0x31b2, 0x2cb7, 0xb96b, 0xe5a8, 0x2f24, 0xd410, 0xf6ab, 0x5771, 0x04b9, 0xfc36, 0x3ec2, 0xecd7, 0xb28a, 0x1904, 0x0954, 0xc24d, 0x3764, 0x3ade, 0xddf2, 0x29ce, 0x3445, 0xb4d5, 0xd352, 0x2d79, 0xd037, 0xe09a, 0x535a, 0x01a5, 0xf095, 0x48ef, 0xf767, 0xa8aa, 0x11b3, 0x097b, 0xb15c, 0x2a36, 0x3db4, 0xd6cd, 0x24b8, 0x3712, 0xb430, 0xcdb4, 0x2b60, 0xd3aa, 0xe09b, 0x53eb, 0xfc4a, 0xea6b, 0x4b2a, 0xf90e, 0xa8c8, 0x1124, 0x129b, 0xbaac, 0x269d, 0x4030, 0xda96, 0x20e1, 0x3a2e, 0xbd1c, 0xd0d8, 0x3158, 0xdd88, 0xdee5, 0x57dc, 0x0a22, 0xeb70, 0x4be8, 0x027e, 0xa602, 0x0680, 0x1714, 0xbfed, 0x242e, 0x47b1, 0xe011, 0x1d8e, 0x3eca, 0xc029, 0xc616, 0x2e06, 0xe28f, 0xd4aa, 0x4f9e, 0x0f06, 0xe649, 0x438d, 0x0564, 0xa6f1, 0x02f6, 0x1bd3, 0xc020, 0x18b7, 0x4204, 0xd71b, 0x0fc8, 0x3e52, 0xc2b8, 0xbf78, 0x2bd7, 0xe6d3, 0xce7b, 0x47d7, 0x0a5d, 0xd7d4, 0x39c7, 0x074e, 0xa273, 0xfc77, 0x1fef, 0xbcf9, 0x0cec, 0x426a, 0xd4f2, 0x044f, 0x3d93, 0xc6ea, 0xbcdf, 0x2bd1, 0xed0b, 0xce10, 0x43d0, 0x0ca2, 0xd5d2, 0x35c4, 0x0c15, 0xa646, 0xfa2d, 0x2097, 0xc0dd, 0x0c2b, 0x439b, 0xdc9c, 0x059f, 0x3b30, 0xca4a, 0xbbcb, 0x2337, 0xe7a3, 0xc717, 0x3dae, 0x1491, 0xdc09, 0x3229, 0x0f3e, 0xac38, 0xf62a, 0x25d7, 0xcda9, 0xe86a, 0x0ccd, 0xe87d, 0x2a51, 0x46ee, 0xea42, 0xe40d, 0x22b1, 0xd631, 0xa84b, 0xf868, 0xe4f9, 0xdc35, 0x395d, 0x50be, 0x1fd6, 0x25ac, 0x1e57, 0xc641, 0xc358, 0xd0f2, 0xac56, 0xf1aa, 0x385d, 0x08e0, 0x0c0c, 0x6c90, 0x3d9a, 0xd534, 0xf575, 0xf32f, 0xb660, 0xc715, 0x00c3, 0x060a, 0x1cc0, 0x3bee, 0x0fef, 0x2648, 0x390e, 0xe520, 0xcaa4, 0xfc07, 0xfa8c, 0xcfc3, 0xff3b, 0x2146, 0x0eaa, 0x22f7, 0x21eb, 0x22a5, 0x2b3f, 0x140f, 0xd035, 0xce0d, 0x018b, 0xcdfd, 0xe402, 0x4024, 0x35a0, 0x11b4, 0x30f7, 0x48c6, 0xfc36, 0xe429, 0xd9e4, 0xb819, 0xe9ae, 0xecf6, 0xeaac, 0x339b, 0x5af6, 0x18c2, 0x0a7d, 0x49f9, 0xfaf8, 0xba8d, 0xd5ae, 0xd0dc, 0xd43b, 0xee6d, 0x117b, 0x23d1, 0x46ee, 0x29ad, 0x0339, 0x3a96, 0x1314, 0xc110, 0xbad0, 0xd9cf, 0xd706, 0xcd74, 0x0d91, 0x315e, 0x3f9c, 0x359b, 0x2190, 0x2aef, 0x0433, 0xcdb2, 0xa574, 0xc711, 0xe12e, 0xcf40, 0x197f, 0x5324, 0x3d77, 0x20a5, 0x375c, 0x2d03, 0xe262, 0xca54, 0xb0b0, 0xc640, 0xed6e, 0xe3a9, 0x14a7, 0x559a, 0x4789, 0x0af5, 0x2c0d, 0x3078, 0xd574, 0xc8f1, 0xc60c, 0xc4a3, 0xddbb, 0xf434, 0x12bf, 0x3a4f, 0x46b5, 0x0de9, 0x28f8, 0x3a3e, 0xd862, 0xb36e, 0xc4b9, 0xd290, 0xcc9e, 0xf150, 0x28e5, 0x36b7, 0x3727, 0x1942, 0x296a, 0x1f3b, 0xd304, 0xaa50, 0xb7e0, 0xe064, 0xcd60, 0xe774, 0x36d2, 0x4354, 0x256f, 0x16b9, 0x32a9, 0x04e9, 0xc94b, 0xbd89, 0xb4e8, 0xde63, 0xe6b3, 0xefc2, 0x2c99, 0x4d30, 0x244c, 0x0dd9, 0x4013, 0x0a25, 0xbf81, 0xc647, 0xc8d3, 0xd098, 0xddd7, 0x0729, 0x2f46, 0x49fe, 0x3186, 0x11dd, 0x33c9, 0x0a1a, 0xc455, 0xb4fe, 0xcbf9, 0xe01f, 0xd9c3, 0x0d63, 0x3ca9, 0x40e4, 0x2597, 0x1f85, 0x2fee, 0xf6c7, 0xc763, 0xb733, 0xcbd2, 0xe734, 0xe337, 0x11ef, 0x4379, 0x4377, 0x1865, 0x216c, 0x32c8, 0xee0c, 0xca47, 0xc04a, 0xd076, 0xe70b, 0xebed, 0x16a9, 0x3f81, 0x44ae, 0x16f6, 0x2266, 0x31f0, 0xe6d6, 0xc30d, 0xc333, 0xd87e, 0xe495, 0xf14b, 0x1f91, 0x3ab4, 0x3a37, 0x1822, 0x291b, 0x2bcf, 0xea2c, 0xc762, 0xbf57, 0xdd08, 0xe181, 0xec7b, 0x28f2, 0x456d, 0x366d, 0x1d72, 0x3891, 0x2266, 0xe229, 0xcd55, 0xbe26, 0xdad8, 0xe6b2, 0xf1ad, 0x2a59, 0x4ce7, 0x346f, 0x18da, 0x3eb3, 0x1a5c, 0xd0e6, 0xc45c, 0xbfe1, 0xd4d3, 0xe11f, 0x014a, 0x2f81, 0x4863, 0x3408, 0x1268, 0x31f4, 0x0ec8, 0xca3c, 0xb9fc, 0xc1dc, 0xdd52, 0xe093, 0x05ff, 0x33c3, 0x43d7, 0x2da7, 0x1671, 0x2bf0, 0x0034, 0xc97d, 0xb0c3, 0xbe5e, 0xe43b, 0xdb68, 0x0387, 0x3ae6, 0x3ee7, 0x1b43, 0x174b, 0x2d76, 0xf26e, 0xc68d, 0xb289, 0xbb76, 0xe0fe, 0xde57, 0x0305, 0x3b0e, 0x44f7, 0x17e8, 0x1ae0, 0x2e9e, 0xe6b9, 0xc23e, 0xb5b3, 0xbe35, 0xde8a, 0xe55c, 0x0e04, 0x3e2d, 0x4749, 0x1891, 0x1cce, 0x2c46, 0xe31a, 0xbc10, 0xb2be, 0xc7d4, 0xe1b0, 0xec58, 0x1b5f, 0x42a4, 0x4577, 0x18af, 0x206d, 0x2610, 0xe0cf, 0xbee7, 0xb63b, 0xd3ec, 0xe4ab, 0xed6c, 0x253f, 0x4a99, 0x42a8, 0x18da, 0x2a90, 0x2130, 0xd967, 0xc013, 0xb623, 0xd3d0, 0xe7d4, 0xf7c7, 0x2d1b, 0x4df4, 0x3dfe, 0x18d3, 0x2e94, 0x12e1, 0xceb7, 0xbc8b, 0xb721, 0xd9e6, 0xe7b6, 0xfe42, 0x37c7, 0x5256, 0x3916, 0x14fa, 0x2b19, 0x0829, 0xcbbc, 0xbc11, 0xba4e, 0xe0c8, 0xec3c, 0x04ba, 0x39d7, 0x4f48, 0x314f, 0x1b2a, 0x320f, 0xfbd4, 0xc7ad, 0xbe46, 0xbcb0, 0xdfec, 0xea9d, 0x0a76, 0x3eae, 0x51ce, 0x28b8, 0x15c7, 0x32b1, 0xf736, 0xc436, 0xbbe2, 0xc2bd, 0xe357, 0xecf4, 0x10c4, 0x40f6, 0x524e, 0x25cd, 0x19ce, 0x301e, 0xec1e, 0xbc6a, 0xbace, 0xd1d8, 0xe825, 0xec23, 0x1b1b, 0x4400, 0x482a, 0x1bce, 0x1896, 0x260d, 0xe7f6, 0xc325, 0xb5e4, 0xd101, 0xeabf, 0xea0d, 0x1d52, 0x47b3, 0x3cf0, 0x1282, 0x235d, 0x2050, 0xd9ae, 0xc4d9, 0xb970, 0xd086, 0xe87d, 0xea86, 0x1b23, 0x48b1, 0x3c02, 0x0e92, 0x2cb2, 0x2472, 0xd2cb, 0xbff8, 0xbc43, 0xce22, 0xe2d3, 0xf745, 0x2364, 0x47bb, 0x3e11, 0x1209, 0x2f53, 0x1fb0, 0xcfac, 0xba0d, 0xbeea, 0xd8e3, 0xde1c, 0xf854, 0x2f24, 0x49ea, 0x387f, 0x14be, 0x2de7, 0x1304, 0xd01b, 0xb948, 0xbc56, 0xe0d1, 0xe484, 0xff93, 0x3655, 0x488a, 0x2bf5, 0x16ba, 0x3637, 0x07aa, 0xcf32, 0xc24d, 0xc063, 0xe449, 0xe713, 0x01e8, 0x3b25, 0x4f83, 0x26c5, 0x1640, 0x3ab8, 0xff8c, 0xc83c, 0xbf7c, 0xc052, 0xdf32, 0xe807, 0x09ef, 0x390f, 0x4d01, 0x25f5, 0x19b1, 0x3685, 0xf201, 0xbb2e, 0xb561, 0xc59a, 0xdeac, 0xe81d, 0x110d, 0x2f0d, 0x5faf, 0x5bc4, 0x12fe, 0xf615, 0xda50, 0xa9ae, 0x886f, 0xcd18, 0x0718, 0x09f1, 0x5bb7, 0x7af7, 0x3e15, 0x0a73, 0xe799, 0xa715, 0x9c71, 0xc971, 0xb0a1, 0x07a7, 0x6f82, 0x3163, 0x2a82, 0x5398, 0x14c9, 0xbfc2, 0xd8b3, 0xd540, 0xc5ce, 0x0fda, 0xf099, 0xf1a7, 0x518e, 0x1c60, 0xcd84, 0x19da, 0x35b8, 0xd346, 0x03a1, 0x377b, 0xdf14, 0xefc5, 0x0c59, 0xc206, 0xc448, 0x2196, 0x11ee, 0xfe70, 0x4f48, 0x1fa8, 0xeb2d, 0x1d5b, 0xeaf2, 0x9f51, 0xdaef, 0x10e0, 0xe2b8, 0x140e, 0x4a7c, 0x0548, 0x11c6, 0x2b5c, 0xd063, 0xb9e9, 0x0c49, 0xee9f, 0xcd6b, 0x32da, 0x2204, 0xe702, 0x2c36, 0x195d, 0xbc4d, 0xef56, 0x1ea6, 0xd1a8, 0xfb24, 0x33f8, 0xe2fa, 0xffb5, 0x3ccd, 0xe4cb, 0xca25, 0x2563, 0x0355, 0xd2da, 0x2bb0, 0x137a, 0xd6ec, 0x2218, 0x1b95, 0xc3b7, 0xf854, 0x3722, 0xe6e8, 0xf671, 0x3596, 0xec18, 0xf030, 0x2d9c, 0xe6e7, 0xc2e9, 0x26d5, 0x1a49, 0xd733, 0x2bbd, 0x26a1, 0xdab2, 0x1ba0, 0x23f0, 0xc355, 0xe703, 0x2bce, 0xdc49, 0xf190, 0x496d, 0xfc6e, 0xf386, 0x3dfc, 0xf7e9, 0xbcff, 0x1444, 0x0996, 0xc579, 0x1fc6, 0x2a9c, 0xe722, 0x261f, 0x2af6, 0xc74c, 0xe3b8, 0x2a8b, 0xe105, 0xe8c4, 0x3bef, 0xfd9f, 0xefc2, 0x313f, 0xf888, 0xbeed, 0x0f0d, 0x10ba, 0xcf13, 0x2814, 0x3a0d, 0xdf51, 0x0dca, 0x2f8f, 0xccfa, 0xc831, 0x1d1f, 0xe940, 0xe8cf, 0x4a93, 0x0d52, 0xef83, 0x3c76, 0xfaba, 0xa5dd, 0x0126, 0x112f, 0xbdc7, 0x1a61, 0x422a, 0xe9fb, 0x1b1a, 0x3694, 0xc9c9, 0xce2b, 0x1ef2, 0xd732, 0xdc7b, 0x46da, 0xff7f, 0xe9fc, 0x46e1, 0x05ac, 0xaeb6, 0x0663, 0x159d, 0xc012, 0x1316, 0x34ba, 0xdd94, 0x12fd, 0x31f6, 0xc596, 0xcbff, 0x2ae2, 0xe4d5, 0xd6c1, 0x4927, 0x0b3d, 0xdd77, 0x3926, 0x07d1, 0xa2d2, 0xfb2e, 0x211d, 0xc317, 0x1769, 0x4b14, 0xe280, 0x1326, 0x411c, 0xc1e2, 0xbac5, 0x2cf6, 0xe603, 0xcb4b, 0x4ed8, 0x191b, 0xe401, 0x458d, 0x1545, 0xac87, 0x005f, 0x1e4a, 0xba9b, 0x0cc0, 0x467e, 0xe1cf, 0x11da, 0x478e, 0xd350, 0xc70d, 0x31c1, 0xf201, 0xce1e, 0x434c, 0x12d6, 0xdd0b, 0x3986, 0x1337, 0xaf6d, 0x006c, 0x2ca7, 0xc8ff, 0x0c23, 0x4bde, 0xe11d, 0x0318, 0x41ef, 0xd0e5, 0xbd29, 0x3042, 0xf8a0, 0xd014, 0x4ad2, 0x1b53, 0xda3d, 0x3aa3, 0x14be, 0xa4bb, 0xf7a1, 0x2b27, 0xc43a, 0x0948, 0x507e, 0xe296, 0x0297, 0x45db, 0xd510, 0xb990, 0x273a, 0xf430, 0xc750, 0x3f4c, 0x1a85, 0xdb6a, 0x3993, 0x1ab4, 0xadf3, 0xf5f6, 0x280d, 0xc5fc, 0xfe8a, 0x4668, 0xe58d, 0x011c, 0x457a, 0xdfc7, 0xbebe, 0x255e, 0xfae1, 0xcb02, 0x3a3a, 0x1b49, 0xd635, 0x2c90, 0x1a6d, 0xb0f1, 0xf0b7, 0x2851, 0xcb11, 0xfd3b, 0x4815, 0xe902, 0xf73a, 0x3af3, 0xde3a, 0xb633, 0x1a27, 0xfae7, 0xc8e7, 0x3373, 0x1efa, 0xdab3, 0x2af8, 0x1f54, 0xb3a4, 0xe5bd, 0x2010, 0xc657, 0xef33, 0x4332, 0xf32a, 0xf8bc, 0x3a43, 0xe716, 0xb380, 0x1025, 0xf94b, 0xbff8, 0x2cbe, 0x2722, 0xd958, 0x2238, 0x24de, 0xb4e0, 0xd8e0, 0x219f, 0xcbf4, 0xec3e, 0x4cc4, 0xf5db, 0xee65, 0x3cb1, 0xe88f, 0xad6b, 0x15fb, 0x0312, 0xbe65, 0x3207, 0x3441, 0xd731, 0x1ee6, 0x2923, 0xb321, 0xd7af, 0x26e1, 0xce3a, 0xeb73, 0x52d6, 0xfb3a, 0xed11, 0x3fa2, 0xeb93, 0xa537, 0x0fde, 0x078b, 0xbcc7, 0x2dd2, 0x39bf, 0xde73, 0x2216, 0x2ba5, 0xb204, 0xd113, 0x2873, 0xd059, 0xe433, 0x5331, 0x00f5, 0xede6, 0x41c9, 0xf3f8, 0xaa8c, 0x0f24, 0x06be, 0xb5e6, 0x29e9, 0x39f4, 0xda5d, 0x25b6, 0x2b84, 0xb07f, 0xd942, 0x36fe, 0xe8ec, 0xcdd1, 0x1733, 0x0849, 0x1aa1, 0x4558, 0xfb48, 0xd3ef, 0x11bd, 0xef48, 0xb142, 0xf697, 0xfdea, 0xd64a, 0x32a6, 0x6fed, 0x25f8, 0x0b17, 0x2a5c, 0xdff3, 0xaef4, 0xd4ec, 0xbcba, 0xe25d, 0x44cb, 0x234b, 0x1321, 0x73ba, 0x4da9, 0xced4, 0xe817, 0x007f, 0xa908, 0xb5df, 0x1df6, 0x1875, 0x0e2c, 0x3ec1, 0x2fcd, 0x272d, 0x2290, 0xe25c, 0xc07e, 0xf134, 0xfb4d, 0xd6f2, 0x0ad3, 0x3447, 0x223c, 0x13f1, 0x2272, 0x269f, 0x025a, 0x0161, 0xd722, 0xd224, 0x0308, 0xde38, 0xef78, 0x3c18, 0x42ed, 0x0555, 0x290a, 0x5400, 0xe6be, 0xca2d, 0xdae9, 0xc68f, 0xd7d0, 0xf47c, 0x10ed, 0x3184, 0x5941, 0x1cf6, 0x0891, 0x3a35, 0xeb6f, 0xae39, 0xc817, 0xe6f7, 0xd6ef, 0xebb0, 0x3372, 0x35f1, 0x34dd, 0x1e90, 0x16f7, 0x21a1, 0xf074, 0xc287, 0xb8c4, 0xe82d, 0xe6eb, 0xdb90, 0x1e19, 0x40af, 0x3208, 0x1a9a, 0x320f, 0x1b9a, 0xdeff, 0xcf46, 0xb4a3, 0xcbd7, 0xdf68, 0xe59a, 0x22fe, 0x55b5, 0x3892, 0x0be2, 0x396b, 0x1a98, 0xc635, 0xc146, 0xc092, 0xd361, 0xe7eb, 0x0383, 0x2879, 0x4c6a, 0x3c0d, 0x05ca, 0x2976, 0x14a9, 0xc798, 0xc116, 0xd2d8, 0xdd50, 0xdcd3, 0x0b09, 0x2bce, 0x3653, 0x2ab8, 0x0a52, 0x2aa9, 0x14b7, 0xd401, 0xb890, 0xcc60, 0xea88, 0xd5e4, 0xfe7d, 0x383b, 0x3ade, 0x1b88, 0x1ad7, 0x3ed1, 0x075f, 0xcd9c, 0xbbc4, 0xcbe8, 0xeb85, 0xd822, 0xfbc3, 0x3e44, 0x459b, 0x10ea, 0x17ee, 0x43df, 0xf7f9, 0xc0a0, 0xc419, 0xcf1f, 0xdea4, 0xe05f, 0x0678, 0x330f, 0x42d4, 0x111c, 0x0fba, 0x3f57, 0xf9a8, 0xb669, 0xbe1b, 0xe146, 0xdd9a, 0xd4be, 0x11a3, 0x389d, 0x37d6, 0x13b2, 0x1c70, 0x3370, 0xf10c, 0xc063, 0xb6e6, 0xd48a, 0xdc66, 0xd809, 0x1789, 0x3f92, 0x3566, 0x0e0f, 0x231e, 0x2ea3, 0xde28, 0xbb31, 0xba09, 0xcf05, 0xd866, 0xdfc8, 0x18f1, 0x3ecd, 0x369b, 0x0a8f, 0x2386, 0x2af2, 0xda2a, 0xb79e, 0xb7d0, 0xd687, 0xde35, 0xe721, 0x22ba, 0x4574, 0x3572, 0x0dd3, 0x2e06, 0x263b, 0xd7ab, 0xbfc7, 0xc2f6, 0xdf1b, 0xe1c3, 0xf1d5, 0x2cb4, 0x4e1c, 0x37cd, 0x115d, 0x35cd, 0x1fe6, 0xd779, 0xc301, 0xc58e, 0xe72d, 0xe5ce, 0xf960, 0x335a, 0x4fb4, 0x357b, 0x1898, 0x426e, 0x1cc2, 0xd473, 0xc727, 0xc831, 0xe1fb, 0xe68f, 0x072e, 0x3da1, 0x58d4, 0x39ac, 0x1d25, 0x4338, 0x1401, 0xcf2b, 0xbee6, 0xca41, 0xe875, 0xe64f, 0x1316, 0x4982, 0x5236, 0x2f67, 0x2085, 0x38b8, 0xfd01, 0xc7c8, 0xba93, 0xc979, 0xebc7, 0xea26, 0x168d, 0x477d, 0x4817, 0x212b, 0x1fdd, 0x335a, 0xef3e, 0xc484, 0xb895, 0xc9b8, 0xec42, 0xe805, 0x136b, 0x4a61, 0x4971, 0x17b6, 0x1f6a, 0x2f97, 0xe4b1, 0xc086, 0xb999, 0xcac9, 0xe5fd, 0xee0c, 0x1807, 0x412f, 0x460f, 0x166d, 0x1f4c, 0x29b3, 0xdc64, 0xb965, 0xb861, 0xd211, 0xe147, 0xeb99, 0x2193, 0x450f, 0x3ce4, 0x113e, 0x1f63, 0x1c84, 0xd769, 0xb874, 0xb487, 0xd682, 0xe1c9, 0xed74, 0x24b0, 0x43a4, 0x33ba, 0x0e1c, 0x2413, 0x10f7, 0xcdd3, 0xb977, 0xb8d7, 0xdbc4, 0xe37c, 0xf175, 0x272e, 0x457d, 0x2d0a, 0x07d0, 0x297e, 0x0f41, 0xca51, 0xb9f7, 0xbc9a, 0xdaa7, 0xddfe, 0xf766, 0x2c64, 0x4532, 0x2d7b, 0x0dd9, 0x2cf4, 0x0c17, 0xc90f, 0xb4bc, 0xc07f, 0xe270, 0xdce1, 0xfc63, 0x371a, 0x4749, 0x2579, 0x1187, 0x2dc1, 0xff1f, 0xc7eb, 0xb7f0, 0xc150, 0xe209, 0xe0bb, 0x0562, 0x39a6, 0x419b, 0x18df, 0x11d0, 0x32b0, 0xf640, 0xc162, 0xbaa8, 0xc92a, 0xe355, 0xdf42, 0x07ce, 0x3de6, 0x485f, 0x1a8d, 0x15e0, 0x345d, 0xf2a7, 0xc2b4, 0xbc48, 0xcb43, 0xe331, 0xe771, 0x171d, 0x41c7, 0x46e8, 0x1e6a, 0x1d99, 0x3169, 0xea47, 0xbb34, 0xb612, 0xcfe5, 0xe372, 0xe4f4, 0x1dce, 0x4978, 0x4538, 0x1abb, 0x1ff9, 0x2726, 0xe2ee, 0xbf5a, 0xb642, 0xd6a7, 0xeb65, 0xe981, 0x26c2, 0x5246, 0x3d0f, 0x142e, 0x2f6c, 0x28fc, 0xda88, 0xc3aa, 0xbdbe, 0xd749, 0xeb54, 0xf1e0, 0x25cd, 0x526c, 0x41ba, 0x10bf, 0x2fe6, 0x2449, 0xd374, 0xbfc4, 0xbbe2, 0xd283, 0xe25c, 0xf99f, 0x2cef, 0x4ac7, 0x3ddf, 0x17d9, 0x3082, 0x1925, 0xce89, 0xb6a1, 0xbc50, 0xe283, 0xe474, 0xfd8d, 0x3bcc, 0x4e96, 0x33c3, 0x167a, 0x2e47, 0x0a43, 0xcef1, 0xbc29, 0xba3d, 0xe1a3, 0xe5f7, 0xfe7c, 0x39db, 0x4bea, 0x270e, 0x128b, 0x30de, 0xfb59, 0xc505, 0xbdab, 0xbd60, 0xe0c5, 0xe64a, 0x0171, 0x35c3, 0x47fc, 0x21b5, 0x11b5, 0x30fa, 0xf4fc, 0xc06e, 0xbaa3, 0xbc7a, 0xd83f, 0xe4e1, 0x0b66, 0x373d, 0x497a, 0x2421, 0x109c, 0x26f1, 0xecb6, 0xbadf, 0xb11f, 0xc45d, 0xdf59, 0xe4b2, 0x1641, 0x3f59, 0x42bc, 0x1c1c, 0x129c, 0x1bee, 0xe133, 0xbe64, 0xb1ad, 0xcc9f, 0xec32, 0xe986, 0x19ae, 0x44e5, 0x3a19, 0x0e88, 0x1ade, 0x1f2c, 0xdec4, 0xc3cc, 0xb2ef, 0xdaab, 0xfd08, 0xe6a7, 0x1123, 0x3704, 0x3898, 0x3ad4, 0x346f, 0xfe92, 0xd1d3, 0xcc04, 0x9cbd, 0xc135, 0x02eb, 0xf63b, 0x365b, 0x8b58, 0x58ad, 0x0415, 0x0488, 0xcf1c, 0x8e64, 0xb611, 0xc2c4, 0xeda1, 0x4ea8, 0x63da, 0x49bb, 0x50ec, 0x3618, 0xc859, 0xb818, 0xe010, 0xbc83, 0xd14a, 0x1ad8, 0x32a9, 0x4030, 0x4434, 0x0f51, 0xf80f, 0x1895, 0xeaf8, 0xc48d, 0x175a, 0x2702, 0xe895, 0x0fd2, 0x2756, 0xcf30, 0xdfad, 0x3a11, 0xfb80, 0xfa5f, 0x565f, 0x121d, 0xf290, 0x2352, 0xddf3, 0xa5f4, 0xfe06, 0x187b, 0xde96, 0x3a13, 0x5105, 0xf698, 0x255a, 0x212e, 0xb7a3, 0xc5a7, 0x10d7, 0xdeff, 0xe90b, 0x551a, 0x1708, 0xfd81, 0x42e8, 0xf9ae, 0xb328, 0xf8c8, 0x0cd4, 0xc910, 0x1398, 0x3cf8, 0xe89b, 0x1c9d, 0x36c1, 0xcb0b, 0xcca6, 0x2759, 0xf1e2, 0xd264, 0x3d80, 0x146d, 0xe372, 0x36c2, 0x0ab3, 0xb2ef, 0x0a0e, 0x2e96, 0xc7be, 0x0dcf, 0x4ba5, 0xdcd8, 0xff1f, 0x391f, 0xcf51, 0xc4c3, 0x314b, 0xfef3, 0xd680, 0x41c6, 0x156e, 0xdd3b, 0x2eeb, 0x0886, 0xa9c9, 0xf3a6, 0x247e, 0xc927, 0x069f, 0x4a37, 0xe895, 0x0061, 0x378e, 0xd6a1, 0xb348, 0x1688, 0xf810, 0xc498, 0x323f, 0x1fc5, 0xe066, 0x29b3, 0x139d, 0xadbb, 0xe71a, 0x2c44, 0xcae3, 0xe8e1, 0x3f89, 0xe822, 0xf034, 0x367a, 0xdf30, 0xb32c, 0x1aba, 0x0281, 0xcc1b, 0x36c4, 0x14ca, 0xc6d5, 0x2590, 0x1c08, 0xa351, 0xd7ce, 0x2a74, 0xd59f, 0xf3fa, 0x477e, 0xf4e0, 0xf8ff, 0x3121, 0xdc01, 0xb775, 0x150c, 0xfcd8, 0xcc0d, 0x38c8, 0x2ece, 0xe423, 0x2849, 0x29b5, 0xc302, 0xda74, 0x1f47, 0xdd2f, 0xf247, 0x3ab2, 0xf2d7, 0x006a, 0x4787, 0xf2b8, 0xbc9f, 0x1f1c, 0x0ac7, 0xbde9, 0x23df, 0x2b4d, 0xd869, 0x1cf2, 0x2e59, 0xc8ac, 0xe6ca, 0x2cef, 0xd907, 0xf197, 0x4b23, 0xf20c, 0xef15, 0x4469, 0xf156, 0xb2a9, 0x1bfd, 0x127b, 0xca28, 0x306d, 0x3438, 0xdf08, 0x20cf, 0x27a1, 0xb9c7, 0xd8d7, 0x2741, 0xd309, 0xe588, 0x5056, 0x03d5, 0xef96, 0x4207, 0xfd8d, 0xae5f, 0x03b5, 0x0589, 0xbd38, 0x23af, 0x3a76, 0xe095, 0x2023, 0x3839, 0xc165, 0xd4ca, 0x2de1, 0xd781, 0xe09b, 0x50bd, 0x0340, 0xea0c, 0x4022, 0xf840, 0xad2c, 0x1331, 0x12e3, 0xc260, 0x2f2a, 0x3b6c, 0xd12c, 0x18a4, 0x3197, 0xb77c, 0xd13d, 0x2bd2, 0xd972, 0xe616, 0x52eb, 0x041e, 0xeb26, 0x3bdc, 0xf119, 0xa2b2, 0x06d5, 0x1049, 0xbd97, 0x289f, 0x44ee, 0xdf14, 0x1d7f, 0x34ac, 0xb7bb, 0xc690, 0x278a, 0xda25, 0xdff9, 0x579a, 0x080c, 0xe6ec, 0x4374, 0xfcbd, 0xa5be, 0x078c, 0x146b, 0xbb5b, 0x2164, 0x4262, 0xdc47, 0x1e50, 0x39f8, 0xbce7, 0xcbb4, 0x2afe, 0xdc45, 0xdb5e, 0x5409, 0x0b3a, 0xe53c, 0x4358, 0x02ae, 0xa896, 0x0857, 0x1af8, 0xc23a, 0x2352, 0x496b, 0xdfb5, 0x197e, 0x3ce3, 0xbe54, 0xc506, 0x3012, 0xe677, 0xd704, 0x5217, 0x11ee, 0xe2e7, 0x3fe4, 0x06fa, 0xa5a3, 0xfdcd, 0x181f, 0xbb44, 0x1747, 0x4a1f, 0xdca9, 0x10d6, 0x4291, 0xc4a6, 0xbd25, 0x2a87, 0xe605, 0xcbf6, 0x4b38, 0x15fb, 0xe0ad, 0x3f35, 0x0d36, 0xa652, 0x0068, 0x234a, 0xbde1, 0x11e2, 0x4aeb, 0xdbe0, 0x0a9d, 0x4344, 0xcb41, 0xbfb5, 0x3005, 0xef5d, 0xcc1b, 0x497b, 0x1516, 0xd825, 0x3b8a, 0x1677, 0xabc7, 0xfeb9, 0x2dcb, 0xc484, 0x08d9, 0x4f69, 0xe275, 0x041d, 0x4846, 0xd81a, 0xc055, 0x3307, 0xfcca, 0xce29, 0x4a68, 0x20cb, 0xd8f3, 0x379a, 0x1b24, 0xaf02, 0xfaf5, 0x36a2, 0xdc0c, 0xf2c4, 0x1be5, 0xefab, 0x3121, 0x54a4, 0xf198, 0xe7b1, 0x2ba4, 0xe144, 0xad6e, 0x0105, 0xf0a8, 0xe331, 0x4379, 0x5911, 0x2529, 0x2cc9, 0x279d, 0xcce3, 0xc4aa, 0xd6d0, 0xaebe, 0xee7a, 0x3b83, 0x0e08, 0x0c23, 0x6c6b, 0x4249, 0xd2d0, 0xee99, 0xf0dc, 0xb1d9, 0xc315, 0x0097, 0x05b2, 0x198e, 0x3a21, 0x0a87, 0x19af, 0x3001, 0xda73, 0xbf3b, 0xf320, 0xf1e8, 0xce48, 0xfde9, 0x1c97, 0x092a, 0x1c03, 0x1996, 0x174f, 0x1e06, 0x0784, 0xc7d4, 0xc266, 0xf6c0, 0xcc3e, 0xdd41, 0x35c9, 0x3070, 0x0e9b, 0x2df6, 0x46cc, 0xf777, 0xdb3b, 0xd86d, 0xb2ad, 0xdad5, 0xea97, 0xeb13, 0x2dfd, 0x5bf5, 0x1d45, 0x0c80, 0x4c6b, 0xf9d2, 0xb332, 0xd3b1, 0xcca7, 0xc90a, 0xeeb9, 0x1637, 0x2142, 0x4501, 0x2b65, 0x034c, 0x35ee, 0x0df0, 0xbcaf, 0xb962, 0xda48, 0xd509, 0xd169, 0x125a, 0x2f7e, 0x3ce9, 0x31e9, 0x1f9f, 0x25c3, 0xf9ce, 0xc7fa, 0xa4bc, 0xc4e4, 0xde14, 0xd114, 0x1820, 0x4ec1, 0x3955, 0x1716, 0x2ffb, 0x23e1, 0xd401, 0xc118, 0xaea8, 0xc267, 0xe761, 0xe650, 0x166b, 0x5317, 0x4508, 0x02ef, 0x256f, 0x2a58, 0xc9bf, 0xbfb1, 0xc690, 0xc4c0, 0xdb5a, 0xfc3e, 0x1d56, 0x406f, 0x4672, 0x07f9, 0x258b, 0x3563, 0xd0af, 0xad4b, 0xc62c, 0xd7ec, 0xd118, 0xfacb, 0x32c8, 0x3cf8, 0x3893, 0x1827, 0x2a88, 0x2056, 0xd2e0, 0xa9a8, 0xbc95, 0xe82d, 0xd209, 0xed42, 0x4049, 0x4bca, 0x27a4, 0x17b5, 0x33c7, 0x048c, 0xc896, 0xbbc4, 0xb5e8, 0xde55, 0xe670, 0xf26e, 0x319d, 0x5284, 0x20bb, 0x0a37, 0x3f54, 0x0425, 0xb7b6, 0xbeac, 0xc4a7, 0xd10a, 0xdf90, 0x067a, 0x32d8, 0x4def, 0x29e9, 0x0de0, 0x33b8, 0x00f9, 0xbb53, 0xb44c, 0xca99, 0xdcb3, 0xdf0d, 0x140a, 0x4211, 0x47c0, 0x2741, 0x1ffe, 0x3026, 0xf2ee, 0xc44d, 0xb8c2, 0xcbde, 0xe86b, 0xed77, 0x1b4d, 0x47ee, 0x4766, 0x1ae9, 0x2386, 0x33e9, 0xea57, 0xc4ae, 0xc182, 0xd3ec, 0xeae1, 0xf2fa, 0x1c99, 0x46ce, 0x4849, 0x16e5, 0x2357, 0x2d0d, 0xe171, 0xc2b4, 0xc619, 0xdb43, 0xe861, 0xf96a, 0x2580, 0x41a1, 0x3fcc, 0x14f6, 0x245e, 0x2692, 0xe3d9, 0xc4b2, 0xc084, 0xdcfb, 0xe481, 0xf277, 0x26e8, 0x4453, 0x3677, 0x1401, 0x2eb5, 0x1c61, 0xda3a, 0xc536, 0xbbc2, 0xd95f, 0xe409, 0xf088, 0x24e3, 0x4a50, 0x36ef, 0x1343, 0x3794, 0x1bd7, 0xd0b1, 0xbf04, 0xc0c0, 0xd999, 0xe102, 0xfe57, 0x307b, 0x4c60, 0x3446, 0x110b, 0x34af, 0x1719, 0xd246, 0xbe92, 0xc661, 0xdf01, 0xde95, 0x04b9, 0x34ae, 0x44b2, 0x2c3e, 0x140f, 0x311d, 0x09e5, 0xcd57, 0xb673, 0xc4ea, 0xe8e6, 0xdfae, 0x02f2, 0x3c51, 0x460d, 0x2037, 0x160e, 0x33a4, 0xffd5, 0xd044, 0xbb77, 0xbff6, 0xe547, 0xe2d3, 0x02a5, 0x3927, 0x483e, 0x1e84, 0x18a8, 0x35a4, 0xf428, 0xc4b4, 0xb810, 0xbe31, 0xdf3f, 0xe3b9, 0x070a, 0x3a6e, 0x4a01, 0x1d3d, 0x19b7, 0x312f, 0xe9ed, 0xb9d2, 0xb185, 0xc27d, 0xdf74, 0xeaac, 0x163c, 0x40b2, 0x480f, 0x196b, 0x1a68, 0x2946, 0xe387, 0xbd44, 0xb687, 0xcdd3, 0xe1c0, 0xe73f, 0x19c6, 0x454e, 0x4471, 0x1517, 0x1f37, 0x2415, 0xde12, 0xbc28, 0xb193, 0xce92, 0xe199, 0xeb2a, 0x208d, 0x45c9, 0x3dfd, 0x140f, 0x2554, 0x1b8d, 0xd3e4, 0xb631, 0xaeee, 0xd2a0, 0xe032, 0xeefc, 0x2bad, 0x4d46, 0x3a27, 0x0f3b, 0x24c9, 0x111e, 0xcdbf, 0xb6b5, 0xb194, 0xd7c9, 0xe60a, 0xf93b, 0x2f30, 0x4968, 0x3246, 0x1306, 0x2d46, 0x06e7, 0xc785, 0xba49, 0xb9ab, 0xde3a, 0xe629, 0xff26, 0x3a02, 0x5456, 0x30f0, 0x10ea, 0x3149, 0x0578, 0xc92c, 0xbe07, 0xc00c, 0xe26f, 0xec57, 0x0aaf, 0x3ec0, 0x560f, 0x2fbd, 0x16da, 0x3543, 0xfe12, 0xc441, 0xbe1e, 0xce80, 0xec2a, 0xeeda, 0x1761, 0x467e, 0x531c, 0x2945, 0x16f3, 0x30b3, 0xfa85, 0xc82a, 0xb95b, 0xd0b9, 0xf0bf, 0xecf0, 0x1a23, 0x4acc, 0x48e2, 0x1c65, 0x1e4d, 0x2902, 0xe8e0, 0xc9c2, 0xbc2f, 0xd2c0, 0xf22e, 0xed1c, 0x1844, 0x4b01, 0x4776, 0x146e, 0x2125, 0x2832, 0xde1c, 0xc52b, 0xbd52, 0xcf76, 0xec76, 0xf496, 0x1c9f, 0x4726, 0x432c, 0x116f, 0x25e7, 0x2766, 0xd731, 0xbc99, 0xc162, 0xd7c6, 0xe12d, 0xf3c2, 0x27ac, 0x489f, 0x3fb7, 0x11f9, 0x23e3, 0x1dd1, 0xd9f9, 0xbc81, 0xbc41, 0xe051, 0xe6f9, 0xf6af, 0x2df2, 0x4613, 0x2fe6, 0x12b9, 0x303c, 0x120f, 0xd130, 0xc1da, 0xbc62, 0xdb80, 0xe279, 0xf4be, 0x2c52, 0x4660, 0x275e, 0x0d1c, 0x3149, 0x075f, 0xc931, 0xbf24, 0xbaf3, 0xd888, 0xe2cc, 0xfb8b, 0x2cb6, 0x4a52, 0x29ea, 0x0caa, 0x3097, 0xff78, 0xbdf9, 0xb45b, 0xc1cb, 0xdd4e, 0xe310, 0x068a, 0x24f2, 0x54ac, 0x60d2, 0x1650, 0xf4c6, 0xe059, 0xb014, 0x83b1, 0xbc91, 0x02f9, 0x0157, 0x4fca, 0x7cb3, 0x41bb, 0x0df7, 0xea9f, 0xace6, 0x957f, 0xc6c1, 0xb25c, 0xf25c, 0x6d4a, 0x3c23, 0x2274, 0x5314, 0x2754, 0xc59a, 0xd13d, 0xdf25, 0xc110, 0x097d, 0xfee9, 0xe7e9, 0x4a58, 0x3073, 0xd0cf, 0x0834, 0x3f47, 0xde37, 0xefad, 0x3de0, 0xef24, 0xe80f, 0x1519, 0xd4ff, 0xbae7, 0x160b, 0x1ed5, 0xf6f3, 0x4a32, 0x391f, 0xed02, 0x1a95, 0x0194, 0xa798, 0xcdb4, 0x1870, 0xed7d, 0x0805, 0x5609, 0x1649, 0x0c10, 0x37fb, 0xe698, 0xb602, 0x0ab1, 0x02bc, 0xc982, 0x29a0, 0x3592, 0xeb4c, 0x26a0, 0x2b39, 0xc51e, 0xe028, 0x25df, 0xdd3d, 0xeb89, 0x3c7d, 0xf25b, 0xf2a8, 0x40cd, 0xf67a, 0xbd91, 0x18e1, 0x1367, 0xcbf7, 0x1e2b, 0x2469, 0xd608, 0x16f8, 0x2a0b, 0xc927, 0xe2cc, 0x37b1, 0xf346, 0xe694, 0x382d, 0xf93e, 0xe10a, 0x2a89, 0xf6d1, 0xba9a, 0x1681, 0x2591, 0xd24e, 0x187c, 0x2fad, 0xd8f6, 0x0b46, 0x2ae5, 0xc8c2, 0xd38a, 0x2a7a, 0xe7b1, 0xdcb3, 0x3e95, 0x03d8, 0xe5e1, 0x3718, 0x0451, 0xb6fc, 0x05d7, 0x1636, 0xc589, 0x0c0d, 0x2d31, 0xe2a5, 0x145e, 0x2ff3, 0xd16c, 0xd748, 0x2961, 0xeee4, 0xd89a, 0x2f77, 0x0413, 0xe432, 0x2a18, 0x07e4, 0xbf90, 0xffac, 0x1a5c, 0xce43, 0x0eae, 0x3e2a, 0xe525, 0xfcdf, 0x3412, 0xe19f, 0xc0d0, 0x160c, 0xf679, 0xdaf7, 0x3d0f, 0x184f, 0xe643, 0x3314, 0x0d97, 0xa9d1, 0xf210, 0x1e09, 0xc374, 0x0591, 0x4995, 0xef24, 0x05bf, 0x3aa6, 0xdaf6, 0xc1a1, 0x198b, 0xe5e1, 0xce1f, 0x40dc, 0x134c, 0xddc5, 0x3b68, 0x1d73, 0xb2c0, 0xf385, 0x2228, 0xc6a9, 0xff0d, 0x4056, 0xea16, 0x071a, 0x3ca3, 0xd74b, 0xbcb1, 0x210f, 0xf2c1, 0xcb2c, 0x414d, 0x1f07, 0xd958, 0x2f24, 0x195a, 0xa747, 0xe84d, 0x2605, 0xc501, 0xff0e, 0x4e0a, 0xea48, 0x02a4, 0x46c5, 0xd723, 0xafda, 0x23af, 0xf6a4, 0xbc7c, 0x3c45, 0x26f8, 0xdc74, 0x367d, 0x2543, 0xb0bd, 0xed3e, 0x27e5, 0xc333, 0xf8e2, 0x4d51, 0xeb5f, 0xfefc, 0x4865, 0xe34b, 0xb937, 0x2748, 0x0266, 0xc562, 0x3a6b, 0x25b1, 0xd774, 0x2daa, 0x2313, 0xb311, 0xef4a, 0x32e8, 0xcf60, 0xf8b2, 0x51fb, 0xee07, 0xf368, 0x44ab, 0xe548, 0xb2da, 0x24f2, 0x07b3, 0xc446, 0x3bc4, 0x2db3, 0xd779, 0x2ee4, 0x281e, 0xace1, 0xe4c5, 0x335a, 0xceab, 0xf17b, 0x55c7, 0xf4d4, 0xf24d, 0x4603, 0xeb3d, 0xaf65, 0x1bbf, 0x08f3, 0xbf31, 0x300f, 0x30d1, 0xd9cf, 0x29ba, 0x2ead, 0xb5b6, 0xdd53, 0x2dff, 0xcf0d, 0xe2d2, 0x4b14, 0xf7cf, 0xf104, 0x48fe, 0xf5f9, 0xb102, 0x175c, 0x0bd9, 0xbcb2, 0x27b4, 0x336a, 0xd7be, 0x2088, 0x3408, 0xbf37, 0xdc20, 0x3264, 0xdb9f, 0xe60e, 0x5013, 0xffb1, 0xe856, 0x4281, 0xff01, 0xb10f, 0x1094, 0x176a, 0xc863, 0x243b, 0x390b, 0xdf6d, 0x1d95, 0x3900, 0xc65f, 0xd25c, 0x2c3a, 0xe187, 0xdbeb, 0x465f, 0x0986, 0xeb79, 0x4044, 0x0711, 0xb0da, 0x0496, 0x1513, 0xc287, 0x187b, 0x3c78, 0xe032, 0x1521, 0x3c5f, 0xccc3, 0xcce1, 0x2b96, 0xe4ca, 0xd2ba, 0x430a, 0x0aa2, 0xdffc, 0x3ad9, 0x0be5, 0xaea0, 0x03b6, 0x1ba6, 0xbbed, 0x0db5, 0x4113, 0xdc05, 0x05bb, 0x3a65, 0xcc55, 0xc14b, 0x25ec, 0xe783, 0xd1d2, 0x4965, 0x1616, 0xdbb4, 0x3263, 0x0a8b, 0xa569, 0xf7cf, 0x1f57, 0xc4d2, 0x1559, 0x517f, 0xea47, 0x0848, 0x3a1f, 0xc9f1, 0xbb1e, 0x266f, 0xea60, 0xcd1c, 0x4d59, 0x23a6, 0xe328, 0x3b46, 0x19d2, 0xabe2, 0xf47d, 0x1e1a, 0xbcd3, 0x09ed, 0x4fb3, 0xe964, 0x0dbc, 0x485b, 0xd3bb, 0xbbbe, 0x2722, 0xffc5, 0xce39, 0x0d09, 0xfe2c, 0x112d, 0x596c, 0x16f5, 0xd170, 0x12a7, 0x07ab, 0xa521, 0xd945, 0x0290, 0xcf7b, 0x0c60, 0x5af6, 0x3c64, 0x1c78, 0x2c17, 0xf082, 0xb62e, 0xcf0c, 0xac7d, 0xba75, 0x27ac, 0x23af, 0xf129, 0x473d, 0x6f3b, 0xefd4, 0xd0fc, 0xfcb5, 0xc5fa, 0xa532, 0xe2aa, 0x08ff, 0x0704, 0x304a, 0x21e6, 0x0f85, 0x38c1, 0x010f, 0xbcdf, 0xd894, 0xf8ab, 0xd8c7, 0xe36a, 0x1b7a, 0x178e, 0x1a72, 0x1741, 0x157f, 0x1dd4, 0x0dfe, 0xe47e, 0xbdd3, 0xf139, 0xe9ae, 0xc861, 0x198e, 0x432e, 0x1c93, 0x1246, 0x4ca3, 0x23d4, 0xd5a3, 0xdda1, 0xc097, 0xcd1a, 0xeddd, 0xed1a, 0x1738, 0x5658, 0x41b1, 0xfba0, 0x3319, 0x2a1d, 0xc048, 0xc0cf, 0xd583, 0xd4c9, 0xdb7a, 0x070a, 0x2588, 0x3798, 0x3aa9, 0x0add, 0x25af, 0x2337, 0xd4c2, 0xb504, 0xca8a, 0xe4dd, 0xd039, 0xf1df, 0x2bb9, 0x3c1d, 0x3426, 0x22ac, 0x331f, 0x0f10, 0xdc7d, 0xbbe1, 0xb47c, 0xdb63, 0xd984, 0xfcbd, 0x450f, 0x5431, 0x271a, 0x210b, 0x3c62, 0xf43d, 0xc565, 0xc201, 0xc114, 0xe4f6, 0xee9b, 0x085b, 0x3cf5, 0x5653, 0x1e82, 0x0d52, 0x38a8, 0xf608, 0xc456, 0xce8b, 0xcfd1, 0xda08, 0xf0f6, 0x16f4, 0x3014, 0x4610, 0x1a46, 0x0c35, 0x36d1, 0xfb60, 0xbc9c, 0xbcea, 0xdb0c, 0xda74, 0xdb6c, 0x17ce, 0x3715, 0x33b3, 0x13c8, 0x1e7d, 0x290c, 0xe55b, 0xb756, 0xb135, 0xdad6, 0xde70, 0xd336, 0x1782, 0x43a0, 0x29e5, 0x03f8, 0x2c8f, 0x2768, 0xd396, 0xc0e1, 0xbc23, 0xccce, 0xdf32, 0xe829, 0x16bf, 0x4610, 0x3567, 0x012e, 0x312c, 0x3059, 0xcf4c, 0xbc48, 0xcf7d, 0xdb0c, 0xd4f7, 0xefe3, 0x2327, 0x3f5e, 0x34bf, 0x11d9, 0x3885, 0x2a09, 0xd700, 0xbd59, 0xc753, 0xde26, 0xd765, 0xf612, 0x31cc, 0x45d3, 0x2d56, 0x17c3, 0x3e94, 0x16b7, 0xce82, 0xc389, 0xc8ab, 0xdd9d, 0xdd82, 0xfe36, 0x3550, 0x4d5b, 0x2a45, 0x1384, 0x3ff2, 0x0ef3, 0xc81d, 0xbe61, 0xcce9, 0xe4aa, 0xe0ab, 0x0699, 0x385e, 0x486b, 0x2294, 0x15f0, 0x3d85, 0x01db, 0xc686, 0xc116, 0xcff5, 0xe34d, 0xe14b, 0x10c9, 0x3f07, 0x466b, 0x1f0d, 0x1d05, 0x3ab5, 0xf8ef, 0xc8ce, 0xc05e, 0xd357, 0xe7d4, 0xe29f, 0x13df, 0x471a, 0x4a47, 0x1c4c, 0x297f, 0x3e3f, 0xed74, 0xc6f8, 0xbfdc, 0xccde, 0xe3d5, 0xeaa0, 0x19ee, 0x4b1b, 0x4d49, 0x1865, 0x2976, 0x37a0, 0xe1a2, 0xb9e8, 0xba35, 0xd299, 0xde2b, 0xecfc, 0x27c6, 0x4ae2, 0x4564, 0x19a4, 0x28b5, 0x2426, 0xd885, 0xbc0a, 0xb90e, 0xd777, 0xe284, 0xf34a, 0x2d9a, 0x4813, 0x38b9, 0x14ee, 0x2c67, 0x1894, 0xd324, 0xbc7e, 0xb3bc, 0xda55, 0xe3e2, 0xef0a, 0x2fd7, 0x4da0, 0x2e6a, 0x0ee2, 0x326e, 0x0fc1, 0xcb23, 0xbee7, 0xb82c, 0xdaac, 0xe70d, 0xf676, 0x2c96, 0x4efe, 0x3180, 0x0f59, 0x3430, 0x0900, 0xc464, 0xbdf3, 0xbfd4, 0xdc18, 0xe54f, 0x02ac, 0x346a, 0x4ca2, 0x2bdb, 0x0ba0, 0x2ca5, 0x00e4, 0xc0c2, 0xb4ae, 0xbea2, 0xdd3b, 0xe1b5, 0x05e5, 0x36cd, 0x455d, 0x228c, 0x0f39, 0x2721, 0xf06a, 0xbe3c, 0xb625, 0xc315, 0xe0db, 0xe130, 0x0824, 0x3af9, 0x4450, 0x1a04, 0x1254, 0x2a20, 0xeab7, 0xbec0, 0xb857, 0xc3f1, 0xdf5a, 0xe831, 0x122e, 0x3daa, 0x44fa, 0x18f6, 0x1739, 0x28bb, 0xe41d, 0xbbf3, 0xb89c, 0xcff6, 0xe5c1, 0xea00, 0x1c60, 0x45d5, 0x43ef, 0x1c06, 0x2434, 0x292a, 0xe39e, 0xc2cb, 0xbd71, 0xd5c4, 0xe95c, 0xf5d3, 0x2a36, 0x4b75, 0x403d, 0x1c75, 0x32bf, 0x27ef, 0xdda2, 0xcb76, 0xc7c5, 0xdb1a, 0xe84b, 0xf612, 0x2b74, 0x5112, 0x4137, 0x18a7, 0x3889, 0x2791, 0xd8ed, 0xc90a, 0xc6c8, 0xd83c, 0xe5cf, 0x01d1, 0x32e1, 0x4e08, 0x3e77, 0x1bcc, 0x39cc, 0x1bcb, 0xcf7c, 0xbfad, 0xc693, 0xe1af, 0xe44a, 0x0379, 0x3b80, 0x5122, 0x34da, 0x12cd, 0x2ff7, 0x0b3f, 0xcb7c, 0xb95e, 0xc0f4, 0xe555, 0xe1ce, 0x01a1, 0x3cc9, 0x475e, 0x2196, 0x156a, 0x33d5, 0xf97d, 0xc4c1, 0xb9ed, 0xbd90, 0xe1db, 0xe24b, 0x021d, 0x3cfa, 0x4dca, 0x1ea3, 0x12f7, 0x33e9, 0xf159, 0xbf15, 0xb984, 0xbdf4, 0xd9dc, 0xe483, 0x0d28, 0x3bb5, 0x4aee, 0x1fcf, 0x1792, 0x2e75, 0xe773, 0xb55d, 0xaeed, 0xc525, 0xdc07, 0xe07a, 0x162d, 0x403a, 0x41df, 0x18e6, 0x1816, 0x22ca, 0xe0d7, 0xba3f, 0xab7d, 0xc6d9, 0xe296, 0xe464, 0x1a6b, 0x45ec, 0x3cb4, 0x1203, 0x21d7, 0x1e19, 0xd553, 0xc042, 0xb44a, 0xca17, 0xe29f, 0xe893, 0x1a35, 0x457e, 0x3ca4, 0x0eee, 0x274f, 0x1dc0, 0xd010, 0xbe2a, 0xb43a, 0xca4c, 0xe2e4, 0xf448, 0x246d, 0x4965, 0x3fdb, 0x10f7, 0x25b8, 0x162e, 0xcca7, 0xb882, 0xb947, 0xd7a5, 0xe438, 0xfea1, 0x33b7, 0x4cfe, 0x3b14, 0x1175, 0x24b7, 0x0bf7, 0xcecd, 0xbc06, 0xbdfc, 0xe81e, 0xee24, 0x01b0, 0x3af8, 0x476e, 0x28b0, 0x20d9, 0x3412, 0xf8f1, 0xc8c9, 0xbcf1, 0xbe75, 0xed66, 0xf061, 0x0477, 0x2e04, 0x4a13, 0x58d9, 0x3473, 0x0a86, 0xde23, 0xc927, 0xa391, 0xa85a, 0xfd01, 0x01c0, 0x26a1, 0x8016, 0x6b60, 0x1f2e, 0x05f0, 0xdab1, 0x948b, 0xb8c2, 0xc47d, 0xcb07, 0x3e6c, 0x61b3, 0x38d1, 0x421e, 0x423b, 0xe147, 0xbac6, 0xe0e9, 0xbe22, 0xd9dd, 0x0b3a, 0x03de, 0x31f4, 0x40dc, 0xf8e0, 0xf398, 0x2cdd, 0xec3a, 0xc582, 0x25ea, 0x1c58, 0xd8cd, 0x0700, 0x13d5, 0xbffb, 0xdfbf, 0x2eeb, 0xf5a6, 0x0a90, 0x5506, 0x0dfc, 0xf5d4, 0x194f, 0xd0b1, 0xa469, 0xf944, 0x0659, 0xe225, 0x3e8d, 0x4455, 0xf804, 0x285d, 0x16e8, 0xac54, 0xcbe6, 0x0dc1, 0xcfa2, 0xef3a, 0x51ba, 0x0cea, 0x02d9, 0x4169, 0xec8e, 0xb42c, 0x04b3, 0xfdcb, 0xc5c1, 0x233b, 0x2fa0, 0xe530, 0x27ec, 0x2937, 0xc096, 0xdeaa, 0x2435, 0xe010, 0xe6f7, 0x3e0a, 0xfd91, 0xeb2e, 0x333b, 0xf30c, 0xb2be, 0x1250, 0x1fd9, 0xc7fa, 0x1877, 0x3b5d, 0xdbdb, 0x0644, 0x23bb, 0xbdc0, 0xcc54, 0x2f0c, 0xf1f3, 0xe57b, 0x48e5, 0x082c, 0xe598, 0x360e, 0xf80f, 0xa876, 0x0659, 0x1b42, 0xc57b, 0x1fb9, 0x48cb, 0xe657, 0x1591, 0x3682, 0xcb26, 0xccd4, 0x2692, 0xe8fa, 0xda38, 0x445f, 0x1220, 0xf0e0, 0x3d8f, 0x09d0, 0xb6bc, 0x00e1, 0x260a, 0xd188, 0x0576, 0x3935, 0xef31, 0x1179, 0x33e9, 0xd401, 0xcde0, 0x2d56, 0xfa21, 0xdbb0, 0x4a3c, 0x1c17, 0xdc92, 0x334e, 0x1ceb, 0xb17d, 0xebbf, 0x27e0, 0xd919, 0x0f7e, 0x4a4b, 0xf20c, 0x107b, 0x3a20, 0xcab0, 0xba0a, 0x24cb, 0xf1fa, 0xcaf2, 0x3f6a, 0x2005, 0xe495, 0x30ba, 0x16ef, 0xb7a7, 0xec01, 0x1401, 0xc9b7, 0x05b6, 0x393b, 0xe12d, 0x07bf, 0x44cb, 0xdee8, 0xbd85, 0x23f1, 0xfc20, 0xc5f2, 0x2bd6, 0x194b, 0xdfc0, 0x26e3, 0x160b, 0xba3e, 0xf25d, 0x2457, 0xcdc4, 0x004b, 0x4634, 0xe4dc, 0xf4a7, 0x3d04, 0xdcc3, 0xb397, 0x1fb0, 0x0021, 0xcbc7, 0x37a0, 0x223d, 0xdd2e, 0x2e4a, 0x1e22, 0xae9d, 0xea89, 0x28db, 0xc94f, 0xf4c9, 0x4a0c, 0xf565, 0xfefa, 0x4525, 0xee89, 0xbfb1, 0x1b8b, 0xfa5c, 0xc436, 0x2f51, 0x24ca, 0xdfcd, 0x2cf4, 0x2a31, 0xbd55, 0xe94e, 0x2b96, 0xd147, 0xee2f, 0x4235, 0xf2bf, 0xf601, 0x3b75, 0xe821, 0xb876, 0x1f6c, 0x056a, 0xc597, 0x378b, 0x2e60, 0xd377, 0x1e9d, 0x283c, 0xb892, 0xdee1, 0x2781, 0xd1f0, 0xf4ba, 0x554c, 0x0123, 0xf9be, 0x420b, 0xea52, 0xaa76, 0x121d, 0x04f0, 0xbdca, 0x333f, 0x4315, 0xe753, 0x27d8, 0x325a, 0xb873, 0xd272, 0x2388, 0xcf65, 0xe913, 0x57fe, 0x07f4, 0xf542, 0x4773, 0xf6c7, 0xab18, 0x11a2, 0x0c42, 0xb926, 0x2816, 0x3c96, 0xde7c, 0x28fb, 0x3ab1, 0xb843, 0xd1f6, 0x2e08, 0xd30e, 0xdd67, 0x552d, 0x04b1, 0xe6f1, 0x4408, 0xfac7, 0xa436, 0x0956, 0x1138, 0xb9e0, 0x267a, 0x42e3, 0xd676, 0x199d, 0x3443, 0xb086, 0xc200, 0x28e5, 0xda7a, 0xd827, 0x53d9, 0x0bab, 0xe3c1, 0x40a6, 0xfc98, 0xa29e, 0x018f, 0x1105, 0xb6e7, 0x1b43, 0x498c, 0xdd00, 0x1541, 0x4138, 0xc0de, 0xbf2e, 0x283d, 0xe09c, 0xce50, 0x4aa8, 0x1053, 0xdfdb, 0x3f0a, 0x0676, 0xa0c4, 0xfe21, 0x1b86, 0xb753, 0x10a7, 0x4958, 0xd934, 0x0821, 0x3f0a, 0xc34f, 0xba57, 0x2b9e, 0xe817, 0xc7b8, 0x46a9, 0x0faa, 0xd39d, 0x38e6, 0x0b67, 0x9f2e, 0xfa87, 0x2298, 0xbafd, 0x0a31, 0x466b, 0xd41d, 0xfd51, 0x3a2b, 0xc101, 0xb40d, 0x2b20, 0xef1f, 0xc9c0, 0x46b9, 0x10a8, 0xce9c, 0x3371, 0x097d, 0x9c55, 0xf5c4, 0x3090, 0xd2df, 0xecd4, 0x147e, 0xe806, 0x2e2d, 0x4ebd, 0xe525, 0xe179, 0x26a7, 0xd61d, 0xaa44, 0x0053, 0xe8dc, 0xe136, 0x46b6, 0x57fc, 0x24b5, 0x2da9, 0x235d, 0xcd31, 0xca81, 0xd1c7, 0xaf26, 0xfdb0, 0x3bad, 0x09ac, 0x1da0, 0x74cf, 0x3a9c, 0xd9e6, 0xf662, 0xf1b3, 0xb74e, 0xc78b, 0x079d, 0x1303, 0x25f7, 0x3f88, 0x14f4, 0x2459, 0x2c9b, 0xdd69, 0xc8da, 0xfb0c, 0xfc56, 0xd94a, 0x0b6d, 0x29c0, 0x150a, 0x22e5, 0x1d92, 0x18ef, 0x1cfc, 0x0c23, 0xcdc3, 0xcd7b, 0x0116, 0xd225, 0xea05, 0x3ecf, 0x321c, 0x114b, 0x3429, 0x4818, 0xf80f, 0xe0f6, 0xd86d, 0xb88f, 0xe34c, 0xec85, 0xf335, 0x37f0, 0x5dfb, 0x1c42, 0x11db, 0x4f23, 0xfc26, 0xba44, 0xd5aa, 0xd324, 0xd1fd, 0xf17c, 0x1856, 0x276a, 0x4692, 0x286a, 0x0ba3, 0x3d7b, 0x1150, 0xc1ac, 0xbdf0, 0xe136, 0xd542, 0xcf26, 0x1384, 0x2faf, 0x3870, 0x2e2c, 0x2318, 0x28d4, 0xfdee, 0xcb16, 0xa730, 0xc88d, 0xdb00, 0xceb6, 0x1995, 0x4d9d, 0x384a, 0x1a5c, 0x3253, 0x2473, 0xd8f1, 0xc53c, 0xafa7, 0xc440, 0xe9ed, 0xe807, 0x176e, 0x51f8, 0x4372, 0x074b, 0x2912, 0x2b6d, 0xcf1e, 0xc37a, 0xc518, 0xc3a3, 0xdc9c, 0xfa3e, 0x1a98, 0x40fa, 0x4783, 0x0983, 0x2539, 0x3545, 0xd15a, 0xad3e, 0xc7ca, 0xd8f8, 0xd06d, 0xf96a, 0x3340, 0x3d0f, 0x375f, 0x19a1, 0x2cbe, 0x2480, 0xd619, 0xaa0f, 0xbfde, 0xe9c8, 0xd157, 0xf05e, 0x42af, 0x4a8c, 0x2ada, 0x1e55, 0x372a, 0x09e1, 0xcd35, 0xbbbe, 0xb8fb, 0xe193, 0xe480, 0xf329, 0x3476, 0x51aa, 0x233d, 0x1102, 0x44ce, 0x08c4, 0xbbca, 0xc158, 0xc692, 0xd1e1, 0xdde2, 0x0656, 0x33cd, 0x4f74, 0x2ddc, 0x0f4d, 0x394e, 0x09e6, 0xbe5c, 0xb5ad, 0xcc4d, 0xdc27, 0xdab2, 0x1043, 0x3ea4, 0x479b, 0x2b41, 0x1d61, 0x308b, 0xf8bb, 0xc464, 0xb735, 0xcd64, 0xe75e, 0xe437, 0x161f, 0x4870, 0x48ad, 0x1c9b, 0x1ea2, 0x33d1, 0xf0d7, 0xc828, 0xc0cf, 0xd2aa, 0xe99c, 0xeb83, 0x1a23, 0x47fe, 0x4a7b, 0x1905, 0x1e38, 0x324a, 0xe958, 0xc1e9, 0xc325, 0xd7e4, 0xe635, 0xf2dc, 0x2267, 0x3faa, 0x415f, 0x1a59, 0x202f, 0x2852, 0xe889, 0xc4bd, 0xbe6c, 0xdab6, 0xe56a, 0xef10, 0x26eb, 0x4556, 0x3a6e, 0x180a, 0x2a09, 0x1fb9, 0xde8b, 0xc5cf, 0xb9e8, 0xd7a7, 0xe7b9, 0xedd9, 0x2300, 0x49df, 0x37d1, 0x12a8, 0x2f9a, 0x18aa, 0xce1b, 0xbdb0, 0xbc6b, 0xd29e, 0xdeee, 0xf71a, 0x2781, 0x45f4, 0x339d, 0x0ccf, 0x2b8f, 0x12d6, 0xc8e8, 0xb6b6, 0xbda1, 0xd3af, 0xd912, 0xfe42, 0x2d6d, 0x3ef8, 0x304b, 0x1689, 0x29cf, 0x067c, 0xcba1, 0xb57d, 0xbede, 0xdf90, 0xdc36, 0xfffb, 0x3465, 0x3c40, 0x2128, 0x1a44, 0x31e1, 0xfd23, 0xcc9c, 0xbac3, 0xbc48, 0xdd17, 0xde23, 0xfd31, 0x3137, 0x4362, 0x1eee, 0x18fc, 0x32b8, 0xf20e, 0xc5cc, 0xbb44, 0xbdcc, 0xd9bd, 0xe2e3, 0x076b, 0x353c, 0x4892, 0x1e7b, 0x18f6, 0x30cf, 0xea76, 0xbae7, 0xb387, 0xc4fa, 0xdcc0, 0xe7b8, 0x15fe, 0x3d5b, 0x45ed, 0x199f, 0x192d, 0x2670, 0xe39c, 0xbd23, 0xb49a, 0xce79, 0xe000, 0xe7b3, 0x1c0b, 0x42fb, 0x4231, 0x1500, 0x214f, 0x24b7, 0xddd0, 0xbdaf, 0xb443, 0xd1d6, 0xe488, 0xf035, 0x248c, 0x481a, 0x412e, 0x17e3, 0x2a09, 0x1e55, 0xd730, 0xbb6d, 0xb458, 0xd6fe, 0xe4f4, 0xf65d, 0x30dd, 0x50e1, 0x3ee0, 0x15ff, 0x2a77, 0x133f, 0xd208, 0xbb41, 0xb5d0, 0xdc9b, 0xea0f, 0xfe2e, 0x33e8, 0x4ec6, 0x3729, 0x17b0, 0x327e, 0x0ae7, 0xcbb1, 0xbd40, 0xbbb0, 0xe021, 0xe92f, 0x0274, 0x3a54, 0x53fa, 0x3201, 0x1417, 0x340a, 0x073d, 0xcaf8, 0xbd21, 0xbddc, 0xdfe9, 0xebda, 0x0cee, 0x3df0, 0x5410, 0x3025, 0x16c7, 0x32e0, 0xfb90, 0xc1f6, 0xbac8, 0xcb01, 0xe852, 0xeb00, 0x14bb, 0x4362, 0x4e09, 0x267e, 0x175e, 0x2ea6, 0xf673, 0xc679, 0xb7ca, 0xce42, 0xef38, 0xea88, 0x19da, 0x4c19, 0x4976, 0x1f9b, 0x2155, 0x2984, 0xe747, 0xc939, 0xbc60, 0xced0, 0xf05b, 0xef4a, 0x1a1b, 0x4d06, 0x49db, 0x1707, 0x21a4, 0x261f, 0xdb58, 0xc42f, 0xbd07, 0xcd03, 0xeb57, 0xf6f1, 0x1fe4, 0x4885, 0x45cb, 0x1391, 0x2121, 0x232c, 0xd7ec, 0xbd29, 0xbf59, 0xd799, 0xe575, 0xf6b7, 0x28c6, 0x4774, 0x3e39, 0x1137, 0x1ef7, 0x1744, 0xd610, 0xbc35, 0xb9e4, 0xdd70, 0xe860, 0xf41e, 0x2929, 0x4423, 0x2e1c, 0x110a, 0x2d77, 0x0e41, 0xced2, 0xc1cd, 0xbb1d, 0xd9b8, 0xe41e, 0xf4ed, 0x2b8f, 0x4959, 0x2b92, 0x0f36, 0x32ac, 0x0962, 0xc983, 0xc063, 0xbadd, 0xd65d, 0xe557, 0xfe42, 0x2c4a, 0x49b0, 0x2cc4, 0x11af, 0x335e, 0x0099, 0xbfb6, 0xb950, 0xc282, 0xda13, 0xe2c3, 0x0c6b, 0x2301, 0x3d0d, 0x5b32, 0x2bf1, 0xf816, 0xd811, 0xc694, 0x94e5, 0xa76b, 0x02b3, 0xf90f, 0x23f0, 0x863b, 0x6a8b, 0x1164, 0xf826, 0xd412, 0x8d7c, 0xade7, 0xbb44, 0xce06, 0x446e, 0x60cd, 0x37d3, 0x464b, 0x4603, 0xdb1a, 0xadc9, 0xd748, 0xbb79, 0xd2d1, 0x0130, 0x0928, 0x3b0a, 0x4390, 0x0002, 0xef18, 0x25c7, 0xf662, 0xbcac, 0x1201, 0x1f14, 0xda32, 0xff28, 0x1fbe, 0xd1ed, 0xd6db, 0x389e, 0x0dbf, 0xf3fb, 0x488e, 0x1c7e, 0xe70e, 0x1374, 0xed9e, 0xa6a3, 0xedff, 0x24fa, 0xe3d7, 0x2454, 0x55ff, 0xfbf6, 0x19ad, 0x27e2, 0xbe48, 0xc206, 0x1296, 0xe45b, 0xdd35, 0x4db6, 0x1c33, 0xef46, 0x4348, 0x0b24, 0xb5eb, 0xf732, 0x126a, 0xcd2b, 0x063c, 0x37c5, 0xec01, 0x18d9, 0x3cc8, 0xd616, 0xd2bc, 0x273a, 0xf84b, 0xd381, 0x30e7, 0x1385, 0xdff9, 0x30f4, 0x18b0, 0xc10e, 0x0696, 0x364d, 0xd762, 0xfbf8, 0x3d8c, 0xe397, 0xf63d, 0x3932, 0xe0e0, 0xc7fb, 0x31c6, 0x0e47, 0xd472, 0x33f1, 0x19cb, 0xd9b6, 0x297e, 0x174d, 0xb770, 0xf385, 0x2b80, 0xd844, 0x020b, 0x44ae, 0xecdc, 0xffc6, 0x3c84, 0xe59b, 0xc239, 0x1b9c, 0x03d8, 0xcdfc, 0x284d, 0x2050, 0xe856, 0x29ba, 0x1da6, 0xc79c, 0xf13e, 0x2a8b, 0xdb89, 0xe7cf, 0x315a, 0xf321, 0xf5f9, 0x332c, 0xf230, 0xc508, 0x1566, 0x093d, 0xce9a, 0x23e7, 0x1dac, 0xd1bc, 0x1aa1, 0x2c3b, 0xbf9a, 0xd5cb, 0x286f, 0xe374, 0xeccb, 0x3bb8, 0xfa4b, 0xf5e8, 0x2f2d, 0xe9fe, 0xbb23, 0x0ce2, 0xff3a, 0xc469, 0x2484, 0x2c01, 0xe186, 0x1b3d, 0x26db, 0xc966, 0xd43c, 0x0cf6, 0xd3cc, 0xeaf1, 0x349d, 0xf49e, 0xfa1b, 0x3da3, 0xf2ae, 0xb5a2, 0x09f1, 0x0303, 0xbee6, 0x1c15, 0x2f77, 0xe137, 0x187e, 0x2a96, 0xc3d0, 0xd414, 0x1e88, 0xd685, 0xe774, 0x4a59, 0xfa19, 0xe6e2, 0x3f71, 0xf365, 0xa657, 0x0aac, 0x0b27, 0xbbf9, 0x22a4, 0x3896, 0xdde2, 0x1ea6, 0x2ddb, 0xb6a3, 0xcf13, 0x234d, 0xd209, 0xdfcd, 0x4de4, 0x0530, 0xf235, 0x458e, 0xfe1c, 0xaf9c, 0x04ff, 0x0ba8, 0xc04a, 0x1dfe, 0x3a8f, 0xe44e, 0x1ebd, 0x3786, 0xc838, 0xd340, 0x2d49, 0xe462, 0xdc75, 0x4606, 0x05e5, 0xe8d6, 0x3e07, 0x0367, 0xb349, 0x0d09, 0x1be3, 0xc56a, 0x2148, 0x4004, 0xd8d7, 0x1595, 0x3a7d, 0xc56d, 0xd126, 0x3261, 0xe7bb, 0xe124, 0x5308, 0x0eb8, 0xeb26, 0x437a, 0x042c, 0xaf26, 0x0eb2, 0x218d, 0xc6ad, 0x22c2, 0x4ab9, 0xe2d2, 0x1874, 0x40cd, 0xca8d, 0xc838, 0x2e68, 0xedb9, 0xd7fa, 0x4c7a, 0x1526, 0xe7cb, 0x4150, 0x0c9e, 0xae99, 0x0430, 0x20bb, 0xc1b5, 0x1187, 0x47d4, 0xe4da, 0x1440, 0x42ec, 0xcdff, 0xc6df, 0x2c13, 0xec08, 0xd2d5, 0x46ed, 0x0ef1, 0xdd36, 0x3d9e, 0x0f6f, 0xadf9, 0x0331, 0x2434, 0xc516, 0x0f43, 0x4485, 0xde32, 0x0700, 0x3d61, 0xce91, 0xbeff, 0x2926, 0xf4fa, 0xd134, 0x41a9, 0x1664, 0xdc49, 0x34e2, 0x1333, 0xace3, 0xf361, 0x1f70, 0xc693, 0x0699, 0x47e9, 0xe934, 0x0537, 0x4024, 0xd7ae, 0xba09, 0x1da8, 0xf1cd, 0xcbb4, 0x3981, 0x188e, 0xddeb, 0x326b, 0x1892, 0xb095, 0xf130, 0x20bc, 0xc29d, 0xf9a7, 0x3f9b, 0xe3d4, 0xfb7a, 0x3e64, 0xdf3d, 0xbe59, 0x2395, 0xf6d6, 0xc4b9, 0x3386, 0x1936, 0xd767, 0x2b7a, 0x1dd1, 0xb547, 0xeefe, 0x2814, 0xcaa5, 0xf817, 0x487c, 0xeb89, 0xf26b, 0x397c, 0xdf7f, 0xb39b, 0x1c04, 0xfe68, 0xc54d, 0x349f, 0x2a68, 0xdbdd, 0x22d6, 0x1ddd, 0xb0a0, 0xe0fa, 0x21cc, 0xc993, 0xf898, 0x52ec, 0xf689, 0xf70a, 0x426a, 0xe741, 0xaf61, 0x151d, 0xf921, 0xc0cc, 0x3886, 0x3002, 0xdf54, 0x2dc5, 0x25fe, 0xb022, 0xe019, 0x2b01, 0xdc46, 0xdf34, 0x113b, 0xf3ef, 0x2b9e, 0x5380, 0xf6a9, 0xdedb, 0x2143, 0xe2d9, 0xa1ed, 0xf09b, 0xf0dc, 0xdb67, 0x3407, 0x5e55, 0x32ca, 0x27e1, 0x25c5, 0xd709, 0xc36a, 0xcfc9, 0xa7f8, 0xea51, 0x3bd7, 0x0e16, 0x0801, 0x6978, 0x4f5b, 0xdcee, 0xefc1, 0xfe47, 0xbe36, 0xbc03, 0xf6fb, 0x0a54, 0x1b49, 0x3bd0, 0x15ec, 0x2382, 0x3cb2, 0xeb19, 0xc5aa, 0xedb7, 0xf957, 0xd7a6, 0xf768, 0x22e7, 0x17a3, 0x2061, 0x1ba7, 0x1fd9, 0x23d8, 0x0c01, 0xd667, 0xc4b5, 0xfb1e, 0xd994, 0xd7e9, 0x3398, 0x3e92, 0x166b, 0x27af, 0x4ec2, 0x0515, 0xd7d3, 0xde1a, 0xb994, 0xdcbe, 0xf079, 0xeced, 0x2d31, 0x5f61, 0x253a, 0x040a, 0x4aa6, 0x0dcf, 0xb7f1, 0xcf3e, 0xd1b1, 0xcf61, 0xe63f, 0x105c, 0x26cc, 0x431a, 0x31ef, 0x089d, 0x3279, 0x1505, 0xc9c8, 0xbc77, 0xd253, 0xdbe3, 0xd185, 0x028c, 0x2ef7, 0x3d5b, 0x2ff3, 0x2436, 0x2ecc, 0xffae, 0xd27d, 0xae72, 0xb7bb, 0xda8b, 0xd2ea, 0x0b5f, 0x4d03, 0x43e6, 0x19f3, 0x2a63, 0x2e3d, 0xdc83, 0xc2d3, 0xb8a6, 0xbf1e, 0xe681, 0xe9fe, 0x0c02, 0x47ed, 0x4b9b, 0x0b96, 0x1c09, 0x3193, 0xdad3, 0xc2e7, 0xcba3, 0xc7a2, 0xd979, 0xf765, 0x1768, 0x34eb, 0x4272, 0x0e6d, 0x1cba, 0x35bf, 0xe2f7, 0xb4ec, 0xc2dc, 0xdbc9, 0xd4b0, 0xeaf5, 0x2a04, 0x3d45, 0x3135, 0x163c, 0x29bf, 0x1de9, 0xd862, 0xb512, 0xbc25, 0xe60f, 0xdb2d, 0xe4e1, 0x2e4c, 0x46ed, 0x2280, 0x0c95, 0x3390, 0x0dba, 0xc912, 0xc227, 0xbe99, 0xd9c1, 0xe290, 0xed33, 0x2239, 0x44f4, 0x1ed4, 0x0166, 0x3720, 0x122c, 0xc1e5, 0xbe0b, 0xcc00, 0xd5f1, 0xd17f, 0xf3b3, 0x23a2, 0x3db4, 0x2624, 0x0cc4, 0x33e1, 0x1023, 0xc9ae, 0xb631, 0xc8cd, 0xdd8a, 0xceea, 0xfaf7, 0x3621, 0x3ded, 0x1ca5, 0x1b0d, 0x3ba6, 0x0216, 0xce92, 0xc394, 0xc90e, 0xdd1a, 0xd9c7, 0x0438, 0x3a3b, 0x43f5, 0x193b, 0x1b93, 0x427f, 0xfe8c, 0xc66d, 0xc591, 0xd58c, 0xe393, 0xe1bc, 0x0fe2, 0x3df6, 0x448e, 0x1c8a, 0x21c0, 0x3e71, 0xf9bd, 0xc96f, 0xc456, 0xd5d9, 0xe4b5, 0xe922, 0x1ce5, 0x418b, 0x417b, 0x1d09, 0x2518, 0x341d, 0xf03a, 0xcbea, 0xc1e1, 0xd6e8, 0xe7f3, 0xe55f, 0x1d2e, 0x4954, 0x3f9e, 0x1b23, 0x31e7, 0x3163, 0xe580, 0xcb7b, 0xbe90, 0xd27b, 0xe98e, 0xede5, 0x22f3, 0x51cc, 0x440f, 0x174a, 0x3744, 0x308b, 0xdab4, 0xc2e8, 0xc03f, 0xd50d, 0xe3f9, 0xf766, 0x2e0e, 0x4fbc, 0x4269, 0x17f2, 0x2ec2, 0x1f55, 0xd524, 0xbca2, 0xbb93, 0xda21, 0xe34e, 0xfad1, 0x31b6, 0x47da, 0x36e7, 0x19ff, 0x2ef6, 0x0ef3, 0xd0a0, 0xb94c, 0xb54a, 0xdd97, 0xe171, 0xf86b, 0x35bc, 0x47ba, 0x2983, 0x1694, 0x3324, 0x023b, 0xc961, 0xbc03, 0xb2d4, 0xd7d9, 0xe2e7, 0xf9f7, 0x3391, 0x4b1a, 0x23f3, 0x1255, 0x2f9f, 0xf2dd, 0xbf1b, 0xb8c8, 0xb595, 0xd67b, 0xe49e, 0x04eb, 0x3553, 0x491e, 0x20bc, 0x101c, 0x2d09, 0xefb9, 0xbc9b, 0xb456, 0xbc74, 0xdcb8, 0xe7e3, 0x1085, 0x3e2d, 0x4862, 0x20a4, 0x178e, 0x24e7, 0xe5be, 0xbfc5, 0xb5ac, 0xc6ce, 0xe4c1, 0xe9df, 0x156b, 0x41e6, 0x4347, 0x169b, 0x1dcf, 0x2537, 0xdbdb, 0xbd60, 0xb4ac, 0xc74f, 0xe58f, 0xf1d1, 0x1bdb, 0x438d, 0x41e3, 0x1215, 0x1c5f, 0x197b, 0xd34e, 0xbb05, 0xb7f2, 0xd3b2, 0xe362, 0xf0f9, 0x2581, 0x46a8, 0x3c22, 0x115f, 0x2009, 0x122f, 0xd304, 0xbd34, 0xb54b, 0xd890, 0xe911, 0xf7d8, 0x2be6, 0x4644, 0x3124, 0x11c4, 0x2d7b, 0x0ee0, 0xcfc2, 0xc445, 0xbf59, 0xdf01, 0xe6a3, 0xf6fe, 0x2fa7, 0x4f24, 0x32c6, 0x10fe, 0x360f, 0x14d0, 0xd1fe, 0xc5f6, 0xc3cd, 0xdf16, 0xe84d, 0x00f9, 0x3302, 0x4f34, 0x330f, 0x190f, 0x3c38, 0x0f70, 0xcd2f, 0xc1c9, 0xccf8, 0xe5e1, 0xe528, 0x0d0a, 0x3fdc, 0x4c89, 0x2965, 0x1572, 0x3558, 0x0773, 0xcf30, 0xbe56, 0xcfa1, 0xeeb4, 0xe390, 0x0d40, 0x446b, 0x47d6, 0x22c9, 0x1f4d, 0x33f7, 0xf611, 0xcd9c, 0xbd57, 0xc66d, 0xec7d, 0xe7bf, 0x0df9, 0x474d, 0x4b43, 0x1b2f, 0x1f2d, 0x35f1, 0xea3c, 0xc455, 0xbc6b, 0xc16f, 0xe41e, 0xef9d, 0x16e5, 0x457b, 0x4d9b, 0x1df1, 0x2052, 0x310e, 0xe35e, 0xbd3b, 0xbe4a, 0xd17b, 0xe63a, 0xf0dd, 0x2445, 0x4bde, 0x4c1f, 0x20d2, 0x25a1, 0x2da1, 0xe9a8, 0xc288, 0xb909, 0xd9c6, 0xee3e, 0xf6a6, 0x2ef9, 0x50a3, 0x43ee, 0x1dd3, 0x2eed, 0x2309, 0xe027, 0xcabc, 0xbd16, 0xdbde, 0xee25, 0xf339, 0x2c27, 0x5390, 0x40a0, 0x1b96, 0x375c, 0x1d2b, 0xd734, 0xc78b, 0xb807, 0xd541, 0xecee, 0xfe54, 0x2fa0, 0x5361, 0x3f28, 0x1522, 0x3393, 0x1266, 0xc88d, 0xbc85, 0xb8d2, 0xd4a8, 0xe5ab, 0x0438, 0x3396, 0x4c0c, 0x33cd, 0x0a79, 0x2169, 0xfe45, 0xc2f1, 0xb2f9, 0xb954, 0xe0e9, 0xe165, 0x029e, 0x2aa5, 0x318e, 0x465f, 0x33d0, 0x0444, 0xd0f3, 0xc734, 0xa46c, 0x9309, 0xec1b, 0xfbdf, 0x010e, 0x6440, 0x7e13, 0x1ed8, 0xeedd, 0xe7dd, 0x9c36, 0x94bd, 0xaeea, 0xb4e6, 0x08d9, 0x4ccc, 0x44d3, 0x3995, 0x43b3, 0xfbc8, 0xa9f8, 0xbc47, 0xb7e9, 0xb05c, 0xd4b9, 0x0205, 0x2fad, 0x38f1, 0x145d, 0xf759, 0x0aec, 0xf6cf, 0xb93a, 0xdb0a, 0x14b9, 0xe52f, 0xdb64, 0x2275, 0xfc04, 0xc169, 0x1482, 0x2708, 0xda58, 0x13ad, 0x34f3, 0xe68c, 0xf5c6, 0x0b27, 0xbfca, 0xc11f, 0x1a39, 0xf895, 0xf15a, 0x535e, 0x1fbe, 0xfd1c, 0x2fab, 0xeb46, 0xb207, 0xf114, 0xfe7d, 0xd0f4, 0x2a5f, 0x4be3, 0xf98f, 0x2db3, 0x365b, 0xcbe5, 0xd12f, 0x160e, 0xe93e, 0xe29c, 0x4478, 0x1d6f, 0x0413, 0x49f1, 0x0cdb, 0xc582, 0x08ff, 0x1ce3, 0xd295, 0x10d4, 0x44fb, 0xeff9, 0x15bb, 0x4310, 0xddfd, 0xd8c9, 0x34f7, 0xfaaf, 0xd716, 0x4457, 0x1cff, 0xe28a, 0x3514, 0x1237, 0xb5a9, 0x01cc, 0x3075, 0xd90a, 0x1130, 0x4b8f, 0xf1cd, 0x0fee, 0x37f4, 0xcf77, 0xc32c, 0x262d, 0xfb1f, 0xde11, 0x4cfa, 0x220f, 0xe7b6, 0x379f, 0x1630, 0xb473, 0xeb2b, 0x1f40, 0xcdde, 0xfb49, 0x44ba, 0xf7a8, 0x0b44, 0x3ad4, 0xdf56, 0xbc11, 0x192e, 0xfdae, 0xc1e6, 0x2be2, 0x260a, 0xe13b, 0x285b, 0x1e09, 0xb912, 0xe471, 0x2223, 0xd36d, 0xfe2f, 0x46c5, 0xe36b, 0xf7a8, 0x4755, 0xdf55, 0xa7b3, 0x1a23, 0x0b84, 0xc893, 0x2faf, 0x2991, 0xe2bb, 0x2481, 0x13cb, 0xb383, 0xe0a3, 0x1702, 0xc7e4, 0xf45d, 0x4b67, 0xf6a6, 0xf97a, 0x3e6f, 0xecd9, 0xadf3, 0xfeb4, 0xfd06, 0xc788, 0x1f7a, 0x200a, 0xe5ba, 0x31ba, 0x2511, 0xb3da, 0xe100, 0x2776, 0xc990, 0xe1ba, 0x44f0, 0xef0a, 0xe6e3, 0x3c2c, 0xf024, 0xb397, 0x1376, 0x054e, 0xc2a5, 0x2c7f, 0x2067, 0xc5d1, 0x227f, 0x2507, 0xa6ee, 0xd8b4, 0x2da2, 0xd0d2, 0xe5d2, 0x4ae3, 0xf3c8, 0xec01, 0x3d1d, 0xe4c8, 0xa76d, 0x0cd7, 0x02fe, 0xc051, 0x2a3f, 0x2ff4, 0xd96d, 0x206e, 0x2cdb, 0xbcc2, 0xcfce, 0x1d9e, 0xd936, 0xe286, 0x3c62, 0xf899, 0xf161, 0x4188, 0xfacc, 0xb89c, 0x13b2, 0x0f18, 0xbfc2, 0x1908, 0x2b9b, 0xdd40, 0x1c58, 0x31c8, 0xcc18, 0xe1de, 0x3029, 0xe1a2, 0xeab8, 0x4814, 0xf8bb, 0xec3b, 0x41cd, 0xfd3d, 0xbb42, 0x1ab1, 0x1bc5, 0xd03f, 0x2b94, 0x39e6, 0xe56b, 0x20f6, 0x302f, 0xc7e3, 0xe07e, 0x304b, 0xe35d, 0xef37, 0x556b, 0x0a77, 0xf3f3, 0x471e, 0x0715, 0xb6bf, 0x0a15, 0x15a7, 0xc8f0, 0x27ce, 0x49e1, 0xef3f, 0x24d8, 0x3fc8, 0xcf85, 0xd3a9, 0x2981, 0xe391, 0xe1e2, 0x5568, 0x1a44, 0xf6f8, 0x47a5, 0x0bb1, 0xb4f6, 0x0758, 0x180f, 0xc264, 0x1c7f, 0x4997, 0xe7b6, 0x1790, 0x3eec, 0xcc71, 0xc989, 0x25c5, 0xe0ff, 0xd5eb, 0x4cb5, 0x1585, 0xe9fb, 0x3f4e, 0x079f, 0xa4e8, 0xf8b6, 0x18b7, 0xbe0e, 0x140f, 0x4dcd, 0xe6f8, 0x106e, 0x3e48, 0xc659, 0xb8d1, 0x1fc6, 0xe2f7, 0xcafc, 0x4b21, 0x1aac, 0xddf9, 0x38ef, 0x0d86, 0xa172, 0xefb8, 0x1ae3, 0xb8b9, 0x022b, 0x4952, 0xe3b7, 0x0763, 0x3fb6, 0xcaa1, 0xb546, 0x2034, 0xe7b3, 0xc26e, 0x4341, 0x1b44, 0xd872, 0x37f9, 0x158c, 0xa302, 0xed16, 0x212e, 0xbda6, 0x0112, 0x4eb5, 0xe481, 0x0180, 0x448c, 0xd2be, 0xb34a, 0x2659, 0xf969, 0xc3e7, 0x4253, 0x2498, 0xd3ac, 0x2f84, 0x1c93, 0xa86a, 0xeae4, 0x2be9, 0xc824, 0xfb1e, 0x5254, 0xeb1f, 0xf85a, 0x40c6, 0xd602, 0xacc6, 0x20d2, 0xfcc1, 0xbfa1, 0x3d9b, 0x2b83, 0xd669, 0x2fcc, 0x202d, 0xa65f, 0xe170, 0x2e20, 0xdd4c, 0xe4e8, 0x1128, 0xe9c6, 0x2b2e, 0x54f5, 0xec68, 0xd881, 0x25b3, 0xe44f, 0x9e7f, 0xf130, 0xeb8e, 0xd492, 0x3413, 0x5451, 0x26e6, 0x289d, 0x2623, 0xcf51, 0xbd9d, 0xcfb5, 0xa20d, 0xdfe7, 0x36b7, 0x0cc4, 0x056d, 0x65fe, 0x4dbe, 0xdc03, 0xeb0b, 0xf3c5, 0xb95e, 0xbfab, 0xf463, 0x0575, 0x1cd4, 0x3d59, 0x1332, 0x1c9e, 0x36b2, 0xe6ff, 0xc1d2, 0xebab, 0xf875, 0xd9ed, 0xf751, 0x1ec8, 0x177a, 0x1fdf, 0x14b0, 0x158a, 0x1d8b, 0x09a1, 0xd3cc, 0xc301, 0xfa03, 0xda41, 0xd913, 0x31d2, 0x3bcd, 0x1398, 0x2276, 0x47f0, 0x04ad, 0xdb13, 0xde05, 0xbc40, 0xe0b4, 0xf233, 0xedf8, 0x2b4d, 0x5c62, 0x258d, 0x04db, 0x4756, 0x0b9d, 0xbaa9, 0xd2dc, 0xd3e6, 0xd2e5, 0xeb10, 0x1044, 0x260b, 0x4492, 0x307c, 0x0989, 0x37e3, 0x1952, 0xc9b1, 0xbe5d, 0xd980, 0xdd51, 0xcfb1, 0x0665, 0x3440, 0x3f66, 0x32e5, 0x2caa, 0x3828, 0x04a2, 0xd6f3, 0xb98c, 0xc152, 0xdc75, 0xd7fc, 0x131d, 0x50a8, 0x4584, 0x218f, 0x39e9, 0x3a8c, 0xe3c0, 0xca56, 0xc147, 0xc3c0, 0xe3a0, 0xec33, 0x13df, 0x4aaa, 0x4c83, 0x117c, 0x2896, 0x399a, 0xdc86, 0xc6f6, 0xcd47, 0xc6ce, 0xd9cc, 0xf86e, 0x19ad, 0x3a91, 0x491f, 0x123e, 0x24d9, 0x3cde, 0xe11b, 0xb37c, 0xc2df, 0xd7a4, 0xd130, 0xef29, 0x2c49, 0x3d20, 0x37d9, 0x16ea, 0x291c, 0x26ac, 0xda1f, 0xaaed, 0xb607, 0xe686, 0xd568, 0xe17d, 0x337f, 0x4b43, 0x2881, 0x1389, 0x38c7, 0x12c8, 0xcd26, 0xbcc3, 0xb56e, 0xdd1b, 0xe483, 0xea42, 0x2a90, 0x51ed, 0x261e, 0x0805, 0x4126, 0x1494, 0xbddc, 0xbaf3, 0xc450, 0xd324, 0xd5cd, 0xf712, 0x2ef6, 0x4d20, 0x2af3, 0x0e0c, 0x3762, 0x0ac6, 0xbe79, 0xae49, 0xc076, 0xd8d1, 0xd3ec, 0x0029, 0x3a43, 0x4756, 0x22ca, 0x1958, 0x35d2, 0xf721, 0xbeb2, 0xb3fe, 0xbef0, 0xda1f, 0xdc92, 0x07d3, 0x4050, 0x4bd0, 0x19d3, 0x154a, 0x3522, 0xefeb, 0xbbc4, 0xb715, 0xc994, 0xdf48, 0xe0b3, 0x1046, 0x40b6, 0x462c, 0x16f6, 0x1aab, 0x3230, 0xe981, 0xbd2a, 0xbab3, 0xd2a2, 0xe5c9, 0xe97f, 0x1c0b, 0x466f, 0x4272, 0x167d, 0x2642, 0x3042, 0xe930, 0xc684, 0xbe13, 0xdccc, 0xed63, 0xea9d, 0x2413, 0x5441, 0x43f9, 0x180c, 0x36e2, 0x2e3f, 0xdd7b, 0xc957, 0xc358, 0xdaa2, 0xeec1, 0xf6ba, 0x27c0, 0x5560, 0x448c, 0x1635, 0x38ef, 0x285a, 0xd524, 0xc336, 0xc6ef, 0xdd82, 0xe86a, 0x024a, 0x3514, 0x5243, 0x4024, 0x1679, 0x30ad, 0x19cb, 0xd2e3, 0xbea4, 0xc57f, 0xe4e0, 0xe5d6, 0xfff4, 0x3873, 0x4af7, 0x2f8e, 0x188b, 0x3243, 0x0881, 0xcd5e, 0xbb93, 0xbf31, 0xe52f, 0xe3f9, 0xfc94, 0x39c7, 0x4714, 0x1d41, 0x169d, 0x38c9, 0xfecd, 0xcb1a, 0xc0fc, 0xbdbe, 0xdc75, 0xe1b5, 0xfaa7, 0x3213, 0x48a1, 0x1b68, 0x15dc, 0x3a99, 0xf55f, 0xc01b, 0xbf71, 0xc2a6, 0xd4e4, 0xdf4d, 0x066a, 0x3170, 0x40f1, 0x1a26, 0x18e0, 0x342c, 0xedf9, 0xba41, 0xb3b4, 0xc38e, 0xd795, 0xe02b, 0x10cf, 0x387d, 0x3bf9, 0x151b, 0x1afe, 0x254b, 0xde99, 0xbc43, 0xb3bd, 0xc921, 0xde4a, 0xe189, 0x1332, 0x3ec6, 0x3af6, 0x0d82, 0x1fcf, 0x23ba, 0xd6bf, 0xb847, 0xb180, 0xcc73, 0xe0cc, 0xeb2b, 0x1cb5, 0x417e, 0x395b, 0x0e37, 0x260e, 0x1c37, 0xceea, 0xb693, 0xb466, 0xd44d, 0xde55, 0xeccf, 0x28e9, 0x4c64, 0x3a26, 0x1085, 0x2a16, 0x12d5, 0xcc04, 0xb7f6, 0xb4e4, 0xda25, 0xe424, 0xf801, 0x3387, 0x4c82, 0x2ff0, 0x133d, 0x33da, 0x0a6a, 0xc653, 0xba9f, 0xb9a4, 0xdb0d, 0xe2d3, 0xfd70, 0x3932, 0x535b, 0x2ec6, 0x131d, 0x36f2, 0x041c, 0xc4de, 0xbc13, 0xbb88, 0xdb49, 0xe632, 0x0792, 0x3bf9, 0x5215, 0x2df5, 0x197b, 0x38ba, 0xfc1c, 0xc000, 0xb9c1, 0xc559, 0xe3b9, 0xea55, 0x13bb, 0x45e0, 0x506f, 0x2598, 0x1a8a, 0x31d4, 0xf25d, 0xc2c1, 0xb752, 0xc926, 0xeaa3, 0xebad, 0x18ac, 0x4b3a, 0x4b14, 0x1dc9, 0x246e, 0x2f24, 0xe2ff, 0xc4be, 0xbca8, 0xccb7, 0xee7a, 0xf1d7, 0x1fad, 0x5446, 0x4e8c, 0x1a55, 0x2bfd, 0x2de3, 0xdbcc, 0xc7c4, 0xc19e, 0xcdf0, 0xeebf, 0x0347, 0x2b46, 0x50aa, 0x4efc, 0x1ae7, 0x2bc2, 0x29fc, 0xd661, 0xbcdd, 0xc496, 0xddc3, 0xe917, 0xff6c, 0x336f, 0x4f83, 0x433f, 0x1820, 0x2877, 0x176c, 0xd63d, 0xbf37, 0xbd41, 0xe3e4, 0xec70, 0xfccc, 0x35e8, 0x4cad, 0x2f68, 0x12a7, 0x2fac, 0x08d7, 0xcd76, 0xc4f5, 0xbf59, 0xdfbb, 0xe9f3, 0xfd34, 0x3194, 0x4aa3, 0x2767, 0x0f36, 0x33c2, 0x0048, 0xc54f, 0xc2fd, 0xbd10, 0xd605, 0xe41c, 0xff51, 0x2a83, 0x4801, 0x28e6, 0x0aff, 0x2f62, 0xfdb7, 0xbd39, 0xb775, 0xc18e, 0xd7dc, 0xe021, 0x0a7d, 0x33af, 0x423a, 0x2081, 0x0d26, 0x28f2, 0xf6aa, 0xc604, 0xb20f, 0xca22, 0xf929, 0xe0c9, 0xfe41, 0x2c91, 0x285c, 0x3479, 0x40e1, 0x11dd, 0xd23c, 0xd207, 0xa861, 0xa807, 0xfe96, 0xf904, 0x0d6b, 0x7934, 0x78f8, 0x0f08, 0xfce1, 0xe859, 0x8e1b, 0xa714, 0xc4a3, 0xd05d, 0x3229, 0x6379, 0x4af3, 0x48ea, 0x4a2d, 0xe67d, 0xa875, 0xd782, 0xc120, 0xb7cb, 0xfb9f, 0x1f2e, 0x34e8, 0x4bf0, 0x20cd, 0xf0b2, 0x1643, 0x0563, 0xbcd0, 0xf27f, 0x2741, 0xe7cd, 0xef58, 0x2d5f, 0xebc6, 0xc657, 0x2de0, 0x1cb6, 0xe47e, 0x4360, 0x2d6e, 0xe23e, 0x16ee, 0xf98d, 0xa445, 0xddbb, 0x207f, 0xe2c0, 0x123e, 0x5bce, 0x016d, 0x1099, 0x3582, 0xc93d, 0xb242, 0x0573, 0xeaa3, 0xcd42, 0x3ec8, 0x2edf, 0xedf6, 0x39f9, 0x19b8, 0xb85b, 0xe3bc, 0x1369, 0xd1a8, 0xf1db, 0x3e71, 0xf679, 0x05fa, 0x4211, 0xe5a8, 0xbfbb, 0x17fb, 0x0686, 0xc767, 0x1e4b, 0x24e5, 0xdea8, 0x2460, 0x26bf, 0xbfbf, 0xebef, 0x3662, 0xdb5b, 0xe735, 0x478f, 0xf36f, 0xe6aa, 0x3a12, 0xedab, 0xb885, 0x2168, 0x1a11, 0xd137, 0x2b7c, 0x29a9, 0xd6be, 0x2004, 0x24d0, 0xb744, 0xddad, 0x2f52, 0xe201, 0xeeef, 0x4b3b, 0xfc02, 0xef7b, 0x3d92, 0xf6b9, 0xb6be, 0x0b17, 0x0d77, 0xc534, 0x191c, 0x30b3, 0xe945, 0x23b0, 0x2f3b, 0xc9bb, 0xd7dc, 0x269c, 0xe46c, 0xd902, 0x3766, 0x0212, 0xeb25, 0x39af, 0x03e0, 0xb8e7, 0x077c, 0x169d, 0xcc6f, 0x1b10, 0x2e0e, 0xd19a, 0x0fd8, 0x38f6, 0xca91, 0xc8f9, 0x29d6, 0xf078, 0xdd5c, 0x3b96, 0x09ef, 0xf001, 0x3507, 0xfbb1, 0xb660, 0x03d5, 0x0e0a, 0xc387, 0x17f0, 0x3e5b, 0xe93c, 0x15a4, 0x38a5, 0xd46a, 0xc5fe, 0x1360, 0xe4bc, 0xda9b, 0x39bc, 0x0c8d, 0xef2a, 0x3f9f, 0x0fdb, 0xb193, 0xf8d2, 0x1694, 0xb855, 0xffea, 0x4558, 0xed39, 0x083b, 0x3cd1, 0xda45, 0xc36d, 0x1e6e, 0xe476, 0xc765, 0x430f, 0x19a5, 0xde45, 0x3c55, 0x16d3, 0xa619, 0xf171, 0x1f0a, 0xbe1b, 0x04f9, 0x4d9d, 0xeec4, 0x0d1f, 0x3e78, 0xccbe, 0xb49f, 0x1d9b, 0xeb29, 0xc2b6, 0x448d, 0x28e1, 0xe2a4, 0x3aab, 0x21b9, 0xad2c, 0xe5d9, 0x1d14, 0xbe21, 0xf5ec, 0x4db1, 0xef99, 0x030b, 0x4e45, 0xe3cc, 0xb105, 0x20c5, 0xfc50, 0xb9ac, 0x35e2, 0x2898, 0xd9cf, 0x3397, 0x236d, 0xace6, 0xea90, 0x2c38, 0xc65d, 0xf7eb, 0x5313, 0xe39f, 0xf211, 0x477a, 0xdbe9, 0xad7a, 0x1ffa, 0x0017, 0xc201, 0x3906, 0x27ff, 0xd56a, 0x2d70, 0x20b7, 0xa843, 0xe22b, 0x2d3a, 0xc8d1, 0xeff9, 0x5809, 0xf171, 0xf1ca, 0x4aa1, 0xe752, 0xa7f6, 0x1531, 0x03a8, 0xbd38, 0x3515, 0x35e4, 0xd873, 0x2cec, 0x2fa3, 0xaedb, 0xd92e, 0x2cc6, 0xccea, 0xe531, 0x5116, 0xf947, 0xf6dd, 0x4ce8, 0xef45, 0xaeac, 0x190f, 0x0bfc, 0xbc68, 0x2afb, 0x3612, 0xd723, 0x2687, 0x3899, 0xbdfb, 0xda26, 0x3069, 0xdbaf, 0xe6bf, 0x5016, 0x0057, 0xf1d5, 0x480e, 0xf64b, 0xad29, 0x13a0, 0x16f4, 0xc33e, 0x2614, 0x4041, 0xe193, 0x201a, 0x3648, 0xc1be, 0xd35e, 0x2aee, 0xe031, 0xe3b6, 0x52de, 0x0b18, 0xedc3, 0x4b67, 0x084a, 0xaf95, 0x0ccc, 0x1af7, 0xc089, 0x19da, 0x4369, 0xe6d2, 0x1d97, 0x422d, 0xcfe2, 0xd1f7, 0x2e93, 0xe6d4, 0xd904, 0x4acc, 0x0d46, 0xe47d, 0x425b, 0x0eb4, 0xb1bb, 0x06af, 0x2009, 0xc469, 0x12a4, 0x3fee, 0xdd98, 0x0e0f, 0x3d40, 0xcdb1, 0xc9b2, 0x2f38, 0xedc8, 0xcf7d, 0x42ef, 0x1026, 0xd9af, 0x3710, 0x1033, 0xad12, 0xfd62, 0x2285, 0xc358, 0x0c72, 0x48be, 0xe51c, 0x0a9a, 0x2ff8, 0xbdc8, 0xc28d, 0x2cc9, 0xfec9, 0xc7ca, 0x13e5, 0x17e1, 0x02ca, 0x35c6, 0x0fac, 0xcd93, 0xf8c0, 0xfbac, 0xbba6, 0xe67f, 0x0735, 0xd6a6, 0x1bde, 0x7350, 0x2eb9, 0xfad9, 0x2334, 0xeee4, 0xa104, 0xc9e5, 0xcf89, 0xd376, 0x2f8b, 0x2f58, 0x13f9, 0x6199, 0x5172, 0xd760, 0xdae6, 0x0109, 0xaaab, 0x9f01, 0x11f6, 0x1c74, 0xff8b, 0x303b, 0x3d89, 0x2a49, 0x1900, 0xe5d6, 0xbb94, 0xe00a, 0xeeb6, 0xce23, 0x0253, 0x3291, 0x20e8, 0x0d77, 0x2650, 0x2ac1, 0xf46d, 0xf971, 0xdbe5, 0xc599, 0xf13a, 0xdd86, 0xebfb, 0x30a4, 0x422d, 0x0726, 0x20e1, 0x53cf, 0xe990, 0xbf8d, 0xd717, 0xc738, 0xcc12, 0xed69, 0x1207, 0x2679, 0x4b59, 0x2072, 0x0f6e, 0x3b3c, 0xef93, 0xaf82, 0xc07e, 0xdcf5, 0xccea, 0xe17b, 0x31b5, 0x3ad1, 0x3673, 0x24ae, 0x1fad, 0x2260, 0xf0dd, 0xc29e, 0xb494, 0xe43c, 0xe377, 0xdb2b, 0x2318, 0x45fc, 0x34e0, 0x20c4, 0x3ea5, 0x232d, 0xdb31, 0xcc1d, 0xb320, 0xc65a, 0xdf18, 0xea47, 0x25f0, 0x5cd4, 0x4386, 0x10e7, 0x3d78, 0x214b, 0xc538, 0xbca9, 0xbe8b, 0xcd16, 0xe049, 0x05f5, 0x2fe8, 0x5197, 0x45f2, 0x0fc2, 0x2f2f, 0x1971, 0xc5a7, 0xb7fc, 0xca80, 0xd975, 0xd7df, 0x0c99, 0x3a4e, 0x3fc6, 0x30e6, 0x13a0, 0x2b87, 0x0f79, 0xcd82, 0xaf27, 0xc107, 0xe381, 0xd5f3, 0x035c, 0x44e6, 0x44fc, 0x1db9, 0x1e95, 0x3a4e, 0xf713, 0xc17f, 0xb545, 0xc44b, 0xea43, 0xe0b2, 0x034f, 0x458e, 0x4e96, 0x1557, 0x1819, 0x3caa, 0xeb53, 0xb81f, 0xc29d, 0xcb34, 0xd827, 0xea2e, 0x153f, 0x3683, 0x4599, 0x17a8, 0x1025, 0x3238, 0xefae, 0xb3df, 0xb7d0, 0xd811, 0xd6f7, 0xd85a, 0x1792, 0x3a94, 0x35ea, 0x1657, 0x21c8, 0x243d, 0xdfb1, 0xbb30, 0xb0e9, 0xceed, 0xddbf, 0xdff2, 0x1be1, 0x44e0, 0x3265, 0x0879, 0x260d, 0x1f6a, 0xcd4c, 0xba1b, 0xbafd, 0xcb3d, 0xd899, 0xeb07, 0x19d6, 0x3c13, 0x3544, 0x08ed, 0x2407, 0x1daa, 0xcd68, 0xb792, 0xbf01, 0xd1c2, 0xd611, 0xf34b, 0x259b, 0x3b2f, 0x2f39, 0x1053, 0x2d78, 0x1a05, 0xd265, 0xba97, 0xc02a, 0xdab7, 0xd903, 0xf86d, 0x2ff9, 0x403d, 0x28d3, 0x14a1, 0x34af, 0x0a0e, 0xcda4, 0xc3ac, 0xc13a, 0xdd8d, 0xe2ea, 0xfd27, 0x2eb2, 0x45ac, 0x26be, 0x14ec, 0x3dd9, 0x06bc, 0xc81d, 0xc6e2, 0xc719, 0xd8c3, 0xe5c7, 0x0b66, 0x32c9, 0x4b92, 0x2cb4, 0x19ce, 0x3c10, 0x0272, 0xc5eb, 0xbb96, 0xccd7, 0xe07a, 0xdfbb, 0x160a, 0x4341, 0x4749, 0x2676, 0x21c7, 0x2fd3, 0xf0d0, 0xc6ee, 0xb624, 0xcad8, 0xe85f, 0xe7c5, 0x1d81, 0x4b84, 0x45af, 0x1eba, 0x2c0d, 0x30c1, 0xe4ba, 0xca8d, 0xbdbe, 0xcc89, 0xed50, 0xf3dd, 0x2203, 0x5159, 0x4cd1, 0x1b22, 0x2e08, 0x3255, 0xe28f, 0xc7e6, 0xc2e3, 0xd510, 0xe8de, 0xfa14, 0x2846, 0x4a33, 0x4c04, 0x1fed, 0x2f64, 0x2cdb, 0xe195, 0xc51d, 0xc13f, 0xdb62, 0xe696, 0xfa3e, 0x31bd, 0x4d3c, 0x4355, 0x2150, 0x33b3, 0x204a, 0xe0d7, 0xc877, 0xbdd9, 0xdeff, 0xeb46, 0x0024, 0x3a0c, 0x5485, 0x3c57, 0x1fe4, 0x3a57, 0x110e, 0xd1f0, 0xc4f8, 0xbfae, 0xe303, 0xf0e8, 0x0757, 0x3795, 0x525c, 0x364d, 0x163e, 0x3411, 0x078d, 0xc95e, 0xbed3, 0xc146, 0xdd79, 0xe8cb, 0x0fb0, 0x3b8b, 0x4b40, 0x2f52, 0x1708, 0x2c9b, 0xf6f7, 0xc33e, 0xb8f8, 0xc0a0, 0xe27b, 0xe6d8, 0x0c22, 0x3d9b, 0x4878, 0x24a6, 0x186c, 0x2467, 0xe600, 0xc014, 0xb323, 0xbc0b, 0xe0eb, 0xe8da, 0x0f11, 0x3cef, 0x40c5, 0x12df, 0x1430, 0x227a, 0xdb2e, 0xb8c4, 0xb5de, 0xc528, 0xdd7a, 0xe824, 0x13d4, 0x3e15, 0x4384, 0x124e, 0x1469, 0x1e10, 0xd6df, 0xb7fb, 0xb8e3, 0xcdaf, 0xdd42, 0xecbb, 0x1e7d, 0x3c6f, 0x378a, 0x1149, 0x1e8a, 0x1b08, 0xd447, 0xb3c7, 0xb0b3, 0xd341, 0xe16d, 0xebda, 0x22db, 0x4450, 0x345d, 0x0fcd, 0x27aa, 0x137c, 0xcfd2, 0xc241, 0xbb1b, 0xd538, 0xe771, 0xf62c, 0x297f, 0x4c37, 0x3271, 0x103e, 0x360c, 0x143c, 0xc8cb, 0xc2e2, 0xc46f, 0xd919, 0xe83f, 0x0316, 0x2e44, 0x49f7, 0x320d, 0x1102, 0x34eb, 0x0f20, 0xc998, 0xc1e5, 0xc68b, 0xd8b7, 0xe3aa, 0x0e51, 0x3839, 0x473d, 0x306d, 0x1936, 0x313b, 0x023a, 0xca3b, 0xb9cb, 0xc4e8, 0xe9a8, 0xe8e8, 0x0e4f, 0x4390, 0x4a72, 0x23d2, 0x1d52, 0x31ca, 0xf0b0, 0xc813, 0xbd25, 0xc202, 0xe6ea, 0xee18, 0x12c8, 0x4476, 0x4b2e, 0x198b, 0x19a1, 0x2fcc, 0xe518, 0xbf8d, 0xbe9e, 0xcb6d, 0xe622, 0xee0e, 0x167e, 0x3fbf, 0x46fb, 0x1a7d, 0x1f4e, 0x2d08, 0xe17f, 0xbedd, 0xbaa3, 0xcc16, 0xe196, 0xeedc, 0x21cc, 0x44ed, 0x4348, 0x1a18, 0x2363, 0x242e, 0xdc65, 0xbd61, 0xb300, 0xcfa0, 0xe712, 0xe5c7, 0x169f, 0x5f17, 0x7299, 0x2bb1, 0x0b65, 0xe2fd, 0x9b1c, 0xa3b5, 0xaeb5, 0xe147, 0x3787, 0x593a, 0x5290, 0x4a3c, 0x2e69, 0xcbb4, 0xa91f, 0xc5a3, 0xbd85, 0xd07b, 0x1055, 0x3d01, 0x2411, 0x222c, 0x2b1a, 0x0b05, 0xffdc, 0xe3f2, 0xcf8c, 0xf390, 0x15ad, 0xd9f5, 0xc944, 0x2d37, 0x09de, 0xc93f, 0x0d00, 0x229d, 0x0eb5, 0x31fb, 0x193d, 0xdefd, 0x0b6e, 0xe2b8, 0x80c1, 0xd2cb, 0x1719, 0xe9c2, 0x3008, 0x6a8a, 0xfee8, 0x01bc, 0x299a, 0xb39d, 0xa48f, 0x0798, 0xe5e9, 0xddfa, 0x41e1, 0x17dc, 0xf43b, 0x3829, 0x05c3, 0xbd89, 0xf1bc, 0x0dab, 0xcd37, 0xfad8, 0x2e14, 0xf080, 0x107b, 0x24ea, 0xd852, 0xd4a0, 0x17fd, 0xfd24, 0xd818, 0x2b57, 0x168d, 0xdb81, 0x1759, 0x0cdb, 0xc867, 0xf2e6, 0x257d, 0xe349, 0xfff1, 0x39a1, 0xe33d, 0xee45, 0x2b9d, 0xe388, 0xc702, 0x21a8, 0x103e, 0xda0f, 0x2f4b, 0x1b70, 0xd6c1, 0x1b55, 0x104d, 0xb577, 0xe811, 0x28c6, 0xe0aa, 0xfee3, 0x4403, 0xf56f, 0xf711, 0x2c32, 0xe60a, 0xbd96, 0x0d61, 0x048f, 0xce3d, 0x272f, 0x325d, 0xf1c7, 0x2094, 0x1ff0, 0xc860, 0xe30a, 0x2515, 0xdac5, 0xe92d, 0x441f, 0x0548, 0xfb76, 0x3d79, 0xfd5c, 0xbecb, 0x1149, 0x13f9, 0xd214, 0x2a6f, 0x3388, 0xe6f8, 0x2190, 0x2948, 0xc4a5, 0xdd42, 0x2f43, 0xe6af, 0xf03f, 0x54db, 0x13d9, 0xfca6, 0x3215, 0xf506, 0xc57a, 0x12c0, 0x0f9f, 0xd3cc, 0x322e, 0x4301, 0xf273, 0x23ab, 0x356e, 0xd3b2, 0xd051, 0x21b7, 0xf281, 0xecda, 0x4489, 0x12f0, 0x0242, 0x4407, 0x06d1, 0xbafe, 0x0b6c, 0x1d26, 0xc6ee, 0x19bc, 0x44e9, 0xe86d, 0x13b7, 0x39ca, 0xd446, 0xd119, 0x2941, 0xee93, 0xe7c5, 0x4bc2, 0x0643, 0xe908, 0x4535, 0x0444, 0xaaed, 0x0a10, 0x21a1, 0xc807, 0x1964, 0x41d6, 0xe77b, 0x16b3, 0x34e4, 0xc869, 0xc8dc, 0x2196, 0xe4ba, 0xdb97, 0x4973, 0x106a, 0xe7d9, 0x3cc5, 0x0a39, 0xa769, 0xf083, 0x1925, 0xc4c2, 0x075d, 0x3c4a, 0xe3ca, 0x0d28, 0x38d3, 0xc8d1, 0xbd34, 0x29a4, 0xea91, 0xbfc6, 0x3ad0, 0x0fbe, 0xd348, 0x3125, 0x0f03, 0xa6a3, 0xf4e3, 0x222b, 0xbe73, 0x00e2, 0x3cfa, 0xd671, 0xff6d, 0x3893, 0xc753, 0xb6c9, 0x236e, 0xec95, 0xc571, 0x3925, 0x1324, 0xdbd6, 0x2c09, 0x07a8, 0xaa2d, 0xf242, 0x1fa6, 0xc716, 0x042c, 0x441c, 0xe490, 0xffd3, 0x3dc4, 0xdc2a, 0xb9f6, 0x1f30, 0xfbb0, 0xca2e, 0x371c, 0x2003, 0xddf1, 0x31fa, 0x2307, 0xb4d8, 0xf004, 0x2cbc, 0xc878, 0xf7c6, 0x4caf, 0xed6b, 0xfe78, 0x48e2, 0xe5f3, 0xb861, 0x209c, 0xffdd, 0xc990, 0x3a8f, 0x2235, 0xd8df, 0x3307, 0x26fb, 0xb85c, 0xf04e, 0x2cb8, 0xd049, 0xfa7c, 0x49ae, 0xedac, 0xfa25, 0x3f7d, 0xe587, 0xbae6, 0x1de2, 0x03f4, 0xc964, 0x35b0, 0x2bf3, 0xdcc1, 0x287a, 0x2509, 0xb53e, 0xdd34, 0x21f5, 0xd014, 0xf4e6, 0x5327, 0xfbed, 0xf63d, 0x422a, 0xebde, 0xadff, 0x109b, 0x03c0, 0xc66e, 0x34a1, 0x371f, 0xe1e5, 0x266b, 0x298a, 0xb6ec, 0xdb6e, 0x2815, 0xd421, 0xf019, 0x5352, 0xff26, 0xf3f2, 0x43a2, 0xf389, 0xb155, 0x11bc, 0x093e, 0xc3cf, 0x2cd7, 0x37d3, 0xe04d, 0x22e3, 0x2ecd, 0xb8a8, 0xd4f6, 0x2b5c, 0xd879, 0xe9c1, 0x5345, 0x0074, 0xeb1b, 0x3d0d, 0xf0a8, 0xa78e, 0x0f83, 0x1369, 0xc523, 0x2e80, 0x3d4c, 0xdb13, 0x1e41, 0x2ecc, 0xb34d, 0xd013, 0x2f65, 0xd81e, 0xe458, 0x57d2, 0x0406, 0xebe0, 0x457a, 0xf7e1, 0xa66e, 0x0b6f, 0x0e7a, 0xb8d1, 0x251b, 0x3fe1, 0xdd7d, 0x20b9, 0x3687, 0xbb17, 0xd0b9, 0x2e06, 0xd6de, 0xd8c9, 0x50ce, 0x0665, 0xe605, 0x3fce, 0xfc63, 0xac6f, 0x0f4a, 0x249e, 0xcfcc, 0xfc68, 0x0488, 0xeb03, 0x4794, 0x43ec, 0xda83, 0xf3bd, 0x2644, 0xc019, 0xac19, 0xfdb7, 0xdae0, 0xebc8, 0x4a7e, 0x4842, 0x204b, 0x2f4a, 0x0bd7, 0xb466, 0xc7b6, 0xc25a, 0x9ff5, 0xfeaa, 0x3147, 0xf5d6, 0x1606, 0x7098, 0x2536, 0xcb1f, 0xef7c, 0xd8bb, 0xa610, 0xc6a6, 0xf94d, 0x01cf, 0x2326, 0x2e92, 0xfa36, 0x1b23, 0x1fee, 0xc9e0, 0xbf64, 0xf0f7, 0xebf9, 0xcd60, 0xfed7, 0x1727, 0x0a34, 0x1723, 0x0a36, 0x0e7b, 0x18aa, 0xfc64, 0xb854, 0xc985, 0xfdd8, 0xc68b, 0xea58, 0x3e80, 0x2a34, 0x0ba2, 0x2d28, 0x367f, 0xec1b, 0xe1de, 0xce20, 0xb654, 0xf084, 0xed7d, 0xf556, 0x44c2, 0x5de8, 0x118c, 0x103a, 0x43c2, 0xea97, 0xbbb3, 0xd781, 0xd5a7, 0xe105, 0xfd04, 0x1bc6, 0x2dbd, 0x4a4e, 0x2262, 0x090c, 0x37f3, 0x0697, 0xc337, 0xc445, 0xe70d, 0xe217, 0xdb53, 0x1953, 0x38c9, 0x40c1, 0x2ede, 0x22c3, 0x260c, 0xfc8c, 0xcfd4, 0xb0e1, 0xd39e, 0xe34c, 0xdae1, 0x253f, 0x508f, 0x342f, 0x1aa5, 0x3628, 0x1e6e, 0xd753, 0xc9cd, 0xb7c4, 0xd23c, 0xef41, 0xeb30, 0x1cc2, 0x523c, 0x3c38, 0x02b5, 0x29f9, 0x28a2, 0xd759, 0xd1f8, 0xd1bf, 0xd245, 0xe508, 0xfe91, 0x19fc, 0x3b30, 0x3d9b, 0x0a4c, 0x2fd0, 0x37f4, 0xdc8c, 0xbe49, 0xd7b4, 0xe591, 0xd3af, 0xfd0f, 0x3070, 0x36f1, 0x325e, 0x18a4, 0x3386, 0x27ca, 0xdc73, 0xb513, 0xcdc8, 0xf809, 0xd5d9, 0xf013, 0x4334, 0x4964, 0x2395, 0x1b7b, 0x3c5a, 0x0fe4, 0xd7a3, 0xc6c6, 0xc6b6, 0xf0cf, 0xeb7d, 0xf80b, 0x3914, 0x525a, 0x2445, 0x1417, 0x4928, 0x0ff5, 0xc35d, 0xc78a, 0xd244, 0xdff9, 0xe35e, 0x07df, 0x35ae, 0x4ba7, 0x2974, 0x1106, 0x3cf3, 0x0fec, 0xc4b4, 0xb9c7, 0xd562, 0xe489, 0xd970, 0x0e52, 0x3f61, 0x43d6, 0x27aa, 0x2131, 0x364b, 0xfd16, 0xc955, 0xb961, 0xcde0, 0xe8ce, 0xe024, 0x0e4f, 0x4544, 0x4582, 0x18cd, 0x22be, 0x3a77, 0xf22e, 0xc4f3, 0xbabf, 0xcce0, 0xe32e, 0xe352, 0x12f7, 0x43a1, 0x4666, 0x1401, 0x1c0c, 0x30e6, 0xe619, 0xbb56, 0xbb95, 0xd491, 0xe00b, 0xe61a, 0x17a4, 0x3b47, 0x3b00, 0x10e7, 0x1c7e, 0x2707, 0xe361, 0xb750, 0xb2d2, 0xd7be, 0xdb41, 0xe145, 0x2096, 0x40ed, 0x319a, 0x118b, 0x2924, 0x1a2e, 0xd6af, 0xba5f, 0xad6c, 0xd2c9, 0xe064, 0xe67c, 0x25df, 0x4ea4, 0x3357, 0x0fc7, 0x312c, 0x1020, 0xc418, 0xb5ff, 0xb68a, 0xd4f7, 0xe2ef, 0xfb14, 0x2e11, 0x4c3e, 0x3280, 0x08fc, 0x2966, 0x0e36, 0xc69d, 0xb3ba, 0xbf26, 0xde72, 0xe461, 0x0918, 0x3887, 0x4967, 0x313c, 0x1236, 0x2763, 0x0526, 0xcb44, 0xb35a, 0xc8b5, 0xed8f, 0xdf83, 0x05bf, 0x41b2, 0x4548, 0x20ab, 0x1a30, 0x2bd9, 0xf884, 0xce0f, 0xb377, 0xc10c, 0xede8, 0xe5b7, 0x0520, 0x42f2, 0x4b64, 0x19c0, 0x1a50, 0x2fd7, 0xee52, 0xc8d4, 0xbcea, 0xc661, 0xe5d5, 0xe9b8, 0x0e4b, 0x42da, 0x4c23, 0x187a, 0x1ba9, 0x2fdd, 0xe89e, 0xbcad, 0xb84a, 0xd201, 0xe619, 0xeba8, 0x1a61, 0x40ef, 0x41b7, 0x151a, 0x1cbf, 0x2b05, 0xea44, 0xc1f8, 0xbc6c, 0xdb3c, 0xe422, 0xe69f, 0x208e, 0x4881, 0x3cc7, 0x1503, 0x2aa9, 0x27ed, 0xe431, 0xc5cc, 0xbdfa, 0xdd9a, 0xe8e9, 0xf074, 0x2496, 0x4a59, 0x3e74, 0x1374, 0x2e8f, 0x252c, 0xd82c, 0xba66, 0xbeda, 0xe1cc, 0xe3a5, 0xf456, 0x3043, 0x4df4, 0x382a, 0x0d8b, 0x25d9, 0x1516, 0xd249, 0xb805, 0xbbdd, 0xe317, 0xe31f, 0xf717, 0x307f, 0x4438, 0x2ce7, 0x1089, 0x29b8, 0x060d, 0xc757, 0xb6c7, 0xb848, 0xdd4c, 0xde36, 0xf60e, 0x341a, 0x45f6, 0x1fc8, 0x0b03, 0x2ed5, 0xff75, 0xc14a, 0xb3bb, 0xb4dc, 0xd6d2, 0xdc36, 0xfbb0, 0x356c, 0x49c3, 0x2300, 0x0fe9, 0x2f18, 0xf499, 0xb802, 0xb1b2, 0xc06f, 0xdc85, 0xde22, 0x0805, 0x3cc1, 0x488e, 0x1f2e, 0x11d7, 0x2c64, 0xf3b1, 0xbd78, 0xadbb, 0xc5eb, 0xe451, 0xde57, 0x0e82, 0x4140, 0x4137, 0x1916, 0x1b84, 0x28d4, 0xe639, 0xc1a0, 0xb2e7, 0xc697, 0xe4be, 0xdf87, 0x10dc, 0x49b4, 0x457d, 0x1479, 0x2405, 0x2b0f, 0xdcbe, 0xbefc, 0xb3a9, 0xc6dd, 0xe60b, 0xed45, 0x1b13, 0x497b, 0x4531, 0x1324, 0x24b0, 0x243c, 0xd210, 0xb83d, 0xb984, 0xd0bc, 0xe2a6, 0xf3b7, 0x2766, 0x4a82, 0x4204, 0x133f, 0x22b4, 0x1b4e, 0xd4a3, 0xba37, 0xbaaf, 0xdf26, 0xea12, 0xf84b, 0x3177, 0x4e17, 0x39af, 0x193b, 0x308a, 0x13c1, 0xd6b0, 0xc5d3, 0xbffc, 0xe599, 0xeec6, 0xff4d, 0x38ac, 0x5167, 0x346a, 0x1b9d, 0x376a, 0x0ce4, 0xd4a8, 0xc78f, 0xc195, 0xe4f4, 0xf0f5, 0x07bb, 0x3cdc, 0x5981, 0x3510, 0x1b26, 0x3a31, 0x03fb, 0xca72, 0xc53e, 0xcd25, 0xecab, 0xf768, 0x193e, 0x437d, 0x53af, 0x2c6f, 0x15b8, 0x31bf, 0xff10, 0xcc99, 0xc147, 0xd348, 0xee05, 0xee95, 0x1782, 0x2f2b, 0x4b20, 0x5a80, 0x2b14, 0xfd25, 0xdd6a, 0xccb5, 0x9c77, 0xbb91, 0x0abb, 0xfa6d, 0x308d, 0x8b3b, 0x6386, 0x0f1b, 0x0366, 0xd9a6, 0x969a, 0xbb36, 0xbe42, 0xd650, 0x4a43, 0x5e11, 0x39f6, 0x4e5f, 0x3f3f, 0xd1f7, 0xbac7, 0xda01, 0xb75e, 0xdb85, 0x0689, 0x0f50, 0x402d, 0x3a48, 0xf492, 0xf3ba, 0x232e, 0xe3c2, 0xc221, 0x1c7e, 0x103b, 0xda32, 0x0d99, 0x12a9, 0xc374, 0xe4a9, 0x2fee, 0xef59, 0xf571, 0x4551, 0x09ce, 0xee4d, 0x190c, 0xdd87, 0xa5eb, 0xf5c9, 0x0d02, 0xd8dd, 0x32e0, 0x4556, 0xf27b, 0x272d, 0x1a0f, 0xac2d, 0xc929, 0x0d48, 0xd065, 0xe73f, 0x4fb6, 0x0a4b, 0xfcc1, 0x4512, 0xed54, 0xb2b9, 0x0350, 0xfc0b, 0xbed7, 0x1926, 0x2f0c, 0xe1a6, 0x2871, 0x338a, 0xc365, 0xd8fc, 0x2261, 0xe12a, 0xda5e, 0x3836, 0x02a6, 0xeb2d, 0x3c29, 0xfc95, 0xb47f, 0x126c, 0x2240, 0xc4df, 0x1301, 0x42d9, 0xddbd, 0x05c8, 0x2ff4, 0xc609, 0xc9ef, 0x2ebd, 0xf193, 0xda07, 0x46da, 0x0cd3, 0xe052, 0x39eb, 0x0085, 0xa3df, 0xfdbd, 0x1d67, 0xc36d, 0x1321, 0x461a, 0xe3db, 0x121d, 0x3bc5, 0xce7e, 0xc611, 0x1e92, 0xe869, 0xd146, 0x3d6e, 0x12f6, 0xe781, 0x3a2e, 0x100e, 0xb4c0, 0xf87f, 0x2451, 0xce12, 0xfd54, 0x3b61, 0xe9af, 0x0485, 0x363a, 0xd7a5, 0xc531, 0x26b6, 0xfb26, 0xd3af, 0x4024, 0x13d3, 0xcf38, 0x31ca, 0x1fe6, 0xacba, 0xe830, 0x28d0, 0xd67b, 0x03f4, 0x4390, 0xeff5, 0x0d9b, 0x3cdc, 0xd2ef, 0xbce5, 0x1df5, 0xf194, 0xcc0a, 0x3c7b, 0x22be, 0xe9d0, 0x37e4, 0x1f21, 0xbf6a, 0xed14, 0x13f9, 0xccad, 0xfeed, 0x36f2, 0xe931, 0x0bd9, 0x4870, 0xe9a7, 0xc649, 0x2406, 0x009e, 0xc7de, 0x28c6, 0x1d14, 0xe19d, 0x2d2e, 0x24eb, 0xc1ae, 0xf293, 0x2948, 0xd034, 0xfc36, 0x4c80, 0xed33, 0xf76a, 0x4574, 0xe546, 0xb51f, 0x205e, 0x01e4, 0xc8f6, 0x3c9b, 0x2dfd, 0xe000, 0x3231, 0x23e4, 0xac3f, 0xe1e2, 0x2470, 0xc806, 0xf279, 0x51f9, 0xfc93, 0xfd3d, 0x471f, 0xf14b, 0xb564, 0x0d8d, 0xf7a1, 0xbaf7, 0x2ae2, 0x3330, 0xe3cf, 0x2876, 0x2f9d, 0xbe99, 0xd8ed, 0x2066, 0xcc5b, 0xe037, 0x444b, 0xfc55, 0xf1ae, 0x3dee, 0xedb1, 0xa9f3, 0x0f58, 0x052a, 0xb88b, 0x286b, 0x32e9, 0xd191, 0x1a2d, 0x2b19, 0xb1ba, 0xd055, 0x2574, 0xcd9d, 0xe17a, 0x4f5d, 0xf991, 0xe9c8, 0x4424, 0xee22, 0xa03f, 0x0b3e, 0x0833, 0xb2f6, 0x25d7, 0x3fb5, 0xd971, 0x1eca, 0x3552, 0xb55f, 0xc5ed, 0x2341, 0xd2b5, 0xd7c1, 0x523e, 0x069d, 0xe63d, 0x453d, 0xfaec, 0xa137, 0x0414, 0x12c4, 0xb981, 0x1bb8, 0x4054, 0xdb21, 0x1feb, 0x3f6a, 0xbc6b, 0xcb19, 0x2eaa, 0xdddc, 0xd782, 0x53f0, 0x0db9, 0xe5f5, 0x4ae5, 0x09f1, 0xaaaa, 0x08ea, 0x1b96, 0xc280, 0x22c4, 0x4ce0, 0xe24f, 0x1cfe, 0x4491, 0xc23a, 0xc424, 0x2faf, 0xe9a8, 0xd606, 0x50b8, 0x16c3, 0xe5a3, 0x41e4, 0x0b1a, 0xa940, 0xfef6, 0x1bdf, 0xbfb1, 0x1607, 0x4e4e, 0xe252, 0x116e, 0x44af, 0xc71f, 0xbeed, 0x2c56, 0xed57, 0xd13f, 0x46da, 0x1220, 0xdf44, 0x3fcf, 0x0e72, 0xa687, 0xfe99, 0x22c2, 0xc0f4, 0x10f5, 0x4ab0, 0xdcc9, 0x0862, 0x42d3, 0xcce8, 0xbf2b, 0x2c4a, 0xf130, 0xcf23, 0x47a0, 0x1557, 0xd894, 0x3b17, 0x15eb, 0xac91, 0xfc3e, 0x2839, 0xc889, 0x0a6b, 0x4a0a, 0xe524, 0x0571, 0x40a3, 0xd642, 0xc2d3, 0x2b1c, 0xfa19, 0xd4f9, 0x465b, 0x1ef6, 0xe106, 0x371e, 0x15ec, 0xb185, 0xfc2f, 0x2898, 0xcc97, 0x0b55, 0x4c1f, 0xebc4, 0x08bc, 0x3f08, 0xd705, 0xc599, 0x2bb5, 0x081d, 0xcd96, 0x0d3b, 0x0ffa, 0x0823, 0x3f09, 0x1a45, 0xdad9, 0x0662, 0x07b7, 0xbb6a, 0xde9a, 0x0740, 0xda46, 0x0e1e, 0x6549, 0x38b1, 0x04bd, 0x2510, 0xf943, 0xad98, 0xc9a0, 0xca5c, 0xcaba, 0x22c9, 0x2b10, 0x01f0, 0x511a, 0x637c, 0xe409, 0xcfea, 0xff1b, 0xbae4, 0x9b34, 0xfafc, 0x154f, 0xfdb5, 0x2da1, 0x2e82, 0x1b20, 0x2472, 0xf46c, 0xbc6b, 0xd8c3, 0xf895, 0xcd65, 0xe4ee, 0x20c1, 0x1821, 0x08d6, 0x178c, 0x2a03, 0x07e8, 0xfe05, 0xe136, 0xbccf, 0xeb99, 0xdae7, 0xd3aa, 0x1d70, 0x3e94, 0x094b, 0x0900, 0x5434, 0x0901, 0xc4b1, 0xdc6e, 0xc832, 0xca7f, 0xe370, 0xfc55, 0x19fb, 0x5037, 0x3174, 0xfe1c, 0x3bdc, 0x1079, 0xb5a5, 0xbd97, 0xde91, 0xd7dc, 0xd8e9, 0x1ed3, 0x2fd7, 0x3373, 0x2e1c, 0x130d, 0x2861, 0x0ada, 0xcec0, 0xaf81, 0xd3f1, 0xe991, 0xcbf7, 0x0636, 0x408c, 0x3d14, 0x22da, 0x2e7f, 0x334f, 0xf091, 0xd23f, 0xb6f6, 0xbe39, 0xe0ea, 0xdac6, 0x0ab7, 0x52de, 0x5241, 0x1a28, 0x36a7, 0x3ee4, 0xdc10, 0xbfb1, 0xc06c, 0xc69f, 0xdf82, 0xf62e, 0x1f54, 0x4e25, 0x578d, 0x17a6, 0x26c4, 0x37fc, 0xe05d, 0xc099, 0xcd8c, 0xd886, 0xd8c3, 0xfcba, 0x2d83, 0x3fa6, 0x48bb, 0x1e77, 0x2a31, 0x31eb, 0xe98e, 0xbcf5, 0xc196, 0xe4e4, 0xdb34, 0xf4b5, 0x398d, 0x47e8, 0x3526, 0x2168, 0x3d9a, 0x20eb, 0xddcb, 0xbe09, 0xb85c, 0xe775, 0xe3f6, 0xedd1, 0x3731, 0x576a, 0x2d99, 0x1229, 0x4011, 0x0fb4, 0xc58a, 0xc2e0, 0xc163, 0xd8b3, 0xe485, 0xfbc4, 0x28a2, 0x4aba, 0x2b57, 0x06a4, 0x385f, 0x150e, 0xc2cd, 0xb65c, 0xcd33, 0xde60, 0xd4fe, 0x0096, 0x3507, 0x45bc, 0x2781, 0x142c, 0x33ba, 0x049c, 0xc775, 0xb39c, 0xc6ec, 0xe39b, 0xd75b, 0x0203, 0x3c34, 0x4589, 0x1c2f, 0x171d, 0x336b, 0xeff6, 0xbf31, 0xb8c6, 0xc21c, 0xde19, 0xe412, 0x0b3a, 0x399a, 0x4631, 0x1799, 0x116c, 0x3085, 0xeefe, 0xbcec, 0xb922, 0xcdc6, 0xe051, 0xe2d7, 0x10d0, 0x38e1, 0x3dfb, 0x1356, 0x1516, 0x2876, 0xe6f8, 0xbb6a, 0xb636, 0xd128, 0xdda0, 0xdf16, 0x11df, 0x387e, 0x338c, 0x0c5c, 0x211c, 0x2422, 0xdca8, 0xbf10, 0xb435, 0xcd32, 0xde18, 0xe25f, 0x144e, 0x3fe0, 0x3472, 0x0753, 0x2b41, 0x27e8, 0xd555, 0xc117, 0xbddb, 0xcb8c, 0xdaa8, 0xee16, 0x185e, 0x406a, 0x394d, 0x0e4c, 0x3224, 0x2283, 0xcee6, 0xb78f, 0xbe46, 0xd600, 0xd73a, 0xf882, 0x2db5, 0x4253, 0x3500, 0x1558, 0x2eee, 0x13ba, 0xd1b3, 0xb80a, 0xbd32, 0xe28d, 0xdf23, 0xfd44, 0x3980, 0x4ace, 0x2d3f, 0x18f4, 0x34ae, 0x039f, 0xcc97, 0xbb5e, 0xbe2a, 0xe6fa, 0xe555, 0x023b, 0x3de8, 0x4db4, 0x2192, 0x1578, 0x3a68, 0xfe29, 0xc84a, 0xbd0b, 0xc1ef, 0xe3a9, 0xe936, 0x0a3b, 0x3ab4, 0x505a, 0x260d, 0x1903, 0x39c0, 0xf9ac, 0xc53b, 0xbc41, 0xcc45, 0xe5fc, 0xe843, 0x15b8, 0x436d, 0x4dae, 0x24c5, 0x212b, 0x33f2, 0xf1b2, 0xc3a3, 0xb509, 0xcd57, 0xe8db, 0xeb7c, 0x1d1e, 0x4aef, 0x4a01, 0x1af5, 0x24c7, 0x2df1, 0xe4a5, 0xc1ae, 0xb8ad, 0xd2c8, 0xe887, 0xee7b, 0x21d0, 0x4d5f, 0x4806, 0x171f, 0x2854, 0x27e5, 0xdd26, 0xc075, 0xb9c1, 0xd6dc, 0xe94e, 0xf760, 0x2a99, 0x4d0c, 0x4405, 0x1751, 0x2a63, 0x1e7d, 0xd670, 0xba60, 0xb674, 0xde00, 0xe8fc, 0xf57e, 0x3121, 0x51b2, 0x3a66, 0x11d4, 0x29d9, 0x107f, 0xd01f, 0xbbd1, 0xb864, 0xe08f, 0xea2a, 0xfafd, 0x34de, 0x5038, 0x3061, 0x1294, 0x3316, 0x07d3, 0xc6ab, 0xbd82, 0xc0f2, 0xe421, 0xebe4, 0x0398, 0x39c6, 0x54a2, 0x2e8b, 0x0e55, 0x3308, 0x0648, 0xc5ad, 0xbd8e, 0xc53c, 0xdfb2, 0xe8b4, 0x0f4a, 0x3d14, 0x4caa, 0x2bf1, 0x15bf, 0x2e89, 0xf945, 0xc136, 0xb890, 0xcaeb, 0xe950, 0xe7bf, 0x115d, 0x451b, 0x4aa1, 0x20cd, 0x1684, 0x2a91, 0xf0a3, 0xc5b7, 0xb815, 0xc9bf, 0xee16, 0xea12, 0x117d, 0x470b, 0x42c7, 0x113f, 0x1b7c, 0x2b91, 0xe191, 0xc212, 0xbd24, 0xc84b, 0xe419, 0xe8c1, 0x104f, 0x440c, 0x4662, 0x1122, 0x20a6, 0x2d8e, 0xda8b, 0xbcf3, 0xc089, 0xcbf5, 0xde1c, 0xf3c0, 0x2135, 0x414e, 0x3fd9, 0x15e1, 0x26f5, 0x292e, 0xdc7e, 0xb937, 0xb924, 0xd769, 0xe06d, 0xee92, 0x2aa0, 0x48ae, 0x379d, 0x15e3, 0x2afa, 0x167d, 0xd370, 0xbfeb, 0xb8aa, 0xd8da, 0xe695, 0xf331, 0x2abe, 0x4918, 0x2e1c, 0x0f19, 0x32cf, 0x0f46, 0xc822, 0xbf6b, 0xbca2, 0xdadc, 0xe628, 0xf835, 0x2cf1, 0x4b03, 0x2c10, 0x0df9, 0x358e, 0x0a2c, 0xc678, 0xc06b, 0xc05f, 0xd849, 0xe170, 0x02e1, 0x3324, 0x4bd0, 0x2fc8, 0x13c8, 0x3314, 0x0029, 0xbf2e, 0xb455, 0xc1d3, 0xe027, 0xe480, 0x0a7f, 0x2c7a, 0x5506, 0x634d, 0x2129, 0xfadf, 0xe1b5, 0xb620, 0x8bd2, 0xbfae, 0x0a2a, 0x0d5d, 0x5240, 0x8109, 0x4e83, 0x15cf, 0xf367, 0xba2c, 0x9d5f, 0xcd2e, 0xbdc8, 0xf85d, 0x6f35, 0x4484, 0x29e8, 0x54f0, 0x2a04, 0xcc06, 0xd6d5, 0xe253, 0xc387, 0x09da, 0xff4a, 0xebc6, 0x4eb3, 0x2edb, 0xcfcc, 0x0b9a, 0x3d1b, 0xdc1f, 0xf4a1, 0x3fae, 0xeb9b, 0xe915, 0x13be, 0xcb86, 0xb940, 0x1643, 0x18ee, 0xf7d9, 0x4acf, 0x30df, 0xe6dc, 0x16fe, 0xf4d5, 0x9c55, 0xcc79, 0x10aa, 0xe384, 0x0496, 0x4c2c, 0x0504, 0xff4c, 0x2d7e, 0xd93d, 0xacb4, 0x00e4, 0xf5af, 0xc18e, 0x2289, 0x2a64, 0xe0a9, 0x2089, 0x21b8, 0xbaf3, 0xdd89, 0x1ea4, 0xd2e4, 0xe648, 0x37ea, 0xec35, 0xe993, 0x35d6, 0xed2e, 0xbadd, 0x15b4, 0x0a9d, 0xc841, 0x1a7c, 0x191c, 0xcaef, 0x0f4e, 0x1fff, 0xbfae, 0xe155, 0x3460, 0xeb55, 0xe0b6, 0x3048, 0xf2f2, 0xddca, 0x235a, 0xee7f, 0xb7cc, 0x15dd, 0x2097, 0xce52, 0x180f, 0x2dcf, 0xd499, 0x0857, 0x29b8, 0xc4c2, 0xd000, 0x28ff, 0xe652, 0xde94, 0x43c5, 0x05e6, 0xe425, 0x356a, 0xfee7, 0xb2c1, 0x0914, 0x1584, 0xbe7b, 0x0e5a, 0x368a, 0xe276, 0x1274, 0x3391, 0xd008, 0xd357, 0x26c2, 0xec06, 0xdd61, 0x39e2, 0x0868, 0xe6f9, 0x3207, 0x091c, 0xbc0e, 0x0582, 0x1f6d, 0xd133, 0x1cab, 0x4d57, 0xeb81, 0x02e3, 0x3712, 0xde41, 0xc71f, 0x212b, 0xfb67, 0xe7a1, 0x504a, 0x23ac, 0xedd8, 0x3eb6, 0x157e, 0xad36, 0xfc30, 0x2995, 0xcb86, 0x10c5, 0x529b, 0xf7a7, 0x15fe, 0x4546, 0xdc21, 0xcaba, 0x26eb, 0xe984, 0xd493, 0x4c8e, 0x16e6, 0xe56c, 0x463b, 0x1cf9, 0xb4a9, 0xfd71, 0x24ab, 0xc8a4, 0x09c8, 0x41c1, 0xe4ff, 0x0a9c, 0x3d28, 0xd226, 0xc16f, 0x2d0a, 0xf732, 0xcb2f, 0x42b2, 0x1d8f, 0xd5f3, 0x2c26, 0x1649, 0xa7c7, 0xed21, 0x286f, 0xc688, 0x04e2, 0x51dd, 0xe73b, 0x0013, 0x46f0, 0xd1e8, 0xab29, 0x260f, 0xf7aa, 0xbdee, 0x402d, 0x25c0, 0xda8b, 0x3989, 0x21df, 0xa95c, 0xf0ed, 0x290b, 0xbd3d, 0xfb44, 0x4eba, 0xe63a, 0xfecd, 0x4a1d, 0xe177, 0xbc6f, 0x2af3, 0xfdf2, 0xc4cf, 0x3b3d, 0x1ebb, 0xd4a0, 0x319d, 0x221e, 0xaf94, 0xf1b0, 0x3313, 0xcaf9, 0xf7f2, 0x4fd1, 0xeb5b, 0xf54e, 0x3faa, 0xd925, 0xb016, 0x2624, 0x012e, 0xc2f3, 0x3e16, 0x255d, 0xce61, 0x2b67, 0x1e8d, 0xa020, 0xe075, 0x2e2f, 0xc930, 0xf3f3, 0x4f96, 0xe6da, 0xef8a, 0x43fb, 0xdd85, 0xab7b, 0x2022, 0xfe5f, 0xba39, 0x346d, 0x27b4, 0xd20a, 0x2bfd, 0x2882, 0xae6f, 0xe3d3, 0x2b38, 0xc9c6, 0xef8e, 0x49d8, 0xeade, 0xf2c2, 0x46de, 0xe8ca, 0xb2fe, 0x208e, 0x0855, 0xc5c4, 0x338e, 0x29eb, 0xd645, 0x257e, 0x260c, 0xb7e2, 0xebef, 0x3365, 0xd6d8, 0xf811, 0x518d, 0xf457, 0xf134, 0x4558, 0xf41a, 0xb66e, 0x1a28, 0x0bd1, 0xcaa3, 0x31f9, 0x3045, 0xe17a, 0x2ad4, 0x2f2d, 0xbd2b, 0xe13e, 0x2cfe, 0xd3bd, 0xea52, 0x4fb4, 0x020e, 0xf40a, 0x4278, 0xf8f7, 0xb45e, 0x127c, 0x0af1, 0xc2d1, 0x2b03, 0x36f1, 0xdd10, 0x20d2, 0x35ec, 0xc074, 0xd7bd, 0x2eef, 0xd9db, 0xe543, 0x52c9, 0x05cf, 0xec53, 0x41bb, 0xfa65, 0xaf2a, 0x15c6, 0x1274, 0xbe0e, 0x2c97, 0x448e, 0xdd59, 0x1c74, 0x3817, 0xbb2b, 0xcf5b, 0x2f9a, 0xdc0c, 0xe4f0, 0x586d, 0x096c, 0xe913, 0x42c2, 0xf921, 0xa4d2, 0x0f94, 0x157d, 0xbee7, 0x2a97, 0x46c2, 0xe0bf, 0x1d38, 0x3786, 0xb9af, 0xcb2a, 0x2dd9, 0xd952, 0xdcbe, 0x5596, 0x0bab, 0xea4b, 0x4531, 0xffe2, 0xa78b, 0x0c61, 0x136f, 0xb532, 0x2148, 0x44ae, 0xd96e, 0x195c, 0x392c, 0xb898, 0xc8e9, 0x3388, 0xef92, 0xcd85, 0x0ef6, 0xf796, 0x13e1, 0x506a, 0x028d, 0xcd42, 0x14f5, 0xf58e, 0x9d81, 0xe29f, 0xfb3c, 0xcd66, 0x1bbf, 0x6302, 0x30d7, 0x14e4, 0x29bc, 0xdf14, 0xae5e, 0xce80, 0xabdc, 0xca7e, 0x3503, 0x1ee4, 0xf688, 0x5aac, 0x62a7, 0xd87d, 0xd4d5, 0xfc76, 0xb6dd, 0xa5b5, 0xf6e7, 0x0b99, 0x0665, 0x381b, 0x1f19, 0x1206, 0x2ed5, 0xebdd, 0xb56d, 0xde2e, 0xf87e, 0xce4d, 0xed47, 0x2439, 0x121c, 0x1266, 0x1483, 0x16c8, 0x10fd, 0x0650, 0xd754, 0xbaff, 0xf7e2, 0xda39, 0xcd45, 0x2986, 0x40dc, 0x0e53, 0x182a, 0x50a1, 0x01de, 0xcb6e, 0xdc62, 0xb781, 0xcfc4, 0xee54, 0xf542, 0x2240, 0x5981, 0x2c5e, 0xf8e5, 0x3e3b, 0x0d29, 0xaf98, 0xc3b7, 0xd787, 0xd3b1, 0xe2e2, 0x19c0, 0x28df, 0x3943, 0x2fe3, 0x081e, 0x2922, 0x0f78, 0xc962, 0xb6cc, 0xd979, 0xe6a6, 0xd121, 0x07cf, 0x3500, 0x3ad0, 0x2c2a, 0x2624, 0x2c95, 0xfb6f, 0xd7be, 0xb61f, 0xc05e, 0xe300, 0xd931, 0x0c0c, 0x4eae, 0x4878, 0x15a7, 0x2a43, 0x31b1, 0xdd24, 0xc4ea, 0xbda7, 0xc680, 0xe6be, 0xf0c6, 0x13f8, 0x45f0, 0x4cdc, 0x09ee, 0x185b, 0x3039, 0xdd40, 0xc562, 0xd19d, 0xd51e, 0xdcc7, 0xfbf1, 0x1f9a, 0x3311, 0x4108, 0x10a0, 0x1d6d, 0x368a, 0xebc0, 0xbacd, 0xc61c, 0xe6be, 0xd8c6, 0xecc7, 0x2b4f, 0x3ad6, 0x3234, 0x16aa, 0x312b, 0x2c20, 0xe5cf, 0xbf0c, 0xc2d3, 0xef02, 0xde96, 0xe42b, 0x3264, 0x4f6e, 0x2b87, 0x1502, 0x434e, 0x2169, 0xd824, 0xcd4a, 0xcbe5, 0xe67d, 0xe8bc, 0xf5fe, 0x2bd2, 0x4fbf, 0x2b2a, 0x05aa, 0x4482, 0x2857, 0xcb20, 0xc28b, 0xdaa2, 0xe5a8, 0xd616, 0xfaa0, 0x2fc3, 0x4640, 0x2ce5, 0x0f5a, 0x3ab7, 0x1944, 0xcda3, 0xbbcb, 0xcda1, 0xe22a, 0xd491, 0x0143, 0x3873, 0x3fbe, 0x22bb, 0x1736, 0x3ae6, 0x0407, 0xc3a8, 0xb9c4, 0xc437, 0xdc67, 0xd7ba, 0x00f1, 0x3801, 0x41a0, 0x1951, 0x11c6, 0x35de, 0xf7fb, 0xbeac, 0xb811, 0xc658, 0xdc21, 0xd8e4, 0x060e, 0x39e5, 0x4146, 0x14d2, 0x16dd, 0x36f4, 0xed6d, 0xba86, 0xb9b4, 0xcb20, 0xdd7e, 0xdfe1, 0x0f15, 0x3b82, 0x3e9b, 0x1158, 0x1b8a, 0x323f, 0xe8e2, 0xbdfb, 0xb835, 0xd09f, 0xddf2, 0xdd36, 0x148a, 0x40d3, 0x3e5f, 0x13a7, 0x2794, 0x2f4a, 0xde17, 0xbd25, 0xb6e3, 0xcb99, 0xdc56, 0xe6b9, 0x1ce9, 0x4836, 0x40a4, 0x1189, 0x2c70, 0x2966, 0xd436, 0xb74c, 0xb722, 0xd074, 0xdc0f, 0xf37b, 0x2f67, 0x4c6c, 0x3aa1, 0x13df, 0x2e82, 0x1863, 0xcd4e, 0xbc3f, 0xbce0, 0xd9c4, 0xe1be, 0xfb8d, 0x359d, 0x4c01, 0x3625, 0x17b8, 0x32ce, 0x1032, 0xcc89, 0xbc30, 0xbdba, 0xe2ec, 0xe81c, 0x005e, 0x3db9, 0x512c, 0x2c97, 0x17fc, 0x380c, 0x06f5, 0xcdb1, 0xc0d4, 0xbe6b, 0xe241, 0xead9, 0x05a4, 0x3a27, 0x518a, 0x2c10, 0x187d, 0x3809, 0xfd0c, 0xc4ac, 0xbff0, 0xc939, 0xe3de, 0xe907, 0x0ded, 0x3e36, 0x4e75, 0x2456, 0x1759, 0x31b3, 0xf547, 0xc449, 0xba76, 0xcb7c, 0xe629, 0xeb17, 0x17cc, 0x43ae, 0x4970, 0x1dfb, 0x1c5c, 0x2c1b, 0xe97c, 0xc40d, 0xbedd, 0xd492, 0xe90c, 0xea14, 0x18aa, 0x44ec, 0x43bf, 0x15aa, 0x2421, 0x2f68, 0xe453, 0xc2c4, 0xbef4, 0xd4c2, 0xe5c8, 0xf22d, 0x2430, 0x475e, 0x4461, 0x187f, 0x2916, 0x2d8a, 0xe382, 0xc1ee, 0xc2fa, 0xe144, 0xe6ea, 0xf400, 0x30a7, 0x50eb, 0x4265, 0x1b39, 0x2f67, 0x2260, 0xde78, 0xc61b, 0xc3e2, 0xe4c5, 0xea6e, 0xf9b7, 0x32e4, 0x4b24, 0x330a, 0x1529, 0x377b, 0x1ad4, 0xd298, 0xc471, 0xc39e, 0xdfcf, 0xe493, 0xf83e, 0x339f, 0x5169, 0x3178, 0x0fe4, 0x3634, 0x10e7, 0xcad8, 0xc188, 0xc0cb, 0xd97a, 0xe36b, 0x01cf, 0x3255, 0x49ca, 0x2dc9, 0x1019, 0x33a3, 0x059a, 0xbd42, 0xb33f, 0xbe30, 0xd9b3, 0xdc31, 0x0338, 0x37ee, 0x44ae, 0x224f, 0x0cf2, 0x27ab, 0xf5dc, 0xbd67, 0xaf02, 0xbe02, 0xde1c, 0xd738, 0x02b2, 0x3eba, 0x4074, 0x174f, 0x1829, 0x2c82, 0xe72a, 0xbf61, 0xb6b3, 0xbe85, 0xe2b1, 0xe25f, 0x05c1, 0x4181, 0x4a2b, 0x1512, 0x1a96, 0x326a, 0xe3c7, 0xbc8c, 0xb7af, 0xbd6f, 0xd849, 0xe90a, 0x150e, 0x3ed0, 0x469e, 0x176f, 0x1b23, 0x2908, 0xdb26, 0xb2f3, 0xb1f8, 0xca6a, 0xdb06, 0xe6a5, 0x1fb9, 0x4383, 0x3e5d, 0x1596, 0x1e94, 0x1cb0, 0xd8cf, 0xba95, 0xaec4, 0xcef4, 0xe43f, 0xeaf7, 0x2443, 0x4766, 0x336a, 0x0e32, 0x27a3, 0x1356, 0xcd5d, 0xc150, 0xb6ba, 0xd1d8, 0xe528, 0xee84, 0x2426, 0x4adf, 0x3667, 0x10cd, 0x310e, 0x1388, 0xcbbb, 0xc47e, 0xbd1f, 0xd491, 0xe98e, 0x0244, 0x3289, 0x53b3, 0x3eb9, 0x1566, 0x3290, 0x11e3, 0xcc07, 0xc004, 0xc4fd, 0xe223, 0xed0a, 0x10ae, 0x3ff0, 0x5037, 0x36e6, 0x164f, 0x29a1, 0x0284, 0xcdb8, 0xbdcd, 0xc637, 0xed96, 0xeeb1, 0x0cd0, 0x4050, 0x49bb, 0x239a, 0x1780, 0x2eab, 0xf6b6, 0xce3d, 0xbc38, 0xc8a0, 0x00e6, 0xefad, 0x0021, 0x33f9, 0x3ae3, 0x3cd3, 0x3fb1, 0x1838, 0xd924, 0xd541, 0xaecf, 0xa5de, 0xf7be, 0xfc4c, 0x140b, 0x790a, 0x7937, 0x1616, 0xfecc, 0xe9f4, 0x93de, 0xa330, 0xc0f0, 0xcf7e, 0x2cbc, 0x6286, 0x4ccf, 0x462d, 0x450f, 0xe74f, 0xa99c, 0xd6b1, 0xc669, 0xba55, 0xfefe, 0x25a9, 0x3149, 0x43ec, 0x1f26, 0xede2, 0x0adf, 0xff6f, 0xbdad, 0xf121, 0x2c23, 0xf18d, 0xf0cc, 0x2718, 0xe6c1, 0xbbba, 0x1d92, 0x14c7, 0xde85, 0x3e57, 0x31f4, 0xe295, 0x0f8d, 0xf992, 0xa267, 0xd117, 0x1bec, 0xe179, 0x07c9, 0x5af9, 0x03a7, 0x02e9, 0x3014, 0xd04d, 0xa794, 0xfb7e, 0xf282, 0xc715, 0x36b9, 0x3764, 0xea25, 0x307a, 0x1cb0, 0xb2ec, 0xd406, 0x117c, 0xd2a9, 0xea54, 0x43e9, 0xfc21, 0xfaa3, 0x3fc1, 0xeafd, 0xb060, 0x0b4c, 0x0ff9, 0xc461, 0x1954, 0x3040, 0xd984, 0x1601, 0x2825, 0xbc3f, 0xdbce, 0x3875, 0xe248, 0xdd2e, 0x4e02, 0xfd2c, 0xd91c, 0x3749, 0xf658, 0xaa69, 0x13e1, 0x2498, 0xcc14, 0x21ba, 0x3a26, 0xdb15, 0x1623, 0x2c3d, 0xba40, 0xcd2e, 0x2cf5, 0xe4ae, 0xe186, 0x52e0, 0x0d31, 0xe5cf, 0x3778, 0xffc1, 0xac3d, 0xfddf, 0x1bac, 0xc8ec, 0x14d4, 0x4029, 0xe79d, 0x15d6, 0x3792, 0xcc34, 0xca86, 0x3225, 0xf50a, 0xcf32, 0x3e28, 0x12b9, 0xe181, 0x364b, 0x1002, 0xb4c9, 0x031c, 0x26d6, 0xd0a9, 0x1e6a, 0x443a, 0xd350, 0x08d3, 0x41ed, 0xc7a2, 0xb99c, 0x2fe3, 0xff21, 0xdc75, 0x4839, 0x19bb, 0xe84c, 0x32f7, 0x01b7, 0xaddf, 0xfef1, 0x1e1c, 0xcae8, 0x16e4, 0x4bda, 0xecbb, 0x0caf, 0x3f24, 0xe0dc, 0xc4bc, 0x18da, 0xf67e, 0xdd77, 0x3908, 0x10f4, 0xed5b, 0x4369, 0x1b8d, 0xb980, 0x0190, 0x297a, 0xc6e3, 0x009e, 0x4462, 0xea33, 0x0155, 0x3cba, 0xe27f, 0xcbef, 0x2bda, 0xf9a0, 0xd4bc, 0x439f, 0x150b, 0xd559, 0x344d, 0x1a5b, 0xaf57, 0xf935, 0x2de0, 0xcf9a, 0x0979, 0x49a9, 0xea95, 0x051a, 0x3cdb, 0xd6df, 0xbc25, 0x2174, 0xf28b, 0xc89b, 0x4222, 0x2645, 0xdfc1, 0x315e, 0x201e, 0xb2fc, 0xe3d4, 0x181b, 0xc442, 0xfd80, 0x4a43, 0xed31, 0xff1f, 0x4381, 0xdf06, 0xb4dc, 0x1fd7, 0xf6dc, 0xbffe, 0x3a30, 0x24f3, 0xd6d6, 0x297b, 0x1c5d, 0xaf37, 0xedb8, 0x286b, 0xc61d, 0xfe95, 0x515b, 0xe559, 0xf3c9, 0x4090, 0xd830, 0xae85, 0x1db8, 0xf7ec, 0xc607, 0x3f9f, 0x264d, 0xd94a, 0x2a8a, 0x1485, 0xa002, 0xdeaf, 0x235b, 0xc381, 0xfa49, 0x5796, 0xefa6, 0xf6b9, 0x4056, 0xd904, 0xa813, 0x17bf, 0xf931, 0xbf26, 0x3e31, 0x2c1d, 0xd50a, 0x2d55, 0x22b9, 0xa846, 0xdf9f, 0x28c5, 0xc598, 0xef6b, 0x51e5, 0xf17d, 0xfa6e, 0x46ce, 0xddcb, 0xac63, 0x1bcf, 0xff42, 0xc08e, 0x3b8a, 0x30ab, 0xd540, 0x2b2a, 0x2b14, 0xb01e, 0xe003, 0x2eb4, 0xd207, 0xf705, 0x5a04, 0xf5f1, 0xf4f2, 0x49c1, 0xe735, 0xac7d, 0x1ff2, 0x0bc1, 0xc150, 0x3a15, 0x3cd0, 0xdc44, 0x29ee, 0x3079, 0xb504, 0xdcbb, 0x2cd7, 0xcfca, 0xeed8, 0x5c84, 0xfe19, 0xf346, 0x4ec0, 0xf24e, 0xa9a2, 0x1b01, 0x120e, 0xbf61, 0x31bd, 0x3ed0, 0xdca8, 0x27d7, 0x3553, 0xb79f, 0xddc0, 0x376a, 0xd743, 0xea45, 0x592a, 0xf9f4, 0xe94c, 0x4a1d, 0xf552, 0xa9a1, 0x19d2, 0x14c6, 0xbc9b, 0x2b11, 0x3913, 0xd2dc, 0x1f02, 0x340a, 0xb6b6, 0xd426, 0x33f8, 0xd9a8, 0xdc7f, 0x5123, 0xfd3a, 0xde46, 0x40ce, 0xfa10, 0xa997, 0x14a8, 0x1bb4, 0xc08d, 0x2376, 0x3d24, 0xd503, 0x166b, 0x35f1, 0xbc86, 0xd0fa, 0x36e8, 0xf1a1, 0xd628, 0x16ed, 0xf145, 0x0d1a, 0x55e9, 0x09b3, 0xd0ea, 0x189e, 0xfae5, 0xa1d9, 0xe581, 0xfd1f, 0xd241, 0x1ffa, 0x5b9f, 0x2d05, 0x1f94, 0x316b, 0xe330, 0xba22, 0xd9ab, 0xb354, 0xcfaa, 0x3059, 0x1e34, 0xfcfc, 0x565e, 0x623a, 0xe738, 0xe027, 0xfe57, 0xc099, 0xb327, 0xf470, 0x0c3c, 0x0e38, 0x38fd, 0x1a11, 0x0892, 0x3339, 0xf5c3, 0xbab1, 0xe297, 0xf843, 0xce95, 0xe620, 0x1c2a, 0x09ee, 0x1283, 0x1b02, 0x1187, 0x188b, 0x0e86, 0xd87e, 0xb652, 0xeca9, 0xdb2d, 0xc7dd, 0x1fe5, 0x379e, 0x0fd2, 0x1c45, 0x4c2e, 0x1316, 0xd85d, 0xdfc8, 0xb6df, 0xc87f, 0xeb35, 0xe54a, 0x1628, 0x57e4, 0x3419, 0xff6c, 0x4156, 0x1c74, 0xb5b4, 0xca06, 0xd49b, 0xc6db, 0xdff3, 0x0f42, 0x1c9b, 0x38c2, 0x3cc3, 0x059b, 0x2a27, 0x2699, 0xce85, 0xb4f9, 0xd393, 0xdea9, 0xcdb3, 0x03e7, 0x3281, 0x3d54, 0x3c61, 0x2583, 0x2ce2, 0x0c86, 0xdb4d, 0xb3bf, 0xbb9c, 0xe353, 0xd3fa, 0x034f, 0x4cdb, 0x4ab4, 0x21fa, 0x2b59, 0x391f, 0xeb27, 0xc6cb, 0xb8e4, 0xba9a, 0xe811, 0xec0e, 0x0c31, 0x4bdb, 0x5772, 0x163d, 0x1a19, 0x3f4d, 0xe9e8, 0xc3a2, 0xce2a, 0xc788, 0xd9f4, 0xf83e, 0x1bc6, 0x3ce8, 0x5548, 0x1db0, 0x1a55, 0x4521, 0xf1e2, 0xb3ab, 0xc2fd, 0xdbe1, 0xd800, 0xed52, 0x2c30, 0x402d, 0x430b, 0x23ff, 0x260b, 0x2f76, 0xea68, 0xb3d7, 0xb28e, 0xe14a, 0xdd06, 0xe066, 0x33b3, 0x51ec, 0x33b4, 0x1667, 0x3052, 0x1b77, 0xd41e, 0xc1bd, 0xb6c4, 0xd7a4, 0xeae0, 0xe9c9, 0x2119, 0x50ee, 0x3348, 0x0504, 0x35a7, 0x2224, 0xc555, 0xbad4, 0xc362, 0xd0c4, 0xdade, 0xf6c3, 0x247a, 0x463c, 0x3726, 0x098e, 0x2ae9, 0x1a2f, 0xc9d7, 0xb0fe, 0xc012, 0xdaac, 0xd5e1, 0xf9b0, 0x351f, 0x47da, 0x2cc6, 0x10fb, 0x2d9f, 0x068e, 0xc5e3, 0xb7fe, 0xc297, 0xe2b0, 0xe422, 0x01db, 0x36ef, 0x48cb, 0x23b7, 0x10de, 0x3507, 0x0307, 0xc7bf, 0xbff3, 0xc77c, 0xe128, 0xe56e, 0x0857, 0x3924, 0x4aaf, 0x2249, 0x103e, 0x31eb, 0xfa7b, 0xc42a, 0xbff2, 0xca69, 0xdf50, 0xe715, 0x1070, 0x37d6, 0x4303, 0x1eac, 0x16ba, 0x3184, 0xf739, 0xc4f5, 0xba46, 0xcd7e, 0xe4d0, 0xe592, 0x10ee, 0x3d09, 0x4044, 0x17ce, 0x2016, 0x2f3f, 0xe9e5, 0xc633, 0xbad5, 0xc6f9, 0xdeac, 0xe624, 0x121c, 0x413b, 0x4301, 0x1783, 0x29fd, 0x2ba5, 0xdaa4, 0xbe2e, 0xbb8e, 0xcbc8, 0xdde4, 0xf1e9, 0x21db, 0x439b, 0x4190, 0x172e, 0x27a0, 0x21f8, 0xd636, 0xbad8, 0xb8bf, 0xd096, 0xdf64, 0xf8a8, 0x2b93, 0x443b, 0x3b96, 0x185e, 0x26da, 0x10a6, 0xd167, 0xbdb5, 0xb977, 0xdb3a, 0xe708, 0xfa86, 0x2f52, 0x4806, 0x3265, 0x17a3, 0x31bc, 0x0e05, 0xd510, 0xc461, 0xbd66, 0xe192, 0xed77, 0x0119, 0x32ba, 0x50ed, 0x31ea, 0x16d3, 0x36ec, 0x0732, 0xcfc7, 0xc460, 0xc184, 0xdf83, 0xea58, 0x0626, 0x3550, 0x5246, 0x2def, 0x16cd, 0x3427, 0xfd3a, 0xc953, 0xbd3c, 0xc544, 0xe4ec, 0xf153, 0x166b, 0x3e10, 0x4e6d, 0x26d4, 0x1968, 0x2f16, 0xf428, 0xcae0, 0xbedd, 0xccf8, 0xe956, 0xefa2, 0x1950, 0x4297, 0x4a75, 0x1de5, 0x1955, 0x29ba, 0xeb91, 0xc61c, 0xbb12, 0xce33, 0xe7ce, 0xefe6, 0x18c6, 0x3e32, 0x43c5, 0x1922, 0x1cc3, 0x20fd, 0xde2b, 0xbf55, 0xb70b, 0xd16f, 0xe788, 0xef8e, 0x20c4, 0x4654, 0x3d93, 0x11d7, 0x1d2e, 0x15c5, 0xd810, 0xc122, 0xb7df, 0xd5bd, 0xe934, 0xf5a0, 0x24cd, 0x4321, 0x356b, 0x10be, 0x2522, 0x0e25, 0xcdbf, 0xc120, 0xbd1c, 0xd9ef, 0xe950, 0xf8ec, 0x2940, 0x4a04, 0x31e9, 0x09bb, 0x2935, 0x0de2, 0xcd32, 0xc3e0, 0xc0ad, 0xd96f, 0xebee, 0x0617, 0x2f65, 0x4a9d, 0x32b8, 0x104d, 0x2b20, 0x042c, 0xc6fe, 0xc0fc, 0xccb1, 0xe4c6, 0xe7e5, 0x0a2f, 0x3646, 0x44a9, 0x27ed, 0x0f84, 0x2482, 0xf9ba, 0xc9c9, 0xbc46, 0xc6f1, 0xe7c9, 0xe7b4, 0x0935, 0x38ab, 0x3dfb, 0x17f4, 0x1202, 0x2366, 0xe8cf, 0xc894, 0xc02b, 0xc4e7, 0xe682, 0xe9b4, 0x07dc, 0x39bc, 0x4323, 0x1255, 0x11a3, 0x2383, 0xde38, 0xc201, 0xc28c, 0xc797, 0xe30e, 0xf319, 0x11aa, 0x3329, 0x3e07, 0x11d9, 0x1242, 0x2173, 0xdd6c, 0xbc12, 0xbfc4, 0xd3cc, 0xe301, 0xf14f, 0x1ed7, 0x3c0b, 0x3bbe, 0x150a, 0x16d9, 0x1504, 0xded6, 0xc844, 0xc0c3, 0xdedd, 0xf0d7, 0xf666, 0x25d8, 0x4424, 0x33d0, 0x130e, 0x2876, 0x1370, 0xd7a6, 0xcf17, 0xc604, 0xdfb9, 0xf3d2, 0xfde9, 0x29bc, 0x4a3a, 0x328f, 0x0b59, 0x293f, 0x0f84, 0xd398, 0xd04b, 0xc938, 0xdc96, 0xf077, 0x05ff, 0x2a1d, 0x46e9, 0x33e3, 0x0e06, 0x27af, 0x084b, 0xcbee, 0xc5ed, 0xce50, 0xe4ec, 0xee95, 0x0fc4, 0x3481, 0x4291, 0x2ab8, 0x0ee7, 0x217a, 0xfbca, 0xd072, 0xc584, 0xcdc2, 0xeeae, 0xf284, 0x0beb, 0x2a91, 0x499c, 0x4ab9, 0x1751, 0xfb4e, 0xdff4, 0xc548, 0xaa11, 0xcb25, 0x079b, 0x0c5f, 0x3e98, 0x6247, 0x3e07, 0x0f43, 0xf0e4, 0xca5f, 0xb34f, 0xd401, 0xc893, 0xf3d1, 0x4c26, 0x308b, 0x22b3, 0x41c0, 0x2279, 0xdc8b, 0xdff8, 0xe310, 0xcceb, 0x027f, 0xf615, 0xee06, 0x3db0, 0x2392, 0xe01d, 0x1366, 0x3415, 0xe34c, 0xf6fc, 0x29c3, 0xe8c4, 0xee7a, 0x0fa2, 0xddee, 0xd84b, 0x1d1b, 0x1722, 0xff58, 0x3ac2, 0x1f74, 0xf03f, 0x1870, 0xfcd6, 0xbff1, 0xe68f, 0x1180, 0xed1f, 0x0a12, 0x3895, 0x07ec, 0x0a31, 0x24b3, 0xe648, 0xc9fc, 0x0734, 0xf757, 0xd412, 0x1f4f, 0x1e8b, 0xee37, 0x1f0e, 0x1be3, 0xd43a, 0xefa3, 0x194b, 0xddce, 0xf237, 0x287d, 0xeedf, 0xf88e, 0x2f7f, 0xf704, 0xd874, 0x1c88, 0x0972, 0xd8d5, 0x1702, 0x0f28, 0xe05e, 0x15f4, 0x1a7c, 0xd9ff, 0xf6eb, 0x29b0, 0xf002, 0xf068, 0x23d5, 0xf4b8, 0xf046, 0x1d23, 0xf157, 0xd110, 0x1519, 0x14cc, 0xdede, 0x142d, 0x1a12, 0xe515, 0x0b1c, 0x1636, 0xd4d5, 0xe629, 0x1cf8, 0xe7c6, 0xea58, 0x2b1f, 0xfc3e, 0xeeea, 0x236a, 0xfb53, 0xcfca, 0x089d, 0x0488, 0xd160, 0x0a55, 0x141d, 0xe5cd, 0x107d, 0x186d, 0xd8c8, 0xeaf7, 0x1870, 0xe826, 0xe955, 0x18d7, 0xf4b0, 0xf2f4, 0x198f, 0xf637, 0xd898, 0x0a60, 0x099d, 0xe121, 0x112c, 0x19f0, 0xe9f0, 0x0257, 0x16f3, 0xea68, 0xe825, 0x11db, 0xf73d, 0xf784, 0x22c2, 0x01a7, 0xfa94, 0x2329, 0xff98, 0xd3ac, 0x066b, 0x0f20, 0xe092, 0x0cc3, 0x1ddc, 0xf6f5, 0x1320, 0x1de5, 0xe877, 0xf111, 0x167b, 0xeabe, 0xf59b, 0x2682, 0xf99e, 0xf763, 0x2689, 0x0359, 0xdfbd, 0x0e98, 0x0da2, 0xe78d, 0x0e20, 0x0ddb, 0xeff0, 0x11e2, 0x1312, 0xe459, 0xf4b0, 0x1704, 0xee92, 0xf4ab, 0x1ec2, 0xfc20, 0xf450, 0x169f, 0xfcad, 0xdbac, 0x0468, 0x089e, 0xe794, 0x0e53, 0x118e, 0xefe9, 0x0e4a, 0x169a, 0xe1da, 0xebc0, 0x15eb, 0xefcb, 0xf2ee, 0x1beb, 0xfce8, 0xfa9c, 0x1c17, 0xffdb, 0xe6b1, 0x0fc5, 0x065c, 0xe6be, 0x10a6, 0x0c31, 0xefee, 0x1306, 0x13f9, 0xe94c, 0xfe45, 0x19f0, 0xf32a, 0xfe85, 0x1905, 0xf62a, 0xfd6b, 0x1747, 0xf729, 0xeaea, 0x11d1, 0x0593, 0xf301, 0x1786, 0x0b5f, 0xf124, 0x0940, 0x0668, 0xe6ec, 0xfe96, 0x1506, 0xf474, 0x04f3, 0x1923, 0xf708, 0xfe00, 0x1197, 0xf0a5, 0xe784, 0x0dcb, 0xff73, 0xf084, 0x1476, 0x091e, 0xf640, 0x0af0, 0x0286, 0xe773, 0xfd6b, 0x0efa, 0xf175, 0xf89a, 0x07af, 0xf9a6, 0x0516, 0x128d, 0x00ff, 0xfb4e, 0x0ed0, 0xfc70, 0xe60e, 0xf53d, 0xf46c, 0xf494, 0x0bff, 0x1551, 0x06e1, 0x0c9f, 0x0f55, 0xefab, 0xed70, 0xf731, 0xf0fe, 0xfd13, 0x0d56, 0x068f, 0x0174, 0x0fee, 0xffe4, 0xea15, 0xfb9a, 0xffd4, 0xf166, 0xfe33, 0x0e6f, 0xfeb8, 0x0068, 0x0cad, 0xf543, 0xef47, 0x0118, 0xf5be, 0xeb4f, 0x04dc, 0x09b3, 0xf586, 0x0081, 0x05bb, 0xf123, 0xf60d, 0x03d9, 0xf8d9, 0xfe28, 0x0dac, 0xfb79, 0xf27c, 0xfe7f, 0xf2c5, 0xeeb0, 0x04d2, 0x030d, 0xfb07, 0x0e9e, 0x0d11, 0xf686, 0xfc94, 0xffbf, 0xed59, 0xf589, 0x05ab, 0xfa48, 0xffa7, 0x10c1, 0x014b, 0xfa25, 0x09af, 0xfdfc, 0xf0ef, 0x03b9, 0x0400, 0xf635, 0x063f, 0x0b0b, 0xf9ca, 0x03dd, 0x0d8d, 0xfce6, 0x00df, 0x0f4b, 0x024e, 0xff59, 0x0dc5, 0x0159, 0xf654, 0x067a, 0x0580, 0xfe5c, 0x0e74, 0x0f97, 0x0220, 0x099e, 0x09f1, 0xf6cc, 0xfa19, 0x04a0, 0xfb69, 0x0199, 0x10a2, 0x0726, 0x02f2, 0x0c0d, 0x00c5, 0xf7e4, 0x056d, 0x020c, 0xf921, 0x0880, 0x0a05, 0xfc9b, 0x05b1, 0x0ba8, 0xfd73, 0x0126, 0x0afa, 0xfedb, 0xfe8e, 0x0754, 0xff08, 0x010e, 0x0a12, 0xff2a, 0xfc7a, 0x0965, 0x0306, 0xfbf9, 0x0735, 0x05c2, 0xfdbe, 0x020b, 0x01d4, 0xfd23, 0x035d, 0x0690, 0x0006, 0x0536, 0x0b42, 0x02fd, 0x0048, 0x04d9, 0xffac, 0xfb96, 0x0522, 0x06ea, 0x01a3, 0x0640, 0x0721, 0x02e7, 0x04ad, 0x0494, 0xfe70, 0x009e, 0x0380, 0xfafb, 0xfecf, 0x0890, 0x0224, 0xffd6, 0x0613, 0x005f, 0xfada, 0x0129, 0xfdf3, 0xf949, 0x014d, 0x006d, 0xfa91, 0x0029, 0x002c, 0xf7d8, 0xff02, 0x0615, 0xfbc4, 0xfc2b, 0x035b, 0xfb89, 0xf601, 0xfa4f, 0xfabf, 0xfbd9, 0x00a3, 0xfe0a, 0xfbd4, 0x0009, 0xfe8b, 0xf866, 0xf96c, 0xfcbd, 0xf750, 0xf6d5, 0xfee5, 0xfea6, 0xfc47, 0x00a5, 0x013f, 0xfaa4, 0xf910, 0xf98a, 0xf6f0, 0xfa55, 0xfc01, 0xfac1, 0xff53, 0x001d, 0xfac1, 0xfb9d, 0xfef2, 0xf9c9, 0xf9ce, 0xff10, 0xfabf, 0xfab8, 0xfe59, 0xfa05, 0xfa90, 0x00a1, 0xff54, 0xfdbe, 0x0243, 0xff6b, 0xfac6, 0xfde2, 0xfc78, 0xf927, 0xfc12, 0xfe2f, 0xfc8a, 0xfe15, 0x00a9, 0xff55, 0x0011, 0x0049, 0xfbfb, 0xfa18, 0xfd23, 0xfbc7, 0xf7ac, 0xfd25, 0x019e, 0x0030, 0x02a9, 0x0344, 0x0053, 0x0036, 0x003f, 0xfc42, 0xfd77, 0x047f, 0x022f, 0xffd5, 0x0747, 0x065b, 0xffcd, 0x058c, 0x0801, 0x00b8, 0x029f, 0x057c, 0x0228, 0x02a9, 0x03ae, 0x0336, 0x052e, 0x06d3, 0x0355, 0x0367, 0x097b, 0x0767, 0x040b, 0x0708, 0x062b, 0x00f3, 0x010e, 0x0624, 0x0661, 0x0641, 0x0870, 0x08cf, 0x095c, 0x0672, 0x0114, 0x0064, 0x0450, 0x0372, 0x00f0, 0x074e, 0x0927, 0x0375, 0x04d0, 0x06fa, 0x0278, 0x00e0, 0x023e, 0x0105, 0x0392, 0x0478, 0x01dc, 0x0633, 0x06ad, 0x0137, 0x035b, 0x071e, 0x039a, 0x00b9, 0x0238, 0x0257, 0x03b3, 0x032c, 0x00b5, 0x062b, 0x0920, 0x0425, 0x05d7, 0x09b0, 0x0457, 0x011e, 0x02cb, 0x0112, 0x01e7, 0x03e0, 0x04a0, 0x09f0, 0x0993, 0x025d, 0x03ab, 0x06f0, 0x01ce, 0xffa9, 0x0343, 0x03bf, 0x02bc, 0x0192, 0x0175, 0x03f8, 0x025f, 0xfe13, 0xffaf, 0x037b, 0x017f, 0xff0d, 0x010c, 0x01cc, 0xff47, 0xfda7, 0xff79, 0xffc8, 0xfd08, 0xfdcd, 0x01e5, 0x03c0, 0x00fa, 0xfdf8, 0xfdb9, 0xff87, 0xff9b, 0xfbe2, 0xfeae, 0x0380, 0x0014, 0xfe6f, 0x0115, 0x0048, 0xfe1d, 0xff3b, 0xff7b, 0xff0a, 0x0012, 0xfed0, 0xfed6, 0xffe0, 0xfcbf, 0xfbdb, 0x005d, 0xffb1, 0xf9ae, 0xfb2b, 0x0004, 0xff44, 0xfc6c, 0xfb62, 0xfdf8, 0xff0d, 0xfbbb, 0xfae7, 0xfd8a, 0xfd70, 0xfaee, 0xfbe3, 0xfdf3, 0xfc89, 0xfa9a, 0xfb6e, 0xfd82, 0xfcb8, 0xfaa3, 0xfc2a, 0xfeb9, 0xfc5c, 0xf8a1, 0xfb85, 0x000c, 0xfee7, 0xfbc5, 0xfc1f, 0xfee8, 0xfdac, 0xfae0, 0xfc8b, 0xfef5, 0xfebd, 0xfdf5, 0xfec1, 0x0023, 0xff0f, 0xfc4a, 0xfdd7, 0x00f5, 0xfea6, 0xfd0c, 0x002f, 0x0087, 0xfc77, 0xfc93, 0x0024, 0x013b, 0x00dc, 0xfdb0, 0xfcbd, 0x0060, 0xfed8, 0xfc65, 0xfff5, 0x0160, 0xfef8, 0x0045, 0x0243, 0x0065, 0xfff6, 0x0124, 0x00f9, 0x00f5, 0x00ae, 0xff8e, 0x00df, 0x02e1, 0xffa3, 0xfea2, 0x0390, 0x035d, 0xff35, 0xff1f, 0x009b, 0x0048, 0xffed, 0x0005, 0xfff7, 0x0019, 0xff23, 0xfe36, 0xff91, 0x0112, 0x0088, 0xfff6, 0x00fa, 0x00a3, 0xfe18, 0xfe82, 0x01b6, 0x00ae, 0xfead, 0x018f, 0x02ef, 0x0126, 0x002b, 0xffb6, 0x01e3, 0x0382, 0x00b0, 0x00bd, 0x0402, 0x024e, 0x0002, 0x02e3, 0x0327, 0x00b6, 0x01cf, 0x02ca, 0x0250, 0x0280, 0x01bd, 0x021d, 0x04f6, 0x0340, 0xfee9, 0x0095, 0x0305, 0x00bc, 0x012c, 0x04fc, 0x0469, 0x0257, 0x027e, 0x0242, 0x01ad, 0x014b, 0x00c3, 0x0147, 0x037a, 0x036a, 0x00b5, 0x0068, 0x0121, 0xff9a, 0xfec8, 0x0143, 0x0151, 0xfd18, 0xfced, 0xffbd, 0x0066, 0x007d, 0xff3b, 0xfdd4, 0xfe9a, 0xff0d, 0xfdc1, 0xfe33, 0xffd7, 0xfd45, 0xfbe9, 0xffc6, 0xff2d, 0xfb3e, 0xfd69, 0x0057, 0xff59, 0xffc4, 0x00ad, 0x0017, 0xffc4, 0xfde4, 0xfc22, 0xfe08, 0x004b, 0xffd4, 0x0028, 0x0265, 0x00fa, 0xfdc5, 0xfe0b, 0xff0e, 0xfe78, 0xfdca, 0xfe74, 0xff9b, 0x005c, 0x0106, 0x00eb, 0x015c, 0x01a8, 0xff52, 0xfee2, 0x00ee, 0xffbe, 0xfec8, 0x010d, 0x01ab, 0x00d9, 0x0106, 0x010d, 0x00e8, 0x0118, 0x00e8, 0x012b, 0x02b4, 0x0211, 0xff7a, 0xff8e, 0x0115, 0x0100, 0x00de, 0x02dd, 0x0379, 0x00f9, 0xffd1, 0x0018, 0xfff6, 0xfffa, 0x000c, 0xfff1, 0x0004, 0x0012, 0xffc4, 0x009c, 0x010c, 0xfffb, 0xffe4, 0x001a, 0xfff2, 0xfffc, 0x0012, 0xffe2, 0x0015, 0x015a, 0x0257, 0x01c9, 0x004d, 0xfff9, 0xffdd, 0x0059, 0x019b, 0x004f, 0x0095, 0x030f, 0x0191, 0xff96, 0x015d, 0x0296, 0x01ee, 0x0205, 0x01f5, 0x0220, 0x0303, 0x0276, 0x01b6, 0x02a2, 0x02f4, 0x01f9, 0x0209, 0x01e3, 0x0073, 0x00ad, 0x0219, 0x0205, 0x00f2, 0x000a, 0xffc0, 0x00c9, 0x0105, 0xffac, 0x007c, 0x0198, 0x0051, 0xffcf, 0x001b, 0xfff4, 0x0001, 0x0002, 0xfffe, 0xfffb, 0x0005, 0xfffd, 0xfff3, 0x0025, 0xff14, 0xfe3b, 0xffa5, 0xfffc, 0xfee0, 0xff17, 0xffe8, 0x0010, 0xffec, 0x0017, 0xffe5, 0xff21, 0xfef3, 0xfef8, 0xff4b, 0x002c, 0xffc0, 0xfee9, 0xffc3, 0x001f, 0xff65, 0xffbc, 0x001d, 0xfff2, 000000, 0x0003, 0xfffc, 0xfffc, 0x000a, 0xffec, 0x0015, 0x0095, 0x002c, 0xffc9, 0x006a, 0x0078, 0xfff2, 0xfffb, 0x0006, 0xfffa, 0x0002, 0xfffd, 0x0004, 0xfff4, 0x0010, 0xfff2, 0xfff7, 0x003a, 0xfeb1, 0xfe3a, 0xfff4, 0x0020, 0xffde, 0x0015, 0xfff6, 000000, 0x0002, 0xfffc, 0x0001, 0xfffe, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000, 000000 }; iaxmodem-1.2.0/lib/libiax2/src/md5.c0000644000175000017500000002147511150047220016374 0ustar julienjulien/* MD5 checksum routines used for authentication. Not covered by GPL, but in the public domain as per the copyright below */ #ifdef FREEBSD # include #elif defined(LINUX) # include # include # include #elif defined(SOLARIS) /* each solaris is different -- this won't work on 2.6 or 2.7 */ # include /* Defines either _LITTLE_ENDIAN or _BIG_ENDIAN */ # define __BIG_ENDIAN 4321 # define __LITTLE_ENDIAN 1234 # define BIG_ENDIAN 4321 # define LITTLE_ENDIAN 1234 # ifdef _LITTLE_ENDIAN # define __BYTE_ORDER __LITTLE_ENDIAN # define BYTE_ORDER LITTLE_ENDIAN # else # define __BYTE_ORDER __BIG_ENDIAN # define BYTE_ORDER BIG_ENDIAN # endif #endif #if __BYTE_ORDER == __BIG_ENDIAN || BYTE_ORDER == BIG_ENDIAN # define HIGHFIRST 1 #elif __BYTE_ORDER == __LITTLE_ENDIAN || BYTE_ORDER == LITLE_ENDIAN # undef HIGHFIRST #else # error "Please fix " #endif /* * This code implements the MD5 message-digest algorithm. * The algorithm is due to Ron Rivest. This code was * written by Colin Plumb in 1993, no copyright is claimed. * This code is in the public domain; do with it what you wish. * * Equivalent code is available from RSA Data Security, Inc. * This code has been tested against that, and is equivalent, * except that you don't need to include two pages of legalese * with every copy. * * To compute the message digest of a chunk of bytes, declare an * MD5Context structure, pass it to MD5Init, call MD5Update as * needed on buffers full of bytes, and then call MD5Final, which * will fill a supplied 16-byte array with the digest. */ #include /* for memcpy() */ #include "md5.h" #ifndef HIGHFIRST #define byteReverse(buf, len) /* Nothing */ #else void byteReverse(uint8_t *buf, unsigned int longs); #ifndef ASM_MD5 /* * Note: this code is harmless on little-endian machines. */ void byteReverse(uint8_t *buf, unsigned int longs) { uint32_t t; do { t = (uint32_t) ((unsigned) buf[3] << 8 | buf[2]) << 16 | ((unsigned) buf[1] << 8 | buf[0]); *(uint32_t *) buf = t; buf += 4; } while (--longs); } #endif #endif /* * Start MD5 accumulation. Set bit count to 0 and buffer to mysterious * initialization constants. */ void MD5Init(struct MD5Context *ctx) { ctx->buf[0] = 0x67452301; ctx->buf[1] = 0xefcdab89; ctx->buf[2] = 0x98badcfe; ctx->buf[3] = 0x10325476; ctx->bits[0] = 0; ctx->bits[1] = 0; } /* * Update context to reflect the concatenation of another buffer full * of bytes. */ void MD5Update(struct MD5Context *ctx, uint8_t const *buf, unsigned int len) { uint32_t t; /* Update bitcount */ t = ctx->bits[0]; if ((ctx->bits[0] = t + ((uint32_t) len << 3)) < t) ctx->bits[1]++; /* Carry from low to high */ ctx->bits[1] += len >> 29; t = (t >> 3) & 0x3f; /* Bytes already in shsInfo->data */ /* Handle any leading odd-sized chunks */ if (t) { uint8_t *p = (uint8_t *) ctx->in + t; t = 64 - t; if (len < t) { memcpy(p, buf, len); return; } memcpy(p, buf, t); byteReverse(ctx->in, 16); MD5Transform(ctx->buf, (uint32_t *) ctx->in); buf += t; len -= t; } /* Process data in 64-byte chunks */ while (len >= 64) { memcpy(ctx->in, buf, 64); byteReverse(ctx->in, 16); MD5Transform(ctx->buf, (uint32_t *) ctx->in); buf += 64; len -= 64; } /* Handle any remaining bytes of data. */ memcpy(ctx->in, buf, len); } /* * Final wrapup - pad to 64-byte boundary with the bit pattern * 1 0* (64-bit count of bits processed, MSB-first) */ void MD5Final(uint8_t digest[16], struct MD5Context *ctx) { unsigned int count; uint8_t *p; /* Compute number of bytes mod 64 */ count = (ctx->bits[0] >> 3) & 0x3F; /* Set the first char of padding to 0x80. This is safe since there is always at least one byte free */ p = ctx->in + count; *p++ = 0x80; /* Bytes of padding needed to make 64 bytes */ count = 64 - 1 - count; /* Pad out to 56 mod 64 */ if (count < 8) { /* Two lots of padding: Pad the first block to 64 bytes */ memset(p, 0, count); byteReverse(ctx->in, 16); MD5Transform(ctx->buf, (uint32_t *) ctx->in); /* Now fill the next block with 56 bytes */ memset(ctx->in, 0, 56); } else { /* Pad block to 56 bytes */ memset(p, 0, count - 8); } byteReverse(ctx->in, 14); /* Append length in bits and transform */ ((uint32_t *) ctx->in)[14] = ctx->bits[0]; ((uint32_t *) ctx->in)[15] = ctx->bits[1]; MD5Transform(ctx->buf, (uint32_t *) ctx->in); byteReverse((uint8_t *) ctx->buf, 4); memcpy(digest, ctx->buf, 16); memset(ctx, 0, sizeof(ctx)); /* In case it's sensitive */ } #ifndef ASM_MD5 /* The four core functions - F1 is optimized somewhat */ /* #define F1(x, y, z) (x & y | ~x & z) */ #define F1(x, y, z) (z ^ (x & (y ^ z))) #define F2(x, y, z) F1(z, x, y) #define F3(x, y, z) (x ^ y ^ z) #define F4(x, y, z) (y ^ (x | ~z)) /* This is the central step in the MD5 algorithm. */ #define MD5STEP(f, w, x, y, z, data, s) \ ( w += f(x, y, z) + data, w = w<>(32-s), w += x ) /* * The core of the MD5 algorithm, this alters an existing MD5 hash to * reflect the addition of 16 longwords of new data. MD5Update blocks * the data and converts bytes into longwords for this routine. */ void MD5Transform(uint32_t buf[4], uint32_t const in[16]) { uint32_t a, b, c, d; a = buf[0]; b = buf[1]; c = buf[2]; d = buf[3]; MD5STEP(F1, a, b, c, d, in[0] + 0xd76aa478, 7); MD5STEP(F1, d, a, b, c, in[1] + 0xe8c7b756, 12); MD5STEP(F1, c, d, a, b, in[2] + 0x242070db, 17); MD5STEP(F1, b, c, d, a, in[3] + 0xc1bdceee, 22); MD5STEP(F1, a, b, c, d, in[4] + 0xf57c0faf, 7); MD5STEP(F1, d, a, b, c, in[5] + 0x4787c62a, 12); MD5STEP(F1, c, d, a, b, in[6] + 0xa8304613, 17); MD5STEP(F1, b, c, d, a, in[7] + 0xfd469501, 22); MD5STEP(F1, a, b, c, d, in[8] + 0x698098d8, 7); MD5STEP(F1, d, a, b, c, in[9] + 0x8b44f7af, 12); MD5STEP(F1, c, d, a, b, in[10] + 0xffff5bb1, 17); MD5STEP(F1, b, c, d, a, in[11] + 0x895cd7be, 22); MD5STEP(F1, a, b, c, d, in[12] + 0x6b901122, 7); MD5STEP(F1, d, a, b, c, in[13] + 0xfd987193, 12); MD5STEP(F1, c, d, a, b, in[14] + 0xa679438e, 17); MD5STEP(F1, b, c, d, a, in[15] + 0x49b40821, 22); MD5STEP(F2, a, b, c, d, in[1] + 0xf61e2562, 5); MD5STEP(F2, d, a, b, c, in[6] + 0xc040b340, 9); MD5STEP(F2, c, d, a, b, in[11] + 0x265e5a51, 14); MD5STEP(F2, b, c, d, a, in[0] + 0xe9b6c7aa, 20); MD5STEP(F2, a, b, c, d, in[5] + 0xd62f105d, 5); MD5STEP(F2, d, a, b, c, in[10] + 0x02441453, 9); MD5STEP(F2, c, d, a, b, in[15] + 0xd8a1e681, 14); MD5STEP(F2, b, c, d, a, in[4] + 0xe7d3fbc8, 20); MD5STEP(F2, a, b, c, d, in[9] + 0x21e1cde6, 5); MD5STEP(F2, d, a, b, c, in[14] + 0xc33707d6, 9); MD5STEP(F2, c, d, a, b, in[3] + 0xf4d50d87, 14); MD5STEP(F2, b, c, d, a, in[8] + 0x455a14ed, 20); MD5STEP(F2, a, b, c, d, in[13] + 0xa9e3e905, 5); MD5STEP(F2, d, a, b, c, in[2] + 0xfcefa3f8, 9); MD5STEP(F2, c, d, a, b, in[7] + 0x676f02d9, 14); MD5STEP(F2, b, c, d, a, in[12] + 0x8d2a4c8a, 20); MD5STEP(F3, a, b, c, d, in[5] + 0xfffa3942, 4); MD5STEP(F3, d, a, b, c, in[8] + 0x8771f681, 11); MD5STEP(F3, c, d, a, b, in[11] + 0x6d9d6122, 16); MD5STEP(F3, b, c, d, a, in[14] + 0xfde5380c, 23); MD5STEP(F3, a, b, c, d, in[1] + 0xa4beea44, 4); MD5STEP(F3, d, a, b, c, in[4] + 0x4bdecfa9, 11); MD5STEP(F3, c, d, a, b, in[7] + 0xf6bb4b60, 16); MD5STEP(F3, b, c, d, a, in[10] + 0xbebfbc70, 23); MD5STEP(F3, a, b, c, d, in[13] + 0x289b7ec6, 4); MD5STEP(F3, d, a, b, c, in[0] + 0xeaa127fa, 11); MD5STEP(F3, c, d, a, b, in[3] + 0xd4ef3085, 16); MD5STEP(F3, b, c, d, a, in[6] + 0x04881d05, 23); MD5STEP(F3, a, b, c, d, in[9] + 0xd9d4d039, 4); MD5STEP(F3, d, a, b, c, in[12] + 0xe6db99e5, 11); MD5STEP(F3, c, d, a, b, in[15] + 0x1fa27cf8, 16); MD5STEP(F3, b, c, d, a, in[2] + 0xc4ac5665, 23); MD5STEP(F4, a, b, c, d, in[0] + 0xf4292244, 6); MD5STEP(F4, d, a, b, c, in[7] + 0x432aff97, 10); MD5STEP(F4, c, d, a, b, in[14] + 0xab9423a7, 15); MD5STEP(F4, b, c, d, a, in[5] + 0xfc93a039, 21); MD5STEP(F4, a, b, c, d, in[12] + 0x655b59c3, 6); MD5STEP(F4, d, a, b, c, in[3] + 0x8f0ccc92, 10); MD5STEP(F4, c, d, a, b, in[10] + 0xffeff47d, 15); MD5STEP(F4, b, c, d, a, in[1] + 0x85845dd1, 21); MD5STEP(F4, a, b, c, d, in[8] + 0x6fa87e4f, 6); MD5STEP(F4, d, a, b, c, in[15] + 0xfe2ce6e0, 10); MD5STEP(F4, c, d, a, b, in[6] + 0xa3014314, 15); MD5STEP(F4, b, c, d, a, in[13] + 0x4e0811a1, 21); MD5STEP(F4, a, b, c, d, in[4] + 0xf7537e82, 6); MD5STEP(F4, d, a, b, c, in[11] + 0xbd3af235, 10); MD5STEP(F4, c, d, a, b, in[2] + 0x2ad7d2bb, 15); MD5STEP(F4, b, c, d, a, in[9] + 0xeb86d391, 21); buf[0] += a; buf[1] += b; buf[2] += c; buf[3] += d; } #endif iaxmodem-1.2.0/lib/libiax2/src/winpoop.h0000644000175000017500000000137111150047220017400 0ustar julienjulien/* * Functions Windows doesn't have... but should * Copyright(C) 2001, Linux Support Services, Inc. * * Distributed under GNU LGPL. * * These are NOT fully compliant with BSD 4.3 and are not * threadsafe. * */ #ifndef _winpoop_h #define _winpoop_h #if defined(_MSC_VER) #define INLINE __inline #else #define INLINE inline #endif #include void gettimeofday(struct timeval *tv, void /*struct timezone*/ *tz); static INLINE int inet_aton(char *cp, struct in_addr *inp) { int a1, a2, a3, a4; unsigned int saddr; if (sscanf(cp, "%d.%d.%d.%d", &a1, &a2, &a3, &a4) != 4) return 0; a1 &= 0xff; a2 &= 0xff; a3 &= 0xff; a4 &= 0xff; saddr = (a1 << 24) | (a2 << 16) | (a3 << 8) | a4; inp->s_addr = htonl(saddr); return 1; } #endif iaxmodem-1.2.0/lib/libiax2/src/frame.h0000644000175000017500000001157611150047220017007 0ustar julienjulien/* * libiax: An implementation of the Inter-Asterisk eXchange protocol * * Asterisk internal frame definitions. * * Copyright (C) 1999, Mark Spencer * * Mark Spencer * * This program is free software, distributed under the terms of * the GNU Lesser General Public License. Other components of * Asterisk are distributed under The GNU General Public License * only. */ #ifndef _LIBIAX_FRAME_H #define _LIBIAX_FRAME_H #if defined(__cplusplus) || defined(c_plusplus) extern "C" { #endif /* Frame types */ #define AST_FRAME_DTMF 1 /* A DTMF digit, subclass is the digit */ #define AST_FRAME_VOICE 2 /* Voice data, subclass is AST_FORMAT_* */ #define AST_FRAME_VIDEO 3 /* Video frame, maybe?? :) */ #define AST_FRAME_CONTROL 4 /* A control frame, subclass is AST_CONTROL_* */ #define AST_FRAME_NULL 5 /* An empty, useless frame */ #define AST_FRAME_IAX 6 /* Inter Aterisk Exchange private frame type */ #define AST_FRAME_TEXT 7 /* Text messages */ #define AST_FRAME_IMAGE 8 /* Image Frames */ #define AST_FRAME_HTML 9 /* HTML Frames */ #define AST_FRAME_CNG 10 /* Comfort Noise frame (subclass is level of CNG in -dBov) */ /* HTML subclasses */ #define AST_HTML_URL 1 /* Sending a URL */ #define AST_HTML_DATA 2 /* Data frame */ #define AST_HTML_BEGIN 4 /* Beginning frame */ #define AST_HTML_END 8 /* End frame */ #define AST_HTML_LDCOMPLETE 16 /* Load is complete */ #define AST_HTML_NOSUPPORT 17 /* Peer is unable to support HTML */ #define AST_HTML_LINKURL 18 /* Send URL and track */ #define AST_HTML_UNLINK 19 /* Request no more linkage */ #define AST_HTML_LINKREJECT 20 /* Reject LINKURL */ /* Data formats for capabilities and frames alike */ /*! G.723.1 compression */ #define AST_FORMAT_G723_1 (1 << 0) /*! GSM compression */ #define AST_FORMAT_GSM (1 << 1) /*! Raw mu-law data (G.711) */ #define AST_FORMAT_ULAW (1 << 2) /*! Raw A-law data (G.711) */ #define AST_FORMAT_ALAW (1 << 3) /*! ADPCM (G.726, 32kbps) */ #define AST_FORMAT_G726 (1 << 4) /*! ADPCM (IMA) */ #define AST_FORMAT_ADPCM (1 << 5) /*! Raw 16-bit Signed Linear (8000 Hz) PCM */ #define AST_FORMAT_SLINEAR (1 << 6) /*! LPC10, 180 samples/frame */ #define AST_FORMAT_LPC10 (1 << 7) /*! G.729A audio */ #define AST_FORMAT_G729A (1 << 8) /*! SpeeX Free Compression */ #define AST_FORMAT_SPEEX (1 << 9) /*! iLBC Free Compression */ #define AST_FORMAT_ILBC (1 << 10) /*! Maximum audio format */ #define AST_FORMAT_MAX_AUDIO (1 << 15) /*! JPEG Images */ #define AST_FORMAT_JPEG (1 << 16) /*! PNG Images */ #define AST_FORMAT_PNG (1 << 17) /*! H.261 Video */ #define AST_FORMAT_H261 (1 << 18) /*! H.263 Video */ #define AST_FORMAT_H263 (1 << 19) /*! H.263+ Video */ #define AST_FORMAT_H263p (1 << 20) /*! H.264 Video*/ #define AST_FORMAT_H264 (1 << 21) /*! MPEG4 Video*/ #define AST_FORMAT_MPEG4 (1 << 22) /*! Theora Video */ #define AST_FORMAT_THEORA (1 << 24) /*! Max one */ #define AST_FORMAT_MAX_VIDEO (1 << 24) /* Control frame types */ #define AST_CONTROL_HANGUP 1 /* Other end has hungup */ #define AST_CONTROL_RING 2 /* Local ring */ #define AST_CONTROL_RINGING 3 /* Remote end is ringing */ #define AST_CONTROL_ANSWER 4 /* Remote end has answered */ #define AST_CONTROL_BUSY 5 /* Remote end is busy */ #define AST_CONTROL_TAKEOFFHOOK 6 /* Make it go off hook */ #define AST_CONTROL_OFFHOOK 7 /* Line is off hook */ #define AST_CONTROL_CONGESTION 8 /* Congestion (circuits busy) */ #define AST_CONTROL_FLASH 9 /* Flash hook */ #define AST_CONTROL_WINK 10 /* Wink */ #define AST_CONTROL_OPTION 11 /* Set an option */ #define AST_FRIENDLY_OFFSET 64 /* Reserved header space */ struct ast_frame { /*! Kind of frame */ int frametype; /*! Subclass, frame dependent */ int subclass; /*! Length of data */ int datalen; /*! Number of 8khz samples in this frame */ int samples; /*! Was the data malloc'd? i.e. should we free it when we discard the f rame? */ int mallocd; /*! How far into "data" the data really starts */ int offset; /*! Optional source of frame for debugging */ char *src; /*! Pointer to actual data */ void *data; /*! Next/Prev for linking stand alone frames */ struct ast_frame *prev; /*! Next/Prev for linking stand alone frames */ struct ast_frame *next; /* Unused except if debugging is turned on, but left in the struct so that it can be turned on without requiring a r ecompile of the whole thing */ }; #if defined(__cplusplus) || defined(c_plusplus) } #endif #endif iaxmodem-1.2.0/lib/libiax2/src/dialtone.h0000644000175000017500000001400211150047220017477 0ustar julienjulien/* dialtone.h: Generated from frequencies 350 and 440 by gensound. 800 samples */ static short dialtone[800] = { 0, 9997, 19004, 26133, 30692, 32251, 30690, 26206, 19286, 10657, 1206, -8116, -16396, -22848, -26895, -28221, -26797, -22878, -16960, -9723, -1954, 5545, 12044, 16954, 19887, 20687, 19434, 16420, 12107, 7061, 1881, -2866, -6721, -9365, -10657, -10634, -9491, -7547, -5190, -2822, -801, 607, 1263, 1168, 454, -633, -1784, -2669, -2993, -2548, -1247, 855, 3558, 6538, 9388, 11665, 12955, 12933, 11408, 8370, 3996, -1349, -7152, -12797, -17635, -21060, -22583, -21895, -18914, -13807, -6985, 934, 9180, 16913, 23309, 27654, 29422, 28342, 24429, 17998, 9630, 123, -9589, -18538, -25813, -30667, -32588, -31360, -27088, -20185, -11332, -1411, 8594, 17694, 24997, 29805, 31675, 30473, 26374, 19844, 11585, 2455, -6618, -14745, -21156, -25284, -26815, -25713, -22213, -16785, -10073, -2824, 4203, 10318, 14969, 17794, 18653, 17628, 14998, 11197, 6753, 2217, -1899, -5189, -7386, -8388, -8261, -7212, -5555, -3657, -1881, -536, 169, 157, -515, -1664, -3009, -4217, -4954, -4940, -3996, -2080, 697, 4081, 7689, 11059, 13710, 15199, 15187, 13489, 10114, 5272, -630, -7031, -13263, -18632, -22491, -24320, -23794, -20823, -15582, -8498, -218, 8457, 16651, 23507, 28276, 30407, 29606, 25876, 19524, 11134, 1511, -8401, -17616, -25208, -30406, -32682, -31800, -27845, -21215, -12576, -2796, 7150, 16278, 23700, 28713, 30868, 30015, 26312, 20199, 12351, 3598, -5164, -13071, -19378, -23531, -25223, -24413, -21318, -16384, -10218, -3526, 2980, 8655, 12985, 15642, 16505, 15661, 13381, 10073, 6228, 2348, -1110, -3796, -5495, -6152, -5863, -4853, -3434, -1954, -744, -62, -60, -757, -2037, -3664, -5317, -6637, -7283, -6985, -5590, -3096, 334, 4390, 8631, 12544, 15605, 17339, 17393, 15582, 11928, 6672, 258, -6705, -13506, -19403, -23711, -25879, -25558, -22653, -17341, -10061, -1480, 7570, 16185, 23475, 28661, 31164, 30670, 27167, 20951, 12603, 2930, -7116, -16540, -24401, -29915, -32533, -32003, -28391, -22075, -13704, -4128, 5690, 14781, 22262, 27432, 29838, 29319, 26014, 20339, 12940, 4614, -3777, -11401, -17540, -21660, -23463, -22908, -20199, -15755, -10150, -4044, 1898, 7079, 11030, 13459, 14268, 13555, 11585, 8745, 5487, 2268, -511, -2559, -3716, -3975, -3468, -2440, -1206, -101, 578, 618, -78, -1470, -3382, -5524, -7531, -9018, -9630, -9103, -7308, -4280, -226, 4483, 9357, 13829, 17329, 19352, 19524, 17659, 13788, 8177, 1302, -6184, -13528, -19945, -24710, -27240, -27167, -24381, -19058, -11646, -2830, 6539, 15528, 23219, 28806, 31685, 31520, 28282, 22254, 14010, 4355, -5759, -15331, -23411, -29203, -32144, -31966, -28714, -22748, -14695, -5384, 4241, 13228, 20707, 25981, 28600, 28391, 25479, 20256, 13337, 5482, -2482, -9761, -15668, -19694, -21556, -21215, -18865, -14902, -9864, -4366, 975, 5614, 9130, 11270, 11967, 11332, 9628, 7223, 4536, 1976, -113, -1495, -2071, -1882, -1102, 0, 1102, 1882, 2071, 1495, 113, -1976, -4536, -7223, -9628, -11332, -11967, -11270, -9130, -5614, -975, 4366, 9864, 14902, 18865, 21215, 21556, 19694, 15668, 9761, 2482, -5482, -13337, -20256, -25479, -28391, -28600, -25981, -20707, -13228, -4241, 5384, 14695, 22748, 28714, 31966, 32144, 29203, 23411, 15331, 5759, -4355, -14010, -22254, -28282, -31520, -31685, -28806, -23219, -15528, -6539, 2830, 11646, 19058, 24381, 27167, 27240, 24710, 19945, 13528, 6184, -1302, -8177, -13788, -17659, -19524, -19352, -17329, -13829, -9357, -4483, 226, 4280, 7308, 9103, 9630, 9018, 7531, 5524, 3382, 1470, 78, -618, -578, 101, 1206, 2440, 3468, 3975, 3716, 2559, 511, -2268, -5487, -8745, -11585, -13555, -14268, -13459, -11030, -7079, -1898, 4044, 10150, 15755, 20199, 22908, 23463, 21660, 17540, 11401, 3777, -4614, -12940, -20339, -26014, -29319, -29838, -27432, -22262, -14781, -5690, 4128, 13704, 22075, 28391, 32003, 32533, 29915, 24401, 16540, 7116, -2930, -12603, -20951, -27167, -30670, -31164, -28661, -23475, -16185, -7570, 1480, 10061, 17341, 22653, 25558, 25879, 23711, 19403, 13506, 6705, -258, -6672, -11928, -15582, -17393, -17339, -15605, -12544, -8631, -4390, -334, 3096, 5590, 6985, 7283, 6637, 5317, 3664, 2037, 757, 60, 62, 744, 1954, 3434, 4853, 5863, 6152, 5495, 3796, 1110, -2348, -6228, -10073, -13381, -15661, -16505, -15642, -12985, -8655, -2980, 3526, 10218, 16384, 21318, 24413, 25223, 23531, 19378, 13071, 5164, -3598, -12351, -20199, -26312, -30015, -30868, -28713, -23700, -16278, -7150, 2796, 12576, 21215, 27845, 31800, 32682, 30406, 25208, 17616, 8401, -1511, -11134, -19524, -25876, -29606, -30407, -28276, -23507, -16651, -8457, 218, 8498, 15582, 20823, 23794, 24320, 22491, 18632, 13263, 7031, 630, -5272, -10114, -13489, -15187, -15199, -13710, -11059, -7689, -4081, -697, 2080, 3996, 4940, 4954, 4217, 3009, 1664, 515, -157, -169, 536, 1881, 3657, 5555, 7212, 8261, 8388, 7386, 5189, 1899, -2217, -6753, -11197, -14998, -17628, -18653, -17794, -14969, -10318, -4203, 2824, 10073, 16785, 22213, 25713, 26815, 25284, 21156, 14745, 6618, -2455, -11585, -19844, -26374, -30473, -31675, -29805, -24997, -17694, -8594, 1411, 11332, 20185, 27088, 31360, 32588, 30667, 25813, 18538, 9589, -123, -9630, -17998, -24429, -28342, -29422, -27654, -23309, -16913, -9180, -934, 6985, 13807, 18914, 21895, 22583, 21060, 17635, 12797, 7152, 1349, -3996, -8370, -11408, -12933, -12955, -11665, -9388, -6538, -3558, -855, 1247, 2548, 2993, 2669, 1784, 633, -454, -1168, -1263, -607, 801, 2822, 5190, 7547, 9491, 10634, 10657, 9365, 6721, 2866, -1881, -7061, -12107, -16420, -19434, -20687, -19887, -16954, -12044, -5545, 1954, 9723, 16960, 22878, 26797, 28221, 26895, 22848, 16396, 8116, -1206, -10657, -19286, -26206, -30690, -32251, -30692, -26133, -19004, -9997, }; iaxmodem-1.2.0/lib/libiax2/src/iax2-parser.c0000644000175000017500000005604511150047220020045 0ustar julienjulien/* * Asterisk -- A telephony toolkit for Linux. * * Implementation of Inter-Asterisk eXchange * * Copyright (C) 2003-2004, Digium * * Mark Spencer * * This program is free software, distributed under the terms of * the GNU Lesser (Library) General Public License */ #if defined(WIN32) || defined(_WIN32_WCE) #include #define snprintf _snprintf #else #include #include #include #include #endif #ifndef _MSC_VER #include #endif #include #include #include #include "frame.h" #include "iax2.h" #include "iax2-parser.h" static int frames = 0; static int iframes = 0; static int oframes = 0; #ifdef ALIGN32 static unsigned int get_uint32(unsigned char *p) { return (p[0] << 24) | (p[1] << 16) | (p[2] << 8) | p[3]; } static unsigned short get_uint16(unsigned char *p) { return (p[0] << 8) | p[1] ; } #else #define get_uint32(p) (*((unsigned int *)(p))) #define get_uint16(p) (*((unsigned short *)(p))) #endif static void internaloutput(const char *str) { printf(str); } static void internalerror(const char *str) { fprintf(stderr, "WARNING: %s", str); } static void (*outputf)(const char *str) = internaloutput; static void (*errorf)(const char *str) = internalerror; static void dump_addr(char *output, int maxlen, void *value, int len) { struct sockaddr_in sin; if (len == sizeof(sin)) { memcpy(&sin, value, len); snprintf(output, maxlen, "IPV4 %s:%d", inet_ntoa(sin.sin_addr), ntohs(sin.sin_port)); } else { snprintf(output, maxlen, "Invalid Address"); } } static void dump_string(char *output, int maxlen, void *value, int len) { maxlen--; if (maxlen > len) maxlen = len; strncpy(output,(const char *)value, maxlen); output[maxlen] = '\0'; } static void dump_int(char *output, int maxlen, void *value, int len) { if (len == (int)sizeof(unsigned int)) snprintf(output, maxlen, "%lu", (unsigned long)ntohl(get_unaligned_uint32(value))); else snprintf(output, maxlen, "Invalid INT"); } static void dump_short(char *output, int maxlen, void *value, int len) { if (len == (int)sizeof(unsigned short)) snprintf(output, maxlen, "%d", ntohs(get_unaligned_uint16(value))); else snprintf(output, maxlen, "Invalid SHORT"); } static void dump_byte(char *output, int maxlen, void *value, int len) { if (len == (int)sizeof(unsigned char)) snprintf(output, maxlen, "%d", *((unsigned char *)value)); else snprintf(output, maxlen, "Invalid BYTE"); } static void dump_samprate(char *output, int maxlen, void *value, int len) { char tmp[256]=""; int sr; if (len == (int)sizeof(unsigned short)) { sr = ntohs(*((unsigned short *)value)); if (sr & IAX_RATE_8KHZ) strcat(tmp, ",8khz"); if (sr & IAX_RATE_11KHZ) strcat(tmp, ",11.025khz"); if (sr & IAX_RATE_16KHZ) strcat(tmp, ",16khz"); if (sr & IAX_RATE_22KHZ) strcat(tmp, ",22.05khz"); if (sr & IAX_RATE_44KHZ) strcat(tmp, ",44.1khz"); if (sr & IAX_RATE_48KHZ) strcat(tmp, ",48khz"); if (strlen(tmp)) strncpy(output, &tmp[1], maxlen - 1); else strncpy(output, "None specified!\n", maxlen - 1); } else snprintf(output, maxlen, "Invalid SHORT"); } static void dump_prov_ies(char *output, int maxlen, unsigned char *iedata, int len); static void dump_prov(char *output, int maxlen, void *value, int len) { dump_prov_ies(output, maxlen, (unsigned char *)value, len); } static struct iax2_ie { int ie; char *name; void (*dump)(char *output, int maxlen, void *value, int len); } ies[] = { { IAX_IE_CALLED_NUMBER, "CALLED NUMBER", dump_string }, { IAX_IE_CALLING_NUMBER, "CALLING NUMBER", dump_string }, { IAX_IE_CALLING_ANI, "ANI", dump_string }, { IAX_IE_CALLING_NAME, "CALLING NAME", dump_string }, { IAX_IE_CALLED_CONTEXT, "CALLED CONTEXT", dump_string }, { IAX_IE_USERNAME, "USERNAME", dump_string }, { IAX_IE_PASSWORD, "PASSWORD", dump_string }, { IAX_IE_CAPABILITY, "CAPABILITY", dump_int }, { IAX_IE_FORMAT, "FORMAT", dump_int }, { IAX_IE_LANGUAGE, "LANGUAGE", dump_string }, { IAX_IE_VERSION, "VERSION", dump_short }, { IAX_IE_ADSICPE, "ADSICPE", dump_short }, { IAX_IE_DNID, "DNID", dump_string }, { IAX_IE_AUTHMETHODS, "AUTHMETHODS", dump_short }, { IAX_IE_CHALLENGE, "CHALLENGE", dump_string }, { IAX_IE_MD5_RESULT, "MD5 RESULT", dump_string }, { IAX_IE_RSA_RESULT, "RSA RESULT", dump_string }, { IAX_IE_APPARENT_ADDR, "APPARENT ADDRESS", dump_addr }, { IAX_IE_REFRESH, "REFRESH", dump_short }, { IAX_IE_DPSTATUS, "DIALPLAN STATUS", dump_short }, { IAX_IE_CALLNO, "CALL NUMBER", dump_short }, { IAX_IE_CAUSE, "CAUSE", dump_string }, { IAX_IE_IAX_UNKNOWN, "UNKNOWN IAX CMD", dump_byte }, { IAX_IE_MSGCOUNT, "MESSAGE COUNT", dump_short }, { IAX_IE_AUTOANSWER, "AUTO ANSWER REQ" }, { IAX_IE_TRANSFERID, "TRANSFER ID", dump_int }, { IAX_IE_RDNIS, "REFERRING DNIS", dump_string }, { IAX_IE_PROVISIONING, "PROVISIONING", dump_prov }, { IAX_IE_AESPROVISIONING, "AES PROVISIONG" }, { IAX_IE_DATETIME, "DATE TIME", dump_int }, { IAX_IE_DEVICETYPE, "DEVICE TYPE", dump_string }, { IAX_IE_SERVICEIDENT, "SERVICE IDENT", dump_string }, { IAX_IE_FIRMWAREVER, "FIRMWARE VER", dump_short }, { IAX_IE_FWBLOCKDESC, "FW BLOCK DESC", dump_int }, { IAX_IE_FWBLOCKDATA, "FW BLOCK DATA" }, { IAX_IE_PROVVER, "PROVISIONG VER", dump_int }, { IAX_IE_CALLINGPRES, "CALLING PRESNTN", dump_byte }, { IAX_IE_CALLINGTON, "CALLING TYPEOFNUM", dump_byte }, { IAX_IE_CALLINGTNS, "CALLING TRANSITNET", dump_short }, { IAX_IE_SAMPLINGRATE, "SAMPLINGRATE", dump_samprate }, { IAX_IE_CODEC_PREFS, "CODEC_PREFS", dump_string }, { IAX_IE_RR_JITTER, "RR_JITTER", dump_int }, { IAX_IE_RR_LOSS, "RR_LOSS", dump_int }, { IAX_IE_RR_PKTS, "RR_PKTS", dump_int }, { IAX_IE_RR_DELAY, "RR_DELAY", dump_short }, { IAX_IE_RR_DROPPED, "RR_DROPPED", dump_int }, { IAX_IE_RR_OOO, "RR_OOO", dump_int }, }; const char *iax_ie2str(int ie) { int x; for (x=0;x<(int)sizeof(ies) / (int)sizeof(ies[0]); x++) { if (ies[x].ie == ie) return ies[x].name; } return "Unknown IE"; } static void dump_prov_ies(char *output, int maxlen, unsigned char *iedata, int len) { int ielen; int ie; int found; char tmp[256]; if (len < 2) return; strcpy(output, "\n"); maxlen -= (int)strlen(output); output += strlen(output); while(len > 2) { ie = iedata[0]; ielen = iedata[1]; if (ielen + 2> len) { snprintf(tmp, (int)sizeof(tmp), "Total Prov IE length of %d bytes exceeds remaining prov frame length of %d bytes\n", ielen + 2, len); strncpy(output, tmp, maxlen - 1); maxlen -= (int)strlen(output); output += strlen(output); return; } found = 0; if (!found) { snprintf(tmp, (int)sizeof(tmp), " Unknown Prov IE %03d : Present\n", ie); strncpy(output, tmp, maxlen - 1); maxlen -= (int)strlen(output); output += strlen(output); } iedata += (2 + ielen); len -= (2 + ielen); } } static void dump_ies(unsigned char *iedata, int len) { int ielen; int ie; int x; int found; char interp[1024]; char tmp[1024]; if (len < 2) return; while(len > 2) { ie = iedata[0]; ielen = iedata[1]; if (ielen + 2> len) { snprintf(tmp, (int)sizeof(tmp), "Total IE length of %d bytes exceeds remaining frame length of %d bytes\n", ielen + 2, len); outputf(tmp); return; } found = 0; for (x=0;x<(int)sizeof(ies) / (int)sizeof(ies[0]); x++) { if (ies[x].ie == ie) { if (ies[x].dump) { ies[x].dump(interp, (int)sizeof(interp), iedata + 2, ielen); snprintf(tmp, (int)sizeof(tmp), " %-15.15s : %s\n", ies[x].name, interp); outputf(tmp); } else { if (ielen) snprintf(interp, (int)sizeof(interp), "%d bytes", ielen); else strcpy(interp, "Present"); snprintf(tmp, (int)sizeof(tmp), " %-15.15s : %s\n", ies[x].name, interp); outputf(tmp); } found++; } } if (!found) { snprintf(tmp, (int)sizeof(tmp), " Unknown IE %03d : Present\n", ie); outputf(tmp); } iedata += (2 + ielen); len -= (2 + ielen); } outputf("\n"); } void iax_showframe(struct iax_frame *f, struct ast_iax2_full_hdr *fhi, int rx, struct sockaddr_in *sin, int datalen) { const char *frames[] = { "(0?)", "DTMF ", "VOICE ", "VIDEO ", "CONTROL", "NULL ", "IAX ", "TEXT ", "IMAGE " }; const char *iaxs[] = { "(0?)", "NEW ", "PING ", "PONG ", "ACK ", "HANGUP ", "REJECT ", "ACCEPT ", "AUTHREQ", "AUTHREP", "INVAL ", "LAGRQ ", "LAGRP ", "REGREQ ", "REGAUTH", "REGACK ", "REGREJ ", "REGREL ", "VNAK ", "DPREQ ", "DPREP ", "DIAL ", "TXREQ ", "TXCNT ", "TXACC ", "TXREADY", "TXREL ", "TXREJ ", "QUELCH ", "UNQULCH", "POKE", "PAGE", "MWI", "UNSUPPORTED", "TRANSFER", "PROVISION", "FWDOWNLD", "FWDATA" }; const char *cmds[] = { "(0?)", "HANGUP ", "RING ", "RINGING", "ANSWER ", "BUSY ", "TKOFFHK ", "OFFHOOK ", "CONGESTION ", "FLASH ", "WINK ", "OPTION " }; struct ast_iax2_full_hdr *fh; char retries[20]; char class2[20]; char subclass2[20]; const char *clas; const char *subclass; char tmp[256]; if (f) { fh = (struct ast_iax2_full_hdr *)f->data; snprintf(retries, (int)sizeof(retries), "%03d", f->retries); } else { fh = fhi; if (ntohs(fh->dcallno) & IAX_FLAG_RETRANS) strcpy(retries, "Yes"); else strcpy(retries, " No"); } if (!(ntohs(fh->scallno) & IAX_FLAG_FULL)) { /* Don't mess with mini-frames */ return; } if (fh->type >= (int)(sizeof(frames)/sizeof(char *))) { snprintf(class2, (int)sizeof(class2), "(%d?)", fh->type); clas = class2; } else { clas = frames[(int)fh->type]; } if (fh->type == AST_FRAME_DTMF) { sprintf(subclass2, "%c", fh->csub); subclass = subclass2; } else if (fh->type == AST_FRAME_IAX) { if (fh->csub >= (int)sizeof(iaxs)/(int)sizeof(iaxs[0])) { snprintf(subclass2, (int)sizeof(subclass2), "(%d?)", fh->csub); subclass = subclass2; } else { subclass = iaxs[(int)fh->csub]; } } else if (fh->type == AST_FRAME_CONTROL) { if (fh->csub >= (int)(sizeof(cmds)/sizeof(char *))) { snprintf(subclass2, (int)sizeof(subclass2), "(%d?)", fh->csub); subclass = subclass2; } else { subclass = cmds[(int)fh->csub]; } } else { snprintf(subclass2, (int)sizeof(subclass2), "%d", fh->csub); subclass = subclass2; } snprintf(tmp, (int)sizeof(tmp), "%s-Frame Retry[%s] -- OSeqno: %3.3d ISeqno: %3.3d Type: %s Subclass: %s\n", (rx ? "Rx" : "Tx"), retries, fh->oseqno, fh->iseqno, clas, subclass); outputf(tmp); snprintf(tmp, (int)sizeof(tmp), " Timestamp: %05lums SCall: %5.5d DCall: %5.5d [%s:%d]\n", (unsigned long)ntohl(fh->ts), ntohs(fh->scallno) & ~IAX_FLAG_FULL, ntohs(fh->dcallno) & ~IAX_FLAG_RETRANS, inet_ntoa(sin->sin_addr), ntohs(sin->sin_port)); outputf(tmp); if (fh->type == AST_FRAME_IAX) dump_ies(fh->iedata, datalen); } int iax_ie_append_raw(struct iax_ie_data *ied, unsigned char ie, const void *data, int datalen) { char tmp[256]; if (datalen > ((int)sizeof(ied->buf) - ied->pos)) { snprintf(tmp, (int)sizeof(tmp), "Out of space for ie '%s' (%d), need %d have %d\n", iax_ie2str(ie), ie, datalen, (int)sizeof(ied->buf) - ied->pos); errorf(tmp); return -1; } ied->buf[ied->pos++] = ie; ied->buf[ied->pos++] = datalen; memcpy(ied->buf + ied->pos, data, datalen); ied->pos += datalen; return 0; } int iax_ie_append_addr(struct iax_ie_data *ied, unsigned char ie, struct sockaddr_in *sin) { return iax_ie_append_raw(ied, ie, sin, (int)sizeof(struct sockaddr_in)); } int iax_ie_append_int(struct iax_ie_data *ied, unsigned char ie, unsigned int value) { unsigned int newval; newval = htonl(value); return iax_ie_append_raw(ied, ie, &newval, (int)sizeof(newval)); } int iax_ie_append_short(struct iax_ie_data *ied, unsigned char ie, unsigned short value) { unsigned short newval; newval = htons(value); return iax_ie_append_raw(ied, ie, &newval, (int)sizeof(newval)); } int iax_ie_append_str(struct iax_ie_data *ied, unsigned char ie, const char *str) { return iax_ie_append_raw(ied, ie, str, (int)strlen(str)); } int iax_ie_append_byte(struct iax_ie_data *ied, unsigned char ie, unsigned char dat) { return iax_ie_append_raw(ied, ie, &dat, 1); } int iax_ie_append(struct iax_ie_data *ied, unsigned char ie) { return iax_ie_append_raw(ied, ie, NULL, 0); } void iax_set_output(void (*func)(const char *)) { outputf = func; } void iax_set_error(void (*func)(const char *)) { errorf = func; } int iax_parse_ies(struct iax_ies *ies, unsigned char *data, int datalen) { /* Parse data into information elements */ int len; int ie; char tmp[256]; memset(ies, 0, (int)sizeof(struct iax_ies)); ies->msgcount = -1; ies->firmwarever = -1; ies->calling_ton = -1; ies->calling_tns = -1; ies->calling_pres = -1; ies->samprate = IAX_RATE_8KHZ; while(datalen >= 2) { ie = data[0]; len = data[1]; if (len > datalen - 2) { errorf("Information element length exceeds message size\n"); return -1; } switch(ie) { case IAX_IE_CALLED_NUMBER: ies->called_number = (char *) data + 2; break; case IAX_IE_CALLING_NUMBER: ies->calling_number = (char *) data + 2; break; case IAX_IE_CALLING_ANI: ies->calling_ani = (char *) data + 2; break; case IAX_IE_CALLING_NAME: ies->calling_name = (char *) data + 2; break; case IAX_IE_CALLED_CONTEXT: ies->called_context = (char *) data + 2; break; case IAX_IE_USERNAME: ies->username = (char *) data + 2; break; case IAX_IE_PASSWORD: ies->password = (char *) data + 2; break; case IAX_IE_CAPABILITY: if (len != (int)sizeof(unsigned int)) { snprintf(tmp, (int)sizeof(tmp), "Expecting capability to be %d bytes long but was %d\n", (int)sizeof(unsigned int), len); errorf(tmp); } else ies->capability = ntohl(get_unaligned_uint32(data + 2)); break; case IAX_IE_FORMAT: if (len != (int)sizeof(unsigned int)) { snprintf(tmp, (int)sizeof(tmp), "Expecting format to be %d bytes long but was %d\n", (int)sizeof(unsigned int), len); errorf(tmp); } else ies->format = ntohl(get_unaligned_uint32(data + 2)); break; case IAX_IE_LANGUAGE: ies->language = (char *) data + 2; break; case IAX_IE_CODEC_PREFS: ies->codec_prefs = (char *) data + 2; break; case IAX_IE_VERSION: if (len != (int)sizeof(unsigned short)) { snprintf(tmp, (int)sizeof(tmp), "Expecting version to be %d bytes long but was %d\n", (int)sizeof(unsigned short), len); errorf(tmp); } else ies->version = ntohs(get_unaligned_uint16(data + 2)); break; case IAX_IE_ADSICPE: if (len != (int)sizeof(unsigned short)) { snprintf(tmp, (int)sizeof(tmp), "Expecting adsicpe to be %d bytes long but was %d\n", (int)sizeof(unsigned short), len); errorf(tmp); } else ies->adsicpe = ntohs(get_unaligned_uint16(data + 2)); break; case IAX_IE_SAMPLINGRATE: if (len != (int)sizeof(unsigned short)) { snprintf(tmp, (int)sizeof(tmp), "Expecting samplingrate to be %d bytes long but was %d\n", (int)sizeof(unsigned short), len); errorf(tmp); } else ies->samprate = ntohs(get_unaligned_uint16(data + 2)); break; case IAX_IE_DNID: ies->dnid = (char *) data + 2; break; case IAX_IE_RDNIS: ies->rdnis = (char *) data + 2; break; case IAX_IE_AUTHMETHODS: if (len != (int)sizeof(unsigned short)) { snprintf(tmp, (int)sizeof(tmp), "Expecting authmethods to be %d bytes long but was %d\n", (int)sizeof(unsigned short), len); errorf(tmp); } else ies->authmethods = ntohs(get_uint16(data + 2)); break; case IAX_IE_CHALLENGE: ies->challenge = (char *) data + 2; break; case IAX_IE_MD5_RESULT: ies->md5_result = (char *) data + 2; break; case IAX_IE_RSA_RESULT: ies->rsa_result = (char *) data + 2; break; case IAX_IE_APPARENT_ADDR: ies->apparent_addr = ((struct sockaddr_in *)(data + 2)); break; case IAX_IE_REFRESH: if (len != (int)sizeof(unsigned short)) { snprintf(tmp, (int)sizeof(tmp), "Expecting refresh to be %d bytes long but was %d\n", (int)sizeof(unsigned short), len); errorf(tmp); } else ies->refresh = ntohs(get_unaligned_uint16(data + 2)); break; case IAX_IE_DPSTATUS: if (len != (int)sizeof(unsigned short)) { snprintf(tmp, (int)sizeof(tmp), "Expecting dpstatus to be %d bytes long but was %d\n", (int)sizeof(unsigned short), len); errorf(tmp); } else ies->dpstatus = ntohs(get_unaligned_uint16(data + 2)); break; case IAX_IE_CALLNO: if (len != (int)sizeof(unsigned short)) { snprintf(tmp, (int)sizeof(tmp), "Expecting callno to be %d bytes long but was %d\n", (int)sizeof(unsigned short), len); errorf(tmp); } else ies->callno = ntohs(get_unaligned_uint16(data + 2)); break; case IAX_IE_CAUSE: ies->cause = (char *) data + 2; break; case IAX_IE_CAUSECODE: if (len != 1) { snprintf(tmp, (int)sizeof(tmp), "Expecting causecode to be single byte but was %d\n", len); errorf(tmp); } else { ies->causecode = data[2]; } break; case IAX_IE_IAX_UNKNOWN: if (len == 1) ies->iax_unknown = data[2]; else { snprintf(tmp, (int)sizeof(tmp), "Expected single byte Unknown command, but was %d long\n", len); errorf(tmp); } break; case IAX_IE_MSGCOUNT: if (len != (int)sizeof(unsigned short)) { snprintf(tmp, (int)sizeof(tmp), "Expecting msgcount to be %d bytes long but was %d\n", (int)sizeof(unsigned short), len); errorf(tmp); } else ies->msgcount = ntohs(get_unaligned_uint16(data + 2)); break; case IAX_IE_AUTOANSWER: ies->autoanswer = 1; break; case IAX_IE_MUSICONHOLD: ies->musiconhold = 1; break; case IAX_IE_TRANSFERID: if (len != (int)sizeof(unsigned int)) { snprintf(tmp, (int)sizeof(tmp), "Expecting transferid to be %d bytes long but was %d\n", (int)sizeof(unsigned int), len); errorf(tmp); } else ies->transferid = ntohl(get_unaligned_uint32(data + 2)); break; case IAX_IE_DATETIME: if (len != (int)sizeof(unsigned int)) { snprintf(tmp, (int)sizeof(tmp), "Expecting date/time to be %d bytes long but was %d\n", (int)sizeof(unsigned int), len); errorf(tmp); } else ies->datetime = ntohl(get_unaligned_uint32(data + 2)); break; case IAX_IE_FIRMWAREVER: if (len != (int)sizeof(unsigned short)) { snprintf(tmp, (int)sizeof(tmp), "Expecting firmwarever to be %d bytes long but was %d\n", (int)sizeof(unsigned short), len); errorf(tmp); } else ies->firmwarever = ntohs(get_unaligned_uint16(data + 2)); break; case IAX_IE_DEVICETYPE: ies->devicetype = (char *) data + 2; break; case IAX_IE_SERVICEIDENT: ies->serviceident = (char *) data + 2; break; case IAX_IE_FWBLOCKDESC: if (len != (int)sizeof(unsigned int)) { snprintf(tmp, (int)sizeof(tmp), "Expected block desc to be %d bytes long but was %d\n", (int)sizeof(unsigned int), len); errorf(tmp); } else ies->fwdesc = ntohl(get_unaligned_uint32(data + 2)); break; case IAX_IE_FWBLOCKDATA: ies->fwdata = data + 2; ies->fwdatalen = len; break; case IAX_IE_PROVVER: if (len != (int)sizeof(unsigned int)) { snprintf(tmp, (int)sizeof(tmp), "Expected provisioning version to be %d bytes long but was %d\n", (int)sizeof(unsigned int), len); errorf(tmp); } else { ies->provverpres = 1; ies->provver = ntohl(get_unaligned_uint32(data + 2)); } break; case IAX_IE_CALLINGPRES: if (len == 1) ies->calling_pres = data[2]; else { snprintf(tmp, (int)sizeof(tmp), "Expected single byte callingpres, but was %d long\n", len); errorf(tmp); } break; case IAX_IE_CALLINGTON: if (len == 1) ies->calling_ton = data[2]; else { snprintf(tmp, (int)sizeof(tmp), "Expected single byte callington, but was %d long\n", len); errorf(tmp); } break; case IAX_IE_CALLINGTNS: if (len != (int)sizeof(unsigned short)) { snprintf(tmp, (int)sizeof(tmp), "Expecting callingtns to be %d bytes long but was %d\n", (int)sizeof(unsigned short), len); errorf(tmp); } else ies->calling_tns = ntohs(get_uint16(data + 2)); break; case IAX_IE_RR_JITTER: if (len != (int)sizeof(unsigned int)) { snprintf(tmp, (int)sizeof(tmp), "Expected jitter rr to be %d bytes long but was %d\n", (int)sizeof(unsigned int), len); errorf(tmp); } else { ies->rr_jitter = ntohl(get_unaligned_uint32(data + 2)); } break; case IAX_IE_RR_LOSS: if (len != (int)sizeof(unsigned int)) { snprintf(tmp, (int)sizeof(tmp), "Expected loss rr to be %d bytes long but was %d\n", (int)sizeof(unsigned int), len); errorf(tmp); } else { ies->rr_loss = ntohl(get_uint32(data + 2)); } break; case IAX_IE_RR_PKTS: if (len != (int)sizeof(unsigned int)) { snprintf(tmp, (int)sizeof(tmp), "Expected packets rr to be %d bytes long but was %d\n", (int)sizeof(unsigned int), len); errorf(tmp); } else { ies->rr_pkts = ntohl(get_unaligned_uint32(data + 2)); } break; case IAX_IE_RR_DELAY: if (len != (int)sizeof(unsigned short)) { snprintf(tmp, (int)sizeof(tmp), "Expected loss rr to be %d bytes long but was %d\n", (int)sizeof(unsigned short), len); errorf(tmp); } else { ies->rr_delay = ntohs(get_uint16(data + 2)); } break; case IAX_IE_RR_DROPPED: if (len != (int)sizeof(unsigned int)) { snprintf(tmp, (int)sizeof(tmp), "Expected packets rr to be %d bytes long but was %d\n", (int)sizeof(unsigned int), len); errorf(tmp); } else { ies->rr_dropped = ntohl(get_unaligned_uint32(data + 2)); } break; case IAX_IE_RR_OOO: if (len != (int)sizeof(unsigned int)) { snprintf(tmp, (int)sizeof(tmp), "Expected packets rr to be %d bytes long but was %d\n", (int)sizeof(unsigned int), len); errorf(tmp); } else { ies->rr_ooo = ntohl(get_unaligned_uint32(data + 2)); } break; default: snprintf(tmp, (int)sizeof(tmp), "Ignoring unknown information element '%s' (%d) of length %d\n", iax_ie2str(ie), ie, len); outputf(tmp); } /* Overwrite information element with 0, to null terminate previous portion */ data[0] = 0; datalen -= (len + 2); data += (len + 2); } /* Null-terminate last field */ *data = '\0'; if (datalen) { errorf("Invalid information element contents, strange boundary\n"); return -1; } return 0; } void iax_frame_wrap(struct iax_frame *fr, struct ast_frame *f) { fr->af.frametype = f->frametype; fr->af.subclass = f->subclass; fr->af.mallocd = 0; /* Our frame is static relative to the container */ fr->af.datalen = f->datalen; fr->af.samples = f->samples; fr->af.offset = AST_FRIENDLY_OFFSET; fr->af.src = f->src; fr->af.data = fr->afdata; if (fr->af.datalen) memcpy(fr->af.data, f->data, fr->af.datalen); } struct iax_frame *iax_frame_new(int direction, int datalen) { struct iax_frame *fr; fr = (struct iax_frame *)malloc((int)sizeof(struct iax_frame) + datalen); if (fr) { fr->direction = direction; fr->retrans = -1; frames++; if (fr->direction == DIRECTION_INGRESS) iframes++; else oframes++; } return fr; } void iax_frame_free(struct iax_frame *fr) { /* Note: does not remove from scheduler! */ if (fr->direction == DIRECTION_INGRESS) iframes--; else if (fr->direction == DIRECTION_OUTGRESS) oframes--; else { errorf("Attempt to double free frame detected\n"); return; } fr->direction = 0; free(fr); frames--; } int iax_get_frames(void) { return frames; } int iax_get_iframes(void) { return iframes; } int iax_get_oframes(void) { return oframes; } iaxmodem-1.2.0/lib/libiax2/src/busy.h0000644000175000017500000000606611150047220016675 0ustar julienjulien/* busy.h: Generated from frequencies 480 and 620 by gensound. 400 samples */ static short busy[400] = { 0, 13697, 24766, 31109, 31585, 26222, 16198, 3569, -9162, -19575, -25812, -26935, -23069, -15322, -5493, 4339, 12277, 16985, 17934, 15440, 10519, 4585, -908, -4827, -6592, -6269, -4489, -2220, -467, 30, -983, -3203, -5839, -7844, -8215, -6301, -2035, 3975, 10543, 16141, 19260, 18787, 14322, 6338, -3845, -14296, -22858, -27611, -27309, -21691, -11585, 1213, 14285, 25068, 31388, 31915, 26457, 16010, 2568, -11282, -22885, -30054, -31509, -27120, -17908, -5805, 6760, 17379, 24147, 26028, 23020, 16094, 6931, -2478, -10279, -15136, -16474, -14538, -10253, -4949, 0, 3515, 5052, 4688, 3045, 1069, -268, -272, 1269, 3996, 7067, 9381, 9889, 7910, 3365, -3123, -10320, -16622, -20424, -20510, -16384, -8448, 2006, 13026, 22383, 28040, 28613, 23696, 13996, 1232, -12193, -23670, -30918, -32459, -27935, -18190, -5103, 8795, 20838, 28764, 31164, 27753, 19395, 7893, -4412, -15136, -22342, -24909, -22717, -16609, -8143, 780, 8361, 13272, 14909, 13455, 9758, 5067, 678, -2387, -3624, -3133, -1538, 224, 1209, 751, -1315, -4580, -8145, -10848, -11585, -9628, -4878, 2038, 9844, 16867, 21403, 22124, 18429, 10638, 0, -11524, -21643, -28211, -29702, -25561, -16364, -3737, 9946, 22044, 30180, 32733, 29182, 20210, 7573, -6269, -18655, -27259, -30558, -28117, -20645, -9807, 2148, 12878, 20426, 23599, 22173, 16865, 9117, 731, -6552, -11426, -13269, -12216, -9050, -4941, -1118, 1460, 2335, 1635, 0, -1635, -2335, -1460, 1118, 4941, 9050, 12216, 13269, 11426, 6552, -731, -9117, -16865, -22173, -23599, -20426, -12878, -2148, 9807, 20645, 28117, 30558, 27259, 18655, 6269, -7573, -20210, -29182, -32733, -30180, -22044, -9946, 3737, 16364, 25561, 29702, 28211, 21643, 11524, 0, -10638, -18429, -22124, -21403, -16867, -9844, -2038, 4878, 9628, 11585, 10848, 8145, 4580, 1315, -751, -1209, -224, 1538, 3133, 3624, 2387, -678, -5067, -9758, -13455, -14909, -13272, -8361, -780, 8143, 16609, 22717, 24909, 22342, 15136, 4412, -7893, -19395, -27753, -31164, -28764, -20838, -8795, 5103, 18190, 27935, 32459, 30918, 23670, 12193, -1232, -13996, -23696, -28613, -28040, -22383, -13026, -2006, 8448, 16384, 20510, 20424, 16622, 10320, 3123, -3365, -7910, -9889, -9381, -7067, -3996, -1269, 272, 268, -1069, -3045, -4688, -5052, -3515, 0, 4949, 10253, 14538, 16474, 15136, 10279, 2478, -6931, -16094, -23020, -26028, -24147, -17379, -6760, 5805, 17908, 27120, 31509, 30054, 22885, 11282, -2568, -16010, -26457, -31915, -31388, -25068, -14285, -1213, 11585, 21691, 27309, 27611, 22858, 14296, 3845, -6338, -14322, -18787, -19260, -16141, -10543, -3975, 2035, 6301, 8215, 7844, 5839, 3203, 983, -30, 467, 2220, 4489, 6269, 6592, 4827, 908, -4585, -10519, -15440, -17934, -16985, -12277, -4339, 5493, 15322, 23069, 26935, 25812, 19575, 9162, -3569, -16198, -26222, -31585, -31109, -24766, -13697, }; iaxmodem-1.2.0/lib/libiax2/COPYING0000644000175000017500000004320611150047225016010 0ustar julienjulien GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 675 Mass Ave, Cambridge, MA 02139, USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS Appendix: How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) 19yy 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., 675 Mass Ave, Cambridge, MA 02139, USA. Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) 19yy name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. iaxmodem-1.2.0/lib/libiax2/INSTALL0000644000175000017500000002203011150047225015776 0ustar julienjulienCopyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002 Free Software Foundation, Inc. This file is free documentation; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. Basic Installation ================== These are generic installation instructions. The `configure' shell script attempts to guess correct values for various system-dependent variables used during compilation. It uses those values to create a `Makefile' in each directory of the package. It may also create one or more `.h' files containing system-dependent definitions. Finally, it creates a shell script `config.status' that you can run in the future to recreate the current configuration, and a file `config.log' containing compiler output (useful mainly for debugging `configure'). It can also use an optional file (typically called `config.cache' and enabled with `--cache-file=config.cache' or simply `-C') that saves the results of its tests to speed up reconfiguring. (Caching is disabled by default to prevent problems with accidental use of stale cache files.) If you need to do unusual things to compile the package, please try to figure out how `configure' could check whether to do them, and mail diffs or instructions to the address given in the `README' so they can be considered for the next release. If you are using the cache, and at some point `config.cache' contains results you don't want to keep, you may remove or edit it. The file `configure.ac' (or `configure.in') is used to create `configure' by a program called `autoconf'. You only need `configure.ac' if you want to change it or regenerate `configure' using a newer version of `autoconf'. The simplest way to compile this package is: 1. `cd' to the directory containing the package's source code and type `./configure' to configure the package for your system. If you're using `csh' on an old version of System V, you might need to type `sh ./configure' instead to prevent `csh' from trying to execute `configure' itself. Running `configure' takes awhile. While running, it prints some messages telling which features it is checking for. 2. Type `make' to compile the package. 3. Optionally, type `make check' to run any self-tests that come with the package. 4. Type `make install' to install the programs and any data files and documentation. 5. You can remove the program binaries and object files from the source code directory by typing `make clean'. To also remove the files that `configure' created (so you can compile the package for a different kind of computer), type `make distclean'. There is also a `make maintainer-clean' target, but that is intended mainly for the package's developers. If you use it, you may have to get all sorts of other programs in order to regenerate files that came with the distribution. Compilers and Options ===================== Some systems require unusual options for compilation or linking that the `configure' script does not know about. Run `./configure --help' for details on some of the pertinent environment variables. You can give `configure' initial values for configuration parameters by setting variables in the command line or in the environment. Here is an example: ./configure CC=c89 CFLAGS=-O2 LIBS=-lposix *Note Defining Variables::, for more details. Compiling For Multiple Architectures ==================================== You can compile the package for more than one kind of computer at the same time, by placing the object files for each architecture in their own directory. To do this, you must use a version of `make' that supports the `VPATH' variable, such as GNU `make'. `cd' to the directory where you want the object files and executables to go and run the `configure' script. `configure' automatically checks for the source code in the directory that `configure' is in and in `..'. If you have to use a `make' that does not support the `VPATH' variable, you have to compile the package for one architecture at a time in the source code directory. After you have installed the package for one architecture, use `make distclean' before reconfiguring for another architecture. Installation Names ================== By default, `make install' will install the package's files in `/usr/local/bin', `/usr/local/man', etc. You can specify an installation prefix other than `/usr/local' by giving `configure' the option `--prefix=PATH'. You can specify separate installation prefixes for architecture-specific files and architecture-independent files. If you give `configure' the option `--exec-prefix=PATH', the package will use PATH as the prefix for installing programs and libraries. Documentation and other data files will still use the regular prefix. In addition, if you use an unusual directory layout you can give options like `--bindir=PATH' to specify different values for particular kinds of files. Run `configure --help' for a list of the directories you can set and what kinds of files go in them. If the package supports it, you can cause programs to be installed with an extra prefix or suffix on their names by giving `configure' the option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. Optional Features ================= Some packages pay attention to `--enable-FEATURE' options to `configure', where FEATURE indicates an optional part of the package. They may also pay attention to `--with-PACKAGE' options, where PACKAGE is something like `gnu-as' or `x' (for the X Window System). The `README' should mention any `--enable-' and `--with-' options that the package recognizes. For packages that use the X Window System, `configure' can usually find the X include and library files automatically, but if it doesn't, you can use the `configure' options `--x-includes=DIR' and `--x-libraries=DIR' to specify their locations. Specifying the System Type ========================== There may be some features `configure' cannot figure out automatically, but needs to determine by the type of machine the package will run on. Usually, assuming the package is built to be run on the _same_ architectures, `configure' can figure that out, but if it prints a message saying it cannot guess the machine type, give it the `--build=TYPE' option. TYPE can either be a short name for the system type, such as `sun4', or a canonical name which has the form: CPU-COMPANY-SYSTEM where SYSTEM can have one of these forms: OS KERNEL-OS See the file `config.sub' for the possible values of each field. If `config.sub' isn't included in this package, then this package doesn't need to know the machine type. If you are _building_ compiler tools for cross-compiling, you should use the `--target=TYPE' option to select the type of system they will produce code for. If you want to _use_ a cross compiler, that generates code for a platform different from the build platform, you should specify the "host" platform (i.e., that on which the generated programs will eventually be run) with `--host=TYPE'. Sharing Defaults ================ If you want to set default values for `configure' scripts to share, you can create a site shell script called `config.site' that gives default values for variables like `CC', `cache_file', and `prefix'. `configure' looks for `PREFIX/share/config.site' if it exists, then `PREFIX/etc/config.site' if it exists. Or, you can set the `CONFIG_SITE' environment variable to the location of the site script. A warning: not all `configure' scripts look for a site script. Defining Variables ================== Variables not defined in a site shell script can be set in the environment passed to `configure'. However, some packages may run configure again during the build, and the customized values of these variables may be lost. In order to avoid this problem, you should set them in the `configure' command line, using `VAR=value'. For example: ./configure CC=/usr/local2/bin/gcc will cause the specified gcc to be used as the C compiler (unless it is overridden in the site shell script). `configure' Invocation ====================== `configure' recognizes the following options to control how it operates. `--help' `-h' Print a summary of the options to `configure', and exit. `--version' `-V' Print the version of Autoconf used to generate the `configure' script, and exit. `--cache-file=FILE' Enable the cache: use and save the results of the tests in FILE, traditionally `config.cache'. FILE defaults to `/dev/null' to disable caching. `--config-cache' `-C' Alias for `--cache-file=config.cache'. `--quiet' `--silent' `-q' Do not print messages saying which checks are being made. To suppress all normal output, redirect it to `/dev/null' (any error messages will still be shown). `--srcdir=DIR' Look for the package's source code in directory DIR. Usually `configure' can determine that directory automatically. `configure' also accepts some other, not widely useful, options. Run `configure --help' for more details. iaxmodem-1.2.0/lib/libiax2/gen.sh0000755000175000017500000000043011150047225016055 0ustar julienjulien#!/bin/sh # # Run this to generate a new configure script and such :) # # -- Rob # (libtoolize --version) < /dev/null > /dev/null 2>&1 || { echo; echo "You must have libtool installed to compile libiax"; echo; exit; } libtoolize --copy --force aclocal autoconf automake iaxmodem-1.2.0/lib/libiax2/iax-config.in0000755000175000017500000000273711150047225017340 0ustar julienjulien#!/bin/sh iax_libs="-L/usr/lib -liax" iax_cflags="" prefix=@prefix@ exec_prefix=@exec_prefix@ exec_prefix_set=no usage="\ Usage: iax-config [--prefix[=DIR]] [--exec-prefix[=DIR]] [--version] [--libs] [--cflags]" if test $# -eq 0; then echo "${usage}" 1>&2 exit 1 fi while test $# -gt 0; do case "$1" in -*=*) optarg=`echo "$1" | sed 's/[-_a-zA-Z0-9]*=//'` ;; *) optarg= ;; esac case $1 in --prefix=*) prefix=$optarg if test $exec_prefix_set = no ; then exec_prefix=$optarg fi ;; --prefix) echo $prefix ;; --exec-prefix=*) exec_prefix=$optarg exec_prefix_set=yes ;; --exec-prefix) echo $exec_prefix ;; --version) echo @VERSION@ ;; --cflags) # if test ${prefix}/include/iax != /usr/include/iax ; then includes=-I${prefix}/include/iax for i in $iax_cflags ; do if test $i = -I${prefix}/include ; then includes="" fi done # fi echo $includes $iax_cflags ;; --libs) my_iax_libs= libdirs=-L${exec_prefix}/lib for i in $iax_libs ; do if test $i != -L${exec_prefix}/lib ; then if test -z "$my_iax_libs" ; then my_iax_libs="$i" else my_iax_libs="$my_iax_libs $i" fi fi done echo $libdirs $my_iax_libs ;; *) echo "${usage}" 1>&2 exit 1 ;; esac shift done iaxmodem-1.2.0/lib/libiax2/COPYING.LIB0000644000175000017500000006130311150047225016413 0ustar julienjulien GNU LIBRARY GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1991 Free Software Foundation, Inc. 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. [This is the first released version of the library GPL. It is numbered 2 because it goes with version 2 of the ordinary GPL.] Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This license, the Library General Public License, applies to some specially designated Free Software Foundation software, and to any other libraries whose authors decide to use it. You can use it for your libraries, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library, or if you modify it. For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link a program with the library, you must provide complete object files to the recipients so that they can relink them with the library, after making changes to the library and recompiling it. And you must show them these terms so they know their rights. Our method of protecting your rights has two steps: (1) copyright the library, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the library. Also, for each distributor's protection, we want to make certain that everyone understands that there is no warranty for this free library. If the library is modified by someone else and passed on, we want its recipients to know that what they have is not the original version, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that companies distributing free software will individually obtain patent licenses, thus in effect transforming the program into proprietary software. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. Most GNU software, including some libraries, is covered by the ordinary GNU General Public License, which was designed for utility programs. This license, the GNU Library General Public License, applies to certain designated libraries. This license is quite different from the ordinary one; be sure to read it in full, and don't assume that anything in it is the same as in the ordinary license. The reason we have a separate public license for some libraries is that they blur the distinction we usually make between modifying or adding to a program and simply using it. Linking a program with a library, without changing the library, is in some sense simply using the library, and is analogous to running a utility program or application program. However, in a textual and legal sense, the linked executable is a combined work, a derivative of the original library, and the ordinary General Public License treats it as such. Because of this blurred distinction, using the ordinary General Public License for libraries did not effectively promote software sharing, because most developers did not use the libraries. We concluded that weaker conditions might promote sharing better. However, unrestricted linking of non-free programs would deprive the users of those programs of all benefit from the free status of the libraries themselves. This Library General Public License is intended to permit developers of non-free programs to use free libraries, while preserving your freedom as a user of such programs to change the free libraries that are incorporated in them. (We have not seen how to achieve this as regards changes in header files, but we have achieved it as regards changes in the actual functions of the Library.) The hope is that this will lead to faster development of free libraries. The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, while the latter only works together with the library. Note that it is possible for a library to be covered by the ordinary General Public License rather than by this special one. GNU LIBRARY GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License Agreement applies to any software library which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Library General Public License (also called "this License"). Each licensee is addressed as "you". A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) "Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. 1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) The modified work must itself be a software library. b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. This option is useful when you wish to copy part of the code of the Library into a program that is not a library. 4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. 5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. 6. As an exception to the Sections above, you may also compile or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) b) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. c) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. d) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. 10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 13. The Free Software Foundation may publish revised and/or new versions of the Library General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS Appendix: How to Apply These Terms to Your New Libraries If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License). To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA Also add information on how to contact you by electronic and paper mail. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the library `Frob' (a library for tweaking knobs) written by James Random Hacker. , 1 April 1990 Ty Coon, President of Vice That's all there is to it! iaxmodem-1.2.0/lib/libiax2/mkinstalldirs0000755000175000017500000000653511150047225017567 0ustar julienjulien#! /bin/sh # mkinstalldirs --- make directory hierarchy scriptversion=2004-02-15.20 # Original author: Noah Friedman # Created: 1993-05-16 # Public domain. # # This file is maintained in Automake, please report # bugs to or send patches to # . errstatus=0 dirmode="" usage="\ Usage: mkinstalldirs [-h] [--help] [--version] [-m MODE] DIR ... Create each directory DIR (with mode MODE, if specified), including all leading file name components. Report bugs to ." # process command line arguments while test $# -gt 0 ; do case $1 in -h | --help | --h*) # -h for help echo "$usage" exit 0 ;; -m) # -m PERM arg shift test $# -eq 0 && { echo "$usage" 1>&2; exit 1; } dirmode=$1 shift ;; --version) echo "$0 $scriptversion" exit 0 ;; --) # stop option processing shift break ;; -*) # unknown option echo "$usage" 1>&2 exit 1 ;; *) # first non-opt arg break ;; esac done for file do if test -d "$file"; then shift else break fi done case $# in 0) exit 0 ;; esac # Solaris 8's mkdir -p isn't thread-safe. If you mkdir -p a/b and # mkdir -p a/c at the same time, both will detect that a is missing, # one will create a, then the other will try to create a and die with # a "File exists" error. This is a problem when calling mkinstalldirs # from a parallel make. We use --version in the probe to restrict # ourselves to GNU mkdir, which is thread-safe. case $dirmode in '') if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then echo "mkdir -p -- $*" exec mkdir -p -- "$@" else # On NextStep and OpenStep, the `mkdir' command does not # recognize any option. It will interpret all options as # directories to create, and then abort because `.' already # exists. test -d ./-p && rmdir ./-p test -d ./--version && rmdir ./--version fi ;; *) if mkdir -m "$dirmode" -p --version . >/dev/null 2>&1 && test ! -d ./--version; then echo "mkdir -m $dirmode -p -- $*" exec mkdir -m "$dirmode" -p -- "$@" else # Clean up after NextStep and OpenStep mkdir. for d in ./-m ./-p ./--version "./$dirmode"; do test -d $d && rmdir $d done fi ;; esac for file do set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'` shift pathcomp= for d do pathcomp="$pathcomp$d" case $pathcomp in -*) pathcomp=./$pathcomp ;; esac if test ! -d "$pathcomp"; then echo "mkdir $pathcomp" mkdir "$pathcomp" || lasterr=$? if test ! -d "$pathcomp"; then errstatus=$lasterr else if test ! -z "$dirmode"; then echo "chmod $dirmode $pathcomp" lasterr="" chmod "$dirmode" "$pathcomp" || lasterr=$? if test ! -z "$lasterr"; then errstatus=$lasterr fi fi fi fi pathcomp="$pathcomp/" done done exit $errstatus # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-end: "$" # End: iaxmodem-1.2.0/lib/libiax2/iax.spec.in0000644000175000017500000000523511150047225017017 0ustar julienjulien%define name @PACKAGE@ %define version @VERSION@ %define release 1 %define prefix /usr Summary: IAX (Inter Asterisk eXchange) Library Name: %{name} Version: %{version} Release: %{release} Copyright: LGPL Group: Development/Libraries Source: %{name}-%{version}.tar.gz URL: http://www.linux-support.net/ Distribution: RedHat Linux Vendor: Linux Support Services Packager: Rob Flynn BuildRoot: /var/tmp/%{name}-%{version}-root %description Inter Asterisk eXchange, lovingly called IAX (pronounced: eeks), is the protocol used by the Asterisk PBX system for inter-asterisk-communication. Other applications may use libiax to communicate with each other and other asterisk servers. IAX is a high performance, feature rich protocol unrelated to SIP or H.323. Its single-socket design allows it to interoperate with NAT and PAT masquerade firewalls. It supports internationalization, remote dialplans, and voice, HTML, image, DTMF, and video content. For more information see http://www.gnophone.com. %package devel Summary: IAX (Inter Asterisk eXchange) Development Package Group: Development/Libraries Requires: iax %description devel Inter Asterisk eXchange, lovingly called IAX (pronounced: eeks), is the protocol used by the Asterisk PBX system for inter-asterisk-communication. Other applications may use libiax to communicate with each other and other asterisk servers. IAX is a high performance, feature rich protocol unrelated to SIP or H.323. Its single-socket design allows it to interoperate with NAT and PAT masquerade firewalls. It supports internationalization, remote dialplans, and voice, HTML, image, DTMF, and video content. For more information see http://www.gnophone.com. This package contains all of the development files that you will need in order to compile IAX applications. %prep %setup %build CFLAGS="$RPM_OPT_FLAGS" ./configure --prefix=%{prefix} --enable-autoupdate make %install rm -rf $RPM_BUILD_ROOT make prefix=$RPM_BUILD_ROOT%{prefix} install-strip %files %defattr(-,root,root) %doc NEWS COPYING AUTHORS README %{prefix}/lib %files devel %defattr(-,root,root) %{prefix}/include/iax %{prefix}/bin/* %clean rm -r $RPM_BUILD_ROOT %changelog * Tue Nov 13 2001 Rob Flynn (0.2.2 release) - HTML Unlink requests - HTML Reject link requests - Text frames * Sat Oct 20 2001 Rob Flynn (0.2.1 release) - More space for challenge in IAX - Fixed strncpy security bug - Accept larger packets - Handle out of order packets better - Implemented send_url - Added an iax-config script :-) * Wed Oct 10 2001 Rob Flynn (0.2.0 release) - Initial public release %post %preun %postun iaxmodem-1.2.0/lib/libiax2/depcomp0000755000175000017500000003477111150047225016341 0ustar julienjulien#! /bin/sh # depcomp - compile a program generating dependencies as side-effects scriptversion=2003-11-08.23 # Copyright (C) 1999, 2000, 2003 Free Software Foundation, Inc. # 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, 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. # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Originally written by Alexandre Oliva . case $1 in '') echo "$0: No command. Try \`$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: depcomp [--help] [--version] PROGRAM [ARGS] Run PROGRAMS ARGS to compile a file, generating dependencies as side-effects. Environment variables: depmode Dependency tracking mode. source Source file read by `PROGRAMS ARGS'. object Object file output by `PROGRAMS ARGS'. depfile Dependency file to output. tmpdepfile Temporary file to use when outputing dependencies. libtool Whether libtool is used (yes/no). Report bugs to . EOF exit 0 ;; -v | --v*) echo "depcomp $scriptversion" exit 0 ;; esac if test -z "$depmode" || test -z "$source" || test -z "$object"; then echo "depcomp: Variables source, object and depmode must be set" 1>&2 exit 1 fi # `libtool' can also be set to `yes' or `no'. if test -z "$depfile"; then base=`echo "$object" | sed -e 's,^.*/,,' -e 's,\.\([^.]*\)$,.P\1,'` dir=`echo "$object" | sed 's,/.*$,/,'` if test "$dir" = "$object"; then dir= fi # FIXME: should be _deps on DOS. depfile="$dir.deps/$base" fi tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} rm -f "$tmpdepfile" # Some modes work just like other modes, but use different flags. We # parameterize here, but still list the modes in the big case below, # to make depend.m4 easier to write. Note that we *cannot* use a case # here, because this file can only contain one case statement. if test "$depmode" = hp; then # HP compiler uses -M and no extra arg. gccflag=-M depmode=gcc fi if test "$depmode" = dashXmstdout; then # This is just like dashmstdout with a different argument. dashmflag=-xM depmode=dashmstdout fi case "$depmode" in gcc3) ## gcc 3 implements dependency tracking that does exactly what ## we want. Yay! Note: for some reason libtool 1.4 doesn't like ## it if -MD -MP comes after the -MF stuff. Hmm. "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi mv "$tmpdepfile" "$depfile" ;; gcc) ## There are various ways to get dependency output from gcc. Here's ## why we pick this rather obscure method: ## - Don't want to use -MD because we'd like the dependencies to end ## up in a subdir. Having to rename by hand is ugly. ## (We might end up doing this anyway to support other compilers.) ## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like ## -MM, not -M (despite what the docs say). ## - Using -M directly means running the compiler twice (even worse ## than renaming). if test -z "$gccflag"; then gccflag=-MD, fi "$@" -Wp,"$gccflag$tmpdepfile" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz ## The second -e expression handles DOS-style file names with drive letters. sed -e 's/^[^:]*: / /' \ -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" ## This next piece of magic avoids the `deleted header file' problem. ## The problem is that when a header file which appears in a .P file ## is deleted, the dependency causes make to die (because there is ## typically no way to rebuild the header). We avoid this by adding ## dummy dependencies for each header file. Too bad gcc doesn't do ## this for us directly. tr ' ' ' ' < "$tmpdepfile" | ## Some versions of gcc put a space before the `:'. On the theory ## that the space means something, we add a space to the output as ## well. ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; sgi) if test "$libtool" = yes; then "$@" "-Wp,-MDupdate,$tmpdepfile" else "$@" -MDupdate "$tmpdepfile" fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files echo "$object : \\" > "$depfile" # Clip off the initial element (the dependent). Don't try to be # clever and replace this with sed code, as IRIX sed won't handle # lines with more than a fixed number of characters (4096 in # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; # the IRIX cc adds comments like `#:fec' to the end of the # dependency line. tr ' ' ' ' < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \ tr ' ' ' ' >> $depfile echo >> $depfile # The second pass generates a dummy entry for each header file. tr ' ' ' ' < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ >> $depfile else # The sourcefile does not contain any dependencies, so just # store a dummy comment line, to avoid errors with the Makefile # "include basename.Plo" scheme. echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; aix) # The C for AIX Compiler uses -M and outputs the dependencies # in a .u file. In older versions, this file always lives in the # current directory. Also, the AIX compiler puts `$object:' at the # start of each line; $object doesn't have directory information. # Version 6 uses the directory in both cases. stripped=`echo "$object" | sed 's/\(.*\)\..*$/\1/'` tmpdepfile="$stripped.u" if test "$libtool" = yes; then "$@" -Wc,-M else "$@" -M fi stat=$? if test -f "$tmpdepfile"; then : else stripped=`echo "$stripped" | sed 's,^.*/,,'` tmpdepfile="$stripped.u" fi if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi if test -f "$tmpdepfile"; then outname="$stripped.o" # Each line is of the form `foo.o: dependent.h'. # Do two passes, one to just change these to # `$object: dependent.h' and one to simply `dependent.h:'. sed -e "s,^$outname:,$object :," < "$tmpdepfile" > "$depfile" sed -e "s,^$outname: \(.*\)$,\1:," < "$tmpdepfile" >> "$depfile" else # The sourcefile does not contain any dependencies, so just # store a dummy comment line, to avoid errors with the Makefile # "include basename.Plo" scheme. echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; icc) # Intel's C compiler understands `-MD -MF file'. However on # icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c # ICC 7.0 will fill foo.d with something like # foo.o: sub/foo.c # foo.o: sub/foo.h # which is wrong. We want: # sub/foo.o: sub/foo.c # sub/foo.o: sub/foo.h # sub/foo.c: # sub/foo.h: # ICC 7.1 will output # foo.o: sub/foo.c sub/foo.h # and will wrap long lines using \ : # foo.o: sub/foo.c ... \ # sub/foo.h ... \ # ... "$@" -MD -MF "$tmpdepfile" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" # Each line is of the form `foo.o: dependent.h', # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. # Do two passes, one to just change these to # `$object: dependent.h' and one to simply `dependent.h:'. sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process this invocation # correctly. Breaking it into two sed invocations is a workaround. sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; tru64) # The Tru64 compiler uses -MD to generate dependencies as a side # effect. `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'. # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put # dependencies in `foo.d' instead, so we check for that too. # Subdirectories are respected. dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` test "x$dir" = "x$object" && dir= base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` if test "$libtool" = yes; then tmpdepfile1="$dir.libs/$base.lo.d" tmpdepfile2="$dir.libs/$base.d" "$@" -Wc,-MD else tmpdepfile1="$dir$base.o.d" tmpdepfile2="$dir$base.d" "$@" -MD fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile1" "$tmpdepfile2" exit $stat fi if test -f "$tmpdepfile1"; then tmpdepfile="$tmpdepfile1" else tmpdepfile="$tmpdepfile2" fi if test -f "$tmpdepfile"; then sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" # That's a tab and a space in the []. sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" else echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; #nosideeffect) # This comment above is used by automake to tell side-effect # dependency tracking mechanisms from slower ones. dashmstdout) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout, regardless of -o. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test $1 != '--mode=compile'; do shift done shift fi # Remove `-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done test -z "$dashmflag" && dashmflag=-M # Require at least two characters before searching for `:' # in the target name. This is to cope with DOS-style filenames: # a dependency such as `c:/foo/bar' could be seen as target `c' otherwise. "$@" $dashmflag | sed 's:^[ ]*[^: ][^:][^:]*\:[ ]*:'"$object"'\: :' > "$tmpdepfile" rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" tr ' ' ' ' < "$tmpdepfile" | \ ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; dashXmstdout) # This case only exists to satisfy depend.m4. It is never actually # run, as this mode is specially recognized in the preamble. exit 1 ;; makedepend) "$@" || exit $? # Remove any Libtool call if test "$libtool" = yes; then while test $1 != '--mode=compile'; do shift done shift fi # X makedepend shift cleared=no for arg in "$@"; do case $cleared in no) set ""; shift cleared=yes ;; esac case "$arg" in -D*|-I*) set fnord "$@" "$arg"; shift ;; # Strip any option that makedepend may not understand. Remove # the object too, otherwise makedepend will parse it as a source file. -*|$object) ;; *) set fnord "$@" "$arg"; shift ;; esac done obj_suffix="`echo $object | sed 's/^.*\././'`" touch "$tmpdepfile" ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" sed '1,2d' "$tmpdepfile" | tr ' ' ' ' | \ ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" "$tmpdepfile".bak ;; cpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test $1 != '--mode=compile'; do shift done shift fi # Remove `-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done "$@" -E | sed -n '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' | sed '$ s: \\$::' > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" cat < "$tmpdepfile" >> "$depfile" sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; msvisualcpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout, regardless of -o, # because we must use -o when running libtool. "$@" || exit $? IFS=" " for arg do case "$arg" in "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") set fnord "$@" shift shift ;; *) set fnord "$@" "$arg" shift shift ;; esac done "$@" -E | sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::echo "`cygpath -u \\"\1\\"`":p' | sort | uniq > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s:: \1 \\:p' >> "$depfile" echo " " >> "$depfile" . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s::\1\::p' >> "$depfile" rm -f "$tmpdepfile" ;; none) exec "$@" ;; *) echo "Unknown depmode $depmode" 1>&2 exit 1 ;; esac exit 0 # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-end: "$" # End: iaxmodem-1.2.0/lib/libiax2/aclocal.m40000644000175000017500000073152411150047225016624 0ustar julienjulien# generated automatically by aclocal 1.8.3 -*- Autoconf -*- # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004 # Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. # libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- # serial 47 AC_PROG_LIBTOOL # AC_PROVIDE_IFELSE(MACRO-NAME, IF-PROVIDED, IF-NOT-PROVIDED) # ----------------------------------------------------------- # If this macro is not defined by Autoconf, define it here. m4_ifdef([AC_PROVIDE_IFELSE], [], [m4_define([AC_PROVIDE_IFELSE], [m4_ifdef([AC_PROVIDE_$1], [$2], [$3])])]) # AC_PROG_LIBTOOL # --------------- AC_DEFUN([AC_PROG_LIBTOOL], [AC_REQUIRE([_AC_PROG_LIBTOOL])dnl dnl If AC_PROG_CXX has already been expanded, run AC_LIBTOOL_CXX dnl immediately, otherwise, hook it in at the end of AC_PROG_CXX. AC_PROVIDE_IFELSE([AC_PROG_CXX], [AC_LIBTOOL_CXX], [define([AC_PROG_CXX], defn([AC_PROG_CXX])[AC_LIBTOOL_CXX ])]) dnl And a similar setup for Fortran 77 support AC_PROVIDE_IFELSE([AC_PROG_F77], [AC_LIBTOOL_F77], [define([AC_PROG_F77], defn([AC_PROG_F77])[AC_LIBTOOL_F77 ])]) dnl Quote A][M_PROG_GCJ so that aclocal doesn't bring it in needlessly. dnl If either AC_PROG_GCJ or A][M_PROG_GCJ have already been expanded, run dnl AC_LIBTOOL_GCJ immediately, otherwise, hook it in at the end of both. AC_PROVIDE_IFELSE([AC_PROG_GCJ], [AC_LIBTOOL_GCJ], [AC_PROVIDE_IFELSE([A][M_PROG_GCJ], [AC_LIBTOOL_GCJ], [AC_PROVIDE_IFELSE([LT_AC_PROG_GCJ], [AC_LIBTOOL_GCJ], [ifdef([AC_PROG_GCJ], [define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[AC_LIBTOOL_GCJ])]) ifdef([A][M_PROG_GCJ], [define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[AC_LIBTOOL_GCJ])]) ifdef([LT_AC_PROG_GCJ], [define([LT_AC_PROG_GCJ], defn([LT_AC_PROG_GCJ])[AC_LIBTOOL_GCJ])])])]) ])])# AC_PROG_LIBTOOL # _AC_PROG_LIBTOOL # ---------------- AC_DEFUN([_AC_PROG_LIBTOOL], [AC_REQUIRE([AC_LIBTOOL_SETUP])dnl AC_BEFORE([$0],[AC_LIBTOOL_CXX])dnl AC_BEFORE([$0],[AC_LIBTOOL_F77])dnl AC_BEFORE([$0],[AC_LIBTOOL_GCJ])dnl # This can be used to rebuild libtool when needed LIBTOOL_DEPS="$ac_aux_dir/ltmain.sh" # Always use our own libtool. LIBTOOL='$(SHELL) $(top_builddir)/libtool' AC_SUBST(LIBTOOL)dnl # Prevent multiple expansion define([AC_PROG_LIBTOOL], []) ])# _AC_PROG_LIBTOOL # AC_LIBTOOL_SETUP # ---------------- AC_DEFUN([AC_LIBTOOL_SETUP], [AC_PREREQ(2.50)dnl AC_REQUIRE([AC_ENABLE_SHARED])dnl AC_REQUIRE([AC_ENABLE_STATIC])dnl AC_REQUIRE([AC_ENABLE_FAST_INSTALL])dnl AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_PROG_LD])dnl AC_REQUIRE([AC_PROG_LD_RELOAD_FLAG])dnl AC_REQUIRE([AC_PROG_NM])dnl AC_REQUIRE([AC_PROG_LN_S])dnl AC_REQUIRE([AC_DEPLIBS_CHECK_METHOD])dnl # Autoconf 2.13's AC_OBJEXT and AC_EXEEXT macros only works for C compilers! AC_REQUIRE([AC_OBJEXT])dnl AC_REQUIRE([AC_EXEEXT])dnl dnl AC_LIBTOOL_SYS_MAX_CMD_LEN AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE AC_LIBTOOL_OBJDIR AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl _LT_AC_PROG_ECHO_BACKSLASH case $host_os in aix3*) # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi ;; esac # Sed substitution that helps us do robust quoting. It backslashifies # metacharacters that are still active within double-quoted strings. Xsed='sed -e s/^X//' [sed_quote_subst='s/\([\\"\\`$\\\\]\)/\\\1/g'] # Same as above, but do not quote variable references. [double_quote_subst='s/\([\\"\\`\\\\]\)/\\\1/g'] # Sed substitution to delay expansion of an escaped shell variable in a # double_quote_subst'ed string. delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' # Sed substitution to avoid accidental globbing in evaled expressions no_glob_subst='s/\*/\\\*/g' # Constants: rm="rm -f" # Global variables: default_ofile=libtool can_build_shared=yes # All known linkers require a `.a' archive for static linking (except M$VC, # which needs '.lib'). libext=a ltmain="$ac_aux_dir/ltmain.sh" ofile="$default_ofile" with_gnu_ld="$lt_cv_prog_gnu_ld" AC_CHECK_TOOL(AR, ar, false) AC_CHECK_TOOL(RANLIB, ranlib, :) AC_CHECK_TOOL(STRIP, strip, :) old_CC="$CC" old_CFLAGS="$CFLAGS" # Set sane defaults for various variables test -z "$AR" && AR=ar test -z "$AR_FLAGS" && AR_FLAGS=cru test -z "$AS" && AS=as test -z "$CC" && CC=cc test -z "$LTCC" && LTCC=$CC test -z "$DLLTOOL" && DLLTOOL=dlltool test -z "$LD" && LD=ld test -z "$LN_S" && LN_S="ln -s" test -z "$MAGIC_CMD" && MAGIC_CMD=file test -z "$NM" && NM=nm test -z "$SED" && SED=sed test -z "$OBJDUMP" && OBJDUMP=objdump test -z "$RANLIB" && RANLIB=: test -z "$STRIP" && STRIP=: test -z "$ac_objext" && ac_objext=o # Determine commands to create old-style static archives. old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs$old_deplibs' old_postinstall_cmds='chmod 644 $oldlib' old_postuninstall_cmds= if test -n "$RANLIB"; then case $host_os in openbsd*) old_postinstall_cmds="\$RANLIB -t \$oldlib~$old_postinstall_cmds" ;; *) old_postinstall_cmds="\$RANLIB \$oldlib~$old_postinstall_cmds" ;; esac old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib" fi # Only perform the check for file, if the check method requires it case $deplibs_check_method in file_magic*) if test "$file_magic_cmd" = '$MAGIC_CMD'; then AC_PATH_MAGIC fi ;; esac AC_PROVIDE_IFELSE([AC_LIBTOOL_DLOPEN], enable_dlopen=yes, enable_dlopen=no) AC_PROVIDE_IFELSE([AC_LIBTOOL_WIN32_DLL], enable_win32_dll=yes, enable_win32_dll=no) AC_ARG_ENABLE([libtool-lock], [AC_HELP_STRING([--disable-libtool-lock], [avoid locking (might break parallel builds)])]) test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes AC_ARG_WITH([pic], [AC_HELP_STRING([--with-pic], [try to use only PIC/non-PIC objects @<:@default=use both@:>@])], [pic_mode="$withval"], [pic_mode=default]) test -z "$pic_mode" && pic_mode=default # Use C for the default configuration in the libtool script tagname= AC_LIBTOOL_LANG_C_CONFIG _LT_AC_TAGCONFIG ])# AC_LIBTOOL_SETUP # _LT_AC_SYS_COMPILER # ------------------- AC_DEFUN([_LT_AC_SYS_COMPILER], [AC_REQUIRE([AC_PROG_CC])dnl # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # Allow CC to be a program name with arguments. compiler=$CC ])# _LT_AC_SYS_COMPILER # _LT_AC_SYS_LIBPATH_AIX # ---------------------- # Links a minimal program and checks the executable # for the system default hardcoded library path. In most cases, # this is /usr/lib:/lib, but when the MPI compilers are used # the location of the communication and MPI libs are included too. # If we don't find anything, use the default library path according # to the aix ld manual. AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX], [AC_LINK_IFELSE(AC_LANG_PROGRAM,[ aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'` # Check for a 64-bit object if we didn't find anything. if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'`; fi],[]) if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi ])# _LT_AC_SYS_LIBPATH_AIX # _LT_AC_SHELL_INIT(ARG) # ---------------------- AC_DEFUN([_LT_AC_SHELL_INIT], [ifdef([AC_DIVERSION_NOTICE], [AC_DIVERT_PUSH(AC_DIVERSION_NOTICE)], [AC_DIVERT_PUSH(NOTICE)]) $1 AC_DIVERT_POP ])# _LT_AC_SHELL_INIT # _LT_AC_PROG_ECHO_BACKSLASH # -------------------------- # Add some code to the start of the generated configure script which # will find an echo command which doesn't interpret backslashes. AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH], [_LT_AC_SHELL_INIT([ # Check that we are running under the correct shell. SHELL=${CONFIG_SHELL-/bin/sh} case X$ECHO in X*--fallback-echo) # Remove one level of quotation (which was required for Make). ECHO=`echo "$ECHO" | sed 's,\\\\\[$]\\[$]0,'[$]0','` ;; esac echo=${ECHO-echo} if test "X[$]1" = X--no-reexec; then # Discard the --no-reexec flag, and continue. shift elif test "X[$]1" = X--fallback-echo; then # Avoid inline document here, it may be left over : elif test "X`($echo '\t') 2>/dev/null`" = 'X\t' ; then # Yippee, $echo works! : else # Restart under the correct shell. exec $SHELL "[$]0" --no-reexec ${1+"[$]@"} fi if test "X[$]1" = X--fallback-echo; then # used as fallback echo shift cat </dev/null && echo_test_string="`eval $cmd`" && (test "X$echo_test_string" = "X$echo_test_string") 2>/dev/null then break fi done fi if test "X`($echo '\t') 2>/dev/null`" = 'X\t' && echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then : else # The Solaris, AIX, and Digital Unix default echo programs unquote # backslashes. This makes it impossible to quote backslashes using # echo "$something" | sed 's/\\/\\\\/g' # # So, first we look for a working echo in the user's PATH. lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for dir in $PATH /usr/ucb; do IFS="$lt_save_ifs" if (test -f $dir/echo || test -f $dir/echo$ac_exeext) && test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' && echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then echo="$dir/echo" break fi done IFS="$lt_save_ifs" if test "X$echo" = Xecho; then # We didn't find a better echo, so look for alternatives. if test "X`(print -r '\t') 2>/dev/null`" = 'X\t' && echo_testing_string=`(print -r "$echo_test_string") 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then # This shell has a builtin print -r that does the trick. echo='print -r' elif (test -f /bin/ksh || test -f /bin/ksh$ac_exeext) && test "X$CONFIG_SHELL" != X/bin/ksh; then # If we have ksh, try running configure again with it. ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh} export ORIGINAL_CONFIG_SHELL CONFIG_SHELL=/bin/ksh export CONFIG_SHELL exec $CONFIG_SHELL "[$]0" --no-reexec ${1+"[$]@"} else # Try using printf. echo='printf %s\n' if test "X`($echo '\t') 2>/dev/null`" = 'X\t' && echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then # Cool, printf works : elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` && test "X$echo_testing_string" = 'X\t' && echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL export CONFIG_SHELL SHELL="$CONFIG_SHELL" export SHELL echo="$CONFIG_SHELL [$]0 --fallback-echo" elif echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` && test "X$echo_testing_string" = 'X\t' && echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then echo="$CONFIG_SHELL [$]0 --fallback-echo" else # maybe with a smaller string... prev=: for cmd in 'echo test' 'sed 2q "[$]0"' 'sed 10q "[$]0"' 'sed 20q "[$]0"' 'sed 50q "[$]0"'; do if (test "X$echo_test_string" = "X`eval $cmd`") 2>/dev/null then break fi prev="$cmd" done if test "$prev" != 'sed 50q "[$]0"'; then echo_test_string=`eval $prev` export echo_test_string exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "[$]0" ${1+"[$]@"} else # Oops. We lost completely, so just stick with echo. echo=echo fi fi fi fi fi fi # Copy echo and quote the copy suitably for passing to libtool from # the Makefile, instead of quoting the original, which is used later. ECHO=$echo if test "X$ECHO" = "X$CONFIG_SHELL [$]0 --fallback-echo"; then ECHO="$CONFIG_SHELL \\\$\[$]0 --fallback-echo" fi AC_SUBST(ECHO) ])])# _LT_AC_PROG_ECHO_BACKSLASH # _LT_AC_LOCK # ----------- AC_DEFUN([_LT_AC_LOCK], [AC_ARG_ENABLE([libtool-lock], [AC_HELP_STRING([--disable-libtool-lock], [avoid locking (might break parallel builds)])]) test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes # Some flags need to be propagated to the compiler or linker for good # libtool support. case $host in ia64-*-hpux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.$ac_objext` in *ELF-32*) HPUX_IA64_MODE="32" ;; *ELF-64*) HPUX_IA64_MODE="64" ;; esac fi rm -rf conftest* ;; *-*-irix6*) # Find out which ABI we are using. echo '[#]line __oline__ "configure"' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then if test "$lt_cv_prog_gnu_ld" = yes; then case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -melf32bsmip" ;; *N32*) LD="${LD-ld} -melf32bmipn32" ;; *64-bit*) LD="${LD-ld} -melf64bmip" ;; esac else case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -32" ;; *N32*) LD="${LD-ld} -n32" ;; *64-bit*) LD="${LD-ld} -64" ;; esac fi fi rm -rf conftest* ;; x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*|s390*-*linux*|sparc*-*linux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case "`/usr/bin/file conftest.o`" in *32-bit*) case $host in x86_64-*linux*) LD="${LD-ld} -m elf_i386" ;; ppc64-*linux*|powerpc64-*linux*) LD="${LD-ld} -m elf32ppclinux" ;; s390x-*linux*) LD="${LD-ld} -m elf_s390" ;; sparc64-*linux*) LD="${LD-ld} -m elf32_sparc" ;; esac ;; *64-bit*) case $host in x86_64-*linux*) LD="${LD-ld} -m elf_x86_64" ;; ppc*-*linux*|powerpc*-*linux*) LD="${LD-ld} -m elf64ppc" ;; s390*-*linux*) LD="${LD-ld} -m elf64_s390" ;; sparc*-*linux*) LD="${LD-ld} -m elf64_sparc" ;; esac ;; esac fi rm -rf conftest* ;; *-*-sco3.2v5*) # On SCO OpenServer 5, we need -belf to get full-featured binaries. SAVE_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -belf" AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf, [AC_LANG_PUSH(C) AC_TRY_LINK([],[],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no]) AC_LANG_POP]) if test x"$lt_cv_cc_needs_belf" != x"yes"; then # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf CFLAGS="$SAVE_CFLAGS" fi ;; AC_PROVIDE_IFELSE([AC_LIBTOOL_WIN32_DLL], [*-*-cygwin* | *-*-mingw* | *-*-pw32*) AC_CHECK_TOOL(DLLTOOL, dlltool, false) AC_CHECK_TOOL(AS, as, false) AC_CHECK_TOOL(OBJDUMP, objdump, false) ;; ]) esac need_locks="$enable_libtool_lock" ])# _LT_AC_LOCK # AC_LIBTOOL_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, # [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE]) # ---------------------------------------------------------------- # Check whether the given compiler option works AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], [AC_REQUIRE([LT_AC_PROG_SED]) AC_CACHE_CHECK([$1], [$2], [$2=no ifelse([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4]) printf "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$3" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&AS_MESSAGE_LOG_FD echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings if test ! -s conftest.err; then $2=yes fi fi $rm conftest* ]) if test x"[$]$2" = xyes; then ifelse([$5], , :, [$5]) else ifelse([$6], , :, [$6]) fi ])# AC_LIBTOOL_COMPILER_OPTION # AC_LIBTOOL_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, # [ACTION-SUCCESS], [ACTION-FAILURE]) # ------------------------------------------------------------ # Check whether the given compiler option works AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], [AC_CACHE_CHECK([$1], [$2], [$2=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $3" printf "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&AS_MESSAGE_LOG_FD else $2=yes fi fi $rm conftest* LDFLAGS="$save_LDFLAGS" ]) if test x"[$]$2" = xyes; then ifelse([$4], , :, [$4]) else ifelse([$5], , :, [$5]) fi ])# AC_LIBTOOL_LINKER_OPTION # AC_LIBTOOL_SYS_MAX_CMD_LEN # -------------------------- AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], [# find the maximum length of command line arguments AC_MSG_CHECKING([the maximum length of command line arguments]) AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl i=0 teststring="ABCD" case $build_os in msdosdjgpp*) # On DJGPP, this test can blow up pretty badly due to problems in libc # (any single argument exceeding 2000 bytes causes a buffer overrun # during glob expansion). Even if it were fixed, the result of this # check would be larger than it should be. lt_cv_sys_max_cmd_len=12288; # 12K is about right ;; gnu*) # Under GNU Hurd, this test is not required because there is # no limit to the length of command line arguments. # Libtool will interpret -1 as no limit whatsoever lt_cv_sys_max_cmd_len=-1; ;; cygwin* | mingw*) # On Win9x/ME, this test blows up -- it succeeds, but takes # about 5 minutes as the teststring grows exponentially. # Worse, since 9x/ME are not pre-emptively multitasking, # you end up with a "frozen" computer, even though with patience # the test eventually succeeds (with a max line length of 256k). # Instead, let's just punt: use the minimum linelength reported by # all of the supported platforms: 8192 (on NT/2K/XP). lt_cv_sys_max_cmd_len=8192; ;; amigaos*) # On AmigaOS with pdksh, this test takes hours, literally. # So we just punt and use a minimum line length of 8192. lt_cv_sys_max_cmd_len=8192; ;; *) # If test is not a shell built-in, we'll probably end up computing a # maximum length that is only half of the actual maximum length, but # we can't tell. while (test "X"`$CONFIG_SHELL [$]0 --fallback-echo "X$teststring" 2>/dev/null` \ = "XX$teststring") >/dev/null 2>&1 && new_result=`expr "X$teststring" : ".*" 2>&1` && lt_cv_sys_max_cmd_len=$new_result && test $i != 17 # 1/2 MB should be enough do i=`expr $i + 1` teststring=$teststring$teststring done teststring= # Add a significant safety factor because C++ compilers can tack on massive # amounts of additional arguments before passing them to the linker. # It appears as though 1/2 is a usable value. lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` ;; esac ]) if test -n $lt_cv_sys_max_cmd_len ; then AC_MSG_RESULT($lt_cv_sys_max_cmd_len) else AC_MSG_RESULT(none) fi ])# AC_LIBTOOL_SYS_MAX_CMD_LEN # _LT_AC_CHECK_DLFCN # -------------------- AC_DEFUN([_LT_AC_CHECK_DLFCN], [AC_CHECK_HEADERS(dlfcn.h)dnl ])# _LT_AC_CHECK_DLFCN # _LT_AC_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE, # ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING) # ------------------------------------------------------------------ AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF], [AC_REQUIRE([_LT_AC_CHECK_DLFCN])dnl if test "$cross_compiling" = yes; then : [$4] else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext < #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif #ifdef __cplusplus extern "C" void exit (int); #endif void fnord() { int i=42;} int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; /* dlclose (self); */ } exit (status); }] EOF if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) $1 ;; x$lt_dlneed_uscore) $2 ;; x$lt_unknown|x*) $3 ;; esac else : # compilation failed $3 fi fi rm -fr conftest* ])# _LT_AC_TRY_DLOPEN_SELF # AC_LIBTOOL_DLOPEN_SELF # ------------------- AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], [AC_REQUIRE([_LT_AC_CHECK_DLFCN])dnl if test "x$enable_dlopen" != xyes; then enable_dlopen=unknown enable_dlopen_self=unknown enable_dlopen_self_static=unknown else lt_cv_dlopen=no lt_cv_dlopen_libs= case $host_os in beos*) lt_cv_dlopen="load_add_on" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ;; mingw* | pw32*) lt_cv_dlopen="LoadLibrary" lt_cv_dlopen_libs= ;; cygwin*) lt_cv_dlopen="dlopen" lt_cv_dlopen_libs= ;; darwin*) # if libdl is installed we need to link against it AC_CHECK_LIB([dl], [dlopen], [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[ lt_cv_dlopen="dyld" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ]) ;; *) AC_CHECK_FUNC([shl_load], [lt_cv_dlopen="shl_load"], [AC_CHECK_LIB([dld], [shl_load], [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-dld"], [AC_CHECK_FUNC([dlopen], [lt_cv_dlopen="dlopen"], [AC_CHECK_LIB([dl], [dlopen], [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"], [AC_CHECK_LIB([svld], [dlopen], [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"], [AC_CHECK_LIB([dld], [dld_link], [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-dld"]) ]) ]) ]) ]) ]) ;; esac if test "x$lt_cv_dlopen" != xno; then enable_dlopen=yes else enable_dlopen=no fi case $lt_cv_dlopen in dlopen) save_CPPFLAGS="$CPPFLAGS" test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" save_LDFLAGS="$LDFLAGS" eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" save_LIBS="$LIBS" LIBS="$lt_cv_dlopen_libs $LIBS" AC_CACHE_CHECK([whether a program can dlopen itself], lt_cv_dlopen_self, [dnl _LT_AC_TRY_DLOPEN_SELF( lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes, lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross) ]) if test "x$lt_cv_dlopen_self" = xyes; then LDFLAGS="$LDFLAGS $link_static_flag" AC_CACHE_CHECK([whether a statically linked program can dlopen itself], lt_cv_dlopen_self_static, [dnl _LT_AC_TRY_DLOPEN_SELF( lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=no, lt_cv_dlopen_self_static=cross) ]) fi CPPFLAGS="$save_CPPFLAGS" LDFLAGS="$save_LDFLAGS" LIBS="$save_LIBS" ;; esac case $lt_cv_dlopen_self in yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; *) enable_dlopen_self=unknown ;; esac case $lt_cv_dlopen_self_static in yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; *) enable_dlopen_self_static=unknown ;; esac fi ])# AC_LIBTOOL_DLOPEN_SELF # AC_LIBTOOL_PROG_CC_C_O([TAGNAME]) # --------------------------------- # Check to see if options -c and -o are simultaneously supported by compiler AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O], [AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext], [_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)], [_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no $rm -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out printf "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&AS_MESSAGE_LOG_FD echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings if test ! -s out/conftest.err; then _LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes fi fi chmod u+w . $rm conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files $rm out/* && rmdir out cd .. rmdir conftest $rm conftest* ]) ])# AC_LIBTOOL_PROG_CC_C_O # AC_LIBTOOL_SYS_HARD_LINK_LOCKS([TAGNAME]) # ----------------------------------------- # Check to see if we can do hard links to lock some files if needed AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_REQUIRE([_LT_AC_LOCK])dnl hard_links="nottested" if test "$_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user AC_MSG_CHECKING([if we can lock with hard links]) hard_links=yes $rm conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no AC_MSG_RESULT([$hard_links]) if test "$hard_links" = no; then AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe]) need_locks=warn fi else need_locks=no fi ])# AC_LIBTOOL_SYS_HARD_LINK_LOCKS # AC_LIBTOOL_OBJDIR # ----------------- AC_DEFUN([AC_LIBTOOL_OBJDIR], [AC_CACHE_CHECK([for objdir], [lt_cv_objdir], [rm -f .libs 2>/dev/null mkdir .libs 2>/dev/null if test -d .libs; then lt_cv_objdir=.libs else # MS-DOS does not allow filenames that begin with a dot. lt_cv_objdir=_libs fi rmdir .libs 2>/dev/null]) objdir=$lt_cv_objdir ])# AC_LIBTOOL_OBJDIR # AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH([TAGNAME]) # ---------------------------------------------- # Check hardcoding attributes. AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_MSG_CHECKING([how to hardcode library paths into programs]) _LT_AC_TAGVAR(hardcode_action, $1)= if test -n "$_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)" || \ test -n "$_LT_AC_TAGVAR(runpath_var $1)" || \ test "X$_LT_AC_TAGVAR(hardcode_automatic, $1)"="Xyes" ; then # We can hardcode non-existant directories. if test "$_LT_AC_TAGVAR(hardcode_direct, $1)" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, $1)" != no && test "$_LT_AC_TAGVAR(hardcode_minus_L, $1)" != no; then # Linking always hardcodes the temporary library directory. _LT_AC_TAGVAR(hardcode_action, $1)=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. _LT_AC_TAGVAR(hardcode_action, $1)=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. _LT_AC_TAGVAR(hardcode_action, $1)=unsupported fi AC_MSG_RESULT([$_LT_AC_TAGVAR(hardcode_action, $1)]) if test "$_LT_AC_TAGVAR(hardcode_action, $1)" = relink; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || test "$enable_shared" = no; then # Fast installation is not necessary enable_fast_install=needless fi ])# AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH # AC_LIBTOOL_SYS_LIB_STRIP # ------------------------ AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP], [striplib= old_striplib= AC_MSG_CHECKING([whether stripping libraries is possible]) if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" test -z "$striplib" && striplib="$STRIP --strip-unneeded" AC_MSG_RESULT([yes]) else # FIXME - insert some real tests, host_os isn't really good enough case $host_os in darwin*) if test -n "$STRIP" ; then striplib="$STRIP -x" AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) fi ;; *) AC_MSG_RESULT([no]) ;; esac fi ])# AC_LIBTOOL_SYS_LIB_STRIP # AC_LIBTOOL_SYS_DYNAMIC_LINKER # ----------------------------- # PORTME Fill in your ld.so characteristics AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER], [AC_MSG_CHECKING([dynamic linker characteristics]) library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=".so" postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" if test "$GCC" = yes; then sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then # if the path contains ";" then we assume it to be the separator # otherwise default to the standard path separator (i.e. ":") - it is # assumed that no part of a normal pathname contains ";" but that should # okay in the real world where ";" in dirpaths is itself problematic. sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi else sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" fi need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='${libname}${release}${shared_ext}$major' ;; aix4* | aix5*) version_type=linux need_lib_prefix=no need_version=no hardcode_into_libs=yes if test "$host_cpu" = ia64; then # AIX 5 supports IA64 library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line `#! .'. This would cause the generated library to # depend on `.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[[01]] | aix4.[[01]].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then : else can_build_shared=no fi ;; esac # AIX (on Power*) has no versioning support, so currently we can not hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' else # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='${libname}${release}.a $libname.a' soname_spec='${libname}${release}${shared_ext}$major' fi shlibpath_var=LIBPATH fi ;; amigaos*) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; beos*) library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi4*) version_type=linux need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no case $GCC,$host_os in yes,cygwin* | yes,mingw* | yes,pw32*) library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $rm \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" ;; mingw*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` if echo "$sys_lib_search_path_spec" | [grep ';[c-zC-Z]:/' >/dev/null]; then # It is most probably a Windows format PATH printed by # mingw gcc, but we are running on Cygwin. Gcc prints its search # path with ; separators, and with drive letters. We can handle the # drive letters (cygwin fileutils understands them), so leave them, # especially as we might pass files found there to a mingw objdump, # which wouldn't understand a cygwinified path. Ahh. sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; esac ;; *) library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib' ;; esac dynamic_linker='Win32 ld.exe' # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext' soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='$(test .$module = .yes && echo .so || echo .dylib)' # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same. if test "$GCC" = yes; then sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"` else sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib' fi sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd1*) dynamic_linker=no ;; kfreebsd*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='GNU ld.so' ;; freebsd*) objformat=`test -x /usr/bin/objformat && /usr/bin/objformat || echo aout` version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2*) shlibpath_overrides_runpath=yes ;; freebsd3.[01]* | freebsdelf3.[01]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; *) # from 3.2 on shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; esac ;; gnu*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case "$host_cpu" in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' if test "X$HPUX_IA64_MODE" = X32; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555. postinstall_cmds='chmod 555 $lib' ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then version_type=linux else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; # This must be Linux ELF. linux*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # find out which ABI we are using libsuff= case "$host_cpu" in x86_64*|s390x*|powerpc64*) echo '[#]line __oline__ "configure"' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.$ac_objext` in *64-bit*) libsuff=64 sys_lib_search_path_spec="/lib${libsuff} /usr/lib${libsuff} /usr/local/lib${libsuff}" ;; esac fi rm -rf conftest* ;; esac # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then lt_ld_extra=`$SED -e 's/[:,\t]/ /g;s/=[^=]*$//;s/=[^= ]* / /g' /etc/ld.so.conf | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib${libsuff} /usr/lib${libsuff} $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; knetbsd*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='GNU ld.so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; nto-qnx*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; openbsd*) version_type=sunos need_lib_prefix=no need_version=yes library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[[89]] | openbsd2.[[89]].*) shlibpath_overrides_runpath=no ;; *) shlibpath_overrides_runpath=yes ;; esac else shlibpath_overrides_runpath=yes fi ;; os2*) libname_spec='$name' shrext_cmds=".dll" need_lib_prefix=no library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; sco3.2v5*) version_type=osf soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH ;; solaris*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test "$with_gnu_ld" = yes; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no export_dynamic_flag_spec='${wl}-Blargedynsym' runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec ;then version_type=linux library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; uts4*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac AC_MSG_RESULT([$dynamic_linker]) test "$dynamic_linker" = no && can_build_shared=no ])# AC_LIBTOOL_SYS_DYNAMIC_LINKER # _LT_AC_TAGCONFIG # ---------------- AC_DEFUN([_LT_AC_TAGCONFIG], [AC_ARG_WITH([tags], [AC_HELP_STRING([--with-tags@<:@=TAGS@:>@], [include additional configurations @<:@automatic@:>@])], [tagnames="$withval"]) if test -f "$ltmain" && test -n "$tagnames"; then if test ! -f "${ofile}"; then AC_MSG_WARN([output file `$ofile' does not exist]) fi if test -z "$LTCC"; then eval "`$SHELL ${ofile} --config | grep '^LTCC='`" if test -z "$LTCC"; then AC_MSG_WARN([output file `$ofile' does not look like a libtool script]) else AC_MSG_WARN([using `LTCC=$LTCC', extracted from `$ofile']) fi fi # Extract list of available tagged configurations in $ofile. # Note that this assumes the entire list is on one line. available_tags=`grep "^available_tags=" "${ofile}" | $SED -e 's/available_tags=\(.*$\)/\1/' -e 's/\"//g'` lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for tagname in $tagnames; do IFS="$lt_save_ifs" # Check whether tagname contains only valid characters case `$echo "X$tagname" | $Xsed -e 's:[[-_ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890,/]]::g'` in "") ;; *) AC_MSG_ERROR([invalid tag name: $tagname]) ;; esac if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$" < "${ofile}" > /dev/null then AC_MSG_ERROR([tag name \"$tagname\" already exists]) fi # Update the list of available tags. if test -n "$tagname"; then echo appending configuration tag \"$tagname\" to $ofile case $tagname in CXX) if test -n "$CXX" && test "X$CXX" != "Xno"; then AC_LIBTOOL_LANG_CXX_CONFIG else tagname="" fi ;; F77) if test -n "$F77" && test "X$F77" != "Xno"; then AC_LIBTOOL_LANG_F77_CONFIG else tagname="" fi ;; GCJ) if test -n "$GCJ" && test "X$GCJ" != "Xno"; then AC_LIBTOOL_LANG_GCJ_CONFIG else tagname="" fi ;; RC) AC_LIBTOOL_LANG_RC_CONFIG ;; *) AC_MSG_ERROR([Unsupported tag name: $tagname]) ;; esac # Append the new tag name to the list of available tags. if test -n "$tagname" ; then available_tags="$available_tags $tagname" fi fi done IFS="$lt_save_ifs" # Now substitute the updated list of available tags. if eval "sed -e 's/^available_tags=.*\$/available_tags=\"$available_tags\"/' \"$ofile\" > \"${ofile}T\""; then mv "${ofile}T" "$ofile" chmod +x "$ofile" else rm -f "${ofile}T" AC_MSG_ERROR([unable to update list of available tagged configurations.]) fi fi ])# _LT_AC_TAGCONFIG # AC_LIBTOOL_DLOPEN # ----------------- # enable checks for dlopen support AC_DEFUN([AC_LIBTOOL_DLOPEN], [AC_BEFORE([$0],[AC_LIBTOOL_SETUP]) ])# AC_LIBTOOL_DLOPEN # AC_LIBTOOL_WIN32_DLL # -------------------- # declare package support for building win32 dll's AC_DEFUN([AC_LIBTOOL_WIN32_DLL], [AC_BEFORE([$0], [AC_LIBTOOL_SETUP]) ])# AC_LIBTOOL_WIN32_DLL # AC_ENABLE_SHARED([DEFAULT]) # --------------------------- # implement the --enable-shared flag # DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. AC_DEFUN([AC_ENABLE_SHARED], [define([AC_ENABLE_SHARED_DEFAULT], ifelse($1, no, no, yes))dnl AC_ARG_ENABLE([shared], [AC_HELP_STRING([--enable-shared@<:@=PKGS@:>@], [build shared libraries @<:@default=]AC_ENABLE_SHARED_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_shared=yes ;; no) enable_shared=no ;; *) enable_shared=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_shared=yes fi done IFS="$lt_save_ifs" ;; esac], [enable_shared=]AC_ENABLE_SHARED_DEFAULT) ])# AC_ENABLE_SHARED # AC_DISABLE_SHARED # ----------------- #- set the default shared flag to --disable-shared AC_DEFUN([AC_DISABLE_SHARED], [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl AC_ENABLE_SHARED(no) ])# AC_DISABLE_SHARED # AC_ENABLE_STATIC([DEFAULT]) # --------------------------- # implement the --enable-static flag # DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. AC_DEFUN([AC_ENABLE_STATIC], [define([AC_ENABLE_STATIC_DEFAULT], ifelse($1, no, no, yes))dnl AC_ARG_ENABLE([static], [AC_HELP_STRING([--enable-static@<:@=PKGS@:>@], [build static libraries @<:@default=]AC_ENABLE_STATIC_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_static=yes ;; no) enable_static=no ;; *) enable_static=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_static=yes fi done IFS="$lt_save_ifs" ;; esac], [enable_static=]AC_ENABLE_STATIC_DEFAULT) ])# AC_ENABLE_STATIC # AC_DISABLE_STATIC # ----------------- # set the default static flag to --disable-static AC_DEFUN([AC_DISABLE_STATIC], [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl AC_ENABLE_STATIC(no) ])# AC_DISABLE_STATIC # AC_ENABLE_FAST_INSTALL([DEFAULT]) # --------------------------------- # implement the --enable-fast-install flag # DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. AC_DEFUN([AC_ENABLE_FAST_INSTALL], [define([AC_ENABLE_FAST_INSTALL_DEFAULT], ifelse($1, no, no, yes))dnl AC_ARG_ENABLE([fast-install], [AC_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@], [optimize for fast installation @<:@default=]AC_ENABLE_FAST_INSTALL_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_fast_install=yes ;; no) enable_fast_install=no ;; *) enable_fast_install=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_fast_install=yes fi done IFS="$lt_save_ifs" ;; esac], [enable_fast_install=]AC_ENABLE_FAST_INSTALL_DEFAULT) ])# AC_ENABLE_FAST_INSTALL # AC_DISABLE_FAST_INSTALL # ----------------------- # set the default to --disable-fast-install AC_DEFUN([AC_DISABLE_FAST_INSTALL], [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl AC_ENABLE_FAST_INSTALL(no) ])# AC_DISABLE_FAST_INSTALL # AC_LIBTOOL_PICMODE([MODE]) # -------------------------- # implement the --with-pic flag # MODE is either `yes' or `no'. If omitted, it defaults to `both'. AC_DEFUN([AC_LIBTOOL_PICMODE], [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl pic_mode=ifelse($#,1,$1,default) ])# AC_LIBTOOL_PICMODE # AC_PROG_EGREP # ------------- # This is predefined starting with Autoconf 2.54, so this conditional # definition can be removed once we require Autoconf 2.54 or later. m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP], [AC_CACHE_CHECK([for egrep], [ac_cv_prog_egrep], [if echo a | (grep -E '(a|b)') >/dev/null 2>&1 then ac_cv_prog_egrep='grep -E' else ac_cv_prog_egrep='egrep' fi]) EGREP=$ac_cv_prog_egrep AC_SUBST([EGREP]) ])]) # AC_PATH_TOOL_PREFIX # ------------------- # find a file program which can recognise shared library AC_DEFUN([AC_PATH_TOOL_PREFIX], [AC_REQUIRE([AC_PROG_EGREP])dnl AC_MSG_CHECKING([for $1]) AC_CACHE_VAL(lt_cv_path_MAGIC_CMD, [case $MAGIC_CMD in [[\\/*] | ?:[\\/]*]) lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD="$MAGIC_CMD" lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR dnl $ac_dummy forces splitting on constant user-supplied paths. dnl POSIX.2 word splitting is done only on the output of word expansions, dnl not every word. This closes a longstanding sh security hole. ac_dummy="ifelse([$2], , $PATH, [$2])" for ac_dir in $ac_dummy; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$1; then lt_cv_path_MAGIC_CMD="$ac_dir/$1" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex="`expr \"$deplibs_check_method\" : \"file_magic \(.*\)\"`" MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org EOF fi ;; esac fi break fi done IFS="$lt_save_ifs" MAGIC_CMD="$lt_save_MAGIC_CMD" ;; esac]) MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if test -n "$MAGIC_CMD"; then AC_MSG_RESULT($MAGIC_CMD) else AC_MSG_RESULT(no) fi ])# AC_PATH_TOOL_PREFIX # AC_PATH_MAGIC # ------------- # find a file program which can recognise a shared library AC_DEFUN([AC_PATH_MAGIC], [AC_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH) if test -z "$lt_cv_path_MAGIC_CMD"; then if test -n "$ac_tool_prefix"; then AC_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH) else MAGIC_CMD=: fi fi ])# AC_PATH_MAGIC # AC_PROG_LD # ---------- # find the pathname to the GNU or non-GNU linker AC_DEFUN([AC_PROG_LD], [AC_ARG_WITH([gnu-ld], [AC_HELP_STRING([--with-gnu-ld], [assume the C compiler uses GNU ld @<:@default=no@:>@])], [test "$withval" = no || with_gnu_ld=yes], [with_gnu_ld=no]) AC_REQUIRE([LT_AC_PROG_SED])dnl AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. AC_MSG_CHECKING([for ld used by $CC]) case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [[\\/]]* | ?:[[\\/]]*) re_direlt='/[[^/]][[^/]]*/\.\./' # Canonicalize the pathname of ld ac_prog=`echo $ac_prog| $SED 's%\\\\%/%g'` while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do ac_prog=`echo $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then AC_MSG_CHECKING([for GNU ld]) else AC_MSG_CHECKING([for non-GNU ld]) fi AC_CACHE_VAL(lt_cv_path_LD, [if test -z "$LD"; then lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some GNU ld's only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &1 /dev/null; then case $host_cpu in i*86 ) # Not sure whether the presence of OpenBSD here was a mistake. # Let's accept both of them until this is cleared up. lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD)/i[[3-9]]86 (compact )?demand paged shared library' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` ;; esac else lt_cv_deplibs_check_method=pass_all fi ;; gnu*) lt_cv_deplibs_check_method=pass_all ;; hpux10.20* | hpux11*) lt_cv_file_magic_cmd=/usr/bin/file case "$host_cpu" in ia64*) lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64' lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so ;; hppa*64*) [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - PA-RISC [0-9].[0-9]'] lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl ;; *) lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]].[[0-9]]) shared library' lt_cv_file_magic_test_file=/usr/lib/libc.sl ;; esac ;; irix5* | irix6* | nonstopux*) case $LD in *-32|*"-32 ") libmagic=32-bit;; *-n32|*"-n32 ") libmagic=N32;; *-64|*"-64 ") libmagic=64-bit;; *) libmagic=never-match;; esac lt_cv_deplibs_check_method=pass_all ;; # This must be Linux ELF. linux*) case $host_cpu in alpha*|hppa*|i*86|ia64*|m68*|mips*|powerpc*|sparc*|s390*|sh*|x86_64*) lt_cv_deplibs_check_method=pass_all ;; *) # glibc up to 2.1.1 does not perform some relocations on ARM # this will be overridden with pass_all, but let us keep it just in case lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' ;; esac lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` lt_cv_deplibs_check_method=pass_all ;; netbsd*) if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$' fi ;; newos6*) lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=/usr/lib/libnls.so ;; nto-qnx*) lt_cv_deplibs_check_method=unknown ;; openbsd*) lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB shared object' else lt_cv_deplibs_check_method='file_magic OpenBSD.* shared library' fi ;; osf3* | osf4* | osf5*) lt_cv_deplibs_check_method=pass_all ;; sco3.2v5*) lt_cv_deplibs_check_method=pass_all ;; solaris*) lt_cv_deplibs_check_method=pass_all ;; sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) case $host_vendor in motorola) lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]' lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` ;; ncr) lt_cv_deplibs_check_method=pass_all ;; sequent) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' ;; sni) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib" lt_cv_file_magic_test_file=/lib/libc.so ;; siemens) lt_cv_deplibs_check_method=pass_all ;; esac ;; sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[[78]]* | unixware7* | sysv4*uw2*) lt_cv_deplibs_check_method=pass_all ;; esac ]) file_magic_cmd=$lt_cv_file_magic_cmd deplibs_check_method=$lt_cv_deplibs_check_method test -z "$deplibs_check_method" && deplibs_check_method=unknown ])# AC_DEPLIBS_CHECK_METHOD # AC_PROG_NM # ---------- # find the pathname to a BSD-compatible name lister AC_DEFUN([AC_PROG_NM], [AC_CACHE_CHECK([for BSD-compatible nm], lt_cv_path_NM, [if test -n "$NM"; then # Let the user override the test. lt_cv_path_NM="$NM" else lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH /usr/ccs/bin /usr/ucb /bin; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. tmp_nm="$ac_dir/${ac_tool_prefix}nm" if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then # Check to see if the nm accepts a BSD-compat flag. # Adding the `sed 1q' prevents false positives on HP-UX, which says: # nm: unknown option "B" ignored # Tru64's nm complains that /dev/null is an invalid object file case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in */dev/null* | *'Invalid file or object type'*) lt_cv_path_NM="$tmp_nm -B" break ;; *) case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in */dev/null*) lt_cv_path_NM="$tmp_nm -p" break ;; *) lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but continue # so that we can try to find one that supports BSD flags ;; esac esac fi done IFS="$lt_save_ifs" test -z "$lt_cv_path_NM" && lt_cv_path_NM=nm fi]) NM="$lt_cv_path_NM" ])# AC_PROG_NM # AC_CHECK_LIBM # ------------- # check for math library AC_DEFUN([AC_CHECK_LIBM], [AC_REQUIRE([AC_CANONICAL_HOST])dnl LIBM= case $host in *-*-beos* | *-*-cygwin* | *-*-pw32* | *-*-darwin*) # These system don't have libm, or don't need it ;; *-ncr-sysv4.3*) AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw") AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm") ;; *) AC_CHECK_LIB(m, cos, LIBM="-lm") ;; esac ])# AC_CHECK_LIBM # AC_LIBLTDL_CONVENIENCE([DIRECTORY]) # ----------------------------------- # sets LIBLTDL to the link flags for the libltdl convenience library and # LTDLINCL to the include flags for the libltdl header and adds # --enable-ltdl-convenience to the configure arguments. Note that LIBLTDL # and LTDLINCL are not AC_SUBSTed, nor is AC_CONFIG_SUBDIRS called. If # DIRECTORY is not provided, it is assumed to be `libltdl'. LIBLTDL will # be prefixed with '${top_builddir}/' and LTDLINCL will be prefixed with # '${top_srcdir}/' (note the single quotes!). If your package is not # flat and you're not using automake, define top_builddir and # top_srcdir appropriately in the Makefiles. AC_DEFUN([AC_LIBLTDL_CONVENIENCE], [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl case $enable_ltdl_convenience in no) AC_MSG_ERROR([this package needs a convenience libltdl]) ;; "") enable_ltdl_convenience=yes ac_configure_args="$ac_configure_args --enable-ltdl-convenience" ;; esac LIBLTDL='${top_builddir}/'ifelse($#,1,[$1],['libltdl'])/libltdlc.la LTDLINCL='-I${top_srcdir}/'ifelse($#,1,[$1],['libltdl']) # For backwards non-gettext consistent compatibility... INCLTDL="$LTDLINCL" ])# AC_LIBLTDL_CONVENIENCE # AC_LIBLTDL_INSTALLABLE([DIRECTORY]) # ----------------------------------- # sets LIBLTDL to the link flags for the libltdl installable library and # LTDLINCL to the include flags for the libltdl header and adds # --enable-ltdl-install to the configure arguments. Note that LIBLTDL # and LTDLINCL are not AC_SUBSTed, nor is AC_CONFIG_SUBDIRS called. If # DIRECTORY is not provided and an installed libltdl is not found, it is # assumed to be `libltdl'. LIBLTDL will be prefixed with '${top_builddir}/' # and LTDLINCL will be prefixed with '${top_srcdir}/' (note the single # quotes!). If your package is not flat and you're not using automake, # define top_builddir and top_srcdir appropriately in the Makefiles. # In the future, this macro may have to be called after AC_PROG_LIBTOOL. AC_DEFUN([AC_LIBLTDL_INSTALLABLE], [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl AC_CHECK_LIB(ltdl, lt_dlinit, [test x"$enable_ltdl_install" != xyes && enable_ltdl_install=no], [if test x"$enable_ltdl_install" = xno; then AC_MSG_WARN([libltdl not installed, but installation disabled]) else enable_ltdl_install=yes fi ]) if test x"$enable_ltdl_install" = x"yes"; then ac_configure_args="$ac_configure_args --enable-ltdl-install" LIBLTDL='${top_builddir}/'ifelse($#,1,[$1],['libltdl'])/libltdl.la LTDLINCL='-I${top_srcdir}/'ifelse($#,1,[$1],['libltdl']) else ac_configure_args="$ac_configure_args --enable-ltdl-install=no" LIBLTDL="-lltdl" LTDLINCL= fi # For backwards non-gettext consistent compatibility... INCLTDL="$LTDLINCL" ])# AC_LIBLTDL_INSTALLABLE # AC_LIBTOOL_CXX # -------------- # enable support for C++ libraries AC_DEFUN([AC_LIBTOOL_CXX], [AC_REQUIRE([_LT_AC_LANG_CXX]) ])# AC_LIBTOOL_CXX # _LT_AC_LANG_CXX # --------------- AC_DEFUN([_LT_AC_LANG_CXX], [AC_REQUIRE([AC_PROG_CXX]) AC_REQUIRE([AC_PROG_CXXCPP]) _LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}CXX]) ])# _LT_AC_LANG_CXX # AC_LIBTOOL_F77 # -------------- # enable support for Fortran 77 libraries AC_DEFUN([AC_LIBTOOL_F77], [AC_REQUIRE([_LT_AC_LANG_F77]) ])# AC_LIBTOOL_F77 # _LT_AC_LANG_F77 # --------------- AC_DEFUN([_LT_AC_LANG_F77], [AC_REQUIRE([AC_PROG_F77]) _LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}F77]) ])# _LT_AC_LANG_F77 # AC_LIBTOOL_GCJ # -------------- # enable support for GCJ libraries AC_DEFUN([AC_LIBTOOL_GCJ], [AC_REQUIRE([_LT_AC_LANG_GCJ]) ])# AC_LIBTOOL_GCJ # _LT_AC_LANG_GCJ # --------------- AC_DEFUN([_LT_AC_LANG_GCJ], [AC_PROVIDE_IFELSE([AC_PROG_GCJ],[], [AC_PROVIDE_IFELSE([A][M_PROG_GCJ],[], [AC_PROVIDE_IFELSE([LT_AC_PROG_GCJ],[], [ifdef([AC_PROG_GCJ],[AC_REQUIRE([AC_PROG_GCJ])], [ifdef([A][M_PROG_GCJ],[AC_REQUIRE([A][M_PROG_GCJ])], [AC_REQUIRE([A][C_PROG_GCJ_OR_A][M_PROG_GCJ])])])])])]) _LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}GCJ]) ])# _LT_AC_LANG_GCJ # AC_LIBTOOL_RC # -------------- # enable support for Windows resource files AC_DEFUN([AC_LIBTOOL_RC], [AC_REQUIRE([LT_AC_PROG_RC]) _LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}RC]) ])# AC_LIBTOOL_RC # AC_LIBTOOL_LANG_C_CONFIG # ------------------------ # Ensure that the configuration vars for the C compiler are # suitably defined. Those variables are subsequently used by # AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'. AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG], [_LT_AC_LANG_C_CONFIG]) AC_DEFUN([_LT_AC_LANG_C_CONFIG], [lt_save_CC="$CC" AC_LANG_PUSH(C) # Source file extension for C test sources. ac_ext=c # Object file extension for compiled C test sources. objext=o _LT_AC_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;\n" # Code to be used in simple link tests lt_simple_link_test_code='int main(){return(0);}\n' _LT_AC_SYS_COMPILER # # Check for any special shared library compilation flags. # _LT_AC_TAGVAR(lt_prog_cc_shlib, $1)= if test "$GCC" = no; then case $host_os in sco3.2v5*) _LT_AC_TAGVAR(lt_prog_cc_shlib, $1)='-belf' ;; esac fi if test -n "$_LT_AC_TAGVAR(lt_prog_cc_shlib, $1)"; then AC_MSG_WARN([`$CC' requires `$_LT_AC_TAGVAR(lt_prog_cc_shlib, $1)' to build shared libraries]) if echo "$old_CC $old_CFLAGS " | grep "[[ ]]$_LT_AC_TAGVAR(lt_prog_cc_shlib, $1)[[ ]]" >/dev/null; then : else AC_MSG_WARN([add `$_LT_AC_TAGVAR(lt_prog_cc_shlib, $1)' to the CC or CFLAGS env variable and reconfigure]) _LT_AC_TAGVAR(lt_cv_prog_cc_can_build_shared, $1)=no fi fi # # Check to make sure the static flag actually works. # AC_LIBTOOL_LINKER_OPTION([if $compiler static flag $_LT_AC_TAGVAR(lt_prog_compiler_static, $1) works], _LT_AC_TAGVAR(lt_prog_compiler_static_works, $1), $_LT_AC_TAGVAR(lt_prog_compiler_static, $1), [], [_LT_AC_TAGVAR(lt_prog_compiler_static, $1)=]) AC_LIBTOOL_PROG_COMPILER_NO_RTTI($1) AC_LIBTOOL_PROG_COMPILER_PIC($1) AC_LIBTOOL_PROG_CC_C_O($1) AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1) AC_LIBTOOL_PROG_LD_SHLIBS($1) AC_LIBTOOL_SYS_DYNAMIC_LINKER($1) AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1) AC_LIBTOOL_SYS_LIB_STRIP AC_LIBTOOL_DLOPEN_SELF($1) # Report which librarie types wil actually be built AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case "$host_os" in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix4* | aix5*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; darwin* | rhapsody*) if test "$GCC" = yes; then _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no case "$host_os" in rhapsody* | darwin1.[[012]]) _LT_AC_TAGVAR(allow_undefined_flag, $1)='-undefined suppress' ;; *) # Darwin 1.3 on if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then _LT_AC_TAGVAR(allow_undefined_flag, $1)='-flat_namespace -undefined suppress' else case ${MACOSX_DEPLOYMENT_TARGET} in 10.[[012]]) _LT_AC_TAGVAR(allow_undefined_flag, $1)='-flat_namespace -undefined suppress' ;; 10.*) _LT_AC_TAGVAR(allow_undefined_flag, $1)='-undefined dynamic_lookup' ;; esac fi ;; esac output_verbose_link_cmd='echo' _LT_AC_TAGVAR(archive_cmds, $1)='$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs$compiler_flags -install_name $rpath/$soname $verstring' _LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs$compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' _LT_AC_TAGVAR(hardcode_direct, $1)=no _LT_AC_TAGVAR(hardcode_automatic, $1)=yes _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='-all_load $convenience' _LT_AC_TAGVAR(link_all_deplibs, $1)=yes else _LT_AC_TAGVAR(ld_shlibs, $1)=no fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes AC_MSG_RESULT([$enable_static]) AC_LIBTOOL_CONFIG($1) AC_LANG_POP CC="$lt_save_CC" ])# AC_LIBTOOL_LANG_C_CONFIG # AC_LIBTOOL_LANG_CXX_CONFIG # -------------------------- # Ensure that the configuration vars for the C compiler are # suitably defined. Those variables are subsequently used by # AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'. AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG], [_LT_AC_LANG_CXX_CONFIG(CXX)]) AC_DEFUN([_LT_AC_LANG_CXX_CONFIG], [AC_LANG_PUSH(C++) AC_REQUIRE([AC_PROG_CXX]) AC_REQUIRE([AC_PROG_CXXCPP]) _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no _LT_AC_TAGVAR(allow_undefined_flag, $1)= _LT_AC_TAGVAR(always_export_symbols, $1)=no _LT_AC_TAGVAR(archive_expsym_cmds, $1)= _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)= _LT_AC_TAGVAR(hardcode_direct, $1)=no _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= _LT_AC_TAGVAR(hardcode_libdir_separator, $1)= _LT_AC_TAGVAR(hardcode_minus_L, $1)=no _LT_AC_TAGVAR(hardcode_automatic, $1)=no _LT_AC_TAGVAR(module_cmds, $1)= _LT_AC_TAGVAR(module_expsym_cmds, $1)= _LT_AC_TAGVAR(link_all_deplibs, $1)=unknown _LT_AC_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_AC_TAGVAR(no_undefined_flag, $1)= _LT_AC_TAGVAR(whole_archive_flag_spec, $1)= _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Dependencies to place before and after the object being linked: _LT_AC_TAGVAR(predep_objects, $1)= _LT_AC_TAGVAR(postdep_objects, $1)= _LT_AC_TAGVAR(predeps, $1)= _LT_AC_TAGVAR(postdeps, $1)= _LT_AC_TAGVAR(compiler_lib_search_path, $1)= # Source file extension for C++ test sources. ac_ext=cc # Object file extension for compiled C++ test sources. objext=o _LT_AC_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;\n" # Code to be used in simple link tests lt_simple_link_test_code='int main(int, char *[]) { return(0); }\n' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_AC_SYS_COMPILER # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_LD=$LD lt_save_GCC=$GCC GCC=$GXX lt_save_with_gnu_ld=$with_gnu_ld lt_save_path_LD=$lt_cv_path_LD if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx else unset lt_cv_prog_gnu_ld fi if test -n "${lt_cv_path_LDCXX+set}"; then lt_cv_path_LD=$lt_cv_path_LDCXX else unset lt_cv_path_LD fi test -z "${LDCXX+set}" || LD=$LDCXX CC=${CXX-"c++"} compiler=$CC _LT_AC_TAGVAR(compiler, $1)=$CC cc_basename=`$echo X"$compiler" | $Xsed -e 's%^.*/%%'` # We don't want -fno-exception wen compiling C++ code, so set the # no_builtin_flag separately if test "$GXX" = yes; then _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' else _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= fi if test "$GXX" = yes; then # Set up default GNU C++ configuration AC_PROG_LD # Check if GNU C++ uses GNU ld as the underlying linker, since the # archiving commands below assume that GNU ld is being used. if test "$with_gnu_ld" = yes; then _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' # If archive_cmds runs LD, not CC, wlarc should be empty # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to # investigate it a little bit more. (MM) wlarc='${wl}' # ancient GNU ld didn't support --whole-archive et. al. if eval "`$CC -print-prog-name=ld` --help 2>&1" | \ grep 'no-whole-archive' > /dev/null; then _LT_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else _LT_AC_TAGVAR(whole_archive_flag_spec, $1)= fi else with_gnu_ld=no wlarc= # A generic and very simple default shared library creation # command for GNU C++ for the case where it uses the native # linker, instead of GNU ld. If possible, this setting should # overridden to take advantage of the native linker features on # the platform it is being used on. _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' fi # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' else GXX=no with_gnu_ld=no wlarc= fi # PORTME: fill in a description of your system's C++ link characteristics AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) _LT_AC_TAGVAR(ld_shlibs, $1)=yes case $host_os in aix3*) # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; aix4* | aix5*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[[23]]|aix4.[[23]].*|aix5*) for ld_flag in $LDFLAGS; do case $ld_flag in *-brtl*) aix_use_runtimelinking=yes break ;; esac done esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. _LT_AC_TAGVAR(archive_cmds, $1)='' _LT_AC_TAGVAR(hardcode_direct, $1)=yes _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_AC_TAGVAR(link_all_deplibs, $1)=yes if test "$GXX" = yes; then case $host_os in aix4.[012]|aix4.[012].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && \ strings "$collect2name" | grep resolve_lib_name >/dev/null then # We have reworked collect2 _LT_AC_TAGVAR(hardcode_direct, $1)=yes else # We have old collect2 _LT_AC_TAGVAR(hardcode_direct, $1)=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)= fi esac shared_flag='-shared' else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. _LT_AC_TAGVAR(always_export_symbols, $1)=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. _LT_AC_TAGVAR(allow_undefined_flag, $1)='-berok' # Determine the default libpath from the value encoded in an empty executable. _LT_AC_SYS_LIBPATH_AIX _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' _LT_AC_TAGVAR(allow_undefined_flag, $1)="-z nodefs" _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an empty executable. _LT_AC_SYS_LIBPATH_AIX _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. _LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' # -bexpall does not export symbols beginning with underscore (_) _LT_AC_TAGVAR(always_export_symbols, $1)=yes # Exported symbols can be pulled into shared objects from archives _LT_AC_TAGVAR(whole_archive_flag_spec, $1)=' ' _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes # This is similar to how AIX traditionally builds it's shared libraries. _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}-bE:$export_symbols ${wl}-bnoentry${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; chorus*) case $cc_basename in *) # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; esac ;; cygwin* | mingw* | pw32*) # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, # as there is no search path for DLLs. _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_AC_TAGVAR(always_export_symbols, $1)=no _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... _LT_AC_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' else _LT_AC_TAGVAR(ld_shlibs, $1)=no fi ;; darwin* | rhapsody*) if test "$GXX" = yes; then _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no case "$host_os" in rhapsody* | darwin1.[[012]]) _LT_AC_TAGVAR(allow_undefined_flag, $1)='-undefined suppress' ;; *) # Darwin 1.3 on if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then _LT_AC_TAGVAR(allow_undefined_flag, $1)='-flat_namespace -undefined suppress' else case ${MACOSX_DEPLOYMENT_TARGET} in 10.[[012]]) _LT_AC_TAGVAR(allow_undefined_flag, $1)='-flat_namespace -undefined suppress' ;; 10.*) _LT_AC_TAGVAR(allow_undefined_flag, $1)='-undefined dynamic_lookup' ;; esac fi ;; esac lt_int_apple_cc_single_mod=no output_verbose_link_cmd='echo' if $CC -dumpspecs 2>&1 | grep 'single_module' >/dev/null ; then lt_int_apple_cc_single_mod=yes fi if test "X$lt_int_apple_cc_single_mod" = Xyes ; then _LT_AC_TAGVAR(archive_cmds, $1)='$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' else _LT_AC_TAGVAR(archive_cmds, $1)='$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring' fi _LT_AC_TAGVAR(module_cmds, $1)='$CC ${wl}-bind_at_load $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's if test "X$lt_int_apple_cc_single_mod" = Xyes ; then _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' else _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' fi _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' _LT_AC_TAGVAR(hardcode_direct, $1)=no _LT_AC_TAGVAR(hardcode_automatic, $1)=yes _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='-all_load $convenience' _LT_AC_TAGVAR(link_all_deplibs, $1)=yes else _LT_AC_TAGVAR(ld_shlibs, $1)=no fi ;; dgux*) case $cc_basename in ec++) # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; ghcx) # Green Hills C++ Compiler # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; esac ;; freebsd[12]*) # C++ shared libraries reported to be fairly broken before switch to ELF _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; freebsd-elf*) _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no ;; freebsd* | kfreebsd*-gnu) # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF # conventions _LT_AC_TAGVAR(ld_shlibs, $1)=yes ;; gnu*) ;; hpux9*) _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' _LT_AC_TAGVAR(hardcode_direct, $1)=yes _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, # but as the default # location of the library. case $cc_basename in CC) # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; aCC) _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "[-]L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' ;; *) if test "$GXX" = yes; then _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -shared -nostdlib -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; hpux10*|hpux11*) if test $with_gnu_ld = no; then case "$host_cpu" in hppa*64*) _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='+b $libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: ;; ia64*) _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' ;; *) _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' ;; esac fi case "$host_cpu" in hppa*64*) _LT_AC_TAGVAR(hardcode_direct, $1)=no _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ;; ia64*) _LT_AC_TAGVAR(hardcode_direct, $1)=no _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, # but as the default # location of the library. ;; *) _LT_AC_TAGVAR(hardcode_direct, $1)=yes _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, # but as the default # location of the library. ;; esac case $cc_basename in CC) # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; aCC) case "$host_cpu" in hppa*64*|ia64*) _LT_AC_TAGVAR(archive_cmds, $1)='$LD -b +h $soname -o $lib $linker_flags $libobjs $deplibs' ;; *) _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' ;; *) if test "$GXX" = yes; then if test $with_gnu_ld = no; then case "$host_cpu" in ia64*|hppa*64*) _LT_AC_TAGVAR(archive_cmds, $1)='$LD -b +h $soname -o $lib $linker_flags $libobjs $deplibs' ;; *) _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac fi else # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; irix5* | irix6*) case $cc_basename in CC) # SGI C++ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib' # Archives containing C++ object files must be created using # "CC -ar", where "CC" is the IRIX C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs' ;; *) if test "$GXX" = yes; then if test "$with_gnu_ld" = no; then _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib' else _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` -o $lib' fi fi _LT_AC_TAGVAR(link_all_deplibs, $1)=yes ;; esac _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: ;; linux*) case $cc_basename in KCC) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. _LT_AC_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | grep "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath,$libdir' _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' # Archives containing C++ object files must be created using # "CC -Bstatic", where "CC" is the KAI C++ compiler. _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; icpc) # Intel C++ with_gnu_ld=yes _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' ;; cxx) # Compaq C++ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' runpath_var=LD_RUN_PATH _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' ;; esac ;; lynxos*) # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; m88k*) # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; mvs*) case $cc_basename in cxx) # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; esac ;; netbsd*) if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' wlarc= _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_AC_TAGVAR(hardcode_direct, $1)=yes _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no fi # Workaround some broken pre-1.5 toolchains output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' ;; osf3*) case $cc_basename in KCC) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. _LT_AC_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: # Archives containing C++ object files must be created using # "CC -Bstatic", where "CC" is the KAI C++ compiler. _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; RCC) # Rational C++ 2.4.1 # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; cxx) _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && echo ${wl}-set_version $verstring` -update_registry ${objdir}/so_locations -o $lib' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' ;; *) if test "$GXX" = yes && test "$with_gnu_ld" = no; then _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' else # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; osf4* | osf5*) case $cc_basename in KCC) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. _LT_AC_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: # Archives containing C++ object files must be created using # the KAI C++ compiler. _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;; RCC) # Rational C++ 2.4.1 # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; cxx) _LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ echo "-hidden">> $lib.exp~ $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname -Wl,-input -Wl,$lib.exp `test -n "$verstring" && echo -set_version $verstring` -update_registry $objdir/so_locations -o $lib~ $rm $lib.exp' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' ;; *) if test "$GXX" = yes && test "$with_gnu_ld" = no; then _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' else # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; psos*) # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; sco*) _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no case $cc_basename in CC) # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; esac ;; sunos4*) case $cc_basename in CC) # Sun C++ 4.x # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; lcc) # Lucid # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; esac ;; solaris*) case $cc_basename in CC) # Sun C++ 4.2, 5.x and Centerline C++ _LT_AC_TAGVAR(no_undefined_flag, $1)=' -zdefs' _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -nolib -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $CC -G${allow_undefined_flag} -nolib ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) # The C++ compiler is used as linker so we must use $wl # flag to pass the commands to the underlying system # linker. # Supported since Solaris 2.6 (maybe 2.5.1?) _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' ;; esac _LT_AC_TAGVAR(link_all_deplibs, $1)=yes # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -G $CFLAGS -v conftest.$objext 2>&1 | grep "\-[[LR]]"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' ;; gcx) # Green Hills C++ Compiler _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' # The C++ compiler must be used to create the archive. _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs' ;; *) # GNU C++ compiler with Solaris linker if test "$GXX" = yes && test "$with_gnu_ld" = no; then _LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs' if $CC --version | grep -v '^2\.7' > /dev/null; then _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $CC -shared -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd="$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\"" else # g++ 2.7 appears to require `-G' NOT `-shared' on this # platform. _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd="$CC -G $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\"" fi _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir' fi ;; esac ;; sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[[78]]* | unixware7*) _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no ;; tandem*) case $cc_basename in NCC) # NonStop-UX NCC 3.20 # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; esac ;; vxworks*) # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; esac AC_MSG_RESULT([$_LT_AC_TAGVAR(ld_shlibs, $1)]) test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no _LT_AC_TAGVAR(GCC, $1)="$GXX" _LT_AC_TAGVAR(LD, $1)="$LD" AC_LIBTOOL_POSTDEP_PREDEP($1) AC_LIBTOOL_PROG_COMPILER_PIC($1) AC_LIBTOOL_PROG_CC_C_O($1) AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1) AC_LIBTOOL_PROG_LD_SHLIBS($1) AC_LIBTOOL_SYS_DYNAMIC_LINKER($1) AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1) AC_LIBTOOL_SYS_LIB_STRIP AC_LIBTOOL_DLOPEN_SELF($1) AC_LIBTOOL_CONFIG($1) AC_LANG_POP CC=$lt_save_CC LDCXX=$LD LD=$lt_save_LD GCC=$lt_save_GCC with_gnu_ldcxx=$with_gnu_ld with_gnu_ld=$lt_save_with_gnu_ld lt_cv_path_LDCXX=$lt_cv_path_LD lt_cv_path_LD=$lt_save_path_LD lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld ])# AC_LIBTOOL_LANG_CXX_CONFIG # AC_LIBTOOL_POSTDEP_PREDEP([TAGNAME]) # ------------------------ # Figure out "hidden" library dependencies from verbose # compiler output when linking a shared library. # Parse the compiler output and extract the necessary # objects, libraries and library flags. AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP],[ dnl we can't use the lt_simple_compile_test_code here, dnl because it contains code intended for an executable, dnl not a library. It's possible we should let each dnl tag define a new lt_????_link_test_code variable, dnl but it's only used here... ifelse([$1],[],[cat > conftest.$ac_ext < conftest.$ac_ext < conftest.$ac_ext < conftest.$ac_ext <> "$cfgfile" ifelse([$1], [], [#! $SHELL # `$echo "$cfgfile" | sed 's%^.*/%%'` - Provide generalized library-building support services. # Generated automatically by $PROGRAM (GNU $PACKAGE $VERSION$TIMESTAMP) # NOTE: Changes made to this file will be lost: look at ltmain.sh. # # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001 # Free Software Foundation, Inc. # # This file is part of GNU Libtool: # Originally by Gordon Matzigkeit , 1996 # # 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. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # A sed program that does not truncate output. SED=$lt_SED # Sed that helps us avoid accidentally triggering echo(1) options like -n. Xsed="$SED -e s/^X//" # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. if test "X\${CDPATH+set}" = Xset; then CDPATH=:; export CDPATH; fi # The names of the tagged configurations supported by this script. available_tags= # ### BEGIN LIBTOOL CONFIG], [# ### BEGIN LIBTOOL TAG CONFIG: $tagname]) # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # Shell to use when invoking shell scripts. SHELL=$lt_SHELL # Whether or not to build shared libraries. build_libtool_libs=$enable_shared # Whether or not to build static libraries. build_old_libs=$enable_static # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$_LT_AC_TAGVAR(archive_cmds_need_lc, $1) # Whether or not to disallow shared libs when runtime libs are static allow_libtool_libs_with_static_runtimes=$_LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1) # Whether or not to optimize for fast installation. fast_install=$enable_fast_install # The host system. host_alias=$host_alias host=$host # An echo program that does not interpret backslashes. echo=$lt_echo # The archiver. AR=$lt_AR AR_FLAGS=$lt_AR_FLAGS # A C compiler. LTCC=$lt_LTCC # A language-specific compiler. CC=$lt_[]_LT_AC_TAGVAR(compiler, $1) # Is the compiler the GNU C compiler? with_gcc=$_LT_AC_TAGVAR(GCC, $1) # An ERE matcher. EGREP=$lt_EGREP # The linker used to build libraries. LD=$lt_[]_LT_AC_TAGVAR(LD, $1) # Whether we need hard or soft links. LN_S=$lt_LN_S # A BSD-compatible nm program. NM=$lt_NM # A symbol stripping program STRIP=$lt_STRIP # Used to examine libraries when file_magic_cmd begins "file" MAGIC_CMD=$MAGIC_CMD # Used on cygwin: DLL creation program. DLLTOOL="$DLLTOOL" # Used on cygwin: object dumper. OBJDUMP="$OBJDUMP" # Used on cygwin: assembler. AS="$AS" # The name of the directory that contains temporary libtool files. objdir=$objdir # How to create reloadable object files. reload_flag=$lt_reload_flag reload_cmds=$lt_reload_cmds # How to pass a linker flag through the compiler. wl=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_wl, $1) # Object file suffix (normally "o"). objext="$ac_objext" # Old archive suffix (normally "a"). libext="$libext" # Shared library suffix (normally ".so"). shrext_cmds='$shrext_cmds' # Executable file suffix (normally ""). exeext="$exeext" # Additional compiler flags for building library objects. pic_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) pic_mode=$pic_mode # What is the maximum length of a command? max_cmd_len=$lt_cv_sys_max_cmd_len # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_[]_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1) # Must we lock files when doing compilation ? need_locks=$lt_need_locks # Do we need the lib prefix for modules? need_lib_prefix=$need_lib_prefix # Do we need a version for libraries? need_version=$need_version # Whether dlopen is supported. dlopen_support=$enable_dlopen # Whether dlopen of programs is supported. dlopen_self=$enable_dlopen_self # Whether dlopen of statically linked programs is supported. dlopen_self_static=$enable_dlopen_self_static # Compiler flag to prevent dynamic linking. link_static_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_static, $1) # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_[]_LT_AC_TAGVAR(export_dynamic_flag_spec, $1) # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec=$lt_[]_LT_AC_TAGVAR(whole_archive_flag_spec, $1) # Compiler flag to generate thread-safe objects. thread_safe_flag_spec=$lt_[]_LT_AC_TAGVAR(thread_safe_flag_spec, $1) # Library versioning type. version_type=$version_type # Format of library name prefix. libname_spec=$lt_libname_spec # List of archive names. First name is the real one, the rest are links. # The last name is the one that the linker finds with -lNAME. library_names_spec=$lt_library_names_spec # The coded name of the library, if different from the real name. soname_spec=$lt_soname_spec # Commands used to build and install an old-style archive. RANLIB=$lt_RANLIB old_archive_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_cmds, $1) old_postinstall_cmds=$lt_old_postinstall_cmds old_postuninstall_cmds=$lt_old_postuninstall_cmds # Create an old-style archive from a shared archive. old_archive_from_new_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_from_new_cmds, $1) # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1) # Commands used to build and install a shared archive. archive_cmds=$lt_[]_LT_AC_TAGVAR(archive_cmds, $1) archive_expsym_cmds=$lt_[]_LT_AC_TAGVAR(archive_expsym_cmds, $1) postinstall_cmds=$lt_postinstall_cmds postuninstall_cmds=$lt_postuninstall_cmds # Commands used to build a loadable module (assumed same as above if empty) module_cmds=$lt_[]_LT_AC_TAGVAR(module_cmds, $1) module_expsym_cmds=$lt_[]_LT_AC_TAGVAR(module_expsym_cmds, $1) # Commands to strip libraries. old_striplib=$lt_old_striplib striplib=$lt_striplib # Dependencies to place before the objects being linked to create a # shared library. predep_objects=$lt_[]_LT_AC_TAGVAR(predep_objects, $1) # Dependencies to place after the objects being linked to create a # shared library. postdep_objects=$lt_[]_LT_AC_TAGVAR(postdep_objects, $1) # Dependencies to place before the objects being linked to create a # shared library. predeps=$lt_[]_LT_AC_TAGVAR(predeps, $1) # Dependencies to place after the objects being linked to create a # shared library. postdeps=$lt_[]_LT_AC_TAGVAR(postdeps, $1) # The library search path used internally by the compiler when linking # a shared library. compiler_lib_search_path=$lt_[]_LT_AC_TAGVAR(compiler_lib_search_path, $1) # Method to check whether dependent libraries are shared objects. deplibs_check_method=$lt_deplibs_check_method # Command to use when deplibs_check_method == file_magic. file_magic_cmd=$lt_file_magic_cmd # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_[]_LT_AC_TAGVAR(allow_undefined_flag, $1) # Flag that forces no undefined symbols. no_undefined_flag=$lt_[]_LT_AC_TAGVAR(no_undefined_flag, $1) # Commands used to finish a libtool library installation in a directory. finish_cmds=$lt_finish_cmds # Same as above, but a single script fragment to be evaled but not shown. finish_eval=$lt_finish_eval # Take the output of nm and produce a listing of raw symbols and C names. global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe # Transform the output of nm in a proper C declaration global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl # Transform the output of nm in a C name address pair global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address # This is the shared library runtime path variable. runpath_var=$runpath_var # This is the shared library path variable. shlibpath_var=$shlibpath_var # Is shlibpath searched before the hard-coded library search path? shlibpath_overrides_runpath=$shlibpath_overrides_runpath # How to hardcode a shared library path into an executable. hardcode_action=$_LT_AC_TAGVAR(hardcode_action, $1) # Whether we should hardcode library paths into libraries. hardcode_into_libs=$hardcode_into_libs # Flag to hardcode \$libdir into a binary during linking. # This must work even if \$libdir does not exist. hardcode_libdir_flag_spec=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) # If ld is used when linking, flag to hardcode \$libdir into # a binary during linking. This must work even if \$libdir does # not exist. hardcode_libdir_flag_spec_ld=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1) # Whether we need a single -rpath flag with a separated argument. hardcode_libdir_separator=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_separator, $1) # Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the # resulting binary. hardcode_direct=$_LT_AC_TAGVAR(hardcode_direct, $1) # Set to yes if using the -LDIR flag during linking hardcodes DIR into the # resulting binary. hardcode_minus_L=$_LT_AC_TAGVAR(hardcode_minus_L, $1) # Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into # the resulting binary. hardcode_shlibpath_var=$_LT_AC_TAGVAR(hardcode_shlibpath_var, $1) # Set to yes if building a shared library automatically hardcodes DIR into the library # and all subsequent libraries and executables linked against it. hardcode_automatic=$_LT_AC_TAGVAR(hardcode_automatic, $1) # Variables whose values should be saved in libtool wrapper scripts and # restored at relink time. variables_saved_for_relink="$variables_saved_for_relink" # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$_LT_AC_TAGVAR(link_all_deplibs, $1) # Compile-time system search path for libraries sys_lib_search_path_spec=$lt_sys_lib_search_path_spec # Run-time system search path for libraries sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec # Fix the shell variable \$srcfile for the compiler. fix_srcfile_path="$_LT_AC_TAGVAR(fix_srcfile_path, $1)" # Set to yes if exported symbols are required. always_export_symbols=$_LT_AC_TAGVAR(always_export_symbols, $1) # The commands to list exported symbols. export_symbols_cmds=$lt_[]_LT_AC_TAGVAR(export_symbols_cmds, $1) # The commands to extract the exported symbol list from a shared archive. extract_expsyms_cmds=$lt_extract_expsyms_cmds # Symbols that should not be listed in the preloaded symbols. exclude_expsyms=$lt_[]_LT_AC_TAGVAR(exclude_expsyms, $1) # Symbols that must always be exported. include_expsyms=$lt_[]_LT_AC_TAGVAR(include_expsyms, $1) ifelse([$1],[], [# ### END LIBTOOL CONFIG], [# ### END LIBTOOL TAG CONFIG: $tagname]) __EOF__ ifelse([$1],[], [ case $host_os in aix3*) cat <<\EOF >> "$cfgfile" # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi EOF ;; esac # We use sed instead of cat because bash on DJGPP gets confused if # if finds mixed CR/LF and LF-only lines. Since sed operates in # text mode, it properly converts lines to CR/LF. This bash problem # is reportedly fixed, but why not run on old versions too? sed '$q' "$ltmain" >> "$cfgfile" || (rm -f "$cfgfile"; exit 1) mv -f "$cfgfile" "$ofile" || \ (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") chmod +x "$ofile" ]) else # If there is no Makefile yet, we rely on a make rule to execute # `config.status --recheck' to rerun these tests and create the # libtool script then. ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` if test -f "$ltmain_in"; then test -f Makefile && make "$ltmain" fi fi ])# AC_LIBTOOL_CONFIG # AC_LIBTOOL_PROG_COMPILER_NO_RTTI([TAGNAME]) # ------------------------------------------- AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= if test "$GCC" = yes; then _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' AC_LIBTOOL_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions], lt_cv_prog_compiler_rtti_exceptions, [-fno-rtti -fno-exceptions], [], [_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"]) fi ])# AC_LIBTOOL_PROG_COMPILER_NO_RTTI # AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE # --------------------------------- AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_REQUIRE([AC_CANONICAL_HOST]) AC_REQUIRE([AC_PROG_NM]) AC_REQUIRE([AC_OBJEXT]) # Check for command to grab the raw symbol name followed by C symbol from nm. AC_MSG_CHECKING([command to parse $NM output from $compiler object]) AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe], [ # These are sane defaults that work on at least a few old systems. # [They come from Ultrix. What could be older than Ultrix?!! ;)] # Character class describing NM global symbol codes. symcode='[[BCDEGRST]]' # Regexp to match symbols that can be accessed directly from C. sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)' # Transform the above into a raw symbol and a C symbol. symxfrm='\1 \2\3 \3' # Transform an extracted symbol line into a proper C declaration lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^. .* \(.*\)$/extern int \1;/p'" # Transform an extracted symbol line into symbol name and symbol address lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" # Define system-specific variables. case $host_os in aix*) symcode='[[BCDT]]' ;; cygwin* | mingw* | pw32*) symcode='[[ABCDGISTW]]' ;; hpux*) # Its linker distinguishes data from code symbols if test "$host_cpu" = ia64; then symcode='[[ABCDEGRST]]' fi lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" ;; irix* | nonstopux*) symcode='[[BCDEGRST]]' ;; osf*) symcode='[[BCDEGQRST]]' ;; solaris* | sysv5*) symcode='[[BDRT]]' ;; sysv4) symcode='[[DFNSTU]]' ;; esac # Handle CRLF in mingw tool chain opt_cr= case $build_os in mingw*) opt_cr=`echo 'x\{0,1\}' | tr x '\015'` # option cr in regexp ;; esac # If we're using GNU nm, then use its standard symbol codes. case `$NM -V 2>&1` in *GNU* | *'with BFD'*) symcode='[[ABCDGIRSTW]]' ;; esac # Try without a prefix undercore, then with it. for ac_symprfx in "" "_"; do # Write the raw and C identifiers. lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*\($ac_symprfx\)$sympat$opt_cr$/$symxfrm/p'" # Check to see that the pipe works correctly. pipe_works=no rm -f conftest* cat > conftest.$ac_ext < $nlist) && test -s "$nlist"; then # Try sorting and uniquifying the output. if sort "$nlist" | uniq > "$nlist"T; then mv -f "$nlist"T "$nlist" else rm -f "$nlist"T fi # Make sure that we snagged all the symbols we need. if grep ' nm_test_var$' "$nlist" >/dev/null; then if grep ' nm_test_func$' "$nlist" >/dev/null; then cat < conftest.$ac_ext #ifdef __cplusplus extern "C" { #endif EOF # Now generate the symbol file. eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | grep -v main >> conftest.$ac_ext' cat <> conftest.$ac_ext #if defined (__STDC__) && __STDC__ # define lt_ptr_t void * #else # define lt_ptr_t char * # define const #endif /* The mapping between symbol names and symbols. */ const struct { const char *name; lt_ptr_t address; } lt_preloaded_symbols[[]] = { EOF $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (lt_ptr_t) \&\2},/" < "$nlist" | grep -v main >> conftest.$ac_ext cat <<\EOF >> conftest.$ac_ext {0, (lt_ptr_t) 0} }; #ifdef __cplusplus } #endif EOF # Now try linking the two files. mv conftest.$ac_objext conftstm.$ac_objext lt_save_LIBS="$LIBS" lt_save_CFLAGS="$CFLAGS" LIBS="conftstm.$ac_objext" CFLAGS="$CFLAGS$_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)" if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then pipe_works=yes fi LIBS="$lt_save_LIBS" CFLAGS="$lt_save_CFLAGS" else echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD fi else echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD fi else echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD fi else echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD cat conftest.$ac_ext >&5 fi rm -f conftest* conftst* # Do not use the global_symbol_pipe unless it works. if test "$pipe_works" = yes; then break else lt_cv_sys_global_symbol_pipe= fi done ]) if test -z "$lt_cv_sys_global_symbol_pipe"; then lt_cv_sys_global_symbol_to_cdecl= fi if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then AC_MSG_RESULT(failed) else AC_MSG_RESULT(ok) fi ]) # AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE # AC_LIBTOOL_PROG_COMPILER_PIC([TAGNAME]) # --------------------------------------- AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC], [_LT_AC_TAGVAR(lt_prog_compiler_wl, $1)= _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= _LT_AC_TAGVAR(lt_prog_compiler_static, $1)= AC_MSG_CHECKING([for $compiler option to produce PIC]) ifelse([$1],[CXX],[ # C++ specific cases for pic, static, wl, etc. if test "$GXX" = yes; then _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; amigaos*) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' ;; beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | os2* | pw32*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT' ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' ;; *djgpp*) # DJGPP does not support shared libraries at all _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= ;; sysv4*MP*) if test -d /usr/nec; then _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic fi ;; hpux*) # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case "$host_cpu" in hppa*64*|ia64*) ;; *) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac ;; *) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac else case $host_os in aix4* | aix5*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' else _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' fi ;; chorus*) case $cc_basename in cxch68) # Green Hills C++ Compiler # _LT_AC_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" ;; esac ;; dgux*) case $cc_basename in ec++) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' ;; ghcx) # Green Hills C++ Compiler _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; *) ;; esac ;; freebsd* | kfreebsd*-gnu) # FreeBSD uses GNU C++ ;; hpux9* | hpux10* | hpux11*) case $cc_basename in CC) _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)="${ac_cv_prog_cc_wl}-a ${ac_cv_prog_cc_wl}archive" if test "$host_cpu" != ia64; then _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z' fi ;; aCC) _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)="${ac_cv_prog_cc_wl}-a ${ac_cv_prog_cc_wl}archive" case "$host_cpu" in hppa*64*|ia64*) # +Z the default ;; *) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z' ;; esac ;; *) ;; esac ;; irix5* | irix6* | nonstopux*) case $cc_basename in CC) _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' # CC pic flag -KPIC is the default. ;; *) ;; esac ;; linux*) case $cc_basename in KCC) # KAI C++ Compiler _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; icpc) # Intel C++ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; cxx) # Compaq C++ # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; *) ;; esac ;; lynxos*) ;; m88k*) ;; mvs*) case $cc_basename in cxx) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall' ;; *) ;; esac ;; netbsd*) ;; osf3* | osf4* | osf5*) case $cc_basename in KCC) _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' ;; RCC) # Rational C++ 2.4.1 _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; cxx) # Digital/Compaq C++ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; *) ;; esac ;; psos*) ;; sco*) case $cc_basename in CC) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; *) ;; esac ;; solaris*) case $cc_basename in CC) # Sun C++ 4.2, 5.x and Centerline C++ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; gcx) # Green Hills C++ Compiler _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' ;; *) ;; esac ;; sunos4*) case $cc_basename in CC) # Sun C++ 4.x _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; lcc) # Lucid _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; *) ;; esac ;; tandem*) case $cc_basename in NCC) # NonStop-UX NCC 3.20 _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' ;; *) ;; esac ;; unixware*) ;; vxworks*) ;; *) _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; esac fi ], [ if test "$GCC" = yes; then _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; amigaos*) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' ;; beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | pw32* | os2*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT' ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' ;; msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no enable_shared=no ;; sysv4*MP*) if test -d /usr/nec; then _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic fi ;; hpux*) # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case "$host_cpu" in hppa*64*|ia64*) # +Z the default ;; *) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac ;; *) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in aix*) _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' else _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' fi ;; mingw* | pw32* | os2*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT' ;; hpux9* | hpux10* | hpux11*) _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case "$host_cpu" in hppa*64*|ia64*) # +Z the default ;; *) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z' ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # PIC (with -KPIC) is the default. _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; newsos6) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; linux*) case $CC in icc* | ecc*) _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; ccc*) _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # All Alpha code is PIC. _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; esac ;; osf3* | osf4* | osf5*) _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # All OSF/1 code is PIC. _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; sco3.2v5*) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-Kpic' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-dn' ;; solaris*) _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; sunos4*) _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec ;then _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; uts4*) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; *) _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; esac fi ]) AC_MSG_RESULT([$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)]) # # Check to make sure the PIC flag actually works. # if test -n "$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)"; then AC_LIBTOOL_COMPILER_OPTION([if $compiler PIC flag $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) works], _LT_AC_TAGVAR(lt_prog_compiler_pic_works, $1), [$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)ifelse([$1],[],[ -DPIC],[ifelse([$1],[CXX],[ -DPIC],[])])], [], [case $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) in "" | " "*) ;; *) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)" ;; esac], [_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no]) fi case "$host_os" in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= ;; *) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)ifelse([$1],[],[ -DPIC],[ifelse([$1],[CXX],[ -DPIC],[])])" ;; esac ]) # AC_LIBTOOL_PROG_LD_SHLIBS([TAGNAME]) # ------------------------------------ # See if the linker supports building shared libraries. AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS], [AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) ifelse([$1],[CXX],[ _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' case $host_os in aix4* | aix5*) # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm if $NM -V 2>&1 | grep 'GNU' > /dev/null; then _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols' else _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols' fi ;; pw32*) _LT_AC_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds" ;; cygwin* | mingw*) _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGS]] /s/.* \([[^ ]]*\)/\1 DATA/'\'' | $SED -e '\''/^[[AITW]] /s/.* //'\'' | sort | uniq > $export_symbols' ;; *) _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' ;; esac ],[ runpath_var= _LT_AC_TAGVAR(allow_undefined_flag, $1)= _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=no _LT_AC_TAGVAR(archive_cmds, $1)= _LT_AC_TAGVAR(archive_expsym_cmds, $1)= _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)= _LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1)= _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)= _LT_AC_TAGVAR(whole_archive_flag_spec, $1)= _LT_AC_TAGVAR(thread_safe_flag_spec, $1)= _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= _LT_AC_TAGVAR(hardcode_libdir_separator, $1)= _LT_AC_TAGVAR(hardcode_direct, $1)=no _LT_AC_TAGVAR(hardcode_minus_L, $1)=no _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported _LT_AC_TAGVAR(link_all_deplibs, $1)=unknown _LT_AC_TAGVAR(hardcode_automatic, $1)=no _LT_AC_TAGVAR(module_cmds, $1)= _LT_AC_TAGVAR(module_expsym_cmds, $1)= _LT_AC_TAGVAR(always_export_symbols, $1)=no _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' # include_expsyms should be a list of space-separated symbols to be *always* # included in the symbol list _LT_AC_TAGVAR(include_expsyms, $1)= # exclude_expsyms can be an extended regexp of symbols to exclude # it will be wrapped by ` (' and `)$', so one must not match beginning or # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', # as well as any symbol that contains `d'. _LT_AC_TAGVAR(exclude_expsyms, $1)="_GLOBAL_OFFSET_TABLE_" # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out # platforms (ab)use it in PIC code, but their linkers get confused if # the symbol is explicitly referenced. Since portable code cannot # rely on this symbol name, it's probably fine to never include it in # preloaded symbol tables. extract_expsyms_cmds= case $host_os in cygwin* | mingw* | pw32*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test "$GCC" != yes; then with_gnu_ld=no fi ;; openbsd*) with_gnu_ld=no ;; esac _LT_AC_TAGVAR(ld_shlibs, $1)=yes if test "$with_gnu_ld" = yes; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='${wl}' # See if GNU ld supports shared libraries. case $host_os in aix3* | aix4* | aix5*) # On AIX/PPC, the GNU linker is very broken if test "$host_cpu" != ia64; then _LT_AC_TAGVAR(ld_shlibs, $1)=no cat <&2 *** Warning: the GNU linker, at least up to release 2.9.1, is reported *** to be unable to reliably create shared libraries on AIX. *** Therefore, libtool is disabling shared libraries support. If you *** really care for shared libraries, you may want to modify your PATH *** so that a non-GNU linker is found, and then restart. EOF fi ;; amigaos*) _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes # Samuel A. Falvo II reports # that the semantics of dynamic libraries on AmigaOS, at least up # to version 4, is to share data among multiple programs linked # with the same dynamic library. Since this doesn't match the # behavior of shared libraries on other platforms, we can't use # them. _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; beos*) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME _LT_AC_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else _LT_AC_TAGVAR(ld_shlibs, $1)=no fi ;; cygwin* | mingw* | pw32*) # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, # as there is no search path for DLLs. _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_AC_TAGVAR(always_export_symbols, $1)=no _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGS]] /s/.* \([[^ ]]*\)/\1 DATA/'\'' | $SED -e '\''/^[[AITW]] /s/.* //'\'' | sort | uniq > $export_symbols' if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... _LT_AC_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' else ld_shlibs=no fi ;; netbsd*) if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' fi ;; solaris* | sysv5*) if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then _LT_AC_TAGVAR(ld_shlibs, $1)=no cat <&2 *** Warning: The releases 2.8.* of the GNU linker cannot reliably *** create shared libraries on Solaris systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.9.1 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. EOF elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else _LT_AC_TAGVAR(ld_shlibs, $1)=no fi ;; sunos4*) _LT_AC_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= _LT_AC_TAGVAR(hardcode_direct, $1)=yes _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ;; linux*) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then tmp_archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_AC_TAGVAR(archive_cmds, $1)="$tmp_archive_cmds" supports_anon_versioning=no case `$LD -v 2>/dev/null` in *\ [01].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... *\ 2.11.*) ;; # other 2.11 versions *) supports_anon_versioning=yes ;; esac if test $supports_anon_versioning = yes; then _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ $echo "local: *; };" >> $output_objdir/$libname.ver~ $CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' else _LT_AC_TAGVAR(archive_expsym_cmds, $1)="$tmp_archive_cmds" fi else _LT_AC_TAGVAR(ld_shlibs, $1)=no fi ;; *) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else _LT_AC_TAGVAR(ld_shlibs, $1)=no fi ;; esac if test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = yes; then runpath_var=LD_RUN_PATH _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' # ancient GNU ld didn't support --whole-archive et. al. if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then _LT_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else _LT_AC_TAGVAR(whole_archive_flag_spec, $1)= fi fi else # PORTME fill in a description of your system's linker (not GNU ld) case $host_os in aix3*) _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_AC_TAGVAR(always_export_symbols, $1)=yes _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes if test "$GCC" = yes && test -z "$link_static_flag"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. _LT_AC_TAGVAR(hardcode_direct, $1)=unsupported fi ;; aix4* | aix5*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm if $NM -V 2>&1 | grep 'GNU' > /dev/null; then _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols' else _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols' fi aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[[23]]|aix4.[[23]].*|aix5*) for ld_flag in $LDFLAGS; do if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then aix_use_runtimelinking=yes break fi done esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. _LT_AC_TAGVAR(archive_cmds, $1)='' _LT_AC_TAGVAR(hardcode_direct, $1)=yes _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_AC_TAGVAR(link_all_deplibs, $1)=yes if test "$GCC" = yes; then case $host_os in aix4.[012]|aix4.[012].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && \ strings "$collect2name" | grep resolve_lib_name >/dev/null then # We have reworked collect2 _LT_AC_TAGVAR(hardcode_direct, $1)=yes else # We have old collect2 _LT_AC_TAGVAR(hardcode_direct, $1)=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)= fi esac shared_flag='-shared' else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. _LT_AC_TAGVAR(always_export_symbols, $1)=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. _LT_AC_TAGVAR(allow_undefined_flag, $1)='-berok' # Determine the default libpath from the value encoded in an empty executable. _LT_AC_SYS_LIBPATH_AIX _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' _LT_AC_TAGVAR(allow_undefined_flag, $1)="-z nodefs" _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an empty executable. _LT_AC_SYS_LIBPATH_AIX _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. _LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' # -bexpall does not export symbols beginning with underscore (_) _LT_AC_TAGVAR(always_export_symbols, $1)=yes # Exported symbols can be pulled into shared objects from archives _LT_AC_TAGVAR(whole_archive_flag_spec, $1)=' ' _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes # This is similar to how AIX traditionally builds it's shared libraries. _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}-bE:$export_symbols ${wl}-bnoentry${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; amigaos*) _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes # see comment about different semantics on the GNU ld section _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; bsdi4*) _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic ;; cygwin* | mingw* | pw32*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. _LT_AC_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames=' # The linker will automatically build a .lib file if we build a DLL. _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)='true' # FIXME: Should let the user specify the lib program. _LT_AC_TAGVAR(old_archive_cmds, $1)='lib /OUT:$oldlib$oldobjs$old_deplibs' fix_srcfile_path='`cygpath -w "$srcfile"`' _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes ;; darwin* | rhapsody*) if test "$GXX" = yes ; then _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no case "$host_os" in rhapsody* | darwin1.[[012]]) _LT_AC_TAGVAR(allow_undefined_flag, $1)='-undefined suppress' ;; *) # Darwin 1.3 on if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then _LT_AC_TAGVAR(allow_undefined_flag, $1)='-flat_namespace -undefined suppress' else case ${MACOSX_DEPLOYMENT_TARGET} in 10.[[012]]) _LT_AC_TAGVAR(allow_undefined_flag, $1)='-flat_namespace -undefined suppress' ;; 10.*) _LT_AC_TAGVAR(allow_undefined_flag, $1)='-undefined dynamic_lookup' ;; esac fi ;; esac lt_int_apple_cc_single_mod=no output_verbose_link_cmd='echo' if $CC -dumpspecs 2>&1 | grep 'single_module' >/dev/null ; then lt_int_apple_cc_single_mod=yes fi if test "X$lt_int_apple_cc_single_mod" = Xyes ; then _LT_AC_TAGVAR(archive_cmds, $1)='$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' else _LT_AC_TAGVAR(archive_cmds, $1)='$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring' fi _LT_AC_TAGVAR(module_cmds, $1)='$CC ${wl}-bind_at_load $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's if test "X$lt_int_apple_cc_single_mod" = Xyes ; then _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' else _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' fi _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' _LT_AC_TAGVAR(hardcode_direct, $1)=no _LT_AC_TAGVAR(hardcode_automatic, $1)=yes _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='-all_load $convenience' _LT_AC_TAGVAR(link_all_deplibs, $1)=yes else _LT_AC_TAGVAR(ld_shlibs, $1)=no fi ;; dgux*) _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ;; freebsd1*) _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor # support. Future versions do this automatically, but an explicit c++rt0.o # does not break anything, and helps significantly (at the cost of a little # extra space). freebsd2.2*) _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_AC_TAGVAR(hardcode_direct, $1)=yes _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # Unfortunately, older versions of FreeBSD 2 do not have this feature. freebsd2*) _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' _LT_AC_TAGVAR(hardcode_direct, $1)=yes _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. freebsd* | kfreebsd*-gnu) _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_AC_TAGVAR(hardcode_direct, $1)=yes _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ;; hpux9*) if test "$GCC" = yes; then _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' fi _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: _LT_AC_TAGVAR(hardcode_direct, $1)=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' ;; hpux10* | hpux11*) if test "$GCC" = yes -a "$with_gnu_ld" = no; then case "$host_cpu" in hppa*64*|ia64*) _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; *) _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else case "$host_cpu" in hppa*64*|ia64*) _LT_AC_TAGVAR(archive_cmds, $1)='$LD -b +h $soname -o $lib $libobjs $deplibs $linker_flags' ;; *) _LT_AC_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' ;; esac fi if test "$with_gnu_ld" = no; then case "$host_cpu" in hppa*64*) _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='+b $libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: _LT_AC_TAGVAR(hardcode_direct, $1)=no _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ;; ia64*) _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_AC_TAGVAR(hardcode_direct, $1)=no _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes ;; *) _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: _LT_AC_TAGVAR(hardcode_direct, $1)=yes _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) if test "$GCC" = yes; then _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='-rpath $libdir' fi _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: _LT_AC_TAGVAR(link_all_deplibs, $1)=yes ;; netbsd*) if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF fi _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_AC_TAGVAR(hardcode_direct, $1)=yes _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ;; newsos6) _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_AC_TAGVAR(hardcode_direct, $1)=yes _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ;; openbsd*) _LT_AC_TAGVAR(hardcode_direct, $1)=yes _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' else case $host_os in openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*) _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' ;; *) _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' ;; esac fi ;; os2*) _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_AC_TAGVAR(archive_cmds, $1)='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' ;; osf3*) if test "$GCC" = yes; then _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else _LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' fi _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: ;; osf4* | osf5*) # as osf3* with the addition of -msym flag if test "$GCC" = yes; then _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' else _LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~ $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib~$rm $lib.exp' # Both c and cxx compiler support -rpath directly _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' fi _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: ;; sco3.2v5*) _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' runpath_var=LD_RUN_PATH hardcode_runpath_var=yes ;; solaris*) _LT_AC_TAGVAR(no_undefined_flag, $1)=' -z text' if test "$GCC" = yes; then _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp' else _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' fi _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) # Supported since Solaris 2.6 (maybe 2.5.1?) _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' ;; esac _LT_AC_TAGVAR(link_all_deplibs, $1)=yes ;; sunos4*) if test "x$host_vendor" = xsequent; then # Use $CC to link under sequent, because it throws in some extra .o # files that make .init and .fini sections work. _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_AC_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' fi _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_AC_TAGVAR(hardcode_direct, $1)=yes _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ;; sysv4) case $host_vendor in sni) _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_AC_TAGVAR(hardcode_direct, $1)=yes # is this really true??? ;; siemens) ## LD is ld it makes a PLAMLIB ## CC just makes a GrossModule. _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' _LT_AC_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs' _LT_AC_TAGVAR(hardcode_direct, $1)=no ;; motorola) _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_AC_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie ;; esac runpath_var='LD_RUN_PATH' _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ;; sysv4.3*) _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport' ;; sysv4*MP*) if test -d /usr/nec; then _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var=LD_RUN_PATH hardcode_runpath_var=yes _LT_AC_TAGVAR(ld_shlibs, $1)=yes fi ;; sysv4.2uw2*) _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' _LT_AC_TAGVAR(hardcode_direct, $1)=yes _LT_AC_TAGVAR(hardcode_minus_L, $1)=no _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no hardcode_runpath_var=yes runpath_var=LD_RUN_PATH ;; sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[[78]]* | unixware7*) _LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z ${wl}text' if test "$GCC" = yes; then _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' fi runpath_var='LD_RUN_PATH' _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ;; sysv5*) _LT_AC_TAGVAR(no_undefined_flag, $1)=' -z text' # $CC -shared without GNU ld will not create a library from C++ # object files and a static libstdc++, better avoid it by now _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var='LD_RUN_PATH' ;; uts4*) _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; esac fi ]) AC_MSG_RESULT([$_LT_AC_TAGVAR(ld_shlibs, $1)]) test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi # # Do we need to explicitly link libc? # case "x$_LT_AC_TAGVAR(archive_cmds_need_lc, $1)" in x|xyes) # Assume -lc should be added _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes if test "$enable_shared" = yes && test "$GCC" = yes; then case $_LT_AC_TAGVAR(archive_cmds, $1) in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. AC_MSG_CHECKING([whether -lc should be explicitly linked in]) $rm conftest* printf "$lt_simple_compile_test_code" > conftest.$ac_ext if AC_TRY_EVAL(ac_compile) 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$_LT_AC_TAGVAR(lt_prog_compiler_wl, $1) compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$_LT_AC_TAGVAR(allow_undefined_flag, $1) _LT_AC_TAGVAR(allow_undefined_flag, $1)= if AC_TRY_EVAL(_LT_AC_TAGVAR(archive_cmds, $1) 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) then _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no else _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes fi _LT_AC_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $rm conftest* AC_MSG_RESULT([$_LT_AC_TAGVAR(archive_cmds_need_lc, $1)]) ;; esac fi ;; esac ])# AC_LIBTOOL_PROG_LD_SHLIBS # _LT_AC_FILE_LTDLL_C # ------------------- # Be careful that the start marker always follows a newline. AC_DEFUN([_LT_AC_FILE_LTDLL_C], [ # /* ltdll.c starts here */ # #define WIN32_LEAN_AND_MEAN # #include # #undef WIN32_LEAN_AND_MEAN # #include # # #ifndef __CYGWIN__ # # ifdef __CYGWIN32__ # # define __CYGWIN__ __CYGWIN32__ # # endif # #endif # # #ifdef __cplusplus # extern "C" { # #endif # BOOL APIENTRY DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved); # #ifdef __cplusplus # } # #endif # # #ifdef __CYGWIN__ # #include # DECLARE_CYGWIN_DLL( DllMain ); # #endif # HINSTANCE __hDllInstance_base; # # BOOL APIENTRY # DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved) # { # __hDllInstance_base = hInst; # return TRUE; # } # /* ltdll.c ends here */ ])# _LT_AC_FILE_LTDLL_C # _LT_AC_TAGVAR(VARNAME, [TAGNAME]) # --------------------------------- AC_DEFUN([_LT_AC_TAGVAR], [ifelse([$2], [], [$1], [$1_$2])]) # old names AC_DEFUN([AM_PROG_LIBTOOL], [AC_PROG_LIBTOOL]) AC_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)]) AC_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)]) AC_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)]) AC_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)]) AC_DEFUN([AM_PROG_LD], [AC_PROG_LD]) AC_DEFUN([AM_PROG_NM], [AC_PROG_NM]) # This is just to silence aclocal about the macro not being used ifelse([AC_DISABLE_FAST_INSTALL]) AC_DEFUN([LT_AC_PROG_GCJ], [AC_CHECK_TOOL(GCJ, gcj, no) test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2" AC_SUBST(GCJFLAGS) ]) AC_DEFUN([LT_AC_PROG_RC], [AC_CHECK_TOOL(RC, windres, no) ]) # NOTE: This macro has been submitted for inclusion into # # GNU Autoconf as AC_PROG_SED. When it is available in # # a released version of Autoconf we should remove this # # macro and use it instead. # # LT_AC_PROG_SED # -------------- # Check for a fully-functional sed program, that truncates # as few characters as possible. Prefer GNU sed if found. AC_DEFUN([LT_AC_PROG_SED], [AC_MSG_CHECKING([for a sed that does not truncate output]) AC_CACHE_VAL(lt_cv_path_SED, [# Loop through the user's path and test for sed and gsed. # Then use that list of sed's as ones to test for truncation. as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for lt_ac_prog in sed gsed; do for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" fi done done done lt_ac_max=0 lt_ac_count=0 # Add /usr/xpg4/bin/sed as it is typically found on Solaris # along with /bin/sed that truncates output. for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do test ! -f $lt_ac_sed && break cat /dev/null > conftest.in lt_ac_count=0 echo $ECHO_N "0123456789$ECHO_C" >conftest.in # Check for GNU sed and select it if it is found. if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then lt_cv_path_SED=$lt_ac_sed break fi while true; do cat conftest.in conftest.in >conftest.tmp mv conftest.tmp conftest.in cp conftest.in conftest.nl echo >>conftest.nl $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break cmp -s conftest.out conftest.nl || break # 10000 chars as input seems more than enough test $lt_ac_count -gt 10 && break lt_ac_count=`expr $lt_ac_count + 1` if test $lt_ac_count -gt $lt_ac_max; then lt_ac_max=$lt_ac_count lt_cv_path_SED=$lt_ac_sed fi done done SED=$lt_cv_path_SED ]) AC_MSG_RESULT([$SED]) ]) # -*- Autoconf -*- # Copyright (C) 2002, 2003 Free Software Foundation, Inc. # Generated from amversion.in; do not edit by hand. # 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, 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 # AM_AUTOMAKE_VERSION(VERSION) # ---------------------------- # Automake X.Y traces this macro to ensure aclocal.m4 has been # generated from the m4 files accompanying Automake X.Y. AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version="1.8"]) # AM_SET_CURRENT_AUTOMAKE_VERSION # ------------------------------- # Call AM_AUTOMAKE_VERSION so it can be traced. # This function is AC_REQUIREd by AC_INIT_AUTOMAKE. AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], [AM_AUTOMAKE_VERSION([1.8.3])]) # AM_AUX_DIR_EXPAND # Copyright (C) 2001, 2003 Free Software Foundation, Inc. # 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, 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. # For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets # $ac_aux_dir to `$srcdir/foo'. In other projects, it is set to # `$srcdir', `$srcdir/..', or `$srcdir/../..'. # # Of course, Automake must honor this variable whenever it calls a # tool from the auxiliary directory. The problem is that $srcdir (and # therefore $ac_aux_dir as well) can be either absolute or relative, # depending on how configure is run. This is pretty annoying, since # it makes $ac_aux_dir quite unusable in subdirectories: in the top # source directory, any form will work fine, but in subdirectories a # relative path needs to be adjusted first. # # $ac_aux_dir/missing # fails when called from a subdirectory if $ac_aux_dir is relative # $top_srcdir/$ac_aux_dir/missing # fails if $ac_aux_dir is absolute, # fails when called from a subdirectory in a VPATH build with # a relative $ac_aux_dir # # The reason of the latter failure is that $top_srcdir and $ac_aux_dir # are both prefixed by $srcdir. In an in-source build this is usually # harmless because $srcdir is `.', but things will broke when you # start a VPATH build or use an absolute $srcdir. # # So we could use something similar to $top_srcdir/$ac_aux_dir/missing, # iff we strip the leading $srcdir from $ac_aux_dir. That would be: # am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` # and then we would define $MISSING as # MISSING="\${SHELL} $am_aux_dir/missing" # This will work as long as MISSING is not called from configure, because # unfortunately $(top_srcdir) has no meaning in configure. # However there are other variables, like CC, which are often used in # configure, and could therefore not use this "fixed" $ac_aux_dir. # # Another solution, used here, is to always expand $ac_aux_dir to an # absolute PATH. The drawback is that using absolute paths prevent a # configured tree to be moved without reconfiguration. AC_DEFUN([AM_AUX_DIR_EXPAND], [dnl Rely on autoconf to set up CDPATH properly. AC_PREREQ([2.50])dnl # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` ]) # AM_CONDITIONAL -*- Autoconf -*- # Copyright (C) 1997, 2000, 2001, 2003 Free Software Foundation, Inc. # 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, 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. # serial 6 # AM_CONDITIONAL(NAME, SHELL-CONDITION) # ------------------------------------- # Define a conditional. AC_DEFUN([AM_CONDITIONAL], [AC_PREREQ(2.52)dnl ifelse([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl AC_SUBST([$1_TRUE]) AC_SUBST([$1_FALSE]) if $2; then $1_TRUE= $1_FALSE='#' else $1_TRUE='#' $1_FALSE= fi AC_CONFIG_COMMANDS_PRE( [if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then AC_MSG_ERROR([conditional "$1" was never defined. Usually this means the macro was only invoked conditionally.]) fi])]) # serial 7 -*- Autoconf -*- # Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004 # Free Software Foundation, Inc. # 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, 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. # There are a few dirty hacks below to avoid letting `AC_PROG_CC' be # written in clear, in which case automake, when reading aclocal.m4, # will think it sees a *use*, and therefore will trigger all it's # C support machinery. Also note that it means that autoscan, seeing # CC etc. in the Makefile, will ask for an AC_PROG_CC use... # _AM_DEPENDENCIES(NAME) # ---------------------- # See how the compiler implements dependency checking. # NAME is "CC", "CXX", "GCJ", or "OBJC". # We try a few techniques and use that to set a single cache variable. # # We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was # modified to invoke _AM_DEPENDENCIES(CC); we would have a circular # dependency, and given that the user is not expected to run this macro, # just rely on AC_PROG_CC. AC_DEFUN([_AM_DEPENDENCIES], [AC_REQUIRE([AM_SET_DEPDIR])dnl AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl AC_REQUIRE([AM_MAKE_INCLUDE])dnl AC_REQUIRE([AM_DEP_TRACK])dnl ifelse([$1], CC, [depcc="$CC" am_compiler_list=], [$1], CXX, [depcc="$CXX" am_compiler_list=], [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'], [$1], GCJ, [depcc="$GCJ" am_compiler_list='gcc3 gcc'], [depcc="$$1" am_compiler_list=]) AC_CACHE_CHECK([dependency style of $depcc], [am_cv_$1_dependencies_compiler_type], [if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named `D' -- because `-MD' means `put the output # in D'. mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_$1_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` fi for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with # Solaris 8's {/usr,}/bin/sh. touch sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf case $depmode in nosideeffect) # after this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; none) break ;; esac # We check with `-c' and `-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle `-M -o', and we need to detect this. if depmode=$depmode \ source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # (even with -Werror). So we grep stderr for any message # that says an option was ignored. if grep 'ignoring option' conftest.err >/dev/null 2>&1; then :; else am_cv_$1_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_$1_dependencies_compiler_type=none fi ]) AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) AM_CONDITIONAL([am__fastdep$1], [ test "x$enable_dependency_tracking" != xno \ && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) ]) # AM_SET_DEPDIR # ------------- # Choose a directory name for dependency files. # This macro is AC_REQUIREd in _AM_DEPENDENCIES AC_DEFUN([AM_SET_DEPDIR], [AC_REQUIRE([AM_SET_LEADING_DOT])dnl AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl ]) # AM_DEP_TRACK # ------------ AC_DEFUN([AM_DEP_TRACK], [AC_ARG_ENABLE(dependency-tracking, [ --disable-dependency-tracking speeds up one-time build --enable-dependency-tracking do not reject slow dependency extractors]) if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' fi AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) AC_SUBST([AMDEPBACKSLASH]) ]) # Generate code to set up dependency tracking. -*- Autoconf -*- # Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc. # 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, 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. #serial 2 # _AM_OUTPUT_DEPENDENCY_COMMANDS # ------------------------------ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], [for mf in $CONFIG_FILES; do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named `Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # So let's grep whole file. if grep '^#.*generated by automake' $mf > /dev/null 2>&1; then dirpart=`AS_DIRNAME("$mf")` else continue fi grep '^DEP_FILES *= *[[^ @%:@]]' < "$mf" > /dev/null || continue # Extract the definition of DEP_FILES from the Makefile without # running `make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue # When using ansi2knr, U may be empty or an underscore; expand it U=`sed -n 's/^U = //p' < "$mf"` test -d "$dirpart/$DEPDIR" || mkdir "$dirpart/$DEPDIR" # We invoke sed twice because it is the simplest approach to # changing $(DEPDIR) to its actual value in the expansion. for file in `sed -n ' /^DEP_FILES = .*\\\\$/ { s/^DEP_FILES = // :loop s/\\\\$// p n /\\\\$/ b loop p } /^DEP_FILES = / s/^DEP_FILES = //p' < "$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`AS_DIRNAME(["$file"])` AS_MKDIR_P([$dirpart/$fdir]) # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done ])# _AM_OUTPUT_DEPENDENCY_COMMANDS # AM_OUTPUT_DEPENDENCY_COMMANDS # ----------------------------- # This macro should only be invoked once -- use via AC_REQUIRE. # # This code is only required when automatic dependency tracking # is enabled. FIXME. This creates each `.P' file that we will # need in order to bootstrap the dependency handling code. AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], [AC_CONFIG_COMMANDS([depfiles], [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) ]) # Do all the work for Automake. -*- Autoconf -*- # This macro actually does too much some checks are only needed if # your package does certain things. But this isn't really a big deal. # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003 # Free Software Foundation, Inc. # 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, 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. # serial 11 # AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) # AM_INIT_AUTOMAKE([OPTIONS]) # ----------------------------------------------- # The call with PACKAGE and VERSION arguments is the old style # call (pre autoconf-2.50), which is being phased out. PACKAGE # and VERSION should now be passed to AC_INIT and removed from # the call to AM_INIT_AUTOMAKE. # We support both call styles for the transition. After # the next Automake release, Autoconf can make the AC_INIT # arguments mandatory, and then we can depend on a new Autoconf # release and drop the old call support. AC_DEFUN([AM_INIT_AUTOMAKE], [AC_PREREQ([2.58])dnl dnl Autoconf wants to disallow AM_ names. We explicitly allow dnl the ones we care about. m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl AC_REQUIRE([AC_PROG_INSTALL])dnl # test to see if srcdir already configured if test "`cd $srcdir && pwd`" != "`pwd`" && test -f $srcdir/config.status; then AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi AC_SUBST([CYGPATH_W]) # Define the identity of the package. dnl Distinguish between old-style and new-style calls. m4_ifval([$2], [m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl AC_SUBST([PACKAGE], [$1])dnl AC_SUBST([VERSION], [$2])], [_AM_SET_OPTIONS([$1])dnl AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl _AM_IF_OPTION([no-define],, [AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package]) AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl # Some tools Automake needs. AC_REQUIRE([AM_SANITY_CHECK])dnl AC_REQUIRE([AC_ARG_PROGRAM])dnl AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version}) AM_MISSING_PROG(AUTOCONF, autoconf) AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version}) AM_MISSING_PROG(AUTOHEADER, autoheader) AM_MISSING_PROG(MAKEINFO, makeinfo) AM_MISSING_PROG(AMTAR, tar) AM_PROG_INSTALL_SH AM_PROG_INSTALL_STRIP AC_REQUIRE([AM_PROG_MKDIR_P])dnl # We need awk for the "check" target. The system "awk" is bad on # some platforms. AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AM_SET_LEADING_DOT])dnl _AM_IF_OPTION([no-dependencies],, [AC_PROVIDE_IFELSE([AC_PROG_CC], [_AM_DEPENDENCIES(CC)], [define([AC_PROG_CC], defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl AC_PROVIDE_IFELSE([AC_PROG_CXX], [_AM_DEPENDENCIES(CXX)], [define([AC_PROG_CXX], defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl ]) ]) # When config.status generates a header, we must update the stamp-h file. # This file resides in the same directory as the config header # that is generated. The stamp files are numbered to have different names. # Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the # loop where config.status creates the headers, so we can generate # our stamp files there. AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], [# Compute $1's index in $config_headers. _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $1 | $1:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $1" >`AS_DIRNAME([$1])`/stamp-h[]$_am_stamp_count]) # AM_PROG_INSTALL_SH # ------------------ # Define $install_sh. # Copyright (C) 2001, 2003 Free Software Foundation, Inc. # 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, 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. AC_DEFUN([AM_PROG_INSTALL_SH], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl install_sh=${install_sh-"$am_aux_dir/install-sh"} AC_SUBST(install_sh)]) # -*- Autoconf -*- # Copyright (C) 2003 Free Software Foundation, Inc. # 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, 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. # serial 1 # Check whether the underlying file-system supports filenames # with a leading dot. For instance MS-DOS doesn't. AC_DEFUN([AM_SET_LEADING_DOT], [rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null AC_SUBST([am__leading_dot])]) # Check to see how 'make' treats includes. -*- Autoconf -*- # Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc. # 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, 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. # serial 2 # AM_MAKE_INCLUDE() # ----------------- # Check to see how make treats includes. AC_DEFUN([AM_MAKE_INCLUDE], [am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo done .PHONY: am__doit END # If we don't find an include directive, just comment out the code. AC_MSG_CHECKING([for style of include used by $am_make]) am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # We grep out `Entering directory' and `Leaving directory' # messages which can occur if `w' ends up in MAKEFLAGS. # In particular we don't look at `^make:' because GNU make might # be invoked under some other name (usually "gmake"), in which # case it prints its new name instead of `make'. if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then am__include=include am__quote= _am_result=GNU fi # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then am__include=.include am__quote="\"" _am_result=BSD fi fi AC_SUBST([am__include]) AC_SUBST([am__quote]) AC_MSG_RESULT([$_am_result]) rm -f confinc confmf ]) # -*- Autoconf -*- # Copyright (C) 1997, 1999, 2000, 2001, 2003 Free Software Foundation, Inc. # 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, 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. # serial 3 # AM_MISSING_PROG(NAME, PROGRAM) # ------------------------------ AC_DEFUN([AM_MISSING_PROG], [AC_REQUIRE([AM_MISSING_HAS_RUN]) $1=${$1-"${am_missing_run}$2"} AC_SUBST($1)]) # AM_MISSING_HAS_RUN # ------------------ # Define MISSING if not defined so far and test if it supports --run. # If it does, set am_missing_run to use it, otherwise, to nothing. AC_DEFUN([AM_MISSING_HAS_RUN], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing" # Use eval to expand $SHELL if eval "$MISSING --run true"; then am_missing_run="$MISSING --run " else am_missing_run= AC_MSG_WARN([`missing' script is too old or missing]) fi ]) # AM_PROG_MKDIR_P # --------------- # Check whether `mkdir -p' is supported, fallback to mkinstalldirs otherwise. # Copyright (C) 2003, 2004 Free Software Foundation, Inc. # 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, 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. # Automake 1.8 used `mkdir -m 0755 -p --' to ensure that directories # created by `make install' are always world readable, even if the # installer happens to have an overly restrictive umask (e.g. 077). # This was a mistake. There are at least two reasons why we must not # use `-m 0755': # - it causes special bits like SGID to be ignored, # - it may be too restrictive (some setups expect 775 directories). # # Do not use -m 0755 and let people choose whatever they expect by # setting umask. # # We cannot accept any implementation of `mkdir' that recognizes `-p'. # Some implementations (such as Solaris 8's) are not thread-safe: if a # parallel make tries to run `mkdir -p a/b' and `mkdir -p a/c' # concurrently, both version can detect that a/ is missing, but only # one can create it and the other will error out. Consequently we # restrict ourselves to GNU make (using the --version option ensures # this.) AC_DEFUN([AM_PROG_MKDIR_P], [if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then # Keeping the `.' argument allows $(mkdir_p) to be used without # argument. Indeed, we sometimes output rules like # $(mkdir_p) $(somedir) # where $(somedir) is conditionally defined. # (`test -n '$(somedir)' && $(mkdir_p) $(somedir)' is a more # expensive solution, as it forces Make to start a sub-shell.) mkdir_p='mkdir -p -- .' else # On NextStep and OpenStep, the `mkdir' command does not # recognize any option. It will interpret all options as # directories to create, and then abort because `.' already # exists. for d in ./-p ./--version; do test -d $d && rmdir $d done # $(mkinstalldirs) is defined by Automake if mkinstalldirs exists. if test -f "$ac_aux_dir/mkinstalldirs"; then mkdir_p='$(mkinstalldirs)' else mkdir_p='$(install_sh) -d' fi fi AC_SUBST([mkdir_p])]) # Helper functions for option handling. -*- Autoconf -*- # Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc. # 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, 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. # serial 2 # _AM_MANGLE_OPTION(NAME) # ----------------------- AC_DEFUN([_AM_MANGLE_OPTION], [[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) # _AM_SET_OPTION(NAME) # ------------------------------ # Set option NAME. Presently that only means defining a flag for this option. AC_DEFUN([_AM_SET_OPTION], [m4_define(_AM_MANGLE_OPTION([$1]), 1)]) # _AM_SET_OPTIONS(OPTIONS) # ---------------------------------- # OPTIONS is a space-separated list of Automake options. AC_DEFUN([_AM_SET_OPTIONS], [AC_FOREACH([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) # _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) # ------------------------------------------- # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. AC_DEFUN([_AM_IF_OPTION], [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) # # Check to make sure that the build environment is sane. # # Copyright (C) 1996, 1997, 2000, 2001, 2003 Free Software Foundation, Inc. # 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, 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. # serial 3 # AM_SANITY_CHECK # --------------- AC_DEFUN([AM_SANITY_CHECK], [AC_MSG_CHECKING([whether build environment is sane]) # Just in case sleep 1 echo timestamp > conftest.file # Do `set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null` if test "$[*]" = "X"; then # -L didn't work. set X `ls -t $srcdir/configure conftest.file` fi rm -f conftest.file if test "$[*]" != "X $srcdir/configure conftest.file" \ && test "$[*]" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken alias in your environment]) fi test "$[2]" = conftest.file ) then # Ok. : else AC_MSG_ERROR([newly created file is older than distributed files! Check your system clock]) fi AC_MSG_RESULT(yes)]) # AM_PROG_INSTALL_STRIP # Copyright (C) 2001, 2003 Free Software Foundation, Inc. # 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, 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. # One issue with vendor `install' (even GNU) is that you can't # specify the program used to strip binaries. This is especially # annoying in cross-compiling environments, where the build's strip # is unlikely to handle the host's binaries. # Fortunately install-sh will honor a STRIPPROG variable, so we # always use install-sh in `make install-strip', and initialize # STRIPPROG with the value of the STRIP variable (set by the user). AC_DEFUN([AM_PROG_INSTALL_STRIP], [AC_REQUIRE([AM_PROG_INSTALL_SH])dnl # Installed binaries are usually stripped using `strip' when the user # run `make install-strip'. However `strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the `STRIP' environment variable to overrule this program. dnl Don't test for $cross_compiling = yes, because it might be `maybe'. if test "$cross_compiling" != no; then AC_CHECK_TOOL([STRIP], [strip], :) fi INSTALL_STRIP_PROGRAM="\${SHELL} \$(install_sh) -c -s" AC_SUBST([INSTALL_STRIP_PROGRAM])]) iaxmodem-1.2.0/lib/libiax2/config.sub0000755000175000017500000007460411150047225016746 0ustar julienjulien#! /bin/sh # Configuration validation subroutine script. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, # 2000, 2001, 2002, 2003 Free Software Foundation, Inc. timestamp='2004-02-23' # This file is (in principle) common to ALL GNU software. # The presence of a machine in this file suggests that SOME GNU software # can handle that machine. It does not imply ALL GNU software can. # # This file 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. # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Please send patches to . Submit a context # diff and a properly formatted ChangeLog entry. # # Configuration subroutine to validate and canonicalize a configuration type. # Supply the specified configuration type as an argument. # If it is invalid, we print an error message on stderr and exit with code 1. # Otherwise, we print the canonical config type on stdout and succeed. # This file is supposed to be the same for all GNU packages # and recognize all the CPU types, system types and aliases # that are meaningful with *any* GNU software. # Each package is responsible for reporting which valid configurations # it does not support. The user should be able to distinguish # a failure to support a valid configuration from a meaningless # configuration. # The goal of this file is to map all the various variations of a given # machine specification into a single specification in the form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or in some cases, the newer four-part form: # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # It is wrong to echo any other type of specification. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] CPU-MFR-OPSYS $0 [OPTION] ALIAS Canonicalize a configuration name. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.sub ($timestamp) Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit 0 ;; --version | -v ) echo "$version" ; exit 0 ;; --help | --h* | -h ) echo "$usage"; exit 0 ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" exit 1 ;; *local*) # First pass through any local machine types. echo $1 exit 0;; * ) break ;; esac done case $# in 0) echo "$me: missing argument$help" >&2 exit 1;; 1) ;; *) echo "$me: too many arguments$help" >&2 exit 1;; esac # Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). # Here we must recognize all the valid KERNEL-OS combinations. maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` case $maybe_os in nto-qnx* | linux-gnu* | linux-dietlibc | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | \ kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | storm-chaos* | os2-emx* | rtmk-nova*) os=-$maybe_os basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` ;; *) basic_machine=`echo $1 | sed 's/-[^-]*$//'` if [ $basic_machine != $1 ] then os=`echo $1 | sed 's/.*-/-/'` else os=; fi ;; esac ### Let's recognize common machines as not being operating systems so ### that things like config.sub decstation-3100 work. We also ### recognize some manufacturers as not being operating systems, so we ### can provide default operating systems below. case $os in -sun*os*) # Prevent following clause from handling this invalid input. ;; -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ -apple | -axis) os= basic_machine=$1 ;; -sim | -cisco | -oki | -wec | -winbond) os= basic_machine=$1 ;; -scout) ;; -wrs) os=-vxworks basic_machine=$1 ;; -chorusos*) os=-chorusos basic_machine=$1 ;; -chorusrdb) os=-chorusrdb basic_machine=$1 ;; -hiux*) os=-hiuxwe2 ;; -sco5) os=-sco3.2v5 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco4) os=-sco3.2v4 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2.[4-9]*) os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2v[4-9]*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco*) os=-sco3.2v2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -udk*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -isc) os=-isc2.2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -clix*) basic_machine=clipper-intergraph ;; -isc*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -lynx*) os=-lynxos ;; -ptx*) basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` ;; -windowsnt*) os=`echo $os | sed -e 's/windowsnt/winnt/'` ;; -psos*) os=-psos ;; -mint | -mint[0-9]*) basic_machine=m68k-atari os=-mint ;; esac # Decode aliases for certain CPU-COMPANY combinations. case $basic_machine in # Recognize the basic CPU types without company name. # Some are omitted here because they have special meanings below. 1750a | 580 \ | a29k \ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ | am33_2.0 \ | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr \ | c4x | clipper \ | d10v | d30v | dlx | dsp16xx \ | fr30 | frv \ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | i370 | i860 | i960 | ia64 \ | ip2k | iq2000 \ | m32r | m68000 | m68k | m88k | mcore \ | mips | mipsbe | mipseb | mipsel | mipsle \ | mips16 \ | mips64 | mips64el \ | mips64vr | mips64vrel \ | mips64orion | mips64orionel \ | mips64vr4100 | mips64vr4100el \ | mips64vr4300 | mips64vr4300el \ | mips64vr5000 | mips64vr5000el \ | mipsisa32 | mipsisa32el \ | mipsisa32r2 | mipsisa32r2el \ | mipsisa64 | mipsisa64el \ | mipsisa64r2 | mipsisa64r2el \ | mipsisa64sb1 | mipsisa64sb1el \ | mipsisa64sr71k | mipsisa64sr71kel \ | mipstx39 | mipstx39el \ | mn10200 | mn10300 \ | msp430 \ | ns16k | ns32k \ | openrisc | or32 \ | pdp10 | pdp11 | pj | pjl \ | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \ | pyramid \ | sh | sh[1234] | sh[23]e | sh[34]eb | shbe | shle | sh[1234]le | sh3ele \ | sh64 | sh64le \ | sparc | sparc64 | sparc86x | sparclet | sparclite | sparcv9 | sparcv9b \ | strongarm \ | tahoe | thumb | tic4x | tic80 | tron \ | v850 | v850e \ | we32k \ | x86 | xscale | xstormy16 | xtensa \ | z8k) basic_machine=$basic_machine-unknown ;; m6811 | m68hc11 | m6812 | m68hc12) # Motorola 68HC11/12. basic_machine=$basic_machine-unknown os=-none ;; m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) ;; # We use `pc' rather than `unknown' # because (1) that's what they normally are, and # (2) the word "unknown" tends to confuse beginning users. i*86 | x86_64) basic_machine=$basic_machine-pc ;; # Object if more than one company name word. *-*-*) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; # Recognize the basic CPU types with company name. 580-* \ | a29k-* \ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ | avr-* \ | bs2000-* \ | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \ | clipper-* | cydra-* \ | d10v-* | d30v-* | dlx-* \ | elxsi-* \ | f30[01]-* | f700-* | fr30-* | frv-* | fx80-* \ | h8300-* | h8500-* \ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ | i*86-* | i860-* | i960-* | ia64-* \ | ip2k-* | iq2000-* \ | m32r-* \ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ | m88110-* | m88k-* | mcore-* \ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ | mips16-* \ | mips64-* | mips64el-* \ | mips64vr-* | mips64vrel-* \ | mips64orion-* | mips64orionel-* \ | mips64vr4100-* | mips64vr4100el-* \ | mips64vr4300-* | mips64vr4300el-* \ | mips64vr5000-* | mips64vr5000el-* \ | mipsisa32-* | mipsisa32el-* \ | mipsisa32r2-* | mipsisa32r2el-* \ | mipsisa64-* | mipsisa64el-* \ | mipsisa64r2-* | mipsisa64r2el-* \ | mipsisa64sb1-* | mipsisa64sb1el-* \ | mipsisa64sr71k-* | mipsisa64sr71kel-* \ | mipstx39-* | mipstx39el-* \ | msp430-* \ | none-* | np1-* | nv1-* | ns16k-* | ns32k-* \ | orion-* \ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \ | pyramid-* \ | romp-* | rs6000-* \ | sh-* | sh[1234]-* | sh[23]e-* | sh[34]eb-* | shbe-* \ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ | sparc-* | sparc64-* | sparc86x-* | sparclet-* | sparclite-* \ | sparcv9-* | sparcv9b-* | strongarm-* | sv1-* | sx?-* \ | tahoe-* | thumb-* \ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ | tron-* \ | v850-* | v850e-* | vax-* \ | we32k-* \ | x86-* | x86_64-* | xps100-* | xscale-* | xstormy16-* \ | xtensa-* \ | ymp-* \ | z8k-*) ;; # Recognize the various machine names and aliases which stand # for a CPU type and a company and sometimes even an OS. 386bsd) basic_machine=i386-unknown os=-bsd ;; 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) basic_machine=m68000-att ;; 3b*) basic_machine=we32k-att ;; a29khif) basic_machine=a29k-amd os=-udi ;; abacus) basic_machine=abacus-unknown ;; adobe68k) basic_machine=m68010-adobe os=-scout ;; alliant | fx80) basic_machine=fx80-alliant ;; altos | altos3068) basic_machine=m68k-altos ;; am29k) basic_machine=a29k-none os=-bsd ;; amd64) basic_machine=x86_64-pc ;; amd64-*) basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; amdahl) basic_machine=580-amdahl os=-sysv ;; amiga | amiga-*) basic_machine=m68k-unknown ;; amigaos | amigados) basic_machine=m68k-unknown os=-amigaos ;; amigaunix | amix) basic_machine=m68k-unknown os=-sysv4 ;; apollo68) basic_machine=m68k-apollo os=-sysv ;; apollo68bsd) basic_machine=m68k-apollo os=-bsd ;; aux) basic_machine=m68k-apple os=-aux ;; balance) basic_machine=ns32k-sequent os=-dynix ;; c90) basic_machine=c90-cray os=-unicos ;; convex-c1) basic_machine=c1-convex os=-bsd ;; convex-c2) basic_machine=c2-convex os=-bsd ;; convex-c32) basic_machine=c32-convex os=-bsd ;; convex-c34) basic_machine=c34-convex os=-bsd ;; convex-c38) basic_machine=c38-convex os=-bsd ;; cray | j90) basic_machine=j90-cray os=-unicos ;; cr16c) basic_machine=cr16c-unknown os=-elf ;; crds | unos) basic_machine=m68k-crds ;; cris | cris-* | etrax*) basic_machine=cris-axis ;; crx) basic_machine=crx-unknown os=-elf ;; da30 | da30-*) basic_machine=m68k-da30 ;; decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) basic_machine=mips-dec ;; decsystem10* | dec10*) basic_machine=pdp10-dec os=-tops10 ;; decsystem20* | dec20*) basic_machine=pdp10-dec os=-tops20 ;; delta | 3300 | motorola-3300 | motorola-delta \ | 3300-motorola | delta-motorola) basic_machine=m68k-motorola ;; delta88) basic_machine=m88k-motorola os=-sysv3 ;; dpx20 | dpx20-*) basic_machine=rs6000-bull os=-bosx ;; dpx2* | dpx2*-bull) basic_machine=m68k-bull os=-sysv3 ;; ebmon29k) basic_machine=a29k-amd os=-ebmon ;; elxsi) basic_machine=elxsi-elxsi os=-bsd ;; encore | umax | mmax) basic_machine=ns32k-encore ;; es1800 | OSE68k | ose68k | ose | OSE) basic_machine=m68k-ericsson os=-ose ;; fx2800) basic_machine=i860-alliant ;; genix) basic_machine=ns32k-ns ;; gmicro) basic_machine=tron-gmicro os=-sysv ;; go32) basic_machine=i386-pc os=-go32 ;; h3050r* | hiux*) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; h8300hms) basic_machine=h8300-hitachi os=-hms ;; h8300xray) basic_machine=h8300-hitachi os=-xray ;; h8500hms) basic_machine=h8500-hitachi os=-hms ;; harris) basic_machine=m88k-harris os=-sysv3 ;; hp300-*) basic_machine=m68k-hp ;; hp300bsd) basic_machine=m68k-hp os=-bsd ;; hp300hpux) basic_machine=m68k-hp os=-hpux ;; hp3k9[0-9][0-9] | hp9[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k2[0-9][0-9] | hp9k31[0-9]) basic_machine=m68000-hp ;; hp9k3[2-9][0-9]) basic_machine=m68k-hp ;; hp9k6[0-9][0-9] | hp6[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k7[0-79][0-9] | hp7[0-79][0-9]) basic_machine=hppa1.1-hp ;; hp9k78[0-9] | hp78[0-9]) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[0-9][13679] | hp8[0-9][13679]) basic_machine=hppa1.1-hp ;; hp9k8[0-9][0-9] | hp8[0-9][0-9]) basic_machine=hppa1.0-hp ;; hppa-next) os=-nextstep3 ;; hppaosf) basic_machine=hppa1.1-hp os=-osf ;; hppro) basic_machine=hppa1.1-hp os=-proelf ;; i370-ibm* | ibm*) basic_machine=i370-ibm ;; # I'm not sure what "Sysv32" means. Should this be sysv3.2? i*86v32) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv32 ;; i*86v4*) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv4 ;; i*86v) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv ;; i*86sol2) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-solaris2 ;; i386mach) basic_machine=i386-mach os=-mach ;; i386-vsta | vsta) basic_machine=i386-unknown os=-vsta ;; iris | iris4d) basic_machine=mips-sgi case $os in -irix*) ;; *) os=-irix4 ;; esac ;; isi68 | isi) basic_machine=m68k-isi os=-sysv ;; m88k-omron*) basic_machine=m88k-omron ;; magnum | m3230) basic_machine=mips-mips os=-sysv ;; merlin) basic_machine=ns32k-utek os=-sysv ;; mingw32) basic_machine=i386-pc os=-mingw32 ;; miniframe) basic_machine=m68000-convergent ;; *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) basic_machine=m68k-atari os=-mint ;; mips3*-*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` ;; mips3*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown ;; mmix*) basic_machine=mmix-knuth os=-mmixware ;; monitor) basic_machine=m68k-rom68k os=-coff ;; morphos) basic_machine=powerpc-unknown os=-morphos ;; msdos) basic_machine=i386-pc os=-msdos ;; mvs) basic_machine=i370-ibm os=-mvs ;; ncr3000) basic_machine=i486-ncr os=-sysv4 ;; netbsd386) basic_machine=i386-unknown os=-netbsd ;; netwinder) basic_machine=armv4l-rebel os=-linux ;; news | news700 | news800 | news900) basic_machine=m68k-sony os=-newsos ;; news1000) basic_machine=m68030-sony os=-newsos ;; news-3600 | risc-news) basic_machine=mips-sony os=-newsos ;; necv70) basic_machine=v70-nec os=-sysv ;; next | m*-next ) basic_machine=m68k-next case $os in -nextstep* ) ;; -ns2*) os=-nextstep2 ;; *) os=-nextstep3 ;; esac ;; nh3000) basic_machine=m68k-harris os=-cxux ;; nh[45]000) basic_machine=m88k-harris os=-cxux ;; nindy960) basic_machine=i960-intel os=-nindy ;; mon960) basic_machine=i960-intel os=-mon960 ;; nonstopux) basic_machine=mips-compaq os=-nonstopux ;; np1) basic_machine=np1-gould ;; nv1) basic_machine=nv1-cray os=-unicosmp ;; nsr-tandem) basic_machine=nsr-tandem ;; op50n-* | op60c-*) basic_machine=hppa1.1-oki os=-proelf ;; or32 | or32-*) basic_machine=or32-unknown os=-coff ;; os400) basic_machine=powerpc-ibm os=-os400 ;; OSE68000 | ose68000) basic_machine=m68000-ericsson os=-ose ;; os68k) basic_machine=m68k-none os=-os68k ;; pa-hitachi) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; paragon) basic_machine=i860-intel os=-osf ;; pbd) basic_machine=sparc-tti ;; pbb) basic_machine=m68k-tti ;; pc532 | pc532-*) basic_machine=ns32k-pc532 ;; pentium | p5 | k5 | k6 | nexgen | viac3) basic_machine=i586-pc ;; pentiumpro | p6 | 6x86 | athlon | athlon_*) basic_machine=i686-pc ;; pentiumii | pentium2 | pentiumiii | pentium3) basic_machine=i686-pc ;; pentium4) basic_machine=i786-pc ;; pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumpro-* | p6-* | 6x86-* | athlon-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium4-*) basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pn) basic_machine=pn-gould ;; power) basic_machine=power-ibm ;; ppc) basic_machine=powerpc-unknown ;; ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppcle | powerpclittle | ppc-le | powerpc-little) basic_machine=powerpcle-unknown ;; ppcle-* | powerpclittle-*) basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64) basic_machine=powerpc64-unknown ;; ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64le | powerpc64little | ppc64-le | powerpc64-little) basic_machine=powerpc64le-unknown ;; ppc64le-* | powerpc64little-*) basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ps2) basic_machine=i386-ibm ;; pw32) basic_machine=i586-unknown os=-pw32 ;; rom68k) basic_machine=m68k-rom68k os=-coff ;; rm[46]00) basic_machine=mips-siemens ;; rtpc | rtpc-*) basic_machine=romp-ibm ;; s390 | s390-*) basic_machine=s390-ibm ;; s390x | s390x-*) basic_machine=s390x-ibm ;; sa29200) basic_machine=a29k-amd os=-udi ;; sb1) basic_machine=mipsisa64sb1-unknown ;; sb1el) basic_machine=mipsisa64sb1el-unknown ;; sei) basic_machine=mips-sei os=-seiux ;; sequent) basic_machine=i386-sequent ;; sh) basic_machine=sh-hitachi os=-hms ;; sh64) basic_machine=sh64-unknown ;; sparclite-wrs | simso-wrs) basic_machine=sparclite-wrs os=-vxworks ;; sps7) basic_machine=m68k-bull os=-sysv2 ;; spur) basic_machine=spur-unknown ;; st2000) basic_machine=m68k-tandem ;; stratus) basic_machine=i860-stratus os=-sysv4 ;; sun2) basic_machine=m68000-sun ;; sun2os3) basic_machine=m68000-sun os=-sunos3 ;; sun2os4) basic_machine=m68000-sun os=-sunos4 ;; sun3os3) basic_machine=m68k-sun os=-sunos3 ;; sun3os4) basic_machine=m68k-sun os=-sunos4 ;; sun4os3) basic_machine=sparc-sun os=-sunos3 ;; sun4os4) basic_machine=sparc-sun os=-sunos4 ;; sun4sol2) basic_machine=sparc-sun os=-solaris2 ;; sun3 | sun3-*) basic_machine=m68k-sun ;; sun4) basic_machine=sparc-sun ;; sun386 | sun386i | roadrunner) basic_machine=i386-sun ;; sv1) basic_machine=sv1-cray os=-unicos ;; symmetry) basic_machine=i386-sequent os=-dynix ;; t3e) basic_machine=alphaev5-cray os=-unicos ;; t90) basic_machine=t90-cray os=-unicos ;; tic54x | c54x*) basic_machine=tic54x-unknown os=-coff ;; tic55x | c55x*) basic_machine=tic55x-unknown os=-coff ;; tic6x | c6x*) basic_machine=tic6x-unknown os=-coff ;; tx39) basic_machine=mipstx39-unknown ;; tx39el) basic_machine=mipstx39el-unknown ;; toad1) basic_machine=pdp10-xkl os=-tops20 ;; tower | tower-32) basic_machine=m68k-ncr ;; tpf) basic_machine=s390x-ibm os=-tpf ;; udi29k) basic_machine=a29k-amd os=-udi ;; ultra3) basic_machine=a29k-nyu os=-sym1 ;; v810 | necv810) basic_machine=v810-nec os=-none ;; vaxv) basic_machine=vax-dec os=-sysv ;; vms) basic_machine=vax-dec os=-vms ;; vpp*|vx|vx-*) basic_machine=f301-fujitsu ;; vxworks960) basic_machine=i960-wrs os=-vxworks ;; vxworks68) basic_machine=m68k-wrs os=-vxworks ;; vxworks29k) basic_machine=a29k-wrs os=-vxworks ;; w65*) basic_machine=w65-wdc os=-none ;; w89k-*) basic_machine=hppa1.1-winbond os=-proelf ;; xps | xps100) basic_machine=xps100-honeywell ;; ymp) basic_machine=ymp-cray os=-unicos ;; z8k-*-coff) basic_machine=z8k-unknown os=-sim ;; none) basic_machine=none-none os=-none ;; # Here we handle the default manufacturer of certain CPU types. It is in # some cases the only manufacturer, in others, it is the most popular. w89k) basic_machine=hppa1.1-winbond ;; op50n) basic_machine=hppa1.1-oki ;; op60c) basic_machine=hppa1.1-oki ;; romp) basic_machine=romp-ibm ;; rs6000) basic_machine=rs6000-ibm ;; vax) basic_machine=vax-dec ;; pdp10) # there are many clones, so DEC is not a safe bet basic_machine=pdp10-unknown ;; pdp11) basic_machine=pdp11-dec ;; we32k) basic_machine=we32k-att ;; sh3 | sh4 | sh[34]eb | sh[1234]le | sh[23]ele) basic_machine=sh-unknown ;; sh64) basic_machine=sh64-unknown ;; sparc | sparcv9 | sparcv9b) basic_machine=sparc-sun ;; cydra) basic_machine=cydra-cydrome ;; orion) basic_machine=orion-highlevel ;; orion105) basic_machine=clipper-highlevel ;; mac | mpw | mac-mpw) basic_machine=m68k-apple ;; pmac | pmac-mpw) basic_machine=powerpc-apple ;; *-unknown) # Make sure to match an already-canonicalized machine name. ;; *) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; esac # Here we canonicalize certain aliases for manufacturers. case $basic_machine in *-digital*) basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` ;; *-commodore*) basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` ;; *) ;; esac # Decode manufacturer-specific aliases for certain operating systems. if [ x"$os" != x"" ] then case $os in # First match some system type aliases # that might get confused with valid system types. # -solaris* is a basic system type, with this one exception. -solaris1 | -solaris1.*) os=`echo $os | sed -e 's|solaris1|sunos4|'` ;; -solaris) os=-solaris2 ;; -svr4*) os=-sysv4 ;; -unixware*) os=-sysv4.2uw ;; -gnu/linux*) os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` ;; # First accept the basic system types. # The portable systems comes first. # Each alternative MUST END IN A *, to match a version number. # -sysv* is not here because it comes later, after sysvr4. -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ | -aos* \ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* | -openbsd* \ | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ | -chorusos* | -chorusrdb* \ | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ | -mingw32* | -linux-gnu* | -linux-uclibc* | -uxpv* | -beos* | -mpeix* | -udk* \ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly*) # Remember, each alternative MUST END IN *, to match a version number. ;; -qnx*) case $basic_machine in x86-* | i*86-*) ;; *) os=-nto$os ;; esac ;; -nto-qnx*) ;; -nto*) os=`echo $os | sed -e 's|nto|nto-qnx|'` ;; -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ | -windows* | -osx | -abug | -netware* | -os9* | -beos* \ | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) ;; -mac*) os=`echo $os | sed -e 's|mac|macos|'` ;; -linux-dietlibc) os=-linux-dietlibc ;; -linux*) os=`echo $os | sed -e 's|linux|linux-gnu|'` ;; -sunos5*) os=`echo $os | sed -e 's|sunos5|solaris2|'` ;; -sunos6*) os=`echo $os | sed -e 's|sunos6|solaris3|'` ;; -opened*) os=-openedition ;; -os400*) os=-os400 ;; -wince*) os=-wince ;; -osfrose*) os=-osfrose ;; -osf*) os=-osf ;; -utek*) os=-bsd ;; -dynix*) os=-bsd ;; -acis*) os=-aos ;; -atheos*) os=-atheos ;; -syllable*) os=-syllable ;; -386bsd) os=-bsd ;; -ctix* | -uts*) os=-sysv ;; -nova*) os=-rtmk-nova ;; -ns2 ) os=-nextstep2 ;; -nsk*) os=-nsk ;; # Preserve the version number of sinix5. -sinix5.*) os=`echo $os | sed -e 's|sinix|sysv|'` ;; -sinix*) os=-sysv4 ;; -tpf*) os=-tpf ;; -triton*) os=-sysv3 ;; -oss*) os=-sysv3 ;; -svr4) os=-sysv4 ;; -svr3) os=-sysv3 ;; -sysvr4) os=-sysv4 ;; # This must come after -sysvr4. -sysv*) ;; -ose*) os=-ose ;; -es1800*) os=-ose ;; -xenix) os=-xenix ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) os=-mint ;; -aros*) os=-aros ;; -kaos*) os=-kaos ;; -none) ;; *) # Get rid of the `-' at the beginning of $os. os=`echo $os | sed 's/[^-]*-//'` echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 exit 1 ;; esac else # Here we handle the default operating systems that come with various machines. # The value should be what the vendor currently ships out the door with their # machine or put another way, the most popular os provided with the machine. # Note that if you're going to try to match "-MANUFACTURER" here (say, # "-sun"), then you have to tell the case statement up towards the top # that MANUFACTURER isn't an operating system. Otherwise, code above # will signal an error saying that MANUFACTURER isn't an operating # system, and we'll never get to this point. case $basic_machine in *-acorn) os=-riscix1.2 ;; arm*-rebel) os=-linux ;; arm*-semi) os=-aout ;; c4x-* | tic4x-*) os=-coff ;; # This must come before the *-dec entry. pdp10-*) os=-tops20 ;; pdp11-*) os=-none ;; *-dec | vax-*) os=-ultrix4.2 ;; m68*-apollo) os=-domain ;; i386-sun) os=-sunos4.0.2 ;; m68000-sun) os=-sunos3 # This also exists in the configure program, but was not the # default. # os=-sunos4 ;; m68*-cisco) os=-aout ;; mips*-cisco) os=-elf ;; mips*-*) os=-elf ;; or32-*) os=-coff ;; *-tti) # must be before sparc entry or we get the wrong os. os=-sysv3 ;; sparc-* | *-sun) os=-sunos4.1.1 ;; *-be) os=-beos ;; *-ibm) os=-aix ;; *-wec) os=-proelf ;; *-winbond) os=-proelf ;; *-oki) os=-proelf ;; *-hp) os=-hpux ;; *-hitachi) os=-hiux ;; i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) os=-sysv ;; *-cbm) os=-amigaos ;; *-dg) os=-dgux ;; *-dolphin) os=-sysv3 ;; m68k-ccur) os=-rtu ;; m88k-omron*) os=-luna ;; *-next ) os=-nextstep ;; *-sequent) os=-ptx ;; *-crds) os=-unos ;; *-ns) os=-genix ;; i370-*) os=-mvs ;; *-next) os=-nextstep3 ;; *-gould) os=-sysv ;; *-highlevel) os=-bsd ;; *-encore) os=-bsd ;; *-sgi) os=-irix ;; *-siemens) os=-sysv4 ;; *-masscomp) os=-rtu ;; f30[01]-fujitsu | f700-fujitsu) os=-uxpv ;; *-rom68k) os=-coff ;; *-*bug) os=-coff ;; *-apple) os=-macos ;; *-atari*) os=-mint ;; *) os=-none ;; esac fi # Here we handle the case where we know the os, and the CPU type, but not the # manufacturer. We pick the logical manufacturer. vendor=unknown case $basic_machine in *-unknown) case $os in -riscix*) vendor=acorn ;; -sunos*) vendor=sun ;; -aix*) vendor=ibm ;; -beos*) vendor=be ;; -hpux*) vendor=hp ;; -mpeix*) vendor=hp ;; -hiux*) vendor=hitachi ;; -unos*) vendor=crds ;; -dgux*) vendor=dg ;; -luna*) vendor=omron ;; -genix*) vendor=ns ;; -mvs* | -opened*) vendor=ibm ;; -os400*) vendor=ibm ;; -ptx*) vendor=sequent ;; -tpf*) vendor=ibm ;; -vxsim* | -vxworks* | -windiss*) vendor=wrs ;; -aux*) vendor=apple ;; -hms*) vendor=hitachi ;; -mpw* | -macos*) vendor=apple ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) vendor=atari ;; -vos*) vendor=stratus ;; esac basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` ;; esac echo $basic_machine$os exit 0 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: iaxmodem-1.2.0/lib/libiax2/build.sh0000755000175000017500000000076511150047225016416 0ustar julienjulienecho configuring automake ./bootstrap.sh echo configuring libiax2 ./configure --enable-newjb echo building libiax2 make echo echo echo '##################################################################' echo '# #' echo '# If all is well, enter "make install" to complete installation. #' echo '# #' echo '##################################################################' iaxmodem-1.2.0/lib/libiax2/ltmain.sh0000644000175000017500000054666211150047225016613 0ustar julienjulien# ltmain.sh - Provide generalized library-building support services. # NOTE: Changing this file will not affect anything until you rerun configure. # # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004 # Free Software Foundation, Inc. # Originally by Gordon Matzigkeit , 1996 # # 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. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. basename="s,^.*/,,g" # Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh # is ksh but when the shell is invoked as "sh" and the current value of # the _XPG environment variable is not equal to 1 (one), the special # positional parameter $0, within a function call, is the name of the # function. progpath="$0" # RH: define SED for historic ltconfig's generated by Libtool 1.3 [ -z "$SED" ] && SED=sed # The name of this program: progname=`echo "$progpath" | $SED $basename` modename="$progname" # Global variables: EXIT_SUCCESS=0 EXIT_FAILURE=1 PROGRAM=ltmain.sh PACKAGE=libtool VERSION=1.5.6 TIMESTAMP=" (1.1220.2.95 2004/04/11 05:50:42)" # Check that we have a working $echo. if test "X$1" = X--no-reexec; then # Discard the --no-reexec flag, and continue. shift elif test "X$1" = X--fallback-echo; then # Avoid inline document here, it may be left over : elif test "X`($echo '\t') 2>/dev/null`" = 'X\t'; then # Yippee, $echo works! : else # Restart under the correct shell, and then maybe $echo will work. exec $SHELL "$progpath" --no-reexec ${1+"$@"} fi if test "X$1" = X--fallback-echo; then # used as fallback echo shift cat <&2 $echo "Fatal configuration error. See the $PACKAGE docs for more information." 1>&2 exit $EXIT_FAILURE fi # Global variables. mode=$default_mode nonopt= prev= prevopt= run= show="$echo" show_help= execute_dlfiles= lo2o="s/\\.lo\$/.${objext}/" o2lo="s/\\.${objext}\$/.lo/" ##################################### # Shell function definitions: # This seems to be the best place for them # func_win32_libid arg # return the library type of file 'arg' # # Need a lot of goo to handle *both* DLLs and import libs # Has to be a shell function in order to 'eat' the argument # that is supplied when $file_magic_command is called. func_win32_libid () { win32_libid_type="unknown" win32_fileres=`file -L $1 2>/dev/null` case $win32_fileres in *ar\ archive\ import\ library*) # definitely import win32_libid_type="x86 archive import" ;; *ar\ archive*) # could be an import, or static if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | \ $EGREP -e 'file format pe-i386(.*architecture: i386)?' >/dev/null ; then win32_nmres=`eval $NM -f posix -A $1 | \ sed -n -e '1,100{/ I /{x;/import/!{s/^/import/;h;p;};x;};}'` if test "X$win32_nmres" = "Ximport" ; then win32_libid_type="x86 archive import" else win32_libid_type="x86 archive static" fi fi ;; *DLL*) win32_libid_type="x86 DLL" ;; *executable*) # but shell scripts are "executable" too... case $win32_fileres in *MS\ Windows\ PE\ Intel*) win32_libid_type="x86 DLL" ;; esac ;; esac $echo $win32_libid_type } # func_infer_tag arg # Infer tagged configuration to use if any are available and # if one wasn't chosen via the "--tag" command line option. # Only attempt this if the compiler in the base compile # command doesn't match the default compiler. # arg is usually of the form 'gcc ...' func_infer_tag () { if test -n "$available_tags" && test -z "$tagname"; then CC_quoted= for arg in $CC; do case $arg in *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") arg="\"$arg\"" ;; esac CC_quoted="$CC_quoted $arg" done case $@ in # Blanks in the command may have been stripped by the calling shell, # but not from the CC environment variable when configure was run. " $CC "* | "$CC "* | " `$echo $CC` "* | "`$echo $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$echo $CC_quoted` "* | "`$echo $CC_quoted` "*) ;; # Blanks at the start of $base_compile will cause this to fail # if we don't check for them as well. *) for z in $available_tags; do if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then # Evaluate the configuration. eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`" CC_quoted= for arg in $CC; do # Double-quote args containing other shell metacharacters. case $arg in *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") arg="\"$arg\"" ;; esac CC_quoted="$CC_quoted $arg" done case "$@ " in " $CC "* | "$CC "* | " `$echo $CC` "* | "`$echo $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$echo $CC_quoted` "* | "`$echo $CC_quoted` "*) # The compiler in the base compile command matches # the one in the tagged configuration. # Assume this is the tagged configuration we want. tagname=$z break ;; esac fi done # If $tagname still isn't set, then no tagged configuration # was found and let the user know that the "--tag" command # line option must be used. if test -z "$tagname"; then $echo "$modename: unable to infer tagged configuration" $echo "$modename: specify a tag with \`--tag'" 1>&2 exit $EXIT_FAILURE # else # $echo "$modename: using $tagname tagged configuration" fi ;; esac fi } # End of Shell function definitions ##################################### # Darwin sucks eval std_shrext=\"$shrext_cmds\" # Parse our command line options once, thoroughly. while test "$#" -gt 0 do arg="$1" shift case $arg in -*=*) optarg=`$echo "X$arg" | $Xsed -e 's/[-_a-zA-Z0-9]*=//'` ;; *) optarg= ;; esac # If the previous option needs an argument, assign it. if test -n "$prev"; then case $prev in execute_dlfiles) execute_dlfiles="$execute_dlfiles $arg" ;; tag) tagname="$arg" preserve_args="${preserve_args}=$arg" # Check whether tagname contains only valid characters case $tagname in *[!-_A-Za-z0-9,/]*) $echo "$progname: invalid tag name: $tagname" 1>&2 exit $EXIT_FAILURE ;; esac case $tagname in CC) # Don't test for the "default" C tag, as we know, it's there, but # not specially marked. ;; *) if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$" < "$progpath" > /dev/null; then taglist="$taglist $tagname" # Evaluate the configuration. eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$tagname'$/,/^# ### END LIBTOOL TAG CONFIG: '$tagname'$/p' < $progpath`" else $echo "$progname: ignoring unknown tag $tagname" 1>&2 fi ;; esac ;; *) eval "$prev=\$arg" ;; esac prev= prevopt= continue fi # Have we seen a non-optional argument yet? case $arg in --help) show_help=yes ;; --version) $echo "$PROGRAM (GNU $PACKAGE) $VERSION$TIMESTAMP" $echo $echo "Copyright (C) 2003 Free Software Foundation, Inc." $echo "This is free software; see the source for copying conditions. There is NO" $echo "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." exit $EXIT_SUCCESS ;; --config) ${SED} -e '1,/^# ### BEGIN LIBTOOL CONFIG/d' -e '/^# ### END LIBTOOL CONFIG/,$d' $progpath # Now print the configurations for the tags. for tagname in $taglist; do ${SED} -n -e "/^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$/,/^# ### END LIBTOOL TAG CONFIG: $tagname$/p" < "$progpath" done exit $EXIT_SUCCESS ;; --debug) $echo "$progname: enabling shell trace mode" set -x preserve_args="$preserve_args $arg" ;; --dry-run | -n) run=: ;; --features) $echo "host: $host" if test "$build_libtool_libs" = yes; then $echo "enable shared libraries" else $echo "disable shared libraries" fi if test "$build_old_libs" = yes; then $echo "enable static libraries" else $echo "disable static libraries" fi exit $EXIT_SUCCESS ;; --finish) mode="finish" ;; --mode) prevopt="--mode" prev=mode ;; --mode=*) mode="$optarg" ;; --preserve-dup-deps) duplicate_deps="yes" ;; --quiet | --silent) show=: preserve_args="$preserve_args $arg" ;; --tag) prevopt="--tag" prev=tag ;; --tag=*) set tag "$optarg" ${1+"$@"} shift prev=tag preserve_args="$preserve_args --tag" ;; -dlopen) prevopt="-dlopen" prev=execute_dlfiles ;; -*) $echo "$modename: unrecognized option \`$arg'" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE ;; *) nonopt="$arg" break ;; esac done if test -n "$prevopt"; then $echo "$modename: option \`$prevopt' requires an argument" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE fi # If this variable is set in any of the actions, the command in it # will be execed at the end. This prevents here-documents from being # left over by shells. exec_cmd= if test -z "$show_help"; then # Infer the operation mode. if test -z "$mode"; then $echo "*** Warning: inferring the mode of operation is deprecated." 1>&2 $echo "*** Future versions of Libtool will require -mode=MODE be specified." 1>&2 case $nonopt in *cc | cc* | *++ | gcc* | *-gcc* | g++* | xlc*) mode=link for arg do case $arg in -c) mode=compile break ;; esac done ;; *db | *dbx | *strace | *truss) mode=execute ;; *install*|cp|mv) mode=install ;; *rm) mode=uninstall ;; *) # If we have no mode, but dlfiles were specified, then do execute mode. test -n "$execute_dlfiles" && mode=execute # Just use the default operation mode. if test -z "$mode"; then if test -n "$nonopt"; then $echo "$modename: warning: cannot infer operation mode from \`$nonopt'" 1>&2 else $echo "$modename: warning: cannot infer operation mode without MODE-ARGS" 1>&2 fi fi ;; esac fi # Only execute mode is allowed to have -dlopen flags. if test -n "$execute_dlfiles" && test "$mode" != execute; then $echo "$modename: unrecognized option \`-dlopen'" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE fi # Change the help message to a mode-specific one. generic_help="$help" help="Try \`$modename --help --mode=$mode' for more information." # These modes are in order of execution frequency so that they run quickly. case $mode in # libtool compile mode compile) modename="$modename: compile" # Get the compilation command and the source file. base_compile= srcfile="$nonopt" # always keep a non-empty value in "srcfile" suppress_opt=yes suppress_output= arg_mode=normal libobj= later= for arg do case "$arg_mode" in arg ) # do not "continue". Instead, add this to base_compile lastarg="$arg" arg_mode=normal ;; target ) libobj="$arg" arg_mode=normal continue ;; normal ) # Accept any command-line options. case $arg in -o) if test -n "$libobj" ; then $echo "$modename: you cannot specify \`-o' more than once" 1>&2 exit $EXIT_FAILURE fi arg_mode=target continue ;; -static | -prefer-pic | -prefer-non-pic) later="$later $arg" continue ;; -no-suppress) suppress_opt=no continue ;; -Xcompiler) arg_mode=arg # the next one goes into the "base_compile" arg list continue # The current "srcfile" will either be retained or ;; # replaced later. I would guess that would be a bug. -Wc,*) args=`$echo "X$arg" | $Xsed -e "s/^-Wc,//"` lastarg= save_ifs="$IFS"; IFS=',' for arg in $args; do IFS="$save_ifs" # Double-quote args containing other shell metacharacters. # Many Bourne shells cannot handle close brackets correctly # in scan sets, so we specify it separately. case $arg in *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") arg="\"$arg\"" ;; esac lastarg="$lastarg $arg" done IFS="$save_ifs" lastarg=`$echo "X$lastarg" | $Xsed -e "s/^ //"` # Add the arguments to base_compile. base_compile="$base_compile $lastarg" continue ;; * ) # Accept the current argument as the source file. # The previous "srcfile" becomes the current argument. # lastarg="$srcfile" srcfile="$arg" ;; esac # case $arg ;; esac # case $arg_mode # Aesthetically quote the previous argument. lastarg=`$echo "X$lastarg" | $Xsed -e "$sed_quote_subst"` case $lastarg in # Double-quote args containing other shell metacharacters. # Many Bourne shells cannot handle close brackets correctly # in scan sets, so we specify it separately. *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") lastarg="\"$lastarg\"" ;; esac base_compile="$base_compile $lastarg" done # for arg case $arg_mode in arg) $echo "$modename: you must specify an argument for -Xcompile" exit $EXIT_FAILURE ;; target) $echo "$modename: you must specify a target with \`-o'" 1>&2 exit $EXIT_FAILURE ;; *) # Get the name of the library object. [ -z "$libobj" ] && libobj=`$echo "X$srcfile" | $Xsed -e 's%^.*/%%'` ;; esac # Recognize several different file suffixes. # If the user specifies -o file.o, it is replaced with file.lo xform='[cCFSifmso]' case $libobj in *.ada) xform=ada ;; *.adb) xform=adb ;; *.ads) xform=ads ;; *.asm) xform=asm ;; *.c++) xform=c++ ;; *.cc) xform=cc ;; *.ii) xform=ii ;; *.class) xform=class ;; *.cpp) xform=cpp ;; *.cxx) xform=cxx ;; *.f90) xform=f90 ;; *.for) xform=for ;; *.java) xform=java ;; esac libobj=`$echo "X$libobj" | $Xsed -e "s/\.$xform$/.lo/"` case $libobj in *.lo) obj=`$echo "X$libobj" | $Xsed -e "$lo2o"` ;; *) $echo "$modename: cannot determine name of library object from \`$libobj'" 1>&2 exit $EXIT_FAILURE ;; esac func_infer_tag $base_compile for arg in $later; do case $arg in -static) build_old_libs=yes continue ;; -prefer-pic) pic_mode=yes continue ;; -prefer-non-pic) pic_mode=no continue ;; esac done objname=`$echo "X$obj" | $Xsed -e 's%^.*/%%'` xdir=`$echo "X$obj" | $Xsed -e 's%/[^/]*$%%'` if test "X$xdir" = "X$obj"; then xdir= else xdir=$xdir/ fi lobj=${xdir}$objdir/$objname if test -z "$base_compile"; then $echo "$modename: you must specify a compilation command" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE fi # Delete any leftover library objects. if test "$build_old_libs" = yes; then removelist="$obj $lobj $libobj ${libobj}T" else removelist="$lobj $libobj ${libobj}T" fi $run $rm $removelist trap "$run $rm $removelist; exit $EXIT_FAILURE" 1 2 15 # On Cygwin there's no "real" PIC flag so we must build both object types case $host_os in cygwin* | mingw* | pw32* | os2*) pic_mode=default ;; esac if test "$pic_mode" = no && test "$deplibs_check_method" != pass_all; then # non-PIC code in shared libraries is not supported pic_mode=default fi # Calculate the filename of the output object if compiler does # not support -o with -c if test "$compiler_c_o" = no; then output_obj=`$echo "X$srcfile" | $Xsed -e 's%^.*/%%' -e 's%\.[^.]*$%%'`.${objext} lockfile="$output_obj.lock" removelist="$removelist $output_obj $lockfile" trap "$run $rm $removelist; exit $EXIT_FAILURE" 1 2 15 else output_obj= need_locks=no lockfile= fi # Lock this critical section if it is needed # We use this script file to make the link, it avoids creating a new file if test "$need_locks" = yes; then until $run ln "$progpath" "$lockfile" 2>/dev/null; do $show "Waiting for $lockfile to be removed" sleep 2 done elif test "$need_locks" = warn; then if test -f "$lockfile"; then $echo "\ *** ERROR, $lockfile exists and contains: `cat $lockfile 2>/dev/null` This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support \`-c' and \`-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $run $rm $removelist exit $EXIT_FAILURE fi $echo $srcfile > "$lockfile" fi if test -n "$fix_srcfile_path"; then eval srcfile=\"$fix_srcfile_path\" fi $run $rm "$libobj" "${libobj}T" # Create a libtool object file (analogous to a ".la" file), # but don't create it if we're doing a dry run. test -z "$run" && cat > ${libobj}T </dev/null`" != "X$srcfile"; then $echo "\ *** ERROR, $lockfile contains: `cat $lockfile 2>/dev/null` but it should contain: $srcfile This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support \`-c' and \`-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $run $rm $removelist exit $EXIT_FAILURE fi # Just move the object if needed, then go on to compile the next one if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then $show "$mv $output_obj $lobj" if $run $mv $output_obj $lobj; then : else error=$? $run $rm $removelist exit $error fi fi # Append the name of the PIC object to the libtool object file. test -z "$run" && cat >> ${libobj}T <> ${libobj}T </dev/null`" != "X$srcfile"; then $echo "\ *** ERROR, $lockfile contains: `cat $lockfile 2>/dev/null` but it should contain: $srcfile This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support \`-c' and \`-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $run $rm $removelist exit $EXIT_FAILURE fi # Just move the object if needed if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then $show "$mv $output_obj $obj" if $run $mv $output_obj $obj; then : else error=$? $run $rm $removelist exit $error fi fi # Append the name of the non-PIC object the libtool object file. # Only append if the libtool object file exists. test -z "$run" && cat >> ${libobj}T <> ${libobj}T <&2 fi if test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi else if test -z "$pic_flag" && test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi fi build_libtool_libs=no build_old_libs=yes prefer_static_libs=yes break ;; esac done # See if our shared archives depend on static archives. test -n "$old_archive_from_new_cmds" && build_old_libs=yes # Go through the arguments, transforming them on the way. while test "$#" -gt 0; do arg="$1" shift case $arg in *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") qarg=\"`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`\" ### testsuite: skip nested quoting test ;; *) qarg=$arg ;; esac libtool_args="$libtool_args $qarg" # If the previous option needs an argument, assign it. if test -n "$prev"; then case $prev in output) compile_command="$compile_command @OUTPUT@" finalize_command="$finalize_command @OUTPUT@" ;; esac case $prev in dlfiles|dlprefiles) if test "$preload" = no; then # Add the symbol object into the linking commands. compile_command="$compile_command @SYMFILE@" finalize_command="$finalize_command @SYMFILE@" preload=yes fi case $arg in *.la | *.lo) ;; # We handle these cases below. force) if test "$dlself" = no; then dlself=needless export_dynamic=yes fi prev= continue ;; self) if test "$prev" = dlprefiles; then dlself=yes elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then dlself=yes else dlself=needless export_dynamic=yes fi prev= continue ;; *) if test "$prev" = dlfiles; then dlfiles="$dlfiles $arg" else dlprefiles="$dlprefiles $arg" fi prev= continue ;; esac ;; expsyms) export_symbols="$arg" if test ! -f "$arg"; then $echo "$modename: symbol file \`$arg' does not exist" exit $EXIT_FAILURE fi prev= continue ;; expsyms_regex) export_symbols_regex="$arg" prev= continue ;; inst_prefix) inst_prefix_dir="$arg" prev= continue ;; precious_regex) precious_files_regex="$arg" prev= continue ;; release) release="-$arg" prev= continue ;; objectlist) if test -f "$arg"; then save_arg=$arg moreargs= for fil in `cat $save_arg` do # moreargs="$moreargs $fil" arg=$fil # A libtool-controlled object. # Check to see that this really is a libtool object. if (${SED} -e '2q' $arg | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then pic_object= non_pic_object= # Read the .lo file # If there is no directory component, then add one. case $arg in */* | *\\*) . $arg ;; *) . ./$arg ;; esac if test -z "$pic_object" || \ test -z "$non_pic_object" || test "$pic_object" = none && \ test "$non_pic_object" = none; then $echo "$modename: cannot find name of object for \`$arg'" 1>&2 exit $EXIT_FAILURE fi # Extract subdirectory from the argument. xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'` if test "X$xdir" = "X$arg"; then xdir= else xdir="$xdir/" fi if test "$pic_object" != none; then # Prepend the subdirectory the object is found in. pic_object="$xdir$pic_object" if test "$prev" = dlfiles; then if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then dlfiles="$dlfiles $pic_object" prev= continue else # If libtool objects are unsupported, then we need to preload. prev=dlprefiles fi fi # CHECK ME: I think I busted this. -Ossama if test "$prev" = dlprefiles; then # Preload the old-style object. dlprefiles="$dlprefiles $pic_object" prev= fi # A PIC object. libobjs="$libobjs $pic_object" arg="$pic_object" fi # Non-PIC object. if test "$non_pic_object" != none; then # Prepend the subdirectory the object is found in. non_pic_object="$xdir$non_pic_object" # A standard non-PIC object non_pic_objects="$non_pic_objects $non_pic_object" if test -z "$pic_object" || test "$pic_object" = none ; then arg="$non_pic_object" fi fi else # Only an error if not doing a dry-run. if test -z "$run"; then $echo "$modename: \`$arg' is not a valid libtool object" 1>&2 exit $EXIT_FAILURE else # Dry-run case. # Extract subdirectory from the argument. xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'` if test "X$xdir" = "X$arg"; then xdir= else xdir="$xdir/" fi pic_object=`$echo "X${xdir}${objdir}/${arg}" | $Xsed -e "$lo2o"` non_pic_object=`$echo "X${xdir}${arg}" | $Xsed -e "$lo2o"` libobjs="$libobjs $pic_object" non_pic_objects="$non_pic_objects $non_pic_object" fi fi done else $echo "$modename: link input file \`$save_arg' does not exist" exit $EXIT_FAILURE fi arg=$save_arg prev= continue ;; rpath | xrpath) # We need an absolute path. case $arg in [\\/]* | [A-Za-z]:[\\/]*) ;; *) $echo "$modename: only absolute run-paths are allowed" 1>&2 exit $EXIT_FAILURE ;; esac if test "$prev" = rpath; then case "$rpath " in *" $arg "*) ;; *) rpath="$rpath $arg" ;; esac else case "$xrpath " in *" $arg "*) ;; *) xrpath="$xrpath $arg" ;; esac fi prev= continue ;; xcompiler) compiler_flags="$compiler_flags $qarg" prev= compile_command="$compile_command $qarg" finalize_command="$finalize_command $qarg" continue ;; xlinker) linker_flags="$linker_flags $qarg" compiler_flags="$compiler_flags $wl$qarg" prev= compile_command="$compile_command $wl$qarg" finalize_command="$finalize_command $wl$qarg" continue ;; xcclinker) linker_flags="$linker_flags $qarg" compiler_flags="$compiler_flags $qarg" prev= compile_command="$compile_command $qarg" finalize_command="$finalize_command $qarg" continue ;; shrext) shrext_cmds="$arg" prev= continue ;; *) eval "$prev=\"\$arg\"" prev= continue ;; esac fi # test -n "$prev" prevarg="$arg" case $arg in -all-static) if test -n "$link_static_flag"; then compile_command="$compile_command $link_static_flag" finalize_command="$finalize_command $link_static_flag" fi continue ;; -allow-undefined) # FIXME: remove this flag sometime in the future. $echo "$modename: \`-allow-undefined' is deprecated because it is the default" 1>&2 continue ;; -avoid-version) avoid_version=yes continue ;; -dlopen) prev=dlfiles continue ;; -dlpreopen) prev=dlprefiles continue ;; -export-dynamic) export_dynamic=yes continue ;; -export-symbols | -export-symbols-regex) if test -n "$export_symbols" || test -n "$export_symbols_regex"; then $echo "$modename: more than one -exported-symbols argument is not allowed" exit $EXIT_FAILURE fi if test "X$arg" = "X-export-symbols"; then prev=expsyms else prev=expsyms_regex fi continue ;; -inst-prefix-dir) prev=inst_prefix continue ;; # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:* # so, if we see these flags be careful not to treat them like -L -L[A-Z][A-Z]*:*) case $with_gcc/$host in no/*-*-irix* | /*-*-irix*) compile_command="$compile_command $arg" finalize_command="$finalize_command $arg" ;; esac continue ;; -L*) dir=`$echo "X$arg" | $Xsed -e 's/^-L//'` # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) ;; *) absdir=`cd "$dir" && pwd` if test -z "$absdir"; then $echo "$modename: cannot determine absolute directory name of \`$dir'" 1>&2 exit $EXIT_FAILURE fi dir="$absdir" ;; esac case "$deplibs " in *" -L$dir "*) ;; *) deplibs="$deplibs -L$dir" lib_search_path="$lib_search_path $dir" ;; esac case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*) case :$dllsearchpath: in *":$dir:"*) ;; *) dllsearchpath="$dllsearchpath:$dir";; esac ;; esac continue ;; -l*) if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then case $host in *-*-cygwin* | *-*-pw32* | *-*-beos*) # These systems don't actually have a C or math library (as such) continue ;; *-*-mingw* | *-*-os2*) # These systems don't actually have a C library (as such) test "X$arg" = "X-lc" && continue ;; *-*-openbsd* | *-*-freebsd*) # Do not include libc due to us having libc/libc_r. test "X$arg" = "X-lc" && continue ;; *-*-rhapsody* | *-*-darwin1.[012]) # Rhapsody C and math libraries are in the System framework deplibs="$deplibs -framework System" continue esac elif test "X$arg" = "X-lc_r"; then case $host in *-*-openbsd* | *-*-freebsd*) # Do not include libc_r directly, use -pthread flag. continue ;; esac fi deplibs="$deplibs $arg" continue ;; -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe) deplibs="$deplibs $arg" continue ;; -module) module=yes continue ;; # gcc -m* arguments should be passed to the linker via $compiler_flags # in order to pass architecture information to the linker # (e.g. 32 vs 64-bit). This may also be accomplished via -Wl,-mfoo # but this is not reliable with gcc because gcc may use -mfoo to # select a different linker, different libraries, etc, while # -Wl,-mfoo simply passes -mfoo to the linker. -m*) # Unknown arguments in both finalize_command and compile_command need # to be aesthetically quoted because they are evaled later. arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` case $arg in *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") arg="\"$arg\"" ;; esac compile_command="$compile_command $arg" finalize_command="$finalize_command $arg" if test "$with_gcc" = "yes" ; then compiler_flags="$compiler_flags $arg" fi continue ;; -shrext) prev=shrext continue ;; -no-fast-install) fast_install=no continue ;; -no-install) case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*) # The PATH hackery in wrapper scripts is required on Windows # in order for the loader to find any dlls it needs. $echo "$modename: warning: \`-no-install' is ignored for $host" 1>&2 $echo "$modename: warning: assuming \`-no-fast-install' instead" 1>&2 fast_install=no ;; *) no_install=yes ;; esac continue ;; -no-undefined) allow_undefined=no continue ;; -objectlist) prev=objectlist continue ;; -o) prev=output ;; -precious-files-regex) prev=precious_regex continue ;; -release) prev=release continue ;; -rpath) prev=rpath continue ;; -R) prev=xrpath continue ;; -R*) dir=`$echo "X$arg" | $Xsed -e 's/^-R//'` # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) ;; *) $echo "$modename: only absolute run-paths are allowed" 1>&2 exit $EXIT_FAILURE ;; esac case "$xrpath " in *" $dir "*) ;; *) xrpath="$xrpath $dir" ;; esac continue ;; -static) # The effects of -static are defined in a previous loop. # We used to do the same as -all-static on platforms that # didn't have a PIC flag, but the assumption that the effects # would be equivalent was wrong. It would break on at least # Digital Unix and AIX. continue ;; -thread-safe) thread_safe=yes continue ;; -version-info) prev=vinfo continue ;; -version-number) prev=vinfo vinfo_number=yes continue ;; -Wc,*) args=`$echo "X$arg" | $Xsed -e "$sed_quote_subst" -e 's/^-Wc,//'` arg= save_ifs="$IFS"; IFS=',' for flag in $args; do IFS="$save_ifs" case $flag in *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") flag="\"$flag\"" ;; esac arg="$arg $wl$flag" compiler_flags="$compiler_flags $flag" done IFS="$save_ifs" arg=`$echo "X$arg" | $Xsed -e "s/^ //"` ;; -Wl,*) args=`$echo "X$arg" | $Xsed -e "$sed_quote_subst" -e 's/^-Wl,//'` arg= save_ifs="$IFS"; IFS=',' for flag in $args; do IFS="$save_ifs" case $flag in *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") flag="\"$flag\"" ;; esac arg="$arg $wl$flag" compiler_flags="$compiler_flags $wl$flag" linker_flags="$linker_flags $flag" done IFS="$save_ifs" arg=`$echo "X$arg" | $Xsed -e "s/^ //"` ;; -Xcompiler) prev=xcompiler continue ;; -Xlinker) prev=xlinker continue ;; -XCClinker) prev=xcclinker continue ;; # Some other compiler flag. -* | +*) # Unknown arguments in both finalize_command and compile_command need # to be aesthetically quoted because they are evaled later. arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` case $arg in *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") arg="\"$arg\"" ;; esac ;; *.$objext) # A standard object. objs="$objs $arg" ;; *.lo) # A libtool-controlled object. # Check to see that this really is a libtool object. if (${SED} -e '2q' $arg | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then pic_object= non_pic_object= # Read the .lo file # If there is no directory component, then add one. case $arg in */* | *\\*) . $arg ;; *) . ./$arg ;; esac if test -z "$pic_object" || \ test -z "$non_pic_object" || test "$pic_object" = none && \ test "$non_pic_object" = none; then $echo "$modename: cannot find name of object for \`$arg'" 1>&2 exit $EXIT_FAILURE fi # Extract subdirectory from the argument. xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'` if test "X$xdir" = "X$arg"; then xdir= else xdir="$xdir/" fi if test "$pic_object" != none; then # Prepend the subdirectory the object is found in. pic_object="$xdir$pic_object" if test "$prev" = dlfiles; then if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then dlfiles="$dlfiles $pic_object" prev= continue else # If libtool objects are unsupported, then we need to preload. prev=dlprefiles fi fi # CHECK ME: I think I busted this. -Ossama if test "$prev" = dlprefiles; then # Preload the old-style object. dlprefiles="$dlprefiles $pic_object" prev= fi # A PIC object. libobjs="$libobjs $pic_object" arg="$pic_object" fi # Non-PIC object. if test "$non_pic_object" != none; then # Prepend the subdirectory the object is found in. non_pic_object="$xdir$non_pic_object" # A standard non-PIC object non_pic_objects="$non_pic_objects $non_pic_object" if test -z "$pic_object" || test "$pic_object" = none ; then arg="$non_pic_object" fi fi else # Only an error if not doing a dry-run. if test -z "$run"; then $echo "$modename: \`$arg' is not a valid libtool object" 1>&2 exit $EXIT_FAILURE else # Dry-run case. # Extract subdirectory from the argument. xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'` if test "X$xdir" = "X$arg"; then xdir= else xdir="$xdir/" fi pic_object=`$echo "X${xdir}${objdir}/${arg}" | $Xsed -e "$lo2o"` non_pic_object=`$echo "X${xdir}${arg}" | $Xsed -e "$lo2o"` libobjs="$libobjs $pic_object" non_pic_objects="$non_pic_objects $non_pic_object" fi fi ;; *.$libext) # An archive. deplibs="$deplibs $arg" old_deplibs="$old_deplibs $arg" continue ;; *.la) # A libtool-controlled library. if test "$prev" = dlfiles; then # This library was specified with -dlopen. dlfiles="$dlfiles $arg" prev= elif test "$prev" = dlprefiles; then # The library was specified with -dlpreopen. dlprefiles="$dlprefiles $arg" prev= else deplibs="$deplibs $arg" fi continue ;; # Some other compiler argument. *) # Unknown arguments in both finalize_command and compile_command need # to be aesthetically quoted because they are evaled later. arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` case $arg in *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") arg="\"$arg\"" ;; esac ;; esac # arg # Now actually substitute the argument into the commands. if test -n "$arg"; then compile_command="$compile_command $arg" finalize_command="$finalize_command $arg" fi done # argument parsing loop if test -n "$prev"; then $echo "$modename: the \`$prevarg' option requires an argument" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE fi if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then eval arg=\"$export_dynamic_flag_spec\" compile_command="$compile_command $arg" finalize_command="$finalize_command $arg" fi oldlibs= # calculate the name of the file, without its directory outputname=`$echo "X$output" | $Xsed -e 's%^.*/%%'` libobjs_save="$libobjs" if test -n "$shlibpath_var"; then # get the directories listed in $shlibpath_var eval shlib_search_path=\`\$echo \"X\${$shlibpath_var}\" \| \$Xsed -e \'s/:/ /g\'\` else shlib_search_path= fi eval sys_lib_search_path=\"$sys_lib_search_path_spec\" eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\" output_objdir=`$echo "X$output" | $Xsed -e 's%/[^/]*$%%'` if test "X$output_objdir" = "X$output"; then output_objdir="$objdir" else output_objdir="$output_objdir/$objdir" fi # Create the object directory. if test ! -d "$output_objdir"; then $show "$mkdir $output_objdir" $run $mkdir $output_objdir status=$? if test "$status" -ne 0 && test ! -d "$output_objdir"; then exit $status fi fi # Determine the type of output case $output in "") $echo "$modename: you must specify an output file" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE ;; *.$libext) linkmode=oldlib ;; *.lo | *.$objext) linkmode=obj ;; *.la) linkmode=lib ;; *) linkmode=prog ;; # Anything else should be a program. esac case $host in *cygwin* | *mingw* | *pw32*) # don't eliminate duplications in $postdeps and $predeps duplicate_compiler_generated_deps=yes ;; *) duplicate_compiler_generated_deps=$duplicate_deps ;; esac specialdeplibs= libs= # Find all interdependent deplibs by searching for libraries # that are linked more than once (e.g. -la -lb -la) for deplib in $deplibs; do if test "X$duplicate_deps" = "Xyes" ; then case "$libs " in *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; esac fi libs="$libs $deplib" done if test "$linkmode" = lib; then libs="$predeps $libs $compiler_lib_search_path $postdeps" # Compute libraries that are listed more than once in $predeps # $postdeps and mark them as special (i.e., whose duplicates are # not to be eliminated). pre_post_deps= if test "X$duplicate_compiler_generated_deps" = "Xyes" ; then for pre_post_dep in $predeps $postdeps; do case "$pre_post_deps " in *" $pre_post_dep "*) specialdeplibs="$specialdeplibs $pre_post_deps" ;; esac pre_post_deps="$pre_post_deps $pre_post_dep" done fi pre_post_deps= fi deplibs= newdependency_libs= newlib_search_path= need_relink=no # whether we're linking any uninstalled libtool libraries notinst_deplibs= # not-installed libtool libraries notinst_path= # paths that contain not-installed libtool libraries case $linkmode in lib) passes="conv link" for file in $dlfiles $dlprefiles; do case $file in *.la) ;; *) $echo "$modename: libraries can \`-dlopen' only libtool libraries: $file" 1>&2 exit $EXIT_FAILURE ;; esac done ;; prog) compile_deplibs= finalize_deplibs= alldeplibs=no newdlfiles= newdlprefiles= passes="conv scan dlopen dlpreopen link" ;; *) passes="conv" ;; esac for pass in $passes; do if test "$linkmode,$pass" = "lib,link" || test "$linkmode,$pass" = "prog,scan"; then libs="$deplibs" deplibs= fi if test "$linkmode" = prog; then case $pass in dlopen) libs="$dlfiles" ;; dlpreopen) libs="$dlprefiles" ;; link) libs="$deplibs %DEPLIBS% $dependency_libs" ;; esac fi if test "$pass" = dlopen; then # Collect dlpreopened libraries save_deplibs="$deplibs" deplibs= fi for deplib in $libs; do lib= found=no case $deplib in -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe) if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" fi continue ;; -l*) if test "$linkmode" != lib && test "$linkmode" != prog; then $echo "$modename: warning: \`-l' is ignored for archives/objects" 1>&2 continue fi if test "$pass" = conv; then deplibs="$deplib $deplibs" continue fi name=`$echo "X$deplib" | $Xsed -e 's/^-l//'` for searchdir in $newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path; do for search_ext in .la $std_shrext .so .a; do # Search the libtool library lib="$searchdir/lib${name}${search_ext}" if test -f "$lib"; then if test "$search_ext" = ".la"; then found=yes else found=no fi break 2 fi done done if test "$found" != yes; then # deplib doesn't seem to be a libtool library if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" fi continue else # deplib is a libtool library # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib, # We need to do some special things here, and not later. if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then case " $predeps $postdeps " in *" $deplib "*) if (${SED} -e '2q' $lib | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then library_names= old_library= case $lib in */* | *\\*) . $lib ;; *) . ./$lib ;; esac for l in $old_library $library_names; do ll="$l" done if test "X$ll" = "X$old_library" ; then # only static version available found=no ladir=`$echo "X$lib" | $Xsed -e 's%/[^/]*$%%'` test "X$ladir" = "X$lib" && ladir="." lib=$ladir/$old_library if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" fi continue fi fi ;; *) ;; esac fi fi ;; # -l -L*) case $linkmode in lib) deplibs="$deplib $deplibs" test "$pass" = conv && continue newdependency_libs="$deplib $newdependency_libs" newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'` ;; prog) if test "$pass" = conv; then deplibs="$deplib $deplibs" continue fi if test "$pass" = scan; then deplibs="$deplib $deplibs" else compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" fi newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'` ;; *) $echo "$modename: warning: \`-L' is ignored for archives/objects" 1>&2 ;; esac # linkmode continue ;; # -L -R*) if test "$pass" = link; then dir=`$echo "X$deplib" | $Xsed -e 's/^-R//'` # Make sure the xrpath contains only unique directories. case "$xrpath " in *" $dir "*) ;; *) xrpath="$xrpath $dir" ;; esac fi deplibs="$deplib $deplibs" continue ;; *.la) lib="$deplib" ;; *.$libext) if test "$pass" = conv; then deplibs="$deplib $deplibs" continue fi case $linkmode in lib) if test "$deplibs_check_method" != pass_all; then $echo $echo "*** Warning: Trying to link with static lib archive $deplib." $echo "*** I have the capability to make that library automatically link in when" $echo "*** you link to this library. But I can only do this if you have a" $echo "*** shared version of the library, which you do not appear to have" $echo "*** because the file extensions .$libext of this argument makes me believe" $echo "*** that it is just a static archive that I should not used here." else $echo $echo "*** Warning: Linking the shared library $output against the" $echo "*** static library $deplib is not portable!" deplibs="$deplib $deplibs" fi continue ;; prog) if test "$pass" != link; then deplibs="$deplib $deplibs" else compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" fi continue ;; esac # linkmode ;; # *.$libext *.lo | *.$objext) if test "$pass" = conv; then deplibs="$deplib $deplibs" elif test "$linkmode" = prog; then if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then # If there is no dlopen support or we're linking statically, # we need to preload. newdlprefiles="$newdlprefiles $deplib" compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else newdlfiles="$newdlfiles $deplib" fi fi continue ;; %DEPLIBS%) alldeplibs=yes continue ;; esac # case $deplib if test "$found" = yes || test -f "$lib"; then : else $echo "$modename: cannot find the library \`$lib'" 1>&2 exit $EXIT_FAILURE fi # Check to see that this really is a libtool archive. if (${SED} -e '2q' $lib | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : else $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 exit $EXIT_FAILURE fi ladir=`$echo "X$lib" | $Xsed -e 's%/[^/]*$%%'` test "X$ladir" = "X$lib" && ladir="." dlname= dlopen= dlpreopen= libdir= library_names= old_library= # If the library was installed with an old release of libtool, # it will not redefine variables installed, or shouldnotlink installed=yes shouldnotlink=no # Read the .la file case $lib in */* | *\\*) . $lib ;; *) . ./$lib ;; esac if test "$linkmode,$pass" = "lib,link" || test "$linkmode,$pass" = "prog,scan" || { test "$linkmode" != prog && test "$linkmode" != lib; }; then test -n "$dlopen" && dlfiles="$dlfiles $dlopen" test -n "$dlpreopen" && dlprefiles="$dlprefiles $dlpreopen" fi if test "$pass" = conv; then # Only check for convenience libraries deplibs="$lib $deplibs" if test -z "$libdir"; then if test -z "$old_library"; then $echo "$modename: cannot find name of link library for \`$lib'" 1>&2 exit $EXIT_FAILURE fi # It is a libtool convenience library, so add in its objects. convenience="$convenience $ladir/$objdir/$old_library" old_convenience="$old_convenience $ladir/$objdir/$old_library" tmp_libs= for deplib in $dependency_libs; do deplibs="$deplib $deplibs" if test "X$duplicate_deps" = "Xyes" ; then case "$tmp_libs " in *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; esac fi tmp_libs="$tmp_libs $deplib" done elif test "$linkmode" != prog && test "$linkmode" != lib; then $echo "$modename: \`$lib' is not a convenience library" 1>&2 exit $EXIT_FAILURE fi continue fi # $pass = conv # Get the name of the library we link against. linklib= for l in $old_library $library_names; do linklib="$l" done if test -z "$linklib"; then $echo "$modename: cannot find name of link library for \`$lib'" 1>&2 exit $EXIT_FAILURE fi # This library was specified with -dlopen. if test "$pass" = dlopen; then if test -z "$libdir"; then $echo "$modename: cannot -dlopen a convenience library: \`$lib'" 1>&2 exit $EXIT_FAILURE fi if test -z "$dlname" || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then # If there is no dlname, no dlopen support or we're linking # statically, we need to preload. We also need to preload any # dependent libraries so libltdl's deplib preloader doesn't # bomb out in the load deplibs phase. dlprefiles="$dlprefiles $lib $dependency_libs" else newdlfiles="$newdlfiles $lib" fi continue fi # $pass = dlopen # We need an absolute path. case $ladir in [\\/]* | [A-Za-z]:[\\/]*) abs_ladir="$ladir" ;; *) abs_ladir=`cd "$ladir" && pwd` if test -z "$abs_ladir"; then $echo "$modename: warning: cannot determine absolute directory name of \`$ladir'" 1>&2 $echo "$modename: passing it literally to the linker, although it might fail" 1>&2 abs_ladir="$ladir" fi ;; esac laname=`$echo "X$lib" | $Xsed -e 's%^.*/%%'` # Find the relevant object directory and library name. if test "X$installed" = Xyes; then if test ! -f "$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then $echo "$modename: warning: library \`$lib' was moved." 1>&2 dir="$ladir" absdir="$abs_ladir" libdir="$abs_ladir" else dir="$libdir" absdir="$libdir" fi else dir="$ladir/$objdir" absdir="$abs_ladir/$objdir" # Remove this search path later notinst_path="$notinst_path $abs_ladir" fi # $installed = yes name=`$echo "X$laname" | $Xsed -e 's/\.la$//' -e 's/^lib//'` # This library was specified with -dlpreopen. if test "$pass" = dlpreopen; then if test -z "$libdir"; then $echo "$modename: cannot -dlpreopen a convenience library: \`$lib'" 1>&2 exit $EXIT_FAILURE fi # Prefer using a static library (so that no silly _DYNAMIC symbols # are required to link). if test -n "$old_library"; then newdlprefiles="$newdlprefiles $dir/$old_library" # Otherwise, use the dlname, so that lt_dlopen finds it. elif test -n "$dlname"; then newdlprefiles="$newdlprefiles $dir/$dlname" else newdlprefiles="$newdlprefiles $dir/$linklib" fi fi # $pass = dlpreopen if test -z "$libdir"; then # Link the convenience library if test "$linkmode" = lib; then deplibs="$dir/$old_library $deplibs" elif test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$dir/$old_library $compile_deplibs" finalize_deplibs="$dir/$old_library $finalize_deplibs" else deplibs="$lib $deplibs" # used for prog,scan pass fi continue fi if test "$linkmode" = prog && test "$pass" != link; then newlib_search_path="$newlib_search_path $ladir" deplibs="$lib $deplibs" linkalldeplibs=no if test "$link_all_deplibs" != no || test -z "$library_names" || test "$build_libtool_libs" = no; then linkalldeplibs=yes fi tmp_libs= for deplib in $dependency_libs; do case $deplib in -L*) newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'`;; ### testsuite: skip nested quoting test esac # Need to link against all dependency_libs? if test "$linkalldeplibs" = yes; then deplibs="$deplib $deplibs" else # Need to hardcode shared library paths # or/and link against static libraries newdependency_libs="$deplib $newdependency_libs" fi if test "X$duplicate_deps" = "Xyes" ; then case "$tmp_libs " in *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; esac fi tmp_libs="$tmp_libs $deplib" done # for deplib continue fi # $linkmode = prog... if test "$linkmode,$pass" = "prog,link"; then if test -n "$library_names" && { test "$prefer_static_libs" = no || test -z "$old_library"; }; then # We need to hardcode the library path if test -n "$shlibpath_var"; then # Make sure the rpath contains only unique directories. case "$temp_rpath " in *" $dir "*) ;; *" $absdir "*) ;; *) temp_rpath="$temp_rpath $dir" ;; esac fi # Hardcode the library path. # Skip directories that are in the system default run-time # search path. case " $sys_lib_dlsearch_path " in *" $absdir "*) ;; *) case "$compile_rpath " in *" $absdir "*) ;; *) compile_rpath="$compile_rpath $absdir" esac ;; esac case " $sys_lib_dlsearch_path " in *" $libdir "*) ;; *) case "$finalize_rpath " in *" $libdir "*) ;; *) finalize_rpath="$finalize_rpath $libdir" esac ;; esac fi # $linkmode,$pass = prog,link... if test "$alldeplibs" = yes && { test "$deplibs_check_method" = pass_all || { test "$build_libtool_libs" = yes && test -n "$library_names"; }; }; then # We only need to search for static libraries continue fi fi link_static=no # Whether the deplib will be linked statically if test -n "$library_names" && { test "$prefer_static_libs" = no || test -z "$old_library"; }; then if test "$installed" = no; then notinst_deplibs="$notinst_deplibs $lib" need_relink=yes fi # This is a shared library # Warn about portability, can't link against -module's on # some systems (darwin) if test "$shouldnotlink" = yes && test "$pass" = link ; then $echo if test "$linkmode" = prog; then $echo "*** Warning: Linking the executable $output against the loadable module" else $echo "*** Warning: Linking the shared library $output against the loadable module" fi $echo "*** $linklib is not portable!" fi if test "$linkmode" = lib && test "$hardcode_into_libs" = yes; then # Hardcode the library path. # Skip directories that are in the system default run-time # search path. case " $sys_lib_dlsearch_path " in *" $absdir "*) ;; *) case "$compile_rpath " in *" $absdir "*) ;; *) compile_rpath="$compile_rpath $absdir" esac ;; esac case " $sys_lib_dlsearch_path " in *" $libdir "*) ;; *) case "$finalize_rpath " in *" $libdir "*) ;; *) finalize_rpath="$finalize_rpath $libdir" esac ;; esac fi if test -n "$old_archive_from_expsyms_cmds"; then # figure out the soname set dummy $library_names realname="$2" shift; shift libname=`eval \\$echo \"$libname_spec\"` # use dlname if we got it. it's perfectly good, no? if test -n "$dlname"; then soname="$dlname" elif test -n "$soname_spec"; then # bleh windows case $host in *cygwin* | mingw*) major=`expr $current - $age` versuffix="-$major" ;; esac eval soname=\"$soname_spec\" else soname="$realname" fi # Make a new name for the extract_expsyms_cmds to use soroot="$soname" soname=`$echo $soroot | ${SED} -e 's/^.*\///'` newlib="libimp-`$echo $soname | ${SED} 's/^lib//;s/\.dll$//'`.a" # If the library has no export list, then create one now if test -f "$output_objdir/$soname-def"; then : else $show "extracting exported symbol list from \`$soname'" save_ifs="$IFS"; IFS='~' cmds=$extract_expsyms_cmds for cmd in $cmds; do IFS="$save_ifs" eval cmd=\"$cmd\" $show "$cmd" $run eval "$cmd" || exit $? done IFS="$save_ifs" fi # Create $newlib if test -f "$output_objdir/$newlib"; then :; else $show "generating import library for \`$soname'" save_ifs="$IFS"; IFS='~' cmds=$old_archive_from_expsyms_cmds for cmd in $cmds; do IFS="$save_ifs" eval cmd=\"$cmd\" $show "$cmd" $run eval "$cmd" || exit $? done IFS="$save_ifs" fi # make sure the library variables are pointing to the new library dir=$output_objdir linklib=$newlib fi # test -n "$old_archive_from_expsyms_cmds" if test "$linkmode" = prog || test "$mode" != relink; then add_shlibpath= add_dir= add= lib_linked=yes case $hardcode_action in immediate | unsupported) if test "$hardcode_direct" = no; then add="$dir/$linklib" case $host in *-*-sco3.2v5* ) add_dir="-L$dir" ;; *-*-darwin* ) # if the lib is a module then we can not link against # it, someone is ignoring the new warnings I added if /usr/bin/file -L $add 2> /dev/null | $EGREP "bundle" >/dev/null ; then $echo "** Warning, lib $linklib is a module, not a shared library" if test -z "$old_library" ; then $echo $echo "** And there doesn't seem to be a static archive available" $echo "** The link will probably fail, sorry" else add="$dir/$old_library" fi fi esac elif test "$hardcode_minus_L" = no; then case $host in *-*-sunos*) add_shlibpath="$dir" ;; esac add_dir="-L$dir" add="-l$name" elif test "$hardcode_shlibpath_var" = no; then add_shlibpath="$dir" add="-l$name" else lib_linked=no fi ;; relink) if test "$hardcode_direct" = yes; then add="$dir/$linklib" elif test "$hardcode_minus_L" = yes; then add_dir="-L$dir" # Try looking first in the location we're being installed to. if test -n "$inst_prefix_dir"; then case "$libdir" in [\\/]*) add_dir="$add_dir -L$inst_prefix_dir$libdir" ;; esac fi add="-l$name" elif test "$hardcode_shlibpath_var" = yes; then add_shlibpath="$dir" add="-l$name" else lib_linked=no fi ;; *) lib_linked=no ;; esac if test "$lib_linked" != yes; then $echo "$modename: configuration error: unsupported hardcode properties" exit $EXIT_FAILURE fi if test -n "$add_shlibpath"; then case :$compile_shlibpath: in *":$add_shlibpath:"*) ;; *) compile_shlibpath="$compile_shlibpath$add_shlibpath:" ;; esac fi if test "$linkmode" = prog; then test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs" test -n "$add" && compile_deplibs="$add $compile_deplibs" else test -n "$add_dir" && deplibs="$add_dir $deplibs" test -n "$add" && deplibs="$add $deplibs" if test "$hardcode_direct" != yes && \ test "$hardcode_minus_L" != yes && \ test "$hardcode_shlibpath_var" = yes; then case :$finalize_shlibpath: in *":$libdir:"*) ;; *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;; esac fi fi fi if test "$linkmode" = prog || test "$mode" = relink; then add_shlibpath= add_dir= add= # Finalize command for both is simple: just hardcode it. if test "$hardcode_direct" = yes; then add="$libdir/$linklib" elif test "$hardcode_minus_L" = yes; then add_dir="-L$libdir" add="-l$name" elif test "$hardcode_shlibpath_var" = yes; then case :$finalize_shlibpath: in *":$libdir:"*) ;; *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;; esac add="-l$name" elif test "$hardcode_automatic" = yes; then if test -n "$inst_prefix_dir" && test -f "$inst_prefix_dir$libdir/$linklib" ; then add="$inst_prefix_dir$libdir/$linklib" else add="$libdir/$linklib" fi else # We cannot seem to hardcode it, guess we'll fake it. add_dir="-L$libdir" # Try looking first in the location we're being installed to. if test -n "$inst_prefix_dir"; then case "$libdir" in [\\/]*) add_dir="$add_dir -L$inst_prefix_dir$libdir" ;; esac fi add="-l$name" fi if test "$linkmode" = prog; then test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs" test -n "$add" && finalize_deplibs="$add $finalize_deplibs" else test -n "$add_dir" && deplibs="$add_dir $deplibs" test -n "$add" && deplibs="$add $deplibs" fi fi elif test "$linkmode" = prog; then # Here we assume that one of hardcode_direct or hardcode_minus_L # is not unsupported. This is valid on all known static and # shared platforms. if test "$hardcode_direct" != unsupported; then test -n "$old_library" && linklib="$old_library" compile_deplibs="$dir/$linklib $compile_deplibs" finalize_deplibs="$dir/$linklib $finalize_deplibs" else compile_deplibs="-l$name -L$dir $compile_deplibs" finalize_deplibs="-l$name -L$dir $finalize_deplibs" fi elif test "$build_libtool_libs" = yes; then # Not a shared library if test "$deplibs_check_method" != pass_all; then # We're trying link a shared library against a static one # but the system doesn't support it. # Just print a warning and add the library to dependency_libs so # that the program can be linked against the static library. $echo $echo "*** Warning: This system can not link to static lib archive $lib." $echo "*** I have the capability to make that library automatically link in when" $echo "*** you link to this library. But I can only do this if you have a" $echo "*** shared version of the library, which you do not appear to have." if test "$module" = yes; then $echo "*** But as you try to build a module library, libtool will still create " $echo "*** a static module, that should work as long as the dlopening application" $echo "*** is linked with the -dlopen flag to resolve symbols at runtime." if test -z "$global_symbol_pipe"; then $echo $echo "*** However, this would only work if libtool was able to extract symbol" $echo "*** lists from a program, using \`nm' or equivalent, but libtool could" $echo "*** not find such a program. So, this module is probably useless." $echo "*** \`nm' from GNU binutils and a full rebuild may help." fi if test "$build_old_libs" = no; then build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi fi else convenience="$convenience $dir/$old_library" old_convenience="$old_convenience $dir/$old_library" deplibs="$dir/$old_library $deplibs" link_static=yes fi fi # link shared/static library? if test "$linkmode" = lib; then if test -n "$dependency_libs" && { test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes || test "$link_static" = yes; }; then # Extract -R from dependency_libs temp_deplibs= for libdir in $dependency_libs; do case $libdir in -R*) temp_xrpath=`$echo "X$libdir" | $Xsed -e 's/^-R//'` case " $xrpath " in *" $temp_xrpath "*) ;; *) xrpath="$xrpath $temp_xrpath";; esac;; *) temp_deplibs="$temp_deplibs $libdir";; esac done dependency_libs="$temp_deplibs" fi newlib_search_path="$newlib_search_path $absdir" # Link against this library test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs" # ... and its dependency_libs tmp_libs= for deplib in $dependency_libs; do newdependency_libs="$deplib $newdependency_libs" if test "X$duplicate_deps" = "Xyes" ; then case "$tmp_libs " in *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; esac fi tmp_libs="$tmp_libs $deplib" done if test "$link_all_deplibs" != no; then # Add the search paths of all dependency libraries for deplib in $dependency_libs; do case $deplib in -L*) path="$deplib" ;; *.la) dir=`$echo "X$deplib" | $Xsed -e 's%/[^/]*$%%'` test "X$dir" = "X$deplib" && dir="." # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;; *) absdir=`cd "$dir" && pwd` if test -z "$absdir"; then $echo "$modename: warning: cannot determine absolute directory name of \`$dir'" 1>&2 absdir="$dir" fi ;; esac if grep "^installed=no" $deplib > /dev/null; then path="$absdir/$objdir" else eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` if test -z "$libdir"; then $echo "$modename: \`$deplib' is not a valid libtool archive" 1>&2 exit $EXIT_FAILURE fi if test "$absdir" != "$libdir"; then $echo "$modename: warning: \`$deplib' seems to be moved" 1>&2 fi path="$absdir" fi depdepl= case $host in *-*-darwin*) # we do not want to link against static libs, # but need to link against shared eval deplibrary_names=`${SED} -n -e 's/^library_names=\(.*\)$/\1/p' $deplib` if test -n "$deplibrary_names" ; then for tmp in $deplibrary_names ; do depdepl=$tmp done if test -f "$path/$depdepl" ; then depdepl="$path/$depdepl" fi # do not add paths which are already there case " $newlib_search_path " in *" $path "*) ;; *) newlib_search_path="$newlib_search_path $path";; esac fi path="" ;; *) path="-L$path" ;; esac ;; -l*) case $host in *-*-darwin*) # Again, we only want to link against shared libraries eval tmp_libs=`$echo "X$deplib" | $Xsed -e "s,^\-l,,"` for tmp in $newlib_search_path ; do if test -f "$tmp/lib$tmp_libs.dylib" ; then eval depdepl="$tmp/lib$tmp_libs.dylib" break fi done path="" ;; *) continue ;; esac ;; *) continue ;; esac case " $deplibs " in *" $depdepl "*) ;; *) deplibs="$depdepl $deplibs" ;; esac case " $deplibs " in *" $path "*) ;; *) deplibs="$deplibs $path" ;; esac done fi # link_all_deplibs != no fi # linkmode = lib done # for deplib in $libs dependency_libs="$newdependency_libs" if test "$pass" = dlpreopen; then # Link the dlpreopened libraries before other libraries for deplib in $save_deplibs; do deplibs="$deplib $deplibs" done fi if test "$pass" != dlopen; then if test "$pass" != conv; then # Make sure lib_search_path contains only unique directories. lib_search_path= for dir in $newlib_search_path; do case "$lib_search_path " in *" $dir "*) ;; *) lib_search_path="$lib_search_path $dir" ;; esac done newlib_search_path= fi if test "$linkmode,$pass" != "prog,link"; then vars="deplibs" else vars="compile_deplibs finalize_deplibs" fi for var in $vars dependency_libs; do # Add libraries to $var in reverse order eval tmp_libs=\"\$$var\" new_libs= for deplib in $tmp_libs; do # FIXME: Pedantically, this is the right thing to do, so # that some nasty dependency loop isn't accidentally # broken: #new_libs="$deplib $new_libs" # Pragmatically, this seems to cause very few problems in # practice: case $deplib in -L*) new_libs="$deplib $new_libs" ;; -R*) ;; *) # And here is the reason: when a library appears more # than once as an explicit dependence of a library, or # is implicitly linked in more than once by the # compiler, it is considered special, and multiple # occurrences thereof are not removed. Compare this # with having the same library being listed as a # dependency of multiple other libraries: in this case, # we know (pedantically, we assume) the library does not # need to be listed more than once, so we keep only the # last copy. This is not always right, but it is rare # enough that we require users that really mean to play # such unportable linking tricks to link the library # using -Wl,-lname, so that libtool does not consider it # for duplicate removal. case " $specialdeplibs " in *" $deplib "*) new_libs="$deplib $new_libs" ;; *) case " $new_libs " in *" $deplib "*) ;; *) new_libs="$deplib $new_libs" ;; esac ;; esac ;; esac done tmp_libs= for deplib in $new_libs; do case $deplib in -L*) case " $tmp_libs " in *" $deplib "*) ;; *) tmp_libs="$tmp_libs $deplib" ;; esac ;; *) tmp_libs="$tmp_libs $deplib" ;; esac done eval $var=\"$tmp_libs\" done # for var fi # Last step: remove runtime libs from dependency_libs # (they stay in deplibs) tmp_libs= for i in $dependency_libs ; do case " $predeps $postdeps $compiler_lib_search_path " in *" $i "*) i="" ;; esac if test -n "$i" ; then tmp_libs="$tmp_libs $i" fi done dependency_libs=$tmp_libs done # for pass if test "$linkmode" = prog; then dlfiles="$newdlfiles" dlprefiles="$newdlprefiles" fi case $linkmode in oldlib) if test -n "$deplibs"; then $echo "$modename: warning: \`-l' and \`-L' are ignored for archives" 1>&2 fi if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then $echo "$modename: warning: \`-dlopen' is ignored for archives" 1>&2 fi if test -n "$rpath"; then $echo "$modename: warning: \`-rpath' is ignored for archives" 1>&2 fi if test -n "$xrpath"; then $echo "$modename: warning: \`-R' is ignored for archives" 1>&2 fi if test -n "$vinfo"; then $echo "$modename: warning: \`-version-info/-version-number' is ignored for archives" 1>&2 fi if test -n "$release"; then $echo "$modename: warning: \`-release' is ignored for archives" 1>&2 fi if test -n "$export_symbols" || test -n "$export_symbols_regex"; then $echo "$modename: warning: \`-export-symbols' is ignored for archives" 1>&2 fi # Now set the variables for building old libraries. build_libtool_libs=no oldlibs="$output" objs="$objs$old_deplibs" ;; lib) # Make sure we only generate libraries of the form `libNAME.la'. case $outputname in lib*) name=`$echo "X$outputname" | $Xsed -e 's/\.la$//' -e 's/^lib//'` eval shared_ext=\"$shrext_cmds\" eval libname=\"$libname_spec\" ;; *) if test "$module" = no; then $echo "$modename: libtool library \`$output' must begin with \`lib'" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE fi if test "$need_lib_prefix" != no; then # Add the "lib" prefix for modules if required name=`$echo "X$outputname" | $Xsed -e 's/\.la$//'` eval shared_ext=\"$shrext_cmds\" eval libname=\"$libname_spec\" else libname=`$echo "X$outputname" | $Xsed -e 's/\.la$//'` fi ;; esac if test -n "$objs"; then if test "$deplibs_check_method" != pass_all; then $echo "$modename: cannot build libtool library \`$output' from non-libtool objects on this host:$objs" 2>&1 exit $EXIT_FAILURE else $echo $echo "*** Warning: Linking the shared library $output against the non-libtool" $echo "*** objects $objs is not portable!" libobjs="$libobjs $objs" fi fi if test "$dlself" != no; then $echo "$modename: warning: \`-dlopen self' is ignored for libtool libraries" 1>&2 fi set dummy $rpath if test "$#" -gt 2; then $echo "$modename: warning: ignoring multiple \`-rpath's for a libtool library" 1>&2 fi install_libdir="$2" oldlibs= if test -z "$rpath"; then if test "$build_libtool_libs" = yes; then # Building a libtool convenience library. # Some compilers have problems with a `.al' extension so # convenience libraries should have the same extension an # archive normally would. oldlibs="$output_objdir/$libname.$libext $oldlibs" build_libtool_libs=convenience build_old_libs=yes fi if test -n "$vinfo"; then $echo "$modename: warning: \`-version-info/-version-number' is ignored for convenience libraries" 1>&2 fi if test -n "$release"; then $echo "$modename: warning: \`-release' is ignored for convenience libraries" 1>&2 fi else # Parse the version information argument. save_ifs="$IFS"; IFS=':' set dummy $vinfo 0 0 0 IFS="$save_ifs" if test -n "$8"; then $echo "$modename: too many parameters to \`-version-info'" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE fi # convert absolute version numbers to libtool ages # this retains compatibility with .la files and attempts # to make the code below a bit more comprehensible case $vinfo_number in yes) number_major="$2" number_minor="$3" number_revision="$4" # # There are really only two kinds -- those that # use the current revision as the major version # and those that subtract age and use age as # a minor version. But, then there is irix # which has an extra 1 added just for fun # case $version_type in darwin|linux|osf|windows) current=`expr $number_major + $number_minor` age="$number_minor" revision="$number_revision" ;; freebsd-aout|freebsd-elf|sunos) current="$number_major" revision="$number_minor" age="0" ;; irix|nonstopux) current=`expr $number_major + $number_minor - 1` age="$number_minor" revision="$number_minor" ;; esac ;; no) current="$2" revision="$3" age="$4" ;; esac # Check that each of the things are valid numbers. case $current in [0-9]*) ;; *) $echo "$modename: CURRENT \`$current' is not a nonnegative integer" 1>&2 $echo "$modename: \`$vinfo' is not valid version information" 1>&2 exit $EXIT_FAILURE ;; esac case $revision in [0-9]*) ;; *) $echo "$modename: REVISION \`$revision' is not a nonnegative integer" 1>&2 $echo "$modename: \`$vinfo' is not valid version information" 1>&2 exit $EXIT_FAILURE ;; esac case $age in [0-9]*) ;; *) $echo "$modename: AGE \`$age' is not a nonnegative integer" 1>&2 $echo "$modename: \`$vinfo' is not valid version information" 1>&2 exit $EXIT_FAILURE ;; esac if test "$age" -gt "$current"; then $echo "$modename: AGE \`$age' is greater than the current interface number \`$current'" 1>&2 $echo "$modename: \`$vinfo' is not valid version information" 1>&2 exit $EXIT_FAILURE fi # Calculate the version variables. major= versuffix= verstring= case $version_type in none) ;; darwin) # Like Linux, but with the current version available in # verstring for coding it into the library header major=.`expr $current - $age` versuffix="$major.$age.$revision" # Darwin ld doesn't like 0 for these options... minor_current=`expr $current + 1` verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" ;; freebsd-aout) major=".$current" versuffix=".$current.$revision"; ;; freebsd-elf) major=".$current" versuffix=".$current"; ;; irix | nonstopux) major=`expr $current - $age + 1` case $version_type in nonstopux) verstring_prefix=nonstopux ;; *) verstring_prefix=sgi ;; esac verstring="$verstring_prefix$major.$revision" # Add in all the interfaces that we are compatible with. loop=$revision while test "$loop" -ne 0; do iface=`expr $revision - $loop` loop=`expr $loop - 1` verstring="$verstring_prefix$major.$iface:$verstring" done # Before this point, $major must not contain `.'. major=.$major versuffix="$major.$revision" ;; linux) major=.`expr $current - $age` versuffix="$major.$age.$revision" ;; osf) major=.`expr $current - $age` versuffix=".$current.$age.$revision" verstring="$current.$age.$revision" # Add in all the interfaces that we are compatible with. loop=$age while test "$loop" -ne 0; do iface=`expr $current - $loop` loop=`expr $loop - 1` verstring="$verstring:${iface}.0" done # Make executables depend on our current version. verstring="$verstring:${current}.0" ;; sunos) major=".$current" versuffix=".$current.$revision" ;; windows) # Use '-' rather than '.', since we only want one # extension on DOS 8.3 filesystems. major=`expr $current - $age` versuffix="-$major" ;; *) $echo "$modename: unknown library version type \`$version_type'" 1>&2 $echo "Fatal configuration error. See the $PACKAGE docs for more information." 1>&2 exit $EXIT_FAILURE ;; esac # Clear the version info if we defaulted, and they specified a release. if test -z "$vinfo" && test -n "$release"; then major= case $version_type in darwin) # we can't check for "0.0" in archive_cmds due to quoting # problems, so we reset it completely verstring= ;; *) verstring="0.0" ;; esac if test "$need_version" = no; then versuffix= else versuffix=".0.0" fi fi # Remove version info from name if versioning should be avoided if test "$avoid_version" = yes && test "$need_version" = no; then major= versuffix= verstring="" fi # Check to see if the archive will have undefined symbols. if test "$allow_undefined" = yes; then if test "$allow_undefined_flag" = unsupported; then $echo "$modename: warning: undefined symbols not allowed in $host shared libraries" 1>&2 build_libtool_libs=no build_old_libs=yes fi else # Don't allow undefined symbols. allow_undefined_flag="$no_undefined_flag" fi fi if test "$mode" != relink; then # Remove our outputs, but don't remove object files since they # may have been created when compiling PIC objects. removelist= tempremovelist=`$echo "$output_objdir/*"` for p in $tempremovelist; do case $p in *.$objext) ;; $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*) if test "X$precious_files_regex" != "X"; then if echo $p | $EGREP -e "$precious_files_regex" >/dev/null 2>&1 then continue fi fi removelist="$removelist $p" ;; *) ;; esac done if test -n "$removelist"; then $show "${rm}r $removelist" $run ${rm}r $removelist fi fi # Now set the variables for building old libraries. if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then oldlibs="$oldlibs $output_objdir/$libname.$libext" # Transform .lo files to .o files. oldobjs="$objs "`$echo "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}'$/d' -e "$lo2o" | $NL2SP` fi # Eliminate all temporary directories. for path in $notinst_path; do lib_search_path=`$echo "$lib_search_path " | ${SED} -e 's% $path % %g'` deplibs=`$echo "$deplibs " | ${SED} -e 's% -L$path % %g'` dependency_libs=`$echo "$dependency_libs " | ${SED} -e 's% -L$path % %g'` done if test -n "$xrpath"; then # If the user specified any rpath flags, then add them. temp_xrpath= for libdir in $xrpath; do temp_xrpath="$temp_xrpath -R$libdir" case "$finalize_rpath " in *" $libdir "*) ;; *) finalize_rpath="$finalize_rpath $libdir" ;; esac done if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; then dependency_libs="$temp_xrpath $dependency_libs" fi fi # Make sure dlfiles contains only unique files that won't be dlpreopened old_dlfiles="$dlfiles" dlfiles= for lib in $old_dlfiles; do case " $dlprefiles $dlfiles " in *" $lib "*) ;; *) dlfiles="$dlfiles $lib" ;; esac done # Make sure dlprefiles contains only unique files old_dlprefiles="$dlprefiles" dlprefiles= for lib in $old_dlprefiles; do case "$dlprefiles " in *" $lib "*) ;; *) dlprefiles="$dlprefiles $lib" ;; esac done if test "$build_libtool_libs" = yes; then if test -n "$rpath"; then case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos*) # these systems don't actually have a c library (as such)! ;; *-*-rhapsody* | *-*-darwin1.[012]) # Rhapsody C library is in the System framework deplibs="$deplibs -framework System" ;; *-*-netbsd*) # Don't link with libc until the a.out ld.so is fixed. ;; *-*-openbsd* | *-*-freebsd*) # Do not include libc due to us having libc/libc_r. test "X$arg" = "X-lc" && continue ;; *) # Add libc to deplibs on all other systems if necessary. if test "$build_libtool_need_lc" = "yes"; then deplibs="$deplibs -lc" fi ;; esac fi # Transform deplibs into only deplibs that can be linked in shared. name_save=$name libname_save=$libname release_save=$release versuffix_save=$versuffix major_save=$major # I'm not sure if I'm treating the release correctly. I think # release should show up in the -l (ie -lgmp5) so we don't want to # add it in twice. Is that correct? release="" versuffix="" major="" newdeplibs= droppeddeps=no case $deplibs_check_method in pass_all) # Don't check for shared/static. Everything works. # This might be a little naive. We might want to check # whether the library exists or not. But this is on # osf3 & osf4 and I'm not really sure... Just # implementing what was already the behavior. newdeplibs=$deplibs ;; test_compile) # This code stresses the "libraries are programs" paradigm to its # limits. Maybe even breaks it. We compile a program, linking it # against the deplibs as a proxy for the library. Then we can check # whether they linked in statically or dynamically with ldd. $rm conftest.c cat > conftest.c </dev/null` for potent_lib in $potential_libs; do # Follow soft links. if ls -lLd "$potent_lib" 2>/dev/null \ | grep " -> " >/dev/null; then continue fi # The statement above tries to avoid entering an # endless loop below, in case of cyclic links. # We might still enter an endless loop, since a link # loop can be closed while we follow links, # but so what? potlib="$potent_lib" while test -h "$potlib" 2>/dev/null; do potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'` case $potliblink in [\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";; *) potlib=`$echo "X$potlib" | $Xsed -e 's,[^/]*$,,'`"$potliblink";; esac done if eval $file_magic_cmd \"\$potlib\" 2>/dev/null \ | ${SED} 10q \ | $EGREP "$file_magic_regex" > /dev/null; then newdeplibs="$newdeplibs $a_deplib" a_deplib="" break 2 fi done done fi if test -n "$a_deplib" ; then droppeddeps=yes $echo $echo "*** Warning: linker path does not have real file for library $a_deplib." $echo "*** I have the capability to make that library automatically link in when" $echo "*** you link to this library. But I can only do this if you have a" $echo "*** shared version of the library, which you do not appear to have" $echo "*** because I did check the linker path looking for a file starting" if test -z "$potlib" ; then $echo "*** with $libname but no candidates were found. (...for file magic test)" else $echo "*** with $libname and none of the candidates passed a file format test" $echo "*** using a file magic. Last file checked: $potlib" fi fi else # Add a -L argument. newdeplibs="$newdeplibs $a_deplib" fi done # Gone through all deplibs. ;; match_pattern*) set dummy $deplibs_check_method match_pattern_regex=`expr "$deplibs_check_method" : "$2 \(.*\)"` for a_deplib in $deplibs; do name="`expr $a_deplib : '-l\(.*\)'`" # If $name is empty we are operating on a -L argument. if test -n "$name" && test "$name" != "0"; then if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then case " $predeps $postdeps " in *" $a_deplib "*) newdeplibs="$newdeplibs $a_deplib" a_deplib="" ;; esac fi if test -n "$a_deplib" ; then libname=`eval \\$echo \"$libname_spec\"` for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do potential_libs=`ls $i/$libname[.-]* 2>/dev/null` for potent_lib in $potential_libs; do potlib="$potent_lib" # see symlink-check above in file_magic test if eval $echo \"$potent_lib\" 2>/dev/null \ | ${SED} 10q \ | $EGREP "$match_pattern_regex" > /dev/null; then newdeplibs="$newdeplibs $a_deplib" a_deplib="" break 2 fi done done fi if test -n "$a_deplib" ; then droppeddeps=yes $echo $echo "*** Warning: linker path does not have real file for library $a_deplib." $echo "*** I have the capability to make that library automatically link in when" $echo "*** you link to this library. But I can only do this if you have a" $echo "*** shared version of the library, which you do not appear to have" $echo "*** because I did check the linker path looking for a file starting" if test -z "$potlib" ; then $echo "*** with $libname but no candidates were found. (...for regex pattern test)" else $echo "*** with $libname and none of the candidates passed a file format test" $echo "*** using a regex pattern. Last file checked: $potlib" fi fi else # Add a -L argument. newdeplibs="$newdeplibs $a_deplib" fi done # Gone through all deplibs. ;; none | unknown | *) newdeplibs="" tmp_deplibs=`$echo "X $deplibs" | $Xsed -e 's/ -lc$//' \ -e 's/ -[LR][^ ]*//g'` if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then for i in $predeps $postdeps ; do # can't use Xsed below, because $i might contain '/' tmp_deplibs=`$echo "X $tmp_deplibs" | ${SED} -e "1s,^X,," -e "s,$i,,"` done fi if $echo "X $tmp_deplibs" | $Xsed -e 's/[ ]//g' \ | grep . >/dev/null; then $echo if test "X$deplibs_check_method" = "Xnone"; then $echo "*** Warning: inter-library dependencies are not supported in this platform." else $echo "*** Warning: inter-library dependencies are not known to be supported." fi $echo "*** All declared inter-library dependencies are being dropped." droppeddeps=yes fi ;; esac versuffix=$versuffix_save major=$major_save release=$release_save libname=$libname_save name=$name_save case $host in *-*-rhapsody* | *-*-darwin1.[012]) # On Rhapsody replace the C library is the System framework newdeplibs=`$echo "X $newdeplibs" | $Xsed -e 's/ -lc / -framework System /'` ;; esac if test "$droppeddeps" = yes; then if test "$module" = yes; then $echo $echo "*** Warning: libtool could not satisfy all declared inter-library" $echo "*** dependencies of module $libname. Therefore, libtool will create" $echo "*** a static module, that should work as long as the dlopening" $echo "*** application is linked with the -dlopen flag." if test -z "$global_symbol_pipe"; then $echo $echo "*** However, this would only work if libtool was able to extract symbol" $echo "*** lists from a program, using \`nm' or equivalent, but libtool could" $echo "*** not find such a program. So, this module is probably useless." $echo "*** \`nm' from GNU binutils and a full rebuild may help." fi if test "$build_old_libs" = no; then oldlibs="$output_objdir/$libname.$libext" build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi else $echo "*** The inter-library dependencies that have been dropped here will be" $echo "*** automatically added whenever a program is linked with this library" $echo "*** or is declared to -dlopen it." if test "$allow_undefined" = no; then $echo $echo "*** Since this library must not contain undefined symbols," $echo "*** because either the platform does not support them or" $echo "*** it was explicitly requested with -no-undefined," $echo "*** libtool will only create a static version of it." if test "$build_old_libs" = no; then oldlibs="$output_objdir/$libname.$libext" build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi fi fi fi # Done checking deplibs! deplibs=$newdeplibs fi # All the library-specific variables (install_libdir is set above). library_names= old_library= dlname= # Test again, we may have decided not to build it any more if test "$build_libtool_libs" = yes; then if test "$hardcode_into_libs" = yes; then # Hardcode the library paths hardcode_libdirs= dep_rpath= rpath="$finalize_rpath" test "$mode" != relink && rpath="$compile_rpath$rpath" for libdir in $rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then if test -z "$hardcode_libdirs"; then hardcode_libdirs="$libdir" else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" dep_rpath="$dep_rpath $flag" fi elif test -n "$runpath_var"; then case "$perm_rpath " in *" $libdir "*) ;; *) perm_rpath="$perm_rpath $libdir" ;; esac fi done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir="$hardcode_libdirs" if test -n "$hardcode_libdir_flag_spec_ld"; then eval dep_rpath=\"$hardcode_libdir_flag_spec_ld\" else eval dep_rpath=\"$hardcode_libdir_flag_spec\" fi fi if test -n "$runpath_var" && test -n "$perm_rpath"; then # We should set the runpath_var. rpath= for dir in $perm_rpath; do rpath="$rpath$dir:" done eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var" fi test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs" fi shlibpath="$finalize_shlibpath" test "$mode" != relink && shlibpath="$compile_shlibpath$shlibpath" if test -n "$shlibpath"; then eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var" fi # Get the real and link names of the library. eval shared_ext=\"$shrext_cmds\" eval library_names=\"$library_names_spec\" set dummy $library_names realname="$2" shift; shift if test -n "$soname_spec"; then eval soname=\"$soname_spec\" else soname="$realname" fi if test -z "$dlname"; then dlname=$soname fi lib="$output_objdir/$realname" for link do linknames="$linknames $link" done # Use standard objects if they are pic test -z "$pic_flag" && libobjs=`$echo "X$libobjs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` # Prepare the list of exported symbols if test -z "$export_symbols"; then if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then $show "generating symbol list for \`$libname.la'" export_symbols="$output_objdir/$libname.exp" $run $rm $export_symbols cmds=$export_symbols_cmds save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" eval cmd=\"$cmd\" if len=`expr "X$cmd" : ".*"` && test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then $show "$cmd" $run eval "$cmd" || exit $? skipped_export=false else # The command line is too long to execute in one step. $show "using reloadable object file for export list..." skipped_export=: fi done IFS="$save_ifs" if test -n "$export_symbols_regex"; then $show "$EGREP -e \"$export_symbols_regex\" \"$export_symbols\" > \"${export_symbols}T\"" $run eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' $show "$mv \"${export_symbols}T\" \"$export_symbols\"" $run eval '$mv "${export_symbols}T" "$export_symbols"' fi fi fi if test -n "$export_symbols" && test -n "$include_expsyms"; then $run eval '$echo "X$include_expsyms" | $SP2NL >> "$export_symbols"' fi tmp_deplibs= for test_deplib in $deplibs; do case " $convenience " in *" $test_deplib "*) ;; *) tmp_deplibs="$tmp_deplibs $test_deplib" ;; esac done deplibs="$tmp_deplibs" if test -n "$convenience"; then if test -n "$whole_archive_flag_spec"; then save_libobjs=$libobjs eval libobjs=\"\$libobjs $whole_archive_flag_spec\" else gentop="$output_objdir/${outputname}x" $show "${rm}r $gentop" $run ${rm}r "$gentop" $show "$mkdir $gentop" $run $mkdir "$gentop" status=$? if test "$status" -ne 0 && test ! -d "$gentop"; then exit $status fi generated="$generated $gentop" for xlib in $convenience; do # Extract the objects. case $xlib in [\\/]* | [A-Za-z]:[\\/]*) xabs="$xlib" ;; *) xabs=`pwd`"/$xlib" ;; esac xlib=`$echo "X$xlib" | $Xsed -e 's%^.*/%%'` xdir="$gentop/$xlib" $show "${rm}r $xdir" $run ${rm}r "$xdir" $show "$mkdir $xdir" $run $mkdir "$xdir" status=$? if test "$status" -ne 0 && test ! -d "$xdir"; then exit $status fi # We will extract separately just the conflicting names and we will no # longer touch any unique names. It is faster to leave these extract # automatically by $AR in one run. $show "(cd $xdir && $AR x $xabs)" $run eval "(cd \$xdir && $AR x \$xabs)" || exit $? if ($AR t "$xabs" | sort | sort -uc >/dev/null 2>&1); then : else $echo "$modename: warning: object name conflicts; renaming object files" 1>&2 $echo "$modename: warning: to ensure that they will not overwrite" 1>&2 $AR t "$xabs" | sort | uniq -cd | while read -r count name do i=1 while test "$i" -le "$count" do # Put our $i before any first dot (extension) # Never overwrite any file name_to="$name" while test "X$name_to" = "X$name" || test -f "$xdir/$name_to" do name_to=`$echo "X$name_to" | $Xsed -e "s/\([^.]*\)/\1-$i/"` done $show "(cd $xdir && $AR xN $i $xabs '$name' && $mv '$name' '$name_to')" $run eval "(cd \$xdir && $AR xN $i \$xabs '$name' && $mv '$name' '$name_to')" || exit $? i=`expr $i + 1` done done fi libobjs="$libobjs "`find $xdir -name \*.$objext -print -o -name \*.lo -print | $NL2SP` done fi fi if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then eval flag=\"$thread_safe_flag_spec\" linker_flags="$linker_flags $flag" fi # Make a backup of the uninstalled library when relinking if test "$mode" = relink; then $run eval '(cd $output_objdir && $rm ${realname}U && $mv $realname ${realname}U)' || exit $? fi # Do each of the archive commands. if test "$module" = yes && test -n "$module_cmds" ; then if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then eval test_cmds=\"$module_expsym_cmds\" cmds=$module_expsym_cmds else eval test_cmds=\"$module_cmds\" cmds=$module_cmds fi else if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then eval test_cmds=\"$archive_expsym_cmds\" cmds=$archive_expsym_cmds else eval test_cmds=\"$archive_cmds\" cmds=$archive_cmds fi fi if test "X$skipped_export" != "X:" && len=`expr "X$test_cmds" : ".*"` && test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then : else # The command line is too long to link in one step, link piecewise. $echo "creating reloadable object files..." # Save the value of $output and $libobjs because we want to # use them later. If we have whole_archive_flag_spec, we # want to use save_libobjs as it was before # whole_archive_flag_spec was expanded, because we can't # assume the linker understands whole_archive_flag_spec. # This may have to be revisited, in case too many # convenience libraries get linked in and end up exceeding # the spec. if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then save_libobjs=$libobjs fi save_output=$output # Clear the reloadable object creation command queue and # initialize k to one. test_cmds= concat_cmds= objlist= delfiles= last_robj= k=1 output=$output_objdir/$save_output-${k}.$objext # Loop over the list of objects to be linked. for obj in $save_libobjs do eval test_cmds=\"$reload_cmds $objlist $last_robj\" if test "X$objlist" = X || { len=`expr "X$test_cmds" : ".*"` && test "$len" -le "$max_cmd_len"; }; then objlist="$objlist $obj" else # The command $test_cmds is almost too long, add a # command to the queue. if test "$k" -eq 1 ; then # The first file doesn't have a previous command to add. eval concat_cmds=\"$reload_cmds $objlist $last_robj\" else # All subsequent reloadable object files will link in # the last one created. eval concat_cmds=\"\$concat_cmds~$reload_cmds $objlist $last_robj\" fi last_robj=$output_objdir/$save_output-${k}.$objext k=`expr $k + 1` output=$output_objdir/$save_output-${k}.$objext objlist=$obj len=1 fi done # Handle the remaining objects by creating one last # reloadable object file. All subsequent reloadable object # files will link in the last one created. test -z "$concat_cmds" || concat_cmds=$concat_cmds~ eval concat_cmds=\"\${concat_cmds}$reload_cmds $objlist $last_robj\" if ${skipped_export-false}; then $show "generating symbol list for \`$libname.la'" export_symbols="$output_objdir/$libname.exp" $run $rm $export_symbols libobjs=$output # Append the command to create the export file. eval concat_cmds=\"\$concat_cmds~$export_symbols_cmds\" fi # Set up a command to remove the reloadale object files # after they are used. i=0 while test "$i" -lt "$k" do i=`expr $i + 1` delfiles="$delfiles $output_objdir/$save_output-${i}.$objext" done $echo "creating a temporary reloadable object file: $output" # Loop through the commands generated above and execute them. save_ifs="$IFS"; IFS='~' for cmd in $concat_cmds; do IFS="$save_ifs" $show "$cmd" $run eval "$cmd" || exit $? done IFS="$save_ifs" libobjs=$output # Restore the value of output. output=$save_output if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then eval libobjs=\"\$libobjs $whole_archive_flag_spec\" fi # Expand the library linking commands again to reset the # value of $libobjs for piecewise linking. # Do each of the archive commands. if test "$module" = yes && test -n "$module_cmds" ; then if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then cmds=$module_expsym_cmds else cmds=$module_cmds fi else if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then cmds=$archive_expsym_cmds else cmds=$archive_cmds fi fi # Append the command to remove the reloadable object files # to the just-reset $cmds. eval cmds=\"\$cmds~\$rm $delfiles\" fi save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" eval cmd=\"$cmd\" $show "$cmd" $run eval "$cmd" || exit $? done IFS="$save_ifs" # Restore the uninstalled library and exit if test "$mode" = relink; then $run eval '(cd $output_objdir && $rm ${realname}T && $mv $realname ${realname}T && $mv "$realname"U $realname)' || exit $? exit $EXIT_SUCCESS fi # Create links to the real library. for linkname in $linknames; do if test "$realname" != "$linkname"; then $show "(cd $output_objdir && $rm $linkname && $LN_S $realname $linkname)" $run eval '(cd $output_objdir && $rm $linkname && $LN_S $realname $linkname)' || exit $? fi done # If -module or -export-dynamic was specified, set the dlname. if test "$module" = yes || test "$export_dynamic" = yes; then # On all known operating systems, these are identical. dlname="$soname" fi fi ;; obj) if test -n "$deplibs"; then $echo "$modename: warning: \`-l' and \`-L' are ignored for objects" 1>&2 fi if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then $echo "$modename: warning: \`-dlopen' is ignored for objects" 1>&2 fi if test -n "$rpath"; then $echo "$modename: warning: \`-rpath' is ignored for objects" 1>&2 fi if test -n "$xrpath"; then $echo "$modename: warning: \`-R' is ignored for objects" 1>&2 fi if test -n "$vinfo"; then $echo "$modename: warning: \`-version-info' is ignored for objects" 1>&2 fi if test -n "$release"; then $echo "$modename: warning: \`-release' is ignored for objects" 1>&2 fi case $output in *.lo) if test -n "$objs$old_deplibs"; then $echo "$modename: cannot build library object \`$output' from non-libtool objects" 1>&2 exit $EXIT_FAILURE fi libobj="$output" obj=`$echo "X$output" | $Xsed -e "$lo2o"` ;; *) libobj= obj="$output" ;; esac # Delete the old objects. $run $rm $obj $libobj # Objects from convenience libraries. This assumes # single-version convenience libraries. Whenever we create # different ones for PIC/non-PIC, this we'll have to duplicate # the extraction. reload_conv_objs= gentop= # reload_cmds runs $LD directly, so let us get rid of # -Wl from whole_archive_flag_spec wl= if test -n "$convenience"; then if test -n "$whole_archive_flag_spec"; then eval reload_conv_objs=\"\$reload_objs $whole_archive_flag_spec\" else gentop="$output_objdir/${obj}x" $show "${rm}r $gentop" $run ${rm}r "$gentop" $show "$mkdir $gentop" $run $mkdir "$gentop" status=$? if test "$status" -ne 0 && test ! -d "$gentop"; then exit $status fi generated="$generated $gentop" for xlib in $convenience; do # Extract the objects. case $xlib in [\\/]* | [A-Za-z]:[\\/]*) xabs="$xlib" ;; *) xabs=`pwd`"/$xlib" ;; esac xlib=`$echo "X$xlib" | $Xsed -e 's%^.*/%%'` xdir="$gentop/$xlib" $show "${rm}r $xdir" $run ${rm}r "$xdir" $show "$mkdir $xdir" $run $mkdir "$xdir" status=$? if test "$status" -ne 0 && test ! -d "$xdir"; then exit $status fi # We will extract separately just the conflicting names and we will no # longer touch any unique names. It is faster to leave these extract # automatically by $AR in one run. $show "(cd $xdir && $AR x $xabs)" $run eval "(cd \$xdir && $AR x \$xabs)" || exit $? if ($AR t "$xabs" | sort | sort -uc >/dev/null 2>&1); then : else $echo "$modename: warning: object name conflicts; renaming object files" 1>&2 $echo "$modename: warning: to ensure that they will not overwrite" 1>&2 $AR t "$xabs" | sort | uniq -cd | while read -r count name do i=1 while test "$i" -le "$count" do # Put our $i before any first dot (extension) # Never overwrite any file name_to="$name" while test "X$name_to" = "X$name" || test -f "$xdir/$name_to" do name_to=`$echo "X$name_to" | $Xsed -e "s/\([^.]*\)/\1-$i/"` done $show "(cd $xdir && $AR xN $i $xabs '$name' && $mv '$name' '$name_to')" $run eval "(cd \$xdir && $AR xN $i \$xabs '$name' && $mv '$name' '$name_to')" || exit $? i=`expr $i + 1` done done fi reload_conv_objs="$reload_objs "`find $xdir -name \*.$objext -print -o -name \*.lo -print | $NL2SP` done fi fi # Create the old-style object. reload_objs="$objs$old_deplibs "`$echo "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}$'/d' -e '/\.lib$/d' -e "$lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test output="$obj" cmds=$reload_cmds save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" eval cmd=\"$cmd\" $show "$cmd" $run eval "$cmd" || exit $? done IFS="$save_ifs" # Exit if we aren't doing a library object file. if test -z "$libobj"; then if test -n "$gentop"; then $show "${rm}r $gentop" $run ${rm}r $gentop fi exit $EXIT_SUCCESS fi if test "$build_libtool_libs" != yes; then if test -n "$gentop"; then $show "${rm}r $gentop" $run ${rm}r $gentop fi # Create an invalid libtool object if no PIC, so that we don't # accidentally link it into a program. # $show "echo timestamp > $libobj" # $run eval "echo timestamp > $libobj" || exit $? exit $EXIT_SUCCESS fi if test -n "$pic_flag" || test "$pic_mode" != default; then # Only do commands if we really have different PIC objects. reload_objs="$libobjs $reload_conv_objs" output="$libobj" cmds=$reload_cmds save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" eval cmd=\"$cmd\" $show "$cmd" $run eval "$cmd" || exit $? done IFS="$save_ifs" fi if test -n "$gentop"; then $show "${rm}r $gentop" $run ${rm}r $gentop fi exit $EXIT_SUCCESS ;; prog) case $host in *cygwin*) output=`$echo $output | ${SED} -e 's,.exe$,,;s,$,.exe,'` ;; esac if test -n "$vinfo"; then $echo "$modename: warning: \`-version-info' is ignored for programs" 1>&2 fi if test -n "$release"; then $echo "$modename: warning: \`-release' is ignored for programs" 1>&2 fi if test "$preload" = yes; then if test "$dlopen_support" = unknown && test "$dlopen_self" = unknown && test "$dlopen_self_static" = unknown; then $echo "$modename: warning: \`AC_LIBTOOL_DLOPEN' not used. Assuming no dlopen support." fi fi case $host in *-*-rhapsody* | *-*-darwin1.[012]) # On Rhapsody replace the C library is the System framework compile_deplibs=`$echo "X $compile_deplibs" | $Xsed -e 's/ -lc / -framework System /'` finalize_deplibs=`$echo "X $finalize_deplibs" | $Xsed -e 's/ -lc / -framework System /'` ;; esac case $host in *darwin*) # Don't allow lazy linking, it breaks C++ global constructors if test "$tagname" = CXX ; then compile_command="$compile_command ${wl}-bind_at_load" finalize_command="$finalize_command ${wl}-bind_at_load" fi ;; esac compile_command="$compile_command $compile_deplibs" finalize_command="$finalize_command $finalize_deplibs" if test -n "$rpath$xrpath"; then # If the user specified any rpath flags, then add them. for libdir in $rpath $xrpath; do # This is the magic to use -rpath. case "$finalize_rpath " in *" $libdir "*) ;; *) finalize_rpath="$finalize_rpath $libdir" ;; esac done fi # Now hardcode the library paths rpath= hardcode_libdirs= for libdir in $compile_rpath $finalize_rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then if test -z "$hardcode_libdirs"; then hardcode_libdirs="$libdir" else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" rpath="$rpath $flag" fi elif test -n "$runpath_var"; then case "$perm_rpath " in *" $libdir "*) ;; *) perm_rpath="$perm_rpath $libdir" ;; esac fi case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*) case :$dllsearchpath: in *":$libdir:"*) ;; *) dllsearchpath="$dllsearchpath:$libdir";; esac ;; esac done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir="$hardcode_libdirs" eval rpath=\" $hardcode_libdir_flag_spec\" fi compile_rpath="$rpath" rpath= hardcode_libdirs= for libdir in $finalize_rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then if test -z "$hardcode_libdirs"; then hardcode_libdirs="$libdir" else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" rpath="$rpath $flag" fi elif test -n "$runpath_var"; then case "$finalize_perm_rpath " in *" $libdir "*) ;; *) finalize_perm_rpath="$finalize_perm_rpath $libdir" ;; esac fi done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir="$hardcode_libdirs" eval rpath=\" $hardcode_libdir_flag_spec\" fi finalize_rpath="$rpath" if test -n "$libobjs" && test "$build_old_libs" = yes; then # Transform all the library objects into standard objects. compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` finalize_command=`$echo "X$finalize_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` fi dlsyms= if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then if test -n "$NM" && test -n "$global_symbol_pipe"; then dlsyms="${outputname}S.c" else $echo "$modename: not configured to extract global symbols from dlpreopened files" 1>&2 fi fi if test -n "$dlsyms"; then case $dlsyms in "") ;; *.c) # Discover the nlist of each of the dlfiles. nlist="$output_objdir/${outputname}.nm" $show "$rm $nlist ${nlist}S ${nlist}T" $run $rm "$nlist" "${nlist}S" "${nlist}T" # Parse the name list into a source file. $show "creating $output_objdir/$dlsyms" test -z "$run" && $echo > "$output_objdir/$dlsyms" "\ /* $dlsyms - symbol resolution table for \`$outputname' dlsym emulation. */ /* Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP */ #ifdef __cplusplus extern \"C\" { #endif /* Prevent the only kind of declaration conflicts we can make. */ #define lt_preloaded_symbols some_other_symbol /* External symbol declarations for the compiler. */\ " if test "$dlself" = yes; then $show "generating symbol list for \`$output'" test -z "$run" && $echo ': @PROGRAM@ ' > "$nlist" # Add our own program objects to the symbol list. progfiles=`$echo "X$objs$old_deplibs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` for arg in $progfiles; do $show "extracting global C symbols from \`$arg'" $run eval "$NM $arg | $global_symbol_pipe >> '$nlist'" done if test -n "$exclude_expsyms"; then $run eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' $run eval '$mv "$nlist"T "$nlist"' fi if test -n "$export_symbols_regex"; then $run eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T' $run eval '$mv "$nlist"T "$nlist"' fi # Prepare the list of exported symbols if test -z "$export_symbols"; then export_symbols="$output_objdir/$output.exp" $run $rm $export_symbols $run eval "${SED} -n -e '/^: @PROGRAM@$/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' else $run eval "${SED} -e 's/\([][.*^$]\)/\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$output.exp"' $run eval 'grep -f "$output_objdir/$output.exp" < "$nlist" > "$nlist"T' $run eval 'mv "$nlist"T "$nlist"' fi fi for arg in $dlprefiles; do $show "extracting global C symbols from \`$arg'" name=`$echo "$arg" | ${SED} -e 's%^.*/%%'` $run eval '$echo ": $name " >> "$nlist"' $run eval "$NM $arg | $global_symbol_pipe >> '$nlist'" done if test -z "$run"; then # Make sure we have at least an empty file. test -f "$nlist" || : > "$nlist" if test -n "$exclude_expsyms"; then $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T $mv "$nlist"T "$nlist" fi # Try sorting and uniquifying the output. if grep -v "^: " < "$nlist" | if sort -k 3 /dev/null 2>&1; then sort -k 3 else sort +2 fi | uniq > "$nlist"S; then : else grep -v "^: " < "$nlist" > "$nlist"S fi if test -f "$nlist"S; then eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$dlsyms"' else $echo '/* NONE */' >> "$output_objdir/$dlsyms" fi $echo >> "$output_objdir/$dlsyms" "\ #undef lt_preloaded_symbols #if defined (__STDC__) && __STDC__ # define lt_ptr void * #else # define lt_ptr char * # define const #endif /* The mapping between symbol names and symbols. */ const struct { const char *name; lt_ptr address; } lt_preloaded_symbols[] = {\ " eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$dlsyms" $echo >> "$output_objdir/$dlsyms" "\ {0, (lt_ptr) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt_preloaded_symbols; } #endif #ifdef __cplusplus } #endif\ " fi pic_flag_for_symtable= case $host in # compiling the symbol table file with pic_flag works around # a FreeBSD bug that causes programs to crash when -lm is # linked before any other PIC object. But we must not use # pic_flag when linking with -static. The problem exists in # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1. *-*-freebsd2*|*-*-freebsd3.0*|*-*-freebsdelf3.0*) case "$compile_command " in *" -static "*) ;; *) pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND";; esac;; *-*-hpux*) case "$compile_command " in *" -static "*) ;; *) pic_flag_for_symtable=" $pic_flag";; esac esac # Now compile the dynamic symbol file. $show "(cd $output_objdir && $LTCC -c$no_builtin_flag$pic_flag_for_symtable \"$dlsyms\")" $run eval '(cd $output_objdir && $LTCC -c$no_builtin_flag$pic_flag_for_symtable "$dlsyms")' || exit $? # Clean up the generated files. $show "$rm $output_objdir/$dlsyms $nlist ${nlist}S ${nlist}T" $run $rm "$output_objdir/$dlsyms" "$nlist" "${nlist}S" "${nlist}T" # Transform the symbol file into the correct name. compile_command=`$echo "X$compile_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%"` finalize_command=`$echo "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%"` ;; *) $echo "$modename: unknown suffix for \`$dlsyms'" 1>&2 exit $EXIT_FAILURE ;; esac else # We keep going just in case the user didn't refer to # lt_preloaded_symbols. The linker will fail if global_symbol_pipe # really was required. # Nullify the symbol file. compile_command=`$echo "X$compile_command" | $Xsed -e "s% @SYMFILE@%%"` finalize_command=`$echo "X$finalize_command" | $Xsed -e "s% @SYMFILE@%%"` fi if test "$need_relink" = no || test "$build_libtool_libs" != yes; then # Replace the output file specification. compile_command=`$echo "X$compile_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'` link_command="$compile_command$compile_rpath" # We have no uninstalled library dependencies, so finalize right now. $show "$link_command" $run eval "$link_command" status=$? # Delete the generated files. if test -n "$dlsyms"; then $show "$rm $output_objdir/${outputname}S.${objext}" $run $rm "$output_objdir/${outputname}S.${objext}" fi exit $status fi if test -n "$shlibpath_var"; then # We should set the shlibpath_var rpath= for dir in $temp_rpath; do case $dir in [\\/]* | [A-Za-z]:[\\/]*) # Absolute path. rpath="$rpath$dir:" ;; *) # Relative path: add a thisdir entry. rpath="$rpath\$thisdir/$dir:" ;; esac done temp_rpath="$rpath" fi if test -n "$compile_shlibpath$finalize_shlibpath"; then compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command" fi if test -n "$finalize_shlibpath"; then finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command" fi compile_var= finalize_var= if test -n "$runpath_var"; then if test -n "$perm_rpath"; then # We should set the runpath_var. rpath= for dir in $perm_rpath; do rpath="$rpath$dir:" done compile_var="$runpath_var=\"$rpath\$$runpath_var\" " fi if test -n "$finalize_perm_rpath"; then # We should set the runpath_var. rpath= for dir in $finalize_perm_rpath; do rpath="$rpath$dir:" done finalize_var="$runpath_var=\"$rpath\$$runpath_var\" " fi fi if test "$no_install" = yes; then # We don't need to create a wrapper script. link_command="$compile_var$compile_command$compile_rpath" # Replace the output file specification. link_command=`$echo "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'` # Delete the old output file. $run $rm $output # Link the executable and exit $show "$link_command" $run eval "$link_command" || exit $? exit $EXIT_SUCCESS fi if test "$hardcode_action" = relink; then # Fast installation is not supported link_command="$compile_var$compile_command$compile_rpath" relink_command="$finalize_var$finalize_command$finalize_rpath" $echo "$modename: warning: this platform does not like uninstalled shared libraries" 1>&2 $echo "$modename: \`$output' will be relinked during installation" 1>&2 else if test "$fast_install" != no; then link_command="$finalize_var$compile_command$finalize_rpath" if test "$fast_install" = yes; then relink_command=`$echo "X$compile_var$compile_command$compile_rpath" | $Xsed -e 's%@OUTPUT@%\$progdir/\$file%g'` else # fast_install is set to needless relink_command= fi else link_command="$compile_var$compile_command$compile_rpath" relink_command="$finalize_var$finalize_command$finalize_rpath" fi fi # Replace the output file specification. link_command=`$echo "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` # Delete the old output files. $run $rm $output $output_objdir/$outputname $output_objdir/lt-$outputname $show "$link_command" $run eval "$link_command" || exit $? # Now create the wrapper script. $show "creating $output" # Quote the relink command for shipping. if test -n "$relink_command"; then # Preserve any variables that may affect compiler behavior for var in $variables_saved_for_relink; do if eval test -z \"\${$var+set}\"; then relink_command="{ test -z \"\${$var+set}\" || unset $var || { $var=; export $var; }; }; $relink_command" elif eval var_value=\$$var; test -z "$var_value"; then relink_command="$var=; export $var; $relink_command" else var_value=`$echo "X$var_value" | $Xsed -e "$sed_quote_subst"` relink_command="$var=\"$var_value\"; export $var; $relink_command" fi done relink_command="(cd `pwd`; $relink_command)" relink_command=`$echo "X$relink_command" | $Xsed -e "$sed_quote_subst"` fi # Quote $echo for shipping. if test "X$echo" = "X$SHELL $progpath --fallback-echo"; then case $progpath in [\\/]* | [A-Za-z]:[\\/]*) qecho="$SHELL $progpath --fallback-echo";; *) qecho="$SHELL `pwd`/$progpath --fallback-echo";; esac qecho=`$echo "X$qecho" | $Xsed -e "$sed_quote_subst"` else qecho=`$echo "X$echo" | $Xsed -e "$sed_quote_subst"` fi # Only actually do things if our run command is non-null. if test -z "$run"; then # win32 will think the script is a binary if it has # a .exe suffix, so we strip it off here. case $output in *.exe) output=`$echo $output|${SED} 's,.exe$,,'` ;; esac # test for cygwin because mv fails w/o .exe extensions case $host in *cygwin*) exeext=.exe outputname=`$echo $outputname|${SED} 's,.exe$,,'` ;; *) exeext= ;; esac case $host in *cygwin* | *mingw* ) cwrappersource=`$echo ${objdir}/lt-${output}.c` cwrapper=`$echo ${output}.exe` $rm $cwrappersource $cwrapper trap "$rm $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15 cat > $cwrappersource <> $cwrappersource<<"EOF" #include #include #include #include #include #include #if defined(PATH_MAX) # define LT_PATHMAX PATH_MAX #elif defined(MAXPATHLEN) # define LT_PATHMAX MAXPATHLEN #else # define LT_PATHMAX 1024 #endif #ifndef DIR_SEPARATOR #define DIR_SEPARATOR '/' #endif #if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \ defined (__OS2__) #define HAVE_DOS_BASED_FILE_SYSTEM #ifndef DIR_SEPARATOR_2 #define DIR_SEPARATOR_2 '\\' #endif #endif #ifndef DIR_SEPARATOR_2 # define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR) #else /* DIR_SEPARATOR_2 */ # define IS_DIR_SEPARATOR(ch) \ (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2)) #endif /* DIR_SEPARATOR_2 */ #define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type))) #define XFREE(stale) do { \ if (stale) { free ((void *) stale); stale = 0; } \ } while (0) const char *program_name = NULL; void * xmalloc (size_t num); char * xstrdup (const char *string); char * basename (const char *name); char * fnqualify(const char *path); char * strendzap(char *str, const char *pat); void lt_fatal (const char *message, ...); int main (int argc, char *argv[]) { char **newargz; int i; program_name = (char *) xstrdup ((char *) basename (argv[0])); newargz = XMALLOC(char *, argc+2); EOF cat >> $cwrappersource <> $cwrappersource <<"EOF" newargz[1] = fnqualify(argv[0]); /* we know the script has the same name, without the .exe */ /* so make sure newargz[1] doesn't end in .exe */ strendzap(newargz[1],".exe"); for (i = 1; i < argc; i++) newargz[i+1] = xstrdup(argv[i]); newargz[argc+1] = NULL; EOF cat >> $cwrappersource <> $cwrappersource <<"EOF" } void * xmalloc (size_t num) { void * p = (void *) malloc (num); if (!p) lt_fatal ("Memory exhausted"); return p; } char * xstrdup (const char *string) { return string ? strcpy ((char *) xmalloc (strlen (string) + 1), string) : NULL ; } char * basename (const char *name) { const char *base; #if defined (HAVE_DOS_BASED_FILE_SYSTEM) /* Skip over the disk name in MSDOS pathnames. */ if (isalpha (name[0]) && name[1] == ':') name += 2; #endif for (base = name; *name; name++) if (IS_DIR_SEPARATOR (*name)) base = name + 1; return (char *) base; } char * fnqualify(const char *path) { size_t size; char *p; char tmp[LT_PATHMAX + 1]; assert(path != NULL); /* Is it qualified already? */ #if defined (HAVE_DOS_BASED_FILE_SYSTEM) if (isalpha (path[0]) && path[1] == ':') return xstrdup (path); #endif if (IS_DIR_SEPARATOR (path[0])) return xstrdup (path); /* prepend the current directory */ /* doesn't handle '~' */ if (getcwd (tmp, LT_PATHMAX) == NULL) lt_fatal ("getcwd failed"); size = strlen(tmp) + 1 + strlen(path) + 1; /* +2 for '/' and '\0' */ p = XMALLOC(char, size); sprintf(p, "%s%c%s", tmp, DIR_SEPARATOR, path); return p; } char * strendzap(char *str, const char *pat) { size_t len, patlen; assert(str != NULL); assert(pat != NULL); len = strlen(str); patlen = strlen(pat); if (patlen <= len) { str += len - patlen; if (strcmp(str, pat) == 0) *str = '\0'; } return str; } static void lt_error_core (int exit_status, const char * mode, const char * message, va_list ap) { fprintf (stderr, "%s: %s: ", program_name, mode); vfprintf (stderr, message, ap); fprintf (stderr, ".\n"); if (exit_status >= 0) exit (exit_status); } void lt_fatal (const char *message, ...) { va_list ap; va_start (ap, message); lt_error_core (EXIT_FAILURE, "FATAL", message, ap); va_end (ap); } EOF # we should really use a build-platform specific compiler # here, but OTOH, the wrappers (shell script and this C one) # are only useful if you want to execute the "real" binary. # Since the "real" binary is built for $host, then this # wrapper might as well be built for $host, too. $run $LTCC -s -o $cwrapper $cwrappersource ;; esac $rm $output trap "$rm $output; exit $EXIT_FAILURE" 1 2 15 $echo > $output "\ #! $SHELL # $output - temporary wrapper script for $objdir/$outputname # Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP # # The $output program cannot be directly executed until all the libtool # libraries that it depends on are installed. # # This wrapper script should never be moved out of the build directory. # If it is, it will not operate correctly. # Sed substitution that helps us do robust quoting. It backslashifies # metacharacters that are still active within double-quoted strings. Xsed='${SED} -e 1s/^X//' sed_quote_subst='$sed_quote_subst' # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. if test \"\${CDPATH+set}\" = set; then CDPATH=:; export CDPATH; fi relink_command=\"$relink_command\" # This environment variable determines our operation mode. if test \"\$libtool_install_magic\" = \"$magic\"; then # install mode needs the following variable: notinst_deplibs='$notinst_deplibs' else # When we are sourced in execute mode, \$file and \$echo are already set. if test \"\$libtool_execute_magic\" != \"$magic\"; then echo=\"$qecho\" file=\"\$0\" # Make sure echo works. if test \"X\$1\" = X--no-reexec; then # Discard the --no-reexec flag, and continue. shift elif test \"X\`(\$echo '\t') 2>/dev/null\`\" = 'X\t'; then # Yippee, \$echo works! : else # Restart under the correct shell, and then maybe \$echo will work. exec $SHELL \"\$0\" --no-reexec \${1+\"\$@\"} fi fi\ " $echo >> $output "\ # Find the directory that this script lives in. thisdir=\`\$echo \"X\$file\" | \$Xsed -e 's%/[^/]*$%%'\` test \"x\$thisdir\" = \"x\$file\" && thisdir=. # Follow symbolic links until we get to the real thisdir. file=\`ls -ld \"\$file\" | ${SED} -n 's/.*-> //p'\` while test -n \"\$file\"; do destdir=\`\$echo \"X\$file\" | \$Xsed -e 's%/[^/]*\$%%'\` # If there was a directory component, then change thisdir. if test \"x\$destdir\" != \"x\$file\"; then case \"\$destdir\" in [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;; *) thisdir=\"\$thisdir/\$destdir\" ;; esac fi file=\`\$echo \"X\$file\" | \$Xsed -e 's%^.*/%%'\` file=\`ls -ld \"\$thisdir/\$file\" | ${SED} -n 's/.*-> //p'\` done # Try to get the absolute directory name. absdir=\`cd \"\$thisdir\" && pwd\` test -n \"\$absdir\" && thisdir=\"\$absdir\" " if test "$fast_install" = yes; then $echo >> $output "\ program=lt-'$outputname'$exeext progdir=\"\$thisdir/$objdir\" if test ! -f \"\$progdir/\$program\" || \\ { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | ${SED} 1q\`; \\ test \"X\$file\" != \"X\$progdir/\$program\"; }; then file=\"\$\$-\$program\" if test ! -d \"\$progdir\"; then $mkdir \"\$progdir\" else $rm \"\$progdir/\$file\" fi" $echo >> $output "\ # relink executable if necessary if test -n \"\$relink_command\"; then if relink_command_output=\`eval \$relink_command 2>&1\`; then : else $echo \"\$relink_command_output\" >&2 $rm \"\$progdir/\$file\" exit $EXIT_FAILURE fi fi $mv \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null || { $rm \"\$progdir/\$program\"; $mv \"\$progdir/\$file\" \"\$progdir/\$program\"; } $rm \"\$progdir/\$file\" fi" else $echo >> $output "\ program='$outputname' progdir=\"\$thisdir/$objdir\" " fi $echo >> $output "\ if test -f \"\$progdir/\$program\"; then" # Export our shlibpath_var if we have one. if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then $echo >> $output "\ # Add our own library path to $shlibpath_var $shlibpath_var=\"$temp_rpath\$$shlibpath_var\" # Some systems cannot cope with colon-terminated $shlibpath_var # The second colon is a workaround for a bug in BeOS R4 sed $shlibpath_var=\`\$echo \"X\$$shlibpath_var\" | \$Xsed -e 's/::*\$//'\` export $shlibpath_var " fi # fixup the dll searchpath if we need to. if test -n "$dllsearchpath"; then $echo >> $output "\ # Add the dll search path components to the executable PATH PATH=$dllsearchpath:\$PATH " fi $echo >> $output "\ if test \"\$libtool_execute_magic\" != \"$magic\"; then # Run the actual program with our arguments. " case $host in # Backslashes separate directories on plain windows *-*-mingw | *-*-os2*) $echo >> $output "\ exec \$progdir\\\\\$program \${1+\"\$@\"} " ;; *) $echo >> $output "\ exec \$progdir/\$program \${1+\"\$@\"} " ;; esac $echo >> $output "\ \$echo \"\$0: cannot exec \$program \${1+\"\$@\"}\" exit $EXIT_FAILURE fi else # The program doesn't exist. \$echo \"\$0: error: \$progdir/\$program does not exist\" 1>&2 \$echo \"This script is just a wrapper for \$program.\" 1>&2 $echo \"See the $PACKAGE documentation for more information.\" 1>&2 exit $EXIT_FAILURE fi fi\ " chmod +x $output fi exit $EXIT_SUCCESS ;; esac # See if we need to build an old-fashioned archive. for oldlib in $oldlibs; do if test "$build_libtool_libs" = convenience; then oldobjs="$libobjs_save" addlibs="$convenience" build_libtool_libs=no else if test "$build_libtool_libs" = module; then oldobjs="$libobjs_save" build_libtool_libs=no else oldobjs="$old_deplibs $non_pic_objects" fi addlibs="$old_convenience" fi if test -n "$addlibs"; then gentop="$output_objdir/${outputname}x" $show "${rm}r $gentop" $run ${rm}r "$gentop" $show "$mkdir $gentop" $run $mkdir "$gentop" status=$? if test "$status" -ne 0 && test ! -d "$gentop"; then exit $status fi generated="$generated $gentop" # Add in members from convenience archives. for xlib in $addlibs; do # Extract the objects. case $xlib in [\\/]* | [A-Za-z]:[\\/]*) xabs="$xlib" ;; *) xabs=`pwd`"/$xlib" ;; esac xlib=`$echo "X$xlib" | $Xsed -e 's%^.*/%%'` xdir="$gentop/$xlib" $show "${rm}r $xdir" $run ${rm}r "$xdir" $show "$mkdir $xdir" $run $mkdir "$xdir" status=$? if test "$status" -ne 0 && test ! -d "$xdir"; then exit $status fi # We will extract separately just the conflicting names and we will no # longer touch any unique names. It is faster to leave these extract # automatically by $AR in one run. $show "(cd $xdir && $AR x $xabs)" $run eval "(cd \$xdir && $AR x \$xabs)" || exit $? if ($AR t "$xabs" | sort | sort -uc >/dev/null 2>&1); then : else $echo "$modename: warning: object name conflicts; renaming object files" 1>&2 $echo "$modename: warning: to ensure that they will not overwrite" 1>&2 $AR t "$xabs" | sort | uniq -cd | while read -r count name do i=1 while test "$i" -le "$count" do # Put our $i before any first dot (extension) # Never overwrite any file name_to="$name" while test "X$name_to" = "X$name" || test -f "$xdir/$name_to" do name_to=`$echo "X$name_to" | $Xsed -e "s/\([^.]*\)/\1-$i/"` done $show "(cd $xdir && $AR xN $i $xabs '$name' && $mv '$name' '$name_to')" $run eval "(cd \$xdir && $AR xN $i \$xabs '$name' && $mv '$name' '$name_to')" || exit $? i=`expr $i + 1` done done fi oldobjs="$oldobjs "`find $xdir -name \*.${objext} -print -o -name \*.lo -print | $NL2SP` done fi # Do each command in the archive commands. if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then cmds=$old_archive_from_new_cmds else eval cmds=\"$old_archive_cmds\" if len=`expr "X$cmds" : ".*"` && test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then cmds=$old_archive_cmds else # the command line is too long to link in one step, link in parts $echo "using piecewise archive linking..." save_RANLIB=$RANLIB RANLIB=: objlist= concat_cmds= save_oldobjs=$oldobjs # GNU ar 2.10+ was changed to match POSIX; thus no paths are # encoded into archives. This makes 'ar r' malfunction in # this piecewise linking case whenever conflicting object # names appear in distinct ar calls; check, warn and compensate. if (for obj in $save_oldobjs do $echo "X$obj" | $Xsed -e 's%^.*/%%' done | sort | sort -uc >/dev/null 2>&1); then : else $echo "$modename: warning: object name conflicts; overriding AR_FLAGS to 'cq'" 1>&2 $echo "$modename: warning: to ensure that POSIX-compatible ar will work" 1>&2 AR_FLAGS=cq fi # Is there a better way of finding the last object in the list? for obj in $save_oldobjs do last_oldobj=$obj done for obj in $save_oldobjs do oldobjs="$objlist $obj" objlist="$objlist $obj" eval test_cmds=\"$old_archive_cmds\" if len=`expr "X$test_cmds" : ".*"` && test "$len" -le "$max_cmd_len"; then : else # the above command should be used before it gets too long oldobjs=$objlist if test "$obj" = "$last_oldobj" ; then RANLIB=$save_RANLIB fi test -z "$concat_cmds" || concat_cmds=$concat_cmds~ eval concat_cmds=\"\${concat_cmds}$old_archive_cmds\" objlist= fi done RANLIB=$save_RANLIB oldobjs=$objlist if test "X$oldobjs" = "X" ; then eval cmds=\"\$concat_cmds\" else eval cmds=\"\$concat_cmds~\$old_archive_cmds\" fi fi fi save_ifs="$IFS"; IFS='~' for cmd in $cmds; do eval cmd=\"$cmd\" IFS="$save_ifs" $show "$cmd" $run eval "$cmd" || exit $? done IFS="$save_ifs" done if test -n "$generated"; then $show "${rm}r$generated" $run ${rm}r$generated fi # Now create the libtool archive. case $output in *.la) old_library= test "$build_old_libs" = yes && old_library="$libname.$libext" $show "creating $output" # Preserve any variables that may affect compiler behavior for var in $variables_saved_for_relink; do if eval test -z \"\${$var+set}\"; then relink_command="{ test -z \"\${$var+set}\" || unset $var || { $var=; export $var; }; }; $relink_command" elif eval var_value=\$$var; test -z "$var_value"; then relink_command="$var=; export $var; $relink_command" else var_value=`$echo "X$var_value" | $Xsed -e "$sed_quote_subst"` relink_command="$var=\"$var_value\"; export $var; $relink_command" fi done # Quote the link command for shipping. relink_command="(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)" relink_command=`$echo "X$relink_command" | $Xsed -e "$sed_quote_subst"` if test "$hardcode_automatic" = yes ; then relink_command= fi # Only create the output if not a dry run. if test -z "$run"; then for installed in no yes; do if test "$installed" = yes; then if test -z "$install_libdir"; then break fi output="$output_objdir/$outputname"i # Replace all uninstalled libtool libraries with the installed ones newdependency_libs= for deplib in $dependency_libs; do case $deplib in *.la) name=`$echo "X$deplib" | $Xsed -e 's%^.*/%%'` eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` if test -z "$libdir"; then $echo "$modename: \`$deplib' is not a valid libtool archive" 1>&2 exit $EXIT_FAILURE fi newdependency_libs="$newdependency_libs $libdir/$name" ;; *) newdependency_libs="$newdependency_libs $deplib" ;; esac done dependency_libs="$newdependency_libs" newdlfiles= for lib in $dlfiles; do name=`$echo "X$lib" | $Xsed -e 's%^.*/%%'` eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` if test -z "$libdir"; then $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 exit $EXIT_FAILURE fi newdlfiles="$newdlfiles $libdir/$name" done dlfiles="$newdlfiles" newdlprefiles= for lib in $dlprefiles; do name=`$echo "X$lib" | $Xsed -e 's%^.*/%%'` eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` if test -z "$libdir"; then $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 exit $EXIT_FAILURE fi newdlprefiles="$newdlprefiles $libdir/$name" done dlprefiles="$newdlprefiles" else newdlfiles= for lib in $dlfiles; do case $lib in [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; *) abs=`pwd`"/$lib" ;; esac newdlfiles="$newdlfiles $abs" done dlfiles="$newdlfiles" newdlprefiles= for lib in $dlprefiles; do case $lib in [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; *) abs=`pwd`"/$lib" ;; esac newdlprefiles="$newdlprefiles $abs" done dlprefiles="$newdlprefiles" fi $rm $output # place dlname in correct position for cygwin tdlname=$dlname case $host,$output,$installed,$module,$dlname in *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll) tdlname=../bin/$dlname ;; esac $echo > $output "\ # $outputname - a libtool library file # Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP # # Please DO NOT delete this file! # It is necessary for linking the library. # The name that we can dlopen(3). dlname='$tdlname' # Names of this library. library_names='$library_names' # The name of the static archive. old_library='$old_library' # Libraries that this one depends upon. dependency_libs='$dependency_libs' # Version information for $libname. current=$current age=$age revision=$revision # Is this an already installed library? installed=$installed # Should we warn about portability when linking against -modules? shouldnotlink=$module # Files to dlopen/dlpreopen dlopen='$dlfiles' dlpreopen='$dlprefiles' # Directory that this library needs to be installed in: libdir='$install_libdir'" if test "$installed" = no && test "$need_relink" = yes; then $echo >> $output "\ relink_command=\"$relink_command\"" fi done fi # Do a symbolic link so that the libtool archive can be found in # LD_LIBRARY_PATH before the program is installed. $show "(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)" $run eval '(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)' || exit $? ;; esac exit $EXIT_SUCCESS ;; # libtool install mode install) modename="$modename: install" # There may be an optional sh(1) argument at the beginning of # install_prog (especially on Windows NT). if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh || # Allow the use of GNU shtool's install command. $echo "X$nonopt" | $Xsed | grep shtool > /dev/null; then # Aesthetically quote it. arg=`$echo "X$nonopt" | $Xsed -e "$sed_quote_subst"` case $arg in *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*) arg="\"$arg\"" ;; esac install_prog="$arg " arg="$1" shift else install_prog= arg="$nonopt" fi # The real first argument should be the name of the installation program. # Aesthetically quote it. arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` case $arg in *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*) arg="\"$arg\"" ;; esac install_prog="$install_prog$arg" # We need to accept at least all the BSD install flags. dest= files= opts= prev= install_type= isdir=no stripme= for arg do if test -n "$dest"; then files="$files $dest" dest="$arg" continue fi case $arg in -d) isdir=yes ;; -f) prev="-f" ;; -g) prev="-g" ;; -m) prev="-m" ;; -o) prev="-o" ;; -s) stripme=" -s" continue ;; -*) ;; *) # If the previous option needed an argument, then skip it. if test -n "$prev"; then prev= else dest="$arg" continue fi ;; esac # Aesthetically quote the argument. arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` case $arg in *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*) arg="\"$arg\"" ;; esac install_prog="$install_prog $arg" done if test -z "$install_prog"; then $echo "$modename: you must specify an install program" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE fi if test -n "$prev"; then $echo "$modename: the \`$prev' option requires an argument" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE fi if test -z "$files"; then if test -z "$dest"; then $echo "$modename: no file or destination specified" 1>&2 else $echo "$modename: you must specify a destination" 1>&2 fi $echo "$help" 1>&2 exit $EXIT_FAILURE fi # Strip any trailing slash from the destination. dest=`$echo "X$dest" | $Xsed -e 's%/$%%'` # Check to see that the destination is a directory. test -d "$dest" && isdir=yes if test "$isdir" = yes; then destdir="$dest" destname= else destdir=`$echo "X$dest" | $Xsed -e 's%/[^/]*$%%'` test "X$destdir" = "X$dest" && destdir=. destname=`$echo "X$dest" | $Xsed -e 's%^.*/%%'` # Not a directory, so check to see that there is only one file specified. set dummy $files if test "$#" -gt 2; then $echo "$modename: \`$dest' is not a directory" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE fi fi case $destdir in [\\/]* | [A-Za-z]:[\\/]*) ;; *) for file in $files; do case $file in *.lo) ;; *) $echo "$modename: \`$destdir' must be an absolute directory name" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE ;; esac done ;; esac # This variable tells wrapper scripts just to set variables rather # than running their programs. libtool_install_magic="$magic" staticlibs= future_libdirs= current_libdirs= for file in $files; do # Do each installation. case $file in *.$libext) # Do the static libraries later. staticlibs="$staticlibs $file" ;; *.la) # Check to see that this really is a libtool archive. if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : else $echo "$modename: \`$file' is not a valid libtool archive" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE fi library_names= old_library= relink_command= # If there is no directory component, then add one. case $file in */* | *\\*) . $file ;; *) . ./$file ;; esac # Add the libdir to current_libdirs if it is the destination. if test "X$destdir" = "X$libdir"; then case "$current_libdirs " in *" $libdir "*) ;; *) current_libdirs="$current_libdirs $libdir" ;; esac else # Note the libdir as a future libdir. case "$future_libdirs " in *" $libdir "*) ;; *) future_libdirs="$future_libdirs $libdir" ;; esac fi dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`/ test "X$dir" = "X$file/" && dir= dir="$dir$objdir" if test -n "$relink_command"; then # Determine the prefix the user has applied to our future dir. inst_prefix_dir=`$echo "$destdir" | $SED "s%$libdir\$%%"` # Don't allow the user to place us outside of our expected # location b/c this prevents finding dependent libraries that # are installed to the same prefix. # At present, this check doesn't affect windows .dll's that # are installed into $libdir/../bin (currently, that works fine) # but it's something to keep an eye on. if test "$inst_prefix_dir" = "$destdir"; then $echo "$modename: error: cannot install \`$file' to a directory not ending in $libdir" 1>&2 exit $EXIT_FAILURE fi if test -n "$inst_prefix_dir"; then # Stick the inst_prefix_dir data into the link command. relink_command=`$echo "$relink_command" | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"` else relink_command=`$echo "$relink_command" | $SED "s%@inst_prefix_dir@%%"` fi $echo "$modename: warning: relinking \`$file'" 1>&2 $show "$relink_command" if $run eval "$relink_command"; then : else $echo "$modename: error: relink \`$file' with the above command before installing it" 1>&2 exit $EXIT_FAILURE fi fi # See the names of the shared library. set dummy $library_names if test -n "$2"; then realname="$2" shift shift srcname="$realname" test -n "$relink_command" && srcname="$realname"T # Install the shared library and build the symlinks. $show "$install_prog $dir/$srcname $destdir/$realname" $run eval "$install_prog $dir/$srcname $destdir/$realname" || exit $? if test -n "$stripme" && test -n "$striplib"; then $show "$striplib $destdir/$realname" $run eval "$striplib $destdir/$realname" || exit $? fi if test "$#" -gt 0; then # Delete the old symlinks, and create new ones. for linkname do if test "$linkname" != "$realname"; then $show "(cd $destdir && $rm $linkname && $LN_S $realname $linkname)" $run eval "(cd $destdir && $rm $linkname && $LN_S $realname $linkname)" fi done fi # Do each command in the postinstall commands. lib="$destdir/$realname" cmds=$postinstall_cmds save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" eval cmd=\"$cmd\" $show "$cmd" $run eval "$cmd" || exit $? done IFS="$save_ifs" fi # Install the pseudo-library for information purposes. name=`$echo "X$file" | $Xsed -e 's%^.*/%%'` instname="$dir/$name"i $show "$install_prog $instname $destdir/$name" $run eval "$install_prog $instname $destdir/$name" || exit $? # Maybe install the static library, too. test -n "$old_library" && staticlibs="$staticlibs $dir/$old_library" ;; *.lo) # Install (i.e. copy) a libtool object. # Figure out destination file name, if it wasn't already specified. if test -n "$destname"; then destfile="$destdir/$destname" else destfile=`$echo "X$file" | $Xsed -e 's%^.*/%%'` destfile="$destdir/$destfile" fi # Deduce the name of the destination old-style object file. case $destfile in *.lo) staticdest=`$echo "X$destfile" | $Xsed -e "$lo2o"` ;; *.$objext) staticdest="$destfile" destfile= ;; *) $echo "$modename: cannot copy a libtool object to \`$destfile'" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE ;; esac # Install the libtool object if requested. if test -n "$destfile"; then $show "$install_prog $file $destfile" $run eval "$install_prog $file $destfile" || exit $? fi # Install the old object if enabled. if test "$build_old_libs" = yes; then # Deduce the name of the old-style object file. staticobj=`$echo "X$file" | $Xsed -e "$lo2o"` $show "$install_prog $staticobj $staticdest" $run eval "$install_prog \$staticobj \$staticdest" || exit $? fi exit $EXIT_SUCCESS ;; *) # Figure out destination file name, if it wasn't already specified. if test -n "$destname"; then destfile="$destdir/$destname" else destfile=`$echo "X$file" | $Xsed -e 's%^.*/%%'` destfile="$destdir/$destfile" fi # If the file is missing, and there is a .exe on the end, strip it # because it is most likely a libtool script we actually want to # install stripped_ext="" case $file in *.exe) if test ! -f "$file"; then file=`$echo $file|${SED} 's,.exe$,,'` stripped_ext=".exe" fi ;; esac # Do a test to see if this is really a libtool program. case $host in *cygwin*|*mingw*) wrapper=`$echo $file | ${SED} -e 's,.exe$,,'` ;; *) wrapper=$file ;; esac if (${SED} -e '4q' $wrapper | grep "^# Generated by .*$PACKAGE")>/dev/null 2>&1; then notinst_deplibs= relink_command= # To insure that "foo" is sourced, and not "foo.exe", # finese the cygwin/MSYS system by explicitly sourcing "foo." # which disallows the automatic-append-.exe behavior. case $build in *cygwin* | *mingw*) wrapperdot=${wrapper}. ;; *) wrapperdot=${wrapper} ;; esac # If there is no directory component, then add one. case $file in */* | *\\*) . ${wrapperdot} ;; *) . ./${wrapperdot} ;; esac # Check the variables that should have been set. if test -z "$notinst_deplibs"; then $echo "$modename: invalid libtool wrapper script \`$wrapper'" 1>&2 exit $EXIT_FAILURE fi finalize=yes for lib in $notinst_deplibs; do # Check to see that each library is installed. libdir= if test -f "$lib"; then # If there is no directory component, then add one. case $lib in */* | *\\*) . $lib ;; *) . ./$lib ;; esac fi libfile="$libdir/"`$echo "X$lib" | $Xsed -e 's%^.*/%%g'` ### testsuite: skip nested quoting test if test -n "$libdir" && test ! -f "$libfile"; then $echo "$modename: warning: \`$lib' has not been installed in \`$libdir'" 1>&2 finalize=no fi done relink_command= # To insure that "foo" is sourced, and not "foo.exe", # finese the cygwin/MSYS system by explicitly sourcing "foo." # which disallows the automatic-append-.exe behavior. case $build in *cygwin* | *mingw*) wrapperdot=${wrapper}. ;; *) wrapperdot=${wrapper} ;; esac # If there is no directory component, then add one. case $file in */* | *\\*) . ${wrapperdot} ;; *) . ./${wrapperdot} ;; esac outputname= if test "$fast_install" = no && test -n "$relink_command"; then if test "$finalize" = yes && test -z "$run"; then tmpdir="/tmp" test -n "$TMPDIR" && tmpdir="$TMPDIR" tmpdir="$tmpdir/libtool-$$" save_umask=`umask` umask 0077 if $mkdir "$tmpdir"; then umask $save_umask else umask $save_umask $echo "$modename: error: cannot create temporary directory \`$tmpdir'" 1>&2 continue fi file=`$echo "X$file$stripped_ext" | $Xsed -e 's%^.*/%%'` outputname="$tmpdir/$file" # Replace the output file specification. relink_command=`$echo "X$relink_command" | $Xsed -e 's%@OUTPUT@%'"$outputname"'%g'` $show "$relink_command" if $run eval "$relink_command"; then : else $echo "$modename: error: relink \`$file' with the above command before installing it" 1>&2 ${rm}r "$tmpdir" continue fi file="$outputname" else $echo "$modename: warning: cannot relink \`$file'" 1>&2 fi else # Install the binary that we compiled earlier. file=`$echo "X$file$stripped_ext" | $Xsed -e "s%\([^/]*\)$%$objdir/\1%"` fi fi # remove .exe since cygwin /usr/bin/install will append another # one anyways case $install_prog,$host in */usr/bin/install*,*cygwin*) case $file:$destfile in *.exe:*.exe) # this is ok ;; *.exe:*) destfile=$destfile.exe ;; *:*.exe) destfile=`$echo $destfile | ${SED} -e 's,.exe$,,'` ;; esac ;; esac $show "$install_prog$stripme $file $destfile" $run eval "$install_prog\$stripme \$file \$destfile" || exit $? test -n "$outputname" && ${rm}r "$tmpdir" ;; esac done for file in $staticlibs; do name=`$echo "X$file" | $Xsed -e 's%^.*/%%'` # Set up the ranlib parameters. oldlib="$destdir/$name" $show "$install_prog $file $oldlib" $run eval "$install_prog \$file \$oldlib" || exit $? if test -n "$stripme" && test -n "$old_striplib"; then $show "$old_striplib $oldlib" $run eval "$old_striplib $oldlib" || exit $? fi # Do each command in the postinstall commands. cmds=$old_postinstall_cmds save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" eval cmd=\"$cmd\" $show "$cmd" $run eval "$cmd" || exit $? done IFS="$save_ifs" done if test -n "$future_libdirs"; then $echo "$modename: warning: remember to run \`$progname --finish$future_libdirs'" 1>&2 fi if test -n "$current_libdirs"; then # Maybe just do a dry run. test -n "$run" && current_libdirs=" -n$current_libdirs" exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs' else exit $EXIT_SUCCESS fi ;; # libtool finish mode finish) modename="$modename: finish" libdirs="$nonopt" admincmds= if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then for dir do libdirs="$libdirs $dir" done for libdir in $libdirs; do if test -n "$finish_cmds"; then # Do each command in the finish commands. cmds=$finish_cmds save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" eval cmd=\"$cmd\" $show "$cmd" $run eval "$cmd" || admincmds="$admincmds $cmd" done IFS="$save_ifs" fi if test -n "$finish_eval"; then # Do the single finish_eval. eval cmds=\"$finish_eval\" $run eval "$cmds" || admincmds="$admincmds $cmds" fi done fi # Exit here if they wanted silent mode. test "$show" = : && exit $EXIT_SUCCESS $echo "----------------------------------------------------------------------" $echo "Libraries have been installed in:" for libdir in $libdirs; do $echo " $libdir" done $echo $echo "If you ever happen to want to link against installed libraries" $echo "in a given directory, LIBDIR, you must either use libtool, and" $echo "specify the full pathname of the library, or use the \`-LLIBDIR'" $echo "flag during linking and do at least one of the following:" if test -n "$shlibpath_var"; then $echo " - add LIBDIR to the \`$shlibpath_var' environment variable" $echo " during execution" fi if test -n "$runpath_var"; then $echo " - add LIBDIR to the \`$runpath_var' environment variable" $echo " during linking" fi if test -n "$hardcode_libdir_flag_spec"; then libdir=LIBDIR eval flag=\"$hardcode_libdir_flag_spec\" $echo " - use the \`$flag' linker flag" fi if test -n "$admincmds"; then $echo " - have your system administrator run these commands:$admincmds" fi if test -f /etc/ld.so.conf; then $echo " - have your system administrator add LIBDIR to \`/etc/ld.so.conf'" fi $echo $echo "See any operating system documentation about shared libraries for" $echo "more information, such as the ld(1) and ld.so(8) manual pages." $echo "----------------------------------------------------------------------" exit $EXIT_SUCCESS ;; # libtool execute mode execute) modename="$modename: execute" # The first argument is the command name. cmd="$nonopt" if test -z "$cmd"; then $echo "$modename: you must specify a COMMAND" 1>&2 $echo "$help" exit $EXIT_FAILURE fi # Handle -dlopen flags immediately. for file in $execute_dlfiles; do if test ! -f "$file"; then $echo "$modename: \`$file' is not a file" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE fi dir= case $file in *.la) # Check to see that this really is a libtool archive. if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : else $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE fi # Read the libtool library. dlname= library_names= # If there is no directory component, then add one. case $file in */* | *\\*) . $file ;; *) . ./$file ;; esac # Skip this library if it cannot be dlopened. if test -z "$dlname"; then # Warn if it was a shared library. test -n "$library_names" && $echo "$modename: warning: \`$file' was not linked with \`-export-dynamic'" continue fi dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` test "X$dir" = "X$file" && dir=. if test -f "$dir/$objdir/$dlname"; then dir="$dir/$objdir" else $echo "$modename: cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'" 1>&2 exit $EXIT_FAILURE fi ;; *.lo) # Just add the directory containing the .lo file. dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` test "X$dir" = "X$file" && dir=. ;; *) $echo "$modename: warning \`-dlopen' is ignored for non-libtool libraries and objects" 1>&2 continue ;; esac # Get the absolute pathname. absdir=`cd "$dir" && pwd` test -n "$absdir" && dir="$absdir" # Now add the directory to shlibpath_var. if eval "test -z \"\$$shlibpath_var\""; then eval "$shlibpath_var=\"\$dir\"" else eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\"" fi done # This variable tells wrapper scripts just to set shlibpath_var # rather than running their programs. libtool_execute_magic="$magic" # Check if any of the arguments is a wrapper script. args= for file do case $file in -*) ;; *) # Do a test to see if this is really a libtool program. if (${SED} -e '4q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then # If there is no directory component, then add one. case $file in */* | *\\*) . $file ;; *) . ./$file ;; esac # Transform arg to wrapped name. file="$progdir/$program" fi ;; esac # Quote arguments (to preserve shell metacharacters). file=`$echo "X$file" | $Xsed -e "$sed_quote_subst"` args="$args \"$file\"" done if test -z "$run"; then if test -n "$shlibpath_var"; then # Export the shlibpath_var. eval "export $shlibpath_var" fi # Restore saved environment variables if test "${save_LC_ALL+set}" = set; then LC_ALL="$save_LC_ALL"; export LC_ALL fi if test "${save_LANG+set}" = set; then LANG="$save_LANG"; export LANG fi # Now prepare to actually exec the command. exec_cmd="\$cmd$args" else # Display what would be done. if test -n "$shlibpath_var"; then eval "\$echo \"\$shlibpath_var=\$$shlibpath_var\"" $echo "export $shlibpath_var" fi $echo "$cmd$args" exit $EXIT_SUCCESS fi ;; # libtool clean and uninstall mode clean | uninstall) modename="$modename: $mode" rm="$nonopt" files= rmforce= exit_status=0 # This variable tells wrapper scripts just to set variables rather # than running their programs. libtool_install_magic="$magic" for arg do case $arg in -f) rm="$rm $arg"; rmforce=yes ;; -*) rm="$rm $arg" ;; *) files="$files $arg" ;; esac done if test -z "$rm"; then $echo "$modename: you must specify an RM program" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE fi rmdirs= origobjdir="$objdir" for file in $files; do dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` if test "X$dir" = "X$file"; then dir=. objdir="$origobjdir" else objdir="$dir/$origobjdir" fi name=`$echo "X$file" | $Xsed -e 's%^.*/%%'` test "$mode" = uninstall && objdir="$dir" # Remember objdir for removal later, being careful to avoid duplicates if test "$mode" = clean; then case " $rmdirs " in *" $objdir "*) ;; *) rmdirs="$rmdirs $objdir" ;; esac fi # Don't error if the file doesn't exist and rm -f was used. if (test -L "$file") >/dev/null 2>&1 \ || (test -h "$file") >/dev/null 2>&1 \ || test -f "$file"; then : elif test -d "$file"; then exit_status=1 continue elif test "$rmforce" = yes; then continue fi rmfiles="$file" case $name in *.la) # Possibly a libtool archive, so verify it. if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then . $dir/$name # Delete the libtool libraries and symlinks. for n in $library_names; do rmfiles="$rmfiles $objdir/$n" done test -n "$old_library" && rmfiles="$rmfiles $objdir/$old_library" test "$mode" = clean && rmfiles="$rmfiles $objdir/$name $objdir/${name}i" if test "$mode" = uninstall; then if test -n "$library_names"; then # Do each command in the postuninstall commands. cmds=$postuninstall_cmds save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" eval cmd=\"$cmd\" $show "$cmd" $run eval "$cmd" if test "$?" -ne 0 && test "$rmforce" != yes; then exit_status=1 fi done IFS="$save_ifs" fi if test -n "$old_library"; then # Do each command in the old_postuninstall commands. cmds=$old_postuninstall_cmds save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" eval cmd=\"$cmd\" $show "$cmd" $run eval "$cmd" if test "$?" -ne 0 && test "$rmforce" != yes; then exit_status=1 fi done IFS="$save_ifs" fi # FIXME: should reinstall the best remaining shared library. fi fi ;; *.lo) # Possibly a libtool object, so verify it. if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then # Read the .lo file . $dir/$name # Add PIC object to the list of files to remove. if test -n "$pic_object" \ && test "$pic_object" != none; then rmfiles="$rmfiles $dir/$pic_object" fi # Add non-PIC object to the list of files to remove. if test -n "$non_pic_object" \ && test "$non_pic_object" != none; then rmfiles="$rmfiles $dir/$non_pic_object" fi fi ;; *) if test "$mode" = clean ; then noexename=$name case $file in *.exe) file=`$echo $file|${SED} 's,.exe$,,'` noexename=`$echo $name|${SED} 's,.exe$,,'` # $file with .exe has already been added to rmfiles, # add $file without .exe rmfiles="$rmfiles $file" ;; esac # Do a test to see if this is a libtool program. if (${SED} -e '4q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then relink_command= . $dir/$noexename # note $name still contains .exe if it was in $file originally # as does the version of $file that was added into $rmfiles rmfiles="$rmfiles $objdir/$name $objdir/${name}S.${objext}" if test "$fast_install" = yes && test -n "$relink_command"; then rmfiles="$rmfiles $objdir/lt-$name" fi if test "X$noexename" != "X$name" ; then rmfiles="$rmfiles $objdir/lt-${noexename}.c" fi fi fi ;; esac $show "$rm $rmfiles" $run $rm $rmfiles || exit_status=1 done objdir="$origobjdir" # Try to remove the ${objdir}s in the directories where we deleted files for dir in $rmdirs; do if test -d "$dir"; then $show "rmdir $dir" $run rmdir $dir >/dev/null 2>&1 fi done exit $exit_status ;; "") $echo "$modename: you must specify a MODE" 1>&2 $echo "$generic_help" 1>&2 exit $EXIT_FAILURE ;; esac if test -z "$exec_cmd"; then $echo "$modename: invalid operation mode \`$mode'" 1>&2 $echo "$generic_help" 1>&2 exit $EXIT_FAILURE fi fi # test -z "$show_help" if test -n "$exec_cmd"; then eval exec $exec_cmd exit $EXIT_FAILURE fi # We need to display help for each of the modes. case $mode in "") $echo \ "Usage: $modename [OPTION]... [MODE-ARG]... Provide generalized library-building support services. --config show all configuration variables --debug enable verbose shell tracing -n, --dry-run display commands without modifying any files --features display basic configuration information and exit --finish same as \`--mode=finish' --help display this help message and exit --mode=MODE use operation mode MODE [default=inferred from MODE-ARGS] --quiet same as \`--silent' --silent don't print informational messages --tag=TAG use configuration variables from tag TAG --version print version information MODE must be one of the following: clean remove files from the build directory compile compile a source file into a libtool object execute automatically set library path, then run a program finish complete the installation of libtool libraries install install libraries or executables link create a library or an executable uninstall remove libraries from an installed directory MODE-ARGS vary depending on the MODE. Try \`$modename --help --mode=MODE' for a more detailed description of MODE. Report bugs to ." exit $EXIT_SUCCESS ;; clean) $echo \ "Usage: $modename [OPTION]... --mode=clean RM [RM-OPTION]... FILE... Remove files from the build directory. RM is the name of the program to use to delete files associated with each FILE (typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed to RM. If FILE is a libtool library, object or program, all the files associated with it are deleted. Otherwise, only FILE itself is deleted using RM." ;; compile) $echo \ "Usage: $modename [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE Compile a source file into a libtool library object. This mode accepts the following additional options: -o OUTPUT-FILE set the output file name to OUTPUT-FILE -prefer-pic try to building PIC objects only -prefer-non-pic try to building non-PIC objects only -static always build a \`.o' file suitable for static linking COMPILE-COMMAND is a command to be used in creating a \`standard' object file from the given SOURCEFILE. The output file name is determined by removing the directory component from SOURCEFILE, then substituting the C source code suffix \`.c' with the library object suffix, \`.lo'." ;; execute) $echo \ "Usage: $modename [OPTION]... --mode=execute COMMAND [ARGS]... Automatically set library path, then run a program. This mode accepts the following additional options: -dlopen FILE add the directory containing FILE to the library path This mode sets the library path environment variable according to \`-dlopen' flags. If any of the ARGS are libtool executable wrappers, then they are translated into their corresponding uninstalled binary, and any of their required library directories are added to the library path. Then, COMMAND is executed, with ARGS as arguments." ;; finish) $echo \ "Usage: $modename [OPTION]... --mode=finish [LIBDIR]... Complete the installation of libtool libraries. Each LIBDIR is a directory that contains libtool libraries. The commands that this mode executes may require superuser privileges. Use the \`--dry-run' option if you just want to see what would be executed." ;; install) $echo \ "Usage: $modename [OPTION]... --mode=install INSTALL-COMMAND... Install executables or libraries. INSTALL-COMMAND is the installation command. The first component should be either the \`install' or \`cp' program. The rest of the components are interpreted as arguments to that command (only BSD-compatible install options are recognized)." ;; link) $echo \ "Usage: $modename [OPTION]... --mode=link LINK-COMMAND... Link object files or libraries together to form another library, or to create an executable program. LINK-COMMAND is a command using the C compiler that you would use to create a program from several object files. The following components of LINK-COMMAND are treated specially: -all-static do not do any dynamic linking at all -avoid-version do not add a version suffix if possible -dlopen FILE \`-dlpreopen' FILE if it cannot be dlopened at runtime -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3) -export-symbols SYMFILE try to export only the symbols listed in SYMFILE -export-symbols-regex REGEX try to export only the symbols matching REGEX -LLIBDIR search LIBDIR for required installed libraries -lNAME OUTPUT-FILE requires the installed library libNAME -module build a library that can dlopened -no-fast-install disable the fast-install mode -no-install link a not-installable executable -no-undefined declare that a library does not refer to external symbols -o OUTPUT-FILE create OUTPUT-FILE from the specified objects -objectlist FILE Use a list of object files found in FILE to specify objects -precious-files-regex REGEX don't remove output files matching REGEX -release RELEASE specify package release information -rpath LIBDIR the created library will eventually be installed in LIBDIR -R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries -static do not do any dynamic linking of libtool libraries -version-info CURRENT[:REVISION[:AGE]] specify library version info [each variable defaults to 0] All other options (arguments beginning with \`-') are ignored. Every other argument is treated as a filename. Files ending in \`.la' are treated as uninstalled libtool libraries, other files are standard or library object files. If the OUTPUT-FILE ends in \`.la', then a libtool library is created, only library objects (\`.lo' files) may be specified, and \`-rpath' is required, except when creating a convenience library. If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created using \`ar' and \`ranlib', or on Windows using \`lib'. If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file is created, otherwise an executable program is created." ;; uninstall) $echo \ "Usage: $modename [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE... Remove libraries from an installation directory. RM is the name of the program to use to delete files associated with each FILE (typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed to RM. If FILE is a libtool library, all the files associated with it are deleted. Otherwise, only FILE itself is deleted using RM." ;; *) $echo "$modename: invalid operation mode \`$mode'" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE ;; esac $echo $echo "Try \`$modename --help' for more information about other modes." exit $EXIT_SUCCESS # The TAGs below are defined such that we never get into a situation # in which we disable both kinds of libraries. Given conflicting # choices, we go for a static library, that is the most portable, # since we can't tell whether shared libraries were disabled because # the user asked for that or because the platform doesn't support # them. This is particularly important on AIX, because we don't # support having both static and shared libraries enabled at the same # time on that platform, so we default to a shared-only configuration. # If a disable-shared tag is given, we'll fallback to a static-only # configuration. But we'll never go from static-only to shared-only. # ### BEGIN LIBTOOL TAG CONFIG: disable-shared build_libtool_libs=no build_old_libs=yes # ### END LIBTOOL TAG CONFIG: disable-shared # ### BEGIN LIBTOOL TAG CONFIG: disable-static build_old_libs=`case $build_libtool_libs in yes) $echo no;; *) $echo yes;; esac` # ### END LIBTOOL TAG CONFIG: disable-static # Local Variables: # mode:shell-script # sh-indentation:2 # End: iaxmodem-1.2.0/lib/libiax2/ChangeLog0000644000175000017500000000070411150047225016523 0ustar julienjulienlibiax ====== version 0.2.3: * Allow password to be passed in connect version 0.2.2 (Nov 13th, 2001): * HTML Unlink requests * HTML Reject link requests * Text frames version 0.2.1 (Oct 20th, 2001): * More space for challenge in IAX * Fixed strncpy security bug * Accept larger packets * Handle out of order packets better * Implemented send_url * Added an iax-config script :-) version 0.2.0 (Oct 10th, 2001): * Initial Public Release iaxmodem-1.2.0/lib/libiax2/config.guess0000755000175000017500000012502011150047225017270 0ustar julienjulien#! /bin/sh # Attempt to guess a canonical system name. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, # 2000, 2001, 2002, 2003 Free Software Foundation, Inc. timestamp='2004-03-03' # This file 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. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Originally written by Per Bothner . # Please send patches to . Submit a context # diff and a properly formatted ChangeLog entry. # # This script attempts to guess a canonical system name similar to # config.sub. If it succeeds, it prints the system name on stdout, and # exits with 0. Otherwise, it exits with 1. # # The plan is that this can be called by configure scripts if you # don't specify an explicit build system type. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] Output the configuration name of the system \`$me' is run on. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit 0 ;; --version | -v ) echo "$version" ; exit 0 ;; --help | --h* | -h ) echo "$usage"; exit 0 ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" >&2 exit 1 ;; * ) break ;; esac done if test $# != 0; then echo "$me: too many arguments$help" >&2 exit 1 fi trap 'exit 1' 1 2 15 # CC_FOR_BUILD -- compiler used by this script. Note that the use of a # compiler to aid in system detection is discouraged as it requires # temporary files to be created and, as you can see below, it is a # headache to deal with in a portable fashion. # Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still # use `HOST_CC' if defined, but it is deprecated. # Portable tmp directory creation inspired by the Autoconf team. set_cc_for_build=' trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; : ${TMPDIR=/tmp} ; { tmp=`(umask 077 && mktemp -d -q "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; dummy=$tmp/dummy ; tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; case $CC_FOR_BUILD,$HOST_CC,$CC in ,,) echo "int x;" > $dummy.c ; for c in cc gcc c89 c99 ; do if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then CC_FOR_BUILD="$c"; break ; fi ; done ; if test x"$CC_FOR_BUILD" = x ; then CC_FOR_BUILD=no_compiler_found ; fi ;; ,,*) CC_FOR_BUILD=$CC ;; ,*,*) CC_FOR_BUILD=$HOST_CC ;; esac ;' # This is needed to find uname on a Pyramid OSx when run in the BSD universe. # (ghazi@noc.rutgers.edu 1994-08-24) if (test -f /.attbin/uname) >/dev/null 2>&1 ; then PATH=$PATH:/.attbin ; export PATH fi UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown # Note: order is significant - the case branches are not exclusive. case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in *:NetBSD:*:*) # NetBSD (nbsd) targets should (where applicable) match one or # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*, # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently # switched to ELF, *-*-netbsd* would select the old # object file format. This provides both forward # compatibility and a consistent mechanism for selecting the # object file format. # # Note: NetBSD doesn't particularly care about the vendor # portion of the name. We always set it to "unknown". sysctl="sysctl -n hw.machine_arch" UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ /usr/sbin/$sysctl 2>/dev/null || echo unknown)` case "${UNAME_MACHINE_ARCH}" in armeb) machine=armeb-unknown ;; arm*) machine=arm-unknown ;; sh3el) machine=shl-unknown ;; sh3eb) machine=sh-unknown ;; *) machine=${UNAME_MACHINE_ARCH}-unknown ;; esac # The Operating System including object format, if it has switched # to ELF recently, or will in the future. case "${UNAME_MACHINE_ARCH}" in arm*|i386|m68k|ns32k|sh3*|sparc|vax) eval $set_cc_for_build if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep __ELF__ >/dev/null then # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). # Return netbsd for either. FIX? os=netbsd else os=netbsdelf fi ;; *) os=netbsd ;; esac # The OS release # Debian GNU/NetBSD machines have a different userland, and # thus, need a distinct triplet. However, they do not need # kernel version information, so it can be replaced with a # suitable tag, in the style of linux-gnu. case "${UNAME_VERSION}" in Debian*) release='-gnu' ;; *) release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` ;; esac # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: # contains redundant information, the shorter form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. echo "${machine}-${os}${release}" exit 0 ;; amd64:OpenBSD:*:*) echo x86_64-unknown-openbsd${UNAME_RELEASE} exit 0 ;; amiga:OpenBSD:*:*) echo m68k-unknown-openbsd${UNAME_RELEASE} exit 0 ;; arc:OpenBSD:*:*) echo mipsel-unknown-openbsd${UNAME_RELEASE} exit 0 ;; cats:OpenBSD:*:*) echo arm-unknown-openbsd${UNAME_RELEASE} exit 0 ;; hp300:OpenBSD:*:*) echo m68k-unknown-openbsd${UNAME_RELEASE} exit 0 ;; mac68k:OpenBSD:*:*) echo m68k-unknown-openbsd${UNAME_RELEASE} exit 0 ;; macppc:OpenBSD:*:*) echo powerpc-unknown-openbsd${UNAME_RELEASE} exit 0 ;; mvme68k:OpenBSD:*:*) echo m68k-unknown-openbsd${UNAME_RELEASE} exit 0 ;; mvme88k:OpenBSD:*:*) echo m88k-unknown-openbsd${UNAME_RELEASE} exit 0 ;; mvmeppc:OpenBSD:*:*) echo powerpc-unknown-openbsd${UNAME_RELEASE} exit 0 ;; pegasos:OpenBSD:*:*) echo powerpc-unknown-openbsd${UNAME_RELEASE} exit 0 ;; pmax:OpenBSD:*:*) echo mipsel-unknown-openbsd${UNAME_RELEASE} exit 0 ;; sgi:OpenBSD:*:*) echo mipseb-unknown-openbsd${UNAME_RELEASE} exit 0 ;; sun3:OpenBSD:*:*) echo m68k-unknown-openbsd${UNAME_RELEASE} exit 0 ;; wgrisc:OpenBSD:*:*) echo mipsel-unknown-openbsd${UNAME_RELEASE} exit 0 ;; *:OpenBSD:*:*) echo ${UNAME_MACHINE}-unknown-openbsd${UNAME_RELEASE} exit 0 ;; *:ekkoBSD:*:*) echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} exit 0 ;; macppc:MirBSD:*:*) echo powerppc-unknown-mirbsd${UNAME_RELEASE} exit 0 ;; *:MirBSD:*:*) echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} exit 0 ;; alpha:OSF1:*:*) case $UNAME_RELEASE in *4.0) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` ;; *5.*) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` ;; esac # According to Compaq, /usr/sbin/psrinfo has been available on # OSF/1 and Tru64 systems produced since 1995. I hope that # covers most systems running today. This code pipes the CPU # types through head -n 1, so we only detect the type of CPU 0. ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` case "$ALPHA_CPU_TYPE" in "EV4 (21064)") UNAME_MACHINE="alpha" ;; "EV4.5 (21064)") UNAME_MACHINE="alpha" ;; "LCA4 (21066/21068)") UNAME_MACHINE="alpha" ;; "EV5 (21164)") UNAME_MACHINE="alphaev5" ;; "EV5.6 (21164A)") UNAME_MACHINE="alphaev56" ;; "EV5.6 (21164PC)") UNAME_MACHINE="alphapca56" ;; "EV5.7 (21164PC)") UNAME_MACHINE="alphapca57" ;; "EV6 (21264)") UNAME_MACHINE="alphaev6" ;; "EV6.7 (21264A)") UNAME_MACHINE="alphaev67" ;; "EV6.8CB (21264C)") UNAME_MACHINE="alphaev68" ;; "EV6.8AL (21264B)") UNAME_MACHINE="alphaev68" ;; "EV6.8CX (21264D)") UNAME_MACHINE="alphaev68" ;; "EV6.9A (21264/EV69A)") UNAME_MACHINE="alphaev69" ;; "EV7 (21364)") UNAME_MACHINE="alphaev7" ;; "EV7.9 (21364A)") UNAME_MACHINE="alphaev79" ;; esac # A Pn.n version is a patched version. # A Vn.n version is a released version. # A Tn.n version is a released field test version. # A Xn.n version is an unreleased experimental baselevel. # 1.2 uses "1.2" for uname -r. echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` exit 0 ;; Alpha*:OpenVMS:*:*) echo alpha-hp-vms exit 0 ;; Alpha\ *:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # Should we change UNAME_MACHINE based on the output of uname instead # of the specific Alpha model? echo alpha-pc-interix exit 0 ;; 21064:Windows_NT:50:3) echo alpha-dec-winnt3.5 exit 0 ;; Amiga*:UNIX_System_V:4.0:*) echo m68k-unknown-sysv4 exit 0;; *:[Aa]miga[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-amigaos exit 0 ;; *:[Mm]orph[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-morphos exit 0 ;; *:OS/390:*:*) echo i370-ibm-openedition exit 0 ;; *:OS400:*:*) echo powerpc-ibm-os400 exit 0 ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) echo arm-acorn-riscix${UNAME_RELEASE} exit 0;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) echo hppa1.1-hitachi-hiuxmpp exit 0;; Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. if test "`(/bin/universe) 2>/dev/null`" = att ; then echo pyramid-pyramid-sysv3 else echo pyramid-pyramid-bsd fi exit 0 ;; NILE*:*:*:dcosx) echo pyramid-pyramid-svr4 exit 0 ;; DRS?6000:unix:4.0:6*) echo sparc-icl-nx6 exit 0 ;; DRS?6000:UNIX_SV:4.2*:7*) case `/usr/bin/uname -p` in sparc) echo sparc-icl-nx7 && exit 0 ;; esac ;; sun4H:SunOS:5.*:*) echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit 0 ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit 0 ;; i86pc:SunOS:5.*:*) echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit 0 ;; sun4*:SunOS:6*:*) # According to config.sub, this is the proper way to canonicalize # SunOS6. Hard to guess exactly what SunOS6 will be like, but # it's likely to be more like Solaris than SunOS4. echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit 0 ;; sun4*:SunOS:*:*) case "`/usr/bin/arch -k`" in Series*|S4*) UNAME_RELEASE=`uname -v` ;; esac # Japanese Language versions have a version number like `4.1.3-JL'. echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` exit 0 ;; sun3*:SunOS:*:*) echo m68k-sun-sunos${UNAME_RELEASE} exit 0 ;; sun*:*:4.2BSD:*) UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 case "`/bin/arch`" in sun3) echo m68k-sun-sunos${UNAME_RELEASE} ;; sun4) echo sparc-sun-sunos${UNAME_RELEASE} ;; esac exit 0 ;; aushp:SunOS:*:*) echo sparc-auspex-sunos${UNAME_RELEASE} exit 0 ;; # The situation for MiNT is a little confusing. The machine name # can be virtually everything (everything which is not # "atarist" or "atariste" at least should have a processor # > m68000). The system name ranges from "MiNT" over "FreeMiNT" # to the lowercase version "mint" (or "freemint"). Finally # the system name "TOS" denotes a system which is actually not # MiNT. But MiNT is downward compatible to TOS, so this should # be no problem. atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit 0 ;; atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit 0 ;; *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit 0 ;; milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) echo m68k-milan-mint${UNAME_RELEASE} exit 0 ;; hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) echo m68k-hades-mint${UNAME_RELEASE} exit 0 ;; *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) echo m68k-unknown-mint${UNAME_RELEASE} exit 0 ;; m68k:machten:*:*) echo m68k-apple-machten${UNAME_RELEASE} exit 0 ;; powerpc:machten:*:*) echo powerpc-apple-machten${UNAME_RELEASE} exit 0 ;; RISC*:Mach:*:*) echo mips-dec-mach_bsd4.3 exit 0 ;; RISC*:ULTRIX:*:*) echo mips-dec-ultrix${UNAME_RELEASE} exit 0 ;; VAX*:ULTRIX*:*:*) echo vax-dec-ultrix${UNAME_RELEASE} exit 0 ;; 2020:CLIX:*:* | 2430:CLIX:*:*) echo clipper-intergraph-clix${UNAME_RELEASE} exit 0 ;; mips:*:*:UMIPS | mips:*:*:RISCos) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #ifdef __cplusplus #include /* for printf() prototype */ int main (int argc, char *argv[]) { #else int main (argc, argv) int argc; char *argv[]; { #endif #if defined (host_mips) && defined (MIPSEB) #if defined (SYSTYPE_SYSV) printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_SVR4) printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); #endif #endif exit (-1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c \ && $dummy `echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` \ && exit 0 echo mips-mips-riscos${UNAME_RELEASE} exit 0 ;; Motorola:PowerMAX_OS:*:*) echo powerpc-motorola-powermax exit 0 ;; Motorola:*:4.3:PL8-*) echo powerpc-harris-powermax exit 0 ;; Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) echo powerpc-harris-powermax exit 0 ;; Night_Hawk:Power_UNIX:*:*) echo powerpc-harris-powerunix exit 0 ;; m88k:CX/UX:7*:*) echo m88k-harris-cxux7 exit 0 ;; m88k:*:4*:R4*) echo m88k-motorola-sysv4 exit 0 ;; m88k:*:3*:R3*) echo m88k-motorola-sysv3 exit 0 ;; AViiON:dgux:*:*) # DG/UX returns AViiON for all architectures UNAME_PROCESSOR=`/usr/bin/uname -p` if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] then if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ [ ${TARGET_BINARY_INTERFACE}x = x ] then echo m88k-dg-dgux${UNAME_RELEASE} else echo m88k-dg-dguxbcs${UNAME_RELEASE} fi else echo i586-dg-dgux${UNAME_RELEASE} fi exit 0 ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) echo m88k-dolphin-sysv3 exit 0 ;; M88*:*:R3*:*) # Delta 88k system running SVR3 echo m88k-motorola-sysv3 exit 0 ;; XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) echo m88k-tektronix-sysv3 exit 0 ;; Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) echo m68k-tektronix-bsd exit 0 ;; *:IRIX*:*:*) echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` exit 0 ;; ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id exit 0 ;; # Note that: echo "'`uname -s`'" gives 'AIX ' i*86:AIX:*:*) echo i386-ibm-aix exit 0 ;; ia64:AIX:*:*) if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} exit 0 ;; *:AIX:2:3) if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include main() { if (!__power_pc()) exit(1); puts("powerpc-ibm-aix3.2.5"); exit(0); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && $dummy && exit 0 echo rs6000-ibm-aix3.2.5 elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then echo rs6000-ibm-aix3.2.4 else echo rs6000-ibm-aix3.2 fi exit 0 ;; *:AIX:*:[45]) IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then IBM_ARCH=rs6000 else IBM_ARCH=powerpc fi if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${IBM_ARCH}-ibm-aix${IBM_REV} exit 0 ;; *:AIX:*:*) echo rs6000-ibm-aix exit 0 ;; ibmrt:4.4BSD:*|romp-ibm:BSD:*) echo romp-ibm-bsd4.4 exit 0 ;; ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to exit 0 ;; # report: romp-ibm BSD 4.3 *:BOSX:*:*) echo rs6000-bull-bosx exit 0 ;; DPX/2?00:B.O.S.:*:*) echo m68k-bull-sysv3 exit 0 ;; 9000/[34]??:4.3bsd:1.*:*) echo m68k-hp-bsd exit 0 ;; hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) echo m68k-hp-bsd4.4 exit 0 ;; 9000/[34678]??:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` case "${UNAME_MACHINE}" in 9000/31? ) HP_ARCH=m68000 ;; 9000/[34]?? ) HP_ARCH=m68k ;; 9000/[678][0-9][0-9]) if [ -x /usr/bin/getconf ]; then sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` case "${sc_cpu_version}" in 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 532) # CPU_PA_RISC2_0 case "${sc_kernel_bits}" in 32) HP_ARCH="hppa2.0n" ;; 64) HP_ARCH="hppa2.0w" ;; '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 esac ;; esac fi if [ "${HP_ARCH}" = "" ]; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #define _HPUX_SOURCE #include #include int main () { #if defined(_SC_KERNEL_BITS) long bits = sysconf(_SC_KERNEL_BITS); #endif long cpu = sysconf (_SC_CPU_VERSION); switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0"); break; case CPU_PA_RISC1_1: puts ("hppa1.1"); break; case CPU_PA_RISC2_0: #if defined(_SC_KERNEL_BITS) switch (bits) { case 64: puts ("hppa2.0w"); break; case 32: puts ("hppa2.0n"); break; default: puts ("hppa2.0"); break; } break; #else /* !defined(_SC_KERNEL_BITS) */ puts ("hppa2.0"); break; #endif default: puts ("hppa1.0"); break; } exit (0); } EOF (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` test -z "$HP_ARCH" && HP_ARCH=hppa fi ;; esac if [ ${HP_ARCH} = "hppa2.0w" ] then # avoid double evaluation of $set_cc_for_build test -n "$CC_FOR_BUILD" || eval $set_cc_for_build if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E -) | grep __LP64__ >/dev/null then HP_ARCH="hppa2.0w" else HP_ARCH="hppa64" fi fi echo ${HP_ARCH}-hp-hpux${HPUX_REV} exit 0 ;; ia64:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` echo ia64-hp-hpux${HPUX_REV} exit 0 ;; 3050*:HI-UX:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include int main () { long cpu = sysconf (_SC_CPU_VERSION); /* The order matters, because CPU_IS_HP_MC68K erroneously returns true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct results, however. */ if (CPU_IS_PA_RISC (cpu)) { switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; default: puts ("hppa-hitachi-hiuxwe2"); break; } } else if (CPU_IS_HP_MC68K (cpu)) puts ("m68k-hitachi-hiuxwe2"); else puts ("unknown-hitachi-hiuxwe2"); exit (0); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && $dummy && exit 0 echo unknown-hitachi-hiuxwe2 exit 0 ;; 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) echo hppa1.1-hp-bsd exit 0 ;; 9000/8??:4.3bsd:*:*) echo hppa1.0-hp-bsd exit 0 ;; *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) echo hppa1.0-hp-mpeix exit 0 ;; hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) echo hppa1.1-hp-osf exit 0 ;; hp8??:OSF1:*:*) echo hppa1.0-hp-osf exit 0 ;; i*86:OSF1:*:*) if [ -x /usr/sbin/sysversion ] ; then echo ${UNAME_MACHINE}-unknown-osf1mk else echo ${UNAME_MACHINE}-unknown-osf1 fi exit 0 ;; parisc*:Lites*:*:*) echo hppa1.1-hp-lites exit 0 ;; C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) echo c1-convex-bsd exit 0 ;; C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit 0 ;; C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) echo c34-convex-bsd exit 0 ;; C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) echo c38-convex-bsd exit 0 ;; C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) echo c4-convex-bsd exit 0 ;; CRAY*Y-MP:*:*:*) echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit 0 ;; CRAY*[A-Z]90:*:*:*) echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ -e 's/\.[^.]*$/.X/' exit 0 ;; CRAY*TS:*:*:*) echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit 0 ;; CRAY*T3E:*:*:*) echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit 0 ;; CRAY*SV1:*:*:*) echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit 0 ;; *:UNICOS/mp:*:*) echo nv1-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit 0 ;; F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit 0 ;; 5000:UNIX_System_V:4.*:*) FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit 0 ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} exit 0 ;; sparc*:BSD/OS:*:*) echo sparc-unknown-bsdi${UNAME_RELEASE} exit 0 ;; *:BSD/OS:*:*) echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} exit 0 ;; *:FreeBSD:*:*) # Determine whether the default compiler uses glibc. eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include #if __GLIBC__ >= 2 LIBC=gnu #else LIBC= #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^LIBC=` # GNU/KFreeBSD systems have a "k" prefix to indicate we are using # FreeBSD's kernel, but not the complete OS. case ${LIBC} in gnu) kernel_only='k' ;; esac echo ${UNAME_MACHINE}-unknown-${kernel_only}freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`${LIBC:+-$LIBC} exit 0 ;; i*:CYGWIN*:*) echo ${UNAME_MACHINE}-pc-cygwin exit 0 ;; i*:MINGW*:*) echo ${UNAME_MACHINE}-pc-mingw32 exit 0 ;; i*:PW*:*) echo ${UNAME_MACHINE}-pc-pw32 exit 0 ;; x86:Interix*:[34]*) echo i586-pc-interix${UNAME_RELEASE}|sed -e 's/\..*//' exit 0 ;; [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) echo i${UNAME_MACHINE}-pc-mks exit 0 ;; i*:Windows_NT*:* | Pentium*:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we # UNAME_MACHINE based on the output of uname instead of i386? echo i586-pc-interix exit 0 ;; i*:UWIN*:*) echo ${UNAME_MACHINE}-pc-uwin exit 0 ;; p*:CYGWIN*:*) echo powerpcle-unknown-cygwin exit 0 ;; prep*:SunOS:5.*:*) echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit 0 ;; *:GNU:*:*) # the GNU system echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` exit 0 ;; *:GNU/*:*:*) # other systems with GNU libc and userland echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu exit 0 ;; i*86:Minix:*:*) echo ${UNAME_MACHINE}-pc-minix exit 0 ;; arm*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit 0 ;; cris:Linux:*:*) echo cris-axis-linux-gnu exit 0 ;; ia64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit 0 ;; m68*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit 0 ;; mips:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #undef CPU #undef mips #undef mipsel #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=mipsel #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=mips #else CPU= #endif #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^CPU=` test x"${CPU}" != x && echo "${CPU}-unknown-linux-gnu" && exit 0 ;; mips64:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #undef CPU #undef mips64 #undef mips64el #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=mips64el #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=mips64 #else CPU= #endif #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^CPU=` test x"${CPU}" != x && echo "${CPU}-unknown-linux-gnu" && exit 0 ;; ppc:Linux:*:*) echo powerpc-unknown-linux-gnu exit 0 ;; ppc64:Linux:*:*) echo powerpc64-unknown-linux-gnu exit 0 ;; alpha:Linux:*:*) case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in EV5) UNAME_MACHINE=alphaev5 ;; EV56) UNAME_MACHINE=alphaev56 ;; PCA56) UNAME_MACHINE=alphapca56 ;; PCA57) UNAME_MACHINE=alphapca56 ;; EV6) UNAME_MACHINE=alphaev6 ;; EV67) UNAME_MACHINE=alphaev67 ;; EV68*) UNAME_MACHINE=alphaev68 ;; esac objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} exit 0 ;; parisc:Linux:*:* | hppa:Linux:*:*) # Look for CPU level case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in PA7*) echo hppa1.1-unknown-linux-gnu ;; PA8*) echo hppa2.0-unknown-linux-gnu ;; *) echo hppa-unknown-linux-gnu ;; esac exit 0 ;; parisc64:Linux:*:* | hppa64:Linux:*:*) echo hppa64-unknown-linux-gnu exit 0 ;; s390:Linux:*:* | s390x:Linux:*:*) echo ${UNAME_MACHINE}-ibm-linux exit 0 ;; sh64*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit 0 ;; sh*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit 0 ;; sparc:Linux:*:* | sparc64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit 0 ;; x86_64:Linux:*:*) echo x86_64-unknown-linux-gnu exit 0 ;; i*86:Linux:*:*) # The BFD linker knows what the default object file format is, so # first see if it will tell us. cd to the root directory to prevent # problems with other programs or directories called `ld' in the path. # Set LC_ALL=C to ensure ld outputs messages in English. ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \ | sed -ne '/supported targets:/!d s/[ ][ ]*/ /g s/.*supported targets: *// s/ .*// p'` case "$ld_supported_targets" in elf32-i386) TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu" ;; a.out-i386-linux) echo "${UNAME_MACHINE}-pc-linux-gnuaout" exit 0 ;; coff-i386) echo "${UNAME_MACHINE}-pc-linux-gnucoff" exit 0 ;; "") # Either a pre-BFD a.out linker (linux-gnuoldld) or # one that does not give us useful --help. echo "${UNAME_MACHINE}-pc-linux-gnuoldld" exit 0 ;; esac # Determine whether the default compiler is a.out or elf eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include #ifdef __ELF__ # ifdef __GLIBC__ # if __GLIBC__ >= 2 LIBC=gnu # else LIBC=gnulibc1 # endif # else LIBC=gnulibc1 # endif #else #ifdef __INTEL_COMPILER LIBC=gnu #else LIBC=gnuaout #endif #endif #ifdef __dietlibc__ LIBC=dietlibc #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^LIBC=` test x"${LIBC}" != x && echo "${UNAME_MACHINE}-pc-linux-${LIBC}" && exit 0 test x"${TENTATIVE}" != x && echo "${TENTATIVE}" && exit 0 ;; i*86:DYNIX/ptx:4*:*) # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. # earlier versions are messed up and put the nodename in both # sysname and nodename. echo i386-sequent-sysv4 exit 0 ;; i*86:UNIX_SV:4.2MP:2.*) # Unixware is an offshoot of SVR4, but it has its own version # number series starting with 2... # I am not positive that other SVR4 systems won't match this, # I just have to hope. -- rms. # Use sysv4.2uw... so that sysv4* matches it. echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} exit 0 ;; i*86:OS/2:*:*) # If we were able to find `uname', then EMX Unix compatibility # is probably installed. echo ${UNAME_MACHINE}-pc-os2-emx exit 0 ;; i*86:XTS-300:*:STOP) echo ${UNAME_MACHINE}-unknown-stop exit 0 ;; i*86:atheos:*:*) echo ${UNAME_MACHINE}-unknown-atheos exit 0 ;; i*86:syllable:*:*) echo ${UNAME_MACHINE}-pc-syllable exit 0 ;; i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*) echo i386-unknown-lynxos${UNAME_RELEASE} exit 0 ;; i*86:*DOS:*:*) echo ${UNAME_MACHINE}-pc-msdosdjgpp exit 0 ;; i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} else echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} fi exit 0 ;; i*86:*:5:[78]*) case `/bin/uname -X | grep "^Machine"` in *486*) UNAME_MACHINE=i486 ;; *Pentium) UNAME_MACHINE=i586 ;; *Pent*|*Celeron) UNAME_MACHINE=i686 ;; esac echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} exit 0 ;; i*86:*:3.2:*) if test -f /usr/options/cb.name; then UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ && UNAME_MACHINE=i586 (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ && UNAME_MACHINE=i686 (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ && UNAME_MACHINE=i686 echo ${UNAME_MACHINE}-pc-sco$UNAME_REL else echo ${UNAME_MACHINE}-pc-sysv32 fi exit 0 ;; pc:*:*:*) # Left here for compatibility: # uname -m prints for DJGPP always 'pc', but it prints nothing about # the processor, so we play safe by assuming i386. echo i386-pc-msdosdjgpp exit 0 ;; Intel:Mach:3*:*) echo i386-pc-mach3 exit 0 ;; paragon:*:*:*) echo i860-intel-osf1 exit 0 ;; i860:*:4.*:*) # i860-SVR4 if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 else # Add other i860-SVR4 vendors below as they are discovered. echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 fi exit 0 ;; mini*:CTIX:SYS*5:*) # "miniframe" echo m68010-convergent-sysv exit 0 ;; mc68k:UNIX:SYSTEM5:3.51m) echo m68k-convergent-sysv exit 0 ;; M680?0:D-NIX:5.3:*) echo m68k-diab-dnix exit 0 ;; M68*:*:R3V[567]*:*) test -r /sysV68 && echo 'm68k-motorola-sysv' && exit 0 ;; 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0) OS_REL='' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && echo i486-ncr-sysv4.3${OS_REL} && exit 0 /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && echo i586-ncr-sysv4.3${OS_REL} && exit 0 ;; 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && echo i486-ncr-sysv4 && exit 0 ;; m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) echo m68k-unknown-lynxos${UNAME_RELEASE} exit 0 ;; mc68030:UNIX_System_V:4.*:*) echo m68k-atari-sysv4 exit 0 ;; TSUNAMI:LynxOS:2.*:*) echo sparc-unknown-lynxos${UNAME_RELEASE} exit 0 ;; rs6000:LynxOS:2.*:*) echo rs6000-unknown-lynxos${UNAME_RELEASE} exit 0 ;; PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*) echo powerpc-unknown-lynxos${UNAME_RELEASE} exit 0 ;; SM[BE]S:UNIX_SV:*:*) echo mips-dde-sysv${UNAME_RELEASE} exit 0 ;; RM*:ReliantUNIX-*:*:*) echo mips-sni-sysv4 exit 0 ;; RM*:SINIX-*:*:*) echo mips-sni-sysv4 exit 0 ;; *:SINIX-*:*:*) if uname -p 2>/dev/null >/dev/null ; then UNAME_MACHINE=`(uname -p) 2>/dev/null` echo ${UNAME_MACHINE}-sni-sysv4 else echo ns32k-sni-sysv fi exit 0 ;; PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort # says echo i586-unisys-sysv4 exit 0 ;; *:UNIX_System_V:4*:FTX*) # From Gerald Hewes . # How about differentiating between stratus architectures? -djm echo hppa1.1-stratus-sysv4 exit 0 ;; *:*:*:FTX*) # From seanf@swdc.stratus.com. echo i860-stratus-sysv4 exit 0 ;; *:VOS:*:*) # From Paul.Green@stratus.com. echo hppa1.1-stratus-vos exit 0 ;; mc68*:A/UX:*:*) echo m68k-apple-aux${UNAME_RELEASE} exit 0 ;; news*:NEWS-OS:6*:*) echo mips-sony-newsos6 exit 0 ;; R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) if [ -d /usr/nec ]; then echo mips-nec-sysv${UNAME_RELEASE} else echo mips-unknown-sysv${UNAME_RELEASE} fi exit 0 ;; BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. echo powerpc-be-beos exit 0 ;; BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. echo powerpc-apple-beos exit 0 ;; BePC:BeOS:*:*) # BeOS running on Intel PC compatible. echo i586-pc-beos exit 0 ;; SX-4:SUPER-UX:*:*) echo sx4-nec-superux${UNAME_RELEASE} exit 0 ;; SX-5:SUPER-UX:*:*) echo sx5-nec-superux${UNAME_RELEASE} exit 0 ;; SX-6:SUPER-UX:*:*) echo sx6-nec-superux${UNAME_RELEASE} exit 0 ;; Power*:Rhapsody:*:*) echo powerpc-apple-rhapsody${UNAME_RELEASE} exit 0 ;; *:Rhapsody:*:*) echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} exit 0 ;; *:Darwin:*:*) case `uname -p` in *86) UNAME_PROCESSOR=i686 ;; powerpc) UNAME_PROCESSOR=powerpc ;; esac echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} exit 0 ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) UNAME_PROCESSOR=`uname -p` if test "$UNAME_PROCESSOR" = "x86"; then UNAME_PROCESSOR=i386 UNAME_MACHINE=pc fi echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} exit 0 ;; *:QNX:*:4*) echo i386-pc-qnx exit 0 ;; NSR-?:NONSTOP_KERNEL:*:*) echo nsr-tandem-nsk${UNAME_RELEASE} exit 0 ;; *:NonStop-UX:*:*) echo mips-compaq-nonstopux exit 0 ;; BS2000:POSIX*:*:*) echo bs2000-siemens-sysv exit 0 ;; DS/*:UNIX_System_V:*:*) echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} exit 0 ;; *:Plan9:*:*) # "uname -m" is not consistent, so use $cputype instead. 386 # is converted to i386 for consistency with other x86 # operating systems. if test "$cputype" = "386"; then UNAME_MACHINE=i386 else UNAME_MACHINE="$cputype" fi echo ${UNAME_MACHINE}-unknown-plan9 exit 0 ;; *:TOPS-10:*:*) echo pdp10-unknown-tops10 exit 0 ;; *:TENEX:*:*) echo pdp10-unknown-tenex exit 0 ;; KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) echo pdp10-dec-tops20 exit 0 ;; XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) echo pdp10-xkl-tops20 exit 0 ;; *:TOPS-20:*:*) echo pdp10-unknown-tops20 exit 0 ;; *:ITS:*:*) echo pdp10-unknown-its exit 0 ;; SEI:*:*:SEIUX) echo mips-sei-seiux${UNAME_RELEASE} exit 0 ;; *:DragonFly:*:*) echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` exit 0 ;; esac #echo '(No uname command or uname output not recognized.)' 1>&2 #echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 eval $set_cc_for_build cat >$dummy.c < # include #endif main () { #if defined (sony) #if defined (MIPSEB) /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, I don't know.... */ printf ("mips-sony-bsd\n"); exit (0); #else #include printf ("m68k-sony-newsos%s\n", #ifdef NEWSOS4 "4" #else "" #endif ); exit (0); #endif #endif #if defined (__arm) && defined (__acorn) && defined (__unix) printf ("arm-acorn-riscix"); exit (0); #endif #if defined (hp300) && !defined (hpux) printf ("m68k-hp-bsd\n"); exit (0); #endif #if defined (NeXT) #if !defined (__ARCHITECTURE__) #define __ARCHITECTURE__ "m68k" #endif int version; version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; if (version < 4) printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); else printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); exit (0); #endif #if defined (MULTIMAX) || defined (n16) #if defined (UMAXV) printf ("ns32k-encore-sysv\n"); exit (0); #else #if defined (CMU) printf ("ns32k-encore-mach\n"); exit (0); #else printf ("ns32k-encore-bsd\n"); exit (0); #endif #endif #endif #if defined (__386BSD__) printf ("i386-pc-bsd\n"); exit (0); #endif #if defined (sequent) #if defined (i386) printf ("i386-sequent-dynix\n"); exit (0); #endif #if defined (ns32000) printf ("ns32k-sequent-dynix\n"); exit (0); #endif #endif #if defined (_SEQUENT_) struct utsname un; uname(&un); if (strncmp(un.version, "V2", 2) == 0) { printf ("i386-sequent-ptx2\n"); exit (0); } if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ printf ("i386-sequent-ptx1\n"); exit (0); } printf ("i386-sequent-ptx\n"); exit (0); #endif #if defined (vax) # if !defined (ultrix) # include # if defined (BSD) # if BSD == 43 printf ("vax-dec-bsd4.3\n"); exit (0); # else # if BSD == 199006 printf ("vax-dec-bsd4.3reno\n"); exit (0); # else printf ("vax-dec-bsd\n"); exit (0); # endif # endif # else printf ("vax-dec-bsd\n"); exit (0); # endif # else printf ("vax-dec-ultrix\n"); exit (0); # endif #endif #if defined (alliant) && defined (i860) printf ("i860-alliant-bsd\n"); exit (0); #endif exit (1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && $dummy && exit 0 # Apollos put the system type in the environment. test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit 0; } # Convex versions that predate uname can use getsysinfo(1) if [ -x /usr/convex/getsysinfo ] then case `getsysinfo -f cpu_type` in c1*) echo c1-convex-bsd exit 0 ;; c2*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit 0 ;; c34*) echo c34-convex-bsd exit 0 ;; c38*) echo c38-convex-bsd exit 0 ;; c4*) echo c4-convex-bsd exit 0 ;; esac fi cat >&2 < in order to provide the needed information to handle your system. config.guess timestamp = $timestamp uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` /bin/uname -X = `(/bin/uname -X) 2>/dev/null` hostinfo = `(hostinfo) 2>/dev/null` /bin/universe = `(/bin/universe) 2>/dev/null` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` /bin/arch = `(/bin/arch) 2>/dev/null` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` UNAME_MACHINE = ${UNAME_MACHINE} UNAME_RELEASE = ${UNAME_RELEASE} UNAME_SYSTEM = ${UNAME_SYSTEM} UNAME_VERSION = ${UNAME_VERSION} EOF exit 1 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: iaxmodem-1.2.0/iaxmodem-cfg.ttyIAX0000644000175000017500000000026211150047257016321 0ustar julienjuliendevice /dev/ttyIAX owner uucp:uucp mode 660 port 4570 refresh 300 server 127.0.0.1 peername iaxmodem secret password cidname John Doe cidnumber 8005551212 codec slinear iaxmodem-1.2.0/termpkg-ttydforfax.patch0000644000175000017500000000210011150047257017530 0ustar julienjulien--- termpkg-3.3/linux/termnet/ttyd.c.orig 2005-09-29 08:59:05.000000000 -1000 +++ termpkg-3.3/linux/termnet/ttyd.c 2005-09-29 08:51:33.000000000 -1000 @@ -340,7 +340,10 @@ char *cp; int x; for (cp = commbuf, x = 0; x < cnt; x++, cp++) +if (isprint(*cp)) syslog(LOG_DEBUG, "ttyd: Have net char 0x%x, |%c|", *cp, *cp); +else +syslog(LOG_DEBUG, "ttyd: Have net char 0x%x", *cp); } write(fd, commbuf, cnt); } @@ -366,9 +369,13 @@ char *cp; int x; for (cp = commbuf, x = 0; x < cnt; x++, cp++) +if (isprint(*cp)) syslog(LOG_DEBUG, "ttyd: Have key char 0x%x, |%c|", *cp, *cp); +else +syslog(LOG_DEBUG, "ttyd: Have key char 0x%x", *cp); } - inputTerminal(commbuf, cnt); +// inputTerminal(commbuf, cnt); +write(fileno(tnlout), commbuf, cnt); } else break; iaxmodem-1.2.0/configure0000755000175000017500000000150211150047257014562 0ustar julienjulien#!/bin/sh cd lib/libiax2 && \ ./configure CFLAGS="$CFLAGS" LDFLAGS="$LDFLAGS" --disable-shared && \ cd ../../lib/spandsp && \ ./configure CFLAGS="$CFLAGS" LDFLAGS="$LDFLAGS" --disable-shared && \ cd ../.. if [ $? != 0 ]; then exit 1 fi IAXMODEMVER="`cat VERSION`" STEP1=`grep @VERSION@ lib/spandsp/config.status | sed 's/;.*//g'` DSPVER=`echo "@VERSION@" | sed ${STEP1}` if [ -n "${DSPVER}" ]; then DSPVER="spandsp-${DSPVER}-snapshot-20080725" fi STEP1=`grep @VERSION@ lib/libiax2/config.status | sed 's/;.*//g'` IAXVER=`echo "@VERSION@" | sed ${STEP1}` if [ -n "${IAXVER}" ]; then IAXVER="libiax2-${IAXVER}-SVN-20071223+" fi cat Makefile.in | sed -e "s/@VERSION@/${IAXMODEMVER}/g" | \ sed -e "s/@DSPVER@/${DSPVER}/g" | \ sed -e "s/@IAXVER@/${IAXVER}/g" > Makefile echo ${IAXMODEMVER} echo ${IAXVER} echo ${DSPVER} exit $? iaxmodem-1.2.0/README0000644000175000017500000003051411150047257013540 0ustar julienjulien ** ABOUT IAXMODEM ** IAXmodem is a software modem written in C that uses an IAX channel (commonly provided by an Asterisk PBX system) instead of a traditional phone line and uses a DSP library instead of DSP hardware chipsets. To accomplish this, then, IAXmodem interfaces an IAX library known as libiax2 with a DSP library known as spandsp, and then IAXmodem interfaces the DSP library with a tty device node for interfacing with modem (fax) applications. IAXmodem comes with a copy of both libiax2 and spandsp. Both of these libraries may have had bugs fixed or enhancements added for specific use with IAXmodem. Although these changes are submitted to the library authors/maintainers and may be committed to the upstream repositories, it is recommended that the versions here be used for iaxmodem if only for the reason that these versions have been tested and are known to work. If you are using other applications that require a different libiax2 or spandsp version then iaxmodem can be statically linked to the libraries after building the versions here (but not installing them). See the part about "build static" below. Currently supported platforms are GNU/Linux on x86 hardware. The libiax2 source was pulled from iaxclient SVN on December 23, 2007. The spandsp source is spandsp-0.0.5 snapshot 20080725. IAXmodem should usually be installed either on the same machine as the Asterisk server or on a system that is very close to the Asterisk server on a controlled network. Do not even bother trying to use IAXmodem to send faxes through your IAX-supporting VoIP provider, it won't work reliably, if at all. Please see the FAQ file for more information regarding IAXmodem. ** INSTALLING IAXMODEM ** There are two ways to build IAXmodem. One way uses dynamic libraries; the other way uses static libraries. If you already have an installation of an incompatible spandsp or libiax2 on the system, then you should probably build using static libraries. To install libiax2: (if you're not going to 'build static') # cd lib/libiax2 # ./configure # make # make install To install spandsp: (if you're not going to 'build static') # cd lib/spandsp # ./configure # make # make install If you're building with dynamic libraries, make sure that your linker can find these libraries by having a line in your /etc/ld.so.conf file that is "/usr/local/lib" and running 'ldconfig' afterwards. To build IAXmodem with dynamic linking: # ./build To build IAXmodem with static linking: # ./build static This will create the iaxmodem binary. You may run the binary from its present location, or you may copy it to any location that you may choose. The build script also accepts one other command-line option: -bsdptys. This option must come first, like this: # ./build -bsdptys Alternatively you can build IAXmodem with static linking by running the more traditional: # ./configure # make Create the /etc/iaxmodem directory. The modem configuration files will be stored in here. With your favorite editor edit the prototype modem configuration file, iaxmodem-cfg.ttyIAX. Alter the configuration lines as needed and desired. The "device" entry is the full name of the device that you will be using in your modem application. If running multiple instances of iaxmodem then you will need a different device for each instance. The "owner" entry (formatted "user:group") is the system user and group that IAXmodem should use for the created device. The "mode" entry is the permissions mode for the created device. The "port" entry refers to the preferred port number on which to listen for communications from the Asterisk server (so if you're using more than one IAXmodem on a single IP address you will need to have each IAXmodem configuration use a different port). You should not use "4569" if Asterisk is already listening on port 4569. The "refresh" entry indicates the preference on how frequently to refresh the registration with the Asterisk server. (However, the actual refresh value that is used will be negotiated between IAXmodem and the Asterisk server.) By setting this to a value of "0" (zero), IAXmodem will not register with the server, and thus the server should be configured to communicate with IAXmodem on a static address. The "server", "peername", and "secret" entries refer to the server name (or address), the registered peer name for the IAXmodem client, and the registered secret (password) for the IAXmodem client. The entries "cidname" and "cidnumber" refer to the Caller*ID presentation that will be made by IAXmodem to the Asterisk server. The "codec" entry refers to the preferred audio codec. This can be "slinear", "ulaw", or "alaw". The "record" entry causes audio files to be recorded (see below). The "replay" entry causes the audio files to be replayed back (see below). The "nojitterbuffer" entry disables the very simple iaxmodem jitterbuffer (see below). The "iax2debug" entry enables debugging output for IAX2. The "dspdebug" entry enables debugging output for the DSPs. The "nodaemon" entry exempts the modem from inclusion with daemon use. Comments can be placed into the IAXmodem configuration files by beginning them with a semicolon (";"). Now copy this file to the /etc/iaxmodem directory with a unique file name. The name of the file will serve as the identifier, if you choose to launch iaxmodem in non-daemon mode (see below). ** RUNNING IAXMODEM ** Now you are ready to start IAXmodem. IAXmodem can be run in two manners, daemon mode, or non-daemon. Initially you should probably run iaxmodem at least once in non-daemon mode, just to make sure things are working (that iaxmodem registers). ---------- In non-daemon mode, IAXmodem is started by supplying the configuration identifier as the only command-line parameter, like this: /path/to/iaxmodem ttyIAX In this example the modem configuration file is expected to be: /etc/iaxmodem/ttyIAX You should probably run IAXmodem like this at least once to check to see that registration occurs properly (then press ^C to exit). In non-daemon mode IAXmodem does not detach itself from the controlling tty, and it does send logging data both to standard output (informational items) and to standard error (errors). As this logging can be a bit verbose, you may choose to ignore all of it by starting IAXmodem like this: /path/to/iaxmodem ttyIAX >/dev/null 2>&1 Alternatively, if you wish to record this into rotated log files: /path/to/iaxmodem ttyIAX >/tmp/iaxmodem.stdout 2>/tmp/iaxmodem.stderr You may also choose to run IAXmodem from init by placing an entry into the /etc/inittab file like this (and then restarting init): IAX:2345:respawn:/path/to/iaxmodem ttyIAX ---------- In daemon mode, IAXmodem is started by not supplying a configuration identifier on the command-line, like this: /path/to/iaxmodem This will cause iaxmodem to detach itself from the controlling tty and launch a separate iaxmodem instance for every modem configuration file found in /etc/iaxmodem. In daemon mode IAXmodem sends logging data to files in the /var/log/iaxmodem directory, if available. (The /var/log/iaxmodem directory will need to be created.) You may wish to run iaxmodem in daemon mode and start it with a standard init.d script. The provided iaxmodem.init files should serve this purpose. (Choose the appropriate one for your distribution.) ---------- Some people want to launch iaxmodem in a manner like daemon mode, but for various reasons (like runit compatibility) need the parent process to not detach itself from the controlling tty. This is done with the -F option like this: /path/to/iaxmodem -F ** USING IAX MODEM ** Once IAXmodem is running you are ready to use it with your application. If your application is HylaFAX, there is a HylaFAX modem configuration file included with IAXmodem (config.ttyIAX). The config file is for HylaFAX version 4.2.2 and later. Instead of running faxaddmodem, simply edit this config file to your liking and then copy it to /var/spool/hylafax/etc/. (Run faxgetty and the rest of HylaFAX as usual.) If using the "record" option, IAXmodem will create two audio files in the /tmp/ directory. These files are overwritten by each new audio call. The file "ttyIAX-dsp.raw" is the audio that was received by IAXmodem from the DSP library (which IAXmodem delivered to the IAX library), and the file "ttyIAX-iax.raw" is the audio that was received by IAXmodem from the IAX library (which IAXmodem delivered to the DSP library). These audio files can be converted by sox into playable WAV files in this way: sox -s -w -r 8000 -c 1 ttyIAX-iax.raw playable.wav If using the "replay" option, IAXmodem will replay the audio in the audio files previously recorded by "record". So the audio that is passed to the DSP comes from "ttyIAX-iax.raw" instead of from the IAX channel, and the audio that is passed to the IAX channel comes from "ttyIAX-dsp.raw" instead of from the DSP. This feature is indended to provide a simple and reliable way to methodically repeat a call session for debugging. Use of "replay" will disable "record". Jitter occurs when audio is received out of sequence. Normally this involves missing audio packets, but sometimes it can involve mis- ordered audio. Jitter occurs because the UDP communication medium graciously allows packets to be dropped by the network, and so on collision-prone links these audio packets will be dropped when deemed necessary by the network equipment. Jitter should not occur if iaxmodem is communicating directly with the PBX over a loopback or directly-wired (crossover) interface. By default iaxmodem copes with received jitter by replacing missing audio with "fill" from the previously-received audio packet and by dropping mis-ordered audio packets. The intention behind this is to prevent our packet counting from falling behind the other endpoint, to prevent jitter from causing carrier drops or from producing a carrier when there shouldn't be one. In some cases this fill behavior may be undesireable, and instead it would better to just skip the missing audio (thus letting our packet counting fall slightly behind). In order to disable the jitterbuffer put "nojitterbuffer" into the iaxmodem config file. By default iaxmodem, when starting, will examine an existing log file to see if it is larger than 1GB. If it is, then iaxmodem will rename that file with ".old" at the end, deleting any existing ".old" log file. The purpose in this is to prevent iaxmodem logging from consuming too much disk space. However, the astute iaxmodem administrator should probably employ a system-wide logrotate service to rotate the iaxmodem logging independently. An appropriate logrotate.d entry for iaxmodem may look like this: /var/log/iaxmodem/*.log { notifempty missingok postrotate /bin/kill -HUP `cat /var/run/iaxmodem.pid` || true endscript } Modems typically should be reset and reinitialized after each call (in case something within the call put the modem into a bad state). During initialization it is difficult, if not impossible, to properly handle incoming calls. For this reason IAXmodem is "busied-out" for five seconds after going on-hook (ATH0 or ATZ). If the initialization sequence can last longer than that time it would be advisable, then, to take the modem off-hook (ATH1) at the outset of initialization and to place it back on-hook (ATH0) when done (in which case the modem will be busied out during the entire initialization sequence plus five seconds after it finishes). For HylaFAX the five-second automatic busy-out should be sufficient. ** CONTRIBUTING ** * Bug Reports - If you use IAXmodem and encounter a problem please do report it, even if you can work around the problem and even if you do not intend to fix the problem. * Patches - If you develop a patch (bug fix or enhancement) please do share it. If you would like to develop, but don't know what to do, please look at the list of items in the TODO file. * Commission Work - If you use or would like to use IAXmodem and need some work done, hire someone to do it (the author can provide suggestions) and share that work. * Donations - The author is always happy to accept donations of just about any kind. ** CONTACTS and SUPPORT ** Original Author: Lee Howard Website: http://iaxmodem.sourceforge.net Mailing List: iaxmodem-users@lists.sourceforge.net iaxmodem-1.2.0/iaxmodem.10000644000175000017500000000315311150047257014544 0ustar julienjulien.\" Hey, EMACS: -*- nroff -*- .\" First parameter, NAME, should be all caps .\" Second parameter, SECTION, should be 1-8, maybe w/ subsection .\" other parameters are allowed: see man(7), man(1) .TH IAXMODEM 1 "February 27, 2006" .\" Please adjust this date whenever revising the manpage. .\" .\" Some roff macros, for reference: .\" .nh disable hyphenation .\" .hy enable hyphenation .\" .ad l left justify .\" .ad b justify to both left and right margins .\" .nf disable filling .\" .fi enable filling .\" .br insert line break .\" .sp insert n+1 empty lines .\" for manpage-specific macros, see man(7) .SH NAME iaxmodem \- software modem with IAX2 connectivity .SH SYNOPSIS .B iaxmodem .RI [configname] .SH DESCRIPTION .\" TeX users may be more comfortable with the \fB\fP and .\" \fI\fP escape sequences to invode bold face and italics, .\" respectively. \fBiaxmodem\fP is a software modem with IAX2 connectivity designed to connect fax software like HylaFAX or efax to a PBX system such as Asterisk. .SH OPTIONS \fBiaxmodem\fP runs as a standalone daemon when no \fIconfigname\fP is specified on the command line, spawning one process per config file found under \fI/etc/iaxmodem/*\fP. Otherwise, \fBiaxmodem\fP runs as a single soft modem using the specified \fIconfigname\fP (\fI/etc/iaxmodem/configname\fP). .SH AUTHOR iaxmodem was written by Lee Howard . .PP This manual page was written by Julien BLACHE and contributed to the Debian project, but may be used by others. iaxmodem-1.2.0/VERSION0000644000175000017500000000000611150047257013721 0ustar julienjulien1.2.0 iaxmodem-1.2.0/config.ttyIAX0000644000175000017500000000433211150047260015222 0ustar julienjulienCountryCode: 1 AreaCode: 800 FAXNumber: +1.800.555.1212 LongDistancePrefix: 1 InternationalPrefix: 011 DialStringRules: etc/dialrules ServerTracing: 0xFFF SessionTracing: 0xFFF RecvFileMode: 0600 LogFileMode: 0600 DeviceMode: 0600 RingsBeforeAnswer: 1 SpeakerVolume: off GettyArgs: "-h %l dx_%s" LocalIdentifier: "IAXmodem" TagLineFont: etc/lutRS18.pcf TagLineFormat: "From %%l|%c|Page %%P of %%T" MaxRecvPages: 200 # # # Modem-related stuff: should reflect modem command interface # and hardware connection/cabling (e.g. flow control). # ModemType: Class1 # use this to supply a hint # # Enabling this will use the hfaxd-protocol to set Caller*ID # #ModemSetOriginCmd: AT+VSID="%s","%d" # # If "glare" during initialization becomes a problem then take # the modem off-hook during initialization, and then place it # back on-hook when done. # #ModemResetCmds: "ATH1\nAT+VCID=1" # enables CallID display #ModemReadyCmds: ATH0 Class1AdaptRecvCmd: AT+FAR=1 Class1TMConnectDelay: 400 # counteract quick CONNECT response # # If you have trouble with V.17 receiving or sending, # you may want to enable one of these, respectively. # #Class1RMQueryCmd: "!24,48,72,96" # enable this to disable V.17 receiving #Class1TMQueryCmd: "!24,48,72,96" # enable this to disable V.17 sending # # You'll likely want Caller*ID display (also displays DID) enabled. # ModemResetCmds: AT+VCID=1 # enables CallID display # # The pty does not support changing parity. # PagerTTYParity: none # # If you are "missing" Caller*ID data on some calls (but not all) # and if you do not have adequate glare protection you may want to # not answer based on RINGs, but rather enable the CallIDAnswerLength # for NDID, disable AT+VCID=1 and do this: # #RingsBeforeAnswer: 0 #ModemRingResponse: AT+VRID=1 # Uncomment DATE and TIME if you really want them, but you probably don't. #CallIDPattern: "DATE=" #CallIDPattern: "TIME=" CallIDPattern: "NMBR=" CallIDPattern: "NAME=" CallIDPattern: "ANID=" #CallIDPattern: "USER=" # username provided by call #CallIDPattern: "PASS=" # password provided by call #CallIDPattern: "CDID=" # DID context in call CallIDPattern: "NDID=" #CallIDAnswerLength: 4 iaxmodem-1.2.0/TODO0000644000175000017500000000001711150047260013335 0ustar julienjuliennothing to do? iaxmodem-1.2.0/FAQ0000644000175000017500000002003611150047260013202 0ustar julienjulienThis is a set of anticipated questions and the associated answer. ----------------------------------------------------------------- Q1: IAX is VoIP. Isn't it bad to run fax over VoIP? A1: Yes, generally it is. The conditions of jitter, packet loss, and other latency issues cause problems for reassembling VoIP audio streams on the receiver exactly as they were disassembled on the sender. However, these latency conditions can be controlled. For example, these conditions should not be present when communicating over the localhost address (127.0.0.1) in the case where the Asterisk server and the system running IAXmodem are the same. Other possible arrangements could be to use a dedicated network connection (e.g. a crossover cable) between the Asterisk server and the system running IAXmodem. IAXmodem should also be fine to run over a local area network (LAN) that is well-designed and controlled. The basic point is this: if you can eliminate the mitigating factors of jitter and packet loss, then you can reliably use VoIP channels for faxing. ----------------------------------------------------------------- Q2: What about T.38? Isn't T.38 the end-all solution for faxing over the internet? A2: T.38 is great, and yes, it is the end-all solution for faxing over the internet. However, IAXmodem isn't designed to be used for faxing over the internet, as the internet is not a network that can control the latency conditions enough for faxing to work. So T.38 and IAXmodem are really trying to solve two different problems. Someday the PSTN may be entirely replaced by VoIP. Someday all fax machines may have T.38 support. In that day there will be no need for fax DSPs. But that day is not now, and it's not coming in the foreseeable future. When using VoIP, someone, somewhere on that VoIP chain must have a "PSTN gateway". Likewise, when using T.38, someone, somewhere on that chain must have a "T.38 gateway" (to the PSTN). And any time fax data is passed through the PSTN it must be modulated, and that requires DSPs. IAXmodem was designed to give the fax application tight control of the DSP behavior (through the Class 1 interface) and the developers tight control of the DSP behavior (through access to the source code). As long as fax DSPs are needed and someone using those DSPs wants tight control of how they work, then there is a place for IAXmodem. ----------------------------------------------------------------- Q3: Why is IAXmodem open-source and licensed with the GPL? A3: Firstly, much of the value in IAXmodem comes from being able to control the DSP. This cannot be done as desired without having the source code to the DSP. Second, having the source code allows all users the same opporunity to improve and enhance it, and (hopefully) by contributing that work back to the community IAXmodem and the libraries that it uses also improve. Third, IAXmodem depends heavily upon libiax2 and spandsp, both of which are licensed with the GPL. Licensing IAXmodem in some other way would have been possible, although prohibitively difficult, and may not have not fostered as much community involvement and contribution. ----------------------------------------------------------------- Q4: IAX is bad and libiax2 is even worse. Why didn't you use SIP or some other channel driver? A4: The availability of libiax2 and the small set of protocol in IAX (compared to SIP) made it attractive for the purposes of getting IAXmodem running quickly. Although libiax2 has needed some bug fixes for IAXmodem to work properly, and although libiax2 probably will need more bug fixing in the future, it seemed like using it was the quickest path to a functional solution. If anyone is interested in enhancing IAXmodem to support SIP or any other channel driver, development contributions are always welcome. ----------------------------------------------------------------- Q5: What if I really want to use IAXmodem but my Asterisk server is connected to my HylaFAX server only by a lossy (e.g. internet) connection? A5: The connection between IAXmodem and Asterisk must be clean and clear. However, the connection between HylaFAX and IAXmodem need not be. For example, you could run IAXmodem on the Asterisk server communicating on the loopback adapter, and HylaFAX would communicate with IAXmodem remotely using a "remote tty" service such as termpkg's termnetd and ttyd programs. (A patch is included with IAXmodem source that will permit ttyd to be used for fax communications. You'll want to use a termnetd.conf entry like: "64570:on:/dev/ttyIAX0:B19200 CLOCAL CREAD IGNBRK;") An alternative to termpkg is interceptty, which is reported to work. ----------------------------------------------------------------- Q6: How do I set up my Asterisk dialplan for IAXmodem? A5: This will vary depending upon what you want, but in many instances it will be something like this: exten => fax,1,Dial(IAX2/ttyIAX/${EXTEN}) If you do not put ${EXTEN} there then IAXmodem will not receive DID information. In this example "fax" is your fax extension number. If you use the Asterisk "fax" extension given by zaptel fax detection then ${EXTEN} will lose its meaning, and you'll need to use a workaround to get the correct called-number passed on to IAXmodem. If you want to operate multiple IAXmodem instances (to handle more than one fax at a time) do something like this: exten => fax,1,Dial(IAX2/ttyIAX0/${EXTEN}) exten => fax,2,Dial(IAX2/ttyIAX1/${EXTEN}) exten => fax,3,Dial(IAX2/ttyIAX2/${EXTEN}) exten => fax,4,Busy exten => fax,5,Hangup Each IAXmodem instance can only handle one call at a time. Thus it will report as busy if it is already handling a call, and Asterisk will then proceed to the next entry in the dialplan. Passing ${EXTEN} or some related value in the Dial application is important, as that provides the DID indication for iaxmodem. If this application parameter is omitted then iaxmodem will not receive DID. Also, using the ChanIsAvail command prior to dialing is known not to work since it issues a IAX "HANGUP" and puts the iaxmodem in a busy state. Therefore, the following Dial command will be rejected with the cause "Busy". Some Asterisk pre-packaged distributions dial extensions using macros containg ChanIsAvail (ie. Voiceroute's Druid) so beware of them. ----------------------------------------------------------------- Q7: I start iaxmodem and then place a call to it, and I see these messages appear on output: "Unable to pass the full buffer onto the device file." What's wrong? Is this a bug? A7: IAXmodem doesn't immediately know if anything is watching the modem device or not. So when you place a call to iaxmodem it will instinctively pass RING messages and Call*ID to the pty. If nothing is watching the modem device then eventually the pty buffer will fill and the pty will begin refusing further data. This is what is happening. So basically, it's nothing to worry about if you are aware that you're not running any modem-watching process like faxgetty. However, you probably *should* be running something like faxgetty in anything other than a test scenario. ----------------------------------------------------------------- Q8: How do I set up my Asterisk iax.conf for IAXmodem? A8: Again, this will vary somewhat depending upon what you want. However, here is an example: [iaxmodem1] type=friend host=dynamic auth=md5 secret= context=outbound disallow=all allow=ulaw allow=alaw jitterbuffer=no The [context] name refers to the "peername" entry in the iaxmodem config file. The secret should match the "secret" entry in the same. The context value refers to which dialplan (extensions.conf) context should be used for handling calls which iaxmodem should initiate. The disallow and allow values ensure that the server only uses uLaw and alaw audio codecs when communicating with iaxmodem. Disabling the PBX-side jitterbuffer is quite important to prevent it from disturbing the audio. ----------------------------------------------------------------- See the TODO file for information regarding bugs, needed features, and enhancements. iaxmodem-1.2.0/iaxmodem.inf0000644000175000017500000001640111150047260015152 0ustar julienjulien [Version] Signature = "$CHICAGO$" Class = Modem ClassGUID ={4D36E96D-E325-11CE-BFC1-08002BE10318} Provider = %Mfg% ;---------------------------------------------------------------------------- ; Manufacturer ;---------------------------------------------------------------------------- [Manufacturer] %Mfg% = Models ;---------------------------------------------------------------------------- ; Modem ExcludeFromSelect and NoResDup ;---------------------------------------------------------------------------- [ControlFlags] ;ExcludeFromSelect=SERENUM\HSM0A00 ;---------------------------------------------------------------------------- ; Strings ;---------------------------------------------------------------------------- [Strings] Mfg = "IAXModem" ;---------------------------------------------------------------------------- ; Modem model names ;----------------------------------------------------------------------------s IAXModem = "IAXModem" ;---------------------------------------------------------------------------- ; Modem models ;---------------------------------------------------------------------------- [Models] %IAXModem% = Modem_IAXModem, com0com\port ;---------------------------------------------------------------------------- ; Installation sections ;---------------------------------------------------------------------------- [Modem_IAXModem] AddReg = All, mfglt, Modem.AddReg, EXTERNAL, VerboseResultCodes [EXTERNAL] HKR,, DeviceType, 1, 01 [Modem.AddReg] ; for 56k use Max 60k HKR,, Properties, 1, C0,01,00,00, FF,00,00,00, FF,00,00,00, 07,00,00,00, 0F,00,00,00, F7,03,00,00, 00,C2,01,00, 60,EA,00,00 ;---------------------------------------------------------------------------- ; Common Registry Sections ; ; The [All] section is installed for all modems. ; ;---------------------------------------------------------------------------- [All] HKR,,FriendlyDriver,,Unimodem.vxd HKR,,DevLoader,,*vcomm HKR,,PortSubClass,1,02 HKR,,ConfigDialog,,modemui.dll HKR,,EnumPropPages,,"modemui.dll,EnumPropPages" HKR,,OCM2KXP,1,01 ;---------------------------------------------------------------------------- ; The [mfglt] section contains the first modem's Init, ; Settings, and Responses keys. It is installed for all ; modems in the INF. ;---------------------------------------------------------------------------- [mfglt] HKR, Init, 1,, "AT" ; do an "AT" to get autobaud correct (start other init strings with 2) HKR, Monitor, 1,, "ATS0=0" HKR, Answer, 1,, "ATA" HKR, Hangup, 1,, "ATH E1" HKR,, Reset,, "ATZ" ; slam in a reset before closing HKR, Fax, ResetCommand,, "AT" HKR, Fax, SetupCommand,, "ATS0=0E0V1Q0" HKR, EnableCallerID, 1,, "AT+VCID=1" HKR, Settings, Prefix,, "AT" HKR, Settings, Terminator,, "" HKR, Settings, DialPrefix,, "D" HKR, Settings, DialSuffix,, ";" HKR, Settings, CallSetupFailTimer,, "S7=<#>" HKR, Settings, SpeakerVolume_Low,, "L0" HKR, Settings, SpeakerVolume_Med,, "L2" HKR, Settings, SpeakerVolume_High,, "L3" HKR, Settings, SpeakerMode_Off,, "M0" HKR, Settings, SpeakerMode_Dial,, "M1" HKR, Settings, SpeakerMode_On,, "M2" HKR, Settings, SpeakerMode_Setup,, "M3" HKR, Settings, FlowControl_Off,, "&K0" HKR, Settings, FlowControl_Hard,, "&K3" HKR, Settings, FlowControl_Soft,, "&K4" HKR, Settings, ErrorControl_On,, "\N3" HKR, Settings, ErrorControl_Off,, "\N1" HKR, Settings, ErrorControl_Forced,, "\N4" HKR, Settings, ErrorControl_Cellular,, "&F5 S39=22 \N3" HKR, Settings, ErrorControl_Cellular_Forced,, "&F5 S39=22 \N4" HKR, Settings, Compression_Off,, "%%C0" HKR, Settings, Compression_On,, "%%C1" HKR, Settings, Modulation_CCITT,, "B0B15" HKR, Settings, Modulation_Bell,, "B1B16" HKR, Settings, SpeedNegotiation_Off,, "N0" HKR, Settings, SpeedNegotiation_On,, "N1" HKR, Settings, Pulse,, "P" HKR, Settings, Tone,, "T" HKR, Settings, Blind_Off,, "X4" HKR, Settings, Blind_On,, "X3" HKR,, InactivityScale,1, 3c,00,00,00 HKR, Settings, InactivityTimeOut,, "" ;---------------------------------------------------------------------------- ; Verbose result codes ;---------------------------------------------------------------------------- [VerboseResultCodes] HKR, Responses, "", 1, 01, 00, 00,00,00,00, 00,00,00,00 HKR, Responses, "", 1, 01, 00, 00,00,00,00, 00,00,00,00 HKR, Responses, "0", 1, 00, 00, 00,00,00,00, 00,00,00,00 ; OK - Command executed HKR, Responses, "1", 1, 02, 00, 00,00,00,00, 00,00,00,00 ; CONNECT - Connection HKR, Responses, "2", 1, 08, 00, 00,00,00,00, 00,00,00,00 ; RING - Ring signal indicated HKR, Responses, "3", 1, 04, 00, 00,00,00,00, 00,00,00,00 ; NO CARRIER HKR, Responses, "4", 1, 03, 00, 00,00,00,00, 00,00,00,00 ; ERROR - Invalid command HKR, Responses, "5", 1, 02, 00, B0,04,00,00, 00,00,00,00 ; CONNECT 1200 HKR, Responses, "6", 1, 05, 00, 00,00,00,00, 00,00,00,00 ; NO DIALTONE - No dial tone detected HKR, Responses, "7", 1, 06, 00, 00,00,00,00, 00,00,00,00 ; BUSY - Engaged (busy) signal HKR, Responses, "8", 1, 07, 00, 00,00,00,00, 00,00,00,00 ; NO ANSWER HKR, Responses, "OK", 1, 00, 00, 00,00,00,00, 00,00,00,00 HKR, Responses, "RING", 1, 08, 00, 00,00,00,00, 00,00,00,00 HKR, Responses, "ERROR", 1, 03, 00, 00,00,00,00, 00,00,00,00 HKR, Responses, "NO DIALTONE", 1, 05, 00, 00,00,00,00, 00,00,00,00 HKR, Responses, "NO DIAL TONE",1, 05, 00, 00,00,00,00, 00,00,00,00 HKR, Responses, "BUSY", 1, 06, 00, 00,00,00,00, 00,00,00,00 HKR, Responses, "NO CARRIER", 1, 04, 00, 00,00,00,00, 00,00,00,00 HKR, Responses, "NO ANSWER", 1, 07, 00, 00,00,00,00, 00,00,00,00 HKR, Responses, "FAX", 1, 03, 00, 00,00,00,00, 00,00,00,00 HKR, Responses, "DATA", 1, 03, 00, 00,00,00,00, 00,00,00,00 HKR, Responses, "VOICE", 1, 03, 00, 00,00,00,00, 00,00,00,00 HKR, Responses, "RINGING", 1, 01, 00, 00,00,00,00, 00,00,00,00 HKR, Responses, "DELAYED", 1, 03, 00, 00,00,00,00, 00,00,00,00 HKR, Responses, "BLACKLISTED", 1, 03, 00, 00,00,00,00, 00,00,00,00 HKR, Responses, "+FCERROR", 1, 03, 00, 00,00,00,00, 00,00,00,00 HKR, Responses, "CONNECT", 1, 02, 00, 00,00,00,00, 00,00,00,00 HKR, Responses, "DATE=", 1, 93, 00, 00,00,00,00, 00,00,00,00 HKR, Responses, "TIME=", 1, 94, 00, 00,00,00,00, 00,00,00,00 HKR, Responses, "NMBR=", 1, 95, 00, 00,00,00,00, 00,00,00,00 HKR, Responses, "NAME=", 1, 96, 00, 00,00,00,00, 00,00,00,00 HKR, Responses, "MESG=", 1, 97, 00, 00,00,00,00, 00,00,00,00 HKR, Responses, "DRON=", 1, 91, 00, 00,00,00,00, 00,00,00,00 HKR, Responses, "DROF=", 1, 92, 00, 00,00,00,00, 00,00,00,00 HKR, Responses, "ANID=", 1, 9B, 00, 00,00,00,00, 00,00,00,00 HKR, Responses, "USER=", 1, 9B, 00, 00,00,00,00, 00,00,00,00 HKR, Responses, "PASS=", 1, 9B, 00, 00,00,00,00, 00,00,00,00 HKR, Responses, "CDID=", 1, 9B, 00, 00,00,00,00, 00,00,00,00 HKR, Responses, "NDID=", 1, 9B, 00, 00,00,00,00, 00,00,00,00 iaxmodem-1.2.0/build0000755000175000017500000000456711150047260013710 0ustar julienjulien#!/bin/sh getVersions() { MODEMVER="iaxmodem-`cat VERSION`" STEP1=`grep @VERSION@ lib/spandsp/config.status | sed 's/;.*//g'` DSPVER=`echo "@VERSION@" | sed $STEP1` if [ -n "$DSPVER" ]; then DSPVER="spandsp-$DSPVER-snapshot-20080725" fi STEP1=`grep @VERSION@ lib/libiax2/config.status | sed 's/;.*//g'` IAXVER=`echo "@VERSION@" | sed $STEP1` if [ -n "$IAXVER" ]; then IAXVER="libiax2-$IAXVER-SVN-20071223+" fi } PTYUSE="-DUSE_UNIX98_PTY" if [ "$1" = "-bsdptys" ]; then PTYUSE="" shift fi LLIBS="-lutil" if [ "`uname`" = "SunOS" ]; then PATH=$PATH:/usr/sfw/bin; export PATH MAKE="gmake"; export MAKE CFLAGS="-DSOLARIS"; export CFLAGS AR="gar"; export AR LLIBS="-lsocket -lnsl" fi if [ "$1" = "static" ]; then cd lib/libiax2 && \ ./configure --disable-shared && \ ${MAKE-make} && \ cd ../spandsp && \ ./configure --disable-shared && \ if [ "`uname`" = "SunOS" ]; then grep -v HAVE_TGMATH_H src/config.h > src/config.h.new && \ mv -f src/config.h.new src/config.h && \ grep -v HAVE_TGMATH_H config-h.in > config-h.in.new && \ mv -f config-h.in.new config-h.in fi && \ ${MAKE-make} && \ cd ../.. && \ getVersions && \ gcc -Wall -g $PTYUSE $CFLAGS -DMODEMVER=\"$MODEMVER\" -DDSPVER=\"$DSPVER\" -DIAXVER=\"$IAXVER\" -DSTATICLIBS \ -std=c99 -Ilib/libiax2/src -Ilib/spandsp/src -c -o iaxmodem.o iaxmodem.c && \ gcc -lm $LLIBS -ltiff -o iaxmodem iaxmodem.o lib/spandsp/src/.libs/libspandsp.a lib/libiax2/src/.libs/libiax.a else getVersions && \ gcc -Wall -g $PTYUSE -DMODEMVER=\"$MODEMVER\" -DDSPVER=\"$DSPVER\" -DIAXVER=\"$IAXVER\" \ -lm -liax -lutil -lspandsp -ltiff -o iaxmodem iaxmodem.c fi if [ -n "`ls /etc/iaxmodem-cfg.* 2>/dev/null`" ]; then echo "You appear to have some old-style configuration files (/etc/iaxmodem-cfg.*)." echo "As of version 0.1.0 these need to be renamed and stored in /etc/iaxmodem/*." read -p "May I move these configuration files for you? [Y/n] " case "$REPLY" in N|n|no|NO) echo "Okay, I will leave things alone." ;; *) if [ ! -d /etc/iaxmodem ]; then mkdir /etc/iaxmodem fi for config in `ls /etc/iaxmodem-cfg.*`; do mv "$config" "/etc/iaxmodem/`echo $config | sed 's/.*\/iaxmodem-cfg\.//'`" done echo "The configuration files have been renamed and moved to /etc/iaxmodem." ;; esac fi iaxmodem-1.2.0/iaxmodem.init.fedora0000644000175000017500000000232211150047260016575 0ustar julienjulien#!/bin/sh # Startup script for iaxmodem # # chkconfig: 2345 95 05 # description: IAXModem for asterisk <-> Hylafax gateway # Source function library. . /etc/rc.d/init.d/functions [ -f /usr/local/sbin/iaxmodem ] || exit 0 prog="IAXmodem" start() { echo -n $"Starting $prog: " daemon /usr/local/sbin/iaxmodem RETVAL=$? echo return $RETVAL } stop() { if test "x`pidof iaxmodem`" != x; then echo -n $"Stopping $prog: " killproc iaxmodem echo fi RETVAL=$? return $RETVAL } reload() { if test "x`pidof iaxmodem`" != x; then echo $"Reloading $prog" kill -HUP `head -1 /var/run/iaxmodem.pid` fi } case "$1" in start) start ;; stop) stop ;; status) status iaxmodem ;; reload) reload ;; restart) stop start ;; condrestart) if test "x`pidof iaxmodem`" != x; then stop start fi ;; *) echo $"Usage: $0 {start|stop|reload|restart|condrestart|status}" exit 1 esac exit $RETVAL