#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//#include <windows.h>
typedef unsigned int uint32;

typedef unsigned int NODE;
typedef struct
{
	NODE *snode,*wnode;
	uint32 smask,mask;
} TFeld;

typedef struct
{
	NODE *dawg,*firstnode;
} DAWG;
DAWG dawg7;

unsigned int logtab[256];

TFeld feld[49];

FILE *fout;

unsigned char partstr[] = {128,129,130,131,0};

unsigned char fullstr[] = {
  128,129,130,131,132,133,134,'\n',
  135,136,137,138,139,140,141,'\n',
  142,143,144,145,146,147,148,'\n',
  149,150,151,152,153,154,155,'\n',
  156,157,158,159,160,161,162,'\n',
  163,164,165,166,167,168,169,'\n',
  170,171,172,173,174,175,176,0 };

unsigned char letters[]="?ABCDEFGHIJKLMNOPQRSTUVWXYZÄÖÜ";

static unsigned char logs[16]={0,0,1,1,2,2,2,2,3,3,3,3,3,3,3,3};
char savestat[4];
unsigned int savesym;
void relocate(NODE *node, NODE *reloc, int Pass)
{
	NODE next;
	unsigned int log, mask, maske;
	mask = *node;
	while(mask)
	{
		maske=mask&(-mask);
		mask ^= maske;
		log=0;
		if(maske&0xffff0000) { maske>>=16; log+=16; }
		if(maske&0xff00) { maske>>=8; log+=8; }
		if(maske&0xf0) { maske>>=4; log+=4; }
		log+=logs[maske];
		next = (node[log]&0xFFFFFCL)>>2;
		if (next)
		{
			if (Pass&&!(node[log] & 1)) continue;
			relocate(reloc+next,reloc,Pass);
			if (!Pass)
				node[log] |= 1;
			else
				node[log] = (NODE)(reloc+next);
		}
		else
		{
			node[log] = 0;
		}
	}
}
void LoadDawg(char *name, DAWG *Dawg)
{
	FILE *fin;
	long info[4];
	Dawg->dawg=NULL;
	Dawg->firstnode=NULL;
	if ((fin=fopen(name,"rb"))==NULL)
	{
		fprintf(stderr,"Cannot open DAWG-File (%s) !\n",name);
		exit(1);
	}
	fread(info,sizeof(long),4,fin);
	if(((info[0]&0xff000000)!=0xff000000)&&(info[0]!=0x01234567))
	{
		fprintf(stderr,"Bad DAWG format\n");
		exit(1);
	}
	if((Dawg->dawg=(NODE *)malloc(info[1]))==NULL)
	{
		fprintf(stderr,"Not enough memory for DAWG\n");
		exit(1);
	}
	fread(Dawg->dawg,1,info[1],fin);
	Dawg->firstnode=(NODE *)(((unsigned char *)Dawg->dawg)+info[2]);
	relocate(Dawg->firstnode,Dawg->dawg,0);
	relocate(Dawg->firstnode,Dawg->dawg,1);
	fclose(fin);
}
void FreeDawg(DAWG *Dawg)
{
	if (Dawg->dawg != NULL)
	{
		free(Dawg->dawg);
		Dawg->dawg = NULL;
	}
}
int saveausgabe()
{
	int zp;
	FILE *fout;
	unsigned char zeile[85];
	unsigned int mask,log;
	unsigned char *ctrl=partstr;
	TFeld *fp;
	zp=0;
	while(*ctrl)
	{
		if(*ctrl>=128)
		{
			fp=&(feld[(*ctrl)-128]);
			mask=fp->mask^(*fp->wnode&*fp->snode);
			log=0;
			if(mask&0xffff0000) { log=16; mask>>=16; }
			if(mask&0xff00) { log+=8; mask>>=8; }
			if(mask&0xf0) { log+=4; mask>>=4; }
			log+=logs[mask];
			zeile[zp++]=letters[log];
		}
		else
		{
			zeile[zp++]=*ctrl;
		}
		ctrl++;
	}
	zeile[zp++]='\n';
	zeile[zp]=0;
	if (memcmp(zeile, savestat, 4)<0) return -1;
	printf("%s",zeile);
	fout=fopen("pattern.sav", "wb");
	fwrite(zeile, 4,1,fout);
	fclose(fout);
	return 0;
}

