Initial revision
This commit is contained in:
commit
2b469a7d85
21 changed files with 1607 additions and 0 deletions
6
Makefile
Normal file
6
Makefile
Normal file
|
@ -0,0 +1,6 @@
|
|||
all:
|
||||
cd src && make
|
||||
cd xcid && make
|
||||
clean:
|
||||
cd src && make clean
|
||||
cd xcid && make clean
|
4
README
Normal file
4
README
Normal file
|
@ -0,0 +1,4 @@
|
|||
(C)2004, Dan Ponte. Under the BSD license.
|
||||
xcid requires X, obviously (pure Xt).
|
||||
Edit the makefile if not on FreeBSD to comment out -DSPEAKER.
|
||||
This is pretty hackish. For some debug stuff in either xcid or cidserv, use -DDEBUG in CPPFLAGS.
|
15
src/Makefile
Normal file
15
src/Makefile
Normal file
|
@ -0,0 +1,15 @@
|
|||
CFLAGS=-g -Wall -DSPEAKER
|
||||
# -DDEBUG
|
||||
all: cidserv bcast hex
|
||||
cidserv: cidserv.c
|
||||
gcc ${CFLAGS} -lutil -o cidserv cidserv.c
|
||||
bcast: bcast.c
|
||||
gcc ${CFLAGS} -o bcast bcast.c
|
||||
hex: hex.c
|
||||
gcc ${CFLAGS} -o hex hex.c
|
||||
clean:
|
||||
rm -f *.o *.core hex bcast cidserv
|
||||
strip: cidserv bcast hex
|
||||
strip cidserv
|
||||
strip bcast
|
||||
strip hex
|
5
src/addrs.conf
Normal file
5
src/addrs.conf
Normal file
|
@ -0,0 +1,5 @@
|
|||
# lines beginning with # are comments
|
||||
# if you simply put subnet.whatever.thing.255, broadcast will be used if we have permission
|
||||
10.10.10.255
|
||||
192.168.1.255
|
||||
# this is a test
|
BIN
src/bcast
Executable file
BIN
src/bcast
Executable file
Binary file not shown.
22
src/bcast.c
Normal file
22
src/bcast.c
Normal file
|
@ -0,0 +1,22 @@
|
|||
#include <sys/types.h>
|
||||
#include <sys/socket.h>
|
||||
#include <netinet/in.h>
|
||||
int main() {
|
||||
char msg[212];
|
||||
int s;
|
||||
struct sockaddr_in sin;
|
||||
strcpy(msg, "1230:1234:3:DAN PONTE:2123456789");
|
||||
s = socket(PF_INET, SOCK_DGRAM, 0);
|
||||
bzero(&sin, sizeof sin);
|
||||
sin.sin_family = AF_INET;
|
||||
sin.sin_addr.s_addr = inet_addr("10.10.10.1");
|
||||
sin.sin_port = htons(3890);
|
||||
if (connect(s, (struct sockaddr *)&sin, sizeof sin) < 0) {
|
||||
perror("connect");
|
||||
close(s);
|
||||
return 2;
|
||||
}
|
||||
write(s, msg, sizeof(msg));
|
||||
close(s);
|
||||
return 0;
|
||||
}
|
BIN
src/cidserv
Executable file
BIN
src/cidserv
Executable file
Binary file not shown.
518
src/cidserv.c
Normal file
518
src/cidserv.c
Normal file
|
@ -0,0 +1,518 @@
|
|||
/*
|
||||
* Caller ID Server
|
||||
* (C)2004, Dan Ponte
|
||||
* Licensed under the GPL v2
|
||||
*/
|
||||
#include <fcntl.h>
|
||||
#include <ctype.h>
|
||||
#include <unistd.h>
|
||||
#include <signal.h>
|
||||
#include <termios.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <time.h>
|
||||
#include <libutil.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/select.h>
|
||||
#include <arpa/inet.h>
|
||||
#include <sys/ioctl.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/socket.h>
|
||||
#include <netinet/in.h>
|
||||
#define VERSION "0.1"
|
||||
#ifdef SPEAKER
|
||||
#include <machine/speaker.h>
|
||||
int wantspkr = 1;
|
||||
#else
|
||||
int wantspkr = 0;
|
||||
#endif
|
||||
int usespkr = 0;
|
||||
int ring = 0, nhosts = 0;
|
||||
char hosts[10][18];
|
||||
FILE* logfh;
|
||||
char* devi;
|
||||
int modemfd, sfd;
|
||||
struct tm *ct;
|
||||
time_t now;
|
||||
short error = 0;
|
||||
int evalrc(char* result);
|
||||
void send_dgram(char* address, char* datar);
|
||||
int parse_cid(char* cidstring);
|
||||
void load_addrs(char* fl);
|
||||
char* logtime(void)
|
||||
{
|
||||
static char tstring[12];
|
||||
bzero(tstring, sizeof tstring);
|
||||
now = time(NULL);
|
||||
ct = localtime(&now);
|
||||
sprintf(tstring, "%02d:%02d:%02d:",
|
||||
ct->tm_hour, ct->tm_min, ct->tm_sec);
|
||||
return tstring;
|
||||
}
|
||||
#ifdef SPEAKER
|
||||
void brring(void)
|
||||
{
|
||||
tone_t tstr;
|
||||
int ctr;
|
||||
for(ctr = 0; ctr <= 4; ctr++) {
|
||||
tstr.frequency = 1000;
|
||||
tstr.duration = 10;
|
||||
ioctl(sfd, SPKRTONE, &tstr);
|
||||
tstr.frequency = 900;
|
||||
ioctl(sfd, SPKRTONE, &tstr);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
static void trap_signal(int nused)
|
||||
{
|
||||
fprintf(stderr, "Caught signal %d, cleaning up...\n", nused);
|
||||
fprintf(logfh, "%s Caught signal %d, cleaning up...\n",
|
||||
logtime(), nused);
|
||||
fflush(logfh);
|
||||
uu_unlock((devi+(sizeof("/dev/")-1)));
|
||||
close(modemfd);
|
||||
close(sfd);
|
||||
fclose(logfh);
|
||||
exit(0);
|
||||
}
|
||||
void usage(char* pname)
|
||||
{
|
||||
fprintf(stderr, "Usage: %s %s[-D] -d device -l logfile -a addresses\n"
|
||||
"-D to run as daemon (detach)\n%s", pname,
|
||||
wantspkr ? "[-s] " : "",
|
||||
wantspkr ? "-s uses speaker(4) (FreeBSD) when the"
|
||||
" phone rings.\n" : "");
|
||||
}
|
||||
int main(int argc, char* argv[])
|
||||
{
|
||||
char buffer[512], hipad[50];
|
||||
char cbuf[1];
|
||||
char *dev, *logfle, *addres;
|
||||
int cou = 0, ch;
|
||||
int runasd = 0;
|
||||
int deset = 0, logset = 0, addrset = 0;
|
||||
int doing_cid = 0, lres;
|
||||
struct timeval tv;
|
||||
fd_set fds_read;
|
||||
FILE* modem;
|
||||
int s;
|
||||
int length;
|
||||
struct sockaddr_in sin;
|
||||
struct sockaddr_in from;
|
||||
char netbuf[256];
|
||||
FD_ZERO(&fds_read);
|
||||
#ifdef SPEAKER
|
||||
while ((ch = getopt(argc, argv, "sDd:l:a:")) != -1) {
|
||||
#else
|
||||
while ((ch = getopt(argc, argv, "Dd:l:a:")) != -1) {
|
||||
#endif
|
||||
switch(ch) {
|
||||
case 'd':
|
||||
dev = strdup(optarg);
|
||||
deset = 1;
|
||||
break;
|
||||
case 'l':
|
||||
logfle = strdup(optarg);
|
||||
logset = 1;
|
||||
break;
|
||||
case 'a':
|
||||
addres = strdup(optarg);
|
||||
addrset = 1;
|
||||
break;
|
||||
#ifdef SPEAKER
|
||||
case 's':
|
||||
usespkr = 1;
|
||||
break;
|
||||
#endif
|
||||
case 'D':
|
||||
runasd = 1;
|
||||
break;
|
||||
default:
|
||||
usage(argv[0]);
|
||||
exit(-1);
|
||||
}
|
||||
}
|
||||
if(!deset || !logset || !addrset) {
|
||||
usage(argv[0]);
|
||||
exit(-1);
|
||||
} else {
|
||||
if(!(dev[0] == '/' && dev[3] == 'v')) {
|
||||
fprintf(stderr, "Must be a device!\n");
|
||||
exit(-1);
|
||||
}
|
||||
}
|
||||
memset(netbuf, 0, sizeof(netbuf));
|
||||
load_addrs(addres);
|
||||
if ((s = socket(PF_INET, SOCK_DGRAM, 0)) < 0) {
|
||||
perror("socket");
|
||||
return 1;
|
||||
}
|
||||
bzero(&sin, sizeof sin);
|
||||
sin.sin_family = AF_INET;
|
||||
sin.sin_port = htons(1450);
|
||||
if(INADDR_ANY)
|
||||
sin.sin_addr.s_addr = htonl(INADDR_ANY);
|
||||
if(bind(s, (struct sockaddr *)&sin, sizeof sin) < 0) {
|
||||
perror("bind");
|
||||
return 2;
|
||||
}
|
||||
/* end socket */
|
||||
devi = dev;
|
||||
if(!(logfh = fopen(logfle, "a"))) {
|
||||
perror("logf open");
|
||||
exit(-1);
|
||||
}
|
||||
now = time(NULL);
|
||||
ct = localtime(&now);
|
||||
fprintf(logfh, "%s CIDServ v%s started, opening modem...\n"
|
||||
, logtime(), VERSION);
|
||||
fflush(logfh);
|
||||
modemfd = open(dev, O_RDWR);
|
||||
lres = uu_lock((dev+(sizeof("/dev/")-1)));
|
||||
signal(SIGTERM, trap_signal);
|
||||
signal(SIGHUP, trap_signal);
|
||||
signal(SIGINT, trap_signal);
|
||||
if(lres != 0) {
|
||||
fprintf(stderr, "%s\n", uu_lockerr(lres));
|
||||
exit(-1);
|
||||
}
|
||||
modem = fdopen(modemfd, "w+");
|
||||
if(runasd) {
|
||||
daemon(1, 0);
|
||||
}
|
||||
fprintf(modem, "ATZ\r\nAT E0 #CID=2 V0\r\n");
|
||||
fflush(modem);
|
||||
#ifdef SPEAKER
|
||||
if(usespkr) {
|
||||
sfd = open("/dev/speaker", O_RDWR);
|
||||
if(sfd == -1) {
|
||||
perror("speaker open");
|
||||
exit(-1);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
while(1)
|
||||
{
|
||||
FD_ZERO(&fds_read);
|
||||
FD_SET(modemfd, &fds_read);
|
||||
#ifdef DEBUG
|
||||
FD_SET(fileno(stdin), &fds_read);
|
||||
#endif
|
||||
FD_SET(s, &fds_read);
|
||||
tv.tv_sec = 3;
|
||||
tv.tv_usec = 0;
|
||||
length = sizeof from;
|
||||
switch(select(modemfd + 1, &fds_read, NULL, NULL, NULL))
|
||||
{
|
||||
case -1:
|
||||
perror("cidserv");
|
||||
exit(-1);
|
||||
break;
|
||||
case 0:
|
||||
fprintf(modem, "AT#CID=?\r\n");
|
||||
fflush(modem);
|
||||
break;
|
||||
default:
|
||||
{
|
||||
if(FD_ISSET(modemfd, &fds_read) != 0)
|
||||
{
|
||||
read(modemfd, cbuf, 1);
|
||||
#ifdef DEBUG
|
||||
printf("%c", cbuf[0]);
|
||||
#endif
|
||||
if(cou < sizeof(buffer) - 2)
|
||||
buffer[cou] = cbuf[0];
|
||||
if(buffer[0] == '8' && buffer[1] == '0')
|
||||
doing_cid = 1;
|
||||
if(cbuf[0] == '\n') {
|
||||
if(doing_cid) {
|
||||
parse_cid(buffer);
|
||||
memset(buffer, 0, sizeof(buffer));
|
||||
doing_cid = 0;
|
||||
cou = 0;
|
||||
} else {
|
||||
evalrc(buffer);
|
||||
memset(buffer, 0, sizeof(buffer));
|
||||
cbuf[0] = 0;
|
||||
cou = 0;
|
||||
}
|
||||
} else {
|
||||
cbuf[0] = 0;
|
||||
cou++;
|
||||
}
|
||||
}
|
||||
if(FD_ISSET(fileno(stdin), &fds_read) != 0)
|
||||
{
|
||||
switch(getc(stdin)) {
|
||||
case 'q':
|
||||
trap_signal(SIGTERM);
|
||||
break;
|
||||
case 's':
|
||||
parse_cid("802701083039303532303130070F574952454C4553532043414C4C2020020A30303332303532363239AF\n");
|
||||
break;
|
||||
case 'l':
|
||||
parse_cid("802701083132323130383234070F5354414E444953482048454154494E020A343031333937333337325C\n");
|
||||
break;
|
||||
case 'o':
|
||||
parse_cid("80190108313232313135303508014F020A3430313437343737343063\n");
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(FD_ISSET(s, &fds_read) != 0) {
|
||||
recvfrom(s, netbuf, 255, 0, (struct sockaddr*)&from, &length);
|
||||
/* strcpy(hipad, inet_ntoa(from.sin_addr));
|
||||
if(!((hipad[0] == '1' && hipad[1] == '0' && hipad[2]
|
||||
== '.') ||
|
||||
(hipad[0] == '1' && hipad[1] == '9' &&
|
||||
hipad[2] == '2') || (hipad[0] == '1' &&
|
||||
hipad[1] == '2' && hipad[3] == '7'))) {
|
||||
memset(hipad, 0, sizeof(hipad));
|
||||
fprintf(logfh, "Unauthorized access attempt"
|
||||
" from %s.\n",
|
||||
inet_ntoa(from.sin_addr));
|
||||
break;
|
||||
}*/
|
||||
#ifdef DEBUG
|
||||
printf("client sent %s\n", netbuf);
|
||||
#endif
|
||||
memset(hipad, 0, sizeof(hipad));
|
||||
if((netbuf[0] == 'A' && netbuf[1] ==
|
||||
'T')) {
|
||||
if(netbuf[strlen(netbuf)] == '\n')
|
||||
netbuf[strlen(netbuf)] = 0;
|
||||
fprintf(modem, "%s\r\n", netbuf);
|
||||
fflush(modem);
|
||||
now = time(NULL);
|
||||
ct = localtime(&now);
|
||||
fprintf(logfh,
|
||||
"%02d:%02d:%02d: Remote (%s) sent %s, sending to modem...\n",
|
||||
ct->tm_hour, ct->tm_min, ct->tm_sec,
|
||||
inet_ntoa(from.sin_addr), netbuf);
|
||||
fflush(logfh);
|
||||
} else {
|
||||
if(strcmp(netbuf, "AHU\n") ==
|
||||
0) {
|
||||
now = time(NULL);
|
||||
ct = localtime(&now);
|
||||
fprintf(logfh, "%02d:%02d:%02d: Telemarketers Suck!\n",
|
||||
ct->tm_hour, ct->tm_min, ct->tm_sec);
|
||||
fflush(logfh);
|
||||
fprintf(modem, "ATH1\r\n");
|
||||
fflush(modem);
|
||||
sleep(2);
|
||||
fprintf(modem, "ATH\r\n");
|
||||
fflush(modem);
|
||||
}
|
||||
#ifdef SPEAKER
|
||||
if(strcmp(netbuf, "RNG\n") == 0) {
|
||||
brring();
|
||||
}
|
||||
#endif
|
||||
}
|
||||
memset(&from, 0, sizeof(from));
|
||||
memset(netbuf, 0, sizeof(netbuf));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
close(modemfd);
|
||||
return 0;
|
||||
}
|
||||
int evalrc(char* result)
|
||||
{
|
||||
int rescode, i;
|
||||
for(i = 0; i <= strlen(result); i++) {
|
||||
if(result[i] == '\r' || result[i] == '\n') result[i] = '\0';
|
||||
}
|
||||
rescode = atoi(result);
|
||||
switch(rescode) {
|
||||
case 0:
|
||||
/* OK */
|
||||
return 0;
|
||||
break;
|
||||
case 2:
|
||||
now = time(NULL);
|
||||
ct = localtime(&now);
|
||||
fprintf(logfh, "%02d:%02d:%02d: Brrrring!!!!!!\n",
|
||||
ct->tm_hour, ct->tm_min, ct->tm_sec);
|
||||
fflush(logfh);
|
||||
for(i = 0; i <= nhosts; i++) {
|
||||
send_dgram(hosts[i], "RING");
|
||||
}
|
||||
#ifdef SPEAKER
|
||||
if(usespkr) brring();
|
||||
#endif
|
||||
break;
|
||||
case 4:
|
||||
error = 1;
|
||||
return -1;
|
||||
break;
|
||||
default:
|
||||
return 0;
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
int parse_cid(char* cidstring)
|
||||
{
|
||||
char *p, *datep;
|
||||
int len = 0, i;
|
||||
char finalbuf[1024], msg[512];
|
||||
unsigned char cch;
|
||||
char cbyte, cbyte2;
|
||||
char bytebuf[10];
|
||||
char date[7];
|
||||
time_t rnow;
|
||||
struct tm *ctm;
|
||||
char cidtime[7];
|
||||
char name[128];
|
||||
char phone[128];
|
||||
int cur = 0, sz, fbcou = 0;
|
||||
short int finl = 0;
|
||||
memset(msg, 0, sizeof msg);
|
||||
memset(bytebuf, 0, sizeof bytebuf);
|
||||
memset(date, 0, sizeof date);
|
||||
memset(finalbuf, 0, sizeof(finalbuf));
|
||||
if(cidstring[strlen(cidstring)] == '\n')
|
||||
cidstring[strlen(cidstring)] = 0;
|
||||
sz = strlen(cidstring);
|
||||
finl = (sz / 2) - 2;
|
||||
#ifdef DEBUG
|
||||
printf("Size of %s is %d\n", cidstring, sz);
|
||||
#endif
|
||||
rnow = time(NULL);
|
||||
ctm = localtime(&rnow);
|
||||
for(cur = 0; cur <= sz; cur++) {
|
||||
cbyte = cidstring[cur++];
|
||||
cbyte2 = cidstring[cur];
|
||||
sprintf(bytebuf, "0x%c%c", cbyte, cbyte2);
|
||||
sscanf(bytebuf, "%X", &cch);
|
||||
if(cch == 0) continue;
|
||||
if(fbcou <= finl) {
|
||||
finalbuf[fbcou] = cch;
|
||||
fbcou++;
|
||||
} else break;
|
||||
memset(bytebuf, 0, sizeof(bytebuf));
|
||||
cbyte = 0;
|
||||
cbyte2 = 0;
|
||||
}
|
||||
sz = fbcou;
|
||||
p = finalbuf;
|
||||
len = sz;
|
||||
while(len && !(*p >= 0x30 && *p <= 0x39)) {
|
||||
p++;
|
||||
len--;
|
||||
}
|
||||
datep = p;
|
||||
date[0] = datep[0];
|
||||
date[1] = datep[1];
|
||||
date[2] = datep[2];
|
||||
date[3] = datep[3];
|
||||
date[4] = 0;
|
||||
datep += 4;
|
||||
cidtime[0] = datep[0];
|
||||
cidtime[1] = datep[1];
|
||||
cidtime[2] = datep[2];
|
||||
cidtime[3] = datep[3];
|
||||
cidtime[4] = 0;
|
||||
p += 8;
|
||||
len -= 8;
|
||||
fprintf(logfh, "Date: %s (local %02d/%02d)\nTime: %s (local %02d:%02d)\n",
|
||||
date, ctm->tm_mon+1, ctm->tm_mday, cidtime,
|
||||
ctm->tm_hour, ctm->tm_min);
|
||||
fflush(logfh);
|
||||
while(len && !isprint(*p)) {
|
||||
p++;
|
||||
len--;
|
||||
}
|
||||
i = 0;
|
||||
while(len && (i < sizeof(finalbuf)) && isprint(*p)) {
|
||||
name[i++] = *p++;
|
||||
len--;
|
||||
}
|
||||
name[i] = 0;
|
||||
if(name[0] == 'P' && !(isalpha(name[1]) || (name[1] >= '0' && name[1] <= '9'))) {
|
||||
strcpy(name, "PRIVATE");
|
||||
}
|
||||
if(name[0] == 'O' && !(isalpha(name[1]) || (name[1] >= '1' && name[1] <= '9'))) {
|
||||
strcpy(name, "UNAVAILABLE");
|
||||
}
|
||||
while(len && !isprint(*p)) {
|
||||
p++;
|
||||
len--;
|
||||
}
|
||||
i = 0;
|
||||
while(len && (i < sizeof(finalbuf)) && isprint(*p) &&
|
||||
(p[0] >= 0x20 && p[0] <= 0x7e)) {
|
||||
if(!((p[0] >= '0' && p[0] <= '9') || p[0] == 'O' || p[0] == 'P'))
|
||||
{
|
||||
p++;
|
||||
len--;
|
||||
continue;
|
||||
} else {
|
||||
phone[i++] = *p++;
|
||||
len--;
|
||||
}
|
||||
}
|
||||
phone[i] = 0;
|
||||
if(phone[0] == 'P')
|
||||
strcpy(phone, "PRIVATE");
|
||||
if(phone[0] == 'O')
|
||||
strcpy(phone, "UNAVAILABLE");
|
||||
fprintf(logfh, "Name: %s\nPhone Number: %s\n*********\n", name, phone);
|
||||
fflush(logfh);
|
||||
sprintf(msg, "%s:%s:0:%s:%s", date, cidtime, name, phone);
|
||||
#ifdef DEBUG
|
||||
printf("msg will be %s\n", msg);
|
||||
#endif
|
||||
for(i = 0; i <= nhosts; i++) {
|
||||
send_dgram(hosts[i], msg);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
void send_dgram(char* address, char* datar)
|
||||
{
|
||||
char msg[212];
|
||||
int s;
|
||||
int on = 1;
|
||||
struct sockaddr_in sin;
|
||||
if(strlen(address) < 3) return;
|
||||
#ifdef DEBUG
|
||||
printf("send_dgram(%s) %p\n", address, address);
|
||||
#endif
|
||||
strcpy(msg, datar);
|
||||
s = socket(PF_INET, SOCK_DGRAM, 0);
|
||||
bzero(&sin, sizeof sin);
|
||||
sin.sin_family = AF_INET;
|
||||
sin.sin_addr.s_addr = inet_addr(address);
|
||||
sin.sin_port = htons(3890);
|
||||
if(setsockopt(s, SOL_SOCKET, SO_BROADCAST, (char*) &on, sizeof(on)) < 0) {
|
||||
perror("setsockopt");
|
||||
exit(-1);
|
||||
}
|
||||
if (connect(s, (struct sockaddr *)&sin, sizeof sin) < 0) {
|
||||
perror("connect");
|
||||
close(s);
|
||||
return;
|
||||
}
|
||||
write(s, msg, strlen(msg) + 1);
|
||||
close(s);
|
||||
return;
|
||||
}
|
||||
void load_addrs(char* fl)
|
||||
{
|
||||
FILE* tfl;
|
||||
char fbuf[128];
|
||||
if(!(tfl = fopen(fl, "r"))) {
|
||||
perror("fopen");
|
||||
exit(-1);
|
||||
}
|
||||
while(!feof(tfl)) {
|
||||
fgets(fbuf, 126, tfl);
|
||||
if(fbuf[strlen(fbuf)] == '\n') fbuf[strlen(fbuf)] = 0;
|
||||
if(strlen(fbuf) > 4 && fbuf[0] != '#') strcpy(hosts[nhosts++], fbuf);
|
||||
memset(fbuf, 0, sizeof fbuf);
|
||||
}
|
||||
fclose(tfl);
|
||||
}
|
BIN
src/hex
Executable file
BIN
src/hex
Executable file
Binary file not shown.
86
src/hex.c
Normal file
86
src/hex.c
Normal file
|
@ -0,0 +1,86 @@
|
|||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
int main()
|
||||
{
|
||||
char buf[512];
|
||||
char* p;
|
||||
char* datep;
|
||||
int len = 0;
|
||||
int i;
|
||||
char cch;
|
||||
char finalbuf[512];
|
||||
char cbyte;
|
||||
char cbyte2;
|
||||
char bytebuf[10];
|
||||
char date[7];
|
||||
char time[7];
|
||||
char name[128];
|
||||
char phone[128];
|
||||
int waitingsec = 0;
|
||||
int cur = 0;
|
||||
int sz;
|
||||
int fbcou = 0;
|
||||
memset(finalbuf, 0, sizeof(finalbuf));
|
||||
memset(buf, 0, sizeof(buf));
|
||||
scanf("%s", buf);
|
||||
sz = strlen(buf);
|
||||
printf("Size of %s is %d\n", buf, sz);
|
||||
for(cur = 0; cur <= sz; cur++) {
|
||||
cbyte = buf[cur++];
|
||||
cbyte2 = buf[cur];
|
||||
sprintf(bytebuf, "0x%c%c", cbyte, cbyte2);
|
||||
sscanf(bytebuf, "%X", &cch);
|
||||
if(cch == 0) continue;
|
||||
finalbuf[fbcou] = cch;
|
||||
fbcou++;
|
||||
memset(bytebuf, 0, sizeof(bytebuf));
|
||||
cbyte = 0;
|
||||
cbyte2 = 0;
|
||||
}
|
||||
sz = fbcou;
|
||||
p = finalbuf;
|
||||
len = sz;
|
||||
while(len && !(*p >= 0x30 && *p <= 0x39)) {
|
||||
p++;
|
||||
len--;
|
||||
}
|
||||
datep = p;
|
||||
date[0] = datep[0];
|
||||
date[1] = datep[1];
|
||||
date[2] = '/';
|
||||
date[3] = datep[2];
|
||||
date[4] = datep[3];
|
||||
date[5] = 0;
|
||||
datep += 4;
|
||||
time[0] = datep[0];
|
||||
time[1] = datep[1];
|
||||
time[2] = ':';
|
||||
time[3] = datep[2];
|
||||
time[4] = datep[3];
|
||||
time[5] = 0;
|
||||
p += 8;
|
||||
len -= 8;
|
||||
printf("Date: %s\nTime: %s\n", date, time);
|
||||
while(len && !isprint(*p)) {
|
||||
p++;
|
||||
len--;
|
||||
}
|
||||
i = 0;
|
||||
while(len && (i < sizeof(finalbuf)) && isprint(*p)) {
|
||||
name[i++] = *p++;
|
||||
len--;
|
||||
}
|
||||
name[i] = 0;
|
||||
while(len && !isprint(*p)) {
|
||||
p++;
|
||||
len--;
|
||||
}
|
||||
i = 0;
|
||||
while(len && (i < sizeof(finalbuf)) && isprint(*p)) {
|
||||
phone[i++] = *p++;
|
||||
len--;
|
||||
}
|
||||
phone[i] = 0;
|
||||
printf("Name: %s\nPhone Number: %s\n", name, phone);
|
||||
return 0;
|
||||
}
|
12
src/myl
Normal file
12
src/myl
Normal file
|
@ -0,0 +1,12 @@
|
|||
15:22:42: CIDServ v0.1 started, opening modem...
|
||||
Date: 0905 (local 12/21)
|
||||
Time: 2010 (local 15:22)
|
||||
Name: WIRELESS CALL
|
||||
Phone Number: 0032052629
|
||||
*********
|
||||
Date: 1221 (local 12/21)
|
||||
Time: 1505 (local 15:23)
|
||||
Name: UNAVAILABLE
|
||||
Phone Number: 4014747740
|
||||
*********
|
||||
15:23:12: Caught signal 2, cleaning up...
|
BIN
src/pcid
Executable file
BIN
src/pcid
Executable file
Binary file not shown.
125
src/pcid.c
Normal file
125
src/pcid.c
Normal file
|
@ -0,0 +1,125 @@
|
|||
#include <string.h>
|
||||
#include <ctype.h>
|
||||
#include <stdio.h>
|
||||
#include <sys/time.h>
|
||||
#include <time.h>
|
||||
int parse_cid(char* cidstring)
|
||||
{
|
||||
char *p, *datep;
|
||||
int len = 0, i;
|
||||
char finalbuf[256], msg[512];
|
||||
unsigned char cch;
|
||||
char cbyte, cbyte2;
|
||||
char bytebuf[10];
|
||||
char date[7];
|
||||
time_t rnow;
|
||||
struct tm *ctm;
|
||||
char cidtime[7];
|
||||
char name[128];
|
||||
char phone[128];
|
||||
int cur = 0, sz, fbcou = 0;
|
||||
memset(msg, 0, sizeof msg);
|
||||
memset(bytebuf, 0, sizeof bytebuf);
|
||||
memset(date, 0, sizeof date);
|
||||
memset(finalbuf, 0, sizeof(finalbuf));
|
||||
sz = strlen(cidstring);
|
||||
#ifdef DEBUG
|
||||
printf("Size of %s is %d\n", cidstring, sz);
|
||||
#endif
|
||||
rnow = time(NULL);
|
||||
ctm = localtime(&rnow);
|
||||
for(cur = 0; cur <= sz; cur++) {
|
||||
cbyte = cidstring[cur++];
|
||||
cbyte2 = cidstring[cur];
|
||||
sprintf(bytebuf, "0x%c%c", cbyte, cbyte2);
|
||||
sscanf(bytebuf, "%X", &cch);
|
||||
if(cch == 0) continue;
|
||||
printf("fc = %d\n", fbcou);
|
||||
if(fbcou < 41)
|
||||
{
|
||||
finalbuf[fbcou] = cch;
|
||||
fbcou++;
|
||||
} else break;
|
||||
memset(bytebuf, 0, sizeof(bytebuf));
|
||||
cbyte = 0;
|
||||
cbyte2 = 0;
|
||||
}
|
||||
sz = fbcou;
|
||||
p = finalbuf;
|
||||
len = sz;
|
||||
while(len && !(*p >= 0x30 && *p <= 0x39)) {
|
||||
p++;
|
||||
len--;
|
||||
}
|
||||
datep = p;
|
||||
date[0] = datep[0];
|
||||
date[1] = datep[1];
|
||||
date[2] = datep[2];
|
||||
date[3] = datep[3];
|
||||
date[4] = 0;
|
||||
datep += 4;
|
||||
cidtime[0] = datep[0];
|
||||
cidtime[1] = datep[1];
|
||||
cidtime[2] = datep[2];
|
||||
cidtime[3] = datep[3];
|
||||
cidtime[4] = 0;
|
||||
p += 8;
|
||||
len -= 8;
|
||||
fprintf(stdout, "Date: %s (local %02d/%02d)\nTime: %s (local %02d:%02d)\n",
|
||||
date, ctm->tm_mon+1, ctm->tm_mday, cidtime,
|
||||
ctm->tm_hour, ctm->tm_min);
|
||||
while(len && !isprint(*p)) {
|
||||
p++;
|
||||
len--;
|
||||
}
|
||||
i = 0; /* bounds checking */
|
||||
while(len && p - finalbuf < sizeof(finalbuf) /* && (i < sizeof(finalbuf) - 1) */&& isprint(*p)) {
|
||||
printf("%p, %p, %d, %c\n", p, finalbuf, p - finalbuf, *p);
|
||||
name[i++] = *p++;
|
||||
len--;
|
||||
printf("next one will be %c\n", *p);
|
||||
}
|
||||
name[i] = 0;
|
||||
if(name[0] == 'P' && !(isalpha(name[1]) || (name[1] >= '0' && name[1] <= '9'))) {
|
||||
strcpy(name, "PRIVATE");
|
||||
}
|
||||
if(name[0] == 'O' && !(isalpha(name[1]) || (name[1] >= '1' && name[1] <= '9'))) {
|
||||
strcpy(name, "UNAVAILABLE");
|
||||
}
|
||||
while(len && !isprint(*p)) {
|
||||
p++;
|
||||
len--;
|
||||
}
|
||||
i = 0;
|
||||
while(len && (p - finalbuf < sizeof(finalbuf) - 1) && isprint(*p) &&
|
||||
(p[0] >= 0x20 && p[0] <= 0x7e)) {
|
||||
if(!((p[0] >= '0' && p[0] <= '9') || p[0] == 'O' || p[0] == 'P'))
|
||||
{
|
||||
++p;
|
||||
continue;
|
||||
} else {
|
||||
phone[i++] = *p++;
|
||||
len--;
|
||||
}
|
||||
}
|
||||
phone[i] = 0;
|
||||
if(phone[0] == 'P')
|
||||
strcpy(phone, "PRIVATE");
|
||||
if(phone[0] == 'O')
|
||||
strcpy(phone, "UNAVAILABLE");
|
||||
fprintf(stdout, "Name: %s\nPhone Number: %s\n*********\n", name, phone);
|
||||
fflush(stdout);
|
||||
sprintf(msg, "%s:%s:0:%s:%s", date, cidtime, name, phone);
|
||||
#ifdef DEBUG
|
||||
printf("msg will be %s\n", msg);
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
int main(int argc, char* argv[])
|
||||
{
|
||||
char* avb;
|
||||
avb = strdup(argv[1]);
|
||||
parse_cid(avb);
|
||||
free(avb);
|
||||
return 0;
|
||||
}
|
56
src/testserv.c
Normal file
56
src/testserv.c
Normal file
|
@ -0,0 +1,56 @@
|
|||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/socket.h>
|
||||
#include <netinet/in.h>
|
||||
#include <sys/select.h>
|
||||
int main()
|
||||
{
|
||||
int s, c;
|
||||
int b, len;
|
||||
fd_set fds;
|
||||
struct sockaddr_in sin;
|
||||
FILE* client;
|
||||
struct sockaddr_in from;
|
||||
char cbuf[64];
|
||||
FD_ZERO(&fds);
|
||||
memset(cbuf,0,sizeof(cbuf));
|
||||
if ((s = socket(PF_INET, SOCK_DGRAM, 0)) < 0) {
|
||||
perror("socket");
|
||||
return 1;
|
||||
}
|
||||
bzero(&sin, sizeof sin);
|
||||
sin.sin_family = AF_INET;
|
||||
sin.sin_port = htons(1450);
|
||||
if(INADDR_ANY)
|
||||
sin.sin_addr.s_addr = htonl(INADDR_ANY);
|
||||
if(bind(s, (struct sockaddr *)&sin, sizeof sin) < 0) {
|
||||
perror("bind");
|
||||
return 2;
|
||||
}
|
||||
while(1) {
|
||||
b = sizeof sin;
|
||||
FD_ZERO(&fds);
|
||||
FD_SET(s, &fds);
|
||||
switch(select(s+1, &fds, NULL, NULL, NULL)) {
|
||||
case -1:
|
||||
perror("select");
|
||||
return 3;
|
||||
break;
|
||||
case 0:
|
||||
break;
|
||||
default:
|
||||
{
|
||||
len = sizeof from;
|
||||
if(FD_ISSET(s, &fds) != 0) {
|
||||
printf("here\n");
|
||||
recvfrom(s, cbuf, 63, 0, (struct sockaddr*)&from, &len);
|
||||
printf("%s", cbuf);
|
||||
memset(cbuf,0,sizeof(cbuf));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
4
xcid/Makefile
Normal file
4
xcid/Makefile
Normal file
|
@ -0,0 +1,4 @@
|
|||
all:
|
||||
cd src && make
|
||||
clean:
|
||||
cd src && make clean
|
BIN
xcid/src/.wind.c.swp
Normal file
BIN
xcid/src/.wind.c.swp
Normal file
Binary file not shown.
19
xcid/src/Makefile
Normal file
19
xcid/src/Makefile
Normal file
|
@ -0,0 +1,19 @@
|
|||
#gcc -g -I/usr/X11R6/include -L/usr/X11R6/lib -lXt -lX11 -lXaw -o xcid xcid.c network.c wind.c
|
||||
CFLAGS=-g -Wall
|
||||
CC=gcc
|
||||
CPPFLAGS=-I/usr/X11R6/include
|
||||
#-DDEBUG
|
||||
LDFLAGS=-L/usr/X11R6/lib -lXt -lX11 -lXaw
|
||||
OBJS=xcid.o network.o wind.o
|
||||
SRCS=xcid.c network.c wind.c
|
||||
all: xcid
|
||||
xcid: ${OBJS}
|
||||
$(CC) $(CFLAGS) $(LDFLAGS) $(OBJS) -o xcid
|
||||
xcid.o: xcid.c
|
||||
$(CC) $(CPPFLAGS) $(CFLAGS) -c xcid.c
|
||||
network.o: network.c
|
||||
$(CC) $(CPPFLAGS) $(CFLAGS) -c network.c
|
||||
wind.o: wind.c
|
||||
$(CC) $(CPPFLAGS) $(CFLAGS) -c wind.c
|
||||
clean:
|
||||
rm -f *.o core.* *.core *~ xcid
|
123
xcid/src/network.c
Normal file
123
xcid/src/network.c
Normal file
|
@ -0,0 +1,123 @@
|
|||
/*
|
||||
* XCid - network stuff
|
||||
* (C)2004, Dan Ponte
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. Neither the name of Dan Ponte nor the names of his contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY DAN PONTE AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL DAN PONTE OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*/
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <errno.h>
|
||||
#include <string.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/socket.h>
|
||||
#include <sys/select.h>
|
||||
#include <netinet/in.h>
|
||||
#include <arpa/inet.h>
|
||||
|
||||
#define PORT 3890
|
||||
#define BUFFERL 256
|
||||
struct sockaddr_in servsad;
|
||||
extern char* servaddr;
|
||||
|
||||
void telluser(char* buf);
|
||||
|
||||
void sendtoser(char* txt)
|
||||
{
|
||||
int s;
|
||||
struct sockaddr_in sin;
|
||||
s = socket(PF_INET, SOCK_DGRAM, 0);
|
||||
bzero(&sin, sizeof sin);
|
||||
sin.sin_family = AF_INET;
|
||||
sin.sin_addr.s_addr = inet_addr(servaddr);
|
||||
#ifdef DEBUG
|
||||
printf("it is %s\n", inet_ntoa(sin.sin_addr));
|
||||
#endif
|
||||
sin.sin_port = htons(1450);
|
||||
if(connect(s, (struct sockaddr *)&sin, sizeof sin) < 0) {
|
||||
perror("Connect");
|
||||
exit(-1);
|
||||
}
|
||||
write(s, txt, strlen(txt) + 1);
|
||||
close(s);
|
||||
return;
|
||||
}
|
||||
int start_netloop(void)
|
||||
{
|
||||
int sockfd, addr_len, nbytes;
|
||||
struct sockaddr_in ouraddr;
|
||||
struct sockaddr_in* bcasaddr;
|
||||
struct timeval tv;
|
||||
bcasaddr = &servsad;
|
||||
bzero(&servsad, sizeof servsad);
|
||||
fd_set fds_read;
|
||||
FD_ZERO(&fds_read);
|
||||
char buffer[BUFFERL];
|
||||
|
||||
if((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {
|
||||
perror("sock");
|
||||
exit(-1);
|
||||
}
|
||||
ouraddr.sin_family = AF_INET;
|
||||
ouraddr.sin_port = htons(PORT);
|
||||
ouraddr.sin_addr.s_addr = INADDR_ANY;
|
||||
memset(&(ouraddr.sin_zero), 0, 8);
|
||||
if(bind(sockfd, (struct sockaddr*)&ouraddr, sizeof(struct sockaddr)) == -1) {
|
||||
perror("bind");
|
||||
exit(-2);
|
||||
}
|
||||
addr_len = sizeof(struct sockaddr);
|
||||
while(1)
|
||||
{
|
||||
FD_ZERO(&fds_read);
|
||||
FD_SET(sockfd, &fds_read);
|
||||
tv.tv_sec = 3; tv.tv_usec = 0;
|
||||
switch(select(sockfd + 1, &fds_read, NULL, NULL, NULL))
|
||||
{
|
||||
case -1:
|
||||
perror("select");
|
||||
exit(-1);
|
||||
break;
|
||||
default:
|
||||
if(FD_ISSET(sockfd, &fds_read) != 0)
|
||||
{
|
||||
|
||||
if((nbytes = recvfrom(sockfd, buffer, BUFFERL - 1, 0, (struct sockaddr*)&bcasaddr, &addr_len
|
||||
)) == -1) {
|
||||
perror("recv");
|
||||
exit(-3);
|
||||
}
|
||||
buffer[nbytes] = 0;
|
||||
#ifdef DEBUG
|
||||
printf("got %s\n", buffer);
|
||||
#endif
|
||||
telluser(buffer);
|
||||
memset(buffer, 0, BUFFERL);
|
||||
}
|
||||
}
|
||||
}
|
||||
close(sockfd);
|
||||
return 0;
|
||||
}
|
381
xcid/src/pixmap.c
Normal file
381
xcid/src/pixmap.c
Normal file
|
@ -0,0 +1,381 @@
|
|||
/* GIMP RGB C-Source image dump (pixmap.c) */
|
||||
|
||||
static const struct {
|
||||
unsigned int width;
|
||||
unsigned int height;
|
||||
unsigned int bytes_per_pixel; /* 3:RGB, 4:RGBA */
|
||||
unsigned char pixel_data[48 * 48 * 3 + 1];
|
||||
} gimp_image = {
|
||||
48, 48, 3,
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\0\22\376\0\22\376\0\22\376\0\22\376"
|
||||
"\0\22\376\0\22\376\0\22\376\0\22\376\0\22\376\0\22\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\0\22\376\0\22\376\0"
|
||||
"\22\376\0\22\376\0\22\376\0\22\376\0\22\376\0\22\376\0\22\376\0\22\376\0"
|
||||
"\22\376\0\22\376\0\22\376\0\22\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\0\22\376\0\22\376"
|
||||
"\0\22\376\0\22\376\0\22\376\0\22\376\0\22\376\0\22\376\0\22\376\0\22\376"
|
||||
"\0\22\376\0\22\376\0\22\376\0\22\376\0\22\376\0\22\376\0\22\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\0\22\376\0\22\376\0\22\376\0\22\376\0\22\376\0\22\376\0\22\376\0\22\376"
|
||||
"\0\22\376\0\22\376\0\22\376\0\22\376\0\22\376\0\22\376\0\22\376\0\22\376"
|
||||
"\0\22\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\0\22\376\0\22\376\0\22\376\0\22\376\0\22\376\0\22\376\0\22\376\0"
|
||||
"\22\376\0\22\376\0\22\376\0\22\376\0\22\376\0\22\376\0\22\376\0\22\376\0"
|
||||
"\22\376\0\22\376\0\22\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\0\22\376\0\22\376\0\22\376\0\22\376\0\22\376\0\22"
|
||||
"\376\0\22\376\0\22\376\0\22\376\376\376\376\376\376\376\0\22\376\0\22\376"
|
||||
"\0\22\376\0\22\376\0\22\376\0\22\376\0\22\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\0\22\376\0\22\376\0\22\376\0"
|
||||
"\22\376\0\22\376\0\22\376\0\22\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\0\22\376\0\22\376\0\22\376\0\22\376\0\22\376\0\22\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\0\22\376\0\22\376\0\22\376\0\22\376\0\22\376\0\22\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\0\22\376"
|
||||
"\0\22\376\0\22\376\0\22\376\0\22\376\0\22\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\0\22\376\0\22\376\0\22\376\0\22\376\0\22"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\0\22\376\0\22\376\0\22\376\0\22\376\0\22\376"
|
||||
"\0\22\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\0\22"
|
||||
"\376\0\22\376\0\22\376\0\22\376\0\22\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\0\22\376"
|
||||
"\0\22\376\0\22\376\0\22\376\0\22\376\0\22\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\0\22\376\0\22\376\0\22\376\0\22\376\0\22"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\0\22\376\0\22\376\0\22\376\0\22\376\0\22\376"
|
||||
"\0\22\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\0\22\376\0\22\376\0\22\376\0\22\376\0\22\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\0\22\376"
|
||||
"\0\22\376\0\22\376\0\22\376\0\22\376\0\22\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\0\22\376\0\22\376\0\22\376\0"
|
||||
"\22\376\0\22\376\0\22\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\0\22\376\0\22\376\0\22\376\0\22\376\0\22\376\0\22"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\0\22\376\0\22\376\0\22\376\0\22\376\0\22\376\0\22\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\0\22\376\0\22\376\0\22\376\0"
|
||||
"\22\376\0\22\376\0\22\376\0\22\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\0\22\376\0\22\376\0\22\376\0\22\376\0\22\376\0\22\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\0\22\376\0\22\376\0\22\376\0\22\376\0\22\376\0\22\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\0\22\376\0\22\376\0\22\376\0\22"
|
||||
"\376\0\22\376\0\22\376\0\22\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\0\22\376"
|
||||
"\0\22\376\0\22\376\0\22\376\0\22\376\0\22\376\0\22\376\0\22\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\0\22\376\0\22\376\0\22\376\0\22\376\0\22\376\0\22\376\0\22\376"
|
||||
"\0\22\376\0\22\376\0\22\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\0\22\376\0\22\376\0\22\376\0\22\376"
|
||||
"\0\22\376\0\22\376\0\22\376\0\22\376\0\22\376\0\22\376\0\22\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\0\22\376\0\22"
|
||||
"\376\0\22\376\0\22\376\0\22\376\0\22\376\0\22\376\0\22\376\0\22\376\0\22"
|
||||
"\376\0\22\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\0\22\376\0\22\376\0\22\376\0\22\376\0\22\376\0\22"
|
||||
"\376\0\22\376\0\22\376\0\22\376\0\22\376\0\22\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\0\22\376\0\22"
|
||||
"\376\0\22\376\0\22\376\0\22\376\0\22\376\0\22\376\0\22\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\0\22\376\0\22\376\0\22\376\0\22\376\0\22"
|
||||
"\376\0\22\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
|
||||