Phalanx-XXV/0000755000175000010010000000000012711451433011715 5ustar dusanNonePhalanx-XXV/bcreate.c0000644000175000010010000002422512376442331013477 0ustar dusanNone#include "phalanx.h" int WIN=5; /* highest value for every win of this move */ int DRA=2; /* much smaller value for drawing moves */ int LOO=1; /* lowest value for losing moves */ int UNK=1; /* the result is unknown. there is often [Result "*"] in lots of PGN files */ int Asize=500000; /* default buffer size. one cell is 12 bytes. qsort() temporarily needs about twice as much memory to sort the array. */ int MaxBookPly=70; /* we want only opening to be in the book ... stop the game parsing at this ply. */ int MaxComment=4096; /* maximum size of comment in bytes. if a comment exceeds this limit, we search for another game. */ int MinValue=15; /* move bonus must be >= MinValue, otherwise the move is not added into the opening book. */ int MinPercentage=80; /* alternate moves must be at least at MinPercentage % of the value of the most valuable move */ FILE * tb1; FILE * tb2; typedef struct { unsigned hashboard; unsigned n; unsigned short move; } tb; /* 10 bytes */ tb *A; int I=0; int bsortkey( const void *a, const void *b ) { if( ((tb*)a)->hashboard > ((tb*)b)->hashboard ) return 1; else if( ((tb*)a)->hashboard < ((tb*)b)->hashboard ) return -1; else if( ((tb*)a)->move > ((tb*)b)->move ) return 1; else if( ((tb*)a)->move < ((tb*)b)->move ) return -1; else return 0; } int usortkey( const void *a, const void *b ) { if( ((tb*)a)->n < ((tb*)b)->n ) return 1; else return -1; } int games=0; int positions=0; void printit(int x) { printf("%8i%10i%7i%%", games,positions,I*100/Asize); fflush(stdout); #if defined(__GNUC__) && !defined(__MINGW32__) signal(SIGALRM,printit); alarm(5); #endif } void compress(void) { int i1, i2; printit(0); #if defined(__GNUC__) && !defined(__MINGW32__) alarm(0); #endif printf("\nsorting buffer ............ "); qsort( A, I, sizeof(tb), bsortkey ); puts("done"); printf("compressing buffer ........ "); i1=0; i2=1; while( i2 != I ) { while( i2 != I && A[i1].hashboard == A[i2].hashboard && A[i1].move == A[i2].move ) { A[i1].n += A[i2].n; i2++; } if( i2 != I ) { i1++; A[i1]=A[i2]; i2++; } } I=i1+1; A[I].n = 0; printf("done, buffer usage=%i (%i%%)\n",I,100*I/Asize); /** Now, take tb1 file and the memory buffer and join them to *** the tb2 (rbook.phalanx.tmp). Rename tb2 to tb1. **/ { int i=0; int done_m, done_f; tb mtb, ftb; printf("adding to file ............ "); tb1=fopen("rbook.phalanx","rb"); tb2=fopen("rbook.phalanx.tmp","wb"); rewind(tb1); mtb=A[0]; i=1; done_m=(i==I); myfread( &ftb, sizeof(tb), tb1 ); done_f=feof(tb1); while( !done_f || !done_m ) { if( !done_m && !done_f && bsortkey(&mtb,&ftb)==0 ) { mtb.n += ftb.n; myfwrite(&mtb,sizeof(tb),tb2); mtb=A[i]; i++; done_m=(i==I); myfread(&ftb,sizeof(tb),tb1); done_f=feof(tb1); } else if( !done_m && ( done_f || bsortkey(&mtb,&ftb)==-1 ) ) { myfwrite(&mtb,sizeof(tb),tb2); mtb=A[i]; i++; done_m=(i==I); } else if( !done_f && ( done_m || bsortkey(&mtb,&ftb)==1 ) ) { myfwrite(&ftb,sizeof(tb),tb2); myfread(&ftb,sizeof(tb),tb1); done_f=feof(tb1); } } /* good, it's there, close the two files, move newly * joined to the first one and reopen */ fclose(tb1); fclose(tb2); remove("rbook.phalanx"); rename("rbook.phalanx.tmp","rbook.phalanx"); printf("done\n"); } I=0; #if defined(__GNUC__) && !defined(__MINGW32__) alarm(5); #endif } int bpoints, wpoints; int findgame(void) { register int c; register int found=0; char s[64]; bpoints=0; wpoints=0; while( ! found ) { while( (c=getchar()) != EOF && c!='R' ) {} if( c==EOF ) return 0; if( fgets(s,6,stdin)==NULL ) return 0; if( strncmp(s,"esult",5) == 0 ) { int nlns=0; while( (c=getchar()) == ' ' ) {} if( fgets(s,4,stdin)==NULL ) return 0; if( strncmp(s,"1-0",3) == 0 ) { bpoints=LOO; wpoints=WIN; } else if( strncmp(s,"0-1",3) == 0 ) { bpoints=WIN; wpoints=LOO; } else if( strncmp(s,"1/2",3) == 0 ) { bpoints=DRA; wpoints=DRA; } else { bpoints=UNK; wpoints=UNK; } /*** find two newlines in a row -> end of the header ***/ while( (c=getchar()) != EOF && nlns < 2 ) { if(c=='\n') nlns++; else nlns=0; } if(c!=EOF) return 1; } } return 0; } extern char piece[7]; extern char file[10]; extern char row[12]; int addmove(char *move) { static tmove m[256]; tmove * mf; static int n; generate_legal_moves( m, &n, checktest(Color) ); if( (mf=sandex(move,m,n)) != NULL ) { if( Color==WHITE ) { if(wpoints) { A[I].hashboard=G[Counter].hashboard; A[I].move = smove(mf); A[I].n = wpoints; positions++; I++; if( I>=Asize ) compress(); } } else { if(bpoints) { A[I].hashboard=G[Counter].hashboard; A[I].move = smove(mf); A[I].n = bpoints; positions++; I++; if( I>=Asize ) compress(); } } do_move(mf); return 1; } else { return 0; } } void parsegame(void) { register int c='*'; /*unsigned*/ char m[128]; int i; setfen("rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1"); while( c!='[' && c!=EOF && Counter < MaxBookPly ) { while( (c=getchar()) != '.' && c!=EOF ) if(c=='{') { int csize=0; while( (c=getchar())!='}' && c!=EOF && csize\n"); printf("Options: -b one cell is %lu bytes\n", (unsigned long) sizeof(tb) ); printf(" -p \n"); printf(" -c \n"); printf(" -v \n"); printf(" -g \n"); printf(" -w \n"); printf(" -d \n"); printf(" -l \n"); printf(" -u \n"); exit(0); } int bcreate( int argc, char ** argv ) { FILE * f; int c; while( (c=getopt(argc,argv,"b:p:c:v:g:w:d:l:u:")) != -1 ) switch(c) { case 'b': if( sscanf( optarg, "%i", &Asize ) == 0 ) wusage(); if( Asize < 1000 ) wusage(); break; case 'p': if( sscanf( optarg, "%i", &MaxBookPly ) == 0 ) wusage(); if( MaxBookPly < 2 ) wusage(); break; case 'c': if( sscanf( optarg, "%i", &MaxComment ) == 0 ) wusage(); if( MaxComment < 2 ) wusage(); break; case 'v': if( sscanf( optarg, "%i", &MinValue ) == 0 ) wusage(); if( MinValue < 0 ) wusage(); break; case 'g': if( sscanf( optarg, "%i", &MinPercentage ) == 0 ) wusage(); if( MinPercentage < 50 || MinPercentage > 100 ) wusage(); break; case 'w': if( sscanf( optarg, "%i", &WIN ) == 0 ) wusage(); if( WIN < 1 || WIN > 10 ) wusage(); break; case 'd': if( sscanf( optarg, "%i", &DRA ) == 0 ) wusage(); if( DRA < 0 || DRA > 10 ) wusage(); break; case 'l': if( sscanf( optarg, "%i", &LOO ) == 0 ) wusage(); if( LOO < 0 || LOO > 10 ) wusage(); break; case 'u': if( sscanf( optarg, "%i", &UNK ) == 0 ) wusage(); if( UNK < 0 || UNK > 10 ) wusage(); break; default: wusage(); } A=malloc(Asize*sizeof(tb)); if( A == NULL ) { printf("cannot alloc %lu bytes of memory\n", (unsigned long)(Asize*sizeof(tb))); exit(0); } { struct stat fs; if( ! stat("rbook.phalanx",&fs) ) { puts("rbook.phalanx exists, skipping stage 1"); goto stage_2; } else { tb1 = fopen("rbook.phalanx", "w+"); } } setvbuf(stdout, (char*)NULL, _IONBF, 0); puts( "creating opening book"); puts( "-----------------------------"); puts( " games positions buffer%"); puts( "-----------------------------"); #if defined(__GNUC__) && !defined(__MINGW32__) signal(SIGALRM,printit); alarm(5); #endif while( findgame() ) { parsegame(); games++; } printf("end of file, parsed %i positions in %i games\n",positions,games); if( games == 0 ) { puts("opening book not created"); return 0; } compress(); #if defined(__GNUC__) && !defined(__MINGW32__) alarm(0); #endif stage_2:; if( ( f = fopen( SBOOK_FILE, "wb" ) ) == NULL ) { printf("cannot create book file %s\n", SBOOK_FILE); return 1; } { int dots=0; struct stat fs; int fsize; tb M; tb1=fopen("rbook.phalanx","rb"); myfread( &M, sizeof(tb), tb1 ); stat("rbook.phalanx",&fs); fsize = fs.st_size/sizeof(tb); printf("rbook records = %i, writing book ", fsize); while(!feof(tb1)) { int i; int minn; A[0]=M; I=0; do { int fpos=ftell(tb1)/sizeof(tb); if( fpos % (fsize/30) == 1 ) { if( dots==3 ) { printf("%i%%", (int)(((float)fpos)*100/fsize + 1) ); dots=0; } else printf("."); dots++; } I++; myfread( A+I, sizeof(tb), tb1 ); } while( !feof(tb1) && M.hashboard==A[I].hashboard ); M=A[I]; /* sort them, better first */ qsort( A, I, sizeof(tb), usortkey ); /* more variability in frequently played lines of early openings */ { unsigned i=100, j=10, p=MinPercentage; while( A[0].n > i && p>10 ) { p-=j; j--; i*=10; } minn=A[0].n*p/100; } if( minn > A[0].n ) minn = A[0].n; if( minn < MinValue ) minn=MinValue; for( i=0; i!=I && A[i].n>=minn; i++ ) {} /* printf("got %i of %i moves at hasboard of %08X, next HB %08X\n", i, I, A[0].hashboard, M.hashboard ); */ I=i; for(i=0;i!=I;i++) { unsigned short m = A[i].move; myfwrite( A+i, sizeof(unsigned), f ); myfwrite( &m, sizeof(unsigned short), f ); } } printf(" done\n"); } return 0; } Phalanx-XXV/book.c0000644000175000010010000002611012373752101013013 0ustar dusanNone#include "phalanx.h" #undef SHOWREADS #undef SHOWDUPS tsbook Sbook; tpbook Pbook; int Bookout=0; /* * myfwrite(), myfread() to fix the endianess problem. */ # define ISI ((int)sizeof(int)) void myfwrite( void *ptr, int size, FILE *stream ) { int i,j; for( i=0; i9) lenght++; lenght++; counter=0; } sprintf(&s[lenght],"%c",P[B[i]/8+(color(B[i])==BLACK)]); lenght++; } else if( B[i]==0 ) counter++; if(counter) sprintf(&s[lenght],"%i ",counter); else sprintf(&s[lenght]," "); } /* * Compare position strings p1 and p2. * p1==p2 ... returns 0 * p1>p2 ... 1; p1p2[i]) return 1; if(p1[i]==' ') return 0; } fprintf(stderr,"Phalanx error: Opening book corrupted.\n"); exit(2); } /* * Now the book searching functions. If there is less than * 512 bytes to search, the book is searched linearly. */ int linSB(FILE *f, long from, long to, char *p, char *s) { if( fseek(f,from,SEEK_SET)!=0 ) { return -1; } if(!feof(f)) fgets(s,80,f); /* skip to the first \n */ while(ftell(f)<=to && !feof(f)) { fgets(s,100,f); if( poscmp(p,s)==0 ) return 0; } return -1; } /* * There is more than 512 bytes to search -> use binary search. */ int binSB(FILE *f, long from, long to, char *p, char *s) { long mid; if( to-from < 512 ) return( linSB(f,from,to,p,s) ); mid=(to+from)/2; if( fseek(f,mid,SEEK_SET)!=0 ) return -1; if(!feof(f)) fgets(s,80,f); /* skip to the first \n */ if(!feof(f)) fgets(s,100,f); switch(poscmp(p,s)) { case 0: return(0); case 1: return( binSB(f,mid,to,p,s) ); case -1: return( binSB(f,from,mid,p,s) ); default: return -1; } } int parsemove( char *inp, tmove *m, int n ) { int special, from, to, in2a, i; special = 0; from = inp[0]-'a'+1 + 10*(inp[1]-'1') + 20; to = inp[2]-'a'+1 + 10*(inp[3]-'1') + 20; in2a = 0; if( strncmp(inp,"o-o-o",5)==0 || strncmp(inp,"0-0-0",5)==0 || strncmp(inp,"O-O-O",5)==0 || ( B[E1]==WK && strncmp(inp,"e1c1",4)==0 ) || ( B[E8]==BK && strncmp(inp,"e8c8",4)==0 ) ) special = LONG_CASTLING; else if( strncmp(inp,"o-o",3)==0 || strncmp(inp,"0-0",3)==0 || strncmp(inp,"O-O",3)==0 || ( B[E1]==WK && strncmp(inp,"e1g1",4)==0 ) || ( B[E8]==BK && strncmp(inp,"e8g8",4)==0 ) ) special = SHORT_CASTLING; switch(inp[4]) { case 'Q': case 'q': in2a=QUEEN+Color; break; case 'R': case 'r': in2a=ROOK+Color; break; case 'B': case 'b': in2a=BISHOP+Color; break; case 'N': case 'n': in2a=KNIGHT+Color; break; default : in2a=B[from]; } for(i=0; i!=n; i++) { if( ( special>0 && special Sbook.lastkey ) return -1; fkey = Sbook.firstkey; lkey = Sbook.lastkey; booksize = Sbook.filesize/6; first = 0; last = booksize-1; if( G[Counter].hashboard == Sbook.firstkey ) middle=0; else if( G[Counter].hashboard == Sbook.lastkey ) middle=booksize-1; else while( first < last ) { /* middle = (first+last) / 2; */ middle = (G[Counter].hashboard-fkey)*(last-first) / (lkey-fkey) + first; if(middle==first) middle++; if(middle==last) middle--; if(middle==first) { #ifdef SHOWREADS printf("notfoundinbook %i\n", hits ); #endif return -1; } if( fseek(f,middle*6,SEEK_SET)!=0 ) return -1; myfread( &pos, sizeof(unsigned), f ); hits++; if( pos < G[Counter].hashboard ) { first=middle; fkey=pos; } else if( pos == G[Counter].hashboard ) break; else { last=middle; lkey=pos; } } /* printf("[%i %i %i %i] [%08X %08X]\n", first,middle,last,booksize,pos,G[Counter].hashboard); */ #ifdef SHOWREADS printf("yesfoundinbook %i\n",hits); #endif if( middle == 0 ) pos = G[Counter].hashboard; else do { middle --; if( fseek(f,middle*6,SEEK_SET)!=0 ) return -1; myfread( &pos, sizeof(unsigned), f ); } while( middle>0 && pos==G[Counter].hashboard ); if(pos!=G[Counter].hashboard) { middle ++; pos = G[Counter].hashboard; } /*** Position found in book! ***/ idx=0; if( fseek(f,middle*6+4,SEEK_SET)!=0 ) return -1; while( middle=1 && idx>=1 && Counter>8 ) { char p[256]; int i; postr(p); puts("found in both sbook and pbook"); printboard(NULL); puts(p); printf(" 0 0 0 0 book2 "); for( i=0; i!=idx2; i++ ) if( i==0 || moves2[i-1]!=moves2[i] ) { printm( m[moves2[i]], NULL ); } puts(""); } #endif foundtxt=1; } if( idx > 0 ) { int ii, sumvalues=0, rn; for( ii=0; ii!=idx; ii++ ) { sumvalues += values[ii]; } rn = rand()%sumvalues; sumvalues = 0; for( ii=0; ii!=idx; ii++ ) { sumvalues += values[ii]; if( sumvalues >= rn ) break; } if( Flag.post ) { int i; char s[128]; if( Flag.xboard ) sprintf(s," 0 0 0 0 ("); // sprintf(s," 0 0 0 0 book"); else sprintf(s,"Book moves "); for( i=0; i!=idx; i++ ) { printm( m[moves[i]], s+strlen(s) ); } // hacked by S.A. to show bookX at end of line if( foundtxt ) sprintf(s+strlen(s),", book1)"); else sprintf(s+strlen(s),", book2)"); sprintf(s+strlen(s),"\n"); printf("%s",s); if( Flag.log!=NULL && Flag.ponder<2 ) { char sm[64]; if(Flag.xboard) fprintf(Flag.log,"%s",s+26); else fprintf(Flag.log,"%s",s); fprintf(Flag.log," selected move "); printm( m[moves[ii]], sm ); fprintf(Flag.log,"%s\n",sm); } } return ( moves[ii] ); } return( -1 ); } /* * Print all book moves (command bk) */ FILE * Eco = NULL; void bk( tmove *m, int n ) { int moves[80], values[80], idx; int pass; int sumvalues=0; #define SHOWECO #ifdef SHOWECO static int att=1; static int seco=0; if( att != 0 && Eco!=NULL ) { typedef struct teco { unsigned hashboard; unsigned point; } teco; static struct teco * peco = NULL; if( att==1 && Counter==0 && G[Counter].hashboard==0x39512910 /*init*/) { int c; tmove * move; peco = malloc(2048*sizeof(teco)); if( peco == NULL ) { puts(" telluser cannot alloc memory for ECO"); att=0; goto abort; } printf("telluser creating ECO index, please wait\n"); while( (c=fgetc(Eco))!='[' ) if( c==EOF ) goto doneinit; for(;;) { tmove m[128]; char ms[32]; int msi; int n; (peco+seco)->point=ftell(Eco)-1; while( (c=getc(Eco))!=']' ) if( c==EOF ) goto doneinit; if( c==EOF ) goto doneinit; setfen(initialpos); for(;;) { msi=0; while( (c=getc(Eco))==' ' || c=='\n' ) {} ungetc(c,Eco); while( (c=getc(Eco))!=' ' && c!='\n' && msi<=30 ) { ms[msi]=c; msi++; if( c==EOF || c=='[' ) { ungetc(c,Eco); goto nextgame; } } ms[msi]='\0'; /* printf("%s ",ms); */ generate_legal_moves( m, &n, checktest(Color) ); move=sandex(ms,m,n); if( move==NULL ) goto nextgame; do_move(move); if( c==EOF ) goto doneinit; } nextgame:; peco[seco].hashboard=G[Counter].hashboard; seco++; while( (c=fgetc(Eco))!='[' ) if( c==EOF ) goto doneinit; } doneinit:; printf(" parsed %i ECO records\n",seco); att=2; setfen(initialpos); } if( Counter>0 && att>1 ) { int counter=Counter; int text=-1; while( Counter > 0 ) { int i; for(i=0;i!=seco;i++) if(peco[i].hashboard==G[Counter].hashboard) { text=peco[i].point; goto foundeco; } undo_move( & G[Counter-1].m ); } foundeco:; while( counter > Counter ) do_move( & G[Counter].m ); if( text==-1 ) printf(" no eco found\n"); else { char t[128], * c; fseek(Eco,text,SEEK_SET); fgets(t,126,Eco); t[127]='\0'; c=strchr(t,'['); if(c!=NULL) *c = ' '; c=strrchr(t,']'); if(c!=NULL) *c = '\0'; puts(t); } } abort:; } #endif for( pass=0; pass!=2; pass++ ) { if( pass==0 ) { int i; idx = bookmoves(moves,values,m,n); if( idx != -1 ) for(i=0;i!=idx;i++) sumvalues += values[i]; printf(" primary book moves\n"); } else { idx = sbookmoves(moves,values,m,n); printf(" secondary book moves\n"); } if( idx > 0 ) { int i; for( i=0; i!=idx; i++ ) if( i==0 || moves[i-1]!=moves[i] ) { printf(" "); printm( m[moves[i]], NULL ); if(pass==0) printf("%3d%%\n",values[i]*100/sumvalues); else printf("\n"); } } else printf(" no move found\n"); } if( Flag.xboard>1 ) puts(""); { char c[128]; postr(c); printf("%s\n",c); } } Phalanx-XXV/COPYING0000644000175000010010000004431112317742054012757 0ustar dusanNoneGNU 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. 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. one line to give the program's name and an idea of what it does. Copyright (C) 19yy name of author 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) 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. signature of Ty Coon, 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. Phalanx-XXV/data.c0000644000175000010010000000627312446021030012771 0ustar dusanNone#include "phalanx.h" tflag Flag; tsquare B[120]; /* The chessboard */ tlist L[120]; /* List of pieces */ /*** L[1].next ... white king position; L[2].next ... black king position */ tmove PV[MAXPLY][MAXPLY]; /* Principal var. */ tmove Pondermove; tgamenode G[MAXCOUNTER]; int Counter; int Color; int LastIter, Depth, Ply, FollowPV, Totmat, Abort, NoAbort; int DrawScore = 0; long AllDepth = 0; int64 AllNPS = 0; int64 Nodes; /* params that cannot be pushed via SIGALM handler */ volatile int A_n, A_i, A_d; volatile tmove * A_m; int N_moves[8] = { -21, -19, -12, -8, 21, 19, 12, 8 }; int RB_dirs[8] = { 1, -1, 10, -10, 11, -11, 9, -9 }; int Values[7] = { 0, P_VALUE, N_VALUE, B_VALUE, R_VALUE, Q_VALUE, 0 }; signed char Th_[80] = { 0, 91, 92, 93, 94, 95, 96, 97, 98, 0, 0, 81, 82, 83, 84, 85, 86, 87, 88, 0, 0, 71, 72, 73, 74, 75, 76, 77, 78, 0, 0, 61, 62, 63, 64, 65, 66, 67, 68, 0, 0, 51, 52, 53, 54, 55, 56, 57, 58, 0, 0, 41, 42, 43, 44, 45, 46, 47, 48, 0, 0, 31, 32, 33, 34, 35, 36, 37, 38, 0, 0, 21, 22, 23, 24, 25, 26, 27, 28, 0 }; signed char *Th = Th_-20; signed char Tv_[80] = { 0, 28, 27, 26, 25, 24, 23, 22, 21, 0, 0, 38, 37, 36, 35, 34, 33, 32, 31, 0, 0, 48, 47, 46, 45, 44, 43, 42, 41, 0, 0, 58, 57, 56, 55, 54, 53, 52, 51, 0, 0, 68, 67, 66, 65, 64, 63, 62, 61, 0, 0, 78, 77, 76, 75, 74, 73, 72, 71, 0, 0, 88, 87, 86, 85, 84, 83, 82, 81, 0, 0, 98, 97, 96, 95, 94, 93, 92, 91, 0 }; signed char *Tv = Tv_-20; int HP[100] = /* hash codes for pieces */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* PAWN */ 0, 3, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* KNIGHT */ 0, 5, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* BISHOP */ 0, 7, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* ROOK */ 0, 9, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* QUEEN */ 0, 11, 10, 0 /* KING */ }; int HS_[80] = /* hash codes for squares */ { 0, 0, 1, 2, 3, 4, 5, 6, 7, 0, 0, 8, 9, 10, 11, 12, 13, 14, 15, 0, 0, 16, 17, 18, 19, 20, 21, 22, 23, 0, 0, 24, 25, 26, 27, 28, 29, 30, 31, 0, 0, 32, 33, 34, 35, 36, 37, 38, 39, 0, 0, 40, 41, 42, 43, 44, 45, 46, 47, 0, 0, 48, 49, 50, 51, 52, 53, 54, 55, 0, 0, 56, 57, 58, 59, 60, 61, 62, 63, 0 }; int * HS=HS_-20; tdist dist[120*120]; static inline int taxi_dist( int a, int b ) { return abs( a%10 - b%10 ) + abs( a/10 - b/10 ); } static inline int diag_dist( int a, int b ) { int fdi = abs( a%10 - b%10 ); int rdi = abs( a/10 - b/10 ); return abs(rdi-fdi) + max(rdi,fdi); } static inline int max_dist( int a, int b ) { int fdi = abs( a%10 - b%10 ); int rdi = abs( a/10 - b/10 ); return max(rdi,fdi); } static inline int min_dist( int a, int b ) { int fdi = abs( a%10 - b%10 ); int rdi = abs( a/10 - b/10 ); return min(rdi,fdi); } void initdist(void) { int i,j; for( i=A1; i!=H9; i++ ) for( j=A1; j!=H9; j++ ) { dist[120*i+j].taxi = taxi_dist(i,j); dist[120*i+j].diag = diag_dist(i,j); dist[120*i+j].max = max_dist(i,j); dist[120*i+j].min = min_dist(i,j); } } Phalanx-XXV/easy.c0000644000175000010010000000641012515517365013034 0ustar dusanNone/**************************** * easy levels ******************/ #include "phalanx.h" void blunder( tmove *m, int *n ) { int i; int initp = Flag.easy * 4 + 150; /* quick look (small Depth) makes blunders */ initp -= Depth/5; /* full board means more blunders */ initp += (G[Counter].mtrl+G[Counter].xmtrl) / 200; if(Counter>2) for( i=(*n)-1; i>=1 && (*n)>4; i-- ) { /* compute the probability this move is not seen */ int p = initp; /* missing PV moves is unlikely */ if( m[i].from==PV[0][Ply].from && m[i].to==PV[0][Ply].to ) p -= 200; if( m[i].from==PV[Ply-1][Ply].from && m[i].to==PV[Ply-1][Ply].to ) p -= 200; /* target square far from the center is more difficult to spot */ p += 2*dist[120*E4+m[i].to].taxi + dist[120*E4+m[i].to].max + + 2*dist[120*D5+m[i].to].taxi + dist[120*D5+m[i].to].max /* so is target square far from previous opponents move */ + 2*dist[120*G[Counter-1].m.to+m[i].to].taxi; if( m[i].in2 ) /* captures - we tend to see this */ { /* the more valuable the captured piece, * the more likely we see the move. */ p -= 20 + Values[ m[i].in2 >> 4 ] / 20; /* capture of last moved piece is spotted * + extra bonus for recapture */ if( m[i].to == G[Counter-1].m.to ) { p -= 20 + Values[ m[i].in2 >> 4 ] / 30; if( G[Counter-1].m.in2 ) p -= 40; /* recapture */ } /* very short captures */ switch( dist[120*m[i].from+m[i].to].max ) { case 0: case 1: p -= 250; break; case 2: p -= 150; break; case 3: p -= 50; break; } } else /* noncaptures - prune or reduce with power table info */ { int pp=0; unsigned short pf = P[m[i].from], pt = P[m[i].to]; unsigned short xpm, xbnm, xrm, xqm; /* enemy power masks */ int mpv = Values[m[i].in1 >> 4]; /* moving piece value */ if( Color == WHITE ) { xpm=BPM; xbnm=(BNM|BBM); xrm=BRM; xqm=BQM; } else { xpm=WPM; xbnm=(WNM|WBM); xrm=WRM; xqm=WQM; } /* leaving an attacked square - reduce probability of * the move being skipped */ if( pf&xpm ) pp -= (5 + mpv - P_VALUE)/10; if( pf&xbnm && mpv >= N_VALUE ) pp -= (5 + mpv - N_VALUE)/10; if( pf&xrm && mpv >= R_VALUE ) pp -= (5 + mpv - R_VALUE)/10; if( pf&(xqm|xrm|xbnm|xpm) ) pp -= mpv/100; /* going to an attacked square - raise probability * the move is skipped */ if( pt&xpm ) pp += (10 + mpv - P_VALUE)/10; if( pt&xbnm && mpv >= N_VALUE ) pp += (10 + mpv - N_VALUE)/10; if( pt&xrm && mpv >= R_VALUE ) pp += (10 + mpv - R_VALUE)/10; if( pt&(xqm|xrm|xbnm|xpm) ) pp += mpv/50; p += pp; /* careless reductions to achieve depth at these low nps */ if( pp>=0 ) m[i].dch += 50 + min( 2*pp, 90 ); } /* We focus on the piece that moved 2 plies ago and see the * moves of the same piece */ if( m[i].from == G[Counter-2].m.to ) p -= 55; /* underpromotions? too precise! */ if( m[i].in1 != m[i].in2a && piece(m[i].in2a) != QUEEN ) p += 15; else p -= 5; /* dont see long moves, especially diagonal ones */ p += dist[120*m[i].from+m[i].to].taxi * 3; /* dont see some knight moves */ if( piece(m[i].in1) == KNIGHT ) p += 10; /* going backward? (white)Bf6xc3 is much more difficult * to see than (white)Bc3xf6 ***/ if( Color==WHITE ) p += 4 * ( m[i].to/10 - m[i].from/10 ); else p += 4 * ( m[i].from/10 - m[i].to/10 ); if( rand()%1000 < p ) { m[i] = m[(*n)-1]; (*n)--; } } } Phalanx-XXV/eco.phalanx0000644000175000010010000051625012317742054014055 0ustar dusanNone [ECO C99 Ruy Lopez: closed, Chigorin, 12...c5d4] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Be7 Re1 b5 Bb3 o-o c3 d6 h3 Na5 Bc2 c5 d4 Qc7 N1d2 cd cd [ECO C98 Ruy Lopez: closed, Chigorin, Rauzer attack] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Be7 Re1 b5 Bb3 o-o c3 d6 h3 Na5 Bc2 c5 d4 Qc7 N1d2 Nc6 dc [ECO C98 Ruy Lopez: closed, Chigorin, 12...Nc6] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Be7 Re1 b5 Bb3 o-o c3 d6 h3 Na5 Bc2 c5 d4 Qc7 N1d2 Nc6 [ECO C97 Ruy Lopez: closed, Chigorin, Yugoslav system] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Be7 Re1 b5 Bb3 o-o c3 d6 h3 Na5 Bc2 c5 d4 Qc7 N1d2 Bd7 Nf1 f8e8 Ne3 g6 [ECO C97 Ruy Lopez: closed, Chigorin defence] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Be7 Re1 b5 Bb3 o-o c3 d6 h3 Na5 Bc2 c5 d4 Qc7 [ECO C96 Ruy Lopez: closed, Keres defence] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Be7 Re1 b5 Bb3 o-o c3 d6 h3 Na5 Bc2 c5 d4 Nd7 [ECO C96 Ruy Lopez: closed, Borisenko defence] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Be7 Re1 b5 Bb3 o-o c3 d6 h3 Na5 Bc2 c5 d4 Nc6 [ECO C96 Ruy Lopez: closed ] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Be7 Re1 b5 Bb3 o-o c3 d6 h3 Na5 Bc2 c5 [ECO C96 Ruy Lopez: closed, Rossolimo defence] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Be7 Re1 b5 Bb3 o-o c3 d6 h3 Na5 Bc2 c6 d4 Qc7 [ECO C96 Ruy Lopez: closed ] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Be7 Re1 b5 Bb3 o-o c3 d6 h3 Na5 Bc2 [ECO C95 Ruy Lopez: closed, Breyer, Simagin variation] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Be7 Re1 b5 Bb3 o-o c3 d6 h3 Nb8 d4 N8d7 Nh4 [ECO C95 Ruy Lopez: closed, Breyer, Gligori\'c variation] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Be7 Re1 b5 Bb3 o-o c3 d6 h3 Nb8 d4 N8d7 N1d2 Bb7 Bc2 c5 [ECO C95 Ruy Lopez: closed, Breyer, Borisenko variation] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Be7 Re1 b5 Bb3 o-o c3 d6 h3 Nb8 d4 N8d7 [ECO C95 Ruy Lopez: closed, Breyer, 10.d4] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Be7 Re1 b5 Bb3 o-o c3 d6 h3 Nb8 d4 [ECO C94 Ruy Lopez: closed, Breyer defence] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Be7 Re1 b5 Bb3 o-o c3 d6 h3 Nb8 [ECO C93 Ruy Lopez: closed, Smyslov defence] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Be7 Re1 b5 Bb3 o-o c3 d6 h3 h6 [ECO C92 Ruy Lopez: closed, Flohr-Zaitsev system ] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Be7 Re1 b5 Bb3 o-o c3 d6 h3 Bb7 [ECO C92 Ruy Lopez: closed, Ragozin-Petrosian variation] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Be7 Re1 b5 Bb3 o-o c3 d6 h3 Nd7 [ECO C92 Ruy Lopez: closed, Kholmov variation] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Be7 Re1 b5 Bb3 o-o c3 d6 h3 Be6 [ECO C92 Ruy Lopez: closed, Keres variation] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Be7 Re1 b5 Bb3 o-o c3 d6 h3 a5 [ECO C92 Ruy Lopez: closed, 9.h3] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Be7 Re1 b5 Bb3 o-o c3 d6 h3 [ECO C91 Ruy Lopez: closed, Bogolyubov variation] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Be7 Re1 b5 Bb3 o-o c3 d6 d4 Bg4 [ECO C91 Ruy Lopez: closed, 9.d4] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Be7 Re1 b5 Bb3 o-o c3 d6 d4 [ECO C90 Ruy Lopez: closed, Suetin variation] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Be7 Re1 b5 Bb3 o-o c3 d6 a3 [ECO C90 Ruy Lopez: closed, Lutikov variation] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Be7 Re1 b5 Bb3 o-o c3 d6 Bc2 [ECO C90 Ruy Lopez: closed, Pilnik variation] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Be7 Re1 b5 Bb3 o-o c3 d6 d3 [ECO C90 Ruy Lopez: closed ] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Be7 Re1 b5 Bb3 o-o c3 d6 [ECO C89 Ruy Lopez: Marshall, Herman Steiner variation] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Be7 Re1 b5 Bb3 o-o c3 d5 ed e4 [ECO C89 Ruy Lopez: Marshall, main line, Spassky variation] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Be7 Re1 b5 Bb3 o-o c3 d5 ed Nd5 Ne5 Ne5 Re5 c6 d4 Bd6 Re1 Qh4 g3 Qh3 Be3 Bg4 Qd3 a8e8 Nd2 Re6 a4 Qh5 [ECO C89 Ruy Lopez: Marshall, main line, 14...Qh3] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Be7 Re1 b5 Bb3 o-o c3 d5 ed Nd5 Ne5 Ne5 Re5 c6 d4 Bd6 Re1 Qh4 g3 Qh3 [ECO C89 Ruy Lopez: Marshall, main line, 12.d2d4] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Be7 Re1 b5 Bb3 o-o c3 d5 ed Nd5 Ne5 Ne5 Re5 c6 d4 [ECO C89 Ruy Lopez: Marshall, Kevitz variation] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Be7 Re1 b5 Bb3 o-o c3 d5 ed Nd5 Ne5 Ne5 Re5 c6 Bd5 cd d4 Bd6 Re3 [ECO C89 Ruy Lopez: Marshall counter-attack, 11...c6] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Be7 Re1 b5 Bb3 o-o c3 d5 ed Nd5 Ne5 Ne5 Re5 c6 [ECO C89 Ruy Lopez: Marshall counter-attack] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Be7 Re1 b5 Bb3 o-o c3 d5 [ECO C?? Ruy Lopez: closed, 8.c3] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Be7 Re1 b5 Bb3 o-o c3 [ECO C88 Ruy Lopez: closed, anti-Marshall 8.a4] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Be7 Re1 b5 Bb3 o-o a4 [ECO C88 Ruy Lopez: closed, 7...O-O] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Be7 Re1 b5 Bb3 o-o [ECO C88 Ruy Lopez: Trajkovi\'c counter-attack] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Be7 Re1 b5 Bb3 Bb7 [ECO C88 Ruy Lopez: Noah's ark trap] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Be7 Re1 b5 Bb3 d6 d4 Nd4 Nd4 ed Qd4 c5 [ECO C88 Ruy Lopez: closed, 7...d6, 8.d4] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Be7 Re1 b5 Bb3 d6 d4 [ECO C88 Ruy Lopez: closed, Balla variation] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Be7 Re1 b5 Bb3 d6 c3 Na5 Bc2 c5 d4 Qc7 a4 [ECO C88 Ruy Lopez: closed, Leonhardt variation] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Be7 Re1 b5 Bb3 d6 c3 Na5 Bc2 c5 d4 Qc7 h3 Nc6 d5 Nb8 N1d2 g5 [ECO C88 Ruy Lopez: closed] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Be7 Re1 b5 Bb3 [ECO C79 Ruy Lopez: Kecskem\'et variation] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Be7 Re1 d6 c3 o-o d4 Bd7 N1d2 Be8 [ECO C87 Ruy Lopez: closed, Averbach variation] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Be7 Re1 d6 [ECO C86 Ruy Lopez: Worrall attack, solid line] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Be7 Qe2 b5 Bb3 d6 [ECO C86 Ruy Lopez: Worrall attack, sharp line] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Be7 Qe2 b5 Bb3 o-o [ECO C86 Ruy Lopez: Worrall attack] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Be7 Qe2 [ECO C85 Ruy Lopez: Exchange variation doubly deferred ] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Be7 Bc6 [ECO C84 Ruy Lopez: closed, Basque gambit ] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Be7 d4 ed e5 Ne4 c3 [ECO C84 Ruy Lopez: closed, centre attack] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Be7 d4 [ECO C84 Ruy Lopez: closed defence] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Be7 [ECO C83 Ruy Lopez: open, Breslau variation] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Ne4 d4 b5 Bb3 d5 de Be6 c3 Be7 Re1 o-o Nd4 Ne5 [ECO C83 Ruy Lopez: open, Tarrasch trap] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Ne4 d4 b5 Bb3 d5 de Be6 c3 Be7 Re1 o-o Nd4 Qd7 Ne6 fe Re4 [ECO C83 Ruy Lopez: open, 9...Be7, 10.Re1] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Ne4 d4 b5 Bb3 d5 de Be6 c3 Be7 Re1 [ECO C83 Ruy Lopez: open, Malkin variation] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Ne4 d4 b5 Bb3 d5 de Be6 c3 Be7 N1d2 o-o Qe2 [ECO C83 Ruy Lopez: open, classical defence] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Ne4 d4 b5 Bb3 d5 de Be6 c3 Be7 [ECO C82 Ruy Lopez: open, Motzko attack, Nenarokov variation] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Ne4 d4 b5 Bb3 d5 de Be6 c3 Bc5 Qd3 Ne7 [ECO C82 Ruy Lopez: open, Motzko attack] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Ne4 d4 b5 Bb3 d5 de Be6 c3 Bc5 Qd3 [ECO C82 Ruy Lopez: open, Dilworth variation] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Ne4 d4 b5 Bb3 d5 de Be6 c3 Bc5 N1d2 o-o Bc2 Nf2 [ECO C82 Ruy Lopez: open, St. Petersburg variation] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Ne4 d4 b5 Bb3 d5 de Be6 c3 Bc5 N1d2 [ECO C82 Ruy Lopez: open, Italian variation] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Ne4 d4 b5 Bb3 d5 de Be6 c3 Bc5 [ECO C82 Ruy Lopez: open, Berlin variation] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Ne4 d4 b5 Bb3 d5 de Be6 c3 Nc5 [ECO C82 Ruy Lopez: open, 9.c3] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Ne4 d4 b5 Bb3 d5 de Be6 c3 [ECO C81 Ruy Lopez: open, Howell attack, Adam variation] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Ne4 d4 b5 Bb3 d5 de Be6 Qe2 Be7 c4 [ECO C81 Ruy Lopez: open, Howell attack, Ekstr\"om variation] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Ne4 d4 b5 Bb3 d5 de Be6 Qe2 Be7 Rd1 o-o c4 bc Bc4 Qd7 [ECO C81 Ruy Lopez: open, Howell attack] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Ne4 d4 b5 Bb3 d5 de Be6 Qe2 [ECO C80 Ruy Lopez: open, Bernstein variation, Karpov gambit] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Ne4 d4 b5 Bb3 d5 de Be6 N1d2 Nc5 c3 d4 Ng5 [ECO C80 Ruy Lopez: open, Bernstein variation] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Ne4 d4 b5 Bb3 d5 de Be6 N1d2 [ECO C80 Ruy Lopez: open, 8...Be6] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Ne4 d4 b5 Bb3 d5 de Be6 [ECO C80 Ruy Lopez: open, Zukertort variation] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Ne4 d4 b5 Bb3 d5 de Ne7 [ECO C80 Ruy Lopez: open, 8.de] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Ne4 d4 b5 Bb3 d5 de [ECO C80 Ruy Lopez: open, Harksen gambit] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Ne4 d4 b5 Bb3 d5 c4 [ECO C80 Ruy Lopez: open, Berger variation] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Ne4 d4 b5 Bb3 d5 a4 Nd4 Nd4 ed Nc3 [ECO C80 Ruy Lopez: open, Schlechter defence] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Ne4 d4 b5 Bb3 d5 a4 Nd4 [ECO C80 Ruy Lopez: open, 7.Bb3] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Ne4 d4 b5 Bb3 [ECO C80 Ruy Lopez: open, Richter variation] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Ne4 d4 b5 d5 [ECO C80 Ruy Lopez: open, Friess attack] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Ne4 d4 b5 Ne5 [ECO C80 Ruy Lopez: open, 6.d4 b5] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Ne4 d4 b5 [ECO C80 Ruy Lopez: open, Riga variation] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Ne4 d4 ed [ECO C80 Ruy Lopez: open, 6.d4] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Ne4 d4 [ECO C80 Ruy Lopez: open, Knorre variation] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Ne4 Nc3 [ECO C80 Ruy Lopez: open, Tartakower variation] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Ne4 Qe2 [ECO C80 Ruy Lopez: open defence] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Ne4 [ECO C79 Ruy Lopez: Steinitz defence deferred, Boleslavsky variation] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o d6 Bc6 bc d4 Ne4 Re1 f5 de d5 Nc3 [ECO C79 Ruy Lopez: Steinitz defence deferred, Rubinstein variation] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o d6 Bc6 bc d4 Ne4 [ECO C79 Ruy Lopez: Steinitz defence deferred, Lipnitsky variation] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o d6 Bc6 bc d4 Bg4 [ECO C79 Ruy Lopez: Steinitz defence deferred ] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o d6 [ECO C78 Ruy Lopez: M\"oller defence] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Bc5 [ECO C78 Ruy Lopez: Archangelsk variation] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o b5 Bb3 Bb7 [ECO C78 Ruy Lopez: Rabinovich variation] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o b5 Bb3 d6 Ng5 d5 ed Nd4 Re1 Bc5 Re5 Kf8 [ECO C78 Ruy Lopez: ...b5 & ...d6] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o b5 Bb3 d6 [ECO C78 Ruy Lopez: Wing attack] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o b5 Bb3 Be7 a4 [ECO C78 Ruy Lopez: 5.O-O] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o [ECO C77 Ruy Lopez: Morphy defence, Duras variation] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 d3 d6 c4 [ECO C77 Ruy Lopez: Anderssen variation] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 d3 [ECO C77 Ruy Lopez: Wormald attack, Gr\"unfeld variation] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 Qe2 b5 Bb3 Be7 d4 d6 c3 Bg4 [ECO C77 Ruy Lopez: Wormald attack] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 Qe2 [ECO C77 Ruy Lopez: Treybal variation ] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 Bc6 [ECO C77 Ruy Lopez: four knights variation] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 Nc3 [ECO C77 Ruy Lopez: Morphy defence] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 [ECO C76 Ruy Lopez: modern Steinitz defence, fianchetto variation] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 d6 c3 Bd7 d4 g6 [ECO C75 Ruy Lopez: modern Steinitz defence, Rubinstein variation] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 d6 c3 Bd7 d4 N8e7 [ECO C75 Ruy Lopez: modern Steinitz defence] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 d6 c3 Bd7 [ECO C74 Ruy Lopez: Siesta, Kopayev variation] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 d6 c3 f5 ef Bf5 o-o [ECO C74 Ruy Lopez: modern Steinitz defence, siesta variation] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 d6 c3 f5 [ECO C74 Ruy Lopez: modern Steinitz defence] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 d6 c3 [ECO C73 Ruy Lopez: modern Steinitz defence, Alapin variation] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 d6 Bc6 bc d4 f6 [ECO C73 Ruy Lopez: modern Steinitz defence, Richter variation] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 d6 Bc6 bc d4 [ECO C?? Ruy Lopez: modern Steinitz defence, exchange variation] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 d6 Bc6 bc [ECO C72 Ruy Lopez: modern Steinitz defence, 5.O-O] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 d6 o-o [ECO C71 Ruy Lopez: modern Steinitz defence, Duras variation] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 d6 c4 [ECO C71 Ruy Lopez: modern Steinitz defence, Three knights variation] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 d6 Nc3 [ECO C71 Ruy Lopez: Noah's ark trap] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 d6 d4 b5 Bb3 Nd4 Nd4 ed Qd4 c5 [ECO C71 Ruy Lopez: modern Steinitz defence] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 d6 [ECO C70 Ruy Lopez: Schliemann defence deferred] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 f5 [ECO C70 Ruy Lopez: Taimanov variation] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 b5 Bb3 Na5 [ECO C70 Ruy Lopez: Graz variation] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 b5 Bb3 Bc5 [ECO C70 Ruy Lopez: Caro variation] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 b5 [ECO C70 Ruy Lopez: Classical defence deferred] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Bc5 [ECO C70 Ruy Lopez: Alapin's defence deferred] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Bb4 [ECO C70 Ruy Lopez: Bird's defence deferred] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nd4 [ECO C70 Ruy Lopez: Cozio defence deferred] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 N8e7 [ECO C70 Ruy Lopez: fianchetto defence deferred] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 g6 [ECO C70 Ruy Lopez] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 [ECO C69 Ruy Lopez: exchange, Bronstein variation] e4 e5 Nf3 Nc6 Bb5 a6 Bc6 dc o-o Qd6 [ECO C69 Ruy Lopez: exchange, Gligori\'c variation] e4 e5 Nf3 Nc6 Bb5 a6 Bc6 dc o-o f6 [ECO C69 Ruy Lopez: exchange variation, Alapin gambit] e4 e5 Nf3 Nc6 Bb5 a6 Bc6 dc o-o Bg4 h3 h5 [ECO C69 Ruy Lopez: exchange variation, 5.O-O] e4 e5 Nf3 Nc6 Bb5 a6 Bc6 dc o-o [ECO C68 Ruy Lopez: exchange, Romanovsky variation] e4 e5 Nf3 Nc6 Bb5 a6 Bc6 dc Nc3 f6 d3 [ECO C68 Ruy Lopez: exchange, Keres variation] e4 e5 Nf3 Nc6 Bb5 a6 Bc6 dc Nc3 [ECO C68 Ruy Lopez: exchange, Alekhine variation] e4 e5 Nf3 Nc6 Bb5 a6 Bc6 dc d4 ed Qd4 Qd4 Nd4 Bd7 [ECO C68 Ruy Lopez: exchange variation] e4 e5 Nf3 Nc6 Bb5 a6 Bc6 [ECO C67 Ruy Lopez: Berlin defence, Rosenthal variation] e4 e5 Nf3 Nc6 Bb5 Nf6 o-o Ne4 d4 a6 [ECO C67 Ruy Lopez: Berlin defence, Minckwitz variation] e4 e5 Nf3 Nc6 Bb5 Nf6 o-o Ne4 d4 Be7 de [ECO C67 Ruy Lopez: Berlin defence, Trifunovi\'c variation] e4 e5 Nf3 Nc6 Bb5 Nf6 o-o Ne4 d4 Be7 Qe2 d5 [ECO C67 Ruy Lopez: Berlin defence, Cordel variation] e4 e5 Nf3 Nc6 Bb5 Nf6 o-o Ne4 d4 Be7 Qe2 Nd6 Bc6 bc de Nf5 [ECO C67 Ruy Lopez: Berlin defence, Winawer attack] e4 e5 Nf3 Nc6 Bb5 Nf6 o-o Ne4 d4 Be7 Qe2 Nd6 Bc6 bc de Nb7 Nd4 [ECO C67 Ruy Lopez: Berlin defence, Pillsbury variation] e4 e5 Nf3 Nc6 Bb5 Nf6 o-o Ne4 d4 Be7 Qe2 Nd6 Bc6 bc de Nb7 b3 [ECO C67 Ruy Lopez: Berlin defence, Zukertort variation] e4 e5 Nf3 Nc6 Bb5 Nf6 o-o Ne4 d4 Be7 Qe2 Nd6 Bc6 bc de Nb7 c4 [ECO C67 Ruy Lopez: Berlin defence, Rio de Janeiro variation] e4 e5 Nf3 Nc6 Bb5 Nf6 o-o Ne4 d4 Be7 Qe2 Nd6 Bc6 bc de Nb7 Nc3 o-o Re1 Nc5 Nd4 Ne6 Be3 Nd4 Bd4 c5 [ECO C67 Ruy Lopez: open Berlin defence, 5...Be7] e4 e5 Nf3 Nc6 Bb5 Nf6 o-o Ne4 d4 Be7 [ECO C67 Ruy Lopez: open Berlin defence, Showalter variation] e4 e5 Nf3 Nc6 Bb5 Nf6 o-o Ne4 d4 Nd6 Ba4 [ECO C67 Ruy Lopez: open Berlin defence, l'Hermet variation] e4 e5 Nf3 Nc6 Bb5 Nf6 o-o Ne4 d4 Nd6 de [ECO C67 Ruy Lopez: Berlin defence, open variation] e4 e5 Nf3 Nc6 Bb5 Nf6 o-o Ne4 [ECO C66 Ruy Lopez: closed Berlin defence, Chigorin variation] e4 e5 Nf3 Nc6 Bb5 Nf6 o-o d6 d4 Nd7 [ECO C66 Ruy Lopez: closed Berlin defence, Wolf variation] e4 e5 Nf3 Nc6 Bb5 Nf6 o-o d6 d4 Bd7 Nc3 ed [ECO C66 Ruy Lopez: closed Berlin defence, Showalter variation] e4 e5 Nf3 Nc6 Bb5 Nf6 o-o d6 d4 Bd7 Nc3 Be7 Bc6 [ECO C66 Ruy Lopez: closed Berlin defence, Bernstein variation] e4 e5 Nf3 Nc6 Bb5 Nf6 o-o d6 d4 Bd7 Nc3 Be7 Bg5 [ECO C66 Ruy Lopez: Berlin defence, Tarrasch trap] e4 e5 Nf3 Nc6 Bb5 Nf6 o-o d6 d4 Bd7 Nc3 Be7 Re1 o-o [ECO C66 Ruy Lopez: Berlin defence, hedgehog variation] e4 e5 Nf3 Nc6 Bb5 Nf6 o-o d6 d4 Bd7 Nc3 Be7 [ECO C66 Ruy Lopez: Berlin defence, 4.O-O, d6] e4 e5 Nf3 Nc6 Bb5 Nf6 o-o d6 [ECO C65 Ruy Lopez: Berlin defence, Beverwijk variation] e4 e5 Nf3 Nc6 Bb5 Nf6 o-o Bc5 [ECO C65 Ruy Lopez: Berlin defence, 4.O-O] e4 e5 Nf3 Nc6 Bb5 Nf6 o-o [ECO C65 Ruy Lopez: Berlin defence, Kaufmann variation] e4 e5 Nf3 Nc6 Bb5 Nf6 d3 Bc5 Be3 [ECO C65 Ruy Lopez: Berlin defence, Duras variation] e4 e5 Nf3 Nc6 Bb5 Nf6 d3 d6 c4 [ECO C65 Ruy Lopez: Berlin defence, Anderssen variation] e4 e5 Nf3 Nc6 Bb5 Nf6 d3 d6 Bc6 [ECO C65 Ruy Lopez: Berlin defence, Mortimer trap] e4 e5 Nf3 Nc6 Bb5 Nf6 d3 Ne7 Ne5 c6 [ECO C65 Ruy Lopez: Berlin defence, Mortimer variation] e4 e5 Nf3 Nc6 Bb5 Nf6 d3 Ne7 [ECO C65 Ruy Lopez: Berlin defence, Nyholm attack] e4 e5 Nf3 Nc6 Bb5 Nf6 d4 ed o-o [ECO C65 Ruy Lopez: Berlin defence] e4 e5 Nf3 Nc6 Bb5 Nf6 [ECO C64 Ruy Lopez: Cordel gambit] e4 e5 Nf3 Nc6 Bb5 Bc5 c3 f5 [ECO C64 Ruy Lopez: classical defence, Boden variation] e4 e5 Nf3 Nc6 Bb5 Bc5 c3 Qe7 [ECO C64 Ruy Lopez: classical defence, Charousek variation] e4 e5 Nf3 Nc6 Bb5 Bc5 c3 Bb6 [ECO C64 Ruy Lopez: classical defence, Benelux variation ] e4 e5 Nf3 Nc6 Bb5 Bc5 c3 Nf6 o-o o-o d4 Bb6 [ECO C64 Ruy Lopez: classical defence, 4.c3] e4 e5 Nf3 Nc6 Bb5 Bc5 c3 [ECO C64 Ruy Lopez: classical defence, Zaitsev variation] e4 e5 Nf3 Nc6 Bb5 Bc5 o-o Nd4 b4 [ECO C64 Ruy Lopez: classical defence] e4 e5 Nf3 Nc6 Bb5 Bc5 [ECO C63 Ruy Lopez: Schliemann defence, Berger variation] e4 e5 Nf3 Nc6 Bb5 f5 Nc3 [ECO C63 Ruy Lopez: Schliemann defence] e4 e5 Nf3 Nc6 Bb5 f5 [ECO C62 Ruy Lopez: old Steinitz defence, semi-Duras variation] e4 e5 Nf3 Nc6 Bb5 d6 d4 Bd7 c4 [ECO C62 Ruy Lopez: old Steinitz defence, Nimzovich attack] e4 e5 Nf3 Nc6 Bb5 d6 d4 Bd7 Nc3 Nf6 Bc6 [ECO C62 Ruy Lopez: old Steinitz defence] e4 e5 Nf3 Nc6 Bb5 d6 [ECO C61 Ruy Lopez: Bird's defence, Paulsen variation] e4 e5 Nf3 Nc6 Bb5 Nd4 Nd4 ed o-o Ne7 [ECO C61 Ruy Lopez: Bird's defence] e4 e5 Nf3 Nc6 Bb5 Nd4 [ECO C60 Ruy Lopez: Cozio defence, Paulsen variation] e4 e5 Nf3 Nc6 Bb5 N8e7 Nc3 g6 [ECO C60 Ruy Lopez: Cozio defence] e4 e5 Nf3 Nc6 Bb5 N8e7 [ECO C60 Ruy Lopez: fianchetto defence] e4 e5 Nf3 Nc6 Bb5 g6 [ECO C60 Ruy Lopez: Alapin's defence] e4 e5 Nf3 Nc6 Bb5 Bb4 [ECO C60 Ruy Lopez: Brentano defence] e4 e5 Nf3 Nc6 Bb5 g5 [ECO C60 Ruy Lopez: Vinogradov variation] e4 e5 Nf3 Nc6 Bb5 Qe7 [ECO C60 Ruy Lopez: Lucena defence] e4 e5 Nf3 Nc6 Bb5 Be7 [ECO C60 Ruy Lopez: Pollock defence] e4 e5 Nf3 Nc6 Bb5 Na5 [ECO C60 Ruy Lopez: Nuremberg variation] e4 e5 Nf3 Nc6 Bb5 f6 [ECO C60 Ruy Lopez ] e4 e5 Nf3 Nc6 Bb5 [ECO C59 two knights defence: Steinitz variation] e4 e5 Nf3 Nc6 Bc4 Nf6 Ng5 d5 ed Na5 Bb5 c6 dc bc Be2 h6 Nh3 [ECO C59 two knights defence: G\"oring variation] e4 e5 Nf3 Nc6 Bc4 Nf6 Ng5 d5 ed Na5 Bb5 c6 dc bc Be2 h6 Nf3 e4 Ne5 Qc7 [ECO C59 two knights defence: Knorre variation] e4 e5 Nf3 Nc6 Bc4 Nf6 Ng5 d5 ed Na5 Bb5 c6 dc bc Be2 h6 Nf3 e4 Ne5 Bd6 d4 Qc7 Bd2 [ECO C59 Two knights defence] e4 e5 Nf3 Nc6 Bc4 Nf6 Ng5 d5 ed Na5 Bb5 c6 dc bc Be2 h6 [ECO C?? Two knights defence] e4 e5 Nf3 Nc6 Bc4 Nf6 Ng5 d5 ed Na5 Bb5 c6 dc bc Be2 [ECO C58 two knights defence: Blackburne variation] e4 e5 Nf3 Nc6 Bc4 Nf6 Ng5 d5 ed Na5 Bb5 c6 dc bc Qf3 cb [ECO C58 two knights defence: Colman variation] e4 e5 Nf3 Nc6 Bc4 Nf6 Ng5 d5 ed Na5 Bb5 c6 dc bc Qf3 Rb8 [ECO C58 two knights defence: Paoli variation] e4 e5 Nf3 Nc6 Bc4 Nf6 Ng5 d5 ed Na5 Bb5 c6 dc bc Qf3 Qc7 Bd3 [ECO C58 two knights defence: Bogolyubov variation] e4 e5 Nf3 Nc6 Bc4 Nf6 Ng5 d5 ed Na5 Bb5 c6 dc bc Qf3 [ECO C58 Two knights defence] e4 e5 Nf3 Nc6 Bc4 Nf6 Ng5 d5 ed Na5 Bb5 [ECO C58 two knights defence: Mar\'oczy variation] e4 e5 Nf3 Nc6 Bc4 Nf6 Ng5 d5 ed Na5 d3 h6 Nf3 e4 Qe2 Nc4 dc Be7 [ECO C58 two knights defence: Yankovich variation] e4 e5 Nf3 Nc6 Bc4 Nf6 Ng5 d5 ed Na5 d3 h6 Nf3 e4 Qe2 Nc4 dc Bc5 N3d2 [ECO C58 two knights defence: Kieseritsky variation] e4 e5 Nf3 Nc6 Bc4 Nf6 Ng5 d5 ed Na5 d3 [ECO C?? two knights defence] e4 e5 Nf3 Nc6 Bc4 Nf6 Ng5 d5 ed Na5 [ECO C57 two knights defence: Fegatello attack, Polerio defence] e4 e5 Nf3 Nc6 Bc4 Nf6 Ng5 d5 ed Nd5 Nf7 Kf7 Qf3 Ke6 Nc3 Ne7 [ECO C57 two knights defence: Fegatello attack, Leonhardt variation] e4 e5 Nf3 Nc6 Bc4 Nf6 Ng5 d5 ed Nd5 Nf7 Kf7 Qf3 Ke6 Nc3 Nb4 Qe4 c6 a3 Na6 d4 Nc7 [ECO C57 two knights defence: Fegatello attack] e4 e5 Nf3 Nc6 Bc4 Nf6 Ng5 d5 ed Nd5 Nf7 [ECO C57 two knights defence: Pincus variation] e4 e5 Nf3 Nc6 Bc4 Nf6 Ng5 d5 ed Nd5 d4 Bb4 [ECO C57 two knights defence: Lolli attack] e4 e5 Nf3 Nc6 Bc4 Nf6 Ng5 d5 ed Nd5 d4 [ECO C57 two knights defence: Fritz, Gruber variation] e4 e5 Nf3 Nc6 Bc4 Nf6 Ng5 d5 ed Nd4 c3 b5 Bf1 Nd5 Ne4 [ECO C57 two knights defence: Fritz variation] e4 e5 Nf3 Nc6 Bc4 Nf6 Ng5 d5 ed Nd4 [ECO C57 two knights defence: Ulvestad variation] e4 e5 Nf3 Nc6 Bc4 Nf6 Ng5 d5 ed b5 [ECO C57 two knights defence: Wilkes Barre variation] e4 e5 Nf3 Nc6 Bc4 Nf6 Ng5 Bc5 [ECO C57 Two knights defence] e4 e5 Nf3 Nc6 Bc4 Nf6 Ng5 [ECO C56 two knights defence: Canal variation] e4 e5 Nf3 Nc6 Bc4 Nf6 d4 ed o-o Ne4 Re1 d5 Nc3 [ECO C56 two knights defence: Yurdansky attack] e4 e5 Nf3 Nc6 Bc4 Nf6 d4 ed o-o Ne4 Re1 d5 Bd5 Qd5 Nc3 Qa5 Ne4 Be6 Bg5 h6 Bh4 g5 Nf6 Ke7 b4 [ECO C56 Two knights defence] e4 e5 Nf3 Nc6 Bc4 Nf6 d4 ed o-o Ne4 [ECO C55 two knights: Max Lange attack, Krause variation] e4 e5 Nf3 Nc6 Bc4 Nf6 d4 ed o-o Bc5 e5 Ng4 c3 [ECO C55 two knights: Max Lange attack, Steinitz variation] e4 e5 Nf3 Nc6 Bc4 Nf6 d4 ed o-o Bc5 e5 Ng4 [ECO C55 two knights: Max Lange attack, Schlechter variation] e4 e5 Nf3 Nc6 Bc4 Nf6 d4 ed o-o Bc5 e5 d5 ef dc Re1 Be6 fg [ECO C55 two knights: Max Lange attack, Loman defence] e4 e5 Nf3 Nc6 Bc4 Nf6 d4 ed o-o Bc5 e5 d5 ef dc Re1 Be6 Ng5 g6 [ECO C55 two knights: Max Lange attack, Rubinstein variation] e4 e5 Nf3 Nc6 Bc4 Nf6 d4 ed o-o Bc5 e5 d5 ef dc Re1 Be6 Ng5 Qd5 Nc3 Qf5 N3e4 Bf8 [ECO C55 two knights: Max Lange attack, Marshall variation] e4 e5 Nf3 Nc6 Bc4 Nf6 d4 ed o-o Bc5 e5 d5 ef dc Re1 Be6 Ng5 Qd5 Nc3 Qf5 N3e4 [ECO C55 two knights: Max Lange attack, Berger variation] e4 e5 Nf3 Nc6 Bc4 Nf6 d4 ed o-o Bc5 e5 d5 ef dc Re1 Be6 Ng5 Qd5 Nc3 Qf5 g4 Qg6 N3e4 Bb6 f4 o-o-o [ECO C55 two knights: Max Lange attack] e4 e5 Nf3 Nc6 Bc4 Nf6 d4 ed o-o Bc5 e5 [ECO C55 Two knights defence] e4 e5 Nf3 Nc6 Bc4 Nf6 d4 ed o-o [ECO C55 Two knights defence, Perreux variation] e4 e5 Nf3 Nc6 Bc4 Nf6 d4 ed Ng5 [ECO C55 Two knights defence, Keidanz variation] e4 e5 Nf3 Nc6 Bc4 Nf6 d4 ed e5 d5 Bb5 Ne4 Nd4 Bc5 Nc6 Bf2 Kf1 Qh4 [ECO C55 Two knights defence] e4 e5 Nf3 Nc6 Bc4 Nf6 d4 [ECO C55 Two knights defence ] e4 e5 Nf3 Nc6 Bc4 Nf6 d3 [ECO C55 Giuoco piano: Holzhausen attack] e4 e5 Nf3 Nc6 Bc4 Nf6 o-o Bc5 d4 Bd4 Nd4 Nd4 Bg5 d6 f4 Qe7 fe de Nc3 [ECO C55 Giuoco piano] e4 e5 Nf3 Nc6 Bc4 Nf6 o-o Bc5 d4 Bd4 Nd4 Nd4 Bg5 d6 [ECO C55 Giuoco piano: Rosentreter variation] e4 e5 Nf3 Nc6 Bc4 Nf6 o-o Bc5 d4 Bd4 Nd4 Nd4 Bg5 h6 Bh4 g5 f4 [ECO C55 Two knights defence] e4 e5 Nf3 Nc6 Bc4 Nf6 [ECO C54 Giuoco Piano: M\"oller, bayonet attack] e4 e5 Nf3 Nc6 Bc4 Bc5 c3 Nf6 d4 ed cd Bb4 Nc3 Ne4 o-o Bc3 d5 Bf6 Re1 Ne7 Re4 d6 g4 [ECO C54 Giuoco Piano: Therkatz-Herzog variation] e4 e5 Nf3 Nc6 Bc4 Bc5 c3 Nf6 d4 ed cd Bb4 Nc3 Ne4 o-o Bc3 d5 Bf6 Re1 Ne7 Re4 d6 Bg5 Bg5 Ng5 o-o Nh7 [ECO C54 Giuoco Piano: M\"oller attack] e4 e5 Nf3 Nc6 Bc4 Bc5 c3 Nf6 d4 ed cd Bb4 Nc3 Ne4 o-o Bc3 d5 [ECO C54 Giuoco Piano: Steinitz variation] e4 e5 Nf3 Nc6 Bc4 Bc5 c3 Nf6 d4 ed cd Bb4 Nc3 Ne4 o-o Bc3 bc d5 Ba3 [ECO C54 Giuoco Piano] e4 e5 Nf3 Nc6 Bc4 Bc5 c3 Nf6 d4 ed cd Bb4 Nc3 Ne4 o-o Bc3 [ECO C54 Giuoco Piano: Aitken variation] e4 e5 Nf3 Nc6 Bc4 Bc5 c3 Nf6 d4 ed cd Bb4 Nc3 Ne4 o-o Nc3 bc Bc3 Ba3 [ECO C54 Giuoco Piano: Bernstein variation] e4 e5 Nf3 Nc6 Bc4 Bc5 c3 Nf6 d4 ed cd Bb4 Nc3 Ne4 o-o Nc3 bc Bc3 Qb3 d5 [ECO C54 Giuoco Piano: Greco variation] e4 e5 Nf3 Nc6 Bc4 Bc5 c3 Nf6 d4 ed cd Bb4 Nc3 Ne4 o-o Nc3 [ECO C54 Giuoco Piano: Greco's attack] e4 e5 Nf3 Nc6 Bc4 Bc5 c3 Nf6 d4 ed cd Bb4 Nc3 [ECO C54 Giuoco Piano: Cracow variation] e4 e5 Nf3 Nc6 Bc4 Bc5 c3 Nf6 d4 ed cd Bb4 Kf1 [ECO C54 Giuoco Piano: Krause variation] e4 e5 Nf3 Nc6 Bc4 Bc5 c3 Nf6 d4 ed cd Bb4 Bd2 Ne4 Bb4 Nb4 Bf7 Kf7 Qb3 d5 Ne5 Kf6 f3 [ECO C54 Giuoco Piano] e4 e5 Nf3 Nc6 Bc4 Bc5 c3 Nf6 d4 ed cd [ECO C53 Giuoco Piano: Anderssen variation] e4 e5 Nf3 Nc6 Bc4 Bc5 c3 Nf6 d4 ed e5 d5 Bb5 Ne4 cd Bb4 [ECO C53 Giuoco Piano] e4 e5 Nf3 Nc6 Bc4 Bc5 c3 Nf6 d4 ed e5 d5 [ECO C53 Giuoco Piano: Ghulam Kassim variation] e4 e5 Nf3 Nc6 Bc4 Bc5 c3 Nf6 d4 ed e5 Ne4 Bd5 Nf2 Kf2 dc Kg3 [ECO C53 Giuoco Piano] e4 e5 Nf3 Nc6 Bc4 Bc5 c3 Nf6 d4 [ECO C53 Giuoco Piano: Bird's attack] e4 e5 Nf3 Nc6 Bc4 Bc5 c3 Nf6 b4 [ECO C53 Giuoco Piano] e4 e5 Nf3 Nc6 Bc4 Bc5 c3 Nf6 [ECO C53 Giuoco Piano: Eisinger variation] e4 e5 Nf3 Nc6 Bc4 Bc5 c3 Qe7 d4 Bb6 d5 Nb8 d6 [ECO C53 Giuoco Piano: Mestel variation] e4 e5 Nf3 Nc6 Bc4 Bc5 c3 Qe7 d4 Bb6 Bg5 [ECO C53 Giuoco Piano: Tarrasch variation] e4 e5 Nf3 Nc6 Bc4 Bc5 c3 Qe7 d4 Bb6 o-o Nf6 a4 a6 Re1 d6 h3 [ECO C53 Giuoco Piano: centre-holding variation] e4 e5 Nf3 Nc6 Bc4 Bc5 c3 Qe7 d4 Bb6 [ECO C53 Giuoco Piano: close variation] e4 e5 Nf3 Nc6 Bc4 Bc5 c3 Qe7 [ECO C53 Giuoco Piano: LaBourdonnais variation] e4 e5 Nf3 Nc6 Bc4 Bc5 c3 d6 d4 ed cd Bb6 [ECO C53 Giuoco Piano] e4 e5 Nf3 Nc6 Bc4 Bc5 c3 [ECO C52 Evans gambit: Alapin-Steinitz variation] e4 e5 Nf3 Nc6 Bc4 Bc5 b4 Bb4 c3 Ba5 o-o d6 d4 Bg4 [ECO C52 Evans gambit: Sanders-Alapin variation] e4 e5 Nf3 Nc6 Bc4 Bc5 b4 Bb4 c3 Ba5 o-o d6 d4 Bd7 [ECO C52 Evans gambit: Lasker defence] e4 e5 Nf3 Nc6 Bc4 Bc5 b4 Bb4 c3 Ba5 o-o d6 d4 Bb6 [ECO C52 Evans gambit: Waller attack] e4 e5 Nf3 Nc6 Bc4 Bc5 b4 Bb4 c3 Ba5 o-o d6 d4 ed Qb3 [ECO C52 Evans gambit] e4 e5 Nf3 Nc6 Bc4 Bc5 b4 Bb4 c3 Ba5 o-o d6 [ECO C52 Evans gambit: Richardson attack] e4 e5 Nf3 Nc6 Bc4 Bc5 b4 Bb4 c3 Ba5 o-o Nf6 d4 o-o Ne5 [ECO C52 Evans gambit] e4 e5 Nf3 Nc6 Bc4 Bc5 b4 Bb4 c3 Ba5 o-o [ECO C52 Evans gambit: Sokolsky variation] e4 e5 Nf3 Nc6 Bc4 Bc5 b4 Bb4 c3 Ba5 d4 d6 Bg5 [ECO C52 Evans gambit: Levenfish variation] e4 e5 Nf3 Nc6 Bc4 Bc5 b4 Bb4 c3 Ba5 d4 d6 Qb3 Qd7 de de o-o Bb6 Ba3 Na5 Ne5 [ECO C52 Evans gambit: Tartakower attack] e4 e5 Nf3 Nc6 Bc4 Bc5 b4 Bb4 c3 Ba5 d4 d6 Qb3 [ECO C52 Evans gambit] e4 e5 Nf3 Nc6 Bc4 Bc5 b4 Bb4 c3 Ba5 d4 d6 [ECO C52 Evans gambit: Leonhardt variation] e4 e5 Nf3 Nc6 Bc4 Bc5 b4 Bb4 c3 Ba5 d4 b5 [ECO C52 Evans gambit: compromised defence, Potter variation] e4 e5 Nf3 Nc6 Bc4 Bc5 b4 Bb4 c3 Ba5 d4 ed o-o dc Qb3 Qf6 e5 Qg6 Nc3 N8e7 Rd1 [ECO C52 Evans gambit: compromised defence, Paulsen variation] e4 e5 Nf3 Nc6 Bc4 Bc5 b4 Bb4 c3 Ba5 d4 ed o-o dc Qb3 Qf6 e5 Qg6 Nc3 N8e7 Ba3 [ECO C52 Evans gambit: compromised defence] e4 e5 Nf3 Nc6 Bc4 Bc5 b4 Bb4 c3 Ba5 d4 ed o-o dc [ECO C52 Evans gambit] e4 e5 Nf3 Nc6 Bc4 Bc5 b4 Bb4 c3 Ba5 [ECO C51 Evans gambit: Cordel variation] e4 e5 Nf3 Nc6 Bc4 Bc5 b4 Bb4 c3 Be7 d4 Na5 [ECO C51 Evans gambit: 5...Be7] e4 e5 Nf3 Nc6 Bc4 Bc5 b4 Bb4 c3 Be7 [ECO C51 Evans gambit: Mayet defence] e4 e5 Nf3 Nc6 Bc4 Bc5 b4 Bb4 c3 Bf8 [ECO C51 Evans gambit: Stone-Ware variation] e4 e5 Nf3 Nc6 Bc4 Bc5 b4 Bb4 c3 Bd6 [ECO C51 Evans gambit: Fraser-Mortimer attack] e4 e5 Nf3 Nc6 Bc4 Bc5 b4 Bb4 c3 Bc5 d4 ed o-o d6 cd Bb6 Nc3 Bg4 Qa4 Bd7 Qb3 Na5 Bf7 Kf8 Qc2 [ECO C51 Evans gambit: Fraser attack] e4 e5 Nf3 Nc6 Bc4 Bc5 b4 Bb4 c3 Bc5 d4 ed o-o d6 cd Bb6 Nc3 Bg4 Qa4 [ECO C51 Evans gambit] e4 e5 Nf3 Nc6 Bc4 Bc5 b4 Bb4 c3 Bc5 d4 ed o-o d6 cd Bb6 Nc3 Bg4 [ECO C51 Evans gambit: Steinitz variation] e4 e5 Nf3 Nc6 Bc4 Bc5 b4 Bb4 c3 Bc5 d4 ed o-o d6 cd Bb6 Nc3 Na5 Bg5 f6 Be3 [ECO C51 Evans gambit: G\"oring attack] e4 e5 Nf3 Nc6 Bc4 Bc5 b4 Bb4 c3 Bc5 d4 ed o-o d6 cd Bb6 Nc3 Na5 Bg5 [ECO C51 Evans gambit: Morphy attack] e4 e5 Nf3 Nc6 Bc4 Bc5 b4 Bb4 c3 Bc5 d4 ed o-o d6 cd Bb6 Nc3 [ECO C51 Evans gambit: Paulsen variation] e4 e5 Nf3 Nc6 Bc4 Bc5 b4 Bb4 c3 Bc5 d4 ed o-o d6 cd Bb6 d5 Na5 Bb2 Ne7 [ECO C51 Evans gambit: Ulvestad variation] e4 e5 Nf3 Nc6 Bc4 Bc5 b4 Bb4 c3 Bc5 d4 ed o-o d6 cd Bb6 d5 Na5 Bb2 [ECO C51 Evans gambit: normal variation] e4 e5 Nf3 Nc6 Bc4 Bc5 b4 Bb4 c3 Bc5 d4 ed o-o d6 cd Bb6 [ECO C51 Evans gambit] e4 e5 Nf3 Nc6 Bc4 Bc5 b4 Bb4 [ECO C51 Evans counter-gambit] e4 e5 Nf3 Nc6 Bc4 Bc5 b4 d5 [ECO C51 Evans gambit declined, Cordel variation] e4 e5 Nf3 Nc6 Bc4 Bc5 b4 Bb6 Bb2 [ECO C51 Evans gambit declined, Showalter variation] e4 e5 Nf3 Nc6 Bc4 Bc5 b4 Bb6 a4 a6 Nc3 [ECO C51 Evans gambit declined, 5.a4] e4 e5 Nf3 Nc6 Bc4 Bc5 b4 Bb6 a4 [ECO C51 Evans gambit declined, Hicken variation] e4 e5 Nf3 Nc6 Bc4 Bc5 b4 Bb6 b5 Na5 Ne5 Qg5 Qf3 Qe5 Qf7 Kd8 Bb2 [ECO C51 Evans gambit declined, V\'asquez variation] e4 e5 Nf3 Nc6 Bc4 Bc5 b4 Bb6 b5 Na5 Ne5 Qg5 Bf7 Ke7 Qh5 [ECO C51 Evans gambit declined, Hirschbach variation] e4 e5 Nf3 Nc6 Bc4 Bc5 b4 Bb6 b5 Na5 Ne5 Qg5 [ECO C51 Evans gambit declined, Pavlov variation] e4 e5 Nf3 Nc6 Bc4 Bc5 b4 Bb6 b5 Na5 Ne5 Nh6 d4 d6 Bh6 de Bg7 Rg8 Bf7 Kf7 Be5 Qg5 Nd2 [ECO C51 Evans gambit declined, Lange variation] e4 e5 Nf3 Nc6 Bc4 Bc5 b4 Bb6 b5 Na5 Ne5 Nh6 [ECO C51 Evans gambit declined] e4 e5 Nf3 Nc6 Bc4 Bc5 b4 [ECO C50 Giuoco Pianissimo: Canal variation] e4 e5 Nf3 Nc6 Bc4 Bc5 d3 Nf6 Nc3 d6 Bg5 [ECO C50 Giuoco Pianissimo: Italian four knights variation] e4 e5 Nf3 Nc6 Bc4 Bc5 d3 Nf6 Nc3 [ECO C50 Giuoco Pianissimo] e4 e5 Nf3 Nc6 Bc4 Bc5 d3 Nf6 [ECO C50 Giuoco Pianissimo: Dubois variation] e4 e5 Nf3 Nc6 Bc4 Bc5 d3 f5 Ng5 f4 [ECO C50 Giuoco Pianissimo] e4 e5 Nf3 Nc6 Bc4 Bc5 d3 [ECO C50 Giuoco Piano: Jerome gambit] e4 e5 Nf3 Nc6 Bc4 Bc5 Bf7 [ECO C50 Giuoco Piano: four knights variation] e4 e5 Nf3 Nc6 Bc4 Bc5 Nc3 Nf6 [ECO C50 Giuoco Piano] e4 e5 Nf3 Nc6 Bc4 Bc5 [ECO C50 Hungarian defence: Tartakower variation] e4 e5 Nf3 Nc6 Bc4 Be7 d4 ed c3 Nf6 e5 Ne4 [ECO C50 Hungarian defence] e4 e5 Nf3 Nc6 Bc4 Be7 [ECO C50 Rousseau gambit] e4 e5 Nf3 Nc6 Bc4 f5 [ECO C50 Blackburne shilling gambit] e4 e5 Nf3 Nc6 Bc4 Nd4 Ne5 Qg5 Nf7 Qg2 Rf1 Qe4 Be2 Nf3 [ECO C50 King's pawn game] e4 e5 Nf3 Nc6 Bc4 [ECO C49 Four knights: Nimzovich variation] e4 e5 Nf3 Nc6 Nc3 Nf6 Bb5 Bb4 o-o o-o Bc6 [ECO C49 Four knights: symmetrical, Mar\'oczy system] e4 e5 Nf3 Nc6 Nc3 Nf6 Bb5 Bb4 o-o o-o d3 d6 Ne2 [ECO C49 Four knights: symmetrical, Tarrasch variation] e4 e5 Nf3 Nc6 Nc3 Nf6 Bb5 Bb4 o-o o-o d3 d6 Bg5 Be6 [ECO C49 Four knights: symmetrical, Blake variation] e4 e5 Nf3 Nc6 Nc3 Nf6 Bb5 Bb4 o-o o-o d3 d6 Bg5 Ne7 Nh4 c6 Bc4 d5 Bb3 Qd6 [ECO C49 Four knights: symmetrical, Pillsbury variation] e4 e5 Nf3 Nc6 Nc3 Nf6 Bb5 Bb4 o-o o-o d3 d6 Bg5 Ne7 [ECO C49 Four knights: symmetrical, Capablanca variation] e4 e5 Nf3 Nc6 Nc3 Nf6 Bb5 Bb4 o-o o-o d3 d6 Bg5 Bc3 bc Qe7 Re1 Nd8 d4 Bg4 [ECO C49 Four knights: symmetrical, Metger unpin] e4 e5 Nf3 Nc6 Nc3 Nf6 Bb5 Bb4 o-o o-o d3 d6 Bg5 Bc3 bc Qe7 [ECO C49 Four knights: symmetrical variation] e4 e5 Nf3 Nc6 Nc3 Nf6 Bb5 Bb4 o-o o-o d3 d6 [ECO C49 Four knights: Svenonius variation] e4 e5 Nf3 Nc6 Nc3 Nf6 Bb5 Bb4 o-o o-o d3 Bc3 bc d5 [ECO C49 Four knights: Janowski variation] e4 e5 Nf3 Nc6 Nc3 Nf6 Bb5 Bb4 o-o o-o d3 Bc3 bc d6 Re1 [ECO C49 Four knights] e4 e5 Nf3 Nc6 Nc3 Nf6 Bb5 Bb4 o-o o-o d3 Bc3 [ECO C49 Four knights: Alatortsev variation] e4 e5 Nf3 Nc6 Nc3 Nf6 Bb5 Bb4 o-o o-o d3 Qe7 Ne2 d5 [ECO C49 Four knights: double Ruy Lopez] e4 e5 Nf3 Nc6 Nc3 Nf6 Bb5 Bb4 o-o o-o d3 [ECO C49 Four knights: Gunsberg counter-attack] e4 e5 Nf3 Nc6 Nc3 Nf6 Bb5 Bb4 o-o o-o Nd5 Nd5 ed e4 [ECO C49 Four knights: double Ruy Lopez] e4 e5 Nf3 Nc6 Nc3 Nf6 Bb5 Bb4 [ECO C48 Four knights: Rubinstein counter-gambit, Henneberger variation] e4 e5 Nf3 Nc6 Nc3 Nf6 Bb5 Nd4 o-o [ECO C48 Four knights: Rubinstein counter-gambit, exchange variation] e4 e5 Nf3 Nc6 Nc3 Nf6 Bb5 Nd4 Nd4 [ECO C48 Four knights: Rubinstein counter-gambit Mar\'oczy variation] e4 e5 Nf3 Nc6 Nc3 Nf6 Bb5 Nd4 Be2 Nf3 Bf3 Bc5 o-o o-o d3 d6 Na4 Bb6 [ECO C48 Four knights: Rubinstein counter-gambit, 5.Be2] e4 e5 Nf3 Nc6 Nc3 Nf6 Bb5 Nd4 Be2 [ECO C48 Four knights: Rubinstein counter-gambit, Bogolyubov variation] e4 e5 Nf3 Nc6 Nc3 Nf6 Bb5 Nd4 Ne5 Qe7 f4 [ECO C48 Four knights: Rubinstein counter-gambit] e4 e5 Nf3 Nc6 Nc3 Nf6 Bb5 Nd4 [ECO C48 Four knights: Marshall variation] e4 e5 Nf3 Nc6 Nc3 Nf6 Bb5 Bc5 o-o o-o Ne5 Nd4 [ECO C48 Four knights: Bardeleben variation] e4 e5 Nf3 Nc6 Nc3 Nf6 Bb5 Bc5 o-o o-o Ne5 Ne5 d4 Bd6 f4 Nc6 e5 Bb4 [ECO C48 Four knights: Spanish, classical defence] e4 e5 Nf3 Nc6 Nc3 Nf6 Bb5 Bc5 [ECO C48 Four knights: Spielmann variation] e4 e5 Nf3 Nc6 Nc3 Nf6 Bb5 a6 Bc6 dc Ne5 Ne4 Ne4 Qd4 o-o Qe5 Re1 Be6 d4 Qd5 [ECO C48 Four knights: Ranken variation] e4 e5 Nf3 Nc6 Nc3 Nf6 Bb5 a6 Bc6 [ECO C48 Four knights: Spanish variation] e4 e5 Nf3 Nc6 Nc3 Nf6 Bb5 [ECO C47 Four knights: Belgrade gambit] e4 e5 Nf3 Nc6 Nc3 Nf6 d4 ed Nd5 [ECO C47 Four knights: Scotch, 4...exd4] e4 e5 Nf3 Nc6 Nc3 Nf6 d4 ed [ECO C47 Four knights: Scotch, Krause variation] e4 e5 Nf3 Nc6 Nc3 Nf6 d4 Bb4 Ne5 [ECO C47 Four knights: Scotch variation] e4 e5 Nf3 Nc6 Nc3 Nf6 d4 [ECO C46 Four knights: Gunsberg variation] e4 e5 Nf3 Nc6 Nc3 Nf6 a3 [ECO C46 Four knights: Italian variation] e4 e5 Nf3 Nc6 Nc3 Nf6 Bc4 [ECO C46 Four knights: Schultze-M\"uller gambit] e4 e5 Nf3 Nc6 Nc3 Nf6 Ne5 [ECO C46 Four knights game] e4 e5 Nf3 Nc6 Nc3 Nf6 [ECO C46 Three knights: Steinitz, Rosenthal variation] e4 e5 Nf3 Nc6 Nc3 g6 d4 ed Nd5 [ECO C46 Three knights: Steinitz variation] e4 e5 Nf3 Nc6 Nc3 g6 [ECO C46 Three knights: Winawer defence ] e4 e5 Nf3 Nc6 Nc3 f5 [ECO C46 Three knights: Schlechter variation] e4 e5 Nf3 Nc6 Nc3 Bb4 Nd5 Nf6 [ECO C46 Three knights game] e4 e5 Nf3 Nc6 Nc3 [ECO C45 Scotch: Romanishin variation] e4 e5 Nf3 Nc6 d4 ed Nd4 Bc5 Nb3 Bb4 [ECO C45 Scotch: Potter variation] e4 e5 Nf3 Nc6 d4 ed Nd4 Bc5 Nb3 [ECO C45 Scotch: Blumenfeld attack] e4 e5 Nf3 Nc6 d4 ed Nd4 Bc5 Be3 Qf6 Nb5 [ECO C45 Scotch: Meitner variation] e4 e5 Nf3 Nc6 d4 ed Nd4 Bc5 Be3 Qf6 c3 N8e7 Nc2 [ECO C45 Scotch: Paulsen, Gunsberg defence] e4 e5 Nf3 Nc6 d4 ed Nd4 Bc5 Be3 Qf6 c3 N8e7 Bb5 Nd8 [ECO C45 Scotch: Paulsen attack] e4 e5 Nf3 Nc6 d4 ed Nd4 Bc5 Be3 Qf6 c3 N8e7 Bb5 [ECO C45 Scotch: Gottschall variation] e4 e5 Nf3 Nc6 d4 ed Nd4 Bc5 Be3 Qf6 c3 N8e7 Qd2 d5 Nb5 Be3 Qe3 o-o Nc7 Rb8 Nd5 Nd5 ed Nb4 [ECO C45 Scotch: Blackburne attack] e4 e5 Nf3 Nc6 d4 ed Nd4 Bc5 Be3 Qf6 c3 N8e7 Qd2 [ECO C45 Scotch game] e4 e5 Nf3 Nc6 d4 ed Nd4 Bc5 [ECO C45 Scotch: Tartakower variation] e4 e5 Nf3 Nc6 d4 ed Nd4 Nf6 Nc6 bc Nd2 [ECO C45 Scotch: Mieses variation] e4 e5 Nf3 Nc6 d4 ed Nd4 Nf6 Nc6 bc e5 [ECO C45 Scotch: Schmidt variation] e4 e5 Nf3 Nc6 d4 ed Nd4 Nf6 [ECO C45 Scotch: Steinitz variation] e4 e5 Nf3 Nc6 d4 ed Nd4 Qh4 Nc3 [ECO C45 Scotch: Fraser attack] e4 e5 Nf3 Nc6 d4 ed Nd4 Qh4 Nf3 [ECO C45 Scotch: Rosenthal variation] e4 e5 Nf3 Nc6 d4 ed Nd4 Qh4 Nb5 Bb4 Bd2 Qe4 Be2 Kd8 o-o Bd2 Nd2 Qg6 [ECO C45 Scotch game] e4 e5 Nf3 Nc6 d4 ed Nd4 Qh4 Nb5 Bb4 Bd2 [ECO C45 Scotch: Berger variation] e4 e5 Nf3 Nc6 d4 ed Nd4 Qh4 Nb5 Bb4 Nd2 Qe4 Be2 Qg2 Bf3 Qh3 Nc7 Kd8 Na8 Nf6 a3 [ECO C45 Scotch: Horwitz attack] e4 e5 Nf3 Nc6 d4 ed Nd4 Qh4 Nb5 [ECO C45 Scotch: Pulling counter-attack] e4 e5 Nf3 Nc6 d4 ed Nd4 Qh4 [ECO C45 Scotch: Ghulam Kassim variation] e4 e5 Nf3 Nc6 d4 ed Nd4 Nd4 Qd4 d6 Bd3 [ECO C45 Scotch game] e4 e5 Nf3 Nc6 d4 ed Nd4 [ECO C44 Scotch gambit: Dubois-R\'eti defence] e4 e5 Nf3 Nc6 d4 ed Bc4 Nf6 [ECO C44 Scotch gambit: Benima defence] e4 e5 Nf3 Nc6 d4 ed Bc4 Be7 [ECO C44 Scotch gambit: Cochrane variation] e4 e5 Nf3 Nc6 d4 ed Bc4 Bb4 c3 dc bc Ba5 e5 [ECO C44 Scotch gambit] e4 e5 Nf3 Nc6 d4 ed Bc4 Bb4 c3 dc bc [ECO C44 Scotch gambit: Hanneken variation] e4 e5 Nf3 Nc6 d4 ed Bc4 Bb4 c3 dc o-o cb Bb2 Nf6 Ng5 o-o e5 Ne5 [ECO C44 Scotch gambit] e4 e5 Nf3 Nc6 d4 ed Bc4 Bb4 [ECO C44 Scotch gambit: Vitzhum attack] e4 e5 Nf3 Nc6 d4 ed Bc4 Bc5 Ng5 Nh6 Qh5 [ECO C44 Scotch gambit: Cochrane-Shumov defence] e4 e5 Nf3 Nc6 d4 ed Bc4 Bc5 Ng5 Nh6 Nf7 Nf7 Bf7 Kf7 Qh5 g6 Qc5 d5 [ECO C44 Scotch gambit] e4 e5 Nf3 Nc6 d4 ed Bc4 Bc5 Ng5 [ECO C44 Scotch gambit: Anderssen counter-attack] e4 e5 Nf3 Nc6 d4 ed Bc4 Bc5 o-o d6 c3 Bg4 [ECO C44 Scotch gambit] e4 e5 Nf3 Nc6 d4 ed Bc4 [ECO C44 Scotch: G\"oring gambit, Bardeleben variation] e4 e5 Nf3 Nc6 d4 ed c3 dc Nc3 Bb4 Bc4 Nf6 [ECO C44 Scotch: G\"oring gambit] e4 e5 Nf3 Nc6 d4 ed c3 dc Nc3 Bb4 [ECO C44 Scotch: Sea-cadet mate] e4 e5 Nf3 Nc6 d4 ed c3 dc Nc3 d6 Bc4 Bg4 o-o Ne5 Ne5 Bd1 Bf7 Ke7 Nd5 [ECO C44 Scotch: G\"oring gambit] e4 e5 Nf3 Nc6 d4 ed c3 [ECO C44 Scotch: Relfsson gambit ] e4 e5 Nf3 Nc6 d4 ed Bb5 [ECO C44 Scotch: Cochrane variation] e4 e5 Nf3 Nc6 d4 Nd4 Ne5 Ne6 Bc4 c6 o-o Nf6 Nf7 [ECO C44 Scotch: Lolli variation] e4 e5 Nf3 Nc6 d4 Nd4 [ECO C44 Scotch opening] e4 e5 Nf3 Nc6 d4 [ECO C44 Ponziani counter-gambit, Cordel variation] e4 e5 Nf3 Nc6 c3 f5 d4 d6 d5 fe Ng5 Nb8 Ne4 Nf6 Bd3 Be7 [ECO C44 Ponziani counter-gambit, Schmidt attack] e4 e5 Nf3 Nc6 c3 f5 d4 d6 d5 [ECO C44 Ponziani counter-gambit] e4 e5 Nf3 Nc6 c3 f5 [ECO C44 Ponziani: Romanishin variation] e4 e5 Nf3 Nc6 c3 Be7 [ECO C44 Ponziani: R\'eti variation] e4 e5 Nf3 Nc6 c3 N8e7 [ECO C44 Ponziani: Fraser defence] e4 e5 Nf3 Nc6 c3 Nf6 d4 Ne4 d5 Bc5 [ECO C44 Ponziani: Jaenisch counter-attack] e4 e5 Nf3 Nc6 c3 Nf6 [ECO C44 Ponziani: Steinitz variation] e4 e5 Nf3 Nc6 c3 d5 Qa4 f6 [ECO C44 Ponziani: Leonhardt variation] e4 e5 Nf3 Nc6 c3 d5 Qa4 Nf6 [ECO C44 Ponziani: Caro variation] e4 e5 Nf3 Nc6 c3 d5 Qa4 Bd7 [ECO C44 Ponziani opening] e4 e5 Nf3 Nc6 c3 [ECO C44 Tayler opening] e4 e5 Nf3 Nc6 Be2 Nf6 d4 [ECO C44 Inverted Hanham] e4 e5 Nf3 Nc6 Be2 Nf6 d3 d5 N1d2 [ECO C44 Inverted Hungarian] e4 e5 Nf3 Nc6 Be2 [ECO C44 Dresden opening] e4 e5 Nf3 Nc6 c4 [ECO C44 Konstantinopolsky opening] e4 e5 Nf3 Nc6 g3 [ECO C44 Irish gambit] e4 e5 Nf3 Nc6 Ne5 Ne5 d4 [ECO C44 King's pawn game] e4 e5 Nf3 Nc6 [ECO C43 Petrov: modern attack, Trifunovi\'c variation] e4 e5 Nf3 Nf6 d4 Ne4 Bd3 d5 Ne5 Bd6 o-o o-o c4 Be5 [ECO C43 Petrov: modern attack, Symmetrical variation] e4 e5 Nf3 Nf6 d4 Ne4 [ECO C43 Petrov: Urusov gambit] e4 e5 Nf3 Nf6 d4 ed Bc4 [ECO C43 Petrov: modern attack, Bardeleben variation] e4 e5 Nf3 Nf6 d4 ed e5 Ne4 Qe2 Nc5 Nd4 Nc6 [ECO C43 Petrov: modern attack, Steinitz variation] e4 e5 Nf3 Nf6 d4 ed e5 Ne4 Qe2 [ECO C43 Petrov: modern attack, main line] e4 e5 Nf3 Nf6 d4 ed e5 Ne4 Qd4 [ECO C43 Petrov: modern attack] e4 e5 Nf3 Nf6 d4 [ECO C42 Petrov: Italian variation] e4 e5 Nf3 Nf6 Bc4 [ECO C42 Petrov three knights game] e4 e5 Nf3 Nf6 Nc3 [ECO C42 Petrov: Damiano variation] e4 e5 Nf3 Nf6 Ne5 Ne4 [ECO C42 Petrov: Paulsen attack] e4 e5 Nf3 Nf6 Ne5 d6 Nc4 [ECO C42 Petrov: Cochrane gambit] e4 e5 Nf3 Nf6 Ne5 d6 Nf7 [ECO C42 Petrov: classical attack, close variation] e4 e5 Nf3 Nf6 Ne5 d6 Nf3 Ne4 d4 Nf6 [ECO C42 Petrov: classical attack, Marshall trap] e4 e5 Nf3 Nf6 Ne5 d6 Nf3 Ne4 d4 d5 Bd3 Bd6 o-o o-o c4 Bg4 cd f5 Re1 Bh2 [ECO C42 Petrov: classical attack, Tarrasch variation] e4 e5 Nf3 Nf6 Ne5 d6 Nf3 Ne4 d4 d5 Bd3 Bd6 o-o o-o c4 Bg4 [ECO C42 Petrov: classical attack, Marshall variation] e4 e5 Nf3 Nf6 Ne5 d6 Nf3 Ne4 d4 d5 Bd3 Bd6 [ECO C42 Petrov: classical attack, Mason variation] e4 e5 Nf3 Nf6 Ne5 d6 Nf3 Ne4 d4 d5 Bd3 Be7 o-o o-o [ECO C42 Petrov: classical attack, Jaenisch variation] e4 e5 Nf3 Nf6 Ne5 d6 Nf3 Ne4 d4 d5 Bd3 Be7 o-o Nc6 c4 [ECO C42 Petrov: classical attack, Mar\'oczy variation] e4 e5 Nf3 Nf6 Ne5 d6 Nf3 Ne4 d4 d5 Bd3 Be7 o-o Nc6 Re1 Bg4 c3 f5 c4 Bh4 [ECO C42 Petrov: classical attack, Krause variation] e4 e5 Nf3 Nf6 Ne5 d6 Nf3 Ne4 d4 d5 Bd3 Be7 o-o Nc6 Re1 Bg4 c3 f5 c4 [ECO C42 Petrov: classical attack, Berger variation] e4 e5 Nf3 Nf6 Ne5 d6 Nf3 Ne4 d4 d5 Bd3 Be7 o-o Nc6 Re1 Bg4 c3 f5 N1d2 [ECO C42 Petrov: classical attack, Chigorin variation] e4 e5 Nf3 Nf6 Ne5 d6 Nf3 Ne4 d4 d5 Bd3 Be7 o-o Nc6 Re1 [ECO C42 Petrov: classical attack] e4 e5 Nf3 Nf6 Ne5 d6 Nf3 Ne4 d4 [ECO C42 Petrov: Cozio attack] e4 e5 Nf3 Nf6 Ne5 d6 Nf3 Ne4 Qe2 [ECO C42 Petrov: Nimzovich attack] e4 e5 Nf3 Nf6 Ne5 d6 Nf3 Ne4 Nc3 [ECO C42 Petrov: Kaufmann attack] e4 e5 Nf3 Nf6 Ne5 d6 Nf3 Ne4 c4 [ECO C42 Petrov: French attack] e4 e5 Nf3 Nf6 Ne5 d6 Nf3 Ne4 d3 [ECO C42 Petrov's defence] e4 e5 Nf3 Nf6 [ECO C41 Philidor: Hanham, Delmar variation] e4 e5 Nf3 d6 d4 Nd7 Bc4 c6 c3 [ECO C41 Philidor: Hanham, Schlechter variation] e4 e5 Nf3 d6 d4 Nd7 Bc4 c6 Nc3 [ECO C41 Philidor: Hanham, Berger variation] e4 e5 Nf3 d6 d4 Nd7 Bc4 c6 Ng5 Nh6 f4 Be7 o-o o-o c3 d5 [ECO C41 Philidor: Hanham, Kmoch variation] e4 e5 Nf3 d6 d4 Nd7 Bc4 c6 Ng5 [ECO C41 Philidor: Hanham, Steiner variation] e4 e5 Nf3 d6 d4 Nd7 Bc4 c6 o-o Be7 de [ECO C41 Philidor: Hanham, Krause variation] e4 e5 Nf3 d6 d4 Nd7 Bc4 c6 o-o [ECO C41 Philidor: Hanham variation] e4 e5 Nf3 d6 d4 Nd7 [ECO C41 Philidor: Nimzovich, Klein variation] e4 e5 Nf3 d6 d4 Nf6 Bc4 [ECO C41 Philidor: Nimzovich, Locock variation] e4 e5 Nf3 d6 d4 Nf6 Ng5 [ECO C41 Philidor: Nimzovich, Rellstab variation] e4 e5 Nf3 d6 d4 Nf6 de Ne4 Qd5 [ECO C41 Philidor: Nimzovich, Sokolsky variation] e4 e5 Nf3 d6 d4 Nf6 de Ne4 N1d2 [ECO C41 Philidor: Nimzovich variation] e4 e5 Nf3 d6 d4 Nf6 de [ECO C41 Philidor: Nimzovich, L\"arobok variation] e4 e5 Nf3 d6 d4 Nf6 Nc3 N8d7 Bc4 Be7 Ng5 o-o Bf7 [ECO C41 Philidor: Nimzovich, Sozin variation] e4 e5 Nf3 d6 d4 Nf6 Nc3 N8d7 Bc4 Be7 o-o o-o Qe2 c6 a4 ed [ECO C41 Philidor: Improved Hanham variation] e4 e5 Nf3 d6 d4 Nf6 Nc3 N8d7 [ECO C41 Philidor: Nimzovich variation] e4 e5 Nf3 d6 d4 Nf6 [ECO C41 Philidor: Larsen variation] e4 e5 Nf3 d6 d4 ed Nd4 g6 [ECO C41 Philidor: Berger variation] e4 e5 Nf3 d6 d4 ed Nd4 Nf6 Nc3 Be7 Be2 o-o o-o c5 Nf3 Nc6 Bg5 Be6 Re1 [ECO C41 Philidor: exchange variation] e4 e5 Nf3 d6 d4 ed Nd4 Nf6 [ECO C41 Philidor: Paulsen attack] e4 e5 Nf3 d6 d4 ed Nd4 d5 ed [ECO C41 Philidor: exchange variation] e4 e5 Nf3 d6 d4 ed Nd4 [ECO C41 Philidor: Boden variation] e4 e5 Nf3 d6 d4 ed Qd4 Bd7 [ECO C41 Philidor: exchange variation] e4 e5 Nf3 d6 d4 ed [ECO C41 Philidor: Philidor counter-gambit, Zukertort variation] e4 e5 Nf3 d6 d4 f5 Nc3 [ECO C41 Philidor: Philidor counter-gambit, Berger variation] e4 e5 Nf3 d6 d4 f5 de fe Ng5 d5 e6 Bc5 Nc3 [ECO C41 Philidor: Philidor counter-gambit, del Rio attack] e4 e5 Nf3 d6 d4 f5 de fe Ng5 d5 e6 [ECO C41 Philidor: Philidor counter-gambit] e4 e5 Nf3 d6 d4 f5 [ECO C41 Philidor's defence] e4 e5 Nf3 d6 d4 [ECO C41 Philidor: L\'opez counter-gambit, Jaenisch variation] e4 e5 Nf3 d6 Bc4 f5 d4 ed Ng5 Nh6 Nh7 [ECO C41 Philidor: L\'opez counter-gambit] e4 e5 Nf3 d6 Bc4 f5 [ECO C41 Philidor: Steinitz variation] e4 e5 Nf3 d6 Bc4 Be7 c3 [ECO C41 Philidor's defence] e4 e5 Nf3 d6 [ECO C40 Latvian: corkscrew counter-gambit] e4 e5 Nf3 f5 Bc4 fe Ne5 Nf6 [ECO C40 Latvian: Polerio variation] e4 e5 Nf3 f5 Bc4 fe Ne5 d5 [ECO C40 Latvian: Behting variation] e4 e5 Nf3 f5 Bc4 fe Ne5 Qg5 Nf7 Qg2 Rf1 d5 Nh8 Nf6 [ECO C40 Latvian gambit, 3.Bc4] e4 e5 Nf3 f5 Bc4 [ECO C40 Latvian: Fraser defence] e4 e5 Nf3 f5 Ne5 Nc6 [ECO C40 Latvian: Nimzovich variation] e4 e5 Nf3 f5 Ne5 Qf6 d4 d6 Nc4 fe Ne3 [ECO C40 Latvian counter-gambit] e4 e5 Nf3 f5 [ECO C40 QP counter-gambit: Maroczy gambit] e4 e5 Nf3 d5 ed Bd6 [ECO C40 QP counter-gambit ] e4 e5 Nf3 d5 [ECO C40 Damiano's defence] e4 e5 Nf3 f6 [ECO C40 Greco defence] e4 e5 Nf3 Qf6 [ECO C40 Gunderam defence] e4 e5 Nf3 Qe7 [ECO C40 King's knight opening] e4 e5 Nf3 [ECO C39 KGA: Kieseritsky, Rice gambit] e4 e5 f4 ef Nf3 g5 h4 g4 Ne5 Nf6 Bc4 d5 ed Bd6 o-o [ECO C39 KGA: Kieseritsky, Berlin defence, 6.Bc4] e4 e5 f4 ef Nf3 g5 h4 g4 Ne5 Nf6 Bc4 [ECO C39 KGA: Kieseritsky, Berlin defence, Rivi\`ere variation] e4 e5 f4 ef Nf3 g5 h4 g4 Ne5 Nf6 Ng4 d5 [ECO C39 KGA: Kieseritsky, Berlin defence] e4 e5 f4 ef Nf3 g5 h4 g4 Ne5 Nf6 [ECO C39 KGA: Kieseritsky, Kolisch defence] e4 e5 f4 ef Nf3 g5 h4 g4 Ne5 d6 [ECO C39 KGA: Kieseritsky, Neumann defence] e4 e5 f4 ef Nf3 g5 h4 g4 Ne5 Nc6 [ECO C39 KGA: Kieseritsky, Polerio defence] e4 e5 f4 ef Nf3 g5 h4 g4 Ne5 Be7 [ECO C39 KGA: Kieseritsky, Salvio defence, Cozio variation] e4 e5 f4 ef Nf3 g5 h4 g4 Ne5 Qe7 d4 f5 Bc4 [ECO C39 KGA: Kieseritsky, Salvio defence] e4 e5 f4 ef Nf3 g5 h4 g4 Ne5 Qe7 [ECO C39 KGA: Kieseritsky, Brentano defence, Caro variation] e4 e5 f4 ef Nf3 g5 h4 g4 Ne5 d5 d4 Nf6 Bf4 Ne4 Nd2 [ECO C39 KGA: Kieseritsky, Brentano defence] e4 e5 f4 ef Nf3 g5 h4 g4 Ne5 d5 d4 Nf6 Bf4 [ECO C39 KGA: Kieseritsky, Brentano defence, Kaplanek variation] e4 e5 f4 ef Nf3 g5 h4 g4 Ne5 d5 d4 Nf6 ed Qd5 Nc3 Bb4 Kf2 [ECO C39 KGA: Kieseritsky, Brentano defence] e4 e5 f4 ef Nf3 g5 h4 g4 Ne5 d5 [ECO C39 KGA: Kieseritsky, long whip defence, Jaenisch variation] e4 e5 f4 ef Nf3 g5 h4 g4 Ne5 h5 Bc4 Rh7 d4 Bh6 Nc3 [ECO C39 KGA: Kieseritsky, long whip defence] e4 e5 f4 ef Nf3 g5 h4 g4 Ne5 h5 [ECO C39 KGA: Kieseritsky, Paulsen defence] e4 e5 f4 ef Nf3 g5 h4 g4 Ne5 Bg7 [ECO C39 KGA: Allgaier, Schlechter defence] e4 e5 f4 ef Nf3 g5 h4 g4 Ng5 Nf6 [ECO C39 KGA: Allgaier, Urusov attack] e4 e5 f4 ef Nf3 g5 h4 g4 Ng5 h6 Nf7 Kf7 Bc4 d5 Bd5 Kg7 d4 [ECO C39 KGA: Allgaier, Walker attack] e4 e5 f4 ef Nf3 g5 h4 g4 Ng5 h6 Nf7 Kf7 Bc4 [ECO C39 KGA: Allgaier, Blackburne gambit] e4 e5 f4 ef Nf3 g5 h4 g4 Ng5 h6 Nf7 Kf7 Nc3 [ECO C39 KGA: Allgaier, Cook variation] e4 e5 f4 ef Nf3 g5 h4 g4 Ng5 h6 Nf7 Kf7 d4 d5 Bf4 de Bc4 Kg7 Be5 [ECO C39 KGA: Allgaier, Thorold variation] e4 e5 f4 ef Nf3 g5 h4 g4 Ng5 h6 Nf7 Kf7 d4 [ECO C39 KGA: Allgaier, Horny defence] e4 e5 f4 ef Nf3 g5 h4 g4 Ng5 h6 Nf7 Kf7 Qg4 Nf6 Qf4 Bd6 [ECO C39 KGA: Allgaier gambit] e4 e5 f4 ef Nf3 g5 h4 g4 Ng5 [ECO C39 King's knight's gambit] e4 e5 f4 ef Nf3 g5 h4 [ECO C38 KGA: Philidor gambit, Schultz variation] e4 e5 f4 ef Nf3 g5 Bc4 Bg7 h4 h6 d4 d6 Qd3 [ECO C38 KGA: Greco gambit] e4 e5 f4 ef Nf3 g5 Bc4 Bg7 h4 h6 d4 d6 Nc3 c6 hg hg Rh8 Bh8 Ne5 [ECO C38 KGA: Philidor gambit] e4 e5 f4 ef Nf3 g5 Bc4 Bg7 h4 [ECO C38 KGA: Hanstein gambit] e4 e5 f4 ef Nf3 g5 Bc4 Bg7 o-o [ECO C38 King's knight's gambit] e4 e5 f4 ef Nf3 g5 Bc4 Bg7 [ECO C37 KGA: Muzio gambit, Brentano defence] e4 e5 f4 ef Nf3 g5 Bc4 g4 o-o d5 [ECO C37 KGA: Muzio gambit, Kling and Horwitz counter-attack] e4 e5 f4 ef Nf3 g5 Bc4 g4 o-o Qe7 [ECO C37 KGA: Muzio gambit, Holloway defence] e4 e5 f4 ef Nf3 g5 Bc4 g4 o-o gf Qf3 Nc6 [ECO C37 KGA: Muzio gambit, From defence] e4 e5 f4 ef Nf3 g5 Bc4 g4 o-o gf Qf3 Qe7 [ECO C37 KGA: double Muzio gambit] e4 e5 f4 ef Nf3 g5 Bc4 g4 o-o gf Qf3 Qf6 e5 Qe5 Bf7 [ECO C37 KGA: Muzio gambit, Paulsen variation] e4 e5 f4 ef Nf3 g5 Bc4 g4 o-o gf Qf3 Qf6 e5 Qe5 d3 Bh6 Nc3 Ne7 Bd2 N8c6 a1e1 [ECO C37 KGA: Muzio gambit] e4 e5 f4 ef Nf3 g5 Bc4 g4 o-o [ECO C37 KGA: Herzfeld gambit] e4 e5 f4 ef Nf3 g5 Bc4 g4 Ne5 Qh4 Kf1 Nc6 [ECO C37 KGA: Cochrane gambit] e4 e5 f4 ef Nf3 g5 Bc4 g4 Ne5 Qh4 Kf1 f3 [ECO C37 KGA: Salvio gambit, Anderssen counter-attack] e4 e5 f4 ef Nf3 g5 Bc4 g4 Ne5 Qh4 Kf1 Nh6 d4 d6 [ECO C37 KGA: Silberschmidt gambit] e4 e5 f4 ef Nf3 g5 Bc4 g4 Ne5 Qh4 Kf1 Nh6 d4 f3 [ECO C37 KGA: Salvio gambit] e4 e5 f4 ef Nf3 g5 Bc4 g4 Ne5 [ECO C37 KGA: MacDonnell gambit] e4 e5 f4 ef Nf3 g5 Bc4 g4 Nc3 [ECO C37 KGA: Ghulam Kassim gambit] e4 e5 f4 ef Nf3 g5 Bc4 g4 d4 [ECO C37 KGA: Lolli gambit, Young variation] e4 e5 f4 ef Nf3 g5 Bc4 g4 Bf7 Kf7 o-o gf Qf3 Qf6 d4 Qd4 Be3 Qf6 Nc3 [ECO C37 KGA: Lolli gambit ] e4 e5 f4 ef Nf3 g5 Bc4 g4 Bf7 [ECO C37 KGA: Blachly gambit] e4 e5 f4 ef Nf3 g5 Bc4 Nc6 [ECO C37 KGA: King's knight's gambit] e4 e5 f4 ef Nf3 g5 Bc4 [ECO C37 KGA: S\o rensen gambit] e4 e5 f4 ef Nf3 g5 d4 g4 Ne5 [ECO C37 KGA: Rosentreter gambit] e4 e5 f4 ef Nf3 g5 d4 [ECO C37 KGA: Quaade gambit] e4 e5 f4 ef Nf3 g5 Nc3 [ECO C36 KGA: Abbazia defence, Botvinnik variation] e4 e5 f4 ef Nf3 d5 ed Nf6 Bb5 c6 dc bc Bc4 Nd5 [ECO C36 KGA: Abbazia defence, modern variation] e4 e5 f4 ef Nf3 d5 ed Nf6 [ECO C36 KGA: Abbazia defence ] e4 e5 f4 ef Nf3 d5 [ECO C35 KGA: Cunningham, Euwe defence] e4 e5 f4 ef Nf3 Be7 Bc4 Nf6 [ECO C35 KGA: Cunningham, three pawns gambit] e4 e5 f4 ef Nf3 Be7 Bc4 Bh4 g3 fg o-o gh Kh1 [ECO C35 KGA: Cunningham, Bertin gambit] e4 e5 f4 ef Nf3 Be7 Bc4 Bh4 g3 [ECO C35 KGA: Cunningham defence] e4 e5 f4 ef Nf3 Be7 [ECO C34 KGA: Schallop defence] e4 e5 f4 ef Nf3 Nf6 [ECO C34 KGA: Becker defence] e4 e5 f4 ef Nf3 h6 [ECO C34 KGA: Fischer defence] e4 e5 f4 ef Nf3 d6 [ECO C34 KGA: Gianutio counter-gambit] e4 e5 f4 ef Nf3 f5 [ECO C34 KGA: Bonsch-Osmolovsky variation] e4 e5 f4 ef Nf3 Ne7 [ECO C34 King's knight's gambit] e4 e5 f4 ef Nf3 [ECO C33 KGA: bishop's gambit, Jaenisch variation] e4 e5 f4 ef Bc4 Nf6 Nc3 c6 [ECO C33 KGA: bishop's gambit, Paulsen attack] e4 e5 f4 ef Bc4 Nf6 Nc3 Bb4 e5 [ECO C33 KGA: bishop's gambit, Bogolyubov variation] e4 e5 f4 ef Bc4 Nf6 Nc3 [ECO C33 KGA: bishop's gambit, Cozio defence] e4 e5 f4 ef Bc4 Nf6 [ECO C33 KGA: bishop's gambit, Morphy variation] e4 e5 f4 ef Bc4 d5 Bd5 Nf6 [ECO C33 KGA: bishop's gambit, Anderssen variation] e4 e5 f4 ef Bc4 d5 Bd5 c6 [ECO C33 KGA: bishop's gambit, Bor\'en-Svenonius variation] e4 e5 f4 ef Bc4 d5 Bd5 Qh4 Kf1 Bd6 [ECO C33 KGA: bishop's gambit, Gifford variation] e4 e5 f4 ef Bc4 d5 Bd5 Qh4 Kf1 g5 g3 [ECO C33 KGA: bishop's gambit, Bledow variation] e4 e5 f4 ef Bc4 d5 [ECO C33 KGA: L\'opez-Gianutio counter-gambit, Hein variation] e4 e5 f4 ef Bc4 f5 Qe2 Qh4 Kd1 fe Nc3 Kd8 [ECO C33 KGA: bishop's gambit, L\'opez-Gianutio counter-gambit] e4 e5 f4 ef Bc4 f5 [ECO C33 KGA: bishop's gambit, Ruy L\'opez defence] e4 e5 f4 ef Bc4 c6 [ECO C33 KGA: bishop's gambit, Maurian defence] e4 e5 f4 ef Bc4 Nc6 [ECO C33 KGA: bishop's gambit, Steinitz defence] e4 e5 f4 ef Bc4 Ne7 [ECO C33 KGA: bishop's gambit, Bryan counter-gambit] e4 e5 f4 ef Bc4 b5 [ECO C33 KGA: bishop's gambit, Bryan counter-gambit] e4 e5 f4 ef Bc4 Qh4 Kf1 b5 [ECO C33 KGA: bishop's gambit, Boden defence] e4 e5 f4 ef Bc4 Qh4 Kf1 Nc6 [ECO C33 KGA: bishop's gambit, classical defence, Cozio attack] e4 e5 f4 ef Bc4 Qh4 Kf1 g5 Qf3 [ECO C33 KGA: bishop's gambit, Fraser variation] e4 e5 f4 ef Bc4 Qh4 Kf1 g5 Nc3 Bg7 g3 fg Qf3 [ECO C33 KGA: bishop's gambit, McDonnell attack] e4 e5 f4 ef Bc4 Qh4 Kf1 g5 Nc3 Bg7 g3 [ECO C33 KGA: bishop's gambit, McDonnell attack] e4 e5 f4 ef Bc4 Qh4 Kf1 g5 Nc3 Bg7 d4 Ne7 g3 [ECO C33 KGA: bishop's gambit, classical defence] e4 e5 f4 ef Bc4 Qh4 Kf1 g5 Nc3 Bg7 d4 Ne7 [ECO C33 KGA: bishop's gambit, Grimm attack] e4 e5 f4 ef Bc4 Qh4 Kf1 g5 Nc3 Bg7 d4 d6 e5 [ECO C33 KGA: bishop's gambit, classical defence] e4 e5 f4 ef Bc4 Qh4 Kf1 g5 [ECO C33 KGA: bishop's gambit, Greco variation] e4 e5 f4 ef Bc4 Qh4 Kf1 Bc5 [ECO C33 KGA: bishop's gambit, Chigorin's attack] e4 e5 f4 ef Bc4 Qh4 Kf1 d5 Bd5 g5 g3 [ECO C33 KGA: bishop's gambit] e4 e5 f4 ef Bc4 [ECO C33 KGA: Lesser bishop's gambit] e4 e5 f4 ef Be2 [ECO C33 KGA: Breyer gambit] e4 e5 f4 ef Qf3 [ECO C33 KGA: Keres gambit] e4 e5 f4 ef Nc3 [ECO C33 KGA: Villemson gambit] e4 e5 f4 ef d4 [ECO C33 KGA: Carrera gambit] e4 e5 f4 ef Qe2 [ECO C33 KGA: Schurig gambit] e4 e5 f4 ef Bd3 [ECO C33 KGA: Pawn's gambit ] e4 e5 f4 ef h4 [ECO C33 KGA: Orsini gambit] e4 e5 f4 ef b3 [ECO C33 KGA: Tumbleweed gambit] e4 e5 f4 ef Kf2 [ECO C33 King's gambit accepted] e4 e5 f4 ef [ECO C32 KGD: Falkbeer, R\'eti variation] e4 e5 f4 d5 ed e4 d3 Nf6 Qe2 [ECO C32 KGD: Falkbeer, Keres variation] e4 e5 f4 d5 ed e4 d3 Nf6 Nd2 [ECO C32 KGD: Falkbeer, Charousek variation] e4 e5 f4 d5 ed e4 d3 Nf6 de Ne4 Qe2 Qd5 Nd2 f5 g4 [ECO C32 KGD: Falkbeer, Charousek gambit] e4 e5 f4 d5 ed e4 d3 Nf6 de Ne4 Qe2 [ECO C32 KGD: Falkbeer, Tarrasch variation] e4 e5 f4 d5 ed e4 d3 Nf6 de Ne4 Nf3 Bc5 Qe2 Bf5 g4 o-o [ECO C32 KGD: Falkbeer, main line, 7...Bf5] e4 e5 f4 d5 ed e4 d3 Nf6 de Ne4 Nf3 Bc5 Qe2 Bf5 [ECO C32 KGD: Falkbeer, Alapin variation] e4 e5 f4 d5 ed e4 d3 Nf6 de Ne4 Nf3 Bc5 Qe2 Bf2 Kd1 Qd5 N3d2 [ECO C32 KGD: Falkbeer, 5.de] e4 e5 f4 d5 ed e4 d3 Nf6 de [ECO C31 KGD: Falkbeer, Morphy gambit] e4 e5 f4 d5 ed e4 d3 Nf6 Nc3 Bb4 Bd2 e3 [ECO C31 KGD: Falkbeer, 4.d3] e4 e5 f4 d5 ed e4 d3 [ECO C31 KGD: Falkbeer, Nimzovich variation] e4 e5 f4 d5 ed e4 Bb5 [ECO C31 KGD: Falkbeer, Rubinstein variation] e4 e5 f4 d5 ed e4 Nc3 Nf6 Qe2 [ECO C31 KGD: Falkbeer, 3...e4] e4 e5 f4 d5 ed e4 [ECO C31 KGD: Nimzovich counter-gambit] e4 e5 f4 d5 ed c6 [ECO C31 KGD: Falkbeer counter-gambit] e4 e5 f4 d5 ed [ECO C31 KGD: Falkbeer, Milner-Barry variation] e4 e5 f4 d5 Nc3 [ECO C31 KGD: Falkbeer, Tartakower variation] e4 e5 f4 d5 Nf3 [ECO C31 KGD: Falkbeer counter-gambit] e4 e5 f4 d5 [ECO C30 KGD: 2...Nf6] e4 e5 f4 Nf6 [ECO C30 KGD: classical, Heath variation] e4 e5 f4 Bc5 Nf3 d6 b4 [ECO C30 KGD: classical, Soldatenkov variation] e4 e5 f4 Bc5 Nf3 d6 fe [ECO C30 KGD: classical, R\'eti variation] e4 e5 f4 Bc5 Nf3 d6 c3 f5 fe de d4 ed Bc4 [ECO C30 KGD: classical counter-gambit] e4 e5 f4 Bc5 Nf3 d6 c3 f5 [ECO C30 KGD: classical, Marshall attack] e4 e5 f4 Bc5 Nf3 d6 c3 Bg4 fe de Qa4 [ECO C30 KGD: classical, 4.c3] e4 e5 f4 Bc5 Nf3 d6 c3 [ECO C30 KGD: classical, Hanham variation] e4 e5 f4 Bc5 Nf3 d6 Nc3 Nd7 [ECO C30 KGD: classical, Svenonius variation] e4 e5 f4 Bc5 Nf3 d6 Nc3 Nf6 Bc4 Nc6 d3 Bg4 h3 Bf3 Qf3 ef [ECO C30 KGD: classical variation] e4 e5 f4 Bc5 [ECO C30 KGD: Norwalde variation, B\"ucker gambit] e4 e5 f4 Qf6 Nf3 Qf4 Nc3 Bb4 Bc4 [ECO C30 KGD: Norwalde variation] e4 e5 f4 Qf6 [ECO C30 KGD: Mafia defence] e4 e5 f4 c5 [ECO C30 KGD: Keene's defence] e4 e5 f4 Qh4 g3 Qe7 [ECO C30 King's gambit] e4 e5 f4 [ECO C29 Vienna gambit, Steinitz variation] e4 e5 Nc3 Nf6 f4 d5 d3 [ECO C29 Vienna gambit, Wurzburger trap] e4 e5 Nc3 Nf6 f4 d5 fe Ne4 d3 Qh4 g3 Ng3 Nf3 Qh5 Nd5 [ECO C29 Vienna gambit] e4 e5 Nc3 Nf6 f4 d5 fe Ne4 d3 [ECO C29 Vienna gambit: Heyde variation] e4 e5 Nc3 Nf6 f4 d5 fe Ne4 Qf3 f5 d4 [ECO C29 Vienna gambit: Bardeleben variation] e4 e5 Nc3 Nf6 f4 d5 fe Ne4 Qf3 f5 [ECO C29 Vienna gambit: Paulsen attack] e4 e5 Nc3 Nf6 f4 d5 fe Ne4 Qf3 [ECO C29 Vienna gambit: Breyer variation] e4 e5 Nc3 Nf6 f4 d5 fe Ne4 Nf3 Be7 [ECO C29 Vienna gambit: Kaufmann variation] e4 e5 Nc3 Nf6 f4 d5 fe Ne4 Nf3 Bg4 Qe2 [ECO C29 Vienna gambit] e4 e5 Nc3 Nf6 f4 d5 [ECO C?? Vienna gambit] e4 e5 Nc3 Nf6 f4 [ECO C28 Vienna game] e4 e5 Nc3 Nf6 Bc4 Nc6 [ECO C27 Boden-Kieseritsky gambit: Lichtenhein defence] e4 e5 Nc3 Nf6 Bc4 Ne4 Nf3 d5 [ECO C27 Boden-Kieseritsky gambit] e4 e5 Nc3 Nf6 Bc4 Ne4 Nf3 [ECO C27 Vienna: Alekhine variation] e4 e5 Nc3 Nf6 Bc4 Ne4 Qh5 Nd6 Bb3 Be7 Nf3 Nc6 Ne5 [ECO C27 Vienna game] e4 e5 Nc3 Nf6 Bc4 Ne4 Qh5 Nd6 Bb3 Be7 [ECO C27 Vienna: Adams' gambit] e4 e5 Nc3 Nf6 Bc4 Ne4 Qh5 Nd6 Bb3 Nc6 d4 [ECO C27 Vienna: `Frankenstein-Dracula' variation] e4 e5 Nc3 Nf6 Bc4 Ne4 Qh5 Nd6 Bb3 Nc6 Nb5 g6 Qf3 f5 Qd5 Qe7 Nc7 Kd8 Na8 b6 [ECO C27 Vienna game] e4 e5 Nc3 Nf6 Bc4 Ne4 [ECO C26 Vienna game] e4 e5 Nc3 Nf6 Bc4 [ECO C26 Vienna: Paulsen-Mieses variation] e4 e5 Nc3 Nf6 g3 [ECO C26 Vienna: Mengarini variation] e4 e5 Nc3 Nf6 a3 [ECO C26 Vienna: Falkbeer variation] e4 e5 Nc3 Nf6 [ECO C25 Vienna: Pierce gambit, Rushmere attack] e4 e5 Nc3 Nc6 f4 ef Nf3 g5 d4 g4 Bc4 gf o-o d5 ed Bg4 dc [ECO C25 Vienna: Pierce gambit] e4 e5 Nc3 Nc6 f4 ef Nf3 g5 d4 [ECO C25 Vienna: Hamppe-Muzio, Dubois variation] e4 e5 Nc3 Nc6 f4 ef Nf3 g5 Bc4 g4 o-o gf Qf3 Ne5 Qf4 Qf6 [ECO C25 Vienna: Hamppe-Muzio gambit] e4 e5 Nc3 Nc6 f4 ef Nf3 g5 Bc4 g4 o-o [ECO C25 Vienna: Hamppe-Allgaier gambit, Alapin variation] e4 e5 Nc3 Nc6 f4 ef Nf3 g5 h4 g4 Ng5 d6 [ECO C25 Vienna: Hamppe-Allgaier gambit] e4 e5 Nc3 Nc6 f4 ef Nf3 g5 h4 g4 Ng5 [ECO C25 Vienna gambit] e4 e5 Nc3 Nc6 f4 ef Nf3 [ECO C25 Vienna: Steinitz gambit, Fraser-Minckwitz variation] e4 e5 Nc3 Nc6 f4 ef d4 Qh4 Ke2 b6 [ECO C25 Vienna: Steinitz gambit, Zukertort defence] e4 e5 Nc3 Nc6 f4 ef d4 Qh4 Ke2 d5 [ECO C25 Vienna: Steinitz gambit] e4 e5 Nc3 Nc6 f4 ef d4 [ECO C25 Vienna gambit] e4 e5 Nc3 Nc6 f4 [ECO C25 Vienna: Fyfe gambit] e4 e5 Nc3 Nc6 d4 [ECO C25 Vienna: Paulsen variation] e4 e5 Nc3 Nc6 g3 [ECO C25 Vienna game, Max Lange defence] e4 e5 Nc3 Nc6 [ECO C25 Vienna: Zhuravlev countergambit] e4 e5 Nc3 Bb4 Qg4 Nf6 [ECO C25 Vienna game] e4 e5 Nc3 [ECO C24 Bishop's opening: Urusov gambit, Panov variation] e4 e5 Bc4 Nf6 d4 ed Nf3 d5 ed Bb4 c3 Qe7 [ECO C24 Bishop's opening: Urusov gambit] e4 e5 Bc4 Nf6 d4 ed Nf3 [ECO C24 Bishop's opening: Ponziani gambit] e4 e5 Bc4 Nf6 d4 [ECO C24 Bishop's opening: Greco gambit] e4 e5 Bc4 Nf6 f4 [ECO C24 Bishop's opening: Berlin defence] e4 e5 Bc4 Nf6 [ECO C23 Bishop's opening: Four pawns' gambit] e4 e5 Bc4 Bc5 b4 Bb4 f4 ef Nf3 Be7 d4 Bh4 g3 fg o-o gh Kh1 [ECO C23 Bishop's opening: MacDonnell double gambit] e4 e5 Bc4 Bc5 b4 Bb4 f4 [ECO C23 Bishop's opening: Wing gambit] e4 e5 Bc4 Bc5 b4 [ECO C23 Bishop's opening: Lewis gambit] e4 e5 Bc4 Bc5 d4 [ECO C23 Bishop's opening: del Rio variation] e4 e5 Bc4 Bc5 c3 Qg5 [ECO C23 Bishop's opening: Lewis counter-gambit] e4 e5 Bc4 Bc5 c3 d5 [ECO C23 Bishop's opening: Pratt variation] e4 e5 Bc4 Bc5 c3 Nf6 d4 ed e5 d5 ef dc4 Qh5 o-o [ECO C23 Bishop's opening: Philidor variation] e4 e5 Bc4 Bc5 c3 [ECO C23 Bishop's opening: Lopez gambit] e4 e5 Bc4 Bc5 Qe2 Nc6 c3 Nf6 f4 [ECO C23 Bishop's opening: Classical variation] e4 e5 Bc4 Bc5 [ECO C23 Bishop's opening: Calabrese counter-gambit, Jaenisch variation] e4 e5 Bc4 f5 d3 [ECO C23 Bishop's opening: Calabrese counter-gambit] e4 e5 Bc4 f5 [ECO C23 Bishop's opening: Lisitsyn variation] e4 e5 Bc4 c6 d4 d5 ed cd Bb5 Bd7 Bd7 Nd7 de Ne5 Ne2 [ECO C23 Bishop's opening: Philidor counter-attack] e4 e5 Bc4 c6 [ECO C23 Bishop's opening] e4 e5 Bc4 [ECO C22 Centre game: Hall variation] e4 e5 d4 ed Qd4 Nc6 Qc4 [ECO C22 Centre game: Kupreichik variation] e4 e5 d4 ed Qd4 Nc6 Qe3 Nf6 Nc3 Bb4 Bd2 o-o o-o-o Re8 Bc4 d6 Nh3 [ECO C22 Centre game: Berger variation] e4 e5 d4 ed Qd4 Nc6 Qe3 Nf6 [ECO C22 Centre game: l'Hermet variation] e4 e5 d4 ed Qd4 Nc6 Qe3 f5 [ECO C22 Centre game: Charousek variation] e4 e5 d4 ed Qd4 Nc6 Qe3 Bb4 c3 Be7 [ECO C22 Centre game: Paulsen attack] e4 e5 d4 ed Qd4 Nc6 Qe3 [ECO C22 Centre game] e4 e5 d4 ed Qd4 Nc6 [ECO C?? Centre game] e4 e5 d4 ed Qd4 [ECO C21 Danish gambit: S\o rensen defence] e4 e5 d4 ed c3 d5 [ECO C21 Danish gambit: Schlechter defence] e4 e5 d4 ed c3 dc Bc4 cb Bb2 d5 [ECO C21 Danish gambit: Collijn defence] e4 e5 d4 ed c3 dc Bc4 cb Bb2 Qe7 [ECO C21 Danish gambit] e4 e5 d4 ed c3 [ECO C21 Halasz gambit] e4 e5 d4 ed f4 [ECO C21 Centre game, Kieseritsky variation] e4 e5 d4 ed Nf3 c5 Bc4 b5 [ECO C21 Centre game] e4 e5 d4 ed [ECO C20 Alapin's opening] e4 e5 Ne2 [ECO C20 KP: Lopez opening] e4 e5 c3 [ECO C20 KP: Napoleon's opening] e4 e5 Qf3 [ECO C20 KP: Patzer opening] e4 e5 Qh5 [ECO C20 KP: King's head opening] e4 e5 f3 [ECO C20 KP: Mengarini's opening] e4 e5 a3 [ECO C20 KP: Indian opening] e4 e5 d3 [ECO C20 King's pawn game] e4 e5 [ECO B99 Sicilian: Najdorf, 7...Be7 main line] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 a6 Bg5 e6 f4 Be7 Qf3 Qc7 o-o-o N8d7 [ECO B98 Sicilian: Najdorf variation] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 a6 Bg5 e6 f4 Be7 Qf3 Qc7 [ECO B98 Sicilian: Najdorf, G\"oteborg variation] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 a6 Bg5 e6 f4 Be7 Qf3 h6 Bh4 g5 [ECO B98 Sicilian: Najdorf, Browne variation] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 a6 Bg5 e6 f4 Be7 Qf3 h6 Bh4 Qc7 [ECO B98 Sicilian: Najdorf, 7...Be7] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 a6 Bg5 e6 f4 Be7 [ECO B97 Sicilian: Najdorf, Poisoned pawn variation] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 a6 Bg5 e6 f4 Qb6 Qd2 Qb2 Rb1 Qa3 [ECO B97 Sicilian: Najdorf, 7...Qb6] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 a6 Bg5 e6 f4 Qb6 [ECO B96 Sicilian: Najdorf, Polugayevsky, Simagin variation] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 a6 Bg5 e6 f4 b5 e5 de fe Qc7 Qe2 [ECO B96 Sicilian: Najdorf, Polugayevsky variation] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 a6 Bg5 e6 f4 b5 [ECO B96 Sicilian: Najdorf, 7.f4] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 a6 Bg5 e6 f4 [ECO B95 Sicilian: Najdorf, 6...e6] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 a6 Bg5 e6 [ECO B94 Sicilian: Najdorf, Ivkov variation] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 a6 Bg5 N8d7 Bc4 Qa5 Qd2 e6 o-o-o b5 Bb3 Bb7 h1e1 Nc5 e5 [ECO B94 Sicilian: Najdorf, 6.Bg5] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 a6 Bg5 [ECO B93 Sicilian: Najdorf, 6.f4] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 a6 f4 [ECO B92 Sicilian: Najdorf, Opo\v censky variation] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 a6 Be2 [ECO B91 Sicilian: Najdorf, Zagreb variation] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 a6 g3 [ECO B90 Sicilian: Najdorf, Byrne attack] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 a6 Be3 [ECO B90 Sicilian: Najdorf, Lipnitzky attack] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 a6 Bc4 [ECO B90 Sicilian: Najdorf, Adams attack] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 a6 h3 [ECO B90 Sicilian: Najdorf] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 a6 [ECO B89 Sicilian: Velimirovi\'c attack] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 e6 Bc4 Nc6 Be3 Be7 Qe2 [ECO B89 Sicilian: Sozin, 7.Be3] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 e6 Bc4 Nc6 Be3 [ECO B88 Sicilian: Sozin, Fischer variation] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 e6 Bc4 Nc6 Bb3 Be7 Be3 o-o f4 [ECO B88 Sicilian: Sozin, Leonhardt variation] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 e6 Bc4 Nc6 [ECO B87 Sicilian: Sozin with ...a6 and ...b5] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 e6 Bc4 a6 Bb3 b5 [ECO B86 Sicilian: Sozin attack] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 e6 Bc4 [ECO B85 Sicilian: Scheveningen, classical main line] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 e6 Be2 a6 o-o Qc7 f4 Nc6 Be3 Be7 Qe1 o-o [ECO B85 Sicilian: Scheveningen, classical] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 e6 Be2 a6 o-o Qc7 f4 Nc6 Be3 [ECO B85 Sicilian: Scheveningen, classical, Mar\'oczy system] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 e6 Be2 a6 o-o Qc7 f4 Nc6 Kh1 Be7 a4 [ECO B85 Sicilian: Scheveningen, classical variation with ...Qc7 and ...Nc6] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 e6 Be2 a6 o-o Qc7 f4 Nc6 [ECO B84 Sicilian: Scheveningen , classical variation] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 e6 Be2 a6 o-o Qc7 [ECO B84 Sicilian: Scheveningen, classical, Nd7 system] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 e6 Be2 a6 o-o N8d7 [ECO B84 Sicilian: Scheveningen , classical variation] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 e6 Be2 a6 [ECO B83 Sicilian: modern Scheveningen, main line with Nb3] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 e6 Be2 Nc6 o-o Be7 Be3 o-o f4 Bd7 Nb3 [ECO B83 Sicilian: modern Scheveningen, main line] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 e6 Be2 Nc6 o-o Be7 Be3 o-o f4 [ECO B83 Sicilian: modern Scheveningen] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 e6 Be2 Nc6 [ECO B83 Sicilian: Scheveningen, 6.Be2] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 e6 Be2 [ECO B82 Sicilian: Scheveningen, Tal variation] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 e6 f4 Nc6 Be3 Be7 Qf3 [ECO B82 Sicilian: Scheveningen, 6.f4] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 e6 f4 [ECO B81 Sicilian: Scheveningen, Keres attack] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 e6 g4 [ECO B80 Sicilian: Scheveningen, fianchetto variation] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 e6 g3 [ECO B80 Sicilian: Scheveningen, Vitoli\'n\'s variation] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 e6 Bb5 [ECO B80 Sicilian: Scheveningen, English variation] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 e6 Be3 a6 Qd2 [ECO B80 Sicilian: Scheveningen variation] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 e6 [ECO B79 Sicilian: dragon, Yugoslav attack, 12.h4] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 g6 Be3 Bg7 f3 o-o Qd2 Nc6 Bc4 Bd7 o-o-o Qa5 Bb3 f8c8 h4 [ECO B78 Sicilian: dragon, Yugoslav attack, 10.O-O-O] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 g6 Be3 Bg7 f3 o-o Qd2 Nc6 Bc4 Bd7 o-o-o [ECO B77 Sicilian: dragon, Yugoslav attack, 9...Bd7] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 g6 Be3 Bg7 f3 o-o Qd2 Nc6 Bc4 Bd7 [ECO B77 Sicilian: dragon, Yugoslav attack, Byrne variation] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 g6 Be3 Bg7 f3 o-o Qd2 Nc6 Bc4 a5 [ECO B77 Sicilian: dragon, Yugoslav attack, 9.Bc4] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 g6 Be3 Bg7 f3 o-o Qd2 Nc6 Bc4 [ECO B76 Sicilian: dragon, Yugoslav attack, Rauser variation] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 g6 Be3 Bg7 f3 o-o Qd2 Nc6 o-o-o [ECO B76 Sicilian: dragon, Yugoslav attack, 7...O-O] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 g6 Be3 Bg7 f3 o-o [ECO B75 Sicilian: dragon, Yugoslav attack] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 g6 Be3 Bg7 f3 [ECO B74 Sicilian: dragon, classical, Alekhine variation] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 g6 Be3 Bg7 Be2 Nc6 o-o o-o Nb3 a5 [ECO B74 Sicilian: dragon, classical, R\'eti-Tartakower variation] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 g6 Be3 Bg7 Be2 Nc6 o-o o-o Nb3 Be6 f4 Qc8 [ECO B74 Sicilian: dragon, classical, Bernard defence] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 g6 Be3 Bg7 Be2 Nc6 o-o o-o Nb3 Be6 f4 Na5 f5 Bc4 Bd3 Bd3 cd d5 [ECO B74 Sicilian: dragon, classical, Spielmann variation] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 g6 Be3 Bg7 Be2 Nc6 o-o o-o Nb3 Be6 f4 Na5 f5 Bc4 Bd3 [ECO B74 Sicilian: dragon, classical, Stockholm attack] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 g6 Be3 Bg7 Be2 Nc6 o-o o-o Nb3 Be6 f4 Na5 f5 Bc4 Na5 Be2 Qe2 Qa5 g4 [ECO B74 Sicilian: dragon, classical, 9.Nb3] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 g6 Be3 Bg7 Be2 Nc6 o-o o-o Nb3 [ECO B73 Sicilian: dragon, classical, Richter variation] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 g6 Be3 Bg7 Be2 Nc6 o-o o-o Qd2 [ECO B73 Sicilian: dragon, classical, Zollner gambit] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 g6 Be3 Bg7 Be2 Nc6 o-o o-o f4 Qb6 e5 [ECO B73 Sicilian: dragon, classical, 8.O-O] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 g6 Be3 Bg7 Be2 Nc6 o-o [ECO B72 Sicilian: dragon, classical, Nottingham variation] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 g6 Be3 Bg7 Be2 Nc6 Nb3 [ECO B72 Sicilian: dragon, classical, Grigoriev variation] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 g6 Be3 Bg7 Be2 Nc6 Qd2 o-o o-o-o [ECO B72 Sicilian: dragon, classical, Amsterdam variation] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 g6 Be3 Bg7 Be2 Nc6 Qd2 [ECO B72 Sicilian: dragon, classical attack] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 g6 Be3 Bg7 Be2 [ECO B72 Sicilian: dragon, 6.Be3] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 g6 Be3 [ECO B71 Sicilian: dragon, Levenfish; Flohr variation] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 g6 f4 N8d7 [ECO B71 Sicilian: dragon, Levenfish variation] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 g6 f4 [ECO B70 Sicilian: dragon variation] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 g6 [ECO B69 Sicilian: Richter-Rauzer, Rauzer attack, 7...a6 defence, 11.Bxf6] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 Nc6 Bg5 e6 Qd2 a6 o-o-o Bd7 f4 Be7 Nf3 b5 Bf6 [ECO B68 Sicilian: Richter-Rauzer, Rauzer attack, 7...a6 defence, 9...Be7] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 Nc6 Bg5 e6 Qd2 a6 o-o-o Bd7 f4 Be7 [ECO B67 Sicilian: Richter-Rauzer, Rauzer attack, 7...a6 defence, 8...Bd7] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 Nc6 Bg5 e6 Qd2 a6 o-o-o Bd7 [ECO B66 Sicilian: Richter-Rauzer, Rauzer attack, 7...a6] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 Nc6 Bg5 e6 Qd2 a6 [ECO B65 Sicilian: Richter-Rauzer, Rauzer attack, 7...Be7 defence, 9...Nxd4] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 Nc6 Bg5 e6 Qd2 Be7 o-o-o o-o f4 Nd4 Qd4 [ECO B65 Sicilian: Richter-Rauzer, Rauzer attack, 7...Be7 defence, 9...Nxd4] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 Nc6 Bg5 e6 Qd2 Be7 o-o-o o-o f4 Nd4 [ECO B64 Sicilian: Richter-Rauzer, Rauzer attack, Geller variation] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 Nc6 Bg5 e6 Qd2 Be7 o-o-o o-o f4 e5 [ECO B64 Sicilian: Richter-Rauzer, Rauzer attack, 7...Be7 defence, 9.f4] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 Nc6 Bg5 e6 Qd2 Be7 o-o-o o-o f4 [ECO B63 Sicilian: Richter-Rauzer, Rauzer attack, 7...Be7] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 Nc6 Bg5 e6 Qd2 Be7 [ECO B63 Sicilian: Richter-Rauzer, Rauzer attack] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 Nc6 Bg5 e6 Qd2 [ECO B62 Sicilian: Richter-Rauzer, Keres variation] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 Nc6 Bg5 e6 Qd3 [ECO B62 Sicilian: Richter-Rauzer, Richter attack] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 Nc6 Bg5 e6 Nc6 [ECO B62 Sicilian: Richter-Rauzer, Margate variation] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 Nc6 Bg5 e6 Bb5 [ECO B62 Sicilian: Richter-Rauzer, Pod\v ebrady variation] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 Nc6 Bg5 e6 Nb3 [ECO B62 Sicilian: Richter-Rauzer, 6...e6] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 Nc6 Bg5 e6 [ECO B61 Sicilian: Richter-Rauzer, Larsen variation, 7.Qd2] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 Nc6 Bg5 Bd7 Qd2 [ECO B60 Sicilian: Richter-Rauzer, Larsen variation] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 Nc6 Bg5 Bd7 [ECO B60 Sicilian: Richter-Rauzer, Bondarevsky variation] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 Nc6 Bg5 g6 [ECO B60 Sicilian: Richter-Rauzer] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 Nc6 Bg5 [ECO B59 Sicilian: Boleslavsky variation, 7.Nb3] e4 c5 Nf3 Nc6 d4 cd Nd4 Nf6 Nc3 d6 Be2 e5 Nb3 [ECO B58 Sicilian: Boleslavsky, Louma variation] e4 c5 Nf3 Nc6 d4 cd Nd4 Nf6 Nc3 d6 Be2 e5 Nc6 [ECO B58 Sicilian: Boleslavsky variation] e4 c5 Nf3 Nc6 d4 cd Nd4 Nf6 Nc3 d6 Be2 e5 [ECO B58 Sicilian: classical] e4 c5 Nf3 Nc6 d4 cd Nd4 Nf6 Nc3 d6 Be2 [ECO B57 Sicilian: Sozin, Benk\"o variation] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 Nc6 Bc4 Qb6 [ECO B57 Sicilian: Magnus Smith trap] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 Nc6 Bc4 g6 Nc6 bc e5 [ECO B57 Sicilian: Sozin, not Scheveningen] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 Nc6 Bc4 [ECO B56 Sicilian] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 Nc6 [ECO B56 Sicilian: Venice attack] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 e5 Bb5 [ECO B56 Sicilian] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 [ECO B55 Sicilian: Prins variation, Venice attack] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 f3 e5 Bb5 [ECO B54 Sicilian: Prins variation] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 f3 [ECO B54 Sicilian] e4 c5 Nf3 d6 d4 cd Nd4 [ECO B53 Sicilian: Chekhover, Zaitsev variation] e4 c5 Nf3 d6 d4 cd Qd4 Nc6 Bb5 Qd7 [ECO B53 Sicilian, Chekhover variation] e4 c5 Nf3 d6 d4 cd Qd4 [ECO B?? Sicilian: Tartakower variation] e4 c5 Nf3 d6 d4 cd c3 [ECO B?? Sicilian] e4 c5 Nf3 d6 d4 cd [ECO B?? Sicilian: Cortlever variation] e4 c5 Nf3 d6 d4 Nf6 [ECO B52 Sicilian: Canal-Sokolsky attack, Sokolsky variation] e4 c5 Nf3 d6 Bb5 Bd7 Bd7 Qd7 c4 [ECO B52 Sicilian: Canal-Sokolsky attack, Bronstein gambit] e4 c5 Nf3 d6 Bb5 Bd7 Bd7 Qd7 o-o Nc6 c3 Nf6 d4 [ECO B52 Sicilian: Canal-Sokolsky attack, 3...Bd7] e4 c5 Nf3 d6 Bb5 Bd7 [ECO B51 Sicilian: Canal-Sokolsky attack] e4 c5 Nf3 d6 Bb5 [ECO B50 Sicilian: wing gambit deferred] e4 c5 Nf3 d6 b4 [ECO B50 Sicilian] e4 c5 Nf3 d6 [ECO B49 Sicilian: Taimanov variation] e4 c5 Nf3 e6 d4 cd Nd4 Nc6 Nc3 Qc7 Be3 a6 Be2 [ECO B48 Sicilian: Taimanov variation] e4 c5 Nf3 e6 d4 cd Nd4 Nc6 Nc3 Qc7 Be3 [ECO B47 Sicilian: Taimanov variation] e4 c5 Nf3 e6 d4 cd Nd4 Nc6 Nc3 Qc7 [ECO B46 Sicilian: Taimanov variation] e4 c5 Nf3 e6 d4 cd Nd4 Nc6 Nc3 a6 [ECO B45 Sicilian: Taimanov, American attack] e4 c5 Nf3 e6 d4 cd Nd4 Nc6 Nc3 Nf6 N4b5 Bb4 Nd6 [ECO B45 Sicilian: Taimanov variation] e4 c5 Nf3 e6 d4 cd Nd4 Nc6 Nc3 [ECO B44 Sicilian, Sz\'en variation, Dely-Kasparov gambit] e4 c5 Nf3 e6 d4 cd Nd4 Nc6 Nb5 d6 c4 Nf6 N1c3 a6 Na3 d5 [ECO B44 Sicilian, Sz\'en, hedgehog variation] e4 c5 Nf3 e6 d4 cd Nd4 Nc6 Nb5 d6 c4 Nf6 N1c3 a6 Na3 Be7 Be2 o-o o-o b6 [ECO B44 Sicilian, Sz\'en variation] e4 c5 Nf3 e6 d4 cd Nd4 Nc6 Nb5 [ECO B44 Sicilian defence] e4 c5 Nf3 e6 d4 cd Nd4 Nc6 [ECO B43 Sicilian: Kan, 5.Nc3] e4 c5 Nf3 e6 d4 cd Nd4 a6 Nc3 [ECO B42 Sicilian: Kan, Swiss cheese variation] e4 c5 Nf3 e6 d4 cd Nd4 a6 Bd3 g6 [ECO B42 Sicilian: Kan, Polugaievsky variation] e4 c5 Nf3 e6 d4 cd Nd4 a6 Bd3 Bc5 [ECO B42 Sicilian: Kan, Gipslis variation] e4 c5 Nf3 e6 d4 cd Nd4 a6 Bd3 Nf6 o-o d6 c4 g6 [ECO B42 Sicilian: Kan, 5.Bd3] e4 c5 Nf3 e6 d4 cd Nd4 a6 Bd3 [ECO B41 Sicilian: Kan, Mar\'oczy bind - Bronstein variation] e4 c5 Nf3 e6 d4 cd Nd4 a6 c4 Nf6 Nc3 Bb4 Bd3 Nc6 Bc2 [ECO B41 Sicilian: Kan, Mar\'oczy bind ] e4 c5 Nf3 e6 d4 cd Nd4 a6 c4 [ECO B41 Sicilian: Kan variation] e4 c5 Nf3 e6 d4 cd Nd4 a6 [ECO B40 Sicilian: Pin, Koch variation] e4 c5 Nf3 e6 d4 cd Nd4 Nf6 Nc3 Bb4 e5 [ECO B40 Sicilian: Pin, Jaffe variation] e4 c5 Nf3 e6 d4 cd Nd4 Nf6 Nc3 Bb4 Bd3 e5 [ECO B40 Sicilian: Pin variation ] e4 c5 Nf3 e6 d4 cd Nd4 Nf6 Nc3 Bb4 [ECO B40 Sicilian: Anderssen variation] e4 c5 Nf3 e6 d4 cd Nd4 Nf6 [ECO B40 Sicilian defence] e4 c5 Nf3 e6 d4 cd [ECO B40 Sicilian: Marshall variation] e4 c5 Nf3 e6 d4 d5 [ECO B40 Sicilian defence] e4 c5 Nf3 e6 [ECO B39 Sicilian: accelerated fianchetto, Breyer variation] e4 c5 Nf3 Nc6 d4 cd Nd4 g6 c4 Bg7 Be3 Nf6 Nc3 Ng4 [ECO B38 Sicilian: accelerated fianchetto, Mar\'oczy bind, 6.Be3] e4 c5 Nf3 Nc6 d4 cd Nd4 g6 c4 Bg7 Be3 [ECO B37 Sicilian: accelerated fianchetto, Simagin variation] e4 c5 Nf3 Nc6 d4 cd Nd4 g6 c4 Bg7 Nc2 d6 Be2 Nh6 [ECO B37 Sicilian: accelerated fianchetto, Mar\'oczy bind, 5...Bg7] e4 c5 Nf3 Nc6 d4 cd Nd4 g6 c4 Bg7 [ECO B36 Sicilian: accelerated fianchetto, Gurgenidze variation] e4 c5 Nf3 Nc6 d4 cd Nd4 g6 c4 Nf6 Nc3 Nd4 Qd4 d6 [ECO B36 Sicilian: accelerated fianchetto, Mar\'oczy bind] e4 c5 Nf3 Nc6 d4 cd Nd4 g6 c4 [ECO B35 Sicilian: accelerated fianchetto, modern variation with Bc4] e4 c5 Nf3 Nc6 d4 cd Nd4 g6 Nc3 Bg7 Be3 Nf6 Bc4 [ECO B34 Sicilian: accelerated fianchetto, modern variation] e4 c5 Nf3 Nc6 d4 cd Nd4 g6 Nc3 [ECO B34 Sicilian: accelerated fianchetto, exchange variation] e4 c5 Nf3 Nc6 d4 cd Nd4 g6 Nc6 [ECO B33 Sicilian: Sveshnikov variation] e4 c5 Nf3 Nc6 d4 cd Nd4 Nf6 Nc3 e5 N4b5 d6 Bg5 a6 Na3 b5 Bf6 gf Nd5 f5 [ECO B33 Sicilian: Pelikan, Chelyabinsk variation] e4 c5 Nf3 Nc6 d4 cd Nd4 Nf6 Nc3 e5 N4b5 d6 Bg5 a6 Na3 b5 [ECO B33 Sicilian: Pelikan, Bird variation] e4 c5 Nf3 Nc6 d4 cd Nd4 Nf6 Nc3 e5 N4b5 d6 Bg5 a6 Na3 Be6 [ECO B33 Sicilian: Pelikan variation] e4 c5 Nf3 Nc6 d4 cd Nd4 Nf6 Nc3 e5 [ECO B33 Sicilian defence] e4 c5 Nf3 Nc6 d4 cd Nd4 Nf6 [ECO B32 Sicilian: Labourdonnais-L\"owenthal variation] e4 c5 Nf3 Nc6 d4 cd Nd4 e5 Nb5 d6 [ECO B32 Sicilian: Labourdonnais-L\"owenthal variation] e4 c5 Nf3 Nc6 d4 cd Nd4 e5 [ECO B32 Sicilian: Nimzovich variation] e4 c5 Nf3 Nc6 d4 cd Nd4 d5 [ECO B32 Sicilian: Flohr variation] e4 c5 Nf3 Nc6 d4 cd Nd4 Qc7 [ECO B32 Sicilian defence] e4 c5 Nf3 Nc6 d4 [ECO B31 Sicilian: Nimzovich-Rossolimo attack, Gurgenidze variation] e4 c5 Nf3 Nc6 Bb5 g6 o-o Bg7 Re1 e5 b4 [ECO B31 Sicilian: Nimzovich-Rossolimo attack ] e4 c5 Nf3 Nc6 Bb5 g6 [ECO B30 Sicilian: Nimzovich-Rossolimo attack ] e4 c5 Nf3 Nc6 Bb5 [ECO B30 Sicilian defence] e4 c5 Nf3 Nc6 [ECO B29 Sicilian: Nimzovich-Rubinstein; Rubinstein counter-gambit] e4 c5 Nf3 Nf6 e5 Nd5 Nc3 e6 Nd5 ed d4 Nc6 [ECO B29 Sicilian: Nimzovich-Rubinstein variation] e4 c5 Nf3 Nf6 [ECO B28 Sicilian: O'Kelly variation] e4 c5 Nf3 a6 [ECO B27 Sicilian: Acton extension] e4 c5 Nf3 g6 c4 Bh6 [ECO B27 Sicilian: Hungarian variation] e4 c5 Nf3 g6 [ECO B27 Sicilian: Katalimov variation] e4 c5 Nf3 b6 [ECO B27 Sicilian: Quinteros variation] e4 c5 Nf3 Qc7 [ECO B27 Sicilian: Stiletto variation] e4 c5 Nf3 Qa5 [ECO B27 Sicilian defence] e4 c5 Nf3 [ECO B26 Sicilian: closed, 6.Be3] e4 c5 Nc3 Nc6 g3 g6 Bg2 Bg7 d3 d6 Be3 [ECO B25 Sicilian: closed, 6.f4 e5 ] e4 c5 Nc3 Nc6 g3 g6 Bg2 Bg7 d3 d6 f4 e5 [ECO B25 Sicilian: closed, 6.f4] e4 c5 Nc3 Nc6 g3 g6 Bg2 Bg7 d3 d6 f4 [ECO B25 Sicilian: closed, 6.Ne2 e5 ] e4 c5 Nc3 Nc6 g3 g6 Bg2 Bg7 d3 d6 N1e2 e5 [ECO B25 Sicilian: closed] e4 c5 Nc3 Nc6 g3 g6 Bg2 Bg7 d3 d6 [ECO B24 Sicilian: closed, Smyslov variation] e4 c5 Nc3 Nc6 g3 g6 Bg2 Bg7 d3 e6 Be3 Nd4 N3e2 [ECO B24 Sicilian: closed] e4 c5 Nc3 Nc6 g3 [ECO B23 Sicilian: Grand Prix attack, Schofman variation] e4 c5 Nc3 Nc6 f4 g6 Nf3 Bg7 Bc4 e6 f5 [ECO B23 Sicilian: Grand Prix attack] e4 c5 Nc3 Nc6 f4 [ECO B23 Sicilian: chameleon variation] e4 c5 Nc3 Nc6 N1e2 [ECO B23 Sicilian: closed, 2...Nc6] e4 c5 Nc3 Nc6 [ECO B23 Sicilian: closed, Korchnoi variation] e4 c5 Nc3 e6 g3 d5 [ECO B23 Sicilian: closed] e4 c5 Nc3 [ECO B22 Sicilian: 2.c3, Heidenfeld variation] e4 c5 c3 Nf6 e5 Nd5 Nf3 Nc6 Na3 [ECO B22 Sicilian: Alapin's variation ] e4 c5 c3 [ECO B21 Sicilian: Smith-Morra gambit, Chicago defence] e4 c5 d4 cd c3 dc Nc3 Nc6 Nf3 d6 Bc4 e6 o-o a6 Qe2 b5 Bb3 Ra7 [ECO B21 Sicilian: Smith-Morra gambit] e4 c5 d4 cd c3 [ECO B21 Sicilian: Andreaschek gambit] e4 c5 d4 cd Nf3 e5 c3 [ECO B21 Sicilian: Smith-Morra gambit] e4 c5 d4 [ECO B21 Sicilian: Grand Prix attack] e4 c5 f4 [ECO B20 Sicilian: Keres variation ] e4 c5 Ne2 [ECO B20 Sicilian: wing gambit, Carlsbad variation] e4 c5 b4 cb a3 ba [ECO B20 Sicilian: wing gambit, Marienbad variation] e4 c5 b4 cb a3 d5 ed Qd5 Bb2 [ECO B20 Sicilian: wing gambit, Marshall variation] e4 c5 b4 cb a3 [ECO B20 Sicilian: wing gambit, Santasiere variation] e4 c5 b4 cb c4 [ECO B20 Sicilian: wing gambit] e4 c5 b4 [ECO B20 Sicilian: Steinitz variation] e4 c5 g3 [ECO B20 Sicilian: Gloria variation] e4 c5 c4 d6 Nc3 Nc6 g3 h5 [ECO B20 Sicilian defence] e4 c5 [ECO C19 French: Winawer, advance, positional main line] e4 e6 d4 d5 Nc3 Bb4 e5 c5 a3 Bc3 bc Ne7 Nf3 [ECO C19 French: Winawer, advance, Smyslov variation] e4 e6 d4 d5 Nc3 Bb4 e5 c5 a3 Bc3 bc Ne7 a4 [ECO C18 French: Winawer, advance, poisoned pawn, Konstantinopolsky variation] e4 e6 d4 d5 Nc3 Bb4 e5 c5 a3 Bc3 bc Ne7 Qg4 Qc7 Qg7 Rg8 Qh7 cd Ne2 [ECO C18 French: Winawer, advance, poisoned pawn, Euwe-Gligori\'c variation] e4 e6 d4 d5 Nc3 Bb4 e5 c5 a3 Bc3 bc Ne7 Qg4 Qc7 Qg7 Rg8 Qh7 cd Kd1 [ECO C18 French: Winawer, advance, poisoned pawn variation] e4 e6 d4 d5 Nc3 Bb4 e5 c5 a3 Bc3 bc Ne7 Qg4 [ECO C18 French: Winawer, advance, 6...Ne7] e4 e6 d4 d5 Nc3 Bb4 e5 c5 a3 Bc3 bc Ne7 [ECO C18 French: Winawer, classical variation] e4 e6 d4 d5 Nc3 Bb4 e5 c5 a3 Bc3 bc Qc7 [ECO C18 French: Winawer, advance variation] e4 e6 d4 d5 Nc3 Bb4 e5 c5 a3 Bc3 bc [ECO C17 French: Winawer, advance, Rauzer variation] e4 e6 d4 d5 Nc3 Bb4 e5 c5 a3 cd ab dc Nf3 [ECO C17 French: Winawer, advance, 5.a3] e4 e6 d4 d5 Nc3 Bb4 e5 c5 a3 [ECO C17 French: Winawer, advance, Russian variation] e4 e6 d4 d5 Nc3 Bb4 e5 c5 Qg4 [ECO C17 French: Winawer, advance, Bogolyubov variation] e4 e6 d4 d5 Nc3 Bb4 e5 c5 Bd2 [ECO C17 French: Winawer, advance variation] e4 e6 d4 d5 Nc3 Bb4 e5 c5 [ECO C16 French: Winawer, Petrosian variation] e4 e6 d4 d5 Nc3 Bb4 e5 Qd7 [ECO C16 French: Winawer, advance variation] e4 e6 d4 d5 Nc3 Bb4 e5 [ECO C15 French: Winawer, Alekhine gambit, Kan variation] e4 e6 d4 d5 Nc3 Bb4 Ne2 de a3 Bc3 Nc3 Nc6 [ECO C15 French: Winawer, Alekhine gambit] e4 e6 d4 d5 Nc3 Bb4 Ne2 de a3 Bc3 [ECO C15 French: Winawer, Alekhine gambit, Alatortsev variation] e4 e6 d4 d5 Nc3 Bb4 Ne2 de a3 Be7 Ne4 Nf6 N2g3 o-o Be2 Nc6 [ECO C15 French: Winawer, Alekhine gambit] e4 e6 d4 d5 Nc3 Bb4 Ne2 [ECO C15 French: Winawer, fingerslip variation] e4 e6 d4 d5 Nc3 Bb4 Bd2 [ECO C15 French: Winawer, Kondratiyev variation] e4 e6 d4 d5 Nc3 Bb4 Bd3 c5 ed Qd5 Bd2 [ECO C15 French: Winawer variation] e4 e6 d4 d5 Nc3 Bb4 [ECO C14 French: classical, St\a hlberg variation] e4 e6 d4 d5 Nc3 Nf6 Bg5 Be7 e5 N6d7 Be7 Qe7 f4 o-o Nf3 c5 Qd2 Nc6 o-o-o c4 [ECO C14 French: classical, Steinitz variation] e4 e6 d4 d5 Nc3 Nf6 Bg5 Be7 e5 N6d7 Be7 Qe7 f4 [ECO C14 French: classical, Pollock variation] e4 e6 d4 d5 Nc3 Nf6 Bg5 Be7 e5 N6d7 Be7 Qe7 Qg4 [ECO C14 French: classical, Alapin variation] e4 e6 d4 d5 Nc3 Nf6 Bg5 Be7 e5 N6d7 Be7 Qe7 Nb5 [ECO C14 French: classical, Rubinstein variation] e4 e6 d4 d5 Nc3 Nf6 Bg5 Be7 e5 N6d7 Be7 Qe7 Qd2 [ECO C14 French: classical, Tarrasch variation] e4 e6 d4 d5 Nc3 Nf6 Bg5 Be7 e5 N6d7 Be7 Qe7 Bd3 [ECO C14 French: classical variation] e4 e6 d4 d5 Nc3 Nf6 Bg5 Be7 e5 N6d7 Be7 Qe7 [ECO C13 French: Albin-Alekhine-Ch\^atard attack, Spielmann variation] e4 e6 d4 d5 Nc3 Nf6 Bg5 Be7 e5 N6d7 h4 o-o [ECO C13 French: Albin-Alekhine-Ch\^atard attack, Teichmann variation] e4 e6 d4 d5 Nc3 Nf6 Bg5 Be7 e5 N6d7 h4 f6 [ECO C13 French: Albin-Alekhine-Ch\^atard attack, Breyer variation] e4 e6 d4 d5 Nc3 Nf6 Bg5 Be7 e5 N6d7 h4 c5 [ECO C13 French: Albin-Alekhine-Ch\^atard attack, Mar\'oczy variation] e4 e6 d4 d5 Nc3 Nf6 Bg5 Be7 e5 N6d7 h4 a6 [ECO C13 French: Albin-Alekhine-Ch\^atard attack] e4 e6 d4 d5 Nc3 Nf6 Bg5 Be7 e5 N6d7 h4 [ECO C13 French: classical, Tartakower variation] e4 e6 d4 d5 Nc3 Nf6 Bg5 Be7 e5 Ne4 [ECO C13 French: classical, Frankfurt variation] e4 e6 d4 d5 Nc3 Nf6 Bg5 Be7 e5 Ng8 Be3 b6 [ECO C13 French: classical, Vistaneckis variation] e4 e6 d4 d5 Nc3 Nf6 Bg5 Be7 e5 Ng8 [ECO C13 French: classical, Anderssen-Richter variation] e4 e6 d4 d5 Nc3 Nf6 Bg5 Be7 Bf6 Bf6 e5 Be7 Qg4 [ECO C13 French: classical, Anderssen variation] e4 e6 d4 d5 Nc3 Nf6 Bg5 Be7 Bf6 [ECO C13 French: classical] e4 e6 d4 d5 Nc3 Nf6 Bg5 Be7 [ECO C12 French: MacCutcheon, Lasker variation, 8...g6] e4 e6 d4 d5 Nc3 Nf6 Bg5 Bb4 e5 h6 Bd2 Bc3 bc Ne4 Qg4 g6 [ECO C12 French: MacCutcheon, Duras variation] e4 e6 d4 d5 Nc3 Nf6 Bg5 Bb4 e5 h6 Bd2 Bc3 bc Ne4 Qg4 Kf8 Bc1 [ECO C12 French: MacCutcheon, Lasker variation] e4 e6 d4 d5 Nc3 Nf6 Bg5 Bb4 e5 h6 Bd2 Bc3 [ECO C12 French: MacCutcheon, Tartakower variation] e4 e6 d4 d5 Nc3 Nf6 Bg5 Bb4 e5 h6 Bd2 N6d7 [ECO C12 French: MacCutcheon, Dr. Olland variation] e4 e6 d4 d5 Nc3 Nf6 Bg5 Bb4 e5 h6 Bc1 [ECO C12 French: MacCutcheon, Janowski variation] e4 e6 d4 d5 Nc3 Nf6 Bg5 Bb4 e5 h6 Be3 [ECO C12 French: MacCutcheon, Bernstein variation] e4 e6 d4 d5 Nc3 Nf6 Bg5 Bb4 e5 h6 Bh4 [ECO C12 French: MacCutcheon, Grigoriev variation] e4 e6 d4 d5 Nc3 Nf6 Bg5 Bb4 e5 h6 ef hg fg Rg8 h4 gh Qg4 [ECO C12 French: MacCutcheon, Chigorin variation] e4 e6 d4 d5 Nc3 Nf6 Bg5 Bb4 e5 h6 ef [ECO C12 French: MacCutcheon, advance variation] e4 e6 d4 d5 Nc3 Nf6 Bg5 Bb4 e5 [ECO C12 French: MacCutcheon, Bogolyubov variation] e4 e6 d4 d5 Nc3 Nf6 Bg5 Bb4 ed Qd5 Bf6 gf Qd2 Qa5 [ECO C12 French: MacCutcheon variation] e4 e6 d4 d5 Nc3 Nf6 Bg5 Bb4 [ECO C11 French: Burn variation] e4 e6 d4 d5 Nc3 Nf6 Bg5 de [ECO C11 French: Steinitz, Gledhill attack] e4 e6 d4 d5 Nc3 Nf6 e5 N6d7 Qg4 [ECO C11 French: Steinitz, Boleslavsky variation] e4 e6 d4 d5 Nc3 Nf6 e5 N6d7 f4 c5 Nf3 Nc6 Be3 [ECO C11 French: Steinitz variation] e4 e6 d4 d5 Nc3 Nf6 e5 N6d7 f4 c5 Nf3 [ECO C11 French: Steinitz, Brodsky-Jones variation] e4 e6 d4 d5 Nc3 Nf6 e5 N6d7 f4 c5 dc Nc6 a3 Bc5 Qg4 o-o Nf3 f6 [ECO C11 French: Steinitz variation] e4 e6 d4 d5 Nc3 Nf6 e5 N6d7 f4 c5 dc Nc6 [ECO C11 French: Steinitz, Bradford attack] e4 e6 d4 d5 Nc3 Nf6 e5 N6d7 f4 c5 dc Bc5 Qg4 [ECO C11 French: Steinitz variation] e4 e6 d4 d5 Nc3 Nf6 e5 [ECO C11 French: Henneberger variation] e4 e6 d4 d5 Nc3 Nf6 Be3 [ECO C11 French: Swiss variation] e4 e6 d4 d5 Nc3 Nf6 Bd3 [ECO C11 French defence] e4 e6 d4 d5 Nc3 Nf6 [ECO C10 French: Frere variation] e4 e6 d4 d5 Nc3 de Ne4 Qd5 [ECO C10 French: Rubinstein, Capablanca line] e4 e6 d4 d5 Nc3 de Ne4 Nd7 Nf3 N8f6 Nf6 Nf6 Ne5 [ECO C10 French: Rubinstein variation] e4 e6 d4 d5 Nc3 de Ne4 Nd7 [ECO C10 French: Fort Knox variation] e4 e6 d4 d5 Nc3 de Ne4 Bd7 Nf3 Bc6 [ECO C10 French: Rubinstein variation] e4 e6 d4 d5 Nc3 de [ECO C10 French: Marshall variation] e4 e6 d4 d5 Nc3 c5 [ECO C10 French: Paulsen variation] e4 e6 d4 d5 Nc3 [ECO C09 French: Tarrasch, open variation, main line] e4 e6 d4 d5 Nd2 c5 ed ed N1f3 Nc6 [ECO C08 French: Tarrasch, open, 4.ed ed] e4 e6 d4 d5 Nd2 c5 ed ed [ECO C07 French: Tarrasch, Eliskases variation] e4 e6 d4 d5 Nd2 c5 ed Qd5 N1f3 cd Bc4 Qd8 [ECO C07 French: Tarrasch, open variation] e4 e6 d4 d5 Nd2 c5 [ECO C06 French: Tarrasch, Leningrad variation] e4 e6 d4 d5 Nd2 Nf6 e5 N6d7 Bd3 c5 c3 Nc6 Ne2 cd cd Nb6 [ECO C06 French: Tarrasch, closed variation, main line] e4 e6 d4 d5 Nd2 Nf6 e5 N6d7 Bd3 c5 c3 Nc6 Ne2 cd cd [ECO C05 French: Tarrasch, closed variation] e4 e6 d4 d5 Nd2 Nf6 e5 N6d7 Bd3 c5 c3 Nc6 [ECO C05 French: Tarrasch, Botvinnik variation] e4 e6 d4 d5 Nd2 Nf6 e5 N6d7 Bd3 c5 c3 b6 [ECO C05 French: Tarrasch, closed variation] e4 e6 d4 d5 Nd2 Nf6 [ECO C04 French: Tarrasch, Guimard main line] e4 e6 d4 d5 Nd2 Nc6 N1f3 Nf6 [ECO C03 French: Tarrasch, Guimard variation] e4 e6 d4 d5 Nd2 Nc6 [ECO C03 French: Tarrasch, Haberditz variation] e4 e6 d4 d5 Nd2 f5 [ECO C03 French: Tarrasch] e4 e6 d4 d5 Nd2 [ECO C02 French: advance, Euwe variation] e4 e6 d4 d5 e5 c5 c3 Nc6 Nf3 Bd7 [ECO C02 French: advance, Milner-Barry gambit] e4 e6 d4 d5 e5 c5 c3 Nc6 Nf3 Qb6 Bd3 [ECO C02 French: advance, Paulsen attack] e4 e6 d4 d5 e5 c5 c3 Nc6 Nf3 [ECO C02 French: advance variation] e4 e6 d4 d5 e5 c5 c3 Nc6 [ECO C02 French: advance, Wade variation] e4 e6 d4 d5 e5 c5 c3 Qb6 Nf3 Bd7 [ECO C02 French: advance variation] e4 e6 d4 d5 e5 c5 c3 [ECO C02 French: advance, Nimzovich system] e4 e6 d4 d5 e5 c5 Nf3 [ECO C02 French: advance, Nimzovich variation] e4 e6 d4 d5 e5 c5 Qg4 [ECO C02 French: advance, Steinitz variation] e4 e6 d4 d5 e5 c5 dc [ECO C02 French: advance variation] e4 e6 d4 d5 e5 [ECO C01 French: exchange, Bogolyubov variation] e4 e6 d4 d5 ed ed Nc3 Nf6 Bg5 Nc6 [ECO C01 French: exchange, Svenonius variation] e4 e6 d4 d5 ed ed Nc3 Nf6 Bg5 [ECO C01 French: exchange variation] e4 e6 d4 d5 ed [ECO C00 French: Alapin variation] e4 e6 d4 d5 Be3 [ECO C00 French: Schlechter variation] e4 e6 d4 d5 Bd3 [ECO C00 French defence] e4 e6 d4 d5 [ECO C00 St. George defence] e4 e6 d4 a6 [ECO C00 Lengfellner system] e4 e6 d4 d6 [ECO C00 French defence] e4 e6 d4 [ECO C00 French: Reversed Philidor formation] e4 e6 d3 d5 Nd2 Nf6 N1f3 Nc6 Be2 [ECO C00 French: King's Indian attack] e4 e6 d3 [ECO C00 French: Chigorin variation] e4 e6 Qe2 [ECO C00 French: Two knights variation] e4 e6 Nc3 d5 Nf3 [ECO C00 French: Pelikan variation] e4 e6 Nc3 d5 f4 [ECO C00 French defence] e4 e6 Nc3 [ECO C00 French: Wing gambit] e4 e6 Nf3 d5 e5 c5 b4 [ECO C00 French defence] e4 e6 Nf3 [ECO C00 French: Labourdonnais variation] e4 e6 f4 [ECO C00 French: Steinitz attack] e4 e6 e5 [ECO C00 French: R\'eti variation] e4 e6 b3 [ECO C00 French defence, Steiner variation] e4 e6 c4 [ECO C00 French defence] e4 e6 [ECO B19 Caro-Kann: classical, Spassky variation] e4 c6 d4 d5 Nc3 de Ne4 Bf5 Ng3 Bg6 h4 h6 Nf3 Nd7 h5 [ECO B19 Caro-Kann: classical, 7...Nd7] e4 c6 d4 d5 Nc3 de Ne4 Bf5 Ng3 Bg6 h4 h6 Nf3 Nd7 [ECO B18 Caro-Kann: classical, 6.h4] e4 c6 d4 d5 Nc3 de Ne4 Bf5 Ng3 Bg6 h4 [ECO B18 Caro-Kann: classical, Mar\'oczy attack] e4 c6 d4 d5 Nc3 de Ne4 Bf5 Ng3 Bg6 f4 [ECO B18 Caro-Kann: classical, Flohr variation] e4 c6 d4 d5 Nc3 de Ne4 Bf5 Ng3 Bg6 Nh3 [ECO B18 Caro-Kann: classical variation] e4 c6 d4 d5 Nc3 de Ne4 Bf5 [ECO B17 Caro-Kann: Steinitz variation] e4 c6 d4 d5 Nc3 de Ne4 Nd7 [ECO B16 Caro-Kann: Bronstein-Larsen variation] e4 c6 d4 d5 Nc3 de Ne4 Nf6 Nf6 gf [ECO B15 Caro-Kann: Forg\'acs variation] e4 c6 d4 d5 Nc3 de Ne4 Nf6 Nf6 ef Bc4 [ECO B15 Caro-Kann: Tartakower variation] e4 c6 d4 d5 Nc3 de Ne4 Nf6 Nf6 ef [ECO B15 Caro-Kann: Alekhine gambit] e4 c6 d4 d5 Nc3 de Ne4 Nf6 Bd3 [ECO B15 Caro-Kann defence] e4 c6 d4 d5 Nc3 de Ne4 [ECO B15 Caro-Kann: Rasa-Studier gambit] e4 c6 d4 d5 Nc3 de f3 [ECO B15 Caro-Kann: Gurgenidze system] e4 c6 d4 d5 Nc3 g6 [ECO B15 Caro-Kann: Gurgenidze counter-attack] e4 c6 d4 d5 Nc3 b5 [ECO B15 Caro-Kann defence] e4 c6 d4 d5 Nc3 [ECO B14 Caro-Kann: Panov-Botvinnik attack, 5...g6] e4 c6 d4 d5 ed cd c4 Nf6 Nc3 g6 [ECO B14 Caro-Kann: Panov-Botvinnik attack, 5...e6] e4 c6 d4 d5 ed cd c4 Nf6 Nc3 e6 [ECO B13 Caro-Kann: Panov-Botvinnik, Reifir variation] e4 c6 d4 d5 ed cd c4 Nf6 Nc3 Nc6 Bg5 Qb6 [ECO B13 Caro-Kann: Panov-Botvinnik, Czerniak variation] e4 c6 d4 d5 ed cd c4 Nf6 Nc3 Nc6 Bg5 Qa5 [ECO B13 Caro-Kann: Panov-Botvinnik, normal variation] e4 c6 d4 d5 ed cd c4 Nf6 Nc3 Nc6 Bg5 e6 [ECO B13 Caro-Kann: Panov-Botvinnik, Herzog defence] e4 c6 d4 d5 ed cd c4 Nf6 Nc3 Nc6 Bg5 dc d5 Na5 [ECO B13 Caro-Kann: Panov-Botvinnik attack] e4 c6 d4 d5 ed cd c4 Nf6 Nc3 [ECO B13 Caro-Kann: Panov-Botvinnik, Gunderam attack] e4 c6 d4 d5 ed cd c4 Nf6 c5 [ECO B13 Caro-Kann: Panov-Botvinnik attack] e4 c6 d4 d5 ed cd c4 [ECO B13 Caro-Kann: exchange, Rubinstein variation] e4 c6 d4 d5 ed cd Bd3 Nc6 c3 Nf6 Bf4 [ECO B13 Caro-Kann: exchange variation] e4 c6 d4 d5 ed [ECO B12 Caro-Kann: advance, Short variation] e4 c6 d4 d5 e5 Bf5 c3 e6 Be2 [ECO B12 Caro-Kann: advance variation] e4 c6 d4 d5 e5 [ECO B12 Caro-Kann: Edinburgh variation] e4 c6 d4 d5 Nd2 Qb6 [ECO B12 Caro-Kann: 3.Nd2] e4 c6 d4 d5 Nd2 [ECO B12 Caro-Kann: Tartakower variation] e4 c6 d4 d5 f3 [ECO B12 Caro-Kann defence] e4 c6 d4 d5 [ECO B12 Caro-Masi defence] e4 c6 d4 Nf6 [ECO B12 de Bruycker defence] e4 c6 d4 Na6 Nc3 Nc7 [ECO B12 Caro-Kann defence] e4 c6 d4 [ECO B11 Caro-Kann: two knights, 3...Bg4] e4 c6 Nc3 d5 Nf3 Bg4 [ECO B10 Caro-Kann: two knights variation] e4 c6 Nc3 d5 Nf3 [ECO B10 Caro-Kann: Goldman variation] e4 c6 Nc3 d5 Qf3 [ECO B10 Caro-Kann defence] e4 c6 Nc3 [ECO B10 Caro-Kann: closed variation] e4 c6 d3 [ECO B10 Caro-Kann: anti-anti-Caro-Kann defence] e4 c6 c4 d5 [ECO B10 Caro-Kann: anti-Caro-Kann defence] e4 c6 c4 [ECO B10 Caro-Kann: Hillbilly attack] e4 c6 Bc4 [ECO B10 Caro-Kann defence] e4 c6 [ECO B09 Pirc: Austrian attack, Ljubojevi\'c variation] e4 d6 d4 Nf6 Nc3 g6 f4 Bg7 Bc4 [ECO B09 Pirc: Austrian attack, dragon formation] e4 d6 d4 Nf6 Nc3 g6 f4 Bg7 Nf3 c5 [ECO B09 Pirc: Austrian attack, 6.Bd3] e4 d6 d4 Nf6 Nc3 g6 f4 Bg7 Nf3 o-o Bd3 [ECO B09 Pirc: Austrian attack, 6.Be3] e4 d6 d4 Nf6 Nc3 g6 f4 Bg7 Nf3 o-o Be3 [ECO B09 Pirc: Austrian attack, 6.e5] e4 d6 d4 Nf6 Nc3 g6 f4 Bg7 Nf3 o-o e5 [ECO B09 Pirc: Austrian attack] e4 d6 d4 Nf6 Nc3 g6 f4 Bg7 Nf3 o-o [ECO B09 Pirc: Austrian attack] e4 d6 d4 Nf6 Nc3 g6 f4 [ECO B08 Pirc: classical system, 5.Be2] e4 d6 d4 Nf6 Nc3 g6 Nf3 Bg7 Be2 [ECO B08 Pirc: classical, h3 system] e4 d6 d4 Nf6 Nc3 g6 Nf3 Bg7 h3 [ECO B08 Pirc: classical system] e4 d6 d4 Nf6 Nc3 g6 Nf3 Bg7 [ECO B?? Pirc: classical system] e4 d6 d4 Nf6 Nc3 g6 Nf3 [ECO B07 Pirc: bayonet attack] e4 d6 d4 Nf6 Nc3 g6 Be2 Bg7 h4 [ECO B07 Pirc: Chinese variation] e4 d6 d4 Nf6 Nc3 g6 Be2 Bg7 g4 [ECO B07 Pirc defence] e4 d6 d4 Nf6 Nc3 g6 Be2 [ECO B07 Pirc: Byrne variation] e4 d6 d4 Nf6 Nc3 g6 Bg5 [ECO B07 Pirc: Holmov system] e4 d6 d4 Nf6 Nc3 g6 Bc4 [ECO B07 Pirc: Sveshnikov system] e4 d6 d4 Nf6 Nc3 g6 g3 [ECO B07 Pirc: 150 attack] e4 d6 d4 Nf6 Nc3 g6 Be3 c6 Qd2 [ECO B07 Pirc defence] e4 d6 d4 Nf6 Nc3 g6 [ECO B07 Pirc: Ufimtsev-Pytel variation] e4 d6 d4 Nf6 Nc3 c6 [ECO B07 Pirc defence] e4 d6 d4 Nf6 [ECO A82 Balogh defence] e4 d6 d4 f5 [ECO C00 Lengfellner system] e4 d6 d4 e6 [ECO B06 Robatsch defence: Pseudo-Austrian attack] e4 g6 d4 Bg7 Nc3 d6 f4 [ECO B06 Robatsch defence: two knights, Suttles variation] e4 g6 d4 Bg7 Nc3 d6 Nf3 c6 [ECO B06 Robatsch defence: two knights variation] e4 g6 d4 Bg7 Nc3 d6 Nf3 [ECO B06 Robatsch defence] e4 g6 d4 Bg7 Nc3 d6 [ECO B06 Robatsch defence: Gurgenidze variation] e4 g6 d4 Bg7 Nc3 c6 f4 d5 e5 h5 [ECO B06 Robatsch defence] e4 g6 d4 Bg7 Nc3 [ECO B06 Robatsch defence: three pawns attack] e4 g6 d4 Bg7 f4 [ECO B07 Robatsch defence: Geller's system] e4 g6 d4 Bg7 Nf3 d6 c3 [ECO A41 Robatsch defence: Rossolimo variation] e4 g6 d4 Bg7 Nf3 d6 c4 Bg4 [ECO B06 Robatsch defence] e4 g6 d4 Bg7 [ECO B06 Norwegian defence] e4 g6 d4 Nf6 e5 Nh5 g4 Ng7 [ECO B06 Robatsch defence] e4 g6 [ECO B05 Alekhine's defence: modern, Vitolins attack] e4 Nf6 e5 Nd5 d4 d6 Nf3 Bg4 c4 Nb6 d5 [ECO B05 Alekhine's defence: modern, Alekhine variation] e4 Nf6 e5 Nd5 d4 d6 Nf3 Bg4 c4 [ECO B05 Alekhine's defence: modern, Panov variation] e4 Nf6 e5 Nd5 d4 d6 Nf3 Bg4 h3 [ECO B05 Alekhine's defence: modern, Flohr variation] e4 Nf6 e5 Nd5 d4 d6 Nf3 Bg4 Be2 c6 [ECO B05 Alekhine's defence: modern variation, 4...Bg4] e4 Nf6 e5 Nd5 d4 d6 Nf3 Bg4 [ECO B04 Alekhine's defence: modern, Keres variation] e4 Nf6 e5 Nd5 d4 d6 Nf3 g6 Bc4 Nb6 Bb3 Bg7 a4 [ECO B04 Alekhine's defence: modern, fianchetto variation] e4 Nf6 e5 Nd5 d4 d6 Nf3 g6 [ECO B04 Alekhine's defence: modern, Schmid variation] e4 Nf6 e5 Nd5 d4 d6 Nf3 Nb6 [ECO B04 Alekhine's defence: modern, Larsen variation] e4 Nf6 e5 Nd5 d4 d6 Nf3 de [ECO B04 Alekhine's defence: modern variation] e4 Nf6 e5 Nd5 d4 d6 Nf3 [ECO B03 Alekhine's defence: four pawns attack, Trifunovi\'c variation] e4 Nf6 e5 Nd5 d4 d6 c4 Nb6 f4 Bf5 [ECO B03 Alekhine's defence: four pawns attack, fianchetto variation] e4 Nf6 e5 Nd5 d4 d6 c4 Nb6 f4 g6 [ECO B03 Alekhine's defence: four pawns attack, Planinc variation] e4 Nf6 e5 Nd5 d4 d6 c4 Nb6 f4 g5 [ECO B03 Alekhine's defence: four pawns attack, Tartakower variation] e4 Nf6 e5 Nd5 d4 d6 c4 Nb6 f4 de fe Nc6 Be3 Bf5 Nc3 e6 Nf3 Qd7 Be2 o-o-o o-o Be7 [ECO B03 Alekhine's defence: four pawns attack, 7.Be3] e4 Nf6 e5 Nd5 d4 d6 c4 Nb6 f4 de fe Nc6 Be3 [ECO B03 Alekhine's defence: four pawns attack, Ilyin-Genevsky variation] e4 Nf6 e5 Nd5 d4 d6 c4 Nb6 f4 de fe Nc6 Nf3 Bg4 e6 fe c5 [ECO B03 Alekhine's defence: four pawns attack, 6...Nc6] e4 Nf6 e5 Nd5 d4 d6 c4 Nb6 f4 de fe Nc6 [ECO B03 Alekhine's defence: four pawns attack, Korchnoi variation] e4 Nf6 e5 Nd5 d4 d6 c4 Nb6 f4 de fe Bf5 Nc3 e6 Nf3 Be7 Be2 o-o o-o f6 [ECO B03 Alekhine's defence: four pawns attack] e4 Nf6 e5 Nd5 d4 d6 c4 Nb6 f4 [ECO B03 Alekhine's defence: exchange, Karpov variation] e4 Nf6 e5 Nd5 d4 d6 c4 Nb6 ed cd Nf3 g6 Be2 Bg7 o-o o-o h3 Nc6 Nc3 Bf5 Bf4 [ECO B03 Alekhine's defence: exchange variation] e4 Nf6 e5 Nd5 d4 d6 c4 Nb6 ed [ECO B03 Alekhine's defence] e4 Nf6 e5 Nd5 d4 d6 c4 [ECO B03 Alekhine's defence: Balogh variation] e4 Nf6 e5 Nd5 d4 d6 Bc4 [ECO B03 Alekhine's defence] e4 Nf6 e5 Nd5 d4 d6 [ECO B03 Alekhine's defence: O'Sullivan gambit] e4 Nf6 e5 Nd5 d4 b5 [ECO B03 Alekhine's defence] e4 Nf6 e5 Nd5 d4 [ECO B02 Alekhine's defence: two pawns' attack, Mikenas variation] e4 Nf6 e5 Nd5 c4 Nb6 c5 Nd5 Bc4 e6 Nc3 d6 [ECO B02 Alekhine's defence: two pawns' attack] e4 Nf6 e5 Nd5 c4 Nb6 c5 [ECO B02 Alekhine's defence: Steiner variation] e4 Nf6 e5 Nd5 c4 Nb6 b3 [ECO B02 Alekhine's defence] e4 Nf6 e5 Nd5 c4 [ECO B02 Alekhine's defence: Welling variation] e4 Nf6 e5 Nd5 b3 [ECO B02 Alekhine's defence: S\"amisch attack] e4 Nf6 e5 Nd5 Nc3 [ECO B02 Alekhine's defence: Kmoch variation] e4 Nf6 e5 Nd5 Bc4 Nb6 Bb3 c5 d3 [ECO B02 Alekhine's defence] e4 Nf6 e5 Nd5 [ECO B02 Alekhine's defence: Brooklyn defence] e4 Nf6 e5 Ng8 [ECO B02 Alekhine's defence: Mokele Mbembe variation] e4 Nf6 e5 Ne4 [ECO B02 Alekhine's defence: Krejcik variation] e4 Nf6 Bc4 [ECO B02 Alekhine's defence: Mar\'oczy variation] e4 Nf6 d3 [ECO B02 Alekhine's defence: Spielmann variation] e4 Nf6 Nc3 d5 e5 N6d7 e6 [ECO B02 Alekhine's defence: Scandinavian variation] e4 Nf6 Nc3 d5 [ECO B02 Alekhine's defence] e4 Nf6 [ECO B01 Scandinavian: Richter variation] e4 d5 ed Nf6 d4 g6 [ECO B01 Scandinavian: Kiel variation] e4 d5 ed Nf6 d4 Nd5 c4 Nb4 [ECO B01 Scandinavian: Marshall variation] e4 d5 ed Nf6 d4 Nd5 [ECO B01 Scandinavian defence] e4 d5 ed Nf6 d4 [ECO B01 Scandinavian gambit] e4 d5 ed Nf6 c4 c6 [ECO B01 Scandinavian: Icelandic gambit] e4 d5 ed Nf6 c4 e6 [ECO B01 Scandinavian defence] e4 d5 ed Nf6 [ECO B01 Scandinavian: Pytel-Wade variation] e4 d5 ed Qd5 Nc3 Qd6 [ECO B01 Scandinavian, Mieses-Kotr\v c gambit] e4 d5 ed Qd5 Nc3 Qa5 b4 [ECO B01 Scandinavian: Anderssen counter-attack, Collijn variation] e4 d5 ed Qd5 Nc3 Qa5 d4 e5 Nf3 Bg4 [ECO B01 Scandinavian: Anderssen counter-attack, Goteborg system] e4 d5 ed Qd5 Nc3 Qa5 d4 e5 Nf3 [ECO B01 Scandinavian: Anderssen counter-attack orthodox attack] e4 d5 ed Qd5 Nc3 Qa5 d4 e5 de Bb4 Bd2 Nc6 Nf3 [ECO B01 Scandinavian: Anderssen counter-attack] e4 d5 ed Qd5 Nc3 Qa5 d4 e5 [ECO B01 Scandinavian defence, Gr\"unfeld variation] e4 d5 ed Qd5 Nc3 Qa5 d4 Nf6 Nf3 Bf5 Ne5 c6 g4 [ECO B01 Scandinavian defence] e4 d5 ed Qd5 Nc3 Qa5 d4 Nf6 Nf3 Bf5 [ECO B01 Scandinavian defence, Lasker variation] e4 d5 ed Qd5 Nc3 Qa5 d4 Nf6 Nf3 Bg4 h3 [ECO B01 Scandinavian defence] e4 d5 [ECO B00 KP: Neo-Mongoloid defence] e4 Nc6 d4 f6 [ECO B00 KP: Nimzovich defence, Bogolyubov variation] e4 Nc6 d4 d5 Nc3 [ECO B00 KP: Nimzovich defence, Marshall gambit] e4 Nc6 d4 d5 ed Qd5 Nc3 [ECO B00 KP: Nimzovich defence] e4 Nc6 d4 [ECO B00 KP: Colorado counter] e4 Nc6 Nf3 f5 [ECO B00 KP: Nimzovich defence] e4 Nc6 Nf3 [ECO B00 KP: Nimzovich defence, Wheeler gambit] e4 Nc6 b4 Nb4 c3 Nc6 d4 [ECO B00 KP: Nimzovich defence] e4 Nc6 [ECO B00 Guatemala defence] e4 b6 d4 Ba6 [ECO B00 Owen defence] e4 b6 [ECO B00 St. George defence] e4 a6 [ECO B00 Reversed Grob ] e4 g5 [ECO B00 Carr's defence] e4 h6 [ECO B00 Fried fox defence] e4 f6 d4 Kf7 [ECO B00 Barnes defence] e4 f6 [ECO B00 Fred] e4 f5 [ECO B00 Lemming defence] e4 Na6 [ECO B00 Corn stalk defence] e4 a5 [ECO B00 Hippopotamus defence] e4 Nh6 d4 g6 c4 f6 [ECO B00 King's pawn opening] e4 [ECO D69 QGD: Orthodox defence, classical, 13.de] d4 d5 c4 e6 Nc3 Nf6 Bg5 Be7 e3 o-o Nf3 N8d7 Rc1 c6 Bd3 dc Bc4 Nd5 Be7 Qe7 o-o Nc3 Rc3 e5 de Ne5 Ne5 Qe5 [ECO D68 QGD: Orthodox defence, classical, 13.d1c2 ] d4 d5 c4 e6 Nc3 Nf6 Bg5 Be7 e3 o-o Nf3 N8d7 Rc1 c6 Bd3 dc Bc4 Nd5 Be7 Qe7 o-o Nc3 Rc3 e5 Qc2 [ECO D68 QGD: Orthodox defence, classical, 13.d1b1 ] d4 d5 c4 e6 Nc3 Nf6 Bg5 Be7 e3 o-o Nf3 N8d7 Rc1 c6 Bd3 dc Bc4 Nd5 Be7 Qe7 o-o Nc3 Rc3 e5 Qb1 [ECO D68 QGD: Orthodox defence, classical variation] d4 d5 c4 e6 Nc3 Nf6 Bg5 Be7 e3 o-o Nf3 N8d7 Rc1 c6 Bd3 dc Bc4 Nd5 Be7 Qe7 o-o Nc3 Rc3 e5 [ECO D67 QGD: Orthodox defence, Bd3 line, 11.O-O] d4 d5 c4 e6 Nc3 Nf6 Bg5 Be7 e3 o-o Nf3 N8d7 Rc1 c6 Bd3 dc Bc4 Nd5 Be7 Qe7 o-o [ECO D67 QGD: Orthodox defence, Bd3 line, Alekhine variation] d4 d5 c4 e6 Nc3 Nf6 Bg5 Be7 e3 o-o Nf3 N8d7 Rc1 c6 Bd3 dc Bc4 Nd5 Be7 Qe7 Ne4 [ECO D67 QGD: Orthodox defence, Bd3 line] d4 d5 c4 e6 Nc3 Nf6 Bg5 Be7 e3 o-o Nf3 N8d7 Rc1 c6 Bd3 dc Bc4 Nd5 Be7 Qe7 [ECO D67 QGD: Orthodox defence, Bd3 line, Janowski variation] d4 d5 c4 e6 Nc3 Nf6 Bg5 Be7 e3 o-o Nf3 N8d7 Rc1 c6 Bd3 dc Bc4 Nd5 h4 [ECO D67 QGD: Orthodox defence, Bd3 line, Capablanca freeing manoevre] d4 d5 c4 e6 Nc3 Nf6 Bg5 Be7 e3 o-o Nf3 N8d7 Rc1 c6 Bd3 dc Bc4 Nd5 [ECO D66 QGD: Orthodox defence, Bd3 line, fianchetto variation] d4 d5 c4 e6 Nc3 Nf6 Bg5 Be7 e3 o-o Nf3 N8d7 Rc1 c6 Bd3 dc Bc4 b5 [ECO D66 QGD: Orthodox defence, Bd3 line] d4 d5 c4 e6 Nc3 Nf6 Bg5 Be7 e3 o-o Nf3 N8d7 Rc1 c6 Bd3 [ECO D65 QGD: Orthodox defence, Rubinstein attack, main line] d4 d5 c4 e6 Nc3 Nf6 Bg5 Be7 e3 o-o Nf3 N8d7 Rc1 c6 Qc2 a6 cd [ECO D64 QGD: Orthodox defence, Rubinstein attack, Gr\"unfeld variation] d4 d5 c4 e6 Nc3 Nf6 Bg5 Be7 e3 o-o Nf3 N8d7 Rc1 c6 Qc2 a6 a3 [ECO D64 QGD: Orthodox defence, Rubinstein attack, Karlsbad variation] d4 d5 c4 e6 Nc3 Nf6 Bg5 Be7 e3 o-o Nf3 N8d7 Rc1 c6 Qc2 a6 [ECO D64 QGD: Orthodox defence, Rubinstein attack, Wolf variation] d4 d5 c4 e6 Nc3 Nf6 Bg5 Be7 e3 o-o Nf3 N8d7 Rc1 c6 Qc2 Ne4 [ECO D64 QGD: Orthodox defence, Rubinstein attack ] d4 d5 c4 e6 Nc3 Nf6 Bg5 Be7 e3 o-o Nf3 N8d7 Rc1 c6 Qc2 [ECO D63 QGD: Orthodox defence] d4 d5 c4 e6 Nc3 Nf6 Bg5 Be7 e3 o-o Nf3 N8d7 Rc1 c6 [ECO D63 QGD: Orthodox defence, Swiss, Karlsbad variation] d4 d5 c4 e6 Nc3 Nf6 Bg5 Be7 e3 o-o Nf3 N8d7 Rc1 a6 cd [ECO D63 QGD: Orthodox defence, Swiss variation] d4 d5 c4 e6 Nc3 Nf6 Bg5 Be7 e3 o-o Nf3 N8d7 Rc1 a6 [ECO D63 QGD: Orthodox defence, Capablanca variation] d4 d5 c4 e6 Nc3 Nf6 Bg5 Be7 e3 o-o Nf3 N8d7 Rc1 b6 cd ed Bb5 [ECO D63 QGD: Orthodox defence, Pillsbury attack] d4 d5 c4 e6 Nc3 Nf6 Bg5 Be7 e3 o-o Nf3 N8d7 Rc1 b6 cd ed Bd3 [ECO D63 QGD: Orthodox defence, 7.Rc1] d4 d5 c4 e6 Nc3 Nf6 Bg5 Be7 e3 o-o Nf3 N8d7 Rc1 [ECO D62 QGD: Orthodox defence, 7.Qc2 c5, 8.cd ] d4 d5 c4 e6 Nc3 Nf6 Bg5 Be7 e3 o-o Nf3 N8d7 Qc2 c5 cd [ECO D61 QGD: Orthodox defence, Rubinstein variation] d4 d5 c4 e6 Nc3 Nf6 Bg5 Be7 e3 o-o Nf3 N8d7 Qc2 [ECO D60 QGD: Orthodox defence, Rauzer variation] d4 d5 c4 e6 Nc3 Nf6 Bg5 Be7 e3 o-o Nf3 N8d7 Qb3 [ECO D60 QGD: Orthodox defence, Botvinnik variation] d4 d5 c4 e6 Nc3 Nf6 Bg5 Be7 e3 o-o Nf3 N8d7 Bd3 [ECO D60 QGD: Orthodox defence] d4 d5 c4 e6 Nc3 Nf6 Bg5 Be7 e3 o-o Nf3 N8d7 [ECO D59 QGD: Tartakower variation] d4 d5 c4 e6 Nc3 Nf6 Bg5 Be7 e3 o-o Nf3 h6 Bh4 b6 cd Nd5 Be7 Qe7 Nd5 ed Rc1 Be6 [ECO D59 QGD: Tartakower system, 8.cd Nxd5] d4 d5 c4 e6 Nc3 Nf6 Bg5 Be7 e3 o-o Nf3 h6 Bh4 b6 cd Nd5 [ECO D58 QGD: Tartakower system] d4 d5 c4 e6 Nc3 Nf6 Bg5 Be7 e3 o-o Nf3 h6 Bh4 b6 [ECO D57 QGD: Lasker defence, Bernstein variation] d4 d5 c4 e6 Nc3 Nf6 Bg5 Be7 e3 o-o Nf3 h6 Bh4 Ne4 Be7 Qe7 cd Nc3 bc ed Qb3 Qd6 [ECO D57 QGD: Lasker defence, main line] d4 d5 c4 e6 Nc3 Nf6 Bg5 Be7 e3 o-o Nf3 h6 Bh4 Ne4 Be7 Qe7 cd Nc3 bc [ECO D56 QGD: Lasker defence, Russian variation] d4 d5 c4 e6 Nc3 Nf6 Bg5 Be7 e3 o-o Nf3 h6 Bh4 Ne4 Be7 Qe7 Qc2 Nf6 Bd3 dc Bc4 c5 o-o Nc6 f1d1 Bd7 [ECO D56 QGD: Lasker defence, Teichmann variation] d4 d5 c4 e6 Nc3 Nf6 Bg5 Be7 e3 o-o Nf3 h6 Bh4 Ne4 Be7 Qe7 Qc2 [ECO D56 QGD: Lasker defence] d4 d5 c4 e6 Nc3 Nf6 Bg5 Be7 e3 o-o Nf3 h6 Bh4 Ne4 [ECO D55 QGD: Neo-orthodox variation, 7.Bh4] d4 d5 c4 e6 Nc3 Nf6 Bg5 Be7 e3 o-o Nf3 h6 Bh4 [ECO D55 QGD: Petrosian variation] d4 d5 c4 e6 Nc3 Nf6 Bg5 Be7 e3 o-o Nf3 h6 Bf6 Bf6 Rc1 c6 Bd3 Nd7 o-o dc Bc4 [ECO D55 QGD: Neo-orthodox variation, 7.Bxf6] d4 d5 c4 e6 Nc3 Nf6 Bg5 Be7 e3 o-o Nf3 h6 Bf6 [ECO D55 QGD: Neo-orthodox variation] d4 d5 c4 e6 Nc3 Nf6 Bg5 Be7 e3 o-o Nf3 h6 [ECO D55 QGD: Pillsbury attack] d4 d5 c4 e6 Nc3 Nf6 Bg5 Be7 e3 o-o Nf3 b6 Bd3 Bb7 cd ed Ne5 [ECO D55 QGD: 6.Nf3] d4 d5 c4 e6 Nc3 Nf6 Bg5 Be7 e3 o-o Nf3 [ECO D54 QGD: Anti-neo-orthodox variation] d4 d5 c4 e6 Nc3 Nf6 Bg5 Be7 e3 o-o Rc1 [ECO D53 QGD: 4.Bg5 Be7, 5.e3 O-O] d4 d5 c4 e6 Nc3 Nf6 Bg5 Be7 e3 o-o [ECO D53 QGD: Lasker variation] d4 d5 c4 e6 Nc3 Nf6 Bg5 Be7 e3 Ne4 [ECO D53 QGD: 4.Bg5 Be7] d4 d5 c4 e6 Nc3 Nf6 Bg5 Be7 [ECO D52 QGD: Cambridge Springs defence, Yugoslav variation] d4 d5 c4 e6 Nc3 Nf6 Bg5 N8d7 e3 c6 Nf3 Qa5 cd Nd5 [ECO D52 QGD: Cambridge Springs defence, 7.cd] d4 d5 c4 e6 Nc3 Nf6 Bg5 N8d7 e3 c6 Nf3 Qa5 cd [ECO D52 QGD: Cambridge Springs defence, Capablanca variation] d4 d5 c4 e6 Nc3 Nf6 Bg5 N8d7 e3 c6 Nf3 Qa5 Bf6 [ECO D52 QGD: Cambridge Springs defence, Rubinstein variation] d4 d5 c4 e6 Nc3 Nf6 Bg5 N8d7 e3 c6 Nf3 Qa5 Nd2 dc [ECO D52 QGD: Cambridge Springs defence, Argentine variation] d4 d5 c4 e6 Nc3 Nf6 Bg5 N8d7 e3 c6 Nf3 Qa5 Nd2 Bb4 Qc2 o-o Bh4 [ECO D52 QGD: Cambridge Springs defence, Bogolyubov variation] d4 d5 c4 e6 Nc3 Nf6 Bg5 N8d7 e3 c6 Nf3 Qa5 Nd2 Bb4 Qc2 [ECO D52 QGD: Cambridge Springs defence] d4 d5 c4 e6 Nc3 Nf6 Bg5 N8d7 e3 c6 Nf3 Qa5 [ECO D?? QGD] d4 d5 c4 e6 Nc3 Nf6 Bg5 N8d7 e3 c6 Nf3 [ECO D51 QGD: Capablanca anti-Cambridge Springs variation] d4 d5 c4 e6 Nc3 Nf6 Bg5 N8d7 e3 c6 a3 [ECO D51 QGD: 5...c6] d4 d5 c4 e6 Nc3 Nf6 Bg5 N8d7 e3 c6 [ECO D51 QGD: Manhattan variation] d4 d5 c4 e6 Nc3 Nf6 Bg5 N8d7 e3 Bb4 [ECO D51 QGD] d4 d5 c4 e6 Nc3 Nf6 Bg5 N8d7 e3 [ECO D51 QGD: Alekhine variation] d4 d5 c4 e6 Nc3 Nf6 Bg5 N8d7 Nf3 c6 e4 [ECO D51 QGD: Rochlin variation] d4 d5 c4 e6 Nc3 Nf6 Bg5 N8d7 Nf3 c6 Rc1 Qa5 Bd2 [ECO D51 QGD: 4.Bg5 Nbd7] d4 d5 c4 e6 Nc3 Nf6 Bg5 N8d7 [ECO D50 QGD: Canal variation] d4 d5 c4 e6 Nc3 Nf6 Bg5 c5 cd Qb6 [ECO D50 QGD: Semi-Tarrasch] d4 d5 c4 e6 Nc3 Nf6 Bg5 c5 cd [ECO D50 QGD: Semi-Tarrasch, Primitive Pillsbury variation] d4 d5 c4 e6 Nc3 Nf6 Bg5 c5 Nf3 cd Qd4 [ECO D50 QGD: Semi-Tarrasch, Krause variation] d4 d5 c4 e6 Nc3 Nf6 Bg5 c5 Nf3 cd Nd4 e5 N4b5 a6 Qa4 [ECO D50 QGD: Been-Koomen variation] d4 d5 c4 e6 Nc3 Nf6 Bg5 c5 [ECO D50 QGD: 4.Bg5] d4 d5 c4 e6 Nc3 Nf6 Bg5 [ECO D49 QGD semi-Slav: Meran, Rellstab attack] d4 d5 c4 e6 Nc3 Nf6 Nf3 c6 e3 N8d7 Bd3 dc Bc4 b5 Bd3 a6 e4 c5 e5 cd Nb5 Ne5 Ne5 ab o-o Qd5 Qe2 Ba6 Bg5 [ECO D49 QGD semi-Slav: Meran, Sozin variation] d4 d5 c4 e6 Nc3 Nf6 Nf3 c6 e3 N8d7 Bd3 dc Bc4 b5 Bd3 a6 e4 c5 e5 cd Nb5 Ne5 Ne5 ab o-o [ECO D49 QGD semi-Slav: Meran, Stahlberg variation] d4 d5 c4 e6 Nc3 Nf6 Nf3 c6 e3 N8d7 Bd3 dc Bc4 b5 Bd3 a6 e4 c5 e5 cd Nb5 Ne5 Ne5 ab Qf3 [ECO D49 QGD semi-Slav: Meran, Sozin variation] d4 d5 c4 e6 Nc3 Nf6 Nf3 c6 e3 N8d7 Bd3 dc Bc4 b5 Bd3 a6 e4 c5 e5 cd Nb5 Ne5 [ECO D49 QGD semi-Slav: Meran, Rabinovich variation] d4 d5 c4 e6 Nc3 Nf6 Nf3 c6 e3 N8d7 Bd3 dc Bc4 b5 Bd3 a6 e4 c5 e5 cd Nb5 Ng4 [ECO D49 QGD semi-Slav: Meran, Blumenfeld variation] d4 d5 c4 e6 Nc3 Nf6 Nf3 c6 e3 N8d7 Bd3 dc Bc4 b5 Bd3 a6 e4 c5 e5 cd Nb5 [ECO D48 QGD semi-Slav: Meran, old main line] d4 d5 c4 e6 Nc3 Nf6 Nf3 c6 e3 N8d7 Bd3 dc Bc4 b5 Bd3 a6 e4 c5 e5 [ECO D48 QGD semi-Slav: Meran, Reynolds' variation] d4 d5 c4 e6 Nc3 Nf6 Nf3 c6 e3 N8d7 Bd3 dc Bc4 b5 Bd3 a6 e4 c5 d5 [ECO D48 QGD semi-Slav: Meran] d4 d5 c4 e6 Nc3 Nf6 Nf3 c6 e3 N8d7 Bd3 dc Bc4 b5 Bd3 a6 e4 c5 [ECO D48 QGD semi-Slav: Meran, Pir\'c variation] d4 d5 c4 e6 Nc3 Nf6 Nf3 c6 e3 N8d7 Bd3 dc Bc4 b5 Bd3 a6 e4 b4 [ECO D48 QGD semi-Slav: Meran, 8...a6] d4 d5 c4 e6 Nc3 Nf6 Nf3 c6 e3 N8d7 Bd3 dc Bc4 b5 Bd3 a6 [ECO D47 QGD semi-Slav: Meran, Wade variation] d4 d5 c4 e6 Nc3 Nf6 Nf3 c6 e3 N8d7 Bd3 dc Bc4 b5 Bd3 Bb7 [ECO D47 QGD semi-Slav: neo-Meran ] d4 d5 c4 e6 Nc3 Nf6 Nf3 c6 e3 N8d7 Bd3 dc Bc4 b5 Bd3 b4 [ECO D47 QGD semi-Slav: Meran variation] d4 d5 c4 e6 Nc3 Nf6 Nf3 c6 e3 N8d7 Bd3 dc Bc4 b5 [ECO D47 QGD semi-Slav: 7.Bc4] d4 d5 c4 e6 Nc3 Nf6 Nf3 c6 e3 N8d7 Bd3 dc Bc4 [ECO D46 QGD semi-Slav: Chigorin defence] d4 d5 c4 e6 Nc3 Nf6 Nf3 c6 e3 N8d7 Bd3 Bd6 [ECO D46 QGD semi-Slav: Romih variation] d4 d5 c4 e6 Nc3 Nf6 Nf3 c6 e3 N8d7 Bd3 Bb4 [ECO D46 QGD semi-Slav: Bogolyubov variation] d4 d5 c4 e6 Nc3 Nf6 Nf3 c6 e3 N8d7 Bd3 Be7 [ECO D46 QGD semi-Slav: 6.Bd3] d4 d5 c4 e6 Nc3 Nf6 Nf3 c6 e3 N8d7 Bd3 [ECO D45 QGD semi-Slav: Rubinstein system] d4 d5 c4 e6 Nc3 Nf6 Nf3 c6 e3 N8d7 Ne5 [ECO D45 QGD semi-Slav: Stoltz variation] d4 d5 c4 e6 Nc3 Nf6 Nf3 c6 e3 N8d7 Qc2 [ECO D45 QGD semi-Slav: 5...Nd7] d4 d5 c4 e6 Nc3 Nf6 Nf3 c6 e3 N8d7 [ECO D45 QGD semi-Slav: accelerated Meran ] d4 d5 c4 e6 Nc3 Nf6 Nf3 c6 e3 a6 [ECO D45 QGD semi-Slav: stonewall defence] d4 d5 c4 e6 Nc3 Nf6 Nf3 c6 e3 Ne4 Bd3 f5 [ECO D45 QGD semi-Slav: 5.e3] d4 d5 c4 e6 Nc3 Nf6 Nf3 c6 e3 [ECO D44 QGD semi-Slav: anti-Meran, Alatortsev system] d4 d5 c4 e6 Nc3 Nf6 Nf3 c6 Bg5 dc e4 b5 e5 h6 Bh4 g5 Ng5 Nd5 [ECO D44 QGD semi-Slav: anti-Meran, Szab\'o variation] d4 d5 c4 e6 Nc3 Nf6 Nf3 c6 Bg5 dc e4 b5 e5 h6 Bh4 g5 Ng5 hg Bg5 N8d7 Qf3 [ECO D44 QGD semi-Slav: anti-Meran, Lilienthal variation] d4 d5 c4 e6 Nc3 Nf6 Nf3 c6 Bg5 dc e4 b5 e5 h6 Bh4 g5 Ng5 hg Bg5 N8d7 g3 [ECO D44 QGD semi-Slav: anti-Meran gambit] d4 d5 c4 e6 Nc3 Nf6 Nf3 c6 Bg5 dc e4 b5 e5 h6 Bh4 g5 Ng5 [ECO D44 QGD semi-Slav: Ekstrom variation] d4 d5 c4 e6 Nc3 Nf6 Nf3 c6 Bg5 dc e4 b5 e5 h6 Bh4 g5 ef gh Ne5 [ECO D44 QGD semi-Slav: Botvinnik system ] d4 d5 c4 e6 Nc3 Nf6 Nf3 c6 Bg5 dc e4 [ECO D44 QGD semi-Slav: 5.Bg5 dc] d4 d5 c4 e6 Nc3 Nf6 Nf3 c6 Bg5 dc [ECO D43 QGD semi-Slav: Hastings variation] d4 d5 c4 e6 Nc3 Nf6 Nf3 c6 Bg5 h6 Bf6 Qf6 Qb3 [ECO D43 QGD semi-Slav] d4 d5 c4 e6 Nc3 Nf6 Nf3 c6 [ECO D42 QGD: Semi-Tarrasch, 7.Bd3] d4 d5 c4 e6 Nc3 Nf6 Nf3 c5 cd Nd5 e3 Nc6 Bd3 [ECO D41 QGD: Semi-Tarrasch with e3] d4 d5 c4 e6 Nc3 Nf6 Nf3 c5 cd Nd5 e3 [ECO D41 QGD: Semi-Tarrasch, San Sebastian variation] d4 d5 c4 e6 Nc3 Nf6 Nf3 c5 cd Nd5 e4 Nc3 bc cd cd Bb4 Bd2 Qa5 [ECO D41 QGD: Semi-Tarrasch, Kmoch variation] d4 d5 c4 e6 Nc3 Nf6 Nf3 c5 cd Nd5 e4 Nc3 bc cd cd Bb4 Bd2 Bd2 Qd2 o-o Bb5 [ECO D41 QGD: Semi-Tarrasch, 5.cd] d4 d5 c4 e6 Nc3 Nf6 Nf3 c5 cd [ECO D40 QGD: Semi-Tarrasch defence, Pillsbury variation] d4 d5 c4 e6 Nc3 Nf6 Nf3 c5 Bg5 [ECO D40 QGD: Semi-Tarrasch, Levenfish variation] d4 d5 c4 e6 Nc3 Nf6 Nf3 c5 e3 Nc6 Bd3 Bd6 o-o o-o Qe2 Qe7 dc Bc5 e4 [ECO D40 QGD: Semi-Tarrasch, symmetrical variation] d4 d5 c4 e6 Nc3 Nf6 Nf3 c5 e3 Nc6 Bd3 Bd6 o-o o-o [ECO D40 QGD: Semi-Tarrasch defence] d4 d5 c4 e6 Nc3 Nf6 Nf3 c5 [ECO D39 QGD: Ragozin, Vienna variation] d4 d5 c4 e6 Nc3 Nf6 Nf3 Bb4 Bg5 dc [ECO D38 QGD: Ragozin variation] d4 d5 c4 e6 Nc3 Nf6 Nf3 Bb4 [ECO D37 QGD: classical variation ] d4 d5 c4 e6 Nc3 Nf6 Nf3 Be7 Bf4 [ECO D37 QGD: 4.Nf3] d4 d5 c4 e6 Nc3 Nf6 Nf3 [ECO D36 QGD: exchange, positional line, 6.Qc2] d4 d5 c4 e6 Nc3 Nf6 cd ed Bg5 c6 Qc2 [ECO D35 QGD: exchange, positional line, 5...c6] d4 d5 c4 e6 Nc3 Nf6 cd ed Bg5 c6 [ECO D35 QGD: exchange, chameleon variation] d4 d5 c4 e6 Nc3 Nf6 cd ed Bg5 Be7 e3 o-o Bd3 N8d7 Qc2 Re8 N1e2 Nf8 o-o-o [ECO D35 QGD: exchange, positional line] d4 d5 c4 e6 Nc3 Nf6 cd ed Bg5 [ECO D35 QGD: exchange, S\"amisch variation] d4 d5 c4 e6 Nc3 Nf6 cd ed Nf3 N8d7 Bf4 [ECO D35 QGD: exchange variation] d4 d5 c4 e6 Nc3 Nf6 cd [ECO D35 QGD: Harrwitz attack] d4 d5 c4 e6 Nc3 Nf6 Bf4 [ECO D35 QGD: 3...Nf6] d4 d5 c4 e6 Nc3 Nf6 [ECO D34 QGD: Tarrasch, Stoltz variation] d4 d5 c4 e6 Nc3 c5 cd ed Nf3 Nc6 g3 Nf6 Bg2 Be7 o-o o-o Bg5 Be6 Rc1 b6 [ECO D34 QGD: Tarrasch, Bogolyubov variation] d4 d5 c4 e6 Nc3 c5 cd ed Nf3 Nc6 g3 Nf6 Bg2 Be7 o-o o-o Bg5 Be6 Rc1 c4 [ECO D34 QGD: Tarrasch, Prague variation, 9.Bg5] d4 d5 c4 e6 Nc3 c5 cd ed Nf3 Nc6 g3 Nf6 Bg2 Be7 o-o o-o Bg5 [ECO D34 QGD: Tarrasch, R\'eti variation] d4 d5 c4 e6 Nc3 c5 cd ed Nf3 Nc6 g3 Nf6 Bg2 Be7 o-o o-o dc Bc5 Na4 [ECO D34 QGD: Tarrasch, Prague variation, Normal position] d4 d5 c4 e6 Nc3 c5 cd ed Nf3 Nc6 g3 Nf6 Bg2 Be7 o-o o-o [ECO D34 QGD: Tarrasch, Prague variation, 7...Be7] d4 d5 c4 e6 Nc3 c5 cd ed Nf3 Nc6 g3 Nf6 Bg2 Be7 [ECO D33 QGD: Tarrasch, Wagner variation] d4 d5 c4 e6 Nc3 c5 cd ed Nf3 Nc6 g3 Nf6 Bg2 Bg4 [ECO D33 QGD: Tarrasch, Prague variation] d4 d5 c4 e6 Nc3 c5 cd ed Nf3 Nc6 g3 Nf6 [ECO D33 QGD: Tarrasch, Schlechter-Rubinstein system, Rey Ardid variation] d4 d5 c4 e6 Nc3 c5 cd ed Nf3 Nc6 g3 c4 e4 [ECO D33 QGD: Tarrasch, Folkestone variation] d4 d5 c4 e6 Nc3 c5 cd ed Nf3 Nc6 g3 c4 [ECO D33 QGD: Tarrasch, Schlechter-Rubinstein system] d4 d5 c4 e6 Nc3 c5 cd ed Nf3 Nc6 g3 [ECO D32 QGD: Tarrasch defence] d4 d5 c4 e6 Nc3 c5 cd ed Nf3 [ECO D32 QGD: Tarrasch defence, Marshall gambit] d4 d5 c4 e6 Nc3 c5 cd ed e4 [ECO D32 QGD: Tarrasch defence, Tarrasch gambit] d4 d5 c4 e6 Nc3 c5 cd ed dc d4 Na4 b5 [ECO D32 QGD: Tarrasch defence, 4.cd ed] d4 d5 c4 e6 Nc3 c5 cd ed [ECO D32 QGD: Tarrasch, von Hennig-Schara gambit] d4 d5 c4 e6 Nc3 c5 cd cd [ECO D32 QGD: Tarrasch defence] d4 d5 c4 e6 Nc3 c5 [ECO D31 QGD: semi-Slav, Marshall gambit] d4 d5 c4 e6 Nc3 c6 e4 [ECO D31 QGD: semi-Slav, Abrahams variation] d4 d5 c4 e6 Nc3 c6 Nf3 dc a4 Bb4 e3 b5 Bd2 a5 [ECO D31 QGD: semi-Slav, Junge variation] d4 d5 c4 e6 Nc3 c6 Nf3 dc a4 Bb4 e3 b5 Bd2 Qb6 [ECO D31 QGD: semi-Slav, Koomen variation] d4 d5 c4 e6 Nc3 c6 Nf3 dc a4 Bb4 e3 b5 Bd2 Qe7 [ECO D31 QGD: semi-Slav, Noteboom variation] d4 d5 c4 e6 Nc3 c6 Nf3 dc [ECO D31 QGD: semi-Slav] d4 d5 c4 e6 Nc3 c6 [ECO D31 QGD: Charousek variation] d4 d5 c4 e6 Nc3 Be7 [ECO D31 QGD: Alapin variation] d4 d5 c4 e6 Nc3 b6 [ECO D31 QGD: Janowski variation] d4 d5 c4 e6 Nc3 a6 [ECO D31 QGD: 3.Nc3] d4 d5 c4 e6 Nc3 [ECO D30 QGD: Hastings variation] d4 d5 c4 e6 Nf3 Nf6 Bg5 h6 Bf6 Qf6 Nc3 c6 Qb3 [ECO D30 QGD: Capablanca-Duras variation] d4 d5 c4 e6 Nf3 Nf6 Bg5 h6 [ECO D30 QGD: Vienna variation] d4 d5 c4 e6 Nf3 Nf6 Bg5 Bb4 [ECO D30 QGD: Capablanca variation] d4 d5 c4 e6 Nf3 Nf6 Bg5 N8d7 e3 c6 N1d2 [ECO D30 QGD] d4 d5 c4 e6 Nf3 Nf6 Bg5 [ECO D30 QGD: Spielmann variation] d4 d5 c4 e6 Nf3 Nf6 e3 c6 N1d2 g6 [ECO D30 QGD Slav: Semmering variation] d4 d5 c4 e6 Nf3 Nf6 e3 c6 N1d2 N8d7 Bd3 c5 [ECO D30 QGD Slav] d4 d5 c4 e6 Nf3 Nf6 e3 c6 N1d2 N8d7 [ECO D30 QGD: Stonewall variation] d4 d5 c4 e6 Nf3 Nf6 e3 c6 N1d2 Ne4 Bd3 f5 [ECO D30 QGD Slav] d4 d5 c4 e6 Nf3 Nf6 e3 c6 N1d2 [ECO D30 Queen's gambit declined] d4 d5 c4 e6 [ECO D29 QGA: classical, Smyslov variation] d4 d5 c4 dc Nf3 Nf6 e3 e6 Bc4 c5 o-o a6 Qe2 b5 Bb3 Bb7 Rd1 N8d7 Nc3 Bd6 [ECO D29 QGA: classical, 8...Bb7] d4 d5 c4 dc Nf3 Nf6 e3 e6 Bc4 c5 o-o a6 Qe2 b5 Bb3 Bb7 [ECO D28 QGA: classical, Flohr variation] d4 d5 c4 dc Nf3 Nf6 e3 e6 Bc4 c5 o-o a6 Qe2 b5 Bb3 Nc6 Rd1 c4 Bc2 Nb4 Nc3 Nc2 Qc2 Bb7 d5 Qc7 [ECO D28 QGA: classical, 7...b5] d4 d5 c4 dc Nf3 Nf6 e3 e6 Bc4 c5 o-o a6 Qe2 b5 [ECO D28 QGA: classical, 7.Qe2] d4 d5 c4 dc Nf3 Nf6 e3 e6 Bc4 c5 o-o a6 Qe2 [ECO D27 QGA: classical, Geller variation] d4 d5 c4 dc Nf3 Nf6 e3 e6 Bc4 c5 o-o a6 e4 [ECO D27 QGA: classical, Rubinstein variation] d4 d5 c4 dc Nf3 Nf6 e3 e6 Bc4 c5 o-o a6 a4 [ECO D27 QGA: classical, 6...a6] d4 d5 c4 dc Nf3 Nf6 e3 e6 Bc4 c5 o-o a6 [ECO D26 QGA: classical, Steinitz variation] d4 d5 c4 dc Nf3 Nf6 e3 e6 Bc4 c5 o-o cd [ECO D26 QGA: classical variation, 6.O-O] d4 d5 c4 dc Nf3 Nf6 e3 e6 Bc4 c5 o-o [ECO D26 QGA: classical, Furman variation] d4 d5 c4 dc Nf3 Nf6 e3 e6 Bc4 c5 Qe2 a6 dc Bc5 o-o Nc6 e4 b5 e5 [ECO D26 QGA: classical variation] d4 d5 c4 dc Nf3 Nf6 e3 e6 Bc4 c5 [ECO D26 QGA: 4...e6] d4 d5 c4 dc Nf3 Nf6 e3 e6 [ECO D25 QGA, Flohr variation] d4 d5 c4 dc Nf3 Nf6 e3 Be6 [ECO D25 QGA, Janowsky-Larsen variation] d4 d5 c4 dc Nf3 Nf6 e3 Bg4 [ECO D25 QGA, Smyslov variation] d4 d5 c4 dc Nf3 Nf6 e3 g6 [ECO D25 QGA, 4.e3] d4 d5 c4 dc Nf3 Nf6 e3 [ECO D24 QGA, Bogolyubov variation] d4 d5 c4 dc Nf3 Nf6 Nc3 a6 e4 [ECO D24 QGA, 4.Nc3] d4 d5 c4 dc Nf3 Nf6 Nc3 [ECO D23 QGA: Mannheim variation] d4 d5 c4 dc Nf3 Nf6 Qa4 [ECO D23 Queen's gambit accepted] d4 d5 c4 dc Nf3 Nf6 [ECO D21 QGA: Alekhine defense, Borisenko-Furman variation] d4 d5 c4 dc Nf3 a6 e4 [ECO D22 QGA: Haberditz variation] d4 d5 c4 dc Nf3 a6 e3 b5 [ECO D22 QGA: Alekhine defence, Alatortsev variation] d4 d5 c4 dc Nf3 a6 e3 Bg4 Bc4 e6 d5 [ECO D22 QGA: Alekhine defence] d4 d5 c4 dc Nf3 a6 [ECO D21 QGA: Ericson variation] d4 d5 c4 dc Nf3 b5 [ECO D21 QGA: 3.Nf3] d4 d5 c4 dc Nf3 [ECO D20 QGA: Schwartz defence] d4 d5 c4 dc e4 f5 [ECO D20 QGA: Linares variation] d4 d5 c4 dc e4 c5 d5 Nf6 Nc3 b5 [ECO D20 QGA: 3.e4] d4 d5 c4 dc e4 [ECO D20 Queen's gambit accepted] d4 d5 c4 dc [ECO D19 QGD Slav: Dutch, S\"amisch variation] d4 d5 c4 c6 Nf3 Nf6 Nc3 dc a4 Bf5 e3 e6 Bc4 Bb4 o-o o-o Qe2 Ne4 g4 [ECO D19 QGD Slav: Dutch variation, main line] d4 d5 c4 c6 Nf3 Nf6 Nc3 dc a4 Bf5 e3 e6 Bc4 Bb4 o-o o-o Qe2 [ECO D19 QGD Slav: Dutch variation] d4 d5 c4 c6 Nf3 Nf6 Nc3 dc a4 Bf5 e3 e6 Bc4 Bb4 o-o [ECO D18 QGD Slav: Dutch, Lasker variation] d4 d5 c4 c6 Nf3 Nf6 Nc3 dc a4 Bf5 e3 Na6 [ECO D18 QGD Slav: Dutch variation] d4 d5 c4 c6 Nf3 Nf6 Nc3 dc a4 Bf5 e3 [ECO D17 QGD Slav: Wiesbaden variation] d4 d5 c4 c6 Nf3 Nf6 Nc3 dc a4 Bf5 Ne5 e6 [ECO D17 QGD Slav: Carlsbad variation] d4 d5 c4 c6 Nf3 Nf6 Nc3 dc a4 Bf5 Ne5 N8d7 Nc4 Qc7 g3 e5 [ECO D17 QGD Slav: Krause attack] d4 d5 c4 c6 Nf3 Nf6 Nc3 dc a4 Bf5 Ne5 [ECO D17 QGD Slav: Czech defence] d4 d5 c4 c6 Nf3 Nf6 Nc3 dc a4 Bf5 [ECO D16 QGD Slav: Steiner variation] d4 d5 c4 c6 Nf3 Nf6 Nc3 dc a4 Bg4 [ECO D16 QGD Slav: Soultanb\'eieff variation] d4 d5 c4 c6 Nf3 Nf6 Nc3 dc a4 e6 [ECO D16 QGD Slav: Smyslov variation] d4 d5 c4 c6 Nf3 Nf6 Nc3 dc a4 Na6 e4 Bg4 [ECO D16 QGD Slav accepted: Alapin variation] d4 d5 c4 c6 Nf3 Nf6 Nc3 dc a4 [ECO D15 QGD Slav: Tolush-Geller gambit] d4 d5 c4 c6 Nf3 Nf6 Nc3 dc e4 b5 e5 [ECO D15 QGD Slav: Slav gambit] d4 d5 c4 c6 Nf3 Nf6 Nc3 dc e4 [ECO D15 QGD Slav: 5.e3 ] d4 d5 c4 c6 Nf3 Nf6 Nc3 dc e3 [ECO D15 QGD Slav accepted] d4 d5 c4 c6 Nf3 Nf6 Nc3 dc [ECO D15 QGD Slav: Schlechter variation] d4 d5 c4 c6 Nf3 Nf6 Nc3 g6 [ECO D15 QGD Slav: S\"uchting variation] d4 d5 c4 c6 Nf3 Nf6 Nc3 Qb6 [ECO D15 QGD Slav: 4.Nc3] d4 d5 c4 c6 Nf3 Nf6 Nc3 [ECO D14 QGD Slav: exchange, Trifunovi\'c variation] d4 d5 c4 c6 Nf3 Nf6 cd cd Nc3 Nc6 Bf4 Bf5 e3 e6 Qb3 Bb4 [ECO D14 QGD Slav: exchange variation, 6.Bf4 Bf5] d4 d5 c4 c6 Nf3 Nf6 cd cd Nc3 Nc6 Bf4 Bf5 [ECO D13 QGD Slav: exchange variation] d4 d5 c4 c6 Nf3 Nf6 cd cd [ECO D12 QGD Slav: Amsterdam variation] d4 d5 c4 c6 Nf3 Nf6 e3 Bf5 cd cd Nc3 e6 Ne5 N6d7 [ECO D12 QGD Slav: exchange variation] d4 d5 c4 c6 Nf3 Nf6 e3 Bf5 cd cd Nc3 [ECO D12 QGD Slav: Landau variation] d4 d5 c4 c6 Nf3 Nf6 e3 Bf5 cd cd Qb3 Qc8 Bd2 e6 Na3 [ECO D12 QGD Slav: 4.e3 Bf5] d4 d5 c4 c6 Nf3 Nf6 e3 Bf5 [ECO D11 QGD Slav: 4.e3] d4 d5 c4 c6 Nf3 Nf6 e3 [ECO D11 QGD Slav: Breyer variation] d4 d5 c4 c6 Nf3 Nf6 N1d2 [ECO D11 QGD Slav: 3.Nf3] d4 d5 c4 c6 Nf3 [ECO D10 QGD Slav defence: exchange variation] d4 d5 c4 c6 cd [ECO D10 QGD Slav: Winawer counter-gambit] d4 d5 c4 c6 Nc3 e5 [ECO D10 QGD Slav defence, Alekhine variation] d4 d5 c4 c6 Nc3 dc e4 [ECO D10 QGD Slav defence] d4 d5 c4 c6 [ECO D09 QGD: Albin counter-gambit, 5.g3] d4 d5 c4 e5 de d4 Nf3 Nc6 g3 [ECO D08 QGD: Albin counter-gambit, Balogh variation] d4 d5 c4 e5 de d4 Nf3 Nc6 N1d2 Qe7 [ECO D08 QGD: Albin counter-gambit, Janowski variation] d4 d5 c4 e5 de d4 Nf3 Nc6 N1d2 f6 [ECO D08 QGD: Albin counter-gambit, Kr\'enosz variation] d4 d5 c4 e5 de d4 Nf3 Nc6 N1d2 Bg4 h3 Bf3 Nf3 Bb4 Bd2 Qe7 [ECO D08 QGD: Albin counter-gambit, Alapin variation] d4 d5 c4 e5 de d4 Nf3 Nc6 N1d2 [ECO D08 QGD: Albin counter-gambit] d4 d5 c4 e5 de d4 Nf3 [ECO D08 QGD: Albin counter-gambit, Lasker trap] d4 d5 c4 e5 de d4 e3 Bb4 Bd2 de [ECO D08 QGD: Albin counter-gambit] d4 d5 c4 e5 [ECO D07 QGD: Chigorin defence, Janowski variation] d4 d5 c4 Nc6 Nc3 dc Nf3 [ECO D07 QGD: Chigorin defence] d4 d5 c4 Nc6 [ECO D06 QGD: symmetrical defence] d4 d5 c4 c5 [ECO D06 QGD: Marshall defence] d4 d5 c4 Nf6 [ECO D06 QGD: Grau defence] d4 d5 c4 Bf5 [ECO D06 Queen's gambit declined] d4 d5 c4 [ECO D05 Colle system] d4 d5 Nf3 Nf6 e3 e6 Bd3 c5 c3 [ECO D05 Queen's pawn game, Rubinstein variation] d4 d5 Nf3 Nf6 e3 e6 Bd3 c5 b3 [ECO D05 Queen's pawn game] d4 d5 Nf3 Nf6 e3 e6 Bd3 [ECO D05 Queen's pawn game, Zukertort variation] d4 d5 Nf3 Nf6 e3 e6 N1d2 c5 b3 [ECO D05 Queen's pawn game] d4 d5 Nf3 Nf6 e3 e6 [ECO D04 Queen's pawn game] d4 d5 Nf3 Nf6 e3 [ECO D03 Torre attack ] d4 d5 Nf3 Nf6 Bg5 [ECO D02 Queen's bishop game] d4 d5 Nf3 Nf6 Bf4 [ECO D02 Queen's pawn game] d4 d5 Nf3 Nf6 [ECO D02 Queen's pawn game, Krause variation] d4 d5 Nf3 c5 [ECO D02 Queen's pawn game, Chigorin variation] d4 d5 Nf3 Nc6 [ECO D02 Queen's pawn game] d4 d5 Nf3 [ECO D01 Richter-Veresov attack, Richter variation] d4 d5 Nc3 Nf6 Bg5 Bf5 f3 [ECO D01 Richter-Veresov attack, Veresov variation] d4 d5 Nc3 Nf6 Bg5 Bf5 Bf6 [ECO D01 Richter-Veresov attack] d4 d5 Nc3 Nf6 Bg5 [ECO D00 Blackmar-Diemer: Lemberg counter-gambit] d4 d5 Nc3 Nf6 e4 e5 [ECO D00 Blackmar-Diemer: Euwe defence] d4 d5 Nc3 Nf6 e4 de f3 ef Nf3 e6 [ECO D00 Blackmar-Diemer gambit] d4 d5 Nc3 Nf6 e4 [ECO D00 Queen's pawn: Anti-Veresov] d4 d5 Nc3 Bg4 [ECO D00 Queen's pawn: Chigorin variation] d4 d5 Nc3 [ECO D00 Queen's pawn: stonewall attack] d4 d5 e3 Nf6 Bd3 [ECO D00 Blackmar gambit] d4 d5 e4 [ECO D00 Levitsky attack ] d4 d5 Bg5 [ECO D00 Queen's pawn, Mason variation, Steinitz counter-gambit] d4 d5 Bf4 c5 [ECO D00 Queen's pawn, Mason variation] d4 d5 Bf4 [ECO D00 Queen's pawn game] d4 d5 [ECO E59 Nimzo-Indian: 4.e3, main line] d4 Nf6 c4 e6 Nc3 Bb4 e3 o-o Nf3 d5 Bd3 c5 o-o Nc6 a3 Bc3 bc dc Bc4 [ECO E58 Nimzo-Indian: 4.e3, main line with 8...Bxc3] d4 Nf6 c4 e6 Nc3 Bb4 e3 o-o Nf3 d5 Bd3 c5 o-o Nc6 a3 Bc3 bc [ECO E57 Nimzo-Indian: 4.e3, main line with 8...dc and 9...cd] d4 Nf6 c4 e6 Nc3 Bb4 e3 o-o Nf3 d5 Bd3 c5 o-o Nc6 a3 dc Bc4 cd [ECO E56 Nimzo-Indian: 4.e3, main line with 7...Nc6] d4 Nf6 c4 e6 Nc3 Bb4 e3 o-o Nf3 d5 Bd3 c5 o-o Nc6 [ECO E55 Nimzo-Indian: 4.e3, Gligori\'c system, Bronstein variation] d4 Nf6 c4 e6 Nc3 Bb4 e3 o-o Nf3 d5 Bd3 c5 o-o dc Bc4 N8d7 [ECO E54 Nimzo-Indian: 4.e3, Gligori\'c system, Smyslov variation] d4 Nf6 c4 e6 Nc3 Bb4 e3 o-o Nf3 d5 Bd3 c5 o-o dc Bc4 Qe7 [ECO E54 Nimzo-Indian: 4.e3, Gligori\'c system with 7...dc] d4 Nf6 c4 e6 Nc3 Bb4 e3 o-o Nf3 d5 Bd3 c5 o-o dc Bc4 [ECO E53 Nimzo-Indian: 4.e3, Gligori\'c system with 7...Nbd7] d4 Nf6 c4 e6 Nc3 Bb4 e3 o-o Nf3 d5 Bd3 c5 o-o N8d7 [ECO E53 Nimzo-Indian: 4.e3, Keres variation] d4 Nf6 c4 e6 Nc3 Bb4 e3 o-o Nf3 d5 Bd3 c5 o-o b6 [ECO E53 Nimzo-Indian: 4.e3, main line with ...c5] d4 Nf6 c4 e6 Nc3 Bb4 e3 o-o Nf3 d5 Bd3 c5 [ECO E52 Nimzo-Indian: 4.e3, main line with ...b6] d4 Nf6 c4 e6 Nc3 Bb4 e3 o-o Nf3 d5 Bd3 b6 [ECO E51 Nimzo-Indian: 4.e3, Ragozin variation] d4 Nf6 c4 e6 Nc3 Bb4 e3 o-o Nf3 d5 Bd3 Nc6 o-o dc [ECO E51 Nimzo-Indian: 4.e3 e8g8, 5.Nf3 d7d5] d4 Nf6 c4 e6 Nc3 Bb4 e3 o-o Nf3 d5 [ECO E50 Nimzo-Indian: 4.e3 e8g8, 5.Nf3, without ...d5] d4 Nf6 c4 e6 Nc3 Bb4 e3 o-o Nf3 [ECO E49 Nimzo-Indian: 4.e3, Botvinnik system] d4 Nf6 c4 e6 Nc3 Bb4 e3 o-o Bd3 d5 a3 Bc3 bc [ECO E48 Nimzo-Indian: 4.e3 O-O, 5.Bd3 d5] d4 Nf6 c4 e6 Nc3 Bb4 e3 o-o Bd3 d5 [ECO E47 Nimzo-Indian: 4.e3 O-O, 5.Bd3] d4 Nf6 c4 e6 Nc3 Bb4 e3 o-o Bd3 [ECO E46 Nimzo-Indian: Simagin variation] d4 Nf6 c4 e6 Nc3 Bb4 e3 o-o Ne2 d5 a3 Bd6 [ECO E46 Nimzo-Indian: Reshevsky variation] d4 Nf6 c4 e6 Nc3 Bb4 e3 o-o Ne2 [ECO E46 Nimzo-Indian: 4.e3 O-O] d4 Nf6 c4 e6 Nc3 Bb4 e3 o-o [ECO E45 Nimzo-Indian: 4.e3, Bronstein variation] d4 Nf6 c4 e6 Nc3 Bb4 e3 b6 Ne2 Ba6 [ECO E44 Nimzo-Indian: Fischer variation, 5.Ne2] d4 Nf6 c4 e6 Nc3 Bb4 e3 b6 Ne2 [ECO E43 Nimzo-Indian: Fischer variation] d4 Nf6 c4 e6 Nc3 Bb4 e3 b6 [ECO E42 Nimzo-Indian: 4.e3 c5, 5.Ne2 ] d4 Nf6 c4 e6 Nc3 Bb4 e3 c5 Ne2 [ECO E41 Nimzo-Indian: e3, H\"ubner variation] d4 Nf6 c4 e6 Nc3 Bb4 e3 c5 Bd3 Nc6 Nf3 Bc3 bc d6 [ECO E41 Nimzo-Indian: 4.e3 c5] d4 Nf6 c4 e6 Nc3 Bb4 e3 c5 [ECO E40 Nimzo-Indian: 4.e3, Taimanov variation] d4 Nf6 c4 e6 Nc3 Bb4 e3 Nc6 [ECO E40 Nimzo-Indian: 4.e3] d4 Nf6 c4 e6 Nc3 Bb4 e3 [ECO E39 Nimzo-Indian: classical, Pir\'c variation] d4 Nf6 c4 e6 Nc3 Bb4 Qc2 c5 dc o-o [ECO E38 Nimzo-Indian: classical, 4...c5] d4 Nf6 c4 e6 Nc3 Bb4 Qc2 c5 [ECO E37 Nimzo-Indian: classical, San Remo variation] d4 Nf6 c4 e6 Nc3 Bb4 Qc2 d5 a3 Bc3 Qc3 Ne4 Qc2 Nc6 e3 e5 [ECO E37 Nimzo-Indian: classical, Noa variation, main line, 7.Qc2] d4 Nf6 c4 e6 Nc3 Bb4 Qc2 d5 a3 Bc3 Qc3 Ne4 Qc2 [ECO E36 Nimzo-Indian: classical, Noa variation, main line] d4 Nf6 c4 e6 Nc3 Bb4 Qc2 d5 a3 Bc3 Qc3 Ne4 [ECO E36 Nimzo-Indian: classical, Botvinnik variation] d4 Nf6 c4 e6 Nc3 Bb4 Qc2 d5 a3 Bc3 Qc3 Nc6 [ECO E36 Nimzo-Indian: classical, Noa variation, 5.a3] d4 Nf6 c4 e6 Nc3 Bb4 Qc2 d5 a3 [ECO E35 Nimzo-Indian: classical, Noa variation, 5.cd ed] d4 Nf6 c4 e6 Nc3 Bb4 Qc2 d5 cd ed [ECO E34 Nimzo-Indian: classical, Noa variation] d4 Nf6 c4 e6 Nc3 Bb4 Qc2 d5 [ECO E33 Nimzo-Indian: classical, Milner-Barry variation] d4 Nf6 c4 e6 Nc3 Bb4 Qc2 Nc6 Nf3 d6 [ECO E33 Nimzo-Indian: classical, 4...Nc6] d4 Nf6 c4 e6 Nc3 Bb4 Qc2 Nc6 [ECO E32 Nimzo-Indian: classical, Adorjan gambit] d4 Nf6 c4 e6 Nc3 Bb4 Qc2 o-o a3 Bc3 Qc3 b5 [ECO E32 Nimzo-Indian: classical variation] d4 Nf6 c4 e6 Nc3 Bb4 Qc2 [ECO E31 Nimzo-Indian: Leningrad, main line] d4 Nf6 c4 e6 Nc3 Bb4 Bg5 h6 Bh4 c5 d5 d6 [ECO E30 Nimzo-Indian: Leningrad, ...b5 gambit] d4 Nf6 c4 e6 Nc3 Bb4 Bg5 h6 Bh4 c5 d5 b5 [ECO E30 Nimzo-Indian: Leningrad variation] d4 Nf6 c4 e6 Nc3 Bb4 Bg5 [ECO E29 Nimzo-Indian: S\"amisch, Capablanca variation] d4 Nf6 c4 e6 Nc3 Bb4 a3 Bc3 bc o-o e3 c5 Bd3 Nc6 Ne2 b6 e4 Ne8 [ECO E29 Nimzo-Indian: S\"amisch, main line] d4 Nf6 c4 e6 Nc3 Bb4 a3 Bc3 bc o-o e3 c5 Bd3 Nc6 [ECO E28 Nimzo-Indian: S\"amisch variation] d4 Nf6 c4 e6 Nc3 Bb4 a3 Bc3 bc o-o e3 [ECO E27 Nimzo-Indian: S\"amisch variation] d4 Nf6 c4 e6 Nc3 Bb4 a3 Bc3 bc o-o [ECO E26 Nimzo-Indian: S\"amisch, O'Kelly variation] d4 Nf6 c4 e6 Nc3 Bb4 a3 Bc3 bc c5 e3 b6 [ECO E26 Nimzo-Indian: S\"amisch variation] d4 Nf6 c4 e6 Nc3 Bb4 a3 Bc3 bc c5 e3 [ECO E25 Nimzo-Indian: S\"amisch, Romanovsky variation] d4 Nf6 c4 e6 Nc3 Bb4 a3 Bc3 bc c5 f3 d5 cd Nd5 dc f5 [ECO E25 Nimzo-Indian: S\"amisch, Keres variation] d4 Nf6 c4 e6 Nc3 Bb4 a3 Bc3 bc c5 f3 d5 cd Nd5 dc [ECO E25 Nimzo-Indian: S\"amisch variation] d4 Nf6 c4 e6 Nc3 Bb4 a3 Bc3 bc c5 f3 d5 cd [ECO E24 Nimzo-Indian: S\"amisch, Botvinnik variation] d4 Nf6 c4 e6 Nc3 Bb4 a3 Bc3 bc c5 f3 d5 e3 o-o cd Nd5 [ECO E24 Nimzo-Indian: S\"amisch variation] d4 Nf6 c4 e6 Nc3 Bb4 a3 Bc3 bc [ECO E23 Nimzo-Indian: Spielmann, St\aa hlberg variation] d4 Nf6 c4 e6 Nc3 Bb4 Qb3 c5 dc Nc6 Nf3 Ne4 Bd2 Nc5 Qc2 f5 g3 [ECO E23 Nimzo-Indian: Spielmann, San Remo variation] d4 Nf6 c4 e6 Nc3 Bb4 Qb3 c5 dc Nc6 Nf3 Ne4 Bd2 Nc5 [ECO E23 Nimzo-Indian: Spielmann, Karlsbad variation] d4 Nf6 c4 e6 Nc3 Bb4 Qb3 c5 dc Nc6 Nf3 Ne4 Bd2 Nd2 [ECO E23 Nimzo-Indian: Spielmann, 4...c5, 5.dc Nc6] d4 Nf6 c4 e6 Nc3 Bb4 Qb3 c5 dc Nc6 [ECO E22 Nimzo-Indian: Spielmann variation] d4 Nf6 c4 e6 Nc3 Bb4 Qb3 [ECO E21 Nimzo-Indian: three knights, Euwe variation] d4 Nf6 c4 e6 Nc3 Bb4 Nf3 c5 d5 Ne4 [ECO E21 Nimzo-Indian: three knights, Korchnoi variation] d4 Nf6 c4 e6 Nc3 Bb4 Nf3 c5 d5 [ECO E21 Nimzo-Indian: three knights variation] d4 Nf6 c4 e6 Nc3 Bb4 Nf3 [ECO E20 Nimzo-Indian: Romanishin-Kasparov system] d4 Nf6 c4 e6 Nc3 Bb4 g3 [ECO E20 Nimzo-Indian: Mikenas attack] d4 Nf6 c4 e6 Nc3 Bb4 Qd3 [ECO E20 Nimzo-Indian: Kmoch variation] d4 Nf6 c4 e6 Nc3 Bb4 f3 [ECO E20 Nimzo-Indian defence] d4 Nf6 c4 e6 Nc3 Bb4 [ECO E19 Queen's Indian: old main line, 9.Qxc3] d4 Nf6 c4 e6 Nf3 b6 g3 Bb7 Bg2 Be7 o-o o-o Nc3 Ne4 Qc2 Nc3 Qc3 [ECO E18 Queen's Indian: old main line, 7.Nc3] d4 Nf6 c4 e6 Nf3 b6 g3 Bb7 Bg2 Be7 o-o o-o Nc3 [ECO E17 Queen's Indian: Euwe variation] d4 Nf6 c4 e6 Nf3 b6 g3 Bb7 Bg2 Be7 o-o o-o b3 [ECO E17 Queen's Indian: old main line, 6.O-O] d4 Nf6 c4 e6 Nf3 b6 g3 Bb7 Bg2 Be7 o-o [ECO E17 Queen's Indian: Opo\v censky variation] d4 Nf6 c4 e6 Nf3 b6 g3 Bb7 Bg2 Be7 Nc3 Ne4 Bd2 [ECO E17 Queen's Indian: anti-Queen's Indian system] d4 Nf6 c4 e6 Nf3 b6 g3 Bb7 Bg2 Be7 Nc3 [ECO E17 Queen's Indian: 5.Bg2 Be7] d4 Nf6 c4 e6 Nf3 b6 g3 Bb7 Bg2 Be7 [ECO E16 Queen's Indian: Riumin variation] d4 Nf6 c4 e6 Nf3 b6 g3 Bb7 Bg2 Bb4 Bd2 Be7 [ECO E16 Queen's Indian: Yates variation] d4 Nf6 c4 e6 Nf3 b6 g3 Bb7 Bg2 Bb4 Bd2 a5 [ECO E16 Queen's Indian: Capablanca variation] d4 Nf6 c4 e6 Nf3 b6 g3 Bb7 Bg2 Bb4 [ECO E15 Queen's Indian: B\"urger variation] d4 Nf6 c4 e6 Nf3 b6 g3 Bb7 Bg2 c5 d5 ed Ng5 [ECO E15 Queen's Indian: Rubinstein variation] d4 Nf6 c4 e6 Nf3 b6 g3 Bb7 Bg2 c5 d5 ed Nh4 [ECO E15 Queen's Indian: 4.g3 Bb7] d4 Nf6 c4 e6 Nf3 b6 g3 Bb7 [ECO E15 Queen's Indian: Nimzovich variation ] d4 Nf6 c4 e6 Nf3 b6 g3 Ba6 [ECO E15 Queen's Indian: 4.g3] d4 Nf6 c4 e6 Nf3 b6 g3 [ECO E14 Queen's Indian: Averbakh variation] d4 Nf6 c4 e6 Nf3 b6 e3 Bb7 Bd3 c5 o-o Be7 b3 o-o Bb2 cd Nd4 [ECO E14 Queen's Indian: 4.e3] d4 Nf6 c4 e6 Nf3 b6 e3 [ECO E13 Queen's Indian: 4.Nc3, main line] d4 Nf6 c4 e6 Nf3 b6 Nc3 Bb7 Bg5 h6 Bh4 Bb4 [ECO E12 Queen's Indian: 4.Nc3, Botvinnik variation] d4 Nf6 c4 e6 Nf3 b6 Nc3 Bb7 Bg5 h6 Bh4 g5 Bg3 Nh5 [ECO E12 Queen's Indian: 4.Nc3] d4 Nf6 c4 e6 Nf3 b6 Nc3 [ECO E12 Queen's Indian: Petrosian system] d4 Nf6 c4 e6 Nf3 b6 a3 [ECO E12 Queen's Indian: Miles variation] d4 Nf6 c4 e6 Nf3 b6 Bf4 [ECO E12 Queen's Indian defence] d4 Nf6 c4 e6 Nf3 b6 [ECO E11 Bogo-Indian defence, Gr\"unfeld variation] d4 Nf6 c4 e6 Nf3 Bb4 N1d2 [ECO E11 Bogo-Indian defence, Nimzovich variation] d4 Nf6 c4 e6 Nf3 Bb4 Bd2 Qe7 [ECO E11 Bogo-Indian defence, Monticelli trap] d4 Nf6 c4 e6 Nf3 Bb4 Bd2 Bd2 Qd2 b6 g3 Bb7 Bg2 o-o Nc3 Ne4 Qc2 Nc3 Ng5 [ECO E11 Bogo-Indian defence] d4 Nf6 c4 e6 Nf3 Bb4 [ECO E10 D\"ory defence] d4 Nf6 c4 e6 Nf3 Ne4 [ECO E10 Dzindzikhashvili defence] d4 Nf6 c4 e6 Nf3 a6 [ECO E10 Blumenfeld counter-gambit, Spielmann variation] d4 Nf6 c4 e6 Nf3 c5 d5 b5 Bg5 ed cd h6 [ECO E10 Blumenfeld counter-gambit, Dus-Chotimursky variation] d4 Nf6 c4 e6 Nf3 c5 d5 b5 Bg5 [ECO E10 Blumenfeld counter-gambit accepted] d4 Nf6 c4 e6 Nf3 c5 d5 b5 de fe cb d5 [ECO E10 Blumenfeld counter-gambit] d4 Nf6 c4 e6 Nf3 c5 d5 b5 [ECO E10 Queen's pawn game] d4 Nf6 c4 e6 Nf3 [ECO E09 Catalan: closed, Sokolsky variation] d4 Nf6 c4 e6 g3 d5 Bg2 Be7 Nf3 o-o o-o N8d7 Qc2 c6 N1d2 b6 b3 a5 Bb2 Ba6 [ECO E09 Catalan: closed, main line] d4 Nf6 c4 e6 g3 d5 Bg2 Be7 Nf3 o-o o-o N8d7 Qc2 c6 N1d2 [ECO E08 Catalan: closed, Spassky gambit] d4 Nf6 c4 e6 g3 d5 Bg2 Be7 Nf3 o-o o-o N8d7 Qc2 c6 b3 b6 Rd1 Bb7 Nc3 b5 [ECO E08 Catalan: closed, Qc2 & b3] d4 Nf6 c4 e6 g3 d5 Bg2 Be7 Nf3 o-o o-o N8d7 Qc2 c6 b3 [ECO E08 Catalan: closed, Zagoryansky variation] d4 Nf6 c4 e6 g3 d5 Bg2 Be7 Nf3 o-o o-o N8d7 Qc2 c6 Rd1 b6 a4 [ECO E08 Catalan: closed, 7.Qc2] d4 Nf6 c4 e6 g3 d5 Bg2 Be7 Nf3 o-o o-o N8d7 Qc2 [ECO E07 Catalan: closed, Botvinnik variation] d4 Nf6 c4 e6 g3 d5 Bg2 Be7 Nf3 o-o o-o N8d7 Nc3 c6 Qd3 [ECO E07 Catalan: closed, 6...Nbd7] d4 Nf6 c4 e6 g3 d5 Bg2 Be7 Nf3 o-o o-o N8d7 [ECO E06 Catalan: closed, 5.Nf3] d4 Nf6 c4 e6 g3 d5 Bg2 Be7 Nf3 [ECO E05 Catalan: open, classical line] d4 Nf6 c4 e6 g3 d5 Bg2 dc Nf3 Be7 [ECO E04 Catalan: open, 5.Nf3] d4 Nf6 c4 e6 g3 d5 Bg2 dc Nf3 [ECO E03 Catalan: open, Alekhine variation] d4 Nf6 c4 e6 g3 d5 Bg2 dc Qa4 N8d7 Qc4 a6 Qc2 [ECO E03 Catalan: open, 5.Qa4 Nbd7, 6.Qxc4] d4 Nf6 c4 e6 g3 d5 Bg2 dc Qa4 N8d7 Qc4 [ECO E02 Catalan: open, 5.Qa4] d4 Nf6 c4 e6 g3 d5 Bg2 dc Qa4 [ECO E01 Catalan: closed] d4 Nf6 c4 e6 g3 d5 Bg2 [ECO E00 Catalan opening] d4 Nf6 c4 e6 g3 [ECO E00 Neo-Indian attack] d4 Nf6 c4 e6 Bg5 [ECO E00 Queen's pawn game] d4 Nf6 c4 e6 [ECO E99 King's Indian: orthodox, Aronin-Taimanov, Benk\"o attack] d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 Nf3 o-o Be2 e5 o-o Nc6 d5 Ne7 Ne1 Nd7 f3 f5 g4 [ECO E99 King's Indian: orthodox, Aronin-Taimanov, main line] d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 Nf3 o-o Be2 e5 o-o Nc6 d5 Ne7 Ne1 Nd7 f3 f5 [ECO E98 King's Indian: orthodox, Aronin-Taimanov, 9.Ne1] d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 Nf3 o-o Be2 e5 o-o Nc6 d5 Ne7 Ne1 [ECO E97 King's Indian: orthodox, Aronin-Taimanov, bayonet attack] d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 Nf3 o-o Be2 e5 o-o Nc6 d5 Ne7 b4 [ECO E97 King's Indian: orthodox, Aronin-Taimanov variation] d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 Nf3 o-o Be2 e5 o-o Nc6 [ECO E96 King's Indian: orthodox, 7...Nbd7, main line] d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 Nf3 o-o Be2 e5 o-o N8d7 Re1 c6 Bf1 a5 [ECO E95 King's Indian: orthodox, 7...Nbd7, 8.Re1] d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 Nf3 o-o Be2 e5 o-o N8d7 Re1 [ECO E94 King's Indian: orthodox, 7...Nbd7] d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 Nf3 o-o Be2 e5 o-o N8d7 [ECO E94 King's Indian: orthodox, Donner variation] d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 Nf3 o-o Be2 e5 o-o c6 [ECO E94 King's Indian: orthodox variation] d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 Nf3 o-o Be2 e5 o-o [ECO E93 King's Indian: Petrosian system, Keres variation] d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 Nf3 o-o Be2 e5 d5 N8d7 Bg5 h6 Bh4 g5 Bg3 Nh5 h4 [ECO E93 King's Indian: Petrosian system, main line] d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 Nf3 o-o Be2 e5 d5 N8d7 [ECO E92 King's Indian: Petrosian system, Stein variation] d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 Nf3 o-o Be2 e5 d5 a5 [ECO E92 King's Indian: Petrosian system] d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 Nf3 o-o Be2 e5 d5 [ECO E92 King's Indian: Gligori\'c-Taimanov system] d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 Nf3 o-o Be2 e5 Be3 [ECO E92 King's Indian: Andersson variation] d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 Nf3 o-o Be2 e5 de [ECO E92 King's Indian: classical variation] d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 Nf3 o-o Be2 e5 [ECO E91 King's Indian: Kazakh variation] d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 Nf3 o-o Be2 Na6 [ECO E91 King's Indian: 6.Be2] d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 Nf3 o-o Be2 [ECO E90 King's Indian: Zinnowitz variation] d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 Nf3 o-o Bg5 [ECO E90 King's Indian: Larsen variation] d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 Nf3 o-o Be3 [ECO E90 King's Indian: 5.Nf3] d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 Nf3 [ECO E89 King's Indian: S\"amisch, orthodox main line] d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 f3 o-o Be3 e5 d5 c6 N1e2 cd [ECO E88 King's Indian: S\"amisch, orthodox, 7.d5 c6] d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 f3 o-o Be3 e5 d5 c6 [ECO E87 King's Indian: S\"amisch, orthodox, Bronstein variation] d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 f3 o-o Be3 e5 d5 Nh5 Qd2 Qh4 g3 Ng3 Qf2 Nf1 Qh4 Ne3 Ke2 Nc4 [ECO E87 King's Indian: S\"amisch, orthodox, 7.d5] d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 f3 o-o Be3 e5 d5 [ECO E86 King's Indian: S\"amisch, orthodox, 7.Nge2 c6] d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 f3 o-o Be3 e5 N1e2 c6 [ECO E85 King's Indian: S\"amisch, orthodox variation] d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 f3 o-o Be3 e5 [ECO E84 King's Indian: S\"amisch, Panno main line] d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 f3 o-o Be3 Nc6 N1e2 a6 Qd2 Rb8 [ECO E83 King's Indian: S\"amisch, Panno formation] d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 f3 o-o Be3 Nc6 N1e2 a6 [ECO E83 King's Indian: S\"amisch, Ruban variation] d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 f3 o-o Be3 Nc6 N1e2 Rb8 [ECO E83 King's Indian: S\"amisch, 6...Nc6] d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 f3 o-o Be3 Nc6 [ECO E82 King's Indian: S\"amisch, double fianchetto variation] d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 f3 o-o Be3 b6 [ECO E81 King's Indian: S\"amisch, Byrne variation] d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 f3 o-o Be3 c6 Bd3 a6 [ECO E81 King's Indian: S\"amisch, 5...O-O] d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 f3 o-o [ECO E80 King's Indian: S\"amisch variation] d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 f3 [ECO E79 King's Indian: Four pawns attack, main line] d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 f4 o-o Be2 c5 Nf3 cd Nd4 Nc6 Be3 [ECO E78 King's Indian: Four pawns attack, with Be2 and Nf3] d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 f4 o-o Be2 c5 Nf3 [ECO E77 King's Indian: Four pawns attack, Florentine gambit] d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 f4 o-o Be2 c5 d5 e6 Nf3 ed e5 [ECO E77 King's Indian: Four pawns attack] d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 f4 o-o Be2 c5 d5 e6 Nf3 [ECO E77 King's Indian: Six pawns attack] d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 f4 o-o Be2 c5 d5 e6 de fe g4 Nc6 h4 [ECO E77 King's Indian: Four pawns attack, 6.Be2] d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 f4 o-o Be2 [ECO E76 King's Indian: Four pawns attack, dynamic line] d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 f4 o-o Nf3 c5 d5 [ECO E76 King's Indian: Four pawns attack] d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 f4 [ECO E75 King's Indian: Averbakh, main line] d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 Be2 o-o Bg5 c5 d5 e6 [ECO E74 King's Indian: Averbakh, 6...c5] d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 Be2 o-o Bg5 c5 [ECO E73 King's Indian: Averbakh system] d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 Be2 o-o Bg5 [ECO E73 King's Indian: Semi-Averbakh system] d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 Be2 o-o Be3 [ECO E73 King's Indian: 5.Be2] d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 Be2 [ECO E72 King's Indian: Pomar system] d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 g3 o-o Bg2 e5 N1e2 [ECO E72 King's Indian with e4 & g3] d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 g3 [ECO E71 King's Indian: Makagonov system ] d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 h3 [ECO E70 King's Indian: accelerated Averbakh system] d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 Bg5 [ECO E70 King's Indian: Kramer system] d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 N1e2 [ECO E70 King's Indian: 4.e4] d4 Nf6 c4 g6 Nc3 Bg7 e4 [ECO E69 King's Indian: fianchetto, classical main line] d4 Nf6 c4 g6 Nc3 Bg7 Nf3 d6 g3 o-o Bg2 N8d7 o-o e5 e4 c6 h3 [ECO E68 King's Indian: fianchetto, classical variation, 8.e4] d4 Nf6 c4 g6 Nc3 Bg7 Nf3 d6 g3 o-o Bg2 N8d7 o-o e5 e4 [ECO E67 King's Indian: fianchetto, classical variation] d4 Nf6 c4 g6 Nc3 Bg7 Nf3 d6 g3 o-o Bg2 N8d7 o-o e5 [ECO E67 King's Indian: fianchetto with ...Nd7] d4 Nf6 c4 g6 Nc3 Bg7 Nf3 d6 g3 o-o Bg2 N8d7 [ECO E66 King's Indian: fianchetto, Yugoslav Panno] d4 Nf6 c4 g6 Nc3 Bg7 Nf3 d6 g3 o-o Bg2 c5 o-o Nc6 d5 [ECO E65 King's Indian: fianchetto, Yugoslav, 7.O-O] d4 Nf6 c4 g6 Nc3 Bg7 Nf3 d6 g3 o-o Bg2 c5 o-o [ECO E64 King's Indian: fianchetto, Yugoslav system] d4 Nf6 c4 g6 Nc3 Bg7 Nf3 d6 g3 o-o Bg2 c5 [ECO E63 King's Indian: fianchetto, Panno variation] d4 Nf6 c4 g6 Nc3 Bg7 Nf3 d6 g3 o-o Bg2 Nc6 o-o a6 [ECO E62 King's Indian: fianchetto, Simagin variation] d4 Nf6 c4 g6 Nc3 Bg7 Nf3 d6 g3 o-o Bg2 Nc6 o-o Bg4 [ECO E62 King's Indian: fianchetto, lesser Simagin variation] d4 Nf6 c4 g6 Nc3 Bg7 Nf3 d6 g3 o-o Bg2 Nc6 o-o Bf5 [ECO E62 King's Indian: fianchetto, Uhlmann variation] d4 Nf6 c4 g6 Nc3 Bg7 Nf3 d6 g3 o-o Bg2 Nc6 o-o e5 [ECO E62 King's Indian: fianchetto with ...Nc6] d4 Nf6 c4 g6 Nc3 Bg7 Nf3 d6 g3 o-o Bg2 Nc6 [ECO E62 King's Indian: fianchetto, Kavalek variation] d4 Nf6 c4 g6 Nc3 Bg7 Nf3 d6 g3 o-o Bg2 c6 o-o Qa5 [ECO E62 King's Indian: fianchetto, Larsen system] d4 Nf6 c4 g6 Nc3 Bg7 Nf3 d6 g3 o-o Bg2 c6 o-o Bf5 [ECO E62 King's Indian: fianchetto variation] d4 Nf6 c4 g6 Nc3 Bg7 Nf3 d6 g3 [ECO E61 King's Indian: Smyslov system] d4 Nf6 c4 g6 Nc3 Bg7 Nf3 d6 Bg5 [ECO E61 King's Indian defence, 3.Nc3] d4 Nf6 c4 g6 Nc3 [ECO D99 Gr\"unfeld defence: Smyslov, Yugoslav variation] d4 Nf6 c4 g6 Nc3 d5 Nf3 Bg7 Qb3 dc Qc4 o-o e4 Bg4 Be3 N6d7 Qb3 c5 [ECO D99 Gr\"unfeld defence: Smyslov, main line] d4 Nf6 c4 g6 Nc3 d5 Nf3 Bg7 Qb3 dc Qc4 o-o e4 Bg4 Be3 N6d7 Qb3 [ECO D98 Gr\"unfeld: Russian, Keres variation] d4 Nf6 c4 g6 Nc3 d5 Nf3 Bg7 Qb3 dc Qc4 o-o e4 Bg4 Be3 N6d7 Be2 Nb6 Qd3 Nc6 o-o-o [ECO D98 Gr\"unfeld: Russian, Smyslov variation] d4 Nf6 c4 g6 Nc3 d5 Nf3 Bg7 Qb3 dc Qc4 o-o e4 Bg4 [ECO D97 Gr\"unfeld: Russian, Prins variation] d4 Nf6 c4 g6 Nc3 d5 Nf3 Bg7 Qb3 dc Qc4 o-o e4 Na6 [ECO D97 Gr\"unfeld: Russian, Byrne variation] d4 Nf6 c4 g6 Nc3 d5 Nf3 Bg7 Qb3 dc Qc4 o-o e4 Nc6 [ECO D97 Gr\"unfeld: Russian, Levenfish variation] d4 Nf6 c4 g6 Nc3 d5 Nf3 Bg7 Qb3 dc Qc4 o-o e4 b6 [ECO D97 Gr\"unfeld: Russian, Szabo variation] d4 Nf6 c4 g6 Nc3 d5 Nf3 Bg7 Qb3 dc Qc4 o-o e4 c6 [ECO D97 Gr\"unfeld: Russian, Alekhine variation] d4 Nf6 c4 g6 Nc3 d5 Nf3 Bg7 Qb3 dc Qc4 o-o e4 a6 [ECO D97 Gr\"unfeld: Russian variation with e4] d4 Nf6 c4 g6 Nc3 d5 Nf3 Bg7 Qb3 dc Qc4 o-o e4 [ECO D96 Gr\"unfeld: Russian variation] d4 Nf6 c4 g6 Nc3 d5 Nf3 Bg7 Qb3 [ECO D95 Gr\"unfeld: Botvinnik variation] d4 Nf6 c4 g6 Nc3 d5 Nf3 Bg7 e3 o-o Qb3 e6 [ECO D95 Gr\"unfeld: Pachman variation] d4 Nf6 c4 g6 Nc3 d5 Nf3 Bg7 e3 o-o Qb3 dc Bc4 N8d7 Ng5 [ECO D95 Gr\"unfeld with e3 & Qb3] d4 Nf6 c4 g6 Nc3 d5 Nf3 Bg7 e3 o-o Qb3 [ECO D94 Gr\"unfeld: Flohr defence] d4 Nf6 c4 g6 Nc3 d5 Nf3 Bg7 e3 o-o Bd3 c6 o-o Bf5 [ECO D94 Gr\"unfeld: Smyslov defence] d4 Nf6 c4 g6 Nc3 d5 Nf3 Bg7 e3 o-o Bd3 c6 o-o Bg4 [ECO D94 Gr\"unfeld with e3 & Bd3] d4 Nf6 c4 g6 Nc3 d5 Nf3 Bg7 e3 o-o Bd3 [ECO D94 Gr\"unfeld: Opo\v censky variation] d4 Nf6 c4 g6 Nc3 d5 Nf3 Bg7 e3 o-o Bd2 [ECO D94 Gr\"unfeld: Makogonov variation] d4 Nf6 c4 g6 Nc3 d5 Nf3 Bg7 e3 o-o b4 [ECO D94 Gr\"unfeld: 5.e3] d4 Nf6 c4 g6 Nc3 d5 Nf3 Bg7 e3 [ECO D93 Gr\"unfeld with Bf4 & e3] d4 Nf6 c4 g6 Nc3 d5 Nf3 Bg7 Bf4 o-o e3 [ECO D92 Gr\"unfeld: 5.Bf4] d4 Nf6 c4 g6 Nc3 d5 Nf3 Bg7 Bf4 [ECO D91 Gr\"unfeld: 5.Bg5] d4 Nf6 c4 g6 Nc3 d5 Nf3 Bg7 Bg5 [ECO D90 Gr\"unfeld: Flohr variation] d4 Nf6 c4 g6 Nc3 d5 Nf3 Bg7 Qa4 [ECO D90 Gr\"unfeld: Three knights variation] d4 Nf6 c4 g6 Nc3 d5 Nf3 Bg7 [ECO D90 Gr\"unfeld: Schlechter variation] d4 Nf6 c4 g6 Nc3 d5 Nf3 c6 [ECO D90 Gr\"unfeld: Three knights variation] d4 Nf6 c4 g6 Nc3 d5 Nf3 [ECO D89 Gr\"unfeld: exchange, Sokolsky variation] d4 Nf6 c4 g6 Nc3 d5 cd Nd5 e4 Nc3 bc Bg7 Bc4 o-o Ne2 c5 o-o Nc6 Be3 cd cd Bg4 f3 Na5 Bd3 Be6 d5 [ECO D89 Gr\"unfeld: Spassky variation, main line, 13.Bd3] d4 Nf6 c4 g6 Nc3 d5 cd Nd5 e4 Nc3 bc Bg7 Bc4 o-o Ne2 c5 o-o Nc6 Be3 cd cd Bg4 f3 Na5 Bd3 Be6 [ECO D88 Gr\"unfeld: Spassky variation, main line, 10...cd, 11.cd] d4 Nf6 c4 g6 Nc3 d5 cd Nd5 e4 Nc3 bc Bg7 Bc4 o-o Ne2 c5 o-o Nc6 Be3 cd cd [ECO D87 Gr\"unfeld: exchange, Seville variation] d4 Nf6 c4 g6 Nc3 d5 cd Nd5 e4 Nc3 bc Bg7 Bc4 o-o Ne2 c5 o-o Nc6 Be3 Bg4 f3 Na5 Bf7 [ECO D87 Gr\"unfeld: exchange, Spassky variation] d4 Nf6 c4 g6 Nc3 d5 cd Nd5 e4 Nc3 bc Bg7 Bc4 o-o Ne2 c5 [ECO D86 Gr\"unfeld: exchange, Simagin's improved variation] d4 Nf6 c4 g6 Nc3 d5 cd Nd5 e4 Nc3 bc Bg7 Bc4 o-o Ne2 Nc6 [ECO D86 Gr\"unfeld: exchange, Simagin's lesser variation] d4 Nf6 c4 g6 Nc3 d5 cd Nd5 e4 Nc3 bc Bg7 Bc4 o-o Ne2 b6 [ECO D86 Gr\"unfeld: exchange, Larsen variation] d4 Nf6 c4 g6 Nc3 d5 cd Nd5 e4 Nc3 bc Bg7 Bc4 o-o Ne2 Qd7 o-o b6 [ECO D86 Gr\"unfeld: exchange, classical variation] d4 Nf6 c4 g6 Nc3 d5 cd Nd5 e4 Nc3 bc Bg7 Bc4 [ECO D85 Gr\"unfeld: modern exchange variation] d4 Nf6 c4 g6 Nc3 d5 cd Nd5 e4 Nc3 bc Bg7 Nf3 [ECO D85 Gr\"unfeld: exchange variation] d4 Nf6 c4 g6 Nc3 d5 cd Nd5 [ECO D84 Gr\"unfeld: Gr\"unfeld gambit accepted] d4 Nf6 c4 g6 Nc3 d5 Bf4 Bg7 e3 o-o cd Nd5 Nd5 Qd5 Bc7 [ECO D83 Gr\"unfeld: Gr\"unfeld gambit, Botvinnik variation] d4 Nf6 c4 g6 Nc3 d5 Bf4 Bg7 e3 o-o Rc1 c5 dc Be6 [ECO D83 Gr\"unfeld: Gr\"unfeld gambit, Capablanca variation] d4 Nf6 c4 g6 Nc3 d5 Bf4 Bg7 e3 o-o Rc1 [ECO D83 Gr\"unfeld: Gr\"unfeld gambit] d4 Nf6 c4 g6 Nc3 d5 Bf4 Bg7 e3 o-o [ECO D82 Gr\"unfeld: 4.Bf4] d4 Nf6 c4 g6 Nc3 d5 Bf4 [ECO D81 Gr\"unfeld: Russian variation] d4 Nf6 c4 g6 Nc3 d5 Qb3 [ECO D80 Gr\"unfeld: Lundin variation] d4 Nf6 c4 g6 Nc3 d5 Bg5 Ne4 Ne4 de Qd2 c5 [ECO D80 Gr\"unfeld: Stockholm variation] d4 Nf6 c4 g6 Nc3 d5 Bg5 [ECO D80 Gr\"unfeld: Spike gambit] d4 Nf6 c4 g6 Nc3 d5 g4 [ECO D80 Gr\"unfeld defence] d4 Nf6 c4 g6 Nc3 d5 [ECO D79 Neo-Gr\"unfeld, 6.O-O, main line] d4 Nf6 c4 g6 g3 d5 Bg2 Bg7 Nf3 o-o o-o c6 cd cd [ECO D78 Neo-Gr\"unfeld, 6.O-O c6] d4 Nf6 c4 g6 g3 d5 Bg2 Bg7 Nf3 o-o o-o c6 [ECO D77 Neo-Gr\"unfeld, 6.O-O] d4 Nf6 c4 g6 g3 d5 Bg2 Bg7 Nf3 o-o o-o [ECO D76 Neo-Gr\"unfeld, 6.cd Nxd5, 7.O-O Nb6] d4 Nf6 c4 g6 g3 d5 Bg2 Bg7 Nf3 o-o cd Nd5 o-o Nb6 [ECO D75 Neo-Gr\"unfeld, 6.cd Nxd5, 7.O-O c5, 8.Nc3] d4 Nf6 c4 g6 g3 d5 Bg2 Bg7 Nf3 o-o cd Nd5 o-o c5 Nc3 [ECO D75 Neo-Gr\"unfeld, 6.cd Nxd5, 7.O-O c5, 8.dc] d4 Nf6 c4 g6 g3 d5 Bg2 Bg7 Nf3 o-o cd Nd5 o-o c5 dc [ECO D74 Neo-Gr\"unfeld, 6.cd Nxd5, 7.O-O] d4 Nf6 c4 g6 g3 d5 Bg2 Bg7 Nf3 o-o cd Nd5 o-o [ECO D73 Neo-Gr\"unfeld, 5.Nf3] d4 Nf6 c4 g6 g3 d5 Bg2 Bg7 Nf3 [ECO D72 Neo-Gr\"unfeld, 5.cd, main line] d4 Nf6 c4 g6 g3 d5 Bg2 Bg7 cd Nd5 e4 Nb6 Ne2 [ECO D71 Neo-Gr\"unfeld, 5.cd] d4 Nf6 c4 g6 g3 d5 Bg2 Bg7 cd Nd5 [ECO D70 Neo-Gr\"unfeld defence] d4 Nf6 c4 g6 g3 d5 [ECO E60 King's Indian: 3.g3, counterthrust variation] d4 Nf6 c4 g6 g3 Bg7 Bg2 d5 [ECO E60 King's Indian: 3.g3] d4 Nf6 c4 g6 g3 [ECO D70 Neo-Gr\"unfeld defence] d4 Nf6 c4 g6 Nf3 d5 [ECO E60 King's Indian, 3.Nf3] d4 Nf6 c4 g6 Nf3 [ECO E60 Queen's pawn: Mengarini attack] d4 Nf6 c4 g6 Qc2 [ECO E60 King's Indian: Danube gambit] d4 Nf6 c4 g6 d5 b5 [ECO E60 King's Indian: Anti-Gr\"unfeld] d4 Nf6 c4 g6 d5 [ECO D70 Neo-Gr\"unfeld defence] d4 Nf6 c4 g6 f3 d5 [ECO E60 King's Indian defence] d4 Nf6 c4 g6 [ECO A79 Benoni: classical, 11.f3] d4 Nf6 c4 c5 d5 e6 Nc3 ed cd d6 e4 g6 Nf3 Bg7 Be2 o-o o-o Re8 Nd2 Na6 f3 [ECO A78 Benoni: classical with ...Re8 and ...Na6] d4 Nf6 c4 c5 d5 e6 Nc3 ed cd d6 e4 g6 Nf3 Bg7 Be2 o-o o-o Re8 Nd2 Na6 [ECO A77 Benoni: classical, 9...Re8, 10.Nd2] d4 Nf6 c4 c5 d5 e6 Nc3 ed cd d6 e4 g6 Nf3 Bg7 Be2 o-o o-o Re8 Nd2 [ECO A76 Benoni: classical, 9...Re8] d4 Nf6 c4 c5 d5 e6 Nc3 ed cd d6 e4 g6 Nf3 Bg7 Be2 o-o o-o Re8 [ECO A75 Benoni: classical with ...a6 and 10...Bg4] d4 Nf6 c4 c5 d5 e6 Nc3 ed cd d6 e4 g6 Nf3 Bg7 Be2 o-o o-o a6 a4 Bg4 [ECO A74 Benoni: classical, 9...a6, 10.a4] d4 Nf6 c4 c5 d5 e6 Nc3 ed cd d6 e4 g6 Nf3 Bg7 Be2 o-o o-o a6 a4 [ECO A73 Benoni: classical, 9.O-O] d4 Nf6 c4 c5 d5 e6 Nc3 ed cd d6 e4 g6 Nf3 Bg7 Be2 o-o o-o [ECO A72 Benoni: classical without 9.O-O] d4 Nf6 c4 c5 d5 e6 Nc3 ed cd d6 e4 g6 Nf3 Bg7 Be2 o-o [ECO A70 Benoni: classical without 9.O-O] d4 Nf6 c4 c5 d5 e6 Nc3 ed cd d6 e4 g6 Nf3 Bg7 Be2 [ECO A71 Benoni: classical, 8.Bg5] d4 Nf6 c4 c5 d5 e6 Nc3 ed cd d6 e4 g6 Nf3 Bg7 Bg5 [ECO A70 Benoni: classical with e4 and Nf3] d4 Nf6 c4 c5 d5 e6 Nc3 ed cd d6 e4 g6 Nf3 [ECO A67 Benoni: Taimanov variation] d4 Nf6 c4 c5 d5 e6 Nc3 ed cd d6 e4 g6 f4 Bg7 Bb5 [ECO A66 Benoni: Mikenas variation] d4 Nf6 c4 c5 d5 e6 Nc3 ed cd d6 e4 g6 f4 Bg7 e5 [ECO A69 Benoni: four pawns attack, main line] d4 Nf6 c4 c5 d5 e6 Nc3 ed cd d6 e4 g6 f4 Bg7 Nf3 o-o Be2 Re8 [ECO A68 Benoni: four pawns attack] d4 Nf6 c4 c5 d5 e6 Nc3 ed cd d6 e4 g6 f4 Bg7 Nf3 o-o [ECO A66 Benoni: pawn storm variation] d4 Nf6 c4 c5 d5 e6 Nc3 ed cd d6 e4 g6 f4 [ECO A65 Benoni: 6.e4] d4 Nf6 c4 c5 d5 e6 Nc3 ed cd d6 e4 [ECO A64 Benoni: fianchetto, 11...Re8] d4 Nf6 c4 c5 d5 e6 Nc3 ed cd d6 Nf3 g6 g3 Bg7 Bg2 o-o o-o N8d7 Nd2 a6 a4 Re8 [ECO A63 Benoni: fianchetto, 9...Nbd7] d4 Nf6 c4 c5 d5 e6 Nc3 ed cd d6 Nf3 g6 g3 Bg7 Bg2 o-o o-o N8d7 [ECO A62 Benoni: fianchetto variation] d4 Nf6 c4 c5 d5 e6 Nc3 ed cd d6 Nf3 g6 g3 Bg7 Bg2 o-o [ECO A61 Benoni: fianchetto variation] d4 Nf6 c4 c5 d5 e6 Nc3 ed cd d6 Nf3 g6 g3 [ECO A61 Benoni: Nimzovich variation] d4 Nf6 c4 c5 d5 e6 Nc3 ed cd d6 Nf3 g6 Nd2 [ECO A61 Benoni: Uhlmann variation] d4 Nf6 c4 c5 d5 e6 Nc3 ed cd d6 Nf3 g6 Bg5 [ECO A61 Benoni defence] d4 Nf6 c4 c5 d5 e6 Nc3 ed cd d6 Nf3 g6 [ECO A60 Benoni defence] d4 Nf6 c4 c5 d5 e6 [ECO A59 Benk\"o gambit: main line] d4 Nf6 c4 c5 d5 b5 cb a6 ba Ba6 Nc3 d6 e4 Bf1 Kf1 g6 g3 Bg7 Kg2 o-o Nf3 [ECO A59 Benk\"o gambit] d4 Nf6 c4 c5 d5 b5 cb a6 ba Ba6 Nc3 d6 e4 Bf1 Kf1 g6 g3 [ECO A59 Benk\"o gambit: Ne2 variation] d4 Nf6 c4 c5 d5 b5 cb a6 ba Ba6 Nc3 d6 e4 Bf1 Kf1 g6 N1e2 [ECO A59 Benk\"o gambit: 7.e4] d4 Nf6 c4 c5 d5 b5 cb a6 ba Ba6 Nc3 d6 e4 [ECO A58 Benk\"o gambit: fianchetto variation] d4 Nf6 c4 c5 d5 b5 cb a6 ba Ba6 Nc3 d6 Nf3 g6 g3 [ECO A58 Benk\"o gambit: Nd2 variation] d4 Nf6 c4 c5 d5 b5 cb a6 ba Ba6 Nc3 d6 Nf3 g6 Nd2 [ECO A58 Benk\"o gambit accepted] d4 Nf6 c4 c5 d5 b5 cb a6 ba [ECO A57 Benk\"o gambit: Nescaf\'e Frapp\'e attack] d4 Nf6 c4 c5 d5 b5 cb a6 Nc3 ab e4 b4 Nb5 d6 Bc4 [ECO A57 Benk\"o gambit: Zaitsev system] d4 Nf6 c4 c5 d5 b5 cb a6 Nc3 [ECO A57 Benk\"o gambit half accepted] d4 Nf6 c4 c5 d5 b5 cb a6 [ECO A57 Benk\"o gambit] d4 Nf6 c4 c5 d5 b5 [ECO A56 Czech Benoni: King's Indian system] d4 Nf6 c4 c5 d5 e5 Nc3 d6 e4 g6 [ECO A56 Czech Benoni defence] d4 Nf6 c4 c5 d5 e5 [ECO A56 Vulture defence] d4 Nf6 c4 c5 d5 Ne4 [ECO A56 Benoni defence, Hromodka system] d4 Nf6 c4 c5 d5 d6 [ECO A56 Benoni defence] d4 Nf6 c4 c5 [ECO A55 Old Indian: main line] d4 Nf6 c4 d6 Nc3 e5 Nf3 N8d7 e4 [ECO A54 Old Indian: Ukrainian variation, 4.Nf3] d4 Nf6 c4 d6 Nc3 e5 Nf3 [ECO A54 Old Indian: Dus-Khotimirsky variation] d4 Nf6 c4 d6 Nc3 e5 e3 N8d7 Bd3 [ECO A54 Old Indian: Ukrainian variation] d4 Nf6 c4 d6 Nc3 e5 [ECO A53 Old Indian: Janowski variation] d4 Nf6 c4 d6 Nc3 Bf5 [ECO A53 Old Indian defence] d4 Nf6 c4 d6 [ECO A52 Budapest: Alekhine variation, Balogh gambit] d4 Nf6 c4 e5 de Ng4 e4 d6 [ECO A52 Budapest: Alekhine, Abonyi variation] d4 Nf6 c4 e5 de Ng4 e4 Ne5 f4 N5c6 [ECO A52 Budapest: Alekhine variation] d4 Nf6 c4 e5 de Ng4 e4 [ECO A52 Budapest: Rubinstein variation] d4 Nf6 c4 e5 de Ng4 Bf4 [ECO A52 Budapest: Adler variation] d4 Nf6 c4 e5 de Ng4 Nf3 [ECO A52 Budapest defence] d4 Nf6 c4 e5 de Ng4 [ECO A51 Budapest: Fajarowicz, Steiner variation] d4 Nf6 c4 e5 de Ne4 Qc2 [ECO A51 Budapest: Fajarowicz variation] d4 Nf6 c4 e5 de Ne4 [ECO A51 Budapest defence declined] d4 Nf6 c4 e5 [ECO A50 Queen's Indian accelerated] d4 Nf6 c4 b6 [ECO A?? Kevitz-Trajkovich defence] d4 Nf6 c4 Nc6 [ECO A?? Queen's pawn game] d4 Nf6 c4 [ECO A49 King's Indian: fianchetto without c4] d4 Nf6 Nf3 g6 g3 [ECO A48 King's Indian: London system] d4 Nf6 Nf3 g6 Bf4 [ECO A48 King's Indian: Torre attack] d4 Nf6 Nf3 g6 Bg5 [ECO A48 King's Indian: East Indian defence] d4 Nf6 Nf3 g6 [ECO A47 Queen's Indian: Marienbad system, Berg variation] d4 Nf6 Nf3 b6 g3 Bb7 Bg2 c5 c4 cd Qd4 [ECO A47 Queen's Indian: Marienbad system] d4 Nf6 Nf3 b6 g3 Bb7 Bg2 c5 [ECO A47 Queen's Indian defence] d4 Nf6 Nf3 b6 [ECO A46 D\"ory defence] d4 Nf6 Nf3 Ne4 [ECO A46 Queen's pawn: Yusupov-Rubinstein system] d4 Nf6 Nf3 e6 e3 [ECO A46 Queen's pawn: Torre attack, Wagner gambit] d4 Nf6 Nf3 e6 Bg5 c5 e4 [ECO A46 Queen's pawn: Torre attack] d4 Nf6 Nf3 e6 Bg5 [ECO A46 Queen's pawn game] d4 Nf6 Nf3 [ECO A45 Trompovsky attack ] d4 Nf6 Bg5 [ECO A45 Gedult attack] d4 Nf6 f3 d5 g4 [ECO A45 Blackmar-Diemer gambit] d4 Nf6 f3 d5 e4 [ECO A45 Paleface attack] d4 Nf6 f3 [ECO A45 Canard opening] d4 Nf6 f4 [ECO A45 Queen's pawn: Bronstein gambit] d4 Nf6 g4 [ECO A45 Queen's pawn game] d4 Nf6 [ECO A99 Dutch: Ilyin-Genevsky variation with b3] d4 f5 c4 Nf6 g3 e6 Bg2 Be7 Nf3 o-o o-o d6 Nc3 Qe8 b3 [ECO A98 Dutch: Ilyin-Genevsky variation with Qc2] d4 f5 c4 Nf6 g3 e6 Bg2 Be7 Nf3 o-o o-o d6 Nc3 Qe8 Qc2 [ECO A97 Dutch: Ilyin-Genevsky, Winter variation] d4 f5 c4 Nf6 g3 e6 Bg2 Be7 Nf3 o-o o-o d6 Nc3 Qe8 Re1 [ECO A97 Dutch: Ilyin-Genevsky variation] d4 f5 c4 Nf6 g3 e6 Bg2 Be7 Nf3 o-o o-o d6 Nc3 Qe8 [ECO A96 Dutch: classical variation] d4 f5 c4 Nf6 g3 e6 Bg2 Be7 Nf3 o-o o-o d6 [ECO A95 Dutch: stonewall: Chekhover variation] d4 f5 c4 Nf6 g3 e6 Bg2 Be7 Nf3 o-o o-o d5 Nc3 c6 Qc2 Qe8 Bg5 [ECO A95 Dutch: stonewall with Nc3] d4 f5 c4 Nf6 g3 e6 Bg2 Be7 Nf3 o-o o-o d5 Nc3 c6 [ECO A92 Dutch: stonewall with Nc3] d4 f5 c4 Nf6 g3 e6 Bg2 Be7 Nf3 o-o o-o d5 Nc3 [ECO A94 Dutch: stonewall with Ba3] d4 f5 c4 Nf6 g3 e6 Bg2 Be7 Nf3 o-o o-o d5 b3 c6 Ba3 [ECO A93 Dutch: stonewall, Botwinnik variation] d4 f5 c4 Nf6 g3 e6 Bg2 Be7 Nf3 o-o o-o d5 b3 [ECO A92 Dutch: stonewall variation] d4 f5 c4 Nf6 g3 e6 Bg2 Be7 Nf3 o-o o-o d5 [ECO A92 Dutch defence, Alekhine variation] d4 f5 c4 Nf6 g3 e6 Bg2 Be7 Nf3 o-o o-o Ne4 [ECO A92 Dutch defence] d4 f5 c4 Nf6 g3 e6 Bg2 Be7 Nf3 o-o [ECO A91 Dutch defence] d4 f5 c4 Nf6 g3 e6 Bg2 Be7 [ECO A90 Dutch-Indian, Alekhine variation] d4 f5 c4 Nf6 g3 e6 Bg2 Bb4 Bd2 Be7 [ECO A90 Dutch defence: Dutch-Indian variation] d4 f5 c4 Nf6 g3 e6 Bg2 Bb4 [ECO A90 Dutch defence] d4 f5 c4 Nf6 g3 e6 Bg2 [ECO A89 Dutch: Leningrad, main variation with Nc6] d4 f5 c4 Nf6 g3 g6 Bg2 Bg7 Nf3 o-o o-o d6 Nc3 Nc6 [ECO A88 Dutch: Leningrad, main variation with c6] d4 f5 c4 Nf6 g3 g6 Bg2 Bg7 Nf3 o-o o-o d6 Nc3 c6 [ECO A87 Dutch: Leningrad, main variation] d4 f5 c4 Nf6 g3 g6 Bg2 Bg7 Nf3 [ECO A86 Dutch: Leningrad variation] d4 f5 c4 Nf6 g3 g6 [ECO A86 Dutch: Hort-Antoshin system] d4 f5 c4 Nf6 g3 d6 Bg2 c6 Nc3 Qc7 [ECO A86 Dutch with c4 & g3] d4 f5 c4 Nf6 g3 [ECO A85 Dutch with c4 & Nc3] d4 f5 c4 Nf6 Nc3 [ECO A84 Dutch defence] d4 f5 c4 Nf6 [ECO A84 Dutch: Staunton gambit deferred] d4 f5 c4 e6 e4 [ECO A84 Dutch defence, Rubinstein variation] d4 f5 c4 e6 Nc3 [ECO A84 Dutch defence] d4 f5 c4 e6 [ECO A84 Dutch defence: Bladel variation] d4 f5 c4 g6 Nc3 Nh6 [ECO A84 Dutch defence] d4 f5 c4 [ECO A83 Dutch: Staunton gambit, Nimzovich variation] d4 f5 e4 fe Nc3 Nf6 Bg5 b6 [ECO A83 Dutch: Staunton gambit, Chigorin variation] d4 f5 e4 fe Nc3 Nf6 Bg5 c6 [ECO A83 Dutch: Staunton gambit, Lasker variation] d4 f5 e4 fe Nc3 Nf6 Bg5 g6 f3 [ECO A83 Dutch: Staunton gambit, Alekhine variation] d4 f5 e4 fe Nc3 Nf6 Bg5 g6 h4 [ECO A83 Dutch: Staunton gambit, Staunton's line] d4 f5 e4 fe Nc3 Nf6 Bg5 [ECO A82 Dutch: Staunton gambit, Tartakower variation] d4 f5 e4 fe Nc3 Nf6 g4 [ECO A82 Dutch: Staunton gambit] d4 f5 e4 fe [ECO A82 Dutch: Balogh defence] d4 f5 e4 d6 [ECO A82 Dutch: Staunton gambit] d4 f5 e4 [ECO A81 Dutch: Leningrad, Karlsbad variation] d4 f5 g3 g6 Bg2 Bg7 Nh3 [ECO A81 Dutch: Leningrad, Basman system] d4 f5 g3 g6 Bg2 Bg7 Nf3 c6 o-o Nh6 [ECO A81 Dutch defence] d4 f5 g3 Nf6 Bg2 g6 [ECO A81 Dutch defence, Blackburne variation] d4 f5 g3 Nf6 Bg2 e6 Nh3 [ECO A81 Dutch defence] d4 f5 g3 [ECO A80 Dutch, 2.Bg5 variation] d4 f5 Bg5 [ECO A80 Dutch, Krejcik gambit] d4 f5 g4 [ECO A80 Dutch, Korchnoi attack] d4 f5 h3 [ECO A80 Dutch, Von Pretzel gambit] d4 f5 Qd3 e6 g4 [ECO A80 Dutch, Manhattan variation] d4 f5 Qd3 [ECO A80 Dutch, Spielmann gambit] d4 f5 Nc3 Nf6 g4 [ECO A80 Dutch] d4 f5 [ECO A44 Semi-Benoni ] d4 c5 d5 e5 e4 d6 [ECO A44 Old Benoni defence] d4 c5 d5 e5 [ECO A43 Old Benoni: Schmid's system] d4 c5 d5 d6 Nc3 g6 [ECO A43 Old Benoni defence] d4 c5 d5 d6 [ECO A43 Hawk defence] d4 c5 d5 Nf6 Nf3 c4 [ECO A43 Old Benoni defence] d4 c5 d5 Nf6 Nf3 [ECO A43 Woozle defence] d4 c5 d5 Nf6 Nc3 Qa5 [ECO A43 Old Benoni defence] d4 c5 d5 Nf6 [ECO A43 Old Benoni: Mujannah formation] d4 c5 d5 f5 [ECO A43 Old Benoni: Franco-Benoni defence] d4 c5 d5 e6 e4 [ECO A43 Old Benoni defence] d4 c5 [ECO A42 Modern defence: Averbakh system, Kotov variation] d4 d6 c4 g6 Nc3 Bg7 e4 Nc6 [ECO A42 Modern defence: Averbakh system, Randspringer variation] d4 d6 c4 g6 Nc3 Bg7 e4 f5 [ECO A42 Pterodactyl defence] d4 d6 c4 g6 Nc3 Bg7 e4 c5 Nf3 Qa5 [ECO A42 Modern defence: Averbakh system] d4 d6 c4 g6 Nc3 Bg7 e4 [ECO A41 Modern defence] d4 d6 c4 g6 Nc3 Bg7 [ECO A41 Old Indian defence] d4 d6 c4 [ECO A41 Old Indian: Tartakower variation] d4 d6 Nf3 Bg4 [ECO A41 Queen's Pawn] d4 d6 [ECO A40 Beefeater defence] d4 g6 c4 Bg7 Nc3 c5 d5 Bc3 bc f5 [ECO A40 Modern defence] d4 g6 [ECO A40 Queen's pawn: Franco-Indian defence] d4 e6 c4 Bb4 [ECO A40 Queen's pawn: Keres defence] d4 e6 c4 b6 [ECO A40 Queen's pawn] d4 e6 [ECO A40 Polish defence] d4 b5 [ECO A40 Queen's pawn: English defence] d4 b6 [ECO A40 Queen's pawn: Englund gambit] d4 e5 de Nc6 Nf3 Qe7 Qd5 f6 ef Nf6 [ECO A40 Queen's pawn: Charlick gambit] d4 e5 [ECO A40 Queen's pawn: Lundin defence] d4 Nc6 [ECO A40 Queen's pawn] d4 [ECO A39 English: symmetrical, main line with d4] c4 c5 Nc3 Nc6 g3 g6 Bg2 Bg7 Nf3 Nf6 o-o o-o d4 [ECO A38 English: symmetrical, main line with d3] c4 c5 Nc3 Nc6 g3 g6 Bg2 Bg7 Nf3 Nf6 o-o o-o d3 [ECO A38 English: symmetrical, main line with b3] c4 c5 Nc3 Nc6 g3 g6 Bg2 Bg7 Nf3 Nf6 o-o o-o b3 [ECO A38 English: symmetrical variation] c4 c5 Nc3 Nc6 g3 g6 Bg2 Bg7 Nf3 Nf6 [ECO A37 English: symmetrical, Botvinnik system reversed] c4 c5 Nc3 Nc6 g3 g6 Bg2 Bg7 Nf3 e5 [ECO A37 English: symmetrical variation] c4 c5 Nc3 Nc6 g3 g6 Bg2 Bg7 Nf3 [ECO A36 English: symmetrical, Botvinnik system] c4 c5 Nc3 Nc6 g3 g6 Bg2 Bg7 e4 [ECO A36 English: symmetrical, Botvinnik system reversed] c4 c5 Nc3 Nc6 g3 g6 Bg2 Bg7 e3 e5 [ECO A36 English: ultra-symmetrical variation] c4 c5 Nc3 Nc6 g3 g6 Bg2 Bg7 [ECO A36 English: symmetrical variation] c4 c5 Nc3 Nc6 g3 [ECO A35 English: symmetrical, four knights system] c4 c5 Nc3 Nc6 Nf3 Nf6 [ECO A35 English: symmetrical variation] c4 c5 Nc3 Nc6 [ECO A34 English: symmetrical, Rubinstein system] c4 c5 Nc3 Nf6 g3 d5 cd Nd5 Bg2 Nc7 [ECO A34 English: symmetrical variation] c4 c5 Nc3 Nf6 g3 [ECO A34 English: symmetrical, three knights system] c4 c5 Nc3 Nf6 Nf3 d5 cd Nd5 [ECO A34 English: symmetrical variation] c4 c5 Nc3 [ECO A33 English: symmetrical, Geller variation] c4 c5 Nf3 Nf6 d4 cd Nd4 e6 Nc3 Nc6 g3 Qb6 [ECO A33 English: symmetrical variation] c4 c5 Nf3 Nf6 d4 cd Nd4 e6 Nc3 Nc6 [ECO A32 English: symmetrical variation] c4 c5 Nf3 Nf6 d4 cd Nd4 e6 [ECO A31 English: symmetrical, Benoni formation] c4 c5 Nf3 Nf6 d4 [ECO A30 English: symmetrical, hedgehog, flexible formation] c4 c5 Nf3 Nf6 g3 b6 Bg2 Bb7 o-o e6 Nc3 Be7 d4 cd Qd4 d6 Rd1 a6 b3 N8d7 [ECO A30 English: symmetrical, hedgehog system] c4 c5 Nf3 Nf6 g3 b6 Bg2 Bb7 o-o e6 Nc3 Be7 [ECO A30 English: symmetrical variation] c4 c5 [ECO A29 English: four knights, kingside fianchetto] c4 e5 Nc3 Nc6 Nf3 Nf6 g3 [ECO A28 English: four knights, Romanishin variation] c4 e5 Nc3 Nc6 Nf3 Nf6 e3 Bb4 Qc2 Bc3 [ECO A28 English: four knights, Stean variation] c4 e5 Nc3 Nc6 Nf3 Nf6 e3 Bb4 Qc2 o-o Nd5 Re8 Qf5 [ECO A28 English: four knights, 4.e3] c4 e5 Nc3 Nc6 Nf3 Nf6 e3 [ECO A28 English: four knights, Capablanca variation] c4 e5 Nc3 Nc6 Nf3 Nf6 d3 [ECO A28 English: four knights, Marini variation] c4 e5 Nc3 Nc6 Nf3 Nf6 a3 [ECO A28 English: four knights, Nimzovich variation] c4 e5 Nc3 Nc6 Nf3 Nf6 e4 [ECO A28 English: Bradley Beach variation] c4 e5 Nc3 Nc6 Nf3 Nf6 d4 e4 [ECO A28 English: Nenarokov variation] c4 e5 Nc3 Nc6 Nf3 Nf6 d4 ed Nd4 Bb4 Bg5 h6 Bh4 Bc3 bc Ne5 [ECO A28 English: four knights system] c4 e5 Nc3 Nc6 Nf3 Nf6 [ECO A27 English: three knights system] c4 e5 Nc3 Nc6 Nf3 [ECO A26 English: Botvinnik system] c4 e5 Nc3 Nc6 g3 g6 Bg2 Bg7 d3 d6 e4 [ECO A26 English: closed system] c4 e5 Nc3 Nc6 g3 g6 Bg2 Bg7 d3 d6 [ECO A25 English: closed system ] c4 e5 Nc3 Nc6 g3 g6 Bg2 Bg7 d3 [ECO A25 English: closed, 5.Rb1 Taimanov variation] c4 e5 Nc3 Nc6 g3 g6 Bg2 Bg7 Rb1 Nh6 [ECO A25 English: closed, 5.Rb1] c4 e5 Nc3 Nc6 g3 g6 Bg2 Bg7 Rb1 [ECO A25 English: closed, Hort variation] c4 e5 Nc3 Nc6 g3 g6 Bg2 Bg7 e3 d6 N1e2 Be6 [ECO A25 English: closed, Taimanov variation] c4 e5 Nc3 Nc6 g3 g6 Bg2 Bg7 e3 d6 N1e2 Nh6 [ECO A25 English: closed system] c4 e5 Nc3 Nc6 g3 g6 Bg2 Bg7 [ECO A25 English: Sicilian reversed] c4 e5 Nc3 Nc6 [ECO A24 English: Bremen system with ...g6] c4 e5 Nc3 Nf6 g3 g6 [ECO A23 English: Bremen system, Keres variation] c4 e5 Nc3 Nf6 g3 c6 [ECO A22 English: Bremen, Smyslov system] c4 e5 Nc3 Nf6 g3 Bb4 [ECO A22 English: Bremen, reverse dragon] c4 e5 Nc3 Nf6 g3 d5 [ECO A22 English: Carls' Bremen system] c4 e5 Nc3 Nf6 g3 [ECO A22 English: Bellon gambit] c4 e5 Nc3 Nf6 Nf3 e4 Ng5 b5 [ECO A22 English opening] c4 e5 Nc3 Nf6 [ECO A21 English, Kramnik-Shirov counterattack] c4 e5 Nc3 Bb4 [ECO A21 English, Smyslov defence] c4 e5 Nc3 d6 Nf3 Bg4 [ECO A21 English opening] c4 e5 Nc3 d6 Nf3 [ECO A21 English, Keres variation] c4 e5 Nc3 d6 g3 c6 [ECO A21 English, Tr\"oger defence] c4 e5 Nc3 d6 g3 Be6 Bg2 Nc6 [ECO A21 English opening] c4 e5 Nc3 [ECO A20 English, Nimzovich, Flohr variation] c4 e5 Nf3 e4 [ECO A20 English, Nimzovich variation] c4 e5 Nf3 [ECO A20 English opening] c4 e5 [ECO A19 English: Mikenas-Carls, Sicilian variation] c4 Nf6 Nc3 e6 e4 c5 [ECO A18 English: Mikenas-Carls, Kevitz variation] c4 Nf6 Nc3 e6 e4 Nc6 [ECO A18 English: Mikenas-Carls, Flohr variation] c4 Nf6 Nc3 e6 e4 d5 e5 [ECO A18 English: Mikenas-Carls variation] c4 Nf6 Nc3 e6 e4 [ECO A17 English: Nimzo-English opening] c4 Nf6 Nc3 e6 Nf3 Bb4 [ECO A17 English: Queens Indian, Romanishin variation] c4 Nf6 Nc3 e6 Nf3 b6 e4 Bb7 Bd3 [ECO A17 English: Queens Indian formation] c4 Nf6 Nc3 e6 Nf3 b6 [ECO A17 English opening] c4 Nf6 Nc3 e6 [ECO A16 English: Anglo-Gr\"unfeld defense, Korchnoi variation] c4 Nf6 Nc3 d5 cd Nd5 Nf3 g6 g3 Bg7 Bg2 e5 [ECO A16 English: Anglo-Gr\"unfeld defense] c4 Nf6 Nc3 d5 cd Nd5 Nf3 [ECO A16 English: Anglo-Gr\"unfeld, Czech defense] c4 Nf6 Nc3 d5 cd Nd5 g3 g6 Bg2 Nb6 [ECO A16 English: Anglo-Gr\"unfeld, Smyslov defense] c4 Nf6 Nc3 d5 cd Nd5 g3 g6 Bg2 Nc3 [ECO A16 English: Anglo-Gr\"unfeld defense] c4 Nf6 Nc3 d5 [ECO A16 English opening] c4 Nf6 Nc3 [ECO A15 English opening] c4 Nf6 Nf3 [ECO A15 English orang-utan] c4 Nf6 b4 [ECO A15 English, 1...Nf6 ] c4 Nf6 [ECO A14 English: Symmetrical, Keres defence] c4 e6 Nf3 d5 g3 Nf6 Bg2 Be7 o-o c5 cd Nd5 Nc3 Nc6 [ECO A14 English: Neo-Catalan declined] c4 e6 Nf3 d5 g3 Nf6 Bg2 Be7 o-o [ECO A13 English: Neo-Catalan accepted] c4 e6 Nf3 d5 g3 Nf6 Bg2 dc [ECO A13 English: Neo-Catalan] c4 e6 Nf3 d5 g3 Nf6 [ECO A13 English: Kurajica defence] c4 e6 Nf3 d5 g3 c6 [ECO A13 English opening: Agincourt variation] c4 e6 Nf3 d5 g3 [ECO A13 English: Wimpey system] c4 e6 Nf3 d5 b3 Nf6 Bb2 c5 e3 [ECO A13 English opening: Agincourt variation] c4 e6 Nf3 d5 [ECO A13 English: Romanishin gambit] c4 e6 Nf3 Nf6 g3 a6 Bg2 b5 [ECO A13 English opening] c4 e6 [ECO A12 English: Caro-Kann defensive system, Bogolyubov variation] c4 c6 Nf3 d5 b3 Bg4 [ECO A12 English: Capablanca's variation] c4 c6 Nf3 d5 b3 Nf6 Bb2 Bg4 [ECO A12 English: New York defensive system] c4 c6 Nf3 d5 b3 Nf6 Bb2 Bf5 [ECO A12 English: Bled variation] c4 c6 Nf3 d5 b3 Nf6 Bb2 g6 [ECO A12 English: Caro-Kann defensive system] c4 c6 Nf3 d5 b3 Nf6 Bb2 [ECO A12 English: London defensive system] c4 c6 Nf3 d5 b3 Nf6 g3 Bf5 [ECO A12 English: Torre defensive system] c4 c6 Nf3 d5 b3 Nf6 g3 Bg4 [ECO A12 English: Caro-Kann defensive system] c4 c6 Nf3 d5 b3 [ECO A11 English: Caro-Kann defensive system] c4 c6 [ECO A10 English: Anglo-Dutch defense] c4 f5 [ECO A10 English: Jaenisch gambit] c4 b5 [ECO A10 English: Adorjan defence] c4 g6 e4 e5 [ECO A10 English opening] c4 g6 [ECO A10 English opening] c4 [ECO A09 R\'eti accepted: Keres variation] Nf3 d5 c4 dc e3 Be6 [ECO A09 R\'eti accepted] Nf3 d5 c4 dc [ECO A09 R\'eti: advance variation] Nf3 d5 c4 d4 [ECO A09 R\'eti opening] Nf3 d5 c4 [ECO A08 R\'eti: King's Indian attack, French variation] Nf3 d5 g3 c5 Bg2 Nc6 o-o e6 d3 Nf6 N1d2 Be7 e4 o-o Re1 [ECO A08 R\'eti: King's Indian attack] Nf3 d5 g3 c5 Bg2 [ECO A07 R\'eti: King's Indian attack ] Nf3 d5 g3 c5 [ECO A07 R\'eti: King's Indian attack, Pachman system] Nf3 d5 g3 g6 Bg2 Bg7 o-o e5 d3 Ne7 [ECO A07 R\'eti: King's Indian attack] Nf3 d5 g3 g6 [ECO A07 R\'eti: King's Indian attack, Keres variation] Nf3 d5 g3 Bg4 Bg2 Nd7 [ECO A07 R\'eti: King's Indian attack, Yugoslav variation] Nf3 d5 g3 Nf6 Bg2 c6 o-o Bg4 [ECO A07 R\'eti: King's Indian attack ] Nf3 d5 g3 [ECO A06 R\'eti: Nimzovich-Larsen attack] Nf3 d5 b3 [ECO A06 Tennison gambit] Nf3 d5 e4 [ECO A06 Santasiere's folly] Nf3 d5 b4 [ECO A06 R\'eti: old Indian attack] Nf3 d5 d3 [ECO A06 R\'eti opening] Nf3 d5 [ECO A05 R\'eti: King's Indian attack, R\'eti-Smyslov variation] Nf3 Nf6 g3 g6 b4 [ECO A05 R\'eti: King's Indian attack] Nf3 Nf6 g3 g6 [ECO A05 R\'eti: King's Indian attack, Spassky's variation] Nf3 Nf6 g3 b5 [ECO A05 R\'eti opening] Nf3 Nf6 [ECO A04 R\'eti: Pirc-Lisitsin gambit] Nf3 f5 e4 [ECO A04 R\'eti: Lisitsin gambit deferred] Nf3 f5 d3 Nf6 e4 [ECO A04 R\'eti v Dutch] Nf3 f5 [ECO A04 R\'eti: Wade defence] Nf3 d6 e4 Bg4 [ECO A04 R\'eti opening] Nf3 d6 [ECO A04 R\'eti: Herrstr\"om gambit] Nf3 g5 [ECO A04 R\'eti opening] Nf3 [ECO A03 Mujannah opening] f4 d5 c4 [ECO A03 Bird's opening: Williams gambit] f4 d5 e4 [ECO A03 Bird's opening: Lasker variation] f4 d5 Nf3 Nf6 e3 c5 [ECO A03 Bird's opening] f4 d5 [ECO A02 Bird: From gambit, Lipke variation] f4 e5 fe d6 ed Bd6 Nf3 Nh6 d4 [ECO A02 Bird: From gambit, Lasker variation] f4 e5 fe d6 ed Bd6 Nf3 g5 [ECO A02 Bird: From gambit] f4 e5 [ECO A02 Bird: Hobbs gambit] f4 g5 [ECO A02 Bird's opening, Swiss gambit] f4 f5 e4 fe Nc3 Nf6 g4 [ECO A02 Bird's opening] f4 [ECO A01 Nimzovich-Larsen attack: modern variation] b3 e5 [ECO A01 Nimzovich-Larsen attack: Indian variation] b3 Nf6 [ECO A01 Nimzovich-Larsen attack: classical variation] b3 d5 [ECO A01 Nimzovich-Larsen attack: English variation] b3 c5 [ECO A01 Nimzovich-Larsen attack: Dutch variation] b3 f5 [ECO A01 Nimzovich-Larsen attack: Polish variation] b3 b5 [ECO A01 Nimzovich-Larsen attack: symmetrical variation] b3 b6 [ECO A01 Nimzovich-Larsen attack] b3 [ECO A00 Polish: T\"ubingen variation] b4 Nh6 [ECO A00 Polish: Outflank variation] b4 c6 [ECO A00 Polish opening] b4 [ECO A00 Lasker simul special] g3 h5 [ECO A00 Benko's opening: reversed Alekhine] g3 e5 Nf3 [ECO A00 Benko's opening] g3 [ECO A00 Grob: Romford counter-gambit] g4 d5 Bg2 Bg4 c4 d4 [ECO A00 Grob: Fritz gambit] g4 d5 Bg2 Bg4 c4 [ECO A00 Grob: spike attack] g4 d5 Bg2 c6 g5 [ECO A00 Grob's attack] g4 [ECO A00 Global opening] h3 e5 a3 [ECO A00 Clemenz opening] h3 [ECO A00 Amar gambit] Nh3 d5 g3 e5 f4 Bh3 Bh3 ef [ECO A00 Amar opening] Nh3 [ECO A00 Battambang opening] Nc3 e5 a3 [ECO A00 Dunst opening] Nc3 e5 [ECO A00 Novosibirsk opening] Nc3 c5 d4 cd Qd4 Nc6 Qh4 [ECO A00 Dunst opening] Nc3 [ECO A00 Anderssen's opening] a3 [ECO A00 Crab opening] a4 e5 h4 [ECO A00 Ware opening] a4 [ECO A00 Saragossa opening] c3 [ECO A00 Valencia opening] d3 e5 Nd2 [ECO A00 Mieses opening] d3 e5 [ECO A00 Venezolana opening] d3 c5 Nc3 Nc6 g3 [ECO A00 Mieses opening] d3 [ECO A00 Amsterdam attack] e3 e5 c4 d6 Nc3 Nc6 b3 Nf6 [ECO A00 Van't Kruijs opening] e3 [ECO A00 Hammerschlag ] f3 e5 Kf2 [ECO A00 Gedult's opening] f3 [ECO A00 Anti-Borg opening] h4 [ECO A00 Durkin's attack] Na3 Phalanx-XXV/endgame.c0000644000175000010010000002600012477372665013501 0ustar dusanNone#include "phalanx.h" int onepawn( int wk, int wp, int bk, int wtm ) { #define PWINS R_VALUE #define PDRAWS (1-P_VALUE) int wpfile = wp%10; int target = wpfile + 90; int steps = target/10 - wp/10 + ( wk>wp && (wk-wp)%10==0 ) - ( wp <= H2 ); tdist * tardist = dist+120*target; int rookpawn; /** *** If black king is out of the square, it's won. **/ if( (int)(tardist[bk].max) > steps-wtm+1 ) return PWINS-steps; /** *** Now, a draw rule: if black king is much closer to the pawn than *** the white king, it must be a draw. We already know it is in the *** square. Sometimes pawn can stop enemy's diagonal run, so let's *** add a step. With rook pawn it's even easier for the defending side *** - let's add a step too. **/ if( dist[120*wp+bk].max + wtm + 1 + ( (bk-wp)%9==0 || (bk-wp)%11==0 ) <= dist[120*wp+wk].max + ( rookpawn = ( wpfile==FILE_A || wpfile==FILE_H ) ) ) return PDRAWS; /** *** Rook-pawn. **/ if(rookpawn) { if( tardist[bk].max+wtm-1 > tardist[wk].max && abs(wpfile-wk%10)==1 ) return PWINS-P_VALUE-2*steps; return PDRAWS; } /** *** Look at the critical squares, according to the endgames textbook *** by IGM Ludek Pachman. **/ if( wk-wp==19 || wk-wp==20 || wk-wp==21 ) return PWINS-4*steps; if( wk-wp==9 || wk-wp==10 || wk-wp==11 ) if( wp>A5 || ( wtm != (bk-wk==20) ) ) return PWINS-8*steps; /** *** Some simple drawish knowledge - white cannot access critical square. **/ if( dist[120*bk+wp+10].max == 1 && dist[120*wk+wp+10].max -wtm > 1 ) return PDRAWS; if( wpA6 && wp
dist[wk+d2].max ) d = wtm + dist[bk+d2].max - dist[wk+d2].max; else if( dist[bk+d1].max < dist[bk+d2].max ) d = wtm + dist[bk+d2].max - dist[wk+d2].max; else d = wtm + dist[bk+d1].max - dist[wk+d1].max; if(d>0) return PWINS-P_VALUE-4*(steps-d); else if(d<0) return PDRAWS+20+2*d; return 32 * ( dist[(wp+10)*120+bk].taxi - dist[(wp+20)*120+wk].taxi ); } } int Oppb[17] = /* outside passed pawn bonus */ /* +10 +8 +6 +4 */ { 0, 0, 40, 50, 58, 64, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68 }; int pawns(void) { extern int wpf[10]; extern int bpf[10]; int result; int color; int wbest=32, bbest=32; static int passed[16] = { 0, 100, 75, 50, 30, 10, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; static int kbonus_[80] = { 0, 0, 1, 2, 3, 3, 2, 1, 0, 0, 0, 10, 11, 12, 13, 13, 12, 11, 10, 0, 0, 20, 21, 22, 23, 23, 22, 21, 20, 0, 0, 30, 31, 32, 33, 33, 32, 31, 30, 0, 0, 40, 41, 42, 43, 43, 42, 41, 40, 0, 0, 50, 51, 52, 53, 53, 52, 51, 50, 0, 0, 50, 51, 52, 53, 53, 52, 51, 50, 0, 0, 42, 45, 47, 48, 48, 47, 45, 42, 0 }; const int * kbonus = kbonus_-20; if( Totmat == P_VALUE ) /* KPK routine */ { int wk, wp, bk, wtm; if( Color==WHITE ) wtm=1; else wtm=0; if( L[WKP].next != 0 ) { wk = WKP; wp = L[WKP].next; bk = BKP; result = onepawn(wk,wp,bk,wtm); } else { wk = Th[BKP]; wp = Th[L[BKP].next]; bk = Th[WKP]; wtm = !wtm; result = -onepawn(wk,wp,bk,wtm); } if(Color==WHITE) return result; else return -result; } #define bonus(x) ( color==WHITE ? (x) : -(x) ) result = kbonus[WKP]-kbonus[Th[BKP]]; for( color=1; color!=3; color++ ) { int step = ( color==WHITE ? 10 : -10 ); int best = 32; unsigned pawn = PAWN+color; unsigned xpawn = PAWN+enemy(color); unsigned kp = L[color].next; unsigned xkp = L[enemy(color)].next; int * pf = ( color==WHITE ? wpf : bpf ); int s; /* square */ int i; for( i=1; i!=9; i++ ) pf[i]=0; for( s = L[kp].next; s != 0; s = L[s].next ) { int b, togo; int blocks = 0; int cannotmove; int protected; int stepstosquare; pf[s%10]++; /* doubled pawn */ if( pf[s%10] > 1 ) result -= bonus(8); if( B[s+step] ) cannotmove = 1; else { int f=0; if( B[s+step+step+1] == xpawn ) f++; if( B[s+step+step-1] == xpawn ) f++; if(f) { if( B[s+1] == pawn ) f--; if( B[s-1] == pawn ) f--; cannotmove = (f>0); } else cannotmove=0; } if(cannotmove) result -= bonus(6); protected = ( B[s-step-1]==pawn || B[s-step+1]==pawn ); /* lets make kings active */ if( ! protected ) { int di = dist[120*xkp+s].max; if(cannotmove) b = bonus( 32-4*di ); else b = bonus( 16-2*di ); if(di==1) { if(cannotmove) b+=30; else b+=20; } result -= b; } if( B[s+step] == xpawn ) goto end_passed; for( i=s+step+step; B[i]!=3; i+=step ) { if( B[i] ) blocks++; if( B[i]==xpawn || B[i-1]==xpawn || B[i+1]==xpawn ) goto end_passed; } /*** BEGIN: passed pawn evaluation ***/ i -= step; /* the queening square */ togo = blocks+abs(s-i)/10; /* steps to queen */ b = bonus(passed[togo]); result += b; /* protected passer -> more bonus */ if( protected ) result += b+b; /* out of enemy's king square */ stepstosquare=(int)(dist[xkp*120+i].max)-togo+(Color==color); if( stepstosquare>1 ) { result += b+b; if( togo < best ) best = togo; } /* distance from enemy king */ b = dist[xkp*120+s+step].max * (12-togo); result += bonus(b); /*** END: passed pawn evaluation ***/ end_passed:; /*** some points for advancement ***/ result += (s/10-4-color)*2; } if( color == WHITE ) wbest=best; else bbest=best; } if( wbest!=32 ) if( bbest!=32 ) { if( wbest-bbest > 2 ) result += -300 + (bbest-wbest)*60; else if( bbest-wbest > 2 ) result += 300 + (bbest-wbest)*60; else result += (bbest-wbest)*40; } else result += (30-wbest)*20; else if( bbest!=32 ) result -= (30-bbest)*20; /* a simple detection of outside passed pawn */ if( G[Counter].mtrl && G[Counter].xmtrl ) /* both sides must have pawns */ { int whas=0, bhas=0; /* white/black left/right -most pawn file (0-10) */ int wrm = Wknow.rpf; int wlm = Wknow.lpf; int brm = Bknow.rpf; int blm = Bknow.lpf; /*** look at leftmost pawn ***/ if( wlm+1wlm+3 ) whas=blm-wlm; else if( blm+1blm+3 ) bhas=wlm-blm; /*** look at rightmost pawn ***/ if( wrm-1>brm && wrm>wlm+3 ) whas+=wrm-brm; else if( brm-1>wrm && brm>blm+3 ) bhas+=brm-wrm; result += Oppb[whas]-Oppb[bhas]; } if( Color == BLACK ) result = -result; /* consistency with trade down bonus: 5 points per pawn */ if( G[Counter].mtrl > G[Counter].xmtrl ) result += G[Counter].mtrl/20; else if( G[Counter].mtrl < G[Counter].xmtrl ) result -= G[Counter].xmtrl/20; return result; } /* table for king bishop knight endings */ int nb_[80] = { 0,100, 90, 80, 70, 60, 50, 40, 30, 0, 0, 90, 80, 70, 57, 45, 32, 20, 40, 0, 0, 80, 70, 50, 37, 23, 10, 32, 50, 0, 0, 70, 57, 37, 10, 0, 23, 45, 60, 0, 0, 60, 45, 23, 0, 10, 37, 57, 70, 0, 0, 50, 32, 10, 23, 37, 50, 70, 80, 0, 0, 40, 20, 32, 45, 57, 70, 80, 90, 0, 0, 30, 40, 50, 60, 70, 80, 90,100, 0 }; int * nb = nb_-20; int e_mp(void) /*** minor piece and pawn ***/ { if( G[Counter].mtrl && G[Counter].xmtrl ) { /*** minor piece against pawn ***/ int p; if( G[Counter].mtrl == P_VALUE ) { if( Color == WHITE ) p = L[WKP].next/10; else p = 11 - L[BKP].next/10; } else { if( Color == WHITE ) p = - ( 11 - L[BKP].next/10 ); else p = - L[WKP].next/10; } return G[Counter].xmtrl - G[Counter].mtrl + 3*p; } else { /*** check for bad bishop ***/ int wb, wp, wk, bk; extern signed char * sqcolor; if( L[WKP].next ) { wk=WKP; if( B[L[wk].next]==WP ) { wp=L[wk].next; wb=L[wp].next; } else { wb=L[wk].next; wp=L[wb].next; } if( B[wb] == WN ) { if( ( B[A7]==WP && ( B[A8]==BK || B[B7]==BK ) ) ||( B[H7]==WP && ( B[H8]==BK || B[G7]==BK ) ) ) return G[Counter].xmtrl - G[Counter].mtrl; else return 0; } bk=BKP; } else { wk=BKP; if( B[L[wk].next]==BP ) { wp=L[wk].next; wb=L[wp].next; } else { wb=L[wk].next; wp=L[wb].next; } bk=WKP; if( B[wb] == BN ) { if( ( B[A2]==BP && ( B[A1]==WK || B[B2]==WK ) ) ||( B[H2]==BP && ( B[H1]==WK || B[G2]==WK ) ) ) return G[Counter].xmtrl - G[Counter].mtrl; else return 0; } wk=Th[wk]; wp=Th[wp]; wb=Th[wb]; bk=Th[bk]; } switch( wp%10 ) { case FILE_A: break; case FILE_H: wp=Tv[wp]; wk=Tv[wk]; wb=Tv[wb]; bk=Tv[bk]; break; default: return 0; /* this is not a rook pawn */ } if( sqcolor[wb] == 1 ) return 0; /* the bishop is ok */ /* Draw!! */ if( bk > wp ) if( bk%10=A7 ) { return G[Counter].xmtrl - G[Counter].mtrl; } } return 0; } int e_nb( int color ) /*** mating with knight and bishop ***/ { int kdist = 8 * dist[WKP*120+BKP].max; int kp=A1; int i, npd=0; extern signed char * sqcolor; if( color == WHITE ) { for( i=L[WKP].next; i!=0; i=L[i].next ) if( B[i] == WN ) npd=2*dist[120*i+BKP].taxi; else if( B[i] == WB ) { if( sqcolor[i] == 1 ) kp = Th[BKP]; else kp = BKP; } } else { for( i=L[BKP].next; i!=0; i=L[i].next ) if( B[i] == BN ) npd=2*dist[120*i+WKP].taxi; else if( B[i] == BB ) { if( sqcolor[i] == 1 ) kp = Th[WKP]; else kp = WKP; } } if( color == Color ) return -kdist-npd+nb[kp]; else return kdist+npd-nb[kp]; } int e_rpr(void) { int wk, wr, wp, bk, br; int result = 0; int sstm; /* it's stronger's side move */ if( G[Counter].mtrl > G[Counter].xmtrl ) { sstm=1; wk=L[Color].next; bk=L[enemy(Color)].next; br=L[bk].next; } else { sstm=0; wk=L[enemy(Color)].next; bk=L[Color].next; br=L[bk].next; } if( piece(B[L[wk].next]) == ROOK ) { wr=L[wk].next; wp=L[wr].next; } else { wp=L[wk].next; wr=L[wp].next; } if( B[bk] == WK ) { wk=Th[wk]; wr=Th[wr]; wp=Th[wp]; bk=Th[bk]; br=Th[br]; } if( wp%10 > FILE_D ) { wk=Tv[wk]; wr=Tv[wr]; wp=Tv[wp]; bk=Tv[bk]; br=Tv[br]; } result = wp/10-5; if( wp%10 == FILE_A ) result -= 15; result -= 2*dist[br*120+wp].max + 3*abs(br%10-wp%10); if( bk > wp ) switch( wp%10-bk%10 ) { case -2: break; case -1: result -= 20; break; case 0: result -= 50; break; case 1: result -= 40; break; case 2: if( br%10-wp%10 > 3 ) result -= 35; else result -= abs(br%10-wp%10)*3; break; default: result += 10*abs(wp%10-bk%10); } else result += 5*(wp/10-bk/10); if( wk < wp ) result -= 5*(wp/10-wk/10); if( br= A7 ) || ( G[Counter-1].m.in1 == BP && G[Counter-1].m.to <= H2 ) ) S[Ply].devi += 3*P_VALUE; return G[Counter].mtrl - G[Counter].xmtrl + S[Ply].psnl; } int static_eval(void) { int positional; int r50 = 100 - G[Counter].rule50; int material = G[Counter].mtrl-G[Counter].xmtrl; #ifdef CACHE if( ( ( C[ 0x0000FFFF & G[Counter].hashboard ] ^ G[Counter].hashboard ) & 0xFFFF0000 ) == 0 ) { unsigned * cc = C + ( 0x0000FFFF & G[Counter].hashboard ); Wknow.prune = (((*cc)&0x00004FFF)!=0); Bknow.prune = (((*cc)&0x00008FFF)!=0); return ( (*cc) & 0x00003FFF ) ; } #endif positional = score_position(); if( r50 < RULE_50_CLOSE ) { positional = positional * r50 / RULE_50_CLOSE; material = material * r50 / RULE_50_CLOSE; } #undef RAISE #ifdef RAISE /* Inbalanced material: take positional bonus seriously */ if( abs(material) > 200 ) { int m = abs(material) - 200; if( m > 1000 ) m=1000; #ifdef SCORING if( Scoring ) printf( " ( ) inbalanced material, positional raised: %i -> %i\n", positional, positional + positional*m/500 ); #endif positional = positional + positional*m/500; } #endif #ifdef CACHE { unsigned * cc = C + ( 0x0000FFFF & G[Counter].hashboard ); *cc = ( 0xFFFF0000 & G[Counter].hashboard ) | ( material+positional ); if( Wknow.prune ) *cc |= 0x00004000; else *cc &= (0xFFFFFFFF-0x00004000); if( Bknow.prune ) *cc |= 0x00008000; else *cc &= (0xFFFFFFFF-0x00008000); } #endif S[Ply].psnl = positional; S[Ply].devi = 0; #undef debug #ifdef debug if(abs(positional)>600) { Scoring = 1; score_position(); Scoring = 0; printboard(); printf("[%i,%i,%i]",material,positional,score_position()); getchar(); } #endif return material+positional; } inline int repetition( int n ) { int i; int r=0; unsigned board = G[Counter].hashboard; for( i=Counter-2; i>=0; i-=2 ) { if( G[i].hashboard == board ) if( ++r == n ) return 1; if( G[i].rule50 <= 1 ) break; } return 0; } int material_draw( void ) { int i, n=2; for( i=L[WKP].next; i!=0; i=L[i].next ) switch( B[i] ) { case WQ: case WR: case WP: return 0; default: n--; if( n==0 ) return 0; } for( i=L[BKP].next; i!=0; i=L[i].next ) switch( B[i] ) { case BQ: case BR: case BP: return 0; default: n--; if( n==0 ) return 0; } return 1; } /*****************************************************************/ int evaluate( int Alpha, int Beta ) { static int timeslice = 2000; static int polslice = 4000; int result; tmove m[256]; int n; /* moves and number of moves */ thashentry *t; int check; int lastiter; int totmat = Totmat = G[Counter].mtrl+G[Counter].xmtrl; if(Ply%2) lastiter = -LastIter; else lastiter = LastIter; Nodes++; if( Flag.level == fixedtime || Flag.level == timecontrol ) if( ( Nodes % timeslice ) == 0 && !Flag.analyze ) { extern long T1; int t = Flag.centiseconds - ptime() + T1; if( t < 0 ) { if( Flag.ponder >= 2 ) Flag.ponder = 3; else Abort = 2; } else if( t != Flag.centiseconds ) timeslice = Nodes * t / ( Flag.centiseconds - t ) * 2 / 3; if( timeslice > 5*Flag.centiseconds ) timeslice = 5*Flag.centiseconds; if( timeslice < 50 ) timeslice=50; } { static int64 lnodes = 0; if( lnodes + polslice < Nodes || Nodes == 1 ) { static long lptime = 0; long nptime = ptime(); if( nptime == lptime ) nptime++; if( nptime - lptime < 100 ) polslice = polslice*11/10; else { polslice = polslice*10/11; } lptime = nptime; if( Flag.post && !Flag.xboard ) verboseline(); if(Flag.polling) { #if defined(__GNUC__) && !defined(__MINGW32__) static fd_set readfds; static struct timeval tv; int data; FD_ZERO (&readfds); FD_SET (fileno(stdin), &readfds); tv.tv_sec=0; tv.tv_usec=0; select(16, &readfds, 0, 0, &tv); data=FD_ISSET(fileno(stdin), &readfds); if(data) { if(polslice<8000 || Flag.analyze) polslice=4000; else polslice/=2; interrupt(0); } #else /* Credit here goes to Dr Oliver Brausch for the code from his * program Olithink. Some rewriting has been done by CMF, but not much * as I have absolutely no idea whatsoever what this does. * I think the original code is from Crafty by Prof. Robert Hyatt. [JA] */ static int init = 0, pipe; static HANDLE inh; DWORD dw; /* If we're running under XBoard then we can't use _kbhit() as the input commands * are sent to us directly over the internal pipe */ if (Flag.xboard>0) { #if defined(FILE_CNT) if (stdin->_cnt > 0) return stdin->_cnt; #endif if (!init) { init = 1; inh = GetStdHandle(STD_INPUT_HANDLE); pipe = !GetConsoleMode(inh, &dw); if (!pipe) { SetConsoleMode(inh, dw & ~(ENABLE_MOUSE_INPUT | ENABLE_WINDOW_INPUT)); FlushConsoleInputBuffer(inh); } } if (pipe) { if (!PeekNamedPipe(inh, NULL, 0, NULL, &dw, NULL)) return 1; return dw; } else { GetNumberOfConsoleInputEvents(inh, &dw); return dw <= 1 ? 0 : dw; } } else return _kbhit(); #endif } /* if( Flag.analyze ) printf("stat01: %d %d %d %d %d\n",0,Nodes,A_d,A_i,A_n); */ lnodes = Nodes; } } if( Ply >= MAXPLY-2 ) { PV[Ply][Ply].from=0; return G[Counter].mtrl-G[Counter].xmtrl; } if( G[Counter].rule50 >= 100 ) /* 50 moves draw */ { PV[Ply][Ply].from=0; return DRAW; } /* insufficient material draw */ if( G[Counter].mtrl<400 && G[Counter].mtrl<400 ) if( material_draw() ) { PV[Ply][Ply].from=0; return DRAW; } if( G[Counter].rule50 >= 3 ) if( repetition(1) ) /* third rep. draw */ { int j; int ext=0; PV[Ply][Ply].from=0; for( j=Counter-1; j>Counter-Ply; j-=2 ) { ext += G[j-1].m.dch - G[j].m.dch; } if( ext > 0 ) { if( ext > 500 ) ext=500; ext += Ply*20; } else if( ext < 0 ) { if( ext < -500 ) ext=-500; ext -= Ply*20; } /* Speculative drawscore * Human players sometimes play a wild sacrifice leading to unclear * lines, making sure they could achieve a repetition draw at least. * This is the same speculative heuristics: * Repetition draw is scored as a slight advantage to the side that * forced the repetition, ie. that had less extensions in the path, * that's why we count the cumulative extension above. The deeper * in the tree this happens, the higher speculative bonus we give, * that is the Ply*20 above. However, if the remaining Depth is large, * we pull the score back closer to the DRAW score, because with * the larger Depth we should be able to find something better * than draw. */ return DRAW + ext/(15+max(-5,Depth/10)); } /******************************************************************** * Now it is time to look into the hashtable. ********************************************************************/ if( SizeHT == 0 || Depth<0 ) t = NULL; else if( (t=seekHT()) != NULL ) if( Age == t->age || Beta-Alpha == 1 ) if( t->depth >= Depth || ( Depth<300 && abs(t->value)>CHECKMATE-1000 ) ) { int val = t->value; if( val > CHECKMATE-1000 ) val -= Ply; else if( val < -CHECKMATE+1000 ) val += Ply; switch( t->result ) { case no_cut: /* `true value', good_score */ PV[Ply][Ply].from=0; return val; break; case alpha_cut: /* `this or less', failed_low */ if( val <= Alpha ) { PV[Ply][Ply].from=0; return Alpha; } break; case beta_cut: /* `this or more', failed_high */ if( val >= Beta ) { PV[Ply][Ply].from=0; return Beta; } break; } } /***** End of hashtable stuff *****/ #undef nodef #ifdef nodef { static int64 int good=0, all=0; if( t!=NULL && t->move!=0 ) good++; all++; if( all%100000 == 0 && all!=0 ) printf("hit percentage = %lld.%02lld%%\n",good*100/all,good*10000/all%100); } #endif if( Ply<2 ) /* called from rootsearch() */ S[Ply].check = check = checktest(Color); else /* called from search() and the checktest() has been run */ check = S[Ply].check; if( Depth>0 || check ) { if(Depth<=0) result = approx_eval(); else result = static_eval(); #define FORWARD_PRUNING #ifdef FORWARD_PRUNING /* * A simple forward pruning: * The Depth is low and the static evaluation is over [Alpha plus margin] * Our king is safe (khung= Beta. * This works quite fine for larger Depths than 200 (2 plies) as well, * tested with limit 600 on a set of positions and it's still finding * everything and in a shorter time, but I'm keeping the depth limit * conservative for now. * This is similar to what the old Phalanx XXII had, except now * we use the margin. */ if( !check && Depth < 200 && ( Color==WHITE ? ( Wknow.hung<14 && Wknow.khung<6 ) : ( Bknow.hung<14 && Bknow.khung<6 ) ) ) { int r = result - (P_VALUE+Depth)/10; if( r>=Beta ) { PV[Ply][Ply].from=0; return Beta; } if( r>Alpha ) Alpha=r; } #endif /* FORWARD_PRUNING */ /* if( Depth<1500 && Depth>0 && Beta-Alpha==1 && !check && result < Beta-P_VALUE-Depth ) { generate_legal_checks(m,&n); if( n==0 ) { result=Alpha; goto end; } } else */ generate_legal_moves(m,&n,check); /** Return, if there is no legal move - checkmate or stalemate **/ if(n==0) { PV[Ply][Ply].from=0; if(check) return Ply-CHECKMATE; else return DRAW; } #ifdef NULL_MOVE_PRUNING if( Depth > 100 && ( result >= Beta || Depth > 350 ) && ! FollowPV && ! check && n>4 && ( (Color==WHITE) ? (Wknow.q||Wknow.r||Wknow.b||Wknow.n>1) : (Bknow.q||Bknow.r||Bknow.b||Bknow.n>1) ) && G[Counter-1].m.special != NULL_MOVE /* prev. node not nm */ && ( t==NULL || t->depth <= Depth-350 || t->result==beta_cut || t->value >= Beta ) ) { int value; int olddepth = Depth; G[Counter].m.in1 = 0; /* disable en passant */ G[Counter].m.special = NULL_MOVE; G[Counter].m.to = 2; Counter ++; Ply ++; G[Counter].castling = G[Counter-1].castling; G[Counter].rule50 = G[Counter-1].rule50 + 1; G[Counter].hashboard = HASH_COLOR ^ G[Counter-1].hashboard; G[Counter].mtrl = G[Counter-1].xmtrl; G[Counter].xmtrl = G[Counter-1].mtrl; Color = enemy(Color); S[Ply].check=0; /* reduction depends on number of moves generated */ /* n=20 ... R=2, n=40 ... R=3, n=50 ... R=3.5 */ Depth -= 200 + n*5; if(Depth<0) Depth=0; else Depth -= Depth/4; value = -evaluate(-Beta, -Beta+1); Color = enemy(Color); Counter --; Ply --; Depth = olddepth; Totmat = totmat; if( value >= Beta ) { result = Beta; goto end; } } #endif #define PROBCUT #ifdef PROBCUT #define MRGN 190 /* * If we have a capture that can get us above Beta+MRGN, we try to * search the capturing move at a reduced depth and with raised Beta. * If we then get a fail high, the previous opponent move was likely * a blunder and we can prune this node. * This is complementary to null move pruning. Null move can prune many * weak moves, but not those that create a threat, e.g. unprotected rook * attacks queen - null move allows capturing the queen and thus cannot * prune the silly attack, whereas in ProbCut queen captures the rook, * confirms with the reduced search that the previous opponent move * was a blunder and prunes. */ if( Depth>350 && Beta-Alpha==1 && !check ) { int i; int r = Alpha; int olddepth = Depth; Depth-= 350; for( i=0; i!=n; i++ ) if( m[i].in2 && result+Values[m[i].in2>>4] >= Beta+MRGN ) { do_move(m+i); S[Ply].check=checktest(Color); r = - evaluate( -Beta-MRGN, -Beta-MRGN+1 ); undo_move(m+i); if( r>=Beta+MRGN ) break; } Depth = olddepth; if( r>= Beta+MRGN ) { result = Beta; goto end; } } #endif /* PROBCUT */ #ifdef CHECK_EXTENSIONS if( check && Depth>0 ) { int newdch, i; /* We compute the extension from the depth remaining (Depth) * and number of legal moves available (n) */ newdch = EXTENSION_BASE - 20 - 3000/(Depth+100) /* 30..0 */ - 200/(n*(n+1)); /* 1~100,2~33,3~16,..0 */ if( result<=lastiter-50 || result <= -250 ) /* losing anyway */ newdch = (newdch+100)/2; /* smaller extension, 50% */ for( i=0; i!=n; i++ ) if( m[i].in2 ) m[i].dch = (newdch+100)/2; /* capture */ else m[i].dch = newdch; } #endif #ifdef PAWNPUSH_EXTENSIONS if( Totmat < 4000 ) if(result= A6 ) || ( Color==BLACK && m[i].to <= H3 ) ) ) { int j; int support=0; int newdch=EXTENSION_BASE; if( Color == WHITE ) { for( j=m[i].to+10; j<=H7; j+=10 ) if( B[j-1]==BP || B[j]==BP || B[j+1]==BP ) goto no_push_extension; for( j=m[i].to; j<=H8; j+=10 ) { if( B[j] ) support--; if( see(B,m[i].from,j) < 0 ) support--; else support++; } } else { for( j=m[i].to-10; j>=A2; j-=10 ) if( B[j-1]==WP || B[j]==WP || B[j+1]==WP ) goto no_push_extension; for( j=m[i].to; j>=A1; j-=10 ) { if( B[j] ) support--; if( see(B,m[i].from,j) < 0 ) support--; else support++; } } newdch += Depth/20 + Totmat/100 - 30*support; switch( m[i].to/10 ) { case 8: case 3: if(support>0) newdch -= 20*support+10; break; } if( newdch < m[i].dch ) { m[i].dch = newdch; } no_push_extension:; } } #endif #ifdef RECAPTURE_EXTENSIONS if( Depth>0 && G[Counter-1].m.in2 ) if( result> 4 ]; int v2 = Values[ G[Counter-1].m.in2 >> 4 ]; int newdch; if( Depth <= 200 ) newdch = EXTENSION_BASE-30; else newdch = EXTENSION_BASE-20; if( min(v1,v2) > 400 || G[Counter].mtrl < Q_VALUE ) newdch -= 70; else if( min(v1,v2) > 200 || G[Counter].mtrl < (Q_VALUE+N_VALUE) ) newdch -= 45; /* recaptures depth bonus */ for( i=0; i!=n; i++ ) if( m[i].to == t ) if( m[i].dch > newdch ) /* if( Depth<=100 || see(B,m[i].from,m[i].to) >= v1 ) */ m[i].dch = newdch; } #endif #ifdef PEE_EXTENSIONS if( Depth > 200 && G[Counter].mtrl <= (8*P_VALUE) && G[Counter].xmtrl <= (8*P_VALUE+Q_VALUE) && G[Counter-1].m.in2 > KNIGHT ) { int i; int target=0; int cdch; for( i=L[L[Color].next].next; i!=0; i=L[i].next ) if( B[i] >= KNIGHT ) goto nopee; for( i=L[L[enemy(Color)].next].next; i!=0; i=L[i].next ) if( B[i] >= KNIGHT ) { if( target ) goto nopee; else target=i; } if( ! target ) goto nopee; if( G[Counter-1].m.in2 >= QUEEN ) cdch = min(Depth,450); else cdch = min(Depth*2/3,350); for( i=0; i!=n; i++ ) if( m[i].to == target ) { m[i].dch -= cdch; /* printboard(NULL); printm(m[i],NULL); getchar(); */ } nopee:; } #endif #ifdef ETTC if( Depth > 200 && SizeHT != 0 ) { extern void do_hash(tmove *), undo_hash(tmove *); int i; for( i=0; i!=n; i++ ) { thashentry *t; do_hash(m+i); if( (t=seekHT()) != NULL ) if( t->depth >= Depth ) if( t->result != beta_cut ) { int val = -t->value; if( val > CHECKMATE-100 ) val -= Ply; else if( val < -CHECKMATE+100 ) val += Ply; if( val > Alpha ) { if( val >= Beta ) { undo_hash(m+i); G[Counter].m = m[i]; PV[Ply][Ply] = m[i]; PV[Ply][Ply+1].from = 0; result = Beta; goto end; } Alpha=val; } } undo_hash(m+i); } } #endif } else { /*** Quiescence search ***/ result = approx_eval(); if( ( result < Beta+S[Ply].devi && result > Alpha-S[Ply].devi ) || Totmat<=(B_VALUE+P_VALUE) || Ply<2 ) result = static_eval(); if( result >= Beta ) return result; if( result <= Alpha-(Q_VALUE+minmv) && Depth <= -100 ) { return Alpha; } #ifdef QCAPSONLY generate_legal_captures(m,&n,Alpha-result-minmv); #else /* What to generate? Only captures or also safe checks? */ if( G[Counter].mtrl-G[Counter].xmtrl < 400 && Depth > -100 ) generate_legal_checks(m,&n); else generate_legal_captures(m,&n,Alpha-result-minmv); #endif } /*** Compute heuristic values of moves ***/ add_killer( m, n, t ); PV[Ply][Ply].from = 0; if( Flag.nps ) { if( Flag.easy ) { if( n>10 && Flag.easy<=100 ) blunder(m,&n); } /* timecontrol fix */ if( polslice > Flag.easy+200 ) polslice=Flag.easy+200; /* Now limit the NPS, lowest value is 100. * For higher values of nps levels like 50000 nps, there's no need * to check for the limit and call ptime() at every node, * hence the condition below */ if( Nodes%(1+Flag.nps/500)==0 ) { int nps_actual = Nodes*100/max(ptime()-T1,1); if( nps_actual > Flag.nps && !Abort ) usleep(100000); } } /*** Full-width search ***/ if( Depth>0 || check ) { result = search(m,n,Alpha,Beta); } else /*** Quiescence ***/ { if( result > Alpha ) result = search(m,n,result,Beta); else result = search(m,n,Alpha,Beta); } end: if( result>=Beta && Depth>0 ) write_killer( G[Counter].m.from, G[Counter].m.to ); if( SizeHT != 0 && Depth >= 0 && Abort == 0 ) writeHT( result, Alpha, Beta ); /** *** Check learning file. *** This should be done before search. It is here only for *** timing heuristics stability problem that needs better *** solution. **/ if( Depth > 300 && Flag.learn ) if( Depth > 400 || Ply<3 ) { int lresult = rlearn(); if( lresult != NOVALUE ) { PV[Ply][Ply].from=0; if( lresult > CHECKMATE-1000 ) lresult -= Ply; if( lresult < -CHECKMATE+1000 ) lresult += Ply; result = lresult; } } return result; } Phalanx-XXV/genmoves.c0000644000175000010010000003312612502614437013714 0ustar dusanNone/* * Generating moves */ #include "phalanx.h" unsigned char pin[120]; unsigned char tar[120]; /* enemy attacks given square */ int attacktest( int square, int ocolor ) { /* pawn */ if(ocolor!=1) { if( B[square+11]==BP || B[square+9]==BP ) return 2; } else { if( B[square-11]==WP || B[square-9]==WP ) return 2; } /* knight */ { int i, enemy = KNIGHT+ocolor; for( i=0; i!=8; i++ ) if( B[square+N_moves[i]] == enemy ) return 2; } /* rook or queen */ { int d, enemy1 = ROOK+ocolor, enemy2 = QUEEN+ocolor; for( d=0; d!=4; d++ ) { int i=square; int step=RB_dirs[d]; do i += step; while( B[i] == 0 ); if( B[i]==enemy1 || B[i]==enemy2 ) return 2; } } /* bishop or queen */ { int d, enemy1 = BISHOP+ocolor, enemy2 = QUEEN+ocolor; for( d=4; d!=8; d++ ) { int i=square; int step=RB_dirs[d]; do i += step; while( B[i] == 0 ); if( B[i]==enemy1 || B[i]==enemy2 ) return 2; } } /* king */ if( dist[ 120*square + L[ocolor].next ].max == 1 ) return 1; return 0; } #undef debugsee /* Static Exchange Evaluator */ int see( tsquare * b, int from, int square ) { static int wl[16]; static int bl[16]; int wn, bn; int color = color(b[from]); int i,p; int minwn, minbn; unsigned static int backup; #define ret(X) return ( color==WHITE ? (X) : -(X) ) wn=bn=1; if( color == WHITE ) { wl[0] = Values[ b[from] >> 4 ]; bl[0] = Values[ b[square] >> 4 ]; } else { wl[0] = Values[ b[square] >> 4 ]; bl[0] = Values[ b[from] >> 4 ]; } backup = b[from]; b[from] = 0; if( b[square-9]==WP ) { wl[wn] = P_VALUE; wn++; } if( b[square-11]==WP ) { wl[wn] = P_VALUE; wn++; } if( b[square+9]==BP ) { bl[bn] = P_VALUE; bn++; } if( b[square+11]==BP ) { bl[bn] = P_VALUE; bn++; } for( i=0; i!=8; i++ ) if( ( p = b[square+N_moves[i]] ) ) switch( p ) { case WN: wl[wn] = N_VALUE; wn++; break; case BN: bl[bn] = N_VALUE; bn++; break; } wl[ minwn=wn ] = CHECKMATE; bl[ minbn=bn ] = CHECKMATE; for( i=0; i!=8; i++ ) { int step = RB_dirs[i]; int minw = minwn; int minb = minbn; int dest = square; for(;;) { dest += step; while( b[dest] == 0 ) dest += step; p = b[dest]; if( p==3 || piece(p)==KNIGHT ) break; if( i < 4 ) { if( piece(p) == BISHOP ) break; } else { if( piece(p) == ROOK ) break; } if( p==WK ) { if( dest-step==square ) { wl[wn] = CHECKMATE; wn++; wl[wn] = CHECKMATE; } break; } else if( p==BK ) { if( dest-step==square ) { bl[bn] = CHECKMATE; bn++; bl[bn] = CHECKMATE; } break; } else if( p==WP ) { if( dest-square == 9 || dest-square == 11 ) continue; else break; } else if( p==BP ) { if( dest-square == -9 || dest-square == -11 ) continue; else break; } else { int j; int val = Values[p>>4]; if( color(p) == WHITE ) { while( wl[minw] <= val ) minw++; for( j=wn+1; j!=minw; j-- ) wl[j] = wl[j-1]; wl[minw] = val; wn++; wl[wn]=CHECKMATE; minw++; } else { while( bl[minb] <= val ) minb++; for( j=bn+1; j!=minb; j-- ) bl[j] = bl[j-1]; bl[minb] = val; bn++; bl[bn]=CHECKMATE; minb++; } } } } b[from] = backup; #ifdef debugsee printf("WHITE: "); for(i=0;i!=wn;i++) printf(" %hi",wl[i]); puts(""); printf("BLACK: "); for(i=0;i!=bn;i++) printf(" %hi",bl[i]); puts(""); #endif /*** Let's count it ***/ { int wi=0; int bi=0; int result=0; int alpha=-CHECKMATE, beta=CHECKMATE; if( color == BLACK ) { result -= wl[wi]; wi++; alpha = result; } for(;;) { if( wi == wn ) ret(alpha); else { result += bl[bi]; bi++; if( result < beta ) { if( result < alpha ) ret(alpha); beta = result; } } #ifdef debugsee printf("[w,%hi,%hi,%hi]",alpha,result,beta); #endif if( bi == bn ) ret(beta); else { result -= wl[wi]; wi++; if( result > alpha ) { if( result > beta ) ret(beta); alpha = result; } } #ifdef debugsee printf("[b,%hi,%hi,%hi]",alpha,result,beta); #endif } } } void find_pins( int check ) { int d, square; if(check) { memset( pin+20, 1, 80*sizeof(char) ); return; } memset( pin+20, 0, 80*sizeof(char) ); square = L[Color].next; pin[square] = 1; for(d=0;d!=8;d++) { int step = RB_dirs[d]; int destination = square; int mark = 0; for(;;) { destination += step; if( B[destination] ) { if( color(B[destination]) == Color ) { if(mark) break; mark = destination; } else { if(mark) { switch( piece(B[destination]) ) { case QUEEN: pin[mark]=abs(step); break; case ROOK: if(d<4) pin[mark]=abs(step); break; case BISHOP: if(d>3) pin[mark]=abs(step); break; } } break; } } } } #undef debug #ifdef debug printboard(); for(d=0;d!=120;d++) { if(d%10==0) puts(""); printf("%3i",pin[d]); } getchar(); #endif } void find_targets(void) { int d,square; /* memset( tar, 0, 120*sizeof(char) ); */ memset( tar+20, 0, 80*sizeof(char) ); square = L[enemy(Color)].next; for(d=0;d!=8;d++) { int step = RB_dirs[d]; int destination = square; for(;;) { destination += step; if( B[destination] ) break; if( d<4 ) tar[destination]=ROOK; else tar[destination]=BISHOP; } if( B[(destination=square+N_moves[d])] == 0 ) tar[destination]=KNIGHT; } #undef debug #ifdef debug printboard(); for(d=0;d!=120;d++) { if(d%10==0) puts(""); printf("%04X ",tar[d]); } getchar(); #endif } /* * LINKING GENERATED MOVE */ int square, destination; #define From square #define To destination void lm( tmove *m, unsigned char In2a, unsigned char Special, int *i ) { m->in1 = B[m->from=From]; m->in2 = B[m->to=To]; m->in2a = In2a; m->dch = 100; m->value = 0; m->special = Special; if( m->special != 0 || pin[m->from] ) { do_move(m); if( ! checktest(enemy(Color)) ) (*i)++; undo_move(m); } else (*i)++; } # define link_move(In2a,Special) \ { lm( moves+i, In2a, Special, &i ); } #define link_castling(C) \ { register tmove* m = &moves[i]; \ m->from = A1; /* anything different from 0 */ \ m->to = A1; \ m->dch = 100; \ m->special = C; \ i++; \ } void generate_legal_moves( tmove moves[], int *n, int check ) { int i = 0; find_pins( check ); for( square=L[Color].next; square!=0; square=L[square].next ) { unsigned pbs=piece(B[square]); switch ( pbs ) { case PAWN: if(Color==WHITE) { destination = square+10; if( B[destination] == 0 ) { if( destination < A8 ) /* not a promotion */ { link_move(WP,0); } else /* pawn promotion */ { unsigned piece; for( piece=WQ; piece!=WP; piece-=PAWN ) link_move(piece,0); } if( square < A3 ) { destination += 10; if( B[destination] == 0 ) link_move(B[square],0); } } for( destination = square+9; destination != square+13; destination += 2 ) if( color(B[destination]) == BLACK ) { if( destination < A8 ) { link_move(WP,0); } else { unsigned piece; for( piece=WQ; piece!=WP; piece-=PAWN ) link_move(piece,0); } } } else /* This is a black pawn */ { destination = square-10; if( B[destination] == 0 ) { if( destination>H1 ) /* not a promotion */ { link_move(BP,0); } else /* pawn promotion */ { unsigned piece; for( piece=BQ; piece!=BP; piece-=PAWN ) link_move(piece,0); } if( square>H6 ) { destination -= 10; if( B[destination] == 0 ) link_move(BP,0); } } for( destination = square-9; destination != square-13; destination -= 2 ) if( color(B[destination]) == WHITE ) { if( destination > H1 ) { link_move(BP,0); } else { unsigned piece; for( piece=BQ; piece!=BP; piece-=PAWN ) link_move(piece,0); } } } break; case KNIGHT: case KING: { int j; int *mov = pbs==KING ? K_moves : N_moves; for( j=0; j!=8; j++ ) { destination = square+mov[j]; if( ! ( color(B[destination]) & Color ) ) link_move(B[square],0); } } break; default: /* BISHOP, ROOK, QUEEN */ { int d; int d1 = pbs==BISHOP ? 4 : 0; int d2 = pbs==ROOK ? 4 : 8; for( d=d1; d!=d2; d++ ) { int step=RB_dirs[d]; destination=square; for(;;) { destination += step; if( ! ( color(B[destination]) & Color ) ) link_move(B[square],0); if( B[destination] ) break; } } } } } /* Special moves: en passant, castling */ /* En passant capture first */ if( Counter != 0 ) { int c = Counter-1; if( piece(G[c].m.in1) == PAWN && abs(G[c].m.from-G[c].m.to) == 20 ) /* The last move was a pawn double step */ { for( square = G[c].m.to-1; square != G[c].m.to+3; square += 2 ) if( B[square] == PAWN+Color ) { int special = G[c].m.to; destination = Color==WHITE ? special+10 : special-10; link_move( B[square], special ) } } } /* Castling */ if( ! check ) { if( Color == WHITE ) { /****** Short ******/ if( ( G[Counter].castling & WSHORT ) == 0 ) if( B[F1]==0 && B[G1]==0 ) if( ! attacktest(F1,BLACK) && ! attacktest(G1,BLACK) ) link_castling( SHORT_CASTLING ); /****** Long ******/ if( ( G[Counter].castling & WLONG ) == 0 ) if( B[B1]==0 && B[C1]==0 && B[D1]==0 ) if( ! attacktest(C1,BLACK) && ! attacktest(D1,BLACK) ) link_castling( LONG_CASTLING ); } else /* Black */ { /****** Short ******/ if( ( G[Counter].castling & BSHORT ) == 0 ) if( B[F8]==0 && B[G8]==0 ) if( ! attacktest(F8,WHITE) && ! attacktest(G8,WHITE) ) link_castling( SHORT_CASTLING ); /****** Long ******/ if( ( G[Counter].castling & BLONG ) == 0 ) if( B[B8]==0 && B[C8]==0 && B[D8]==0 ) if( ! attacktest(C8,WHITE) && ! attacktest(D8,WHITE) ) link_castling( LONG_CASTLING ); } } *n = i; } void lc( tmove *m, int *i ) { if( Depth < -100 ) { if( Values[ B[From]>>4 ] > Values[ B[To]>>4 ] ) { if( attacktest(To,enemy(Color)) ) return; } } else if( Values[ B[From]>>4 ] > Values[ B[To]>>4 ] ) { if( see(B,From,To) < 0 ) return; } m->in1 = m->in2a = B[m->from=From]; m->in2 = B[m->to=To]; m->dch = 100; m->value = 0; m->special = 0; if( pin[m->from] ) { do_move(m); if( ! checktest(enemy(Color)) ) (*i)++; undo_move(m); } else (*i)++; } # define link_capture { lc( moves+i, &i ); } void generate_legal_captures( tmove moves[], int *n, int minval ) /* we are sure we are not in check */ { int i = 0; find_pins( 0 ); for( square=L[Color].next; square!=0; square=L[square].next ) { unsigned pbs=piece(B[square]); switch ( pbs ) { case PAWN: if(Color==WHITE) { destination = square+10; if( B[destination] == 0 && destination>=A8 && Depth>-300 ) { link_move(WQ,0); } for( destination = square+9; destination != square+13; destination += 2 ) if( color(B[destination]) == BLACK ) { if( destination < A8 ) { if( Values[ B[destination] >> 4 ] >= minval ) link_move(WP,0); } else { link_move(WQ,0); } } } else /* This is a black pawn */ { destination = square-10; if( B[destination] == 0 && destination<=H1 && Depth>-300 ) { link_move(BQ,0); } for( destination = square-9; destination != square-13; destination -= 2 ) if( color(B[destination]) == WHITE ) { if( destination > H1 ) { if( Values[ B[destination] >> 4 ] >= minval ) link_move(BP,0); } else { link_move(BQ,0); } } } break; case KNIGHT: case KING: { int j; int *mov = pbs==KING ? K_moves : N_moves; for( j=0; j!=8; j++ ) { destination = square+mov[j]; if( color(B[destination]) == enemy(Color) ) if( Values[ B[destination] >> 4 ] >= minval ) link_capture; } } break; default: /* BISHOP, ROOK, QUEEN */ { int d; int d1 = pbs==BISHOP ? 4 : 0; int d2 = pbs==ROOK ? 4 : 8; for( d=d1; d!=d2; d++ ) { int step=RB_dirs[d]; destination=square; for(;;) { destination += step; if( color(B[destination]) == enemy(Color) ) if( Values[ B[destination] >> 4 ] >= minval ) link_capture; if( B[destination] ) break; } } } } } *n = i; } #ifndef QCAPSONLY /* generating checks AND captures */ void generate_legal_checks( tmove moves[], int *n ) /* we are sure we are not in check */ /* pawn checks should be added */ { int i = 0; find_pins( 0 ); find_targets(); for( square=L[Color].next; square!=0; square=L[square].next ) { unsigned pbs=piece(B[square]); switch ( pbs ) { case PAWN: if(Color==WHITE) { destination = square+10; if( B[destination] == 0 && ( destination>=A8 ) ) { link_move(WQ,0); link_move(WN,0); } for( destination = square+9; destination != square+13; destination += 2 ) if( color(B[destination]) == BLACK ) { if( destination < A8 ) { link_move(WP,0); } else { link_move(WQ,0); link_move(WN,0); } } } else /* This is a black pawn */ { destination = square-10; if( B[destination] == 0 && destination<=H1 ) { link_move(BQ,0); link_move(BN,0); } for( destination = square-9; destination != square-13; destination -= 2 ) if( color(B[destination]) == WHITE ) { if( destination > H1 ) { link_move(BP,0); } else { link_move(BQ,0); link_move(BN,0); } } } break; case KNIGHT: case KING: { int j; int *mov = pbs==KING ? K_moves : N_moves; for( j=0; j!=8; j++ ) { destination = square+mov[j]; if( color(B[destination]) == enemy(Color) || ( B[destination]==0 && tar[destination] == pbs ) ) link_capture; } } break; default: /* BISHOP, ROOK, QUEEN */ { int d; int d1 = pbs==BISHOP ? 4 : 0; int d2 = pbs==ROOK ? 4 : 8; for( d=d1; d!=d2; d++ ) { int step=RB_dirs[d]; destination=square; for(;;) { destination += step; if( color(B[destination]) == enemy(Color) || ( B[destination]==0 && tar[destination] && ( tar[destination]==pbs || ( tar[destination]!=KNIGHT && pbs==QUEEN ) ) ) ) link_capture; if( B[destination] ) break; } } } } } *n = i; } #endif /* QCAPSONLY */ Phalanx-XXV/getopt.c0000644000175000010010000000336112317742054013372 0ustar dusanNone/* getopt.c (slightly modified by O.Garcia, 12/4/92) */ /* now it accepts either '-' or '/' as switch character */ /* Newsgroups: mod.std.unix Subject: public domain AT&T getopt source Date: 3 Nov 85 19:34:15 GMT Here's something you've all been waiting for: the AT&T public domain source for getopt(3). It is the code which was given out at the 1985 UNIFORUM conference in Dallas. I obtained it by electronic mail directly from AT&T. The people there assure me that it is indeed in the public domain. */ #if defined(_MSC_VER) #include #include #include #define ERR(s, c) if(opterr){fprintf(stderr,"%s%s%c\n",argv[0],s,c);} int opterr = 1; int optind = 1; int optopt; char *optarg; int getopt (int argc, char **argv, char *opts) { static int sp = 1; register int c; register char *cp; if (sp == 1) if (optind >= argc || (argv[optind][0] != '-' && argv[optind][0] != '/') || argv[optind][1] == '\0') return (EOF); else if (strcmp (argv[optind], "--") == 0 || strcmp (argv[optind], "//") == 0) { optind++; return (EOF); } optopt = c = argv[optind][sp]; if (c == ':' || (cp = strchr (opts, c)) == NULL) { ERR (": illegal option -- ", c); if (argv[optind][++sp] == '\0') { optind++; sp = 1; } return ('?'); } if (*++cp == ':') { if (argv[optind][sp + 1] != '\0') optarg = &argv[optind++][sp + 1]; else if (++optind >= argc) { ERR (": option requires an argument -- ", c); sp = 1; return ('?'); } else optarg = argv[optind++]; sp = 1; } else { if (argv[optind][++sp] == '\0') { sp = 1; optind++; } optarg = NULL; } return (c); } #endif Phalanx-XXV/hash.c0000644000175000010010000003165112515777641013030 0ustar dusanNone#include "phalanx.h" #ifndef REHASH # define REHASH 3 #endif thashentry *HT; unsigned SizeHT = 70000; unsigned Age = 0; /** *** 16-bit-int representation of move. To be used in the binary *** opening book and hash table. **/ unsigned smove(tmove *m) { unsigned sm; sm = ( m->from << 8 ); if( m->special ) return sm | m->special; sm |= m->to; if( m->in1 != m->in2a ) switch( m->in2a ) { case WQ: sm -= 10; break; case BQ: sm += 10; break; case WR: sm -= 20; break; case BR: sm += 20; break; case WB: sm -= 30; break; case BB: sm += 30; break; case WN: sm -= 40; break; case BN: sm += 40; break; } return sm; } thashentry *seekHT(void) { register int i; register thashentry *t; for( i=0; i!=REHASH; i++ ) { t = HT + ( G[Counter].hashboard + i ) % SizeHT; if( G[Counter].hashboard == t->hashboard ) return t; } return NULL; } /************************************************************ * We need a good replacement strategy! * Good cells to replace: * 1) empty (not used) or cell with the same board * 2) cell stored at previous search * 3) cell that stores results computed at a low depth *********************************************************/ void writeHT( int value, int Alpha, int Beta ) { register int i; register thashentry *t; register thashentry *best = NULL; tmove *m = & PV[Ply][Ply]; /* First pass: look for the same board or an empty cell */ for( i=0; i!=REHASH; i++ ) { t = HT + ( G[Counter].hashboard + i ) % SizeHT; if( G[Counter].hashboard == t->hashboard || t->hashboard == 0 ) { best = t; break; } } /* Second pass: look for an oldest-aged cell */ if( best == NULL ) for( i=0; i!=REHASH; i++ ) { t = HT + ( G[Counter].hashboard + i ) % SizeHT; if( t->age < Age && ( best==NULL || best->age > t->age ) ) best = t; } /* Third pass: look for a cell with least depth */ if( best == NULL ) for( i=0; i!=REHASH; i++ ) { t = HT + ( G[Counter].hashboard + i ) % SizeHT; if( best==NULL || best->depth > t->depth ) best = t; } /* Checkmate score must be adjusted moves to be counted from * here rather than from the root position */ if( value > CHECKMATE-100 ) best->value = value+Ply; else if( value < -CHECKMATE+100 ) best->value = value-Ply; else best->value = value; if( value <= Alpha ) best->result = alpha_cut; else if( value >= Beta ) best->result = beta_cut; else best->result = no_cut; /* alpha_cut brings no killer information */ if( best->result != alpha_cut ) best->move = smove(m); else if( best->hashboard != G[Counter].hashboard ) best->move = 0; best->hashboard = G[Counter].hashboard; best->age = Age; best->depth = Depth; } /* * Full recomputation of hash board. */ unsigned hashboard(void) { register int i; unsigned result = 0; for ( i=A1; i!=H9; i++ ) if ( B[i] != 3 && B[i] != 0 ) { /* int square = i%10-1 + 8*(i/10-2); int piece = B[i]; piece = piece/8 - ( color(piece)==WHITE ? 1 : 2 ); */ result ^= H[ HP[ B[i] ] ][ HS[i] ]; } if( Color == BLACK ) result ^= HASH_COLOR; #undef debug #ifdef debug /* just showing the result */ printf ("Debug: Hashboard = %08X\n",result); printf ("Hit ENTER to continue "); getchar(); #endif return result; } /******************************************************** * The rest contains random numbers * to be used for hashing. ********************************************************/ unsigned H[12][64]= { { 0x8C78407C, 0xC3667B4A, 0x22AD4CED, 0x0BCAE627, 0x5BE2A9A3, 0xC4940655, 0x274C9DCB, 0xB55EB368, 0xE6C71E6E, 0x9A9E7EEE, 0xC425FD27, 0xCC007EED, 0x476192E5, 0x89E3D3A5, 0xEA78FAFB, 0x27665BD0, 0x9E46E105, 0xCD8B82C2, 0x2EA87ABA, 0x54462C94, 0xB3449DD5, 0x42666A5D, 0x3F657968, 0x4DCF2DE5, 0x09290438, 0x3E95D957, 0xD2E53D4F, 0x8E16CDF2, 0xCE6DFEA2, 0x75640BA3, 0xED9F39A4, 0x3AC65C2C, 0xBBDD20E3, 0x98132489, 0x5F7FBA11, 0x28C05E8D, 0x930D52BE, 0x5B21D077, 0x09710190, 0x0D45D752, 0x645D0413, 0x2E22DBD7, 0xA1B7583F, 0x37034473, 0xA247F1CA, 0x6DFBBAF5, 0x45389FEF, 0xF841DCB1, 0x7040F197, 0xEF9CE22F, 0xF775B834, 0x9AA89DA4, 0x8D53D2F0, 0x379D964D, 0x1D29DAB7, 0xD9507BBF, 0x9670F36B, 0x459B60B9, 0x99A710A3, 0x3BF21F7E, 0x0813320E, 0xFD99DBF7, 0x32CCF151, 0x6FDD5C05 }, { 0xF31F74FC, 0x5B939226, 0xD9D53A93, 0x3A273431, 0xEF296980, 0xF5412E1B, 0x4DF02F5B, 0xA4179950, 0x731CCC54, 0x4FF36FB0, 0x68459C3C, 0xD6B84245, 0x3B3C6C3F, 0x6D697176, 0xE9FBDA0D, 0xA03D888C, 0x4909A463, 0xAD14FFCF, 0x505ED35C, 0xC21FC657, 0x3DC31765, 0x92AAC442, 0xD341CC0F, 0x6C5BBAB1, 0xB8502A8B, 0x18A67A16, 0x8E2EB8B1, 0x78ACCA56, 0xD9A341F6, 0xE72BD561, 0x889A3CE9, 0xAE76C9C2, 0x8AE93753, 0xF9A98412, 0x933EF928, 0x3314A922, 0xF279492F, 0x4AE1499F, 0x1A1F4A53, 0x4B2BDD5B, 0x1FC5C7E7, 0x1EEAB635, 0xE9190AFA, 0x1B05337B, 0x78DC1ECF, 0xD07AD6A0, 0xC98650B7, 0xA7FFB330, 0x4EBA9C85, 0xD99CE128, 0xBC94E705, 0x4E829926, 0xA84ED58B, 0x874DD802, 0xF47628A3, 0x9CA58BB0, 0x0FA76581, 0xCC490CAC, 0xC391C24C, 0xA1DF2A2B, 0x038FCCBD, 0xFCD97DA4, 0xADE39237, 0xA004F9FF }, { 0x50EC499A, 0x57244DD1, 0x989DAB7C, 0x39943899, 0x0506EA3E, 0x62B98D9F, 0xD2602F70, 0x9BFB7CC1, 0x7E1DEC6D, 0xEA1614B0, 0x9A47DAB5, 0x2863A26D, 0x2E177B72, 0xDABC13E1, 0xE61AB6C9, 0x18D42B25, 0xCA795ACC, 0x664E849D, 0x9B597A60, 0x73F03242, 0xCB576344, 0x31253FEB, 0x173CE93B, 0x5E7238CA, 0xC0521EF1, 0x67767816, 0xF8F0AB0C, 0x860D3784, 0xE86BB2C3, 0x4754DDC7, 0x4E013AA1, 0xDC7E3630, 0xD7FA7EF2, 0x3ED76494, 0x897DF05F, 0xAF6D0BAF, 0xDF277D17, 0xD73D7EB6, 0xCE29640A, 0x1556B57A, 0x4CE3D7A2, 0xA0AA143B, 0x4E7036D0, 0x18FE8ABC, 0x3E8E47D1, 0xB42C78FD, 0x56516DC9, 0x6A2366E0, 0x454863EE, 0xEADC1C32, 0x06FDF69B, 0xBDC94E8B, 0x54144F7D, 0x454E3D51, 0x459683C2, 0xB55F7DBB, 0x1FAAFFB0, 0x097045AF, 0xEC1A0D56, 0x499B69A1, 0xE8B4269A, 0x78FA53DA, 0xFA3F866C, 0x36FAB278 }, { 0x9A348CF3, 0xDE7E448B, 0xCF27554C, 0x2CFA638F, 0xCEA9243C, 0x27E2BB7E, 0x997E6C9E, 0x7EA514B9, 0xA8B716B9, 0x45E49D60, 0xF1FC5321, 0xA937BCF5, 0xC496971C, 0xC4B80B3B, 0x3206D1FB, 0x5670616B, 0xCA2DB3C3, 0x01EAFE8A, 0xBD174755, 0x0DD3D042, 0xB8591C80, 0x15B6F0FB, 0x23D3A6F7, 0x1DE910AA, 0x2F1A056A, 0x9714E13A, 0x0F17DE0E, 0xC8C48954, 0xE75A5034, 0x32D7A560, 0x72CB9C52, 0x62794B32, 0x98DE2EEE, 0x1140E617, 0x4CC1C405, 0x2C319BB2, 0x622AF9E9, 0x9D6ECA20, 0x7DD528A7, 0x6272DA54, 0x0EDBCF46, 0x4911DD6E, 0x89D4673F, 0x171F78B4, 0xBF20922B, 0xEB4FF37A, 0x069DF251, 0x377C8E42, 0xE5892067, 0x77FF3A2C, 0x9E4B9142, 0xAEED36BC, 0xD27C3989, 0xC01C2F8C, 0x59127E91, 0x214F868E, 0x0945B82A, 0x797203E6, 0xE3F125DF, 0x2A7FD03D, 0xC3E5D603, 0xF7CB6AAA, 0xCDD12B04, 0x8669DBCC }, { 0x69590D31, 0x16D9B0F1, 0x674B7BF3, 0xD76F69A7, 0xA66766B1, 0x7FEF1874, 0xF5B204C3, 0xDF548D7F, 0x41167C52, 0x321D609E, 0xAB6ED1D7, 0x027178D4, 0x89ADF27B, 0xB8E2B6DF, 0x19F76ABE, 0x41F7A411, 0xBD30CD84, 0x55D73E2E, 0x9EA86CD3, 0x4E3C73E9, 0xCD75DF37, 0x4C8180FE, 0xD90E1CD1, 0xD183DA5E, 0x52103498, 0x7A924A14, 0x74343213, 0x3EDC35CC, 0x63E7DD1C, 0x65364446, 0x05861C2B, 0xF2C67748, 0x2F58E1BB, 0x276DF71B, 0xA249122A, 0x67F0928B, 0x5E03001C, 0xEB9A0419, 0x9499CF06, 0xC6442C17, 0x983FE628, 0x2A7EF798, 0xB8306B58, 0xC10B4767, 0xA1EF9EBB, 0x5DA508B0, 0xE0698489, 0x502E2166, 0x1C0203E1, 0xED070148, 0x2FC4485E, 0x6FE5BB03, 0x426D5037, 0xC8B4F020, 0x029AEF51, 0xA3A66A3C, 0x5C117F3A, 0x14068942, 0x56DDD16C, 0xA7026955, 0xCB6BA5CE, 0xEB30E20B, 0x14EFDCEA, 0xB0E615EC }, { 0x5DEDF0A4, 0xB7D958A1, 0x5DE41621, 0xE6451281, 0x8988FBAB, 0xFFA12EF9, 0x4DD994BF, 0xB5AEA3D8, 0x45FD3758, 0x43552D82, 0xC63614C0, 0x4BB63A8E, 0x7E4FF025, 0xF1F1A3C4, 0x4363B994, 0x371DBCE8, 0x3BFFCA9C, 0x11A2FF9B, 0x5A694E9A, 0x033069E0, 0xF2E4CF8F, 0x5002250D, 0xE7911156, 0xAC1E0C0C, 0x4883A403, 0xF394E56E, 0x906FEE65, 0x66C4C893, 0x0DD9FCB5, 0x9347DDBB, 0x84E0477A, 0x087CD416, 0x8898C22D, 0x17030492, 0x290AEEE5, 0xD6E170C9, 0xCA1C9885, 0x7FCCCC08, 0x2E895D9F, 0x4D73C332, 0x0AB56CF9, 0x9F73F163, 0x2DC27FE5, 0xF917D52F, 0x0E965189, 0x124514A6, 0x3F504E11, 0x9F1EB4D9, 0x2D48917A, 0x7B9A80CE, 0xB19B3D07, 0xCD79E55F, 0x2EA71B3A, 0x365A6F84, 0x1CB15057, 0x72F0011C, 0xC049EB75, 0xE621EFBE, 0x842D9DBF, 0xA704E426, 0x9FE20D6E, 0x98524416, 0x3ECC79FC, 0x3B05F6A7 }, { 0xB57B6D79, 0xD3DD2098, 0xAB159E6E, 0xDA63753B, 0x34C873EB, 0xFB55B708, 0x34CFFA24, 0x2D689DD9, 0x5F6A63FB, 0xAC862A1F, 0x111E4467, 0x6DDD5404, 0x20712442, 0xA291C35C, 0xF7C0C840, 0xF8B099AA, 0x2B428B60, 0xFC684FEB, 0x3DDE74F5, 0xD8101CD5, 0x0196DDC4, 0x2CF3F64F, 0x3927252D, 0x79FBDCDD, 0xE8555194, 0xA6B45FE7, 0x77355E02, 0xF007DC63, 0x1F01EAE1, 0x050B036D, 0x5B128D46, 0x0713409F, 0x4732CB7B, 0x00CF5262, 0x873B3BF5, 0x29CB2119, 0x9B1F6CEC, 0xC5F09BC5, 0xACFADC7B, 0x9AF997FE, 0xF3A80F72, 0x9AD8566A, 0x3A5846E4, 0xCE9957E7, 0x5A773A0D, 0x64D9DC1B, 0x14137768, 0xD5E2149D, 0xE11FAC72, 0xF141CB01, 0xD1DA5AC4, 0x876D6DF4, 0x3DA52A20, 0x79A1A38C, 0x52A8D32D, 0x4818FC2D, 0x72474A4D, 0x38C45617, 0x792ADBE2, 0x543EB6AF, 0xC967585B, 0xB9A99FB9, 0xB96BEAD2, 0x9DBF4552 }, { 0x5F126D87, 0x209590FA, 0x90ED9298, 0xC5933CFC, 0xB1526FC5, 0x566FA246, 0x6F57234A, 0xFE0DA29C, 0x688DD003, 0xB35FDCFE, 0xD0046D83, 0x92277A7D, 0x6488800B, 0x15C8319F, 0x7449411C, 0xE1C619C5, 0x7A01905B, 0x19C28E70, 0xAA8C6CA1, 0xE016E8A3, 0x91BF3060, 0x6AD8A4BD, 0x36625121, 0x6D74365F, 0x95E0D370, 0x55AFED48, 0xEC9A0A00, 0xF3761CE3, 0x091D44C1, 0x83F6C456, 0xC28B4BDB, 0xF12FF37F, 0xCF3FA70A, 0xFDC369A6, 0x83C91DB0, 0x44D097C2, 0x0FBFB224, 0xF24ED416, 0x4F438995, 0x7B0FEAE6, 0x3943729E, 0x35F82C7A, 0x8A234F89, 0x80C91E1A, 0xEB1A1262, 0x978E78C6, 0x767B7DFB, 0x08F0DADE, 0x2DE99D20, 0x35FB22EB, 0x8BB0FD9F, 0x605EE2EA, 0xBEFF4C9D, 0x0FE77DA7, 0x500AE16A, 0x10D3482B, 0xA87187EB, 0x854027FC, 0x7C0FE08B, 0x34607ECF, 0xD0234C8C, 0xF6D73D2E, 0x0948578B, 0x74ACFEA8 }, { 0x14454B76, 0x89C9C4FB, 0x4343E832, 0xEDFBCDAF, 0xD6AE6671, 0x31B22D7D, 0xDB9D415E, 0xD0D1E4FB, 0x73C35D86, 0x29695252, 0x99EE7F32, 0x232FEE60, 0x2B4FE03D, 0x59C92328, 0x43B7835A, 0x0AF1F352, 0x430D1D4B, 0x5F9E3619, 0x49D0BD47, 0xA3D6E289, 0x936636BD, 0x4FA1A859, 0x7A15317F, 0x93FBBE1C, 0x1FE45E6E, 0x4526CCDE, 0x07AA1600, 0x3F5DA670, 0xC05B6532, 0x9AF76BF2, 0x3A9A73F9, 0x13BD7268, 0x6BD8E37F, 0xFB96271E, 0x95014B60, 0xF4C7B5C3, 0x01D23DB6, 0x0B3F0A85, 0x4BCB4683, 0x597ED680, 0x53BFBB56, 0xB3D7D046, 0xF4B14E8A, 0xB60AE278, 0x4D29F5AE, 0x268AA1F4, 0xE28B5ACA, 0x29481E5A, 0x0BD29CE1, 0xC4ADD091, 0x21F11101, 0xAF182B94, 0x78C9DD4C, 0x0C59C5C6, 0xF484EAB5, 0x3AA65D4B, 0x387CF5A8, 0x7DEEEBE9, 0x92865FDC, 0x83650242, 0x83F4BBB4, 0x47CBDCCB, 0x1BB6C2EB, 0xD9DB0D93 }, { 0x07E5E382, 0xAD974E9B, 0xF108F97A, 0xBC925B4C, 0x43FC2D0A, 0x2D2D16F4, 0xFC8E33C0, 0x5D905103, 0x09002E56, 0x342F3BA6, 0xC52F8051, 0xBCC7AFBD, 0xF44BCC8E, 0x9CF2BA63, 0x2AF62947, 0x6D32A4E2, 0x97CB4B7E, 0x7EB36969, 0x6C5A1BEF, 0x91DDABAF, 0xD19F38D1, 0x28168456, 0x18F5BFF7, 0xD942A200, 0xD74AC610, 0xA084BA17, 0x6209C788, 0x71298136, 0x2E478EB0, 0xC6FF24F1, 0x7FB12530, 0xB05DCEDD, 0x63CEE2B8, 0x9828CCA7, 0x74267745, 0xCE31CE0B, 0x7F5E241A, 0x9DD687D7, 0xF49A4001, 0x2079D26E, 0x77A7F9AB, 0xF018F8E6, 0x6732A7D8, 0x050FE733, 0x509F344C, 0xDDDAAA74, 0xBDE184D6, 0xCA198ED9, 0x0E013550, 0xF6AB7695, 0x81AB4084, 0x1E1FBE13, 0x74641C6F, 0xA42D6C69, 0x7A59A7DE, 0x97FE33E1, 0x22A5C0E7, 0x2DDAB736, 0x11E80476, 0xEB197C10, 0xEF2D5E0D, 0xA80ADF81, 0x01B6A52D, 0x3F60E848 }, { 0x0591FA9E, 0xD84CCD30, 0xAF8645F3, 0xA8F14118, 0xEF4E2EB5, 0x1D7EBA58, 0xB1FC516B, 0x328E94D2, 0x98F01FE2, 0xA33BAE23, 0xFBFF78E2, 0x319FC7A0, 0xB4F9AD3D, 0x83354F5A, 0x822E27B5, 0x6E4D8FBF, 0x0DFD5C47, 0xED41261F, 0x7DF08357, 0xA54CF110, 0xBF7A0373, 0x3A899027, 0x679C2E1D, 0x902FB5D1, 0x937155EA, 0x0C11875D, 0x9AC4F3DD, 0xC0FCBCD2, 0xA317C764, 0x7D6106C2, 0x48931D7F, 0x8D38AD15, 0x1E5EEAF1, 0x799D6466, 0x120A0D78, 0xA358EF27, 0x8301E807, 0x41453072, 0x3DDDD84E, 0x67DAA5B7, 0xC4831F14, 0xB4FF3ECC, 0x54FBE1DF, 0xF487050B, 0xE23FC0CB, 0x4DA17492, 0xE21D074D, 0x78F519B4, 0x73641E6C, 0x471797DE, 0x0B9EF879, 0xCB34E343, 0x093C039B, 0x032C80AC, 0x8D71A4E8, 0x40EE5B0F, 0xFBDC92DD, 0x2C03A2BD, 0x4E40AB0C, 0x01AC0C5A, 0x3ADEC6DD, 0x450A4C28, 0xF246725D, 0x79CD91EB }, { 0x72ACDC1B, 0xF2014F34, 0xFA67FB76, 0x6C0951E3, 0xC84F7766, 0x0BF7F3E7, 0x5056038F, 0xB1773ABF, 0x40C2A3DD, 0xBC19DD18, 0x2DD4A6EC, 0x421E6F72, 0xDFE17CDB, 0xFE0B6A09, 0x3FA0C3EA, 0x1661B6A1, 0x40FEE764, 0x84B26A19, 0xF858D748, 0xCBF20F5F, 0xB83792BF, 0x83CE6144, 0x5B1C27E1, 0xBAD45539, 0xFC174283, 0xD8E4151B, 0x9C51B5A3, 0xA4CBB787, 0x829892B4, 0xB0DBB955, 0xAE9BF750, 0xD5EC9DE5, 0xBA425010, 0x5D401F05, 0xC1A67E17, 0xFF57C3B2, 0xD2F9FCF1, 0xFA92C983, 0xF4ECAC03, 0x01F39D8F, 0x85842BC7, 0x9AF22BFF, 0xA240C52A, 0xC92F7885, 0xCEC15E11, 0x9D12F7EC, 0x92912226, 0x622D12EC, 0xF1562785, 0x4DA4B897, 0x38B97ACC, 0xD7E70669, 0x5330B480, 0x821DC482, 0x446387E8, 0x26FFFE50, 0xF4B0E87A, 0x2BB8837C, 0x6839CEEA, 0xEA444EE6, 0x5635F0EE, 0x55CA3220, 0xDF276DDF, 0xBB90E015 } }; Phalanx-XXV/HISTORY0000644000175000010010000005121012711412627013002 0ustar dusanNoneThis is history of Phalanx. Dates are in the form YYYYMMDD. I First version to play a legitimate game, it finally knows all rules. 19970304 I spent a lot of time on tuning transposition table code and extensions. The program scores 78% at large Reinfeld's test set, 10 s per move, on 486+/150. II Two killer heuristics added: well known history killers (modified) 199704?? and `reaction' killers (the killer is connected to the previous enemy move). The tree search is faster, especially at `quiet' positions. Hashtable presearch. Modified hashentry replacement strategy. Better evaluation function, it now knows more about passed pawns, the endgame play is much stronger. Fixed bug at 7-th row pawn push extension routine. Faster output - using sprintf() to prepare the output and then only one printf. New command line options: -t, -T to set the hashtable size. III Permanent brain (pondering). King safety evaluation. Hung pieces 19970529 static evaluation. Null move pruning. Forward pruning. Better time heuristics - forced moves are played quickly. New cmd-line options: -f, -x, -p, -s. IV New option -c to determine whether to use cpu or real time. The 19970721 internal timing resolution changed to 1/100 of a second. Xboard compatible editing position. Removed en-passant capture from quiescence search. Changes in static-eval function. Piece list implemented - speedup is between 0 and 20%; more in endgame. Pinned pieces static evaluation. Better evaluation of weak pawns. Trapped bishop and knight evaluation. Bugfix at extending check evasions. Bugfix: development bonus was computed but not added to total evaluation. Output change: '!' means turn, '!!' means value out of window. V Mostly interface changes, no big improvement in playing strength. 19970803 Xboard compatibility fixes: 'post' is no more switch, new command 'remove'. Fixed command 'level': 'level 0 5 0' (five minutes per game) should work, also increment (ICS) levels ('level 0 2 12'). Increment can be given at command line. New option -o (polling input) - when running tests, phalanx needs -o-. New feature of autotesting: all incorrect results are written into file 'notfound.fin'. Small output changes for better compatibility with xboard 3.6.2. Eliminated some bad turns in evaluation. Better king safety evaluation - counting safe checks available. VI Fixed small efficiency bug in evaluate.c. Improved time heuristics 19970915 for increment (ICS) levels. Optimized hashing - about 5% overall speedup. Fixed bug in ptime(). User is now allowed to continue play even if the position is drawn by 3-rep., material, or 50 moves rule. Fixed bug - Draw requests are now always ignored, not always accepted :-). Xboard-compatible 'Illegal move' message. Binary opening book, created from PGN by bcreate. This distribution is bigger than any previous because it contains a small example of binary book ('sbook.phalanx', 174kB, 29634 moves). SAN input accepted. Static evaluation now better understands middlegame positions without castling. Added pre-computed tables into static evaluation -> about 5% speed improvement. 'Show thinking' mode now shows also a list of book moves if there's a book entry. I have played a match with previous version (64 games, 2 minutes, increment 12 seconds, on a 486+/150, via xboard, no pondering), new version wins 38.5-25.5. VII Courtesy of Pavel Janik ml., new command 'fen'. Bugfix in command 19971022 line parser, 'phalanx 0 2 12' now works. Better time controls: added hard time limit to avoid being flagged. Pondering bugfix: Phalanx was pondering O-O, but opponent played O-O-O; the move check was incorrect and Phalanx thought that O-O was played; this resulted in 'Illegal move' message few moves later. More pondering safety: the move to be pondered is now checked for legality, before this fix it was simply taken from PV (if present), but PV is not always 100% correct. More PV safety: search cannot be interrupted during the first iteration, the abort is delayed until the first iteration is finished. New options: -r , -b <+/-> to set opening book on/off. New commands hard/easy to set pondering on/off. Optimized do_move(): 3% speedup in test positions. Search optimization: null move is not played if the value in hash table entry is too low. Output bugfix: output is now readable even at long time searches. SEE (Static Exchange Evaluator) and more pruning in quiescence search. RoboFICS compatible commands 'white' and 'black'. Routine for evaluating pawn endgames. New extension trick that helps in some horizon-effect type positions, it's based on measuring difference between current score and null move result; if current score is much better, the side to move must be under threat and the line is extended, similar trick is also in gnuchess. VIII Fixed bug in search(): eliminated useless re-searches -> about 3% 19971103 speed improvement. Noise level is now in centiseconds, not in nodes. Improved horizon-effect extensions. endgame.c: new endgame knowledge, mostly for endgames with minor pieces and pawns: knight and bishop mating, knight+knight (draw), minor vs. minor (draw), minor vs. pawn (draw, but still needs some work, sometimes a pawn wins against a knight), onepawn() as a special case of pawns(), bad bishop (bishop + rook pawn), basics for R+P vs. R, bishops with opposite colors (this is often drawish ending). New penalty for moving castling-side pawns in middlegame. IX Function smove() is now used in both binary book and hashing code, it 19971205 is cleaner and easier to read, the binary is smaller with this. Bugfix: Phalanx now does not ponder move that leads into a terminal position (checkmate, stalemate), this fixes some unexpected quits (I hope all of them). Added more limits to horizon-effect extension trigger - there was so many extensions, that version VIII was actually weaker than previous versions, because of lower nominal search depth; these extensions are now used only for major threats. Static eval cache entry is now packed into 4 bytes instead of 8 -> the cache eats only 256K (512K before this). X Bugfix in static evaluation of trapped knight at [AH]7. Better 19980108 evaluation of trapped bishop ([AH]7) and knight ([AH][87]), now it's using the static exchange evaluator. Time allocation: alloc more time (+1/8) if pondering is on. Better understanding of 'trade-down' bonus - if there are no pawns, you often need a rook more to win the game, a minor piece is not enough. Shallower extensions resulting in greater average search depth. Easy levels: use new command line option -e <1...100> to select an easy level; 1 is the strongest and 100 is the easiest one, Phalanx tries to make human-like blunders. Minor changes in resigning. Clean up in pbook.phalanx, deleted over 100 positions. Killer heuristics now uses the SEE. Bugfix in endgame.c: trade bonus did not work for kings and pawns endgames. Simple learning, can be activated by -l+ option; it is off by default, because it's very experimental version. New version wins engine-engine match with version IX 23:17 (tc 2, inc 8, 486+/150, no learning, no pondering). XI Courtesy of Milan Zamazal: long options and user-friendly handling of 19980125 book files - you can now use environment variables or command line options. Bugfix in trade bonus: endgame KQ-KBPP was evaluated only about +1.10, but the stronger side is winnig here even without pawns, now it's >+3.00 and Phalanx can solve this Dufrense&Mieses study: 8/3Np3/7P/1p3P2/1k6/5K2/1b6/8/w Pf5f6. Deeper overall extensions, +10% of ply. More check evasion extensions. Wider window for 'lazy evaluation', search is now slower but stable. Minor fixes in forward and null move pruning. Zero-width search modified for root moves, actually it's no more zero-width; this eliminates some 'blind turns' (a move is evaluated as >=(Alpha+1), but the engine cannot prove it in re-search in full [Alpha,Beta] window). Minor changes in static evaluation. Bugfix in time allocation of increment levels. Changed time heuristics to use more time. XII More pruning in quiescence search: moves that have little chance to 19980301 return the value over alpha are not generated. Permanent brain is now really 'permanent', if there is no move to ponder in the PV, Phalanx uses short search to pick a move and ponders it. Bugfix: occasional zero division at very fast time controls, like 10s/game. Some puts() replaced with printf(), puts() is buggy in my gcc (2.7.2) and causes sigsegv when interrupted and called again during the interrupt. Optimized null move, this speeds up the engine. Easy levels now use nodes instead of centiseconds for measuring time, the playing strength of easy levels does not depend on cpu power and cpu load. Resigning now works with RoboFics (via 'tellics resign'). Updated FSF address in docs. XIII Lots of 'char' and 'short' replaced with 'int' -> speedup on iX86 19980316 chips (about 10% on my 486, probably more on P6). Bugfix at 'edit' command, edit was broken for positions with black to move. New command line option 'bench', 'phalanx bench' runs a 5 cpu-minutes benchmark and reports nodes per second. Added some interesting lines into the opening book. Dynamic draw score, it's set to -20 by default. New command 'rating ' to adjust the dynamic draw score, Phalanx tries to avoid draw with weaker opponents, minimal draw score is -20, maximal +20. XIV Dynamic draw score did not work for stalemate, now fixed. Major bug 19980416 fixed at resigning: if resigning was on, phalanx resigned almost any game after few moves, this was broken from previous version. Simplified computing bounds for lazy evaluation, this was too complicated and slow. Higher material limit for evaluating position as endgame. Deeper extensions, +0.1 ply. Improved move ordering at root search. Minor optimizations. More variability in opening book. Disabled scout search near leafs. Bugfix: type of Nodes changed to 'long long' (64 bits on Intel[3456]86), 32-bit integer was not long enough for >24 hour runs. Bugfix: option -P did not work, now fixed. Added startup messages that show full path of all open files. XV Internal iterative deepening. Cleaned pbook.phalanx. New "Pc2-c4" 19980614 code to encourage playing c4 (c5 as black) in closed positions where e4 (e5) is not possible. Bugfix at computing total material on the board, the variable was sometimes overwritten with unexact value. New xboard compatible commands 'bk' and 'analyze'. 'bk' shows all book moves. 'analyze' starts analysis mode. Bugfix in bcreate.c: no games on stdin caused segmentation fault. GNU extensions (long options and snprintf) are now used only if GNUFUN is defined (-DGNUFUN in makefile). New endgame knowledge: KNP vs. K is sometimes draw. Small changes in static evaluation. SIGINT is ignored in polling input mode. Time information in post lines is shown in centiseconds instead of seconds to follow current draft of xboard chess engine communication protocol. XVI Bugfix in analyze mode: there is no extra character after the search 19980630 depth number in post lines - xboard understands that time info is in centiseconds, not in seconds. Bugfix in null move pruning: the side that is trying its second move in row must have at least one legal move, this caused segmentation fault if there was none. Command 'hard' does not set pondering on in easy levels. Bugfix at parsing SAN moves, nc3 was (possibly) interpreted as Pc2-c3. Command 'level' accepts time in mm:ss form, for example 'level 0 2:30 12'. Bugfix in kings+pawns endgames - penalty for pawns on one file (doubled) worked as penalty for pawns on one row. Improved kings+pawns endgames static evaluation. New command 'xboard' sets xboard compatible mode. XVII More variability in pbook.phalanx. Better sbook.phalanx, generated 19980804 from wall.pgn. Changed (and fixed) extensions for check evasions and passed pawn pushes. Changed evaluation of passed pawns. phalanx and bcreate integrated into one binary, most of the code was common anyway; book can be created via 'phalanx bcreate' instead of just 'bcreate'. Bigger limit for count of [position,move] in bcreate code, the counter has 32 bits instead of 16. Performance bugfix in null move pruning. XVIII Bugfix in the static exchange evaluator - it let kings slide 19980906 horizontally. New styling of board in command "bd"/"d". New command in edit mode: 's' to switch side to move. Modified look of edit mode. Modifications in static evaluation: bishop pair needs mobility; queen has 'king distance' bonus only if it's on a safe square; simpler rook evaluations - smaller bonuses; forpost (outpost) pawn gets more bonus for # of pieces defending it (Aaron Nimzowitsch, "Mein System"); bigger bonus for protected or connected passed pawns. Modified threat extensions - only mate threats are extended. Bugfix in analysis mode: PV is computed (and shown) even if there is only one legal move. New feature of command 'level' - 'level N' sets level to N seconds fixed time per move. Better pbook.phalanx. XIX Log file to allow easier debugging/tuning, it is activated via 19981122 '-g ' command line parameter. Positional learning file is created (in current directory) if it does not exist and it no more has to be distributed as empty. Minor speedups in pawn endgames. Outside passed pawn detection and evaluation in pawn endgames. Raised material value needed for evaluating kingside/queenside storming (attack after different castlings), these are not worth evaluating when close to endgame. Fixed book move selection to make it easier to implement book learning in future (no real change for user). FICS whispering. Better pbook. Bugfix in evaluation of kings+pawns endgames - the evaluation of 'king in the square of pawn' had bad sign (!). New extension trick: we add big extension after two succesive non-pawn captures that result in pawn endgames - the branching factor is much smaller below that node and we can go deeper without affecting search stability and ... we should do so, because 6 plies subtree evaluation in middlegame is much better than 6 plies in king+pawns. Timing change: phalanx uses more time if there were turns in last ply level. Fixed bug in communication with xboard that caused playing too fast in '-mg' mode with 'reuse' on. Alias 'u' for 'undo'. XX Bugfix in xboard mode, long lines of 'tellics whisper ....' were 19990104 split into several lines. Better pbook.phalanx. Fixed code that avoids pseudocastling (moving white king e1-f1-g1 and leaving rook h1 undeveloped), now it works also in endgame. New code to keep pressure against stonewall d-pawn; if black has stonewall, white should keep the c-pawn on c4; previous versions often played c4-c5?, and that is a bad error against humans. Knights now get penalty in endgames with pawns on both sides of the board (12 to 35 centipawn). Outside passed pawn evaluated in all endgames, not just in kings+pawns. Minor bug fix in analyze mode with xboard (phalanx aborted search due to unimplemented '.' command). New side effect of command 'level' - it also sets remaining time to the same value as level time; this does not break anything but might help in the Fritz 5.32 winboard interface. SAN input now accepts pawn captures in the form 'ef'. ECO database, ECO codes and names are shown with 'bk' command; user has to run 'bk' command once in initial position to activate the ECO feature. Removed '-T' command line option from help, it might be used to tablebase directory in future. XXI Major bug fixed in outside passed pawn evaluation, when one side had 19990131 no pawns, there was indexing out of range. Minor penalty for rook on a pawn file in middlegame. Fixes in pbook.phalanx, as usual. XXII Better ICS whispering, it sends only one info per move. Bugfix in 20000116 disabling castling flag, now also moves _to_ the A1,H1,A8,H8 squares disable corresponding castling. Improved pbook.phalanx. New sbook.phalanx created from "granit" collection. Modified bcreate so that moves are put into the book in the order of their success rate, the most successful move is later shown as the first one in the list of the book moves. Bcreate now uses temporary files instead of memory. Deeper extensions. Modified and fixed rook static evaluation. Learning is now on by default. Phalanx sets the first finger line on ICS, it shows version, size of hashtable, and sizes of the opening books. Bugfix in benchmark, the resulting number was incorrect on machines that can do over 70kNps. XXIII Xboard protocol version 2 compatibility, including the periodic 20141020 updates feature. New -n commandline option to limit nodes per second. New -z commandline option to randomize root moves. Easy levels now don't play instantly, but use time. DrawScore (contempt factor) adjusted in endgames towards positive values to avoid playing dead draws like KRKR. Minor engine fixes: Simplified rootsearch, the aspiration window implementation was not good, for now replaced with standard PVS. Temporarily disabled static eval cache as the implementation was not correct. Other minor bugfixes. Known issues: Warnings in io.c. Command 'setboard' moves the Counter variable, which then cripples the 'history' command output. Command 'setboard' chokes on unexpected input. These issues are only apparent in commandline and should never occur via a GUI - leaving the fix to a future release. XXIV Xboard protocol - 'memory' command support. New file phalanx.eng to 20141224 support the new Xboard automatic engine load. More log messages. Late move reductions with move count based pruning. Small but important changes in the static evaluation that improve endgame play: Passed pawn, rook mobility, knight mobility. Default contempt factor changed from -20 to -10. Fixed tournament timecontrols. Positional learning is now off by default. Tweaked polling input timeslice to better handle rapid changes in analyze mode. Fixed GCC warnings. XXV Better time management to use more time if the best move changed 20160501 recently. Search improvements: Added simple ProbCut, tuned null move and LMR, simplified check evasion extension. Static evaluation bug fixes, several of them submitted by Fabrice Lecouvey, thanks. New parameter to root moves randomization, it can now be limited to first N moves of the game. New opening book generated from KingBase Lite 03/2016 (http://www.kingbase-chess.net/). Phalanx-XXV/io.c0000644000175000010010000012234212566057454012511 0ustar dusanNone#include "phalanx.h" #include "stdarg.h" extern long Time; char Inp[256] = "\0"; char piece[7] = { ' ', 'P', 'N', 'B', 'R', 'Q', 'K' }; char file[10] = { '<', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', '>' }; char row[12] = { '<', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '>' }; tmove Pm[256]; int Pn; /* * printf() wrapper that also records the messages to the logfile * Phalanx logs the messages only if started with the -g parameter */ int printfl( const char * format, ... ) { va_list arg; int done; va_start(arg,format); done = vprintf( format, arg ); va_end(arg); if( Flag.log != NULL ) { fputc( '>', Flag.log ); va_start(arg,format); vfprintf( Flag.log, format, arg ); va_end(arg); } return done; } /** *** Init board and structures *** To be called after position is set (FEN or xboard's edit) **/ void initbs(void) { int s; Counter = 0; DrawScore = 0; G[0].hashboard = hashboard(); /* Do full material count */ G[0].mtrl = G[0].xmtrl = 0; for( s=A1; s!=H9; s++ ) if( color(B[s]) == Color ) G[0].mtrl += Values[ B[s]>>4 ]; else G[0].xmtrl += Values[ B[s]>>4 ]; /* busted! S.A. G[0].castling = 0; if( B[E1]!=WK || B[A1]!=WR ) G[0].castling |= WLONG; if( B[E1]!=WK || B[H1]!=WR ) G[0].castling |= WSHORT; if( B[E8]!=BK || B[A8]!=BR ) G[0].castling |= BLONG; if( B[E8]!=BK || B[H8]!=BR ) G[0].castling |= BSHORT; */ G[0].rule50 = 0; /* create the piece list */ L[L[1].next].prev = 1; L[L[2].next].prev = 2; L[L[1].next].next = L[L[2].next].next = 0; { int wlast = L[1].next, blast = L[2].next; for( s=A1; s!=H9; s++ ) if( B[s]!=0 && B[s]!=3 && B[s]!=WK && B[s]!=BK ) { if( color(B[s])==WHITE ) { L[wlast].next = s; L[s].prev = wlast; L[s].next = 0; wlast = s; } else { L[blast].next = s; L[s].prev = blast; L[s].next = 0; blast = s; } } } } /** *** Xboard compatible edit **/ void edit(void) { int i; int color = WHITE; int squ, pie; char s[8]; s[0] = '@'; for(;;) { for( i=0; i!=3; i++ ) s[i] = toupper((int)s[i]); switch(*s) { case '#': for(i=A1;i!=H9;i++) if(B[i]!=3) B[i]=0; break; case 'C': color = enemy(color); break; case 'S': Color = enemy(Color); break; case '.': break; case 'P': case 'N': case 'B': case 'R': case 'Q': case 'K': squ = s[1]-'A' + 10*(s[2]-'1') + A1; if( squH8 ) squ=0; pie = 0; for( i=1; i!=7; i++ ) if( s[0] == piece[i] ) { pie = i*16+color; break; } B[squ]=pie; if( *s == 'K' ) L[color].next = squ; break; } printboard(NULL); printf("\n"); printf(" \n"); printf(" . exit\n"); printf(" # clear\n"); printf(" c change "); if( color==WHITE ) printf("put white pieces\n"); else printf("put black pieces\n"); printf(" s side to move\n"); printf("edit > "); if( fgets(s,7,stdin) == NULL ) { strcpy(Inp,"quit\n"); return; } if( *s == '.' ) break; } initbs(); Inp[0]='\0'; return; } /** *** Print move in full notation (Ng1-f3) to string 's' or to stdout. *** SAN would be more complicated since we need a list of all possible *** moves to find out whether to print 'Nbd2' or 'Nd2'. **/ void printm( tmove m, char *s ) { char ss[64]; switch( m.special ) { case LONG_CASTLING: sprintf( ss, "O-O-O " ); goto endprint; case SHORT_CASTLING: sprintf( ss, "O-O " ); goto endprint; case NULL_MOVE: sprintf( ss, "NULLMOV "); goto endprint; } if( m.in1 != WP && m.in1 != BP ) sprintf( ss, "%c", piece[m.in1>>4] ); else ss[0]='\0'; sprintf( ss+strlen(ss), "%c%c%c%c%c", file[m.from%10], row[m.from/10], ( m.in2 || m.special ) ? 'x' : '-', file[m.to%10], row[m.to/10] ); if( m.in2a != m.in1 ) sprintf( ss+strlen(ss), "%c", piece[m.in2a>>4] ); #ifdef SHOW_FORCED_MOVES if( m.dch != 100 ) sprintf( ss+strlen(ss), "/%i",m.dch ); #endif sprintf( ss+strlen(ss), " " ); endprint:; if( s == NULL ) printf("%s",ss); else strcpy( s, ss ); } #ifdef SANOUT void printmSAN( tmove *m, int i, int n, char *s ) { char ss[8]; /* longest: "Nb1xd2+\0" */ int j; tmove *mi = m+i; switch( mi->special ) { case LONG_CASTLING: sprintf( ss, "O-O-O" ); goto endprint; case SHORT_CASTLING: sprintf( ss, "O-O" ); goto endprint; case NULL_MOVE: sprintf( ss, "NULLM"); goto endprint; } if( piece(mi->in1) == PAWN ) { sprintf( ss, "%c", file[mi->from%10] ); if( mi->in2 != 0 || mi->special ) sprintf( ss+strlen(ss), "x%c%c", file[mi->to%10], row[mi->to/10] ); else sprintf( ss+strlen(ss), "%c", row[mi->to/10] ); if( mi->in1 != mi->in2a ) sprintf( ss+strlen(ss), "=%c", piece[mi->in2a>>4] ); goto endprint; } /* print NBRQ moves */ sprintf( ss, "%c", piece[mi->in1>>4] ); for( j=0; j!=n; j++ ) if( j!=i && mi->in1 == m[j].in1 && mi->to == m[j].to && mi->from%10 != m[j].from%10 ) sprintf( ss+strlen(ss), "%c", file[mi->from%10] ); for( j=0; j!=n; j++ ) if( j!=i && mi->in1 == m[j].in1 && mi->to == m[j].to && mi->from%10 == m[j].from%10 ) sprintf( ss+strlen(ss), "%c", row[mi->from/10] ); if( mi->in2 != 0 || mi->special ) sprintf( ss+strlen(ss), "x" ); sprintf( ss+strlen(ss), "%c%c", file[mi->to%10], row[mi->to/10] ); endprint:; /* is this a checking move? */ do_move( m+i ); if( checktest(Color) ) sprintf( ss+strlen(ss), "+" ); undo_move( m+i ); if( s == NULL ) printf(ss); else strcpy( s, ss ); } void pvSAN( tmove *v, char *s ) { int n; tmove m[256]; int i; generate_legal_moves( m, &n, checktest(Color) ); for( i=0; i!=n; i++ ) if( smove(v) == smove(m+i) ) break; if( i != n ) { printmSAN( m, i, n, s ); do_move( m+i ); v++; if( v->from ) { sprintf( s+strlen(s), " " ); pvSAN( v, s+strlen(s) ); } undo_move( m+i ); } } #endif /* GNU Chess `X' understands only moves in `g1f3' notation. We have to send * this to older versions of xboard when playing phalanx with gnu. */ void gnuprintm(tmove m) { switch( m.special ) { case LONG_CASTLING: printf("O-O-O"); return; case SHORT_CASTLING: printf("O-O"); return; } printf( "%c%c%c%c", file[m.from%10], row[m.from/10], file[m.to%10], row[m.to/10] ); if ( m.in2a != m.in1 ) printf( "%c", tolower((int)piece[m.in2a>>4]) ); } /** *** Return pointer to move in m[] if it matches the SAN representation. *** If there is no such move, return NULL. **/ tmove * sandex( char *inp, tmove *m, int n ) { char bufik[32]; char *s = bufik; char * ss; char * sto; int move,to; int i; unsigned p=0; int frow=0, ffile=0; int in2a=0; int color = color(m->in1); int sc=-1; int lc=-1; strncpy(bufik,inp,30); for( i=0; i!=n; i++ ) if(m[i].special==SHORT_CASTLING) sc=i; else if(m[i].special==LONG_CASTLING) lc=i; /*** step 0: castlings ***/ if( lc != -1 ) if( strncmp(s,"o-o-o",5)==0 || strncmp(s,"O-O-O",5)==0 || strncmp(s,"0-0-0",5)==0 || ( strncmp(s,"e1c1",4)==0 && color==WHITE ) || ( strncmp(s,"e8c8",4)==0 && color==BLACK ) ) return m+lc; if( sc != -1 && s[3]!='-' ) if( strncmp(s,"o-o",3)==0 || strncmp(s,"O-O",3)==0 || strncmp(s,"0-0",3)==0 || ( strncmp(s,"e1g1",4)==0 && color==WHITE ) || ( strncmp(s,"e8g8",4)==0 && color==BLACK ) ) return m+sc; /*** step 1: noncastling move must start with PNBRQKabcdefgh ***/ /*** if it starts with pnrqk, do the letter upercase ***/ { static char ok[] = "PNBRQKabcdefghpnrqk"; static char up[] = "pnrqk"; for( i=0; ok[i]!=*s; i++ ) if( ok[i] == '\0' ) return(NULL); for( i=0; up[i]!='\0'; i++ ) if( up[i] == *s ) { *s = toupper((int)*s); break; } } /*** step 2: find the destination square ***/ /* Find the last digit <1-8> in the input string. It must * be the row of the destination square and must be preceded * by letter of the dest. square **********************/ sto=NULL; for( ss=s+1; *ss!='\0'; ss++ ) if( *ss>='1' && *ss<='8' ) sto = ss-1; if( sto == NULL ) { if( ( s[2]=='\0' || s[2]=='\n' ) && s[1]>='a' && s[1]<='h' && s[0]>='a' && s[0]<='h' ) { /* exception: pawn capture can be typed as 'ef' */ int mn=-1; /* printf("trying exception %c %c %c\n", s[0], s[1], s[2] ); */ for( i=0; i!=n; i++ ) if( piece(m[i].in1) == PAWN ) if( m[i].from%10 == s[0]+1-'a' ) if( m[i].to%10 == s[1]+1-'a' ) { if( mn==-1 ) mn=i; else mn=-2; } if( mn>=0 ) return m+mn; } return NULL; /* no digit 1-8 found */ } for( i=1; i!=9; i++ ) if(file[i]==*sto) break; if(i==9) return NULL; to = i; for( i=2; i!=10; i++ ) if(row[i]==sto[1]) break; if(i==10) return NULL; to += i*10; /*** step 3: find the origin square ***/ /* 3a - try to find full description of origin square (g1f3) */ ss=sto-1; if(ss>=s) for( ss=sto-1; ss!=s; ss-- ) if( *ss>='1' && *ss<='8' && *(ss-1)>='a' && *(ss-1)<='h' ) { for( i=2; i!=10; i++ ) if(row[i]==*ss) break; frow = i; ss--; for( i=1; i!=9; i++ ) if(file[i]==*ss) break; ffile = i; for(i=0;i!=n;i++) if(m[i].from==frow*10+ffile) { p=m[i].in1; break; } goto step4; } /* 3b - origin square must be computed from piece */ { for(p=6;p!=1;p--) if( piece[p] == *s ) { s++; break; } p = (p<<4) + color; if( *s!='x' && s='a' && *s<='h' ) ffile = *s-'a'+1; else if( *s>='1' && *s<='8' ) frow = *s-'1'+2; } } step4:; /*** step 4: is it a pawn promotion? determine piece ***/ in2a = p; sto += 2; if( *sto == '=' ) sto++; *sto = toupper((int)*sto); for(i=2;i!=7;i++) if( piece[i]==*sto ) in2a=(i<<4)+color; /*** step 5: scan move list ***/ move = -1; for(i=0;i!=n;i++) if( m[i].to==to && m[i].in1==p && m[i].in2a==in2a ) if( ffile==0 || ffile==m[i].from%10 ) if( frow==0 || frow==m[i].from/10 ) { if(move==-1) move=i; else return NULL; } if(move==-1) return NULL; return m+move; } /** *** Is the string represented move ("Pe2-e4") same as the tmove move? *** This correctly parses almost anything but not SAN - we dont have *** full move list. **/ int checkmove( char *s, tmove *m ) { int i; if( m->special == LONG_CASTLING ) { if( strncmp(s,"o-o-o",5)==0 || strncmp(s,"O-O-O",5)==0 || strncmp(s,"0-0-0",5)==0 || ( Color == WHITE && strncmp(s,"e1c1",4) == 0 ) || ( Color == BLACK && strncmp(s,"e8c8",4) == 0 ) ) return 1; else return 0; } if( m->special == SHORT_CASTLING ) { if( ( strncmp(s,"o-o",3)==0 && strncmp(s,"o-o-o",5)!=0 ) || ( strncmp(s,"O-O",3)==0 && strncmp(s,"O-O-O",5)!=0 ) || ( strncmp(s,"0-0",3)==0 && strncmp(s,"0-0-0",5)!=0 ) || ( Color == WHITE && strncmp(s,"e1g1",4) == 0 ) || ( Color == BLACK && strncmp(s,"e8g8",4) == 0 ) ) return 1; else return 0; } for( i=0; s[i]!='\0' && ! islower((int)s[i]); i++ ); if( s[i]=='\0' || s[i]!=file[m->from%10] ) return 0; i++; if( s[i]=='\0' || s[i]!=row[m->from/10] ) return 0; for( ; s[i]!='\0' && ( s[i]=='x' || ! islower((int)s[i]) ); i++ ); if( s[i]=='\0' || s[i]!=file[m->to%10] ) return 0; i++; if( s[i]=='\0' || s[i]!=row[m->to/10] ) return 0; i++; if( m->in2a != m->in1 ) { if( s[i] == '=' || s[i] == ':' ) i++; if( toupper((int)s[i]) != piece[m->in2a>>4] ) return 0; } return 1; } void printPV( int mpl, int lid, char *s ) /* mpl ... moves per line */ { char ss[1024] = ""; int j; #ifdef SHOW_FORCED_MOVES if( mpl>2 ) mpl -= 2; #endif #ifdef SANOUT int k=0; int l=lid; char s1[1024] = ""; pvSAN( PV[0], s1 ); for( j=0; s1[j]!='\0'; j++,l++ ) if( l <= 72 || s1[j] != ' ' ) { ss[k] = s1[j]; k++; } else { ss[k] = '\n'; k++; for( l=0; l!=lid; l++ ) { ss[k] = ' '; k++; } } ss[k] = '\0'; #else for(j=0;PV[0][j].from;j++) { if( j%mpl == 0 && j != 0 && Flag.xboard<2 ) { int i; sprintf( ss+strlen(ss), "\n" ); for( i=0; i!=lid; i++ ) sprintf( ss+strlen(ss), " " ); } printm( PV[0][j], ss+strlen(ss) ); } if( j < 3 ) sprintf( ss+strlen(ss), " " ); #endif sprintf( ss+strlen(ss), "\n" ); if( s == NULL ) printf("%s",ss); else strcpy(s,ss); } void infoline( int typ, char *s ) { /** typ: *** 0 ... search finished, summary information *** 1 ... normal 'xboard' line, known eval, time, full PV *** 2 ... '!' - turn, new best move *** 3 ... summary informations at the end of ply level, no PV *** 4 ... '??' - first move fails low *** 5 ... '!!' - current move fails high, over window **/ char ss[1024]; extern long T1; long t = ptime(); if( typ!=0 && (typ!=3 || Flag.xboard<=1) && ( Abort || t-T1 < Flag.noise ) ) return; if( Flag.log && s==NULL ) { int x = Flag.xboard; Flag.xboard = 0; infoline(typ,ss); Flag.xboard = x; fprintf(Flag.log,"%s", ss); } if( Flag.xboard > 1 ) switch( typ ) { case 0: /* ICS whispering */ if( Flag.ponder<2 && Flag.xboard>1 && typ==0 ) { printf( "tellics whisper depth=%i; eval=%c%i.%02i; nodes=%lli; nps=%i\n", A_d, PV[0][0].value>=0 ? '+' : '-', abs(PV[0][0].value/100), abs(PV[0][0].value)%100, Nodes, (int)( ((float)Nodes) / (((float)max(t-T1,1))/100) ) ); /* printPV(8,5,ss); printf("tellics whisper %s",ss); */ } return; case 3: typ=1; break; } if( typ >= 1 && typ <= 5 ) { sprintf( ss, "%3i", A_d ); if( typ==1 || typ==2 || typ==4 || typ == 5 ) sprintf( ss+strlen(ss), "%7i", PV[0][0].value ); else if( typ == 3 ) sprintf( ss+strlen(ss), " -> " ); if( typ == 3 ) { long tt = (long) (ptime()-T1); long t = tt / 100; sprintf( ss+strlen(ss), "%3i:%02i.%02li", (int)t/60, (int)t%60, tt*100/100-t*100 ); } else { sprintf( ss+strlen(ss), " %5li", (long)(t-T1) ); } sprintf( ss+strlen(ss), " %8lli ", Nodes ); } else { sprintf( ss, "Depth=%i, Value=%i, Time=%i.%02i, Last turn=%i.%02i, Nodes=%i", (int) A_d, (int) PV[0][0].value, (int) (t-T1)/100, (int) (t-T1)%100, (int) (LastTurn-T1)/100, (int) (LastTurn-T1)%100, (int) Nodes ); if( t-T1 != 0 ) sprintf( ss+strlen(ss), ", N/s=%i\n", (int) ( (float) Nodes / ( (float)(t-T1)/(float)100 ) ) ); else sprintf( ss+strlen(ss), "\n" ); } switch( typ ) { case 0: sprintf( ss+strlen(ss), "PV = " ); printPV(8,5,ss+strlen(ss)); if( PV[0][0].value > CHECKMATE-100 ) sprintf( ss+strlen(ss), " Mate in %i\n", (CHECKMATE-PV[0][0].value+1) / 2 ); break; case 1: printPV(6,27,ss+strlen(ss)); break; case 2: printm( PV[0][0], ss+strlen(ss) ); sprintf( ss+strlen(ss), "! \n" ); break; case 3: sprintf( ss+strlen(ss), "%2i turn", Turns ); if(Turns==1) sprintf( ss+strlen(ss), " \n"); else sprintf( ss+strlen(ss), "s \n"); break; case 4: printm( PV[0][0], ss+strlen(ss) ); sprintf( ss+strlen(ss), "?? \n" ); break; case 5: printm( PV[0][0], ss+strlen(ss) ); sprintf( ss+strlen(ss), "!! \n" ); } if( s != NULL ) strcpy( s, ss ); else { printf("%s",ss); } } void verboseline( void ) { char s[256]; int j; extern long T1; long t = (long) (ptime()-T1); if( Flag.xboard==0 ) { t /= 100; /* seconds elapsed */ sprintf( s, "(%2i)", A_d ); sprintf( s+strlen(s), " "); sprintf( s+strlen(s), "%3li:%02li ", t/60, t%60 ); sprintf( s+strlen(s), "%9lli ", Nodes ); sprintf( s+strlen(s), "(%2i/%2i) ", A_i+1, A_n ); printm( A_m[A_i], s+strlen(s) ); sprintf( s+strlen(s), " " ); for( j=0; j!=79; j++ ) sprintf( s+strlen(s), "" ); printf("%s",s); } else { sprintf( s, "stat01: %li %li %i %i %i ", t, /* time elapsed in centiseconds */ (long) Nodes, A_d, /* A_d breaks Arena */ A_n - A_i - 1, A_n ); printf("%s",s); gnuprintm(A_m[A_i]); puts(""); } } void printboard(char *s) { int i; char ss[2048]; sprintf(ss, " +---+---+---+---+---+---+---+---+\n "); for(i=A8;i>=A1;i++) { switch(color(B[i])) { case WHITE: sprintf(ss+strlen(ss),"| %c ",piece[B[i]>>4]); break; case BLACK: sprintf(ss+strlen(ss),"| *%c",piece[B[i]>>4]); break; default: sprintf(ss+strlen(ss),"| "); } if( i%10 == 8 ) { i-=18; sprintf(ss+strlen(ss), "|\n +---+---+---+---+---+---+---+---+"); if(i!=10) sprintf(ss+strlen(ss),"\n "); } } if( Color == WHITE ) sprintf(ss+strlen(ss)," White to move\n"); else sprintf(ss+strlen(ss)," Black to move\n"); if( s==NULL ) printf("%s",ss); else strcpy(s,ss); /* printf("%08X\n",G[Counter].hashboard); */ } /** *** The setfen() function is one of the two ways to set a position. *** The second one is edit(). **/ int setfen( const char *f ) { const char *g, *errmsg, errstring[] = "tellusererror Illegal position"; int i,j; tgamenode p, q; if( Flag.log != NULL ) { fprintf(Flag.log,"\n\nsetting position\n%s\n\n",f); } if (Flag.xboard > 0) errmsg = errstring; else /* interactive mode */ errmsg = strchr(errstring, ' ') + 1; /* skip "tellusererror" */ memset(B, 3, sizeof(B)); for (i=FILE_A; i<=FILE_H; i++) memset(&B[10*i+11], 0, 8); memset(G, 0, sizeof(G)); p = q = G[0]; for (j = A8; j != H1+1; f++) { if(*f == '\0' || *f == ' ') /* we shall find info for each squares */ { puts(errmsg); return 1; } if (isdigit((int)*f)) /* skip a number of squares */ { if (*f == '0' || *f == '9') /* these are not allowed */ { puts(errmsg); return 1; } j += (*f-'0'); } else if (*f == '/') /* end of row reached, go to next row */ { if (j%10 == 9) j -= 18; /* next lower row */ else { puts(errmsg); return 1; } /* we are lacking a field in the row processed */ } else { switch( tolower((int)*f) ) { case 'k': B[j] = KING; break; case 'q': B[j] = QUEEN; break; case 'r': B[j] = ROOK; break; case 'b': B[j] = BISHOP; break; case 'n': B[j] = KNIGHT; break; case 'p': B[j] = PAWN; break; default: puts(errmsg); return 1; /* illegal piece char */ } if (tolower((int)*f) == (int)*f) /* black */ B[j] |= BLACK; else B[j] |= WHITE; if (piece(B[j]) == KING) L[color(B[j])].next=j; j++; } } while (*f == ' ' && *f != '\0') f++; switch(*f) { case 'w': Color = WHITE; break; case 'b': Color = BLACK; break; default: puts(errmsg); return 1; } f++; /* set up castling */ while (*f == ' ' && *f != '\0') f++; q.castling = 0; if (strchr(f, 'K')==NULL) /* no K */ q.castling |= WSHORT; /* white short castling is impossible */ if (strchr(f, 'Q')==NULL) /* no Q */ q.castling |= WLONG; /* white long castling is impossible */ if (strchr(f, 'k')==NULL) /* no k */ q.castling |= BSHORT; /* black short castling is impossible */ if (strchr(f, 'q')==NULL) /* no q */ q.castling |= BLONG; /* black long castling is impossible */ while (*f != ' ' && *f != '\0') f++; while (*f == ' ' && *f != '\0') f++; /* en-passant */ g = f + 1; if ( *f != '-' && strchr("abcdefgh", *f) != NULL && ( (*g == '3' && Color == BLACK) || (*g == '6' && Color == WHITE) ) ) { /* en-passant is possible so the last move was a pawn move which we construct here */ /* determine the target field i */ i = 21 + (int)(*f-'a') + 10*(int)(*g-'1'); j = 10; if (Color == WHITE) j = -j; /* piece was an opposite pawn, obviously, * so check if this is plausible */ if (B[i+j] == (PAWN | (Color ^ (BLACK|WHITE)))) { /* to and from are one line before and after the special field */ p.m.from = i - j; p.m.special = i; p.m.to = i + j; p.m.in1 = p.m.in2a = B[i+j]; } f = g + 1; // jump behind the e.p. info } while (*f != ' ' && *f != '\0') f++; while (*f == ' ' && *f != '\0') f++; initbs(); q.hashboard = hashboard(); q.mtrl = p.xmtrl = G[0].mtrl; q.xmtrl = p.mtrl = G[0].xmtrl; G[0].mtrl = G[0].xmtrl = G[0].hashboard = 0; /* Now we should have the fifty-move info */ i = 0; while (isdigit((int)*f) && f != '\0') /* find the end of the fifty-move info */ i = 10*i + (*f - '0'), f++; q.rule50 = i < 50 ? i : 50; if (i > 0 && p.m.special != 0) /* we have a "previous" move because of e.p. */ p.rule50 = q.rule50 - 1; /* so set the rule50 info, too, can't be wrong */ while (*f == ' ' && *f != '\0') f++; /* Finally, check the fullmove number */ Counter = 0; #undef nodef /* this block breaks moves/time timecontrols, Counter must be 0 */ #ifdef nodef if (p.m.special != 0) { Counter++; if (Color == WHITE) Counter++; } i = 0; while (isdigit((int)*f) && *f != '\0') /* find the end of the fullmove number */ i = 10*i + (*f - '0'), f++; i = 2*i; if (i != 0) { i--; if (Color == BLACK) i++; Counter = i; } #endif /* put results in place */ G[Counter] = q; if (Counter > 0 && p.m.special != 0) G[Counter-1] = p; return 0; } /** *** If an entered string contains seven (or more) slashes *** it is considered as fen test position. **/ int sevenslashes(register char *s) { register int n=7; while( *s!='\0' && *s!=' ' ) { if(*s=='/') { n--; if(!n) return 1; } s++; } return 0; } /** *** Is the current position terminal? *** returns: 0 ... not terminal *** 1 ... draw, 50 moves or 3rd repetition; ok to continue play *** 2 ... draw, stalemate *** 3 ... checkmate **/ int terminal(void) { tmove m[256]; int n, c; generate_legal_moves( m, &n, c=checktest(Color) ); if(!n) { if(c) return 3; else return 2; } if( G[Counter].rule50>=100 || repetition(2) || material_draw() ) { if(Flag.machine_color==(WHITE|BLACK)) Flag.machine_color=0; return 1; } return 0; } void printpositionfen(void) { int s, empty_counter=0, Castling=0; #define EMPTY_COUNTER if (empty_counter) { printf("%d", empty_counter); empty_counter=0; }; for( s=A8; s>=A1; s++ ) { switch( B[s] ) { case WK: EMPTY_COUNTER; printf("K"); break; case BK: EMPTY_COUNTER; printf("k"); break; case WQ: EMPTY_COUNTER; printf("Q"); break; case BQ: EMPTY_COUNTER; printf("q"); break; case WR: EMPTY_COUNTER; printf("R"); break; case BR: EMPTY_COUNTER; printf("r"); break; case WB: EMPTY_COUNTER; printf("B"); break; case BB: EMPTY_COUNTER; printf("b"); break; case WN: EMPTY_COUNTER; printf("N"); break; case BN: EMPTY_COUNTER; printf("n"); break; case WP: EMPTY_COUNTER; printf("P"); break; case BP: EMPTY_COUNTER; printf("p"); break; default: empty_counter++; break; } if( s%10 == 8 ) { EMPTY_COUNTER; s-=18; if (s!=H1-18) printf("/"); else printf(" "); } } if( Color == WHITE ) printf("w "); else printf("b "); /****** White Short ******/ if( ( G[Counter].castling & WSHORT ) == 0 ) { printf("K"); Castling++;} /****** White Long ******/ if( ( G[Counter].castling & WLONG ) == 0 ) { printf("Q"); Castling++;} /****** Black Short ******/ if( ( G[Counter].castling & BSHORT ) == 0 ) { printf("k"); Castling++;} /****** Black Long ******/ if( ( G[Counter].castling & BLONG ) == 0 ) { printf("q"); Castling++;} if (!Castling) printf("- "); else printf(" "); if( Counter != 0 ) { int c = Counter-1; if( piece(G[c].m.in1) == PAWN && abs(G[c].m.from-G[c].m.to) == 20 ) /* The last move was a pawn double step */ { int destination; int special = G[c].m.to; destination = Color==WHITE ? special+10 : special-10; printf("%c%c ", file[destination%10], row[destination/10]); } else printf("- "); } else printf("- "); printf("%d %d\n", G[Counter].rule50, Counter/2+1); } void about(void) { printf(" " ENGNAME " "); puts(VERSION); puts(" Copyright (C) Dusan Dobes, 1997-2000"); printf(" Level ................. "); switch( Flag.level ) { case averagetime: printf( "average time %i seconds\n", Flag.centiseconds/100 ); break; case timecontrol: printf( "%i moves in %i minutes\n", Flag.moves, Flag.centiseconds/6000 ); break; case fixeddepth: printf( "%i search depth\n", Flag.depth/100 ); break; case fixedtime: printf( "fixed time %i seconds\n", Flag.centiseconds/100 ); } printf(" Time .................. "); if( Flag.cpu ) puts("cpu"); else puts("elapsed"); printf(" Book .................. "); if( Flag.book ) puts("on"); else puts("off"); printf(" Learning .............. "); if( Flag.learn ) puts("on"); else puts("off"); printf(" Permanent brain ....... "); switch( Flag.ponder ) { case 0: puts("off"); break; case 1: puts("on"); break; case 2: puts("on (pondering)"); break; default: break; /* 2005-09-14, José de Paula * GCC 3.4 thinks that this "default:" without a * statement is an error, so I put a break here. */ } printf(" Transposition table ... "); if( SizeHT == 0 ) puts("not used"); else { printf("hashing %i positions in %lu bytes\n", SizeHT, (unsigned long)(sizeof(thashentry)*SizeHT) ); } if( Flag.easy ) { printf(" Easy level ............ %i\n",Flag.easy); } if( Flag.nps ) { printf(" Nodes/second limit .... %i\n",Flag.nps); } printf(" Resigning ............. "); if( Flag.resign ) printf("%i.%02i\n",Flag.resign/100,Flag.resign%100); else printf("off\n"); printf("\n"); } /* SIG_INT handler */ void interrupt(int x) { int c; signal(SIGINT,SIG_IGN); if( Flag.polling ) { /* ignore lines that begin with '.' */ c=getc(stdin); ungetc(c,stdin); if( c=='.' ) { fgets(Inp,255,stdin); verboseline(); goto go_on; } } if( Flag.ponder < 2 ) { puts("interrupted"); Abort = 1; goto go_on; } while( command() ) {} go_on:; if( !Abort && !Flag.polling ) signal(SIGINT,interrupt); } int command(void) { static int no_prompt = 0; if( Flag.xboard < 2 ) { if( no_prompt ) { no_prompt = 0; } else if( Flag.ponder >= 2 ) { printf("\n[ pondering ]\n"); } else { printf( "[ %s, %i ]\n", Color==WHITE ? "white" : "black", Counter/2+1 ); } } if( Inp[0] == '\0' ) { if( fgets(Inp,255,stdin) == NULL ) strcpy(Inp,"quit\n"); else if( Flag.log != NULL ) fprintf(Flag.log, "<%s", Inp); } if( strncmp(Inp,"exit",4) == 0 && Flag.analyze ) { Flag.machine_color = Flag.analyze = 0; Inp[0]='\0'; return 1; } if ( strncmp(Inp,"quit",4) == 0 || strncmp(Inp,"exit",4) == 0 ) { if( Flag.ponder < 2 ) return 0; else { Abort = 1; return 0; } } /* COMMAND: protover */ /* added by Bernhard Pruemmer, amended by DD */ if( strncmp( Inp, "protover", 8 ) == 0 ) { printfl("feature myname=\"" ENGNAME " " ); if(Flag.easy) { printfl("Easy %i\"\n",Flag.easy); } else if(Flag.nps) { printfl("%i NPS\"\n",Flag.nps); } else printfl(VERSION"\"\n"); printfl("feature analyze=1 " "setboard=1 " "sigint=1 " "time=1 " "memory=1 " "draw=0 " "option=\"Randomizer (0-50) -slider 0 0 50\" " "ping=1 \n" ); printfl("feature done=1\n"); Flag.xboard=20; /* version 2 */ Inp[0]='\0'; return 1; } /* COMMAND: comment */ if( Inp[0]=='#' ) { printf("%s",Inp); no_prompt = 1; Inp[0]='\0'; return 1; } /* COMMAND: no op */ if( Inp[0]=='\n' ) { Inp[0]='\0'; if( Flag.ponder >= 2 ) return 0; /* continue search */ else return 1; } /* COMMAND: analyze */ if( strncmp( Inp, "analyze", 7 ) == 0 ) { if( Flag.ponder >= 2 ) { Abort = 1; return 0; } printfl("analyze mode, type 'exit' to terminate\n"); Flag.analyze = 1; Flag.machine_color = 3; Inp[0]='\0'; return 1; } /* COMMAND: force */ if( strncmp( Inp, "force", 5 ) == 0 ) { if( Flag.ponder >= 2 ) { Abort = 1; return 0; } puts("you play both"); if( Flag.analyze ) Flag.machine_color = Color; else Flag.machine_color = 0; Inp[0]='\0'; return 1; } /* COMMANDS: white, black */ if( strncmp( Inp, "white", 5 ) == 0 || strncmp( Inp, "black", 5 ) == 0 ) { if( Flag.ponder >= 2 ) { Abort = 1; return 0; } printfl("you do not play both\n"); if( Flag.machine_color == 0 ) Flag.machine_color = enemy(Color); Inp[0]='\0'; return 1; } /* COMMAND: both */ if( strncmp( Inp, "both", 4 ) == 0 ) { if( Flag.ponder >= 2 ) { Abort = 1; return 0; } printfl("machine plays both\n"); Flag.machine_color = 3; Inp[0]='\0'; return 1; } /* COMMAND: new */ if( strncmp( Inp, "new", 3 ) == 0 ) { if( Flag.ponder >= 2 ) { Abort = 1; return 0; } // setfen("rnbqkbnr/pppppppp/////PPPPPPPP/RNBQKBNR/w"); setfen(initialpos); DrawScore = -10; if( Flag.analyze ) Flag.machine_color = WHITE; else { Flag.machine_color = BLACK; puts("initial position set, machine plays black"); } Inp[0]='\0'; return 1; } /* COMMAND: go */ if( strncmp( Inp, "go", 2 ) == 0 ) { if( Flag.ponder >= 2 ) { Abort = 1; return 0; } Flag.machine_color = Color; Inp[0]='\0'; return 1; } /* COMMAND: bd */ if( strncmp( Inp, "bd", 2 ) == 0 || strncmp( Inp, "d\n", 2 ) == 0 ) { printboard(NULL); Inp[0]='\0'; return 1; } /* COMMAND: bk */ if( strncmp( Inp, "bk", 2 ) == 0 ) { tmove m[256]; int n; extern void bk(tmove *, int ); if( Flag.ponder >= 2 ) { Abort = 1; return 0; } generate_legal_moves( m, &n, checktest(Color) ); bk(m,n); /* printf("%08X\n",G[Counter].hashboard); */ Inp[0]='\0'; return 1; } /* COMMAND: post */ if( strncmp( Inp, "post", 4 ) == 0 ) { Flag.post = 1; printfl("post on\n"); Inp[0]='\0'; return 1; } /* COMMAND: nopost */ if( strncmp( Inp, "nopost", 6 ) == 0 ) { Flag.post = 0; printfl("post off\n"); Inp[0]='\0'; return 1; } /* COMMAND: level */ if( strncmp( Inp, "level ", 6 ) == 0 ) { l_level( Inp+6 ); Inp[0]='\0'; return 1; } /* COMMAND: ping */ if( strncmp( Inp, "ping", 4 ) == 0 ) { Inp[1]='o'; /* ping -> pong */ printfl(Inp); Inp[0]='\0'; return 1; } /* COMMAND: time */ if( strncmp( Inp, "time ", 5 ) == 0 ) { sscanf( Inp+5, "%li", &Time ); Inp[0]='\0'; return 1; } /* COMMAND: otim */ if( strncmp( Inp, "otim ", 5 ) == 0 ) { sscanf( Inp+5, "%li", &Otim ); Inp[0]='\0'; return 1; } /* COMMAND: rating */ if( strncmp( Inp, "rating ", 7 ) == 0 ) { int phal, oppo, diff; if( sscanf( Inp+7, "%i %i", &phal, &oppo ) == 2 ) { diff = oppo-phal; if( diff > 300 ) DrawScore = 20; else if( diff < -300 ) DrawScore = -20; else DrawScore = diff/15; printfl("setting draw score to %i\n",DrawScore); Inp[0]='\0'; return 1; } } /* COMMAND: hard */ if( strncmp( Inp, "hard", 4 ) == 0 ) { if( Flag.ponder==0 && Flag.easy==0 ) Flag.ponder = 1; if(Flag.ponder) printfl("pondering on\n"); Inp[0]='\0'; return 1; } /* COMMAND: easy */ if( strncmp( Inp, "easy", 4 ) == 0 ) { if( Flag.ponder != 0 ) { if( Flag.ponder >= 2 ) { Abort = 1; return 0; } Flag.ponder = 0; } printfl("pondering off\n"); Inp[0]='\0'; return 1; } /* COMMAND: beep, draw, ... ignored */ if( strncmp( Inp, "beep\n", 5 ) == 0 || strncmp( Inp, "bogus\n", 6 ) == 0 || strncmp( Inp, "draw\n", 5 ) == 0 || strncmp( Inp, "name ", 5 ) == 0 || strncmp( Inp, "random\n", 7 ) == 0 || strncmp( Inp, "noise ", 6 ) == 0 || strncmp( Inp, "result ", 7 ) == 0 || strncmp( Inp, "accepted", 8 ) == 0 || strncmp( Inp, "rejected", 8 ) == 0 || strncmp( Inp, ".\n", 2 ) == 0 || strncmp( Inp, "?\n", 2 ) == 0 ) { /* ignore */ Inp[0]='\0'; return 1; } /* COMMAND: depth */ if( strncmp( Inp, "depth", 5 ) == 0 ) { int newdepth; if( Inp[5] == '\n' ) { printf("depth= "); scanf( "%i", &newdepth ); } else { sscanf( &Inp[6],"%i",&newdepth); } Flag.depth = 100*newdepth; if( Flag.depth < 200 ) Flag.depth = 200; else if( Flag.depth > MAXPLY*100 ) Flag.depth = MAXPLY*100; Flag.level = fixeddepth; printfl("search depth %i\n", Flag.depth/100 ); Inp[0]='\0'; return 1; } /* COMMAND: randomizer option N */ if( strncmp( Inp, "option Randomizer (0-50)=", 18 ) == 0 ) { sscanf( &Inp[25],"%i",&Flag.random); if( Flag.random ) printfl("telluser randomizer set to %i centipawns\n", Flag.random); else printfl("telluser randomizer off\n"); } /* COMMAND: memory N */ if( strncmp( Inp, "memory", 6 ) == 0 ) { int newsize; thashentry * newHT; if( Inp[6] == '\n' ) { printf("memory in MB> "); scanf( "%i", &newsize ); } else { sscanf( &Inp[7],"%i",&newsize); } /* printf("telluser Phalanx hashtable %i MB, ", newsize ); */ if( newsize == 1 ) /* 1 MB requested, we use small HT */ newsize = 70000; else { if( newsize <= 0 ) newsize = 0; else /* newsize >= 2MB */ /* memory is in megabytes. we substract one megabyte * for other data structures */ newsize = ((newsize-1)*(1024*1024))/sizeof(thashentry); } /* printf("%i entries\n",newsize); */ if( newsize == 0 ) { free(HT); SizeHT=0; HT=NULL; } else { newHT = realloc( HT, newsize*sizeof(thashentry) ); if( newHT != NULL ) { HT = newHT; SizeHT = newsize; memset( HT, 0, SizeHT*sizeof(thashentry) ); } } Inp[0]='\0'; return 1; } /* COMMAND: book */ if( strncmp( Inp, "book", 4 ) == 0 ) { Flag.book = ! Flag.book; if( Flag.book ) printfl("book on\n"); else printfl("book off\n"); Inp[0]='\0'; return 1; } /* COMMAND: about */ if( strncmp( Inp, "about", 5 ) == 0 ) { about(); Inp[0]='\0'; return 1; } /* COMMAND: fen */ if( strncmp( Inp, "fen", 3 ) == 0 ) { printpositionfen(); Inp[0]='\0'; return 1; } /* COMMAND: help */ if( strncmp( Inp, "help", 4 ) == 0 ) { puts("COMMAND SUMMARY: about (shows settings), bd (displays position - same"); puts("as 'd'), bk (shows book info), book (enables/disables book), both"); puts("(machine plays both), depth (set search depth), fen, force (user"); puts("plays both, go (start computing), help, history (show game moves),"); puts("level , level , new (new game), post (show thinking), remove (take back last"); puts("move, two plies), nopost (do not show thinking), quit (same as 'exit'"); puts("or end of file character), score (show static evaluation), time "); puts("(remaining time is N/100 s), undo (undo last ply - same as 'u'),"); puts(" (set test position, start search, show result),"); puts("# (comment)"); Inp[0]='\0'; return 1; } /* COMMAND: score */ if( strncmp(Inp,"score\n",6) == 0 || strncmp(Inp,"s\n",2) == 0 ) { Totmat = G[Counter].mtrl+G[Counter].xmtrl; Scoring = 1; Depth = 100; printf("\n (stm) material = %i\n", G[Counter].mtrl-G[Counter].xmtrl); printf(" TOTAL EVALUATION = %i\n", score_position() ); printf("Wknow.hung=%i; Wknow.khung=%i\n", Wknow.hung, Wknow.khung); printf("Bknow.hung=%i; Bknow.khung=%i\n", Bknow.hung, Bknow.khung); puts(""); Scoring = 0; Inp[0]='\0'; return 1; } /* COMMAND: xboard */ if( strncmp( Inp, "xboard", 6 ) == 0 ) { Flag.xboard = 2; puts("xboard mode on"); Inp[0]='\0'; return 1; } /* COMMAND: history */ if( strncmp( Inp, "history\n", 8 ) == 0 ) { int i; int sc = (Counter+Color+1) % 2; if( sc ) printf("\n 1. ... "); for( i=0; i= 2 ) { Abort = 1; return 0; } if( Counter != 0 ) { undo_move( & G[Counter-1].m ); if(Flag.xboard<2) puts("halfmove back"); if( Flag.machine_color != 0 ) Flag.machine_color = enemy(Color); if( Flag.analyze ) Flag.machine_color = Color; } else puts("cannot undo"); Inp[0]='\0'; return 1; } /* COMMAND: remove (xboard) */ if( strncmp( Inp, "remove", 6 ) == 0 ) { if( Flag.ponder >= 2 ) { Abort = 1; return 0; } if( Counter > 1 ) { undo_move( & G[Counter-1].m ); undo_move( & G[Counter-1].m ); if(Flag.xboard<2) puts("move back"); if( Flag.machine_color != 0 ) Flag.machine_color = enemy(Color); } else puts("cannot remove"); Inp[0]='\0'; return 1; } /* COMMAND: setboard */ /* added by Pascal Georges */ if( strncmp( Inp, "setboard ", 9 ) == 0 ) { if (setfen(Inp+9)) setfen(initialpos); if(Flag.analyze) Flag.machine_color=3; Inp[0] = '\0'; return 1; } /* COMMAND: st */ /* added by stevenaaus */ if( strncmp( Inp, "st ", 3 ) == 0 ) { float seconds; if( sscanf(Inp+3,"%f",&seconds) == 0 ) { // expected a time in seconds printfl ("Error: \"st:\" expected float , but got %s\n", Inp+3); } // time argv S.A. printfl ("Setting average time to %f seconds\n",seconds); Flag.centiseconds = (int)(100*seconds); Flag.level = averagetime; Inp[0] = '\0'; return 1; } /* COMMAND: test a position */ if( sevenslashes(Inp) ) /* test */ { if( Flag.ponder >= 2 ) { Abort = 1; return 0; } if( setfen(Inp) == 0 ) { static int entered=0; static int found=0; int f=0; tmove m; int i; memset( HT, 0, SizeHT*sizeof(thashentry) ); printf("\n%s",Inp); m = root_search(); Flag.machine_color = 0; if( ! Flag.post ) { Depth += 100; infoline(0,NULL); } entered++; for( i=0; Inp[i]!='\0'; i++ ) if( checkmove( Inp+i, &m ) ) { f=1; found++; break; } if( f ) printf("[ Solution correct "); else { FILE * nf; /* not found */ static char filename[16] = "notfound.fin"; if( entered-found == 1 ) nf = fopen(filename,"w"); else nf = fopen(filename,"a"); if( nf != NULL ) { fputs( Inp, nf ); fclose(nf); } printf("[ Solution incorrect "); } printf(" %i.%02i%%, %i/%i ]\n", found*100/entered, found*10000/entered%100, found, entered); no_prompt = 1; } Inp[0]='\0'; return 1; } /* suppose this is an user move */ if( Flag.ponder >= 2 ) { tmove *pm = sandex(Inp,Pm,Pn); if(pm!=NULL) if( pm->from == Pondermove.from && pm->to == Pondermove.to && pm->in1 == Pondermove.in1 && pm->in2 == Pondermove.in2 && pm->in2a == Pondermove.in2a && pm->special == Pondermove.special ) { Flag.ponder = 1; if( ! l_iterate() ) Abort = 2; else if( !Flag.polling ) signal(SIGINT,interrupt); Inp[0] = '\0'; return 0; } Abort = 1; return 0; } if( terminal() < 2 ) { tmove m[256]; int n; int i; generate_legal_moves( m, &n, checktest(Color) ); { tmove *sd = sandex(Inp,m,n); if(sd!=NULL) i=sd-m; else i=n; } if( i != n ) { if( Flag.xboard < 2 ) { printf("\nyour move is "); printm( m[i], NULL ); puts(""); } do_move( m+i ); switch( terminal() ) { case 1: printfl("1/2-1/2 {Drawn game}\n"); break; case 2: printfl("1/2-1/2 {Stalemate}\n"); break; case 3: if( Color == WHITE ) printfl("0-1 {Black mates}\n"); else printfl("1-0 {White mates}\n"); } Inp[0]='\0'; return 1; } } /*** UNKNOWN COMMAND / ILLEGAL MOVE ***/ { char *c=strchr(Inp,'\n'); if(c!=NULL) *c='\0'; else *Inp='\0'; } printfl("Illegal move: %s\n",Inp); Inp[0] = '\0'; return 1; } void shell(void) { while( command() ) { while( ( Flag.machine_color & Color ) && terminal() < 2 ) { tmove m; m = root_search(); if( Flag.analyze ) { undo_move(&m); Flag.machine_color = enemy(Color); continue; } if( Flag.ponder >= 2 ) { Flag.ponder = 1; undo_move(&m); undo_move(&Pondermove); continue; } if( Flag.machine_color == 3 && Abort == 1 ) Flag.machine_color = 0; { int ter; if( Flag.resign != 0 ) { static int resign=0; if( m.value < -Flag.resign && Counter > 20 ) resign++; else resign=0; if( resign > 3 && Otim > 2000 /* oppo must have 20 s */ && Otim + Flag.increment*900 > 9000 /* && m.value > -CHECKMATE+100 */ ) { if( Flag.xboard>0 ) puts("tellics resign"); if( Color == WHITE ) puts("1-0 {Black resigns}"); else puts("0-1 {White resigns}"); } } if( Flag.xboard < 2 ) { printf("my move is "); printm( m, NULL ); puts(""); } if( Flag.xboard > 0 ) { printf("move "); gnuprintm(m); puts(""); } switch( ( ter = terminal() ) ) { case 1: puts("1/2-1/2 {Drawn game}"); continue; case 2: puts("1/2-1/2 {Stalemate}"); continue; case 3: if( Color == WHITE ) puts("0-1 {Black mates}"); else puts("1-0 {White mates}"); continue; } if( Flag.ponder == 1 && Flag.machine_color != 3 && ter < 2 && ( Abort != 0 || Abort != 4 ) ) { int i; Pondermove = PV[0][1]; generate_legal_moves(Pm,&Pn,checktest(Color)); for( i=0; i!=Pn; i++ ) if( Pondermove.from == Pm[i].from && Pondermove.to == Pm[i].to && Pondermove.in1 == Pm[i].in1 && Pondermove.in2a == Pm[i].in2a ) break; if( i==Pn && Flag.nps==0 ) { if( Flag.post ) { puts("No move to ponder from PV."); puts("Looking for a move to ponder."); } if( Bookout < 4 || Counter < 10 ) i = bookmove( Pm, Pn ); else i = -1; if( i != -1 ) { Pondermove = Pm[i]; if( Flag.post ) puts("Found in book."); } else { if( Flag.post ) puts("Trying search."); Depth = -100; NoAbort = 1; Ply = 1; search(Pm,Pn,-CHECKMATE,CHECKMATE); NoAbort = 0; Pondermove = PV[1][1]; } for( i=0; i!=Pn; i++ ) if( Pondermove.from == Pm[i].from && Pondermove.to == Pm[i].to && Pondermove.in1 == Pm[i].in1 && Pondermove.in2a == Pm[i].in2a ) break; if( i==Pn ) { if(Flag.post) puts("No move found. A bug?"); i=0; } else { if(Flag.post) puts("Done."); } } if( i != Pn ) { /* OK, the move was also found in just * generated list of moves, not only in * the PV (principal variation). Let's * ponder then!!! ********************/ do_move(&Pondermove); if( terminal() > 1 ) undo_move(&Pondermove); else { if( Flag.post ) { printf("Hint: "); printm(Pondermove,NULL); puts(""); } Flag.ponder = 2; } } } continue; } } } } Phalanx-XXV/killers.c0000644000175000010010000000645012521510155013527 0ustar dusanNone#include "phalanx.h" typedef struct { unsigned f, t; } killentry; killentry RK[H9][H9]; /* reaction killer */ unsigned HK[H9][H9]; /* history killer table */ unsigned Maxhist = 1; void init_killers(void) { memset( RK, 0, H9*H9*sizeof(killentry) ); memset( HK, 0, H9*H9*sizeof(unsigned) ); Maxhist = 1; } void write_killer( int from, int to ) { if( B[to] == 0 ) { RK[G[Counter-1].m.from][G[Counter-1].m.to].f = from; RK[G[Counter-1].m.from][G[Counter-1].m.to].t = to; HK[from][to] += Depth/10 + 1; if( HK[from][to] > Maxhist ) { Maxhist = HK[from][to]; if( Maxhist > 4000 ) { int f,t; Maxhist /= 2; for( f=A1; f!=H9; f++ ) for( t=A1; t!=H9; t++ ) HK[f][t] /= 2; } } } } /* * We are in a cut node, but the 1st killer was not successful. * Let's lower the history killer values of the unsuccessful ones * to magnify the importance of the successful one. */ void slash_killers( tmove *m, int n ) { int i; int findnewmax=0; for( i=0; i!=n; i++ ) { if( HK[m[i].from][m[i].to] == Maxhist ) findnewmax = 1; HK[m[i].from][m[i].to] /= 2; } if( findnewmax ) { int f,t; Maxhist /= 2; for( f=A1; f!=H9; f++ ) for( t=A1; t!=H9; t++ ) if( HK[f][t] > Maxhist ) Maxhist = HK[f][t]; } } void add_killer( tmove *m, int n, thashentry *ht ) { int i, f=0, t=0; tmove *mpv = &PV[0][Ply]; tmove *mlv = &PV[Ply][Ply]; if( Depth > 0 ) { f = RK[G[Counter-1].m.from][G[Counter-1].m.to].f; t = RK[G[Counter-1].m.from][G[Counter-1].m.to].t; } for( i=0; i!=n; i++ ) { register tmove *m1 = m+i; if( FollowPV ) { if( ( mpv->special && mpv->special==m1->special ) || ( !mpv->special && m1->from == mpv->from && m1->to == mpv->to && m1->in2a == mpv->in2a ) ) m1->value = CHECKMATE; } else { if( m1->from == mlv->from && m1->to == mlv->to && ( mlv->in2 == 0 || m1->in2 == mlv->in2 ) && m1->in2a == mlv->in2a ) m1->value += 350; if( ht != NULL ) if( ht->move != 0 ) if( ht->move == smove(m1) ) m1->value = CHECKMATE; } if( m1->value != CHECKMATE ) { /* mopv - moving piece value */ int mopv = Values[ m1->in2a >> 4 ]; if( m1->in2 ) /* capture */ { m1->value += Values[ m1->in2>>4 ]; /* capture of last moved piece */ if( m1->to == G[Counter-1].m.to ) m1->value += 150; if( Color==WHITE ) { if( P[m1->to]&0xFF00 ) m1->value -= ( mopv / 4 ); else m1->value += 150; } else { if( P[m1->to]&0x00FF ) m1->value -= ( mopv / 4 ); else m1->value += 150; } if( m1->value < 30 ) m1->value = 30; if( Depth > 200 ) { m1->value += see( B, m1->from, m1->to ); if(m1->value<0) m1->value=20; } } /* non captures - look at the power tables */ else if( mopv>P_VALUE ) { if( Color==WHITE ) { /* leaving attacked square */ if(P[m1->from]&0xFF00) m1->value += mopv/20; /* going to attacked square */ if(P[m1->to]&0xFF00) m1->value -= mopv/15; } else { if(P[m1->from]&0x00FF) m1->value += mopv/20; if(P[m1->to]&0x00FF) m1->value -= mopv/15; } } if( m1->in1 != m1->in2a ) /* pawn promotion */ m1->value += Values[ m1->in2a>>4 ] - P_VALUE; if( Depth > 0 ) { if( m1->from == f && m1->to == t ) m1->value += max(Depth,50); if( HK[ m1->from ][ m1->to ] ) m1->value += 1 + HK[ m1->from ][ m1->to ] * 500 / Maxhist; } } } } Phalanx-XXV/learn.c0000644000175000010010000000320212317742054013163 0ustar dusanNone#include "phalanx.h" #define LREHASH 8 tpbook Learn; typedef struct { unsigned hashboard; short depth, value; } tlearn; void wlearn( int depth, int value ) { int size, pos; int i; int bdepth, bpos; tlearn cell; if( Flag.learn == 0 || Learn.f == NULL || depth <= 400 ) return; size = Learn.filesize/sizeof(tlearn); pos = G[Counter].hashboard % size; if( fseek( Learn.f, pos*sizeof(tlearn), SEEK_SET ) != 0 ) return; myfread( &cell, sizeof(tlearn), Learn.f ); bdepth = -1000; bpos = pos; for( i=0; i bdepth ) { bdepth = cell.depth; bpos = pos+i; } } if( cell.hashboard == G[Counter].hashboard && cell.depth > depth ) return; if( fseek( Learn.f, (bpos%size)*sizeof(tlearn), SEEK_SET ) != 0 ) return; cell.hashboard = G[Counter].hashboard; cell.depth = depth; cell.value = value; myfwrite( &cell, sizeof(tlearn), Learn.f ); } int rlearn( void ) { int size, pos; int i; tlearn cell; if( Flag.learn == 0 || Learn.f == NULL ) return NOVALUE; size = Learn.filesize/sizeof(tlearn); pos = G[Counter].hashboard % size; for( i=0; i= Depth ) return cell.value; else return NOVALUE; } } return NOVALUE; } Phalanx-XXV/levels.c0000644000175000010010000001102412663427576013372 0ustar dusanNone#include "phalanx.h" long T1, T2; long Time = 600*100; long Otim = 100; /* return time in centiseconds */ long ptime(void) { if( Flag.cpu ) return ((double)clock())*100/CLOCKS_PER_SEC; else { #ifdef _WIN32 return GetTickCount()/10; #else struct timeval t; gettimeofday( &t, NULL ); return t.tv_sec*100 + t.tv_usec/10000; #endif } } void l_level( char * l ) { int moves, seconds, minutes, increment; while( *l == ' ' ) l++; moves = atoi(l); while( isdigit((int)*l) ) l++; while( *l == ' ' ) l++; if( *l == '\n' || *l == '\0' ) { printfl("fixed time %i seconds\n", moves ); Flag.level = fixedtime; Flag.centiseconds = moves*100; return; } minutes = atoi(l); while( isdigit((int)*l) ) l++; if( *l == ':' ) { l++; seconds = atoi(l); while( isdigit((int)*l) ) l++; } else seconds = 0; while( isdigit((int)*l) ) l++; while( *l == ' ' ) l++; increment = atoi(l); if( moves==0 ) printfl( "level: all moves in %i:%02i, increment %i seconds\n", minutes, seconds, increment ); else printfl( "level: %i moves in %i:%02i, increment %i seconds\n", moves, minutes, seconds, increment ); Flag.level = timecontrol; Flag.moves = moves; Flag.centiseconds = minutes*6000+seconds*100; Flag.increment = increment; Time = Flag.centiseconds; } void l_startsearch(void) { int moves; T1 = ptime(); /* Adjust the DrawScore to avoid long boring drawish endgames. * The default DrawScore is -10; Phalanx tries to avoid draws. * That's good, but I have observed too many games that ended * with the 50 moves rule draw, where the engine played * an KR vs KR endgame. The code below fixes that behaviour. */ if( Counter>=80 /* Counter==80 is move #40 */ && ( ( DrawScore < 0 && G[Counter].mtrl <= 3*R_VALUE ) || ( DrawScore < 10 && G[Counter].mtrl <= R_VALUE ) ) ) DrawScore++; switch( Flag.level ) { case timecontrol: if( Flag.moves > 0 ) moves = 2*Flag.moves; else { moves = Counter + (G[Counter].mtrl+G[Counter].xmtrl)/800; if( Counter < 120 ) moves += 60 - Counter/4; else moves += 30; } if( Flag.increment == 0 ) T2 = 0; else if( Time/Flag.increment >= 1600 ) T2 = Flag.increment * 60; else if( Time/Flag.increment <= 400 ) T2 = Flag.increment * 10; else T2 = Flag.increment * (Time/Flag.increment/8-20)/3; if( Flag.post && T2 && Flag.xboard<2 ) printfl( " -> increment adds %g s to soft time limit\n", ((float)T2) / (float)100 ); T2 += Time / ( moves - Counter%moves + 4 ); if( Flag.ponder ) T2 += T2/8; if( Flag.increment==0 && Flag.level==timecontrol ) { if( Time<150/*0*/ ) T2 -= T2/2; else if( Time<600/*0*/ ) T2 -= T2/4; if( Flag.moves==0 /* all moves TC */ && Time < Otim /* less time than opponent */ && Time < 600*100 /* and less than 10 minutes */ && Flag.ponder != 2 ) { long Reduction; Reduction = T2 - T2*(Time+Time)/(Otim+Time); Reduction = Reduction*(60000-Time)/(60000); /* printf("telluser Ponder=%i Time=%li Otim=%li reducing %li by %li\n", Flag.ponder, Time, Otim, T2, Reduction); */ T2 -= Reduction; } } if( Flag.post && Flag.xboard<2 ) printfl( " -> soft time limit %g s\n", ((float)T2) / (float)100 ); /*** Now, set up the hard limit ***/ if( Time < 150/*0*/) Flag.centiseconds = Time/(moves+1)*3; else if( Time < 300/*0*/) Flag.centiseconds = Time/(moves+1)*6; else if( Time < 600/*0*/) Flag.centiseconds = Time/(moves+1)*12; else Flag.centiseconds = Time/(moves+1)*18; Flag.centiseconds += 400*Flag.increment; if( Flag.centiseconds > Time-Flag.increment*100 ) { if( Time > 200*Flag.increment ) Flag.centiseconds = Time-100*Flag.increment; else Flag.centiseconds = Time/2; } if( Flag.centiseconds < 25 ) Flag.centiseconds = 25; if( Flag.post && Flag.xboard<2 ) printfl( " -> hard time limit %g s\n", ((float)Flag.centiseconds) / (float)100 ); break; case averagetime: T2 = Flag.centiseconds/3; break; default: break; } if( T2 < 1 ) T2 = 1; } int l_iterate(void) { if( Flag.level == fixeddepth ) { return ( Depth < Flag.depth ); } else if( Flag.level == averagetime || Flag.level == timecontrol ) { long t = ptime(); switch( EasyMove ) { case 1: return ( t <= T1 + T2/2 ); case 2: return ( t <= T1 + T2/4 ); default: if( Depth<400 ) /* stabilize low nps levels */ return ( t <= T1 + T2*2/3 ); if( Turns==0 ) return ( t <= T1 + T2 ); else return ( t <= T1 + T2*(14+Turns)/10 ); } } else return 1; } Phalanx-XXV/makefile0000644000175000010010000000404612446544763013437 0ustar dusanNone####### default places (can be overridden by "make prefix=/usr install" etc.) prefix = /usr/local exec_prefix = $(prefix) bindir = $(exec_prefix)/bin libdir = $(exec_prefix)/lib pluginsdir = $(prefix)/share/games/plugins/xboard ####### choose the line that makes the binary faster on your machine # CFLAGS = -O3 -Wall -fomit-frame-pointer -funroll-loops CFLAGS = -O3 -Wall -mtune=native --std=gnu89 -D_GNU_SOURCE # CFLAGS = -fprofile-generate -mtune=native -O3 -Wall --std=gnu89 -D_GNU_SOURCE # CFLAGS = -fprofile-use -mtune=native -O3 -Wall --std=gnu89 -D_GNU_SOURCE # CFLAGS = -O3 -Wall -fomit-frame-pointer --std=gnu89 -D_GNU_SOURCE # -std=c99 #-Werror removed ####### debug/tuning options for developers # CFLAGS = -O -Wall -g3 -static # CFLAGS = -O -Wall -pg ####### ### DEFINES ### -DSHOW_FORCED_MOVES ### -DPBOOK_FILE=\"pbook.phalanx\" ### -DSBOOK_FILE=\"sbook.phalanx\" ### -DLEARN_FILE=\"learn.phalanx\" ### -DPBOOK_DIR=\"${libdir}\" ### -DSBOOK_DIR=\"${libdir}\" ### -DLEARN_DIR=\"/var/local/lib\" ### -DQCAPSONLY DEFINES = -DGNUFUN LDFLAGS = OBJ = .o/phalanx.o .o/bcreate.o .o/search.o .o/io.o .o/data.o \ .o/evaluate.o .o/genmoves.o .o/moving.o .o/hash.o .o/static.o \ .o/levels.o .o/book.o .o/killers.o .o/endgame.o .o/learn.o .o/easy.o phalanx: .o $(OBJ) $(CC) $(CFLAGS) $(DEFINES) $(LDFLAGS) $(OBJ) -o phalanx .o/%.o: makefile phalanx.h %.c $(CC) $(CFLAGS) $(DEFINES) -c $*.c -o .o/$*.o .o: mkdir .o clean: rm -rf .o phalanx *.lrn learn.phalanx backup: tar -czvf Archive/phalanx.tgz \ makefile *.c *.h pbook.phalanx sbook.phalanx test.fin phalanx.eng install: phalanx install -d 0755 $(DESTDIR)$(bindir) install -m 0755 phalanx $(DESTDIR)$(bindir) install -d 0755 $(libdir) install -m 0644 pbook.phalanx $(DESTDIR)$(libdir) install -m 0644 sbook.phalanx $(DESTDIR)$(libdir) install -d 0755 $(DESTDIR)$(pluginsdir) install -m 0644 phalanx.eng $(DESTDIR)$(pluginsdir) uninstall: rm -f $(DESTDIR)$(bindir)/phalanx rm -f $(DESTDIR)$(libdir)/pbook.phalanx rm -f $(DESTDIR)$(libdir)/sbook.phalanx rm -f $(DESTDIR)$(pluginsdir)/phalanx.eng Phalanx-XXV/moving.c0000644000175000010010000001677312433044574013403 0ustar dusanNone/* * executing and unexecuting generated moves */ #include "phalanx.h" #undef DEBUG_MLIST #ifdef DEBUG_MLIST int checklist(tmove *m) { int j; int err=0; int wp=0, bp=0; for( j=WKP; j!=0 && wp<18; j=L[j].next ) { wp++; if(color(B[j])!=WHITE) err=1; } for( j=A1; j!=H9; j++ ) if( color(B[j])==WHITE ) wp--; for( j=BKP; j!=0 && bp<18; j=L[j].next ) { bp++; if(color(B[j])!=BLACK) err=1; } for( j=A1; j!=H9; j++ ) if( color(B[j])==BLACK ) bp--; if( wp!=0 || bp!=0 || err ) { int x=18; puts(""); for( j=WKP; j!=0 && x!=0; j=L[j].next ) { x--; if(color(B[j])!=WHITE) printf("!"); printf("%i,",j); } puts(""); x=18; for( j=BKP; j!=0 && x!=0; j=L[j].next ) { x--; if(color(B[j])!=BLACK) printf("!"); printf("%i,",j); } puts(""); printboard(NULL); printf("wp=%i, bp=%i\n",wp,bp); for(j=0;j!=Counter;j++) printm(G[j].m,NULL); puts(""); if( m!=NULL) printm(*m,NULL); getchar(); return 1; } return 0; } #endif #define update_hash(p,s) { G[Counter].hashboard ^= H[ HP[p] ][ HS[s] ]; } void do_move(register tmove * m) { G[Counter].m = *m; Counter++; G[Counter].castling = G[Counter-1].castling; G[Counter].rule50 = G[Counter-1].rule50 + 1; G[Counter].hashboard = HASH_COLOR ^ G[Counter-1].hashboard; G[Counter].mtrl = G[Counter-1].xmtrl; G[Counter].xmtrl = G[Counter-1].mtrl; Ply++; switch(m->special) { case 0: /* most of the moves */ update_hash( m->in1, m->from ); update_hash( m->in2a, m->to ); if( m->in2 != 0 ) /* capture */ { update_hash( m->in2, m->to ); G[Counter].mtrl -= Values[ m->in2 >> 4 ]; G[Counter].rule50 = 0; /* remove captured piece from the list */ L[ L[m->to].prev ].next = L[m->to].next; L[ L[m->to].next ].prev = L[m->to].prev; } else if( piece(m->in1) == PAWN ) G[Counter].rule50 = 0; /* update piece list */ L[m->to] = L[m->from]; L[ L[m->to].prev ].next = L[ L[m->to].next ].prev = m->to; if( m->in2a != m->in1 ) /* pawn promotion */ G[Counter].xmtrl += Values[ m->in2a >> 4 ] - P_VALUE; B[m->from] = 0; B[m->to] = m->in2a; { static unsigned char cb_[80] = { 0, WLONG, 0, 0, 0, (WSHORT|WLONG), 0, 0, WSHORT, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, BLONG, 0, 0, 0, (BSHORT|BLONG), 0, 0, BSHORT, 0 }; static unsigned char * cb = cb_-20; G[Counter].castling |= cb[m->from] | cb[m->to]; } break; case SHORT_CASTLING: if( Color == WHITE ) { B[E1]=0; B[F1]=WR; B[G1]=WK; B[H1]=0; G[Counter].castling |= ( WSHORT | WLONG ); update_hash( WK, E1 ); update_hash( WK, G1 ); update_hash( WR, H1 ); update_hash( WR, F1 ); L[G1] = L[E1]; WKP = L[L[G1].next].prev = G1; L[F1] = L[H1]; L[L[F1].prev].next = L[L[F1].next].prev = F1; } else { B[E8]=0; B[F8]=BR; B[G8]=BK; B[H8]=0; G[Counter].castling |= ( BSHORT | BLONG ); update_hash( BK, E8 ); update_hash( BK, G8 ); update_hash( BR, H8 ); update_hash( BR, F8 ); L[G8] = L[E8]; BKP = L[L[G8].next].prev = G8; L[F8] = L[H8]; L[L[F8].prev].next = L[L[F8].next].prev = F8; } break; case LONG_CASTLING: if( Color == WHITE ) { B[A1]=0; B[C1]=WK; B[D1]=WR; B[E1]=0; G[Counter].castling |= ( WSHORT | WLONG ); update_hash( WK, E1 ); update_hash( WK, C1 ); update_hash( WR, A1 ); update_hash( WR, D1 ); L[C1] = L[E1]; WKP = L[L[C1].next].prev = C1; L[D1] = L[A1]; L[L[D1].prev].next = L[L[D1].next].prev = D1; } else { B[A8]=0; B[C8]=BK; B[D8]=BR; B[E8]=0; G[Counter].castling |= ( BSHORT | BLONG ); update_hash( BK, E8 ); update_hash( BK, C8 ); update_hash( BR, A8 ); update_hash( BR, D8 ); L[C8] = L[E8]; BKP = L[L[C8].next].prev = C8; L[D8] = L[A8]; L[L[D8].prev].next = L[L[D8].next].prev = D8; } break; default: /* en passant pawn capture */ update_hash( m->in1, m->from ); update_hash( m->in2a, m->to ); update_hash( B[m->special], m->special ); B[m->from] = 0; B[m->to] = m->in2a; B[m->special] = 0; /* captured pawn */ /* update piece list */ L[m->to] = L[m->from]; L[ L[m->to].prev ].next = L[ L[m->to].next ].prev = m->to; L[L[m->special].next].prev = L[m->special].prev; L[L[m->special].prev].next = L[m->special].next; G[Counter].mtrl -= P_VALUE; G[Counter].rule50 = 0; /* this is an irreversible move */ } Color = enemy(Color); Depth -= m->dch; #ifdef DEBUG_MLIST checklist(m); #endif } void undo_move(register tmove * m) { Color = enemy(Color); Depth += m->dch; Ply--; Counter--; switch(m->special) { case 0: /* most of the moves */ B[m->from] = m->in1; B[m->to] = m->in2; /* update piece list */ L[m->from] = L[m->to]; L[ L[m->from].prev ].next = L[ L[m->from].next ].prev = m->from; if( m->in2 != 0 ) /* return captured piece to the list */ { if( color(m->in2) == WHITE ) { L[m->to].next = L[WKP].next; L[m->to].prev = WKP; L[L[WKP].next].prev = m->to; L[WKP].next = m->to; } else { L[m->to].next = L[BKP].next; L[m->to].prev = BKP; L[L[BKP].next].prev = m->to; L[BKP].next = m->to; } } break; case SHORT_CASTLING: if( Color == WHITE ) { B[E1]=WK; B[F1]=0; B[G1]=0; B[H1]=WR; L[E1] = L[G1]; WKP = L[L[E1].next].prev = E1; L[H1] = L[F1]; L[L[H1].prev].next = L[L[H1].next].prev = H1; } else { B[E8]=BK; B[F8]=0; B[G8]=0; B[H8]=BR; L[E8] = L[G8]; BKP = L[L[E8].next].prev = E8; L[H8] = L[F8]; L[L[H8].prev].next = L[L[H8].next].prev = H8; } break; case LONG_CASTLING: if( Color == WHITE ) { B[A1]=WR; B[C1]=0; B[D1]=0; B[E1]=WK; L[E1] = L[C1]; WKP = L[L[E1].next].prev = E1; L[A1] = L[D1]; L[L[A1].prev].next = L[L[A1].next].prev = A1; } else { B[A8]=BR; B[C8]=0; B[D8]=0; B[E8]=BK; L[E8] = L[C8]; BKP = L[L[E8].next].prev = E8; L[A8] = L[D8]; L[L[A8].prev].next = L[L[A8].next].prev = A8; } break; default: /* en passant pawn capture */ B[m->to] = 0; L[m->from] = L[m->to]; L[ L[m->from].prev ].next = L[ L[m->from].next ].prev = m->from; if( Color == WHITE ) { B[m->from] = WP; B[m->special] = BP; /* captured pawn */ L[m->special].next = L[BKP].next; L[m->special].prev = BKP; L[L[BKP].next].prev = m->special; L[BKP].next = m->special; } else { B[m->from] = BP; B[m->special] = WP; /* captured pawn */ L[m->special].next = L[WKP].next; L[m->special].prev = WKP; L[L[WKP].next].prev = m->special; L[WKP].next = m->special; } } #ifdef DEBUG_MLIST checklist(m); #endif } #ifdef ETTC /** *** Doing and undoing only hash keys. To be used for ETC *** (enhanced transpostion cutoffs); see evaluate.c **/ void do_hash(register tmove * m) { Counter++; G[Counter].hashboard = HASH_COLOR ^ G[Counter-1].hashboard; switch(m->special) { case 0: /* most of the moves */ update_hash( m->in1, m->from ); update_hash( m->in2a, m->to ); if( m->in2 != 0 ) /* capture */ update_hash( m->in2, m->to ); break; case SHORT_CASTLING: if( Color == WHITE ) { update_hash( WK, E1 ); update_hash( WK, G1 ); update_hash( WR, H1 ); update_hash( WR, F1 ); } else { update_hash( BK, E8 ); update_hash( BK, G8 ); update_hash( BR, H8 ); update_hash( BR, F8 ); } break; case LONG_CASTLING: if( Color == WHITE ) { update_hash( WK, E1 ); update_hash( WK, C1 ); update_hash( WR, A1 ); update_hash( WR, D1 ); } else { update_hash( BK, E8 ); update_hash( BK, C8 ); update_hash( BR, A8 ); update_hash( BR, D8 ); } break; default: /* en passant pawn capture */ update_hash( m->in1, m->from ); update_hash( m->in2a, m->to ); update_hash( B[m->special], m->special ); } Depth -= m->dch; } void undo_hash(register tmove * m) { Depth += m->dch; Counter--; } #endif /* ETTC */ Phalanx-XXV/pbook.phalanx0000644000175000010010000013675212711365707014432 0ustar dusanNone# sorted Phalanx opening book 20160501 00r1b1k1nr2p2pppp1p8p5bPPpP1q4P3PP1B1QPPRN2K1NR h5f7 00r1b1k1nr2p2pppp1pb7P1q5PpN1P4P3PP3PP1RNBQK2R c3d4 00r1b1k1nr2p2pppp2b7p1q1Q3PpN1P4P3PP3PP1RNB1K2R f4h4 00r1b1k1nr2p2pppp2b7p3N3Pp2P4P3PP3PP1RNB1K2R c1g5 00r1b1k1nrpppp1ppp2n7b9P2q3N4PPPP1PPPRNBQKB1R c4b3! h5e5 00r1b1k2r2p1bpppp1p8p1n4PPp2P4P1P1PP2NP2RNB1K2R d4c5 00r1b1k2r2p2pppp1pb1n1q3P7PpN1P2N1P3PP3PP1R1BQK2R g2g4 00r1b1k2rppp1bppp2n2n5p2q4Pp3BPP1P3P2Q1PPPRN2KBNR o-o 00r1b1kb1r1pp2ppp5n2p2p2q2n1Pp3BPP1P3P2Q1PPPRN2KBNR b5d6 00r1b1kb1rpp3ppp2n2n4pq15BPN2PP3PPPRNBQK2R c3b5 00r1b1kb1rpp3ppp5n3Bpq5n10PN2PP3PPPRNBQK2R c1d2 00r1b1kb1rppp2ppp2n2n5p2q4Pp3BP2P3P1P2PPPRN1QKBNR c3b5 00r1b1kb1rppp2ppp5n5p2q2n1Pp3BP2P3P1PQ1PPPRN2KBNR a2a4 00r1b1kb1rppq2ppp2n1pn4pp7P6PBPN2PP1N1PPPR1BQK2R f1e2! c1d2 b2b3 00r1b1kbnr2p2pppp1n6p1P2q1B2Pp7P3PP2NPPPRNBQK2R c3b5 b4a5 00r1b1kbnr2p2pppp1p8p2q3PPpP6P3PPQ3PPRNB1K1NR g4h5 g4g3 00r1b1kbnr2p2pppp1p8p6PPpP1q4P3PP3QPPRNB1K1NR f1b5 00r1bqk1nrpp3ppp2nbp4Bpp6P7N1PN2PP1P1PPPR1BQK2R g1e2! g1f3 00r1bqk1nrppp2ppp2np5Bb1p7P5N2N2PPPP1PPPR1BQK2R c1g5! c1d2 g1f3 g1e2 00r1bqk1nrppp2ppp2np6b1p5B1P5N2N2PPPP1PPPR1BQK2R c1g5! f2f4! g1f3 00r1bqk1nrpppn1ppp11p5bPP12PP1B1PPPRN1QKBNR d1e2! b5d7 00r1bqk1nrpppp1ppp1bn15P6N6PP2PPPPRNBQKB1R d1h5 00r1bqk1nrpppp1ppp2n7b1p5B1P5N5PPPP1PPPR1BQK1NR d1g4! g1f3 00r1bqk1nrpppp1ppp2n7b1p5B1P8N2PPPP1PPPRNBQK2R d2d3! g1f3 00r1bqk2rpp3ppp2nb1n5pp4PP5P3PN5N1PPPR1BQKB1R d4d5! e4e5 00r1bqk2rpp3ppp2nb5Bp1p11P1P1PN3P3PPPR1BQK2R e4e5 o-o 00r1bqk2rpp3ppp2nb5Bpnp11P1N1PN3P1P1PPPR1BQK2R d4c6! d3c2 00r1bqk2rppp1bppp2n8np14P1NP1PP2PPBPRNBQK2R o-o! c1e3 00r1bqk2rppp1nppp2np5Bb8NP5N5PPP2PPPR1BQK2R c4d5 o-o 00r1bqk2rppp2ppp1bn2n6p7P3N1PB1N2PP3PPPR1BQK2R c1e3 00r1bqk2rppp2ppp1bnp1n6P7P5PB1N2PP3PPPRNBQK2R d3e4 00r1bqk2rppp2ppp2nb7np11P1N1P4PQP1PPPR1B1KBNR c1e3!! d4c6 00r1bqk2rppp2ppp2np1n4b1p5B1P5NP1N2PPP2PPPR1BQK2R c1g5!! c3a4! c1e3! 00r1bqk2rpppp1ppp2n2n4b1p5P1P5N5PP1PBPPPR1BQK1NR d2d3 00r1bqk2rpppp1ppp2n2n4b9P8N2PPPP1PPPRNBQKB1R f3e5 00r1bqk2rpppp1ppp2n2n5Np4b2P8N2PPPP1PPPR1BQKB1R b5a4 00r1bqkb1r1p2p1pp2n2p2pBPp8nB4P1PN2PP3PPPRN1QK2R c1g5 e2e4 00r1bqkb1r1p2pppp2n2n2p1Pp9B4P2N2PP2PPPPRN1QKB1R e2e3! f3e5 00r1bqkb1r1p3pppp1n1pn4pp6PP4P1N1PN3P3PPPR1BQKB1R b2b3! d4c5 00r1bqkb1r5pppppn1pn4pp6PP4P1NBPN3P3PPPR1BQK2R f1d3 00r1bqkb1rpp1npppp5n3Bpp7P8PN2PPP2PPPRNBQK2R a2a3 d1a4 e2e3 00r1bqkb1rpp1p1ppp2n1pn12PN8P3PP3PPPRNBQKB1R d2d4 00r1bqkb1rpp1p1ppp2n1pn4p7PP8PN2PP3PPPRNBQKB1R c4d5 d2d4 00r1bqkb1rpp1p1ppp2n1pn4p9P5N2N2PPPPBPPPR1BQK2R f1e2 a2a3 d2d4 00r1bqkb1rpp1p1ppp2n2n4p7P1p6PP3PP3PPPRNBQKBNR e5d6 00r1bqkb1rpp1p1ppp2n2n4p7P8BP3PP3PPPRNBQK1NR d2d4 00r1bqkb1rpp1ppp1p2n2np2Bp9P5N2N2PPPP1PPPR1BQK2R f1g2 c3d5 00r1bqkb1rpp1ppppp2n2n4p7P9PN2PP1P1PPPRNBQKB1R g2g3 e2e3 00r1bqkb1rpp1ppppp2n2n4p8P6P2N2PP2PPPPRNBQKB1R d2d4!! e2e3! c4d5 00r1bqkb1rpp1ppppp2n2n4p8P8PN2PPP2PPPRNBQKB1R d2d4! c4d5 00r1bqkb1rpp1ppppp2n2n4p9P5N2N2PPPP1PPPR1BQKB1R g2g3! d2d3 e2e3 d2d4 00r1bqkb1rpp2pp1p2np1np3p9P5NP1NP1PPP2P1PR1BQKB1R f1g2 00r1bqkb1rpp2pppp2n2n4pp13P2PN2PBPP1PPPRN1QKB1R a2a3 c1g5 00r1bqkb1rpp2pppp2n2n4pp15P1NP1PPP1PPBPRNBQK2R e2e4 g2g3 00r1bqkb1rpp2pppp2n2n4pp6PP8PN2PP3PPPRNBQKB1R c4d5!!! e2e3 00r1bqkb1rpp2pppp2n2n4pp7P6P1PN2PP3PPPRNBQKB1R e2e3! c1g5 00r1bqkb1rpp2pppp2n2n4pp7P8PN2PPP1BPPPRNBQK2R c1g5!! c1f4! c4d5 00r1bqkb1rpp2pppp2n2n5p7P9N2PPP1BPPPRNBQK2R c1g5! c1f4 00r1bqkb1rpp2pppp2n6Bpn16PN2PP1P1PPPRNBQK2R c1d2! g2g3 00r1bqkb1rpp3ppp2n2n4pP15BP3PP3PPPRNBQK1NR d1d4 00r1bqkb1rpp3ppp2n2n4ppp7P6P1N2PPPNBPPPR1BQK2R f1e2!! g2g3 00r1bqkb1rpp3ppp2n2n4ppp7P6P1NP1PPPN1P1PR1BQKB1R f1e2!! g2g3 00r1bqkb1rpp3ppp2n2n4ppp7P6P2P1PPPN1PBPR1BQK1NR f1e2 00r1bqkb1rppp2ppp2n2n5pp14P1NP1PPP1PPBPRNBQK2R f1e2! c1e3 h2h3 00r1bqkb1rppp2ppp2n8np11P1N1P4P1P1PPPR1BQKBNR f1e2 g2g3 00r1bqkb1rppp2ppp2n8np11P2P1N3P2PPPPRNBQKB1R c1g5! c1e3! f1e2! f1c4 f2f4 f2f3 00r1bqkb1rppp2ppp2n8np11P3P4PQP1PPPRNB1KBNR g2g3 f1e2 f1d3 00r1bqkb1rppp2ppp2n8np13N1PN2PP1P1PPPR1BQKB1R d4b5! d4c6 00r1bqkb1rppp2ppp2n8np13NP1N2PP2PPPPR1BQKB1R c1g5!! f1c4! f1e2 00r1bqkb1rppp2ppp2n8np14P1NP1PP2PP1PRNBQKB1R c1e3!!! f1e2! g2g3! f1c4 f2f4 00r1bqkb1rppp2ppp2n9p4n2P5NP1N2PP3PPPR1BQKB1R c1g5!! c3d5 00r1bqkb1rppp2ppp2p2n21P4PPP1BPPPRNBQK2R c1e3! c1f4 00r1bqkb1rppp2ppp5n5pn15P3PPPNBPPPR1BQK1NR f1d3 00r1bqkb1rppp4p2np1nN12Pp2Q8PPP2PPPRNB1KB1R c3d5 00r1bqkb1rpppp1ppp2n2n6p7P5N2N2PPPP1PPPR1BQKB1R f1b5! d2d4 00r1bqkb1rpppp1ppp2n2n6p7P6P1N2PPP2PPPRNBQKB1R d2d4! f1c4 00r1bqkb1rpppp2pp2n2n6N6Pp11PPP1BPPPRNBQK2R d2d4 d2d3 d1e2 00r1bqkbnr1p4p1p4n5p1p1pN2Pp4Q2P3PP1NBPPPR1B1K2R h1h3 00r1bqkbnr1pp2pppp1n8pP4P8P5P3PPPPRNBQKBNR c3e4 00r1bqkbnr2p2pppp1n6p1P4B2Pp7P3PP3PPPRNBQK1NR d1g4!! c3b5 00r1bqkbnr2p2pppp1p8p6PPp7P3PP2NPPPRNBQK2R d1g4! g1f3 00r1bqkbnr2p2pppp1p8p6PPp7P3PPQ2PPPRNB1K1NR d1g4! g1f3 00r1bqkbnrpp1n1ppp2p8p6PPp7P3PP1N1PPPRNBQKB1R f1d3!! f2f4 00r1bqkbnrpp1p1ppp2n7p8P9N2PP2PPPPRNBQKB1R d2d4! c4d5 00r1bqkbnrpp1ppppp2n7p17PN2PPPP1PPPRNBQKB1R d2d4! g1f3 e2e4 00r1bqkbnrpp1ppppp2n7p18NP1PPPPPP1PRNBQKB1R e2e4! d2d4 g2g3 00r1bqkbnrpp1ppppp2n7p19P1PPPPPPBPRNBQK1NR d2d4! g2g3 g1f3 00r1bqkbnrpp1ppppp2n7p7P10N2PP1PPPPPRNBQKB1R g1f3! g2g3 00r1bqkbnrpp1ppppp2n7p8P8P3PPP2PPPRNBQKBNR d2d4! c4d5 00r1bqkbnrpp1ppppp2n7p9P8N2PPPP1PPPRNBQKB1R g1f3! g2g3 00r1bqkbnrpp2pppp2n6Bpp16PN2PPPP1PPPRNBQK2R e2e3!!!! d1c2!! a2a3 g1f3 00r1bqkbnrpp2pppp2n7pp15P1N2PPPNPPPPR1BQKB1R e2e4 g1f3 g2g3 00r1bqkbnrpp2pppp2n7pp15P1NP1PPP1PP1PRNBQKB1R g1f3 g2g3 e2e4 00r1bqkbnrpp2pppp2n7pp15P2P1PPP1PPBPRNBQK1NR e2e4! g1f3 g2g3 00r1bqkbnrpp2pppp2n7pp17NP1PPPPPPBPRNBQK2R e2e4 g1f3 g2g3 00r1bqkbnrpp2pppp2n7pp6P9PN2PP1P1PPPRNBQKB1R d4d5! g1f3! e2e3 00r1bqkbnrpp2pppp2n7pp7P6P1P3PP3PPPRNBQKBNR e2e3! g1f3! c4d5 00r1bqkbnrpp2pppp2n7pp7P8P3PPP1BPPPRNBQK1NR g1f3!! c4d5 c1f4 00r1bqkbnrpp2pppp2n7pp7P8PN2PPP2PPPRNBQKB1R c1g5!!! g1f3 c4d5 c1f4 00r1bqkbnrpp2pppp2n7pp7P9NP1PPP1PP1PRNBQKB1R c1g5 c1f4 c4d5 g1f3 d1b3 00r1bqkbnrpp2pppp2n7pp8P6P4PPPN1PPPR1BQKBNR g1f3 e2e4 00r1bqkbnrpp2pppp2n8p7P12PPP1BPPPRNBQK1NR c1f4! g1f3 00r1bqkbnrpp2pppp2n8p7P6N5PP2PPPPR1BQKBNR g1f3! c1f4 00r1bqkbnrpp2pppp2n8p7P9N2PPP2PPPRNBQKB1R c1g5!! g1f3 00r1bqkbnrpp3ppp2n1p4Bpp6P9PN2PP1P1PPPRNBQK2R f1d3! g1f3 g1e2 00r1bqkbnrpp3ppp2n7ppp14P1NP1PPP1PPBPRNBQK2R g1f3 f1e2 f2f3 00r1bqkbnrpp3ppp2n7ppp14P2P1PPPNPPBPR1BQK1NR g1f3 00r1bqkbnrpp3ppp2n7ppp7P6P1N2PPPN1PPPR1BQKB1R g1f3! g1e2 00r1bqkbnrpp4p6n5p1p1p3Pp4QN1P3PP1NBPPPR1B1K2R a2a3 00r1bqkbnrpp4pp2p2n5p1p4PPp4QN1P3PP1N1PPPR1B1KB1R h2h4 g2g3 00r1bqkbnrppp1pppp2n8p7P1P10PPP1P1PPRNBQKBNR c1f4 c1g5 00r1bqkbnrppp1pppp2n8p7P6P5PP2PPPPRNBQKBNR e2e4 00r1bqkbnrppp1pppp2n8p7P9N2PPP1PPPPRNBQKB1R c1g5 00r1bqkbnrppp1pppp2n8p9P7N2PPPPP1PPRNBQKB1R c1g5 00r1bqkbnrppp1pppp2n8p9P8P1PPPPP2PRNBQKBNR e2e4 00r1bqkbnrppp2ppp11pn13P5PP1NPPPPR1BQKBNR f1c4! g1f3 00r1bqkbnrppp2ppp11pn6P10P1PPP1P2PRNBQKBNR e4g5 00r1bqkbnrppp2ppp2n6B1p7Pp4P2P3P1P2PPPRNBQK1NR d1g4! a2a3 00r1bqkbnrppp2ppp2n6B1p7Pp7P3PPPQ1PPPRNB1K1NR d1g4 a2a3 g1f3 c1d2 00r1bqkbnrppp2ppp2n6B1pp6P8P3PPP2PPPRNBQK1NR e4e5!!!!! g1e2 e4d5 00r1bqkbnrppp2ppp2n8p7Pp7P3PPPN1PPPRNBQKB1R f2f4!!! g1f3 00r1bqkbnrppp2ppp2n8pP17P1PPPPP2PRNBQKBNR c3e4 00r1bqkbnrppp2ppp2n8pp14P1NP1PPP1PP1PRNBQKB1R f1e2 g1f3 f2f4 c1e3 c1g5 00r1bqkbnrppp2ppp2n8pp14P2P1PPP1PPBPRNBQK1NR f1e2 c1e3 g1f3 f2f4 00r1bqkbnrppp2ppp2n8pp4P1P6P5P3PPPPRNBQKBNR a2a3 00r1bqkbnrppp2ppp2n8pp6P8PN2PPP2PPPRNBQKB1R c1g5!! e4e5! 00r1bqkbnrppp2ppp6n4p14P3B1PP2PPPPRN1QKBNR h2h4 g1f3 00r1bqkbnrppp3pp2np8N2Q3Pp11PPP2PPPRNB1KB1R g2g3 00r1bqkbnrppp4p2np2N8Q3Pp11PPP2PPPRNB1KB1R g1f3 00r1bqkbnrpppn1ppp11p7Pp7P3PPPN1PPPRNBQKB1R c2c3! f1d3 f2f4 00r1bqkbnrpppn1ppp11pp5PP8P3PP3PPPRNBQKBNR e4d5 g1f3 00r1bqkbnrpppp1ppp2n13Q15PPP1PPPPRNB1KBNR d2d4 g1f3 f1c4 00r1bqkbnrpppp1ppp2n9p14P1N2PPP1PPPPRNBQKB1R d2d4!! g1f3 f2f4 00r1bqkbnrpppp1ppp2n9p5B1P11PPPP1PPPRNBQK1NR f1c4! g1f3! f2f4! g2g3 00r1bqkbnrpppp1ppp2n9p5P7N5PP1PPPPPR1BQKBNR g2g3!! g1f3! g1e2 00r1bqkbnrpppp1ppp2n9p5P8P4PP2PPPPRNBQKBNR g2g3! f2f4! g1e2 g1f3 00r1bqkbnrpppp1ppp2n9p6P6P5PP2PPPPRNBQKBNR d2d4!! g1f3! d1f3 00r1bqkbnrpppp1ppp2n9p6P8P3PPP2PPPRNBQKBNR d2d4!! g1f3 00r1bqkbnrpppp1ppp2n9p6P9N2PPP1PPPPRNBQKB1R e4e5 e4d5 00r1bqkbnrpppp1ppp2n9p7P5N5PPPP1PPPR1BQKBNR f1c4! g1f3! g2g3 00r1bqkbnrpppp1ppp2n9p7P8N2PPPP1PPPRNBQKB1R f2f4 g2g3 f1c4 g1f3 00r2qk2rppp1bppp2n1b6np13NP1NP1PP2PPBPR1BQK2R o-o! d4b3 00r2qk2rppp2ppp1bn1bn6p7P3N1PB1N2PP2QPPPR1B1K2R f3d2 00r2qk2rppp2ppp2np1n4b1p5B1P1b3NP1N1PPPP2PP1R1BQK2R g5f6! g5e3 00r2qkb1rpp1bpppp2n6Bpn14N1PN2PP1P1PPPR1BQK2R d4c2 e2e3 00r2qkb1rpp2pppp2n2n4pp7P2b5PN1PPPP1BPP1RNBQK2R g5h4! g5f6 00r2qkb1rpp3ppp2n1b5p1p15N1P1PP1PPPBPR1BQK2R a1c1! d1d2 00r2qkb1rpp3ppp2n1pn4pp4Q2P2b3P1PN2PP1N1PPPR1B1KB1R f3d2!!! c4d5 00r2qkb1rppp3pp2n8npp8b1PQ1PPN3P3PPPRNB1KB1R d1d2! d4b3 00r2qkb1rpppn1ppp4pn5p6P3b2P2PN2P2PBPPPRNBQK2R f1d3!! c2c3 00r2qkbnrp3pppp2p7Pp3b14P1PPP1PP1PRNBQKB1R e2e3 g1f3 00r2qkbnrpp2pppp2n7pp7P2b5PN2PPP1BPPPRNBQK2R g1f3 e2e3 00r2qkbnrpp2pppp2n7pp7P2b5PN2PPPN1PPPR1BQKB1R e2e3! c4d5 00r2qkbnrpp2pppp2n7ppN6P2b7P1PPP1PP1PRNBQKB1R g5h4 c3e4 00r2qkbnrpp2pppp2n8p7P2b6N2PPP1BPPPRNBQK2R e2e3! g1f3 00r2qkbnrpp3ppp2n1p5pp7P2b3P1PN2PP1N1PPPR1BQKB1R g1f3!! c4d5 00r2qkbnrppp1pppp2n8p7P1Pb7P1PPP1P2PRNBQKBNR e2e3 h2h4 00r2qkbnrppp2ppp2n1p6p1b5P1P6PN2PPP3PPRNBQKB1R g1f3 f1d3 00r2qkbnrppp2ppp2n8p7Pp1b5P3PPPNBPPPRNBQK2R g5e7!! h2h4 00r3k2rpp1qbppp2n1b5p1p14PN1P1PP1BPPBPR2QK2R o-o 00r3k2rpppbqppp2n2n3Bbp4Q4B4P1PN2PP3PPPRN2K2R o-o-o! a2a3 f3e5 00r3kb1rpQpq2pp2n8npp8b1P2PPN3P3PPPRNB1KB1R a1b1! d4b3 00r3kb1rpp1b1ppp5n3BpQ5n10PN2PP3PPPRNB1K2R f3d4 00r3kb1rpp1q1ppp2n1b5p1p14PN1P1PP2PPBPR1BQK2R f1e2 00rn1qk2rpp1B1ppp5n5pp4b8N5PPPPNPPPR1BQK2R d1d2! b1d2 00rn1qkb1rp2bpp1p1p3np3pp12BP2PN2P1PPBPPPRN1QK2R f1g2! b1c3 00rn1qkb1rpp2pppp5n4pp7P2b5PN2PPP1BPPPRNBQK2R e2e3 b1c3 00rn1qkb1rppp1pppp5n5p7P2b5PN2PPP2PPPRNBQKB1R c2c4 e2e3 00rn1qkb1rppp2ppp4pn5p6P3b5PN2PP1PBPPPRNBQK2R b1d2! d4c5 00rn1qkb1rppp2ppp4pn5p7P2b5PN2PPP1BPPPRNBQK2R c2c4! b1d2 00rn1qkbnrppp1pppp11p3b5PP8PPPPPP3RNBQKBNR h4g3! e2e3 00rn1qkbnrppp1pppp11p9Pb7P1PPPPP2PRNBQKBNR b1c3 00rn1qkbnrppp1pppp11p9Pb8PPPPPP1P1RNBQKBNR g5h4 00rn1qkbnrppp1pppp11pN9b9PPPPPPPPRNBQKB1R g5f4! g5h4 00rn2k2rpp2npp3pb1q1p3pNB5P6N5PPP1QPPPR1B1K2R f3f4 00rn2k2rpp2npp3pb3p3pNq5P2P3N5PPP1QP1PR1B1K2R f4e3 00rn2k2rpp2npp3pbq2p3pN6P1PP3N5PPP1Q2PR1B1K2R f2f4 00rnb1k1nrpp3pp3pb1q1p3p7P6NB1N2PPP1QPPPR1B1K2R g1e2 00rnb1k1nrpp3ppp2pb1q5p7P6NB1N2PPP2PPPR1BQK2R h2h3 00rnb1k2rpp2npp3pb1q1p3pN6P6NB4PPP1QPPPR1B1K2R c1f4 00rnb1kb1rpp2qppp10p8Np3B1P5P1PPQPPPR3KB1R b2b3 b1d2 00rnb1kb1rppp1qp7n1p3p2p4P10B1PPP1NPPPRN1QKB1R f3e5 00rnb1kb1rppp1qpp6n1p3p7P3B8PPP1NPPPRN1QKB1R g2g4 00rnb1kbnrppp2ppp11qp13N5PPPP1PPPR1BQKBNR d4e3 d4a4 00rnb1kbnrppp2ppp4q7p13N2N2PPPP1PPPR1BQKB1R b1c3 c1d2 00rnbqk1nrpp1p1ppp2p7b1p5B1P8N2PPPP1PPPRNBQK2R d2d4 00rnbqk1nrpp1pppbp6p3p9P5P2N2PP1P1PPPRNBQKB1R d2d4! g1f3 00rnbqk1nrpp2ppbp6p3pp7P6P2NP1PP2PP1PRNBQKB1R c4d5! g1f3 00rnbqk1nrpp2ppbp6p3pp7P9NP1PPP1PPBPRNBQK2R g1f3 c4d5 00rnbqk1nrpp3ppp2p7bPp5B10N2PPPP1PPPRNBQK2R e4e5 00rnbqk1nrpp3ppp2pb7p7P6NB4PPP2PPPR1BQK1NR d1f3 g1e2 g1f3 00rnbqk1nrppp2ppp3p6b1p7P5N2N2PPPP1PPPR1BQKB1R b1c3 g1f3 00rnbqk1nrpppp1ppp10b1p5B1P11PPPP1PPPRNBQK1NR b1c3! g1f3 c2c3 00rnbqk1nrpppp1ppp10b1p7P8N2PPPP1PPPRNBQKB1R d2d3 g1f3 b1c3 00rnbqk2rpp1p1ppp2p2n4b1p5B1P5N2N2PPPP1PPPR1BQK2R d2d4!!! b2b4 d2d3 00rnbqk2rpp1p1ppp2p2n6p4bB1P5N5PPPPNPPPR1BQK2R o-o! d2d4 00rnbqk2rpp1pppbp5np3p10P7NP1PPPPP1BPRNBQK2R d2d4 o-o 00rnbqk2rpp2ppbp5np4p13N4P1PPP1PPBPRNBQK2R o-o b1c3 00rnbqk2rpp3ppp2p2n4bPp5B7N2N2PPPP1PPPR1BQK2R c3d4!!! e4e5! e1g1 00rnbqk2rpp3ppp2p2n5pp4b2P4BN2N2PPPP1PPPR1BQK2R o-o! d1e2 00rnbqk2rpp3ppp2pp1n4b1p5B1P5NP1N2PPP2PPPR1BQK2R b2b4 c4b3 o-o b1d2 00rnbqk2rpp3ppp5n3Bbpp13N2N2PPPP1PPPR1BQK2R b1c3 c1d2 00rnbqk2rppp1bppp5n5p2B4Np6PP3PPP2PPPRN1QKB1R e1g1! h2h3 00rnbqk2rppp2ppp3b7np11P1N1P4P1P1PPPR1BQKBNR d4c6! c1e3 00rnbqk2rppp2ppp3p1n4b1p5B1P5N2N2PPPP1PPPR1BQK2R b1c3! c2c3! o-o 00rnbqk2rppp2ppp5n4bPp13N2N2PPPP1PPPR1BQKB1R e1g1 e4e5 00rnbqk2rpppp1ppp11Pp4b14PPPP1PPPR1BQKBNR o-o 00rnbqk2rpppp1ppp5n2b3p7P3P1N2N3PPP1PPPR1BQKB1R e1g1!!! d2d4! d2d3 d1e2 00rnbqk2rpppp1ppp5n4b1p1B5P6P4PPP2PPPRN1QKBNR b1c3 00rnbqk2rpppp1ppp5n4b1p5B1P5N5PPPP1PPPR1BQK1NR c2c3!!!! b2b4!!! d2d3 00rnbqk2rpppp1ppp5n4b1p7P5N2N2PPPP1PPPR1BQKB1R d2d4 f3g5 d2d3 00rnbqk2rpppp1ppp5n4bNp7P11PPPP1PPPR1BQKBNR f3d4 00rnbqk2rpppp1ppp5n5Np4b2P11PPPP1PPPR1BQKBNR f3d4 00rnbqk2rpppp1ppp5n6p4b2P3P1N6PPP1PPPR1BQKBNR b5a4!!! b5c6 00rnbqk2rpppp1ppp5n6p4b2P5N2N2PPPP1PPPR1BQKB1R e1g1!! b1c3! d2d3 d1e2 00rnbqk2rpppp1ppp5n6p4b2PP4N5PPPP2PPR1BQKBNR b1c3! d2d3 00rnbqkb1r1p3ppp4pn2p1Pp5P6P8BP1PPPPRN1QKBNR a4b5 00rnbqkb1r1p3ppp4pn4Pp5P15BP1PPPPRN1QKBNR a1a8 00rnbqkb1r1p3pppp1p2n4Pp7Pp4QN1P3PP3PPPR1B1KBNR b1d2! g2g3 00rnbqkb1rpp1ppp1p5np3p8P8PN2PPP2PPPRNBQKB1R f1g2! b2b3 00rnbqkb1rpp1ppppp5n13P12PPP2PPPRNBQKBNR d2d4 00rnbqkb1rpp1ppppp5n4p10P7N2PPPPP1PPRNBQKB1R g2g3 d2d4 00rnbqkb1rpp1ppppp5n4p15P2N2PP1PPPPPRNBQKB1R d2d4 b1c3 00rnbqkb1rpp1ppppp5n4p17PN2PPPP1PPPRNBQKB1R d2d4! b1c3 g2g3 00rnbqkb1rpp1ppppp5n4p7P10N2PP1PPPPPRNBQKB1R b1c3 g2g3 00rnbqkb1rpp1ppppp5n4p8P6P5PP2PPPPRNBQKBNR d2d4!! e2e3 b2b3 00rnbqkb1rpp1ppppp5n4p8P8P3PPP2PPPRNBQKBNR d2d4 c4d5 g2g3 00rnbqkb1rpp2pp1p5np4p6PP6N5PP3PPPR1BQKBNR f1g2! b1c3 00rnbqkb1rpp2pppp5n3Bpp16PN2PPPP1PPPRNBQK2R c1d2! b1d2 00rnbqkb1rpp2pppp5n4Pp12P8PP1PPPPRNBQKBNR e2e3 00rnbqkb1rpp2pppp5n4Pp6P13PP2PPPPRNBQKBNR e2e3! d4d5 00rnbqkb1rpp2pppp5n4pp13P2PN2P1PP1PPPRNBQKB1R g2g3! b1c3 a2a3 e2e3 00rnbqkb1rpp2pppp5n4pp13P3N2PBPPPPPPRN1QKB1R b1c3 g2g3 00rnbqkb1rpp2pppp5n4pp15P1N2PPPNPPPPR1BQKB1R b1c3! g2g3 00rnbqkb1rpp2pppp5n4pp15P1NP1PPP1PP1PRNBQKB1R b1c3 g2g3 00rnbqkb1rpp2pppp5n4pp17NP1PPPPPPBPRNBQK2R g2g3! b1c3 00rnbqkb1rpp2pppp5n4pp6P9PN2PP1P1PPPRNBQKB1R d4d5! b1c3! e2e3 00rnbqkb1rpp2pppp5n4pp6PP8P3PP3PPPRNBQKBNR c4d5!! e2e3 00rnbqkb1rpp2pppp5n4pp7P6P2N2PP2PPPPRNBQKB1R b1c3!! e2e3 c4d5 00rnbqkb1rpp2pppp5n4pp7P8PN2PPP2PPPRNBQKB1R c1g5! b1c3! g2g3 c4d5 e2e3 00rnbqkb1rpp2pppp5n5p6PP12PP3PPPRNBQKBNR b1c3 g2g3 00rnbqkb1rpp3ppp2p2n5p6PPp4QN1P3PP3PPPR1B1KBNR f1e2 00rnbqkb1rpp3ppp4pn4Pp5P6P9P1PPPPRNBQKBNR a2a4 00rnbqkb1rpp3ppp4pn4pp6PP8PN2PP3PPPRNBQKB1R b1c3! c4d5 00rnbqkb1rpp3ppp5n4pp7P7B1N2PPP2PPPRNBQK2R b1c3 00rnbqkb1rpp3ppp5n5p2B4Q6N5PP2PPPPR3KBNR f1e2! b1c3 00rnbqkb1rppp1pp1p5np4p17NP1PPPPPPBPRNBQK2R f1g2 c2c4 00rnbqkb1rppp1pppp5n5p13P3N2P1PPPPPPRNBQKB1R c2c4 g2g3 c1f4 c1g5 00rnbqkb1rppp1pppp5n5p15P1N2PPP1PPPPRNBQKB1R c2c4! g2g3 c1f4 b1c3 00rnbqkb1rppp1pppp5n5p16PN2PPPP1PPPRNBQKB1R c2c4 c1g5 00rnbqkb1rppp1pppp5n5p17NP1PPPPPP1PRNBQKB1R c2c4! g2g3! c1f4! c1g5 b1c3 00rnbqkb1rppp1pppp5n5p6P10N2PP1PPPPPRNBQKB1R d4d5! c2c4! c2c3 00rnbqkb1rppp1pppp5n5p6P9P3PP1P1PPPRNBQKBNR e2e4!! c2c4 e2e3 c2c3 g2g3 00rnbqkb1rppp1pppp5n5p6PP12PP2PPPPRNBQKBNR c2c4! d4c5 00rnbqkb1rppp1pppp5n5p7P6P5PP2PPPPRNBQKBNR c2c4 00rnbqkb1rppp1pppp5n5p7P8P3PPP2PPPRNBQKBNR c2c4!!! g2g3! c1f4 00rnbqkb1rppp2ppp11np11P3P4P1P1PPPRNBQKBNR b1c3 f1d3 c2c4 00rnbqkb1rppp2ppp11np13N1P3PP1P1PPPR1BQKBNR b1c3! d4b5 00rnbqkb1rppp2ppp11np13N2N2PPPP1PPPR1BQKB1R b1c3 d4c6 00rnbqkb1rppp2ppp11np13N3P1PP1PPP1PR1BQKBNR c2c4! b1c3 00rnbqkb1rppp2ppp11np15PN2PP1P1PPPRNBQKB1R b1c3! f1d3 00rnbqkb1rppp2ppp11np5B7N5PPPP1PPPR1BQK1NR d4b3 c1e3 00rnbqkb1rppp2ppp5n5Pp13N5PPPP1PPPR1BQKBNR f3d4!! f1c4 00rnbqkb1rppp2ppp5n5Pp14P4PP2PPPPRNBQKBNR f3d4!!! d1d4 00rnbqkb1rppp2ppp5n5Pp14P4PPP2PPPRNBQKBNR f3d4! d1d4 00rnbqkb1rppp2ppp5n5p7P7B4PPP2PPPRNBQK1NR c2c4! b1c3! f1d3 00rnbqkb1rpppp1ppp5n6N14P4PPP2PPPRNBQKB1R d2d4! d2d3! b1c3 00rnbqkb1rpppp1ppp5n6p5P11P1PP1PPP1PRNBQKBNR c2c3 d2d4 b1c3 c2c4 00rnbqkb1rpppp1ppp5n6p5P7N5PP1PPPPPR1BQKBNR d2d4!!!!!! f1b5! c2c3 00rnbqkb1rpppp1ppp5n6p5P8P4PP2PPPPRNBQKBNR d2d4!!! f1b5 00rnbqkb1rpppp1ppp5n6p5P9P3PP1P1PPPRNBQKBNR d2d4! b1c3 c2c3 00rnbqkb1rpppp1ppp5n6p6P8P3PPP2PPPRNBQKBNR e4d5! b1c3 00rnbqkb1rpppp1ppp5n6p7P5N5PPPP1PPPR1BQKBNR f1b5!!!! f1c4!! d2d4!! b1c3!! c2c3 00rnbqkb1rpppp1ppp5n6p7P6P4PPP2PPPRNBQKBNR d2d4! f1c4 b1c3 00rnbqkb1rpppp1ppp5n6p7P8N2PPPP1PPPRNBQKB1R f3e5! d2d4! b1c3! f1c4 00rnbqkb1rpppp1ppp5n6p7P8P2PPPP2PPRNBQKBNR f3e5 f1c4 d2d4 00rnbqkb1rpppp1ppp5n6p7PP10PPPP2PPRNBQKBNR f3e5!!! f1c4 00rnbqkb1rpppppppp5n12P13PP1PPPPPRNBQKBNR e2e4! c2c4! g2g3 00rnbqkbnrpp1p1ppp10p1p6P6P5PP2PPPPRNBQKBNR e4d5! c4d5 00rnbqkbnrpp1p1ppp10p8P12PP2PPPPRNBQKBNR d2d4 c4d5 00rnbqkbnrpp1p1ppp10p8p6P2N2PP2PPPPRNBQKB1R d2d4 b1c3 00rnbqkbnrpp1p1ppp19p9N2PP2PPPPRNBQKB1R b1c3 d2d4 f1b5 00rnbqkbnrpp1p1ppp2p9p5P9P3PP1P1PPPRNBQKBNR d2d4!!! g1f3 00rnbqkbnrpp1ppp1p6p3p10P7N2PPPPP1PPRNBQKB1R f1g2 00rnbqkbnrpp1ppp1p6p3p15P2N2PP1PPPPPRNBQKB1R f1g2 g1f3 00rnbqkbnrpp1ppp1p6p3p17PN2PPPP1PPPRNBQKB1R f1g2 00rnbqkbnrpp1ppp1p6p3p7P11P1PP1PPP1PRNBQKBNR f1g2 b1c3 00rnbqkbnrpp1ppp1p6p3p7P7N5PP1PPPPPR1BQKBNR f1g2 b1c3 g1f3 00rnbqkbnrpp1ppp1p6p3p9P5N5PPPP1PPPR1BQKBNR f1g2 00rnbqkbnrpp1ppp1p6p3p9P8N2PPPP1PPPRNBQKB1R f1g2! b1c3 00rnbqkbnrpp1ppppp10p10P10PPPPP1PPRNBQKBNR b1c3 g1f3 g2g3 d2d4 00rnbqkbnrpp1ppppp10p14P6P1PPPPPPRNBQKBNR d2d4! b1c3 00rnbqkbnrpp1ppppp10p15P5PP1PPPPPRNBQKBNR b1c3 g1f3 d2d4 e2e4 00rnbqkbnrpp1ppppp10p16P4PPP1PPPPRNBQKBNR b1c3 d2d4 00rnbqkbnrpp1ppppp10p17P3PPPP1PPPRNBQKBNR d2d4! b1c3 g1f3 00rnbqkbnrpp1ppppp10p18N2PPPPPPPPRNBQKB1R b1c3! d2d4! g1f3 g2g3 00rnbqkbnrpp1ppppp10p19P1PPPPPP1PRNBQKBNR d2d4! b1c3 g1f3 g2g3 00rnbqkbnrpp1ppppp10p7P13PP1PPPPPRNBQKBNR g1f3! b1c3 g2g3 00rnbqkbnrpp1ppppp10p9P11PPPP1PPPRNBQKBNR b1c3!! g2g3 00rnbqkbnrpp2pppp10Pp20PPP1PPPPRNBQKBNR g1f3! e2e4! e2e3 00rnbqkbnrpp2pppp10p3N5p11PPPP1PPPRNBQKB1R c1f4! g1f3 00rnbqkbnrpp2pppp10pp14P2N2PP1PPPPPRNBQKB1R g1f3! b1c3 00rnbqkbnrpp2pppp10pp15P1N2PPP1PPPPRNBQKB1R b1c3 g1f3 00rnbqkbnrpp2pppp10pp16PN2PPPP1PPPRNBQKB1R b1c3 g1f3 00rnbqkbnrpp2pppp10pp17NP1PPPPPP1PRNBQKB1R b1c3 g1f3 g2g3 00rnbqkbnrpp2pppp10pp18P1PPPPPPBPRNBQK1NR b1c3 g1f3 00rnbqkbnrpp2pppp10pp7P6P5PP2PPPPRNBQKBNR g1f3!!!! b1c3!! c4d5 e2e3 00rnbqkbnrpp2pppp10pp7P8P3PPP2PPPRNBQKBNR b1c3!! g1f3! 00rnbqkbnrpp2pppp10pp7PP11PPP2PPPRNBQKBNR d4e5 00rnbqkbnrpp2pppp10pp8P6P4PPP2PPPRNBQKBNR b1c3 g1f3 00rnbqkbnrpp2pppp10pp8P8N2PPPP1PPPRNBQKB1R d4e5 00rnbqkbnrpp2pppp10pp9P6P3PPPP2PPRNBQKBNR g2g3 b1c3 00rnbqkbnrpp2pppp11p7N12PPP1PPPPRNBQKB1R g1f3 e2e4 00rnbqkbnrpp2pppp11p7P12PP2PPPPRNBQKBNR g1f3 b1c3 00rnbqkbnrpp2pppp11p7P12PPP2PPPRNBQKBNR b1c3! g1f3 00rnbqkbnrpp3ppp10Ppp16N2PPP1PPPPRNBQKB1R e4e5! b1c3 00rnbqkbnrpp3ppp2p8P7Np11PP1PPPPPRNBQKB1R g1f3!! c3d4! d1d4 00rnbqkbnrpp3ppp2p8pp5PP8P3PP3PPPRNBQKBNR e4d5! e4e5 00rnbqkbnrpp3ppp4p5pp7P6P1P3PP3PPPRNBQKBNR b1c3! g1f3 00rnbqkbnrpp3ppp4p5pp7P6P2N2PP2PPPPRNBQKB1R b1c3!! g1f3 00rnbqkbnrppp1pp1p6p4p9P6P3PPPP2PPRNBQKBNR f1g2 00rnbqkbnrppp1pppp11p13P6P1PPPPPPRNBQKBNR e2e4! c2c4! b1c3 c1f4 00rnbqkbnrppp1pppp11p14P5PP1PPPPPRNBQKBNR e2e4! c2c4! g1f3 b1c3 00rnbqkbnrppp1pppp11p15P4PPP1PPPPRNBQKBNR e2e4! c2c4! g1f3 g2g3 00rnbqkbnrppp1pppp11p16P3PPPP1PPPRNBQKBNR c2c4!! e2e4! g1f3 00rnbqkbnrppp1pppp11p17N2PPPPPPPPRNBQKB1R c2c4!!!! g1f3! c1g5! b1c3 00rnbqkbnrppp1pppp11p18P1PPPPPP1PRNBQKBNR e2e4!! c2c4! g1f3 b1c3 g2g3 00rnbqkbnrppp1pppp11p6P13PP1PPPPPRNBQKBNR d4d5!!! e2e4 c2c3 00rnbqkbnrppp1pppp11p7P12PPP1PPPPRNBQKBNR c2c4!!!!!!! g1f3 c1g5 00rnbqkbnrppp1pppp11p9P10PPPPP1PPRNBQKBNR g2g3!! g1f3 b1c3 c1g5 e2e4 c2c4 00rnbqkbnrppp2ppp11Pp19PP1PPPPPRNBQKBNR g1f3 00rnbqkbnrppp2ppp11Pp19PPPP1PPPRNBQKBNR d1d4! g1f3 00rnbqkbnrppp2ppp11p6PPp7P3PP3PPPRNBQKBNR c2c3 d4c5 00rnbqkbnrppp2ppp11p7N12PPP1PPPPRNBQKB1R c2c4! g1f3 00rnbqkbnrppp2ppp11p7Np6P4PPP1PPPPRNBQKB1R g1f3! c2c4 f1c4 00rnbqkbnrppp2ppp11p7P12PP2PPPPRNBQKBNR c2c4!! f1d3! 00rnbqkbnrppp2ppp11p7P12PPP2PPPRNBQKBNR g1f3! f1d3 00rnbqkbnrppp2ppp11p7PpB4P5PP2PPPPRN1QKBNR b1c3!! g1f3 h2h4 00rnbqkbnrppp2ppp11pp12P6PBPPPPPPRN1QKBNR f1d3 b1c3 00rnbqkbnrppp2ppp11pp14P2P1PPP1PP1PRNBQKBNR b1c3!! c2c4! f2f4 g1f3 00rnbqkbnrppp2ppp11pp17P1PPPPPPBPRNBQK1NR g1f3! b1c3! c2c4 00rnbqkbnrppp2ppp11pp5P9P3PP1P1PPPRNBQKBNR d4d5 g1f3 c2c3 00rnbqkbnrppp2ppp11pp6P6N5PPP1PPPPR1BQKBNR e4e5 e4d5 b1c3 00rnbqkbnrppp2ppp11pp6P6P5PP2PPPPRNBQKBNR b1c3!! b1d2! e4d5! e4e5 00rnbqkbnrppp2ppp11pp6P8P3PPP2PPPRNBQKBNR b1c3!!! b1d2!! e4e5! e4d5! 00rnbqkbnrpppp1ppp12p11P8PPPPPPPRNBQKBNR d2d4! b1c3 g1f3 b2b3 00rnbqkbnrpppp1ppp12p12P6P1PPPPPPRNBQKBNR d2d4! b1c3 00rnbqkbnrpppp1ppp12p13N5PPPPPPPPR1BQKBNR g1f3 b1c3 d2d4 00rnbqkbnrpppp1ppp12p13P5PP1PPPPPRNBQKBNR d2d4!!!! b1c3 d2d3 c2c4 00rnbqkbnrpppp1ppp12p14P4PPP1PPPPRNBQKBNR d2d4!!!! b1c3 f2f4 00rnbqkbnrpppp1ppp12p15P3PPPP1PPPRNBQKBNR d2d4!!!!!! b1c3 d1e2 d2d3 00rnbqkbnrpppp1ppp12p16N2PPPPPPPPRNBQKB1R e4e5!!! b1c3 00rnbqkbnrpppp1ppp12p17P1PPPPPP1PRNBQKBNR d2d4!!! b1c3 00rnbqkbnrpppp1ppp12p18PPPPPPPP1RNBQKBNR d2d4! b1c3! b2b3 g1f3 g2g3 00rnbqkbnrpppp1ppp12p5P13PP1PPPPPRNBQKBNR g1f3!!! c2c3 b1c3 d2d4 00rnbqkbnrpppp1ppp12p6P12PPP1PPPPRNBQKBNR e4d5 00rnbqkbnrpppp1ppp12p7P11PPPP1PPPRNBQKBNR g1f3!!! b1c3! f1c4 f2f4 d2d4 00rnbqkbnrpppp1ppp19Q12PPP1PPPPRNB1KBNR b1c3!! g1f3 00rnbqkbnrpppp1ppp19p9N2PPP1PPPPRNBQKB1R d2d4! c2c4 f1c4 00rnbqkbnrppppp1pp13p15N2PPPPPPPPRNBQKB1R g2g3 00rnbqkbnrppppp1pp13p5P12PPP1PPPPRNBQKBNR g2g3 00rnbqkbnrpppppppp32PPPPPPPPRNBQKBNR e2e4!!!!! d2d4!!! c2c4 g1f3 01r1bqkbn2p4p1pN3n1r3p1p1p3Pp4Q2P3PP1NBPPPR1B1K2R a1b1 021nbqkb1r1p3ppp4pn4Pp5P16P1PPPPBN1QKBNR b2b3 021r2kb1rp1pq2ppQ1n8npp8b1P2PPN3P3PPPRNB1KB1R f4f5! f1e2 021rbqk1nrp2pppbp2n3p2pp9P3P1NP2P2PP2PBPR1BQK1NR a2a4 031rNqkbn2p4p1p4n1r3p1p1p3Pp4Q2P3PP1NBPPPR1B1K2R d1c1 031rq1kbn2p4p1p4n1r3p1p1p3Pp2P1Q2P3PP1NBPP1R1B1K2R f1d3 03r1b2rk1pp2ppbp2n3p4B13N4P1PPP1PP1PR1B1K2R c3b5 03r1b2rk1pp2ppbp6p10n2B4N4P1PPP1PP1PR1B1K2R c1f4 03r1b2rk1ppp1bppp2n2n5p2q4Pp3BPP1P3P2QNPPPRN2KB1R f1d1 03r1bq1rk1pp1n1ppp5n3BbP7Np5N5PPP2PPPR1BQK2R d2b3! c4b5 03r1bq1rk1pp2ppbp2n2np4N13N4P1PPP1PPBPR1BQK2R f3d4 03r1bq1rk1pp2ppbp2n3p4Q13N4P1PPP1PPBPR1B1K2R d1d4 03r1bq1rk1pp3ppp2nb6pnp11PP1PPN3B3PPPRN1QKB1R f2f4! d1e2 03r1bq1rk1pp4pp2nb6pnpp10PP1PPN3B2BPPPRN1QK2R g1h1 d1e2 03r1br2k1ppp1bppp2n2n5p2q4PpN2BPP1P3P2Q1PPPRN2KB1R a2a3 03r4rk1pp2ppbp6p6B3n7N4P1PPP1PP1PR1B1K2R g3f4 03rn1q1rk1ppp2ppp3b1n5p10b2P2PN2PB1PBPPPRN1QK2R c2c4 b1d2 03rnbq1rk1pp1p1ppp2p2n6p4b2P4BN5PPPPNPPPR1BQK2R d2d4! b1a3 03rnbq1rk1pp1pppbp5np3p7P6P3NP1PB1PPP1PRN1QKB1R b2b3!!! d2d4 b1c3 03rnbq1rk1pp2ppbp5np4p13NN3P1PPP1PPBPR1BQK2R b1c3 e2e3 03rnbq1rk1ppp2ppp1b3n6N4P1Pp3P1N1B5P2PPPR2QKB1R c2c3! b1d2 03rnbq1rk1ppp2ppp5n2b2Pp11P1N2N3PPPBPPPR1BQK2R f1e1! e4e5 03rnbq1rk1ppp2ppp5n5pp1B5P3P1P2P3PP3PPR2QKBNR c2c3! d4e5 03rnbq1rk1pppp1ppp10bNN5B1n11PPPP1PPPR1BQK2R c2c3!! c4f7! d1h5 d2d3 03rnbq1rk1pppp1ppp5n6p4bB1P5N2Q2PPPP1PPPR1B1K1NR d2d3 c2c3 03rnbqr1k1pp3ppp3b1n4pp2B4P6N2N2PPP1BPPPR2QK2R c4d5 b1c3 0Cr1b1k1nr2p2pppp1pb7p2q3PP8PR2PP2N1PPRNBQ2K1 c1g5 g4h5 0Cr1b1k1nr2p2pppp1pb7p2q3PPp7P3PP1NNPPPR1BQ1RK1 g1f3 0Cr1b1k1nr2p2pppp1pb7p6PPp2q2N1P2PPP2NPP1R1BQ1RK1 c1h6 0Cr1b1k2r2p1bppp2p2n1qp1Pp4P2PpP3N2P4P2N1PPR1BQ1RK1 h1g1 0Cr1b1k2r2p2ppp2pb1n1qp1Pp7PpP3N2P3PP2N1PPR1BQ1RK1 d3e2 0Cr1b1k2r2p2pppp1pb1n1q3p6PPpP3N2P3PP2N1PPR1BQ1RK1 a3a4 0Cr1b1k2r2p2pppp1pb1n5p2q3PPpP6P3PP1NN1PPR1BQ1RK1 g4h3 0Cr1b1k2r2p2pppp1pb1n5p6PPp2q2N1P1N1PPQ2PPPR1B2RK1 o-o c1e3 0Cr1b1kbnr1p2ppppp1q7pp13P2PN2P1PP1PPPRNBQ1RK1 c1g5! g1f3 0Cr1b1kbnr2p2pppp1p8p2q3PPp7P3PP2NPPPRNBQ1RK1 f1d3!! g1f3 0Cr1bqk1nrpp2bppp2n7ppp14P1NP1PPP1PPBPRNBQ1RK1 c1g5! g1f3 0Cr1bqk2r5pppppnbpn4pp6PP4P1NBPN3P3PPPR1BQ1RK1 o-o 0Cr1bqk2rpp2bppp2n2n4ppp1N5P5NP1PP1PPP3BPR1BQ1RK1 o-o! h2h3 0Cr1bqk2rpp2bppp2n2n4ppp7P6P1NP1PPP2PBPRNBQ1RK1 c1e3! o-o 0Cr1bqkb1r1p1p1pppp1n1pn4p9P5N2N2PPPPBPPPR1BQ1RK1 b2b4! d1c2 0Cr1bqkb1r3p1pppp1n1pn3pp9P5NP1N2PPP1BPPPR1BQ1RK1 f1e2 d1c2 0Cr2qk1nrpp3ppp2nbp6p7P2b3P2N2PP2BPPPRNBQ1RK1 d1c2! g1f3 0Cr2qk2rpp2bppp2n2n4ppp1N5P1b4P1PP1PPP3BPRNBQ1RK1 g5c1 g5h4 0Cr2qkb1rpp2pppp2n2n5p7P2b6N2PPP1BPPPRNBQ1RK1 e2e3 d1c2 0Cr2qkb1rpp3ppp2n1pn4pp3b3P5P2PN1PP1P1BPP1RNBQ1RK1 f1e2! c4d5 f1d3 h4f6 a1c1 0Cr2qkb1rpp3ppp2n1pn4pp7P2b5PN1PPPP1BPP1RNBQ1RK1 g5h4! g5f6 0Cr2qkb1rpp3ppp2n1pn4pp7P2b5PN2PPPNBPPPR1BQ1RK1 a1c1! d1c2 0Cr2qkbnrpp3ppp2n1p6p7P2b6N2PPP1BPPPRNBQ1RK1 f1d3! g1f3 0Cr3k1nr2p2pp1p1p1b5Pp2qp3Pp5N1P1P1PP4PPR1B1QRK1 h4h5 0Cr3k1nr2p2pppp1p1b5Pp2q4Pp7P1P1PP4PPRNB1QRK1 h2h4 0Cr3k1nr2p2pppp1p8p6PPpP4N4qPP3P2R1BQ1RK1 g1h3 0Cr3k1nr2p2pppp1pb7p6PPp2q2N1P2PPP2NP2R1BQ1RK1 h5h6 0Cr3k1nr2p2pppp1pb7p6PPpN4N1P2qPP3P2R1BQ1RK1 d3f5 0Cr3k2r1p2npppp1qbp5p7P3b2Q1PPN2P2N1PPPR1B2RK1 a1d1 0Cr3k2r2p2pppp1p4n3p6PPpP4N2P1qPP6R1BQ1RK1 h6g6 0Cr3k2r2p2pppp1p4n3p6PPpP4N2Pq1PP6R1BQ1R1K e1c1 0Cr3kb1rpppq2pp2n1bp5np13NP1NP1PP2PPBPR1BQ1RK1 f1c4! e1c1 0Cr3kbnr1p2ppppp1q7pp10b2P2PN2PBPP1PPPRN1Q1RK1 f2f3! e2e3 0Crnbqk2rpp2ppbp5np3pp7P9NP1PPP1PPBPRNBQ1RK1 o-o c4d5 0Crnbqk2rppp1ppbp5np4p17NP1PPPPPPBPRNBQ1RK1 e1g1 c2c4 0Dr1b1k1r3p1bppp2p2n1qp1Pp4P2PpP3N2P4P2N1PPR1B1QRK1 g2g4 0E1r2k2rpb1qbppp1pn2n4p1p3Q7P1NP1NP2P1BPPBPR4RK1 a2a3 0E3rk2r1p2npppp1qbp5p7P3b2Q1PPN2P2N1PPP1RB2RK1 d1d2 0F2k4r2p2pppp1p3Pn3p6PPP5N3q1PP6R1BQ1R1K h2g3 0F2k4r2p2pppp1pr3n3p1P4PPP5N3q1PP6R1BQ1R1K d3g3 0F2kr3r2p2pppp1p4n3p6PPPP4N3q1PP6R1BQ1R1K d1d3 0F3r1rk1ppq1n1pp2nbpp5p1b5P6P1B3PP1NBPPP2RQRNK1 a2a3 0F3r1rk1ppq1n1pp2nbpp5p7P2b3P1B3PP1NBPPPR2QRNK1 g5f4 0Fr1bq1rk1pp1pppbp2n2np2Bp1P13N2N2PPPP1PPPR1BQ1RK1 f3g5! f3e1 0Fr1bq1rk1pp1pppbp2n2np2Bp9P5N2N2PPPP1PPPR1BQR1K1 d2d3 c3d5 0Fr1bq1rk1pp2bppp2n2n4ppp7P5NP1NP1PPP2PBPR1BQ1RK1 d4d5 c1e3 0Fr1bq1rk1pp3ppp2nb6pnp11P2PPN3P2BPPPRNBQ1RK1 c1e3! d1e2 0Fr1bq1rk1ppp1bppp2n8np14P1NP1PP2PPBPRNBQ1RK1 c1g5!! c1e3! g1h1 d4b3 0Fr2q1rk1pp2bpppn1n1b5p1p11PPNPPN3B2BPPPR2Q1RK1 d1b3!! a1c1! f2f3! 0Fr2q1rk1pp3ppp2nbb5pnp11P2PPN3P1NBPPPR1BQ1RK1 f2f4 0Fr2q1rk1ppp1b1pp1nn1b7pp12NPBNP1PP2PPBPR1Q2RK1 g1h1! e2f3 0Fr2q1rk1ppp2ppp2nb5B9P2b3P2N2P4PPPR1BQ1RK1 d1f3!!! c3e2 c3a4 0Fr2q1rk1ppp2ppp2nb5B9P2b5BN2P1P2PPPR2Q1RK1 d1f3!!! c3e2 c3b5 0Fr4rk1pp1qbppp2n1b5p1p14PN1P1PP1BPPBPR2Q1RK1 a1d1 0Frnbq1rk1p1p1ppbp1p3np4p9P4N1PN2PPPPB1PPR1BQ1RK1 c1b2 0Frnbq1rk1pp1pppbp5np3p8P8PN2PPP1BPPPRNBQ1RK1 d2d4! b2b3! d1c2 0Frnbq1rk1pp3ppp2pp1n4b1p7P5NP1N2PPP1BPPPR1BQ1RK1 b1d2 c4b3 0Frnbq1rk1ppp1ppbp5np4p9P6PN2PPPPB1PPRNBQ1RK1 c2c4! b2b3 0Frnbq1rk1ppp1ppbp5np4p9P7NP1PPPPP1BPRNBQ1RK1 b2b3 c2c4 10r1b1k1nr2p2pppp1p8p5bPPpP1q4P3PP3QPPRNB1K1NR c8d7 10r1b1k1nrpppp1ppp1bn17P2q3N4PPPP1PPPRNBQKB1R f8e7! b8c6 10r1b1k2r2p2pp3pq1n5p5pPPp2p1P2P2PP1QNNPP1R3K2R o-o 10r1b1kb1rpp1nqppp10p8Np3B1P5P1PPQPPPR3KB1R d5b6 d5b4 g7g6 10r1b1kb1rppp1q1pp2n2n5p2B4Pp1N9PPP2PPPRN1QKB1R g5f3 g5e6 10r1b1kb1rppppq1pp2n2n6N1B4Pp11PPP2PPPRN1QKB1R e4g5 e4c3 10r1b1kbnr2p2pppp1p8p2q3PPp7P3PP2NPPPRNBQK2R o-o!! d8c7! b8c6 10r1b1kbnr2p2pppp1p8p2q3PPp7P3PPQ2PPPRNB1K1NR f7f5 g8e7 10r1b1kbnr2p2pppp1p8p6PPpP1q4P3PPQ3PPRNB1K1NR g7g6 c7f7 10r1b1kbnr2pq1ppp2p5p2p4Q1PPp7P3PP2NPPPRNB1K2R b8c6 10r1b1kbnrppq1pppp2n6Bpp16PN2PPPP1PPPRNBQK2R e8g8 d7d5 c7c5 10r1bqk1nrpp1pppbp2n3p3p8P8PN2PPP2PPPRNBQKB1R f8e7 10r1bqk1nrpp2ppbp2n3p3pp7P8PN2PPP1BPPPRNBQK2R o-o 10r1bqk1nrpp3ppp2nbp4Bpp6P9PN2PP1P1PPPRNBQK2R b8c6! o-o 10r1bqk1nrpp3ppp2nbp5pp7P6P1PN2PP3PPPRNBQKB1R b8d7 10r1bqk1nrppp2pbp2np2p5p5P7N3P1PP1PPPBPR1BQK1NR d7d6! e7e6 10r1bqk1nrppp2ppp2np6b1p5B1P8N2PPPP1PPPRNBQK2R d7d6! b8c6 10r1bqk1nrpppn1ppp11p5bPP12PP3PPPRNBQKBNR c8d7! b8c6 10r1bqk1nrpppp1ppp2n7b1p5B1P11PPPP1PPPRNBQK1NR g8f6! d7d6 10r1bqk1nrpppp1ppp2n7b1p7P8N2PPPP1PPPRNBQKB1R b8c6 f6e4 f8c5 10r1bqk2r2p2pp3p2n2p2p5bPPp2pBP2P2PP1Q1NPP1RN2K2R a6b5 10r1bqk2r2p2pp3p2n5p5pPPp2p1P2P2PP1Q1NPP1RN2K2R b8d7 10r1bqk2rpp1n1ppp2pb1n5p6PPp5N1P3PP1N1PPPR1BQKB1R d8b6 c5d4 10r1bqk2rpp1n1ppp3b1n5p7Pp5N1P3PP1N1PPPR1BQKB1R d7b6 10r1bqk2rpp2nppp2nbp4Bpp6P7N1PN2PP1P1PPPR1BQK2R c5d4 d7d5 10r1bqk2rppp1bppp2n8np11P3P4PQP1PPPRNB1KBNR g8f6 b8c6 b7b5 10r1bqk2rppp1bppp2n8np13NP1N2PP2PPPPR1BQKB1R e7e5 g7g6 10r1bqk2rppp2pbp2n3p4np11P3PN3PQP1PPPRNB1KB1R b8c6! f8e7 10r1bqk2rppp2ppp1bn2n6p7P5PB1N2PP3PPPRNBQK2R b8a6 10r1bqk2rppp2ppp2nb5B2p13P2N2P1PP1PPPR1BQK2R d7d5! o-o 10r1bqk2rpppp1ppp12P4b8n5PPP3PPR1BQKBNR d8g5 10r1bqk2rpppp1ppp2n2n4b1N7P11PPPP1PPPRNBQKB1R e4f6 e4c3 10r1bqk2rpppp1ppp2n2n4b1p5B1P5N5PPPP1PPPR1BQK1NR d7d6 g8f6 10r1bqk2rpppp1ppp2n2n4b1p5B1P8N2PPPP1PPPRNBQK2R b8c6 d7d6 10r1bqk2rpppp1ppp2n2n6p4b2P5N2N2PPPP1PPPR1BQKB1R f8b4!! c6d4 10r1bqkb1r1p2ppppp1n2n5p7p5P2PN2PBP2PPPRN1QKB1R f6d5! e6d5 10r1bqkb1r1pp2ppp2n5p2np11P2P1N3P2PPPPRNBQKB1R b8c6 e7e6 e7e5 10r1bqkb1r2p2pp1p1p2n5p3p2PPp7P3PPQ1NPPPRNB1K2R b7b6 10r1bqkb1r2p2pp1p1p2n5p6PPp2p1P2P3P1Q1NPPPRNB1K2R h7h6 10r1bqkb1r2p2pp3p2n2p2p6PPp2p1P2P2PP1Q1NPP1RNB1K2R c8a6 10r1bqkb1r2p2pppp1p2n5p6PPp7P3PP2NPPPRNBQK2R d8a5!! c8d7! d8c7 b7b6 b8c6 10r1bqkb1r2p2pppp1p2n5p6PPp7P3PPQ2PPPRNB1K1NR g8e7 c8d7 10r1bqkb1rpp1npppp5n3Bpp16PN2PPPP1PPPRNBQK2R d7d5 b7b6 o-o 10r1bqkb1rpp1p1ppp2n1pn4p9P5N2N2PPPP1PPPR1BQKB1R f8e7 f8b4 10r1bqkb1rpp1ppp1p2n2np3p7P9PN2PP1P1PPPRNBQKB1R b7b6! d7d5 10r1bqkb1rpp1ppp1p2n2np3p9P5N2N2PPPP1PPPR1BQKB1R f8b4! d7d5 10r1bqkb1rpp1ppp1p6p2Bp1P2n3n6N2N2PPPP1PPPR1BQK2R o-o b4c5 10r1bqkb1rpp1ppppp2n2n13p6P2N2PP2PPPPRNBQKB1R c6d5 10r1bqkb1rpp1ppppp2n2n4p7P10N2PP1PPPPPRNBQKB1R e7e6! b8c6 10r1bqkb1rpp1ppppp2n2n4p9P5N5PPPP1PPPR1BQKBNR g8f6!! f7f5 g7g6 10r1bqkb1rpp2pppp2n2n3Bpp16PN2PPPP1PPPRNBQK2R o-o c7c5 b7b6 d7d5 10r1bqkb1rpp2pppp2n2n4pp17NP1PPPPPPBPRNBQK2R d7d5 o-o 10r1bqkb1rpp2pppp2n2n4pp6P9PN2PP1P1PPPRNBQKB1R c5d4! d7d5 10r1bqkb1rpp2pppp2n2n4pp7P6P1P3PP3PPPRNBQKBNR g8f6!!! d5c4 10r1bqkb1rpp2pppp2n2n4pp7P8PN2PPP2PPPRNBQKB1R f8e7! f8b4! c7c5! d5c4 c7c6 b8d7 10r1bqkb1rpp2pppp2n2n5p7P9N2PPP2PPPRNBQKB1R c7c6!! f8b4! f8e7 10r1bqkb1rpp2pppp2np1n4p9P5N2N2PPPP1PPPR1BQKB1R d7d6 g7g6 d7d5 f8b4 10r1bqkb1rpp3ppp2n1pn3Bpp6P9PN2PP1P1PPPRNBQK2R o-o! d7d5 10r1bqkb1rpp3ppp2n1pn4pp7P6P1P3PP1N1PPPR1BQKBNR g8f6! f7f5 10r1bqkb1rpp3ppp2n1pn5p6Pp6N1PN2PP3PPPR1BQKB1R e6d5! f6d5 10r1bqkb1rpp3ppp2n7pnp11P3PN3P1P1PPPRNBQKB1R f8b4!! d8c7 10r1bqkb1rppp2p1p2n3p4np11P2P1N3P2PPPPRNBQKB1R e7e5! e7e6 10r1bqkb1rppp2p1p2n3p4np11P3P4PQP1PPPRNB1KBNR g8f6!! f8b4 10r1bqkb1rppp2ppp2n2n5pp7P5N2N2PPPP1PPPR1BQKB1R e5d4! f8b4 10r1bqkb1rppp2ppp2n8np13N1P3PP1P1PPPR1BQKBNR g8f6 a7a6 d8c7 10r1bqkb1rppp2ppp2n8np13N2N2PP1PPPPPR1BQKB1R e7e6 d7d6 e7e5 10r1bqkb1rppp2ppp2n8np14P1N2PP2PPPPRNBQKB1R a7a6!!! b8c6! g7g6! e7e6 10r1bqkb1rppp2ppp2n8np15PN2PP1P1PPPRNBQKB1R b8c6 d7d6 10r1bqkb1rppp3pp2n2n5pN6Pp11PPP1BPPPRNBQK2R e8g8! e7b4 10r1bqkb1rppp3pp2n8npp10P2P1N3P2PPPPRNBQKB1R d8c7!! e7e5! e7e6 10r1bqkb1rpppn1ppp3p1n6p6P8PN2PPP2PPPRNBQKB1R f8e7 b7b6 c7c5 b8c6 10r1bqkb1rpppn1ppp5n5p6PP12PP3PPPRNBQKBNR b8c6!! g8f6! 10r1bqkb1rpppn1ppp5n5p6Pp8PN2PP3PPPRNBQKB1R e6d5! f6d5 10r1bqkb1rpppn1ppp5n5p7Pp7P3PPPN1PPPRNBQKB1R c7c5 10r1bqkb1rpppn1ppp5n5pp5PP8P3PP3PPPRNBQKBNR g8f6 c5d4 b8c6 10r1bqkb1rpppp1ppp2n15P1n8N2PP2PPPPRNBQKB1R e7e6 b8d7 10r1bqkb1rpppp1ppp2n2n12P1p6P1N2PP2PPPPRNBQKB1R d6e5 10r1bqkb1rpppp1ppp2n2n6p5P7N5PP1PPPPPR1BQKBNR e7e6! g8f6! g7g6 d7d6 10r1bqkb1rpppp2pp2n2n6N6Pp11PPP2PPPRNBQKB1R f8e7! f8c5 c8g4 10r1bqkb1rppppnp1p2n3p5p5P9PN2PP1P1PPPRNBQKB1R d7d5 10r1bqkb1rppppnppp2n9p5P10N2PP1PPPPPRNBQKB1R e7e6 d7d5 d7d6 b8c6 10r1bqkb1rppppnppp2n9p5P7N5PP1PPPPPR1BQKBNR e7e6! g8f6 g7g6 10r1bqkb1rppppnppp2n9p5P9P3PP1P1PPPRNBQKBNR g8f6! b8c6 10r1bqkb1rpppppppp2n2n23N2PPPPPPPPRNBQKB1R d7d5! c7c5 10r1bqkbnr1p4p1p4n5p1p1p3Pp4QN1P3PP1NBPPPR1B1K2R c6a5 10r1bqkbnr2p2pp1p1p8p3p2PPp7P3PP2NPPPRNBQK2R d8c7 10r1bqkbnr2p2ppp2p5p2p6PPp7P3PP2NPPPRNBQK2R d8a5! b8c6 10r1bqkbnr2p2pppp1p8p6PPp7P3PP3PPPRNBQK1NR g8e7!! b8c6 d8c7 10r1bqkbnr4ppppp1p7pp16PN2PPPP1PPPRNBQK2R c7c5! d7d6 o-o 10r1bqkbnrp4ppp2p7pp16PQ2PPP2PPPRNB1KB1R c7c5!! e6e5 10r1bqkbnrpp1p1ppp2n7p1p15PN2PPPP1PPPRNBQKB1R d7d5! c7c5 10r1bqkbnrpp1ppp1p2n3p3p9P8N2PPPP1PPPRNBQKB1R f8b4!!! d7d5!! c7c6 g7g6 10r1bqkbnrpp1ppppp2n7p17P3PPPP1PPPRNBQKBNR d7d5 g8f6 10r1bqkbnrpp1ppppp2n7p18N2PPPPPPPPRNBQKB1R e7e6! e7e5! c7c5 g7g6 c7c6 10r1bqkbnrpp1ppppp2n7p9P11PPPP1PPPRNBQKBNR g8f6!! b8c6 10r1bqkbnrpp2p1pp2n2p3Bpp16PN2PPPP1PPPRNBQK2R d7d5 10r1bqkbnrpp2pppp2n7pp16PN2PPPP1PPPRNBQKB1R f8b4!! d7d5 c7c5 10r1bqkbnrpp2pppp2n7pp17NP1PPPPPP1PRNBQKB1R f8g7 d7d5 10r1bqkbnrpp2pppp2n7pp7P8P3PPP2PPPRNBQKBNR g8f6!!! c7c6! f8e7 c7c5 10r1bqkbnrpp2pppp2n8p7P12PP2PPPPRNBQKBNR b8c6 g8f6 10r1bqkbnrpp2pppp2n8p7p6P2N2PP2PPPPRNBQKB1R c6d5 10r1bqkbnrpp3ppp2n1p5pp7P6P1P3PP3PPPRNBQKBNR g8f6 b8d7 10r1bqkbnrpp3ppp2n6B1p7p9N2PPP2PPPRNBQK2R f6d5 10r1bqkbnrpp3ppp2n7pp7P9N2PPP2PPPRNBQKB1R f8e7 f8b4 10r1bqkbnrpp4p6n5p1p1p3Pp4QN1P3PP1N1PPPR1B1KB1R f8e7 f8b4 10r1bqkbnrppp1pppp2n8p17N2PPPPPPPPRNBQKB1R d7d5!!! e7e6 10r1bqkbnrppp1pppp2n8p7P12PPP1PPPPRNBQKBNR c8f5!! e7e6! g8f6! 10r1bqkbnrppp2ppp2n6B1p7Pp7P3PPP2PPPRNBQK1NR c7c5 g8e7 10r1bqkbnrppp2ppp2n8pp6P8P3PPP2PPPRNBQKBNR f8b4!! g8f6! 10r1bqkbnrpppn1ppp11p6Pp8P3PP3PPPRNBQKBNR e6d5!! d8d5 10r1bqkbnrpppn1ppp11pp6P8P3PPP2PPPRNBQKBNR c7c5! g8f6 10r1bqkbnrpppp1ppp2n9p15P3PPPP1PPPRNBQKBNR d7d5! c7c5 10r1bqkbnrpppp1ppp2n9p16N2PPPPPPPPRNBQKB1R d7d5 e7e5 10r1bqkbnrpppp1ppp2n9p5P13PP1PPPPPRNBQKBNR b8c6! e7e6! d7d6 10r1bqkbnrpppp1ppp2n9p7P11PPPP1PPPRNBQKBNR g8f6!! b8c6! f8c5 10r1bqkbnrpppp2pp2n9pp4P9P3PP1P1PPPRNBQKBNR d7d5 10r1bqkbnrpppppppp2n29PPPPPPPPRNBQKBNR d7d5! e7e5 c7c5 10r1bqkbnrppppppppn31PPPPPPPPRNBQKBNR c7c5 d7d5 e7e5 10r2qk2rppp1b1pp2n1b6npp10P2PPN3PQ2PPPRNB1KB1R b7b5 10r2qk2rppp1bppp2n1b6np11P2PPN3P3PPPRNBQKB1R d8c7! f8e7 10r2qk2rppp2ppp1bn1bn6p7P3N1PB1N2PP3PPPR1BQK2R d8e7 10r2qk2rppp2ppp2n1b5bnp13NPPN2PP3PPPR1BQKB1R f8e7! a7a6 10r2qk2rppp2ppp2np1n4b1p5B1P1b3NP1N2PPP2PPPR1BQK2R h7h6! c8e6 c6a5 10r2qk2rppp3pp2n1bb5npp3P6P2PPN4Q2PPPRNB1KB1R c8b7 10r2qk2rpppn1ppp1bn1b7p7P3N1PB1N2PP2QPPPR1B1K2R d6c5 10r2qkb1rpp1bpp1p2n2np2Bpp14N1PN2PPPPQPPPR1B1K2R o-o b4c3 10r2qkb1rpp2pppp2n2n4pp7P2b3P1PN2PP3PPPRNBQKB1R d5c4!! h7h6! b8d7 10r2qkb1rpp2pppp2n2n5p7P2b6N2PPP1BPPPRNBQK2R e8g8 c7c6 10r2qkb1rppp2pp3n8p1n5Pp7P3PPPNQPPPRNB1K2R a7a6 b8c6 g7g6 10r2qkb1rppp3pp2n1b6npp10P2PPN3P3PPPRNBQKB1R b7b5 10r2qkbnrpp1b1ppp2n6B1p7N12PPP2PPPRNBQK2R o-o 10r2qkbnrpp2pppp2n7pp7P2b5PN2PPP2PPPRNBQKB1R f8e7!!! b8d7 10r2qkbnrpp2pppp2n8p1b5P12PPP1BPPPRNBQK1NR g8f6! c7c6 10r2qkbnrpp3ppp2n1p5pp7P2b5PN2PPPN1PPPR1BQKB1R c7c6!!! f8e7 10r2qkbnrppp1pppp2n8p7P2b6N2PPP1PPPPRNBQKB1R e7e6 c8f5 b8d7 10r2qkbnrppp2pp3n8p3p3Pp1b5P3PPPNBPPPRNBQK2R e7g5! a7a6 c7c5 10r2qkbnrppp2ppp2n8pp6P2b5PN2PPP2PPPRNBQKB1R f8e7! d5e4 10r3k2rppp3pp2nbbq5npp3P6P2PPN3B3PPPRN1QKB1R b8d7 10r3kb1rppp1q1pp2n1bn6Np4Bp1B10PPP1QPPPRN2K2R c5e3! e4c3 10r3kb1rppp3pp2n1bq5npp3P6P2PPN7PPPRNBQKB1R c8b7 10r3kb1rpppq2pp2n1bp5np4P6P2PPN7PPPRNBQKB1R c8b7 b8d7 10rn1qk2rpbpp1ppp1p2pn11bPPP8P2PP4PPRNBQKBNR b8c6 10rn1qk2rppb2ppp2ppbn6p1B3P7NP1NP1PP2PP1PR2QKB1R f8g7 10rn1qk2rppp2ppp3b1n5p10b2P2PN2P2P1PPPRNBQKB1R c8b7 10rn1qkb1rpbpp1ppp1p2pn12PP9P2PP2P1PPRNBQKBNR e7e5 10rn1qkb1rpbppp1pp1p3n7p4PP9N2PP2PPPPRNBQKB1R b8c6 g7g6 10rn1qkb1rpbpppppp1p3n12PP12PP2PPPPRNBQKBNR f7f6 10rn1qkb1rpp1bpp1p5np2Bpp16PN2PPPPQPPPRNB1K2R b8c6! o-o 10rn1qkb1rpp1bpppp5n3Bpp16PN2PPPP1PPPRNBQK2R d8e7!! c7c5 10rn1qkb1rpp2pppp5n4pp7P2b5PN2PPP2PPPRNBQKB1R f8e7! f8b4! b8d7 10rn1qkb1rppp1pppp5n5p10b5PN2PPPP1PPPRNBQKB1R c7c5 d7d5 h7h6 10rn1qkb1rppp1pppp5n5p1b5P9N2PPP1PPPPRNBQKB1R c7c5! c7c6 c8f5 e7e6 10rn1qkb1rppp2ppp4pn5p6P3b5PN2PP1P1PPPRNBQKB1R f8e7! c5d4 d8b6 10rn1qkbnrpbppp1pp1p11p5P9N2PPP1PPPPRNBQKB1R g7g6 c7c5 10rn1qkbnrppp1pppp11p10b6N2PPPPPPPPRNBQKB1R f6e4! d7d5 e7e6 10rn1qkbnrppp1pppp11pNb18PPPPPPPPRNBQKB1R c7c5 d7d5 10rn2k2rpp2n1p3pbq2p3pNp5P1PP3N5PPP1Q2PR1B1K2R h7h6 10rn2k2rpp2npp3pb1q1p3pNb5P6NB4PPP1QPPPR1B1K2R d6f4 10rn2k2rpp2npp3pb3p3pNq5P6N5PPP1QPPPR1B1K2R g7g5 10rn2k2rpp2npp3pbq2p3pN6P2P3N5PPP1QP1PR1B1K2R f7f5 10rn2kb1rppp1qppp3p1n16b4P1N2PPP1QPPPRNB1KB1R b8d7 e7e2 10rn2kb1rppp1qppp4b6n6N1p5N5PPPP1PPPR1BQKB1R c6d4 10rn2kb1rppp1qppp4bn5p2B4P12PPP1QPPPRN2KBNR b8c6 10rnb1k1nrpp3pp3pb1q1p3p7P6NB1N2PPP2PPPR1BQK2R d8e7 o-o 10rnb1k1nrpp3ppp2pb1q5p7P6NB4PPP2PPPR1BQK1NR g8f6!! c8e6 g8e7 c6e7 10rnb1k2rpp2npp3pb1q1p3p7P6NB1N2PPP1QPPPR1B1K2R f6e4 10rnb1kb1rpp1p1ppp2p2n2q3p6PP5N5PPP2PPPR1BQKBNR g8f6 f7f6 10rnb1kb1rppp1qppp5n5p2B4P12PPP2PPPRN1QKBNR d8e7 10rnb1kb1rppp2ppp5n5qp14P4PP2PPPPRNBQKBNR a7a6 c8d7 b8c6 10rnbqk1nrpp1p1ppp2p7b1p5B1P11PPPP1PPPRNBQK1NR g8f6 10rnbqk1nrpp1pppbp6p3p9P8N2PPPP1PPPRNBQKB1R c7c6!! d7d5! 10rnbqk1nrpp2ppbp6p3pp7P8PN2PPP2PPPRNBQKB1R d5c4! f8e7 10rnbqk1nrpp3ppp2P7b1p19PPPP1PPPRNBQKBNR c3b2 10rnbqk1nrpp3ppp2p7bP6B1p8N2PPPP1PPPRNBQK2R d7d5 10rnbqk1nrpp3ppp2p7bpp5B1P8N2PPPP1PPPRNBQK2R e5d4 10rnbqk1nrppp2ppp3b7p7P12PPP2PPPRNBQKBNR b8c6! f8d6 g8f6 10rnbqk1nrppp2ppp3p6b1p7P8N2PPPP1PPPRNBQKB1R c7c6!! b8c6! f8c5 f8e7 10rnbqk1nrpppp1ppp10b1p7P11PPPP1PPPRNBQKBNR g8f6! b8c6 f8c5 10rnbqk1nrpppp1ppp12p4b10P3PPPP1PPPRNBQKBNR c7c6 a7a6 d8g5 10rnbqk1nrppppppbp14p4P12PPP1PPPPRNBQKBNR e7e5 10rnbqk1nrppppppbp6p11P13PP1PPPPPRNBQKBNR b8c6 g8f6 d7d5 10rnbqk1nrppppppbp6p12P12PPP1PPPPRNBQKBNR c7c5 c7c6 e7e5 g8f6 10rnbqk1nrppppppbp6p13P11PPPP1PPPRNBQKBNR d7d5 g8f6 10rnbqk1nrppppppbp6p22N2PPPPPPPPRNBQKB1R e7e5! d7d5 c7c5 10rnbqk2rp2p1ppp2p2n3Bb1p7P5N5PPPP1PPPR1BQK1NR b4e7 b4a5 10rnbqk2rpp1p1ppp2p2n6p4bB1P5N5PPPP1PPPR1BQK1NR g8f6! g8e7 f7f5 10rnbqk2rpp1p1ppp2pb1n6p5P8P1N2PP2PPPPRNBQKB1R b8c6 10rnbqk2rpp2bppp2p2n5p6PPp5N1P3PP1B1PPPR2QKBNR g8e7!!! f7f6 10rnbqk2rpp2ppbp5np3Pp16PN2PPP2PPPRNBQKB1R c7c5! f8e7! a7a6 b8c6 10rnbqk2rpp2ppbp5np3pp7P8PN2PPP1BPPPRNBQK2R o-o d5c4 10rnbqk2rppb2ppp2pp1n6p1B3P7NP1N2PP2PPPPR2QKB1R e7e6 g7g6 10rnbqk2rppbp1ppp2p2n6p5P7NP1N2PP2PPPPR1BQKB1R c8g4 10rnbqk2rppp1ppbp3p1np11P7N3P1PP1PPP1PR1BQKBNR f8g7 10rnbqk2rppp1ppbp5np4p13P3N2PBPPPPPPRN1QKB1R c7c5 e7e6 10rnbqk2rppp1ppbp5np4p6P9PN2PP1P1PPPRNBQKB1R d7d5! c5d4! b8c6 10rnbqk2rppp1ppbp5np4p6PP9N2PP2PPPPRNBQKB1R e7e6! b8c6 10rnbqk2rppp1ppbp5np4p7P8PN2PPP2PPPRNBQKB1R c7c5! f8e7 10rnbqk2rppp2ppp3b1n12BPp5N1P3PP3PPPR1BQK1NR f7f6! g8e7 10rnbqk2rppp2ppp3b1n5p7P9N2PPP2PPPRNBQKB1R f8d6!! f8e7 10rnbqk2rppp2ppp3b1n5pN6P12PPP2PPPRNBQKB1R f8d6! f8e7! b8c6 10rnbqk2rppp2ppp3b7np11P3P4P1P1PPPRNBQKBNR g8f6 b8c6 10rnbqk2rppp2ppp3b7np15PN2PP1P1PPPRNBQKB1R a7a6 b8c6 10rnbqk2rppp2ppp3p1n4b1p7P5N2N2PPPP1PPPR1BQKB1R f8c5 f8e7 10rnbqk2rppp2ppp3p1n4b1p7P5P2N2PP1P1PPPRNBQKB1R d7d5 f8e7 10rnbqk2rpppp1ppp10b1p7P1n3N2N2PPPP1PPPR1BQKB1R d7d5!! f8c5 10rnbqk2rpppp1ppp10b8pP1n3N2N2PPP2PPPR1BQKB1R c6a5!!! c6d4 b7b5 10rnbqk2rpppp1ppp5n2b3p7P3P1N6PPP1PPPR1BQKBNR g8f6!! d7d6 10rnbqk2rpppp1ppp5n4b1p7P5N5PPPP1PPPR1BQKBNR g8f6 f8c5 10rnbqk2rpppp1ppp5n4b1p7P8N2PPPP1PPPRNBQKB1R b8c6 f6e4 10rnbqk2rpppp1ppp5n6p4b2P5N5PPPP1PPPR1BQKBNR a7a6!!!!! g8f6!!!! f7f5 g7g6 f8c5 10rnbqk2rpppp1ppp5n6p4bP7N5PP1PPPPPR1BQKBNR g7g6! e7e6 d8b6 d7d6 10rnbqk2rpppp1ppp5n6p4bP8P4PP2PPPPRNBQKBNR c8d7! b8c6 10rnbqk2rpppp1ppp5n6p5P8P4PP1bPPPPRN1QKBNR d8d7! b8d7 10rnbqk2rppppppbp5np11P10N2PP1PPPPPRNBQKB1R b8c6 d7d5 g7g6 10rnbqk2rppppppbp5np11P7N5PP1PPPPPR1BQKBNR g7g6! d7d5 g8f6 10rnbqk2rppppppbp5np11PP12PP2PPPPRNBQKBNR b8c6! g8f6 10rnbqk2rppppppbp5np12P8P3PPP2PPPRNBQKBNR c7c5 g8f6 10rnbqk2rppppppbp5np12P9N2PPP1PPPPRNBQKB1R c7c5 c7c6 e7e6 g7g6 c8f5 10rnbqk2rppppppbp5np21PN2PPPP1PPPRNBQKB1R d7d5 c7c5 10rnbqkb1r1p3pppp1p2n5p6PPp4QN1P3PP3PPPR1B1KBNR a7a5! c8d7 c5c4 10rnbqkb1rp1ppp1pp1p3n7p4PP12PP2PPPPRNBQKBNR g8f6 b8c6 10rnbqkb1rp1pppppp1p3n12P13PP1PPPPPRNBQKBNR d7d5! b8c6 10rnbqkb1rp1pppppp1p3n13P12PPP1PPPPRNBQKBNR c7c5 g8f6 c8g4 c8f5 10rnbqkb1rp1pppppp1p3n23N2PPPPPPPPRNBQKB1R d7d5 10rnbqkb1rp3pp1p1p3np3pp12BP2PN2P1PP1PPPRN1QKB1R f8b4! a6b7 10rnbqkb1rpp1p1ppp2p2n12Pp8P3PP3PPPRNBQKBNR d8d5 e6d5 10rnbqkb1rpp1p1ppp2p2n6p5P9P3PP1P1PPPRNBQKBNR d7d5! g8f6 10rnbqkb1rpp1p1ppp2p2n6p7P5N5PPPP1PPPR1BQKBNR g8f6! d7d5 10rnbqkb1rpp1ppppp5n13p8P3PPP2PPPRNBQKBNR e6d5 10rnbqkb1rpp1ppppp5n4p17P3PPPP1PPPRNBQKBNR g8f6 d7d5 10rnbqkb1rpp1ppppp5n4p18N2PPPPPPPPRNBQKB1R e7e6 c7c6 c7c5 g7g6 10rnbqkb1rpp1ppppp5n4p7P13PP1PPPPPRNBQKBNR g8f6 b8c6 e7e6 10rnbqkb1rpp1ppppp5n4p8P12PPP1PPPPRNBQKBNR c7c6! e7e6! d5c4 10rnbqkb1rpp2pp1p5np3pp13P2PN2P1PP1PPPRNBQKB1R c8b7 c8a6! 10rnbqkb1rpp2pppp2p2n5p7P8P3PPP2PPPRNBQKBNR c7c5 g8f6 10rnbqkb1rpp2pppp5n4pp13P3N2P1PPPPPPRNBQKB1R c8b7 e7e6 10rnbqkb1rpp2pppp5n4pp16PN2PPPP1PPPRNBQKB1R b7b6! d7d5 f8b4 c7c5 10rnbqkb1rpp2pppp5n4pp6P9P3PP1P1PPPRNBQKBNR c5d4!!! d7d5 g8f6 10rnbqkb1rpp2pppp5n4pp7P6P5PP2PPPPRNBQKBNR g8f6!! e7e6 10rnbqkb1rpp2pppp5n4pp7P8P3PPP2PPPRNBQKBNR g8f6!! c7c6 c7c5 10rnbqkb1rpp2pppp5n4pp7P9N2PPP1PPPPRNBQKB1R c7c6! e7e6! d5c4 10rnbqkb1rpp2pppp5n5p7P12PP2PPPPRNBQKBNR g8f6 b8c6 10rnbqkb1rpp2pppp5n5p7P12PPP2PPPRNBQKBNR g8f6 c7c6 10rnbqkb1rpp3ppp2p1pn5p6PP8P3PP3PPPRNBQKBNR b8c6 g8f6 10rnbqkb1rpp3ppp2p2n5Pp13N5PP1PPPPPR1BQKBNR d7d5! g8f6! d4c3 10rnbqkb1rpp3ppp2p2n5Pp13N5PPPP1PPPR1BQKBNR d7d5! d4d3 10rnbqkb1rpp3ppp2p2n5p6PPp5N1P3PP3PPPR1BQKBNR c8d7 d8b6 10rnbqkb1rpp3ppp4pn4pp7P6P1P3PP3PPPRNBQKBNR g8f6! b8d7! f7f5 10rnbqkb1rppp1nppp11pp5P9P3PP1P1PPPRNBQKBNR d7d5! c5d4 10rnbqkb1rppp1pp1p5np4p16PN2PPPP1PPPRNBQKB1R b7b5!! b7b6! c7c5! d7d5 10rnbqkb1rppp1pp1p5np4p7P8P3PPP2PPPRNBQKBNR g8f6 c7c5 10rnbqkb1rppp1pppp5n5p16P3PPPP1PPPRNBQKBNR g8f6! c7c5 d7d5 10rnbqkb1rppp1pppp5n5p17N2PPPPPPPPRNBQKB1R b7b6 d7d5 e7e6 g7g6 c7c5 10rnbqkb1rppp1pppp5n5p7P12PPP1PPPPRNBQKBNR g8f6! e7e6 c7c5 c7c6 10rnbqkb1rppp2p1p3p1np5p5P7N1P3PP1P1PPPR1BQKBNR d7d5 g8e7 g7g6 10rnbqkb1rppp2ppp11np13N5PP1PPPPPR1BQKBNR g8f6!!! e7e6! g7g6 10rnbqkb1rppp2ppp11np15P3PP1P1PPPRNBQKBNR g8f6! a7a6 b8c6 10rnbqkb1rppp2ppp12p4n8N1P3PP1P1PPPR1BQKBNR d7d6 g8f6 10rnbqkb1rppp2ppp3p1n6p5P9P3PP1P1PPPRNBQKBNR b8c6 d7d5 10rnbqkb1rppp2ppp4pn5p6P9P3PP1P1PPPRNBQKBNR g8f6 d7d5 10rnbqkb1rppp2ppp4pn5p7P9N2PPP1PPPPRNBQKB1R e7e6 c7c5 c8f5 g7g6 10rnbqkb1rppp2ppp5n5Pp19PP1PPPPPRNBQKBNR b8c6 d7d6 e7e6 a7a6 10rnbqkb1rppp2ppp5n5Pp19PPPP1PPPRNBQKBNR b8c6 f8c5 g8f6 10rnbqkb1rppp2ppp5n5p15P1N2PPP2PPPRNBQKB1R d6d5!! f8e7 10rnbqkb1rppp2ppp5n5p7P12PPP2PPPRNBQKBNR g8f6! c8g4 10rnbqkb1rppp2ppp5n5pp7P8N2PPPP1PPPRNBQKB1R e5d4 f6e4 10rnbqkb1rpppp1ppp5n6p15P3PPPP1PPPRNBQKBNR d7d5 c7c5 10rnbqkb1rpppp1ppp5n6p5P13PP1PPPPPRNBQKBNR d7d6 e7e6 b8c6 10rnbqkb1rpppp1ppp5n6p7P11PPPP1PPPRNBQKBNR b8c6!!! g8f6 10rnbqkb1rpppp2pp4pn7p4PP12PP2PPPPRNBQKBNR g8f6 b8c6 g7g6 10rnbqkb1rpppp2pp4pn7p5P10P1PPP1PP1PRNBQKBNR f8g7 10rnbqkb1rpppp2pp4pn7p5P9N2PPP1PPPPRNBQKB1R g7g6 c7c5 c8g4 10rnbqkb1rpppp2pp5n6pP18PPPP1PPPRNBQKBNR d7d6 d7d5 g7g5 10rnbqkb1rppppnppp12p5P13PP1PPPPPRNBQKBNR e7e6! g8f6 d7d6 b8c6 10rnbqkb1rppppp1pp5n7p15N2PPPPPPPPRNBQKB1R d7d5 c7c5 g7g6 10rnbqkb1rppppp1pp5n7p4P13PP1PPPPPRNBQKBNR b8c6 g8f6 d7d5 g7g6 10rnbqkb1rppppp1pp5n7p5P12PPP1PPPPRNBQKBNR g8f6 g7g6 10rnbqkb1rpppppp1p5np11P13PP1PPPPPRNBQKBNR b8c6! g8f6 d7d5 g7g6 10rnbqkb1rpppppp1p5np12P12PPP1PPPPRNBQKBNR g8f6 c7c5 c7c6 g7g6 10rnbqkb1rpppppp1p5np21P3PPPP1PPPRNBQKBNR c7c5 d7d5 g8f6 10rnbqkb1rpppppp1p5np22N2PPPPPPPPRNBQKB1R d7d5 g7g6 c7c5 e7e6 b7b5 10rnbqkb1rpppppppp5n26PPPPPPPPRNBQKBNR d7d5 g8f6 c7c5 e7e6 f7f5 g7g6 10rnbqkb1rpppppppp7n24PPPPPPPPRNBQKBNR d7d5! e7e5 c7c5 10rnbqkbnr1ppppppp8p23PPPPPPPPRNBQKBNR e7e5! d7d5! c7c5 10rnbqkbnr1pppppppp31PPPPPPPPRNBQKBNR c7c5! g7g6! d7d5 e7e5 b7b6 10rnbqkbnrp1pp1ppp1p10p5P13PP1PPPPPRNBQKBNR b8c6! d7d6 b7b6 e7e6 g8f6 10rnbqkbnrp1ppp1pp1p11p5P12PPP1PPPPRNBQKBNR c8g4 g8f6 c7c5 10rnbqkbnrp1pppppp1p30PPPPPPPPRNBQKBNR d7d5! e7e5 c7c5 10rnbqkbnrp1pppppp9p22PPPPPPPPRNBQKBNR d7d5 e7e5 g8f6 10rnbqkbnrpp1p1ppp2p9p5P13PP1PPPPPRNBQKBNR d7d5! g8f6! e7e6 10rnbqkbnrpp1ppp1p6p3p17P3PPPP1PPPRNBQKBNR g8f6 d7d5 10rnbqkbnrpp1ppp1p6p3p18N2PPPPPPPPRNBQKB1R c7c6 e7e6 e7e5 g7g6 c7c5 10rnbqkbnrpp1ppp1p6p3p9P11PPPP1PPPRNBQKBNR g8f6!! b8c6! d7d6 c7c6 10rnbqkbnrpp1ppppp10p21PPPPPPPPRNBQKBNR e7e5!! g8f6! e7e6 c7c6 c7c5 f7f5 g7g6 10rnbqkbnrpp1ppppp2p29PPPPPPPPRNBQKBNR c7c5 d7d5! e7e5 g8f6 10rnbqkbnrpp2pp1p6p3pp16PN2PPPP1PPPRNBQKB1R f8b4 d7d5 c7c5 10rnbqkbnrpp2pp1p6p3pp7P8P3PPP2PPPRNBQKBNR g8f6 10rnbqkbnrpp2pppp10p7Pp9N2PP1PPPPPRNBQKB1R b7b5! e7e6 g7g6 10rnbqkbnrpp2pppp10pp16P3PPPP1PPPRNBQKBNR g8f6! d7d5 10rnbqkbnrpp2pppp10pp17N2PPPPPPPPRNBQKB1R e7e6!!!! g7g6!! e7e5! c7c5 c7c6 10rnbqkbnrpp2pppp10pp7P12PPP1PPPPRNBQKBNR c7c6!!! e7e6!! d5c4 b8c6 10rnbqkbnrpp2pppp2p8p7P12PPP1PPPPRNBQKBNR g8f6! e7e6 10rnbqkbnrpp3ppp2p8Pp19PP1PPPPPRNBQKBNR d7d5! g8f6! d4c3! d4d3 10rnbqkbnrpp3ppp2p8Pp19PPPP1PPPRNBQKBNR d7d5 d4c3 d4d3 10rnbqkbnrpp3ppp2p8p6PPp7P3PP3PPPRNBQKBNR b8c6! d8b6 c8d7 10rnbqkbnrpp3ppp2p8p6PQ12PP2PPPPRNB1KBNR e7e6 b8c6 g8f6 10rnbqkbnrpp3ppp2p8p6Pp8P3PP3PPPRNBQKBNR e6d5! d8d5 10rnbqkbnrpp3ppp4p5pp7P6P5PP2PPPPRNBQKBNR g8f6! e7e6 10rnbqkbnrppp1pp1p6p4p16P3PPPP1PPPRNBQKBNR g8f6 d7d5 c7c5 10rnbqkbnrppp1pppp11p20PPPPPPPPRNBQKBNR g8f6!! d7d5!! e7e6 f7f5 10rnbqkbnrppp1pppp3p28PPPPPPPPRNBQKBNR e7e5! d7d5! c7c5 10rnbqkbnrppp2p1p3p2p5p5P9P3PP1P1PPPRNBQKBNR d7d5 b8c6 10rnbqkbnrppp2ppp11p7Pp7P3PPP2PPPRNBQKBNR c7c5 10rnbqkbnrppp2ppp11pp15P3PPPP1PPPRNBQKBNR d7d5 10rnbqkbnrppp2ppp11pp6P2Q5P3PPP2PPPRNB1KBNR g5d8 10rnbqkbnrppp2ppp11pp7P11PPPP1PPPRNBQKBNR e5d4 10rnbqkbnrppp2ppp18pPp7P3PP3PPPRNBQKBNR b8c6 10rnbqkbnrppp2ppp3p8p5P13PP1PPPPPRNBQKBNR b8c6! e7e6! g8f6 10rnbqkbnrppp2ppp3p8p7P11PPPP1PPPRNBQKBNR b8c6 g8f6 f8c5 d7d5 10rnbqkbnrppp2ppp4p6p17N2PPPPPPPPRNBQKB1R c7c5 d7d5 g7g6 b7b6 10rnbqkbnrppp2ppp4p6p7P12PPP1PPPPRNBQKBNR g8f6! c7c5 c8f5 e7e6 10rnbqkbnrpppp1p1p6p5p5P13PP1PPPPPRNBQKBNR d7d5 b8c6 10rnbqkbnrpppp1ppp12p19PPPPPPPPRNBQKBNR e7e5!! c7c5!! e7e6 c7c6 g8f6 d7d5 10rnbqkbnrpppp1ppp12p9Q5P3PPPP1PPPRNB1KBNR g5d8 g5a5 d7d5 10rnbqkbnrpppp1ppp4p27PPPPPPPPRNBQKBNR e7e5 d7d5 c7c5 10rnbqkbnrpppp2pp12pp4P13PP1PPPPPRNBQKBNR e7e6 b8c6 g8f6 10rnbqkbnrpppp2pp12pp6P11PPPP1PPPRNBQKBNR d7d5 e5f4 f8c5 d8h4 10rnbqkbnrpppp2pp4p8p5P12PPP1PPPPRNBQKBNR g8f6 g7g6 10rnbqkbnrppppp1pp13p18PPPPPPPPRNBQKBNR g8f6 d7d5 c7c5 10rnbqkbnrppppp1pp5p26PPPPPPPPRNBQKBNR e7e5! d7d5! c7c5 10rnbqkbnrpppppp1p14p17PPPPPPPPRNBQKBNR d7d5! e7e5! c7c5 10rnbqkbnrpppppp1p6p25PPPPPPPPRNBQKBNR d7d5! e7e5! g8f6 c7c5 g7g6 10rnbqkbnrppppppp16p16PPPPPPPPRNBQKBNR e7e5! d7d5! c7c5 10rnbqkbnrppppppp8p24PPPPPPPPRNBQKBNR d7d5 e7e5 c7c5 b7b6 g7g6 11r1bqkbn2p4p1p4n1r3p1p1pN2Pp4Q2P3PP1NBPPPR1B1K2R a5b3 131rbqkbn2p4p1pN3n1r3p1p1p3Pp4Q2P3PP1NBPPPR1B1K2R b3c1 131rq1kbn2p4p1p4n1r3p1p1p3Pp4Q2P3PP1NBPPPR1B1K2R h7h5 132kr1b1rpppq1ppp2n1b6np11P1NPPN1P1P3PP1R1BQKB1R c8d7 c6d4 f8e7 13r1b1r1k1pppnqpb4p1np5p2p2PP5PN1P1PPP3NPB1R1BQK2R a7a5 13r1b1r1k1pppnqpb4p1np8pP1PPp4PN1P1PP4NPB1R1BQK2R g6g5 13r1b1r1k1pppnqpbp3p1np5p5PP5PN1PN2PB2BPPPR2QK2R d8c7 13r1b1r1k2p1nqpbp2pp1np1p3p3P1PP5PN1PN3BQ1BPPPR3K2R b7a6 13r1b1r1k2p1nqpbp2pp1np1p7P1PPp3BPN1PN4Q1BPPPR3K2R f6d7 13r1b1rnk2p2qpbp2pp1np1p7P1PPp3BPN1P5QNBPPPR3K2R e8c8 13r1bq1rk1pp3ppp2B2n4b1N6p6N5PPPP1PPPR1BQK2R c6e5 c3f6 13r1bq1rk1pp4pp2nb6pnpp10PP1PPN3B3PPPRN1QKB1R f8e7 13r1bqr1k1pppn1pb4p1np5p2p2PP5PN1P1P1P3NPBPR1BQK2R h7h6 13rn1q1rk1pp3ppp3b1n4pp10b2P2PN2PB1PBPPPRN1QK2R o-o 13rn1q1rk1ppp2ppp3b1n5p10b2P2PN2PB1P1PPPRN1QKB1R f8e7 13rnbq1rk1pp2bppp2p15PPp7P3PP1B2PPR2QKBNR d8c7! d7c6 13rnbq1rk1pp3ppp1bp2n6N4P1Pp3P1N1B5P2PPPR2QKB1R f8e7! e4c5 f8c5 13rnbq1rk1pp3ppp2p2n4bPp5B7N2N2PPPP1PPPR1BQK2R f6e4! d4c3 13rnbq1rk1pp3ppp2p2n5pp1B5P3P1P2P3PP3PPR2QKBNR f8d6! e5d4 13rnbq1rk1pp3ppp3b6pnp11P2PPN3P3PPPRNBQKB1R f8e7! b7b6 g7g6 13rnbq1rk1ppp1ppbp3p1np11PPP5N5PP3PPPR1BQKBNR f8e7 g8f6 f7f6 13rnbq1rk1ppp1ppbp5np4p6PP8PN2PP3PPPRNBQKB1R b8c6!! c5d4 d8b6 13rnbq1rk1ppp2ppp3b7np11P3PN3P1P1PPPRNBQKB1R d7d6 d8c7 13rnbq1rk1ppp2ppp5n5pN4b2P5N5PPPP1PPPR1BQKB1R f8e7! e4d6 13rnbq1rk1pppp1ppp10bNN2Q2B13PPPP2PPR1B1K2n d7d5 13rnbq1rk1pppp1ppp10bNN5B13PPPP1nPPR1BQK2R d8h4 13rnbq1rk1pppp1ppp10bNp5B1n8N2PPPP1PPPR1BQK2R f6e4 d7d6 13rnbq1rk1pppp1ppp12p4bB1n5N2N2PPPP1PPPR1BQK2R c6d4 c6e5 13rnbq1rk1pppp1ppp5n2b3p7P3P1N2N3PPP1PPPR1BQKB1R f8e7 f6e4 13rnbq1rk1pppp1ppp5n6p4b2P5N2N2PPPP1PPPR1BQKB1R f6e4!! f8c5 13rnbq1rk1pppp1ppp5n6p4bB1P5N5PPPP1PPPR1BQK1NR c6d4!! g8f6 13rnbq1rk1pppp1ppp5n6p7P3P1P6PP2PPPR1BQKBNR f7f6! c8g4 d8d6 13rnbq1rk1ppppppbp5np11PP6N5PP2PPPPR1BQKBNR e7e5 e7e6 g8f6 13rnbq1rk1ppppppbp5np11PP8P3PP3PPPRNBQKBNR b8c6 g8f6 13rnbq1rk1ppppppbp5np11PP9N2PP2PPPPRNBQKB1R b8c6 e7e6 13rnbq1rk1ppppppbp5np12P6P2N2PP2PPPPRNBQKB1R c8f5 c8g4 13rnbq1rk1ppppppbp5np12P8PN2PPP2PPPRNBQKB1R c7c5! f8e7 13rnbqr1k1pppp1ppp1b3n6p4P2P3P1N2N4PPBPPPR1BQK2R d7d6! o-o 1Cr1b1k1nr2p2pppp1pb2q4p6PPpP6P3PP2N1PPRNBQ1RK1 d8a5 1Cr1b1kb1r2p2pppp1p2n8q3pPp7P3PP1NNPPPR1BQ1K1R d8c7 1Cr1b1kbnr2p2pppp1p11q3pPp7P3PP2NPPPRNBQ1K1R b8d7 1Cr1bqk2rpp1pppbp2n2np2Bp9P8N2PPPP1PPPRNBQ1RK1 f8e8!! b8c6 1Cr1bqkb1r3p1pppp1n1pn3pp9P5N2N2PPPPBPPPR1BQ1RK1 d7d6 1Cr2qk1nrpp3ppp2nbp6p7P2b6N2PPP1BPPPRNBQ1RK1 c7c6! b8d7 1Cr2qkb1rpp3ppp2n1pn4pp7P2b5PN2PPP1BPPPRNBQ1RK1 h7h6!! b8d7 1Cr3k1nr2pb1pppp1pb2q1Q9pPpP6P3PP2N1PPRNB2RK1 b8d7 1Cr3k1nr2pb1pppp1pb2q4p4Q1PPpP6P3PP2N1PPRNB2RK1 a5a4 1Cr3k2r1p2npppp1qbp5p7P3b4PPN2P2N1PPPR1BQ1RK1 d8b6 1Cr3k2r2p2pppp1pb1n5p2q3PP2b3N1PR2PP2N1PPR1BQ2K1 f6f7! e6e5 1Cr3k2r2pb1pp3pq1n5p5pPPp2p1P2P2PP1QNNPP1R4RK1 f7f6 1Cr3kb1rpppq1ppp2p1bn21P4PPP1BPPPRNBQ1RK1 b8c6 b8d7 1Cr3kbnr1p2ppppp1q7pp10b2P2PN2P1PP1PPPRNBQ1RK1 c8b7! c7c5 1Crnbqk2rppp2ppp10bpp5P8P1N2PP3KPPRNBQ1B1R c8e6 1Crnbqk2rppp2ppp11pp5P8PbN2PP3KPPRN1Q1B1R f7e6 1Crnbqk2rppp2ppp12p5p8PKN2PP4PPRN1Q1B1R b8c6 1E1r2k2rpb1qbppp1pn2n4p1p3Q9NP1NP1PP1BPPBPR4RK1 a7a6 1E3rk2r1p2npppp1qbp5p7P3b2Q1PPN2P2N1PPPR1B2RK1 a8b8 1E4k2r1p1rnpppp1qbp5p7P3b2Q1PPN2P2N1PPP1RB2RK1 c8a6 1F2kr3rppp1qppp2n1b5bnp13NPPN2PP2BPPPR1BQ1RK1 a7a6 d8c7 c8d7 1F3r1rk1ppq1n1pp2nbpp5p1b5P6P1B3PP1NBPPPR2QRNK1 a8c8 1F3r1rk1ppq1n1pp2nbpp5p7P2b3P1BN2PP2BPPPR2QRNK1 a8c8 f6d7 f8g6 1Fr1b1r1k1pp1nqpb3pp1np8pPPPPp5N1P5QNBPPPR1B2RK1 c8a6 1Fr1b1r1k1pp1nqpbp2pp1np10PPPp5N1P3P1QNBPPPR1B2RK1 a7a5 1Fr1b1r1k1pppnqpbp3p1np10PPPp5N1P3P2NBPPPR1BQ1RK1 d8c7 1Fr1b1rnk2p2qpb3pp1np1p6pP1PPp3BPN1P5QNBPPP2KR3R h7h6 1Fr1bq1rk1pp1pppbp2n2np2Bp9P5N2N2PPPP1PPPR1BQ1RK1 f8e8 e5e4 1Fr1bq1rk1pp2bppp2n2n4ppp7P6P1NP1PPP2PBPRNBQ1RK1 b8c6! b8d7 1Fr2q1rk1pp3ppp2nb1n4pp10b2P2PN2PB1PBPPPRN1Q1RK1 d7d5 1Fr2q1rk1pp3ppp2nbb5pnp11P2PPN3P2BPPPRNBQ1RK1 b8d7 1Fr2q1rk1ppp2ppp2nb5B9P2b6N2P1P2PPPR1BQ1RK1 c7c6! c8e6 1Frn1qr1k1pp3pbp2p1bnp4pp5P1P5NP2P1PP2NPBPR1BQ1RK1 c5d4 1Frn1qr1k1pp3pbp4bnp4pp7P5NP2P1PP2NPBPR1BQ1RK1 d6d5 1Frnbq1rk1pp2ppbp5np3pp7P8PN2PPP1BPPPRNBQ1RK1 d5c4!! b8d7 1Frnbqr1k1pp1p1pp2bp2n1p4p4P2P3P1NP1N4P1BPPPR1BQ1RK1 c6b8 c8b7 c6a5 Phalanx-XXV/phalanx.c0000644000175000010010000003254212607653576013542 0ustar dusanNone /* * The main module: * - Parsing command line parameters * - benchmark */ #include "phalanx.h" const char initialpos[] = "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1"; /* 2005-09-14, José de Paula * GCC 3.0 deprecated multi-line strings, and, as of GCC 3.4, they are no longer supported. */ void badoptions(void) { printf("\n" "Usage: phalanx [options] [ []]\n" " phalanx [options] []\n" " phalanx bench\n" " phalanx bcreate [options]\n" "Options: -t \n" " -f \n" " -x <+/-> xboard mode on/off default: on\n" " -p <+/-> permanent brain on/off default: off\n" " -s <+/-> show thinking on/off default: off\n" " -c <+/-> cpu time default: off\n" " -o <+/-> polling input default: on\n" " -b <+/-> opening book default: on\n" " -r default: 0 (no resigning)\n" " -e default: 0 (best play)\n" " -z default: 0 (best play)\n" " -z :\n" " -n default: no limit\n" " -l <+/-> learning on/off default: on\n" " -v print version and exit\n" " -P \n" " -S \n" " -L \n" " -g \n" "Examples: phalanx -c+ -s+ -o - -x- -f 60 -t4000\n" " xboard -fcp \"phalanx -l+ -r800\"\n" ); exit(0); } char *get_book_file(char *bookdir,char *env_variable, char *path,char *name,int mode) { char file[256]; char *aux; if(bookdir) /* Specified in options? */ path = bookdir; else if((aux=getenv(env_variable))) /* In an environment variable? */ path = aux; else if(!access(name,mode)) /* In the current directory? */ path = "."; else /* Desperacy now, use compile time file. */ ; #ifdef GNUFUN snprintf(file,255,"%s/%s",path,name); #else sprintf(file,"%s/%s",path,name); #endif return strdup(file); } int main( int argc, char **argv ) { int c; clock_t t; char *PbookDir,*SbookDir,*LbookDir,*EcoDir; #ifdef GNUFUN int indexptr; struct option longopts[] = { { "help", no_argument, NULL, '?' }, { "version", no_argument, NULL, 'v' }, { "trans-table-cells", required_argument, NULL, 'T' }, { "trans-table-bytes", required_argument, NULL, 't' }, { "fixed-search-time", required_argument, NULL, 'f' }, { "xboard-mode", no_argument, &Flag.xboard, 1 }, { "no-xboard-mode", no_argument, &Flag.xboard, 0 }, { "permanent-brain", no_argument, &Flag.ponder, 1 }, { "no-permanent-brain", no_argument, &Flag.ponder, 0 }, { "show-thinking", no_argument, &Flag.post, 0 }, { "no-show-thinking", no_argument, &Flag.post, 1 }, { "cpu-time", no_argument, &Flag.cpu, 1 }, { "no-cpu-time", no_argument, &Flag.cpu, 0 }, { "poll-input", no_argument, &Flag.polling, 1 }, { "no-poll-input", no_argument, &Flag.polling, 0 }, { "use-opening-book", no_argument, &Flag.book, 1 }, { "no-use-opening-book", no_argument, &Flag.book, 0 }, { "easy-level", required_argument, NULL, 'e' }, { "resign-value", required_argument, NULL, 'r' }, { "learning", no_argument, &Flag.learn, 1 }, { "no-learning", no_argument, &Flag.learn, 0 }, { "primary-book-dir", required_argument, NULL, 'P' }, { "secondary-book-dir", required_argument, NULL, 'S' }, { "learning-file-dir", required_argument, NULL, 'L' }, { "log-file-name", required_argument, NULL, 'g' }, { 0,0,0,0 } }; #endif t = clock(); /* Do NOT buffer I/O - needed for communication with xboard */ setvbuf(stdout, (char*)NULL, _IONBF, 0); printf("Phalanx "); puts(VERSION); if(argc>1) if( strncmp("bcreate\0",argv[1],8) == 0 ) { return bcreate(argc-1,argv+1); } /* Initialize the random number generator. */ srand( ((unsigned)time(NULL)) + ((unsigned)getpid()) ); /* SIG_INT */ signal(SIGINT,SIG_IGN); setfen(initialpos); #undef debugsee #ifdef debugsee { int x; int j; setfen("q2r2k1/1b3ppp/2prpn2/3P4/2PRP3/4NB2/5PPP/3R2K1 w"); printboard(NULL); for(j=0;j!=1000000;j++) x=see(C6,D5); printf(" [%i]\n",see(C6,D5)); return 0; } #endif Flag.machine_color = BLACK; Flag.post = 0; Flag.analyze = 0; Flag.xboard = 1; Flag.book = 1; Flag.centiseconds = 1000; Flag.level = averagetime; Flag.ponder = 0; Flag.cpu = 0; Flag.increment = 0; Flag.polling = 1; Flag.resign = 0; Flag.nps = 0; Flag.easy = 0; Flag.random = 0; Flag.rndlim = 0; Flag.noise = 50; /* 0.5 s */ Flag.learn = 0; Flag.bench = 0; Flag.log = NULL; Scoring = 0; SbookDir = NULL; PbookDir = NULL; EcoDir = NULL; LbookDir = NULL; opterr = 0; #ifdef GNUFUN while( ( c = getopt_long( argc, argv, "vf:T:t:p:s:x:c:o:r:b:n:e:z:l:S:P:L:g:", longopts, &indexptr) ) != -1 ) #else while( ( c = getopt(argc,argv,"vf:T:t:p:s:x:c:o:r:b:n:e:z:l:S:P:L:g:") ) != -1 ) #endif switch(c) { case 'T': if( sscanf( optarg, "%i", &SizeHT ) == 0 ) badoptions(); break; case 't': if( sscanf( optarg, "%i", &SizeHT ) == 0 ) badoptions(); SizeHT = 1024 * SizeHT / sizeof(thashentry); break; case 'r': { int i; if( sscanf( optarg, "%i", &i ) == 0 ) badoptions(); Flag.resign = abs(i); } break; case 'f': { static int t; if( sscanf( optarg, "%i", &t ) == 0 ) badoptions(); Flag.centiseconds = t*100; Flag.level = fixedtime; } break; case 'e': { static int e; if( sscanf( optarg, "%i", &e ) == 0 ) badoptions(); if( e < 0 ) badoptions(); Flag.easy = e; } break; case 'z': { int r,rl=0; if( sscanf( optarg, "%i:%i", &r, &rl ) == 0 ) badoptions(); if( r < 0 || rl<0 ) badoptions(); Flag.random = r; Flag.rndlim = 2*rl; } break; case 'n': { int n; if( sscanf( optarg, "%i", &n ) == 0 ) badoptions(); if( n < 100 ) badoptions(); Flag.nps = n; } break; case 'p': switch(*optarg) { case '+': Flag.ponder = 1; break; case '-': Flag.ponder = 0; break; default: badoptions(); } break; case 's': switch(*optarg) { case '+': Flag.post = 1; break; case '-': Flag.post = 0; break; default: badoptions(); } break; case 'x': switch(*optarg) { case '+': Flag.xboard = 1; break; case '-': Flag.xboard = 0; break; default: badoptions(); } break; case 'c': switch(*optarg) { case '+': Flag.cpu = 1; break; case '-': Flag.cpu = 0; break; default: badoptions(); } break; case 'o': switch(*optarg) { case '+': Flag.polling = 1; break; case '-': Flag.polling = 0; break; default: badoptions(); } break; case 'b': switch(*optarg) { case '+': Flag.book = 1; break; case '-': Flag.book = 0; break; default: badoptions(); } break; case 'l': switch(*optarg) { case '+': Flag.learn = 1; break; case '-': Flag.learn = 0; break; default: badoptions(); } break; case 'g': { if( ( Flag.log = fopen(optarg,"a") ) != NULL ) { setvbuf(Flag.log, (char*)NULL, _IONBF, 0); printf("log file %s\n",optarg); } else printf("telluser Phalanx: cannot open log file\n"); } break; case 'v': /* fprintf(stderr,"%s\n",VERSION); */ exit(0); case 'P': PbookDir = strdup(optarg); break; case 'E': EcoDir = strdup(optarg); break; case 'S': SbookDir = strdup(optarg); break; case 'L': LbookDir = strdup(optarg); break; case '?': badoptions(); break; } { int m; switch( argc - optind ) { case 0: break; case 1: if( argc==2 && strncmp("bench\0",argv[1],6)==0 ) { Flag.bench = 1; break; } if( sscanf(argv[optind],"%i",&m) == 0 ) badoptions(); Flag.centiseconds = 100*m; Flag.level = averagetime; break; case 2: if( sscanf(argv[optind],"%i",&m) == 0 ) badoptions(); Flag.moves = m; if( sscanf(argv[optind+1],"%i",&m) == 0 ) badoptions(); Flag.centiseconds = m*6000; Flag.level = timecontrol; break; case 3: if( sscanf(argv[optind],"%i",&m) == 0 ) badoptions(); Flag.moves = m; if( sscanf(argv[optind+1],"%i",&m) == 0 ) badoptions(); Flag.centiseconds = m*6000; if( sscanf(argv[optind+2],"%i",&m) == 0 ) badoptions(); Flag.increment = m; Flag.level = timecontrol; break; default: badoptions(); } } if( Flag.easy ) { Flag.learn = 0; Flag.ponder = 0; SizeHT = 0; if( Flag.nps==0 ) Flag.nps = 500 - 3*Flag.easy; if( Flag.random==0 ) Flag.random = 10 + Flag.easy/2; } if( Flag.random ) Flag.learn=0; if( Flag.nps && Flag.cpu ) { Flag.cpu = 0; printf("telluser ignored -c+, cannot be used with -n \n"); } if( SizeHT != 0 ) { HT = calloc( SizeHT, sizeof(thashentry) ); if( HT == NULL ) { puts("cannot alloc hashtable"); SizeHT = 0; } } /* alloc static eval cache */ { extern void initcache(void); initcache(); } /* init distance tables */ { extern void initdist(void); initdist(); } if( Flag.bench ) { # define NPOS 10 /* number of positions */ int i; long tim; int64 allnodes = 0; const char * positions[NPOS] = { initialpos, "2kr3r/pp3Npp/2pbbn2/6B1/2BPp3/6Pq/PPP1Q2P/2KR3R b", "r1bq1r1k/2pn2bp/1p1p1np1/pN1Pp3/1PP1Pp2/P2B1P2/1BQN2PP/1R3RK1 b", "r4rk1/2p1p1b1/p1n3pp/1p1qP3/P1pP4/B1P2PPN/4Q1K1/R6R b", "8/1p3rpp/p2nk3/P3p3/2R5/2N2PP1/1P2K2P/8 w", "rnbr2k1/ppq1ppbp/6p1/2p5/3P4/2PBPN2/P4PPP/1RBQ1RK1 w", "3r1rk1/1q2b1pp/pn3p2/1pp5/4PB2/5N2/PP1RQPPP/3R2K1 w", "8/2p5/5pK1/5R2/4k2P/p4P2/1r6/8 b", "3r1rk1/p3qp1p/2bb2p1/2pp4/8/1P2P3/PBQN1PPP/2R2RK1 b", "k7/ppp5/8/8/8/8/P1P5/K7 w" }; Flag.cpu = 1; Flag.level = fixedtime; Flag.centiseconds = 3000; Flag.post = Flag.book = Flag.learn = Flag.ponder = Flag.polling = 0; printf("Running benchmark, this will take 5 minutes of CPU time.\n"); printf("----------"); tim = ptime(); for( i=0; i!=NPOS; i++ ) { setfen(positions[i]); if( i!=0 ) printf("+"); fflush(stdout); root_search(); if( Abort == 1 ) return 0; allnodes += Nodes; } printf("+\n%10i nodes per second\n", (int)(100*allnodes / (ptime()-tim) )); return 0; } /*** Opening book init ***/ /* Try to open book files. Give a message if not successful. */ SbookDir = get_book_file(SbookDir,ENV_SBOOK,SBOOK_DIR,SBOOK_FILE,R_OK); Sbook.f = fopen(SbookDir,"rb"); PbookDir = get_book_file(PbookDir,ENV_PBOOK,PBOOK_DIR,PBOOK_FILE,R_OK); Pbook.f = fopen(PbookDir,"rb"); EcoDir = get_book_file(EcoDir,ENV_ECO,ECO_DIR,ECO_FILE,R_OK); Eco = fopen(EcoDir,"rb"); if( Flag.learn ) { LbookDir = get_book_file(LbookDir,ENV_LEARN,LEARN_DIR,LEARN_FILE,R_OK|W_OK); Learn.f = fopen(LbookDir,"r+"); if( Learn.f == NULL ) { # define LFSZ 65536 int b[LFSZ]; char filename[256]; memset( b, 0, LFSZ*sizeof(int) ); sprintf(filename,"./%s",LEARN_FILE); free( LbookDir ); LbookDir = strdup( filename ); Learn.f = fopen(LbookDir,"w+"); if( fwrite( b, sizeof(int), LFSZ, Learn.f ) == LFSZ ) printf("telluser Phalanx: created learn file %s\n",LbookDir); } } else Learn.f = NULL; if( Pbook.f != NULL ) { struct stat fs; stat(PbookDir,&fs); Pbook.filesize = fs.st_size; printf("primary book %s, %d bytes\n",PbookDir,Pbook.filesize); } if( Sbook.f != NULL ) { struct stat fs; unsigned pos; stat(SbookDir,&fs); Sbook.filesize = fs.st_size; myfread( &pos, sizeof(unsigned), Sbook.f ); Sbook.firstkey=pos; fseek( Sbook.f, Sbook.filesize-6, SEEK_SET ); myfread( &pos, sizeof(unsigned), Sbook.f ); Sbook.lastkey=pos; printf("secondary book %s, %d bytes\n",SbookDir,Sbook.filesize); } if( Learn.f != NULL ) { struct stat fs; stat(LbookDir,&fs); Learn.filesize = fs.st_size; printf("learning file %s, %d bytes\n",LbookDir,Learn.filesize); } if( Eco != NULL ) { struct stat fs; stat(EcoDir,&fs); printf("eco file %s, %i bytes\n",EcoDir,(int) fs.st_size); } if( Sbook.f==NULL || Pbook.f==NULL ) { if( Flag.xboard ) printf("telluser Phalanx: "); printf("Cannot open "); } if( Sbook.f == NULL ) if( Pbook.f == NULL ) printf("both [%s] and [%s]\n", SBOOK_FILE, PBOOK_FILE ); else printf("[%s]\n", SBOOK_FILE ); else if( Pbook.f == NULL ) printf("[%s]\n", PBOOK_FILE ); if( Learn.f == NULL && Flag.learn ) { Flag.learn=0; puts("telluser Phalanx: cannot open learn file"); } printf("tellics set 1 Phalanx "); printf(VERSION); if( Flag.easy || Flag.nps ) { if( Flag.easy ) printf(", easy level %i", Flag.easy ); if( Flag.nps ) printf(", nodes per second limit = %i", Flag.nps ); printf("\n"); } else printf(", %i kB hashtable, %i/%i kB P/S opening book", (int)(((1+SizeHT)*sizeof(thashentry)-1)/1024),(int)(Pbook.filesize/1024), (int) (Sbook.filesize/1024)); printf("\n"); /************************************/ /************************************/ shell(); /************************************/ /************************************/ t = clock()-t; printf("Processor time ......... %i:%02i:%02i.%02i\n", (int) (t/CLOCKS_PER_SEC/3600), (int) (t/CLOCKS_PER_SEC%3600/60), (int) (t/CLOCKS_PER_SEC%60), (int) (t*100/CLOCKS_PER_SEC%100) ); if( Age != 0 ) { printf("Average search depth ... %g\n", ((float)AllDepth) / ((float)(Age*100)) ); printf("Average NPS report ..... %g\n", ((float)AllNPS) / ((float)Age) ); } printf("Hash table age ......... %i\n", Age); puts("Good bye!"); return 0; } Phalanx-XXV/phalanx.eng0000644000175000010010000000003612436025316014043 0ustar dusanNoneplugin spec 0.0 phalanx chess Phalanx-XXV/phalanx.h0000644000175000010010000002663112711442635013535 0ustar dusanNone#ifndef PHALANX_INCLUDED #define PHALANX_INCLUDED #define ENGNAME "Phalanx" #define VERSION "XXV" #ifdef GNUFUN # include #endif #ifdef _WIN32 # include # include # include # include #endif #include #include #include #include #include #include #include #include #include #include /* * COMPATIBILITY */ #ifndef CLOCKS_PER_SEC # define CLOCKS_PER_SEC CLK_TCK #endif #ifdef _WIN32 # ifndef __cplusplus # define inline __inline # endif typedef __int64 int64; #else typedef long long int64; #endif /* * TYPES */ typedef unsigned char tsquare; /*** Moves are generated into and executed from struct tmove ***/ typedef struct { short value; /* heuristic value - the order key - before search */ /* value returned - after search */ short dch; /* depth change -100...100 */ unsigned char from, /* square */ to, /* destination square */ special; /* Castling or en passant capture, see moving.c */ unsigned char in1, /* moving piece */ in2, /* captured piece or 0 */ in2a; /* moving piece or promoted piece */ } tmove; /* 12 bytes */ typedef struct { int psnl; /* positional evaluation */ int devi; /* deviation to be used in lazy eval, 0 = true eval */ int check; /* side to move is in check */ } tsearchnode; typedef struct { tmove m; unsigned hashboard; unsigned rule50, /* number of half-moves since last irreversible */ castling; /* 4 castling flags: */ /* white short, w. long, b. s., b. l. */ int mtrl, /* material count of side on move */ xmtrl; /* material count of opposite side */ } tgamenode; /* 12+16 bytes */ typedef struct { unsigned hashboard; short value, depth: 14; unsigned result: 2; unsigned short move, age; } thashentry; /* 12 bytes */ /* Positional features of one side */ typedef struct { short hung; signed char khung, kshield; unsigned char p, n, b, r, q; /* number of given pieces */ unsigned char kp; /* king position */ unsigned char r7r; /* # of rooks on 7-th row */ signed char prune; /* is it ok to prune search in this pos ? */ signed char kstorm, qstorm; /* diffside castling: king attack q/k side */ unsigned char devel; /* development needed?, 0 ... no */ unsigned char castling; unsigned char bishopcolor, /* square color of friendly bishops, or-red */ xbishopcolor; /* square color of enemy bishops */ signed char worsebm; /* mobility of the worse bishop */ unsigned char lpf, rpf; /* leftmost/rightmost pawn file */ } tknow; typedef enum { timecontrol, averagetime, fixedtime, fixeddepth } tlevel; typedef struct { int centiseconds; unsigned moves, /* time levels */ increment; int depth; /* fixed depth level */ int noise; int resign; int bench; int machine_color, post, xboard, book, learn, cpu, /* use cpu time */ ponder, analyze, polling; /* polling input */ tlevel level; int nps; int easy; int random; int rndlim; FILE * log; } tflag; typedef struct { unsigned char prev, next; } tlist; typedef struct { FILE * f; unsigned firstkey, lastkey; int filesize; } tsbook; typedef struct { FILE * f; int filesize; } tpbook; typedef struct { unsigned taxi, max, diag, min; } tdist; /* * DEFINITIONS */ #ifndef VERSION # define VERSION "unknown" #endif /* use SAN for output */ #undef SANOUT /* primary (text, small, user) book */ #ifndef PBOOK_FILE #define PBOOK_FILE "pbook.phalanx" #endif #ifndef PBOOK_DIR #define PBOOK_DIR "/usr/local/lib/phalanx" #endif /* secondary (binary, large, generated from pgn) book */ #ifndef SBOOK_FILE #define SBOOK_FILE "sbook.phalanx" #endif #ifndef SBOOK_DIR #define SBOOK_DIR "/usr/local/lib/phalanx" #endif #ifndef ECO_FILE #define ECO_FILE "eco.phalanx" #endif #ifndef ECO_DIR #define ECO_DIR "/usr/local/lib/phalanx" #endif #ifndef LEARN_FILE #define LEARN_FILE "learn.phalanx" #endif #ifndef LEARN_DIR #define LEARN_DIR "/var/local/lib/phalanx" #endif #define ENV_PBOOK "PHALANXPBOOKDIR" #define ENV_SBOOK "PHALANXSBOOKDIR" #define ENV_LEARN "PHALANXLEARNDIR" #define ENV_ECO "PHALANXECODIR" #define max(x,y) (((x)>(y))?(x):(y)) #define min(x,y) (((x)<(y))?(x):(y)) #define NOVALUE 32123 #define CHECKMATE 30000 #define MAXPLY 64 #define MAXCOUNTER 1024 /* 512 moves */ #define HASH_COLOR ((unsigned)0xFDB97531) #define no_cut 1 #define alpha_cut 2 #define beta_cut 3 /* Castling special move codes and flags */ #define SHORT_CASTLING 1 #define LONG_CASTLING 2 #define NULL_MOVE 20 #define WSHORT 1 /* if set, white short castling is impossible */ #define WLONG 2 #define BSHORT 4 #define BLONG 8 /* Colors / sides */ #define WHITE 1 #define BLACK 2 #define empty(X) (((X)&3)==0) #define white(X) (((X)&3)==WHITE) #define black(X) (((X)&3)==BLACK) #define color(X) ((X)&3) #define enemy(X) ((X)^3) /* Values */ #define P_VALUE 100 #define N_VALUE 350 #define B_VALUE 350 #define R_VALUE 550 #define Q_VALUE 1050 /* Pieces */ #define piece(X) ((X)&0x7C) #define PAWN 0x10 #define KNIGHT 0x20 #define BISHOP 0x30 #define ROOK 0x40 #define QUEEN 0x50 #define KING 0x60 #define WP (WHITE|PAWN) #define WN (WHITE|KNIGHT) #define WB (WHITE|BISHOP) #define WR (WHITE|ROOK) #define WQ (WHITE|QUEEN) #define WK (WHITE|KING) #define BP (BLACK|PAWN) #define BN (BLACK|KNIGHT) #define BB (BLACK|BISHOP) #define BR (BLACK|ROOK) #define BQ (BLACK|QUEEN) #define BK (BLACK|KING) /*** Bit masks for power tables ***/ #define WPM 0x0001 #define WNM 0x0002 #define WBM 0x0004 #define WRM 0x0008 #define WQM 0x0010 #define WWW 0x0020 #define BPM 0x0100 #define BNM 0x0200 #define BBM 0x0400 #define BRM 0x0800 #define BQM 0x1000 #define BBB 0x2000 /* Files */ #define FILE_A 1 #define FILE_B 2 #define FILE_C 3 #define FILE_D 4 #define FILE_E 5 #define FILE_F 6 #define FILE_G 7 #define FILE_H 8 /* Squares */ #define A1 21 #define B1 22 #define C1 23 #define D1 24 #define E1 25 #define F1 26 #define G1 27 #define H1 28 #define A2 31 #define B2 32 #define C2 33 #define D2 34 #define E2 35 #define F2 36 #define G2 37 #define H2 38 #define A3 41 #define B3 42 #define C3 43 #define D3 44 #define E3 45 #define F3 46 #define G3 47 #define H3 48 #define A4 51 #define B4 52 #define C4 53 #define D4 54 #define E4 55 #define F4 56 #define G4 57 #define H4 58 #define A5 61 #define B5 62 #define C5 63 #define D5 64 #define E5 65 #define F5 66 #define G5 67 #define H5 68 #define A6 71 #define B6 72 #define C6 73 #define D6 74 #define E6 75 #define F6 76 #define G6 77 #define H6 78 #define A7 81 #define B7 82 #define C7 83 #define D7 84 #define E7 85 #define F7 86 #define G7 87 #define H7 88 #define A8 91 #define B8 92 #define C8 93 #define D8 94 #define E8 95 #define F8 96 #define G8 97 #define H8 98 #define H9 99 /* a bumper: we are out of board */ /* * VARIABLES */ extern tflag Flag; /* Misc. settings, see typedef of tflag */ extern tsquare B[120]; /* The chessboard */ extern tlist L[120]; /* List of pieces */ #define WKP (L[1].next) /* White king position */ #define BKP (L[2].next) /* Black king position */ extern signed char * Th; /* horizontal axe transf., (H8<->H1) */ extern signed char * Tv; /* vertical axe tr., (H8<->A8) */ extern const char initialpos[]; extern tdist dist[120*120]; extern tknow Wknow, Bknow; /* Things i know about actual position */ extern int Color; /* c. to move: 1 ... white, 2 ... black */ extern int LastIter; /* result of last iteration */ extern int Depth; /* depth to be searched, in % of ply */ extern int Ply; extern int FollowPV; extern int Totmat; /* total mtrl sum on the board */ extern int Abort, NoAbort; /* abort the search when SIG_INT */ extern long AllDepth; /* Statistics for average Depth */ extern int64 AllNPS; extern long T1, T2; /* time started & planned on a move */ extern int DrawScore; #define DRAW ( Ply%2 ? -DrawScore : DrawScore ) extern tsearchnode S[MAXPLY]; /* the current node is S[Ply] */ extern tgamenode G[MAXCOUNTER]; extern int Counter; /* game counter, points to G[] */ extern int64 Nodes; /* statistics */ extern int Scoring; extern int EasyMove; extern long Otim; /* remaining opponent's time */ /* move generation tables */ extern int N_moves[8], RB_dirs[8]; #define K_moves RB_dirs extern int Values[7]; /* piece values */ extern unsigned P[120]; extern tmove PV[MAXPLY][MAXPLY]; /* principal variantion */ extern tmove Pondermove; /* Hashing codes */ extern unsigned H[12][64]; extern thashentry *HT; /* Hash table itself */ extern int * HS; /* square trans-table */ extern int HP[]; /* piece trans-table */ extern unsigned SizeHT; /* Size of the hash table */ extern unsigned Age; /* Opening book */ extern tpbook Pbook; /* primary book flags */ extern tpbook Learn; extern tsbook Sbook; /* secondary book flags */ extern FILE * Eco; extern int Bookout; /* params that cannot be pushed thru SIGALM handler, */ /* must be pushed thru global variables */ extern volatile int A_n, A_i, A_d; extern volatile tmove * A_m; /* * FUNCTIONS */ extern void myfwrite( void*, int, FILE* ); extern void myfread( void*, int, FILE* ); extern int bcreate(int,char**); extern void new_game(void); /* input/output */ extern int printfl(const char *, ...); extern void printm(tmove,char*); extern void printmSAN( tmove*, int, int, char* ); extern void printPV(int,int,char*); extern void infoline(int,char*); extern void verboseline(void); extern void printboard(char*); extern int setfen(const char*); extern void shell(void); extern int command(void); extern tmove * sandex(char*,tmove*,int); /* signal handlers */ extern void interrupt(int); extern int attacktest(int,int); #define checktest(side) attacktest( (side)==WHITE ? WKP : BKP, enemy(side)) extern void generate_legal_moves(tmove*,int*,int); extern void generate_legal_captures(tmove*,int*,int); extern void generate_legal_checks(tmove*,int*); extern int see( tsquare *, int, int ); extern int search(tmove*,int,int,int); extern tmove root_search(void); extern int repetition(int); extern int material_draw(void); extern int evaluate(int,int); extern void blunder(tmove*,int*); extern int score_position(void); /* endgame knowledge */ extern int pawns(void); extern int e_nb(int); /* endgame: knight and bishop */ extern int e_mp(void); /* minor piece and pawn */ extern int e_rpr(void); /* R+P vs. R */ extern void do_move( tmove * ); extern void undo_move( tmove * ); extern unsigned hashboard(void); extern thashentry * seekHT(void); extern void writeHT(int,int,int); /* levels */ extern void l_level(char *); extern void l_startsearch(void); extern int l_iterate(void); extern long ptime(void); extern long LastTurn; extern int Turns; /* book */ extern int bookmove(tmove*,int); extern unsigned smove(tmove*); /* learning feature */ extern int rlearn(void); extern void wlearn(int,int); /* killer move utils */ extern void init_killers(void); extern void write_killer( int, int ); extern void add_killer( tmove *, int, thashentry * ); extern void slash_killers( tmove *, int ); #endif Phalanx-XXV/README0000644000175000010010000003267012607653576012625 0ustar dusanNonePhalanx is a chess playing program Copyright (c) 1997, 1998, 1999, 2000, 2014 Dusan Dobes LICENSE AND WARRANTY - Phalanx 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. - Phalanx is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - You should have received a copy of the GNU General Public License along with Phalanx; see the file COPYING. If not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. WHERE TO GET PHALANX - http://sourceforge.net/projects/phalanx/ - ftp://sunsite.unc.edu/pub/Linux/games/strategy/ (Only sources) Please let me know if there are others, i will update this list. Feel free to put Phalanx on your ftp site. COMPILING, PORTABILITY Compiling is simple, at least under Linux. Just type `make'. You might want to edit the optimization flags in makefile to produce faster binary. Phalanx is developed under GNU C, GNU Debugger, and GNU Make. If your system does not support GNU exensions (e.g. long options), remove '-DGNUFUN' from DEFINES in makefile. If you have incompatible 'make', try this: $ cat *.c > allphalanx.c; cc -O allphalanx.c -o phalanx INTERFACE, COMMAND LINE OPTIONS Phalanx is xboard compatible. Running with xboard: 'xboard -fcp phalanx'. Note that permanent brain (pondering) is off by default. Newer versions of xboard set it on with the 'hard' command. If this does not work, try 'xboard -fcp "phalanx -p+"' or (for <4.0.0 versions of xboard) change your initString (see Xboard documentation for details). It's better to stop permanent brain in both programs, when playing Phalanx against another program on a machine with one CPU. It's also possible to run phalanx without xboard. Do "phalanx -h" to get a list of command line options. One important command of phalanx's ASCII interface is "help". MORE ABOUT INTERFACE I'm trying to write an interface that fits following three requirements: - Xboard compatibility. For best results, get the latest version of Xboard. - shell-like interface that allows running commands in a batch. It's very useful for testing. Example: look into the file test.fin. It's a set of chess problems and solutions. You can simply send this file to Phalanx's stdin: $ phalanx -c+ -o- -b- -f10 < test.fin | tee result ( Where: -c+ .... use cpu time -o- .... don't use polling input -b- .... no opening book -f10 ... fixed time 10 seconds per move ) Watch how it works. - Acceptable ASCII interface. COMMAND LINE OPTIONS Usage: phalanx [options] [ []] phalanx [options] [] phalanx bench phalanx bcreate [book creation options] Options: -t Transposition table really needs to fit in the RAM memory, it should never be swapped to disk. Maximum size is your total RAM minus space needed for OS (8-20 MB) minus space for other (possible) applications. -f -x <+/-> xboard mode on/off default: on "Xboard mode off" is designed for the ascii interface. In -s+ mode it shows also the move that is currently searched. -p <+/-> permanent brain on/off default: off Phalanx ponders on a predicted move with the permanent brain on. It is sometimes called pondering. Xboard sets it on with the 'hard' command regardless of this option, just use xboard menu to set it on/off. -s <+/-> show thinking on/off default: off Phalanx shows depth, evaluation, time used in centiseconds, nodes searched, and principal variation (best line) when searching. Xboard overrides this option with 'post' and 'nopost' commands, just use xboard menu instead of this. -c <+/-> cpu time default: off This one defaults to the "wall clock" real time. It's better to use the CPU time when running test suites. -o <+/-> polling input default: on Use -o- for running test suites. Phalanx reads the positions from its standard input and polling input makes it stop thinking after almost zero seconds on each position. -b <+/-> opening book default: on -l <+/-> learning on/off default: off -r default: 0 (no resigning) -e default: 0 (best play) 1 is the hardest and 99 is the easiest easy level. Phalanx tries to emulate human-like blunders, the higher the number the more blunders it plays. It also adds more randomness with the easy levels, repeating games should be impossible. Easy levels set hashtable size to zero, pondering and learning to off. Since version XXIII, Phalanx uses the time normally, it does not respond immediatelly. NPS is lowered to 100-300, unless overriden by the -n agrument. Root moves randomizing is used here as well, between 10 to 60 centipawns, unless overriden by the -z argument. -z default: 0 (best play) Randomize play. Add pseudo-random values to root moves evaluations. The numeric value limits the random range, the interval of random evaluations to be added is [-N/2 ... N/2]. -z : Like above, but only randomize first N moves. This is to avoid repeating lines in opening, while keeping almost the same playing strength. For example, -z 20:10 will randomize first 10 moves in the game by 20 centipawns. -n default: 0 (no limit) Limits the speed to weaken the engine and to use less resources: The speed of the machine does not matter here, it uses usleep() during the search, so with low NPS it does not raise the machine load. -v Print version and exit. -P -S -L -g Book creation options: -b Stage 1. One cell is 10 bytes. Twice the space is needed for sorting the buffer, use no more than 1/3 of your total RAM. -p Stage 1. Stop parsing the game at given ply (halfmove). Default value is 70, it's 35 full moves. -c Stage 1. PGN files have comments in {}. Phalanx skips the comments when parsing. Big PGN files also have lots of errors, sometimes '{' does not have matching '}'. So, if the comment goes over the maximal length, we suspect the text is no more the comment and continue parsing. Default value is 4096 bytes. -w Stage 1. We are adding the [position,move] to the database. The side to move won the game. The appropriate database entry gets bonus. Default is 5 points. Use values in 1-10 range. -d Stage 1. Same as the previous except that the game was drawn. Default value is 2 points. -l Stage 1. Same as the previous except that the side to move lost the game. Default value is 1 point. -u Stage 1. Same as the previous except that there is no result of the game in the PGN file, sad and common case. Default value is 1 point. -v Stage 2. Moves that have less total points than this value are not added into the sbook.phalanx. Bigger numbers create smaller books. The smallest reasonable number is 10. Default is 15. -g Stage 2. Use values in 50-100 range. The 2nd, 3rd, and other moves are stripped if their value is less than G% of the value of the best move. The G is decreased in positions where the 1st move value has high enough value to give more variability in frequently played opening, e.g. we want a bit more than just sicilian, maybe 1. ... e5 is also good. 50 gives lots of variability and maybe dubious moves, 100 gives almost no variability and only the highest valued moves. Default is 80. Note that the book creation does not work with DOS end-of-lines in the PGN input, just use dos2unix filter if needed. Examples: phalanx -c+ -s+ -o - -x- -f 60 -t4000 xboard -fcp "phalanx -r800" xboard -fcp 'phalanx -e 99' ASCII INTERFACE COMMANDS about about Phalanx, show version, copyright info, and settings bd display position (same as 'd') bk show book moves (xboard) - shows ECO code/name and all moves from both primary and secondary opening books. The last line is the text string that is used to identify the position in the pbook.phalanx. Primary book moves are shown along with their probabilities. There is no such probability info for the secondary book moves, as all secondary book moves have equal probability. book enable/disable opening book both machine plays both depth set search depth in plies (xboard). Search will be stopped at given depth, no timing info is used. fen display position in FEN force user plays both (xboard) go switch sides, start computing (xboard) history show game moves in full notation level N M I set level to N moves in M minutes, increment I seconds. Phalanx needs its time info have updated from xboard via the 'time' command to make this level work well. level N set level to fixed time N seconds per move new new game (xboard) post show thinking (xboard) remove take back last move, two plies (xboard) nopost do not show thinking (xboard) quit quit (same as 'exit' or end of file character) score show static evaluation time remaining time is N/100 s (xboard) undo undo last ply (xboard; same as 'u') set test position, start search, show result # comment OPENING BOOK From version VI, there are two book files - primary (pbook.phalanx), and secondary (sbook.phalanx). A position is first searched in pbook.phalanx. Only if it's not found there, sbook.phalanx is searched. You can specify book directories via command line (-P, -S) or use environment variables PHALANXPBOOKDIR and PHALANXSBOOKDIR. Otherwise Phalanx tries to find its book files in current directory (./book.phalanx, ./sbook.phalanx) and finally in compiled-in directory (/usr/local/lib/phalanx). You can change the compiled-in directory in makefile. - pbook.phalanx is 'hand'-written, text book. One line per position, sorted. This time, it's bigger than really needed, because it was the only book file till version V. The size will be smaller and the line format might change to EPD+SAN in future. - sbook.phalanx is binary book, generated from large PGN files. Six bytes per move (4 hash key, 2 move). You can generate your own sbook.phalanx with 'phalanx bcreate ', like this: $ ./phalanx bcreate < manyGMgames.pgn Book creation has two stages. First stage reads and parses PGN from standard input and creates the 'rbook.phalanx' file. If rbook.phalanx already exists, the first stage is skipped. Second stage filters positions and moves from the rbook.phalanx to sbook.phalanx. First stage needs about 30 times more time than the second one. Look at 'book creation options' for more details on creating your sbook.phalanx. ECO DATABASE From version XX, Phalanx has ECO database. Command 'bk' can also print ECO code and opening/variation name. This works with xboard 4.0 via "Help"/"Book" menu item. If you want to activate this feature, you must type the 'bk' command (or click the "Help"/"Book" menu item in xboard) once per session in the initial position. Then, the ECO index is created (that might take few seconds on a slow machine). The ECO index is based on positions rather than on moves so transpositions between openings can take place. The eco.phalanx file is taken from Gnuchess distribution (originally eco.pgn, but this is not real pgn). INSIDE THE MACHINE Phalanx uses (traditional) 10x12 board implementation. There are three often used board implementations: "8x8" (GNU Chess), "bitboard" (Crafty), and "10x12" (Nimzo, Phalanx). In short, "10x12" is easy to implement and the code and basic data structures are small ( == fast on PC). The engine uses many well known techniques: PVS (principal variation search), transposition/killer table, static-eval cache, history killers, SEE (static exchange evaluator), null move pruning, forward pruning, internal iterative deepening, chess-specific extensions. AUTHOR Dusan Dobes Phalanx-XXV/sbook.phalanx0000644000175000010010000100344212711442356014417 0ustar dusanNoneY5*D A7S LC KU#$-Lac+!c6-ӱ,Q]"%p"^v?`^vR],"]4`MXD>R#?7 #@5 #@7D$-#G='3H+.%{/La{/JTj07-0"=ڬ56.6,Xi6+t7JT/7,8#K83>Cw>4NC%=EIRPE E'EG_KT\0L.$kMNXM@TMJTO-O9%=GR6>WKUEXGQcX-CFXSGNY3ՌY@TՌY+6ӦY%P!ZH^Z-#)i[W[I\W[wxa>R b=I belxeU`/g@I$6jAI|=j7#fjzoGQzoU`q>R\t#u".,v8J.y.%*,+ ݀:C'R]'G]ɂ-#ɂ.O)B] "4͉_`͉NX]ЊAJٷ7#C9d% sT\"4.@7.A7{7_"6?LҝKU6SGAJkJT_t@ͩ+@9UaLAO˯R]O˯4>T+8qC9e "»J7g>* 6"Y:^YLarJH@FbR]@~4 bF@6bF#hKV&MXEMW$+!$S`]'"h,"h6"8 BVF?`>k9ISWHRWI\8B]\7#sI\s6A4 +8c%LaߔAUߔ][@7I\_i*6 K]cR]#R]cAJ`/%*!*#/%NXm*6`*žU`j7 T>l 6? #f @7c_A8(I.$#^LA7APeUa?SNXb?S9,UC>;h KU!Ua#6?M#I\G$JT(8*%|+!-+1@53GQ5MW6G67"8#D8+D86"D:/8P:A6:.!;@L|<HRh<#+q<A6cALaDNXFAK^H J4>wOR]bRTR]o["-\CY\6+M^@5/c>Rf-?&CkT\&CkHRtkJ@n5*oR֊3Me#Me.65,`7LԒAUiW``֕f#f5!Gc=I %e+ JAEx7#( Lav/&7U`!(?5lR] *=Q6.00S^KbDDUCz@+lK]ijLVg+LW`?ھ@^59Lc$@J0&JT7#h7L4 *LA?6,7+I\)-)*3)Q@5Q,=* -6.v6?I $\La$\BV+R]@LNMDL@7nMA "k.69".9C.JT@TIC.I>3L_`+6"+j5!j-#R1AU R]</%<C56?* /% ,x# #< 8_ I\R7R{=4KLlMW$WN-#B8A7ILaIKUIAU4 X,U`ISGQ^+!^"Rw!.$"ISg='T\4{(Lac*6.w+4 W.S/ 1LC 1@6_3KU47AO4u8La;0&;7#;* Z=JT=.'|?p;AK*C4`dTC3>oD7#G7LZLqL-JNHRN5]xN/%xN+[P-[P#R%R SH?أZ>R[6`:&bD9Wc]Q|g%yhTLli?-;p#_p6?:pA.Xr+ `r`r`r0&Ss,"L`x,{+!~|A.}4>D~4 ܯ~#H7+#HU:# .".̃nJ0A@8"T]#LaRb%W`T\)*:5/6-ěT\t?S SGT9DV-E 5!PU^$ D8z,@7?SuԮD9rz>RJTKUI\ɷA7c6Iͭt-#@U?* 2Dv-v]+!d:&d0&LT5!-<L^,M iW"B/.\RI\RLaR@TRJTa<@6jK]j@^C@TCI\jZI>CDX#653E@TFA6UCó@6N+z 7#f*K+"W`0KU.I5!+!p?I`\9iK@MBV"Er0&Er+5h%{.$8 8(+ * IA -#|  9%KfZ+ RW{C.I@7K *"H^ك)GQك)@JR*R*>R*6%+U`,+.,+),UI- -8V.-#/1ݾ2IA53HRz4`U>8!5t9F;=?S@AF@5+G,ruL@TL+!LJ?NITrN@LO#R#S.&S6-yUT]VKA"AWLV"AW9]#\5!]T^]T@P`8$,b>R˙c@5e-f.$5f6?Mg:&$h+!$h6.(l p-CԔp5@s!v#wLa9xMW9xLaJBz+Mz5B}JTB}?SC[=Q`/ى<T\X3XA.X?6m"gY^L^6-15!AJ -쾙?T+%"C+l 7LśLa%&<C9Ỵ* , !{!}-#}@5,"ɣ9%6-Uv:64?JL.I@W`LGQJhynU/:\)ъYU^KUIR8TLSI\ZJT"#AK*6}%"C<)m@KU9%{{.Iu?`l+4l/@L8$J"6J#M>RMT\+T\+I\=AU=MWWB5!-AI7R]B"T]5!yT]O%A.jT\qLaq4` P|s#_CD:]T\3>6.5>:0MWF@K1JU9].W`=>7#+4aOA7[   +" -DLI+U`@+!5-@5m3m+!/ ./ # "-"?S E#LTx$.&][ &)7LJ1CJ18\26?4T]D98S^@9-#=U4u>7#?@T?I\W@LaF>5EHJT4IW`fKJP.RR])ST^4KUY]I\H!_,7)_JT_ BL`>R`T\/aB]/aLaab6Od@7d@I|d e8$e@KfUaXJh7+i=IKl69pUIps@6pssL^İvW`|9%|#|-϶|T]~ P"z7#I\-#CW^+!E*:C6?!I\XP"N+!I_78WakǖLAΖWISҙJTҙ?S./%kC+>+,٠6/ܠA7GQT]OMW,;6CL,AU/%.o A.}W`JTT\I\=+@MO$8B yLaɴ0&+CO,!nAUG>+[*5BT.$BT!5AKB3[NC7@/"@6<?S<T\y@5k6"x@I@L53ſTL+P-#tJT}L7p7#I/%H^-A.38=%V@^jR]jH^jCWj=^/ LaH 4> @6M #+bacAU?6.D*!h OQ[ 0& >6" !"x$%I\+&La>&TLs)U?,*6?Ge*5,6#;/8$W/@+,17+P3?3{35ԯ56?Gf6@L6%87W`A9_:R]*;GQ*;KU*=KU*=ISz;=8$m>`BR]>C!*dC:9 lFJ8F>RA8JD:LOLIS{L{QOR@J>R:&>R.$oUJT\+ ^Cg_>+Fv`I\4a@T c c8$dI\Ng,KhMWi4" q_`'GrT\rBu`w7@vwI\xT\-'y6"{@5n~6"@~A.,+4*5.$%&V`Jڌ0&m?S%Q[`-N+","6-y6?*5,589]ƞH=,|5@A.xR],C s+-"i+i>6]J4F5KBD+g/IS@TSU^JTK]D۾I6/6?,)2I\T\YU-B A76#?SYC2 8#8TLj~&Na@+=.$"Y)*6NXR+9T\2La* k7@%-#h"7#h".=Na  ^TLW*D-##+q6-)%NXB6? ," 8$pa0&pa+ AI @56+H6?""."8P:* 6>66KU6MW]#7#.Q7#w+! # 6"t`U  ,"=   W`b&V@L27, !@6\s"T\"BVL&$C.&7,W'HT+C-n/"01*5g246.h45h4>h4*[R7+9K]95":2=@54>T\AI\ALa~A-#B4 EtCTLC][C+ rG+rG>6SNW`O4 "O6"GR5>jTU:y ZNXy Z6Iy Z_`/[^J@a+7;gUIgLagI\XkXk7LnA."?nI%qDLfs.Us5s,3v6"(xNXEuy 'z@T=:&5!,+ >8ғ%W_`A6>+,֗JA BНAU@5<ŸJ`,Ư?SG>R't6-ݢG-S>R=KU!I\Ы.CHR6-}BN+++#+>ζ>K%ɳ6-E-!%"c3%lj-L^*8$*80ÿ=G l@,B@It,"K]ՐLaj+j.%S\-$MW.>A7a7R@5nW`|H^ * MW9GQsA9]qIS&+ '6.z8$ ((JT T\6?*R]6# AUK]A6- ) 0&!"T-KH-#NX.T)M_^MISMI\T\Do=HtA ,tA !Jf K] ]@6Z4Lac&8"A.#5FAIbI\dzdz:&Q%!"'-#; (>Rݜ(!.TAH."4?/HR;0-C27#677+9U`597#59.=ƪ=+!*?-@ A7LsBBJT*C=^C6?I*XK3cK@KcKA.N* ,O_`P3XP"qLQJTATISATU`AT@TUR]UU>RX"[MW[=s^,"b3Leb@LbdCf-#f. f6.m9]Vq3>yLCizJ`o{LUr}+r}8$.5!\KUa\[,"_ hu,hu.]"]" ,B!R]ÈA@]p7A]p6A"0&͐LC)VB]14 &A.4La 6?CF@KCW#;8$?SJTLaW6XuUa|s@Lϯ6.7#TLI\",=# Y* seD98(NXįI5į!5^oJ`QT\'A6ݷ+524>jø)4@U`wν{!@+ȿ%==Q=q8q#5gzL-"˽?6:@TR]M@7Hc.fd^A6d^+!hISַ+ mm:&\)8$jH^AKI=s@KK_JDr.\v/%\v6"\v5!>J7WT90LWT\OAUC-1j8$C-uw#+}y@57#ʁ@Kj=I6fHR;" ISǷ [ @I ,n B ,% 5q+u90&JT6?tB65!%U`}&,$).9U +U+@^U+@Kp,/%",7,,#+cj-#G06+ :.u;J^ޔ;?S;=>>+>"W>0&/@5!rPEC.FG>GOHD98LuL6+FR@LFR@KpKS6µT7LhWW`eWCUXAUX/ZJTm>\I\_JT_"-ܢbT]bI\bH@j?6H%kI\ol+4fn4o"o%oMWp?Sq6,Cs@6t5,\yw0&z"!zMW|C4|7Lȁ5@':CۋR]Kj+!Kj@6=3S3[ "Tْ#,#j%0&'?6'-#rșW`ʚ5@QҚJTiL#5<"KU/_`]H+NXGQ 6.8$7#1}8","-#cݲMWcݲAUR]J/%-#z6?&,&)GT\ޯNCՆI>ՆC-+ ,5W`LCPAJa#{)#6@.I\T\-'"-/.γJ`γ.9cCcK@=I\)A77@IhI6.D7AJX5@)"5AK3LCo>+o9d/%d-#KU,Qw+!Qw #+^R].?S "x# D9b U`z ;Q HA @LVA AU d  AU La 9]: +>{ @I S^ 3 + U4 ` I: .$O /%O 6"O 8$O :&Ƌ -8 AU~ "~! KU>" 5?# R]C1$ 6#"& NX;' *+ >*+ 0&l, @7g0 -#>A3 6-53 .D9 I@9 S^46@ UaA AUA ?SrCA GQf!C vC zC JTڿG IS G "=}H \[jI ITI @TI S^MyJ #L fL fL )4L KUP *=P 9]P "P IAR R]7R jgR >S @LvW B]-[ B7AY^ Ї^ 8^ ^ #+Nb ?SZb 6?vc ,"sd R]d JTe Gh =^1i U^QGm 9/Qm .%Wm 6Ho 5* t 6+èu +!y 0&8{ 0&1~ @^Y AUY I\^ K]f IRg ,[ %q T\J I\ LaP@ +!xӏ +!xӏ 6" 6? H^Ϗ 8$N I=z ؕ ?6 – A7] MW 6 7+U 0 A. !)8D #8D ,pʤ LTQ ?6͒ @^p MW, L^ ,"0 I\0 ]^Ƃ }  -Z + 8$Xҵ  ?@r[ "Ի @T\ , +O #\X Labj * bj !t M @T #d+ ISh *h ?5 }~ AKO :Cf La, @6* * JTk 5+9 @Kf La ]^ "3 43 > @6  T\  >R J^8+  x 7#=y %< @+1t @L A.H ".o JTS +!Ɖ -{  ?6  @L? 9KDZ C^< C< * N MX 8@ GQ@ I\z C9Gg U` MB| LaB Ua. @K2 6.y D4 HR! LV" ;E" 7#" -5$ ?SK( #4+ 7#- "d- @6d- >[. KU1 T\1 NXy4 LT5 4`Y5 + 5 D7 6*7 %7 57 >8 ".8 v9 ?6 < #? ",A 5C 7#wC U`;C 5*D 7LD ?SJ 4G&>L S^QL /&N MWN TH=P 8$PQ .$PQ .R B7tS S T >U 7LyCV BWW 5@BWW S^z/X +9?^ MW8_ S^v` [i U`Aj JTAj >R`j "nl "=fm 4)9n -#[Wq H-r A76r Xr @I?r W`u K]v %x W`x @TK{ -#\| 6+C~ ?SV~ MW* +!o= J>+% A.B SH݂ @T) Uax H@ MW ISj %3 "T @K1 @Tߏ *5c U`# +!> #r[ MX`ٖ "y U^ LaL XL W` @6 V ,6i= -6F 6A - 8$b2 "C} A7} @^4z %2Ϧ 7@„ ISm  7#b +ٰ #9\h 5o 8" AU' ļ g A.g P GQ: 7?x +x !#x "x 7- K9 D9] T_ # @K AU `U 2 "C 2 CE< !L 7,u} /% 6"> *N T\$ - ?SO @5N u + ,"(= .p A.O w C 9#O" W`O" I\^W KB 5! -7 6@q  ?6 D9 KU# ! W`> )J 6?.! LaF UaN ; =[ *50  9LA 9%J X T\ @T1 I\ W` "*V @6x O 6A :&Z 32A" 3" LaK# IS'# "3[$ #ܬ& -#Yq* IT2+ ++ G]Ʋ/ 0]IH1 ?GN2 ,+7 ^8 NX8 U`W8 g8 .w]9 6@w]9 AU: KU: 7# ; + ; > DX~~? B]I !,I I 3RlJ +lKK +WQL JT fM ][jP +!^R 50S 6?NT %CT La-X .5X -#S$Y -(Z T\[ "] ]`5^ =I_^ ".p^ .#@bb + ^.h +!+i  j .j =G j @Tm "m #m MWm G]mn JT?q @+q ?S=r "Zs T\t /%w 6-Xz +g| I\k 7#dB @L\\ G]3 T]u \IB - * " #  ט 0&Ǚ AUI I\ġ . T\M AUM I\V^ 6?{\ 6.`l A68 * t KUp -#I U44 * P .sz >Rq %$ 5+$ ,i :DFͼ =IFͼ AIl .l #% La AJ +4 ][ D 6I' . )  # ?S q o -#E +L LC T^r 6 U` -@C  L ] " LaD + C8 R]8 ?I# @+ $L W`[ -+B KU5 !, T\cM % I\w @6l HTP * ?J[ . :.\1 ,\1 .S 9] XB CW/ : 7Lr +!r , IA @ 7# IU: =I JThO AThO HTY 6"e R]H #H g 6?4 LD4 BV! !3ĭ" AJac$ %% UI,& :C,& 8C"d& C7V& ,¿& /%N( )~( >R) , - IS/ 7#J4 KU`4 IS@i9 ,O9 _`: #,> @+e> S^=? ?TQ? "A D @I'F T\'F AUeH @-ڽI 7-J |jJ LaL .#'OR 9'OR R @6RS ?6S \U >5wW CX 6? JX C7uX G\[,] ?SA] Z] @5V_ J`` TL` 6A` 4`\Aa ,"c 6@2d AU2d 9]cg UI7"j HT2Mm 6"+m "3n 6I3n n e?p ?Se?p NXܱp Tv %~}w 0&6y _`ް  !3. W`F, ## @T# MW GQ "S yS 9L OF ,"^V +!^V 7# @Lj; R]} #+{ I\ )L| HRvA :&s G] :&؛ 5@x] T\, 4 5"cΜ W`{ %{ KA~ H^%$ AU/ LW ] I\` HRy 9] @LD GQi .A JT5 @L5 @I /# W` G -I) I) @K> JTx 3>: KU z AI' U`[a ,A S^ 5! .go MWc ,[ 8O HR%s #D_ J >RJ Lar 3ʁ 6@ @L_ -#9 9 9 A. La0 *5J> U` ," JT# R   G\ ?Sj 7,| LB` 3 @TQ "Q K U`h !F I\F J`F U`8 >5Q- NX@ V_D +G _` =4d @5h 8$ MDo 8$ AK -# T\ @+< @JxS 0&~ 9], !* ?S 7L:R "! #? T^H 5! 7L I\??! 7L^" /:# +!$ \`T) "d) KU- .- 7#V}. 6n. +t/ GQ`0 #1 6. 1 U^o3 @5&6 @LA6 I\A6 KUZ"8 ?S "9 IS "9 _`; _`; JTj< LaȐ@ -UC JT_lC "_lC "D 7#E UaF T\F La+F 6"oG J 6AtK 8$cK W`L ,iM G=:O O >RUP A.gP .ׂP + 2R @5KS I\KS ISͤV 6-E%Y +!E%Y * oY W`K*Z \ T\%P_ =^%P_ J`Dp_ +[` 5[` .La .$cb Lac ALgf A6h :&h .k ][pgl ..o -[Cp 6?Vr LaVr JT Pt w 6I9Fx C==~ ?`=~ J`tm~ ~ @L 6?, >6, GQv 9%\ 4 6+ +4#z I6 ,5 H@ 5! /%ΐ 5#j& W`\ @5 I64 6AL] U`F @Kgƛ 4` /% 7#g 4!g :&g 3 W`[ 5@§ KU %  AK/t *5洯 JT TLǦ @^k 0&^# 0c޸ JT J7d H?d HRlռ  GQ _L* AG +!3 !*i # @J  6"+ 6*l :C +! 3 6. 5"/t ,O -# ^_ KA @7I: >! @IAF /%N 8" "`2 +c * ,U *" ][X " 7- >R3  ?Sz "7z ?7ڨ R]* CAc.$H+@ %!?*LaܵJT4 R]F :. @KQIS +W` +I\yeU_~A7`UMWF][8  ".$$%6VU(?J&* =-AK.6?.:C."C|E/|E/JTY36%n5)r5,5?6e83e80&i9R]9?S9T\;T\F=A7do=5#'>\8L>4 ?#??C-?*5gC)GU`;HN-;H0&2J"0`O"P"W7#kX>XW`T5[LVEf[>6c[6+W]"Q]7#3`S^3`>Rc-Dg+iTLsk@7ͮlI\6n6.o8$>p) O{pC.PpPp@6rI\oLtU`tkv6+עwW`~{.|GQ|=Q}=Qc~%!,I\U].θ3݁?SZGH,+-of/%,І-CE?5J`xR]>RT\ۏI>,.mKUmMW}5!}6"}7#"IS"=Q>WKU>WLa7%M%@T4AI\6-द#द:&FȦA=rKUrAU7R;A60.7!ݸ/%=b6"b6-퐾H\#6*5(LaET+!)6aT\,JJ7-@K%@T5,o.9s.uJThx*A.o6-9UC&3=HRA.@KI\S^I=6+L+n.#ݔ6.T\ ?7:O#][^O"^jR,A.4UIDISEGQj-#6":&8C/%3?63@6.ԫ/%5#wK@56?zI\-#V6q=QqTLϖ"k II"H@/'?5$)U`$-HT-bo-O.W`1!p3La4AJV65V65@7t5A.6"6:.:F7!V 9DX;@IL<4`L<4Ir<MW>5!Sc>U^(C*5GT\J MaPU`*IQ4 ,RLaS{W-#WLCT]JT?^GB^R]`.`/;4a;4a5@dU`2gl%Ml"%n"zpKU>qNXqsJUsM`sK]iv,"v>+҃wA. wMWoyUI)_{"G|6"|,"ݙ}I\L~+ mDXׂT\?TU`g=4GqW`@6_-2-#pp#D?56@ꠔR]Ĕ9L>-#T\!KUE`T\E`HR@7H+٠7@<6?W/%W.9z+7Jί+!Jί3β-Ҳ8SKU̻* e,c!*#+\_R]uH^BI\)"JU4%@T%G\%?SA8$vH7#qx6ITYNXvGQ4>{j6-=T.5@HR?Sm6.η6.lA74`hN][hNKU1AKt4 5>MWAUKU?S#,>@+".o?SNX:Y@JnqT]sH^@7n"-#w+w7##,)"#.90K?6K"5 *"x @5 7,P "47%[@KPT>A7%VV6".ҢIAB#7 =Q!*)M J`j"=$7+Jr$9&6.0'#H%(-!(UI!(R]%X).%X)+*AUvm0T\@"37#:%;T\J>SHh?AUh?MW:CLa+I%^IR]BdI4)6I7+7MNX3MDOR]OHTP>TQ4IocR2U-CYG]_aZZ/%=[)Uc"cLah3d7e MfEf.%gKUh+PPiW`Fi53j6-yk+kI\nT\bn?UoBK]q7LVqISRxAUx6"\zy7++zT\qz"+lzxzTL|~KUCU^*U`*@T"( 7#8T\e>4BJ8$,zDXzCM :C:͢+7@7NX@5@6A8Ua)>c׸" _`+AIQLTј6"ј5!ј," 53(8B_`T\"CG\8.3*6.Kg7#Kg=3ptW` =I*U`*MW*ISc."GG?6)"M,80P@+-IS 6" ,"0&b6.KU6"hIS,LaW`Gq)@^_šJ8š/8eu W`- w 8$7,Z5uM:K" 6.J#5@S$,|,%DL( ,_`|.07#0.o1\^hp3IR4.n9J`9p;+;@T;B@@7.@7A@_`E@>RSB% yDWD.$D>GjE+"FLC־F4 LJ"ZN7@νNI\νN>RjOU`oO.BP?SKXP.$ R-#R3RS0&;T>RJU9%JUwULC7%Y@7^+!cUae0&Ge4`f:&'vg,KhU` l"9(mA7LmUaUo%p+}OqLa}OqAUq?SPrI\Pr}rt5!w%7wxT\xz+@j {JTj {G{+!t~-Y}H5M>TM=QM6?m.#v7=^>)ۋ\[U`G8$GI6G0&7U`BŖ8. #"JTb@6r%/%#H=^q3?S̐"葧6? ©/%V6.R6?ɰKU> #?SDI6[*L@ķ/.$B&`4RۻHT:LaO{La%߱C߱3߱)1?S1GQSC-+UIc+ >3LWWG7L!KU xU? xQ?!8$Nm+AJ`*C.:CHR?`J7+!@U'>,m1C1"%uKU#G',"AJ6I}>+},K"|7/%" !צ LC2 T\A La17+MD9K LAXC"X.X-#cTB.i IU`IISh=^v&?I,UaI7#o+!o,">!LC.9&6"'W`'@L(U`2)*5*T9`,ER.@5Y$/KUb300G]0R]0R]0R]l84T\5i^5@6H;[1=@+3@6"@0sA6?sAI\,`B H,`B"7{D9%&FISG"G,G#HH5@#I/JLVJT]HuKJT^O@KUPCcSKUcSLaJU@K,xU)U- VKUVJ`W6-pW.r[-ZN\5,'\@6+]3+]#͊]U`dC_%9`A77 e7#OlU`lAJq9n+!go#5]oISRv:&w#zQzQzef|@6[c}9T}+~9]J'7#,6Is!s+Ғ]Jd^Ƀ=^R,|T]UCB"m.%z>RzGQe"AUg,"gd/#l“T\Ǻ@TcI\c?S).mJTЮJT@^ɠL^}. W`I\3%AIᅤI>f\[~I\&T\cΪU^3 UI߫%35)ԭW`I\T]_^WTL,ZhU^6@+u,܃>=.$.#vƻ"cU) %7>Qc,e>eI>U`aA.cW`SGb.7@+7! %9% %,W`8$6,6%rJ``+!B%6-5*R@7R6.qR] 3"G9LG.Q4MW^+4#6KB @Lg5*VTL@5?5:&OLT=Q5!j!,}gA.}g*  AUh:6"[]H^[]U`]K]})"n@L L+q@K,"@ D:%,i (I\P(A..(U`*".*,^*W`-=Q.NX.".#7/T\30T\.27#K2R]3R]5U`8-^@7@3?A`ThE0&VRG]BVRGI\+I.I"M?SSRX6.^Vy_4 /Zb7#b.#idR]fT\mgI\{jAJ?jJ4>kmNX8nL@nnDLnsC.`z-K{:&+{p|6? +}΅MWV@Td߉6"D>%mR-?F7#^BL}?SA9]A=QG[wH^[wCW@#.*/T]ٗT\:^3AU/ϙ/ϙ7L!:3.V`#6?Sj7A!!#.>RޣJT@THĩ^@6-`HR`U^妮6.妮3,5+ ״״K]c-o>R"q6.MTL Z/DD".+7$2R]4Q/#ƾIS)~TLM7-5,*U^$3:C 6"Z%>4OGQO_`N#@+=@TU`6IJT?`6+d R]HRU`I 0&INX@?S>HT z%O>RU`3La=/:9]6ZW`n:&v . . /% ?`h AIZKAZI>F]g5*jwKB@T"I\"ECAD`-a,+6<W`La @+rb96+H8-!@K0%3%5!n'U`n'IS)I\*:6_+7#ey-"=<-"<-,$.U@s.8C.@616I39%446"^5/%6?Jk7#9=Q;%>JT-?.RA%B/BBA.D63DA.3G=Q3G6A4I@O6"RP QB7^AW3X?`YB7?ZA.?Z,+[@TI\0&8_`+ aLamb3Hd,"׾k6":Zm.gsKN w6? w=4EyG]z:&!{E!|IR%}>Ri}5?-!BVO=^eY$-6+M,G,o,v&J7I\7=?F"U^1MA"-#"43q7BE 0&E "EA.E* vX:+5!&3+@UISڬ-#+"%j14`7Lp+ o!#mS"I>Rk/:\dB8C*5!SHM+.94*zP+La.פ"0&"7-X,5U`K]29=@69/* qI\">RT\7O+!07VU`|+4W`VI\sH^sU`sT\sS^)8,* %@L%GQ-@7AUV5+^La>HMA. .j +7`{ u ,! 7@T\"_`Q5&.KU906?.<@5W`"9%t"MWӖ#^$IR/%A7/%'7-)-#,Z.CNZ..AM/?32?TI2933-#04@K4-#5La'5@56KU;#9;^`;;T?HR;T?0?@6)<@%@?S@AU@La@JT9BiUD+ FDXI?I!IA.!I,IR]*I+>*I5!KT\HM8$ MBV!N0&8dRN9ŘRT\ST^HR#ړ,">:?6\%y+ {H^JUa[S^[9]O8'A5')5݃++F\S4+"4䎱W`0}UI̵ͷʸA.,#La@TpLa#1" "TAUy@T4`/%5!/AKP}6"C8CED9)35}tB7õ+N,-5#p7-VC. +4@K4NXǣDXoAUoT] _JT _KU _AUD9mJ8;@6T+j5hLahMW0.%h-RI\E/:LA3!)R_La:0. " 0&0& %% =^"V6iT>YC"=36["88U^6"y8Y6#!@IS3> 0& 5! @H!S^׃#H]#P$T]!$GQY$"l'@6l'%+G,?S1{,),T^p&-6"p&--#)-9%0/+!I2H^5"7Laъ8+8@L.Z=B]=D:=3n>LDn>KU>#>HR0MBKUBB_D.$GH^H.H,ʫMGQʫMDXA&N>9NS=ȁO8P/%DQ:^^ST\SS+SS TL@U6>[7R@\6">\IS]W`T^T\ybI>Jb9%!cGQ!cU`p d6+O@d@6Ae8ANeKUe7#jhh@+jJUjMWjLatk>Gl0&Ro.#pabxBVNGx Hx?S4y?`9yJT _`߁;Ň TS^ T][-ՊI\-Պ:&OMW0X7#J`/HӏF-+K8$W`X[ATmїU?G :C_R]뜚@7_UalI\l=^+-#,4`z,iš,5!@6fT]I@60&=JT3NwC^DMW^GKU2n2n>R +(@ѓW`X+5JTH^z4 @6"?=_O=^4,8H@%.9@7Q7MMXO*uI\TLJI\xI\2+ )A6)A.16A+7@KUw7+|G\I\,GMnTLFXBKU08uV@K"hW`7!DJS}ZH@}Z+@3C@4 q@TX T\,5i08B++`t#"LaJT&7#AJch%WLa= 8$} 6? *5{n !3ZBVZMWͯn8I>W5@WIS@iAKkLa{9#dI\~J?S~JHRI\4  "4T!K]"SH~"+!)$ Z$L7''7B''KBB'?6y(@ToD)GQ *W`_**!S*?SC.".ݑ.%#0>R2R=7MW8=9 m9:6.:R];+ jW</%jW<7# *=La>9C`CS>`C.ѳC\SdDJTWII!݌IT^7J.7J7#iJT3K,K#g'M* M?` NT] P,AU_LpU7L~X4`~XI\Z@5\N8 ]LC]@>]C_U^_HRb$dUa+fT\wfHR{j[l.# qJ`ƣq)ƣq-rKAt+ u6?-u/ly,|5>Z-5JT5ZAK5ZHR5ZU^>53>+ᒆLCݶ>3A\^?I>HD>3T\JT@THR]R]R]7#nJT!WGQ3\[9]88$נ@Lנ@K+*},D@5hө6Y8#r+3+@5WNX8@5W5]xIT}IRI\[.#]c@8/R0G9%G{=^0&7#La_`Mb6K9zm#!vW`PP"t,56IR4` >R MW ?7rdCOb3 "HTQiBV{r6+jA79]3:(-#U=4j-#mTLmHRdAT6^n3J8/8;0^GQ@5r,l6?LaUaAWKUm+" N9 DX,"DIT_|X@ATW S^W HR^  ?`6 )=-#7IW`dP>5>((GQR]ͼH@ -# " 7#Ԗ!][*"+:""ܼ#CS$>Tj[$JT<)*vm/IRq09]2JTl26"?47#͔49&89H@`A:*5:8$c<4G >.i+CCF@THR]I#hK+BL>[P.SLCS-#vTISBX)["8NaSGbIS c@5 cK]%g@Ln+hA6Bi.6jUaqk?SlU`wxm/82pqB]<rKU3r/&XtBVXtLawW6}{{ISu|8$u|3b}~3[X>*h?Ih][xJ`s3) [CWb{DLlʍ.$lʍ.lʍ#@r@T{La,"V0NX9TLᅑ7#U`b_R~6.CL}L@9'-X_LX\[ˠ).a))+!LChLa:@59]Lat!5!7>RςU`ς?S>~K׼C9xWпS^пGQ->MWG\%T\,43+!/%~%X* La36_@^BN3+!oA.޵ U` GQ1,"1"+<JTZ?ITLa\[BT\^t5!^t,"eT]tISt9]@Kr5H?.$zU`6.\%B8A7@L@Ka  V 6. >RX G MW #4 7+(T\GIRWw-#Sz-CXI\BL"_#ώISc" 7@B!,"B!A.vx"-"!%T\%5@LC)"C *)ê*AJ-6+%W4?SF8T\u<+>W`Z?.$Z?BA6{BUa{BI6 }B)7pC6-rE=GiG^IqtI_LJJ#{KNX)MAU,PP@5P6"SJAYTDLGUWDW@IX/%`XW`VcX\[< Y7[HR\@Jun^ISg^*"Dsbd,q h7#Dwh3'ai=^ j-U_l#5?lGQ`m+gmLaYp8Yp0&0sW`sJ`Ct?ICt=Qt@"2v6.u wx?Inz*30~KUэ~ 6?߫:=3^-kLW7/%77#W`BE7L,U`HAJ6+4|K]|AUZ.?SQ-#Q"7+!ѓ@+9%hU`#xUxU*5ٛ,"C&gUI#I\~MW9@KLHRLT\ La|:AUro+KU9Ly) >+6?r .?HReNXt. #_I>eLaeGQeIS`.$2|,-`AI*s+ 2gKU) %/+"A0&;JTkLCu][kwU^Ľ'&@5*>W` TL T]^#R. @6`S+`S5!\8XS4>_`NiR]qI\ n * yLa7#"^L^LCK]hZ#͎.$7#|! @6Q#NXG&JT+6.9-DP1+,w2#v3,4A75.@6GQ9r<֭=KU֭=5@c>HRc>I\c>?S5>JUz?#?>B6.C* C*"O4C?SCDDT\HD>RoDW`zD@IFL^$GG\J6"MpBMJ?)NW`0OS=IO@5}RU`T9]JVR]۰W@TGW3+Z6?C[AU^[/:\LD~8`a+cJUdI\dLad+ di j6?Uk@TUk6I~kMBRTlmA7n#!=p6"6sQUsITZuAIl}#2^~AUJW`W`@5a4 K]],>F7LsA6*,#,TJ7/3+ Ƒ3@5s0&5=?SɕIT%LaJT@67C5@eZ˙+S9%S"ǜ, C8;UCʊ)@0&e4)aLVKUpز"G*][BVLar]"4r]U4r]=QAT\AGQAR] %``".``0&5)5=HHR6#ɾAUb^` /.#88C.1AJ$6&1?`zJTbLabBV]"w6-n?S..=QP4#/T?`/TU`kU46.y/?5+I\j-OI0&T@*W"X,X* x@T+!w]` U@4#4W`R]i B9|-#U^F6"-N,"֜"6.+6A +!( 6?w6)͖3X6?t@LtQI\Pa-#".59] 6I KUf!9]"-#"C\W$7A~$H^v%I\=N&W`V&U(* Z(TLIb(%Ң(7-o)յ+=I .B]0k1?Sr3@7I4*647ISe7"k@: :La$=f>GQA5@A4CGQ_-EE+!E5!0E7@H."3K+!rN3(VO-CSSTMUUT\,W!XT\XGQcY5\R]5\?S]A.B_K]J` a@7pdcG\cJ^od0&ef+!bhJ{prH=etD#v,1*x"y5!y7#{8Bu|6A"7@n.$_#q{+ 5CWe] Lߋ/B6?,K]=32\*62\#6R.AUMW`$,Ѡ"2@5-! 6^m ]̝ɞU`Z7#:¡ѢU`6?=^x+x3U@L@%R\[׭.4ܬ +!8o#Գ+#BVh-#LV6ApLU%(ISb+NA7 uT\I\]<W`DO>RWUakC=jM7+<MWQB]La@+!,)B7i5*B7hU`ADHU`:^}s6..$3LaZAI+4/nNXK@67#,#ANXGSI>B:&B8# TL-#+J^n 9%dY#  HIRei^J0>3B)O@^.KU.\^ G?S,.5 U`'#IS'#KU'#6@r)#-#\#TLS$g$@K%!6%=I[(?SA.>6A.,0?5F1F\7386:.$#?KU(B@5J&CU^VKCVKC-RCR]rDKUrD?SqtD7#D%<EC.E-#`F3HUC08IT\;J+ KJ`9MJTۉN5#Q6.կR%SXMSIS#TIRaTzT=^|UN:Y`,Ra?Sli&_iU`KKl"KKl+1mvn%G8sKUzs@6*sJt}wTL x%zAKn"{3+8u^[-+@GQJ-5!.1!1Ύ?I-#&AUlKU A9]ζA.+Y@LA6AZ?55@IRI5{Р?6MNXx{W`tDXC.16.AAJ"\I\KU?SISB]MWҰ@LGQG?S6?‴XMƚ%U44)Ҟ#.a=Qu]% I\,i/%IJ@yA.I\[LaS6@KIS4 4>GM%Y+A8F6"U`J` A..#>RVT]6^|"k0&kpC 4`@5+AUI\KUHRPKV6./?S[7eMW475@#@5},)H5S^H^~*6_`_L4B]U ,D W`r=^n7W`h@KJ>z9]T#A9:U`,A -MW.$pMWUp" "%i#+ `##6%A6)&8)&".Tk)LaLn*U4\+9%4s.6.u1$-\2As3.'/46"Y5@5%7+%7C7*5\8".u8#L;"4<+?"EI\G?6?H"H5JKUKLaMAKGP HRRXRK]\SAUST0&ST:U+U5WNXFRWLaiYY-#ZZD9nZ>\]%v^l_@7_MBB`I\`]U`NX&`bLa bT]0b+bKUbLad+!eLUeag-ohQIMlMlJTvn"dpT\dp_` upU^ up=Qzp>/qrC9r$"@v6",wN"}} zJ>)*=s7+WI\]?`l8l"̑6"3"AUP5!߰LCLa6"8Y?T""'Ȧ3!=T\=KUұK]ұ;"4;U4Y=^Ų"Ų,z{La:R]D^+4\%\5!MM@T#TmAU,ڤ4!-#=5;}!8Q>R@Tv_6I)I.#,*A.pG]pR]p=Q[I#+O][NBVl-@6 ?THi.#2a=Q2aK]8R]35?&@6$>RISS^d  JS/DK]r&D+D* ?SxA7C0?U0?T A6R@L/%&MW|?5?R].LK,"^T][y6?~~!-U_?!!6e$%$W`%#`%La%GQ%5!|&LaR(,"6)=Q*?T.+G5"G5B6?S-P8';T\+ <TL<7/<.=/:T=,5A9ANBLaeC-#C#8[FI\,G,,GA.|I#_'K+pKKLaKN!hP%P?S|QB,Rj+!k++ l.$>]m>]m+!q6?qHRq5?N$r1x@T;z`6.r6+e4+e46"ՅdQ0&hLC}t6"8@^gȋ@LuCsJTL.Ϗ?54I>~"sY6?W֘#U\Ι.\Ι-#i:CdI@:CҬ,"CA7y>T3?`I\6"I\(+E4`EGQE6I2`@IfW`i`SH4)'!6'*66" JT=+=I>=A7A@5QR] A7-# >G+6+h4 h,"P_`gJnJ`}P/ވLac6"{:C:w,8@@+0&H@p3p/%c#N+ 9J@h5!m!Na8C6?)x ISt+"+9]!3$Z7#B6._@U 6"9L;LA),iUT\@5AT?S >RkA. * 0&mw3+]La|[UaD@5ϽJ`7,x/HTx/NXO#+%_*"e"[^$w"/8W#LTQ$"X &J^,T] l-5!x.T\}00&T1+=4#5>6T]BC;7+EBBIJC@TGGJT{H#I5+]K=^eL"LTL%P4I)QL^BTliTKUliT+@%MW3{Y#5{Y,5a-Z9]d`%a=3bU`ieLCg[h0&xi,j.k6-k6"n,"eoIo7Lo#+,pA.,#r".1r3+uCWTuG\-ZuNX-ZuISNu/:/Sv7LOyDX|4 ~+@~H*@5/@6=Na=DX&`+!%܆* p,:CE5@E?S5,>X!)9/=ٌKӍ!*0"I6+YIUӗ>RPڗ!ic?72"ʹ9]Tٜ>j":6'ĥA_9NX!7@$MUO V|MU`|MGQLcKUqN5!uKUAIIW6Az\[p0&6+8$t_=^ =T\-#0&n-#k\H"@+90I8)'+,"u7TAsJT7L9] 4 `e6U`?w5a/%uK]LsnITw8$)3=)o+.9c+ }hA7T3T,VNXE7Le6e3+KA@65@7B'+[6"KUUT\-#.!O4/#bJT{jB]@ W`S3 6Ae KUUf J`W @T $:U" 53 + R B] q '  =Q$ "T  +r- JTa Na U ," BAh& y' +!( +"j( R];) 3[2+ ?52+ -#2+ 3, +7.- @6=. @6z0 6"=I2 5!4 #S8 `< ab^= .#^= 8$_ > + C +nbH *6H >RH ]`yMJ A7~L LaL JTL =Q P +XQ 9.R T\ʄT U`{V MW{] * {] 7-^ @T^ 0&Pb )c /%d =[gh "i 6?n 'xn ,'xn .r KUoy UI1y "T*z @+z I\| | *55~ * F F -F 3| -# + @6+ !+ "O , #+t .Ɣ ][Ɣ @4e# IR4D T\W 5!k 9C 7-<\ # R] .9 D9Vʏ T\ " `U U`˂ > S :C] #Uj La "m 9Lw 5+ La TBFL 5Ax E _LC bac /%B %ν .$̯ AK A7 S La ? T> / 6"4 N-H HRH NX +!y 4`[ IS[ 5@xÿ U4 . GQ`4 3>, %:, M:h 3* La m +k /# . B +. +! 5,S[ 5@O + /%F ?6 ~ @6+ 6.[ R] )eQ +!c ISc B]c KUT 6.-p % "w ]U-0 ,N LUw = 7#4!#T!* !4>!KU!<!%D!G\D!6A!#0!7#0!.<!H?]!,Cd!GQg"!6-1h#!+%!La2(!JT(!h*!?5m+!U4> -!+ y-!6.W/!0&W/!#/!P/!6"[1!?U#2!@K 2!:&_2!T\_2!U`2! =G4!!3aa5!"=o6!>Ro6!KUf7!R]68!T\v8!J7^:!3h)"r!=3|t!+gv!6"w!7#&x!T\y!Ζy!KV}!GQI!#!8M!#+!7L!U`I!La^!>R]!7+Bu!KUG!#,!!A7օ!6">!$/s!K]C!GQ&ߕ!!+!6Aӡ!AU!@5!.$9!A64!+4!* _!][i!+!ߟ!GQh̠!!?`!U`O!!@D!.:!.:! !7+p!8!"!* ޺!"Y!Lame!.=!W`!@IS!Z(!>+Z(!)!_LŖ!+4P!* !7-!w,!_^!HR!?S!.6k!"k!5!i!W`l!,>!4`!?I]!KU !@Jj!!T^v!,5t!-#t!6"!T]!GQ!6I!IT!8-:"!UC(!*6!!6"8!ISQ!5>5!B]!@K@!8S!'!/%'!C4!0&)!@J=!5N!A9Z!".!5,!!KU[!?S[![!I\[!+4"6.6"+@6"KUn"*5ݑ"0C{"AU9 "TL "7#e ">l "? "TLeS "R]A"MWQ"MW"AUQ"C"7+9B")ǻ"2"LW "/["C9"#"9%"7-( "S^( "KU!"R]LX!"5#5D#"+WI#"T]p#"?S%"A88%"La8%">R&"u`'">RM("MWM("AUX)"I\)"Q?)"JT *"-Q*"6*"T\!,"IRdK1"4`2"8/Tt2"V2"",_4""SD;"+SD;"A.<"CM`?"7LB,A"LaQA")>A"LaMC"C"D"6"HxJ"#L"$0N"HRqN"AJ`O"TL=NP"U`xP",RP".$@Q"MUrQ"?TrQ":T"KU:T"B]:T"MW:T"?S:T"IST"T\YRU"W"@5\"J`v]"39^"#9^"I69^".6`"6"`"v5c"v5c"A6 Cc"+ "f"W`f"+ f"/% f".g"@Lg"@7+h"-+h"4 Ij"@Ik"NXq.n"!hn"+q"/%r"".%v""-}_x"I] {"L^|","2}"7AV}"7#J~".9Q~"I6"UaC"6#Yـ"5A"NXҁ"'4"+ w"W``"@5x"Lax"AUx"KUx"?S/"0&劆"B80߆"!*c"7#$"o"IT~"#O";ݒ".;ݒ",tp"_`o̔"TLH"TLԖ"IS"7#"-#c"AUc"T\c"?SX"9]X""oř"WJ"R]"dĚ"MUdĚ"NXtΝ"@LA";".$P")P"/%Vѣ"H5@"-"_`/"8C/":Ct"I4@".ݧ"+ݧ"@6\"0K~"+7"Ua0"A6a"5@N",غ"3>+"/:Ͻ"#Q"L@#"La"JU#w"_`"~"?SA" )"B8""F"KU$",ں"K"6#Bx"hh""a"S^%"W`""6"JT֋"TA"RS-"+7Z"]J"H=s"6?]"%O"%Y"#d"=Q" ">Rl"_L5"+7"5!q"MW"U^x"AJf""6>b"5!] "U^|r#BJ|r#_`#8$#,#CΞ#%#IS,#+!#MW+ #*+ #*55 #U^5 #=Q #M8C%##T\-#"4#@K9U#n#."F#CF#+!#9%–"#>–"#6"S##"C$#LaB&#B&#"8='#+!ݬ'#7#.#6".#Ua0#w0#4>2#I\0 4#+4l5#?S5#@5׀8#8C;#S^^B#C#.8E#E#8-XK#.SL#@JL#-##O# #O#"NP#,"TP#".ZP#BV0T#6?ԄY#8ԄY#/%fY#.4[#La4[#T\[#J`\##w]#C]#TL*_#6C`#+ e#*f#KU f#,i#-#ij#,"Dk#JTl#MW^5o#BLmp#"4q#=^s#+ {v#AI2w#I\ex#6+y#6?y#GQ:y#GQ:y#T\+z#9%}#)~#+@a~#6I#H^#R]#?@FT#q4#7,9#8F#3>m#6"T#>R0^#@T#W`N#"#J`'#MUMM#C#@+#6.d#GQ#.$r#+# Rd#ISR#Jb#_`?#NX?#AK#?7վ#=#IS=#6A=#GQy#LU\##AJr#%V#%#W` #0&kE#GQkE#5@kE#9]Z#"is#][-#A. #I\ɉ#T^(#J7&o#T\/u#=I_##G\s{#-##7#v^#Z#+t#JT#*6M#LC"#7@"#J`{# H\#0&\#"Q#4`Q#RGQ#@T#U`"#5$#.(#D: #I\-#6"#"#I\q#+}#I\$-B7$KU $.$ $! $"8$"IU$"IU$Ҝ$>5)U$ H$0&1$^U$69*$@7S$U`Ʋ$-C1 $> $Z!$W`M#$I\M#$LaM#$GQ)%$+O&$7@ ($,($,$/%8-$K][2$—3$IT03$J`4$/%4$.$4$0&4$. 4$5=_4$4I&5$%u8$U`F6=$6?7E>$6@i>$Q?>$BVj?$0?$X@$#߭C$+4xXD$6+GE$.CGE$@+F$5@gH$GQyH$KVrH$A.QJ$@T,P$9]]Q$,#]Q$".R$.SzV$D9;X$LCt%Y$A[$IS\$#^$3^$JT`$T\db$+Ve$T\ f$GQf$>Rsvh$U_Bi$@6%j$0&wk$I\8m$7LAm$B]_%n$^_%n$?`ko$,"p$3>5Ws$=Qx$IRLy$)4y$^y$Rz$T\1{$AU~$-t~$IS$#R$>#R$R$ '$,$$][ߒ$Eć$D:g$p$+0$7+n$R]4#$0&؍$-#Ȑ$6.2+$Q$R]$+!$H^ם$A8͠$^[t$.$B$.B$LC›$KU4$CU4$?T|z$U`e$JT$+$#$0&$*$_`X$MA@$^$5@$>}]$U?$0.IJ$^=$U`$?`$XM5$m$8$$.$0$La$@Ka$"$R]:2$$5!$@7T$+!}$=A$* b$&.s$?`u$3.F$G]$UIa$GQ$B7 $I\P$A.$U$T\~$ $MW $S^~}$?S3$8$0.;%LV`%6?%)a%AT%9]f%A7I%I=. %#9 %* %@J[{ %T] %L91*%,%.,%),%@K,%.9VR-%?S*b-%5!-%),3%+4a3%7#$3%+!>4%=G|4%BK9%La9%9%:%ISF%GQF%#F%9F%JG%KUy3H%6-EJ%ɺJ%?SɺJ%AUɺJ%LaɺJ%JTnL%.$N%+4Q%6"@kR%+ T%+6 U%) V%7+CV%/:zX%*6[%?I[%G\]%A7P2^%7#%6^%6?q,`%*5?`%6?Ib%>Ic%6?d%@5͢d%ITf%GQ,g%IS i%JTi%86j%#!k%k%HRk%T\l%l%3)o%La͵r%JAx%L`~%4!%D9}%% %M:]%67%I\7%U`7%@T%".;d%%%KUɏ%C؏%N%*)~Ē% ;% %K]ꌙ%-6%%+%BV%9#נ%AUJ%Laҡ%LCp%@K}%F%#?%_` x%+@V%G4%GQ#%?SD%7C#J%8$T%+%GQ"%:Cg%T\%U`{&%IRs%?%%SGڵ%)%,"%@+nй%-#nй%/%B%V%@Tն%+@d%@Jd%=Qd%][ ]%6.q%Ua%7, %d%#>{%A7{%0&%., %La#%#%8"T(%9L%ITۣ%+!q%!*%6"ˉ%?6X%9%u%%6"%.hs%#3C%א%?Sא%<%6?^%+ 5%%^%A.8k%7#C%C%6"C%+%%%LaP%U`%%La%@5%,"%1%KU%9CSE%IR5%DL%S%3Z%=QZ%G\.%I\%R]%JT%%k&U` &U:}_&La&NXKu&H &+bJ&6Aݫ&,"&6.&6&I\^&AU^&@T&"&&6. &!6&NX &C9 T!&MWKw(&IR:*&\*&>+Y*&La]-&GQ0&!2&3&?64&NXF6&AI7&U`9&+!r;&#j=&U^Tm=&" =&62A&R]E&H&A7XEJ&,J&=ISK&"CSK&8$K&,"K&6"2L&6gaM&5@M&9CLN&D9EO&K]2P&+tP&@^_T&T\ƬV&Y&S^Y&I\Y&=^Z&U^][&@64 ^&H^4 ^&I\^&^&6AD`&$a&TL&a&7@$c&,Qc&V_¯d&B9f&.f&@5Am&\Ss&J`qw&?Sqw&AU}&}&@I{&.$&@T&T^&MW &"Ї&I\&8#m&7Am&IS&T]&+!&+ G&-"&@Tu&36&HR&?JЕ&N-Е&9%T&GQ&4>\ʚ&JT&H= u&"&4 <@&T\<@&U`<@&R]`x&J`&6t&7@qF&R]qF&CW&7,*&7#&6-mګ&!S&T\&=3X&)>g &>Rk&-#&UJ4T&@UZ&x&AJ(&6?(&I\p&"4&A70&IS&>b&%D&LU<&4`&6":&L^.&)&^&,S&5,&^`&GQ&#&/. &MW &JT &AU &KU &La&.$&,"4&@Tw&I\&X& aS&?I.&Naa&BU&+P&K5Q&*6&-&BT_&.h&La7V&J47V&T\&)&.kc&.A&*5 &La &T\b(&&?`! &# B&+7@`&#8N&UI%d&&>R9'".9'9%â'']'LCQ'J> '9ʣ ' '=G 'K '\['"4>'H^r'La7r'A7.'I\'B7{'#c'?Hc'?`P'6W|"'* "'.#QU#'+4,$'8$%'@^r&'A7)'+7fd1'@5D4'*51"6'I\k_6']`6'?S8'U^+:'>Rr;'5,='?S?'5@j@'U_FC'JTOC'I\F'"XF'6G', H'8#j}I'|I'U@qM'?SlN'J^O'xR'5@>U'9Y'!*aY'-F['5"ԁ`'@T'a'AKb'5@Jh'h'%i'6.aj'#k'3n'n'NC=n'NXu/q'KUs'@5u'v'#/v'I\w'@+y'z|'@+}'>R'@6׃'I\׃'7Lq'9'JT''@T?'6"q'R]'LCY'A7'K]?g'A.-'0&-'#k9'.%'5@+x'`T馜'>'6?e'JT 'AU '9]ߟ'W`ߟ'I\A'5!$'I\o'.'!+G:'@6('T\'#'6A[''I\3'% B'6-M'=^}''\[1γ'5@['6?'I\/T'IS'Wa'#}'G'.9w'c'^`'R]'G]'+!'+'5' 'AT'HR'T]'AUwy'KU3'I\3'@J3'GQ3'IS8n'G]'.'5!'+'':&'6I{t''/%'7+W'&'6Iժ'D9'9v'DLv'NXQ'6Am'@5B' v0'5܈'6+H'K]''KUY'9KY'6@x'B7'%'7#+'8$1':CR&'KV'4 'LV (* (5!`(GQ`(W`B(.$xC(a (< (3=+ (-q (I>{>(?TK(@65(BNk@(h(((S^((=^((NX#U(+O(-)!(AU&(-#)(0&E*(KUW+(@TQ,(AJn,(3F'-(/%Yc-(KU=f-(8-e.(CM2(Ԍ:(U<(S^w?()|@(.ƲA(=^A(I\uB(5!"B(6"0C(@KHD("xE(\I=G(NXfI(#KO(#>kP(TKR(Z(% _(J``("Ia(*5a(I6c(4I?d(!?d(6"Fj(>I k(@L0bl(*6Fm(Ln(T\Ln(>Rvp(@6p(7L:u("=v(I\|z(LaLz(I\[{(G\|(KU}(@Ip~(7#p~(0&=(yۃ(#+gJ(6?(7#Q(SGwє(0&(,"<(^(A74(#כ(C9-3(6*6(9]6(4>R(Uaܤ(T\_(7-1(HR(>HB(6.(G\(o9(+!y(7-Qb(7!(9%$(+4㺻(@T("ƽ(>R{(?Iu(.(-(}u()(>(+!rZ(HRk7( (U4(8(AT(HRς(6"(Q?;(^(HR9(AJ( E(-(@+#(S]c( c(,( 7>("#(>5 (LC`(>:(KU:(6?t(T\0[(+!ͩ(I\((A7T(Y(Aү(=Iù(C(,"b(@5} (:C} (LC7(HR (>R94(6?ڰ(,(-I(U`X(A8`(-5(KU >(90)C)/%<)AU/)")5?)BV)LaqQ),5)T\)@U)+M )W` )% )@5W )7#W )6"W ).W ),"t )T] )%3)-#g%)S^w)3w).9m)MU<).Z)I63)6?0)5u))8-)8)8$+)R]4 !)8#@!)H^@!)HR!)4>2w%)*)!Aw*)5?*)/%-+)7L^-)WD-)-,.)S^/)A7V1)1)+1)IS1)I\ T2)JT T2)4`3)GQ4)W`5)T\7)@57))8)A7$9)C4:)GQ;:)=I;:)4`r>)S^[@)AD)+7AD)?SMF)8VG)T\VG)I\J)J)aK) K)OL)A.N)O)T\nP)3S)M8`S)5YS)lX)CW[)* [)@5^)3^)*"`)AURG*)+!A)5!P)5@F)R] g)-)2)?SO)"4j)6?p)+ӹ)-?Ѿ)KUK5)J`G)LU_)I\_)SGQ5)JT)?6 )-"X)?S)W`)LV[)@T)9%)#),")J`)$)?-)/%|/)G?q)P)5@P)cI)5@U)@I,)LA)#)7L )LV)9])B]<) )LU)YU),6/).))3)+).e)%()d)LCk>)+7 )>RO)6A#*=I**T\*JT */% *K89 *6 *-#*6.0*-!H*U`Fu* *5" *@T|t$*_`%*U`2&*8$cX&*?U(*-5)*GQ)*)*G\wM+*=3:,*+!:,*".*MB>90*LU1*@L1*H^R3*"R6*6-I:*La:*4I7<*I]8=*-#8=*.$Z~=*6IJ=*A7?*KV?*R]A*+A** yB*.D*6 WG*I6H*H*7# I*J*@TK*=^$N*,t|O*+ /P*T\/P*XB=~P*qP*T\QU*IR oV*@6։Z*"6'Z*>R\*v^*,}a*JT\ b*W`-c*LC@d*Ca}e*.#7|f*GQ|g*.|g*+ g*?Gi**3si*>R[ m*,[ m*)5.m*9T5.m*AUlm*-,n*n*AUo*M:Mq*S^A!u*.A[x*W`7~z*U`z*@T={*TLK\{*KUw{*"w{*!w{*7+|*>HH*LaH*?SH6*/8a\*5*o@*-#ZH*@5N*U^*W`*T\`*,"ʼn*@63*-#*-* *I>G*ISׯ*"*#e*.*3+Xr*@T *5,a*D=*I\{*La.*Ua5Q* *R]$*R]*^[#/*:&#/*.s**WǮ*LaKo*.*4`*.$h**ض*K]V*͆*%(*S^(*I\4*IS*KU`*HRH *^_d*+'*_`*U`*D:*?`E*UaW*JT* *U`*,>*T>P*.$F*%=*7,*.M3*5?2*@6j*@7S*k*MBk*7Bb*@+*# b*9]*U`*J*,6'*8'*C**-7*+]f+%Q +3Q +5  +:& +x +T\ȍ +@5|u +6"+,H+6?++ i+7"8+LT8+J`Z+IS_+I6Q +J`=W+@6+CM _+I\Y+%+4`+@TC+ ++V!+LA!+I6*"+@Lw0"+T])4$+D9?$+/#P$+W&+@K[f*+^0+CN3+/%m3+@K75+L^6+6A9+7,;+KU;+I\;+@T>+AJ>+AIGB++!GB++CB+#=$D+s9E+GQVE+B]VE+ISVE++gG+PH+W`UH++ :K+.$K+JTK+OyL+=QHL+-#L+3hSN+?IQ+LaR+I\4:S+?-xS+,T+,#eT+7T+.CU+AK=U+"V+!X+"=Y+6?5Z+5 [+6"p\++^+`+[=a+9%c+!zc+  f+@T. g+ l'g+U^h+GQ7r+LW7r+L^Qer+ w+JT"x+5y+7"Kz+4 z+-#{+IR5}+}+La ~+#̀+ITқ+6Aқ+JA++4e+4>+,+3 +KU~+%+KUU+R]18+7P+p+R] -+6" -+%Д+9Z+s+I\+#%+-#|+#h+6.S+0&w++W`ħ+#6b+*5-4+MW,խ+?5jB+#jB+,"`+ۡ+RG+6A+b+7Lǻ+.d+@^W +IT+U`뜿+BVԿ+,P<+T>ˈ+W`+"+W`+U`++HT=+d+>d+#AD++R+R+ +6+@+I\a+"iN++!>R+7++6-_+7L+9%+6"+`W+u+@T+B{+S^D!+3h+/#^'+7L>+#x+>K+R]Q]+,"#9+NXGQ+@5px,5!px,+!J,"o,"o,8$,8$,.ѓ,6"; ,.; ,CR,9]R,R,NX(,!),Ua$,>3,C0"E,8,+ ,,AU:, =,-Bn!,6#$,-$,IS&,">&,Ua>&,JT&,?6',AT(,IU6}),,"*,U`,,.,.gY1,#2,ITz3,6v5,+6,C8*:,*:,?6<,JT>,@T>?,D9@,)4A,0&1#A,QID,E,E,A7 H,DLM,LaxQ,,U,KB|U,7##W,7@ X,-$Y,T\Y,:&\,T^D\,+D\,JA ],4 R^,+!R^,-^,-9m1a,m1a,I>Oja,K]c,@53Rc,,3Rc,LCxe,La]e,I\ch,A.Ph,7+afh,%afh,"j,#6$l,@7 Sl,@I$m,R]Cn,.ACn,VAMn,kn,6+Yo, wio,7.#Cp,6?r,,5r,*5t,,";t,6I;t,GQ v,WC3v,#Lv,>Rv,W`wx,.% y,?Sy,Pz,Ŷz,!ޜ{,JTD|,@6}, ~,I\䓁,?Tڂ,O,K],A6,@6,.,JT,0&1,56&,!5,T\,W`L,*6,6",/%,D9,%,a,ݒ,5,7,r,MW,H,4> ,,"ɝ,.%͝,IRߝ,B6],,),=3,X,R]ς,-#},NX,JT,I\,HR#,-{i,_L_,+,JTZ,,GQK,+,,1m,AK,K@,^[+X,-+X,#Z,U+,U_,u,8$p,I\,R]<,6#b*,T\tX,7R,J` p,,",6"I!,@6,F,B:,.9,_`,7#VP, s,U`m,LaZ,"Z,+I,!3@,6.P,G];,GQ;,T\B,*u,U`,%WK,NX ,7# ,5!A,U`r,,,GT,LC p,@T,+ d,,#<,%>,NXO,4+ț,@+,,Nb7,R]ZE,@Li,6?I,W`,-U`-LUr-RGr-4`r-?S-*! - -8$ -@6 -^`; -JTu-?I-@^f-4"-GQ"b-"--+!M-+ç-v-Lav->R-7Cv-T\A-B7w-* [f -. -H^t]!-LU{"-8$^?$-DL:t&-@^-&-%~(-".)-`U*-@6ۑ--"X--3Y8/-""0-?Sɛ4-L7K7-!>-TL_?-+r_?-L^%@->@-6?`K-R]K-5!+L-U`CN-5N-?J4P-4P-JT8Q-,AQ-6.S-H=V-La=[V-GQW-POX-4 [-7#]-U`aj]-@T^-S^|_-6-:`-J`?`-.`qb-+c#d-NWd-6"Ȕd-JTdh-6!h-&=h-,!h-yj-%j-?Im-A.Sn-@7 ~o-.p-gr-#Sr-8Sr-Cs-3t-ALt-R]w-/%Sw-BVJy-@Tz-+7 uz-H?{-3n|-'&|-q|-9]K-6.&-=I\…-#<-U:o-T\\ȋ-* -R]*-U`*-?` --Cڊ-6#ד-@TΘ-HR-#-T]Ι-CNԝ-JT߭-AU"-Uat-IRG-H?Os-LW-7@Dڦ-A.6"-XM}-,}-+!-@T -RGp--60-3+0--/%-T\O*-?S--I\-,81--, -6"m-LaQ-6"E-@61-@J-+O--3v~-;-7#-4 -0-B8-"CaF-@ -\[*-"---<1-4>&<-,E-6"mf-AU- !-0&-#-W`4-,4--#-7"g--6"(.JA..o.?6\.* ."\ .9]e .?`e .JTe .I\.I\E.R]c.){.KU{.MW{.>R.R]..8$."C..".^`).+ 4B!.6+|".H?j#.K6~1%.@7F&.F&.+k'.%'..#X).LaX).@KW,.t,.LaT/.T]2.% 5.JU5.M:'8."'8.@6A9.i:.BM[:.8 \;. \;.@6<.+<.@5C<.U^h=.?51>.1>.,"M>.#/?._`;A.=Q;A.7L`C.|E.,5E..$TF.#G.1H.IR$J.:^PL.S@CP.?6W.7#X.UahPY.U`?[.KUi$\..q.W`~A.@+_.%2...5!,.G\"..6..JT;/)/MW/>RB/Lar/5>^/U`/>RL/H?/#t /"M /M /@+* /LaI/W`j/5H/@6/.//AJ/6?^/l;/#uE/"3&/% /$> //%y&/4>5'/>6͆(/JT)/)/3&,/5>-./-#>//+ //5@51/?I2/#4/%4/5/IS4=/J` >/7#3>/+"B/CF/> J/5!JK/-#K/-M/@T$N/I\,P/6.kS/9%;hU/U/L7U//7V/5]hY/.9G\/AU>`/(b/La b/,b/hd/AUGd/!Gd/#kg/@KFi/5!j/JT_Hj/@Lj/H=EOk/T\#yk/8$#yk/-|n/+|n/Jn/C:A,o/4")o/K]f>s/#x/@6x/A6x/0&-y/5!z/:&z/,w~/6".~/U^/W`/@TU/,"/6?_Ά/I\/5(/I\/.9/=/"1/+5/-#ZԞ/3q]/@K!/=Qԧ/`U/@T"/G]4ϧ/.%/-"k,/A.K/UC_/DN_/T\_/abq/D:/@T //"C?շ/*6/JT/AUi/Ct/7#-/6"I/"J/"/*Ϳ/@6z/BLz/GQ//>R/*6/"p/"Q//R]/-#/@T/I\~/3/GQQ/"./MW{/LA/" /4@@$/,"/@K!/W` /5!/7#/%/@T/?`/`U/5?/K]`/NXg/.ϥ//T\fL/+@,/JT/L^K/A.0/#3/R/H@/:C-0HT u0-#007,40I\j06IS 0@7 0+ 0%$0"F0-#0=Q0CWL0$$0.%0)rh0NX0AU 0I\0'Y#0c#0-7'0'0%(0*0+4S+0,I/0>+/0/ L20I\ L20HR1201206"[306+30@630A6d30!6y30I\c70KU70+l;0JTl;0I\m;0ISU?0#ZN@0/%P.B0J?0B07#[E06#jFG0-Q0@^=R0KUS0%:X07#]05*F]0*6Bc_0?J1l_0#`0 g00&0g0T\vh07LLsi0+#im0MWim0I\%n0!*Do0.${s06I?Et05"{0{0?7J}0A7,}0%p0+䘀0#+W0%Iƅ0@KX0T\k00.#^0+00* K0!)9h0W`I000#5,0XBE0T\0+4A0M%ʛ0* sh00&0R]20LT160@607#a,0,Q0"J05@ 06. w030JTH0I\E0+ T0"0>Rθ0N0@IU0=3}d0{0-#u0dS07+"J0AU980+!J506?X0T]:90)0B,07#0+i08m0,m0I>07#k0JTD0@TD0JT0 c0T\090/#>]0/%x0@5V0@6J0BVr10@6›07L.0*06A%0U`w0iE0%]0.$(>0#I07LI0_^I0=QR0!*Y06.l0D@r0:.>0@L_0-#B0"0* 00@T<1L@{1 1# 1* 17 16"]= 1# 1_`˵1La1DXO17L_10&ϥ1A7h1?U1%| 1KU '1%'1=Q)1-O)1A.n*1%FN+1+1#3,1Laq11531A.h41U`9516.91-5~X:1A6;1@LYm<1TL>>1%A1A.BC1=42WC1HD1I6F1La2H1U`uL1@M1+ M13PN1wN1_^PO1%sQ1R1?HX16I*`14>$c1?Tc1TLK2d1L7e1,f1,`j1n1KUp1I6q18Bq1@TDir1T\t1IRt1HT)u1GQy11{1@5}1"*1BV1U`B1_`}Q15@?Ձ1Na/1I\V%15T1MWꖄ1=^A$1LA 1J81C16*z1HRE1JAY11+91/1JTY1UaY1=QY1JT1+ [1DX[1T]"17"~1,1@5۩17R1U4`1>+\U1IS1#"1RG1.1LU[15!Y1=31>Re1"e15!E1"ϻ1?Su1I\u1T\1\[19]1*6wk1?Swk1@Tu1691Ua91UI91La]1.!1La<1Q13*b"1,w+1r1.xy1xy1+1"8Y1R]O$16"K1.`!1][ 1-"1La1\[]H1.#W>1LaG1SJ17#616";16?1J^\1+71/#C,1%l1-#~1JQ1N-1U`1KU2-2JT-2JT-2U`-2SH2A72_^2K]2@6 2*5v290v27+224>2#2*5{2 2KUvy!2ITb"2G>"2T]|#2ISD$2R]V'2+%.26?%/2!52J4I52552  72%C82t;26IE~=2I\9R@2@K9R@2=Q6A2IS6A2_^N E2MAHcE2KUHcE2I\aE2@TIF2"^F2LWңF2-TG2 }H2@+ڶK2GQڶK2ISM2LU5M2NXP2AJVQ2VQ2S^#S2+!/S2I6/S2X2CpY2NXS[2I\r`2*3c25!gc2D:@i2@T1j2TAk2m2!o26.q29Lq28A#r2s2@+t26"IEu2!lu2Bix2T\wy27+z2".6|2.}2@TO~2GQe2@72Ɂ26+을2HT 2,"@N22/% 2.Ĉ2A2@5Ή2%z2LUe2@K42"S2.6p2#022.2#+ 20 2Ua2@T$y2NX02La2G] 2524` 2A>2@5A>2".72<2G"2*"G"22?26?nD2,}2}2=^A2I\|26-jD2MWA20&e2,"&H2AK2"25ܝ2AI32La2+=25322S^K2HQS24 W2#2W`\2JTͩ2.Y2"124 2)ge25!22#L2=IL2NXL2K]L2baO2dP2)'28'2.Ͻ2,226">2,"SL2/%SL2+92JT'2W`2.28vD3 3jW3,"jW3@5TE 3AU 3U` 3-6 36" 36-739]RY37#^3*6щ3G3I\h37L33R]#3I5$3.9I5$3D9cY$3&38$)3-#+3T]:v,3^I,3G\J-3#~.03LVn 139ã1313@613.,33D¶43/%¶43+-63T\-63KU83JTQ83U`:34 <3BUq=36"XA3#+KB38KB30&KB3".KB3CG36"\H3".\H3* &PI3A7UI3JT@MJ32M36+_1O3=^$O3T^UP3T]P35,"T3*U3?6\Y38#Y3+4\3La[w]3".}]3"ca35,1ma3_`d3JTif3g3KUg3K]i3=[i3?S>:k3T]`k3  k3G\vk33k3^`.k3:Cl3I\km3@6,9p36"op3-op3I6_Aq3"ۧq37#1r3@T5{s3@+u37LjRv3"8v3+v36"y3Uag{36+]5~3+]5~3@7?38/3&80c3+ /36?;83* 38A߂3+k37#U3Q3U`Ɛ3M53U`38`ٕ3NX`ٕ3U^^3.9%3TL,3",3,3* 3+@3KU>3KU3#u3I\&3JTq36"23J`T30&3wt3U`wt3B]ք38絫3+"'3-#l3\[&3@+&3/%V>3.D3* D38D3)3q3J`3T\353K]G37#[36K3W`3K`3U4~3 A3+ A30&3-#3W`3TB3+R39])x3W`36+3:C3La 3,73%K3"R3"R3* (3T\(39B,3,36" 3?Iy3W`[3C3D93LU%?33W`·3T\3@63ً37+23A.M3C3W`B3? 39%$3L^33+ 2s33I\$3~3*4D:$p4+ {45@{4T\4?U,4W`` 4.$` 4,}; 46. 4@5D4.@U4>R1]4-1]44I\4%H4T] 4][ 4=^*46,{4B8!4-#!40s#4AUa%4+ N//4>+04045!04CZ14I\'54H^54fC74AU74:4+@:4U`=46?K4/-P4UaCQ4=^FS4D9TyU46"TyU45!U4#U4?6X4.X4SHABZ4,";F[4=I\4#5Q^4$!_49]`4!`48$`4a4U`a4GQai4%Hp46@R*4B7sK45@sK4HR4.4KU*4U`4S^54@754@54MWÅ4.$h 4@+ 344%4R]4\[h4=G4,"4][Z4@J443*40&e4@6n4)u4-#46?g4R]46?y4G]4T\d4"ó5!M56"5+۠5۠5"%5% c5-r 5@Tr 5JT: 5U`o 5?6 5C 5/% 5AI[ 5+75,5K5I\K59][5HRU5Q? 5+!C5I\5DM15,65GQ5G\57L5,H5J` - 56"!5LWH"5BV $5L@'%5-&5?T'5AIo'56?o'5U`(5=Q*P*5 +n+5JTn+5AU ,5IR/5057@415@*65>65P756-956"{\;5>R=55>5S^WB5CW'C5#!rJC5)rJC5CJbE5U@ZH5H5J4yJ55?K5La2BM5+ M57LI3N5"62N5?ST53aW5#DžW50&W56"W5.X5%&\5&\55!,f5AJljj5W`ɇj5@^^k59%:k5@Tn5 u5UI u5NX&v5I\ޒx5Uay5_`{56"|5][-5T\_s5N-I5>\5T]\56A5HT}ˏ5.$A5_`Z5LTē5LU^5AU5-5Lo5y5Õ5HRÕ5U`5_`45DX|j5B!ğ5 5%R55S>Fޢ56.5) 54 &r5LW&r5L^Lf59]h05ʟ5-̥56"#56?K5X5T\55!)5,=ѳ59]=ѳ5I\W5+"45#|f5-|f5) 5-%57+v5"85R]r5KU55La56+Y5/:65@75%o5-o5C 5 5#M5+W5).V5.$557-ny5BLw5?J`)5%Ļ5.6Bv5-~5@TA5h5,>59](5@K};5)};5+};535%N5L7!5HTer5IT"$5+ ך6+56T]56+4 6 6!66A7i6J`i6U`67# 6I\ 6KUӒ 6BL6U`N6966I=wS6.6WA464 (!6(!6#Ā&67#x'6le*65@,+6JT,+6?S+6.$.6T\Ȇ/66?/6.36,946S@A[56+!_/66A._/66-#964`966I[;64 40=6f=6:A6JTF64` iG6".ZI6MWPrI6AU)XJ6.=EK6?6yK6@5HM65"lM66.ůN6,O6C.O6AUP6@5VP6?SVP67@eR6>RŨR6* ŨR6+U6o$W6KUX6-#X6!X6+](X6T]z]6na6?S!Bc68$x|c6D9 c6BV1g61g6:&U}h6+!"h6Ua;n6e p6BV,2q6%q6-1t64 Qt6I\Qt6KUu6".Zu6%]v6)6w6MW)6w6S^"x60&P'x6+@y6 z6?6Y^|63Eo|66"ʂ6GQ8W65!p66+6.6%ܯ6J`N6)N6,Α6A7t6TO6TO6R]X 65*$6LaZ6"6B]"6=QQ6U^М66i6,66T\666* _6+?6G\ln696-968%6"6 6?S 6DXoϰ66-LN66"&6.&6,w6IS6.o#69]C6./66!]64 ]6`6^`06][6)N}6 6MWUY6GQ9|65!|6AK64`56T]56J`6T\`6* D6S^66U`a6=Gv96W`x6x$6TL6|6:&!o6 6@LԎ6),6Cd6* g6W`M66".6..6).6C6KU+6KU46>+d6MWb6A.6LU16>Ru63>7I\7+ 7U^j 7".j 738 7p 7.r7+'7@LΒ7@TBq7-#79D7?S!7w7C 7,"?X 7BVTt 7," 7MW)7 +7R]xC-7"xC-79%M-7@Te.7[/7,%/7MX?27==37%647"@47W`_67+4̭67,5+P97R] /;7R]tX=7WZ>7#,?7I\?7RG3-@7?TP4B7?SP4B7@TP4B7U`D7+@E7AJLE7T\ҝF7G>ǭK7C$K7,L7KLT(M7T\nM7ZM7AU}R7+45S7MWU7+U7.X7AUI^7@T_7W`E:c7E:c7Cf7@Tf7?Sf7JTqh7T\i73j7@6k7@Kl7."gn7"4+(q7-#t7-u7U^u7][hv77#qv7.%Ex7^ y7BLy76uf|77#q|7-#A|7jn}7TL3E7GQ`G7#3G76?*7-7I\7 L7J` L7TL{73%k7W`7,7-"N7M:w77 67-} 7?SЏ7" 7GQ 7?S07L@͐7.kđ7B]n70c7U`+77+7?S⑛7".p7NXCȢ7JTI78$L7A5/777*6IM7#?7`4f=76?T76-yH7* 7T\Sn7Sn7I\ ũ7)>87T?X7-X7@6Ų7?7AUf7|7R][7KBʹ7AKm77* k7NXh7HRQ7MBi07%77I67@T576-77:7?7@53m7IS{7Q7KUo7ٹ7T\<7<7t7*5P7907MX7:..7L7G7/:.7W`R7,"l7+"79]7KU7"u 7JT7MWUu7 7@77.:7,:7!~7!,375A7@IG7!7%7+ x 7=Q|7,>C7@LI7-#I7!Q8U^ 8JT 8=Q^!8318LaN 8,> 8.# 8# 8*" 8, 8+! 8> 8,տ 86-e 86?PI8A.2X86"hl80&hl88IS 8 I 8HR_86Io87,.8+8@I\$86. x8( 8J4"8"."8-##8,5$8J`w}$8Law}$8B][$8r(8Ua,8=^.8.088$08I>į68* 68KU68HR":8KUL:8C:8HR";8="O=8!5O=8,58@8TJR@86?HA8KU|B8-#F89%~H8JT$I8,K8@5BL8"O8MWP8^>Q8J@+T8"yGU8yGU8,"pX8>4Y8,"cY8+*M[8*50\8>I"^8#A_8@7?b8!b8" #c8U`e8,"e8-#5f85!g8R]Bi8A6yi8C8yi8/8jwp8I\p8Gq80&Ss8) +t84Imu8A7u8*H.x8@Tؾx8+7 y8GQ y8U^ y8_`z8{8U`{8T\2m|8W`|8}8+9}86-~8+z8`_8K5>?8BVCa8+!+T8BU58)58,"G838?S86"86A8K]}g8*5]l8,5'8KUd89%d8#8%Vʖ886#'88#58%~.8U`O88J'١84`8=Q8AUG8D9 8LaM8#+8 Ʃ8IT8>+jX8.${ 8U^8:8AJ~8#5e88.g"8%8I\18.918D9᛽8T]T8BV̎888+\88HT08A6p8GQS86,ğ8.98r8MW)8"td80&x8I\x8J`'=8JT8>8"f88%28-#8L98)"8MW8/%8.87#)8+!K88~84`~8?`88#+8+ F8JTF86Iq8=I!8* ?87L9S^@9#6ζ9#:96-H9I\96+6 9G\t 9.9JT9@T9LVf9 )9,w9:79^t96I#9IS#9La-d9ѵ9@I 9@69@+9ISTs 9%>!9@U!9@6Qj"9#ͅ"9/%1[#9#94I#9LV#9Ua^$9I%^$9"^$9.&9JT'9SHz(9"Np)9#C*93C*9&8*,9J`-9!,}19.#879 79?5U894`4l89-#w:9][:9U4<99L=9][z>94 z>9*z>9@5z>9#z>9"?9#+wE9>wE9C-%G9_`ޓG9-#gH9hI9*GN9.GN9"N9G\acO9T\)Q97#)Q96"`R9S^}]S9W` ~T9.%fT98U9LV#Y9* 3Y9k|Z9>ڴ[9?S\9 ]9$"U^9CU^9@6ǖc96.e9e9"mf9KUj9>5&u9LAPx9by96@fy9@K4z93s|9#s|90&t|9-#H9R]H9G]X97@9@69LaK9>\989I\9DXj9C9?S69>R =9* 9T^90&9\9.#R9:D9T^+49 99!5Ƣ9x9KC^90^9,9B]9?59@^y96V9)9H6/9I9?5ߤ9@7M9-?w9,"9_`9?69/%9+V96"p9"p9"99]9\[y~9U`y~9CW9.:9e9U`9 .9W`9+f9A996, 9-p9-#9+!}9JTm%9%9I\[9S^$9* 9*69I697#9-#9.9#9,"N9U`99?6N9I69C9(9U`9HRH97L+Q9NX9,9# 9ISI9I9889+`>9k9-#96"2B9J`9>R:O::KUO::5@_:@+b:LV# :,:U`2p:+# :E:6-):AU: :7@kd:9%!:U`K:+K:!9:W`8:S^Bf:+!=!:7-":La$:@K:J%:@5|%:4>&:>R \':"':=Qb$(:W` ):K*:"_ -:-:/#X0:Ua1:+z3:,5@7:LW\8:7+<:=:-?:7,$R@:B:){9D:4`D:JT%F:/%%F:+G:G\ZK:@T Q: Q:6? Q:I\UT:T\+U:GQ+U:?SW:K]5W:D]X:4J{sZ:J`M]:_`w(`:4?a:LUb:3e:+7g:J8h:6+>i:H6xi:=3b)k:+"D|p:" q:6?r:r:"ps:6.s:L^]t:U`t:G\x:8x:,y:U`|:|:.N]}:T\R:La#s:6?v:7+ń:MW$:B]):lF:%7J:KUYm:La׊:4 ::BU:6.;:@KF:2:+4 :6.m:T\m:G]Cw::>R:>3ᢗ:6?{:{:>Rj&:JTj&:@Tv:*5v:*:!68:NX8:U`8::7# :KUD:H^:MW&:6+y:J?Ҡ:?@w:"*:")s:+ʮ:KUL:=Q!:7":7"3:=QI:6";:3:7@3m:6?8:GQ :%:MWPJ:6-m:Z:AIt:@K%:T\$:L^k:%'?:ISb:-#:0&:U4:_`x:::.M :+:):S^):H^>:5!>:+J:W`:@Ix:.x:7#x:5!C:+C::.:#:H^J:.Ӥ:%:#:-:SJ:-#D:J`:6A:8Rv;A8?;IU:2;I\r;+;R;NC+2 ;6-<};+;R]};`U;0&1;+!;6An;+\;*5\;"e=!;\[˻#;@7n$;* (;L*;I6Kl-;W`-;0&/;,}0;AU 2;5!4;+7;8-:;+h:;%TC;I\KC;MW\wC;.-G;6IK;!M;KU!M;B]!M;IS\/M;.O;I\Q;3>b&Z;JT6Z;9]Օ[;7-)^;@6@a;"@a;5!a;^df;T]h;JTh;U`&ti;T\ܮi;!7k;+o;MW't;R]-x;JT>y;,y;%yz;[^z;*"8#|;Y|;GQY|;La~;MWÁ;@TYԂ;T\YԂ;MaYԂ;?S$;LC0;=3J;t;t;T\1;+k;,;#,;)dy;6"@ˑ;"w̑;U`aq;+4y;@6y;=;S^,;+@ ;kb;!@;" ;,";A7;>;)Fׯ;W`U;6# ;"پ;5,e ;8;#F;.u4;;La;>R=[;* ;+];Ua<;JT?;4);+?;%K;^`l;La8;&;KU;.$';SJH;%8;T\8;GQ;W`j;,"q;-#q;7#g;_`%;_`;5!J;*6J;-;+@;+ &;*Y;?SHs;J;*6@5Fc<+#c<.Ld<6-RRu<>4+<@6W=V`=R]g=6b^=LVd=!#D =,M =NX\?=,n=U^n==Q=>R=TL{ =AU{ =KU-V=4`=A.==+=5=)=-#Ӽ="6C=0&p=KU=*ٶ=A7=W`NP==3$ =?Tx^!=^B$=%s%=A9'=%K{.=KUK{.=La?4=?5?4=7#C7=:C8=" 9=@K19=.9=5!j9=W`g9=@5B;=@5k<=?Ua>=DW@= _z@=%@=~iD=A7&E="_wF=L7:G=6?6H=nI=7+J=&K=T^$L=I\N=,"jN=.AN=XO=%~R=LW9Y=>R}Y=7#_[=K][=D9$[=La\=6"4\=LWT_=!,`=AIGb=.Q5c=H^`Id=BV`Id=G\`Id==Q`Id=_^%f=T^cf=i=@6i=@Ik=@5l=!\l=I\p=I\p=La&s=t="x=-|{z==^}=:.=BVma=U`=I6m=#م=U`م=I\=AJH =9]A=!W=U`F=oH=,"=6.NT==+4=.#f=,=#=5=G\+=4I⼦=Cr:=D9Fĩ=,N=DXN=UaN=BV=?S==Ք=p]=W`=0&p=6+p=6.s=4=v=+#D=,+=@TNs==Qa=KUeʾ=U^,R=W`al=.=_="T=GQي=T^7=MW=8Bi=K=_`V=UCV=:&==5?=,"r=+>Ԗ=J`=?I=?S=T\* =R]/=G]=TL]=_L:'=%R==MBm=4 VX=3>O==R]=I\!=4?M="=?SA=*5:D=S=9=8.^=,=6I=.$="=* 4=* >KU>>6^! >C.! >".>HT<>U^*>"/>#y>-#>6.}>0~>_^>M@>*6X>,"z>/:>>R>-#>@5@>*6v>U`v>NX >@5j">6">7#_'>#(>(>3w)>@IW+>6.,>HR.>7#d/>+~0>,E0>,"G<>JA=>S^>>[\B?>W`VC>W`caE>6LE>"uI>9jI>]`J>#x'J>-x'J>8$O>U`;`P>uQ>I\V>@>@W>J^fZ>\[Z>yb\>I\yb\>̱\>9]\> V]>MWV]>AU^>."*^>,"x`>B]x`>9]ތ`>^a>@6asb>TA#k>-кk>T^ !l>53Ŧl>XIm>T]m>.*n>po>BV7rq>+0w>LAwz>wz>+T|>Za}>7+$~>R]6y>@KQ>+![Q>LW骅>T]>"C>T\l>H^tو>HR?>6+>TL >Ua>KUُ>.l>T\l>I\>, >J`.>HR8>W`*>*5u>%u>6"[>HR>L^d>A7>+>>RC>.b>GQ]>A73>UC/ί>I\ݰ>* >8$A>JTA>U`a>6")C>-}>5! >U`ƺ>,eһ>K]>A.I>>W`>Cɹ>61>?S*>@T>IT.>KU$K>UC>HR"9>,X>B>T]>B>T\>9L>=Hp>@7j >@5 >6">%K7>C^*>][6M>3X>#D>U`d>AK=>HTu>0&u>+'>T]> >0&#>9%P>0&i>>R#>#>LC>3>IS3>KU^&?I6?HRD?U4D?J4?,?0&?"*mz?@TE?8?JT?I\??HRMK ?*6#W ?.$#W ?5+<" ?AK ( ?0&c ?-Z?J?Ua1?@J1??6"y?H^?"?+ ?.w?@I?A.f? ?ba !?JT&!?KU&!?AU1["?_"?SJD'?U`_)?/&+?+?-L0?+ |3?GQ?L4?A6y4?.#5??Iy6?MWy6?T\̟>?HQ !B??SIB?>RwB?@5]+C?6+D?\G?W`{G?8 K?=Qe#N?e#N?7-&O?@6&P? P?#:U?+!Z\?7#]?La_?#La?JTa?6b?%c?5! d?La6e?][ pe?,"4f?RGf?2h?@K !i?,j?#3?k?Xm?W`m?:Dn?!,Vo?>3q?r?/%s?VK_t?7#~u?-~u?C~u?#Hv?dx?"..x?K]&z?3Wz? h~??`r~?J>~?T\?[?*6N?U`?C?7#K=?B]Dx?+!?:Cp?*5ӑ?@J؎?5=?铕?4Е?@54Е?#9?4>?HR?TL??S??|?\[S?#0?+V?@6`?.$q?+4~?U`K?.9K?KUd?d?+d?+!&?.蒻?IS ?KU`?#7)?)?][o?%?6+?5,I/?531?G,'?* ?MB 1?:CN?6-ޞ?"ZR.?JT$?HRcq?NX?.F?A6?B]?D?A.WQ?R]= @@5hc@G>f.@+ 'm@NX:@#:@, @7+7 @4)i @@L$ @=QG @A @-#I@UaO@5!@U^Ѵ@.@@6f@G[2@@6h@KU9@"4֎@La@@-@ @-#y!@8$!@!@JT8"@7,Y%@Cz&@%(@"+(@W`3(@@5M+@?Sj+@D+@W`b,@*,@,@,"r.@La.@8Wm/@4 Wm/@,d1@U`d1@4`Բ1@@K#2@R]3@/0E4@8@#<@?6#<@@6=@35>@@5S>@@616@@"7A@A@@R5G@@JG@I3I@T]0O@GQUQ@.Q@LazR@@6cT@.~U@6+PV@MW~Z@R]+[@W``@GQc@6?&f@:g@.wh@JLok@Lam@7# v@+ >v@5 x@LCx@+\~@7#)@_`@7L@?I@Ń@W`?@#?@8$e@=Ie@HR@7#|a@+`Q@:.[@UCG @?SJ@I\@:@?IԮ@%[D@U@La4e@@HT@C.@6+ȝ@7@o@@+ e @4`[@C.r@,"#@ =@LUM@T\M@X@@Lu@.hw@)UA@@I6JǼ@Lai@#+ʛ@I\ʛ@KUʛ@+@$@I\c@%u@La4@GQ1f@U`@:Cj@j@HT@@L_@X@X@#@,Y@U^@T\@H@@JH@U`H@>R-@,1@#@#@?6l@6#f@{@5? @8@AJCT@=4^+@7#|d@I\@GQ)@@5@R]@+9@CW@@I\@@U`AA! ?A_A?S} A+ \ AA.AU`ABVʱA+͸A5!nA]AJ^ăA+!mAPAA.A"OA+6=lA+ A A AGQz AK9"AJTD"AP"A9%~#AK?1$A4`1$AJ`ů$A4(A% 2A5O2A45A]^S6A%h8AKUh8AAUh8ALa9A#+1;A%}A,"QA6.A5qTA*3~A/%H~A#>ڐA8A@LsAI\@A>R*̕A-*̕A8AD9AT\NřA6",AA.A?SAKUeA,tޝALatޝAI\쁢AaL9A+>A3ݩAI\AMWAU`A sA+ALaAJ`TAvA.WAKU1?AA@6A7-!-AźA?S A6A ANXAU^A%AISAT^yA?`.A)A_`AT\$OAI\q+AL7AA7AA+/A%YA:C2AW`2ADNA,"A-#EA#٢A5*>A>AI\ĦAbA=IMAI\ AHRkAA5*FALaFA?SHA!BAR]TNA?`TNAJT)A)AHRAHReCB%"BU`"B@+7 B B-CM B0&! BJTBW`TB B@K| B*"fB@KfB_`B>HBGHyB6"כBLaB#B0&#B-#%$B@+d(B6.*B }7.BAJ1B2B?-a9B\[~:B R B"~ BR]IB,WhB%\͏BJ`АB0&׉BTLAB!+cBUI>B4>“B)“B“B!jBNXB#B,GzBNIB7L搚BCSќB)B.$=BB@6ysBL@ӇB".B BGj=B,B+!=BW`ヨB4`BR]B@+ XB.$۫B[RB.3}BA7 BLalB">B6#)B6IB!,3v1Cj2C2CH^!4CC>L6C,"7C+7C6.9C5C6"&Z@C8-YBC5=FC#FCKUHC7,HC@KjNC#fNCCfNCA. OCLTeOCǕRC.ǕRC,"RSC>6SCGQ>>UC* kUCR]yUC6 VC?JKVC8$WC)YCA7ZC.$ZC+ ^CS^^C* R_C5-`CI\``CISaC@5]OaCI\gbC.(TfCR]iC%@kC,mC?TvnCLU]pC4 xtC+ƏuC#1RvYCSGlC+snCLanC*5C-#FC6#7yC".7yC7yC~CTC-CBCI\=C0&tC+7bCGQ C6- 0C`UMC@K%C!%C%C7-@CW`G CIR套CD9C*C?5CMUCBU՛C\[%R?0C@6{CK]CCC}C-#MC#vCX3C\CJTKCC9CJTF(C?SF(CHRMβC CUCKUUCGQܹC@C+!hkCGPbC8C@LC@I5C/% mC+FCW`'C@+EC.EC,FC7#CR]RCNXC]^CD5@D#D,"/D7@' DI\{ D#{ D.{ D8$Y D@K*] D:&*] D0& D6.FDM!D%eDD@6oDAMD_^D*",]D,,]D0&D,"'? D@U DA7SE!DW`M#D* #D0%&DI\%&DKUL:+D.9L:+D@I3,D#3,D.D#.D=^i/D@5/DU`+3D@^3D04D,U6D,6'7D%P9DI:Di;D/%&Q>DKU@D5*8ADLUEBD)DD/%FD"IDJD6+dJDLa MD#5 MD,5,MDLaIMD-%rMDJTnQDS@5LRDT\uRD"RDJ4"RDU4RD8=SD.(UD@7NsVD6"NsVD/%n\DLV\D#0._DEbD?6dD5,fD.iD@6SlD/qD"%tD@6vDDvD7@^wDW`^wD9C {D7#{D@6v|DV_a~DT\DR]!D,,^D#DGDMWGDI\GDLa|$D-# xDAKDfDNXFDH^bD3-DMW-D@T[D@AuD@5EMDT]i8D@6DDFDAUD@KD"DI=D,bD8`qDR]&D=QhD6"DI6)D,5LD?- _DAK֡DT]hD=3hD0&:DA7:D@7@D5D!h%DT\kD#gUDLCRD#D?S0D+ mD-#XDWLKD6HPrD86DwD7#0DI\0DH^DK] }E*3WmE@Ti E E:C` EU`E,5 E?`EEE%.E6"ȦE)!E6!E#Q#E#&EKU7+EKU.ET]1E4`Ju2E6-4E_`}4EzX5E8.58E>E."g?E_`g?EJ4@E?S9BE6BE EE6"2FE7#2FE.f>GEC9LGE5!HEA6C1MER]vOEFPE?6'RE+nUE#v VE53cIVEHRoVE@6WEDXWE4 XEXE0&XE7L^\EJ@NR]E )v^E@7I^E`E7Bo cE@+hELahE@ThE?SRxiETLiE!*SiE?SlEI\_oE-!jYpE wVqEU`tE.$uEAJuE5@%vE0xEC.~zE,zE|E"7|E7|E,"}E%}E6"RۀE6?E@+솃E+솃E/%fECE-#SEIAFsEE!)_RE4`&ϖE#ER]E7#5;E4LEuԞE".(ET>2ES^iFELa0EI6,E]HEHT⤣E@TeBEAUEHR 'ER]zE+zE#gAEEI\ET\ELaE@6EA6REBUE/%E"E_`_E)[E#eE"mE6-L[E+>EU`nME-#HCE,> EA77JE-kECME.E,>E.>E#BEU`EW`EIR1*E+1*E/%sEJTEI\bE9]-ESHE8,E+>lhE)E>RE-GE*"E,> E=IEE,+EE"mEW`EI\E.% EI>E6+FIRFISF+[F"G FH^ES FA. F3ٞFGQٞFK]$]FU`F+FB,eF*KtF@T#FXLH)FIS1)F" *F:D;*FJ.FA7/F%5F6F?I6FNX6FMB6FT\6FKU9FU`=F6+\Z>F][?FG\?FJT@F8$JAF_`QBFHG7GF,zsGFzsGF!GFKF*6MMF$/ONFCN{OF+SOFI\QFQF0&wvSF).UF+UF,m9VF=^m9VF+W\F4`A^FT\^FJ`^FU`w`F,bjF.kF@6pFK]pFUIπqFIR|qF|qF-tFLaiNwF`UwF.K{F,"|FJTG}F62F@IN*F>R;FFJT ȅFK_BDF.7nF."aVF."aVFFCF6?FLa˺FFISԝF@56 F%F%ƚF@5RF+ uF/%>FPF"PF* PFJFLaѽFLCrF5"VGF!3:F7#ӭFFLa[F@6FU`FBVeF#F=IiF5@MFΘFFLC FR]/,F-C_5FIR5F6- FT^ZF[*FLautFMWzF"fNF%F=F@KFG\~lFF>RFGQFH^F4> F# F+TF_`+FJoF"$F?S27FFA.zF -FHRcFJTF F+BFBF*5FMW=F=3aFT\F!,(FKU(FJT(FAUFT\FFAUF5>FNW\F,5tjF@T F)F,F+G!G@5,G6.pTG5G%G< GIS< GMW2F Ga G"7 G+0Gi~GJ4\G>GB]cBGLC G-#'aG7G[RGLaxGLClGhz GS^1$G"Mx$GAI%G%G"%G>R&G@6&G9]Q(G6?9+GK]m;,G,G:&˓2G+.e3GP3G?4F3G+64GJ`L7G)8GGQ9G+9G#x=GI\+>G,"+>G.>G#Կ?G-C@GUa@GU^BG][BG_`DG4>EHGT\2JG6"LG/%LG4 LG-#BvNGKC\PG+!tG FܺGKSFܺGHRGT]GT\GI\G+%{G,"GLaGAUG+ GHR G@TGLaGJTG?SG4ICGK]nGLanGNanGIS͵GKU#G,GsGcGI\]GC.G/%G,R\GG6*ЌH@71H?S$<H+/H@6HLCHT]: H-#: H+!: HLC H8A V HKU V H9] V HB]f~ HKH4`HH6" H7LH6"H84H=QHGQHLVHNX H6"D HLaD H@T HI\ HKU&H4>'H"'H|.H9%#0HJT0HW`4H6H6H"R:H@K2=H?Iͮ?HKUyBH9%>BH@TVEHIS jIH0&LH6.tLH.`sKOHA6OH5 zQH'&TH"'&TH,<WH34WH"XH~YHU^ZH,L]HVscHHR-hH@I!iH3=kH!]kH-8TLnH,oH+>oH-#sH#51uHuH.6uH*6w vHvHMWdVwH_`dVwHU^|wH"ԡwH.ԡwH/%ixH%P0{H@7L}HU`H@4HL`&HB]Y\H0Y\H.v(HLT߆HI\JKH#6=iH!,UH"CwH53ڌH#6H+aȍHU`XHAU|HHRHKH>R\HTLaHAU6H7CޜH+1HS^ HﰡHHAJ WH_`BH]˨H7RyHyH][H^`HH+!H"H-֮H/&HU`bH,nH.$9;H7L[HI\H8C4HKUH6-z@H8$z@H/%z@H6"z@H.yHIS(NH5!OH?Sp;H][p;H6I?HW`5HS]H+H6+kH*5HIRq H0:7NHTAfH+qH6"˒H%}H,HH+H+!HU`H#%H+?UH?HHUaHAKH?HڿH+mVHR%H_`ՖHA@H%%H6.#UH%HUa HKU HNXH+@HH4:HI\¹HzHD:E0I@5yI@TEI+yI5!yI+!yI* mI-4 I.#UA IDZ I8 I+'IJTtFItFI-!oIK]oI?SAIwIBVwII\I".I>5kI#II\U] IA7!I-cP'I_`)IA7)I, )II\)I@+@O*I^@*IJ`N ,IN ,I?7/IT^tJ0I8IW`8I:I>5:I7#!KI-# KI5NI@T_OI7+RI6?RI*SIB7DSI"4ɅWIXIUaKvZIT]6ZIU`ZIU`X\I.\IU`J ]IKB ^ILC ^I:C_I`I@T-cIS:cI?S"dISH[dI0&[dIeI+kITAlI@K{nIB+oI"qI@5JAsI8$sILWtII\uIAUDzI3~I>GˀI#I2I@I!II\I4IQH I%.I?GNI>R\IBUC I* I0I4>ɌIT\ɌI5@ɌI=QI IHIW`f^I?Sf^IHR)IJT)IW`lIU`>I/%OI!+IAKIT]ٜI7II,II)xIS^(I.SrI4 I.ILU5I".}I,"~I@IHTI6AINXpIW`PIGI%.?I9IU`I8$kII"FbI-#hiI6"}IT\I"I=QIR]4ILaj5IJTRI6"II=ݷIݷICDI5@̒I/%aI63MMII\qIMW}I+ I#>JA.?J@KsJS^J-#$GJ,J!:J8B JI\!JMW;"J8BD#JI\F%JMWo%J/%Q&J% *JR]-JT\T.JE.J+ */J@TX0J?S2J9B2J2J.$4J+rU4JAK8Z4J,54J?S*5JS^2;J?6J;J5+RJ-#JA.TJ5oJ$ʄJ/%!υJ-WJ6"J5!)mJ)mJ!)xJ6#JGQjJ-+JғJ8J7#J-# J-z"J6.,J/%ZJ-#JLaOJ.6ΦJBV[PJAUdPJMWhɧJT\J@6J:DJJTc*JήJK],-J@AJ&8BJ9CJD:;J6?,CJR]J#J?6 JQ[ JbaZJ@LJ*3`JIS`JCWJHRJ-JKU6JC9J"JH^tJU`kgJ>R}J6-J6.9J,J@TZJCJ* J30wJ8J6-3JC3J8$UJ(6J(6J4 sJ6,BJ^vJ#6K@L8KQ:K.V;K#z;KU`z;KT\3M=KW`M=KNX=K@T;>K>K3FK?5CFKD9sqGK@TOHK 1\eK@7շgK,hKCLiK6./kK`U/kK9]XkKR]lK5>bmKK9ثnK#epKGQqK%sK"xK#YxKU`YxKMWyK3~K@-KUa끄KA75KhZK>RLKI\K-B{K0&S0K.KNXlK@6KT\KG]KR]RK9%KŭKB]וK>RוKKUוKMWDK3 K"?K?J?KNXsKK6K.$a1KH-KMWK9]KLaxK9%£K/%٣KퟥK#KU`K)FKKUp\KI\K+gK+K0K7+rK }K6? }KK)![K6QK:C9K/%2VKNXQKA.E@K3+S]KI\ZKR]ZKT\KI\\ K!}KLaKLCK.IK.K+5}KI\KK@69~K@KK.K0&aK@7dKJTKMUKMWuKU-4K90K,"KLa@KI\K8K-FK"K>)GK%,LUaHL:&&L.RVL!,RVLK@t:L)2LAKL- LLa LAU^L>6^L!^L* ^LL,L#kL6"L4 LLLa3T"L%>%LW`M&L6-t4'L+ ) (L@K)L"-LG\-L=QE/LE/LT\0L6.u4L8$5LLaՆ7L7@F7L?GF7LDL):L7?|;LI6j@LW9 EL- EL>5FLU`>IHL/%8JL=Qe}JL.$zR+RLT\SLSLNXEVL* EVL6"NVLR]YVL-WLJU_L+bLC"bL!XcLCXcL:C0dL* tdL#!dL30hL+*hLCW+#jL!+oL?7?qLXLmqL29rL/%ZPsL,ZPsL.nvLƬwL 5xL6":yL]`LCM'LMW.L.%\LLD91 L#L.$ 0L*/ԈL>REL"CؖLU^ƍL"6gL4>LU^ L7+RL+LA7jÝL)]`L@6L9%#L4)tLŕLI\WL!L@+LCdLNXdL`UEL.EL)L9]LBVLXMo3L][L9]ñL=Q'LI6˳LU`WL@6ctL/%ctL.$ctL.θL5,LL6"L6A$L5L,5mL,aL@6bL5,T*LǍL0&zLL@I{L{L#aLTLaLLU`GL%-LLapL?TL+!@LIR=LEL5*xL6xLںL6"0LU`uaL6-wbL)iL-CLcLRLCL0&L>M6"]M#M+M,MH?kM][  M# M6?% MT\>M M!5|MU^SM@&M)MD9MU`M MM?SM-#M6"M8$s+M5MA7Њ!MTLQ!M$M%_%M6AG)MR]G)MKU_*M"<+M>Ra;/M)0Mf7M 9MQ?8W=M$?>M>M#?MI\ܒAM4 EMJ4FM6"lFMB]%$FM4 kGM4=(HMU`mKM+yMM-yMM@5+0QM6?ymQM-#=SM* TMUM=QUWVMTBUWVM0BjXM"YMA7rb[MR]`M#aMDaM"XbM9#cM%ZFdM*31dM#$gMI6LhM+khMMWkMW` lM6?3lMI\nM"oMoM@5qM#tM6HtM"^wM5!wM6?`xMI6f[zM+MzMK]X|MHRX|MH^|M~M02dM-:M=QOMJ8㼃M+w^MD9ĆMT\X!MMB7M4>M\[lMJ`دMG\دMIS*M5!9MA7bM+!wM>M M6@WMLaVM* MtM9~M"&M@7PMJTM7#M+!I M6.qM+EMI\EM6?ˬM$-(M@KM/#M>R˱M@L!MU`aM7#yM6"MLaM*"\MIRüMC٭MAK}MhMNXvM# M/%'M M+!x M5oMC9@MMsM-#W*MT\W*MU`&M#yLMR]M>+IM+ʔM/%#M##M-6M%_M,B"M#MW`G1M@5R!M=*M=QUM=^mMMK]M%M%MLa"M6.ofM]HpN".NW`NKUjN9]\N5)jN  NAMH NRN+NR]NU`N8$N*";?NN?57N#RN8RN /N N+ N5#P%N@K=)N"=)N>6ܙ)N.9J*N,L,N^{-N+.NaL82/N`0NI\00N0&00NC00N"0N7B{Q3N 4N3L6N6N_^6N%I]7NC:N=^";N*"N6?T>NReAN@5DN.xDNDNU`GGN%HN"1HN3=iHNHRiHN=QJRNNXfSN5H0UNW`5ZN,"5ZN5!5ZN6"ZNU`s[NQ?s[NJ?k\NHRT'_N6.y_N6"M`N6AobNK][bN+eN0&fN7#fN-#ZoNDXdqN.AҥqN:CCqNT\CqNG\qrNKUtNtN," xNJT xN8qxNS^8qxN_^PyNLDyNA7JzN0&G{N, }NMWNJT݂NN@J(N@5RN0&~EN@5 qNyNN^`NGQBN"PN9TӎN%N@TN.ԓNNLVNҙN6?TDN5!TDN/%NKUAN?JdN3KgN,"NN9N*5[N.aN+aN-#N56N@T'cNMW'cNKUN?`mN6@mN9]/NMA̺N5!NT\NN NMX~NLaN]^fNAUNN_`LNGQLNI\'N5!*NaNB]NLVNJTNI\nN@5eN_N+NI\#PN.VN+VN:&yN9] 7NA8nHN/%YNLWNJ7oNPN]^_N3~N+FuNT^ N"BN%[NA.xN8$CNNI\$N@7N+NNJTNK]LN+N@T7NHRRN"OEO>O8C݁OMWO+Of*Of*O4"O O_`F O7# O+" O+ Q OGQOAWqOI\O@I O*O5!O,kNO,"!J O.I "O!&%OUax^%O^'OI\(OJ`f(OS^o,OI6.OKUHL/O][HL/O5?^0O0&1O:&1O2O5!2O7#2O.Y8O_`Y8OMW~:OM;O!>O+>?O?S>@O">@O BO`UBO@TBOFO"FO)HFO6.GO5!3KOUOJAWOS^WO][|YO_J|YOLUZO@6JA^O^O-^O8$^O`O6bOcO"dO/#i?gO,MiO6"iO.$iO-umO6mOALRnOLCoO!3joO+ pO6+gqOU`gqO?`I^rO@KFvO+7vOZwO7LZwOH^P yOT\P yOU`zOU`(BzO!x{O+}O6?dvO6?8OU`?O:O@7wO/%sO6 O+4דOHRٖOT\0OLVOU`,ȪO\[c֭O-&O@5|vO&=OALpOCO6IYO,SOAUSO6ISOJTnGO>O@T%O6"6O8As`OW`6OA6&O?S`O5@OD9KO6+KO2)OI\fOOO.PO-#O#OO!xfO?6+O*oO[+O^@[CO"$O%O6.kO@L1O53O"OI\lO*6NO9]O5@,O9L]OU`0OLaPP#nPJTcPNXi PS@ P P+!Q P@5: PW` P@DVP%lP0&PP PW`_PHPP=S` P@7K!P+7\!P6"%#P5!%#P7#-%PW`4%P,'PTJ'P* 'P'P! 'PR]'(P,PHR70PT\Fm0PR]h2P#2P."4PI\x5P>RQ8P+ Q8P+"R8P6.R9PU`:PS^y=P?6=P#=PCAP@KBPUadeBP>RCP9]CPMWaGP6A3HPJTIPBUhIPGJP.GJP7#|JP3KP@2MP,QPJTyUP@+9VP,"XP-n1^PW`H_PBaPx&dP6"8dP%iePLaduhPT\duhPW`({hP".clP8$clP+!'pPT\'pP>H/qP`TZtPT\KuP"KuP"ȽwPD9yP?T{Pa{P-8{8PI\P#dPBLF1PG>ڊP#P|PJtP*5⧕P@6⧕P!qP,qP:&bP4`bPGQbPI\~xP.{P P5PR]\ǦP6F PAKRɪP+ P0&kPITPP,>9PJ`aԵP-#aԵP!vP6"TP#TP*5jP,KP PLaPU`PGQvP+2P2P8"PPTPJTPS= P@TCOPTLPPU^PU4P=QP?SXP7#aPLaP4IpP%.`PR]{1PI=)P.`PD9%PGQ%P8%PwnPAP/DPR]WPKU1P"SP=Q&PHRPS^PHRIP+PL^P"P PJ)nP+!b#P.=Q-j^QQT\իQMj Q.hL QIS QL@b QA6 Q5@QKUQ8Q%aQ"QMWQ3QAKbQQ7#Q+!Q,uQ+dQ%\QUBsQUasQ@K.!Q9]h%Q,"~'Q+ K(Q#(Q"L(QU4*Q.#2QW`3QD:96Q`8Q".8QI6\:Q@5;JQRJLQMQJAMQA7AMQ,AMQ#zOQB]#OQIS#OQ_^=QQ-RQ+#PUQLa#YQ@+*YQKYQ#|ZQU@[Q* [Q?5!cQW`8dQab/kQ53]flQ"mnQ_LoQ6?{pQJT;rQ@TyrQ7LvQ0&vQ#xQ+@yQ5@zQ.@}Q@Ln?Q,Q9]QQfQ@6Q,VQ4 Q%QJTQI\yQ7+aQ+{҆QKU4Q5yQ@TyQHRQJTQI\fQU^DQ.$ƏQ4)ǑQ@6XQ?S\QLaژQCQI\Q,%|Q3%|Q#>Q/QQ`Q^rQA.ۇQ/%ۇQ+ۇQ-#Q,j%QI\`Q+CQ=QutQ+]&eQR?QI>xQ-ArwQQ>Q7.gQ,ZQ+QL^kQ6+Q,cQ@6sQ5@QA6QMAQU`Q>RQ][GQ-"lQ!Q6.PQR7RQ.RQ,"RQ6"tQLCtQA.Q3pQ^6wQ>RQ>}.Q6"ǺQA7QHTQ@Lc!Q@+hQ6-UQ+0QmQ:&hQW`~Q>3Q"?=Q5??=Q6?@jQIR0Q*6ZQ7BQATQ@5QQ#KQ+ xQC.Q7#6Q.CQ%vFQ%WQݜQ-#SQ6"Q7#QCQ-#ZR>R:RyRBLdRHRdRIS RAI R?5 R4` R,K R,RJ`NKRD9`R"R7RRB7E`R+ R/# R RI\$RKU$RLa~$RC%R@6~&R`^ף&R#I&R* 5'RNX(RBNĪ)RH?)R*S*R6-^O/R0RC0R?J2RLT\33RDX67R9]67RK]=R#=R=R9'?RULd?R-?R@K@R=S BRMW BRUa7DR@7JSER9% GR#GR"QKRBVMR,~QR%5SR%TR6"UR".EVRJTiVRDLVR6IXR5AY ZR+!Y ZR5!QZR4>ܕdR,iR-#elR*5elR,5Q,mRI\,oRKUsRJ`s vR?Ss vRBVqyR~{RI\|R6++RI>݁R7!{ɃRT\{ɃRCWp#R9]R,UԋRWBRRNXURW` WRKRNXVRVRJTf#R6?'RNX'RT\ hRI\qR+R\IwR6+ZR*R=^pRCWJR6R?7?RLW?RLUYURNNCR6"rVRT]R9LR=^RG[=R6-ٸRISR._R"sǵR+EȸR+!%hR>5Rba{R4RI\3RLW;R@5R#GR(R6?(RKUR+ heR FRJTRA8R-R32RS^R?5?RAURR,"R0&XBR3R4HRyR,!R@TIR5@7RHTR7LZR9]CRKUCR>GCRMWRI6JR,"GR+!R7#y.R>RRT^νR^9S#S=^RSTLvS#UTS"ߐS=IS8SC8S".SIS4  SU`d S^` S S-r S# S#G S]^e S)SLWS?6S S SK6^SLaSU`ST\ySR][!S,]!SJ8r."S +<#SR]8$SLa%SC%S8K&S5K&S+e'S6+'S"g)S#~,S:CN-S%M/SWa/S,/S* j0S+!Ʌ1SU4(3S-b3S%5S+!827S47S,V8S7#?9S+:*:SMW:SGQ4_?S6+jyCSK]"DSWNoDS+{ES6+*FS-CGSIS+LSHRNSAIaRS"TSUSvWS?5yXSD9YS/%YS. [SLa [SU`տ[SMX_S&J_SBVM_S_SaSG= aS.0aS>R0aST]obSK]obSGQbSS^)dSLWWeSI\eSU`hgSH^iSMU9iSU4kST^lS,"mmSHRmST]nSPoS-# pS%pS@KpS@7pS@5rSI\rSJTE9uSA6CwS=IiwS7#JXSKUS:0%=S+%=S/%SXMqS3+/S*5/S+!*S+ ԤS6"ЊS:CЊSLCI S3C/S6."S6-}SLWMS.$S"S>҃SU^0&SI\0&S>SAUTUSI\S5!rS]RqS4@juS+4juS=IjuSJT!S+IaSRS6+٠S@6sSSCW\S,"!SJTsSSHsS^`ҦS@THSCS3+ݬSLaL-S.SKUnS_^8SK]?S7#S.SUaOS5!`S@6S#ſSW`kS_`S#+S=QSJKS0MS"S-#SK]SUa=SH@dSB]DuSJ`ST]SNXS.-S-^S@Ty#S+HSo4SLaYoSS=QS3S9A9S6.GSDXSR]OS-CvS7-vS7+?S8`S)`S"S-S7#pS2SAU2S][ST/7X%TS?T8"TD9XTC"T@7sT T4>ߤ TTL> T_LJ TW`J TISk T"> TK]DTJTToTVT+4yT%RT6?RTS^ [T@ T,"!T?3<&TT\<&T_`&T6"6f*TT]6f*TR]<{-T..TJ`.T?`.T7#b1T\I:1T6T.I8TG\8T5!8T,":T+S;T%u;T?Su;TKUzWT,5YT_LYTAUZT6" [T?7~\TLa:]T8.Y]T?46]T=I^TH^͕`T=Q͕`TcT>+USdT>+USdTJ?fT~kTB7nT.9nTT\!]nT6I&nTJT&nTI\oT=QoT*7tTUI;tTR]cuTuTEmxT";yT7_@H{Tab,j}T@TaTT#5T6.mT+4#~T-#T-JT`ThyT?6T, TK6|T%XoT"U7T [ڕTISΖTT\T6-T9]TB]T-CT:CaT,69T. T:C TTTJ?4TJ` TKUo T6"(T#(T0&@TLa*8TW`T)T-#ƐTAJCTLaT#5TSGuTI>ثT/#4T"׻T#׻T-׻T?6~T>5TCU㴽TN>T%LTT+!KT5@QTT6-T@K\TT\\TG\qT&TA.+TKU+TISXTR]THRTKU)T7#)T.T"T0&yT4 yT.WT.:cT6. T.TW`T6-jTS^AT7LPTPT,"T#T+!cT.jT6"T.qTW`cT.QTBVTTHRTT8STqzTC}T*CTGQ,U".BU@+bUI\bUHRU6"UT\tUT\tU4`ed U-#R U]9< U+ R U):|UBV U7AϊUS=+MU7#UL7xU*5xU.xU#MU4 U+ˆ#U>#U5"$UC3%UNK&UI6r[+U.+U@T-.U?I^1U=@^1UD@+:UI\=UUB%?U".%?U#m@UTLAUI>BU/%DU.eEUT\uFUuFUT\GUCMGUI\GU0&HU5@%FIU5!}JU+"BKU6"wMUR]zKOU* !PU8$|SU)TUKUPUUULWU* >XUJ\UMU6a]U76^U*5c^UI\t^ULa_U6._U^cUpdUH@;iUW`KkU+KkU6"qLlU^` lUNX!mU"nUKUf=qU+JrUrU5@tU=Q^uUuU%vvU6.01zU@501zU HzU@LzUW`~UK]~UGQ2U6"2U* ɁU.U-lU6+U@6U@7!U6#/dU/dUIS9UJTnۧU%$UTLULaUU6+)U6?1]U5!궰U9]ѱU+ ŮUAK=U@TVJUH^%U*5U@5U5"x UH@`U?5(U?Ic}UW`ULCUYUTABU,BU"U+!IU5U-pU+fU"fUGcULauU6?CU]^1UyU,yU?5USHU86SUU6HU:CU+ +U5sU7RǤU%,UK]UI\zU#OU+ XUITUC^1U#*ULa,VW`VNWVKV+!oV@6@VA7ZVMDHVL7T] V= V6.e V* V,5LV)VVNXVUIVK]V>RV* zV?S7 V8$V!6fVI\V%!V V*"V#&V+f'VA79'V6??*VMW?*VIS?*VKU*V+*V#,V.V8$h0VW`h0VDLh3VU4΄4V6"=7VW`/8V\[+9V+9V9%=V+!۫?V"2@VI\AV7"9 BV)%BV>R EVR]*FV-#DFV8$ HV>,HV@6U`HVMW4KV/NV"[PVC!PVI\PV*SVU`aSV=IaSVT^b[TVJ^sUVMWXV9%]VI\]V6?^V_V@LU_V"aVT\dV+dV" qeV?6hV@^hVHRdiV6.`@kV8$o-nV@^ pV6-4qVJ`rVDԬrV.BuV%KuV)1wV*|V.~V"`V@7~V@T~VMWVL7F`V;V=^чV,"nLVTV!WV`V@IÎV"nȒV"7;V.$HV.V9]RV+x՘V-!DV6~`V=3uV+ ~V轝VB]pV^UV>RLVJThV5>V7LΫV:VJT V" VC V/%iV6A"ViKVT]'VAJSV7LSVCV.CV@5jV,{V+7_VGQ_VU`]V87V* OV07V?6VV@6V:.V%V.tAVB]8aV:.VTLLVH?VKUV7A,V":V:&|cV.;V4 _V5V%`VU@^FV#)V+)V"OVA7V5@V6"cVB7+V.#MVGQpyV" V8V-^VR]V7#@V7#@VV,V* MWGW4>0WMXBW%?W>R1 WW`E WW`dWJ`4W\[W.$W?UWAU;WUa+=WLaW\W6-kfWT\W#W>RW=3F!WR]N"W:CN"WLCx&WI\.WGQi/W6?`/W,=2W,"n5WNXz6W7#z6W*6W6WTL6W7L%7W-#Y;W#Z;W\[;W8C?W9%S@W0#@WG>IxAWKUFAWGCW6ICW+!DW6"DW@7DWI\0IJW6.fKW@LLWU`LWJTYPW.YPW7#ySWA.@SW?6:vTW"..YW"lZW5@ \W-y]WX_W+X_W-#eW.7MhW-#lhW7,hW"7iW.$1nW hpW7L hpW}qW@TrtW.6wWwWGQ1jwW*8wW xW, yW6,myW6+O{W=IXW"6W.8WaW7LaWKUaW@T?WWYW%ąW6.)WLaXW5"WLaW#W"WU`"W4`"W=^W6I WMW#[WH КW* `WU`W1W6-qW5 WqmWA5W,"]vW/%]vW.]vW8$ۮWJdW8dWC*WS^﮳W@TGW"aW"FW,gW7+ýW+WWW,tW^`LW?SCW,5WAUW6"x3W8AMW@^ W5!W0&W+W6"w"W!*hW.-}W5!rW9WAUWR]aWR]7WTLW3>W@LN0W6?WJT#W>5UWNXYWSW+W@5RW.W7+W>#:1WLaBW,B8;W"GlW%WA6GWAW=QW[W7#syWWLaiWA6zXAK¨X"¨X5!6X#tX6"_% X: X+X@5>XR]OX-#FX0&NX4` XfX8 X@IX,^XGQX"X+>`"X%#XA8$X\[$XLVfX%X/%+y&X?TJ(XR]-X0X+41X][2X#73XH^4XT\z4X=IDe5XKV05XKC+6X6X6-"8X_`"8X_LG8X-#G8X!9XC9X-s9:X\[s9:XNX>X@TJCX-^CX.5DXT\+EX%EX7#EX-#HX.IX@LJX*55KX.9 MX4 p^MXGQeNX>RoOXAU4&PXAUV3QX 6TX@69VX"9VX/%9VX!$WX@TFWXR]LCD^X%D^X!`XGQ`XaXU4}dXTL6eX6-xfX"*fXIT*fXIRiiX%jX=^4lXNalXAK>mX5FnX\[h1qX.luX vX.xX"xX3yX#ozX8@|XJT|X8#}X Y9}XI\}X4@{ĀXKU{ĀXIS:X6XR]kdXLV~X+XȉX@53X>NUX?6NUXbbX=G9ԏX?5XI\XS^#XGQ#XG\nX+"uX>R"X6A, XtX-X"xX!5LX:&XMDۧX#ۧX@59$X+!X@7دXW`VX_`ܱXAUN"X X3XX"ƳXAUX4IX0XT]X?SЪX5ЪXCF]XJT}X+XITfX@5$X-X+X>lX@7׍XU`.X/8'uXU`X(X?6mhXqXCW#X8$)XwXX+X?SXAJItXBVXJTnX.#3$Y8$&Y+4O'Y6?O'YUa)H(Y,Il*Y6?+Y?G>.YU`>.Y6@>.Y9Kc0YT0Y5!0YA7(&1YLa(&1YI\E3YGQ8Y@K:YLWRnY*"oY@+pY@7rYTLrY\[tY.9wuYavY"xY*xY@5_zYCY {YE{YAUA}Y#QY".nY5nY,jYU`YCY#YbdY"4YLa؉YR]FYFY3FYA.FY+ aY@5IbY+4ZY=^YYB6ړYT]SY#xY-Y@6Y ϛY0&:՜YBK4YN-Y,#Y#YY%7YU`Y!3YMWYJ`/YT\RۣY#,Y  Y5A YR] vYW`6Y,xY#YR]kY6#NjYHRNjY_^ݰY*YLW@iY)4Y.'YC=4YY7LYHR'YASqHYqHY-#UY*6rYJTY".YYL7CYy+Y,Y>,Y,"YP}Y6IpUY*6yNY#Y>R̈Y6IY6"YUCY#GY,]YIA5Y#YT\O[Y O[Y5!NY5@Y8#Y !Y0&3Y@5Y!,YUIYMW~ ZI6LZBVMZ+4cZA_ߔ Z>Gx ZT]TZ@^Z]ZN#Z.jZaZ+Z,DZI\DZJTFZLa~ZKU5!Z7#"ZZ."ZLaw"Z>0"ZB7c%ZI\}%ZW`G&Z(ZDL*ZNXs+ZLC+ZT].ZS^I/ZJ@&0Z,0ZGR3Z35Zabf5Z/%f5Z,5ZI\z7Z+:ZU`_;ZT]+`MZ7+MZR]PZNX%QZMXQZ7L4RZ6.`RZKU$SZSZJTTZDLVZITWZXZKV3ZZ0&J\Z6x]ZC^ZHR^Z7#^Z+`ZAUd[vZLA]wZ5#xZ+!#zZ+^{ZT\p|Z,tZU^)XZ5XZZ86CZITE܉Z)sÍZ-NCZ"CZ-bZ"bZ?Z!}ZKUNZAU”ZϤZ-#ϤZ)Z!Z9%KZ\[Z_`X5Z*5؟ZR]zZ"ZLCZL7Z,˪ZT\=ZU`=ZNX=ZH^hZ=ZϮZW`eZ-#+4Z5@.JZ:C|Z6"'ZJT'ZISűZ!Z!SwZ`TGZSZSZ#ZA6Z?IZ0&Z3Z6.1LZqZH@XZMBXZT\XRZR]ZG\bQZ"Z"Z@L~Z )lZ7zZZZ7#Z)Z6"RZGȯZ9]$qZ*5Z+6Z5!ZH^Z9ZZ"RZAJZ5!nZ@LAZ"VZ5,Z6I,ZNX;[5>[^c[I4[C[` [H^? [0&' [+!5 [@+6 [W`9[6_[6"Е[W`j[>G[,B[x[.$T[U`A [8$A [6"U["4[AK4[VLz"[KBz"[]^I([-([6~\.[/[6?0[MW1[2[,/ 3[IRyF4["V36[+T:[6?B=[IR&>[+6-@[@5!@[BUx@[LaSsA[IREmD[@KEmD[.9G[H[AK(K[3{K[lL[JTR[TL[[U][S^[,"b[0K'+b[=4b[-c[>RϏe[6.xf[@+;$h[53LJl[".(-m[6+n[+ (r[0&(r[""s[+}v[I\ߴz[+7W{[6-|[JTe|[6"e|[+}[]^_Y[T\%[~[7+][.][,"[,"[0&D̅[6(^[B] s[=GaɆ[4=f[։[%[+[#[U`@[+7[9%[8$r[9])[T\܎[4>J[6?J[LaJ[>Rd[^`&[LW [;["-x[L9j{[q[R]҈[A.X[0&X[[- [)Tr[Laղ[+~ѳ[=G~ѳ[t[#lw[-?[6"6[.@[6@h[T\[KU[@*D[I\D[T\R[.[%}\\JTO\L7u0\\S8\.a\SJa\T] \#f \7+ \6Ap \=Q%$ \.u \?`\R]\. \#$\,R'\3\_`#\#@$\A6D:%\UB!&\U`h)\@6f+\#f+\8$3/\I\3/\ISB1\g2\6"]3\I\5\ 8\*5:\<\_^e>\%>\+!pi@\TA)A\>NA\I\B\6?I\-#K\* L\K]6M\U`N\5!d@R\5ZR\5#R\!6U\V\X\T\X\B]Y\@5zZ\R] ]\@7]\5*W_\_\ISb\T\(b\?c\6" f\6.Eg\-i\K]/j\)n\NX>p\!p\, q\Cr\+)ns\U`7v\_`mMv\X7x\@7%z\@5iz\8AE}\TL@}\5\@7m\39\\+\+f\%9\:Cn\6?ĕ\,"X\*67\MWK\@KZC\=[a\"ؗ\IRyݘ\\A@\Ua\MB\NX}\5AK\,\=Q\"\>R"\?It\JUwT\8ݯ\LW O\:CE\MX+U\-.Ž\La\A7\W`x\\>NQ\=I\)\\3$\UCj\6.-N\C:U \5>\."\?`\A\-]\@Te}\LUZ\?6Z\+Z\+!Z\5!\][I\/#\7#\@7Ov\LVJ\GQJ\6?J\U`x\ \LA"\>RV\.LCb\6- \6-\U`Gt\NXGt\\0&ߕ\TL\I%\4=.\>+C\+!,\KUb\@6\5<\C\HSk\?`7]JT]R]5 ]7"Ϣ ]/%]@J#]La#]6?]NW]KUZ^]8$i]6+O"]53$] &]8$M)]>R)]@5)]#)]UIqy+]5!qy+],"n+]SJ",]TLAh-]-]6"0]R]_1].3]Lat3]-C4]Ua;]>]KV_?]JT_?]?S_?]La?]%+?]I\C]3D]8$ E]"BI]LVBI]9]BI]J^K]?I:L]@6 N]O]HRZR]M7 U]-U]+3W]H56W]ISbX]W`X]HR)\].$;^]@+Q _]J`_]/%"`]b]+ Pe]:Cyg]"77h]+!Xk]_`Hr],es]+4Q#u].$v]S^|x]W`ox]KU=}]S^`~]-o]>R0]%}]}]JTQ]/%]=^]-#G]7-|]BV|]@T|]HR|]>R].]T]@J]DL[]8$Q]7L]Laמ]?6A~]L^D]+r]"]I\([]]KUH]L^']HRM]LWBn]# ]KU ]MW4]=^VV]T]]6.]"4]"]-8]?@m]JT|]|]8$F]x]e].Z]+]Ü]?S#]@6W!]+! ])]T\]R]]!$]%']]#v]4)L]-J]C]M+],z]IS]6+Z]U^Z]HRz]"g]KUsX]6>Z.]]6A ].]AJ1]#1],]5!]U`]?`]TLG^9]G^S^G^T]G^=I^+e^I\ ^@LԴ ^A9 ^8- ^, ^"V ^A.$ ^",^^+4R^A7^o[^I\^ o^,#^@K^_`^ ^"^I\$^J`o%^V`o%^^`%'^% (^6AA+^),^"2^IUF6^T^6^U`8^5?M9^8ؐ:^3:^ <^6.*=^C-=^+=^5=^+!)>^=^?^.@^+7@^"7 jB^H^K|B^6Jj"C^R]cE^JTcE^?SlEG^H^H^7,J^-J^T]BL^U4M^rO^53$P^_Q^.aW^Ua*X^0@Z^#W]^*5W]^4b^6?_h^+fh^@Ui^l^:Cl^-Cp^U4q^A7r^-r^#[s^+"t^A6u^Lax^?Tq+y^,?y^AIe|^Ҷ}^KA$^UIR^* ^?-͊^+!^5^-#.|^6"^Qڎ^4>Qڎ^T\^HR^>6*Г^@L^B7w^I\4%^3ǎ^I\ ^H5L^6IԤ^T\Z^*5^"ð^ħ^ISq^,^@L^,"< ^@^o^6AӼ^BV^LVܯ^9]V^DX^CN.%^.\^8J^C8ǹ^6.;[^K]^7#}^U4f^@+^LD@^.^+4^>&^6";^T^?^+@^0^^3JY^?S^U`^T>y^6"y^+^JT q^9]^:.0^^V^AKO^^^,"I^3Z^U^}^*}^@7 Z^IS^JT^H?G^K]lG^lG^+!J^I>?^+^!)^I\ ^.^B^@+=g^#?_C!J_/N_T\X_-#X_.+{_ _^ _-_ _6?E _d _ _C7 _BAī_`T D_>Rm{_ {#_?I'$_I\}$_AI_((_.$*(_@5\)_7#*_.4B+_4>,_SI=-_HR=-_5@5._".5._-#t/_6.ď0_?4ď0_U47_NX8_IR9_AUث:_LUӺ:_AUӺ:_MWӺ:_@T;$=_,;$=_!u<=_W`N@_T>B_LCBC_F_.@:H_`\J_3>gK_+YK_@K5!M_J`M_#M_KUM_+O_+!O_0&O_35O_5O_+O_4`2R_@7 S_U__`.U_U4gX_LaX_W`%Z_La~Z_J%[_#[\_!)\_5>*^_%*^_533^_KUa_=Q_b_T\_b_=Gmb_7Lmb_W`*b_NWf_0&g_Ua{h_-{h_tVi_R]k_%Zm_3+"s_#/=u_@Tw_Uaw_J`l{_9L{_#{_.E}_U__.C_Law?_5!"_KU_6-i_D:_A7x_K]0_@"_,_:&_?6z_J_S^П_#_KUJW_AU_UCb_,1_)&_*5&_"Ua_.#ꓩ_"_#O&_#+_6?_I\_*"c_* -_HR<_La<_I\_GQ_IS_MWķ_b_Qj_CQj_,>_:8_+_)_AI_5"&_6"4_"4_@6]_/%ѭ_!_3_AKg_@L!T_>R=_LaϚ_@7_?SҖ_6.l_6I_-#_!@R_!5ʵ_A6_>+Ϫ_@J_0Mt_)_6")_/%_@K_8$_)__@66_:_8$o_@Lts_گ_J`W<_ATp_"__`~`UI`AJҌ `J? `%|`-#'`"7]`TAy`,`+>`8ui`8D`@7`W`ZM`7- `@+ `LCU!`'y"`7#"`M'&`J&`6I)`7#-)`%@*`?2-`S^-`$-`.`/`51`6"mY2`@Kh4`7L}5`}5`/%8`@78`%;=`6";=`+p>`+ ?`+!>A`RCA`MWgB`6C`K]E`I`@5K`_` L`܄L`%BM`GQ4S`R]SS`%U`AyY`Y`?6,Z`-#Z`".e+[`3)e+[`:&[`JTI^`%[``R]k`5Sl`T\LWn`La0n`,",o`>R$o`*.p`J`p`6?Br`-#Ds`AUs`.Au`?6tv`!*v`H@*2{`"a`6.o`+@ځ`:&t`?J>o`6-Dž`M`KU]`F`F`A74`La运`v`0&`C-~`?Sy`* y`3y`!A`5!Jv`V˙`:`.`+5 `@55 `5 `*8`5"`t`IS`KU E`I\`@L`%OG`:9˩`KU`>5H`T\N`R?`Laѯ`KU`K]R`+`q`5@q`T\`.`+!P`HR d`5A`)``6"`+!d`".d`-#`,"P` `@` >`,@`+!u.`8$`ߔ`>RM`@k`MD`0&d`-5%x`W`y`7#`8C`6I`Ua`NX` *{;`#{`#{`,";7`MW#`JT5"`V5`LacP``GQ`JTM`5?aka-$ÞaAK a4 a) a0: paAJnuaU^a@+a.aJTka>a=I`2a.6`2aYaCYa"aBU.a3+GaA6a,"Qa6"#a# a0&$a@Iz&a>q&a>R(aJTJ*af*aJT//aA851a@KK1a,X1a+@.5aI\@.5a4`/7a#$8a-#6;a,Ei;a@^m;a,"V?a)AaVGa6.sHa"sHa, 8JaI\Ja8$NOa3G*TaC.YTa,-UaU4oJUa>51SWaU` XaJ`qXaHRqXa@TqXa4`[a6-2l]a+4]aH^]aAUG_aKK`aU^`a`aU`GaaISGaa9]Tba@7AdaKUAdaGQ\daha6"iaR] ja_`kka+ Sna7L2na2na*5doa6.pa=QpaNX qa8$:qaS=wua_`wuaIS1uaH3Y*xa?xaXxa@5{a*  |aJT|a8$Ia"5ia_`a.*Va6+ma:& a7- a*6$wa,a% ɉa7#Ùa"!aaNX"aJ` waCa@5aJ/)Ca,gaT\aDNa@Ja+ aMaݨa7,a0&;a@Ta"aKUQiaB]aJa6la3=lճaU`=VaT^Ӷa,4ka9%ѡa a?Sa][:aV`b a?6]a6" a?`ba)a5a +aVN`asaC(aB6Kba,)taJT>a>4a_[ha6+baba0&ba"wa.$a+@VaaC8@aU`a?Sa/%3a*6vyaT\a@5a87a# a,Aa}a+>LaT\~a3fa@TfaGQ)aa>R|a>Ra/%W^aAKgBaaM`sNb+4m^ b0 b7L"bD:cb8Qb5Qb@6b^Qb. b#b)bCLb!bU_u!bI\}#b}#b*5}#b,"L&b'b.9'b* 'bԱ'b6.dN(bW`c)b?6+bMD.-b][.-b\[0b?S51b0b1b@51b?6y 2bJ6b?6%6b-39b.$iWR2^b@5u^bSHb^b-#<`bLa$eb,"mhb/7mhb+7ib/88jb$#0kb8$kbE[mbqb@6ybT\myb6Azb zb/%+zb|b+ P|b4 }b@7b+!ub0&Rb]`y܌bA7@ؙb+nbR]:b%ᒞb8,`PbmbT]p}b7@bR]bazbU`˚b*ƫbíbLTb,"Tb. b:&bbT]|´b\[|´b]`b>RNb-b7+~b+Tb@IbW`bB]#b,]b\`Ub-#bPb:.˯bDLb3-bLUtb5"bC8v>b7LbLUQb>Rb.$|b#A=bͮb0&R=b@5{&b.b0&b߱b+!>lb.DCb5!bI6+bI\pb\[bS^b3*c-Wc+c7Loc5!c?-c)c,a c"4 c8$O c c'xcAIc@Tc,scT\'c"FcJ8QZ#c=G$&cJT͘&c5?3(c@+3(c?6w)c5@w)c9]*c2 -cI\L/cJT[0c..J5cAJ6c4`m8c-#R9c>Iu:cT>L;cL;cJTE=cR]=c Z=c8`=cWa`=c+4@c#AcJ`EcA.Ec*5Fc6"~bJcJcT]Jc2DKcY?Lc!6^LcdNcA8HOc6?dPc#QPc!QPcPcW`iQcoRcRc7+Vc+!"Xc>RXc7B[cL7k[c6"6]c=^6]c _c@5E_cJ`W_c@K`c%>ec5+fcW`~hc/Wmcxnc5ZocA._oc>R=rc?6=rc+vc8$wc=Q^xc.|cISܤ|c.~c7#c#c])c[݃c.[݃c5!c.9cI>{c#֜cncK]ΒcJ7&cU`&cIScIS8xc#)c")cC.НcT\BcLajcR]DUc+@6*c9]6c@6 yc7%]c5!r3cT\cHRyc%CcKU-nc){c@Lc5cGQc6?D&c%QAcJ`cc"cJTzc+ Wc2cDL%c:c8$~Bc>64c+>c,qc.qc+(cGQ٥clcT]lcAU7cA77c+cHTVcc6+A c?ScI\cc+!Ac.!c+!c?6c89cC9Ptc0&c%cW`c.R;c@7X0c=?c9% c.c8cU^"ccI\CdcCc"Cc/%c6+/d/d#d@J;odBVd+&dLad@Ld.(d,) d@6 3 dLW d.# d4Id,d@TbdT\_dZoddd#fd?6dU`d=^dK]ud@KdA.BdLUrd-#rd)d"4 d>R=)d.d_.d@TI/d@T2d2dA.5d>R\6dW`c9d9d6?9dA6;d6";d+6;d+45J˳dJ˳dT^cdd-#1d"4d6+d@LKd@J!(d>Rd=?jd6"d@5tdQU]d^d0&[dAJ2d3>UUd+"ad#9, d d5?d.^d+^d/%Td_dUIdd@5dW`d5d#d5d.d.vGd6Afd>Rkd%?ee}eHR}e=Q.e-#vDe*5vDe7#e0&PeCBe*6BeMekJe.DneT]neH^e9% eI\|%e=Q&e6IR'e?6<&)e#֑)eLa֑)e@T6*e8A*e>+A*e>,u+e7LB-eIRF/e7,A0e-#wA7e:C9e>9eW`:eA7f;eG4J;e+P=e+P=e,=e@5>e"Be*Fe3#Je*¢Ke¢Ke,"NeW`iQe!+QeqRe"(Se8:5Ve#BVe@TBVeW`Ye+ 1Ye %Ze%s[eI[e"*]e)4=^eT_eT]a_e\^9 `e+4tce>5vce7-نee5*feGQgetheT\he7#Eje;ke+pme.#=neISne?Gype+@pe@L@reC.ueCue.-ve.7P[xeI\xeHRZ~e8CeLaꒀe3+{e6"^e6-^߅e+! Kece6.݇e8Cze@L~e"4$eI\ze@+÷e+ye6#ee->qeL^"e-#T^e9%T^ee@^e@Ke!eU`eR]e.?Ve-#iee+le"iee3?ҼeS^].e>eI>e+4T3f5́6f=^9f7"ʣ9f#9fTLfy:fNXfy:f5@fy:f4J;f_`:f#9DfAI7Ff_`Gf7-QIf7L JfI\gKf=MfMf/#{PfD0Pf+ bRfMDܫSf8$'Wf@+;Wf7-Yf5"O;\fUa]f!_f _f?`_fRdfT\efU`P1kf5!P1kfVlfR]mfITatf?JvtfKUvf?Txxf" f#ǀfHRf7!5fG]f6?+f,4fMU㝊f6, fAUufMWufKUf+f.)Ѝf6AfCf̀f?TfT]טfLW~f!,| fI6jf5?f:f?5:f/#Tf-2Yf>Rf#f-Ӧf6Lf4`VfJ`Qf6^YfNXf7,f7Lwf7L)f/%f.#Df#Clf.f_^`f* UfU`pfA7fJTfAUf0&EfJ`f)Ff#1f4 Zf6.f?SfHR.f8$f+ ffKUfKU gf-{fMXf6"f8$f%lfT\lfB]lfMW]f]f?Sf5,f&f.f#DfT]|fIA!4f?6fUaCf"f#f3+fC f5f1f6?Lf-#ݼf"+rf6?f%cg7Lg@KВg5!g9Lg6?gI\f gA7- g+# gJTk g( gU`gMUgS^gLVg@T7g?*gJ8g8G<gT^|gg6" g)>gLa)6 g"!gS@#g-##g".Px&g+Px&g7#G>,g+X-g-X-g@60gR]0g&1g6?(2g6A2g"a 3g5В3g,"$3g7# $4gC"v8gT8g:C!9gG\ #9g6?V9gR]}:g+!P;gI\>g6?(@gU#Fg"*Gg6.bIgAIMLg%zLg,zLg!|SPgA6ΌQg,"RgLURgA.qSgKUUg>R?Zg+ _gNWZbgH@eg=Qw{eg@Kgig" jg"tjg4IkgHRkgJ^lg@6RRgHT%lg-#Øg,5Kg>Hg4@gT\|gŨgzSgB]Og,dg-dg#ϱg+49g6?>g>g:&~g)~g-g0&Ҹg%g@6cgR]gI\g?SgH@g@Ksg5gg@7hNgg0&ggJ``g6IQg"g".ggLaig`;gygC-\tg#TgPgAMgAMg#Cgng%.gmg>g>6 g*6gAIvgI\g6.\gT\Ogg0dgLg+hW`{%h+.ZhSHbhGRbhNX98 h,.J hU`:h#OhAU>h/%|:h"@WhI\QWhSAQh+ chUah6,-h+!-h>'hR]h6+ h7# hMX A!h!hp"h##hD9#hA7$h+ &hLa'h!*h(h7#h(h.h(h,"P+h9]q,h.cM2hH5/]5hC7h0&7hH8h,+H8h!+N;h=QN;hJUN;h_`FhI\Đ@hG\AhT^QVChGhHHh:4Ih7RKh@6MhNXMhU` CNh?SUPhOTh.WhT]4Xh+LDYhKZh7-}\h)}\h.}\h,"j_h-#k_h6>"`hGQ.eh6"jeh?6_ehUahh)Aih-ih_`}!jhW`Xlh6?E mh6-@nh3nhI\B-ph0&qhUCshbuhA5mvhGJQ2whJTwh+7Xxh9%xh8$xyhU`KzhDLI{hI{h3F_~h--~hITOh#҂h53\hIRh6h*!gh㬈h"CՈhA8Qh][̊h7AsϊhISsϊhKU ch@LhK]^h=3юh)>h6,ԐhI\$hUaPhBU+hTLJ5hR]hJTEh7#h)hB8h-#쯢h?Tdh&hIT+hW`,bh@57hhh6IXh3+zhJ8iߵh!,ȶh8BhA.'hSH'hI\I/h>H/hNXLh5@ h6?Ahfh6+hh0&6h4>*hLTh+@h>Rh"h?h>R$h6"h-HhMWhISh9]h6Ihhh,"OhU4h+4Nh+ h+!fh+!h6-hAUUhGQhI>h#h d>hW`hT]dhA6Uh6-hMDjh@TjhJT{h/%{h:&Mnh6IZhSh*5i6+!.i.#,Di04i8#;i!kiISkiKUiiNXf7i,fi/%ibaGNi%.iD9vTiwi@L iz!iISd!i+ J3"iITQ>"i7L#i=IF%i}&i?S3%'i*6 'iU^(iB]*iI\Y,i5,i+P-i6A-iB6*.i*.i!}g/i6"%0i7#i3i]`0k4i6.(9i7L_:i% ;i>)/;i+=ri,@مi6"Vi`U!:i3ki@Ldi%9i0&iU`i>#3iIRԛieŠi,>Ši5i:&iAIǦi@7¿iIS¿i4` ipi i>+oiMWiAUѱiT\yDi,!y׳i%y׳i.y׳i+!piAiG]Pi6_i*+Ui4>UiR] iT]}i@7Mi4)㺾iI\LiKUki.[iCLci0&i6?JViD9jijiT\i`_giI\[i"XiJTniLa?hiI=i6"Fzi F%i!i>GgiI4Wi6?:i7Li)zi-#6iB@IiAIi@6XiH@i^[[i+55i@K^i.>i6+8#i@^i@+"i#\_iպiI\պiMWi+i.+j#: j Q j@Tk j.M jj"1wj.$<jLa,aj\Sj!Ǯj9%c'jIT'jlj?S0jNX9jW`ujHRj, j6. j-!jLa"j?6^%jKU%j%jT\ &j?S'j"N*j)5[+jBAޒ,j"ޒ,j#)-jU`.j/%&0j% 7j[ ;j"j?S܀>jLa?j?j@TAjwEjR]:Ij+eMjMW PjA7PPjGQhSjISprSj@JSj9*CUj.:Wj6?QXjC-QXj-/HYjYj%[jD9c^jc^j,_j>_j%:-aj"_aj96bj6bj?SRdj fj.fjT]tgjR]vfhjI\vfhjMWijNXijtmj6?SnjI6 ojCoj+!; pj6,qj%rj4?<5sjAK9sj%/yjGzj"Pzj?T~j>R4qj7?Rj#2j%ņj9jA j"jǍjKUj2ŒjI\jBVj-j0&#{j+]j7-j j+4lj+@j7#"j.oj6ATܭjI6uj,jLUjHj.9jHj@Ijj%CjR]}j6.E;j%jNbjKUwzj-Zj"j?jT]j.$j+~;j@5 qj,"jAICj%~cjLTxjW`I?jH^Dj9]DjISTj.#j-j+"3j9%3jj"2OjUjAUj=Gj@69jR]jHRتj#Vj@6"\jR]jA.jK]Xj6+jQjI\Qj5j7@j\S]j.~8jIAΚjlj>R2jLa2j@TUj5!j,kDXukR]k7,k5{k+k3k@I k#lY k:.} kIRå k k@T kJT k-1kkA7]k=Q]6kx=k,/k3 kAk5kNJk-CQ{k%k9]ӛ!k!ӛ!k3+\%k82&kKUw&k?`w&kLa&k+!)k Ū*k.a,kT_ N4k#6k)49k+69kH@;kNX'k6?>kI\?k6??kLa4@kTLsxWkXk4>]\kAUh<^k8-^`k/%ek-3hk7#NFhk".jk#jk@6*lk/7lkA.nkJ`nkJnkH^Fok#( pk4@_pkI@Spk"TqkU`uk"%fvk+!Mvk][Gwk?G7wkR]7xkJ4zk7#:&|k+~k+!~k~kLkT\k%okAKՃk݃k.tkD9Uk%%.k@k@6'k]kGQ]k=QokKUypkAUk,"kUk+6}͗k"7k.љk@7k6"ٛk>Rk@5kU`\ťk.#K{kXk6?pk+ 铬k*kkBVYkJ@9k@Kk~zk3>k>+kHRpk>R瘹kD9FSk$kG]ϻk6?ϻkU`Ck#~Zk6? k4>6k.cDk,"ikik7#kL^k@T~bk/:pkIRkJTkH@*k+"k#k7#k?Sk_;k+k)k,"GkLUHk"Uk+"Rk@Kk-#kJTkk+!{Gk*6IkW`k$kDLRkCMMXkk.9k&kA7kLa5ukKUk#Vk"vk@5kA6^k=Ik+ k6.CFk"lA.sl" lI\ lU^ lGQ ll%l,"?Cl?S?ClHRXl+J*ll:C l*6d/!l_L3N!lB6"l)@w#l3T$l6-&l%ނ'l@5ނ'l8ނ'l-#y'l)lISZ *lI\f*l>f*l+w+l,n4l.y26l*k6lNXk6l?S(;lKU;lLaRl?l>3B{AlKU'QBlMDlsDl+,$Fl@5LHFl@6LHFl.LHFl* hFl*6UIl+Il3Jl6+~Jl?S~JlHRNl9]QlD:Tl>G_UlMBzXl9/XlJTT\l7-qI]lW`9^l7#-;^lLW-^lR]n_lT]_l?Scl@Kdl\2dlGQ>fl4 glKULhlCFCil+mkl#5kl+llW`8VllU`eYll7Bnl6.nl6-4olHTQwqlMWsl6"Ctl.$Ctl/% ul7";vl";vl@6al+@Vւl][l+l/.l%)l>R;lϋlT\Dl4"lJUlJSlI\lJT1l6"1l%Xlݜl@7_l9l+lLatl#/lLUPl" l ^l,A ?l-plGQCl}l5*лl=^5l@Tl#rl4`]l9^l.9^l+lllmlAJ^lLaYl5 lGQMolT\lA7hlCW,lA6=l#+(l%1lH@xl.9lW`l?SlI\lllDXJl/:rLl7+l>RlJTl%$l=3*lPl"!mN"_mG];mR] m_^~mIS m7# mLU mA7] m8D m%\+mT\rmmD?mAUDmGQDmR]Cmm#m][PmI\K:mGQLm* Km_L̶mm?5C^m6?t#m9%UI&m#H~&m?GM*mJThS/m# /m@60mR]~1m,>?1m5!W5m?SW5mLaW5mJT(5m-8m@L8mIS:m*5:m?6j;mKU[;m"WAmU4Am4 ҦEm!ҦEm8Gm-#%Hm\[OKm@KOMm4Om-#4Om!4Om7#2Pm.Qm/#RmW`YmYmNX^Zm?Sb+^mK]^m#`mW``m,"(emkmS^͌om=Q͌omU`rm9%3rm^N!smH^g;tmU`g;tmG\um3m~vm7Lxm@+(zm6?(zmR]Gzm Հm%mmUa;m.;m-#mW`_wm@Lߋm-#`ZmLa`ZmJTmtm@7mK]am6ImmW`m-gm6Igmm>R^umƞm.Bm]۠m"D>m?ScmJSm.$ݩmIS,;mT_ދm,"m6?ݺmC%m@I-9m?6fmU`fmHRkmA7m,!m@T!mHRTm5,mA6$mfmAUfmKUtm:&tm#tm0:m+I m m4I mI=m"m.m8$mG\m,m_^mUBmT]mNXmITtRhmGQRm@TRmU`@m#@m,[m5@a@mI\hm8$hm3m@K7m6.Vm?SDnU4n8#9n nm n0 n5"~ n6.FnTLn%rn*!nAKnAU Gn6?!nIT!nIRUn:&n7#nT^Yn.$n"Pn6+N0 nI\N0 nHRr n#n@L{M$nK](n?S@,n3aR-n=?^-n6-]/nU`M1n#1n6"2nT\qY6n%9n,":n!$F,ʥn@T=n=3LnH^Kn.#n*3nJT[n/8[nK?n6AnKUz@n&ιn\[n"6XnR]unA7wn.$уn*5gn@KǨnLacn5)n-#V=n#0n6.ĉnJ` n#nn7+nIS^n6"^n,"ɇnLaQnKUxnUa 4nLCn7#b0nJTejn6.en6AonI\nnT\2n6?Ӷn"nB:7kn6?n6nL7nC9!n,n8$n5!mnn.Cn7,pSn.pSn#n6#Rn6.Vn-#HXn@T(Uo5@;oC|oH@o6-2oH? o@5 o* o@"GAo%DoA79o?6ZoC.HoDXoUao6.o7+oLCz$o5(oHRy(o@+sx)oW`?E+oIR6v2oJ3o+J3o.t4o=Q7o%oa9oJT :oBV=;o4 Ao+Co+IoI\Ko6^=Ko:&LoR]LoNaMo+8xQo5@8xQoDLxQo!{QoSoZSo:CZToKU!To53=Uo.Vo-5(yWo%}ZoA7KZo/%\[oA.7}\o_`$]ohE]o"co-#Ceo#fo,GdfoR]UgoT\fgoAUho3+ϓio?jo,!jo\^Iko% lo%mo!*ҬmoJ`Gmo8Dpnoz ro9%isoNz uoM uoU`%exo+>|oB~o=^~o9/€o.toNXS߇oMABo5,鹉oI\oAI+oLVیo7#oLaoT\roDNo@7roro+4Uo3Uo,Αo"Lo)5OoJTjo,>o4`o^:ؓooU`JoAUloAT)>oAɧo)Yէoȩo?TENoKU-oMA{oUaðo4>oR]mRo7#po7#oB]oGQo] oNa] o5?) oo,ko>R#oS^#oH^ o#ooT]oAKoGQ.o5,o-#oJTho?S3o*"Bo6?KIoK]KIoIQo".}ho:^2o>Rl|o@5o.$o+4JooI>_oU`?o9KoIT'oLa]o?`oLaLoLajoT\&oMBo?T=o@LԭohoNo6"o%1oR] oLT4toT\<o,"<o5!oo>)oo-poC̻pS^z pMWz pLap4?mp+"p8C"pD9p=^4ppp+ pU`bpT\p5!˗p/%ђp4=p+ 81 p@KrA pX"pT]%p#,$%p7#L'p-#'p=4$)p=*pT\)*p"4J4+p=^+p"-p)u.p6?p{/p@+Ռ0p.Ռ0p.%0p@71pI>;2p7.A4pT],a5pS^8p6?pL9p7-^9p-&:p,?pK6ApI\Ap6+ Dp.Fp9]Fp@^>Gp?5pwHpIpJ`0Jp7LqJp+qJp6- LpTLtOp1Op#QpW`Rp.Sp?SsTpT\sTpI\"UpXW,Wp6"EWpKWp+PWpYp,Zp [pLa\p@T,]pD9,]pB9 b^p.$d^pC(B_pLA~_p+ dp\[epI\ep?Sgp?SipU`lbkp6?lbkpGQ%mpJT}pp"pp?S1(spB]usp@Lܚvp0&IxpLUIxpLW5p,zJp#!pI\!pLaMp=QpU`|p#ΉpW`p7#yp6pkp6A#p=^p_LXp6A pMBStp+p=?p@TqpT\dܗpNXp?`p- p%pCUܜp-̝pLaB%p*6B%p#6pc@pT]埤pU`ܤpW`ܤpI\pJTpI\lp7.|`p"Bp,"냪pJTp5lep.9ĬpW`ppTp9]Wp+}p%)p@5Gp-p-pg4p?HpA.p56pI\?pLa#pT>lp9%KPpHTp=Ypnp6I#p>5yp,up@7ppGp6AqpQIx[p3x[p"ap@K=Pp.sp\[,Fp)*7p@L0p7#pW`Np?4.pQp,Ap\pT\" p"p%UppUpp+!p+Ap65qC9PqR]qW`3q@L'8qA6`q+4`qU4rq@T&q6-)q5!0 qW`?Gq9]q+!q@Lq@5q8$Aq+"A<qhq8/)q*8q#؏q=Qq@5$qAU(qq.$Yq6.qH^Iq6.% qTL qK`\!q-!q:C"q6+$q+g&qg&q6@(@'q]^1I(qR]M)qIS*q.q8$$/q=Q /q@5/qI60qT\s4q6+4q6?E5q6-:8qLa:q6"Zq,S)]q/%]q^q]` ;^qKUZ^q@Aaq, dqeq%gqMWhq6?jq9]jqBU:9lqgnq+"nq>p pq][Wqq,Brq~;sqIRQsq+BtqLaNuqzqJT{qC8{qJT{q{q]}q6+qHT,qITYqGQQqI6qq][Љq3Љq#+\qAJͭq,sq5*Iq!IqA6q@5qCgq!6gq#6gqI6aqJ`aqMWNJqqΕqAI5qW`qq.q?Jyq4 yqq7#q6#Y3qG]qI\qW`qLTq#qJ8NYqKUqJ@q=@q@Lq_`q5A(q]qnq#gqS^q6? zqJTq+@**qGQq9KqNq6ASqJTSq@TqDXq6"8q+qC.Oyq+ 7lq:^qKUqUacq_`Vq`q,"q".q qNX qH^q-!q+dqB]dq-qW`qATQqUa\r#+{rAU r-# r.`rLa r ,r2r%r?UFr>+: r5^z rLW!r:CN"r,x"rI\#r.%$rT]8$r+4v&r.*r6A+rT^~-r-5".r6-".r8$R,/r?5/r0r6?C2r"x3r"4rB-a5r"7rKU*t8rBk:r#=;r,=;r6"~S;r~S;r"~S;r0&x=r+ >r/'Ar>RYAr6?1Er?MHr5Hr0&qMr%iNr?UnqNr6"NrDL %Or@6 %Or5 %Or* Rr,"zSr>RdTr^zVrUa]Vr_`Xr4?uLZr!uLZr7-uLZr"uLZr* ![r+!![r[r-#[rC"ٽ]r#C`r/: ar@KOR͚r͚r?SrR]-fr@5SrU?r.#rr5!xr/%xr+r-fPr>rHRcr=4rKUEr5,Lr5%r?r#fr3 rW"r7#DNr*r4`ܚrH^>{r@5zr+ hr.!rwrS^errLarMW&sCs?Ts\[ s"Ys3TsUas)/s6?Ds6AsAUs7Lss#:sDLVsB6sI\ OsHQ~s=Is-#}"s\IL #s#+D$sI\$s.$(s#)sW`P*sB]*s \+s+s,s"[.s#2s-{4s^`{4sJT58sC99>sHRp?s#Fs% Is!OJsUa!Ks>R(uKs@T~KsC9VLsU`,Ms,qMs6"qMs* '6Ns5#SQsS8@mTs!@mTs,TsS^3Vs.ϞXs%HYs \@Zs[[s@K]s_LxasW`as@KPes"yes9Anfs-7nfs.7hs8$Shs>RShsJTVdjs-#ksBVmsMAns7+IosITpsA wsNXt'xsGQaxsT\axsI\xsU^X8ysNXzys-S5zsT]C}zs,"|s=^N}s"8sJT͇sGQ͇sI\~s4`~s5@sTL/݌s:.AsLaxsٖs3s%\s%X@s6?GsJT۞s5AsAI-˟s,"s|~sUJsB8Ӣs`U-s,-s3HsT>sHRȃs@6qΩs6"l0sKUPis7@Jɱs.}s5Rs"Cs*Js wsC.3osA6s.sLVTs5*s6-sC7Ks>?`s6?3s,6s?SsJ`As.9s@K2sR]NsJTNsS^ s">s8sJ@ sNXZs+!sC:&sLasI\,s5@=s@6{s]sHR.s6A!PsK]s+0sKU sNWsMs78zs#s0t@Kt,/t"U[tD9 t!" tIR t%$t5)tAJt".t*6 t6"t5!Z3t+!Yt3!tH^Ct@KYtLU tLaj$#t>R5#t%t_`'t/%$'t6",tC.tW`73t+ M6tIS8t.L%=tISF=t?J=t+c?t,@t,"lDtHR 9Ft3>Gt%uJt_`BLt+!OLt@6OLt)uPt@5RtU_|uSt.#xVt7#\tU`\tT\at?dt+"Јft"Јft)gt4)5*ht?6n&itHotHot?59qt+>srt 9rt@TAst"6Jst(5ut#>B0wt%N_wtHRAxtS>izt7#{t+7b{t6A|t}t@T[}tW`N~t]tT]t:CӇt/7Ӈt"7(tLaxtT\| t@5UtaUUtLTkt.$3t"Ct-#^utW`0tAWKtJt)?Mt,"tLUtC[*tG\[*tT\[*tISdt.t4 ̙t@7<˚tJTqCtU`Et5!΁tU`<"tJ`jtLT[JtU`tt`T-t@K{tR]lt+!ŮtG\ŮtISt,t7LCt,pt`t&tMWNvtUCEWt-C^tS^t3r t7.Ώt+>&t:&0t"t+Nt+0UtU`>t5t7tT]ozt#t+t)ntct?5et9]3t-t,6RtBV8tW`]tB8Gt*60t3*Ӱt)>t>R"1tUa"1tBV"1tK]Ӟt.%t4>tLat+!kt9]t%P_tNt9L:tNX't.tT>t) utAU]tU`t=It"pt5+pt.muJ`uU`5u" JuW`u#u@Luo uu/#u5!wNu3)u.u u@Tu8Cu7@uHR&u-@Ju-\uA6\u/%8 u-#!uT\&u8$ '*u,"3*uR]+uIS}-u-uMW-uNX.u=[c.u8$@9u. :u ;uQ?N=u">u6+Au6">Bu7. Du0& Du! DuC.Fu%HuCKu8$Qu6?Qu6@RuR]G,Su@5cTuLW/Xu%1Yu?SYu>RZu5?\u?-*^u6?A`u+Dcu,"/guMWyhuW`jhu0&jhu,#iu"iu.Jku>luCMbmu-B]qu,XJ(su=Q#wuKU8bxuLyuT\{u{uC|uT]u@KЄu"Єu*"uHR5u?Su3CuU`(uI\u?5A`u7#uJTu**uR]HuCNu u-#u-#zۗu:& uG\qZu BuA7uսuT\cu#WAuGQu7@Iu#u\u%uGQ6uͫu7Lޫu-iu@Tu6AFuLWu4`Եu7#ζu^I $u7#Tuu@6{u_`uKUu>RuJT7u=^uU`<0u.$Ku]`uH=Cu5CuA.Cu+!ELu`TELuISu$6u>u+u 9u+!&uI\&uGQ)u7LuW`tuBu@Ju@+9uT\u+!uW`vuu>:u)u_`Auu.N u:CZu &u5&u.T:vU`T:v)*vMWv=^sv.$xv[;vA7 v6. vU`vT\؎v-#I}vI\LvH^VOv@50JvIS0JvGQx_vKU`v  v8-2#v.#c#v7Lk/(v)v,+v#+v-#g-v5r.v8'/v.3vHRS3v8D6v%Id6v#]v6v3h9vT]h9v?Gh9v?S6;v"C=v-=v-#=v6.*?>v0&_Bv"vCv4?CvW`&Dv%!EvKUVGv,Ba HvH@IIvA7(Lv/%Mv6.Q)Rv+!Sv#PlTv#Tv.6Uv6IUvTLqWv6"qWvC.:Yv:&\v_LH]vMWZ]v^`b`vISFbvA7dvev6"f:gv* AKiv7Lmv:Cenv ;ovW`pv\`Prv.$sv36vv4`6vvLaSyvJTSyvW`o{vNW6H~v6?|~vS^~v.A0v-tvU`Qv=^Wv?)C6vI\fv6"vK?7v7#ʉvI\{?v/9%v"vCWvJ`v?`|vTLvU`Fv4>2vU`Gdv/#vKUSv+ ۢv6.^vA79v8#v6"[̬v%l vMWEvJ`WvWv))vTvJT0v0&|vJ7v\[v+ %vov@T|v6"5vR]&v?6avR]zv".vUavB]|vLCvJT>vv+v6"3v6"Sv-#U]v* U]v@6U]v"xrv"xrv+v"v#ȗv vN-sv@KYvA7$vT\rv7@ӹv7+ӹv+nvH@?sv?4A#v_`v-N\v.$N\v!Lv+ Rqv#vTLvJTUv-#Zv8,vLavbvMWbvKUbv@TEjv=@v@6ɻvv6+Sv6? v* jvLC-ov#2}w9]Vw.$w6wJ`U5w@Lx* wA.ww?SwJ(w$3wR]{w-wA7 wU`5!w;!wHQ "w.0#wW`$w5!$wY@'w7#{(w6."d)w*5e-w?I 0w"0w.0w+0w/%3w.DN3w"6D3wLV_5w8A96w#a9w;wTLݺ?w.Cw7#Ew@LEwrGwAUXGw"XGwkZHw?GIwAUIwMWZpJwR]lJw+5lJwI\1Mw>=Qw8$Qw:C#SwG\Sw!UwC.BiVw%@_Xw7#'\wGQ]w"7]w7L]w?5]wJU2G_wW`d%`wTA`w6"DfwLaRhwLWdhw`iwkSlw-lw* /dow, pw6-b]rw5>4uwLauw>R&zw.6zww7#$քwA7wKU鞆wS^`w1wIS1wU`ɍw%Y#w@TVw`TfwĐw6+dːw6"wJZw=QJZwGQJZwU^zwDXYUw.w-@&w.twBLw3+ w7L w-# wMW"5wU4$w?w":w8[Sw%]wW`6dw-6 ȳw4`>MwI\w6-9wMW׻w^[wUawLVUw%9wNW콿w9Liw,.ww wIJ5wU`Tw:COw@UF w=QwD*wTS*w^S+wCw:w5>kwkw=Qw"Mw8$qwWL\w.$w.w,wMWw"4iw%w@6wA6w#jw7# xW`:xH^LxZIxT>[]x?6~yx-#~yx/%@xK]݁ x\I݁ x^I x6.٠xBALx3+ x6?Nx-Px6Iaxx*!xMA'|x x =x#5xWNnSxAKx6"1Tx%Ox]^{x@6gL(xT]gL(x+6'*xB]h*xJS-+xU`-+xGQ+x+x8#z-xNX.xD9 2x:C<2x_`mp7xUI88x-7w=x)`=x.=x,"=q>x4@=q>xS@=q>xH@+>xT\@xA7@x+!\Axa4Bx9]BHx@L3Hx-#Mx1NxNx:&NxNx6"OxR=|Px+|Px6"(CQx7AQxH@vUx7#vUx0vUx-#UxW`Ux7+<_x bx@6Rdxhx\[95ixlx0&DrxT\Qrx#5sx)3sx-txvx.$βzxH^fz}x][fz}xU?gx-xJT"x6.xKUUx.$UՃxGQzx:6x) MxG\C݋x)QWx%xMXrԑx7,Hx* .x#ylx/$xATxM8wxTLx6"XxAJ^x6?Cx4`*x8x6+שx="Bx,"Dx*x xH^?x7#x@6fx5 x_`Ӵx#!x@7!xA7p*x.xDxU`x?`ˮx"CWxD9 xcx$"-x3Rx xC-x#DxIS$x+xLTDx,"Q=x#5ix4"Xxpx#x#ݩx* xnxH*ݬx3=xAJxTL3x%xIRx^[xAK xC x8qxx7B5x35x)x%x9LM@x:&M@x#0x^_XxC+oxT]o6xJTxT\Rx""x@5x%XxIS\x5!\x,"Q&yB,Iy+SyI\,y"Yfy,"y.$9y6- yS^ y?6 y@6 yA8%y/%YyHRKxy3)iMyGQiMyI\,yU`y!,syAIyR]yR7y#y?SyCWuyJT y6"#yU`L$y@K&y"4;"(y?`+yI\+yp-yR]p-yGQp-yJ`7-y-y$"<1yT\<1yT]Fl3yKUFl3yAU4y=I5yUa7y:&#-8yUaV8y\I8y*6y;y+pjyLVO0@yT\HAy"4AyG]ҮAy%Dy]EyVEyDXW3Gy%JyPMyMyA7MyB8|PyJ8Qy.Qy?=VQy5#D Uy3Uy+ sWy.tXyRZyUC[y+2 ^yUI|cy.fy3=gyISNgy&:hy?Shy/:-Zjy>R%jy#'eky7#-oy)pypy," [ryS@Isy+4jsyDbty.btyD:zyMAyy6Iy@Uy* y,My3yB6y8y@6>ly?Sky,ky#+y/%y*3y!3IyIy8$yy* ӏy6,yU`gyWB yT\.זy* y6.CyW`xy\[y#ByL:7y7@ y5*jpy>RfyLay6.y-$բy7#8Ҥy7@y,"y5!y6"fly+yB]|oy6-{|y7/y+Ey5#¹yyJT&y@+߽y* Yy6-yUay.$ y5@Dy"py#nyAKyy%y#AyKU}y?6y8;yG\\yU`Yy* jGy-y{;y%qyU`y#yy*5yy#5y"Uy"y@+y@7y@Ty?SyK]Gy@L.=y,6y_By;y+;y+!^By6?2y@+4y* dy8$dy5! yyyS^yH^PyyU`y6?zzR]ƿzI\| zGQ z6. z- z"CcK z z," z@Jq8 z@5q8 z0&Gz=IjzI\}z9%T^z.zMUhVz3;z6I;zT] zI\G)z@+Tz#yz3z][zU`-!z)~!zNXʷ#zLa!%zW`!%z@TI)zI\.zU`Z2zT]Z2z=Q86z ;zKU(Bz3#<>z7#4*AzR]JBzH?@DzI\aEzIFzC9IFz0&DtGzS^3.IzT\IzUa!Kz6"GMzB9NzC.NzNz3NzGQKPzQz+m,RzˢRz."Tz=3sLWzTLWzA.WzL@dYz=^DYz-&[zUa [zR]Waz7+*dz**dz@5}dzVez=4VezU4ȃez>Iez.ez,"{fz fzT\\iz+iz+!iziz,"jnzK]nzL:Ünz>4pzipz+ vzlwz7,؃wzA.$xz@5BkyzLawzz@76zz6."|z9LLz HYz"CRz"#%z6?z5!Az#Az@Kgz4>@zLagz)?z%Oۙz0&z+㛚z+ .;zW`u̝zI\zJTOzzb z,+z+ Rz=GRɰzJTsz*63z-5zz?Sδz6"Mz@Lbz:Cdz.ӹz@K"+z@5úzJ^$zAUezI6>zT]NzI\z9]zMWҷz=48z4`zW`0z/#z,"=zL/z#{kz6>azz1@z?IKzLaz?6 z4`dCzT]Gz#0z+zW`#z)4z4?9_zNzU`zCWlz+!ZzT\DzKVz%ξz8C~{!6{,L{@J0{-*{TL{7#{{!) {+Y {@L{LaI{%{?S{I\{.+ {"7~{I\{{ {@L"{ ,{"Y{.98{6,{=^2 {-##{6"9${.*${NXE){6"o/{2{3{@Z64{.C?8{8.?8{-:{+A<{R]!>{* ?{@{AIAB{@7٣C{#=D{6- D{!,`G{@6`G{ >I{GQ2I{-#BO{I= {R{+IS{T{+T{6"A-U{NV{:CW{8$X{U`,mY{+!,mY{6"B[{.^^{-#_{a{,R}a{KUdIh{#dIh{Oj{T\;gj{6.Ֆm{+!Mm{.7_n{,"Wq{v{6AWx{0&x{"X}{,{L7J8{U`{JT{{RSLτ{U`r{A7u{4 u{.KA{U`F{AUM*{%7!/{U4!/{J4{U^gz{@K{I3{6"7J{?S{-#;{TLT {/8{={MW={KU={GQc{Ӳ{$-{.$t{A.|{/#?{T{>,{JT{KU{L7{:3 {ʝ{I>xG{{=Q{7#{* {6.{KU {S{La{La{GQ{-#ڰ{#D{{JT{{,!*{B:u^{ {JTЙ{%{?5{LU{+@{GQ {-#Y{"B{6"B{.T{JU{IT{"Z{/:{KUR{=Ah{LaEZ{6+{MW{AI&b|  |=Ip|#>|.|4`R|?S`|#`|0&|=AǴ|VK|7Lh|*5߰|"4 |5?|_`DC|?6V5"|ISe#|*1#|R]]Q%|A7]Q%|,%|?-%|/:M'|S^(|6A*|/%!,|*5 .|..|6A0|+"V4|MUe4|.u8|9%^;|^>;|"`M;|#;|W`=|0D2G?|"?|IT-A|;ZB|I\B|R]B|U`E|@6F|A.F|,%H|9/_H|4>HeL|=IL|T^\MN|T\N|D,P| S|{Z|0&{Z|#X\|LaX\|T\\|La_|R]c|?Sc|ISgd|.$ e|KU_f|h|IR80i|!k|W`k|DX6o|AUsq|"sq|+azq|W`Uu|K]Uu|>Raw|MW%x|"Yy| {|GQZ~|K?S|6"&|LV&|UaS|.#|La|S^|JT|6I|6. |7#b|*"L|73 |.#ؒ|6+|+*jX|%_|!#|?S|JT|5,r|I\ס|6?P|>x|KV)|B]= |-#= |@6䱪|6"R|A7K|6.η|R]uS|#|B7ٽ|-#|_L d|K0۽|=^ƿ|@Ik |@Tk |AUO|LaO|W`|7+8<|.ۤ|+}|:C|,"|6?|-#||4=F|F|6"[|GQV|SH}}|HR}}|=Q'|A?|LTP|+ M|A7|!hE|T\i|#i|5!|LCUe|,||6.!|Bi|U`E|!|LC|* |A7h}_^l}-B}5!n}+4}I\w}=^w}KUuc }?S}D9K.}GQ}7,}U_2/}A7}R]}H}6.gu}.}Q?!}AU!}BV?#}@+&}@^&} *P,}5@.}./}6I!/}@73}\I*5}TK-6}6I-6}AIz9}#z9}" :}IT%[B}IApB}+@C}La@C}BV@C}?SD}6IHE}"HE}"!H}9LH}#^\J}M}IS!O}VP}#?2R},>S}CS}?6~T}XMdW}9]X})X}LaX}GQ[}>[}3z`}T\a},a}?`1(c}6.~e}6.%n}6.n}@T?n}8A?n}?TTTq}*>s}#s}>Ght}U`ht}9B}Ju}.8v}8mv}I\v}GQw}@5]w}U`Ny}DNzy}:&Mz}[}}4 O~}LaO~}KU8ۄ}.8ۄ}* 8ۄ}:.F}}"iw}T>^x}6"}@KyC}>51}LV}8{}@6ӛ}I6}-#M}V}C8<}?S<}W`ǡ}+ }IS}U`}>R}JT}?`(}3+}6.}8A=}+4&}0%N}UJʮ}7BӮ}LaӮ}@T }U`}'}S^r }B]}>R}TLӷ}Laӷ}?S`}KU̹}HRs}:&|Ժ}T\ݕ}+;:}?`"}UC}JT}?I(D}C8}6IF}@KҰ}JT}I\}},6-{}.}MW.}=Q}},"}-D}Laza}}}C-}S^}}JT}Q%}#)}?6}LaB}# }+}6Ax}.$}#ғ~@5h~, ~B:W~GQA~LaL ~0&L ~R ~% ~) ~GQ ~U`~@5 ~JTJ~J~,6o~%~9]~~9%b~T\-~8$-~3-~ ~9L%~=^{&~@5)~KU )*~8$,~@K.~.t6~.=7~U?s7~i9~6.Z=~S^#?~GQJA~LWYE~"YE~+ I~UII~\S@J~6?AVM~M:|N~NXQP~_^QP~IStR~.#2V~/%X~@5kY~>3b~?6Kf~R]}9i~?S}9i~NX^i~R]Zri~ITli~4>H{k~=Gm~m~HRm~+4 o~#p~=Ig,s~6?u~.9vu~JTu~8Cu~-Cv~I\v~{~H^e|~I\e|~U`" ~~~7#O~7+G~#t~ISt~6@t~5@rO~*5s~8˙~+_Z~WUٽ~W`[֕~"[֕~^~BL=8~~AU<~.~6"~LVG~G~+!G~I3@H~/%@H~*@H~3t@~U`~) ~4`) ~@TV~7?j~?`~VU5a~9%[~^I8~,8~+8~"$7~A7$7~#Yi~~?SlW~@6~H^ ~M8po~,po~A. ~# ~, H~#~#g~6+~R]~R]no~#c~-~* ~7A/~~Q~Q~TL~BVf@~~MWj~Laj~>R~@5~5-~@6M~T\_~6"_~,"R~B]S~)So~?S~+ ~0&~@K\~T\\~NX;AU|6 X=I`GQ\ A7\ @7>  =^ #X  ՊMWrAU4?4bo +*w-w4 w+*,"**6"ƈ"U`"]Q7X?S" LaN!{!L"KVI%6.U&HR&5&La&9]&T\&AU@'-)Z,@JƸ,Ƹ,JT_P.?H(i.6..* 0G\?1# 8%z+:GQ;U=ʰBI\WDW`bGIR]_N_Ln QA6 R RS^ R?S RBVS5!S/%T+ͦV/#Y.9YD9.YQYKU[Law[+[C.d]KU_k`?Tmc0&eI6i>RiD9m?T~dqCssR]ssAUdrs!+s>)stD.tISO"v6"x* y-y?S{C-][b@^6H%nDXn:Cf@^f@K?IDES?"e53ʖ4 R=^O+-#5*%T\H#~8$'G\I4`nI\"q+4"qBVF_`N:U`X8$hAIì`]GbAJr#JT)*5OR] !³6?u.簴TLZA.d@L87@{ݮ>RZ.9I>λ+7H߾T\MC5,!K]U` T>+8AI,hD9{r[+ &CWVGQVT\+vv7-MpL^֖GQ֖T\W`0>RE"ZJ8>58]^I@K@TKJTMWmNXrI@6"O+\5*) AU) ?S@5%#FT3F5+T\֫La֫JT D?]X]KU1~@K R#+(>W`-7L2@L<AU[CHRs|L7s|#@7!+@La1 +@L';fR]6"X .+ % "rNXrU`kwU`37#^""+5NX5T\{?SI\/6#6"C98HR GQb :Cb!NX"HR &La,&I\&LB8'KU8'I\(J8/6-/!,/"7ATZ8":=3:"2w<6+<)=>.?3RAI>D9LH+L4 L#N7#xNOI\P.$PQ6.6R!*1S6"BTR]FT7,kgXK]Y,Z,"[#[+֨\*3H^7#R_?TE`+ɓa/#~eHRjAUk)`k7LKmS^qnDL#s##8s8-,vUa,vLa8v,5@w@w* _XwU`)w*z~|+|"|8O^}0TL#9舀SHX80}/%%-B98>RH3b@6 -%ꗀ@7A.QBV{蛀,>'@L,A6RT]ǢR]"n"4$:ܭT\ܭLaޯ U^<+݀L7 ߀QLCI> C.]#kV@K@IRC֬4`,8E6.V/%T\W`:%6"AAU2 HR ?`% KUF%c`S^#000&0@5TBP;R*BI\ 8#B5%4 d(-#@Q*GQƿ*L^c+6-r+-#+* +++"(3Ua@3IS@3?Sf35>R5LaK6o;>):=^=5AU` BTL^B^BJTD%0 ITLpJ-J8LW`{NSN"P89PRU^SU`9S#gS?I9UA7Z7,Z5,]U`_@T_Laa_-#a_+!|__`*a5"Cd>GŏfLaf7Li#i.$i!"qT\QrU`;NuI\yyT];~+5M~35M~)+LEHKUEHJ^+].%c6?"Ɂ3+.#,"2d6-쇁`3=@ݍLa7ώ%;\S^R]rr8+K]8w>R혁N9\[^J`MWLa殣>)Ӥ=^V_TLV__L%#* AUaoJTlQW`*3ױ=I,l5R]oCIT"?S@6Su6ASuJTt4@6NI\D5@@ā3Ɓ+4[ǁMW̦ȁ5@ȁ_`=ˁTĹHŔ?S6́NXFρ8ρL:Aҁ"*nҁHRҁ0&Ӂ,ՁK]Ձ?Iց؁I\ف_`Aځ+ ?S,ZG]^xT^N#}I@7#U`T\s`JTi8".L336ƙUa?SJT;4?P+=7#7-; ^ 7+^ 5 :&j Ua?6ԛT]0La4?6MMWN\[P K]*"-x-":&x-"-0"C7I"I>"U`b#R]#_L$AK$LUn %+ 6%6Aaq'La!(5)U^z\*7"\*JTm,T\X,K8`-\[Z-I@R0+ 3C?q5ua7R]74 q88G=G=AK*>KU|A0&ĩAA8weB5@\C"ƩDUC GoJNR.S8ZS"ZS3>^S*?3TG]XU7LjuYU4YY#4IZ4>~PZ@6~PZ0&Z[c\~cgISkC;wm-m7L=p,"t#>w6.Q||LC})}K*WwK]Ww=QӀ?Sbe=^:ق@T$'7L텂MUKE6"a:SJa:S^ff#+T\5@9]B]틂=Q틂6I#+L@6N64>LaBG]C*6뤂:.k>«ѫ%뮂7LCﰂͽ?SV䲂%gxpS^ >6̬?6KUG ‚UaÂ* .ĂNXĂd+ł,łIS?ƂK]?ƂMWǂKɂ۞ɂ,QʂK]M˂?͂+!{т6AgAтISтW`5ӂ.ӂA7{Ԃ/% ւI\؂%؂7,\؂HRM0ނU`[b߂LAs߂K _`GQ?TLW~7#~-# @K JT7AI\,"nR]T\ LV U`IW`T\]Q]`LT^|@KG,5 R]U`MW( 6.XT\xT\G8#nnNC< \[!@T(!K]%"3%?I"/'6"5+6.p+.M,-M,2,7L,5,U/C2E2M:O64 78#89%rF96J=T>h?5*}@S^7A]A-wAW`AW`CI\ӻEU`ZF+!{J?THJ5!%KITl`P3+QUa}U@T}UMWXXW[ [W`\I\\8A@^AIvbU^ kJ`̃mm@6Up+!Ur6.r#r,os`t6"Sv.#IxU`x5!yI\#zU^{.{6.}~JT9JA]LC})LDLI\$/%AA.OWBdd".dd7#LT$@T ދuO5)iT]iU`?S.@IC!*̉7#锃@+ij4 XI\Xu0&0:C I\J.}٤A.m>R7 ШD?k7J?&* 4#,I6!6~) ,z6"7#4 bT\6A++ ԅ?SD6?VrU`86.86A+ )A.)G][T]N/%9%@5ÃAKM[ÃJ/ tăLT(ƃyǃȃȃCȃ5A/̓W`^̓76΃% #σ+UσI\σHR҃D9ك7L܃* 3ރ@73ރ>".߃T\A߃6"HR{K65,VSI\VS6A-JT][B4IB@Lz@+q'TLA.yPH^yP5@Zrժ4>N3=>%_IRy0-AI7"8 R@5$#A\[7L‡CU:&0B=^9] \IO G]}j?`E 5!_@K*0& #na0& N9i,U`}j* T\*  -$.%H[%Laq%6"%J`+@6+3(,%s-B.`_0A70#5MW5KUg6+7\[8?Sm:@T>W`n?-#@#+T@3T@0&?C"LD5F+5F.5F@5oG#GHJTGHmSHB]H.oI6K0C*LBVLT\0M+:O!*OUa'P^_{PH>"R9%]TdUISV,Z)[+\A7{]TLT^AUQ`6*oa%xbLaNcocR]c/%ReiN-jKU n,o#ׯr?T9s+!N wGQN wISy#R{NX}:U <+4Ƈ% 퉄I\ 퉄@?S@GQ@AUF?S5L뒄.+KUCAK4C.1?U>9%KA%#!a6+ȝW`YGQ_+d%3.XP@Iƚ6.p5!X7L?SF6@zNXzU`YT\M6I@ A= b8$76+S@K3,3.$$V*5HR^>ƄƄ ȄGcȄ?6z˄-#u&̄4G]̄^_τ?6vGЄBV$%ф9]$%фB]$%фH^JфW`JфT\UфB]%҄I\)Ԅ>I`Ԅ>)]Pۄ]`ۄ^-d܄GQ܄JSބ8$g&B]T"7d- K]R5!;+!5l^I^_4W`]`>G6C7VT\\[ 4>[\[?*5?*6r:J>R i U`b Yc8AU.s4MW>a]6"Io5!j!+!7#!7A.z ?S T\/c$+@"%v)5v)="TI-6.7/7#U0J`U0@KO54"CS4 4.#v5.$6@7W`UX7,C8K6C9@69?`;<"7%<* %<3%<,"~>C8P?9k@MB(BL7D%'F%تI\#U`ENXΫ@T4U+!R]ֲJ`+3@5Hù>R㺅.%T=뼅%&3?I? 7LVCą8DYŅ=Q(ƅNX(ƅ]Uuw˅,Ņ˅A.̅U_ͅTͅT>h΅*h΅".NυI\dυЅƝԅ"ׅBVׅL^؅I\ۅJT܅* @݅|JTl7LX}A.Ϯ+MW3MXwU@B.)B.C\I"?G]??S?R]?7LAU=Q6.0&uC'#.|u:C[") 9]8]@Kz8/ @6Q + "!Cg ?6ij-#ijR6"3IS}baZ#?Sa-hd+!D>34T T^~#?7~#U`$6?_$+&5&6"L',"[(JT[(@T[(7L(4> c,\8.H^^0IS;1@Tݽ2UIN36^ 56:&69%6UJ6UaOa9UaT:7#8=J`D6IDTL(sGI\GI\dI>RdIAUSM* NQJ`kRLahATMW%*U6U8 VLC?V5,/W6.Y7LQZ,> ^-b][ b* d$-:e3:e:eeS^@f.^g@5(hhAJ`jpKUbt>t-#_wI>ߤx- hz/#)t{-}+!0&W`P~@5[?S[T\S8$ǂ-CꡃT\>3)=3U`FǎJ^=HRJTc6A"~~5! @T$w뛆'r]^rT^dxC7t =I50DVJ8$8|){æ8$U^K]ABVJA7*= A6:eBK?mbaEAUO0&l9>R^A/@5nJAW#UnAUxC..$"@5!G`T7+6T\ Æ-FĆ"8ņ!,7dž/%^Ȇ+^Ȇ5!WYʆ5*ʆ.#ʆ!ʆ"+EΆR]4Іӆ#yӆ%{Ն׆,"؆؆#})نA74ن-_`hm#4*"ZZJTW`ȯIS8$ =I(W`V*u5!*\La#\[W+4H^9-#"KUK@uV%U`V " A7K]YISR/&2?T ^6-lw#)":&/"W`]%&@L')+ H++H+/%H+6"v.aL@Q0,}0U^d\33+Z8@I08"-J8J`999<)<6.?J5?MW?.P@"MA6?B7@^C,"+lHJ`+lHU`HKLaKHR+L7#L3+өOC9jP?6[S+TMV'TA6X/%^#6_@7_@5)$_6"_CaMUcT\eNX4Tf?6-WjM: jA6+qAKs@7sLUMs>RVxW [y!3{:.!}!}D @T W`$-#6+GQ`/0&`/+R㇇ITGQ6"^"A La'0& l6"G][fSH엇+엇"qT\4+ 죡\[(%,U-#19ǭ7#4-#[鲇!*᳇HR᳇_`/GQ/T\ƴ,VF@T5 -bw6+6A]-UI5s  >RWXBCѽ@L^I\P‡3^Ç% ćUaLŇU?}wɇAUɇ>Lˇ+ˇ-"ṗ@T ͇6.;·T]ЇR.҇6.ZՇGهBKbڇ3M܇8܇e߇,x+!5+V_` GQu-""..#Ј"2UC`?JHR7DLrKBGNX.NXG XW La? Q6M M  KUC{ R]d "=Q̅H@U`KCv%>+0&V}*5!K]%4`A%C-E&/%'-#O**"_*!*'/G]'/H@+3@TD4NXKA7\[9JT)9(:%&:R];A;AU;KU;B]H4[AAK{A6AtFJT"G,4XHI6->M>MA.DrNO"P3>TG]=UR]zUGQzU^SY@6ZK_[KU`JT`+43b6dTL:dITe?`'EiT\Ol30lU4to),q) s@6Vt6"Vt)9t6"u.v:CG|#G|>1@5_,눂BJH^3=5IT ,m쉈#R]GÌ#DI\)5S=SHC-YLa+KUGUaaHZCKJ`*w*m .9Ρ,Ρ#La[0@KXܨ3YH^۪+(jKt?Sw6񊯈6IuWF"\ԶV`5&KDLº#0&D".D#[=4#5A.6:* 3ؿ9]K* K!K6"$È+!@ň%w,ƈ5@Ɉ?6ʈG\B̈4)FΈ+!jψhψ* „ш,҈@6dӈԈ6"(ՈU`(ՈSH$Ո* $Ո.ՈW`-ֈ*3Uֈ:&mֈ-mֈ.׈K]ۈ".J܈HRMbވ+!XU""G=IGAI.8".8+!>I@ WR*:&z,^:bs36'7#ɥR]#@I> "#6".w*#.w*!m*@T/8a024"4 55R6A6U8W`Kv<0&<@^wk>) k>?MW??SlB6.B"BHRE.E,"J@7}JJTl3J8$K5,L.cNAUcNLacNJTcNMW.zOLWg%P?I\PPU`vQ?6#SC.TA7FUBUfHV\[fHVU`UV"jX3RY^_vZISdU^>6`#dW`od6-"2fUC j#o+NpJTp_`q@5kq-#ڮq8$s.t0&t+ x7#|U`|+}0&|+},"ȥ~7,v[^~A8M.6>x8L(7LE熉 T\+kUa ?6=IHRI\p+U`)g'ISg'^>R^_`韉ՠ-6rAJզ* ީ,mW`ƪ.$b/%?$T]Rv]6?`,=^۴S^5@#z!ռ.UuR];7+6"b‰6IY>ĉ6@5hĉ"ƉAJɉ?5Љ.Љ#?ӉLTՉ*5Չ*6Չ0&z܉GQ*߉L߉+"IA6+3$ @653JT"39%5AJA3C~)+ʊGQʊJT6.T*.7#6"tAIFvLW`@6wW`@^ϴ  Q %' @Tģ AJXC7N.F`_YMU`^%=Ua?6.T AU * ?Ix!A7x!@6'>6 (@6r(9L**%+6?+Q[p-.Z/.B/.B/+T0KB3* 4@569%~8A.~8^95@^9U`:T\ܥ;:.<>\>."3>4?6?F+F,"~F6.OF*JG#gM:ChUOLVPLa7QN`J_SULYUk W&8k WIW@+YY,"߷Y@JiC[H^iC[>RiC[U`$f]U`dpa6"Zc>5qe?`ufhg7/Bk@Lwl#wl8$hm@I&nT]q=^KLr"-'uI\-uz4 YjJTyLW"7#"6,La|@5mLa^@5=+47芊+!"GJ.=tS=,-97@JW`+6+PyW``@5Sz@5řW`+iAK0^S0US&o#L>IS&.&8$O"U`ȨȨC3+B7#j7#RT\R4>Ʊo3=U,Las>R5cU`-#.):Š%Ŋ,"aƊ,9ȊW`ˊ6"MΊJ8MΊ"BΊϊ?TFMҊ@7ӊ"]ӊ"]ӊ+!%`Ԋ'Ԋ+4֊9]4֊LaU֊XB@ ؊TL>ي4 Sڊ?Sڊ#5$݊!* ݊/8?,BVJ4`4is=Q+@8a"_[3BVaAT27LJT5?@K_A6#ײU`r7#QGQ-}I@7]]4 2tULsH-)0T\5 6I # B7A 6?,6-#ߤ?IE6+ "H@%e6"t>4D#" JT" =IĐ "{!R]!T\a&'#+C(JT)+ -Cn32n2G\2I\826"3JTv4LT 563 5ـ6J`h7"w(:::5Ho:);+);6=0&7~A5AA9][B6?E  G6?H@TcWIJ` *KW`NKB!LT]M6IЃR%S.mU6-mU6"kU%ɻV_`ɻVISWL7Y&.e[GQ[KU[.6[-<\@^K6Xx`=IBaSH`bLacNXxe!,xe0&ѬhG\lA. nR7ZqU`q^[r6-هtLC"u+!"uyuT\,$wI\gw_`gwGQHxNXB{TLB{s:}Cq".xr7L⅋ISI6?B:.O6AT=3T"$NX$?S%k"4r.gR]`T<.O왋THiΛ!47,弝+c+⢋T\G,+7P4IxK,V)!La߳^_@K^8#gǸ>6gǸ0&+4R*5ƋC|NjAUȋI\]ɋ?`Bʋ8$t.͋6?w΋8-CҋW`eӋ:.b؋IT"ۋGQjNۋ\[jNۋAUjNۋKUQߋ" ?3 0&9HR=_`XK?S3|T\2?`#a.#WN"*'`_Ĝ@U=QvM?SKU H6@HI\:.l=^4?kI\,5JGQ\5@ T>3Vh6"lLaQ @T#)O& 'D(D9A+!*=/7+nB0A.p4IS-n5>R-n5U`05U`05T] 7IU(8:6?w:@7 :IUy;#y;A.t>^`hEG+ pI6"I6.s+JJTK+bKT\KA7kLW`"M#RJT`RT\`R=QSU9]EWHRFYW`FYISY Z#[LaNr\@L]0&`@6a@5a6"xb@IXcGQ4e5![e-#kk6"n?S ošqMW.Fu#~uBLAv"Av.3>w7L!x,"!x+!x+xT\{zI\8}H?F瓀.6 =6"La戋:&6+!G"=^KU<,"A7'.8#ܝ.LJCKUCT\g9%UIܣLa2\ItT\#4I Vl[6?Q"..C߰I6 @K7䲌7䲌7-7䲌!7䲌4 OL7}ѹACHRt :.-HPŒ3>ŒC-ŒATÌ-#Č3>LČU`_ɌZ͌+͌@6!Ό%!Ό@+e9ҌR]Ҍ7#Ҍ:& ٌA.AߌLa?Sq@LbW8$0&NNNXNK]OMW{f+AI\@KߺLVT\m8JT5 H " T] 6"h"cH9DW`/%:&oL9 KU:&3C"Na"MW:b%H^ &W`z&!׳(Ct)6"+h-W`L/T]/53#{0Ͷ0U^00@I14`2@54K]4KL#5+ :R];-#id=@LAK]C!+CI"\I#;OѵOGQ#QRT\YETCW6U@56U+V.%[KUm\?S]A7(_+g^_L^_NX,_W`C`3+C`8Hc9%_d.g,5gi3zjCm.0m7@HmB]~oT]oU@QoAKpLAsGQs@T2Rt^wL7}@5~5ɀNX?S@TWGJTWGKUj+!х7+†?6CL5MAUMS^,|7L6Iԏ".I\-A.7"Nk@5E!>Gs{-#ϕ%Е.9<ꕍG\-B@+Η+ Ӻ"7ow>R@KIAT=A7'#:CU`A6?<@L©7#NX+-BC,!RATUI^_>մLavTW``U#E@K9A.\ITѿ,@KNč?Igō@5'ƍT]A Ǎ-91ȍp͍BM_΍6"Ѝ7.yэJ`ӍT\4ԍ=^iۍߍ.#ܷ+S7L5G7LGU^^0CW`.eLa+$LaeSLay*6K6Id#E".C.@6/#Dţ%ţ+c ,c #M :C;^=6.4T]AU%B]H@+ # E"%k$:CH'غ(5"+*6c-NaT-W`G*1HT7IA7.A9-#<@7@>LC"A@5?AC6- 4H>RJ"CwQ.!EQ-U*?W6, XG\X)X$YNX'\.`Y`/%Wa3WaLa-_"e6.vgba3j?S3jHR[-j6A[-jQ?k?6m9%nITgn# p>Rq?7ur@7ջrGQr.6sT^`2v6$wLWz"=7+_SK+BQ3R)"93@LDXe?`ٍU?I\RJ`@珎LCX钎I4+6"+7# R]"]W`aCa.#ФIRꥎ!"`TLڜ7#3=A7OI6+b೎9]#%QS@5zT\=(H^(U4+AU#h7L!GQ8׻^`|IS&ŽLWzŽ#6Ǝ0&uɎb̎T]KЎKUюR]dӎgԎH@B֎)ˣ֎"JDڎ>Eڎ) ގ6.ގ!*4:&T\>b@K3ԑ>RW`=6@=T]؁?SLa!BLhJ`.#_6- kF"T\.4`\\@T:.ejB8ejY)A..R]N%2`La,c W` 7-; 7?; HR :zU`dA.5 + -7D:^"]9%/""_ ,#h KV"NX"T\Gi"I@a"#"6_$6-9&@+R'?S'K]H,-u47@Zi5NXq5q5DLz6R;8DR>6IK@-0B,g~BIR؝E.EEJTۘKR] K-8P%P*QP@K.SAKhWS53SAJULa+~VH^GWGQMvX"gY`RZ[ZS^Z[H?m[:0]C_UI_#bR]%cT3eg@^gLTƩl@+,[p*3qq=+6t:CtI\t-suKU{w+,kw")y } +gJT:NX:JTئJU0N.~6,ᎏ+ S8-8&PI\O7AUx:La*5#@[ߠU?9+΢^`J^5!Ǫ+Ǫ7#Ǫ.4>:I\E6"v9LV4 g#g:.g*a"_`H^i6-¸@])3>RI#W`4!nӿ./6. ď.|Ə6"KǏ@63]Ǐ.%5ʏJTBo͏/%͏ ϏяWa֞ԏ dՏ~܏@5 ܏T^9KB_6"z.$j6,BU%)7,YJ@4CMT\%@5!*KUR]U`GQY!%".n#3@i!@i)c 7# C  -# .*?J.@6_6+_6.oo+o3TT3T!3-6,AUKU * > 1 _`m ?S; 4`_ R=o @J[>/[>0&?SET\~?SzJ` I>L+!iK]*5pd6"uv"/%uv"7#"T^L$AU%8K%/%N&JT܅)-f)f)>*>R*U`+U``,6+e-e-,"9j.IR7.UIX1KU3R]6-#"77#7LaN;#1=T\[J>6A;!?>R?DL?K]?UB6ADFLaF6? `L:C7MAJ|SO.OKV5ZP%aoSVVKZ_^VKZNX[*6k\B]k\5@^"fT?nJTnBUr#u)u.v, zK]}(K~.C6C.$t)̆?UbLa7-9CWӉ8$C}=^..$&]GQ{e0&猐W`C %6"5!.@L5]X!D@6D")蚐"iJTP9CঐAKঐLTঐ ըD9hy/^ҭBVnMWy%yA.Ͱ,Ͱ+Ⱳ9%I\;,?SCǶ0&yW` #+o27#$ȐgyːNX̐AI#̐%А+ѐ.(אVL4ِMWOِUC){ڐ* .ݐR]/oߐB7.9؅U`AIRWL*5BQ.9  BVCiI\Y%%JT[/:(!7 <@K_%}X@6"t.W` 15!F!F7+K 6?La.5@KCr8" ^=K I\E#p8$-#U'I>'6.N#(4` )+β+?6/I\=/)H08A06-s27"'3*}46J^?W9Ӕ?BLABL8D~DGQ~DLaETA.EAUG@7EH#_+N@T~N>4BSGQMT*"U)$U+ 1U-$V5Z-5FZ6+s{\.s{\C^+n`G\-efCf-#h8(i:C^mU` nT\nKUTo/pA7p+p@7p"y@T&+z6Azz{SGv{AU8(}7~!@T/%6"{:&ₑ5!.9$K?5  `#*兑6@%,㇑MD"Ĉ9]7R7t뒑^`D{4>ڗA.Qו5=76AŘ%?`La##+p KUp +@VV+,aNKUs7#%ޤ]UEY ,=IЬLU5A7j#+o'- 5@7'߳A7'߳!ayUa3:C2sJT2sI\GQ][񎻑R]JWLTCKMÑ=Qˑ@Kϑ5>7Б,6ё3+_ӑ eԑ%3>֑/9%בGQVّ+4sّKUbܑJ8bܑ/8T%I\~x|%%U"%5!* i@+!5BIS* A57, JT2+!L7WJ3+g)"\JToDLy@K>5" 6?B 3*= LD >RXUT\K]A%*A96"55@39]K]_`YW`06IA 6."%Lac5&I\ )6.V,,.n-,.6"?).-#?). L1TAw1=4w1NX7T46.8X5=Q5I\6U`47W`Ș8Ș8LV:%&s;J7^,VӒ9]Ӓ8/$Ւ!)/$Ւ#[=֒7A3ג+ؒ)ؒ!wْNXwْGQ ے]`0&IRhB6.0&Z3>JUbr.t7#T\6a%kIR,Xѻ\P?Su.LC%[^A8~K@!.PJA8$7уaAIn6La0 ,o KU4 ",8o6.̖LaLCq6ɶ#1;7.E,E#\@5K] H$!#u$.E"&-,W`,".nF-JTz.CD15!1+ I6@5L79]:D9:L^:LCcZ<#C="D>R]'A@5A7# B)5B.B,^JR]NL>RNLJTYLjR4`O[K]O[AU\A@_@T`A8cT\eeU`rfI6ah* hMWh`_sl7#nm@5>m#m`;n)8o7@dq:Cq!`sNXHtMWtR]2Kx-#){AU{3 .$,#-3͉) ~ËT^@."-#@6KUHR?Sﮓ"][c 6" #W`M::AJUQ?UJT_áW`.K+ m:0?JT׫~)>=WQ?K5ƓR]5Ɠ_`iƓ+"ȓS^]̓/:)ғHR)ғISPؓ,–ؓU`mZۓܓ=3ܓ# ݓG\@ߓ$"ߓ#+ߓ,ߓ9j 9. 9#Cc3E@I+A.#6IHI\H)7B-+=MWhR]CU5!!LD>RR]GJTˤ-# RGB ?SA F *6+*G\&NX1-#9w8$4"kAUk?S+ƀGQU 5! /%%JT &C7)570+* {+7!td,."ۉ,ب.3ب.A7ب..q.S^)&3@J4JT659C"79"y;y;+y;+!%<+=G]8>b>?S>@L3?6;?,d A]`RC:F`;L%RJMA7)M%GN?IbPS^LR?6RU`~T+9lX.*ZMW}_)4_>=b>_|eAJe+h?Szh)U~"i,"jj.6Lkmdn^_^n7#/n6R|Ɣ?J<ǔ#>QȔL̔DLE͔E͔97KxДAKXҔ3pyՔ֔T^ٔ* ڔ6-Wcޔcޔ4==ߔ7L#7+.9k:3+M#8 6?@5@5DA6=DUI*5AB8fI\fAJRO.G^@TM5JTH]`C@64`Ռ0 $: ,*7.fV+(U` 7#p lAIO-vK]X5X-X* -}] 6Aa9!7#!%Ku"%TH'q(#'q(.'q(!w)6.v+7#g-,0&1" 76.:@L<=^ J=JT.>@5vE>AU?-O3@DX{bA%oA%7D6+7DA7vD5,hE+hE0&5E#EH6?LTI6?KJ`P%T:.VT\WW`6eXLa[,.\J`]JT].`_%b`*d5!g@6,g+,g@6}vh=IriVSkAK=k@Lok#wmHRo@LDo>R^pLaqI\WsvYtLav>v6"wH\wK]y5~8$D\,ƁC.+G.G5GQ̶+"~M%G-#T .5ڏHR-#)rG˗-#6-KUМ%|C-|ן)H`ؒ,} I\} La "$"\AUG Ԩ6/GQG6썲HS-T\@=.$X6?)3-Q,"W`•JTWgĕI\ŕ4 ŕ+]$ɕ<͕;ϕ9]:ЕUarЕN"ЕI\Eҕ@7ӕ8&ԕ/<֕?Su֕T\ٕ֕+4ە6 *ܕ7BHݕA7nߕ5)8F"f+qT]ϾJ`7#*63NX3T\"76,>6"9]*,z#|A#JTW`kS^U`+@K]U"%8A9U`Dg5!m U` AUK SDS.-M+!ӟLa7+q$+~%T\*&>Rي&6(C8)8,?I0U`{2.q3.9.8߹:߹:5>:5+J;W`Pv=7@y=6AA=?`>>RyCNX$EAKdEU`dE@T݆H)MT]2NH^rN4`rNLa;P-#K(S6.bV7,}ZLVL\%\^,^0&`LV(a6A]a@5b+#b.@d8$WdI6{'e+9Oe@7i6"'k4 n3oLA:oW`Hq#Hq6>uMWAu%ZvR]9v7#;w7Cw4 j|D~-#>8J)<݆JTzV 7-"WJT𷊖=H𷊖SHs6"ڎ5!֏+6㠐9%mF?S-7/5NXD7?6KϗI\MWR6-e H ϫI>ꛟI\֠.UR]m ࡖ@TlR/8 ݦW`Х@J,5V5+!+0&JISA7:˰@I :.C@5\@L3(R]"I\b"+!–,–`T9––%ÖR]`Ė5/ŖBŖI\iŖT]ŖD9Dǖ-͖K]QΖ%$ϖIT5ϖqϖIAϖ-#ϖϖ,"yՖ"[ז.6WhؖJTܖ-nޖ@TaޖT\_ߖ@T_ߖJTi1%][ JJ^R"8$bzI\z6@h6I,^`EU4DR]HRKMDAU;x=^;xKUpL^MK1JT1La0U^UK6"6#,?4,"yLa *3 MU 0&. .:+mUaq5"w+4I5!S^U`@^)6@50I6@7#G!BVd$:Cx$5,',4(7#)S^*A6;,R]W/L92x/0%3:C:y7@6D?+4#oB3\D\[DKUDS^KH"JAUWL5MCO3=P,~R#R#R/%`RRJTWLaWS^<["bS\5]G]W9]@Tr_4 r_*5t`#9aW`!bBVb%=f][2f86mg8mg.Y!i-"l#RT"WR]Wi,=^LA7E—K9Ɋ×:CgʗLAc ˗-c ˗c ˗!M˗ ͗+ QΗ6.~ϗLWϗU` \җ8$ \җk֗T\8ח_`8חU4ח=^?9ۗ@Tαޗ@KDޗ0&EߗK]JT]H5*7+M_`M6A$LT.7-8a][* B@64I@Lv.A7JT?SI,7BU7#56"ӂӂ:.T?U/%+N]S7 R] K]G 7+= W`'La'T\ {ITA* v@Ju_Lau_I\O:&H@kGQr8-v+tl >+ A."=^)G)JTz+LWĩ0=Q 3U`yo3M96@57+b9.9LJ:UI~:+~:/%:>T(@I\LF3-eJ@5aM#MMA7nN:&ANGQcP@5iRBMTLV@5CWKUcXW`gY>RZ6"Zg\.9^K]^BVy__>4Ė`La^a:.^a*^a/%c,d@R@nd0&/h-@iT\'i-#&jj,"jjJTk.klHR@mJTs7Ls=^qtIROuv"S&z+7N{JT6(}/~H^/~LT~@TH:&H5wDŽ@+wDŽQ"ρ*5 CAU?+!,S^ /%NX ۋK0>R矌G\ϐ"6ˑ:&䑘5,n I\n 9]5퓘>@K'>64`vv-~IRi\I/:\W`NXo̪G\=<% +HRGQc8c"ٳ%_JTٿIS#5,50>êG\TR6"|Ø%.ŘI\WǘI\Ș@E ʘGQ͘ITИ"-Sј6.Ә6.lԘLa՘4I՘U^*֘5!Yט#7ܘ#xݘ>[ ޘ+#9C.ӅpC6JMWP"T?S9RLat6B+!,6?2@L:&nv#LC.%+!GF"4vW`"5!L5ո*50:C6 ,v+ |."JT J`b AUH#HC:I6.+!!%.%>3%Lal(#R+,JT^-HR#0@60"8\3).3HR>4T\>4I\t5%8I8,85!8+:#nKU?7#@,@"-@"*A"*bB6.nC.cCC%CT]CGQCD,xE*6{EfE=3"GT]2G*5okHCokH,okHI6KLaGL%:'O*6.yR9]cR%R@LrS#*ULaU5>U*WG,.XA.X\U^`$?%bT\ b5#Ec0& f!) f iI\`j)`jml#} n][OnBNtqLa4r4= t!vt+fvMU&wD:LxL^iyiy-#yT\z,"{6?z}@7s}"0~%4܁@+G-,"|LV܉6-k,5']H #>T\ӄLaӄT\ӄU`uISAUPg+QWT*5Q˕7+I\=4;#)ɡNX*);ST\ޤ=^:&m/_`m/][P=GR]5Ųm@I(.06+@׶,5@׶*5a \[9U^0&D׻BMPVS^\G]\T^ͽ)o۾][8!5Dg#™T\b ǙUCə7#|ΙI%|ΙIAϙT>guЙ".Й.A ҙI6 ҙ-ԙ+>ԙ. ֙4=aUؙ"ۆٙ.%ݙ"Hݙ"CޙJ?ޙY*6>h>H>NXڒH@ڒ+@!9T\iIS6+sHSA78U`ZDI\-N#@+;7#VJ`QAU 7LkI\+o NX ,>N !" @LW`T6";JT5!PK5?V7#NX?SOS=R=^# 4> R]O"-#Ա"#%"5?%"6?SM#.H$T\\']T'5!.I\ 3-#z4_`z49]F6J6MW#J:3:T\+:6-Zk>,"?>8TA6?9B]YL-+WMI\u@R7LR5ARWS?ST.T,"wU@72V:&?X+"{X XR]Z">\#\G]\R]aW`kJb?S`dI\f?Hjfk+ q@Tq+Jr@L !sW`pnv+!v6"R}=Ii*~U`&怚9.XiUI* 2JTI%%O5!O/% >ᆐ@A"hCh,AH?D`TS)*KATќJTםKB "zI%+-#Vo7@HLV63լJTf_`',":AK$La)@6=Gк.NT^,B~-#(?DXISGQÚ+!ƚ>5ʚ+ M˚9%͚*62Κ6fКњW`pԚJT՚7#v֚?7 7ך@Iigؚښ"CښI\ۚT\ܚG>cߚ3+!?3=IW/:(JT(@T6 8!M7,R]G]ɂ4`SG"8TL%=*5GQ;T];S^[?J#6ST\W)`8- O JTO W`{ T\7 U@G !G ! *3+!5!8wPU^ЯT\,"8I\$6A$JT]$7#Ǔ&@5Se'+ 6U('Y(-#'Y(/:'Y(7#(B])%+?T>+-8$L4T\5TB6.@5>F-#:F5BHCI+MI!]7JL9%SK5@=}MAU1?NT\Q*>S>VT] WLarWHRrW6@.^I\G`!ga5!pa-#7f7+fJTf>RgW`j?6>\o@^8op.p,hq4 Yv".+wC.Yx3sy.$^zLA|7L2}NX}6*+@v,"9%v%N>I큛CW큛+4c0&c* c@60?SA#7gU`u+ K#2JA@3+䎛. U^_`UCg4 |t-*-,:L:,X+W`6+ӟGQ".Xc7"ᄂ+4ۤ@Tw6.ۛ#*ꦛAU"[%wIRȭJTȭLaǮ"AW`U4>U?HⲵD9nk@ISL^IST].N,5.N*›"]›IU-ÛKUś.C)ƛ@T7ț3'ɛɛ.$̛\[PЛ.ћ6-ћћ"Pӛ7LbכW`D؛6"T%ٛA64ڛR]1aۛGQ}ۛ!XܛW`ܛ6"O5N"9L{.~#!-.}J`+~7#x+!U`8AKU=5!)[#>4`HR .3 .7-7]A.f@6,R]V,"V a5^_q 6.:F 0&a ?T) I6)#3!W* AK?S"!G]!R]u3u"5 5!5 "!+ PU!R]!3.""@K2$=^st%%+KU)/. /?` /La[05"80IS~0G\A6K@n6n6!,7#7Lk7,"Lk7@+3>>z2?B]@B]@T\A8p B7- F, F.=G"fK@^.N6"5O7CQ%RGQHyWUIqY-#Zm[.m[#[\[O]T\L_>+`>Ro`1`DL1`_LeNXlg.$H3hXj.9<rLUw% Fy,"({T]({T\gd}LaVu}8$ ~>R~][]` ;6?|@AkKU,MB݇,鶈T\/6"7Պ37Պ+o猜+!c댜6@:Cy-#y/%+WLa:&k]`J#6J*6.="^?6Z#.+U`C!,Â"ٞ:CW9]\N-㬜6"㬜ɮ:6AR0ޜ-"'ߜ:.^D:%`6?=I/6k8"%A6@5 +FKU5o?S,TT\8T\Kn!\FLa|7@AUT]g?H`bIR+%h H6 AU' @T K] @J La MWsU DLsU ?TF4IU`>RVI\5I\:Ca-#A7{U`=?JUq,J`)*3j.D6-| I\!JT'>#Ɍ#LaɌ#IS $A7$&6-N&7#%'@J'8#(," , .9]Q.0&/%Z3HR6MW7ɹ:UaA:+!;>R^<@K^<@LG=/&Z@_^WAKVqXC4 ,CC,C.DU`f0GGQ+*H,+*HHđIKUđI@TđIMWnJ% M+4N&/N6AOJTOMWSQ:.T#R5V@7`VW`.V,PX XMLRZRZ7/RZ#,\ |fT\mf+gJ`}k k@LMnLa#nI\șoI\rpw6"fyA6fy}-h}-L~0&7~IS7~AU7~NX=IS?`Ӄ,".AU.6W5!.,"Á(+4$CِI?K+.]TbB7#O "?T˧ f# JTSWT]9K렝@^󌡝,}* |-#AL4NX(-#C9@TﯝX0&-.6'U`'J`~A&>RXLT]qa6+Uǝ0&ژǝ-C?ɝ+ɝ!XΝ.Н7LѝGQӝGQӝT]ԝT\^ם@T^םG\8؝.ٝR]D۝!)ݝ".Q!ߝ/ߝS?6+!T\SJT,8$55LIAAJA.KU&4>DlDl+"I6s+:C8O5>8$C#S>R$#j!+!$ ,# 8 MBЀ % 5>CKV3+0&#C]5?MDC+G\^9]^LaIUR?FtAU^T\ Ш!%"6?ؒ#4>5%+@.%0&//-?39]39D54 6"k6S7/%u8A6A9.9MX1:6A:D9U'<.C >I\\XC7@5DI\iDI3{D>H|gH5|gHC&I5u5N^K RK]`SHTVTTV+Z@^ [_L\7+*^]TWa3K`bJTrcLad wf;g?Ik* ]l,m:&m.|n!`qUI8s:C6t.6t83tHRbtH@A+uOv=^JzT\vz@5z#G|9] }.W`9L8À0&2-#7#!D@5{LaC#܊-;.I\18BጞB[&*  @6*5CcUaOܝ睞JT,)>RmJ`Ŧ59^gSLCgSmJT." 곞* 9][@TAT.%м@6HY;B]oTBm@6KA7O|Ğ/%:Ğ?GoQƞ.;Ǟ=^QǞ0&ɞH^ ОT\bў ў+#ҞDL#ҞT\qҞ/%qӞ#F֞A7m֞W`֞f؞.,ٞ?5ٞ8$ٞR۞ s,ݞxޞA.:#NXx)K]".@Tl3{.{5u>Ru47#d#+#.:CTW`R$La|G#+C$IT$.U;&La'T]Q(W`5)][,%).)5YN70&;<@^>!,?%G@]H C@L(C-#u4D,BFI\HW`l8$al.AlLao0p=Qb&q+Tq.uӠvR]Gv@Kx@Kx5?jZ~6"jZ~/%}~7#W~L:L)L7#L+L.vP6.È,"È)Y6NэJT*6B&GQB&dL>5dLK5ޑ*"웟)TL+n.۟--*5zT\TLةJT+E"S(,q KUS"A6+ʾN- U6";˟KUKß+7"ß-#"ß/%ğHRxQƟ+".ǟJ`͟)ϟ%TП8"TП!EП86ҟ.%ԟIS> ןGQ> ן=QڟMWܟAUܟKUݟ%ޟ-#9)9|ELUc+C}R]AU5!AU,"U?II\GQ|>3#6GQ7%^.$!@+I\yTL6?5.R]K LV6 A7 * u  5?c5G}^x,r W\6"cI\-MW"+=ja#>R(%H?&&z&+7'+*Kv,A9z-IT/6At]/W`/LU&0K@!0?Uu2I\u2ISj357-cA8a?6#A9%tXE%FB8F4H5@oKLKUMS^M][[PQ* R/#]SLWU9%lVV+$W6.WW`X+@Z6A\A9]U`9]NX9]4`:]_`]6+e_-#r1_?Ia_*3ȶ_#uaKVbR]sc?SdAJFfAJ/f#B`gNXg# i4 ai%lU`"l=Qn5,oo!"!o3oW`Uu#, v{x6"!4z?5"zLaz-#555CN8-K.LR66?N+ -+!O%ΌI\z Ua쏠"!6[[=Ò#jKUʔ-w*6"P6?:Θ+4:&șISJ:. T\RϜKB4.z֠,V>Gr. ⥠D@I|6"CNE "!E+#ǔ3֪@TQ@6N@LP.%;]^Oȳ,v.$6?][{".{6+O"u$LV_z6.?,"&3+qàC7Š*6ǠTLg̠6. ͠3T ͠5?Р.%GѠ6"sҠҠabӠ@KY נ^_ؠ#j٠U`G٠@7Ñڠ@^ηܠAݠ+!ݠ,fޠ@77LK]~u7"+pU^8-#RK_;U`6?7#'3!*bLV'T\S@7SA7S?6W@6W.=^)GQ)U`)6?I\'>5bT\bU`KU%:&IT=4'% ?Sgf.b+4\  %?,"%,Bm%8+!k>A66"]6-%!"^@56".-/""v&R]q&T9V'G\'I\AA)9L&*6?o,#0.3AU.3MWN40&(;4@T(4Ua85UC6_`D7?SM8B7:#L>6.p^?Cp^?"p^?8NC7/9LT\R?S;%SI\}V#.X+[XA7ZYI\[@KC@]AU^]ԙ^>4/Q_0&@e?6ffK]MRg7#$WhI\ zh*5iJ`jAIk!4k?5,u7#xJTxLaGsxI\yxBVyxJ^yxAU|}LU~ETLDa6"̄6?Ei,".8&ᐡ6.z6?1Ö ǖD9WΖS^痡.MW]T]g8-0#HE".b#b+9ͣAWn6?^3ԜS^&U`pGRpKUP"ZC9:W."x,BLq8$׺@L׺@Ka7,S*A,"{* +3*,I\ á]hġ?`]hġISJšC-ɡ?TyCʡ4>stʡA7ˡW`ˡΡ-Ρ@65СA8WyС`UСUa СLa=BѡҡLCUMӡ9L9ӡMXEءxݡ4>xݡv ޡA.Kޡ.r6I"?A.A#BAw."-U`0.#V-#@K=G\c8$)2@55"4,>5*3px8*K5_5=rM z _T U` U`K@6+#GLaJTb%M?=1>R+p+YB`,J`@T4`U`GQj+>,8$@ @6o!GQK"TLHa#/%8%5S'9]k(*AT+@5A+4`,C֬,@TO-?Gi1G\i1T\2B81?4@TJ4K]9@K*<B5=`Us=5!]B-#B@-*D%*EHTSFJAZ3F+6e2M+4M-#bPҥQT\ҥQHRRW`fET>)W}V-c W:CRX*5Z\^K]c^4+ڒ_+?cR]d6"d#G{k/%)k:^mA7m/%(n@7rssI>QtW`Uv=^xy.{ULy{T^,|"|~-#сI\ƃI\9rKUrLaW`T\ȅ?SZ CZ .6I|uA7R%..UKUGGQ:@^!MW2>:&%W`c'@7K6A*G-+*?Iu:&x I\O kI\\#±.$QS^X5@X?S36"B:Cf¢.ZǢ,"5ɢ+7Nɢ`oʢW`?̢)?̢-#"̢MW"̢U`Ӣ"Ԣ6>֢# ע>GIآsآ7,ۢ.ۢ.$ۢ#*ܢ#+ݢNXYߢx""""^0&{;LC~8+ !7#!..7+.?6,5* %8A+8LU~-,I6"z%m`FT\%I\ҥ+P8P7#PC'"5S^5\^@7Wz 0&+ +o 7LLH-R]06.+*6+=eU)CWE9%#,a"w!%TC"S8-6A^.m.3/?6/: 0?62*6346"4I> /6T]r6JT#75@#7B]#77LL9K]L9B]m: l;7-;?S=,?_`kAAUD7I[HLILIA.0I.$I_`L6.P#T@KU#>U,>YHTYZU`/L[DLY^SH0W^6'_b.^bY&d=^h0d%f@LliR]jCl+t%p-#wp*r,>s@TRwt:C?t!3Yw^Iz%^Iz3z5!z#z?6m{,~7L,~U^̂6ӃLaӃBVӃHRӃ4`Ӄ@T*"Ot"OꌣKU 2"o,IR0),"& U`y1*U"AUb#dKB#\"#\-# +KI6_5>gP"í"6í-6lTA7eLUSAJ>RoGQuk@6/@5l85-EUC3ǹH@F".H컣㼣佣C #LaKݿJTA) Wã5*ţţ@Tǣ7Lȣ#YHɣ8$YHɣ.>ɣ ˣ"Σ!&Σ0&&Σ#ϣ%ң-ݣ7+eޣ"4ZޣAU|ߣ5!7ISyJB1J0&pUa߱-#6"#A53'SHm"s9])6+ (N9/6-g_-#GV:. %9 Q[9 >R 7, ,"MHT}xU`)@5+s\[<AKµC:ϻ0&@6"7L"Ua#^_+>#+!K#>RQ%+C&IT߀)U^<*MW<*A,ISA,MW.* 0HR 0U` 0T] 0MW1#,H4JT,H4MW67@[7%8* #86.09l96Ȯ98$\;#<=7+7LBB]PSC7,3CJT KvQ+!vQ*5T,BIT%T7%iT7#tU U8U&^VISY+^U`Ic@5e-# i_^%j7Lk7#k.k7,ppR]qp7@q6?hs>Rs#tlu8$u7#4zGQ{I@}I\X*37#䃤HR䃤Lag)Eڅ:C ,"[I,͆6?-,<.26AU`7@юB]H"ߑHLA@+R6";ԖAUܖR]D~9%@6\[6IٚNXO7#O"Fe+!ҝ5ҝ>_LDL7++++HKBH6*d)5+d)4 Rp0&=s +0͸@5I6.IC.壹L@Vྤ.@8ä5!^=äI\Ĥ7#Ĥ Ť6? 7ɤTL`ɤ4`^ɤ!+ˤ6.m1ͤC^aѤ65Ѥ7L,ҤISҤ5'ӤAI;4ڤHR;4ڤT];4ڤ=^;4ڤI\Cڤ7B{nߤ6A.+~JTLaT\*5 4""R]+ISQ@6kj?S6K]q+!9^8]%vUC+4B] @ 3= U@K+!2K#AKz)AJtI\$@'w|IS+4>i Ua$7Mb'NXb'U`W*."J+6.-+x1.#~37,45"@6ba@6>Rbz7>31:I>c;.";6A<=5@A8$DJTeE?@ÁF6"GU`HNXsiK.LA.HLIToOT>PK`[RHRkU.kU+IGW8@Y>T&XZUaZ6":n^I6!_I\`>55HPR]`0%9MXH=+|ؔA.I>hB7J6" l* !W-# >RᤥH@383-I\_.74+ n%9]%=I?+澥,!k7+-#¥@7¥,"8}åLV8}åNWrDǥ3ɥ-#vɥTL;˥R]y$̥+|ΥG>Υѥ9]иѥAIoեB/ʭ֥#bإ*5bإLݥ4` ޥ9]ߥ5=ߥ?Sc_`!,La%8"pU`p4`^  OT]d6?i?I\ )">Rr#8$4k%#7N%U`L'=^~(%((C(.,NX,/7#277LVWd;6+AG<<_`¶?!*1@-5ZA-ZA7AA6"B7#DAI8G 8zG5!GI*"JW`LAJ@|MK9DO:&%PU``T?SUAUTU>)vkU-$%Z=I ^AKȟ^+_,a"2dI\e?=gTL iLWIzjk5+l,B0lAMn!70n9o#|oKUsVAҕt%Rtt#w@KxJTy 2zH@z#fC{?`+|4>~5K޴~U`޴~T\~".~#4`DJSo+*!*v@I&im@7OIS וKUI\p*"j+k?68咤=Q咤DLT]X+7Ȩ+7Ȩ#7Ȩ6"-,3A.AKT䭦G\qx+=Q빳?`>UCR]7#J-#3~S=)"c6.8$eLa¦=[Ŧ!Ŧ# ɦ]Sɦ7LU5ʦ=^ͦI\ΦΦ6?gЦ:PЦ,"Ѧ?S_7ԦԦA6Ԧ8֦=I֦@Tt֦-#צbaצLT ڦ6Iܦ#ܦ)TM:!/6+dz>T`6"a:+ZgI\n%D"@TD"JT56"@6N$.4q){W` 7#6*OB]HR.5!AUxt.9O^6?6.B 82c ?T 6.pW`7IRs6#3f">AK1@^Ձ+]UCk.#?ST\6"@K"+y H@o"+9:$@6U$I6U$*6a& W'9W'/9'Ua0N*HR;,.17!=?5MW 607J6 j6I\z:8@Tz:8I\85KD:R]P+^QT\ RJT RAUpRA.R9]PS@KS.S6@ăT?5V6" VI\WW`X+!Z@TO[JU`38cW`$Td^`MNffhi3;6MW_@T_?SʁN9΁9]9"*N+4NhKU|@5^C=G^A.^D:ڈ&VɌU`6RH.BV*S_m6.6"W7+T>JT7R-IIS-IJ`>3.>3,oꝧ@LtLaI7@ؤ,ؤB8~Ҩ9JTis#ɀL.%\.%\3)鲧./r??66+-J`-4`KUEJT6,F+ `_8,`_`§*5`çLWΠǧ7-;˧˧5"~ͧ".~ͧ#ͧJTOΧKUѧ5:ӧBNmէ&֧]^|ا$- ٧#uڧ+#~ۧU`~ۧI\ۧ5ۧ# 4ܧ6?ܧ0|ݧ*50h@ThI\s"7_`)zR]^3-T6"9LT]d(6J]^6.ށq"NX$6"O.w&LaoJAWLaW9]8z GQG SG^.ԙ#3+0,"}+J7[)6I, ~CT]*-Q7"T]S^!,A!TAR!*5Ak"86" #*"%6-&4`K]&ƶ'KUƶ'MW^)T\^)?S)=IRe,,IR.AT2R7#{7ISD77Ly80&8M:+7:,;U`>J?-|@ISr@6-/H>G I:.ZLNXL5@S/#]S_ ^0Ba"[b%He.9ieUaieHR,kLa,kAU,kI\klU`OlT\,p6Ik)rW`wLA3zJD{".k{"`~}+!e]-䃨5?䃨La#+>m4T\<-8oLao5@E7B^AUS#)0%k5K)$R=5lxϖGQ Ӗ/%5!.0&BH@b-K9tʡG]0&t@5$"W,!+!ID9&6?ԃ+\p!\p@+g¨ fh¨@Tl¨MXWèQvè+5Ĩ4`tǨITǨ][Ǩ=QP˨"P˨.̨@TШ ѨLC ѨoӨJԨ@L[(ը-#6֨+!qبC"s٨ڨ,ܨ6"_%_8Au#g8Ag@JZ@L,"#* IS* A7e.#7#".#@#-#JT. +?+#6* 8;!.&.+7#@,6#;"-A7w/c1R]2MW2U`2H^oU4>R56U^{88ab;6A;9]<.2=ATs&?6?s&?T]?,"A6?AI\ET\gGDXI+!MT\P>5R!YTD9T0&U qWNXX6+.^.^Kc+>c=I”d!”d,Re6" i5 i5>;j4 kk@Tk@K_l6"km5@ep-ep,s.buxDN;{5 BC瀩ISl=^I\/C9KUT_-l6" :Cy%E+"C9I>%?T~G\p'H?Nn 6Iv&@573LWBN^ *6.LaP_`"=/%Π,5)ˢ!q*`9]`KUQ5=Έ,Ű7#Ű5!Av57+CͳDX6_#7LagBAL)?TL)GQþAJU`ĩW`|ĩ+7ũ.$^Ʃ".ǩʩJTu˩,Y+̩?5ΩΩ#ΩA7ŸҩѪө.%^ԩ?TթT\թKU֩+ש@6Kkީ/%Kkީ)<9A7P" 4 WAKdAKN,I65!Gu@5څNWN7#;QK]LVSG{3֦=^AW"b6? 7,TR*$@J* NXn0&n.P G]!NT\!NKUt+!)Dg6.7#{.)/%h6+6"J`=.=!q%%S^(GQ*CM(w.7#/%/"/0:0=Q1&.1T^45du65!du6/%du67#+7W`~"7@IVj;7#;6?= ?,@v5C9,FTLH-#CcH,JJTK+ dLISdLMWO6.Q7#Q/% RI\[RU`LU"YX* x\]W`o]GQF@_+4`CCaJT&b@5lb7#)b5#x'h@7'h9A5kA.>k+ }Dk5"emI\gmJTjm,"O8rlrT]xVCx>Tx6?&y0&y6I g~C9FLaBVA..YL+1kJ`Y5!H~hE@79JT@Lp:9UIĖ>RW` TBvU`WNa8$B@L?7o+ LCޡ@7.U` 7#^诪@T^诪I\MWm,?69H@Ī@5Ī"Ū6IŪNX{Ǫ-#$ȪJT/Ȫ_Ljɪ8Tͪ+ bͪ\^:Ϊ_^.TΪ".ҪӪR]*ժ)ڪI\ڪT\ڪIS ު, ު.rW`@A0&GG=^5+;5)g.$76"75!T !ZC"nHR@"J`xDz@rLabU4,1/%Xi+1-7#W6-.">5W`^@9%#3@I6+ `W BVc AU 3BI\[K]T\A:/&b%A+7;?S$x0&}"R]B"KU"KU.=#@%M#S^$5#%:C'&7L&T])/3+,2-84TL84T\84AU4>R45@J9".:4 ]:%<%5=8Wg>.@*6@(D#DA6+F5+,HNWSJMUSLaxT:C:W>R0[S^m]H-]7%:^6"l^9=_>_@IkQ`kQ`DLaT]ҧc+ҧc@6d9%eKUfJTsh,4h5>'i.6W-jA./kMWk,&oJTpGQnq,"JtGQRt.RIu>Rӛu3l v,"v%pmwKU0iz,|#z}4 }"~-#4 U#5 䅫5䅫-}f?SbO>R^6"ٍ/G\La)@>G]@JMUU@5WEMW杫M:M:-{7#~+!Q%SKUSMWR0ISR0KU-#o"+r6"ATCNX# )AH@¾8$¾0&¾.T\4+59DL8AīKV3Iȫ-3Iȫ@6&ȫ7-ʫ#5>ʫ˫yΫ@T-?ϫMW-?ϫ>G,ҫ5*LӫU^p ԫ-"sԫ7@ ֫5?ݫMWݫ4G7=%Yb5A"CgLa9%@KC@7"@HJNX96?+#KV\NX\ISHR@GQ%nT\%nHR:LWR]fR "P - x?-+7#L9m7>+MXO@KQW#+`JT3B]3KU39]3GQC"rIS\!7R-!@7޵"IT""j$."%%:%@T:%4`& _'.Ci(#{/.!0.Im0+m0.816+16.1AS?2"2A7z396 39%c3-Eh4=H>8TA;U^[?)P&@][uC4 uC-#uC/%uC6"rC@HmK,5yK4`L7@8LJ`YM3NOI\ OAK?O@6PLa9T+Z9U+4[V!6aVLa,|YI>GWZ6?,o]?@ _+!{`kzaB7l+!S_nR]_nLTo6.p=QpUa]yp_`p6-NqISNqT\r+r3TLt@6su0&~v+{?}@L2}T\wH@6wHwH* .#𿀬,=A7"UH@N /A.6.#V3R:&-RGUIT\J`К?4ER]T-C.7I\G㤬I\G㤬KUU`S .LU},"S7A4#}Q"K[6"@Ⲭ^S ?6 -#>AKGATֻ+佬AUҹì-ĬLa;ŬR]ɬ>5 CͬITltͬ`ά-hϬHRϬ4>Ӭ.*Ԭ)*[լ3*[լլ0&լ6"֬,"~׬_`tڬ@KjڬIT%ݬ4`>ެA.>ެ7+nެ+6nެGQ0߬#JT.Lj'MW>+KUHP>5lA.cKU]K]U`c-# U`{+"{+ 8@7>GBLa$KU$T\+7AKUt*  5*b ; !5 . -# HW`ze@TXI\kLVAKrIR-MWKUJT>I\ 8$ - . C܊65">R{6"m.!AKA%7#H%.H%:&"J&H^&JTaQ(A8)"J*_^-@T..Ҳ.JT26?C.3@A3]`"6@6> 9S^>996.T;I>s=@K>HRD=Q\ES G HUCsIKUGJ9]aJ?SI MA8S* IUNXYTL3[6?[:Caw]"]5!7 ^'^!*ȨbAUOcG\h:0X_h7+7m+7(nLaLooo*!~rA7~r+XsU^t.$/w5[wU?xN\x=H-}6"%}IS ~SHg6"{@7PF,FGB7=6?w6.@INX,%4> C537?@\6?EK]EMA>ޖMWb#6"b#* b#+ ^xܢ%7#"!]+]!m:\[m:`U~7@؍R]@5g-g36B]C7@b)G뱭?UT-T0&+򕽭^|ԾKU?4KU鿭.$:,W`6"ĭsƭ!bƭ?HxȭT\ȭA7ȭ6-JЭ,5%حU?)ۭ,ݭ"߭3*_-Cx)x.WHRO&-La0&"9L[^`oXAI+KU4`΅9%<76+HA85**,s`5UBV "') 7# NX6 #,/6"m3! )LVI\L7G[JT?* AU!W`."KUF#@Lr&+R)+) [*MWӠ*5!k0@LZ122GQJ3%Ae7X8 ) 9) 99ML=?J`G(?Q?E6IFGvDH8$H".aJ)jLAU.L^=PN#uNI6uNA76"P*5?Q\SVKUV *YVKXZGQ4ZU?Fl[U)\7(^R]Fa@K[bb?S[ks>5v+!xI\zy-#}{La}{GQ}{Ua}@K6.\5@[c+7YDUa[JT҃=3քW`|cGQ|cU`ػ8$0E5@)KT=+l5,JЍΐ." JThKU+!k&!k&7#DAI3KU>3TLѠ9L6_^=^x種6?l.@T;";+!.U`-VkT\* ,J4SBV􉴮6+I,13 0&LaZf@LISQ\[n@6?Gl@I®AK®7@]®)î !Ů,Ů8$7:Ȯ+Ȯ,"̮&Iή0&&Iή"ȗή,B2Ϯ-#2Ϯ!MϮR][Ю5!ҮJ`!ҮU`7ӮT\-Ӯ8#-ӮCt\ԮI\ծ!)YܮW`^߮7#U`R R5"Ձ@JՁMW068#-FU`7+R]?`@L0 0 @5mUa+6?6+/%6"s A7R]@:&V5KULaAU 7LJWLa6"J@58 \ * JT La 6.Ȓ:&M4A7{M86@5Rab3MW@K+6"_AK/NX:LUJT<".ܔ#@Jܔ#AUD%>R*6I]0,La,U`!p- !p-,U.@J0R]c0@7c0?6k:>+:@7@"CcA".TE"F6WdHNXSI.$I)I6?IJ$JGQcL*6Q%1T+"4fV6"V:&W!,m[5bQ]6IP_J7_@TU_-`ISJceJ@h"eU`g6"#gT\iT\Cj,"jI\j5@j6?l_`sU`=v3>5 xUC|zW`|zLa4 {-8~,TI\qLVDZDZ+!??UƄ5,`@@57IS8K@HR7L6_`_X)_X@5_X!帓GHyVCUH^A@^(K0&(K8Ӟ"Ӟ#5aG\aI\`I\`ҡ߄A-#W5>5?멯R]lLC4@5ή!){LCe@TŶ#^Ƿ5") +%:&W?6HR,AgïHRCuï7-į+4ů@^Ư3ɯ,Hpͯ?SHpͯT\ί!Yӯ#Dӯ80Vկ)Vկ*կ`.tf֯%3vگ.*ݕگU`ۯ)ܯIS~߯6.ISi3*|HRwKU0&~Q,ϲR]f5W`{ { =Q.P%+W` 2,"D9R]?-8.N6I%I?B*3+A.3QI\;0&*E~r 6. @L Lg:^>p55ԓ0&!3dI\d7AjHRjULq7#M,6vK=^_ DLj#$W`%4G';'I\%(T\%(I\Y*5,--+7=.+"25*l3MWl3I\537.$7"W8!*c9.c9+LG=))=U`)=K]2>!2>-#>6?>E7#_EJ6"J6+KKK]kLUaL:&[O (Q9D U+X?UqYU`qYISqY4`$\7# <\5@~^,&h`+ d9] e@TuJh=iS=Lj6"#l)pUa p"q*6tԑtT]ԑtT\u.|"[}+4X~AU]:7"< ^`0W`.#p)D.L! U` J`O.#S^(wݑ,L3BjLT)_`Z7,&+T:C랰#kء:C_8A7?MWb=ᬰȯ3 NXoĴ@+K\[_LOO6@K6Ű"Ƚǰ,Ƚǰ"Ƚǰ?5Ƚǰ3RȰT\<˰NXR)Ͱ?Sΰ* ΰ.9аT]*Ұ#*Ұ,"hOҰIU;g԰TLְ)څذ,@ٰ6A$ݰ#1ݰ-#ݰ@5 ްC.NT^]-HpLagYl%"N-¾"l~KU^^"" "7 +4x0S@m:C\@TI\7BZS^lS^ @^٥ W`V@JVI\m+4F=jT\UIB]Z+!T\>@KH6"G-@JU`J>RBsDU`@6dA7d+ G"#U@x>$.|@&6IO'C''S^b.A6F/9]jD1Z1^6gb2C.;5* L5H^s5"e6HTQ6#Q6A773>"78@h8@h8-8IT9AU:R]ح:IA;J^ ;@;";5CJzF%GJTQHT]uJ@68K+Y9L@Ih M@LM8--KO>R͍OI63QAIuQQKU͘R@7R=InSU`o#U7Lo#U?`ULCyY7#k`"OgCg =iTLkhi6.Tii6Iaű-#9ɱ?4dɱ/%`Bͱ,αб?6yбK]ձS1ױ@Kڱ7Lڱ#ܱ. ܱ6+7ݱJ`7ޱ"$JT$?S$La6@5Xh* UC5!>6?HG\/6? GQx(C.A%W`ddA7t@LVMWC5?+NX* #*+ +#6A.:6.- .w |/ HRv ԗ 0&ԗ +II*666REh%h3O%8$f(][*!***5:.^UO1`2?IB3?`4+40&s57I\8J48U4X:6.0;-=:&p @NX 2A.9BB]ĦBK@CIS:G@KG6?-GC-G#$H-#vI,kMU`kMT\kMDXtO.O#.QYRHRRW`öR5!U-#QU/9Y#Z@Jb[A.[+41\* 1\߷\La`IRmb>3L;df4 og pggR(mU`Nmp|q!*Ir6+rCt6*euR] 7w=QxUab3z%|z+ {/% {-!|@5J|r,ÂKUQ탲I\7@Ej2AJ] r*rT>AJ!IT^Laz@L@+-lI\_ -#=KTL~zLa~z9]tɟ* 5+SHڡ.)B>R3+ҳ4=GW鷲-#6w4 Q)dԻ6. ,I= ,_`7!,5*5#5V`+ò++ò,IJ#3Ʋ+׏DzW`Dz^+ɲ; ̲=̲}Ͳ,"}ͲYвW`*в0&6cвU`#ҲI>ղAK,ײ"6ڲ"-۲SܲB].[&"zBAU#8+!JCN<0j4>H.$rX,rX"4JA+5rCWѿ.0L@x*#+" BW`?6b7#XJ@WHT;q3>f.6e,"tt  UI J %G 7-H -GQ7}5~3!~B! )28$2-236?* ,x0&x6-B4"dAR]@Kw :&O S^9!=^9!G\@##U`[E$LU$R]q)L/I@0.15"_3@I 4!5KUF7I\$86._9#IJI\K5!OMWOU`T%O>)Q}WLa_^a?S<^cEfT\8g6"Kg#+h-j'l8m8o6+Sp 't6WuISv8v-#[hz+4~z?S+{?JTJ~La\@L@7r.9۝#K/%K+K.N5UUaB@5UJa..%5!&E.I,Pd’9]d’I\U`:LaJT\J>_@=IᕳR]JTp\f7.oC͟AJz<5*IS6IQ;3C57Al+K]˫JA+R]L+A.KU 5,uWLCx/7x"7x5!ULUʶzL.(,(9%`T\Ϳ6. 0&(³-#ó_`Zjų4`ZjųJ`ѼųGQdz8$ȳH3;ȳISɳ* ɳ6"<ɳ?SCʳ7{̳JT7{̳}̳0&Yγ" ѳ-.`ѳ.`ѳ"(Գ ճ,pڳI\Pܳ5K޳LU`߳I+4T\@JU`?`ZT]A@+A-UaU^)La%y~6IuA7LH@6n@I#,('T\e ?S__LS=(6-@KT\0KV| A.  5" $" -!95LaKU7#<9%AU ISPW9\*6#&.zG&)&^,,\C./6,E/6AE/T]/L0H^L07LJ0.$,1.$ 1I\e3W`F5@6R5AUR5JT 8/8*9% ;L@ ;!%<%4"T]MְJT_LT> @K+6.k W`wU`HR#)+U;6"=KUގ7+],`´LCô+ugô4 Lƴ6"SǴ-#eǴI\eǴ@Tȴ-˴˴#X̴W̴J`8Aʹ,$*ϴ^IӴ6"մ@+Nش3Nش+!}ٴ#}ٴI6}ٴ-_ڴI\r۴6۴ܴL7}ݴ,A6WISmI\ |I\=x35U7"H,"MW`+C8I\+>R?I+7#qFIS8$#5-I'TLyH3X>4 T\oKB-JTIJANX?ȃTH<."hJT.@K2KU!JA)7LD+@6L]+A6',6-$-@K-@6R2@Kx45?x46?4I\4Ua5#+u9@+X:3; ;@6y`>?Sw?@L?+!B5DH?D9B+G`MH7L'I=QQ^[nTBVXW.XW5!JX>RwuX@K}[4>[ [J`>]^+4g,b9Mc@5f%f?SFijI\k"q".DqI6 /t@Ttt!3w"rwJTy,C{%P|".P|#;~"=8DP}A7^:U:\Iz܈Uax=^0ˌBN ֎J@6:Cd揵U` ꐵ3nI=yAU#-N0IS,i-,i*5NH@ V>חח-|"$?Rd@U?A7XΩA.|#6?­,4ꮵ@54ꮵ@7 NawDXW`d*@+㣶秸GQ"0&=H6JDL6"o% LaAµ6- õT\õõ.ĵ)ڀǵ-ȵI\ȵLapȵ8$pȵ.$mɵTL˵-˵8$m̵7Am̵B]T͵LVT͵T]@e͵%sϵD9yϵJT<Ե+ ׵6"imٵLauٵTB%}ڵI޵CDMWR;@6S@TsAU0?6C@5J`uR]M4>c?ScJ`Lm+oT\t?S­*6sQR]7',"C. I\yJITzFG]t# 3= ]^+ ?S+ @T LaNK JT9% $/% 80&cDLcU`G\E[.ň>R.$l#U@'4=*".*"o+8#a+"N,@I-@5-.5/.V 34=r7NX97-q:4`q:J`Y=t!?@5-?LaAFT\DI>RDI?SDII>RI6-OWJISKKT9d+M d+M-#`MU`N9%I@OwQ5QJToWW>)YI49Y4`gCZsZG\mZLamZI\lh[?Slh[`J^MWU`,k`A7Ja+"a%d+SkA6Dm@TDmU`DmJT(m8nI\n5?ro@Lro9]or5@r=Ius][s"Tt6"rt#Vu%y,"?&}.LaJTFB6.ф@L7C8zȉ>6]5!]* ]"HISH_`ى,"읖?SȖAU闶/%Lař6.?SD7# Ĝ#(#(,q7#SG| @KI\$ɟڕ3=6","]S^{"zLC})fHG]J4ϫ.@5!i0&La>H"ۺ.@%;Z:C¶* FCĶ+FCĶ,#Ķ@LȶW`'PɶIS'PɶDLɶ6+ͶͶ.#ζ4`N϶-Ѷ=G\ӶJTkӶIRֶ5AGضKUGضI\ ٶ+}ڶ,޶3=T\~3,v9]\6A=^+ K]d@Kn$T9/%I\>R8AG\sp+cRAU\ 0&p 6I ?Tr A7 + =>R?`+N#77L;W`5BKjITeO7-U`I\i(+ `!R]3$@+]p&IRH(!H(H(@5 )"*0&.7#0y1T\27+;^55HRr9-#!9C9P=5>LAK?4`9fB"8ȸB-#FKU}H?=LJ5!J.ԝM.ԝM7#ԝM-#RO-O".O8O.i#VCWڲX-#jY fZ5!fZ#<^6A?kcA6e_gJ^MgT\g.$g#hKi3k@7nA.do,5BrHTBrS^[orI\ ZtIS *x5@aRx7#5yGQ>3*S^5!cU`+?$-#kLVދHRދI\ˌFuL^>.KUN:CN0.]#J$ISBA.䛷@566"$FD9^W`>LaLa+_C.7"_+_*->4 @@+uRU` Ua2(C-5@k]TH#·"6·9%Eɷ+aJɷUaʷ"˷5!˷,˷#+]/ηU`<Ϸ.#Ӯз+F ԷGRDuַ\[`ַLaV_׷ALBط6IsطU_ٷ"CMݷW`G6A`NJTT\"+/IS,"¦%:1@+M.$-)%U 7+7@La@TBKU6-GQJT *"[A.[+UiI\i^`N33+!_L@5-4U`.&.+#+x @+  6+T T] 6" >(- KUGM!7#H5GQ%_UI>+4`Y\5>K]-#-,+>RAU5+ 6I\ @J\ U` T\ O$!,%@TYM*T]YM*AK 0W`1%27A*38$?359GQ9MW:6-.g<"..g<.g< ;=#L@?SLyB* LyB@5wG64H5yJJSMI\M]`OP@T9Q5!Q"-3GR7#puR+5tW6-r)X6#2Z/%2Z,"BZ!"[*?[6I$bU`EeLaKef@+'_h+!Ei6"$\iI\ijLC"kk5IkC.SlT\45o)Ep%qKUMr s][sAIPTt x=3xCV{^"{-s>}@5lDpT\pHRJ߃5@"":6|'U` #W`đ_`+a,"uplD94QAڤT]Bʥ3*lW`$/D:?:.拫TLm06?pf@+72/8_b0D"@,GĶ_`HT@LCWNa,+!?6?¸I\SŸ-@ŸW`aJǸDaJǸ9Fɸ#˸4Iݣ͸%θ,"θ4 Ӹ8Ը%aָ6?T>ٸ@TCٸ?Iٸ>RݸU4ݸ2޸I\߸_L]3_`6AIS 8ALC?S^S^|m4`m5@6[-#[.q@6%:&7-vJTk5* 7hT]7hI\,KU;5e+ l_`u6"/".>5!KULaM+3x"-J + C.'M(BV(6"])T\Se**|,.-GQs/A750#~[0-~[0* 0?SR^2I\,5686:7U^A9* :W`@;<_`(=MWi=-#9>7#9>/%@mB"4vC:&ND#JHAUJNXLJTLAJwM"O+Q5!UI\V#gW>̀YU\C^3>#_"`"`+YKb-{bU`dH^d=^-e+yeáhR]Pk/%3 l4`ql5@p^qT\^rU^ert w@L9{@L}KU}-aN0&bB@5)̓A.l6?.d.LU .H,H"H>֏3֏"R]Γ.6+@7CGYLW.\T\rW`HU`5^,s+'* ;+4O8$ɨ".PA.aN9¹+DùNXWƹ%ƹIRyǹ7#ɹLWʞιI6й.QTҹ ԹA#չ+@<ٹ:^wٹ5!<4߹*{߹@6{߹u"7a*57B *NBB6":AK&F"5@jR]Lb6?u=֨?6 )7/?Sx@KIA+I\6-1JTpW`G -G .kITJT.|AJnKC#"C %UaHR"F+#S^$]`$][$%!6.%*.%*x'%)IS)GQ,L^2*5B]qm8.":W`I<7@@4`BCB-RBA7F+7I@IaJQK*6M=^dRHRDS8$/VH^V-1JW.1JW#*YLaUgYT\UgYKU^S^^5>_R]_@T@`T\b8$b.$b%>b4>[d5uf@6hL7@wii6"j%GjCGj/%l:CmLW_r s" s-#էv.$v-w@Lw6I-w+z%{C99~*"=@iń0&S3T\Xqn@A㺎La~i7@YY"Y0&-@7[q@56"ƘDLʜ@TʜMWw*U3+JT\ - 0&'C'3+EE". 6"#)6"'樺BVeI\ fDL #iR@TiR?S\o볺R]볺K])A6I\y=Q+?D9௺0K+ -qK]X"8yĺ@Lڏƺ#`Ǻ6A`ǺNaR<ɺ2ϺD)ӺJ`SӺR]Sպ)D7ֺ+#S׺6ۺ@Lۺ-#ۺۺ][+Lܺ&8K]ܺIT"~ܺJTMO5@MO7@qD9"LW4=Q6?M@5!HR(KCd$(X,TBA/ƛW`8R]8>IT ,U @Ll ?IW>R<_^MWLac3:&^7#y* ys l&%+)+)>R)6.*7+K,W` .LA81"57R8La˺90&<+!mT="@,@0&-;A>-;A#C4`CA.D@KLG6"*HU`"HL@fJ$-zLJTL.MU`N@6 OLCDPuSTB3T".3TTU^)V7#}YKU[C.^?6E_=Imgb/:d4`1g@5&hAJi-FkJT)kB]"kGlmW`m7#n@5-p9]Vr4`VrU`rJTdUs-Rt* u6v.v+w{>Rv"}=^v"}6Iԛ}:Ca~A7.쉋+78$%Zh-#ن6AtB8%>@6 1:C`ۢ*!HAU!H@T["@%Ԩ7#o+S٭)ȵI\S?Kӷ5!K8Ѓ>GmI\¹+O̺3+O̺N^$s0&~DLU˻0&U˻6..ͻ* λ6.ϻϻ@5#*һW`?Ի6+Oջ8J_ܻ!*'޻K]{_`v?Up]^pS^SUI`%i.DLB-4>t=QiC4Ik%^=I 9]{,{#{{@5 %LaR]S^T\@5xMW 6" + I\R "'?6[7@Ly#y0&8+7PM:|ST\?SAUT\:.)J.BV&^`@5,9 9] $W`Y*@T+!^,MW,MX-W`$16"1o3>v5I\>v5La=6U`N9@5)=@7'2=)ڃ>U`@KU@]B*B*6E"5F+TIJTI5!I,"CM-CO#+ZO>+{PKUCR.S%AT-AT=3AT0&TR]ȍX%XC_Qa-a>[2bd9/Qe=ILAf+LAf-zf/%zf-mi@5mi*k.J]lJ`n4`o+o.Lp-#0q@Gr"Gr0&rW`XrIAZt+v9%|w7Ly#}6-~?I~@+p7A8+&\?S₼/%,VT\57#q-#qO=^ߒ>4ߒny6+C=I蓜"{w5,UaJT~'-+IT`<LaBV9S,XQ5>t Lac+!88_ذ6?I\#B6.@GQk#3+R]繼U`ES^ڿ-yü9C*ļ@+kkǼCrʼ,(ʼI\(ʼLa(ʼAUd˼ϼ-?}ϼW`}ϼI\vyѼJTC=Լ>R.ԼLW1kڼ#71kڼ,7'ۼC޼%^p?SS^_"GR] * fU6"=ʳ :C2+7.+!K]2+!J$I\Y,RSS38$AU+6"3+IQ8$GQ] "4;,@VLaEHRJ9]׼-#,>Ro@?T?`½ U`!"!L7,y%89%53)B&+5&?S-'.-'.$-'N-q'+H@,W`,U^,H^:.80^L,0+ 0_`>5@67R]7'49^^:<#<,>@TfC6"boD,)]J@6KLaIL-# MAUQM+MS^:Q6.:S>+:U_^fUIXA.IX">XBVEX_`:X/%X,ZY.%Y,9ZA.#[*5f[/%~[6Is_^[_6"la@K"b7-e+4Dj%Xm@LWn%1p5#p,"8s>gs=^-duìuMAy8]J`Z_`=i+ >R?S@THRrv_`("I_`ԌTLvATvHT0HR0GQc@6c)c3t&@K DQ?TQ=Qܐ7#Ŝ/7%؝ݕ!*ʅ#5 d#5!Օ+26"@6"@)99%ʭ?=bʰT>95,LѷI\LѷAU,,",3,0&6^`+۽@6>R,La|^ýڤĽR]vBȽ,ɽ@Lo˽,.y̽JT'Խ.EԽT\"ս#z׽Cz׽#@ؽ-C ٽٽ6?ܽ>4XݽUa߽>5. 6#׆I\p@JTZS^.K@IA6I<,>`ISsJTH80&H8?62+W2JTQF,LTB9@+Ij5W`h @K y Lay Ua *5++ 5UmC8BV^G]&+!)6",!*5)dLU%":"*),!@+4"".*a#^H$# %W`(.*+w++j,KU/0R]\m1%'3e36"<757 !8C!8,!8.8I\<:T\ʭ;I6ʭ;.6O=!>TA?I\?+@@7LonB4IutC/.DaL:E6":EU;F?`nLN%P6-S5G[QT#HEU6I$WLCTS[A6t\?`\?`+\5>+\ _@H6za?`\b.#@c ifU`}g0}g#h:\jND\jI\m"kIRlR]rGRCUrGQIs?Sct6.ct".z>{?`Ͻ{B]||U|/%J?}*J?}.}0&eMWρ@I2K]Ԉ0&Ԉ#s酾,s酾"ц. 숾-#-6A,W*3㉾,>)>/-|JTSuS^86I<ɐ-8F(6+G{.%*VW`ДH@~e#4> :-F% C P3Ҩ6?%5,QQ+!=4ICWŮ"H䮾LaܲEEEE8f|JT~MWᵾI\8"!ľ?6+"žISFƾ@6Vƾ"!ǾȾAKWdɾCvʾ#>ʾAUy˾Las;GQs;7Ls;@JξU`$JѾ*FѾ@R-Ծ3@׾8cV׾AJ׾ؾZ!ܾ.Z!ܾ+ݾT]޾R]G߾MW߾-#w߾#+ISsGQ U^+!6"6%6?I-"4.#6MW6NX6KU6ISSH^n|A7|#@6^.f6XIT3.!^++dL7 U^ s>@6>UC PMWi+"A.)L9K3-UKU :&ѐ"%9#6"E'U4E'+4(HR(?Sg)A7d,GQd,T\3KU60&7*7@5I9MWI9U`Gq;#+? ?# ?8$ŗ?T]FMW:HISI6?MW9{BMW`O+@U]G@URG)Y@K`\Y%JQ[%:ӻ[!7[)\ ]>R_TS"_NX4`"-a@0a.$0a9%akc-#ue4!teW`ag0&?hXMj@5p3'p+p4 rJTytNXv)4x.uy?SuyAU z+ C5{".C5{"Fy{#/% .?6wLaC"3wψA7LaT\GL^q+4ETLsܓ:C@@5DS^ JT ~SH-#+y H^qd"=1 I\?BVK]Ʃ6-EA۫-#ԐB?SzOK];ҲLa@e@++p6-˹U`˺H@Tܦ*"V7#7B6Hz3¿S^lǿ+!˿I\˿La;̿*5*οAU8ο0&JϿ,"zҿ6+opӿ>36Կ+pٿ?6jٿ ڿ6* -ۿ+7@ݿ6.*" UI5!K"lW/]^:YL^q@7KU.9|RQ?MDLavSAU-a+ E!*--#l*"=36.?5V "< 5!<  :& I\TR]T]JT&4 l+4`JT`@TQ5??T"g.>|,5[?AUj"Z!@+A!T^#8$;$,"I&W`e&>Re&_`Z'?@K-@+z/24+4U4- 6@T 6AUҔ86-,;+{<=Gg>5*>!1?JT?%@AC-C'GKU%H."AL+4L#OKM-#,U6?UA.ԕV-#ԕV4 ԕV/%t[U4C[A7,]"nhaK` .e#;Ke6"n4 n.$Lp-q*"uvfyfzJ`|+}v}6"A+T\†C/#[D9[ISX݋#+8ō\+/%;ΐ"@6͕+͕7#͕.@L<>+I+I\I+GQ6"V4@6kZ8]?5n4 D+!- 5L{-L{)R#+Rt"se6?$"6R6"P\+waKUc#z%IM`+#ȱ4>YB-MI\-MLaZ+ Q:)@Tи.z/:ȵMWZGQvlGQ%bAJTLWED@6A@^t 5 !S^=N-B6>RLa:.77@K5?`?S#?3>!?Hc4 A.|CNX[E@I8KUoLaoIS 'bGQk-R]%*8.^U#^U0&I6$6-&_"&_#FJA9%>Rh7#F^  >R;:C>-#LKUj{!.@5ZCWd@T+@"KJ JTg"6"@#B6$=Q'@KR(* Ҙ(@5Ҙ(CҘ(.z(I\*"D+)D+?5x,La-`_P1DL6C4q46.Ȝ56.s 6,69Ll<6A77MVT_;5"y=?6y=,>"1D7#^DGQLFW`H/87HLa77N@^bN4GOGQu+S@KTT+FU6?U+!XW`Y.Z8.a.$3b5,c Ӎd+Ӎd/%hU`2;ipA6t@^u%'v"x[w`Vmw?S8xGQS"L?S"LJT-#.K]3%NJTlJT锐BV锐LU#.9$Ŕ,x6.RuB]Iʙ+"{˙,,$LW$LU R]?I\~S^#Y- ڎUa}?`6"v@5=Qѡ5ʏdC+!K,"ߧ6"x36 ?`@6嫫.$EGHlJ`گŰ!Ű-"Ͷ@6lM9]MWqǺܱHRW=I04`0U`>G56-gL!"IR2c/%2c-# 7#Y6?DI6SH$LaR6"ff@60TLA+~&.{6JTUI\,#t.%La3h.+!X4 =)q:&ٯKRIRMvK3*U`:CzL:fI\zgR]HR%/%-#= Ca LaC D*5/JT_9%9% @Ts7#{'MW{'@T{'LaF?_`*6,+"?!GQ?!G\!,l."@5t"76A&-1+)q,6.ݰ/T^/6?"0@JF0>R2T\VC3>R^57#5VN?9G\:MW:B]:IS:KU0?W`?.&A]^VC>VC?SVC@TET\EU`FA7G,aKU`5\L6"xL@+HOKUO#+>R.BT"hdW5?WG]YT\Z,Z!Zz[F],Ga]bB-e"4Gf\hIS6i!*;k=Qk!*'m+ʽmJ`^n?Trn="Gp.9gr7+r@Tr?SQt@5 t8A t7AýtDXlu rw8rw".ѩyI\yU`DzLa5d{J`}"C6~6~* _b~U`YrDX.KU.MWL@9@K,3+琉.#9HMW9HAUcP7Lh8h.5<@6>6#{ݝ@K?4iz6"iz+A.3l)l?6]5+>RC"7@T MI=ѭGQK@IKUILa[]W`-藳Laŵ,"ŵŵ5!ф8וL9ו6Ajye7#9ɽ87#ߘ6?U?z"-P34 |RLae+7@k)@k3+.$ _4>;~BV8$6IKtA.+".*@+*#6"q_^qT].KXBa6I!Z/%!Z"xt!U`srLaA7ƹ8$=QMU-#-+*-3*@:I\"-^IS=^&"-&`n*5`n`n-6"+iB]La%-Cd5KUsH^I\@6ſ ?I Wb AU >R" I\/ :CP U`KAKLD#La@59!,v KU-!%R--!TAy1!?6*`!>R[l"S^;"5E#.E#-#M#ܐ#BVܐ#I\ܐ#LaP@$5@y$ %+ &6A(5-6)%,@6-!o8/%O/NX0I\1?6344JT6S^6U`?6R]%G7,"%G76"hS8_;U`"<#<,#<"ڲW`/b>9?+!/@T]B7,hD7,FAJG9%ZoI?` K][K.$\M7#ZN-#ZN+PLavS/% [,q^+!0 _R]dU`hLDkISo+7op0&op-x>s* tu@KtuG\y2z9]<|\^}!*c~GQc~La~*I\U`P4 P".j7#VUaU`6*5~7BWR]W4`)˒6,妔JTLU}W`(q3?6HITލLV,/%,-#X3X0&nO@7Y?SYHRO@TZ?H-6eIR'K+RSGRI\>RkLa_)AI}!"{.`BN CW LVI\H6.6A3@I]T\N"HG=+IS`dA=K{!)a+49?I@Kw.L$>R~/H@-#/%k7@IZ%O  hT\sMLT 6A.LWUC- d?Sd@Lӊ6B7#T\M La1O ?74 L^ ?T =^>,o6-Z=4DXaAI.@6sE-CT\#C#8$U` &.ر&W`0*KU>+-N-K],/A/`/5!A^5?I80&>{-:|5@|A6H ~9%Q~6?巀" р7#́+́"$-0>3yDGQBM@JW`KUT\6^`KUyxR-#7>J`fA7B* -#E.BUBU9LO'7A֯֯JT֯7L(T9KԳldI>W`4G-5 4S=h?%+[* >GcU` ,7CHRnL._q6"C.A7s7#. l][ lDX lAI7#5!NoT]@^M6"w#"lA.!KU^lRSIS@T7%>R;8;"#c7=Q?]^?\[35!?Sv+%QU`@7_`7#+c~=Q_9LKUj"#IS A7` 5@vB]r+6I%T\MDp#,3 JT}La7+!h0&h@6h* h,aIR #A68#@6&6?w'MX61=IB3%f4.D7W`V8JTO?6"cAGQALadBDLMDW9KMAKHRKHT?2L6?KMO#J P#wQT]R-RR#8SGQwWJTW@TɄY+ dZZ5@[UB>^:&>^..`, b][Pc4>9fK]ةg8D3!lmunT]Op6.-qCrGQr_`tay0&z5@6R{ ׇ}W`m@KsNX+7#4(T]..LaAIŘB *5WUa@6ͼj%>6 .dAUdI\r7#MWKUBư4`T?SYAUH=l_^yfCyf)\Կ+l5"GLaFq#x+>_^Ue4>Ikv0&"HAUmCWR](T^CA7&3A7i*TA-*?IDD/|xBKQ6.EKU!9 vU@6@L;s8;s".;s7#;s/%;s0&*ʒI\&-Y3)թD@66>v_Ln " >!*ϣBJ6.a0&h$@T!7BMWPEIT6"!7+V@ L7 AI 6I >R7/:*3s I\5!=-,WM9NI\GQ<-I\^[j-8m /%|"-#|"@5|""!&6.Oa)S/.1*26AO5Cw677#u8-996.tISY>=^*>6?!<@LUBN-B8$rC#)ER]E>RG@TJI=JKU PMU PL`Q:&Q#})ST\W3XXT\.X3|f^A.L`/%L`,[aKUbAK-`c4@d.$d3d:&d,.gDbgNXy-h?Sh][3l6.}pC94pU^D:s@5.vA..v3rv6.~$xI\Iy@^}AzMW}AzLa{JT{La}LC}.$)T^FoW`OȄB]؅/%RLCUIg?`S^S=qJ`A.W`ڋ.$."_6":Ѝ53Pz-#"055@6Z+ 7$>R2|A7q+)슚H^U`?`[W`5>\7+KU 7-B O8ã@5ã?5ã)6@K/e/7oȬO+뚲0&뚲* #TLn-ҶJ`ҶI\T\U`3ǻ*6g!5t@5@Kb,cJT.$[!/ DAU+"2U`6"+#+xAKH-#(, I\ {-@J~A.6?tLW`zR]7@o5.GQ#B4>׸6" }GQ/%0&ELC/%+MW*58S"L_5@L_T\3-#˨ UT\/@+u\@5HR6?I\[V9] +',">6IU@LG3]^LB6, AUR)=4n*k+C8?,=Q^ -@Ls .LaҠ.I\4/%/#+R2GQR2K]xd4I>R5^6/: 7.j8U`8?-Q<#9<7L!<#=>R#X>J^P?=3e?,??HA:@A:@5!(A(A,-B*"lZEW`+ FF$pG@LxI?SؘK 2LT\YL0&N#N9OU`#PU`PbRR/%R>RTMDVA# W@KI#X3MX%Y@5cBY+{[+W\W`a^KUa^JT[^9g`T^b5h][h k8$fm8$_s-"jv@Ty:~)f~\St6"-_`܆V`鰈7# )>7#uBK@VNXnAJ^.#8$CNx+Gk_`tE!,*4JLA^_ %x>RAUaTR]o̶+"~?34`S=##9dH67+Ua?*|C||-_*JTo@LR]տ*տ5z8A#-#pb@LC"EfEfI>*@+*=A #m@7ٙ?6ٙ.LaV3>GMW?`-- /+* 3+K]@L-8PI\PBVP4`I\zH^p .CU`+/%LAVJ=GH\[7L/|T\/|U`/|?I_B#+!U` 5,/#7#/3 \ *?5 KUO -O %b+5 +5 I>,e#{$"Y-8":6."e%U`-W`ڦ.DXڦ.05@T3D954 6LCr66A*9:@U<;.U_;?>RPA?SPAR]qD-qD3$HU`SH5!AI6.KW`MA.1Q%RKUaRS7!/'TrT.AkV>A(Y_^A(YK]Y7#\+(V]/^3T_:CHa#{a4>Wb3Pd,Vd.$d/%d,Nd@5:f}g i. i5@yjkoVq4?\qs6-tW`۹u6?ڔvNXڔv5|x#8yH^+zGQz5,dz#dz0&'m{6I3,AJF"@^ŃW`Q?5'-S^JT@5ϑϑ3qʓ6.>R-.~>b6\S^u"_" pAJ{nfy4U4MW4BV ,6*6.\[-#gw".ѹ"ѹ,#GQ.$C,A.,I6-,"-7LAIR,",3'` O?6#Wa-6"-"Z@5C#^GQ ;+ KeNA@T^8C^:C: @@L4>'JT'I\YLa)/+! AI9%!=^)*5+VU?K0TBa,az-#z!K^4>+RHRU`MW֮@61UaAB)?LaLI\LGQLJTJU@SJ`".`0&>7L6.W`v(,"Ag. ]ON@6ON+7+AU& ˵ UaHJT*\[AUo6.=-#O35  6-953t@K$N?TGQT\DXq@+! mk Lamk ?Smk BVpv!P!$+!&%MW&=(H(?`*D9e,?`l-JT-7#-@6A-+P/6I29]2 Y3LU65H-85+)g>-#>->JTa?#\?0&A BISBB3KEQ[HFF,5aGMUG`_H#U7I6+K+)LfM+N0CN.CLRKURBS:&UUDLV XLaHX@L*X,!\@6.^+2^kT`6,a6+bIS*gg,2hh_`vkBMEkT]4m=Iyjy@+CXC9O/%OC}-E,"j<6"Jۊ0&F".ہ"+!@7TLKU5@GQ/%8#4 +/%2ݔ8D~9% G\6J:&#s,4 I\U`3. .aK].|`U8{%>5ߢ@57,#*?S8B@T8BHR+@7'@KN;0&Ӿ_aU`ޢB]LamB]DJTK+K/%=^O" kW`LA"5,%%+:GQ#8G+8G.JTOuKU6-t=^S_` #@A7k"BG8$BG.$v6"zHR5!c%8,TIT@5F8v+T]<,,"HRJTY][rh D9ٍ +!t @ M,9:3+ I\,1"}l"}l.@6-#>RT\;!!*%La06%)@&>,JT7~.R].*1NX.*1ISo9':%~=8@=I@`TOAB6/C8C5@ DAIeHI\ؿNJTBQ5@-R_`U"TKUU"T?SWW5!-Y,,@To%υ/%0&B7@BUa6"y#elΪ#."".x=IqU`qS^ͯ6+Dհ>w.%R\?6kȸ55*ƾ+bI\Z%fmR]T\-#n*3O6#.^,BV\[jLT*@+I%c9%4T>)087P0&V@JVGQS$R]IS.%C-#_NLA;%]:JT4`r%AUr%Lar%?Sr%JT=7@KB]J?+65|*5 MW I\\MW 0&vITGk3CT\ET\fKUY c* ! W`#9)?S:#U`..6%"Y>-A"-A!* @7-+gAJ:D:3-,T^="PXLa!w6*Q!8|!HR{"AUe&_`)+I\x,4 /MW2@636+*5T\6* ?7^8J^K8:@+:TL:T]4;?S3!J>J>"j@G\j@?U B5=b{DAKfJW`\0K+")M.%nO-#OLUP.$eX.cY:&Rx+z/%3{9] P|6:}-+T\ LUjJ`jLah9L܊[gS= >)+c@T/I\AU/%}m6IK+KS@C9*+1W`D9f#5̑8BuQ.~JTi@5?75!kA6WA.\!KUع?I=6HQT\鼺-Q=@IWr>R5)>d@I5!{J@T.6?5BVx"xB8+I\LUFHR#KPA6fCna5@=^W`I 0&S6?6#XN7##S^#LTsAK~+IJ`__"IS[C:NXlLa5@EKU"RGGLaGAU%i^@7T\aZHRl:ClҴ7,e8$XU^A.@Iǡ5NX#@+#*u6?B6QLaQ@TbUa0 C%; 4?  6I U4 8s -C E)"?S6+"@6?6\"5!\"7/+MUK]5#8C-!*!+s @La#JT+^z,JT,/%,C)-MW)-Ua,#/GQ0:6 01.p3AU56?T@&7IS@&7e9T]T.:.:?S;NXv B+-BH@VC6AjE?`F+GHIS?xHI\H"4ITEJLVzQJKU:K:KA.iNLaO"PQ@5ސQT]QKUNQ46RPV=^aNW.WTL+lX6YLaY@TJ[5!<[>\KT].)^T\_8$z`U`z`+ aAUaLajn* oHR\q+ tLatI\tT]FEu"5wLa-wCWwJTz+!zAIF{6^;,BW`hA6"7#e@7b9BD:wƋ%qu7#}6+Y+>RY+4`C%zf ;AUY.\5,:?S:^`j#@6s*omSHB"*AJ}B7Υn8ߧNX_(HT$BFy^UY?S{{+!lʰN9~ڰ+4jO@gͲR)εK]"?SβA6_BV5!ň6I)>_`+-#8o5#swJT " @+HM"T\x.G&2v@^H6A-#6?(BV ?SL,"3%I>K".k"k0&:fj;A7"MR] %!*jI\@A7(DU?IRW6+j%G"6ZU`p?I5"B-pK\%I\6+ c .h< HT&T]@7?S7Lm m :&M7+50&CW` /%"D9LaW`LaBVJ`#C?o ?o 8$o#U`w<'5,+-.ݕ/5!ݕ/ݕ/+8/+3-!]97L!<90g>4I@A@6BGbaGDLGISJJTK fK]T6K#6K8$|NKUYO+ PN-KQMWKQJTKQKU"oS@5T@U"8VSH8VU`>WG]W,t[+t[! \]. \]/%#_`B8[`a>R*h_`hhUa;i+ lGQcm6.GnI\%o+4!pKUqH-qW`vt>tU^[^w"{.5}6"쳅c+G$6AČ8$Č*6w^.x.$IA6UC+hSG?Й>RxI\ݞ#+qlM=I}La}I\J"7d3@Lኢ+ꕨVAͩD:R -{__9Lұ7#Lұ3_"õO3>IT=4J4L^)g.)>s>s,y:CR6?3@U47#e31GQqNXqy*6CMHRP5@& 7#c uC.LD>+* !!?I,lJT+A.+,"I4*56T^6I\q3> LAOrs"5),/#XCG,?SISg?@+4B9?>RGQU`.$1"T] XA7=^@6=Q BV U` 6I .,"t?S;". -u,+!'#'+o*=Q:Uj@J4?LaX,?Um@K^@T6,?Sb!?Sb!CUb!NXb!I\"- $C9%%9%)!)@++MWo,0"0+ j2G\63JT63ISG5"G5+(f6)(f6@67AJPA8HT:#=6.:?6-?>6>F7#vGI\HJ+J/%UK-#ÏQ*"3YCGY>GZIRh\eI],"^6.y^=I;_ǚccdKVcdKT2e)*e"dwlT\Vo,"p,"Cvg w%LwHiwXy"Ӥ{* "{>R"{|"| M~5AG+q/%q6"ÎJ`ÎU`܎MWKYDLu+t`4E3{̙"48@d0&MAU5?`NXA7^`t%I9ˣ* Q@+T6-B6.>'>'?6*ٮ^`@KD7"Q*>R+S^%"7ICa@7龼)L73D:o;6"KAP1*n4`n@TL@5I\MyR] 6>R(XGQT\>Rc80^`uTL܍6?S0&S#K"Ln7#Ƽ4 'h7#'h-#$4 J`R=5!J`GD.FR]*5*KUDG\D=Q4gJT66?7#@TLULW.' * Y =I2 .m *3ZMWo+7I\mP35#,P!I"C#I\r$Z)" *A7/,R]/5"b19Lb1`U2>R@29%3La$37#I(4@T.57#j5?S6GQ6]`V,74 @9@6G;La3=.#3=.$=T\?,A?+4@@6\B`UC=^gE/:\FHR\FJT\FGQJcI. K#MB]~R5R>37?T6+[T5![T7#8UI\YW`hL]ITL]t^+!w_@6`".`0&PI`5)c@TcAU:c.0dAJ0dNXaf-fAUBg+4[gg@TegNX i#hj-hj%Qxj0&#l6"cl%wl@Twl?S3nAU3nKUDq8psx6"AxU`AxIS{9.4|9%4|:&~,=6.HLa% 1A.$߃.߃,L_5R:C*@53݉#5D9#63AU4"ڏLao-#p}$8"ŝ6"y"KUyT]Ԥ-ty|.z؏*ȭ@Tȭ6?dtIS.%U4 Y,IT17#T.9.6"@6A7_^?5jt.jtC -# "V/%#:&p7Lp_`ym:CSGQ [I\oMWo`_&)CL&)\[h&JT#W`\5+JT= D9C4 ]6"J7Lov@L:7-# k6?BR]%b_`d"7[IT%WKU]"T])a95A7M8MWY/* M/%&,&.%}(l-,cC@Kڇ67:U`lX-#^J`d%c Na5 A9G ?=D ?6@2vAUYGQ#^5@͝*3M|JT*6"6"RSo&.:{'La*^`|+,&.A.Ɉ.7A11,h2U?%3KU5f8T\9U^Y4?R]HA)C@LDIS|E.zEBUfFrnG>RpH4`H5!H"eIIT'JL-mMJ`;tO-C3O@T[TTHT%TUnV@7wWI6ZJTE[?4[ `\5,h ^=^`Ua[b#d^`IdLaUh6Iwj#"kH^*l"m*5pLarW`u,lv.=w. yT\Ovy6.y".7zH^9||ĵ|"CK~GQW`A7+ITۇʈ@5؉5"؉D4AUҊU`4?SI@/%#+܍#_6 AU 6.nw>nw5nw,nwA.6.RAU* ߞI\ߞ>RlUa灛I\k6IkHRwHRjn+!E_LT5S +!Ρ+/+'=I'=Q'][]~_Vۤ0ʧ*5MIRb-b#b3φ>R;U`IS T\BW6"IL^a@IA8I3:&i"26?2j%GQF8`/%,:&,"T\U`X?S4Gzt+T\ϕZ:C=!BR6??`4`6A06-'H^'5@A* /z6.?SBVW`1Uasg34G+}͓LA+M8>T^_}H#w@J4* 4+#%7* VA8 KUAA./««L76+]E5"ڷ@6 "J`Cl5=l6?l_`SJU`?I+WJ`a!jU`8$.x|!+k#6?#7-~$-A%TLi+I\i+U`664@54@Tw678@6ʕ8.9C:K]f=@>+/AGMWH!I8JKJ7ZKFMW`qM+WNT>+=BA@5XIT\ZII\YKJTL5!$AN RLUySU`=X4@X5X6.b#R,%?S   @+,#[T^WL DLP]`%U`\&7-lW`|+fT_` 4@i#9L @5-#7 I\ #7MNXu+ XISB.$rA8rA6]@7' +!+ $@L]$5+* OI,4"v-@T0][0LC,2?6 t3ISm6G\C7AK<7'9A.:,<A=6.?"@6"Dg@"IAGQIAJTCKUOE/%OE@6G%H"4I5AEJL@oO*oO@5oOC Q7#Q!3T+ "W:CPXW>R#0>".^lS^OI\OJTRsz?S-?6s#&!D',6*Kʯ@L,6?2T\tܵ#:6I:9LTŸ@LѺA7BJTf@5]9LT]/:oIS{6A(7#^AULVT\ # )n+>{,"qP!* @+,UAU4 7:&737@D5#T\eATx.x/%BUC[5*(7+I%P#XW`T]V?`5NX!^#ak "6 )3D KUh +!<7,M% UC[YLaAIzQ"1u@5Š+-C+R!_`2@#T\#AU#+$$A7$LC%@6b&=SB)7#B-*@I0*0&+?` ,-#[-6?-%2=^2  4TL15?5596h7JT l9I\':I\@6?KC0&92G9]92G_`GMWGT]xLT]N?6O+PNXQ?6nRAJ!U-+NVW`cVK9 X"Z5@GZZ\@Kk]7#S`6?HcA.d.`f>#nabXqGQXqLar?5muu!zTwUaUw'xa)z@Kz^Uz%9c{9]{:&C~@L,0n.쀁)絆W`LUaψlMWB7,"8+48LW4ɋ7#˄,˄3 LUݒRT]#+3W`I=ZoTL6w?`&QJ`/՚+"+AK{#*5gR]H/IS%5!Q?=ޯ6? 6>9/% 4 6+yAIB0&i-&-#R*{BKmT]Z11T+!"_O?6_O#,TLn8@TvLa^>R^La^KU^9]7#NRW`2@Ts8$ڰ"/%+u?S1)2:D"_`fT\f)fNCdp=^{7@MWI\k K]~v@T~vJTg 7# ST\ +!A "+ .?G =QKUU?Ј%x9]K]4UE*5TLy7, j!@I!0&V"+V"@5l#ISt$+ܴ)9])+b*"=t+6.+5!+"0-@Tkq-U4-A7 . .8F0CF08O0-07#O2*=/?3J`;R]<@7@@".0A@TSDS^iG^@iGI\~K7#KW*LA.RMKURM?IO#-T9%CTJTq4U WHRW@TWI\$YNW[AJ[AIZ]]0[^C [_IR/ybT]i8Dej#k.$jlnH?=o5!Vp3qHRbrGQzvLCv@+w%wz4?V{LCZ{~AL\La;!*sV6# 6"%J`(%97L-CdV:&%t+#LB7>R>6./%-#@R*͘-#e>4N#a @70&/%5W`C".8N>77,"F!F* I)zAKoݫ9/.U`?IT\>9#S^WJTWI\|dW`EIT\E˽T_ܯGQbz:&k\[d8$d4@x@*_XLCS#?` U` ?S GQ[@5V9]f5?=?6W85@U%%*3!38A@75.CGQ>RB5@̇.99* %3@TF4 2*5219s+4TLb+>4 %b/IR:&MWJT t=I,ISX JU S@{ 6?E9I\Q#J@?La5!uGAJ ,f @+Z#.# #%=4+AU[o,--,K /)K /#53MWnr47#4GQ6?5#n:I\@:7#e;H^'C3#UDIRIF6.F+g\JU`jLJTILT\IL9]?MI!dOI\dOT]gP5Q6AXpQ+|Q3+cR**UISzV,VLaW.[)=\NXyQ\I>\r~]r~]B8N`_L^__8e*6Af?Ig%g9jaLAl"-Al"mf3n6.*p4)_qAKbq?Ts#wOyW6{ {.#vCT9ј"KVA:.A6۷@H6+15""-!jLaR?SI>+с. IA?Iɝ53-+AUB@@8$r)":JTc!8-La0&5@70%7#Al+4JT@W`T"7R熯R]-#+ ̏S^M0&] 0%Z9G[@5q=^K $#@7^5^>R]JGQ2D9#6"#|LV!!JT(C 7/ LZ?O"!-4)A7>5nU`:-;R][SI\fU`AI37#K_`iAI\MzW`aAUa][aLa&o-7++!c?6?c?>T@T G ,G J^ML^3+ MUFJ`\@6t0I61ISr5,z"* A!KUk#-?+$9#s'KUs'MW'* 1)@U;*@T;*?S;*4`/*3++.9K,-f.K0".1%'@2I\7 =][k=6->@%@6@CEA%7/FC*"DKI>_F+uHMBH7!6JlJ@"ON>5sN,(Q+WR]:W6?\XA77Y@T7YU`˗YLalY3A`  b@6eT\XgUaLg,vgG]dGhUCxh>Rh@Ki3+=jI\=jjNak>3mT\oU`:q@6t@I`u.$w*5w"44z#˅|C.}KAH~?Sb_`AJJT##E@T#E?SS99]S9AJS9MWǗM +%Y.GQϏ"|:C֐LC;T?v7R!N"05ӛ-.@5M)|3|LC|-#ա@R3}!*  5!ۦ u\[La" JT GQ@^F%K$m7,]'T\>AUL^ +>0&6.6.3* W`7#]CzT]@TBBfR,6+@<+`7,jziW`"CJALH^5?wJTܘIRU&#/)*:eKAD:)LaYAUTLR]T+4DzO@6 R]I!D,"m@K$" A#M][g#Q?g#K]g&5!Z(?V)W`?V)Lax)6.{*!5m7*A.+6"z/0.1La3AU4.~45!~45U_c6-#6>3|758La=<.!>-C ??H@3>-C#NC?5xH*!M5@HN7#іN TA8B5V".HVMWB0WNXLW0&Z3;Z>RZW`7;^TLK^^_+ `>5cR]=fT\ffT\ffUaff?I)i%5i5iTLjU`ek.9un,c  |AJ6,"-r>r6".,ISLa?S'@L-AU-9].M:!)U`XL4IKS)u%LIS T\.y+M:u3NX}D^`9U݈6^~4`]*6LAJ&}?T5ikC({ : =^G1@56"v@7KbW`3?G3ISΙ6JΙT]gKU7W`=9=. 6"P"6"3,S^a/:%,"%5>%T\%S^O%/%O%6")&@7 1(CLkf(4?+@KN,AU,22@53R]\3>RX4?5j95*6Z5+4O77"7@KF89@T A9?I :5!>A7@U`f@UaACBLa8E6"8E/%8E7#GFwH&KI\&K=^&KS^leK.dL-#dL6"͖L#U-N@5xNTLJfP-1Q".1Q8~QLC`Q-\PR0&BS_V5!V?6: WGQW.$W*3X"X#\7#\5!tY\I]/%v^LT\_I\bb-b8$0c%dR]7eNXe3+of6A;fLDgMWajmISW-pR]%p+7p# ~qLA.rTL(tw zAi|JAi|LJc}7#~W`Ro5@RoU`Ro4`#HR#I\^6.:J6.3g0&HTU`][rN#x?I66"67LR#RC[bVP| @5KmR]!urL@#t:& p+J`CM#+Sݡ0& TK?,JܦT^UaE7@TϲT\*@+P4>#ISS>R/%}-!DX!K]!UaFR]Ø=^"bf 5@ W`6+aIS96La 6"zK]pD92?6Ua* D#S@58~$W`+g}.?S7L7B"J#V-VV!@L^5D8.a7,+6.9I\[D9?6~@+0TITH-#H._O+vTL")#+M<I@ErA7.@5S I@@.%K6*BC)IT\"tLA3@+!"wZ& (-s_(KAD)_^D)?G8)I\H*LDV-\Im5%06CME0:9]91:B>">r?6??@^ @A6+B\[B"EB"vEA8F+SG# ^G=I`H5H?6YhI-KdL>RdL@T`NT]wQ5!wuR+}RI\}R\SU@TY7#/[:&[W`L\@T3_4``:C—dCN(eN9f+49g;iLa>l8:#m6?Mm%^n3~o~oIS5qMW5qR]Xq.Lr#"tA._bt?St:&uI\-wTKy!Ƭ{MB5|>R~I\"!^3,MB6?ːcԐI\eLa U^%#A"= BVyB?JT\/%Lam#) tsKU^`,6.u.$:C%zI\86IKW`^B"A/wd@T%ú-#La?ST\A7*5؟GRϮ+W`+GQ!U@57#.*%w6"~I\6z9%\+4,IR` B]M+tj--#6I|7--Z)- \ W`\ @TD!7#e<$7#&][3'G\Z (If*HR-#!}/TL_/#0* e1+ 20&4La<6U^B60&|49+9A:*5{p=6"v=@Tf>*" B B* B5#C9EU`0H,#YJ@6J0&J+!.L@TL,MN6"}PI\RA7UG\@|Z#@|Z,u_JS_@5܅`"܅`)7a#aNakb"xbH-l0c?c_c5g@+k9.iR.o)0p+pp#rI\4t"4t5!Ztpu* :yW`{6+{7_`T]kAUkLaR]GQu+4ш]S(+ʀ4`᷎fH=W`ԗL`J\I80_J`JT!+7A?/]C.lCT\BGQKUkJTk3=j+ 5>T>]!La%}.9αIU3"W`⋶6.5ʻ@5m6?DR] 0:P^I\%-#V@TC6?m6?4 IT][B6-FIS+!VKUW?6y?ST\=Q #XI\'u«6A3b#R)6^.7#?)?+?/%bU`bMW&W`"@6U`s++q5E> S^!AU75O8$I"I#B6I6A#T\AK]AGW`y9%f"@-? 9% NX =4 *63 *5o7L5-#7A[* $W`ATI\v0&!-C!5@!T\"*3k$>G'T]'U`'MW2(T\A*KV6-LU1.$m36^55;. ;^=kWIPK>@%>C;?%O@AU@!B@5BCmCmC+EW`wH8.4;IIRM(RT\7SD9TKU١TT\cV.$@W.=X+ X,6YR]T2Z-#Z?SZI\k3[,V_/%[_.a&8zd4 *fiJ`I\j%jUa^kW`l xm7#m7Am#nNXݣorU^/s4>u jwLa;xIS|z|"4b}A7Mz}+Mz}Md* ؂"+*3=̼XF8E+푐4`ܽ7#UI6="OS^Q=IQUI\[[U`4-ϭ,Bj=Ss"/:ISH&qM:q#x\[6"H#9W`iU^9]Ѱ_`"$HR\ϲNa8>-$"vR]P333 ,>-53~T\~NXc7!@6)6."R7#t+35>5j-8T\@J/;K]ԏ]^QLaQ@T1?7*6AI6J`%*"\@KU8$ C&-#&@5>".5=,TU`t4IMW AU?JȽ@TAC  )x S^̗ `4 @5?6X7L$6W`_-#_+!-5!E6?A6XO@5D9{7+b @K AK#- (U`~ )~ )$"*KUB-W`++0R]a1e6.6e6*66+!65!7877#=:C=>#>8$>6?@MB8A,AW`cB*bDUa.!F.7HLT LI\4MTLM9%gMIST7#T.T6"U`^V!7,XT\,XT]Y/^@T;U`GQ;U`@a6" aN-e@+fCfg#h+g#h.sdi,0jNXjA7kAIk=IYm?ScnK]oISp7xq.$}q@5Cs`Ts/%'s.vT]y6"z?S{5,.|@7*\|6+i }57@L7JU!J`v86"P94>/U`&@+HLW׌6Ax,5 U`mbU`mbGQ?UJnՒiU`3C-7#);P?S.9]`Ø0C ,Ǹ7RÛ~YU:ŤT\bMXףKUl+@I?SM6,/+IB]20A9 TC9sBL石5! :C/#) #6x.$Ⱦ"+̌:D+4"6f+f#p_9L AT2U!2U I\UahI\7HR_\{=Q6.NX=QWHR,+xVA75)J$TLK@5IS:&+b8$q D:uMDcI\39]GQ'}nUC T] A.E GQ "1K/%J}%;EGQ;ET]T* n"n)M-I6طGQ Q!@^:#I\%-&~'0,=Q,1][en3AUVM4?SVM4LaVM4GQM4!5V6".z77Lz7>R09?6:6?:@T;$"pB;.;A.w>T^j? H@B,"C6-"C*D* >E6.II@7/KKLab:N+!@P Q. S!"S%pUsqVAUWH@W+@rY ][L7x[\"7\#a+7?ib@Tb@TdcKU3f%hAUl9i6"" j/AlkLan@Lto@5oXMatK?3v5"nvMW(wWa[|"7?u}0&?u}*5P ~A7Q~>RpUaۉ6?-W>RW` HR80DZI\0ok͍HRns/#RLa 8  MWs 6_`k7B*,"A@-#G=^~/@LD#nО"96G"%@T"wLLVt^@5PרKU5r^_KKBxD7,&^0&S1@5S1?6fB-CR]߂߂=Q -#R5*6SGQS4J".5m.S8#.(UW`67L.""lA1-#SAU_LlLaUW` # .P J?2 Ua 0 U4 /9@ID6?H%k%:.QJ&3>QJ&I>(,[)S_*@7=T-W`7n-#-".q.-!h0A71AU1JT;1"P2AU&8_^xd9u;=IS>6-@D6IDGQvF,>HF8CIJ^HIJxLLW`>LJ`MU`gM"MN#7S&XGQcY/8JY.JZAUN[5,\6.\5+a#~c%c,7d6?BdLVBdNXCe-#ahhIR$i?6rk@IRm-n)o2q6+=uHv?S Ow4`x5!y6?}."~T\La2A.M.pK]X-67+N*h|!,cw@I׍A.׍8.>-C-LJT-#2 AИ\[UDNJ-J.J)7L>6[AKuu.۪bT]@K%K(iLa"6-%}'+a+^ # R]$r$rJT+tD7#^7"W`[N">07)U#AT\L%7#&U`&T\8(L@,),)S^*{+*6*{+>6+LaR@,4G.\-G\'-5@J/IRz+4.~5_7KUj8JTo;-<,Y<,=N9R'>-`C@6`C?6EP:I@KϿI,J+MM0&M3tN+!N7+asPC.MQ?4RI\.S0&hUC$UI\V#WH@WISX-#XXMWXXKUXX?SġX>R[.%t\:C]:&D^@I;o^;o^NXXaU`XaI\}HbA7dJ@dT\P:e,1 i@2iW` j.'j@U@p:&ܝpW`rL^/u=Q/uITw7# xHRy+4Vz,zMWz@TKz)|=I}KU{!~U` W`\[3+#hև+!ƞBVƞH^4NX#m6"*{XLa/vJ`20&?Z5!Q7L4`U`^EA63@TB9D->5)ML_TB86Z?6Z+Z@6R q\.ʕ8V_F[8$ GQGQlϫAJMaCݵG1\[ĸ#/%f.\6?g7#.#JTNXTS^TR]Y?Ss[?S=KU+@6"@T4`J`y!=8$.>*C@J4I5S,K=3[#)>ӡGQӡU`#+@7_9]_B]]?T ,%U+L75CU` -@JTpGQSh3>cF+]">RT\JTx/ "q 9MWW`#g+@tR]%W`qLač!*T6?AU#JT(K] )#DG)y)%y)IT*)+K,T]w,%F1AU5J1:05J1#15I\A6>?+8r86I9GQ:7@;@5H==+(>I\8@JT@W`iD7,EE"JH# H@6pI,hxN#kO=QPIAiPU`aPS^dR@T5RZ]S+ S@7UW`sU.$zV^[ZXA6Y-#Z+ <\<]@+]+4YjXjUaXj6IOClAU^m][ m*!pU`EpAUu+-u5*%vLa4vHRLv# zn{A6!|# ~٘@5I߁"(6"dJTJ8xJ"@^* U^dI>{9]80ߏC,cAUעR]& &SSJTH4?SknH^HLT呟=^6D:o0Uaӧ0&aKUdԫ/36A >Roj,5oj*5QKU(-EmMW7/%,"wrKU8$SU` =^/%@%7A6HA6%6I4%Dba D>RG+kM4`:L5!dIRdIT"]+!],=I,T]IS+.$".>+-#6/%656.)+6./%>RKLD@+K)} @++! KUE? 2".K@T"pA6,dJI\w@T`44W`I#5r(@6K)-%+#+.La.7#.6?'0@653La53J`53I\ͤ3AUQ5"Q56.s9#b =#+ @6"̡@LV_A6"kEI\HA.I6"I+M'L76N>RRON/RR@TRLaS!ULaZ?4]@5 ]%+^@K`+qaI\qa4`=d=GU2h.xj.9NkGQk6In4 0o+ٱtUI!u@6 wK]$wMW%zU`%|6+}T\ 9% 6-?4^LU`uuu.:^ ڄ_` ڄG\ -TA Q@7Cß3La@+57#55+MWKU_ЛK` T\ +m+@<9+4Pԧ6"!>R!U`g45Yj:^lO3*=4=Q4>*J`p,"̙.TL/?S/AU/I\&26H4@5 ;JS;7@C;[=="C*>+6>S^*>+>IX?BVS?K@A7@вB.$|C8$|C"|C,F4?dF`TVHT\9L+! LL@M73LN][S8S.-T@LUVU`UVJ`xV:&WJ^WUa~U[5!\[:C[TL`ՙ`"fT\eg6@[xjDl,"plA82nU`Xo.#>SoI\\oIT?;t^`btv-#v/%%vAU,xCU_x6+K|LU&JTa4I .9ILAy .y 87x#7x6"?SU`B@6۝@J.ģ=^>R.OW`.3j.>+!*ƦO3O-w,oCW\.$^ŒAU +=Q +T^K7+. JT][gR $`3d Q/%۳+ AJ09.L4 8.$"?S7I\GS@1,ISq{MUKMWKT\2-CYޱ,ޱ"sWGQ5`@T,6"QH6"MIS3%*0AUas.Z#>#r+&A7&4 ?&'/%'6,R*La+".9,).R]3@63+"3I\+9T\z;+<8#8=AK@S^xAxA=^?(BMB6.MD7#EK?o;EIRgHLa+H1I=GJGQJ3?LIRM,"ZP2Q0&2Q6"*7QA7{Q7+"AVI\LW/%SW7#SW@6WX,"WX6"WX/%sY_`sYISZLa}[GcL7Ad9L"jf;gD:i0&\jm#m)2@oD9Yqp/7p+u5@Nx"zLaH]|3mKUZ>RT\Tނ+@,g3-#67#6.OB]O_^wP+3ċ@TċJTċU`ċMW؎@IoA. =T\ =IS!DG\M/&0*5|/:y*6A6!],"W`W1 yj*6ڮ%ӧ+7>RfMA"XWG\b4 Z/:R6"pW`I7#4`HR@T+)R]7,"7A.s-#C8>A7>+!W`HMCWLa)AK:V.$MW@T@+$ +Z#2.p#nr*6}I>7B3M_` ##?60v3G]I".WAU%6"OLa.9;U`?S/%+c"J`6+* #1ATkz5z+z+!z#0I+ .m+y- 7#+ NX, :&r /%r .#5*D6?M=QMU`M6?bfR]z?TzHT8J-8i6U`6?|6>̓W`̓GQp/C.Z3>Z4>K1"3>:":&:"S##.%]&.&T\'-Cm)La-*?S-*KU-*Na%+T]2Z-LaQ.4`2T\V2La3@T3*558AK <6^\=/:߻>@K&C.D?`CJW`L]L=MA.ؑM"SRs.U2UT]]UGQZ-w]=^_A7`T\b`>Ra.Ae6"eC-f+!m9]m6Ahp@T;qJ`[q,2q@IrrAUs@5uB7uA6ƒw-*y@J%z,")}5!)}7# ~D9F^~@5hMWہ\^ GQ B]!*S@_-#o0&)>Rj6+Ť6"56.~.%84" ! Y6-!"yg6"36?ϡUIϡ\I1AUN 7+WA.ɲ9%xS5?3c * ߸%#Ua."?_U4ܿ*67A.86"I\+!,"UR_`?TYJTtLVv_@Tv_W`fJ`@".u%SJq3>7LaY7#'@K04>)#WG\F!35!9H^J"@5vc..pT\p.9JTpAK66+DLR@TEUI.$"`"74I6"U^_`_L"U`0b(AJj)"K*,C*IS.,$//7A)0La1L7cg3=339L;4*5R4AI6>+I76Ag7,"m9>R3h;6.V;5@V;?S~OC+!DRHuEISnF6?X?G?Sq|H?6I"I->LIRL6"O;OD9>O][?P-#39S?`/kULaVT]~["8~[-#A\LaE^#j_`La-_bL7hcLW=d?`6g\5h+4Юhj)Ëk)alK]alT\Kt6"tU`tS^^u>4-v=^N[w5!N[w,"3yT\z6?Kz+P{&8b{=^~_`4I!3>EyNaiEJT,*5I7#QQ-4AyU`B9A@5?T?ULVLU5-%Z(:C(,(?5G.:C7o!hŤ5!όI6X,X4 Ƨ*"5U^5=Q5?S"">5PI\J.JPG (-#:&н6"@I! 3=6bBL6bW` @5.7@TL?G]#c?`;La;MW9I\AGQu1c~7Lz7#4?"I>4):7#~AUV-#I\\6?Gk5!rHR_"T\0-!+8-~i@K_/KU_/I\U`f?`j:C]x5+P,A7La>-8,u 0&?  M:Uw09]w0B]~)Uu5!d_?Tώ7Lm+U^®+!nI>'@+1Q(5@(@7+JT*-.#p-^`-{.W`p1-yt5>R:#M;4`M;JT[?MXHe?@7ُB?IBJ`B)CLaE3FLa,F_^HU`IGQ5J+jL6AfN@6ÜSLaTXB"\6+]*,]4"]I\`MW'eHR'eH^'eI\h iN9\kI6kk6-ykèk6-nkMWl@KYpCpT]rTL_rW`_rLa]t ]t-+uLa+u7@0w9%'x^[)yy* e|S^a~:.BN2KUe.YI\PMD΋T\p BV9j?SA.UQJTR5:.Z!?I\Hba8'@K]S^QU#D@Lt+ K6"z!5īCqӫ@6@J~+!fB]~TABܳ/A~T^,#B@L%M'"-5!JT"=)5)5:+V=4?S??SJIt-,KT*.#K6.@G*I\G@!W`%@5%A.HRPT\pAIp6IvT\c -{63AR]X"8!Е"!Е?6 ," 3:S^u՚)s6.La34 8z,#l+l"XfK@Dl@5Dl-AUw5+[s6<%A6<%-#vGQvLa᫵La᫵MWWKT{8.baLUbaL@'@J[6"0#nP?`66?1h3=0l6Y!3b-#DCD8[AJ3@5Q{9]WLy/%y8$y5y.@/#IR%tR])@L =*4_UAU/C.7LXJA@Y@K,NXI\YC9ʪZ@7Z@LG]-#!d5!sh3^iT\^iHRi`Um6@2n,5zo@Lzp@5qU`sZvTv_Lyv%p} ~J4GQU-I\;Zd5@ZdU`Zd4`-#'!*5i)@L^7@^?SjC.'*6D>D+}.$Ķ" @6!B?Gz-85!246. 7@#өH^|5Hr0&r+bζ@5f1GQ *5Ѹ6-W`F<>in6.z56.9]E+NIS@-KTLaKTKU//7@ Lae:&.6./%N_`0&30&A8w-#w>+WyI\WyMW0MU?9-Y2qA=7"i8$5@whk0&k=Q,A7""7"J * 56"R6^.oJT\R]uGQ7) " 5! ?SF /%CI4I3K]W@TWJTWAK".W=>R8$Q6?SvJTҷAI)>kR]d GQ U`Ō!*=,#),#/%'-(UIk-"k-7+.=^$.=I0>0?6d3@68ALZ8AT 8NXc:?AAW` CmGG+FI4>:J)J5K+DKDL0LW 9LMWQT#VFW8$W5]Y%]]KA]T>^5>lO`-ha#g.6eah7"{jYj3k%zl:n0&ERnR]|bn@^|pw"yyUIK7zU`K7zT\{?`{?HK]G*6Z4`Á."քI\>6?h|ULl9%ƍAWXAK6.ĕNa~,)M.?SkߚI\kߚMWC8Sٛ5,(1B]J*":-˞"@6JGQ7B8?SxHT٫6.,"# +ĮLa!)%%JTLa&U`WCT]LCSμSμ@5^+ IS5>"65>H6fw+"Ȣ4`T'T^SU^T\4 -6 6+pCp#C8 N@TU?'I6'-H'*3~W`STJ{-R]5p+ =Ie=Q]@L9C+tKU}5,i^-Z-#N-Pr @6&2MW>G_. *JTƢ.CƢ0C@KӫH^e7+o+!o5!C#C6IT5!o/=3 K]E )*|!La"U`$3$)@(@6c*-+,*?~,=Qe,#i-AU-9%-^.l0,1%131@I"1"1S^ ;%X;I\'e*A^`:BM:#XC"EAKωFGQlLLQ4"WTU`(U.^X^X6"+rZR]\H@\+@4\^]T\^@6^9`8$QbI\QbGQcKUcG\c>R-YeJTf/%j4>j6Ipq7LqH?,r][zr.C[xR]*y{,{"}6.1}9L~U^JTFFI\ށDL +:U„@T/%pLU U^TA.`AU`La2tTLt?`"I>3bȒ,&MWX^LTIS6?"5@"K]"KUTţ*5.0?JIH6*5^79"5K6.L-#Yx5K+!=I");-6_+7eU`@T\[pR.pR5It@K(#9JTf,"@5TB+#<+d,"fT\!"6@S^U`d3D13#"S,>R^3=GQ;GQO,>|U4|5A@>R+LWma7+F)".%03nI\[T\,>-5!0T^@^U4x "!| 4>= "Ua:(> 6";~)u-".b@5W`6?bTHL=Ib:&W`)+!p.p/%MD!LC! y"K]$B77Y%!,%76_'.,0+8+#,.00:x2MWR46?bF5?Td86?AAUAMWxE@KzE"6(F6?FKFM,#QDQ.$DQ-#yQ"eR+eR.=[[,f\R]2^UKM`JT9b,jb7Lb%tc@K')d8g3!gLahKUqhUCi@H%j.>lT][l4 olAUzq*"ݩr+Bu6.v6?YzMW|.$|8$|#|"6o.ICW+!$p,"NW8$* \WJThG.Ď=IT\NX]CT\@TKUɕ@+ɕ7#8^4@X6.kJUʜ$-ʜ6,1_`Ýb="=.$ 3(ѥ@+wLT La?cldU^gCC.66"ZK@ $" ,UR0&URٳM:CUAUH8AI\>RT\о7,5?Z6.KU\[_`ԛ0&^C:I\#IT7%`)5T6-.FI\^(5@MG\>La W@51/%W`:CbWQ?  I=`x.#2[31fLawj+5U*MUKU|KC8o\0&/"q,]@6]Ǐ#7+MGQ-MW|@5g- 8$u>J 8  7Le,?{{A6pI\~5,@V-,MW5@` UaQZ"t#U`t#I\1+&.6&T\*`T~B,\/?S0+b:5?>,"Y?6Є?@L?_LACA,"=CI\F6AI}KaaMLa xM#6͉OQ@T!R^TrPR*T@5UmUEVIRD4WJAXISX5=XU`kYY\JZ.$j\A7|]LT]@Jt7^.t7^+^W`_+6.mc*5׵cieSeI%Dg%R_gR]g/:kT\kU`n#,t0q+ qJ`sMWsAKqs+ ET{!ET{-#uW}AS+,v%-6.-6"-5!-7#-/%Y8Jp0&C7.5:\[J"5 '@J:][u"T]S^,?][?`\#,2e+6ş%,C-9LV9MW x x35C9BL^wLBIA.ԟ][If5!]W`8+, Ua 9]4`JTAU]GQzP_`yAJf#,5T\qxU`9L~"L_X,B>6+k6sU`-@6, DN.*6-jISj5"j-".v7#)@5oNXG/%=6?I\|0&݆C*07#k<:&3D8X.7-2)"3>* S%+ KU9]6La'IS<_`,:-#vU`6","U 8$a { @I @+0 #:CI]HC"iD@+i4 @LL*3 0& 5nW ST] I\%W H?W + ,!DL!>R".~$% %9/2)I\ *H@ *K]%0*8$M]*L^\k*"+_L+DL3+@6wp-H^=./%t_.~.MUE/D91T^,1C4,4-#?57$-75!ʿ8!,=+n?La@U`@".s,A=3E,"-HKUDUH@KKQ8$ASAIU@5@UI\ U^`W%|VX.$Y+]W`_M,X2o+ p@^˭rR]2r!t6"uNX8u+8tx6?8txHRҠ|AJ~!oCU @5dφAJ,.4B8Cp@T:C8C2,5K3= W`.R7#7#˚Yݚ6.+4]LTYС-#С0&sLa!6?E=3,%"(W`wI6斯U`L`+P9%.HRN0&)D:X>>RLaCLq.KU0.>@ G,p)h>6H^7@W`<%x6-]7@Ua"I=k7,*&N--6x" LC05!080/%":6"7s WI\AU?S7_`La4>+7JT+!06AGQvR]C9>u+!MW6@ OP.PP3H:CLa_v@T) AI 6A " g . `8$jIA!*U77"La\,RrMCH6.wH?—5"=>R=GQJW`r GQ}%-#}%+KU 7LÀ!.#>z$>z$JTLm%B]'#|;.C.uD.089/AU4 1A7m3@L:6R]:I\d;KU_ ===Q@?.B5!X/CZD,"3E#DHMWzuJB6ZMLT].NR]BNpPaR5KES:&/T+/T)U6?UUKUGWLX7LXX~\7@]I\]U`]JT ]-$.`!Fa6"d5!d," og+pmR]p@Tq,5Wq#6]r@K&t)t:&m4vHR`{@5w{T]w{NX"~6Ahw.hw5La`4!@-y0ǃA8هK]$׈5ZS|W+!ZT^_MW_JTAK@T$9DЎ]H qٓ+4gKUW`S?Sґ8$r_LHTW`ٜ6Ip) I\0&X!.8#8:.A.32U^p\-LaLa@JCH^.>2 I\ 9?HR`U`I-C'Ŭ,7-X-#5@IS{";6A$ٺA6dC9gNX0][NTS-C@5a* @LY7+ 5*7#CCUT^6"H5!cT],?S,La,GQKU^V6"9F+&JDLJ`\+ e.LaGQw5>/4>VuS^VuJT=NXvMW,4 ,?ULao>G@6l@5]H? -Я:C9#N*6_ @L9 )9 9# ?I# AK# 4Ji 6# 5,e0/#0_T^j@KY@LQT\/4 H^y+ y+"".9%M'U`+@L+Cka-Q .I\.....+../%00 2AIs32F2"D 5Ua@7T]|9@5 D96Ixj:8$=?#O??IO?@Ka[?LV+D6?+DW`F-#?eF4UP:CǕX9%yY@TYEZ9%BZTL\T]z]/%z]+~^T\^T^^#+`T\)c6+oe8"oeC"g:&g6"dh+h7#j^Ij+7j%j@5l3nrm/#,mo-6P%pC q#+ qTAIq* Iq0&GrITוrU`+w6-w+7mz?Smz@TzS^1{G\c~NCN64 oJTI\뽃?I!.$ DŽ"F/%MX{B+*z.0IR8$~9%R4>a=Ior"CC99L " 8$6? B-#OW""3]-#|=Q|KU|R]m(-Cm(:C#6-b7#H+!ڬ7#`6"T?`°La-3JTĶN7#~zq5)i|RG.}AK`*"Z.%."U`o5!>KU>JT>I\c,>* [7," %BX#+7MW(?SO+AKW65bT]xLTT]}.$/@T.CN%qHRQd+ N`gLagISgAUlC46+OKUS^xJR]La$5@MT\Lar+6!)WR]W*.$/%-#C7#6" 6" #.fy67W`La9AD)GQ-3>Z9%o7A8A7P?6~ZI6g.JAUv'LT -#*!T]g("B]p#6-p#6.~i%+L%+4%AUΗ&7#Η&5!M'KUR(JT(5/CW1$0*P0T\2* $)3:L4-?F5-F5>A8zA#BLUCU`C6?E7LE"PGM8ғNH^PS>FQ9.dSdS9yT)W0&XW+!kW6?(X+4(Y-(YCnK[#nK[/%z[5@k^_"Dy_:9[a?4aC9~b~b-#3e+h/%ati._j@6j4 l#-ll+4PmU^1opNXVGq*6#r,"cr@6[r[t76\t*5\tA7Yv6-cw@6eyLauRzR]-zz`}!`}4 M}HT+!I@^o^UP@AjR]7@vT\vU`#H6.·"a֌I\a֌CWB6:&+GӔU`W";%IS+4FR]+LaZK]N)DTLDba6"3>()γJTw+ߺ@K.=H)> +"* _`#KA@8T\'.'8$r3-#F=3EZ  iAJ#LaB7-DI\}@T.ѡH5I\p-#D$?SW@5A.ص?` *MD5+n* fHT]L . K] U`d T\ * IS T\/MW/`_!U-6Lk3 R@Kf>+LH*4`Y .J`U`Nd C%$-#%$5!@%?6tQ*LC+D=w,6.^f-0.0.0"(2.(27#?f2"23/3VK4R]7LaU76"]99%9+:e;?B6"i*B][i*BS^OCIs* sC-I6}OAIK]iNXO6+J`'B33ըW`(G\ %%6-(x+LakJ`5G\5T\z˻MW ," * K#T]C 3,.KU,.Laխ.խ@6@7o{;hJT~\IRYGQ@6U-__Ld,7:&],]+!#+qHR.6T@JT5>J6I)b3>S>6f?Sm!o^I\b*"";aUj7+I\8$p. !4-7CI\>W`TB7}+++6"^b H?3 LU K) T]f0:OLW-$?SA7#AC>"RL.Z@74LTLzNXxH^YKU JTI#!"U"6#$(%_`'@K4(HRN)%/U`X0AKA4,T5MW7HR08+4=="y>@Lsp?6"sp?+s@U4$A $A6"\TB6.qBAUC"CCBD=^`M-#NGQ@N][n`Q9%KV+$4WT\@Y8.\C9]WN_I\&9`6,d'a"+Rc\[Qd"Ede9Le@K.fISgg8#h6?4m,7=mDo-#o+cop6?p90Hq[rTLr6 uawKURU`L"t9+o IS{c-^A62B76.ԡ6+%I\*6r9L㬦/)2AWһһ).#=^DŽ+?H0&qq,"0&,"mu/%@KpH@D=Iǵ.KUv/% 9%u@T>R*3JT?SHR*GT]R]f5]+T,T+!l"GBT\GI\`*6YKB@IY{KU[]CL[].6*6T\wQ{W`R1V,X7A*>3`U+u(UIMWH@6WG=GAQ.CW`na4 W`M."5)\/T\V H?+"p,{KUie+VjBV@7%%3[/%7LkK3+nT\9%\6-iJTo$;FDX;FNXр =!6?mB#.9&7#!+6? g,R]-W`)-.)-)-B8)-A71-3>n.>/4>j 212I>go2]^746W`67+ 67#7I\*C6?wDT\wD?IoDDLEE0&FFFISsH7L/:~O>4_Q,Q^[PS6+UIRBWU`Z_`B^?SB^NXP`I\ctdL9hThoDiA7oDi,lAInn0& pU`p%-q@7-q6qH?q6"tu@Jtu_`9u@7Bv@6x?S6yJT+Jz7#{5~6+."=X][P@5҅҅>R҅DXՈ"v4).Ce#6-`\[2ٌ#F~W`Xď%6.GQnu@6@E@5dHRL5ۇ@Kƚ6I H^=ˠHTģ?J&D9ECE7#@-#E?!E+4"6?"W` fD@_`@$+aU`z?6@TISI\+-#(/%J7-)3 3-# 3)۲6?/\[/T]?.V AJ+!,4V6+o6?1A.PJAW`nR]/eT\/eR]DL* '6"m-"ي!*SKUx+U`@L6,9@7:C%Z+#7+ "/%y#A79]{6.٬-"N5@J4`0\?5ˈ5]s8$qd U4^ v 6-"i-5A)LV/D?T[8#du@K!,!$$0&''7#B'J)5@h+-+IU,!.W`6HQD7+!D7I>D779]J9-#:!~X=,v>@7v>A7 X@,SAGvA?SBU`3C+bMCR]ZOC@6ZOC"̹D^_D?`E-#JG%CG hK?S1KW`KL7#|M@5UOmS6"mS+AS6IASU`R"VsNXsMt@T,vU@Qv+!cv.ExS^xmyT\ A{T^ A{I\'6^q-#<,MA.ЀI%S0AU0ISN*6Lă:C(B6wY6IdHRd/@^r=QN@7J-53ϐ83ϐ.3ϐ! >){FAqA6`*@6`*.D-"DA.!.$Ap̠5! "*MWPK]OT@ն4 {,ǻ@K?/%N_`5  #H7#ڼLWY0%JT@^xJAg%9@TC ?62T\QQI@'9~4=303=,AA.UW`4 .95=6C6!,?T:^s& )6?V>RB>R`/@TD+p6+xAJB6"+-J`n4 \[ #_ " C. A6+T\^JT>6tMW5mU^w=^$][$U^:k5>6"$^MT\!HR"A.Y&&f'I\(6.0)DXq,3F- +F-6+R.5,0@6419]Z:4UC4I\ۭ7A6Ap9+Y9@L9>R$;];?S\5=H^\5=DL?@IC`_\C+!CG"jK2NNRhI6l8$UImm* n5!p-2pU`oqwLUwIS|8CT\Ѭ*5cƄ=Q5!Z:LaZ.ZV?`Ǝ5#/׎"@,@,@6UISS.$Uݓ\[X!CW@7D?S,7ADXVB8ڣ6I.AAISD+{a#P?T\X"ղ,"!زIR]p) ;5#6-NI\ISJ`D.D)`R?SŁA65_`ĈW`=>RC7R]C,"SKUW.=4|GW`O.#~9A:-#5!N9=i7LJUN6.$C$/%w7#NR]|JTu#_)?IAKGQpHTsKUR]"6?W`6"H?.$,S^.:6C-7#9|GQ%N-L@5L)o Ua} a+" ?6]%GIRHRNXJ>+40I\ AI"KUC#+l$3O%LHW(G]W(R]0+6".U_:.%q/4>/@T/06?S0ISA0JTh5@5h5?6h5* 5GQ)P6IR69N6-#6)B::);=%7@=+ZQC4 2D#2D5!+D]I?S%EMIS-QMA7hMHR8,O-%PI\lPQT3V4>*[7#گ\K]t\MW:]:],"hgT\hgISIh"Eqh.Dh=S- iDL<$k=^AlK9v7@v6@^yWaLzGQ^ ~NX~@KU6-"^:P9% H53&SJTق-.#=^7+7#KJj6+$3ݐ45?|,/*3T R]Tϓ@T-[K6[cW`Ѡ ULUCA7˪+=1W`36"s>5 "8n0&LCq7Dq7>)6AyR]5XJT+p6*6֤+JI\:=Q5,/*>Rc#vG>jI\<%_C΅)*9La3&p?`qW`/s+s".ht.6(u7+(uC.MvAUw>3y=^ޮz0&m{.m{-#@|LC|.(LV"}%A1)??T Nԅ>@T֢>R[JT*?SLaB6GGR>y##Vז"iK]IS'AUT MDw?=FH^䊡5䊡8$䊡#p>67L9]B]]I\s\SJ+E@T+EI\,/H=ss6"1Q?1@5u4>c>J`YB88DTLdHR1-4 5IR]NXJ`C4 C)WL26?4+!u+!pzJ`"?T\R]^ISӖNXx?SxNX, NXIl % GQ: @Lȧ  ?6++6"5TR]t:*6BGQi=*"/"J`#+!D|'Җ'6Iu)* \+d-,J3^]5) 5#9?Sx9IT;#*;<H3+{?:?IR`B*6`B"*C.#CA7CH?>E6?٭E"٭E8$FS^J%K+LM:N6+:N5~)O#jzOU`PJ`8QXW^R";T3YCY@5R 4)계>R%@5ш@+v_`M/%MA@UIi@^i@TiJThLa9;`?S`H@`+@y+4JT\,\8,\@5TU`@7 U,K]I\6.$A6"#ISGD9Lae>R;GQ 53,"*KWN-g1"g1.T\Ko9]kJTI-#ٱ-#4IRƫ+ %LTKUX0&KU8?SX>GW`M6-AUKUMWW`HW`H@Tr%;La X5@6END9 MX>x,R@K^tPAU>Rw 0&w X,5X*5Д>+#%.$k|())6A)JT)KUje+6",@6,KVB/I\u/?60Laɿ2Z4.$53,60&6@6L7#7%8A69@59^_E@=MWE@=La=,<>LC>.@A.@A]^AS^1FC:CG]VE@5]F7##K,LSHZtL.%dN%awNU`pNO5!`]P32bT\cU"\cU#6oVW`XXJAq[La_]La_]MW&b"Nf%Pff-#fLaS*g/%S*g&.8gI>#knJkAJ`kT] lT]qlA7lo" q?`s7#u,RwCFw6."x.Px,"Px5!|.\~@6\~#E !,R5w?SAą+ W`NȄ+!Q\[b) 4C.06",+!g.vAIܠ7CLaI\VK+e]T\2T\P)l\[&:Ch$7J`NƷ%`V`/%3A.#CC6",W`kAUI7zw6I\[%Z-#5!:CLU`/6A7q:!*K#°"°35@>* a`HRI7L*3+,* k0&U`wLawKUIBW`GQ5@T7B)Qe5@;D9CNU`NTLVMJ@@TL|AU@L.$^./)VKU8 UC > 4 2 6"1IS4K]#56-8G]@7"AKU^~+yW`eW` =I \I R]2"$6":$6"$%Ѱ&A.+8'@%#*=*+!=*.`.LCP.I\P.BV&/JA007#0@7137+67@L/8NX9R]R>".o>*"We?,5We?7+}B.AUBD6A,E+7gG0LB60L0&M9%M"N3R5LRR?%TFTVJTYJ4Y_`ZI.sZ@KsZ@I [${\U`${\5@\/%]]J&^MWi^ISi^GQ^J`S`6Aa9]a6"bTLcI\c4` cI\8d8gL^%6hH?ӹh9]*h?G'nGQvp4 q6?4 qJT4 qH^r/jIs-Zs>#is.nPuHT#{6?am{K]Oe+e3e7L6"-#5K5!K/%[Ua֐("*m%"* ӗ@+bLC,|La,|CU8U` AK0&nJTHR]L7H@2.$ޜ-La d* qnJTU۬6",b&GQ"w*.U`ŧIS6R][m>R oA.U)U-#3EH^NX535-#;BVjqIS[AIS*5,r7L~/0&L^S^G]5>W`%C%:C*][)$I@g&T\,[* ,[@+7LIR3)IR:&9/%6?g?S?6 AT ," 9%6 "6 -m  HRt -t ,9%W`,bD: A?B7G6"s H^bQ$ISbQ$KU %,"s'I\pS*7-FP+!*y-@7\%0%n0dA1>R7@J5<5<<E%kJ,"imKDXKA7ZNW`O P6.QHRNrR,5R. RLVxT5W%Z-Y@TZ7#[KU&@\@5G\,]@7^6@2O_La aI\Te_^e@5j-j-Brk_`m7AmJTxG\f||6" }@T'~#0V=G T] J^fW6"RT\+S_r+ 46+tT\eސ5!L@+ư+!+YNUKVGQ ڛ0&c+!u+ cT]>RaѨU:K]=Qx@T?`FhnZ=^в@L-."=G7xLaGISA-#86+e0&@5)=:&@N@(.$@(#|.)<  {/% {M:]g6.S^I.LV#5i*"KI\i,I\'LC#][AiJTs.W`tAJ^+ZM6+?SJ`AJT; .|MWE0&RaK]yC#">,"D+v+ @U`ԥ?6 HTo#U`O#MW[$=^%+k %@6(@5f+=Qf+AU-C71  2K]uW3I@U4K4'Y:IS>:.#4<"4<)2=6.2=.B8$ӞB,BI\C7+C6+jEER]TF.H+>KI4j N6+$P6?;iPQ%Q.}2SɨT7LsVH^DXāX5A*#\@6ow]#]=^_-_`DL"ve?S8fO_f?Sf7@imW`oJToAU`o0&`oo]Trq)utI\uu.Ԕv̹zKU̹zNXxV|-}@K}!}@+6I#+GQ]„I!0&/%]6+?S)?I)4G+_A.W/:ד_`@6LWϕ$, *"#їTA!AKf)#)@6,ex#Ң MW`U6"l8$ҁLV-DW`LVmŲ+ =^fT]V=I#ֺIS#ֺU`@7"Qm@KH4>-#.6?N5!@I44>R߳>5'!JT'!KUhS^J*n <8@655U4L6.%X=G6U`7,]KUɺ:C9]6.MW+@3AU_`j?I"n6+A.| CsX,sX!)KUIS/>!)da0&da-#m6"3/R]x%+WJT(KU(H^Bx ,Y!R]!MWr"@U<"GQ#U`$I\+&6I&MW'#)-C'>*,-LTF0U?l1[2-2T]t4>R@4JT7@T0r8GQA=%?+@ BBLV| C~D-#EU`>GNXxG6.GUCY}JT\tLI\M!*oN+ɊPL^#JR@TRO4SU0&VNCk["!^6.B^5U^\`aI\e=Hf@7XgXg0&>hCpl6?mN"\r+ Is4ttufv.By+!y|{"|>s}@T|~][B+B]KU6?6.-#"->R#č-.$B65%5+v4I##T\RY+ a.ԚI\Ԛ5?!6?#6"#5"@6O?6# MWןѤ6.EkR]L@5NU`G]Յ-#-ҭG]JxT\EK9AJG]7A4`JS^#+"#+C۸GQ]?Na]?7@]?La6,-f%%* &H JT^:%Z%+ 9%EfgKUyH@K5s4`9]LaAU>I4I,5#Y4`3*q6AQ?qV?S* .Ua"AJMl*uJTl@IA69%6"@5;^`6"7 4@T4MW4AU/%610&l>6E#,4?Se 6"ī + 7# G] @Tq 6"-`?6-`7#q%:&svAJ N9TS^ R] DN!3$3_%D'5![j'R]M(@Tt(W`b)@Jr;*B]*"]+T]T,5-\[1i3>R!4'5G5Na<6.;<`=I\ե=R]CmTC DI%E"FBOGUaޘH-#ޘH4 I"3IL@I+4%ZL?S%ZLISOIR Q"7RIT=W.$r=ZT\r=ZNX2[@7`=3`"*f:Cf7,ff][hNXh+Cj uj4>n.to,pC3t!)Ct5@u+!x@Tx6?5yI\{,T-|LV=}La~A.+4G-0΀,+!P,6@6KUfόC"-R]<%RB!˖ꂝC.ꂝ"ዝ@5.5AIS?S0ATɺI\Э6.m89]T?7+\UaKDIS:C,-c=S^Rp8$y#,3$".$H=I/W8?Jo6"KU.TH@aLaA/%" D"yUa`h"MI\4 `TL`K]JTT\{v%+38CUC7*6]?R] 7"aOوHRوT\4*566+!e6"-#m+7Phalanx-XXV/search.c0000644000175000010010000002203512706242260013330 0ustar dusanNone /* * Alphabeta negamax search */ #include "phalanx.h" extern long Time; #define update_PV(move, ply) \ { \ register int jj; \ PV[ply][ply] = move; \ for (jj = ply + 1; PV[ply + 1][jj].from; jj++) \ PV[ply][jj] = PV[ply + 1][jj]; \ PV[ply][jj].from = 0; /* end of copied line */ \ } int sortkey( const void *a, const void *b ) { return ( ((tmove*)b)->value - ((tmove*)a)->value ); } int search( tmove *m, /* move list */ int n, /* number of moves */ int Alpha, int Beta ) { int i; int maxi = -1; int result; if( Abort && ! NoAbort ) return 0; /*** internal iterative deepening ***/ #define IID #ifdef IID if( Depth > 200 && Beta-Alpha>1 ) { int max=0; for( i=1; i!=n; i++ ) if( m[i].value > m[max].value ) max=i; if( m[max].value != CHECKMATE ) { int depth=Depth; Depth -= 200; search( m, n, Alpha, Beta ); Depth = depth; #undef DEBUGIID #ifdef DEBUGIID if(Depth>400) { max=0; printboard(NULL); for(i=0;i!=n;i++) if(m[i].value>m[max].value) max=i; printm(m[max],NULL); getchar(); } #endif } } #endif for( i=0; i!=n; i++ ) { int max; { int j; max = i; for( j=i+1; j!=n; j++ ) if( m[j].value > m[max].value ) max=j; } do_move(m+max); S[Ply].check = checktest(Color); if( i == 0 || Depth <= 0 ) result = - evaluate( -Beta, -Alpha ); else { #define LMRLMP /* late move reductions and pruning */ #ifdef LMRLMP /* Entry condition simplified since XXIV, now we do reduce captures, * promotions and check evasions. We do not reduce if Alpha is * a mate-in-n score, reducing may then lead to false mate announcements. */ if( Depth > 0 && Alpha > -29000 && Alpha < 29000 && !S[Ply].check /* checking move */ && i > 2 ) { int olddepth=Depth; Depth -= Depth/max(6,(33-i))+i+100; if( m[max].value <= 0 ) Depth -= 100; if( Depth>0 ) /* reduced search */ { result = -evaluate( -Alpha-1, -Alpha ); Depth = olddepth; if( result <= Alpha ) goto skipsearch; } else /* prune */ { PV[Ply][Ply].from=0; Depth=olddepth; result=Alpha; goto skipsearch; } Depth = olddepth; } #endif /* LMRLMP */ result = - evaluate( -Alpha-1, -Alpha ); if( result>Alpha && result Alpha ) { /* { int i; for(i=Counter-Ply;i!=Counter;i++) printm(G[i].m,NULL); printf("[%i,%i] %i",Alpha,Beta,result); getchar(); } */ update_PV( m[max], Ply ); Alpha = result; if(Alpha>=Beta) { if( i>0 ) slash_killers( m, i ); m[max].value = (CHECKMATE-5000)+Depth; return Alpha; } maxi = i; } else if( i==0 && Depth>0 ) update_PV( m[max], Ply ); /* The line above helps to maintain a nice long PV in those rare * cases, where negascout is not able to confirm the fail-high * and then truncates the PV. */ { tmove mo=m[max]; m[max] = m[i]; m[i] = mo; } } if( maxi != -1 ) m[maxi].value = (CHECKMATE-5000)+Depth; return Alpha; } int EasyMove; int bgs; /* best group size */ /** *** Sorting root moves and detecting possible `Easy Move'. **/ int sort_root_moves( tmove *m, int n ) { int i; int best = -CHECKMATE; int secondbest = -CHECKMATE; int result; bgs=0; FollowPV = 0; PV[0][0] = m[0]; EasyMove = 0; for( i=0; i!=n; i++ ) { do_move(m+i); result = - evaluate( -CHECKMATE, CHECKMATE ); m[i].value = result/4; if( m[i].in2 ) { m[i].value += Values[ m[i].in2>>4 ]; bgs++; } else if( m[i].special ) { m[i].value += 100; bgs++; } if( checktest(Color) ) { m[i].value += 150; bgs++; } undo_move(m+i); if( result > best ) { tmove mm=m[0]; m[0]=m[i]; m[i]=mm; secondbest = best; best = result; update_PV( m[0], 0 ); } else if( result > secondbest ) secondbest = result; } qsort( m+1, n-1, sizeof(tmove), sortkey ); if( n == 1 ) EasyMove = 3; else if( abs(best) > CHECKMATE - 100 ) EasyMove = 2; else if( best - secondbest > 70 ) EasyMove = 1; if( Flag.post && EasyMove!=0 && Flag.xboard<2 ) { printf( " -> easy move (%i) ", EasyMove ); printm(m[0],NULL); puts(" "); } return best; } long LastTurn; int Turns; tmove root_search( void ) { tmove m[256]; int rr[256]; int n, i; int Alpha, Beta; int r; int Nod[256]; Abort = 0; NoAbort = 1; generate_legal_moves( m, &n, checktest(Color) ); if( Flag.log != NULL ) { char pb[2048]; if( Counter>0 ) { fprintf(Flag.log,"\n"); if( Flag.ponder == 2 ) fprintf(Flag.log," pondering move "); else fprintf(Flag.log," opponent plays "); printm( G[Counter-1].m, pb ); fprintf(Flag.log,"%s\n",pb); } printboard(pb); fprintf(Flag.log,"%s\n",pb); } if( Flag.book ) if( Counter < 20 || Bookout < 4 || Flag.analyze ) { int b; if( Flag.easy && Counter>4 && rand()%5000 < Counter*(50+Flag.easy) ) b = -1; else b = bookmove( m, n ); if( b != -1 ) { if( Flag.easy ) usleep( (rand()%10000) * (50+2*Flag.easy) ); Bookout = 0; PV[0][1].from = 0; /* dont start pondering */ m[b].value = 0; do_move(m+b); return m[b]; } else Bookout ++; } init_killers(); if( n == 0 ) NoAbort = 0; else { int learndepth = 0; int learnalpha = 0; Age ++; Nodes = 0; A_n = n; A_m = m; A_i = 0; PV[0][0].from = 0; l_startsearch(); Ply = 0; if( Flag.nps==0 ) Depth=190; else if( Time>400000/Flag.nps ) Depth=90; else Depth=-10; if(!Flag.easy) LastIter = Alpha = sort_root_moves( m, n ); else { /* Easy levels: Let's shuffle the moves to add randomness. */ int i; for( i=1; i Alpha && !Abort ) /* TURN */ { Turns++; if(i>bgs) bgs++; update_PV( m[i], 0 ); LastTurn = ptime(); if( EasyMove != 0 ) { EasyMove = 0; if( Flag.post && Flag.xboard<2 ) printf( " -> easy move off \n" ); } if( Flag.post ) infoline(2,NULL); do_move(m+i); r = - evaluate( -Beta+rr[i], -Alpha+rr[i] )+rr[i]; undo_move(m+i); if(!Abort) { m[i].value = Alpha = r; update_PV( m[i], 0 ); if( Flag.post ) infoline(1,NULL); } { int j, ipom = Nod[i] = Nodes-lastnodes; tmove pom = m[i]; int rrr=rr[i]; for( j=i; j>0; j-- ) { m[j] = m[j-1]; Nod[j] = Nod[j-1]; rr[j] = rr[j-1]; } m[j] = pom; Nod[j] = ipom; rr[j]=rrr; } } else /* no turn, bubble up by nodes searched */ { int j; int64 ipom; tmove pom; int rrr=rr[i]; ipom = Nod[i] = Nodes-lastnodes; /* bubble up */ pom = m[i]; for( j=i; j>bgs+1 && ipom>Nod[j-1]; j-- ) { m[j] = m[j-1]; Nod[j] = Nod[j-1]; rr[j]=rr[j-1]; } m[j] = pom; Nod[j] = ipom; rr[j]=rrr; } } if( Abort ) { if( Abort == 1 && Flag.post ) puts("search aborted"); break; } } if( !Abort && Depth>300 ) { learndepth = Depth; learnalpha = Alpha; } if( Flag.post ) infoline(3,NULL); Depth += 100; FollowPV = 1; /* Fix some misbehaviour of root moves randomness when * close to game end. */ if( Flag.random && G[Counter].mtrl <= Q_VALUE+R_VALUE ) for( i=0; i!=n; i++ ) if( abs(Alpha)>29990 ) rr[i]=0; else rr[i]/=2; if( abs(Alpha) > 29000 ) { if( abs(Alpha)+Depth/100 > CHECKMATE ) break; if( EasyMove < 2 ) { EasyMove = 2; if( Flag.post && Flag.xboard<2 ) printf( " -> forced checkmate -> easy move (2) \n"); } } LastIter = Alpha; } Depth -= 100; AllDepth += Depth; { extern long T1; long t=ptime()-T1; if( t != 0 ) AllNPS += 100*Nodes/t; } if( Flag.post ) infoline(0,NULL); if( Flag.learn && learndepth ) wlearn( learndepth, learnalpha ); do_move(PV[0]); } signal(SIGINT,SIG_IGN); return PV[0][0]; } Phalanx-XXV/static.c0000644000175000010010000011440412546667660013375 0ustar dusanNone/** *** STATIC EVALUATION **/ #include "phalanx.h" /** *** command `score' shows detailed information about static *** evaluation of actual position. If you want this to work, *** SCORING must be defined. Then, static evaluation function *** is somewhat slower. **/ #undef SCORING int Scoring; /** *** If the material value is between ENDMATERIAL and MIDMATERIAL, *** Phalanx computes both endgame and middlegame evaluation. *** The evaluation is proportionally computed from these two values. **/ #define ENDMATERIAL 3000 /* minimum is 0 */ #define MIDMATERIAL 6000 /* maximum is 8600 */ tknow Wknow, Bknow; /* isolated pawn penalty by rank */ static const int isofile[10] = { 0, -4, -6, -8, -10, -10, -8, -6, -4, 0 }; /*** A B C D E F G H ***/ /*** Square color ***/ signed char sqcolor_[80] = { 0, 2, 1, 2, 1, 2, 1, 2, 1, 0, 0, 1, 2, 1, 2, 1, 2, 1, 2, 0, 0, 2, 1, 2, 1, 2, 1, 2, 1, 0, 0, 1, 2, 1, 2, 1, 2, 1, 2, 0, 0, 2, 1, 2, 1, 2, 1, 2, 1, 0, 0, 1, 2, 1, 2, 1, 2, 1, 2, 0, 0, 2, 1, 2, 1, 2, 1, 2, 1, 0, 0, 1, 2, 1, 2, 1, 2, 1, 2, 0 }; signed char * sqcolor = sqcolor_-20; /*** Pawn in middlegame ***/ int pmpb_[80] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 4, 6, 6, 4, 3, 2, 0, 0, 0, 1, 5, 8, 8, 5, 1, 0, 0, 0, 0, 1, 6, 16, 12, 6, 1, 0, 0, 0, 1, 5, 7, 16, 12, 7, 5, 1, 0, 0, 5, 8, 10, 16, 12, 10, 8, 5, 0, 0, 5, 5, 5, 6, 6, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; const int * pmpb = pmpb_-20; /*** queenside pawn attack ***/ int qstormtable_[80] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-12,-12,-12, 0, 0, 10, 10, 10, 0, 0, -9,-10, -9, 0, 6, 8, 8, 8, 0, 0, -6, -6, -6, 6, 10, 4, 4, 4, 0, 0, -3, -3, -3, 10, 4, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; const int * qstormtable = qstormtable_-20; /*** kingside pawn attack ***/ int kstormtable_[80] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 10, 10, 0, 0,-12,-12,-12, 0, 0, 8, 8, 8, 6, 0, -9,-10, -9, 0, 0, 4, 4, 4, 10, 6, -6, -6, -6, 0, 0, 0, 0, 0, 4, 10, -3, -3, -3, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; const int * kstormtable = kstormtable_-20; /*** knight in middlegame ***/ int nmpb_[80] = { 0,-16,-10, -8, -8, -8, -8,-10,-16, 0, 0,-10, -3, 1, 3, 3, 1, -3,-10, 0, 0, -8, 1, 5, 5, 5, 5, 1, -8, 0, 0, -8, 2, 5, 8, 8, 5, 2, -8, 0, 0, -8, 4, 6, 10, 10, 6, 4, -8, 0, 0, -8, 4, 7, 8, 8, 7, 4, -8, 0, 0,-10, 0, 3, 4, 4, 3, 0,-10, 0, 0,-16,-10, -8, -8, -8, -8,-10,-16, 0 }; const int * nmpb = nmpb_-20; /*** knight in endgame ***/ int nepb_[80] = { 0,-16,-10, -6, -2, -2, -6,-10,-16, 0, 0, -9, -3, 1, 4, 4, 1, -3, -9, 0, 0, -4, 1, 5, 8, 8, 5, 1, -4, 0, 0, 0, 4, 8, 12, 12, 8, 4, 0, 0, 0, 1, 5, 9, 13, 13, 9, 5, 1, 0, 0, -2, 2, 6, 9, 9, 6, 2, -2, 0, 0, -6, -1, 2, 5, 5, 2, -1, -6, 0, 0, -9, -6, -3, 0, 0, -3, -6, -9, 0 }; int *nepb = nepb_-20; /*** bishop in middlegame ***/ int bmpb_[80] = { 0, 10, 8, 6, 4, 4, 6, 8, 10, 0, 0, 8, 12, 8, 9, 9, 8, 12, 8, 0, 0, 10, 10, 11, 11, 11, 11, 10, 10, 0, 0, 11, 12, 13, 14, 14, 13, 12, 11, 0, 0, 12, 13, 15, 17, 17, 15, 14, 12, 0, 0, 13, 14, 16, 16, 16, 16, 14, 13, 0, 0, 11, 14, 12, 12, 12, 12, 14, 11, 0, 0, 13, 10, 10, 10, 10, 10, 10, 13, 0 }; const int * bmpb = bmpb_-20; /*** bishop in endgame ***/ int bepb_[80] = { 0, 24, 21, 18, 15, 15, 18, 21, 24, 0, 0, 21, 24, 21, 18, 18, 21, 24, 21, 0, 0, 18, 21, 24, 24, 24, 24, 21, 18, 0, 0, 15, 18, 24, 30, 30, 24, 18, 15, 0, 0, 15, 18, 24, 30, 30, 24, 18, 15, 0, 0, 18, 21, 24, 24, 24, 24, 21, 18, 0, 0, 21, 24, 21, 18, 18, 21, 24, 21, 0, 0, 24, 21, 18, 15, 15, 18, 21, 24, 0 }; const int * bepb = bepb_-20; /*** rook in middlegame ***/ int rmpb_[80] = { 0, 0, 1, 2, 3, 3, 2, 1, 0, 0, 0, 0, 1, 2, 3, 3, 2, 1, 0, 0, 0, 0, 1, 2, 3, 3, 2, 1, 0, 0, 0, 0, 1, 2, 3, 3, 2, 1, 0, 0, 0, 0, 1, 2, 3, 3, 2, 1, 0, 0, 0, 7, 8, 9, 10, 10, 9, 8, 7, 0, 0, 10, 11, 12, 13, 13, 12, 11, 10, 0, 0, 10, 11, 12, 13, 13, 12, 11, 10, 0 }; const int * rmpb = rmpb_-20; /*** queen in middlegame ***/ int qmpb_[80] = { 0, 0, 1, 2, 3, 3, 2, 1, 0, 0, 0, 4, 5, 6, 7, 7, 6, 5, 4, 0, 0, 5, 6, 7, 8, 8, 7, 6, 5, 0, 0, 6, 7, 8, 9, 9, 8, 7, 6, 0, 0, 8, 9, 10, 11, 11, 10, 9, 8, 0, 0, 10, 11, 12, 13, 13, 12, 11, 10, 0, 0, 8, 10, 11, 12, 12, 11, 10, 8, 0, 0, 5, 6, 7, 8, 8, 7, 6, 5, 0 }; const int * qmpb = qmpb_-20; /*** king in middlegame ***/ int kmpb_[80] = { 0, 0, 0, -3, -6, -6, -3, 0, 0, 0, 0, -2, -4, -8,-12,-12, -8, -4, -2, 0, 0, -6,-12,-20,-25,-25,-20,-12, -6, 0, 0,-15,-20,-30,-40,-40,-30,-20,-15, 0, 0,-30,-40,-50,-60,-60,-50,-40,-30, 0, 0,-35,-45,-55,-65,-65,-55,-45,-35, 0, 0,-30,-40,-50,-60,-60,-50,-40,-30, 0, 0,-20,-30,-40,-50,-50,-40,-30,-20, 0 }; const int * kmpb = kmpb_-20; /*** king in endgame ***/ int kepb_[80] = { 0, -5, 5, 10, 15, 15, 10, 5, -5, 0, 0, 6, 11, 16, 21, 21, 16, 11, 6, 0, 0, 12, 17, 22, 27, 27, 22, 17, 12, 0, 0, 18, 24, 30, 34, 34, 28, 24, 18, 0, 0, 20, 27, 33, 48, 48, 33, 27, 20, 0, 0, 16, 25, 34, 40, 40, 34, 25, 16, 0, 0, 9, 20, 28, 35, 35, 28, 20, 9, 0, 0, 3, 10, 17, 24, 24, 17, 10, 3, 0, }; const int * kepb = kepb_-20; int outpost_[80] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 0, 0, 0, 0, 0, 0, 0, 1, 2, 2, 1, 0, 0, 0, 0, 0, 1, 2, 3, 3, 2, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; const int *outpost = outpost_-20; /* Mobility bonuses are extremely non-linear, a piece that has a very small * number of moves gets a large penalty. The rook mobility bonus/penalty is * tripled in endgame. */ int B_mobi[20] = { -36, -28, -20, -14, -6, -2, 1, 2, 3, 4, 5, 6, 7, 8, 8, 8, 8, 8, 8, 8 }; int N_mobi[10] = { -50, -25, -15, -10, -5, 0, 5, 10, 15, 20 }; int R_mobi[16] = { -20, -15, -10, -7, -4, -2, 0, 2, 4, 6, 8, 9, 10, 10, 10, 10 }; /* power table */ unsigned P[120]; int *pf, *xpf, wpf[10], bpf[10]; /* # of w&b pawns on a file */ int score_position(void) { int i; /** *** We always compute both 'endgame' value and 'middlegame' position *** value. After they are computed, they are balanced by total material. *** This prevents evaluation to do big jumps when searching a position *** on the edge of middlegame and endgame. *** *** Evaluation is done in two passes: *** 1) Extract knowledge (see typedef tknow), prepare mirrored board. *** 2) Use knowledge. Thanks to mirroring board in first pass, we dont *** have to write evaluation of specific things twice (for white and *** black separately). This might also make better use of internal *** cache on small machines. **/ int midresult, endresult, result, mtrl_diff; int whp, bhp; /* sum of hung pieces. >=2 means troubles -> big penalty. */ int kp, xkp; /* this side and other side king position */ tknow * know, * xknow; static int *l, wl[34], bl[34]; /* w&b piece list. Indexes to B[] (mB[]) */ static int n, wn, bn; static int pin[32]; int npin; /* mirrored board */ static tsquare mB[120] = { 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3 }; static tsquare mBinit[80] = { 3, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 3 }; tsquare *b; /***************************************************************/ if( Totmat <= (R_VALUE+R_VALUE+P_VALUE) ) { /* if there are no pieces, return special pawn endgame evaluation */ /* [moved, computed later] */ /* Now, check some special endgame positions that are known to be * hopeless draw (this might also cause pruning of the search). */ switch(Totmat) { case (B_VALUE+P_VALUE): /* minor piece and pawn */ { int r = e_mp(); if( r ) return DRAW+r; } break; case (N_VALUE+N_VALUE): /* minor against minor or two knights */ if( G[Counter].mtrl == N_VALUE ) /* minor:minor */ if( G[Counter].m.in2 == 0 ) return DRAW; { int nn=0; for( i=L[WKP].next; i!=0; i=L[i].next ) if( B[i] == WN ) nn++; if( nn == 1 ) return e_nb(WHITE); if( nn == 2 ) return Color==WHITE ? DRAW-(N_VALUE+N_VALUE) : DRAW+(N_VALUE+N_VALUE); if( nn == 0 ) { for( i=L[BKP].next; i!=0; i=L[i].next ) if( B[i] == BN ) nn++; if( nn == 1 ) return e_nb(BLACK); if( nn == 2 ) return Color==WHITE ? DRAW+(N_VALUE+N_VALUE) : DRAW-(N_VALUE+N_VALUE); } } break; case (R_VALUE+R_VALUE+P_VALUE): /* RPr */ if( abs(G[Counter].mtrl-G[Counter].xmtrl) == P_VALUE ) { int i; int np=0; for( i=L[WKP].next; i!=0; i=L[i].next ) np++; for( i=L[BKP].next; i!=0; i=L[i].next ) np++; if( np == 3 ) return e_rpr(); } break; } } result = midresult = endresult = whp = bhp = npin = 0; memcpy( mB+20, mBinit, 80*sizeof(tsquare) ); wn = bn = 1; /* King ... at least */ for(i=0;i!=10;i++) wpf[i]=bpf[i]=0; memset( &Wknow, 0, sizeof(tknow) ); memset( &Bknow, 0, sizeof(tknow) ); memset( P+20, 0, 80*sizeof(unsigned) ); Wknow.kp = WKP; Wknow.worsebm = 100; Wknow.lpf = 9; Bknow.kp = BKP; Bknow.worsebm = 100; Bknow.lpf = 9; /************************************************/ i=WKP; mB[ Th[i] ] = BK; wl[0] = i; for( i=L[i].next; i!=0; i=L[i].next ) { int j; int mobi; switch( B[i] ) { case WP: mB[ Th[i] ] = BP; wl[wn] = i; wn++; wpf[i%10]++; if(i%10Wknow.rpf) Wknow.rpf=i%10; Wknow.p++; for( j=i+9; j<=i+11; j+=2 ) { P[j] |= WPM; P[j] += WWW; } if( i>=A6 && B[i+10]==0 ) /* Passed pawn */ { Bknow.hung+=4; if(B[i+20]==0||B[i+20]==3) Bknow.hung+=16; } break; case WN: mB[ Th[i] ] = BN; wl[wn] = i; wn++; Wknow.n++; mobi = 0; for( j=0; j!=8; j++ ) { int d = i+N_moves[j]; P[d] |= WNM; P[d] += WWW; /* knight mobility below, note that this is not just * the number of pseudo-legal moves. We don't count * squares with friendly pawns and squares attacked * by enemy pawns. We do count moves targeting other * friendly and enemy pieces - search should handle. */ if( B[d]!=3 && B[d]!=WP && B[d+9]!=BP && B[d+11]!=BP) mobi++; } result += N_mobi[mobi]; break; case WB: mB[ Th[i] ] = BB; wl[wn] = i; wn++; Wknow.b++; Wknow.bishopcolor |= sqcolor[i]; Bknow.xbishopcolor |= 3-sqcolor[i]; mobi = 4; for( j=4; j!=8; j++ ) { int step = RB_dirs[j]; int d = i; do { d+=step; mobi++; P[d] |= WBM; P[d] += WWW; } while( B[d] == 0 ); if( B[d] & WHITE ) /* edge or friendly piece */ { mobi--; if( B[d]==3 || ( B[d]==WP && B[d+10] ) ) mobi--; } else if( B[d]==BN || B[d]==BR || B[d]==BQ ) { pin[npin]=d; do d+=step; while( B[d]==0 ); if( B[d]==BQ || B[d]==BK ) npin++; } } result += B_mobi[mobi]; if( mobi < Wknow.worsebm ) Wknow.worsebm = mobi; break; case WR: mB[ Th[i] ] = BR; wl[wn] = i; wn++; if( i>=A7 && i<=H7 ) Wknow.r7r+=2; Wknow.r++; mobi = 0; for( j=0; j!=4; j++ ) { int step = RB_dirs[j]; int d = i; do { d += step; mobi++; P[d] |= WRM; P[d] += WWW; } while( B[d] == 0 ); if( B[d] & WHITE ) mobi--; else if( B[d]==BN || B[d]==BB || B[d]==BQ ) { pin[npin]=d; do d+=step; while( B[d]==0 ); if( B[d]==BQ || B[d]==BK ) npin++; } } result += R_mobi[mobi]; endresult += 2 * R_mobi[mobi]; break; case WQ: mB[ Th[i] ] = BQ; wl[wn] = i; wn++; if( i>=A6 ) Wknow.r7r++; Wknow.q++; for( j=0; j!=8; j++ ) { int step = RB_dirs[j]; int d = i; do { d += step; P[d] |= WQM; P[d] += WWW; } while( B[d] == 0 ); if( B[d]==BN || ( B[d]==BB && j<4 ) || ( B[d]==BR && j>=4 ) ) { pin[npin]=d; do d+=step; while( B[d]==0 ); if( B[d]==BK ) npin++; } } break; } } i=BKP; mB[ Th[i] ] = WK; bl[0] = Th[i]; for( i=L[i].next; i!=0; i=L[i].next ) { int j; int mobi; switch( B[i] ) { case BP: mB[ Th[i] ] = WP; bl[bn] = Th[i]; bn++; bpf[i%10]++; if(i%10Bknow.rpf) Bknow.rpf=i%10; Bknow.p++; for( j=i-11; j<=i-9; j+=2 ) { P[j] |= BPM; P[j] += BBB; } if( i<=H3 && B[i-10]==0 ) { Wknow.hung+=4; if(B[i-20]==0||B[i-20]==3) Wknow.hung+=16; } break; case BN: mB[ Th[i] ] = WN; bl[bn] = Th[i]; bn++; Bknow.n++; mobi = 0; for( j=0; j!=8; j++ ) { int d = i+N_moves[j]; P[d] |= BNM; P[d] += BBB; if( B[d]!=3 && B[d]!=BP && B[d-9]!=WP && B[d-11]!=WP) mobi++; } result -= N_mobi[mobi]; break; case BB: mB[ Th[i] ] = WB; bl[bn] = Th[i]; bn++; Bknow.b++; Bknow.bishopcolor |= 3-sqcolor[i]; Wknow.xbishopcolor |= sqcolor[i]; mobi = 4; for( j=4; j!=8; j++ ) { int step = RB_dirs[j]; int d = i; do { d += step; mobi++; P[d] |= BBM; P[d] += BBB; } while( B[d] == 0 ); if( B[d] & BLACK ) { mobi--; if( B[d]==3 || ( B[d]==BP && B[d-10] ) ) mobi--; } else if( B[d]==WN || B[d]==WR || B[d]==WQ ) { pin[npin]=d; do d+=step; while( B[d]==0 ); if( B[d]==WQ || B[d]==WK ) npin++; } } result -= B_mobi[mobi]; if( mobi < Bknow.worsebm ) Bknow.worsebm = mobi; break; case BR: mB[ Th[i] ] = WR; bl[bn] = Th[i]; bn++; if( i>=A2 && i<=H2 ) Bknow.r7r+=2; Bknow.r++; mobi = 0; for( j=0; j!=4; j++ ) { int step = RB_dirs[j]; int d = i; do { d += step; mobi++; P[d] |= BRM; P[d] += BBB; } while( B[d] == 0 ); if( B[d] & BLACK ) mobi--; else if( B[d]==WN || B[d]==WB || B[d]==WQ ) { pin[npin]=d; do d+=step; while( B[d]==0 ); if( B[d]==WQ || B[d]==WK ) npin++; } } result -= R_mobi[mobi]; endresult -= 2 * R_mobi[mobi]; break; case BQ: mB[ Th[i] ] = WQ; bl[bn] = Th[i]; bn++; if( i<=H3 ) Bknow.r7r++; Bknow.q++; for( j=0; j!=8; j++ ) { int step = RB_dirs[j]; int d = i; do { d += step; P[d] += BBB; P[d] |= BQM; } while( B[d] == 0 ); if( B[d]==WN || ( B[d]==WB && j<4 ) || ( B[d]==WR && j>=4 ) ) { pin[npin]=d; do d+=step; while( B[d]==0 ); if( B[d]==WK ) npin++; } } break; } } if( Totmat == P_VALUE*(Wknow.p+Bknow.p) ) { /* only pawns */ return pawns(); } #undef debug #ifdef debug { int i,j; puts(""); for(i=110;i>=0;i-=10) { for(j=0;j!=10;j++) printf(" %04X",P[i+j]);puts(""); } } #endif #ifdef SCORING if( Scoring ) printf(" (w/b) mobility = %i\n",result); #endif /** *** Scan pinned pieces **/ { int pini; for( i=0; i!=npin; i++ ) switch( B[ pini = pin[i] ] ) { case WQ: result -= 50; Wknow.hung += 20; break; case BQ: result += 50; Bknow.hung += 20; break; case WN: case WB: case WR: if( (P[pini] & WPM) == 0 ) /* not pawn-protected */ { Wknow.hung += 6; result += -15*(P[pini]>>13); } else result += -6*(P[pini]>>13); if( P[pini] & BPM ) { Wknow.hung += 5; result -= 15; } break; case BN: case BB: case BR: if( (P[pini] & BPM) == 0 ) { Bknow.hung += 6; result += 15*((0x00F0&P[pini])>>5); } else result += 6*((0x00F0&P[pini])>>5); if( P[pini] & WPM ) { Bknow.hung += 5; result += 15; } break; } } /** *** Look for hung pieces & weak pawns **/ { static unsigned m[112] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x0, 0x0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1, 0x1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1, 0x1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x7, 0x7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xF, 0xF, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xF, 0xF, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; for( i=L[WKP].next; i!=0; i=L[i].next ) if(P[i]&0xFF00) /* Black attacks the square 'i' */ { if( (P[i]&0x00FF)==0 /* undefended */ || ( m[B[i]] & (P[i]>>8) ) /* attacked by less valuable */ ) switch(B[i]) { case WP: Wknow.hung += 8; break; case WN: case WB: whp++; Wknow.hung+=12; break; case WR: whp++; Wknow.hung+=14; break; case WQ: whp++; Wknow.hung+=16; } else if( (P[i]&WPM) == 0 ) /* not pawn-protected */ { if(B[i]==WP) result -= (P[i]>>13)*5; else Wknow.hung += 6; } } for( i=L[BKP].next; i!=0; i=L[i].next ) if(P[i]&0x00FF) /* white attacks this square */ { if( (P[i]&0xFF00)==0 || ( m[B[i]] & P[i] ) ) switch(B[i]) { case BP: Bknow.hung += 8; break; case BN: case BB: bhp++; Bknow.hung+=12; break; case BR: bhp++; Bknow.hung+=14; break; case BQ: bhp++; Bknow.hung+=16; } else if( (P[i]&BPM) == 0 ) /* not pawn-protected */ { if(B[i]==BP) result += ((P[i]>>5)&0x7)*5; else Bknow.hung += 6; } } if( whp>1 ) Wknow.hung += 8*whp; if( bhp>1 ) Bknow.hung += 8*bhp; } /*** King safety ***/ for(i=0;i!=8;i++) { int direction = K_moves[i]; int d=Wknow.kp+direction; if(B[d]!=3) { int ataks = (P[d]>>13) & 0x7; if(ataks) { int defs = (P[d]>>5) & 0x7; Wknow.khung += ataks; if( defs == 0 ) { Wknow.khung ++; if( ataks>1 && (P[d]&BQM) ) Wknow.khung += 2; } } /*** Add number of safe checks available ***/ if( B[d]==0 ) { d += direction; while( (B[d]&BLACK) == 0 ) { if( ( P[d] & 0xE0 ) == 0 ) { if( i<4 ) { if( P[d] & (BQM|BRM) ) { Wknow.khung +=2; break; } } else { if( P[d] & (BQM|BBM) ) { Wknow.khung +=2; break; } } } if( B[d] ) break; d += direction; } } d = Wknow.kp+N_moves[i]; if( (P[d]&BNM) && (B[d]&BLACK) == 0 && ( P[d] & 0xE0 ) == 0 ) Wknow.khung += 2; } d=Bknow.kp+direction; if(B[d]!=3) { int ataks = (P[d]>>5) & 0x7; if(ataks) { int defs = (P[d]>>13) & 0x7; Bknow.khung += ataks; if( defs == 0 ) { Bknow.khung ++; if( ataks>1 && (P[d]&WQM) ) Bknow.khung += 2; } } /*** Add number of safe checks available ***/ if( B[d]==0 ) { d += direction; while( (B[d]&WHITE) == 0 ) { if( ( P[d] & 0xE000 ) == 0 ) { if( i<4 ) { if( P[d] & (WQM|WRM) ) { Bknow.khung +=2; break; } } else { if( P[d] & (WQM|WBM) ) { Bknow.khung +=2; break; } } } if( B[d] ) break; d += direction; } } d = Bknow.kp+N_moves[i]; if( (P[d]&WNM) && (B[d]&WHITE) == 0 && ( P[d] & 0xE000 ) == 0 ) { Bknow.khung += 2; } } } if( Totmat >= ENDMATERIAL+Q_VALUE ) { if( Wknow.kp%10 < FILE_E && Bknow.kp%10 > FILE_E ) { Wknow.kstorm = 1; Bknow.qstorm = 1; } else if( Wknow.kp%10 > FILE_E && Bknow.kp%10 < FILE_E ) { Wknow.qstorm = 1; Bknow.kstorm = 1; } } if( Wknow.hung || Bknow.hung ) { int hresult = Bknow.hung - Wknow.hung; midresult += hresult; endresult += hresult; #ifdef SCORING if( Scoring ) printf(" (w/b) hung pieces = %i\n",hresult); #endif } Wknow.castling = ( G[Counter].castling & 3 ); Bknow.castling = ( G[Counter].castling >> 2 ); if( (P[G1]|P[F1]) & 0xFF00 ) Wknow.castling |= WSHORT; if( (P[C1]|P[D1]) & 0xFF00 ) Wknow.castling |= WLONG; if( (P[G8]|P[F8]) & 0x00FF ) Bknow.castling |= WSHORT; /* WSHORT is correct! */ if( (P[C8]|P[D8]) & 0x00FF ) Bknow.castling |= WLONG; /* We're mirroring */ /** *** PASS 2 **/ n = wn; l = wl; b = B; pf = wpf; xpf = bpf; know = &Wknow; xknow = &Bknow; kp = Wknow.kp; xkp = Bknow.kp; mtrl_diff = G[Counter].mtrl-G[Counter].xmtrl; if( Color == BLACK ) mtrl_diff = -mtrl_diff; for(;;) { tdist *kdist = dist+120*kp; tdist *xkdist = dist+120*xkp; int j; int mr = 0, er = 0; /* bishop pair */ if( know->bishopcolor == 3 ) { int bb = 18 + 2*know->worsebm; mr += bb; er += bb*2; #ifdef SCORING if( Scoring ) { if(l==wl) printf(" (whi) bishop pair bonus = %i\n",bb); else printf(" (bla) bishop pair bonus = %i\n",bb); } #endif } /* rooks on 7th row */ /* r7r: 2 pts for rook, 1 pt for queen on 6-8th row */ if( know->r7r > 1 ) { if( xkp >= A8 ) { er += 12 * know->r7r; mr += 5 * know->r7r; } mr += 10 * know->r7r; er += 4 * know->r7r; if( know->r7r > 2 ) mr += know->r7r * know->r7r + 4; } if( Totmat >= ENDMATERIAL ) { int d = 0; /*** play Pc2-c4 (black Pc7-c5) in closed games ***/ if( b[D5]==BP ) { if( b[C4]==WP ) { mr+=10; if( b[E6]==BP && B[D4]==WP ) mr+=10; /*** defender in stonewall must keep pressure *** to opponent's d-pawn ****/ if( b[F5]==BP ) mr+=15; } if( b[C2]==WP ) { if( b[C3]!=0 ) mr -= 7; else mr -= 3; if( b[E2]==WP || b[E3]==WP ) mr -= 5; if( b[E6]==BP || b[C6]==BP ) mr -= 4; } } /*** development ***/ if( b[A1] == WR && pf[FILE_A] != 0 ) d+=2; if( b[B1] == WN ) d+=5; if( b[C1] == WB ) { d+=3; if( b[B2] && b[D2] ) d+=4; } if( b[D1] == WQ ) d++; if( b[F1] == WB ) { d+=3; if( b[E2] && b[G2] ) d+=4; } if( b[G1] == WN ) d+=5; if( b[H1] == WR && pf[FILE_H] != 0 ) d+=2; know->devel = d; /* maximum is 29, <10 is okay */ /*** central pawns ***/ if( b[D4]==WP && b[E4]==WP ) { if( b[E5]!=BP && b[D5]!=BP ) d = 12; else d = 6; if( b[C4]==WP || b[F4]==WP ) d += 4; mr += d; #ifdef SCORING if( Scoring ) { if(l==wl) printf( " (whi) pawn center = %i\n", d ); else printf( " (bla) pawn center = %i\n", d ); } #endif } { /*** castling ***/ int cneed; d = 0; if( kp%10 < FILE_D || kp%10 > FILE_E ) cneed=0; else { cneed = 4; if( ! pf[FILE_E] ) cneed += 3; if( ! xpf[FILE_E] ) cneed += 5; } switch( know->castling ) { case 0: /* both castlings possible */ if( b[F1] ) d -= 2*cneed; if( b[G1] ) d -= 2*cneed; if( b[B1] ) d -= cneed; if( b[C1] ) d -= cneed; if( b[D1] ) d -= cneed; break; case WSHORT: /* only long castling possible */ d-=20; if( b[B1] ) d -= cneed; if( b[C1] ) d -= cneed; if( b[D1] ) d -= cneed; break; case WLONG: /* only short castling possible */ d-=8; if( b[F1] ) d -= 2*cneed; if( b[G1] ) d -= 2*cneed; break; case (WSHORT|WLONG): /* castling impossible */ if( kp%10 > FILE_E ) { if( b[G2]!=WP && b[G3]!=WP ) d -= 10; if( b[H2]!=WP && b[H3]!=WP ) d -= 8; } else if( kp%10 < FILE_D ) { d -= 15; if( b[B2]!=WP && b[B3]!=WP ) d -= 10; if( b[A2]!=WP && b[A3]!=WP ) d -= 8; } else { d -= 5*cneed; } break; } if( Totmat < 5000 ) d /= 2; mr += d; } #ifdef SCORING if( Scoring && d!=0 ) { if(l==wl) printf( " (whi) castling = %i\n", d ); else printf( " (bla) castling = %i\n", d ); } #endif } if( mtrl_diff > 0 ) { int mtrl_weight = 100; /* 100% */ if( know->p == 0 ) { /* Winning without pawns is difficult. We try * to reduce the distance of kings. Then, if * we are ahead a minor piece or less * we just reduce the advantage. We ignore * enemy pawns here - a rook against * 3 non-advanced pawns should still win. */ er += 10 - 2*dist[kp*120+xkp].max; if( mtrl_diff + P_VALUE*xknow->p <= N_VALUE ) mtrl_weight /= 10; } else if( know->p == 1 && mtrl_diff == P_VALUE ) { if( know->q || know->r ) mtrl_weight /= 2; else mtrl_weight /= 4; } else { /* trade down bonus: * if ahead in material, trade pieces but not pawns */ static int pp[12] = { 0, 1, 4, 6, 7, 8, 9, 9, 9, 9, 9, 9 }; int tbonus = ( pp[know->p] - 3*xknow->q - 2*xknow->r - xknow->n - xknow->b ) /* -11 .. 9 */ * ( min(mtrl_diff,N_VALUE)/50 + 2 ); /* 2..9 */ er += tbonus; mr += tbonus; } /* Opposite colored bishops in endgame lead to draw * This also covers positions with other pieces, * e.g. RBPP-RBP, in these cases, the material * rebalancing is much lower. */ if( know->b == 1 && xknow->b == 1 && mtrl_diff == (know->p - xknow->p) * P_VALUE && know->bishopcolor != know->xbishopcolor ) mtrl_weight -= 100 * mtrl_weight / ( max(P_VALUE,mtrl_diff) + 20*know->p + 250*know->r + 400*know->n + 400*know->q ); mtrl_weight = 100-mtrl_weight; mr -= mtrl_diff * mtrl_weight / 100; er -= mtrl_diff * mtrl_weight / 100; } /*** pawn structure ***/ for( i=1; i!=9; i++ ) if( pf[i] ) { if( pf[i] > 1 ) /* doubled */ { mr-=5; er-=10; } if( pf[i-1]==0 && pf[i+1]==0 ) /* isolated */ { /* knights are strong against an isolated pawn * since they can block it. */ int pen = isofile[i] + (2+isofile[i]) * xknow->n + 4*know->b; /* rooks are strong against an isolated pawn on * open file */ if( xpf[i]==0 && xknow->r ) { int j; static const int rfip[10] = { 0, -2, -3, -4, -5, -5, -4, -3, -2, 0 }; for( j=i+20; jr; } if( pf[i] > 1 ) pen = pen*pf[i] + 2*isofile[i]; mr += pen; er += pen; #ifdef SCORING if( Scoring ) { if(l==wl) printf( " (whi) isolated pawn = %i\n", pen ); else printf( " (bla) isolated pawn = %i\n", pen ); } #endif } } for( i=0; i!=n; i++ ) /* scan pieces */ { static int sq; sq = l[i]; switch( b[ sq ] ) { case WP: /* is it passed? */ for( j=sq+10; j=0) { ppeval+=80; abonus /= 2; } } else if( row==7 && b[sq+20]==0 ) { if( see(b,sq,sq+10)>=0 && see(b,sq,sq+20)>=0 ) { ppeval+=50; abonus /= 2; } } } else /* blocked */ if( color(b[sq+10]) == BLACK ) { ppeval /= 2; } else /* blocked - reserve blocking square */ if( color(b[sq+20]) == BLACK ) { ppeval -= ppeval/4; } /* covered or a member of a phalanx */ if( b[sq-9]==WP || b[sq-11]==WP || b[sq-1]==WP || b[sq+1]==WP ) { ppeval += abonus; } /* rook behind - support or brake */ for( j=sq-10; b[j]==0 || b[j]==WR || b[j]==BR || b[j]==BQ || b[j]==WQ; j-=10 ) if( b[j] == WR ) { ppeval += abonus/2 + 4; } else if( b[j] == BR ) { ppeval -= abonus/2 + 9; } if( Totmat < ENDMATERIAL ) { /* distance from enemy king */ int difdis = 2*xkdist[sq+10].max - ( 9 - row ); if( difdis >= 0 ) ppeval += 8+4*difdis; /* king supports the pawn */ if( kdist[sq+10].max < 2 ) ppeval += abonus; } er += ppeval; mr += ppeval/2; #ifdef SCORING if( Scoring && ppeval != 0 ) { if(l==wl) printf(" (whi) "); else printf(" (bla) "); printf("passed pawn = %i ... %i\n", ppeval/2, ppeval ); } #endif } not_passed:; /* backward */ if( sq <= H3 && ( b[sq+19]==BP || b[sq+21]==BP ) && b[sq+10] != BP && b[sq-1] != WP && b[sq+1] != WP && b[sq-9] != WP && b[sq-11] != WP ) { int pen = 0; /* printboard(); printf("%02i",sq); getchar(); */ if( xpf[sq%10]==0 && xknow->r ) { int j; for( j=sq%10+20; jr; } mr += isofile[ sq%10 ] + pen/2; er += -15 + pen; #ifdef SCORING if( Scoring && pen != 0 ) { if(l==wl) printf(" (whi) "); else printf(" (bla) "); printf("backward pawn = %i ... %i\n", isofile[ sq%10 ] + pen/2, -15 + pen ); } #endif } /* cannot move */ { int cannotmove = 0; if( b[ sq + 10 ] != 0 ) { mr -= (12-sq/10); er -= (12-sq/10); if( sq == E2 || sq == D2 ) { mr -= 10; er -= 8; } if( b[ sq + 10 ] ) { /* blocked pawn is an attack brake */ if( know->kstorm && sq%10 > FILE_E ) mr -= 12; else if( know->qstorm && sq%10 < FILE_D ) mr -= 12; if( b[sq+10]==BP && pf[sq%10-1]==0 && pf[sq%10+1]==0 ) /* this pawn was already penalized * as isolated. But this is a pawn * ram - blocked by enemy pawn * face to face. It is not so * critical; take back a small part * of the penalty. *********/ { mr+=5; er+=8; } } cannotmove = 1; } else { int ata=0; if( b[ sq - 1 ] == WP ) ata++; if( b[ sq + 1 ] == WP ) ata++; if( b[ sq + 9 ] == BP ) ata--; if( b[ sq +11 ] == BP ) ata--; if( ata < 1 ) { mr += -4+ata; er += -8+2*ata; cannotmove = 1; } } if( cannotmove ) { int p = 1 + (b[sq+10]==BP); if( Totmat < 1500 ) er -= 6*p; /* penalize friendly bishop that stands * on a square of this color */ if( sqcolor[sq] & know->bishopcolor ) { if( sq==E4 || sq==D4 || sq==E3 || sq==D3 ) { er-=7*p; mr-=5*p; } else { er-=5*p; mr-=4*p; } } } } /* pawn phalanx or chain, both midgame & endgame */ if( b[sq-1]==WP || b[sq-9]==WP || b[sq-11]==WP ) { if( sq >= A4 ) { mr += 6; er += 4; } else { mr += 2; er += 2; } } if( Totmat >= ENDMATERIAL ) { /*** outpost "spacemaker" pawn in midgame */ if( outpost[sq] ) { int o = outpost[sq] + (sq==D4); if( b[sq-1]==WP ) mr += 2*o; if( b[sq+1]==WP ) mr += 2*o; if( b[sq-9]==WP || b[sq-11]==WP ) mr += 3*o; if( b[sq+9]==BP || b[sq+11]==BP ) mr -= 3*o; if(b==B) mr += (P[sq]&0x00FF)/0x0020 * 5*o; else mr += (P[sq]>>8) /0x0020 * 5*o; } /*** storm */ if( know->qstorm ) mr += qstormtable[sq]; else if( know->kstorm ) mr += kstormtable[sq]; /*** `table' bonus */ mr += pmpb[sq]; /*** don't play a4/b4/g4/h4 in opening */ if( sq >= A4 ) { if( know->castling == (WSHORT|WLONG) ) { if( kp%10 > FILE_E ) { if( sq%10 > FILE_F ) mr -= 10; } else { if( kp%10 < FILE_D && sq%10 < FILE_C ) mr -= 8; } } else { if( sq%10 < 3 ) mr -= know->devel; else if( sq%10 > 6 ) mr -= 4+know->devel; } } } break; case WK: er += kepb[sq]; if( Totmat >= ENDMATERIAL ) { mr += kmpb[sq]; /* SHELTER */ switch( b[sq-1] ) { case WP: mr += 3; know->kshield++; break; case WB: mr += 2; know->kshield++; if( b[sq+9]==WP ) mr += 2; } switch( b[sq+1] ) { case WP: mr += 3; know->kshield++; break; case WB: mr += 2; know->kshield++; if( b[sq+11]==WP ) mr += 2; } switch( b[sq+10] ) { case WP: mr += 6; know->kshield+=2; if( b[sq+9]==WP || b[sq+11]==WP ) { mr += 3; know->kshield+=2; } break; case WB: mr += 2; know->kshield++; if( b[sq+9]==WP || b[sq+11]==WP ) { know->kshield++; if( b[sq+20]==WP ) { mr += 2; know->kshield++; } } } if( b[sq+20]==WP ) { know->kshield++; if( b[sq+19]==WP || b[sq+21]==WP ) know->kshield++; } if( b[sq+9]==WP ) { know->kshield++; mr += 4; } if( b[sq+11]==WP ) { know->kshield++; mr += 4; } if( xknow->q || xknow->r >= 2 ) { int file = sq%10; if( pf[file] == 0 ) mr -= 6; if( pf[file-1] == 0 ) mr -= 3; if( pf[file+1] == 0 ) mr -= 3; if( file > FILE_C && file < FILE_F ) { /* open center makes us cry */ if( xpf[file] == 0 ) { if(pf[file]==0) mr -= 8; else mr -= 5; } } } } break; case WR: { int j; int r; int mrr = 0; int err = 0; static int frb[12] = { 0, 0, -5, -5, -2, 0, 2, 4, 8, 10, 10, 10 }; for( j = sq+10; b[j]==0 || b[j]>=ROOK; j += 10 ) {}; r=j/10; /* 2...10 */ if( b[j]==WP && b[j+10] ) r--; mrr = err = frb[r]; if( xpf[sq%10] != 0 ) mrr -= 5; if( pf[sq%10] != 0 ) { mrr -= 5; if( b[j]==WP ) { /* avoid pseudocastling, that's moving king * e1-f1-g1, satisfying king safety but blocking * the rook undeveloped */ if( sq==H1 || sq==H2 || sq==G1 ) if( kp==F1 || kp==G1 ) { mrr -= 33; err -= 33; } } } mrr += rmpb[sq]; mr += mrr; er += err; #ifdef SCORING if( Scoring ) { if(l==wl) printf( " (whi) rook = %i,%i\n", mrr, err ); else printf( " (bla) rook = %i,%i\n", mrr, err ); } #endif } break; case WB: if( b[sq+10]==BP || ( outpost[sq] && ( b[sq-9]==WP || b[sq-11]==WP ) ) ) { int j; int bonus; for( j=sq+9; jqstorm || know->kstorm ) { static int bon[16] = { 8, 8, 8, 7, 5, 3, 1, 0, -1, -2, -3, -4, -5, -6, -7, -8 }; mr += bon[ xkdist[sq].diag ]; } mr += bmpb[sq]; er += bepb[sq]; break; case WN: if( b[sq+10]==BP || ( outpost[sq] && ( b[sq-9]==WP || b[sq-11]==WP ) ) ) { int j; int bonus; for( j=sq+9; j=A4 && sq%10>=FILE_B && sq%10<=FILE_G && xknow->n == 0 && ( know->xbishopcolor & sqcolor[sq] ) == 0 && ( b[sq-9]==WP || b[sq-11]==WP ) ) { mr+=8+2*outpost[sq]; er+=15+4*outpost[sq]; } mr += bonus; er += bonus/2; #ifdef SCORING if( Scoring ) { if(l==wl) printf( " (whi) strong knight = %i\n", bonus ); else printf( " (bla) strong knight = %i\n", bonus ); } #endif no_knight_outpost:; } /*** trapped knight ***/ if( sq==A8 ) { if( b[A7] == BP && see(b,A8,C7) < -200 ) { mr -= 140; er -= 140; } } else if( sq==H8 ) { if( b[H7] == BP && see(b,H8,F7) < -200 ) { mr -= 140; er -= 140; } } else if( sq==A7 ) { if( b[B7]==BP ) if( b[A6]==BP || b[C6]==BP ) { mr -= 45; er -= 45; } } else if( sq==H7 ) { if( b[G7]==BP ) if( b[H6]==BP || b[F6]==BP ) { mr -= 45; er -= 45; } } mr += nmpb[sq]; if( know->qstorm || know->kstorm ) { static int bon[8] = { 8, /* 1-st entry is never used */ 8, 8, 5, 2, -1, -4, -7 }; mr += bon[ xkdist[sq].max ]; } if( Totmat < ENDMATERIAL ) { /* look at the leftmost and righmost pawn file - * large distance between these files is bad * for knight in endgame */ int d = max(Wknow.rpf,Bknow.rpf)-min(Wknow.lpf,Bknow.lpf); if(d>3) /* look at nonpawn material */ { if( Totmat-P_VALUE*(Wknow.p+Bknow.p) <= N_VALUE+B_VALUE ) er-=5*d; else er-=3*d; } } er += nepb[sq]; break; case WQ: /* penalize early queen activity, */ /* 10 to 31 pts., depending on development */ if( know->devel >= 8 ) if( sq >= A3 ) mr -= (2+know->devel); /* let's play aggressively - */ /* penalize for distance from enemy king */ /* active queen is very strong; especially in endgame */ { static int bon[16] = { 10, 10, 10, 9, 7, 5, 3, 0, -2, -4, -8, -8, -8, -8, -8, -8 }; int qb; if( !( B==b ? (P[sq]>>8) : (P[Th[sq]]&0x00FF) ) ) qb = bon[ xkdist[sq].taxi ]; else qb = -8; if( know->qstorm || know->kstorm ) mr += 2*qb; else mr += qb; er += 3*qb; } mr += qmpb[sq]; break; } } if( l == wl ) { midresult += mr; endresult += er; l = bl; n = bn; b = mB; pf = bpf; xpf = wpf; know = &Bknow; xknow = &Wknow; kp = Th[Bknow.kp]; xkp = Th[Wknow.kp]; mtrl_diff = -mtrl_diff; } else { midresult -= mr; endresult -= er; break; } } /*********** Development */ if( Totmat >= ENDMATERIAL ) { if( Color == WHITE ) { if( Wknow.devel>1 && Wknow.hung<10 ) Wknow.devel-=2; } else { if( Bknow.devel>1 && Bknow.hung<10 ) Bknow.devel-=2; } { int d = Bknow.devel-Wknow.devel; d = 4*d + d*max(Wknow.devel,Bknow.devel)/8; midresult += d; #ifdef SCORING if( Scoring ) { printf(" ( ) %i %i\n", Bknow.devel, Wknow.devel ); if( d!=0 ) printf( " (w/b) development = %i\n", d ); } #endif } } else /* outside passed pawn */ { int whas=0, bhas=0; extern int Oppb[]; /* outside passed pawn bonus, see endgame.c */ /* white/black left/right -most pawn file (0-10) */ int wrm = Wknow.rpf; int wlm = Wknow.lpf; int brm = Bknow.rpf; int blm = Bknow.lpf; /*** look at leftmost pawn ***/ if( wlm+1wlm+3 ) whas=blm-wlm; else if( blm+1blm+3 ) bhas=wlm-blm; /*** look at rightmost pawn ***/ if( wrm-1>brm && wrm>wlm+3 ) whas+=wrm-brm; else if( brm-1>wrm && brm>blm+3 ) bhas+=brm-wrm; endresult += (Oppb[whas]-Oppb[bhas]) * Q_VALUE / (Q_VALUE+Totmat-P_VALUE*(Wknow.p+Bknow.p)); } midresult += (Bknow.khung-Wknow.khung) * 2; /*********** King danger */ Wknow.khung -= Wknow.kshield/3; Bknow.khung -= Bknow.kshield/3; #define KSAFETY 1 if( Wknow.khung > 1 ) { midresult -= Wknow.khung * Wknow.khung * KSAFETY; #ifdef SCORING if( Scoring ) printf( " (whi) king safety = %i\n", Wknow.khung * Wknow.khung * -KSAFETY ); #endif } if( Bknow.khung > 1 ) { midresult += Bknow.khung * Bknow.khung * KSAFETY; #ifdef SCORING if( Scoring ) printf( " (bla) king safety = %i\n", Bknow.khung * Bknow.khung * -KSAFETY ); #endif } Wknow.prune = ( Wknow.hung < 10 && Wknow.khung < 2 ); Bknow.prune = ( Bknow.hung < 10 && Bknow.khung < 2 ); if( Totmat < ENDMATERIAL ) result += endresult; else if( Totmat > MIDMATERIAL ) result += midresult; else result += (Totmat-ENDMATERIAL) * midresult / (MIDMATERIAL-ENDMATERIAL) + (MIDMATERIAL-Totmat) * endresult / (MIDMATERIAL-ENDMATERIAL); #define TEMPO 4 if( Color == WHITE ) return result+TEMPO; else return -result+TEMPO; }