void fullausgabe()
{
	FILE *fout;
	unsigned char *ctrl=fullstr;
	int zp;
	unsigned char zeile[85];
	unsigned int mask,log;
	TFeld *fp;
	zp=0;
	while(*ctrl)
	{
		if(*ctrl>=128)
		{
			fp=&(feld[(*ctrl)-128]);
			mask=fp->mask^(*fp->wnode&*fp->snode);
			log=0;
			if(mask&0xffff0000) { log=16; mask>>=16; }
			if(mask&0xff00) { log+=8; mask>>=8; }
			if(mask&0xf0) { log+=4; mask>>=4; }
			log+=logs[mask];
			zeile[zp++]=letters[log];
		}
		else
		{
			zeile[zp++]=*ctrl;
		}
		ctrl++;
	}
	zeile[zp++]='\n';
	zeile[zp]=0;
	fout=fopen("pattern.res","at");
	fprintf(fout,"%s\n",zeile);
	fclose(fout);
	printf("%s\n",zeile);
}

void doform()
{ uint32 mask,maske; int log;  feld[0].mask=feld[0].smask;
m0:
 mask=feld[0].mask;
  if(mask==0) return;
  maske=mask&(-mask); feld[0].mask=mask^maske;
  log=0; if(maske&0xffff0000) { maske>>=16; log=16; }
  if(maske&0xff00) { maske>>=8; log+=8; }
  log+=logtab[maske];  feld[7].smask=*(uint32 *)(feld[7].snode=(NODE *)feld[0].snode[log]);
  mask=feld[1].mask=feld[1].smask&(*(uint32 *)(feld[1].wnode=(NODE *)feld[0].wnode[log]));
m1:
 mask=feld[1].mask;
  if(mask==0) { goto m0; }
  maske=mask&(-mask); feld[1].mask=mask^maske;
 savesym=maske;
  log=0; if(maske&0xffff0000) { maske>>=16; log=16; }
  if(maske&0xff00) { maske>>=8; log+=8; }
  log+=logtab[maske];  feld[8].smask=*(uint32 *)(feld[8].snode=(NODE *)feld[1].snode[log]);
  mask=feld[2].mask=feld[2].smask&(*(uint32 *)(feld[2].wnode=(NODE *)feld[1].wnode[log]));
m2:
 mask=feld[2].mask;
  if(mask==0) { goto m1; }
  maske=mask&(-mask); feld[2].mask=mask^maske;
  log=0; if(maske&0xffff0000) { maske>>=16; log=16; }
  if(maske&0xff00) { maske>>=8; log+=8; }
  log+=logtab[maske];  feld[9].smask=*(uint32 *)(feld[9].snode=(NODE *)feld[2].snode[log]);
  mask=feld[3].mask=feld[3].smask&(*(uint32 *)(feld[3].wnode=(NODE *)feld[2].wnode[log]));
m3:
 mask=feld[3].mask;
  if(mask==0) { goto m2; }
  maske=mask&(-mask); feld[3].mask=mask^maske;
  log=0; if(maske&0xffff0000) { maske>>=16; log=16; }
  if(maske&0xff00) { maske>>=8; log+=8; }
  log+=logtab[maske];  feld[10].smask=*(uint32 *)(feld[10].snode=(NODE *)feld[3].snode[log]);
  mask=feld[4].mask=feld[4].smask&(*(uint32 *)(feld[4].wnode=(NODE *)feld[3].wnode[log]));
  if (saveausgabe()<0) { goto m3;}
m4:
 mask=feld[4].mask;
  if(mask==0) { goto m3; }
  maske=mask&(-mask); feld[4].mask=mask^maske;
  log=0; if(maske&0xffff0000) { maske>>=16; log=16; }
  if(maske&0xff00) { maske>>=8; log+=8; }
  log+=logtab[maske];  feld[11].smask=*(uint32 *)(feld[11].snode=(NODE *)feld[4].snode[log]);
  mask=feld[5].mask=feld[5].smask&(*(uint32 *)(feld[5].wnode=(NODE *)feld[4].wnode[log]));
m5:
 mask=feld[5].mask;
  if(mask==0) { goto m4; }
  maske=mask&(-mask); feld[5].mask=mask^maske;
  log=0; if(maske&0xffff0000) { maske>>=16; log=16; }
  if(maske&0xff00) { maske>>=8; log+=8; }
  log+=logtab[maske];  feld[12].smask=*(uint32 *)(feld[12].snode=(NODE *)feld[5].snode[log]);
  mask=feld[6].mask=feld[6].smask&(*(uint32 *)(feld[6].wnode=(NODE *)feld[5].wnode[log]));
m6:
 mask=feld[6].mask;
  if(mask==0) { goto m5; }
  maske=mask&(-mask); feld[6].mask=mask^maske;
  log=0; if(maske&0xffff0000) { maske>>=16; log=16; }
  if(maske&0xff00) { maske>>=8; log+=8; }
  log+=logtab[maske];  feld[13].smask=*(uint32 *)(feld[13].snode=(NODE *)feld[6].snode[log]);
  feld[7].mask=feld[7].smask&(*((NODE *)(feld[7].wnode)));
m7:
 mask=feld[7].mask;
  if(mask==0) { goto m6; }
  maske=mask&(-mask); feld[7].mask=mask^maske;
	if (maske < savesym) goto m7;
  log=0; if(maske&0xffff0000) { maske>>=16; log=16; }
  if(maske&0xff00) { maske>>=8; log+=8; }
  log+=logtab[maske];  feld[14].smask=*(uint32 *)(feld[14].snode=(NODE *)feld[7].snode[log]);
  mask=feld[8].mask=feld[8].smask&(*(uint32 *)(feld[8].wnode=(NODE *)feld[7].wnode[log]));
m8:
 mask=feld[8].mask;
  if(mask==0) { goto m7; }
  maske=mask&(-mask); feld[8].mask=mask^maske;
  log=0; if(maske&0xffff0000) { maske>>=16; log=16; }
  if(maske&0xff00) { maske>>=8; log+=8; }
  log+=logtab[maske];  feld[15].smask=*(uint32 *)(feld[15].snode=(NODE *)feld[8].snode[log]);
  mask=feld[9].mask=feld[9].smask&(*(uint32 *)(feld[9].wnode=(NODE *)feld[8].wnode[log]));
m9:
 mask=feld[9].mask;
  if(mask==0) { goto m8; }
  maske=mask&(-mask); feld[9].mask=mask^maske;
  log=0; if(maske&0xffff0000) { maske>>=16; log=16; }
  if(maske&0xff00) { maske>>=8; log+=8; }
  log+=logtab[maske];  feld[16].smask=*(uint32 *)(feld[16].snode=(NODE *)feld[9].snode[log]);
  mask=feld[10].mask=feld[10].smask&(*(uint32 *)(feld[10].wnode=(NODE *)feld[9].wnode[log]));
m10:
 mask=feld[10].mask;
  if(mask==0) { goto m9; }
  maske=mask&(-mask); feld[10].mask=mask^maske;
  log=0; if(maske&0xffff0000) { maske>>=16; log=16; }
  if(maske&0xff00) { maske>>=8; log+=8; }
  log+=logtab[maske];  feld[17].smask=*(uint32 *)(feld[17].snode=(NODE *)feld[10].snode[log]);
  mask=feld[11].mask=feld[11].smask&(*(uint32 *)(feld[11].wnode=(NODE *)feld[10].wnode[log]));
m11:
 mask=feld[11].mask;
  if(mask==0) { goto m10; }
  maske=mask&(-mask); feld[11].mask=mask^maske;
  log=0; if(maske&0xffff0000) { maske>>=16; log=16; }
  if(maske&0xff00) { maske>>=8; log+=8; }
  log+=logtab[maske];  feld[18].smask=*(uint32 *)(feld[18].snode=(NODE *)feld[11].snode[log]);
  mask=feld[12].mask=feld[12].smask&(*(uint32 *)(feld[12].wnode=(NODE *)feld[11].wnode[log]));
m12:
 mask=feld[12].mask;
  if(mask==0) { goto m11; }
  maske=mask&(-mask); feld[12].mask=mask^maske;
  log=0; if(maske&0xffff0000) { maske>>=16; log=16; }
  if(maske&0xff00) { maske>>=8; log+=8; }
  log+=logtab[maske];  feld[19].smask=*(uint32 *)(feld[19].snode=(NODE *)feld[12].snode[log]);
  mask=feld[13].mask=feld[13].smask&(*(uint32 *)(feld[13].wnode=(NODE *)feld[12].wnode[log]));
m13:
 mask=feld[13].mask;
  if(mask==0) { goto m12; }
  maske=mask&(-mask); feld[13].mask=mask^maske;
  log=0; if(maske&0xffff0000) { maske>>=16; log=16; }
  if(maske&0xff00) { maske>>=8; log+=8; }
  log+=logtab[maske];  feld[20].smask=*(uint32 *)(feld[20].snode=(NODE *)feld[13].snode[log]);
  feld[14].mask=feld[14].smask&(*((NODE *)(feld[14].wnode)));
m14:
 mask=feld[14].mask;
  if(mask==0) { goto m13; }
  maske=mask&(-mask); feld[14].mask=mask^maske;
  log=0; if(maske&0xffff0000) { maske>>=16; log=16; }
  if(maske&0xff00) { maske>>=8; log+=8; }
  log+=logtab[maske];  feld[21].smask=*(uint32 *)(feld[21].snode=(NODE *)feld[14].snode[log]);
  mask=feld[15].mask=feld[15].smask&(*(uint32 *)(feld[15].wnode=(NODE *)feld[14].wnode[log]));
m15:
 mask=feld[15].mask;
  if(mask==0) { goto m14; }
  maske=mask&(-mask); feld[15].mask=mask^maske;
  log=0; if(maske&0xffff0000) { maske>>=16; log=16; }
  if(maske&0xff00) { maske>>=8; log+=8; }
  log+=logtab[maske];  feld[22].smask=*(uint32 *)(feld[22].snode=(NODE *)feld[15].snode[log]);
  mask=feld[16].mask=feld[16].smask&(*(uint32 *)(feld[16].wnode=(NODE *)feld[15].wnode[log]));
m16:
 mask=feld[16].mask;
  if(mask==0) { goto m15; }
  maske=mask&(-mask); feld[16].mask=mask^maske;
  log=0; if(maske&0xffff0000) { maske>>=16; log=16; }
  if(maske&0xff00) { maske>>=8; log+=8; }
  log+=logtab[maske];  feld[23].smask=*(uint32 *)(feld[23].snode=(NODE *)feld[16].snode[log]);
  mask=feld[17].mask=feld[17].smask&(*(uint32 *)(feld[17].wnode=(NODE *)feld[16].wnode[log]));
m17:
 mask=feld[17].mask;
  if(mask==0) { goto m16; }
  maske=mask&(-mask); feld[17].mask=mask^maske;
  log=0; if(maske&0xffff0000) { maske>>=16; log=16; }
  if(maske&0xff00) { maske>>=8; log+=8; }
  log+=logtab[maske];  feld[24].smask=*(uint32 *)(feld[24].snode=(NODE *)feld[17].snode[log]);
  mask=feld[18].mask=feld[18].smask&(*(uint32 *)(feld[18].wnode=(NODE *)feld[17].wnode[log]));
m18:
 mask=feld[18].mask;
  if(mask==0) { goto m17; }
  maske=mask&(-mask); feld[18].mask=mask^maske;
  log=0; if(maske&0xffff0000) { maske>>=16; log=16; }
  if(maske&0xff00) { maske>>=8; log+=8; }
  log+=logtab[maske];  feld[25].smask=*(uint32 *)(feld[25].snode=(NODE *)feld[18].snode[log]);
  mask=feld[19].mask=feld[19].smask&(*(uint32 *)(feld[19].wnode=(NODE *)feld[18].wnode[log]));
m19:
 mask=feld[19].mask;
  if(mask==0) { goto m18; }
  maske=mask&(-mask); feld[19].mask=mask^maske;
  log=0; if(maske&0xffff0000) { maske>>=16; log=16; }
  if(maske&0xff00) { maske>>=8; log+=8; }
  log+=logtab[maske];  feld[26].smask=*(uint32 *)(feld[26].snode=(NODE *)feld[19].snode[log]);
  mask=feld[20].mask=feld[20].smask&(*(uint32 *)(feld[20].wnode=(NODE *)feld[19].wnode[log]));
m20:
 mask=feld[20].mask;
  if(mask==0) { goto m19; }
  maske=mask&(-mask); feld[20].mask=mask^maske;
  log=0; if(maske&0xffff0000) { maske>>=16; log=16; }
  if(maske&0xff00) { maske>>=8; log+=8; }
  log+=logtab[maske];  feld[27].smask=*(uint32 *)(feld[27].snode=(NODE *)feld[20].snode[log]);
  feld[21].mask=feld[21].smask&(*((NODE *)(feld[21].wnode)));
m21:
 mask=feld[21].mask;
  if(mask==0) { goto m20; }
  maske=mask&(-mask); feld[21].mask=mask^maske;
  log=0; if(maske&0xffff0000) { maske>>=16; log=16; }
  if(maske&0xff00) { maske>>=8; log+=8; }
  log+=logtab[maske];  feld[28].smask=*(uint32 *)(feld[28].snode=(NODE *)feld[21].snode[log]);
  mask=feld[22].mask=feld[22].smask&(*(uint32 *)(feld[22].wnode=(NODE *)feld[21].wnode[log]));
m22:
 mask=feld[22].mask;
  if(mask==0) { goto m21; }
  maske=mask&(-mask); feld[22].mask=mask^maske;
  log=0; if(maske&0xffff0000) { maske>>=16; log=16; }
  if(maske&0xff00) { maske>>=8; log+=8; }
  log+=logtab[maske];  feld[29].smask=*(uint32 *)(feld[29].snode=(NODE *)feld[22].snode[log]);
  mask=feld[23].mask=feld[23].smask&(*(uint32 *)(feld[23].wnode=(NODE *)feld[22].wnode[log]));
m23:
 mask=feld[23].mask;
  if(mask==0) { goto m22; }
  maske=mask&(-mask); feld[23].mask=mask^maske;
  log=0; if(maske&0xffff0000) { maske>>=16; log=16; }
  if(maske&0xff00) { maske>>=8; log+=8; }
  log+=logtab[maske];  feld[30].smask=*(uint32 *)(feld[30].snode=(NODE *)feld[23].snode[log]);
  mask=feld[24].mask=feld[24].smask&(*(uint32 *)(feld[24].wnode=(NODE *)feld[23].wnode[log]));
m24:
 mask=feld[24].mask;
  if(mask==0) { goto m23; }
  maske=mask&(-mask); feld[24].mask=mask^maske;
  log=0; if(maske&0xffff0000) { maske>>=16; log=16; }
  if(maske&0xff00) { maske>>=8; log+=8; }
  log+=logtab[maske];  feld[31].smask=*(uint32 *)(feld[31].snode=(NODE *)feld[24].snode[log]);
  mask=feld[25].mask=feld[25].smask&(*(uint32 *)(feld[25].wnode=(NODE *)feld[24].wnode[log]));
m25:
 mask=feld[25].mask;
  if(mask==0) { goto m24; }
  maske=mask&(-mask); feld[25].mask=mask^maske;
  log=0; if(maske&0xffff0000) { maske>>=16; log=16; }
  if(maske&0xff00) { maske>>=8; log+=8; }
  log+=logtab[maske];  feld[32].smask=*(uint32 *)(feld[32].snode=(NODE *)feld[25].snode[log]);
  mask=feld[26].mask=feld[26].smask&(*(uint32 *)(feld[26].wnode=(NODE *)feld[25].wnode[log]));
m26:
 mask=feld[26].mask;
  if(mask==0) { goto m25; }
  maske=mask&(-mask); feld[26].mask=mask^maske;
  log=0; if(maske&0xffff0000) { maske>>=16; log=16; }
  if(maske&0xff00) { maske>>=8; log+=8; }
  log+=logtab[maske];  feld[33].smask=*(uint32 *)(feld[33].snode=(NODE *)feld[26].snode[log]);
  mask=feld[27].mask=feld[27].smask&(*(uint32 *)(feld[27].wnode=(NODE *)feld[26].wnode[log]));
m27:
 mask=feld[27].mask;
  if(mask==0) { goto m26; }
  maske=mask&(-mask); feld[27].mask=mask^maske;
  log=0; if(maske&0xffff0000) { maske>>=16; log=16; }
  if(maske&0xff00) { maske>>=8; log+=8; }
  log+=logtab[maske];  feld[34].smask=*(uint32 *)(feld[34].snode=(NODE *)feld[27].snode[log]);
  feld[28].mask=feld[28].smask&(*((NODE *)(feld[28].wnode)));
m28:
 mask=feld[28].mask;
  if(mask==0) { goto m27; }
  maske=mask&(-mask); feld[28].mask=mask^maske;
  log=0; if(maske&0xffff0000) { maske>>=16; log=16; }
  if(maske&0xff00) { maske>>=8; log+=8; }
  log+=logtab[maske];  feld[35].smask=*(uint32 *)(feld[35].snode=(NODE *)feld[28].snode[log]);
  mask=feld[29].mask=feld[29].smask&(*(uint32 *)(feld[29].wnode=(NODE *)feld[28].wnode[log]));
m29:
 mask=feld[29].mask;
  if(mask==0) { goto m28; }
  maske=mask&(-mask); feld[29].mask=mask^maske;
  log=0; if(maske&0xffff0000) { maske>>=16; log=16; }
  if(maske&0xff00) { maske>>=8; log+=8; }
  log+=logtab[maske];  feld[36].smask=*(uint32 *)(feld[36].snode=(NODE *)feld[29].snode[log]);
  mask=feld[30].mask=feld[30].smask&(*(uint32 *)(feld[30].wnode=(NODE *)feld[29].wnode[log]));
m30:
 mask=feld[30].mask;
  if(mask==0) { goto m29; }
  maske=mask&(-mask); feld[30].mask=mask^maske;
  log=0; if(maske&0xffff0000) { maske>>=16; log=16; }
  if(maske&0xff00) { maske>>=8; log+=8; }
  log+=logtab[maske];  feld[37].smask=*(uint32 *)(feld[37].snode=(NODE *)feld[30].snode[log]);
  mask=feld[31].mask=feld[31].smask&(*(uint32 *)(feld[31].wnode=(NODE *)feld[30].wnode[log]));
m31:
 mask=feld[31].mask;
  if(mask==0) { goto m30; }
  maske=mask&(-mask); feld[31].mask=mask^maske;
  log=0; if(maske&0xffff0000) { maske>>=16; log=16; }
  if(maske&0xff00) { maske>>=8; log+=8; }
  log+=logtab[maske];  feld[38].smask=*(uint32 *)(feld[38].snode=(NODE *)feld[31].snode[log]);
  mask=feld[32].mask=feld[32].smask&(*(uint32 *)(feld[32].wnode=(NODE *)feld[31].wnode[log]));
m32:
 mask=feld[32].mask;
  if(mask==0) { goto m31; }
  maske=mask&(-mask); feld[32].mask=mask^maske;
  log=0; if(maske&0xffff0000) { maske>>=16; log=16; }
  if(maske&0xff00) { maske>>=8; log+=8; }
  log+=logtab[maske];  feld[39].smask=*(uint32 *)(feld[39].snode=(NODE *)feld[32].snode[log]);
  mask=feld[33].mask=feld[33].smask&(*(uint32 *)(feld[33].wnode=(NODE *)feld[32].wnode[log]));
m33:
 mask=feld[33].mask;
  if(mask==0) { goto m32; }
  maske=mask&(-mask); feld[33].mask=mask^maske;
  log=0; if(maske&0xffff0000) { maske>>=16; log=16; }
  if(maske&0xff00) { maske>>=8; log+=8; }
  log+=logtab[maske];  feld[40].smask=*(uint32 *)(feld[40].snode=(NODE *)feld[33].snode[log]);
  mask=feld[34].mask=feld[34].smask&(*(uint32 *)(feld[34].wnode=(NODE *)feld[33].wnode[log]));
m34:
 mask=feld[34].mask;
  if(mask==0) { goto m33; }
  maske=mask&(-mask); feld[34].mask=mask^maske;
  log=0; if(maske&0xffff0000) { maske>>=16; log=16; }
  if(maske&0xff00) { maske>>=8; log+=8; }
  log+=logtab[maske];  feld[41].smask=*(uint32 *)(feld[41].snode=(NODE *)feld[34].snode[log]);
  feld[35].mask=feld[35].smask&(*((NODE *)(feld[35].wnode)));
m35:
 mask=feld[35].mask;
  if(mask==0) { goto m34; }
  maske=mask&(-mask); feld[35].mask=mask^maske;
  log=0; if(maske&0xffff0000) { maske>>=16; log=16; }
  if(maske&0xff00) { maske>>=8; log+=8; }
  log+=logtab[maske];  feld[42].smask=*(uint32 *)(feld[42].snode=(NODE *)feld[35].snode[log]);
  mask=feld[36].mask=feld[36].smask&(*(uint32 *)(feld[36].wnode=(NODE *)feld[35].wnode[log]));
m36:
 mask=feld[36].mask;
  if(mask==0) { goto m35; }
  maske=mask&(-mask); feld[36].mask=mask^maske;
  log=0; if(maske&0xffff0000) { maske>>=16; log=16; }
  if(maske&0xff00) { maske>>=8; log+=8; }
  log+=logtab[maske];  feld[43].smask=*(uint32 *)(feld[43].snode=(NODE *)feld[36].snode[log]);
  mask=feld[37].mask=feld[37].smask&(*(uint32 *)(feld[37].wnode=(NODE *)feld[36].wnode[log]));
m37:
 mask=feld[37].mask;
  if(mask==0) { goto m36; }
  maske=mask&(-mask); feld[37].mask=mask^maske;
  log=0; if(maske&0xffff0000) { maske>>=16; log=16; }
  if(maske&0xff00) { maske>>=8; log+=8; }
  log+=logtab[maske];  feld[44].smask=*(uint32 *)(feld[44].snode=(NODE *)feld[37].snode[log]);
  mask=feld[38].mask=feld[38].smask&(*(uint32 *)(feld[38].wnode=(NODE *)feld[37].wnode[log]));
m38:
 mask=feld[38].mask;
  if(mask==0) { goto m37; }
  maske=mask&(-mask); feld[38].mask=mask^maske;
  log=0; if(maske&0xffff0000) { maske>>=16; log=16; }
  if(maske&0xff00) { maske>>=8; log+=8; }
  log+=logtab[maske];  feld[45].smask=*(uint32 *)(feld[45].snode=(NODE *)feld[38].snode[log]);
  mask=feld[39].mask=feld[39].smask&(*(uint32 *)(feld[39].wnode=(NODE *)feld[38].wnode[log]));
m39:
 mask=feld[39].mask;
  if(mask==0) { goto m38; }
  maske=mask&(-mask); feld[39].mask=mask^maske;
  log=0; if(maske&0xffff0000) { maske>>=16; log=16; }
  if(maske&0xff00) { maske>>=8; log+=8; }
  log+=logtab[maske];  feld[46].smask=*(uint32 *)(feld[46].snode=(NODE *)feld[39].snode[log]);
  mask=feld[40].mask=feld[40].smask&(*(uint32 *)(feld[40].wnode=(NODE *)feld[39].wnode[log]));
m40:
 mask=feld[40].mask;
  if(mask==0) { goto m39; }
  maske=mask&(-mask); feld[40].mask=mask^maske;
  log=0; if(maske&0xffff0000) { maske>>=16; log=16; }
  if(maske&0xff00) { maske>>=8; log+=8; }
  log+=logtab[maske];  feld[47].smask=*(uint32 *)(feld[47].snode=(NODE *)feld[40].snode[log]);
  mask=feld[41].mask=feld[41].smask&(*(uint32 *)(feld[41].wnode=(NODE *)feld[40].wnode[log]));
m41:
 mask=feld[41].mask;
  if(mask==0) { goto m40; }
  maske=mask&(-mask); feld[41].mask=mask^maske;
  log=0; if(maske&0xffff0000) { maske>>=16; log=16; }
  if(maske&0xff00) { maske>>=8; log+=8; }
  log+=logtab[maske];  feld[48].smask=*(uint32 *)(feld[48].snode=(NODE *)feld[41].snode[log]);
  feld[42].mask=feld[42].smask&(*((NODE *)(feld[42].wnode)));
m42:
 mask=feld[42].mask;
  if(mask==0) { goto m41; }
  maske=mask&(-mask); feld[42].mask=mask^maske;
  log=0; if(maske&0xffff0000) { maske>>=16; log=16; }
  if(maske&0xff00) { maske>>=8; log+=8; }
  log+=logtab[maske];  mask=feld[43].mask=feld[43].smask&(*(uint32 *)(feld[43].wnode=(NODE *)feld[42].wnode[log]));
m43:
 mask=feld[43].mask;
  if(mask==0) { goto m42; }
  maske=mask&(-mask); feld[43].mask=mask^maske;
  log=0; if(maske&0xffff0000) { maske>>=16; log=16; }
  if(maske&0xff00) { maske>>=8; log+=8; }
  log+=logtab[maske];  mask=feld[44].mask=feld[44].smask&(*(uint32 *)(feld[44].wnode=(NODE *)feld[43].wnode[log]));
m44:
 mask=feld[44].mask;
  if(mask==0) { goto m43; }
  maske=mask&(-mask); feld[44].mask=mask^maske;
  log=0; if(maske&0xffff0000) { maske>>=16; log=16; }
  if(maske&0xff00) { maske>>=8; log+=8; }
  log+=logtab[maske];  mask=feld[45].mask=feld[45].smask&(*(uint32 *)(feld[45].wnode=(NODE *)feld[44].wnode[log]));
m45:
 mask=feld[45].mask;
  if(mask==0) { goto m44; }
  maske=mask&(-mask); feld[45].mask=mask^maske;
  log=0; if(maske&0xffff0000) { maske>>=16; log=16; }
  if(maske&0xff00) { maske>>=8; log+=8; }
  log+=logtab[maske];  mask=feld[46].mask=feld[46].smask&(*(uint32 *)(feld[46].wnode=(NODE *)feld[45].wnode[log]));
m46:
 mask=feld[46].mask;
  if(mask==0) { goto m45; }
  maske=mask&(-mask); feld[46].mask=mask^maske;
  log=0; if(maske&0xffff0000) { maske>>=16; log=16; }
  if(maske&0xff00) { maske>>=8; log+=8; }
  log+=logtab[maske];  mask=feld[47].mask=feld[47].smask&(*(uint32 *)(feld[47].wnode=(NODE *)feld[46].wnode[log]));
m47:
 mask=feld[47].mask;
  if(mask==0) { goto m46; }
  maske=mask&(-mask); feld[47].mask=mask^maske;
  log=0; if(maske&0xffff0000) { maske>>=16; log=16; }
  if(maske&0xff00) { maske>>=8; log+=8; }
  log+=logtab[maske];  mask=feld[48].mask=feld[48].smask&(*(uint32 *)(feld[48].wnode=(NODE *)feld[47].wnode[log]));
m48:
 mask=feld[48].mask;
  if(mask==0) { goto m47; }
  maske=mask&(-mask); feld[48].mask=mask^maske;
  fullausgabe();
 goto m48;
}

int main()
{
	int i;
	FILE *fout;
	int start, end;
	LoadDawg("rdawg7.pck2",&dawg7);
	fout=fopen("pattern.sav", "rb");
	if (fout)
	{
		fread(savestat, 4,1,fout);
		fclose(fout);
	}
	feld[0].wnode=dawg7.firstnode;
	feld[7].wnode=dawg7.firstnode;
	feld[14].wnode=dawg7.firstnode;
	feld[21].wnode=dawg7.firstnode;
	feld[28].wnode=dawg7.firstnode;
	feld[35].wnode=dawg7.firstnode;
	feld[42].wnode=dawg7.firstnode;
	feld[0].smask=*(feld[0].snode=dawg7.firstnode);
	feld[1].smask=*(feld[1].snode=dawg7.firstnode);
	feld[2].smask=*(feld[2].snode=dawg7.firstnode);
	feld[3].smask=*(feld[3].snode=dawg7.firstnode);
	feld[4].smask=*(feld[4].snode=dawg7.firstnode);
	feld[5].smask=*(feld[5].snode=dawg7.firstnode);
	feld[6].smask=*(feld[6].snode=dawg7.firstnode);
  for(i=0;i<8;i++) logtab[1<<i]=i;
	start = GetTickCount();
	doform();
	end = GetTickCount();
	fout=fopen("pattern.res","at");
	fprintf(fout,"Finished in %d milliseconds\n",end-start);
	fclose(fout);
	FreeDawg(&dawg7);
  return(0);
}
